Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgX19fXyAgICAgICAgICAgICAgICAgICAgICAgIF8gICAgICBfCi8vICAgICAvIF9fX3xfX19fIF8gICBfIF9fX18gICBfX19ffCB8X18gIHwgfAovLyAgICB8IHwgICAvIF9fX3wgfCB8IHwgIF8gIFwvIF9fX3wgIF8gIFx8IHwKLy8gICAgfCB8X19ffCB8ICB8IHxffCB8IHwgfCB8IHxfX198IHwgfCB8fF98Ci8vICAgICBcX19fX3xffCAgXF9fX19ffF98IHxffFxfX19ffF98IHxffChfKSBNZWRpYSBiZW5jaG1hcmtzCi8vCi8vCSCpIDIwMDYsIEludGVsIENvcnBvcmF0aW9uLCBsaWNlbnNlZCB1bmRlciBBcGFjaGUgMi4wIAovLwovLyAgZmlsZSA6IAovLyAgYXV0aG9ycyA6IFNjb3R0IEV0dGluZ2VyIC0gc2NvdHQubS5ldHRpbmdlckBpbnRlbC5jb20KLy8JCQkgIEplYW4tWXZlcyBCb3VndWV0IC0gamVhbi15dmVzLmJvdWd1ZXRAaW50ZWwuY29tCi8vCQkJICAKLy8gIGRlc2NyaXB0aW9uIDogQm9keSBnZW9tZXRyeSBkZXNjcmlwdGlvbgovLyAgbW9kaWZpZWQgOiAKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKI2lmIGRlZmluZWQoSEFWRV9DT05GSUdfSCkKIyBpbmNsdWRlICJjb25maWcuaCIKI2VuZGlmCgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSAiQm9keUdlb21ldHJ5LmgiCgojZGVmaW5lIERNYXRyaXhmIERNYXRyaXg8ZmxvYXQ+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy9NdWx0aXBsaWNhdGlvbiBieSBhIGRpYWdvbmFsIG1hdHJpeAppbmxpbmUgdm9pZCBTY2FsZShETWF0cml4ZiAmbSwgZmxvYXQgczEsIGZsb2F0IHMyLCBmbG9hdCBzMykKewltKDAsMCkgKj0gczE7ICBtKDEsMCkgKj0gczE7IG0oMiwwKSAqPSBzMTsKCW0oMCwxKSAqPSBzMjsgIG0oMSwxKSAqPSBzMjsgbSgyLDEpICo9IHMyOwoJbSgwLDIpICo9IHMzOyAgbSgxLDIpICo9IHMzOyBtKDIsMikgKj0gczM7Cn0KCi8vTWF0cml4IHByZS10cmFuc2xhdGlvbgppbmxpbmUgdm9pZCBQcmVUcmFuc2xhdGUoRE1hdHJpeGYgJm0sIGZsb2F0IHQxLCBmbG9hdCB0MiwgZmxvYXQgdDMpCnsKCW0oMCwzKSA9IG0oMCwwKSAqIHQxICsgbSgwLDEpICogdDIgKyBtKDAsMikgKiB0MyArIG0oMCwzKTsKCW0oMSwzKSA9IG0oMSwwKSAqIHQxICsgbSgxLDEpICogdDIgKyBtKDEsMikgKiB0MyArIG0oMSwzKTsKCW0oMiwzKSA9IG0oMiwwKSAqIHQxICsgbSgyLDEpICogdDIgKyBtKDIsMikgKiB0MyArIG0oMiwzKTsKfQoKLy9DcmVhdGUgdGhlIGdlb21ldHJpYyByZXByZXNlbnRhdGlvbiBvZiB0aGUga2luZW1hdGljIHRyZWUgbW9kZWwgZ2l2ZW4gYSBib2R5IHBvc2UgKGFuZ2xlcyBhbmQgdHJhbnNsYXRpb24pCnZvaWQgQm9keUdlb21ldHJ5OjpDb21wdXRlR2VvbWV0cnkoQm9keVBvc2UgJmFuZ2xlcywgQm9keVBhcmFtZXRlcnMgJnBhcmFtcykKewoJY29uc3QgRE1PcmRlciBBTkdMRV9ERUNPTVBPU0lUSU9OX09SREVSID0gWlhZOwoKCS8vY3JlYXRlIHRoZSB0b3JzbyBjb25pYyBjeWxpbmRlciBhbmQgdHJhbnNmb3JtCglETWF0cml4ZiBnbG9iYWxUcGVsdmlzKGFuZ2xlcygwKSwgYW5nbGVzKDEpLCBhbmdsZXMoMiksIEFOR0xFX0RFQ09NUE9TSVRJT05fT1JERVIpOwkJCQkJLy9jcmVhdGUgdG9yc28gdHJhbnNmb3JtIGdpdmVuIGV1bGVyIGFuZ2xlcyBhbmQgdHJhbnNsYXRpb24KCWdsb2JhbFRwZWx2aXMuU2V0VHJhbnNsYXRpb24oYW5nbGVzKDMpLCBhbmdsZXMoNCksIGFuZ2xlcyg1KSk7CgltQ3lsaW5kZXJzWzBdLlNldChwYXJhbXMubGltYnNbMF1bMF0sIHBhcmFtcy5saW1ic1swXVsxXSwgcGFyYW1zLmxlbmd0aHNbMF0pOwkJCQkJCS8vc2V0IHRoZSB0b3JzbyBjb25pYyBjeWxpbmRlciB2YWx1ZXMKCW1DeWxpbmRlcnNbMF0ucG9zZSA9IGdsb2JhbFRwZWx2aXM7CglTY2FsZShtQ3lsaW5kZXJzWzBdLnBvc2UsIHBhcmFtcy5saW1ic1swXVsyXSwgcGFyYW1zLmxpbWJzWzBdWzNdLCAxKTsJCQkJCQkJCS8vc2NhbGUgdHJhbnNmb3JtIGJ5IGxpbWIgcGFyYW1ldGVycwoKCS8vY3JlYXRlIGxlZnQgdGhpZ2ggdXNpbmcgZ2VvbWV0cmljIHRyYW5zZm9ybWF0aW9ucyBmcm9tIHRoZSB0b3JzbyBhbmQgbW9kZWwgcGFyYW1ldGVycwoJRE1hdHJpeGYgZ2xvYmFsVGxwZWx2aXMgPSAoZ2xvYmFsVHBlbHZpcyAqIERNYXRyaXhmKFlSb3QxODApKTsKCVByZVRyYW5zbGF0ZShnbG9iYWxUbHBlbHZpcywgMCwgcGFyYW1zLmxlbmd0aHNbMV0sIDApOwoJRE1hdHJpeGYgbHRoaWdoVGxwZWx2aXMoYW5nbGVzKDYpLCBhbmdsZXMoNyksIGFuZ2xlcyg4KSwgQU5HTEVfREVDT01QT1NJVElPTl9PUkRFUik7CglETWF0cml4ZiBnbG9iYWxUbHRoaWdoID0gZ2xvYmFsVGxwZWx2aXMgKiBJbnZlcnNlKGx0aGlnaFRscGVsdmlzKTsKCW1DeWxpbmRlcnNbMV0uU2V0KHBhcmFtcy5saW1ic1sxXVswXSwgcGFyYW1zLmxpbWJzWzFdWzFdLCBwYXJhbXMubGVuZ3Roc1syXSk7CgltQ3lsaW5kZXJzWzFdLnBvc2UgPSBnbG9iYWxUbHRoaWdoOwoJU2NhbGUobUN5bGluZGVyc1sxXS5wb3NlLCBwYXJhbXMubGltYnNbMV1bMl0sIHBhcmFtcy5saW1ic1sxXVszXSwgMSk7CgoJLy9jcmVhdGUgbGVmdCBsb3dlciBsZWcgY2FzY2FkaW5nIGZyb20gdGhlIGxlZnQgdGhpZ2ggdHJhbnNmb3JtIGFuZCBtb2RlbCBwYXJhbWV0ZXJzCglQcmVUcmFuc2xhdGUoZ2xvYmFsVGx0aGlnaCwgMCwgMCwgcGFyYW1zLmxlbmd0aHNbMl0pOwoJRE1hdHJpeGYgbHRpYmlhVGx0aGlnaCgwLCBhbmdsZXMoOSksIDAsIEFOR0xFX0RFQ09NUE9TSVRJT05fT1JERVIpOwoJRE1hdHJpeGYgZ2xvYmFsVGx0aWJpYSA9IGdsb2JhbFRsdGhpZ2ggKiBJbnZlcnNlKGx0aWJpYVRsdGhpZ2gpOwoJbUN5bGluZGVyc1syXS5TZXQocGFyYW1zLmxpbWJzWzJdWzBdLCBwYXJhbXMubGltYnNbMl1bMV0sIHBhcmFtcy5sZW5ndGhzWzNdKTsKCW1DeWxpbmRlcnNbMl0ucG9zZSA9IGdsb2JhbFRsdGliaWE7CglTY2FsZShtQ3lsaW5kZXJzWzJdLnBvc2UsIHBhcmFtcy5saW1ic1syXVsyXSwgcGFyYW1zLmxpbWJzWzJdWzNdLCAxKTsgCgoJLy9jcmVhdGUgcmlnaHQgdGhpZ2gKCURNYXRyaXhmIGdsb2JhbFRycGVsdmlzID0gKGdsb2JhbFRwZWx2aXMgKiBETWF0cml4ZihZUm90MTgwKSk7CglQcmVUcmFuc2xhdGUoZ2xvYmFsVHJwZWx2aXMsIDAsIC1wYXJhbXMubGVuZ3Roc1s1XSwgMCk7CglETWF0cml4ZiBydGhpZ2hUcnBlbHZpcyhhbmdsZXMoMTApLGFuZ2xlcygxMSksYW5nbGVzKDEyKSxBTkdMRV9ERUNPTVBPU0lUSU9OX09SREVSKTsKCURNYXRyaXhmIGdsb2JhbFRydGhpZ2ggPSBnbG9iYWxUcnBlbHZpcyAqIEludmVyc2UocnRoaWdoVHJwZWx2aXMpOwoJbUN5bGluZGVyc1szXS5TZXQocGFyYW1zLmxpbWJzWzNdWzBdLCBwYXJhbXMubGltYnNbM11bMV0sIHBhcmFtcy5sZW5ndGhzWzZdKTsKCW1DeWxpbmRlcnNbM10ucG9zZSA9IGdsb2JhbFRydGhpZ2g7CglTY2FsZShtQ3lsaW5kZXJzWzNdLnBvc2UsIHBhcmFtcy5saW1ic1szXVsyXSwgcGFyYW1zLmxpbWJzWzNdWzNdLCAxKTsKCgkvL2NyZWF0ZSBsZWZ0IGxvd2VyIGxlZwoJUHJlVHJhbnNsYXRlKGdsb2JhbFRydGhpZ2gsIDAsIDAsIHBhcmFtcy5sZW5ndGhzWzZdKTsKCURNYXRyaXhmIHJ0aWJpYVRydGhpZ2goMCwgYW5nbGVzKDEzKSwgMCwgQU5HTEVfREVDT01QT1NJVElPTl9PUkRFUik7CglETWF0cml4ZiBnbG9iYWxUcnRpYmlhID0gZ2xvYmFsVHJ0aGlnaCAqIEludmVyc2UocnRpYmlhVHJ0aGlnaCk7CgltQ3lsaW5kZXJzWzRdLlNldChwYXJhbXMubGltYnNbNF1bMF0sIHBhcmFtcy5saW1ic1s0XVsxXSwgcGFyYW1zLmxlbmd0aHNbN10pOwoJbUN5bGluZGVyc1s0XS5wb3NlID0gZ2xvYmFsVHJ0aWJpYTsKCVNjYWxlKG1DeWxpbmRlcnNbNF0ucG9zZSwgcGFyYW1zLmxpbWJzWzRdWzJdLCBwYXJhbXMubGltYnNbNF1bM10sIDEpOwoKCURNYXRyaXhmIHRob3JheFRwZWx2aXMoMCwgYW5nbGVzKDI2KSwgYW5nbGVzKDI3KSwgQU5HTEVfREVDT01QT1NJVElPTl9PUkRFUik7CglETWF0cml4ZiBnbG9iYWxUdGhvcmF4ID0gKGdsb2JhbFRwZWx2aXMgKiBETWF0cml4ZihYUm90MTgwKSkgKiAoSW52ZXJzZSh0aG9yYXhUcGVsdmlzKSk7CglQcmVUcmFuc2xhdGUoZ2xvYmFsVHRob3JheCwgMCwgMCwgLXBhcmFtcy5sZW5ndGhzWzBdKTsKCQoJLy9jcmVhdGUgbGVmdCB1cHBlciBhcm0KCURNYXRyaXhmIGxjbGF2aWNsZVRsdGhvcmF4KGFuZ2xlcygxNCksIGFuZ2xlcygxNSksIDAuMCwgQU5HTEVfREVDT01QT1NJVElPTl9PUkRFUik7CglETWF0cml4ZiBnbG9iYWxUbGNsYXZpY2xlID0gKGdsb2JhbFR0aG9yYXggKiBETWF0cml4ZihYUm90OTApKSAqIEludmVyc2UobGNsYXZpY2xlVGx0aG9yYXgpOwoJUHJlVHJhbnNsYXRlKGdsb2JhbFRsY2xhdmljbGUsIDAsIDAsIC1wYXJhbXMubGVuZ3Roc1s5XSk7CglETWF0cml4ZiBsc2hvdWxkZXJUbGNsYXZpY2xlKGFuZ2xlcygxNiksIGFuZ2xlcygxNyksIGFuZ2xlcygxOCksIEFOR0xFX0RFQ09NUE9TSVRJT05fT1JERVIpOwoJRE1hdHJpeGYgciA9IERNYXRyaXhmKFhSb3Q5MCkgKiBETWF0cml4ZihaUm90MTgwKSAqIERNYXRyaXhmKFlSb3Q5MCk7CglETWF0cml4ZiBnbG9iYWxUbHNob3VsZGVyID0gZ2xvYmFsVGxjbGF2aWNsZSAqIHIgKiBJbnZlcnNlKGxzaG91bGRlclRsY2xhdmljbGUpOwoJbUN5bGluZGVyc1s1XS5TZXQocGFyYW1zLmxpbWJzWzVdWzBdLCBwYXJhbXMubGltYnNbNV1bMV0sIC1wYXJhbXMubGVuZ3Roc1sxMF0pOwoJbUN5bGluZGVyc1s1XS5wb3NlID0gZ2xvYmFsVGxzaG91bGRlcjsKCVNjYWxlKG1DeWxpbmRlcnNbNV0ucG9zZSwgcGFyYW1zLmxpbWJzWzVdWzJdLCBwYXJhbXMubGltYnNbNV1bM10sIDEpOwoJCgkvL2NyZWF0ZSBsZWZ0IGxvd2VyIGFybQoJUHJlVHJhbnNsYXRlKGdsb2JhbFRsc2hvdWxkZXIsIDAsIDAsIC1wYXJhbXMubGVuZ3Roc1sxMF0pOwoJRE1hdHJpeGYgbGVsYm93VGxzaG91bGRlcigwLjAsIGFuZ2xlcygxOSksIDAuMCwgQU5HTEVfREVDT01QT1NJVElPTl9PUkRFUik7CglETWF0cml4ZiBnbG9iYWxUbGVsYm93ID0gZ2xvYmFsVGxzaG91bGRlciAqIEludmVyc2UobGVsYm93VGxzaG91bGRlcik7CgltQ3lsaW5kZXJzWzZdLlNldChwYXJhbXMubGltYnNbNl1bMF0sIHBhcmFtcy5saW1ic1s2XVsxXSwgLXBhcmFtcy5sZW5ndGhzWzExXSk7CgltQ3lsaW5kZXJzWzZdLnBvc2UgPSBnbG9iYWxUbGVsYm93OwoJU2NhbGUobUN5bGluZGVyc1s2XS5wb3NlLCBwYXJhbXMubGltYnNbNl1bMl0sIHBhcmFtcy5saW1ic1s2XVszXSwgMSk7CgkKCS8vY3JlYXRlIHJpZ2h0IHVwcGVyIGFybQoJRE1hdHJpeGYgcmNsYXZpY2xlVHJ0aG9yYXgoYW5nbGVzKDIwKSwgYW5nbGVzKDIxKSwgMC4wLCBBTkdMRV9ERUNPTVBPU0lUSU9OX09SREVSKTsKCURNYXRyaXhmIGdsb2JhbFRyY2xhdmljbGUgPSBnbG9iYWxUdGhvcmF4ICogRE1hdHJpeGYoWFJvdDI3MCkgKiBJbnZlcnNlKHJjbGF2aWNsZVRydGhvcmF4KTsKCVByZVRyYW5zbGF0ZShnbG9iYWxUcmNsYXZpY2xlLCAwLCAwLCAtcGFyYW1zLmxlbmd0aHNbMTNdKTsKCURNYXRyaXhmIHJzaG91bGRlclRyY2xhdmljbGUoYW5nbGVzKDIyKSxhbmdsZXMoMjMpLGFuZ2xlcygyNCksQU5HTEVfREVDT01QT1NJVElPTl9PUkRFUik7CglETWF0cml4ZiBnbG9iYWxUcnNob3VsZGVyID0gKGdsb2JhbFRyY2xhdmljbGUgKiByKSAqIEludmVyc2UocnNob3VsZGVyVHJjbGF2aWNsZSk7CgltQ3lsaW5kZXJzWzddLlNldChwYXJhbXMubGltYnNbN11bMF0sIHBhcmFtcy5saW1ic1s3XVsxXSwgLXBhcmFtcy5sZW5ndGhzWzE0XSk7CgltQ3lsaW5kZXJzWzddLnBvc2UgPSBnbG9iYWxUcnNob3VsZGVyOwoJU2NhbGUobUN5bGluZGVyc1s3XS5wb3NlLCBwYXJhbXMubGltYnNbN11bMl0sIHBhcmFtcy5saW1ic1s3XVszXSwgMSk7CgkKCS8vY3JlYXRlIHJpZ2h0IGxvd2VyIGFybQoJUHJlVHJhbnNsYXRlKGdsb2JhbFRyc2hvdWxkZXIsIDAsIDAsIC1wYXJhbXMubGVuZ3Roc1sxNF0pOwoJRE1hdHJpeGYgcmVsYm93VHJzaG91bGRlcigwLjAsIGFuZ2xlcygyNSksIDAuMCwgQU5HTEVfREVDT01QT1NJVElPTl9PUkRFUik7CglETWF0cml4ZiBnbG9iYWxUcmVsYm93ID0gZ2xvYmFsVHJzaG91bGRlciAqIEludmVyc2UocmVsYm93VHJzaG91bGRlcik7CgltQ3lsaW5kZXJzWzhdLlNldChwYXJhbXMubGltYnNbOF1bMF0sIHBhcmFtcy5saW1ic1s4XVsxXSwgLXBhcmFtcy5sZW5ndGhzWzE1XSk7CgltQ3lsaW5kZXJzWzhdLnBvc2UgPSBnbG9iYWxUcmVsYm93OwoJU2NhbGUobUN5bGluZGVyc1s4XS5wb3NlLCBwYXJhbXMubGltYnNbOF1bMl0sIHBhcmFtcy5saW1ic1s4XVszXSwgMSk7CgoJLy9jcmVhdGUgaGVhZAoJRE1hdHJpeGYgaGVhZFR0aG9yYXgoYW5nbGVzKDI4KSwgYW5nbGVzKDI5KSwgYW5nbGVzKDMwKSwgQU5HTEVfREVDT01QT1NJVElPTl9PUkRFUik7CglETWF0cml4ZiBnbG9iYWxUaGVhZCA9IChnbG9iYWxUdGhvcmF4ICogRE1hdHJpeGYoWFJvdDE4MCkpICogSW52ZXJzZShoZWFkVHRob3JheCk7CgltQ3lsaW5kZXJzWzldLlNldChwYXJhbXMubGltYnNbOV1bMF0sIHBhcmFtcy5saW1ic1s5XVsxXSwgcGFyYW1zLmxlbmd0aHNbMTddKTsKCW1DeWxpbmRlcnNbOV0ucG9zZSA9IGdsb2JhbFRoZWFkOwoJU2NhbGUobUN5bGluZGVyc1s5XS5wb3NlLCBwYXJhbXMubGltYnNbOV1bMl0sIHBhcmFtcy5saW1ic1s5XVszXSwgMSk7Cgp9CgovLyBMb2FkIHRoZSBib2R5IHNoYXBlIHBhcmFtZXRlcnMgZnJvbSBhIGZpbGUKYm9vbCBCb2R5UGFyYW1ldGVyczo6SW5pdEJvZHlQYXJhbWV0ZXJzKGNvbnN0IHN0cmluZyBmbmFtZSkKewkKCWlmc3RyZWFtIGYoZm5hbWUuY19zdHIoKSk7CglpZighZi5pc19vcGVuKCkpCgl7CWNvdXQgPDwgIlVuYWJsZSB0byBvcGVuIEJvZHkgUGFyYW1ldGVyIGZpbGUgOiAiIDw8IGZuYW1lIDw8IGVuZGw7CgkJcmV0dXJuIGZhbHNlOwoJfQoJZm9yKGludCBpID0gMDsgaSA8IE5fUEFSVFM7IGkrKykKCQlmb3IoaW50IGogPSAwOyBqIDwgNDsgaisrKQoJCQlmID4+IGxpbWJzW2ldW2pdOwoJZm9yKGludCBpID0gMDsgaSA8IE5fTEVOR1RIUzsgaSsrKQoJCWYgPj4gbGVuZ3Roc1tpXTsKCXJldHVybiB0cnVlOwp9CgovLyBDaGVja3MgaWYgMiBjeWxpbmRlcnMgaW50ZXJzZWN0LiBSZXR1cm5zIHRydWUgaWYgdGhleSBkby4KYm9vbCBCb2R5R2VvbWV0cnk6OkludGVyc2VjdGluZ0N5bGluZGVycyhLVEN5bGluZGVyICZjeWxBLCBLVEN5bGluZGVyICZjeWxCKQp7CglmbG9hdCBudW1QQTIgPSAoKGN5bEEubGVuZ3RoIC8gc3RkOjptYXgoY3lsQS5ib3R0b20sY3lsQS50b3ApKS8yLjAwZik7CglpbnQgbnVtUEEgPSAoaW50KSAoKG51bVBBMjwwLjAgPyAtbnVtUEEyIDogbnVtUEEyKSArIDAuNWYpOwoKCWZsb2F0IG51bVBCMiA9IChjeWxCLmxlbmd0aCAvIHN0ZDo6bWF4KGN5bEIuYm90dG9tLGN5bEIudG9wKSkvMi4wMGY7CglpbnQgbnVtUEIgPSAoaW50KSAoKG51bVBCMjwwLjAgPyAtbnVtUEIyIDogbnVtUEIyKSArIDAuNWYpOwoKCW51bVBCID0gc3RkOjptaW4obnVtUEIsIDIwKTsKCW51bVBBID0gc3RkOjptaW4obnVtUEEsIDIwKTsKCglWZWN0b3IzZiBvYkEoMC4wMGYsMC4wMGYsMC4wMGYpOwoJVmVjdG9yM2Ygb3RBKDAuMDBmLDAuMDBmLGN5bEEubGVuZ3RoKTsKCVZlY3RvcjNmIG9BWzJdOwoJb0FbMF0gPSBjeWxBLnBvc2UgKiBvYkE7CglvQVsxXSA9IGN5bEEucG9zZSAqIG90QTsKCglWZWN0b3IzZiBvYkIoMC4wMGYsMC4wMGYsMC4wMGYpOwoJVmVjdG9yM2Ygb3RCKDAuMDBmLDAuMDBmLGN5bEIubGVuZ3RoKTsKCVZlY3RvcjNmIG9CWzJdOwoJb0JbMF0gPSBjeWxCLnBvc2UgKiBvYkI7CglvQlsxXSA9IGN5bEIucG9zZSAqIG90QjsKCgkvL2FwcHJveGltYXRlIGZpcnN0IGNvbmljIGN5bGluZGVyIGFzIGEgc2VyaWVzIG9mIHNwaGVyZXMKCWZsb2F0IGRlbHRhUEEgPSAxLjAwZiAvIChmbG9hdCkgbnVtUEE7CglWZWN0b3IzZiBkMTIgPSBvQVsxXSAtIG9BWzBdOwoJbUNlbnRlcnNBLnJlc2l6ZShudW1QQSsxKTsKCW1SYWRpaUEucmVzaXplKG51bVBBKzEpOwoJZmxvYXQgYWxwaGE7CglmbG9hdCBkZWx0YV9yID0gY3lsQS50b3AgLSBjeWxBLmJvdHRvbTsKCWRvdWJsZSB2YWwgPSBkZWx0YV9yL2N5bEEubGVuZ3RoOwoJZmxvYXQgc2NhbGluZyA9IChmbG9hdClzcXJ0KDEuMDAgKyAodmFsKnZhbCkpOwoJZm9yKGludCBpPTA7aTw9bnVtUEE7aSsrKQoJewlhbHBoYSA9ICgoZmxvYXQpIGkpKmRlbHRhUEE7CgkJbUNlbnRlcnNBW2ldLlNldChvQVswXS54ICsgKGFscGhhICogZDEyLngpICwgb0FbMF0ueSArIChhbHBoYSAqIGQxMi55KSAsIG9BWzBdLnogKyAoYWxwaGEgKiBkMTIueikgKTsgLy8gPSBvQVswXSArIChhbHBoYSAqIGQxMik7CgkJbVJhZGlpQVtpXSA9IChjeWxBLmJvdHRvbSArIGFscGhhICogZGVsdGFfcikvc2NhbGluZzsKCX0KCgkvL2FwcHJveGltYXRlIHNlY29uZCBjb25pYyBjeWxpbmRlciBhcyBhIHNlcmllcyBvZiBzcGhlcmVzCglmbG9hdCBkZWx0YVBCID0gMS4wMGYgLyAoZmxvYXQpIG51bVBCOwoJZDEyID0gb0JbMV0gLSBvQlswXTsKCW1DZW50ZXJzQi5yZXNpemUobnVtUEIrMSk7CgltUmFkaWlCLnJlc2l6ZShudW1QQisxKTsKCWRlbHRhX3IgPSBjeWxCLnRvcCAtIGN5bEIuYm90dG9tOwoJdmFsID0gZGVsdGFfci9jeWxCLmxlbmd0aDsKCXNjYWxpbmcgPSAoZmxvYXQpc3FydCgxLjAwZiArICh2YWwqdmFsKSk7Cglmb3IoaW50IGk9MDtpPD1udW1QQjtpKyspCgl7CWFscGhhID0gKChmbG9hdCkgaSkqZGVsdGFQQjsKCQltQ2VudGVyc0JbaV0uU2V0KG9CWzBdLnggKyAoYWxwaGEgKiBkMTIueCkgLCBvQlswXS55ICsgKGFscGhhICogZDEyLnkpICwgb0JbMF0ueiArIChhbHBoYSAqIGQxMi56KSApOyAvLyA9IG9CWzBdICsgYWxwaGEgKiBkMTI7CgkJbVJhZGlpQltpXSA9IChjeWxCLmJvdHRvbSArIGFscGhhICogZGVsdGFfcikvc2NhbGluZzsKCX0KCgkvL2NoZWNrIGlmIGFueSBzcGhlcmVzIGludGVyc2VjdCBmcm9tIG9uZSBjeWxpbmRlciB0byB0aGUgb3RoZXIKCVZlY3RvcjNmIGRpZkM7CglmbG9hdCByQUI7CglmbG9hdCBucm1zcTsKCWZvcihpbnQgaT0wO2k8PW51bVBBO2krKykKCXsKCQlmb3IoaW50IGo9MDtqPD1udW1QQjtqKyspCgkJewoJCQlkaWZDLlNldChtQ2VudGVyc0FbaV0ueCAtIG1DZW50ZXJzQltqXS54ICwgbUNlbnRlcnNBW2ldLnkgLSBtQ2VudGVyc0Jbal0ueSAsIG1DZW50ZXJzQVtpXS56IC0gbUNlbnRlcnNCW2pdLnogKTsgLy8gID0gbUNlbnRlcnNBW2ldIC0gbUNlbnRlcnNCW2pdCgkJCW5ybXNxID0gKGRpZkMueCAqIGRpZkMueCkgKyAoZGlmQy55ICogZGlmQy55KSArIChkaWZDLnogKiBkaWZDLnopOwoJCQlyQUIgPSBtUmFkaWlBW2ldICsgbVJhZGlpQltqXTsKCQkJaWYgKHJBQipyQUI+IG5ybXNxKQoJCQkJcmV0dXJuIHRydWU7CgkJfQoJfQoJcmV0dXJuIGZhbHNlOwp9OwoKLy9DaGVjayB0aGF0IHRoZSBib2R5IGlzIHZhbGlkIGJ5IGNoZWNraW5nIHRoYXQgbm8gcGFpciBvZiBib2R5IHBhcnQgaW50ZXJzZWN0CmJvb2wgQm9keUdlb21ldHJ5OjpWYWxpZCgpCnsKCWlmKEludGVyc2VjdGluZ0N5bGluZGVycyhtQ3lsaW5kZXJzWzZdLG1DeWxpbmRlcnNbMF0pKSByZXR1cm4gZmFsc2U7CQkvL0NoZWNrIGxlZnQgbG93ZXIgYXJtIGFuZCB0b3JzbwoJaWYoSW50ZXJzZWN0aW5nQ3lsaW5kZXJzKG1DeWxpbmRlcnNbOF0sbUN5bGluZGVyc1swXSkpIHJldHVybiBmYWxzZTsJCS8vQ2hlY2sgcmlnaHQgbG93ZXIgYXJtIGFuZCB0b3JzbwoJaWYoSW50ZXJzZWN0aW5nQ3lsaW5kZXJzKG1DeWxpbmRlcnNbMl0sbUN5bGluZGVyc1s0XSkpIHJldHVybiBmYWxzZTsJCS8vQ2hlY2sgbGVmdCBsb3dlciBsZWcgYW5kIHJpZ2h0IGxvd2VyIGxlZwoJcmV0dXJuIHRydWU7Cn0K