Ly8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAovLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQoKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KYXZhU2NyaXB0LmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19EZWZpbmUuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19PYmplY3QuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19WYWx1ZS5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9yZXNvdXJjZS5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0NvbnRleHQuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19WYWx1ZS5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L3V0aWwuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9GaWVsZC5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L2NvbG9yLmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfUnVudGltZS5oIgoKc3RhdGljIHY4OjpJc29sYXRlKiBHZXRJc29sYXRlKElGWEpTX0NvbnRleHQqIGNjKQp7CglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCglDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CglBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7CgoJcmV0dXJuIHBSdW50aW1lLT5HZXRJc29sYXRlKCk7Cn0KCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDSlNfUHVibGljTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKI2RlZmluZSBET1VCTEVfQ09SUkVDVAkwLjAwMDAwMDAwMDAwMDAwMQoKQkVHSU5fSlNfU1RBVElDX0dMT0JBTF9GVU4oQ0pTX1B1YmxpY01ldGhvZHMpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRk51bWJlcl9Gb3JtYXQsNikKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGTnVtYmVyX0tleXN0cm9rZSw2KQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZQZXJjZW50X0Zvcm1hdCwyKQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZQZXJjZW50X0tleXN0cm9rZSwyKQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZEYXRlX0Zvcm1hdEV4LDEpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRkRhdGVfS2V5c3Ryb2tlRXgsMSkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGRGF0ZV9Gb3JtYXQsMSkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGRGF0ZV9LZXlzdHJva2UsMSkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGVGltZV9Gb3JtYXRFeCwxKQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZUaW1lX0tleXN0cm9rZUV4LDEpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlRpbWVfRm9ybWF0LDEpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlRpbWVfS2V5c3Ryb2tlLDEpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNwZWNpYWxfRm9ybWF0LDEpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNwZWNpYWxfS2V5c3Ryb2tlLDEpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNwZWNpYWxfS2V5c3Ryb2tlRXgsMSkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU2ltcGxlLDMpCglKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRk1ha2VOdW1iZXIsMSkKCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU2ltcGxlX0NhbGN1bGF0ZSwyKQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZSYW5nZV9WYWxpZGF0ZSw0KQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZNZXJnZUNoYW5nZSwxKQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZQYXJzZURhdGVFeCwyKQoJSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZFeHRyYWN0TnVtcywxKQpFTkRfSlNfU1RBVElDX0dMT0JBTF9GVU4oKQoKSU1QTEVNRU5UX0pTX1NUQVRJQ19HTE9CQUxfRlVOKENKU19QdWJsaWNNZXRob2RzKQoKc3RydWN0IHN0cnVfVGJDb252ZXJ0CnsKCUZYX0xQQ1NUUiBscHN6SlNNYXJrOwoJRlhfTFBDU1RSIGxwc3pDcHBNYXJrOwp9OwoKc3RhdGljIGNvbnN0IHN0cnVfVGJDb252ZXJ0IGZjVGFibGVbXSA9IHsKCXsgIm1tbW0iLCIlQiIgfSwKCXsgIm1tbSIsICIlYiIgfSwKCXsgIm1tIiwgICIlbSIgfSwKCS8vIm0iCgl7ICJkZGRkIiwiJUEiIH0sCgl7ICJkZGQiLCAiJWEiIH0sCgl7ICJkZCIsICAiJWQiIH0sCgkvLyJkIiwgICAiJXciLAoJeyAieXl5eSIsIiVZIiB9LAoJeyAieXkiLCAgIiV5IiB9LAoJeyAiSEgiLCAgIiVIIiB9LAoJLy8iSCIKCXsgImhoIiwgICIlSSIgfSwKCS8vImgiCgl7ICJNTSIsICAiJU0iIH0sCgkvLyJNIgoJeyAic3MiLCAgIiVTIiB9LAoJLy8icwoJeyAidHQiLCAgIiVwIiB9LAoJLy8idCIKfTsKCnN0YXRpYyBGWF9MUENXU1RSIG1vbnRoc1tdID0KewoJTCJKYW4iLCBMIkZlYiIsIEwiTWFyIiwgTCJBcHIiLCBMIk1heSIsIEwiSnVuIiwgTCJKdWwiLCBMIkF1ZyIsIEwiU2VwIiwgTCJPY3QiLCBMIk5vdiIsIEwiRGVjIgp9OwoKc3RhdGljIEZYX0xQQ1dTVFIgZnVsbG1vbnRoc1tdID0gCnsgCglMIkphbnVhcnkiLCBMIkZlYnJ1YXJ5IiwgTCJNYXJjaCIsIEwiQXByaWwiLCBMIk1heSIsIEwiSnVuZSIsIEwiSnVseSIsIEwiQXVndXN0IiwgTCJTZXB0ZW1iZXIiLCBMIk9jdG9iZXIiLCBMIk5vdmVtYmVyIiwgTCJEZWNlbWJlciIgCn07CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpJc051bWJlcihGWF9MUENXU1RSIHN0cmluZykKewoJQ0ZYX1dpZGVTdHJpbmcgc1RyaW0gPSBTdHJUcmltKHN0cmluZyk7CglGWF9MUENXU1RSIHBUcmltID0gc1RyaW07CglGWF9MUENXU1RSIHAgPSBwVHJpbTsKCgoJRlhfQk9PTCBiRG90ID0gRkFMU0U7CglGWF9CT09MIGJLWEpTID0gRkFMU0U7CgoJd2NoYXJfdCBjOwoJd2hpbGUgKChjID0gKnApKQoJewoJCWlmIChjID09ICcuJyB8fCBjID09ICcsJykKCQl7CgkJCWlmIChiRG90KSByZXR1cm4gRkFMU0U7CgkJCWJEb3QgPSBUUlVFOwoJCX0KCQllbHNlIGlmIChjID09ICctJyB8fCBjID09ICcrJykKCQl7CgkJCWlmIChwICE9IHBUcmltKQoJCQkJcmV0dXJuIEZBTFNFOwoJCX0KCQllbHNlIGlmIChjID09ICdlJyB8fCBjID09ICdFJykKCQl7CgkJCWlmIChiS1hKUykgcmV0dXJuIEZBTFNFOwoKCQkJcCsrOwoJCQljID0gKnA7CgkJCWlmIChjID09ICcrJyB8fCBjID09ICctJykKCQkJewoJCQkJYktYSlMgPSBUUlVFOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcmV0dXJuIEZBTFNFOwoJCQl9CgkJfQoJCWVsc2UgaWYgKCFJc0RpZ2l0KGMpKQoJCXsKCQkJcmV0dXJuIEZBTFNFOwoJCX0KCQlwKys7Cgl9CgoJcmV0dXJuIFRSVUU7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzRGlnaXQod2NoYXJfdCBjaCkKewoJcmV0dXJuIChjaCA+PSBMJzAnICYmIGNoIDw9IEwnOScpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpJc0RpZ2l0KGNoYXIgY2gpCnsKCXJldHVybiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5Jyk7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzQWxwaGFiZXRpYyh3Y2hhcl90IGNoKQp7CglyZXR1cm4gKChjaCA+PSBMJ2EnICYmIGNoIDw9IEwneicpIHx8IChjaCA+PSBMJ0EnICYmIGNoIDw9IEwnWicpKTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNBbHBoYU51bWVyaWMod2NoYXJfdCBjaCkKewoJcmV0dXJuIChJc0RpZ2l0KGNoKSB8fCBJc0FscGhhYmV0aWMoY2gpKTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6bWFza1NhdGlzZmllZCh3Y2hhcl90IGNfQ2hhbmdlLHdjaGFyX3QgY19NYXNrKQp7Cglzd2l0Y2ggKGNfTWFzaykKCXsKCWNhc2UgTCc5JzoKICAgICAgICByZXR1cm4gSXNEaWdpdChjX0NoYW5nZSk7CQkKICAgIGNhc2UgTCdBJzoKICAgICAgICByZXR1cm4gSXNBbHBoYWJldGljKGNfQ2hhbmdlKTsJCQogICAgY2FzZSBMJ08nOgogICAgICAgIHJldHVybiBJc0FscGhhTnVtZXJpYyhjX0NoYW5nZSk7CQkKICAgIGNhc2UgTCdYJzoKICAgICAgICByZXR1cm4gVFJVRTsJCQoJZGVmYXVsdDoKICAgICAgICByZXR1cm4gKGNfQ2hhbmdlID09IGNfTWFzayk7Cgl9Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OmlzUmVzZXJ2ZWRNYXNrQ2hhcih3Y2hhcl90IGNoKQp7CglyZXR1cm4gY2ggPT0gTCc5JyB8fCBjaCA9PSBMJ0EnIHx8IGNoID09IEwnTycgfHwgY2ggPT0gTCdYJzsKfQoKZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpBRl9TaW1wbGUoRlhfTFBDV1NUUiBzRnVjdGlvbiwgZG91YmxlIGRWYWx1ZTEsIGRvdWJsZSBkVmFsdWUyKQp7CglpZiAoRlhTWVNfd2NzaWNtcChzRnVjdGlvbixMIkFWRyIpID09IDAgfHwgRlhTWVNfd2NzaWNtcChzRnVjdGlvbixMIlNVTSIpID09IDApCgl7CgkJcmV0dXJuIGRWYWx1ZTEgKyBkVmFsdWUyOwoJfQoJZWxzZSBpZiAoRlhTWVNfd2NzaWNtcChzRnVjdGlvbiwgTCJQUkQiKSA9PSAwKQoJewoJCXJldHVybiBkVmFsdWUxICogZFZhbHVlMjsKCX0KCWVsc2UgaWYgKEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sTCJNSU4iKSA9PSAwKQoJewoJCXJldHVybiBGWF9NSU4oZFZhbHVlMSwgZFZhbHVlMik7Cgl9CgllbHNlIGlmIChGWFNZU193Y3NpY21wKHNGdWN0aW9uLEwiTUFYIikgPT0gMCkKCXsKCQlyZXR1cm4gRlhfTUFYKGRWYWx1ZTEsIGRWYWx1ZTIpOwoJfQoKCXJldHVybiBkVmFsdWUxOwp9CgpDRlhfV2lkZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyTFRyaW0oRlhfTFBDV1NUUiBwU3RyKQp7Cgl3aGlsZSAoKnBTdHIgJiYgKnBTdHIgPT0gTCcgJykgcFN0cisrOwoKCXJldHVybiBwU3RyOwp9CgpDRlhfV2lkZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyUlRyaW0oRlhfTFBDV1NUUiBwU3RyKQp7CglGWF9MUENXU1RSIHAgPSBwU3RyOwoJd2hpbGUgKCpwKSBwKys7Cgl3aGlsZSAocCA+IHBTdHIgJiYgKihwIC0gMSkgPT0gTCcgJykgcC0tOwoKCXJldHVybiBDRlhfV2lkZVN0cmluZyhwU3RyLCBwIC0gcFN0cik7Cn0KCkNGWF9XaWRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJUcmltKEZYX0xQQ1dTVFIgcFN0cikKewoJcmV0dXJuIFN0clJUcmltKFN0ckxUcmltKHBTdHIpKTsKfQoKQ0ZYX0J5dGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0ckxUcmltKEZYX0xQQ1NUUiBwU3RyKQp7Cgl3aGlsZSAoKnBTdHIgJiYgKnBTdHIgPT0gJyAnKSBwU3RyKys7CgogICAgICAgIHJldHVybiBwU3RyOwp9CgpDRlhfQnl0ZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyUlRyaW0oRlhfTFBDU1RSIHBTdHIpCnsKCUZYX0xQQ1NUUiBwID0gcFN0cjsKCXdoaWxlICgqcCkgcCsrOwoJd2hpbGUgKHAgPiBwU3RyICYmICoocCAtIDEpID09IEwnICcpIHAtLTsKCglyZXR1cm4gQ0ZYX0J5dGVTdHJpbmcocFN0cixwLXBTdHIpOwp9CgpDRlhfQnl0ZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyVHJpbShGWF9MUENTVFIgcFN0cikKewoJcmV0dXJuIFN0clJUcmltKFN0ckxUcmltKHBTdHIpKTsKfQoKZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpQYXJzZU51bWJlcihGWF9MUENXU1RSIHN3U291cmNlLCBGWF9CT09MJiBiQWxsRGlnaXRzLCBGWF9CT09MJiBiRG90LCBGWF9CT09MJiBiU2lnbiwgRlhfQk9PTCYgYktYSlMpCnsKCWJEb3QgPSBGQUxTRTsKCWJTaWduID0gRkFMU0U7CgliS1hKUyA9IEZBTFNFOwoKCUZYX0JPT0wgYkRpZ2l0RXhpc3QgPSBGQUxTRTsKCglGWF9MUENXU1RSIHAgPSBzd1NvdXJjZTsKCXdjaGFyX3QgYzsKCglGWF9MUENXU1RSIHBTdGFydCA9IE5VTEw7CglGWF9MUENXU1RSIHBFbmQgPSBOVUxMOwoKCXdoaWxlICgoYyA9ICpwKSkKCXsKCQlpZiAoIXBTdGFydCAmJiBjICE9IEwnICcpCgkJewoJCQlwU3RhcnQgPSBwOwoJCX0KCgkJcEVuZCA9IHA7CgkJcCsrOwoJfQoKCWlmICghcFN0YXJ0KQoJewoJCWJBbGxEaWdpdHMgPSBGQUxTRTsKCQlyZXR1cm4gMDsKCX0KCgl3aGlsZSAocEVuZCAhPSBwU3RhcnQpCgl7CgkJaWYgKCpwRW5kID09IEwnICcpCgkJCXBFbmQgLS07CgkJZWxzZQoJCQlicmVhazsKCX0KCglkb3VibGUgZFJldCA9IDA7CglwID0gcFN0YXJ0OwoJYkFsbERpZ2l0cyA9IFRSVUU7CglDRlhfV2lkZVN0cmluZyBzd0RpZ2l0czsKCgl3aGlsZSAocCA8PSBwRW5kKQoJewkKCQljID0gKnA7CgoJCWlmIChJc0RpZ2l0KGMpKQoJCXsKCQkJc3dEaWdpdHMgKz0gYzsKCQkJYkRpZ2l0RXhpc3QgPSBUUlVFOwoJCX0KCQllbHNlIAoJCXsKCQkJc3dpdGNoIChjKQoJCQl7CgkJCWNhc2UgTCcgJzoKCQkJCWJBbGxEaWdpdHMgPSBGQUxTRTsKCQkJCWJyZWFrOwoJCQljYXNlIEwnLic6CgkJCWNhc2UgTCcsJzoKCQkJCWlmICghYkRvdCkKCQkJCXsKCQkJCQlpZiAoYkRpZ2l0RXhpc3QpCgkJCQkJewoJCQkJCQlzd0RpZ2l0cyArPSBMJy4nOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlzd0RpZ2l0cyArPSBMJzAnOwoJCQkJCQlzd0RpZ2l0cyArPSBMJy4nOwoJCQkJCQliRGlnaXRFeGlzdCA9IFRSVUU7CgkJCQkJfQoKCQkJCQliRG90ID0gVFJVRTsKCQkJCQlicmVhazsKCQkJCX0KCQkJY2FzZSAnZSc6CgkJCWNhc2UgJ0UnOgoJCQkJaWYgKCFiS1hKUykKCQkJCXsKCQkJCQlwKys7CgkJCQkJYyA9ICpwOwoJCQkJCWlmIChjID09ICcrJyB8fCBjID09ICctJykKCQkJCQl7CgkJCQkJCWJLWEpTID0gVFJVRTsKCQkJCQkJc3dEaWdpdHMgKz0gJ2UnOwoJCQkJCQlzd0RpZ2l0cyArPSBjOwoJCQkJCX0KCQkJCQlicmVhazsKCQkJCX0KCQkJY2FzZSBMJy0nOgoJCQkJaWYgKCFiRGlnaXRFeGlzdCAmJiAhYlNpZ24pCgkJCQl7CgkJCQkJc3dEaWdpdHMgKz0gYzsKCQkJCQliU2lnbiA9IFRSVUU7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCWRlZmF1bHQ6CgkJCQliQWxsRGlnaXRzID0gRkFMU0U7CgoJCQkJaWYgKHAgIT0gcFN0YXJ0ICYmICFiRG90ICYmIGJEaWdpdEV4aXN0KQoJCQkJewoJCQkJCXN3RGlnaXRzICs9IEwnLic7CgkJCQkJYkRvdCA9IFRSVUU7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJYkRvdCA9IEZBTFNFOwoJCQkJCWJEaWdpdEV4aXN0ID0gRkFMU0U7CgkJCQkJc3dEaWdpdHMgPSBMIiI7CgkJCQl9CgkJCQlicmVhazsKCQkJfQoJCX0KCgkJcCsrOwoJfQoKCWlmIChzd0RpZ2l0cy5HZXRMZW5ndGgoKSA+IDAgJiYgc3dEaWdpdHMuR2V0TGVuZ3RoKCkgPCAxNykKCXsKCQlDRlhfQnl0ZVN0cmluZyBzRGlnaXRzID0gc3dEaWdpdHMuVVRGOEVuY29kZSgpOwoKCQlpZiAoYktYSlMpCgkJewoJCQlkUmV0ID0gYXRvZihzRGlnaXRzKTsKCQl9CgkJZWxzZQoJCXsKCQkJaWYgKGJEb3QpCgkJCXsKCQkJCWNoYXIqIHBTdG9wU3RyaW5nOwoJCQkJZFJldCA9IDo6c3RydG9kKHNEaWdpdHMsICZwU3RvcFN0cmluZyk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlkUmV0ID0gYXRvbChzRGlnaXRzKTsKCQkJfQoJCX0KCgl9CgoJcmV0dXJuIGRSZXQ7Cn0KCmRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VTdHJpbmdUb051bWJlcihGWF9MUENXU1RSIHN3U291cmNlKQp7CglGWF9CT09MIGJBbGxEaWdpdHMgPSBGQUxTRTsKCUZYX0JPT0wgYkRvdCA9IEZBTFNFOwoJRlhfQk9PTCBiU2lnbiA9IEZBTFNFOwoJRlhfQk9PTCBiS1hKUyA9IEZBTFNFOwoKCXJldHVybiBQYXJzZU51bWJlcihzd1NvdXJjZSwgYkFsbERpZ2l0cywgYkRvdCwgYlNpZ24sIGJLWEpTKTsKfQoKRlhfQk9PTAlDSlNfUHVibGljTWV0aG9kczo6Q29udmVydFN0cmluZ1RvTnVtYmVyKEZYX0xQQ1dTVFIgc3dTb3VyY2UsIGRvdWJsZSAmIGRSZXQsIEZYX0JPT0wgJiBiRG90KQp7CglGWF9CT09MIGJBbGxEaWdpdHMgPSBGQUxTRTsKCUZYX0JPT0wgYlNpZ24gPSBGQUxTRTsKCUZYX0JPT0wgYktYSlMgPSBGQUxTRTsKCglkUmV0ID0gUGFyc2VOdW1iZXIoc3dTb3VyY2UsIGJBbGxEaWdpdHMsIGJEb3QsIGJTaWduLCBiS1hKUyk7CgoJcmV0dXJuIGJBbGxEaWdpdHM7Cn0KCkNKU19BcnJheSBDSlNfUHVibGljTWV0aG9kczo6QUZfTWFrZUFycmF5RnJvbUxpc3Qodjg6Oklzb2xhdGUqIGlzb2xhdGUsIENKU19WYWx1ZSB2YWwpCnsKCUNKU19BcnJheSBTdHJBcnJheShpc29sYXRlKTsKCWlmKHZhbC5Jc0FycmF5T2JqZWN0KCkpCgl7CgkJdmFsLkNvbnZlcnRUb0FycmF5KFN0ckFycmF5KTsKCQlyZXR1cm4gU3RyQXJyYXk7Cgl9CglDRlhfV2lkZVN0cmluZyB3c1N0ciA9IHZhbC5vcGVyYXRvciBDRlhfV2lkZVN0cmluZygpOwoJQ0ZYX0J5dGVTdHJpbmcgdCA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh3c1N0cik7Cgljb25zdCBjaGFyICogcCA9IChjb25zdCBjaGFyICopdDsKCgoJaW50IGNoID0gJywnIDsKCWludCBuSW5kZXggPSAwOwoKCXdoaWxlICgqcCkKCXsKCQljb25zdCBjaGFyICogcFRlbXAgPSBzdHJjaHIocCwgY2gpOwoJCWlmIChwVGVtcCA9PSBOVUxMKQoJCXsKCQkJU3RyQXJyYXkuU2V0RWxlbWVudChuSW5kZXgsIENKU19WYWx1ZShpc29sYXRlLChGWF9MUENTVFIpU3RyVHJpbShwKSkpOwoJCQlicmVhazsKCQl9CgkJZWxzZQoJCXsKCQkJY2hhciAqIHBTdWIgPSBuZXcgY2hhcltwVGVtcCAtIHAgKyAxXTsKCQkJc3RybmNweShwU3ViLCBwLCBwVGVtcCAtIHApOwoJCQkqKHBTdWIgKyAocFRlbXAgLSBwKSkgPSAnXDAnOwoKCQkJU3RyQXJyYXkuU2V0RWxlbWVudChuSW5kZXgsIENKU19WYWx1ZShpc29sYXRlLChGWF9MUENTVFIpU3RyVHJpbShwU3ViKSkpOwoJCQlkZWxldGUgW11wU3ViOwoJCQkKCQkJbkluZGV4ICsrOwoJCQlwID0gKytwVGVtcDsKCQl9CgkJCgl9CglyZXR1cm4gU3RyQXJyYXk7Cn0KCmludCBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VTdHJpbmdJbnRlZ2VyKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcsaW50IG5TdGFydCxpbnQmIG5Ta2lwLCBpbnQgbk1heFN0ZXApCnsKCWludCBuUmV0ID0gMDsKCW5Ta2lwID0gMDsKCWZvciAoaW50IGk9blN0YXJ0LCBzej1zdHJpbmcuR2V0TGVuZ3RoKCk7IGkgPCBzejsgaSsrKQoJewoJCWlmIChpLW5TdGFydCA+IDEwKQoJCQlicmVhazsKCgkJRlhfV0NIQVIgYyA9IHN0cmluZy5HZXRBdChpKTsKCQlpZiAoSXNEaWdpdCgod2NoYXJfdCljKSkKCQl7CgkJCW5SZXQgPSBuUmV0ICogMTAgKyAoYyAtICcwJyk7CgkJCW5Ta2lwID0gaSAtIG5TdGFydCArIDE7CgkJCWlmIChuU2tpcCA+PSBuTWF4U3RlcCkgCgkJCQlicmVhazsKCQl9CgkJZWxzZQoJCQlicmVhazsKCX0KCglyZXR1cm4gblJldDsKfQoKQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlU3RyaW5nU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcsIGludCBuU3RhcnQsIGludCYgblNraXApCnsKCUNGWF9XaWRlU3RyaW5nIHN3UmV0OwoJblNraXAgPSAwOwoJZm9yIChpbnQgaT1uU3RhcnQsIHN6PXN0cmluZy5HZXRMZW5ndGgoKTsgaSA8IHN6OyBpKyspCgl7CgkJRlhfV0NIQVIgYyA9IHN0cmluZy5HZXRBdChpKTsKCQlpZiAoKGMgPj0gTCdhJyAmJiBjIDw9IEwneicpIHx8IChjID49IEwnQScgJiYgYyA8PSBMJ1onKSkKCQl7CgkJCXN3UmV0ICs9IGM7CgkJCW5Ta2lwID0gaSAtIG5TdGFydCArIDE7CgkJfQoJCWVsc2UKCQkJYnJlYWs7Cgl9CgoJcmV0dXJuIHN3UmV0Owp9Cgpkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlTm9ybWFsRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmIHZhbHVlLCBGWF9CT09MJiBiV3JvbmdGb3JtYXQpCnsKCWRvdWJsZSBkdCA9IEpTX0dldERhdGVUaW1lKCk7CgoJaW50IG5ZZWFyID0gSlNfR2V0WWVhckZyb21UaW1lKGR0KTsKCWludCBuTW9udGggPSBKU19HZXRNb250aEZyb21UaW1lKGR0KSArIDE7CglpbnQgbkRheSA9IEpTX0dldERheUZyb21UaW1lKGR0KTsKCWludCBuSG91ciA9IEpTX0dldEhvdXJGcm9tVGltZShkdCk7CglpbnQgbk1pbiA9IEpTX0dldE1pbkZyb21UaW1lKGR0KTsKCWludCBuU2VjID0gSlNfR2V0U2VjRnJvbVRpbWUoZHQpOwoKCWludCBudW1iZXJbM107CgoJaW50IG5Ta2lwID0gMDsKCWludCBuTGVuID0gdmFsdWUuR2V0TGVuZ3RoKCk7CglpbnQgbkluZGV4ID0gMDsKCWludCBpID0gMDsKCXdoaWxlIChpIDwgbkxlbikKCXsKCQlpZiAobkluZGV4ID4gMikgYnJlYWs7CgoJCUZYX1dDSEFSIGMgPSB2YWx1ZS5HZXRBdChpKTsKCQlpZiAoSXNEaWdpdCgod2NoYXJfdCljKSkKCQl7CgkJCW51bWJlcltuSW5kZXgrK10gPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGksIG5Ta2lwLCA0KTsKCQkJaSArPSBuU2tpcDsJCQkKCQl9CgkJZWxzZQoJCXsKCQkJaSArKzsKCQl9Cgl9CgoJaWYgKG5JbmRleCA9PSAyKQoJewoJCS8vIGNhc2UyOiBtb250aC9kYXkKCQkvLyBjYXNlMzogZGF5L21vbnRoCgkJaWYgKChudW1iZXJbMF0gPj0gMSAmJiBudW1iZXJbMF0gPD0gMTIpICYmIChudW1iZXJbMV0gPj0gMSAmJiBudW1iZXJbMV0gPD0gMzEpKQoJCXsKCQkJbk1vbnRoID0gbnVtYmVyWzBdOwoJCQluRGF5ID0gbnVtYmVyWzFdOwoJCX0KCQllbHNlIGlmICgobnVtYmVyWzBdID49IDEgJiYgbnVtYmVyWzBdIDw9IDMxKSAmJiAobnVtYmVyWzFdID49IDEgJiYgbnVtYmVyWzFdIDw9IDEyKSkKCQl7CgkJCW5EYXkgPSBudW1iZXJbMF07CgkJCW5Nb250aCA9IG51bWJlclsxXTsKCQl9CgoJCWJXcm9uZ0Zvcm1hdCA9IEZBTFNFOwoJfQoJZWxzZSBpZiAobkluZGV4ID09IDMpCgl7CgkJLy8gY2FzZTE6IHllYXIvbW9udGgvZGF5CgkJLy8gY2FzZTI6IG1vbnRoL2RheS95ZWFyCgkJLy8gY2FzZTM6IGRheS9tb250aC95ZWFyCgoJCWlmIChudW1iZXJbMF0gPiAxMiAmJiAobnVtYmVyWzFdID49IDEgJiYgbnVtYmVyWzFdIDw9IDEyKSAmJiAobnVtYmVyWzJdID49IDEgJiYgbnVtYmVyWzJdIDw9IDMxKSkKCQl7CgkJCW5ZZWFyID0gbnVtYmVyWzBdOwoJCQluTW9udGggPSBudW1iZXJbMV07CgkJCW5EYXkgPSBudW1iZXJbMl07CgkJfQoJCWVsc2UgaWYgKChudW1iZXJbMF0gPj0gMSAmJiBudW1iZXJbMF0gPD0gMTIpICYmIChudW1iZXJbMV0gPj0gMSAmJiBudW1iZXJbMV0gPD0gMzEpICYmIG51bWJlclsyXSA+IDMxKQoJCXsKCQkJbk1vbnRoID0gbnVtYmVyWzBdOwoJCQluRGF5ID0gbnVtYmVyWzFdOwoJCQluWWVhciA9IG51bWJlclsyXTsKCQl9CgkJZWxzZSBpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAzMSkgJiYgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAxMikgJiYgbnVtYmVyWzJdID4gMzEpCgkJewoJCQluRGF5ID0gbnVtYmVyWzBdOwoJCQluTW9udGggPSBudW1iZXJbMV07CgkJCW5ZZWFyID0gbnVtYmVyWzJdOwoJCX0KCgkJYldyb25nRm9ybWF0ID0gRkFMU0U7Cgl9CgllbHNlCgl7CgkJYldyb25nRm9ybWF0ID0gVFJVRTsKCQlyZXR1cm4gZHQ7Cgl9CgoJQ0ZYX1dpZGVTdHJpbmcgc3dUZW1wOwoJc3dUZW1wLkZvcm1hdChMIiVkLyVkLyVkICVkOiVkOiVkIixuTW9udGgsbkRheSxuWWVhcixuSG91cixuTWluLG5TZWMpOwoJcmV0dXJuIEpTX0RhdGVQYXJzZShzd1RlbXApOwp9Cgpkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VSZWd1bGFyRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmIHZhbHVlLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmIGZvcm1hdCwgRlhfQk9PTCYgYldyb25nRm9ybWF0KQp7Cglkb3VibGUgZHQgPSBKU19HZXREYXRlVGltZSgpOwoKCWlmIChmb3JtYXQuSXNFbXB0eSgpIHx8IHZhbHVlLklzRW1wdHkoKSkKCQlyZXR1cm4gZHQ7CgoJaW50IG5ZZWFyID0gSlNfR2V0WWVhckZyb21UaW1lKGR0KTsKCWludCBuTW9udGggPSBKU19HZXRNb250aEZyb21UaW1lKGR0KSArIDE7CglpbnQgbkRheSA9IEpTX0dldERheUZyb21UaW1lKGR0KTsKCWludCBuSG91ciA9IEpTX0dldEhvdXJGcm9tVGltZShkdCk7CglpbnQgbk1pbiA9IEpTX0dldE1pbkZyb21UaW1lKGR0KTsKCWludCBuU2VjID0gSlNfR2V0U2VjRnJvbVRpbWUoZHQpOwoKCWludCBuWWVhclN1YiA9IDk5OyAvL25ZZWFyIC0gMjAwMDsKCglGWF9CT09MIGJQbSA9IEZBTFNFOwoJRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwoJYldyb25nRm9ybWF0ID0gRkFMU0U7CgoJaW50IGk9MDsKCWludCBqPTA7CgoJd2hpbGUgKGkgPCBmb3JtYXQuR2V0TGVuZ3RoKCkpCgl7CgkJaWYgKGJFeGl0KSBicmVhazsKCgkJRlhfV0NIQVIgYyA9IGZvcm1hdC5HZXRBdChpKTsKCQlzd2l0Y2ggKGMpCgkJewoJCQljYXNlICc6JzoKCQkJY2FzZSAnLic6CgkJCWNhc2UgJy0nOgoJCQljYXNlICdcXCc6CgkJCWNhc2UgJy8nOgoJCQkJaSsrOwoJCQkJaisrOwoJCQkJYnJlYWs7CgoJCQljYXNlICd5JzoKCQkJY2FzZSAnbSc6CgkJCWNhc2UgJ2QnOgoJCQljYXNlICdIJzoKCQkJY2FzZSAnaCc6CgkJCWNhc2UgJ00nOgoJCQljYXNlICdzJzoKCQkJY2FzZSAndCc6CgkJCQl7CgkJCQkJaW50IG9sZGogPSBqOwoJCQkJCWludCBuU2tpcCA9IDA7CgkJCQkJaW50IHJlbWFpbmluZyA9IGZvcm1hdC5HZXRMZW5ndGgoKSAtIGkgLSAxOwoKCQkJCQlpZiAocmVtYWluaW5nID09IDAgfHwgZm9ybWF0LkdldEF0KGkrMSkgIT0gYykKCQkJCQl7CgkJCQkJCXN3aXRjaCAoYykKCQkJCQkJewoJCQkJCQkJY2FzZSAneSc6CgkJCQkJCQkJaSsrOwoJCQkJCQkJCWorKzsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ20nOgoJCQkJCQkJCW5Nb250aCA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwoJCQkJCQkJCWkrKzsKCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAnZCc6CgkJCQkJCQkJbkRheSA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwoJCQkJCQkJCWkrKzsKCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAnSCc6CgkJCQkJCQkJbkhvdXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKCQkJCQkJCQlpKys7CgkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ2gnOgoJCQkJCQkJCW5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CgkJCQkJCQkJaSsrOwoJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdNJzoKCQkJCQkJCQluTWluID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CgkJCQkJCQkJaSsrOwoJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdzJzoKCQkJCQkJCQluU2VjID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CgkJCQkJCQkJaSsrOwoJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICd0JzoKCQkJCQkJCQliUG0gPSAoaiA8IHZhbHVlLkdldExlbmd0aCgpICYmIHZhbHVlLkdldEF0KGopID09ICdwJyk7CgkJCQkJCQkJaSsrOwoJCQkJCQkJCWorKzsKCQkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCQllbHNlIGlmIChyZW1haW5pbmcgPT0gMSB8fCBmb3JtYXQuR2V0QXQoaSsyKSAhPSBjKQoJCQkJCXsKCQkJCQkJc3dpdGNoIChjKQoJCQkJCQl7CgkJCQkJCQljYXNlICd5JzoKCQkJCQkJCQluWWVhciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDQpOwoJCQkJCQkJCWkgKz0gMjsKCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAnbSc6CgkJCQkJCQkJbk1vbnRoID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CgkJCQkJCQkJaSArPSAyOwoJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdkJzoKCQkJCQkJCQluRGF5ID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CgkJCQkJCQkJaSArPSAyOwoJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdIJzoKCQkJCQkJCQluSG91ciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwoJCQkJCQkJCWkgKz0gMjsKCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAnaCc6CgkJCQkJCQkJbkhvdXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKCQkJCQkJCQlpICs9IDI7CgkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ00nOgoJCQkJCQkJCW5NaW4gPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKCQkJCQkJCQlpICs9IDI7CgkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ3MnOgoJCQkJCQkJCW5TZWMgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKCQkJCQkJCQlpICs9IDI7CgkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ3QnOgoJCQkJCQkJCWJQbSA9IChqICsgMSA8IHZhbHVlLkdldExlbmd0aCgpICYmIHZhbHVlLkdldEF0KGopID09ICdwJyAmJiB2YWx1ZS5HZXRBdChqKzEpID09ICdtJyk7CgkJCQkJCQkJaSArPSAyOwoJCQkJCQkJCWogKz0gMjsKCQkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCQllbHNlIGlmIChyZW1haW5pbmcgPT0gMiB8fCBmb3JtYXQuR2V0QXQoaSszKSAhPSBjKQoJCQkJCXsKCQkJCQkJc3dpdGNoIChjKQoJCQkJCQl7CgkJCQkJCQljYXNlICdtJzoKCQkJCQkJCQl7CgkJCQkJCQkJCUNGWF9XaWRlU3RyaW5nIHNNb250aCA9IFBhcnNlU3RyaW5nU3RyaW5nKHZhbHVlLCBqLCBuU2tpcCk7CgkJCQkJCQkJCUZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKCQkJCQkJCQkJZm9yIChpbnQgbSA9IDA7IG0gPCAxMjsgbSsrKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQlpZiAoc01vbnRoLkNvbXBhcmVOb0Nhc2UobW9udGhzW21dKSA9PSAwKQoJCQkJCQkJCQkJewoJCQkJCQkJCQkJCW5Nb250aCA9IG0gKyAxOwoJCQkJCQkJCQkJCWkrPTM7CgkJCQkJCQkJCQkJais9blNraXA7CgkJCQkJCQkJCQkJYkZpbmQgPSBUUlVFOwoJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgoJCQkJCQkJCQlpZiAoIWJGaW5kKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQluTW9udGggPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAzKTsKCQkJCQkJCQkJCWkrPTM7CgkJCQkJCQkJCQlqICs9IG5Ta2lwOwoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAneSc6CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQlkZWZhdWx0OgoJCQkJCQkJCWkrPTM7CgkJCQkJCQkJais9MzsKCQkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCQllbHNlIGlmIChyZW1haW5pbmcgPT0gMyB8fCBmb3JtYXQuR2V0QXQoaSs0KSAhPSBjKQoJCQkJCXsKCQkJCQkJc3dpdGNoIChjKQoJCQkJCQl7CgoKCQkJCQkJCWNhc2UgJ3knOgoJCQkJCQkJCW5ZZWFyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgNCk7CgkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQlpICs9IDQ7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdtJzoKCQkJCQkJCQl7CgkJCQkJCQkJCUZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKCgkJCQkJCQkJCUNGWF9XaWRlU3RyaW5nIHNNb250aCA9IFBhcnNlU3RyaW5nU3RyaW5nKHZhbHVlLCBqLCBuU2tpcCk7CgkJCQkJCQkJCXNNb250aC5NYWtlTG93ZXIoKTsKCgkJCQkJCQkJCWZvciAoaW50IG0gPSAwOyBtIDwgMTI7IG0rKykKCQkJCQkJCQkJewoJCQkJCQkJCQkJQ0ZYX1dpZGVTdHJpbmcgc0Z1bGxNb250aHMgPSBmdWxsbW9udGhzW21dOwoJCQkJCQkJCQkJc0Z1bGxNb250aHMuTWFrZUxvd2VyKCk7CgoJCQkJCQkJCQkJaWYgKHNGdWxsTW9udGhzLkZpbmQoc01vbnRoLCAwKSAhPSAtMSkKCQkJCQkJCQkJCXsKCQkJCQkJCQkJCQluTW9udGggPSBtICsgMTsKCQkJCQkJCQkJCQlpICs9IDQ7CgkJCQkJCQkJCQkJaiArPSBuU2tpcDsKCQkJCQkJCQkJCQliRmluZCA9IFRSVUU7CgkJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCX0KCgkJCQkJCQkJCWlmICghYkZpbmQpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCW5Nb250aCA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDQpOwoJCQkJCQkJCQkJaSs9NDsKCQkJCQkJCQkJCWogKz0gblNraXA7CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQlkZWZhdWx0OgoJCQkJCQkJCWkgKz0gNDsKCQkJCQkJCQlqICs9IDQ7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJaWYgKGogPj0gdmFsdWUuR2V0TGVuZ3RoKCkgfHwgZm9ybWF0LkdldEF0KGkpICE9IHZhbHVlLkdldEF0KGopKQoJCQkJCQl7CgkJCQkJCQliV3JvbmdGb3JtYXQgPSBUUlVFOwoJCQkJCQkJYkV4aXQgPSBUUlVFOwoJCQkJCQl9CgkJCQkJCWkrKzsKCQkJCQkJaisrOwoJCQkJCX0KCgkJCQkJaWYgKG9sZGogPT0gaikKCQkJCQl7CgkJCQkJCWJXcm9uZ0Zvcm1hdCA9IFRSVUU7CgkJCQkJCWJFeGl0ID0gVFJVRTsKCQkJCQl9CgkJCQl9CgoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQlpZiAodmFsdWUuR2V0TGVuZ3RoKCkgPD0gaikKCQkJCXsKCQkJCQliRXhpdCA9IFRSVUU7CgkJCQl9CgkJCQllbHNlIGlmIChmb3JtYXQuR2V0QXQoaSkgIT0gdmFsdWUuR2V0QXQoaikpCgkJCQl7CgkJCQkJYldyb25nRm9ybWF0ID0gVFJVRTsKCQkJCQliRXhpdCA9IFRSVUU7CgkJCQl9CgoJCQkJaSsrOwoJCQkJaisrOwoJCQkJYnJlYWs7CgkJfQoJfQoKCWlmIChiUG0pIG5Ib3VyICs9IDEyOwoKCWlmIChuWWVhciA+PSAwICYmIG5ZZWFyIDw9IG5ZZWFyU3ViKQoJCW5ZZWFyICs9IDIwMDA7CgoJaWYgKG5Nb250aCA8IDEgfHwgbk1vbnRoID4gMTIpCgkJYldyb25nRm9ybWF0ID0gVFJVRTsKCglpZiAobkRheSA8IDEgfHwgbkRheSA+IDMxKQoJCWJXcm9uZ0Zvcm1hdCA9IFRSVUU7CgoJaWYgKG5Ib3VyIDwgMCB8fCBuSG91ciA+IDI0KQoJCWJXcm9uZ0Zvcm1hdCA9IFRSVUU7CgoJaWYgKG5NaW4gPCAwIHx8IG5NaW4gPiA2MCkKCQliV3JvbmdGb3JtYXQgPSBUUlVFOwoKCWlmIChuU2VjIDwgMCB8fCBuU2VjID4gNjApCgkJYldyb25nRm9ybWF0ID0gVFJVRTsKCglkb3VibGUgZFJldCA9IDA7CgoJaWYgKGJXcm9uZ0Zvcm1hdCkKCXsKCQlkUmV0ID0gUGFyc2VOb3JtYWxEYXRlKHZhbHVlLCBiV3JvbmdGb3JtYXQpOwoJfQoJZWxzZQoJewoJCWRSZXQgPSBKU19NYWtlRGF0ZShKU19NYWtlRGF5KG5ZZWFyLG5Nb250aCAtIDEsbkRheSksSlNfTWFrZVRpbWUobkhvdXIsIG5NaW4sIG5TZWMsIDApKTsKCgkJaWYgKEpTX1BvcnRJc05hbihkUmV0KSkKCQl7CgkJCWRSZXQgPSBKU19EYXRlUGFyc2UodmFsdWUpOwoJCX0KCX0KCglpZiAoSlNfUG9ydElzTmFuKGRSZXQpKQoJewoJCWRSZXQgPSBQYXJzZU5vcm1hbERhdGUodmFsdWUsIGJXcm9uZ0Zvcm1hdCk7Cgl9CgoJcmV0dXJuIGRSZXQ7Cgp9CgpDRlhfV2lkZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6TWFrZUZvcm1hdERhdGUoZG91YmxlIGREYXRlLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmIGZvcm1hdCkKewoJQ0ZYX1dpZGVTdHJpbmcgc1JldCA9IEwiIixzUGFydCA9IEwiIjsKCglpbnQgblllYXIgPSBKU19HZXRZZWFyRnJvbVRpbWUoZERhdGUpOwoJaW50IG5Nb250aCA9IEpTX0dldE1vbnRoRnJvbVRpbWUoZERhdGUpICsgMTsKCWludCBuRGF5ID0gSlNfR2V0RGF5RnJvbVRpbWUoZERhdGUpOwoJaW50IG5Ib3VyID0gSlNfR2V0SG91ckZyb21UaW1lKGREYXRlKTsKCWludCBuTWluID0gSlNfR2V0TWluRnJvbVRpbWUoZERhdGUpOwoJaW50IG5TZWMgPSBKU19HZXRTZWNGcm9tVGltZShkRGF0ZSk7CgoJaW50IGkgPSAwOwoJd2hpbGUgKGkgPCBmb3JtYXQuR2V0TGVuZ3RoKCkpCgl7CgkgICAgICAgIEZYX1dDSEFSIGMgPSBmb3JtYXQuR2V0QXQoaSk7CiAgICAgICAgICAgICAgICBpbnQgcmVtYWluaW5nID0gZm9ybWF0LkdldExlbmd0aCgpIC0gaSAtIDE7CgkJc1BhcnQgPSBMIiI7CgkJc3dpdGNoIChjKQoJCXsKCQkJY2FzZSAneSc6CgkJCWNhc2UgJ20nOgoJCQljYXNlICdkJzoKCQkJY2FzZSAnSCc6CgkJCWNhc2UgJ2gnOgoJCQljYXNlICdNJzoKCQkJY2FzZSAncyc6CgkJCWNhc2UgJ3QnOgoJCQkJaWYgKHJlbWFpbmluZyA9PSAwIHx8IGZvcm1hdC5HZXRBdChpKzEpICE9IGMpCgkJCQl7CgkJCQkJc3dpdGNoIChjKQoJCQkJCXsKCQkJCQkJY2FzZSAneSc6CgkJCQkJCQlzUGFydCArPSBjOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ20nOgoJCQkJCQkJc1BhcnQuRm9ybWF0KEwiJWQiLG5Nb250aCk7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnZCc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlZCIsbkRheSk7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnSCc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlZCIsbkhvdXIpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ2gnOgoJCQkJCQkJc1BhcnQuRm9ybWF0KEwiJWQiLG5Ib3VyPjEyP25Ib3VyIC0gMTI6bkhvdXIpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ00nOgoJCQkJCQkJc1BhcnQuRm9ybWF0KEwiJWQiLG5NaW4pOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ3MnOgoJCQkJCQkJc1BhcnQuRm9ybWF0KEwiJWQiLG5TZWMpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ3QnOgoJCQkJCQkJc1BhcnQgKz0gbkhvdXI+MTI/J3AnOidhJzsKCQkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCQlpKys7CgkJCQl9CgkJCQllbHNlIGlmIChyZW1haW5pbmcgPT0gMSB8fCBmb3JtYXQuR2V0QXQoaSsyKSAhPSBjKQoJCQkJewoJCQkJCXN3aXRjaCAoYykKCQkJCQl7CgkJCQkJCWNhc2UgJ3knOgoJCQkJCQkJc1BhcnQuRm9ybWF0KEwiJTAyZCIsblllYXIgLSAoblllYXIgLyAxMDApICogMTAwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdtJzoKCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiUwMmQiLG5Nb250aCk7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnZCc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlMDJkIixuRGF5KTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdIJzoKCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiUwMmQiLG5Ib3VyKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICdoJzoKCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiUwMmQiLG5Ib3VyPjEyP25Ib3VyIC0gMTI6bkhvdXIpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgJ00nOgoJCQkJCQkJc1BhcnQuRm9ybWF0KEwiJTAyZCIsbk1pbik7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAncyc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlMDJkIixuU2VjKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICd0JzoKCQkJCQkJCXNQYXJ0ID0gbkhvdXI+MTI/IEwicG0iOiBMImFtIjsKCQkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCQlpKz0yOwoJCQkJfQoJCQkJZWxzZSBpZiAocmVtYWluaW5nID09IDIgfHwgZm9ybWF0LkdldEF0KGkrMykgIT0gYykKCQkJCXsKCQkJCQlzd2l0Y2ggKGMpCgkJCQkJewoJCQkJCQljYXNlICdtJzoKCQkJCQkJCWkrPTM7CgkJCQkJCQlpZiAobk1vbnRoID4gMCYmbk1vbnRoIDw9IDEyKQoJCQkJCQkJCXNQYXJ0ICs9IG1vbnRoc1tuTW9udGggLSAxXTsKCQkJCQkJCWJyZWFrOwoJCQkJCQlkZWZhdWx0OgoJCQkJCQkJaSs9MzsKCQkJCQkJCXNQYXJ0ICs9IGM7CgkJCQkJCQlzUGFydCArPSBjOwoJCQkJCQkJc1BhcnQgKz0gYzsKCQkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJCWVsc2UgaWYgKHJlbWFpbmluZyA9PSAzIHx8IGZvcm1hdC5HZXRBdChpKzQpICE9IGMpCgkJCQl7CgkJCQkJc3dpdGNoIChjKQoJCQkJCXsKCQkJCQkJY2FzZSAneSc6CgkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlMDRkIixuWWVhcik7CgkJCQkJCQlpICs9IDQ7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAnbSc6CgkJCQkJCQlpKz00OwoJCQkJCQkJaWYgKG5Nb250aCA+IDAmJm5Nb250aCA8PSAxMikKCQkJCQkJCQlzUGFydCArPSBmdWxsbW9udGhzW25Nb250aCAtIDFdOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWRlZmF1bHQ6CgkJCQkJCQlpICs9IDQ7CgkJCQkJCQlzUGFydCArPSBjOwoJCQkJCQkJc1BhcnQgKz0gYzsKCQkJCQkJCXNQYXJ0ICs9IGM7CgkJCQkJCQlzUGFydCArPSBjOwoJCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCWkrKzsKCQkJCQlzUGFydCArPSBjOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQlpKys7CgkJCQlzUGFydCArPSBjOwoJCQkJYnJlYWs7CgkJfQoKCQlzUmV0ICs9IHNQYXJ0OwoJfQoKCXJldHVybiBzUmV0Owp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLy9mdW5jdGlvbiBBRk51bWJlcl9Gb3JtYXQobkRlYywgc2VwU3R5bGUsIG5lZ1N0eWxlLCBjdXJyU3R5bGUsIHN0ckN1cnJlbmN5LCBiQ3VycmVuY3lQcmVwZW5kKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRk51bWJlcl9Gb3JtYXQoT0JKX01FVEhPRF9QQVJBTVMpCnsKI2lmIF9GWF9PU18gIT0gX0ZYX0FORFJPSURfCgl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgoJaWYgKHBhcmFtcy5zaXplKCkgIT0gNikKCXsKCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwoJCXJldHVybiBGQUxTRTsKCX0KCWlmKCFwRXZlbnQtPm1fcFZhbHVlKQoJCXJldHVybiBGQUxTRTsKCUNGWF9XaWRlU3RyaW5nJiBWYWx1ZSA9IHBFdmVudC0+VmFsdWUoKTsJCglDRlhfQnl0ZVN0cmluZyBzdHJWYWx1ZSA9IFN0clRyaW0oQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKFZhbHVlKSk7CgkKCWlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpIHJldHVybiBUUlVFOwoJCglpbnQgaURlYyA9IHBhcmFtc1swXTsKCWludCBpU2VwU3R5bGUgPSBwYXJhbXNbMV07CglpbnQgaU5lZ1N0eWxlID0gcGFyYW1zWzJdOwoJLy8gcGFyYW1zWzNdIGlzIGlDdXJyU3R5bGUsIGl0J3Mgbm90IHVzZWQuCglzdGQ6OndzdHJpbmcgd3N0ckN1cnJlbmN5KHBhcmFtc1s0XS5vcGVyYXRvciBDRlhfV2lkZVN0cmluZygpKTsKCUZYX0JPT0wgYkN1cnJlbmN5UHJlcGVuZCA9IHBhcmFtc1s1XTsKCQoJaWYgKGlEZWMgPCAwKSBpRGVjID0gLWlEZWM7CgkKCWlmIChpU2VwU3R5bGUgPCAwIHx8IGlTZXBTdHlsZSA+IDMpCgkJaVNlcFN0eWxlID0gMDsKCQoJaWYgKGlOZWdTdHlsZSA8IDAgfHwgaU5lZ1N0eWxlID4gMykKCQlpTmVnU3R5bGUgPSAwOwoJCgkKCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoJLy9mb3IgcHJvY2Vzc2luZyBkZWNpbWFsIHBsYWNlcwoJc3RyVmFsdWUuUmVwbGFjZSgiLCIsICIuIik7Cglkb3VibGUgZFZhbHVlID0gYXRvZihzdHJWYWx1ZSk7CglpZiAoaURlYyA+IDApCgkJZFZhbHVlICs9IERPVUJMRV9DT1JSRUNUOy8vCgkJICAgIAoJaW50IGlEZWMyOwoJRlhfQk9PTCBiTmFnYXRpdmUgPSBGQUxTRTsKCglzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLGlEZWMsJmlEZWMyLCZiTmFnYXRpdmUpOwoJaWYgKHN0clZhbHVlLklzRW1wdHkoKSkKCXsKCQlkVmFsdWUgPSAwOwoJCXN0clZhbHVlID0gZmN2dChkVmFsdWUsaURlYywmaURlYzIsJmJOYWdhdGl2ZSk7CgkJaWYgKHN0clZhbHVlLklzRW1wdHkoKSkKCQl7CgkJCXN0clZhbHVlID0gIjAiOwoJCQlpRGVjMiA9IDE7CgkJfQoKCX0KCglpZiAoaURlYzIgPCAwKQoJewoJCWZvciAoaW50IGlOdW0gPSAwO2lOdW0gPCBhYnMoaURlYzIpO2lOdW0rKykKCQl7CgkJCXN0clZhbHVlID0gIjAiICsgc3RyVmFsdWU7CgkJfQoJCWlEZWMyID0gMDsKCQkKCX0KCWludCBpTWF4ID0gc3RyVmFsdWUuR2V0TGVuZ3RoKCk7CglpZiAoaURlYzIgPiBpTWF4KQoJewoJCWZvciAoaW50IGlOdW0gPSAwO2lOdW0gPD0gaURlYzIgLSBpTWF4IDtpTnVtKyspCgkJewoJCQlzdHJWYWx1ZSArPSAiMCI7CgkJfQoJCWlNYXggPSBpRGVjMisxOwkJCQoJfQoJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy9mb3IgcHJvY2Vzc2luZyBzZXBlcmF0b3Igc3R5bGUKCWlmIChpRGVjMiA8IGlNYXgpCgl7CgkJaWYgKGlTZXBTdHlsZSA9PSAwIHx8IGlTZXBTdHlsZSA9PSAxKQoJCXsKCQkJc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnLicpOwoJCQlpTWF4Kys7CgkJfQoJCWVsc2UgaWYgKGlTZXBTdHlsZSA9PSAyIHx8IGlTZXBTdHlsZSA9PSAzKQoJCXsKCQkJc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnLCcpOwoJCQlpTWF4Kys7CgkJfQoJCQoJCWlmIChpRGVjMiA9PSAwKQoJCQlzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcwJyk7Cgl9CglpZiAoaVNlcFN0eWxlID09IDAgfHwgaVNlcFN0eWxlID09IDIpCgl7CgkJY2hhciBjU2VwZXJhdG9yOwoJCWlmIChpU2VwU3R5bGUgPT0gMCkKCQkJY1NlcGVyYXRvciA9ICcsJzsKCQllbHNlCgkJCWNTZXBlcmF0b3IgPSAnLic7CgkJCgkJaW50IGlEZWNQb3NpdGl2ZSxpRGVjTmFnYXRpdmU7CgkJaURlY1Bvc2l0aXZlID0gaURlYzI7CgkJaURlY05hZ2F0aXZlID0gaURlYzI7CQkKCQkKCQlmb3IgKGlEZWNQb3NpdGl2ZSA9IGlEZWMyIC0zOyBpRGVjUG9zaXRpdmUgPiAwO2lEZWNQb3NpdGl2ZSAtPSAzKQoJCXsKCQkJc3RyVmFsdWUuSW5zZXJ0KGlEZWNQb3NpdGl2ZSwgY1NlcGVyYXRvcik7CgkJCWlNYXgrKzsKCQl9Cgl9CgkKCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vZm9yIHByb2Nlc3NpbmcgY3VycmVuY3kgc3RyaW5nCgoJVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHN0clZhbHVlKTsKCQoJc3RkOjp3c3RyaW5nIHN0clZhbHVlMihWYWx1ZSk7CgoJaWYgKGJDdXJyZW5jeVByZXBlbmQpCgkJc3RyVmFsdWUyID0gd3N0ckN1cnJlbmN5ICsgc3RyVmFsdWUyOwoJZWxzZQoJCXN0clZhbHVlMiA9IHN0clZhbHVlMiArIHdzdHJDdXJyZW5jeTsKCQoJCgkKCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCS8vZm9yIHByb2Nlc3NpbmcgbmVnYXRpdmUgc3R5bGUKCWlmIChiTmFnYXRpdmUpCgl7CgkJaWYgKGlOZWdTdHlsZSA9PSAwKQoJCXsKCQkJc3RyVmFsdWUyLmluc2VydCgwLEwiLSIpOwoJCX0KCQlpZiAoaU5lZ1N0eWxlID09IDIgfHwgaU5lZ1N0eWxlID09IDMpCgkJewoJCQlzdHJWYWx1ZTIuaW5zZXJ0KDAsTCIoIik7CgkJCXN0clZhbHVlMi5pbnNlcnQoc3RyVmFsdWUyLmxlbmd0aCgpLEwiKSIpOwoJCX0KCQlpZiAoaU5lZ1N0eWxlID09IDEgfHwgaU5lZ1N0eWxlID09IDMpCgkJewoJCQlpZiAoRmllbGQgKiBmVGFyZ2V0ID0gcEV2ZW50LT5UYXJnZXRfRmllbGQoKSkKCQkJewoJCQkJQ0pTX0FycmF5IGFyQ29sb3IoaXNvbGF0ZSk7CgkJCQlDSlNfVmFsdWUgdkNvbEVsbShpc29sYXRlKTsKCQkJCXZDb2xFbG0gPSBMIlJHQiI7CgkJCQlhckNvbG9yLlNldEVsZW1lbnQoMCx2Q29sRWxtKTsKCQkJCXZDb2xFbG0gPSAxOwoJCQkJYXJDb2xvci5TZXRFbGVtZW50KDEsdkNvbEVsbSk7CgkJCQl2Q29sRWxtID0gMDsKCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgyLHZDb2xFbG0pOwoJCQkJCgkJCQlhckNvbG9yLlNldEVsZW1lbnQoMyx2Q29sRWxtKTsKCQkJCQoJCQkJQ0pTX1Byb3BWYWx1ZSB2UHJvcChpc29sYXRlKTsKCQkJCXZQcm9wLlN0YXJ0R2V0dGluZygpOwoJCQkJdlByb3A8PGFyQ29sb3I7CgkJCQl2UHJvcC5TdGFydFNldHRpbmcoKTsKCQkJCWZUYXJnZXQtPnRleHRDb2xvcihjYyx2UHJvcCxzRXJyb3IpOy8vIHJlZAoJCQl9CgkJfQoJfQoJZWxzZQoJewoJCWlmIChpTmVnU3R5bGUgPT0gMSB8fCBpTmVnU3R5bGUgPT0gMykKCQl7CgkJCWlmIChGaWVsZCAqZlRhcmdldCA9IHBFdmVudC0+VGFyZ2V0X0ZpZWxkKCkpCgkJCXsKCQkJCUNKU19BcnJheSBhckNvbG9yKGlzb2xhdGUpOwoJCQkJQ0pTX1ZhbHVlIHZDb2xFbG0oaXNvbGF0ZSk7CgkJCQl2Q29sRWxtID0gTCJSR0IiOwoJCQkJYXJDb2xvci5TZXRFbGVtZW50KDAsdkNvbEVsbSk7CgkJCQl2Q29sRWxtID0gMDsKCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgxLHZDb2xFbG0pOwoJCQkJYXJDb2xvci5TZXRFbGVtZW50KDIsdkNvbEVsbSk7CgkJCQlhckNvbG9yLlNldEVsZW1lbnQoMyx2Q29sRWxtKTsKCQkJCQoJCQkJQ0pTX1Byb3BWYWx1ZSB2UHJvcChpc29sYXRlKTsKCQkJCXZQcm9wLlN0YXJ0R2V0dGluZygpOwoJCQkJZlRhcmdldC0+dGV4dENvbG9yKGNjLHZQcm9wLHNFcnJvcik7CgkJCQkKCQkJCUNKU19BcnJheSBhUHJvcChpc29sYXRlKTsKCQkJCXZQcm9wLkNvbnZlcnRUb0FycmF5KGFQcm9wKTsKCgkJCQlDUFdMX0NvbG9yIGNyUHJvcDsKCQkJCUNQV0xfQ29sb3IgY3JDb2xvcjsKCQkJCWNvbG9yOjpDb252ZXJ0QXJyYXlUb1BXTENvbG9yKGFQcm9wLCBjclByb3ApOwoJCQkJY29sb3I6OkNvbnZlcnRBcnJheVRvUFdMQ29sb3IoYXJDb2xvciwgY3JDb2xvcik7CgoJCQkJaWYgKGNyQ29sb3IgIT0gY3JQcm9wKQoJCQkJewoJCQkJCUNKU19Qcm9wVmFsdWUgdlByb3AyKGlzb2xhdGUpOwoJCQkJCXZQcm9wMi5TdGFydEdldHRpbmcoKTsKCQkJCQl2UHJvcDI8PGFyQ29sb3I7CgkJCQkJdlByb3AyLlN0YXJ0U2V0dGluZygpOwogICAgIAkJCQlmVGFyZ2V0LT50ZXh0Q29sb3IoY2MsdlByb3AyLHNFcnJvcik7CgkJCQl9CgkJCX0KCQl9Cgl9CglWYWx1ZSA9IHN0clZhbHVlMi5jX3N0cigpOwojZW5kaWYKCXJldHVybiBUUlVFOwp9CgovL2Z1bmN0aW9uIEFGTnVtYmVyX0tleXN0cm9rZShuRGVjLCBzZXBTdHlsZSwgbmVnU3R5bGUsIGN1cnJTdHlsZSwgc3RyQ3VycmVuY3ksIGJDdXJyZW5jeVByZXBlbmQpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTnVtYmVyX0tleXN0cm9rZShPQkpfTUVUSE9EX1BBUkFNUykKewoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CglBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CglDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CglBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoJCglpZihwYXJhbXMuc2l6ZSgpIDwgMikKCQlyZXR1cm4gRkFMU0U7CglpbnQgaVNlcFN0eWxlID0gcGFyYW1zWzFdOwoJCglpZiAoaVNlcFN0eWxlIDwgMCB8fCBpU2VwU3R5bGUgPiAzKQoJCWlTZXBTdHlsZSA9IDA7CglpZighcEV2ZW50LT5tX3BWYWx1ZSkKCQlyZXR1cm4gRkFMU0U7CglDRlhfV2lkZVN0cmluZyAmIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsJCglDRlhfV2lkZVN0cmluZyAmIHdfc3RyQ2hhbmdlID0gcEV2ZW50LT5DaGFuZ2UoKTsKICAgIENGWF9XaWRlU3RyaW5nIHdfc3RyVmFsdWUgPSB2YWw7CgoJaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKQoJewoJCUNGWF9XaWRlU3RyaW5nIHdzdHJDaGFuZ2UgPSB3X3N0ckNoYW5nZTsKCQlDRlhfV2lkZVN0cmluZyB3c3RyVmFsdWUgPSBTdHJMVHJpbSh3X3N0clZhbHVlKTsKCQlpZiAod3N0clZhbHVlLklzRW1wdHkoKSkKCQkJcmV0dXJuIFRSVUU7CgkJCgkJQ0ZYX1dpZGVTdHJpbmcgc3dUZW1wID0gd3N0clZhbHVlOwoJCXN3VGVtcC5SZXBsYWNlKEwiLCIsIEwiLiIpOwoJCWlmICghSXNOdW1iZXIoc3dUZW1wKSkgLy8hKElzTnVtYmVyKHdzdHJDaGFuZ2UpICYmIAoJCXsKCQkJcEV2ZW50LT5SYygpID0gRkFMU0U7CgkJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTQUZOVU1CRVJfS0VZU1RST0tFKTsKCQkJQWxlcnQocENvbnRleHQsIHNFcnJvcik7CgkJCXJldHVybiBUUlVFOwoJCX0KCQlyZXR1cm4gVFJVRTsgLy8gaXQgaGFwcGVucyBhZnRlciB0aGUgbGFzdCBrZXlzdHJva2UgYW5kIGJlZm9yZSB2YWxpZGF0aW5nLAoJfQoJCglzdGQ6OndzdHJpbmcgd19zdHJWYWx1ZTIgKHdfc3RyVmFsdWUpOwoJc3RkOjp3c3RyaW5nIHdfc3RyQ2hhbmdlMih3X3N0ckNoYW5nZSk7CgkKCXN0ZDo6d3N0cmluZyB3X3N0clNlbGVjdGVkOwoJaWYoLTEgIT0gcEV2ZW50LT5TZWxTdGFydCgpKQoJCXdfc3RyU2VsZWN0ZWQgPSB3X3N0clZhbHVlMi5zdWJzdHIocEV2ZW50LT5TZWxTdGFydCgpLChwRXZlbnQtPlNlbEVuZCgpIC0gcEV2ZW50LT5TZWxTdGFydCgpKSk7CglGWF9CT09MIGJIYXNTaWduID0gKHdfc3RyVmFsdWUyLmZpbmQoJy0nKSAhPSAtMSkgJiYgKHdfc3RyU2VsZWN0ZWQuZmluZCgnLScpID09IC0xKTsKCWlmIChiSGFzU2lnbikKCXsKCQkvL2Nhbid0IGluc2VydCAiY2hhbmdlIiBpbiBmcm9udCB0byBzaWduIHBvc3Rpb24uCgkJaWYgKHBFdmVudC0+U2VsU3RhcnQoKSA9PSAwKQoJCXsKICAgICAgICAgICAgRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOwoJCQliUmMgPSBGQUxTRTsKCQkJcmV0dXJuIFRSVUU7CgkJfQoJfQoKCWNoYXIgY1NlcCA9IEwnLic7CgoJc3dpdGNoIChpU2VwU3R5bGUpCgl7CgljYXNlIDA6CgljYXNlIDE6CgkJY1NlcCA9IEwnLic7CgkJYnJlYWs7CgljYXNlIDI6CgljYXNlIDM6CgkJY1NlcCA9IEwnLCc7CgkJYnJlYWs7Cgl9CgkKCUZYX0JPT0wgYkhhc1NlcCA9ICh3X3N0clZhbHVlMi5maW5kKGNTZXApICE9IC0xKTsKCWZvciAoc3RkOjp3c3RyaW5nOjppdGVyYXRvciBpdCA9IHdfc3RyQ2hhbmdlMi5iZWdpbigpOyBpdCAhPSB3X3N0ckNoYW5nZTIuZW5kKCk7IGl0KyspCgl7CgkJaWYgKCppdCA9PSBjU2VwKQoJCXsKCQkJaWYgKGJIYXNTZXApCgkJCXsKCQkJCUZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKCQkJCWJSYyA9IEZBTFNFOwoJCQkJcmV0dXJuIFRSVUU7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQliSGFzU2VwID0gVFJVRTsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJfQoJCWlmICgqaXQgPT0gTCctJykKCQl7CgkJCWlmIChiSGFzU2lnbikKCQkJewoJCQkJRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOwoJCQkJYlJjID0gRkFMU0U7CgkJCQlyZXR1cm4gVFJVRTsKCQkJfQoJCQllbHNlIGlmIChpdCAhPSB3X3N0ckNoYW5nZTIuYmVnaW4oKSkgLy9zaWduJ3MgcG9zaXRpb24gaXMgbm90IGNvcnJlY3QKCQkJewoJCQkJRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOwoJCQkJYlJjID0gRkFMU0U7CgkJCQlyZXR1cm4gVFJVRTsKCQkJfQoJCQllbHNlIGlmIChwRXZlbnQtPlNlbFN0YXJ0KCkgIT0gMCkKCQkJewoJCQkJRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOwoJCQkJYlJjID0gRkFMU0U7CgkJCQlyZXR1cm4gVFJVRTsKCQkJfQoJCQliSGFzU2lnbiA9IFRSVUU7CgkJCWNvbnRpbnVlOwoJCX0KCQkKCQlpZiAoIUlzRGlnaXQoKml0KSkKCQl7CQkJCgkJCUZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKCQkJYlJjID0gRkFMU0U7CgkJCXJldHVybiBUUlVFOwoJCX0KCX0KCQoJCglzdGQ6OndzdHJpbmcgd19wcmVmaXggPSB3X3N0clZhbHVlMi5zdWJzdHIoMCxwRXZlbnQtPlNlbFN0YXJ0KCkpOwoJc3RkOjp3c3RyaW5nIHdfcG9zdGZpeDsKCWlmIChwRXZlbnQtPlNlbEVuZCgpPChpbnQpd19zdHJWYWx1ZTIubGVuZ3RoKCkpCgkJd19wb3N0Zml4ICA9IHdfc3RyVmFsdWUyLnN1YnN0cihwRXZlbnQtPlNlbEVuZCgpKTsKCXdfc3RyVmFsdWUyID0gd19wcmVmaXggKyB3X3N0ckNoYW5nZTIgKyB3X3Bvc3RmaXg7Cgl3X3N0clZhbHVlID0gd19zdHJWYWx1ZTIuY19zdHIoKTsKCXZhbCA9IHdfc3RyVmFsdWU7CglyZXR1cm4gVFJVRTsJCQoJCn0KCi8vZnVuY3Rpb24gQUZQZXJjZW50X0Zvcm1hdChuRGVjLCBzZXBTdHlsZSkKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZQZXJjZW50X0Zvcm1hdChPQkpfTUVUSE9EX1BBUkFNUykKewojaWYgX0ZYX09TXyAhPSBfRlhfQU5EUk9JRF8KCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoJQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwoJQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKCiAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAyKQoJewoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoJaWYoIXBFdmVudC0+bV9wVmFsdWUpCgkJcmV0dXJuIEZBTFNFOwoJQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwoJCi8vICAgICBIV05EIGhNYWluRnJhbWUgPSBOVUxMOwovLyAJCi8vIAlDUERGU0RLX0Zvcm1GaWxsQXBwICpwQXBwID0gcENvbnRleHQtPkdldFJlYWRlckFwcCgpOwovLyAJQVNTRVJUKHBBcHApOwovLyAJaE1haW5GcmFtZSA9IHBBcHAtPkdldE1haW5GcmFtZVduZCgpOwoJCQoJQ0ZYX0J5dGVTdHJpbmcgc3RyVmFsdWUgPSBTdHJUcmltKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShWYWx1ZSkpOwoJCglpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQoJCXJldHVybiBUUlVFOwoJCglpbnQgaURlYyA9IHBhcmFtc1swXTsKCWludCBpU2VwU3R5bGUgPSBwYXJhbXNbMV07CgkKCS8vQVNTRVJUKGlEZWMgPiAwKTsKCWlmIChpRGVjIDwgMCkKCQlpRGVjID0gLWlEZWM7CgkKCWlmIChpU2VwU3R5bGUgPCAwIHx8IGlTZXBTdHlsZSA+IDMpCgkJaVNlcFN0eWxlID0gMDsKCQoJCgkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCS8vZm9yIHByb2Nlc3NpbmcgZGVjaW1hbCBwbGFjZXMKCWRvdWJsZSBkVmFsdWUgPSBhdG9mKHN0clZhbHVlKTsKCWRWYWx1ZSAqPSAxMDA7CglpZiAoaURlYyA+IDApCgkJZFZhbHVlICs9IERPVUJMRV9DT1JSRUNUOy8v0KPV/QoKCWludCBpRGVjMjsKCUZYX0JPT0wgYk5hZ2F0aXZlID0gRkFMU0U7CglzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLGlEZWMsJmlEZWMyLCZiTmFnYXRpdmUpOwogICAgaWYgKHN0clZhbHVlLklzRW1wdHkoKSkKCXsKCQlkVmFsdWUgPSAwOwoJCXN0clZhbHVlID0gZmN2dChkVmFsdWUsaURlYywmaURlYzIsJmJOYWdhdGl2ZSk7Cgl9CgoJaWYgKGlEZWMyIDwgMCkKCXsKCQlmb3IgKGludCBpTnVtID0gMDsgaU51bSA8IGFicyhpRGVjMik7IGlOdW0rKykKCQl7CgkJCXN0clZhbHVlID0gIjAiICsgc3RyVmFsdWU7CgkJfQoJCWlEZWMyID0gMDsKCQkKCX0KCWludCBpTWF4ID0gc3RyVmFsdWUuR2V0TGVuZ3RoKCk7CglpZiAoaURlYzIgPiBpTWF4KQoJewoJCWZvciAoaW50IGlOdW0gPSAwOyBpTnVtIDw9IGlEZWMyIC0gaU1heDsgaU51bSsrKQoJCXsKCQkJc3RyVmFsdWUgKz0gIjAiOwoJCX0KCQlpTWF4ID0gaURlYzIrMTsJCQkKCX0KCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vZm9yIHByb2Nlc3Npbmcgc2VwZXJhdG9yIHN0eWxlCglpZiAoaURlYzIgPCBpTWF4KQoJewoJCWlmIChpU2VwU3R5bGUgPT0gMCB8fCBpU2VwU3R5bGUgPT0gMSkKCQl7CgkJCXN0clZhbHVlLkluc2VydChpRGVjMiwgJy4nKTsKCQkJaU1heCsrOwoJCX0KCQllbHNlIGlmIChpU2VwU3R5bGUgPT0gMiB8fCBpU2VwU3R5bGUgPT0gMykKCQl7CgkJCXN0clZhbHVlLkluc2VydChpRGVjMiwgJywnKTsKCQkJaU1heCsrOwoJCX0KCQkKCQlpZiAoaURlYzIgPT0gMCkKCQkJc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnMCcpOwoJfQoJaWYgKGlTZXBTdHlsZSA9PSAwIHx8IGlTZXBTdHlsZSA9PSAyKQoJewoJCWNoYXIgY1NlcGVyYXRvcjsKCQlpZiAoaVNlcFN0eWxlID09IDApCgkJCWNTZXBlcmF0b3IgPSAnLCc7CgkJZWxzZQoJCQljU2VwZXJhdG9yID0gJy4nOwoJCQoJCWludCBpRGVjUG9zaXRpdmUsaURlY05hZ2F0aXZlOwoJCWlEZWNQb3NpdGl2ZSA9IGlEZWMyOwoJCWlEZWNOYWdhdGl2ZSA9IGlEZWMyOwoJCQkKCQlmb3IgKGlEZWNQb3NpdGl2ZSA9IGlEZWMyIC0zOyBpRGVjUG9zaXRpdmUgPiAwOyBpRGVjUG9zaXRpdmUgLT0gMykKCQl7CgkJCXN0clZhbHVlLkluc2VydChpRGVjUG9zaXRpdmUsY1NlcGVyYXRvcik7CgkJCWlNYXgrKzsKCQl9Cgl9CgkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoJLy9uYWdhdGl2ZSBtYXJrCglpZihiTmFnYXRpdmUpCgkJc3RyVmFsdWUgPSAiLSIgKyBzdHJWYWx1ZTsKCXN0clZhbHVlICs9ICIlIjsKCVZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChzdHJWYWx1ZSk7CiNlbmRpZgoJcmV0dXJuIFRSVUU7Cn0KLy9BRlBlcmNlbnRfS2V5c3Ryb2tlKG5EZWMsIHNlcFN0eWxlKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlBlcmNlbnRfS2V5c3Ryb2tlKE9CSl9NRVRIT0RfUEFSQU1TKQp7CglyZXR1cm4gQUZOdW1iZXJfS2V5c3Ryb2tlKGNjLHBhcmFtcyx2UmV0LHNFcnJvcik7Cn0KCi8vZnVuY3Rpb24gQUZEYXRlX0Zvcm1hdEV4KGNGb3JtYXQpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9Gb3JtYXRFeChPQkpfTUVUSE9EX1BBUkFNUykKewoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CglBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CglDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CglBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCgl7CgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CQoJaWYoIXBFdmVudC0+bV9wVmFsdWUpCgkJcmV0dXJuIEZBTFNFOwoJQ0ZYX1dpZGVTdHJpbmcmIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsKCQoJQ0ZYX1dpZGVTdHJpbmcgc3RyVmFsdWUgPSB2YWw7CQoJaWYgKHN0clZhbHVlLklzRW1wdHkoKSkgcmV0dXJuIFRSVUU7CQkKCglDRlhfV2lkZVN0cmluZyBzRm9ybWF0ID0gcGFyYW1zWzBdLm9wZXJhdG9yIENGWF9XaWRlU3RyaW5nKCk7CgoJRlhfQk9PTCBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKCWRvdWJsZSBkRGF0ZSA9IDAuMGY7CgoJaWYoc3RyVmFsdWUuRmluZChMIkdNVCIpICE9IC0xKQoJewoJCS8vZm9yIEdNVCBmb3JtYXQgdGltZQoJCS8vc3VjaCBhcyAiVHVlIEF1ZyAxMSAxNDoyNDoxNiBHTVQrMDgwMDIwMDkiCgkJZERhdGUgPSBNYWtlSW50ZXJEYXRlKHN0clZhbHVlKTsKCX0KCWVsc2UKCXsKCQlkRGF0ZSA9IE1ha2VSZWd1bGFyRGF0ZShzdHJWYWx1ZSxzRm9ybWF0LGJXcm9uZ0Zvcm1hdCk7Cgl9CgoJaWYgKEpTX1BvcnRJc05hbihkRGF0ZSkpCgl7CgkJQ0ZYX1dpZGVTdHJpbmcgc3dNc2c7CgkJc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSU0VEQVRFKSwgc0Zvcm1hdC5jX3N0cigpKTsKCQlBbGVydChwQ29udGV4dCwgc3dNc2cpOwoJCXJldHVybiBGQUxTRTsKCX0KCQoJdmFsID0gIE1ha2VGb3JtYXREYXRlKGREYXRlLHNGb3JtYXQpOwoKCXJldHVybiBUUlVFOwp9Cgpkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VJbnRlckRhdGUoQ0ZYX1dpZGVTdHJpbmcgc3RyVmFsdWUpCnsKCWludCBuSG91cjsKCWludCBuTWluOwoJaW50IG5TZWM7CglpbnQgblllYXI7CglpbnQgbk1vbnRoOwoJaW50IG5EYXk7CgoJQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c0FycmF5OwoJQ0ZYX1dpZGVTdHJpbmcgc01vbnRoID0gTCIiOwoJQ0ZYX1dpZGVTdHJpbmcgc1RlbXAgPSBMIiI7CglpbnQgblNpemUgPSBzdHJWYWx1ZS5HZXRMZW5ndGgoKTsKCglmb3IoaW50IGkgPSAwOyBpIDwgblNpemU7IGkrKykKCXsKCQlGWF9XQ0hBUiBjID0gc3RyVmFsdWUuR2V0QXQoaSk7CgkJaWYoYyA9PSBMJyAnIHx8IGMgPT0gTCc6JykKCQl7CQoJCQl3c0FycmF5LkFkZChzVGVtcCk7CgkJCXNUZW1wID0gTCIiOwoJCQljb250aW51ZTsKCQl9CgoJCXNUZW1wICs9IGM7Cgl9CgkKCXdzQXJyYXkuQWRkKHNUZW1wKTsKCWlmKHdzQXJyYXkuR2V0U2l6ZSgpICE9IDgpcmV0dXJuIDA7CgoJc1RlbXAgPSB3c0FycmF5WzFdOwoJaWYoc1RlbXAuQ29tcGFyZShMIkphbiIpID09IDApIG5Nb250aCA9IDE7CglpZihzVGVtcC5Db21wYXJlKEwiRmViIikgPT0gMCkgbk1vbnRoID0gMjsKCWlmKHNUZW1wLkNvbXBhcmUoTCJNYXIiKSA9PSAwKSBuTW9udGggPSAzOwoJaWYoc1RlbXAuQ29tcGFyZShMIkFwciIpID09IDApIG5Nb250aCA9IDQ7CglpZihzVGVtcC5Db21wYXJlKEwiTWF5IikgPT0gMCkgbk1vbnRoID0gNTsKCWlmKHNUZW1wLkNvbXBhcmUoTCJKdW4iKSA9PSAwKSBuTW9udGggPSA2OwoJaWYoc1RlbXAuQ29tcGFyZShMIkp1bCIpID09IDApIG5Nb250aCA9IDc7CglpZihzVGVtcC5Db21wYXJlKEwiQXVnIikgPT0gMCkgbk1vbnRoID0gODsKCWlmKHNUZW1wLkNvbXBhcmUoTCJTZXAiKSA9PSAwKSBuTW9udGggPSA5OwoJaWYoc1RlbXAuQ29tcGFyZShMIk9jdCIpID09IDApIG5Nb250aCA9IDEwOwoJaWYoc1RlbXAuQ29tcGFyZShMIk5vdiIpID09IDApIG5Nb250aCA9IDExOwoJaWYoc1RlbXAuQ29tcGFyZShMIkRlYyIpID09IDApIG5Nb250aCA9IDEyOwoKCW5EYXkgPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVsyXSk7CgluSG91ciA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzNdKTsKCW5NaW4gPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVs0XSk7CgluU2VjID0gKGludClQYXJzZVN0cmluZ1RvTnVtYmVyKHdzQXJyYXlbNV0pOwoJblllYXIgPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVs3XSk7CgoJZG91YmxlIGRSZXQgPSBKU19NYWtlRGF0ZShKU19NYWtlRGF5KG5ZZWFyLG5Nb250aCAtIDEsbkRheSksSlNfTWFrZVRpbWUobkhvdXIsIG5NaW4sIG5TZWMsIDApKTsKCglpZiAoSlNfUG9ydElzTmFuKGRSZXQpKQoJewoJCWRSZXQgPSBKU19EYXRlUGFyc2Uoc3RyVmFsdWUpOwoJfQoJCglyZXR1cm4gZFJldDsKfQoKLy9BRkRhdGVfS2V5c3Ryb2tlRXgoY0Zvcm1hdCkKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0tleXN0cm9rZUV4KE9CSl9NRVRIT0RfUEFSQU1TKQp7CglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgoJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKCXsKCQlzRXJyb3IgPSBMIkFGRGF0ZV9LZXlzdHJva2VFeCdzIHBhcmFtZXRlcnMnIHNpemUgciBub3QgY29ycmVjdCI7CgkJcmV0dXJuIEZBTFNFOwoJfQkKCQoJaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKQoJewoJCWlmKCFwRXZlbnQtPm1fcFZhbHVlKQoJCQlyZXR1cm4gRkFMU0U7CgkJQ0ZYX1dpZGVTdHJpbmcgc3RyVmFsdWUgPSBwRXZlbnQtPlZhbHVlKCk7CgkJaWYgKHN0clZhbHVlLklzRW1wdHkoKSkgcmV0dXJuIFRSVUU7CgoJCUNGWF9XaWRlU3RyaW5nIHNGb3JtYXQgPSBwYXJhbXNbMF0ub3BlcmF0b3IgQ0ZYX1dpZGVTdHJpbmcoKTsKCgkJRlhfQk9PTCBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKCQlkb3VibGUgZFJldCA9IE1ha2VSZWd1bGFyRGF0ZShzdHJWYWx1ZSxzRm9ybWF0LGJXcm9uZ0Zvcm1hdCk7CgkJaWYgKGJXcm9uZ0Zvcm1hdCB8fCBKU19Qb3J0SXNOYW4oZFJldCkpCgkJewoJCQlDRlhfV2lkZVN0cmluZyBzd01zZzsKCQkJc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSU0VEQVRFKSwgc0Zvcm1hdC5jX3N0cigpKTsKCQkJQWxlcnQocENvbnRleHQsIHN3TXNnKTsKCQkJcEV2ZW50LT5SYygpID0gRkFMU0U7CgkJCXJldHVybiBUUlVFOwoJCX0KCX0KCXJldHVybiBUUlVFOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRkRhdGVfRm9ybWF0KE9CSl9NRVRIT0RfUEFSQU1TKQp7Cgl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CgoJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKCXsKCQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwoJCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoJaW50IGlJbmRleCA9IHBhcmFtc1swXTsKCUZYX0xQQ1dTVFIgY0Zvcm1hdHNbXSA9ICB7TCJtL2QiLCBMIm0vZC95eSIsIEwibW0vZGQveXkiLCBMIm1tL3l5IiwgTCJkLW1tbSIsIEwiZC1tbW0teXkiLCBMImRkLW1tbS15eSIsCgkJTCJ5eS1tbS1kZCIsIEwibW1tLXl5IiwgTCJtbW1tLXl5IiwgTCJtbW0gZCwgeXl5eSIsIEwibW1tbSBkLCB5eXl5IiwKCQlMIm0vZC95eSBoOk1NIHR0IiwgTCJtL2QveXkgSEg6TU0iIH07CgoJQVNTRVJUKGlJbmRleCA8IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpOwoKCWlmIChpSW5kZXggPCAwKQoJCWlJbmRleCA9IDA7CglpZiAoaUluZGV4ID49IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpCgkJaUluZGV4ID0gMDsKCUNKU19QYXJhbWV0ZXJzIG5ld1BhcmFtczsKCUNKU19WYWx1ZSB2YWwoaXNvbGF0ZSxjRm9ybWF0c1tpSW5kZXhdKTsKCW5ld1BhcmFtcy5wdXNoX2JhY2sodmFsKTsKCXJldHVybiBBRkRhdGVfRm9ybWF0RXgoY2MsbmV3UGFyYW1zLHZSZXQsc0Vycm9yKTsKfQoKLy9BRkRhdGVfS2V5c3Ryb2tlRXgoY0Zvcm1hdCkKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0tleXN0cm9rZShPQkpfTUVUSE9EX1BBUkFNUykKewoJdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwoKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCgl7CgkJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKCQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCWludCBpSW5kZXggPSBwYXJhbXNbMF07CglGWF9MUENXU1RSIGNGb3JtYXRzW10gPSAge0wibS9kIiwgTCJtL2QveXkiLCBMIm1tL2RkL3l5IiwgTCJtbS95eSIsIEwiZC1tbW0iLCBMImQtbW1tLXl5IiwgTCJkZC1tbW0teXkiLAoJCUwieXktbW0tZGQiLCBMIm1tbS15eSIsIEwibW1tbS15eSIsIEwibW1tIGQsIHl5eXkiLCBMIm1tbW0gZCwgeXl5eSIsCgkJTCJtL2QveXkgaDpNTSB0dCIsIEwibS9kL3l5IEhIOk1NIiB9OwoKCUFTU0VSVChpSW5kZXg8RlhfQXJyYXlTaXplKGNGb3JtYXRzKSk7CgoJaWYgKGlJbmRleCA8IDApCgkJaUluZGV4ID0gMDsKCWlmIChpSW5kZXggPj0gRlhfQXJyYXlTaXplKGNGb3JtYXRzKSkKCQlpSW5kZXggPSAwOwoJQ0pTX1BhcmFtZXRlcnMgbmV3UGFyYW1zOwoJQ0pTX1ZhbHVlIHZhbChpc29sYXRlLGNGb3JtYXRzW2lJbmRleF0pOwoJbmV3UGFyYW1zLnB1c2hfYmFjayh2YWwpOwoJcmV0dXJuIEFGRGF0ZV9LZXlzdHJva2VFeChjYyxuZXdQYXJhbXMsdlJldCxzRXJyb3IpOwp9CgovL2Z1bmN0aW9uIEFGVGltZV9Gb3JtYXQocHRmKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlRpbWVfRm9ybWF0KE9CSl9NRVRIT0RfUEFSQU1TKQp7Cgl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CgoJaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKCXsKCQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwoJCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwoJCXJldHVybiBGQUxTRTsKCX0KCglpbnQgaUluZGV4ID0gcGFyYW1zWzBdOwoJRlhfTFBDV1NUUiBjRm9ybWF0c1tdID0ge0wiSEg6TU0iLCBMImg6TU0gdHQiLCBMIkhIOk1NOnNzIiwgTCJoOk1NOnNzIHR0In07CgoJQVNTRVJUKGlJbmRleDxGWF9BcnJheVNpemUoY0Zvcm1hdHMpKTsKCglpZiAoaUluZGV4IDwgMCkKCQlpSW5kZXggPSAwOwoJaWYgKGlJbmRleCA+PSBGWF9BcnJheVNpemUoY0Zvcm1hdHMpKQoJCWlJbmRleCA9IDA7CglDSlNfUGFyYW1ldGVycyBuZXdQYXJhbXM7CglDSlNfVmFsdWUgdmFsKGlzb2xhdGUsY0Zvcm1hdHNbaUluZGV4XSk7CgluZXdQYXJhbXMucHVzaF9iYWNrKHZhbCk7CglyZXR1cm4gQUZEYXRlX0Zvcm1hdEV4KGNjLG5ld1BhcmFtcyx2UmV0LHNFcnJvcik7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9LZXlzdHJva2UoT0JKX01FVEhPRF9QQVJBTVMpCnsKCXY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCgl7CgkJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKCQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoJaW50IGlJbmRleCA9IHBhcmFtc1swXTsKCUZYX0xQQ1dTVFIgY0Zvcm1hdHNbXSA9IHtMIkhIOk1NIiwgTCJoOk1NIHR0IiwgTCJISDpNTTpzcyIsIEwiaDpNTTpzcyB0dCJ9OwoKCUFTU0VSVChpSW5kZXg8RlhfQXJyYXlTaXplKGNGb3JtYXRzKSk7CgoJaWYgKGlJbmRleCA8IDApCgkJaUluZGV4ID0gMDsKCWlmIChpSW5kZXggPj0gRlhfQXJyYXlTaXplKGNGb3JtYXRzKSkKCQlpSW5kZXggPSAwOwoJQ0pTX1BhcmFtZXRlcnMgbmV3UGFyYW1zOwoJQ0pTX1ZhbHVlIHZhbChpc29sYXRlLGNGb3JtYXRzW2lJbmRleF0pOwoJbmV3UGFyYW1zLnB1c2hfYmFjayh2YWwpOwoJcmV0dXJuIEFGRGF0ZV9LZXlzdHJva2VFeChjYyxuZXdQYXJhbXMsdlJldCxzRXJyb3IpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlRpbWVfRm9ybWF0RXgoT0JKX01FVEhPRF9QQVJBTVMpCnsKCXJldHVybiBBRkRhdGVfRm9ybWF0RXgoY2MscGFyYW1zLHZSZXQsc0Vycm9yKTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0tleXN0cm9rZUV4KE9CSl9NRVRIT0RfUEFSQU1TKQp7CglyZXR1cm4gQUZEYXRlX0tleXN0cm9rZUV4KGNjLHBhcmFtcyx2UmV0LHNFcnJvcik7Cn0KCi8vZnVuY3Rpb24gQUZTcGVjaWFsX0Zvcm1hdChwc2YpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU3BlY2lhbF9Gb3JtYXQoT0JKX01FVEhPRF9QQVJBTVMpCnsKCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCgl7CgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoJc3RkOjpzdHJpbmcgY0Zvcm1hdDsKCWludCBpSW5kZXggPSBwYXJhbXNbMF07CgoJQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwoJQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKCglpZighcEV2ZW50LT5tX3BWYWx1ZSkKCQlyZXR1cm4gRkFMU0U7CglDRlhfV2lkZVN0cmluZyYgVmFsdWUgPSBwRXZlbnQtPlZhbHVlKCk7CQoJc3RkOjpzdHJpbmcgc3RyU3JjID0gKEZYX0xQQ1NUUilDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVmFsdWUpOwoJCglzd2l0Y2ggKGlJbmRleCkgCgl7CgljYXNlIDA6ICAgICAgICAgICAgICAgICAgICAgICAgIAoJCWNGb3JtYXQgPSAiOTk5OTkiOwoJCWJyZWFrOwoJY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAKCQljRm9ybWF0ID0gIjk5OTk5LTk5OTkiOwoJCWJyZWFrOwoJY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAKCQl7CgkJCXN0ZDo6c3RyaW5nIE51bWJlclN0cjsKCQkJdXRpbDo6cHJpbnR4KCI5OTk5OTk5OTk5Iiwgc3RyU3JjLE51bWJlclN0cik7IAoJCQlpZiAoTnVtYmVyU3RyLmxlbmd0aCgpID49IDEwICkKCQkJCWNGb3JtYXQgPSAiKDk5OSkgOTk5LTk5OTkiOwoJCQllbHNlIAoJCQkJY0Zvcm1hdCA9ICI5OTktOTk5OSI7CgkJCWJyZWFrOwoJCX0KCWNhc2UgMzoKCQljRm9ybWF0ID0gIjk5OS05OS05OTk5IjsKCQlicmVhazsKCX0KCQoJc3RkOjpzdHJpbmcgc3RyRGVzOwoJdXRpbDo6cHJpbnR4KGNGb3JtYXQsc3RyU3JjLHN0ckRlcyk7CglWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3RyRGVzLmNfc3RyKCkpOwoJcmV0dXJuIFRSVUU7Cn0KCgovL2Z1bmN0aW9uIEFGU3BlY2lhbF9LZXlzdHJva2VFeChtYXNrKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNwZWNpYWxfS2V5c3Ryb2tlRXgoT0JKX01FVEhPRF9QQVJBTVMpCnsKCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoJQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwoKCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgoJaWYgKHBhcmFtcy5zaXplKCkgPCAxKQoJewoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCWlmKCFwRXZlbnQtPm1fcFZhbHVlKQoJCXJldHVybiBGQUxTRTsKCUNGWF9XaWRlU3RyaW5nJiB2YWxFdmVudCA9IHBFdmVudC0+VmFsdWUoKTsKCglDRlhfV2lkZVN0cmluZyB3c3RyTWFzayA9IHBhcmFtc1swXS5vcGVyYXRvciBDRlhfV2lkZVN0cmluZygpOwoJaWYgKHdzdHJNYXNrLklzRW1wdHkoKSkgcmV0dXJuIFRSVUU7CgkKCXN0ZDo6d3N0cmluZyB3c3RyVmFsdWUodmFsRXZlbnQpOwoJCglpZiAocEV2ZW50LT5XaWxsQ29tbWl0KCkpCgl7CgkJaWYgKHdzdHJWYWx1ZS5lbXB0eSgpKQoJCQlyZXR1cm4gVFJVRTsKCQlpbnQgaUluZGV4TWFzayA9IDA7CgkJZm9yIChzdGQ6OndzdHJpbmc6Oml0ZXJhdG9yIGl0ID0gd3N0clZhbHVlLmJlZ2luKCk7IGl0ICE9IHdzdHJWYWx1ZS5lbmQoKTsgaXQrKykKCQl7CgkJCXdjaGFyX3Qgd19WYWx1ZSA9ICppdDsKICAgICAgICAgICAgaWYgKCFtYXNrU2F0aXNmaWVkKHdfVmFsdWUsd3N0ck1hc2tbaUluZGV4TWFza10pKQoJCQkJYnJlYWs7CgkJCWlJbmRleE1hc2srKzsKCQl9CgoJCWlmIChpSW5kZXhNYXNrICE9IHdzdHJNYXNrLkdldExlbmd0aCgpIHx8IChpSW5kZXhNYXNrICE9IHdzdHJWYWx1ZS5zaXplKCkgJiYgd3N0ck1hc2suR2V0TGVuZ3RoKCkgIT0gMCkpCgkJewoJCQlBbGVydChwQ29udGV4dCwgSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNBRk5VTUJFUl9LRVlTVFJPS0UpKTsKCQkJcEV2ZW50LT5SYygpID0gRkFMU0U7CgkJfQoJCXJldHVybiBUUlVFOwoJfQoKCQoJQ0ZYX1dpZGVTdHJpbmcgJndpZGVDaGFuZ2UgPSBwRXZlbnQtPkNoYW5nZSgpOwoJc3RkOjp3c3RyaW5nIHdDaGFuZ2Uod2lkZUNoYW5nZSk7CgkKCWlmICh3Q2hhbmdlLmVtcHR5KCkpCgkJcmV0dXJuIFRSVUU7CiAgICBpbnQgaUluZGV4TWFzayA9IHBFdmVudC0+U2VsU3RhcnQoKTsKCS8vaUluZGV4TWFzaysrOwoJCgkKCWlmICh3c3RyVmFsdWUubGVuZ3RoKCkgLSAocEV2ZW50LT5TZWxFbmQoKS1wRXZlbnQtPlNlbFN0YXJ0KCkpICsgd0NoYW5nZS5sZW5ndGgoKSA+IChGWF9EV09SRCl3c3RyTWFzay5HZXRMZW5ndGgoKSkKCXsKCQlBbGVydChwQ29udGV4dCwgSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTV9UT09MT05HKSk7CgkJcEV2ZW50LT5SYygpID0gRkFMU0U7CgkJcmV0dXJuIFRSVUU7Cgl9CgkKCQoJaWYgKGlJbmRleE1hc2sgPj0gd3N0ck1hc2suR2V0TGVuZ3RoKCkgJiYgKCF3Q2hhbmdlLmVtcHR5KCkpKQoJewoJCUFsZXJ0KHBDb250ZXh0LCBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcpKTsKCQlwRXZlbnQtPlJjKCkgPSBGQUxTRTsKCQlyZXR1cm4gVFJVRTsKCX0KCQoJZm9yIChzdGQ6OndzdHJpbmc6Oml0ZXJhdG9yIGl0ID0gd0NoYW5nZS5iZWdpbigpOyBpdCAhPSB3Q2hhbmdlLmVuZCgpOyBpdCsrKQoJewoJCWlmIChpSW5kZXhNYXNrID49IHdzdHJNYXNrLkdldExlbmd0aCgpKQoJCXsKCQkJQWxlcnQocENvbnRleHQsIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1fVE9PTE9ORykpOwoJCQlwRXZlbnQtPlJjKCkgPSBGQUxTRTsKCQkJcmV0dXJuIFRSVUU7CgkJfQoJCXdjaGFyX3Qgd19NYXNrID0gd3N0ck1hc2tbaUluZGV4TWFza107CgkJaWYgKCFpc1Jlc2VydmVkTWFza0NoYXIod19NYXNrKSkKCQl7CgkJCS8vd0NoYW5nZS5pbnNlcnQoaXQsd19NYXNrKTsJCQkJCgkJCSppdCA9IHdfTWFzazsKCQl9CgkJd2NoYXJfdCB3X0NoYW5nZSA9ICppdDsKCQkKICAgICAgICBpZiAoIW1hc2tTYXRpc2ZpZWQod19DaGFuZ2Usd19NYXNrKSkKCQl7CgkJCXBFdmVudC0+UmMoKSA9IEZBTFNFOwoJCQlyZXR1cm4gVFJVRTsKCQl9CgkJaUluZGV4TWFzaysrOwoJfQoJCgl3aWRlQ2hhbmdlID0gd0NoYW5nZS5jX3N0cigpOwkKCQoJcmV0dXJuIFRSVUU7Cn0KCgovL2Z1bmN0aW9uIEFGU3BlY2lhbF9LZXlzdHJva2UocHNmKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNwZWNpYWxfS2V5c3Ryb2tlKE9CSl9NRVRIT0RfUEFSQU1TKQp7Cgl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CgoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CglBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CglDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CglBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCgl7CgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoJc3RkOjpzdHJpbmcgY0Zvcm1hdDsKCWludCBpSW5kZXggPSAoaW50KXBhcmFtc1swXTsJCgoJaWYoIXBFdmVudC0+bV9wVmFsdWUpCgkJcmV0dXJuIEZBTFNFOwoJLy9DSlNfVmFsdWUgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOwoJQ0ZYX1dpZGVTdHJpbmcmIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsKCXN0ZDo6c3RyaW5nIHN0clNyYyA9IChGWF9MUENTVFIpQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHZhbCk7CglzdGQ6OndzdHJpbmcgd3N0ckNoYW5nZShwRXZlbnQtPkNoYW5nZSgpKTsKCQoJc3dpdGNoIChpSW5kZXgpIAoJewoJY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAKCQljRm9ybWF0ID0gIjk5OTk5IjsKCQlicmVhazsKCWNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgCgkJLy9jRm9ybWF0ID0gIjk5OTk5LTk5OTkiOwoJCWNGb3JtYXQgPSAiOTk5OTk5OTk5IjsKCQlicmVhazsKCWNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgCgkJewoJCQlzdGQ6OnN0cmluZyBOdW1iZXJTdHI7CgkJCXV0aWw6OnByaW50eCgiOTk5OTk5OTk5OSIsIHN0clNyYyxOdW1iZXJTdHIpOyAKCQkJaWYgKHN0clNyYy5sZW5ndGgoKSArIHdzdHJDaGFuZ2UubGVuZ3RoKCkgPiA3ICkKCQkJCS8vY0Zvcm1hdCA9ICIoOTk5KSA5OTktOTk5OSI7CgkJCQljRm9ybWF0ID0gIjk5OTk5OTk5OTkiOwoJCQllbHNlIAoJCQkJLy9jRm9ybWF0ID0gIjk5OS05OTk5IjsKCQkJCWNGb3JtYXQgPSAiOTk5OTk5OSI7CgkJCWJyZWFrOwoJCX0KCWNhc2UgMzoKCQkvL2NGb3JtYXQgPSAiOTk5LTk5LTk5OTkiOwoJCWNGb3JtYXQgPSAiOTk5OTk5OTk5IjsKCQlicmVhazsKCX0KICAgIAoJQ0pTX1BhcmFtZXRlcnMgcGFyYW1zMjsKCUNKU19WYWx1ZSB2TWFzayhpc29sYXRlLCBjRm9ybWF0LmNfc3RyKCkpOwoJcGFyYW1zMi5wdXNoX2JhY2sodk1hc2spOwoJCiAgICByZXR1cm4gQUZTcGVjaWFsX0tleXN0cm9rZUV4KGNjLHBhcmFtczIsdlJldCxzRXJyb3IpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRk1lcmdlQ2hhbmdlKE9CSl9NRVRIT0RfUEFSQU1TKQp7CglDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudEhhbmRsZXIgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CglBU1NFUlQocEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKCglpZiAocGFyYW1zLnNpemUoKSAhPSAxKQoJewoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCUNGWF9XaWRlU3RyaW5nIHN3VmFsdWU7CglpZiAocEV2ZW50SGFuZGxlci0+bV9wVmFsdWUgIT0gTlVMTCkKCQlzd1ZhbHVlID0gcEV2ZW50SGFuZGxlci0+VmFsdWUoKTsKCglpZiAocEV2ZW50SGFuZGxlci0+V2lsbENvbW1pdCgpKQoJewoJCXZSZXQgPSBzd1ZhbHVlOwoJCXJldHVybiBUUlVFOwoJfQoKCUNGWF9XaWRlU3RyaW5nIHByZWZpeCxwb3N0Zml4OwoKCWlmIChwRXZlbnRIYW5kbGVyLT5TZWxTdGFydCgpID49IDApCgkJcHJlZml4ID0gc3dWYWx1ZS5NaWQoMCxwRXZlbnRIYW5kbGVyLT5TZWxTdGFydCgpKTsKCWVsc2UKCQlwcmVmaXggPSBMIiI7CgoKCWlmIChwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSA+PSAwICYmIHBFdmVudEhhbmRsZXItPlNlbEVuZCgpIDw9IHN3VmFsdWUuR2V0TGVuZ3RoKCkpCgkJcG9zdGZpeCA9IHN3VmFsdWUuTWlkKHBFdmVudEhhbmRsZXItPlNlbEVuZCgpLCBzd1ZhbHVlLkdldExlbmd0aCgpIC0gcEV2ZW50SGFuZGxlci0+U2VsRW5kKCkpOwoJZWxzZSBwb3N0Zml4ID0gTCIiOwoKCXZSZXQgPSBwcmVmaXggKyBwRXZlbnRIYW5kbGVyLT5DaGFuZ2UoKSArIHBvc3RmaXg7CgoJcmV0dXJuIFRSVUU7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGUGFyc2VEYXRlRXgoT0JKX01FVEhPRF9QQVJBTVMpCnsKCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDIpCgl7CgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgoJQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlID0gcGFyYW1zWzBdLm9wZXJhdG9yIENGWF9XaWRlU3RyaW5nKCk7CglDRlhfV2lkZVN0cmluZyBzRm9ybWF0ID0gcGFyYW1zWzFdLm9wZXJhdG9yIENGWF9XaWRlU3RyaW5nKCk7CgoJRlhfQk9PTCBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKCWRvdWJsZSBkRGF0ZSA9IE1ha2VSZWd1bGFyRGF0ZShzVmFsdWUsc0Zvcm1hdCxiV3JvbmdGb3JtYXQpOwoKCWlmIChKU19Qb3J0SXNOYW4oZERhdGUpKQoJewoJCUNGWF9XaWRlU3RyaW5nIHN3TXNnOwoJCXN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUlNFREFURSksIHNGb3JtYXQuY19zdHIoKSk7CgkJQWxlcnQoKENKU19Db250ZXh0ICopY2MsIHN3TXNnKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CgkKCXZSZXQgPSBkRGF0ZTsKCglyZXR1cm4gVFJVRTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTaW1wbGUoT0JKX01FVEhPRF9QQVJBTVMpCnsKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDMpCgl7CgkJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CgkJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwoJCXJldHVybiBGQUxTRTsKCX0KCgl2UmV0ID0gKGRvdWJsZSlBRl9TaW1wbGUocGFyYW1zWzBdLm9wZXJhdG9yIENGWF9XaWRlU3RyaW5nKCksIChkb3VibGUpcGFyYW1zWzFdLCAoZG91YmxlKXBhcmFtc1syXSk7CglyZXR1cm4gVFJVRTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZNYWtlTnVtYmVyKE9CSl9NRVRIT0RfUEFSQU1TKQp7CglpZiAocGFyYW1zLnNpemUoKSAhPSAxKQoJewoJCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwoJCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCgkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKCQlyZXR1cm4gRkFMU0U7Cgl9CiAgICB2UmV0ID0gUGFyc2VTdHJpbmdUb051bWJlcihwYXJhbXNbMF0ub3BlcmF0b3IgQ0ZYX1dpZGVTdHJpbmcoKSk7CglyZXR1cm4gVFJVRTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTaW1wbGVfQ2FsY3VsYXRlKE9CSl9NRVRIT0RfUEFSQU1TKQp7Cgl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CgoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CglBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgoJaWYgKHBhcmFtcy5zaXplKCkgIT0gMikKCXsKCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwoJCXJldHVybiBGQUxTRTsKCX0KCglDSlNfVmFsdWUgcGFyYW1zMSA9IHBhcmFtc1sxXTsKCglpZiAoIXBhcmFtczEuSXNBcnJheU9iamVjdCgpICYmIHBhcmFtczEuR2V0VHlwZSgpICE9IFZUX3N0cmluZykKCXsKCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwoJCXJldHVybiBGQUxTRTsKCX0KCQoJQ1BERlNES19Eb2N1bWVudCogcFJlYWRlckRvYyA9IHBDb250ZXh0LT5HZXRSZWFkZXJEb2N1bWVudCgpOwogICAgQVNTRVJUKHBSZWFkZXJEb2MgIT0gTlVMTCk7CgoJQ1BERlNES19JbnRlckZvcm0qIHBSZWFkZXJJbnRlckZvcm0gPSBwUmVhZGVyRG9jLT5HZXRJbnRlckZvcm0oKTsKCUFTU0VSVChwUmVhZGVySW50ZXJGb3JtICE9IE5VTEwpOwoKCUNQREZfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcFJlYWRlckludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7CglBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKCglkb3VibGUgZFZhbHVlOwoJQ0ZYX1dpZGVTdHJpbmcgc0Z1bmN0aW9uID0gcGFyYW1zWzBdLm9wZXJhdG9yIENGWF9XaWRlU3RyaW5nKCk7CglpZiAod2NzY21wKHNGdW5jdGlvbiwgTCJQUkQiKSA9PSAwKQogICAgCWRWYWx1ZSA9IDEuMDsKCWVsc2UKCQlkVmFsdWUgPSAwLjA7CgoJQ0pTX0FycmF5IEZpZWxkTmFtZUFycmF5ID0gQUZfTWFrZUFycmF5RnJvbUxpc3QoaXNvbGF0ZSxwYXJhbXMxKTsKCglpbnQgbkZpZWxkc0NvdW50ID0gMDsKCglmb3IgKGludCBpPTAsaXN6PUZpZWxkTmFtZUFycmF5LkdldExlbmd0aCgpOyBpPGlzejsgaSsrKQoJewoJCUNKU19WYWx1ZSBqc1ZhbHVlKGlzb2xhdGUpOwoJCUZpZWxkTmFtZUFycmF5LkdldEVsZW1lbnQoaSxqc1ZhbHVlKTsKICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0ZpZWxkTmFtZSA9IGpzVmFsdWUub3BlcmF0b3IgQ0ZYX1dpZGVTdHJpbmcoKTsKCiAgICAgICAgZm9yIChpbnQgaj0wLGpzej1wSW50ZXJGb3JtLT5Db3VudEZpZWxkcyh3c0ZpZWxkTmFtZSk7IGo8anN6OyBqKyspCgkJewoJCQlpZiAoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBwSW50ZXJGb3JtLT5HZXRGaWVsZChqLCB3c0ZpZWxkTmFtZSkpCgkJCXsKCQkJCWRvdWJsZSBkVGVtcCA9IDAuMDsKCgkJCQlzd2l0Y2ggKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpKQoJCQkJewoJCQkJY2FzZSBGSUVMRFRZUEVfVEVYVEZJRUxEOgoJCQkJY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6CgkJCQkJewoJCQkJCQlkVGVtcCA9IFBhcnNlU3RyaW5nVG9OdW1iZXIocEZvcm1GaWVsZC0+R2V0VmFsdWUoKSk7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCWNhc2UgRklFTERUWVBFX1BVU0hCVVRUT046CgkJCQkJewoJCQkJCQlkVGVtcCA9IDAuMDsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJY2FzZSBGSUVMRFRZUEVfQ0hFQ0tCT1g6CgkJCQljYXNlIEZJRUxEVFlQRV9SQURJT0JVVFRPTjoKCQkJCQl7CgkJCQkJCWRUZW1wID0gMC4wOwoJCQkJCQlmb3IgKGludCBjPTAsY3N6PXBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgYzxjc3o7IGMrKykKCQkJCQkJewoJCQkJCQkJaWYgKENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woYykpCgkJCQkJCQl7CgkJCQkJCQkJaWYgKHBGb3JtQ3RybC0+SXNDaGVja2VkKCkpCgkJCQkJCQkJewoJCQkJCQkJCQlkVGVtcCArPSBQYXJzZVN0cmluZ1RvTnVtYmVyKHBGb3JtQ3RybC0+R2V0RXhwb3J0VmFsdWUoKSk7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCX0KCQkJCQkJCQllbHNlCgkJCQkJCQkJCWNvbnRpbnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCWNhc2UgRklFTERUWVBFX0xJU1RCT1g6CgkJCQkJewoJCQkJCQlkVGVtcCA9IDAuMDsKCQkJCQkJaWYgKHBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpID4gMSkKCQkJCQkJCWJyZWFrOwoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCWRUZW1wID0gUGFyc2VTdHJpbmdUb051bWJlcihwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQkJZGVmYXVsdDoKCQkJCQlicmVhazsKCQkJCX0KCgkJCQlpZiAoaSA9PSAwICYmIGogPT0gMCAmJiAod2NzY21wKHNGdW5jdGlvbixMIk1JTiIpID09IDAgfHwgd2NzY21wKHNGdW5jdGlvbiwgTCJNQVgiKSA9PSAwKSkKCQkJCQlkVmFsdWUgPSBkVGVtcDsKCgkJCQlkVmFsdWUgPSBBRl9TaW1wbGUoc0Z1bmN0aW9uLCBkVmFsdWUsIGRUZW1wKTsKCgkJCQluRmllbGRzQ291bnQrKzsKCQkJfQoJCX0KCX0KCglpZiAod2NzY21wKHNGdW5jdGlvbiwgTCJBVkciKSA9PSAwICYmIG5GaWVsZHNDb3VudCA+IDApCgkJZFZhbHVlIC89IG5GaWVsZHNDb3VudDsKCglkVmFsdWUgPSAoZG91YmxlKWZsb29yKGRWYWx1ZSAqIEZYU1lTX3BvdygoZG91YmxlKTEwLChkb3VibGUpNikgKyAwLjQ5KSAvIEZYU1lTX3BvdygoZG91YmxlKTEwLChkb3VibGUpNik7CglDSlNfVmFsdWUganNWYWx1ZShpc29sYXRlLGRWYWx1ZSk7CglpZigoQ0pTX0V2ZW50SGFuZGxlciopcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpLT5tX3BWYWx1ZSkKCQkoKENKU19FdmVudEhhbmRsZXIqKXBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKSktPlZhbHVlKCkgPSBqc1ZhbHVlOwoKCXJldHVybiBUUlVFOwp9CgovKiBUaGlzIGZ1bmN0aW9uIHZhbGlkYXRlcyB0aGUgY3VycmVudCBldmVudCB0byBlbnN1cmUgdGhhdCBpdHMgdmFsdWUgaXMgCioqIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLiAqLwoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZSYW5nZV9WYWxpZGF0ZShPQkpfTUVUSE9EX1BBUkFNUykKewoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CglBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CglDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CglBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoKCWlmIChwYXJhbXMuc2l6ZSgpICE9IDQpIAoJewoJCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CgkJcmV0dXJuIEZBTFNFOwoJfQoKCWlmKCFwRXZlbnQtPm1fcFZhbHVlKQoJCXJldHVybiBGQUxTRTsKCWlmIChwRXZlbnQtPlZhbHVlKCkuSXNFbXB0eSgpICkKCQlyZXR1cm4gVFJVRTsKCWRvdWJsZSBkRWVudFZhbHVlID0gYXRvZihDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocEV2ZW50LT5WYWx1ZSgpKSk7CglGWF9CT09MIGJHcmVhdGVyVGhhbiwgYkxlc3NUaGFuOwoJZG91YmxlICBkR3JlYXRlclRoYW4sIGRMZXNzVGhhbjsKICAgIGJHcmVhdGVyVGhhbiA9IChGWF9CT09MKXBhcmFtc1swXTsKCUNGWF9XaWRlU3RyaW5nIHN3TXNnOwoJZEdyZWF0ZXJUaGFuID0gKGRvdWJsZSlwYXJhbXNbMV07CgliTGVzc1RoYW4gPSAoRlhfQk9PTClwYXJhbXNbMl07CglkTGVzc1RoYW4gPSAoZG91YmxlKXBhcmFtc1szXTsKCglpZiAoYkdyZWF0ZXJUaGFuICYmIGJMZXNzVGhhbikKCXsKCQlpZiAoZEVlbnRWYWx1ZSA8IGRHcmVhdGVyVGhhbiB8fCBkRWVudFZhbHVlID4gZExlc3NUaGFuKQoJCQlzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSQU5HRTEpLChGWF9MUENXU1RSKXBhcmFtc1sxXS5vcGVyYXRvciBDRlhfV2lkZVN0cmluZygpLCAoRlhfTFBDV1NUUilwYXJhbXNbM10ub3BlcmF0b3IgQ0ZYX1dpZGVTdHJpbmcoKSk7Cgl9CgllbHNlIGlmIChiR3JlYXRlclRoYW4pCgl7CgkJaWYgKGRFZW50VmFsdWUgPCBkR3JlYXRlclRoYW4pCgkJCXN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1JBTkdFMiksIChGWF9MUENXU1RSKXBhcmFtc1sxXS5vcGVyYXRvciBDRlhfV2lkZVN0cmluZygpKTsKCX0KCWVsc2UgaWYgKGJMZXNzVGhhbikKCXsKCQlpZiAoZEVlbnRWYWx1ZSA+IGRMZXNzVGhhbikKCQkJc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkFOR0UzKSwgKEZYX0xQQ1dTVFIpcGFyYW1zWzNdLm9wZXJhdG9yIENGWF9XaWRlU3RyaW5nKCkpOwoJfQoKCWlmICghc3dNc2cuSXNFbXB0eSgpKQoJewoJCUFsZXJ0KHBDb250ZXh0LCBzd01zZyk7CgkJcEV2ZW50LT5SYygpID0gRkFMU0U7Cgl9CglyZXR1cm4gVFJVRTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZFeHRyYWN0TnVtcyhPQkpfTUVUSE9EX1BBUkFNUykKewoJdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwoJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCglpZiAocGFyYW1zLnNpemUoKSAhPSAxKSAKCXsKCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwoJCXJldHVybiBGQUxTRTsKCX0KCglDSlNfQXJyYXkgbnVtcyhpc29sYXRlKTsKCglDRlhfV2lkZVN0cmluZyBzdHIgPSBwYXJhbXNbMF0ub3BlcmF0b3IgQ0ZYX1dpZGVTdHJpbmcoKTsKCUNGWF9XaWRlU3RyaW5nIHNQYXJ0OwoKCWlmIChzdHIuR2V0QXQoMCkgPT0gTCcuJyB8fCBzdHIuR2V0QXQoMCkgPT0gTCcsJykKCQlzdHIgPSBMIjAiICsgc3RyOwoKCWludCBuSW5kZXggPSAwOwoJZm9yIChpbnQgaT0wLCBzej1zdHIuR2V0TGVuZ3RoKCk7IGk8c3o7IGkrKykKCXsKCQlGWF9XQ0hBUiB3YyA9IHN0ci5HZXRBdChpKTsKCQlpZiAoSXNEaWdpdCgod2NoYXJfdCl3YykpCgkJewoJCQlzUGFydCArPSB3YzsKCQl9CgkJZWxzZQoJCXsKCQkJaWYgKHNQYXJ0LkdldExlbmd0aCgpID4gMCkKCQkJewoJCQkJbnVtcy5TZXRFbGVtZW50KG5JbmRleCxDSlNfVmFsdWUoaXNvbGF0ZSxzUGFydC5jX3N0cigpKSk7CgkJCQlzUGFydCA9IEwiIjsKCQkJCW5JbmRleCArKzsKCQkJfQoJCX0KCX0KCglpZiAoc1BhcnQuR2V0TGVuZ3RoKCkgPiAwKQoJewoJCW51bXMuU2V0RWxlbWVudChuSW5kZXgsQ0pTX1ZhbHVlKGlzb2xhdGUsc1BhcnQuY19zdHIoKSkpOwkKCX0KCglpZiAobnVtcy5HZXRMZW5ndGgoKSA+IDApCgkJdlJldCA9IG51bXM7CgllbHNlCgkJdlJldC5TZXROdWxsKCk7CgoJcmV0dXJuIFRSVUU7Cn0K