PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9InpoLUNOIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9IlVURi04Ij4KPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPgo8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0i6Z2i5ZCR5a625bqt55qE5YS/56ul5a2m5Lmg5omT5Y2h5LiO5oiQ6ZW/6K6w5b2VIFBXQSI+Cjx0aXRsZT5MdWNhc+WtpuS5oOWPsDwvdGl0bGU+CjxtZXRhIG5hbWU9ImFwcGxlLW1vYmlsZS13ZWItYXBwLWNhcGFibGUiIGNvbnRlbnQ9InllcyI+CjxtZXRhIG5hbWU9ImFwcGxlLW1vYmlsZS13ZWItYXBwLXN0YXR1cy1iYXItc3R5bGUiIGNvbnRlbnQ9ImJsYWNrLXRyYW5zbHVjZW50Ij4KPG1ldGEgbmFtZT0iYXBwbGUtbW9iaWxlLXdlYi1hcHAtdGl0bGUiIGNvbnRlbnQ9Ikx1Y2Fz5a2m5Lmg5Y+wIj4KPG1ldGEgbmFtZT0idGhlbWUtY29sb3IiIGNvbnRlbnQ9IiMyZmE4NGYiPgo8bGluayByZWw9Im1hbmlmZXN0IiBocmVmPSJtYW5pZmVzdC5qc29uIj4KPGxpbmsgcmVsPSJhcHBsZS10b3VjaC1pY29uIiBzaXplcz0iNTEyeDUxMiIgaHJlZj0iL2ljb25zL2ljb24tNTEyLnBuZyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL3NyYy9jbG91ZC5jc3MiPgo8bGluayByZWw9ImFwcGxlLXRvdWNoLWljb24iIGhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBZ0FBQUFJQUNBWUFBQUQwZU5UNkFBQVFZa2xFUVZSNG5PM2RQWklUNXdLRjRmWXRGa0E1SUo3SUlXWUZYZ0xlcG1PVzRCVlFFenFhbU1ERkFxanlEZkFZTVVqcXY2Lzcrem5Qay9qYXR6eklvcnZQcXg1cCtPblhQMzcvWndJQW92eXY5Z01BQU00bkFBQWdrQUFBZ0VBQ0FBQUNDUUFBQ0NRQUFDQ1FBQUNBUUFJQUFBSUpBQUFJSkFBQUlKQUFBSUJBQWdBQUFna0FBQWdrQUFBZ2tBQUFnRUFDQUFBQ0NRQUFDQ1FBQUNDUUFBQ0FRQUlBQUFJSkFBQUlKQUFBSUpBQUFJQkFBZ0FBQWdrQUFBZ2tBQUFna0FBQWdFQUNBQUFDQ1FBQUNDUUFBQ0NRQUFDQVFBSUFBQUlKQUFBSUpBQUFJSkFBQUlCQUFnQUFBZ2tBQUFna0FBQWdrQUFBZ0VBQ0FBQUNDUUFBQ0NRQUFDQ1FBQUNBUUFJQUFBSUpBQUFJSkFBQUlKQUFBSUJBQWdBQUFna0FBQWdrQUFBZ2tBQUFnRUFDQUFBQ0NRQUFDQ1FBQUNDUUFBQ0FRQUlBQUFJSkFBQUlKQUFBSUpBQUFJQkFBZ0FBQWdrQUFBZ2tBQUFna0FBQWdFQUNBQUFDQ1FBQUNDUUFBQ0NRQUFDQVFBSUFBQUlKQUFBSUpBQUFJSkFBQUlCQUFnQUFBZ2tBQUFna0FBQWdrQUFBZ0VBQ0FBQUNDUUFBQ0NRQUFDQ1FBQUNBUUFJQUFBSUpBQUFJSkFBQUlKQUFBSUJBQWdBQUFna0FBQWdrQUFBZ2tBQUFnRUFDQUFBQ0NRQUFDQ1FBQUNDUUFBQ0FRQUlBQUFJSkFBQUlKQUFBSUpBQUFJQkFBZ0FBQWdrQUFBZ2tBQUFna0FBQWdFQUNBQUFDQ1FBQUNDUUFBQ0NRQUFDQVFBSUFBQUlKQUFBSUpBQUFJSkFBQUlCQUFnQUFBZ2tBQUFna0FBQWdrQUFBZ0VBQ0FBQUNDUUFBQ0NRQUFDQ1FBQUNBUUFJQUFBSUpBQUFJSkFBQUlKQUFBSUJBQWdBQUFna0FBQWdrQUFBZ2tBQUFnRUFDQUFBQ0NRQUFDQ1FBQUNDUUFBQ0FRQUlBQUFJSkFBQUlKQUFBSUpBQUFJQkFBZ0FBQWdrQUFBZ2tBQUFna0FBQWdFQUNBQUFDQ1FBQUNDUUFBQ0NRQUFDQVFBSUFBQUlKQUFBSUpBQUFJSkFBQUlCQUFnQUFBZ2tBQUFna0FBQWdrQUFBZ0VBQ0FBQUNDUUFBQ0NRQUFDQ1FBQUNBUUFJQUFBSUpBQUFJSkFBQUlKQUFBSUJBQWdBQUFna0FBQWdrQUFBZ2tBQUFnRUFDQUFBQ0NRQUFDQ1FBQUNDUUFBQ0FRQUlBZ0s1OGZ2eDA5KzlaUmdBQTBJM25zYi8xVjVZVEFBQjBZZTZWLytmSFQwSmdCUUVBUVBQV0RMc0lXRVlBQU5DMExZTXVBdVlKQUFDYXRXZklSY0I5QWdDQUpwVVljTzhMdUUwQUFOQ2MwcU10Qkg0a0FBQm95cEtoZm5yL2F2UFhGZ05mQ1FBQW1uSGsrRi83dFpKRG9NeXpDQUFuS0RYK2x5NGo0UFhiTjhXL2ZxdmNBUUNnQ1hPdnhvOFkvMnVQSWVXdWdEc0FBRlRYd3ZoZlNyZ3I0QTRBQUZXMU52NHZqWHBYUUFBQVVFM3I0MzlwdEJCbzU1a0ZJTXFlTVgzNDhLWGdJMWxubEc4UHVBTUF3T25PL0xqZmtYcStLOUQrc3d2QVVFWVovMHM5M2hWd0J3Q0EwNHc0L2kvMWNsZWc3MmNaZ0c0a2pQK2wxdThLdUFNQXdPSFN4ditsRnU4S2pQdHNBOUNFOVBHLzFOSmRBWGNBQURpTThiK3Q5bDJCekdjZGdNTVovMlZxM1JWd0J3Q0E0b3ovTm1mZUZSQUFBQlJsL1BzZ0FBQW94dmozUXdBQVVJVHhMK09zOXdFSUFBQjJNLzc5OGJzeGdJOFBmOWQrQ05DRWQwOC8xMzRJa1l4L24veU9kTWpndzNVdnp3MUIwQWJqM3lhL0t4MHgvTERPOHprakJJNHo5K3JmK0s5ejVzOEI4RHZUT0tNUCsxMmVSMktnSE9QZk4yOENiSmp4aC9LY1YyVVkvLzc1SFdxUUN4UWN5N2NHOWpIK1kzQUhvREhHSDg3amZGdXZ0VC9TbHUwRVFFTmNqT0I4enJ2bGZOenZXR2YvOGNBQ29CRXVRbENQODIrZThSK1BBR2lBaXcvVTV6eTh6ZmlQU1FCVTVxSUQ3WEErL3NqNGowc0FWT1JpQSsxeFhuN1Q2dmcvZlBoeStxOTV0TE8vL3o5TkFxQWFGeGxvbC9PejNmR25IQUZRZ1lzTHRDLzVQRFgrR1FRQUFQOHgvamtFd01tU1gxVkFiOUxPVitPZlJRQ2NLTzFpQWlOSU9XK05mejAxM2dBNFRRSUFJSjd4enlRQUFJSVovMXdDNENRcHR4RmhSS09ldjhZL213QUFDR1Q4MjFEcisvL1RKQUJPTWVxckIwaVNkaDRiLy9FSkFJQXdjNi8ralg4R0FRQVF4UGp6VEFBQWhCaGwvSi9lditybXNiWk1BQndzN2Z1R01MS2V6K2RSeHY5U2o0LzVVczAzQUU2VEFBQVkzcEozL1BmSzNZRHRCQURBd0ZJKzdpY0UxaE1BQUlOS0dmOUxvLzMzSEVrQUFBd29jZnlmOVhBM29QYjMvNmRKQUFBTUozbjhML1VRQWpVSkFJQ0JHUDhmQ1lIckJBREFJSXovZmNuLzdkZDROdmpQeDEvK3JQMFFtdlh1cjk5cVB3UzR5L2d2OC93Y1BIejRVdm1SMU9kb0NHZjBsN2w4bnNRQXJUSCs2OVVNZ1JiZUFEaE5BaUNXNGQvdStia1RBclRBK08vejlQNVY3TjBBN3dFSVpQekw4RHhTbS9IZkwzWDhwOGtkZ0NnR3F6eDNBNmpGK08rWFBQN1Q1QTVBRE9OL0xNOHZaekwrL1dybCsvL1RKQUFBdW1MOHk1aDc5Zi82N1p1bXh2b0lBaUNBVjZmbjhEeHpOT05meHBMeHYvemZvNGFBQUJpY1VUcVg1NXVhalArOE5lTy81Si8zVEFBQWRHRHUxYi94bjdkMS9DLy8vNUZDUUFBTXpLdlJPanp2bEdiODl5djVqdit0SWRCYVBBZ0FnSVlaLy8yV2pQL1dRVzl0MU5jUUFBQ05Ndjc3SFRYK0pmLzlXZ1RBb055R3Jzdnp6MTVMM3ZIUGZXZU0vK1hYNlMwRUJBQkFZM3pjYjc4engvL2wxN3oyZFZ1TUF3RUEwQkRqdjErdDhUL3o2NWNnQUFBYVlmejNhMkg4TDMrZGxrTkFBQUEwd1BqdjE5TDQxLzQxbHhBQUFKVVovM08wT3NTMUNBQ0Fpb3gvR1h0L3lsOGlBUUJRaWZFdncvaHZJd0FBS2pEK1pSai83UVFBd01tTWZ4a2xmNzUvSWdFQWNDTGpYMGFyNy9qdmlRQUFPSW54TDhQNGx5RUFBRTVnL01zdy91VUlBSUNER2Y4eWpIOVpBZ0RnUU1hL0RPTmZuZ0FBcU1qNHp6UCt4eEFBQUFlWmUvVnYvT2NaLytNSUFJQURHUDl6R1AvdEJBQkFZY2EvREQvbDcxZ0NBS0FnNDErRzhUK2VBQUFvWk1rNy9wbG4vTThoQUFBSzhIRy9Ndng4Ly9NSUFJQ2RqSDhaM3ZGL0xnRUFzSVB4TDhQNG4wOEFBR3hrL01zdy9uVUlBSUFOakg4WnhyOGVBUUJ3aC9Fdng0LzRiWXNBQUxqQitKZGovTnNqQUFDdU1QN2xHUDgyQ1FDQUY0eC9PZjV3bjNZSkFJQ1ZqUDh5M3ZIZk5nRUFjR0Z1dEl6L01zYS9mUUlBNEYvR3Z3emozd2NCQURBWi8xS01mejhFQUJEUCtKZGgvUHNpQUlCbzNxVmVodkh2andBQVl2bTRYeG5HdjA4Q0FJaGsvTTlqL05za0FJQTR4cjhjUCtXdlh3SUFpR0w4eXpIK2ZSTUFRQXpqWDQ3eDc1OEFBR0xNamJ2eFg4WW5KOFlnQUlBb3QwYmUrQy9qSGYvakVBQkFsRnNENWxYdFBPTS9GZ0V3cUhkLy9WYjdJVVR6L0xkcGJzQWVQbndSQWpjWS8vRUlBQ0RHMHR2OEl1Qjd4bjlNQWdDSUlnTFdNZjdqRWdBRGN4dTZEczk3KzBUQU1zWi9iQUlBaVBUMC90V2lFRWlOQU9NL1BnRXdPSzlHeitYNTdvOEkyTWI0OTA4QUJEQks1L0E4OTBzRWZNOVArY3NnQUFDbTVSRXdlZ2dZL3h3Q0lJUlhwOGZ5L0k0aC9jMkJ4aitMQUFqeTdxL2ZERlZobnRQeHBFYUE4YzhqQUFJWnJESThqK05LKzRUQUtQOGRyQ01BUW5ubHVwM25Ma2RDQlBpNFg2NmZmdjNqOTM5cVA0aVJmWHo0dS9aRFdPempMMy9XZmdqTk12alpsb3hrajMrYW9QSFBKZ0FPMWxNQUFMY3RmYVhmU3dnWWYzd0xBR0NCa2Q0Y2FQeVpKZ0VBc05nSUVXRDhlU1lBQUZaWU9vNHRSb0R4NTVJQUFGanA5ZHMzaTRheXBRZ3cvcndrQUFBMjZpMEM3akgrZVFRQXdBNDlSSUNmOHNjMUFnQmdwNlVSVUNNRWpEKzNDQUNBQWxwOGM2RHg1eDRCQUZCSVN4RlErOXNPdEU4QUFCVFVRZ1I0eHo5TENBQ0F3bXArVE5ENHM1UUFBRGpJMlJGZy9GbERBQUFjNkt3SU1QNnNKUUFBRG5iMHh3U05QMXNJQUlBVEhQWG1RT1BQVmdJQTRDU2xJOEQ0czRjQUFEalJtWjhRTVA3Y0l3QUFLdGdiQVg3S0gzc0pBSUJLdGthQThhY0VBUUJRMGRwUENCaC9TaEVBQUpXMThPT0R5U01BQUJwUTRwVzdWLytzSVFBQUdyRm53STAvYXdrQWdJWXMvWmpneTM4SDFoSUFBQTFhT3VyR242MEVBRUNqWG83NzNOL0RHZ0lBb0dIUEkzL3JyN0NWQUFCb25GZitIRUVBQUVBZ0FRQUFnUVFBQUFRU0FBQVFTQUFBUUNBQkFBQ0JCQUFBQkJJQUFCQklBQUJBSUFFQUFJRUVBQUFFRWdBQUVFZ0FBRUFnQVFBQWdRUUFBQVFTQUFBUVNBQWM3TjNUejdVZkFsQ0k4NW1SQ0FBQUNQU3E5Z01BNk1YbngwKzFIOEt3WHI5OVUvc2h4QkVBQUZSM0xhNUV3YkVFd0VFdUQrYUh4Mmw2ZXUrcGhwNDlmUGhTK3lIRXVieU9pb0h5ckZKaGJoRUNsUGQ4YlJVQzVYZ1RZQ0dmSHovZEhYK3ZIcUJmenQ5MnpGMXJXYzRkZ0owY2lBRG5jMGRnUHdHd2tlRUhxRThJYk9kYkFCdHNIWCszRWFFL3p0cytlRkcybmdCWW9jVDNubHhNb0IvTzE3NTRmOEE2QW1BaEJ4VkFIMXl2bHhFQUM1USttTHlxZ1BZNVQvc21BdVlKZ0JsSEhVUXVMdEF1NStjWVJNQjlBdUNPb3c4ZUZ4bG9qL055TENMZ05nRnd3MWtIallzTnRNUDVPQ1lSY0owQXVPTHNnOFZGQitwekhvNU5CUHhJQUx4UTZ5Qng4WUY2bkg4WlJNRDNCTUNGMmdlSGl4Q2N6M21YcGZaMXZpVUM0Rit0SEJRdVJuQWU1MXVtVnE3M3RmbXpBQnIwZkZGNmV1KzNCNDVnK01FZGdHbWEycTFCRnlrb3ozbkZOTFY3M1Q5VC9Fdk0xZytDeTR1Vk93S3dqZEhubXMrUG42TC9GRUdMMGhIZkdvQjFERC9jRnIwa3JiLzZ2K1hsUlUwUXdGY0duN1dTN3dKWWpnRzQ2QUd3VnV5YkFIdDk5UTlBV2FsN0VCc0FBSkFzTWdCU2F3K0E2eEozSVRJQUFDQmRYQUFrVmg0QTg5TDJJUzRBQUFBQkFBQ1JvZ0lnN2ZZT0FPc2s3VVJVQUFBQVh3a0FBQWdrQUFBZ2tBQUFnRUF4QVpEMHhnNEF0a3ZaaTVnQUFBQytFUUFBRUVnQUFFQWdBUUFBZ1FRQUFBUVNBQUFRU0FBQVFDQUJBQUNCQkFBQUJCSUFBQkJJQUFCQUlBRUFBSUVFQUFBRUVnQUFFRWdBQUVBZ0FRQUFnUVFBQUFRU0FBQVFTQUFBUUNBQkFBQ0JCQUFBQkJJQUFCQklBQUJBSUFFQUFJRUVBQUFFRWdBQUVFZ0FBRUFnQVFBQWdRUUFBQVFTQUFBUVNBQUFRQ0FCQUFDQkJBQUFCQklBQUJCSUFBQkFJQUVBQUlFRUFBQUVFZ0FBRUVnQUFFQWdBUUFBZ1FRQUFBUVNBQUFRU0FBQVFDQUJBQUNCQkFBQUJCSUFBQkJJQUFCQUlBRUFBSUVFQUFBRUVnQUFFRWdBQUVBZ0FRQUFnUVFBQUFRU0FBQVFTQUFBUUtEL0E1RGpBT0lTZUR0d0FBQUFBRWxGVGtTdVFtQ0MiPgo8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3N2Zyt4bWwiIGhyZWY9ImRhdGE6aW1hZ2Uvc3ZnK3htbCw8c3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDEwMCAxMDAnPjxyZWN0IHdpZHRoPScxMDAnIGhlaWdodD0nMTAwJyByeD0nMjInIGZpbGw9JyUyMzJmYTg0ZicvPjxyZWN0IHg9JzE2JyB5PSc2Micgd2lkdGg9JzYwJyBoZWlnaHQ9JzE4JyByeD0nOScgZmlsbD0nJTIzMWY3YTM5Jy8+PHJlY3QgeD0nMjAnIHk9JzM4JyB3aWR0aD0nMzYnIGhlaWdodD0nMjgnIHJ4PSc3JyBmaWxsPSclMjNmZmM4M2QnLz48cmVjdCB4PScyNicgeT0nNDMnIHdpZHRoPScxNScgaGVpZ2h0PScxMycgcng9JzMnIGZpbGw9JyUyM2NmZWVmZicvPjxwYXRoIGQ9J001NCA1MCBMNzYgMzAgTDg2IDM4IEw2NCA2MCBaJyBmaWxsPSclMjNmZmM4M2QnIHN0cm9rZT0nJTIzMWY3YTM5JyBzdHJva2Utd2lkdGg9JzInIHN0cm9rZS1saW5lam9pbj0ncm91bmQnLz48cGF0aCBkPSdNNzYgMzAgcTEyIDMgOSAxNiBsLTkgLTMgcS0xIC05IDAgLTEzIFonIGZpbGw9JyUyMzFmN2EzOScvPjwvc3ZnPiI+CjxzdHlsZT4KICA6cm9vdHsKICAgIC0tZ3JlZW46IzJmYTg0ZjsKICAgIC0tZ3JlZW4tZGVlcDojMWY3YTM5OwogICAgLS1ncmVlbi1zb2Z0OiNlOGY3ZWM7CiAgICAtLWdyZWVuLWxpZ2h0OiNkNGYwZGI7CiAgICAtLXllbGxvdzojZmZjODNkOwogICAgLS15ZWxsb3ctc29mdDojZmZmNGQ2OwogICAgLS1pbms6IzI0MzAyNDsKICAgIC0taW5rLXNvZnQ6IzViNmI1YjsKICAgIC0tY2FyZDojZmZmZmZmOwogICAgLS1iZzojZjFmN2YyOwogICAgLS1saW5lOiNlMmVmZTU7CiAgICAtLXNoYWRvdzowIDZweCAxOHB4IHJnYmEoMzEsMTIyLDU3LC4xMik7CiAgICAtLXJhZGl1czoyMnB4OwogIH0KICAqe2JveC1zaXppbmc6Ym9yZGVyLWJveDstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7fQogIGh0bWwsYm9keXttYXJnaW46MDtwYWRkaW5nOjA7aGVpZ2h0OjEwMCU7fQogIGJvZHl7CiAgICBmb250LWZhbWlseTotYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwiUGluZ0ZhbmcgU0MiLCJNaWNyb3NvZnQgWWFIZWkiLHNhbnMtc2VyaWY7CiAgICBiYWNrZ3JvdW5kOnZhcigtLWJnKTtjb2xvcjp2YXIoLS1pbmspOwogICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjpub25lOwogIH0KICAvKiDnq5blsY/miYvmnLrlrrnlmajvvIzmoYzpnaLnq6/lsYXkuK3mqKHmi58gaVBhZCDnq5blsY8gKi8KICAuYXBwewogICAgbWF4LXdpZHRoOjQ2MHB4O21hcmdpbjowIGF1dG87bWluLWhlaWdodDoxMDB2aDsKICAgIGRpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47CiAgICBiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCgxODBkZWcsI2VhZmFmMCAwJSwjZjFmN2YyIDIyMHB4KTsKICB9CiAgLyog6aG26YOo5ZOB54mM5p2hICovCiAgLnRvcGJhcnsKICAgIGRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEwcHg7cGFkZGluZzoxNHB4IDE2cHggMTBweDsKICAgIHBvc2l0aW9uOnN0aWNreTt0b3A6MDt6LWluZGV4OjIwOwogICAgYmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCNlYWZhZjAsIHJnYmEoMjM0LDI1MCwyNDAsLjg1KSk7CiAgICBiYWNrZHJvcC1maWx0ZXI6Ymx1cig2cHgpOwogIH0KICAubG9nb3sKICAgIHdpZHRoOjQycHg7aGVpZ2h0OjQycHg7Ym9yZGVyLXJhZGl1czoxNHB4O2ZsZXg6MCAwIGF1dG87CiAgICBiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCgxMzVkZWcsdmFyKC0tZ3JlZW4pLHZhcigtLWdyZWVuLWRlZXApKTsKICAgIGRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtmb250LXNpemU6MjRweDsKICAgIGJveC1zaGFkb3c6dmFyKC0tc2hhZG93KTsKICB9CiAgLnRvcGJhciBoMXtmb250LXNpemU6MThweDttYXJnaW46MDtmb250LXdlaWdodDo4MDA7bGV0dGVyLXNwYWNpbmc6LjVweDt9CiAgLnRvcGJhciAuc3Vie2ZvbnQtc2l6ZToxMXB4O2NvbG9yOnZhcigtLWluay1zb2Z0KTttYXJnaW4tdG9wOjFweDt9CiAgLmRhdGVwaWxsewogICAgbWFyZ2luLWxlZnQ6YXV0bztmb250LXNpemU6MTJweDtjb2xvcjp2YXIoLS1ncmVlbi1kZWVwKTsKICAgIGJhY2tncm91bmQ6dmFyKC0tZ3JlZW4tc29mdCk7cGFkZGluZzo2cHggMTBweDtib3JkZXItcmFkaXVzOjk5OXB4O2ZvbnQtd2VpZ2h0OjcwMDsKICB9CgogIC5ib2R5e2ZsZXg6MTtkaXNwbGF5OmZsZXg7bWluLWhlaWdodDowO30KICAvKiDlt6bkvqfnq5bniYjlr7zoiKogKi8KICAubmF2ewogICAgd2lkdGg6NzRweDtmbGV4OjAgMCBhdXRvO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjhweDsKICAgIHBhZGRpbmc6MTBweCA4cHg7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCNmZmZmZmYsICNmNmZiZjcpOwogICAgYm9yZGVyLXJpZ2h0OjFweCBzb2xpZCB2YXIoLS1saW5lKTsKICB9CiAgLm5hdmJ0bnsKICAgIGJvcmRlcjpub25lO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y3Vyc29yOnBvaW50ZXI7Ym9yZGVyLXJhZGl1czoxNnB4OwogICAgcGFkZGluZzoxMHB4IDRweDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6M3B4OwogICAgY29sb3I6dmFyKC0taW5rLXNvZnQpO2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjcwMDt0cmFuc2l0aW9uOi4xOHM7CiAgfQogIC5uYXZidG4gLmlje2ZvbnQtc2l6ZToyMnB4O2xpbmUtaGVpZ2h0OjE7fQogIC5uYXZidG4uYWN0aXZle2JhY2tncm91bmQ6dmFyKC0tZ3JlZW4pO2NvbG9yOiNmZmY7Ym94LXNoYWRvdzp2YXIoLS1zaGFkb3cpO30KICAubmF2YnRuOmFjdGl2ZXt0cmFuc2Zvcm06c2NhbGUoLjk0KTt9CgogIC8qIOWPs+S+p+S4u+S9kyAqLwogIC5tYWlue2ZsZXg6MTttaW4td2lkdGg6MDtvdmVyZmxvdy15OmF1dG87cGFkZGluZzoxMnB4IDE0cHggMjRweDt9CiAgLm1vZHVsZS10aXRsZXtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo4cHg7bWFyZ2luOjJweCAycHggMTJweDt9CiAgLm1vZHVsZS10aXRsZSAuZW17Zm9udC1zaXplOjIycHg7fQogIC5tb2R1bGUtdGl0bGUgaDJ7Zm9udC1zaXplOjE3cHg7bWFyZ2luOjA7Zm9udC13ZWlnaHQ6ODAwO30KCiAgLyog5ZyG6KeS5Y2h54mHICovCiAgLmNhcmR7CiAgICBiYWNrZ3JvdW5kOnZhcigtLWNhcmQpO2JvcmRlci1yYWRpdXM6dmFyKC0tcmFkaXVzKTtwYWRkaW5nOjE2cHg7CiAgICBib3gtc2hhZG93OnZhcigtLXNoYWRvdyk7bWFyZ2luLWJvdHRvbToxNHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tbGluZSk7CiAgfQogIC5jYXJkIGgze21hcmdpbjowIDAgNHB4O2ZvbnQtc2l6ZToxNXB4O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjZweDt9CiAgLmNhcmQgLmRlc2N7Zm9udC1zaXplOjEyLjVweDtjb2xvcjp2YXIoLS1pbmstc29mdCk7bGluZS1oZWlnaHQ6MS42O21hcmdpbjo2cHggMCAxMnB4O30KCiAgLyog5omT5Y2h5oyJ6ZKuICovCiAgLmNoZWNraW57CiAgICB3aWR0aDoxMDAlO2JvcmRlcjpub25lO2N1cnNvcjpwb2ludGVyO2JvcmRlci1yYWRpdXM6MTZweDtwYWRkaW5nOjEzcHg7CiAgICBmb250LXNpemU6MTVweDtmb250LXdlaWdodDo4MDA7Y29sb3I6I2ZmZjsKICAgIGJhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDEzNWRlZyx2YXIoLS1ncmVlbiksdmFyKC0tZ3JlZW4tZGVlcCkpOwogICAgYm94LXNoYWRvdzp2YXIoLS1zaGFkb3cpO3RyYW5zaXRpb246LjE4czsKICB9CiAgLmNoZWNraW46YWN0aXZle3RyYW5zZm9ybTpzY2FsZSguOTcpO30KICAuY2hlY2tpbi5kb25le2JhY2tncm91bmQ6I2NmZDhjZjtjb2xvcjojZmZmO2JveC1zaGFkb3c6bm9uZTt9CgogIC5yb3d7ZGlzcGxheTpmbGV4O2dhcDoxMHB4O2ZsZXgtd3JhcDp3cmFwO30KICAucGlsbHsKICAgIGZvbnQtc2l6ZToxMnB4O2JhY2tncm91bmQ6dmFyKC0tZ3JlZW4tc29mdCk7Y29sb3I6dmFyKC0tZ3JlZW4tZGVlcCk7CiAgICBwYWRkaW5nOjRweCAxMHB4O2JvcmRlci1yYWRpdXM6OTk5cHg7Zm9udC13ZWlnaHQ6NzAwOwogIH0KCiAgLyog6K+G5a2X5Y2h54mHICovCiAgLmhhbnppLWNhcmR7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjthbGlnbi1pdGVtczpjZW50ZXI7cGFkZGluZzoxNHB4IDhweDt9CiAgLmhhbnppLWJpZ3tmb250LXNpemU6NzJweDtmb250LXdlaWdodDo4MDA7Y29sb3I6dmFyKC0taW5rKTtsaW5lLWhlaWdodDoxO30KICAuaGFuemktcHl7Zm9udC1zaXplOjE4cHg7Y29sb3I6dmFyKC0tZ3JlZW4tZGVlcCk7Zm9udC13ZWlnaHQ6NzAwO21hcmdpbjo4cHggMCA0cHg7fQogIC5oYW56aS13b3Jke2ZvbnQtc2l6ZToxNXB4O2NvbG9yOnZhcigtLWluay1zb2Z0KTt9CiAgLmhhbnppLW1lYW5pbmd7Zm9udC1zaXplOjEzcHg7Y29sb3I6dmFyKC0taW5rLXNvZnQpO21hcmdpbi10b3A6NHB4O30KICAuZ3JpZDJ7ZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczoxZnIgMWZyO2dhcDoxMnB4O30KICAubWluaS1jYXJke2JhY2tncm91bmQ6dmFyKC0tZ3JlZW4tc29mdCk7Ym9yZGVyLXJhZGl1czoxOHB4O3BhZGRpbmc6MTRweDt0ZXh0LWFsaWduOmNlbnRlcjt9CiAgLm1pbmktY2FyZCAuYmlne2ZvbnQtc2l6ZTo0NnB4O2ZvbnQtd2VpZ2h0OjgwMDtjb2xvcjp2YXIoLS1pbmspO30KICAubWluaS1jYXJkIC5weXtmb250LXNpemU6MTRweDtjb2xvcjp2YXIoLS1ncmVlbi1kZWVwKTtmb250LXdlaWdodDo3MDA7bWFyZ2luLXRvcDo0cHg7fQogIC5taW5pLWNhcmQgLmxhYmVse2ZvbnQtc2l6ZToxMXB4O2NvbG9yOnZhcigtLWluay1zb2Z0KTttYXJnaW4tdG9wOjJweDt9CgogIC8qIOWPpOivl+ivjSAqLwogIC5wb2VtLXRpdGxle2ZvbnQtc2l6ZToxOHB4O2ZvbnQtd2VpZ2h0OjgwMDt0ZXh0LWFsaWduOmNlbnRlcjt9CiAgLnBvZW0tbWV0YXt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6MTJweDtjb2xvcjp2YXIoLS1pbmstc29mdCk7bWFyZ2luOjJweCAwIDE0cHg7fQogIC5wb2VtLWJvZHl7Zm9udC1zaXplOjE4cHg7bGluZS1oZWlnaHQ6Mi4xO3RleHQtYWxpZ246Y2VudGVyO2xldHRlci1zcGFjaW5nOjJweDt9CiAgLnZpZGVvLWxpbmt7CiAgICBkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NnB4O21hcmdpbi10b3A6MTJweDsKICAgIGNvbG9yOnZhcigtLWdyZWVuLWRlZXApO2ZvbnQtc2l6ZToxM3B4O2ZvbnQtd2VpZ2h0OjcwMDt0ZXh0LWRlY29yYXRpb246bm9uZTsKICAgIGJhY2tncm91bmQ6dmFyKC0teWVsbG93LXNvZnQpO3BhZGRpbmc6OHB4IDEycHg7Ym9yZGVyLXJhZGl1czo5OTlweDsKICB9CgogIC8qIOWGmeWtlyDnlLDlrZfmoLwgKi8KICAudGlhbnsKICAgIHdpZHRoOjYwcHg7aGVpZ2h0OjYwcHg7Ym9yZGVyOjJweCBzb2xpZCB2YXIoLS1ncmVlbik7Ym9yZGVyLXJhZGl1czo4cHg7cG9zaXRpb246cmVsYXRpdmU7CiAgICBkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7Zm9udC1zaXplOjM0cHg7Zm9udC13ZWlnaHQ6ODAwOwogICAgYmFja2dyb3VuZDoKICAgICAgbGluZWFyLWdyYWRpZW50KHZhcigtLWxpbmUpLHZhcigtLWxpbmUpKSBjZW50ZXIvMTAwJSAxcHggbm8tcmVwZWF0LAogICAgICBsaW5lYXItZ3JhZGllbnQodmFyKC0tbGluZSksdmFyKC0tbGluZSkpIGNlbnRlci8xcHggMTAwJSBuby1yZXBlYXQsCiAgICAgIGxpbmVhci1ncmFkaWVudCh0byB0b3AgcmlnaHQsdHJhbnNwYXJlbnQgNDklLHZhcigtLWxpbmUpIDQ5JSx2YXIoLS1saW5lKSA1MSUsdHJhbnNwYXJlbnQgNTElKSAsCiAgICAgIGxpbmVhci1ncmFkaWVudCh0byB0b3AgbGVmdCx0cmFuc3BhcmVudCA0OSUsdmFyKC0tbGluZSkgNDklLHZhcigtLWxpbmUpIDUxJSx0cmFuc3BhcmVudCA1MSUpOwogIH0KICAud3JpdGUtZ3JpZHtkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7Z2FwOjEwcHg7anVzdGlmeS1jb250ZW50OmNlbnRlcjt9CiAgLnN0cm9rZS1saXN0e2Rpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcDtnYXA6OHB4O30KICAuc3Ryb2tlLWNoaXB7YmFja2dyb3VuZDp2YXIoLS1ncmVlbi1zb2Z0KTtib3JkZXItcmFkaXVzOjE0cHg7cGFkZGluZzo4cHggMTJweDtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo3MDA7Y29sb3I6dmFyKC0tZ3JlZW4tZGVlcCk7fQoKICAvKiDmlbDlrablj6PnrpcgKi8KICAucXVpei1ib3h7dGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZzoxMHB4IDA7fQogIC5xdWl6LXF7Zm9udC1zaXplOjQwcHg7Zm9udC13ZWlnaHQ6ODAwO21hcmdpbjo2cHggMCAxNHB4O2xldHRlci1zcGFjaW5nOjJweDt9CiAgLnF1aXotaW5wdXR7CiAgICB3aWR0aDoxMjBweDtmb250LXNpemU6MzBweDt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXdlaWdodDo4MDA7Ym9yZGVyOjJweCBzb2xpZCB2YXIoLS1ncmVlbik7CiAgICBib3JkZXItcmFkaXVzOjE0cHg7cGFkZGluZzo4cHg7Y29sb3I6dmFyKC0taW5rKTtvdXRsaW5lOm5vbmU7CiAgfQogIC5sdmwtcm93e2Rpc3BsYXk6ZmxleDtnYXA6OHB4O2p1c3RpZnktY29udGVudDpjZW50ZXI7bWFyZ2luLWJvdHRvbToxMHB4O2ZsZXgtd3JhcDp3cmFwO30KICAubHZsLWJ0bntib3JkZXI6MnB4IHNvbGlkIHZhcigtLWxpbmUpO2JhY2tncm91bmQ6I2ZmZjtib3JkZXItcmFkaXVzOjk5OXB4O3BhZGRpbmc6N3B4IDE0cHg7Zm9udC1zaXplOjEzcHg7Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOnZhcigtLWluay1zb2Z0KTtjdXJzb3I6cG9pbnRlcjt9CiAgLmx2bC1idG4uYWN0aXZle2JvcmRlci1jb2xvcjp2YXIoLS1ncmVlbik7YmFja2dyb3VuZDp2YXIoLS1ncmVlbi1zb2Z0KTtjb2xvcjp2YXIoLS1ncmVlbi1kZWVwKTt9CiAgLmZlZWRiYWNre2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjcwMDttYXJnaW4tdG9wOjEwcHg7bWluLWhlaWdodDoyMHB4O30KICAuZmVlZGJhY2sub2t7Y29sb3I6dmFyKC0tZ3JlZW4tZGVlcCk7fQogIC5mZWVkYmFjay5ub3tjb2xvcjojZDk1MzRmO30KCiAgLyog5pWw5oSf5ri45oiPICovCiAgLm51bS1ncmlke2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6cmVwZWF0KDUsMWZyKTtnYXA6OHB4O30KICAubnVtLWNlbGx7CiAgICBhc3BlY3QtcmF0aW86MTtib3JkZXItcmFkaXVzOjE0cHg7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOwogICAgZm9udC1zaXplOjIwcHg7Zm9udC13ZWlnaHQ6ODAwO2JhY2tncm91bmQ6dmFyKC0tZ3JlZW4tc29mdCk7Y29sb3I6dmFyKC0tZ3JlZW4tZGVlcCk7CiAgICBjdXJzb3I6cG9pbnRlcjtib3JkZXI6MnB4IHNvbGlkIHRyYW5zcGFyZW50OwogIH0KICAubnVtLWNlbGwubWlzc3tiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLWNvbG9yOnZhcigtLXllbGxvdyk7Y29sb3I6dmFyKC0taW5rKTt9CiAgLm51bS1jZWxsLmZvdW5ke2JhY2tncm91bmQ6dmFyKC0teWVsbG93KTtjb2xvcjp2YXIoLS1pbmspO30KCiAgLyog5pWw54usICovCiAgLnN1ZG9rdXtkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdCg0LDFmcik7Z2FwOjRweDttYXgtd2lkdGg6MjQwcHg7bWFyZ2luOjAgYXV0bzt9CiAgLnN1ZG9rdSBkaXZ7CiAgICBhc3BlY3QtcmF0aW86MTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7CiAgICBmb250LXNpemU6MjJweDtmb250LXdlaWdodDo4MDA7Ym9yZGVyLXJhZGl1czo4cHg7YmFja2dyb3VuZDp2YXIoLS1ncmVlbi1zb2Z0KTtjb2xvcjp2YXIoLS1pbmspOwogIH0KICAuc3Vkb2t1IGRpdi5maXhlZHtiYWNrZ3JvdW5kOiNkN2VhZDY7Y29sb3I6dmFyKC0tZ3JlZW4tZGVlcCk7fQogIC5zdWRva3UgaW5wdXR7CiAgICB3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlcjpub25lO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7dGV4dC1hbGlnbjpjZW50ZXI7CiAgICBmb250LXNpemU6MjJweDtmb250LXdlaWdodDo4MDA7Y29sb3I6dmFyKC0tZ3JlZW4tZGVlcCk7b3V0bGluZTpub25lOwogIH0KCiAgLyog6Iux6K+t5Y2V6K+NICovCiAgLndvcmQtY2FyZHtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2FsaWduLWl0ZW1zOmNlbnRlcjt0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjE0cHggNnB4O30KICAud29yZC1lbntmb250LXNpemU6MzRweDtmb250LXdlaWdodDo4MDA7Y29sb3I6dmFyKC0tZ3JlZW4tZGVlcCk7fQogIC53b3JkLXBoe2ZvbnQtc2l6ZToxNXB4O2NvbG9yOnZhcigtLWluay1zb2Z0KTttYXJnaW46NHB4IDA7fQogIC53b3JkLWNue2ZvbnQtc2l6ZToxNnB4O2ZvbnQtd2VpZ2h0OjcwMDt9CiAgLnNwZWFrLWJ0bntib3JkZXI6bm9uZTtiYWNrZ3JvdW5kOnZhcigtLXllbGxvdyk7Y29sb3I6dmFyKC0taW5rKTtib3JkZXItcmFkaXVzOjk5OXB4O3BhZGRpbmc6OHB4IDE2cHg7Zm9udC13ZWlnaHQ6ODAwO2ZvbnQtc2l6ZToxM3B4O2N1cnNvcjpwb2ludGVyO21hcmdpbi10b3A6MTBweDt9CiAgLm1vbnRoLXJldmlld3tkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7Z2FwOjZweDt9CiAgLm1yLWNoaXB7Zm9udC1zaXplOjEycHg7YmFja2dyb3VuZDojZmZmO2JvcmRlcjoxcHggc29saWQgdmFyKC0tbGluZSk7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6NXB4IDlweDtjb2xvcjp2YXIoLS1pbmstc29mdCk7fQoKICAvKiDpppbpobXnu5/orqEgKi8KICAuc3RhdC1ncmlke2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmcjtnYXA6MTJweDt9CiAgLnN0YXR7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLHZhcigtLWdyZWVuKSx2YXIoLS1ncmVlbi1kZWVwKSk7Y29sb3I6I2ZmZjtib3JkZXItcmFkaXVzOjIwcHg7cGFkZGluZzoxNnB4O3RleHQtYWxpZ246Y2VudGVyO2JveC1zaGFkb3c6dmFyKC0tc2hhZG93KTt9CiAgLnN0YXQgLm57Zm9udC1zaXplOjMycHg7Zm9udC13ZWlnaHQ…29260 tokens truncated…mxldCBzZXNzaW9uID0gbnVsbDsKbGV0IG1lbWJlcnNoaXBzID0gW107CmxldCBwcm9maWxlcyA9IFtdOwpsZXQgYWN0aXZlUHJvZmlsZSA9IG51bGw7CmxldCBjbG91ZFZlcnNpb24gPSBudWxsOwpsZXQgc2F2ZVRpbWVyID0gbnVsbDsKbGV0IHNhdmVJbkZsaWdodCA9IGZhbHNlOwpsZXQgc2F2ZVF1ZXVlZCA9IGZhbHNlOwpsZXQgdG9hc3RUaW1lciA9IG51bGw7Cgpjb25zdCBhY2NvdW50QnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2FjY291bnRCdXR0b24iKTsKY29uc3QgZGlhbG9nID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2Nsb3VkRGlhbG9nIik7CmNvbnN0IHBhbmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2Nsb3VkUGFuZWwiKTsKY29uc3QgdG9hc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjc3luY1RvYXN0Iik7CgpmdW5jdGlvbiBzaG93VG9hc3QobWVzc2FnZSwgZHVyYXRpb24gPSAyODAwKSB7CiAgdG9hc3QudGV4dENvbnRlbnQgPSBtZXNzYWdlOwogIHRvYXN0LmNsYXNzTGlzdC5hZGQoInNob3ciKTsKICBjbGVhclRpbWVvdXQodG9hc3RUaW1lcik7CiAgdG9hc3RUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdG9hc3QuY2xhc3NMaXN0LnJlbW92ZSgic2hvdyIpLCBkdXJhdGlvbik7Cn0KCmZ1bmN0aW9uIGVzY2FwZUh0bWwodmFsdWUgPSAiIikgewogIHJldHVybiBTdHJpbmcodmFsdWUpCiAgICAucmVwbGFjZUFsbCgiJiIsICImYW1wOyIpCiAgICAucmVwbGFjZUFsbCgiPCIsICImbHQ7IikKICAgIC5yZXBsYWNlQWxsKCI+IiwgIiZndDsiKQogICAgLnJlcGxhY2VBbGwoJyInLCAiJnF1b3Q7IikKICAgIC5yZXBsYWNlQWxsKCInIiwgIiYjMDM5OyIpOwp9CgpmdW5jdGlvbiBzdGF0ZUhhc0RhdGEoc3RhdGUpIHsKICByZXR1cm4gQm9vbGVhbigKICAgIE9iamVjdC5rZXlzKHN0YXRlPy5jaGVja2lucyB8fCB7fSkubGVuZ3RoIHx8CiAgICAgIE9iamVjdC5rZXlzKHN0YXRlPy5wb2ludHMgfHwge30pLmxlbmd0aCB8fAogICAgICBPYmplY3Qua2V5cyhzdGF0ZT8uYm9va1NoZWxmIHx8IHt9KS5sZW5ndGggfHwKICAgICAgT2JqZWN0LmtleXMoc3RhdGU/LnBlYW51dFJlYWQgfHwge30pLmxlbmd0aCB8fAogICAgICAoc3RhdGU/LnBlYW51dExvZyB8fCBbXSkubGVuZ3RoCiAgKTsKfQoKZnVuY3Rpb24gbWVyZ2VPYmplY3RzKGxvY2FsID0ge30sIHJlbW90ZSA9IHt9KSB7CiAgY29uc3QgcmVzdWx0ID0gc3RydWN0dXJlZENsb25lKHJlbW90ZSk7CiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobG9jYWwpKSB7CiAgICBpZiAoCiAgICAgIHZhbHVlICYmCiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gIm9iamVjdCIgJiYKICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmCiAgICAgIHJlc3VsdFtrZXldICYmCiAgICAgIHR5cGVvZiByZXN1bHRba2V5XSA9PT0gIm9iamVjdCIgJiYKICAgICAgIUFycmF5LmlzQXJyYXkocmVzdWx0W2tleV0pCiAgICApIHsKICAgICAgcmVzdWx0W2tleV0gPSBtZXJnZU9iamVjdHModmFsdWUsIHJlc3VsdFtrZXldKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdFtrZXldID0gc3RydWN0dXJlZENsb25lKHZhbHVlKTsKICAgIH0KICB9CiAgcmV0dXJuIHJlc3VsdDsKfQoKZnVuY3Rpb24gbWVyZ2VTdGF0ZShsb2NhbCwgcmVtb3RlKSB7CiAgY29uc3QgbWVyZ2VkID0gbWVyZ2VPYmplY3RzKGxvY2FsLCByZW1vdGUpOwogIGNvbnN0IGxvZ01hcCA9IG5ldyBNYXAoKTsKICBmb3IgKGNvbnN0IGl0ZW0gb2YgWy4uLihyZW1vdGU/LnBlYW51dExvZyB8fCBbXSksIC4uLihsb2NhbD8ucGVhbnV0TG9nIHx8IFtdKV0pIHsKICAgIGNvbnN0IGtleSA9IGAke2l0ZW0uZGF0ZSB8fCAiIn18JHtpdGVtLnRpdGxlIHx8ICIifXwke2l0ZW0ucmF0aW5nIHx8ICIifWA7CiAgICBsb2dNYXAuc2V0KGtleSwgaXRlbSk7CiAgfQogIG1lcmdlZC5wZWFudXRMb2cgPSBbLi4ubG9nTWFwLnZhbHVlcygpXS5zb3J0KChhLCBiKSA9PgogICAgU3RyaW5nKGEuZGF0ZSB8fCAiIikubG9jYWxlQ29tcGFyZShTdHJpbmcoYi5kYXRlIHx8ICIiKSkKICApOwogIHJldHVybiBtZXJnZWQ7Cn0KCmZ1bmN0aW9uIHNldEFjY291bnRTdGF0ZSgpIHsKICBpZiAoIWFjY291bnRCdXR0b24pIHJldHVybjsKICBpZiAoc2Vzc2lvbiAmJiBhY3RpdmVQcm9maWxlKSB7CiAgICBhY2NvdW50QnV0dG9uLmRhdGFzZXQuc3RhdGUgPSAib25saW5lIjsKICAgIGFjY291bnRCdXR0b24udGV4dENvbnRlbnQgPSAi4piBIjsKICAgIGFjY291bnRCdXR0b24udGl0bGUgPSBgJHthY3RpdmVQcm9maWxlLmRpc3BsYXlfbmFtZX0gwrcg5LqR56uv5bey6L+e5o6lYDsKICB9IGVsc2UgaWYgKHNlc3Npb24pIHsKICAgIGFjY291bnRCdXR0b24uZGF0YXNldC5zdGF0ZSA9ICJvbmxpbmUiOwogICAgYWNjb3VudEJ1dHRvbi50ZXh0Q29udGVudCA9ICLwn5GkIjsKICAgIGFjY291bnRCdXR0b24udGl0bGUgPSAi5bey55m75b2V77yM5b6F6YCJ5oup5a2m5Lmg6ICFIjsKICB9IGVsc2UgewogICAgYWNjb3VudEJ1dHRvbi5kYXRhc2V0LnN0YXRlID0gImxvY2FsIjsKICAgIGFjY291bnRCdXR0b24udGV4dENvbnRlbnQgPSAi4peLIjsKICAgIGFjY291bnRCdXR0b24udGl0bGUgPSAi5pys5py65qih5byPIMK3IOeCueatpOeZu+W9leWQjOatpSI7CiAgfQp9CgpmdW5jdGlvbiBvcGVuRGlhbG9nKCkgewogIHJlbmRlclBhbmVsKCk7CiAgaWYgKCFkaWFsb2cub3BlbikgZGlhbG9nLnNob3dNb2RhbCgpOwp9CgpmdW5jdGlvbiBjbG9zZURpYWxvZygpIHsKICBpZiAoZGlhbG9nLm9wZW4pIGRpYWxvZy5jbG9zZSgpOwp9CgpmdW5jdGlvbiByZW5kZXJTaWduZWRPdXQoKSB7CiAgcGFuZWwuaW5uZXJIVE1MID0gYAogICAgPGgyPuKYge+4jyDot6jorr7lpIflkIzmraU8L2gyPgogICAgPHA+5bmz5pe25Y+v5Lul57un57ut56a757q/5L2/55So44CC5a626ZW/55So6YKu566x55m75b2V5ZCO77yM5a2m5Lmg6K6w5b2V5Lya5ZCM5q2l5YiwIFN1cGFiYXNl77yb5a2p5a2Q5LiN6ZyA6KaB5Y2V54us5rOo5YaM6YKu566x44CCPC9wPgogICAgPGZvcm0gaWQ9ImVtYWlsTG9naW5Gb3JtIj4KICAgICAgPGxhYmVsIGNsYXNzPSJjbG91ZC1maWVsZCI+CiAgICAgICAg5a626ZW/6YKu566xCiAgICAgICAgPGlucHV0IHR5cGU9ImVtYWlsIiBuYW1lPSJlbWFpbCIgYXV0b2NvbXBsZXRlPSJlbWFpbCIgcmVxdWlyZWQgcGxhY2Vob2xkZXI9InBhcmVudEBleGFtcGxlLmNvbSI+CiAgICAgIDwvbGFiZWw+CiAgICAgIDxkaXYgY2xhc3M9ImNsb3VkLWFjdGlvbnMiPgogICAgICAgIDxidXR0b24gY2xhc3M9ImNsb3VkLWFjdGlvbiIgdHlwZT0ic3VibWl0Ij7lj5HpgIHnmbvlvZXpk77mjqU8L2J1dHRvbj4KICAgICAgICA8YnV0dG9uIGNsYXNzPSJjbG91ZC1hY3Rpb24gc2Vjb25kYXJ5IiB0eXBlPSJidXR0b24iIGRhdGEtY2xvc2U+57un57ut5pys5py65L2/55SoPC9idXR0b24+CiAgICAgIDwvZGl2PgogICAgPC9mb3JtPgogICAgJHsKICAgICAgY2xvdWRFbmFibGVkCiAgICAgICAgPyAiIgogICAgICAgIDogJzxkaXYgY2xhc3M9ImNsb3VkLXN0YXR1cyI+4pqg77iPIOWwmuacqumFjee9riBTdXBhYmFzZSDnjq/looPlj5jph4/vvIzlvZPliY3lj6rog73kvb/nlKjmnKzmnLrmqKHlvI/jgII8L2Rpdj4nCiAgICB9CiAgYDsKCiAgcGFuZWwucXVlcnlTZWxlY3RvcigiW2RhdGEtY2xvc2VdIikub25jbGljayA9IGNsb3NlRGlhbG9nOwogIHBhbmVsLnF1ZXJ5U2VsZWN0b3IoIiNlbWFpbExvZ2luRm9ybSIpLm9uc3VibWl0ID0gYXN5bmMgKGV2ZW50KSA9PiB7CiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgaWYgKCFjbG91ZEVuYWJsZWQpIHsKICAgICAgc2hvd1RvYXN0KCLor7flhYjphY3nva4gU3VwYWJhc2Ug546v5aKD5Y+Y6YePIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGVtYWlsID0gbmV3IEZvcm1EYXRhKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmdldCgiZW1haWwiKS50cmltKCk7CiAgICBjb25zdCB7IGVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZS5hdXRoLnNpZ25JbldpdGhPdHAoewogICAgICBlbWFpbCwKICAgICAgb3B0aW9uczogewogICAgICAgIHNob3VsZENyZWF0ZVVzZXI6IHRydWUsCiAgICAgICAgZW1haWxSZWRpcmVjdFRvOiBgJHt3aW5kb3cubG9jYXRpb24ub3JpZ2lufSR7d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lfWAsCiAgICAgIH0sCiAgICB9KTsKICAgIGlmIChlcnJvcikgewogICAgICBzaG93VG9hc3QoYOWPkemAgeWksei0pe+8miR7ZXJyb3IubWVzc2FnZX1gLCA1MDAwKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgcGFuZWwuaW5uZXJIVE1MID0gYAogICAgICA8aDI+8J+TqCDor7fmn6XmlLbpgq7ku7Y8L2gyPgogICAgICA8cD7nmbvlvZXpk77mjqXlt7Llj5HpgIHliLAgPGI+JHtlc2NhcGVIdG1sKGVtYWlsKX08L2I+44CC5Zyo6L+Z5Y+w6K6+5aSH5LiK5omT5byA6YKu5Lu26YeM55qE6ZO+5o6l5Y2z5Y+v5a6M5oiQ55m75b2V44CCPC9wPgogICAgICA8ZGl2IGNsYXNzPSJjbG91ZC1hY3Rpb25zIj4KICAgICAgICA8YnV0dG9uIGNsYXNzPSJjbG91ZC1hY3Rpb24gc2Vjb25kYXJ5IiB0eXBlPSJidXR0b24iIGRhdGEtY2xvc2U+55+l6YGT5LqGPC9idXR0b24+CiAgICAgIDwvZGl2PgogICAgYDsKICAgIHBhbmVsLnF1ZXJ5U2VsZWN0b3IoIltkYXRhLWNsb3NlXSIpLm9uY2xpY2sgPSBjbG9zZURpYWxvZzsKICB9Owp9CgpmdW5jdGlvbiByZW5kZXJTZXR1cCgpIHsKICBwYW5lbC5pbm5lckhUTUwgPSBgCiAgICA8aDI+5bu656uL5a625bqt5a2m5Lmg56m66Ze0PC9oMj4KICAgIDxwPuWtpuS5oOiAheaYr+WutuW6reWGheeahOeLrOeri+aho+ahiO+8jOS4jeaYr+eZu+W9lei0puWPt+OAguWPquS/neWtmOaYvuekuuWQjeensOWSjOW5tOe6p++8jOS4jeimgeaxguWtqeWtkOaPkOS+m+mCrueuseaIlueUn+aXpeOAgjwvcD4KICAgIDxmb3JtIGlkPSJob3VzZWhvbGRTZXR1cEZvcm0iPgogICAgICA8bGFiZWwgY2xhc3M9ImNsb3VkLWZpZWxkIj4KICAgICAgICDlrrbluq3nqbrpl7TlkI3np7AKICAgICAgICA8aW5wdXQgbmFtZT0iaG91c2Vob2xkIiBtYXhsZW5ndGg9IjQwIiByZXF1aXJlZCB2YWx1ZT0iTHVjYXMg55qE5a625bqtIj4KICAgICAgPC9sYWJlbD4KICAgICAgPGxhYmVsIGNsYXNzPSJjbG91ZC1maWVsZCI+CiAgICAgICAg56ys5LiA5Liq5a2m5Lmg6ICFCiAgICAgICAgPGlucHV0IG5hbWU9ImxlYXJuZXIiIG1heGxlbmd0aD0iMzAiIHJlcXVpcmVkIHZhbHVlPSJMdWNhcyI+CiAgICAgIDwvbGFiZWw+CiAgICAgIDxsYWJlbCBjbGFzcz0iY2xvdWQtZmllbGQiPgogICAgICAgIOW9k+WJjeW5tOe6pwogICAgICAgIDxzZWxlY3QgbmFtZT0iZ3JhZGUiPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMSI+5LiA5bm057qnPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIyIj7kuozlubTnuqc8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjMiPuS4ieW5tOe6pzwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNCI+5Zub5bm057qnPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI1Ij7kupTlubTnuqc8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjYiPuWFreW5tOe6pzwvb3B0aW9uPgogICAgICAgIDwvc2VsZWN0PgogICAgICA8L2xhYmVsPgogICAgICA8ZGl2IGNsYXNzPSJjbG91ZC1hY3Rpb25zIj4KICAgICAgICA8YnV0dG9uIGNsYXNzPSJjbG91ZC1hY3Rpb24iIHR5cGU9InN1Ym1pdCI+5Yib5bu65bm25ZCM5q2lPC9idXR0b24+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xvdWQtYWN0aW9uIHNlY29uZGFyeSIgdHlwZT0iYnV0dG9uIiBkYXRhLWNsb3NlPueojeWQjuiuvue9rjwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZm9ybT4KICBgOwogIHBhbmVsLnF1ZXJ5U2VsZWN0b3IoIltkYXRhLWNsb3NlXSIpLm9uY2xpY2sgPSBjbG9zZURpYWxvZzsKICBwYW5lbC5xdWVyeVNlbGVjdG9yKCIjaG91c2Vob2xkU2V0dXBGb3JtIikub25zdWJtaXQgPSBhc3luYyAoZXZlbnQpID0+IHsKICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKGV2ZW50LmN1cnJlbnRUYXJnZXQpOwogICAgY29uc3QgaG91c2Vob2xkSWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpOwogICAgY29uc3QgcHJvZmlsZUlkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTsKICAgIGNvbnN0IHBheWxvYWQgPSB7CiAgICAgIGlkOiBob3VzZWhvbGRJZCwKICAgICAgcHJvamVjdF9pZDogUFJPRFVDVF9JRCwKICAgICAgbmFtZTogZm9ybS5nZXQoImhvdXNlaG9sZCIpLnRyaW0oKSwKICAgICAgb3duZXJfdXNlcl9pZDogc2Vzc2lvbi51c2VyLmlkLAogICAgfTsKICAgIGNvbnN0IHsgZXJyb3I6IGhvdXNlaG9sZEVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZQogICAgICAuZnJvbSgibGVhcm5pbmdfaG91c2Vob2xkcyIpCiAgICAgIC5pbnNlcnQocGF5bG9hZCk7CiAgICBpZiAoaG91c2Vob2xkRXJyb3IpIHsKICAgICAgc2hvd1RvYXN0KGDliJvlu7rlrrbluq3lpLHotKXvvJoke2hvdXNlaG9sZEVycm9yLm1lc3NhZ2V9YCwgNTAwMCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHsgZXJyb3I6IG1lbWJlckVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZQogICAgICAuZnJvbSgibGVhcm5pbmdfaG91c2Vob2xkX21lbWJlcnMiKQogICAgICAuaW5zZXJ0KHsKICAgICAgICBob3VzZWhvbGRfaWQ6IGhvdXNlaG9sZElkLAogICAgICAgIHVzZXJfaWQ6IHNlc3Npb24udXNlci5pZCwKICAgICAgICByb2xlOiAib3duZXIiLAogICAgICB9KTsKICAgIGlmIChtZW1iZXJFcnJvcikgewogICAgICBzaG93VG9hc3QoYOWIm+W7uuaIkOWRmOWksei0pe+8miR7bWVtYmVyRXJyb3IubWVzc2FnZX1gLCA1MDAwKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgeyBlcnJvcjogcHJvZmlsZUVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZQogICAgICAuZnJvbSgibGVhcm5pbmdfcHJvZmlsZXMiKQogICAgICAuaW5zZXJ0KHsKICAgICAgICBpZDogcHJvZmlsZUlkLAogICAgICAgIGhvdXNlaG9sZF9pZDogaG91c2Vob2xkSWQsCiAgICAgICAgZGlzcGxheV9uYW1lOiBmb3JtLmdldCgibGVhcm5lciIpLnRyaW0oKSwKICAgICAgICBncmFkZV9sZXZlbDogTnVtYmVyKGZvcm0uZ2V0KCJncmFkZSIpKSwKICAgICAgfSk7CiAgICBpZiAocHJvZmlsZUVycm9yKSB7CiAgICAgIHNob3dUb2FzdChg5Yib5bu65a2m5Lmg6ICF5aSx6LSl77yaJHtwcm9maWxlRXJyb3IubWVzc2FnZX1gLCA1MDAwKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgYXdhaXQgbG9hZFdvcmtzcGFjZShwcm9maWxlSWQsIHsgbWlncmF0ZUxvY2FsOiB0cnVlIH0pOwogICAgY2xvc2VEaWFsb2coKTsKICAgIHNob3dUb2FzdCgi5a625bqt5a2m5Lmg56m66Ze05bey5bu656uL77yM5q2j5Zyo5ZCM5q2l5pys5py66K6w5b2VIik7CiAgfTsKfQoKZnVuY3Rpb24gcmVuZGVyQWNjb3VudCgpIHsKICBjb25zdCBjaG9pY2VzID0gcHJvZmlsZXMKICAgIC5tYXAoCiAgICAgIChwcm9maWxlKSA9PiBgCiAgICAgIDxidXR0b24gY2xhc3M9ImxlYXJuZXItY2hvaWNlICR7cHJvZmlsZS5pZCA9PT0gYWN0aXZlUHJvZmlsZT8uaWQgPyAiYWN0aXZlIiA6ICIifSIgdHlwZT0iYnV0dG9uIiBkYXRhLXByb2ZpbGU9IiR7cHJvZmlsZS5pZH0iPgogICAgICAgIDxzcGFuPiR7cHJvZmlsZS5pZCA9PT0gYWN0aXZlUHJvZmlsZT8uaWQgPyAi4pyFIiA6ICLwn5GmIn08L3NwYW4+CiAgICAgICAgPHNwYW4+PHN0cm9uZz4ke2VzY2FwZUh0bWwocHJvZmlsZS5kaXNwbGF5X25hbWUpfTwvc3Ryb25nPjxzbWFsbD4ke3Byb2ZpbGUuZ3JhZGVfbGV2ZWwgfHwgMX0g5bm057qnPC9zbWFsbD48L3NwYW4+CiAgICAgIDwvYnV0dG9uPgogICAgYAogICAgKQogICAgLmpvaW4oIiIpOwogIHBhbmVsLmlubmVySFRNTCA9IGAKICAgIDxoMj7lrrbluq3lrabkuaDnqbrpl7Q8L2gyPgogICAgPHA+JHtlc2NhcGVIdG1sKHNlc3Npb24udXNlci5lbWFpbCB8fCAi5bey55m75b2VIil9IMK3IOaVsOaNruaMieWutuW6remalOemuzwvcD4KICAgIDxkaXYgY2xhc3M9ImNsb3VkLXN0YXR1cyI+4piB77iPICR7CiAgICAgIGFjdGl2ZVByb2ZpbGUgPyBgJHtlc2NhcGVIdG1sKGFjdGl2ZVByb2ZpbGUuZGlzcGxheV9uYW1lKX0g55qE6K6w5b2V5bey6L+e5o6l5LqR56uvYCA6ICLor7fpgInmi6nlrabkuaDogIUiCiAgICB9PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJsZWFybmVyLWxpc3QiPiR7Y2hvaWNlc308L2Rpdj4KICAgIDxmb3JtIGlkPSJhZGRMZWFybmVyRm9ybSI+CiAgICAgIDxsYWJlbCBjbGFzcz0iY2xvdWQtZmllbGQiPgogICAgICAgIOa3u+WKoOWtpuS5oOiAhQogICAgICAgIDxpbnB1dCBuYW1lPSJsZWFybmVyIiBtYXhsZW5ndGg9IjMwIiByZXF1aXJlZCBwbGFjZWhvbGRlcj0i5L6L5aaC77ya5byf5byfIj4KICAgICAgPC9sYWJlbD4KICAgICAgPGxhYmVsIGNsYXNzPSJjbG91ZC1maWVsZCI+CiAgICAgICAg5bm057qnCiAgICAgICAgPHNlbGVjdCBuYW1lPSJncmFkZSI+CiAgICAgICAgICAke1sxLCAyLCAzLCA0LCA1LCA2XS5tYXAoKGdyYWRlKSA9PiBgPG9wdGlvbiB2YWx1ZT0iJHtncmFkZX0iPiR7Z3JhZGV9IOW5tOe6pzwvb3B0aW9uPmApLmpvaW4oIiIpfQogICAgICAgIDwvc2VsZWN0PgogICAgICA8L2xhYmVsPgogICAgICA8ZGl2IGNsYXNzPSJjbG91ZC1hY3Rpb25zIj4KICAgICAgICA8YnV0dG9uIGNsYXNzPSJjbG91ZC1hY3Rpb24iIHR5cGU9InN1Ym1pdCI+5re75YqgPC9idXR0b24+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xvdWQtYWN0aW9uIHNlY29uZGFyeSIgdHlwZT0iYnV0dG9uIiBkYXRhLXN5bmM+56uL5Y2z5ZCM5q2lPC9idXR0b24+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xvdWQtYWN0aW9uIGRhbmdlciIgdHlwZT0iYnV0dG9uIiBkYXRhLXNpZ25vdXQ+6YCA5Ye655m75b2VPC9idXR0b24+CiAgICAgIDwvZGl2PgogICAgPC9mb3JtPgogIGA7CiAgcGFuZWwucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtcHJvZmlsZV0iKS5mb3JFYWNoKChidXR0b24pID0+IHsKICAgIGJ1dHRvbi5vbmNsaWNrID0gYXN5bmMgKCkgPT4gewogICAgICBhd2FpdCBzZWxlY3RQcm9maWxlKGJ1dHRvbi5kYXRhc2V0LnByb2ZpbGUpOwogICAgICByZW5kZXJBY2NvdW50KCk7CiAgICB9OwogIH0pOwogIHBhbmVsLnF1ZXJ5U2VsZWN0b3IoIltkYXRhLXN5bmNdIikub25jbGljayA9IGFzeW5jICgpID0+IHsKICAgIGF3YWl0IHNhdmVDbG91ZFN0YXRlKHRydWUpOwogIH07CiAgcGFuZWwucXVlcnlTZWxlY3RvcigiW2RhdGEtc2lnbm91dF0iKS5vbmNsaWNrID0gYXN5bmMgKCkgPT4gewogICAgYXdhaXQgc3VwYWJhc2UuYXV0aC5zaWduT3V0KCk7CiAgICBjbG9zZURpYWxvZygpOwogIH07CiAgcGFuZWwucXVlcnlTZWxlY3RvcigiI2FkZExlYXJuZXJGb3JtIikub25zdWJtaXQgPSBhc3luYyAoZXZlbnQpID0+IHsKICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKGV2ZW50LmN1cnJlbnRUYXJnZXQpOwogICAgY29uc3QgaG91c2Vob2xkSWQgPSBtZW1iZXJzaGlwc1swXT8uaG91c2Vob2xkX2lkOwogICAgaWYgKCFob3VzZWhvbGRJZCkgcmV0dXJuOwogICAgY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgc3VwYWJhc2UKICAgICAgLmZyb20oImxlYXJuaW5nX3Byb2ZpbGVzIikKICAgICAgLmluc2VydCh7CiAgICAgICAgaG91c2Vob2xkX2lkOiBob3VzZWhvbGRJZCwKICAgICAgICBkaXNwbGF5X25hbWU6IGZvcm0uZ2V0KCJsZWFybmVyIikudHJpbSgpLAogICAgICAgIGdyYWRlX2xldmVsOiBOdW1iZXIoZm9ybS5nZXQoImdyYWRlIikpLAogICAgICB9KQogICAgICAuc2VsZWN0KCkKICAgICAgLnNpbmdsZSgpOwogICAgaWYgKGVycm9yKSB7CiAgICAgIHNob3dUb2FzdChg5re75Yqg5aSx6LSl77yaJHtlcnJvci5tZXNzYWdlfWAsIDUwMDApOwogICAgICByZXR1cm47CiAgICB9CiAgICBwcm9maWxlcy5wdXNoKGRhdGEpOwogICAgYXdhaXQgc2VsZWN0UHJvZmlsZShkYXRhLmlkKTsKICAgIHJlbmRlckFjY291bnQoKTsKICAgIHNob3dUb2FzdCgi5bey5re75Yqg5paw55qE5a2m5Lmg6ICFIik7CiAgfTsKfQoKZnVuY3Rpb24gcmVuZGVyUGFuZWwoKSB7CiAgaWYgKCFzZXNzaW9uKSByZW5kZXJTaWduZWRPdXQoKTsKICBlbHNlIGlmICghbWVtYmVyc2hpcHMubGVuZ3RoKSByZW5kZXJTZXR1cCgpOwogIGVsc2UgcmVuZGVyQWNjb3VudCgpOwp9Cgphc3luYyBmdW5jdGlvbiBmZXRjaFdvcmtzcGFjZSgpIHsKICBjb25zdCB7IGRhdGE6IG1lbWJlclJvd3MsIGVycm9yOiBtZW1iZXJFcnJvciB9ID0gYXdhaXQgc3VwYWJhc2UKICAgIC5mcm9tKCJsZWFybmluZ19ob3VzZWhvbGRfbWVtYmVycyIpCiAgICAuc2VsZWN0KCJob3VzZWhvbGRfaWQsIHJvbGUiKQogICAgLmVxKCJ1c2VyX2lkIiwgc2Vzc2lvbi51c2VyLmlkKTsKICBpZiAobWVtYmVyRXJyb3IpIHRocm93IG1lbWJlckVycm9yOwogIG1lbWJlcnNoaXBzID0gbWVtYmVyUm93cyB8fCBbXTsKICBpZiAoIW1lbWJlcnNoaXBzLmxlbmd0aCkgewogICAgcHJvZmlsZXMgPSBbXTsKICAgIGFjdGl2ZVByb2ZpbGUgPSBudWxsOwogICAgcmV0dXJuOwogIH0KICBjb25zdCBob3VzZWhvbGRJZHMgPSBtZW1iZXJzaGlwcy5tYXAoKGl0ZW0pID0+IGl0ZW0uaG91c2Vob2xkX2lkKTsKICBjb25zdCB7IGRhdGE6IHByb2ZpbGVSb3dzLCBlcnJvcjogcHJvZmlsZUVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZQogICAgLmZyb20oImxlYXJuaW5nX3Byb2ZpbGVzIikKICAgIC5zZWxlY3QoImlkLCBob3VzZWhvbGRfaWQsIGRpc3BsYXlfbmFtZSwgZ3JhZGVfbGV2ZWwiKQogICAgLmluKCJob3VzZWhvbGRfaWQiLCBob3VzZWhvbGRJZHMpCiAgICAub3JkZXIoImNyZWF0ZWRfYXQiKTsKICBpZiAocHJvZmlsZUVycm9yKSB0aHJvdyBwcm9maWxlRXJyb3I7CiAgcHJvZmlsZXMgPSBwcm9maWxlUm93cyB8fCBbXTsKfQoKYXN5bmMgZnVuY3Rpb24gbG9hZFdvcmtzcGFjZShwcmVmZXJyZWRQcm9maWxlSWQgPSBudWxsLCBvcHRpb25zID0ge30pIHsKICBhd2FpdCBmZXRjaFdvcmtzcGFjZSgpOwogIGlmICghbWVtYmVyc2hpcHMubGVuZ3RoKSB7CiAgICByZW5kZXJQYW5lbCgpOwogICAgcmV0dXJuOwogIH0KICBjb25zdCByZW1lbWJlcmVkID0gcHJlZmVycmVkUHJvZmlsZUlkIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKEFDVElWRV9QUk9GSUxFX0tFWSk7CiAgY29uc3QgcHJvZmlsZSA9IHByb2ZpbGVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IHJlbWVtYmVyZWQpIHx8IHByb2ZpbGVzWzBdIHx8IG51bGw7CiAgaWYgKHByb2ZpbGUpIGF3YWl0IHNlbGVjdFByb2ZpbGUocHJvZmlsZS5pZCwgb3B0aW9ucyk7Cn0KCmFzeW5jIGZ1bmN0aW9uIHNlbGVjdFByb2ZpbGUocHJvZmlsZUlkLCB7IG1pZ3JhdGVMb2NhbCA9IGZhbHNlIH0gPSB7fSkgewogIGNvbnN0IHByb2ZpbGUgPSBwcm9maWxlcy5maW5kKChpdGVtKSA9PiBpdGVtLmlkID09PSBwcm9maWxlSWQpOwogIGlmICghcHJvZmlsZSkgcmV0dXJuOwogIGFjdGl2ZVByb2ZpbGUgPSBwcm9maWxlOwogIGxvY2FsU3RvcmFnZS5zZXRJdGVtKEFDVElWRV9QUk9GSUxFX0tFWSwgcHJvZmlsZS5pZCk7CiAgY29uc3QgbG9jYWxTdGF0ZSA9IHdpbmRvdy5sZWFybmluZ0Rlc2suZ2V0U3RhdGUoKTsKICBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBzdXBhYmFzZQogICAgLmZyb20oImxlYXJuaW5nX3Byb2ZpbGVfc3RhdGVzIikKICAgIC5zZWxlY3QoInN0YXRlLCB2ZXJzaW9uIikKICAgIC5lcSgicHJvZmlsZV9pZCIsIHByb2ZpbGUuaWQpCiAgICAubWF5YmVTaW5nbGUoKTsKICBpZiAoZXJyb3IpIHsKICAgIHNob3dUb2FzdChg6K+75Y+W5LqR56uv5aSx6LSl77yaJHtlcnJvci5tZXNzYWdlfWAsIDUwMDApOwogICAgcmV0dXJuOwogIH0KICBpZiAoIWRhdGEpIHsKICAgIGNsb3VkVmVyc2lvbiA9IG51bGw7CiAgICBpZiAobWlncmF0ZUxvY2FsIHx8IHN0YXRlSGFzRGF0YShsb2NhbFN0YXRlKSkgewogICAgICBhd2FpdCBzYXZlQ2xvdWRTdGF0ZSh0cnVlKTsKICAgIH0KICB9IGVsc2UgewogICAgY2xvdWRWZXJzaW9uID0gZGF0YS52ZXJzaW9uOwogICAgY29uc3QgbWVyZ2VkID0gc3RhdGVIYXNEYXRhKGxvY2FsU3RhdGUpID8gbWVyZ2VTdGF0ZShsb2NhbFN0YXRlLCBkYXRhLnN0YXRlKSA6IGRhdGEuc3RhdGU7CiAgICB3aW5kb3cubGVhcm5pbmdEZXNrLnJlcGxhY2VTdGF0ZShtZXJnZWQsIHsgcGVyc2lzdDogdHJ1ZSB9KTsKICAgIGlmIChKU09OLnN0cmluZ2lmeShtZXJnZWQpICE9PSBKU09OLnN0cmluZ2lmeShkYXRhLnN0YXRlKSkgewogICAgICBhd2FpdCBzYXZlQ2xvdWRTdGF0ZSh0cnVlKTsKICAgIH0KICB9CiAgc2V0QWNjb3VudFN0YXRlKCk7Cn0KCmFzeW5jIGZ1bmN0aW9uIHNhdmVDbG91ZFN0YXRlKG1hbnVhbCA9IGZhbHNlKSB7CiAgaWYgKCFzZXNzaW9uIHx8ICFhY3RpdmVQcm9maWxlIHx8IHNhdmVJbkZsaWdodCkgewogICAgaWYgKHNhdmVJbkZsaWdodCkgc2F2ZVF1ZXVlZCA9IHRydWU7CiAgICByZXR1cm47CiAgfQogIHNhdmVJbkZsaWdodCA9IHRydWU7CiAgY29uc3QgY3VycmVudFN0YXRlID0gd2luZG93LmxlYXJuaW5nRGVzay5nZXRTdGF0ZSgpOwogIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IHN1cGFiYXNlLnJwYygibGVhcm5pbmdfc2F2ZV9zdGF0ZSIsIHsKICAgIHBfcHJvZmlsZV9pZDogYWN0aXZlUHJvZmlsZS5pZCwKICAgIHBfc3RhdGU6IGN1cnJlbnRTdGF0ZSwKICAgIHBfZXhwZWN0ZWRfdmVyc2lvbjogY2xvdWRWZXJzaW9uLAogIH0pOwogIHNhdmVJbkZsaWdodCA9IGZhbHNlOwogIGlmIChlcnJvcikgewogICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoImxlYXJuaW5nX3N0YXRlX2NvbmZsaWN0IikpIHsKICAgICAgY29uc3QgeyBkYXRhOiByZW1vdGUgfSA9IGF3YWl0IHN1cGFiYXNlCiAgICAgICAgLmZyb20oImxlYXJuaW5nX3Byb2ZpbGVfc3RhdGVzIikKICAgICAgICAuc2VsZWN0KCJzdGF0ZSwgdmVyc2lvbiIpCiAgICAgICAgLmVxKCJwcm9maWxlX2lkIiwgYWN0aXZlUHJvZmlsZS5pZCkKICAgICAgICAuc2luZ2xlKCk7CiAgICAgIGlmIChyZW1vdGUpIHsKICAgICAgICBjbG91ZFZlcnNpb24gPSByZW1vdGUudmVyc2lvbjsKICAgICAgICB3aW5kb3cubGVhcm5pbmdEZXNrLnJlcGxhY2VTdGF0ZShtZXJnZVN0YXRlKGN1cnJlbnRTdGF0ZSwgcmVtb3RlLnN0YXRlKSwgeyBwZXJzaXN0OiB0cnVlIH0pOwogICAgICAgIHNhdmVRdWV1ZWQgPSB0cnVlOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBzaG93VG9hc3QoYOS6keerr+WQjOatpeWksei0pe+8miR7ZXJyb3IubWVzc2FnZX1gLCA1MDAwKTsKICAgIH0KICB9IGVsc2UgewogICAgY29uc3Qgcm93ID0gQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGFbMF0gOiBkYXRhOwogICAgY2xvdWRWZXJzaW9uID0gcm93Py52ZXJzaW9uID8/IGNsb3VkVmVyc2lvbjsKICAgIGlmIChtYW51YWwpIHNob3dUb2FzdCgi5LqR56uv6K6w5b2V5bey5pu05pawIik7CiAgfQogIGlmIChzYXZlUXVldWVkKSB7CiAgICBzYXZlUXVldWVkID0gZmFsc2U7CiAgICBhd2FpdCBzYXZlQ2xvdWRTdGF0ZShmYWxzZSk7CiAgfQp9CgpmdW5jdGlvbiBzY2hlZHVsZVNhdmUoKSB7CiAgY2xlYXJUaW1lb3V0KHNhdmVUaW1lcik7CiAgc2F2ZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiBzYXZlQ2xvdWRTdGF0ZShmYWxzZSksIDUwMCk7Cn0KCndpbmRvdy5jbG91ZFN5bmMgPSB7IHNjaGVkdWxlOiBzY2hlZHVsZVNhdmUgfTsKCmFzeW5jIGZ1bmN0aW9uIG9uQXV0aENoYW5nZShuZXh0U2Vzc2lvbikgewogIHNlc3Npb24gPSBuZXh0U2Vzc2lvbjsKICBtZW1iZXJzaGlwcyA9IFtdOwogIHByb2ZpbGVzID0gW107CiAgYWN0aXZlUHJvZmlsZSA9IG51bGw7CiAgY2xvdWRWZXJzaW9uID0gbnVsbDsKICBzZXRBY2NvdW50U3RhdGUoKTsKICBpZiAoc2Vzc2lvbikgewogICAgdHJ5IHsKICAgICAgYXdhaXQgbG9hZFdvcmtzcGFjZSgpOwogICAgICBzaG93VG9hc3QoIuW3sui/nuaOpeS6keerr+WtpuS5oOepuumXtCIpOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgc2hvd1RvYXN0KGDnmbvlvZXmiJDlip/vvIzkvYbor7vlj5blrabkuaDnqbrpl7TlpLHotKXvvJoke2Vycm9yLm1lc3NhZ2V9YCwgNTAwMCk7CiAgICB9CiAgfQogIGlmIChkaWFsb2cub3BlbikgcmVuZGVyUGFuZWwoKTsKfQoKYWNjb3VudEJ1dHRvbj8uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBvcGVuRGlhbG9nKTsKZGlhbG9nPy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIChldmVudCkgPT4gewogIGlmIChldmVudC50YXJnZXQgPT09IGRpYWxvZykgY2xvc2VEaWFsb2coKTsKfSk7CgppZiAoY2xvdWRFbmFibGVkKSB7CiAgY29uc3QgewogICAgZGF0YTogeyBzZXNzaW9uOiBpbml0aWFsU2Vzc2lvbiB9LAogIH0gPSBhd2FpdCBzdXBhYmFzZS5hdXRoLmdldFNlc3Npb24oKTsKICBhd2FpdCBvbkF1dGhDaGFuZ2UoaW5pdGlhbFNlc3Npb24pOwogIHN1cGFiYXNlLmF1dGgub25BdXRoU3RhdGVDaGFuZ2UoKF9ldmVudCwgbmV4dFNlc3Npb24pID0+IHsKICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IG9uQXV0aENoYW5nZShuZXh0U2Vzc2lvbikpOwogIH0pOwp9IGVsc2UgewogIHNldEFjY291bnRTdGF0ZSgpOwp9CgppZiAoInNlcnZpY2VXb3JrZXIiIGluIG5hdmlnYXRvciAmJiB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09ICJodHRwczoiKSB7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCAoKSA9PiB7CiAgICBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5yZWdpc3RlcigiL3N3LmpzIikuY2F0Y2goKCkgPT4gewogICAgICBzaG93VG9hc3QoIuemu+e6v+e8k+WtmOWIneWni+WMluWksei0pe+8jOS4jeW9seWTjeWcqOe6v+S9v+eUqCIpOwogICAgfSk7CiAgfSk7Cn0K