NFT Token Detail

Token ID156
Contract0xFD248dCA94C2fA2F335b0c6f00e081F6095354FA
ODDS
Contract typeERC721
Metadata
Loading metadata from https://api.ycy.fashion/odds/image/156.png","animation_url": "data:text/html;charset=utf-8;base64,PGh0bWw+PGhlYWQ+PG1ldGEgY2hhcnNldD0ndXRmLTgnLz48c2NyaXB0PmxldCB0b2tlbkhhc2ggPSAnMHgzNjU0MjM3NjJjMGMwZWRlN2IzNjJiNDdhYjIzOTFjMDM5NWNiMTBjMTY5MjEzN2Y2MjRiNThhYjAxNzc2Y2RlJzsgbGV0IHRva2VuSWQgPSAtMTs8L3NjcmlwdD48L2hlYWQ+PGJvZHk+PGRpdiBpZD0iY29udGFpbmVyIj48Y2FudmFzIGlkPSJjYW52YXMiIGhlaWdodD0iNjAwIiB3aWR0aD0iMTA4MCI+PC9jYW52YXM+PC9kaXY+PC9ib2R5Pgo8c2NyaXB0PgogIGNvbnN0IHZlcnRleFNoYWRlciA9IGAKYXR0cmlidXRlIHZlYzQgcG9zaXRpb247CnZvaWQgbWFpbigpIHsKICAgIGdsX1Bvc2l0aW9uID0gcG9zaXRpb247Cn1gOwogIGNvbnN0IGZyYWdtZW50U2hhZGVyID0gYApwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gIENvbnN0YW50cyAmIFVuaWZvcm1zCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKY29uc3QgaW50IFdJRFRIICAgICAgICAgICAgPSAzNjsKY29uc3QgaW50IEhFSUdIVCAgICAgICAgICAgPSAyMDsKY29uc3QgaW50IFRPUlNPX1dJRFRIICAgICAgPSAxMjsKY29uc3QgaW50IFRPUlNPX0NVVCAgICAgICAgPSAxMjsKY29uc3QgaW50IFNMRUVWRV9XSURUSF9NQVggPSAxMjsKY29uc3QgaW50IFNMRUVWRV9XSURUSF9NSU4gPSA3Owpjb25zdCBpbnQgU0xFRVZFX0NVRkYgICAgICA9IDQ7CmNvbnN0IGludCBDT0xMQVJfV0lEVEggICAgID0gNDsKCi8vIENvbW1vbgpjb25zdCB2ZWM0IEJMQUNLID0gdmVjNCh2ZWMzKDAuMCksIDEuMCk7CnVuaWZvcm0gZmxvYXQgdGlsZVNpemU7CnVuaWZvcm0gYm9vbCAgZHJhd0Zyb250U2lkZTsKCi8vIFR5cGUKdW5pZm9ybSBmbG9hdCBpc1NsaW5reTsKdW5pZm9ybSBmbG9hdCBpc0Z1enp5Owp1bmlmb3JtIGZsb2F0IGlzQm9sZDsKdW5pZm9ybSBmbG9hdCBpc1JpYmJlZDsKdW5pZm9ybSBmbG9hdCBpc1BpcGU7CnVuaWZvcm0gZmxvYXQgaXNIeXBlclJhaW5ib3c7CgovLyBIdWVzCnVuaWZvcm0gZmxvYXQgZmlsbEh1ZXNbOF07CnVuaWZvcm0gZmxvYXQgc2VnbWVudEh1ZXNbMjBdOwp1bmlmb3JtIGZsb2F0IHJpYmJlZEh1ZTsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyAgQ29sb3IgY29udmVyc2lvbiBhbmQgaGVscGVyIGZ1bmN0aW9ucwovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCnZlYzMgaHN2MnJnYih2ZWMzIGMpIHsKICAgIHZlYzQgSyA9IHZlYzQoMS4wLCAyLjAgLyAzLjAsIDEuMCAvIDMuMCwgMy4wKTsKICAgIHZlYzMgcCA9IGFicyhmcmFjdChjLnh4eCArIEsueHl6KSAqIDYuMCAtIEsud3d3KTsKICAgIHJldHVybiBjLnogKiBtaXgoSy54eHgsIGNsYW1wKHAgLSBLLnh4eCwgMC4wLCAxLjApLCBjLnkpOwp9Cgp2ZWMzIGh1ZTJyZ2IoZmxvYXQgaHVlKSB7CiAgICB2ZWMzIHJnYiA9IGhzdjJyZ2IodmVjMyhodWUgLyAyNTUuMCwgMS4wLCAxLjApKTsKICAgIHJldHVybiByZ2I7Cn0KCnZlYzQgaHVlMnJnYmEoZmxvYXQgaHVlKSB7CiAgICB2ZWMzIHJnYiA9IGhzdjJyZ2IodmVjMyhodWUgLyAyNTUuMCwgMS4wLCAxLjApKTsKICAgIHJldHVybiB2ZWM0KHJnYiwgMS4wKTsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vICBUaWxlIFJlY3QKLy8gICAgICAgICAgICAgICAgICAgICh4ZiwgeWYpCi8vICAgICAgICAgLS0tLS0tLS0tLS0tCi8vICAgICAgICB8ICAgICAgICAgICAgfAovLyAgICAgICAgfCAgICAgICAgICAgIHwKLy8gICAgICAgIHwgICAgICAgICAgICB8Ci8vICAgICAgICAgLS0tLS0tLS0tLS0tCi8vICAgICh4MCwgeTApCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKZmxvYXQgdGlsZVJlY3QoaW50IHgwLCBpbnQgeTAsIGludCB4ZiwgaW50IHlmKSB7CiAgICB2ZWMyICBwb3MgPSBnbF9GcmFnQ29vcmQueHk7CiAgICBmbG9hdCByZXQgPSAxLjA7CiAgICBmbG9hdCBfeDAgPSBmbG9hdCh4MCkgKiB0aWxlU2l6ZTsKICAgIGZsb2F0IF95MCA9IGZsb2F0KHkwKSAqIHRpbGVTaXplOwogICAgZmxvYXQgX3hmID0gZmxvYXQoeGYpICogdGlsZVNpemU7CiAgICBmbG9hdCBfeWYgPSBmbG9hdCh5ZikgKiB0aWxlU2l6ZTsKICAgIHJldCAqPSBzdGVwKF94MCwgcG9zLngpICogc3RlcChwb3MueCwgX3hmKTsKICAgIHJldCAqPSBzdGVwKF95MCwgcG9zLnkpICogc3RlcChwb3MueSwgX3lmKTsKICAgIHJldHVybiByZXQ7Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyAgIFRpbGUgKDF4MSByZWN0YW5nbGUpCi8vICAgICAgICAgICAgICAgKHgwICsgMSwgeTAgKyAxKQovLyAgICAgICAgICAgIFsgXQovLyAgICAoeDAsIHkwKQovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCmZsb2F0IHRpbGUoaW50IHgwLCBpbnQgeTApIHsKICAgIHJldHVybiB0aWxlUmVjdCh4MCwgeTAsIHgwICsgMSwgeTAgKyAxKTsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vICBUaWxlIFN0cm9rZSwgaW4gZm9sbG93aW5nIGRpcmVjdGlvbnM6Ci8vICAgICAgICAgICAgICAgICAgICAgIFVQKDAsIDEpCi8vICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci8vICAgICAgTEVGVF9VUCgtMSwgMSkgICBcICB8ICAvICAgICBSSUdIVF9VUCgxLCAxKQovLyAgICAgICAgICAgICAgICAgICAgICAgIFwgfCAvCi8vICAgICAgIExFRlQoLTEsIDApIC0tLS0tLS0tLS0tLS0gICAgUklHSFQoMSwgMCkKLy8gICAgICAgICAgICAgICAgICAgICAgICAvIHwgXAovLyAgICBMRUZUX0RPV04oLTEsLTEpICAgLyAgfCAgXCAgIFJJR0hUX0RPV04oMSwtMSkKLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gICAgICAgICAgICAgICAgICAgIERPV04oMCwtMSkKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgpjb25zdCB2ZWMyIFJJR0hUICAgICAgPSB2ZWMyKCAxLjAsICAwLjApOwpjb25zdCB2ZWMyIFJJR0hUX1VQICAgPSB2ZWMyKCAxLjAsICAxLjApOwpjb25zdCB2ZWMyIFVQICAgICAgICAgPSB2ZWMyKCAwLjAsICAxLjApOwpjb25zdCB2ZWMyIExFRlRfVVAgICAgPSB2ZWMyKC0xLjAsICAxLjApOwpjb25zdCB2ZWMyIExFRlRfRE9XTiAgPSB2ZWMyKC0xLjAsIC0xLjApOwpjb25zdCB2ZWMyIERPV04gICAgICAgPSB2ZWMyKCAwLjAsIC0xLjApOwpjb25zdCB2ZWMyIFJJR0hUX0RPV04gPSB2ZWMyKCAxLjAsIC0xLjApOwoKZmxvYXQgdGlsZVN0cm9rZShpbnQgeCwgaW50IHksIGludCBsLCB2ZWMyIGQsIGludCBzKSB7CiAgICBmbG9hdCByZXQgPSAwLjA7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IFdJRFRIOyBpKyspIHsKICAgICAgICBpZiAoaSAqIHMgPj0gbCkgYnJlYWs7CiAgICAgICAgaW50IGEgPSB4ICsgaW50KGQueCkgKiBpICogczsKICAgICAgICBpbnQgYiA9IHkgKyBpbnQoZC55KSAqIGkgKiBzOwogICAgICAgIHJldCArPSB0aWxlKGEsIGIpOwogICAgfQogICAgcmV0dXJuIHJldDsKfQoKZmxvYXQgdGlsZVN0cm9rZShpbnQgeCwgaW50IHksIGludCBsLCB2ZWMyIGQpIHsKICAgIHJldHVybiB0aWxlU3Ryb2tlKHgsIHksIGwsIGQsIDEpOwp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gQm9yZGVyCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKZmxvYXQgYm9yZGVyVG9yc28oKSB7CiAgICBmbG9hdCByZXQgPSAwLjA7CiAgICBpbnQgeGwgPSBTTEVFVkVfV0lEVEhfTUFYOwogICAgaW50IHhyID0geGwgKyBUT1JTT19XSURUSDsKICAgIGludCB5dCA9IEhFSUdIVDsKICAgIGludCB5cyA9IFRPUlNPX0NVVCArIDE7CiAgICByZXQgKz0gdGlsZVJlY3QoeGwgICAgLCAwICAgICAsIHhyICAgICwgIDEpOyAgICAvLyBkcmF3IGJvdHRvbQogICAgcmV0ICs9IHRpbGVSZWN0KHhsICAgICwgeXQgLSAxLCB4ciAgICAsIHl0KTsgICAgLy8gZHJhdyB0b3AKICAgIHJldCArPSB0aWxlUmVjdCh4bCAtIDEsIDEgICAgICwgeGwgICAgLCB5cyk7ICAgIC8vIGRyYXcgbGVmdCBzaWRlCiAgICByZXQgKz0gdGlsZVJlY3QoeHIgICAgLCAxICAgICAsIHhyICsgMSwgeXMpOyAgICAvLyBkcmF3IHJpZ2h0IHNpZGUKICAgIHJldHVybiBmbG9hdChyZXQgPiAwLjApOwp9CgpmbG9hdCBib3JkZXJDb2xsYXIoKSB7CiAgICBpZiAoIWRyYXdGcm9udFNpZGUpIHJldHVybiAwLjA7CiAgICBmbG9hdCByZXQgPSAwLjA7CiAgICBpbnQgeDAgPSBXSURUSCAvIDIgLSAyOwogICAgaW50IHkwID0gSEVJR0hUIC0gMjsKICAgIHJldCArPSB0aWxlKHgwIC0gMSwgeTApOwogICAgcmV0ICs9IHRpbGUoeDAgKyBDT0xMQVJfV0lEVEgsIHkwKTsKICAgIHJldCArPSB0aWxlUmVjdCh4MCwgIHkwIC0gMSwgeDAgKyBDT0xMQVJfV0lEVEgsIHkwKTsKICAgIHJldHVybiBmbG9hdChyZXQgPiAwLjApOwp9CgpmbG9hdCBib3JkZXJTbGVldmVzKCkgewogICAgZmxvYXQgcmV0ID0gMC4wOwogICAgaW50IHRvcFkgPSBIRUlHSFQgLSBTTEVFVkVfV0lEVEhfTUFYOwogICAgaW50IGJvdHRvbVkgPSBIRUlHSFQgLSBTTEVFVkVfV0lEVEhfTUFYIC0gU0xFRVZFX0NVRkY7CiAgICBpbnQgY3VmZlkgPSBIRUlHSFQgLSBTTEVFVkVfV0lEVEhfTUFYIC0gMTsKICAgIHJldCArPSB0aWxlU3Ryb2tlKDAsIHRvcFksIFNMRUVWRV9XSURUSF9NQVgsIFJJR0hUX1VQKTsKICAgIHJldCArPSB0aWxlU3Ryb2tlKFdJRFRIIC0gU0xFRVZFX1dJRFRIX01BWCwgSEVJR0hUIC0gMSwgU0xFRVZFX1dJRFRIX01BWCwgUklHSFRfRE9XTik7CiAgICByZXQgKz0gdGlsZVN0cm9rZShTTEVFVkVfQ1VGRiwgYm90dG9tWSwgU0xFRVZFX1dJRFRIX01JTiwgUklHSFRfVVApOwogICAgcmV0ICs9IHRpbGVTdHJva2UoV0lEVEggLSBTTEVFVkVfQ1VGRiAtIDEsIGJvdHRvbVksIFNMRUVWRV9XSURUSF9NSU4sIExFRlRfVVApOwogICAgcmV0ICs9IHRpbGVTdHJva2UoMCwgY3VmZlksIFNMRUVWRV9DVUZGLCBSSUdIVF9ET1dOKTsKICAgIHJldCArPSB0aWxlU3Ryb2tlKFdJRFRIIC0gMSwgY3VmZlksIFNMRUVWRV9DVUZGLCBMRUZUX0RPV04pOwogICAgcmV0dXJuIGZsb2F0KHJldCA+IDAuMCk7Cn0KCmZsb2F0IGJvcmRlclBpcGVSaWJzKCkgewogICAgZmxvYXQgcmV0ID0gMC4wOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKICAgICAgICBpbnQgeG1vZCA9IGludChtb2QoZmxvYXQoaSksIDIuKSk7CiAgICAgICAgaW50IHh0ID0geG1vZCArIFNMRUVWRV9XSURUSF9NQVg7CiAgICAgICAgaW50IHl0ID0gMyArIGkgKiA0OwogICAgICAgIHJldCArPSB0aWxlU3Ryb2tlKHhtb2QgKyBTTEVFVkVfV0lEVEhfTUFYLCAzICsgaSAqIDQsIFRPUlNPX1dJRFRILCBSSUdIVCwgMik7CiAgICAgICAgaW50IHhsID0geG1vZCArIChpICsgMSkgKiAyOwogICAgICAgIGludCB5bCA9IChIRUlHSFQgLSBTTEVFVkVfV0lEVEhfTUFYICsgMSkgLSB4bW9kICsgaSAqIDI7CiAgICAgICAgcmV0ICs9IHRpbGVTdHJva2UoeGwsIHlsLCBTTEVFVkVfQ1VGRiwgUklHSFRfRE9XTiwgMik7CiAgICAgICAgaW50IHhyID0gKFdJRFRIIC0gMSkgLSB4bDsKICAgICAgICBpbnQgeXIgPSB5bDsKICAgICAgICByZXQgKz0gdGlsZVN0cm9rZSh4ciwgeXIsIFNMRUVWRV9DVUZGLCBMRUZUX0RPV04sIDIpOwogICAgfQogICAgcmV0dXJuIGlzUGlwZSAqIGZsb2F0KHJldCA+IDAuMCk7Cn0KCmZsb2F0IGlzQm9yZGVyKCkgewogICAgcmV0dXJuIGZsb2F0KAogICAgICAgICAgYm9yZGVyVG9yc28oKQogICAgICAgICsgYm9yZGVyQ29sbGFyKCkKICAgICAgICArIGJvcmRlclNsZWV2ZXMoKQogICAgICAgICsgYm9yZGVyUGlwZVJpYnMoKQogICAgICAgID4gMC4wCiAgICApOwp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gICBDb2xvciBmaWxsIHBlciBzZWN0aW9ucwovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCmZsb2F0IGZpbGxUb3Jzb1RvcCgpIHsKICAgIGZsb2F0IHJldCA9IDAuMDsKICAgIGludCBoID0gaXNGdXp6eSA+IDAuMCB8fCBpc1JpYmJlZCA+IDAuMCA/IDEyIDogOTsKICAgIGludCB4MCA9IFNMRUVWRV9XSURUSF9NQVg7CiAgICBpbnQgeTAgPSBIRUlHSFQgLSAxIC0gaDsKICAgIGludCB4ZiA9IHgwICsgVE9SU09fV0lEVEg7CiAgICBpbnQgeWYgPSBIRUlHSFQgLSAxOwogICAgcmV0ICs9IHRpbGVSZWN0KHgwLCB5MCwgeGYsIHlmKTsKICAgIHJldHVybiBmbG9hdChyZXQgPiAwLjApOwp9CgpmbG9hdCBmaWxsVG9yc29Cb3R0b20oKSB7CiAgICBmbG9hdCByZXQgPSAwLjA7CiAgICBpbnQgaCA9IGlzRnV6enkgPiAwLjAgfHwgaXNSaWJiZWQgPiAwLjAgPyAxMiA6IDk7CiAgICBpbnQgeDAgPSBTTEVFVkVfV0lEVEhfTUFYOwogICAgaW50IHkwID0gMTsKICAgIGludCB4ZiA9IHgwICsgVE9SU09fV0lEVEg7CiAgICBpbnQgeWYgPSBIRUlHSFQgLSAxIC0gaDsKICAgIHJldCArPSB0aWxlUmVjdCh4MCwgeTAsIHhmLCB5Zik7CiAgICByZXR1cm4gZmxvYXQocmV0ID4gMC4wKTsKfQoKZmxvYXQgZmlsbFJpZ2h0U2xlZXZlVG9wKCkgewogICAgZmxvYXQgcmV0ID0gMC4wOwogICAgaW50IHgwID0gU0xFRVZFX1dJRFRIX01BWCAtIDE7CiAgICBpbnQgeTAgPSBIRUlHSFQgLSAxOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA3OyBpKyspIHsKICAgICAgaW50IHggPSB4MCAtIGkvNjsKICAgICAgaW50IHkgPSB5MCAtIGkgLSAxIC0gaS82OwogICAgICBpbnQgbCA9IFNMRUVWRV9XSURUSF9NQVggLyAyIC0gaS8yICsgMSAtIGkvNjsKICAgICAgcmV0ICs9IHRpbGVTdHJva2UoeCwgeSwgbCwgTEVGVF9ET1dOKTsKICAgIH0KICAgIHJldHVybiBmbG9hdChyZXQgPiAwLjApOwp9CgpmbG9hdCBmaWxsUmlnaHRTbGVldmVCb3R0b20oKSB7CiAgICBmbG9hdCByZXQgPSAwLjA7CiAgICBpbnQgeDAgPSAxOwogICAgaW50IHkwID0gSEVJR0hUIC0gU0xFRVZFX1dJRFRIX01BWDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNzsgaSsrKSB7CiAgICAgIGludCB4ID0geDAgKyBpIC8gMjsKICAgICAgaW50IHkgPSB5MCAtIChpICsgMSkgLyAyOwogICAgICByZXQgKz0gdGlsZVN0cm9rZSh4LCB5LCA0LCBSSUdIVF9VUCk7CiAgICB9CiAgICByZXR1cm4gZmxvYXQocmV0ID4gMC4wKTsKfQoKZmxvYXQgZmlsbExlZnRTbGVldmVUb3AoKSB7CiAgICBmbG9hdCByZXQgPSAwLjA7CiAgICBpbnQgeDAgPSBXSURUSCAtIFNMRUVWRV9XSURUSF9NQVg7CiAgICBpbnQgeTAgPSBIRUlHSFQgLSAxOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA3OyBpKyspIHsKICAgICAgaW50IHggPSB4MCArIGkvNjsKICAgICAgaW50IHkgPSB5MCAtIGkgLSAxIC0gaS82OwogICAgICBpbnQgbCA9IFNMRUVWRV9XSURUSF9NQVggLyAyIC0gaS8yICsgMSAtIGkvNjsKICAgICAgcmV0ICs9IHRpbGVTdHJva2UoeCwgeSwgbCwgUklHSFRfRE9XTik7CiAgICB9CiAgICByZXR1cm4gZmxvYXQocmV0ID4gMC4wKTsKfQoKZmxvYXQgZmlsbExlZnRTbGVldmVCb3R0b20oKSB7CiAgICBmbG9hdCByZXQgPSAwLjA7CiAgICBpbnQgeDAgPSBXSURUSCAtIDI7CiAgICBpbnQgeTAgPSBIRUlHSFQgLSBTTEVFVkVfV0lEVEhfTUFYOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA3OyBpKyspIHsKICAgICAgaW50IHggPSB4MCAtIGkgLyAyOwogICAgICBpbnQgeSA9IHkwIC0gKGkgKyAxKSAvIDI7CiAgICAgIHJldCArPSB0aWxlU3Ryb2tlKHgsIHksIDQsIExFRlRfVVApOwogICAgfQogICAgcmV0dXJuIGZsb2F0KHJldCA+IDAuMCk7Cn0KCmZsb2F0IGlzRmlsbCgpIHsKICAgIHJldHVybiBmbG9hdCgKICAgICAgICAoIGZpbGxUb3Jzb1RvcCgpCiAgICAgICAgKyBmaWxsVG9yc29Cb3R0b20oKQogICAgICAgICsgZmlsbFJpZ2h0U2xlZXZlVG9wKCkKICAgICAgICArIGZpbGxSaWdodFNsZWV2ZUJvdHRvbSgpCiAgICAgICAgKyBmaWxsTGVmdFNsZWV2ZVRvcCgpCiAgICAgICAgKyBmaWxsTGVmdFNsZWV2ZUJvdHRvbSgpICkgPiAwLjAKICAgICAgKSAqICgxLjAgLSBpc0JvcmRlcigpKTsKfQoKdmVjNCBmaWxsQ29sb3IoKSB7CiAgICByZXR1cm4gaXNGaWxsKCkgKiAoMS4wIC0gaXNIeXBlclJhaW5ib3cpICogKDEuMCAtIGlzUGlwZSkgKiAoCiAgICAgICAgICAgIGZpbGxMZWZ0U2xlZXZlQm90dG9tKCkgICogKGRyYXdGcm9udFNpZGUgPyBodWUycmdiYShmaWxsSHVlc1swXSkgOiBodWUycmdiYShmaWxsSHVlc1s1XSkpICsKICAgICAgICAgICAgZmlsbExlZnRTbGVldmVUb3AoKSAgICAgKiAoZHJhd0Zyb250U2lkZSA/IGh1ZTJyZ2JhKGZpbGxIdWVzWzFdKSA6IGh1ZTJyZ2JhKGZpbGxIdWVzWzRdKSkgKwogICAgICAgICAgICBmaWxsVG9yc29Ub3AoKSAgICAgICAgICAqIChkcmF3RnJvbnRTaWRlID8gaHVlMnJnYmEoZmlsbEh1ZXNbMl0pIDogaHVlMnJnYmEoZmlsbEh1ZXNbNl0pKSArCiAgICAgICAgICAgIGZpbGxUb3Jzb0JvdHRvbSgpICAgICAgICogKGRyYXdGcm9udFNpZGUgPyBodWUycmdiYShmaWxsSHVlc1szXSkgOiBodWUycmdiYShmaWxsSHVlc1s3XSkpICsKICAgICAgICAgICAgZmlsbFJpZ2h0U2xlZXZlVG9wKCkgICAgKiAoZHJhd0Zyb250U2lkZSA/IGh1ZTJyZ2JhKGZpbGxIdWVzWzRdKSA6IGh1ZTJyZ2JhKGZpbGxIdWVzWzFdKSkgKwogICAgICAgICAgICBmaWxsUmlnaHRTbGVldmVCb3R0b20oKSAqIChkcmF3RnJvbnRTaWRlID8gaHVlMnJnYmEoZmlsbEh1ZXNbNV0pIDogaHVlMnJnYmEoZmlsbEh1ZXNbMF0pKQogICAgICAgICk7Cn0KCnZlYzQgZmlsbEh5cGVyUmFpbmJvdygpIHsKICAgIGJvb2wgaXNUb3JzbyA9IChmaWxsVG9yc29Ub3AoKSArIGZpbGxUb3Jzb0JvdHRvbSgpKSA+IDAuMDsKICAgIGZsb2F0IGlzRmlsbGVkID0gaXNIeXBlclJhaW5ib3cgKiAoMS4wIC0gaXNQaXBlKSAqIGlzRmlsbCgpOwogICAgaWYgKGlzRmlsbGVkID09IDAuMCkgewogICAgICAgIHJldHVybiB2ZWM0KDAuMCk7CiAgICB9CiAgICBpZiAoaXNUb3JzbykgewogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgSEVJR0hUIC0gMTsgaSsrKSB7CiAgICAgICAgICAgIGZsb2F0IHNlY3Rpb24gPSB0aWxlUmVjdChTTEVFVkVfV0lEVEhfTUFYLCBpLCBTTEVFVkVfV0lEVEhfTUFYICsgVE9SU09fV0lEVEgsIGkgKyAxKTsKICAgICAgICAgICAgaWYgKHNlY3Rpb24gPiAwLjApIHsKICAgICAgICAgICAgICAgIGZsb2F0IGh1ZSA9IHNlZ21lbnRIdWVzWzIwIC0gaV07CiAgICAgICAgICAgICAgICB2ZWM0IGNvbCA9IGh1ZTJyZ2JhKGh1ZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gY29sOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBmbG9hdCBsZWZ0U2xlZXZlID0gZmlsbExlZnRTbGVldmVUb3AoKSArIGZpbGxMZWZ0U2xlZXZlQm90dG9tKCk7CiAgICAgICAgZmxvYXQgcmlnaHRTbGVldmUgPSBmaWxsUmlnaHRTbGVldmVUb3AoKSArIGZpbGxSaWdodFNsZWV2ZUJvdHRvbSgpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7CiAgICAgICAgICAgIGludCB4TW9kID0gaW50KG1vZChmbG9hdChpKSwgMy4wKSkgPiAwID8gMCA6IDE7CiAgICAgICAgICAgIGludCB4ID0gaSAqIDMgLSB4TW9kIC0gaSAqIDI7CiAgICAgICAgICAgIGludCB5ID0gSEVJR0hUIC0gU0xFRVZFX1dJRFRIX01BWCArIHhNb2QgKyBpICogMjsKICAgICAgICAgICAgZmxvYXQgc2ggPSBmbG9hdChpID09IDUpOwogICAgICAgICAgICBmbG9hdCByZXQgPSByaWdodFNsZWV2ZSAqICgKICAgICAgICAgICAgICAgICAgdGlsZVN0cm9rZSh4LCB5ICsgMCwgU0xFRVZFX0NVRkYgKyAzLCBSSUdIVF9ET1dOKQogICAgICAgICAgICAgICAgKyB0aWxlU3Ryb2tlKHgsIHkgKyAxLCBTTEVFVkVfQ1VGRiArIDMsIFJJR0hUX0RPV04pCiAgICAgICAgICAgICAgICArIHRpbGVTdHJva2UoeCwgeSArIDIsIFNMRUVWRV9DVUZGICsgNCwgUklHSFRfRE9XTikKICAgICAgICAgICAgICAgICsgc2ggKiB0aWxlUmVjdChTTEVFVkVfV0lEVEhfTUFYIC0gMiwgSEVJR0hUIC0gNSwgU0xFRVZFX1dJRFRIX01BWCwgSEVJR0hUIC0gMSkKICAgICAgICAgICAgKQogICAgICAgICAgICArIGxlZnRTbGVldmUgKiAoCiAgICAgICAgICAgICAgICAgIHRpbGVTdHJva2UoV0lEVEggLSB4IC0gMSwgeSArIDAsIFNMRUVWRV9DVUZGICsgMywgTEVGVF9ET1dOKQogICAgICAgICAgICAgICAgKyB0aWxlU3Ryb2tlKFdJRFRIIC0geCAtIDEsIHkgKyAxLCBTTEVFVkVfQ1VGRiArIDMsIExFRlRfRE9XTikKICAgICAgICAgICAgICAgICsgdGlsZVN0cm9rZShXSURUSCAtIHggLSAxLCB5ICsgMiwgU0xFRVZFX0NVRkYgKyA0LCBMRUZUX0RPV04pCiAgICAgICAgICAgICAgICArIHNoICogdGlsZVJlY3QoV0lEVEggLSBTTEVFVkVfV0lEVEhfTUFYLCBIRUlHSFQgLSA1LCBXSURUSCAtIFNMRUVWRV9XSURUSF9NQVggKyAyLCBIRUlHSFQgLSAxKQogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAocmV0ID4gMC4wKSB7CiAgICAgICAgICAgICAgICB2ZWM0IGNvbCA9IGh1ZTJyZ2JhKHNlZ21lbnRIdWVzW2ldKTsKICAgICAgICAgICAgICAgIHJldHVybiBjb2w7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gdmVjNCgwLjApOwp9Cgp2ZWM0IG1peFBpcGVDb2xvcihmbG9hdCBodWUxLCBmbG9hdCBodWUyKSB7CiAgICB2ZWM0IG1peENvbG9yID0gbWl4KGh1ZTJyZ2JhKGh1ZTEpLCBodWUycmdiYShodWUyKSwgMC41KTsKICAgIHJldHVybiBtaXgobWl4Q29sb3IsIEJMQUNLLCAwLjUpOwp9CgoKZmxvYXQgZmlsbFBpcGVTbGVldmUoZmxvYXQgc2xlZXZlLCBpbnQgeCwgaW50IHksIHZlYzIgZGlyZWN0aW9uKSB7CiAgICByZXR1cm4gc2xlZXZlICogKAogICAgICAgIHRpbGVTdHJva2UoeCAgICAgICAgICAgICAgICAgICAsIHkgICAgLCBTTEVFVkVfQ1VGRiwgZGlyZWN0aW9uKSArCiAgICAgICAgdGlsZVN0cm9rZSh4ICAgICAgICAgICAgICAgICAgICwgeSArIDEsIFNMRUVWRV9DVUZGLCBkaXJlY3Rpb24pICsKICAgICAgICB0aWxlU3Ryb2tlKHggKyBpbnQoZGlyZWN0aW9uLngpLCB5ICsgMSwgU0xFRVZFX0NVRkYsIGRpcmVjdGlvbikKICAgICk7Cn0KCmZsb2F0IGZpbGxMZWZ0UGlwZVNob3VsZGVyKCkgewogICAgcmV0dXJuIGZsb2F0KAogICAgICAoIHRpbGUoV0lEVEggLSBTTEVFVkVfV0lEVEhfTUFYICsgMSwgSEVJR0hUIC0gMykgKwogICAgICAgIHRpbGVSZWN0KFdJRFRIIC0gU0xFRVZFX1dJRFRIX01BWCwgSEVJR0hUIC0gNCwgV0lEVEggLSBTTEVFVkVfV0lEVEhfTUFYICsgMSwgSEVJR0hUIC0gMSkgKQogICAgPiAwLjApOwp9CgpmbG9hdCBmaWxsUmlnaHRQaXBlU2hvdWxkZXIoKSB7CiAgICByZXR1cm4gZmxvYXQoCiAgICAgICggdGlsZShTTEVFVkVfV0lEVEhfTUFYIC0gMiwgSEVJR0hUIC0gMykgKwogICAgICAgIHRpbGVSZWN0KFNMRUVWRV9XSURUSF9NQVggLSAxLCBIRUlHSFQgLSA0LCBTTEVFVkVfV0lEVEhfTUFYLCBIRUlHSFQgLSAxKSApCiAgICA+IDAuMCk7Cn0KCnZlYzQgZmlsbFBpcGUoKSB7CiAgICBmbG9hdCBpc0ZpbGxlZCA9IGlzUGlwZSAqIGlzRmlsbCgpOwogICAgaW50IHlfc2xlZXZlX3N0YXJ0ID0gSEVJR0hUIC0gU0xFRVZFX1dJRFRIX01BWCAtIDE7CiAgICB2ZWM0IGNvbCA9IHZlYzQoMC4wKTsKICAgIGZsb2F0IGxlZnQgID0gaXNGaWxsZWQgKiAoZmlsbExlZnRTbGVldmVUb3AoKSAgKyBmaWxsTGVmdFNsZWV2ZUJvdHRvbSgpKTsKICAgIGZsb2F0IHJpZ2h0ID0gaXNGaWxsZWQgKiAoZmlsbFJpZ2h0U2xlZXZlVG9wKCkgKyBmaWxsUmlnaHRTbGVldmVCb3R0b20oKSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewogICAgICAgIGludCB4ID0gMSArIGkgKiAyOwogICAgICAgIGludCB5ID0gSEVJR0hUIC0gU0xFRVZFX1dJRFRIX01BWCAtIDEgKyBpICogMjsKICAgICAgICBmbG9hdCBzaG91bGRlciA9IGZsb2F0KGkgPT0gNCk7CiAgICAgICAgZmxvYXQgcmlnaHRTZWN0aW9uID0gZmlsbFBpcGVTbGVldmUocmlnaHQsIHgsIHksIFJJR0hUX0RPV04pICsgc2hvdWxkZXIgKiBmaWxsUmlnaHRQaXBlU2hvdWxkZXIoKTsKICAgICAgICBpZiAocmlnaHRTZWN0aW9uID4gMC4wKSB7CiAgICAgICAgICAgIGZsb2F0IGh1ZTEgPSBkcmF3RnJvbnRTaWRlID8gc2VnbWVudEh1ZXNbOCArIGldICAgICA6IHNlZ21lbnRIdWVzWzIwIC0gaV07CiAgICAgICAgICAgIGZsb2F0IGh1ZTIgPSBkcmF3RnJvbnRTaWRlID8gc2VnbWVudEh1ZXNbOCArIGkgLSAxXSA6IHNlZ21lbnRIdWVzWzIwIC0gaSAtIDFdOwogICAgICAgICAgICByZXR1cm4gbWl4UGlwZUNvbG9yKGh1ZTEsIGh1ZTIpOwogICAgICAgIH0KICAgICAgICB4ID0gV0lEVEggLSAyIC0gaSAqIDI7CiAgICAgICAgZmxvYXQgbGVmdFNlY3Rpb24gPSBmaWxsUGlwZVNsZWV2ZShsZWZ0LCB4LCB5LCBMRUZUX0RPV04pICsgc2hvdWxkZXIgKiBmaWxsTGVmdFBpcGVTaG91bGRlcigpOwogICAgICAgIGlmIChsZWZ0U2VjdGlvbiA+IDAuMCkgewogICAgICAgICAgICBmbG9hdCBodWUxID0gZHJhd0Zyb250U2lkZSA/IHNlZ21lbnRIdWVzWzIwIC0gaV0gICAgIDogc2VnbWVudEh1ZXNbOCArIGldOwogICAgICAgICAgICBmbG9hdCBodWUyID0gZHJhd0Zyb250U2lkZSA/IHNlZ21lbnRIdWVzWzIwIC0gaSAtIDFdIDogc2VnbWVudEh1ZXNbOCArIGkgLSAxXTsKICAgICAgICAgICAgcmV0dXJuIG1peFBpcGVDb2xvcihodWUxLCBodWUyKTsKICAgICAgICB9CgogICAgICAgIGlmIChzaG91bGRlciA8IDEuMCkgewogICAgICAgICAgICBmbG9hdCBsZWZ0UmliID0gaXNGaWxsZWQgKiB0aWxlU3Ryb2tlKFdJRFRIIC0gMiAtIGkgKiAyIC0gMSwgeSArIDIsIFNMRUVWRV9DVUZGLCBMRUZUX0RPV04pOwogICAgICAgICAgICBpZiAobGVmdFJpYiA+IDAuMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGh1ZTJyZ2JhKGRyYXdGcm9udFNpZGUgPyBzZWdtZW50SHVlc1syMCAtIDEgLSBpXSA6IHNlZ21lbnRIdWVzWzggKyBpIC0gMV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZsb2F0IHJpZ2h0UmliID0gaXNGaWxsZWQgKiB0aWxlU3Ryb2tlKGkgKiAyICsgMiwgeSArIDIsIFNMRUVWRV9DVUZGLCBSSUdIVF9ET1dOKTsKICAgICAgICAgICAgaWYgKHJpZ2h0UmliID4gMC4wKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaHVlMnJnYmEoZHJhd0Zyb250U2lkZSA/IHNlZ21lbnRIdWVzWzggKyBpXSA6IHNlZ21lbnRIdWVzWzIwIC0gaSAtIDFdKTsKICAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZm9yIChpbnQgaiA9IDE7IGogPD0gSEVJR0hUIC0gMTsgaisrKSB7CiAgICAgICAgZmxvYXQgc2VjdGlvbiA9IGlzRmlsbGVkICogdGlsZVJlY3QoU0xFRVZFX1dJRFRIX01BWCwgaiwgU0xFRVZFX1dJRFRIX01BWCArIFRPUlNPX1dJRFRILCBqICsgMSk7CiAgICAgICAgaWYgKHNlY3Rpb24gPiAwLjApIHsKICAgICAgICAgICAgYm9vbCBpc1JpYiA9IG1vZChmbG9hdChqICsgMSksIDQuMCkgPT0gMC4wOwogICAgICAgICAgICBpbnQgb2Zmc2V0ID0gKGogKyAxKSAvIDQ7CiAgICAgICAgICAgIGZsb2F0IGh1ZTEgPSBkcmF3RnJvbnRTaWRlID8gc2VnbWVudEh1ZXNbMTYgLSAoaiArIDEpIC8gNF0gOiBzZWdtZW50SHVlc1s0ICsgKGogKyAxKSAvIDRdOwogICAgICAgICAgICBmbG9hdCBodWUyID0gZHJhd0Zyb250U2lkZSA/IHNlZ21lbnRIdWVzWzE1IC0gKGogKyAxKSAvIDRdIDogc2VnbWVudEh1ZXNbMyArIChqICsgMSkgLyA0XTsKICAgICAgICAgICAgcmV0dXJuIGlzUmliID8gaHVlMnJnYmEoaHVlMSkgOiBtaXhQaXBlQ29sb3IoaHVlMSwgaHVlMik7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGNvbDsKfQoKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyAgUGF0dGVybnMKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgpmbG9hdCBkb3R0ZWRQYXR0ZXJuKHZlYzIgcG9pbnQsIGZsb2F0IHJhZGl1cywgZmxvYXQgY2VsbFNpemUpIHsKICAgIHZlYzIgb2Zmc2V0ID0gbW9kKHBvaW50LCBjZWxsU2l6ZSk7CiAgICByZXR1cm4gZmxvYXQob2Zmc2V0LnggPCByYWRpdXMgJiYgb2Zmc2V0LnkgPCByYWRpdXMpOwp9CgpmbG9hdCBzbGlua3lSaWJzKCkgewogICAgZmxvYXQgcmV0ID0gMC4wOwogICAgYm9vbCBpc1RvcnNvID0gKGZpbGxUb3Jzb1RvcCgpICsgZmlsbFRvcnNvQm90dG9tKCkpID4gMC4wOwogICAgaWYgKGlzVG9yc28pIHsKICAgICAgICBmb3IgKGludCBpID0gNDsgaSA8IEhFSUdIVCAtIDE7IGkgKz0gNCkgewogICAgICAgICAgICByZXQgKz0gdGlsZVJlY3QoU0xFRVZFX1dJRFRIX01BWCwgaSwgU0xFRVZFX1dJRFRIX01BWCArIFRPUlNPX1dJRFRILCBpICsgMSk7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBib29sIHJpZ2h0U2xlZXZlID0gKGZpbGxSaWdodFNsZWV2ZVRvcCgpICsgZmlsbFJpZ2h0U2xlZXZlQm90dG9tKCkpID4gMC4wOwogICAgICAgIGlmIChpc0h5cGVyUmFpbmJvdyA+IDAuMCkgewogICAgICAgICAgICBmbG9hdCByYWluYm93UmlicyA9IDAuMDsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA0OyBpKyspIHsKICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSAoaSAtIDEpICogMyArIDE7CiAgICAgICAgICAgICAgICBpbnQgeCA9IHJpZ2h0U2xlZXZlID8gb2Zmc2V0IDogV0lEVEggLSBvZmZzZXQgLSAxOwogICAgICAgICAgICAgICAgaW50IHkgPSBIRUlHSFQgLSAxIC0gU0xFRVZFX1dJRFRIX01BWCArIG9mZnNldDsKICAgICAgICAgICAgICAgIHZlYzIgZCA9IHJpZ2h0U2xlZXZlID8gUklHSFRfRE9XTiA6IExFRlRfRE9XTjsKICAgICAgICAgICAgICAgIHJhaW5ib3dSaWJzICs9CiAgICAgICAgICAgICAgICAgICAgICB0aWxlU3Ryb2tlKHgsIHkgKyAxLCBIRUlHSFQsIGQpCiAgICAgICAgICAgICAgICAgICAgKyB0aWxlU3Ryb2tlKHgsIHkgICAgLCBIRUlHSFQsIGQpCiAgICAgICAgICAgICAgICAgICAgKyB0aWxlU3Ryb2tlKHgsIHkgLSAxLCBIRUlHSFQsIGQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldCArPSAoMS4wIC0gZmxvYXQocmFpbmJvd1JpYnMgPiAwLjApKTsKICAgICAgICB9ICBlbHNlIHsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gNDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gaSAqIDI7CiAgICAgICAgICAgICAgICBpbnQgeCA9IHJpZ2h0U2xlZXZlID8gb2Zmc2V0OiBXSURUSCAtIG9mZnNldCAtIDE7CiAgICAgICAgICAgICAgICBpbnQgeSA9IEhFSUdIVCAtIFNMRUVWRV9XSURUSF9NQVggKyAoaSAtIDEpICogMzsKICAgICAgICAgICAgICAgIHZlYzIgZCA9IHJpZ2h0U2xlZXZlID8gUklHSFRfRE9XTiA6IExFRlRfRE9XTjsKICAgICAgICAgICAgICAgIHJldCArPSB0aWxlU3Ryb2tlKHgsIHkgKyAxLCBIRUlHSFQsIGQpICsgdGlsZVN0cm9rZSh4LCB5ICsgMiwgSEVJR0hULCBkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXQ7Cn0KCmZsb2F0IHNsaW5reVBhdHRlcm4oKSB7CiAgICB2ZWMyIHBvaW50ID0gZ2xfRnJhZ0Nvb3JkLnh5OwogICAgZmxvYXQgY2VsbFNpemUgPSBtYXgodGlsZVNpemUsIDMuKTsKICAgIGZsb2F0IHJhZGl1cyA9IG1heCh0aWxlU2l6ZSAvIDMuLCAxLik7CiAgICBwb2ludCA9IHBvaW50IC0gdmVjMih0aWxlU2l6ZSAvIDMuMCk7CgkgIGZsb2F0IHBhdHRlcm4gPSAoMS4wIC0gc2xpbmt5UmlicygpKSAqIGRvdHRlZFBhdHRlcm4ocG9pbnQsIHJhZGl1cywgY2VsbFNpemUpOwogICAgcmV0dXJuIHBhdHRlcm47Cn0KCnZlYzQgc2xpbmt5KHZlYzQgY29sb3IpIHsKICAgIGlmIChpc0h5cGVyUmFpbmJvdyA8IDEuMCkgewogICAgICAgIGJvb2wgaXNUb3Jzb0Zyb250ID0gZHJhd0Zyb250U2lkZSAmJiAoZmlsbFRvcnNvVG9wKCkgKyBmaWxsVG9yc29Cb3R0b20oKSA+IDAuMCk7CiAgICAgICAgdmVjNCByaWJDb2xvciA9IGlzVG9yc29Gcm9udCA/IGh1ZTJyZ2JhKGZpbGxIdWVzWzBdKSA6IGh1ZTJyZ2JhKGZpbGxIdWVzWzJdKTsKICAgICAgICBmbG9hdCBzbGlua3lGYWN0b3IgPSBzbGlua3lSaWJzKCkgKiBpc1NsaW5reSAqIGlzRmlsbCgpICogKGlzSHlwZXJSYWluYm93ID4gMC4wID8gMC4wIDogMC41KTsKICAgICAgICBjb2xvciA9IG1peChjb2xvciwgcmliQ29sb3IsIHNsaW5reUZhY3Rvcik7CiAgICB9CgkgIGZsb2F0IGFwcGx5U2xpbmt5ID0gaXNTbGlua3kgKiBpc0ZpbGwoKSAqIHNsaW5reVBhdHRlcm4oKTsKICAgIHZlYzQgc2xpbmt5Q29sb3IgPSB2ZWM0KDEuMCk7CiAgICByZXR1cm4gYXBwbHlTbGlua3kgKiBzbGlua3lDb2xvciArICgxLjAgLSBhcHBseVNsaW5reSkgKiBjb2xvcjsKfQoKLy8gRnV6enkKCmZsb2F0IGZ1enp5UGF0dGVybigpIHsKICAgIHZlYzIgcG9pbnQgPSBnbF9GcmFnQ29vcmQueHk7CiAgICBmbG9hdCByYWRpdXMgPSAoY2VpbChjZWlsKHRpbGVTaXplKSAvIDIuKSAqIDIuKSAvIDMuOwogICAgZmxvYXQgY2VsbFNpemUgPSBtYXgocmFkaXVzICogMy4sIDMuKTsKICAgIGZsb2F0IHRpbGVYID0gZmxvb3IocG9pbnQueCAvIHRpbGVTaXplKTsKICAgIHZlYzIgb2Zmc2V0ID0gbW9kKHBvaW50LCBjZWxsU2l6ZSk7CiAgICBmbG9hdCB4bW9kID0gY2VpbChtb2QodGlsZVgsIDIuKSk7CiAgICBmbG9hdCB5TWluID0gZmxvb3IoeG1vZCAqIHJhZGl1cyAvIDMuKSAqIDMuOwogICAgZmxvYXQgeU1heCA9IGNlaWwoKDEuICsgeG1vZCkgKiByYWRpdXMgLyAzLikgKiAzLjsKICAgIGZsb2F0IHhNaW4gPSBmbG9vcihyYWRpdXMgLyAzLikgKiAzLjsKICAgIGZsb2F0IHhNYXggPSBjZWlsKDIuICogcmFkaXVzIC8gMy4pICogMy47CiAgICByZXR1cm4gZmxvYXQob2Zmc2V0LnggPj0geE1pbiAmJiBvZmZzZXQueCA8PSB4TWF4ICYmIG9mZnNldC55ID49IHlNaW4gJiYgb2Zmc2V0LnkgPD0geU1heCk7Cn0KCnZlYzQgZnV6enkodmVjNCBjb2xvcikgewogICAgZmxvYXQgYXBwbHlGdXp6eSA9IGlzRnV6enkgKiBmdXp6eVBhdHRlcm4oKSAqIGlzRmlsbCgpOwogICAgdmVjNCBmdXp6eUNvbG9yID0gbWl4KGNvbG9yLCB2ZWM0KHZlYzMoMC4wKSwgMS4wKSwgMC40KTsKICAgIHJldHVybiBhcHBseUZ1enp5ICogZnV6enlDb2xvciArICgxLjAgLSBhcHBseUZ1enp5KSAqIGNvbG9yOwp9CgpmbG9hdCBib2xkUGF0dGVybigpIHsKICAgIGZsb2F0IHJldCA9IDAuMDsKICAgIGZvcihpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKICAgICAgICByZXQgKz0gdGlsZVJlY3QoU0xFRVZFX1dJRFRIX01BWCArIGkgKiAyLCAxLCBTTEVFVkVfV0lEVEhfTUFYICsgaSAqIDIgKyAxLCBIRUlHSFQgLSAxKTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgICAgaW50IGN1dCA9IGkgPT0gMyA/IDIgOiAxOwogICAgICAgIGludCB5ID0gSEVJR0hUIC0gU0xFRVZFX1dJRFRIX01BWCAtIGk7CiAgICAgICAgaW50IGxlbiA9IFNMRUVWRV9XSURUSF9NQVggLSBpIC0gY3V0OwogICAgICAgIHJldCArPSB0aWxlU3Ryb2tlKGkgKyAxLCB5LCBsZW4sIFJJR0hUX1VQKTsKICAgICAgICByZXQgKz0gdGlsZVN0cm9rZShXSURUSCAtIDIgLSBpLCB5LCBsZW4sIExFRlRfVVApOwogICAgfQogICAgcmV0dXJuIGZsb2F0KHJldCA+IDAuMCk7Cn0KCnZlYzQgYm9sZCh2ZWM0IGNvbG9yKSB7CiAgICBmbG9hdCBhcHBseUJvbGQgPSBpc0JvbGQgKiBib2xkUGF0dGVybigpICogaXNGaWxsKCk7CiAgICB2ZWM0IGJvbGRDb2xvciA9IG1peChjb2xvciwgdmVjNCh2ZWMzKDAuMCksIDEuMCksIDAuNSk7CiAgICByZXR1cm4gYXBwbHlCb2xkICogYm9sZENvbG9yICsgKDEuMCAtIGFwcGx5Qm9sZCkgKiBjb2xvcjsKfQoKZmxvYXQgcmliYmVkUGF0dGVybigpIHsKICAgIGZsb2F0IHJldCA9IDAuMDsKICAgIGZsb2F0IHggPSBnbF9GcmFnQ29vcmQueDsKICAgIGZsb2F0IHkgPSBnbF9GcmFnQ29vcmQueTsKICAgIGZsb2F0IHdfMyA9IGZsb2F0KFdJRFRIIC8gMykgKiB0aWxlU2l6ZTsKICAgIGZsb2F0IHdfMl8zID0gMi4gKiB3XzM7CiAgICBmbG9hdCByaWJXaWR0aCA9IHRpbGVTaXplIC8gMy47CiAgICBmbG9hdCByaWJYID0gMS4gKiB0aWxlU2l6ZTsKICAgIGZsb2F0IHJpYlkgPQogICAgICAgICAgZmxvYXQoeCA+PSAgd18zICYmIHggPD0gd18yXzMpICogMi4gKiB0aWxlU2l6ZQogICAgICAgICsgZmxvYXQoeCA8ICAgd18zKSAgICAgICAgICAgICAgICogMy4gKiB0aWxlU2l6ZQogICAgICAgICsgZmxvYXQoeCA+ICAgd18yXzMpICAgICAgICAgICAgICogMy4gKiB0aWxlU2l6ZTsKICAgIGZsb2F0IG9mZnNldFggPSB0aWxlU2l6ZSAvIDYuOwogICAgZmxvYXQgb2Zmc2V0WSA9CiAgICAgICAgICBmbG9hdCh4ID49ICB3XzMgJiYgeCA8PSB3XzJfMykgKiAoLXRpbGVTaXplICsgcmliV2lkdGggLyAyLikKICAgICAgICArIGZsb2F0KHggPCAgIHdfMykgICAgICAgICAgICAgICAqICggY2VpbCh4IC8gdGlsZVNpemUpICogdGlsZVNpemUgKyB0aWxlU2l6ZSArIHJpYldpZHRoIC8gMi4pCiAgICAgICAgKyBmbG9hdCh4ID4gICB3XzJfMykgICAgICAgICAgICAgKiAoLWNlaWwoeCAvIHRpbGVTaXplKSAqIHRpbGVTaXplIC0gdGlsZVNpemUgKyByaWJXaWR0aCAvIDIuKTsKICAgIHkgKz0gb2Zmc2V0WTsKICAgIHggKz0gb2Zmc2V0WDsKICAgIGlmIChtb2QoeCwgcmliWCkgPCByaWJXaWR0aCB8fAogICAgICAgIG1vZCh5LCByaWJZKSA8IHJpYldpZHRoICl7CiAgICAgICAgcmV0ICs9IDEuMDsKICAgIH0KICAgIHJldCArPSB0aWxlUmVjdChTTEVFVkVfV0lEVEhfTUFYLCAxLCBTTEVFVkVfV0lEVEhfTUFYICsgVE9SU09fV0lEVEgsIDIpOwogICAgcmV0ICs9IHRpbGVTdHJva2UoMSAgICAgICAgLCBIRUlHSFQgLSBTTEVFVkVfV0lEVEhfTUFYIC0gMSwgU0xFRVZFX0NVRkYgLSAxLCBSSUdIVF9ET1dOKTsKICAgIHJldCArPSB0aWxlU3Ryb2tlKFdJRFRIIC0gMiwgSEVJR0hUIC0gU0xFRVZFX1dJRFRIX01BWCAtIDEsIFNMRUVWRV9DVUZGIC0gMSwgTEVGVF9ET1dOKTsKICAgIHJldHVybiBmbG9hdChyZXQgPiAwLjApOwp9Cgp2ZWM0IHJpYmJlZCh2ZWM0IGNvbG9yKSB7CiAgICBmbG9hdCBhcHBseVJpYmJlZCA9IGlzUmliYmVkICogcmliYmVkUGF0dGVybigpICogaXNGaWxsKCk7CiAgICB2ZWM0IHJpYmJlZENvbG9yID0gdmVjNCh2ZWMzKHJpYmJlZEh1ZSksIDEuMCk7CiAgICByZXR1cm4gYXBwbHlSaWJiZWQgKiByaWJiZWRDb2xvciArICgxLjAgLSBhcHBseVJpYmJlZCkgKiBjb2xvcjsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vICBNYWluIEZ1bmN0aW9ucwovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCnZlYzQgZHJhd0JvcmRlcigpIHsKICAgIHZlYzQgY29sb3IgPSB2ZWM0KHZlYzMoaXNSaWJiZWQgKiByaWJiZWRIdWUpLCAxLjApOwogICAgcmV0dXJuIGlzQm9yZGVyKCkgKiBjb2xvcjsKfQoKdmVjNCBhcHBseVBhdHRlcm5zKHZlYzQgY29sb3IpIHsKICAgIGNvbG9yID0gYm9sZChjb2xvcik7CiAgICBjb2xvciA9IGZ1enp5KGNvbG9yKTsKICAgIGNvbG9yID0gc2xpbmt5KGNvbG9yKTsKICAgIGNvbG9yID0gcmliYmVkKGNvbG9yKTsKICAgIHJldHVybiBjb2xvcjsKfQoKdmVjNCBmaWxsKCkgewogICAgZmxvYXQgZGVmYXVsdEZpbGwgPSAxLjAgLSBpc1BpcGUgLSBpc0h5cGVyUmFpbmJvdzsKICAgIHZlYzQgZmlsbENvbG9yID0KICAgICAgICBpc1BpcGUgICAgICAgICAqIGZpbGxQaXBlKCkKICAgICAgKyBpc0h5cGVyUmFpbmJvdyAqIGZpbGxIeXBlclJhaW5ib3coKQogICAgICArIGRlZmF1bHRGaWxsICAgICogZmlsbENvbG9yKCk7CiAgICBmaWxsQ29sb3IgPSBhcHBseVBhdHRlcm5zKGZpbGxDb2xvcik7CiAgICByZXR1cm4gZmlsbENvbG9yOwp9Cgp2b2lkIG1haW4oKSB7CiAgICBnbF9GcmFnQ29sb3IgPSBkcmF3Qm9yZGVyKCkgKyBmaWxsKCk7Cn0KYDsKPC9zY3JpcHQ+Cgo8c2NyaXB0PgogIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjYW52YXMiKTsKICBjb25zdCB7IGdsLCBwcm9ncmFtIH0gPSBnbEluaXRpYWxpemUoY2FudmFzKQoKICBjb25zdCBtYXAgPSAobiwgc3RhcnQxLCBzdG9wMSwgc3RhcnQyLCBzdG9wMikgPT4gewogICAgcmV0dXJuICgobiAtIHN0YXJ0MSkgLyAoc3RvcDEgLSBzdGFydDEpKSAqIChzdG9wMiAtIHN0YXJ0MikgKyBzdGFydDI7CiAgfTsKCiAgbGV0IG51bUhhc2hlcyA9IHRva2VuSGFzaC5sZW5ndGg7CiAgbGV0IGhhc2hQYWlycyA9IFtdOwogIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtSGFzaGVzOyBpKyspIHsKICAgIGZvciAobGV0IGogPSAwOyBqIDwgMzI7IGorKykgewogICAgICBoYXNoUGFpcnMucHVzaCh0b2tlbkhhc2guc2xpY2UoMiArIGogKiAyLCA0ICsgaiAqIDIpKTsKICAgIH0KICB9CiAgY29uc3QgZGVjUGFpcnMgPSBoYXNoUGFpcnMubWFwKCh4KSA9PiBwYXJzZUludCh4LCAxNikpOwoKICBsZXQgc3RhcnRDb2xvciA9IGRlY1BhaXJzWzI5XTsgLy8gMC0yNTUKICBsZXQgcmV2ZXJzZSA9IGRlY1BhaXJzWzMwXSA8IDEyODsgLy8gMCBvciAxCiAgbGV0IHNsaW5reSA9IGRlY1BhaXJzWzMxXSA8IDM1OyAvLyAwIG9yIDEKICBsZXQgcGlwZSA9IGRlY1BhaXJzWzIyXSA8IDMyOyAvLyAwIG9yIDEKICBsZXQgYm9sZCA9IGRlY1BhaXJzWzIzXSA8IDE1OyAvLyAwIG9yIDEKICBsZXQgcmliYmVkID0gZGVjUGFpcnNbMjRdIDwgMzA7IC8vIDAgb3IgMQogIGxldCBmdXp6eSA9IHBpcGUgJiYgIXNsaW5reTsgLy8gMCBvciAxCiAgbGV0IHNlZ21lbnRzID0gbWFwKGRlY1BhaXJzWzI2XSwgMCwgMjU1LCAxMiwgMjApOyAvLyAxMi0yMAogIGxldCBzdGVwcyA9IHNsaW5reSA/IDUwIDogZnV6enkgPyAxMDAwIDogMjAwOyAvLyA1MCwgMjAwLCAxMDAwCiAgbGV0IHNwcmVhZCA9IGRlY1BhaXJzWzI4XSA8IDMgPyAwLjUgOiBtYXAoZGVjUGFpcnNbMjhdLCAwLCAyNTUsIDUsIDUwKTsgLy8gMC41LCA1LTUwCiAgbGV0IGh5cGVyUmFpbmJvdyA9IHNwcmVhZCA9PSAwLjU7IC8vIDAgb3IgMQogIGxldCByaWJiZWRIdWUgPSBkZWNQYWlyc1syNV07IC8vIDAtMjU1CgogIGlmIChmdXp6eSkgIHNsaW5reSA9IHJpYmJlZCA9IHBpcGUgPSBib2xkID0gZmFsc2U7CiAgaWYgKHBpcGUpICAgcmliYmVkID0gc2xpbmt5ID0gYm9sZCA9IGZhbHNlOwogIGlmIChzbGlua3kpIHJpYmJlZCA9IGJvbGQgPSBmYWxzZTsKICBpZiAoYm9sZCkgICByaWJiZWQgPSBmYWxzZTsKCiAgY29uc3QgU1BFRURfU1RFUCA9IDEwOwogIGNvbnN0IE1JTl9TUEVFRCA9IDEwOwogIGNvbnN0IE1BWF9TUEVFRCA9IDIwMDsKICBsZXQgc3BlZWQgPSAxMDA7CiAgbGV0IGluZGV4ID0gMDsKICBsZXQgbG9vcHMgPSBmYWxzZTsKICBsZXQgZnJvbnRTaWRlID0gdHJ1ZTsKICBsZXQgZGlyZWN0aW9uID0gMTsKICBsZXQgYmFja2dyb3VuZEluZGV4ID0gdG9rZW5JZCA8IDAgPyAxMCA6IDA7CiAgY29uc3QgYmFja2dyb3VuZEFycmF5ID0gWzI1NSwgMjI1LCAyMDAsIDE3NSwgMTUwLCAxMjUsIDEwMCwgNzUsIDUwLCAyNSwgMCwgMjUsIDUwLCA3NSwgMTAwLCAxMjUsIDE1MCwgMTc1LCAyMDAsIDIyNSxdOwogIGxldCBjYXB0dXJlRnJhbWUgPSBmYWxzZTsKICBsZXQgcmVuZGVyQ2FudmFzID0gdHJ1ZTsKCiAgc2V0QmFja2dyb3VuZCgpCiAgZ2xTZXRDb25zdGFudFVuaWZvcm1zKCk7CiAgc2V0dXBHZXN0dXJlcygpOwogIHJlbmRlclN0ZWVyaW5nKCk7CiAgcmVuZGVyKCk7CgogIGZ1bmN0aW9uIHNsZWVwKG1zKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7CiAgfQoKICBjbGFzcyBIdWVQaWNrZXIgewogICAgY29uc3RydWN0b3IoY29sb3IsIHNlZ21lbnRzLCBzdGVwcywgc3ByZWFkLCBhbGxIdWVzKSB7CiAgICAgIHRoaXMuY29sb3IgPSBjb2xvcjsKICAgICAgdGhpcy5zZWdtZW50cyA9IHNlZ21lbnRzOwogICAgICB0aGlzLnN0ZXBzID0gc3RlcHM7CiAgICAgIHRoaXMuc3ByZWFkID0gc3ByZWFkOwogICAgICB0aGlzLmFsbEh1ZXMgPSBhbGxIdWVzOwogICAgfQoKICAgIHBpY2soc2VjdGlvbiwgb2Zmc2V0KSB7CiAgICAgIGNvbnN0IGxlbiA9IHRoaXMuY29sb3I7CiAgICAgIGNvbnN0IGh1ZVN0ZXAgPSBNYXRoLmZsb29yKCgodGhpcy5zZWdtZW50cyAtIDEpIC8gNCkgKiB0aGlzLnN0ZXBzKTsKICAgICAgY29uc3QgbWVkaWFuSHVlID0gTWF0aC5mbG9vcihodWVTdGVwIC8gMik7CiAgICAgIGNvbnN0IGhhbGZIdWVTdGVwID0gTWF0aC5mbG9vcihvZmZzZXQgKiAoTWF0aC5hYnMoNTAgLSB0aGlzLnNwcmVhZCkgLyA1MCkgKiBodWVTdGVwICogdGhpcy5zdGVwcyAvIDEwMDApOwogICAgICBjb25zdCBpbmRleCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMuYWxsSHVlcy5sZW5ndGggLSAxLCAobWVkaWFuSHVlICsgc2VjdGlvbiAqIGh1ZVN0ZXAgKyBoYWxmSHVlU3RlcCkpKTsKICAgICAgY29uc3QgaHVlID0gdGhpcy5hbGxIdWVzW2luZGV4ICUgbGVuXTsKICAgICAgcmV0dXJuIGh1ZTsKICAgIH0KICB9CgogIGFzeW5jIGZ1bmN0aW9uIHJlbmRlclN0ZWVyaW5nKCkgewogICAgd2hpbGUgKHRydWUpIHsKICAgICAgYXdhaXQgc2xlZXAoMTIpCiAgICAgIGlmIChsb29wcykgewogICAgICAgIGluZGV4ICs9IHNwZWVkIC8gMTAwOwogICAgICAgIHJlbmRlckNhbnZhcyA9IHRydWU7CiAgICAgIH0KICAgIH0KICB9CgogIGFzeW5jIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBhd2FpdCBzbGVlcCgxMDAwLzI0KQogICAgICAgIGlmICghcmVuZGVyQ2FudmFzKSBjb250aW51ZTsKCiAgICAgICAgbGV0IGFsbEh1ZXMgPSBbXTsKICAgICAgICBsZXQgc2VnbWVudEh1ZXMgPSBbXTsKICAgICAgICBsZXQgY29sb3IgPSAwOwogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2VnbWVudHMgLSAyOyBqKyspIHsKICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHN0ZXBzOyBpKyspIHsKICAgICAgICAgICAgbGV0IGh1ZSA9IHJldmVyc2UgPyAyNTUgLSAoKChjb2xvciAvIHNwcmVhZCkgKyBzdGFydENvbG9yICsgaW5kZXgpICUgMjU1KSA6ICgoKGNvbG9yIC8gc3ByZWFkKSArIHN0YXJ0Q29sb3IpICsgaW5kZXgpICUgMjU1OwogICAgICAgICAgICBhbGxIdWVzLnB1c2goaHVlKTsKICAgICAgICAgICAgaWYgKGkgPT0gMCkgewogICAgICAgICAgICAgIHNlZ21lbnRIdWVzLnB1c2goaHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb2xvciArPSAxOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzZWdtZW50SHVlcy5wdXNoKGFsbEh1ZXNbYWxsSHVlcy5sZW5ndGggLSAxXSk7CiAgICAgICAgc2VnbWVudEh1ZXMucmV2ZXJzZSgpOwoKICAgICAgICBsZXQgc2VjdGlvbkh1ZXMgPSBbXTsKICAgICAgICBsZXQgc2VjdGlvbnMgPSAyMDsKICAgICAgICBsZXQgZmlsbEh1ZXMgPSBbXTsKICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHNlY3Rpb25zOyBrKyspIHsKICAgICAgICAgIHNlY3Rpb25IdWVzW2tdID0gc2VnbWVudEh1ZXNbayAlIHNlZ21lbnRIdWVzLmxlbmd0aF07CiAgICAgICAgfQogICAgICAgIGlmIChwaXBlKSAgc2VjdGlvbkh1ZXMgPSBzZWN0aW9uSHVlcy5yZXZlcnNlKCk7CgogICAgICAgIGNvbnN0IHBpY2tlciA9IG5ldyBIdWVQaWNrZXIoY29sb3IsIHNlZ21lbnRzLCBzdGVwcywgc3ByZWFkLCBhbGxIdWVzKQogICAgICAgIGNvbnN0IGZpbGxIdWVzU2VjdGlvbnMgPSBbMywgMywgMiwgMiwgMSwgMSwgMCwgMF07CiAgICAgICAgY29uc3QgZmlsbEh1ZXNPZmZzZXRzID0gewogICAgICAgICAgZnV6enk6IFswLCAwLCAwLCAwLCAxLCAtMSwgLTEsIDFdLAogICAgICAgICAgc2xpbmt5OiBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF0sCiAgICAgICAgICBib2xkOiBbMCwgMCwgLTEsIDEsIDEsIC0xLCAwLCAwXSwKICAgICAgICAgIHJpYmJlZDogWzAsIDAsIDEsIC0xLCAxLCAxLCAtMSwgMV0sCiAgICAgICAgICBub3JtYWw6IFsxLCAtMSwgMCwgMCwgMCwgMCwgMCwgMF0KICAgICAgICB9CiAgICAgICAgY29uc3QgcGlja2VyVHlwZSA9IHNsaW5reSA/ICdzbGlua3knIDogZnV6enkgPyAnZnV6enknIDogYm9sZCA/ICdib2xkJyA6IHJpYmJlZCA/ICdyaWJiZWQnIDogJ25vcm1hbCc7CiAgICAgICAgY29uc3Qgb2Zmc2V0cyA9IGZpbGxIdWVzT2Zmc2V0c1twaWNrZXJUeXBlXTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGxIdWVzU2VjdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgZmlsbEh1ZXMucHVzaChwaWNrZXIucGljayhmaWxsSHVlc1NlY3Rpb25zW2ldLCBvZmZzZXRzW2ldKSk7CiAgICAgICAgfQogICAgICAgIGdsU2V0UmVuZGVyVW5pZm9ybXMoc2VjdGlvbkh1ZXMsIGZpbGxIdWVzKTsKICAgICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUKTsKICAgICAgICBnbC5kcmF3QXJyYXlzKGdsLlRSSUFOR0xFX1NUUklQLCAwLCA0KTsKICAgICAgICByZW5kZXJDYW52YXMgPSBmYWxzZTsKICAgICAgICBpZiAoY2FwdHVyZUZyYW1lKSB7CiAgICAgICAgICBjYXB0dXJlRnJhbWUgPSBmYWxzZTsKICAgICAgICAgIHNhdmVDYW52YXMoKTsKICAgICAgICB9CiAgICAgIH0KICB9CgogIGZ1bmN0aW9uIHRvZ2dsZUxvb3AoKSB7CiAgICBsb29wcyA9ICFsb29wczsKICAgIHJlbmRlckNhbnZhcyA9IHRydWU7CiAgfQoKICBmdW5jdGlvbiB0b2dnbGVGcm9udFNpZGUoKSB7CiAgICBmcm9udFNpZGUgPSAhZnJvbnRTaWRlOwogICAgcmVuZGVyQ2FudmFzID0gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIHNwZWVkVXAoKSB7CiAgICBpZiAoc3BlZWQgPCBNQVhfU1BFRUQpIHsKICAgICAgc3BlZWQgPSBzcGVlZCArIFNQRUVEX1NURVA7CiAgICAgIHJlbmRlckNhbnZhcyA9IHRydWU7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBzcGVlZERvd24oKSB7CiAgICBpZiAoc3BlZWQgPiBNSU5fU1BFRUQpIHsKICAgICAgc3BlZWQgPSBzcGVlZCAtIFNQRUVEX1NURVA7CiAgICAgIHJlbmRlckNhbnZhcyA9IHRydWU7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBzZXRCYWNrZ3JvdW5kKCkgewogICAgY29uc3QgcmdiID0gYmFja2dyb3VuZEFycmF5W2JhY2tncm91bmRJbmRleF07CiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmJhY2tncm91bmQgPSBgcmdiKCR7cmdifSwgJHtyZ2J9LCAke3JnYn0pYDsKICAgIHJlbmRlckNhbnZhcyA9IHRydWU7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVCYWNrZ3JvdW5kKCkgewogICAgaWYgKGJhY2tncm91bmRJbmRleCA8IGJhY2tncm91bmRBcnJheS5sZW5ndGggLSAxKSB7CiAgICAgIGJhY2tncm91bmRJbmRleCArPSAxOwogICAgfSBlbHNlIHsKICAgICAgYmFja2dyb3VuZEluZGV4ID0gMDsKICAgIH0KICAgIHNldEJhY2tncm91bmQoKTsKICB9CgogIGZ1bmN0aW9uIHJlc2V0KCkgewogICAgYmFja2dyb3VuZEluZGV4ID0gdG9rZW5JZCA8IDAgPyAxMCA6IDA7CiAgICBzZXRCYWNrZ3JvdW5kKCk7CiAgICBpbmRleCA9IDA7CiAgICBzcGVlZCA9IDEwMDsKICAgIGxvb3BzID0gZmFsc2U7CiAgICByZW5kZXJDYW52YXMgPSB0cnVlOwogIH0KCiAgZnVuY3Rpb24gc2F2ZUNhbnZhcygpIHsKICAgIGxldCBjYW52YXNVcmwgPSBjYW52YXMudG9EYXRhVVJMKCk7CiAgICBjb25zdCBjcmVhdGVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgIGNyZWF0ZUVsLmhyZWYgPSBjYW52YXNVcmw7CiAgICB2YXIgbmFtZSA9IHRva2VuSWQgPj0gMCA/ICJTcXVpZ2dsZSIgOiAiR2VuZXJhdGVkIgogICAgY3JlYXRlRWwuZG93bmxvYWQgPSAiT0REU18iICsgbmFtZSArICIucG5nIjsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY3JlYXRlRWwpOwogICAgY3JlYXRlRWwuY2xpY2soKTsKICAgIGNyZWF0ZUVsLnJlbW92ZSgpOwogIH0KCiAgZnVuY3Rpb24ga2V5UHJlc3NlZChlKSB7CiAgICBpZiAoZS5rZXlDb2RlID09PSAzMikgewogICAgICB1cGRhdGVCYWNrZ3JvdW5kKCk7CiAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAiQXJyb3dEb3duIikgewogICAgICBzcGVlZERvd24oKTsKICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICJBcnJvd1VwIikgewogICAgICBzcGVlZFVwKCk7CiAgICB9IGVsc2UgaWYgKFsiU2hpZnQiLCAiQXJyb3dMZWZ0IiwgIkFycm93UmlnaHQiXS5pbmNsdWRlcyhlLmtleSkpIHsKICAgICAgdG9nZ2xlRnJvbnRTaWRlKCk7CiAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAiciIpIHsKICAgICAgcmVzZXQoKQogICAgfSBlbHNlIGlmIChlLmtleSA9PT0gInMiKSB7CiAgICAgIGNhcHR1cmVGcmFtZSA9IHRydWU7CiAgICAgIHJlbmRlckNhbnZhcyA9IHRydWU7CiAgICAgIHJlbmRlcigpOwogICAgfQogICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogIH0KCiAgbGV0IGxhc3RUYXAgPSAwOwogIGxldCB0aW1lb3V0SG9sZGVyOwogIGZ1bmN0aW9uIGhhbmRsZVRvdWNoVGFwKGUpIHsKICAgIGxldCBjdXJyZW50VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgbGV0IHRhcExlbmd0aCA9IGN1cnJlbnRUaW1lIC0gbGFzdFRhcDsKICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SG9sZGVyKTsKCiAgICBpZiAodGFwTGVuZ3RoIDwgMjUwICYmIHRhcExlbmd0aCA+IDApIHsKICAgICAgdXBkYXRlQmFja2dyb3VuZCgpOwogICAgfSBlbHNlIGlmICh0YXBMZW5ndGggPiAyNTAgJiYgdGFwTGVuZ3RoIDwgNTAwKSB7CiAgICAgIHJlc2V0KCk7CiAgICB9IGVsc2UgewogICAgICB0aW1lb3V0SG9sZGVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgdG9nZ2xlTG9vcCgpOwogICAgICB9LCAyNTApOwogICAgfQogICAgbGFzdFRhcCA9IGN1cnJlbnRUaW1lOwogIH0KCiAgbGV0IHN0YXJ0VG91Y2hYLCBzdGFydFRvdWNoWTsKICBmdW5jdGlvbiBoYW5kbGVUb3VjaFN0YXJ0KGUpIHsKICAgIHN0YXJ0VG91Y2hYID0gZS50b3VjaGVzWzBdLmNsaWVudFg7CiAgICBzdGFydFRvdWNoWSA9IGUudG91Y2hlc1swXS5jbGllbnRZOwogIH0KCiAgZnVuY3Rpb24gaGFuZGxlVG91Y2hFbmQoZSkgewogICAgY29uc3QgZW5kVG91Y2hYID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYOwogICAgY29uc3QgZW5kVG91Y2hZID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZOwogICAgY29uc3QgZGlmZlggPSBzdGFydFRvdWNoWCAtIGVuZFRvdWNoWDsKICAgIGNvbnN0IGRpZmZZID0gc3RhcnRUb3VjaFkgLSBlbmRUb3VjaFk7CiAgICBpZiAoTWF0aC5hYnMoZGlmZlgpID4gMjAwKSB7CiAgICAgIHRvZ2dsZUZyb250U2lkZSgpOwogICAgfSBlbHNlIGlmIChNYXRoLmFicyhkaWZmWSkgPiAyMDApIHsKICAgICAgaWYgKGRpZmZZID4gMCkgewogICAgICAgIHNwZWVkVXAoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzcGVlZERvd24oKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaGFuZGxlVG91Y2hUYXAoZSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBoYW5kbGVUb3VjaChlKSB7CiAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICBpZiAoZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggPT09IDEpIHsKICAgICAgY29uc3QgdG91Y2ggPSBlLnRvdWNoZXNbMF07CiAgICAgIHN3aXRjaCAoZS50eXBlKSB7CiAgICAgICAgY2FzZSAndG91Y2hzdGFydCc6CiAgICAgICAgICBoYW5kbGVUb3VjaFN0YXJ0KGUpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAndG91Y2hlbmQnOgogICAgICAgICAgaGFuZGxlVG91Y2hFbmQoZSk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gc2V0dXBHZXN0dXJlcygpIHsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBrZXlQcmVzc2VkKTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBoYW5kbGVUb3VjaCk7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIGhhbmRsZVRvdWNoKTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgaGFuZGxlVG91Y2hUYXApOwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0b2dnbGVMb29wKTsKICB9CgogIGZ1bmN0aW9uIGdsSW5pdGlhbGl6ZShjYW52YXMpIHsKICAgIGNvbnN0IGdsID0gY2FudmFzLmdldENvbnRleHQoIndlYmdsIik7CiAgICBjb25zdCB2cyA9IGdsLmNyZWF0ZVNoYWRlcihnbC5WRVJURVhfU0hBREVSKTsKICAgIGdsLnNoYWRlclNvdXJjZSh2cywgdmVydGV4U2hhZGVyKTsKICAgIGdsLmNvbXBpbGVTaGFkZXIodnMpOwogICAgY29uc3QgZnMgPSBnbC5jcmVhdGVTaGFkZXIoZ2wuRlJBR01FTlRfU0hBREVSKTsKICAgIGdsLnNoYWRlclNvdXJjZShmcywgZnJhZ21lbnRTaGFkZXIpOwogICAgZ2wuY29tcGlsZVNoYWRlcihmcyk7CiAgICBjb25zdCBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpOwogICAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIHZzKTsKICAgIGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCBmcyk7CiAgICBnbC5saW5rUHJvZ3JhbShwcm9ncmFtKTsKICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICBjb25zdCB2ZXJ0aWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoWzEuMCwgMS4wLCAwLjAsIC0xLjAsIDEuMCwgMC4wLCAxLjAsIC0xLjAsIDAuMCwgLTEuMCwgLTEuMCwgMC4wLF0pOwogICAgY29uc3QgYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7CiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgYnVmZmVyKTsKICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCB2ZXJ0aWNlcywgZ2wuU1RBVElDX0RSQVcpOwogICAgY29uc3QgcG9zaXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAicG9zaXRpb24iKTsKICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIocG9zaXRpb24sIDMsIGdsLkZMT0FULCB0cnVlLCAwLCAwKTsKICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uKTsKICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQpOwogICAgZ2wuY2xlYXJDb2xvcigwLCAwLCAwLCAwKTsKICAgIHJldHVybiB7IGdsLCBwcm9ncmFtIH07CiAgfQoKICBmdW5jdGlvbiBnbFNldENvbnN0YW50VW5pZm9ybXMoKSB7CiAgICBnbC51bmlmb3JtMWYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJyaWJiZWRIdWUiKSwgcmliYmVkSHVlIC8gMjU1LjApOwogICAgZ2wudW5pZm9ybTFmKGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAiaXNCb2xkIiksIGJvbGQpOwogICAgZ2wudW5pZm9ybTFmKGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAiaXNTbGlua3kiKSwgc2xpbmt5KTsKICAgIGdsLnVuaWZvcm0xZihnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgImlzRnV6enkiKSwgZnV6enkpOwogICAgZ2wudW5pZm9ybTFmKGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAiaXNSaWJiZWQiKSwgcmliYmVkKTsKICAgIGdsLnVuaWZvcm0xZihnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgImlzUGlwZSIpLCBwaXBlKTsKICAgIGdsLnVuaWZvcm0xZihnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgImlzSHlwZXJSYWluYm93IiksIGh5cGVyUmFpbmJvdyk7CiAgfQoKICBmdW5jdGlvbiBnbFNldFJlbmRlclVuaWZvcm1zKHNlY3Rpb25IdWVzLCBmaWxsSHVlcykgewogICAgY29uc3QgblRpbGVzWCA9IDM2OwogICAgY29uc3QgdGlsZVNpemUgPSBjYW52YXMud2lkdGggLyBuVGlsZXNYOwogICAgZ2wudW5pZm9ybTFmKGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidGlsZVNpemUiKSwgdGlsZVNpemUpOwogICAgZ2wudW5pZm9ybTFmKGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAiZHJhd0Zyb250U2lkZSIpLCBmcm9udFNpZGUpOwogICAgZ2wudW5pZm9ybTFmdihnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInNlZ21lbnRIdWVzIiksIHNlY3Rpb25IdWVzKTsKICAgIGdsLnVuaWZvcm0xZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJmaWxsSHVlcyIpLCBmaWxsSHVlcyk7CiAgfQo8L3NjcmlwdD4KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgYm9keSB7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiAwOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgZGlzcGxheTogZmxleDsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICB9CgogICNjb250YWluZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICB3aWR0aDogbWluKDEwOC82MCAqIDkwdmgsIDkwdncpOwogICAgYXNwZWN0LXJhdGlvOiA5LzU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogIH0KCiAgY2FudmFzIHsKICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICBtaW4td2lkdGg6IDIxNnB4OwogICAgbWluLWhlaWdodDogMTIwcHg7CiAgICBpbWFnZS1yZW5kZXJpbmc6IG9wdGltaXplU3BlZWQ7CiAgICBpbWFnZS1yZW5kZXJpbmc6IC1tb3otY3Jpc3AtZWRnZXM7CiAgICBpbWFnZS1yZW5kZXJpbmc6IC1vLWNyaXNwLWVkZ2VzOwogICAgaW1hZ2UtcmVuZGVyaW5nOiAtd2Via2l0LW9wdGltaXplLWNvbnRyYXN0OwogICAgaW1hZ2UtcmVuZGVyaW5nOiBwaXhlbGF0ZWQ7CiAgICBpbWFnZS1yZW5kZXJpbmc6IG9wdGltaXplLWNvbnRyYXN0OwogIH0KCjwvc3R5bGU+CjwvaHRtbD4K"}...