diff --git a/blog.json b/blog.json index 97a99ef..eccec17 100644 --- a/blog.json +++ b/blog.json @@ -461,7 +461,7 @@ }, "how-to-generate-a-report-for-songs-you-listen-to-using-mpv": { "title": "SG93IHRvIGdlbmVyYXRlIGEgcmVwb3J0IGZvciBzb25ncyB5b3UgbGlzdGVuIHRvIHVzaW5nIE1QVg==", - "content": "QSBkYXkgYWdvIEkgc3RhcnRlZCBjb2xsZWN0aW5nIGRhdGEgYWJvdXQgd2hhdCBJIGxpc3RlbiB0bwpvbiBteSBwbGF5bGlzdCwgYW5kIGN1cnJlbnRseSBpdCdzIHdvcmtpbmcgb3V0IGFtYXppbmcsIGl0J3MgdmVyeQpmdW4sIHNvIEkgdGhvdWdodCB0byBteXNlbGYsICd3aHkgbm90IHNoYXJlIGl0Jywgc28gaGVyZQp5b3UgZ28KCiMjIDEuIFNldCB1cCBgbXB2cGAgYWxpYXMKCmBtcHZwYCBhbGlhcyBpcyB3aGF0IHlvdSB3aWxsIGhhdmUgdG8gdXNlIHRvIGNvbGxlY3QgZGF0YSBhYm91dAp5b3VyIHBsYXlsaXN0LCB5b3UgY2FuIHNldCB1cCBhbm90aGVyIG5hbWUgYnV0IGNvZGUgc2hvdWxkIGJlCmFyb3VuZCB0aGUgc2FtZQoKQmFzaWNhbGx5LCBhZGQgdGhpcyB0byB5b3VyIGB+Ly5iYXNocmNgOgoKICAgIG1wdnBfY29sbGVjdCgpIHsKICAgICAgICBbICEgLWYgIiRIT01FLy5tcHZwIiBdICYmIDogPiIkSE9NRS8ubXB2cCIKCiAgICAgICAgc2xlZXAgMgoKICAgICAgICB3aGlsZSB0cnVlOyBkbwogICAgICAgICAgICBzbGVlcCA1CgogICAgICAgICAgICB4PSIkKGVjaG8gJ3sgImNvbW1hbmQiOiBbImdldF9wcm9wZXJ0eSIsICJwYXRoIl0gfScgfCBzb2NhdCAtIC90bXAvbXB2aXBjKSIKCiAgICAgICAgICAgIFsgISAiJHgiIF0gJiYgYnJlYWsKCiAgICAgICAgICAgIGlmIFsgIiR4IiBdICYmIFsgIiR4IiAhPSAiJCh0YWlsIC1uIDEgIiRIT01FLy5tcHZwIikiIF07IHRoZW4KICAgICAgICAgICAgICAgIHNsZWVwIDQKCiAgICAgICAgICAgICAgICB5PSIkKGVjaG8gJ3sgImNvbW1hbmQiOiBbImdldF9wcm9wZXJ0eSIsICJwYXRoIl0gfScgfCBzb2NhdCAtIC90bXAvbXB2aXBjKSIKICAgICAgICAgICAgICAgIFsgIiR4IiA9ICIkeSIgXSAmJiBlY2hvICIkeCIgPj4iJEhPTUUvLm1wdnAiCiAgICAgICAgICAgIGZpCiAgICAgICAgZG9uZQogICAgfQoKICAgIGFsaWFzIG1wdnA9J21wdnBfY29sbGVjdCAmIG1wdiAtLXNodWZmbGUgLS1sb29wLXBsYXlsaXN0IC0taW5wdXQtaXBjLXNlcnZlcj0vdG1wL21wdmlwYycKCldoZW4geW91IHVzZSB0aGUgYG1wdnBgIGFsaWFzIGl0J2xsIHN0YXJ0IHRoZSBkYXRhIGNvbGxlY3RvciBpbiB0aGUgYmFja2dyb3VuZCwKdGhlIElQQyB3aWxsIGJlIGFjY2Vzc2libGUgdGhvdWdoIGAvdG1wL21wdmlwY2AsIHRoaXMgd2lsbCBjb2xsZWN0IGFsbApkYXRhIHRvIGB+Ly5tcHZwYCwgbGlzdGVuIHRvIHNvbWUgbXVzaWMgYW5kIGlnbm9yZSBpdCBmb3IgYSBiaXQsIGFsc28sIGtlZXAgaW4gbWluZCwKdGhpcyBjb2RlIGlzIGJhZCBiZWNhdXNlIEknbSB0b28gbGF6eSB0byBpbXByb3ZlIGl0IGFuZCBJIG1hZGUgaXQgZmFzdCwgYW55d2F5LCB5b3UKbmVlZCB0byBpbnN0YWxsIGBzb2NhdGAgZm9yIHRoaXMgdG8gd29yawoKIyMgMi4gR2VuZXJhdGUgZGF0YSByZXBvcnQKCldlbGwgYXQgdGhpcyBwb2ludCB5b3UgY2FuIGRvIGFueXRoaW5nIHlvdSB3YW50IHdpdGggeW91ciBkYXRhLCBhbHRob3VnaApJIG1hZGUgYSBzaW1wbGUgZ2VuZXJhdG9yIGZvciBpdAoKU28gSSBtYWRlIHVzZSBvZiB0aGUgZGF0YSBJIGhhdmUgYW5kIG15IHBsYXlsaXN0IHN0cnVjdHVyZSwgaGVyZSdzIGFuIGV4YW1wbGUgZW50cnk6CgogICAgeyJkYXRhIjoicGxheWxpc3QvZ2lybCBpbiByZWQgLSBpJ2xsIGRpZSBhbnl3YXkuIFs4TU1hMzVCM0hUOF0ubXAzIiwicmVxdWVzdF9pZCI6MCwiZXJyb3IiOiJzdWNjZXNzIn0KClRoZXJlJ3MgYW4gSUQgdGhlcmUgc28gSSBhZGQgWW91VHViZSBhZGRpbmcgdG8gdGhlIGdlbmVyYXRvciBieQpkZWZhdWx0LCB5b3VycyBtaWdodCBub3QgaGF2ZSBpdCwgYnV0IEkgbWVhbiwgeW91IGNhbiBzdGlsbCBwcmV0dHkgbXVjaAp1c2UgaXQsIGp1c3QgbGlua3Mgd29uJ3Qgd29yawoKIyMjIDIuMSBUaGUgc2NyaXB0CgpJIG1hZGUgYSBweXRob24gc2NyaXB0IGFzIG15IGdlbmVyYXRvcjoKCiAgICAjIS91c3IvYmluL2VudiBweXRob24zCiAgICAjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQogICAgIiIiTVBWIHBsYXlsaXN0IHNvbmcgcmVwb3J0ZXIiIiIKCiAgICBpbXBvcnQgb3MKICAgIGltcG9ydCBzeXMKICAgIGZyb20gaHRtbCBpbXBvcnQgZXNjYXBlIGFzIGh0bWxfZXNjYXBlCiAgICBmcm9tIHR5cGluZyBpbXBvcnQgQW55LCBEaWN0LCBMaXN0LCBUdXBsZQogICAgZnJvbSB3YXJuaW5ncyBpbXBvcnQgZmlsdGVyd2FybmluZ3MgYXMgZmlsdGVyX3dhcm5pbmdzCgogICAgaW1wb3J0IHVqc29uICAjIHR5cGU6IGlnbm9yZQogICAgZnJvbSBjc3NfaHRtbF9qc19taW5pZnkgaW1wb3J0IGh0bWxfbWluaWZ5ICAjIHR5cGU6IGlnbm9yZQoKICAgIFNPTkdfVE9fQVJUSVNUOiBEaWN0W3N0ciwgc3RyXSA9IHsKICAgICAgICAiMTk4NSI6ICJibyBidXJuaGFtIiwKICAgICAgICAiYXBvY2FseXBzZSI6ICJjaWdhcmV0dGVzIGFmdGVyIFNleCIsCiAgICAgICAgImFzdHJvbm9teSI6ICJjb25hbiBncmF5IiwKICAgICAgICAiYnJvb2tseW4gYmFieSI6ICJsYW5hIGRlbCByZXkiLAogICAgICAgICJjb21lIGhvbWUgdG8gbWUiOiAiY3Jhd2xlcnMiLAogICAgICAgICJkYWRkeSBpc3N1ZXMiOiAidGhlIG5laWdoYm91cmhvb2QiLAogICAgICAgICJmZWVsIGJldHRlciI6ICJwZW5lbG9wZSBzY290dCIsCiAgICAgICAgImhvcm55bG92ZXNpY2ttZXNzIjogImdpcmwgaW4gcmVkIiwKICAgICAgICAiaSB3YW5uYSBiZSB5b3VyIGdpcmxmcmllbmQiOiAiZ2lybCBpbiByZWQiLAogICAgICAgICJrLiI6ICJjaWdhcmV0dGVzIGFmdGVyIFNleCIsCiAgICAgICAgImxvb2thbGlrZSI6ICJjb25hbiBncmF5IiwKICAgICAgICAibG90dGEgdHJ1ZSBjcmltZSI6ICJwZW5lbG9wZSBzY290dCIsCiAgICAgICAgIm15IG1hbidzIGEgaGV4YWdvbiAobXVzaWMgdmlkZW8pIjogIm3DvG5lY2F0IiwKICAgICAgICAicsOkdCI6ICJwZW5lbG9wZSBzY290dCIsCiAgICAgICAgInNhcHBobyI6ICJidXNoaWVzIiwKICAgICAgICAic2VyaWFsIGtpbGxlciAtIGxhbmEgZGVsIHJleSBseXJpY3MiOiAibGFuYSBkZWwgcmV5IiwKICAgICAgICAic3VnYXIsIHdlJ3JlIGdvaW4gZG93biBidXQgaXQncyBjcmVlcGllciI6ICJrYWRlIiwKICAgICAgICAic3dlYXRlciB3ZWF0aGVyIjogInRoZSBuZWlnaGJvdXJob29kIiwKICAgICAgICAidGFsaWEg4qe44qe4IGdpcmwgaW4gcmVkIGNvdmVyIjogImdpcmwgaW4gcmVkIiwKICAgICAgICAidHYiOiAiYnVzaGllcyIsCiAgICAgICAgInVuaW9uaXplIC0gbcO8bmVjYXQgKG11c2ljIHZpZGVvKSI6ICJtw7xuZWNhdCIsCiAgICAgICAgIndhdGNoIHlvdSBzbGVlcC4iOiAiZ2lybCBpbiByZWQiLAogICAgICAgICJ5b3UgdXNlZCBtZSBmb3IgbXkgbG92ZV9naXJsIGluIHJlZCI6ICJnaXJsIGluIHJlZCIsCiAgICB9CgoKICAgIGNsYXNzIFVua25vd25NdXNpY0FydGlzdEVycm9yKEV4Y2VwdGlvbik6CiAgICAgICAgIiIiUmFpc2VkIHdoZW4gdGhlcmUgaXMgYW4gdW5rbm93biBtdXNpYyBhcnRpc3QiIiIKCgogICAgZGVmIHNvcnRfZGljdChkOiBEaWN0W3N0ciwgaW50XSkgLT4gRGljdFtzdHIsIGludF06CiAgICAgICAgcmV0dXJuIHtrOiB2IGZvciBrLCB2IGluIHNvcnRlZChkLml0ZW1zKCksIGtleT1sYW1iZGEgaXRlbTogaXRlbVsxXSwgcmV2ZXJzZT1UcnVlKX0KCgogICAgZGVmIGZzcGxpdF9kZWxzKHM6IHN0ciwgKmRlbHM6IHN0cikgLT4gc3RyOgogICAgICAgIGZvciBkZWxpbSBpbiBkZWxzOgogICAgICAgICAgICBzID0gcy5zcGxpdChkZWxpbSwgbWF4c3BsaXQ9MSlbMF0KCiAgICAgICAgcmV0dXJuIHMuc3RyaXAoKQoKCiAgICBkZWYgZ2V0X2FydGlzdF9mcm9tX3Nvbmcoc29uZzogc3RyKSAtPiBzdHI6CiAgICAgICAgc29uZyA9IHNvbmcubG93ZXIoKQogICAgICAgIGRlbGltczogVHVwbGVbc3RyLCAuLi5dID0gKAogICAgICAgICAgICAi4oCTIiwKICAgICAgICAgICAgIi0iLAogICAgICAgICkKCiAgICAgICAgaWYgYW55KGQgaW4gc29uZyBmb3IgZCBpbiBkZWxpbXMpOgogICAgICAgICAgICByZXR1cm4gZnNwbGl0X2RlbHMoCiAgICAgICAgICAgICAgICBzb25nLAogICAgICAgICAgICAgICAgKmRlbGltcywKICAgICAgICAgICAgICAgICIsIiwKICAgICAgICAgICAgICAgICJmZWF0LiIsCiAgICAgICAgICAgICAgICAiLiIsCiAgICAgICAgICAgICAgICAiJiIsCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBzb25nIGluIFNPTkdfVE9fQVJUSVNUOgogICAgICAgICAgICAgICAgcmV0dXJuIFNPTkdfVE9fQVJUSVNUW3NvbmddLmxvd2VyKCkKCiAgICAgICAgICAgIHJhaXNlIFVua25vd25NdXNpY0FydGlzdEVycm9yKGYiTm8gaGFuZGxlZCBhcnRpc3QgZm9yIHNvbmc6IHtzb25nIXJ9IikKCgogICAgZGVmIGdldF9wbGF5ZWQoZGF0YTogTGlzdFtUdXBsZVtzdHIsIHN0cl1dKSAtPiBEaWN0W3N0ciwgaW50XToKICAgICAgICBwbGF5ZWQ6IERpY3Rbc3RyLCBpbnRdID0ge30KCiAgICAgICAgZm9yIHNvbmcsIF8gaW4gZGF0YToKICAgICAgICAgICAgaWYgc29uZyBub3QgaW4gcGxheWVkOgogICAgICAgICAgICAgICAgcGxheWVkW3NvbmddID0gMAoKICAgICAgICAgICAgcGxheWVkW3NvbmddICs9IDEKCiAgICAgICAgcmV0dXJuIHNvcnRfZGljdChwbGF5ZWQpCgoKICAgIGRlZiBnZXRfeXRfdXJsc19mcm9tX2RhdGEoZGF0YTogTGlzdFtUdXBsZVtzdHIsIHN0cl1dKSAtPiBEaWN0W3N0ciwgc3RyXToKICAgICAgICByZXR1cm4ge3Nvbmc6IGYiaHR0cHM6Ly9hcmktd2ViLnh5ei95dC93YXRjaD92PXt5dF9pZH0iIGZvciBzb25nLCB5dF9pZCBpbiBkYXRhfQoKCiAgICBkZWYgZ2V0X2FydGlzdHNfZnJvbV9wbGF5ZWQocGxheWVkOiBEaWN0W3N0ciwgaW50XSkgLT4gRGljdFtzdHIsIGludF06CiAgICAgICAgYXJ0aXN0czogRGljdFtzdHIsIGludF0gPSB7fQoKICAgICAgICBmb3Igc29uZyBpbiBwbGF5ZWQ6CiAgICAgICAgICAgIGFydGlzdDogc3RyID0gZ2V0X2FydGlzdF9mcm9tX3Nvbmcoc29uZykKCiAgICAgICAgICAgIGlmIGFydGlzdCBub3QgaW4gYXJ0aXN0czoKICAgICAgICAgICAgICAgIGFydGlzdHNbYXJ0aXN0XSA9IDAKCiAgICAgICAgICAgIGFydGlzdHNbYXJ0aXN0XSArPSAxCgogICAgICAgIHJldHVybiBzb3J0X2RpY3QoYXJ0aXN0cykKCgogICAgZGVmIHBhcnNlX3Nvbmcoc29uZzogc3RyKSAtPiBUdXBsZVtzdHIsIHN0cl06CiAgICAgICAgYmFzZW5hbWU6IHN0ciA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShzb25nKSlbMF0KICAgICAgICByZXR1cm4gYmFzZW5hbWVbOi0xNF0sIGJhc2VuYW1lWy0xMjotMV0KCgogICAgZGVmIHBhcnNlX2RhdGEoZGF0YTogTGlzdFtUdXBsZVtzdHIsIHN0cl1dKSAtPiBEaWN0W3N0ciwgQW55XToKICAgICAgICBwbGF5ZWQ6IERpY3Rbc3RyLCBpbnRdID0gZ2V0X3BsYXllZChkYXRhKQoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAidG90YWwiOiBsZW4oZGF0YSksCiAgICAgICAgICAgICJwbGF5ZWQiOiBwbGF5ZWQsCiAgICAgICAgICAgICJhcnRpc3RzIjogZ2V0X2FydGlzdHNfZnJvbV9wbGF5ZWQocGxheWVkKSwKICAgICAgICAgICAgInl0LXVybHMiOiBnZXRfeXRfdXJsc19mcm9tX2RhdGEoZGF0YSksCiAgICAgICAgfQoKCiAgICBkZWYgZ2VuZXJhdGVfaHRtbF9yZXBvcnQoZGF0YTogRGljdFtzdHIsIEFueV0pIC0+IHN0cjoKICAgICAgICBzb25ncyA9IGFydGlzdHMgPSAiIgoKICAgICAgICBmb3Igc29uZywgdGltZXMgaW4gZGF0YVsicGxheWVkIl0uaXRlbXMoKToKICAgICAgICAgICAgc29uZ3MgKz0gZiI8bGk+PGEgaHJlZj1cIntkYXRhWyd5dC11cmxzJ11bc29uZ119XCI+e2h0bWxfZXNjYXBlKHNvbmcpfTwvYT4gKHBsYXllZCB7dGltZXN9IHRpbWV7J3MnIGlmIHRpbWVzID4gMSBlbHNlICcnfSk8L2xpPiIKCiAgICAgICAgZm9yIGFydGlzdCwgc29uZ24gaW4gZGF0YVsiYXJ0aXN0cyJdLml0ZW1zKCk6CiAgICAgICAgICAgIGFydGlzdHMgKz0gZiI8bGk+e2h0bWxfZXNjYXBlKGFydGlzdCl9ICh7c29uZ259IHNvbmd7J3MnIGlmIHNvbmduID4gMSBlbHNlICcnfSBwbGF5ZWQpPC9saT4iCgogICAgICAgIHJldHVybiBodG1sX21pbmlmeSgKICAgICAgICAgICAgZiIiIjwhRE9DVFlQRSBodG1sPgogICAgPGh0bWwgbGFuZz0iZW4iPgogICAgICAgIDxoZWFkPgogICAgICAgICAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+CiAgICAgICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSI+CiAgICAgICAgICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIj4KICAgICAgICAgICAgPHRpdGxlPkhUTUwgbXB2IHNvbmcgcmVwb3J0PC90aXRsZT4KCiAgICAgICAgICAgIDxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJXaGF0IGRvIHlvdSBsaXN0ZW4gdG8iIC8+CiAgICAgICAgICAgIDxtZXRhCiAgICAgICAgICAgICAgICBuYW1lPSJrZXl3b3JkcyIKICAgICAgICAgICAgICAgIGNvbnRlbnQ9InNvcnQsIHJlcG9ydCwgbXVzaWMsIG11c2ljIHJlcG9ydCwgbGlzdGVuLCBzb25nIgogICAgICAgICAgICAvPgogICAgICAgICAgICA8bWV0YQogICAgICAgICAgICAgICAgbmFtZT0icm9ib3RzIgogICAgICAgICAgICAgICAgY29udGVudD0iZm9sbG93LCBpbmRleCwgbWF4LXNuaXBwZXQ6LTEsIG1heC12aWRlby1wcmV2aWV3Oi0xLCBtYXgtaW1hZ2UtcHJldmlldzpsYXJnZSIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPG1ldGEgcHJvcGVydHk9Im9nOnR5cGUiIGNvbnRlbnQ9IndlYnNpdGUiIC8+CiAgICAgICAgICAgIDxtZXRhIG5hbWU9ImNvbG9yLXNjaGVtZSIgY29udGVudD0iZGFyayIgLz4KCiAgICAgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL3N0eWxlcy5jc3MiIC8+CiAgICAgICAgPC9oZWFkPgoKICAgICAgICA8Ym9keT4KICAgICAgICAgICAgPG1haW4+CiAgICAgICAgICAgICAgICA8aDE+V2hhdCBhcmUgeW91IGxpc3RlbmluZyB0bz88L2gxPgoKICAgICAgICAgICAgICAgIDxociAvPgoKICAgICAgICAgICAgICAgIDxoMj5Tb25nczwvaDE+CgogICAgICAgICAgICAgICAgPGRldGFpbHM+CiAgICAgICAgICAgICAgICAgICAgPHN1bW1hcnk+RXhwYW5kIGZvciB0aGUgbGlzdCBvZiBzb25nczwvc3VtbWFyeT4KCiAgICAgICAgICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgICAgICAgICB7c29uZ3N9CiAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgIDwvZGV0YWlscz4KCiAgICAgICAgICAgICAgICA8aDI+QXJ0aXN0czwvaDI+CgogICAgICAgICAgICAgICAgPGRldGFpbHM+CiAgICAgICAgICAgICAgICAgICAgPHN1bW1hcnk+RXhwYW5kIGZvciB0aGUgbGlzdCBvZiBhcnRpc3RzPC9zdW1tYXJ5PgoKICAgICAgICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICAgICAgICAgIHthcnRpc3RzfQogICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICA8L2RldGFpbHM+CiAgICAgICAgICAgIDwvbWFpbj4KICAgICAgICA8L2JvZHk+CiAgICA8L2h0bWw+IiIiCiAgICAgICAgKQoKCiAgICBkZWYgbWFpbigpIC0+IGludDoKICAgICAgICAiIiJFbnRyeS9tYWluIGZ1bmN0aW9uIiIiCgogICAgICAgIGRhdGE6IExpc3RbVHVwbGVbc3RyLCBzdHJdXSA9IFtdCgogICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmV4cGFuZHVzZXIoIn4vLm1wdnAiKSwgInIiKSBhcyBtcHZfZGF0YToKICAgICAgICAgICAgZm9yIGxpbmUgaW4gbXB2X2RhdGE6CiAgICAgICAgICAgICAgICBpZiAnImRhdGEiJyBub3QgaW4gbGluZToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgIGRhdGEuYXBwZW5kKHBhcnNlX3NvbmcodWpzb24ubG9hZHMobGluZSlbImRhdGEiXSkpCgogICAgICAgIHdpdGggb3BlbigiaW5kZXguaHRtbCIsICJ3IikgYXMgaDoKICAgICAgICAgICAgaC53cml0ZShnZW5lcmF0ZV9odG1sX3JlcG9ydChwYXJzZV9kYXRhKGRhdGEpKSkKCiAgICAgICAgcmV0dXJuIDAKCgogICAgaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICAgICBhc3NlcnQgbWFpbi5fX2Fubm90YXRpb25zX18uZ2V0KCJyZXR1cm4iKSBpcyBpbnQsICJtYWluKCkgc2hvdWxkIHJldHVybiBhbiBpbnRlZ2VyIgoKICAgICAgICBmaWx0ZXJfd2FybmluZ3MoImVycm9yIiwgY2F0ZWdvcnk9V2FybmluZykKICAgICAgICBzeXMuZXhpdChtYWluKCkpCgpUaGlzIGlzIGEgcHJldHR5IGVhc3kgdGhpbmcsIHZlcnkgc3R1cGlkIGFuZCBub3QgZm9vbC1wcm9vZiBidXQgZWgsCnRoaXMgZ2VuZXJhdG9yIHNob3VsZCB3b3JrIG91dCBvZiB0aGUgYm94IHdpdGggdGhlIHNvbmcgbmFtZSBmb3JtYXQKYmVpbmcgYGFydGlzdCBuYW1lIC0gc29uZ2AsIGlmIGl0J3Mgbm90IG1ha2Ugc3VyZSB0byBhZGQgYSBsb3dlcmNhc2UKZW50cnkgdG8gYFNPTkdfVE9fQVJUSVNUYCwgbGlrZSBpZiB5b3VyIHNvbmcgd2FzIG5hbWVkIGxpa2UgYG5hTWUgLSBBcnRpc3RgCnlvdSB3aWxsIGhhdmUgdG8gYWRkIHRoaXMgZW50cnk6CgogICAgIm5hbWUgLSBhcnRpc3QiOiAiYXJ0aXN0IiwKClRoZXNlIHNldHRpbmdzIHRoYXQgeW91IHNlZSBpbiBteSBzY3JpcHQgYXJlIGZvciBteSBwbGF5bGlzdAoKIyMgMi4yIERlcGVuZGVuY2llcwoKSGVyZSdzIHRoZSBweXRob24gZGVwZW5kZW5jaWVzIHlvdSBuZWVkOgoKICAgIGNzcy1odG1sLWpzLW1pbmlmeQogICAgdWpzb24KCllvdSBuZWVkIHRvIGluc3RhbGwgdGhlbSB1c2luZwoKICAgIHB5dGhvbjMgLW0gcGlwIGluc3RhbGwgLS11c2VyIGNzcy1odG1sLWpzLW1pbmlmeSB1anNvbgoKIyMgMi4zIFRoZSBkYXRhIHJlcG9ydAoKT25jZSB5b3UgaGF2ZSBlbm91Z2ggZGF0YSB0byBtYWtlIGEgcmVwb3J0IGZyb20sIHJ1biB0aGUgc2NyaXB0LApqdXN0CgogICAgcHl0aG9uMyBtYWluLnB5CgpPciB3aGF0ZXZlciwgaXQnbGwgZ2VuZXJhdGUgYGluZGV4Lmh0bWxgIGZpbGUgYW5kIGl0J2xsIGluY2x1ZGUgYWxsIG9mCnlvdXIgcmVwb3J0IGRhdGEsIHlvdSBjYW4gYWxzbyBzdHlsZSBpdCB1c2luZyB0aGUgYHN0eWxlcy5jc3NgIGZpbGUsIGZvcgpleGFtcGxlIEkgc3RvbGUgc29tZSBDU1MgZnJvbSBteSBibG9nIGFuZCBpdCBsb29rcyBnb29kIGVub3VnaCB0Ymg6CgogICAgQGltcG9ydCB1cmwoImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vaGFjay1mb250QDMvYnVpbGQvd2ViL2hhY2subWluLmNzcyIpOwoKICAgIDpyb290IHsKICAgICAgICBjb2xvci1zY2hlbWU6IGRhcms7CgogICAgICAgIC0tY2xyLWJnOiAjMjYyMjIwOwogICAgICAgIC0tY2xyLWZnOiAjZjlmNmU4OwogICAgfQoKICAgICosCiAgICAqOjpiZWZvcmUsCiAgICAqOjphZnRlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY2xyLWJnKTsKICAgICAgICBjb2xvcjogdmFyKC0tY2xyLWZnKTsKICAgICAgICBmb250LWZhbWlseTogSGFjaywgaGFjaywgbW9ub3NwYWNlOwoKICAgICAgICBzY3JvbGxiYXItd2lkdGg6IG5vbmU7CiAgICAgICAgLW1zLW92ZXJmbG93LXN0eWxlOiBub25lOwoKICAgICAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKCiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwoKICAgICAgICBzY3JvbGwtYmVoYXZpb3I6IHNtb290aDsKICAgIH0KCiAgICA6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICB9CgogICAgYm9keSB7CiAgICAgICAgbWFyZ2luOiBhdXRvOwogICAgICAgIHBhZGRpbmc6IDJyZW07CiAgICAgICAgbWF4LXdpZHRoOiAxMTAwcHg7CiAgICAgICAgbWluLWhlaWdodDogMTAwdmg7CiAgICAgICAgdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplU3BlZWQ7CiAgICB9CgogICAgaDEgewogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBtYXJnaW46IDFlbTsKICAgICAgICBmb250LXNpemU6IDJlbTsKICAgIH0KCiAgICBsaSB7CiAgICAgICAgbWFyZ2luOiAwLjVlbTsKICAgIH0KCiAgICBhIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgICAgdGV4dC1zaGFkb3c6IDBweCAwcHggNHB4IHdoaXRlOwogICAgfQoKCiAgICBAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkgewogICAgICAgICosCiAgICAgICAgKjo6YmVmb3JlLAogICAgICAgICo6OmFmdGVyIHsKICAgICAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IDAuMDFtcyAhaW1wb3J0YW50OwogICAgICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IDAuMDFtcyAhaW1wb3J0YW50OwoKICAgICAgICAgICAgLXdlYmtpdC1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDEgIWltcG9ydGFudDsKCiAgICAgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4wMW1zICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIC1vLXRyYW5zaXRpb24tZHVyYXRpb246IDAuMDFtcyAhaW1wb3J0YW50OwogICAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjAxbXMgIWltcG9ydGFudDsKCiAgICAgICAgICAgIHNjcm9sbC1iZWhhdmlvcjogYXV0byAhaW1wb3J0YW50OwogICAgICAgIH0KICAgIH0KCiAgICBAbWVkaWEgKHByZWZlcnMtY29udHJhc3Q6IG1vcmUpIHsKICAgICAgICA6cm9vdCB7CiAgICAgICAgICAgIC0tY2xyLWJnOiBibGFjazsKICAgICAgICAgICAgLS1jbHItZmc6IHdoaXRlOwoKICAgICAgICAgICAgLS1zY3JvbGxiYXItaGVpZ2h0OiAxMnB4OyAvKiBUT0RPOiBGaXJlZm94ICovCiAgICAgICAgfQoKICAgICAgICBodG1sOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICAgICAgICAgIGRpc3BsYXk6IGluaXRpYWwgIWltcG9ydGFudDsKICAgICAgICB9CgogICAgICAgICosCiAgICAgICAgKjo6YmVmb3JlLAogICAgICAgICo6OmFmdGVyIHsKICAgICAgICAgICAgc2Nyb2xsYmFyLXdpZHRoOiBpbml0aWFsICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIC1tcy1vdmVyZmxvdy1zdHlsZTogaW5pdGlhbCAhaW1wb3J0YW50OwogICAgICAgIH0KCiAgICAgICAgYSB7CiAgICAgICAgICAgIHRleHQtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7CgogICAgICAgICAgICAtd2Via2l0LXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIGRvdHRlZCAhaW1wb3J0YW50OwogICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSBkb3R0ZWQgIWltcG9ydGFudDsKICAgICAgICB9CiAgICB9CgojIyAzLiBGaW5pc2hpbmcKClRoYXQncyBhbGwsIGVuam95IHlvdXIgc3RhdGlzdGljcywgYW5kIGFzIG9mIG5vdyBJIHNoYWxsIGdvIGNvbGxlY3QgbW9yZSBkYXRhLApJIGFscmVhZHkgaGF2ZSAxOEtCIG9mIGl0IQo=", + "content": "QSBkYXkgYWdvIEkgc3RhcnRlZCBjb2xsZWN0aW5nIGRhdGEgYWJvdXQgd2hhdCBJIGxpc3RlbiB0bwpvbiBteSBwbGF5bGlzdCwgYW5kIGN1cnJlbnRseSBpdCdzIHdvcmtpbmcgb3V0IGFtYXppbmcsIGl0J3MgdmVyeQpmdW4sIHNvIEkgdGhvdWdodCB0byBteXNlbGYsICd3aHkgbm90IHNoYXJlIGl0Jywgc28gaGVyZQp5b3UgZ28KCiMjIDEuIFNldCB1cCBgbXB2cGAgYWxpYXMKCmBtcHZwYCBhbGlhcyBpcyB3aGF0IHlvdSB3aWxsIGhhdmUgdG8gdXNlIHRvIGNvbGxlY3QgZGF0YSBhYm91dAp5b3VyIHBsYXlsaXN0LCB5b3UgY2FuIHNldCB1cCBhbm90aGVyIG5hbWUgYnV0IGNvZGUgc2hvdWxkIGJlCmFyb3VuZCB0aGUgc2FtZQoKQmFzaWNhbGx5LCBhZGQgdGhpcyB0byB5b3VyIGB+Ly5iYXNocmNgOgoKICAgIG1wdnBfY29sbGVjdCgpIHsKICAgICAgICBbICEgLWYgIiRIT01FLy5tcHZwIiBdICYmIDogPiIkSE9NRS8ubXB2cCIKCiAgICAgICAgc2xlZXAgMgoKICAgICAgICB3aGlsZSB0cnVlOyBkbwogICAgICAgICAgICBzbGVlcCA1CgogICAgICAgICAgICB4PSIkKGVjaG8gJ3sgImNvbW1hbmQiOiBbImdldF9wcm9wZXJ0eSIsICJwYXRoIl0gfScgfCBzb2NhdCAtIC90bXAvbXB2aXBjKSIKCiAgICAgICAgICAgIFsgISAiJHgiIF0gJiYgYnJlYWsKCiAgICAgICAgICAgIGlmIFsgIiR4IiBdICYmIFsgIiR4IiAhPSAiJCh0YWlsIC1uIDEgIiRIT01FLy5tcHZwIikiIF07IHRoZW4KICAgICAgICAgICAgICAgIHNsZWVwIDQKCiAgICAgICAgICAgICAgICB5PSIkKGVjaG8gJ3sgImNvbW1hbmQiOiBbImdldF9wcm9wZXJ0eSIsICJwYXRoIl0gfScgfCBzb2NhdCAtIC90bXAvbXB2aXBjKSIKICAgICAgICAgICAgICAgIFsgIiR4IiA9ICIkeSIgXSAmJiBlY2hvICIkeCIgPj4iJEhPTUUvLm1wdnAiCiAgICAgICAgICAgIGZpCiAgICAgICAgZG9uZQogICAgfQoKICAgIGFsaWFzIG1wdnA9J21wdnBfY29sbGVjdCAmIG1wdiAtLXNodWZmbGUgLS1sb29wLXBsYXlsaXN0IC0taW5wdXQtaXBjLXNlcnZlcj0vdG1wL21wdmlwYycKCldoZW4geW91IHVzZSB0aGUgYG1wdnBgIGFsaWFzIGl0J2xsIHN0YXJ0IHRoZSBkYXRhIGNvbGxlY3RvciBpbiB0aGUgYmFja2dyb3VuZCwKdGhlIElQQyB3aWxsIGJlIGFjY2Vzc2libGUgdGhvdWdoIGAvdG1wL21wdmlwY2AsIHRoaXMgd2lsbCBjb2xsZWN0IGFsbApkYXRhIHRvIGB+Ly5tcHZwYCwgbGlzdGVuIHRvIHNvbWUgbXVzaWMgYW5kIGlnbm9yZSBpdCBmb3IgYSBiaXQsIGFsc28sIGtlZXAgaW4gbWluZCwKdGhpcyBjb2RlIGlzIGJhZCBiZWNhdXNlIEknbSB0b28gbGF6eSB0byBpbXByb3ZlIGl0IGFuZCBJIG1hZGUgaXQgZmFzdCwgYW55d2F5LCB5b3UKbmVlZCB0byBpbnN0YWxsIGBzb2NhdGAgZm9yIHRoaXMgdG8gd29yawoKIyMgMi4gR2VuZXJhdGUgZGF0YSByZXBvcnQKCldlbGwgYXQgdGhpcyBwb2ludCB5b3UgY2FuIGRvIGFueXRoaW5nIHlvdSB3YW50IHdpdGggeW91ciBkYXRhLCBhbHRob3VnaApJIG1hZGUgYSBzaW1wbGUgZ2VuZXJhdG9yIGZvciBpdAoKU28gSSBtYWRlIHVzZSBvZiB0aGUgZGF0YSBJIGhhdmUgYW5kIG15IHBsYXlsaXN0IHN0cnVjdHVyZSwgaGVyZSdzIGFuIGV4YW1wbGUgZW50cnk6CgogICAgeyJkYXRhIjoicGxheWxpc3QvZ2lybCBpbiByZWQgLSBpJ2xsIGRpZSBhbnl3YXkuIFs4TU1hMzVCM0hUOF0ubXAzIiwicmVxdWVzdF9pZCI6MCwiZXJyb3IiOiJzdWNjZXNzIn0KClRoZXJlJ3MgYW4gSUQgdGhlcmUgc28gSSBhZGQgWW91VHViZSBhZGRpbmcgdG8gdGhlIGdlbmVyYXRvciBieQpkZWZhdWx0LCB5b3VycyBtaWdodCBub3QgaGF2ZSBpdCwgYnV0IEkgbWVhbiwgeW91IGNhbiBzdGlsbCBwcmV0dHkgbXVjaAp1c2UgaXQsIGp1c3QgbGlua3Mgd29uJ3Qgd29yawoKIyMjIDIuMSBUaGUgc2NyaXB0CgpJIG1hZGUgYSBweXRob24gc2NyaXB0IGFzIG15IGdlbmVyYXRvcjoKCiAgICAjIS91c3IvYmluL2VudiBweXRob24zCiAgICAjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQogICAgIiIiTVBWIHBsYXlsaXN0IHNvbmcgcmVwb3J0ZXIiIiIKCiAgICBpbXBvcnQgb3MKICAgIGltcG9ydCBzeXMKICAgIGZyb20gaHRtbCBpbXBvcnQgZXNjYXBlIGFzIGh0bWxfZXNjYXBlCiAgICBmcm9tIHR5cGluZyBpbXBvcnQgQW55LCBEaWN0LCBMaXN0LCBUdXBsZQogICAgZnJvbSB3YXJuaW5ncyBpbXBvcnQgZmlsdGVyd2FybmluZ3MgYXMgZmlsdGVyX3dhcm5pbmdzCgogICAgaW1wb3J0IHVqc29uICAjIHR5cGU6IGlnbm9yZQogICAgZnJvbSBjc3NfaHRtbF9qc19taW5pZnkgaW1wb3J0IGh0bWxfbWluaWZ5ICAjIHR5cGU6IGlnbm9yZQoKICAgIFNPTkdfVE9fQVJUSVNUOiBEaWN0W3N0ciwgc3RyXSA9IHsKICAgICAgICAiMTk4NSI6ICJibyBidXJuaGFtIiwKICAgICAgICAiYXBvY2FseXBzZSI6ICJjaWdhcmV0dGVzIGFmdGVyIFNleCIsCiAgICAgICAgImFzdHJvbm9teSI6ICJjb25hbiBncmF5IiwKICAgICAgICAiYnJvb2tseW4gYmFieSI6ICJsYW5hIGRlbCByZXkiLAogICAgICAgICJjb21lIGhvbWUgdG8gbWUiOiAiY3Jhd2xlcnMiLAogICAgICAgICJkYWRkeSBpc3N1ZXMiOiAidGhlIG5laWdoYm91cmhvb2QiLAogICAgICAgICJmZWVsIGJldHRlciI6ICJwZW5lbG9wZSBzY290dCIsCiAgICAgICAgImhvcm55bG92ZXNpY2ttZXNzIjogImdpcmwgaW4gcmVkIiwKICAgICAgICAiaSB3YW5uYSBiZSB5b3VyIGdpcmxmcmllbmQiOiAiZ2lybCBpbiByZWQiLAogICAgICAgICJrLiI6ICJjaWdhcmV0dGVzIGFmdGVyIFNleCIsCiAgICAgICAgImxvb2thbGlrZSI6ICJjb25hbiBncmF5IiwKICAgICAgICAibG90dGEgdHJ1ZSBjcmltZSI6ICJwZW5lbG9wZSBzY290dCIsCiAgICAgICAgIm15IG1hbidzIGEgaGV4YWdvbiAobXVzaWMgdmlkZW8pIjogIm3DvG5lY2F0IiwKICAgICAgICAicsOkdCI6ICJwZW5lbG9wZSBzY290dCIsCiAgICAgICAgInNhcHBobyI6ICJidXNoaWVzIiwKICAgICAgICAic2VyaWFsIGtpbGxlciAtIGxhbmEgZGVsIHJleSBseXJpY3MiOiAibGFuYSBkZWwgcmV5IiwKICAgICAgICAic3VnYXIsIHdlJ3JlIGdvaW4gZG93biBidXQgaXQncyBjcmVlcGllciI6ICJrYWRlIiwKICAgICAgICAic3dlYXRlciB3ZWF0aGVyIjogInRoZSBuZWlnaGJvdXJob29kIiwKICAgICAgICAidGFsaWEg4qe44qe4IGdpcmwgaW4gcmVkIGNvdmVyIjogImdpcmwgaW4gcmVkIiwKICAgICAgICAidHYiOiAiYnVzaGllcyIsCiAgICAgICAgInVuaW9uaXplIC0gbcO8bmVjYXQgKG11c2ljIHZpZGVvKSI6ICJtw7xuZWNhdCIsCiAgICAgICAgIndhdGNoIHlvdSBzbGVlcC4iOiAiZ2lybCBpbiByZWQiLAogICAgICAgICJ5b3UgdXNlZCBtZSBmb3IgbXkgbG92ZV9naXJsIGluIHJlZCI6ICJnaXJsIGluIHJlZCIsCiAgICB9CgoKICAgIGNsYXNzIFVua25vd25NdXNpY0FydGlzdEVycm9yKEV4Y2VwdGlvbik6CiAgICAgICAgIiIiUmFpc2VkIHdoZW4gdGhlcmUgaXMgYW4gdW5rbm93biBtdXNpYyBhcnRpc3QiIiIKCgogICAgZGVmIHNvcnRfZGljdChkOiBEaWN0W3N0ciwgaW50XSkgLT4gRGljdFtzdHIsIGludF06CiAgICAgICAgcmV0dXJuIHtrOiB2IGZvciBrLCB2IGluIHNvcnRlZChkLml0ZW1zKCksIGtleT1sYW1iZGEgaXRlbTogaXRlbVsxXSwgcmV2ZXJzZT1UcnVlKX0KCgogICAgZGVmIGZzcGxpdF9kZWxzKHM6IHN0ciwgKmRlbHM6IHN0cikgLT4gc3RyOgogICAgICAgIGZvciBkZWxpbSBpbiBkZWxzOgogICAgICAgICAgICBzID0gcy5zcGxpdChkZWxpbSwgbWF4c3BsaXQ9MSlbMF0KCiAgICAgICAgcmV0dXJuIHMuc3RyaXAoKQoKCiAgICBkZWYgZ2V0X2FydGlzdF9mcm9tX3Nvbmcoc29uZzogc3RyKSAtPiBzdHI6CiAgICAgICAgc29uZyA9IHNvbmcubG93ZXIoKQogICAgICAgIGRlbGltczogVHVwbGVbc3RyLCAuLi5dID0gKAogICAgICAgICAgICAi4oCTIiwKICAgICAgICAgICAgIi0iLAogICAgICAgICkKCiAgICAgICAgaWYgYW55KGQgaW4gc29uZyBmb3IgZCBpbiBkZWxpbXMpOgogICAgICAgICAgICByZXR1cm4gZnNwbGl0X2RlbHMoCiAgICAgICAgICAgICAgICBzb25nLAogICAgICAgICAgICAgICAgKmRlbGltcywKICAgICAgICAgICAgICAgICIsIiwKICAgICAgICAgICAgICAgICJmZWF0LiIsCiAgICAgICAgICAgICAgICAiLiIsCiAgICAgICAgICAgICAgICAiJiIsCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBzb25nIGluIFNPTkdfVE9fQVJUSVNUOgogICAgICAgICAgICAgICAgcmV0dXJuIFNPTkdfVE9fQVJUSVNUW3NvbmddLmxvd2VyKCkKCiAgICAgICAgICAgIHJhaXNlIFVua25vd25NdXNpY0FydGlzdEVycm9yKGYiTm8gaGFuZGxlZCBhcnRpc3QgZm9yIHNvbmc6IHtzb25nIXJ9IikKCgogICAgZGVmIGdldF9wbGF5ZWQoZGF0YTogTGlzdFtUdXBsZVtzdHIsIHN0cl1dKSAtPiBEaWN0W3N0ciwgaW50XToKICAgICAgICBwbGF5ZWQ6IERpY3Rbc3RyLCBpbnRdID0ge30KCiAgICAgICAgZm9yIHNvbmcsIF8gaW4gZGF0YToKICAgICAgICAgICAgaWYgc29uZyBub3QgaW4gcGxheWVkOgogICAgICAgICAgICAgICAgcGxheWVkW3NvbmddID0gMAoKICAgICAgICAgICAgcGxheWVkW3NvbmddICs9IDEKCiAgICAgICAgcmV0dXJuIHNvcnRfZGljdChwbGF5ZWQpCgoKICAgIGRlZiBnZXRfeXRfdXJsc19mcm9tX2RhdGEoZGF0YTogTGlzdFtUdXBsZVtzdHIsIHN0cl1dKSAtPiBEaWN0W3N0ciwgc3RyXToKICAgICAgICByZXR1cm4ge3Nvbmc6IGYiaHR0cHM6Ly9hcmktd2ViLnh5ei95dC93YXRjaD92PXt5dF9pZH0iIGZvciBzb25nLCB5dF9pZCBpbiBkYXRhfQoKCiAgICBkZWYgZ2V0X2FydGlzdHNfZnJvbV9wbGF5ZWQocGxheWVkOiBEaWN0W3N0ciwgaW50XSkgLT4gRGljdFtzdHIsIGludF06CiAgICAgICAgYXJ0aXN0czogRGljdFtzdHIsIGludF0gPSB7fQoKICAgICAgICBmb3Igc29uZyBpbiBwbGF5ZWQ6CiAgICAgICAgICAgIGFydGlzdDogc3RyID0gZ2V0X2FydGlzdF9mcm9tX3Nvbmcoc29uZykKCiAgICAgICAgICAgIGlmIGFydGlzdCBub3QgaW4gYXJ0aXN0czoKICAgICAgICAgICAgICAgIGFydGlzdHNbYXJ0aXN0XSA9IDAKCiAgICAgICAgICAgIGFydGlzdHNbYXJ0aXN0XSArPSAxCgogICAgICAgIHJldHVybiBzb3J0X2RpY3QoYXJ0aXN0cykKCgogICAgZGVmIHBhcnNlX3Nvbmcoc29uZzogc3RyKSAtPiBUdXBsZVtzdHIsIHN0cl06CiAgICAgICAgYmFzZW5hbWU6IHN0ciA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShzb25nKSlbMF0KICAgICAgICByZXR1cm4gYmFzZW5hbWVbOi0xNF0sIGJhc2VuYW1lWy0xMjotMV0KCgogICAgZGVmIHBhcnNlX2RhdGEoZGF0YTogTGlzdFtUdXBsZVtzdHIsIHN0cl1dKSAtPiBEaWN0W3N0ciwgQW55XToKICAgICAgICBwbGF5ZWQ6IERpY3Rbc3RyLCBpbnRdID0gZ2V0X3BsYXllZChkYXRhKQoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAidG90YWwiOiBsZW4oZGF0YSksCiAgICAgICAgICAgICJwbGF5ZWQiOiBwbGF5ZWQsCiAgICAgICAgICAgICJhcnRpc3RzIjogZ2V0X2FydGlzdHNfZnJvbV9wbGF5ZWQocGxheWVkKSwKICAgICAgICAgICAgInl0LXVybHMiOiBnZXRfeXRfdXJsc19mcm9tX2RhdGEoZGF0YSksCiAgICAgICAgfQoKCiAgICBkZWYgZ2VuZXJhdGVfaHRtbF9yZXBvcnQoZGF0YTogRGljdFtzdHIsIEFueV0pIC0+IHN0cjoKICAgICAgICBzb25ncyA9IGFydGlzdHMgPSAiIgoKICAgICAgICBmb3Igc29uZywgdGltZXMgaW4gZGF0YVsicGxheWVkIl0uaXRlbXMoKToKICAgICAgICAgICAgc29uZ3MgKz0gZiI8bGk+PGEgaHJlZj1cIntkYXRhWyd5dC11cmxzJ11bc29uZ119XCI+e2h0bWxfZXNjYXBlKHNvbmcpfTwvYT4gKHBsYXllZCB7dGltZXN9IHRpbWV7J3MnIGlmIHRpbWVzID4gMSBlbHNlICcnfSk8L2xpPiIKCiAgICAgICAgZm9yIGFydGlzdCwgc29uZ24gaW4gZGF0YVsiYXJ0aXN0cyJdLml0ZW1zKCk6CiAgICAgICAgICAgIGFydGlzdHMgKz0gZiI8bGk+e2h0bWxfZXNjYXBlKGFydGlzdCl9ICh7c29uZ259IHNvbmd7J3MnIGlmIHNvbmduID4gMSBlbHNlICcnfSBwbGF5ZWQpPC9saT4iCgogICAgICAgIHJldHVybiBodG1sX21pbmlmeSgKICAgICAgICAgICAgZiIiIjwhRE9DVFlQRSBodG1sPgogICAgPGh0bWwgbGFuZz0iZW4iPgogICAgICAgIDxoZWFkPgogICAgICAgICAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+CiAgICAgICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSI+CiAgICAgICAgICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIj4KICAgICAgICAgICAgPHRpdGxlPkhUTUwgbXB2IHNvbmcgcmVwb3J0PC90aXRsZT4KCiAgICAgICAgICAgIDxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJXaGF0IGRvIHlvdSBsaXN0ZW4gdG8iIC8+CiAgICAgICAgICAgIDxtZXRhCiAgICAgICAgICAgICAgICBuYW1lPSJrZXl3b3JkcyIKICAgICAgICAgICAgICAgIGNvbnRlbnQ9InNvcnQsIHJlcG9ydCwgbXVzaWMsIG11c2ljIHJlcG9ydCwgbGlzdGVuLCBzb25nIgogICAgICAgICAgICAvPgogICAgICAgICAgICA8bWV0YQogICAgICAgICAgICAgICAgbmFtZT0icm9ib3RzIgogICAgICAgICAgICAgICAgY29udGVudD0iZm9sbG93LCBpbmRleCwgbWF4LXNuaXBwZXQ6LTEsIG1heC12aWRlby1wcmV2aWV3Oi0xLCBtYXgtaW1hZ2UtcHJldmlldzpsYXJnZSIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPG1ldGEgcHJvcGVydHk9Im9nOnR5cGUiIGNvbnRlbnQ9IndlYnNpdGUiIC8+CiAgICAgICAgICAgIDxtZXRhIG5hbWU9ImNvbG9yLXNjaGVtZSIgY29udGVudD0iZGFyayIgLz4KCiAgICAgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iL3N0eWxlcy5jc3MiIC8+CiAgICAgICAgPC9oZWFkPgoKICAgICAgICA8Ym9keT4KICAgICAgICAgICAgPG1haW4+CiAgICAgICAgICAgICAgICA8aDE+V2hhdCBhcmUgeW91IGxpc3RlbmluZyB0bz88L2gxPgoKICAgICAgICAgICAgICAgIDxociAvPgoKICAgICAgICAgICAgICAgIDxoMj5Ub3RhbCBzb25ncyBwbGF5ZWQ6IHtkYXRhWyd0b3RhbCddfTwvaDI+CgogICAgICAgICAgICAgICAgPGgyPlNvbmdzPC9oMT4KCiAgICAgICAgICAgICAgICA8ZGV0YWlscz4KICAgICAgICAgICAgICAgICAgICA8c3VtbWFyeT5FeHBhbmQgZm9yIHRoZSBsaXN0IG9mIHNvbmdzPC9zdW1tYXJ5PgoKICAgICAgICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICAgICAgICAgIHtzb25nc30KICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgPC9kZXRhaWxzPgoKICAgICAgICAgICAgICAgIDxoMj5BcnRpc3RzPC9oMj4KCiAgICAgICAgICAgICAgICA8ZGV0YWlscz4KICAgICAgICAgICAgICAgICAgICA8c3VtbWFyeT5FeHBhbmQgZm9yIHRoZSBsaXN0IG9mIGFydGlzdHM8L3N1bW1hcnk+CgogICAgICAgICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgICAgICAgICAge2FydGlzdHN9CiAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgIDwvZGV0YWlscz4KICAgICAgICAgICAgPC9tYWluPgogICAgICAgIDwvYm9keT4KICAgIDwvaHRtbD4iIiIKICAgICAgICApCgoKICAgIGRlZiBtYWluKCkgLT4gaW50OgogICAgICAgICIiIkVudHJ5L21haW4gZnVuY3Rpb24iIiIKCiAgICAgICAgZGF0YTogTGlzdFtUdXBsZVtzdHIsIHN0cl1dID0gW10KCiAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguZXhwYW5kdXNlcigifi8ubXB2cCIpLCAiciIpIGFzIG1wdl9kYXRhOgogICAgICAgICAgICBmb3IgbGluZSBpbiBtcHZfZGF0YToKICAgICAgICAgICAgICAgIGlmICciZGF0YSInIG5vdCBpbiBsaW5lOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAgICAgZGF0YS5hcHBlbmQocGFyc2Vfc29uZyh1anNvbi5sb2FkcyhsaW5lKVsiZGF0YSJdKSkKCiAgICAgICAgd2l0aCBvcGVuKCJpbmRleC5odG1sIiwgInciKSBhcyBoOgogICAgICAgICAgICBoLndyaXRlKGdlbmVyYXRlX2h0bWxfcmVwb3J0KHBhcnNlX2RhdGEoZGF0YSkpKQoKICAgICAgICByZXR1cm4gMAoKCiAgICBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgICAgIGFzc2VydCBtYWluLl9fYW5ub3RhdGlvbnNfXy5nZXQoInJldHVybiIpIGlzIGludCwgIm1haW4oKSBzaG91bGQgcmV0dXJuIGFuIGludGVnZXIiCgogICAgICAgIGZpbHRlcl93YXJuaW5ncygiZXJyb3IiLCBjYXRlZ29yeT1XYXJuaW5nKQogICAgICAgIHN5cy5leGl0KG1haW4oKSkKClRoaXMgaXMgYSBwcmV0dHkgZWFzeSB0aGluZywgdmVyeSBzdHVwaWQgYW5kIG5vdCBmb29sLXByb29mIGJ1dCBlaCwKdGhpcyBnZW5lcmF0b3Igc2hvdWxkIHdvcmsgb3V0IG9mIHRoZSBib3ggd2l0aCB0aGUgc29uZyBuYW1lIGZvcm1hdApiZWluZyBgYXJ0aXN0IG5hbWUgLSBzb25nYCwgaWYgaXQncyBub3QgbWFrZSBzdXJlIHRvIGFkZCBhIGxvd2VyY2FzZQplbnRyeSB0byBgU09OR19UT19BUlRJU1RgLCBsaWtlIGlmIHlvdXIgc29uZyB3YXMgbmFtZWQgbGlrZSBgbmFNZSAtIEFydGlzdGAKeW91IHdpbGwgaGF2ZSB0byBhZGQgdGhpcyBlbnRyeToKCiAgICAibmFtZSAtIGFydGlzdCI6ICJhcnRpc3QiLAoKVGhlc2Ugc2V0dGluZ3MgdGhhdCB5b3Ugc2VlIGluIG15IHNjcmlwdCBhcmUgZm9yIG15IHBsYXlsaXN0CgojIyAyLjIgRGVwZW5kZW5jaWVzCgpIZXJlJ3MgdGhlIHB5dGhvbiBkZXBlbmRlbmNpZXMgeW91IG5lZWQ6CgogICAgY3NzLWh0bWwtanMtbWluaWZ5CiAgICB1anNvbgoKWW91IG5lZWQgdG8gaW5zdGFsbCB0aGVtIHVzaW5nCgogICAgcHl0aG9uMyAtbSBwaXAgaW5zdGFsbCAtLXVzZXIgY3NzLWh0bWwtanMtbWluaWZ5IHVqc29uCgojIyAyLjMgVGhlIGRhdGEgcmVwb3J0CgpPbmNlIHlvdSBoYXZlIGVub3VnaCBkYXRhIHRvIG1ha2UgYSByZXBvcnQgZnJvbSwgcnVuIHRoZSBzY3JpcHQsCmp1c3QKCiAgICBweXRob24zIG1haW4ucHkKCk9yIHdoYXRldmVyLCBpdCdsbCBnZW5lcmF0ZSBgaW5kZXguaHRtbGAgZmlsZSBhbmQgaXQnbGwgaW5jbHVkZSBhbGwgb2YKeW91ciByZXBvcnQgZGF0YSwgeW91IGNhbiBhbHNvIHN0eWxlIGl0IHVzaW5nIHRoZSBgc3R5bGVzLmNzc2AgZmlsZSwgZm9yCmV4YW1wbGUgSSBzdG9sZSBzb21lIENTUyBmcm9tIG15IGJsb2cgYW5kIGl0IGxvb2tzIGdvb2QgZW5vdWdoIHRiaDoKCiAgICBAaW1wb3J0IHVybCgiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9oYWNrLWZvbnRAMy9idWlsZC93ZWIvaGFjay5taW4uY3NzIik7CgogICAgOnJvb3QgewogICAgICAgIGNvbG9yLXNjaGVtZTogZGFyazsKCiAgICAgICAgLS1jbHItYmc6ICMyNjIyMjA7CiAgICAgICAgLS1jbHItZmc6ICNmOWY2ZTg7CiAgICB9CgogICAgKiwKICAgICo6OmJlZm9yZSwKICAgICo6OmFmdGVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jbHItYmcpOwogICAgICAgIGNvbG9yOiB2YXIoLS1jbHItZmcpOwogICAgICAgIGZvbnQtZmFtaWx5OiBIYWNrLCBoYWNrLCBtb25vc3BhY2U7CgogICAgICAgIHNjcm9sbGJhci13aWR0aDogbm9uZTsKICAgICAgICAtbXMtb3ZlcmZsb3ctc3R5bGU6IG5vbmU7CgogICAgICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwoKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CgogICAgICAgIHNjcm9sbC1iZWhhdmlvcjogc21vb3RoOwogICAgfQoKICAgIDo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgIH0KCiAgICBib2R5IHsKICAgICAgICBtYXJnaW46IGF1dG87CiAgICAgICAgcGFkZGluZzogMnJlbTsKICAgICAgICBtYXgtd2lkdGg6IDExMDBweDsKICAgICAgICBtaW4taGVpZ2h0OiAxMDB2aDsKICAgICAgICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVTcGVlZDsKICAgIH0KCiAgICBoMSB7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIG1hcmdpbjogMWVtOwogICAgICAgIGZvbnQtc2l6ZTogMmVtOwogICAgfQoKICAgIGxpIHsKICAgICAgICBtYXJnaW46IDAuNWVtOwogICAgfQoKICAgIGEgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICB0ZXh0LXNoYWRvdzogMHB4IDBweCA0cHggd2hpdGU7CiAgICB9CgoKICAgIEBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSB7CiAgICAgICAgKiwKICAgICAgICAqOjpiZWZvcmUsCiAgICAgICAgKjo6YWZ0ZXIgewogICAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogMC4wMW1zICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMC4wMW1zICFpbXBvcnRhbnQ7CgogICAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDEgIWltcG9ydGFudDsKICAgICAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMSAhaW1wb3J0YW50OwoKICAgICAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjAxbXMgIWltcG9ydGFudDsKICAgICAgICAgICAgLW8tdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4wMW1zICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMDFtcyAhaW1wb3J0YW50OwoKICAgICAgICAgICAgc2Nyb2xsLWJlaGF2aW9yOiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgICAgfQogICAgfQoKICAgIEBtZWRpYSAocHJlZmVycy1jb250cmFzdDogbW9yZSkgewogICAgICAgIDpyb290IHsKICAgICAgICAgICAgLS1jbHItYmc6IGJsYWNrOwogICAgICAgICAgICAtLWNsci1mZzogd2hpdGU7CgogICAgICAgICAgICAtLXNjcm9sbGJhci1oZWlnaHQ6IDEycHg7IC8qIFRPRE86IEZpcmVmb3ggKi8KICAgICAgICB9CgogICAgICAgIGh0bWw6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgICAgICAgICAgZGlzcGxheTogaW5pdGlhbCAhaW1wb3J0YW50OwogICAgICAgIH0KCiAgICAgICAgKiwKICAgICAgICAqOjpiZWZvcmUsCiAgICAgICAgKjo6YWZ0ZXIgewogICAgICAgICAgICBzY3JvbGxiYXItd2lkdGg6IGluaXRpYWwgIWltcG9ydGFudDsKICAgICAgICAgICAgLW1zLW92ZXJmbG93LXN0eWxlOiBpbml0aWFsICFpbXBvcnRhbnQ7CiAgICAgICAgfQoKICAgICAgICBhIHsKICAgICAgICAgICAgdGV4dC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsKCiAgICAgICAgICAgIC13ZWJraXQtdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgZG90dGVkICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIGRvdHRlZCAhaW1wb3J0YW50OwogICAgICAgIH0KICAgIH0KCiMjIDMuIEZpbmlzaGluZwoKVGhhdCdzIGFsbCwgZW5qb3kgeW91ciBzdGF0aXN0aWNzLCBhbmQgYXMgb2Ygbm93IEkgc2hhbGwgZ28gY29sbGVjdCBtb3JlIGRhdGEsCkkgYWxyZWFkeSBoYXZlIDE4S0Igb2YgaXQhCg==", "version": 1, "time": 1664422575.771071, "keywords": "song report song-report ststistics mpv mpv.io player music listening data html css python python3 generator",