Skip to contentLy8gPGJsb2NrOmdlbmVyYXRlOjI+CmZ1bmN0aW9uIGdlbmVyYXRlRGF0YSgpIHsKICBjb25zdCBkYXRhID0gW107CiAgY29uc3QgZW5kID0gVXRpbHMuc3RhcnRPZlRvZGF5KCk7CiAgbGV0IGR0ID0gbmV3IERhdGUobmV3IERhdGUoKS5zZXREYXRlKGVuZC5nZXREYXRlKCkgLSAzNjUpKTsKICB3aGlsZSAoZHQgPD0gZW5kKSB7CiAgICBjb25zdCBpc28gPSBkdC50b0lTT1N0cmluZygpLnN1YnN0cigwLCAxMCk7CiAgICBkYXRhLnB1c2goewogICAgICB4OiBpc28sCiAgICAgIHk6IFV0aWxzLmlzb0RheU9mV2VlayhkdCksCiAgICAgIGQ6IGlzbywKICAgICAgdjogTWF0aC5yYW5kb20oKSAqIDUwCiAgICB9KTsKICAgIGR0ID0gbmV3IERhdGUoZHQuc2V0RGF0ZShkdC5nZXREYXRlKCkgKyAxKSk7CiAgfQogIHJldHVybiBkYXRhOwp9Ci8vIDwvYmxvY2s6Z2VuZXJhdGU+CgovLyA8YmxvY2s6ZGF0YToxPgpjb25zdCBkYXRhID0gewogIGRhdGFzZXRzOiBbewogICAgbGFiZWw6ICdNeSBNYXRyaXgnLAogICAgZGF0YTogZ2VuZXJhdGVEYXRhKCkKICB9XQp9OwovLyA8L2Jsb2NrOmRhdGE+CgovLyA8YmxvY2s6Y29uZmlnOjA+CmNvbnN0IGNvbmZpZyA9IHsKICB0eXBlOiAnbWF0cml4JywKICBkYXRhOiBkYXRhLAogIG9wdGlvbnM6IHsKICAgIGFzcGVjdFJhdGlvOiA1LAogICAgYmFja2dyb3VuZENvbG9yKGMpIHsKICAgICAgY29uc3QgdmFsdWUgPSBjLmRhdGFzZXQuZGF0YVtjLmRhdGFJbmRleF0udjsKICAgICAgY29uc3QgYWxwaGEgPSAoMTAgKyB2YWx1ZSkgLyA2MDsKICAgICAgcmV0dXJuIGhlbHBlcnMuY29sb3IoJ2dyZWVuJykuYWxwaGEoYWxwaGEpLnJnYlN0cmluZygpOwogICAgfSwKICAgIGJvcmRlckNvbG9yKGMpIHsKICAgICAgY29uc3QgdmFsdWUgPSBjLmRhdGFzZXQuZGF0YVtjLmRhdGFJbmRleF0udjsKICAgICAgY29uc3QgYWxwaGEgPSAoMTAgKyB2YWx1ZSkgLyA2MDsKICAgICAgcmV0dXJuIGhlbHBlcnMuY29sb3IoJ2dyZWVuJykuYWxwaGEoYWxwaGEpLmRhcmtlbigwLjMpLnJnYlN0cmluZygpOwogICAgfSwKICAgIGJvcmRlcldpZHRoOiAxLAogICAgaG92ZXJCYWNrZ3JvdW5kQ29sb3I6ICd5ZWxsb3cnLAogICAgaG92ZXJCb3JkZXJDb2xvcjogJ3llbGxvd2dyZWVuJywKICAgIHdpZHRoKGMpIHsKICAgICAgY29uc3QgYSA9IGMuY2hhcnQuY2hhcnRBcmVhIHx8IHt9OwogICAgICByZXR1cm4gKGEucmlnaHQgLSBhLmxlZnQpIC8gNTMgLSAxOwogICAgfSwKICAgIGhlaWdodChjKSB7CiAgICAgIGNvbnN0IGEgPSBjLmNoYXJ0LmNoYXJ0QXJlYSB8fCB7fTsKICAgICAgcmV0dXJuIChhLmJvdHRvbSAtIGEudG9wKSAvIDcgLSAxOwogICAgfSwKICAgIHBsdWdpbnM6IHsKICAgICAgbGVnZW5kOiBmYWxzZSwKICAgICAgdG9vbHRpcDogewogICAgICAgIGRpc3BsYXlDb2xvcnM6IGZhbHNlLAogICAgICAgIGNhbGxiYWNrczogewogICAgICAgICAgdGl0bGUoKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgIH0sCiAgICAgICAgICBsYWJlbChjb250ZXh0KSB7CiAgICAgICAgICAgIGNvbnN0IHYgPSBjb250ZXh0LmRhdGFzZXQuZGF0YVtjb250ZXh0LmRhdGFJbmRleF07CiAgICAgICAgICAgIHJldHVybiBbJ2Q6ICcgKyB2LmQsICd2OiAnICsgdi52LnRvRml4ZWQoMildOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgIH0sCiAgICBzY2FsZXM6IHsKICAgICAgeTogewogICAgICAgIHR5cGU6ICd0aW1lJywKICAgICAgICBvZmZzZXQ6IHRydWUsCiAgICAgICAgdGltZTogewogICAgICAgICAgdW5pdDogJ2RheScsCiAgICAgICAgICByb3VuZDogJ2RheScsCiAgICAgICAgICBpc29XZWVrZGF5OiAxLAogICAgICAgICAgcGFyc2VyOiAnaScsCiAgICAgICAgICBkaXNwbGF5Rm9ybWF0czogewogICAgICAgICAgICBkYXk6ICdpaWlpaWknCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICByZXZlcnNlOiB0cnVlLAogICAgICAgIHBvc2l0aW9uOiAncmlnaHQnLAogICAgICAgIHRpY2tzOiB7CiAgICAgICAgICBtYXhSb3RhdGlvbjogMCwKICAgICAgICAgIGF1dG9Ta2lwOiB0cnVlLAogICAgICAgICAgcGFkZGluZzogMSwKICAgICAgICAgIGZvbnQ6IHsKICAgICAgICAgICAgc2l6ZTogOQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgZ3JpZDogewogICAgICAgICAgZGlzcGxheTogZmFsc2UsCiAgICAgICAgICBkcmF3Qm9yZGVyOiBmYWxzZSwKICAgICAgICAgIHRpY2tMZW5ndGg6IDAKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHg6IHsKICAgICAgICB0eXBlOiAndGltZScsCiAgICAgICAgcG9zaXRpb246ICdib3R0b20nLAogICAgICAgIG9mZnNldDogdHJ1ZSwKICAgICAgICB0aW1lOiB7CiAgICAgICAgICB1bml0OiAnd2VlaycsCiAgICAgICAgICByb3VuZDogJ3dlZWsnLAogICAgICAgICAgaXNvV2Vla2RheTogMSwKICAgICAgICAgIGRpc3BsYXlGb3JtYXRzOiB7CiAgICAgICAgICAgIHdlZWs6ICdNTU0gZGQnCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB0aWNrczogewogICAgICAgICAgbWF4Um90YXRpb246IDAsCiAgICAgICAgICBhdXRvU2tpcDogdHJ1ZSwKICAgICAgICAgIGZvbnQ6IHsKICAgICAgICAgICAgc2l6ZTogOQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgZ3JpZDogewogICAgICAgICAgZGlzcGxheTogZmFsc2UsCiAgICAgICAgICBkcmF3Qm9yZGVyOiBmYWxzZSwKICAgICAgICAgIHRpY2tMZW5ndGg6IDAsCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgbGF5b3V0OiB7CiAgICAgIHBhZGRpbmc6IHsKICAgICAgICB0b3A6IDEwCiAgICAgIH0KICAgIH0KICB9Cn07Ci8vIDwvYmxvY2s6Y29uZmlnPgoKY29uc3QgYWN0aW9ucyA9IFsKICB7CiAgICBuYW1lOiAnUmFuZG9taXplJywKICAgIGhhbmRsZXIoY2hhcnQpIHsKICAgICAgY2hhcnQuZGF0YS5kYXRhc2V0cy5mb3JFYWNoKGRhdGFzZXQgPT4gewogICAgICAgIGRhdGFzZXQuZGF0YS5mb3JFYWNoKHBvaW50ID0+IHsKICAgICAgICAgIHBvaW50LnYgPSBNYXRoLnJhbmRvbSgpICogNTA7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgICBjaGFydC51cGRhdGUoKTsKICAgIH0KICB9LApdOwoKbW9kdWxlLmV4cG9ydHMgPSB7CiAgYWN0aW9ucywKICBjb25maWcsCn07