NFT Token Detail

Token ID40
Contract0xFD248dCA94C2fA2F335b0c6f00e081F6095354FA
ODDS
Contract typeERC721
Metadata
Loading metadata from https://api.ycy.fashion/odds/image/40.png","animation_url": "data:text/html;charset=utf-8;base64,PGh0bWw+PGhlYWQ+PG1ldGEgY2hhcnNldD0ndXRmLTgnLz48c2NyaXB0PmxldCB0b2tlbkhhc2ggPSAnMHg1NmNmNGU3NjUyOWUwOTFiNzFhYWI0MmU2OWRkNDNiOGRiOGZhOGU1MzI4OGM2MTAxYTgyMDI4Njg1ZGZjMzI1JzsgbGV0IHRva2VuSWQgPSAzMTU5Ozwvc2NyaXB0PjwvaGVhZD48Ym9keT48ZGl2IGlkPSJjb250YWluZXIiPjxjYW52YXMgaWQ9ImNhbnZhcyIgaGVpZ2h0PSI2MDAiIHdpZHRoPSIxMDgwIj48L2NhbnZhcz48L2Rpdj48L2JvZHk+CjxzY3JpcHQ+CiAgY29uc3QgdmVydGV4U2hhZGVyID0gYAphdHRyaWJ1dGUgdmVjNCBwb3NpdGlvbjsKdm9pZCBtYWluKCkgewogICAgZ2xfUG9zaXRpb24gPSBwb3NpdGlvbjsKfWA7CiAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBgCnByZWNpc2lvbiBoaWdocCBmbG9hdDsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyAgQ29uc3RhbnRzICYgVW5pZm9ybXMKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgpjb25zdCBpbnQgV0lEVEggICAgICAgICAgICA9IDM2Owpjb25zdCBpbnQgSEVJR0hUICAgICAgICAgICA9IDIwOwpjb25zdCBpbnQgVE9SU09fV0lEVEggICAgICA9IDEyOwpjb25zdCBpbnQgVE9SU09fQ1VUICAgICAgICA9IDEyOwpjb25zdCBpbnQgU0xFRVZFX1dJRFRIX01BWCA9IDEyOwpjb25zdCBpbnQgU0xFRVZFX1dJRFRIX01JTiA9IDc7CmNvbnN0IGludCBTTEVFVkVfQ1VGRiAgICAgID0gNDsKY29uc3QgaW50IENPTExBUl9XSURUSCAgICAgPSA0OwoKLy8gQ29tbW9uCmNvbnN0IHZlYzQgQkxBQ0sgPSB2ZWM0KHZlYzMoMC4wKSwgMS4wKTsKdW5pZm9ybSBmbG9hdCB0aWxlU2l6ZTsKdW5pZm9ybSBib29sICBkcmF3RnJvbnRTaWRlOwoKLy8gVHlwZQp1bmlmb3JtIGZsb2F0IGlzU2xpbmt5Owp1bmlmb3JtIGZsb2F0IGlzRnV6enk7CnVuaWZvcm0gZmxvYXQgaXNCb2xkOwp1bmlmb3JtIGZsb2F0IGlzUmliYmVkOwp1bmlmb3JtIGZsb2F0IGlzUGlwZTsKdW5pZm9ybSBmbG9hdCBpc0h5cGVyUmFpbmJvdzsKCi8vIEh1ZXMKdW5pZm9ybSBmbG9hdCBmaWxsSHVlc1s4XTsKdW5pZm9ybSBmbG9hdCBzZWdtZW50SHVlc1syMF07CnVuaWZvcm0gZmxvYXQgcmliYmVkSHVlOwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vICBDb2xvciBjb252ZXJzaW9uIGFuZCBoZWxwZXIgZnVuY3Rpb25zCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKdmVjMyBoc3YycmdiKHZlYzMgYykgewogICAgdmVjNCBLID0gdmVjNCgxLjAsIDIuMCAvIDMuMCwgMS4wIC8gMy4wLCAzLjApOwogICAgdmVjMyBwID0gYWJzKGZyYWN0KGMueHh4ICsgSy54eXopICogNi4wIC0gSy53d3cpOwogICAgcmV0dXJuIGMueiAqIG1peChLLnh4eCwgY2xhbXAocCAtIEsueHh4LCAwLjAsIDEuMCksIGMueSk7Cn0KCnZlYzMgaHVlMnJnYihmbG9hdCBodWUpIHsKICAgIHZlYzMgcmdiID0gaHN2MnJnYih2ZWMzKGh1ZSAvIDI1NS4wLCAxLjAsIDEuMCkpOwogICAgcmV0dXJuIHJnYjsKfQoKdmVjNCBodWUycmdiYShmbG9hdCBodWUpIHsKICAgIHZlYzMgcmdiID0gaHN2MnJnYih2ZWMzKGh1ZSAvIDI1NS4wLCAxLjAsIDEuMCkpOwogICAgcmV0dXJuIHZlYzQocmdiLCAxLjApOwp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gIFRpbGUgUmVjdAovLyAgICAgICAgICAgICAgICAgICAgKHhmLCB5ZikKLy8gICAgICAgICAtLS0tLS0tLS0tLS0KLy8gICAgICAgIHwgICAgICAgICAgICB8Ci8vICAgICAgICB8ICAgICAgICAgICAgfAovLyAgICAgICAgfCAgICAgICAgICAgIHwKLy8gICAgICAgICAtLS0tLS0tLS0tLS0KLy8gICAgKHgwLCB5MCkKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgpmbG9hdCB0aWxlUmVjdChpbnQgeDAsIGludCB5MCwgaW50IHhmLCBpbnQgeWYpIHsKICAgIHZlYzIgIHBvcyA9IGdsX0ZyYWdDb29yZC54eTsKICAgIGZsb2F0IHJldCA9IDEuMDsKICAgIGZsb2F0IF94MCA9IGZsb2F0KHgwKSAqIHRpbGVTaXplOwogICAgZmxvYXQgX3kwID0gZmxvYXQoeTApICogdGlsZVNpemU7CiAgICBmbG9hdCBfeGYgPSBmbG9hdCh4ZikgKiB0aWxlU2l6ZTsKICAgIGZsb2F0IF95ZiA9IGZsb2F0KHlmKSAqIHRpbGVTaXplOwogICAgcmV0ICo9IHN0ZXAoX3gwLCBwb3MueCkgKiBzdGVwKHBvcy54LCBfeGYpOwogICAgcmV0ICo9IHN0ZXAoX3kwLCBwb3MueSkgKiBzdGVwKHBvcy55LCBfeWYpOwogICAgcmV0dXJuIHJldDsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vICAgVGlsZSAoMXgxIHJlY3RhbmdsZSkKLy8gICAgICAgICAgICAgICAoeDAgKyAxLCB5MCArIDEpCi8vICAgICAgICAgICAgWyBdCi8vICAgICh4MCwgeTApCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKZmxvYXQgdGlsZShpbnQgeDAsIGludCB5MCkgewogICAgcmV0dXJuIHRpbGVSZWN0KHgwLCB5MCwgeDAgKyAxLCB5MCArIDEpOwp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gIFRpbGUgU3Ryb2tlLCBpbiBmb2xsb3dpbmcgZGlyZWN0aW9uczoKLy8gICAgICAgICAgICAgICAgICAgICAgVVAoMCwgMSkKLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gICAgICBMRUZUX1VQKC0xLCAxKSAgIFwgIHwgIC8gICAgIFJJR0hUX1VQKDEsIDEpCi8vICAgICAgICAgICAgICAgICAgICAgICAgXCB8IC8KLy8gICAgICAgTEVGVCgtMSwgMCkgLS0tLS0tLS0tLS0tLSAgICBSSUdIVCgxLCAwKQovLyAgICAgICAgICAgICAgICAgICAgICAgIC8gfCBcCi8vICAgIExFRlRfRE9XTigtMSwtMSkgICAvICB8ICBcICAgUklHSFRfRE9XTigxLC0xKQovLyAgICAgICAgICAgICAgICAgICAgICAgICAgfAovLyAgICAgICAgICAgICAgICAgICAgRE9XTigwLC0xKQovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCmNvbnN0IHZlYzIgUklHSFQgICAgICA9IHZlYzIoIDEuMCwgIDAuMCk7CmNvbnN0IHZlYzIgUklHSFRfVVAgICA9IHZlYzIoIDEuMCwgIDEuMCk7CmNvbnN0IHZlYzIgVVAgICAgICAgICA9IHZlYzIoIDAuMCwgIDEuMCk7CmNvbnN0IHZlYzIgTEVGVF9VUCAgICA9IHZlYzIoLTEuMCwgIDEuMCk7CmNvbnN0IHZlYzIgTEVGVF9ET1dOICA9IHZlYzIoLTEuMCwgLTEuMCk7CmNvbnN0IHZlYzIgRE9XTiAgICAgICA9IHZlYzIoIDAuMCwgLTEuMCk7CmNvbnN0IHZlYzIgUklHSFRfRE9XTiA9IHZlYzIoIDEuMCwgLTEuMCk7CgpmbG9hdCB0aWxlU3Ryb2tlKGludCB4LCBpbnQgeSwgaW50IGwsIHZlYzIgZCwgaW50IHMpIHsKICAgIGZsb2F0IHJldCA9IDAuMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgV0lEVEg7IGkrKykgewogICAgICAgIGlmIChpICogcyA+PSBsKSBicmVhazsKICAgICAgICBpbnQgYSA9IHggKyBpbnQoZC54KSAqIGkgKiBzOwogICAgICAgIGludCBiID0geSArIGludChkLnkpICogaSAqIHM7CiAgICAgICAgcmV0ICs9IHRpbGUoYSwgYik7CiAgICB9CiAgICByZXR1cm4gcmV0Owp9CgpmbG9hdCB0aWxlU3Ryb2tlKGludCB4LCBpbnQgeSwgaW50IGwsIHZlYzIgZCkgewogICAgcmV0dXJuIHRpbGVTdHJva2UoeCwgeSwgbCwgZCwgMSk7Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBCb3JkZXIKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgpmbG9hdCBib3JkZXJUb3JzbygpIHsKICAgIGZsb2F0IHJldCA9IDAuMDsKICAgIGludCB4bCA9IFNMRUVWRV9XSURUSF9NQVg7CiAgICBpbnQgeHIgPSB4bCArIFRPUlNPX1dJRFRIOwogICAgaW50IHl0ID0gSEVJR0hUOwogICAgaW50IHlzID0gVE9SU09fQ1VUICsgMTsKICAgIHJldCArPSB0aWxlUmVjdCh4bCAgICAsIDAgICAgICwgeHIgICAgLCAgMSk7ICAgIC8vIGRyYXcgYm90dG9tCiAgICByZXQgKz0gdGlsZVJlY3QoeGwgICAgLCB5dCAtIDEsIHhyICAgICwgeXQpOyAgICAvLyBkcmF3IHRvcAogICAgcmV0ICs9IHRpbGVSZWN0KHhsIC0gMSwgMSAgICAgLCB4bCAgICAsIHlzKTsgICAgLy8gZHJhdyBsZWZ0IHNpZGUKICAgIHJldCArPSB0aWxlUmVjdCh4ciAgICAsIDEgICAgICwgeHIgKyAxLCB5cyk7ICAgIC8vIGRyYXcgcmlnaHQgc2lkZQogICAgcmV0dXJuIGZsb2F0KHJldCA+IDAuMCk7Cn0KCmZsb2F0IGJvcmRlckNvbGxhcigpIHsKICAgIGlmICghZHJhd0Zyb250U2lkZSkgcmV0dXJuIDAuMDsKICAgIGZsb2F0IHJldCA9IDAuMDsKICAgIGludCB4MCA9IFdJRFRIIC8gMiAtIDI7CiAgICBpbnQgeTAgPSBIRUlHSFQgLSAyOwogICAgcmV0ICs9IHRpbGUoeDAgLSAxLCB5MCk7CiAgICByZXQgKz0gdGlsZSh4MCArIENPTExBUl9XSURUSCwgeTApOwogICAgcmV0ICs9IHRpbGVSZWN0KHgwLCAgeTAgLSAxLCB4MCArIENPTExBUl9XSURUSCwgeTApOwogICAgcmV0dXJuIGZsb2F0KHJldCA+IDAuMCk7Cn0KCmZsb2F0IGJvcmRlclNsZWV2ZXMoKSB7CiAgICBmbG9hdCByZXQgPSAwLjA7CiAgICBpbnQgdG9wWSA9IEhFSUdIVCAtIFNMRUVWRV9XSURUSF9NQVg7CiAgICBpbnQgYm90dG9tWSA9IEhFSUdIVCAtIFNMRUVWRV9XSURUSF9NQVggLSBTTEVFVkVfQ1VGRjsKICAgIGludCBjdWZmWSA9IEhFSUdIVCAtIFNMRUVWRV9XSURUSF9NQVggLSAxOwogICAgcmV0ICs9IHRpbGVTdHJva2UoMCwgdG9wWSwgU0xFRVZFX1dJRFRIX01BWCwgUklHSFRfVVApOwogICAgcmV0ICs9IHRpbGVTdHJva2UoV0lEVEggLSBTTEVFVkVfV0lEVEhfTUFYLCBIRUlHSFQgLSAxLCBTTEVFVkVfV0lEVEhfTUFYLCBSSUdIVF9ET1dOKTsKICAgIHJldCArPSB0aWxlU3Ryb2tlKFNMRUVWRV9DVUZGLCBib3R0b21ZLCBTTEVFVkVfV0lEVEhfTUlOLCBSSUdIVF9VUCk7CiAgICByZXQgKz0gdGlsZVN0cm9rZShXSURUSCAtIFNMRUVWRV9DVUZGIC0gMSwgYm90dG9tWSwgU0xFRVZFX1dJRFRIX01JTiwgTEVGVF9VUCk7CiAgICByZXQgKz0gdGlsZVN0cm9rZSgwLCBjdWZmWSwgU0xFRVZFX0NVRkYsIFJJR0hUX0RPV04pOwogICAgcmV0ICs9IHRpbGVTdHJva2UoV0lEVEggLSAxLCBjdWZmWSwgU0xFRVZFX0NVRkYsIExFRlRfRE9XTik7CiAgICByZXR1cm4gZmxvYXQocmV0ID4gMC4wKTsKfQoKZmxvYXQgYm9yZGVyUGlwZVJpYnMoKSB7CiAgICBmbG9hdCByZXQgPSAwLjA7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgIGludCB4bW9kID0gaW50KG1vZChmbG9hdChpKSwgMi4pKTsKICAgICAgICBpbnQgeHQgPSB4bW9kICsgU0xFRVZFX1dJRFRIX01BWDsKICAgICAgICBpbnQgeXQgPSAzICsgaSAqIDQ7CiAgICAgICAgcmV0ICs9IHRpbGVTdHJva2UoeG1vZCArIFNMRUVWRV9XSURUSF9NQVgsIDMgKyBpICogNCwgVE9SU09fV0lEVEgsIFJJR0hULCAyKTsKICAgICAgICBpbnQgeGwgPSB4bW9kICsgKGkgKyAxKSAqIDI7CiAgICAgICAgaW50IHlsID0gKEhFSUdIVCAtIFNMRUVWRV9XSURUSF9NQVggKyAxKSAtIHhtb2QgKyBpICogMjsKICAgICAgICByZXQgKz0gdGlsZVN0cm9rZSh4bCwgeWwsIFNMRUVWRV9DVUZGLCBSSUdIVF9ET1dOLCAyKTsKICAgICAgICBpbnQgeHIgPSAoV0lEVEggLSAxKSAtIHhsOwogICAgICAgIGludCB5ciA9IHlsOwogICAgICAgIHJldCArPSB0aWxlU3Ryb2tlKHhyLCB5ciwgU0xFRVZFX0NVRkYsIExFRlRfRE9XTiwgMik7CiAgICB9CiAgICByZXR1cm4gaXNQaXBlICogZmxvYXQocmV0ID4gMC4wKTsKfQoKZmxvYXQgaXNCb3JkZXIoKSB7CiAgICByZXR1cm4gZmxvYXQoCiAgICAgICAgICBib3JkZXJUb3JzbygpCiAgICAgICAgKyBib3JkZXJDb2xsYXIoKQogICAgICAgICsgYm9yZGVyU2xlZXZlcygpCiAgICAgICAgKyBib3JkZXJQaXBlUmlicygpCiAgICAgICAgPiAwLjAKICAgICk7Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyAgIENvbG9yIGZpbGwgcGVyIHNlY3Rpb25zCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKZmxvYXQgZmlsbFRvcnNvVG9wKCkgewogICAgZmxvYXQgcmV0ID0gMC4wOwogICAgaW50IGggPSBpc0Z1enp5ID4gMC4wIHx8IGlzUmliYmVkID4gMC4wID8gMTIgOiA5OwogICAgaW50IHgwID0gU0xFRVZFX1dJRFRIX01BWDsKICAgIGludCB5MCA9IEhFSUdIVCAtIDEgLSBoOwogICAgaW50IHhmID0geDAgKyBUT1JTT19XSURUSDsKICAgIGludCB5ZiA9IEhFSUdIVCAtIDE7CiAgICByZXQgKz0gdGlsZVJlY3QoeDAsIHkwLCB4ZiwgeWYpOwogICAgcmV0dXJuIGZsb2F0KHJldCA+IDAuMCk7Cn0KCmZsb2F0IGZpbGxUb3Jzb0JvdHRvbSgpIHsKICAgIGZsb2F0IHJldCA9IDAuMDsKICAgIGludCBoID0gaXNGdXp6eSA+IDAuMCB8fCBpc1JpYmJlZCA+IDAuMCA/IDEyIDogOTsKICAgIGludCB4MCA9IFNMRUVWRV9XSURUSF9NQVg7CiAgICBpbnQgeTAgPSAxOwogICAgaW50IHhmID0geDAgKyBUT1JTT19XSURUSDsKICAgIGludCB5ZiA9IEhFSUdIVCAtIDEgLSBoOwogICAgcmV0ICs9IHRpbGVSZWN0KHgwLCB5MCwgeGYsIHlmKTsKICAgIHJldHVybiBmbG9hdChyZXQgPiAwLjApOwp9CgpmbG9hdCBmaWxsUmlnaHRTbGVldmVUb3AoKSB7CiAgICBmbG9hdCByZXQgPSAwLjA7CiAgICBpbnQgeDAgPSBTTEVFVkVfV0lEVEhfTUFYIC0gMTsKICAgIGludCB5MCA9IEhFSUdIVCAtIDE7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IDc7IGkrKykgewogICAgICBpbnQgeCA9IHgwIC0gaS82OwogICAgICBpbnQgeSA9IHkwIC0gaSAtIDEgLSBpLzY7CiAgICAgIGludCBsID0gU0xFRVZFX1dJRFRIX01BWCAvIDIgLSBpLzIgKyAxIC0gaS82OwogICAgICByZXQgKz0gdGlsZVN0cm9rZSh4LCB5LCBsLCBMRUZUX0RPV04pOwogICAgfQogICAgcmV0dXJuIGZsb2F0KHJldCA+IDAuMCk7Cn0KCmZsb2F0IGZpbGxSaWdodFNsZWV2ZUJvdHRvbSgpIHsKICAgIGZsb2F0IHJldCA9IDAuMDsKICAgIGludCB4MCA9IDE7CiAgICBpbnQgeTAgPSBIRUlHSFQgLSBTTEVFVkVfV0lEVEhfTUFYOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA3OyBpKyspIHsKICAgICAgaW50IHggPSB4MCArIGkgLyAyOwogICAgICBpbnQgeSA9IHkwIC0gKGkgKyAxKSAvIDI7CiAgICAgIHJldCArPSB0aWxlU3Ryb2tlKHgsIHksIDQsIFJJR0hUX1VQKTsKICAgIH0KICAgIHJldHVybiBmbG9hdChyZXQgPiAwLjApOwp9CgpmbG9hdCBmaWxsTGVmdFNsZWV2ZVRvcCgpIHsKICAgIGZsb2F0IHJldCA9IDAuMDsKICAgIGludCB4MCA9IFdJRFRIIC0gU0xFRVZFX1dJRFRIX01BWDsKICAgIGludCB5MCA9IEhFSUdIVCAtIDE7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IDc7IGkrKykgewogICAgICBpbnQgeCA9IHgwICsgaS82OwogICAgICBpbnQgeSA9IHkwIC0gaSAtIDEgLSBpLzY7CiAgICAgIGludCBsID0gU0xFRVZFX1dJRFRIX01BWCAvIDIgLSBpLzIgKyAxIC0gaS82OwogICAgICByZXQgKz0gdGlsZVN0cm9rZSh4LCB5LCBsLCBSSUdIVF9ET1dOKTsKICAgIH0KICAgIHJldHVybiBmbG9hdChyZXQgPiAwLjApOwp9CgpmbG9hdCBmaWxsTGVmdFNsZWV2ZUJvdHRvbSgpIHsKICAgIGZsb2F0IHJldCA9IDAuMDsKICAgIGludCB4MCA9IFdJRFRIIC0gMjsKICAgIGludCB5MCA9IEhFSUdIVCAtIFNMRUVWRV9XSURUSF9NQVg7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IDc7IGkrKykgewogICAgICBpbnQgeCA9IHgwIC0gaSAvIDI7CiAgICAgIGludCB5ID0geTAgLSAoaSArIDEpIC8gMjsKICAgICAgcmV0ICs9IHRpbGVTdHJva2UoeCwgeSwgNCwgTEVGVF9VUCk7CiAgICB9CiAgICByZXR1cm4gZmxvYXQocmV0ID4gMC4wKTsKfQoKZmxvYXQgaXNGaWxsKCkgewogICAgcmV0dXJuIGZsb2F0KAogICAgICAgICggZmlsbFRvcnNvVG9wKCkKICAgICAgICArIGZpbGxUb3Jzb0JvdHRvbSgpCiAgICAgICAgKyBmaWxsUmlnaHRTbGVldmVUb3AoKQogICAgICAgICsgZmlsbFJpZ2h0U2xlZXZlQm90dG9tKCkKICAgICAgICArIGZpbGxMZWZ0U2xlZXZlVG9wKCkKICAgICAgICArIGZpbGxMZWZ0U2xlZXZlQm90dG9tKCkgKSA+IDAuMAogICAgICApICogKDEuMCAtIGlzQm9yZGVyKCkpOwp9Cgp2ZWM0IGZpbGxDb2xvcigpIHsKICAgIHJldHVybiBpc0ZpbGwoKSAqICgxLjAgLSBpc0h5cGVyUmFpbmJvdykgKiAoMS4wIC0gaXNQaXBlKSAqICgKICAgICAgICAgICAgZmlsbExlZnRTbGVldmVCb3R0b20oKSAgKiAoZHJhd0Zyb250U2lkZSA/IGh1ZTJyZ2JhKGZpbGxIdWVzWzBdKSA6IGh1ZTJyZ2JhKGZpbGxIdWVzWzVdKSkgKwogICAgICAgICAgICBmaWxsTGVmdFNsZWV2ZVRvcCgpICAgICAqIChkcmF3RnJvbnRTaWRlID8gaHVlMnJnYmEoZmlsbEh1ZXNbMV0pIDogaHVlMnJnYmEoZmlsbEh1ZXNbNF0pKSArCiAgICAgICAgICAgIGZpbGxUb3Jzb1RvcCgpICAgICAgICAgICogKGRyYXdGcm9udFNpZGUgPyBodWUycmdiYShmaWxsSHVlc1syXSkgOiBodWUycmdiYShmaWxsSHVlc1s2XSkpICsKICAgICAgICAgICAgZmlsbFRvcnNvQm90dG9tKCkgICAgICAgKiAoZHJhd0Zyb250U2lkZSA/IGh1ZTJyZ2JhKGZpbGxIdWVzWzNdKSA6IGh1ZTJyZ2JhKGZpbGxIdWVzWzddKSkgKwogICAgICAgICAgICBmaWxsUmlnaHRTbGVldmVUb3AoKSAgICAqIChkcmF3RnJvbnRTaWRlID8gaHVlMnJnYmEoZmlsbEh1ZXNbNF0pIDogaHVlMnJnYmEoZmlsbEh1ZXNbMV0pKSArCiAgICAgICAgICAgIGZpbGxSaWdodFNsZWV2ZUJvdHRvbSgpICogKGRyYXdGcm9udFNpZGUgPyBodWUycmdiYShmaWxsSHVlc1s1XSkgOiBodWUycmdiYShmaWxsSHVlc1swXSkpCiAgICAgICAgKTsKfQoKdmVjNCBmaWxsSHlwZXJSYWluYm93KCkgewogICAgYm9vbCBpc1RvcnNvID0gKGZpbGxUb3Jzb1RvcCgpICsgZmlsbFRvcnNvQm90dG9tKCkpID4gMC4wOwogICAgZmxvYXQgaXNGaWxsZWQgPSBpc0h5cGVyUmFpbmJvdyAqICgxLjAgLSBpc1BpcGUpICogaXNGaWxsKCk7CiAgICBpZiAoaXNGaWxsZWQgPT0gMC4wKSB7CiAgICAgICAgcmV0dXJuIHZlYzQoMC4wKTsKICAgIH0KICAgIGlmIChpc1RvcnNvKSB7CiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBIRUlHSFQgLSAxOyBpKyspIHsKICAgICAgICAgICAgZmxvYXQgc2VjdGlvbiA9IHRpbGVSZWN0KFNMRUVWRV9XSURUSF9NQVgsIGksIFNMRUVWRV9XSURUSF9NQVggKyBUT1JTT19XSURUSCwgaSArIDEpOwogICAgICAgICAgICBpZiAoc2VjdGlvbiA+IDAuMCkgewogICAgICAgICAgICAgICAgZmxvYXQgaHVlID0gc2VnbWVudEh1ZXNbMjAgLSBpXTsKICAgICAgICAgICAgICAgIHZlYzQgY29sID0gaHVlMnJnYmEoaHVlKTsKICAgICAgICAgICAgICAgIHJldHVybiBjb2w7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGZsb2F0IGxlZnRTbGVldmUgPSBmaWxsTGVmdFNsZWV2ZVRvcCgpICsgZmlsbExlZnRTbGVldmVCb3R0b20oKTsKICAgICAgICBmbG9hdCByaWdodFNsZWV2ZSA9IGZpbGxSaWdodFNsZWV2ZVRvcCgpICsgZmlsbFJpZ2h0U2xlZXZlQm90dG9tKCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKICAgICAgICAgICAgaW50IHhNb2QgPSBpbnQobW9kKGZsb2F0KGkpLCAzLjApKSA+IDAgPyAwIDogMTsKICAgICAgICAgICAgaW50IHggPSBpICogMyAtIHhNb2QgLSBpICogMjsKICAgICAgICAgICAgaW50IHkgPSBIRUlHSFQgLSBTTEVFVkVfV0lEVEhfTUFYICsgeE1vZCArIGkgKiAyOwogICAgICAgICAgICBmbG9hdCBzaCA9IGZsb2F0KGkgPT0gNSk7CiAgICAgICAgICAgIGZsb2F0IHJldCA9IHJpZ2h0U2xlZXZlICogKAogICAgICAgICAgICAgICAgICB0aWxlU3Ryb2tlKHgsIHkgKyAwLCBTTEVFVkVfQ1VGRiArIDMsIFJJR0hUX0RPV04pCiAgICAgICAgICAgICAgICArIHRpbGVTdHJva2UoeCwgeSArIDEsIFNMRUVWRV9DVUZGICsgMywgUklHSFRfRE9XTikKICAgICAgICAgICAgICAgICsgdGlsZVN0cm9rZSh4LCB5ICsgMiwgU0xFRVZFX0NVRkYgKyA0LCBSSUdIVF9ET1dOKQogICAgICAgICAgICAgICAgKyBzaCAqIHRpbGVSZWN0KFNMRUVWRV9XSURUSF9NQVggLSAyLCBIRUlHSFQgLSA1LCBTTEVFVkVfV0lEVEhfTUFYLCBIRUlHSFQgLSAxKQogICAgICAgICAgICApCiAgICAgICAgICAgICsgbGVmdFNsZWV2ZSAqICgKICAgICAgICAgICAgICAgICAgdGlsZVN0cm9rZShXSURUSCAtIHggLSAxLCB5ICsgMCwgU0xFRVZFX0NVRkYgKyAzLCBMRUZUX0RPV04pCiAgICAgICAgICAgICAgICArIHRpbGVTdHJva2UoV0lEVEggLSB4IC0gMSwgeSArIDEsIFNMRUVWRV9DVUZGICsgMywgTEVGVF9ET1dOKQogICAgICAgICAgICAgICAgKyB0aWxlU3Ryb2tlKFdJRFRIIC0geCAtIDEsIHkgKyAyLCBTTEVFVkVfQ1VGRiArIDQsIExFRlRfRE9XTikKICAgICAgICAgICAgICAgICsgc2ggKiB0aWxlUmVjdChXSURUSCAtIFNMRUVWRV9XSURUSF9NQVgsIEhFSUdIVCAtIDUsIFdJRFRIIC0gU0xFRVZFX1dJRFRIX01BWCArIDIsIEhFSUdIVCAtIDEpCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmIChyZXQgPiAwLjApIHsKICAgICAgICAgICAgICAgIHZlYzQgY29sID0gaHVlMnJnYmEoc2VnbWVudEh1ZXNbaV0pOwogICAgICAgICAgICAgICAgcmV0dXJuIGNvbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiB2ZWM0KDAuMCk7Cn0KCnZlYzQgbWl4UGlwZUNvbG9yKGZsb2F0IGh1ZTEsIGZsb2F0IGh1ZTIpIHsKICAgIHZlYzQgbWl4Q29sb3IgPSBtaXgoaHVlMnJnYmEoaHVlMSksIGh1ZTJyZ2JhKGh1ZTIpLCAwLjUpOwogICAgcmV0dXJuIG1peChtaXhDb2xvciwgQkxBQ0ssIDAuNSk7Cn0KCgpmbG9hdCBmaWxsUGlwZVNsZWV2ZShmbG9hdCBzbGVldmUsIGludCB4LCBpbnQgeSwgdmVjMiBkaXJlY3Rpb24pIHsKICAgIHJldHVybiBzbGVldmUgKiAoCiAgICAgICAgdGlsZVN0cm9rZSh4ICAgICAgICAgICAgICAgICAgICwgeSAgICAsIFNMRUVWRV9DVUZGLCBkaXJlY3Rpb24pICsKICAgICAgICB0aWxlU3Ryb2tlKHggICAgICAgICAgICAgICAgICAgLCB5ICsgMSwgU0xFRVZFX0NVRkYsIGRpcmVjdGlvbikgKwogICAgICAgIHRpbGVTdHJva2UoeCArIGludChkaXJlY3Rpb24ueCksIHkgKyAxLCBTTEVFVkVfQ1VGRiwgZGlyZWN0aW9uKQogICAgKTsKfQoKZmxvYXQgZmlsbExlZnRQaXBlU2hvdWxkZXIoKSB7CiAgICByZXR1cm4gZmxvYXQoCiAgICAgICggdGlsZShXSURUSCAtIFNMRUVWRV9XSURUSF9NQVggKyAxLCBIRUlHSFQgLSAzKSArCiAgICAgICAgdGlsZVJlY3QoV0lEVEggLSBTTEVFVkVfV0lEVEhfTUFYLCBIRUlHSFQgLSA0LCBXSURUSCAtIFNMRUVWRV9XSURUSF9NQVggKyAxLCBIRUlHSFQgLSAxKSApCiAgICA+IDAuMCk7Cn0KCmZsb2F0IGZpbGxSaWdodFBpcGVTaG91bGRlcigpIHsKICAgIHJldHVybiBmbG9hdCgKICAgICAgKCB0aWxlKFNMRUVWRV9XSURUSF9NQVggLSAyLCBIRUlHSFQgLSAzKSArCiAgICAgICAgdGlsZVJlY3QoU0xFRVZFX1dJRFRIX01BWCAtIDEsIEhFSUdIVCAtIDQsIFNMRUVWRV9XSURUSF9NQVgsIEhFSUdIVCAtIDEpICkKICAgID4gMC4wKTsKfQoKdmVjNCBmaWxsUGlwZSgpIHsKICAgIGZsb2F0IGlzRmlsbGVkID0gaXNQaXBlICogaXNGaWxsKCk7CiAgICBpbnQgeV9zbGVldmVfc3RhcnQgPSBIRUlHSFQgLSBTTEVFVkVfV0lEVEhfTUFYIC0gMTsKICAgIHZlYzQgY29sID0gdmVjNCgwLjApOwogICAgZmxvYXQgbGVmdCAgPSBpc0ZpbGxlZCAqIChmaWxsTGVmdFNsZWV2ZVRvcCgpICArIGZpbGxMZWZ0U2xlZXZlQm90dG9tKCkpOwogICAgZmxvYXQgcmlnaHQgPSBpc0ZpbGxlZCAqIChmaWxsUmlnaHRTbGVldmVUb3AoKSArIGZpbGxSaWdodFNsZWV2ZUJvdHRvbSgpKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7CiAgICAgICAgaW50IHggPSAxICsgaSAqIDI7CiAgICAgICAgaW50IHkgPSBIRUlHSFQgLSBTTEVFVkVfV0lEVEhfTUFYIC0gMSArIGkgKiAyOwogICAgICAgIGZsb2F0IHNob3VsZGVyID0gZmxvYXQoaSA9PSA0KTsKICAgICAgICBmbG9hdCByaWdodFNlY3Rpb24gPSBmaWxsUGlwZVNsZWV2ZShyaWdodCwgeCwgeSwgUklHSFRfRE9XTikgKyBzaG91bGRlciAqIGZpbGxSaWdodFBpcGVTaG91bGRlcigpOwogICAgICAgIGlmIChyaWdodFNlY3Rpb24gPiAwLjApIHsKICAgICAgICAgICAgZmxvYXQgaHVlMSA9IGRyYXdGcm9udFNpZGUgPyBzZWdtZW50SHVlc1s4ICsgaV0gICAgIDogc2VnbWVudEh1ZXNbMjAgLSBpXTsKICAgICAgICAgICAgZmxvYXQgaHVlMiA9IGRyYXdGcm9udFNpZGUgPyBzZWdtZW50SHVlc1s4ICsgaSAtIDFdIDogc2VnbWVudEh1ZXNbMjAgLSBpIC0gMV07CiAgICAgICAgICAgIHJldHVybiBtaXhQaXBlQ29sb3IoaHVlMSwgaHVlMik7CiAgICAgICAgfQogICAgICAgIHggPSBXSURUSCAtIDIgLSBpICogMjsKICAgICAgICBmbG9hdCBsZWZ0U2VjdGlvbiA9IGZpbGxQaXBlU2xlZXZlKGxlZnQsIHgsIHksIExFRlRfRE9XTikgKyBzaG91bGRlciAqIGZpbGxMZWZ0UGlwZVNob3VsZGVyKCk7CiAgICAgICAgaWYgKGxlZnRTZWN0aW9uID4gMC4wKSB7CiAgICAgICAgICAgIGZsb2F0IGh1ZTEgPSBkcmF3RnJvbnRTaWRlID8gc2VnbWVudEh1ZXNbMjAgLSBpXSAgICAgOiBzZWdtZW50SHVlc1s4ICsgaV07CiAgICAgICAgICAgIGZsb2F0IGh1ZTIgPSBkcmF3RnJvbnRTaWRlID8gc2VnbWVudEh1ZXNbMjAgLSBpIC0gMV0gOiBzZWdtZW50SHVlc1s4ICsgaSAtIDFdOwogICAgICAgICAgICByZXR1cm4gbWl4UGlwZUNvbG9yKGh1ZTEsIGh1ZTIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHNob3VsZGVyIDwgMS4wKSB7CiAgICAgICAgICAgIGZsb2F0IGxlZnRSaWIgPSBpc0ZpbGxlZCAqIHRpbGVTdHJva2UoV0lEVEggLSAyIC0gaSAqIDIgLSAxLCB5ICsgMiwgU0xFRVZFX0NVRkYsIExFRlRfRE9XTik7CiAgICAgICAgICAgIGlmIChsZWZ0UmliID4gMC4wKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaHVlMnJnYmEoZHJhd0Zyb250U2lkZSA/IHNlZ21lbnRIdWVzWzIwIC0gMSAtIGldIDogc2VnbWVudEh1ZXNbOCArIGkgLSAxXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmxvYXQgcmlnaHRSaWIgPSBpc0ZpbGxlZCAqIHRpbGVTdHJva2UoaSAqIDIgKyAyLCB5ICsgMiwgU0xFRVZFX0NVRkYsIFJJR0hUX0RPV04pOwogICAgICAgICAgICBpZiAocmlnaHRSaWIgPiAwLjApIHsKICAgICAgICAgICAgICAgIHJldHVybiBodWUycmdiYShkcmF3RnJvbnRTaWRlID8gc2VnbWVudEh1ZXNbOCArIGldIDogc2VnbWVudEh1ZXNbMjAgLSBpIC0gMV0pOwogICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmb3IgKGludCBqID0gMTsgaiA8PSBIRUlHSFQgLSAxOyBqKyspIHsKICAgICAgICBmbG9hdCBzZWN0aW9uID0gaXNGaWxsZWQgKiB0aWxlUmVjdChTTEVFVkVfV0lEVEhfTUFYLCBqLCBTTEVFVkVfV0lEVEhfTUFYICsgVE9SU09fV0lEVEgsIGogKyAxKTsKICAgICAgICBpZiAoc2VjdGlvbiA+IDAuMCkgewogICAgICAgICAgICBib29sIGlzUmliID0gbW9kKGZsb2F0KGogKyAxKSwgNC4wKSA9PSAwLjA7CiAgICAgICAgICAgIGludCBvZmZzZXQgPSAoaiArIDEpIC8gNDsKICAgICAgICAgICAgZmxvYXQgaHVlMSA9IGRyYXdGcm9udFNpZGUgPyBzZWdtZW50SHVlc1sxNiAtIChqICsgMSkgLyA0XSA6IHNlZ21lbnRIdWVzWzQgKyAoaiArIDEpIC8gNF07CiAgICAgICAgICAgIGZsb2F0IGh1ZTIgPSBkcmF3RnJvbnRTaWRlID8gc2VnbWVudEh1ZXNbMTUgLSAoaiArIDEpIC8gNF0gOiBzZWdtZW50SHVlc1szICsgKGogKyAxKSAvIDRdOwogICAgICAgICAgICByZXR1cm4gaXNSaWIgPyBodWUycmdiYShodWUxKSA6IG1peFBpcGVDb2xvcihodWUxLCBodWUyKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gY29sOwp9CgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vICBQYXR0ZXJucwovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCmZsb2F0IGRvdHRlZFBhdHRlcm4odmVjMiBwb2ludCwgZmxvYXQgcmFkaXVzLCBmbG9hdCBjZWxsU2l6ZSkgewogICAgdmVjMiBvZmZzZXQgPSBtb2QocG9pbnQsIGNlbGxTaXplKTsKICAgIHJldHVybiBmbG9hdChvZmZzZXQueCA8IHJhZGl1cyAmJiBvZmZzZXQueSA8IHJhZGl1cyk7Cn0KCmZsb2F0IHNsaW5reVJpYnMoKSB7CiAgICBmbG9hdCByZXQgPSAwLjA7CiAgICBib29sIGlzVG9yc28gPSAoZmlsbFRvcnNvVG9wKCkgKyBmaWxsVG9yc29Cb3R0b20oKSkgPiAwLjA7CiAgICBpZiAoaXNUb3JzbykgewogICAgICAgIGZvciAoaW50IGkgPSA0OyBpIDwgSEVJR0hUIC0gMTsgaSArPSA0KSB7CiAgICAgICAgICAgIHJldCArPSB0aWxlUmVjdChTTEVFVkVfV0lEVEhfTUFYLCBpLCBTTEVFVkVfV0lEVEhfTUFYICsgVE9SU09fV0lEVEgsIGkgKyAxKTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGJvb2wgcmlnaHRTbGVldmUgPSAoZmlsbFJpZ2h0U2xlZXZlVG9wKCkgKyBmaWxsUmlnaHRTbGVldmVCb3R0b20oKSkgPiAwLjA7CiAgICAgICAgaWYgKGlzSHlwZXJSYWluYm93ID4gMC4wKSB7CiAgICAgICAgICAgIGZsb2F0IHJhaW5ib3dSaWJzID0gMC4wOwogICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDQ7IGkrKykgewogICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IChpIC0gMSkgKiAzICsgMTsKICAgICAgICAgICAgICAgIGludCB4ID0gcmlnaHRTbGVldmUgPyBvZmZzZXQgOiBXSURUSCAtIG9mZnNldCAtIDE7CiAgICAgICAgICAgICAgICBpbnQgeSA9IEhFSUdIVCAtIDEgLSBTTEVFVkVfV0lEVEhfTUFYICsgb2Zmc2V0OwogICAgICAgICAgICAgICAgdmVjMiBkID0gcmlnaHRTbGVldmUgPyBSSUdIVF9ET1dOIDogTEVGVF9ET1dOOwogICAgICAgICAgICAgICAgcmFpbmJvd1JpYnMgKz0KICAgICAgICAgICAgICAgICAgICAgIHRpbGVTdHJva2UoeCwgeSArIDEsIEhFSUdIVCwgZCkKICAgICAgICAgICAgICAgICAgICArIHRpbGVTdHJva2UoeCwgeSAgICAsIEhFSUdIVCwgZCkKICAgICAgICAgICAgICAgICAgICArIHRpbGVTdHJva2UoeCwgeSAtIDEsIEhFSUdIVCwgZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0ICs9ICgxLjAgLSBmbG9hdChyYWluYm93UmlicyA+IDAuMCkpOwogICAgICAgIH0gIGVsc2UgewogICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSA0OyBpKyspIHsKICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSBpICogMjsKICAgICAgICAgICAgICAgIGludCB4ID0gcmlnaHRTbGVldmUgPyBvZmZzZXQ6IFdJRFRIIC0gb2Zmc2V0IC0gMTsKICAgICAgICAgICAgICAgIGludCB5ID0gSEVJR0hUIC0gU0xFRVZFX1dJRFRIX01BWCArIChpIC0gMSkgKiAzOwogICAgICAgICAgICAgICAgdmVjMiBkID0gcmlnaHRTbGVldmUgPyBSSUdIVF9ET1dOIDogTEVGVF9ET1dOOwogICAgICAgICAgICAgICAgcmV0ICs9IHRpbGVTdHJva2UoeCwgeSArIDEsIEhFSUdIVCwgZCkgKyB0aWxlU3Ryb2tlKHgsIHkgKyAyLCBIRUlHSFQsIGQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHJldDsKfQoKZmxvYXQgc2xpbmt5UGF0dGVybigpIHsKICAgIHZlYzIgcG9pbnQgPSBnbF9GcmFnQ29vcmQueHk7CiAgICBmbG9hdCBjZWxsU2l6ZSA9IG1heCh0aWxlU2l6ZSwgMy4pOwogICAgZmxvYXQgcmFkaXVzID0gbWF4KHRpbGVTaXplIC8gMy4sIDEuKTsKICAgIHBvaW50ID0gcG9pbnQgLSB2ZWMyKHRpbGVTaXplIC8gMy4wKTsKCSAgZmxvYXQgcGF0dGVybiA9ICgxLjAgLSBzbGlua3lSaWJzKCkpICogZG90dGVkUGF0dGVybihwb2ludCwgcmFkaXVzLCBjZWxsU2l6ZSk7CiAgICByZXR1cm4gcGF0dGVybjsKfQoKdmVjNCBzbGlua3kodmVjNCBjb2xvcikgewogICAgaWYgKGlzSHlwZXJSYWluYm93IDwgMS4wKSB7CiAgICAgICAgYm9vbCBpc1RvcnNvRnJvbnQgPSBkcmF3RnJvbnRTaWRlICYmIChmaWxsVG9yc29Ub3AoKSArIGZpbGxUb3Jzb0JvdHRvbSgpID4gMC4wKTsKICAgICAgICB2ZWM0IHJpYkNvbG9yID0gaXNUb3Jzb0Zyb250ID8gaHVlMnJnYmEoZmlsbEh1ZXNbMF0pIDogaHVlMnJnYmEoZmlsbEh1ZXNbMl0pOwogICAgICAgIGZsb2F0IHNsaW5reUZhY3RvciA9IHNsaW5reVJpYnMoKSAqIGlzU2xpbmt5ICogaXNGaWxsKCkgKiAoaXNIeXBlclJhaW5ib3cgPiAwLjAgPyAwLjAgOiAwLjUpOwogICAgICAgIGNvbG9yID0gbWl4KGNvbG9yLCByaWJDb2xvciwgc2xpbmt5RmFjdG9yKTsKICAgIH0KCSAgZmxvYXQgYXBwbHlTbGlua3kgPSBpc1NsaW5reSAqIGlzRmlsbCgpICogc2xpbmt5UGF0dGVybigpOwogICAgdmVjNCBzbGlua3lDb2xvciA9IHZlYzQoMS4wKTsKICAgIHJldHVybiBhcHBseVNsaW5reSAqIHNsaW5reUNvbG9yICsgKDEuMCAtIGFwcGx5U2xpbmt5KSAqIGNvbG9yOwp9CgovLyBGdXp6eQoKZmxvYXQgZnV6enlQYXR0ZXJuKCkgewogICAgdmVjMiBwb2ludCA9IGdsX0ZyYWdDb29yZC54eTsKICAgIGZsb2F0IHJhZGl1cyA9IChjZWlsKGNlaWwodGlsZVNpemUpIC8gMi4pICogMi4pIC8gMy47CiAgICBmbG9hdCBjZWxsU2l6ZSA9IG1heChyYWRpdXMgKiAzLiwgMy4pOwogICAgZmxvYXQgdGlsZVggPSBmbG9vcihwb2ludC54IC8gdGlsZVNpemUpOwogICAgdmVjMiBvZmZzZXQgPSBtb2QocG9pbnQsIGNlbGxTaXplKTsKICAgIGZsb2F0IHhtb2QgPSBjZWlsKG1vZCh0aWxlWCwgMi4pKTsKICAgIGZsb2F0IHlNaW4gPSBmbG9vcih4bW9kICogcmFkaXVzIC8gMy4pICogMy47CiAgICBmbG9hdCB5TWF4ID0gY2VpbCgoMS4gKyB4bW9kKSAqIHJhZGl1cyAvIDMuKSAqIDMuOwogICAgZmxvYXQgeE1pbiA9IGZsb29yKHJhZGl1cyAvIDMuKSAqIDMuOwogICAgZmxvYXQgeE1heCA9IGNlaWwoMi4gKiByYWRpdXMgLyAzLikgKiAzLjsKICAgIHJldHVybiBmbG9hdChvZmZzZXQueCA+PSB4TWluICYmIG9mZnNldC54IDw9IHhNYXggJiYgb2Zmc2V0LnkgPj0geU1pbiAmJiBvZmZzZXQueSA8PSB5TWF4KTsKfQoKdmVjNCBmdXp6eSh2ZWM0IGNvbG9yKSB7CiAgICBmbG9hdCBhcHBseUZ1enp5ID0gaXNGdXp6eSAqIGZ1enp5UGF0dGVybigpICogaXNGaWxsKCk7CiAgICB2ZWM0IGZ1enp5Q29sb3IgPSBtaXgoY29sb3IsIHZlYzQodmVjMygwLjApLCAxLjApLCAwLjQpOwogICAgcmV0dXJuIGFwcGx5RnV6enkgKiBmdXp6eUNvbG9yICsgKDEuMCAtIGFwcGx5RnV6enkpICogY29sb3I7Cn0KCmZsb2F0IGJvbGRQYXR0ZXJuKCkgewogICAgZmxvYXQgcmV0ID0gMC4wOwogICAgZm9yKGludCBpID0gMDsgaSA8IDY7IGkrKykgewogICAgICAgIHJldCArPSB0aWxlUmVjdChTTEVFVkVfV0lEVEhfTUFYICsgaSAqIDIsIDEsIFNMRUVWRV9XSURUSF9NQVggKyBpICogMiArIDEsIEhFSUdIVCAtIDEpOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKICAgICAgICBpbnQgY3V0ID0gaSA9PSAzID8gMiA6IDE7CiAgICAgICAgaW50IHkgPSBIRUlHSFQgLSBTTEVFVkVfV0lEVEhfTUFYIC0gaTsKICAgICAgICBpbnQgbGVuID0gU0xFRVZFX1dJRFRIX01BWCAtIGkgLSBjdXQ7CiAgICAgICAgcmV0ICs9IHRpbGVTdHJva2UoaSArIDEsIHksIGxlbiwgUklHSFRfVVApOwogICAgICAgIHJldCArPSB0aWxlU3Ryb2tlKFdJRFRIIC0gMiAtIGksIHksIGxlbiwgTEVGVF9VUCk7CiAgICB9CiAgICByZXR1cm4gZmxvYXQocmV0ID4gMC4wKTsKfQoKdmVjNCBib2xkKHZlYzQgY29sb3IpIHsKICAgIGZsb2F0IGFwcGx5Qm9sZCA9IGlzQm9sZCAqIGJvbGRQYXR0ZXJuKCkgKiBpc0ZpbGwoKTsKICAgIHZlYzQgYm9sZENvbG9yID0gbWl4KGNvbG9yLCB2ZWM0KHZlYzMoMC4wKSwgMS4wKSwgMC41KTsKICAgIHJldHVybiBhcHBseUJvbGQgKiBib2xkQ29sb3IgKyAoMS4wIC0gYXBwbHlCb2xkKSAqIGNvbG9yOwp9CgpmbG9hdCByaWJiZWRQYXR0ZXJuKCkgewogICAgZmxvYXQgcmV0ID0gMC4wOwogICAgZmxvYXQgeCA9IGdsX0ZyYWdDb29yZC54OwogICAgZmxvYXQgeSA9IGdsX0ZyYWdDb29yZC55OwogICAgZmxvYXQgd18zID0gZmxvYXQoV0lEVEggLyAzKSAqIHRpbGVTaXplOwogICAgZmxvYXQgd18yXzMgPSAyLiAqIHdfMzsKICAgIGZsb2F0IHJpYldpZHRoID0gdGlsZVNpemUgLyAzLjsKICAgIGZsb2F0IHJpYlggPSAxLiAqIHRpbGVTaXplOwogICAgZmxvYXQgcmliWSA9CiAgICAgICAgICBmbG9hdCh4ID49ICB3XzMgJiYgeCA8PSB3XzJfMykgKiAyLiAqIHRpbGVTaXplCiAgICAgICAgKyBmbG9hdCh4IDwgICB3XzMpICAgICAgICAgICAgICAgKiAzLiAqIHRpbGVTaXplCiAgICAgICAgKyBmbG9hdCh4ID4gICB3XzJfMykgICAgICAgICAgICAgKiAzLiAqIHRpbGVTaXplOwogICAgZmxvYXQgb2Zmc2V0WCA9IHRpbGVTaXplIC8gNi47CiAgICBmbG9hdCBvZmZzZXRZID0KICAgICAgICAgIGZsb2F0KHggPj0gIHdfMyAmJiB4IDw9IHdfMl8zKSAqICgtdGlsZVNpemUgKyByaWJXaWR0aCAvIDIuKQogICAgICAgICsgZmxvYXQoeCA8ICAgd18zKSAgICAgICAgICAgICAgICogKCBjZWlsKHggLyB0aWxlU2l6ZSkgKiB0aWxlU2l6ZSArIHRpbGVTaXplICsgcmliV2lkdGggLyAyLikKICAgICAgICArIGZsb2F0KHggPiAgIHdfMl8zKSAgICAgICAgICAgICAqICgtY2VpbCh4IC8gdGlsZVNpemUpICogdGlsZVNpemUgLSB0aWxlU2l6ZSArIHJpYldpZHRoIC8gMi4pOwogICAgeSArPSBvZmZzZXRZOwogICAgeCArPSBvZmZzZXRYOwogICAgaWYgKG1vZCh4LCByaWJYKSA8IHJpYldpZHRoIHx8CiAgICAgICAgbW9kKHksIHJpYlkpIDwgcmliV2lkdGggKXsKICAgICAgICByZXQgKz0gMS4wOwogICAgfQogICAgcmV0ICs9IHRpbGVSZWN0KFNMRUVWRV9XSURUSF9NQVgsIDEsIFNMRUVWRV9XSURUSF9NQVggKyBUT1JTT19XSURUSCwgMik7CiAgICByZXQgKz0gdGlsZVN0cm9rZSgxICAgICAgICAsIEhFSUdIVCAtIFNMRUVWRV9XSURUSF9NQVggLSAxLCBTTEVFVkVfQ1VGRiAtIDEsIFJJR0hUX0RPV04pOwogICAgcmV0ICs9IHRpbGVTdHJva2UoV0lEVEggLSAyLCBIRUlHSFQgLSBTTEVFVkVfV0lEVEhfTUFYIC0gMSwgU0xFRVZFX0NVRkYgLSAxLCBMRUZUX0RPV04pOwogICAgcmV0dXJuIGZsb2F0KHJldCA+IDAuMCk7Cn0KCnZlYzQgcmliYmVkKHZlYzQgY29sb3IpIHsKICAgIGZsb2F0IGFwcGx5UmliYmVkID0gaXNSaWJiZWQgKiByaWJiZWRQYXR0ZXJuKCkgKiBpc0ZpbGwoKTsKICAgIHZlYzQgcmliYmVkQ29sb3IgPSB2ZWM0KHZlYzMocmliYmVkSHVlKSwgMS4wKTsKICAgIHJldHVybiBhcHBseVJpYmJlZCAqIHJpYmJlZENvbG9yICsgKDEuMCAtIGFwcGx5UmliYmVkKSAqIGNvbG9yOwp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gIE1haW4gRnVuY3Rpb25zCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKdmVjNCBkcmF3Qm9yZGVyKCkgewogICAgdmVjNCBjb2xvciA9IHZlYzQodmVjMyhpc1JpYmJlZCAqIHJpYmJlZEh1ZSksIDEuMCk7CiAgICByZXR1cm4gaXNCb3JkZXIoKSAqIGNvbG9yOwp9Cgp2ZWM0IGFwcGx5UGF0dGVybnModmVjNCBjb2xvcikgewogICAgY29sb3IgPSBib2xkKGNvbG9yKTsKICAgIGNvbG9yID0gZnV6enkoY29sb3IpOwogICAgY29sb3IgPSBzbGlua3koY29sb3IpOwogICAgY29sb3IgPSByaWJiZWQoY29sb3IpOwogICAgcmV0dXJuIGNvbG9yOwp9Cgp2ZWM0IGZpbGwoKSB7CiAgICBmbG9hdCBkZWZhdWx0RmlsbCA9IDEuMCAtIGlzUGlwZSAtIGlzSHlwZXJSYWluYm93OwogICAgdmVjNCBmaWxsQ29sb3IgPQogICAgICAgIGlzUGlwZSAgICAgICAgICogZmlsbFBpcGUoKQogICAgICArIGlzSHlwZXJSYWluYm93ICogZmlsbEh5cGVyUmFpbmJvdygpCiAgICAgICsgZGVmYXVsdEZpbGwgICAgKiBmaWxsQ29sb3IoKTsKICAgIGZpbGxDb2xvciA9IGFwcGx5UGF0dGVybnMoZmlsbENvbG9yKTsKICAgIHJldHVybiBmaWxsQ29sb3I7Cn0KCnZvaWQgbWFpbigpIHsKICAgIGdsX0ZyYWdDb2xvciA9IGRyYXdCb3JkZXIoKSArIGZpbGwoKTsKfQpgOwo8L3NjcmlwdD4KCjxzY3JpcHQ+CiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNhbnZhcyIpOwogIGNvbnN0IHsgZ2wsIHByb2dyYW0gfSA9IGdsSW5pdGlhbGl6ZShjYW52YXMpCgogIGNvbnN0IG1hcCA9IChuLCBzdGFydDEsIHN0b3AxLCBzdGFydDIsIHN0b3AyKSA9PiB7CiAgICByZXR1cm4gKChuIC0gc3RhcnQxKSAvIChzdG9wMSAtIHN0YXJ0MSkpICogKHN0b3AyIC0gc3RhcnQyKSArIHN0YXJ0MjsKICB9OwoKICBsZXQgbnVtSGFzaGVzID0gdG9rZW5IYXNoLmxlbmd0aDsKICBsZXQgaGFzaFBhaXJzID0gW107CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1IYXNoZXM7IGkrKykgewogICAgZm9yIChsZXQgaiA9IDA7IGogPCAzMjsgaisrKSB7CiAgICAgIGhhc2hQYWlycy5wdXNoKHRva2VuSGFzaC5zbGljZSgyICsgaiAqIDIsIDQgKyBqICogMikpOwogICAgfQogIH0KICBjb25zdCBkZWNQYWlycyA9IGhhc2hQYWlycy5tYXAoKHgpID0+IHBhcnNlSW50KHgsIDE2KSk7CgogIGxldCBzdGFydENvbG9yID0gZGVjUGFpcnNbMjldOyAvLyAwLTI1NQogIGxldCByZXZlcnNlID0gZGVjUGFpcnNbMzBdIDwgMTI4OyAvLyAwIG9yIDEKICBsZXQgc2xpbmt5ID0gZGVjUGFpcnNbMzFdIDwgMzU7IC8vIDAgb3IgMQogIGxldCBwaXBlID0gZGVjUGFpcnNbMjJdIDwgMzI7IC8vIDAgb3IgMQogIGxldCBib2xkID0gZGVjUGFpcnNbMjNdIDwgMTU7IC8vIDAgb3IgMQogIGxldCByaWJiZWQgPSBkZWNQYWlyc1syNF0gPCAzMDsgLy8gMCBvciAxCiAgbGV0IGZ1enp5ID0gcGlwZSAmJiAhc2xpbmt5OyAvLyAwIG9yIDEKICBsZXQgc2VnbWVudHMgPSBtYXAoZGVjUGFpcnNbMjZdLCAwLCAyNTUsIDEyLCAyMCk7IC8vIDEyLTIwCiAgbGV0IHN0ZXBzID0gc2xpbmt5ID8gNTAgOiBmdXp6eSA/IDEwMDAgOiAyMDA7IC8vIDUwLCAyMDAsIDEwMDAKICBsZXQgc3ByZWFkID0gZGVjUGFpcnNbMjhdIDwgMyA/IDAuNSA6IG1hcChkZWNQYWlyc1syOF0sIDAsIDI1NSwgNSwgNTApOyAvLyAwLjUsIDUtNTAKICBsZXQgaHlwZXJSYWluYm93ID0gc3ByZWFkID09IDAuNTsgLy8gMCBvciAxCiAgbGV0IHJpYmJlZEh1ZSA9IGRlY1BhaXJzWzI1XTsgLy8gMC0yNTUKCiAgaWYgKGZ1enp5KSAgc2xpbmt5ID0gcmliYmVkID0gcGlwZSA9IGJvbGQgPSBmYWxzZTsKICBpZiAocGlwZSkgICByaWJiZWQgPSBzbGlua3kgPSBib2xkID0gZmFsc2U7CiAgaWYgKHNsaW5reSkgcmliYmVkID0gYm9sZCA9IGZhbHNlOwogIGlmIChib2xkKSAgIHJpYmJlZCA9IGZhbHNlOwoKICBjb25zdCBTUEVFRF9TVEVQID0gMTA7CiAgY29uc3QgTUlOX1NQRUVEID0gMTA7CiAgY29uc3QgTUFYX1NQRUVEID0gMjAwOwogIGxldCBzcGVlZCA9IDEwMDsKICBsZXQgaW5kZXggPSAwOwogIGxldCBsb29wcyA9IGZhbHNlOwogIGxldCBmcm9udFNpZGUgPSB0cnVlOwogIGxldCBkaXJlY3Rpb24gPSAxOwogIGxldCBiYWNrZ3JvdW5kSW5kZXggPSB0b2tlbklkIDwgMCA/IDEwIDogMDsKICBjb25zdCBiYWNrZ3JvdW5kQXJyYXkgPSBbMjU1LCAyMjUsIDIwMCwgMTc1LCAxNTAsIDEyNSwgMTAwLCA3NSwgNTAsIDI1LCAwLCAyNSwgNTAsIDc1LCAxMDAsIDEyNSwgMTUwLCAxNzUsIDIwMCwgMjI1LF07CiAgbGV0IGNhcHR1cmVGcmFtZSA9IGZhbHNlOwogIGxldCByZW5kZXJDYW52YXMgPSB0cnVlOwoKICBzZXRCYWNrZ3JvdW5kKCkKICBnbFNldENvbnN0YW50VW5pZm9ybXMoKTsKICBzZXR1cEdlc3R1cmVzKCk7CiAgcmVuZGVyU3RlZXJpbmcoKTsKICByZW5kZXIoKTsKCiAgZnVuY3Rpb24gc2xlZXAobXMpIHsKICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTsKICB9CgogIGNsYXNzIEh1ZVBpY2tlciB7CiAgICBjb25zdHJ1Y3Rvcihjb2xvciwgc2VnbWVudHMsIHN0ZXBzLCBzcHJlYWQsIGFsbEh1ZXMpIHsKICAgICAgdGhpcy5jb2xvciA9IGNvbG9yOwogICAgICB0aGlzLnNlZ21lbnRzID0gc2VnbWVudHM7CiAgICAgIHRoaXMuc3RlcHMgPSBzdGVwczsKICAgICAgdGhpcy5zcHJlYWQgPSBzcHJlYWQ7CiAgICAgIHRoaXMuYWxsSHVlcyA9IGFsbEh1ZXM7CiAgICB9CgogICAgcGljayhzZWN0aW9uLCBvZmZzZXQpIHsKICAgICAgY29uc3QgbGVuID0gdGhpcy5jb2xvcjsKICAgICAgY29uc3QgaHVlU3RlcCA9IE1hdGguZmxvb3IoKCh0aGlzLnNlZ21lbnRzIC0gMSkgLyA0KSAqIHRoaXMuc3RlcHMpOwogICAgICBjb25zdCBtZWRpYW5IdWUgPSBNYXRoLmZsb29yKGh1ZVN0ZXAgLyAyKTsKICAgICAgY29uc3QgaGFsZkh1ZVN0ZXAgPSBNYXRoLmZsb29yKG9mZnNldCAqIChNYXRoLmFicyg1MCAtIHRoaXMuc3ByZWFkKSAvIDUwKSAqIGh1ZVN0ZXAgKiB0aGlzLnN0ZXBzIC8gMTAwMCk7CiAgICAgIGNvbnN0IGluZGV4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy5hbGxIdWVzLmxlbmd0aCAtIDEsIChtZWRpYW5IdWUgKyBzZWN0aW9uICogaHVlU3RlcCArIGhhbGZIdWVTdGVwKSkpOwogICAgICBjb25zdCBodWUgPSB0aGlzLmFsbEh1ZXNbaW5kZXggJSBsZW5dOwogICAgICByZXR1cm4gaHVlOwogICAgfQogIH0KCiAgYXN5bmMgZnVuY3Rpb24gcmVuZGVyU3RlZXJpbmcoKSB7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBhd2FpdCBzbGVlcCgxMikKICAgICAgaWYgKGxvb3BzKSB7CiAgICAgICAgaW5kZXggKz0gc3BlZWQgLyAxMDA7CiAgICAgICAgcmVuZGVyQ2FudmFzID0gdHJ1ZTsKICAgICAgfQogICAgfQogIH0KCiAgYXN5bmMgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIGF3YWl0IHNsZWVwKDEwMDAvMjQpCiAgICAgICAgaWYgKCFyZW5kZXJDYW52YXMpIGNvbnRpbnVlOwoKICAgICAgICBsZXQgYWxsSHVlcyA9IFtdOwogICAgICAgIGxldCBzZWdtZW50SHVlcyA9IFtdOwogICAgICAgIGxldCBjb2xvciA9IDA7CiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzZWdtZW50cyAtIDI7IGorKykgewogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gc3RlcHM7IGkrKykgewogICAgICAgICAgICBsZXQgaHVlID0gcmV2ZXJzZSA/IDI1NSAtICgoKGNvbG9yIC8gc3ByZWFkKSArIHN0YXJ0Q29sb3IgKyBpbmRleCkgJSAyNTUpIDogKCgoY29sb3IgLyBzcHJlYWQpICsgc3RhcnRDb2xvcikgKyBpbmRleCkgJSAyNTU7CiAgICAgICAgICAgIGFsbEh1ZXMucHVzaChodWUpOwogICAgICAgICAgICBpZiAoaSA9PSAwKSB7CiAgICAgICAgICAgICAgc2VnbWVudEh1ZXMucHVzaChodWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbG9yICs9IDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNlZ21lbnRIdWVzLnB1c2goYWxsSHVlc1thbGxIdWVzLmxlbmd0aCAtIDFdKTsKICAgICAgICBzZWdtZW50SHVlcy5yZXZlcnNlKCk7CgogICAgICAgIGxldCBzZWN0aW9uSHVlcyA9IFtdOwogICAgICAgIGxldCBzZWN0aW9ucyA9IDIwOwogICAgICAgIGxldCBmaWxsSHVlcyA9IFtdOwogICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgc2VjdGlvbnM7IGsrKykgewogICAgICAgICAgc2VjdGlvbkh1ZXNba10gPSBzZWdtZW50SHVlc1trICUgc2VnbWVudEh1ZXMubGVuZ3RoXTsKICAgICAgICB9CiAgICAgICAgaWYgKHBpcGUpICBzZWN0aW9uSHVlcyA9IHNlY3Rpb25IdWVzLnJldmVyc2UoKTsKCiAgICAgICAgY29uc3QgcGlja2VyID0gbmV3IEh1ZVBpY2tlcihjb2xvciwgc2VnbWVudHMsIHN0ZXBzLCBzcHJlYWQsIGFsbEh1ZXMpCiAgICAgICAgY29uc3QgZmlsbEh1ZXNTZWN0aW9ucyA9IFszLCAzLCAyLCAyLCAxLCAxLCAwLCAwXTsKICAgICAgICBjb25zdCBmaWxsSHVlc09mZnNldHMgPSB7CiAgICAgICAgICBmdXp6eTogWzAsIDAsIDAsIDAsIDEsIC0xLCAtMSwgMV0sCiAgICAgICAgICBzbGlua3k6IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSwKICAgICAgICAgIGJvbGQ6IFswLCAwLCAtMSwgMSwgMSwgLTEsIDAsIDBdLAogICAgICAgICAgcmliYmVkOiBbMCwgMCwgMSwgLTEsIDEsIDEsIC0xLCAxXSwKICAgICAgICAgIG5vcm1hbDogWzEsIC0xLCAwLCAwLCAwLCAwLCAwLCAwXQogICAgICAgIH0KICAgICAgICBjb25zdCBwaWNrZXJUeXBlID0gc2xpbmt5ID8gJ3NsaW5reScgOiBmdXp6eSA/ICdmdXp6eScgOiBib2xkID8gJ2JvbGQnIDogcmliYmVkID8gJ3JpYmJlZCcgOiAnbm9ybWFsJzsKICAgICAgICBjb25zdCBvZmZzZXRzID0gZmlsbEh1ZXNPZmZzZXRzW3BpY2tlclR5cGVdOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsbEh1ZXNTZWN0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBmaWxsSHVlcy5wdXNoKHBpY2tlci5waWNrKGZpbGxIdWVzU2VjdGlvbnNbaV0sIG9mZnNldHNbaV0pKTsKICAgICAgICB9CiAgICAgICAgZ2xTZXRSZW5kZXJVbmlmb3JtcyhzZWN0aW9uSHVlcywgZmlsbEh1ZXMpOwogICAgICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQpOwogICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgIHJlbmRlckNhbnZhcyA9IGZhbHNlOwogICAgICAgIGlmIChjYXB0dXJlRnJhbWUpIHsKICAgICAgICAgIGNhcHR1cmVGcmFtZSA9IGZhbHNlOwogICAgICAgICAgc2F2ZUNhbnZhcygpOwogICAgICAgIH0KICAgICAgfQogIH0KCiAgZnVuY3Rpb24gdG9nZ2xlTG9vcCgpIHsKICAgIGxvb3BzID0gIWxvb3BzOwogICAgcmVuZGVyQ2FudmFzID0gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIHRvZ2dsZUZyb250U2lkZSgpIHsKICAgIGZyb250U2lkZSA9ICFmcm9udFNpZGU7CiAgICByZW5kZXJDYW52YXMgPSB0cnVlOwogIH0KCiAgZnVuY3Rpb24gc3BlZWRVcCgpIHsKICAgIGlmIChzcGVlZCA8IE1BWF9TUEVFRCkgewogICAgICBzcGVlZCA9IHNwZWVkICsgU1BFRURfU1RFUDsKICAgICAgcmVuZGVyQ2FudmFzID0gdHJ1ZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHNwZWVkRG93bigpIHsKICAgIGlmIChzcGVlZCA+IE1JTl9TUEVFRCkgewogICAgICBzcGVlZCA9IHNwZWVkIC0gU1BFRURfU1RFUDsKICAgICAgcmVuZGVyQ2FudmFzID0gdHJ1ZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHNldEJhY2tncm91bmQoKSB7CiAgICBjb25zdCByZ2IgPSBiYWNrZ3JvdW5kQXJyYXlbYmFja2dyb3VuZEluZGV4XTsKICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZCA9IGByZ2IoJHtyZ2J9LCAke3JnYn0sICR7cmdifSlgOwogICAgcmVuZGVyQ2FudmFzID0gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZUJhY2tncm91bmQoKSB7CiAgICBpZiAoYmFja2dyb3VuZEluZGV4IDwgYmFja2dyb3VuZEFycmF5Lmxlbmd0aCAtIDEpIHsKICAgICAgYmFja2dyb3VuZEluZGV4ICs9IDE7CiAgICB9IGVsc2UgewogICAgICBiYWNrZ3JvdW5kSW5kZXggPSAwOwogICAgfQogICAgc2V0QmFja2dyb3VuZCgpOwogIH0KCiAgZnVuY3Rpb24gcmVzZXQoKSB7CiAgICBiYWNrZ3JvdW5kSW5kZXggPSB0b2tlbklkIDwgMCA/IDEwIDogMDsKICAgIHNldEJhY2tncm91bmQoKTsKICAgIGluZGV4ID0gMDsKICAgIHNwZWVkID0gMTAwOwogICAgbG9vcHMgPSBmYWxzZTsKICAgIHJlbmRlckNhbnZhcyA9IHRydWU7CiAgfQoKICBmdW5jdGlvbiBzYXZlQ2FudmFzKCkgewogICAgbGV0IGNhbnZhc1VybCA9IGNhbnZhcy50b0RhdGFVUkwoKTsKICAgIGNvbnN0IGNyZWF0ZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgY3JlYXRlRWwuaHJlZiA9IGNhbnZhc1VybDsKICAgIHZhciBuYW1lID0gdG9rZW5JZCA+PSAwID8gIlNxdWlnZ2xlIiA6ICJHZW5lcmF0ZWQiCiAgICBjcmVhdGVFbC5kb3dubG9hZCA9ICJPRERTXyIgKyBuYW1lICsgIi5wbmciOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjcmVhdGVFbCk7CiAgICBjcmVhdGVFbC5jbGljaygpOwogICAgY3JlYXRlRWwucmVtb3ZlKCk7CiAgfQoKICBmdW5jdGlvbiBrZXlQcmVzc2VkKGUpIHsKICAgIGlmIChlLmtleUNvZGUgPT09IDMyKSB7CiAgICAgIHVwZGF0ZUJhY2tncm91bmQoKTsKICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICJBcnJvd0Rvd24iKSB7CiAgICAgIHNwZWVkRG93bigpOwogICAgfSBlbHNlIGlmIChlLmtleSA9PT0gIkFycm93VXAiKSB7CiAgICAgIHNwZWVkVXAoKTsKICAgIH0gZWxzZSBpZiAoWyJTaGlmdCIsICJBcnJvd0xlZnQiLCAiQXJyb3dSaWdodCJdLmluY2x1ZGVzKGUua2V5KSkgewogICAgICB0b2dnbGVGcm9udFNpZGUoKTsKICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICJyIikgewogICAgICByZXNldCgpCiAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAicyIpIHsKICAgICAgY2FwdHVyZUZyYW1lID0gdHJ1ZTsKICAgICAgcmVuZGVyQ2FudmFzID0gdHJ1ZTsKICAgICAgcmVuZGVyKCk7CiAgICB9CiAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgfQoKICBsZXQgbGFzdFRhcCA9IDA7CiAgbGV0IHRpbWVvdXRIb2xkZXI7CiAgZnVuY3Rpb24gaGFuZGxlVG91Y2hUYXAoZSkgewogICAgbGV0IGN1cnJlbnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICBsZXQgdGFwTGVuZ3RoID0gY3VycmVudFRpbWUgLSBsYXN0VGFwOwogICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRIb2xkZXIpOwoKICAgIGlmICh0YXBMZW5ndGggPCAyNTAgJiYgdGFwTGVuZ3RoID4gMCkgewogICAgICB1cGRhdGVCYWNrZ3JvdW5kKCk7CiAgICB9IGVsc2UgaWYgKHRhcExlbmd0aCA+IDI1MCAmJiB0YXBMZW5ndGggPCA1MDApIHsKICAgICAgcmVzZXQoKTsKICAgIH0gZWxzZSB7CiAgICAgIHRpbWVvdXRIb2xkZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICB0b2dnbGVMb29wKCk7CiAgICAgIH0sIDI1MCk7CiAgICB9CiAgICBsYXN0VGFwID0gY3VycmVudFRpbWU7CiAgfQoKICBsZXQgc3RhcnRUb3VjaFgsIHN0YXJ0VG91Y2hZOwogIGZ1bmN0aW9uIGhhbmRsZVRvdWNoU3RhcnQoZSkgewogICAgc3RhcnRUb3VjaFggPSBlLnRvdWNoZXNbMF0uY2xpZW50WDsKICAgIHN0YXJ0VG91Y2hZID0gZS50b3VjaGVzWzBdLmNsaWVudFk7CiAgfQoKICBmdW5jdGlvbiBoYW5kbGVUb3VjaEVuZChlKSB7CiAgICBjb25zdCBlbmRUb3VjaFggPSBlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFg7CiAgICBjb25zdCBlbmRUb3VjaFkgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFk7CiAgICBjb25zdCBkaWZmWCA9IHN0YXJ0VG91Y2hYIC0gZW5kVG91Y2hYOwogICAgY29uc3QgZGlmZlkgPSBzdGFydFRvdWNoWSAtIGVuZFRvdWNoWTsKICAgIGlmIChNYXRoLmFicyhkaWZmWCkgPiAyMDApIHsKICAgICAgdG9nZ2xlRnJvbnRTaWRlKCk7CiAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGRpZmZZKSA+IDIwMCkgewogICAgICBpZiAoZGlmZlkgPiAwKSB7CiAgICAgICAgc3BlZWRVcCgpOwogICAgICB9IGVsc2UgewogICAgICAgIHNwZWVkRG93bigpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBoYW5kbGVUb3VjaFRhcChlKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGhhbmRsZVRvdWNoKGUpIHsKICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgIGlmIChlLmNoYW5nZWRUb3VjaGVzLmxlbmd0aCA9PT0gMSkgewogICAgICBjb25zdCB0b3VjaCA9IGUudG91Y2hlc1swXTsKICAgICAgc3dpdGNoIChlLnR5cGUpIHsKICAgICAgICBjYXNlICd0b3VjaHN0YXJ0JzoKICAgICAgICAgIGhhbmRsZVRvdWNoU3RhcnQoZSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICd0b3VjaGVuZCc6CiAgICAgICAgICBoYW5kbGVUb3VjaEVuZChlKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBzZXR1cEdlc3R1cmVzKCkgewogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGtleVByZXNzZWQpOwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGhhbmRsZVRvdWNoKTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgaGFuZGxlVG91Y2gpOwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCBoYW5kbGVUb3VjaFRhcCk7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRvZ2dsZUxvb3ApOwogIH0KCiAgZnVuY3Rpb24gZ2xJbml0aWFsaXplKGNhbnZhcykgewogICAgY29uc3QgZ2wgPSBjYW52YXMuZ2V0Q29udGV4dCgid2ViZ2wiKTsKICAgIGNvbnN0IHZzID0gZ2wuY3JlYXRlU2hhZGVyKGdsLlZFUlRFWF9TSEFERVIpOwogICAgZ2wuc2hhZGVyU291cmNlKHZzLCB2ZXJ0ZXhTaGFkZXIpOwogICAgZ2wuY29tcGlsZVNoYWRlcih2cyk7CiAgICBjb25zdCBmcyA9IGdsLmNyZWF0ZVNoYWRlcihnbC5GUkFHTUVOVF9TSEFERVIpOwogICAgZ2wuc2hhZGVyU291cmNlKGZzLCBmcmFnbWVudFNoYWRlcik7CiAgICBnbC5jb21waWxlU2hhZGVyKGZzKTsKICAgIGNvbnN0IHByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKCk7CiAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgdnMpOwogICAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIGZzKTsKICAgIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pOwogICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgIGNvbnN0IHZlcnRpY2VzID0gbmV3IEZsb2F0MzJBcnJheShbMS4wLCAxLjAsIDAuMCwgLTEuMCwgMS4wLCAwLjAsIDEuMCwgLTEuMCwgMC4wLCAtMS4wLCAtMS4wLCAwLjAsXSk7CiAgICBjb25zdCBidWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTsKICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIpOwogICAgZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIHZlcnRpY2VzLCBnbC5TVEFUSUNfRFJBVyk7CiAgICBjb25zdCBwb3NpdGlvbiA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICJwb3NpdGlvbiIpOwogICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihwb3NpdGlvbiwgMywgZ2wuRkxPQVQsIHRydWUsIDAsIDApOwogICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkocG9zaXRpb24pOwogICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVCk7CiAgICBnbC5jbGVhckNvbG9yKDAsIDAsIDAsIDApOwogICAgcmV0dXJuIHsgZ2wsIHByb2dyYW0gfTsKICB9CgogIGZ1bmN0aW9uIGdsU2V0Q29uc3RhbnRVbmlmb3JtcygpIHsKICAgIGdsLnVuaWZvcm0xZihnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInJpYmJlZEh1ZSIpLCByaWJiZWRIdWUgLyAyNTUuMCk7CiAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJpc0JvbGQiKSwgYm9sZCk7CiAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJpc1NsaW5reSIpLCBzbGlua3kpOwogICAgZ2wudW5pZm9ybTFmKGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAiaXNGdXp6eSIpLCBmdXp6eSk7CiAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJpc1JpYmJlZCIpLCByaWJiZWQpOwogICAgZ2wudW5pZm9ybTFmKGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAiaXNQaXBlIiksIHBpcGUpOwogICAgZ2wudW5pZm9ybTFmKGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAiaXNIeXBlclJhaW5ib3ciKSwgaHlwZXJSYWluYm93KTsKICB9CgogIGZ1bmN0aW9uIGdsU2V0UmVuZGVyVW5pZm9ybXMoc2VjdGlvbkh1ZXMsIGZpbGxIdWVzKSB7CiAgICBjb25zdCBuVGlsZXNYID0gMzY7CiAgICBjb25zdCB0aWxlU2l6ZSA9IGNhbnZhcy53aWR0aCAvIG5UaWxlc1g7CiAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ0aWxlU2l6ZSIpLCB0aWxlU2l6ZSk7CiAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJkcmF3RnJvbnRTaWRlIiksIGZyb250U2lkZSk7CiAgICBnbC51bmlmb3JtMWZ2KGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAic2VnbWVudEh1ZXMiKSwgc2VjdGlvbkh1ZXMpOwogICAgZ2wudW5pZm9ybTFmdihnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgImZpbGxIdWVzIiksIGZpbGxIdWVzKTsKICB9Cjwvc2NyaXB0PgoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICBib2R5IHsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBkaXNwbGF5OiBmbGV4OwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogIH0KCiAgI2NvbnRhaW5lciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgIHdpZHRoOiBtaW4oMTA4LzYwICogOTB2aCwgOTB2dyk7CiAgICBhc3BlY3QtcmF0aW86IDkvNTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgfQoKICBjYW52YXMgewogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIG1pbi13aWR0aDogMjE2cHg7CiAgICBtaW4taGVpZ2h0OiAxMjBweDsKICAgIGltYWdlLXJlbmRlcmluZzogb3B0aW1pemVTcGVlZDsKICAgIGltYWdlLXJlbmRlcmluZzogLW1vei1jcmlzcC1lZGdlczsKICAgIGltYWdlLXJlbmRlcmluZzogLW8tY3Jpc3AtZWRnZXM7CiAgICBpbWFnZS1yZW5kZXJpbmc6IC13ZWJraXQtb3B0aW1pemUtY29udHJhc3Q7CiAgICBpbWFnZS1yZW5kZXJpbmc6IHBpeGVsYXRlZDsKICAgIGltYWdlLXJlbmRlcmluZzogb3B0aW1pemUtY29udHJhc3Q7CiAgfQoKPC9zdHlsZT4KPC9odG1sPgo="}...