User:Evad37/rater/sandbox/app.js: Difference between revisions
Appearance
Content deleted Content added
remove params from WPBIO when syncing to shell template |
. |
||
Line 695: | Line 695: | ||
}; |
}; |
||
BannerListWidget.prototype.syncShellTemplateWithBiographyBanner = function (biographyBanner) { |
BannerListWidget.prototype.syncShellTemplateWithBiographyBanner = function (biographyBanner) { |
||
biographyBanner = biographyBanner || this |
biographyBanner = biographyBanner || this.items.find(function (banner) { |
||
return banner.mainText === "WikiProject Biography" || banner.redirectTargetMainText === "WikiProject Biography"; |
return banner.mainText === "WikiProject Biography" || banner.redirectTargetMainText === "WikiProject Biography"; |
||
}); |
}); |
||
Line 4,460: | Line 4,460: | ||
},{"./Windows/LoadDialog":13,"./Windows/MainWindow":14}]},{},[2]) |
},{"./Windows/LoadDialog":13,"./Windows/MainWindow":14}]},{},[2]) |
||
//# sourceMappingURL=data:application/json;charset=utf-8;base64, |
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJwYWNrYWdlLmpzb24iLCJyYXRlci1zcmMvQXBwLmpzIiwicmF0ZXItc3JjL1RlbXBsYXRlLmpzIiwicmF0ZXItc3JjL1dpbmRvd3MvQ29tcG9uZW50cy9CYW5uZXJMaXN0V2lkZ2V0LmpzIiwicmF0ZXItc3JjL1dpbmRvd3MvQ29tcG9uZW50cy9CYW5uZXJXaWRnZXQuanMiLCJyYXRlci1zcmMvV2luZG93cy9Db21wb25lbnRzL0Ryb3Bkb3duUGFyYW1ldGVyV2lkZ2V0LmpzIiwicmF0ZXItc3JjL1dpbmRvd3MvQ29tcG9uZW50cy9Ib3Jpem9udGFsTGF5b3V0V2lkZ2V0LmpzIiwicmF0ZXItc3JjL1dpbmRvd3MvQ29tcG9uZW50cy9QYXJhbWV0ZXJMaXN0V2lkZ2V0LmpzIiwicmF0ZXItc3JjL1dpbmRvd3MvQ29tcG9uZW50cy9QYXJhbWV0ZXJXaWRnZXQuanMiLCJyYXRlci1zcmMvV2luZG93cy9Db21wb25lbnRzL1ByZWZzRm9ybVdpZGdldC5qcyIsInJhdGVyLXNyYy9XaW5kb3dzL0NvbXBvbmVudHMvU3VnZ2VzdGlvbkxvb2t1cFRleHRJbnB1dFdpZGdldC5qcyIsInJhdGVyLXNyYy9XaW5kb3dzL0NvbXBvbmVudHMvVG9wQmFyV2lkZ2V0LmpzIiwicmF0ZXItc3JjL1dpbmRvd3MvTG9hZERpYWxvZy5qcyIsInJhdGVyLXNyYy9XaW5kb3dzL01haW5XaW5kb3cuanMiLCJyYXRlci1zcmMvYXBpLmpzIiwicmF0ZXItc3JjL2F1dG9zdGFydC5qcyIsInJhdGVyLXNyYy9jYWNoZS5qcyIsInJhdGVyLXNyYy9jb25maWcuanMiLCJyYXRlci1zcmMvY3NzLmpzIiwicmF0ZXItc3JjL2dldEJhbm5lcnMuanMiLCJyYXRlci1zcmMvcHJlZnMuanMiLCJyYXRlci1zcmMvc2V0dXAuanMiLCJyYXRlci1zcmMvdXRpbC5qcyIsInJhdGVyLXNyYy93aW5kb3dNYW5hZ2VyLmpzIl0sIm5hbWVz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QkFBQSxXQUFBLEdBQUEsSUFBQSxHQUFBLFFBQUEsTUFBQSxDQUFBLFNBQUEsQ0FBQSxjQUFBLENBQUEsSUFBQSxDQUFBLEdBQUEsRUFBQSxHQUFBLFNBQUEsSUFBQSxHQUFBLHFCQUFBLEdBQUEsTUFBQSxDQUFBLHdCQUFBLENBQUEsR0FBQSxFQUFBLEdBQUEsY0FBQSxJQUFBLEtBQUEsSUFBQSxDQUFBLEdBQUEsSUFBQSxJQUFBLENBQUEsR0FBQSxLQUFBLE1BQUEsQ0FBQSxjQUFBLENBQUEsTUFBQSxFQUFBLEdBQUEsRUFBQSxJQUFBLFlBQUEsTUFBQSxDQUFBLEdBQUEsSUFBQSxHQUFBLENBQUEsR0FBQSxTQUFBLE1BQUEsY0FBQSxHQUFBLE1BQUEsS0FBQSxJQUFBLEtBQUEsQ0FBQSxHQUFBLENBQUEsR0FBQSxFQUFBLE1BQUEsWUFBQSxNQUFBO0FBQUEsU0FBQSx1QkFBQSxHQUFBLFdBQUEsR0FBQSxJQUFBLEdBQUEsQ0FBQSxVQUFBLEdBQUEsR0FBQSxnQkFBQSxHQUFBO0FBQUEsU0FBQSxtQkFBQSxHQUFBLFdBQUEsa0JBQUEsQ0FBQSxHQUFBLEtBQUEsZ0JBQUEsQ0FBQSxHQUFBLEtBQUEsMkJBQUEsQ0FBQSxHQUFBLEtBQUEsa0JBQUE7QUFBQSxTQUFBLG1CQUFBLGNBQUEsU0FBQTtBQUFBLFNBQUEsNEJBQUEsQ0FBQSxFQUFBLE1BQUEsU0FBQSxDQUFBLHFCQUFBLENBQUEsc0JBQUEsaUJBQUEsQ0FBQSxDQUFBLEVBQUEsTUFBQSxPQUFBLENBQUEsR0FBQSxNQUFBLENBQUEsU0FBQSxDQUFBLFFBQUEsQ0FBQSxJQUFBLENBQUEsQ0FBQSxFQUFBLEtBQUEsYUFBQSxDQUFBLGlCQUFBLENBQUEsQ0FBQSxXQUFBLEVBQUEsQ0FBQSxHQUFBLENBQUEsQ0FBQSxXQUFBLENBQUEsSUFBQSxNQUFBLENBQUEsY0FBQSxDQUFBLG1CQUFBLEtBQUEsQ0FBQSxJQUFBLENBQUEsQ0FBQSxPQUFBLENBQUEsK0RBQUEsSUFBQSxDQUFBLENBQUEsVUFBQSxpQkFBQSxDQUFBLENBQUEsRUFBQSxNQUFBO0FB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QUFBLEVBQUEsTUFBQSxTQUFBLENBQUEscUJBQUEsQ0FBQSxzQkFBQSxpQkFBQSxDQUFBLENBQUEsRUFBQSxNQUFBLE9BQUEsQ0FBQSxHQUFBLE1BQUEsQ0FBQSxTQUFBLENBQUEsUUFBQSxDQUFBLElBQUEsQ0FBQSxDQUFBLEVBQUEsS0FBQSxhQUFBLENBQUEsaUJBQUEsQ0FBQSxDQUFBLFdBQUEsRUFBQSxDQUFBLEdBQUEsQ0FBQSxDQUFBLFdBQUEsQ0FBQSxJQUFBLE1BQUEsQ0FBQSxjQUFBLENBQUEsbUJBQUEsS0FBQSxDQUFBLElBQUEsQ0FBQSxDQUFBLE9BQUEsQ0FBQSwrREFBQSxJQUFBLENBQUEsQ0FBQSxVQUFBLGlCQUFBLENBQUEsQ0FBQSxFQUFBLE1BQUE7QUFBQSxTQUFBLGtCQUFBLEdBQUEsRUFBQSxHQUFBLFFBQUEsR0FBQSxZQUFBLEdBQUEsR0FBQSxHQUFBLENBQUEsTUFBQSxFQUFBLEdBQUEsR0FBQSxHQUFBLENBQUEsTUFBQSxXQUFBLENBQUEsTUFBQSxJQUFBLE9BQUEsS0FBQSxDQUFBLEdBQUEsR0FBQSxDQUFBLEdBQUEsR0FBQSxFQUFBLENBQUEsTUFBQSxJQUFBLENBQUEsQ0FBQSxJQUFBLEdBQUEsQ0FBQSxDQUFBLFlBQUEsSUFBQTtBQUFBLFNBQUEsc0JBQUEsR0FBQSxFQUFBLENBQUEsZUFBQSxNQUFBLHNCQUFBLE1BQUEsQ0FBQSxRQUFBLElBQUEsTUFBQSxDQUFBLEdBQUEsZ0JBQUEsSUFBQSxXQUFBLEVBQUEsYUFBQSxFQUFBLGNBQUEsRUFBQSxHQUFBLFNBQUEsaUJBQUEsRUFBQSxHQUFBLEdBQUEsQ0FBQSxNQUFBLENBQUEsUUFBQSxLQUFBLEVBQUEsSUFBQSxFQUFBLElBQUEsRUFBQSxHQUFBLEVBQUEsQ0FBQSxJQUFBLElBQUEsSUFBQSxHQUFBLEVBQUEsV0FBQSxJQUFBLENBQUEsSUFBQSxDQUFBLEVBQUEsQ0FBQSxLQUFBLE9BQUEsQ0FBQSxJQUFBLElBQUEsQ0FBQSxNQUFBLEtBQUEsQ0FBQSxvQkFBQSxHQUFBLElBQUEsRUFBQSxTQUFBLEVBQUEsR0FB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QUFBO0FBQWdELFNBQUEsdUJBQUEsR0FBQSxXQUFBLEdBQUEsSUFBQSxHQUFBLENBQUEsVUFBQSxHQUFBLEdBQUEsZ0JBQUEsR0FBQTtBQUFBLFNBQUEsbUJBQUEsR0FBQSxXQUFBLGtCQUFBLENBQUEsR0FBQSxLQUFBLGdCQUFBLENBQUEsR0FBQSxLQUFBLDJCQUFBLENBQUEsR0FBQSxLQUFBLGtCQUFBO0FBQUEsU0FBQSxtQkFBQSxjQUFBLFNBQUE7QUFBQSxTQUFBLDRCQUFBLENBQUEsRUFBQSxNQUFBLFNBQUEsQ0FBQSxxQkFBQSxDQUFBLHNCQUFBLGlCQUFBLENBQUEsQ0FBQSxFQUFBLE1BQUEsT0FBQSxDQUFBLEdBQUEsTUFBQSxDQUFBLFNBQUEsQ0FBQSxRQUFBLENBQUEsSUFBQSxDQUFBLENBQUEsRUFBQSxLQUFBLGFBQUEsQ0FBQSxpQkFBQSxDQUFBLENBQUEsV0FBQSxFQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsV0FBQSxDQUFBLElBQUEsTUFBQSxDQUFBLGNBQUEsQ0FBQSxtQkFBQSxLQUFBLENBQUEsSUFBQSxDQUFBLENBQUEsT0FBQSxDQUFBLCtEQUFBLElBQUEsQ0FBQSxDQUFBLFVBQUEsaUJBQUEsQ0FBQSxDQUFBLEVBQUEsTUFBQTtBQUFBLFNBQUEsaUJBQUEsSUFBQSxlQUFBLE1BQUEsb0JBQUEsTUFBQSxDQUFBLFFBQUEsSUFBQSxNQUFBLENBQUEsSUFBQSxVQUFBLEtBQUEsQ0FBQSxJQUFBLENBQUEsSUFBQTtBQUFBLFNBQUEsbUJBQUEsR0FBQSxRQUFBLEtBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxVQUFBLGlCQUFBLENBQUEsR0FBQTtBQUFBLFNBQUEsa0JBQUEsR0FBQSxFQUFBLEdBQUEsUUFBQSxHQUFBLFlBQUEsR0FBQSxHQUFBLEdBQUEsQ0FBQSxNQUFBLEVBQUEsR0FBQSxHQUFBLEdBQUEsQ0FBQSxNQUFBLFdBQUEsQ0FBQSxNQUFBLElBQUEsT0FBQSxLQUFBLENBQUEsR0FBQSxHQUFBLENBQUEsR0FBQSxHQUFBLEVBQUEsQ0FBQSxNQUFBLElBQUEsQ0FBQSxDQUFB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QUM7RUFBQSxFQUFDO0FBQ2pELENBQUM7QUFBQyxJQUFBLFFBQUEsR0FFYSxZQUFZLEVBQzNCO0FBQUEsT0FBQSxjQUFBLFFBQUE7Ozs7Ozs7OztBQzdNQSxJQUFBLElBQUEsR0FBQSxPQUFBO0FBQXNDLFNBQUEsbUJBQUEsR0FBQSxXQUFBLGtCQUFBLENBQUEsR0FBQSxLQUFBLGdCQUFBLENBQUEsR0FBQSxLQUFBLDJCQUFBLENBQUEsR0FBQSxLQUFBLGtCQUFBO0FBQUEsU0FBQSxtQkFBQSxjQUFBLFNBQUE7QUFBQSxTQUFBLDRCQUFBLENBQUEsRUFBQSxNQUFBLFNBQUEsQ0FBQSxxQkFBQSxDQUFBLHNCQUFBLGlCQUFBLENBQUEsQ0FBQSxFQUFBLE1BQUEsT0FBQSxDQUFBLEdBQUEsTUFBQSxDQUFBLFNBQUEsQ0FBQSxRQUFBLENBQUEsSUFBQSxDQUFBLENBQUEsRUFBQSxLQUFBLGFBQUEsQ0FBQSxpQkFBQSxDQUFBLENBQUEsV0FBQSxFQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsV0FBQSxDQUFBLElBQUEsTUFBQSxDQUFBLGNBQUEsQ0FBQSxtQkFBQSxLQUFBLENBQUEsSUFBQSxDQUFBLENBQUEsT0FBQSxDQUFBLCtEQUFBLElBQUEsQ0FBQSxDQUFBLFVBQUEsaUJBQUEsQ0FBQSxDQUFBLEVBQUEsTUFBQTtBQUFBLFNBQUEsaUJBQUEsSUFBQSxlQUFBLE1BQUEsb0JBQUEsTUFBQSxDQUFBLFFBQUEsSUFBQSxNQUFBLENBQUEsSUFBQSxVQUFBLEtBQUEsQ0FBQSxJQUFBLENBQUEsSUFBQTtBQUFBLFNBQUEsbUJBQUEsR0FBQSxRQUFBLEtBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxVQUFBLGlCQUFBLENBQUEsR0FBQTtBQUFBLFNBQUEsa0JBQUEsR0FBQSxFQUFBLEdBQUEsUUFBQSxHQUFBLFlBQUEsR0FBQSxHQUFBLEdBQUEsQ0FBQSxNQUFBLEVBQUEsR0FBQSxHQUFBLEdBQUEsQ0FBQSxNQUFBLFdBQUEsQ0FBQSxNQUFBLElBQUEsT0FBQSxLQUFBLENBQUEsR0FBQSxHQUFBLENBQUEsR0FBQSxH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LE9BQUE7QUFDQSxJQUFBLE1BQUEsR0FBQSxPQUFBO0FBQ0EsSUFBQSxTQUFBLEdBQUEsT0FBQTtBQUNBLElBQUEsYUFBQSxHQUFBLHNCQUFBLENBQUEsT0FBQTtBQUNBLElBQUEsS0FBQSxHQUFBLE9BQUE7QUFDQSxJQUFBLEtBQUEsR0FBQSx1QkFBQSxDQUFBLE9BQUE7QUFBa0MsU0FBQSx5QkFBQSxlQUFBLE9BQUEsa0NBQUEsS0FBQSxPQUFBLE9BQUEsSUFBQSx3QkFBQSxZQUFBLHlCQUFBLFdBQUEsS0FBQSxZQUFBLEtBQUE7QUFBQSxTQUFBLHdCQUFBLEdBQUEsUUFBQSxHQUFBLElBQUEsR0FBQSxDQUFBLFVBQUEsV0FBQSxHQUFBLFFBQUEsR0FBQSxhQUFBLE9BQUEsQ0FBQSxHQUFBLHlCQUFBLEdBQUEsdUNBQUEsR0FBQSxVQUFBLEtBQUEsR0FBQSx3QkFBQSxRQUFBLEtBQUEsSUFBQSxLQUFBLENBQUEsR0FBQSxDQUFBLEdBQUEsWUFBQSxLQUFBLENBQUEsR0FBQSxDQUFBLEdBQUEsU0FBQSxNQUFBLFdBQUEscUJBQUEsR0FBQSxNQUFBLENBQUEsY0FBQSxJQUFBLE1BQUEsQ0FBQSx3QkFBQSxXQUFBLEdBQUEsSUFBQSxHQUFBLFFBQUEsTUFBQSxDQUFBLFNBQUEsQ0FBQSxjQUFBLENBQUEsSUFBQSxDQUFBLEdBQUEsRUFBQSxHQUFBLFNBQUEsSUFBQSxHQUFBLHFCQUFBLEdBQUEsTUFBQSxDQUFBLHdCQUFBLENBQUEsR0FBQSxFQUFBLEdBQUEsY0FBQSxJQUFBLEtBQUEsSUFBQSxDQUFBLEdBQUEsSUFBQSxJQUFBLENBQUEsR0FBQSxLQUFBLE1BQUEsQ0FBQSxjQUFBLENBQUEsTUFBQSxFQUFBLEdBQUEsRUFBQSxJQUFBLFlBQUEsTUFBQSxDQUFBLEdBQUEsSUFBQSxHQUFBLENBQUEsR0FBQSxTQUFBLE1BQUEsY0FBQSxHQUFBLE1BQUEsS0FBQSxJQUFBLEtBQUEsQ0FBQSxHQUFBLENBQUEsR0FBQSxFQUFBLE1BQUEsWUFBQSxNQUFBO0FBQUEsU0FBQSx1QkFBQSxHQUFBLFdBQUEsR0FBQSxJQUFBLEdBQUEsQ0FBQSxVQUFBLEdBQUEsR0FBQSxnQkFBQSxHQUFBO0FBQ2xDOztBQUVBLFNBQVMsVUFBVSxDQUFFLE1BQU0sRUFBRztFQUM3QixVQUFVLFNBQU0sQ0FBQyxJQUFJLENBQUUsSUFBSSxFQUFFLE1BQU8sQ0FBQztBQUN0QztBQUNBLEVBQUUsQ0FBQyxZQUFZLENBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsYUFBYyxDQUFDO0FBRWxELFVBQVUsVUFBTyxDQUFDLElBQUksR0FBRyxNQUFNO0FBQy9CLFVBQVUsVUFBTyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDO0VBQUMsYUFBYSxFQUFDO0FBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUN6RSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDO0VBQUMsYUFBYSxFQUFFO0FBQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0VBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztFQUFFLFFBQVEsRUFBRTtBQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFDbEgsSUFBSSxFQUNKLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUM7RUFBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO0VBQUUsUUFBUSxFQUFFO0FBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUNwRixJQUFJLEVBQ0osQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQztFQUFDLFdBQVcsRUFBQztBQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUMsa0JBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUN2RSxDQUFDO0FBQ0QsVUFBVSxVQUFPLENBQUMsSUFBSSxHQUFHLE9BQU87QUFDaEMsVUFBVSxVQUFPLENBQUMsT0FBTyxHQUFHO0FBQzNCO0FBQ0E7RUFDQyxLQUFLLEVBQUUsR0FBRztFQUFFO0VBQ1osS0FBSyxFQUFFLGlDQUFpQztFQUN4QyxLQUFLLEVBQUUsU0FBUztFQUNoQixLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFDRDtBQUNBO0VBQ0MsTUFBTSxFQUFFLFdBQVc7RUFDbkIsS0FBSyxFQUFFLE1BQU07RUFDYixJQUFJLEVBQUUsVUFBVTtFQUNoQixLQUFLLEVBQUUsYUFBYTtFQUNwQixLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFDRDtBQUNBO0VBQ0MsTUFBTSxFQUFFLE1BQU07RUFDZCxTQUFTLEVBQUUsR0FBRztFQUNkLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLDBDQUEwQyxDQUFDO0VBQ3hFLEtBQUssRUFBRSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUM7RUFDakMsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNwQyxDQUFDLEVBQ0Q7RUFDQyxNQUFNLEVBQUUsU0FBUztFQUNqQixTQUFTLEVBQUUsR0FBRztFQUNkLEtBQUssRUFBRSxjQUFjO0VBQ3JCLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN6QixDQUFDLEVBQ0Q7RUFDQyxNQUFNLEVBQUUsU0FBUztFQUNqQixTQUFTLEVBQUUsR0FBRztFQUNkLEtBQUssRUFBRSxjQUFjO0VBQ3JCLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztBQUM1QixDQUFDLEVBQ0Q7RUFDQyxNQUFNLEVBQUUsTUFBTTtFQUNkLEtBQUssRUFBRSxNQUFNO0VBQ2IsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRDtBQUNBO0VBQ0MsTUFBTSxFQUFFLFdBQVc7RUFDbkIsS0FBSyxFQUFFLFFBQVE7RUFDZixLQUFLLEVBQUUsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDO0VBQ2pDLEtBQUssRUFBRTtBQUNSLENBQUMsRUFDRDtFQUNDLE1BQU0sRUFBRSxZQUFZO0VBQ3BCLEtBQUssRUFBRSxRQUFRO0VBQ2YsS0FBSyxFQUFFLE1BQU07RUFDYixLQUFLLEVBQUU7QUFDUixDQUFDLENBQ0Q7O0FBRUQ7QUFDQSxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxZQUFZO0VBQzdDO0VBQ0EsVUFBVSxTQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUUsSUFBSyxDQUFDOztFQUVsRDtFQUNBLElBQUksQ0FBQyxXQUFXLEdBQUcsa0JBQVMsQ0FBQyxZQUFZOztFQUV6QztFQUNBLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSx3QkFBWSxDQUFDO0lBQzlCLFFBQVEsRUFBRSxJQUFJLENBQUM7RUFDaEIsQ0FBRSxDQUFDO0VBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7SUFBQyxRQUFRLEVBQUM7RUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7O0VBRTlEO0VBQ0EsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDO0lBQ3RDLFFBQVEsRUFBRSxDQUFDLENBQUMsZ0ZBQWdGLENBQUM7SUFDN0YsS0FBSyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQ3hCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FDTixJQUFJLENBQUM7TUFBQyxNQUFNLEVBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO01BQUUsUUFBUSxFQUFDO0lBQVEsQ0FBQyxDQUFDLENBQzNELE1BQU0sQ0FDTixDQUFDLENBQUMsT0FBTyxDQUFDLENBQ1IsR0FBRyxDQUFDO01BQUMsZ0JBQWdCLEVBQUU7SUFBYyxDQUFDLENBQUMsQ0FDdkMsSUFBSSxDQUFDO01BQ0wsS0FBSyxFQUFFLDRKQUE0SjtNQUNuSyxPQUFPLEVBQUUscUNBQXFDO01BQzlDLEtBQUssRUFBRSxXQUFXO01BQ2xCLE9BQU8sRUFBRSxNQUFNO01BQ2YsUUFBUSxFQUFFO0lBQ1gsQ0FBQyxDQUNILENBQUMsRUFDRixHQUFHLEVBQ0gsQ0FBQyxDQUFDLCtCQUErQixDQUNsQztFQUNELENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7RUFDaEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDO0lBQzFDLFFBQVEsRUFBRSxDQUFDLENBQUMsbUZBQW1GO0VBQ2hHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7RUFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7O0VBRXhFOztFQUVBO0VBQ0EsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLDRCQUFnQixDQUFDO0lBQ3RDLFdBQVcsRUFBRSxJQUFJLENBQUM7RUFDbkIsQ0FBQyxDQUFDO0VBQ0YsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFFO0lBQ3hDLE1BQU0sRUFBRSxLQUFLO0lBQ2IsUUFBUSxFQUFFLEtBQUs7SUFDZixRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQztFQUMzQixDQUFFLENBQUM7O0VBRUg7RUFDQTtFQUNBLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSwyQkFBZSxDQUFDLENBQUM7RUFDdEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFFO0lBQ3pDLE1BQU0sRUFBRSxJQUFJO0lBQ1osUUFBUSxFQUFFLEtBQUs7SUFDZixRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztFQUMxQixDQUFFLENBQUM7O0VBRUg7RUFDQSxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBRTtJQUN2RCxLQUFLLEVBQUU7RUFDUixDQUFFLENBQUM7RUFDSCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBRTtJQUFDLEtBQUssRUFBRSxFQUFFO0lBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQyxPQUFPO0VBQUUsQ0FBQyxDQUFDO0VBQ3BGLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsQ0FDcEMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FDcEIsSUFBSSxDQUFDLG1CQUFtQixFQUN4QjtJQUFFLEtBQUssRUFBRTtFQUFNLENBQ2hCLENBQUMsQ0FDRCxDQUFDO0VBQ0YsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUU7SUFDakQsTUFBTSxFQUFFLElBQUk7SUFDWixRQUFRLEVBQUUsS0FBSztJQUNmLFFBQVEsRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUM7RUFDdkMsQ0FBRSxDQUFDO0VBRUgsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFFO0lBQ3pDLEtBQUssRUFBRSxDQUNOLElBQUksQ0FBQyxVQUFVLEVBQ2YsSUFBSSxDQUFDLFdBQVcsRUFDaEIsSUFBSSxDQUFDLG1CQUFtQixDQUN4QjtJQUNELE1BQU0sRUFBRSxLQUFLO0lBQ2IsUUFBUSxFQUFFO0VBQ1gsQ0FBRSxDQUFDO0VBRUgsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7SUFBQyxLQUFLLEVBQUM7RUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUM7O0VBRWhFOztFQUVBLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTtJQUN6QixjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLFlBQVksRUFBRSxjQUFjO0lBQzVCLGdCQUFnQixFQUFFLGtCQUFrQjtJQUNwQyxXQUFXLEVBQUUsYUFBYTtJQUMxQixVQUFVLEVBQUU7RUFDYixDQUFDLENBQUM7RUFDRixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7SUFBQyxhQUFhLEVBQUU7RUFBd0IsQ0FBQyxDQUFDOztFQUV4RTtFQUNBO0VBQ0EsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUNoQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsS0FBSyxFQUFHO0lBQzNELElBQUksWUFBWTtJQUNoQixRQUFPLEtBQUssQ0FBQyxLQUFLO01BQ2xCLEtBQUssRUFBRTtRQUFFO1FBQ1IsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUMsR0FBRztRQUMvRDtNQUNELEtBQUssRUFBRTtRQUFFO1FBQ1IsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUMsR0FBRztRQUMvRDtNQUNEO1FBQ0M7SUFDRDtJQUNBLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQztJQUNsQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7RUFDdkIsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztFQUVkLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTtJQUFDLFlBQVksRUFBRTtFQUFjLENBQUMsQ0FBQztBQUU3RCxDQUFDO0FBRUQsVUFBVSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsR0FBRyxZQUFXO0VBQ3hEO0VBQ0EsSUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztFQUMzQztFQUNBLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztFQUNqQjtFQUNBLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQztBQUNuQyxDQUFDO0FBRUQsVUFBVSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEdBQUcsWUFBVztFQUMvQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztFQUN4RCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUFDLFFBQVEsRUFBQztFQUFNLENBQUMsQ0FBQztFQUMxRjtFQUNBO0VBQ0EsSUFBSSxRQUFRLEdBQUc7SUFBRSxDQUFDLEVBQUUsQ0FBQztJQUFFLENBQUMsRUFBRTtFQUFFLENBQUM7RUFDN0IsSUFBTSxTQUFTLEdBQUcsU0FBWixTQUFTLENBQVksR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUU7SUFDL0MsSUFBSSxHQUFHLEdBQUcsTUFBTSxFQUFFLE9BQU8sTUFBTTtJQUMvQixJQUFJLEdBQUcsR0FBRyxNQUFNLEVBQUUsT0FBTyxNQUFNO0lBQy9CLE9BQU8sR0FBRztFQUNYLENBQUM7RUFDRCxJQUFNLFVBQVUsR0FBRyxTQUFiLFVBQVUsQ0FBSSxHQUFHLEVBQUs7SUFDM0I7SUFDQSxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxHQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBQyxDQUFDLEdBQUcsR0FBRztJQUMvRCxPQUFPLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQztFQUN2QyxDQUFDO0VBQ0QsSUFBTSxVQUFVLEdBQUcsU0FBYixVQUFVLENBQUksR0FBRyxFQUFLO0lBQzNCO0lBQ0EsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUUsTUFBTSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFDLENBQUM7SUFDakU7SUFDQSxJQUFJLFFBQVEsR0FBRyxDQUFDLFFBQVEsQ0FBQyxlQUFlLElBQUUsUUFBUSxFQUFFLFlBQVksR0FBRyxNQUFNLENBQUMsV0FBVyxHQUFDLENBQUM7SUFDdkYsT0FBTyxTQUFTLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUM7RUFDMUMsQ0FBQztFQUVELElBQUksV0FBVyxHQUFHLEtBQUs7RUFDdkIsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0VBRWpCLElBQUksV0FBVyxHQUFHLFNBQWQsV0FBVyxDQUFHLEtBQUssRUFBSTtJQUMxQixXQUFXLEdBQUcsSUFBSTtJQUNsQixRQUFRLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPO0lBQzFCLFFBQVEsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU87RUFDM0IsQ0FBQztFQUNELElBQUksVUFBVSxHQUFHLFNBQWIsVUFBVSxDQUFHLEtBQUssRUFBSTtJQUN6QixJQUFJLENBQUMsV0FBVyxJQUFJLFFBQVEsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLFFBQVEsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO01BQzlEO0lBQ0Q7SUFDQSxJQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFDO0lBQ3JDLElBQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDckMsUUFBUSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTztJQUMxQixRQUFRLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPO0lBQzFCLFFBQVEsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3hDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3hDLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxlQUFBLE1BQUEsQ0FBZSxRQUFRLENBQUMsQ0FBQyxVQUFBLE1BQUEsQ0FBTyxRQUFRLENBQUMsQ0FBQyxRQUFLLENBQUM7RUFDekUsQ0FBQztFQUNELElBQUksU0FBUyxHQUFHLFNBQVosU0FBUyxDQUFBLEVBQVM7SUFDckIsV0FBVyxHQUFHLEtBQUs7SUFDbkIsT0FBTyxRQUFRLENBQUMsQ0FBQztJQUNqQixPQUFPLFFBQVEsQ0FBQyxDQUFDO0lBQ2pCO0lBQ0EsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDbkMsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDbkMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLGVBQUEsTUFBQSxDQUFlLFFBQVEsQ0FBQyxDQUFDLFVBQUEsTUFBQSxDQUFPLFFBQVEsQ0FBQyxDQUFDLFFBQUssQ0FBQztFQUN6RSxDQUFDOztFQUVEO0VBQ0EsSUFBTSxPQUFPLEdBQUksY0FBYyxJQUFJLE1BQU0sR0FBSSxTQUFTLEdBQUcsT0FBTztFQUNoRSxTQUFTLENBQUMsRUFBRSxDQUFDLE9BQU8sR0FBQyxvQkFBb0IsRUFBRTtJQUFBLE9BQU0sUUFBUSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDO0VBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUM3RixTQUFTLENBQUMsRUFBRSxDQUFDLE9BQU8sR0FBQyxvQkFBb0IsRUFBRSxZQUFNO0lBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUM7RUFBRSxDQUFFLENBQUMsQ0FBQyxDQUFDO0VBQzNHLFNBQVMsQ0FBQyxFQUFFLENBQUMsT0FBTyxHQUFDLG1CQUFtQixFQUFFLFdBQVcsQ0FBQztFQUN0RCxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sR0FBQyxtQkFBbUIsRUFBRSxVQUFVLENBQUM7RUFDckQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEdBQUMsaUJBQWlCLEVBQUUsU0FBUyxDQUFDO0FBQ25ELENBQUM7O0FBRUQ7QUFDQSxVQUFVLENBQUMsU0FBUyxDQUFDLGFBQWEsR0FBRyxZQUFZO0VBQ2hELElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7RUFDckQsSUFBSSxZQUFZLEdBQUcsYUFBYSxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztFQUM1RSxJQUFJLGFBQWEsR0FBRyxhQUFhLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztFQUN0RyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxhQUFhLENBQUM7QUFDbEQsQ0FBQzs7QUFFRDtBQUNBO0FBQ0EsVUFBVSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEdBQUcsVUFBVyxJQUFJLEVBQUc7RUFBQSxJQUFBLEtBQUE7RUFDeEQsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7RUFDakIsT0FBTyxVQUFVLFNBQU0sQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBRSxJQUFJLEVBQUUsSUFBSyxDQUFDLENBQ2xFLElBQUksQ0FBRSxZQUFNO0lBQ1osS0FBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3BCO0lBQ0EsS0FBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQ3JDLEtBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDOUM7SUFDQSxLQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXO0lBQ25DLEtBQUksQ0FBQyxRQUFRLEdBQUc7TUFDZixRQUFRLEVBQUUsSUFBSSxDQUFDLGNBQWM7TUFDN0IsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRO01BQ3pCLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTztNQUN4QixTQUFTLEVBQUUsSUFBSSxDQUFDO0lBQ2pCLENBQUM7SUFDRDtJQUNBLEtBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUM1QixLQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsR0FBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQ3ZELE1BQU0sR0FDTixJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVTtJQUNwQyxLQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRyxLQUFJLENBQUMsUUFBUTtJQUN4QyxLQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUUsVUFBQSxjQUFjO01BQUEsT0FBSSxJQUFJLHdCQUFZLENBQ25ELGNBQWMsRUFDZDtRQUNDLFdBQVcsRUFBRSxLQUFJLENBQUMsV0FBVztRQUM3QixRQUFRLEVBQUUsS0FBSSxDQUFDLFFBQVE7UUFDdkIsU0FBUyxFQUFFLEtBQUksQ0FBQyxRQUFRLENBQUM7TUFDMUIsQ0FDRCxDQUFDO0lBQUEsQ0FBQyxDQUNILENBQUM7SUFDRCxJQUFJLG1CQUFtQixHQUFHLEtBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLE1BQU07TUFBQSxPQUFJLE1BQU0sQ0FBQyxlQUFlO0lBQUEsRUFBQztJQUN0RixJQUFJLG1CQUFtQixJQUFJLG1CQUFtQixDQUFDLGdCQUFnQixFQUFFO01BQ2hFLG1CQUFtQixDQUFDLG9CQUFvQixHQUFHLEtBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FDdEUsVUFBQyxXQUFXLEVBQUUsU0FBUztRQUFBLE9BQUssV0FBVyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztNQUFBLEdBQ3ZFLG1CQUFtQixDQUFDLGdCQUNyQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztJQUMvQjtJQUNBLEtBQUksQ0FBQyxVQUFVLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUN6QyxvQ0FBb0MsQ0FBQyxDQUFDO0lBQ3hDO0lBQ0EsSUFBSSxLQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRTtNQUMzQixLQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQzFELENBQUMsTUFBTSxJQUFJLEtBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFO01BQ3BDLEtBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNoRSxDQUFDLE1BQU0sSUFBSSxLQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO01BQ2hELEtBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDekQsQ0FBQyxNQUFNLElBQUksS0FBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtNQUNoRCxLQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDN0QsQ0FBQyxNQUFNLElBQUksS0FBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtNQUNoRCxLQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQzFELENBQUMsTUFBTSxJQUFJLEtBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7TUFDbEQsS0FBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUN6RCxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO01BQ3JCLEtBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVO01BQ3JDLEtBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQ2xFLGNBQWMsRUFDZCxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQ3hDLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUNyQyxDQUFDO0lBQ0YsQ0FBQyxNQUFNLElBQUksS0FBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUU7TUFDbkMsS0FBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUN6RCxDQUFDLE1BQU07TUFDTixLQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBRSxLQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBUSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUN4RztJQUNBO0lBQ0EsS0FBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWTtJQUNyQyxLQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUUsVUFBQSxjQUFjO01BQUEsT0FBSSxjQUFjLENBQUMsSUFBSTtJQUFBLENBQUMsQ0FBQztJQUNwRixLQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRO0lBQzdCO0lBQ0EsS0FBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0VBQ2xCLENBQUMsRUFBRSxJQUFLLENBQUM7QUFDWCxDQUFDOztBQUVEO0FBQ0EsVUFBVSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEdBQUcsVUFBVyxJQUFJLEVBQUc7RUFBQSxJQUFBLE1BQUE7RUFDeEQsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7RUFDakIsT0FBTyxVQUFVLFNBQU0sQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBRSxJQUFJLEVBQUUsSUFBSyxDQUFDLENBQ2xFLElBQUksQ0FBRTtJQUFBLE9BQU0sTUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7RUFBQSxDQUFDLENBQUM7QUFDOUMsQ0FBQzs7QUFFRDtBQUNBLFVBQVUsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEdBQUcsVUFBVyxNQUFNLEVBQUc7RUFBQSxJQUFBLE1BQUE7RUFDM0QsSUFBSyxNQUFNLEtBQUssV0FBVyxFQUFHO0lBQzdCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztJQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBRSxJQUFJLENBQUMsV0FBWSxDQUFDO0lBQzVDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztJQUM3QixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7RUFFbEIsQ0FBQyxNQUFNLElBQUssTUFBTSxLQUFLLFdBQVcsRUFBRztJQUNwQyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVDLE9BQU8sSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUM5QixJQUFBLGVBQVcsRUFBQyxZQUFZLENBQUMsQ0FBQyxJQUFJO0lBQzdCO0lBQ0EsWUFBTTtNQUNMLE1BQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDO01BQ2pDLE1BQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztNQUM1QixNQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBRSxNQUFJLENBQUMsVUFBVyxDQUFDO01BQzNDLE1BQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztNQUM5QixNQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUNEO0lBQ0EsVUFBQyxJQUFJLEVBQUUsR0FBRztNQUFBLE9BQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUNqQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUNkLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQ2hCLENBQUMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxFQUN4RSxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxJQUFJLENBQUUsSUFBQSxpQkFBWSxFQUFDLElBQUksRUFBRSxHQUFHLENBQUUsQ0FDOUQsQ0FDRCxDQUNELENBQUM7SUFBQSxDQUNGLENBQ0QsQ0FBQztFQUVGLENBQUMsTUFBTSxJQUFLLE1BQU0sS0FBSyxZQUFZLEVBQUc7SUFDckMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBTTtNQUNyQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7TUFDckIsTUFBSSxDQUFDLEtBQUssQ0FBQztRQUFDLE9BQU8sRUFBRTtNQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDLENBQUM7RUFHSCxDQUFDLE1BQU0sSUFBSyxNQUFNLEtBQUssWUFBWSxFQUFHO0lBQ3JDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBRSxJQUFJLENBQUMsVUFBVyxDQUFDO0lBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztJQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzlDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztFQUVsQixDQUFDLE1BQU0sSUFBSyxNQUFNLEtBQUssTUFBTSxFQUFHO0lBQy9CLE9BQU8sSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUM5QixlQUFHLENBQUMsYUFBYSxDQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQy9CO01BQUMsU0FBUyxFQUFFO0lBQUMsQ0FBQyxFQUNkLFVBQUEsUUFBUTtNQUFBLE9BQUs7UUFDWixPQUFPLEVBQUUsQ0FBQztRQUNWLElBQUksRUFBRSxNQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUNsRCxPQUFPLEVBQUUsTUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQy9CLFNBQVMsRUFBRSxNQUFJLENBQUMsV0FBVyxDQUFDO01BQzdCLENBQUM7SUFBQSxDQUNGLENBQUMsU0FBTSxDQUFDLFVBQUMsSUFBSSxFQUFFLEdBQUc7TUFBQSxPQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FDekMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FDZCxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUNoQixDQUFDLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsRUFDekUsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLENBQUMsSUFBSSxDQUFFLElBQUEsaUJBQVksRUFBQyxJQUFJLEVBQUUsR0FBRyxDQUFFLENBQzlELENBQ0QsQ0FDRCxDQUFDO0lBQUEsQ0FBQyxDQUNILENBQUMsQ0FBQyxJQUFJLENBQUU7TUFBQSxPQUFNLE1BQUksQ0FBQyxLQUFLLENBQUM7UUFDeEIsT0FBTyxFQUFFLElBQUk7UUFDYixZQUFZLEVBQUUsTUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLElBQUksTUFBSSxDQUFDLGlCQUFpQixDQUFDO01BQ2xFLENBQUMsQ0FBQztJQUFBLENBQUMsQ0FBQztFQUVMLENBQUMsTUFBTSxJQUFLLE1BQU0sS0FBSyxTQUFTLEVBQUc7SUFDbEMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQzlCLGVBQUcsQ0FBQyxJQUFJLENBQUM7TUFDUixNQUFNLEVBQUUsT0FBTztNQUNmLFlBQVksRUFBRSxVQUFVO01BQ3hCLElBQUksRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLFVBQVUsR0FBRyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7TUFDbEgsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7TUFDdEMsR0FBRyxFQUFFO0lBQ04sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFFLFVBQUEsTUFBTSxFQUFJO01BQ2xCLElBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRztRQUNoRixPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7TUFDM0M7TUFDQSxJQUFJLGtCQUFrQixHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7TUFFdEUsTUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQztNQUNyRCxNQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztNQUNoRCxNQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7TUFDL0IsTUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUUsTUFBSSxDQUFDLG1CQUFvQixDQUFDO01BQ3BELE1BQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztNQUM3QixNQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbEIsQ0FBQyxDQUFDLFNBQ0ssQ0FBRSxVQUFDLElBQUksRUFBRSxHQUFHO01BQUEsT0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQ3pDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQ2QsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FDaEIsQ0FBQyxDQUFDLGlDQUFpQyxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEVBQ3BFLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLElBQUksQ0FBRSxJQUFBLGlCQUFZLEVBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBRSxDQUM5RCxDQUNELENBQ0QsQ0FBQztJQUFBLENBQUMsQ0FDSixDQUFDO0VBRUYsQ0FBQyxNQUFNLElBQUssTUFBTSxLQUFLLFNBQVMsRUFBRztJQUNsQyxPQUFPLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDOUIsZUFBRyxDQUFDLElBQUksQ0FBQztNQUNSLE1BQU0sRUFBRSxTQUFTO01BQ2pCLE1BQU0sRUFBRSxNQUFNO01BQ2QsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZO01BQzNCLGdCQUFnQixFQUFFLFVBQVU7TUFDNUIsTUFBTSxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO01BQ3JELGNBQWMsRUFBRSxVQUFVO01BQzFCLElBQUksRUFBRTtJQUNQLENBQUMsQ0FBQyxDQUNBLElBQUksQ0FBRSxVQUFBLE1BQU0sRUFBSTtNQUNoQixJQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUc7UUFDekQsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDO01BQzNDO01BQ0EsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FDcEUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FDZixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQUMsU0FBUyxFQUFDLEdBQUc7UUFBRSxPQUFPLEVBQUM7TUFBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUMxRixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQUMsU0FBUyxFQUFDLEdBQUc7UUFBRSxPQUFPLEVBQUM7TUFBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQ25GLENBQUMsRUFDRCxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUNuQixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUNsQixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUNmLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sQ0FDM0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUNwQyxNQUFJLENBQUMsZUFBZSxDQUFDLENBQ3RCLENBQ0QsQ0FDRCxDQUNELENBQUM7TUFFRCxNQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztNQUN4QyxNQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztNQUNoRCxNQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7TUFDNUIsTUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUUsTUFBSSxDQUFDLG1CQUFvQixDQUFDO01BQ3BELE1BQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztNQUM3QixNQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbEIsQ0FBRSxDQUFDLFNBQ0csQ0FBRSxVQUFDLElBQUksRUFBRSxHQUFHO01BQUEsT0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQ3pDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQ2QsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FDaEIsQ0FBQyxDQUFDLGlDQUFpQyxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEVBQ3BFLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLElBQUksQ0FBRSxJQUFBLGlCQUFZLEVBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBRSxDQUM5RCxDQUNELENBQ0QsQ0FBQztJQUFBLENBQUMsQ0FDSixDQUFDO0VBRUYsQ0FBQyxNQUFNLElBQUssTUFBTSxLQUFLLE1BQU0sRUFBRztJQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUUsSUFBSSxDQUFDLFVBQVcsQ0FBQztJQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7SUFDOUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0VBRWxCLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFO0lBQzlDO0lBQ0EsT0FBTyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQzlCLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLGlDQUFpQyxFQUFFO01BQUMsS0FBSyxFQUFDO0lBQWMsQ0FBQyxDQUFDLENBQ3RFLElBQUksQ0FBQyxVQUFBLFNBQVM7TUFBQSxPQUFJLFNBQVMsR0FBRyxNQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJO0lBQUEsRUFDcEQsQ0FBQztFQUNGO0VBRUEsT0FBTyxVQUFVLFNBQU0sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFFLElBQUksRUFBRSxNQUFPLENBQUM7QUFDeEUsQ0FBQzs7QUFFRDtBQUNBO0FBQ0EsVUFBVSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsR0FBRyxVQUFXLElBQUksRUFBRztFQUFBLElBQUEsTUFBQTtFQUMzRCxPQUFPLFVBQVUsU0FBTSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUUsSUFBSSxFQUFFLElBQUssQ0FBQyxDQUNyRSxLQUFLLENBQUUsWUFBTTtJQUNiLE1BQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUIsTUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztJQUNsQyxNQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBRSxNQUFJLENBQUMsVUFBVyxDQUFDO0lBQzNDLE1BQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztJQUM5QixNQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckUsTUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztJQUU3QyxNQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUMsRUFBRSxDQUFDO0lBQzdELE1BQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQztJQUN4RSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQztFQUMvQixDQUFFLENBQUM7QUFDTCxDQUFDO0FBRUQsVUFBVSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEdBQUcsVUFBUyxLQUFLLEVBQUU7RUFDckQsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLGtCQUFTLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQztFQUM5RDtFQUNBLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7QUFDakQsQ0FBQztBQUVELFVBQVUsQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLFlBQVc7RUFDOUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUM7QUFDakMsQ0FBQztBQUVELFVBQVUsQ0FBQyxTQUFTLENBQUMsY0FBYyxHQUFHLFVBQVMsSUFBSSxFQUFFO0VBQUEsSUFBQSxNQUFBO0VBQ3BELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0VBQ25DLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7RUFDbEQsSUFBSSxDQUFDLElBQUksRUFBRTtJQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUM7RUFDRDtFQUNBLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLE1BQU0sRUFBSTtJQUN6RCxPQUFPLE1BQU0sQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxzQkFBc0IsS0FBSyxJQUFJO0VBQzFFLENBQUMsQ0FBQzs7RUFFRjtFQUNBLElBQUksY0FBYyxFQUFFO0lBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2xDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxHQUFHLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7RUFDOUY7O0VBRUE7RUFDQSxJQUFJLFdBQVc7RUFDZixJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO0lBQzNDLFdBQVcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUNsQyxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcseUVBQy9CLENBQUM7RUFDRixDQUFDLE1BQU0sSUFBSSxJQUFJLEtBQUssNEJBQTRCLElBQUksQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtJQUN6SDtJQUNBLFdBQVcsR0FBRyx3SEFBd0g7RUFDdkk7RUFDQSxDQUFDLENBQUMsSUFBSSxDQUFFLFdBQVcsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FDdEQsSUFBSSxDQUFFLFVBQUEsU0FBUyxFQUFJO0lBQ25CLElBQUksQ0FBQyxTQUFTLEVBQUU7SUFDaEI7SUFDQSxPQUFPLHdCQUFZLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRTtNQUNuRCxXQUFXLEVBQUUsTUFBSSxDQUFDLFdBQVc7TUFDN0IsUUFBUSxFQUFFLE1BQUksQ0FBQyxRQUFRO01BQ3ZCLFNBQVMsRUFBRSxNQUFJLENBQUMsUUFBUSxDQUFDO0lBQzFCLENBQUMsQ0FBQyxDQUNBLElBQUksQ0FBQyxVQUFBLE1BQU0sRUFBSTtNQUNmLE1BQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFFLENBQUMsTUFBTSxDQUFFLENBQUM7TUFDcEMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO01BQ25CLE1BQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNsQixDQUFDLENBQUM7RUFDSixDQUFDLENBQUMsQ0FDRCxJQUFJLENBQUU7SUFBQSxPQUFNLE1BQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0VBQUEsQ0FBQyxDQUFDO0FBQ3hFLENBQUM7QUFFRCxVQUFVLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxVQUFTLFFBQVEsRUFBRTtFQUN0RCxJQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxNQUFNO0lBQUEsT0FBSSxNQUFNLENBQUMsZUFBZTtFQUFBLEVBQUM7RUFDbEYsSUFBSSxhQUFhLEVBQUU7SUFDbEIsYUFBYSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztJQUNoRSxhQUFhLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7RUFDakQ7RUFDQSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBQSxNQUFNLEVBQUk7SUFDdkMsSUFBSSxNQUFNLENBQUMsZUFBZSxJQUFHLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRTtNQUNyRCxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxHQUFHLElBQUksR0FBRyxRQUFRLENBQUM7TUFDaEYsTUFBTSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO0lBQzFDO0VBQ0QsQ0FBQyxDQUFDO0FBQ0gsQ0FBQztBQUVELFVBQVUsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEdBQUcsVUFBUyxhQUFhLEVBQUU7RUFDL0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQUEsTUFBTSxFQUFJO0lBQ3ZDLElBQUksTUFBTSxDQUFDLG9CQUFvQixFQUFFO01BQ2hDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQztNQUNuRSxNQUFNLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztJQUMvQztFQUNELENBQUMsQ0FBQztBQUNILENBQUM7QUFFRCxVQUFVLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxZQUFXO0VBQzdDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDN0IsQ0FBQztBQUVELFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLFlBQVc7RUFDNUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFFLFVBQUEsTUFBTTtJQUFBLE9BQUksTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7RUFBQSxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUVELFVBQVUsQ0FBQyxTQUFTLENBQUMscUJBQXFCLEdBQUcsVUFBUyxZQUFZLEVBQUU7RUFBQSxJQUFBLE1BQUE7RUFDbkUsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztFQUNwRCxJQUFJLENBQUMsWUFBWSxFQUFFO0lBQ2xCLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0VBQzlCO0VBQ0E7RUFDQSxJQUFJLGFBQWEsR0FBRyxJQUFBLHdCQUFjLEVBQUMsWUFBWSxFQUFFLElBQUksQ0FBQztFQUN0RDtFQUNBLGFBQWEsQ0FBQyxPQUFPLENBQUMsVUFBQSxRQUFRLEVBQUk7SUFDakMsSUFBSSxNQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtNQUNyRCxZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQztJQUMvRDtFQUNELENBQUMsQ0FBQztFQUNGO0VBQ0EsWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztFQUNuRDtFQUNBO0VBQ0EsWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsMkJBQTJCLEVBQUMsRUFBRSxDQUFDO0VBQ25FO0VBQ0EsSUFBSSxvQkFBb0IsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFBLENBQUM7SUFBQSxPQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztFQUFBLEVBQUM7RUFDeEUsSUFBSSxvQkFBb0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO0lBQ3RDO0lBQ0EsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7RUFDekc7RUFDQTtFQUNBLElBQUksT0FBTyxHQUFHLFlBQVk7RUFDMUIsYUFBYSxDQUFDLE9BQU8sQ0FBQyxVQUFBLFFBQVEsRUFBSTtJQUNqQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztFQUNqRCxDQUFDLENBQUM7RUFDRixJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtJQUN4RDtJQUNBLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztFQUMzRCxDQUFDLE1BQU07SUFDTjtJQUNBLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztFQUMzRDtBQUNELENBQUM7QUFFRCxVQUFVLENBQUMsU0FBUyxDQUFDLGlCQUFpQixHQUFHLFlBQVc7RUFDbkQsSUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsTUFBTTtJQUFBLE9BQzFELE1BQU0sQ0FBQyxlQUFlLElBQ3RCLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsSUFDL0IsTUFBTSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLE1BQU07RUFBQSxDQUMzQyxDQUFDO0VBQ0QsT0FBTyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUM7QUFDbEMsQ0FBQztBQUVELFVBQVUsQ0FBQyxTQUFTLENBQUMsZUFBZSxHQUFHLFlBQVc7RUFBQSxJQUFBLE1BQUE7RUFDakQsSUFBTSxjQUFjLEdBQUcsRUFBRTtFQUN6QixJQUFNLGFBQWEsR0FBRyxFQUFFO0VBQ3hCLElBQU0sVUFBVSxHQUFHLEVBQUU7RUFDckIsSUFBTSxTQUFTLEdBQUcsU0FBWixTQUFTLENBQUcsSUFBSTtJQUFBLE9BQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBQyxFQUFFLENBQUM7RUFBQTs7RUFFOUU7RUFDQSxJQUFNLFVBQVUsR0FBRyxJQUFBLGlCQUFXLEVBQzdCLElBQUEsa0JBQVksRUFBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFDakMsVUFBQSxNQUFNO0lBQUEsT0FBSSxNQUFNLENBQUMsZUFBZSxJQUFJLE1BQU0sQ0FBQyxlQUFlO0VBQUEsR0FDMUQsVUFBQSxNQUFNO0lBQUEsT0FBSSxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0VBQUEsQ0FDMUMsQ0FDRCxDQUFDO0VBQ0QsSUFBSSxZQUFZLEdBQUcsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQztFQUMzRCxJQUFNLGNBQWMsR0FBRyxJQUFBLGlCQUFXLEVBQ2pDLElBQUEsa0JBQVksRUFBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFDakMsVUFBQSxNQUFNO0lBQUEsT0FBSSxNQUFNLENBQUMsb0JBQW9CO0VBQUEsR0FDckMsVUFBQSxNQUFNO0lBQUEsT0FBSSxNQUFNLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUM7RUFBQSxDQUMvQyxDQUNELENBQUM7RUFDRCxJQUFJLGlCQUFpQixHQUFHLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUM7RUFDeEU7RUFDQSxJQUFJLGtCQUFrQixHQUFHLEtBQUs7RUFDOUIsSUFBSSxzQkFBc0IsR0FBRyxLQUFLOztFQUVsQztFQUNBLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsVUFBQSxJQUFJLEVBQUk7SUFDeEMsSUFBTSxNQUFNLEdBQUcsTUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFFLFVBQUEsTUFBTTtNQUFBLE9BQUksTUFBTSxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLFlBQVksS0FBSyxJQUFJO0lBQUEsQ0FBQyxDQUFDO0lBQzNHLElBQUksQ0FBQyxNQUFNLEVBQUU7TUFDWixjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0M7RUFDRCxDQUFDLENBQUM7RUFDRjtFQUNBLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBRSxVQUFBLE1BQU0sRUFBSTtJQUN4QyxJQUFNLEtBQUssR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtNQUM5QjtNQUNBO0lBQ0Q7SUFDQSxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsZUFBZSxLQUFNLEtBQUssSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzRyxJQUFJLFFBQVEsRUFBRTtNQUFFLGtCQUFrQixHQUFHLElBQUk7SUFBRTtJQUMzQyxJQUFJLFlBQVksRUFBRTtNQUFFLFFBQVEsR0FBRyxJQUFJO0lBQUU7SUFFckMsSUFBSSxhQUFhLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixLQUFLLEtBQUssSUFBSSxNQUFNLENBQUMsaUJBQWlCLENBQUMsSUFBSSxNQUFNLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUgsSUFBSSxhQUFhLEVBQUU7TUFBRSxzQkFBc0IsR0FBRyxJQUFJO0lBQUU7SUFDcEQsSUFBSSxpQkFBaUIsRUFBRTtNQUFFLGFBQWEsR0FBRyxJQUFJO0lBQUU7SUFFL0MsSUFBSSxNQUFNLEdBQUksUUFBUSxJQUFJLGFBQWEsR0FDcEMsUUFBUSxHQUFHLEdBQUcsR0FBRyxhQUFhLEdBQzlCLFFBQVEsSUFBSSxhQUFhLElBQUksRUFBRTtJQUNsQyxJQUFJLE1BQU0sRUFBRTtNQUFFLE1BQU0sR0FBRyxJQUFJLEdBQUcsTUFBTSxHQUFHLEdBQUc7SUFBRTtJQUU1QyxJQUFJLEtBQUssRUFBRTtNQUNWLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3ZELENBQUMsTUFBTTtNQUNOLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUM7SUFDcEQ7RUFDRCxDQUFDLENBQUM7RUFDRjtFQUNBLElBQUksYUFBYSxHQUFJLGtCQUFrQixJQUFJLFlBQVksSUFBSSxzQkFBc0IsSUFBSSxpQkFBaUIsR0FDbkcsWUFBWSxHQUFHLEdBQUcsR0FBRyxpQkFBaUIsR0FDckMsa0JBQWtCLElBQUksWUFBWSxJQUFNLHNCQUFzQixJQUFJLGlCQUFrQixJQUFJLEVBQUU7RUFDOUYsSUFBSSxhQUFhLEVBQUU7SUFBRSxhQUFhLEdBQUcsSUFBSSxHQUFHLGFBQWEsR0FBRyxHQUFHO0VBQUU7RUFFakUsb0JBQUEsTUFBQSxDQUFvQixhQUFhLFFBQUEsTUFBQSxDQUFLLEdBQUEsTUFBQSxDQUFJLGFBQWEsRUFBSyxVQUFVLEVBQUssY0FBYyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBQSxNQUFBLENBQUcsa0JBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTTtBQUNoSSxDQUFDO0FBQUMsSUFBQSxRQUFBLEdBRWEsVUFBVSxFQUN6QjtBQUFBLE9BQUEsY0FBQSxRQUFBOzs7Ozs7Ozs7QUNwdkJBLElBQUEsT0FBQSxHQUFBLHNCQUFBLENBQUEsT0FBQTtBQUE4QixTQUFBLHVCQUFBLEdBQUEsV0FBQSxHQUFBLElBQUEsR0FBQSxDQUFBLFVBQUEsR0FBQSxHQUFBLGdCQUFBLEdBQUE7QUFBQSxTQUFBLFFBQUEsR0FBQSwwQ0FBQSxNQUFBLDBCQUFBLE1BQUEsQ0FBQSxRQUFBLGlCQUFBLE9BQUEsWUFBQSxRQUFBLEdBQUEsa0JBQUEsR0FBQSxjQUFBLE9BQUEsWUFBQSxRQUFBLEdBQUEsV0FBQSxHQUFBLFdBQUEsTUFBQSxtQkFBQSxHQUFBLENBQUEsV0FBQSxLQUFBLE1BQUEsSUFBQSxHQUFBLEtBQUEsTUFBQSxDQUFBLFNBQUEscUJBQUEsR0FBQSxjQUFBLE9BQUEsQ0FBQSxHQUFBO0FBQzlCOztBQUVBLElBQUksR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBRTtFQUNyQixJQUFJLEVBQUU7SUFDTCxPQUFPLEVBQUU7TUFDUixnQkFBZ0IsRUFBRSxRQUFRLEdBQUcsa0JBQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUNqRDtJQUNGO0VBQ0Q7QUFDRCxDQUFFLENBQUM7O0FBRUg7QUFDQSxHQUFHLENBQUMsT0FBTyxHQUFHLFVBQVMsVUFBVSxFQUFFO0VBQ2xDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQywyRUFBMkUsR0FBQyxVQUFVLENBQUM7QUFDckcsQ0FBQzs7QUFFRDtBQUNBLEdBQUcsQ0FBQyxNQUFNLEdBQUcsVUFBUyxJQUFJLEVBQUU7RUFDM0IsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxrQkFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFO0lBQUMsTUFBTSxFQUFDO0VBQUssQ0FBQyxDQUFDLENBQUMsQ0FDaEYsSUFBSSxDQUFDLFVBQVMsSUFBSSxFQUFFO0lBQ3BCLElBQUssQ0FBQyxJQUFJLEVBQUc7TUFDWixPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFDM0M7SUFDQSxPQUFPLElBQUk7RUFDWixDQUFDLENBQUM7QUFDSixDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksT0FBTyxHQUFHLFNBQVYsT0FBTyxDQUFZLEtBQUssRUFBRSxNQUFNLEVBQUU7RUFDckMsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUNiLENBQUMsQ0FBQyxNQUFNLENBQ1A7SUFDQyxRQUFRLEVBQUUsT0FBTztJQUNqQixRQUFRLEVBQUUsTUFBTTtJQUNoQixjQUFjLEVBQUUsQ0FBQztJQUNqQixRQUFRLEVBQUUsS0FBSztJQUNmLE1BQU0sRUFBRSxnQkFBZ0I7SUFDeEIsUUFBUSxFQUFFLG1CQUFtQjtJQUM3QixTQUFTLEVBQUU7RUFDWixDQUFDLEVBQ0QsTUFDRCxDQUNELENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxRQUFRLEVBQUk7SUFDbEIsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqRCxJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsWUFBWTtJQUNyQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDO0VBQzdDLENBQUMsQ0FBQztBQUNILENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFdBQVcsR0FBRyxTQUFkLFdBQVcsQ0FBWSxJQUFJLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRTtFQUN0RCxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztFQUNqRSxJQUFJLGNBQWMsR0FBRztJQUNwQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07SUFDbkIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEtBQUssRUFBRTtJQUM1QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsS0FBSyxFQUFFO0lBQzlCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtJQUMzQixFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7SUFDWCxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7SUFDakIsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUc7RUFDNUQsQ0FBQztFQUNELE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBRSxTQUFTLENBQUMsY0FBYyxDQUFFLENBQUMsQ0FDeEMsSUFBSSxDQUFFLFVBQUEsVUFBVTtJQUFBLE9BQ2hCLENBQUMsQ0FBQyxNQUFNLENBQUU7TUFDVCxNQUFNLEVBQUUsTUFBTTtNQUNkLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztNQUNqQjtNQUNBLE1BQU0sRUFBRSxNQUFNO01BQ2QsYUFBYSxFQUFFLGFBQWE7TUFDNUIsY0FBYyxFQUFFO0lBQ2pCLENBQUMsRUFBRSxVQUFXLENBQUM7RUFBQSxDQUNoQixDQUFDO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsQ0FBQyxhQUFhLEdBQUcsVUFBUyxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRTtFQUN6RCxPQUFPLE9BQU8sQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQzlCLElBQUk7RUFDTDtFQUNDLFVBQUMsSUFBSSxFQUFFLFNBQVM7SUFBQSxPQUFLLFdBQVcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQztFQUFBO0VBQzVEO0VBQ0E7SUFBQSxPQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUM7RUFBQSxDQUM3RCxDQUFDLENBQ0EsSUFBSSxDQUFDLFVBQUEsVUFBVTtJQUFBLE9BQ2YsR0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLFNBQzlCLENBQUUsVUFBQSxTQUFTLEVBQUk7TUFDcEIsSUFBSyxTQUFTLEtBQUssY0FBYyxFQUFHO1FBQ25DO1FBQ0EsT0FBTyxHQUFHLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDO01BQ3REO01BQ0E7TUFDQSxPQUFPLEdBQUcsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQztJQUM3QyxDQUFDLENBQUM7RUFBQSxDQUNKLENBQUM7QUFDSCxDQUFDO0FBRUQsSUFBSSxZQUFZLEdBQUcsU0FBZixZQUFZLENBQVksS0FBSyxFQUFFLE1BQU0sRUFBRTtFQUMxQyxJQUFJLElBQUksRUFBRSxHQUFHLEVBQUUsT0FBTztFQUN0QixJQUFLLE9BQUEsQ0FBTyxLQUFLLE1BQUssUUFBUSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRztJQUM5RDtJQUNBLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLO0lBQzdELElBQUssUUFBUSxFQUFHO01BQ2Y7TUFDQSxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUk7TUFDcEIsT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPO0lBQzNCLENBQUMsTUFBTTtNQUNOLEdBQUcsR0FBRyxLQUFLO0lBQ1o7RUFDRCxDQUFDLE1BQU0sSUFBSyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBQSxDQUFPLE1BQU0sTUFBSyxRQUFRLEVBQUc7SUFDckU7SUFDQSxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSztJQUM3QixJQUFJLFVBQVUsRUFBRTtNQUNmO01BQ0EsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJO01BQ3BCLE9BQU8sR0FBRyxRQUFRLENBQUMsSUFBSTtJQUN4QixDQUFDLE1BQU0sSUFBSSxLQUFLLEtBQUssY0FBYyxFQUFFO01BQ3BDLElBQUksR0FBRyxJQUFJO01BQ1gsT0FBTyxHQUFHLHVDQUF1QztJQUNsRCxDQUFDLE1BQU07TUFDTixHQUFHLEdBQUcsTUFBTSxJQUFJLE1BQU0sQ0FBQyxHQUFHO0lBQzNCO0VBQ0Q7RUFFQSxJQUFJLElBQUksSUFBSSxPQUFPLEVBQUU7SUFDcEIsb0JBQUEsTUFBQSxDQUFvQixJQUFJLFFBQUEsTUFBQSxDQUFLLE9BQU87RUFDckMsQ0FBQyxNQUFNLElBQUksT0FBTyxFQUFFO0lBQ25CLHFCQUFBLE1BQUEsQ0FBcUIsT0FBTztFQUM3QixDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUU7SUFDZixxQkFBQSxNQUFBLENBQXFCLEdBQUcsQ0FBQyxNQUFNO0VBQ2hDLENBQUMsTUFBTSxJQUNOLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssT0FBTyxJQUM5QyxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxLQUFLLE9BQU8sRUFDL0M7SUFDRCxnQkFBQSxNQUFBLENBQWdCLEtBQUssUUFBQSxNQUFBLENBQUssTUFBTTtFQUNqQyxDQUFDLE1BQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLE9BQU8sRUFBRTtJQUMxRCxpQkFBQSxNQUFBLENBQWlCLEtBQUs7RUFDdkIsQ0FBQyxNQUFNO0lBQ04sT0FBTyxtQkFBbUI7RUFDM0I7QUFDRCxDQUFDO0FBQUMsT0FBQSxDQUFBLFlBQUEsR0FBQSxZQUFBO0FBQUEsSUFBQSxRQUFBLEdBRWEsR0FBRyxFQUVsQjtBQUFBLE9BQUEsY0FBQSxRQUFBOzs7Ozs7Ozs7O0FDN0tBLElBQUEsT0FBQSxHQUFBLHNCQUFBLENBQUEsT0FBQTtBQUNBLElBQUEsTUFBQSxHQUFBLE9BQUE7QUFDQSxJQUFBLElBQUEsR0FBQSx1QkFBQSxDQUFBLE9BQUE7QUFDQSxJQUFBLE1BQUEsR0FBQSxzQkFBQSxDQUFBLE9BQUE7QUFBaUMsU0FBQSx5QkFBQSxlQUFBLE9BQUEsa0NBQUEsS0FBQSxPQUFBLE9BQUEsSUFBQSx3QkFBQSxZQUFBLHlCQUFBLFdBQUEsS0FBQSxZQUFBLEtBQUE7QUFBQSxTQUFBLHdCQUFBLEdBQUEsUUFBQSxHQUFBLElBQUEsR0FBQSxDQUFBLFVBQUEsV0FBQSxHQUFBLFFBQUEsR0FBQSxhQUFBLE9BQUEsQ0FBQSxHQUFBLHlCQUFBLEdBQUEsdUNBQUEsR0FBQSxVQUFBLEtBQUEsR0FBQSx3QkFBQSxRQUFBLEtBQUEsSUFBQSxLQUFBLENBQUEsR0FBQSxDQUFBLEdBQUEsWUFBQSxLQUFBLENBQUEsR0FBQSxDQUFBLEdBQUEsU0FBQSxNQUFBLFdBQUEscUJBQUEsR0FBQSxNQUFBLENBQUEsY0FBQSxJQUFBLE1BQUEsQ0FBQSx3QkFBQSxXQUFBLEdBQUEsSUFBQSxHQUFBLFFBQUEsTUFBQSxDQUFBLFNBQUEsQ0FBQSxjQUFBLENBQUEsSUFBQSxDQUFBLEdBQUEsRUFBQSxHQUFBLFNBQUEsSUFBQSxHQUFBLHFCQUFBLEdBQUEsTUFBQSxDQUFBLHdCQUFBLENBQUEsR0FBQSxFQUFBLEdBQUEsY0FBQSxJQUFBLEtBQUEsSUFBQSxDQUFBLEdBQUEsSUFBQSxJQUFBLENBQUEsR0FBQSxLQUFBLE1BQUEsQ0FBQSxjQUFBLENBQUEsTUFBQSxFQUFBLEdBQUEsRUFBQSxJQUFBLFlBQUEsTUFBQSxDQUFBLEdBQUEsSUFBQSxHQUFBLENBQUEsR0FBQSxTQUFBLE1BQUEsY0FBQSxHQUFBLE1BQUEsS0FBQSxJQUFBLEtBQUEsQ0FBQSxHQUFBLENBQUEsR0FBQSxFQUFBLE1BQUEsWUFBQSxNQUFBO0FBQUEsU0FBQSx1QkFBQSxHQUFBLFdBQUEsR0FBQSxJQUFBLEdBQUEsQ0FBQSxVQUFBLEdBQUEsR0FBQSxnQkFBQSxHQUFBO0FBQ2pDOztBQUVBLElBQUksU0FBUyxHQUFHLFNBQVMsU0FBUyxDQUFBLEVBQUc7RUFFcEMsT0FBTyxJQUFBLGVBQVEsRUFBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsS0FBSyxFQUFJO0lBQy9CO0lBQ0EsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUU7TUFDckI7SUFDRDtJQUNBO0lBQ0EsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUU7TUFDaEY7SUFDRDtJQUNBO0lBQ0EsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtNQUN2RDtJQUNEO0lBQ0EsSUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsa0JBQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDaEY7SUFDQSxJQUFJLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQyxLQUFLLFdBQVcsRUFBRTtNQUNuRDtJQUNEO0lBQ0E7SUFDQSxJQUNDLEtBQUssQ0FBQyxtQkFBbUIsSUFDekIsS0FBSyxDQUFDLG1CQUFtQixDQUFDLE1BQU0sSUFDaEMsQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLGtCQUFNLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQy9EO01BQ0Q7SUFDRDs7SUFFQTtJQUNBLElBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sRUFBRztNQUMvQixPQUFPLElBQUEsaUJBQVUsRUFBQyxDQUFDO0lBQ3BCOztJQUVBO0FBQ0Y7QUFDQTtBQUNBO0lBQ0UsSUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsa0JBQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDMUUsT0FBTyxlQUFHLENBQUMsR0FBRyxDQUFDO01BQ2QsTUFBTSxFQUFFLE9BQU87TUFDZixNQUFNLEVBQUUsTUFBTTtNQUNkLElBQUksRUFBRSxXQUFXO01BQ2pCLE1BQU0sRUFBRSxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7TUFDbkMsV0FBVyxFQUFFLElBQUk7TUFDakIsT0FBTyxFQUFFLEtBQUs7TUFDZCxZQUFZLEVBQUU7SUFDZixDQUFDLENBQUMsQ0FDQSxJQUFJLENBQUMsVUFBUyxNQUFNLEVBQUU7TUFDdEIsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPO01BQzdCLElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVM7TUFFaEQsSUFBSyxDQUFDLFNBQVMsRUFBRztRQUNqQixPQUFPLElBQUEsaUJBQVUsRUFBQyxDQUFDO01BQ3BCO01BRUEsSUFBSSxjQUFjLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFBLFFBQVE7UUFBQSxPQUFJLHdCQUF3QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO01BQUEsRUFBQztNQUU5RixJQUFLLENBQUMsY0FBYyxFQUFHO1FBQ3RCLE9BQU8sSUFBQSxpQkFBVSxFQUFDLENBQUM7TUFDcEI7SUFFRCxDQUFDLEVBQ0QsVUFBUyxJQUFJLEVBQUUsS0FBSyxFQUFFO01BQ3RCO01BQ0MsT0FBTyxDQUFDLElBQUksQ0FDWCxvREFBb0QsSUFDbkQsSUFBSSxJQUFJLElBQUksQ0FBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBQSxpQkFBWSxFQUFDLElBQUksRUFBRSxLQUFLLENBQ3RELENBQUM7TUFDRCxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztBQUVILENBQUM7QUFBQyxJQUFBLFFBQUEsR0FFYSxTQUFTLEVBQ3hCO0FBQUEsT0FBQSxjQUFBLFFBQUE7Ozs7Ozs7OztBQ2xGQSxJQUFBLEtBQUEsR0FBQSxPQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFNLEtBQUssR0FBRyxTQUFSLEtBQUssQ0FBWSxHQUFHLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUU7RUFDdkQsSUFBSTtJQUNILElBQU0sZ0JBQWdCLEdBQUcsQ0FBQztJQUMxQixJQUFNLGlCQUFpQixHQUFHLEVBQUU7SUFDNUIsSUFBTSxrQkFBa0IsR0FBRyxFQUFFLEdBQUMsRUFBRSxHQUFDLEVBQUUsR0FBQyxJQUFJO0lBRXhDLElBQU0sYUFBYSxHQUFHLENBQUMsU0FBUyxJQUFJLGdCQUFnQixJQUFFLGtCQUFrQjtJQUN4RSxJQUFNLGNBQWMsR0FBRyxDQUFDLFVBQVUsSUFBSSxpQkFBaUIsSUFBRSxrQkFBa0I7SUFFM0UsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztNQUNoQyxLQUFLLEVBQUUsR0FBRztNQUNWLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztNQUM3RCxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLENBQUMsV0FBVyxDQUFDO0lBQy9ELENBQUMsQ0FBQztJQUNGLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFDLEdBQUcsRUFBRSxTQUFTLENBQUM7RUFDOUMsQ0FBQyxDQUFFLE9BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkEsT0FBQSxDQUFBLEtBQUEsR0FBQSxLQUFBO0FBS0EsSUFBTSxJQUFJLEdBQUcsU0FBUCxJQUFJLENBQVksR0FBRyxFQUFFO0VBQzFCLElBQUksR0FBRztFQUNQLElBQUk7SUFDSCxJQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBQyxHQUFHLENBQUM7SUFDcEQsSUFBSyxTQUFTLEtBQUssRUFBRSxFQUFHO01BQ3ZCLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztJQUM1QjtFQUNELENBQUMsQ0FBRSxPQUFNLENBQUMsRUFBRTtJQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLEdBQUcsR0FBRyxHQUFHLDJCQUEyQixDQUFDO0lBQ3pFLE9BQU8sQ0FBQyxHQUFHLENBQ1YsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQyxPQUFPLElBQ3RDLENBQUMsQ0FBQyxFQUFFLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQzNCLENBQUMsQ0FBQyxJQUFJLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUNuQyxDQUFDO0VBQ0Y7RUFDQSxPQUFPLEdBQUcsSUFBSSxJQUFJO0FBQ25CLENBQUM7QUFBQyxPQUFBLENBQUEsSUFBQSxHQUFBLElBQUE7QUFFRixJQUFNLFVBQVUsR0FBRyxTQUFiLFVBQVUsQ0FBRyxHQUFHO0VBQUEsT0FBSSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO0FBQUE7QUFFNUQsSUFBTSxrQkFBa0IsR0FBRyxTQUFyQixrQkFBa0IsQ0FBWSxHQUFHLEVBQUU7RUFDeEMsSUFBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRztJQUN2QjtFQUNEO0VBQ0EsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQzNDLElBQU0sU0FBUyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFBLGlCQUFXLEVBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztFQUMzRSxJQUFLLFNBQVMsRUFBRztJQUNoQixZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztFQUM3QjtBQUNELENBQUM7QUFBQyxPQUFBLENBQUEsa0JBQUEsR0FBQSxrQkFBQTtBQUVGLElBQU0saUJBQWlCLEdBQUcsU0FBcEIsaUJBQWlCLENBQUEsRUFBYztFQUNwQztFQUNBLEtBQUssSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0lBQzlDLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUN6RDtBQUNELENBQUM7QUFBQyxPQUFBLENBQUEsaUJBQUEsR0FBQSxpQkFBQTtBQUVGLElBQU0sYUFBYSxHQUFHLFNBQWhCLGFBQWEsQ0FBQSxFQUFjO0VBQ2hDO0VBQ0EsS0FBSyxJQUFJLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7SUFDOUMsSUFBSSxHQUFHLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDN0IsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7TUFDcEIsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7SUFDN0I7RUFDRDtBQUNELENBQUM7O0FBR0Q7QUFBQSxPQUFBLENBQUEsYUFBQSxHQUFBLGFBQUE7Ozs7Ozs7OztBQ2pGQTtBQUNBLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztBQUM5QyxJQUFJLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTzs7QUFFakM7QUFDQSxJQUFJLE1BQU0sR0FBRztFQUNaO0VBQ0EsTUFBTSxFQUFFO0lBQ1A7SUFDQSxNQUFNLGtCQUFBLE1BQUEsQ0FBbUIsT0FBTyxjQUFXO0lBQzNDLE9BQU8sRUFBRTtFQUNWLENBQUM7RUFDRDtFQUNBLFlBQVksRUFBRTtJQUNiLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLG9CQUFvQixFQUFFLEtBQUs7SUFDM0IscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUIsYUFBYSxFQUFFLENBQUM7SUFDaEIsaUJBQWlCLEVBQUUsSUFBSTtJQUN2Qix5QkFBeUIsRUFBRSxJQUFJO0lBQy9CLHVCQUF1QixFQUFFLElBQUk7SUFDN0Isb0JBQW9CLEVBQUUsSUFBSTtJQUMxQiwwQkFBMEIsRUFBRSxDQUFDO0lBQzdCLFdBQVcsRUFBRTtFQUNkLENBQUM7RUFDRDtFQUNBLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBRSxDQUNsQixNQUFNLEVBQ04sWUFBWSxFQUNaLG1CQUFtQixFQUNuQixZQUFZLEVBQ1osdUJBQXVCLEVBQ3ZCLGNBQWMsRUFDZCxjQUFjLEVBQ2QsY0FBYyxFQUNkLFVBQVUsRUFDVixjQUFjLEVBQ2QsY0FBYyxDQUNiLENBQUM7RUFDSCxjQUFjLEVBQUU7SUFDZixPQUFPLEVBQUUsQ0FDUixJQUFJLEVBQ0osSUFBSSxFQUNKLEdBQUcsRUFDSCxJQUFJLEVBQ0osR0FBRyxFQUNILEdBQUcsRUFDSCxPQUFPLEVBQ1AsTUFBTSxFQUNOLE1BQU0sQ0FDTjtJQUNELFdBQVcsRUFBRSxDQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sS0FBSyxFQUNMLEtBQUssQ0FDTDtJQUNELGVBQWUsRUFBRSxDQUNoQixVQUFVLEVBQ1YsT0FBTyxFQUNQLE1BQU0sRUFDTixJQUFJLEVBQ0osUUFBUSxFQUNSLFNBQVMsRUFDVCxVQUFVLEVBQ1YsT0FBTyxFQUNQLFFBQVEsRUFDUixTQUFTLEVBQ1QsVUFBVSxFQUNWLElBQUksRUFDSixVQUFVLEVBQ1YsTUFBTSxDQUNOO0lBQ0QsbUJBQW1CLEVBQUUsQ0FDcEIsS0FBSyxFQUNMLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxFQUNMLFFBQVEsRUFDUixJQUFJO0VBRU4sQ0FBQztFQUNELGFBQWEsRUFBRTtJQUNkLDhCQUE4QixFQUFFO01BQy9CLE9BQU8sRUFBRSxDQUNSLElBQUksRUFDSixJQUFJLEVBQ0osR0FBRyxFQUNILElBQUksRUFDSixHQUFHLEVBQ0gsR0FBRyxFQUNILE9BQU8sRUFDUCxNQUFNLEVBQ04sTUFBTSxFQUNOLElBQUksRUFDSixJQUFJLEVBQ0osSUFBSSxFQUNKLFVBQVUsRUFDVixPQUFPLEVBQ1AsTUFBTSxFQUNOLFFBQVEsRUFDUixTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixVQUFVLEVBQ1YsTUFBTSxDQUNOO01BQ0QsV0FBVyxFQUFFO0lBQ2QsQ0FBQztJQUNELHFCQUFxQixFQUFFO01BQ3RCLE9BQU8sRUFBRSxDQUNSLEtBQUssRUFDTCxVQUFVLEVBQ1YsYUFBYSxFQUNiLE9BQU8sRUFDUCxZQUFZLEVBQ1osTUFBTSxFQUNOLE1BQU0sRUFDTixVQUFVLEVBQ1YsT0FBTyxFQUNQLE1BQU0sRUFDTixTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixJQUFJLEVBQ0osVUFBVSxDQUNWO01BQ0QsV0FBVyxFQUFFLENBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxFQUNMLFFBQVEsRUFDUixJQUFJO0lBRU4sQ0FBQztJQUNELHlCQUF5QixFQUFFO01BQzFCLE9BQU8sRUFBRSxDQUNSLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLFVBQVUsRUFBQyxPQUFPLEVBQUMsTUFBTSxFQUFDLFFBQVEsRUFBQyxTQUFTLEVBQUMsVUFBVSxFQUFDLFVBQVUsRUFBQyxVQUFVLENBQy9IO01BQ0QsV0FBVyxFQUFFLENBQ1osS0FBSyxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLElBQUk7SUFFL0I7RUFDRCxDQUFDO0VBQ0QsY0FBYyxFQUFFLENBQ2YsMEJBQTBCLEVBQzFCLG9CQUFvQixFQUNwQixxQkFBcUIsRUFDckIsS0FBSyxFQUNMLE1BQU0sRUFDTix3QkFBd0IsRUFDeEIsMEJBQTBCLEVBQzFCLEtBQUssRUFDTCxlQUFlLEVBQ2YsTUFBTSxFQUNOLG9CQUFvQixFQUNwQixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYiwwQkFBMEIsRUFDMUIsMkJBQTJCLEVBQzNCLHlCQUF5QixFQUN6Qix3QkFBd0IsRUFDeEIseUJBQXlCLEVBQ3pCLHdCQUF3QixFQUN4QixtQ0FBbUMsRUFDbkMsbUJBQW1CLEVBQ25CLGNBQWMsRUFDZCxhQUFhLEVBQ2IsZUFBZSxFQUNmLG9CQUFvQixDQUNwQjtFQUNELG9CQUFvQixFQUFFO0lBQ3JCLE1BQU0sRUFBRTtNQUNQLE9BQU8sRUFBRTtRQUNSLElBQUksRUFBRTtNQUNQLENBQUM7TUFDRCxhQUFhLEVBQUU7UUFDZCxJQUFJLEVBQUU7TUFDUCxDQUFDO01BQ0QsV0FBVyxFQUFFO0lBQ2QsQ0FBQztJQUNELFFBQVEsRUFBRTtNQUNULE9BQU8sRUFBRTtRQUNSLElBQUksRUFBRTtNQUNQLENBQUM7TUFDRCxhQUFhLEVBQUU7UUFDZCxJQUFJLEVBQUU7TUFDUDtJQUNELENBQUM7SUFDRCxPQUFPLEVBQUU7TUFDUixPQUFPLEVBQUU7UUFDUixJQUFJLEVBQUU7TUFDUCxDQUFDO01BQ0QsYUFBYSxFQUFFO1FBQ2QsSUFBSSxFQUFFO01BQ1AsQ0FBQztNQUNELFdBQVcsRUFBRTtJQUNkLENBQUM7SUFDRCxXQUFXLEVBQUU7TUFDWixPQUFPLEVBQUU7UUFDUixJQUFJLEVBQUU7TUFDUCxDQUFDO01BQ0QsYUFBYSxFQUFFO1FBQ2QsSUFBSSxFQUFFO01BQ1AsQ0FBQztNQUNELFdBQVcsRUFBRTtJQUNkLENBQUM7SUFDRCxhQUFhLEVBQUU7TUFDZCxPQUFPLEVBQUU7UUFDUixJQUFJLEVBQUU7TUFDUCxDQUFDO01BQ0QsYUFBYSxFQUFFO1FBQ2QsSUFBSSxFQUFFO01BQ1AsQ0FBQztNQUNELFNBQVMsRUFBRSxDQUNWLGFBQWEsQ0FDYjtNQUNELFdBQVcsRUFBRSxLQUFLO01BQ2xCLFdBQVcsRUFBRTtJQUNkLENBQUM7SUFDRCxlQUFlLEVBQUU7TUFDaEIsT0FBTyxFQUFFO1FBQ1IsSUFBSSxFQUFFO01BQ1AsQ0FBQztNQUNELGFBQWEsRUFBRTtRQUNkLElBQUksRUFBRTtNQUNQLENBQUM7TUFDRCxTQUFTLEVBQUUsQ0FDVixhQUFhLENBQ2I7TUFDRCxXQUFXLEVBQUUsS0FBSztNQUNsQixXQUFXLEVBQUU7SUFDZDtFQUNEO0FBQ0QsQ0FBQztBQUFDLElBQUEsUUFBQSxHQUVhLE1BQU0sRUFDckI7QUFBQSxPQUFBLGNBQUEsUUFBQTs7Ozs7Ozs7O0FDL09BOztBQUVBO0FBQ0EsSUFBTSxNQUFNLEdBQUcsNmxEQTZCZjtBQUFBLDJOQVFFLEdBQ0Y7QUFBQSxtS0FLQyxHQUNEO0FBQUEscUhBT0M7QUFBQyxJQUFBLFFBQUEsR0FFYSxNQUFNLEVBQ3JCO0FBQUEsT0FBQSxjQUFBLFFBQUE7Ozs7Ozs7Ozs7QUN6REEsSUFBQSxJQUFBLEdBQUEsdUJBQUEsQ0FBQSxPQUFBO0FBQ0EsSUFBQSxLQUFBLEdBQUEsT0FBQTtBQUNBLElBQUEsS0FBQSxHQUFBLHVCQUFBLENBQUEsT0FBQTtBQUFpQyxTQUFBLHlCQUFBLGVBQUEsT0FBQSxrQ0FBQSxLQUFBLE9BQUEsT0FBQSxJQUFBLHdCQUFBLFlBQUEseUJBQUEsV0FBQSxLQUFBLFlBQUEsS0FBQTtBQUFBLFNBQUEsd0JBQUEsR0FBQSxRQUFBLEdBQUEsSUFBQSxHQUFBLENBQUEsVUFBQSxXQUFBLEdBQUEsUUFBQSxHQUFBLGFBQUEsT0FBQSxDQUFBLEdBQUEseUJBQUEsR0FBQSx1Q0FBQSxHQUFBLFVBQUEsS0FBQSxHQUFBLHdCQUFBLFFBQUEsS0FBQSxJQUFBLEtBQUEsQ0FBQSxHQUFBLENBQUEsR0FBQSxZQUFBLEtBQUEsQ0FBQSxHQUFBLENBQUEsR0FBQSxTQUFBLE1BQUEsV0FBQSxxQkFBQSxHQUFBLE1BQUEsQ0FBQSxjQUFBLElBQUEsTUFBQSxDQUFBLHdCQUFBLFdBQUEsR0FBQSxJQUFBLEdBQUEsUUFBQSxNQUFBLENBQUEsU0FBQSxDQUFBLGNBQUEsQ0FBQSxJQUFBLENBQUEsR0FBQSxFQUFBLEdBQUEsU0FBQSxJQUFBLEdBQUEscUJBQUEsR0FBQSxNQUFBLENBQUEsd0JBQUEsQ0FBQSxHQUFBLEVBQUEsR0FBQSxjQUFBLElBQUEsS0FBQSxJQUFBLENBQUEsR0FBQSxJQUFBLElBQUEsQ0FBQSxHQUFBLEtBQUEsTUFBQSxDQUFBLGNBQUEsQ0FBQSxNQUFBLEVBQUEsR0FBQSxFQUFBLElBQUEsWUFBQSxNQUFBLENBQUEsR0FBQSxJQUFBLEdBQUEsQ0FBQSxHQUFBLFNBQUEsTUFBQSxjQUFBLEdBQUEsTUFBQSxLQUFBLElBQUEsS0FBQSxDQUFBLEdBQUEsQ0FBQSxHQUFBLEVBQUEsTUFBQSxZQUFBLE1BQUE7QUFDakM7O0FBRUEsSUFBSSxZQUFZLEdBQUcsU0FBZixZQUFZLENBQVksT0FBTyxFQUFFO0VBQ3BDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0FBQ3ZDLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksdUJBQXVCLEdBQUcsU0FBMUIsdUJBQXVCLENBQUEsRUFBYztFQUV4QyxJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7RUFFbEMsSUFBSSxhQUFhLEdBQUc7SUFDbkIsTUFBTSxFQUFFLE9BQU87SUFDZixNQUFNLEVBQUUsTUFBTTtJQUNkLElBQUksRUFBRSxpQkFBaUI7SUFDdkIsTUFBTSxFQUFFLE9BQU87SUFDZixXQUFXLEVBQUUsSUFBSTtJQUNqQixPQUFPLEVBQUU7RUFDVixDQUFDO0VBRUQsSUFBSSxVQUFVLEdBQUcsQ0FDaEI7SUFDQyxLQUFLLEVBQUUsc0RBQXNEO0lBQzdELFlBQVksRUFBRSxhQUFhO0lBQzNCLE9BQU8sRUFBRSxFQUFFO0lBQ1gsU0FBUyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUM7RUFDdkIsQ0FBQyxFQUNEO0lBQ0MsS0FBSyxFQUFFLHlEQUF5RDtJQUNoRSxZQUFZLEVBQUUsZ0JBQWdCO0lBQzlCLE9BQU8sRUFBRSxFQUFFO0lBQ1gsU0FBUyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUM7RUFDdkIsQ0FBQyxFQUNEO0lBQ0MsS0FBSyxFQUFFLCtDQUErQztJQUN0RCxZQUFZLEVBQUUsVUFBVTtJQUN4QixPQUFPLEVBQUUsRUFBRTtJQUNYLFNBQVMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDO0VBQ3ZCLENBQUMsRUFDRDtJQUNDLEtBQUssRUFBRSxpRUFBaUU7SUFDeEUsWUFBWSxFQUFFLFNBQVM7SUFDdkIsT0FBTyxFQUFFLEVBQUU7SUFDWCxTQUFTLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQztFQUN2QixDQUFDLEVBQ0Q7SUFDQyxLQUFLLEVBQUUsdUNBQXVDO0lBQzlDLFlBQVksRUFBRSxVQUFVO0lBQ3hCLE9BQU8sRUFBRSxFQUFFO0lBQ1gsU0FBUyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUM7RUFDdkIsQ0FBQyxFQUNEO0lBQ0MsS0FBSyxFQUFFLHlEQUF5RDtJQUNoRSxZQUFZLEVBQUUsS0FBSztJQUNuQixPQUFPLEVBQUUsRUFBRTtJQUNYLFNBQVMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDO0VBQ3ZCLENBQUMsQ0FDRDtFQUVELElBQUksWUFBWSxHQUFHLFNBQWYsWUFBWSxDQUFZLE1BQU0sRUFBRSxRQUFRLEVBQUU7SUFDN0MsSUFBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRztNQUNyRDtNQUNBO01BQ0EsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO01BQ3hCO0lBQ0Q7O0lBRUE7SUFDQSxJQUFJLFlBQVksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsVUFBUyxJQUFJLEVBQUU7TUFDbEUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDM0IsQ0FBQyxDQUFDO0lBQ0YsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDOztJQUV0RTtJQUNBLElBQUssTUFBTSxZQUFTLEVBQUc7TUFDdEIsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLFlBQVMsQ0FBQyxFQUFFLFFBQVEsQ0FBQztNQUMzRTtJQUNEO0lBRUEsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztFQUN6QyxDQUFDO0VBRUQsSUFBSSxVQUFVLEdBQUcsU0FBYixVQUFVLENBQVksQ0FBQyxFQUFFLFFBQVEsRUFBRTtJQUN0QyxlQUFHLENBQUMsR0FBRyxDQUFFLENBQUUsQ0FBQyxDQUNWLElBQUksQ0FBRSxVQUFTLE1BQU0sRUFBRTtNQUN2QixZQUFZLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQztJQUMvQixDQUFFLENBQUMsQ0FDRixJQUFJLENBQUUsVUFBUyxJQUFJLEVBQUUsS0FBSyxFQUFFO01BQzVCLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUEsaUJBQVksRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLG1DQUFtQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUM7TUFDNUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pCLENBQUUsQ0FBQztFQUNMLENBQUM7RUFFRCxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7SUFDNUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFFO01BQUUsU0FBUyxFQUFDLEdBQUcsQ0FBQztJQUFNLENBQUMsRUFBRSxhQUFjLENBQUM7SUFDOUQsQ0FBQyxDQUFDLElBQUksQ0FBRSxHQUFHLENBQUMsS0FBSyxHQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEdBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFVO01BQ3ZFLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQztJQUM3QixDQUFDLENBQUM7RUFDSCxDQUFDLENBQUM7RUFFRixVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVU7SUFDeEQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBQSxTQUFTLEVBQUk7TUFDL0IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsR0FBRyxTQUFTLENBQUMsT0FBTztJQUNwRCxDQUFDLENBQUM7SUFFRixlQUFlLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztFQUNqQyxDQUFDLENBQUM7RUFFRixPQUFPLGVBQWU7QUFDdkIsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxtQkFBbUIsR0FBRyxTQUF0QixtQkFBbUIsQ0FBQSxFQUFjO0VBQ3BDLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0VBQ3pDLElBQ0MsQ0FBQyxhQUFhLElBQ2QsQ0FBQyxhQUFhLENBQUMsS0FBSyxJQUNwQixDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQ3ZCO0lBQ0QsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztFQUM3QjtFQUNBLElBQUssSUFBQSxpQkFBVyxFQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsRUFBRztJQUMzQztJQUNBLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO0VBQzdDO0VBQ0EsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztBQUNqRCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxjQUFjLEdBQUcsU0FBakIsY0FBYyxDQUFBO0VBQUEsT0FBUyxtQkFBbUIsQ0FBQyxDQUFDLENBQzlDLElBQUksQ0FBRSxVQUFBLE9BQU8sRUFBSTtJQUNqQjtJQUNBLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7TUFDbEksdUJBQXVCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7TUFDNUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUNkO1FBQUUsV0FBVyxFQUFFLEVBQUU7UUFBRSxjQUFjLEVBQUUsRUFBRTtRQUFFLFFBQVEsRUFBRSxFQUFFO1FBQUUsT0FBTyxFQUFFLEVBQUU7UUFBRSxRQUFRLEVBQUUsRUFBRTtRQUFFLEdBQUcsRUFBRTtNQUFHLENBQUMsRUFDekYsT0FDRCxDQUFDO0lBQ0Y7SUFDQTtJQUNBLE9BQU8sT0FBTztFQUNmLENBQUUsQ0FBQyxTQUNHLENBQUUsWUFBTTtJQUNiO0lBQ0EsSUFBSSxjQUFjLEdBQUcsdUJBQXVCLENBQUMsQ0FBQztJQUM5QyxjQUFjLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztJQUNqQyxPQUFPLGNBQWM7RUFDdEIsQ0FBRSxDQUFDO0FBQUE7O0FBR0o7QUFBQSxPQUFBLENBQUEsY0FBQSxHQUFBLGNBQUE7Ozs7Ozs7Ozs7QUNyS0EsSUFBQSxJQUFBLEdBQUEsc0JBQUEsQ0FBQSxPQUFBO0FBQ0EsSUFBQSxLQUFBLEdBQUEsT0FBQTtBQUNBLElBQUEsT0FBQSxHQUFBLHNCQUFBLENBQUEsT0FBQTtBQUNBLElBQUEsS0FBQSxHQUFBLHVCQUFBLENBQUEsT0FBQTtBQUFpQyxTQUFBLHlCQUFBLGVBQUEsT0FBQSxrQ0FBQSxLQUFBLE9BQUEsT0FBQSxJQUFBLHdCQUFBLFlBQUEseUJBQUEsV0FBQSxLQUFBLFlBQUEsS0FBQTtBQUFBLFNBQUEsd0JBQUEsR0FBQSxRQUFBLEdBQUEsSUFBQSxHQUFBLENBQUEsVUFBQSxXQUFBLEdBQUEsUUFBQSxHQUFBLGFBQUEsT0FBQSxDQUFBLEdBQUEseUJBQUEsR0FBQSx1Q0FBQSxHQUFBLFVBQUEsS0FBQSxHQUFBLHdCQUFBLFFBQUEsS0FBQSxJQUFBLEtBQUEsQ0FBQSxHQUFBLENBQUEsR0FBQSxZQUFBLEtBQUEsQ0FBQSxHQUFBLENBQUEsR0FBQSxTQUFBLE1BQUEsV0FBQSxxQkFBQSxHQUFBLE1BQUEsQ0FBQSxjQUFBLElBQUEsTUFBQSxDQUFBLHdCQUFBLFdBQUEsR0FBQSxJQUFBLEdBQUEsUUFBQSxNQUFBLENBQUEsU0FBQSxDQUFBLGNBQUEsQ0FBQSxJQUFBLENBQUEsR0FBQSxFQUFBLEdBQUEsU0FBQSxJQUFBLEdBQUEscUJBQUEsR0FBQSxNQUFBLENBQUEsd0JBQUEsQ0FBQSxHQUFBLEVBQUEsR0FBQSxjQUFBLElBQUEsS0FBQSxJQUFBLENBQUEsR0FBQSxJQUFBLElBQUEsQ0FBQSxHQUFBLEtBQUEsTUFBQSxDQUFBLGNBQUEsQ0FBQSxNQUFBLEVBQUEsR0FBQSxFQUFBLElBQUEsWUFBQSxNQUFBLENBQUEsR0FBQSxJQUFBLEdBQUEsQ0FBQSxHQUFBLFNBQUEsTUFBQSxjQUFBLEdBQUEsTUFBQSxLQUFBLElBQUEsS0FBQSxDQUFBLEdBQUEsQ0FBQSxHQUFBLEVBQUEsTUFBQSxZQUFBLE1BQUE7QUFBQSxTQUFBLHVCQUFBLEdBQUEsV0FBQSxHQUFBLElBQUEsR0FBQSxDQUFBLFVBQUEsR0FBQSxHQUFBLGdCQUFBLEdBQUE7QUFDakM7O0FBRUEsSUFBTSxTQUFTLFdBQUEsTUFBQSxDQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxxQkFBa0I7QUFFdkUsSUFBTSxpQkFBaUIsR0FBRyxTQUFwQixpQkFBaUIsQ0FBRyxLQUFLO0VBQUEsT0FBSSxLQUFLLENBQUMsS0FBSyxDQUM3QyxPQUFPLEVBQ1AsS0FBSyxFQUNKLENBQUMsR0FBQyxFQUFFLEdBQUMsRUFBRSxHQUFFLENBQUM7RUFBRTtFQUNaLENBQUMsR0FBQyxFQUFFLEdBQUMsRUFBRSxHQUFFLENBQUMsQ0FBRTtFQUNkLENBQUM7QUFBQTtBQUVELElBQU0sZUFBZSxHQUFHLFNBQWxCLGVBQWUsQ0FBQSxFQUFjO0VBQ2xDLE9BQU8sZUFBRyxDQUFDLEdBQUcsQ0FBQztJQUNkLFFBQVEsRUFBRSxPQUFPO0lBQ2pCLFFBQVEsRUFBRSxNQUFNO0lBQ2hCLE1BQU0sRUFBRSxXQUFXO0lBQ25CLFFBQVEsRUFBRSxTQUFTO0lBQ25CLFFBQVEsRUFBRSxTQUFTO0lBQ25CLFNBQVMsRUFBRTtFQUNaLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLFFBQVEsRUFBSTtJQUNuQixJQUFNLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBRyxFQUFFLEVBQUU7TUFDdEMsT0FBTyxrQkFBTSxDQUFDLFlBQVk7SUFDM0I7SUFDQSxJQUFJLEtBQUs7SUFDVCxJQUFJO01BQ0gsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBRSxDQUFDO0lBQ3hELENBQUMsQ0FBQyxPQUFNLENBQUMsRUFBRTtNQUNWLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztJQUNwRDtJQUNBLGlCQUFpQixDQUFDLEtBQUssQ0FBQztJQUN4QixPQUFPLEtBQUs7RUFDYixDQUFDLENBQUM7QUFDSCxDQUFDO0FBRUQsSUFBTSxpQkFBaUIsR0FBRyxTQUFwQixpQkFBaUIsQ0FBQSxFQUFjO0VBQ3BDLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0VBQ3JDLElBQ0MsQ0FBQyxXQUFXLElBQ1osQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUNsQixDQUFDLFdBQVcsQ0FBQyxTQUFTLElBQ3RCLElBQUEsaUJBQVcsRUFBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQ2pDO0lBQ0Q7SUFDQSxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0VBQzdCO0VBQ0EsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztBQUMvQyxDQUFDO0FBRUQsSUFBTSxRQUFRLEdBQUcsU0FBWCxRQUFRLENBQUE7RUFBQSxPQUFTLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJO0VBQzlDO0VBQ0EsVUFBQSxLQUFLO0lBQUEsT0FBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0VBQUE7RUFDcEM7RUFDQTtJQUFBLE9BQU0sZUFBZSxDQUFDLENBQUM7RUFBQSxDQUN4QixDQUFDO0FBQUE7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFIQSxPQUFBLENBQUEsUUFBQSxHQUFBLFFBQUE7QUFJQSxJQUFNLFFBQVEsR0FBRyxTQUFYLFFBQVEsQ0FBWSxZQUFZLEVBQUU7RUFDdkMsT0FBTyxlQUFHLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQ3ZDO0lBQUEsT0FBTztNQUNOLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQztNQUNwQyxTQUFTLEVBQUUsMkJBQTJCLEdBQUcsa0JBQU0sQ0FBQyxNQUFNLENBQUM7SUFDeEQsQ0FBQztFQUFBLENBQ0YsQ0FBQyxDQUNDLElBQUksQ0FBRTtJQUFBLE9BQU0saUJBQWlCLENBQUMsWUFBWSxDQUFDO0VBQUEsQ0FBQyxDQUFDO0FBQ2hELENBQUM7QUFBQyxPQUFBLENBQUEsUUFBQSxHQUFBLFFBQUE7QUFBQSxJQUFBLFFBQUEsR0FFYztFQUFDLEdBQUcsRUFBRSxRQUFRO0VBQUUsR0FBRyxFQUFFO0FBQVEsQ0FBQyxFQUU5QztBQUFBLE9BQUEsY0FBQSxRQUFBOzs7Ozs7Ozs7O0FDNUVBLElBQUEsT0FBQSxHQUFBLHNCQUFBLENBQUEsT0FBQTtBQUNBLElBQUEsSUFBQSxHQUFBLHNCQUFBLENBQUEsT0FBQTtBQUNBLElBQUEsU0FBQSxHQUFBLE9BQUE7QUFDQSxJQUFBLFdBQUEsR0FBQSxPQUFBO0FBQ0EsSUFBQSxLQUFBLEdBQUEsdUJBQUEsQ0FBQSxPQUFBO0FBQ0EsSUFBQSxjQUFBLEdBQUEsc0JBQUEsQ0FBQSxPQUFBO0FBQ0EsSUFBQSxNQUFBLEdBQUEsT0FBQTtBQUNBLElBQUEsS0FBQSxHQUFBLE9BQUE7QUFBc0MsU0FBQSx5QkFBQSxlQUFBLE9BQUEsa0NBQUEsS0FBQSxPQUFBLE9BQUEsSUFBQSx3QkFBQSxZQUFBLHlCQUFBLFdBQUEsS0FBQSxZQUFBLEtBQUE7QUFBQSxTQUFBLHdCQUFBLEdBQUEsUUFBQSxHQUFBLElBQUEsR0FBQSxDQUFBLFVBQUEsV0FBQSxHQUFBLFFBQUEsR0FBQSxhQUFBLE9BQUEsQ0FBQSxHQUFBLHlCQUFBLEdBQUEsdUNBQUEsR0FBQSxVQUFBLEtBQUEsR0FBQSx3QkFBQSxRQUFBLEtBQUEsSUFBQSxLQUFBLENBQUEsR0FBQSxDQUFBLEdBQUEsWUFBQSxLQUFBLENBQUEsR0FBQSxDQUFBLEdBQUEsU0FBQSxNQUFBLFdBQUEscUJBQUEsR0FBQSxNQUFBLENBQUEsY0FBQSxJQUFBLE1BQUEsQ0FBQSx3QkFBQSxXQUFBLEdBQUEsSUFBQSxHQUFBLFFBQUEsTUFBQSxDQUFBLFNBQUEsQ0FBQSxjQUFBLENBQUEsSUFBQSxDQUFBLEdBQUEsRUFBQSxHQUFBLFNBQUEsSUFBQSxHQUFBLHFCQUFBLEdBQUEsTUFBQSxDQUFBLHdCQUFBLENBQUEsR0FBQSxFQUFBLEdBQUEsY0FBQSxJQUFBLEtBQUEsSUFBQSxDQUFBLEdBQUEsSUFBQSxJQUFBLENBQUEsR0FBQSxLQUFBLE1BQUEsQ0FBQSxjQUFBLENBQUEsTUFBQSxFQUFBLEdBQUEsRUFBQSxJQUFBLFlBQUEsTUFBQSxDQUFBLEdBQUEsSUFBQSxHQUFBLENBQUEsR0FBQSxTQUFBLE1BQUEsY0FBQSxHQUFBLE1BQUEsS0FBQSxJQUFBLEtBQUEsQ0FBQSxHQUFBLENBQUEsR0FBQSxFQUFBLE1BQUEsWUFBQSxNQUFBO0FBQUEsU0FBQSx1QkFBQSxHQUFBLFdBQUEsR0FBQSxJQUFBLEdBQUEsQ0FBQSxVQUFBLEdBQUEsR0FBQSxnQkFBQSxHQUFBO0FBQUEsU0FBQSxRQUFBLE1BQUEsRUFBQSxjQUFBLFFBQUEsSUFBQSxHQUFBLE1BQUEsQ0FBQSxJQUFBLENBQUEsTUFBQSxPQUFBLE1BQUEsQ0FBQSxxQkFBQSxRQUFBLE9BQUEsR0FBQSxNQUFBLENBQUEscUJBQUEsQ0FBQSxNQUFBLE9BQUEsY0FBQSxFQUFBLE9BQUEsR0FBQSxPQUFBLENBQUEsTUFBQSxXQUFBLEdBQUEsV0FBQSxNQUFBLENBQUEsd0JBQUEsQ0FBQSxNQUFBLEVBQUEsR0FBQSxFQUFBLFVBQUEsTUFBQSxJQUFBLENBQUEsSUFBQSxDQUFBLEtBQUEsQ0FBQSxJQUFBLEVBQUEsT0FBQSxZQUFBLElBQUE7QUFBQSxTQUFBLGNBQUEsTUFBQSxhQUFBLENBQUEsTUFBQSxDQUFBLEdBQUEsU0FBQSxDQUFBLE1BQUEsRUFBQSxDQUFBLFVBQUEsTUFBQSxHQUFBLFNBQUEsQ0FBQSxDQUFBLFlBQUEsU0FBQSxDQUFBLENBQUEsWUFBQSxDQUFBLFFBQUEsT0FBQSxDQUFBLE1BQUEsQ0FBQSxNQUFBLFNBQUEsT0FBQSxXQUFBLEdBQUEsSUFBQSxlQUFBLENBQUEsTUFBQSxFQUFBLEdBQUEsRUFBQSxNQUFBLENBQUEsR0FBQSxtQkFBQSxNQUFBLENBQUEseUJBQUEsSUFBQSxNQUFBLENBQUEsZ0JBQUEsQ0FBQSxNQUFBLEVBQUEsTUFBQSxD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aWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCJtb2R1bGUuZXhwb3J0cz17XG4gIFwibmFtZVwiOiBcInJhdGVyXCIsXG4gIFwidmVyc2lvblwiOiBcIjIuNy4xXCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJXaWtpcGVkaWEgdXNlcnNjcmlwdCB0aGF0IGhlbHBzIGFzc2VzcyBwYWdlcyBmb3IgV2lraVByb2plY3RzXCIsXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwczovL2dpdGh1Yi5jb20vZXZhZDM3L3JhdGVyXCIsXG4gIFwiYnJvd3NlclwiOiBcImluZGV4LmpzXCIsXG4gIFwic2NyaXB0c1wiOiB7XG4gICAgXCJ0ZXN0XCI6IFwiZWNobyBcXFwiRXJyb3I6IG5vIHRlc3Qgc3BlY2lmaWVkXFxcIiAmJiBleGl0IDFcIixcbiAgICBcImxpbnQ6ZXM1XCI6IFwianNoaW50IGluZGV4LmpzXCIsXG4gICAgXCJsaW50OmVzNlwiOiBcImVzbGludCBpbmRleC5qcyBcXFwicmF0ZXItc3JjLyoqXFxcIlwiLFxuICAgIFwibGludDpmaXhcIjogXCJlc2xpbnQgaW5kZXguanMgXFxcInJhdGVyLXNyYy8qKlxcXCIgLS1maXhcIixcbiAgICBcImxpbnRcIjogXCJucG0gcnVuIGxpbnQ6ZXM2ICYmIG5wbSBydW4gbGludDplczVcIixcbiAgICBcImJ1aWxkOmJ1bmRsZVwiOiBcImJyb3dzZXJpZnkgcmF0ZXItc3JjL0FwcC5qcyAtLWRlYnVnIC10IGJhYmVsaWZ5IC0tb3V0ZmlsZSBkaXN0L3JhdGVyLmpzXCIsXG4gICAgXCJidWlsZDptaW5pZnlcIjogXCJ1Z2xpZnlqcyBkaXN0L3JhdGVyLmpzIC0tY29tcHJlc3MgLWIgYXNjaWlfb25seT10cnVlLGJlYXV0aWZ5PWZhbHNlIC0tb3V0cHV0IGRpc3QvcmF0ZXIubWluLmpzXCIsXG4gICAgXCJidWlsZDpjb25jYXRcIjogXCJjb25jYXQtY2xpIC1mIFxcXCJjb21tZW50LXRvcC5qc1xcXCIgZGlzdC9yYXRlci5taW4uanMgXFxcImNvbW1lbnQtYm90dG9tLmpzXFxcIiAtbyBkaXN0L3JhdGVyLm1pbi5qc1wiLFxuICAgIFwiYnVpbGRcIjogXCJucG0gcnVuIGxpbnQgJiYgbnBtIHJ1biBidWlsZDpidW5kbGUgJiYgbnBtIHJ1biBidWlsZDptaW5pZnkgJiYgbnBtIHJ1biBidWlsZDpjb25jYXRcIlxuICB9LFxuICBcImF1dGhvclwiOiB7XG4gICAgXCJuYW1lXCI6IFwiRXZhZDM3XCIsXG4gICAgXCJ1cmxcIjogXCJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Vc2VyOkV2YWQzN1wiXG4gIH0sXG4gIFwicmVwb3NpdG9yeVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiZ2l0XCIsXG4gICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vZXZhZDM3L3JhdGVyLmdpdFwiXG4gIH0sXG4gIFwibGljZW5zZVwiOiBcIihNSVQgT1IgQ0MtQlktNC4wKVwiLFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAYmFiZWwvY29yZVwiOiBcIl43LjkuMFwiLFxuICAgIFwiQGJhYmVsL3ByZXNldC1lbnZcIjogXCJeNy45LjBcIixcbiAgICBcImJhYmVsaWZ5XCI6IFwiXjEwLjAuMFwiLFxuICAgIFwiYnJvd3NlcmlmeVwiOiBcIl4xNi41LjBcIixcbiAgICBcImNvbmNhdC1jbGlcIjogXCJeNC4wLjBcIixcbiAgICBcImVzbGludFwiOiBcIl42LjguMFwiLFxuICAgIFwianNoaW50XCI6IFwiXjIuMTEuMFwiLFxuICAgIFwidWdsaWZ5LWpzXCI6IFwiXjMuOC4wXCJcbiAgfVxufVxuIiwiaW1wb3J0IHNldHVwUmF0ZXIgZnJvbSBcIi4vc2V0dXBcIjtcclxuaW1wb3J0IGF1dG9TdGFydCBmcm9tIFwiLi9hdXRvc3RhcnRcIjtcclxuaW1wb3J0IHN0eWxlcyBmcm9tIFwiLi9jc3MuanNcIjtcclxuaW1wb3J0IHsgbWFrZUVycm9yTXNnIH0gZnJvbSBcIi4vYXBpXCI7XHJcbmltcG9ydCB3aW5kb3dNYW5hZ2VyIGZyb20gXCIuL3dpbmRvd01hbmFnZXJcIjtcclxuLy8gPG5vd2lraT5cclxuXHJcbihmdW5jdGlvbiBBcHAoKSB7XHJcblx0bGV0IHN0eWxlc2hlZXQ7XHJcblxyXG5cdGNvbnN0IHNob3dNYWluV2luZG93ID0gZGF0YSA9PiB7XHJcblx0XHRpZiAoIWRhdGEgfHwgIWRhdGEuc3VjY2Vzcykge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRpZiAoc3R5bGVzaGVldCkge1xyXG5cdFx0XHRzdHlsZXNoZWV0LmRpc2FibGVkID0gZmFsc2U7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRzdHlsZXNoZWV0ID0gbXcudXRpbC5hZGRDU1Moc3R5bGVzKTtcclxuXHRcdH1cclxuXHRcdC8vIEFkZCBjc3MgY2xhc3MgdG8gYm9keSB0byBlbmFibGUgYmFja2dyb3VuZCBzY3JvbGxpbmdcclxuXHRcdGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYm9keVwiKVswXS5jbGFzc0xpc3QuYWRkKFwicmF0ZXItbWFpbldpbmRvdy1vcGVuXCIpO1xyXG5cdFx0Ly8gT3BlbiB0aGUgd2luZG93XHJcblx0XHR3aW5kb3dNYW5hZ2VyLm9wZW5XaW5kb3coXCJtYWluXCIsIGRhdGEpXHJcblx0XHRcdC5jbG9zZWQudGhlbiggcmVzdWx0ID0+IHtcclxuXHRcdFx0XHQvLyBEaXNhYmxlL3JlbW92ZSB0aGUgY3NzIHN0eWxlcywgc28gYXMgdG8gbm90IGludGVyZmVyZSB3aXRoIG90aGVyIHNjcmlwdHMvY29udGVudC9PT1VJIHdpbmRvd3NcclxuXHRcdFx0XHRpZiAoc3R5bGVzaGVldCkgeyBzdHlsZXNoZWV0LmRpc2FibGVkID0gdHJ1ZTsgfVxyXG5cdFx0XHRcdGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYm9keVwiKVswXS5jbGFzc0xpc3QucmVtb3ZlKFwicmF0ZXItbWFpbldpbmRvdy1vcGVuXCIpO1xyXG5cdFx0XHRcdC8vIFJlc3RhcnQgaWYgbmVlZGVkXHJcblx0XHRcdFx0aWYgKHJlc3VsdCAmJiByZXN1bHQucmVzdGFydCkge1xyXG5cdFx0XHRcdFx0d2luZG93TWFuYWdlci5yZW1vdmVXaW5kb3dzKFtcIm1haW5cIl0pXHJcblx0XHRcdFx0XHRcdC50aGVuKHNldHVwUmF0ZXIpXHJcblx0XHRcdFx0XHRcdC50aGVuKHNob3dNYWluV2luZG93LCBzaG93U2V0dXBFcnJvcik7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdC8vIFNob3cgbm90aWZpY2F0aW9uIHdoZW4gc2F2ZWQgc3VjY2Vzc2Z1bGx5XHJcblx0XHRcdFx0aWYgKHJlc3VsdCAmJiByZXN1bHQuc3VjY2Vzcykge1xyXG5cdFx0XHRcdFx0Y29uc3QgJG1lc3NhZ2UgPSAkKFwiPHNwYW4+XCIpLmFwcGVuZChcclxuXHRcdFx0XHRcdFx0JChcIjxzdHJvbmc+XCIpLnRleHQoXCJSYXRpbmdzIHNhdmVkIHN1Y2Nlc3NmdWxseS5cIilcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRpZiAocmVzdWx0LnVwZ3JhZGVkU3R1Yikge1xyXG5cdFx0XHRcdFx0XHQkbWVzc2FnZS5hcHBlbmQoXHJcblx0XHRcdFx0XHRcdFx0JChcIjxicj5cIiksXHJcblx0XHRcdFx0XHRcdFx0Ly8gVE9ETzogVGhlcmUgc2hvdWxkIGJlIGEgbGluayB0aGF0IHdpbGwgZWRpdCB0aGUgYXJ0aWNsZSBmb3IgeW91XHJcblx0XHRcdFx0XHRcdFx0JChcIjxzcGFuPlwiKS50ZXh0KFwiTm90ZSB0aGF0IHRoZSBhcnRpY2xlIGFwcGVhcnMgdG8gYmUgdGFnZ2VkIGFzIGEgc3R1Yi5cIilcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdG13Lm5vdGlmeShcclxuXHRcdFx0XHRcdFx0JG1lc3NhZ2UsXHJcblx0XHRcdFx0XHRcdHsgYXV0b0hpZGU6IHRydWUsIGF1dG9IaWRlU2Vjb25kczogXCJsb25nXCIsIHRhZzogXCJSYXRlci1zYXZlZFwiIH1cclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9ICk7XHJcblx0fTtcclxuXHJcblx0Y29uc3Qgc2hvd1NldHVwRXJyb3IgPSAoY29kZSwganF4aHIpID0+IE9PLnVpLmFsZXJ0KFxyXG5cdFx0bWFrZUVycm9yTXNnKGNvZGUsIGpxeGhyKSxcdHtcclxuXHRcdFx0dGl0bGU6IFwiUmF0ZXIgZmFpbGVkIHRvIG9wZW5cIlxyXG5cdFx0fVxyXG5cdCk7XHJcblxyXG5cdC8vIEludm9jYXRpb24gYnkgcG9ydGxldCBsaW5rIFxyXG5cdG13LnV0aWwuYWRkUG9ydGxldExpbmsoXHJcblx0XHRcInAtY2FjdGlvbnNcIixcclxuXHRcdFwiI1wiLFxyXG5cdFx0XCJSYXRlclwiLFxyXG5cdFx0XCJjYS1yYXRlclwiLFxyXG5cdFx0XCJSYXRlIHF1YWxpdHkgYW5kIGltcG9ydGFuY2VcIixcclxuXHRcdFwiNVwiXHJcblx0KTtcclxuXHQkKFwiI2NhLXJhdGVyXCIpLmNsaWNrKGV2ZW50ID0+IHtcclxuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRzZXR1cFJhdGVyKCkudGhlbihzaG93TWFpbldpbmRvdywgc2hvd1NldHVwRXJyb3IpO1xyXG5cdH0pO1xyXG5cclxuXHQvLyBJbnZvY2F0aW9uIGJ5IGF1dG8tc3RhcnQgKGRvIG5vdCBzaG93IG1lc3NhZ2Ugb24gZXJyb3IpXHJcblx0YXV0b1N0YXJ0KCkudGhlbihzaG93TWFpbldpbmRvdyk7XHJcbn0pKCk7XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCBBUEkgZnJvbSBcIi4vYXBpXCI7XHJcbmltcG9ydCB7aXNBZnRlckRhdGUsIG1vc3RGcmVxdWVudCwgZmlsdGVyQW5kTWFwfSBmcm9tIFwiLi91dGlsXCI7XHJcbmltcG9ydCBjb25maWcgZnJvbSBcIi4vY29uZmlnXCI7XHJcbmltcG9ydCAqIGFzIGNhY2hlIGZyb20gXCIuL2NhY2hlXCI7XHJcbi8vIDxub3dpa2k+XHJcblxyXG4vKiogVGVtcGxhdGVcclxuICpcclxuICogQGNsYXNzXHJcbiAqIFJlcHJlc2VudHMgdGhlIHdpa2l0ZXh0IG9mIHRlbXBsYXRlIHRyYW5zY2x1c2lvbi4gVXNlZCBieSAjcGFyc2VUZW1wbGF0ZXMuXHJcbiAqIEBwcm9wIHtTdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgdGVtcGxhdGVcclxuICogQHByb3Age1N0cmluZ30gd2lraXRleHQgRnVsbCB3aWtpdGV4dCBvZiB0aGUgdHJhbnNjbHVzaW9uXHJcbiAqIEBwcm9wIHtPYmplY3RbXX0gcGFyYW1ldGVycyBQYXJhbWV0ZXJzIHVzZWQgaW4gdGhlIHRyYW5zbGN1c2lvbiwgaW4gb3JkZXIsIG9mIGZvcm06XHJcblx0e1xyXG5cdFx0bmFtZToge1N0cmluZ3xOdW1iZXJ9IHBhcmFtZXRlciBuYW1lLCBvciBwb3NpdGlvbiBmb3IgdW5uYW1lZCBwYXJhbWV0ZXJzLFxyXG5cdFx0dmFsdWU6IHtTdHJpbmd9IFdpa2l0ZXh0IHBhc3NlZCB0byB0aGUgcGFyYW1ldGVyICh3aGl0ZXNwYWNlIHRyaW1tZWQpLFxyXG5cdFx0d2lraXRleHQ6IHtTdHJpbmd9IEZ1bGwgd2lraXRleHQgKGluY2x1ZGluZyBsZWFkaW5nIHBpcGUsIHBhcmFtZXRlciBuYW1lL2VxdWFscyBzaWduIChpZiBhcHBsaWNhYmxlKSwgdmFsdWUsIGFuZCBhbnkgd2hpdGVzcGFjZSlcclxuXHR9XHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAcGFyYW0ge1N0cmluZ30gd2lraXRleHQgV2lraXRleHQgb2YgYSB0ZW1wbGF0ZSB0cmFuc2NsdXNpb24sIHN0YXJ0aW5nIHdpdGggJ3t7JyBhbmQgZW5kaW5nIHdpdGggJ319Jy5cclxuICovXHJcbnZhciBUZW1wbGF0ZSA9IGZ1bmN0aW9uKHdpa2l0ZXh0KSB7XHJcblx0dGhpcy53aWtpdGV4dCA9IHdpa2l0ZXh0O1xyXG5cdHRoaXMucGFyYW1ldGVycyA9IFtdO1xyXG5cdC8vIFNwYWNpbmcgYXJvdW5kIHBpcGVzLCBlcXVhbHMgc2lnbnMsIGVuZCBicmFjZXMgKGRlZmF1bHRzKVxyXG5cdHRoaXMucGlwZVN0eWxlID0gXCIgfFwiO1xyXG5cdHRoaXMuZXF1YWxzU3R5bGUgPSBcIj1cIjtcclxuXHR0aGlzLmVuZEJyYWNlc1N0eWxlID0gXCJ9fVwiO1xyXG59O1xyXG5UZW1wbGF0ZS5wcm90b3R5cGUuYWRkUGFyYW0gPSBmdW5jdGlvbihuYW1lLCB2YWwsIHdpa2l0ZXh0KSB7XHJcblx0dGhpcy5wYXJhbWV0ZXJzLnB1c2goe1xyXG5cdFx0XCJuYW1lXCI6IG5hbWUsXHJcblx0XHRcInZhbHVlXCI6IHZhbCwgXHJcblx0XHRcIndpa2l0ZXh0XCI6IFwifFwiICsgd2lraXRleHRcclxuXHR9KTtcclxufTtcclxuLyoqXHJcbiAqIEdldCBhIHBhcmFtZXRlciBkYXRhIGJ5IHBhcmFtZXRlciBuYW1lXHJcbiAqLyBcclxuVGVtcGxhdGUucHJvdG90eXBlLmdldFBhcmFtID0gZnVuY3Rpb24ocGFyYW1OYW1lKSB7XHJcblx0cmV0dXJuIHRoaXMucGFyYW1ldGVycy5maW5kKGZ1bmN0aW9uKHApIHsgcmV0dXJuIHAubmFtZSA9PSBwYXJhbU5hbWU7IH0pO1xyXG59O1xyXG5UZW1wbGF0ZS5wcm90b3R5cGUuc2V0TmFtZSA9IGZ1bmN0aW9uKG5hbWUpIHtcclxuXHR0aGlzLm5hbWUgPSBuYW1lLnRyaW0oKTtcclxufTtcclxuVGVtcGxhdGUucHJvdG90eXBlLmdldFRpdGxlID0gZnVuY3Rpb24oKSB7XHJcblx0cmV0dXJuIG13LlRpdGxlLm5ld0Zyb21UZXh0KFwiVGVtcGxhdGU6XCIgKyB0aGlzLm5hbWUpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIHBhcnNlVGVtcGxhdGVzXHJcbiAqXHJcbiAqIFBhcnNlcyB0ZW1wbGF0ZXMgZnJvbSB3aWtpdGV4dC5cclxuICogQmFzZWQgb24gU0QwMDAxJ3MgdmVyc2lvbiBhdCA8aHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVXNlcjpTRDAwMDEvcGFyc2VBbGxUZW1wbGF0ZXMuanM+LlxyXG4gKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHRlbXBsYXRlIGRldGFpbHM6XHJcbiAqICB2YXIgdGVtcGxhdGVzID0gcGFyc2VUZW1wbGF0ZXMoXCJIZWxsbyB7e2ZvbyB8QmFyfGJhej1xdXggfDI9bG9yZW1pcHN1bXwzPX19IHdvcmxkXCIpO1xyXG4gKiAgY29uc29sZS5sb2codGVtcGxhdGVzWzBdKTsgLy8gLS0+IG9iamVjdFxyXG5cdHtcclxuXHRcdG5hbWU6IFwiZm9vXCIsXHJcblx0XHR3aWtpdGV4dDpcInt7Zm9vIHxCYXJ8YmF6PXF1eCB8IDIgPSBsb3JlbWlwc3VtICB8Mz19fVwiLFxyXG5cdFx0cGFyYW1ldGVyczogW1xyXG5cdFx0XHR7XHJcblx0XHRcdFx0bmFtZTogMSxcclxuXHRcdFx0XHR2YWx1ZTogJ0JhcicsXHJcblx0XHRcdFx0d2lraXRleHQ6ICd8QmFyJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0bmFtZTogJ2JheicsXHJcblx0XHRcdFx0dmFsdWU6ICdxdXgnLFxyXG5cdFx0XHRcdHdpa2l0ZXh0OiAnfGJhej1xdXggJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0bmFtZTogJzInLFxyXG5cdFx0XHRcdHZhbHVlOiAnbG9yZW1pcHN1bScsXHJcblx0XHRcdFx0d2lraXRleHQ6ICd8IDIgPSBsb3JlbWlwc3VtICAnXHJcblx0XHRcdH0sXHJcblx0XHRcdHtcclxuXHRcdFx0XHRuYW1lOiAnMycsXHJcblx0XHRcdFx0dmFsdWU6ICcnLFxyXG5cdFx0XHRcdHdpa2l0ZXh0OiAnfDM9J1xyXG5cdFx0XHR9XHJcblx0XHRdLFxyXG5cdFx0Z2V0UGFyYW06IGZ1bmN0aW9uKHBhcmFtTmFtZSkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5wYXJhbWV0ZXJzLmZpbmQoZnVuY3Rpb24ocCkgeyByZXR1cm4gcC5uYW1lID09IHBhcmFtTmFtZTsgfSk7XHJcblx0XHR9XHJcblx0fVxyXG4gKiAgICBcclxuICogXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSB3aWtpdGV4dFxyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHJlY3Vyc2l2ZSBTZXQgdG8gYHRydWVgIHRvIGFsc28gcGFyc2UgdGVtcGxhdGVzIHRoYXQgb2NjdXIgd2l0aGluIG90aGVyIHRlbXBsYXRlcyxcclxuICogIHJhdGhlciB0aGFuIGp1c3QgdG9wLWxldmVsIHRlbXBsYXRlcy4gXHJcbiAqIEByZXR1cm4ge1RlbXBsYXRlW119IHRlbXBsYXRlc1xyXG4qL1xyXG52YXIgcGFyc2VUZW1wbGF0ZXMgPSBmdW5jdGlvbih3aWtpdGV4dCwgcmVjdXJzaXZlKSB7IC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnRyb2wtcmVnZXggKi9cclxuXHRpZiAoIXdpa2l0ZXh0KSB7XHJcblx0XHRyZXR1cm4gW107XHJcblx0fVxyXG5cdHZhciBzdHJSZXBsYWNlQXQgPSBmdW5jdGlvbihzdHJpbmcsIGluZGV4LCBjaGFyKSB7XHJcblx0XHRyZXR1cm4gc3RyaW5nLnNsaWNlKDAsaW5kZXgpICsgY2hhciArIHN0cmluZy5zbGljZShpbmRleCArIDEpO1xyXG5cdH07XHJcblxyXG5cdHZhciByZXN1bHQgPSBbXTtcclxuXHRcclxuXHR2YXIgcHJvY2Vzc1RlbXBsYXRlVGV4dCA9IGZ1bmN0aW9uIChzdGFydElkeCwgZW5kSWR4KSB7XHJcblx0XHR2YXIgdGV4dCA9IHdpa2l0ZXh0LnNsaWNlKHN0YXJ0SWR4LCBlbmRJZHgpO1xyXG5cclxuXHRcdHZhciB0ZW1wbGF0ZSA9IG5ldyBUZW1wbGF0ZShcInt7XCIgKyB0ZXh0LnJlcGxhY2UoL1xceDAxL2csXCJ8XCIpICsgXCJ9fVwiKTtcclxuXHRcdFxyXG5cdFx0Ly8gc3dhcCBvdXQgcGlwZSBpbiBsaW5rcyB3aXRoIFxceDAxIGNvbnRyb2wgY2hhcmFjdGVyXHJcblx0XHQvLyBbW0ZpbGU6IF1dIGNhbiBoYXZlIG11bHRpcGxlIHBpcGVzLCBzbyBtaWdodCBuZWVkIG11bHRpcGxlIHBhc3Nlc1xyXG5cdFx0d2hpbGUgKCAvKFxcW1xcW1teXFxdXSo/KVxcfCguKj9cXF1cXF0pL2cudGVzdCh0ZXh0KSApIHtcclxuXHRcdFx0dGV4dCA9IHRleHQucmVwbGFjZSgvKFxcW1xcW1teXFxdXSo/KVxcfCguKj9cXF1cXF0pL2csIFwiJDFcXHgwMSQyXCIpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEZpZ3VyZSBvdXQgbW9zdC11c2VkIHNwYWNpbmcgc3R5bGVzIGZvciBwaXBlcy9lcXVhbHNcclxuXHRcdHRlbXBsYXRlLnBpcGVTdHlsZSA9IG1vc3RGcmVxdWVudCggdGV4dC5tYXRjaCgvW1xcc1xcbl0qXFx8W1xcc1xcbl0qL2cpICkgfHwgXCIgfFwiO1xyXG5cdFx0dGVtcGxhdGUuZXF1YWxzU3R5bGUgPSBtb3N0RnJlcXVlbnQoIHRleHQucmVwbGFjZSgvKD1bXnxdKik9Ky9nLCBcIiQxXCIpLm1hdGNoKC9bXFxzXFxuXSo9W1xcc1xcbl0qL2cpICkgfHwgXCI9XCI7XHJcblx0XHQvLyBGaWd1cmUgb3V0IGVuZC1icmFjZXMgc3R5bGVcclxuXHRcdHZhciBlbmRTcGFjaW5nID0gdGV4dC5tYXRjaCgvW1xcc1xcbl0qJC8pO1xyXG5cdFx0dGVtcGxhdGUuZW5kQnJhY2VzU3R5bGUgPSAoZW5kU3BhY2luZyA/IGVuZFNwYWNpbmdbMF0gOiBcIlwiKSArIFwifX1cIjtcclxuXHJcblx0XHR2YXIgY2h1bmtzID0gdGV4dC5zcGxpdChcInxcIikubWFwKGZ1bmN0aW9uKGNodW5rKSB7XHJcblx0XHRcdC8vIGNoYW5nZSAnXFx4MDEnIGNvbnRyb2wgY2hhcmFjdGVycyBiYWNrIHRvIHBpcGVzXHJcblx0XHRcdHJldHVybiBjaHVuay5yZXBsYWNlKC9cXHgwMS9nLFwifFwiKTsgXHJcblx0XHR9KTtcclxuXHJcblx0XHR0ZW1wbGF0ZS5zZXROYW1lKGNodW5rc1swXSk7XHJcblx0XHRcclxuXHRcdHZhciBwYXJhbWV0ZXJDaHVua3MgPSBjaHVua3Muc2xpY2UoMSk7XHJcblxyXG5cdFx0dmFyIHVubmFtZWRJZHggPSAxO1xyXG5cdFx0cGFyYW1ldGVyQ2h1bmtzLmZvckVhY2goZnVuY3Rpb24oY2h1bmspIHtcclxuXHRcdFx0dmFyIGluZGV4T2ZFcXVhbFRvID0gY2h1bmsuaW5kZXhPZihcIj1cIik7XHJcblx0XHRcdHZhciBpbmRleE9mT3BlbkJyYWNlcyA9IGNodW5rLmluZGV4T2YoXCJ7e1wiKTtcclxuXHRcdFx0XHJcblx0XHRcdHZhciBpc1dpdGhvdXRFcXVhbHMgPSAhY2h1bmsuaW5jbHVkZXMoXCI9XCIpO1xyXG5cdFx0XHR2YXIgaGFzQnJhY2VzQmVmb3JlRXF1YWxzID0gY2h1bmsuaW5jbHVkZXMoXCJ7e1wiKSAmJiBpbmRleE9mT3BlbkJyYWNlcyA8IGluZGV4T2ZFcXVhbFRvO1x0XHJcblx0XHRcdHZhciBpc1VubmFtZWRQYXJhbSA9ICggaXNXaXRob3V0RXF1YWxzIHx8IGhhc0JyYWNlc0JlZm9yZUVxdWFscyApO1xyXG5cdFx0XHRcclxuXHRcdFx0dmFyIHBOYW1lLCBwTnVtLCBwVmFsO1xyXG5cdFx0XHRpZiAoIGlzVW5uYW1lZFBhcmFtICkge1xyXG5cdFx0XHRcdC8vIEdldCB0aGUgbmV4dCBudW1iZXIgbm90IGFscmVhZHkgdXNlZCBieSBlaXRoZXIgYW4gdW5uYW1lZCBwYXJhbWV0ZXIsIG9yIGJ5IGFcclxuXHRcdFx0XHQvLyBuYW1lZCBwYXJhbWV0ZXIgbGlrZSBgfDE9dmFsYFxyXG5cdFx0XHRcdHdoaWxlICggdGVtcGxhdGUuZ2V0UGFyYW0odW5uYW1lZElkeCkgKSB7XHJcblx0XHRcdFx0XHR1bm5hbWVkSWR4Kys7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHBOdW0gPSB1bm5hbWVkSWR4O1xyXG5cdFx0XHRcdHBWYWwgPSBjaHVuay50cmltKCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0cE5hbWUgPSBjaHVuay5zbGljZSgwLCBpbmRleE9mRXF1YWxUbykudHJpbSgpO1xyXG5cdFx0XHRcdHBWYWwgPSBjaHVuay5zbGljZShpbmRleE9mRXF1YWxUbyArIDEpLnRyaW0oKTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0ZW1wbGF0ZS5hZGRQYXJhbShwTmFtZSB8fCBwTnVtLCBwVmFsLCBjaHVuayk7XHJcblx0XHR9KTtcclxuXHRcdFxyXG5cdFx0cmVzdWx0LnB1c2godGVtcGxhdGUpO1xyXG5cdH07XHJcblxyXG5cdFxyXG5cdHZhciBuID0gd2lraXRleHQubGVuZ3RoO1xyXG5cdFxyXG5cdC8vIG51bWJlciBvZiB1bmNsb3NlZCBicmFjZXNcclxuXHR2YXIgbnVtVW5jbG9zZWQgPSAwO1xyXG5cclxuXHQvLyBhcmUgd2UgaW5zaWRlIGEgY29tbWVudCwgb3IgYmV0d2VlbiBub3dpa2kgdGFncywgb3IgaW4gYSB7e3twYXJhbWV0ZXJ9fX0/XHJcblx0dmFyIGluQ29tbWVudCA9IGZhbHNlO1xyXG5cdHZhciBpbk5vd2lraSA9IGZhbHNlO1xyXG5cdHZhciBpblBhcmFtZXRlciA9IGZhbHNlO1xyXG5cclxuXHR2YXIgc3RhcnRJZHgsIGVuZElkeDtcclxuXHRcclxuXHRmb3IgKHZhciBpPTA7IGk8bjsgaSsrKSB7XHJcblx0XHRcclxuXHRcdGlmICggIWluQ29tbWVudCAmJiAhaW5Ob3dpa2kgJiYgIWluUGFyYW1ldGVyICkge1xyXG5cclxuXHRcdFx0aWYgKHdpa2l0ZXh0W2ldID09PSBcIntcIiAmJiB3aWtpdGV4dFtpKzFdID09PSBcIntcIiAmJiB3aWtpdGV4dFtpKzJdID09PSBcIntcIiAmJiB3aWtpdGV4dFtpKzNdICE9PSBcIntcIikge1xyXG5cdFx0XHRcdGluUGFyYW1ldGVyID0gdHJ1ZTtcclxuXHRcdFx0XHRpICs9IDI7XHJcblx0XHRcdH0gZWxzZSBpZiAod2lraXRleHRbaV0gPT09IFwie1wiICYmIHdpa2l0ZXh0W2krMV0gPT09IFwie1wiKSB7XHJcblx0XHRcdFx0aWYgKG51bVVuY2xvc2VkID09PSAwKSB7XHJcblx0XHRcdFx0XHRzdGFydElkeCA9IGkrMjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0bnVtVW5jbG9zZWQgKz0gMjtcclxuXHRcdFx0XHRpKys7XHJcblx0XHRcdH0gZWxzZSBpZiAod2lraXRleHRbaV0gPT09IFwifVwiICYmIHdpa2l0ZXh0W2krMV0gPT09IFwifVwiKSB7XHJcblx0XHRcdFx0aWYgKG51bVVuY2xvc2VkID09PSAyKSB7XHJcblx0XHRcdFx0XHRlbmRJZHggPSBpO1xyXG5cdFx0XHRcdFx0cHJvY2Vzc1RlbXBsYXRlVGV4dChzdGFydElkeCwgZW5kSWR4KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0bnVtVW5jbG9zZWQgLT0gMjtcclxuXHRcdFx0XHRpKys7XHJcblx0XHRcdH0gZWxzZSBpZiAod2lraXRleHRbaV0gPT09IFwifFwiICYmIG51bVVuY2xvc2VkID4gMikge1xyXG5cdFx0XHRcdC8vIHN3YXAgb3V0IHBpcGVzIGluIG5lc3RlZCB0ZW1wbGF0ZXMgd2l0aCBcXHgwMSBjaGFyYWN0ZXJcclxuXHRcdFx0XHR3aWtpdGV4dCA9IHN0clJlcGxhY2VBdCh3aWtpdGV4dCwgaSxcIlxceDAxXCIpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKCAvXjwhLS0vLnRlc3Qod2lraXRleHQuc2xpY2UoaSwgaSArIDQpKSApIHtcclxuXHRcdFx0XHRpbkNvbW1lbnQgPSB0cnVlO1xyXG5cdFx0XHRcdGkgKz0gMztcclxuXHRcdFx0fSBlbHNlIGlmICggL148bm93aWtpID8+Ly50ZXN0KHdpa2l0ZXh0LnNsaWNlKGksIGkgKyA5KSkgKSB7XHJcblx0XHRcdFx0aW5Ob3dpa2kgPSB0cnVlO1xyXG5cdFx0XHRcdGkgKz0gNztcclxuXHRcdFx0fSBcclxuXHJcblx0XHR9IGVsc2UgeyAvLyB3ZSBhcmUgaW4gYSBjb21tZW50IG9yIG5vd2lraSBvciB7e3twYXJhbWV0ZXJ9fX1cclxuXHRcdFx0aWYgKHdpa2l0ZXh0W2ldID09PSBcInxcIikge1xyXG5cdFx0XHRcdC8vIHN3YXAgb3V0IHBpcGVzIHdpdGggXFx4MDEgY2hhcmFjdGVyXHJcblx0XHRcdFx0d2lraXRleHQgPSBzdHJSZXBsYWNlQXQod2lraXRleHQsIGksXCJcXHgwMVwiKTtcclxuXHRcdFx0fSBlbHNlIGlmICgvXi0tPi8udGVzdCh3aWtpdGV4dC5zbGljZShpLCBpICsgMykpKSB7XHJcblx0XHRcdFx0aW5Db21tZW50ID0gZmFsc2U7XHJcblx0XHRcdFx0aSArPSAyO1xyXG5cdFx0XHR9IGVsc2UgaWYgKC9ePFxcL25vd2lraSA/Pi8udGVzdCh3aWtpdGV4dC5zbGljZShpLCBpICsgMTApKSkge1xyXG5cdFx0XHRcdGluTm93aWtpID0gZmFsc2U7XHJcblx0XHRcdFx0aSArPSA4O1xyXG5cdFx0XHR9IGVsc2UgaWYgKHdpa2l0ZXh0W2ldID09PSBcIn1cIiAmJiB3aWtpdGV4dFtpKzFdID09PSBcIn1cIiAmJiB3aWtpdGV4dFtpKzJdID09PSBcIn1cIikge1xyXG5cdFx0XHRcdGluUGFyYW1ldGVyID0gZmFsc2U7XHJcblx0XHRcdFx0aSArPSAyO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHRcclxuXHRpZiAoIHJlY3Vyc2l2ZSApIHtcclxuXHRcdHZhciBzdWJ0ZW1wbGF0ZXMgPSBmaWx0ZXJBbmRNYXAocmVzdWx0LFxyXG5cdFx0XHR0ZW1wbGF0ZSA9PiAvXFx7XFx7KD86LnxcXG4pKlxcfVxcfS8udGVzdCh0ZW1wbGF0ZS53aWtpdGV4dC5zbGljZSgyLC0yKSksXHJcblx0XHRcdHRlbXBsYXRlID0+IHBhcnNlVGVtcGxhdGVzKHRlbXBsYXRlLndpa2l0ZXh0LnNsaWNlKDIsLTIpLCB0cnVlKVxyXG5cdFx0KTtcclxuXHRcdHJldHVybiByZXN1bHQuY29uY2F0LmFwcGx5KHJlc3VsdCwgc3VidGVtcGxhdGVzKTtcclxuXHR9XHJcblxyXG5cdHJldHVybiByZXN1bHQ7IFxyXG59OyAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnRyb2wtcmVnZXggKi9cclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge1RlbXBsYXRlfFRlbXBsYXRlW119IHRlbXBsYXRlc1xyXG4gKiBAcmV0dXJuIHtQcm9taXNlPFRlbXBsYXRlPnxQcm9taXNlPFRlbXBsYXRlW10+fVxyXG4gKi9cclxudmFyIGdldFdpdGhSZWRpcmVjdFRvID0gZnVuY3Rpb24odGVtcGxhdGVzKSB7XHJcblx0dmFyIHRlbXBsYXRlc0FycmF5ID0gQXJyYXkuaXNBcnJheSh0ZW1wbGF0ZXMpID8gdGVtcGxhdGVzIDogW3RlbXBsYXRlc107XHJcblx0aWYgKHRlbXBsYXRlc0FycmF5Lmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlKFtdKTtcclxuXHR9XHJcblxyXG5cdHJldHVybiBBUEkuZ2V0KHtcclxuXHRcdFwiYWN0aW9uXCI6IFwicXVlcnlcIixcclxuXHRcdFwiZm9ybWF0XCI6IFwianNvblwiLFxyXG5cdFx0XCJ0aXRsZXNcIjogZmlsdGVyQW5kTWFwKHRlbXBsYXRlc0FycmF5LFxyXG5cdFx0XHR0ZW1wbGF0ZSA9PiB0ZW1wbGF0ZS5nZXRUaXRsZSgpICE9PSBudWxsLFxyXG5cdFx0XHR0ZW1wbGF0ZSA9PiB0ZW1wbGF0ZS5nZXRUaXRsZSgpLmdldFByZWZpeGVkVGV4dCgpXHJcblx0XHQpLFxyXG5cdFx0XCJyZWRpcmVjdHNcIjogMVxyXG5cdH0pLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XHJcblx0XHRpZiAoICFyZXN1bHQgfHwgIXJlc3VsdC5xdWVyeSApIHtcclxuXHRcdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZWplY3QoXCJFbXB0eSByZXNwb25zZVwiKTtcclxuXHRcdH1cclxuXHRcdGlmICggcmVzdWx0LnF1ZXJ5LnJlZGlyZWN0cyApIHtcclxuXHRcdFx0cmVzdWx0LnF1ZXJ5LnJlZGlyZWN0cy5mb3JFYWNoKGZ1bmN0aW9uKHJlZGlyZWN0KSB7XHJcblx0XHRcdFx0dmFyIGkgPSB0ZW1wbGF0ZXNBcnJheS5maW5kSW5kZXgodGVtcGxhdGUgPT4ge1xyXG5cdFx0XHRcdFx0bGV0IHRpdGxlID0gdGVtcGxhdGUuZ2V0VGl0bGUoKTtcclxuXHRcdFx0XHRcdHJldHVybiB0aXRsZSAmJiB0aXRsZS5nZXRQcmVmaXhlZFRleHQoKSA9PT0gcmVkaXJlY3QuZnJvbTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0XHRpZiAoaSAhPT0gLTEpIHtcclxuXHRcdFx0XHRcdHRlbXBsYXRlc0FycmF5W2ldLnJlZGlyZWN0VGFyZ2V0ID0gbXcuVGl0bGUubmV3RnJvbVRleHQocmVkaXJlY3QudG8pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gQXJyYXkuaXNBcnJheSh0ZW1wbGF0ZXMpID8gdGVtcGxhdGVzQXJyYXkgOiB0ZW1wbGF0ZXNBcnJheVswXTtcclxuXHR9KTtcclxufTtcclxuXHJcblRlbXBsYXRlLnByb3RvdHlwZS5nZXREYXRhRm9yUGFyYW0gPSBmdW5jdGlvbihrZXksIHBhcmFOYW1lKSB7XHJcblx0aWYgKCAhdGhpcy5wYXJhbURhdGEgKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0Ly8gSWYgYWxpYXMsIHN3aXRjaCBmcm9tIGFsaWFzIHRvIHByZWZlcnJlZCBwYXJhbWV0ZXIgbmFtZVxyXG5cdHZhciBwYXJhID0gdGhpcy5wYXJhbUFsaWFzZXNbcGFyYU5hbWVdIHx8IHBhcmFOYW1lO1x0XHJcblx0aWYgKCAhdGhpcy5wYXJhbURhdGFbcGFyYV0gKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdFxyXG5cdHZhciBkYXRhID0gdGhpcy5wYXJhbURhdGFbcGFyYV1ba2V5XTtcclxuXHQvLyBEYXRhIG1pZ2h0IGFjdHVhbGx5IGJlIGFuIG9iamVjdCB3aXRoIGtleSBcImVuXCJcclxuXHRpZiAoIGRhdGEgJiYgZGF0YS5lbiAmJiAhQXJyYXkuaXNBcnJheShkYXRhKSApIHtcclxuXHRcdHJldHVybiBkYXRhLmVuO1xyXG5cdH1cclxuXHRyZXR1cm4gZGF0YTtcclxufTtcclxuXHJcblRlbXBsYXRlLnByb3RvdHlwZS5pc1NoZWxsVGVtcGxhdGUgPSBmdW5jdGlvbigpIHtcclxuXHR2YXIgbWFpblRleHQgPSB0aGlzLnJlZGlyZWN0VGFyZ2V0XHJcblx0XHQ/IHRoaXMucmVkaXJlY3RUYXJnZXQuZ2V0TWFpblRleHQoKVxyXG5cdFx0OiB0aGlzLmdldFRpdGxlKCkuZ2V0TWFpblRleHQoKTtcclxuXHRyZXR1cm4gY29uZmlnLnNoZWxsVGVtcGxhdGVzLmluY2x1ZGVzKG1haW5UZXh0KTtcclxufTtcclxuXHJcblRlbXBsYXRlLnByb3RvdHlwZS5zZXRQYXJhbURhdGFBbmRTdWdnZXN0aW9ucyA9IGZ1bmN0aW9uKCkge1xyXG5cdHZhciBzZWxmID0gdGhpcztcclxuXHR2YXIgcGFyYW1EYXRhU2V0ID0gJC5EZWZlcnJlZCgpO1xyXG5cdFxyXG5cdGlmICggc2VsZi5wYXJhbURhdGEgKSB7IHJldHVybiBwYXJhbURhdGFTZXQucmVzb2x2ZSgpOyB9XHJcbiAgICBcclxuXHR2YXIgcHJlZml4ZWRUZXh0ID0gc2VsZi5yZWRpcmVjdFRhcmdldFxyXG5cdFx0PyBzZWxmLnJlZGlyZWN0VGFyZ2V0LmdldFByZWZpeGVkVGV4dCgpXHJcblx0XHQ6IHNlbGYuZ2V0VGl0bGUoKS5nZXRQcmVmaXhlZFRleHQoKTtcclxuXHJcblx0dmFyIGNhY2hlZEluZm8gPSBjYWNoZS5yZWFkKHByZWZpeGVkVGV4dCArIFwiLXBhcmFtc1wiKTtcclxuXHRcclxuXHRpZiAoXHJcblx0XHRjYWNoZWRJbmZvICYmXHJcblx0XHRjYWNoZWRJbmZvLnZhbHVlICYmXHJcblx0XHRjYWNoZWRJbmZvLnN0YWxlRGF0ZSAmJlxyXG5cdFx0Y2FjaGVkSW5mby52YWx1ZS5wYXJhbURhdGEgIT0gbnVsbCAmJlxyXG5cdFx0Y2FjaGVkSW5mby52YWx1ZS5wYXJhbWV0ZXJTdWdnZXN0aW9ucyAhPSBudWxsICYmXHJcblx0XHRjYWNoZWRJbmZvLnZhbHVlLnBhcmFtQWxpYXNlcyAhPSBudWxsXHJcblx0KSB7XHJcblx0XHRzZWxmLm5vdGVtcGxhdGVkYXRhID0gY2FjaGVkSW5mby52YWx1ZS5ub3RlbXBsYXRlZGF0YTtcclxuXHRcdHNlbGYucGFyYW1EYXRhID0gY2FjaGVkSW5mby52YWx1ZS5wYXJhbURhdGE7XHJcblx0XHRzZWxmLnBhcmFtZXRlclN1Z2dlc3Rpb25zID0gY2FjaGVkSW5mby52YWx1ZS5wYXJhbWV0ZXJTdWdnZXN0aW9ucztcclxuXHRcdHNlbGYucGFyYW1BbGlhc2VzID0gY2FjaGVkSW5mby52YWx1ZS5wYXJhbUFsaWFzZXM7XHJcblx0XHRcclxuXHRcdHBhcmFtRGF0YVNldC5yZXNvbHZlKCk7XHJcblx0XHRpZiAoICFpc0FmdGVyRGF0ZShjYWNoZWRJbmZvLnN0YWxlRGF0ZSkgKSB7XHJcblx0XHRcdC8vIEp1c3QgdXNlIHRoZSBjYWNoZWQgZGF0YVxyXG5cdFx0XHRyZXR1cm4gcGFyYW1EYXRhU2V0O1xyXG5cdFx0fSAvLyBlbHNlOiBVc2UgdGhlIGNhY2hlIGRhdGEgZm9yIG5vdywgYnV0IGFsc28gZmV0Y2ggbmV3IGRhdGEgZnJvbSBBUElcclxuXHR9XHJcblx0XHJcblx0QVBJLmdldCh7XHJcblx0XHRhY3Rpb246IFwidGVtcGxhdGVkYXRhXCIsXHJcblx0XHR0aXRsZXM6IHByZWZpeGVkVGV4dCxcclxuXHRcdHJlZGlyZWN0czogMSxcclxuXHRcdGluY2x1ZGVNaXNzaW5nVGl0bGVzOiAxXHJcblx0fSlcclxuXHRcdC50aGVuKFxyXG5cdFx0XHRmdW5jdGlvbihyZXNwb25zZSkgeyByZXR1cm4gcmVzcG9uc2U7IH0sXHJcblx0XHRcdGZ1bmN0aW9uKC8qZXJyb3IqLykgeyByZXR1cm4gbnVsbDsgfSAvLyBJZ25vcmUgZXJyb3JzLCB3aWxsIHVzZSBkZWZhdWx0IGRhdGFcclxuXHRcdClcclxuXHRcdC50aGVuKCBmdW5jdGlvbihyZXN1bHQpIHtcclxuXHRcdC8vIEZpZ3VyZSBvdXQgcGFnZSBpZCAoYmVhY3VzZSBhY3Rpb249dGVtcGxhdGVkYXRhIGRvZXNuJ3QgaGF2ZSBhbiBpbmRleHBhZ2VpZHMgb3B0aW9uKVxyXG5cdFx0XHR2YXIgaWQgPSByZXN1bHQgJiYgJC5tYXAocmVzdWx0LnBhZ2VzLCBmdW5jdGlvbiggX3ZhbHVlLCBrZXkgKSB7IHJldHVybiBrZXk7IH0pO1xyXG5cdFx0XHJcblx0XHRcdGlmICggIXJlc3VsdCB8fCAhcmVzdWx0LnBhZ2VzW2lkXSB8fCByZXN1bHQucGFnZXNbaWRdLm5vdGVtcGxhdGVkYXRhIHx8ICFyZXN1bHQucGFnZXNbaWRdLnBhcmFtcyApIHtcclxuXHRcdFx0Ly8gTm8gVGVtcGxhdGVEYXRhLCBzbyB1c2UgZGVmYXVsdHMgKGd1ZXNzZXMpXHJcblx0XHRcdFx0c2VsZi5ub3RlbXBsYXRlZGF0YSA9IHRydWU7XHJcblx0XHRcdFx0c2VsZi50ZW1wbGF0ZWRhdGFBcGlFcnJvciA9ICFyZXN1bHQ7XHJcblx0XHRcdFx0c2VsZi5wYXJhbURhdGEgPSBjb25maWcuZGVmYXVsdFBhcmFtZXRlckRhdGE7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0c2VsZi5wYXJhbURhdGEgPSByZXN1bHQucGFnZXNbaWRdLnBhcmFtcztcclxuXHRcdFx0fVxyXG4gICAgICAgIFxyXG5cdFx0XHRzZWxmLnBhcmFtQWxpYXNlcyA9IHt9O1xyXG5cdFx0XHQkLmVhY2goc2VsZi5wYXJhbURhdGEsIGZ1bmN0aW9uKHBhcmFOYW1lLCBwYXJhRGF0YSkge1xyXG5cdFx0XHRcdC8vIEV4dHJhY3QgYWxpYXNlcyBmb3IgZWFzaWVyIHJlZmVyZW5jZSBsYXRlciBvblxyXG5cdFx0XHRcdGlmICggcGFyYURhdGEuYWxpYXNlcyAmJiBwYXJhRGF0YS5hbGlhc2VzLmxlbmd0aCApIHtcclxuXHRcdFx0XHRcdHBhcmFEYXRhLmFsaWFzZXMuZm9yRWFjaChmdW5jdGlvbihhbGlhcyl7XHJcblx0XHRcdFx0XHRcdHNlbGYucGFyYW1BbGlhc2VzW2FsaWFzXSA9IHBhcmFOYW1lO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdC8vIEV4dHJhY3QgYWxsb3dlZCB2YWx1ZXMgYXJyYXkgZnJvbSBkZXNjcmlwdGlvblxyXG5cdFx0XHRcdGlmICggcGFyYURhdGEuZGVzY3JpcHRpb24gJiYgL1xcWy4qJy4rPycuKj9cXF0vLnRlc3QocGFyYURhdGEuZGVzY3JpcHRpb24uZW4pICkge1xyXG5cdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0dmFyIGFsbG93ZWRWYWxzID0gSlNPTi5wYXJzZShcclxuXHRcdFx0XHRcdFx0XHRwYXJhRGF0YS5kZXNjcmlwdGlvbi5lblxyXG5cdFx0XHRcdFx0XHRcdFx0LnJlcGxhY2UoL14uKlxcWy8sXCJbXCIpXHJcblx0XHRcdFx0XHRcdFx0XHQucmVwbGFjZSgvXCIvZywgXCJcXFxcXFxcIlwiKVxyXG5cdFx0XHRcdFx0XHRcdFx0LnJlcGxhY2UoLycvZywgXCJcXFwiXCIpXHJcblx0XHRcdFx0XHRcdFx0XHQucmVwbGFjZSgvLFxccypdLywgXCJdXCIpXHJcblx0XHRcdFx0XHRcdFx0XHQucmVwbGFjZSgvXS4qJC8sIFwiXVwiKVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRzZWxmLnBhcmFtRGF0YVtwYXJhTmFtZV0uYWxsb3dlZFZhbHVlcyA9IGFsbG93ZWRWYWxzO1xyXG5cdFx0XHRcdFx0fSBjYXRjaChlKSB7XHJcblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybihcIltSYXRlcl0gQ291bGQgbm90IHBhcnNlIGFsbG93ZWQgdmFsdWVzIGluIGRlc2NyaXB0aW9uOlxcbiAgXCIrXHJcblx0XHRcdFx0XHRwYXJhRGF0YS5kZXNjcmlwdGlvbi5lbiArIFwiXFxuIENoZWNrIFRlbXBsYXRlRGF0YSBmb3IgcGFyYW1ldGVyIHxcIiArIHBhcmFOYW1lICtcclxuXHRcdFx0XHRcdFwiPSBpbiBcIiArIHNlbGYuZ2V0VGl0bGUoKS5nZXRQcmVmaXhlZFRleHQoKSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdFxyXG5cdFx0XHQvLyBNYWtlIHN1Z2dlc3Rpb25zIGZvciBjb21ib2JveFxyXG5cdFx0XHR2YXIgYWxsUGFyYW1zQXJyYXkgPSAoICFzZWxmLm5vdGVtcGxhdGVkYXRhICYmIHJlc3VsdC5wYWdlc1tpZF0ucGFyYW1PcmRlciApIHx8XHJcblx0XHRcdCQubWFwKHNlbGYucGFyYW1EYXRhLCBmdW5jdGlvbihfdmFsLCBrZXkpe1xyXG5cdFx0XHRcdHJldHVybiBrZXk7XHJcblx0XHRcdH0pO1xyXG5cdFx0XHRzZWxmLnBhcmFtZXRlclN1Z2dlc3Rpb25zID0gYWxsUGFyYW1zQXJyYXkuZmlsdGVyKGZ1bmN0aW9uKHBhcmFtTmFtZSkge1xyXG5cdFx0XHRcdHJldHVybiAoIHBhcmFtTmFtZSAmJiBwYXJhbU5hbWUgIT09IFwiY2xhc3NcIiAmJiBwYXJhbU5hbWUgIT09IFwiaW1wb3J0YW5jZVwiICk7XHJcblx0XHRcdH0pXHJcblx0XHRcdFx0Lm1hcChmdW5jdGlvbihwYXJhbU5hbWUpIHtcclxuXHRcdFx0XHRcdHZhciBvcHRpb25PYmplY3QgPSB7ZGF0YTogcGFyYW1OYW1lfTtcclxuXHRcdFx0XHRcdHZhciBsYWJlbCA9IHNlbGYuZ2V0RGF0YUZvclBhcmFtKGxhYmVsLCBwYXJhbU5hbWUpO1xyXG5cdFx0XHRcdFx0aWYgKCBsYWJlbCApIHtcclxuXHRcdFx0XHRcdFx0b3B0aW9uT2JqZWN0LmxhYmVsID0gbGFiZWwgKyBcIiAofFwiICsgcGFyYW1OYW1lICsgXCI9KVwiO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmV0dXJuIG9wdGlvbk9iamVjdDtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFxyXG5cdFx0XHRpZiAoIHNlbGYudGVtcGxhdGVkYXRhQXBpRXJyb3IgKSB7XHJcblx0XHRcdFx0Ly8gRG9uJ3Qgc2F2ZSBkZWZhdWx0cy9ndWVzc2VzIHRvIGNhY2hlO1xyXG5cdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHR9XHJcblx0XHRcclxuXHRcdFx0Y2FjaGUud3JpdGUocHJlZml4ZWRUZXh0ICsgXCItcGFyYW1zXCIsIHtcclxuXHRcdFx0XHRub3RlbXBsYXRlZGF0YTogc2VsZi5ub3RlbXBsYXRlZGF0YSxcclxuXHRcdFx0XHRwYXJhbURhdGE6IHNlbGYucGFyYW1EYXRhLFxyXG5cdFx0XHRcdHBhcmFtZXRlclN1Z2dlc3Rpb25zOiBzZWxmLnBhcmFtZXRlclN1Z2dlc3Rpb25zLFxyXG5cdFx0XHRcdHBhcmFtQWxpYXNlczogc2VsZi5wYXJhbUFsaWFzZXNcclxuXHRcdFx0fSxcdDFcclxuXHRcdFx0KTtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9KVxyXG5cdFx0LnRoZW4oXHJcblx0XHRcdHBhcmFtRGF0YVNldC5yZXNvbHZlLFxyXG5cdFx0XHRwYXJhbURhdGFTZXQucmVqZWN0XHJcblx0XHQpO1xyXG5cdFxyXG5cdHJldHVybiBwYXJhbURhdGFTZXQ7XHRcclxufTtcclxuXHJcbnZhciBtYWtlTGlzdEFzID0gZnVuY3Rpb24oc3ViamVjdFRpdGxlKSB7XHJcblx0dmFyIG5hbWUgPSBzdWJqZWN0VGl0bGUuZ2V0TWFpblRleHQoKS5yZXBsYWNlKC9cXHNcXCguKlxcKS8sIFwiXCIpO1xyXG5cdGlmICggbmFtZS5pbmRleE9mKFwiIFwiKSA9PT0gLTEgKSB7XHJcblx0XHRyZXR1cm4gbmFtZTtcclxuXHR9XHJcblx0dmFyIGdlbmVyYXRpb25hbFN1ZmZpeCA9IFwiXCI7XHJcblx0aWYgKCAvICg/OltKU11yLj98W0lWWF0rKSQvLnRlc3QobmFtZSkgKSB7XHJcblx0XHRnZW5lcmF0aW9uYWxTdWZmaXggPSBuYW1lLnNsaWNlKG5hbWUubGFzdEluZGV4T2YoXCIgXCIpKTtcclxuXHRcdG5hbWUgPSBuYW1lLnNsaWNlKDAsIG5hbWUubGFzdEluZGV4T2YoXCIgXCIpKTtcclxuXHRcdGlmICggbmFtZS5pbmRleE9mKFwiIFwiKSA9PT0gLTEgKSB7XHJcblx0XHRcdHJldHVybiBuYW1lICsgZ2VuZXJhdGlvbmFsU3VmZml4O1xyXG5cdFx0fVxyXG5cdH1cclxuXHR2YXIgbGFzdE5hbWUgPSBuYW1lLnNsaWNlKG5hbWUubGFzdEluZGV4T2YoXCIgXCIpKzEpLnJlcGxhY2UoLywkLywgXCJcIik7XHJcblx0dmFyIG90aGVyTmFtZXMgPSBuYW1lLnNsaWNlKDAsIG5hbWUubGFzdEluZGV4T2YoXCIgXCIpKTtcclxuXHRyZXR1cm4gbGFzdE5hbWUgKyBcIiwgXCIgKyBvdGhlck5hbWVzICsgZ2VuZXJhdGlvbmFsU3VmZml4O1xyXG59O1xyXG5cclxuVGVtcGxhdGUucHJvdG90eXBlLmFkZE1pc3NpbmdQYXJhbXMgPSBmdW5jdGlvbigpIHtcclxuXHR2YXIgdGhpc1RlbXBsYXRlID0gdGhpcztcclxuXHJcblx0Ly8gQXV0b2ZpbGwgbGlzdGFzIHBhcmFtZXRlciBmb3IgV1A6QklPXHJcblx0dmFyIGlzQmlvZ3JhcGh5QmFubmVyID0gdGhpcy5nZXRUaXRsZSgpLmdldE1haW5UZXh0KCkgPT09IFwiV2lraVByb2plY3QgQmlvZ3JhcGh5XCIgfHxcclxuXHRcdCh0aGlzLnJlZGlyZWN0VGFyZ2V0ICYmIHRoaXMucmVkaXJlY3RUYXJnZXQuZ2V0TWFpblRleHQoKSA9PT0gXCJXaWtpUHJvamVjdCBCaW9ncmFwaHlcIik7XHJcblxyXG5cdGlmIChpc0Jpb2dyYXBoeUJhbm5lciAmJiAhdGhpcy5nZXRQYXJhbShcImxpc3Rhc1wiKSkge1xyXG5cdFx0dmFyIHN1YmplY3RUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KGNvbmZpZy5tdy53Z1BhZ2VOYW1lKS5nZXRTdWJqZWN0UGFnZSgpO1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzLnB1c2goe1xyXG5cdFx0XHRuYW1lOiBcImxpc3Rhc1wiLFxyXG5cdFx0XHR2YWx1ZTogbWFrZUxpc3RBcyhzdWJqZWN0VGl0bGUpLFxyXG5cdFx0XHRhdXRvZmlsbGVkOiB0cnVlLFxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvLyBNYWtlIHN1cmUgcmVxdWlyZWQvc3VnZ2VzdGVkIHBhcmFtZXRlcnMgYXJlIHByZXNlbnRcclxuXHQkLmVhY2godGhpc1RlbXBsYXRlLnBhcmFtRGF0YSwgZnVuY3Rpb24ocGFyYU5hbWUsIHBhcmFEYXRhKSB7XHJcblx0XHRpZiAoIChwYXJhRGF0YS5yZXF1aXJlZCB8fCBwYXJhRGF0YS5zdWdnZXN0ZWQpICYmICF0aGlzVGVtcGxhdGUuZ2V0UGFyYW0ocGFyYU5hbWUpICkge1xyXG5cdFx0XHQvLyBDaGVjayBpZiBhbHJlYWR5IHByZXNlbnQgaW4gYW4gYWxpYXMsIGlmIGFueVxyXG5cdFx0XHRpZiAoIHBhcmFEYXRhLmFsaWFzZXMubGVuZ3RoICkge1xyXG5cdFx0XHRcdHZhciBhbGlhc2VzID0gdGhpc1RlbXBsYXRlLnBhcmFtZXRlcnMuZmlsdGVyKHAgPT4ge1xyXG5cdFx0XHRcdFx0dmFyIGlzQWxpYXMgPSBwYXJhRGF0YS5hbGlhc2VzLmluY2x1ZGVzKHAubmFtZSk7XHJcblx0XHRcdFx0XHR2YXIgaXNFbXB0eSA9ICFwLnZhbHVlO1xyXG5cdFx0XHRcdFx0cmV0dXJuIGlzQWxpYXMgJiYgIWlzRW1wdHk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0aWYgKCBhbGlhc2VzLmxlbmd0aCApIHtcclxuXHRcdFx0XHQvLyBBdCBsZWFzdCBvbmUgbm9uLWVtcHR5IGFsaWFzLCBzbyBkbyBub3RoaW5nXHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdC8vIE5vIG5vbi1lbXB0eSBhbGlhc2VzLCBzbyBhZGQgdGhpcyB0byB0aGUgcGFyYW1ldGVycyBsaXN0ICh3aXRoXHJcblx0XHRcdC8vIHZhbHVlIHNldCBwYXJhbWV0ZXIgdG8gZWl0aGVyIHRoZSBhdXRvdmF1bGUsIG9yIGFzIG51bGwpLlxyXG5cdFx0XHQvLyBBbHNvIHNldCB0aGF0IGl0IHdhcyBhdXRvZmlsbGVkLlxyXG5cdFx0XHR0aGlzVGVtcGxhdGUucGFyYW1ldGVycy5wdXNoKHtcclxuXHRcdFx0XHRuYW1lOnBhcmFOYW1lLFxyXG5cdFx0XHRcdHZhbHVlOiBwYXJhRGF0YS5hdXRvdmFsdWUgfHwgbnVsbCxcclxuXHRcdFx0XHRhdXRvZmlsbGVkOiB0cnVlLFxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHR9KTtcclxuXHJcblx0cmV0dXJuIHRoaXNUZW1wbGF0ZTtcclxufTtcclxuXHJcblRlbXBsYXRlLnByb3RvdHlwZS5zZXRDbGFzc2VzQW5kSW1wb3J0YW5jZXMgPSBmdW5jdGlvbigpIHtcclxuXHR2YXIgcGFyc2VkID0gJC5EZWZlcnJlZCgpO1xyXG5cclxuXHQvLyBEb24ndCByZS1wYXJzZSBpZiBhbHJlYWR5IHBhcnNlZDsgbm8gbmVlZCB0byBwYXJzZSBzaGVsbCB0ZW1wbGF0ZXMgb3IgYmFubmVycyB3aXRob3V0IHJhdGluZ3NcclxuXHRpZiAoIHRoaXMuaXNTaGVsbFRlbXBsYXRlKCkgKSB7XHJcblx0XHR0aGlzLmNsYXNzZXMgPSBbLi4uY29uZmlnLmJhbm5lckRlZmF1bHRzLmNsYXNzZXNdO1xyXG5cdFx0cmV0dXJuIHBhcnNlZC5yZXNvbHZlKCk7XHJcblx0fSBlbHNlIGlmICggKHRoaXMuY2xhc3NlcyAmJiB0aGlzLmltcG9ydGFuY2VzKSB8fCB0aGlzLndpdGhvdXRSYXRpbmdzICkge1xyXG5cdFx0cmV0dXJuIHBhcnNlZC5yZXNvbHZlKCk7XHJcblx0fSBcclxuXHJcblx0dmFyIG1haW5UZXh0ID0gdGhpcy5nZXRUaXRsZSgpLmdldE1haW5UZXh0KCk7XHJcblxyXG5cdC8vIFNvbWUgcHJvamVjdHMgaGF2ZSBoYXJkY29kZWQgdmFsdWVzLCB0byBhdm9pZCBzdGFuZGFyZCBjbGFzc2VzIG9yIHRvIHByZXZlbnQgQVBJIGlzc3VlcyAodGltZW91dCBhbmQvb3Igbm9kZSBjb3VudCBleGNlZWRlZClcclxuXHRjb25zdCByZWRpcmVjdFRhcmdldE9yTWFpblRleHQgPSB0aGlzLnJlZGlyZWN0VGFyZ2V0ID8gdGhpcy5yZWRpcmVjdFRhcmdldC5nZXRNYWluVGV4dCgpIDogbWFpblRleHQ7XHJcblx0aWYgKCBjb25maWcuY3VzdG9tQmFubmVyc1tyZWRpcmVjdFRhcmdldE9yTWFpblRleHRdICkge1xyXG5cdFx0dGhpcy5jbGFzc2VzID0gY29uZmlnLmN1c3RvbUJhbm5lcnNbcmVkaXJlY3RUYXJnZXRPck1haW5UZXh0XS5jbGFzc2VzO1xyXG5cdFx0dGhpcy5pbXBvcnRhbmNlcyA9IGNvbmZpZy5jdXN0b21CYW5uZXJzW3JlZGlyZWN0VGFyZ2V0T3JNYWluVGV4dF0uaW1wb3J0YW5jZXM7XHJcblx0XHRyZXR1cm4gcGFyc2VkLnJlc29sdmUoKTtcclxuXHR9XHJcblxyXG5cdC8vIE90aGVyd2lzZSB0cnkgcmVhZGluZyBmcm9tIGNhY2hlZCBkYXRhXHJcblx0dmFyIGNhY2hlZFJhdGluZ3MgPSBjYWNoZS5yZWFkKG1haW5UZXh0K1wiLXJhdGluZ3NcIik7XHJcblx0aWYgKFxyXG5cdFx0Y2FjaGVkUmF0aW5ncyAmJlxyXG5cdFx0Y2FjaGVkUmF0aW5ncy52YWx1ZSAmJlxyXG5cdFx0Y2FjaGVkUmF0aW5ncy5zdGFsZURhdGUgJiZcclxuXHRcdGNhY2hlZFJhdGluZ3MudmFsdWUuY2xhc3NlcyE9bnVsbCAmJlxyXG5cdFx0Y2FjaGVkUmF0aW5ncy52YWx1ZS5pbXBvcnRhbmNlcyE9bnVsbFxyXG5cdCkge1xyXG5cdFx0dGhpcy5jbGFzc2VzID0gY2FjaGVkUmF0aW5ncy52YWx1ZS5jbGFzc2VzO1xyXG5cdFx0dGhpcy5pbXBvcnRhbmNlcyA9IGNhY2hlZFJhdGluZ3MudmFsdWUuaW1wb3J0YW5jZXM7XHJcblx0XHRwYXJzZWQucmVzb2x2ZSgpO1xyXG5cdFx0aWYgKCAhaXNBZnRlckRhdGUoY2FjaGVkUmF0aW5ncy5zdGFsZURhdGUpICkge1xyXG5cdFx0XHQvLyBKdXN0IHVzZSB0aGUgY2FjaGVkIGRhdGFcclxuXHRcdFx0cmV0dXJuIHBhcnNlZDtcclxuXHRcdH0gLy8gZWxzZTogVXNlIHRoZSBjYWNoZSBkYXRhIGZvciBub3csIGJ1dCBhbHNvIGZldGNoIG5ldyBkYXRhIGZyb20gQVBJXHJcblx0fVxyXG5cclxuXHR2YXIgd2lraXRleHRUb1BhcnNlID0gXCJcIjtcdFxyXG5cdGNvbmZpZy5iYW5uZXJEZWZhdWx0cy5leHRlbmRlZENsYXNzZXMuZm9yRWFjaChmdW5jdGlvbihjbGFzc25hbWUsIGluZGV4KSB7XHJcblx0XHR3aWtpdGV4dFRvUGFyc2UgKz0gXCJ7e1wiICsgbWFpblRleHQgKyBcInxjbGFzcz1cIiArIGNsYXNzbmFtZSArIFwifGltcG9ydGFuY2U9XCIgK1xyXG5cdFx0KGNvbmZpZy5iYW5uZXJEZWZhdWx0cy5leHRlbmRlZEltcG9ydGFuY2VzW2luZGV4XSB8fCBcIlwiKSArIFwifX0vblwiO1xyXG5cdH0pO1xyXG5cdFxyXG5cdHJldHVybiBBUEkuZ2V0KHtcclxuXHRcdGFjdGlvbjogXCJwYXJzZVwiLFxyXG5cdFx0dGl0bGU6IFwiVGFsazpTYW5kYm94XCIsXHJcblx0XHR0ZXh0OiB3aWtpdGV4dFRvUGFyc2UsXHJcblx0XHRwcm9wOiBcImNhdGVnb3JpZXNodG1sXCJcclxuXHR9KVxyXG5cdFx0LnRoZW4oKHJlc3VsdCkgPT4ge1xyXG5cdFx0XHR2YXIgY2F0c0h0bWwgPSByZXN1bHQucGFyc2UuY2F0ZWdvcmllc2h0bWxbXCIqXCJdO1xyXG5cdFx0XHR2YXIgZXh0ZW5kZWRDbGFzc2VzID0gY29uZmlnLmJhbm5lckRlZmF1bHRzLmV4dGVuZGVkQ2xhc3Nlcy5maWx0ZXIoZnVuY3Rpb24oY2wpIHtcclxuXHRcdFx0XHRyZXR1cm4gY2F0c0h0bWwuaW5kZXhPZihjbCtcIi1DbGFzc1wiKSAhPT0gLTE7XHJcblx0XHRcdH0pO1xyXG5cdFx0XHR0aGlzLmNsYXNzZXMgPSBbLi4uY29uZmlnLmJhbm5lckRlZmF1bHRzLmNsYXNzZXMsIC4uLmV4dGVuZGVkQ2xhc3Nlc107XHJcblx0XHRcdHRoaXMuaW1wb3J0YW5jZXMgPSBjb25maWcuYmFubmVyRGVmYXVsdHMuZXh0ZW5kZWRJbXBvcnRhbmNlcy5maWx0ZXIoZnVuY3Rpb24oaW1wKSB7XHJcblx0XHRcdFx0cmV0dXJuIGNhdHNIdG1sLmluZGV4T2YoaW1wK1wiLWltcG9ydGFuY2VcIikgIT09IC0xO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0Y2FjaGUud3JpdGUobWFpblRleHQrXCItcmF0aW5nc1wiLFxyXG5cdFx0XHRcdHtcclxuXHRcdFx0XHRcdGNsYXNzZXM6IHRoaXMuY2xhc3NlcyxcclxuXHRcdFx0XHRcdGltcG9ydGFuY2VzOiB0aGlzLmltcG9ydGFuY2VzXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHQxXHJcblx0XHRcdCk7XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fSk7XHJcbn07XHJcblxyXG5leHBvcnQge1RlbXBsYXRlLCBwYXJzZVRlbXBsYXRlcywgZ2V0V2l0aFJlZGlyZWN0VG99O1xyXG4vLyA8L25vd2lraT4iLCJpbXBvcnQgY29uZmlnIGZyb20gXCIuLi8uLi9jb25maWdcIjtcclxuaW1wb3J0IEJhbm5lcldpZGdldCBmcm9tIFwiLi9CYW5uZXJXaWRnZXRcIjtcclxuaW1wb3J0IHsgbm9ybWFsaXNlWWVzTm8sIGZpbHRlckFuZE1hcCwgdW5pcXVlQXJyYXkgfSBmcm9tIFwiLi4vLi4vdXRpbFwiO1xyXG5pbXBvcnQgUGFyYW1ldGVyV2lkZ2V0IGZyb20gXCIuL1BhcmFtZXRlcldpZGdldFwiO1xyXG4vLyA8bm93aWtpPlxyXG5cclxudmFyIEJhbm5lckxpc3RXaWRnZXQgPSBmdW5jdGlvbiBCYW5uZXJMaXN0V2lkZ2V0KCBjb25maWcgKSB7XHJcblx0Y29uZmlnID0gY29uZmlnIHx8IHt9O1xyXG5cclxuXHQvLyBDYWxsIHBhcmVudCBjb25zdHJ1Y3RvclxyXG5cdEJhbm5lckxpc3RXaWRnZXQucGFyZW50LmNhbGwoIHRoaXMsIGNvbmZpZyApO1xyXG5cdE9PLnVpLm1peGluLkdyb3VwRWxlbWVudC5jYWxsKCB0aGlzLCB7XHJcblx0XHQkZ3JvdXA6IHRoaXMuJGVsZW1lbnRcclxuXHR9ICk7XHJcblx0dGhpcy4kZWxlbWVudC5hZGRDbGFzcyhcInJhdGVyLWJhbm5lckxpc3RXaWRnZXRcIikuY3NzKHtcInBhZGRpbmdcIjpcIjIwcHggMTBweCAxNnB4IDEwcHhcIn0pO1xyXG5cclxuXHQvLyBQcmVmc1xyXG5cdHRoaXMucHJlZmVyZW5jZXMgPSBjb25maWcucHJlZmVyZW5jZXM7XHJcblx0XHJcblx0dGhpcy5vcmVzQ2xhc3MgPSBjb25maWcub3Jlc0NsYXNzO1xyXG5cdFxyXG5cdHRoaXMuY2hhbmdlZCA9IGZhbHNlO1xyXG5cclxuXHQvLyBFdmVudHNcclxuXHR0aGlzLmFnZ3JlZ2F0ZSgge1wicmVtb3ZlXCI6IFwiYmFubmVyUmVtb3ZlXCJ9ICk7XHJcblx0dGhpcy5jb25uZWN0KCB0aGlzLCB7XCJiYW5uZXJSZW1vdmVcIjogXCJvbkJhbm5lclJlbW92ZVwifSApO1xyXG5cclxuXHR0aGlzLmFnZ3JlZ2F0ZSgge1wiY2hhbmdlZFwiOiBcImJhbm5lckNoYW5nZWRcIn0gKTtcclxuXHR0aGlzLmNvbm5lY3QoIHRoaXMsIHtcImJhbm5lckNoYW5nZWRcIjogXCJzZXRDaGFuZ2VkXCJ9ICk7XHJcblxyXG5cdHRoaXMuYWdncmVnYXRlKCB7XCJiaW9ncmFwaHlCYW5uZXJDaGFuZ2VcIjogXCJiaW9ncmFwaHlCYW5uZXJDaGFuZ2VkXCJ9ICk7XHJcblx0dGhpcy5jb25uZWN0KCB0aGlzLCB7XCJiaW9ncmFwaHlCYW5uZXJDaGFuZ2VkXCI6IFwic3luY1NoZWxsVGVtcGxhdGVXaXRoQmlvZ3JhcGh5QmFubmVyXCJ9ICk7XHJcblxyXG5cdHRoaXMuYWdncmVnYXRlKCB7XCJ1cGRhdGVkU2l6ZVwiOiBcImJhbm5lclVwZGF0ZWRTaXplXCJ9ICk7XHJcblx0dGhpcy5jb25uZWN0KCB0aGlzLCB7XCJiYW5uZXJVcGRhdGVkU2l6ZVwiOiBcIm9uVXBkYXRlZFNpemVcIn0gKTtcclxufTtcclxuXHJcbk9PLmluaGVyaXRDbGFzcyggQmFubmVyTGlzdFdpZGdldCwgT08udWkuV2lkZ2V0ICk7XHJcbk9PLm1peGluQ2xhc3MoIEJhbm5lckxpc3RXaWRnZXQsIE9PLnVpLm1peGluLkdyb3VwRWxlbWVudCApO1xyXG4vKlxyXG5tZXRob2RzIGZyb20gbWl4aW46XHJcbiAtIGFkZEl0ZW1zKCBpdGVtcywgW2luZGV4XSApIDogT08udWkuRWxlbWVudCAgKENIQUlOQUJMRSlcclxuIC0gY2xlYXJJdGVtcyggKSA6IE9PLnVpLkVsZW1lbnQgIChDSEFJTkFCTEUpXHJcbiAtIGZpbmRJdGVtRnJvbURhdGEoIGRhdGEgKSA6IE9PLnVpLkVsZW1lbnR8bnVsbFxyXG4gLSBmaW5kSXRlbXNGcm9tRGF0YSggZGF0YSApIDogT08udWkuRWxlbWVudFtdXHJcbiAtIHJlbW92ZUl0ZW1zKCBpdGVtcyApIDogT08udWkuRWxlbWVudCAgKENIQUlOQUJMRSlcclxuKi9cclxuXHJcbkJhbm5lckxpc3RXaWRnZXQucHJvdG90eXBlLm9uVXBkYXRlZFNpemUgPSBmdW5jdGlvbigpIHtcclxuXHQvLyBFbWl0IGFuIFwidXBkYXRlZFNpemVcIiBldmVudCBzbyB0aGUgcGFyZW50IHdpbmRvdyBjYW4gdXBkYXRlIHNpemUsIGlmIG5lZWRlZFxyXG5cdHRoaXMuZW1pdChcInVwZGF0ZWRTaXplXCIpO1xyXG59O1xyXG5cclxuQmFubmVyTGlzdFdpZGdldC5wcm90b3R5cGUuc2V0Q2hhbmdlZCA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuY2hhbmdlZCA9IHRydWU7XHJcbn07XHJcblxyXG5CYW5uZXJMaXN0V2lkZ2V0LnByb3RvdHlwZS5vbkJhbm5lclJlbW92ZSA9IGZ1bmN0aW9uICggYmFubmVyICkge1xyXG5cdHRoaXMucmVtb3ZlSXRlbXMoW2Jhbm5lcl0pO1xyXG5cdHRoaXMuc2V0Q2hhbmdlZCgpO1xyXG59O1xyXG5cclxuQmFubmVyTGlzdFdpZGdldC5wcm90b3R5cGUuc3luY1NoZWxsVGVtcGxhdGVXaXRoQmlvZ3JhcGh5QmFubmVyID0gZnVuY3Rpb24oIGJpb2dyYXBoeUJhbm5lciApIHtcclxuXHRiaW9ncmFwaHlCYW5uZXIgPSBiaW9ncmFwaHlCYW5uZXIgfHwgdGhpcy5pdGVtcy5maW5kKFxyXG5cdFx0YmFubmVyID0+IGJhbm5lci5tYWluVGV4dCA9PT0gXCJXaWtpUHJvamVjdCBCaW9ncmFwaHlcIiB8fCBiYW5uZXIucmVkaXJlY3RUYXJnZXRNYWluVGV4dCA9PT0gXCJXaWtpUHJvamVjdCBCaW9ncmFwaHlcIlxyXG5cdCk7XHJcblx0aWYgKCFiaW9ncmFwaHlCYW5uZXIpIHJldHVybjtcclxuXHJcblx0Y29uc3QgYmFubmVyU2hlbGxUZW1wbGF0ZSA9IHRoaXMuaXRlbXMuZmluZChcclxuXHRcdGJhbm5lciA9PiBiYW5uZXIubWFpblRleHQgPT09IGNvbmZpZy5zaGVsbFRlbXBsYXRlc1swXSB8fCBiYW5uZXIucmVkaXJlY3RUYXJnZXRNYWluVGV4dCA9PT0gY29uZmlnLnNoZWxsVGVtcGxhdGVzWzBdXHJcblx0KTtcclxuXHRpZiAoIWJhbm5lclNoZWxsVGVtcGxhdGUpIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblxyXG5cdGNvbnN0IHBhcmFtc1RvU3luYyA9IFtcImxpdmluZ1wiLCBcImJscG9cIiwgXCJhY3RpdmVwb2xcIl07XHJcblx0cGFyYW1zVG9TeW5jLmZvckVhY2gocGFyYW1Ub1N5bmMgPT4ge1xyXG5cdFx0Y29uc3QgW2Jpb2dyYXBoeVBhcmFtLCBzaGVsbFBhcmFtXSA9IFtiaW9ncmFwaHlCYW5uZXIsIGJhbm5lclNoZWxsVGVtcGxhdGVdLm1hcChiYW5uZXIgPT5cclxuXHRcdFx0YmFubmVyLnBhcmFtZXRlckxpc3QuZ2V0UGFyYW1ldGVySXRlbXMoKVxyXG5cdFx0XHRcdC5maW5kKHBhcmFtZXRlciA9PlxyXG5cdFx0XHRcdFx0cGFyYW1ldGVyLm5hbWUgPT09IHBhcmFtVG9TeW5jIHx8XHJcblx0XHRcdFx0XHRiYW5uZXIucGFyYW1BbGlhc2VzW3BhcmFtZXRlci5uYW1lXSA9PT0gcGFyYW1Ub1N5bmNcclxuXHRcdFx0XHQpXHJcblx0XHQpO1xyXG5cdFx0aWYgKCFiaW9ncmFwaHlQYXJhbSkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IG5vcm1hbGlzZWRQYXJhbVZhbHVlID0gbm9ybWFsaXNlWWVzTm8oYmlvZ3JhcGh5UGFyYW0udmFsdWUpO1xyXG5cdFx0YmlvZ3JhcGh5UGFyYW0uZGVsZXRlKCk7XHJcblxyXG5cdFx0aWYgKCFzaGVsbFBhcmFtKSB7XHJcblx0XHRcdGNvbnN0IGluZGV4ID0gYmFubmVyU2hlbGxUZW1wbGF0ZS5hZGRQYXJhbWV0ZXJMYXlvdXQuaXNWaXNpYmxlKClcclxuXHRcdFx0XHQ/IC0xIC8vIEluc2VydCBhdCB0aGUgdmVyeSBlbmRcclxuXHRcdFx0XHQ6IGJhbm5lclNoZWxsVGVtcGxhdGUucGFyYW1ldGVyTGlzdC5pdGVtcy5sZW5ndGgtMTsgLy8gSW5zZXJ0IHByaW9yIHRvIHRoZSBcImFkZCBwYXJhbWV0ZXJcIiBidXR0b25cclxuXHRcdFx0YmFubmVyU2hlbGxUZW1wbGF0ZS5wYXJhbWV0ZXJMaXN0LmFkZEl0ZW1zKFtcclxuXHRcdFx0XHRuZXcgUGFyYW1ldGVyV2lkZ2V0KCB7XHJcblx0XHRcdFx0XHRcIm5hbWVcIjogcGFyYW1Ub1N5bmMsXHJcblx0XHRcdFx0XHRcInZhbHVlXCI6IG5vcm1hbGlzZWRQYXJhbVZhbHVlLFxyXG5cdFx0XHRcdFx0XCJhdXRvZmlsbGVkXCI6IHRydWVcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGJhbm5lclNoZWxsVGVtcGxhdGUucGFyYW1EYXRhICYmIGJhbm5lclNoZWxsVGVtcGxhdGUucGFyYW1EYXRhW3BhcmFtVG9TeW5jXVxyXG5cdFx0XHRcdClcclxuXHRcdFx0XSwgaW5kZXgpO1xyXG5cdFx0fSBlbHNlIGlmICghYmlvZ3JhcGh5UGFyYW0uYXV0b2ZpbGxlZCkge1xyXG5cdFx0XHRzaGVsbFBhcmFtLnNldFZhbHVlKCBub3JtYWxpc2VkUGFyYW1WYWx1ZSApO1xyXG5cdFx0XHRzaGVsbFBhcmFtLnNldEF1dG9maWxsZWQoKTtcclxuXHRcdH1cclxuXHR9KTtcclxufTtcclxuXHJcbkJhbm5lckxpc3RXaWRnZXQucHJvdG90eXBlLmFkZFNoZWxsVGVtcGxhdGVJZk5lZWVkZWQgPSBmdW5jdGlvbiAoKSB7XHJcblx0aWYgKFxyXG5cdFx0IXRoaXMuaXRlbXMuc29tZShiYW5uZXIgPT4gYmFubmVyLmlzU2hlbGxUZW1wbGF0ZSlcclxuXHQpIHtcclxuXHRcdEJhbm5lcldpZGdldC5uZXdGcm9tVGVtcGxhdGVOYW1lKFxyXG5cdFx0XHRjb25maWcuc2hlbGxUZW1wbGF0ZXNbMF0sXHJcblx0XHRcdHt3aXRob3V0UmF0aW5nczogdHJ1ZX0sXHJcblx0XHRcdHtwcmVmZXJlbmNlczogdGhpcy5wcmVmZXJlbmNlcywgaXNBcnRpY2xlOiB0aGlzLnBhZ2VJbmZvLmlzQXJ0aWNsZX1cclxuXHRcdCkudGhlbihzaGVsbEJhbm5lcldpZGdldCA9PiB7XHJcblx0XHRcdE9PLnVpLm1peGluLkdyb3VwRWxlbWVudC5wcm90b3R5cGUuYWRkSXRlbXMuY2FsbCggdGhpcywgW3NoZWxsQmFubmVyV2lkZ2V0XSwgMCApO1xyXG5cdFx0XHQvLyBBdXRvZmlsbCByYXRpbmdzIChpZiBhYmxlIHRvKVxyXG5cdFx0XHR0aGlzLmF1dG9maWxsQ2xhc3NSYXRpbmdzKHtmb3JCYW5uZXJTaGVsbDogdHJ1ZX0pO1xyXG5cdFx0XHQvLyBlbWl0IHVwZGF0ZWRTaXplIGV2ZW50IFxyXG5cdFx0XHR0aGlzLm9uVXBkYXRlZFNpemUoKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIHRoaXM7XHJcbn07XHJcblxyXG5cclxuQmFubmVyTGlzdFdpZGdldC5wcm90b3R5cGUuYWRkSXRlbXMgPSBmdW5jdGlvbiAoIGl0ZW1zLCBpbmRleCApIHtcclxuXHJcblx0aWYgKCBpdGVtcy5sZW5ndGggPT09IDAgKSB7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9XHJcblxyXG5cdC8vIENhbGwgbWl4aW4gbWV0aG9kIHRvIGRvIHRoZSBhZGRpbmdcclxuXHRPTy51aS5taXhpbi5Hcm91cEVsZW1lbnQucHJvdG90eXBlLmFkZEl0ZW1zLmNhbGwoIHRoaXMsIGl0ZW1zLCBpbmRleCApO1xyXG5cclxuXHQvLyBBdXRvZmlsbCByYXRpbmdzIChpZiBhYmxlIHRvLCBhbmQgaWYgZW5hYmxlZCBpbiBwcmVmZXJlbmNlcylcclxuXHRpZiAoIXRoaXMuaXRlbXMuc29tZShiYW5uZXIgPT4gYmFubmVyLmlzU2hlbGxUZW1wbGF0ZSkpIHtcclxuXHRcdHRoaXMuYXV0b2ZpbGxDbGFzc1JhdGluZ3MoKTtcclxuXHR9XHJcblx0dGhpcy5hdXRvZmlsbEltcG9ydGFuY2VSYXRpbmdzKCk7XHJcblxyXG5cdC8vIGVtaXQgdXBkYXRlZFNpemUgZXZlbnQgXHJcblx0dGhpcy5vblVwZGF0ZWRTaXplKCk7XHJcblxyXG5cdHJldHVybiB0aGlzO1xyXG59O1xyXG5cclxuQmFubmVyTGlzdFdpZGdldC5wcm90b3R5cGUuYXV0b2ZpbGxDbGFzc1JhdGluZ3MgPSBmdW5jdGlvbihjb25maWcpIHtcclxuXHRjb25maWcgPSBjb25maWcgfHwge307XHJcblx0Ly8gT25seSBhdXRvZmlsbCBpZiBzZXQgaW4gcHJlZmVyZW5jZXNcclxuXHRpZiAoIXRoaXMucHJlZmVyZW5jZXMuYXV0b2ZpbGxDbGFzc0Zyb21PdGhlcnMgJiYgIXRoaXMucHJlZmVyZW5jZXMuYXV0b2ZpbGxDbGFzc0Zyb21PcmVzICYmICFjb25maWcuZm9yQmFubmVyU2hlbGwpIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblx0Ly8gQ2hlY2sgd2hhdCBiYW5uZXJzIGFscmVhZHkgaGF2ZVxyXG5cdGNvbnN0IHVuaXF1ZUNsYXNzUmF0aW5ncyA9IHVuaXF1ZUFycmF5KCBmaWx0ZXJBbmRNYXAoXHJcblx0XHR0aGlzLml0ZW1zLFxyXG5cdFx0YmFubmVyID0+IHtcclxuXHRcdFx0aWYgKGJhbm5lci5pc1NoZWxsVGVtcGxhdGUgfHwgIWJhbm5lci5oYXNDbGFzc1JhdGluZ3MpIHtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHRcdFx0Y29uc3QgY2xhc3NJdGVtID0gYmFubmVyLmNsYXNzRHJvcGRvd24uZ2V0TWVudSgpLmZpbmRTZWxlY3RlZEl0ZW0oKTtcclxuXHRcdFx0cmV0dXJuIGNsYXNzSXRlbSAmJiBjbGFzc0l0ZW0uZ2V0RGF0YSgpO1xyXG5cdFx0fSxcclxuXHRcdGJhbm5lciA9PiBiYW5uZXIuY2xhc3NEcm9wZG93bi5nZXRNZW51KCkuZmluZFNlbGVjdGVkSXRlbSgpLmdldERhdGEoKVxyXG5cdCkpO1xyXG5cdC8vIENhbid0IGF1dG9maWxsIGlmIHRoZXJlIGlzbid0IGVpdGhlciBhIHNpbmdsZSB2YWx1ZSwgb3Igbm8gdmFsdWVcclxuXHRpZiAodW5pcXVlQ2xhc3NSYXRpbmdzLmxlbmd0aCA+IDEpIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblx0Ly8gRGV0ZXJtaW5lIHdoYXQgdG8gYXV0b2ZpbGwgd2l0aFxyXG5cdGxldCBhdXRvQ2xhc3M7XHJcblx0aWYgKHVuaXF1ZUNsYXNzUmF0aW5ncy5sZW5ndGggPT09IDEgJiYgKHRoaXMucHJlZmVyZW5jZXMuYXV0b2ZpbGxDbGFzc0Zyb21PdGhlcnMgfHwgY29uZmlnLmZvckJhbm5lclNoZWxsKSkge1xyXG5cdFx0YXV0b0NsYXNzID0gdW5pcXVlQ2xhc3NSYXRpbmdzWzBdO1xyXG5cdH0gZWxzZSBpZiAodW5pcXVlQ2xhc3NSYXRpbmdzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLnByZWZlcmVuY2VzLmF1dG9maWxsQ2xhc3NGcm9tT3JlcyAmJiB0aGlzLm9yZXNDbGFzcykge1xyXG5cdFx0Ly8gRG9uJ3QgYXV0b2ZpbGwgYWJvdmUgQy1jbGFzc1xyXG5cdFx0c3dpdGNoKHRoaXMub3Jlc0NsYXNzKSB7XHJcblx0XHRjYXNlIFwiU3R1YlwiOiBjYXNlIFwiU3RhcnRcIjogY2FzZSBcIkNcIjogY2FzZSBcIkxpc3RcIjpcclxuXHRcdFx0YXV0b0NsYXNzID0gdGhpcy5vcmVzQ2xhc3M7XHJcblx0XHR9XHJcblx0fSBlbHNlIHtcclxuXHRcdC8vIG5vdGhpbmcgdG8gZG9cclxuXHRcdHJldHVybjtcclxuXHR9XHJcblx0Ly8gRG8gdGhlIGF1dG9maWxsaW5nXHJcblx0dGhpcy5pdGVtcy5mb3JFYWNoKGJhbm5lciA9PiB7XHJcblx0XHRpZiAoIWJhbm5lci5oYXNDbGFzc1JhdGluZ3MgJiYgIWJhbm5lci5pc1NoZWxsVGVtcGxhdGUpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgY2xhc3NJdGVtID0gYmFubmVyLmNsYXNzRHJvcGRvd24uZ2V0TWVudSgpLmZpbmRTZWxlY3RlZEl0ZW0oKTtcclxuXHRcdGlmIChjbGFzc0l0ZW0gJiYgY2xhc3NJdGVtLmdldERhdGEoKSAmJiAhY29uZmlnLmZvckJhbm5lclNoZWxsKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGlmIChjb25maWcuZm9yQmFubmVyU2hlbGwgJiYgIWJhbm5lci5pc1NoZWxsVGVtcGxhdGUgJiYgY2xhc3NJdGVtLmdldERhdGEoKSA9PT0gYXV0b0NsYXNzKSB7XHJcblx0XHRcdGJhbm5lci5jbGFzc0Ryb3Bkb3duLmdldE1lbnUoKS5zZWxlY3RJdGVtQnlEYXRhKG51bGwpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRiYW5uZXIuY2xhc3NEcm9wZG93bi5nZXRNZW51KCkuc2VsZWN0SXRlbUJ5RGF0YShhdXRvQ2xhc3MpO1xyXG5cdFx0YmFubmVyLmNsYXNzRHJvcGRvd24uc2V0QXV0b2ZpbGxlZCh0cnVlKTtcclxuXHR9KTtcclxufTtcclxuXHJcbkJhbm5lckxpc3RXaWRnZXQucHJvdG90eXBlLmF1dG9maWxsSW1wb3J0YW5jZVJhdGluZ3MgPSBmdW5jdGlvbigpIHtcclxuXHRpZiAoIXRoaXMucHJlZmVyZW5jZXMuYXV0b2ZpbGxJbXBvcnRhbmNlKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdGNvbnN0IGlzUmVndWxhckFydGljbGUgPSB0aGlzLnBhZ2VJbmZvICYmIHRoaXMucGFnZUluZm8uaXNBcnRpY2xlICYmICF0aGlzLnBhZ2VJbmZvLnJlZGlyZWN0ICYmICF0aGlzLnBhZ2VJbmZvLmlzRGlzYW1iaWc7XHJcblx0aWYgKCFpc1JlZ3VsYXJBcnRpY2xlKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdC8vIFRPRE86IFNob3VsZCB0cnkgdG8gZmluZCBhIHNtYXJ0ZXIsIGJhbm5lci1zcGVjaWZpYyB3YXkgb2YgZGV0ZXJtaW5pbmcgaW1wb3J0YW5jZS5cclxuXHQvLyBNYXliZSBkbyBzb21ldGhpbmcgd2l0aCAgT1JFUydzIFwiZHJhZnR0b3BpY1wiIG1vZGVsLlxyXG5cdGNvbnN0IGF1dG9JbXBvcnRhbmNlID0gXCJMb3dcIjtcclxuXHR0aGlzLml0ZW1zLmZvckVhY2goYmFubmVyID0+IHtcclxuXHRcdGlmICghYmFubmVyLmhhc0ltcG9ydGFuY2VSYXRpbmdzKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGNvbnN0IGltcG9ydGFuY2VJdGVtID0gYmFubmVyLmltcG9ydGFuY2VEcm9wZG93bi5nZXRNZW51KCkuZmluZFNlbGVjdGVkSXRlbSgpO1xyXG5cdFx0aWYgKGltcG9ydGFuY2VJdGVtICYmIGltcG9ydGFuY2VJdGVtLmdldERhdGEoKSkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRiYW5uZXIuaW1wb3J0YW5jZURyb3Bkb3duLmdldE1lbnUoKS5zZWxlY3RJdGVtQnlEYXRhKGF1dG9JbXBvcnRhbmNlKTtcclxuXHRcdGJhbm5lci5pbXBvcnRhbmNlRHJvcGRvd24uc2V0QXV0b2ZpbGxlZCh0cnVlKTtcclxuXHR9KTtcclxufTtcclxuXHJcbkJhbm5lckxpc3RXaWRnZXQucHJvdG90eXBlLnNldFByZWZlcmVuY2VzID0gZnVuY3Rpb24ocHJlZnMpIHtcclxuXHR0aGlzLnByZWZlcmVuY2VzID0gcHJlZnM7XHJcblx0dGhpcy5pdGVtcy5mb3JFYWNoKGJhbm5lciA9PiBiYW5uZXIuc2V0UHJlZmVyZW5jZXMocHJlZnMpKTtcclxuXHR0aGlzLmF1dG9maWxsQ2xhc3NSYXRpbmdzKCk7XHJcblx0dGhpcy5hdXRvZmlsbEltcG9ydGFuY2VSYXRpbmdzKCk7XHJcbn07XHJcblxyXG5CYW5uZXJMaXN0V2lkZ2V0LnByb3RvdHlwZS5tYWtlV2lraXRleHQgPSBmdW5jdGlvbigpIHtcclxuXHR2YXIgYmFubmVyc1dpa2l0ZXh0ID0gZmlsdGVyQW5kTWFwKFxyXG5cdFx0dGhpcy5pdGVtcyxcclxuXHRcdGJhbm5lciA9PiAhYmFubmVyLmlzU2hlbGxUZW1wbGF0ZSxcclxuXHRcdGJhbm5lciA9PiBiYW5uZXIubWFrZVdpa2l0ZXh0KClcclxuXHQpLmpvaW4oXCJcXG5cIik7XHJcblx0dmFyIHNoZWxsVGVtcGxhdGUgPSB0aGlzLml0ZW1zLmZpbmQoYmFubmVyID0+IGJhbm5lci5pc1NoZWxsVGVtcGxhdGUpO1xyXG5cdGlmICghc2hlbGxUZW1wbGF0ZSkge1xyXG5cdFx0cmV0dXJuIGJhbm5lcnNXaWtpdGV4dDtcclxuXHR9XHJcblx0dmFyIHNoZWxsUGFyYW0xID0gbmV3IFBhcmFtZXRlcldpZGdldCh7XHJcblx0XHRuYW1lOlwiMVwiLFxyXG5cdFx0dmFsdWU6IFwiXFxuXCIgKyBiYW5uZXJzV2lraXRleHQgKyBcIlxcblwiICtcclxuXHRcdFx0KHNoZWxsVGVtcGxhdGUubm9uU3RhbmRhcmRUZW1wbGF0ZXNcdD8gc2hlbGxUZW1wbGF0ZS5ub25TdGFuZGFyZFRlbXBsYXRlcyArIFwiXFxuXCIgOiBcIlwiKVxyXG5cdH0pO1xyXG5cdHNoZWxsVGVtcGxhdGUucGFyYW1ldGVyTGlzdC5hZGRJdGVtcyhbIHNoZWxsUGFyYW0xIF0pO1xyXG5cdHZhciBzaGVsbFdpa2l0ZXh0ID0gc2hlbGxUZW1wbGF0ZS5tYWtlV2lraXRleHQoKTtcclxuXHRzaGVsbFRlbXBsYXRlLnBhcmFtZXRlckxpc3QucmVtb3ZlSXRlbXMoWyBzaGVsbFBhcmFtMSBdKTtcclxuXHRyZXR1cm4gc2hlbGxXaWtpdGV4dDtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJhbm5lckxpc3RXaWRnZXQ7XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCBQYXJhbWV0ZXJMaXN0V2lkZ2V0IGZyb20gXCIuL1BhcmFtZXRlckxpc3RXaWRnZXRcIjtcclxuaW1wb3J0IFBhcmFtZXRlcldpZGdldCBmcm9tIFwiLi9QYXJhbWV0ZXJXaWRnZXRcIjtcclxuaW1wb3J0IERyb3Bkb3duUGFyYW1ldGVyV2lkZ2V0IGZyb20gXCIuL0Ryb3Bkb3duUGFyYW1ldGVyV2lkZ2V0XCI7XHJcbmltcG9ydCBTdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0IGZyb20gXCIuL1N1Z2dlc3Rpb25Mb29rdXBUZXh0SW5wdXRXaWRnZXRcIjtcclxuaW1wb3J0IHsgZmlsdGVyQW5kTWFwLCBjbGFzc01hc2ssIGltcG9ydGFuY2VNYXNrIH0gZnJvbSBcIi4uLy4uL3V0aWxcIjtcclxuaW1wb3J0IHtUZW1wbGF0ZSwgZ2V0V2l0aFJlZGlyZWN0VG99IGZyb20gXCIuLi8uLi9UZW1wbGF0ZVwiO1xyXG5pbXBvcnQgSG9yaXpvbnRhbExheW91dFdpZGdldCBmcm9tIFwiLi9Ib3Jpem9udGFsTGF5b3V0V2lkZ2V0XCI7XHJcbmltcG9ydCBnbG9iYWxDb25maWcgZnJvbSBcIi4uLy4uL2NvbmZpZ1wiO1xyXG4vLyA8bm93aWtpPlxyXG5cclxuZnVuY3Rpb24gQmFubmVyV2lkZ2V0KCB0ZW1wbGF0ZSwgY29uZmlnICkge1xyXG5cdC8vIENvbmZpZ3VyYXRpb24gaW5pdGlhbGl6YXRpb25cclxuXHRjb25maWcgPSBjb25maWcgfHwge307XHJcblx0Ly8gQ2FsbCBwYXJlbnQgY29uc3RydWN0b3JcclxuXHRCYW5uZXJXaWRnZXQuc3VwZXIuY2FsbCggdGhpcywgY29uZmlnICk7XHJcblx0dGhpcy4kb3ZlcmxheSA9IGNvbmZpZy4kb3ZlcmxheTtcclxuXHJcblx0LyogLS0tIFBSRUZTIC0tLSAqL1xyXG5cdHRoaXMucHJlZmVyZW5jZXMgPSBjb25maWcucHJlZmVyZW5jZXM7XHJcblx0XHJcblx0LyogLS0tIFBST1BTIC0tLSAqL1xyXG5cdHRoaXMucGFyYW1EYXRhID0gdGVtcGxhdGUucGFyYW1EYXRhO1xyXG5cdHRoaXMucGFyYW1BbGlhc2VzID0gdGVtcGxhdGUucGFyYW1BbGlhc2VzIHx8IHt9O1xyXG5cdHRoaXMucGFyYW1ldGVyU3VnZ2VzdGlvbnMgPSB0ZW1wbGF0ZS5wYXJhbWV0ZXJTdWdnZXN0aW9ucztcclxuXHR0aGlzLm5hbWUgPSB0ZW1wbGF0ZS5uYW1lO1xyXG5cdHRoaXMud2lraXRleHQgPSB0ZW1wbGF0ZS53aWtpdGV4dDtcclxuXHR0aGlzLnBpcGVTdHlsZSA9IHRlbXBsYXRlLnBpcGVTdHlsZTtcclxuXHR0aGlzLmVxdWFsc1N0eWxlID0gdGVtcGxhdGUuZXF1YWxzU3R5bGU7XHJcblx0dGhpcy5lbmRCcmFjZXNTdHlsZSA9IHRlbXBsYXRlLmVuZEJyYWNlc1N0eWxlO1xyXG5cdHRoaXMubWFpblRleHQgPSB0ZW1wbGF0ZS5nZXRUaXRsZSgpLmdldE1haW5UZXh0KCk7XHJcblx0dGhpcy5yZWRpcmVjdFRhcmdldE1haW5UZXh0ID0gdGVtcGxhdGUucmVkaXJlY3RUYXJnZXQgJiYgdGVtcGxhdGUucmVkaXJlY3RUYXJnZXQuZ2V0TWFpblRleHQoKTtcclxuXHR0aGlzLmlzU2hlbGxUZW1wbGF0ZSA9IHRlbXBsYXRlLmlzU2hlbGxUZW1wbGF0ZSgpO1xyXG5cdHRoaXMuY2hhbmdlZCA9IHRlbXBsYXRlLnBhcmFtZXRlcnMuc29tZShwYXJhbWV0ZXIgPT4gcGFyYW1ldGVyLmF1dG9maWxsZWQpOyAvLyBpbml0aWFsbHkgZmFsc2UsIHVubGVzcyBzb21lIHBhcmFtZXRlcnMgd2VyZSBhdXRvZmlsbGVkXHJcblx0dGhpcy5oYXNDbGFzc1JhdGluZ3MgPSB0ZW1wbGF0ZS5jbGFzc2VzICYmIHRlbXBsYXRlLmNsYXNzZXMubGVuZ3RoO1xyXG5cdHRoaXMuaGFzSW1wb3J0YW5jZVJhdGluZ3MgPSB0ZW1wbGF0ZS5pbXBvcnRhbmNlcyAmJiB0ZW1wbGF0ZS5pbXBvcnRhbmNlcy5sZW5ndGg7XHJcblx0dGhpcy5pbmFjdGl2ZVByb2plY3QgPSB0ZW1wbGF0ZS5pbmFjdGl2ZVByb2plY3Q7XHJcblxyXG5cdC8qIC0tLSBUSVRMRSBBTkQgUkFUSU5HUyAtLS0gKi9cclxuXHJcblx0dGhpcy5yZW1vdmVCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KCB7XHJcblx0XHRpY29uOiBcInRyYXNoXCIsXHJcblx0XHRsYWJlbDogXCJSZW1vdmUgYmFubmVyXCIsXHJcblx0XHR0aXRsZTogXCJSZW1vdmUgYmFubmVyXCIsXHJcblx0XHRmbGFnczogXCJkZXN0cnVjdGl2ZVwiLFxyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8ZGl2IHN0eWxlPVxcXCJ3aWR0aDoxMDAlXFxcIj5cIilcclxuXHR9ICk7XHJcblx0dGhpcy5jbGVhckJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoIHtcclxuXHRcdGljb246IFwiY2FuY2VsXCIsXHJcblx0XHRsYWJlbDogXCJDbGVhciBwYXJhbWV0ZXJzXCIsXHJcblx0XHR0aXRsZTogXCJDbGVhciBwYXJhbWV0ZXJzXCIsXHJcblx0XHRmbGFnczogXCJkZXN0cnVjdGl2ZVwiLFxyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8ZGl2IHN0eWxlPVxcXCJ3aWR0aDoxMDAlXFxcIj5cIilcclxuXHR9ICk7XHJcblx0dGhpcy5yZW1vdmVCdXR0b24uJGVsZW1lbnQuZmluZChcImFcIikuY3NzKFwid2lkdGhcIixcIjEwMCVcIik7XHJcblx0dGhpcy5jbGVhckJ1dHRvbi4kZWxlbWVudC5maW5kKFwiYVwiKS5jc3MoXCJ3aWR0aFwiLFwiMTAwJVwiKTtcclxuXHJcblx0dGhpcy50aXRsZUJ1dHRvbnNHcm91cCA9IG5ldyBPTy51aS5CdXR0b25Hcm91cFdpZGdldCgge1xyXG5cdFx0aXRlbXM6IFsgdGhpcy5yZW1vdmVCdXR0b24sXHR0aGlzLmNsZWFyQnV0dG9uIF0sXHJcblx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSd3aWR0aDoxMDAlOyc+XCIpLFxyXG5cdH0gKTtcclxuXHJcblx0dGhpcy5tYWluTGFiZWxQb3B1cEJ1dHRvbiA9IG5ldyBPTy51aS5Qb3B1cEJ1dHRvbldpZGdldCgge1xyXG5cdFx0bGFiZWw6IGB7eyR7dGVtcGxhdGUuZ2V0VGl0bGUoKS5nZXRNYWluVGV4dCgpfX19JHt0aGlzLmluYWN0aXZlUHJvamVjdCA/IFwiIChpbmFjdGl2ZSlcIiA6IFwiXCJ9YCxcclxuXHRcdCRlbGVtZW50OiAkKFwiPHNwYW4gc3R5bGU9J2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjQ4JTttYXJnaW4tcmlnaHQ6MDtwYWRkaW5nLXJpZ2h0OjhweCc+XCIpLFxyXG5cdFx0JG92ZXJsYXk6IHRoaXMuJG92ZXJsYXksXHJcblx0XHRpbmRpY2F0b3I6XCJkb3duXCIsXHJcblx0XHRmcmFtZWQ6ZmFsc2UsXHJcblx0XHRwb3B1cDoge1xyXG5cdFx0XHQkY29udGVudDogdGhpcy50aXRsZUJ1dHRvbnNHcm91cC4kZWxlbWVudCxcclxuXHRcdFx0d2lkdGg6IDIwMCxcclxuXHRcdFx0cGFkZGVkOiBmYWxzZSxcclxuXHRcdFx0YWxpZ246IFwiZm9yY2UtcmlnaHRcIixcclxuXHRcdFx0YW5jaG9yOiBmYWxzZVxyXG5cdFx0fVxyXG5cdH0gKTtcclxuXHR0aGlzLm1haW5MYWJlbFBvcHVwQnV0dG9uLiRlbGVtZW50XHJcblx0XHQuY2hpbGRyZW4oXCJhXCIpLmZpcnN0KCkuY3NzKHtcImZvbnQtc2l6ZVwiOlwiMTEwJVwifSlcclxuXHRcdC5maW5kKFwic3Bhbi5vby11aS1sYWJlbEVsZW1lbnQtbGFiZWxcIikuY3NzKHtcIndoaXRlLXNwYWNlXCI6XCJub3JtYWxcIn0pO1xyXG5cclxuXHQvLyBSYXRpbmcgZHJvcGRvd25zXHJcblx0aWYgKHRoaXMuaXNTaGVsbFRlbXBsYXRlKSB7XHJcblx0XHR0aGlzLmNsYXNzRHJvcGRvd24gPSBuZXcgRHJvcGRvd25QYXJhbWV0ZXJXaWRnZXQoIHtcclxuXHRcdFx0bGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChcIjxzcGFuIHN0eWxlPVxcXCJjb2xvcjojNzc3XFxcIj5DbGFzczwvc3Bhbj5cIiksXHJcblx0XHRcdG1lbnU6IHtcclxuXHRcdFx0XHRpdGVtczogW1xyXG5cdFx0XHRcdFx0bmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoIHtcclxuXHRcdFx0XHRcdFx0ZGF0YTogbnVsbCxcclxuXHRcdFx0XHRcdFx0bGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChgPHNwYW4gc3R5bGU9XCJjb2xvcjojNzc3XCI+KCR7Y29uZmlnLmlzQXJ0aWNsZSA/IFwibm8gY2xhc3NcIiA6IFwiYXV0by1kZXRlY3RcIn0pPC9zcGFuPmApXHJcblx0XHRcdFx0XHR9ICksXHJcblx0XHRcdFx0XHQuLi5nbG9iYWxDb25maWcuYmFubmVyRGVmYXVsdHMuY2xhc3Nlcy5tYXAoIGNsYXNzbmFtZSA9PlxyXG5cdFx0XHRcdFx0XHRuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCgge1xyXG5cdFx0XHRcdFx0XHRcdGRhdGE6IGNsYXNzbmFtZSxcclxuXHRcdFx0XHRcdFx0XHRsYWJlbDogY2xhc3NuYW1lXHJcblx0XHRcdFx0XHRcdH0gKVxyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHRcdF0sXHJcblx0XHRcdH0sXHJcblx0XHRcdCRvdmVybGF5OiB0aGlzLiRvdmVybGF5LFxyXG5cdFx0fSApO1xyXG5cdFx0dmFyIHNoZWxsQ2xhc3NQYXJhbSA9IHRlbXBsYXRlLnBhcmFtZXRlcnMuZmluZChwYXJhbWV0ZXIgPT4gcGFyYW1ldGVyLm5hbWUgPT09IFwiY2xhc3NcIik7XHJcblx0XHR0aGlzLmNsYXNzRHJvcGRvd24uZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoIHNoZWxsQ2xhc3NQYXJhbSAmJiBjbGFzc01hc2soc2hlbGxDbGFzc1BhcmFtLnZhbHVlKSApO1xyXG5cdH0gZWxzZSBpZiAodGhpcy5oYXNDbGFzc1JhdGluZ3MpIHtcclxuXHRcdHRoaXMuY2xhc3NEcm9wZG93biA9IG5ldyBEcm9wZG93blBhcmFtZXRlcldpZGdldCgge1xyXG5cdFx0XHRsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KFwiPHNwYW4gc3R5bGU9XFxcImNvbG9yOiM3NzdcXFwiPkNsYXNzPC9zcGFuPlwiKSxcclxuXHRcdFx0bWVudToge1xyXG5cdFx0XHRcdGl0ZW1zOiBbXHJcblx0XHRcdFx0XHRuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCgge1xyXG5cdFx0XHRcdFx0XHRkYXRhOiBudWxsLFxyXG5cdFx0XHRcdFx0XHRsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KGA8c3BhbiBzdHlsZT1cImNvbG9yOiM3NzdcIj4oJHtjb25maWcuaXNBcnRpY2xlID8gXCJpbmhlcml0IGZyb20gc2hlbGxcIiA6IFwiYXV0by1kZXRlY3RcIn0pPC9zcGFuPmApXHJcblx0XHRcdFx0XHR9ICksXHJcblx0XHRcdFx0XHQuLi50ZW1wbGF0ZS5jbGFzc2VzLm1hcCggY2xhc3NuYW1lID0+XHJcblx0XHRcdFx0XHRcdG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KCB7XHJcblx0XHRcdFx0XHRcdFx0ZGF0YTogY2xhc3NuYW1lLFxyXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiBjbGFzc25hbWVcclxuXHRcdFx0XHRcdFx0fSApXHJcblx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XSxcclxuXHRcdFx0fSxcclxuXHRcdFx0JG92ZXJsYXk6IHRoaXMuJG92ZXJsYXksXHJcblx0XHR9ICk7XHJcblx0XHR2YXIgY2xhc3NQYXJhbSA9IHRlbXBsYXRlLnBhcmFtZXRlcnMuZmluZChwYXJhbWV0ZXIgPT4gcGFyYW1ldGVyLm5hbWUgPT09IFwiY2xhc3NcIik7XHJcblx0XHR0aGlzLmNsYXNzRHJvcGRvd24uZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoIGNsYXNzUGFyYW0gJiYgY2xhc3NNYXNrKGNsYXNzUGFyYW0udmFsdWUpICk7XHJcblx0fVxyXG5cclxuXHRpZiAodGhpcy5oYXNJbXBvcnRhbmNlUmF0aW5ncykge1xyXG5cdFx0dGhpcy5pbXBvcnRhbmNlRHJvcGRvd24gPSBuZXcgRHJvcGRvd25QYXJhbWV0ZXJXaWRnZXQoIHtcclxuXHRcdFx0bGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChcIjxzcGFuIHN0eWxlPVxcXCJjb2xvcjojNzc3XFxcIj5JbXBvcnRhbmNlPC9zcGFuPlwiKSxcclxuXHRcdFx0bWVudToge1xyXG5cdFx0XHRcdGl0ZW1zOiBbXHJcblx0XHRcdFx0XHRuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCgge1xyXG5cdFx0XHRcdFx0XHRkYXRhOiBudWxsLCBsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KGA8c3BhbiBzdHlsZT1cImNvbG9yOiM3NzdcIj4oJHtjb25maWcuaXNBcnRpY2xlID8gXCJubyBpbXBvcnRhbmNlXCIgOiBcImF1dG8tZGV0ZWN0XCJ9KTwvc3Bhbj5gKVxyXG5cdFx0XHRcdFx0fSApLFxyXG5cdFx0XHRcdFx0Li4udGVtcGxhdGUuaW1wb3J0YW5jZXMubWFwKGltcG9ydGFuY2UgPT5cclxuXHRcdFx0XHRcdFx0bmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoIHtcclxuXHRcdFx0XHRcdFx0XHRkYXRhOiBpbXBvcnRhbmNlLFxyXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiBpbXBvcnRhbmNlXHJcblx0XHRcdFx0XHRcdH0gKVxyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHRcdF1cclxuXHRcdFx0fSxcclxuXHRcdFx0JG92ZXJsYXk6IHRoaXMuJG92ZXJsYXksXHJcblx0XHR9ICk7XHJcblx0XHR2YXIgaW1wb3J0YW5jZVBhcmFtID0gdGVtcGxhdGUucGFyYW1ldGVycy5maW5kKHBhcmFtZXRlciA9PiBwYXJhbWV0ZXIubmFtZSA9PT0gXCJpbXBvcnRhbmNlXCIpO1xyXG5cdFx0dGhpcy5pbXBvcnRhbmNlRHJvcGRvd24uZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoIGltcG9ydGFuY2VQYXJhbSAmJiBpbXBvcnRhbmNlTWFzayhpbXBvcnRhbmNlUGFyYW0udmFsdWUpICk7XHJcblx0fVxyXG5cclxuXHR0aGlzLnRpdGxlTGF5b3V0ID0gbmV3IE9PLnVpLkhvcml6b250YWxMYXlvdXQoIHtcclxuXHRcdGl0ZW1zOiBbIHRoaXMubWFpbkxhYmVsUG9wdXBCdXR0b24gXVxyXG5cdH0gKTtcclxuXHRpZiAodGhpcy5oYXNDbGFzc1JhdGluZ3MgfHwgdGhpcy5pc1NoZWxsVGVtcGxhdGUpIHtcclxuXHRcdHRoaXMudGl0bGVMYXlvdXQuYWRkSXRlbXMoWyB0aGlzLmNsYXNzRHJvcGRvd24gXSk7XHJcblx0fVxyXG5cdGlmICh0aGlzLmhhc0ltcG9ydGFuY2VSYXRpbmdzKSB7XHJcblx0XHR0aGlzLnRpdGxlTGF5b3V0LmFkZEl0ZW1zKFsgdGhpcy5pbXBvcnRhbmNlRHJvcGRvd24gXSk7XHJcblx0fVxyXG5cclxuXHQvKiAtLS0gUEFSQU1FVEVSUyBMSVNUIC0tLSAqL1xyXG5cclxuXHR2YXIgcGFyYW1ldGVyV2lkZ2V0cyA9IGZpbHRlckFuZE1hcChcclxuXHRcdHRlbXBsYXRlLnBhcmFtZXRlcnMsXHJcblx0XHRwYXJhbSA9PiB7XHJcblx0XHRcdGlmICggdGhpcy5pc1NoZWxsVGVtcGxhdGUgKSB7XHJcblx0XHRcdFx0aWYgKHBhcmFtLm5hbWUgPT0gXCIxXCIpIHtcclxuXHRcdFx0XHRcdHRoaXMuc2hlbGxQYXJhbTFWYWx1ZSA9IHBhcmFtLnZhbHVlO1xyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gcGFyYW0ubmFtZSAhPT0gXCJjbGFzc1wiO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBwYXJhbS5uYW1lICE9PSBcImNsYXNzXCIgJiYgcGFyYW0ubmFtZSAhPT0gXCJpbXBvcnRhbmNlXCI7XHJcblx0XHR9LFxyXG5cdFx0cGFyYW0gPT4gbmV3IFBhcmFtZXRlcldpZGdldChwYXJhbSwgdGVtcGxhdGUucGFyYW1EYXRhW3BhcmFtLm5hbWVdLCB7JG92ZXJsYXk6IHRoaXMuJG92ZXJsYXl9KVxyXG5cdCk7XHJcblxyXG5cdHRoaXMucGFyYW1ldGVyTGlzdCA9IG5ldyBQYXJhbWV0ZXJMaXN0V2lkZ2V0KCB7XHJcblx0XHRpdGVtczogcGFyYW1ldGVyV2lkZ2V0cyxcclxuXHRcdHByZWZlcmVuY2VzOiB0aGlzLnByZWZlcmVuY2VzXHJcblx0fSApO1xyXG5cclxuXHQvKiAtLS0gQUREIFBBUkFNRVRFUiBTRUNUSU9OIC0tLSAqL1xyXG5cclxuXHR0aGlzLmFkZFBhcmFtZXRlck5hbWVJbnB1dCA9IG5ldyBTdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0KHtcclxuXHRcdHN1Z2dlc3Rpb25zOiB0ZW1wbGF0ZS5wYXJhbWV0ZXJTdWdnZXN0aW9ucyxcclxuXHRcdHBsYWNlaG9sZGVyOiBcInBhcmFtZXRlciBuYW1lXCIsXHJcblx0XHQkZWxlbWVudDogJChcIjxkaXYgc3R5bGU9J2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjQwJSc+XCIpLFxyXG5cdFx0dmFsaWRhdGU6IGZ1bmN0aW9uKHZhbCkge1xyXG5cdFx0XHRsZXQge3ZhbGlkTmFtZSwgbmFtZSwgdmFsdWV9ID0gdGhpcy5nZXRBZGRQYXJhbWV0ZXJzSW5mbyh2YWwpO1xyXG5cdFx0XHRyZXR1cm4gKCFuYW1lICYmICF2YWx1ZSkgPyB0cnVlIDogdmFsaWROYW1lO1xyXG5cdFx0fS5iaW5kKHRoaXMpLFxyXG5cdFx0YWxsb3dTdWdnZXN0aW9uc1doZW5FbXB0eTogdHJ1ZSxcclxuXHRcdCRvdmVybGF5OiB0aGlzLiRvdmVybGF5XHJcblx0fSk7XHJcblx0dGhpcy51cGRhdGVBZGRQYXJhbWV0ZXJOYW1lU3VnZ2VzdGlvbnMoKTtcclxuXHR0aGlzLmFkZFBhcmFtZXRlclZhbHVlSW5wdXQgPSBuZXcgU3VnZ2VzdGlvbkxvb2t1cFRleHRJbnB1dFdpZGdldCh7XHJcblx0XHRwbGFjZWhvbGRlcjogXCJwYXJhbWV0ZXIgdmFsdWVcIixcclxuXHRcdCRlbGVtZW50OiAkKFwiPGRpdiBzdHlsZT0nZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6NDAlJz5cIiksXHJcblx0XHR2YWxpZGF0ZTogZnVuY3Rpb24odmFsKSB7XHJcblx0XHRcdGxldCB7dmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWV9ID0gdGhpcy5nZXRBZGRQYXJhbWV0ZXJzSW5mbyhudWxsLCB2YWwpO1xyXG5cdFx0XHRyZXR1cm4gKCFuYW1lICYmICF2YWx1ZSkgPyB0cnVlIDogdmFsaWRWYWx1ZTtcclxuXHRcdH0uYmluZCh0aGlzKSxcclxuXHRcdGFsbG93U3VnZ2VzdGlvbnNXaGVuRW1wdHk6IHRydWUsXHJcblx0XHQkb3ZlcmxheTogdGhpcy4kb3ZlcmxheVxyXG5cdH0pO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7XHJcblx0XHRsYWJlbDogXCJBZGRcIixcclxuXHRcdGljb246IFwiYWRkXCIsXHJcblx0XHRmbGFnczogXCJwcm9ncmVzc2l2ZVwiXHJcblx0fSkuc2V0RGlzYWJsZWQodHJ1ZSk7XHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJDb250cm9scyA9IG5ldyBIb3Jpem9udGFsTGF5b3V0V2lkZ2V0KCB7XHJcblx0XHRpdGVtczogW1xyXG5cdFx0XHR0aGlzLmFkZFBhcmFtZXRlck5hbWVJbnB1dCxcclxuXHRcdFx0bmV3IE9PLnVpLkxhYmVsV2lkZ2V0KHtsYWJlbDpcIj1cIn0pLFxyXG5cdFx0XHR0aGlzLmFkZFBhcmFtZXRlclZhbHVlSW5wdXQsXHJcblx0XHRcdHRoaXMuYWRkUGFyYW1ldGVyQnV0dG9uXHJcblx0XHRdXHJcblx0fSApO1xyXG5cclxuXHR0aGlzLmFkZFBhcmFtZXRlckxheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLmFkZFBhcmFtZXRlckNvbnRyb2xzLCB7XHJcblx0XHRsYWJlbDogXCJBZGQgcGFyYW1ldGVyOlwiLFxyXG5cdFx0YWxpZ246IFwidG9wXCJcclxuXHR9KS50b2dnbGUoZmFsc2UpO1xyXG5cdC8vIEEgaGFjayB0byBtYWtlIG1lc3NhZ2VzIGFwcGVhciBvbiB0aGVpciBvd24gbGluZVxyXG5cdHRoaXMuYWRkUGFyYW1ldGVyTGF5b3V0LiRlbGVtZW50LmZpbmQoXCIub28tdWktZmllbGRMYXlvdXQtbWVzc2FnZXNcIikuY3NzKHtcclxuXHRcdFwiY2xlYXJcIjogXCJib3RoXCIsXHJcblx0XHRcInBhZGRpbmctdG9wXCI6IDBcclxuXHR9KTtcclxuXHJcblx0LyogLS0tIE9WRVJBTEwgTEFZT1VUL0RJU1BMQVkgLS0tICovXHJcblxyXG5cdC8vIERpc3BsYXkgdGhlIGxheW91dCBlbGVtZW50cywgYW5kIGEgcnVsZVxyXG5cdHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoXCJyYXRlci1iYW5uZXJXaWRnZXRcIikuYXBwZW5kKFxyXG5cdFx0dGhpcy50aXRsZUxheW91dC4kZWxlbWVudCxcclxuXHRcdHRoaXMucGFyYW1ldGVyTGlzdC4kZWxlbWVudCxcclxuXHRcdHRoaXMuYWRkUGFyYW1ldGVyTGF5b3V0LiRlbGVtZW50XHJcblx0KTtcclxuXHRpZiAoIXRoaXMuaXNTaGVsbFRlbXBsYXRlKSB7XHJcblx0XHR0aGlzLiRlbGVtZW50LmFwcGVuZCggJChcIjxocj5cIikgKTtcclxuXHR9XHJcblxyXG5cdGlmICh0aGlzLmlzU2hlbGxUZW1wbGF0ZSkge1xyXG5cdFx0dGhpcy4kZWxlbWVudC5jc3Moe1xyXG5cdFx0XHRcImJhY2tncm91bmRcIjogXCIjZWVlXCIsXHJcblx0XHRcdFwiYm9yZGVyLXJhZGl1c1wiOiBcIjEwcHhcIixcclxuXHRcdFx0XCJwYWRkaW5nXCI6IFwiMCAxMHB4IDVweFwiLFxyXG5cdFx0XHRcIm1hcmdpbi1ib3R0b21cIjogXCIxMnB4XCIsXHJcblx0XHRcdFwiZm9udC1zaXplXCI6IFwiOTIlXCJcdFx0XHRcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyogLS0tIEVWRU5UIEhBTkRMSU5HIC0tLSAqL1xyXG5cclxuXHRpZiAodGhpcy5oYXNDbGFzc1JhdGluZ3MpIHtcclxuXHRcdHRoaXMuY2xhc3NEcm9wZG93bi5jb25uZWN0KCB0aGlzLCB7XCJjaGFuZ2VcIjogXCJvbkNsYXNzQ2hhbmdlXCIgfSApO1xyXG5cdH1cclxuXHRpZiAodGhpcy5oYXNJbXBvcnRhbmNlUmF0aW5ncykge1xyXG5cdFx0dGhpcy5pbXBvcnRhbmNlRHJvcGRvd24uY29ubmVjdCggdGhpcywge1wiY2hhbmdlXCI6IFwib25JbXBvcnRhbmNlQ2hhbmdlXCIgfSApO1xyXG5cdH1cclxuXHR0aGlzLnBhcmFtZXRlckxpc3QuY29ubmVjdCggdGhpcywge1xyXG5cdFx0XCJjaGFuZ2VcIjogXCJvblBhcmFtZXRlckNoYW5nZVwiLFxyXG5cdFx0XCJhZGRQYXJhbWV0ZXJzQnV0dG9uQ2xpY2tcIjogXCJzaG93QWRkUGFyYW1ldGVySW5wdXRzXCIsXHJcblx0XHRcInVwZGF0ZWRTaXplXCI6IFwib25VcGRhdGVkU2l6ZVwiXHJcblx0fSApO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyQnV0dG9uLmNvbm5lY3QodGhpcywgeyBcImNsaWNrXCI6IFwib25QYXJhbWV0ZXJBZGRcIiB9KTtcclxuXHR0aGlzLmFkZFBhcmFtZXRlck5hbWVJbnB1dC5jb25uZWN0KHRoaXMsIHtcclxuXHRcdFwiY2hhbmdlXCI6IFwib25BZGRQYXJhbWV0ZXJOYW1lQ2hhbmdlXCIsXHJcblx0XHRcImVudGVyXCI6IFwib25BZGRQYXJhbWV0ZXJOYW1lRW50ZXJcIixcclxuXHRcdFwiY2hvb3NlXCI6IFwib25BZGRQYXJhbWV0ZXJOYW1lRW50ZXJcIlxyXG5cdH0pO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyVmFsdWVJbnB1dC5jb25uZWN0KHRoaXMsIHtcclxuXHRcdFwiY2hhbmdlXCI6IFwib25BZGRQYXJhbWV0ZXJWYWx1ZUNoYW5nZVwiLFxyXG5cdFx0XCJlbnRlclwiOiBcIm9uQWRkUGFyYW1ldGVyVmFsdWVFbnRlclwiLFxyXG5cdFx0XCJjaG9vc2VcIjogXCJvbkFkZFBhcmFtZXRlclZhbHVlRW50ZXJcIlxyXG5cdH0pO1xyXG5cdHRoaXMucmVtb3ZlQnV0dG9uLmNvbm5lY3QodGhpcywge1wiY2xpY2tcIjogXCJvblJlbW92ZUJ1dHRvbkNsaWNrXCJ9LCApO1xyXG5cdHRoaXMuY2xlYXJCdXR0b24uY29ubmVjdCggdGhpcywge1wiY2xpY2tcIjogXCJvbkNsZWFyQnV0dG9uQ2xpY2tcIn0gKTtcclxuXHJcblx0LyogLS0tIEFQUExZIFBSRUYgLS0gKi9cclxuXHRpZiAodGhpcy5wcmVmZXJlbmNlcy5ieXBhc3NSZWRpcmVjdHMpIHtcclxuXHRcdHRoaXMuYnlwYXNzUmVkaXJlY3QoKTtcclxuXHR9XHJcblxyXG59XHJcbk9PLmluaGVyaXRDbGFzcyggQmFubmVyV2lkZ2V0LCBPTy51aS5XaWRnZXQgKTtcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gdGVtcGxhdGVOYW1lXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbZGF0YV1cclxuICogQHBhcmFtIHtCb29sZWFufSBkYXRhLndpdGhvdXRSYXRpbmdzXHJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGF0YS5pc1dyYXBwZXJcclxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZ1xyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCYW5uZXJXaWRnZXQ+fVxyXG4gKi9cclxuQmFubmVyV2lkZ2V0Lm5ld0Zyb21UZW1wbGF0ZU5hbWUgPSBmdW5jdGlvbih0ZW1wbGF0ZU5hbWUsIGRhdGEsIGNvbmZpZykge1xyXG5cdHZhciB0ZW1wbGF0ZSA9IG5ldyBUZW1wbGF0ZSgpO1xyXG5cdHRlbXBsYXRlLm5hbWUgPSB0ZW1wbGF0ZU5hbWU7XHJcblx0aWYgKGRhdGEgJiYgZGF0YS53aXRob3V0UmF0aW5ncykge1xyXG5cdFx0dGVtcGxhdGUud2l0aG91dFJhdGluZ3MgPSB0cnVlO1xyXG5cdH1cclxuXHRyZXR1cm4gZ2V0V2l0aFJlZGlyZWN0VG8odGVtcGxhdGUpXHJcblx0XHQudGhlbihmdW5jdGlvbih0ZW1wbGF0ZSkge1xyXG5cdFx0XHRyZXR1cm4gJC53aGVuKFxyXG5cdFx0XHRcdHRlbXBsYXRlLnNldENsYXNzZXNBbmRJbXBvcnRhbmNlcygpLFxyXG5cdFx0XHRcdHRlbXBsYXRlLnNldFBhcmFtRGF0YUFuZFN1Z2dlc3Rpb25zKClcclxuXHRcdFx0KS50aGVuKCgpID0+IHtcclxuXHRcdFx0XHQvLyBBZGQgbWlzc2luZyByZXF1aXJlZC9zdWdnZXN0ZWQgdmFsdWVzXHJcblx0XHRcdFx0dGVtcGxhdGUuYWRkTWlzc2luZ1BhcmFtcygpO1xyXG5cdFx0XHRcdC8vIFJldHVybiB0aGUgbm93LW1vZGlmaWVkIHRlbXBsYXRlXHJcblx0XHRcdFx0cmV0dXJuIHRlbXBsYXRlO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0pXHJcblx0XHQudGhlbih0ZW1wbGF0ZSA9PiBuZXcgQmFubmVyV2lkZ2V0KHRlbXBsYXRlLCBjb25maWcpKTtcclxufTtcclxuXHJcbkJhbm5lcldpZGdldC5wcm90b3R5cGUub25VcGRhdGVkU2l6ZSA9IGZ1bmN0aW9uKCkge1xyXG5cdC8vIEVtaXQgYW4gXCJ1cGRhdGVkU2l6ZVwiIGV2ZW50IHNvIHRoZSBwYXJlbnQgd2luZG93IGNhbiB1cGRhdGUgc2l6ZSwgaWYgbmVlZGVkXHJcblx0dGhpcy5lbWl0KFwidXBkYXRlZFNpemVcIik7XHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLnNldENoYW5nZWQgPSBmdW5jdGlvbigpIHtcclxuXHR0aGlzLmNoYW5nZWQgPSB0cnVlO1xyXG5cdHRoaXMuZW1pdChcImNoYW5nZWRcIik7XHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLm9uUGFyYW1ldGVyQ2hhbmdlID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5zZXRDaGFuZ2VkKCk7XHJcblx0aWYgKHRoaXMubWFpblRleHQgPT09IFwiV2lraVByb2plY3QgQmlvZ3JhcGh5XCIgfHwgdGhpcy5yZWRpcmVjdFRhcmdldE1haW5UZXh0ID09PSBcIldpa2lQcm9qZWN0IEJpb2dyYXBoeVwiKSB7XHJcblx0XHQvLyBFbWl0IGV2ZW50IHNvIEJhbm5lckxpc3RXaWRnZXQgY2FuIHVwZGF0ZSB0aGUgYmFubmVyIHNoZWxsIHRlbXBsYXRlIChpZiBwcmVzZW50KVxyXG5cdFx0dGhpcy5lbWl0KFwiYmlvZ3JhcGh5QmFubmVyQ2hhbmdlXCIpO1x0XHRcclxuXHR9XHJcblx0dGhpcy51cGRhdGVBZGRQYXJhbWV0ZXJOYW1lU3VnZ2VzdGlvbnMoKTtcclxufTtcclxuXHJcbkJhbm5lcldpZGdldC5wcm90b3R5cGUub25DbGFzc0NoYW5nZSA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuc2V0Q2hhbmdlZCgpO1xyXG5cdHRoaXMuY2xhc3NDaGFuZ2VkID0gdHJ1ZTtcclxuXHR2YXIgY2xhc3NJdGVtID0gdGhpcy5jbGFzc0Ryb3Bkb3duLmdldE1lbnUoKS5maW5kU2VsZWN0ZWRJdGVtKCk7XHJcblx0aWYgKGNsYXNzSXRlbSAmJiBjbGFzc0l0ZW0uZ2V0RGF0YSgpID09IG51bGwgKSB7XHJcblx0XHQvLyBjbGVhciBzZWxlY3Rpb25cclxuXHRcdHRoaXMuY2xhc3NEcm9wZG93bi5nZXRNZW51KCkuc2VsZWN0SXRlbSgpO1xyXG5cdH1cclxufTtcclxuXHJcbkJhbm5lcldpZGdldC5wcm90b3R5cGUub25JbXBvcnRhbmNlQ2hhbmdlID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5zZXRDaGFuZ2VkKCk7XHJcblx0dGhpcy5pbXBvcnRhbmNlQ2hhbmdlZCA9IHRydWU7XHJcblx0dmFyIGltcG9ydGFuY2VJdGVtID0gdGhpcy5pbXBvcnRhbmNlRHJvcGRvd24uZ2V0TWVudSgpLmZpbmRTZWxlY3RlZEl0ZW0oKTtcclxuXHRpZiAoaW1wb3J0YW5jZUl0ZW0gJiYgaW1wb3J0YW5jZUl0ZW0uZ2V0RGF0YSgpID09IG51bGwgKSB7XHJcblx0XHQvLyBjbGVhciBzZWxlY3Rpb25cclxuXHRcdHRoaXMuaW1wb3J0YW5jZURyb3Bkb3duLmdldE1lbnUoKS5zZWxlY3RJdGVtKCk7XHJcblx0fVxyXG59O1xyXG5cclxuQmFubmVyV2lkZ2V0LnByb3RvdHlwZS5zaG93QWRkUGFyYW1ldGVySW5wdXRzID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJMYXlvdXQudG9nZ2xlKHRydWUpO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyTmFtZUlucHV0LmZvY3VzKCk7XHJcblx0dGhpcy5vblVwZGF0ZWRTaXplKCk7XHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLmdldEFkZFBhcmFtZXRlcnNJbmZvID0gZnVuY3Rpb24obmFtZUlucHV0VmFsLCB2YWx1ZUlucHV0VmFsKSB7XHJcblx0dmFyIG5hbWUgPSBuYW1lSW5wdXRWYWwgJiYgbmFtZUlucHV0VmFsLnRyaW0oKSB8fCB0aGlzLmFkZFBhcmFtZXRlck5hbWVJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKTtcclxuXHR2YXIgcGFyYW1BbHJlYWR5SW5jbHVkZWQgPSBuYW1lID09PSBcImNsYXNzXCIgfHxcclxuXHRcdG5hbWUgPT09IFwiaW1wb3J0YW5jZVwiIHx8XHJcblx0XHQobmFtZSA9PT0gXCIxXCIgJiYgdGhpcy5pc1NoZWxsVGVtcGxhdGUpIHx8XHJcblx0XHR0aGlzLnBhcmFtZXRlckxpc3QuZ2V0UGFyYW1ldGVySXRlbXMoKS5zb21lKHBhcmFtV2lkZ2V0ID0+IHBhcmFtV2lkZ2V0Lm5hbWUgPT09IG5hbWUpO1xyXG5cdHZhciB2YWx1ZSA9IHZhbHVlSW5wdXRWYWwgJiYgdmFsdWVJbnB1dFZhbC50cmltKCkgfHwgdGhpcy5hZGRQYXJhbWV0ZXJWYWx1ZUlucHV0LmdldFZhbHVlKCkudHJpbSgpO1xyXG5cdHZhciBhdXRvdmFsdWUgPSBuYW1lICYmIHRoaXMucGFyYW1EYXRhW25hbWVdICYmIHRoaXMucGFyYW1EYXRhW25hbWVdLmF1dG92YWx1ZSB8fCBudWxsO1xyXG5cdHJldHVybiB7XHJcblx0XHR2YWxpZE5hbWU6ICEhKG5hbWUgJiYgIXBhcmFtQWxyZWFkeUluY2x1ZGVkKSxcclxuXHRcdHZhbGlkVmFsdWU6ICEhKHZhbHVlIHx8IGF1dG92YWx1ZSksXHJcblx0XHRpc0F1dG92YWx1ZTogISEoIXZhbHVlICYmIGF1dG92YWx1ZSksXHJcblx0XHRpc0FscmVhZHlJbmNsdWRlZDogISEobmFtZSAmJiBwYXJhbUFscmVhZHlJbmNsdWRlZCksXHJcblx0XHRuYW1lLFxyXG5cdFx0dmFsdWUsXHJcblx0XHRhdXRvdmFsdWVcclxuXHR9O1xyXG59O1xyXG5cclxuQmFubmVyV2lkZ2V0LnByb3RvdHlwZS5vbkFkZFBhcmFtZXRlck5hbWVDaGFuZ2UgPSBmdW5jdGlvbigpIHtcclxuXHRsZXQgeyB2YWxpZE5hbWUsIHZhbGlkVmFsdWUsIGlzQXV0b3ZhbHVlLCBpc0FscmVhZHlJbmNsdWRlZCwgbmFtZSwgYXV0b3ZhbHVlIH0gPSB0aGlzLmdldEFkZFBhcmFtZXRlcnNJbmZvKCk7XHJcblx0Ly8gU2V0IHZhbHVlIGlucHV0IHBsYWNlaG9sZGVyIGFzIHRoZSBhdXRvdmFsdWVcclxuXHR0aGlzLmFkZFBhcmFtZXRlclZhbHVlSW5wdXQuJGlucHV0LmF0dHIoIFwicGxhY2Vob2xkZXJcIiwgIGF1dG92YWx1ZSB8fCBcIlwiICk7XHJcblx0Ly8gU2V0IHN1Z2dlc3Rpb25zLCBpZiB0aGUgcGFyYW1ldGVyIGhhcyBhIGxpc3Qgb2YgYWxsb3dlZCB2YWx1ZXNcclxuXHR2YXIgYWxsb3dlZFZhbHVlcyA9IHRoaXMucGFyYW1EYXRhW25hbWVdICYmXHJcblx0XHR0aGlzLnBhcmFtRGF0YVtuYW1lXS5hbGxvd2VkVmFsdWVzICYmIFxyXG5cdFx0dGhpcy5wYXJhbURhdGFbbmFtZV0uYWxsb3dlZFZhbHVlcy5tYXAodmFsID0+IHtyZXR1cm4ge2RhdGE6IHZhbCwgbGFiZWw6dmFsfTsgfSk7XHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJWYWx1ZUlucHV0LnNldFN1Z2dlc3Rpb25zKGFsbG93ZWRWYWx1ZXMgfHwgW10pO1xyXG5cdC8vIFNldCBidXR0b24gZGlzYWJsZWQgc3RhdGUgYmFzZWQgb24gdmFsaWRpdHlcclxuXHR0aGlzLmFkZFBhcmFtZXRlckJ1dHRvbi5zZXREaXNhYmxlZCghdmFsaWROYW1lIHx8ICF2YWxpZFZhbHVlKTtcclxuXHQvLyBTaG93IG5vdGljZSBpZiBhdXRvdmFsdWUgd2lsbCBiZSB1c2VkXHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJMYXlvdXQuc2V0Tm90aWNlcyggdmFsaWROYW1lICYmIGlzQXV0b3ZhbHVlID8gW1wiUGFyYW1ldGVyIHZhbHVlIHdpbGwgYmUgYXV0b2ZpbGxlZFwiXSA6IFtdICk7XHJcblx0Ly8gU2hvdyBlcnJvciBpcyB0aGUgYmFubmVyIGFscmVhZHkgaGFzIHRoZSBwYXJhbWV0ZXIgc2V0XHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJMYXlvdXQuc2V0RXJyb3JzKCBpc0FscmVhZHlJbmNsdWRlZCA/IFtcIlBhcmFtZXRlciBpcyBhbHJlYWR5IHByZXNlbnRcIl0gOiBbXSApO1xyXG59O1xyXG5cclxuQmFubmVyV2lkZ2V0LnByb3RvdHlwZS5vbkFkZFBhcmFtZXRlck5hbWVFbnRlciA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyVmFsdWVJbnB1dC5mb2N1cygpO1xyXG59O1xyXG5cclxuQmFubmVyV2lkZ2V0LnByb3RvdHlwZS5vbkFkZFBhcmFtZXRlclZhbHVlQ2hhbmdlID0gZnVuY3Rpb24oKSB7XHJcblx0bGV0IHsgdmFsaWROYW1lLCB2YWxpZFZhbHVlLCBpc0F1dG92YWx1ZSB9ID0gdGhpcy5nZXRBZGRQYXJhbWV0ZXJzSW5mbygpO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyQnV0dG9uLnNldERpc2FibGVkKCF2YWxpZE5hbWUgfHwgIXZhbGlkVmFsdWUpO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyTGF5b3V0LnNldE5vdGljZXMoIHZhbGlkTmFtZSAmJiBpc0F1dG92YWx1ZSA/IFtcIlBhcmFtZXRlciB2YWx1ZSB3aWxsIGJlIGF1dG9maWxsZWRcIl0gOiBbXSApOyBcclxufTtcclxuXHJcbkJhbm5lcldpZGdldC5wcm90b3R5cGUub25BZGRQYXJhbWV0ZXJWYWx1ZUVudGVyID0gZnVuY3Rpb24oKSB7XHJcblx0Ly8gTWFrZSBzdXJlIGJ1dHRvbiBzdGF0ZSBoYXMgYmVlbiB1cGRhdGVkXHJcblx0dGhpcy5vbkFkZFBhcmFtZXRlclZhbHVlQ2hhbmdlKCk7XHJcblx0Ly8gRG8gbm90aGluZyBpZiBidXR0b24gaXMgZGlzYWJsZWQgKGkuZS4gbmFtZSBhbmQvb3IgdmFsdWUgYXJlIGludmFsaWQpXHJcblx0aWYgKCB0aGlzLmFkZFBhcmFtZXRlckJ1dHRvbi5pc0Rpc2FibGVkKCkgKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdC8vIEFkZCBwYXJhbWV0ZXJcclxuXHR0aGlzLm9uUGFyYW1ldGVyQWRkKCk7XHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLm9uUGFyYW1ldGVyQWRkID0gZnVuY3Rpb24oKSB7XHJcblx0bGV0IHsgdmFsaWROYW1lLCB2YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSwgYXV0b3ZhbHVlIH0gID0gdGhpcy5nZXRBZGRQYXJhbWV0ZXJzSW5mbygpO1xyXG5cdGlmICghdmFsaWROYW1lIHx8ICF2YWxpZFZhbHVlKSB7XHJcblx0XHQvLyBFcnJvciBzaG91bGQgYWxyZWFkeSBiZSBzaG93biB2aWEgb25BZGRQYXJhbWV0ZXIuLi5DaGFuZ2UgbWV0aG9kc1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHR2YXIgbmV3UGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcldpZGdldChcclxuXHRcdHtcclxuXHRcdFx0XCJuYW1lXCI6IG5hbWUsXHJcblx0XHRcdFwidmFsdWVcIjogdmFsdWUgfHwgYXV0b3ZhbHVlXHJcblx0XHR9LFxyXG5cdFx0dGhpcy5wYXJhbURhdGFbbmFtZV0sXHJcblx0XHR7JG92ZXJsYXk6IHRoaXMuJG92ZXJsYXl9XHJcblx0KTtcclxuXHR0aGlzLnBhcmFtZXRlckxpc3QuYWRkSXRlbXMoW25ld1BhcmFtZXRlcl0pO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyTmFtZUlucHV0LnNldFZhbHVlKFwiXCIpO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyVmFsdWVJbnB1dC5zZXRWYWx1ZShcIlwiKTtcclxuXHR0aGlzLmFkZFBhcmFtZXRlck5hbWVJbnB1dC4kaW5wdXQuZm9jdXMoKTtcclxufTtcclxuXHJcbkJhbm5lcldpZGdldC5wcm90b3R5cGUudXBkYXRlQWRkUGFyYW1ldGVyTmFtZVN1Z2dlc3Rpb25zID0gZnVuY3Rpb24oKSB7XHJcblx0bGV0IHBhcmFtc0luVXNlID0ge307XHJcblx0dGhpcy5wYXJhbWV0ZXJMaXN0LmdldFBhcmFtZXRlckl0ZW1zKCkuZm9yRWFjaChcclxuXHRcdHBhcmFtV2lkZ2V0ID0+IHBhcmFtc0luVXNlW3BhcmFtV2lkZ2V0Lm5hbWVdID0gdHJ1ZVxyXG5cdCk7XHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJOYW1lSW5wdXQuc2V0U3VnZ2VzdGlvbnMoXHJcblx0XHR0aGlzLnBhcmFtZXRlclN1Z2dlc3Rpb25zLmZpbHRlcihcclxuXHRcdFx0c3VnZ2VzdGlvbiA9PiAhcGFyYW1zSW5Vc2Vbc3VnZ2VzdGlvbi5kYXRhXVxyXG5cdFx0KVxyXG5cdCk7XHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLm9uUmVtb3ZlQnV0dG9uQ2xpY2sgPSBmdW5jdGlvbigpIHtcclxuXHR0aGlzLmVtaXQoXCJyZW1vdmVcIik7XHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLm9uQ2xlYXJCdXR0b25DbGljayA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMucGFyYW1ldGVyTGlzdC5jbGVhckl0ZW1zKFxyXG5cdFx0dGhpcy5wYXJhbWV0ZXJMaXN0LmdldFBhcmFtZXRlckl0ZW1zKClcclxuXHQpO1xyXG5cdGlmICggdGhpcy5oYXNDbGFzc1JhdGluZ3MgKSB7XHJcblx0XHR0aGlzLmNsYXNzRHJvcGRvd24uZ2V0TWVudSgpLnNlbGVjdEl0ZW0oKTtcclxuXHR9XHJcblx0aWYgKCB0aGlzLmhhc0ltcG9ydGFuY2VSYXRpbmdzICkge1xyXG5cdFx0dGhpcy5pbXBvcnRhbmNlRHJvcGRvd24uZ2V0TWVudSgpLnNlbGVjdEl0ZW0oKTtcclxuXHR9XHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLmJ5cGFzc1JlZGlyZWN0ID0gZnVuY3Rpb24oKSB7XHJcblx0aWYgKCF0aGlzLnJlZGlyZWN0VGFyZ2V0TWFpblRleHQpIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblx0Ly8gU3RvcmUgdGhlIGJ5cGFzc2VkIG5hbWVcclxuXHR0aGlzLmJ5cGFzc2VkTmFtZSA9IHRoaXMubmFtZTtcclxuXHQvLyBVcGRhdGUgdGl0bGUgbGFiZWxcclxuXHR0aGlzLm1haW5MYWJlbFBvcHVwQnV0dG9uLnNldExhYmVsKGB7eyR7dGhpcy5yZWRpcmVjdFRhcmdldE1haW5UZXh0fX19JHt0aGlzLmluYWN0aXZlUHJvamVjdCA/IFwiIChpbmFjdGl2ZSlcIiA6IFwiXCJ9YCk7XHJcblx0Ly8gVXBkYXRlIHByb3BlcnRpZXNcclxuXHR0aGlzLm5hbWUgPSB0aGlzLnJlZGlyZWN0VGFyZ2V0TWFpblRleHQ7XHJcblx0dGhpcy5tYWluVGV4dCA9IHRoaXMucmVkaXJlY3RUYXJnZXRNYWluVGV4dDtcclxuXHR0aGlzLnJlZGlyZWN0VGFyZ2V0TWFpblRleHQgPSBudWxsO1xyXG5cdHRoaXMuc2V0Q2hhbmdlZCgpO1xyXG59O1xyXG5cclxuQmFubmVyV2lkZ2V0LnByb3RvdHlwZS5tYWtlV2lraXRleHQgPSBmdW5jdGlvbigpIHtcclxuXHRpZiAoIXRoaXMuY2hhbmdlZCAmJiB0aGlzLndpa2l0ZXh0KSB7XHJcblx0XHRyZXR1cm4gdGhpcy53aWtpdGV4dDtcclxuXHR9XHJcblx0dmFyIHBpcGUgPSB0aGlzLnBpcGVTdHlsZTtcclxuXHR2YXIgZXF1YWxzID0gdGhpcy5lcXVhbHNTdHlsZTtcclxuXHR2YXIgY2xhc3NJdGVtID0gKHRoaXMuaGFzQ2xhc3NSYXRpbmdzIHx8IHRoaXMuaXNTaGVsbFRlbXBsYXRlKSAmJiB0aGlzLmNsYXNzRHJvcGRvd24uZ2V0TWVudSgpLmZpbmRTZWxlY3RlZEl0ZW0oKTtcclxuXHR2YXIgY2xhc3NWYWwgPSBjbGFzc0l0ZW0gJiYgY2xhc3NJdGVtLmdldERhdGEoKTtcclxuXHR2YXIgaW1wb3J0YW5jZUl0ZW0gPSB0aGlzLmhhc0ltcG9ydGFuY2VSYXRpbmdzICYmIHRoaXMuaW1wb3J0YW5jZURyb3Bkb3duLmdldE1lbnUoKS5maW5kU2VsZWN0ZWRJdGVtKCk7XHJcblx0dmFyIGltcG9ydGFuY2VWYWwgPSBpbXBvcnRhbmNlSXRlbSAmJiBpbXBvcnRhbmNlSXRlbS5nZXREYXRhKCk7XHJcblxyXG5cdHJldHVybiAoXCJ7e1wiICtcclxuXHRcdHRoaXMubmFtZSArXHJcblx0XHQoICh0aGlzLmhhc0NsYXNzUmF0aW5ncyB8fCB0aGlzLmlzU2hlbGxUZW1wbGF0ZSkgJiYgY2xhc3NWYWwhPW51bGwgPyBgJHtwaXBlfWNsYXNzJHtlcXVhbHN9JHtjbGFzc1ZhbHx8XCJcIn1gIDogXCJcIiApICtcclxuXHRcdCggdGhpcy5oYXNJbXBvcnRhbmNlUmF0aW5ncyAmJiBpbXBvcnRhbmNlVmFsIT1udWxsID8gYCR7cGlwZX1pbXBvcnRhbmNlJHtlcXVhbHN9JHtpbXBvcnRhbmNlVmFsfHxcIlwifWAgOiBcIlwiICkgK1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJMaXN0LmdldFBhcmFtZXRlckl0ZW1zKClcclxuXHRcdFx0Lm1hcChwYXJhbWV0ZXIgPT4gcGFyYW1ldGVyLm1ha2VXaWtpdGV4dChwaXBlLCBlcXVhbHMpKVxyXG5cdFx0XHQuam9pbihcIlwiKSArXHJcblx0XHR0aGlzLmVuZEJyYWNlc1N0eWxlKVxyXG5cdFx0LnJlcGxhY2UoL1xcbit9fSQvLCBcIlxcbn19XCIpOyAvLyBhdm9pZCBlbXB0eSBsaW5lIGF0IGVuZCBsaWtlIFtbU3BlY2lhbDpEaWZmLzkyNTk4MjE0Ml1dXHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLnNldFByZWZlcmVuY2VzID0gZnVuY3Rpb24ocHJlZnMpIHtcclxuXHR0aGlzLnByZWZlcmVuY2VzID0gcHJlZnM7XHJcblx0aWYgKHRoaXMucHJlZmVyZW5jZXMuYnlwYXNzUmVkaXJlY3RzKSB7XHJcblx0XHR0aGlzLmJ5cGFzc1JlZGlyZWN0KCk7XHJcblx0fVxyXG5cdHRoaXMucGFyYW1ldGVyTGlzdC5zZXRQcmVmZXJlbmNlcyhwcmVmcyk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCYW5uZXJXaWRnZXQ7XHJcbi8vIDwvbm93aWtpPiIsIi8vIDxub3dpa2k+XHJcblxyXG5mdW5jdGlvbiBEcm9wZG93blBhcmFtZXRlcldpZGdldCggY29uZmlnICkge1xyXG5cdC8vIENvbmZpZ3VyYXRpb24gaW5pdGlhbGl6YXRpb25cclxuXHRjb25maWcgPSAkLmV4dGVuZCh7XHJcblx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSdkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoyNCUnPlwiKVxyXG5cdH0sIGNvbmZpZyB8fCB7fSApO1xyXG5cclxuXHQvLyBDYWxsIHBhcmVudCBjb25zdHJ1Y3RvclxyXG5cdERyb3Bkb3duUGFyYW1ldGVyV2lkZ2V0LnN1cGVyLmNhbGwoIHRoaXMsIGNvbmZpZyApO1xyXG5cclxuXHR0aGlzLiRvdmVybGF5ID0gY29uZmlnLiRvdmVybGF5O1xyXG5cdHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoXCJyYXRlci1kcm9wZG93blBhcmFtZXRlcldpZGdldFwiKTtcclxuICAgIFxyXG5cdC8vIEF1dG9maWxsZWQgaWNvblxyXG5cdHRoaXMuYXV0b2ZpbGxlZCA9ICEhY29uZmlnLmF1dG9maWxsZWQ7XHJcblx0dGhpcy5hdXRvZmlsbGVkSWNvbiA9IG5ldyBPTy51aS5JY29uV2lkZ2V0KCB7XHJcblx0XHRpY29uOiBcInJvYm90XCIsXHJcblx0XHR0aXRsZTogXCJBdXRvZmlsbGVkIGJ5IFJhdGVyXCIsXHJcblx0XHRmbGFnczogXCJwcm9ncmVzc2l2ZVwiLFxyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8c3BhbiBzdHlsZT0nbWFyZ2luOiAwIC01cHggMCA1cHg7bWluLXdpZHRoOiAxNnB4O3dpZHRoOiAxNnB4O2xlZnQ6dW5zZXQ7Jz5cIilcclxuXHR9ICkudG9nZ2xlKHRoaXMuYXV0b2ZpbGxlZCk7XHJcblx0dGhpcy4kZWxlbWVudC5maW5kKFwiLm9vLXVpLWluZGljYXRvckVsZW1lbnQtaW5kaWNhdG9yXCIpLmJlZm9yZShcclxuXHRcdHRoaXMuYXV0b2ZpbGxlZEljb24uJGVsZW1lbnRcclxuXHQpO1xyXG5cclxuXHQvLyBFdmVudHNcclxuXHR0aGlzLm1lbnUuY29ubmVjdCh0aGlzLCB7XHJcblx0XHRcImNob29zZVwiOiBcIm9uRHJvcGRvd25NZW51Q2hvb3NlXCIsXHJcblx0XHRcInNlbGVjdFwiOiBcIm9uRHJvcGRvd25NZW51U2VsZWN0XCJcclxuXHR9KTtcclxufVxyXG5PTy5pbmhlcml0Q2xhc3MoIERyb3Bkb3duUGFyYW1ldGVyV2lkZ2V0LCBPTy51aS5Ecm9wZG93bldpZGdldCApO1xyXG5cclxuRHJvcGRvd25QYXJhbWV0ZXJXaWRnZXQucHJvdG90eXBlLnNldEF1dG9maWxsZWQgPSBmdW5jdGlvbihzZXRBdXRvZmlsbCkge1xyXG5cdHRoaXMuYXV0b2ZpbGxlZEljb24udG9nZ2xlKCEhc2V0QXV0b2ZpbGwpO1xyXG5cdHRoaXMuJGVsZW1lbnQuZmluZChcIi5vby11aS1kcm9wZG93bldpZGdldC1oYW5kbGVcIikuY3NzKHtcclxuXHRcdFwiYm9yZGVyXCI6IHNldEF1dG9maWxsID8gXCIxcHggZGFzaGVkICMzNmNcIiA6IFwiXCJcclxuXHR9KTtcclxuXHR0aGlzLmF1dG9maWxsZWQgPSAhIXNldEF1dG9maWxsO1xyXG59O1xyXG5cclxuRHJvcGRvd25QYXJhbWV0ZXJXaWRnZXQucHJvdG90eXBlLm9uRHJvcGRvd25NZW51Q2hvb3NlID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5zZXRBdXRvZmlsbGVkKGZhbHNlKTtcclxuXHR0aGlzLmVtaXQoXCJjaGFuZ2VcIik7XHJcbn07XHJcblxyXG5Ecm9wZG93blBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUub25Ecm9wZG93bk1lbnVTZWxlY3QgPSBmdW5jdGlvbigpIHtcclxuXHR0aGlzLmVtaXQoXCJjaGFuZ2VcIik7XHJcbn07XHJcblxyXG5Ecm9wZG93blBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbigpIHtcclxuXHRjb25zdCBzZWxlY3RlZEl0ZW0gPSB0aGlzLm1lbnUuZmluZFNlbGVjdGVkSXRlbSgpO1xyXG5cdHJldHVybiBzZWxlY3RlZEl0ZW0gJiYgc2VsZWN0ZWRJdGVtLmdldERhdGEoKTtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IERyb3Bkb3duUGFyYW1ldGVyV2lkZ2V0O1xyXG4vLyA8L25vd2lraT4iLCIvLyA8bm93aWtpPlxyXG5cclxuLyoqXHJcbiAqIEEgSG9yaXpvbnRhbExheW91dCB0aGF0IGlzIGFsc28gYSB3aWRnZXQsIGFuZCBjYW4gdGh1cyBiZSBwbGFjZWQgd2l0aGluXHJcbiAqIGZpZWxkIGxheW91dHMuXHJcbiAqIFxyXG4gKiBAY2xhc3NcclxuICogQHBhcmFtIHsqfSBjb25maWcgY29uZmlndXJhdGlvbiBmb3IgT08udWkuSG9yaXpvbnRhbExheW91dFxyXG4gKi9cclxuZnVuY3Rpb24gSG9yaXpvbnRhbExheW91dFdpZGdldCggY29uZmlnICkge1xyXG5cdC8vIENvbmZpZ3VyYXRpb24gaW5pdGlhbGl6YXRpb25cclxuXHRjb25maWcgPSBjb25maWcgfHwge307XHJcblx0Ly8gQ2FsbCBwYXJlbnQgY29uc3RydWN0b3JcclxuXHRIb3Jpem9udGFsTGF5b3V0V2lkZ2V0LnN1cGVyLmNhbGwoIHRoaXMsIHt9ICk7XHJcbiAgICBcclxuXHR0aGlzLmxheW91dCA9IG5ldyBPTy51aS5Ib3Jpem9udGFsTGF5b3V0KCB7XHJcblx0XHQuLi5jb25maWcsXHJcblx0XHQkZWxlbWVudDogdGhpcy4kZWxlbWVudFxyXG5cdH0pO1xyXG5cclxufVxyXG5PTy5pbmhlcml0Q2xhc3MoIEhvcml6b250YWxMYXlvdXRXaWRnZXQsIE9PLnVpLldpZGdldCApO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgSG9yaXpvbnRhbExheW91dFdpZGdldDtcclxuLy8gPC9ub3dpa2k+IiwiLy8gPG5vd2lraT5cclxuXHJcbi8qKlxyXG4gKiBAY2ZnIHtPTy51aS5FbGVtZW50W119IGl0ZW1zIEl0ZW1zIHRvIGJlIGFkZGVkXHJcbiAqIEBjZmcge051bWJlcn0gZGlzcGxheUxpbWl0IFRoZSBtb3N0IHRvIHNob3cgYXQgb25jZS4gSWYgdGhlIG51bWJlciBvZiBpdGVtc1xyXG4gKiAgaXMgbW9yZSB0aGFuIHRoaXMsIHRoZW4gb25seSB0aGUgZmlyc3QgKGRpc3BsYXlMaW1pdCAtIDEpIGl0ZW1zIGFyZSBzaG93bi5cclxuICovXHJcbnZhciBQYXJhbWV0ZXJMaXN0V2lkZ2V0ID0gZnVuY3Rpb24gUGFyYW1ldGVyTGlzdFdpZGdldCggY29uZmlnICkge1xyXG5cdGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcclxuXHJcblx0Ly8gQ2FsbCBwYXJlbnQgY29uc3RydWN0b3JcclxuXHRQYXJhbWV0ZXJMaXN0V2lkZ2V0LnBhcmVudC5jYWxsKCB0aGlzLCBjb25maWcgKTtcclxuXHRPTy51aS5taXhpbi5Hcm91cEVsZW1lbnQuY2FsbCggdGhpcywge1xyXG5cdFx0JGdyb3VwOiB0aGlzLiRlbGVtZW50XHJcblx0fSApO1xyXG5cdHRoaXMuYWRkSXRlbXMoIGNvbmZpZy5pdGVtcyApO1xyXG5cclxuXHR0aGlzLiRlbGVtZW50LmFkZENsYXNzKFwicmF0ZXItcGFyYW1ldGVyTGlzdFdpZGdldFwiKTtcclxuICAgIFxyXG5cdHRoaXMucHJlZmVyZW5jZXMgPSBjb25maWcucHJlZmVyZW5jZXM7XHJcbiAgIFxyXG5cdC8vIEhpZGUgc29tZSBwYXJhbWV0ZXJzIChpbml0aWFsbHkpLCBpZiBtb3JlIHRoYW4gc2V0IGRpc3BsYXkgbGltaXQgLS0gd2hpY2ggaXMgdGhlIFxyXG5cdC8vIG9uZSBtb3JlIHRoYW4gY29sbGFwc2VQYXJhbXNMb3dlckxpbWl0LCB0byBwcmV2ZW50IG9ubHkgb25lIHBhcmFtIGJlaW5nIGhpZGRlblxyXG5cdC8vIChtb3N0bHk6IG1heSBvY2Nhc2lvbmFsbHkgb2NjdXIgaWYgcGFyYW1zIHdlcmUgYXV0by1maWxsZWQpLlxyXG5cdGxldCBkaXNwbGF5TGltaXQgPSB0aGlzLnByZWZlcmVuY2VzLmNvbGxhcHNlUGFyYW1zTG93ZXJMaW1pdCArIDE7XHJcblx0aWYgKGRpc3BsYXlMaW1pdCAmJiB0aGlzLml0ZW1zLmxlbmd0aCA+IGRpc3BsYXlMaW1pdCApIHtcclxuXHRcdHZhciBoaWRlRnJvbU51bWJlciA9IGRpc3BsYXlMaW1pdCAtIDE7IC8vIE9uZS1pbmRleGVkXHJcblx0XHR2YXIgaGlkZUZyb21JbmRleCA9IGhpZGVGcm9tTnVtYmVyIC0gMTsgLy8gWmVyby1pbmRleGVkXHJcblx0XHR2YXIgaGlkZGVuQ291bnQgPSAwO1xyXG5cdFx0Zm9yIChsZXQgaSA9IGhpZGVGcm9tSW5kZXg7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGlmICghdGhpcy5pdGVtc1tpXS5hdXRvZmlsbGVkKSB7IC8vIERvbid0IGhpZGUgYXV0by1maWxsZWQgcGFyYW1zXHJcblx0XHRcdFx0dGhpcy5pdGVtc1tpXS50b2dnbGUoZmFsc2UpO1xyXG5cdFx0XHRcdGhpZGRlbkNvdW50Kys7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdGlmIChoaWRkZW5Db3VudD4wKSB7XHJcblx0XHRcdC8vIEFkZCBidXR0b24gdG8gc2hvdyB0aGUgaGlkZGVuIHBhcmFtc1xyXG5cdFx0XHR0aGlzLnNob3dNb3JlUGFyYW1ldGVyc0J1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoe1xyXG5cdFx0XHRcdGxhYmVsOiBcIlNob3cgXCIgKyBoaWRkZW5Db3VudCArIFwiIG1vcmUgXCIgKyAoaGlkZGVuQ291bnQ9PT0xID8gXCJwYXJhbWV0ZXJcIiA6IFwicGFyYW1ldGVyc1wiKSxcclxuXHRcdFx0XHRmcmFtZWQ6IGZhbHNlLFxyXG5cdFx0XHRcdCRlbGVtZW50OiAkKFwiPHNwYW4gc3R5bGU9J21hcmdpbi1ib3R0b206MCc+XCIpXHJcblx0XHRcdH0pO1xyXG5cdFx0XHR0aGlzLmFkZEl0ZW1zKFt0aGlzLnNob3dNb3JlUGFyYW1ldGVyc0J1dHRvbl0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gQWRkIHRoZSBidXR0b24gdGhhdCBhbGxvd3MgdXNlciB0byBhZGQgbW9yZSBwYXJhbWV0ZXJzXHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJzQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7XHJcblx0XHRsYWJlbDogXCJBZGQgcGFyYW1ldGVyXCIsXHJcblx0XHRpY29uOiBcImFkZFwiLFxyXG5cdFx0ZnJhbWVkOiBmYWxzZSxcclxuXHRcdCRlbGVtZW50OiAkKFwiPHNwYW4gc3R5bGU9J21hcmdpbi1ib3R0b206MCc+XCIpXHJcblx0fSk7XHJcblx0dGhpcy5hZGRJdGVtcyhbdGhpcy5hZGRQYXJhbWV0ZXJzQnV0dG9uXSk7XHJcblxyXG5cdC8qIC0tLSBFdmVudHMgLS0tICovXHJcblxyXG5cdC8vIEhhbmRsZSBkZWxldGUgZXZlbnRzIGZyb20gUGFyYW1ldGVyV2lkZ2V0c1xyXG5cdHRoaXMuYWdncmVnYXRlKCB7IGRlbGV0ZTogXCJwYXJhbWV0ZXJEZWxldGVcIlx0fSApO1xyXG5cdHRoaXMuY29ubmVjdCggdGhpcywgeyBwYXJhbWV0ZXJEZWxldGU6IFwib25QYXJhbWV0ZXJEZWxldGVcIiB9ICk7XHJcbiAgICBcclxuXHQvLyBIYW5kbGUgY2hhbmdlIGV2ZW50cyBmcm9tIFBhcmFtZXRlcldpZGdldHNcclxuXHR0aGlzLmFnZ3JlZ2F0ZSggeyBjaGFuZ2U6IFwicGFyYW1ldGVyQ2hhbmdlXCJcdH0gKTtcclxuXHR0aGlzLmNvbm5lY3QoIHRoaXMsIHsgcGFyYW1ldGVyQ2hhbmdlOiBcIm9uUGFyYW1ldGVyQ2hhbmdlXCIgfSApO1xyXG5cclxuXHQvLyBIYW5kbGUgdXBkYXRlZFNpemUgZXZlbnRzIGZyb20gUGFyYW1ldGVyV2lkZ2V0c1xyXG5cdHRoaXMuYWdncmVnYXRlKCB7XCJ1cGRhdGVkU2l6ZVwiOiBcInBhcmFtZXRlclVwZGF0ZWRTaXplXCJ9ICk7XHJcblx0dGhpcy5jb25uZWN0KCB0aGlzLCB7XCJwYXJhbWV0ZXJVcGRhdGVkU2l6ZVwiOiBcIm9uVXBkYXRlZFNpemVcIn0gKTtcclxuICAgIFxyXG5cdC8vIEhhbmRsZSBidXR0b24gY2xpY2tzXHJcblx0aWYgKHRoaXMuc2hvd01vcmVQYXJhbWV0ZXJzQnV0dG9uICkge1xyXG5cdFx0dGhpcy5zaG93TW9yZVBhcmFtZXRlcnNCdXR0b24uY29ubmVjdCggdGhpcywgeyBcImNsaWNrXCI6IFwib25TaG93TW9yZVBhcmFtZXRlcnNCdXR0b25DbGlja1wiIH0gKTtcclxuXHR9XHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJzQnV0dG9uLmNvbm5lY3QoIHRoaXMsIHsgXCJjbGlja1wiOiBcIm9uQWRkUGFyYW1ldGVyc0J1dHRvbkNsaWNrXCIgfSApO1xyXG59O1xyXG5cclxuT08uaW5oZXJpdENsYXNzKCBQYXJhbWV0ZXJMaXN0V2lkZ2V0LCBPTy51aS5XaWRnZXQgKTtcclxuT08ubWl4aW5DbGFzcyggUGFyYW1ldGVyTGlzdFdpZGdldCwgT08udWkubWl4aW4uR3JvdXBFbGVtZW50ICk7XHJcbi8qXHJcbm1ldGhvZHMgZnJvbSBtaXhpbjpcclxuIC0gYWRkSXRlbXMoIGl0ZW1zLCBbaW5kZXhdICkgOiBPTy51aS5FbGVtZW50ICAoQ0hBSU5BQkxFKVxyXG4gLSBjbGVhckl0ZW1zKCApIDogT08udWkuRWxlbWVudCAgKENIQUlOQUJMRSlcclxuIC0gZmluZEl0ZW1Gcm9tRGF0YSggZGF0YSApIDogT08udWkuRWxlbWVudHxudWxsXHJcbiAtIGZpbmRJdGVtc0Zyb21EYXRhKCBkYXRhICkgOiBPTy51aS5FbGVtZW50W11cclxuIC0gcmVtb3ZlSXRlbXMoIGl0ZW1zICkgOiBPTy51aS5FbGVtZW50ICAoQ0hBSU5BQkxFKVxyXG4qL1xyXG5cclxuUGFyYW1ldGVyTGlzdFdpZGdldC5wcm90b3R5cGUub25VcGRhdGVkU2l6ZSA9IGZ1bmN0aW9uKCkge1xyXG5cdC8vIEVtaXQgYW4gXCJ1cGRhdGVkU2l6ZVwiIGV2ZW50IHNvIHRoZSBwYXJlbnQgd2luZG93IGNhbiB1cGRhdGUgc2l6ZSwgaWYgbmVlZGVkXHJcblx0dGhpcy5lbWl0KFwidXBkYXRlZFNpemVcIik7XHJcbn07XHJcblxyXG5QYXJhbWV0ZXJMaXN0V2lkZ2V0LnByb3RvdHlwZS5hZGRJdGVtcyA9IGZ1bmN0aW9uICggaXRlbXMsIGluZGV4ICkge1xyXG5cdGlmICggaXRlbXMubGVuZ3RoID09PSAwICkge1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG5cclxuXHQvLyBDYWxsIG1peGluIG1ldGhvZCB0byBkbyB0aGUgYWRkaW5nXHJcblx0T08udWkubWl4aW4uR3JvdXBFbGVtZW50LnByb3RvdHlwZS5hZGRJdGVtcy5jYWxsKCB0aGlzLCBpdGVtcywgaW5kZXggKTtcclxuXHJcblx0Ly8gZW1pdCB1cGRhdGVkU2l6ZSBldmVudCBcclxuXHR0aGlzLm9uVXBkYXRlZFNpemUoKTtcclxuXHJcblx0cmV0dXJuIHRoaXM7XHJcbn07XHRcclxuXHJcblBhcmFtZXRlckxpc3RXaWRnZXQucHJvdG90eXBlLm9uUGFyYW1ldGVyRGVsZXRlID0gZnVuY3Rpb24ocGFyYW1ldGVyKSB7XHJcblx0dGhpcy5yZW1vdmVJdGVtcyhbcGFyYW1ldGVyXSk7XHJcblx0dGhpcy5lbWl0KFwiY2hhbmdlXCIpO1xyXG59O1xyXG5cclxuUGFyYW1ldGVyTGlzdFdpZGdldC5wcm90b3R5cGUub25QYXJhbWV0ZXJDaGFuZ2UgPSBmdW5jdGlvbigpIHtcclxuXHR0aGlzLmVtaXQoXCJjaGFuZ2VcIik7XHJcbn07XHJcblxyXG5QYXJhbWV0ZXJMaXN0V2lkZ2V0LnByb3RvdHlwZS5nZXRQYXJhbWV0ZXJJdGVtcyA9IGZ1bmN0aW9uKCkge1xyXG5cdHJldHVybiB0aGlzLml0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0uY29uc3RydWN0b3IubmFtZSA9PT0gXCJQYXJhbWV0ZXJXaWRnZXRcIik7XHJcbn07XHJcblxyXG5QYXJhbWV0ZXJMaXN0V2lkZ2V0LnByb3RvdHlwZS5vblNob3dNb3JlUGFyYW1ldGVyc0J1dHRvbkNsaWNrID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5yZW1vdmVJdGVtcyhbdGhpcy5zaG93TW9yZVBhcmFtZXRlcnNCdXR0b25dKTtcclxuXHR0aGlzLml0ZW1zLmZvckVhY2gocGFyYW1ldGVyV2lkZ2V0ID0+IHBhcmFtZXRlcldpZGdldC50b2dnbGUodHJ1ZSkpO1xyXG5cdHRoaXMub25VcGRhdGVkU2l6ZSgpO1xyXG59O1xyXG5cclxuUGFyYW1ldGVyTGlzdFdpZGdldC5wcm90b3R5cGUub25BZGRQYXJhbWV0ZXJzQnV0dG9uQ2xpY2sgPSBmdW5jdGlvbigpIHtcclxuXHR0aGlzLnJlbW92ZUl0ZW1zKFt0aGlzLmFkZFBhcmFtZXRlcnNCdXR0b25dKTtcclxuXHR0aGlzLmVtaXQoXCJhZGRQYXJhbWV0ZXJzQnV0dG9uQ2xpY2tcIik7XHJcbn07XHJcblxyXG5QYXJhbWV0ZXJMaXN0V2lkZ2V0LnByb3RvdHlwZS5tYWtlV2lraXRleHQgPSBmdW5jdGlvbihwaXBlU3R5bGUsIGVxdWFsc1N0eWxlKSB7XHJcblx0cmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVySXRlbXMoKVxyXG5cdFx0Lm1hcChwYXJhbWV0ZXIgPT4gcGFyYW1ldGVyLm1ha2VXaWtpdGV4dChwaXBlU3R5bGUsIGVxdWFsc1N0eWxlKSlcclxuXHRcdC5qb2luKFwiXCIpO1xyXG59O1xyXG5cclxuUGFyYW1ldGVyTGlzdFdpZGdldC5wcm90b3R5cGUuc2V0UHJlZmVyZW5jZXMgPSBmdW5jdGlvbihwcmVmcykge1xyXG5cdHRoaXMucHJlZmVyZW5jZXMgPSBwcmVmcztcclxuXHR2YXIgcGFyYW1zID0gdGhpcy5nZXRQYXJhbWV0ZXJJdGVtcygpO1xyXG5cdC8vIFVuaGlkZSBzb21lIHBhcmFtZXRlcnMgb2YgdGhlIGNvbGxhcHNlUGFyYW1zTG93ZXJMaW1pdCBoYXMgaW5jcmVhc2VkLlxyXG5cdC8vIChOb3QgaGlkaW5nIGFueSBpZiBpdCBkZWNyZWFzZWQsIHNpbmNlIGl0J3MgYSAqbG93ZXIqIGxpbWl0IG9mIHdoYXQgbmVlZHMgdG8gYmUgc2hvd24uKVxyXG5cdGlmICggcGFyYW1zLmxlbmd0aCA8PSB0aGlzLnByZWZlcmVuY2VzLmNvbGxhcHNlUGFyYW1zTG93ZXJMaW1pdCApIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblx0dmFyIGhpZGRlblBhcmFtcyA9IHBhcmFtcy5maWx0ZXIocGFyYW0gPT4gIXBhcmFtLmlzVmlzaWJsZSgpKTtcclxuXHR2YXIgdmlzaWJsZVBhcmFtc0NvdW50ID0gcGFyYW1zLmxlbmd0aCAtIGhpZGRlblBhcmFtcy5sZW5ndGg7XHJcblx0aWYgKFxyXG5cdFx0aGlkZGVuUGFyYW1zID09PSAwIHx8XHJcbiAgICAgICAgdmlzaWJsZVBhcmFtc0NvdW50ID49IHRoaXMucHJlZmVyZW5jZXMuY29sbGFwc2VQYXJhbXNMb3dlckxpbWl0XHJcblx0KSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdHZhciBudW1Ub1VuaGlkZSA9IE1hdGgubWluKFxyXG5cdFx0dGhpcy5wcmVmZXJlbmNlcy5jb2xsYXBzZVBhcmFtc0xvd2VyTGltaXQgLSB2aXNpYmxlUGFyYW1zQ291bnQsXHJcblx0XHRoaWRkZW5QYXJhbXMubGVuZ3RoXHJcblx0KTtcclxuXHRmb3IgKGxldCBpID0gMDsgaSA8IG51bVRvVW5oaWRlOyBpKyspIHtcclxuXHRcdGhpZGRlblBhcmFtc1tpXS50b2dnbGUodHJ1ZSk7XHJcblx0fVxyXG5cdHZhciBzdGlsbEhpZGRlbkNvdW50ID0gaGlkZGVuUGFyYW1zLmxlbmd0aCAtIG51bVRvVW5oaWRlO1xyXG5cdGlmIChzdGlsbEhpZGRlbkNvdW50ID09PSAwKSB7XHJcblx0XHR0aGlzLnJlbW92ZUl0ZW1zKFt0aGlzLnNob3dNb3JlUGFyYW1ldGVyc0J1dHRvbl0pO1xyXG5cdH0gZWxzZSB7XHJcblx0XHR0aGlzLnNob3dNb3JlUGFyYW1ldGVyc0J1dHRvbi5zZXRMYWJlbChcclxuXHRcdFx0XCJTaG93IFwiICsgc3RpbGxIaWRkZW5Db3VudCArIFwiIG1vcmUgXCIgKyAoc3RpbGxIaWRkZW5Db3VudD09PTEgPyBcInBhcmFtdGVyXCIgOiBcInBhcmFtdGVyc1wiKVxyXG5cdFx0KTtcclxuXHR9XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQYXJhbWV0ZXJMaXN0V2lkZ2V0O1xyXG4vLyA8L25vd2lraT4iLCJpbXBvcnQgeyBub3JtYWxpc2VZZXNObywgZmlsdGVyQW5kTWFwIH0gZnJvbSBcIi4uLy4uL3V0aWxcIjtcclxuaW1wb3J0IEhvcml6b250YWxMYXlvdXRXaWRnZXQgZnJvbSBcIi4vSG9yaXpvbnRhbExheW91dFdpZGdldFwiO1xyXG4vLyA8bm93aWtpPlxyXG5cclxuZnVuY3Rpb24gUGFyYW1ldGVyV2lkZ2V0KCBwYXJhbWV0ZXIsIHBhcmFtRGF0YSwgY29uZmlnICkge1xyXG5cdC8vIENvbmZpZ3VyYXRpb24gaW5pdGlhbGl6YXRpb25cclxuXHRjb25maWcgPSBjb25maWcgfHwge307XHJcblx0Ly8gQ2FsbCBwYXJlbnQgY29uc3RydWN0b3JcclxuXHRQYXJhbWV0ZXJXaWRnZXQuc3VwZXIuY2FsbCggdGhpcywgY29uZmlnICk7XHJcblx0dGhpcy4kb3ZlcmxheSA9IGNvbmZpZy4kb3ZlcmxheTtcclxuICAgIFxyXG5cdHRoaXMubmFtZSA9IHBhcmFtZXRlci5uYW1lO1xyXG5cdHRoaXMudmFsdWUgPSBwYXJhbWV0ZXIudmFsdWU7XHJcblx0dGhpcy5hdXRvZmlsbGVkID0gcGFyYW1ldGVyLmF1dG9maWxsZWQ7XHJcblx0dGhpcy5pc0ludmFsaWQgPSBwYXJhbWV0ZXIudmFsdWUgPT0gbnVsbDtcclxuXHR0aGlzLnBhcmFtRGF0YSA9IHBhcmFtRGF0YSB8fCB7fTtcclxuXHR0aGlzLmFsbG93ZWRWYWx1ZXMgPSB0aGlzLnBhcmFtRGF0YS5hbGxvd2VkVmFsdWVzIHx8IFtdO1xyXG5cdHRoaXMuaXNSZXF1aXJlZCA9IHRoaXMucGFyYW1EYXRhLnJlcXVpcmVkO1xyXG5cdHRoaXMuaXNTdWdnZXN0ZWQgPSB0aGlzLnBhcmFtRGF0YS5zdWdnZXN0ZWQ7XHJcblxyXG5cdC8vIE1ha2UgYSBjaGVja2JveCBpZiBvbmx5IDEgb3IgMiBhbGxvd2VkIHZhbHVlc1xyXG5cdHN3aXRjaCh0aGlzLmFsbG93ZWRWYWx1ZXMubGVuZ3RoKSB7XHQvKiBlc2xpbnQtZGlzYWJsZSBuby1mYWxsdGhyb3VnaCAqL1xyXG5cdGNhc2UgMTpcclxuXHRcdHRoaXMuYWxsb3dlZFZhbHVlc1sxXSA9IG51bGw7XHJcblx0XHQvKiBmYWxsLXRocm91Z2ggKi9cclxuXHRjYXNlIDI6XHJcblx0XHR2YXIgaXNGaXJzdEFsbG93ZWRWYWwgPSAoXHJcblx0XHRcdHRoaXMuYWxsb3dlZFZhbHVlcy5pbmRleE9mKCBwYXJhbWV0ZXIudmFsdWUgKSA9PT0gMCB8fFxyXG5cdFx0XHRcdHRoaXMuYWxsb3dlZFZhbHVlcy5tYXAobm9ybWFsaXNlWWVzTm8pLmluZGV4T2YoIG5vcm1hbGlzZVllc05vKHBhcmFtZXRlci52YWx1ZSkgKSA9PT0gMFxyXG5cdFx0KTtcclxuXHRcdHZhciBpc1NlY29uZEFsbG93ZWRWYWwgPSAoXHJcblx0XHRcdHRoaXMuYWxsb3dlZFZhbHVlcy5pbmRleE9mKCBwYXJhbWV0ZXIudmFsdWUgfHwgbnVsbCApID09PSAxIHx8XHJcblx0XHRcdFx0dGhpcy5hbGxvd2VkVmFsdWVzLm1hcChub3JtYWxpc2VZZXNObykuaW5kZXhPZiggcGFyYW1ldGVyLnZhbHVlID8gbm9ybWFsaXNlWWVzTm8ocGFyYW1ldGVyLnZhbHVlKSA6IG51bGwpID09PSAxXHJcblx0XHQpO1xyXG5cdFx0dmFyIGlzSW5kZXRlcm1pbmF0ZSA9ICFpc0ZpcnN0QWxsb3dlZFZhbCAmJiAhaXNTZWNvbmRBbGxvd2VkVmFsO1xyXG5cdFx0dGhpcy5jaGVja2JveCA9IG5ldyBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0KCB7XHJcblx0XHRcdHNlbGVjdGVkOiBpc0luZGV0ZXJtaW5hdGUgPyB1bmRlZmluZWQgOiBpc0ZpcnN0QWxsb3dlZFZhbCxcclxuXHRcdFx0aW5kZXRlcm1pbmF0ZTogaXNJbmRldGVybWluYXRlID8gdHJ1ZSA6IHVuZGVmaW5lZCxcclxuXHRcdFx0JGVsZW1lbnQ6ICQoXCI8bGFiZWwgc3R5bGU9J21hcmdpbjowIDAgMCA1cHgnPlwiKVxyXG5cdFx0fSApO1xyXG5cdFx0YnJlYWs7XHJcblx0ZGVmYXVsdDpcclxuXHRcdFx0Ly8gTm8gY2hlY2tib3hcclxuXHR9IC8qIGVzbGludC1lbmFibGUgbm8tZmFsbHRocm91Z2ggKi9cclxuXHJcblx0LyogLS0tIEVESVQgUEFSQU1FVEVSIExBWU9VVCAtLS0gKi9cclxuXHJcblx0dGhpcy5pbnB1dCA9IG5ldyBPTy51aS5Db21ib0JveElucHV0V2lkZ2V0KCB7XHJcblx0XHR2YWx1ZTogdGhpcy52YWx1ZSxcclxuXHRcdC8vIGxhYmVsOiBwYXJhbWV0ZXIubmFtZSArIFwiID1cIixcclxuXHRcdC8vIGxhYmVsUG9zaXRpb246IFwiYmVmb3JlXCIsXHJcblx0XHRvcHRpb25zOiBmaWx0ZXJBbmRNYXAoXHJcblx0XHRcdHRoaXMuYWxsb3dlZFZhbHVlcyxcclxuXHRcdFx0dmFsID0+IHZhbCE9PW51bGwsXHJcblx0XHRcdHZhbCA9PiAoe2RhdGE6IHZhbCwgbGFiZWw6dmFsfSlcclxuXHRcdCksXHJcblx0XHQkZWxlbWVudDogJChcIjxkaXYgc3R5bGU9J21hcmdpbi1ib3R0b206MDsnPlwiKSxcclxuXHRcdCRvdmVybGF5OiB0aGlzLiRvdmVybGF5XHJcblx0fSApO1xyXG5cdC8vIFJlZHVjZSB0aGUgZXhjZXNzaXZlIHdoaXRlc3BhY2UvaGVpZ2h0XHJcblx0dGhpcy5pbnB1dC4kZWxlbWVudC5maW5kKFwiaW5wdXRcIikuY3NzKHtcclxuXHRcdFwicGFkZGluZy10b3BcIjogMCxcclxuXHRcdFwicGFkZGluZy1ib3R0b21cIjogXCIycHhcIixcclxuXHRcdFwiaGVpZ2h0XCI6IFwiMjRweFwiXHJcblx0fSk7XHJcblx0Ly8gRml4IGxhYmVsIHBvc2l0aW9uaW5nIHdpdGhpbiB0aGUgcmVkdWNlZCBoZWlnaHRcclxuXHR0aGlzLmlucHV0LiRlbGVtZW50LmZpbmQoXCJzcGFuLm9vLXVpLWxhYmVsRWxlbWVudC1sYWJlbFwiKS5jc3Moe1wibGluZS1oZWlnaHRcIjogXCJub3JtYWxcIn0pO1xyXG5cdC8vIEFsc28gcmVkdWNlIGhlaWdodCBvZiBkcm9wZG93biBidXR0b24gKGlmIG9wdGlvbnMgYXJlIHByZXNlbnQpXHJcblx0dGhpcy5pbnB1dC4kZWxlbWVudC5maW5kKFwiYS5vby11aS1idXR0b25FbGVtZW50LWJ1dHRvblwiKS5jc3Moe1xyXG5cdFx0XCJwYWRkaW5nLXRvcFwiOiAwLFxyXG5cdFx0XCJoZWlnaHRcIjogXCIyNHB4XCIsXHJcblx0XHRcIm1pbi1oZWlnaHRcIjogXCIwXCJcclxuXHR9KTtcclxuXHJcblx0dGhpcy5jb25maXJtQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7XHJcblx0XHRpY29uOiBcImNoZWNrXCIsXHJcblx0XHRsYWJlbDogXCJEb25lXCIsXHJcblx0XHRmcmFtZWQ6IGZhbHNlLFxyXG5cdFx0ZmxhZ3M6IFwicHJvZ3Jlc3NpdmVcIixcclxuXHRcdCRlbGVtZW50OiAkKFwiPHNwYW4gc3R5bGU9J21hcmdpbi1yaWdodDowJz5cIilcclxuXHR9KTtcclxuXHJcblx0dGhpcy5jYW5jZWxCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHtcclxuXHRcdGljb246IFwidW5kb1wiLFxyXG5cdFx0bGFiZWw6IFwiQ2FuY2VsXCIsXHJcblx0XHRmcmFtZWQ6IGZhbHNlLFxyXG5cdH0pO1xyXG5cclxuXHR0aGlzLmRlbGV0ZUJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoe1xyXG5cdFx0aWNvbjogdGhpcy5pc1JlcXVpcmVkID8gXCJyZXN0b3JlXCIgOiBcInRyYXNoXCIsXHJcblx0XHRsYWJlbDogdGhpcy5pc1JlcXVpcmVkID8gXCJSZXF1aXJlZCBwYXJhbWV0ZXJcIiA6IFwiRGVsZXRlXCIsXHJcblx0XHRmcmFtZWQ6IGZhbHNlLFxyXG5cdFx0ZmxhZ3M6IFwiZGVzdHJ1Y3RpdmVcIixcclxuXHRcdGRpc2FibGVkOiB0aGlzLmlzUmVxdWlyZWRcclxuXHR9KTtcclxuXHJcblx0dGhpcy5lZGl0QnV0dG9uQ29udHJvbHMgPSBuZXcgT08udWkuQnV0dG9uR3JvdXBXaWRnZXQoe1xyXG5cdFx0aXRlbXM6IFtcclxuXHRcdFx0dGhpcy5jb25maXJtQnV0dG9uLFxyXG5cdFx0XHR0aGlzLmNhbmNlbEJ1dHRvbixcclxuXHRcdFx0dGhpcy5kZWxldGVCdXR0b25cclxuXHRcdF0sXHJcblx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSdmb250LXNpemU6OTIlJz5cIilcclxuXHR9KTtcclxuXHR0aGlzLmVkaXRCdXR0b25Db250cm9scy4kZWxlbWVudC5maW5kKFwiYSBzcGFuOmZpcnN0LWNoaWxkXCIpLmNzcyh7XHJcblx0XHRcIm1pbi13aWR0aFwiOiBcInVuc2V0XCIsXHJcblx0XHRcIndpZHRoXCI6IFwiMTZweFwiLFxyXG5cdFx0XCJtYXJnaW4tcmlnaHRcIjogMFxyXG5cdH0pO1xyXG5cclxuXHR0aGlzLmVkaXRMYXlvdXRDb250cm9scyA9IG5ldyBIb3Jpem9udGFsTGF5b3V0V2lkZ2V0KHtcclxuXHRcdGl0ZW1zOiBbXHJcblx0XHRcdHRoaXMuaW5wdXQsXHJcblx0XHRcdHRoaXMuZWRpdEJ1dHRvbkNvbnRyb2xzXHJcblx0XHRdLFxyXG5cdFx0Ly8kZWxlbWVudDogJChcIjxkaXYgc3R5bGU9J3dpZHRoOiA0OCU7bWFyZ2luOjA7Jz5cIilcclxuXHR9KTtcclxuXHJcblx0dGhpcy5lZGl0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KCB0aGlzLmVkaXRMYXlvdXRDb250cm9scywge1xyXG5cdFx0bGFiZWw6IHRoaXMubmFtZSArIFwiID1cIixcclxuXHRcdGFsaWduOiBcInRvcFwiLFxyXG5cdFx0aGVscDogdGhpcy5wYXJhbURhdGEuZGVzY3JpcHRpb24gJiYgdGhpcy5wYXJhbURhdGEuZGVzY3JpcHRpb24uZW4gfHwgZmFsc2UsXHJcblx0XHRoZWxwSW5saW5lOiB0cnVlXHJcblx0fSkudG9nZ2xlKCk7XHJcblx0dGhpcy5lZGl0TGF5b3V0LiRlbGVtZW50LmZpbmQoXCJsYWJlbC5vby11aS1pbmxpbmUtaGVscFwiKS5jc3Moe1wibWFyZ2luXCI6IFwiLTEwcHggMCA1cHggMTBweFwifSk7XHJcblxyXG5cdC8qIC0tLSBSRUFEIChDT0xMQVBTRUQpIERJU1BMQVkgT0YgUEFSQU1FVEVSIC0tLSAqL1xyXG5cclxuXHR0aGlzLmludmFsaWRJY29uID0gbmV3IE9PLnVpLkljb25XaWRnZXQoIHtcclxuXHRcdGljb246IFwiYmxvY2tcIixcclxuXHRcdHRpdGxlOiBcIkludmFsaWQgcGFyYW1ldGVyOiBubyB2YWx1ZSBzcGVjaWZpZWQhXCIsXHJcblx0XHRmbGFnczogXCJkZXN0cnVjdGl2ZVwiLFxyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8c3BhbiBzdHlsZT0nbWFyZ2luOiAwIDVweCAwIC01cHg7IG1pbi13aWR0aDogMTZweDsgd2lkdGg6IDE2cHg7Jz5cIilcclxuXHR9ICkudG9nZ2xlKHRoaXMuaXNJbnZhbGlkKTtcclxuXHR0aGlzLmZ1bGxMYWJlbCA9IG5ldyBPTy51aS5MYWJlbFdpZGdldCh7XHJcblx0XHRsYWJlbDp0aGlzLm5hbWUgK1xyXG5cdFx0XHQodGhpcy52YWx1ZVxyXG5cdFx0XHRcdD8gXCIgPSBcIiArIHRoaXMudmFsdWVcclxuXHRcdFx0XHQ6IFwiIFwiXHJcblx0XHRcdCksXHRcclxuXHRcdCRlbGVtZW50OiAkKFwiPGxhYmVsIHN0eWxlPSdtYXJnaW46IDA7Jz5cIilcclxuXHR9KTtcclxuXHR0aGlzLmF1dG9maWxsZWRJY29uID0gbmV3IE9PLnVpLkljb25XaWRnZXQoIHtcclxuXHRcdGljb246IFwicm9ib3RcIixcclxuXHRcdHRpdGxlOiBcIkF1dG9maWxsZWQgYnkgUmF0ZXJcIixcclxuXHRcdGZsYWdzOiBcInByb2dyZXNzaXZlXCIsXHJcblx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSdtYXJnaW46IDAgLTVweCAwIDVweDttaW4td2lkdGg6IDE2cHg7d2lkdGg6IDE2cHg7Jz5cIilcclxuXHR9ICkudG9nZ2xlKHRoaXMuYXV0b2ZpbGxlZCk7XHJcblx0dGhpcy5lZGl0QnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7XHJcblx0XHRpY29uOiBcImVkaXRcIixcclxuXHRcdGZyYW1lZDogZmFsc2UsXHJcblx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSdtYXJnaW4tYm90dG9tOiAwOyc+XCIpXHJcblx0fSk7XHJcblx0dGhpcy5lZGl0QnV0dG9uLiRlbGVtZW50LmZpbmQoXCJhXCIpLmNzcyh7XHJcblx0XHRcImJvcmRlci1yYWRpdXNcIjogXCIwIDEwcHggMTBweCAwXCIsXHJcblx0XHRcIm1hcmdpbi1sZWZ0XCI6IFwiNXB4XCJcclxuXHR9KTtcclxuXHR0aGlzLmVkaXRCdXR0b24uJGVsZW1lbnQuZmluZChcImEgc3BhblwiKS5maXJzdCgpLmNzcyh7XHJcblx0XHRcIm1pbi13aWR0aFwiOiBcInVuc2V0XCIsXHJcblx0XHRcIndpZHRoXCI6IFwiMTZweFwiXHJcblx0fSk7XHJcblxyXG5cdHRoaXMucmVhZExheW91dCA9IG5ldyBPTy51aS5Ib3Jpem9udGFsTGF5b3V0KHtcclxuXHRcdGl0ZW1zOiBbXHJcblx0XHRcdHRoaXMuaW52YWxpZEljb24sXHJcblx0XHRcdHRoaXMuZnVsbExhYmVsLFxyXG5cdFx0XHR0aGlzLmF1dG9maWxsZWRJY29uLFxyXG5cdFx0XHR0aGlzLmVkaXRCdXR0b25cclxuXHRcdF0sXHJcblx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSdtYXJnaW46MDt3aWR0aDp1bnNldDsnPlwiKVxyXG5cdH0pO1xyXG5cdGlmICh0aGlzLmNoZWNrYm94KSB7XHJcblx0XHR0aGlzLnJlYWRMYXlvdXQuYWRkSXRlbXMoW3RoaXMuY2hlY2tib3hdLCAyKTtcclxuXHR9XHJcblxyXG5cdC8qIC0tLSBDT05UQUlORVIgRk9SIEJPVEggTEFZT1VUUyAtLS0gKi9cclxuXHR0aGlzLiRlbGVtZW50ID0gJChcIjxkaXY+XCIpLmFkZENsYXNzKFwicmF0ZXItcGFyYW1ldGVyV2lkZ2V0XCIpXHJcblx0XHQuY3NzKHtcclxuXHRcdFx0XCJ3aWR0aFwiOiBcInVuc2V0XCIsXHJcblx0XHRcdFwiZGlzcGxheVwiOiBcImlubGluZS1ibG9ja1wiLFxyXG5cdFx0XHRcImJvcmRlclwiOiB0aGlzLmF1dG9maWxsZWQgPyBcIjFweCBkYXNoZWQgIzM2Y1wiIDogXCIxcHggc29saWQgI2RkZFwiLFxyXG5cdFx0XHRcImJvcmRlci1yYWRpdXNcIjogXCIxMHB4XCIsXHJcblx0XHRcdFwicGFkZGluZy1sZWZ0XCI6IFwiMTBweFwiLFxyXG5cdFx0XHRcIm1hcmdpblwiOiBcIjAgOHB4IDhweCAwXCIsXHJcblx0XHRcdFwiYmFja2dyb3VuZFwiOiB0aGlzLmlzSW52YWxpZCA/IFwiI2ZkZGRcIiA6IFwiI2ZmZmVcIlxyXG5cdFx0fSlcclxuXHRcdC5hcHBlbmQodGhpcy5yZWFkTGF5b3V0LiRlbGVtZW50LCB0aGlzLmVkaXRMYXlvdXQuJGVsZW1lbnQpO1xyXG4gICAgXHJcblx0dGhpcy5lZGl0QnV0dG9uLmNvbm5lY3QoIHRoaXMsIHsgXCJjbGlja1wiOiBcIm9uRWRpdENsaWNrXCIgfSApO1xyXG5cdHRoaXMuY29uZmlybUJ1dHRvbi5jb25uZWN0KCB0aGlzLCB7IFwiY2xpY2tcIjogXCJvbkNvbmZpcm1DbGlja1wiIH0gKTtcclxuXHR0aGlzLmNhbmNlbEJ1dHRvbi5jb25uZWN0KCB0aGlzLCB7IFwiY2xpY2tcIjogXCJvbkNhbmNlbENsaWNrXCIgfSApO1xyXG5cdHRoaXMuZGVsZXRlQnV0dG9uLmNvbm5lY3QoIHRoaXMsIHsgXCJjbGlja1wiOiBcIm9uRGVsZXRlQ2xpY2tcIiB9ICk7XHJcblx0aWYgKHRoaXMuY2hlY2tib3gpIHtcclxuXHRcdHRoaXMuY2hlY2tib3guY29ubmVjdCh0aGlzLCB7XCJjaGFuZ2VcIjogXCJvbkNoZWNrYm94Q2hhbmdlXCJ9ICk7XHJcblx0fVxyXG59XHJcbk9PLmluaGVyaXRDbGFzcyggUGFyYW1ldGVyV2lkZ2V0LCBPTy51aS5XaWRnZXQgKTtcclxuXHJcblBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUub25VcGRhdGVkU2l6ZSA9IGZ1bmN0aW9uKCkge1xyXG5cdC8vIEVtaXQgYW4gXCJ1cGRhdGVkU2l6ZVwiIGV2ZW50IHNvIHRoZSBwYXJlbnQgd2luZG93IGNhbiB1cGRhdGUgc2l6ZSwgaWYgbmVlZGVkXHJcblx0dGhpcy5lbWl0KFwidXBkYXRlZFNpemVcIik7XHJcbn07XHJcblxyXG5QYXJhbWV0ZXJXaWRnZXQucHJvdG90eXBlLm9uRWRpdENsaWNrID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5yZWFkTGF5b3V0LnRvZ2dsZShmYWxzZSk7XHJcblx0dGhpcy5lZGl0TGF5b3V0LnRvZ2dsZSh0cnVlKTtcclxuXHR0aGlzLiRlbGVtZW50LmNzcyh7XCJiYWNrZ3JvdW5kXCI6IFwiI2ZmZmVcIn0pO1xyXG5cdHRoaXMuaW5wdXQuZm9jdXMoKTtcclxuXHR0aGlzLm9uVXBkYXRlZFNpemUoKTtcclxufTtcclxuXHJcblBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUub25Db25maXJtQ2xpY2sgPSBmdW5jdGlvbigpIHtcclxuXHR0aGlzLnNldFZhbHVlKFxyXG5cdFx0dGhpcy5pbnB1dC5nZXRWYWx1ZSgpXHJcblx0KTtcclxuXHR0aGlzLnJlYWRMYXlvdXQudG9nZ2xlKHRydWUpO1xyXG5cdHRoaXMuZWRpdExheW91dC50b2dnbGUoZmFsc2UpO1xyXG5cdHRoaXMub25VcGRhdGVkU2l6ZSgpO1xyXG59O1xyXG5cclxuUGFyYW1ldGVyV2lkZ2V0LnByb3RvdHlwZS5vbkNhbmNlbENsaWNrID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5pbnB1dC5zZXRWYWx1ZSh0aGlzLnZhbHVlKTtcclxuXHR0aGlzLnJlYWRMYXlvdXQudG9nZ2xlKHRydWUpO1xyXG5cdHRoaXMuZWRpdExheW91dC50b2dnbGUoZmFsc2UpO1xyXG5cdHRoaXMub25VcGRhdGVkU2l6ZSgpO1xyXG59O1xyXG5cclxuUGFyYW1ldGVyV2lkZ2V0LnByb3RvdHlwZS5vbkRlbGV0ZUNsaWNrID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5kZWxldGUoKTtcclxufTtcclxuXHJcblBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUub25DaGVja2JveENoYW5nZSA9IGZ1bmN0aW9uKGlzU2VsZWN0ZWQsIGlzSW5kZXRlcm1pbmF0ZSkge1xyXG5cdGlmIChpc0luZGV0ZXJtaW5hdGUpIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblx0aWYgKGlzU2VsZWN0ZWQpIHtcclxuXHRcdHRoaXMuc2V0VmFsdWUodGhpcy5hbGxvd2VkVmFsdWVzWzBdKTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0dGhpcy5zZXRWYWx1ZSh0aGlzLmFsbG93ZWRWYWx1ZXNbMV0pO1xyXG5cdH1cclxufTtcclxuXHJcblBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5lbWl0KFwiZGVsZXRlXCIpO1xyXG59O1xyXG5cclxuUGFyYW1ldGVyV2lkZ2V0LnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uKHZhbCkge1xyXG5cdC8vIFR1cm4gb2ZmIGF1dG9maWxsIHN0eWxpbmdzL2ljb25cclxuXHR0aGlzLmF1dG9maWxsZWQgPSBmYWxzZTtcclxuXHR0aGlzLmF1dG9maWxsZWRJY29uLnRvZ2dsZShmYWxzZSk7XHJcblx0dGhpcy4kZWxlbWVudC5jc3Moe1wiYm9yZGVyXCI6IFwiMXB4IHNvbGlkICNkZGRcIn0pO1xyXG5cclxuXHQvLyBVcGRhdGUgdGhlIHN0b3JlZCB2YWx1ZVxyXG5cdHRoaXMudmFsdWUgPSB2YWw7XHJcblxyXG5cdC8vIFVwZGF0ZSB0aGUgaW5wdXQgdmFsdWUgZm9yIGVkaXQgbW9kZVxyXG5cdHRoaXMuaW5wdXQuc2V0VmFsdWUodGhpcy52YWx1ZSk7XHJcblxyXG5cdC8vIFVwZGF0ZSB2YWxpZGl0eVxyXG5cdHRoaXMuaXNJbnZhbGlkID0gdGhpcy52YWx1ZSA9PSBudWxsO1xyXG5cdHRoaXMuaW52YWxpZEljb24udG9nZ2xlKHRoaXMuaXNJbnZhbGlkKTtcclxuXHR0aGlzLiRlbGVtZW50LmNzcyh7XCJiYWNrZ3JvdW5kXCI6IHRoaXMuaXNJbnZhbGlkID8gXCIjZmRkZFwiIDogXCIjZmZmZVwifSk7XHJcblxyXG5cdC8vIFVwZGF0ZWQgdGhlIGxhYmVsIGZvciByZWFkIG1vZGVcclxuXHR0aGlzLmZ1bGxMYWJlbC5zZXRMYWJlbChcclxuXHRcdHRoaXMubmFtZSArXHJcblx0XHQodGhpcy52YWx1ZVxyXG5cdFx0XHQ/IFwiID0gXCIgKyB0aGlzLnZhbHVlXHJcblx0XHRcdDogXCJcIlxyXG5cdFx0KVxyXG5cdCk7XHJcblxyXG5cdC8vIFVwZGF0ZSB0aGUgY2hlY2tib3ggKGlmIHRoZXJlIGlzIG9uZSlcclxuXHRpZiAodGhpcy5jaGVja2JveCkge1xyXG5cdFx0dmFyIGlzRmlyc3RBbGxvd2VkVmFsID0gKFxyXG5cdFx0XHR0aGlzLmFsbG93ZWRWYWx1ZXMuaW5kZXhPZiggdmFsICkgPT09IDAgfHxcclxuXHRcdFx0dGhpcy5hbGxvd2VkVmFsdWVzLm1hcChub3JtYWxpc2VZZXNObykuaW5kZXhPZiggbm9ybWFsaXNlWWVzTm8odmFsKSApID09PSAwXHJcblx0XHQpO1xyXG5cdFx0dmFyIGlzU2Vjb25kQWxsb3dlZFZhbCA9IChcclxuXHRcdFx0dGhpcy5hbGxvd2VkVmFsdWVzLmluZGV4T2YoIHZhbCB8fCBudWxsICkgPT09IDEgfHxcclxuXHRcdFx0dGhpcy5hbGxvd2VkVmFsdWVzLm1hcChub3JtYWxpc2VZZXNObykuaW5kZXhPZiggdmFsID8gbm9ybWFsaXNlWWVzTm8odmFsKSA6IG51bGwpID09PSAxXHJcblx0XHQpO1xyXG5cdFx0dmFyIGlzSW5kZXRlcm1pbmF0ZSA9ICFpc0ZpcnN0QWxsb3dlZFZhbCAmJiAhaXNTZWNvbmRBbGxvd2VkVmFsO1xyXG5cdFx0dGhpcy5jaGVja2JveC5zZXRJbmRldGVybWluYXRlKGlzSW5kZXRlcm1pbmF0ZSwgdHJ1ZSk7XHJcblx0XHRpZiAoIWlzSW5kZXRlcm1pbmF0ZSkge1xyXG5cdFx0XHR2YXIgaXNTZWxlY3RlZCA9IGlzRmlyc3RBbGxvd2VkVmFsO1xyXG5cdFx0XHR0aGlzLmNoZWNrYm94LnNldFNlbGVjdGVkKGlzU2VsZWN0ZWQsIHRydWUpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gRW1pdCBhIGNoYW5nZSBldmVudFxyXG5cdHRoaXMuZW1pdChcImNoYW5nZVwiKTtcclxufTtcclxuXHJcblBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUuc2V0QXV0b2ZpbGxlZCA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuYXV0b2ZpbGxlZCA9IHRydWU7XHJcblx0dGhpcy5hdXRvZmlsbGVkSWNvbi50b2dnbGUodHJ1ZSk7XHJcblx0dGhpcy4kZWxlbWVudC5jc3Moe1wiYm9yZGVyXCI6IFwiMXB4IGRhc2hlZCAjMzZjXCJ9KTtcclxufTtcclxuXHJcblBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUubWFrZVdpa2l0ZXh0ID0gZnVuY3Rpb24ocGlwZVN0eWxlLCBlcXVhbHNTdHlsZSkge1xyXG5cdGlmICh0aGlzLmlzSW52YWxpZCkge1xyXG5cdFx0cmV0dXJuIFwiXCI7XHJcblx0fVxyXG5cdHJldHVybiBwaXBlU3R5bGUgKyB0aGlzLm5hbWUgKyBlcXVhbHNTdHlsZSArICh0aGlzLnZhbHVlfHxcIlwiKTtcclxufTtcclxuXHJcblBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUuZm9jdXNJbnB1dCA9IGZ1bmN0aW9uKCkge1xyXG5cdHJldHVybiB0aGlzLmlucHV0LmZvY3VzKCk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQYXJhbWV0ZXJXaWRnZXQ7XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCBjb25maWcgZnJvbSBcIi4uLy4uL2NvbmZpZ1wiO1xyXG4vLyA8bm93aWtpPlxyXG5cclxuZnVuY3Rpb24gUHJlZnNGb3JtV2lkZ2V0KCBjb25maWcgKSB7XHJcblx0Ly8gQ29uZmlndXJhdGlvbiBpbml0aWFsaXphdGlvblxyXG5cdGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcclxuXHQvLyBDYWxsIHBhcmVudCBjb25zdHJ1Y3RvclxyXG5cdFByZWZzRm9ybVdpZGdldC5zdXBlci5jYWxsKCB0aGlzLCBjb25maWcgKTtcclxuXHJcblx0dGhpcy4kZWxlbWVudC5hZGRDbGFzcyhcInJhdGVyLXByZWZzRm9ybVdpZGdldFwiKTtcclxuXHJcblx0dGhpcy5sYXlvdXQgPSAgbmV3IE9PLnVpLkZpZWxkc2V0TGF5b3V0KCB7XHJcblx0XHRsYWJlbDogXCJQcmVmZXJlbmNlc1wiLFxyXG5cdFx0JGVsZW1lbnQ6IHRoaXMuJGVsZW1lbnRcclxuXHR9ICk7XHJcblxyXG5cdHRoaXMucHJlZmVyZW5jZXMgPSB7XHJcblx0XHRcImF1dG9zdGFydFwiOiB7XHJcblx0XHRcdGlucHV0OiBuZXcgT08udWkuVG9nZ2xlU3dpdGNoV2lkZ2V0KCksXHJcblx0XHRcdGxhYmVsOiBcIkF1dG9zdGFydCBSYXRlclwiXHJcblx0XHR9LFxyXG5cdFx0XCJhdXRvc3RhcnRSZWRpcmVjdHNcIjoge1xyXG5cdFx0XHRpbnB1dDogbmV3IE9PLnVpLlRvZ2dsZVN3aXRjaFdpZGdldCgpLFxyXG5cdFx0XHRsYWJlbDogXCJBdXRvc3RhcnQgb24gcmVkaXJlY3RzXCJcclxuXHRcdH0sXHJcblx0XHRcImF1dG9zdGFydE5hbWVzcGFjZXNcIjoge1xyXG5cdFx0XHRpbnB1dDogbmV3IG13LndpZGdldHMuTmFtZXNwYWNlc011bHRpc2VsZWN0V2lkZ2V0KCksXHJcblx0XHRcdGxhYmVsOiBcIkF1dG9zdGFydCBpbiB0aGVzZSBuYW1lc3BhY2VzXCJcclxuXHRcdH0sXHJcblx0XHRcImJ5cGFzc1JlZGlyZWN0c1wiOiB7XHJcblx0XHRcdGlucHV0OiBuZXcgT08udWkuVG9nZ2xlU3dpdGNoV2lkZ2V0KCksXHJcblx0XHRcdGxhYmVsOiBcIkJ5cGFzcyByZWRpcmVjdHMgdG8gYmFubmVyc1wiXHJcblx0XHR9LFxyXG5cdFx0XCJhdXRvZmlsbENsYXNzRnJvbU90aGVyc1wiOiAge1xyXG5cdFx0XHRpbnB1dDogbmV3IE9PLnVpLlRvZ2dsZVN3aXRjaFdpZGdldCgpLFxyXG5cdFx0XHRsYWJlbDogXCJBdXRvZmlsbCBjbGFzcyBmcm9tIG90aGVyIGJhbm5lcnNcIlxyXG5cdFx0fSxcclxuXHRcdFwiYXV0b2ZpbGxDbGFzc0Zyb21PcmVzXCI6IHtcclxuXHRcdFx0aW5wdXQ6IG5ldyBPTy51aS5Ub2dnbGVTd2l0Y2hXaWRnZXQoKSxcclxuXHRcdFx0bGFiZWw6IFwiQXV0b2ZpbGwgY2xhc3MgYmFzZWQgb24gT1JFUyBwcmVkaWN0aW9uXCJcclxuXHRcdH0sXHJcblx0XHRcImF1dG9maWxsSW1wb3J0YW5jZVwiOiB7XHJcblx0XHRcdGlucHV0OiBuZXcgT08udWkuVG9nZ2xlU3dpdGNoV2lkZ2V0KCksXHJcblx0XHRcdGxhYmVsOiBcIkF1dG9maWxsIGxvdyBpbXBvcnRhbmNlXCJcclxuXHRcdH0sXHJcblx0XHRcImNvbGxhcHNlUGFyYW1zTG93ZXJMaW1pdFwiOiB7XHJcblx0XHRcdGlucHV0OiBuZXcgT08udWkuTnVtYmVySW5wdXRXaWRnZXQoIHsgXCJtaW5cIjogMSB9ICksXHJcblx0XHRcdGxhYmVsOiBcIk1pbmltdW0gbnVtYmVyIG9mIHBhcmFtZXRlcnMgdG8gc2hvdyB1bmNvbGxhcHNlZFwiXHJcblx0XHR9LFxyXG5cdFx0XCJ3YXRjaGxpc3RcIjoge1xyXG5cdFx0XHRpbnB1dDogbmV3IE9PLnVpLkJ1dHRvblNlbGVjdFdpZGdldCgge1xyXG5cdFx0XHRcdGl0ZW1zOiBbXHJcblx0XHRcdFx0XHRuZXcgT08udWkuQnV0dG9uT3B0aW9uV2lkZ2V0KCB7XHJcblx0XHRcdFx0XHRcdGRhdGE6IFwicHJlZmVyZW5jZXNcIixcclxuXHRcdFx0XHRcdFx0bGFiZWw6IFwiRGVmYXVsdFwiLFxyXG5cdFx0XHRcdFx0XHR0aXRsZTogXCJVc2VzIHRoZSBzYW1lIHNldHRpbmcgYXMgaWYgeW91IG1hbnVhbGx5IGVkaXRlZCB0aGUgcGFnZSwgYXMgcGVyIFNwZWNpYWw6UHJlZmVyZW5jZXNcIlxyXG5cdFx0XHRcdFx0fSApLFxyXG5cdFx0XHRcdFx0bmV3IE9PLnVpLkJ1dHRvbk9wdGlvbldpZGdldCgge1xyXG5cdFx0XHRcdFx0XHRkYXRhOiBcIndhdGNoXCIsXHJcblx0XHRcdFx0XHRcdGxhYmVsOiBcIkFsd2F5c1wiLFxyXG5cdFx0XHRcdFx0XHR0aXRsZTogXCJBbHdheXMgYWRkIHBhZ2VzIFJhdGVyIGVkaXRzIHRvIHlvdXIgd2F0Y2hsaXN0XCJcclxuXHRcdFx0XHRcdH0gKSxcclxuXHRcdFx0XHRcdG5ldyBPTy51aS5CdXR0b25PcHRpb25XaWRnZXQoIHtcclxuXHRcdFx0XHRcdFx0ZGF0YTogXCJub2NoYW5nZVwiLFxyXG5cdFx0XHRcdFx0XHRsYWJlbDogXCJOZXZlclwiLFxyXG5cdFx0XHRcdFx0XHR0aXRsZTogXCJOZXZlciBhZGQgcGFnZXMgUmF0ZXIgZWRpdCB0byB5b3VyIHdhdGNobGlzdFwiXHJcblx0XHRcdFx0XHR9ICksXHJcblx0XHRcdFx0XVxyXG5cdFx0XHR9KS5zZWxlY3RJdGVtQnlEYXRhKFwicHJlZmVyZW5jZXNcIiksXHJcblx0XHRcdGxhYmVsOiBcIkFkZCBlZGl0ZWQgcGFnZXMgdG8gd2F0Y2hsaXN0XCJcclxuXHRcdH0sXHJcblx0XHRcInJlc2V0Q2FjaGVcIjoge1xyXG5cdFx0XHRpbnB1dDogbmV3IE9PLnVpLkJ1dHRvbldpZGdldCgge1xyXG5cdFx0XHRcdGxhYmVsOiBcIlJlc2V0IGNhY2hlXCIsXHJcblx0XHRcdFx0dGl0bGU6IFwiUmVtb3ZlIGNhY2hlZCBkYXRhLCBpbmNsdWRpbmcgbGlzdCBvZiBXaWtpUHJvamVjdHMgYW5kIHRlbXBsYXRlIHBhcmFtZXRlcnNcIixcclxuXHRcdFx0XHRmbGFnczogW1wiZGVzdHJ1Y3RpdmVcIl1cclxuXHRcdFx0fSApXHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0Zm9yIChsZXQgcHJlZk5hbWUgaW4gdGhpcy5wcmVmZXJlbmNlcyApIHtcclxuXHRcdHRoaXMubGF5b3V0LmFkZEl0ZW1zKFtcclxuXHRcdFx0bmV3IE9PLnVpLkZpZWxkTGF5b3V0KCB0aGlzLnByZWZlcmVuY2VzW3ByZWZOYW1lXS5pbnB1dCwge1xyXG5cdFx0XHRcdGxhYmVsOiB0aGlzLnByZWZlcmVuY2VzW3ByZWZOYW1lXS5sYWJlbCxcclxuXHRcdFx0XHRhbGlnbjogXCJyaWdodFwiXHJcblx0XHRcdH0gKVxyXG5cdFx0XSk7XHJcblx0fVxyXG5cclxuXHR0aGlzLnByZWZlcmVuY2VzLnJlc2V0Q2FjaGUuaW5wdXQuY29ubmVjdCh0aGlzLCB7XCJjbGlja1wiOiBcIm9uUmVzZXRDYWNoZUNsaWNrXCJ9KTtcclxufVxyXG5PTy5pbmhlcml0Q2xhc3MoIFByZWZzRm9ybVdpZGdldCwgT08udWkuV2lkZ2V0ICk7XHJcblxyXG5QcmVmc0Zvcm1XaWRnZXQucHJvdG90eXBlLnNldFByZWZWYWx1ZXMgPSBmdW5jdGlvbihwcmVmcykge1xyXG5cdGZvciAobGV0IHByZWZOYW1lIGluIHByZWZzICkge1xyXG5cdFx0bGV0IHZhbHVlID0gcHJlZnNbcHJlZk5hbWVdO1xyXG5cdFx0bGV0IGlucHV0ID0gdGhpcy5wcmVmZXJlbmNlc1twcmVmTmFtZV0gJiYgdGhpcy5wcmVmZXJlbmNlc1twcmVmTmFtZV0uaW5wdXQ7XHJcblx0XHRzd2l0Y2ggKGlucHV0ICYmIGlucHV0LmNvbnN0cnVjdG9yLm5hbWUpIHtcclxuXHRcdGNhc2UgXCJPb1VpQnV0dG9uU2VsZWN0V2lkZ2V0XCI6XHJcblx0XHRcdGlucHV0LnNlbGVjdEl0ZW1CeURhdGEodmFsdWUpO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgXCJPb1VpTnVtYmVySW5wdXRXaWRnZXRcIjpcclxuXHRcdGNhc2UgXCJPb1VpVG9nZ2xlU3dpdGNoV2lkZ2V0XCI6XHJcblx0XHRcdGlucHV0LnNldFZhbHVlKHZhbHVlKTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlIFwiTXdXaWRnZXRzTmFtZXNwYWNlc011bHRpc2VsZWN0V2lkZ2V0XCI6XHJcblx0XHRcdGlucHV0LmNsZWFySXRlbXMoKTtcclxuXHRcdFx0dmFsdWUuZm9yRWFjaChucyA9PlxyXG5cdFx0XHRcdGlucHV0LmFkZFRhZyhcclxuXHRcdFx0XHRcdG5zLnRvU3RyaW5nKCksXHJcblx0XHRcdFx0XHRucyA9PT0gMFxyXG5cdFx0XHRcdFx0XHQ/IFwiKE1haW4pXCJcclxuXHRcdFx0XHRcdFx0OiBjb25maWcubXcud2dGb3JtYXR0ZWROYW1lc3BhY2VzW25zXVxyXG5cdFx0XHRcdClcclxuXHRcdFx0KTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHR9XHJcblx0fVxyXG59O1xyXG5cclxuUHJlZnNGb3JtV2lkZ2V0LnByb3RvdHlwZS5nZXRQcmVmcyA9IGZ1bmN0aW9uKCkge1xyXG5cdHZhciBwcmVmcyA9IHt9O1xyXG5cdGZvciAobGV0IHByZWZOYW1lIGluIHRoaXMucHJlZmVyZW5jZXMgKSB7XHJcblx0XHRsZXQgaW5wdXQgPSB0aGlzLnByZWZlcmVuY2VzW3ByZWZOYW1lXS5pbnB1dDtcclxuXHRcdGxldCB2YWx1ZTtcclxuXHRcdHN3aXRjaCAoaW5wdXQuY29uc3RydWN0b3IubmFtZSkge1xyXG5cdFx0Y2FzZSBcIk9vVWlCdXR0b25TZWxlY3RXaWRnZXRcIjpcclxuXHRcdFx0dmFsdWUgPSBpbnB1dC5maW5kU2VsZWN0ZWRJdGVtKCkuZ2V0RGF0YSgpO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgXCJPb1VpVG9nZ2xlU3dpdGNoV2lkZ2V0XCI6XHJcblx0XHRcdHZhbHVlID0gaW5wdXQuZ2V0VmFsdWUoKTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlIFwiT29VaU51bWJlcklucHV0V2lkZ2V0XCI6XHJcblx0XHRcdHZhbHVlID0gTnVtYmVyKGlucHV0LmdldFZhbHVlKCkpOyAvLyB3aWRnZXQgdXNlcyBzdHJpbmdzLCBub3QgbnVtYmVycyFcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlIFwiTXdXaWRnZXRzTmFtZXNwYWNlc011bHRpc2VsZWN0V2lkZ2V0XCI6XHJcblx0XHRcdHZhbHVlID0gaW5wdXQuZ2V0VmFsdWUoKS5tYXAoTnVtYmVyKTsgLy8gd2lkZ2V0IHVzZXMgc3RyaW5ncywgbm90IG51bWJlcnMhXHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0fVxyXG5cdFx0cHJlZnNbcHJlZk5hbWVdID0gdmFsdWU7XHJcblx0fVxyXG5cdHJldHVybiBwcmVmcztcclxufTtcclxuXHJcblByZWZzRm9ybVdpZGdldC5wcm90b3R5cGUub25SZXNldENhY2hlQ2xpY2sgPSBmdW5jdGlvbigpIHtcclxuXHRPTy51aS5jb25maXJtKFwiQWZ0ZXIgcmVzZXRpbmcgY2FjaGUsIFJhdGVyIHdpbGwgY2xvc2UgYW5kIHJlc3RhcnQuIEFueSBjaGFuZ2VzIG1hZGUgd2lsbCBiZSBkaXNjYXJkZWQuXCIpXHJcblx0XHQudGhlbihjb25maXJtZWQgPT4ge1xyXG5cdFx0XHRpZiAoY29uZmlybWVkKSB7IFxyXG5cdFx0XHRcdHRoaXMuZW1pdChcInJlc2V0Q2FjaGVcIik7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgUHJlZnNGb3JtV2lkZ2V0O1xyXG4vLyA8L25vd2lraT4iLCIvLyA8bm93aWtpPlxyXG5cclxudmFyIFN1Z2dlc3Rpb25Mb29rdXBUZXh0SW5wdXRXaWRnZXQgPSBmdW5jdGlvbiBTdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0KCBjb25maWcgKSB7XHJcblx0T08udWkuVGV4dElucHV0V2lkZ2V0LmNhbGwoIHRoaXMsIGNvbmZpZyApO1xyXG5cdE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQuY2FsbCggdGhpcywgY29uZmlnICk7XHJcblx0dGhpcy5zdWdnZXN0aW9ucyA9IEFycmF5LmlzQXJyYXkoY29uZmlnLnN1Z2dlc3Rpb25zKSA/IGNvbmZpZy5zdWdnZXN0aW9ucyA6IFtdO1xyXG5cdHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoXCJyYXRlci1zdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0XCIpO1xyXG59O1xyXG5PTy5pbmhlcml0Q2xhc3MoIFN1Z2dlc3Rpb25Mb29rdXBUZXh0SW5wdXRXaWRnZXQsIE9PLnVpLlRleHRJbnB1dFdpZGdldCApO1xyXG5PTy5taXhpbkNsYXNzKCBTdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0LCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50ICk7XHJcblxyXG4vLyBTZXQgc3VnZ2VzdGlvbi4gcGFyYW06IE9iamVjdFtdIHdpdGggb2JqZWN0cyBvZiB0aGUgZm9ybSB7IGRhdGE6IC4uLiAsIGxhYmVsOiAuLi4gfVxyXG5TdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0LnByb3RvdHlwZS5zZXRTdWdnZXN0aW9ucyA9IGZ1bmN0aW9uKHN1Z2dlc3Rpb25zKSB7XHJcblx0aWYgKCFBcnJheS5pc0FycmF5KHN1Z2dlc3Rpb25zKSkge1xyXG5cdFx0aWYgKHN1Z2dlc3Rpb25zICE9IG51bGwpIHtcclxuXHRcdFx0Y29uc29sZS53YXJuKFwiW1JhdGVyXSBTdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0LnByb3RvdHlwZS5zZXRTdWdnZXN0aW9ucyBjYWxsZWQgd2l0aCBhIG5vbi1hcnJheSB2YWx1ZTpcIiwgc3VnZ2VzdGlvbnMpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHR0aGlzLnN1Z2dlc3Rpb25zID0gc3VnZ2VzdGlvbnM7XHJcbn07XHJcblxyXG4vLyBSZXR1cm5zIGRhdGEsIGFzIGEgcmVzb2x1dGlvbiB0byBhIHByb21pc2UsIHRvIGJlIHBhc3NlZCB0byAjZ2V0TG9va3VwTWVudU9wdGlvbnNGcm9tRGF0YVxyXG5TdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0LnByb3RvdHlwZS5nZXRMb29rdXBSZXF1ZXN0ID0gZnVuY3Rpb24gKCkge1xyXG5cdHZhciBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKS5yZXNvbHZlKG5ldyBSZWdFeHAoXCJcXFxcYlwiICsgbXcudXRpbC5lc2NhcGVSZWdFeHAodGhpcy5nZXRWYWx1ZSgpKSwgXCJpXCIpKTtcclxuXHRyZXR1cm4gZGVmZXJyZWQucHJvbWlzZSggeyBhYm9ydDogZnVuY3Rpb24gKCkge30gfSApO1xyXG59O1xyXG5cclxuLy8gPz8/XHJcblN1Z2dlc3Rpb25Mb29rdXBUZXh0SW5wdXRXaWRnZXQucHJvdG90eXBlLmdldExvb2t1cENhY2hlRGF0YUZyb21SZXNwb25zZSA9IGZ1bmN0aW9uICggcmVzcG9uc2UgKSB7XHJcblx0cmV0dXJuIHJlc3BvbnNlIHx8IFtdO1xyXG59O1xyXG5cclxuLy8gSXMgcGFzc2VkIGRhdGEgZnJvbSAjZ2V0TG9va3VwUmVxdWVzdCwgcmV0dXJucyBhbiBhcnJheSBvZiBtZW51IGl0ZW0gd2lkZ2V0cyBcclxuU3VnZ2VzdGlvbkxvb2t1cFRleHRJbnB1dFdpZGdldC5wcm90b3R5cGUuZ2V0TG9va3VwTWVudU9wdGlvbnNGcm9tRGF0YSA9IGZ1bmN0aW9uICggcGF0dGVybiApIHtcclxuXHR2YXIgbGFiZWxNYXRjaGVzSW5wdXRWYWwgPSBmdW5jdGlvbihzdWdnZXN0aW9uSXRlbSkge1xyXG5cdFx0cmV0dXJuIHBhdHRlcm4udGVzdChzdWdnZXN0aW9uSXRlbS5sYWJlbCkgfHwgKCAhc3VnZ2VzdGlvbkl0ZW0ubGFiZWwgJiYgcGF0dGVybi50ZXN0KHN1Z2dlc3Rpb25JdGVtLmRhdGEpICk7XHJcblx0fTtcclxuXHR2YXIgbWFrZU1lbnVPcHRpb25XaWRnZXQgPSBmdW5jdGlvbihvcHRpb25JdGVtKSB7XHJcblx0XHRyZXR1cm4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoIHtcclxuXHRcdFx0ZGF0YTogb3B0aW9uSXRlbS5kYXRhLFxyXG5cdFx0XHRsYWJlbDogb3B0aW9uSXRlbS5sYWJlbCB8fCBvcHRpb25JdGVtLmRhdGFcclxuXHRcdH0gKTtcclxuXHR9O1xyXG5cdHJldHVybiB0aGlzLnN1Z2dlc3Rpb25zLmZpbHRlcihsYWJlbE1hdGNoZXNJbnB1dFZhbCkubWFwKG1ha2VNZW51T3B0aW9uV2lkZ2V0KTtcclxufTtcclxuXHJcbi8vIEV4dGVuZCBvbkxvb2t1cE1lbnVDaG9vc2UgbWV0aG9kIHRvIGVtaXQgYW4gY2hvb3NlIGV2ZW50XHJcblN1Z2dlc3Rpb25Mb29rdXBUZXh0SW5wdXRXaWRnZXQucHJvdG90eXBlLm9uTG9va3VwTWVudUNob29zZSA9IGZ1bmN0aW9uICggaXRlbSApIHtcclxuXHQvLyBHZXQgZGF0YVxyXG5cdGNvbnN0IGl0ZW1EYXRhID0gaXRlbS5nZXREYXRhKCk7XHJcblx0Ly8gU2ltcGxpZnkgaXRlbSBkYXRhIGlmIGl0IGlzIGFuIG9iamVjdCB3aXRoIGEgbmFtZSBwcm9wZXJ0eVxyXG5cdGlmIChpdGVtRGF0YSAmJiBpdGVtRGF0YS5uYW1lKSB7XHJcblx0XHRpdGVtLnNldERhdGEoaXRlbURhdGEubmFtZSk7XHJcblx0fVxyXG5cdC8vIEZpcnN0IGJsdXIgdGhlIGlucHV0LCB0byBwcmV2ZW50IHRoZSBtZW51IHBvcHBpbmcgYmFjayB1cFxyXG5cdHRoaXMuJGlucHV0LmJsdXIoKTtcclxuXHRPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LnByb3RvdHlwZS5vbkxvb2t1cE1lbnVDaG9vc2UuY2FsbCh0aGlzLCBpdGVtKTtcclxuXHR0aGlzLmVtaXQoXCJjaG9vc2VcIiwgaXRlbURhdGEgKTtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN1Z2dlc3Rpb25Mb29rdXBUZXh0SW5wdXRXaWRnZXQ7XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCBhcHBDb25maWcgZnJvbSBcIi4uLy4uL2NvbmZpZ1wiO1xyXG5pbXBvcnQgU3VnZ2VzdGlvbkxvb2t1cFRleHRJbnB1dFdpZGdldCBmcm9tIFwiLi9TdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0XCI7XHJcbmltcG9ydCB7Z2V0QmFubmVyTmFtZXN9IGZyb20gXCIuLi8uLi9nZXRCYW5uZXJzXCI7XHJcbi8vIDxub3dpa2k+XHJcblxyXG5mdW5jdGlvbiBUb3BCYXJXaWRnZXQoIGNvbmZpZyApIHtcclxuXHQvLyBDb25maWd1cmF0aW9uIGluaXRpYWxpemF0aW9uXHJcblx0Y29uZmlnID0gJC5leHRlbmQoXHJcblx0XHR7XHJcblx0XHRcdGV4cGFuZGVkOiBmYWxzZSxcclxuXHRcdFx0ZnJhbWVkOiBmYWxzZSxcclxuXHRcdFx0cGFkZGVkOiBmYWxzZVxyXG5cdFx0fSxcclxuXHRcdGNvbmZpZyB8fCB7fVxyXG5cdCk7XHJcblx0Ly8gQ2FsbCBwYXJlbnQgY29uc3RydWN0b3JcclxuXHRUb3BCYXJXaWRnZXQuc3VwZXIuY2FsbCggdGhpcywgY29uZmlnICk7XHJcblx0dGhpcy4kb3ZlcmxheSA9IGNvbmZpZy4kb3ZlcmxheTtcclxuICAgIFxyXG5cdC8vIFNlYXJjaCBib3hcclxuXHR0aGlzLnNlYXJjaEJveCA9IG5ldyBTdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0KCB7XHJcblx0XHRwbGFjZWhvbGRlcjogXCJBZGQgYSBXaWtpUHJvamVjdC4uLlwiLFxyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8ZGl2IHN0eWxlPSdkaXNwbGF5OmlubGluZS1ibG9jazsgbWFyZ2luOjAgLTFweDsgd2lkdGg6Y2FsYygxMDAlIC0gNTVweCk7Jz5cIiksXHJcblx0XHQkb3ZlcmxheTogdGhpcy4kb3ZlcmxheSxcclxuXHR9ICk7XHJcblx0Z2V0QmFubmVyTmFtZXMoKVxyXG5cdFx0LnRoZW4oYmFubmVycyA9PiBbXHJcblx0XHRcdC4uLmJhbm5lcnMud2l0aFJhdGluZ3MubWFwKGJhbm5lck5hbWUgPT4gKHtcclxuXHRcdFx0XHRsYWJlbDogYmFubmVyTmFtZS5yZXBsYWNlKFwiV2lraVByb2plY3QgXCIsIFwiXCIpLFxyXG5cdFx0XHRcdGRhdGE6IHtcclxuXHRcdFx0XHRcdG5hbWU6IGJhbm5lck5hbWVcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pKSxcclxuXHRcdFx0Li4uYmFubmVycy53aXRob3V0UmF0aW5ncy5tYXAoYmFubmVyTmFtZSA9PiAoe1xyXG5cdFx0XHRcdGxhYmVsOiBiYW5uZXJOYW1lLnJlcGxhY2UoXCJXaWtpUHJvamVjdCBcIiwgXCJcIiksXHJcblx0XHRcdFx0ZGF0YToge1xyXG5cdFx0XHRcdFx0bmFtZTogYmFubmVyTmFtZSxcclxuXHRcdFx0XHRcdHdpdGhvdXRSYXRpbmdzOiB0cnVlXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KSksXHJcblx0XHRcdC4uLmJhbm5lcnMud3JhcHBlcnMubWFwKGJhbm5lck5hbWUgPT4gKHtcclxuXHRcdFx0XHRsYWJlbDogYmFubmVyTmFtZS5yZXBsYWNlKFwiV2lraVByb2plY3QgXCIsIFwiXCIpICsgXCIgW3RlbXBsYXRlIHdyYXBwZXJdXCIsXHJcblx0XHRcdFx0ZGF0YToge1xyXG5cdFx0XHRcdFx0bmFtZTogYmFubmVyTmFtZSxcclxuXHRcdFx0XHRcdHdyYXBwZXI6IHRydWVcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pKSxcclxuXHRcdFx0Li4uYmFubmVycy5ub3RXUEJNLm1hcChiYW5uZXJOYW1lID0+ICh7XHJcblx0XHRcdFx0bGFiZWw6IGJhbm5lck5hbWUucmVwbGFjZShcIldpa2lQcm9qZWN0IFwiLCBcIlwiKSxcclxuXHRcdFx0XHRkYXRhOiB7XHJcblx0XHRcdFx0XHRuYW1lOiBiYW5uZXJOYW1lXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KSksXHJcblx0XHRcdC4uLmJhbm5lcnMuaW5hY3RpdmUubWFwKGJhbm5lck5hbWUgPT4gKHtcclxuXHRcdFx0XHRsYWJlbDogYmFubmVyTmFtZS5yZXBsYWNlKFwiV2lraVByb2plY3QgXCIsIFwiXCIpICsgXCIgW2luYWN0aXZlXVwiLFxyXG5cdFx0XHRcdGRhdGE6IHtcclxuXHRcdFx0XHRcdG5hbWU6IGJhbm5lck5hbWUsXHJcblx0XHRcdFx0XHR3aXRob3V0UmF0aW5nczogdHJ1ZVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSkpLFxyXG5cdFx0XHQuLi5iYW5uZXJzLndpci5tYXAoYmFubmVyTmFtZSA9PiAoe1xyXG5cdFx0XHRcdGxhYmVsOiBiYW5uZXJOYW1lICsgXCIgW1dvbWVuIEluIFJlZCBtZWV0dXAvaW5pdGlhdGl2ZV1cIixcclxuXHRcdFx0XHRkYXRhOiB7XHJcblx0XHRcdFx0XHRuYW1lOiBiYW5uZXJOYW1lLFxyXG5cdFx0XHRcdFx0d2l0aG91dFJhdGluZ3M6IHRydWVcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pKVxyXG5cdFx0XSlcclxuXHRcdC50aGVuKGJhbm5lck9wdGlvbnMgPT4gdGhpcy5zZWFyY2hCb3guc2V0U3VnZ2VzdGlvbnMoYmFubmVyT3B0aW9ucykpO1xyXG4gICAgXHJcblx0Ly8gQWRkIGJ1dHRvblxyXG5cdHRoaXMuYWRkQmFubmVyQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCgge1xyXG5cdFx0aWNvbjogXCJhZGRcIixcclxuXHRcdHRpdGxlOiBcIkFkZFwiLFxyXG5cdFx0ZmxhZ3M6IFwicHJvZ3Jlc3NpdmVcIixcclxuXHRcdCRlbGVtZW50OiAkKFwiPHNwYW4gc3R5bGU9J2Zsb2F0OnJpZ2h0O21hcmdpbjogMDt0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEycHgpOyc+XCIpLFxyXG5cdH0gKTtcclxuXHR2YXIgJHNlYXJjaENvbnRhaW5lciA9ICQoXCI8ZGl2IHN0eWxlPSdkaXNwbGF5OmlubGluZS1ibG9jazsgZmxleC1zaHJpbms6MTsgZmxleC1ncm93OjEwMDsgbWluLXdpZHRoOjI1MHB4OyB3aWR0aDo1MCU7Jz5cIilcclxuXHRcdC5hcHBlbmQodGhpcy5zZWFyY2hCb3guJGVsZW1lbnQsIHRoaXMuYWRkQmFubmVyQnV0dG9uLiRlbGVtZW50KTtcclxuXHJcblx0Ly8gU2V0IGFsbCBjbGFzc2VzL2ltcG9ydGFuY2VzXHJcblx0Ly8gaW4gdGhlIHN0eWxlIG9mIGEgcG9wdXAgYnV0dG9uIHdpdGggYSBtZW51IChpcyBhY3R1YWxseSBhIGRyb3Bkb3duIHdpdGggYSBoaWRkZW4gbGFiZWwsIGJlY2F1c2UgdGhhdCBtYWtlcyB0aGUgY29kaW5nIGVhc2llci4pXHJcblx0dGhpcy5zZXRBbGxEcm9wRG93biA9IG5ldyBPTy51aS5Ecm9wZG93bldpZGdldCgge1xyXG5cdFx0aWNvbjogXCJ0YWdcIixcclxuXHRcdGxhYmVsOiBcIlNldCBhbGwuLi5cIixcclxuXHRcdGludmlzaWJsZUxhYmVsOiB0cnVlLFxyXG5cdFx0bWVudToge1xyXG5cdFx0XHRpdGVtczogW1xyXG5cdFx0XHRcdG5ldyBPTy51aS5NZW51U2VjdGlvbk9wdGlvbldpZGdldCgge1xyXG5cdFx0XHRcdFx0bGFiZWw6IFwiQ2xhc3Nlc1wiXHJcblx0XHRcdFx0fSApLFxyXG5cdFx0XHRcdG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KCB7XHJcblx0XHRcdFx0XHRkYXRhOiB7Y2xhc3M6IG51bGx9LFxyXG5cdFx0XHRcdFx0bGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChcIjxzcGFuIHN0eWxlPVxcXCJjb2xvcjojNzc3XFxcIj4obm8gY2xhc3MpPC9zcGFuPlwiKVxyXG5cdFx0XHRcdH0gKSxcclxuXHRcdFx0XHQuLi5hcHBDb25maWcuYmFubmVyRGVmYXVsdHMuY2xhc3Nlcy5tYXAoY2xhc3NuYW1lID0+IG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KCB7XHJcblx0XHRcdFx0XHRkYXRhOiB7Y2xhc3M6IGNsYXNzbmFtZX0sXHJcblx0XHRcdFx0XHRsYWJlbDogY2xhc3NuYW1lXHJcblx0XHRcdFx0fSApXHJcblx0XHRcdFx0KSxcclxuXHRcdFx0XHRuZXcgT08udWkuTWVudVNlY3Rpb25PcHRpb25XaWRnZXQoIHtcclxuXHRcdFx0XHRcdGxhYmVsOiBcIkltcG9ydGFuY2VzXCJcclxuXHRcdFx0XHR9ICksXHJcblx0XHRcdFx0bmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoIHtcclxuXHRcdFx0XHRcdGRhdGE6IHtpbXBvcnRhbmNlOiBudWxsfSxcclxuXHRcdFx0XHRcdGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXCI8c3BhbiBzdHlsZT1cXFwiY29sb3I6Izc3N1xcXCI+KG5vIGltcG9ydGFuY2UpPC9zcGFuPlwiKVxyXG5cdFx0XHRcdH0gKSxcclxuXHRcdFx0XHQuLi5hcHBDb25maWcuYmFubmVyRGVmYXVsdHMuaW1wb3J0YW5jZXMubWFwKGltcG9ydGFuY2UgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoIHtcclxuXHRcdFx0XHRcdGRhdGE6IHtpbXBvcnRhbmNlOiBpbXBvcnRhbmNlfSxcclxuXHRcdFx0XHRcdGxhYmVsOiBpbXBvcnRhbmNlXHJcblx0XHRcdFx0fSApXHJcblx0XHRcdFx0KVxyXG5cdFx0XHRdXHJcblx0XHR9LFxyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8c3BhbiBzdHlsZT1cXFwid2lkdGg6YXV0bztkaXNwbGF5OmlubGluZS1ibG9jaztmbG9hdDpsZWZ0O21hcmdpbjowXFxcIiB0aXRsZT0nU2V0IGFsbC4uLic+XCIpLFxyXG5cdFx0JG92ZXJsYXk6IHRoaXMuJG92ZXJsYXksXHJcblx0fSApO1xyXG5cclxuXHQvLyBSZW1vdmUgYWxsIGJhbm5lcnMgYnV0dG9uXHJcblx0dGhpcy5yZW1vdmVBbGxCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KCB7XHJcblx0XHRpY29uOiBcInRyYXNoXCIsXHJcblx0XHR0aXRsZTogXCJSZW1vdmUgYWxsXCIsXHJcblx0XHRmbGFnczogXCJkZXN0cnVjdGl2ZVwiXHJcblx0fSApO1xyXG5cclxuXHQvLyBDbGVhciBhbGwgcGFyYW1ldGVycyBidXR0b25cclxuXHR0aGlzLmNsZWFyQWxsQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCgge1xyXG5cdFx0aWNvbjogXCJjYW5jZWxcIixcclxuXHRcdHRpdGxlOiBcIkNsZWFyIGFsbFwiLFxyXG5cdFx0ZmxhZ3M6IFwiZGVzdHJ1Y3RpdmVcIlxyXG5cdH0gKTtcclxuXHJcblx0Ly8gR3JvdXAgdGhlIGJ1dHRvbnMgdG9nZXRoZXJcclxuXHR0aGlzLm1lbnVCdXR0b25zID0gbmV3IE9PLnVpLkJ1dHRvbkdyb3VwV2lkZ2V0KCB7XHJcblx0XHRpdGVtczogW1xyXG5cdFx0XHR0aGlzLnJlbW92ZUFsbEJ1dHRvbixcclxuXHRcdFx0dGhpcy5jbGVhckFsbEJ1dHRvblxyXG5cdFx0XSxcclxuXHRcdCRlbGVtZW50OiAkKFwiPHNwYW4gc3R5bGU9J2ZsZXg6MSAwIGF1dG87Jz5cIiksXHJcblx0fSApO1xyXG5cdC8vIEluY2x1ZGUgdGhlIGRyb3Bkb3duIGluIHRoZSBncm91cFxyXG5cdHRoaXMubWVudUJ1dHRvbnMuJGVsZW1lbnQucHJlcGVuZCh0aGlzLnNldEFsbERyb3BEb3duLiRlbGVtZW50KTtcclxuXHJcblx0Ly8gUHV0IGV2ZXJ5dGhpbmcgaW50byBhIGxheW91dFxyXG5cdHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoXCJyYXRlci10b3BCYXJXaWRnZXRcIilcclxuXHRcdC5jc3Moe1xyXG5cdFx0XHRcInBvc2l0aW9uXCI6IFwiZml4ZWRcIixcclxuXHRcdFx0XCJ3aWR0aFwiOiBcIjEwMCVcIixcclxuXHRcdFx0XCJiYWNrZ3JvdW5kXCI6IFwiI2NjY1wiLFxyXG5cdFx0XHRcImRpc3BsYXlcIjogXCJmbGV4XCIsXHJcblx0XHRcdFwiZmxleC13cmFwXCI6IFwid3JhcFwiLFxyXG5cdFx0XHRcImp1c3RpZnktY29udGVudFwiOiBcInNwYWNlLWFyb3VuZFwiLFxyXG5cdFx0XHRcIm1hcmdpblwiOiBcIi0ycHggMCAwIDBcIlxyXG5cdFx0fSlcclxuXHRcdC5hcHBlbmQoXHJcblx0XHRcdCRzZWFyY2hDb250YWluZXIsXHJcblx0XHRcdHRoaXMubWVudUJ1dHRvbnMuJGVsZW1lbnRcclxuXHRcdCk7XHJcblxyXG5cdC8qIC0tLSBFdmVudCBoYW5kbGluZyAtLS0gKi9cclxuICAgIFxyXG5cdHRoaXMuc2VhcmNoQm94LmNvbm5lY3QodGhpcywge1xyXG5cdFx0XCJlbnRlclwiOiBcIm9uU2VhcmNoU2VsZWN0XCIsXHJcblx0XHRcImNob29zZVwiOiBcIm9uU2VhcmNoU2VsZWN0XCJcclxuXHR9KTtcclxuXHR0aGlzLmFkZEJhbm5lckJ1dHRvbi5jb25uZWN0KHRoaXMsIHtcImNsaWNrXCI6IFwib25TZWFyY2hTZWxlY3RcIn0pO1xyXG5cdHRoaXMuc2V0QWxsRHJvcERvd24uZ2V0TWVudSgpLmNvbm5lY3QodGhpcywge1wiY2hvb3NlXCI6IFwib25SYXRpbmdDaG9vc2VcIn0pO1xyXG5cdHRoaXMucmVtb3ZlQWxsQnV0dG9uLmNvbm5lY3QodGhpcywge1wiY2xpY2tcIjogXCJvblJlbW92ZUFsbENsaWNrXCJ9KTtcclxuXHR0aGlzLmNsZWFyQWxsQnV0dG9uLmNvbm5lY3QodGhpcywge1wiY2xpY2tcIjogXCJvbkNsZWFyQWxsQ2xpY2tcIn0pO1xyXG59XHJcbk9PLmluaGVyaXRDbGFzcyggVG9wQmFyV2lkZ2V0LCBPTy51aS5QYW5lbExheW91dCApO1xyXG5cclxuVG9wQmFyV2lkZ2V0LnByb3RvdHlwZS5vblNlYXJjaFNlbGVjdCA9IGZ1bmN0aW9uKGRhdGEpIHtcclxuXHR0aGlzLmVtaXQoXCJzZWFyY2hTZWxlY3RcIiwgZGF0YSk7XHJcbn07XHJcblxyXG5Ub3BCYXJXaWRnZXQucHJvdG90eXBlLm9uUmF0aW5nQ2hvb3NlID0gZnVuY3Rpb24oaXRlbSkge1xyXG5cdGNvbnN0IGRhdGEgPSBpdGVtLmdldERhdGEoKTtcclxuXHRpZiAoZGF0YS5jbGFzcyB8fCBkYXRhLmNsYXNzPT09bnVsbCkge1xyXG5cdFx0dGhpcy5lbWl0KFwic2V0Q2xhc3Nlc1wiLCBkYXRhLmNsYXNzKTtcclxuXHR9XHJcblx0aWYgKGRhdGEuaW1wb3J0YW5jZSB8fCBkYXRhLmltcG9ydGFuY2U9PT1udWxsKSB7XHJcblx0XHR0aGlzLmVtaXQoXCJzZXRJbXBvcnRhbmNlc1wiLCBkYXRhLmltcG9ydGFuY2UpO1xyXG5cdH1cclxufTtcclxuXHJcblRvcEJhcldpZGdldC5wcm90b3R5cGUub25SZW1vdmVBbGxDbGljayA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuZW1pdChcInJlbW92ZUFsbFwiKTtcclxufTtcclxuXHJcblRvcEJhcldpZGdldC5wcm90b3R5cGUub25DbGVhckFsbENsaWNrID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5lbWl0KFwiY2xlYXJBbGxcIik7XHJcbn07XHJcblxyXG5Ub3BCYXJXaWRnZXQucHJvdG90eXBlLnNldERpc2FibGVkID0gZnVuY3Rpb24oZGlzYWJsZSkge1xyXG5cdFtcclxuXHRcdHRoaXMuc2VhcmNoQm94LFxyXG5cdFx0dGhpcy5hZGRCYW5uZXJCdXR0b24sXHJcblx0XHR0aGlzLnNldEFsbERyb3BEb3duLFxyXG5cdFx0dGhpcy5yZW1vdmVBbGxCdXR0b24sXHJcblx0XHR0aGlzLmNsZWFyQWxsQnV0dG9uXHJcblx0XS5mb3JFYWNoKHdpZGdldCA9PiB3aWRnZXQuc2V0RGlzYWJsZWQoZGlzYWJsZSkpO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgVG9wQmFyV2lkZ2V0O1xyXG4vLyA8L25vd2lraT4iLCJpbXBvcnQgeyBtYWtlRXJyb3JNc2cgfSBmcm9tIFwiLi4vYXBpXCI7XHJcbi8vIDxub3dpa2k+XHJcblxyXG4vKiB2YXIgaW5jcmVtZW50UHJvZ3Jlc3NCeUludGVydmFsID0gZnVuY3Rpb24oKSB7XHJcblx0dmFyIGluY3JlbWVudEludGVydmFsRGVsYXkgPSAxMDA7XHJcblx0dmFyIGluY3JlbWVudEludGVydmFsQW1vdW50ID0gMC4xO1xyXG5cdHZhciBpbmNyZW1lbnRJbnRlcnZhbE1heHZhbCA9IDk4O1xyXG5cdHJldHVybiB3aW5kb3cuc2V0SW50ZXJ2YWwoXHJcblx0XHRpbmNyZW1lbnRQcm9ncmVzcyxcclxuXHRcdGluY3JlbWVudEludGVydmFsRGVsYXksXHJcblx0XHRpbmNyZW1lbnRJbnRlcnZhbEFtb3VudCxcclxuXHRcdGluY3JlbWVudEludGVydmFsTWF4dmFsXHJcblx0KTtcclxufTsgKi9cclxuXHJcbnZhciBMb2FkRGlhbG9nID0gZnVuY3Rpb24gTG9hZERpYWxvZyggY29uZmlnICkge1xyXG5cdExvYWREaWFsb2cuc3VwZXIuY2FsbCggdGhpcywgY29uZmlnICk7XHJcbn07XHJcbk9PLmluaGVyaXRDbGFzcyggTG9hZERpYWxvZywgT08udWkuRGlhbG9nICk7IFxyXG5cclxuTG9hZERpYWxvZy5zdGF0aWMubmFtZSA9IFwibG9hZERpYWxvZ1wiO1xyXG5Mb2FkRGlhbG9nLnN0YXRpYy50aXRsZSA9IFwiTG9hZGluZyBSYXRlci4uLlwiO1xyXG5cclxuLy8gQ3VzdG9taXplIHRoZSBpbml0aWFsaXplKCkgZnVuY3Rpb246IFRoaXMgaXMgd2hlcmUgdG8gYWRkIGNvbnRlbnQgdG8gdGhlIGRpYWxvZyBib2R5IGFuZCBzZXQgdXAgZXZlbnQgaGFuZGxlcnMuXHJcbkxvYWREaWFsb2cucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbiAoKSB7XHJcblx0Ly8gQ2FsbCB0aGUgcGFyZW50IG1ldGhvZC5cclxuXHRMb2FkRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwoIHRoaXMgKTtcclxuXHQvLyBDcmVhdGUgYSBsYXlvdXRcclxuXHR0aGlzLmNvbnRlbnQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoIHsgXHJcblx0XHRwYWRkZWQ6IHRydWUsXHJcblx0XHRleHBhbmRlZDogZmFsc2UgXHJcblx0fSApO1xyXG5cdC8vIENyZWF0ZSBjb250ZW50XHJcblx0dGhpcy5wcm9ncmVzc0JhciA9IG5ldyBPTy51aS5Qcm9ncmVzc0JhcldpZGdldCgge1xyXG5cdFx0cHJvZ3Jlc3M6IDFcclxuXHR9ICk7XHJcblx0dGhpcy5zZXR1cHRhc2tzID0gW1xyXG5cdFx0bmV3IE9PLnVpLkxhYmVsV2lkZ2V0KCB7XHJcblx0XHRcdGxhYmVsOiBcIkxvYWRpbmcgeW91ciBSYXRlciBwcmVmZXJlbmNlcy4uLlwiLFxyXG5cdFx0XHQkZWxlbWVudDogJChcIjxwIHN0eWxlPVxcXCJkaXNwbGF5OmJsb2NrXFxcIj5cIilcclxuXHRcdH0pLFxyXG5cdFx0bmV3IE9PLnVpLkxhYmVsV2lkZ2V0KCB7XHJcblx0XHRcdGxhYmVsOiBcIkxvYWRpbmcgbGlzdCBvZiBwcm9qZWN0IGJhbm5lcnMuLi5cIixcclxuXHRcdFx0JGVsZW1lbnQ6ICQoXCI8cCBzdHlsZT1cXFwiZGlzcGxheTpibG9ja1xcXCI+XCIpXHJcblx0XHR9KSxcclxuXHRcdG5ldyBPTy51aS5MYWJlbFdpZGdldCgge1xyXG5cdFx0XHRsYWJlbDogXCJMb2FkaW5nIHRhbGtwYWdlIHdpa2l0ZXh0Li4uXCIsXHJcblx0XHRcdCRlbGVtZW50OiAkKFwiPHAgc3R5bGU9XFxcImRpc3BsYXk6YmxvY2tcXFwiPlwiKVxyXG5cdFx0fSksXHJcblx0XHRuZXcgT08udWkuTGFiZWxXaWRnZXQoIHtcclxuXHRcdFx0bGFiZWw6IFwiUGFyc2luZyB0YWxrcGFnZSB0ZW1wbGF0ZXMuLi5cIixcclxuXHRcdFx0JGVsZW1lbnQ6ICQoXCI8cCBzdHlsZT1cXFwiZGlzcGxheTpibG9ja1xcXCI+XCIpXHJcblx0XHR9KSxcclxuXHRcdG5ldyBPTy51aS5MYWJlbFdpZGdldCgge1xyXG5cdFx0XHRsYWJlbDogXCJHZXR0aW5nIHRlbXBsYXRlcycgcGFyYW1ldGVyIGRhdGEuLi5cIixcclxuXHRcdFx0JGVsZW1lbnQ6ICQoXCI8cCBzdHlsZT1cXFwiZGlzcGxheTpibG9ja1xcXCI+XCIpXHJcblx0XHR9KSxcclxuXHRcdG5ldyBPTy51aS5MYWJlbFdpZGdldCgge1xyXG5cdFx0XHRsYWJlbDogXCJDaGVja2luZyBzdWJqZWN0IHBhZ2UuLi5cIixcclxuXHRcdFx0JGVsZW1lbnQ6ICQoXCI8cCBzdHlsZT1cXFwiZGlzcGxheTpibG9ja1xcXCI+XCIpXHJcblx0XHR9KSxcclxuXHRcdG5ldyBPTy51aS5MYWJlbFdpZGdldCgge1xyXG5cdFx0XHRsYWJlbDogXCJSZXRyaWV2aW5nIHF1YWxpdHkgcHJlZGljdGlvbi4uLlwiLFxyXG5cdFx0XHQkZWxlbWVudDogJChcIjxwIHN0eWxlPVxcXCJkaXNwbGF5OmJsb2NrXFxcIj5cIilcclxuXHRcdH0pLnRvZ2dsZSgpLFxyXG5cdF07XHJcblx0dGhpcy5jbG9zZUJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoIHtcclxuXHRcdGxhYmVsOiBcIkNsb3NlXCJcclxuXHR9KS50b2dnbGUoKTtcclxuXHR0aGlzLnNldHVwUHJvbWlzZXMgPSBbXTtcclxuXHJcblx0Ly8gQXBwZW5kIGNvbnRlbnQgdG8gbGF5b3V0XHJcblx0dGhpcy5jb250ZW50LiRlbGVtZW50LmFwcGVuZChcclxuXHRcdHRoaXMucHJvZ3Jlc3NCYXIuJGVsZW1lbnQsXHJcblx0XHQobmV3IE9PLnVpLkxhYmVsV2lkZ2V0KCB7XHJcblx0XHRcdGxhYmVsOiBcIkluaXRpYWxpc2luZzpcIixcclxuXHRcdFx0JGVsZW1lbnQ6ICQoXCI8c3Ryb25nIHN0eWxlPVxcXCJkaXNwbGF5OmJsb2NrXFxcIj5cIilcclxuXHRcdH0pKS4kZWxlbWVudCxcclxuXHRcdC4uLnRoaXMuc2V0dXB0YXNrcy5tYXAod2lkZ2V0ID0+IHdpZGdldC4kZWxlbWVudCksXHJcblx0XHR0aGlzLmNsb3NlQnV0dG9uLiRlbGVtZW50XHJcblx0KTtcclxuXHJcblx0Ly8gQXBwZW5kIGxheW91dCB0byBkaWFsb2dcclxuXHR0aGlzLiRib2R5LmFwcGVuZCggdGhpcy5jb250ZW50LiRlbGVtZW50ICk7XHJcblxyXG5cdC8vIENvbm5lY3QgZXZlbnRzIHRvIGhhbmRsZXJzXHJcblx0dGhpcy5jbG9zZUJ1dHRvbi5jb25uZWN0KCB0aGlzLCB7IFwiY2xpY2tcIjogXCJvbkNsb3NlQnV0dG9uQ2xpY2tcIiB9ICk7XHJcbn07XHJcblxyXG5Mb2FkRGlhbG9nLnByb3RvdHlwZS5vbkNsb3NlQnV0dG9uQ2xpY2sgPSBmdW5jdGlvbigpIHtcclxuXHQvLyBDbG9zZSB0aGlzIGRpYWxvZywgd2l0aG91dCBwYXNzaW5nIGFueSBkYXRhXHJcblx0dGhpcy5jbG9zZSgpO1xyXG59O1xyXG5cclxuLy8gT3ZlcnJpZGUgdGhlIGdldEJvZHlIZWlnaHQoKSBtZXRob2QgdG8gc3BlY2lmeSBhIGN1c3RvbSBoZWlnaHQgKG9yIGRvbid0IHRvIHVzZSB0aGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgaGVpZ2h0KS5cclxuTG9hZERpYWxvZy5wcm90b3R5cGUuZ2V0Qm9keUhlaWdodCA9IGZ1bmN0aW9uICgpIHtcclxuXHRyZXR1cm4gdGhpcy5jb250ZW50LiRlbGVtZW50Lm91dGVySGVpZ2h0KCB0cnVlICk7XHJcbn07XHJcblxyXG5Mb2FkRGlhbG9nLnByb3RvdHlwZS5pbmNyZW1lbnRQcm9ncmVzcyA9IGZ1bmN0aW9uKGFtb3VudCwgbWF4aW11bSkge1xyXG5cdHZhciBwcmlvclByb2dyZXNzID0gdGhpcy5wcm9ncmVzc0Jhci5nZXRQcm9ncmVzcygpO1xyXG5cdHZhciBpbmNyZW1lbnRlZFByb2dyZXNzID0gTWF0aC5taW4obWF4aW11bSB8fCAxMDAsIHByaW9yUHJvZ3Jlc3MgKyBhbW91bnQpO1xyXG5cdHRoaXMucHJvZ3Jlc3NCYXIuc2V0UHJvZ3Jlc3MoaW5jcmVtZW50ZWRQcm9ncmVzcyk7XHJcbn07XHJcblxyXG5Mb2FkRGlhbG9nLnByb3RvdHlwZS5hZGRUYXNrUHJvbWlzZUhhbmRsZXJzID0gZnVuY3Rpb24odGFza1Byb21pc2VzKSB7XHJcblx0dmFyIG9uVGFza0RvbmUgPSBpbmRleCA9PiB7XHJcblx0XHQvLyBBZGQgXCJEb25lIVwiIHRvIGxhYmVsXHJcblx0XHR2YXIgd2lkZ2V0ID0gdGhpcy5zZXR1cHRhc2tzW2luZGV4XTtcclxuXHRcdHdpZGdldC5zZXRMYWJlbCh3aWRnZXQuZ2V0TGFiZWwoKSArIFwiIERvbmUhXCIpO1xyXG5cdFx0Ly8gSW5jcmVtZW50IHN0YXR1cyBiYXIuIFNob3cgYSBzbW9vdGggdHJhbnNpdGlvbiBieVxyXG5cdFx0Ly8gdXNpbmcgc21hbGwgc3RlcHMgb3ZlciBhIHNob3J0IGR1cmF0aW9uLlxyXG5cdFx0dmFyIHRvdGFsSW5jcmVtZW50ID0gMTAwIC8gdGhpcy5zZXR1cHRhc2tzLmxlbmd0aDsgLy8gcGVyY2VudFxyXG5cdFx0dmFyIHRvdGFsVGltZSA9IDQwMDsgLy8gbWlsbGlzZWNvbmRzXHJcblx0XHR2YXIgdG90YWxTdGVwcyA9IDEwO1xyXG5cdFx0dmFyIGluY3JlbWVudFBlclN0ZXAgPSB0b3RhbEluY3JlbWVudCAvIHRvdGFsU3RlcHM7XHJcblxyXG5cdFx0Zm9yICggdmFyIHN0ZXA9MDsgc3RlcCA8IHRvdGFsU3RlcHM7IHN0ZXArKykge1xyXG5cdFx0XHR3aW5kb3cuc2V0VGltZW91dChcclxuXHRcdFx0XHR0aGlzLmluY3JlbWVudFByb2dyZXNzLmJpbmQodGhpcyksXHJcblx0XHRcdFx0dG90YWxUaW1lICogc3RlcCAvIHRvdGFsU3RlcHMsXHJcblx0XHRcdFx0aW5jcmVtZW50UGVyU3RlcFxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cdH07XHJcblx0dmFyIG9uVGFza0Vycm9yID0gKGluZGV4LCBjb2RlLCBpbmZvKSA9PiB7XHJcblx0XHR2YXIgd2lkZ2V0ID0gdGhpcy5zZXR1cHRhc2tzW2luZGV4XTtcclxuXHRcdHdpZGdldC5zZXRMYWJlbChcclxuXHRcdFx0d2lkZ2V0LmdldExhYmVsKCkgKyBcIiBGYWlsZWQuIFwiICsgbWFrZUVycm9yTXNnKGNvZGUsIGluZm8pXHJcblx0XHQpO1xyXG5cdFx0dGhpcy5jbG9zZUJ1dHRvbi50b2dnbGUodHJ1ZSk7XHJcblx0XHR0aGlzLnVwZGF0ZVNpemUoKTtcclxuXHR9O1xyXG5cdHRhc2tQcm9taXNlcy5mb3JFYWNoKGZ1bmN0aW9uKHByb21pc2UsIGluZGV4KSB7XHJcblx0XHRwcm9taXNlLnRoZW4oXHJcblx0XHRcdCgpID0+IG9uVGFza0RvbmUoaW5kZXgpLFxyXG5cdFx0XHQoY29kZSwgaW5mbykgPT4gb25UYXNrRXJyb3IoaW5kZXgsIGNvZGUsIGluZm8pXHJcblx0XHQpO1xyXG5cdH0pO1xyXG59O1xyXG5cclxuLy8gVXNlIGdldFNldHVwUHJvY2VzcygpIHRvIHNldCB1cCB0aGUgd2luZG93IHdpdGggZGF0YSBwYXNzZWQgdG8gaXQgYXQgdGhlIHRpbWUgXHJcbi8vIG9mIG9wZW5pbmdcclxuTG9hZERpYWxvZy5wcm90b3R5cGUuZ2V0U2V0dXBQcm9jZXNzID0gZnVuY3Rpb24gKCBkYXRhICkge1xyXG5cdGRhdGEgPSBkYXRhIHx8IHt9O1xyXG5cdHJldHVybiBMb2FkRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRTZXR1cFByb2Nlc3MuY2FsbCggdGhpcywgZGF0YSApXHJcblx0XHQubmV4dCggKCkgPT4ge1xyXG5cdFx0XHR2YXIgc2hvd09yZXNUYXNrID0gISFkYXRhLm9yZXM7XHJcblx0XHRcdHRoaXMuc2V0dXB0YXNrc1s2XS50b2dnbGUoc2hvd09yZXNUYXNrKTtcclxuXHRcdFx0dmFyIHRhc2tQcm9taXNlcyA9IGRhdGEub3JlcyA/IGRhdGEucHJvbWlzZXMgOiBkYXRhLnByb21pc2VzLnNsaWNlKDAsIC0xKTtcclxuXHRcdFx0ZGF0YS5pc09wZW5lZC50aGVuKCgpID0+IHRoaXMuYWRkVGFza1Byb21pc2VIYW5kbGVycyh0YXNrUHJvbWlzZXMpKTtcclxuXHRcdH0sIHRoaXMgKTtcclxufTtcclxuXHJcbi8vIFByZXZlbnQgd2luZG93IGZyb20gY2xvc2luZyB0b28gcXVpY2tseSwgdXNpbmcgZ2V0SG9sZFByb2Nlc3MoKVxyXG5Mb2FkRGlhbG9nLnByb3RvdHlwZS5nZXRIb2xkUHJvY2VzcyA9IGZ1bmN0aW9uICggZGF0YSApIHtcclxuXHRkYXRhID0gZGF0YSB8fCB7fTtcclxuXHRpZiAoZGF0YS5zdWNjZXNzKSB7XHJcblx0XHQvLyBXYWl0IGEgYml0IGJlZm9yZSBwcm9jZXNzaW5nIHRoZSBjbG9zZSwgd2hpY2ggaGFwcGVucyBhdXRvbWF0aWNhbGx5XHJcblx0XHRyZXR1cm4gTG9hZERpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0SG9sZFByb2Nlc3MuY2FsbCggdGhpcywgZGF0YSApXHJcblx0XHRcdC5uZXh0KDgwMCk7XHJcblx0fVxyXG5cdC8vIE5vIG5lZWQgdG8gd2FpdCBpZiBjbG9zZWQgbWFudWFsbHlcclxuXHRyZXR1cm4gTG9hZERpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0SG9sZFByb2Nlc3MuY2FsbCggdGhpcywgZGF0YSApO1xyXG59O1xyXG5cclxuLy8gVXNlIHRoZSBnZXRUZWFyZG93blByb2Nlc3MoKSBtZXRob2QgdG8gcGVyZm9ybSBhY3Rpb25zIHdoZW5ldmVyIHRoZSBkaWFsb2cgaXMgY2xvc2VkLiBcclxuTG9hZERpYWxvZy5wcm90b3R5cGUuZ2V0VGVhcmRvd25Qcm9jZXNzID0gZnVuY3Rpb24gKCBkYXRhICkge1xyXG5cdHJldHVybiBMb2FkRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRUZWFyZG93blByb2Nlc3MuY2FsbCggdGhpcywgZGF0YSApXHJcblx0XHQuZmlyc3QoICgpID0+IHtcclxuXHRcdC8vIFBlcmZvcm0gY2xlYW51cDogcmVzZXQgbGFiZWxzXHJcblx0XHRcdHRoaXMuc2V0dXB0YXNrcy5mb3JFYWNoKCBzZXR1cHRhc2sgPT4ge1xyXG5cdFx0XHRcdHZhciBjdXJyZW50TGFiZWwgPSBzZXR1cHRhc2suZ2V0TGFiZWwoKTtcclxuXHRcdFx0XHRzZXR1cHRhc2suc2V0TGFiZWwoXHJcblx0XHRcdFx0XHRjdXJyZW50TGFiZWwuc2xpY2UoMCwgY3VycmVudExhYmVsLmluZGV4T2YoXCIuLi5cIikrMylcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9ICk7XHJcblx0XHR9LCB0aGlzICk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBMb2FkRGlhbG9nO1xyXG4vLyA8L25vd2lraT4iLCJpbXBvcnQgQmFubmVyV2lkZ2V0IGZyb20gXCIuL0NvbXBvbmVudHMvQmFubmVyV2lkZ2V0XCI7XHJcbmltcG9ydCBCYW5uZXJMaXN0V2lkZ2V0IGZyb20gXCIuL0NvbXBvbmVudHMvQmFubmVyTGlzdFdpZGdldFwiO1xyXG5pbXBvcnQgYXBwQ29uZmlnIGZyb20gXCIuLi9jb25maWdcIjtcclxuaW1wb3J0IEFQSSwgeyBtYWtlRXJyb3JNc2cgfSBmcm9tIFwiLi4vYXBpXCI7XHJcbmltcG9ydCBQcmVmc0Zvcm1XaWRnZXQgZnJvbSBcIi4vQ29tcG9uZW50cy9QcmVmc0Zvcm1XaWRnZXRcIjtcclxuaW1wb3J0IHsgc2V0UHJlZnMgYXMgQXBpU2V0UHJlZnMgfSBmcm9tIFwiLi4vcHJlZnNcIjtcclxuaW1wb3J0IHsgcGFyc2VUZW1wbGF0ZXMgfSBmcm9tIFwiLi4vVGVtcGxhdGVcIjtcclxuaW1wb3J0IFRvcEJhcldpZGdldCBmcm9tIFwiLi9Db21wb25lbnRzL1RvcEJhcldpZGdldFwiO1xyXG5pbXBvcnQgeyBmaWx0ZXJBbmRNYXAsIHVuaXF1ZUFycmF5IH0gZnJvbSBcIi4uL3V0aWxcIjtcclxuaW1wb3J0ICogYXMgY2FjaGUgZnJvbSBcIi4uL2NhY2hlXCI7XHJcbi8vIDxub3dpa2k+XHJcblxyXG5mdW5jdGlvbiBNYWluV2luZG93KCBjb25maWcgKSB7XHJcblx0TWFpbldpbmRvdy5zdXBlci5jYWxsKCB0aGlzLCBjb25maWcgKTtcclxufVxyXG5PTy5pbmhlcml0Q2xhc3MoIE1haW5XaW5kb3csIE9PLnVpLlByb2Nlc3NEaWFsb2cgKTtcclxuXHJcbk1haW5XaW5kb3cuc3RhdGljLm5hbWUgPSBcIm1haW5cIjtcclxuTWFpbldpbmRvdy5zdGF0aWMudGl0bGUgPSAkKFwiPHNwYW4+XCIpLmNzcyh7XCJmb250LXdlaWdodFwiOlwibm9ybWFsXCJ9KS5hcHBlbmQoXHJcblx0JChcIjxhPlwiKS5jc3Moe1wiZm9udC13ZWlnaHRcIjogXCJib2xkXCJ9KS5hdHRyKHtcImhyZWZcIjogbXcudXRpbC5nZXRVcmwoXCJXUDpSQVRFUlwiKSwgXCJ0YXJnZXRcIjogXCJfYmxhbmtcIn0pLnRleHQoXCJSYXRlclwiKSxcclxuXHRcIiAoXCIsXHJcblx0JChcIjxhPlwiKS5hdHRyKHtcImhyZWZcIjogbXcudXRpbC5nZXRVcmwoXCJXVDpSQVRFUlwiKSwgXCJ0YXJnZXRcIjogXCJfYmxhbmtcIn0pLnRleHQoXCJ0YWxrXCIpLFxyXG5cdFwiKSBcIixcclxuXHQkKFwiPHNwYW4+XCIpLmNzcyh7XCJmb250LXNpemVcIjpcIjkwJVwifSkudGV4dChcInZcIithcHBDb25maWcuc2NyaXB0LnZlcnNpb24pXHJcbik7XHJcbk1haW5XaW5kb3cuc3RhdGljLnNpemUgPSBcImxhcmdlXCI7XHJcbk1haW5XaW5kb3cuc3RhdGljLmFjdGlvbnMgPSBbXHJcblx0Ly8gUHJpbWFyeSAodG9wIHJpZ2h0KTpcclxuXHR7XHJcblx0XHRsYWJlbDogXCJYXCIsIC8vIG5vdCB1c2luZyBhbiBpY29uIHNpbmNlIGNvbG9yIGJlY29tZXMgaW52ZXJ0ZWQsIGkuZS4gd2hpdGUgb24gbGlnaHQtZ3JleVxyXG5cdFx0dGl0bGU6IFwiQ2xvc2UgKGFuZCBkaXNjYXJkIGFueSBjaGFuZ2VzKVwiLFxyXG5cdFx0ZmxhZ3M6IFwicHJpbWFyeVwiLFxyXG5cdFx0bW9kZXM6IFtcImVkaXRcIiwgXCJkaWZmXCIsIFwicHJldmlld1wiXSAvLyBhdmFpbGFibGUgd2hlbiBjdXJyZW50IG1vZGUgaXNuJ3QgXCJwcmVmc1wiXHJcblx0fSxcclxuXHQvLyBTYWZlICh0b3AgbGVmdClcclxuXHR7XHJcblx0XHRhY3Rpb246IFwic2hvd1ByZWZzXCIsXHJcblx0XHRmbGFnczogXCJzYWZlXCIsXHJcblx0XHRpY29uOiBcInNldHRpbmdzXCIsXHJcblx0XHR0aXRsZTogXCJQcmVmZXJlbmNlc1wiLFxyXG5cdFx0bW9kZXM6IFtcImVkaXRcIiwgXCJkaWZmXCIsIFwicHJldmlld1wiXSAvLyBhdmFpbGFibGUgd2hlbiBjdXJyZW50IG1vZGUgaXNuJ3QgXCJwcmVmc1wiXHJcblx0fSxcclxuXHQvLyBPdGhlcnMgKGJvdHRvbSlcclxuXHR7XHJcblx0XHRhY3Rpb246IFwic2F2ZVwiLFxyXG5cdFx0YWNjZXNzS2V5OiBcInNcIixcclxuXHRcdGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXCI8c3BhbiBzdHlsZT0ncGFkZGluZzowIDFlbTsnPlNhdmU8L3NwYW4+XCIpLFxyXG5cdFx0ZmxhZ3M6IFtcInByaW1hcnlcIiwgXCJwcm9ncmVzc2l2ZVwiXSxcclxuXHRcdG1vZGVzOiBbXCJlZGl0XCIsIFwiZGlmZlwiLCBcInByZXZpZXdcIl0gLy8gYXZhaWxhYmxlIHdoZW4gY3VycmVudCBtb2RlIGlzbid0IFwicHJlZnNcIlxyXG5cdH0sXHJcblx0e1xyXG5cdFx0YWN0aW9uOiBcInByZXZpZXdcIixcclxuXHRcdGFjY2Vzc0tleTogXCJwXCIsXHJcblx0XHRsYWJlbDogXCJTaG93IHByZXZpZXdcIixcclxuXHRcdG1vZGVzOiBbXCJlZGl0XCIsIFwiZGlmZlwiXSAvLyBhdmFpbGFibGUgd2hlbiBjdXJyZW50IG1vZGUgaXNuJ3QgXCJwcmV2aWV3XCIgb3IgXCJwcmVmc1wiXHJcblx0fSxcclxuXHR7XHJcblx0XHRhY3Rpb246IFwiY2hhbmdlc1wiLFxyXG5cdFx0YWNjZXNzS2V5OiBcInZcIixcclxuXHRcdGxhYmVsOiBcIlNob3cgY2hhbmdlc1wiLFxyXG5cdFx0bW9kZXM6IFtcImVkaXRcIiwgXCJwcmV2aWV3XCJdIC8vIGF2YWlsYWJsZSB3aGVuIGN1cnJlbnQgbW9kZSBpc24ndCBcImRpZmZcIiBvciBcInByZWZzXCJcclxuXHR9LFxyXG5cdHtcclxuXHRcdGFjdGlvbjogXCJiYWNrXCIsXHJcblx0XHRsYWJlbDogXCJCYWNrXCIsXHJcblx0XHRtb2RlczogW1wiZGlmZlwiLCBcInByZXZpZXdcIl0gLy8gYXZhaWxhYmxlIHdoZW4gY3VycmVudCBtb2RlIGlzIFwiZGlmZlwiIG9yIFwicHJlZnNcIlxyXG5cdH0sXHJcblx0XHJcblx0Ly8gXCJwcmVmc1wiIG1vZGUgb25seVxyXG5cdHtcclxuXHRcdGFjdGlvbjogXCJzYXZlUHJlZnNcIixcclxuXHRcdGxhYmVsOiBcIlVwZGF0ZVwiLFxyXG5cdFx0ZmxhZ3M6IFtcInByaW1hcnlcIiwgXCJwcm9ncmVzc2l2ZVwiXSxcclxuXHRcdG1vZGVzOiBcInByZWZzXCIgXHJcblx0fSxcclxuXHR7XHJcblx0XHRhY3Rpb246IFwiY2xvc2VQcmVmc1wiLFxyXG5cdFx0bGFiZWw6IFwiQ2FuY2VsXCIsXHJcblx0XHRmbGFnczogXCJzYWZlXCIsXHJcblx0XHRtb2RlczogXCJwcmVmc1wiXHJcblx0fVxyXG5dO1xyXG5cclxuLy8gQ3VzdG9taXplIHRoZSBpbml0aWFsaXplKCkgZnVuY3Rpb246IFRoaXMgaXMgd2hlcmUgdG8gYWRkIGNvbnRlbnQgdG8gdGhlIGRpYWxvZyBib2R5IGFuZCBzZXQgdXAgZXZlbnQgaGFuZGxlcnMuXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbiAoKSB7XHJcblx0Ly8gQ2FsbCB0aGUgcGFyZW50IG1ldGhvZC5cclxuXHRNYWluV2luZG93LnN1cGVyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwoIHRoaXMgKTtcclxuXHJcblx0LyogLS0tIFBSRUZTIC0tLSAqL1xyXG5cdHRoaXMucHJlZmVyZW5jZXMgPSBhcHBDb25maWcuZGVmYXVsdFByZWZzO1xyXG5cdFxyXG5cdC8qIC0tLSBUT1AgQkFSIC0tLSAqL1xyXG5cdHRoaXMudG9wQmFyID0gbmV3IFRvcEJhcldpZGdldCh7XHJcblx0XHQkb3ZlcmxheTogdGhpcy4kb3ZlcmxheVxyXG5cdH0gKTtcclxuXHR0aGlzLiRoZWFkLmNzcyh7XCJoZWlnaHRcIjpcIjczcHhcIn0pLmFwcGVuZCh0aGlzLnRvcEJhci4kZWxlbWVudCk7XHJcblxyXG5cdC8qIC0tLSBGT09URVIgLS0tICovXHJcblx0dGhpcy5vcmVzTGFiZWwgPSBuZXcgT08udWkuTGFiZWxXaWRnZXQoe1xyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8c3BhbiBzdHlsZT0nZmxvYXQ6cmlnaHQ7IHBhZGRpbmc6IDEwcHg7IG1heC13aWR0aDogNTAlOyB0ZXh0LWFsaWduOiBjZW50ZXI7Jz5cIiksXHJcblx0XHRsYWJlbDogJChcIjxzcGFuPlwiKS5hcHBlbmQoXHJcblx0XHRcdCQoXCI8YT5cIilcclxuXHRcdFx0XHQuYXR0cih7XCJocmVmXCI6bXcudXRpbC5nZXRVcmwoXCJtdzpPUkVTXCIpLCBcInRhcmdldFwiOlwiX2JsYW5rXCJ9KVxyXG5cdFx0XHRcdC5hcHBlbmQoXHJcblx0XHRcdFx0XHQkKFwiPGltZz5cIilcclxuXHRcdFx0XHRcdFx0LmNzcyh7XCJ2ZXJ0aWNhbC1hbGlnblwiOiBcInRleHQtYm90dG9tO1wifSlcclxuXHRcdFx0XHRcdFx0LmF0dHIoe1xyXG5cdFx0XHRcdFx0XHRcdFwic3JjXCI6IFwiLy91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy90aHVtYi81LzUxL09iamVjdGl2ZV9SZXZpc2lvbl9FdmFsdWF0aW9uX1NlcnZpY2VfbG9nby5zdmcvNDBweC1PYmplY3RpdmVfUmV2aXNpb25fRXZhbHVhdGlvbl9TZXJ2aWNlX2xvZ28uc3ZnLnBuZ1wiLFxyXG5cdFx0XHRcdFx0XHRcdFwidGl0bGVcIjogXCJNYWNoaW5lIHByZWRpY3RlZCBxdWFsaXR5IGZyb20gT1JFU1wiLFxyXG5cdFx0XHRcdFx0XHRcdFwiYWx0XCI6IFwiT1JFUyBsb2dvXCIsXHJcblx0XHRcdFx0XHRcdFx0XCJ3aWR0aFwiOiBcIjIwcHhcIixcclxuXHRcdFx0XHRcdFx0XHRcImhlaWdodFwiOiBcIjIwcHhcIlxyXG5cdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdCksXHJcblx0XHRcdFwiIFwiLFxyXG5cdFx0XHQkKFwiPHNwYW4gY2xhc3M9J29yZXNQcmVkaWN0aW9uJz5cIilcclxuXHRcdClcclxuXHR9KS50b2dnbGUoZmFsc2UpO1xyXG5cdHRoaXMucGFnZXR5cGVMYWJlbCA9IG5ldyBPTy51aS5MYWJlbFdpZGdldCh7XHJcblx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSdmbG9hdDpyaWdodDsgcGFkZGluZzogMTBweDsgbWF4LXdpZHRoOiAzMy4zMyU7IHRleHQtYWxpZ246IGNlbnRlcjsnPlwiKVxyXG5cdH0pLnRvZ2dsZShmYWxzZSk7XHJcblx0dGhpcy4kZm9vdC5wcmVwZW5kKHRoaXMub3Jlc0xhYmVsLiRlbGVtZW50LCB0aGlzLnBhZ2V0eXBlTGFiZWwuJGVsZW1lbnQpO1xyXG5cclxuXHQvKiAtLS0gQ09OVEVOVCBBUkVBIC0tLSAqL1xyXG5cclxuXHQvLyBCYW5uZXJzIGFkZGVkIGR5bmFtaWNhbGx5IHVwb24gb3BlbmluZywgc28ganVzdCBuZWVkIGEgbGF5b3V0IHdpdGggYW4gZW1wdHkgbGlzdFxyXG5cdHRoaXMuYmFubmVyTGlzdCA9IG5ldyBCYW5uZXJMaXN0V2lkZ2V0KHtcclxuXHRcdHByZWZlcmVuY2VzOiB0aGlzLnByZWZlcmVuY2VzXHJcblx0fSk7XHJcblx0dGhpcy5lZGl0TGF5b3V0ID0gbmV3IE9PLnVpLlBhbmVsTGF5b3V0KCB7XHJcblx0XHRwYWRkZWQ6IGZhbHNlLFxyXG5cdFx0ZXhwYW5kZWQ6IGZhbHNlLFxyXG5cdFx0JGNvbnRlbnQ6IHRoaXMuYmFubmVyTGlzdC4kZWxlbWVudFxyXG5cdH0gKTtcclxuXHJcblx0Ly8gUHJlZmVyZW5jZXMsIGZpbGxlZCBpbiB3aXRoIGN1cnJlbnQgcHJlZnMgdXBvbiBsb2FkaW5nLlxyXG5cdC8vIFRPRE86IE1ha2UgdGhpcyBpbnRvIGEgY29tcG9uZW50LCBhZGQgZmllbGRzIGFuZCBpbnB1dHNcclxuXHR0aGlzLnByZWZzRm9ybSA9IG5ldyBQcmVmc0Zvcm1XaWRnZXQoKTtcclxuXHR0aGlzLnByZWZzTGF5b3V0ID0gbmV3IE9PLnVpLlBhbmVsTGF5b3V0KCB7XHJcblx0XHRwYWRkZWQ6IHRydWUsXHJcblx0XHRleHBhbmRlZDogZmFsc2UsXHJcblx0XHQkY29udGVudDogdGhpcy5wcmVmc0Zvcm0uJGVsZW1lbnRcclxuXHR9ICk7XHJcblxyXG5cdC8vIFByZXZpZXcsIFNob3cgY2hhbmdlc1xyXG5cdHRoaXMucGFyc2VkQ29udGVudENvbnRhaW5lciA9IG5ldyBPTy51aS5GaWVsZHNldExheW91dCgge1xyXG5cdFx0bGFiZWw6IFwiUHJldmlld1wiXHJcblx0fSApO1xyXG5cdHRoaXMucGFyc2VkQ29udGVudFdpZGdldCA9IG5ldyBPTy51aS5MYWJlbFdpZGdldCgge2xhYmVsOiBcIlwiLFx0JGVsZW1lbnQ6JChcIjxkaXY+XCIpXHR9KTtcclxuXHR0aGlzLnBhcnNlZENvbnRlbnRDb250YWluZXIuYWRkSXRlbXMoW1xyXG5cdFx0bmV3IE9PLnVpLkZpZWxkTGF5b3V0KFxyXG5cdFx0XHR0aGlzLnBhcnNlZENvbnRlbnRXaWRnZXQsXHRcdFx0XHJcblx0XHRcdHsgYWxpZ246IFwidG9wXCIgfVxyXG5cdFx0KVxyXG5cdF0pO1xyXG5cdHRoaXMucGFyc2VkQ29udGVudExheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCgge1xyXG5cdFx0cGFkZGVkOiB0cnVlLFxyXG5cdFx0ZXhwYW5kZWQ6IGZhbHNlLFxyXG5cdFx0JGNvbnRlbnQ6IHRoaXMucGFyc2VkQ29udGVudENvbnRhaW5lci4kZWxlbWVudFxyXG5cdH0gKTtcclxuXHJcblx0dGhpcy5jb250ZW50QXJlYSA9IG5ldyBPTy51aS5TdGFja0xheW91dCgge1xyXG5cdFx0aXRlbXM6IFtcclxuXHRcdFx0dGhpcy5lZGl0TGF5b3V0LFxyXG5cdFx0XHR0aGlzLnByZWZzTGF5b3V0LFxyXG5cdFx0XHR0aGlzLnBhcnNlZENvbnRlbnRMYXlvdXRcclxuXHRcdF0sXHJcblx0XHRwYWRkZWQ6IGZhbHNlLFxyXG5cdFx0ZXhwYW5kZWQ6IGZhbHNlXHJcblx0fSApO1xyXG5cclxuXHR0aGlzLiRib2R5LmNzcyh7XCJ0b3BcIjpcIjczcHhcIn0pLmFwcGVuZCh0aGlzLmNvbnRlbnRBcmVhLiRlbGVtZW50KTtcclxuXHJcblx0LyogLS0tIEVWRU5UIEhBTkRMSU5HIC0tLSAqL1xyXG5cclxuXHR0aGlzLnRvcEJhci5jb25uZWN0KHRoaXMsIHtcclxuXHRcdFwic2VhcmNoU2VsZWN0XCI6IFwib25TZWFyY2hTZWxlY3RcIixcclxuXHRcdFwic2V0Q2xhc3Nlc1wiOiBcIm9uU2V0Q2xhc3Nlc1wiLFxyXG5cdFx0XCJzZXRJbXBvcnRhbmNlc1wiOiBcIm9uU2V0SW1wb3J0YW5jZXNcIixcclxuXHRcdFwicmVtb3ZlQWxsXCI6IFwib25SZW1vdmVBbGxcIixcclxuXHRcdFwiY2xlYXJBbGxcIjogXCJvbkNsZWFyQWxsXCJcclxuXHR9KTtcclxuXHR0aGlzLmJhbm5lckxpc3QuY29ubmVjdCh0aGlzLCB7XCJ1cGRhdGVkU2l6ZVwiOiBcIm9uQmFubmVyTGlzdFVwZGF0ZVNpemVcIn0pO1xyXG5cclxuXHQvLyBIYW5kbGUgY2VydGFpbiBrZXlib2FyZCBldmVudHMuIFJlcXVpcmVzIHNvbWV0aGluZyBpbiB0aGUgUmF0ZXIgd2luZG93IHRvIGJlIGZvY3VzZWQsXHJcblx0Ly8gc28gYWRkIGEgdGFiaW5kZXggdG8gdGhlIGJvZHkgYW5kIGl0J3MgcGFyZW50IGNvbnRhaW5lci5cclxuXHR0aGlzLiRib2R5LmF0dHIoXCJ0YWJpbmRleFwiLCBcIjk5OVwiKVxyXG5cdFx0LnBhcmVudCgpLmF0dHIoXCJ0YWJpbmRleFwiLCBcIjk5OVwiKS5rZXlkb3duKGZ1bmN0aW9uKCBldmVudCApIHtcclxuXHRcdFx0bGV0IHNjcm9sbEFtb3VudDtcclxuXHRcdFx0c3dpdGNoKGV2ZW50LndoaWNoKSB7XHJcblx0XHRcdGNhc2UgMzM6IC8vIHBhZ2UgdXBcclxuXHRcdFx0XHRzY3JvbGxBbW91bnQgPSB0aGlzLiRib2R5LnNjcm9sbFRvcCgpIC0gdGhpcy4kYm9keS5oZWlnaHQoKSowLjk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgMzQ6IC8vIHBhZ2UgZG93blxyXG5cdFx0XHRcdHNjcm9sbEFtb3VudCA9IHRoaXMuJGJvZHkuc2Nyb2xsVG9wKCkgKyB0aGlzLiRib2R5LmhlaWdodCgpKjAuOTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy4kYm9keS5zY3JvbGxUb3Aoc2Nyb2xsQW1vdW50KTtcclxuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdH0uYmluZCh0aGlzKSk7XHJcblxyXG5cdHRoaXMucHJlZnNGb3JtLmNvbm5lY3QodGhpcywge1wicmVzZXRDYWNoZVwiOiBcIm9uUmVzZXRDYWNoZVwifSk7XHJcblx0XHJcbn07XHJcblxyXG5NYWluV2luZG93LnByb3RvdHlwZS5vbkJhbm5lckxpc3RVcGRhdGVTaXplID0gZnVuY3Rpb24oKSB7XHJcblx0Ly8gR2V0IHRoZSBjdXJyZW50IHNjcm9sbCBhbW91bnRcclxuXHRjb25zdCBzY3JvbGxBbW91bnQgPSB0aGlzLiRib2R5LnNjcm9sbFRvcCgpO1xyXG5cdC8vIFVwZGF0ZSBzaXplICh3aGljaCByZXNldHMgdGhlIHNjcm9sbCB0byAwKVxyXG5cdHRoaXMudXBkYXRlU2l6ZSgpO1xyXG5cdC8vIFNjcm9sbCB0byB3aGVyZSBpdCB3YXMgYmVmb3JlXHJcblx0dGhpcy4kYm9keS5zY3JvbGxUb3Aoc2Nyb2xsQW1vdW50KTtcclxufTtcclxuXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLm1ha2VEcmFnZ2FibGUgPSBmdW5jdGlvbigpIHtcclxuXHRsZXQgJGZyYW1lRWwgPSB0aGlzLiRlbGVtZW50LmZpbmQoXCIub28tdWktd2luZG93LWZyYW1lXCIpO1xyXG5cdGxldCAkaGFuZGxlRWwgPSB0aGlzLiRlbGVtZW50LmZpbmQoXCIub28tdWktcHJvY2Vzc0RpYWxvZy1sb2NhdGlvblwiKS5jc3Moe1wiY3Vyc29yXCI6XCJtb3ZlXCJ9KTtcclxuXHQvLyBQb3NpdGlvbiBmb3IgY3NzIHRyYW5zbGF0ZSB0cmFuc2Zvcm1hdGlvbnMsIHJlbGF0aXZlIHRvIGluaXRpYWwgcG9zaXRpb25cclxuXHQvLyAod2hpY2ggaXMgY2VudGVyZWQgb24gdmlld3BvcnQgd2hlbiBzY3JvbGxlZCB0byB0b3ApXHJcblx0bGV0IHBvc2l0aW9uID0geyB4OiAwLCB5OiAwIH07XHJcblx0Y29uc3QgY29uc3RyYWluID0gZnVuY3Rpb24odmFsLCBtaW5WYWwsIG1heFZhbCkge1xyXG5cdFx0aWYgKHZhbCA8IG1pblZhbCkgcmV0dXJuIG1pblZhbDtcclxuXHRcdGlmICh2YWwgPiBtYXhWYWwpIHJldHVybiBtYXhWYWw7XHJcblx0XHRyZXR1cm4gdmFsO1xyXG5cdH07XHJcblx0Y29uc3QgY29uc3RyYWluWCA9ICh2YWwpID0+IHtcclxuXHRcdC8vIERvbid0IHRvbyBmYXIgaG9yaXpvbnRhbGx5IChsZWF2ZSBhdCBsZWFzdCAxMDBweCB2aXNpYmxlKVxyXG5cdFx0bGV0IGxpbWl0ID0gd2luZG93LmlubmVyV2lkdGgvMiArICRmcmFtZUVsLm91dGVyV2lkdGgoKS8yIC0gMTAwO1xyXG5cdFx0cmV0dXJuIGNvbnN0cmFpbih2YWwsIC0xKmxpbWl0LCBsaW1pdCk7XHJcblx0fTtcclxuXHRjb25zdCBjb25zdHJhaW5ZID0gKHZhbCkgPT4ge1xyXG5cdFx0Ly8gQ2FuJ3QgdGFrZSB0aXRsZSBiYXIgb2ZmIHRoZSB2aWV3cG9ydCwgc2luY2UgaXQncyB0aGUgZHJhZyBoYW5kbGVcclxuXHRcdGxldCBtaW5MaW1pdCA9IC0xKih3aW5kb3cuaW5uZXJIZWlnaHQgLSAkZnJhbWVFbC5vdXRlckhlaWdodCgpKS8yO1xyXG5cdFx0Ly8gRG9uJ3QgZ28gdG9vIGZhciBkb3duIHRoZSBwYWdlOiAod2hvbGUgcGFnZSBoZWlnaHQpIC0gKGluaXRpYWwgcG9zaXRpb24pXHJcblx0XHRsZXQgbWF4TGltaXQgPSAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudCkuc2Nyb2xsSGVpZ2h0IC0gd2luZG93LmlubmVySGVpZ2h0LzI7XHJcblx0XHRyZXR1cm4gY29uc3RyYWluKHZhbCwgbWluTGltaXQsIG1heExpbWl0KTtcclxuXHR9O1xyXG5cclxuXHRsZXQgcG9pbnRlcmRvd24gPSBmYWxzZTtcclxuXHRsZXQgZHJhZ0Zyb20gPSB7fTtcclxuXHJcblx0bGV0IG9uRHJhZ1N0YXJ0ID0gZXZlbnQgPT4ge1xyXG5cdFx0cG9pbnRlcmRvd24gPSB0cnVlO1xyXG5cdFx0ZHJhZ0Zyb20ueCA9IGV2ZW50LmNsaWVudFg7XHJcblx0XHRkcmFnRnJvbS55ID0gZXZlbnQuY2xpZW50WTtcclxuXHR9O1xyXG5cdGxldCBvbkRyYWdNb3ZlID0gZXZlbnQgPT4ge1xyXG5cdFx0aWYgKCFwb2ludGVyZG93biB8fCBkcmFnRnJvbS54ID09IG51bGwgfHwgZHJhZ0Zyb20ueSA9PT0gbnVsbCkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRjb25zdCBkeCA9IGV2ZW50LmNsaWVudFggLSBkcmFnRnJvbS54O1xyXG5cdFx0Y29uc3QgZHkgPSBldmVudC5jbGllbnRZIC0gZHJhZ0Zyb20ueTtcclxuXHRcdGRyYWdGcm9tLnggPSBldmVudC5jbGllbnRYO1xyXG5cdFx0ZHJhZ0Zyb20ueSA9IGV2ZW50LmNsaWVudFk7XHJcblx0XHRwb3NpdGlvbi54ID0gY29uc3RyYWluWChwb3NpdGlvbi54ICsgZHgpO1xyXG5cdFx0cG9zaXRpb24ueSA9IGNvbnN0cmFpblkocG9zaXRpb24ueSArIGR5KTtcclxuXHRcdCRmcmFtZUVsLmNzcyhcInRyYW5zZm9ybVwiLCBgdHJhbnNsYXRlKCR7cG9zaXRpb24ueH1weCwgJHtwb3NpdGlvbi55fXB4KWApO1xyXG5cdH07XHJcblx0bGV0IG9uRHJhZ0VuZCA9ICgpID0+IHtcclxuXHRcdHBvaW50ZXJkb3duID0gZmFsc2U7XHJcblx0XHRkZWxldGUgZHJhZ0Zyb20ueDtcclxuXHRcdGRlbGV0ZSBkcmFnRnJvbS55O1xyXG5cdFx0Ly8gTWFrZSBzdXJlIGZpbmFsIHBvc2l0aW9ucyBhcmUgd2hvbGUgbnVtYmVyc1xyXG5cdFx0cG9zaXRpb24ueCA9IE1hdGgucm91bmQocG9zaXRpb24ueCk7XHJcblx0XHRwb3NpdGlvbi55ID0gTWF0aC5yb3VuZChwb3NpdGlvbi55KTtcclxuXHRcdCRmcmFtZUVsLmNzcyhcInRyYW5zZm9ybVwiLCBgdHJhbnNsYXRlKCR7cG9zaXRpb24ueH1weCwgJHtwb3NpdGlvbi55fXB4KWApO1xyXG5cdH07XHJcblxyXG5cdC8vIFVzZSBwb2ludGVyIGV2ZW50cyBpZiBhdmFpbGFibGU7IG90aGVyd2lzZSB1c2UgbW91c2UgZXZlbnRzXHJcblx0Y29uc3QgcG9pbnRlciA9IChcIlBvaW50ZXJFdmVudFwiIGluIHdpbmRvdykgPyBcInBvaW50ZXJcIiA6IFwibW91c2VcIjtcclxuXHQkaGFuZGxlRWwub24ocG9pbnRlcitcImVudGVyLnJhdGVyTWFpbldpblwiLCAoKSA9PiAkZnJhbWVFbC5jc3MoXCJ3aWxsLWNoYW5nZVwiLCBcInRyYW5zZm9ybVwiKSApOyAvLyBUZWxsIGJyb3dzZXIgdG8gb3B0aW1pc2UgdHJhbnNmb3JtXHJcblx0JGhhbmRsZUVsLm9uKHBvaW50ZXIrXCJsZWF2ZS5yYXRlck1haW5XaW5cIiwgKCkgPT4geyBpZiAoIXBvaW50ZXJkb3duKSAkZnJhbWVFbC5jc3MoXCJ3aWxsLWNoYW5nZVwiLCBcIlwiKTsgfSApOyAvLyBSZW1vdmUgb3B0aW1pc2F0aW9uIGlmIG5vdCBkcmFnZ2luZ1xyXG5cdCRoYW5kbGVFbC5vbihwb2ludGVyK1wiZG93bi5yYXRlck1haW5XaW5cIiwgb25EcmFnU3RhcnQpO1xyXG5cdCQoXCJib2R5XCIpLm9uKHBvaW50ZXIrXCJtb3ZlLnJhdGVyTWFpbldpblwiLCBvbkRyYWdNb3ZlKTtcclxuXHQkKFwiYm9keVwiKS5vbihwb2ludGVyK1widXAucmF0ZXJNYWluV2luXCIsIG9uRHJhZ0VuZCk7XHJcbn07XHJcblxyXG4vLyBPdmVycmlkZSB0aGUgZ2V0Qm9keUhlaWdodCgpIG1ldGhvZCB0byBzcGVjaWZ5IGEgY3VzdG9tIGhlaWdodFxyXG5NYWluV2luZG93LnByb3RvdHlwZS5nZXRCb2R5SGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xyXG5cdHZhciBjdXJyZW50bGF5b3V0ID0gdGhpcy5jb250ZW50QXJlYS5nZXRDdXJyZW50SXRlbSgpO1xyXG5cdHZhciBsYXlvdXRIZWlnaHQgPSBjdXJyZW50bGF5b3V0ICYmIGN1cnJlbnRsYXlvdXQuJGVsZW1lbnQub3V0ZXJIZWlnaHQodHJ1ZSk7XHJcblx0dmFyIGNvbnRlbnRIZWlnaHQgPSBjdXJyZW50bGF5b3V0ICYmIGN1cnJlbnRsYXlvdXQuJGVsZW1lbnQuY2hpbGRyZW4oXCI6Zmlyc3QtY2hpbGRcIikub3V0ZXJIZWlnaHQodHJ1ZSk7XHJcblx0cmV0dXJuIE1hdGgubWF4KDIwMCwgbGF5b3V0SGVpZ2h0LCBjb250ZW50SGVpZ2h0KTtcclxufTtcclxuXHJcbi8vIFVzZSBnZXRTZXR1cFByb2Nlc3MoKSB0byBzZXQgdXAgdGhlIHdpbmRvdyB3aXRoIGRhdGEgcGFzc2VkIHRvIGl0IGF0IHRoZSB0aW1lIFxyXG4vLyBvZiBvcGVuaW5nXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLmdldFNldHVwUHJvY2VzcyA9IGZ1bmN0aW9uICggZGF0YSApIHtcclxuXHRkYXRhID0gZGF0YSB8fCB7fTtcclxuXHRyZXR1cm4gTWFpbldpbmRvdy5zdXBlci5wcm90b3R5cGUuZ2V0U2V0dXBQcm9jZXNzLmNhbGwoIHRoaXMsIGRhdGEgKVxyXG5cdFx0Lm5leHQoICgpID0+IHtcclxuXHRcdFx0dGhpcy5tYWtlRHJhZ2dhYmxlKCk7XHJcblx0XHRcdC8vIFNldCB1cCBwcmVmZXJlbmNlc1xyXG5cdFx0XHR0aGlzLnNldFByZWZlcmVuY2VzKGRhdGEucHJlZmVyZW5jZXMpO1xyXG5cdFx0XHR0aGlzLnByZWZzRm9ybS5zZXRQcmVmVmFsdWVzKGRhdGEucHJlZmVyZW5jZXMpO1xyXG5cdFx0XHQvLyBTZXQgc3ViamVjdCBwYWdlIGluZm9cclxuXHRcdFx0dGhpcy5zdWJqZWN0UGFnZSA9IGRhdGEuc3ViamVjdFBhZ2U7XHJcblx0XHRcdHRoaXMucGFnZUluZm8gPSB7XHJcblx0XHRcdFx0cmVkaXJlY3Q6IGRhdGEucmVkaXJlY3RUYXJnZXQsXHJcblx0XHRcdFx0aXNEaXNhbWJpZzogZGF0YS5kaXNhbWJpZyxcclxuXHRcdFx0XHRoYXNTdHVidGFnOiBkYXRhLnN0dWJ0YWcsXHJcblx0XHRcdFx0aXNBcnRpY2xlOiBkYXRhLmlzQXJ0aWNsZVxyXG5cdFx0XHR9O1xyXG5cdFx0XHQvLyBTZXQgdXAgZWRpdCBtb2RlIGJhbm5lcnNcclxuXHRcdFx0dGhpcy5hY3Rpb25zLnNldE1vZGUoXCJlZGl0XCIpO1xyXG5cdFx0XHR0aGlzLmJhbm5lckxpc3Qub3Jlc0NsYXNzID0gKGRhdGEuaXNBcnRpY2xlICYmIGRhdGEuaXNMaXN0KVxyXG5cdFx0XHRcdD8gXCJMaXN0XCJcclxuXHRcdFx0XHQ6IGRhdGEub3JlcyAmJiBkYXRhLm9yZXMucHJlZGljdGlvbjtcclxuXHRcdFx0dGhpcy5iYW5uZXJMaXN0LnBhZ2VJbmZvID0gdGhpcy5wYWdlSW5mbztcclxuXHRcdFx0dGhpcy5iYW5uZXJMaXN0LmFkZEl0ZW1zKFxyXG5cdFx0XHRcdGRhdGEuYmFubmVycy5tYXAoIGJhbm5lclRlbXBsYXRlID0+IG5ldyBCYW5uZXJXaWRnZXQoXHJcblx0XHRcdFx0XHRiYW5uZXJUZW1wbGF0ZSxcclxuXHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0cHJlZmVyZW5jZXM6IHRoaXMucHJlZmVyZW5jZXMsXHJcblx0XHRcdFx0XHRcdCRvdmVybGF5OiB0aGlzLiRvdmVybGF5LFxyXG5cdFx0XHRcdFx0XHRpc0FydGljbGU6IHRoaXMucGFnZUluZm8uaXNBcnRpY2xlXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0KSApXHJcblx0XHRcdCk7XHJcblx0XHRcdGxldCBzaGVsbFRlbXBsYXRlQmFubmVyID0gdGhpcy5iYW5uZXJMaXN0Lml0ZW1zLmZpbmQoYmFubmVyID0+IGJhbm5lci5pc1NoZWxsVGVtcGxhdGUpO1xyXG5cdFx0XHRpZiAoc2hlbGxUZW1wbGF0ZUJhbm5lciAmJiBzaGVsbFRlbXBsYXRlQmFubmVyLnNoZWxsUGFyYW0xVmFsdWUpIHtcclxuXHRcdFx0XHRzaGVsbFRlbXBsYXRlQmFubmVyLm5vblN0YW5kYXJkVGVtcGxhdGVzID0gdGhpcy5iYW5uZXJMaXN0Lml0ZW1zLnJlZHVjZShcclxuXHRcdFx0XHRcdChiYW5uZXJzTGlzdCwgY3VyQmFubmVyKSA9PiBiYW5uZXJzTGlzdC5yZXBsYWNlKGN1ckJhbm5lci53aWtpdGV4dCwgXCJcIiksXHJcblx0XHRcdFx0XHRzaGVsbFRlbXBsYXRlQmFubmVyLnNoZWxsUGFyYW0xVmFsdWVcclxuXHRcdFx0XHQpLnRyaW0oKS5yZXBsYWNlKC9cXG4rL2csIFwiXFxuXCIpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMuYmFubmVyTGlzdC5hZGRTaGVsbFRlbXBsYXRlSWZOZWVlZGVkKClcclxuXHRcdFx0XHQuc3luY1NoZWxsVGVtcGxhdGVXaXRoQmlvZ3JhcGh5QmFubmVyKCk7XHJcblx0XHRcdC8vIFNob3cgcGFnZSB0eXBlLCBvciBPUkVTIHByZWRpY3Rpb24sIGlmIGF2YWlsYWJsZVxyXG5cdFx0XHRpZiAodGhpcy5wYWdlSW5mby5yZWRpcmVjdCkge1xyXG5cdFx0XHRcdHRoaXMucGFnZXR5cGVMYWJlbC5zZXRMYWJlbChcIlJlZGlyZWN0IHBhZ2VcIikudG9nZ2xlKHRydWUpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMucGFnZUluZm8uaXNEaXNhbWJpZykge1xyXG5cdFx0XHRcdHRoaXMucGFnZXR5cGVMYWJlbC5zZXRMYWJlbChcIkRpc2FtYmlndWF0aW9uIHBhZ2VcIikudG9nZ2xlKHRydWUpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMucGFnZUluZm8uaXNBcnRpY2xlICYmIGRhdGEuaXNHQSkge1xyXG5cdFx0XHRcdHRoaXMucGFnZXR5cGVMYWJlbC5zZXRMYWJlbChcIkdvb2QgYXJ0aWNsZVwiKS50b2dnbGUodHJ1ZSk7XHJcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5wYWdlSW5mby5pc0FydGljbGUgJiYgZGF0YS5pc0ZBKSB7XHJcblx0XHRcdFx0dGhpcy5wYWdldHlwZUxhYmVsLnNldExhYmVsKFwiRmVhdHVyZWQgYXJ0aWNsZVwiKS50b2dnbGUodHJ1ZSk7XHJcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5wYWdlSW5mby5pc0FydGljbGUgJiYgZGF0YS5pc0ZMKSB7XHJcblx0XHRcdFx0dGhpcy5wYWdldHlwZUxhYmVsLnNldExhYmVsKFwiRmVhdHVyZWQgbGlzdFwiKS50b2dnbGUodHJ1ZSk7XHJcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5wYWdlSW5mby5pc0FydGljbGUgJiYgZGF0YS5pc0xpc3QpIHtcclxuXHRcdFx0XHR0aGlzLnBhZ2V0eXBlTGFiZWwuc2V0TGFiZWwoXCJMaXN0IGFydGljbGVcIikudG9nZ2xlKHRydWUpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKGRhdGEub3Jlcykge1xyXG5cdFx0XHRcdHRoaXMub3Jlc0NsYXNzID0gZGF0YS5vcmVzLnByZWRpY3Rpb247XHJcblx0XHRcdFx0dGhpcy5vcmVzTGFiZWwudG9nZ2xlKHRydWUpLiRlbGVtZW50LmZpbmQoXCIub3Jlc1ByZWRpY3Rpb25cIikuYXBwZW5kKFxyXG5cdFx0XHRcdFx0XCJQcmVkaWN0aW9uOiBcIixcclxuXHRcdFx0XHRcdCQoXCI8c3Ryb25nPlwiKS50ZXh0KGRhdGEub3Jlcy5wcmVkaWN0aW9uKSxcclxuXHRcdFx0XHRcdFwiJm5ic3A7KFwiICsgZGF0YS5vcmVzLnByb2JhYmlsaXR5ICsgXCIpXCJcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMucGFnZUluZm8uaXNBcnRpY2xlKSB7XHJcblx0XHRcdFx0dGhpcy5wYWdldHlwZUxhYmVsLnNldExhYmVsKFwiQXJ0aWNsZSBwYWdlXCIpLnRvZ2dsZSh0cnVlKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLnBhZ2V0eXBlTGFiZWwuc2V0TGFiZWwoIHRoaXMuc3ViamVjdFBhZ2UuZ2V0TmFtZXNwYWNlUHJlZml4KCkuc2xpY2UoMCwtMSkgKyBcIiBwYWdlXCIgKS50b2dnbGUodHJ1ZSk7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gU2V0IHByb3BzIGZvciB1c2UgaW4gbWFraW5nIHdpa2l0ZXh0IGFuZCBlZGl0IHN1bW1hcmllc1xyXG5cdFx0XHR0aGlzLnRhbGtXaWtpdGV4dCA9IGRhdGEudGFsa1dpa2l0ZXh0O1xyXG5cdFx0XHR0aGlzLmV4aXN0aW5nQmFubmVyTmFtZXMgPSBkYXRhLmJhbm5lcnMubWFwKCBiYW5uZXJUZW1wbGF0ZSA9PiBiYW5uZXJUZW1wbGF0ZS5uYW1lICk7XHJcblx0XHRcdHRoaXMudGFsa3BhZ2UgPSBkYXRhLnRhbGtwYWdlO1xyXG5cdFx0XHQvLyBGb3JjZSBhIHNpemUgdXBkYXRlIHRvIGVuc3VyZSBldmV5dGhpbmcgZml0cyBva2F5XHJcblx0XHRcdHRoaXMudXBkYXRlU2l6ZSgpO1xyXG5cdFx0fSwgdGhpcyApO1xyXG59O1xyXG5cclxuLy8gU2V0IHVwIHRoZSB3aW5kb3cgaXQgaXMgcmVhZHk6IGF0dGFjaGVkIHRvIHRoZSBET00sIGFuZCBvcGVuaW5nIGFuaW1hdGlvbiBjb21wbGV0ZWRcclxuTWFpbldpbmRvdy5wcm90b3R5cGUuZ2V0UmVhZHlQcm9jZXNzID0gZnVuY3Rpb24gKCBkYXRhICkge1xyXG5cdGRhdGEgPSBkYXRhIHx8IHt9O1xyXG5cdHJldHVybiBNYWluV2luZG93LnN1cGVyLnByb3RvdHlwZS5nZXRSZWFkeVByb2Nlc3MuY2FsbCggdGhpcywgZGF0YSApXHJcblx0XHQubmV4dCggKCkgPT4gdGhpcy50b3BCYXIuc2VhcmNoQm94LmZvY3VzKCkgKTtcclxufTtcclxuXHJcbi8vIFVzZSB0aGUgZ2V0QWN0aW9uUHJvY2VzcygpIG1ldGhvZCB0byBkbyB0aGluZ3Mgd2hlbiBhY3Rpb25zIGFyZSBjbGlja2VkXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLmdldEFjdGlvblByb2Nlc3MgPSBmdW5jdGlvbiAoIGFjdGlvbiApIHtcclxuXHRpZiAoIGFjdGlvbiA9PT0gXCJzaG93UHJlZnNcIiApIHtcclxuXHRcdHRoaXMuYWN0aW9ucy5zZXRNb2RlKFwicHJlZnNcIik7XHJcblx0XHR0aGlzLmNvbnRlbnRBcmVhLnNldEl0ZW0oIHRoaXMucHJlZnNMYXlvdXQgKTtcclxuXHRcdHRoaXMudG9wQmFyLnNldERpc2FibGVkKHRydWUpO1xyXG5cdFx0dGhpcy51cGRhdGVTaXplKCk7XHJcblxyXG5cdH0gZWxzZSBpZiAoIGFjdGlvbiA9PT0gXCJzYXZlUHJlZnNcIiApIHtcclxuXHRcdHZhciB1cGRhdGVkUHJlZnMgPSB0aGlzLnByZWZzRm9ybS5nZXRQcmVmcygpO1xyXG5cdFx0cmV0dXJuIG5ldyBPTy51aS5Qcm9jZXNzKCkubmV4dChcclxuXHRcdFx0QXBpU2V0UHJlZnModXBkYXRlZFByZWZzKS50aGVuKFxyXG5cdFx0XHRcdC8vIFN1Y2Nlc3NcclxuXHRcdFx0XHQoKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnNldFByZWZlcmVuY2VzKHVwZGF0ZWRQcmVmcyk7XHJcblx0XHRcdFx0XHR0aGlzLmFjdGlvbnMuc2V0TW9kZShcImVkaXRcIik7XHJcblx0XHRcdFx0XHR0aGlzLmNvbnRlbnRBcmVhLnNldEl0ZW0oIHRoaXMuZWRpdExheW91dCApO1xyXG5cdFx0XHRcdFx0dGhpcy50b3BCYXIuc2V0RGlzYWJsZWQoZmFsc2UpO1xyXG5cdFx0XHRcdFx0dGhpcy51cGRhdGVTaXplKCk7XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHQvLyBGYWlsdXJlXHJcblx0XHRcdFx0KGNvZGUsIGVycikgPT4gJC5EZWZlcnJlZCgpLnJlamVjdChcclxuXHRcdFx0XHRcdG5ldyBPTy51aS5FcnJvcihcclxuXHRcdFx0XHRcdFx0JChcIjxkaXY+XCIpLmFwcGVuZChcclxuXHRcdFx0XHRcdFx0XHQkKFwiPHN0cm9uZyBzdHlsZT0nZGlzcGxheTpibG9jazsnPlwiKS50ZXh0KFwiQ291bGQgbm90IHNhdmUgcHJlZmVyZW5jZXMuXCIpLFxyXG5cdFx0XHRcdFx0XHRcdCQoXCI8c3BhbiBzdHlsZT0nY29sb3I6Izc3Nyc+XCIpLnRleHQoIG1ha2VFcnJvck1zZyhjb2RlLCBlcnIpIClcclxuXHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHRcdClcclxuXHRcdFx0KVxyXG5cdFx0KTtcclxuXHJcblx0fSBlbHNlIGlmICggYWN0aW9uID09PSBcImNsZWFyQ2FjaGVcIiApIHtcclxuXHRcdHJldHVybiBuZXcgT08udWkuUHJvY2VzcygpLm5leHQoKCkgPT4ge1xyXG5cdFx0XHRjYWNoZS5jbGVhckFsbEl0ZW1zKCk7XHJcblx0XHRcdHRoaXMuY2xvc2Uoe3Jlc3RhcnQ6IHRydWV9KTtcclxuXHRcdH0pO1xyXG5cclxuXHJcblx0fSBlbHNlIGlmICggYWN0aW9uID09PSBcImNsb3NlUHJlZnNcIiApIHtcclxuXHRcdHRoaXMuYWN0aW9ucy5zZXRNb2RlKFwiZWRpdFwiKTtcclxuXHRcdHRoaXMuY29udGVudEFyZWEuc2V0SXRlbSggdGhpcy5lZGl0TGF5b3V0ICk7XHJcblx0XHR0aGlzLnRvcEJhci5zZXREaXNhYmxlZChmYWxzZSk7XHJcblx0XHR0aGlzLnByZWZzRm9ybS5zZXRQcmVmVmFsdWVzKHRoaXMucHJlZmVyZW5jZXMpO1xyXG5cdFx0dGhpcy51cGRhdGVTaXplKCk7XHJcblxyXG5cdH0gZWxzZSBpZiAoIGFjdGlvbiA9PT0gXCJzYXZlXCIgKSB7XHJcblx0XHRyZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKS5uZXh0KFxyXG5cdFx0XHRBUEkuZWRpdFdpdGhSZXRyeShcclxuXHRcdFx0XHR0aGlzLnRhbGtwYWdlLmdldFByZWZpeGVkVGV4dCgpLFxyXG5cdFx0XHRcdHtydnNlY3Rpb246IDB9LFxyXG5cdFx0XHRcdHJldmlzaW9uID0+ICh7XHJcblx0XHRcdFx0XHRzZWN0aW9uOiAwLFxyXG5cdFx0XHRcdFx0dGV4dDogdGhpcy50cmFuc2Zvcm1UYWxrV2lraXRleHQocmV2aXNpb24uY29udGVudCksXHJcblx0XHRcdFx0XHRzdW1tYXJ5OiB0aGlzLm1ha2VFZGl0U3VtbWFyeSgpLFxyXG5cdFx0XHRcdFx0d2F0Y2hsaXN0OiB0aGlzLnByZWZlcmVuY2VzLndhdGNobGlzdFxyXG5cdFx0XHRcdH0pXHJcblx0XHRcdCkuY2F0Y2goKGNvZGUsIGVycikgPT4gJC5EZWZlcnJlZCgpLnJlamVjdChcclxuXHRcdFx0XHRuZXcgT08udWkuRXJyb3IoXHJcblx0XHRcdFx0XHQkKFwiPGRpdj5cIikuYXBwZW5kKFxyXG5cdFx0XHRcdFx0XHQkKFwiPHN0cm9uZyBzdHlsZT0nZGlzcGxheTpibG9jazsnPlwiKS50ZXh0KFwiQ291bGQgbm90IHNhdmUgeW91ciBjaGFuZ2VzLlwiKSxcclxuXHRcdFx0XHRcdFx0JChcIjxzcGFuIHN0eWxlPSdjb2xvcjojNzc3Jz5cIikudGV4dCggbWFrZUVycm9yTXNnKGNvZGUsIGVycikgKVxyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHRcdClcclxuXHRcdFx0KSApXHJcblx0XHQpLm5leHQoICgpID0+IHRoaXMuY2xvc2Uoe1xyXG5cdFx0XHRzdWNjZXNzOiB0cnVlLFxyXG5cdFx0XHR1cGdyYWRlZFN0dWI6IHRoaXMucGFnZUluZm8uaGFzU3R1YnRhZyAmJiB0aGlzLmlzUmF0ZWRBbmROb3RTdHViKClcclxuXHRcdH0pICk7XHJcblxyXG5cdH0gZWxzZSBpZiAoIGFjdGlvbiA9PT0gXCJwcmV2aWV3XCIgKSB7XHJcblx0XHRyZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKS5uZXh0KFxyXG5cdFx0XHRBUEkucG9zdCh7XHJcblx0XHRcdFx0YWN0aW9uOiBcInBhcnNlXCIsXHJcblx0XHRcdFx0Y29udGVudG1vZGVsOiBcIndpa2l0ZXh0XCIsXHJcblx0XHRcdFx0dGV4dDogdGhpcy50cmFuc2Zvcm1UYWxrV2lraXRleHQodGhpcy50YWxrV2lraXRleHQpICsgXCJcXG48aHI+XFxuXCIgKyBcIicnJ0VkaXQgc3VtbWFyeTonJycgXCIgKyB0aGlzLm1ha2VFZGl0U3VtbWFyeSgpLFxyXG5cdFx0XHRcdHRpdGxlOiB0aGlzLnRhbGtwYWdlLmdldFByZWZpeGVkVGV4dCgpLFxyXG5cdFx0XHRcdHBzdDogMVxyXG5cdFx0XHR9KS50aGVuKCByZXN1bHQgPT4ge1xyXG5cdFx0XHRcdGlmICggIXJlc3VsdCB8fCAhcmVzdWx0LnBhcnNlIHx8ICFyZXN1bHQucGFyc2UudGV4dCB8fCAhcmVzdWx0LnBhcnNlLnRleHRbXCIqXCJdICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZWplY3QoXCJFbXB0eSByZXN1bHRcIik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHZhciBwcmV2aWV3SHRtbFNuaXBwZXQgPSBuZXcgT08udWkuSHRtbFNuaXBwZXQocmVzdWx0LnBhcnNlLnRleHRbXCIqXCJdKTtcclxuXHJcblx0XHRcdFx0dGhpcy5wYXJzZWRDb250ZW50V2lkZ2V0LnNldExhYmVsKHByZXZpZXdIdG1sU25pcHBldCk7XHJcblx0XHRcdFx0dGhpcy5wYXJzZWRDb250ZW50Q29udGFpbmVyLnNldExhYmVsKFwiUHJldmlldzpcIik7XHJcblx0XHRcdFx0dGhpcy5hY3Rpb25zLnNldE1vZGUoXCJwcmV2aWV3XCIpO1xyXG5cdFx0XHRcdHRoaXMuY29udGVudEFyZWEuc2V0SXRlbSggdGhpcy5wYXJzZWRDb250ZW50TGF5b3V0ICk7XHJcblx0XHRcdFx0dGhpcy50b3BCYXIuc2V0RGlzYWJsZWQodHJ1ZSk7XHJcblx0XHRcdFx0dGhpcy51cGRhdGVTaXplKCk7XHJcblx0XHRcdH0pXHJcblx0XHRcdFx0LmNhdGNoKCAoY29kZSwgZXJyKSA9PiAkLkRlZmVycmVkKCkucmVqZWN0KFxyXG5cdFx0XHRcdFx0bmV3IE9PLnVpLkVycm9yKFxyXG5cdFx0XHRcdFx0XHQkKFwiPGRpdj5cIikuYXBwZW5kKFxyXG5cdFx0XHRcdFx0XHRcdCQoXCI8c3Ryb25nIHN0eWxlPSdkaXNwbGF5OmJsb2NrOyc+XCIpLnRleHQoXCJDb3VsZCBub3Qgc2hvdyBjaGFuZ2VzLlwiKSxcclxuXHRcdFx0XHRcdFx0XHQkKFwiPHNwYW4gc3R5bGU9J2NvbG9yOiM3NzcnPlwiKS50ZXh0KCBtYWtlRXJyb3JNc2coY29kZSwgZXJyKSApXHJcblx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdClcclxuXHRcdFx0XHQpIClcclxuXHRcdCk7XHJcblxyXG5cdH0gZWxzZSBpZiAoIGFjdGlvbiA9PT0gXCJjaGFuZ2VzXCIgKSB7XHJcblx0XHRyZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKS5uZXh0KFxyXG5cdFx0XHRBUEkucG9zdCh7XHJcblx0XHRcdFx0YWN0aW9uOiBcImNvbXBhcmVcIixcclxuXHRcdFx0XHRmb3JtYXQ6IFwianNvblwiLFxyXG5cdFx0XHRcdGZyb210ZXh0OiB0aGlzLnRhbGtXaWtpdGV4dCxcclxuXHRcdFx0XHRmcm9tY29udGVudG1vZGVsOiBcIndpa2l0ZXh0XCIsXHJcblx0XHRcdFx0dG90ZXh0OiB0aGlzLnRyYW5zZm9ybVRhbGtXaWtpdGV4dCh0aGlzLnRhbGtXaWtpdGV4dCksXHJcblx0XHRcdFx0dG9jb250ZW50bW9kZWw6IFwid2lraXRleHRcIixcclxuXHRcdFx0XHRwcm9wOiBcImRpZmZcIlxyXG5cdFx0XHR9KVxyXG5cdFx0XHRcdC50aGVuKCByZXN1bHQgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKCAhcmVzdWx0IHx8ICFyZXN1bHQuY29tcGFyZSB8fCAhcmVzdWx0LmNvbXBhcmVbXCIqXCJdICkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gJC5EZWZlcnJlZCgpLnJlamVjdChcIkVtcHR5IHJlc3VsdFwiKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHZhciAkZGlmZiA9ICQoXCI8dGFibGU+XCIpLmFkZENsYXNzKFwiZGlmZlwiKS5jc3MoXCJ3aWR0aFwiLCBcIjEwMCVcIikuYXBwZW5kKFxyXG5cdFx0XHRcdFx0XHQkKFwiPHRyPlwiKS5hcHBlbmQoXHJcblx0XHRcdFx0XHRcdFx0JChcIjx0aD5cIikuYXR0cih7XCJjb2xzcGFuXCI6XCIyXCIsIFwic2NvcGVcIjpcImNvbFwifSkuY3NzKFwid2lkdGhcIiwgXCI1MCVcIikudGV4dChcIkxhdGVzdCByZXZpc2lvblwiKSxcclxuXHRcdFx0XHRcdFx0XHQkKFwiPHRoPlwiKS5hdHRyKHtcImNvbHNwYW5cIjpcIjJcIiwgXCJzY29wZVwiOlwiY29sXCJ9KS5jc3MoXCJ3aWR0aFwiLCBcIjUwJVwiKS50ZXh0KFwiTmV3IHRleHRcIilcclxuXHRcdFx0XHRcdFx0KSxcclxuXHRcdFx0XHRcdFx0cmVzdWx0LmNvbXBhcmVbXCIqXCJdLFxyXG5cdFx0XHRcdFx0XHQkKFwiPHRmb290PlwiKS5hcHBlbmQoXHJcblx0XHRcdFx0XHRcdFx0JChcIjx0cj5cIikuYXBwZW5kKFxyXG5cdFx0XHRcdFx0XHRcdFx0JChcIjx0ZCBjb2xzcGFuPSc0Jz5cIikuYXBwZW5kKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQkKFwiPHN0cm9uZz5cIikudGV4dChcIkVkaXQgc3VtbWFyeTogXCIpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLm1ha2VFZGl0U3VtbWFyeSgpXHJcblx0XHRcdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHRcdHRoaXMucGFyc2VkQ29udGVudFdpZGdldC5zZXRMYWJlbCgkZGlmZik7XHJcblx0XHRcdFx0XHR0aGlzLnBhcnNlZENvbnRlbnRDb250YWluZXIuc2V0TGFiZWwoXCJDaGFuZ2VzOlwiKTtcclxuXHRcdFx0XHRcdHRoaXMuYWN0aW9ucy5zZXRNb2RlKFwiZGlmZlwiKTtcclxuXHRcdFx0XHRcdHRoaXMuY29udGVudEFyZWEuc2V0SXRlbSggdGhpcy5wYXJzZWRDb250ZW50TGF5b3V0ICk7XHJcblx0XHRcdFx0XHR0aGlzLnRvcEJhci5zZXREaXNhYmxlZCh0cnVlKTtcclxuXHRcdFx0XHRcdHRoaXMudXBkYXRlU2l6ZSgpO1xyXG5cdFx0XHRcdH0gKVxyXG5cdFx0XHRcdC5jYXRjaCggKGNvZGUsIGVycikgPT4gJC5EZWZlcnJlZCgpLnJlamVjdChcclxuXHRcdFx0XHRcdG5ldyBPTy51aS5FcnJvcihcclxuXHRcdFx0XHRcdFx0JChcIjxkaXY+XCIpLmFwcGVuZChcclxuXHRcdFx0XHRcdFx0XHQkKFwiPHN0cm9uZyBzdHlsZT0nZGlzcGxheTpibG9jazsnPlwiKS50ZXh0KFwiQ291bGQgbm90IHNob3cgY2hhbmdlcy5cIiksXHJcblx0XHRcdFx0XHRcdFx0JChcIjxzcGFuIHN0eWxlPSdjb2xvcjojNzc3Jz5cIikudGV4dCggbWFrZUVycm9yTXNnKGNvZGUsIGVycikgKVxyXG5cdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHQpXHJcblx0XHRcdFx0KSApXHJcblx0XHQpO1xyXG5cclxuXHR9IGVsc2UgaWYgKCBhY3Rpb24gPT09IFwiYmFja1wiICkge1xyXG5cdFx0dGhpcy5hY3Rpb25zLnNldE1vZGUoXCJlZGl0XCIpO1xyXG5cdFx0dGhpcy5jb250ZW50QXJlYS5zZXRJdGVtKCB0aGlzLmVkaXRMYXlvdXQgKTtcclxuXHRcdHRoaXMudG9wQmFyLnNldERpc2FibGVkKGZhbHNlKTtcclxuXHRcdHRoaXMudXBkYXRlU2l6ZSgpO1xyXG5cclxuXHR9IGVsc2UgaWYgKCFhY3Rpb24gJiYgdGhpcy5iYW5uZXJMaXN0LmNoYW5nZWQpIHtcclxuXHRcdC8vIENvbmZpcm0gY2xvc2luZyBvZiBkaWFsb2cgaWYgdGhlcmUgaGF2ZSBiZWVuIGNoYW5nZXMgXHJcblx0XHRyZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKS5uZXh0KFxyXG5cdFx0XHRPTy51aS5jb25maXJtKFwiQ2hhbmdlcyBtYWRlIHdpbGwgYmUgZGlzY2FyZGVkLlwiLCB7dGl0bGU6XCJDbG9zZSBSYXRlcj9cIn0pXHJcblx0XHRcdFx0LnRoZW4oY29uZmlybWVkID0+IGNvbmZpcm1lZCA/IHRoaXMuY2xvc2UoKSA6IG51bGwpXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIE1haW5XaW5kb3cuc3VwZXIucHJvdG90eXBlLmdldEFjdGlvblByb2Nlc3MuY2FsbCggdGhpcywgYWN0aW9uICk7XHJcbn07XHJcblxyXG4vLyBVc2UgdGhlIGdldFRlYXJkb3duUHJvY2VzcygpIG1ldGhvZCB0byBwZXJmb3JtIGFjdGlvbnMgd2hlbmV2ZXIgdGhlIGRpYWxvZyBpcyBjbG9zZWQuXHJcbi8vIGBkYXRhYCBpcyB0aGUgZGF0YSBwYXNzZWQgaW50byB0aGUgd2luZG93J3MgLmNsb3NlKCkgbWV0aG9kLlxyXG5NYWluV2luZG93LnByb3RvdHlwZS5nZXRUZWFyZG93blByb2Nlc3MgPSBmdW5jdGlvbiAoIGRhdGEgKSB7XHJcblx0cmV0dXJuIE1haW5XaW5kb3cuc3VwZXIucHJvdG90eXBlLmdldFRlYXJkb3duUHJvY2Vzcy5jYWxsKCB0aGlzLCBkYXRhIClcclxuXHRcdC5maXJzdCggKCkgPT4ge1xyXG5cdFx0XHR0aGlzLmJhbm5lckxpc3QuY2xlYXJJdGVtcygpO1xyXG5cdFx0XHR0aGlzLnRvcEJhci5zZWFyY2hCb3guc2V0VmFsdWUoXCJcIik7XHJcblx0XHRcdHRoaXMuY29udGVudEFyZWEuc2V0SXRlbSggdGhpcy5lZGl0TGF5b3V0ICk7XHJcblx0XHRcdHRoaXMudG9wQmFyLnNldERpc2FibGVkKGZhbHNlKTtcclxuXHRcdFx0dGhpcy5vcmVzTGFiZWwudG9nZ2xlKGZhbHNlKS4kZWxlbWVudC5maW5kKFwiLm9yZXNQcmVkaWN0aW9uXCIpLmVtcHR5KCk7XHJcblx0XHRcdHRoaXMucGFnZXR5cGVMYWJlbC50b2dnbGUoZmFsc2UpLnNldExhYmVsKFwiXCIpO1xyXG5cclxuXHRcdFx0dGhpcy4kZWxlbWVudC5maW5kKFwiLm9vLXVpLXdpbmRvdy1mcmFtZVwiKS5jc3MoXCJ0cmFuc2Zvcm1cIixcIlwiKTtcclxuXHRcdFx0dGhpcy4kZWxlbWVudC5maW5kKFwiLm9vLXVpLXByb2Nlc3NEaWFsb2ctbG9jYXRpb25cIikub2ZmKFwiLnJhdGVyTWFpbldpblwiKTtcclxuXHRcdFx0JChcImJvZHlcIikub2ZmKFwiLnJhdGVyTWFpbldpblwiKTtcclxuXHRcdH0gKTtcclxufTtcclxuXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLnNldFByZWZlcmVuY2VzID0gZnVuY3Rpb24ocHJlZnMpIHtcclxuXHR0aGlzLnByZWZlcmVuY2VzID0gJC5leHRlbmQoe30sIGFwcENvbmZpZy5kZWZhdWx0UHJlZnMsIHByZWZzKTtcclxuXHQvLyBBcHBsaWVzIHByZWZlcmVuY2VzIHRvIGV4aXN0aW5nIGl0ZW1zIGluIHRoZSB3aW5kb3c6XHJcblx0dGhpcy5iYW5uZXJMaXN0LnNldFByZWZlcmVuY2VzKHRoaXMucHJlZmVyZW5jZXMpO1xyXG59O1xyXG5cclxuTWFpbldpbmRvdy5wcm90b3R5cGUub25SZXNldENhY2hlID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5leGVjdXRlQWN0aW9uKFwiY2xlYXJDYWNoZVwiKTtcclxufTtcclxuXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLm9uU2VhcmNoU2VsZWN0ID0gZnVuY3Rpb24oZGF0YSkge1xyXG5cdHRoaXMudG9wQmFyLnNlYXJjaEJveC5wdXNoUGVuZGluZygpO1xyXG5cdHZhciBuYW1lID0gdGhpcy50b3BCYXIuc2VhcmNoQm94LmdldFZhbHVlKCkudHJpbSgpO1xyXG5cdGlmICghbmFtZSkge1xyXG5cdFx0dGhpcy50b3BCYXIuc2VhcmNoQm94LnBvcFBlbmRpbmcoKS5mb2N1cygpO1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHR2YXIgZXhpc3RpbmdCYW5uZXIgPSB0aGlzLmJhbm5lckxpc3QuaXRlbXMuZmluZChiYW5uZXIgPT4ge1xyXG5cdFx0cmV0dXJuIGJhbm5lci5tYWluVGV4dCA9PT0gbmFtZSB8fFx0YmFubmVyLnJlZGlyZWN0VGFyZ2V0TWFpblRleHQgPT09IG5hbWU7XHJcblx0fSk7XHJcblxyXG5cdC8vIEFib3J0IGFuZCBzaG93IGFsZXJ0IGlmIGJhbm5lciBhbHJlYWR5IGV4aXN0c1xyXG5cdGlmIChleGlzdGluZ0Jhbm5lcikge1xyXG5cdFx0dGhpcy50b3BCYXIuc2VhcmNoQm94LnBvcFBlbmRpbmcoKTtcclxuXHRcdHJldHVybiBPTy51aS5hbGVydChcIlRoZXJlIGlzIGFscmVhZHkgYSB7e1wiICsgbmFtZSArIFwifX0gYmFubmVyXCIpLnRoZW4odGhpcy5zZWFyY2hCb3guZm9jdXMoKSk7XHJcblx0fVxyXG5cclxuXHQvLyBDb25maXJtYXRpb24gcmVxdWlyZWQgZm9yIGJhbm5lcnMgbWlzc2luZyBXaWtpUHJvamVjdCBmcm9tIG5hbWUsIGFuZCBmb3IgdW5jcmVhdGVkIGRpc2FtYmlndWF0aW9uIHRhbGsgcGFnZXNcclxuXHR2YXIgY29uZmlybVRleHQ7XHJcblx0aWYgKCEvXltXd10oPzpQfGlraVtQcF1yb2plY3QpLy50ZXN0KG5hbWUpKSB7XHJcblx0XHRjb25maXJtVGV4dCA9IG5ldyBPTy51aS5IdG1sU25pcHBldChcclxuXHRcdFx0XCJ7e1wiICsgbXcuaHRtbC5lc2NhcGUobmFtZSkgKyBcIn19IGlzIG5vdCBhIHJlY29nbmlzZWQgV2lraVByb2plY3QgYmFubmVyLjxici8+RG8geW91IHdhbnQgdG8gY29udGludWU/XCJcclxuXHRcdCk7XHJcblx0fSBlbHNlIGlmIChuYW1lID09PSBcIldpa2lQcm9qZWN0IERpc2FtYmlndWF0aW9uXCIgJiYgJChcIiNjYS10YWxrLm5ld1wiKS5sZW5ndGggIT09IDAgJiYgdGhpcy5iYW5uZXJMaXN0Lml0ZW1zLmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXHJcblx0XHRjb25maXJtVGV4dCA9IFwiTmV3IHRhbGsgcGFnZXMgc2hvdWxkbid0IGJlIGNyZWF0ZWQgaWYgdGhleSB3aWxsIG9ubHkgY29udGFpbiB0aGUgXFx7XFx7V2lraVByb2plY3QgRGlzYW1iaWd1YXRpb25cXH1cXH0gYmFubmVyLiBDb250aW51ZT9cIjtcclxuXHR9XHJcblx0JC53aGVuKCBjb25maXJtVGV4dCA/IE9PLnVpLmNvbmZpcm0oY29uZmlybVRleHQpIDogdHJ1ZSlcclxuXHRcdC50aGVuKCBjb25maXJtZWQgPT4ge1xyXG5cdFx0XHRpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xyXG5cdFx0XHQvLyBDcmVhdGUgVGVtcGxhdGUgb2JqZWN0XHJcblx0XHRcdHJldHVybiBCYW5uZXJXaWRnZXQubmV3RnJvbVRlbXBsYXRlTmFtZShuYW1lLCBkYXRhLCB7XHJcblx0XHRcdFx0cHJlZmVyZW5jZXM6IHRoaXMucHJlZmVyZW5jZXMsXHJcblx0XHRcdFx0JG92ZXJsYXk6IHRoaXMuJG92ZXJsYXksXHJcblx0XHRcdFx0aXNBcnRpY2xlOiB0aGlzLnBhZ2VJbmZvLmlzQXJ0aWNsZVxyXG5cdFx0XHR9KVxyXG5cdFx0XHRcdC50aGVuKGJhbm5lciA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLmJhbm5lckxpc3QuYWRkSXRlbXMoIFtiYW5uZXJdICk7XHJcblx0XHRcdFx0XHRiYW5uZXIuc2V0Q2hhbmdlZCgpO1xyXG5cdFx0XHRcdFx0dGhpcy51cGRhdGVTaXplKCk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHR9KVxyXG5cdFx0LnRoZW4oICgpID0+IHRoaXMudG9wQmFyLnNlYXJjaEJveC5zZXRWYWx1ZShcIlwiKS5mb2N1cygpLnBvcFBlbmRpbmcoKSApO1xyXG59O1xyXG5cclxuTWFpbldpbmRvdy5wcm90b3R5cGUub25TZXRDbGFzc2VzID0gZnVuY3Rpb24oY2xhc3NWYWwpIHtcclxuXHRjb25zdCBzaGVsbFRlbXBsYXRlID0gdGhpcy5iYW5uZXJMaXN0Lml0ZW1zLmZpbmQoYmFubmVyID0+IGJhbm5lci5pc1NoZWxsVGVtcGxhdGUpO1xyXG5cdGlmIChzaGVsbFRlbXBsYXRlKSB7XHJcblx0XHRzaGVsbFRlbXBsYXRlLmNsYXNzRHJvcGRvd24uZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoY2xhc3NWYWwpO1xyXG5cdFx0c2hlbGxUZW1wbGF0ZS5jbGFzc0Ryb3Bkb3duLnNldEF1dG9maWxsZWQoZmFsc2UpO1xyXG5cdH1cclxuXHR0aGlzLmJhbm5lckxpc3QuaXRlbXMuZm9yRWFjaChiYW5uZXIgPT4ge1xyXG5cdFx0aWYgKGJhbm5lci5oYXNDbGFzc1JhdGluZ3MgJiYhYmFubmVyLmlzU2hlbGxUZW1wbGF0ZSkge1xyXG5cdFx0XHRiYW5uZXIuY2xhc3NEcm9wZG93bi5nZXRNZW51KCkuc2VsZWN0SXRlbUJ5RGF0YShzaGVsbFRlbXBsYXRlID8gbnVsbCA6IGNsYXNzVmFsKTtcclxuXHRcdFx0YmFubmVyLmNsYXNzRHJvcGRvd24uc2V0QXV0b2ZpbGxlZChmYWxzZSk7XHJcblx0XHR9XHJcblx0fSk7XHJcbn07XHJcblxyXG5NYWluV2luZG93LnByb3RvdHlwZS5vblNldEltcG9ydGFuY2VzID0gZnVuY3Rpb24oaW1wb3J0YW5jZVZhbCkge1xyXG5cdHRoaXMuYmFubmVyTGlzdC5pdGVtcy5mb3JFYWNoKGJhbm5lciA9PiB7XHJcblx0XHRpZiAoYmFubmVyLmhhc0ltcG9ydGFuY2VSYXRpbmdzKSB7XHJcblx0XHRcdGJhbm5lci5pbXBvcnRhbmNlRHJvcGRvd24uZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoaW1wb3J0YW5jZVZhbCk7XHJcblx0XHRcdGJhbm5lci5pbXBvcnRhbmNlRHJvcGRvd24uc2V0QXV0b2ZpbGxlZChmYWxzZSk7XHJcblx0XHR9XHJcblx0fSk7XHJcbn07XHJcblxyXG5NYWluV2luZG93LnByb3RvdHlwZS5vblJlbW92ZUFsbCA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuYmFubmVyTGlzdC5jbGVhckl0ZW1zKCk7XHJcbn07XHJcblxyXG5NYWluV2luZG93LnByb3RvdHlwZS5vbkNsZWFyQWxsID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5iYW5uZXJMaXN0Lml0ZW1zLmZvckVhY2goIGJhbm5lciA9PiBiYW5uZXIub25DbGVhckJ1dHRvbkNsaWNrKCkgKTtcclxufTtcclxuXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLnRyYW5zZm9ybVRhbGtXaWtpdGV4dCA9IGZ1bmN0aW9uKHRhbGtXaWtpdGV4dCkge1xyXG5cdHZhciBiYW5uZXJzV2lraXRleHQgPSB0aGlzLmJhbm5lckxpc3QubWFrZVdpa2l0ZXh0KCk7XHJcblx0aWYgKCF0YWxrV2lraXRleHQpIHtcclxuXHRcdHJldHVybiBiYW5uZXJzV2lraXRleHQudHJpbSgpO1xyXG5cdH1cclxuXHQvLyBSZXBhcnNlIHRlbXBsYXRlcywgaW4gY2FzZSB0YWxrcGFnZSB3aWtpdGV4dCBoYXMgY2hhbmdlZFxyXG5cdHZhciB0YWxrVGVtcGxhdGVzID0gcGFyc2VUZW1wbGF0ZXModGFsa1dpa2l0ZXh0LCB0cnVlKTtcclxuXHQvLyByZXBsYWNlIGV4aXN0aW5nIGJhbm5lcnMgd2lraXRleHQgd2l0aCBhIGNvbnRyb2wgY2hhcmFjdGVyXHJcblx0dGFsa1RlbXBsYXRlcy5mb3JFYWNoKHRlbXBsYXRlID0+IHtcclxuXHRcdGlmICh0aGlzLmV4aXN0aW5nQmFubmVyTmFtZXMuaW5jbHVkZXModGVtcGxhdGUubmFtZSkpIHtcclxuXHRcdFx0dGFsa1dpa2l0ZXh0ID0gdGFsa1dpa2l0ZXh0LnJlcGxhY2UodGVtcGxhdGUud2lraXRleHQsIFwiXFx4MDFcIik7XHJcblx0XHR9XHJcblx0fSk7XHJcblx0Ly8gcmVwbGFjZSBpbnNlcnRpb24gcG9pbnQgKGZpcnN0IGNvbnRyb2wgY2hhcmFjdGVyKSB3aXRoIGEgZGlmZmVyZW50IGNvbnRyb2wgY2hhcmFjdGVyXHJcblx0dGFsa1dpa2l0ZXh0ID0gdGFsa1dpa2l0ZXh0LnJlcGxhY2UoXCJcXHgwMVwiLCBcIlxceDAyXCIpO1xyXG5cdC8vIHJlbW92ZSBvdGhlciBjb250cm9sIGNoYXJhY3RlcnNcclxuXHQvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCAqL1xyXG5cdHRhbGtXaWtpdGV4dCA9IHRhbGtXaWtpdGV4dC5yZXBsYWNlKC8oPzpcXHN8XFxuKSpcXHgwMSg/Olxcc3xcXG4pKi9nLFwiXCIpO1xyXG5cdC8vIHNwbGl0IGludG8gd2lraXRleHQgYmVmb3JlL2FmdGVyIHRoZSByZW1haW5pbmcgY29udHJvbCBjaGFyYWN0ZXIgKGFuZCB0cmltIGVhY2ggc2VjdGlvbilcclxuXHR2YXIgdGFsa1dpa2l0ZXh0U2VjdGlvbnMgPSB0YWxrV2lraXRleHQuc3BsaXQoXCJcXHgwMlwiKS5tYXAodCA9PiB0LnRyaW0oKSk7XHJcblx0aWYgKHRhbGtXaWtpdGV4dFNlY3Rpb25zLmxlbmd0aCA9PT0gMikge1xyXG5cdFx0Ly8gRm91bmQgdGhlIGluc2VydGlvbiBwb2ludCBmb3IgdGhlIGJhbm5lcnNcclxuXHRcdHJldHVybiAodGFsa1dpa2l0ZXh0U2VjdGlvbnNbMF0gKyBcIlxcblwiICsgYmFubmVyc1dpa2l0ZXh0LnRyaW0oKSArIFwiXFxuXCIgKyB0YWxrV2lraXRleHRTZWN0aW9uc1sxXSkudHJpbSgpO1xyXG5cdH1cclxuXHQvLyBDaGVjayBpZiB0aGVyZSdzIGFueXRoaW5nIGJlc2lkZSB0ZW1wbGF0ZXNcclxuXHR2YXIgdGVtcFN0ciA9IHRhbGtXaWtpdGV4dDtcclxuXHR0YWxrVGVtcGxhdGVzLmZvckVhY2godGVtcGxhdGUgPT4ge1xyXG5cdFx0dGVtcFN0ciA9IHRlbXBTdHIucmVwbGFjZSh0ZW1wbGF0ZS53aWtpdGV4dCwgXCJcIik7XHJcblx0fSk7XHJcblx0aWYgKC9eI1JFRElSRUNUL2kudGVzdCh0YWxrV2lraXRleHQpIHx8ICF0ZW1wU3RyLnRyaW0oKSkge1xyXG5cdFx0Ly8gSXMgYSByZWRpcmVjdCwgb3IgZXZlcnl0aGluZyBpcyBhIHRlbXBsYXRlOiBpbnNlcnQgYXQgdGhlIGVuZFxyXG5cdFx0cmV0dXJuIHRhbGtXaWtpdGV4dC50cmltKCkgKyBcIlxcblwiICsgYmFubmVyc1dpa2l0ZXh0LnRyaW0oKTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0Ly8gVGhlcmUgaXMgbm9uLXRlbXBsYXRlIGNvbnRlbnQsIHNvIGluc2VydCBhdCB0aGUgc3RhcnRcclxuXHRcdHJldHVybiBiYW5uZXJzV2lraXRleHQudHJpbSgpICsgXCJcXG5cIiArIHRhbGtXaWtpdGV4dC50cmltKCk7XHJcblx0fVxyXG59O1xyXG5cclxuTWFpbldpbmRvdy5wcm90b3R5cGUuaXNSYXRlZEFuZE5vdFN0dWIgPSBmdW5jdGlvbigpIHtcclxuXHRjb25zdCBub25TdHViUmF0aW5nZ3MgPSB0aGlzLmJhbm5lckxpc3QuaXRlbXMuZmlsdGVyKGJhbm5lciA9PlxyXG5cdFx0YmFubmVyLmhhc0NsYXNzUmF0aW5ncyAmJlxyXG5cdFx0YmFubmVyLmNsYXNzRHJvcGRvd24uZ2V0VmFsdWUoKSAmJlxyXG5cdFx0YmFubmVyLmNsYXNzRHJvcGRvd24uZ2V0VmFsdWUoKSAhPT0gXCJTdHViXCJcclxuXHQpO1xyXG5cdHJldHVybiBub25TdHViUmF0aW5nZ3MubGVuZ3RoID4gMDtcclxufTtcclxuXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLm1ha2VFZGl0U3VtbWFyeSA9IGZ1bmN0aW9uKCkge1xyXG5cdGNvbnN0IHJlbW92ZWRCYW5uZXJzID0gW107XHJcblx0Y29uc3QgZWRpdGVkQmFubmVycyA9IFtdO1xyXG5cdGNvbnN0IG5ld0Jhbm5lcnMgPSBbXTtcclxuXHRjb25zdCBzaG9ydE5hbWUgPSBuYW1lID0+IG5hbWUucmVwbGFjZShcIldpa2lQcm9qZWN0IFwiLFwiXCIpLnJlcGxhY2UoXCJTdWJzdDpcIixcIlwiKTtcclxuXHJcblx0Ly8gT3ZlcmFsbCBjbGFzcy9pbXBvcnRhbmNlLCBpZiBhbGwgdGhlIHNhbWVcclxuXHRjb25zdCBhbGxDbGFzc2VzID0gdW5pcXVlQXJyYXkoXHJcblx0XHRmaWx0ZXJBbmRNYXAodGhpcy5iYW5uZXJMaXN0Lml0ZW1zLFxyXG5cdFx0XHRiYW5uZXIgPT4gYmFubmVyLmhhc0NsYXNzUmF0aW5ncyB8fCBiYW5uZXIuaXNTaGVsbFRlbXBsYXRlLFxyXG5cdFx0XHRiYW5uZXIgPT4gYmFubmVyLmNsYXNzRHJvcGRvd24uZ2V0VmFsdWUoKVxyXG5cdFx0KVxyXG5cdCk7XHJcblx0bGV0IG92ZXJhbGxDbGFzcyA9IGFsbENsYXNzZXMubGVuZ3RoID09PSAxICYmIGFsbENsYXNzZXNbMF07XHJcblx0Y29uc3QgYWxsSW1wb3J0YW5jZXMgPSB1bmlxdWVBcnJheShcclxuXHRcdGZpbHRlckFuZE1hcCh0aGlzLmJhbm5lckxpc3QuaXRlbXMsXHJcblx0XHRcdGJhbm5lciA9PiBiYW5uZXIuaGFzSW1wb3J0YW5jZVJhdGluZ3MsXHJcblx0XHRcdGJhbm5lciA9PiBiYW5uZXIuaW1wb3J0YW5jZURyb3Bkb3duLmdldFZhbHVlKClcclxuXHRcdClcclxuXHQpO1xyXG5cdGxldCBvdmVyYWxsSW1wb3J0YW5jZSA9IGFsbEltcG9ydGFuY2VzLmxlbmd0aCA9PT0gMSAmJiBhbGxJbXBvcnRhbmNlc1swXTtcclxuXHQvLyBEb24ndCB1c2UgdGhlbSB1bmxlc3Mgc29tZSBoYXZlIGNoYW5nZWRcclxuXHRsZXQgc29tZUNsYXNzZXNDaGFuZ2VkID0gZmFsc2U7XHJcblx0bGV0IHNvbWVJbXBvcnRhbmNlc0NoYW5nZWQgPSBmYWxzZTtcclxuXHJcblx0Ly8gcmVtb3ZlZCBiYW5uZXJzOlxyXG5cdHRoaXMuZXhpc3RpbmdCYW5uZXJOYW1lcy5mb3JFYWNoKG5hbWUgPT4ge1xyXG5cdFx0Y29uc3QgYmFubmVyID0gdGhpcy5iYW5uZXJMaXN0Lml0ZW1zLmZpbmQoIGJhbm5lciA9PiBiYW5uZXIubmFtZSA9PT0gbmFtZSB8fCBiYW5uZXIuYnlwYXNzZWROYW1lID09PSBuYW1lICk7XHJcblx0XHRpZiAoIWJhbm5lcikge1xyXG5cdFx0XHRyZW1vdmVkQmFubmVycy5wdXNoKFwi4oiSXCIgKyBzaG9ydE5hbWUobmFtZSkpO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG5cdC8vIGVkaXRlZCAmIG5ldyBiYW5uZXJzXHJcblx0dGhpcy5iYW5uZXJMaXN0Lml0ZW1zLmZvckVhY2goIGJhbm5lciA9PiB7XHJcblx0XHRjb25zdCBpc05ldyA9ICFiYW5uZXIud2lraXRleHQ7IC8vIG5vdCBhZGRlZCBmcm9tIHdpa2l0ZXh0IG9uIHBhZ2VcclxuXHRcdGlmICghaXNOZXcgJiYgIWJhbm5lci5jaGFuZ2VkKSB7XHJcblx0XHRcdC8vIE5vdCBjaGFuZ2VkXHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGxldCBuZXdDbGFzcyA9IGJhbm5lci5oYXNDbGFzc1JhdGluZ3MgJiYgIChpc05ldyB8fCBiYW5uZXIuY2xhc3NDaGFuZ2VkKSAmJiBiYW5uZXIuY2xhc3NEcm9wZG93bi5nZXRWYWx1ZSgpO1xyXG5cdFx0aWYgKG5ld0NsYXNzKSB7IHNvbWVDbGFzc2VzQ2hhbmdlZCA9IHRydWU7IH1cclxuXHRcdGlmIChvdmVyYWxsQ2xhc3MpIHsgbmV3Q2xhc3MgPSBudWxsOyB9XHJcblxyXG5cdFx0bGV0IG5ld0ltcG9ydGFuY2UgPSBiYW5uZXIuaGFzSW1wb3J0YW5jZVJhdGluZ3MgJiYgKGlzTmV3IHx8IGJhbm5lci5pbXBvcnRhbmNlQ2hhbmdlZCkgJiYgYmFubmVyLmltcG9ydGFuY2VEcm9wZG93bi5nZXRWYWx1ZSgpO1xyXG5cdFx0aWYgKG5ld0ltcG9ydGFuY2UpIHsgc29tZUltcG9ydGFuY2VzQ2hhbmdlZCA9IHRydWU7IH1cclxuXHRcdGlmIChvdmVyYWxsSW1wb3J0YW5jZSkgeyBuZXdJbXBvcnRhbmNlID0gbnVsbDsgfVxyXG5cclxuXHRcdGxldCByYXRpbmcgPSAobmV3Q2xhc3MgJiYgbmV3SW1wb3J0YW5jZSlcclxuXHRcdFx0PyBuZXdDbGFzcyArIFwiL1wiICsgbmV3SW1wb3J0YW5jZVxyXG5cdFx0XHQ6IG5ld0NsYXNzIHx8IG5ld0ltcG9ydGFuY2UgfHwgXCJcIjtcclxuXHRcdGlmIChyYXRpbmcpIHsgcmF0aW5nID0gXCIgKFwiICsgcmF0aW5nICsgXCIpXCI7IH1cclxuXHRcdFxyXG5cdFx0aWYgKGlzTmV3KSB7XHJcblx0XHRcdG5ld0Jhbm5lcnMucHVzaChcIitcIiArIHNob3J0TmFtZShiYW5uZXIubmFtZSkgKyByYXRpbmcpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0ZWRpdGVkQmFubmVycy5wdXNoKHNob3J0TmFtZShiYW5uZXIubmFtZSkgKyByYXRpbmcpO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG5cdC8vIG92ZXJhbGwgcmF0aW5nXHJcblx0bGV0IG92ZXJhbGxSYXRpbmcgPSAoc29tZUNsYXNzZXNDaGFuZ2VkICYmIG92ZXJhbGxDbGFzcyAmJiBzb21lSW1wb3J0YW5jZXNDaGFuZ2VkICYmIG92ZXJhbGxJbXBvcnRhbmNlKVxyXG5cdFx0PyBvdmVyYWxsQ2xhc3MgKyBcIi9cIiArIG92ZXJhbGxJbXBvcnRhbmNlXHJcblx0XHQ6IChzb21lQ2xhc3Nlc0NoYW5nZWQgJiYgb3ZlcmFsbENsYXNzKSB8fCAoc29tZUltcG9ydGFuY2VzQ2hhbmdlZCAmJiBvdmVyYWxsSW1wb3J0YW5jZSkgfHwgXCJcIjtcclxuXHRpZiAob3ZlcmFsbFJhdGluZykgeyBvdmVyYWxsUmF0aW5nID0gXCIgKFwiICsgb3ZlcmFsbFJhdGluZyArIFwiKVwiOyB9XHJcblxyXG5cdHJldHVybiBgQXNzZXNzbWVudCR7b3ZlcmFsbFJhdGluZ306ICR7Wy4uLmVkaXRlZEJhbm5lcnMsIC4uLm5ld0Jhbm5lcnMsIC4uLnJlbW92ZWRCYW5uZXJzXS5qb2luKFwiLCBcIil9JHthcHBDb25maWcuc2NyaXB0LmFkdmVydH1gO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWFpbldpbmRvdztcclxuLy8gPC9ub3dpa2k+IiwiaW1wb3J0IGNvbmZpZyBmcm9tIFwiLi9jb25maWdcIjtcclxuLy8gPG5vd2lraT5cclxuXHJcbnZhciBBUEkgPSBuZXcgbXcuQXBpKCB7XHJcblx0YWpheDoge1xyXG5cdFx0aGVhZGVyczogeyBcclxuXHRcdFx0XCJBcGktVXNlci1BZ2VudFwiOiBcIlJhdGVyL1wiICsgY29uZmlnLnNjcmlwdC52ZXJzaW9uICsgXHJcblx0XHRcdFx0XCIgKCBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Vc2VyOkV2YWQzNy9SYXRlciApXCJcclxuXHRcdH1cclxuXHR9XHJcbn0gKTtcclxuXHJcbi8qIC0tLS0tLS0tLS0gQVBJIGZvciBPUkVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cclxuQVBJLmdldE9SRVMgPSBmdW5jdGlvbihyZXZpc2lvbklEKSB7XHJcblx0cmV0dXJuICQuZ2V0KFwiaHR0cHM6Ly9vcmVzLndpa2ltZWRpYS5vcmcvdjMvc2NvcmVzL2Vud2lraT9tb2RlbHM9YXJ0aWNsZXF1YWxpdHkmcmV2aWRzPVwiK3JldmlzaW9uSUQpO1xyXG59O1xyXG5cclxuLyogLS0tLS0tLS0tLSBSYXcgd2lraXRleHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xyXG5BUEkuZ2V0UmF3ID0gZnVuY3Rpb24ocGFnZSkge1xyXG5cdHJldHVybiAkLmdldChcImh0dHBzOlwiICsgY29uZmlnLm13LndnU2VydmVyICsgbXcudXRpbC5nZXRVcmwocGFnZSwge2FjdGlvbjpcInJhd1wifSkpXHJcblx0XHQudGhlbihmdW5jdGlvbihkYXRhKSB7XHJcblx0XHRcdGlmICggIWRhdGEgKSB7XHJcblx0XHRcdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZWplY3QoXCJvay1idXQtZW1wdHlcIik7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGRhdGE7XHJcblx0XHR9KTtcclxufTtcclxuXHJcbi8qIC0tLS0tLS0tLS0gRWRpdCB3aXRoIHJldHJ5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cclxuLyoqXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSB0aXRsZVxyXG4gKiBAcGFyYW0ge09iamVjdD99IHBhcmFtcyBhZGRpdGlvbmFsIHBhcmFtcyBmb3IgdGhlIGdldCByZXF1ZXN0XHJcbiAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdCwgc3RyaW5nPn0gcGFnZSwgc3RhcnR0aW1lIHRpbWVzdGFtcFxyXG4gKi9cclxudmFyIGdldFBhZ2UgPSBmdW5jdGlvbih0aXRsZSwgcGFyYW1zKSB7XHJcblx0cmV0dXJuIEFQSS5nZXQoXHJcblx0XHQkLmV4dGVuZChcclxuXHRcdFx0e1xyXG5cdFx0XHRcdFwiYWN0aW9uXCI6IFwicXVlcnlcIixcclxuXHRcdFx0XHRcImZvcm1hdFwiOiBcImpzb25cIixcclxuXHRcdFx0XHRcImN1cnRpbWVzdGFtcFwiOiAxLFxyXG5cdFx0XHRcdFwidGl0bGVzXCI6IHRpdGxlLFxyXG5cdFx0XHRcdFwicHJvcFwiOiBcInJldmlzaW9uc3xpbmZvXCIsXHJcblx0XHRcdFx0XCJydnByb3BcIjogXCJjb250ZW50fHRpbWVzdGFtcFwiLFxyXG5cdFx0XHRcdFwicnZzbG90c1wiOiBcIm1haW5cIlx0XHRcdFx0XHRcclxuXHRcdFx0fSxcclxuXHRcdFx0cGFyYW1zXHJcblx0XHQpXHJcblx0KS50aGVuKHJlc3BvbnNlID0+IHtcclxuXHRcdHZhciBwYWdlID0gT2JqZWN0LnZhbHVlcyhyZXNwb25zZS5xdWVyeS5wYWdlcylbMF07XHJcblx0XHR2YXIgc3RhcnR0aW1lID0gcmVzcG9uc2UuY3VydGltZXN0YW1wO1xyXG5cdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlKHBhZ2UsIHN0YXJ0dGltZSk7XHJcblx0fSk7XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtPYmplY3R9IHBhZ2UgZGV0YWlscyBvYmplY3QgZnJvbSBBUElcclxuICogQHBhcmFtIHtzdHJpbmd9IHN0YXJ0dGltZSB0aW1lc3RhbXBcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIGNhbGxiYWNrIHRoYXQgcHJlcGFyZXMgdGhlIGVkaXQ6XHJcbiAqICB7T2JqZWN0fSBzaW1wbGlmaWVkUGFnZSA9PiB7T2JqZWN0fFByb21pc2U8T2JqZWN0Pn0gZWRpdCBwYXJhbXNcclxuICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gcGFyYW1zIGZvciBlZGl0IHF1ZXJ5XHJcbiAqL1xyXG52YXIgcHJvY2Vzc1BhZ2UgPSBmdW5jdGlvbihwYWdlLCBzdGFydHRpbWUsIHRyYW5zZm9ybSkge1xyXG5cdHZhciBiYXNldGltZXN0YW1wID0gcGFnZS5yZXZpc2lvbnMgJiYgcGFnZS5yZXZpc2lvbnNbMF0udGltZXN0YW1wO1xyXG5cdHZhciBzaW1wbGlmaWVkUGFnZSA9IHtcclxuXHRcdHBhZ2VpZDogcGFnZS5wYWdlaWQsXHJcblx0XHRtaXNzaW5nOiBwYWdlLm1pc3NpbmcgPT09IFwiXCIsXHJcblx0XHRyZWRpcmVjdDogcGFnZS5yZWRpcmVjdCA9PT0gXCJcIixcclxuXHRcdGNhdGVnb3JpZXM6IHBhZ2UuY2F0ZWdvcmllcyxcclxuXHRcdG5zOiBwYWdlLm5zLFxyXG5cdFx0dGl0bGU6IHBhZ2UudGl0bGUsXHJcblx0XHRjb250ZW50OiBwYWdlLnJldmlzaW9ucyAmJiBwYWdlLnJldmlzaW9uc1swXS5zbG90cy5tYWluW1wiKlwiXVxyXG5cdH07XHJcblx0cmV0dXJuICQud2hlbiggdHJhbnNmb3JtKHNpbXBsaWZpZWRQYWdlKSApXHJcblx0XHQudGhlbiggZWRpdFBhcmFtcyA9PlxyXG5cdFx0XHQkLmV4dGVuZCgge1xyXG5cdFx0XHRcdGFjdGlvbjogXCJlZGl0XCIsXHJcblx0XHRcdFx0dGl0bGU6IHBhZ2UudGl0bGUsXHJcblx0XHRcdFx0Ly8gUHJvdGVjdCBhZ2FpbnN0IGVycm9ycyBhbmQgY29uZmxpY3RzXHJcblx0XHRcdFx0YXNzZXJ0OiBcInVzZXJcIixcclxuXHRcdFx0XHRiYXNldGltZXN0YW1wOiBiYXNldGltZXN0YW1wLFxyXG5cdFx0XHRcdHN0YXJ0dGltZXN0YW1wOiBzdGFydHRpbWVcclxuXHRcdFx0fSwgZWRpdFBhcmFtcyApXHJcblx0XHQpO1xyXG59O1xyXG5cclxuLyoqIGVkaXRXaXRoUmV0cnlcclxuICogXHJcbiAqIEVkaXRzIGEgcGFnZSwgcmVzb2x2aW5nIGVkaXQgY29uZmxpY3RzLCBhbmQgcmV0cnlpbmcgZWRpdHMgdGhhdCBmYWlsLiBUaGVcclxuICogdHJhbmZvcm0gZnVuY3Rpb24gbWF5IHJldHVybiBhIHJlamVjdGVkIHByb21pc2UgaWYgdGhlIHBhZ2Ugc2hvdWxkIG5vdCBiZVxyXG4gKiBlZGl0ZWQ7IHRoZSBAcmV0dXJucyB7UHJvbWlzZX0gd2lsbCB3aWxsIGJlIHJlamVjdGVkIHdpdGggdGhlIHNhbWUgcmVqZWN0aW9uXHJcbiAqIHZhbHVlcy5cclxuICogXHJcbiAqIE5vdGU6IFVubGlrZSBbbXcuQXBpI0VkaXRdLCBhIG1pc3NpbmcgcGFnZSB3aWxsIGJlIGNyZWF0ZWQsIHVubGVzcyB0aGVcclxuICogdHJhbnNmb3JtIGNhbGxiYWNrIGluY2x1ZGVzIHRoZSBcIm5vY3JlYXRlXCIgcGFyYW0uXHJcbiAqIFxyXG4gKiBbbXcuQXBpI0VkaXRdOiA8aHR0cHM6Ly9kb2Mud2lraW1lZGlhLm9yZy9tZWRpYXdpa2ktY29yZS9tYXN0ZXIvanMvIyEvYXBpL213LkFwaS5wbHVnaW4uZWRpdD5cclxuICogXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSB0aXRsZSBwYWdlIHRvIGJlIGVkaXRlZFxyXG4gKiBAcGFyYW0ge09iamVjdHxudWxsfSBnZXRQYXJhbXMgYWRkaXRpb25hbCBwYXJhbXMgZm9yIHRoZSBnZXQgcmVxdWVzdFxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gY2FsbGJhY2sgdGhhdCBwcmVwYXJlcyB0aGUgZWRpdDpcclxuICogIHtPYmplY3R9IHNpbXBsaWZpZWRQYWdlID0+IHtPYmplY3R8UHJvbWlzZTxPYmplY3Q+fSBwYXJhbXMgZm9yIEFQSSBlZGl0aW5nXHJcbiAqIEByZXR1cm5zIHtQcm9taXNlPG9iamVjdD59IHByb21pc2UsIHJlc29sdmVkIG9uIHN1Y2Nlc3MsIHJlamVjdGVkIGlmXHJcbiAqICBwYWdlIHdhcyBub3QgZWRpdGVkXHJcbiAqL1xyXG5BUEkuZWRpdFdpdGhSZXRyeSA9IGZ1bmN0aW9uKHRpdGxlLCBnZXRQYXJhbXMsIHRyYW5zZm9ybSkge1xyXG5cdHJldHVybiBnZXRQYWdlKHRpdGxlLCBnZXRQYXJhbXMpXHJcblx0XHQudGhlbihcclxuXHRcdC8vIFN1Y2NlczogcHJvY2VzcyB0aGUgcGFnZVxyXG5cdFx0XHQocGFnZSwgc3RhcnR0aW1lKSA9PiBwcm9jZXNzUGFnZShwYWdlLCBzdGFydHRpbWUsIHRyYW5zZm9ybSksXHJcblx0XHRcdC8vIEZhaWx1cmU6IHRyeSBhZ2FpblxyXG5cdFx0XHQoKSA9PiBnZXRQYWdlKHRpdGxlLCBnZXRQYXJhbXMpLnRoZW4ocHJvY2Vzc1BhZ2UsIHRyYW5zZm9ybSlcclxuXHRcdClcclxuXHRcdC50aGVuKGVkaXRQYXJhbXMgPT5cclxuXHRcdFx0QVBJLnBvc3RXaXRoVG9rZW4oXCJjc3JmXCIsIGVkaXRQYXJhbXMpXHJcblx0XHRcdFx0LmNhdGNoKCBlcnJvckNvZGUgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKCBlcnJvckNvZGUgPT09IFwiZWRpdGNvbmZsaWN0XCIgKSB7XHJcblx0XHRcdFx0XHRcdC8vIFRyeSBhZ2Fpbiwgc3RhcnRpbmcgb3ZlclxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gQVBJLmVkaXRXaXRoUmV0cnkodGl0bGUsIGdldFBhcmFtcywgdHJhbnNmb3JtKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8vIFRyeSBhZ2FpblxyXG5cdFx0XHRcdFx0cmV0dXJuIEFQSS5wb3N0V2l0aFRva2VuKFwiY3NyZlwiLCBlZGl0UGFyYW1zKTtcclxuXHRcdFx0XHR9KVxyXG5cdFx0KTtcclxufTtcclxuXHJcbnZhciBtYWtlRXJyb3JNc2cgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kKSB7XHJcblx0dmFyIGNvZGUsIHhociwgbWVzc2FnZTtcclxuXHRpZiAoIHR5cGVvZiBmaXJzdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygc2Vjb25kID09PSBcInN0cmluZ1wiICkge1xyXG5cdFx0Ly8gRXJyb3JzIGZyb20gJC5nZXQgYmVpbmcgcmVqZWN0ZWQgKE9SRVMgJiBSYXcgd2lraXRleHQpXHJcblx0XHR2YXIgZXJyb3JPYmogPSBmaXJzdC5yZXNwb25zZUpTT04gJiYgZmlyc3QucmVzcG9uc2VKU09OLmVycm9yO1xyXG5cdFx0aWYgKCBlcnJvck9iaiApIHtcclxuXHRcdFx0Ly8gR290IGFuIGFwaS1zcGVjaWZpYyBlcnJvciBjb2RlL21lc3NhZ2VcclxuXHRcdFx0Y29kZSA9IGVycm9yT2JqLmNvZGU7XHJcblx0XHRcdG1lc3NhZ2UgPSBlcnJvck9iai5tZXNzYWdlO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0eGhyID0gZmlyc3Q7XHJcblx0XHR9XHJcblx0fSBlbHNlIGlmICggdHlwZW9mIGZpcnN0ID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiBzZWNvbmQgPT09IFwib2JqZWN0XCIgKSB7XHJcblx0XHQvLyBFcnJvcnMgZnJvbSBtdy5BcGkgb2JqZWN0XHJcblx0XHR2YXIgbXdFcnJvck9iaiA9IHNlY29uZC5lcnJvcjtcclxuXHRcdGlmIChtd0Vycm9yT2JqKSB7XHJcblx0XHRcdC8vIEdvdCBhbiBhcGktc3BlY2lmaWMgZXJyb3IgY29kZS9tZXNzYWdlXHJcblx0XHRcdGNvZGUgPSBlcnJvck9iai5jb2RlO1xyXG5cdFx0XHRtZXNzYWdlID0gZXJyb3JPYmouaW5mbztcclxuXHRcdH0gZWxzZSBpZiAoZmlyc3QgPT09IFwib2stYnV0LWVtcHR5XCIpIHtcclxuXHRcdFx0Y29kZSA9IG51bGw7XHJcblx0XHRcdG1lc3NhZ2UgPSBcIkdvdCBhbiBlbXB0eSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXJcIjtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHhociA9IHNlY29uZCAmJiBzZWNvbmQueGhyO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0aWYgKGNvZGUgJiYgbWVzc2FnZSkge1xyXG5cdFx0cmV0dXJuIGBBUEkgZXJyb3IgJHtjb2RlfTogJHttZXNzYWdlfWA7XHJcblx0fSBlbHNlIGlmIChtZXNzYWdlKSB7XHJcblx0XHRyZXR1cm4gYEFQSSBlcnJvcjogJHttZXNzYWdlfWA7XHJcblx0fSBlbHNlIGlmICh4aHIpIHtcclxuXHRcdHJldHVybiBgSFRUUCBlcnJvciAke3hoci5zdGF0dXN9YDtcclxuXHR9IGVsc2UgaWYgKFxyXG5cdFx0dHlwZW9mIGZpcnN0ID09PSBcInN0cmluZ1wiICYmIGZpcnN0ICE9PSBcImVycm9yXCIgJiZcclxuXHRcdHR5cGVvZiBzZWNvbmQgPT09IFwic3RyaW5nXCIgJiYgc2Vjb25kICE9PSBcImVycm9yXCJcclxuXHQpIHtcclxuXHRcdHJldHVybiBgRXJyb3IgJHtmaXJzdH06ICR7c2Vjb25kfWA7XHJcblx0fSBlbHNlIGlmICh0eXBlb2YgZmlyc3QgPT09IFwic3RyaW5nXCIgJiYgZmlyc3QgIT09IFwiZXJyb3JcIikge1xyXG5cdFx0cmV0dXJuIGBFcnJvcjogJHtmaXJzdH1gO1xyXG5cdH0gZWxzZSB7XHJcblx0XHRyZXR1cm4gXCJVbmtub3duIEFQSSBlcnJvclwiO1xyXG5cdH1cclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEFQSTtcclxuZXhwb3J0IHsgbWFrZUVycm9yTXNnIH07XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCBjb25maWcgZnJvbSBcIi4vY29uZmlnXCI7XHJcbmltcG9ydCB7IGdldFByZWZzIH0gZnJvbSBcIi4vcHJlZnNcIjtcclxuaW1wb3J0IEFQSSwgeyBtYWtlRXJyb3JNc2cgfSBmcm9tIFwiLi9hcGlcIjtcclxuaW1wb3J0IHNldHVwUmF0ZXIgZnJvbSBcIi4vc2V0dXBcIjtcclxuLy8gPG5vd2lraT5cclxuXHJcbnZhciBhdXRvU3RhcnQgPSBmdW5jdGlvbiBhdXRvU3RhcnQoKSB7XHJcblxyXG5cdHJldHVybiBnZXRQcmVmcygpLnRoZW4ocHJlZnMgPT4ge1xyXG5cdFx0Ly8gQ2hlY2sgaWYgcHJlZiBpcyB0dXJuZWQgb2ZmXHJcblx0XHRpZiAoIXByZWZzLmF1dG9zdGFydCkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHQvLyBDaGVjayBpZiBwcmVmIGlzIHR1cm5lZCBvZmYgZm9yIHJlZGlyZWN0cywgYW5kIGN1cnJlbnQgcGFnZSBpcyBhIHJlZGlyZWN0XHJcblx0XHRpZiAoIXByZWZzLmF1dG9zdGFydFJlZGlyZWN0cyAmJiB3aW5kb3cubG9jYXRpb24uc2VhcmNoLmluY2x1ZGVzKFwicmVkaXJlY3Q9bm9cIikpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0Ly8gQ2hlY2sgaWYgdmlld2luZyBkaWZmL2hpc3Rvcnkvb2xkIHZlcnNpb25cclxuXHRcdGlmICgvKGFjdGlvbnxkaWZmfG9sZGlkKS8udGVzdCh3aW5kb3cubG9jYXRpb24uc2VhcmNoKSkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRjb25zdCBzdWJqZWN0VGl0bGUgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dChjb25maWcubXcud2dQYWdlTmFtZSkuZ2V0U3ViamVjdFBhZ2UoKTtcclxuXHRcdC8vIENoZWNrIGlmIHN1YmplY3QgcGFnZSBpcyB0aGUgbWFpbiBwYWdlXHJcblx0XHRpZiAoc3ViamVjdFRpdGxlLmdldFByZWZpeGVkVGV4dCgpID09PSBcIk1haW4gUGFnZVwiKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdC8vIENoZWNrIHN1YmplY3QgcGFnZSBuYW1lc3BhY2VcclxuXHRcdGlmIChcclxuXHRcdFx0cHJlZnMuYXV0b3N0YXJ0TmFtZXNwYWNlcyAmJlxyXG5cdFx0XHRwcmVmcy5hdXRvc3RhcnROYW1lc3BhY2VzLmxlbmd0aCAmJlxyXG5cdFx0XHQhcHJlZnMuYXV0b3N0YXJ0TmFtZXNwYWNlcy5pbmNsdWRlcyhjb25maWcubXcud2dOYW1lc3BhY2VOdW1iZXIpXHJcblx0XHQpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFxyXG5cdFx0Ly8gSWYgdGFsayBwYWdlIGRvZXMgbm90IGV4aXN0LCBjYW4ganVzdCBhdXRvc3RhcnRcclxuXHRcdGlmICggJChcIiNjYS10YWxrLm5ld1wiKS5sZW5ndGggKSB7XHJcblx0XHRcdHJldHVybiBzZXR1cFJhdGVyKCk7XHJcblx0XHR9XHRcclxuXHJcblx0XHQvKiBDaGVjayB0ZW1wbGF0ZXMgcHJlc2VudCBvbiB0YWxrIHBhZ2UuIEZldGNoZXMgaW5kaXJlY3RseSB0cmFuc2NsdWRlZCB0ZW1wbGF0ZXMsIHNvIHdpbGwgZmluZFxyXG5cdFx0XHRUZW1wbGF0ZTpXUEJhbm5lck1ldGEgKGFuZCBpdHMgc3VidGVtcGxhdGVzKS4gQnV0IHNvbWUgYmFubmVycyBzdWNoIGFzIE1JTEhJU1QgZG9uJ3QgdXNlIHRoYXRcclxuXHRcdFx0bWV0YSB0ZW1wbGF0ZSwgc28gd2UgYWxzbyBoYXZlIHRvIGNoZWNrIGZvciB0ZW1wbGF0ZSB0aXRsZXMgY29udGFpbmcgJ1dpa2lQcm9qZWN0J1xyXG5cdFx0Ki9cclxuXHRcdGNvbnN0IHRhbGtUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KGNvbmZpZy5tdy53Z1BhZ2VOYW1lKS5nZXRUYWxrUGFnZSgpO1xyXG5cdFx0cmV0dXJuIEFQSS5nZXQoe1xyXG5cdFx0XHRhY3Rpb246IFwicXVlcnlcIixcclxuXHRcdFx0Zm9ybWF0OiBcImpzb25cIixcclxuXHRcdFx0cHJvcDogXCJ0ZW1wbGF0ZXNcIixcclxuXHRcdFx0dGl0bGVzOiB0YWxrVGl0bGUuZ2V0UHJlZml4ZWRUZXh0KCksXHJcblx0XHRcdHRsbmFtZXNwYWNlOiBcIjEwXCIsXHJcblx0XHRcdHRsbGltaXQ6IFwiNTAwXCIsXHJcblx0XHRcdGluZGV4cGFnZWlkczogMVxyXG5cdFx0fSlcclxuXHRcdFx0LnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XHJcblx0XHRcdFx0dmFyIGlkID0gcmVzdWx0LnF1ZXJ5LnBhZ2VpZHM7XHJcblx0XHRcdFx0dmFyIHRlbXBsYXRlcyA9IHJlc3VsdC5xdWVyeS5wYWdlc1tpZF0udGVtcGxhdGVzO1xyXG5cdFx0XHRcclxuXHRcdFx0XHRpZiAoICF0ZW1wbGF0ZXMgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gc2V0dXBSYXRlcigpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHJcblx0XHRcdFx0dmFyIGhhc1dpa2lwcm9qZWN0ID0gdGVtcGxhdGVzLnNvbWUodGVtcGxhdGUgPT4gLyhXaWtpUHJvamVjdHxXUEJhbm5lcikvLnRlc3QodGVtcGxhdGUudGl0bGUpKTtcclxuXHRcdFx0XHJcblx0XHRcdFx0aWYgKCAhaGFzV2lraXByb2plY3QgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gc2V0dXBSYXRlcigpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHJcblx0XHRcdH0sXHJcblx0XHRcdGZ1bmN0aW9uKGNvZGUsIGpxeGhyKSB7XHJcblx0XHRcdC8vIFNpbGVudGx5IGlnbm9yZSBmYWlsdXJlcyAoanVzdCBsb2cgdG8gY29uc29sZSlcclxuXHRcdFx0XHRjb25zb2xlLndhcm4oXHJcblx0XHRcdFx0XHRcIltSYXRlcl0gRXJyb3Igd2hpbGUgY2hlY2tpbmcgd2hldGhlciB0byBhdXRvc3RhcnQuXCIgK1xyXG5cdFx0XHRcdCggY29kZSA9PSBudWxsICkgPyBcIlwiIDogXCIgXCIgKyBtYWtlRXJyb3JNc2coY29kZSwganF4aHIpXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHRyZXR1cm4gJC5EZWZlcnJlZCgpLnJlamVjdCgpO1xyXG5cdFx0XHR9KTtcclxuXHR9KTtcclxuXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBhdXRvU3RhcnQ7XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCB7aXNBZnRlckRhdGV9IGZyb20gXCIuL3V0aWxcIjtcclxuLy8gPG5vd2lraT5cclxuXHJcbi8qKiB3cml0ZVxyXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5XHJcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSB2YWxcclxuICogQHBhcmFtIHtOdW1iZXJ9IHN0YWxlRGF5cyBOdW1iZXIgb2YgZGF5cyBhZnRlciB3aGljaCB0aGUgZGF0YSBiZWNvbWVzIHN0YWxlICh1c2FibGUsIGJ1dCBzaG91bGRcclxuICogIGJlIHVwZGF0ZWQgZm9yIG5leHQgdGltZSkuXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBleHBpcnlEYXlzIE51bWJlciBvZiBkYXlzIGFmdGVyIHdoaWNoIHRoZSBjYWNoZWQgZGF0YSBtYXkgYmUgZGVsZXRlZC5cclxuICovXHJcbmNvbnN0IHdyaXRlID0gZnVuY3Rpb24oa2V5LCB2YWwsIHN0YWxlRGF5cywgZXhwaXJ5RGF5cykge1xyXG5cdHRyeSB7XHJcblx0XHRjb25zdCBkZWZhdWx0U3RhbGVEYXlzID0gMTtcclxuXHRcdGNvbnN0IGRlZmF1bHRFeHBpcnlEYXlzID0gMzA7XHJcblx0XHRjb25zdCBtaWxsaXNlY29uZHNQZXJEYXkgPSAyNCo2MCo2MCoxMDAwO1xyXG5cclxuXHRcdGNvbnN0IHN0YWxlRHVyYXRpb24gPSAoc3RhbGVEYXlzIHx8IGRlZmF1bHRTdGFsZURheXMpKm1pbGxpc2Vjb25kc1BlckRheTtcclxuXHRcdGNvbnN0IGV4cGlyeUR1cmF0aW9uID0gKGV4cGlyeURheXMgfHwgZGVmYXVsdEV4cGlyeURheXMpKm1pbGxpc2Vjb25kc1BlckRheTtcclxuXHJcblx0XHRjb25zdCBzdHJpbmdWYWwgPSBKU09OLnN0cmluZ2lmeSh7XHJcblx0XHRcdHZhbHVlOiB2YWwsXHJcblx0XHRcdHN0YWxlRGF0ZTogbmV3IERhdGUoRGF0ZS5ub3coKSArIHN0YWxlRHVyYXRpb24pLnRvSVNPU3RyaW5nKCksXHJcblx0XHRcdGV4cGlyeURhdGU6IG5ldyBEYXRlKERhdGUubm93KCkgKyBleHBpcnlEdXJhdGlvbikudG9JU09TdHJpbmcoKVxyXG5cdFx0fSk7XHJcblx0XHRsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIlJhdGVyLVwiK2tleSwgc3RyaW5nVmFsKTtcclxuXHR9ICBjYXRjaChlKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5XHJcbn07XHJcbi8qKiByZWFkXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcclxuICogQHJldHVybnMge0FycmF5fE9iamVjdHxTdHJpbmd8TnVsbH0gQ2FjaGVkIGFycmF5IG9yIG9iamVjdCwgb3IgZW1wdHkgc3RyaW5nIGlmIG5vdCB5ZXQgY2FjaGVkLFxyXG4gKiAgICAgICAgICBvciBudWxsIGlmIHRoZXJlIHdhcyBlcnJvci5cclxuICovXHJcbmNvbnN0IHJlYWQgPSBmdW5jdGlvbihrZXkpIHtcclxuXHRsZXQgdmFsO1xyXG5cdHRyeSB7XHJcblx0XHRjb25zdCBzdHJpbmdWYWwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlJhdGVyLVwiK2tleSk7XHJcblx0XHRpZiAoIHN0cmluZ1ZhbCAhPT0gXCJcIiApIHtcclxuXHRcdFx0dmFsID0gSlNPTi5wYXJzZShzdHJpbmdWYWwpO1xyXG5cdFx0fVxyXG5cdH0gIGNhdGNoKGUpIHtcclxuXHRcdGNvbnNvbGUubG9nKFwiW1JhdGVyXSBlcnJvciByZWFkaW5nIFwiICsga2V5ICsgXCIgZnJvbSBsb2NhbFN0b3JhZ2UgY2FjaGU6XCIpO1xyXG5cdFx0Y29uc29sZS5sb2coXHJcblx0XHRcdFwiXFx0XCIgKyBlLm5hbWUgKyBcIiBtZXNzYWdlOiBcIiArIGUubWVzc2FnZSArXHJcblx0XHRcdCggZS5hdCA/IFwiIGF0OiBcIiArIGUuYXQgOiBcIlwiKSArXHJcblx0XHRcdCggZS50ZXh0ID8gXCIgdGV4dDogXCIgKyBlLnRleHQgOiBcIlwiKVxyXG5cdFx0KTtcclxuXHR9XHJcblx0cmV0dXJuIHZhbCB8fCBudWxsO1xyXG59O1xyXG5cclxuY29uc3QgaXNSYXRlcktleSA9IGtleSA9PiBrZXkgJiYga2V5LmluZGV4T2YoXCJSYXRlci1cIikgPT09IDA7XHJcblxyXG5jb25zdCBjbGVhckl0ZW1JZkludmFsaWQgPSBmdW5jdGlvbihrZXkpIHtcclxuXHRpZiAoICFpc1JhdGVyS2V5KGtleSkgKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdGNvbnN0IGl0ZW0gPSByZWFkKGtleS5yZXBsYWNlKFwiUmF0ZXItXCIsXCJcIikpO1xyXG5cdGNvbnN0IGlzSW52YWxpZCA9ICFpdGVtIHx8ICFpdGVtLmV4cGlyeURhdGUgfHwgaXNBZnRlckRhdGUoaXRlbS5leHBpcnlEYXRlKTtcclxuXHRpZiAoIGlzSW52YWxpZCApIHtcclxuXHRcdGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XHJcblx0fVxyXG59O1xyXG5cclxuY29uc3QgY2xlYXJJbnZhbGlkSXRlbXMgPSBmdW5jdGlvbigpIHtcclxuXHQvLyBMb29wIGJhY2t3YXJkcyBhcyBsb2NhbFN0b3JhZ2UgbGVuZ3RoIHdpbGwgZGVjcmVhc2UgYXMgaXRlbXMgYXJlIHJlbW92ZWRcclxuXHRmb3IgKGxldCBpID0gbG9jYWxTdG9yYWdlLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcclxuXHRcdHNldFRpbWVvdXQoY2xlYXJJdGVtSWZJbnZhbGlkLCAxMDAsIGxvY2FsU3RvcmFnZS5rZXkoaSkpO1xyXG5cdH1cclxufTtcclxuXHJcbmNvbnN0IGNsZWFyQWxsSXRlbXMgPSBmdW5jdGlvbigpIHtcclxuXHQvLyBMb29wIGJhY2t3YXJkcyBhcyBsb2NhbFN0b3JhZ2UgbGVuZ3RoIHdpbGwgZGVjcmVhc2UgYXMgaXRlbXMgYXJlIHJlbW92ZWRcclxuXHRmb3IgKGxldCBpID0gbG9jYWxTdG9yYWdlLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcclxuXHRcdGxldCBrZXkgPSBsb2NhbFN0b3JhZ2Uua2V5KGkpO1xyXG5cdFx0aWYgKGlzUmF0ZXJLZXkoa2V5KSkge1xyXG5cdFx0XHRsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xyXG5cdFx0fVxyXG5cdH1cclxufTtcclxuXHJcbmV4cG9ydCB7IHdyaXRlLCByZWFkLCBjbGVhckl0ZW1JZkludmFsaWQsIGNsZWFySW52YWxpZEl0ZW1zLCBjbGVhckFsbEl0ZW1zIH07XHJcbi8vIDwvbm93aWtpPiIsIi8vIDxub3dpa2k+XHJcbmNvbnN0IHBhY2thZ2Vqc29uID0gcmVxdWlyZShcIi4uL3BhY2thZ2UuanNvblwiKTtcclxudmFyIHZlcnNpb24gPSBwYWNrYWdlanNvbi52ZXJzaW9uO1xyXG5cclxuLy8gQSBnbG9iYWwgb2JqZWN0IHRoYXQgc3RvcmVzIGFsbCB0aGUgcGFnZSBhbmQgdXNlciBjb25maWd1cmF0aW9uIGFuZCBzZXR0aW5nc1xyXG52YXIgY29uZmlnID0ge1xyXG5cdC8vIFNjcmlwdCBpbmZvXHJcblx0c2NyaXB0OiB7XHJcblx0XHQvLyBBZHZlcnQgdG8gYXBwZW5kIHRvIGVkaXQgc3VtbWFyaWVzXHJcblx0XHRhZHZlcnQ6ICBgIChbW1dQOlJBVEVSIyR7dmVyc2lvbn18UmF0ZXJdXSlgLFxyXG5cdFx0dmVyc2lvbjogdmVyc2lvblxyXG5cdH0sXHJcblx0Ly8gRGVmYXVsdCBwcmVmZXJlbmNlcywgaWYgdXNlciBzdWJwYWdlIHJhdGVyUHJlZnMuanNvbiBkb2VzIG5vdCBleGlzdFxyXG5cdGRlZmF1bHRQcmVmczoge1xyXG5cdFx0XCJhdXRvc3RhcnRcIjogZmFsc2UsXHJcblx0XHRcImF1dG9zdGFydFJlZGlyZWN0c1wiOiBmYWxzZSxcclxuXHRcdFwiYXV0b3N0YXJ0TmFtZXNwYWNlc1wiOiBbMF0sXHJcblx0XHRcIm1pbkZvclNoZWxsXCI6IDEsXHJcblx0XHRcImJ5cGFzc1JlZGlyZWN0c1wiOiB0cnVlLFxyXG5cdFx0XCJhdXRvZmlsbENsYXNzRnJvbU90aGVyc1wiOiB0cnVlLFxyXG5cdFx0XCJhdXRvZmlsbENsYXNzRnJvbU9yZXNcIjogdHJ1ZSxcclxuXHRcdFwiYXV0b2ZpbGxJbXBvcnRhbmNlXCI6IHRydWUsXHJcblx0XHRcImNvbGxhcHNlUGFyYW1zTG93ZXJMaW1pdFwiOiA2LFxyXG5cdFx0XCJ3YXRjaGxpc3RcIjogXCJwcmVmZXJlbmNlc1wiXHJcblx0fSxcclxuXHQvLyBNZWRpYVdpa2kgY29uZmlndXJhdGlvbiB2YWx1ZXNcclxuXHRtdzogbXcuY29uZmlnLmdldCggW1xyXG5cdFx0XCJza2luXCIsXHJcblx0XHRcIndnUGFnZU5hbWVcIixcclxuXHRcdFwid2dOYW1lc3BhY2VOdW1iZXJcIixcclxuXHRcdFwid2dVc2VyTmFtZVwiLFxyXG5cdFx0XCJ3Z0Zvcm1hdHRlZE5hbWVzcGFjZXNcIixcclxuXHRcdFwid2dNb250aE5hbWVzXCIsXHJcblx0XHRcIndnUmV2aXNpb25JZFwiLFxyXG5cdFx0XCJ3Z1NjcmlwdFBhdGhcIixcclxuXHRcdFwid2dTZXJ2ZXJcIixcclxuXHRcdFwid2dDYXRlZ29yaWVzXCIsXHJcblx0XHRcIndnSXNNYWluUGFnZVwiXHJcblx0XSApLFxyXG5cdGJhbm5lckRlZmF1bHRzOiB7XHJcblx0XHRjbGFzc2VzOiBbXHJcblx0XHRcdFwiRkFcIixcclxuXHRcdFx0XCJGTFwiLFxyXG5cdFx0XHRcIkFcIixcclxuXHRcdFx0XCJHQVwiLFxyXG5cdFx0XHRcIkJcIixcclxuXHRcdFx0XCJDXCIsXHJcblx0XHRcdFwiU3RhcnRcIixcclxuXHRcdFx0XCJTdHViXCIsXHJcblx0XHRcdFwiTGlzdFwiXHJcblx0XHRdLFxyXG5cdFx0aW1wb3J0YW5jZXM6IFtcclxuXHRcdFx0XCJUb3BcIixcclxuXHRcdFx0XCJIaWdoXCIsXHJcblx0XHRcdFwiTWlkXCIsXHJcblx0XHRcdFwiTG93XCJcclxuXHRcdF0sXHJcblx0XHRleHRlbmRlZENsYXNzZXM6IFtcclxuXHRcdFx0XCJDYXRlZ29yeVwiLFxyXG5cdFx0XHRcIkRyYWZ0XCIsXHJcblx0XHRcdFwiRmlsZVwiLFxyXG5cdFx0XHRcIkZNXCIsXHJcblx0XHRcdFwiUG9ydGFsXCIsXHJcblx0XHRcdFwiUHJvamVjdFwiLFxyXG5cdFx0XHRcIlRlbXBsYXRlXCIsXHJcblx0XHRcdFwiQnBsdXNcIixcclxuXHRcdFx0XCJGdXR1cmVcIixcclxuXHRcdFx0XCJDdXJyZW50XCIsXHJcblx0XHRcdFwiRGlzYW1iaWdcIixcclxuXHRcdFx0XCJOQVwiLFxyXG5cdFx0XHRcIlJlZGlyZWN0XCIsXHJcblx0XHRcdFwiQm9va1wiXHJcblx0XHRdLFxyXG5cdFx0ZXh0ZW5kZWRJbXBvcnRhbmNlczogW1xyXG5cdFx0XHRcIlRvcFwiLFxyXG5cdFx0XHRcIkhpZ2hcIixcclxuXHRcdFx0XCJNaWRcIixcclxuXHRcdFx0XCJMb3dcIixcclxuXHRcdFx0XCJCb3R0b21cIixcclxuXHRcdFx0XCJOQVwiXHJcblx0XHRdXHJcblx0fSxcclxuXHRjdXN0b21CYW5uZXJzOiB7XHJcblx0XHRcIldpa2lQcm9qZWN0IE1pbGl0YXJ5IGhpc3RvcnlcIjoge1xyXG5cdFx0XHRjbGFzc2VzOiBbXHJcblx0XHRcdFx0XCJGQVwiLFxyXG5cdFx0XHRcdFwiRkxcIixcclxuXHRcdFx0XHRcIkFcIixcclxuXHRcdFx0XHRcIkdBXCIsXHJcblx0XHRcdFx0XCJCXCIsXHJcblx0XHRcdFx0XCJDXCIsXHJcblx0XHRcdFx0XCJTdGFydFwiLFxyXG5cdFx0XHRcdFwiU3R1YlwiLFxyXG5cdFx0XHRcdFwiTGlzdFwiLFxyXG5cdFx0XHRcdFwiQUxcIixcclxuXHRcdFx0XHRcIkJMXCIsXHJcblx0XHRcdFx0XCJDTFwiLFxyXG5cdFx0XHRcdFwiQ2F0ZWdvcnlcIixcclxuXHRcdFx0XHRcIkRyYWZ0XCIsXHJcblx0XHRcdFx0XCJGaWxlXCIsXHJcblx0XHRcdFx0XCJQb3J0YWxcIixcclxuXHRcdFx0XHRcIlByb2plY3RcIixcclxuXHRcdFx0XHRcIlRlbXBsYXRlXCIsXHJcblx0XHRcdFx0XCJEaXNhbWJpZ1wiLFxyXG5cdFx0XHRcdFwiUmVkaXJlY3RcIixcclxuXHRcdFx0XHRcIkJvb2tcIlx0XHRcdFxyXG5cdFx0XHRdLFxyXG5cdFx0XHRpbXBvcnRhbmNlczogW11cclxuXHRcdH0sXHJcblx0XHRcIldpa2lQcm9qZWN0IFBvcnRhbHNcIjoge1xyXG5cdFx0XHRjbGFzc2VzOiBbXHJcblx0XHRcdFx0XCJGUG9cIixcclxuXHRcdFx0XHRcIkNvbXBsZXRlXCIsXHJcblx0XHRcdFx0XCJTdWJzdGFudGlhbFwiLFxyXG5cdFx0XHRcdFwiQmFzaWNcIixcclxuXHRcdFx0XHRcIkluY29tcGxldGVcIixcclxuXHRcdFx0XHRcIk1ldGFcIixcclxuXHRcdFx0XHRcIkxpc3RcIixcclxuXHRcdFx0XHRcIkNhdGVnb3J5XCIsXHJcblx0XHRcdFx0XCJEcmFmdFwiLFxyXG5cdFx0XHRcdFwiRmlsZVwiLFxyXG5cdFx0XHRcdFwiUHJvamVjdFwiLFxyXG5cdFx0XHRcdFwiVGVtcGxhdGVcIixcclxuXHRcdFx0XHRcIkRpc2FtYmlnXCIsXHJcblx0XHRcdFx0XCJOQVwiLFxyXG5cdFx0XHRcdFwiUmVkaXJlY3RcIlxyXG5cdFx0XHRdLFxyXG5cdFx0XHRpbXBvcnRhbmNlczogW1xyXG5cdFx0XHRcdFwiVG9wXCIsXHJcblx0XHRcdFx0XCJIaWdoXCIsXHJcblx0XHRcdFx0XCJNaWRcIixcclxuXHRcdFx0XHRcIkxvd1wiLFxyXG5cdFx0XHRcdFwiQm90dG9tXCIsXHJcblx0XHRcdFx0XCJOQVwiXHJcblx0XHRcdF1cclxuXHRcdH0sXHJcblx0XHRcIldpa2lQcm9qZWN0IFZpZGVvIGdhbWVzXCI6IHtcclxuXHRcdFx0Y2xhc3NlczogW1xyXG5cdFx0XHRcdFwiRkFcIixcIkZMXCIsXCJGTVwiLFwiR0FcIixcIkJcIixcIkNcIixcIlN0YXJ0XCIsXCJTdHViXCIsXCJMaXN0XCIsXCJDYXRlZ29yeVwiLFwiRHJhZnRcIixcIkZpbGVcIixcIlBvcnRhbFwiLFwiUHJvamVjdFwiLFwiVGVtcGxhdGVcIixcIkRpc2FtYmlnXCIsXCJSZWRpcmVjdFwiXHJcblx0XHRcdF0sXHJcblx0XHRcdGltcG9ydGFuY2VzOiBbXHJcblx0XHRcdFx0XCJUb3BcIixcIkhpZ2hcIixcIk1pZFwiLFwiTG93XCIsXCJOQVwiXHJcblx0XHRcdF1cclxuXHRcdH1cclxuXHR9LFxyXG5cdHNoZWxsVGVtcGxhdGVzOiBbXHJcblx0XHRcIldpa2lQcm9qZWN0IGJhbm5lciBzaGVsbFwiLFxyXG5cdFx0XCJXaWtpUHJvamVjdEJhbm5lcnNcIixcclxuXHRcdFwiV2lraVByb2plY3QgQmFubmVyc1wiLFxyXG5cdFx0XCJXUEJcIixcclxuXHRcdFwiV1BCU1wiLFxyXG5cdFx0XCJXaWtpcHJvamVjdGJhbm5lcnNoZWxsXCIsXHJcblx0XHRcIldpa2lQcm9qZWN0IEJhbm5lciBTaGVsbFwiLFxyXG5cdFx0XCJXcGJcIixcclxuXHRcdFwiV1BCYW5uZXJTaGVsbFwiLFxyXG5cdFx0XCJXcGJzXCIsXHJcblx0XHRcIldpa2lwcm9qZWN0YmFubmVyc1wiLFxyXG5cdFx0XCJXUCBCYW5uZXIgU2hlbGxcIixcclxuXHRcdFwiV1AgYmFubmVyIHNoZWxsXCIsXHJcblx0XHRcIkJhbm5lcnNoZWxsXCIsXHJcblx0XHRcIldpa2lwcm9qZWN0IGJhbm5lciBzaGVsbFwiLFxyXG5cdFx0XCJXaWtpUHJvamVjdCBCYW5uZXJzIFNoZWxsXCIsXHJcblx0XHRcIldpa2lQcm9qZWN0QmFubmVyIFNoZWxsXCIsXHJcblx0XHRcIldpa2lQcm9qZWN0QmFubmVyU2hlbGxcIixcclxuXHRcdFwiV2lraVByb2plY3QgQmFubmVyU2hlbGxcIixcclxuXHRcdFwiV2lraXByb2plY3RCYW5uZXJTaGVsbFwiLFxyXG5cdFx0XCJXaWtpUHJvamVjdCBiYW5uZXIgc2hlbGwvcmVkaXJlY3RcIixcclxuXHRcdFwiV2lraVByb2plY3QgU2hlbGxcIixcclxuXHRcdFwiQmFubmVyIHNoZWxsXCIsXHJcblx0XHRcIlNjb3BlIHNoZWxsXCIsXHJcblx0XHRcIlByb2plY3Qgc2hlbGxcIixcclxuXHRcdFwiV2lraVByb2plY3QgYmFubmVyXCJcclxuXHRdLFxyXG5cdGRlZmF1bHRQYXJhbWV0ZXJEYXRhOiB7XHJcblx0XHRcImF1dG9cIjoge1xyXG5cdFx0XHRcImxhYmVsXCI6IHtcclxuXHRcdFx0XHRcImVuXCI6IFwiQXV0by1yYXRlZFwiXHJcblx0XHRcdH0sXHJcblx0XHRcdFwiZGVzY3JpcHRpb25cIjoge1xyXG5cdFx0XHRcdFwiZW5cIjogXCJBdXRvbWF0aWNhbGx5IHJhdGVkIGJ5IGEgYm90LiBBbGxvd2VkIHZhbHVlczogWyd5ZXMnXS5cIlxyXG5cdFx0XHR9LFxyXG5cdFx0XHRcImF1dG92YWx1ZVwiOiBcInllc1wiXHJcblx0XHR9LFxyXG5cdFx0XCJsaXN0YXNcIjoge1xyXG5cdFx0XHRcImxhYmVsXCI6IHtcclxuXHRcdFx0XHRcImVuXCI6IFwiTGlzdCBhc1wiXHJcblx0XHRcdH0sXHJcblx0XHRcdFwiZGVzY3JpcHRpb25cIjoge1xyXG5cdFx0XHRcdFwiZW5cIjogXCJTb3J0a2V5IGZvciB0YWxrIHBhZ2VcIlxyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cdFx0XCJzbWFsbFwiOiB7XHJcblx0XHRcdFwibGFiZWxcIjoge1xyXG5cdFx0XHRcdFwiZW5cIjogXCJTbWFsbD9cIixcclxuXHRcdFx0fSxcclxuXHRcdFx0XCJkZXNjcmlwdGlvblwiOiB7XHJcblx0XHRcdFx0XCJlblwiOiBcIkRpc3BsYXkgYSBzbWFsbCB2ZXJzaW9uLiBBbGxvd2VkIHZhbHVlczogWyd5ZXMnXS5cIlxyXG5cdFx0XHR9LFxyXG5cdFx0XHRcImF1dG92YWx1ZVwiOiBcInllc1wiXHJcblx0XHR9LFxyXG5cdFx0XCJhdHRlbnRpb25cIjoge1xyXG5cdFx0XHRcImxhYmVsXCI6IHtcclxuXHRcdFx0XHRcImVuXCI6IFwiQXR0ZW50aW9uIHJlcXVpcmVkP1wiLFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRcImRlc2NyaXB0aW9uXCI6IHtcclxuXHRcdFx0XHRcImVuXCI6IFwiSW1tZWRpYXRlIGF0dGVudGlvbiByZXF1aXJlZC4gQWxsb3dlZCB2YWx1ZXM6IFsneWVzJ10uXCJcclxuXHRcdFx0fSxcclxuXHRcdFx0XCJhdXRvdmFsdWVcIjogXCJ5ZXNcIlxyXG5cdFx0fSxcclxuXHRcdFwibmVlZHMtaW1hZ2VcIjoge1xyXG5cdFx0XHRcImxhYmVsXCI6IHtcclxuXHRcdFx0XHRcImVuXCI6IFwiTmVlZHMgaW1hZ2U/XCIsXHJcblx0XHRcdH0sXHJcblx0XHRcdFwiZGVzY3JpcHRpb25cIjoge1xyXG5cdFx0XHRcdFwiZW5cIjogXCJSZXF1ZXN0IHRoYXQgYW4gaW1hZ2Ugb3IgcGhvdG9ncmFwaCBvZiB0aGUgc3ViamVjdCBiZSBhZGRlZCB0byB0aGUgYXJ0aWNsZS4gQWxsb3dlZCB2YWx1ZXM6IFsneWVzJ10uXCJcclxuXHRcdFx0fSxcclxuXHRcdFx0XCJhbGlhc2VzXCI6IFtcclxuXHRcdFx0XHRcIm5lZWRzLXBob3RvXCJcclxuXHRcdFx0XSxcclxuXHRcdFx0XCJhdXRvdmFsdWVcIjogXCJ5ZXNcIixcclxuXHRcdFx0XCJzdWdnZXN0ZWRcIjogdHJ1ZVxyXG5cdFx0fSxcclxuXHRcdFwibmVlZHMtaW5mb2JveFwiOiB7XHJcblx0XHRcdFwibGFiZWxcIjoge1xyXG5cdFx0XHRcdFwiZW5cIjogXCJOZWVkcyBpbmZvYm94P1wiLFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRcImRlc2NyaXB0aW9uXCI6IHtcclxuXHRcdFx0XHRcImVuXCI6IFwiUmVxdWVzdCB0aGF0IGFuIGluZm9ib3ggYmUgYWRkZWQgdG8gdGhlIGFydGljbGUuIEFsbG93ZWQgdmFsdWVzOiBbJ3llcyddLlwiXHJcblx0XHRcdH0sXHJcblx0XHRcdFwiYWxpYXNlc1wiOiBbXHJcblx0XHRcdFx0XCJuZWVkcy1waG90b1wiXHJcblx0XHRcdF0sXHJcblx0XHRcdFwiYXV0b3ZhbHVlXCI6IFwieWVzXCIsXHJcblx0XHRcdFwic3VnZ2VzdGVkXCI6IHRydWVcclxuXHRcdH1cclxuXHR9XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjb25maWc7XHJcbi8vIDwvbm93aWtpPiIsIi8vIDxub3dpa2k+XHJcblxyXG4vLyBBdHRyaWJ1dGlvbjogRGlmZiBzdHlsZXMgYmFzZWQgb24gPGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dpa2lwZWRpYTpBdXRvV2lraUJyb3dzZXIvc3R5bGUuY3NzPlxyXG5jb25zdCBzdHlsZXMgPSBgdGFibGUuZGlmZiwgdGQuZGlmZi1vdGl0bGUsIHRkLmRpZmYtbnRpdGxlIHsgdGFibGUtbGF5b3V0OiBhdXRvICFpbXBvcnRhbnQ7OyB9XHJcbnRkLmRpZmYtb3RpdGxlLCB0ZC5kaWZmLW50aXRsZSB7IHRleHQtYWxpZ246IGNlbnRlcjsgfVxyXG50ZC5kaWZmLW1hcmtlciB7IHRleHQtYWxpZ246IHJpZ2h0OyBmb250LXdlaWdodDogYm9sZDsgZm9udC1zaXplOiAxLjI1ZW07IH1cclxudGQuZGlmZi1saW5lbm8geyBmb250LXdlaWdodDogYm9sZDsgfVxyXG50ZC5kaWZmLWFkZGVkbGluZSwgdGQuZGlmZi1kZWxldGVkbGluZSwgdGQuZGlmZi1jb250ZXh0IHsgZm9udC1zaXplOiA4OCU7IHZlcnRpY2FsLWFsaWduOiB0b3A7IHdoaXRlLXNwYWNlOiAtbW96LXByZS13cmFwOyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IH1cclxudGQuZGlmZi1hZGRlZGxpbmUsIHRkLmRpZmYtZGVsZXRlZGxpbmUgeyBib3JkZXItc3R5bGU6IHNvbGlkOyBib3JkZXItd2lkdGg6IDFweCAxcHggMXB4IDRweDsgYm9yZGVyLXJhZGl1czogMC4zM2VtOyB9XHJcbnRkLmRpZmYtYWRkZWRsaW5lIHsgYm9yZGVyLWNvbG9yOiAjYTNkM2ZmOyB9XHJcbnRkLmRpZmYtZGVsZXRlZGxpbmUgeyBib3JkZXItY29sb3I6ICNmZmU0OWM7IH1cclxudGQuZGlmZi1jb250ZXh0IHsgYmFja2dyb3VuZDogI2YzZjNmMzsgY29sb3I6ICMzMzMzMzM7IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4IDFweCAxcHggNHB4OyBib3JkZXItY29sb3I6ICNlNmU2ZTY7IGJvcmRlci1yYWRpdXM6IDAuMzNlbTsgfVxyXG4uZGlmZmNoYW5nZSB7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IH1cclxudGFibGUuZGlmZiB7XHJcbiAgICBib3JkZXI6IG5vbmU7XHJcbiAgICB3aWR0aDogOTglOyBib3JkZXItc3BhY2luZzogNHB4O1xyXG4gICAgdGFibGUtbGF5b3V0OiBmaXhlZDsgLyogRW5zdXJlcyB0aGF0IGNvbHVtcyBhcmUgb2YgZXF1YWwgd2lkdGggKi9cclxufVxyXG50ZC5kaWZmLWFkZGVkbGluZSAuZGlmZmNoYW5nZSwgdGQuZGlmZi1kZWxldGVkbGluZSAuZGlmZmNoYW5nZSB7IGJvcmRlci1yYWRpdXM6IDAuMzNlbTsgcGFkZGluZzogMC4yNWVtIDA7IH1cclxudGQuZGlmZi1hZGRlZGxpbmUgLmRpZmZjaGFuZ2Uge1x0YmFja2dyb3VuZDogI2Q4ZWNmZjsgfVxyXG50ZC5kaWZmLWRlbGV0ZWRsaW5lIC5kaWZmY2hhbmdlIHsgYmFja2dyb3VuZDogI2ZlZWVjODsgfVxyXG50YWJsZS5kaWZmIHRkIHtcdHBhZGRpbmc6IDAuMzNlbSAwLjY2ZW07IH1cclxudGFibGUuZGlmZiBjb2wuZGlmZi1tYXJrZXIgeyB3aWR0aDogMiU7IH1cclxudGFibGUuZGlmZiBjb2wuZGlmZi1jb250ZW50IHsgd2lkdGg6IDQ4JTsgfVxyXG50YWJsZS5kaWZmIHRkIGRpdiB7XHJcbiAgICAvKiBGb3JjZS13cmFwIHZlcnkgbG9uZyBsaW5lcyBzdWNoIGFzIFVSTHMgb3IgcGFnZS13aWRlbmluZyBjaGFyIHN0cmluZ3MuICovXHJcbiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XHJcbiAgICAvKiBBcyBmYWxsYmFjayAoRkY8My41LCBPcGVyYSA8MTAuNSksIHNjcm9sbGJhcnMgd2lsbCBiZSBhZGRlZCBmb3IgdmVyeSB3aWRlIGNlbGxzXHJcbiAgICAgICAgaW5zdGVhZCBvZiB0ZXh0IG92ZXJmbG93aW5nIG9yIHdpZGVuaW5nICovXHJcbiAgICBvdmVyZmxvdzogYXV0bztcclxufWAgK1xyXG5cclxuLy8gT3ZlcnJpZGUgT09VSSB3aW5kb3cgbWFuYWdlciBwcmV2ZW50aW5nIGJhY2tncm91bmQgc2Nyb2xsaW5nL2ludGVyYWN0aW9uXHJcbmBodG1sIGJvZHkucmF0ZXItbWFpbldpbmRvdy1vcGVuIHtcclxuXHRwb3NpdGlvbjogdW5zZXQ7XHJcblx0b3ZlcmZsb3c6IHVuc2V0O1xyXG59XHJcbmh0bWwgYm9keS5yYXRlci1tYWluV2luZG93LW9wZW4gLm9vLXVpLXdpbmRvd01hbmFnZXItbW9kYWwgPiAub28tdWktZGlhbG9nLm9vLXVpLXdpbmRvdy1hY3RpdmUge1xyXG4gICAgcG9zaXRpb246IHN0YXRpYztcclxuICAgIHBhZGRpbmc6IDA7XHJcbn1gICtcclxuLy8gSW5jcmVhc2Ugei1pbmRleCwgdG8gYmUgYWJvdmUgc2tpbiBtZW51cyBldGM7IHNtb290aCB0cmFuc2l0aW9uIGZvciBkcmFnZ2luZyAodHJhbnNmb3JtOnRyYW5zbGF0ZSlcclxuYGh0bWwgYm9keS5yYXRlci1tYWluV2luZG93LW9wZW4gLm9vLXVpLWRpYWxvZy5vby11aS13aW5kb3ctYWN0aXZlID4gZGl2IHtcclxuICAgIHotaW5kZXg6IDExMDtcclxuICAgIHRyYW5zaXRpb246IGFsbCAwLjI1cyBlYXNlLW91dCAwcywgdHJhbnNmb3JtIDBzICFpbXBvcnRhbnRcclxufVxyXG5gICsgXHJcbi8vIEVuc3VyZSBjbG9zZSBkaWFsb2cgaXMgdmlzaWJsZVxyXG5gaHRtbCBib2R5LnJhdGVyLW1haW5XaW5kb3ctb3BlbiAjbXctdGVsZXBvcnQtdGFyZ2V0IHtcclxuICAgIHRvcDogMDtcclxuICAgIGJvdHRvbTogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICByaWdodDowO1xyXG59XHJcbmA7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBzdHlsZXM7XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCBBUEksIHsgbWFrZUVycm9yTXNnIH0gZnJvbSBcIi4vYXBpXCI7XHJcbmltcG9ydCB7IGlzQWZ0ZXJEYXRlIH0gZnJvbSBcIi4vdXRpbFwiO1xyXG5pbXBvcnQgKiBhcyBjYWNoZSBmcm9tIFwiLi9jYWNoZVwiO1xyXG4vLyA8bm93aWtpPlxyXG5cclxudmFyIGNhY2hlQmFubmVycyA9IGZ1bmN0aW9uKGJhbm5lcnMpIHtcclxuXHRjYWNoZS53cml0ZShcImJhbm5lcnNcIiwgYmFubmVycywgMiwgNjApO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEdldHMgYmFubmVycy9vcHRpb25zIGZyb20gdGhlIEFwaVxyXG4gKiBcclxuICogQHJldHVybnMge1Byb21pc2V9IFJlc29sdmVkIHdpdGg6IGJhbm5lcnMgb2JqZWN0LCBiYW5uZXJPcHRpb25zIGFycmF5XHJcbiAqL1xyXG52YXIgZ2V0TGlzdE9mQmFubmVyc0Zyb21BcGkgPSBmdW5jdGlvbigpIHtcclxuXHJcblx0dmFyIGZpbmlzaGVkUHJvbWlzZSA9ICQuRGVmZXJyZWQoKTtcclxuXHJcblx0dmFyIHF1ZXJ5U2tlbGV0b24gPSB7XHJcblx0XHRhY3Rpb246IFwicXVlcnlcIixcclxuXHRcdGZvcm1hdDogXCJqc29uXCIsXHJcblx0XHRsaXN0OiBcImNhdGVnb3J5bWVtYmVyc1wiLFxyXG5cdFx0Y21wcm9wOiBcInRpdGxlXCIsXHJcblx0XHRjbW5hbWVzcGFjZTogXCIxMFwiLFxyXG5cdFx0Y21saW1pdDogXCI1MDBcIlxyXG5cdH07XHJcblxyXG5cdHZhciBjYXRlZ29yaWVzID0gW1xyXG5cdFx0e1xyXG5cdFx0XHR0aXRsZTogXCJDYXRlZ29yeTpXaWtpUHJvamVjdCBiYW5uZXJzIHdpdGggcXVhbGl0eSBhc3Nlc3NtZW50XCIsXHJcblx0XHRcdGFiYnJldmlhdGlvbjogXCJ3aXRoUmF0aW5nc1wiLFxyXG5cdFx0XHRiYW5uZXJzOiBbXSxcclxuXHRcdFx0cHJvY2Vzc2VkOiAkLkRlZmVycmVkKClcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdHRpdGxlOiBcIkNhdGVnb3J5Oldpa2lQcm9qZWN0IGJhbm5lcnMgd2l0aG91dCBxdWFsaXR5IGFzc2Vzc21lbnRcIixcclxuXHRcdFx0YWJicmV2aWF0aW9uOiBcIndpdGhvdXRSYXRpbmdzXCIsXHJcblx0XHRcdGJhbm5lcnM6IFtdLFxyXG5cdFx0XHRwcm9jZXNzZWQ6ICQuRGVmZXJyZWQoKVxyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0dGl0bGU6IFwiQ2F0ZWdvcnk6V2lraVByb2plY3QgYmFubmVyIHdyYXBwZXIgdGVtcGxhdGVzXCIsXHJcblx0XHRcdGFiYnJldmlhdGlvbjogXCJ3cmFwcGVyc1wiLFxyXG5cdFx0XHRiYW5uZXJzOiBbXSxcclxuXHRcdFx0cHJvY2Vzc2VkOiAkLkRlZmVycmVkKClcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdHRpdGxlOiBcIkNhdGVnb3J5Oldpa2lQcm9qZWN0IGJhbm5lciB0ZW1wbGF0ZXMgbm90IGJhc2VkIG9uIFdQQmFubmVyTWV0YVwiLFxyXG5cdFx0XHRhYmJyZXZpYXRpb246IFwibm90V1BCTVwiLFxyXG5cdFx0XHRiYW5uZXJzOiBbXSxcclxuXHRcdFx0cHJvY2Vzc2VkOiAkLkRlZmVycmVkKClcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdHRpdGxlOiBcIkNhdGVnb3J5OkluYWN0aXZlIFdpa2lQcm9qZWN0IGJhbm5lcnNcIixcclxuXHRcdFx0YWJicmV2aWF0aW9uOiBcImluYWN0aXZlXCIsXHJcblx0XHRcdGJhbm5lcnM6IFtdLFxyXG5cdFx0XHRwcm9jZXNzZWQ6ICQuRGVmZXJyZWQoKVxyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0dGl0bGU6IFwiQ2F0ZWdvcnk6V3JhcHBlciB0ZW1wbGF0ZXMgZm9yIFdpa2lQcm9qZWN0IFdvbWVuIGluIFJlZFwiLFxyXG5cdFx0XHRhYmJyZXZpYXRpb246IFwid2lyXCIsXHJcblx0XHRcdGJhbm5lcnM6IFtdLFxyXG5cdFx0XHRwcm9jZXNzZWQ6ICQuRGVmZXJyZWQoKVxyXG5cdFx0fVxyXG5cdF07XHJcblxyXG5cdHZhciBwcm9jZXNzUXVlcnkgPSBmdW5jdGlvbihyZXN1bHQsIGNhdEluZGV4KSB7XHJcblx0XHRpZiAoICFyZXN1bHQucXVlcnkgfHwgIXJlc3VsdC5xdWVyeS5jYXRlZ29yeW1lbWJlcnMgKSB7XHJcblx0XHRcdC8vIE5vIHJlc3VsdHNcclxuXHRcdFx0Ly8gVE9ETzogZXJyb3Igb3Igd2FybmluZyAqKioqKioqKlxyXG5cdFx0XHRmaW5pc2hlZFByb21pc2UucmVqZWN0KCk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0Ly8gR2F0aGVyIHRpdGxlcyBpbnRvIGFycmF5IC0gZXhjbHVkaW5nIFwiVGVtcGxhdGU6XCIgcHJlZml4XHJcblx0XHR2YXIgcmVzdWx0VGl0bGVzID0gcmVzdWx0LnF1ZXJ5LmNhdGVnb3J5bWVtYmVycy5tYXAoZnVuY3Rpb24oaW5mbykge1xyXG5cdFx0XHRyZXR1cm4gaW5mby50aXRsZS5zbGljZSg5KTtcclxuXHRcdH0pO1xyXG5cdFx0QXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoY2F0ZWdvcmllc1tjYXRJbmRleF0uYmFubmVycywgcmVzdWx0VGl0bGVzKTtcclxuXHRcdFxyXG5cdFx0Ly8gQ29udGludWUgcXVlcnkgaWYgbmVlZGVkXHJcblx0XHRpZiAoIHJlc3VsdC5jb250aW51ZSApIHtcclxuXHRcdFx0ZG9BcGlRdWVyeSgkLmV4dGVuZChjYXRlZ29yaWVzW2NhdEluZGV4XS5xdWVyeSwgcmVzdWx0LmNvbnRpbnVlKSwgY2F0SW5kZXgpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRcclxuXHRcdGNhdGVnb3JpZXNbY2F0SW5kZXhdLnByb2Nlc3NlZC5yZXNvbHZlKCk7XHJcblx0fTtcclxuXHJcblx0dmFyIGRvQXBpUXVlcnkgPSBmdW5jdGlvbihxLCBjYXRJbmRleCkge1xyXG5cdFx0QVBJLmdldCggcSApXHJcblx0XHRcdC5kb25lKCBmdW5jdGlvbihyZXN1bHQpIHtcclxuXHRcdFx0XHRwcm9jZXNzUXVlcnkocmVzdWx0LCBjYXRJbmRleCk7XHJcblx0XHRcdH0gKVxyXG5cdFx0XHQuZmFpbCggZnVuY3Rpb24oY29kZSwganF4aHIpIHtcclxuXHRcdFx0XHRjb25zb2xlLndhcm4oXCJbUmF0ZXJdIFwiICsgbWFrZUVycm9yTXNnKGNvZGUsIGpxeGhyLCBcIkNvdWxkIG5vdCByZXRyaWV2ZSBwYWdlcyBmcm9tIFtbOlwiICsgcS5jbXRpdGxlICsgXCJdXVwiKSk7XHJcblx0XHRcdFx0ZmluaXNoZWRQcm9taXNlLnJlamVjdCgpO1xyXG5cdFx0XHR9ICk7XHJcblx0fTtcclxuXHRcclxuXHRjYXRlZ29yaWVzLmZvckVhY2goZnVuY3Rpb24oY2F0LCBpbmRleCwgYXJyKSB7XHJcblx0XHRjYXQucXVlcnkgPSAkLmV4dGVuZCggeyBcImNtdGl0bGVcIjpjYXQudGl0bGUgfSwgcXVlcnlTa2VsZXRvbiApO1xyXG5cdFx0JC53aGVuKCBhcnJbaW5kZXgtMV0gJiYgYXJyW2luZGV4LTFdLnByb2Nlc3NlZCB8fCB0cnVlICkudGhlbihmdW5jdGlvbigpe1xyXG5cdFx0XHRkb0FwaVF1ZXJ5KGNhdC5xdWVyeSwgaW5kZXgpO1xyXG5cdFx0fSk7XHJcblx0fSk7XHJcblx0XHJcblx0Y2F0ZWdvcmllc1tjYXRlZ29yaWVzLmxlbmd0aC0xXS5wcm9jZXNzZWQudGhlbihmdW5jdGlvbigpe1xyXG5cdFx0bGV0IGJhbm5lcnMgPSB7fTtcclxuXHRcdGNhdGVnb3JpZXMuZm9yRWFjaChjYXRPYmplY3QgPT4ge1xyXG5cdFx0XHRiYW5uZXJzW2NhdE9iamVjdC5hYmJyZXZpYXRpb25dID0gY2F0T2JqZWN0LmJhbm5lcnM7XHJcblx0XHR9KTtcclxuXHRcdFxyXG5cdFx0ZmluaXNoZWRQcm9taXNlLnJlc29sdmUoYmFubmVycyk7XHJcblx0fSk7XHJcblx0XHJcblx0cmV0dXJuIGZpbmlzaGVkUHJvbWlzZTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBHZXRzIGJhbm5lcnMgZnJvbSBjYWNoZSwgaWYgdGhlcmUgYW5kIG5vdCB0b28gb2xkXHJcbiAqIFxyXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gUmVzb2x2ZWQgd2l0aCBiYW5uZXJzIG9iamVjdFxyXG4gKi9cclxudmFyIGdldEJhbm5lcnNGcm9tQ2FjaGUgPSBmdW5jdGlvbigpIHtcclxuXHR2YXIgY2FjaGVkQmFubmVycyA9IGNhY2hlLnJlYWQoXCJiYW5uZXJzXCIpO1xyXG5cdGlmIChcclxuXHRcdCFjYWNoZWRCYW5uZXJzIHx8XHJcblx0XHQhY2FjaGVkQmFubmVycy52YWx1ZSB8fFxyXG5cdFx0IWNhY2hlZEJhbm5lcnMuc3RhbGVEYXRlXHJcblx0KSB7XHJcblx0XHRyZXR1cm4gJC5EZWZlcnJlZCgpLnJlamVjdCgpO1xyXG5cdH1cclxuXHRpZiAoIGlzQWZ0ZXJEYXRlKGNhY2hlZEJhbm5lcnMuc3RhbGVEYXRlKSApIHtcclxuXHRcdC8vIFVwZGF0ZSBpbiB0aGUgYmFja2dyb3VuZDsgc3RpbGwgdXNlIG9sZCBsaXN0IHVudGlsIHRoZW4gIFxyXG5cdFx0Z2V0TGlzdE9mQmFubmVyc0Zyb21BcGkoKS50aGVuKGNhY2hlQmFubmVycyk7XHJcblx0fVxyXG5cdHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZShjYWNoZWRCYW5uZXJzLnZhbHVlKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBHZXRzIGJhbm5lciBuYW1lcywgZ3JvdXBlZCBieSB0eXBlICh3aXRoUmF0aW5ncywgd2l0aG91dFJhdGluZ3MsIHdyYXBwZXJzLCBub3RXUEJNKVxyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBPYmplY3Qgb2Ygc3RyaW5nIGFycmF5cyBrZXllZCBieSB0eXBlICh3aXRoUmF0aW5ncywgd2l0aG91dFJhdGluZ3MsIHdyYXBwZXJzLCBub3RXUEJNKVxyXG4gKi9cclxudmFyIGdldEJhbm5lck5hbWVzID0gKCkgPT4gZ2V0QmFubmVyc0Zyb21DYWNoZSgpXHJcblx0LnRoZW4oIGJhbm5lcnMgPT4ge1xyXG5cdFx0Ly8gRW5zdXJlIGFsbCBrZXlzIGV4aXN0XHJcblx0XHRpZiAoIWJhbm5lcnMud2l0aFJhdGluZ3MgfHwgIWJhbm5lcnMud2l0aG91dFJhdGluZ3MgfHwgIWJhbm5lcnMud3JhcHBlcnMgfHwgIWJhbm5lcnMubm90V1BCTSB8fCAhYmFubmVycy5pbmFjdGl2ZSB8fCAhYmFubmVycy53aXIpIHtcclxuXHRcdFx0Z2V0TGlzdE9mQmFubmVyc0Zyb21BcGkoKS50aGVuKGNhY2hlQmFubmVycyk7XHJcblx0XHRcdHJldHVybiAkLmV4dGVuZChcclxuXHRcdFx0XHR7IHdpdGhSYXRpbmdzOiBbXSwgd2l0aG91dFJhdGluZ3M6IFtdLCB3cmFwcGVyczogW10sIG5vdFdQQk06IFtdLCBpbmFjdGl2ZTogW10sIHdpcjogW10gfSxcclxuXHRcdFx0XHRiYW5uZXJzXHJcblx0XHRcdCk7XHJcblx0XHR9XHJcblx0XHQvLyBTdWNjZXNzOiBwYXNzIHRocm91Z2hcclxuXHRcdHJldHVybiBiYW5uZXJzO1xyXG5cdH0gKVxyXG5cdC5jYXRjaCggKCkgPT4ge1xyXG5cdFx0Ly8gRmFpbHVyZTogZ2V0IGZyb20gQXBpLCB0aGVuIGNhY2hlIHRoZW1cclxuXHRcdGxldCBiYW5uZXJzUHJvbWlzZSA9IGdldExpc3RPZkJhbm5lcnNGcm9tQXBpKCk7XHJcblx0XHRiYW5uZXJzUHJvbWlzZS50aGVuKGNhY2hlQmFubmVycyk7XHJcblx0XHRyZXR1cm4gYmFubmVyc1Byb21pc2U7XHJcblx0fSApO1xyXG5cclxuZXhwb3J0IHsgZ2V0QmFubmVyTmFtZXMgfTtcclxuLy8gPC9ub3dpa2k+IiwiaW1wb3J0IEFQSSBmcm9tIFwiLi9hcGlcIjtcclxuaW1wb3J0IHsgaXNBZnRlckRhdGUgfSBmcm9tIFwiLi91dGlsXCI7XHJcbmltcG9ydCBjb25maWcgZnJvbSBcIi4vY29uZmlnXCI7XHJcbmltcG9ydCAqIGFzIGNhY2hlIGZyb20gXCIuL2NhY2hlXCI7XHJcbi8vIDxub3dpa2k+XHJcblxyXG5jb25zdCBwcmVmc1BhZ2UgPSBgVXNlcjoke213LmNvbmZpZy5nZXQoXCJ3Z1VzZXJOYW1lXCIpfS9yYXRlclByZWZzLmpzb25gO1xyXG5cclxuY29uc3Qgd3JpdGVQcmVmc1RvQ2FjaGUgPSBwcmVmcyA9PiBjYWNoZS53cml0ZShcclxuXHRcInByZWZzXCIsXHJcblx0cHJlZnMsXHJcblx0KDEvMjQvNjApKjEsIC8vIDEgbWluXHJcblx0KDEvMjQvNjApKjEgIC8vIDEgbWluXHJcbik7XHJcblxyXG5jb25zdCBnZXRQcmVmc0Zyb21BcGkgPSBmdW5jdGlvbigpIHtcclxuXHRyZXR1cm4gQVBJLmdldCh7XHJcblx0XHRcImFjdGlvblwiOiBcInF1ZXJ5XCIsXHJcblx0XHRcImZvcm1hdFwiOiBcImpzb25cIixcclxuXHRcdFwicHJvcFwiOiBcInJldmlzaW9uc1wiLFxyXG5cdFx0XCJ0aXRsZXNcIjogcHJlZnNQYWdlLFxyXG5cdFx0XCJydnByb3BcIjogXCJjb250ZW50XCIsXHJcblx0XHRcInJ2c2xvdHNcIjogXCJtYWluXCJcclxuXHR9KS50aGVuKHJlc3BvbnNlID0+IHtcclxuXHRcdGNvbnN0IHBhZ2UgPSByZXNwb25zZS5xdWVyeS5wYWdlc1tPYmplY3Qua2V5cyhyZXNwb25zZS5xdWVyeS5wYWdlcylbMF1dO1xyXG5cdFx0aWYgKCFwYWdlLnBhZ2VpZCB8fCBwYWdlLm1pc3Npbmc9PT1cIlwiKSB7XHJcblx0XHRcdHJldHVybiBjb25maWcuZGVmYXVsdFByZWZzO1xyXG5cdFx0fVxyXG5cdFx0bGV0IHByZWZzO1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0cHJlZnMgPSBKU09OLnBhcnNlKCBwYWdlLnJldmlzaW9uc1swXS5zbG90cy5tYWluW1wiKlwiXSApO1xyXG5cdFx0fSBjYXRjaChlKSB7XHJcblx0XHRcdHJldHVybiAkLkRlZmVycmVkKCkucmVqZWN0KFwiSlNPTi1wYXJzaW5nLWVycm9yXCIsIGUpO1xyXG5cdFx0fVxyXG5cdFx0d3JpdGVQcmVmc1RvQ2FjaGUocHJlZnMpO1xyXG5cdFx0cmV0dXJuIHByZWZzO1xyXG5cdH0pO1xyXG59O1xyXG5cclxuY29uc3QgZ2V0UHJlZnNGcm9tQ2FjaGUgPSBmdW5jdGlvbigpIHtcclxuXHR2YXIgY2FjaGVkUHJlZnMgPSBjYWNoZS5yZWFkKFwicHJlZnNcIik7XHJcblx0aWYgKFxyXG5cdFx0IWNhY2hlZFByZWZzIHx8XHJcblx0XHQhY2FjaGVkUHJlZnMudmFsdWUgfHxcclxuXHRcdCFjYWNoZWRQcmVmcy5zdGFsZURhdGUgfHxcclxuXHRcdGlzQWZ0ZXJEYXRlKGNhY2hlZFByZWZzLnN0YWxlRGF0ZSlcclxuXHQpIHtcclxuXHRcdC8vIE5vIGNhY2hlZCB2YWx1ZSwgb3IgaXMgdG9vIG9sZFxyXG5cdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZWplY3QoKTtcclxuXHR9XHJcblx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlKGNhY2hlZFByZWZzLnZhbHVlKTtcclxufTtcclxuXHJcbmNvbnN0IGdldFByZWZzID0gKCkgPT4gZ2V0UHJlZnNGcm9tQ2FjaGUoKS50aGVuKFxyXG5cdC8vIFN1Y2Nlc3M6IHBhc3MgdGhyb3VnaCAoZmlyc3QgcGFyYW0gb25seSlcclxuXHRwcmVmcyA9PiAkLkRlZmVycmVkKCkucmVzb2x2ZShwcmVmcyksXHJcblx0Ly8gRmFpbHVyZTogZ2V0IGZyb20gQXBpXHJcblx0KCkgPT4gZ2V0UHJlZnNGcm9tQXBpKClcclxuKTtcclxuXHJcbi8qKlxyXG4gKiBcclxuICogQHBhcmFtIHtPYmplY3R9IHVwZGF0ZWRQcmVmcyBvYmplY3Qgd2l0aCBrZXk6dmFsdWUgcGFpcnMgZm9yIHByZWZlcmVuY2VzIGpzb24uXHJcbiAqL1xyXG5jb25zdCBzZXRQcmVmcyA9IGZ1bmN0aW9uKHVwZGF0ZWRQcmVmcykge1xyXG5cdHJldHVybiBBUEkuZWRpdFdpdGhSZXRyeShwcmVmc1BhZ2UsXHRudWxsLFxyXG5cdFx0KCkgPT4gKHtcclxuXHRcdFx0XCJ0ZXh0XCI6IEpTT04uc3RyaW5naWZ5KHVwZGF0ZWRQcmVmcyksXHJcblx0XHRcdFwic3VtbWFyeVwiOiBcIlNhdmluZyBSYXRlciBwcmVmZXJlbmNlcyBcIiArIGNvbmZpZy5zY3JpcHQuYWR2ZXJ0XHJcblx0XHR9KVxyXG5cdClcclxuXHRcdC50aGVuKCAoKSA9PiB3cml0ZVByZWZzVG9DYWNoZSh1cGRhdGVkUHJlZnMpICk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCAoe2dldDogZ2V0UHJlZnMsIHNldDogc2V0UHJlZnN9KTtcclxuZXhwb3J0IHsgZ2V0UHJlZnMsIHNldFByZWZzIH07XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCBjb25maWcgZnJvbSBcIi4vY29uZmlnXCI7XHJcbmltcG9ydCBBUEkgZnJvbSBcIi4vYXBpXCI7XHJcbmltcG9ydCB7IHBhcnNlVGVtcGxhdGVzLCBnZXRXaXRoUmVkaXJlY3RUbyB9IGZyb20gXCIuL1RlbXBsYXRlXCI7XHJcbmltcG9ydCB7Z2V0QmFubmVyTmFtZXN9IGZyb20gXCIuL2dldEJhbm5lcnNcIjtcclxuaW1wb3J0ICogYXMgY2FjaGUgZnJvbSBcIi4vY2FjaGVcIjtcclxuaW1wb3J0IHdpbmRvd01hbmFnZXIgZnJvbSBcIi4vd2luZG93TWFuYWdlclwiO1xyXG5pbXBvcnQgeyBnZXRQcmVmcyB9IGZyb20gXCIuL3ByZWZzXCI7XHJcbmltcG9ydCB7IGZpbHRlckFuZE1hcCB9IGZyb20gXCIuL3V0aWxcIjtcclxuLy8gPG5vd2lraT5cclxuXHJcbnZhciBzZXR1cFJhdGVyID0gZnVuY3Rpb24oY2xpY2tFdmVudCkge1xyXG5cdGlmICggY2xpY2tFdmVudCApIHtcclxuXHRcdGNsaWNrRXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHR9XHJcblxyXG5cdHZhciBzZXR1cENvbXBsZXRlZFByb21pc2UgPSAkLkRlZmVycmVkKCk7XHJcbiAgICBcclxuXHR2YXIgY3VycmVudFBhZ2UgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dChjb25maWcubXcud2dQYWdlTmFtZSk7XHJcblx0dmFyIHRhbGtQYWdlID0gY3VycmVudFBhZ2UgJiYgY3VycmVudFBhZ2UuZ2V0VGFsa1BhZ2UoKTtcclxuXHR2YXIgc3ViamVjdFBhZ2UgPSBjdXJyZW50UGFnZSAmJiBjdXJyZW50UGFnZS5nZXRTdWJqZWN0UGFnZSgpO1xyXG5cdHZhciBzdWJqZWN0SXNBcnRpY2xlID0gY29uZmlnLm13LndnTmFtZXNwYWNlTnVtYmVyIDw9IDE7XHJcbiBcclxuXHQvLyBHZXQgcHJlZmVyZW5jZXMgKHRhc2sgMClcclxuXHR2YXIgcHJlZnNQcm9taXNlID0gZ2V0UHJlZnMoKTtcclxuXHJcblx0Ly8gR2V0IGxpc3RzIG9mIGFsbCBiYW5uZXJzICh0YXNrIDEpXHJcblx0dmFyIGJhbm5lcnNQcm9taXNlID0gZ2V0QmFubmVyTmFtZXMoKTtcclxuXHJcblx0Ly8gTG9hZCB0YWxrIHBhZ2UgKHRhc2sgMilcclxuXHR2YXIgbG9hZFRhbGtQcm9taXNlID0gQVBJLmdldCgge1xyXG5cdFx0YWN0aW9uOiBcInF1ZXJ5XCIsXHJcblx0XHRwcm9wOiBcInJldmlzaW9uc1wiLFxyXG5cdFx0cnZwcm9wOiBcImNvbnRlbnRcIixcclxuXHRcdHJ2c2VjdGlvbjogXCIwXCIsXHJcblx0XHR0aXRsZXM6IHRhbGtQYWdlLmdldFByZWZpeGVkVGV4dCgpLFxyXG5cdFx0aW5kZXhwYWdlaWRzOiAxXHJcblx0fSApLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG5cdFx0dmFyIGlkID0gcmVzdWx0LnF1ZXJ5LnBhZ2VpZHM7XHRcdFxyXG5cdFx0dmFyIHdpa2l0ZXh0ID0gKCBpZCA8IDAgKSA/IFwiXCIgOiByZXN1bHQucXVlcnkucGFnZXNbaWRdLnJldmlzaW9uc1swXVtcIipcIl07XHJcblx0XHRyZXR1cm4gd2lraXRleHQ7XHJcblx0fSk7XHJcblxyXG5cdC8vIFBhcnNlIHRhbGsgcGFnZSBmb3IgYmFubmVycyAodGFzayAzKVxyXG5cdHZhciBwYXJzZVRhbGtQcm9taXNlID0gbG9hZFRhbGtQcm9taXNlLnRoZW4od2lraXRleHQgPT4gcGFyc2VUZW1wbGF0ZXMod2lraXRleHQsIHRydWUpKSAvLyBHZXQgYWxsIHRlbXBsYXRlc1xyXG5cdFx0LnRoZW4odGVtcGxhdGVzID0+IHRlbXBsYXRlcy5maWx0ZXIodGVtcGxhdGUgPT4gdGVtcGxhdGUuZ2V0VGl0bGUoKSAhPT0gbnVsbCkpIC8vIEZpbHRlciBvdXQgaW52YWxpZCB0ZW1wbGF0ZXMgKGUuZy4gcGFyc2VyIGZ1bmN0aW9ucylcclxuXHRcdC50aGVuKHRlbXBsYXRlcyA9PiBnZXRXaXRoUmVkaXJlY3RUbyh0ZW1wbGF0ZXMpKSAvLyBDaGVjayBmb3IgcmVkaXJlY3RzXHJcblx0XHQudGhlbih0ZW1wbGF0ZXMgPT4ge1xyXG5cdFx0XHRyZXR1cm4gYmFubmVyc1Byb21pc2UudGhlbigoYWxsQmFubmVycykgPT4geyAvLyBHZXQgbGlzdCBvZiBhbGwgYmFubmVyIHRlbXBsYXRlc1xyXG5cdFx0XHRcdHJldHVybiBmaWx0ZXJBbmRNYXAoXHJcblx0XHRcdFx0XHR0ZW1wbGF0ZXMsIFx0XHRcdFxyXG5cdFx0XHRcdFx0Ly8gRmlsdGVyIG91dCBub24tYmFubmVyc1xyXG5cdFx0XHRcdFx0dGVtcGxhdGUgPT4geyBcclxuXHRcdFx0XHRcdFx0aWYgKHRlbXBsYXRlLmlzU2hlbGxUZW1wbGF0ZSgpKSB7IHJldHVybiB0cnVlOyB9XHJcblx0XHRcdFx0XHRcdHZhciBtYWluVGV4dCA9IHRlbXBsYXRlLnJlZGlyZWN0VGFyZ2V0XHJcblx0XHRcdFx0XHRcdFx0PyB0ZW1wbGF0ZS5yZWRpcmVjdFRhcmdldC5nZXRNYWluVGV4dCgpXHJcblx0XHRcdFx0XHRcdFx0OiB0ZW1wbGF0ZS5nZXRUaXRsZSgpLmdldE1haW5UZXh0KCk7XHJcblx0XHRcdFx0XHRcdHJldHVybiBhbGxCYW5uZXJzLndpdGhSYXRpbmdzLmluY2x1ZGVzKG1haW5UZXh0KSB8fCBcclxuXHRcdFx0XHRcdFx0YWxsQmFubmVycy53aXRob3V0UmF0aW5ncy5pbmNsdWRlcyhtYWluVGV4dCkgfHxcclxuXHRcdFx0XHRcdFx0YWxsQmFubmVycy53cmFwcGVycy5pbmNsdWRlcyhtYWluVGV4dCkgfHxcclxuXHRcdFx0XHRcdFx0YWxsQmFubmVycy5ub3RXUEJNLmluY2x1ZGVzKG1haW5UZXh0KSB8fFxyXG5cdFx0XHRcdFx0XHRhbGxCYW5uZXJzLmluYWN0aXZlLmluY2x1ZGVzKG1haW5UZXh0KSB8fFxyXG5cdFx0XHRcdFx0XHRhbGxCYW5uZXJzLndpci5pbmNsdWRlcyhtYWluVGV4dCk7XHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0Ly8gU2V0IGFkZGl0aW9uYWwgcHJvcGVydGllcyBpZiBuZWVkZWRcclxuXHRcdFx0XHRcdHRlbXBsYXRlID0+IHtcclxuXHRcdFx0XHRcdFx0dmFyIG1haW5UZXh0ID0gdGVtcGxhdGUucmVkaXJlY3RUYXJnZXRcclxuXHRcdFx0XHRcdFx0XHQ/IHRlbXBsYXRlLnJlZGlyZWN0VGFyZ2V0LmdldE1haW5UZXh0KClcclxuXHRcdFx0XHRcdFx0XHQ6IHRlbXBsYXRlLmdldFRpdGxlKCkuZ2V0TWFpblRleHQoKTtcclxuXHRcdFx0XHRcdFx0aWYgKGFsbEJhbm5lcnMud3JhcHBlcnMuaW5jbHVkZXMobWFpblRleHQpKSB7XHJcblx0XHRcdFx0XHRcdFx0dGVtcGxhdGUucmVkaXJlY3RUYXJnZXQgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dChcIlRlbXBsYXRlOlN1YnN0OlwiICsgbWFpblRleHQpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRhbGxCYW5uZXJzLndpdGhvdXRSYXRpbmdzLmluY2x1ZGVzKG1haW5UZXh0KSB8fFxyXG5cdFx0XHRcdFx0XHRcdGFsbEJhbm5lcnMud2lyLmluY2x1ZGVzKG1haW5UZXh0KVxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHR0ZW1wbGF0ZS53aXRob3V0UmF0aW5ncyA9IHRydWU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYgKCBhbGxCYW5uZXJzLmluYWN0aXZlLmluY2x1ZGVzKG1haW5UZXh0KSApIHtcclxuXHRcdFx0XHRcdFx0XHR0ZW1wbGF0ZS5pbmFjdGl2ZVByb2plY3QgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdHJldHVybiB0ZW1wbGF0ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdFxyXG5cdC8vIFJldHJpZXZlIGFuZCBzdG9yZSBjbGFzc2VzLCBpbXBvcnRhbmNlcywgYW5kIFRlbXBsYXRlRGF0YSAodGFzayA0KVxyXG5cdHZhciB0ZW1wbGF0ZURldGFpbHNQcm9taXNlID0gcGFyc2VUYWxrUHJvbWlzZS50aGVuKGZ1bmN0aW9uKHRlbXBsYXRlcykge1xyXG5cdFx0Ly8gV2FpdCBmb3IgYWxsIHByb21pc2VzIHRvIHJlc29sdmVcclxuXHRcdHJldHVybiAkLndoZW4uYXBwbHkobnVsbCwgW1xyXG5cdFx0XHQuLi50ZW1wbGF0ZXMubWFwKHRlbXBsYXRlID0+IHRlbXBsYXRlLmlzU2hlbGxUZW1wbGF0ZSgpID8gbnVsbCA6IHRlbXBsYXRlLnNldENsYXNzZXNBbmRJbXBvcnRhbmNlcygpKSxcclxuXHRcdFx0Li4udGVtcGxhdGVzLm1hcCh0ZW1wbGF0ZSA9PiB0ZW1wbGF0ZS5zZXRQYXJhbURhdGFBbmRTdWdnZXN0aW9ucygpKVxyXG5cdFx0XSkudGhlbigoKSA9PiB7XHJcblx0XHRcdC8vIEFkZCBtaXNzaW5nIHJlcXVpcmVkL3N1Z2dlc3RlZCB2YWx1ZXNcclxuXHRcdFx0dGVtcGxhdGVzLmZvckVhY2godGVtcGxhdGUgPT4gdGVtcGxhdGUuYWRkTWlzc2luZ1BhcmFtcygpKTtcclxuXHRcdFx0Ly8gUmV0dXJuIHRoZSBub3ctbW9kaWZpZWQgdGVtcGxhdGVzXHJcblx0XHRcdHJldHVybiB0ZW1wbGF0ZXM7XHJcblx0XHR9KTtcclxuXHR9KTtcclxuXHJcblx0Ly8gQ2hlY2sgc3ViamVjdCBwYWdlIGZlYXR1cmVzICh0YXNrIDUpIC0gYnV0IGRvbid0IGVycm9yIG91dCBpZiByZXF1ZXN0IGZhaWxzXHJcblx0dmFyIHN1YmplY3RQYWdlQ2hlY2tQcm9taXNlID0gQVBJLmdldCh7XHJcblx0XHRhY3Rpb246IFwicXVlcnlcIixcclxuXHRcdGZvcm1hdDogXCJqc29uXCIsXHJcblx0XHRmb3JtYXR2ZXJzaW9uOiBcIjJcIixcclxuXHRcdHByb3A6IFwiY2F0ZWdvcmllc1wiLFxyXG5cdFx0dGl0bGVzOiBzdWJqZWN0UGFnZS5nZXRQcmVmaXhlZFRleHQoKSxcclxuXHRcdHJlZGlyZWN0czogMSxcclxuXHRcdGNsY2F0ZWdvcmllczogW1xyXG5cdFx0XHRcIkNhdGVnb3J5OkFsbCBkaXNhbWJpZ3VhdGlvbiBwYWdlc1wiLFxyXG5cdFx0XHRcIkNhdGVnb3J5OkFsbCBzdHViIGFydGljbGVzXCIsXHJcblx0XHRcdFwiQ2F0ZWdvcnk6R29vZCBhcnRpY2xlc1wiLFxyXG5cdFx0XHRcIkNhdGVnb3J5OkZlYXR1cmVkIGFydGljbGVzXCIsXHJcblx0XHRcdFwiQ2F0ZWdvcnk6RmVhdHVyZWQgbGlzdHNcIlxyXG5cdFx0XVxyXG5cdH0pLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG5cdFx0aWYgKCAhcmVzcG9uc2UgfHwgIXJlc3BvbnNlLnF1ZXJ5IHx8ICFyZXNwb25zZS5xdWVyeS5wYWdlcyApIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0XHRjb25zdCByZWRpcmVjdFRhcmdldCA9IHJlc3BvbnNlLnF1ZXJ5LnJlZGlyZWN0cyAmJiByZXNwb25zZS5xdWVyeS5yZWRpcmVjdHNbMF0udG8gfHwgZmFsc2U7XHJcblx0XHRpZiAoIHJlZGlyZWN0VGFyZ2V0IHx8ICFzdWJqZWN0SXNBcnRpY2xlICkge1xyXG5cdFx0XHRyZXR1cm4geyByZWRpcmVjdFRhcmdldCB9O1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgcGFnZSA9IHJlc3BvbnNlLnF1ZXJ5LnBhZ2VzWzBdO1xyXG5cdFx0Y29uc3QgaGFzQ2F0ZWdvcnkgPSBjYXRlZ29yeSA9PiBwYWdlLmNhdGVnb3JpZXMgJiYgcGFnZS5jYXRlZ29yaWVzLmZpbmQoY2F0ID0+IGNhdC50aXRsZSA9PT0gXCJDYXRlZ29yeTpcIitjYXRlZ29yeSk7XHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRyZWRpcmVjdFRhcmdldCxcclxuXHRcdFx0ZGlzYW1iaWc6IGhhc0NhdGVnb3J5KFwiQWxsIGRpc2FtYmlndWF0aW9uIHBhZ2VzXCIpLFxyXG5cdFx0XHRzdHVidGFnOiBoYXNDYXRlZ29yeShcIkFsbCBzdHViIGFydGljbGVzXCIpLFxyXG5cdFx0XHRpc0dBOiBoYXNDYXRlZ29yeShcIkdvb2QgYXJ0aWNsZXNcIiksXHJcblx0XHRcdGlzRkE6IGhhc0NhdGVnb3J5KFwiRmVhdHVyZWQgYXJ0aWNsZXNcIiksXHJcblx0XHRcdGlzRkw6IGhhc0NhdGVnb3J5KFwiRmVhdHVyZWQgbGlzdHNcIiksXHJcblx0XHRcdGlzTGlzdDogIWhhc0NhdGVnb3J5KFwiRmVhdHVyZWQgbGlzdHNcIikgJiYgL15MaXN0cz8gb2YvLnRlc3Qoc3ViamVjdFBhZ2UuZ2V0UHJlZml4ZWRUZXh0KCkpXHJcblx0XHR9O1xyXG5cdH0pLmNhdGNoKCgpID0+IG51bGwpOyAvLyBGYWlsdXJlIGlnbm9yZWRcclxuXHJcblx0Ly8gUmV0cmlldmUgcmF0aW5nIGZyb20gT1JFUyAodGFzayA2LCBvbmx5IG5lZWRlZCBmb3IgYXJ0aWNsZXMpIC0gYnV0IGRvbid0IGVycm9yIG91dCBpZiByZXF1ZXN0IGZhaWxzXHJcblx0dmFyIHNob3VsZEdldE9yZXMgPSAoIHN1YmplY3RJc0FydGljbGUgKTsgLy8gVE9ETzogRG9uJ3QgbmVlZCB0byBnZXQgT1JFUyBmb3IgcmVkaXJlY3RzIG9yIGRpc2FtYmlnc1xyXG5cdGlmICggc2hvdWxkR2V0T3JlcyApIHtcclxuXHRcdHZhciBsYXRlc3RSZXZJZFByb21pc2UgPSAhY3VycmVudFBhZ2UuaXNUYWxrUGFnZSgpXHJcblx0XHRcdD8gJC5EZWZlcnJlZCgpLnJlc29sdmUoY29uZmlnLm13LndnUmV2aXNpb25JZClcclxuXHRcdFx0OiBBUEkuZ2V0KCB7XHJcblx0XHRcdFx0YWN0aW9uOiBcInF1ZXJ5XCIsXHJcblx0XHRcdFx0Zm9ybWF0OiBcImpzb25cIixcclxuXHRcdFx0XHRwcm9wOiBcInJldmlzaW9uc1wiLFxyXG5cdFx0XHRcdHRpdGxlczogc3ViamVjdFBhZ2UuZ2V0UHJlZml4ZWRUZXh0KCksXHJcblx0XHRcdFx0cnZwcm9wOiBcImlkc1wiLFxyXG5cdFx0XHRcdGluZGV4cGFnZWlkczogMVxyXG5cdFx0XHR9ICkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcclxuXHRcdFx0XHRpZiAocmVzdWx0LnF1ZXJ5LnJlZGlyZWN0cykge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR2YXIgaWQgPSByZXN1bHQucXVlcnkucGFnZWlkcztcclxuXHRcdFx0XHR2YXIgcGFnZSA9IHJlc3VsdC5xdWVyeS5wYWdlc1tpZF07XHJcblx0XHRcdFx0aWYgKHBhZ2UubWlzc2luZyA9PT0gXCJcIikge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoIGlkIDwgMCApIHtcclxuXHRcdFx0XHRcdHJldHVybiAkLkRlZmVycmVkKCkucmVqZWN0KCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiBwYWdlLnJldmlzaW9uc1swXS5yZXZpZDtcclxuXHRcdFx0fSk7XHJcblx0XHR2YXIgb3Jlc1Byb21pc2UgPSBsYXRlc3RSZXZJZFByb21pc2UudGhlbihmdW5jdGlvbihsYXRlc3RSZXZJZCkge1xyXG5cdFx0XHRpZiAoIWxhdGVzdFJldklkKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBBUEkuZ2V0T1JFUyhsYXRlc3RSZXZJZClcclxuXHRcdFx0XHQudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcclxuXHRcdFx0XHRcdHZhciBkYXRhID0gcmVzdWx0LmVud2lraS5zY29yZXNbbGF0ZXN0UmV2SWRdLmFydGljbGVxdWFsaXR5O1xyXG5cdFx0XHRcdFx0aWYgKCBkYXRhLmVycm9yICkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gJC5EZWZlcnJlZCgpLnJlamVjdChkYXRhLmVycm9yLnR5cGUsIGRhdGEuZXJyb3IubWVzc2FnZSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRjb25zdCBwcmVkaWN0aW9uID0gZGF0YS5zY29yZS5wcmVkaWN0aW9uO1xyXG5cdFx0XHRcdFx0Y29uc3QgcHJvYmFiaWxpdGllcyA9IGRhdGEuc2NvcmUucHJvYmFiaWxpdHk7XHJcblx0XHRcdFx0XHRpZiAocHJlZGljdGlvbiA9PT0gXCJGQVwiIHx8IHByZWRpY3Rpb24gPT09IFwiR0FcIikge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdFx0XHRcdHByZWRpY3Rpb246IFwiQiBvciBoaWdoZXJcIixcclxuXHRcdFx0XHRcdFx0XHRwcm9iYWJpbGl0eTogKChwcm9iYWJpbGl0aWVzLkZBICsgcHJvYmFiaWxpdGllcy5HQSArIHByb2JhYmlsaXRpZXMuQikqMTAwKS50b0ZpeGVkKDEpK1wiJVwiXHJcblx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdFx0XHRwcmVkaWN0aW9uLFxyXG5cdFx0XHRcdFx0XHRwcm9iYWJpbGl0eTogKHByb2JhYmlsaXRpZXNbIHByZWRpY3Rpb24gXSoxMDApLnRvRml4ZWQoMSkrXCIlXCJcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0fSkuY2F0Y2goKCkgPT4gbnVsbCk7IC8vIEZhaWx1cmUgaWdub3JlZDtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0Ly8gT3BlbiB0aGUgbG9hZCBkaWFsb2dcclxuXHR2YXIgaXNPcGVuZWRQcm9taXNlID0gJC5EZWZlcnJlZCgpO1xyXG5cdHZhciBsb2FkRGlhbG9nV2luID0gd2luZG93TWFuYWdlci5vcGVuV2luZG93KFwibG9hZERpYWxvZ1wiLCB7XHJcblx0XHRwcm9taXNlczogW1xyXG5cdFx0XHRiYW5uZXJzUHJvbWlzZSxcclxuXHRcdFx0bG9hZFRhbGtQcm9taXNlLFxyXG5cdFx0XHRwYXJzZVRhbGtQcm9taXNlLFxyXG5cdFx0XHR0ZW1wbGF0ZURldGFpbHNQcm9taXNlLFxyXG5cdFx0XHRzdWJqZWN0UGFnZUNoZWNrUHJvbWlzZSxcclxuXHRcdFx0c2hvdWxkR2V0T3JlcyAmJiBvcmVzUHJvbWlzZVxyXG5cdFx0XSxcclxuXHRcdG9yZXM6IHNob3VsZEdldE9yZXMsXHJcblx0XHRpc09wZW5lZDogaXNPcGVuZWRQcm9taXNlXHJcblx0fSk7XHJcblxyXG5cdGxvYWREaWFsb2dXaW4ub3BlbmVkLnRoZW4oaXNPcGVuZWRQcm9taXNlLnJlc29sdmUpO1xyXG5cclxuXHJcblx0JC53aGVuKFxyXG5cdFx0cHJlZnNQcm9taXNlLFxyXG5cdFx0bG9hZFRhbGtQcm9taXNlLFxyXG5cdFx0dGVtcGxhdGVEZXRhaWxzUHJvbWlzZSxcclxuXHRcdHN1YmplY3RQYWdlQ2hlY2tQcm9taXNlLFxyXG5cdFx0c2hvdWxkR2V0T3JlcyAmJiBvcmVzUHJvbWlzZVxyXG5cdCkudGhlbihcclxuXHRcdC8vIEFsbCBzdWNjZWRlZFxyXG5cdFx0ZnVuY3Rpb24ocHJlZmVyZW5jZXMsIHRhbGtXaWtpdGV4dCwgYmFubmVycywgc3ViamVjdFBhZ2VDaGVjaywgb3Jlc1ByZWRpY2l0aW9uICkge1xyXG5cdFx0XHR2YXIgcmVzdWx0ID0ge1xyXG5cdFx0XHRcdHN1Y2Nlc3M6IHRydWUsXHJcblx0XHRcdFx0dGFsa3BhZ2U6IHRhbGtQYWdlLFxyXG5cdFx0XHRcdHN1YmplY3RQYWdlOiBzdWJqZWN0UGFnZSxcclxuXHRcdFx0XHR0YWxrV2lraXRleHQ6IHRhbGtXaWtpdGV4dCxcclxuXHRcdFx0XHRiYW5uZXJzOiBiYW5uZXJzLFxyXG5cdFx0XHRcdHByZWZlcmVuY2VzOiBwcmVmZXJlbmNlcyxcclxuXHRcdFx0XHRpc0FydGljbGU6IHN1YmplY3RJc0FydGljbGVcclxuXHRcdFx0fTtcclxuXHRcdFx0aWYgKHN1YmplY3RQYWdlQ2hlY2spIHtcclxuXHRcdFx0XHRyZXN1bHQgPSB7IC4uLnJlc3VsdCwgLi4uc3ViamVjdFBhZ2VDaGVjayB9O1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChvcmVzUHJlZGljaXRpb24gJiYgc3ViamVjdFBhZ2VDaGVjayAmJiAhc3ViamVjdFBhZ2VDaGVjay5pc0dBICYmICFzdWJqZWN0UGFnZUNoZWNrLmlzRkEgJiYgIXN1YmplY3RQYWdlQ2hlY2suaXNGTCkge1xyXG5cdFx0XHRcdHJlc3VsdC5vcmVzID0gb3Jlc1ByZWRpY2l0aW9uO1xyXG5cdFx0XHR9XHJcblx0XHRcdHdpbmRvd01hbmFnZXIuY2xvc2VXaW5kb3coXCJsb2FkRGlhbG9nXCIsIHJlc3VsdCk7XHJcblx0XHRcdFxyXG5cdFx0fVxyXG5cdCk7IC8vIEFueSBmYWlsdXJlcyBhcmUgaGFuZGxlZCBieSB0aGUgbG9hZERpYWxvZyB3aW5kb3cgaXRzZWxmXHJcblxyXG5cdC8vIE9uIHdpbmRvdyBjbG9zZWQsIGNoZWNrIGRhdGEsIGFuZCByZXNvbHZlL3JlamVjdCBzZXR1cENvbXBsZXRlZFByb21pc2VcclxuXHRsb2FkRGlhbG9nV2luLmNsb3NlZC50aGVuKGZ1bmN0aW9uKGRhdGEpIHtcclxuXHRcdGlmIChkYXRhICYmIGRhdGEuc3VjY2Vzcykge1xyXG5cdFx0XHQvLyBHb3QgZXZlcnl0aGluZyBuZWVkZWQ6IFJlc29sdmUgcHJvbWlzZSB3aXRoIHRoaXMgZGF0YVxyXG5cdFx0XHRzZXR1cENvbXBsZXRlZFByb21pc2UucmVzb2x2ZShkYXRhKTtcclxuXHRcdH0gZWxzZSBpZiAoZGF0YSAmJiBkYXRhLmVycm9yKSB7XHJcblx0XHRcdC8vIFRoZXJlIHdhcyBhbiBlcnJvcjogUmVqZWN0IHByb21pc2Ugd2l0aCBlcnJvciBjb2RlL2luZm9cclxuXHRcdFx0c2V0dXBDb21wbGV0ZWRQcm9taXNlLnJlamVjdChkYXRhLmVycm9yLmNvZGUsIGRhdGEuZXJyb3IuaW5mbyk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvLyBXaW5kb3cgY2xvc2VkIGJlZm9yZSBjb21wbGV0aW9uOiByZXNvbHZlIHByb21pc2Ugd2l0aG91dCBhbnkgZGF0YVxyXG5cdFx0XHRzZXR1cENvbXBsZXRlZFByb21pc2UucmVzb2x2ZShudWxsKTtcclxuXHRcdH1cclxuXHRcdGNhY2hlLmNsZWFySW52YWxpZEl0ZW1zKCk7XHJcblx0fSk7XHJcblx0cmV0dXJuIHNldHVwQ29tcGxldGVkUHJvbWlzZTtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHNldHVwUmF0ZXI7XHJcbi8vIDwvbm93aWtpPiIsIi8vIDxub3dpa2k+XHJcblxyXG4vLyBWYXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIGFuZCBvYmplY3RzIHRoYXQgbWlnaHQgYmUgdXNlZCBpbiBtdWx0aXBsZSBwbGFjZXNcclxuXHJcbnZhciBpc0FmdGVyRGF0ZSA9IGZ1bmN0aW9uKGRhdGVTdHJpbmcpIHtcclxuXHRyZXR1cm4gbmV3IERhdGUoZGF0ZVN0cmluZykgPCBuZXcgRGF0ZSgpO1xyXG59O1xyXG5cclxudmFyIHllc1dvcmRzID0gW1xyXG5cdFwiYWRkXCIsXHJcblx0XCJhZGRlZFwiLFxyXG5cdFwiYWZmaXJtXCIsXHJcblx0XCJhZmZpcm1lZFwiLFxyXG5cdFwiaW5jbHVkZVwiLFxyXG5cdFwiaW5jbHVkZWRcIixcclxuXHRcIm9uXCIsXHJcblx0XCJ0cnVlXCIsXHJcblx0XCJ5ZXNcIixcclxuXHRcInlcIixcclxuXHRcIjFcIlxyXG5dO1xyXG52YXIgbm9Xb3JkcyA9IFtcclxuXHRcImRlY2xpbmVcIixcclxuXHRcImRlY2xpbmVkXCIsXHJcblx0XCJleGNsdWRlXCIsXHJcblx0XCJleGNsdWRlZFwiLFxyXG5cdFwiZmFsc2VcIixcclxuXHRcIm5vbmVcIixcclxuXHRcIm5vdFwiLFxyXG5cdFwibm9cIixcclxuXHRcIm5cIixcclxuXHRcIm9mZlwiLFxyXG5cdFwib21pdFwiLFxyXG5cdFwib21pdHRlZFwiLFxyXG5cdFwicmVtb3ZlXCIsXHJcblx0XCJyZW1vdmVkXCIsXHJcblx0XCIwXCJcclxuXTtcclxudmFyIG5vcm1hbGlzZVllc05vID0gZnVuY3Rpb24odmFsKSB7XHJcblx0aWYgKHZhbCA9PSBudWxsKSB7XHJcblx0XHRyZXR1cm4gdmFsO1xyXG5cdH1cclxuXHR2YXIgdHJpbW1lZExjVmFsID0gdmFsLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG5cdGlmICh5ZXNXb3Jkcy5pbmNsdWRlcyh0cmltbWVkTGNWYWwpKSB7XHJcblx0XHRyZXR1cm4gXCJ5ZXNcIjtcclxuXHR9IGVsc2UgaWYgKG5vV29yZHMuaW5jbHVkZXModHJpbW1lZExjVmFsKSkge1xyXG5cdFx0cmV0dXJuIFwibm9cIjtcclxuXHR9IGVsc2Uge1xyXG5cdFx0cmV0dXJuIHRyaW1tZWRMY1ZhbDtcclxuXHR9XHJcbn07XHJcblxyXG4vKipcclxuICogXHJcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaWx0ZXJQcmVkaWNhdGUgKGN1cnJlbnRWYWwsIGN1cnJlbnRJbmRleCwgYXJyYXkpID0+IHtib29sZWFufVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtYXBUcmFuc2Zvcm0gKGN1cnJlbnRWYWwsIGN1cnJlbnRJbmRleCwgYXJyYXkpID0+IHthbnl9XHJcbiAqIEByZXR1cm5zIHtBcnJheX1cclxuICovXHJcbnZhciBmaWx0ZXJBbmRNYXAgPSBmdW5jdGlvbihhcnJheSwgZmlsdGVyUHJlZGljYXRlLCBtYXBUcmFuc2Zvcm0pIHtcclxuXHRyZXR1cm4gYXJyYXkucmVkdWNlKFxyXG5cdFx0KGFjY3VtdWxhdGVkLCBjdXJyZW50VmFsLCBjdXJyZW50SW5kZXgpID0+IHtcclxuXHRcdFx0aWYgKGZpbHRlclByZWRpY2F0ZShjdXJyZW50VmFsLCBjdXJyZW50SW5kZXgsIGFycmF5KSkge1xyXG5cdFx0XHRcdHJldHVybiBbLi4uYWNjdW11bGF0ZWQsIG1hcFRyYW5zZm9ybShjdXJyZW50VmFsLCBjdXJyZW50SW5kZXgsIGFycmF5KV07XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGFjY3VtdWxhdGVkO1xyXG5cdFx0fSxcclxuXHRcdFtdXHJcblx0KTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBcclxuICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0gYXJyYXkgXHJcbiAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH0gaXRlbSB3aXRoIHRoZSBoaWdoZXN0IGZyZXF1ZW5jeVxyXG4gKiBlLmcuIGBtb3N0RnJlcXVlbnQoW1wiYXBwbGVcIiwgXCJhcHBsZVwiLCBcIm9yYW5nZVwiXSlgIHJldHVybnMgYFwiYXBwbGVcImBcclxuICovXHJcbmZ1bmN0aW9uIG1vc3RGcmVxdWVudChhcnJheSkge1xyXG5cdGlmICghYXJyYXkgfHwgIUFycmF5LmlzQXJyYXkoYXJyYXkpIHx8IGFycmF5Lmxlbmd0aCA9PT0gMClcclxuXHRcdHJldHVybiBudWxsO1xyXG5cdHZhciBtYXAgPSB7fTtcclxuXHR2YXIgbW9zdEZyZXEgPSBudWxsO1xyXG5cdGFycmF5LmZvckVhY2goKGl0ZW0pID0+IHtcclxuXHRcdG1hcFtpdGVtXSA9IChtYXBbaXRlbV0gfHwgMCkgKyAxO1xyXG5cdFx0aWYgKG1vc3RGcmVxID09PSBudWxsIHx8IG1hcFtpdGVtXSA+IG1hcFttb3N0RnJlcV0pIHtcclxuXHRcdFx0bW9zdEZyZXEgPSBpdGVtO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG5cdHJldHVybiBtb3N0RnJlcTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFxyXG4gKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBhcnJheSBcclxuICogQHJldHVybnMge3N0cmluZ1tdfG51bWJlcltdfSBhcnJheSB3aXRoIG9ubHkgdW5pcXVlIHZhbHVlc1xyXG4gKiBlLmcuIGB1bmlxdWVBcnJheShbXCJhcHBsZVwiLCBcImFwcGxlXCIsIFwib3JhbmdlXCJdKWAgcmV0dXJucyBgW1wiYXBwbGVcIiwgXCJvcmFuZ2VcIl1gXHJcbiAqL1xyXG5mdW5jdGlvbiB1bmlxdWVBcnJheShhcnJheSkge1xyXG5cdGlmICghYXJyYXkgfHwgIUFycmF5LmlzQXJyYXkoYXJyYXkpIHx8IGFycmF5Lmxlbmd0aCA9PT0gMClcclxuXHRcdHJldHVybiBbXTtcclxuXHR2YXIgc2VlbiA9IHt9O1xyXG5cdHZhciB1bmlxdWUgPSBbXTtcclxuXHRhcnJheS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcblx0XHRpZiAoIXNlZW5baXRlbV0pIHtcclxuXHRcdFx0dW5pcXVlLnB1c2goaXRlbSk7XHJcblx0XHRcdHNlZW5baXRlbV0gPSB0cnVlO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG5cdHJldHVybiB1bmlxdWU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNsYXNzTWFzayhjbGFzc1ZhbCkge1xyXG5cdGlmICghY2xhc3NWYWwpIHtcclxuXHRcdHJldHVybiBjbGFzc1ZhbDtcclxuXHR9XHJcblx0c3dpdGNoIChjbGFzc1ZhbC50b0xvd2VyQ2FzZSgpKSB7XHJcblx0Y2FzZSBcImZhXCI6XHJcblx0Y2FzZSBcImZsXCI6XHJcblx0Y2FzZSBcImFcIjpcclxuXHRjYXNlIFwiZ2FcIjpcclxuXHRjYXNlIFwiYlwiOlxyXG5cdGNhc2UgXCJjXCI6XHJcblx0Y2FzZSBcIm5hXCI6XHJcblx0Y2FzZSBcImZtXCI6XHJcblx0Y2FzZSBcImFsXCI6XHJcblx0Y2FzZSBcImJsXCI6XHJcblx0Y2FzZSBcImNsXCI6XHJcblx0XHRyZXR1cm4gY2xhc3NWYWwudG9VcHBlckNhc2UoKTtcclxuXHRjYXNlIFwic3RhcnRcIjpcclxuXHRjYXNlIFwic3R1YlwiOlxyXG5cdGNhc2UgXCJsaXN0XCI6XHJcblx0Y2FzZSBcInBvcnRhbFwiOlxyXG5cdGNhc2UgXCJwcm9qZWN0XCI6XHJcblx0Y2FzZSBcImRyYWZ0XCI6XHJcblx0Y2FzZSBcImJvb2tcIjpcclxuXHRjYXNlIFwiZnV0dXJlXCI6XHJcblx0Y2FzZSBcImN1cnJlbnRcIjpcclxuXHRjYXNlIFwiY29tcGxldGVcIjpcclxuXHRjYXNlIFwic3Vic3RhbnRpYWxcIjpcclxuXHRjYXNlIFwiYmFzaWNcIjpcclxuXHRjYXNlIFwiaW5jb21wbGV0ZVwiOlxyXG5cdGNhc2UgXCJtZXRhXCI6XHJcblx0XHRyZXR1cm4gY2xhc3NWYWwuc2xpY2UoMCwxKS50b1VwcGVyQ2FzZSgpICsgY2xhc3NWYWwuc2xpY2UoMSkudG9Mb3dlckNhc2UoKTtcclxuXHRjYXNlIFwiaW1hZ2VcIjpcclxuXHRjYXNlIFwiaW1nXCI6XHJcblx0Y2FzZSBcImZpbGVcIjpcclxuXHRcdHJldHVybiBcIkZpbGVcIjtcclxuXHRjYXNlIFwiY2F0ZWdvcnlcIjpcclxuXHRjYXNlIFwiY2F0XCI6XHJcblx0Y2FzZSBcImNhdGVnXCI6XHJcblx0XHRyZXR1cm4gXCJDYXRlZ29yeVwiO1xyXG5cdGNhc2UgXCJkaXNhbWJpZ3VhdGlvblwiOlxyXG5cdGNhc2UgXCJkaXNhbWJpZ1wiOlxyXG5cdGNhc2UgXCJkaXNhbWJcIjpcclxuXHRjYXNlIFwiZGFiXCI6XHJcblx0XHRyZXR1cm4gXCJEaXNhbWJpZ1wiO1xyXG5cdGNhc2UgXCJyZWRpcmVjdFwiOlxyXG5cdGNhc2UgXCJyZWRpclwiOlxyXG5cdGNhc2UgXCJyZWRcIjpcclxuXHRcdHJldHVybiBcIlJlZGlyZWN0XCI7XHJcblx0Y2FzZSBcInRlbXBsYXRlXCI6XHJcblx0Y2FzZSBcInRlbXBcIjpcclxuXHRjYXNlIFwidHBsXCI6XHJcblx0XHRyZXR1cm4gXCJUZW1wbGF0ZVwiO1xyXG5cdGNhc2UgXCJicGx1c1wiOlxyXG5cdGNhc2UgXCJiK1wiOlxyXG5cdFx0cmV0dXJuIFwiQnBsdXNcIjtcclxuXHRjYXNlIFwiZnBvXCI6XHJcblx0XHRyZXR1cm4gXCJGUG9cIjtcclxuXHRkZWZhdWx0OlxyXG5cdFx0cmV0dXJuIGNsYXNzVmFsO1xyXG5cdH1cclxufVxyXG5cclxuZnVuY3Rpb24gaW1wb3J0YW5jZU1hc2soaW1wb3J0YW5jZSkge1xyXG5cdGlmICghaW1wb3J0YW5jZSkge1xyXG5cdFx0cmV0dXJuIGltcG9ydGFuY2U7XHJcblx0fVxyXG5cdGlmIChpbXBvcnRhbmNlLnRvTG93ZXJDYXNlKCkgPT09IFwibmFcIikge1xyXG5cdFx0cmV0dXJuIFwiTkFcIjtcclxuXHR9XHJcblx0cmV0dXJuIGltcG9ydGFuY2Uuc2xpY2UoMCwxKS50b1VwcGVyQ2FzZSgpICsgaW1wb3J0YW5jZS5zbGljZSgxKS50b0xvd2VyQ2FzZSgpO1xyXG59XHJcblxyXG5leHBvcnQge1xyXG5cdGlzQWZ0ZXJEYXRlLFxyXG5cdGZpbHRlckFuZE1hcCxcclxuXHRub3JtYWxpc2VZZXNObyxcclxuXHRtb3N0RnJlcXVlbnQsXHJcblx0dW5pcXVlQXJyYXksXHJcblx0Y2xhc3NNYXNrLFxyXG5cdGltcG9ydGFuY2VNYXNrXHJcbn07XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCBMb2FkRGlhbG9nIGZyb20gXCIuL1dpbmRvd3MvTG9hZERpYWxvZ1wiO1xyXG5pbXBvcnQgTWFpbldpbmRvdyBmcm9tIFwiLi9XaW5kb3dzL01haW5XaW5kb3dcIjtcclxuLy8gPG5vd2lraT5cclxuXHJcbnZhciBmYWN0b3J5ID0gbmV3IE9PLkZhY3RvcnkoKTtcclxuXHJcbi8vIFJlZ2lzdGVyIHdpbmRvdyBjb25zdHJ1Y3RvcnMgd2l0aCB0aGUgZmFjdG9yeS5cclxuZmFjdG9yeS5yZWdpc3RlcihMb2FkRGlhbG9nKTtcclxuZmFjdG9yeS5yZWdpc3RlcihNYWluV2luZG93KTtcclxuXHJcbnZhciBtYW5hZ2VyID0gbmV3IE9PLnVpLldpbmRvd01hbmFnZXIoIHtcclxuXHRcImZhY3RvcnlcIjogZmFjdG9yeVxyXG59ICk7XHJcbiQoIGRvY3VtZW50LmJvZHkgKS5hcHBlbmQoIG1hbmFnZXIuJGVsZW1lbnQgKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG1hbmFnZXI7XHJcbi8vIDwvbm93aWtpPiJdfQ== |
Revision as of 03:10, 6 January 2024
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
module.exports={
"name": "rater",
"version": "2.7.1",
"description": "Wikipedia userscript that helps assess pages for WikiProjects",
"homepage": "https://github.com/evad37/rater",
"browser": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"lint:es5": "jshint index.js",
"lint:es6": "eslint index.js \"rater-src/**\"",
"lint:fix": "eslint index.js \"rater-src/**\" --fix",
"lint": "npm run lint:es6 && npm run lint:es5",
"build:bundle": "browserify rater-src/App.js --debug -t babelify --outfile dist/rater.js",
"build:minify": "uglifyjs dist/rater.js --compress -b ascii_only=true,beautify=false --output dist/rater.min.js",
"build:concat": "concat-cli -f \"comment-top.js\" dist/rater.min.js \"comment-bottom.js\" -o dist/rater.min.js",
"build": "npm run lint && npm run build:bundle && npm run build:minify && npm run build:concat"
},
"author": {
"name": "Evad37",
"url": "https://en.wikipedia.org/wiki/User:Evad37"
},
"repository": {
"type": "git",
"url": "https://github.com/evad37/rater.git"
},
"license": "(MIT OR CC-BY-4.0)",
"devDependencies": {
"@babel/core": "^7.9.0",
"@babel/preset-env": "^7.9.0",
"babelify": "^10.0.0",
"browserify": "^16.5.0",
"concat-cli": "^4.0.0",
"eslint": "^6.8.0",
"jshint": "^2.11.0",
"uglify-js": "^3.8.0"
}
}
},{}],2:[function(require,module,exports){
"use strict";
var _setup = _interopRequireDefault(require("./setup"));
var _autostart = _interopRequireDefault(require("./autostart"));
var _css = _interopRequireDefault(require("./css.js"));
var _api = require("./api");
var _windowManager = _interopRequireDefault(require("./windowManager"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
// <nowiki>
(function App() {
var stylesheet;
var showMainWindow = function showMainWindow(data) {
if (!data || !data.success) {
return;
}
if (stylesheet) {
stylesheet.disabled = false;
} else {
stylesheet = mw.util.addCSS(_css["default"]);
}
// Add css class to body to enable background scrolling
document.getElementsByTagName("body")[0].classList.add("rater-mainWindow-open");
// Open the window
_windowManager["default"].openWindow("main", data).closed.then(function (result) {
// Disable/remove the css styles, so as to not interfere with other scripts/content/OOUI windows
if (stylesheet) {
stylesheet.disabled = true;
}
document.getElementsByTagName("body")[0].classList.remove("rater-mainWindow-open");
// Restart if needed
if (result && result.restart) {
_windowManager["default"].removeWindows(["main"]).then(_setup["default"]).then(showMainWindow, showSetupError);
return;
}
// Show notification when saved successfully
if (result && result.success) {
var $message = $("<span>").append($("<strong>").text("Ratings saved successfully."));
if (result.upgradedStub) {
$message.append($("<br>"),
// TODO: There should be a link that will edit the article for you
$("<span>").text("Note that the article appears to be tagged as a stub."));
}
mw.notify($message, {
autoHide: true,
autoHideSeconds: "long",
tag: "Rater-saved"
});
}
});
};
var showSetupError = function showSetupError(code, jqxhr) {
return OO.ui.alert((0, _api.makeErrorMsg)(code, jqxhr), {
title: "Rater failed to open"
});
};
// Invocation by portlet link
mw.util.addPortletLink("p-cactions", "#", "Rater", "ca-rater", "Rate quality and importance", "5");
$("#ca-rater").click(function (event) {
event.preventDefault();
(0, _setup["default"])().then(showMainWindow, showSetupError);
});
// Invocation by auto-start (do not show message on error)
(0, _autostart["default"])().then(showMainWindow);
})();
// </nowiki>
},{"./api":15,"./autostart":16,"./css.js":19,"./setup":22,"./windowManager":24}],3:[function(require,module,exports){
"use strict";
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getWithRedirectTo = exports.parseTemplates = exports.Template = void 0;
var _api = _interopRequireDefault(require("./api"));
var _util = require("./util");
var _config = _interopRequireDefault(require("./config"));
var cache = _interopRequireWildcard(require("./cache"));
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
// <nowiki>
/** Template
*
* @class
* Represents the wikitext of template transclusion. Used by #parseTemplates.
* @prop {String} name Name of the template
* @prop {String} wikitext Full wikitext of the transclusion
* @prop {Object[]} parameters Parameters used in the translcusion, in order, of form:
{
name: {String|Number} parameter name, or position for unnamed parameters,
value: {String} Wikitext passed to the parameter (whitespace trimmed),
wikitext: {String} Full wikitext (including leading pipe, parameter name/equals sign (if applicable), value, and any whitespace)
}
* @constructor
* @param {String} wikitext Wikitext of a template transclusion, starting with '{{' and ending with '}}'.
*/
var Template = function Template(wikitext) {
this.wikitext = wikitext;
this.parameters = [];
// Spacing around pipes, equals signs, end braces (defaults)
this.pipeStyle = " |";
this.equalsStyle = "=";
this.endBracesStyle = "}}";
};
exports.Template = Template;
Template.prototype.addParam = function (name, val, wikitext) {
this.parameters.push({
"name": name,
"value": val,
"wikitext": "|" + wikitext
});
};
/**
* Get a parameter data by parameter name
*/
Template.prototype.getParam = function (paramName) {
return this.parameters.find(function (p) {
return p.name == paramName;
});
};
Template.prototype.setName = function (name) {
this.name = name.trim();
};
Template.prototype.getTitle = function () {
return mw.Title.newFromText("Template:" + this.name);
};
/**
* parseTemplates
*
* Parses templates from wikitext.
* Based on SD0001's version at <https://en.wikipedia.org/wiki/User:SD0001/parseAllTemplates.js>.
* Returns an array containing the template details:
* var templates = parseTemplates("Hello {{foo |Bar|baz=qux |2=loremipsum|3=}} world");
* console.log(templates[0]); // --> object
{
name: "foo",
wikitext:"{{foo |Bar|baz=qux | 2 = loremipsum |3=}}",
parameters: [
{
name: 1,
value: 'Bar',
wikitext: '|Bar'
},
{
name: 'baz',
value: 'qux',
wikitext: '|baz=qux '
},
{
name: '2',
value: 'loremipsum',
wikitext: '| 2 = loremipsum '
},
{
name: '3',
value: '',
wikitext: '|3='
}
],
getParam: function(paramName) {
return this.parameters.find(function(p) { return p.name == paramName; });
}
}
*
*
* @param {String} wikitext
* @param {Boolean} recursive Set to `true` to also parse templates that occur within other templates,
* rather than just top-level templates.
* @return {Template[]} templates
*/
var parseTemplates = function parseTemplates(wikitext, recursive) {
/* eslint-disable no-control-regex */
if (!wikitext) {
return [];
}
var strReplaceAt = function strReplaceAt(string, index, _char) {
return string.slice(0, index) + _char + string.slice(index + 1);
};
var result = [];
var processTemplateText = function processTemplateText(startIdx, endIdx) {
var text = wikitext.slice(startIdx, endIdx);
var template = new Template("{{" + text.replace(/\x01/g, "|") + "}}");
// swap out pipe in links with \x01 control character
// [[File: ]] can have multiple pipes, so might need multiple passes
while (/(\[\[[^\]]*?)\|(.*?\]\])/g.test(text)) {
text = text.replace(/(\[\[[^\]]*?)\|(.*?\]\])/g, "$1\x01$2");
}
// Figure out most-used spacing styles for pipes/equals
template.pipeStyle = (0, _util.mostFrequent)(text.match(/[\s\n]*\|[\s\n]*/g)) || " |";
template.equalsStyle = (0, _util.mostFrequent)(text.replace(/(=[^|]*)=+/g, "$1").match(/[\s\n]*=[\s\n]*/g)) || "=";
// Figure out end-braces style
var endSpacing = text.match(/[\s\n]*$/);
template.endBracesStyle = (endSpacing ? endSpacing[0] : "") + "}}";
var chunks = text.split("|").map(function (chunk) {
// change '\x01' control characters back to pipes
return chunk.replace(/\x01/g, "|");
});
template.setName(chunks[0]);
var parameterChunks = chunks.slice(1);
var unnamedIdx = 1;
parameterChunks.forEach(function (chunk) {
var indexOfEqualTo = chunk.indexOf("=");
var indexOfOpenBraces = chunk.indexOf("{{");
var isWithoutEquals = !chunk.includes("=");
var hasBracesBeforeEquals = chunk.includes("{{") && indexOfOpenBraces < indexOfEqualTo;
var isUnnamedParam = isWithoutEquals || hasBracesBeforeEquals;
var pName, pNum, pVal;
if (isUnnamedParam) {
// Get the next number not already used by either an unnamed parameter, or by a
// named parameter like `|1=val`
while (template.getParam(unnamedIdx)) {
unnamedIdx++;
}
pNum = unnamedIdx;
pVal = chunk.trim();
} else {
pName = chunk.slice(0, indexOfEqualTo).trim();
pVal = chunk.slice(indexOfEqualTo + 1).trim();
}
template.addParam(pName || pNum, pVal, chunk);
});
result.push(template);
};
var n = wikitext.length;
// number of unclosed braces
var numUnclosed = 0;
// are we inside a comment, or between nowiki tags, or in a {{{parameter}}}?
var inComment = false;
var inNowiki = false;
var inParameter = false;
var startIdx, endIdx;
for (var i = 0; i < n; i++) {
if (!inComment && !inNowiki && !inParameter) {
if (wikitext[i] === "{" && wikitext[i + 1] === "{" && wikitext[i + 2] === "{" && wikitext[i + 3] !== "{") {
inParameter = true;
i += 2;
} else if (wikitext[i] === "{" && wikitext[i + 1] === "{") {
if (numUnclosed === 0) {
startIdx = i + 2;
}
numUnclosed += 2;
i++;
} else if (wikitext[i] === "}" && wikitext[i + 1] === "}") {
if (numUnclosed === 2) {
endIdx = i;
processTemplateText(startIdx, endIdx);
}
numUnclosed -= 2;
i++;
} else if (wikitext[i] === "|" && numUnclosed > 2) {
// swap out pipes in nested templates with \x01 character
wikitext = strReplaceAt(wikitext, i, "\x01");
} else if (/^<!--/.test(wikitext.slice(i, i + 4))) {
inComment = true;
i += 3;
} else if (/^<nowiki ?>/.test(wikitext.slice(i, i + 9))) {
inNowiki = true;
i += 7;
}
} else {
// we are in a comment or nowiki or {{{parameter}}}
if (wikitext[i] === "|") {
// swap out pipes with \x01 character
wikitext = strReplaceAt(wikitext, i, "\x01");
} else if (/^-->/.test(wikitext.slice(i, i + 3))) {
inComment = false;
i += 2;
} else if (/^<\/nowiki ?>/.test(wikitext.slice(i, i + 10))) {
inNowiki = false;
i += 8;
} else if (wikitext[i] === "}" && wikitext[i + 1] === "}" && wikitext[i + 2] === "}") {
inParameter = false;
i += 2;
}
}
}
if (recursive) {
var subtemplates = (0, _util.filterAndMap)(result, function (template) {
return /\{\{(?:.|\n)*\}\}/.test(template.wikitext.slice(2, -2));
}, function (template) {
return parseTemplates(template.wikitext.slice(2, -2), true);
});
return result.concat.apply(result, subtemplates);
}
return result;
}; /* eslint-enable no-control-regex */
/**
* @param {Template|Template[]} templates
* @return {Promise<Template>|Promise<Template[]>}
*/
exports.parseTemplates = parseTemplates;
var getWithRedirectTo = function getWithRedirectTo(templates) {
var templatesArray = Array.isArray(templates) ? templates : [templates];
if (templatesArray.length === 0) {
return $.Deferred().resolve([]);
}
return _api["default"].get({
"action": "query",
"format": "json",
"titles": (0, _util.filterAndMap)(templatesArray, function (template) {
return template.getTitle() !== null;
}, function (template) {
return template.getTitle().getPrefixedText();
}),
"redirects": 1
}).then(function (result) {
if (!result || !result.query) {
return $.Deferred().reject("Empty response");
}
if (result.query.redirects) {
result.query.redirects.forEach(function (redirect) {
var i = templatesArray.findIndex(function (template) {
var title = template.getTitle();
return title && title.getPrefixedText() === redirect.from;
});
if (i !== -1) {
templatesArray[i].redirectTarget = mw.Title.newFromText(redirect.to);
}
});
}
return Array.isArray(templates) ? templatesArray : templatesArray[0];
});
};
exports.getWithRedirectTo = getWithRedirectTo;
Template.prototype.getDataForParam = function (key, paraName) {
if (!this.paramData) {
return null;
}
// If alias, switch from alias to preferred parameter name
var para = this.paramAliases[paraName] || paraName;
if (!this.paramData[para]) {
return;
}
var data = this.paramData[para][key];
// Data might actually be an object with key "en"
if (data && data.en && !Array.isArray(data)) {
return data.en;
}
return data;
};
Template.prototype.isShellTemplate = function () {
var mainText = this.redirectTarget ? this.redirectTarget.getMainText() : this.getTitle().getMainText();
return _config["default"].shellTemplates.includes(mainText);
};
Template.prototype.setParamDataAndSuggestions = function () {
var self = this;
var paramDataSet = $.Deferred();
if (self.paramData) {
return paramDataSet.resolve();
}
var prefixedText = self.redirectTarget ? self.redirectTarget.getPrefixedText() : self.getTitle().getPrefixedText();
var cachedInfo = cache.read(prefixedText + "-params");
if (cachedInfo && cachedInfo.value && cachedInfo.staleDate && cachedInfo.value.paramData != null && cachedInfo.value.parameterSuggestions != null && cachedInfo.value.paramAliases != null) {
self.notemplatedata = cachedInfo.value.notemplatedata;
self.paramData = cachedInfo.value.paramData;
self.parameterSuggestions = cachedInfo.value.parameterSuggestions;
self.paramAliases = cachedInfo.value.paramAliases;
paramDataSet.resolve();
if (!(0, _util.isAfterDate)(cachedInfo.staleDate)) {
// Just use the cached data
return paramDataSet;
} // else: Use the cache data for now, but also fetch new data from API
}
_api["default"].get({
action: "templatedata",
titles: prefixedText,
redirects: 1,
includeMissingTitles: 1
}).then(function (response) {
return response;
}, function /*error*/ () {
return null;
} // Ignore errors, will use default data
).then(function (result) {
// Figure out page id (beacuse action=templatedata doesn't have an indexpageids option)
var id = result && $.map(result.pages, function (_value, key) {
return key;
});
if (!result || !result.pages[id] || result.pages[id].notemplatedata || !result.pages[id].params) {
// No TemplateData, so use defaults (guesses)
self.notemplatedata = true;
self.templatedataApiError = !result;
self.paramData = _config["default"].defaultParameterData;
} else {
self.paramData = result.pages[id].params;
}
self.paramAliases = {};
$.each(self.paramData, function (paraName, paraData) {
// Extract aliases for easier reference later on
if (paraData.aliases && paraData.aliases.length) {
paraData.aliases.forEach(function (alias) {
self.paramAliases[alias] = paraName;
});
}
// Extract allowed values array from description
if (paraData.description && /\[.*'.+?'.*?\]/.test(paraData.description.en)) {
try {
var allowedVals = JSON.parse(paraData.description.en.replace(/^.*\[/, "[").replace(/"/g, "\\\"").replace(/'/g, "\"").replace(/,\s*]/, "]").replace(/].*$/, "]"));
self.paramData[paraName].allowedValues = allowedVals;
} catch (e) {
console.warn("[Rater] Could not parse allowed values in description:\n " + paraData.description.en + "\n Check TemplateData for parameter |" + paraName + "= in " + self.getTitle().getPrefixedText());
}
}
});
// Make suggestions for combobox
var allParamsArray = !self.notemplatedata && result.pages[id].paramOrder || $.map(self.paramData, function (_val, key) {
return key;
});
self.parameterSuggestions = allParamsArray.filter(function (paramName) {
return paramName && paramName !== "class" && paramName !== "importance";
}).map(function (paramName) {
var optionObject = {
data: paramName
};
var label = self.getDataForParam(label, paramName);
if (label) {
optionObject.label = label + " (|" + paramName + "=)";
}
return optionObject;
});
if (self.templatedataApiError) {
// Don't save defaults/guesses to cache;
return true;
}
cache.write(prefixedText + "-params", {
notemplatedata: self.notemplatedata,
paramData: self.paramData,
parameterSuggestions: self.parameterSuggestions,
paramAliases: self.paramAliases
}, 1);
return true;
}).then(paramDataSet.resolve, paramDataSet.reject);
return paramDataSet;
};
var makeListAs = function makeListAs(subjectTitle) {
var name = subjectTitle.getMainText().replace(/\s\(.*\)/, "");
if (name.indexOf(" ") === -1) {
return name;
}
var generationalSuffix = "";
if (/ (?:[JS]r.?|[IVX]+)$/.test(name)) {
generationalSuffix = name.slice(name.lastIndexOf(" "));
name = name.slice(0, name.lastIndexOf(" "));
if (name.indexOf(" ") === -1) {
return name + generationalSuffix;
}
}
var lastName = name.slice(name.lastIndexOf(" ") + 1).replace(/,$/, "");
var otherNames = name.slice(0, name.lastIndexOf(" "));
return lastName + ", " + otherNames + generationalSuffix;
};
Template.prototype.addMissingParams = function () {
var thisTemplate = this;
// Autofill listas parameter for WP:BIO
var isBiographyBanner = this.getTitle().getMainText() === "WikiProject Biography" || this.redirectTarget && this.redirectTarget.getMainText() === "WikiProject Biography";
if (isBiographyBanner && !this.getParam("listas")) {
var subjectTitle = mw.Title.newFromText(_config["default"].mw.wgPageName).getSubjectPage();
this.parameters.push({
name: "listas",
value: makeListAs(subjectTitle),
autofilled: true
});
}
// Make sure required/suggested parameters are present
$.each(thisTemplate.paramData, function (paraName, paraData) {
if ((paraData.required || paraData.suggested) && !thisTemplate.getParam(paraName)) {
// Check if already present in an alias, if any
if (paraData.aliases.length) {
var aliases = thisTemplate.parameters.filter(function (p) {
var isAlias = paraData.aliases.includes(p.name);
var isEmpty = !p.value;
return isAlias && !isEmpty;
});
if (aliases.length) {
// At least one non-empty alias, so do nothing
return;
}
}
// No non-empty aliases, so add this to the parameters list (with
// value set parameter to either the autovaule, or as null).
// Also set that it was autofilled.
thisTemplate.parameters.push({
name: paraName,
value: paraData.autovalue || null,
autofilled: true
});
}
});
return thisTemplate;
};
Template.prototype.setClassesAndImportances = function () {
var _this = this;
var parsed = $.Deferred();
// Don't re-parse if already parsed; no need to parse shell templates or banners without ratings
if (this.isShellTemplate()) {
this.classes = _toConsumableArray(_config["default"].bannerDefaults.classes);
return parsed.resolve();
} else if (this.classes && this.importances || this.withoutRatings) {
return parsed.resolve();
}
var mainText = this.getTitle().getMainText();
// Some projects have hardcoded values, to avoid standard classes or to prevent API issues (timeout and/or node count exceeded)
var redirectTargetOrMainText = this.redirectTarget ? this.redirectTarget.getMainText() : mainText;
if (_config["default"].customBanners[redirectTargetOrMainText]) {
this.classes = _config["default"].customBanners[redirectTargetOrMainText].classes;
this.importances = _config["default"].customBanners[redirectTargetOrMainText].importances;
return parsed.resolve();
}
// Otherwise try reading from cached data
var cachedRatings = cache.read(mainText + "-ratings");
if (cachedRatings && cachedRatings.value && cachedRatings.staleDate && cachedRatings.value.classes != null && cachedRatings.value.importances != null) {
this.classes = cachedRatings.value.classes;
this.importances = cachedRatings.value.importances;
parsed.resolve();
if (!(0, _util.isAfterDate)(cachedRatings.staleDate)) {
// Just use the cached data
return parsed;
} // else: Use the cache data for now, but also fetch new data from API
}
var wikitextToParse = "";
_config["default"].bannerDefaults.extendedClasses.forEach(function (classname, index) {
wikitextToParse += "{{" + mainText + "|class=" + classname + "|importance=" + (_config["default"].bannerDefaults.extendedImportances[index] || "") + "}}/n";
});
return _api["default"].get({
action: "parse",
title: "Talk:Sandbox",
text: wikitextToParse,
prop: "categorieshtml"
}).then(function (result) {
var catsHtml = result.parse.categorieshtml["*"];
var extendedClasses = _config["default"].bannerDefaults.extendedClasses.filter(function (cl) {
return catsHtml.indexOf(cl + "-Class") !== -1;
});
_this.classes = [].concat(_toConsumableArray(_config["default"].bannerDefaults.classes), _toConsumableArray(extendedClasses));
_this.importances = _config["default"].bannerDefaults.extendedImportances.filter(function (imp) {
return catsHtml.indexOf(imp + "-importance") !== -1;
});
cache.write(mainText + "-ratings", {
classes: _this.classes,
importances: _this.importances
}, 1);
return true;
});
};
// </nowiki>
},{"./api":15,"./cache":17,"./config":18,"./util":23}],4:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _config = _interopRequireDefault(require("../../config"));
var _BannerWidget = _interopRequireDefault(require("./BannerWidget"));
var _util = require("../../util");
var _ParameterWidget = _interopRequireDefault(require("./ParameterWidget"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
// <nowiki>
var BannerListWidget = function BannerListWidget(config) {
config = config || {};
// Call parent constructor
BannerListWidget.parent.call(this, config);
OO.ui.mixin.GroupElement.call(this, {
$group: this.$element
});
this.$element.addClass("rater-bannerListWidget").css({
"padding": "20px 10px 16px 10px"
});
// Prefs
this.preferences = config.preferences;
this.oresClass = config.oresClass;
this.changed = false;
// Events
this.aggregate({
"remove": "bannerRemove"
});
this.connect(this, {
"bannerRemove": "onBannerRemove"
});
this.aggregate({
"changed": "bannerChanged"
});
this.connect(this, {
"bannerChanged": "setChanged"
});
this.aggregate({
"biographyBannerChange": "biographyBannerChanged"
});
this.connect(this, {
"biographyBannerChanged": "syncShellTemplateWithBiographyBanner"
});
this.aggregate({
"updatedSize": "bannerUpdatedSize"
});
this.connect(this, {
"bannerUpdatedSize": "onUpdatedSize"
});
};
OO.inheritClass(BannerListWidget, OO.ui.Widget);
OO.mixinClass(BannerListWidget, OO.ui.mixin.GroupElement);
/*
methods from mixin:
- addItems( items, [index] ) : OO.ui.Element (CHAINABLE)
- clearItems( ) : OO.ui.Element (CHAINABLE)
- findItemFromData( data ) : OO.ui.Element|null
- findItemsFromData( data ) : OO.ui.Element[]
- removeItems( items ) : OO.ui.Element (CHAINABLE)
*/
BannerListWidget.prototype.onUpdatedSize = function () {
// Emit an "updatedSize" event so the parent window can update size, if needed
this.emit("updatedSize");
};
BannerListWidget.prototype.setChanged = function () {
this.changed = true;
};
BannerListWidget.prototype.onBannerRemove = function (banner) {
this.removeItems([banner]);
this.setChanged();
};
BannerListWidget.prototype.syncShellTemplateWithBiographyBanner = function (biographyBanner) {
biographyBanner = biographyBanner || this.items.find(function (banner) {
return banner.mainText === "WikiProject Biography" || banner.redirectTargetMainText === "WikiProject Biography";
});
if (!biographyBanner) return;
var bannerShellTemplate = this.items.find(function (banner) {
return banner.mainText === _config["default"].shellTemplates[0] || banner.redirectTargetMainText === _config["default"].shellTemplates[0];
});
if (!bannerShellTemplate) {
return;
}
var paramsToSync = ["living", "blpo", "activepol"];
paramsToSync.forEach(function (paramToSync) {
var _map = [biographyBanner, bannerShellTemplate].map(function (banner) {
return banner.parameterList.getParameterItems().find(function (parameter) {
return parameter.name === paramToSync || banner.paramAliases[parameter.name] === paramToSync;
});
}),
_map2 = _slicedToArray(_map, 2),
biographyParam = _map2[0],
shellParam = _map2[1];
if (!biographyParam) return;
var normalisedParamValue = (0, _util.normaliseYesNo)(biographyParam.value);
biographyParam["delete"]();
if (!shellParam) {
var index = bannerShellTemplate.addParameterLayout.isVisible() ? -1 // Insert at the very end
: bannerShellTemplate.parameterList.items.length - 1; // Insert prior to the "add parameter" button
bannerShellTemplate.parameterList.addItems([new _ParameterWidget["default"]({
"name": paramToSync,
"value": normalisedParamValue,
"autofilled": true
}, bannerShellTemplate.paramData && bannerShellTemplate.paramData[paramToSync])], index);
} else if (!biographyParam.autofilled) {
shellParam.setValue(normalisedParamValue);
shellParam.setAutofilled();
}
});
};
BannerListWidget.prototype.addShellTemplateIfNeeeded = function () {
var _this = this;
if (!this.items.some(function (banner) {
return banner.isShellTemplate;
})) {
_BannerWidget["default"].newFromTemplateName(_config["default"].shellTemplates[0], {
withoutRatings: true
}, {
preferences: this.preferences,
isArticle: this.pageInfo.isArticle
}).then(function (shellBannerWidget) {
OO.ui.mixin.GroupElement.prototype.addItems.call(_this, [shellBannerWidget], 0);
// Autofill ratings (if able to)
_this.autofillClassRatings({
forBannerShell: true
});
// emit updatedSize event
_this.onUpdatedSize();
});
}
return this;
};
BannerListWidget.prototype.addItems = function (items, index) {
if (items.length === 0) {
return this;
}
// Call mixin method to do the adding
OO.ui.mixin.GroupElement.prototype.addItems.call(this, items, index);
// Autofill ratings (if able to, and if enabled in preferences)
if (!this.items.some(function (banner) {
return banner.isShellTemplate;
})) {
this.autofillClassRatings();
}
this.autofillImportanceRatings();
// emit updatedSize event
this.onUpdatedSize();
return this;
};
BannerListWidget.prototype.autofillClassRatings = function (config) {
config = config || {};
// Only autofill if set in preferences
if (!this.preferences.autofillClassFromOthers && !this.preferences.autofillClassFromOres && !config.forBannerShell) {
return;
}
// Check what banners already have
var uniqueClassRatings = (0, _util.uniqueArray)((0, _util.filterAndMap)(this.items, function (banner) {
if (banner.isShellTemplate || !banner.hasClassRatings) {
return false;
}
var classItem = banner.classDropdown.getMenu().findSelectedItem();
return classItem && classItem.getData();
}, function (banner) {
return banner.classDropdown.getMenu().findSelectedItem().getData();
}));
// Can't autofill if there isn't either a single value, or no value
if (uniqueClassRatings.length > 1) {
return;
}
// Determine what to autofill with
var autoClass;
if (uniqueClassRatings.length === 1 && (this.preferences.autofillClassFromOthers || config.forBannerShell)) {
autoClass = uniqueClassRatings[0];
} else if (uniqueClassRatings.length === 0 && this.preferences.autofillClassFromOres && this.oresClass) {
// Don't autofill above C-class
switch (this.oresClass) {
case "Stub":
case "Start":
case "C":
case "List":
autoClass = this.oresClass;
}
} else {
// nothing to do
return;
}
// Do the autofilling
this.items.forEach(function (banner) {
if (!banner.hasClassRatings && !banner.isShellTemplate) {
return;
}
var classItem = banner.classDropdown.getMenu().findSelectedItem();
if (classItem && classItem.getData() && !config.forBannerShell) {
return;
}
if (config.forBannerShell && !banner.isShellTemplate && classItem.getData() === autoClass) {
banner.classDropdown.getMenu().selectItemByData(null);
return;
}
banner.classDropdown.getMenu().selectItemByData(autoClass);
banner.classDropdown.setAutofilled(true);
});
};
BannerListWidget.prototype.autofillImportanceRatings = function () {
if (!this.preferences.autofillImportance) {
return;
}
var isRegularArticle = this.pageInfo && this.pageInfo.isArticle && !this.pageInfo.redirect && !this.pageInfo.isDisambig;
if (!isRegularArticle) {
return;
}
// TODO: Should try to find a smarter, banner-specific way of determining importance.
// Maybe do something with ORES's "drafttopic" model.
var autoImportance = "Low";
this.items.forEach(function (banner) {
if (!banner.hasImportanceRatings) {
return;
}
var importanceItem = banner.importanceDropdown.getMenu().findSelectedItem();
if (importanceItem && importanceItem.getData()) {
return;
}
banner.importanceDropdown.getMenu().selectItemByData(autoImportance);
banner.importanceDropdown.setAutofilled(true);
});
};
BannerListWidget.prototype.setPreferences = function (prefs) {
this.preferences = prefs;
this.items.forEach(function (banner) {
return banner.setPreferences(prefs);
});
this.autofillClassRatings();
this.autofillImportanceRatings();
};
BannerListWidget.prototype.makeWikitext = function () {
var bannersWikitext = (0, _util.filterAndMap)(this.items, function (banner) {
return !banner.isShellTemplate;
}, function (banner) {
return banner.makeWikitext();
}).join("\n");
var shellTemplate = this.items.find(function (banner) {
return banner.isShellTemplate;
});
if (!shellTemplate) {
return bannersWikitext;
}
var shellParam1 = new _ParameterWidget["default"]({
name: "1",
value: "\n" + bannersWikitext + "\n" + (shellTemplate.nonStandardTemplates ? shellTemplate.nonStandardTemplates + "\n" : "")
});
shellTemplate.parameterList.addItems([shellParam1]);
var shellWikitext = shellTemplate.makeWikitext();
shellTemplate.parameterList.removeItems([shellParam1]);
return shellWikitext;
};
var _default = BannerListWidget; // </nowiki>
exports["default"] = _default;
},{"../../config":18,"../../util":23,"./BannerWidget":5,"./ParameterWidget":9}],5:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _ParameterListWidget = _interopRequireDefault(require("./ParameterListWidget"));
var _ParameterWidget = _interopRequireDefault(require("./ParameterWidget"));
var _DropdownParameterWidget = _interopRequireDefault(require("./DropdownParameterWidget"));
var _SuggestionLookupTextInputWidget = _interopRequireDefault(require("./SuggestionLookupTextInputWidget"));
var _util = require("../../util");
var _Template = require("../../Template");
var _HorizontalLayoutWidget = _interopRequireDefault(require("./HorizontalLayoutWidget"));
var _config = _interopRequireDefault(require("../../config"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
// <nowiki>
function BannerWidget(template, config) {
var _this = this;
// Configuration initialization
config = config || {};
// Call parent constructor
BannerWidget["super"].call(this, config);
this.$overlay = config.$overlay;
/* --- PREFS --- */
this.preferences = config.preferences;
/* --- PROPS --- */
this.paramData = template.paramData;
this.paramAliases = template.paramAliases || {};
this.parameterSuggestions = template.parameterSuggestions;
this.name = template.name;
this.wikitext = template.wikitext;
this.pipeStyle = template.pipeStyle;
this.equalsStyle = template.equalsStyle;
this.endBracesStyle = template.endBracesStyle;
this.mainText = template.getTitle().getMainText();
this.redirectTargetMainText = template.redirectTarget && template.redirectTarget.getMainText();
this.isShellTemplate = template.isShellTemplate();
this.changed = template.parameters.some(function (parameter) {
return parameter.autofilled;
}); // initially false, unless some parameters were autofilled
this.hasClassRatings = template.classes && template.classes.length;
this.hasImportanceRatings = template.importances && template.importances.length;
this.inactiveProject = template.inactiveProject;
/* --- TITLE AND RATINGS --- */
this.removeButton = new OO.ui.ButtonWidget({
icon: "trash",
label: "Remove banner",
title: "Remove banner",
flags: "destructive",
$element: $("<div style=\"width:100%\">")
});
this.clearButton = new OO.ui.ButtonWidget({
icon: "cancel",
label: "Clear parameters",
title: "Clear parameters",
flags: "destructive",
$element: $("<div style=\"width:100%\">")
});
this.removeButton.$element.find("a").css("width", "100%");
this.clearButton.$element.find("a").css("width", "100%");
this.titleButtonsGroup = new OO.ui.ButtonGroupWidget({
items: [this.removeButton, this.clearButton],
$element: $("<span style='width:100%;'>")
});
this.mainLabelPopupButton = new OO.ui.PopupButtonWidget({
label: "{{".concat(template.getTitle().getMainText(), "}}").concat(this.inactiveProject ? " (inactive)" : ""),
$element: $("<span style='display:inline-block;width:48%;margin-right:0;padding-right:8px'>"),
$overlay: this.$overlay,
indicator: "down",
framed: false,
popup: {
$content: this.titleButtonsGroup.$element,
width: 200,
padded: false,
align: "force-right",
anchor: false
}
});
this.mainLabelPopupButton.$element.children("a").first().css({
"font-size": "110%"
}).find("span.oo-ui-labelElement-label").css({
"white-space": "normal"
});
// Rating dropdowns
if (this.isShellTemplate) {
this.classDropdown = new _DropdownParameterWidget["default"]({
label: new OO.ui.HtmlSnippet("<span style=\"color:#777\">Class</span>"),
menu: {
items: [new OO.ui.MenuOptionWidget({
data: null,
label: new OO.ui.HtmlSnippet("<span style=\"color:#777\">(".concat(config.isArticle ? "no class" : "auto-detect", ")</span>"))
})].concat(_toConsumableArray(_config["default"].bannerDefaults.classes.map(function (classname) {
return new OO.ui.MenuOptionWidget({
data: classname,
label: classname
});
})))
},
$overlay: this.$overlay
});
var shellClassParam = template.parameters.find(function (parameter) {
return parameter.name === "class";
});
this.classDropdown.getMenu().selectItemByData(shellClassParam && (0, _util.classMask)(shellClassParam.value));
} else if (this.hasClassRatings) {
this.classDropdown = new _DropdownParameterWidget["default"]({
label: new OO.ui.HtmlSnippet("<span style=\"color:#777\">Class</span>"),
menu: {
items: [new OO.ui.MenuOptionWidget({
data: null,
label: new OO.ui.HtmlSnippet("<span style=\"color:#777\">(".concat(config.isArticle ? "inherit from shell" : "auto-detect", ")</span>"))
})].concat(_toConsumableArray(template.classes.map(function (classname) {
return new OO.ui.MenuOptionWidget({
data: classname,
label: classname
});
})))
},
$overlay: this.$overlay
});
var classParam = template.parameters.find(function (parameter) {
return parameter.name === "class";
});
this.classDropdown.getMenu().selectItemByData(classParam && (0, _util.classMask)(classParam.value));
}
if (this.hasImportanceRatings) {
this.importanceDropdown = new _DropdownParameterWidget["default"]({
label: new OO.ui.HtmlSnippet("<span style=\"color:#777\">Importance</span>"),
menu: {
items: [new OO.ui.MenuOptionWidget({
data: null,
label: new OO.ui.HtmlSnippet("<span style=\"color:#777\">(".concat(config.isArticle ? "no importance" : "auto-detect", ")</span>"))
})].concat(_toConsumableArray(template.importances.map(function (importance) {
return new OO.ui.MenuOptionWidget({
data: importance,
label: importance
});
})))
},
$overlay: this.$overlay
});
var importanceParam = template.parameters.find(function (parameter) {
return parameter.name === "importance";
});
this.importanceDropdown.getMenu().selectItemByData(importanceParam && (0, _util.importanceMask)(importanceParam.value));
}
this.titleLayout = new OO.ui.HorizontalLayout({
items: [this.mainLabelPopupButton]
});
if (this.hasClassRatings || this.isShellTemplate) {
this.titleLayout.addItems([this.classDropdown]);
}
if (this.hasImportanceRatings) {
this.titleLayout.addItems([this.importanceDropdown]);
}
/* --- PARAMETERS LIST --- */
var parameterWidgets = (0, _util.filterAndMap)(template.parameters, function (param) {
if (_this.isShellTemplate) {
if (param.name == "1") {
_this.shellParam1Value = param.value;
return false;
}
return param.name !== "class";
}
return param.name !== "class" && param.name !== "importance";
}, function (param) {
return new _ParameterWidget["default"](param, template.paramData[param.name], {
$overlay: _this.$overlay
});
});
this.parameterList = new _ParameterListWidget["default"]({
items: parameterWidgets,
preferences: this.preferences
});
/* --- ADD PARAMETER SECTION --- */
this.addParameterNameInput = new _SuggestionLookupTextInputWidget["default"]({
suggestions: template.parameterSuggestions,
placeholder: "parameter name",
$element: $("<div style='display:inline-block;width:40%'>"),
validate: function (val) {
var _this$getAddParameter = this.getAddParametersInfo(val),
validName = _this$getAddParameter.validName,
name = _this$getAddParameter.name,
value = _this$getAddParameter.value;
return !name && !value ? true : validName;
}.bind(this),
allowSuggestionsWhenEmpty: true,
$overlay: this.$overlay
});
this.updateAddParameterNameSuggestions();
this.addParameterValueInput = new _SuggestionLookupTextInputWidget["default"]({
placeholder: "parameter value",
$element: $("<div style='display:inline-block;width:40%'>"),
validate: function (val) {
var _this$getAddParameter2 = this.getAddParametersInfo(null, val),
validValue = _this$getAddParameter2.validValue,
name = _this$getAddParameter2.name,
value = _this$getAddParameter2.value;
return !name && !value ? true : validValue;
}.bind(this),
allowSuggestionsWhenEmpty: true,
$overlay: this.$overlay
});
this.addParameterButton = new OO.ui.ButtonWidget({
label: "Add",
icon: "add",
flags: "progressive"
}).setDisabled(true);
this.addParameterControls = new _HorizontalLayoutWidget["default"]({
items: [this.addParameterNameInput, new OO.ui.LabelWidget({
label: "="
}), this.addParameterValueInput, this.addParameterButton]
});
this.addParameterLayout = new OO.ui.FieldLayout(this.addParameterControls, {
label: "Add parameter:",
align: "top"
}).toggle(false);
// A hack to make messages appear on their own line
this.addParameterLayout.$element.find(".oo-ui-fieldLayout-messages").css({
"clear": "both",
"padding-top": 0
});
/* --- OVERALL LAYOUT/DISPLAY --- */
// Display the layout elements, and a rule
this.$element.addClass("rater-bannerWidget").append(this.titleLayout.$element, this.parameterList.$element, this.addParameterLayout.$element);
if (!this.isShellTemplate) {
this.$element.append($("<hr>"));
}
if (this.isShellTemplate) {
this.$element.css({
"background": "#eee",
"border-radius": "10px",
"padding": "0 10px 5px",
"margin-bottom": "12px",
"font-size": "92%"
});
}
/* --- EVENT HANDLING --- */
if (this.hasClassRatings) {
this.classDropdown.connect(this, {
"change": "onClassChange"
});
}
if (this.hasImportanceRatings) {
this.importanceDropdown.connect(this, {
"change": "onImportanceChange"
});
}
this.parameterList.connect(this, {
"change": "onParameterChange",
"addParametersButtonClick": "showAddParameterInputs",
"updatedSize": "onUpdatedSize"
});
this.addParameterButton.connect(this, {
"click": "onParameterAdd"
});
this.addParameterNameInput.connect(this, {
"change": "onAddParameterNameChange",
"enter": "onAddParameterNameEnter",
"choose": "onAddParameterNameEnter"
});
this.addParameterValueInput.connect(this, {
"change": "onAddParameterValueChange",
"enter": "onAddParameterValueEnter",
"choose": "onAddParameterValueEnter"
});
this.removeButton.connect(this, {
"click": "onRemoveButtonClick"
});
this.clearButton.connect(this, {
"click": "onClearButtonClick"
});
/* --- APPLY PREF -- */
if (this.preferences.bypassRedirects) {
this.bypassRedirect();
}
}
OO.inheritClass(BannerWidget, OO.ui.Widget);
/**
* @param {String} templateName
* @param {Object} [data]
* @param {Boolean} data.withoutRatings
* @param {Boolean} data.isWrapper
* @param {Object} config
* @returns {Promise<BannerWidget>}
*/
BannerWidget.newFromTemplateName = function (templateName, data, config) {
var template = new _Template.Template();
template.name = templateName;
if (data && data.withoutRatings) {
template.withoutRatings = true;
}
return (0, _Template.getWithRedirectTo)(template).then(function (template) {
return $.when(template.setClassesAndImportances(), template.setParamDataAndSuggestions()).then(function () {
// Add missing required/suggested values
template.addMissingParams();
// Return the now-modified template
return template;
});
}).then(function (template) {
return new BannerWidget(template, config);
});
};
BannerWidget.prototype.onUpdatedSize = function () {
// Emit an "updatedSize" event so the parent window can update size, if needed
this.emit("updatedSize");
};
BannerWidget.prototype.setChanged = function () {
this.changed = true;
this.emit("changed");
};
BannerWidget.prototype.onParameterChange = function () {
this.setChanged();
if (this.mainText === "WikiProject Biography" || this.redirectTargetMainText === "WikiProject Biography") {
// Emit event so BannerListWidget can update the banner shell template (if present)
this.emit("biographyBannerChange");
}
this.updateAddParameterNameSuggestions();
};
BannerWidget.prototype.onClassChange = function () {
this.setChanged();
this.classChanged = true;
var classItem = this.classDropdown.getMenu().findSelectedItem();
if (classItem && classItem.getData() == null) {
// clear selection
this.classDropdown.getMenu().selectItem();
}
};
BannerWidget.prototype.onImportanceChange = function () {
this.setChanged();
this.importanceChanged = true;
var importanceItem = this.importanceDropdown.getMenu().findSelectedItem();
if (importanceItem && importanceItem.getData() == null) {
// clear selection
this.importanceDropdown.getMenu().selectItem();
}
};
BannerWidget.prototype.showAddParameterInputs = function () {
this.addParameterLayout.toggle(true);
this.addParameterNameInput.focus();
this.onUpdatedSize();
};
BannerWidget.prototype.getAddParametersInfo = function (nameInputVal, valueInputVal) {
var name = nameInputVal && nameInputVal.trim() || this.addParameterNameInput.getValue().trim();
var paramAlreadyIncluded = name === "class" || name === "importance" || name === "1" && this.isShellTemplate || this.parameterList.getParameterItems().some(function (paramWidget) {
return paramWidget.name === name;
});
var value = valueInputVal && valueInputVal.trim() || this.addParameterValueInput.getValue().trim();
var autovalue = name && this.paramData[name] && this.paramData[name].autovalue || null;
return {
validName: !!(name && !paramAlreadyIncluded),
validValue: !!(value || autovalue),
isAutovalue: !!(!value && autovalue),
isAlreadyIncluded: !!(name && paramAlreadyIncluded),
name: name,
value: value,
autovalue: autovalue
};
};
BannerWidget.prototype.onAddParameterNameChange = function () {
var _this$getAddParameter3 = this.getAddParametersInfo(),
validName = _this$getAddParameter3.validName,
validValue = _this$getAddParameter3.validValue,
isAutovalue = _this$getAddParameter3.isAutovalue,
isAlreadyIncluded = _this$getAddParameter3.isAlreadyIncluded,
name = _this$getAddParameter3.name,
autovalue = _this$getAddParameter3.autovalue; // Set value input placeholder as the autovalue
this.addParameterValueInput.$input.attr("placeholder", autovalue || "");
// Set suggestions, if the parameter has a list of allowed values
var allowedValues = this.paramData[name] && this.paramData[name].allowedValues && this.paramData[name].allowedValues.map(function (val) {
return {
data: val,
label: val
};
});
this.addParameterValueInput.setSuggestions(allowedValues || []);
// Set button disabled state based on validity
this.addParameterButton.setDisabled(!validName || !validValue);
// Show notice if autovalue will be used
this.addParameterLayout.setNotices(validName && isAutovalue ? ["Parameter value will be autofilled"] : []);
// Show error is the banner already has the parameter set
this.addParameterLayout.setErrors(isAlreadyIncluded ? ["Parameter is already present"] : []);
};
BannerWidget.prototype.onAddParameterNameEnter = function () {
this.addParameterValueInput.focus();
};
BannerWidget.prototype.onAddParameterValueChange = function () {
var _this$getAddParameter4 = this.getAddParametersInfo(),
validName = _this$getAddParameter4.validName,
validValue = _this$getAddParameter4.validValue,
isAutovalue = _this$getAddParameter4.isAutovalue;
this.addParameterButton.setDisabled(!validName || !validValue);
this.addParameterLayout.setNotices(validName && isAutovalue ? ["Parameter value will be autofilled"] : []);
};
BannerWidget.prototype.onAddParameterValueEnter = function () {
// Make sure button state has been updated
this.onAddParameterValueChange();
// Do nothing if button is disabled (i.e. name and/or value are invalid)
if (this.addParameterButton.isDisabled()) {
return;
}
// Add parameter
this.onParameterAdd();
};
BannerWidget.prototype.onParameterAdd = function () {
var _this$getAddParameter5 = this.getAddParametersInfo(),
validName = _this$getAddParameter5.validName,
validValue = _this$getAddParameter5.validValue,
name = _this$getAddParameter5.name,
value = _this$getAddParameter5.value,
autovalue = _this$getAddParameter5.autovalue;
if (!validName || !validValue) {
// Error should already be shown via onAddParameter...Change methods
return;
}
var newParameter = new _ParameterWidget["default"]({
"name": name,
"value": value || autovalue
}, this.paramData[name], {
$overlay: this.$overlay
});
this.parameterList.addItems([newParameter]);
this.addParameterNameInput.setValue("");
this.addParameterValueInput.setValue("");
this.addParameterNameInput.$input.focus();
};
BannerWidget.prototype.updateAddParameterNameSuggestions = function () {
var paramsInUse = {};
this.parameterList.getParameterItems().forEach(function (paramWidget) {
return paramsInUse[paramWidget.name] = true;
});
this.addParameterNameInput.setSuggestions(this.parameterSuggestions.filter(function (suggestion) {
return !paramsInUse[suggestion.data];
}));
};
BannerWidget.prototype.onRemoveButtonClick = function () {
this.emit("remove");
};
BannerWidget.prototype.onClearButtonClick = function () {
this.parameterList.clearItems(this.parameterList.getParameterItems());
if (this.hasClassRatings) {
this.classDropdown.getMenu().selectItem();
}
if (this.hasImportanceRatings) {
this.importanceDropdown.getMenu().selectItem();
}
};
BannerWidget.prototype.bypassRedirect = function () {
if (!this.redirectTargetMainText) {
return;
}
// Store the bypassed name
this.bypassedName = this.name;
// Update title label
this.mainLabelPopupButton.setLabel("{{".concat(this.redirectTargetMainText, "}}").concat(this.inactiveProject ? " (inactive)" : ""));
// Update properties
this.name = this.redirectTargetMainText;
this.mainText = this.redirectTargetMainText;
this.redirectTargetMainText = null;
this.setChanged();
};
BannerWidget.prototype.makeWikitext = function () {
if (!this.changed && this.wikitext) {
return this.wikitext;
}
var pipe = this.pipeStyle;
var equals = this.equalsStyle;
var classItem = (this.hasClassRatings || this.isShellTemplate) && this.classDropdown.getMenu().findSelectedItem();
var classVal = classItem && classItem.getData();
var importanceItem = this.hasImportanceRatings && this.importanceDropdown.getMenu().findSelectedItem();
var importanceVal = importanceItem && importanceItem.getData();
return ("{{" + this.name + ((this.hasClassRatings || this.isShellTemplate) && classVal != null ? "".concat(pipe, "class").concat(equals).concat(classVal || "") : "") + (this.hasImportanceRatings && importanceVal != null ? "".concat(pipe, "importance").concat(equals).concat(importanceVal || "") : "") + this.parameterList.getParameterItems().map(function (parameter) {
return parameter.makeWikitext(pipe, equals);
}).join("") + this.endBracesStyle).replace(/\n+}}$/, "\n}}"); // avoid empty line at end like [[Special:Diff/925982142]]
};
BannerWidget.prototype.setPreferences = function (prefs) {
this.preferences = prefs;
if (this.preferences.bypassRedirects) {
this.bypassRedirect();
}
this.parameterList.setPreferences(prefs);
};
var _default = BannerWidget; // </nowiki>
exports["default"] = _default;
},{"../../Template":3,"../../config":18,"../../util":23,"./DropdownParameterWidget":6,"./HorizontalLayoutWidget":7,"./ParameterListWidget":8,"./ParameterWidget":9,"./SuggestionLookupTextInputWidget":11}],6:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
// <nowiki>
function DropdownParameterWidget(config) {
// Configuration initialization
config = $.extend({
$element: $("<span style='display:inline-block;width:24%'>")
}, config || {});
// Call parent constructor
DropdownParameterWidget["super"].call(this, config);
this.$overlay = config.$overlay;
this.$element.addClass("rater-dropdownParameterWidget");
// Autofilled icon
this.autofilled = !!config.autofilled;
this.autofilledIcon = new OO.ui.IconWidget({
icon: "robot",
title: "Autofilled by Rater",
flags: "progressive",
$element: $("<span style='margin: 0 -5px 0 5px;min-width: 16px;width: 16px;left:unset;'>")
}).toggle(this.autofilled);
this.$element.find(".oo-ui-indicatorElement-indicator").before(this.autofilledIcon.$element);
// Events
this.menu.connect(this, {
"choose": "onDropdownMenuChoose",
"select": "onDropdownMenuSelect"
});
}
OO.inheritClass(DropdownParameterWidget, OO.ui.DropdownWidget);
DropdownParameterWidget.prototype.setAutofilled = function (setAutofill) {
this.autofilledIcon.toggle(!!setAutofill);
this.$element.find(".oo-ui-dropdownWidget-handle").css({
"border": setAutofill ? "1px dashed #36c" : ""
});
this.autofilled = !!setAutofill;
};
DropdownParameterWidget.prototype.onDropdownMenuChoose = function () {
this.setAutofilled(false);
this.emit("change");
};
DropdownParameterWidget.prototype.onDropdownMenuSelect = function () {
this.emit("change");
};
DropdownParameterWidget.prototype.getValue = function () {
var selectedItem = this.menu.findSelectedItem();
return selectedItem && selectedItem.getData();
};
var _default = DropdownParameterWidget; // </nowiki>
exports["default"] = _default;
},{}],7:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
// <nowiki>
/**
* A HorizontalLayout that is also a widget, and can thus be placed within
* field layouts.
*
* @class
* @param {*} config configuration for OO.ui.HorizontalLayout
*/
function HorizontalLayoutWidget(config) {
// Configuration initialization
config = config || {};
// Call parent constructor
HorizontalLayoutWidget["super"].call(this, {});
this.layout = new OO.ui.HorizontalLayout(_objectSpread({}, config, {
$element: this.$element
}));
}
OO.inheritClass(HorizontalLayoutWidget, OO.ui.Widget);
var _default = HorizontalLayoutWidget; // </nowiki>
exports["default"] = _default;
},{}],8:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
// <nowiki>
/**
* @cfg {OO.ui.Element[]} items Items to be added
* @cfg {Number} displayLimit The most to show at once. If the number of items
* is more than this, then only the first (displayLimit - 1) items are shown.
*/
var ParameterListWidget = function ParameterListWidget(config) {
config = config || {};
// Call parent constructor
ParameterListWidget.parent.call(this, config);
OO.ui.mixin.GroupElement.call(this, {
$group: this.$element
});
this.addItems(config.items);
this.$element.addClass("rater-parameterListWidget");
this.preferences = config.preferences;
// Hide some parameters (initially), if more than set display limit -- which is the
// one more than collapseParamsLowerLimit, to prevent only one param being hidden
// (mostly: may occasionally occur if params were auto-filled).
var displayLimit = this.preferences.collapseParamsLowerLimit + 1;
if (displayLimit && this.items.length > displayLimit) {
var hideFromNumber = displayLimit - 1; // One-indexed
var hideFromIndex = hideFromNumber - 1; // Zero-indexed
var hiddenCount = 0;
for (var i = hideFromIndex; i < this.items.length; i++) {
if (!this.items[i].autofilled) {
// Don't hide auto-filled params
this.items[i].toggle(false);
hiddenCount++;
}
}
if (hiddenCount > 0) {
// Add button to show the hidden params
this.showMoreParametersButton = new OO.ui.ButtonWidget({
label: "Show " + hiddenCount + " more " + (hiddenCount === 1 ? "parameter" : "parameters"),
framed: false,
$element: $("<span style='margin-bottom:0'>")
});
this.addItems([this.showMoreParametersButton]);
}
}
// Add the button that allows user to add more parameters
this.addParametersButton = new OO.ui.ButtonWidget({
label: "Add parameter",
icon: "add",
framed: false,
$element: $("<span style='margin-bottom:0'>")
});
this.addItems([this.addParametersButton]);
/* --- Events --- */
// Handle delete events from ParameterWidgets
this.aggregate({
"delete": "parameterDelete"
});
this.connect(this, {
parameterDelete: "onParameterDelete"
});
// Handle change events from ParameterWidgets
this.aggregate({
change: "parameterChange"
});
this.connect(this, {
parameterChange: "onParameterChange"
});
// Handle updatedSize events from ParameterWidgets
this.aggregate({
"updatedSize": "parameterUpdatedSize"
});
this.connect(this, {
"parameterUpdatedSize": "onUpdatedSize"
});
// Handle button clicks
if (this.showMoreParametersButton) {
this.showMoreParametersButton.connect(this, {
"click": "onShowMoreParametersButtonClick"
});
}
this.addParametersButton.connect(this, {
"click": "onAddParametersButtonClick"
});
};
OO.inheritClass(ParameterListWidget, OO.ui.Widget);
OO.mixinClass(ParameterListWidget, OO.ui.mixin.GroupElement);
/*
methods from mixin:
- addItems( items, [index] ) : OO.ui.Element (CHAINABLE)
- clearItems( ) : OO.ui.Element (CHAINABLE)
- findItemFromData( data ) : OO.ui.Element|null
- findItemsFromData( data ) : OO.ui.Element[]
- removeItems( items ) : OO.ui.Element (CHAINABLE)
*/
ParameterListWidget.prototype.onUpdatedSize = function () {
// Emit an "updatedSize" event so the parent window can update size, if needed
this.emit("updatedSize");
};
ParameterListWidget.prototype.addItems = function (items, index) {
if (items.length === 0) {
return this;
}
// Call mixin method to do the adding
OO.ui.mixin.GroupElement.prototype.addItems.call(this, items, index);
// emit updatedSize event
this.onUpdatedSize();
return this;
};
ParameterListWidget.prototype.onParameterDelete = function (parameter) {
this.removeItems([parameter]);
this.emit("change");
};
ParameterListWidget.prototype.onParameterChange = function () {
this.emit("change");
};
ParameterListWidget.prototype.getParameterItems = function () {
return this.items.filter(function (item) {
return item.constructor.name === "ParameterWidget";
});
};
ParameterListWidget.prototype.onShowMoreParametersButtonClick = function () {
this.removeItems([this.showMoreParametersButton]);
this.items.forEach(function (parameterWidget) {
return parameterWidget.toggle(true);
});
this.onUpdatedSize();
};
ParameterListWidget.prototype.onAddParametersButtonClick = function () {
this.removeItems([this.addParametersButton]);
this.emit("addParametersButtonClick");
};
ParameterListWidget.prototype.makeWikitext = function (pipeStyle, equalsStyle) {
return this.getParameterItems().map(function (parameter) {
return parameter.makeWikitext(pipeStyle, equalsStyle);
}).join("");
};
ParameterListWidget.prototype.setPreferences = function (prefs) {
this.preferences = prefs;
var params = this.getParameterItems();
// Unhide some parameters of the collapseParamsLowerLimit has increased.
// (Not hiding any if it decreased, since it's a *lower* limit of what needs to be shown.)
if (params.length <= this.preferences.collapseParamsLowerLimit) {
return;
}
var hiddenParams = params.filter(function (param) {
return !param.isVisible();
});
var visibleParamsCount = params.length - hiddenParams.length;
if (hiddenParams === 0 || visibleParamsCount >= this.preferences.collapseParamsLowerLimit) {
return;
}
var numToUnhide = Math.min(this.preferences.collapseParamsLowerLimit - visibleParamsCount, hiddenParams.length);
for (var i = 0; i < numToUnhide; i++) {
hiddenParams[i].toggle(true);
}
var stillHiddenCount = hiddenParams.length - numToUnhide;
if (stillHiddenCount === 0) {
this.removeItems([this.showMoreParametersButton]);
} else {
this.showMoreParametersButton.setLabel("Show " + stillHiddenCount + " more " + (stillHiddenCount === 1 ? "paramter" : "paramters"));
}
};
var _default = ParameterListWidget; // </nowiki>
exports["default"] = _default;
},{}],9:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _util = require("../../util");
var _HorizontalLayoutWidget = _interopRequireDefault(require("./HorizontalLayoutWidget"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
// <nowiki>
function ParameterWidget(parameter, paramData, config) {
// Configuration initialization
config = config || {};
// Call parent constructor
ParameterWidget["super"].call(this, config);
this.$overlay = config.$overlay;
this.name = parameter.name;
this.value = parameter.value;
this.autofilled = parameter.autofilled;
this.isInvalid = parameter.value == null;
this.paramData = paramData || {};
this.allowedValues = this.paramData.allowedValues || [];
this.isRequired = this.paramData.required;
this.isSuggested = this.paramData.suggested;
// Make a checkbox if only 1 or 2 allowed values
switch (this.allowedValues.length) {
/* eslint-disable no-fallthrough */
case 1:
this.allowedValues[1] = null;
/* fall-through */
case 2:
var isFirstAllowedVal = this.allowedValues.indexOf(parameter.value) === 0 || this.allowedValues.map(_util.normaliseYesNo).indexOf((0, _util.normaliseYesNo)(parameter.value)) === 0;
var isSecondAllowedVal = this.allowedValues.indexOf(parameter.value || null) === 1 || this.allowedValues.map(_util.normaliseYesNo).indexOf(parameter.value ? (0, _util.normaliseYesNo)(parameter.value) : null) === 1;
var isIndeterminate = !isFirstAllowedVal && !isSecondAllowedVal;
this.checkbox = new OO.ui.CheckboxInputWidget({
selected: isIndeterminate ? undefined : isFirstAllowedVal,
indeterminate: isIndeterminate ? true : undefined,
$element: $("<label style='margin:0 0 0 5px'>")
});
break;
default:
// No checkbox
} /* eslint-enable no-fallthrough */
/* --- EDIT PARAMETER LAYOUT --- */
this.input = new OO.ui.ComboBoxInputWidget({
value: this.value,
// label: parameter.name + " =",
// labelPosition: "before",
options: (0, _util.filterAndMap)(this.allowedValues, function (val) {
return val !== null;
}, function (val) {
return {
data: val,
label: val
};
}),
$element: $("<div style='margin-bottom:0;'>"),
$overlay: this.$overlay
});
// Reduce the excessive whitespace/height
this.input.$element.find("input").css({
"padding-top": 0,
"padding-bottom": "2px",
"height": "24px"
});
// Fix label positioning within the reduced height
this.input.$element.find("span.oo-ui-labelElement-label").css({
"line-height": "normal"
});
// Also reduce height of dropdown button (if options are present)
this.input.$element.find("a.oo-ui-buttonElement-button").css({
"padding-top": 0,
"height": "24px",
"min-height": "0"
});
this.confirmButton = new OO.ui.ButtonWidget({
icon: "check",
label: "Done",
framed: false,
flags: "progressive",
$element: $("<span style='margin-right:0'>")
});
this.cancelButton = new OO.ui.ButtonWidget({
icon: "undo",
label: "Cancel",
framed: false
});
this.deleteButton = new OO.ui.ButtonWidget({
icon: this.isRequired ? "restore" : "trash",
label: this.isRequired ? "Required parameter" : "Delete",
framed: false,
flags: "destructive",
disabled: this.isRequired
});
this.editButtonControls = new OO.ui.ButtonGroupWidget({
items: [this.confirmButton, this.cancelButton, this.deleteButton],
$element: $("<span style='font-size:92%'>")
});
this.editButtonControls.$element.find("a span:first-child").css({
"min-width": "unset",
"width": "16px",
"margin-right": 0
});
this.editLayoutControls = new _HorizontalLayoutWidget["default"]({
items: [this.input, this.editButtonControls]
//$element: $("<div style='width: 48%;margin:0;'>")
});
this.editLayout = new OO.ui.FieldLayout(this.editLayoutControls, {
label: this.name + " =",
align: "top",
help: this.paramData.description && this.paramData.description.en || false,
helpInline: true
}).toggle();
this.editLayout.$element.find("label.oo-ui-inline-help").css({
"margin": "-10px 0 5px 10px"
});
/* --- READ (COLLAPSED) DISPLAY OF PARAMETER --- */
this.invalidIcon = new OO.ui.IconWidget({
icon: "block",
title: "Invalid parameter: no value specified!",
flags: "destructive",
$element: $("<span style='margin: 0 5px 0 -5px; min-width: 16px; width: 16px;'>")
}).toggle(this.isInvalid);
this.fullLabel = new OO.ui.LabelWidget({
label: this.name + (this.value ? " = " + this.value : " "),
$element: $("<label style='margin: 0;'>")
});
this.autofilledIcon = new OO.ui.IconWidget({
icon: "robot",
title: "Autofilled by Rater",
flags: "progressive",
$element: $("<span style='margin: 0 -5px 0 5px;min-width: 16px;width: 16px;'>")
}).toggle(this.autofilled);
this.editButton = new OO.ui.ButtonWidget({
icon: "edit",
framed: false,
$element: $("<span style='margin-bottom: 0;'>")
});
this.editButton.$element.find("a").css({
"border-radius": "0 10px 10px 0",
"margin-left": "5px"
});
this.editButton.$element.find("a span").first().css({
"min-width": "unset",
"width": "16px"
});
this.readLayout = new OO.ui.HorizontalLayout({
items: [this.invalidIcon, this.fullLabel, this.autofilledIcon, this.editButton],
$element: $("<span style='margin:0;width:unset;'>")
});
if (this.checkbox) {
this.readLayout.addItems([this.checkbox], 2);
}
/* --- CONTAINER FOR BOTH LAYOUTS --- */
this.$element = $("<div>").addClass("rater-parameterWidget").css({
"width": "unset",
"display": "inline-block",
"border": this.autofilled ? "1px dashed #36c" : "1px solid #ddd",
"border-radius": "10px",
"padding-left": "10px",
"margin": "0 8px 8px 0",
"background": this.isInvalid ? "#fddd" : "#fffe"
}).append(this.readLayout.$element, this.editLayout.$element);
this.editButton.connect(this, {
"click": "onEditClick"
});
this.confirmButton.connect(this, {
"click": "onConfirmClick"
});
this.cancelButton.connect(this, {
"click": "onCancelClick"
});
this.deleteButton.connect(this, {
"click": "onDeleteClick"
});
if (this.checkbox) {
this.checkbox.connect(this, {
"change": "onCheckboxChange"
});
}
}
OO.inheritClass(ParameterWidget, OO.ui.Widget);
ParameterWidget.prototype.onUpdatedSize = function () {
// Emit an "updatedSize" event so the parent window can update size, if needed
this.emit("updatedSize");
};
ParameterWidget.prototype.onEditClick = function () {
this.readLayout.toggle(false);
this.editLayout.toggle(true);
this.$element.css({
"background": "#fffe"
});
this.input.focus();
this.onUpdatedSize();
};
ParameterWidget.prototype.onConfirmClick = function () {
this.setValue(this.input.getValue());
this.readLayout.toggle(true);
this.editLayout.toggle(false);
this.onUpdatedSize();
};
ParameterWidget.prototype.onCancelClick = function () {
this.input.setValue(this.value);
this.readLayout.toggle(true);
this.editLayout.toggle(false);
this.onUpdatedSize();
};
ParameterWidget.prototype.onDeleteClick = function () {
this["delete"]();
};
ParameterWidget.prototype.onCheckboxChange = function (isSelected, isIndeterminate) {
if (isIndeterminate) {
return;
}
if (isSelected) {
this.setValue(this.allowedValues[0]);
} else {
this.setValue(this.allowedValues[1]);
}
};
ParameterWidget.prototype["delete"] = function () {
this.emit("delete");
};
ParameterWidget.prototype.setValue = function (val) {
// Turn off autofill stylings/icon
this.autofilled = false;
this.autofilledIcon.toggle(false);
this.$element.css({
"border": "1px solid #ddd"
});
// Update the stored value
this.value = val;
// Update the input value for edit mode
this.input.setValue(this.value);
// Update validity
this.isInvalid = this.value == null;
this.invalidIcon.toggle(this.isInvalid);
this.$element.css({
"background": this.isInvalid ? "#fddd" : "#fffe"
});
// Updated the label for read mode
this.fullLabel.setLabel(this.name + (this.value ? " = " + this.value : ""));
// Update the checkbox (if there is one)
if (this.checkbox) {
var isFirstAllowedVal = this.allowedValues.indexOf(val) === 0 || this.allowedValues.map(_util.normaliseYesNo).indexOf((0, _util.normaliseYesNo)(val)) === 0;
var isSecondAllowedVal = this.allowedValues.indexOf(val || null) === 1 || this.allowedValues.map(_util.normaliseYesNo).indexOf(val ? (0, _util.normaliseYesNo)(val) : null) === 1;
var isIndeterminate = !isFirstAllowedVal && !isSecondAllowedVal;
this.checkbox.setIndeterminate(isIndeterminate, true);
if (!isIndeterminate) {
var isSelected = isFirstAllowedVal;
this.checkbox.setSelected(isSelected, true);
}
}
// Emit a change event
this.emit("change");
};
ParameterWidget.prototype.setAutofilled = function () {
this.autofilled = true;
this.autofilledIcon.toggle(true);
this.$element.css({
"border": "1px dashed #36c"
});
};
ParameterWidget.prototype.makeWikitext = function (pipeStyle, equalsStyle) {
if (this.isInvalid) {
return "";
}
return pipeStyle + this.name + equalsStyle + (this.value || "");
};
ParameterWidget.prototype.focusInput = function () {
return this.input.focus();
};
var _default = ParameterWidget; // </nowiki>
exports["default"] = _default;
},{"../../util":23,"./HorizontalLayoutWidget":7}],10:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _config = _interopRequireDefault(require("../../config"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
// <nowiki>
function PrefsFormWidget(config) {
// Configuration initialization
config = config || {};
// Call parent constructor
PrefsFormWidget["super"].call(this, config);
this.$element.addClass("rater-prefsFormWidget");
this.layout = new OO.ui.FieldsetLayout({
label: "Preferences",
$element: this.$element
});
this.preferences = {
"autostart": {
input: new OO.ui.ToggleSwitchWidget(),
label: "Autostart Rater"
},
"autostartRedirects": {
input: new OO.ui.ToggleSwitchWidget(),
label: "Autostart on redirects"
},
"autostartNamespaces": {
input: new mw.widgets.NamespacesMultiselectWidget(),
label: "Autostart in these namespaces"
},
"bypassRedirects": {
input: new OO.ui.ToggleSwitchWidget(),
label: "Bypass redirects to banners"
},
"autofillClassFromOthers": {
input: new OO.ui.ToggleSwitchWidget(),
label: "Autofill class from other banners"
},
"autofillClassFromOres": {
input: new OO.ui.ToggleSwitchWidget(),
label: "Autofill class based on ORES prediction"
},
"autofillImportance": {
input: new OO.ui.ToggleSwitchWidget(),
label: "Autofill low importance"
},
"collapseParamsLowerLimit": {
input: new OO.ui.NumberInputWidget({
"min": 1
}),
label: "Minimum number of parameters to show uncollapsed"
},
"watchlist": {
input: new OO.ui.ButtonSelectWidget({
items: [new OO.ui.ButtonOptionWidget({
data: "preferences",
label: "Default",
title: "Uses the same setting as if you manually edited the page, as per Special:Preferences"
}), new OO.ui.ButtonOptionWidget({
data: "watch",
label: "Always",
title: "Always add pages Rater edits to your watchlist"
}), new OO.ui.ButtonOptionWidget({
data: "nochange",
label: "Never",
title: "Never add pages Rater edit to your watchlist"
})]
}).selectItemByData("preferences"),
label: "Add edited pages to watchlist"
},
"resetCache": {
input: new OO.ui.ButtonWidget({
label: "Reset cache",
title: "Remove cached data, including list of WikiProjects and template parameters",
flags: ["destructive"]
})
}
};
for (var prefName in this.preferences) {
this.layout.addItems([new OO.ui.FieldLayout(this.preferences[prefName].input, {
label: this.preferences[prefName].label,
align: "right"
})]);
}
this.preferences.resetCache.input.connect(this, {
"click": "onResetCacheClick"
});
}
OO.inheritClass(PrefsFormWidget, OO.ui.Widget);
PrefsFormWidget.prototype.setPrefValues = function (prefs) {
var _this = this;
var _loop = function _loop(prefName) {
var value = prefs[prefName];
var input = _this.preferences[prefName] && _this.preferences[prefName].input;
switch (input && input.constructor.name) {
case "OoUiButtonSelectWidget":
input.selectItemByData(value);
break;
case "OoUiNumberInputWidget":
case "OoUiToggleSwitchWidget":
input.setValue(value);
break;
case "MwWidgetsNamespacesMultiselectWidget":
input.clearItems();
value.forEach(function (ns) {
return input.addTag(ns.toString(), ns === 0 ? "(Main)" : _config["default"].mw.wgFormattedNamespaces[ns]);
});
break;
}
};
for (var prefName in prefs) {
_loop(prefName);
}
};
PrefsFormWidget.prototype.getPrefs = function () {
var prefs = {};
for (var prefName in this.preferences) {
var input = this.preferences[prefName].input;
var value = void 0;
switch (input.constructor.name) {
case "OoUiButtonSelectWidget":
value = input.findSelectedItem().getData();
break;
case "OoUiToggleSwitchWidget":
value = input.getValue();
break;
case "OoUiNumberInputWidget":
value = Number(input.getValue()); // widget uses strings, not numbers!
break;
case "MwWidgetsNamespacesMultiselectWidget":
value = input.getValue().map(Number); // widget uses strings, not numbers!
break;
}
prefs[prefName] = value;
}
return prefs;
};
PrefsFormWidget.prototype.onResetCacheClick = function () {
var _this2 = this;
OO.ui.confirm("After reseting cache, Rater will close and restart. Any changes made will be discarded.").then(function (confirmed) {
if (confirmed) {
_this2.emit("resetCache");
}
});
};
var _default = PrefsFormWidget; // </nowiki>
exports["default"] = _default;
},{"../../config":18}],11:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
// <nowiki>
var SuggestionLookupTextInputWidget = function SuggestionLookupTextInputWidget(config) {
OO.ui.TextInputWidget.call(this, config);
OO.ui.mixin.LookupElement.call(this, config);
this.suggestions = Array.isArray(config.suggestions) ? config.suggestions : [];
this.$element.addClass("rater-suggestionLookupTextInputWidget");
};
OO.inheritClass(SuggestionLookupTextInputWidget, OO.ui.TextInputWidget);
OO.mixinClass(SuggestionLookupTextInputWidget, OO.ui.mixin.LookupElement);
// Set suggestion. param: Object[] with objects of the form { data: ... , label: ... }
SuggestionLookupTextInputWidget.prototype.setSuggestions = function (suggestions) {
if (!Array.isArray(suggestions)) {
if (suggestions != null) {
console.warn("[Rater] SuggestionLookupTextInputWidget.prototype.setSuggestions called with a non-array value:", suggestions);
}
return;
}
this.suggestions = suggestions;
};
// Returns data, as a resolution to a promise, to be passed to #getLookupMenuOptionsFromData
SuggestionLookupTextInputWidget.prototype.getLookupRequest = function () {
var deferred = $.Deferred().resolve(new RegExp("\\b" + mw.util.escapeRegExp(this.getValue()), "i"));
return deferred.promise({
abort: function abort() {}
});
};
// ???
SuggestionLookupTextInputWidget.prototype.getLookupCacheDataFromResponse = function (response) {
return response || [];
};
// Is passed data from #getLookupRequest, returns an array of menu item widgets
SuggestionLookupTextInputWidget.prototype.getLookupMenuOptionsFromData = function (pattern) {
var labelMatchesInputVal = function labelMatchesInputVal(suggestionItem) {
return pattern.test(suggestionItem.label) || !suggestionItem.label && pattern.test(suggestionItem.data);
};
var makeMenuOptionWidget = function makeMenuOptionWidget(optionItem) {
return new OO.ui.MenuOptionWidget({
data: optionItem.data,
label: optionItem.label || optionItem.data
});
};
return this.suggestions.filter(labelMatchesInputVal).map(makeMenuOptionWidget);
};
// Extend onLookupMenuChoose method to emit an choose event
SuggestionLookupTextInputWidget.prototype.onLookupMenuChoose = function (item) {
// Get data
var itemData = item.getData();
// Simplify item data if it is an object with a name property
if (itemData && itemData.name) {
item.setData(itemData.name);
}
// First blur the input, to prevent the menu popping back up
this.$input.blur();
OO.ui.mixin.LookupElement.prototype.onLookupMenuChoose.call(this, item);
this.emit("choose", itemData);
};
var _default = SuggestionLookupTextInputWidget; // </nowiki>
exports["default"] = _default;
},{}],12:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _config = _interopRequireDefault(require("../../config"));
var _SuggestionLookupTextInputWidget = _interopRequireDefault(require("./SuggestionLookupTextInputWidget"));
var _getBanners = require("../../getBanners");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
// <nowiki>
function TopBarWidget(config) {
var _this = this;
// Configuration initialization
config = $.extend({
expanded: false,
framed: false,
padded: false
}, config || {});
// Call parent constructor
TopBarWidget["super"].call(this, config);
this.$overlay = config.$overlay;
// Search box
this.searchBox = new _SuggestionLookupTextInputWidget["default"]({
placeholder: "Add a WikiProject...",
$element: $("<div style='display:inline-block; margin:0 -1px; width:calc(100% - 55px);'>"),
$overlay: this.$overlay
});
(0, _getBanners.getBannerNames)().then(function (banners) {
return [].concat(_toConsumableArray(banners.withRatings.map(function (bannerName) {
return {
label: bannerName.replace("WikiProject ", ""),
data: {
name: bannerName
}
};
})), _toConsumableArray(banners.withoutRatings.map(function (bannerName) {
return {
label: bannerName.replace("WikiProject ", ""),
data: {
name: bannerName,
withoutRatings: true
}
};
})), _toConsumableArray(banners.wrappers.map(function (bannerName) {
return {
label: bannerName.replace("WikiProject ", "") + " [template wrapper]",
data: {
name: bannerName,
wrapper: true
}
};
})), _toConsumableArray(banners.notWPBM.map(function (bannerName) {
return {
label: bannerName.replace("WikiProject ", ""),
data: {
name: bannerName
}
};
})), _toConsumableArray(banners.inactive.map(function (bannerName) {
return {
label: bannerName.replace("WikiProject ", "") + " [inactive]",
data: {
name: bannerName,
withoutRatings: true
}
};
})), _toConsumableArray(banners.wir.map(function (bannerName) {
return {
label: bannerName + " [Women In Red meetup/initiative]",
data: {
name: bannerName,
withoutRatings: true
}
};
})));
}).then(function (bannerOptions) {
return _this.searchBox.setSuggestions(bannerOptions);
});
// Add button
this.addBannerButton = new OO.ui.ButtonWidget({
icon: "add",
title: "Add",
flags: "progressive",
$element: $("<span style='float:right;margin: 0;transform: translateX(-12px);'>")
});
var $searchContainer = $("<div style='display:inline-block; flex-shrink:1; flex-grow:100; min-width:250px; width:50%;'>").append(this.searchBox.$element, this.addBannerButton.$element);
// Set all classes/importances
// in the style of a popup button with a menu (is actually a dropdown with a hidden label, because that makes the coding easier.)
this.setAllDropDown = new OO.ui.DropdownWidget({
icon: "tag",
label: "Set all...",
invisibleLabel: true,
menu: {
items: [new OO.ui.MenuSectionOptionWidget({
label: "Classes"
}), new OO.ui.MenuOptionWidget({
data: {
"class": null
},
label: new OO.ui.HtmlSnippet("<span style=\"color:#777\">(no class)</span>")
})].concat(_toConsumableArray(_config["default"].bannerDefaults.classes.map(function (classname) {
return new OO.ui.MenuOptionWidget({
data: {
"class": classname
},
label: classname
});
})), [new OO.ui.MenuSectionOptionWidget({
label: "Importances"
}), new OO.ui.MenuOptionWidget({
data: {
importance: null
},
label: new OO.ui.HtmlSnippet("<span style=\"color:#777\">(no importance)</span>")
})], _toConsumableArray(_config["default"].bannerDefaults.importances.map(function (importance) {
return new OO.ui.MenuOptionWidget({
data: {
importance: importance
},
label: importance
});
})))
},
$element: $("<span style=\"width:auto;display:inline-block;float:left;margin:0\" title='Set all...'>"),
$overlay: this.$overlay
});
// Remove all banners button
this.removeAllButton = new OO.ui.ButtonWidget({
icon: "trash",
title: "Remove all",
flags: "destructive"
});
// Clear all parameters button
this.clearAllButton = new OO.ui.ButtonWidget({
icon: "cancel",
title: "Clear all",
flags: "destructive"
});
// Group the buttons together
this.menuButtons = new OO.ui.ButtonGroupWidget({
items: [this.removeAllButton, this.clearAllButton],
$element: $("<span style='flex:1 0 auto;'>")
});
// Include the dropdown in the group
this.menuButtons.$element.prepend(this.setAllDropDown.$element);
// Put everything into a layout
this.$element.addClass("rater-topBarWidget").css({
"position": "fixed",
"width": "100%",
"background": "#ccc",
"display": "flex",
"flex-wrap": "wrap",
"justify-content": "space-around",
"margin": "-2px 0 0 0"
}).append($searchContainer, this.menuButtons.$element);
/* --- Event handling --- */
this.searchBox.connect(this, {
"enter": "onSearchSelect",
"choose": "onSearchSelect"
});
this.addBannerButton.connect(this, {
"click": "onSearchSelect"
});
this.setAllDropDown.getMenu().connect(this, {
"choose": "onRatingChoose"
});
this.removeAllButton.connect(this, {
"click": "onRemoveAllClick"
});
this.clearAllButton.connect(this, {
"click": "onClearAllClick"
});
}
OO.inheritClass(TopBarWidget, OO.ui.PanelLayout);
TopBarWidget.prototype.onSearchSelect = function (data) {
this.emit("searchSelect", data);
};
TopBarWidget.prototype.onRatingChoose = function (item) {
var data = item.getData();
if (data["class"] || data["class"] === null) {
this.emit("setClasses", data["class"]);
}
if (data.importance || data.importance === null) {
this.emit("setImportances", data.importance);
}
};
TopBarWidget.prototype.onRemoveAllClick = function () {
this.emit("removeAll");
};
TopBarWidget.prototype.onClearAllClick = function () {
this.emit("clearAll");
};
TopBarWidget.prototype.setDisabled = function (disable) {
[this.searchBox, this.addBannerButton, this.setAllDropDown, this.removeAllButton, this.clearAllButton].forEach(function (widget) {
return widget.setDisabled(disable);
});
};
var _default = TopBarWidget; // </nowiki>
exports["default"] = _default;
},{"../../config":18,"../../getBanners":20,"./SuggestionLookupTextInputWidget":11}],13:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _api = require("../api");
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
// <nowiki>
/* var incrementProgressByInterval = function() {
var incrementIntervalDelay = 100;
var incrementIntervalAmount = 0.1;
var incrementIntervalMaxval = 98;
return window.setInterval(
incrementProgress,
incrementIntervalDelay,
incrementIntervalAmount,
incrementIntervalMaxval
);
}; */
var LoadDialog = function LoadDialog(config) {
LoadDialog["super"].call(this, config);
};
OO.inheritClass(LoadDialog, OO.ui.Dialog);
LoadDialog["static"].name = "loadDialog";
LoadDialog["static"].title = "Loading Rater...";
// Customize the initialize() function: This is where to add content to the dialog body and set up event handlers.
LoadDialog.prototype.initialize = function () {
var _this$content$$elemen;
// Call the parent method.
LoadDialog["super"].prototype.initialize.call(this);
// Create a layout
this.content = new OO.ui.PanelLayout({
padded: true,
expanded: false
});
// Create content
this.progressBar = new OO.ui.ProgressBarWidget({
progress: 1
});
this.setuptasks = [new OO.ui.LabelWidget({
label: "Loading your Rater preferences...",
$element: $("<p style=\"display:block\">")
}), new OO.ui.LabelWidget({
label: "Loading list of project banners...",
$element: $("<p style=\"display:block\">")
}), new OO.ui.LabelWidget({
label: "Loading talkpage wikitext...",
$element: $("<p style=\"display:block\">")
}), new OO.ui.LabelWidget({
label: "Parsing talkpage templates...",
$element: $("<p style=\"display:block\">")
}), new OO.ui.LabelWidget({
label: "Getting templates' parameter data...",
$element: $("<p style=\"display:block\">")
}), new OO.ui.LabelWidget({
label: "Checking subject page...",
$element: $("<p style=\"display:block\">")
}), new OO.ui.LabelWidget({
label: "Retrieving quality prediction...",
$element: $("<p style=\"display:block\">")
}).toggle()];
this.closeButton = new OO.ui.ButtonWidget({
label: "Close"
}).toggle();
this.setupPromises = [];
// Append content to layout
(_this$content$$elemen = this.content.$element).append.apply(_this$content$$elemen, [this.progressBar.$element, new OO.ui.LabelWidget({
label: "Initialising:",
$element: $("<strong style=\"display:block\">")
}).$element].concat(_toConsumableArray(this.setuptasks.map(function (widget) {
return widget.$element;
})), [this.closeButton.$element]));
// Append layout to dialog
this.$body.append(this.content.$element);
// Connect events to handlers
this.closeButton.connect(this, {
"click": "onCloseButtonClick"
});
};
LoadDialog.prototype.onCloseButtonClick = function () {
// Close this dialog, without passing any data
this.close();
};
// Override the getBodyHeight() method to specify a custom height (or don't to use the automatically generated height).
LoadDialog.prototype.getBodyHeight = function () {
return this.content.$element.outerHeight(true);
};
LoadDialog.prototype.incrementProgress = function (amount, maximum) {
var priorProgress = this.progressBar.getProgress();
var incrementedProgress = Math.min(maximum || 100, priorProgress + amount);
this.progressBar.setProgress(incrementedProgress);
};
LoadDialog.prototype.addTaskPromiseHandlers = function (taskPromises) {
var _this = this;
var onTaskDone = function onTaskDone(index) {
// Add "Done!" to label
var widget = _this.setuptasks[index];
widget.setLabel(widget.getLabel() + " Done!");
// Increment status bar. Show a smooth transition by
// using small steps over a short duration.
var totalIncrement = 100 / _this.setuptasks.length; // percent
var totalTime = 400; // milliseconds
var totalSteps = 10;
var incrementPerStep = totalIncrement / totalSteps;
for (var step = 0; step < totalSteps; step++) {
window.setTimeout(_this.incrementProgress.bind(_this), totalTime * step / totalSteps, incrementPerStep);
}
};
var onTaskError = function onTaskError(index, code, info) {
var widget = _this.setuptasks[index];
widget.setLabel(widget.getLabel() + " Failed. " + (0, _api.makeErrorMsg)(code, info));
_this.closeButton.toggle(true);
_this.updateSize();
};
taskPromises.forEach(function (promise, index) {
promise.then(function () {
return onTaskDone(index);
}, function (code, info) {
return onTaskError(index, code, info);
});
});
};
// Use getSetupProcess() to set up the window with data passed to it at the time
// of opening
LoadDialog.prototype.getSetupProcess = function (data) {
var _this2 = this;
data = data || {};
return LoadDialog["super"].prototype.getSetupProcess.call(this, data).next(function () {
var showOresTask = !!data.ores;
_this2.setuptasks[6].toggle(showOresTask);
var taskPromises = data.ores ? data.promises : data.promises.slice(0, -1);
data.isOpened.then(function () {
return _this2.addTaskPromiseHandlers(taskPromises);
});
}, this);
};
// Prevent window from closing too quickly, using getHoldProcess()
LoadDialog.prototype.getHoldProcess = function (data) {
data = data || {};
if (data.success) {
// Wait a bit before processing the close, which happens automatically
return LoadDialog["super"].prototype.getHoldProcess.call(this, data).next(800);
}
// No need to wait if closed manually
return LoadDialog["super"].prototype.getHoldProcess.call(this, data);
};
// Use the getTeardownProcess() method to perform actions whenever the dialog is closed.
LoadDialog.prototype.getTeardownProcess = function (data) {
var _this3 = this;
return LoadDialog["super"].prototype.getTeardownProcess.call(this, data).first(function () {
// Perform cleanup: reset labels
_this3.setuptasks.forEach(function (setuptask) {
var currentLabel = setuptask.getLabel();
setuptask.setLabel(currentLabel.slice(0, currentLabel.indexOf("...") + 3));
});
}, this);
};
var _default = LoadDialog; // </nowiki>
exports["default"] = _default;
},{"../api":15}],14:[function(require,module,exports){
"use strict";
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _BannerWidget = _interopRequireDefault(require("./Components/BannerWidget"));
var _BannerListWidget = _interopRequireDefault(require("./Components/BannerListWidget"));
var _config = _interopRequireDefault(require("../config"));
var _api = _interopRequireWildcard(require("../api"));
var _PrefsFormWidget = _interopRequireDefault(require("./Components/PrefsFormWidget"));
var _prefs = require("../prefs");
var _Template = require("../Template");
var _TopBarWidget = _interopRequireDefault(require("./Components/TopBarWidget"));
var _util = require("../util");
var cache = _interopRequireWildcard(require("../cache"));
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
// <nowiki>
function MainWindow(config) {
MainWindow["super"].call(this, config);
}
OO.inheritClass(MainWindow, OO.ui.ProcessDialog);
MainWindow["static"].name = "main";
MainWindow["static"].title = $("<span>").css({
"font-weight": "normal"
}).append($("<a>").css({
"font-weight": "bold"
}).attr({
"href": mw.util.getUrl("WP:RATER"),
"target": "_blank"
}).text("Rater"), " (", $("<a>").attr({
"href": mw.util.getUrl("WT:RATER"),
"target": "_blank"
}).text("talk"), ") ", $("<span>").css({
"font-size": "90%"
}).text("v" + _config["default"].script.version));
MainWindow["static"].size = "large";
MainWindow["static"].actions = [
// Primary (top right):
{
label: "X",
// not using an icon since color becomes inverted, i.e. white on light-grey
title: "Close (and discard any changes)",
flags: "primary",
modes: ["edit", "diff", "preview"] // available when current mode isn't "prefs"
},
// Safe (top left)
{
action: "showPrefs",
flags: "safe",
icon: "settings",
title: "Preferences",
modes: ["edit", "diff", "preview"] // available when current mode isn't "prefs"
},
// Others (bottom)
{
action: "save",
accessKey: "s",
label: new OO.ui.HtmlSnippet("<span style='padding:0 1em;'>Save</span>"),
flags: ["primary", "progressive"],
modes: ["edit", "diff", "preview"] // available when current mode isn't "prefs"
}, {
action: "preview",
accessKey: "p",
label: "Show preview",
modes: ["edit", "diff"] // available when current mode isn't "preview" or "prefs"
}, {
action: "changes",
accessKey: "v",
label: "Show changes",
modes: ["edit", "preview"] // available when current mode isn't "diff" or "prefs"
}, {
action: "back",
label: "Back",
modes: ["diff", "preview"] // available when current mode is "diff" or "prefs"
},
// "prefs" mode only
{
action: "savePrefs",
label: "Update",
flags: ["primary", "progressive"],
modes: "prefs"
}, {
action: "closePrefs",
label: "Cancel",
flags: "safe",
modes: "prefs"
}];
// Customize the initialize() function: This is where to add content to the dialog body and set up event handlers.
MainWindow.prototype.initialize = function () {
// Call the parent method.
MainWindow["super"].prototype.initialize.call(this);
/* --- PREFS --- */
this.preferences = _config["default"].defaultPrefs;
/* --- TOP BAR --- */
this.topBar = new _TopBarWidget["default"]({
$overlay: this.$overlay
});
this.$head.css({
"height": "73px"
}).append(this.topBar.$element);
/* --- FOOTER --- */
this.oresLabel = new OO.ui.LabelWidget({
$element: $("<span style='float:right; padding: 10px; max-width: 50%; text-align: center;'>"),
label: $("<span>").append($("<a>").attr({
"href": mw.util.getUrl("mw:ORES"),
"target": "_blank"
}).append($("<img>").css({
"vertical-align": "text-bottom;"
}).attr({
"src": "//upload.wikimedia.org/wikipedia/commons/thumb/5/51/Objective_Revision_Evaluation_Service_logo.svg/40px-Objective_Revision_Evaluation_Service_logo.svg.png",
"title": "Machine predicted quality from ORES",
"alt": "ORES logo",
"width": "20px",
"height": "20px"
})), " ", $("<span class='oresPrediction'>"))
}).toggle(false);
this.pagetypeLabel = new OO.ui.LabelWidget({
$element: $("<span style='float:right; padding: 10px; max-width: 33.33%; text-align: center;'>")
}).toggle(false);
this.$foot.prepend(this.oresLabel.$element, this.pagetypeLabel.$element);
/* --- CONTENT AREA --- */
// Banners added dynamically upon opening, so just need a layout with an empty list
this.bannerList = new _BannerListWidget["default"]({
preferences: this.preferences
});
this.editLayout = new OO.ui.PanelLayout({
padded: false,
expanded: false,
$content: this.bannerList.$element
});
// Preferences, filled in with current prefs upon loading.
// TODO: Make this into a component, add fields and inputs
this.prefsForm = new _PrefsFormWidget["default"]();
this.prefsLayout = new OO.ui.PanelLayout({
padded: true,
expanded: false,
$content: this.prefsForm.$element
});
// Preview, Show changes
this.parsedContentContainer = new OO.ui.FieldsetLayout({
label: "Preview"
});
this.parsedContentWidget = new OO.ui.LabelWidget({
label: "",
$element: $("<div>")
});
this.parsedContentContainer.addItems([new OO.ui.FieldLayout(this.parsedContentWidget, {
align: "top"
})]);
this.parsedContentLayout = new OO.ui.PanelLayout({
padded: true,
expanded: false,
$content: this.parsedContentContainer.$element
});
this.contentArea = new OO.ui.StackLayout({
items: [this.editLayout, this.prefsLayout, this.parsedContentLayout],
padded: false,
expanded: false
});
this.$body.css({
"top": "73px"
}).append(this.contentArea.$element);
/* --- EVENT HANDLING --- */
this.topBar.connect(this, {
"searchSelect": "onSearchSelect",
"setClasses": "onSetClasses",
"setImportances": "onSetImportances",
"removeAll": "onRemoveAll",
"clearAll": "onClearAll"
});
this.bannerList.connect(this, {
"updatedSize": "onBannerListUpdateSize"
});
// Handle certain keyboard events. Requires something in the Rater window to be focused,
// so add a tabindex to the body and it's parent container.
this.$body.attr("tabindex", "999").parent().attr("tabindex", "999").keydown(function (event) {
var scrollAmount;
switch (event.which) {
case 33:
// page up
scrollAmount = this.$body.scrollTop() - this.$body.height() * 0.9;
break;
case 34:
// page down
scrollAmount = this.$body.scrollTop() + this.$body.height() * 0.9;
break;
default:
return;
}
this.$body.scrollTop(scrollAmount);
event.preventDefault();
}.bind(this));
this.prefsForm.connect(this, {
"resetCache": "onResetCache"
});
};
MainWindow.prototype.onBannerListUpdateSize = function () {
// Get the current scroll amount
var scrollAmount = this.$body.scrollTop();
// Update size (which resets the scroll to 0)
this.updateSize();
// Scroll to where it was before
this.$body.scrollTop(scrollAmount);
};
MainWindow.prototype.makeDraggable = function () {
var $frameEl = this.$element.find(".oo-ui-window-frame");
var $handleEl = this.$element.find(".oo-ui-processDialog-location").css({
"cursor": "move"
});
// Position for css translate transformations, relative to initial position
// (which is centered on viewport when scrolled to top)
var position = {
x: 0,
y: 0
};
var constrain = function constrain(val, minVal, maxVal) {
if (val < minVal) return minVal;
if (val > maxVal) return maxVal;
return val;
};
var constrainX = function constrainX(val) {
// Don't too far horizontally (leave at least 100px visible)
var limit = window.innerWidth / 2 + $frameEl.outerWidth() / 2 - 100;
return constrain(val, -1 * limit, limit);
};
var constrainY = function constrainY(val) {
// Can't take title bar off the viewport, since it's the drag handle
var minLimit = -1 * (window.innerHeight - $frameEl.outerHeight()) / 2;
// Don't go too far down the page: (whole page height) - (initial position)
var maxLimit = (document.documentElement || document).scrollHeight - window.innerHeight / 2;
return constrain(val, minLimit, maxLimit);
};
var pointerdown = false;
var dragFrom = {};
var onDragStart = function onDragStart(event) {
pointerdown = true;
dragFrom.x = event.clientX;
dragFrom.y = event.clientY;
};
var onDragMove = function onDragMove(event) {
if (!pointerdown || dragFrom.x == null || dragFrom.y === null) {
return;
}
var dx = event.clientX - dragFrom.x;
var dy = event.clientY - dragFrom.y;
dragFrom.x = event.clientX;
dragFrom.y = event.clientY;
position.x = constrainX(position.x + dx);
position.y = constrainY(position.y + dy);
$frameEl.css("transform", "translate(".concat(position.x, "px, ").concat(position.y, "px)"));
};
var onDragEnd = function onDragEnd() {
pointerdown = false;
delete dragFrom.x;
delete dragFrom.y;
// Make sure final positions are whole numbers
position.x = Math.round(position.x);
position.y = Math.round(position.y);
$frameEl.css("transform", "translate(".concat(position.x, "px, ").concat(position.y, "px)"));
};
// Use pointer events if available; otherwise use mouse events
var pointer = "PointerEvent" in window ? "pointer" : "mouse";
$handleEl.on(pointer + "enter.raterMainWin", function () {
return $frameEl.css("will-change", "transform");
}); // Tell browser to optimise transform
$handleEl.on(pointer + "leave.raterMainWin", function () {
if (!pointerdown) $frameEl.css("will-change", "");
}); // Remove optimisation if not dragging
$handleEl.on(pointer + "down.raterMainWin", onDragStart);
$("body").on(pointer + "move.raterMainWin", onDragMove);
$("body").on(pointer + "up.raterMainWin", onDragEnd);
};
// Override the getBodyHeight() method to specify a custom height
MainWindow.prototype.getBodyHeight = function () {
var currentlayout = this.contentArea.getCurrentItem();
var layoutHeight = currentlayout && currentlayout.$element.outerHeight(true);
var contentHeight = currentlayout && currentlayout.$element.children(":first-child").outerHeight(true);
return Math.max(200, layoutHeight, contentHeight);
};
// Use getSetupProcess() to set up the window with data passed to it at the time
// of opening
MainWindow.prototype.getSetupProcess = function (data) {
var _this = this;
data = data || {};
return MainWindow["super"].prototype.getSetupProcess.call(this, data).next(function () {
_this.makeDraggable();
// Set up preferences
_this.setPreferences(data.preferences);
_this.prefsForm.setPrefValues(data.preferences);
// Set subject page info
_this.subjectPage = data.subjectPage;
_this.pageInfo = {
redirect: data.redirectTarget,
isDisambig: data.disambig,
hasStubtag: data.stubtag,
isArticle: data.isArticle
};
// Set up edit mode banners
_this.actions.setMode("edit");
_this.bannerList.oresClass = data.isArticle && data.isList ? "List" : data.ores && data.ores.prediction;
_this.bannerList.pageInfo = _this.pageInfo;
_this.bannerList.addItems(data.banners.map(function (bannerTemplate) {
return new _BannerWidget["default"](bannerTemplate, {
preferences: _this.preferences,
$overlay: _this.$overlay,
isArticle: _this.pageInfo.isArticle
});
}));
var shellTemplateBanner = _this.bannerList.items.find(function (banner) {
return banner.isShellTemplate;
});
if (shellTemplateBanner && shellTemplateBanner.shellParam1Value) {
shellTemplateBanner.nonStandardTemplates = _this.bannerList.items.reduce(function (bannersList, curBanner) {
return bannersList.replace(curBanner.wikitext, "");
}, shellTemplateBanner.shellParam1Value).trim().replace(/\n+/g, "\n");
}
_this.bannerList.addShellTemplateIfNeeeded().syncShellTemplateWithBiographyBanner();
// Show page type, or ORES prediction, if available
if (_this.pageInfo.redirect) {
_this.pagetypeLabel.setLabel("Redirect page").toggle(true);
} else if (_this.pageInfo.isDisambig) {
_this.pagetypeLabel.setLabel("Disambiguation page").toggle(true);
} else if (_this.pageInfo.isArticle && data.isGA) {
_this.pagetypeLabel.setLabel("Good article").toggle(true);
} else if (_this.pageInfo.isArticle && data.isFA) {
_this.pagetypeLabel.setLabel("Featured article").toggle(true);
} else if (_this.pageInfo.isArticle && data.isFL) {
_this.pagetypeLabel.setLabel("Featured list").toggle(true);
} else if (_this.pageInfo.isArticle && data.isList) {
_this.pagetypeLabel.setLabel("List article").toggle(true);
} else if (data.ores) {
_this.oresClass = data.ores.prediction;
_this.oresLabel.toggle(true).$element.find(".oresPrediction").append("Prediction: ", $("<strong>").text(data.ores.prediction), " (" + data.ores.probability + ")");
} else if (_this.pageInfo.isArticle) {
_this.pagetypeLabel.setLabel("Article page").toggle(true);
} else {
_this.pagetypeLabel.setLabel(_this.subjectPage.getNamespacePrefix().slice(0, -1) + " page").toggle(true);
}
// Set props for use in making wikitext and edit summaries
_this.talkWikitext = data.talkWikitext;
_this.existingBannerNames = data.banners.map(function (bannerTemplate) {
return bannerTemplate.name;
});
_this.talkpage = data.talkpage;
// Force a size update to ensure eveything fits okay
_this.updateSize();
}, this);
};
// Set up the window it is ready: attached to the DOM, and opening animation completed
MainWindow.prototype.getReadyProcess = function (data) {
var _this2 = this;
data = data || {};
return MainWindow["super"].prototype.getReadyProcess.call(this, data).next(function () {
return _this2.topBar.searchBox.focus();
});
};
// Use the getActionProcess() method to do things when actions are clicked
MainWindow.prototype.getActionProcess = function (action) {
var _this3 = this;
if (action === "showPrefs") {
this.actions.setMode("prefs");
this.contentArea.setItem(this.prefsLayout);
this.topBar.setDisabled(true);
this.updateSize();
} else if (action === "savePrefs") {
var updatedPrefs = this.prefsForm.getPrefs();
return new OO.ui.Process().next((0, _prefs.setPrefs)(updatedPrefs).then(
// Success
function () {
_this3.setPreferences(updatedPrefs);
_this3.actions.setMode("edit");
_this3.contentArea.setItem(_this3.editLayout);
_this3.topBar.setDisabled(false);
_this3.updateSize();
},
// Failure
function (code, err) {
return $.Deferred().reject(new OO.ui.Error($("<div>").append($("<strong style='display:block;'>").text("Could not save preferences."), $("<span style='color:#777'>").text((0, _api.makeErrorMsg)(code, err)))));
}));
} else if (action === "clearCache") {
return new OO.ui.Process().next(function () {
cache.clearAllItems();
_this3.close({
restart: true
});
});
} else if (action === "closePrefs") {
this.actions.setMode("edit");
this.contentArea.setItem(this.editLayout);
this.topBar.setDisabled(false);
this.prefsForm.setPrefValues(this.preferences);
this.updateSize();
} else if (action === "save") {
return new OO.ui.Process().next(_api["default"].editWithRetry(this.talkpage.getPrefixedText(), {
rvsection: 0
}, function (revision) {
return {
section: 0,
text: _this3.transformTalkWikitext(revision.content),
summary: _this3.makeEditSummary(),
watchlist: _this3.preferences.watchlist
};
})["catch"](function (code, err) {
return $.Deferred().reject(new OO.ui.Error($("<div>").append($("<strong style='display:block;'>").text("Could not save your changes."), $("<span style='color:#777'>").text((0, _api.makeErrorMsg)(code, err)))));
})).next(function () {
return _this3.close({
success: true,
upgradedStub: _this3.pageInfo.hasStubtag && _this3.isRatedAndNotStub()
});
});
} else if (action === "preview") {
return new OO.ui.Process().next(_api["default"].post({
action: "parse",
contentmodel: "wikitext",
text: this.transformTalkWikitext(this.talkWikitext) + "\n<hr>\n" + "'''Edit summary:''' " + this.makeEditSummary(),
title: this.talkpage.getPrefixedText(),
pst: 1
}).then(function (result) {
if (!result || !result.parse || !result.parse.text || !result.parse.text["*"]) {
return $.Deferred().reject("Empty result");
}
var previewHtmlSnippet = new OO.ui.HtmlSnippet(result.parse.text["*"]);
_this3.parsedContentWidget.setLabel(previewHtmlSnippet);
_this3.parsedContentContainer.setLabel("Preview:");
_this3.actions.setMode("preview");
_this3.contentArea.setItem(_this3.parsedContentLayout);
_this3.topBar.setDisabled(true);
_this3.updateSize();
})["catch"](function (code, err) {
return $.Deferred().reject(new OO.ui.Error($("<div>").append($("<strong style='display:block;'>").text("Could not show changes."), $("<span style='color:#777'>").text((0, _api.makeErrorMsg)(code, err)))));
}));
} else if (action === "changes") {
return new OO.ui.Process().next(_api["default"].post({
action: "compare",
format: "json",
fromtext: this.talkWikitext,
fromcontentmodel: "wikitext",
totext: this.transformTalkWikitext(this.talkWikitext),
tocontentmodel: "wikitext",
prop: "diff"
}).then(function (result) {
if (!result || !result.compare || !result.compare["*"]) {
return $.Deferred().reject("Empty result");
}
var $diff = $("<table>").addClass("diff").css("width", "100%").append($("<tr>").append($("<th>").attr({
"colspan": "2",
"scope": "col"
}).css("width", "50%").text("Latest revision"), $("<th>").attr({
"colspan": "2",
"scope": "col"
}).css("width", "50%").text("New text")), result.compare["*"], $("<tfoot>").append($("<tr>").append($("<td colspan='4'>").append($("<strong>").text("Edit summary: "), _this3.makeEditSummary()))));
_this3.parsedContentWidget.setLabel($diff);
_this3.parsedContentContainer.setLabel("Changes:");
_this3.actions.setMode("diff");
_this3.contentArea.setItem(_this3.parsedContentLayout);
_this3.topBar.setDisabled(true);
_this3.updateSize();
})["catch"](function (code, err) {
return $.Deferred().reject(new OO.ui.Error($("<div>").append($("<strong style='display:block;'>").text("Could not show changes."), $("<span style='color:#777'>").text((0, _api.makeErrorMsg)(code, err)))));
}));
} else if (action === "back") {
this.actions.setMode("edit");
this.contentArea.setItem(this.editLayout);
this.topBar.setDisabled(false);
this.updateSize();
} else if (!action && this.bannerList.changed) {
// Confirm closing of dialog if there have been changes
return new OO.ui.Process().next(OO.ui.confirm("Changes made will be discarded.", {
title: "Close Rater?"
}).then(function (confirmed) {
return confirmed ? _this3.close() : null;
}));
}
return MainWindow["super"].prototype.getActionProcess.call(this, action);
};
// Use the getTeardownProcess() method to perform actions whenever the dialog is closed.
// `data` is the data passed into the window's .close() method.
MainWindow.prototype.getTeardownProcess = function (data) {
var _this4 = this;
return MainWindow["super"].prototype.getTeardownProcess.call(this, data).first(function () {
_this4.bannerList.clearItems();
_this4.topBar.searchBox.setValue("");
_this4.contentArea.setItem(_this4.editLayout);
_this4.topBar.setDisabled(false);
_this4.oresLabel.toggle(false).$element.find(".oresPrediction").empty();
_this4.pagetypeLabel.toggle(false).setLabel("");
_this4.$element.find(".oo-ui-window-frame").css("transform", "");
_this4.$element.find(".oo-ui-processDialog-location").off(".raterMainWin");
$("body").off(".raterMainWin");
});
};
MainWindow.prototype.setPreferences = function (prefs) {
this.preferences = $.extend({}, _config["default"].defaultPrefs, prefs);
// Applies preferences to existing items in the window:
this.bannerList.setPreferences(this.preferences);
};
MainWindow.prototype.onResetCache = function () {
this.executeAction("clearCache");
};
MainWindow.prototype.onSearchSelect = function (data) {
var _this5 = this;
this.topBar.searchBox.pushPending();
var name = this.topBar.searchBox.getValue().trim();
if (!name) {
this.topBar.searchBox.popPending().focus();
return;
}
var existingBanner = this.bannerList.items.find(function (banner) {
return banner.mainText === name || banner.redirectTargetMainText === name;
});
// Abort and show alert if banner already exists
if (existingBanner) {
this.topBar.searchBox.popPending();
return OO.ui.alert("There is already a {{" + name + "}} banner").then(this.searchBox.focus());
}
// Confirmation required for banners missing WikiProject from name, and for uncreated disambiguation talk pages
var confirmText;
if (!/^[Ww](?:P|iki[Pp]roject)/.test(name)) {
confirmText = new OO.ui.HtmlSnippet("{{" + mw.html.escape(name) + "}} is not a recognised WikiProject banner.<br/>Do you want to continue?");
} else if (name === "WikiProject Disambiguation" && $("#ca-talk.new").length !== 0 && this.bannerList.items.length === 0) {
// eslint-disable-next-line no-useless-escape
confirmText = "New talk pages shouldn't be created if they will only contain the \{\{WikiProject Disambiguation\}\} banner. Continue?";
}
$.when(confirmText ? OO.ui.confirm(confirmText) : true).then(function (confirmed) {
if (!confirmed) return;
// Create Template object
return _BannerWidget["default"].newFromTemplateName(name, data, {
preferences: _this5.preferences,
$overlay: _this5.$overlay,
isArticle: _this5.pageInfo.isArticle
}).then(function (banner) {
_this5.bannerList.addItems([banner]);
banner.setChanged();
_this5.updateSize();
});
}).then(function () {
return _this5.topBar.searchBox.setValue("").focus().popPending();
});
};
MainWindow.prototype.onSetClasses = function (classVal) {
var shellTemplate = this.bannerList.items.find(function (banner) {
return banner.isShellTemplate;
});
if (shellTemplate) {
shellTemplate.classDropdown.getMenu().selectItemByData(classVal);
shellTemplate.classDropdown.setAutofilled(false);
}
this.bannerList.items.forEach(function (banner) {
if (banner.hasClassRatings && !banner.isShellTemplate) {
banner.classDropdown.getMenu().selectItemByData(shellTemplate ? null : classVal);
banner.classDropdown.setAutofilled(false);
}
});
};
MainWindow.prototype.onSetImportances = function (importanceVal) {
this.bannerList.items.forEach(function (banner) {
if (banner.hasImportanceRatings) {
banner.importanceDropdown.getMenu().selectItemByData(importanceVal);
banner.importanceDropdown.setAutofilled(false);
}
});
};
MainWindow.prototype.onRemoveAll = function () {
this.bannerList.clearItems();
};
MainWindow.prototype.onClearAll = function () {
this.bannerList.items.forEach(function (banner) {
return banner.onClearButtonClick();
});
};
MainWindow.prototype.transformTalkWikitext = function (talkWikitext) {
var _this6 = this;
var bannersWikitext = this.bannerList.makeWikitext();
if (!talkWikitext) {
return bannersWikitext.trim();
}
// Reparse templates, in case talkpage wikitext has changed
var talkTemplates = (0, _Template.parseTemplates)(talkWikitext, true);
// replace existing banners wikitext with a control character
talkTemplates.forEach(function (template) {
if (_this6.existingBannerNames.includes(template.name)) {
talkWikitext = talkWikitext.replace(template.wikitext, "\x01");
}
});
// replace insertion point (first control character) with a different control character
talkWikitext = talkWikitext.replace("\x01", "\x02");
// remove other control characters
/* eslint-disable-next-line no-control-regex */
talkWikitext = talkWikitext.replace(/(?:\s|\n)*\x01(?:\s|\n)*/g, "");
// split into wikitext before/after the remaining control character (and trim each section)
var talkWikitextSections = talkWikitext.split("\x02").map(function (t) {
return t.trim();
});
if (talkWikitextSections.length === 2) {
// Found the insertion point for the banners
return (talkWikitextSections[0] + "\n" + bannersWikitext.trim() + "\n" + talkWikitextSections[1]).trim();
}
// Check if there's anything beside templates
var tempStr = talkWikitext;
talkTemplates.forEach(function (template) {
tempStr = tempStr.replace(template.wikitext, "");
});
if (/^#REDIRECT/i.test(talkWikitext) || !tempStr.trim()) {
// Is a redirect, or everything is a template: insert at the end
return talkWikitext.trim() + "\n" + bannersWikitext.trim();
} else {
// There is non-template content, so insert at the start
return bannersWikitext.trim() + "\n" + talkWikitext.trim();
}
};
MainWindow.prototype.isRatedAndNotStub = function () {
var nonStubRatinggs = this.bannerList.items.filter(function (banner) {
return banner.hasClassRatings && banner.classDropdown.getValue() && banner.classDropdown.getValue() !== "Stub";
});
return nonStubRatinggs.length > 0;
};
MainWindow.prototype.makeEditSummary = function () {
var _this7 = this;
var removedBanners = [];
var editedBanners = [];
var newBanners = [];
var shortName = function shortName(name) {
return name.replace("WikiProject ", "").replace("Subst:", "");
};
// Overall class/importance, if all the same
var allClasses = (0, _util.uniqueArray)((0, _util.filterAndMap)(this.bannerList.items, function (banner) {
return banner.hasClassRatings || banner.isShellTemplate;
}, function (banner) {
return banner.classDropdown.getValue();
}));
var overallClass = allClasses.length === 1 && allClasses[0];
var allImportances = (0, _util.uniqueArray)((0, _util.filterAndMap)(this.bannerList.items, function (banner) {
return banner.hasImportanceRatings;
}, function (banner) {
return banner.importanceDropdown.getValue();
}));
var overallImportance = allImportances.length === 1 && allImportances[0];
// Don't use them unless some have changed
var someClassesChanged = false;
var someImportancesChanged = false;
// removed banners:
this.existingBannerNames.forEach(function (name) {
var banner = _this7.bannerList.items.find(function (banner) {
return banner.name === name || banner.bypassedName === name;
});
if (!banner) {
removedBanners.push("−" + shortName(name));
}
});
// edited & new banners
this.bannerList.items.forEach(function (banner) {
var isNew = !banner.wikitext; // not added from wikitext on page
if (!isNew && !banner.changed) {
// Not changed
return;
}
var newClass = banner.hasClassRatings && (isNew || banner.classChanged) && banner.classDropdown.getValue();
if (newClass) {
someClassesChanged = true;
}
if (overallClass) {
newClass = null;
}
var newImportance = banner.hasImportanceRatings && (isNew || banner.importanceChanged) && banner.importanceDropdown.getValue();
if (newImportance) {
someImportancesChanged = true;
}
if (overallImportance) {
newImportance = null;
}
var rating = newClass && newImportance ? newClass + "/" + newImportance : newClass || newImportance || "";
if (rating) {
rating = " (" + rating + ")";
}
if (isNew) {
newBanners.push("+" + shortName(banner.name) + rating);
} else {
editedBanners.push(shortName(banner.name) + rating);
}
});
// overall rating
var overallRating = someClassesChanged && overallClass && someImportancesChanged && overallImportance ? overallClass + "/" + overallImportance : someClassesChanged && overallClass || someImportancesChanged && overallImportance || "";
if (overallRating) {
overallRating = " (" + overallRating + ")";
}
return "Assessment".concat(overallRating, ": ").concat([].concat(editedBanners, newBanners, removedBanners).join(", ")).concat(_config["default"].script.advert);
};
var _default = MainWindow; // </nowiki>
exports["default"] = _default;
},{"../Template":3,"../api":15,"../cache":17,"../config":18,"../prefs":21,"../util":23,"./Components/BannerListWidget":4,"./Components/BannerWidget":5,"./Components/PrefsFormWidget":10,"./Components/TopBarWidget":12}],15:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.makeErrorMsg = exports["default"] = void 0;
var _config = _interopRequireDefault(require("./config"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
// <nowiki>
var API = new mw.Api({
ajax: {
headers: {
"Api-User-Agent": "Rater/" + _config["default"].script.version + " ( https://en.wikipedia.org/wiki/User:Evad37/Rater )"
}
}
});
/* ---------- API for ORES ---------------------------------------------------------------------- */
API.getORES = function (revisionID) {
return $.get("https://ores.wikimedia.org/v3/scores/enwiki?models=articlequality&revids=" + revisionID);
};
/* ---------- Raw wikitext ---------------------------------------------------------------------- */
API.getRaw = function (page) {
return $.get("https:" + _config["default"].mw.wgServer + mw.util.getUrl(page, {
action: "raw"
})).then(function (data) {
if (!data) {
return $.Deferred().reject("ok-but-empty");
}
return data;
});
};
/* ---------- Edit with retry ------------------------------------------------------------------- */
/**
* @param {String} title
* @param {Object?} params additional params for the get request
* @returns {Promise<Object, string>} page, starttime timestamp
*/
var getPage = function getPage(title, params) {
return API.get($.extend({
"action": "query",
"format": "json",
"curtimestamp": 1,
"titles": title,
"prop": "revisions|info",
"rvprop": "content|timestamp",
"rvslots": "main"
}, params)).then(function (response) {
var page = Object.values(response.query.pages)[0];
var starttime = response.curtimestamp;
return $.Deferred().resolve(page, starttime);
});
};
/**
* @param {Object} page details object from API
* @param {string} starttime timestamp
* @param {Function} transform callback that prepares the edit:
* {Object} simplifiedPage => {Object|Promise<Object>} edit params
* @returns {Promise<Object>} params for edit query
*/
var processPage = function processPage(page, starttime, transform) {
var basetimestamp = page.revisions && page.revisions[0].timestamp;
var simplifiedPage = {
pageid: page.pageid,
missing: page.missing === "",
redirect: page.redirect === "",
categories: page.categories,
ns: page.ns,
title: page.title,
content: page.revisions && page.revisions[0].slots.main["*"]
};
return $.when(transform(simplifiedPage)).then(function (editParams) {
return $.extend({
action: "edit",
title: page.title,
// Protect against errors and conflicts
assert: "user",
basetimestamp: basetimestamp,
starttimestamp: starttime
}, editParams);
});
};
/** editWithRetry
*
* Edits a page, resolving edit conflicts, and retrying edits that fail. The
* tranform function may return a rejected promise if the page should not be
* edited; the @returns {Promise} will will be rejected with the same rejection
* values.
*
* Note: Unlike [mw.Api#Edit], a missing page will be created, unless the
* transform callback includes the "nocreate" param.
*
* [mw.Api#Edit]: <https://doc.wikimedia.org/mediawiki-core/master/js/#!/api/mw.Api.plugin.edit>
*
* @param {String} title page to be edited
* @param {Object|null} getParams additional params for the get request
* @param {Function} transform callback that prepares the edit:
* {Object} simplifiedPage => {Object|Promise<Object>} params for API editing
* @returns {Promise<object>} promise, resolved on success, rejected if
* page was not edited
*/
API.editWithRetry = function (title, getParams, transform) {
return getPage(title, getParams).then(
// Succes: process the page
function (page, starttime) {
return processPage(page, starttime, transform);
},
// Failure: try again
function () {
return getPage(title, getParams).then(processPage, transform);
}).then(function (editParams) {
return API.postWithToken("csrf", editParams)["catch"](function (errorCode) {
if (errorCode === "editconflict") {
// Try again, starting over
return API.editWithRetry(title, getParams, transform);
}
// Try again
return API.postWithToken("csrf", editParams);
});
});
};
var makeErrorMsg = function makeErrorMsg(first, second) {
var code, xhr, message;
if (_typeof(first) === "object" && typeof second === "string") {
// Errors from $.get being rejected (ORES & Raw wikitext)
var errorObj = first.responseJSON && first.responseJSON.error;
if (errorObj) {
// Got an api-specific error code/message
code = errorObj.code;
message = errorObj.message;
} else {
xhr = first;
}
} else if (typeof first === "string" && _typeof(second) === "object") {
// Errors from mw.Api object
var mwErrorObj = second.error;
if (mwErrorObj) {
// Got an api-specific error code/message
code = errorObj.code;
message = errorObj.info;
} else if (first === "ok-but-empty") {
code = null;
message = "Got an empty response from the server";
} else {
xhr = second && second.xhr;
}
}
if (code && message) {
return "API error ".concat(code, ": ").concat(message);
} else if (message) {
return "API error: ".concat(message);
} else if (xhr) {
return "HTTP error ".concat(xhr.status);
} else if (typeof first === "string" && first !== "error" && typeof second === "string" && second !== "error") {
return "Error ".concat(first, ": ").concat(second);
} else if (typeof first === "string" && first !== "error") {
return "Error: ".concat(first);
} else {
return "Unknown API error";
}
};
exports.makeErrorMsg = makeErrorMsg;
var _default = API; // </nowiki>
exports["default"] = _default;
},{"./config":18}],16:[function(require,module,exports){
"use strict";
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _config = _interopRequireDefault(require("./config"));
var _prefs = require("./prefs");
var _api = _interopRequireWildcard(require("./api"));
var _setup = _interopRequireDefault(require("./setup"));
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
// <nowiki>
var autoStart = function autoStart() {
return (0, _prefs.getPrefs)().then(function (prefs) {
// Check if pref is turned off
if (!prefs.autostart) {
return;
}
// Check if pref is turned off for redirects, and current page is a redirect
if (!prefs.autostartRedirects && window.location.search.includes("redirect=no")) {
return;
}
// Check if viewing diff/history/old version
if (/(action|diff|oldid)/.test(window.location.search)) {
return;
}
var subjectTitle = mw.Title.newFromText(_config["default"].mw.wgPageName).getSubjectPage();
// Check if subject page is the main page
if (subjectTitle.getPrefixedText() === "Main Page") {
return;
}
// Check subject page namespace
if (prefs.autostartNamespaces && prefs.autostartNamespaces.length && !prefs.autostartNamespaces.includes(_config["default"].mw.wgNamespaceNumber)) {
return;
}
// If talk page does not exist, can just autostart
if ($("#ca-talk.new").length) {
return (0, _setup["default"])();
}
/* Check templates present on talk page. Fetches indirectly transcluded templates, so will find
Template:WPBannerMeta (and its subtemplates). But some banners such as MILHIST don't use that
meta template, so we also have to check for template titles containg 'WikiProject'
*/
var talkTitle = mw.Title.newFromText(_config["default"].mw.wgPageName).getTalkPage();
return _api["default"].get({
action: "query",
format: "json",
prop: "templates",
titles: talkTitle.getPrefixedText(),
tlnamespace: "10",
tllimit: "500",
indexpageids: 1
}).then(function (result) {
var id = result.query.pageids;
var templates = result.query.pages[id].templates;
if (!templates) {
return (0, _setup["default"])();
}
var hasWikiproject = templates.some(function (template) {
return /(WikiProject|WPBanner)/.test(template.title);
});
if (!hasWikiproject) {
return (0, _setup["default"])();
}
}, function (code, jqxhr) {
// Silently ignore failures (just log to console)
console.warn("[Rater] Error while checking whether to autostart." + (code == null) ? "" : " " + (0, _api.makeErrorMsg)(code, jqxhr));
return $.Deferred().reject();
});
});
};
var _default = autoStart; // </nowiki>
exports["default"] = _default;
},{"./api":15,"./config":18,"./prefs":21,"./setup":22}],17:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.clearAllItems = exports.clearInvalidItems = exports.clearItemIfInvalid = exports.read = exports.write = void 0;
var _util = require("./util");
// <nowiki>
/** write
* @param {String} key
* @param {Array|Object} val
* @param {Number} staleDays Number of days after which the data becomes stale (usable, but should
* be updated for next time).
* @param {Number} expiryDays Number of days after which the cached data may be deleted.
*/
var write = function write(key, val, staleDays, expiryDays) {
try {
var defaultStaleDays = 1;
var defaultExpiryDays = 30;
var millisecondsPerDay = 24 * 60 * 60 * 1000;
var staleDuration = (staleDays || defaultStaleDays) * millisecondsPerDay;
var expiryDuration = (expiryDays || defaultExpiryDays) * millisecondsPerDay;
var stringVal = JSON.stringify({
value: val,
staleDate: new Date(Date.now() + staleDuration).toISOString(),
expiryDate: new Date(Date.now() + expiryDuration).toISOString()
});
localStorage.setItem("Rater-" + key, stringVal);
} catch (e) {} // eslint-disable-line no-empty
};
/** read
* @param {String} key
* @returns {Array|Object|String|Null} Cached array or object, or empty string if not yet cached,
* or null if there was error.
*/
exports.write = write;
var read = function read(key) {
var val;
try {
var stringVal = localStorage.getItem("Rater-" + key);
if (stringVal !== "") {
val = JSON.parse(stringVal);
}
} catch (e) {
console.log("[Rater] error reading " + key + " from localStorage cache:");
console.log("\t" + e.name + " message: " + e.message + (e.at ? " at: " + e.at : "") + (e.text ? " text: " + e.text : ""));
}
return val || null;
};
exports.read = read;
var isRaterKey = function isRaterKey(key) {
return key && key.indexOf("Rater-") === 0;
};
var clearItemIfInvalid = function clearItemIfInvalid(key) {
if (!isRaterKey(key)) {
return;
}
var item = read(key.replace("Rater-", ""));
var isInvalid = !item || !item.expiryDate || (0, _util.isAfterDate)(item.expiryDate);
if (isInvalid) {
localStorage.removeItem(key);
}
};
exports.clearItemIfInvalid = clearItemIfInvalid;
var clearInvalidItems = function clearInvalidItems() {
// Loop backwards as localStorage length will decrease as items are removed
for (var i = localStorage.length; i >= 0; i--) {
setTimeout(clearItemIfInvalid, 100, localStorage.key(i));
}
};
exports.clearInvalidItems = clearInvalidItems;
var clearAllItems = function clearAllItems() {
// Loop backwards as localStorage length will decrease as items are removed
for (var i = localStorage.length; i >= 0; i--) {
var key = localStorage.key(i);
if (isRaterKey(key)) {
localStorage.removeItem(key);
}
}
};
// </nowiki>
exports.clearAllItems = clearAllItems;
},{"./util":23}],18:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
// <nowiki>
var packagejson = require("../package.json");
var version = packagejson.version;
// A global object that stores all the page and user configuration and settings
var config = {
// Script info
script: {
// Advert to append to edit summaries
advert: " ([[WP:RATER#".concat(version, "|Rater]])"),
version: version
},
// Default preferences, if user subpage raterPrefs.json does not exist
defaultPrefs: {
"autostart": false,
"autostartRedirects": false,
"autostartNamespaces": [0],
"minForShell": 1,
"bypassRedirects": true,
"autofillClassFromOthers": true,
"autofillClassFromOres": true,
"autofillImportance": true,
"collapseParamsLowerLimit": 6,
"watchlist": "preferences"
},
// MediaWiki configuration values
mw: mw.config.get(["skin", "wgPageName", "wgNamespaceNumber", "wgUserName", "wgFormattedNamespaces", "wgMonthNames", "wgRevisionId", "wgScriptPath", "wgServer", "wgCategories", "wgIsMainPage"]),
bannerDefaults: {
classes: ["FA", "FL", "A", "GA", "B", "C", "Start", "Stub", "List"],
importances: ["Top", "High", "Mid", "Low"],
extendedClasses: ["Category", "Draft", "File", "FM", "Portal", "Project", "Template", "Bplus", "Future", "Current", "Disambig", "NA", "Redirect", "Book"],
extendedImportances: ["Top", "High", "Mid", "Low", "Bottom", "NA"]
},
customBanners: {
"WikiProject Military history": {
classes: ["FA", "FL", "A", "GA", "B", "C", "Start", "Stub", "List", "AL", "BL", "CL", "Category", "Draft", "File", "Portal", "Project", "Template", "Disambig", "Redirect", "Book"],
importances: []
},
"WikiProject Portals": {
classes: ["FPo", "Complete", "Substantial", "Basic", "Incomplete", "Meta", "List", "Category", "Draft", "File", "Project", "Template", "Disambig", "NA", "Redirect"],
importances: ["Top", "High", "Mid", "Low", "Bottom", "NA"]
},
"WikiProject Video games": {
classes: ["FA", "FL", "FM", "GA", "B", "C", "Start", "Stub", "List", "Category", "Draft", "File", "Portal", "Project", "Template", "Disambig", "Redirect"],
importances: ["Top", "High", "Mid", "Low", "NA"]
}
},
shellTemplates: ["WikiProject banner shell", "WikiProjectBanners", "WikiProject Banners", "WPB", "WPBS", "Wikiprojectbannershell", "WikiProject Banner Shell", "Wpb", "WPBannerShell", "Wpbs", "Wikiprojectbanners", "WP Banner Shell", "WP banner shell", "Bannershell", "Wikiproject banner shell", "WikiProject Banners Shell", "WikiProjectBanner Shell", "WikiProjectBannerShell", "WikiProject BannerShell", "WikiprojectBannerShell", "WikiProject banner shell/redirect", "WikiProject Shell", "Banner shell", "Scope shell", "Project shell", "WikiProject banner"],
defaultParameterData: {
"auto": {
"label": {
"en": "Auto-rated"
},
"description": {
"en": "Automatically rated by a bot. Allowed values: ['yes']."
},
"autovalue": "yes"
},
"listas": {
"label": {
"en": "List as"
},
"description": {
"en": "Sortkey for talk page"
}
},
"small": {
"label": {
"en": "Small?"
},
"description": {
"en": "Display a small version. Allowed values: ['yes']."
},
"autovalue": "yes"
},
"attention": {
"label": {
"en": "Attention required?"
},
"description": {
"en": "Immediate attention required. Allowed values: ['yes']."
},
"autovalue": "yes"
},
"needs-image": {
"label": {
"en": "Needs image?"
},
"description": {
"en": "Request that an image or photograph of the subject be added to the article. Allowed values: ['yes']."
},
"aliases": ["needs-photo"],
"autovalue": "yes",
"suggested": true
},
"needs-infobox": {
"label": {
"en": "Needs infobox?"
},
"description": {
"en": "Request that an infobox be added to the article. Allowed values: ['yes']."
},
"aliases": ["needs-photo"],
"autovalue": "yes",
"suggested": true
}
}
};
var _default = config; // </nowiki>
exports["default"] = _default;
},{"../package.json":1}],19:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
// <nowiki>
// Attribution: Diff styles based on <https://en.wikipedia.org/wiki/Wikipedia:AutoWikiBrowser/style.css>
var styles = "table.diff, td.diff-otitle, td.diff-ntitle { table-layout: auto !important;; }\ntd.diff-otitle, td.diff-ntitle { text-align: center; }\ntd.diff-marker { text-align: right; font-weight: bold; font-size: 1.25em; }\ntd.diff-lineno { font-weight: bold; }\ntd.diff-addedline, td.diff-deletedline, td.diff-context { font-size: 88%; vertical-align: top; white-space: -moz-pre-wrap; white-space: pre-wrap; }\ntd.diff-addedline, td.diff-deletedline { border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; }\ntd.diff-addedline { border-color: #a3d3ff; }\ntd.diff-deletedline { border-color: #ffe49c; }\ntd.diff-context { background: #f3f3f3; color: #333333; border-style: solid; border-width: 1px 1px 1px 4px; border-color: #e6e6e6; border-radius: 0.33em; }\n.diffchange { font-weight: bold; text-decoration: none; }\ntable.diff {\n border: none;\n width: 98%; border-spacing: 4px;\n table-layout: fixed; /* Ensures that colums are of equal width */\n}\ntd.diff-addedline .diffchange, td.diff-deletedline .diffchange { border-radius: 0.33em; padding: 0.25em 0; }\ntd.diff-addedline .diffchange {\tbackground: #d8ecff; }\ntd.diff-deletedline .diffchange { background: #feeec8; }\ntable.diff td {\tpadding: 0.33em 0.66em; }\ntable.diff col.diff-marker { width: 2%; }\ntable.diff col.diff-content { width: 48%; }\ntable.diff td div {\n /* Force-wrap very long lines such as URLs or page-widening char strings. */\n word-wrap: break-word;\n /* As fallback (FF<3.5, Opera <10.5), scrollbars will be added for very wide cells\n instead of text overflowing or widening */\n overflow: auto;\n}" + // Override OOUI window manager preventing background scrolling/interaction
"html body.rater-mainWindow-open {\n\tposition: unset;\n\toverflow: unset;\n}\nhtml body.rater-mainWindow-open .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-active {\n position: static;\n padding: 0;\n}" + // Increase z-index, to be above skin menus etc; smooth transition for dragging (transform:translate)
"html body.rater-mainWindow-open .oo-ui-dialog.oo-ui-window-active > div {\n z-index: 110;\n transition: all 0.25s ease-out 0s, transform 0s !important\n}\n" + // Ensure close dialog is visible
"html body.rater-mainWindow-open #mw-teleport-target {\n top: 0;\n bottom: 0;\n left: 0;\n right:0;\n}\n";
var _default = styles; // </nowiki>
exports["default"] = _default;
},{}],20:[function(require,module,exports){
"use strict";
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getBannerNames = void 0;
var _api = _interopRequireWildcard(require("./api"));
var _util = require("./util");
var cache = _interopRequireWildcard(require("./cache"));
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
// <nowiki>
var cacheBanners = function cacheBanners(banners) {
cache.write("banners", banners, 2, 60);
};
/**
* Gets banners/options from the Api
*
* @returns {Promise} Resolved with: banners object, bannerOptions array
*/
var getListOfBannersFromApi = function getListOfBannersFromApi() {
var finishedPromise = $.Deferred();
var querySkeleton = {
action: "query",
format: "json",
list: "categorymembers",
cmprop: "title",
cmnamespace: "10",
cmlimit: "500"
};
var categories = [{
title: "Category:WikiProject banners with quality assessment",
abbreviation: "withRatings",
banners: [],
processed: $.Deferred()
}, {
title: "Category:WikiProject banners without quality assessment",
abbreviation: "withoutRatings",
banners: [],
processed: $.Deferred()
}, {
title: "Category:WikiProject banner wrapper templates",
abbreviation: "wrappers",
banners: [],
processed: $.Deferred()
}, {
title: "Category:WikiProject banner templates not based on WPBannerMeta",
abbreviation: "notWPBM",
banners: [],
processed: $.Deferred()
}, {
title: "Category:Inactive WikiProject banners",
abbreviation: "inactive",
banners: [],
processed: $.Deferred()
}, {
title: "Category:Wrapper templates for WikiProject Women in Red",
abbreviation: "wir",
banners: [],
processed: $.Deferred()
}];
var processQuery = function processQuery(result, catIndex) {
if (!result.query || !result.query.categorymembers) {
// No results
// TODO: error or warning ********
finishedPromise.reject();
return;
}
// Gather titles into array - excluding "Template:" prefix
var resultTitles = result.query.categorymembers.map(function (info) {
return info.title.slice(9);
});
Array.prototype.push.apply(categories[catIndex].banners, resultTitles);
// Continue query if needed
if (result["continue"]) {
doApiQuery($.extend(categories[catIndex].query, result["continue"]), catIndex);
return;
}
categories[catIndex].processed.resolve();
};
var doApiQuery = function doApiQuery(q, catIndex) {
_api["default"].get(q).done(function (result) {
processQuery(result, catIndex);
}).fail(function (code, jqxhr) {
console.warn("[Rater] " + (0, _api.makeErrorMsg)(code, jqxhr, "Could not retrieve pages from [[:" + q.cmtitle + "]]"));
finishedPromise.reject();
});
};
categories.forEach(function (cat, index, arr) {
cat.query = $.extend({
"cmtitle": cat.title
}, querySkeleton);
$.when(arr[index - 1] && arr[index - 1].processed || true).then(function () {
doApiQuery(cat.query, index);
});
});
categories[categories.length - 1].processed.then(function () {
var banners = {};
categories.forEach(function (catObject) {
banners[catObject.abbreviation] = catObject.banners;
});
finishedPromise.resolve(banners);
});
return finishedPromise;
};
/**
* Gets banners from cache, if there and not too old
*
* @returns {Promise} Resolved with banners object
*/
var getBannersFromCache = function getBannersFromCache() {
var cachedBanners = cache.read("banners");
if (!cachedBanners || !cachedBanners.value || !cachedBanners.staleDate) {
return $.Deferred().reject();
}
if ((0, _util.isAfterDate)(cachedBanners.staleDate)) {
// Update in the background; still use old list until then
getListOfBannersFromApi().then(cacheBanners);
}
return $.Deferred().resolve(cachedBanners.value);
};
/**
* Gets banner names, grouped by type (withRatings, withoutRatings, wrappers, notWPBM)
* @returns {Promise<Object>} Object of string arrays keyed by type (withRatings, withoutRatings, wrappers, notWPBM)
*/
var getBannerNames = function getBannerNames() {
return getBannersFromCache().then(function (banners) {
// Ensure all keys exist
if (!banners.withRatings || !banners.withoutRatings || !banners.wrappers || !banners.notWPBM || !banners.inactive || !banners.wir) {
getListOfBannersFromApi().then(cacheBanners);
return $.extend({
withRatings: [],
withoutRatings: [],
wrappers: [],
notWPBM: [],
inactive: [],
wir: []
}, banners);
}
// Success: pass through
return banners;
})["catch"](function () {
// Failure: get from Api, then cache them
var bannersPromise = getListOfBannersFromApi();
bannersPromise.then(cacheBanners);
return bannersPromise;
});
};
// </nowiki>
exports.getBannerNames = getBannerNames;
},{"./api":15,"./cache":17,"./util":23}],21:[function(require,module,exports){
"use strict";
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.setPrefs = exports.getPrefs = exports["default"] = void 0;
var _api = _interopRequireDefault(require("./api"));
var _util = require("./util");
var _config = _interopRequireDefault(require("./config"));
var cache = _interopRequireWildcard(require("./cache"));
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
// <nowiki>
var prefsPage = "User:".concat(mw.config.get("wgUserName"), "/raterPrefs.json");
var writePrefsToCache = function writePrefsToCache(prefs) {
return cache.write("prefs", prefs, 1 / 24 / 60 * 1,
// 1 min
1 / 24 / 60 * 1 // 1 min
);
};
var getPrefsFromApi = function getPrefsFromApi() {
return _api["default"].get({
"action": "query",
"format": "json",
"prop": "revisions",
"titles": prefsPage,
"rvprop": "content",
"rvslots": "main"
}).then(function (response) {
var page = response.query.pages[Object.keys(response.query.pages)[0]];
if (!page.pageid || page.missing === "") {
return _config["default"].defaultPrefs;
}
var prefs;
try {
prefs = JSON.parse(page.revisions[0].slots.main["*"]);
} catch (e) {
return $.Deferred().reject("JSON-parsing-error", e);
}
writePrefsToCache(prefs);
return prefs;
});
};
var getPrefsFromCache = function getPrefsFromCache() {
var cachedPrefs = cache.read("prefs");
if (!cachedPrefs || !cachedPrefs.value || !cachedPrefs.staleDate || (0, _util.isAfterDate)(cachedPrefs.staleDate)) {
// No cached value, or is too old
return $.Deferred().reject();
}
return $.Deferred().resolve(cachedPrefs.value);
};
var getPrefs = function getPrefs() {
return getPrefsFromCache().then(
// Success: pass through (first param only)
function (prefs) {
return $.Deferred().resolve(prefs);
},
// Failure: get from Api
function () {
return getPrefsFromApi();
});
};
/**
*
* @param {Object} updatedPrefs object with key:value pairs for preferences json.
*/
exports.getPrefs = getPrefs;
var setPrefs = function setPrefs(updatedPrefs) {
return _api["default"].editWithRetry(prefsPage, null, function () {
return {
"text": JSON.stringify(updatedPrefs),
"summary": "Saving Rater preferences " + _config["default"].script.advert
};
}).then(function () {
return writePrefsToCache(updatedPrefs);
});
};
exports.setPrefs = setPrefs;
var _default = {
get: getPrefs,
set: setPrefs
}; // </nowiki>
exports["default"] = _default;
},{"./api":15,"./cache":17,"./config":18,"./util":23}],22:[function(require,module,exports){
"use strict";
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _config = _interopRequireDefault(require("./config"));
var _api = _interopRequireDefault(require("./api"));
var _Template = require("./Template");
var _getBanners = require("./getBanners");
var cache = _interopRequireWildcard(require("./cache"));
var _windowManager = _interopRequireDefault(require("./windowManager"));
var _prefs = require("./prefs");
var _util = require("./util");
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
// <nowiki>
var setupRater = function setupRater(clickEvent) {
if (clickEvent) {
clickEvent.preventDefault();
}
var setupCompletedPromise = $.Deferred();
var currentPage = mw.Title.newFromText(_config["default"].mw.wgPageName);
var talkPage = currentPage && currentPage.getTalkPage();
var subjectPage = currentPage && currentPage.getSubjectPage();
var subjectIsArticle = _config["default"].mw.wgNamespaceNumber <= 1;
// Get preferences (task 0)
var prefsPromise = (0, _prefs.getPrefs)();
// Get lists of all banners (task 1)
var bannersPromise = (0, _getBanners.getBannerNames)();
// Load talk page (task 2)
var loadTalkPromise = _api["default"].get({
action: "query",
prop: "revisions",
rvprop: "content",
rvsection: "0",
titles: talkPage.getPrefixedText(),
indexpageids: 1
}).then(function (result) {
var id = result.query.pageids;
var wikitext = id < 0 ? "" : result.query.pages[id].revisions[0]["*"];
return wikitext;
});
// Parse talk page for banners (task 3)
var parseTalkPromise = loadTalkPromise.then(function (wikitext) {
return (0, _Template.parseTemplates)(wikitext, true);
}) // Get all templates
.then(function (templates) {
return templates.filter(function (template) {
return template.getTitle() !== null;
});
}) // Filter out invalid templates (e.g. parser functions)
.then(function (templates) {
return (0, _Template.getWithRedirectTo)(templates);
}) // Check for redirects
.then(function (templates) {
return bannersPromise.then(function (allBanners) {
// Get list of all banner templates
return (0, _util.filterAndMap)(templates,
// Filter out non-banners
function (template) {
if (template.isShellTemplate()) {
return true;
}
var mainText = template.redirectTarget ? template.redirectTarget.getMainText() : template.getTitle().getMainText();
return allBanners.withRatings.includes(mainText) || allBanners.withoutRatings.includes(mainText) || allBanners.wrappers.includes(mainText) || allBanners.notWPBM.includes(mainText) || allBanners.inactive.includes(mainText) || allBanners.wir.includes(mainText);
},
// Set additional properties if needed
function (template) {
var mainText = template.redirectTarget ? template.redirectTarget.getMainText() : template.getTitle().getMainText();
if (allBanners.wrappers.includes(mainText)) {
template.redirectTarget = mw.Title.newFromText("Template:Subst:" + mainText);
}
if (allBanners.withoutRatings.includes(mainText) || allBanners.wir.includes(mainText)) {
template.withoutRatings = true;
}
if (allBanners.inactive.includes(mainText)) {
template.inactiveProject = true;
}
return template;
});
});
});
// Retrieve and store classes, importances, and TemplateData (task 4)
var templateDetailsPromise = parseTalkPromise.then(function (templates) {
// Wait for all promises to resolve
return $.when.apply(null, [].concat(_toConsumableArray(templates.map(function (template) {
return template.isShellTemplate() ? null : template.setClassesAndImportances();
})), _toConsumableArray(templates.map(function (template) {
return template.setParamDataAndSuggestions();
})))).then(function () {
// Add missing required/suggested values
templates.forEach(function (template) {
return template.addMissingParams();
});
// Return the now-modified templates
return templates;
});
});
// Check subject page features (task 5) - but don't error out if request fails
var subjectPageCheckPromise = _api["default"].get({
action: "query",
format: "json",
formatversion: "2",
prop: "categories",
titles: subjectPage.getPrefixedText(),
redirects: 1,
clcategories: ["Category:All disambiguation pages", "Category:All stub articles", "Category:Good articles", "Category:Featured articles", "Category:Featured lists"]
}).then(function (response) {
if (!response || !response.query || !response.query.pages) {
return null;
}
var redirectTarget = response.query.redirects && response.query.redirects[0].to || false;
if (redirectTarget || !subjectIsArticle) {
return {
redirectTarget: redirectTarget
};
}
var page = response.query.pages[0];
var hasCategory = function hasCategory(category) {
return page.categories && page.categories.find(function (cat) {
return cat.title === "Category:" + category;
});
};
return {
redirectTarget: redirectTarget,
disambig: hasCategory("All disambiguation pages"),
stubtag: hasCategory("All stub articles"),
isGA: hasCategory("Good articles"),
isFA: hasCategory("Featured articles"),
isFL: hasCategory("Featured lists"),
isList: !hasCategory("Featured lists") && /^Lists? of/.test(subjectPage.getPrefixedText())
};
})["catch"](function () {
return null;
}); // Failure ignored
// Retrieve rating from ORES (task 6, only needed for articles) - but don't error out if request fails
var shouldGetOres = subjectIsArticle; // TODO: Don't need to get ORES for redirects or disambigs
if (shouldGetOres) {
var latestRevIdPromise = !currentPage.isTalkPage() ? $.Deferred().resolve(_config["default"].mw.wgRevisionId) : _api["default"].get({
action: "query",
format: "json",
prop: "revisions",
titles: subjectPage.getPrefixedText(),
rvprop: "ids",
indexpageids: 1
}).then(function (result) {
if (result.query.redirects) {
return false;
}
var id = result.query.pageids;
var page = result.query.pages[id];
if (page.missing === "") {
return false;
}
if (id < 0) {
return $.Deferred().reject();
}
return page.revisions[0].revid;
});
var oresPromise = latestRevIdPromise.then(function (latestRevId) {
if (!latestRevId) {
return false;
}
return _api["default"].getORES(latestRevId).then(function (result) {
var data = result.enwiki.scores[latestRevId].articlequality;
if (data.error) {
return $.Deferred().reject(data.error.type, data.error.message);
}
var prediction = data.score.prediction;
var probabilities = data.score.probability;
if (prediction === "FA" || prediction === "GA") {
return {
prediction: "B or higher",
probability: ((probabilities.FA + probabilities.GA + probabilities.B) * 100).toFixed(1) + "%"
};
}
return {
prediction: prediction,
probability: (probabilities[prediction] * 100).toFixed(1) + "%"
};
})["catch"](function () {
return null;
}); // Failure ignored;
});
}
// Open the load dialog
var isOpenedPromise = $.Deferred();
var loadDialogWin = _windowManager["default"].openWindow("loadDialog", {
promises: [bannersPromise, loadTalkPromise, parseTalkPromise, templateDetailsPromise, subjectPageCheckPromise, shouldGetOres && oresPromise],
ores: shouldGetOres,
isOpened: isOpenedPromise
});
loadDialogWin.opened.then(isOpenedPromise.resolve);
$.when(prefsPromise, loadTalkPromise, templateDetailsPromise, subjectPageCheckPromise, shouldGetOres && oresPromise).then(
// All succeded
function (preferences, talkWikitext, banners, subjectPageCheck, oresPredicition) {
var result = {
success: true,
talkpage: talkPage,
subjectPage: subjectPage,
talkWikitext: talkWikitext,
banners: banners,
preferences: preferences,
isArticle: subjectIsArticle
};
if (subjectPageCheck) {
result = _objectSpread({}, result, {}, subjectPageCheck);
}
if (oresPredicition && subjectPageCheck && !subjectPageCheck.isGA && !subjectPageCheck.isFA && !subjectPageCheck.isFL) {
result.ores = oresPredicition;
}
_windowManager["default"].closeWindow("loadDialog", result);
}); // Any failures are handled by the loadDialog window itself
// On window closed, check data, and resolve/reject setupCompletedPromise
loadDialogWin.closed.then(function (data) {
if (data && data.success) {
// Got everything needed: Resolve promise with this data
setupCompletedPromise.resolve(data);
} else if (data && data.error) {
// There was an error: Reject promise with error code/info
setupCompletedPromise.reject(data.error.code, data.error.info);
} else {
// Window closed before completion: resolve promise without any data
setupCompletedPromise.resolve(null);
}
cache.clearInvalidItems();
});
return setupCompletedPromise;
};
var _default = setupRater; // </nowiki>
exports["default"] = _default;
},{"./Template":3,"./api":15,"./cache":17,"./config":18,"./getBanners":20,"./prefs":21,"./util":23,"./windowManager":24}],23:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.mostFrequent = mostFrequent;
exports.uniqueArray = uniqueArray;
exports.classMask = classMask;
exports.importanceMask = importanceMask;
exports.normaliseYesNo = exports.filterAndMap = exports.isAfterDate = void 0;
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
// <nowiki>
// Various utility functions and objects that might be used in multiple places
var isAfterDate = function isAfterDate(dateString) {
return new Date(dateString) < new Date();
};
exports.isAfterDate = isAfterDate;
var yesWords = ["add", "added", "affirm", "affirmed", "include", "included", "on", "true", "yes", "y", "1"];
var noWords = ["decline", "declined", "exclude", "excluded", "false", "none", "not", "no", "n", "off", "omit", "omitted", "remove", "removed", "0"];
var normaliseYesNo = function normaliseYesNo(val) {
if (val == null) {
return val;
}
var trimmedLcVal = val.trim().toLowerCase();
if (yesWords.includes(trimmedLcVal)) {
return "yes";
} else if (noWords.includes(trimmedLcVal)) {
return "no";
} else {
return trimmedLcVal;
}
};
/**
*
* @param {Array} array
* @param {Function} filterPredicate (currentVal, currentIndex, array) => {boolean}
* @param {Function} mapTransform (currentVal, currentIndex, array) => {any}
* @returns {Array}
*/
exports.normaliseYesNo = normaliseYesNo;
var filterAndMap = function filterAndMap(array, filterPredicate, mapTransform) {
return array.reduce(function (accumulated, currentVal, currentIndex) {
if (filterPredicate(currentVal, currentIndex, array)) {
return [].concat(_toConsumableArray(accumulated), [mapTransform(currentVal, currentIndex, array)]);
}
return accumulated;
}, []);
};
/**
*
* @param {string[]|number[]} array
* @returns {string|null} item with the highest frequency
* e.g. `mostFrequent(["apple", "apple", "orange"])` returns `"apple"`
*/
exports.filterAndMap = filterAndMap;
function mostFrequent(array) {
if (!array || !Array.isArray(array) || array.length === 0) return null;
var map = {};
var mostFreq = null;
array.forEach(function (item) {
map[item] = (map[item] || 0) + 1;
if (mostFreq === null || map[item] > map[mostFreq]) {
mostFreq = item;
}
});
return mostFreq;
}
/**
*
* @param {string[]|number[]} array
* @returns {string[]|number[]} array with only unique values
* e.g. `uniqueArray(["apple", "apple", "orange"])` returns `["apple", "orange"]`
*/
function uniqueArray(array) {
if (!array || !Array.isArray(array) || array.length === 0) return [];
var seen = {};
var unique = [];
array.forEach(function (item) {
if (!seen[item]) {
unique.push(item);
seen[item] = true;
}
});
return unique;
}
function classMask(classVal) {
if (!classVal) {
return classVal;
}
switch (classVal.toLowerCase()) {
case "fa":
case "fl":
case "a":
case "ga":
case "b":
case "c":
case "na":
case "fm":
case "al":
case "bl":
case "cl":
return classVal.toUpperCase();
case "start":
case "stub":
case "list":
case "portal":
case "project":
case "draft":
case "book":
case "future":
case "current":
case "complete":
case "substantial":
case "basic":
case "incomplete":
case "meta":
return classVal.slice(0, 1).toUpperCase() + classVal.slice(1).toLowerCase();
case "image":
case "img":
case "file":
return "File";
case "category":
case "cat":
case "categ":
return "Category";
case "disambiguation":
case "disambig":
case "disamb":
case "dab":
return "Disambig";
case "redirect":
case "redir":
case "red":
return "Redirect";
case "template":
case "temp":
case "tpl":
return "Template";
case "bplus":
case "b+":
return "Bplus";
case "fpo":
return "FPo";
default:
return classVal;
}
}
function importanceMask(importance) {
if (!importance) {
return importance;
}
if (importance.toLowerCase() === "na") {
return "NA";
}
return importance.slice(0, 1).toUpperCase() + importance.slice(1).toLowerCase();
}
// </nowiki>
},{}],24:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _LoadDialog = _interopRequireDefault(require("./Windows/LoadDialog"));
var _MainWindow = _interopRequireDefault(require("./Windows/MainWindow"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
// <nowiki>
var factory = new OO.Factory();
// Register window constructors with the factory.
factory.register(_LoadDialog["default"]);
factory.register(_MainWindow["default"]);
var manager = new OO.ui.WindowManager({
"factory": factory
});
$(document.body).append(manager.$element);
var _default = manager; // </nowiki>
exports["default"] = _default;
},{"./Windows/LoadDialog":13,"./Windows/MainWindow":14}]},{},[2])
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJwYWNrYWdlLmpzb24iLCJyYXRlci1zcmMvQXBwLmpzIiwicmF0ZXItc3JjL1RlbXBsYXRlLmpzIiwicmF0ZXItc3JjL1dpbmRvd3MvQ29tcG9uZW50cy9CYW5uZXJMaXN0V2lkZ2V0LmpzIiwicmF0ZXItc3JjL1dpbmRvd3MvQ29tcG9uZW50cy9CYW5uZXJXaWRnZXQuanMiLCJyYXRlci1zcmMvV2luZG93cy9Db21wb25lbnRzL0Ryb3Bkb3duUGFyYW1ldGVyV2lkZ2V0LmpzIiwicmF0ZXItc3JjL1dpbmRvd3MvQ29tcG9uZW50cy9Ib3Jpem9udGFsTGF5b3V0V2lkZ2V0LmpzIiwicmF0ZXItc3JjL1dpbmRvd3MvQ29tcG9uZW50cy9QYXJhbWV0ZXJMaXN0V2lkZ2V0LmpzIiwicmF0ZXItc3JjL1dpbmRvd3MvQ29tcG9uZW50cy9QYXJhbWV0ZXJXaWRnZXQuanMiLCJyYXRlci1zcmMvV2luZG93cy9Db21wb25lbnRzL1ByZWZzRm9ybVdpZGdldC5qcyIsInJhdGVyLXNyYy9XaW5kb3dzL0NvbXBvbmVudHMvU3VnZ2VzdGlvbkxvb2t1cFRleHRJbnB1dFdpZGdldC5qcyIsInJhdGVyLXNyYy9XaW5kb3dzL0NvbXBvbmVudHMvVG9wQmFyV2lkZ2V0LmpzIiwicmF0ZXItc3JjL1dpbmRvd3MvTG9hZERpYWxvZy5qcyIsInJhdGVyLXNyYy9XaW5kb3dzL01haW5XaW5kb3cuanMiLCJyYXRlci1zcmMvYXBpLmpzIiwicmF0ZXItc3JjL2F1dG9zdGFydC5qcyIsInJhdGVyLXNyYy9jYWNoZS5qcyIsInJhdGVyLXNyYy9jb25maWcuanMiLCJyYXRlci1zcmMvY3NzLmpzIiwicmF0ZXItc3JjL2dldEJhbm5lcnMuanMiLCJyYXRlci1zcmMvcHJlZnMuanMiLCJyYXRlci1zcmMvc2V0dXAuanMiLCJyYXRlci1zcmMvdXRpbC5qcyIsInJhdGVyLXNyYy93aW5kb3dNYW5hZ2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3JDQSxJQUFBLE1BQUEsR0FBQSxzQkFBQSxDQUFBLE9BQUE7QUFDQSxJQUFBLFVBQUEsR0FBQSxzQkFBQSxDQUFBLE9BQUE7QUFDQSxJQUFBLElBQUEsR0FBQSxzQkFBQSxDQUFBLE9BQUE7QUFDQSxJQUFBLElBQUEsR0FBQSxPQUFBO0FBQ0EsSUFBQSxjQUFBLEdBQUEsc0JBQUEsQ0FBQSxPQUFBO0FBQTRDLFNBQUEsdUJBQUEsR0FBQSxXQUFBLEdBQUEsSUFBQSxHQUFBLENBQUEsVUFBQSxHQUFBLEdBQUEsZ0JBQUEsR0FBQTtBQUM1Qzs7QUFFQSxDQUFDLFNBQVMsR0FBRyxDQUFBLEVBQUc7RUFDZixJQUFJLFVBQVU7RUFFZCxJQUFNLGNBQWMsR0FBRyxTQUFqQixjQUFjLENBQUcsSUFBSSxFQUFJO0lBQzlCLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO01BQzNCO0lBQ0Q7SUFDQSxJQUFJLFVBQVUsRUFBRTtNQUNmLFVBQVUsQ0FBQyxRQUFRLEdBQUcsS0FBSztJQUM1QixDQUFDLE1BQU07TUFDTixVQUFVLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBTSxDQUFDO0lBQ3BDO0lBQ0E7SUFDQSxRQUFRLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQztJQUMvRTtJQUNBLHlCQUFhLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FDcEMsTUFBTSxDQUFDLElBQUksQ0FBRSxVQUFBLE1BQU0sRUFBSTtNQUN2QjtNQUNBLElBQUksVUFBVSxFQUFFO1FBQUUsVUFBVSxDQUFDLFFBQVEsR0FBRyxJQUFJO01BQUU7TUFDOUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUM7TUFDbEY7TUFDQSxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQzdCLHlCQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FDbkMsSUFBSSxDQUFDLGlCQUFVLENBQUMsQ0FDaEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxjQUFjLENBQUM7UUFDdEM7TUFDRDtNQUNBO01BQ0EsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRTtRQUM3QixJQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUNsQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUNqRCxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFO1VBQ3hCLFFBQVEsQ0FBQyxNQUFNLENBQ2QsQ0FBQyxDQUFDLE1BQU0sQ0FBQztVQUNUO1VBQ0EsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyx1REFBdUQsQ0FDekUsQ0FBQztRQUNGO1FBQ0EsRUFBRSxDQUFDLE1BQU0sQ0FDUixRQUFRLEVBQ1I7VUFBRSxRQUFRLEVBQUUsSUFBSTtVQUFFLGVBQWUsRUFBRSxNQUFNO1VBQUUsR0FBRyxFQUFFO1FBQWMsQ0FDL0QsQ0FBQztNQUNGO0lBQ0QsQ0FBRSxDQUFDO0VBQ0wsQ0FBQztFQUVELElBQU0sY0FBYyxHQUFHLFNBQWpCLGNBQWMsQ0FBSSxJQUFJLEVBQUUsS0FBSztJQUFBLE9BQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQ2xELElBQUEsaUJBQVksRUFBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUU7TUFDMUIsS0FBSyxFQUFFO0lBQ1IsQ0FDRCxDQUFDO0VBQUE7O0VBRUQ7RUFDQSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FDckIsWUFBWSxFQUNaLEdBQUcsRUFDSCxPQUFPLEVBQ1AsVUFBVSxFQUNWLDZCQUE2QixFQUM3QixHQUNELENBQUM7RUFDRCxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQUEsS0FBSyxFQUFJO0lBQzdCLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN0QixJQUFBLGlCQUFVLEVBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDO0VBQ2xELENBQUMsQ0FBQzs7RUFFRjtFQUNBLElBQUEscUJBQVMsRUFBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztBQUNqQyxDQUFDLEVBQUUsQ0FBQztBQUNKOzs7Ozs7Ozs7O0FDN0VBLElBQUEsSUFBQSxHQUFBLHNCQUFBLENBQUEsT0FBQTtBQUNBLElBQUEsS0FBQSxHQUFBLE9BQUE7QUFDQSxJQUFBLE9BQUEsR0FBQSxzQkFBQSxDQUFBLE9BQUE7QUFDQSxJQUFBLEtBQUEsR0FBQSx1QkFBQSxDQUFBLE9BQUE7QUFBaUMsU0FBQSx5QkFBQSxlQUFBLE9BQUEsa0NBQUEsS0FBQSxPQUFBLE9BQUEsSUFBQSx3QkFBQSxZQUFBLHlCQUFBLFdBQUEsS0FBQSxZQUFBLEtBQUE7QUFBQSxTQUFBLHdCQUFBLEdBQUEsUUFBQSxHQUFBLElBQUEsR0FBQSxDQUFBLFVBQUEsV0FBQSxHQUFBLFFBQUEsR0FBQSxhQUFBLE9BQUEsQ0FBQSxHQUFBLHlCQUFBLEdBQUEsdUNBQUEsR0FBQSxVQUFBLEtBQUEsR0FBQSx3QkFBQSxRQUFBLEtBQUEsSUFBQSxLQUFBLENBQUEsR0FBQSxDQUFBLEdBQUEsWUFBQSxLQUFBLENBQUEsR0FBQSxDQUFBLEdBQUEsU0FBQSxNQUFBLFdBQUEscUJBQUEsR0FBQSxNQUFBLENBQUEsY0FBQSxJQUFBLE1BQUEsQ0FBQSx3QkFBQSxXQUFBLEdBQUEsSUFBQSxHQUFBLFFBQUEsTUFBQSxDQUFBLFNBQUEsQ0FBQSxjQUFBLENBQUEsSUFBQSxDQUFBLEdBQUEsRUFBQSxHQUFBLFNBQUEsSUFBQSxHQUFBLHFCQUFBLEdBQUEsTUFBQSxDQUFBLHdCQUFBLENBQUEsR0FBQSxFQUFBLEdBQUEsY0FBQSxJQUFBLEtBQUEsSUFBQSxDQUFBLEdBQUEsSUFBQSxJQUFBLENBQUEsR0FBQSxLQUFBLE1BQUEsQ0FBQSxjQUFBLENBQUEsTUFBQSxFQUFBLEdBQUEsRUFBQSxJQUFBLFlBQUEsTUFBQSxDQUFBLEdBQUEsSUFBQSxHQUFBLENBQUEsR0FBQSxTQUFBLE1BQUEsY0FBQSxHQUFBLE1BQUEsS0FBQSxJQUFBLEtBQUEsQ0FBQSxHQUFBLENBQUEsR0FBQSxFQUFBLE1BQUEsWUFBQSxNQUFBO0FBQUEsU0FBQSx1QkFBQSxHQUFBLFdBQUEsR0FBQSxJQUFBLEdBQUEsQ0FBQSxVQUFBLEdBQUEsR0FBQSxnQkFBQSxHQUFBO0FBQUEsU0FBQSxtQkFBQSxHQUFBLFdBQUEsa0JBQUEsQ0FBQSxHQUFBLEtBQUEsZ0JBQUEsQ0FBQSxHQUFBLEtBQUEsMkJBQUEsQ0FBQSxHQUFBLEtBQUEsa0JBQUE7QUFBQSxTQUFBLG1CQUFBLGNBQUEsU0FBQTtBQUFBLFNBQUEsNEJBQUEsQ0FBQSxFQUFBLE1BQUEsU0FBQSxDQUFBLHFCQUFBLENBQUEsc0JBQUEsaUJBQUEsQ0FBQSxDQUFBLEVBQUEsTUFBQSxPQUFBLENBQUEsR0FBQSxNQUFBLENBQUEsU0FBQSxDQUFBLFFBQUEsQ0FBQSxJQUFBLENBQUEsQ0FBQSxFQUFBLEtBQUEsYUFBQSxDQUFBLGlCQUFBLENBQUEsQ0FBQSxXQUFBLEVBQUEsQ0FBQSxHQUFBLENBQUEsQ0FBQSxXQUFBLENBQUEsSUFBQSxNQUFBLENBQUEsY0FBQSxDQUFBLG1CQUFBLEtBQUEsQ0FBQSxJQUFBLENBQUEsQ0FBQSxPQUFBLENBQUEsK0RBQUEsSUFBQSxDQUFBLENBQUEsVUFBQSxpQkFBQSxDQUFBLENBQUEsRUFBQSxNQUFBO0FBQUEsU0FBQSxpQkFBQSxJQUFBLGVBQUEsTUFBQSxvQkFBQSxNQUFBLENBQUEsUUFBQSxJQUFBLE1BQUEsQ0FBQSxJQUFBLFVBQUEsS0FBQSxDQUFBLElBQUEsQ0FBQSxJQUFBO0FBQUEsU0FBQSxtQkFBQSxHQUFBLFFBQUEsS0FBQSxDQUFBLE9BQUEsQ0FBQSxHQUFBLFVBQUEsaUJBQUEsQ0FBQSxHQUFBO0FBQUEsU0FBQSxrQkFBQSxHQUFBLEVBQUEsR0FBQSxRQUFBLEdBQUEsWUFBQSxHQUFBLEdBQUEsR0FBQSxDQUFBLE1BQUEsRUFBQSxHQUFBLEdBQUEsR0FBQSxDQUFBLE1BQUEsV0FBQSxDQUFBLE1BQUEsSUFBQSxPQUFBLEtBQUEsQ0FBQSxHQUFBLEdBQUEsQ0FBQSxHQUFBLEdBQUEsRUFBQSxDQUFBLE1BQUEsSUFBQSxDQUFBLENBQUEsSUFBQSxHQUFBLENBQUEsQ0FBQSxZQUFBLElBQUE7QUFDakM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxRQUFRLEdBQUcsU0FBWCxRQUFRLENBQVksUUFBUSxFQUFFO0VBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUTtFQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUU7RUFDcEI7RUFDQSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUk7RUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHO0VBQ3RCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSTtBQUMzQixDQUFDO0FBQUMsT0FBQSxDQUFBLFFBQUEsR0FBQSxRQUFBO0FBQ0YsUUFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsVUFBUyxJQUFJLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRTtFQUMzRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztJQUNwQixNQUFNLEVBQUUsSUFBSTtJQUNaLE9BQU8sRUFBRSxHQUFHO0lBQ1osVUFBVSxFQUFFLEdBQUcsR0FBRztFQUNuQixDQUFDLENBQUM7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsUUFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsVUFBUyxTQUFTLEVBQUU7RUFDakQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFTLENBQUMsRUFBRTtJQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksSUFBSSxTQUFTO0VBQUUsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFDRCxRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxVQUFTLElBQUksRUFBRTtFQUMzQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN4QixDQUFDO0FBQ0QsUUFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsWUFBVztFQUN4QyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3JELENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksY0FBYyxHQUFHLFNBQWpCLGNBQWMsQ0FBWSxRQUFRLEVBQUUsU0FBUyxFQUFFO0VBQUU7RUFDcEQsSUFBSSxDQUFDLFFBQVEsRUFBRTtJQUNkLE9BQU8sRUFBRTtFQUNWO0VBQ0EsSUFBSSxZQUFZLEdBQUcsU0FBZixZQUFZLENBQVksTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFJLEVBQUU7SUFDaEQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBQyxLQUFLLENBQUMsR0FBRyxLQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0VBQzlELENBQUM7RUFFRCxJQUFJLE1BQU0sR0FBRyxFQUFFO0VBRWYsSUFBSSxtQkFBbUIsR0FBRyxTQUF0QixtQkFBbUIsQ0FBYSxRQUFRLEVBQUUsTUFBTSxFQUFFO0lBQ3JELElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQztJQUUzQyxJQUFJLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDOztJQUVwRTtJQUNBO0lBQ0EsT0FBUSwyQkFBMkIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUc7TUFDaEQsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsMkJBQTJCLEVBQUUsVUFBVSxDQUFDO0lBQzdEOztJQUVBO0lBQ0EsUUFBUSxDQUFDLFNBQVMsR0FBRyxJQUFBLGtCQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBRSxDQUFDLElBQUksSUFBSTtJQUM1RSxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUEsa0JBQVksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUUsQ0FBQyxJQUFJLEdBQUc7SUFDekc7SUFDQSxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztJQUN2QyxRQUFRLENBQUMsY0FBYyxHQUFHLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksSUFBSTtJQUVsRSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFTLEtBQUssRUFBRTtNQUNoRDtNQUNBLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUMsR0FBRyxDQUFDO0lBQ2xDLENBQUMsQ0FBQztJQUVGLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTNCLElBQUksZUFBZSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBRXJDLElBQUksVUFBVSxHQUFHLENBQUM7SUFDbEIsZUFBZSxDQUFDLE9BQU8sQ0FBQyxVQUFTLEtBQUssRUFBRTtNQUN2QyxJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztNQUN2QyxJQUFJLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO01BRTNDLElBQUksZUFBZSxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7TUFDMUMsSUFBSSxxQkFBcUIsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLGlCQUFpQixHQUFHLGNBQWM7TUFDdEYsSUFBSSxjQUFjLEdBQUssZUFBZSxJQUFJLHFCQUF1QjtNQUVqRSxJQUFJLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSTtNQUNyQixJQUFLLGNBQWMsRUFBRztRQUNyQjtRQUNBO1FBQ0EsT0FBUSxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFHO1VBQ3ZDLFVBQVUsRUFBRTtRQUNiO1FBQ0EsSUFBSSxHQUFHLFVBQVU7UUFDakIsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztNQUNwQixDQUFDLE1BQU07UUFDTixLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0MsSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO01BQzlDO01BQ0EsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUM7SUFDOUMsQ0FBQyxDQUFDO0lBRUYsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7RUFDdEIsQ0FBQztFQUdELElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNOztFQUV2QjtFQUNBLElBQUksV0FBVyxHQUFHLENBQUM7O0VBRW5CO0VBQ0EsSUFBSSxTQUFTLEdBQUcsS0FBSztFQUNyQixJQUFJLFFBQVEsR0FBRyxLQUFLO0VBQ3BCLElBQUksV0FBVyxHQUFHLEtBQUs7RUFFdkIsSUFBSSxRQUFRLEVBQUUsTUFBTTtFQUVwQixLQUFLLElBQUksQ0FBQyxHQUFDLENBQUMsRUFBRSxDQUFDLEdBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0lBRXZCLElBQUssQ0FBQyxTQUFTLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxXQUFXLEVBQUc7TUFFOUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLFFBQVEsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLFFBQVEsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLFFBQVEsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO1FBQ25HLFdBQVcsR0FBRyxJQUFJO1FBQ2xCLENBQUMsSUFBSSxDQUFDO01BQ1AsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxRQUFRLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtRQUN4RCxJQUFJLFdBQVcsS0FBSyxDQUFDLEVBQUU7VUFDdEIsUUFBUSxHQUFHLENBQUMsR0FBQyxDQUFDO1FBQ2Y7UUFDQSxXQUFXLElBQUksQ0FBQztRQUNoQixDQUFDLEVBQUU7TUFDSixDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLFFBQVEsQ0FBQyxDQUFDLEdBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO1FBQ3hELElBQUksV0FBVyxLQUFLLENBQUMsRUFBRTtVQUN0QixNQUFNLEdBQUcsQ0FBQztVQUNWLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUM7UUFDdEM7UUFDQSxXQUFXLElBQUksQ0FBQztRQUNoQixDQUFDLEVBQUU7TUFDSixDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUU7UUFDbEQ7UUFDQSxRQUFRLEdBQUcsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUMsTUFBTSxDQUFDO01BQzVDLENBQUMsTUFBTSxJQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUc7UUFDcEQsU0FBUyxHQUFHLElBQUk7UUFDaEIsQ0FBQyxJQUFJLENBQUM7TUFDUCxDQUFDLE1BQU0sSUFBSyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFHO1FBQzFELFFBQVEsR0FBRyxJQUFJO1FBQ2YsQ0FBQyxJQUFJLENBQUM7TUFDUDtJQUVELENBQUMsTUFBTTtNQUFFO01BQ1IsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO1FBQ3hCO1FBQ0EsUUFBUSxHQUFHLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFDLE1BQU0sQ0FBQztNQUM1QyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ2pELFNBQVMsR0FBRyxLQUFLO1FBQ2pCLENBQUMsSUFBSSxDQUFDO01BQ1AsQ0FBQyxNQUFNLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRTtRQUMzRCxRQUFRLEdBQUcsS0FBSztRQUNoQixDQUFDLElBQUksQ0FBQztNQUNQLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksUUFBUSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksUUFBUSxDQUFDLENBQUMsR0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7UUFDakYsV0FBVyxHQUFHLEtBQUs7UUFDbkIsQ0FBQyxJQUFJLENBQUM7TUFDUDtJQUNEO0VBRUQ7RUFFQSxJQUFLLFNBQVMsRUFBRztJQUNoQixJQUFJLFlBQVksR0FBRyxJQUFBLGtCQUFZLEVBQUMsTUFBTSxFQUNyQyxVQUFBLFFBQVE7TUFBQSxPQUFJLG1CQUFtQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUFBLEdBQ25FLFVBQUEsUUFBUTtNQUFBLE9BQUksY0FBYyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztJQUFBLENBQ2hFLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUM7RUFDakQ7RUFFQSxPQUFPLE1BQU07QUFDZCxDQUFDLENBQUMsQ0FBQzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUhBLE9BQUEsQ0FBQSxjQUFBLEdBQUEsY0FBQTtBQUlBLElBQUksaUJBQWlCLEdBQUcsU0FBcEIsaUJBQWlCLENBQVksU0FBUyxFQUFFO0VBQzNDLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsU0FBUyxHQUFHLENBQUMsU0FBUyxDQUFDO0VBQ3ZFLElBQUksY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7SUFDaEMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO0VBQ2hDO0VBRUEsT0FBTyxlQUFHLENBQUMsR0FBRyxDQUFDO0lBQ2QsUUFBUSxFQUFFLE9BQU87SUFDakIsUUFBUSxFQUFFLE1BQU07SUFDaEIsUUFBUSxFQUFFLElBQUEsa0JBQVksRUFBQyxjQUFjLEVBQ3BDLFVBQUEsUUFBUTtNQUFBLE9BQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssSUFBSTtJQUFBLEdBQ3hDLFVBQUEsUUFBUTtNQUFBLE9BQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUM7SUFBQSxDQUNsRCxDQUFDO0lBQ0QsV0FBVyxFQUFFO0VBQ2QsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVMsTUFBTSxFQUFFO0lBQ3hCLElBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFHO01BQy9CLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDO0lBQzdDO0lBQ0EsSUFBSyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRztNQUM3QixNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBUyxRQUFRLEVBQUU7UUFDakQsSUFBSSxDQUFDLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQyxVQUFBLFFBQVEsRUFBSTtVQUM1QyxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7VUFDL0IsT0FBTyxLQUFLLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLElBQUk7UUFDMUQsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7VUFDYixjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDckU7TUFDRCxDQUFDLENBQUM7SUFDSDtJQUNBLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxjQUFjLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQztFQUNyRSxDQUFDLENBQUM7QUFDSCxDQUFDO0FBQUMsT0FBQSxDQUFBLGlCQUFBLEdBQUEsaUJBQUE7QUFFRixRQUFRLENBQUMsU0FBUyxDQUFDLGVBQWUsR0FBRyxVQUFTLEdBQUcsRUFBRSxRQUFRLEVBQUU7RUFDNUQsSUFBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUc7SUFDdEIsT0FBTyxJQUFJO0VBQ1o7RUFDQTtFQUNBLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUTtFQUNsRCxJQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRztJQUM1QjtFQUNEO0VBRUEsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUM7RUFDcEM7RUFDQSxJQUFLLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRztJQUM5QyxPQUFPLElBQUksQ0FBQyxFQUFFO0VBQ2Y7RUFDQSxPQUFPLElBQUk7QUFDWixDQUFDO0FBRUQsUUFBUSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEdBQUcsWUFBVztFQUMvQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxHQUMvQixJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0VBQ2hDLE9BQU8sa0JBQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztBQUNoRCxDQUFDO0FBRUQsUUFBUSxDQUFDLFNBQVMsQ0FBQywwQkFBMEIsR0FBRyxZQUFXO0VBQzFELElBQUksSUFBSSxHQUFHLElBQUk7RUFDZixJQUFJLFlBQVksR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7RUFFL0IsSUFBSyxJQUFJLENBQUMsU0FBUyxFQUFHO0lBQUUsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7RUFBRTtFQUV2RCxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsY0FBYyxHQUNuQyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQ3JDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0VBRXBDLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztFQUVyRCxJQUNDLFVBQVUsSUFDVixVQUFVLENBQUMsS0FBSyxJQUNoQixVQUFVLENBQUMsU0FBUyxJQUNwQixVQUFVLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxJQUFJLElBQ2xDLFVBQVUsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLElBQUksSUFBSSxJQUM3QyxVQUFVLENBQUMsS0FBSyxDQUFDLFlBQVksSUFBSSxJQUFJLEVBQ3BDO0lBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLGNBQWM7SUFDckQsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLFNBQVM7SUFDM0MsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsb0JBQW9CO0lBQ2pFLElBQUksQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxZQUFZO0lBRWpELFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0QixJQUFLLENBQUMsSUFBQSxpQkFBVyxFQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRztNQUN6QztNQUNBLE9BQU8sWUFBWTtJQUNwQixDQUFDLENBQUM7RUFDSDtFQUVBLGVBQUcsQ0FBQyxHQUFHLENBQUM7SUFDUCxNQUFNLEVBQUUsY0FBYztJQUN0QixNQUFNLEVBQUUsWUFBWTtJQUNwQixTQUFTLEVBQUUsQ0FBQztJQUNaLG9CQUFvQixFQUFFO0VBQ3ZCLENBQUMsQ0FBQyxDQUNBLElBQUksQ0FDSixVQUFTLFFBQVEsRUFBRTtJQUFFLE9BQU8sUUFBUTtFQUFFLENBQUMsRUFDdkMsU0FBUyxhQUFXO0lBQUUsT0FBTyxJQUFJO0VBQUUsQ0FBQyxDQUFDO0VBQ3RDLENBQUMsQ0FDQSxJQUFJLENBQUUsVUFBUyxNQUFNLEVBQUU7SUFDeEI7SUFDQyxJQUFJLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFVBQVUsTUFBTSxFQUFFLEdBQUcsRUFBRztNQUFFLE9BQU8sR0FBRztJQUFFLENBQUMsQ0FBQztJQUUvRSxJQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGNBQWMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFHO01BQ25HO01BQ0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJO01BQzFCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLE1BQU07TUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxrQkFBTSxDQUFDLG9CQUFvQjtJQUM3QyxDQUFDLE1BQU07TUFDTixJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTTtJQUN6QztJQUVBLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFTLFFBQVEsRUFBRSxRQUFRLEVBQUU7TUFDbkQ7TUFDQSxJQUFLLFFBQVEsQ0FBQyxPQUFPLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUc7UUFDbEQsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBUyxLQUFLLEVBQUM7VUFDdkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRO1FBQ3BDLENBQUMsQ0FBQztNQUNIO01BQ0E7TUFDQSxJQUFLLFFBQVEsQ0FBQyxXQUFXLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUc7UUFDN0UsSUFBSTtVQUNILElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQzNCLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUNyQixPQUFPLENBQUMsT0FBTyxFQUFDLEdBQUcsQ0FBQyxDQUNwQixPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUNyQixPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUNuQixPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUNyQixPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FDdEIsQ0FBQztVQUNELElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsYUFBYSxHQUFHLFdBQVc7UUFDckQsQ0FBQyxDQUFDLE9BQU0sQ0FBQyxFQUFFO1VBQ1YsT0FBTyxDQUFDLElBQUksQ0FBQyw0REFBNEQsR0FDMUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEdBQUcsdUNBQXVDLEdBQUcsUUFBUSxHQUM1RSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztRQUM1QztNQUNEO0lBQ0QsQ0FBQyxDQUFDOztJQUVGO0lBQ0EsSUFBSSxjQUFjLEdBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxJQUMxRSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsVUFBUyxJQUFJLEVBQUUsR0FBRyxFQUFDO01BQ3hDLE9BQU8sR0FBRztJQUNYLENBQUMsQ0FBQztJQUNGLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLFVBQVMsU0FBUyxFQUFFO01BQ3JFLE9BQVMsU0FBUyxJQUFJLFNBQVMsS0FBSyxPQUFPLElBQUksU0FBUyxLQUFLLFlBQVk7SUFDMUUsQ0FBQyxDQUFDLENBQ0EsR0FBRyxDQUFDLFVBQVMsU0FBUyxFQUFFO01BQ3hCLElBQUksWUFBWSxHQUFHO1FBQUMsSUFBSSxFQUFFO01BQVMsQ0FBQztNQUNwQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUM7TUFDbEQsSUFBSyxLQUFLLEVBQUc7UUFDWixZQUFZLENBQUMsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsU0FBUyxHQUFHLElBQUk7TUFDdEQ7TUFDQSxPQUFPLFlBQVk7SUFDcEIsQ0FBQyxDQUFDO0lBRUgsSUFBSyxJQUFJLENBQUMsb0JBQW9CLEVBQUc7TUFDaEM7TUFDQSxPQUFPLElBQUk7SUFDWjtJQUVBLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLFNBQVMsRUFBRTtNQUNyQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7TUFDbkMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO01BQ3pCLG9CQUFvQixFQUFFLElBQUksQ0FBQyxvQkFBb0I7TUFDL0MsWUFBWSxFQUFFLElBQUksQ0FBQztJQUNwQixDQUFDLEVBQUUsQ0FDSCxDQUFDO0lBQ0QsT0FBTyxJQUFJO0VBQ1osQ0FBQyxDQUFDLENBQ0QsSUFBSSxDQUNKLFlBQVksQ0FBQyxPQUFPLEVBQ3BCLFlBQVksQ0FBQyxNQUNkLENBQUM7RUFFRixPQUFPLFlBQVk7QUFDcEIsQ0FBQztBQUVELElBQUksVUFBVSxHQUFHLFNBQWIsVUFBVSxDQUFZLFlBQVksRUFBRTtFQUN2QyxJQUFJLElBQUksR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztFQUM3RCxJQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUc7SUFDL0IsT0FBTyxJQUFJO0VBQ1o7RUFDQSxJQUFJLGtCQUFrQixHQUFHLEVBQUU7RUFDM0IsSUFBSyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUc7SUFDeEMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RELElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLElBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRztNQUMvQixPQUFPLElBQUksR0FBRyxrQkFBa0I7SUFDakM7RUFDRDtFQUNBLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztFQUNwRSxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3JELE9BQU8sUUFBUSxHQUFHLElBQUksR0FBRyxVQUFVLEdBQUcsa0JBQWtCO0FBQ3pELENBQUM7QUFFRCxRQUFRLENBQUMsU0FBUyxDQUFDLGdCQUFnQixHQUFHLFlBQVc7RUFDaEQsSUFBSSxZQUFZLEdBQUcsSUFBSTs7RUFFdkI7RUFDQSxJQUFJLGlCQUFpQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssdUJBQXVCLElBQy9FLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLHVCQUF3QjtFQUV2RixJQUFJLGlCQUFpQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtJQUNsRCxJQUFJLFlBQVksR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxrQkFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM5RSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztNQUNwQixJQUFJLEVBQUUsUUFBUTtNQUNkLEtBQUssRUFBRSxVQUFVLENBQUMsWUFBWSxDQUFDO01BQy9CLFVBQVUsRUFBRTtJQUNiLENBQUMsQ0FBQztFQUNIOztFQUVBO0VBQ0EsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLFVBQVMsUUFBUSxFQUFFLFFBQVEsRUFBRTtJQUMzRCxJQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsU0FBUyxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRztNQUNwRjtNQUNBLElBQUssUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUc7UUFDOUIsSUFBSSxPQUFPLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBQSxDQUFDLEVBQUk7VUFDakQsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztVQUMvQyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLO1VBQ3RCLE9BQU8sT0FBTyxJQUFJLENBQUMsT0FBTztRQUMzQixDQUFDLENBQUM7UUFDRixJQUFLLE9BQU8sQ0FBQyxNQUFNLEVBQUc7VUFDdEI7VUFDQztRQUNEO01BQ0Q7TUFDQTtNQUNBO01BQ0E7TUFDQSxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztRQUM1QixJQUFJLEVBQUMsUUFBUTtRQUNiLEtBQUssRUFBRSxRQUFRLENBQUMsU0FBUyxJQUFJLElBQUk7UUFDakMsVUFBVSxFQUFFO01BQ2IsQ0FBQyxDQUFDO0lBQ0g7RUFDRCxDQUFDLENBQUM7RUFFRixPQUFPLFlBQVk7QUFDcEIsQ0FBQztBQUVELFFBQVEsQ0FBQyxTQUFTLENBQUMsd0JBQXdCLEdBQUcsWUFBVztFQUFBLElBQUEsS0FBQTtFQUN4RCxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7O0VBRXpCO0VBQ0EsSUFBSyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRztJQUM3QixJQUFJLENBQUMsT0FBTyxHQUFBLGtCQUFBLENBQU8sa0JBQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDO0lBQ2pELE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0VBQ3hCLENBQUMsTUFBTSxJQUFNLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSyxJQUFJLENBQUMsY0FBYyxFQUFHO0lBQ3ZFLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0VBQ3hCO0VBRUEsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7O0VBRTVDO0VBQ0EsSUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxRQUFRO0VBQ25HLElBQUssa0JBQU0sQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsRUFBRztJQUNyRCxJQUFJLENBQUMsT0FBTyxHQUFHLGtCQUFNLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLENBQUMsT0FBTztJQUNyRSxJQUFJLENBQUMsV0FBVyxHQUFHLGtCQUFNLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLENBQUMsV0FBVztJQUM3RSxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztFQUN4Qjs7RUFFQTtFQUNBLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFDLFVBQVUsQ0FBQztFQUNuRCxJQUNDLGFBQWEsSUFDYixhQUFhLENBQUMsS0FBSyxJQUNuQixhQUFhLENBQUMsU0FBUyxJQUN2QixhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBRSxJQUFJLElBQ2pDLGFBQWEsQ0FBQyxLQUFLLENBQUMsV0FBVyxJQUFFLElBQUksRUFDcEM7SUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTztJQUMxQyxJQUFJLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsV0FBVztJQUNsRCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEIsSUFBSyxDQUFDLElBQUEsaUJBQVcsRUFBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEVBQUc7TUFDNUM7TUFDQSxPQUFPLE1BQU07SUFDZCxDQUFDLENBQUM7RUFDSDtFQUVBLElBQUksZUFBZSxHQUFHLEVBQUU7RUFDeEIsa0JBQU0sQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxVQUFTLFNBQVMsRUFBRSxLQUFLLEVBQUU7SUFDeEUsZUFBZSxJQUFJLElBQUksR0FBRyxRQUFRLEdBQUcsU0FBUyxHQUFHLFNBQVMsR0FBRyxjQUFjLElBQzFFLGtCQUFNLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLE1BQU07RUFDbEUsQ0FBQyxDQUFDO0VBRUYsT0FBTyxlQUFHLENBQUMsR0FBRyxDQUFDO0lBQ2QsTUFBTSxFQUFFLE9BQU87SUFDZixLQUFLLEVBQUUsY0FBYztJQUNyQixJQUFJLEVBQUUsZUFBZTtJQUNyQixJQUFJLEVBQUU7RUFDUCxDQUFDLENBQUMsQ0FDQSxJQUFJLENBQUMsVUFBQyxNQUFNLEVBQUs7SUFDakIsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDO0lBQy9DLElBQUksZUFBZSxHQUFHLGtCQUFNLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsVUFBUyxFQUFFLEVBQUU7TUFDL0UsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUMsQ0FBQyxDQUFDO0lBQ0YsS0FBSSxDQUFDLE9BQU8sTUFBQSxNQUFBLENBQUEsa0JBQUEsQ0FBTyxrQkFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEdBQUEsa0JBQUEsQ0FBSyxlQUFlLEVBQUM7SUFDckUsS0FBSSxDQUFDLFdBQVcsR0FBRyxrQkFBTSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsVUFBUyxHQUFHLEVBQUU7TUFDakYsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEQsQ0FBQyxDQUFDO0lBQ0YsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUMsVUFBVSxFQUM5QjtNQUNDLE9BQU8sRUFBRSxLQUFJLENBQUMsT0FBTztNQUNyQixXQUFXLEVBQUUsS0FBSSxDQUFDO0lBQ25CLENBQUMsRUFDRCxDQUNELENBQUM7SUFDRCxPQUFPLElBQUk7RUFDWixDQUFDLENBQUM7QUFDSixDQUFDOztBQUdEOzs7Ozs7Ozs7QUN0aUJBLElBQUEsT0FBQSxHQUFBLHNCQUFBLENBQUEsT0FBQTtBQUNBLElBQUEsYUFBQSxHQUFBLHNCQUFBLENBQUEsT0FBQTtBQUNBLElBQUEsS0FBQSxHQUFBLE9BQUE7QUFDQSxJQUFBLGdCQUFBLEdBQUEsc0JBQUEsQ0FBQSxPQUFBO0FBQWdELFNBQUEsdUJBQUEsR0FBQSxXQUFBLEdBQUEsSUFBQSxHQUFBLENBQUEsVUFBQSxHQUFBLEdBQUEsZ0JBQUEsR0FBQTtBQUFBLFNBQUEsZUFBQSxHQUFBLEVBQUEsQ0FBQSxXQUFBLGVBQUEsQ0FBQSxHQUFBLEtBQUEscUJBQUEsQ0FBQSxHQUFBLEVBQUEsQ0FBQSxLQUFBLDJCQUFBLENBQUEsR0FBQSxFQUFBLENBQUEsS0FBQSxnQkFBQTtBQUFBLFNBQUEsaUJBQUEsY0FBQSxTQUFBO0FBQUEsU0FBQSw0QkFBQSxDQUFBLEVBQUEsTUFBQSxTQUFBLENBQUEscUJBQUEsQ0FBQSxzQkFBQSxpQkFBQSxDQUFBLENBQUEsRUFBQSxNQUFBLE9BQUEsQ0FBQSxHQUFBLE1BQUEsQ0FBQSxTQUFBLENBQUEsUUFBQSxDQUFBLElBQUEsQ0FBQSxDQUFBLEVBQUEsS0FBQSxhQUFBLENBQUEsaUJBQUEsQ0FBQSxDQUFBLFdBQUEsRUFBQSxDQUFBLEdBQUEsQ0FBQSxDQUFBLFdBQUEsQ0FBQSxJQUFBLE1BQUEsQ0FBQSxjQUFBLENBQUEsbUJBQUEsS0FBQSxDQUFBLElBQUEsQ0FBQSxDQUFBLE9BQUEsQ0FBQSwrREFBQSxJQUFBLENBQUEsQ0FBQSxVQUFBLGlCQUFBLENBQUEsQ0FBQSxFQUFBLE1BQUE7QUFBQSxTQUFBLGtCQUFBLEdBQUEsRUFBQSxHQUFBLFFBQUEsR0FBQSxZQUFBLEdBQUEsR0FBQSxHQUFBLENBQUEsTUFBQSxFQUFBLEdBQUEsR0FBQSxHQUFBLENBQUEsTUFBQSxXQUFBLENBQUEsTUFBQSxJQUFBLE9BQUEsS0FBQSxDQUFBLEdBQUEsR0FBQSxDQUFBLEdBQUEsR0FBQSxFQUFBLENBQUEsTUFBQSxJQUFBLENBQUEsQ0FBQSxJQUFBLEdBQUEsQ0FBQSxDQUFBLFlBQUEsSUFBQTtBQUFBLFNBQUEsc0JBQUEsR0FBQSxFQUFBLENBQUEsZUFBQSxNQUFBLHNCQUFBLE1BQUEsQ0FBQSxRQUFBLElBQUEsTUFBQSxDQUFBLEdBQUEsZ0JBQUEsSUFBQSxXQUFBLEVBQUEsYUFBQSxFQUFBLGNBQUEsRUFBQSxHQUFBLFNBQUEsaUJBQUEsRUFBQSxHQUFBLEdBQUEsQ0FBQSxNQUFBLENBQUEsUUFBQSxLQUFBLEVBQUEsSUFBQSxFQUFBLElBQUEsRUFBQSxHQUFBLEVBQUEsQ0FBQSxJQUFBLElBQUEsSUFBQSxHQUFBLEVBQUEsV0FBQSxJQUFBLENBQUEsSUFBQSxDQUFBLEVBQUEsQ0FBQSxLQUFBLE9BQUEsQ0FBQSxJQUFBLElBQUEsQ0FBQSxNQUFBLEtBQUEsQ0FBQSxvQkFBQSxHQUFBLElBQUEsRUFBQSxTQUFBLEVBQUEsR0FB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QUFBO0FBQWdELFNBQUEsdUJBQUEsR0FBQSxXQUFBLEdBQUEsSUFBQSxHQUFBLENBQUEsVUFBQSxHQUFBLEdBQUEsZ0JBQUEsR0FBQTtBQUFBLFNBQUEsbUJBQUEsR0FBQSxXQUFBLGtCQUFBLENBQUEsR0FBQSxLQUFBLGdCQUFBLENBQUEsR0FBQSxLQUFBLDJCQUFBLENBQUEsR0FBQSxLQUFBLGtCQUFBO0FBQUEsU0FBQSxtQkFBQSxjQUFBLFNBQUE7QUFBQSxTQUFBLDRCQUFBLENBQUEsRUFBQSxNQUFBLFNBQUEsQ0FBQSxxQkFBQSxDQUFBLHNCQUFBLGlCQUFBLENBQUEsQ0FBQSxFQUFBLE1BQUEsT0FBQSxDQUFBLEdBQUEsTUFBQSxDQUFBLFNBQUEsQ0FBQSxRQUFBLENBQUEsSUFBQSxDQUFBLENBQUEsRUFBQSxLQUFBLGFBQUEsQ0FBQSxpQkFBQSxDQUFBLENBQUEsV0FBQSxFQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsV0FBQSxDQUFBLElBQUEsTUFBQSxDQUFBLGNBQUEsQ0FBQSxtQkFBQSxLQUFBLENBQUEsSUFBQSxDQUFBLENBQUEsT0FBQSxDQUFBLCtEQUFBLElBQUEsQ0FBQSxDQUFBLFVBQUEsaUJBQUEsQ0FBQSxDQUFBLEVBQUEsTUFBQTtBQUFBLFNBQUEsaUJBQUEsSUFBQSxlQUFBLE1BQUEsb0JBQUEsTUFBQSxDQUFBLFFBQUEsSUFBQSxNQUFBLENBQUEsSUFBQSxVQUFBLEtBQUEsQ0FBQSxJQUFBLENBQUEsSUFBQTtBQUFBLFNBQUEsbUJBQUEsR0FBQSxRQUFBLEtBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxVQUFBLGlCQUFBLENBQUEsR0FBQTtBQUFBLFNBQUEsa0JBQUEsR0FBQSxFQUFBLEdBQUEsUUFBQSxHQUFBLFlBQUEsR0FBQSxHQUFBLEdBQUEsQ0FBQSxNQUFBLEVBQUEsR0FBQSxHQUFBLEdBQUEsQ0FBQSxNQUFBLFdBQUEsQ0FBQSxNQUFBLElBQUEsT0FBQSxLQUFBLENBQUEsR0FBQSxHQUFBLENBQUEsR0FBQSxHQUFBLEVBQUEsQ0FBQSxNQUFBLElBQUEsQ0FBQSxDQUFB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QUM7RUFBQSxFQUFDO0FBQ2pELENBQUM7QUFBQyxJQUFBLFFBQUEsR0FFYSxZQUFZLEVBQzNCO0FBQUEsT0FBQSxjQUFBLFFBQUE7Ozs7Ozs7OztBQzdNQSxJQUFBLElBQUEsR0FBQSxPQUFBO0FBQXNDLFNBQUEsbUJBQUEsR0FBQSxXQUFBLGtCQUFBLENBQUEsR0FBQSxLQUFBLGdCQUFBLENBQUEsR0FBQSxLQUFBLDJCQUFBLENBQUEsR0FBQSxLQUFBLGtCQUFBO0FBQUEsU0FBQSxtQkFBQSxjQUFBLFNBQUE7QUFBQSxTQUFBLDRCQUFBLENBQUEsRUFBQSxNQUFBLFNBQUEsQ0FBQSxxQkFBQSxDQUFBLHNCQUFBLGlCQUFBLENBQUEsQ0FBQSxFQUFBLE1BQUEsT0FBQSxDQUFBLEdBQUEsTUFBQSxDQUFBLFNBQUEsQ0FBQSxRQUFBLENBQUEsSUFBQSxDQUFBLENBQUEsRUFBQSxLQUFBLGFBQUEsQ0FBQSxpQkFBQSxDQUFBLENBQUEsV0FBQSxFQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsV0FBQSxDQUFBLElBQUEsTUFBQSxDQUFBLGNBQUEsQ0FBQSxtQkFBQSxLQUFBLENBQUEsSUFBQSxDQUFBLENBQUEsT0FBQSxDQUFBLCtEQUFBLElBQUEsQ0FBQSxDQUFBLFVBQUEsaUJBQUEsQ0FBQSxDQUFBLEVBQUEsTUFBQTtBQUFBLFNBQUEsaUJBQUEsSUFBQSxlQUFBLE1BQUEsb0JBQUEsTUFBQSxDQUFBLFFBQUEsSUFBQSxNQUFBLENBQUEsSUFBQSxVQUFBLEtBQUEsQ0FBQSxJQUFBLENBQUEsSUFBQTtBQUFBLFNBQUEsbUJBQUEsR0FBQSxRQUFBLEtBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxVQUFBLGlCQUFBLENBQUEsR0FBQTtBQUFBLFNBQUEsa0JBQUEsR0FBQSxFQUFBLEdBQUEsUUFBQSxHQUFBLFlBQUEsR0FBQSxHQUFBLEdBQUEsQ0FBQSxNQUFBLEVBQUEsR0FBQSxHQUFBLEdBQUEsQ0FBQSxNQUFBLFdBQUEsQ0FBQSxNQUFBLElBQUEsT0FBQSxLQUFBLENBQUEsR0FBQSxHQUFBLENBQUEsR0FBQSxH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LE9BQUE7QUFDQSxJQUFBLE1BQUEsR0FBQSxPQUFBO0FBQ0EsSUFBQSxTQUFBLEdBQUEsT0FBQTtBQUNBLElBQUEsYUFBQSxHQUFBLHNCQUFBLENBQUEsT0FBQTtBQUNBLElBQUEsS0FBQSxHQUFBLE9BQUE7QUFDQSxJQUFBLEtBQUEsR0FBQSx1QkFBQSxDQUFBLE9BQUE7QUFBa0MsU0FBQSx5QkFBQSxlQUFBLE9BQUEsa0NBQUEsS0FBQSxPQUFBLE9BQUEsSUFBQSx3QkFBQSxZQUFBLHlCQUFBLFdBQUEsS0FBQSxZQUFBLEtBQUE7QUFBQSxTQUFBLHdCQUFBLEdBQUEsUUFBQSxHQUFBLElBQUEsR0FBQSxDQUFBLFVBQUEsV0FBQSxHQUFBLFFBQUEsR0FBQSxhQUFBLE9BQUEsQ0FBQSxHQUFBLHlCQUFBLEdBQUEsdUNBQUEsR0FBQSxVQUFBLEtBQUEsR0FBQSx3QkFBQSxRQUFBLEtBQUEsSUFBQSxLQUFBLENBQUEsR0FBQSxDQUFBLEdBQUEsWUFBQSxLQUFBLENBQUEsR0FBQSxDQUFBLEdBQUEsU0FBQSxNQUFBLFdBQUEscUJBQUEsR0FBQSxNQUFBLENBQUEsY0FBQSxJQUFBLE1BQUEsQ0FBQSx3QkFBQSxXQUFBLEdBQUEsSUFBQSxHQUFBLFFBQUEsTUFBQSxDQUFBLFNBQUEsQ0FBQSxjQUFBLENBQUEsSUFBQSxDQUFBLEdBQUEsRUFBQSxHQUFBLFNBQUEsSUFBQSxHQUFBLHFCQUFBLEdBQUEsTUFBQSxDQUFBLHdCQUFBLENBQUEsR0FBQSxFQUFBLEdBQUEsY0FBQSxJQUFBLEtBQUEsSUFBQSxDQUFBLEdBQUEsSUFBQSxJQUFBLENBQUEsR0FBQSxLQUFBLE1BQUEsQ0FBQSxjQUFBLENBQUEsTUFBQSxFQUFBLEdBQUEsRUFBQSxJQUFBLFlBQUEsTUFBQSxDQUFBLEdBQUEsSUFBQSxHQUFBLENBQUEsR0FBQSxTQUFBLE1BQUEsY0FBQSxHQUFBLE1BQUEsS0FBQSxJQUFBLEtBQUEsQ0FBQSxHQUFBLENBQUEsR0FBQSxFQUFBLE1BQUEsWUFBQSxNQUFBO0FBQUEsU0FBQSx1QkFBQSxHQUFBLFdBQUEsR0FB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LENBQUEsR0FBQSxFQUFBLEdBQUEsY0FBQSxJQUFBLEtBQUEsSUFBQSxDQUFBLEdBQUEsSUFBQSxJQUFBLENBQUEsR0FBQSxLQUFBLE1BQUEsQ0FBQSxjQUFBLENBQUEsTUFBQSxFQUFBLEdBQUEsRUFBQSxJQUFBLFlBQUEsTUFBQSxDQUFBLEdBQUEsSUFBQSxHQUFBLENBQUEsR0FBQSxTQUFBLE1BQUEsY0FBQSxHQUFBLE1BQUEsS0FBQSxJQUFBLEtBQUEsQ0FBQSxHQUFBLENBQUEsR0FBQSxFQUFBLE1BQUEsWUFBQSxNQUFBO0FBQUEsU0FBQSx1QkFBQSxHQUFBLFdBQUEsR0FBQSxJQUFBLEdBQUEsQ0FBQSxVQUFBLEdBQUEsR0FBQSxnQkFBQSxHQUFBO0FBQUEsU0FBQSxRQUFBLE1BQUEsRUFBQSxjQUFBLFFBQUEsSUFBQSxHQUFBLE1BQUEsQ0FBQSxJQUFBLENBQUEsTUFBQSxPQUFBLE1BQUEsQ0FBQSxxQkFBQSxRQUFBLE9BQUEsR0FBQSxNQUFBLENBQUEscUJBQUEsQ0FBQSxNQUFBLE9BQUEsY0FBQSxFQUFBLE9BQUEsR0FBQSxPQUFBLENBQUEsTUFBQSxXQUFBLEdBQUEsV0FBQSxNQUFBLENBQUEsd0JBQUEsQ0FBQSxNQUFBLEVBQUEsR0FBQSxFQUFBLFVBQUEsTUFBQSxJQUFBLENBQUEsSUFBQSxDQUFBLEtBQUEsQ0FBQSxJQUFBLEVBQUEsT0FBQSxZQUFBLElBQUE7QUFBQSxTQUFBLGNBQUEsTUFBQSxhQUFBLENBQUEsTUFBQSxDQUFBLEdBQUEsU0FBQSxDQUFBLE1BQUEsRUFBQSxDQUFBLFVBQUEsTUFBQSxHQUFBLFNBQUEsQ0FBQSxDQUFBLFlBQUEsU0FBQSxDQUFBLENBQUEsWUFBQSxDQUFBLFFBQUEsT0FBQSxDQUFBLE1BQUEsQ0FBQSxNQUFBLFNBQUEsT0FBQSxXQUFBLEdBQUEsSUFBQSxlQUFBLENBQUEsTUFBQSxFQUFBLEdBQUEsRUFBQSxNQUFBLENBQUEsR0FBQSxtQkFBQSxNQUFBLENBQUEseUJBQUEsSUFBQSxNQUFBLENBQUEsZ0JBQUEsQ0FBQSxNQUFBLEVBQUEsTUFBQSxD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aWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCJtb2R1bGUuZXhwb3J0cz17XG4gIFwibmFtZVwiOiBcInJhdGVyXCIsXG4gIFwidmVyc2lvblwiOiBcIjIuNy4xXCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJXaWtpcGVkaWEgdXNlcnNjcmlwdCB0aGF0IGhlbHBzIGFzc2VzcyBwYWdlcyBmb3IgV2lraVByb2plY3RzXCIsXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwczovL2dpdGh1Yi5jb20vZXZhZDM3L3JhdGVyXCIsXG4gIFwiYnJvd3NlclwiOiBcImluZGV4LmpzXCIsXG4gIFwic2NyaXB0c1wiOiB7XG4gICAgXCJ0ZXN0XCI6IFwiZWNobyBcXFwiRXJyb3I6IG5vIHRlc3Qgc3BlY2lmaWVkXFxcIiAmJiBleGl0IDFcIixcbiAgICBcImxpbnQ6ZXM1XCI6IFwianNoaW50IGluZGV4LmpzXCIsXG4gICAgXCJsaW50OmVzNlwiOiBcImVzbGludCBpbmRleC5qcyBcXFwicmF0ZXItc3JjLyoqXFxcIlwiLFxuICAgIFwibGludDpmaXhcIjogXCJlc2xpbnQgaW5kZXguanMgXFxcInJhdGVyLXNyYy8qKlxcXCIgLS1maXhcIixcbiAgICBcImxpbnRcIjogXCJucG0gcnVuIGxpbnQ6ZXM2ICYmIG5wbSBydW4gbGludDplczVcIixcbiAgICBcImJ1aWxkOmJ1bmRsZVwiOiBcImJyb3dzZXJpZnkgcmF0ZXItc3JjL0FwcC5qcyAtLWRlYnVnIC10IGJhYmVsaWZ5IC0tb3V0ZmlsZSBkaXN0L3JhdGVyLmpzXCIsXG4gICAgXCJidWlsZDptaW5pZnlcIjogXCJ1Z2xpZnlqcyBkaXN0L3JhdGVyLmpzIC0tY29tcHJlc3MgLWIgYXNjaWlfb25seT10cnVlLGJlYXV0aWZ5PWZhbHNlIC0tb3V0cHV0IGRpc3QvcmF0ZXIubWluLmpzXCIsXG4gICAgXCJidWlsZDpjb25jYXRcIjogXCJjb25jYXQtY2xpIC1mIFxcXCJjb21tZW50LXRvcC5qc1xcXCIgZGlzdC9yYXRlci5taW4uanMgXFxcImNvbW1lbnQtYm90dG9tLmpzXFxcIiAtbyBkaXN0L3JhdGVyLm1pbi5qc1wiLFxuICAgIFwiYnVpbGRcIjogXCJucG0gcnVuIGxpbnQgJiYgbnBtIHJ1biBidWlsZDpidW5kbGUgJiYgbnBtIHJ1biBidWlsZDptaW5pZnkgJiYgbnBtIHJ1biBidWlsZDpjb25jYXRcIlxuICB9LFxuICBcImF1dGhvclwiOiB7XG4gICAgXCJuYW1lXCI6IFwiRXZhZDM3XCIsXG4gICAgXCJ1cmxcIjogXCJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Vc2VyOkV2YWQzN1wiXG4gIH0sXG4gIFwicmVwb3NpdG9yeVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiZ2l0XCIsXG4gICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vZXZhZDM3L3JhdGVyLmdpdFwiXG4gIH0sXG4gIFwibGljZW5zZVwiOiBcIihNSVQgT1IgQ0MtQlktNC4wKVwiLFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAYmFiZWwvY29yZVwiOiBcIl43LjkuMFwiLFxuICAgIFwiQGJhYmVsL3ByZXNldC1lbnZcIjogXCJeNy45LjBcIixcbiAgICBcImJhYmVsaWZ5XCI6IFwiXjEwLjAuMFwiLFxuICAgIFwiYnJvd3NlcmlmeVwiOiBcIl4xNi41LjBcIixcbiAgICBcImNvbmNhdC1jbGlcIjogXCJeNC4wLjBcIixcbiAgICBcImVzbGludFwiOiBcIl42LjguMFwiLFxuICAgIFwianNoaW50XCI6IFwiXjIuMTEuMFwiLFxuICAgIFwidWdsaWZ5LWpzXCI6IFwiXjMuOC4wXCJcbiAgfVxufVxuIiwiaW1wb3J0IHNldHVwUmF0ZXIgZnJvbSBcIi4vc2V0dXBcIjtcclxuaW1wb3J0IGF1dG9TdGFydCBmcm9tIFwiLi9hdXRvc3RhcnRcIjtcclxuaW1wb3J0IHN0eWxlcyBmcm9tIFwiLi9jc3MuanNcIjtcclxuaW1wb3J0IHsgbWFrZUVycm9yTXNnIH0gZnJvbSBcIi4vYXBpXCI7XHJcbmltcG9ydCB3aW5kb3dNYW5hZ2VyIGZyb20gXCIuL3dpbmRvd01hbmFnZXJcIjtcclxuLy8gPG5vd2lraT5cclxuXHJcbihmdW5jdGlvbiBBcHAoKSB7XHJcblx0bGV0IHN0eWxlc2hlZXQ7XHJcblxyXG5cdGNvbnN0IHNob3dNYWluV2luZG93ID0gZGF0YSA9PiB7XHJcblx0XHRpZiAoIWRhdGEgfHwgIWRhdGEuc3VjY2Vzcykge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRpZiAoc3R5bGVzaGVldCkge1xyXG5cdFx0XHRzdHlsZXNoZWV0LmRpc2FibGVkID0gZmFsc2U7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRzdHlsZXNoZWV0ID0gbXcudXRpbC5hZGRDU1Moc3R5bGVzKTtcclxuXHRcdH1cclxuXHRcdC8vIEFkZCBjc3MgY2xhc3MgdG8gYm9keSB0byBlbmFibGUgYmFja2dyb3VuZCBzY3JvbGxpbmdcclxuXHRcdGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYm9keVwiKVswXS5jbGFzc0xpc3QuYWRkKFwicmF0ZXItbWFpbldpbmRvdy1vcGVuXCIpO1xyXG5cdFx0Ly8gT3BlbiB0aGUgd2luZG93XHJcblx0XHR3aW5kb3dNYW5hZ2VyLm9wZW5XaW5kb3coXCJtYWluXCIsIGRhdGEpXHJcblx0XHRcdC5jbG9zZWQudGhlbiggcmVzdWx0ID0+IHtcclxuXHRcdFx0XHQvLyBEaXNhYmxlL3JlbW92ZSB0aGUgY3NzIHN0eWxlcywgc28gYXMgdG8gbm90IGludGVyZmVyZSB3aXRoIG90aGVyIHNjcmlwdHMvY29udGVudC9PT1VJIHdpbmRvd3NcclxuXHRcdFx0XHRpZiAoc3R5bGVzaGVldCkgeyBzdHlsZXNoZWV0LmRpc2FibGVkID0gdHJ1ZTsgfVxyXG5cdFx0XHRcdGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYm9keVwiKVswXS5jbGFzc0xpc3QucmVtb3ZlKFwicmF0ZXItbWFpbldpbmRvdy1vcGVuXCIpO1xyXG5cdFx0XHRcdC8vIFJlc3RhcnQgaWYgbmVlZGVkXHJcblx0XHRcdFx0aWYgKHJlc3VsdCAmJiByZXN1bHQucmVzdGFydCkge1xyXG5cdFx0XHRcdFx0d2luZG93TWFuYWdlci5yZW1vdmVXaW5kb3dzKFtcIm1haW5cIl0pXHJcblx0XHRcdFx0XHRcdC50aGVuKHNldHVwUmF0ZXIpXHJcblx0XHRcdFx0XHRcdC50aGVuKHNob3dNYWluV2luZG93LCBzaG93U2V0dXBFcnJvcik7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdC8vIFNob3cgbm90aWZpY2F0aW9uIHdoZW4gc2F2ZWQgc3VjY2Vzc2Z1bGx5XHJcblx0XHRcdFx0aWYgKHJlc3VsdCAmJiByZXN1bHQuc3VjY2Vzcykge1xyXG5cdFx0XHRcdFx0Y29uc3QgJG1lc3NhZ2UgPSAkKFwiPHNwYW4+XCIpLmFwcGVuZChcclxuXHRcdFx0XHRcdFx0JChcIjxzdHJvbmc+XCIpLnRleHQoXCJSYXRpbmdzIHNhdmVkIHN1Y2Nlc3NmdWxseS5cIilcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRpZiAocmVzdWx0LnVwZ3JhZGVkU3R1Yikge1xyXG5cdFx0XHRcdFx0XHQkbWVzc2FnZS5hcHBlbmQoXHJcblx0XHRcdFx0XHRcdFx0JChcIjxicj5cIiksXHJcblx0XHRcdFx0XHRcdFx0Ly8gVE9ETzogVGhlcmUgc2hvdWxkIGJlIGEgbGluayB0aGF0IHdpbGwgZWRpdCB0aGUgYXJ0aWNsZSBmb3IgeW91XHJcblx0XHRcdFx0XHRcdFx0JChcIjxzcGFuPlwiKS50ZXh0KFwiTm90ZSB0aGF0IHRoZSBhcnRpY2xlIGFwcGVhcnMgdG8gYmUgdGFnZ2VkIGFzIGEgc3R1Yi5cIilcclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdG13Lm5vdGlmeShcclxuXHRcdFx0XHRcdFx0JG1lc3NhZ2UsXHJcblx0XHRcdFx0XHRcdHsgYXV0b0hpZGU6IHRydWUsIGF1dG9IaWRlU2Vjb25kczogXCJsb25nXCIsIHRhZzogXCJSYXRlci1zYXZlZFwiIH1cclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9ICk7XHJcblx0fTtcclxuXHJcblx0Y29uc3Qgc2hvd1NldHVwRXJyb3IgPSAoY29kZSwganF4aHIpID0+IE9PLnVpLmFsZXJ0KFxyXG5cdFx0bWFrZUVycm9yTXNnKGNvZGUsIGpxeGhyKSxcdHtcclxuXHRcdFx0dGl0bGU6IFwiUmF0ZXIgZmFpbGVkIHRvIG9wZW5cIlxyXG5cdFx0fVxyXG5cdCk7XHJcblxyXG5cdC8vIEludm9jYXRpb24gYnkgcG9ydGxldCBsaW5rIFxyXG5cdG13LnV0aWwuYWRkUG9ydGxldExpbmsoXHJcblx0XHRcInAtY2FjdGlvbnNcIixcclxuXHRcdFwiI1wiLFxyXG5cdFx0XCJSYXRlclwiLFxyXG5cdFx0XCJjYS1yYXRlclwiLFxyXG5cdFx0XCJSYXRlIHF1YWxpdHkgYW5kIGltcG9ydGFuY2VcIixcclxuXHRcdFwiNVwiXHJcblx0KTtcclxuXHQkKFwiI2NhLXJhdGVyXCIpLmNsaWNrKGV2ZW50ID0+IHtcclxuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRzZXR1cFJhdGVyKCkudGhlbihzaG93TWFpbldpbmRvdywgc2hvd1NldHVwRXJyb3IpO1xyXG5cdH0pO1xyXG5cclxuXHQvLyBJbnZvY2F0aW9uIGJ5IGF1dG8tc3RhcnQgKGRvIG5vdCBzaG93IG1lc3NhZ2Ugb24gZXJyb3IpXHJcblx0YXV0b1N0YXJ0KCkudGhlbihzaG93TWFpbldpbmRvdyk7XHJcbn0pKCk7XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCBBUEkgZnJvbSBcIi4vYXBpXCI7XHJcbmltcG9ydCB7aXNBZnRlckRhdGUsIG1vc3RGcmVxdWVudCwgZmlsdGVyQW5kTWFwfSBmcm9tIFwiLi91dGlsXCI7XHJcbmltcG9ydCBjb25maWcgZnJvbSBcIi4vY29uZmlnXCI7XHJcbmltcG9ydCAqIGFzIGNhY2hlIGZyb20gXCIuL2NhY2hlXCI7XHJcbi8vIDxub3dpa2k+XHJcblxyXG4vKiogVGVtcGxhdGVcclxuICpcclxuICogQGNsYXNzXHJcbiAqIFJlcHJlc2VudHMgdGhlIHdpa2l0ZXh0IG9mIHRlbXBsYXRlIHRyYW5zY2x1c2lvbi4gVXNlZCBieSAjcGFyc2VUZW1wbGF0ZXMuXHJcbiAqIEBwcm9wIHtTdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgdGVtcGxhdGVcclxuICogQHByb3Age1N0cmluZ30gd2lraXRleHQgRnVsbCB3aWtpdGV4dCBvZiB0aGUgdHJhbnNjbHVzaW9uXHJcbiAqIEBwcm9wIHtPYmplY3RbXX0gcGFyYW1ldGVycyBQYXJhbWV0ZXJzIHVzZWQgaW4gdGhlIHRyYW5zbGN1c2lvbiwgaW4gb3JkZXIsIG9mIGZvcm06XHJcblx0e1xyXG5cdFx0bmFtZToge1N0cmluZ3xOdW1iZXJ9IHBhcmFtZXRlciBuYW1lLCBvciBwb3NpdGlvbiBmb3IgdW5uYW1lZCBwYXJhbWV0ZXJzLFxyXG5cdFx0dmFsdWU6IHtTdHJpbmd9IFdpa2l0ZXh0IHBhc3NlZCB0byB0aGUgcGFyYW1ldGVyICh3aGl0ZXNwYWNlIHRyaW1tZWQpLFxyXG5cdFx0d2lraXRleHQ6IHtTdHJpbmd9IEZ1bGwgd2lraXRleHQgKGluY2x1ZGluZyBsZWFkaW5nIHBpcGUsIHBhcmFtZXRlciBuYW1lL2VxdWFscyBzaWduIChpZiBhcHBsaWNhYmxlKSwgdmFsdWUsIGFuZCBhbnkgd2hpdGVzcGFjZSlcclxuXHR9XHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKiBAcGFyYW0ge1N0cmluZ30gd2lraXRleHQgV2lraXRleHQgb2YgYSB0ZW1wbGF0ZSB0cmFuc2NsdXNpb24sIHN0YXJ0aW5nIHdpdGggJ3t7JyBhbmQgZW5kaW5nIHdpdGggJ319Jy5cclxuICovXHJcbnZhciBUZW1wbGF0ZSA9IGZ1bmN0aW9uKHdpa2l0ZXh0KSB7XHJcblx0dGhpcy53aWtpdGV4dCA9IHdpa2l0ZXh0O1xyXG5cdHRoaXMucGFyYW1ldGVycyA9IFtdO1xyXG5cdC8vIFNwYWNpbmcgYXJvdW5kIHBpcGVzLCBlcXVhbHMgc2lnbnMsIGVuZCBicmFjZXMgKGRlZmF1bHRzKVxyXG5cdHRoaXMucGlwZVN0eWxlID0gXCIgfFwiO1xyXG5cdHRoaXMuZXF1YWxzU3R5bGUgPSBcIj1cIjtcclxuXHR0aGlzLmVuZEJyYWNlc1N0eWxlID0gXCJ9fVwiO1xyXG59O1xyXG5UZW1wbGF0ZS5wcm90b3R5cGUuYWRkUGFyYW0gPSBmdW5jdGlvbihuYW1lLCB2YWwsIHdpa2l0ZXh0KSB7XHJcblx0dGhpcy5wYXJhbWV0ZXJzLnB1c2goe1xyXG5cdFx0XCJuYW1lXCI6IG5hbWUsXHJcblx0XHRcInZhbHVlXCI6IHZhbCwgXHJcblx0XHRcIndpa2l0ZXh0XCI6IFwifFwiICsgd2lraXRleHRcclxuXHR9KTtcclxufTtcclxuLyoqXHJcbiAqIEdldCBhIHBhcmFtZXRlciBkYXRhIGJ5IHBhcmFtZXRlciBuYW1lXHJcbiAqLyBcclxuVGVtcGxhdGUucHJvdG90eXBlLmdldFBhcmFtID0gZnVuY3Rpb24ocGFyYW1OYW1lKSB7XHJcblx0cmV0dXJuIHRoaXMucGFyYW1ldGVycy5maW5kKGZ1bmN0aW9uKHApIHsgcmV0dXJuIHAubmFtZSA9PSBwYXJhbU5hbWU7IH0pO1xyXG59O1xyXG5UZW1wbGF0ZS5wcm90b3R5cGUuc2V0TmFtZSA9IGZ1bmN0aW9uKG5hbWUpIHtcclxuXHR0aGlzLm5hbWUgPSBuYW1lLnRyaW0oKTtcclxufTtcclxuVGVtcGxhdGUucHJvdG90eXBlLmdldFRpdGxlID0gZnVuY3Rpb24oKSB7XHJcblx0cmV0dXJuIG13LlRpdGxlLm5ld0Zyb21UZXh0KFwiVGVtcGxhdGU6XCIgKyB0aGlzLm5hbWUpO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIHBhcnNlVGVtcGxhdGVzXHJcbiAqXHJcbiAqIFBhcnNlcyB0ZW1wbGF0ZXMgZnJvbSB3aWtpdGV4dC5cclxuICogQmFzZWQgb24gU0QwMDAxJ3MgdmVyc2lvbiBhdCA8aHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVXNlcjpTRDAwMDEvcGFyc2VBbGxUZW1wbGF0ZXMuanM+LlxyXG4gKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHRlbXBsYXRlIGRldGFpbHM6XHJcbiAqICB2YXIgdGVtcGxhdGVzID0gcGFyc2VUZW1wbGF0ZXMoXCJIZWxsbyB7e2ZvbyB8QmFyfGJhej1xdXggfDI9bG9yZW1pcHN1bXwzPX19IHdvcmxkXCIpO1xyXG4gKiAgY29uc29sZS5sb2codGVtcGxhdGVzWzBdKTsgLy8gLS0+IG9iamVjdFxyXG5cdHtcclxuXHRcdG5hbWU6IFwiZm9vXCIsXHJcblx0XHR3aWtpdGV4dDpcInt7Zm9vIHxCYXJ8YmF6PXF1eCB8IDIgPSBsb3JlbWlwc3VtICB8Mz19fVwiLFxyXG5cdFx0cGFyYW1ldGVyczogW1xyXG5cdFx0XHR7XHJcblx0XHRcdFx0bmFtZTogMSxcclxuXHRcdFx0XHR2YWx1ZTogJ0JhcicsXHJcblx0XHRcdFx0d2lraXRleHQ6ICd8QmFyJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0bmFtZTogJ2JheicsXHJcblx0XHRcdFx0dmFsdWU6ICdxdXgnLFxyXG5cdFx0XHRcdHdpa2l0ZXh0OiAnfGJhej1xdXggJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0bmFtZTogJzInLFxyXG5cdFx0XHRcdHZhbHVlOiAnbG9yZW1pcHN1bScsXHJcblx0XHRcdFx0d2lraXRleHQ6ICd8IDIgPSBsb3JlbWlwc3VtICAnXHJcblx0XHRcdH0sXHJcblx0XHRcdHtcclxuXHRcdFx0XHRuYW1lOiAnMycsXHJcblx0XHRcdFx0dmFsdWU6ICcnLFxyXG5cdFx0XHRcdHdpa2l0ZXh0OiAnfDM9J1xyXG5cdFx0XHR9XHJcblx0XHRdLFxyXG5cdFx0Z2V0UGFyYW06IGZ1bmN0aW9uKHBhcmFtTmFtZSkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5wYXJhbWV0ZXJzLmZpbmQoZnVuY3Rpb24ocCkgeyByZXR1cm4gcC5uYW1lID09IHBhcmFtTmFtZTsgfSk7XHJcblx0XHR9XHJcblx0fVxyXG4gKiAgICBcclxuICogXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSB3aWtpdGV4dFxyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHJlY3Vyc2l2ZSBTZXQgdG8gYHRydWVgIHRvIGFsc28gcGFyc2UgdGVtcGxhdGVzIHRoYXQgb2NjdXIgd2l0aGluIG90aGVyIHRlbXBsYXRlcyxcclxuICogIHJhdGhlciB0aGFuIGp1c3QgdG9wLWxldmVsIHRlbXBsYXRlcy4gXHJcbiAqIEByZXR1cm4ge1RlbXBsYXRlW119IHRlbXBsYXRlc1xyXG4qL1xyXG52YXIgcGFyc2VUZW1wbGF0ZXMgPSBmdW5jdGlvbih3aWtpdGV4dCwgcmVjdXJzaXZlKSB7IC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnRyb2wtcmVnZXggKi9cclxuXHRpZiAoIXdpa2l0ZXh0KSB7XHJcblx0XHRyZXR1cm4gW107XHJcblx0fVxyXG5cdHZhciBzdHJSZXBsYWNlQXQgPSBmdW5jdGlvbihzdHJpbmcsIGluZGV4LCBjaGFyKSB7XHJcblx0XHRyZXR1cm4gc3RyaW5nLnNsaWNlKDAsaW5kZXgpICsgY2hhciArIHN0cmluZy5zbGljZShpbmRleCArIDEpO1xyXG5cdH07XHJcblxyXG5cdHZhciByZXN1bHQgPSBbXTtcclxuXHRcclxuXHR2YXIgcHJvY2Vzc1RlbXBsYXRlVGV4dCA9IGZ1bmN0aW9uIChzdGFydElkeCwgZW5kSWR4KSB7XHJcblx0XHR2YXIgdGV4dCA9IHdpa2l0ZXh0LnNsaWNlKHN0YXJ0SWR4LCBlbmRJZHgpO1xyXG5cclxuXHRcdHZhciB0ZW1wbGF0ZSA9IG5ldyBUZW1wbGF0ZShcInt7XCIgKyB0ZXh0LnJlcGxhY2UoL1xceDAxL2csXCJ8XCIpICsgXCJ9fVwiKTtcclxuXHRcdFxyXG5cdFx0Ly8gc3dhcCBvdXQgcGlwZSBpbiBsaW5rcyB3aXRoIFxceDAxIGNvbnRyb2wgY2hhcmFjdGVyXHJcblx0XHQvLyBbW0ZpbGU6IF1dIGNhbiBoYXZlIG11bHRpcGxlIHBpcGVzLCBzbyBtaWdodCBuZWVkIG11bHRpcGxlIHBhc3Nlc1xyXG5cdFx0d2hpbGUgKCAvKFxcW1xcW1teXFxdXSo/KVxcfCguKj9cXF1cXF0pL2cudGVzdCh0ZXh0KSApIHtcclxuXHRcdFx0dGV4dCA9IHRleHQucmVwbGFjZSgvKFxcW1xcW1teXFxdXSo/KVxcfCguKj9cXF1cXF0pL2csIFwiJDFcXHgwMSQyXCIpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEZpZ3VyZSBvdXQgbW9zdC11c2VkIHNwYWNpbmcgc3R5bGVzIGZvciBwaXBlcy9lcXVhbHNcclxuXHRcdHRlbXBsYXRlLnBpcGVTdHlsZSA9IG1vc3RGcmVxdWVudCggdGV4dC5tYXRjaCgvW1xcc1xcbl0qXFx8W1xcc1xcbl0qL2cpICkgfHwgXCIgfFwiO1xyXG5cdFx0dGVtcGxhdGUuZXF1YWxzU3R5bGUgPSBtb3N0RnJlcXVlbnQoIHRleHQucmVwbGFjZSgvKD1bXnxdKik9Ky9nLCBcIiQxXCIpLm1hdGNoKC9bXFxzXFxuXSo9W1xcc1xcbl0qL2cpICkgfHwgXCI9XCI7XHJcblx0XHQvLyBGaWd1cmUgb3V0IGVuZC1icmFjZXMgc3R5bGVcclxuXHRcdHZhciBlbmRTcGFjaW5nID0gdGV4dC5tYXRjaCgvW1xcc1xcbl0qJC8pO1xyXG5cdFx0dGVtcGxhdGUuZW5kQnJhY2VzU3R5bGUgPSAoZW5kU3BhY2luZyA/IGVuZFNwYWNpbmdbMF0gOiBcIlwiKSArIFwifX1cIjtcclxuXHJcblx0XHR2YXIgY2h1bmtzID0gdGV4dC5zcGxpdChcInxcIikubWFwKGZ1bmN0aW9uKGNodW5rKSB7XHJcblx0XHRcdC8vIGNoYW5nZSAnXFx4MDEnIGNvbnRyb2wgY2hhcmFjdGVycyBiYWNrIHRvIHBpcGVzXHJcblx0XHRcdHJldHVybiBjaHVuay5yZXBsYWNlKC9cXHgwMS9nLFwifFwiKTsgXHJcblx0XHR9KTtcclxuXHJcblx0XHR0ZW1wbGF0ZS5zZXROYW1lKGNodW5rc1swXSk7XHJcblx0XHRcclxuXHRcdHZhciBwYXJhbWV0ZXJDaHVua3MgPSBjaHVua3Muc2xpY2UoMSk7XHJcblxyXG5cdFx0dmFyIHVubmFtZWRJZHggPSAxO1xyXG5cdFx0cGFyYW1ldGVyQ2h1bmtzLmZvckVhY2goZnVuY3Rpb24oY2h1bmspIHtcclxuXHRcdFx0dmFyIGluZGV4T2ZFcXVhbFRvID0gY2h1bmsuaW5kZXhPZihcIj1cIik7XHJcblx0XHRcdHZhciBpbmRleE9mT3BlbkJyYWNlcyA9IGNodW5rLmluZGV4T2YoXCJ7e1wiKTtcclxuXHRcdFx0XHJcblx0XHRcdHZhciBpc1dpdGhvdXRFcXVhbHMgPSAhY2h1bmsuaW5jbHVkZXMoXCI9XCIpO1xyXG5cdFx0XHR2YXIgaGFzQnJhY2VzQmVmb3JlRXF1YWxzID0gY2h1bmsuaW5jbHVkZXMoXCJ7e1wiKSAmJiBpbmRleE9mT3BlbkJyYWNlcyA8IGluZGV4T2ZFcXVhbFRvO1x0XHJcblx0XHRcdHZhciBpc1VubmFtZWRQYXJhbSA9ICggaXNXaXRob3V0RXF1YWxzIHx8IGhhc0JyYWNlc0JlZm9yZUVxdWFscyApO1xyXG5cdFx0XHRcclxuXHRcdFx0dmFyIHBOYW1lLCBwTnVtLCBwVmFsO1xyXG5cdFx0XHRpZiAoIGlzVW5uYW1lZFBhcmFtICkge1xyXG5cdFx0XHRcdC8vIEdldCB0aGUgbmV4dCBudW1iZXIgbm90IGFscmVhZHkgdXNlZCBieSBlaXRoZXIgYW4gdW5uYW1lZCBwYXJhbWV0ZXIsIG9yIGJ5IGFcclxuXHRcdFx0XHQvLyBuYW1lZCBwYXJhbWV0ZXIgbGlrZSBgfDE9dmFsYFxyXG5cdFx0XHRcdHdoaWxlICggdGVtcGxhdGUuZ2V0UGFyYW0odW5uYW1lZElkeCkgKSB7XHJcblx0XHRcdFx0XHR1bm5hbWVkSWR4Kys7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHBOdW0gPSB1bm5hbWVkSWR4O1xyXG5cdFx0XHRcdHBWYWwgPSBjaHVuay50cmltKCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0cE5hbWUgPSBjaHVuay5zbGljZSgwLCBpbmRleE9mRXF1YWxUbykudHJpbSgpO1xyXG5cdFx0XHRcdHBWYWwgPSBjaHVuay5zbGljZShpbmRleE9mRXF1YWxUbyArIDEpLnRyaW0oKTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0ZW1wbGF0ZS5hZGRQYXJhbShwTmFtZSB8fCBwTnVtLCBwVmFsLCBjaHVuayk7XHJcblx0XHR9KTtcclxuXHRcdFxyXG5cdFx0cmVzdWx0LnB1c2godGVtcGxhdGUpO1xyXG5cdH07XHJcblxyXG5cdFxyXG5cdHZhciBuID0gd2lraXRleHQubGVuZ3RoO1xyXG5cdFxyXG5cdC8vIG51bWJlciBvZiB1bmNsb3NlZCBicmFjZXNcclxuXHR2YXIgbnVtVW5jbG9zZWQgPSAwO1xyXG5cclxuXHQvLyBhcmUgd2UgaW5zaWRlIGEgY29tbWVudCwgb3IgYmV0d2VlbiBub3dpa2kgdGFncywgb3IgaW4gYSB7e3twYXJhbWV0ZXJ9fX0/XHJcblx0dmFyIGluQ29tbWVudCA9IGZhbHNlO1xyXG5cdHZhciBpbk5vd2lraSA9IGZhbHNlO1xyXG5cdHZhciBpblBhcmFtZXRlciA9IGZhbHNlO1xyXG5cclxuXHR2YXIgc3RhcnRJZHgsIGVuZElkeDtcclxuXHRcclxuXHRmb3IgKHZhciBpPTA7IGk8bjsgaSsrKSB7XHJcblx0XHRcclxuXHRcdGlmICggIWluQ29tbWVudCAmJiAhaW5Ob3dpa2kgJiYgIWluUGFyYW1ldGVyICkge1xyXG5cclxuXHRcdFx0aWYgKHdpa2l0ZXh0W2ldID09PSBcIntcIiAmJiB3aWtpdGV4dFtpKzFdID09PSBcIntcIiAmJiB3aWtpdGV4dFtpKzJdID09PSBcIntcIiAmJiB3aWtpdGV4dFtpKzNdICE9PSBcIntcIikge1xyXG5cdFx0XHRcdGluUGFyYW1ldGVyID0gdHJ1ZTtcclxuXHRcdFx0XHRpICs9IDI7XHJcblx0XHRcdH0gZWxzZSBpZiAod2lraXRleHRbaV0gPT09IFwie1wiICYmIHdpa2l0ZXh0W2krMV0gPT09IFwie1wiKSB7XHJcblx0XHRcdFx0aWYgKG51bVVuY2xvc2VkID09PSAwKSB7XHJcblx0XHRcdFx0XHRzdGFydElkeCA9IGkrMjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0bnVtVW5jbG9zZWQgKz0gMjtcclxuXHRcdFx0XHRpKys7XHJcblx0XHRcdH0gZWxzZSBpZiAod2lraXRleHRbaV0gPT09IFwifVwiICYmIHdpa2l0ZXh0W2krMV0gPT09IFwifVwiKSB7XHJcblx0XHRcdFx0aWYgKG51bVVuY2xvc2VkID09PSAyKSB7XHJcblx0XHRcdFx0XHRlbmRJZHggPSBpO1xyXG5cdFx0XHRcdFx0cHJvY2Vzc1RlbXBsYXRlVGV4dChzdGFydElkeCwgZW5kSWR4KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0bnVtVW5jbG9zZWQgLT0gMjtcclxuXHRcdFx0XHRpKys7XHJcblx0XHRcdH0gZWxzZSBpZiAod2lraXRleHRbaV0gPT09IFwifFwiICYmIG51bVVuY2xvc2VkID4gMikge1xyXG5cdFx0XHRcdC8vIHN3YXAgb3V0IHBpcGVzIGluIG5lc3RlZCB0ZW1wbGF0ZXMgd2l0aCBcXHgwMSBjaGFyYWN0ZXJcclxuXHRcdFx0XHR3aWtpdGV4dCA9IHN0clJlcGxhY2VBdCh3aWtpdGV4dCwgaSxcIlxceDAxXCIpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKCAvXjwhLS0vLnRlc3Qod2lraXRleHQuc2xpY2UoaSwgaSArIDQpKSApIHtcclxuXHRcdFx0XHRpbkNvbW1lbnQgPSB0cnVlO1xyXG5cdFx0XHRcdGkgKz0gMztcclxuXHRcdFx0fSBlbHNlIGlmICggL148bm93aWtpID8+Ly50ZXN0KHdpa2l0ZXh0LnNsaWNlKGksIGkgKyA5KSkgKSB7XHJcblx0XHRcdFx0aW5Ob3dpa2kgPSB0cnVlO1xyXG5cdFx0XHRcdGkgKz0gNztcclxuXHRcdFx0fSBcclxuXHJcblx0XHR9IGVsc2UgeyAvLyB3ZSBhcmUgaW4gYSBjb21tZW50IG9yIG5vd2lraSBvciB7e3twYXJhbWV0ZXJ9fX1cclxuXHRcdFx0aWYgKHdpa2l0ZXh0W2ldID09PSBcInxcIikge1xyXG5cdFx0XHRcdC8vIHN3YXAgb3V0IHBpcGVzIHdpdGggXFx4MDEgY2hhcmFjdGVyXHJcblx0XHRcdFx0d2lraXRleHQgPSBzdHJSZXBsYWNlQXQod2lraXRleHQsIGksXCJcXHgwMVwiKTtcclxuXHRcdFx0fSBlbHNlIGlmICgvXi0tPi8udGVzdCh3aWtpdGV4dC5zbGljZShpLCBpICsgMykpKSB7XHJcblx0XHRcdFx0aW5Db21tZW50ID0gZmFsc2U7XHJcblx0XHRcdFx0aSArPSAyO1xyXG5cdFx0XHR9IGVsc2UgaWYgKC9ePFxcL25vd2lraSA/Pi8udGVzdCh3aWtpdGV4dC5zbGljZShpLCBpICsgMTApKSkge1xyXG5cdFx0XHRcdGluTm93aWtpID0gZmFsc2U7XHJcblx0XHRcdFx0aSArPSA4O1xyXG5cdFx0XHR9IGVsc2UgaWYgKHdpa2l0ZXh0W2ldID09PSBcIn1cIiAmJiB3aWtpdGV4dFtpKzFdID09PSBcIn1cIiAmJiB3aWtpdGV4dFtpKzJdID09PSBcIn1cIikge1xyXG5cdFx0XHRcdGluUGFyYW1ldGVyID0gZmFsc2U7XHJcblx0XHRcdFx0aSArPSAyO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHRcclxuXHRpZiAoIHJlY3Vyc2l2ZSApIHtcclxuXHRcdHZhciBzdWJ0ZW1wbGF0ZXMgPSBmaWx0ZXJBbmRNYXAocmVzdWx0LFxyXG5cdFx0XHR0ZW1wbGF0ZSA9PiAvXFx7XFx7KD86LnxcXG4pKlxcfVxcfS8udGVzdCh0ZW1wbGF0ZS53aWtpdGV4dC5zbGljZSgyLC0yKSksXHJcblx0XHRcdHRlbXBsYXRlID0+IHBhcnNlVGVtcGxhdGVzKHRlbXBsYXRlLndpa2l0ZXh0LnNsaWNlKDIsLTIpLCB0cnVlKVxyXG5cdFx0KTtcclxuXHRcdHJldHVybiByZXN1bHQuY29uY2F0LmFwcGx5KHJlc3VsdCwgc3VidGVtcGxhdGVzKTtcclxuXHR9XHJcblxyXG5cdHJldHVybiByZXN1bHQ7IFxyXG59OyAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnRyb2wtcmVnZXggKi9cclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge1RlbXBsYXRlfFRlbXBsYXRlW119IHRlbXBsYXRlc1xyXG4gKiBAcmV0dXJuIHtQcm9taXNlPFRlbXBsYXRlPnxQcm9taXNlPFRlbXBsYXRlW10+fVxyXG4gKi9cclxudmFyIGdldFdpdGhSZWRpcmVjdFRvID0gZnVuY3Rpb24odGVtcGxhdGVzKSB7XHJcblx0dmFyIHRlbXBsYXRlc0FycmF5ID0gQXJyYXkuaXNBcnJheSh0ZW1wbGF0ZXMpID8gdGVtcGxhdGVzIDogW3RlbXBsYXRlc107XHJcblx0aWYgKHRlbXBsYXRlc0FycmF5Lmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlKFtdKTtcclxuXHR9XHJcblxyXG5cdHJldHVybiBBUEkuZ2V0KHtcclxuXHRcdFwiYWN0aW9uXCI6IFwicXVlcnlcIixcclxuXHRcdFwiZm9ybWF0XCI6IFwianNvblwiLFxyXG5cdFx0XCJ0aXRsZXNcIjogZmlsdGVyQW5kTWFwKHRlbXBsYXRlc0FycmF5LFxyXG5cdFx0XHR0ZW1wbGF0ZSA9PiB0ZW1wbGF0ZS5nZXRUaXRsZSgpICE9PSBudWxsLFxyXG5cdFx0XHR0ZW1wbGF0ZSA9PiB0ZW1wbGF0ZS5nZXRUaXRsZSgpLmdldFByZWZpeGVkVGV4dCgpXHJcblx0XHQpLFxyXG5cdFx0XCJyZWRpcmVjdHNcIjogMVxyXG5cdH0pLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XHJcblx0XHRpZiAoICFyZXN1bHQgfHwgIXJlc3VsdC5xdWVyeSApIHtcclxuXHRcdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZWplY3QoXCJFbXB0eSByZXNwb25zZVwiKTtcclxuXHRcdH1cclxuXHRcdGlmICggcmVzdWx0LnF1ZXJ5LnJlZGlyZWN0cyApIHtcclxuXHRcdFx0cmVzdWx0LnF1ZXJ5LnJlZGlyZWN0cy5mb3JFYWNoKGZ1bmN0aW9uKHJlZGlyZWN0KSB7XHJcblx0XHRcdFx0dmFyIGkgPSB0ZW1wbGF0ZXNBcnJheS5maW5kSW5kZXgodGVtcGxhdGUgPT4ge1xyXG5cdFx0XHRcdFx0bGV0IHRpdGxlID0gdGVtcGxhdGUuZ2V0VGl0bGUoKTtcclxuXHRcdFx0XHRcdHJldHVybiB0aXRsZSAmJiB0aXRsZS5nZXRQcmVmaXhlZFRleHQoKSA9PT0gcmVkaXJlY3QuZnJvbTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0XHRpZiAoaSAhPT0gLTEpIHtcclxuXHRcdFx0XHRcdHRlbXBsYXRlc0FycmF5W2ldLnJlZGlyZWN0VGFyZ2V0ID0gbXcuVGl0bGUubmV3RnJvbVRleHQocmVkaXJlY3QudG8pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gQXJyYXkuaXNBcnJheSh0ZW1wbGF0ZXMpID8gdGVtcGxhdGVzQXJyYXkgOiB0ZW1wbGF0ZXNBcnJheVswXTtcclxuXHR9KTtcclxufTtcclxuXHJcblRlbXBsYXRlLnByb3RvdHlwZS5nZXREYXRhRm9yUGFyYW0gPSBmdW5jdGlvbihrZXksIHBhcmFOYW1lKSB7XHJcblx0aWYgKCAhdGhpcy5wYXJhbURhdGEgKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0Ly8gSWYgYWxpYXMsIHN3aXRjaCBmcm9tIGFsaWFzIHRvIHByZWZlcnJlZCBwYXJhbWV0ZXIgbmFtZVxyXG5cdHZhciBwYXJhID0gdGhpcy5wYXJhbUFsaWFzZXNbcGFyYU5hbWVdIHx8IHBhcmFOYW1lO1x0XHJcblx0aWYgKCAhdGhpcy5wYXJhbURhdGFbcGFyYV0gKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdFxyXG5cdHZhciBkYXRhID0gdGhpcy5wYXJhbURhdGFbcGFyYV1ba2V5XTtcclxuXHQvLyBEYXRhIG1pZ2h0IGFjdHVhbGx5IGJlIGFuIG9iamVjdCB3aXRoIGtleSBcImVuXCJcclxuXHRpZiAoIGRhdGEgJiYgZGF0YS5lbiAmJiAhQXJyYXkuaXNBcnJheShkYXRhKSApIHtcclxuXHRcdHJldHVybiBkYXRhLmVuO1xyXG5cdH1cclxuXHRyZXR1cm4gZGF0YTtcclxufTtcclxuXHJcblRlbXBsYXRlLnByb3RvdHlwZS5pc1NoZWxsVGVtcGxhdGUgPSBmdW5jdGlvbigpIHtcclxuXHR2YXIgbWFpblRleHQgPSB0aGlzLnJlZGlyZWN0VGFyZ2V0XHJcblx0XHQ/IHRoaXMucmVkaXJlY3RUYXJnZXQuZ2V0TWFpblRleHQoKVxyXG5cdFx0OiB0aGlzLmdldFRpdGxlKCkuZ2V0TWFpblRleHQoKTtcclxuXHRyZXR1cm4gY29uZmlnLnNoZWxsVGVtcGxhdGVzLmluY2x1ZGVzKG1haW5UZXh0KTtcclxufTtcclxuXHJcblRlbXBsYXRlLnByb3RvdHlwZS5zZXRQYXJhbURhdGFBbmRTdWdnZXN0aW9ucyA9IGZ1bmN0aW9uKCkge1xyXG5cdHZhciBzZWxmID0gdGhpcztcclxuXHR2YXIgcGFyYW1EYXRhU2V0ID0gJC5EZWZlcnJlZCgpO1xyXG5cdFxyXG5cdGlmICggc2VsZi5wYXJhbURhdGEgKSB7IHJldHVybiBwYXJhbURhdGFTZXQucmVzb2x2ZSgpOyB9XHJcbiAgICBcclxuXHR2YXIgcHJlZml4ZWRUZXh0ID0gc2VsZi5yZWRpcmVjdFRhcmdldFxyXG5cdFx0PyBzZWxmLnJlZGlyZWN0VGFyZ2V0LmdldFByZWZpeGVkVGV4dCgpXHJcblx0XHQ6IHNlbGYuZ2V0VGl0bGUoKS5nZXRQcmVmaXhlZFRleHQoKTtcclxuXHJcblx0dmFyIGNhY2hlZEluZm8gPSBjYWNoZS5yZWFkKHByZWZpeGVkVGV4dCArIFwiLXBhcmFtc1wiKTtcclxuXHRcclxuXHRpZiAoXHJcblx0XHRjYWNoZWRJbmZvICYmXHJcblx0XHRjYWNoZWRJbmZvLnZhbHVlICYmXHJcblx0XHRjYWNoZWRJbmZvLnN0YWxlRGF0ZSAmJlxyXG5cdFx0Y2FjaGVkSW5mby52YWx1ZS5wYXJhbURhdGEgIT0gbnVsbCAmJlxyXG5cdFx0Y2FjaGVkSW5mby52YWx1ZS5wYXJhbWV0ZXJTdWdnZXN0aW9ucyAhPSBudWxsICYmXHJcblx0XHRjYWNoZWRJbmZvLnZhbHVlLnBhcmFtQWxpYXNlcyAhPSBudWxsXHJcblx0KSB7XHJcblx0XHRzZWxmLm5vdGVtcGxhdGVkYXRhID0gY2FjaGVkSW5mby52YWx1ZS5ub3RlbXBsYXRlZGF0YTtcclxuXHRcdHNlbGYucGFyYW1EYXRhID0gY2FjaGVkSW5mby52YWx1ZS5wYXJhbURhdGE7XHJcblx0XHRzZWxmLnBhcmFtZXRlclN1Z2dlc3Rpb25zID0gY2FjaGVkSW5mby52YWx1ZS5wYXJhbWV0ZXJTdWdnZXN0aW9ucztcclxuXHRcdHNlbGYucGFyYW1BbGlhc2VzID0gY2FjaGVkSW5mby52YWx1ZS5wYXJhbUFsaWFzZXM7XHJcblx0XHRcclxuXHRcdHBhcmFtRGF0YVNldC5yZXNvbHZlKCk7XHJcblx0XHRpZiAoICFpc0FmdGVyRGF0ZShjYWNoZWRJbmZvLnN0YWxlRGF0ZSkgKSB7XHJcblx0XHRcdC8vIEp1c3QgdXNlIHRoZSBjYWNoZWQgZGF0YVxyXG5cdFx0XHRyZXR1cm4gcGFyYW1EYXRhU2V0O1xyXG5cdFx0fSAvLyBlbHNlOiBVc2UgdGhlIGNhY2hlIGRhdGEgZm9yIG5vdywgYnV0IGFsc28gZmV0Y2ggbmV3IGRhdGEgZnJvbSBBUElcclxuXHR9XHJcblx0XHJcblx0QVBJLmdldCh7XHJcblx0XHRhY3Rpb246IFwidGVtcGxhdGVkYXRhXCIsXHJcblx0XHR0aXRsZXM6IHByZWZpeGVkVGV4dCxcclxuXHRcdHJlZGlyZWN0czogMSxcclxuXHRcdGluY2x1ZGVNaXNzaW5nVGl0bGVzOiAxXHJcblx0fSlcclxuXHRcdC50aGVuKFxyXG5cdFx0XHRmdW5jdGlvbihyZXNwb25zZSkgeyByZXR1cm4gcmVzcG9uc2U7IH0sXHJcblx0XHRcdGZ1bmN0aW9uKC8qZXJyb3IqLykgeyByZXR1cm4gbnVsbDsgfSAvLyBJZ25vcmUgZXJyb3JzLCB3aWxsIHVzZSBkZWZhdWx0IGRhdGFcclxuXHRcdClcclxuXHRcdC50aGVuKCBmdW5jdGlvbihyZXN1bHQpIHtcclxuXHRcdC8vIEZpZ3VyZSBvdXQgcGFnZSBpZCAoYmVhY3VzZSBhY3Rpb249dGVtcGxhdGVkYXRhIGRvZXNuJ3QgaGF2ZSBhbiBpbmRleHBhZ2VpZHMgb3B0aW9uKVxyXG5cdFx0XHR2YXIgaWQgPSByZXN1bHQgJiYgJC5tYXAocmVzdWx0LnBhZ2VzLCBmdW5jdGlvbiggX3ZhbHVlLCBrZXkgKSB7IHJldHVybiBrZXk7IH0pO1xyXG5cdFx0XHJcblx0XHRcdGlmICggIXJlc3VsdCB8fCAhcmVzdWx0LnBhZ2VzW2lkXSB8fCByZXN1bHQucGFnZXNbaWRdLm5vdGVtcGxhdGVkYXRhIHx8ICFyZXN1bHQucGFnZXNbaWRdLnBhcmFtcyApIHtcclxuXHRcdFx0Ly8gTm8gVGVtcGxhdGVEYXRhLCBzbyB1c2UgZGVmYXVsdHMgKGd1ZXNzZXMpXHJcblx0XHRcdFx0c2VsZi5ub3RlbXBsYXRlZGF0YSA9IHRydWU7XHJcblx0XHRcdFx0c2VsZi50ZW1wbGF0ZWRhdGFBcGlFcnJvciA9ICFyZXN1bHQ7XHJcblx0XHRcdFx0c2VsZi5wYXJhbURhdGEgPSBjb25maWcuZGVmYXVsdFBhcmFtZXRlckRhdGE7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0c2VsZi5wYXJhbURhdGEgPSByZXN1bHQucGFnZXNbaWRdLnBhcmFtcztcclxuXHRcdFx0fVxyXG4gICAgICAgIFxyXG5cdFx0XHRzZWxmLnBhcmFtQWxpYXNlcyA9IHt9O1xyXG5cdFx0XHQkLmVhY2goc2VsZi5wYXJhbURhdGEsIGZ1bmN0aW9uKHBhcmFOYW1lLCBwYXJhRGF0YSkge1xyXG5cdFx0XHRcdC8vIEV4dHJhY3QgYWxpYXNlcyBmb3IgZWFzaWVyIHJlZmVyZW5jZSBsYXRlciBvblxyXG5cdFx0XHRcdGlmICggcGFyYURhdGEuYWxpYXNlcyAmJiBwYXJhRGF0YS5hbGlhc2VzLmxlbmd0aCApIHtcclxuXHRcdFx0XHRcdHBhcmFEYXRhLmFsaWFzZXMuZm9yRWFjaChmdW5jdGlvbihhbGlhcyl7XHJcblx0XHRcdFx0XHRcdHNlbGYucGFyYW1BbGlhc2VzW2FsaWFzXSA9IHBhcmFOYW1lO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdC8vIEV4dHJhY3QgYWxsb3dlZCB2YWx1ZXMgYXJyYXkgZnJvbSBkZXNjcmlwdGlvblxyXG5cdFx0XHRcdGlmICggcGFyYURhdGEuZGVzY3JpcHRpb24gJiYgL1xcWy4qJy4rPycuKj9cXF0vLnRlc3QocGFyYURhdGEuZGVzY3JpcHRpb24uZW4pICkge1xyXG5cdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0dmFyIGFsbG93ZWRWYWxzID0gSlNPTi5wYXJzZShcclxuXHRcdFx0XHRcdFx0XHRwYXJhRGF0YS5kZXNjcmlwdGlvbi5lblxyXG5cdFx0XHRcdFx0XHRcdFx0LnJlcGxhY2UoL14uKlxcWy8sXCJbXCIpXHJcblx0XHRcdFx0XHRcdFx0XHQucmVwbGFjZSgvXCIvZywgXCJcXFxcXFxcIlwiKVxyXG5cdFx0XHRcdFx0XHRcdFx0LnJlcGxhY2UoLycvZywgXCJcXFwiXCIpXHJcblx0XHRcdFx0XHRcdFx0XHQucmVwbGFjZSgvLFxccypdLywgXCJdXCIpXHJcblx0XHRcdFx0XHRcdFx0XHQucmVwbGFjZSgvXS4qJC8sIFwiXVwiKVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRzZWxmLnBhcmFtRGF0YVtwYXJhTmFtZV0uYWxsb3dlZFZhbHVlcyA9IGFsbG93ZWRWYWxzO1xyXG5cdFx0XHRcdFx0fSBjYXRjaChlKSB7XHJcblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybihcIltSYXRlcl0gQ291bGQgbm90IHBhcnNlIGFsbG93ZWQgdmFsdWVzIGluIGRlc2NyaXB0aW9uOlxcbiAgXCIrXHJcblx0XHRcdFx0XHRwYXJhRGF0YS5kZXNjcmlwdGlvbi5lbiArIFwiXFxuIENoZWNrIFRlbXBsYXRlRGF0YSBmb3IgcGFyYW1ldGVyIHxcIiArIHBhcmFOYW1lICtcclxuXHRcdFx0XHRcdFwiPSBpbiBcIiArIHNlbGYuZ2V0VGl0bGUoKS5nZXRQcmVmaXhlZFRleHQoKSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdFxyXG5cdFx0XHQvLyBNYWtlIHN1Z2dlc3Rpb25zIGZvciBjb21ib2JveFxyXG5cdFx0XHR2YXIgYWxsUGFyYW1zQXJyYXkgPSAoICFzZWxmLm5vdGVtcGxhdGVkYXRhICYmIHJlc3VsdC5wYWdlc1tpZF0ucGFyYW1PcmRlciApIHx8XHJcblx0XHRcdCQubWFwKHNlbGYucGFyYW1EYXRhLCBmdW5jdGlvbihfdmFsLCBrZXkpe1xyXG5cdFx0XHRcdHJldHVybiBrZXk7XHJcblx0XHRcdH0pO1xyXG5cdFx0XHRzZWxmLnBhcmFtZXRlclN1Z2dlc3Rpb25zID0gYWxsUGFyYW1zQXJyYXkuZmlsdGVyKGZ1bmN0aW9uKHBhcmFtTmFtZSkge1xyXG5cdFx0XHRcdHJldHVybiAoIHBhcmFtTmFtZSAmJiBwYXJhbU5hbWUgIT09IFwiY2xhc3NcIiAmJiBwYXJhbU5hbWUgIT09IFwiaW1wb3J0YW5jZVwiICk7XHJcblx0XHRcdH0pXHJcblx0XHRcdFx0Lm1hcChmdW5jdGlvbihwYXJhbU5hbWUpIHtcclxuXHRcdFx0XHRcdHZhciBvcHRpb25PYmplY3QgPSB7ZGF0YTogcGFyYW1OYW1lfTtcclxuXHRcdFx0XHRcdHZhciBsYWJlbCA9IHNlbGYuZ2V0RGF0YUZvclBhcmFtKGxhYmVsLCBwYXJhbU5hbWUpO1xyXG5cdFx0XHRcdFx0aWYgKCBsYWJlbCApIHtcclxuXHRcdFx0XHRcdFx0b3B0aW9uT2JqZWN0LmxhYmVsID0gbGFiZWwgKyBcIiAofFwiICsgcGFyYW1OYW1lICsgXCI9KVwiO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmV0dXJuIG9wdGlvbk9iamVjdDtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFxyXG5cdFx0XHRpZiAoIHNlbGYudGVtcGxhdGVkYXRhQXBpRXJyb3IgKSB7XHJcblx0XHRcdFx0Ly8gRG9uJ3Qgc2F2ZSBkZWZhdWx0cy9ndWVzc2VzIHRvIGNhY2hlO1xyXG5cdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHR9XHJcblx0XHRcclxuXHRcdFx0Y2FjaGUud3JpdGUocHJlZml4ZWRUZXh0ICsgXCItcGFyYW1zXCIsIHtcclxuXHRcdFx0XHRub3RlbXBsYXRlZGF0YTogc2VsZi5ub3RlbXBsYXRlZGF0YSxcclxuXHRcdFx0XHRwYXJhbURhdGE6IHNlbGYucGFyYW1EYXRhLFxyXG5cdFx0XHRcdHBhcmFtZXRlclN1Z2dlc3Rpb25zOiBzZWxmLnBhcmFtZXRlclN1Z2dlc3Rpb25zLFxyXG5cdFx0XHRcdHBhcmFtQWxpYXNlczogc2VsZi5wYXJhbUFsaWFzZXNcclxuXHRcdFx0fSxcdDFcclxuXHRcdFx0KTtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9KVxyXG5cdFx0LnRoZW4oXHJcblx0XHRcdHBhcmFtRGF0YVNldC5yZXNvbHZlLFxyXG5cdFx0XHRwYXJhbURhdGFTZXQucmVqZWN0XHJcblx0XHQpO1xyXG5cdFxyXG5cdHJldHVybiBwYXJhbURhdGFTZXQ7XHRcclxufTtcclxuXHJcbnZhciBtYWtlTGlzdEFzID0gZnVuY3Rpb24oc3ViamVjdFRpdGxlKSB7XHJcblx0dmFyIG5hbWUgPSBzdWJqZWN0VGl0bGUuZ2V0TWFpblRleHQoKS5yZXBsYWNlKC9cXHNcXCguKlxcKS8sIFwiXCIpO1xyXG5cdGlmICggbmFtZS5pbmRleE9mKFwiIFwiKSA9PT0gLTEgKSB7XHJcblx0XHRyZXR1cm4gbmFtZTtcclxuXHR9XHJcblx0dmFyIGdlbmVyYXRpb25hbFN1ZmZpeCA9IFwiXCI7XHJcblx0aWYgKCAvICg/OltKU11yLj98W0lWWF0rKSQvLnRlc3QobmFtZSkgKSB7XHJcblx0XHRnZW5lcmF0aW9uYWxTdWZmaXggPSBuYW1lLnNsaWNlKG5hbWUubGFzdEluZGV4T2YoXCIgXCIpKTtcclxuXHRcdG5hbWUgPSBuYW1lLnNsaWNlKDAsIG5hbWUubGFzdEluZGV4T2YoXCIgXCIpKTtcclxuXHRcdGlmICggbmFtZS5pbmRleE9mKFwiIFwiKSA9PT0gLTEgKSB7XHJcblx0XHRcdHJldHVybiBuYW1lICsgZ2VuZXJhdGlvbmFsU3VmZml4O1xyXG5cdFx0fVxyXG5cdH1cclxuXHR2YXIgbGFzdE5hbWUgPSBuYW1lLnNsaWNlKG5hbWUubGFzdEluZGV4T2YoXCIgXCIpKzEpLnJlcGxhY2UoLywkLywgXCJcIik7XHJcblx0dmFyIG90aGVyTmFtZXMgPSBuYW1lLnNsaWNlKDAsIG5hbWUubGFzdEluZGV4T2YoXCIgXCIpKTtcclxuXHRyZXR1cm4gbGFzdE5hbWUgKyBcIiwgXCIgKyBvdGhlck5hbWVzICsgZ2VuZXJhdGlvbmFsU3VmZml4O1xyXG59O1xyXG5cclxuVGVtcGxhdGUucHJvdG90eXBlLmFkZE1pc3NpbmdQYXJhbXMgPSBmdW5jdGlvbigpIHtcclxuXHR2YXIgdGhpc1RlbXBsYXRlID0gdGhpcztcclxuXHJcblx0Ly8gQXV0b2ZpbGwgbGlzdGFzIHBhcmFtZXRlciBmb3IgV1A6QklPXHJcblx0dmFyIGlzQmlvZ3JhcGh5QmFubmVyID0gdGhpcy5nZXRUaXRsZSgpLmdldE1haW5UZXh0KCkgPT09IFwiV2lraVByb2plY3QgQmlvZ3JhcGh5XCIgfHxcclxuXHRcdCh0aGlzLnJlZGlyZWN0VGFyZ2V0ICYmIHRoaXMucmVkaXJlY3RUYXJnZXQuZ2V0TWFpblRleHQoKSA9PT0gXCJXaWtpUHJvamVjdCBCaW9ncmFwaHlcIik7XHJcblxyXG5cdGlmIChpc0Jpb2dyYXBoeUJhbm5lciAmJiAhdGhpcy5nZXRQYXJhbShcImxpc3Rhc1wiKSkge1xyXG5cdFx0dmFyIHN1YmplY3RUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KGNvbmZpZy5tdy53Z1BhZ2VOYW1lKS5nZXRTdWJqZWN0UGFnZSgpO1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJzLnB1c2goe1xyXG5cdFx0XHRuYW1lOiBcImxpc3Rhc1wiLFxyXG5cdFx0XHR2YWx1ZTogbWFrZUxpc3RBcyhzdWJqZWN0VGl0bGUpLFxyXG5cdFx0XHRhdXRvZmlsbGVkOiB0cnVlLFxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvLyBNYWtlIHN1cmUgcmVxdWlyZWQvc3VnZ2VzdGVkIHBhcmFtZXRlcnMgYXJlIHByZXNlbnRcclxuXHQkLmVhY2godGhpc1RlbXBsYXRlLnBhcmFtRGF0YSwgZnVuY3Rpb24ocGFyYU5hbWUsIHBhcmFEYXRhKSB7XHJcblx0XHRpZiAoIChwYXJhRGF0YS5yZXF1aXJlZCB8fCBwYXJhRGF0YS5zdWdnZXN0ZWQpICYmICF0aGlzVGVtcGxhdGUuZ2V0UGFyYW0ocGFyYU5hbWUpICkge1xyXG5cdFx0XHQvLyBDaGVjayBpZiBhbHJlYWR5IHByZXNlbnQgaW4gYW4gYWxpYXMsIGlmIGFueVxyXG5cdFx0XHRpZiAoIHBhcmFEYXRhLmFsaWFzZXMubGVuZ3RoICkge1xyXG5cdFx0XHRcdHZhciBhbGlhc2VzID0gdGhpc1RlbXBsYXRlLnBhcmFtZXRlcnMuZmlsdGVyKHAgPT4ge1xyXG5cdFx0XHRcdFx0dmFyIGlzQWxpYXMgPSBwYXJhRGF0YS5hbGlhc2VzLmluY2x1ZGVzKHAubmFtZSk7XHJcblx0XHRcdFx0XHR2YXIgaXNFbXB0eSA9ICFwLnZhbHVlO1xyXG5cdFx0XHRcdFx0cmV0dXJuIGlzQWxpYXMgJiYgIWlzRW1wdHk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0aWYgKCBhbGlhc2VzLmxlbmd0aCApIHtcclxuXHRcdFx0XHQvLyBBdCBsZWFzdCBvbmUgbm9uLWVtcHR5IGFsaWFzLCBzbyBkbyBub3RoaW5nXHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdC8vIE5vIG5vbi1lbXB0eSBhbGlhc2VzLCBzbyBhZGQgdGhpcyB0byB0aGUgcGFyYW1ldGVycyBsaXN0ICh3aXRoXHJcblx0XHRcdC8vIHZhbHVlIHNldCBwYXJhbWV0ZXIgdG8gZWl0aGVyIHRoZSBhdXRvdmF1bGUsIG9yIGFzIG51bGwpLlxyXG5cdFx0XHQvLyBBbHNvIHNldCB0aGF0IGl0IHdhcyBhdXRvZmlsbGVkLlxyXG5cdFx0XHR0aGlzVGVtcGxhdGUucGFyYW1ldGVycy5wdXNoKHtcclxuXHRcdFx0XHRuYW1lOnBhcmFOYW1lLFxyXG5cdFx0XHRcdHZhbHVlOiBwYXJhRGF0YS5hdXRvdmFsdWUgfHwgbnVsbCxcclxuXHRcdFx0XHRhdXRvZmlsbGVkOiB0cnVlLFxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHR9KTtcclxuXHJcblx0cmV0dXJuIHRoaXNUZW1wbGF0ZTtcclxufTtcclxuXHJcblRlbXBsYXRlLnByb3RvdHlwZS5zZXRDbGFzc2VzQW5kSW1wb3J0YW5jZXMgPSBmdW5jdGlvbigpIHtcclxuXHR2YXIgcGFyc2VkID0gJC5EZWZlcnJlZCgpO1xyXG5cclxuXHQvLyBEb24ndCByZS1wYXJzZSBpZiBhbHJlYWR5IHBhcnNlZDsgbm8gbmVlZCB0byBwYXJzZSBzaGVsbCB0ZW1wbGF0ZXMgb3IgYmFubmVycyB3aXRob3V0IHJhdGluZ3NcclxuXHRpZiAoIHRoaXMuaXNTaGVsbFRlbXBsYXRlKCkgKSB7XHJcblx0XHR0aGlzLmNsYXNzZXMgPSBbLi4uY29uZmlnLmJhbm5lckRlZmF1bHRzLmNsYXNzZXNdO1xyXG5cdFx0cmV0dXJuIHBhcnNlZC5yZXNvbHZlKCk7XHJcblx0fSBlbHNlIGlmICggKHRoaXMuY2xhc3NlcyAmJiB0aGlzLmltcG9ydGFuY2VzKSB8fCB0aGlzLndpdGhvdXRSYXRpbmdzICkge1xyXG5cdFx0cmV0dXJuIHBhcnNlZC5yZXNvbHZlKCk7XHJcblx0fSBcclxuXHJcblx0dmFyIG1haW5UZXh0ID0gdGhpcy5nZXRUaXRsZSgpLmdldE1haW5UZXh0KCk7XHJcblxyXG5cdC8vIFNvbWUgcHJvamVjdHMgaGF2ZSBoYXJkY29kZWQgdmFsdWVzLCB0byBhdm9pZCBzdGFuZGFyZCBjbGFzc2VzIG9yIHRvIHByZXZlbnQgQVBJIGlzc3VlcyAodGltZW91dCBhbmQvb3Igbm9kZSBjb3VudCBleGNlZWRlZClcclxuXHRjb25zdCByZWRpcmVjdFRhcmdldE9yTWFpblRleHQgPSB0aGlzLnJlZGlyZWN0VGFyZ2V0ID8gdGhpcy5yZWRpcmVjdFRhcmdldC5nZXRNYWluVGV4dCgpIDogbWFpblRleHQ7XHJcblx0aWYgKCBjb25maWcuY3VzdG9tQmFubmVyc1tyZWRpcmVjdFRhcmdldE9yTWFpblRleHRdICkge1xyXG5cdFx0dGhpcy5jbGFzc2VzID0gY29uZmlnLmN1c3RvbUJhbm5lcnNbcmVkaXJlY3RUYXJnZXRPck1haW5UZXh0XS5jbGFzc2VzO1xyXG5cdFx0dGhpcy5pbXBvcnRhbmNlcyA9IGNvbmZpZy5jdXN0b21CYW5uZXJzW3JlZGlyZWN0VGFyZ2V0T3JNYWluVGV4dF0uaW1wb3J0YW5jZXM7XHJcblx0XHRyZXR1cm4gcGFyc2VkLnJlc29sdmUoKTtcclxuXHR9XHJcblxyXG5cdC8vIE90aGVyd2lzZSB0cnkgcmVhZGluZyBmcm9tIGNhY2hlZCBkYXRhXHJcblx0dmFyIGNhY2hlZFJhdGluZ3MgPSBjYWNoZS5yZWFkKG1haW5UZXh0K1wiLXJhdGluZ3NcIik7XHJcblx0aWYgKFxyXG5cdFx0Y2FjaGVkUmF0aW5ncyAmJlxyXG5cdFx0Y2FjaGVkUmF0aW5ncy52YWx1ZSAmJlxyXG5cdFx0Y2FjaGVkUmF0aW5ncy5zdGFsZURhdGUgJiZcclxuXHRcdGNhY2hlZFJhdGluZ3MudmFsdWUuY2xhc3NlcyE9bnVsbCAmJlxyXG5cdFx0Y2FjaGVkUmF0aW5ncy52YWx1ZS5pbXBvcnRhbmNlcyE9bnVsbFxyXG5cdCkge1xyXG5cdFx0dGhpcy5jbGFzc2VzID0gY2FjaGVkUmF0aW5ncy52YWx1ZS5jbGFzc2VzO1xyXG5cdFx0dGhpcy5pbXBvcnRhbmNlcyA9IGNhY2hlZFJhdGluZ3MudmFsdWUuaW1wb3J0YW5jZXM7XHJcblx0XHRwYXJzZWQucmVzb2x2ZSgpO1xyXG5cdFx0aWYgKCAhaXNBZnRlckRhdGUoY2FjaGVkUmF0aW5ncy5zdGFsZURhdGUpICkge1xyXG5cdFx0XHQvLyBKdXN0IHVzZSB0aGUgY2FjaGVkIGRhdGFcclxuXHRcdFx0cmV0dXJuIHBhcnNlZDtcclxuXHRcdH0gLy8gZWxzZTogVXNlIHRoZSBjYWNoZSBkYXRhIGZvciBub3csIGJ1dCBhbHNvIGZldGNoIG5ldyBkYXRhIGZyb20gQVBJXHJcblx0fVxyXG5cclxuXHR2YXIgd2lraXRleHRUb1BhcnNlID0gXCJcIjtcdFxyXG5cdGNvbmZpZy5iYW5uZXJEZWZhdWx0cy5leHRlbmRlZENsYXNzZXMuZm9yRWFjaChmdW5jdGlvbihjbGFzc25hbWUsIGluZGV4KSB7XHJcblx0XHR3aWtpdGV4dFRvUGFyc2UgKz0gXCJ7e1wiICsgbWFpblRleHQgKyBcInxjbGFzcz1cIiArIGNsYXNzbmFtZSArIFwifGltcG9ydGFuY2U9XCIgK1xyXG5cdFx0KGNvbmZpZy5iYW5uZXJEZWZhdWx0cy5leHRlbmRlZEltcG9ydGFuY2VzW2luZGV4XSB8fCBcIlwiKSArIFwifX0vblwiO1xyXG5cdH0pO1xyXG5cdFxyXG5cdHJldHVybiBBUEkuZ2V0KHtcclxuXHRcdGFjdGlvbjogXCJwYXJzZVwiLFxyXG5cdFx0dGl0bGU6IFwiVGFsazpTYW5kYm94XCIsXHJcblx0XHR0ZXh0OiB3aWtpdGV4dFRvUGFyc2UsXHJcblx0XHRwcm9wOiBcImNhdGVnb3JpZXNodG1sXCJcclxuXHR9KVxyXG5cdFx0LnRoZW4oKHJlc3VsdCkgPT4ge1xyXG5cdFx0XHR2YXIgY2F0c0h0bWwgPSByZXN1bHQucGFyc2UuY2F0ZWdvcmllc2h0bWxbXCIqXCJdO1xyXG5cdFx0XHR2YXIgZXh0ZW5kZWRDbGFzc2VzID0gY29uZmlnLmJhbm5lckRlZmF1bHRzLmV4dGVuZGVkQ2xhc3Nlcy5maWx0ZXIoZnVuY3Rpb24oY2wpIHtcclxuXHRcdFx0XHRyZXR1cm4gY2F0c0h0bWwuaW5kZXhPZihjbCtcIi1DbGFzc1wiKSAhPT0gLTE7XHJcblx0XHRcdH0pO1xyXG5cdFx0XHR0aGlzLmNsYXNzZXMgPSBbLi4uY29uZmlnLmJhbm5lckRlZmF1bHRzLmNsYXNzZXMsIC4uLmV4dGVuZGVkQ2xhc3Nlc107XHJcblx0XHRcdHRoaXMuaW1wb3J0YW5jZXMgPSBjb25maWcuYmFubmVyRGVmYXVsdHMuZXh0ZW5kZWRJbXBvcnRhbmNlcy5maWx0ZXIoZnVuY3Rpb24oaW1wKSB7XHJcblx0XHRcdFx0cmV0dXJuIGNhdHNIdG1sLmluZGV4T2YoaW1wK1wiLWltcG9ydGFuY2VcIikgIT09IC0xO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0Y2FjaGUud3JpdGUobWFpblRleHQrXCItcmF0aW5nc1wiLFxyXG5cdFx0XHRcdHtcclxuXHRcdFx0XHRcdGNsYXNzZXM6IHRoaXMuY2xhc3NlcyxcclxuXHRcdFx0XHRcdGltcG9ydGFuY2VzOiB0aGlzLmltcG9ydGFuY2VzXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHQxXHJcblx0XHRcdCk7XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fSk7XHJcbn07XHJcblxyXG5leHBvcnQge1RlbXBsYXRlLCBwYXJzZVRlbXBsYXRlcywgZ2V0V2l0aFJlZGlyZWN0VG99O1xyXG4vLyA8L25vd2lraT4iLCJpbXBvcnQgY29uZmlnIGZyb20gXCIuLi8uLi9jb25maWdcIjtcclxuaW1wb3J0IEJhbm5lcldpZGdldCBmcm9tIFwiLi9CYW5uZXJXaWRnZXRcIjtcclxuaW1wb3J0IHsgbm9ybWFsaXNlWWVzTm8sIGZpbHRlckFuZE1hcCwgdW5pcXVlQXJyYXkgfSBmcm9tIFwiLi4vLi4vdXRpbFwiO1xyXG5pbXBvcnQgUGFyYW1ldGVyV2lkZ2V0IGZyb20gXCIuL1BhcmFtZXRlcldpZGdldFwiO1xyXG4vLyA8bm93aWtpPlxyXG5cclxudmFyIEJhbm5lckxpc3RXaWRnZXQgPSBmdW5jdGlvbiBCYW5uZXJMaXN0V2lkZ2V0KCBjb25maWcgKSB7XHJcblx0Y29uZmlnID0gY29uZmlnIHx8IHt9O1xyXG5cclxuXHQvLyBDYWxsIHBhcmVudCBjb25zdHJ1Y3RvclxyXG5cdEJhbm5lckxpc3RXaWRnZXQucGFyZW50LmNhbGwoIHRoaXMsIGNvbmZpZyApO1xyXG5cdE9PLnVpLm1peGluLkdyb3VwRWxlbWVudC5jYWxsKCB0aGlzLCB7XHJcblx0XHQkZ3JvdXA6IHRoaXMuJGVsZW1lbnRcclxuXHR9ICk7XHJcblx0dGhpcy4kZWxlbWVudC5hZGRDbGFzcyhcInJhdGVyLWJhbm5lckxpc3RXaWRnZXRcIikuY3NzKHtcInBhZGRpbmdcIjpcIjIwcHggMTBweCAxNnB4IDEwcHhcIn0pO1xyXG5cclxuXHQvLyBQcmVmc1xyXG5cdHRoaXMucHJlZmVyZW5jZXMgPSBjb25maWcucHJlZmVyZW5jZXM7XHJcblx0XHJcblx0dGhpcy5vcmVzQ2xhc3MgPSBjb25maWcub3Jlc0NsYXNzO1xyXG5cdFxyXG5cdHRoaXMuY2hhbmdlZCA9IGZhbHNlO1xyXG5cclxuXHQvLyBFdmVudHNcclxuXHR0aGlzLmFnZ3JlZ2F0ZSgge1wicmVtb3ZlXCI6IFwiYmFubmVyUmVtb3ZlXCJ9ICk7XHJcblx0dGhpcy5jb25uZWN0KCB0aGlzLCB7XCJiYW5uZXJSZW1vdmVcIjogXCJvbkJhbm5lclJlbW92ZVwifSApO1xyXG5cclxuXHR0aGlzLmFnZ3JlZ2F0ZSgge1wiY2hhbmdlZFwiOiBcImJhbm5lckNoYW5nZWRcIn0gKTtcclxuXHR0aGlzLmNvbm5lY3QoIHRoaXMsIHtcImJhbm5lckNoYW5nZWRcIjogXCJzZXRDaGFuZ2VkXCJ9ICk7XHJcblxyXG5cdHRoaXMuYWdncmVnYXRlKCB7XCJiaW9ncmFwaHlCYW5uZXJDaGFuZ2VcIjogXCJiaW9ncmFwaHlCYW5uZXJDaGFuZ2VkXCJ9ICk7XHJcblx0dGhpcy5jb25uZWN0KCB0aGlzLCB7XCJiaW9ncmFwaHlCYW5uZXJDaGFuZ2VkXCI6IFwic3luY1NoZWxsVGVtcGxhdGVXaXRoQmlvZ3JhcGh5QmFubmVyXCJ9ICk7XHJcblxyXG5cdHRoaXMuYWdncmVnYXRlKCB7XCJ1cGRhdGVkU2l6ZVwiOiBcImJhbm5lclVwZGF0ZWRTaXplXCJ9ICk7XHJcblx0dGhpcy5jb25uZWN0KCB0aGlzLCB7XCJiYW5uZXJVcGRhdGVkU2l6ZVwiOiBcIm9uVXBkYXRlZFNpemVcIn0gKTtcclxufTtcclxuXHJcbk9PLmluaGVyaXRDbGFzcyggQmFubmVyTGlzdFdpZGdldCwgT08udWkuV2lkZ2V0ICk7XHJcbk9PLm1peGluQ2xhc3MoIEJhbm5lckxpc3RXaWRnZXQsIE9PLnVpLm1peGluLkdyb3VwRWxlbWVudCApO1xyXG4vKlxyXG5tZXRob2RzIGZyb20gbWl4aW46XHJcbiAtIGFkZEl0ZW1zKCBpdGVtcywgW2luZGV4XSApIDogT08udWkuRWxlbWVudCAgKENIQUlOQUJMRSlcclxuIC0gY2xlYXJJdGVtcyggKSA6IE9PLnVpLkVsZW1lbnQgIChDSEFJTkFCTEUpXHJcbiAtIGZpbmRJdGVtRnJvbURhdGEoIGRhdGEgKSA6IE9PLnVpLkVsZW1lbnR8bnVsbFxyXG4gLSBmaW5kSXRlbXNGcm9tRGF0YSggZGF0YSApIDogT08udWkuRWxlbWVudFtdXHJcbiAtIHJlbW92ZUl0ZW1zKCBpdGVtcyApIDogT08udWkuRWxlbWVudCAgKENIQUlOQUJMRSlcclxuKi9cclxuXHJcbkJhbm5lckxpc3RXaWRnZXQucHJvdG90eXBlLm9uVXBkYXRlZFNpemUgPSBmdW5jdGlvbigpIHtcclxuXHQvLyBFbWl0IGFuIFwidXBkYXRlZFNpemVcIiBldmVudCBzbyB0aGUgcGFyZW50IHdpbmRvdyBjYW4gdXBkYXRlIHNpemUsIGlmIG5lZWRlZFxyXG5cdHRoaXMuZW1pdChcInVwZGF0ZWRTaXplXCIpO1xyXG59O1xyXG5cclxuQmFubmVyTGlzdFdpZGdldC5wcm90b3R5cGUuc2V0Q2hhbmdlZCA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuY2hhbmdlZCA9IHRydWU7XHJcbn07XHJcblxyXG5CYW5uZXJMaXN0V2lkZ2V0LnByb3RvdHlwZS5vbkJhbm5lclJlbW92ZSA9IGZ1bmN0aW9uICggYmFubmVyICkge1xyXG5cdHRoaXMucmVtb3ZlSXRlbXMoW2Jhbm5lcl0pO1xyXG5cdHRoaXMuc2V0Q2hhbmdlZCgpO1xyXG59O1xyXG5cclxuQmFubmVyTGlzdFdpZGdldC5wcm90b3R5cGUuc3luY1NoZWxsVGVtcGxhdGVXaXRoQmlvZ3JhcGh5QmFubmVyID0gZnVuY3Rpb24oIGJpb2dyYXBoeUJhbm5lciApIHtcclxuXHRiaW9ncmFwaHlCYW5uZXIgPSBiaW9ncmFwaHlCYW5uZXIgfHwgdGhpcy5pdGVtcy5maW5kKFxyXG5cdFx0YmFubmVyID0+IGJhbm5lci5tYWluVGV4dCA9PT0gXCJXaWtpUHJvamVjdCBCaW9ncmFwaHlcIiB8fCBiYW5uZXIucmVkaXJlY3RUYXJnZXRNYWluVGV4dCA9PT0gXCJXaWtpUHJvamVjdCBCaW9ncmFwaHlcIlxyXG5cdCk7XHJcblx0aWYgKCFiaW9ncmFwaHlCYW5uZXIpIHJldHVybjtcclxuXHJcblx0Y29uc3QgYmFubmVyU2hlbGxUZW1wbGF0ZSA9IHRoaXMuaXRlbXMuZmluZChcclxuXHRcdGJhbm5lciA9PiBiYW5uZXIubWFpblRleHQgPT09IGNvbmZpZy5zaGVsbFRlbXBsYXRlc1swXSB8fCBiYW5uZXIucmVkaXJlY3RUYXJnZXRNYWluVGV4dCA9PT0gY29uZmlnLnNoZWxsVGVtcGxhdGVzWzBdXHJcblx0KTtcclxuXHRpZiAoIWJhbm5lclNoZWxsVGVtcGxhdGUpIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblxyXG5cdGNvbnN0IHBhcmFtc1RvU3luYyA9IFtcImxpdmluZ1wiLCBcImJscG9cIiwgXCJhY3RpdmVwb2xcIl07XHJcblx0cGFyYW1zVG9TeW5jLmZvckVhY2gocGFyYW1Ub1N5bmMgPT4ge1xyXG5cdFx0Y29uc3QgW2Jpb2dyYXBoeVBhcmFtLCBzaGVsbFBhcmFtXSA9IFtiaW9ncmFwaHlCYW5uZXIsIGJhbm5lclNoZWxsVGVtcGxhdGVdLm1hcChiYW5uZXIgPT5cclxuXHRcdFx0YmFubmVyLnBhcmFtZXRlckxpc3QuZ2V0UGFyYW1ldGVySXRlbXMoKVxyXG5cdFx0XHRcdC5maW5kKHBhcmFtZXRlciA9PlxyXG5cdFx0XHRcdFx0cGFyYW1ldGVyLm5hbWUgPT09IHBhcmFtVG9TeW5jIHx8XHJcblx0XHRcdFx0XHRiYW5uZXIucGFyYW1BbGlhc2VzW3BhcmFtZXRlci5uYW1lXSA9PT0gcGFyYW1Ub1N5bmNcclxuXHRcdFx0XHQpXHJcblx0XHQpO1xyXG5cdFx0aWYgKCFiaW9ncmFwaHlQYXJhbSkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IG5vcm1hbGlzZWRQYXJhbVZhbHVlID0gbm9ybWFsaXNlWWVzTm8oYmlvZ3JhcGh5UGFyYW0udmFsdWUpO1xyXG5cdFx0YmlvZ3JhcGh5UGFyYW0uZGVsZXRlKCk7XHJcblxyXG5cdFx0aWYgKCFzaGVsbFBhcmFtKSB7XHJcblx0XHRcdGNvbnN0IGluZGV4ID0gYmFubmVyU2hlbGxUZW1wbGF0ZS5hZGRQYXJhbWV0ZXJMYXlvdXQuaXNWaXNpYmxlKClcclxuXHRcdFx0XHQ/IC0xIC8vIEluc2VydCBhdCB0aGUgdmVyeSBlbmRcclxuXHRcdFx0XHQ6IGJhbm5lclNoZWxsVGVtcGxhdGUucGFyYW1ldGVyTGlzdC5pdGVtcy5sZW5ndGgtMTsgLy8gSW5zZXJ0IHByaW9yIHRvIHRoZSBcImFkZCBwYXJhbWV0ZXJcIiBidXR0b25cclxuXHRcdFx0YmFubmVyU2hlbGxUZW1wbGF0ZS5wYXJhbWV0ZXJMaXN0LmFkZEl0ZW1zKFtcclxuXHRcdFx0XHRuZXcgUGFyYW1ldGVyV2lkZ2V0KCB7XHJcblx0XHRcdFx0XHRcIm5hbWVcIjogcGFyYW1Ub1N5bmMsXHJcblx0XHRcdFx0XHRcInZhbHVlXCI6IG5vcm1hbGlzZWRQYXJhbVZhbHVlLFxyXG5cdFx0XHRcdFx0XCJhdXRvZmlsbGVkXCI6IHRydWVcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGJhbm5lclNoZWxsVGVtcGxhdGUucGFyYW1EYXRhICYmIGJhbm5lclNoZWxsVGVtcGxhdGUucGFyYW1EYXRhW3BhcmFtVG9TeW5jXVxyXG5cdFx0XHRcdClcclxuXHRcdFx0XSwgaW5kZXgpO1xyXG5cdFx0fSBlbHNlIGlmICghYmlvZ3JhcGh5UGFyYW0uYXV0b2ZpbGxlZCkge1xyXG5cdFx0XHRzaGVsbFBhcmFtLnNldFZhbHVlKCBub3JtYWxpc2VkUGFyYW1WYWx1ZSApO1xyXG5cdFx0XHRzaGVsbFBhcmFtLnNldEF1dG9maWxsZWQoKTtcclxuXHRcdH1cclxuXHR9KTtcclxufTtcclxuXHJcbkJhbm5lckxpc3RXaWRnZXQucHJvdG90eXBlLmFkZFNoZWxsVGVtcGxhdGVJZk5lZWVkZWQgPSBmdW5jdGlvbiAoKSB7XHJcblx0aWYgKFxyXG5cdFx0IXRoaXMuaXRlbXMuc29tZShiYW5uZXIgPT4gYmFubmVyLmlzU2hlbGxUZW1wbGF0ZSlcclxuXHQpIHtcclxuXHRcdEJhbm5lcldpZGdldC5uZXdGcm9tVGVtcGxhdGVOYW1lKFxyXG5cdFx0XHRjb25maWcuc2hlbGxUZW1wbGF0ZXNbMF0sXHJcblx0XHRcdHt3aXRob3V0UmF0aW5nczogdHJ1ZX0sXHJcblx0XHRcdHtwcmVmZXJlbmNlczogdGhpcy5wcmVmZXJlbmNlcywgaXNBcnRpY2xlOiB0aGlzLnBhZ2VJbmZvLmlzQXJ0aWNsZX1cclxuXHRcdCkudGhlbihzaGVsbEJhbm5lcldpZGdldCA9PiB7XHJcblx0XHRcdE9PLnVpLm1peGluLkdyb3VwRWxlbWVudC5wcm90b3R5cGUuYWRkSXRlbXMuY2FsbCggdGhpcywgW3NoZWxsQmFubmVyV2lkZ2V0XSwgMCApO1xyXG5cdFx0XHQvLyBBdXRvZmlsbCByYXRpbmdzIChpZiBhYmxlIHRvKVxyXG5cdFx0XHR0aGlzLmF1dG9maWxsQ2xhc3NSYXRpbmdzKHtmb3JCYW5uZXJTaGVsbDogdHJ1ZX0pO1xyXG5cdFx0XHQvLyBlbWl0IHVwZGF0ZWRTaXplIGV2ZW50IFxyXG5cdFx0XHR0aGlzLm9uVXBkYXRlZFNpemUoKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIHRoaXM7XHJcbn07XHJcblxyXG5cclxuQmFubmVyTGlzdFdpZGdldC5wcm90b3R5cGUuYWRkSXRlbXMgPSBmdW5jdGlvbiAoIGl0ZW1zLCBpbmRleCApIHtcclxuXHJcblx0aWYgKCBpdGVtcy5sZW5ndGggPT09IDAgKSB7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9XHJcblxyXG5cdC8vIENhbGwgbWl4aW4gbWV0aG9kIHRvIGRvIHRoZSBhZGRpbmdcclxuXHRPTy51aS5taXhpbi5Hcm91cEVsZW1lbnQucHJvdG90eXBlLmFkZEl0ZW1zLmNhbGwoIHRoaXMsIGl0ZW1zLCBpbmRleCApO1xyXG5cclxuXHQvLyBBdXRvZmlsbCByYXRpbmdzIChpZiBhYmxlIHRvLCBhbmQgaWYgZW5hYmxlZCBpbiBwcmVmZXJlbmNlcylcclxuXHRpZiAoIXRoaXMuaXRlbXMuc29tZShiYW5uZXIgPT4gYmFubmVyLmlzU2hlbGxUZW1wbGF0ZSkpIHtcclxuXHRcdHRoaXMuYXV0b2ZpbGxDbGFzc1JhdGluZ3MoKTtcclxuXHR9XHJcblx0dGhpcy5hdXRvZmlsbEltcG9ydGFuY2VSYXRpbmdzKCk7XHJcblxyXG5cdC8vIGVtaXQgdXBkYXRlZFNpemUgZXZlbnQgXHJcblx0dGhpcy5vblVwZGF0ZWRTaXplKCk7XHJcblxyXG5cdHJldHVybiB0aGlzO1xyXG59O1xyXG5cclxuQmFubmVyTGlzdFdpZGdldC5wcm90b3R5cGUuYXV0b2ZpbGxDbGFzc1JhdGluZ3MgPSBmdW5jdGlvbihjb25maWcpIHtcclxuXHRjb25maWcgPSBjb25maWcgfHwge307XHJcblx0Ly8gT25seSBhdXRvZmlsbCBpZiBzZXQgaW4gcHJlZmVyZW5jZXNcclxuXHRpZiAoIXRoaXMucHJlZmVyZW5jZXMuYXV0b2ZpbGxDbGFzc0Zyb21PdGhlcnMgJiYgIXRoaXMucHJlZmVyZW5jZXMuYXV0b2ZpbGxDbGFzc0Zyb21PcmVzICYmICFjb25maWcuZm9yQmFubmVyU2hlbGwpIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblx0Ly8gQ2hlY2sgd2hhdCBiYW5uZXJzIGFscmVhZHkgaGF2ZVxyXG5cdGNvbnN0IHVuaXF1ZUNsYXNzUmF0aW5ncyA9IHVuaXF1ZUFycmF5KCBmaWx0ZXJBbmRNYXAoXHJcblx0XHR0aGlzLml0ZW1zLFxyXG5cdFx0YmFubmVyID0+IHtcclxuXHRcdFx0aWYgKGJhbm5lci5pc1NoZWxsVGVtcGxhdGUgfHwgIWJhbm5lci5oYXNDbGFzc1JhdGluZ3MpIHtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHRcdFx0Y29uc3QgY2xhc3NJdGVtID0gYmFubmVyLmNsYXNzRHJvcGRvd24uZ2V0TWVudSgpLmZpbmRTZWxlY3RlZEl0ZW0oKTtcclxuXHRcdFx0cmV0dXJuIGNsYXNzSXRlbSAmJiBjbGFzc0l0ZW0uZ2V0RGF0YSgpO1xyXG5cdFx0fSxcclxuXHRcdGJhbm5lciA9PiBiYW5uZXIuY2xhc3NEcm9wZG93bi5nZXRNZW51KCkuZmluZFNlbGVjdGVkSXRlbSgpLmdldERhdGEoKVxyXG5cdCkpO1xyXG5cdC8vIENhbid0IGF1dG9maWxsIGlmIHRoZXJlIGlzbid0IGVpdGhlciBhIHNpbmdsZSB2YWx1ZSwgb3Igbm8gdmFsdWVcclxuXHRpZiAodW5pcXVlQ2xhc3NSYXRpbmdzLmxlbmd0aCA+IDEpIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblx0Ly8gRGV0ZXJtaW5lIHdoYXQgdG8gYXV0b2ZpbGwgd2l0aFxyXG5cdGxldCBhdXRvQ2xhc3M7XHJcblx0aWYgKHVuaXF1ZUNsYXNzUmF0aW5ncy5sZW5ndGggPT09IDEgJiYgKHRoaXMucHJlZmVyZW5jZXMuYXV0b2ZpbGxDbGFzc0Zyb21PdGhlcnMgfHwgY29uZmlnLmZvckJhbm5lclNoZWxsKSkge1xyXG5cdFx0YXV0b0NsYXNzID0gdW5pcXVlQ2xhc3NSYXRpbmdzWzBdO1xyXG5cdH0gZWxzZSBpZiAodW5pcXVlQ2xhc3NSYXRpbmdzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLnByZWZlcmVuY2VzLmF1dG9maWxsQ2xhc3NGcm9tT3JlcyAmJiB0aGlzLm9yZXNDbGFzcykge1xyXG5cdFx0Ly8gRG9uJ3QgYXV0b2ZpbGwgYWJvdmUgQy1jbGFzc1xyXG5cdFx0c3dpdGNoKHRoaXMub3Jlc0NsYXNzKSB7XHJcblx0XHRjYXNlIFwiU3R1YlwiOiBjYXNlIFwiU3RhcnRcIjogY2FzZSBcIkNcIjogY2FzZSBcIkxpc3RcIjpcclxuXHRcdFx0YXV0b0NsYXNzID0gdGhpcy5vcmVzQ2xhc3M7XHJcblx0XHR9XHJcblx0fSBlbHNlIHtcclxuXHRcdC8vIG5vdGhpbmcgdG8gZG9cclxuXHRcdHJldHVybjtcclxuXHR9XHJcblx0Ly8gRG8gdGhlIGF1dG9maWxsaW5nXHJcblx0dGhpcy5pdGVtcy5mb3JFYWNoKGJhbm5lciA9PiB7XHJcblx0XHRpZiAoIWJhbm5lci5oYXNDbGFzc1JhdGluZ3MgJiYgIWJhbm5lci5pc1NoZWxsVGVtcGxhdGUpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgY2xhc3NJdGVtID0gYmFubmVyLmNsYXNzRHJvcGRvd24uZ2V0TWVudSgpLmZpbmRTZWxlY3RlZEl0ZW0oKTtcclxuXHRcdGlmIChjbGFzc0l0ZW0gJiYgY2xhc3NJdGVtLmdldERhdGEoKSAmJiAhY29uZmlnLmZvckJhbm5lclNoZWxsKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGlmIChjb25maWcuZm9yQmFubmVyU2hlbGwgJiYgIWJhbm5lci5pc1NoZWxsVGVtcGxhdGUgJiYgY2xhc3NJdGVtLmdldERhdGEoKSA9PT0gYXV0b0NsYXNzKSB7XHJcblx0XHRcdGJhbm5lci5jbGFzc0Ryb3Bkb3duLmdldE1lbnUoKS5zZWxlY3RJdGVtQnlEYXRhKG51bGwpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRiYW5uZXIuY2xhc3NEcm9wZG93bi5nZXRNZW51KCkuc2VsZWN0SXRlbUJ5RGF0YShhdXRvQ2xhc3MpO1xyXG5cdFx0YmFubmVyLmNsYXNzRHJvcGRvd24uc2V0QXV0b2ZpbGxlZCh0cnVlKTtcclxuXHR9KTtcclxufTtcclxuXHJcbkJhbm5lckxpc3RXaWRnZXQucHJvdG90eXBlLmF1dG9maWxsSW1wb3J0YW5jZVJhdGluZ3MgPSBmdW5jdGlvbigpIHtcclxuXHRpZiAoIXRoaXMucHJlZmVyZW5jZXMuYXV0b2ZpbGxJbXBvcnRhbmNlKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdGNvbnN0IGlzUmVndWxhckFydGljbGUgPSB0aGlzLnBhZ2VJbmZvICYmIHRoaXMucGFnZUluZm8uaXNBcnRpY2xlICYmICF0aGlzLnBhZ2VJbmZvLnJlZGlyZWN0ICYmICF0aGlzLnBhZ2VJbmZvLmlzRGlzYW1iaWc7XHJcblx0aWYgKCFpc1JlZ3VsYXJBcnRpY2xlKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdC8vIFRPRE86IFNob3VsZCB0cnkgdG8gZmluZCBhIHNtYXJ0ZXIsIGJhbm5lci1zcGVjaWZpYyB3YXkgb2YgZGV0ZXJtaW5pbmcgaW1wb3J0YW5jZS5cclxuXHQvLyBNYXliZSBkbyBzb21ldGhpbmcgd2l0aCAgT1JFUydzIFwiZHJhZnR0b3BpY1wiIG1vZGVsLlxyXG5cdGNvbnN0IGF1dG9JbXBvcnRhbmNlID0gXCJMb3dcIjtcclxuXHR0aGlzLml0ZW1zLmZvckVhY2goYmFubmVyID0+IHtcclxuXHRcdGlmICghYmFubmVyLmhhc0ltcG9ydGFuY2VSYXRpbmdzKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGNvbnN0IGltcG9ydGFuY2VJdGVtID0gYmFubmVyLmltcG9ydGFuY2VEcm9wZG93bi5nZXRNZW51KCkuZmluZFNlbGVjdGVkSXRlbSgpO1xyXG5cdFx0aWYgKGltcG9ydGFuY2VJdGVtICYmIGltcG9ydGFuY2VJdGVtLmdldERhdGEoKSkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRiYW5uZXIuaW1wb3J0YW5jZURyb3Bkb3duLmdldE1lbnUoKS5zZWxlY3RJdGVtQnlEYXRhKGF1dG9JbXBvcnRhbmNlKTtcclxuXHRcdGJhbm5lci5pbXBvcnRhbmNlRHJvcGRvd24uc2V0QXV0b2ZpbGxlZCh0cnVlKTtcclxuXHR9KTtcclxufTtcclxuXHJcbkJhbm5lckxpc3RXaWRnZXQucHJvdG90eXBlLnNldFByZWZlcmVuY2VzID0gZnVuY3Rpb24ocHJlZnMpIHtcclxuXHR0aGlzLnByZWZlcmVuY2VzID0gcHJlZnM7XHJcblx0dGhpcy5pdGVtcy5mb3JFYWNoKGJhbm5lciA9PiBiYW5uZXIuc2V0UHJlZmVyZW5jZXMocHJlZnMpKTtcclxuXHR0aGlzLmF1dG9maWxsQ2xhc3NSYXRpbmdzKCk7XHJcblx0dGhpcy5hdXRvZmlsbEltcG9ydGFuY2VSYXRpbmdzKCk7XHJcbn07XHJcblxyXG5CYW5uZXJMaXN0V2lkZ2V0LnByb3RvdHlwZS5tYWtlV2lraXRleHQgPSBmdW5jdGlvbigpIHtcclxuXHR2YXIgYmFubmVyc1dpa2l0ZXh0ID0gZmlsdGVyQW5kTWFwKFxyXG5cdFx0dGhpcy5pdGVtcyxcclxuXHRcdGJhbm5lciA9PiAhYmFubmVyLmlzU2hlbGxUZW1wbGF0ZSxcclxuXHRcdGJhbm5lciA9PiBiYW5uZXIubWFrZVdpa2l0ZXh0KClcclxuXHQpLmpvaW4oXCJcXG5cIik7XHJcblx0dmFyIHNoZWxsVGVtcGxhdGUgPSB0aGlzLml0ZW1zLmZpbmQoYmFubmVyID0+IGJhbm5lci5pc1NoZWxsVGVtcGxhdGUpO1xyXG5cdGlmICghc2hlbGxUZW1wbGF0ZSkge1xyXG5cdFx0cmV0dXJuIGJhbm5lcnNXaWtpdGV4dDtcclxuXHR9XHJcblx0dmFyIHNoZWxsUGFyYW0xID0gbmV3IFBhcmFtZXRlcldpZGdldCh7XHJcblx0XHRuYW1lOlwiMVwiLFxyXG5cdFx0dmFsdWU6IFwiXFxuXCIgKyBiYW5uZXJzV2lraXRleHQgKyBcIlxcblwiICtcclxuXHRcdFx0KHNoZWxsVGVtcGxhdGUubm9uU3RhbmRhcmRUZW1wbGF0ZXNcdD8gc2hlbGxUZW1wbGF0ZS5ub25TdGFuZGFyZFRlbXBsYXRlcyArIFwiXFxuXCIgOiBcIlwiKVxyXG5cdH0pO1xyXG5cdHNoZWxsVGVtcGxhdGUucGFyYW1ldGVyTGlzdC5hZGRJdGVtcyhbIHNoZWxsUGFyYW0xIF0pO1xyXG5cdHZhciBzaGVsbFdpa2l0ZXh0ID0gc2hlbGxUZW1wbGF0ZS5tYWtlV2lraXRleHQoKTtcclxuXHRzaGVsbFRlbXBsYXRlLnBhcmFtZXRlckxpc3QucmVtb3ZlSXRlbXMoWyBzaGVsbFBhcmFtMSBdKTtcclxuXHRyZXR1cm4gc2hlbGxXaWtpdGV4dDtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJhbm5lckxpc3RXaWRnZXQ7XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCBQYXJhbWV0ZXJMaXN0V2lkZ2V0IGZyb20gXCIuL1BhcmFtZXRlckxpc3RXaWRnZXRcIjtcclxuaW1wb3J0IFBhcmFtZXRlcldpZGdldCBmcm9tIFwiLi9QYXJhbWV0ZXJXaWRnZXRcIjtcclxuaW1wb3J0IERyb3Bkb3duUGFyYW1ldGVyV2lkZ2V0IGZyb20gXCIuL0Ryb3Bkb3duUGFyYW1ldGVyV2lkZ2V0XCI7XHJcbmltcG9ydCBTdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0IGZyb20gXCIuL1N1Z2dlc3Rpb25Mb29rdXBUZXh0SW5wdXRXaWRnZXRcIjtcclxuaW1wb3J0IHsgZmlsdGVyQW5kTWFwLCBjbGFzc01hc2ssIGltcG9ydGFuY2VNYXNrIH0gZnJvbSBcIi4uLy4uL3V0aWxcIjtcclxuaW1wb3J0IHtUZW1wbGF0ZSwgZ2V0V2l0aFJlZGlyZWN0VG99IGZyb20gXCIuLi8uLi9UZW1wbGF0ZVwiO1xyXG5pbXBvcnQgSG9yaXpvbnRhbExheW91dFdpZGdldCBmcm9tIFwiLi9Ib3Jpem9udGFsTGF5b3V0V2lkZ2V0XCI7XHJcbmltcG9ydCBnbG9iYWxDb25maWcgZnJvbSBcIi4uLy4uL2NvbmZpZ1wiO1xyXG4vLyA8bm93aWtpPlxyXG5cclxuZnVuY3Rpb24gQmFubmVyV2lkZ2V0KCB0ZW1wbGF0ZSwgY29uZmlnICkge1xyXG5cdC8vIENvbmZpZ3VyYXRpb24gaW5pdGlhbGl6YXRpb25cclxuXHRjb25maWcgPSBjb25maWcgfHwge307XHJcblx0Ly8gQ2FsbCBwYXJlbnQgY29uc3RydWN0b3JcclxuXHRCYW5uZXJXaWRnZXQuc3VwZXIuY2FsbCggdGhpcywgY29uZmlnICk7XHJcblx0dGhpcy4kb3ZlcmxheSA9IGNvbmZpZy4kb3ZlcmxheTtcclxuXHJcblx0LyogLS0tIFBSRUZTIC0tLSAqL1xyXG5cdHRoaXMucHJlZmVyZW5jZXMgPSBjb25maWcucHJlZmVyZW5jZXM7XHJcblx0XHJcblx0LyogLS0tIFBST1BTIC0tLSAqL1xyXG5cdHRoaXMucGFyYW1EYXRhID0gdGVtcGxhdGUucGFyYW1EYXRhO1xyXG5cdHRoaXMucGFyYW1BbGlhc2VzID0gdGVtcGxhdGUucGFyYW1BbGlhc2VzIHx8IHt9O1xyXG5cdHRoaXMucGFyYW1ldGVyU3VnZ2VzdGlvbnMgPSB0ZW1wbGF0ZS5wYXJhbWV0ZXJTdWdnZXN0aW9ucztcclxuXHR0aGlzLm5hbWUgPSB0ZW1wbGF0ZS5uYW1lO1xyXG5cdHRoaXMud2lraXRleHQgPSB0ZW1wbGF0ZS53aWtpdGV4dDtcclxuXHR0aGlzLnBpcGVTdHlsZSA9IHRlbXBsYXRlLnBpcGVTdHlsZTtcclxuXHR0aGlzLmVxdWFsc1N0eWxlID0gdGVtcGxhdGUuZXF1YWxzU3R5bGU7XHJcblx0dGhpcy5lbmRCcmFjZXNTdHlsZSA9IHRlbXBsYXRlLmVuZEJyYWNlc1N0eWxlO1xyXG5cdHRoaXMubWFpblRleHQgPSB0ZW1wbGF0ZS5nZXRUaXRsZSgpLmdldE1haW5UZXh0KCk7XHJcblx0dGhpcy5yZWRpcmVjdFRhcmdldE1haW5UZXh0ID0gdGVtcGxhdGUucmVkaXJlY3RUYXJnZXQgJiYgdGVtcGxhdGUucmVkaXJlY3RUYXJnZXQuZ2V0TWFpblRleHQoKTtcclxuXHR0aGlzLmlzU2hlbGxUZW1wbGF0ZSA9IHRlbXBsYXRlLmlzU2hlbGxUZW1wbGF0ZSgpO1xyXG5cdHRoaXMuY2hhbmdlZCA9IHRlbXBsYXRlLnBhcmFtZXRlcnMuc29tZShwYXJhbWV0ZXIgPT4gcGFyYW1ldGVyLmF1dG9maWxsZWQpOyAvLyBpbml0aWFsbHkgZmFsc2UsIHVubGVzcyBzb21lIHBhcmFtZXRlcnMgd2VyZSBhdXRvZmlsbGVkXHJcblx0dGhpcy5oYXNDbGFzc1JhdGluZ3MgPSB0ZW1wbGF0ZS5jbGFzc2VzICYmIHRlbXBsYXRlLmNsYXNzZXMubGVuZ3RoO1xyXG5cdHRoaXMuaGFzSW1wb3J0YW5jZVJhdGluZ3MgPSB0ZW1wbGF0ZS5pbXBvcnRhbmNlcyAmJiB0ZW1wbGF0ZS5pbXBvcnRhbmNlcy5sZW5ndGg7XHJcblx0dGhpcy5pbmFjdGl2ZVByb2plY3QgPSB0ZW1wbGF0ZS5pbmFjdGl2ZVByb2plY3Q7XHJcblxyXG5cdC8qIC0tLSBUSVRMRSBBTkQgUkFUSU5HUyAtLS0gKi9cclxuXHJcblx0dGhpcy5yZW1vdmVCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KCB7XHJcblx0XHRpY29uOiBcInRyYXNoXCIsXHJcblx0XHRsYWJlbDogXCJSZW1vdmUgYmFubmVyXCIsXHJcblx0XHR0aXRsZTogXCJSZW1vdmUgYmFubmVyXCIsXHJcblx0XHRmbGFnczogXCJkZXN0cnVjdGl2ZVwiLFxyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8ZGl2IHN0eWxlPVxcXCJ3aWR0aDoxMDAlXFxcIj5cIilcclxuXHR9ICk7XHJcblx0dGhpcy5jbGVhckJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoIHtcclxuXHRcdGljb246IFwiY2FuY2VsXCIsXHJcblx0XHRsYWJlbDogXCJDbGVhciBwYXJhbWV0ZXJzXCIsXHJcblx0XHR0aXRsZTogXCJDbGVhciBwYXJhbWV0ZXJzXCIsXHJcblx0XHRmbGFnczogXCJkZXN0cnVjdGl2ZVwiLFxyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8ZGl2IHN0eWxlPVxcXCJ3aWR0aDoxMDAlXFxcIj5cIilcclxuXHR9ICk7XHJcblx0dGhpcy5yZW1vdmVCdXR0b24uJGVsZW1lbnQuZmluZChcImFcIikuY3NzKFwid2lkdGhcIixcIjEwMCVcIik7XHJcblx0dGhpcy5jbGVhckJ1dHRvbi4kZWxlbWVudC5maW5kKFwiYVwiKS5jc3MoXCJ3aWR0aFwiLFwiMTAwJVwiKTtcclxuXHJcblx0dGhpcy50aXRsZUJ1dHRvbnNHcm91cCA9IG5ldyBPTy51aS5CdXR0b25Hcm91cFdpZGdldCgge1xyXG5cdFx0aXRlbXM6IFsgdGhpcy5yZW1vdmVCdXR0b24sXHR0aGlzLmNsZWFyQnV0dG9uIF0sXHJcblx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSd3aWR0aDoxMDAlOyc+XCIpLFxyXG5cdH0gKTtcclxuXHJcblx0dGhpcy5tYWluTGFiZWxQb3B1cEJ1dHRvbiA9IG5ldyBPTy51aS5Qb3B1cEJ1dHRvbldpZGdldCgge1xyXG5cdFx0bGFiZWw6IGB7eyR7dGVtcGxhdGUuZ2V0VGl0bGUoKS5nZXRNYWluVGV4dCgpfX19JHt0aGlzLmluYWN0aXZlUHJvamVjdCA/IFwiIChpbmFjdGl2ZSlcIiA6IFwiXCJ9YCxcclxuXHRcdCRlbGVtZW50OiAkKFwiPHNwYW4gc3R5bGU9J2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjQ4JTttYXJnaW4tcmlnaHQ6MDtwYWRkaW5nLXJpZ2h0OjhweCc+XCIpLFxyXG5cdFx0JG92ZXJsYXk6IHRoaXMuJG92ZXJsYXksXHJcblx0XHRpbmRpY2F0b3I6XCJkb3duXCIsXHJcblx0XHRmcmFtZWQ6ZmFsc2UsXHJcblx0XHRwb3B1cDoge1xyXG5cdFx0XHQkY29udGVudDogdGhpcy50aXRsZUJ1dHRvbnNHcm91cC4kZWxlbWVudCxcclxuXHRcdFx0d2lkdGg6IDIwMCxcclxuXHRcdFx0cGFkZGVkOiBmYWxzZSxcclxuXHRcdFx0YWxpZ246IFwiZm9yY2UtcmlnaHRcIixcclxuXHRcdFx0YW5jaG9yOiBmYWxzZVxyXG5cdFx0fVxyXG5cdH0gKTtcclxuXHR0aGlzLm1haW5MYWJlbFBvcHVwQnV0dG9uLiRlbGVtZW50XHJcblx0XHQuY2hpbGRyZW4oXCJhXCIpLmZpcnN0KCkuY3NzKHtcImZvbnQtc2l6ZVwiOlwiMTEwJVwifSlcclxuXHRcdC5maW5kKFwic3Bhbi5vby11aS1sYWJlbEVsZW1lbnQtbGFiZWxcIikuY3NzKHtcIndoaXRlLXNwYWNlXCI6XCJub3JtYWxcIn0pO1xyXG5cclxuXHQvLyBSYXRpbmcgZHJvcGRvd25zXHJcblx0aWYgKHRoaXMuaXNTaGVsbFRlbXBsYXRlKSB7XHJcblx0XHR0aGlzLmNsYXNzRHJvcGRvd24gPSBuZXcgRHJvcGRvd25QYXJhbWV0ZXJXaWRnZXQoIHtcclxuXHRcdFx0bGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChcIjxzcGFuIHN0eWxlPVxcXCJjb2xvcjojNzc3XFxcIj5DbGFzczwvc3Bhbj5cIiksXHJcblx0XHRcdG1lbnU6IHtcclxuXHRcdFx0XHRpdGVtczogW1xyXG5cdFx0XHRcdFx0bmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoIHtcclxuXHRcdFx0XHRcdFx0ZGF0YTogbnVsbCxcclxuXHRcdFx0XHRcdFx0bGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChgPHNwYW4gc3R5bGU9XCJjb2xvcjojNzc3XCI+KCR7Y29uZmlnLmlzQXJ0aWNsZSA/IFwibm8gY2xhc3NcIiA6IFwiYXV0by1kZXRlY3RcIn0pPC9zcGFuPmApXHJcblx0XHRcdFx0XHR9ICksXHJcblx0XHRcdFx0XHQuLi5nbG9iYWxDb25maWcuYmFubmVyRGVmYXVsdHMuY2xhc3Nlcy5tYXAoIGNsYXNzbmFtZSA9PlxyXG5cdFx0XHRcdFx0XHRuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCgge1xyXG5cdFx0XHRcdFx0XHRcdGRhdGE6IGNsYXNzbmFtZSxcclxuXHRcdFx0XHRcdFx0XHRsYWJlbDogY2xhc3NuYW1lXHJcblx0XHRcdFx0XHRcdH0gKVxyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHRcdF0sXHJcblx0XHRcdH0sXHJcblx0XHRcdCRvdmVybGF5OiB0aGlzLiRvdmVybGF5LFxyXG5cdFx0fSApO1xyXG5cdFx0dmFyIHNoZWxsQ2xhc3NQYXJhbSA9IHRlbXBsYXRlLnBhcmFtZXRlcnMuZmluZChwYXJhbWV0ZXIgPT4gcGFyYW1ldGVyLm5hbWUgPT09IFwiY2xhc3NcIik7XHJcblx0XHR0aGlzLmNsYXNzRHJvcGRvd24uZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoIHNoZWxsQ2xhc3NQYXJhbSAmJiBjbGFzc01hc2soc2hlbGxDbGFzc1BhcmFtLnZhbHVlKSApO1xyXG5cdH0gZWxzZSBpZiAodGhpcy5oYXNDbGFzc1JhdGluZ3MpIHtcclxuXHRcdHRoaXMuY2xhc3NEcm9wZG93biA9IG5ldyBEcm9wZG93blBhcmFtZXRlcldpZGdldCgge1xyXG5cdFx0XHRsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KFwiPHNwYW4gc3R5bGU9XFxcImNvbG9yOiM3NzdcXFwiPkNsYXNzPC9zcGFuPlwiKSxcclxuXHRcdFx0bWVudToge1xyXG5cdFx0XHRcdGl0ZW1zOiBbXHJcblx0XHRcdFx0XHRuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCgge1xyXG5cdFx0XHRcdFx0XHRkYXRhOiBudWxsLFxyXG5cdFx0XHRcdFx0XHRsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KGA8c3BhbiBzdHlsZT1cImNvbG9yOiM3NzdcIj4oJHtjb25maWcuaXNBcnRpY2xlID8gXCJpbmhlcml0IGZyb20gc2hlbGxcIiA6IFwiYXV0by1kZXRlY3RcIn0pPC9zcGFuPmApXHJcblx0XHRcdFx0XHR9ICksXHJcblx0XHRcdFx0XHQuLi50ZW1wbGF0ZS5jbGFzc2VzLm1hcCggY2xhc3NuYW1lID0+XHJcblx0XHRcdFx0XHRcdG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KCB7XHJcblx0XHRcdFx0XHRcdFx0ZGF0YTogY2xhc3NuYW1lLFxyXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiBjbGFzc25hbWVcclxuXHRcdFx0XHRcdFx0fSApXHJcblx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XSxcclxuXHRcdFx0fSxcclxuXHRcdFx0JG92ZXJsYXk6IHRoaXMuJG92ZXJsYXksXHJcblx0XHR9ICk7XHJcblx0XHR2YXIgY2xhc3NQYXJhbSA9IHRlbXBsYXRlLnBhcmFtZXRlcnMuZmluZChwYXJhbWV0ZXIgPT4gcGFyYW1ldGVyLm5hbWUgPT09IFwiY2xhc3NcIik7XHJcblx0XHR0aGlzLmNsYXNzRHJvcGRvd24uZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoIGNsYXNzUGFyYW0gJiYgY2xhc3NNYXNrKGNsYXNzUGFyYW0udmFsdWUpICk7XHJcblx0fVxyXG5cclxuXHRpZiAodGhpcy5oYXNJbXBvcnRhbmNlUmF0aW5ncykge1xyXG5cdFx0dGhpcy5pbXBvcnRhbmNlRHJvcGRvd24gPSBuZXcgRHJvcGRvd25QYXJhbWV0ZXJXaWRnZXQoIHtcclxuXHRcdFx0bGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChcIjxzcGFuIHN0eWxlPVxcXCJjb2xvcjojNzc3XFxcIj5JbXBvcnRhbmNlPC9zcGFuPlwiKSxcclxuXHRcdFx0bWVudToge1xyXG5cdFx0XHRcdGl0ZW1zOiBbXHJcblx0XHRcdFx0XHRuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCgge1xyXG5cdFx0XHRcdFx0XHRkYXRhOiBudWxsLCBsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KGA8c3BhbiBzdHlsZT1cImNvbG9yOiM3NzdcIj4oJHtjb25maWcuaXNBcnRpY2xlID8gXCJubyBpbXBvcnRhbmNlXCIgOiBcImF1dG8tZGV0ZWN0XCJ9KTwvc3Bhbj5gKVxyXG5cdFx0XHRcdFx0fSApLFxyXG5cdFx0XHRcdFx0Li4udGVtcGxhdGUuaW1wb3J0YW5jZXMubWFwKGltcG9ydGFuY2UgPT5cclxuXHRcdFx0XHRcdFx0bmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoIHtcclxuXHRcdFx0XHRcdFx0XHRkYXRhOiBpbXBvcnRhbmNlLFxyXG5cdFx0XHRcdFx0XHRcdGxhYmVsOiBpbXBvcnRhbmNlXHJcblx0XHRcdFx0XHRcdH0gKVxyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHRcdF1cclxuXHRcdFx0fSxcclxuXHRcdFx0JG92ZXJsYXk6IHRoaXMuJG92ZXJsYXksXHJcblx0XHR9ICk7XHJcblx0XHR2YXIgaW1wb3J0YW5jZVBhcmFtID0gdGVtcGxhdGUucGFyYW1ldGVycy5maW5kKHBhcmFtZXRlciA9PiBwYXJhbWV0ZXIubmFtZSA9PT0gXCJpbXBvcnRhbmNlXCIpO1xyXG5cdFx0dGhpcy5pbXBvcnRhbmNlRHJvcGRvd24uZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoIGltcG9ydGFuY2VQYXJhbSAmJiBpbXBvcnRhbmNlTWFzayhpbXBvcnRhbmNlUGFyYW0udmFsdWUpICk7XHJcblx0fVxyXG5cclxuXHR0aGlzLnRpdGxlTGF5b3V0ID0gbmV3IE9PLnVpLkhvcml6b250YWxMYXlvdXQoIHtcclxuXHRcdGl0ZW1zOiBbIHRoaXMubWFpbkxhYmVsUG9wdXBCdXR0b24gXVxyXG5cdH0gKTtcclxuXHRpZiAodGhpcy5oYXNDbGFzc1JhdGluZ3MgfHwgdGhpcy5pc1NoZWxsVGVtcGxhdGUpIHtcclxuXHRcdHRoaXMudGl0bGVMYXlvdXQuYWRkSXRlbXMoWyB0aGlzLmNsYXNzRHJvcGRvd24gXSk7XHJcblx0fVxyXG5cdGlmICh0aGlzLmhhc0ltcG9ydGFuY2VSYXRpbmdzKSB7XHJcblx0XHR0aGlzLnRpdGxlTGF5b3V0LmFkZEl0ZW1zKFsgdGhpcy5pbXBvcnRhbmNlRHJvcGRvd24gXSk7XHJcblx0fVxyXG5cclxuXHQvKiAtLS0gUEFSQU1FVEVSUyBMSVNUIC0tLSAqL1xyXG5cclxuXHR2YXIgcGFyYW1ldGVyV2lkZ2V0cyA9IGZpbHRlckFuZE1hcChcclxuXHRcdHRlbXBsYXRlLnBhcmFtZXRlcnMsXHJcblx0XHRwYXJhbSA9PiB7XHJcblx0XHRcdGlmICggdGhpcy5pc1NoZWxsVGVtcGxhdGUgKSB7XHJcblx0XHRcdFx0aWYgKHBhcmFtLm5hbWUgPT0gXCIxXCIpIHtcclxuXHRcdFx0XHRcdHRoaXMuc2hlbGxQYXJhbTFWYWx1ZSA9IHBhcmFtLnZhbHVlO1xyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gcGFyYW0ubmFtZSAhPT0gXCJjbGFzc1wiO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBwYXJhbS5uYW1lICE9PSBcImNsYXNzXCIgJiYgcGFyYW0ubmFtZSAhPT0gXCJpbXBvcnRhbmNlXCI7XHJcblx0XHR9LFxyXG5cdFx0cGFyYW0gPT4gbmV3IFBhcmFtZXRlcldpZGdldChwYXJhbSwgdGVtcGxhdGUucGFyYW1EYXRhW3BhcmFtLm5hbWVdLCB7JG92ZXJsYXk6IHRoaXMuJG92ZXJsYXl9KVxyXG5cdCk7XHJcblxyXG5cdHRoaXMucGFyYW1ldGVyTGlzdCA9IG5ldyBQYXJhbWV0ZXJMaXN0V2lkZ2V0KCB7XHJcblx0XHRpdGVtczogcGFyYW1ldGVyV2lkZ2V0cyxcclxuXHRcdHByZWZlcmVuY2VzOiB0aGlzLnByZWZlcmVuY2VzXHJcblx0fSApO1xyXG5cclxuXHQvKiAtLS0gQUREIFBBUkFNRVRFUiBTRUNUSU9OIC0tLSAqL1xyXG5cclxuXHR0aGlzLmFkZFBhcmFtZXRlck5hbWVJbnB1dCA9IG5ldyBTdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0KHtcclxuXHRcdHN1Z2dlc3Rpb25zOiB0ZW1wbGF0ZS5wYXJhbWV0ZXJTdWdnZXN0aW9ucyxcclxuXHRcdHBsYWNlaG9sZGVyOiBcInBhcmFtZXRlciBuYW1lXCIsXHJcblx0XHQkZWxlbWVudDogJChcIjxkaXYgc3R5bGU9J2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjQwJSc+XCIpLFxyXG5cdFx0dmFsaWRhdGU6IGZ1bmN0aW9uKHZhbCkge1xyXG5cdFx0XHRsZXQge3ZhbGlkTmFtZSwgbmFtZSwgdmFsdWV9ID0gdGhpcy5nZXRBZGRQYXJhbWV0ZXJzSW5mbyh2YWwpO1xyXG5cdFx0XHRyZXR1cm4gKCFuYW1lICYmICF2YWx1ZSkgPyB0cnVlIDogdmFsaWROYW1lO1xyXG5cdFx0fS5iaW5kKHRoaXMpLFxyXG5cdFx0YWxsb3dTdWdnZXN0aW9uc1doZW5FbXB0eTogdHJ1ZSxcclxuXHRcdCRvdmVybGF5OiB0aGlzLiRvdmVybGF5XHJcblx0fSk7XHJcblx0dGhpcy51cGRhdGVBZGRQYXJhbWV0ZXJOYW1lU3VnZ2VzdGlvbnMoKTtcclxuXHR0aGlzLmFkZFBhcmFtZXRlclZhbHVlSW5wdXQgPSBuZXcgU3VnZ2VzdGlvbkxvb2t1cFRleHRJbnB1dFdpZGdldCh7XHJcblx0XHRwbGFjZWhvbGRlcjogXCJwYXJhbWV0ZXIgdmFsdWVcIixcclxuXHRcdCRlbGVtZW50OiAkKFwiPGRpdiBzdHlsZT0nZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6NDAlJz5cIiksXHJcblx0XHR2YWxpZGF0ZTogZnVuY3Rpb24odmFsKSB7XHJcblx0XHRcdGxldCB7dmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWV9ID0gdGhpcy5nZXRBZGRQYXJhbWV0ZXJzSW5mbyhudWxsLCB2YWwpO1xyXG5cdFx0XHRyZXR1cm4gKCFuYW1lICYmICF2YWx1ZSkgPyB0cnVlIDogdmFsaWRWYWx1ZTtcclxuXHRcdH0uYmluZCh0aGlzKSxcclxuXHRcdGFsbG93U3VnZ2VzdGlvbnNXaGVuRW1wdHk6IHRydWUsXHJcblx0XHQkb3ZlcmxheTogdGhpcy4kb3ZlcmxheVxyXG5cdH0pO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7XHJcblx0XHRsYWJlbDogXCJBZGRcIixcclxuXHRcdGljb246IFwiYWRkXCIsXHJcblx0XHRmbGFnczogXCJwcm9ncmVzc2l2ZVwiXHJcblx0fSkuc2V0RGlzYWJsZWQodHJ1ZSk7XHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJDb250cm9scyA9IG5ldyBIb3Jpem9udGFsTGF5b3V0V2lkZ2V0KCB7XHJcblx0XHRpdGVtczogW1xyXG5cdFx0XHR0aGlzLmFkZFBhcmFtZXRlck5hbWVJbnB1dCxcclxuXHRcdFx0bmV3IE9PLnVpLkxhYmVsV2lkZ2V0KHtsYWJlbDpcIj1cIn0pLFxyXG5cdFx0XHR0aGlzLmFkZFBhcmFtZXRlclZhbHVlSW5wdXQsXHJcblx0XHRcdHRoaXMuYWRkUGFyYW1ldGVyQnV0dG9uXHJcblx0XHRdXHJcblx0fSApO1xyXG5cclxuXHR0aGlzLmFkZFBhcmFtZXRlckxheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLmFkZFBhcmFtZXRlckNvbnRyb2xzLCB7XHJcblx0XHRsYWJlbDogXCJBZGQgcGFyYW1ldGVyOlwiLFxyXG5cdFx0YWxpZ246IFwidG9wXCJcclxuXHR9KS50b2dnbGUoZmFsc2UpO1xyXG5cdC8vIEEgaGFjayB0byBtYWtlIG1lc3NhZ2VzIGFwcGVhciBvbiB0aGVpciBvd24gbGluZVxyXG5cdHRoaXMuYWRkUGFyYW1ldGVyTGF5b3V0LiRlbGVtZW50LmZpbmQoXCIub28tdWktZmllbGRMYXlvdXQtbWVzc2FnZXNcIikuY3NzKHtcclxuXHRcdFwiY2xlYXJcIjogXCJib3RoXCIsXHJcblx0XHRcInBhZGRpbmctdG9wXCI6IDBcclxuXHR9KTtcclxuXHJcblx0LyogLS0tIE9WRVJBTEwgTEFZT1VUL0RJU1BMQVkgLS0tICovXHJcblxyXG5cdC8vIERpc3BsYXkgdGhlIGxheW91dCBlbGVtZW50cywgYW5kIGEgcnVsZVxyXG5cdHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoXCJyYXRlci1iYW5uZXJXaWRnZXRcIikuYXBwZW5kKFxyXG5cdFx0dGhpcy50aXRsZUxheW91dC4kZWxlbWVudCxcclxuXHRcdHRoaXMucGFyYW1ldGVyTGlzdC4kZWxlbWVudCxcclxuXHRcdHRoaXMuYWRkUGFyYW1ldGVyTGF5b3V0LiRlbGVtZW50XHJcblx0KTtcclxuXHRpZiAoIXRoaXMuaXNTaGVsbFRlbXBsYXRlKSB7XHJcblx0XHR0aGlzLiRlbGVtZW50LmFwcGVuZCggJChcIjxocj5cIikgKTtcclxuXHR9XHJcblxyXG5cdGlmICh0aGlzLmlzU2hlbGxUZW1wbGF0ZSkge1xyXG5cdFx0dGhpcy4kZWxlbWVudC5jc3Moe1xyXG5cdFx0XHRcImJhY2tncm91bmRcIjogXCIjZWVlXCIsXHJcblx0XHRcdFwiYm9yZGVyLXJhZGl1c1wiOiBcIjEwcHhcIixcclxuXHRcdFx0XCJwYWRkaW5nXCI6IFwiMCAxMHB4IDVweFwiLFxyXG5cdFx0XHRcIm1hcmdpbi1ib3R0b21cIjogXCIxMnB4XCIsXHJcblx0XHRcdFwiZm9udC1zaXplXCI6IFwiOTIlXCJcdFx0XHRcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyogLS0tIEVWRU5UIEhBTkRMSU5HIC0tLSAqL1xyXG5cclxuXHRpZiAodGhpcy5oYXNDbGFzc1JhdGluZ3MpIHtcclxuXHRcdHRoaXMuY2xhc3NEcm9wZG93bi5jb25uZWN0KCB0aGlzLCB7XCJjaGFuZ2VcIjogXCJvbkNsYXNzQ2hhbmdlXCIgfSApO1xyXG5cdH1cclxuXHRpZiAodGhpcy5oYXNJbXBvcnRhbmNlUmF0aW5ncykge1xyXG5cdFx0dGhpcy5pbXBvcnRhbmNlRHJvcGRvd24uY29ubmVjdCggdGhpcywge1wiY2hhbmdlXCI6IFwib25JbXBvcnRhbmNlQ2hhbmdlXCIgfSApO1xyXG5cdH1cclxuXHR0aGlzLnBhcmFtZXRlckxpc3QuY29ubmVjdCggdGhpcywge1xyXG5cdFx0XCJjaGFuZ2VcIjogXCJvblBhcmFtZXRlckNoYW5nZVwiLFxyXG5cdFx0XCJhZGRQYXJhbWV0ZXJzQnV0dG9uQ2xpY2tcIjogXCJzaG93QWRkUGFyYW1ldGVySW5wdXRzXCIsXHJcblx0XHRcInVwZGF0ZWRTaXplXCI6IFwib25VcGRhdGVkU2l6ZVwiXHJcblx0fSApO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyQnV0dG9uLmNvbm5lY3QodGhpcywgeyBcImNsaWNrXCI6IFwib25QYXJhbWV0ZXJBZGRcIiB9KTtcclxuXHR0aGlzLmFkZFBhcmFtZXRlck5hbWVJbnB1dC5jb25uZWN0KHRoaXMsIHtcclxuXHRcdFwiY2hhbmdlXCI6IFwib25BZGRQYXJhbWV0ZXJOYW1lQ2hhbmdlXCIsXHJcblx0XHRcImVudGVyXCI6IFwib25BZGRQYXJhbWV0ZXJOYW1lRW50ZXJcIixcclxuXHRcdFwiY2hvb3NlXCI6IFwib25BZGRQYXJhbWV0ZXJOYW1lRW50ZXJcIlxyXG5cdH0pO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyVmFsdWVJbnB1dC5jb25uZWN0KHRoaXMsIHtcclxuXHRcdFwiY2hhbmdlXCI6IFwib25BZGRQYXJhbWV0ZXJWYWx1ZUNoYW5nZVwiLFxyXG5cdFx0XCJlbnRlclwiOiBcIm9uQWRkUGFyYW1ldGVyVmFsdWVFbnRlclwiLFxyXG5cdFx0XCJjaG9vc2VcIjogXCJvbkFkZFBhcmFtZXRlclZhbHVlRW50ZXJcIlxyXG5cdH0pO1xyXG5cdHRoaXMucmVtb3ZlQnV0dG9uLmNvbm5lY3QodGhpcywge1wiY2xpY2tcIjogXCJvblJlbW92ZUJ1dHRvbkNsaWNrXCJ9LCApO1xyXG5cdHRoaXMuY2xlYXJCdXR0b24uY29ubmVjdCggdGhpcywge1wiY2xpY2tcIjogXCJvbkNsZWFyQnV0dG9uQ2xpY2tcIn0gKTtcclxuXHJcblx0LyogLS0tIEFQUExZIFBSRUYgLS0gKi9cclxuXHRpZiAodGhpcy5wcmVmZXJlbmNlcy5ieXBhc3NSZWRpcmVjdHMpIHtcclxuXHRcdHRoaXMuYnlwYXNzUmVkaXJlY3QoKTtcclxuXHR9XHJcblxyXG59XHJcbk9PLmluaGVyaXRDbGFzcyggQmFubmVyV2lkZ2V0LCBPTy51aS5XaWRnZXQgKTtcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gdGVtcGxhdGVOYW1lXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbZGF0YV1cclxuICogQHBhcmFtIHtCb29sZWFufSBkYXRhLndpdGhvdXRSYXRpbmdzXHJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGF0YS5pc1dyYXBwZXJcclxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZ1xyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCYW5uZXJXaWRnZXQ+fVxyXG4gKi9cclxuQmFubmVyV2lkZ2V0Lm5ld0Zyb21UZW1wbGF0ZU5hbWUgPSBmdW5jdGlvbih0ZW1wbGF0ZU5hbWUsIGRhdGEsIGNvbmZpZykge1xyXG5cdHZhciB0ZW1wbGF0ZSA9IG5ldyBUZW1wbGF0ZSgpO1xyXG5cdHRlbXBsYXRlLm5hbWUgPSB0ZW1wbGF0ZU5hbWU7XHJcblx0aWYgKGRhdGEgJiYgZGF0YS53aXRob3V0UmF0aW5ncykge1xyXG5cdFx0dGVtcGxhdGUud2l0aG91dFJhdGluZ3MgPSB0cnVlO1xyXG5cdH1cclxuXHRyZXR1cm4gZ2V0V2l0aFJlZGlyZWN0VG8odGVtcGxhdGUpXHJcblx0XHQudGhlbihmdW5jdGlvbih0ZW1wbGF0ZSkge1xyXG5cdFx0XHRyZXR1cm4gJC53aGVuKFxyXG5cdFx0XHRcdHRlbXBsYXRlLnNldENsYXNzZXNBbmRJbXBvcnRhbmNlcygpLFxyXG5cdFx0XHRcdHRlbXBsYXRlLnNldFBhcmFtRGF0YUFuZFN1Z2dlc3Rpb25zKClcclxuXHRcdFx0KS50aGVuKCgpID0+IHtcclxuXHRcdFx0XHQvLyBBZGQgbWlzc2luZyByZXF1aXJlZC9zdWdnZXN0ZWQgdmFsdWVzXHJcblx0XHRcdFx0dGVtcGxhdGUuYWRkTWlzc2luZ1BhcmFtcygpO1xyXG5cdFx0XHRcdC8vIFJldHVybiB0aGUgbm93LW1vZGlmaWVkIHRlbXBsYXRlXHJcblx0XHRcdFx0cmV0dXJuIHRlbXBsYXRlO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0pXHJcblx0XHQudGhlbih0ZW1wbGF0ZSA9PiBuZXcgQmFubmVyV2lkZ2V0KHRlbXBsYXRlLCBjb25maWcpKTtcclxufTtcclxuXHJcbkJhbm5lcldpZGdldC5wcm90b3R5cGUub25VcGRhdGVkU2l6ZSA9IGZ1bmN0aW9uKCkge1xyXG5cdC8vIEVtaXQgYW4gXCJ1cGRhdGVkU2l6ZVwiIGV2ZW50IHNvIHRoZSBwYXJlbnQgd2luZG93IGNhbiB1cGRhdGUgc2l6ZSwgaWYgbmVlZGVkXHJcblx0dGhpcy5lbWl0KFwidXBkYXRlZFNpemVcIik7XHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLnNldENoYW5nZWQgPSBmdW5jdGlvbigpIHtcclxuXHR0aGlzLmNoYW5nZWQgPSB0cnVlO1xyXG5cdHRoaXMuZW1pdChcImNoYW5nZWRcIik7XHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLm9uUGFyYW1ldGVyQ2hhbmdlID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5zZXRDaGFuZ2VkKCk7XHJcblx0aWYgKHRoaXMubWFpblRleHQgPT09IFwiV2lraVByb2plY3QgQmlvZ3JhcGh5XCIgfHwgdGhpcy5yZWRpcmVjdFRhcmdldE1haW5UZXh0ID09PSBcIldpa2lQcm9qZWN0IEJpb2dyYXBoeVwiKSB7XHJcblx0XHQvLyBFbWl0IGV2ZW50IHNvIEJhbm5lckxpc3RXaWRnZXQgY2FuIHVwZGF0ZSB0aGUgYmFubmVyIHNoZWxsIHRlbXBsYXRlIChpZiBwcmVzZW50KVxyXG5cdFx0dGhpcy5lbWl0KFwiYmlvZ3JhcGh5QmFubmVyQ2hhbmdlXCIpO1x0XHRcclxuXHR9XHJcblx0dGhpcy51cGRhdGVBZGRQYXJhbWV0ZXJOYW1lU3VnZ2VzdGlvbnMoKTtcclxufTtcclxuXHJcbkJhbm5lcldpZGdldC5wcm90b3R5cGUub25DbGFzc0NoYW5nZSA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuc2V0Q2hhbmdlZCgpO1xyXG5cdHRoaXMuY2xhc3NDaGFuZ2VkID0gdHJ1ZTtcclxuXHR2YXIgY2xhc3NJdGVtID0gdGhpcy5jbGFzc0Ryb3Bkb3duLmdldE1lbnUoKS5maW5kU2VsZWN0ZWRJdGVtKCk7XHJcblx0aWYgKGNsYXNzSXRlbSAmJiBjbGFzc0l0ZW0uZ2V0RGF0YSgpID09IG51bGwgKSB7XHJcblx0XHQvLyBjbGVhciBzZWxlY3Rpb25cclxuXHRcdHRoaXMuY2xhc3NEcm9wZG93bi5nZXRNZW51KCkuc2VsZWN0SXRlbSgpO1xyXG5cdH1cclxufTtcclxuXHJcbkJhbm5lcldpZGdldC5wcm90b3R5cGUub25JbXBvcnRhbmNlQ2hhbmdlID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5zZXRDaGFuZ2VkKCk7XHJcblx0dGhpcy5pbXBvcnRhbmNlQ2hhbmdlZCA9IHRydWU7XHJcblx0dmFyIGltcG9ydGFuY2VJdGVtID0gdGhpcy5pbXBvcnRhbmNlRHJvcGRvd24uZ2V0TWVudSgpLmZpbmRTZWxlY3RlZEl0ZW0oKTtcclxuXHRpZiAoaW1wb3J0YW5jZUl0ZW0gJiYgaW1wb3J0YW5jZUl0ZW0uZ2V0RGF0YSgpID09IG51bGwgKSB7XHJcblx0XHQvLyBjbGVhciBzZWxlY3Rpb25cclxuXHRcdHRoaXMuaW1wb3J0YW5jZURyb3Bkb3duLmdldE1lbnUoKS5zZWxlY3RJdGVtKCk7XHJcblx0fVxyXG59O1xyXG5cclxuQmFubmVyV2lkZ2V0LnByb3RvdHlwZS5zaG93QWRkUGFyYW1ldGVySW5wdXRzID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJMYXlvdXQudG9nZ2xlKHRydWUpO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyTmFtZUlucHV0LmZvY3VzKCk7XHJcblx0dGhpcy5vblVwZGF0ZWRTaXplKCk7XHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLmdldEFkZFBhcmFtZXRlcnNJbmZvID0gZnVuY3Rpb24obmFtZUlucHV0VmFsLCB2YWx1ZUlucHV0VmFsKSB7XHJcblx0dmFyIG5hbWUgPSBuYW1lSW5wdXRWYWwgJiYgbmFtZUlucHV0VmFsLnRyaW0oKSB8fCB0aGlzLmFkZFBhcmFtZXRlck5hbWVJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKTtcclxuXHR2YXIgcGFyYW1BbHJlYWR5SW5jbHVkZWQgPSBuYW1lID09PSBcImNsYXNzXCIgfHxcclxuXHRcdG5hbWUgPT09IFwiaW1wb3J0YW5jZVwiIHx8XHJcblx0XHQobmFtZSA9PT0gXCIxXCIgJiYgdGhpcy5pc1NoZWxsVGVtcGxhdGUpIHx8XHJcblx0XHR0aGlzLnBhcmFtZXRlckxpc3QuZ2V0UGFyYW1ldGVySXRlbXMoKS5zb21lKHBhcmFtV2lkZ2V0ID0+IHBhcmFtV2lkZ2V0Lm5hbWUgPT09IG5hbWUpO1xyXG5cdHZhciB2YWx1ZSA9IHZhbHVlSW5wdXRWYWwgJiYgdmFsdWVJbnB1dFZhbC50cmltKCkgfHwgdGhpcy5hZGRQYXJhbWV0ZXJWYWx1ZUlucHV0LmdldFZhbHVlKCkudHJpbSgpO1xyXG5cdHZhciBhdXRvdmFsdWUgPSBuYW1lICYmIHRoaXMucGFyYW1EYXRhW25hbWVdICYmIHRoaXMucGFyYW1EYXRhW25hbWVdLmF1dG92YWx1ZSB8fCBudWxsO1xyXG5cdHJldHVybiB7XHJcblx0XHR2YWxpZE5hbWU6ICEhKG5hbWUgJiYgIXBhcmFtQWxyZWFkeUluY2x1ZGVkKSxcclxuXHRcdHZhbGlkVmFsdWU6ICEhKHZhbHVlIHx8IGF1dG92YWx1ZSksXHJcblx0XHRpc0F1dG92YWx1ZTogISEoIXZhbHVlICYmIGF1dG92YWx1ZSksXHJcblx0XHRpc0FscmVhZHlJbmNsdWRlZDogISEobmFtZSAmJiBwYXJhbUFscmVhZHlJbmNsdWRlZCksXHJcblx0XHRuYW1lLFxyXG5cdFx0dmFsdWUsXHJcblx0XHRhdXRvdmFsdWVcclxuXHR9O1xyXG59O1xyXG5cclxuQmFubmVyV2lkZ2V0LnByb3RvdHlwZS5vbkFkZFBhcmFtZXRlck5hbWVDaGFuZ2UgPSBmdW5jdGlvbigpIHtcclxuXHRsZXQgeyB2YWxpZE5hbWUsIHZhbGlkVmFsdWUsIGlzQXV0b3ZhbHVlLCBpc0FscmVhZHlJbmNsdWRlZCwgbmFtZSwgYXV0b3ZhbHVlIH0gPSB0aGlzLmdldEFkZFBhcmFtZXRlcnNJbmZvKCk7XHJcblx0Ly8gU2V0IHZhbHVlIGlucHV0IHBsYWNlaG9sZGVyIGFzIHRoZSBhdXRvdmFsdWVcclxuXHR0aGlzLmFkZFBhcmFtZXRlclZhbHVlSW5wdXQuJGlucHV0LmF0dHIoIFwicGxhY2Vob2xkZXJcIiwgIGF1dG92YWx1ZSB8fCBcIlwiICk7XHJcblx0Ly8gU2V0IHN1Z2dlc3Rpb25zLCBpZiB0aGUgcGFyYW1ldGVyIGhhcyBhIGxpc3Qgb2YgYWxsb3dlZCB2YWx1ZXNcclxuXHR2YXIgYWxsb3dlZFZhbHVlcyA9IHRoaXMucGFyYW1EYXRhW25hbWVdICYmXHJcblx0XHR0aGlzLnBhcmFtRGF0YVtuYW1lXS5hbGxvd2VkVmFsdWVzICYmIFxyXG5cdFx0dGhpcy5wYXJhbURhdGFbbmFtZV0uYWxsb3dlZFZhbHVlcy5tYXAodmFsID0+IHtyZXR1cm4ge2RhdGE6IHZhbCwgbGFiZWw6dmFsfTsgfSk7XHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJWYWx1ZUlucHV0LnNldFN1Z2dlc3Rpb25zKGFsbG93ZWRWYWx1ZXMgfHwgW10pO1xyXG5cdC8vIFNldCBidXR0b24gZGlzYWJsZWQgc3RhdGUgYmFzZWQgb24gdmFsaWRpdHlcclxuXHR0aGlzLmFkZFBhcmFtZXRlckJ1dHRvbi5zZXREaXNhYmxlZCghdmFsaWROYW1lIHx8ICF2YWxpZFZhbHVlKTtcclxuXHQvLyBTaG93IG5vdGljZSBpZiBhdXRvdmFsdWUgd2lsbCBiZSB1c2VkXHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJMYXlvdXQuc2V0Tm90aWNlcyggdmFsaWROYW1lICYmIGlzQXV0b3ZhbHVlID8gW1wiUGFyYW1ldGVyIHZhbHVlIHdpbGwgYmUgYXV0b2ZpbGxlZFwiXSA6IFtdICk7XHJcblx0Ly8gU2hvdyBlcnJvciBpcyB0aGUgYmFubmVyIGFscmVhZHkgaGFzIHRoZSBwYXJhbWV0ZXIgc2V0XHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJMYXlvdXQuc2V0RXJyb3JzKCBpc0FscmVhZHlJbmNsdWRlZCA/IFtcIlBhcmFtZXRlciBpcyBhbHJlYWR5IHByZXNlbnRcIl0gOiBbXSApO1xyXG59O1xyXG5cclxuQmFubmVyV2lkZ2V0LnByb3RvdHlwZS5vbkFkZFBhcmFtZXRlck5hbWVFbnRlciA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyVmFsdWVJbnB1dC5mb2N1cygpO1xyXG59O1xyXG5cclxuQmFubmVyV2lkZ2V0LnByb3RvdHlwZS5vbkFkZFBhcmFtZXRlclZhbHVlQ2hhbmdlID0gZnVuY3Rpb24oKSB7XHJcblx0bGV0IHsgdmFsaWROYW1lLCB2YWxpZFZhbHVlLCBpc0F1dG92YWx1ZSB9ID0gdGhpcy5nZXRBZGRQYXJhbWV0ZXJzSW5mbygpO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyQnV0dG9uLnNldERpc2FibGVkKCF2YWxpZE5hbWUgfHwgIXZhbGlkVmFsdWUpO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyTGF5b3V0LnNldE5vdGljZXMoIHZhbGlkTmFtZSAmJiBpc0F1dG92YWx1ZSA/IFtcIlBhcmFtZXRlciB2YWx1ZSB3aWxsIGJlIGF1dG9maWxsZWRcIl0gOiBbXSApOyBcclxufTtcclxuXHJcbkJhbm5lcldpZGdldC5wcm90b3R5cGUub25BZGRQYXJhbWV0ZXJWYWx1ZUVudGVyID0gZnVuY3Rpb24oKSB7XHJcblx0Ly8gTWFrZSBzdXJlIGJ1dHRvbiBzdGF0ZSBoYXMgYmVlbiB1cGRhdGVkXHJcblx0dGhpcy5vbkFkZFBhcmFtZXRlclZhbHVlQ2hhbmdlKCk7XHJcblx0Ly8gRG8gbm90aGluZyBpZiBidXR0b24gaXMgZGlzYWJsZWQgKGkuZS4gbmFtZSBhbmQvb3IgdmFsdWUgYXJlIGludmFsaWQpXHJcblx0aWYgKCB0aGlzLmFkZFBhcmFtZXRlckJ1dHRvbi5pc0Rpc2FibGVkKCkgKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdC8vIEFkZCBwYXJhbWV0ZXJcclxuXHR0aGlzLm9uUGFyYW1ldGVyQWRkKCk7XHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLm9uUGFyYW1ldGVyQWRkID0gZnVuY3Rpb24oKSB7XHJcblx0bGV0IHsgdmFsaWROYW1lLCB2YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSwgYXV0b3ZhbHVlIH0gID0gdGhpcy5nZXRBZGRQYXJhbWV0ZXJzSW5mbygpO1xyXG5cdGlmICghdmFsaWROYW1lIHx8ICF2YWxpZFZhbHVlKSB7XHJcblx0XHQvLyBFcnJvciBzaG91bGQgYWxyZWFkeSBiZSBzaG93biB2aWEgb25BZGRQYXJhbWV0ZXIuLi5DaGFuZ2UgbWV0aG9kc1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHR2YXIgbmV3UGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcldpZGdldChcclxuXHRcdHtcclxuXHRcdFx0XCJuYW1lXCI6IG5hbWUsXHJcblx0XHRcdFwidmFsdWVcIjogdmFsdWUgfHwgYXV0b3ZhbHVlXHJcblx0XHR9LFxyXG5cdFx0dGhpcy5wYXJhbURhdGFbbmFtZV0sXHJcblx0XHR7JG92ZXJsYXk6IHRoaXMuJG92ZXJsYXl9XHJcblx0KTtcclxuXHR0aGlzLnBhcmFtZXRlckxpc3QuYWRkSXRlbXMoW25ld1BhcmFtZXRlcl0pO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyTmFtZUlucHV0LnNldFZhbHVlKFwiXCIpO1xyXG5cdHRoaXMuYWRkUGFyYW1ldGVyVmFsdWVJbnB1dC5zZXRWYWx1ZShcIlwiKTtcclxuXHR0aGlzLmFkZFBhcmFtZXRlck5hbWVJbnB1dC4kaW5wdXQuZm9jdXMoKTtcclxufTtcclxuXHJcbkJhbm5lcldpZGdldC5wcm90b3R5cGUudXBkYXRlQWRkUGFyYW1ldGVyTmFtZVN1Z2dlc3Rpb25zID0gZnVuY3Rpb24oKSB7XHJcblx0bGV0IHBhcmFtc0luVXNlID0ge307XHJcblx0dGhpcy5wYXJhbWV0ZXJMaXN0LmdldFBhcmFtZXRlckl0ZW1zKCkuZm9yRWFjaChcclxuXHRcdHBhcmFtV2lkZ2V0ID0+IHBhcmFtc0luVXNlW3BhcmFtV2lkZ2V0Lm5hbWVdID0gdHJ1ZVxyXG5cdCk7XHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJOYW1lSW5wdXQuc2V0U3VnZ2VzdGlvbnMoXHJcblx0XHR0aGlzLnBhcmFtZXRlclN1Z2dlc3Rpb25zLmZpbHRlcihcclxuXHRcdFx0c3VnZ2VzdGlvbiA9PiAhcGFyYW1zSW5Vc2Vbc3VnZ2VzdGlvbi5kYXRhXVxyXG5cdFx0KVxyXG5cdCk7XHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLm9uUmVtb3ZlQnV0dG9uQ2xpY2sgPSBmdW5jdGlvbigpIHtcclxuXHR0aGlzLmVtaXQoXCJyZW1vdmVcIik7XHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLm9uQ2xlYXJCdXR0b25DbGljayA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMucGFyYW1ldGVyTGlzdC5jbGVhckl0ZW1zKFxyXG5cdFx0dGhpcy5wYXJhbWV0ZXJMaXN0LmdldFBhcmFtZXRlckl0ZW1zKClcclxuXHQpO1xyXG5cdGlmICggdGhpcy5oYXNDbGFzc1JhdGluZ3MgKSB7XHJcblx0XHR0aGlzLmNsYXNzRHJvcGRvd24uZ2V0TWVudSgpLnNlbGVjdEl0ZW0oKTtcclxuXHR9XHJcblx0aWYgKCB0aGlzLmhhc0ltcG9ydGFuY2VSYXRpbmdzICkge1xyXG5cdFx0dGhpcy5pbXBvcnRhbmNlRHJvcGRvd24uZ2V0TWVudSgpLnNlbGVjdEl0ZW0oKTtcclxuXHR9XHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLmJ5cGFzc1JlZGlyZWN0ID0gZnVuY3Rpb24oKSB7XHJcblx0aWYgKCF0aGlzLnJlZGlyZWN0VGFyZ2V0TWFpblRleHQpIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblx0Ly8gU3RvcmUgdGhlIGJ5cGFzc2VkIG5hbWVcclxuXHR0aGlzLmJ5cGFzc2VkTmFtZSA9IHRoaXMubmFtZTtcclxuXHQvLyBVcGRhdGUgdGl0bGUgbGFiZWxcclxuXHR0aGlzLm1haW5MYWJlbFBvcHVwQnV0dG9uLnNldExhYmVsKGB7eyR7dGhpcy5yZWRpcmVjdFRhcmdldE1haW5UZXh0fX19JHt0aGlzLmluYWN0aXZlUHJvamVjdCA/IFwiIChpbmFjdGl2ZSlcIiA6IFwiXCJ9YCk7XHJcblx0Ly8gVXBkYXRlIHByb3BlcnRpZXNcclxuXHR0aGlzLm5hbWUgPSB0aGlzLnJlZGlyZWN0VGFyZ2V0TWFpblRleHQ7XHJcblx0dGhpcy5tYWluVGV4dCA9IHRoaXMucmVkaXJlY3RUYXJnZXRNYWluVGV4dDtcclxuXHR0aGlzLnJlZGlyZWN0VGFyZ2V0TWFpblRleHQgPSBudWxsO1xyXG5cdHRoaXMuc2V0Q2hhbmdlZCgpO1xyXG59O1xyXG5cclxuQmFubmVyV2lkZ2V0LnByb3RvdHlwZS5tYWtlV2lraXRleHQgPSBmdW5jdGlvbigpIHtcclxuXHRpZiAoIXRoaXMuY2hhbmdlZCAmJiB0aGlzLndpa2l0ZXh0KSB7XHJcblx0XHRyZXR1cm4gdGhpcy53aWtpdGV4dDtcclxuXHR9XHJcblx0dmFyIHBpcGUgPSB0aGlzLnBpcGVTdHlsZTtcclxuXHR2YXIgZXF1YWxzID0gdGhpcy5lcXVhbHNTdHlsZTtcclxuXHR2YXIgY2xhc3NJdGVtID0gKHRoaXMuaGFzQ2xhc3NSYXRpbmdzIHx8IHRoaXMuaXNTaGVsbFRlbXBsYXRlKSAmJiB0aGlzLmNsYXNzRHJvcGRvd24uZ2V0TWVudSgpLmZpbmRTZWxlY3RlZEl0ZW0oKTtcclxuXHR2YXIgY2xhc3NWYWwgPSBjbGFzc0l0ZW0gJiYgY2xhc3NJdGVtLmdldERhdGEoKTtcclxuXHR2YXIgaW1wb3J0YW5jZUl0ZW0gPSB0aGlzLmhhc0ltcG9ydGFuY2VSYXRpbmdzICYmIHRoaXMuaW1wb3J0YW5jZURyb3Bkb3duLmdldE1lbnUoKS5maW5kU2VsZWN0ZWRJdGVtKCk7XHJcblx0dmFyIGltcG9ydGFuY2VWYWwgPSBpbXBvcnRhbmNlSXRlbSAmJiBpbXBvcnRhbmNlSXRlbS5nZXREYXRhKCk7XHJcblxyXG5cdHJldHVybiAoXCJ7e1wiICtcclxuXHRcdHRoaXMubmFtZSArXHJcblx0XHQoICh0aGlzLmhhc0NsYXNzUmF0aW5ncyB8fCB0aGlzLmlzU2hlbGxUZW1wbGF0ZSkgJiYgY2xhc3NWYWwhPW51bGwgPyBgJHtwaXBlfWNsYXNzJHtlcXVhbHN9JHtjbGFzc1ZhbHx8XCJcIn1gIDogXCJcIiApICtcclxuXHRcdCggdGhpcy5oYXNJbXBvcnRhbmNlUmF0aW5ncyAmJiBpbXBvcnRhbmNlVmFsIT1udWxsID8gYCR7cGlwZX1pbXBvcnRhbmNlJHtlcXVhbHN9JHtpbXBvcnRhbmNlVmFsfHxcIlwifWAgOiBcIlwiICkgK1xyXG5cdFx0dGhpcy5wYXJhbWV0ZXJMaXN0LmdldFBhcmFtZXRlckl0ZW1zKClcclxuXHRcdFx0Lm1hcChwYXJhbWV0ZXIgPT4gcGFyYW1ldGVyLm1ha2VXaWtpdGV4dChwaXBlLCBlcXVhbHMpKVxyXG5cdFx0XHQuam9pbihcIlwiKSArXHJcblx0XHR0aGlzLmVuZEJyYWNlc1N0eWxlKVxyXG5cdFx0LnJlcGxhY2UoL1xcbit9fSQvLCBcIlxcbn19XCIpOyAvLyBhdm9pZCBlbXB0eSBsaW5lIGF0IGVuZCBsaWtlIFtbU3BlY2lhbDpEaWZmLzkyNTk4MjE0Ml1dXHJcbn07XHJcblxyXG5CYW5uZXJXaWRnZXQucHJvdG90eXBlLnNldFByZWZlcmVuY2VzID0gZnVuY3Rpb24ocHJlZnMpIHtcclxuXHR0aGlzLnByZWZlcmVuY2VzID0gcHJlZnM7XHJcblx0aWYgKHRoaXMucHJlZmVyZW5jZXMuYnlwYXNzUmVkaXJlY3RzKSB7XHJcblx0XHR0aGlzLmJ5cGFzc1JlZGlyZWN0KCk7XHJcblx0fVxyXG5cdHRoaXMucGFyYW1ldGVyTGlzdC5zZXRQcmVmZXJlbmNlcyhwcmVmcyk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCYW5uZXJXaWRnZXQ7XHJcbi8vIDwvbm93aWtpPiIsIi8vIDxub3dpa2k+XHJcblxyXG5mdW5jdGlvbiBEcm9wZG93blBhcmFtZXRlcldpZGdldCggY29uZmlnICkge1xyXG5cdC8vIENvbmZpZ3VyYXRpb24gaW5pdGlhbGl6YXRpb25cclxuXHRjb25maWcgPSAkLmV4dGVuZCh7XHJcblx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSdkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoyNCUnPlwiKVxyXG5cdH0sIGNvbmZpZyB8fCB7fSApO1xyXG5cclxuXHQvLyBDYWxsIHBhcmVudCBjb25zdHJ1Y3RvclxyXG5cdERyb3Bkb3duUGFyYW1ldGVyV2lkZ2V0LnN1cGVyLmNhbGwoIHRoaXMsIGNvbmZpZyApO1xyXG5cclxuXHR0aGlzLiRvdmVybGF5ID0gY29uZmlnLiRvdmVybGF5O1xyXG5cdHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoXCJyYXRlci1kcm9wZG93blBhcmFtZXRlcldpZGdldFwiKTtcclxuICAgIFxyXG5cdC8vIEF1dG9maWxsZWQgaWNvblxyXG5cdHRoaXMuYXV0b2ZpbGxlZCA9ICEhY29uZmlnLmF1dG9maWxsZWQ7XHJcblx0dGhpcy5hdXRvZmlsbGVkSWNvbiA9IG5ldyBPTy51aS5JY29uV2lkZ2V0KCB7XHJcblx0XHRpY29uOiBcInJvYm90XCIsXHJcblx0XHR0aXRsZTogXCJBdXRvZmlsbGVkIGJ5IFJhdGVyXCIsXHJcblx0XHRmbGFnczogXCJwcm9ncmVzc2l2ZVwiLFxyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8c3BhbiBzdHlsZT0nbWFyZ2luOiAwIC01cHggMCA1cHg7bWluLXdpZHRoOiAxNnB4O3dpZHRoOiAxNnB4O2xlZnQ6dW5zZXQ7Jz5cIilcclxuXHR9ICkudG9nZ2xlKHRoaXMuYXV0b2ZpbGxlZCk7XHJcblx0dGhpcy4kZWxlbWVudC5maW5kKFwiLm9vLXVpLWluZGljYXRvckVsZW1lbnQtaW5kaWNhdG9yXCIpLmJlZm9yZShcclxuXHRcdHRoaXMuYXV0b2ZpbGxlZEljb24uJGVsZW1lbnRcclxuXHQpO1xyXG5cclxuXHQvLyBFdmVudHNcclxuXHR0aGlzLm1lbnUuY29ubmVjdCh0aGlzLCB7XHJcblx0XHRcImNob29zZVwiOiBcIm9uRHJvcGRvd25NZW51Q2hvb3NlXCIsXHJcblx0XHRcInNlbGVjdFwiOiBcIm9uRHJvcGRvd25NZW51U2VsZWN0XCJcclxuXHR9KTtcclxufVxyXG5PTy5pbmhlcml0Q2xhc3MoIERyb3Bkb3duUGFyYW1ldGVyV2lkZ2V0LCBPTy51aS5Ecm9wZG93bldpZGdldCApO1xyXG5cclxuRHJvcGRvd25QYXJhbWV0ZXJXaWRnZXQucHJvdG90eXBlLnNldEF1dG9maWxsZWQgPSBmdW5jdGlvbihzZXRBdXRvZmlsbCkge1xyXG5cdHRoaXMuYXV0b2ZpbGxlZEljb24udG9nZ2xlKCEhc2V0QXV0b2ZpbGwpO1xyXG5cdHRoaXMuJGVsZW1lbnQuZmluZChcIi5vby11aS1kcm9wZG93bldpZGdldC1oYW5kbGVcIikuY3NzKHtcclxuXHRcdFwiYm9yZGVyXCI6IHNldEF1dG9maWxsID8gXCIxcHggZGFzaGVkICMzNmNcIiA6IFwiXCJcclxuXHR9KTtcclxuXHR0aGlzLmF1dG9maWxsZWQgPSAhIXNldEF1dG9maWxsO1xyXG59O1xyXG5cclxuRHJvcGRvd25QYXJhbWV0ZXJXaWRnZXQucHJvdG90eXBlLm9uRHJvcGRvd25NZW51Q2hvb3NlID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5zZXRBdXRvZmlsbGVkKGZhbHNlKTtcclxuXHR0aGlzLmVtaXQoXCJjaGFuZ2VcIik7XHJcbn07XHJcblxyXG5Ecm9wZG93blBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUub25Ecm9wZG93bk1lbnVTZWxlY3QgPSBmdW5jdGlvbigpIHtcclxuXHR0aGlzLmVtaXQoXCJjaGFuZ2VcIik7XHJcbn07XHJcblxyXG5Ecm9wZG93blBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbigpIHtcclxuXHRjb25zdCBzZWxlY3RlZEl0ZW0gPSB0aGlzLm1lbnUuZmluZFNlbGVjdGVkSXRlbSgpO1xyXG5cdHJldHVybiBzZWxlY3RlZEl0ZW0gJiYgc2VsZWN0ZWRJdGVtLmdldERhdGEoKTtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IERyb3Bkb3duUGFyYW1ldGVyV2lkZ2V0O1xyXG4vLyA8L25vd2lraT4iLCIvLyA8bm93aWtpPlxyXG5cclxuLyoqXHJcbiAqIEEgSG9yaXpvbnRhbExheW91dCB0aGF0IGlzIGFsc28gYSB3aWRnZXQsIGFuZCBjYW4gdGh1cyBiZSBwbGFjZWQgd2l0aGluXHJcbiAqIGZpZWxkIGxheW91dHMuXHJcbiAqIFxyXG4gKiBAY2xhc3NcclxuICogQHBhcmFtIHsqfSBjb25maWcgY29uZmlndXJhdGlvbiBmb3IgT08udWkuSG9yaXpvbnRhbExheW91dFxyXG4gKi9cclxuZnVuY3Rpb24gSG9yaXpvbnRhbExheW91dFdpZGdldCggY29uZmlnICkge1xyXG5cdC8vIENvbmZpZ3VyYXRpb24gaW5pdGlhbGl6YXRpb25cclxuXHRjb25maWcgPSBjb25maWcgfHwge307XHJcblx0Ly8gQ2FsbCBwYXJlbnQgY29uc3RydWN0b3JcclxuXHRIb3Jpem9udGFsTGF5b3V0V2lkZ2V0LnN1cGVyLmNhbGwoIHRoaXMsIHt9ICk7XHJcbiAgICBcclxuXHR0aGlzLmxheW91dCA9IG5ldyBPTy51aS5Ib3Jpem9udGFsTGF5b3V0KCB7XHJcblx0XHQuLi5jb25maWcsXHJcblx0XHQkZWxlbWVudDogdGhpcy4kZWxlbWVudFxyXG5cdH0pO1xyXG5cclxufVxyXG5PTy5pbmhlcml0Q2xhc3MoIEhvcml6b250YWxMYXlvdXRXaWRnZXQsIE9PLnVpLldpZGdldCApO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgSG9yaXpvbnRhbExheW91dFdpZGdldDtcclxuLy8gPC9ub3dpa2k+IiwiLy8gPG5vd2lraT5cclxuXHJcbi8qKlxyXG4gKiBAY2ZnIHtPTy51aS5FbGVtZW50W119IGl0ZW1zIEl0ZW1zIHRvIGJlIGFkZGVkXHJcbiAqIEBjZmcge051bWJlcn0gZGlzcGxheUxpbWl0IFRoZSBtb3N0IHRvIHNob3cgYXQgb25jZS4gSWYgdGhlIG51bWJlciBvZiBpdGVtc1xyXG4gKiAgaXMgbW9yZSB0aGFuIHRoaXMsIHRoZW4gb25seSB0aGUgZmlyc3QgKGRpc3BsYXlMaW1pdCAtIDEpIGl0ZW1zIGFyZSBzaG93bi5cclxuICovXHJcbnZhciBQYXJhbWV0ZXJMaXN0V2lkZ2V0ID0gZnVuY3Rpb24gUGFyYW1ldGVyTGlzdFdpZGdldCggY29uZmlnICkge1xyXG5cdGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcclxuXHJcblx0Ly8gQ2FsbCBwYXJlbnQgY29uc3RydWN0b3JcclxuXHRQYXJhbWV0ZXJMaXN0V2lkZ2V0LnBhcmVudC5jYWxsKCB0aGlzLCBjb25maWcgKTtcclxuXHRPTy51aS5taXhpbi5Hcm91cEVsZW1lbnQuY2FsbCggdGhpcywge1xyXG5cdFx0JGdyb3VwOiB0aGlzLiRlbGVtZW50XHJcblx0fSApO1xyXG5cdHRoaXMuYWRkSXRlbXMoIGNvbmZpZy5pdGVtcyApO1xyXG5cclxuXHR0aGlzLiRlbGVtZW50LmFkZENsYXNzKFwicmF0ZXItcGFyYW1ldGVyTGlzdFdpZGdldFwiKTtcclxuICAgIFxyXG5cdHRoaXMucHJlZmVyZW5jZXMgPSBjb25maWcucHJlZmVyZW5jZXM7XHJcbiAgIFxyXG5cdC8vIEhpZGUgc29tZSBwYXJhbWV0ZXJzIChpbml0aWFsbHkpLCBpZiBtb3JlIHRoYW4gc2V0IGRpc3BsYXkgbGltaXQgLS0gd2hpY2ggaXMgdGhlIFxyXG5cdC8vIG9uZSBtb3JlIHRoYW4gY29sbGFwc2VQYXJhbXNMb3dlckxpbWl0LCB0byBwcmV2ZW50IG9ubHkgb25lIHBhcmFtIGJlaW5nIGhpZGRlblxyXG5cdC8vIChtb3N0bHk6IG1heSBvY2Nhc2lvbmFsbHkgb2NjdXIgaWYgcGFyYW1zIHdlcmUgYXV0by1maWxsZWQpLlxyXG5cdGxldCBkaXNwbGF5TGltaXQgPSB0aGlzLnByZWZlcmVuY2VzLmNvbGxhcHNlUGFyYW1zTG93ZXJMaW1pdCArIDE7XHJcblx0aWYgKGRpc3BsYXlMaW1pdCAmJiB0aGlzLml0ZW1zLmxlbmd0aCA+IGRpc3BsYXlMaW1pdCApIHtcclxuXHRcdHZhciBoaWRlRnJvbU51bWJlciA9IGRpc3BsYXlMaW1pdCAtIDE7IC8vIE9uZS1pbmRleGVkXHJcblx0XHR2YXIgaGlkZUZyb21JbmRleCA9IGhpZGVGcm9tTnVtYmVyIC0gMTsgLy8gWmVyby1pbmRleGVkXHJcblx0XHR2YXIgaGlkZGVuQ291bnQgPSAwO1xyXG5cdFx0Zm9yIChsZXQgaSA9IGhpZGVGcm9tSW5kZXg7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGlmICghdGhpcy5pdGVtc1tpXS5hdXRvZmlsbGVkKSB7IC8vIERvbid0IGhpZGUgYXV0by1maWxsZWQgcGFyYW1zXHJcblx0XHRcdFx0dGhpcy5pdGVtc1tpXS50b2dnbGUoZmFsc2UpO1xyXG5cdFx0XHRcdGhpZGRlbkNvdW50Kys7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdGlmIChoaWRkZW5Db3VudD4wKSB7XHJcblx0XHRcdC8vIEFkZCBidXR0b24gdG8gc2hvdyB0aGUgaGlkZGVuIHBhcmFtc1xyXG5cdFx0XHR0aGlzLnNob3dNb3JlUGFyYW1ldGVyc0J1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoe1xyXG5cdFx0XHRcdGxhYmVsOiBcIlNob3cgXCIgKyBoaWRkZW5Db3VudCArIFwiIG1vcmUgXCIgKyAoaGlkZGVuQ291bnQ9PT0xID8gXCJwYXJhbWV0ZXJcIiA6IFwicGFyYW1ldGVyc1wiKSxcclxuXHRcdFx0XHRmcmFtZWQ6IGZhbHNlLFxyXG5cdFx0XHRcdCRlbGVtZW50OiAkKFwiPHNwYW4gc3R5bGU9J21hcmdpbi1ib3R0b206MCc+XCIpXHJcblx0XHRcdH0pO1xyXG5cdFx0XHR0aGlzLmFkZEl0ZW1zKFt0aGlzLnNob3dNb3JlUGFyYW1ldGVyc0J1dHRvbl0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gQWRkIHRoZSBidXR0b24gdGhhdCBhbGxvd3MgdXNlciB0byBhZGQgbW9yZSBwYXJhbWV0ZXJzXHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJzQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7XHJcblx0XHRsYWJlbDogXCJBZGQgcGFyYW1ldGVyXCIsXHJcblx0XHRpY29uOiBcImFkZFwiLFxyXG5cdFx0ZnJhbWVkOiBmYWxzZSxcclxuXHRcdCRlbGVtZW50OiAkKFwiPHNwYW4gc3R5bGU9J21hcmdpbi1ib3R0b206MCc+XCIpXHJcblx0fSk7XHJcblx0dGhpcy5hZGRJdGVtcyhbdGhpcy5hZGRQYXJhbWV0ZXJzQnV0dG9uXSk7XHJcblxyXG5cdC8qIC0tLSBFdmVudHMgLS0tICovXHJcblxyXG5cdC8vIEhhbmRsZSBkZWxldGUgZXZlbnRzIGZyb20gUGFyYW1ldGVyV2lkZ2V0c1xyXG5cdHRoaXMuYWdncmVnYXRlKCB7IGRlbGV0ZTogXCJwYXJhbWV0ZXJEZWxldGVcIlx0fSApO1xyXG5cdHRoaXMuY29ubmVjdCggdGhpcywgeyBwYXJhbWV0ZXJEZWxldGU6IFwib25QYXJhbWV0ZXJEZWxldGVcIiB9ICk7XHJcbiAgICBcclxuXHQvLyBIYW5kbGUgY2hhbmdlIGV2ZW50cyBmcm9tIFBhcmFtZXRlcldpZGdldHNcclxuXHR0aGlzLmFnZ3JlZ2F0ZSggeyBjaGFuZ2U6IFwicGFyYW1ldGVyQ2hhbmdlXCJcdH0gKTtcclxuXHR0aGlzLmNvbm5lY3QoIHRoaXMsIHsgcGFyYW1ldGVyQ2hhbmdlOiBcIm9uUGFyYW1ldGVyQ2hhbmdlXCIgfSApO1xyXG5cclxuXHQvLyBIYW5kbGUgdXBkYXRlZFNpemUgZXZlbnRzIGZyb20gUGFyYW1ldGVyV2lkZ2V0c1xyXG5cdHRoaXMuYWdncmVnYXRlKCB7XCJ1cGRhdGVkU2l6ZVwiOiBcInBhcmFtZXRlclVwZGF0ZWRTaXplXCJ9ICk7XHJcblx0dGhpcy5jb25uZWN0KCB0aGlzLCB7XCJwYXJhbWV0ZXJVcGRhdGVkU2l6ZVwiOiBcIm9uVXBkYXRlZFNpemVcIn0gKTtcclxuICAgIFxyXG5cdC8vIEhhbmRsZSBidXR0b24gY2xpY2tzXHJcblx0aWYgKHRoaXMuc2hvd01vcmVQYXJhbWV0ZXJzQnV0dG9uICkge1xyXG5cdFx0dGhpcy5zaG93TW9yZVBhcmFtZXRlcnNCdXR0b24uY29ubmVjdCggdGhpcywgeyBcImNsaWNrXCI6IFwib25TaG93TW9yZVBhcmFtZXRlcnNCdXR0b25DbGlja1wiIH0gKTtcclxuXHR9XHJcblx0dGhpcy5hZGRQYXJhbWV0ZXJzQnV0dG9uLmNvbm5lY3QoIHRoaXMsIHsgXCJjbGlja1wiOiBcIm9uQWRkUGFyYW1ldGVyc0J1dHRvbkNsaWNrXCIgfSApO1xyXG59O1xyXG5cclxuT08uaW5oZXJpdENsYXNzKCBQYXJhbWV0ZXJMaXN0V2lkZ2V0LCBPTy51aS5XaWRnZXQgKTtcclxuT08ubWl4aW5DbGFzcyggUGFyYW1ldGVyTGlzdFdpZGdldCwgT08udWkubWl4aW4uR3JvdXBFbGVtZW50ICk7XHJcbi8qXHJcbm1ldGhvZHMgZnJvbSBtaXhpbjpcclxuIC0gYWRkSXRlbXMoIGl0ZW1zLCBbaW5kZXhdICkgOiBPTy51aS5FbGVtZW50ICAoQ0hBSU5BQkxFKVxyXG4gLSBjbGVhckl0ZW1zKCApIDogT08udWkuRWxlbWVudCAgKENIQUlOQUJMRSlcclxuIC0gZmluZEl0ZW1Gcm9tRGF0YSggZGF0YSApIDogT08udWkuRWxlbWVudHxudWxsXHJcbiAtIGZpbmRJdGVtc0Zyb21EYXRhKCBkYXRhICkgOiBPTy51aS5FbGVtZW50W11cclxuIC0gcmVtb3ZlSXRlbXMoIGl0ZW1zICkgOiBPTy51aS5FbGVtZW50ICAoQ0hBSU5BQkxFKVxyXG4qL1xyXG5cclxuUGFyYW1ldGVyTGlzdFdpZGdldC5wcm90b3R5cGUub25VcGRhdGVkU2l6ZSA9IGZ1bmN0aW9uKCkge1xyXG5cdC8vIEVtaXQgYW4gXCJ1cGRhdGVkU2l6ZVwiIGV2ZW50IHNvIHRoZSBwYXJlbnQgd2luZG93IGNhbiB1cGRhdGUgc2l6ZSwgaWYgbmVlZGVkXHJcblx0dGhpcy5lbWl0KFwidXBkYXRlZFNpemVcIik7XHJcbn07XHJcblxyXG5QYXJhbWV0ZXJMaXN0V2lkZ2V0LnByb3RvdHlwZS5hZGRJdGVtcyA9IGZ1bmN0aW9uICggaXRlbXMsIGluZGV4ICkge1xyXG5cdGlmICggaXRlbXMubGVuZ3RoID09PSAwICkge1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG5cclxuXHQvLyBDYWxsIG1peGluIG1ldGhvZCB0byBkbyB0aGUgYWRkaW5nXHJcblx0T08udWkubWl4aW4uR3JvdXBFbGVtZW50LnByb3RvdHlwZS5hZGRJdGVtcy5jYWxsKCB0aGlzLCBpdGVtcywgaW5kZXggKTtcclxuXHJcblx0Ly8gZW1pdCB1cGRhdGVkU2l6ZSBldmVudCBcclxuXHR0aGlzLm9uVXBkYXRlZFNpemUoKTtcclxuXHJcblx0cmV0dXJuIHRoaXM7XHJcbn07XHRcclxuXHJcblBhcmFtZXRlckxpc3RXaWRnZXQucHJvdG90eXBlLm9uUGFyYW1ldGVyRGVsZXRlID0gZnVuY3Rpb24ocGFyYW1ldGVyKSB7XHJcblx0dGhpcy5yZW1vdmVJdGVtcyhbcGFyYW1ldGVyXSk7XHJcblx0dGhpcy5lbWl0KFwiY2hhbmdlXCIpO1xyXG59O1xyXG5cclxuUGFyYW1ldGVyTGlzdFdpZGdldC5wcm90b3R5cGUub25QYXJhbWV0ZXJDaGFuZ2UgPSBmdW5jdGlvbigpIHtcclxuXHR0aGlzLmVtaXQoXCJjaGFuZ2VcIik7XHJcbn07XHJcblxyXG5QYXJhbWV0ZXJMaXN0V2lkZ2V0LnByb3RvdHlwZS5nZXRQYXJhbWV0ZXJJdGVtcyA9IGZ1bmN0aW9uKCkge1xyXG5cdHJldHVybiB0aGlzLml0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0uY29uc3RydWN0b3IubmFtZSA9PT0gXCJQYXJhbWV0ZXJXaWRnZXRcIik7XHJcbn07XHJcblxyXG5QYXJhbWV0ZXJMaXN0V2lkZ2V0LnByb3RvdHlwZS5vblNob3dNb3JlUGFyYW1ldGVyc0J1dHRvbkNsaWNrID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5yZW1vdmVJdGVtcyhbdGhpcy5zaG93TW9yZVBhcmFtZXRlcnNCdXR0b25dKTtcclxuXHR0aGlzLml0ZW1zLmZvckVhY2gocGFyYW1ldGVyV2lkZ2V0ID0+IHBhcmFtZXRlcldpZGdldC50b2dnbGUodHJ1ZSkpO1xyXG5cdHRoaXMub25VcGRhdGVkU2l6ZSgpO1xyXG59O1xyXG5cclxuUGFyYW1ldGVyTGlzdFdpZGdldC5wcm90b3R5cGUub25BZGRQYXJhbWV0ZXJzQnV0dG9uQ2xpY2sgPSBmdW5jdGlvbigpIHtcclxuXHR0aGlzLnJlbW92ZUl0ZW1zKFt0aGlzLmFkZFBhcmFtZXRlcnNCdXR0b25dKTtcclxuXHR0aGlzLmVtaXQoXCJhZGRQYXJhbWV0ZXJzQnV0dG9uQ2xpY2tcIik7XHJcbn07XHJcblxyXG5QYXJhbWV0ZXJMaXN0V2lkZ2V0LnByb3RvdHlwZS5tYWtlV2lraXRleHQgPSBmdW5jdGlvbihwaXBlU3R5bGUsIGVxdWFsc1N0eWxlKSB7XHJcblx0cmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVySXRlbXMoKVxyXG5cdFx0Lm1hcChwYXJhbWV0ZXIgPT4gcGFyYW1ldGVyLm1ha2VXaWtpdGV4dChwaXBlU3R5bGUsIGVxdWFsc1N0eWxlKSlcclxuXHRcdC5qb2luKFwiXCIpO1xyXG59O1xyXG5cclxuUGFyYW1ldGVyTGlzdFdpZGdldC5wcm90b3R5cGUuc2V0UHJlZmVyZW5jZXMgPSBmdW5jdGlvbihwcmVmcykge1xyXG5cdHRoaXMucHJlZmVyZW5jZXMgPSBwcmVmcztcclxuXHR2YXIgcGFyYW1zID0gdGhpcy5nZXRQYXJhbWV0ZXJJdGVtcygpO1xyXG5cdC8vIFVuaGlkZSBzb21lIHBhcmFtZXRlcnMgb2YgdGhlIGNvbGxhcHNlUGFyYW1zTG93ZXJMaW1pdCBoYXMgaW5jcmVhc2VkLlxyXG5cdC8vIChOb3QgaGlkaW5nIGFueSBpZiBpdCBkZWNyZWFzZWQsIHNpbmNlIGl0J3MgYSAqbG93ZXIqIGxpbWl0IG9mIHdoYXQgbmVlZHMgdG8gYmUgc2hvd24uKVxyXG5cdGlmICggcGFyYW1zLmxlbmd0aCA8PSB0aGlzLnByZWZlcmVuY2VzLmNvbGxhcHNlUGFyYW1zTG93ZXJMaW1pdCApIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblx0dmFyIGhpZGRlblBhcmFtcyA9IHBhcmFtcy5maWx0ZXIocGFyYW0gPT4gIXBhcmFtLmlzVmlzaWJsZSgpKTtcclxuXHR2YXIgdmlzaWJsZVBhcmFtc0NvdW50ID0gcGFyYW1zLmxlbmd0aCAtIGhpZGRlblBhcmFtcy5sZW5ndGg7XHJcblx0aWYgKFxyXG5cdFx0aGlkZGVuUGFyYW1zID09PSAwIHx8XHJcbiAgICAgICAgdmlzaWJsZVBhcmFtc0NvdW50ID49IHRoaXMucHJlZmVyZW5jZXMuY29sbGFwc2VQYXJhbXNMb3dlckxpbWl0XHJcblx0KSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdHZhciBudW1Ub1VuaGlkZSA9IE1hdGgubWluKFxyXG5cdFx0dGhpcy5wcmVmZXJlbmNlcy5jb2xsYXBzZVBhcmFtc0xvd2VyTGltaXQgLSB2aXNpYmxlUGFyYW1zQ291bnQsXHJcblx0XHRoaWRkZW5QYXJhbXMubGVuZ3RoXHJcblx0KTtcclxuXHRmb3IgKGxldCBpID0gMDsgaSA8IG51bVRvVW5oaWRlOyBpKyspIHtcclxuXHRcdGhpZGRlblBhcmFtc1tpXS50b2dnbGUodHJ1ZSk7XHJcblx0fVxyXG5cdHZhciBzdGlsbEhpZGRlbkNvdW50ID0gaGlkZGVuUGFyYW1zLmxlbmd0aCAtIG51bVRvVW5oaWRlO1xyXG5cdGlmIChzdGlsbEhpZGRlbkNvdW50ID09PSAwKSB7XHJcblx0XHR0aGlzLnJlbW92ZUl0ZW1zKFt0aGlzLnNob3dNb3JlUGFyYW1ldGVyc0J1dHRvbl0pO1xyXG5cdH0gZWxzZSB7XHJcblx0XHR0aGlzLnNob3dNb3JlUGFyYW1ldGVyc0J1dHRvbi5zZXRMYWJlbChcclxuXHRcdFx0XCJTaG93IFwiICsgc3RpbGxIaWRkZW5Db3VudCArIFwiIG1vcmUgXCIgKyAoc3RpbGxIaWRkZW5Db3VudD09PTEgPyBcInBhcmFtdGVyXCIgOiBcInBhcmFtdGVyc1wiKVxyXG5cdFx0KTtcclxuXHR9XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQYXJhbWV0ZXJMaXN0V2lkZ2V0O1xyXG4vLyA8L25vd2lraT4iLCJpbXBvcnQgeyBub3JtYWxpc2VZZXNObywgZmlsdGVyQW5kTWFwIH0gZnJvbSBcIi4uLy4uL3V0aWxcIjtcclxuaW1wb3J0IEhvcml6b250YWxMYXlvdXRXaWRnZXQgZnJvbSBcIi4vSG9yaXpvbnRhbExheW91dFdpZGdldFwiO1xyXG4vLyA8bm93aWtpPlxyXG5cclxuZnVuY3Rpb24gUGFyYW1ldGVyV2lkZ2V0KCBwYXJhbWV0ZXIsIHBhcmFtRGF0YSwgY29uZmlnICkge1xyXG5cdC8vIENvbmZpZ3VyYXRpb24gaW5pdGlhbGl6YXRpb25cclxuXHRjb25maWcgPSBjb25maWcgfHwge307XHJcblx0Ly8gQ2FsbCBwYXJlbnQgY29uc3RydWN0b3JcclxuXHRQYXJhbWV0ZXJXaWRnZXQuc3VwZXIuY2FsbCggdGhpcywgY29uZmlnICk7XHJcblx0dGhpcy4kb3ZlcmxheSA9IGNvbmZpZy4kb3ZlcmxheTtcclxuICAgIFxyXG5cdHRoaXMubmFtZSA9IHBhcmFtZXRlci5uYW1lO1xyXG5cdHRoaXMudmFsdWUgPSBwYXJhbWV0ZXIudmFsdWU7XHJcblx0dGhpcy5hdXRvZmlsbGVkID0gcGFyYW1ldGVyLmF1dG9maWxsZWQ7XHJcblx0dGhpcy5pc0ludmFsaWQgPSBwYXJhbWV0ZXIudmFsdWUgPT0gbnVsbDtcclxuXHR0aGlzLnBhcmFtRGF0YSA9IHBhcmFtRGF0YSB8fCB7fTtcclxuXHR0aGlzLmFsbG93ZWRWYWx1ZXMgPSB0aGlzLnBhcmFtRGF0YS5hbGxvd2VkVmFsdWVzIHx8IFtdO1xyXG5cdHRoaXMuaXNSZXF1aXJlZCA9IHRoaXMucGFyYW1EYXRhLnJlcXVpcmVkO1xyXG5cdHRoaXMuaXNTdWdnZXN0ZWQgPSB0aGlzLnBhcmFtRGF0YS5zdWdnZXN0ZWQ7XHJcblxyXG5cdC8vIE1ha2UgYSBjaGVja2JveCBpZiBvbmx5IDEgb3IgMiBhbGxvd2VkIHZhbHVlc1xyXG5cdHN3aXRjaCh0aGlzLmFsbG93ZWRWYWx1ZXMubGVuZ3RoKSB7XHQvKiBlc2xpbnQtZGlzYWJsZSBuby1mYWxsdGhyb3VnaCAqL1xyXG5cdGNhc2UgMTpcclxuXHRcdHRoaXMuYWxsb3dlZFZhbHVlc1sxXSA9IG51bGw7XHJcblx0XHQvKiBmYWxsLXRocm91Z2ggKi9cclxuXHRjYXNlIDI6XHJcblx0XHR2YXIgaXNGaXJzdEFsbG93ZWRWYWwgPSAoXHJcblx0XHRcdHRoaXMuYWxsb3dlZFZhbHVlcy5pbmRleE9mKCBwYXJhbWV0ZXIudmFsdWUgKSA9PT0gMCB8fFxyXG5cdFx0XHRcdHRoaXMuYWxsb3dlZFZhbHVlcy5tYXAobm9ybWFsaXNlWWVzTm8pLmluZGV4T2YoIG5vcm1hbGlzZVllc05vKHBhcmFtZXRlci52YWx1ZSkgKSA9PT0gMFxyXG5cdFx0KTtcclxuXHRcdHZhciBpc1NlY29uZEFsbG93ZWRWYWwgPSAoXHJcblx0XHRcdHRoaXMuYWxsb3dlZFZhbHVlcy5pbmRleE9mKCBwYXJhbWV0ZXIudmFsdWUgfHwgbnVsbCApID09PSAxIHx8XHJcblx0XHRcdFx0dGhpcy5hbGxvd2VkVmFsdWVzLm1hcChub3JtYWxpc2VZZXNObykuaW5kZXhPZiggcGFyYW1ldGVyLnZhbHVlID8gbm9ybWFsaXNlWWVzTm8ocGFyYW1ldGVyLnZhbHVlKSA6IG51bGwpID09PSAxXHJcblx0XHQpO1xyXG5cdFx0dmFyIGlzSW5kZXRlcm1pbmF0ZSA9ICFpc0ZpcnN0QWxsb3dlZFZhbCAmJiAhaXNTZWNvbmRBbGxvd2VkVmFsO1xyXG5cdFx0dGhpcy5jaGVja2JveCA9IG5ldyBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0KCB7XHJcblx0XHRcdHNlbGVjdGVkOiBpc0luZGV0ZXJtaW5hdGUgPyB1bmRlZmluZWQgOiBpc0ZpcnN0QWxsb3dlZFZhbCxcclxuXHRcdFx0aW5kZXRlcm1pbmF0ZTogaXNJbmRldGVybWluYXRlID8gdHJ1ZSA6IHVuZGVmaW5lZCxcclxuXHRcdFx0JGVsZW1lbnQ6ICQoXCI8bGFiZWwgc3R5bGU9J21hcmdpbjowIDAgMCA1cHgnPlwiKVxyXG5cdFx0fSApO1xyXG5cdFx0YnJlYWs7XHJcblx0ZGVmYXVsdDpcclxuXHRcdFx0Ly8gTm8gY2hlY2tib3hcclxuXHR9IC8qIGVzbGludC1lbmFibGUgbm8tZmFsbHRocm91Z2ggKi9cclxuXHJcblx0LyogLS0tIEVESVQgUEFSQU1FVEVSIExBWU9VVCAtLS0gKi9cclxuXHJcblx0dGhpcy5pbnB1dCA9IG5ldyBPTy51aS5Db21ib0JveElucHV0V2lkZ2V0KCB7XHJcblx0XHR2YWx1ZTogdGhpcy52YWx1ZSxcclxuXHRcdC8vIGxhYmVsOiBwYXJhbWV0ZXIubmFtZSArIFwiID1cIixcclxuXHRcdC8vIGxhYmVsUG9zaXRpb246IFwiYmVmb3JlXCIsXHJcblx0XHRvcHRpb25zOiBmaWx0ZXJBbmRNYXAoXHJcblx0XHRcdHRoaXMuYWxsb3dlZFZhbHVlcyxcclxuXHRcdFx0dmFsID0+IHZhbCE9PW51bGwsXHJcblx0XHRcdHZhbCA9PiAoe2RhdGE6IHZhbCwgbGFiZWw6dmFsfSlcclxuXHRcdCksXHJcblx0XHQkZWxlbWVudDogJChcIjxkaXYgc3R5bGU9J21hcmdpbi1ib3R0b206MDsnPlwiKSxcclxuXHRcdCRvdmVybGF5OiB0aGlzLiRvdmVybGF5XHJcblx0fSApO1xyXG5cdC8vIFJlZHVjZSB0aGUgZXhjZXNzaXZlIHdoaXRlc3BhY2UvaGVpZ2h0XHJcblx0dGhpcy5pbnB1dC4kZWxlbWVudC5maW5kKFwiaW5wdXRcIikuY3NzKHtcclxuXHRcdFwicGFkZGluZy10b3BcIjogMCxcclxuXHRcdFwicGFkZGluZy1ib3R0b21cIjogXCIycHhcIixcclxuXHRcdFwiaGVpZ2h0XCI6IFwiMjRweFwiXHJcblx0fSk7XHJcblx0Ly8gRml4IGxhYmVsIHBvc2l0aW9uaW5nIHdpdGhpbiB0aGUgcmVkdWNlZCBoZWlnaHRcclxuXHR0aGlzLmlucHV0LiRlbGVtZW50LmZpbmQoXCJzcGFuLm9vLXVpLWxhYmVsRWxlbWVudC1sYWJlbFwiKS5jc3Moe1wibGluZS1oZWlnaHRcIjogXCJub3JtYWxcIn0pO1xyXG5cdC8vIEFsc28gcmVkdWNlIGhlaWdodCBvZiBkcm9wZG93biBidXR0b24gKGlmIG9wdGlvbnMgYXJlIHByZXNlbnQpXHJcblx0dGhpcy5pbnB1dC4kZWxlbWVudC5maW5kKFwiYS5vby11aS1idXR0b25FbGVtZW50LWJ1dHRvblwiKS5jc3Moe1xyXG5cdFx0XCJwYWRkaW5nLXRvcFwiOiAwLFxyXG5cdFx0XCJoZWlnaHRcIjogXCIyNHB4XCIsXHJcblx0XHRcIm1pbi1oZWlnaHRcIjogXCIwXCJcclxuXHR9KTtcclxuXHJcblx0dGhpcy5jb25maXJtQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7XHJcblx0XHRpY29uOiBcImNoZWNrXCIsXHJcblx0XHRsYWJlbDogXCJEb25lXCIsXHJcblx0XHRmcmFtZWQ6IGZhbHNlLFxyXG5cdFx0ZmxhZ3M6IFwicHJvZ3Jlc3NpdmVcIixcclxuXHRcdCRlbGVtZW50OiAkKFwiPHNwYW4gc3R5bGU9J21hcmdpbi1yaWdodDowJz5cIilcclxuXHR9KTtcclxuXHJcblx0dGhpcy5jYW5jZWxCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHtcclxuXHRcdGljb246IFwidW5kb1wiLFxyXG5cdFx0bGFiZWw6IFwiQ2FuY2VsXCIsXHJcblx0XHRmcmFtZWQ6IGZhbHNlLFxyXG5cdH0pO1xyXG5cclxuXHR0aGlzLmRlbGV0ZUJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoe1xyXG5cdFx0aWNvbjogdGhpcy5pc1JlcXVpcmVkID8gXCJyZXN0b3JlXCIgOiBcInRyYXNoXCIsXHJcblx0XHRsYWJlbDogdGhpcy5pc1JlcXVpcmVkID8gXCJSZXF1aXJlZCBwYXJhbWV0ZXJcIiA6IFwiRGVsZXRlXCIsXHJcblx0XHRmcmFtZWQ6IGZhbHNlLFxyXG5cdFx0ZmxhZ3M6IFwiZGVzdHJ1Y3RpdmVcIixcclxuXHRcdGRpc2FibGVkOiB0aGlzLmlzUmVxdWlyZWRcclxuXHR9KTtcclxuXHJcblx0dGhpcy5lZGl0QnV0dG9uQ29udHJvbHMgPSBuZXcgT08udWkuQnV0dG9uR3JvdXBXaWRnZXQoe1xyXG5cdFx0aXRlbXM6IFtcclxuXHRcdFx0dGhpcy5jb25maXJtQnV0dG9uLFxyXG5cdFx0XHR0aGlzLmNhbmNlbEJ1dHRvbixcclxuXHRcdFx0dGhpcy5kZWxldGVCdXR0b25cclxuXHRcdF0sXHJcblx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSdmb250LXNpemU6OTIlJz5cIilcclxuXHR9KTtcclxuXHR0aGlzLmVkaXRCdXR0b25Db250cm9scy4kZWxlbWVudC5maW5kKFwiYSBzcGFuOmZpcnN0LWNoaWxkXCIpLmNzcyh7XHJcblx0XHRcIm1pbi13aWR0aFwiOiBcInVuc2V0XCIsXHJcblx0XHRcIndpZHRoXCI6IFwiMTZweFwiLFxyXG5cdFx0XCJtYXJnaW4tcmlnaHRcIjogMFxyXG5cdH0pO1xyXG5cclxuXHR0aGlzLmVkaXRMYXlvdXRDb250cm9scyA9IG5ldyBIb3Jpem9udGFsTGF5b3V0V2lkZ2V0KHtcclxuXHRcdGl0ZW1zOiBbXHJcblx0XHRcdHRoaXMuaW5wdXQsXHJcblx0XHRcdHRoaXMuZWRpdEJ1dHRvbkNvbnRyb2xzXHJcblx0XHRdLFxyXG5cdFx0Ly8kZWxlbWVudDogJChcIjxkaXYgc3R5bGU9J3dpZHRoOiA0OCU7bWFyZ2luOjA7Jz5cIilcclxuXHR9KTtcclxuXHJcblx0dGhpcy5lZGl0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KCB0aGlzLmVkaXRMYXlvdXRDb250cm9scywge1xyXG5cdFx0bGFiZWw6IHRoaXMubmFtZSArIFwiID1cIixcclxuXHRcdGFsaWduOiBcInRvcFwiLFxyXG5cdFx0aGVscDogdGhpcy5wYXJhbURhdGEuZGVzY3JpcHRpb24gJiYgdGhpcy5wYXJhbURhdGEuZGVzY3JpcHRpb24uZW4gfHwgZmFsc2UsXHJcblx0XHRoZWxwSW5saW5lOiB0cnVlXHJcblx0fSkudG9nZ2xlKCk7XHJcblx0dGhpcy5lZGl0TGF5b3V0LiRlbGVtZW50LmZpbmQoXCJsYWJlbC5vby11aS1pbmxpbmUtaGVscFwiKS5jc3Moe1wibWFyZ2luXCI6IFwiLTEwcHggMCA1cHggMTBweFwifSk7XHJcblxyXG5cdC8qIC0tLSBSRUFEIChDT0xMQVBTRUQpIERJU1BMQVkgT0YgUEFSQU1FVEVSIC0tLSAqL1xyXG5cclxuXHR0aGlzLmludmFsaWRJY29uID0gbmV3IE9PLnVpLkljb25XaWRnZXQoIHtcclxuXHRcdGljb246IFwiYmxvY2tcIixcclxuXHRcdHRpdGxlOiBcIkludmFsaWQgcGFyYW1ldGVyOiBubyB2YWx1ZSBzcGVjaWZpZWQhXCIsXHJcblx0XHRmbGFnczogXCJkZXN0cnVjdGl2ZVwiLFxyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8c3BhbiBzdHlsZT0nbWFyZ2luOiAwIDVweCAwIC01cHg7IG1pbi13aWR0aDogMTZweDsgd2lkdGg6IDE2cHg7Jz5cIilcclxuXHR9ICkudG9nZ2xlKHRoaXMuaXNJbnZhbGlkKTtcclxuXHR0aGlzLmZ1bGxMYWJlbCA9IG5ldyBPTy51aS5MYWJlbFdpZGdldCh7XHJcblx0XHRsYWJlbDp0aGlzLm5hbWUgK1xyXG5cdFx0XHQodGhpcy52YWx1ZVxyXG5cdFx0XHRcdD8gXCIgPSBcIiArIHRoaXMudmFsdWVcclxuXHRcdFx0XHQ6IFwiIFwiXHJcblx0XHRcdCksXHRcclxuXHRcdCRlbGVtZW50OiAkKFwiPGxhYmVsIHN0eWxlPSdtYXJnaW46IDA7Jz5cIilcclxuXHR9KTtcclxuXHR0aGlzLmF1dG9maWxsZWRJY29uID0gbmV3IE9PLnVpLkljb25XaWRnZXQoIHtcclxuXHRcdGljb246IFwicm9ib3RcIixcclxuXHRcdHRpdGxlOiBcIkF1dG9maWxsZWQgYnkgUmF0ZXJcIixcclxuXHRcdGZsYWdzOiBcInByb2dyZXNzaXZlXCIsXHJcblx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSdtYXJnaW46IDAgLTVweCAwIDVweDttaW4td2lkdGg6IDE2cHg7d2lkdGg6IDE2cHg7Jz5cIilcclxuXHR9ICkudG9nZ2xlKHRoaXMuYXV0b2ZpbGxlZCk7XHJcblx0dGhpcy5lZGl0QnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7XHJcblx0XHRpY29uOiBcImVkaXRcIixcclxuXHRcdGZyYW1lZDogZmFsc2UsXHJcblx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSdtYXJnaW4tYm90dG9tOiAwOyc+XCIpXHJcblx0fSk7XHJcblx0dGhpcy5lZGl0QnV0dG9uLiRlbGVtZW50LmZpbmQoXCJhXCIpLmNzcyh7XHJcblx0XHRcImJvcmRlci1yYWRpdXNcIjogXCIwIDEwcHggMTBweCAwXCIsXHJcblx0XHRcIm1hcmdpbi1sZWZ0XCI6IFwiNXB4XCJcclxuXHR9KTtcclxuXHR0aGlzLmVkaXRCdXR0b24uJGVsZW1lbnQuZmluZChcImEgc3BhblwiKS5maXJzdCgpLmNzcyh7XHJcblx0XHRcIm1pbi13aWR0aFwiOiBcInVuc2V0XCIsXHJcblx0XHRcIndpZHRoXCI6IFwiMTZweFwiXHJcblx0fSk7XHJcblxyXG5cdHRoaXMucmVhZExheW91dCA9IG5ldyBPTy51aS5Ib3Jpem9udGFsTGF5b3V0KHtcclxuXHRcdGl0ZW1zOiBbXHJcblx0XHRcdHRoaXMuaW52YWxpZEljb24sXHJcblx0XHRcdHRoaXMuZnVsbExhYmVsLFxyXG5cdFx0XHR0aGlzLmF1dG9maWxsZWRJY29uLFxyXG5cdFx0XHR0aGlzLmVkaXRCdXR0b25cclxuXHRcdF0sXHJcblx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSdtYXJnaW46MDt3aWR0aDp1bnNldDsnPlwiKVxyXG5cdH0pO1xyXG5cdGlmICh0aGlzLmNoZWNrYm94KSB7XHJcblx0XHR0aGlzLnJlYWRMYXlvdXQuYWRkSXRlbXMoW3RoaXMuY2hlY2tib3hdLCAyKTtcclxuXHR9XHJcblxyXG5cdC8qIC0tLSBDT05UQUlORVIgRk9SIEJPVEggTEFZT1VUUyAtLS0gKi9cclxuXHR0aGlzLiRlbGVtZW50ID0gJChcIjxkaXY+XCIpLmFkZENsYXNzKFwicmF0ZXItcGFyYW1ldGVyV2lkZ2V0XCIpXHJcblx0XHQuY3NzKHtcclxuXHRcdFx0XCJ3aWR0aFwiOiBcInVuc2V0XCIsXHJcblx0XHRcdFwiZGlzcGxheVwiOiBcImlubGluZS1ibG9ja1wiLFxyXG5cdFx0XHRcImJvcmRlclwiOiB0aGlzLmF1dG9maWxsZWQgPyBcIjFweCBkYXNoZWQgIzM2Y1wiIDogXCIxcHggc29saWQgI2RkZFwiLFxyXG5cdFx0XHRcImJvcmRlci1yYWRpdXNcIjogXCIxMHB4XCIsXHJcblx0XHRcdFwicGFkZGluZy1sZWZ0XCI6IFwiMTBweFwiLFxyXG5cdFx0XHRcIm1hcmdpblwiOiBcIjAgOHB4IDhweCAwXCIsXHJcblx0XHRcdFwiYmFja2dyb3VuZFwiOiB0aGlzLmlzSW52YWxpZCA/IFwiI2ZkZGRcIiA6IFwiI2ZmZmVcIlxyXG5cdFx0fSlcclxuXHRcdC5hcHBlbmQodGhpcy5yZWFkTGF5b3V0LiRlbGVtZW50LCB0aGlzLmVkaXRMYXlvdXQuJGVsZW1lbnQpO1xyXG4gICAgXHJcblx0dGhpcy5lZGl0QnV0dG9uLmNvbm5lY3QoIHRoaXMsIHsgXCJjbGlja1wiOiBcIm9uRWRpdENsaWNrXCIgfSApO1xyXG5cdHRoaXMuY29uZmlybUJ1dHRvbi5jb25uZWN0KCB0aGlzLCB7IFwiY2xpY2tcIjogXCJvbkNvbmZpcm1DbGlja1wiIH0gKTtcclxuXHR0aGlzLmNhbmNlbEJ1dHRvbi5jb25uZWN0KCB0aGlzLCB7IFwiY2xpY2tcIjogXCJvbkNhbmNlbENsaWNrXCIgfSApO1xyXG5cdHRoaXMuZGVsZXRlQnV0dG9uLmNvbm5lY3QoIHRoaXMsIHsgXCJjbGlja1wiOiBcIm9uRGVsZXRlQ2xpY2tcIiB9ICk7XHJcblx0aWYgKHRoaXMuY2hlY2tib3gpIHtcclxuXHRcdHRoaXMuY2hlY2tib3guY29ubmVjdCh0aGlzLCB7XCJjaGFuZ2VcIjogXCJvbkNoZWNrYm94Q2hhbmdlXCJ9ICk7XHJcblx0fVxyXG59XHJcbk9PLmluaGVyaXRDbGFzcyggUGFyYW1ldGVyV2lkZ2V0LCBPTy51aS5XaWRnZXQgKTtcclxuXHJcblBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUub25VcGRhdGVkU2l6ZSA9IGZ1bmN0aW9uKCkge1xyXG5cdC8vIEVtaXQgYW4gXCJ1cGRhdGVkU2l6ZVwiIGV2ZW50IHNvIHRoZSBwYXJlbnQgd2luZG93IGNhbiB1cGRhdGUgc2l6ZSwgaWYgbmVlZGVkXHJcblx0dGhpcy5lbWl0KFwidXBkYXRlZFNpemVcIik7XHJcbn07XHJcblxyXG5QYXJhbWV0ZXJXaWRnZXQucHJvdG90eXBlLm9uRWRpdENsaWNrID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5yZWFkTGF5b3V0LnRvZ2dsZShmYWxzZSk7XHJcblx0dGhpcy5lZGl0TGF5b3V0LnRvZ2dsZSh0cnVlKTtcclxuXHR0aGlzLiRlbGVtZW50LmNzcyh7XCJiYWNrZ3JvdW5kXCI6IFwiI2ZmZmVcIn0pO1xyXG5cdHRoaXMuaW5wdXQuZm9jdXMoKTtcclxuXHR0aGlzLm9uVXBkYXRlZFNpemUoKTtcclxufTtcclxuXHJcblBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUub25Db25maXJtQ2xpY2sgPSBmdW5jdGlvbigpIHtcclxuXHR0aGlzLnNldFZhbHVlKFxyXG5cdFx0dGhpcy5pbnB1dC5nZXRWYWx1ZSgpXHJcblx0KTtcclxuXHR0aGlzLnJlYWRMYXlvdXQudG9nZ2xlKHRydWUpO1xyXG5cdHRoaXMuZWRpdExheW91dC50b2dnbGUoZmFsc2UpO1xyXG5cdHRoaXMub25VcGRhdGVkU2l6ZSgpO1xyXG59O1xyXG5cclxuUGFyYW1ldGVyV2lkZ2V0LnByb3RvdHlwZS5vbkNhbmNlbENsaWNrID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5pbnB1dC5zZXRWYWx1ZSh0aGlzLnZhbHVlKTtcclxuXHR0aGlzLnJlYWRMYXlvdXQudG9nZ2xlKHRydWUpO1xyXG5cdHRoaXMuZWRpdExheW91dC50b2dnbGUoZmFsc2UpO1xyXG5cdHRoaXMub25VcGRhdGVkU2l6ZSgpO1xyXG59O1xyXG5cclxuUGFyYW1ldGVyV2lkZ2V0LnByb3RvdHlwZS5vbkRlbGV0ZUNsaWNrID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5kZWxldGUoKTtcclxufTtcclxuXHJcblBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUub25DaGVja2JveENoYW5nZSA9IGZ1bmN0aW9uKGlzU2VsZWN0ZWQsIGlzSW5kZXRlcm1pbmF0ZSkge1xyXG5cdGlmIChpc0luZGV0ZXJtaW5hdGUpIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblx0aWYgKGlzU2VsZWN0ZWQpIHtcclxuXHRcdHRoaXMuc2V0VmFsdWUodGhpcy5hbGxvd2VkVmFsdWVzWzBdKTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0dGhpcy5zZXRWYWx1ZSh0aGlzLmFsbG93ZWRWYWx1ZXNbMV0pO1xyXG5cdH1cclxufTtcclxuXHJcblBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5lbWl0KFwiZGVsZXRlXCIpO1xyXG59O1xyXG5cclxuUGFyYW1ldGVyV2lkZ2V0LnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uKHZhbCkge1xyXG5cdC8vIFR1cm4gb2ZmIGF1dG9maWxsIHN0eWxpbmdzL2ljb25cclxuXHR0aGlzLmF1dG9maWxsZWQgPSBmYWxzZTtcclxuXHR0aGlzLmF1dG9maWxsZWRJY29uLnRvZ2dsZShmYWxzZSk7XHJcblx0dGhpcy4kZWxlbWVudC5jc3Moe1wiYm9yZGVyXCI6IFwiMXB4IHNvbGlkICNkZGRcIn0pO1xyXG5cclxuXHQvLyBVcGRhdGUgdGhlIHN0b3JlZCB2YWx1ZVxyXG5cdHRoaXMudmFsdWUgPSB2YWw7XHJcblxyXG5cdC8vIFVwZGF0ZSB0aGUgaW5wdXQgdmFsdWUgZm9yIGVkaXQgbW9kZVxyXG5cdHRoaXMuaW5wdXQuc2V0VmFsdWUodGhpcy52YWx1ZSk7XHJcblxyXG5cdC8vIFVwZGF0ZSB2YWxpZGl0eVxyXG5cdHRoaXMuaXNJbnZhbGlkID0gdGhpcy52YWx1ZSA9PSBudWxsO1xyXG5cdHRoaXMuaW52YWxpZEljb24udG9nZ2xlKHRoaXMuaXNJbnZhbGlkKTtcclxuXHR0aGlzLiRlbGVtZW50LmNzcyh7XCJiYWNrZ3JvdW5kXCI6IHRoaXMuaXNJbnZhbGlkID8gXCIjZmRkZFwiIDogXCIjZmZmZVwifSk7XHJcblxyXG5cdC8vIFVwZGF0ZWQgdGhlIGxhYmVsIGZvciByZWFkIG1vZGVcclxuXHR0aGlzLmZ1bGxMYWJlbC5zZXRMYWJlbChcclxuXHRcdHRoaXMubmFtZSArXHJcblx0XHQodGhpcy52YWx1ZVxyXG5cdFx0XHQ/IFwiID0gXCIgKyB0aGlzLnZhbHVlXHJcblx0XHRcdDogXCJcIlxyXG5cdFx0KVxyXG5cdCk7XHJcblxyXG5cdC8vIFVwZGF0ZSB0aGUgY2hlY2tib3ggKGlmIHRoZXJlIGlzIG9uZSlcclxuXHRpZiAodGhpcy5jaGVja2JveCkge1xyXG5cdFx0dmFyIGlzRmlyc3RBbGxvd2VkVmFsID0gKFxyXG5cdFx0XHR0aGlzLmFsbG93ZWRWYWx1ZXMuaW5kZXhPZiggdmFsICkgPT09IDAgfHxcclxuXHRcdFx0dGhpcy5hbGxvd2VkVmFsdWVzLm1hcChub3JtYWxpc2VZZXNObykuaW5kZXhPZiggbm9ybWFsaXNlWWVzTm8odmFsKSApID09PSAwXHJcblx0XHQpO1xyXG5cdFx0dmFyIGlzU2Vjb25kQWxsb3dlZFZhbCA9IChcclxuXHRcdFx0dGhpcy5hbGxvd2VkVmFsdWVzLmluZGV4T2YoIHZhbCB8fCBudWxsICkgPT09IDEgfHxcclxuXHRcdFx0dGhpcy5hbGxvd2VkVmFsdWVzLm1hcChub3JtYWxpc2VZZXNObykuaW5kZXhPZiggdmFsID8gbm9ybWFsaXNlWWVzTm8odmFsKSA6IG51bGwpID09PSAxXHJcblx0XHQpO1xyXG5cdFx0dmFyIGlzSW5kZXRlcm1pbmF0ZSA9ICFpc0ZpcnN0QWxsb3dlZFZhbCAmJiAhaXNTZWNvbmRBbGxvd2VkVmFsO1xyXG5cdFx0dGhpcy5jaGVja2JveC5zZXRJbmRldGVybWluYXRlKGlzSW5kZXRlcm1pbmF0ZSwgdHJ1ZSk7XHJcblx0XHRpZiAoIWlzSW5kZXRlcm1pbmF0ZSkge1xyXG5cdFx0XHR2YXIgaXNTZWxlY3RlZCA9IGlzRmlyc3RBbGxvd2VkVmFsO1xyXG5cdFx0XHR0aGlzLmNoZWNrYm94LnNldFNlbGVjdGVkKGlzU2VsZWN0ZWQsIHRydWUpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gRW1pdCBhIGNoYW5nZSBldmVudFxyXG5cdHRoaXMuZW1pdChcImNoYW5nZVwiKTtcclxufTtcclxuXHJcblBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUuc2V0QXV0b2ZpbGxlZCA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuYXV0b2ZpbGxlZCA9IHRydWU7XHJcblx0dGhpcy5hdXRvZmlsbGVkSWNvbi50b2dnbGUodHJ1ZSk7XHJcblx0dGhpcy4kZWxlbWVudC5jc3Moe1wiYm9yZGVyXCI6IFwiMXB4IGRhc2hlZCAjMzZjXCJ9KTtcclxufTtcclxuXHJcblBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUubWFrZVdpa2l0ZXh0ID0gZnVuY3Rpb24ocGlwZVN0eWxlLCBlcXVhbHNTdHlsZSkge1xyXG5cdGlmICh0aGlzLmlzSW52YWxpZCkge1xyXG5cdFx0cmV0dXJuIFwiXCI7XHJcblx0fVxyXG5cdHJldHVybiBwaXBlU3R5bGUgKyB0aGlzLm5hbWUgKyBlcXVhbHNTdHlsZSArICh0aGlzLnZhbHVlfHxcIlwiKTtcclxufTtcclxuXHJcblBhcmFtZXRlcldpZGdldC5wcm90b3R5cGUuZm9jdXNJbnB1dCA9IGZ1bmN0aW9uKCkge1xyXG5cdHJldHVybiB0aGlzLmlucHV0LmZvY3VzKCk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQYXJhbWV0ZXJXaWRnZXQ7XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCBjb25maWcgZnJvbSBcIi4uLy4uL2NvbmZpZ1wiO1xyXG4vLyA8bm93aWtpPlxyXG5cclxuZnVuY3Rpb24gUHJlZnNGb3JtV2lkZ2V0KCBjb25maWcgKSB7XHJcblx0Ly8gQ29uZmlndXJhdGlvbiBpbml0aWFsaXphdGlvblxyXG5cdGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcclxuXHQvLyBDYWxsIHBhcmVudCBjb25zdHJ1Y3RvclxyXG5cdFByZWZzRm9ybVdpZGdldC5zdXBlci5jYWxsKCB0aGlzLCBjb25maWcgKTtcclxuXHJcblx0dGhpcy4kZWxlbWVudC5hZGRDbGFzcyhcInJhdGVyLXByZWZzRm9ybVdpZGdldFwiKTtcclxuXHJcblx0dGhpcy5sYXlvdXQgPSAgbmV3IE9PLnVpLkZpZWxkc2V0TGF5b3V0KCB7XHJcblx0XHRsYWJlbDogXCJQcmVmZXJlbmNlc1wiLFxyXG5cdFx0JGVsZW1lbnQ6IHRoaXMuJGVsZW1lbnRcclxuXHR9ICk7XHJcblxyXG5cdHRoaXMucHJlZmVyZW5jZXMgPSB7XHJcblx0XHRcImF1dG9zdGFydFwiOiB7XHJcblx0XHRcdGlucHV0OiBuZXcgT08udWkuVG9nZ2xlU3dpdGNoV2lkZ2V0KCksXHJcblx0XHRcdGxhYmVsOiBcIkF1dG9zdGFydCBSYXRlclwiXHJcblx0XHR9LFxyXG5cdFx0XCJhdXRvc3RhcnRSZWRpcmVjdHNcIjoge1xyXG5cdFx0XHRpbnB1dDogbmV3IE9PLnVpLlRvZ2dsZVN3aXRjaFdpZGdldCgpLFxyXG5cdFx0XHRsYWJlbDogXCJBdXRvc3RhcnQgb24gcmVkaXJlY3RzXCJcclxuXHRcdH0sXHJcblx0XHRcImF1dG9zdGFydE5hbWVzcGFjZXNcIjoge1xyXG5cdFx0XHRpbnB1dDogbmV3IG13LndpZGdldHMuTmFtZXNwYWNlc011bHRpc2VsZWN0V2lkZ2V0KCksXHJcblx0XHRcdGxhYmVsOiBcIkF1dG9zdGFydCBpbiB0aGVzZSBuYW1lc3BhY2VzXCJcclxuXHRcdH0sXHJcblx0XHRcImJ5cGFzc1JlZGlyZWN0c1wiOiB7XHJcblx0XHRcdGlucHV0OiBuZXcgT08udWkuVG9nZ2xlU3dpdGNoV2lkZ2V0KCksXHJcblx0XHRcdGxhYmVsOiBcIkJ5cGFzcyByZWRpcmVjdHMgdG8gYmFubmVyc1wiXHJcblx0XHR9LFxyXG5cdFx0XCJhdXRvZmlsbENsYXNzRnJvbU90aGVyc1wiOiAge1xyXG5cdFx0XHRpbnB1dDogbmV3IE9PLnVpLlRvZ2dsZVN3aXRjaFdpZGdldCgpLFxyXG5cdFx0XHRsYWJlbDogXCJBdXRvZmlsbCBjbGFzcyBmcm9tIG90aGVyIGJhbm5lcnNcIlxyXG5cdFx0fSxcclxuXHRcdFwiYXV0b2ZpbGxDbGFzc0Zyb21PcmVzXCI6IHtcclxuXHRcdFx0aW5wdXQ6IG5ldyBPTy51aS5Ub2dnbGVTd2l0Y2hXaWRnZXQoKSxcclxuXHRcdFx0bGFiZWw6IFwiQXV0b2ZpbGwgY2xhc3MgYmFzZWQgb24gT1JFUyBwcmVkaWN0aW9uXCJcclxuXHRcdH0sXHJcblx0XHRcImF1dG9maWxsSW1wb3J0YW5jZVwiOiB7XHJcblx0XHRcdGlucHV0OiBuZXcgT08udWkuVG9nZ2xlU3dpdGNoV2lkZ2V0KCksXHJcblx0XHRcdGxhYmVsOiBcIkF1dG9maWxsIGxvdyBpbXBvcnRhbmNlXCJcclxuXHRcdH0sXHJcblx0XHRcImNvbGxhcHNlUGFyYW1zTG93ZXJMaW1pdFwiOiB7XHJcblx0XHRcdGlucHV0OiBuZXcgT08udWkuTnVtYmVySW5wdXRXaWRnZXQoIHsgXCJtaW5cIjogMSB9ICksXHJcblx0XHRcdGxhYmVsOiBcIk1pbmltdW0gbnVtYmVyIG9mIHBhcmFtZXRlcnMgdG8gc2hvdyB1bmNvbGxhcHNlZFwiXHJcblx0XHR9LFxyXG5cdFx0XCJ3YXRjaGxpc3RcIjoge1xyXG5cdFx0XHRpbnB1dDogbmV3IE9PLnVpLkJ1dHRvblNlbGVjdFdpZGdldCgge1xyXG5cdFx0XHRcdGl0ZW1zOiBbXHJcblx0XHRcdFx0XHRuZXcgT08udWkuQnV0dG9uT3B0aW9uV2lkZ2V0KCB7XHJcblx0XHRcdFx0XHRcdGRhdGE6IFwicHJlZmVyZW5jZXNcIixcclxuXHRcdFx0XHRcdFx0bGFiZWw6IFwiRGVmYXVsdFwiLFxyXG5cdFx0XHRcdFx0XHR0aXRsZTogXCJVc2VzIHRoZSBzYW1lIHNldHRpbmcgYXMgaWYgeW91IG1hbnVhbGx5IGVkaXRlZCB0aGUgcGFnZSwgYXMgcGVyIFNwZWNpYWw6UHJlZmVyZW5jZXNcIlxyXG5cdFx0XHRcdFx0fSApLFxyXG5cdFx0XHRcdFx0bmV3IE9PLnVpLkJ1dHRvbk9wdGlvbldpZGdldCgge1xyXG5cdFx0XHRcdFx0XHRkYXRhOiBcIndhdGNoXCIsXHJcblx0XHRcdFx0XHRcdGxhYmVsOiBcIkFsd2F5c1wiLFxyXG5cdFx0XHRcdFx0XHR0aXRsZTogXCJBbHdheXMgYWRkIHBhZ2VzIFJhdGVyIGVkaXRzIHRvIHlvdXIgd2F0Y2hsaXN0XCJcclxuXHRcdFx0XHRcdH0gKSxcclxuXHRcdFx0XHRcdG5ldyBPTy51aS5CdXR0b25PcHRpb25XaWRnZXQoIHtcclxuXHRcdFx0XHRcdFx0ZGF0YTogXCJub2NoYW5nZVwiLFxyXG5cdFx0XHRcdFx0XHRsYWJlbDogXCJOZXZlclwiLFxyXG5cdFx0XHRcdFx0XHR0aXRsZTogXCJOZXZlciBhZGQgcGFnZXMgUmF0ZXIgZWRpdCB0byB5b3VyIHdhdGNobGlzdFwiXHJcblx0XHRcdFx0XHR9ICksXHJcblx0XHRcdFx0XVxyXG5cdFx0XHR9KS5zZWxlY3RJdGVtQnlEYXRhKFwicHJlZmVyZW5jZXNcIiksXHJcblx0XHRcdGxhYmVsOiBcIkFkZCBlZGl0ZWQgcGFnZXMgdG8gd2F0Y2hsaXN0XCJcclxuXHRcdH0sXHJcblx0XHRcInJlc2V0Q2FjaGVcIjoge1xyXG5cdFx0XHRpbnB1dDogbmV3IE9PLnVpLkJ1dHRvbldpZGdldCgge1xyXG5cdFx0XHRcdGxhYmVsOiBcIlJlc2V0IGNhY2hlXCIsXHJcblx0XHRcdFx0dGl0bGU6IFwiUmVtb3ZlIGNhY2hlZCBkYXRhLCBpbmNsdWRpbmcgbGlzdCBvZiBXaWtpUHJvamVjdHMgYW5kIHRlbXBsYXRlIHBhcmFtZXRlcnNcIixcclxuXHRcdFx0XHRmbGFnczogW1wiZGVzdHJ1Y3RpdmVcIl1cclxuXHRcdFx0fSApXHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0Zm9yIChsZXQgcHJlZk5hbWUgaW4gdGhpcy5wcmVmZXJlbmNlcyApIHtcclxuXHRcdHRoaXMubGF5b3V0LmFkZEl0ZW1zKFtcclxuXHRcdFx0bmV3IE9PLnVpLkZpZWxkTGF5b3V0KCB0aGlzLnByZWZlcmVuY2VzW3ByZWZOYW1lXS5pbnB1dCwge1xyXG5cdFx0XHRcdGxhYmVsOiB0aGlzLnByZWZlcmVuY2VzW3ByZWZOYW1lXS5sYWJlbCxcclxuXHRcdFx0XHRhbGlnbjogXCJyaWdodFwiXHJcblx0XHRcdH0gKVxyXG5cdFx0XSk7XHJcblx0fVxyXG5cclxuXHR0aGlzLnByZWZlcmVuY2VzLnJlc2V0Q2FjaGUuaW5wdXQuY29ubmVjdCh0aGlzLCB7XCJjbGlja1wiOiBcIm9uUmVzZXRDYWNoZUNsaWNrXCJ9KTtcclxufVxyXG5PTy5pbmhlcml0Q2xhc3MoIFByZWZzRm9ybVdpZGdldCwgT08udWkuV2lkZ2V0ICk7XHJcblxyXG5QcmVmc0Zvcm1XaWRnZXQucHJvdG90eXBlLnNldFByZWZWYWx1ZXMgPSBmdW5jdGlvbihwcmVmcykge1xyXG5cdGZvciAobGV0IHByZWZOYW1lIGluIHByZWZzICkge1xyXG5cdFx0bGV0IHZhbHVlID0gcHJlZnNbcHJlZk5hbWVdO1xyXG5cdFx0bGV0IGlucHV0ID0gdGhpcy5wcmVmZXJlbmNlc1twcmVmTmFtZV0gJiYgdGhpcy5wcmVmZXJlbmNlc1twcmVmTmFtZV0uaW5wdXQ7XHJcblx0XHRzd2l0Y2ggKGlucHV0ICYmIGlucHV0LmNvbnN0cnVjdG9yLm5hbWUpIHtcclxuXHRcdGNhc2UgXCJPb1VpQnV0dG9uU2VsZWN0V2lkZ2V0XCI6XHJcblx0XHRcdGlucHV0LnNlbGVjdEl0ZW1CeURhdGEodmFsdWUpO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgXCJPb1VpTnVtYmVySW5wdXRXaWRnZXRcIjpcclxuXHRcdGNhc2UgXCJPb1VpVG9nZ2xlU3dpdGNoV2lkZ2V0XCI6XHJcblx0XHRcdGlucHV0LnNldFZhbHVlKHZhbHVlKTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlIFwiTXdXaWRnZXRzTmFtZXNwYWNlc011bHRpc2VsZWN0V2lkZ2V0XCI6XHJcblx0XHRcdGlucHV0LmNsZWFySXRlbXMoKTtcclxuXHRcdFx0dmFsdWUuZm9yRWFjaChucyA9PlxyXG5cdFx0XHRcdGlucHV0LmFkZFRhZyhcclxuXHRcdFx0XHRcdG5zLnRvU3RyaW5nKCksXHJcblx0XHRcdFx0XHRucyA9PT0gMFxyXG5cdFx0XHRcdFx0XHQ/IFwiKE1haW4pXCJcclxuXHRcdFx0XHRcdFx0OiBjb25maWcubXcud2dGb3JtYXR0ZWROYW1lc3BhY2VzW25zXVxyXG5cdFx0XHRcdClcclxuXHRcdFx0KTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHR9XHJcblx0fVxyXG59O1xyXG5cclxuUHJlZnNGb3JtV2lkZ2V0LnByb3RvdHlwZS5nZXRQcmVmcyA9IGZ1bmN0aW9uKCkge1xyXG5cdHZhciBwcmVmcyA9IHt9O1xyXG5cdGZvciAobGV0IHByZWZOYW1lIGluIHRoaXMucHJlZmVyZW5jZXMgKSB7XHJcblx0XHRsZXQgaW5wdXQgPSB0aGlzLnByZWZlcmVuY2VzW3ByZWZOYW1lXS5pbnB1dDtcclxuXHRcdGxldCB2YWx1ZTtcclxuXHRcdHN3aXRjaCAoaW5wdXQuY29uc3RydWN0b3IubmFtZSkge1xyXG5cdFx0Y2FzZSBcIk9vVWlCdXR0b25TZWxlY3RXaWRnZXRcIjpcclxuXHRcdFx0dmFsdWUgPSBpbnB1dC5maW5kU2VsZWN0ZWRJdGVtKCkuZ2V0RGF0YSgpO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgXCJPb1VpVG9nZ2xlU3dpdGNoV2lkZ2V0XCI6XHJcblx0XHRcdHZhbHVlID0gaW5wdXQuZ2V0VmFsdWUoKTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlIFwiT29VaU51bWJlcklucHV0V2lkZ2V0XCI6XHJcblx0XHRcdHZhbHVlID0gTnVtYmVyKGlucHV0LmdldFZhbHVlKCkpOyAvLyB3aWRnZXQgdXNlcyBzdHJpbmdzLCBub3QgbnVtYmVycyFcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlIFwiTXdXaWRnZXRzTmFtZXNwYWNlc011bHRpc2VsZWN0V2lkZ2V0XCI6XHJcblx0XHRcdHZhbHVlID0gaW5wdXQuZ2V0VmFsdWUoKS5tYXAoTnVtYmVyKTsgLy8gd2lkZ2V0IHVzZXMgc3RyaW5ncywgbm90IG51bWJlcnMhXHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0fVxyXG5cdFx0cHJlZnNbcHJlZk5hbWVdID0gdmFsdWU7XHJcblx0fVxyXG5cdHJldHVybiBwcmVmcztcclxufTtcclxuXHJcblByZWZzRm9ybVdpZGdldC5wcm90b3R5cGUub25SZXNldENhY2hlQ2xpY2sgPSBmdW5jdGlvbigpIHtcclxuXHRPTy51aS5jb25maXJtKFwiQWZ0ZXIgcmVzZXRpbmcgY2FjaGUsIFJhdGVyIHdpbGwgY2xvc2UgYW5kIHJlc3RhcnQuIEFueSBjaGFuZ2VzIG1hZGUgd2lsbCBiZSBkaXNjYXJkZWQuXCIpXHJcblx0XHQudGhlbihjb25maXJtZWQgPT4ge1xyXG5cdFx0XHRpZiAoY29uZmlybWVkKSB7IFxyXG5cdFx0XHRcdHRoaXMuZW1pdChcInJlc2V0Q2FjaGVcIik7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgUHJlZnNGb3JtV2lkZ2V0O1xyXG4vLyA8L25vd2lraT4iLCIvLyA8bm93aWtpPlxyXG5cclxudmFyIFN1Z2dlc3Rpb25Mb29rdXBUZXh0SW5wdXRXaWRnZXQgPSBmdW5jdGlvbiBTdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0KCBjb25maWcgKSB7XHJcblx0T08udWkuVGV4dElucHV0V2lkZ2V0LmNhbGwoIHRoaXMsIGNvbmZpZyApO1xyXG5cdE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQuY2FsbCggdGhpcywgY29uZmlnICk7XHJcblx0dGhpcy5zdWdnZXN0aW9ucyA9IEFycmF5LmlzQXJyYXkoY29uZmlnLnN1Z2dlc3Rpb25zKSA/IGNvbmZpZy5zdWdnZXN0aW9ucyA6IFtdO1xyXG5cdHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoXCJyYXRlci1zdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0XCIpO1xyXG59O1xyXG5PTy5pbmhlcml0Q2xhc3MoIFN1Z2dlc3Rpb25Mb29rdXBUZXh0SW5wdXRXaWRnZXQsIE9PLnVpLlRleHRJbnB1dFdpZGdldCApO1xyXG5PTy5taXhpbkNsYXNzKCBTdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0LCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50ICk7XHJcblxyXG4vLyBTZXQgc3VnZ2VzdGlvbi4gcGFyYW06IE9iamVjdFtdIHdpdGggb2JqZWN0cyBvZiB0aGUgZm9ybSB7IGRhdGE6IC4uLiAsIGxhYmVsOiAuLi4gfVxyXG5TdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0LnByb3RvdHlwZS5zZXRTdWdnZXN0aW9ucyA9IGZ1bmN0aW9uKHN1Z2dlc3Rpb25zKSB7XHJcblx0aWYgKCFBcnJheS5pc0FycmF5KHN1Z2dlc3Rpb25zKSkge1xyXG5cdFx0aWYgKHN1Z2dlc3Rpb25zICE9IG51bGwpIHtcclxuXHRcdFx0Y29uc29sZS53YXJuKFwiW1JhdGVyXSBTdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0LnByb3RvdHlwZS5zZXRTdWdnZXN0aW9ucyBjYWxsZWQgd2l0aCBhIG5vbi1hcnJheSB2YWx1ZTpcIiwgc3VnZ2VzdGlvbnMpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHR0aGlzLnN1Z2dlc3Rpb25zID0gc3VnZ2VzdGlvbnM7XHJcbn07XHJcblxyXG4vLyBSZXR1cm5zIGRhdGEsIGFzIGEgcmVzb2x1dGlvbiB0byBhIHByb21pc2UsIHRvIGJlIHBhc3NlZCB0byAjZ2V0TG9va3VwTWVudU9wdGlvbnNGcm9tRGF0YVxyXG5TdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0LnByb3RvdHlwZS5nZXRMb29rdXBSZXF1ZXN0ID0gZnVuY3Rpb24gKCkge1xyXG5cdHZhciBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKS5yZXNvbHZlKG5ldyBSZWdFeHAoXCJcXFxcYlwiICsgbXcudXRpbC5lc2NhcGVSZWdFeHAodGhpcy5nZXRWYWx1ZSgpKSwgXCJpXCIpKTtcclxuXHRyZXR1cm4gZGVmZXJyZWQucHJvbWlzZSggeyBhYm9ydDogZnVuY3Rpb24gKCkge30gfSApO1xyXG59O1xyXG5cclxuLy8gPz8/XHJcblN1Z2dlc3Rpb25Mb29rdXBUZXh0SW5wdXRXaWRnZXQucHJvdG90eXBlLmdldExvb2t1cENhY2hlRGF0YUZyb21SZXNwb25zZSA9IGZ1bmN0aW9uICggcmVzcG9uc2UgKSB7XHJcblx0cmV0dXJuIHJlc3BvbnNlIHx8IFtdO1xyXG59O1xyXG5cclxuLy8gSXMgcGFzc2VkIGRhdGEgZnJvbSAjZ2V0TG9va3VwUmVxdWVzdCwgcmV0dXJucyBhbiBhcnJheSBvZiBtZW51IGl0ZW0gd2lkZ2V0cyBcclxuU3VnZ2VzdGlvbkxvb2t1cFRleHRJbnB1dFdpZGdldC5wcm90b3R5cGUuZ2V0TG9va3VwTWVudU9wdGlvbnNGcm9tRGF0YSA9IGZ1bmN0aW9uICggcGF0dGVybiApIHtcclxuXHR2YXIgbGFiZWxNYXRjaGVzSW5wdXRWYWwgPSBmdW5jdGlvbihzdWdnZXN0aW9uSXRlbSkge1xyXG5cdFx0cmV0dXJuIHBhdHRlcm4udGVzdChzdWdnZXN0aW9uSXRlbS5sYWJlbCkgfHwgKCAhc3VnZ2VzdGlvbkl0ZW0ubGFiZWwgJiYgcGF0dGVybi50ZXN0KHN1Z2dlc3Rpb25JdGVtLmRhdGEpICk7XHJcblx0fTtcclxuXHR2YXIgbWFrZU1lbnVPcHRpb25XaWRnZXQgPSBmdW5jdGlvbihvcHRpb25JdGVtKSB7XHJcblx0XHRyZXR1cm4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoIHtcclxuXHRcdFx0ZGF0YTogb3B0aW9uSXRlbS5kYXRhLFxyXG5cdFx0XHRsYWJlbDogb3B0aW9uSXRlbS5sYWJlbCB8fCBvcHRpb25JdGVtLmRhdGFcclxuXHRcdH0gKTtcclxuXHR9O1xyXG5cdHJldHVybiB0aGlzLnN1Z2dlc3Rpb25zLmZpbHRlcihsYWJlbE1hdGNoZXNJbnB1dFZhbCkubWFwKG1ha2VNZW51T3B0aW9uV2lkZ2V0KTtcclxufTtcclxuXHJcbi8vIEV4dGVuZCBvbkxvb2t1cE1lbnVDaG9vc2UgbWV0aG9kIHRvIGVtaXQgYW4gY2hvb3NlIGV2ZW50XHJcblN1Z2dlc3Rpb25Mb29rdXBUZXh0SW5wdXRXaWRnZXQucHJvdG90eXBlLm9uTG9va3VwTWVudUNob29zZSA9IGZ1bmN0aW9uICggaXRlbSApIHtcclxuXHQvLyBHZXQgZGF0YVxyXG5cdGNvbnN0IGl0ZW1EYXRhID0gaXRlbS5nZXREYXRhKCk7XHJcblx0Ly8gU2ltcGxpZnkgaXRlbSBkYXRhIGlmIGl0IGlzIGFuIG9iamVjdCB3aXRoIGEgbmFtZSBwcm9wZXJ0eVxyXG5cdGlmIChpdGVtRGF0YSAmJiBpdGVtRGF0YS5uYW1lKSB7XHJcblx0XHRpdGVtLnNldERhdGEoaXRlbURhdGEubmFtZSk7XHJcblx0fVxyXG5cdC8vIEZpcnN0IGJsdXIgdGhlIGlucHV0LCB0byBwcmV2ZW50IHRoZSBtZW51IHBvcHBpbmcgYmFjayB1cFxyXG5cdHRoaXMuJGlucHV0LmJsdXIoKTtcclxuXHRPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LnByb3RvdHlwZS5vbkxvb2t1cE1lbnVDaG9vc2UuY2FsbCh0aGlzLCBpdGVtKTtcclxuXHR0aGlzLmVtaXQoXCJjaG9vc2VcIiwgaXRlbURhdGEgKTtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN1Z2dlc3Rpb25Mb29rdXBUZXh0SW5wdXRXaWRnZXQ7XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCBhcHBDb25maWcgZnJvbSBcIi4uLy4uL2NvbmZpZ1wiO1xyXG5pbXBvcnQgU3VnZ2VzdGlvbkxvb2t1cFRleHRJbnB1dFdpZGdldCBmcm9tIFwiLi9TdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0XCI7XHJcbmltcG9ydCB7Z2V0QmFubmVyTmFtZXN9IGZyb20gXCIuLi8uLi9nZXRCYW5uZXJzXCI7XHJcbi8vIDxub3dpa2k+XHJcblxyXG5mdW5jdGlvbiBUb3BCYXJXaWRnZXQoIGNvbmZpZyApIHtcclxuXHQvLyBDb25maWd1cmF0aW9uIGluaXRpYWxpemF0aW9uXHJcblx0Y29uZmlnID0gJC5leHRlbmQoXHJcblx0XHR7XHJcblx0XHRcdGV4cGFuZGVkOiBmYWxzZSxcclxuXHRcdFx0ZnJhbWVkOiBmYWxzZSxcclxuXHRcdFx0cGFkZGVkOiBmYWxzZVxyXG5cdFx0fSxcclxuXHRcdGNvbmZpZyB8fCB7fVxyXG5cdCk7XHJcblx0Ly8gQ2FsbCBwYXJlbnQgY29uc3RydWN0b3JcclxuXHRUb3BCYXJXaWRnZXQuc3VwZXIuY2FsbCggdGhpcywgY29uZmlnICk7XHJcblx0dGhpcy4kb3ZlcmxheSA9IGNvbmZpZy4kb3ZlcmxheTtcclxuICAgIFxyXG5cdC8vIFNlYXJjaCBib3hcclxuXHR0aGlzLnNlYXJjaEJveCA9IG5ldyBTdWdnZXN0aW9uTG9va3VwVGV4dElucHV0V2lkZ2V0KCB7XHJcblx0XHRwbGFjZWhvbGRlcjogXCJBZGQgYSBXaWtpUHJvamVjdC4uLlwiLFxyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8ZGl2IHN0eWxlPSdkaXNwbGF5OmlubGluZS1ibG9jazsgbWFyZ2luOjAgLTFweDsgd2lkdGg6Y2FsYygxMDAlIC0gNTVweCk7Jz5cIiksXHJcblx0XHQkb3ZlcmxheTogdGhpcy4kb3ZlcmxheSxcclxuXHR9ICk7XHJcblx0Z2V0QmFubmVyTmFtZXMoKVxyXG5cdFx0LnRoZW4oYmFubmVycyA9PiBbXHJcblx0XHRcdC4uLmJhbm5lcnMud2l0aFJhdGluZ3MubWFwKGJhbm5lck5hbWUgPT4gKHtcclxuXHRcdFx0XHRsYWJlbDogYmFubmVyTmFtZS5yZXBsYWNlKFwiV2lraVByb2plY3QgXCIsIFwiXCIpLFxyXG5cdFx0XHRcdGRhdGE6IHtcclxuXHRcdFx0XHRcdG5hbWU6IGJhbm5lck5hbWVcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pKSxcclxuXHRcdFx0Li4uYmFubmVycy53aXRob3V0UmF0aW5ncy5tYXAoYmFubmVyTmFtZSA9PiAoe1xyXG5cdFx0XHRcdGxhYmVsOiBiYW5uZXJOYW1lLnJlcGxhY2UoXCJXaWtpUHJvamVjdCBcIiwgXCJcIiksXHJcblx0XHRcdFx0ZGF0YToge1xyXG5cdFx0XHRcdFx0bmFtZTogYmFubmVyTmFtZSxcclxuXHRcdFx0XHRcdHdpdGhvdXRSYXRpbmdzOiB0cnVlXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KSksXHJcblx0XHRcdC4uLmJhbm5lcnMud3JhcHBlcnMubWFwKGJhbm5lck5hbWUgPT4gKHtcclxuXHRcdFx0XHRsYWJlbDogYmFubmVyTmFtZS5yZXBsYWNlKFwiV2lraVByb2plY3QgXCIsIFwiXCIpICsgXCIgW3RlbXBsYXRlIHdyYXBwZXJdXCIsXHJcblx0XHRcdFx0ZGF0YToge1xyXG5cdFx0XHRcdFx0bmFtZTogYmFubmVyTmFtZSxcclxuXHRcdFx0XHRcdHdyYXBwZXI6IHRydWVcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pKSxcclxuXHRcdFx0Li4uYmFubmVycy5ub3RXUEJNLm1hcChiYW5uZXJOYW1lID0+ICh7XHJcblx0XHRcdFx0bGFiZWw6IGJhbm5lck5hbWUucmVwbGFjZShcIldpa2lQcm9qZWN0IFwiLCBcIlwiKSxcclxuXHRcdFx0XHRkYXRhOiB7XHJcblx0XHRcdFx0XHRuYW1lOiBiYW5uZXJOYW1lXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KSksXHJcblx0XHRcdC4uLmJhbm5lcnMuaW5hY3RpdmUubWFwKGJhbm5lck5hbWUgPT4gKHtcclxuXHRcdFx0XHRsYWJlbDogYmFubmVyTmFtZS5yZXBsYWNlKFwiV2lraVByb2plY3QgXCIsIFwiXCIpICsgXCIgW2luYWN0aXZlXVwiLFxyXG5cdFx0XHRcdGRhdGE6IHtcclxuXHRcdFx0XHRcdG5hbWU6IGJhbm5lck5hbWUsXHJcblx0XHRcdFx0XHR3aXRob3V0UmF0aW5nczogdHJ1ZVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSkpLFxyXG5cdFx0XHQuLi5iYW5uZXJzLndpci5tYXAoYmFubmVyTmFtZSA9PiAoe1xyXG5cdFx0XHRcdGxhYmVsOiBiYW5uZXJOYW1lICsgXCIgW1dvbWVuIEluIFJlZCBtZWV0dXAvaW5pdGlhdGl2ZV1cIixcclxuXHRcdFx0XHRkYXRhOiB7XHJcblx0XHRcdFx0XHRuYW1lOiBiYW5uZXJOYW1lLFxyXG5cdFx0XHRcdFx0d2l0aG91dFJhdGluZ3M6IHRydWVcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pKVxyXG5cdFx0XSlcclxuXHRcdC50aGVuKGJhbm5lck9wdGlvbnMgPT4gdGhpcy5zZWFyY2hCb3guc2V0U3VnZ2VzdGlvbnMoYmFubmVyT3B0aW9ucykpO1xyXG4gICAgXHJcblx0Ly8gQWRkIGJ1dHRvblxyXG5cdHRoaXMuYWRkQmFubmVyQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCgge1xyXG5cdFx0aWNvbjogXCJhZGRcIixcclxuXHRcdHRpdGxlOiBcIkFkZFwiLFxyXG5cdFx0ZmxhZ3M6IFwicHJvZ3Jlc3NpdmVcIixcclxuXHRcdCRlbGVtZW50OiAkKFwiPHNwYW4gc3R5bGU9J2Zsb2F0OnJpZ2h0O21hcmdpbjogMDt0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEycHgpOyc+XCIpLFxyXG5cdH0gKTtcclxuXHR2YXIgJHNlYXJjaENvbnRhaW5lciA9ICQoXCI8ZGl2IHN0eWxlPSdkaXNwbGF5OmlubGluZS1ibG9jazsgZmxleC1zaHJpbms6MTsgZmxleC1ncm93OjEwMDsgbWluLXdpZHRoOjI1MHB4OyB3aWR0aDo1MCU7Jz5cIilcclxuXHRcdC5hcHBlbmQodGhpcy5zZWFyY2hCb3guJGVsZW1lbnQsIHRoaXMuYWRkQmFubmVyQnV0dG9uLiRlbGVtZW50KTtcclxuXHJcblx0Ly8gU2V0IGFsbCBjbGFzc2VzL2ltcG9ydGFuY2VzXHJcblx0Ly8gaW4gdGhlIHN0eWxlIG9mIGEgcG9wdXAgYnV0dG9uIHdpdGggYSBtZW51IChpcyBhY3R1YWxseSBhIGRyb3Bkb3duIHdpdGggYSBoaWRkZW4gbGFiZWwsIGJlY2F1c2UgdGhhdCBtYWtlcyB0aGUgY29kaW5nIGVhc2llci4pXHJcblx0dGhpcy5zZXRBbGxEcm9wRG93biA9IG5ldyBPTy51aS5Ecm9wZG93bldpZGdldCgge1xyXG5cdFx0aWNvbjogXCJ0YWdcIixcclxuXHRcdGxhYmVsOiBcIlNldCBhbGwuLi5cIixcclxuXHRcdGludmlzaWJsZUxhYmVsOiB0cnVlLFxyXG5cdFx0bWVudToge1xyXG5cdFx0XHRpdGVtczogW1xyXG5cdFx0XHRcdG5ldyBPTy51aS5NZW51U2VjdGlvbk9wdGlvbldpZGdldCgge1xyXG5cdFx0XHRcdFx0bGFiZWw6IFwiQ2xhc3Nlc1wiXHJcblx0XHRcdFx0fSApLFxyXG5cdFx0XHRcdG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KCB7XHJcblx0XHRcdFx0XHRkYXRhOiB7Y2xhc3M6IG51bGx9LFxyXG5cdFx0XHRcdFx0bGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChcIjxzcGFuIHN0eWxlPVxcXCJjb2xvcjojNzc3XFxcIj4obm8gY2xhc3MpPC9zcGFuPlwiKVxyXG5cdFx0XHRcdH0gKSxcclxuXHRcdFx0XHQuLi5hcHBDb25maWcuYmFubmVyRGVmYXVsdHMuY2xhc3Nlcy5tYXAoY2xhc3NuYW1lID0+IG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KCB7XHJcblx0XHRcdFx0XHRkYXRhOiB7Y2xhc3M6IGNsYXNzbmFtZX0sXHJcblx0XHRcdFx0XHRsYWJlbDogY2xhc3NuYW1lXHJcblx0XHRcdFx0fSApXHJcblx0XHRcdFx0KSxcclxuXHRcdFx0XHRuZXcgT08udWkuTWVudVNlY3Rpb25PcHRpb25XaWRnZXQoIHtcclxuXHRcdFx0XHRcdGxhYmVsOiBcIkltcG9ydGFuY2VzXCJcclxuXHRcdFx0XHR9ICksXHJcblx0XHRcdFx0bmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoIHtcclxuXHRcdFx0XHRcdGRhdGE6IHtpbXBvcnRhbmNlOiBudWxsfSxcclxuXHRcdFx0XHRcdGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXCI8c3BhbiBzdHlsZT1cXFwiY29sb3I6Izc3N1xcXCI+KG5vIGltcG9ydGFuY2UpPC9zcGFuPlwiKVxyXG5cdFx0XHRcdH0gKSxcclxuXHRcdFx0XHQuLi5hcHBDb25maWcuYmFubmVyRGVmYXVsdHMuaW1wb3J0YW5jZXMubWFwKGltcG9ydGFuY2UgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoIHtcclxuXHRcdFx0XHRcdGRhdGE6IHtpbXBvcnRhbmNlOiBpbXBvcnRhbmNlfSxcclxuXHRcdFx0XHRcdGxhYmVsOiBpbXBvcnRhbmNlXHJcblx0XHRcdFx0fSApXHJcblx0XHRcdFx0KVxyXG5cdFx0XHRdXHJcblx0XHR9LFxyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8c3BhbiBzdHlsZT1cXFwid2lkdGg6YXV0bztkaXNwbGF5OmlubGluZS1ibG9jaztmbG9hdDpsZWZ0O21hcmdpbjowXFxcIiB0aXRsZT0nU2V0IGFsbC4uLic+XCIpLFxyXG5cdFx0JG92ZXJsYXk6IHRoaXMuJG92ZXJsYXksXHJcblx0fSApO1xyXG5cclxuXHQvLyBSZW1vdmUgYWxsIGJhbm5lcnMgYnV0dG9uXHJcblx0dGhpcy5yZW1vdmVBbGxCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KCB7XHJcblx0XHRpY29uOiBcInRyYXNoXCIsXHJcblx0XHR0aXRsZTogXCJSZW1vdmUgYWxsXCIsXHJcblx0XHRmbGFnczogXCJkZXN0cnVjdGl2ZVwiXHJcblx0fSApO1xyXG5cclxuXHQvLyBDbGVhciBhbGwgcGFyYW1ldGVycyBidXR0b25cclxuXHR0aGlzLmNsZWFyQWxsQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCgge1xyXG5cdFx0aWNvbjogXCJjYW5jZWxcIixcclxuXHRcdHRpdGxlOiBcIkNsZWFyIGFsbFwiLFxyXG5cdFx0ZmxhZ3M6IFwiZGVzdHJ1Y3RpdmVcIlxyXG5cdH0gKTtcclxuXHJcblx0Ly8gR3JvdXAgdGhlIGJ1dHRvbnMgdG9nZXRoZXJcclxuXHR0aGlzLm1lbnVCdXR0b25zID0gbmV3IE9PLnVpLkJ1dHRvbkdyb3VwV2lkZ2V0KCB7XHJcblx0XHRpdGVtczogW1xyXG5cdFx0XHR0aGlzLnJlbW92ZUFsbEJ1dHRvbixcclxuXHRcdFx0dGhpcy5jbGVhckFsbEJ1dHRvblxyXG5cdFx0XSxcclxuXHRcdCRlbGVtZW50OiAkKFwiPHNwYW4gc3R5bGU9J2ZsZXg6MSAwIGF1dG87Jz5cIiksXHJcblx0fSApO1xyXG5cdC8vIEluY2x1ZGUgdGhlIGRyb3Bkb3duIGluIHRoZSBncm91cFxyXG5cdHRoaXMubWVudUJ1dHRvbnMuJGVsZW1lbnQucHJlcGVuZCh0aGlzLnNldEFsbERyb3BEb3duLiRlbGVtZW50KTtcclxuXHJcblx0Ly8gUHV0IGV2ZXJ5dGhpbmcgaW50byBhIGxheW91dFxyXG5cdHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoXCJyYXRlci10b3BCYXJXaWRnZXRcIilcclxuXHRcdC5jc3Moe1xyXG5cdFx0XHRcInBvc2l0aW9uXCI6IFwiZml4ZWRcIixcclxuXHRcdFx0XCJ3aWR0aFwiOiBcIjEwMCVcIixcclxuXHRcdFx0XCJiYWNrZ3JvdW5kXCI6IFwiI2NjY1wiLFxyXG5cdFx0XHRcImRpc3BsYXlcIjogXCJmbGV4XCIsXHJcblx0XHRcdFwiZmxleC13cmFwXCI6IFwid3JhcFwiLFxyXG5cdFx0XHRcImp1c3RpZnktY29udGVudFwiOiBcInNwYWNlLWFyb3VuZFwiLFxyXG5cdFx0XHRcIm1hcmdpblwiOiBcIi0ycHggMCAwIDBcIlxyXG5cdFx0fSlcclxuXHRcdC5hcHBlbmQoXHJcblx0XHRcdCRzZWFyY2hDb250YWluZXIsXHJcblx0XHRcdHRoaXMubWVudUJ1dHRvbnMuJGVsZW1lbnRcclxuXHRcdCk7XHJcblxyXG5cdC8qIC0tLSBFdmVudCBoYW5kbGluZyAtLS0gKi9cclxuICAgIFxyXG5cdHRoaXMuc2VhcmNoQm94LmNvbm5lY3QodGhpcywge1xyXG5cdFx0XCJlbnRlclwiOiBcIm9uU2VhcmNoU2VsZWN0XCIsXHJcblx0XHRcImNob29zZVwiOiBcIm9uU2VhcmNoU2VsZWN0XCJcclxuXHR9KTtcclxuXHR0aGlzLmFkZEJhbm5lckJ1dHRvbi5jb25uZWN0KHRoaXMsIHtcImNsaWNrXCI6IFwib25TZWFyY2hTZWxlY3RcIn0pO1xyXG5cdHRoaXMuc2V0QWxsRHJvcERvd24uZ2V0TWVudSgpLmNvbm5lY3QodGhpcywge1wiY2hvb3NlXCI6IFwib25SYXRpbmdDaG9vc2VcIn0pO1xyXG5cdHRoaXMucmVtb3ZlQWxsQnV0dG9uLmNvbm5lY3QodGhpcywge1wiY2xpY2tcIjogXCJvblJlbW92ZUFsbENsaWNrXCJ9KTtcclxuXHR0aGlzLmNsZWFyQWxsQnV0dG9uLmNvbm5lY3QodGhpcywge1wiY2xpY2tcIjogXCJvbkNsZWFyQWxsQ2xpY2tcIn0pO1xyXG59XHJcbk9PLmluaGVyaXRDbGFzcyggVG9wQmFyV2lkZ2V0LCBPTy51aS5QYW5lbExheW91dCApO1xyXG5cclxuVG9wQmFyV2lkZ2V0LnByb3RvdHlwZS5vblNlYXJjaFNlbGVjdCA9IGZ1bmN0aW9uKGRhdGEpIHtcclxuXHR0aGlzLmVtaXQoXCJzZWFyY2hTZWxlY3RcIiwgZGF0YSk7XHJcbn07XHJcblxyXG5Ub3BCYXJXaWRnZXQucHJvdG90eXBlLm9uUmF0aW5nQ2hvb3NlID0gZnVuY3Rpb24oaXRlbSkge1xyXG5cdGNvbnN0IGRhdGEgPSBpdGVtLmdldERhdGEoKTtcclxuXHRpZiAoZGF0YS5jbGFzcyB8fCBkYXRhLmNsYXNzPT09bnVsbCkge1xyXG5cdFx0dGhpcy5lbWl0KFwic2V0Q2xhc3Nlc1wiLCBkYXRhLmNsYXNzKTtcclxuXHR9XHJcblx0aWYgKGRhdGEuaW1wb3J0YW5jZSB8fCBkYXRhLmltcG9ydGFuY2U9PT1udWxsKSB7XHJcblx0XHR0aGlzLmVtaXQoXCJzZXRJbXBvcnRhbmNlc1wiLCBkYXRhLmltcG9ydGFuY2UpO1xyXG5cdH1cclxufTtcclxuXHJcblRvcEJhcldpZGdldC5wcm90b3R5cGUub25SZW1vdmVBbGxDbGljayA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuZW1pdChcInJlbW92ZUFsbFwiKTtcclxufTtcclxuXHJcblRvcEJhcldpZGdldC5wcm90b3R5cGUub25DbGVhckFsbENsaWNrID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5lbWl0KFwiY2xlYXJBbGxcIik7XHJcbn07XHJcblxyXG5Ub3BCYXJXaWRnZXQucHJvdG90eXBlLnNldERpc2FibGVkID0gZnVuY3Rpb24oZGlzYWJsZSkge1xyXG5cdFtcclxuXHRcdHRoaXMuc2VhcmNoQm94LFxyXG5cdFx0dGhpcy5hZGRCYW5uZXJCdXR0b24sXHJcblx0XHR0aGlzLnNldEFsbERyb3BEb3duLFxyXG5cdFx0dGhpcy5yZW1vdmVBbGxCdXR0b24sXHJcblx0XHR0aGlzLmNsZWFyQWxsQnV0dG9uXHJcblx0XS5mb3JFYWNoKHdpZGdldCA9PiB3aWRnZXQuc2V0RGlzYWJsZWQoZGlzYWJsZSkpO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgVG9wQmFyV2lkZ2V0O1xyXG4vLyA8L25vd2lraT4iLCJpbXBvcnQgeyBtYWtlRXJyb3JNc2cgfSBmcm9tIFwiLi4vYXBpXCI7XHJcbi8vIDxub3dpa2k+XHJcblxyXG4vKiB2YXIgaW5jcmVtZW50UHJvZ3Jlc3NCeUludGVydmFsID0gZnVuY3Rpb24oKSB7XHJcblx0dmFyIGluY3JlbWVudEludGVydmFsRGVsYXkgPSAxMDA7XHJcblx0dmFyIGluY3JlbWVudEludGVydmFsQW1vdW50ID0gMC4xO1xyXG5cdHZhciBpbmNyZW1lbnRJbnRlcnZhbE1heHZhbCA9IDk4O1xyXG5cdHJldHVybiB3aW5kb3cuc2V0SW50ZXJ2YWwoXHJcblx0XHRpbmNyZW1lbnRQcm9ncmVzcyxcclxuXHRcdGluY3JlbWVudEludGVydmFsRGVsYXksXHJcblx0XHRpbmNyZW1lbnRJbnRlcnZhbEFtb3VudCxcclxuXHRcdGluY3JlbWVudEludGVydmFsTWF4dmFsXHJcblx0KTtcclxufTsgKi9cclxuXHJcbnZhciBMb2FkRGlhbG9nID0gZnVuY3Rpb24gTG9hZERpYWxvZyggY29uZmlnICkge1xyXG5cdExvYWREaWFsb2cuc3VwZXIuY2FsbCggdGhpcywgY29uZmlnICk7XHJcbn07XHJcbk9PLmluaGVyaXRDbGFzcyggTG9hZERpYWxvZywgT08udWkuRGlhbG9nICk7IFxyXG5cclxuTG9hZERpYWxvZy5zdGF0aWMubmFtZSA9IFwibG9hZERpYWxvZ1wiO1xyXG5Mb2FkRGlhbG9nLnN0YXRpYy50aXRsZSA9IFwiTG9hZGluZyBSYXRlci4uLlwiO1xyXG5cclxuLy8gQ3VzdG9taXplIHRoZSBpbml0aWFsaXplKCkgZnVuY3Rpb246IFRoaXMgaXMgd2hlcmUgdG8gYWRkIGNvbnRlbnQgdG8gdGhlIGRpYWxvZyBib2R5IGFuZCBzZXQgdXAgZXZlbnQgaGFuZGxlcnMuXHJcbkxvYWREaWFsb2cucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbiAoKSB7XHJcblx0Ly8gQ2FsbCB0aGUgcGFyZW50IG1ldGhvZC5cclxuXHRMb2FkRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwoIHRoaXMgKTtcclxuXHQvLyBDcmVhdGUgYSBsYXlvdXRcclxuXHR0aGlzLmNvbnRlbnQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoIHsgXHJcblx0XHRwYWRkZWQ6IHRydWUsXHJcblx0XHRleHBhbmRlZDogZmFsc2UgXHJcblx0fSApO1xyXG5cdC8vIENyZWF0ZSBjb250ZW50XHJcblx0dGhpcy5wcm9ncmVzc0JhciA9IG5ldyBPTy51aS5Qcm9ncmVzc0JhcldpZGdldCgge1xyXG5cdFx0cHJvZ3Jlc3M6IDFcclxuXHR9ICk7XHJcblx0dGhpcy5zZXR1cHRhc2tzID0gW1xyXG5cdFx0bmV3IE9PLnVpLkxhYmVsV2lkZ2V0KCB7XHJcblx0XHRcdGxhYmVsOiBcIkxvYWRpbmcgeW91ciBSYXRlciBwcmVmZXJlbmNlcy4uLlwiLFxyXG5cdFx0XHQkZWxlbWVudDogJChcIjxwIHN0eWxlPVxcXCJkaXNwbGF5OmJsb2NrXFxcIj5cIilcclxuXHRcdH0pLFxyXG5cdFx0bmV3IE9PLnVpLkxhYmVsV2lkZ2V0KCB7XHJcblx0XHRcdGxhYmVsOiBcIkxvYWRpbmcgbGlzdCBvZiBwcm9qZWN0IGJhbm5lcnMuLi5cIixcclxuXHRcdFx0JGVsZW1lbnQ6ICQoXCI8cCBzdHlsZT1cXFwiZGlzcGxheTpibG9ja1xcXCI+XCIpXHJcblx0XHR9KSxcclxuXHRcdG5ldyBPTy51aS5MYWJlbFdpZGdldCgge1xyXG5cdFx0XHRsYWJlbDogXCJMb2FkaW5nIHRhbGtwYWdlIHdpa2l0ZXh0Li4uXCIsXHJcblx0XHRcdCRlbGVtZW50OiAkKFwiPHAgc3R5bGU9XFxcImRpc3BsYXk6YmxvY2tcXFwiPlwiKVxyXG5cdFx0fSksXHJcblx0XHRuZXcgT08udWkuTGFiZWxXaWRnZXQoIHtcclxuXHRcdFx0bGFiZWw6IFwiUGFyc2luZyB0YWxrcGFnZSB0ZW1wbGF0ZXMuLi5cIixcclxuXHRcdFx0JGVsZW1lbnQ6ICQoXCI8cCBzdHlsZT1cXFwiZGlzcGxheTpibG9ja1xcXCI+XCIpXHJcblx0XHR9KSxcclxuXHRcdG5ldyBPTy51aS5MYWJlbFdpZGdldCgge1xyXG5cdFx0XHRsYWJlbDogXCJHZXR0aW5nIHRlbXBsYXRlcycgcGFyYW1ldGVyIGRhdGEuLi5cIixcclxuXHRcdFx0JGVsZW1lbnQ6ICQoXCI8cCBzdHlsZT1cXFwiZGlzcGxheTpibG9ja1xcXCI+XCIpXHJcblx0XHR9KSxcclxuXHRcdG5ldyBPTy51aS5MYWJlbFdpZGdldCgge1xyXG5cdFx0XHRsYWJlbDogXCJDaGVja2luZyBzdWJqZWN0IHBhZ2UuLi5cIixcclxuXHRcdFx0JGVsZW1lbnQ6ICQoXCI8cCBzdHlsZT1cXFwiZGlzcGxheTpibG9ja1xcXCI+XCIpXHJcblx0XHR9KSxcclxuXHRcdG5ldyBPTy51aS5MYWJlbFdpZGdldCgge1xyXG5cdFx0XHRsYWJlbDogXCJSZXRyaWV2aW5nIHF1YWxpdHkgcHJlZGljdGlvbi4uLlwiLFxyXG5cdFx0XHQkZWxlbWVudDogJChcIjxwIHN0eWxlPVxcXCJkaXNwbGF5OmJsb2NrXFxcIj5cIilcclxuXHRcdH0pLnRvZ2dsZSgpLFxyXG5cdF07XHJcblx0dGhpcy5jbG9zZUJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoIHtcclxuXHRcdGxhYmVsOiBcIkNsb3NlXCJcclxuXHR9KS50b2dnbGUoKTtcclxuXHR0aGlzLnNldHVwUHJvbWlzZXMgPSBbXTtcclxuXHJcblx0Ly8gQXBwZW5kIGNvbnRlbnQgdG8gbGF5b3V0XHJcblx0dGhpcy5jb250ZW50LiRlbGVtZW50LmFwcGVuZChcclxuXHRcdHRoaXMucHJvZ3Jlc3NCYXIuJGVsZW1lbnQsXHJcblx0XHQobmV3IE9PLnVpLkxhYmVsV2lkZ2V0KCB7XHJcblx0XHRcdGxhYmVsOiBcIkluaXRpYWxpc2luZzpcIixcclxuXHRcdFx0JGVsZW1lbnQ6ICQoXCI8c3Ryb25nIHN0eWxlPVxcXCJkaXNwbGF5OmJsb2NrXFxcIj5cIilcclxuXHRcdH0pKS4kZWxlbWVudCxcclxuXHRcdC4uLnRoaXMuc2V0dXB0YXNrcy5tYXAod2lkZ2V0ID0+IHdpZGdldC4kZWxlbWVudCksXHJcblx0XHR0aGlzLmNsb3NlQnV0dG9uLiRlbGVtZW50XHJcblx0KTtcclxuXHJcblx0Ly8gQXBwZW5kIGxheW91dCB0byBkaWFsb2dcclxuXHR0aGlzLiRib2R5LmFwcGVuZCggdGhpcy5jb250ZW50LiRlbGVtZW50ICk7XHJcblxyXG5cdC8vIENvbm5lY3QgZXZlbnRzIHRvIGhhbmRsZXJzXHJcblx0dGhpcy5jbG9zZUJ1dHRvbi5jb25uZWN0KCB0aGlzLCB7IFwiY2xpY2tcIjogXCJvbkNsb3NlQnV0dG9uQ2xpY2tcIiB9ICk7XHJcbn07XHJcblxyXG5Mb2FkRGlhbG9nLnByb3RvdHlwZS5vbkNsb3NlQnV0dG9uQ2xpY2sgPSBmdW5jdGlvbigpIHtcclxuXHQvLyBDbG9zZSB0aGlzIGRpYWxvZywgd2l0aG91dCBwYXNzaW5nIGFueSBkYXRhXHJcblx0dGhpcy5jbG9zZSgpO1xyXG59O1xyXG5cclxuLy8gT3ZlcnJpZGUgdGhlIGdldEJvZHlIZWlnaHQoKSBtZXRob2QgdG8gc3BlY2lmeSBhIGN1c3RvbSBoZWlnaHQgKG9yIGRvbid0IHRvIHVzZSB0aGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgaGVpZ2h0KS5cclxuTG9hZERpYWxvZy5wcm90b3R5cGUuZ2V0Qm9keUhlaWdodCA9IGZ1bmN0aW9uICgpIHtcclxuXHRyZXR1cm4gdGhpcy5jb250ZW50LiRlbGVtZW50Lm91dGVySGVpZ2h0KCB0cnVlICk7XHJcbn07XHJcblxyXG5Mb2FkRGlhbG9nLnByb3RvdHlwZS5pbmNyZW1lbnRQcm9ncmVzcyA9IGZ1bmN0aW9uKGFtb3VudCwgbWF4aW11bSkge1xyXG5cdHZhciBwcmlvclByb2dyZXNzID0gdGhpcy5wcm9ncmVzc0Jhci5nZXRQcm9ncmVzcygpO1xyXG5cdHZhciBpbmNyZW1lbnRlZFByb2dyZXNzID0gTWF0aC5taW4obWF4aW11bSB8fCAxMDAsIHByaW9yUHJvZ3Jlc3MgKyBhbW91bnQpO1xyXG5cdHRoaXMucHJvZ3Jlc3NCYXIuc2V0UHJvZ3Jlc3MoaW5jcmVtZW50ZWRQcm9ncmVzcyk7XHJcbn07XHJcblxyXG5Mb2FkRGlhbG9nLnByb3RvdHlwZS5hZGRUYXNrUHJvbWlzZUhhbmRsZXJzID0gZnVuY3Rpb24odGFza1Byb21pc2VzKSB7XHJcblx0dmFyIG9uVGFza0RvbmUgPSBpbmRleCA9PiB7XHJcblx0XHQvLyBBZGQgXCJEb25lIVwiIHRvIGxhYmVsXHJcblx0XHR2YXIgd2lkZ2V0ID0gdGhpcy5zZXR1cHRhc2tzW2luZGV4XTtcclxuXHRcdHdpZGdldC5zZXRMYWJlbCh3aWRnZXQuZ2V0TGFiZWwoKSArIFwiIERvbmUhXCIpO1xyXG5cdFx0Ly8gSW5jcmVtZW50IHN0YXR1cyBiYXIuIFNob3cgYSBzbW9vdGggdHJhbnNpdGlvbiBieVxyXG5cdFx0Ly8gdXNpbmcgc21hbGwgc3RlcHMgb3ZlciBhIHNob3J0IGR1cmF0aW9uLlxyXG5cdFx0dmFyIHRvdGFsSW5jcmVtZW50ID0gMTAwIC8gdGhpcy5zZXR1cHRhc2tzLmxlbmd0aDsgLy8gcGVyY2VudFxyXG5cdFx0dmFyIHRvdGFsVGltZSA9IDQwMDsgLy8gbWlsbGlzZWNvbmRzXHJcblx0XHR2YXIgdG90YWxTdGVwcyA9IDEwO1xyXG5cdFx0dmFyIGluY3JlbWVudFBlclN0ZXAgPSB0b3RhbEluY3JlbWVudCAvIHRvdGFsU3RlcHM7XHJcblxyXG5cdFx0Zm9yICggdmFyIHN0ZXA9MDsgc3RlcCA8IHRvdGFsU3RlcHM7IHN0ZXArKykge1xyXG5cdFx0XHR3aW5kb3cuc2V0VGltZW91dChcclxuXHRcdFx0XHR0aGlzLmluY3JlbWVudFByb2dyZXNzLmJpbmQodGhpcyksXHJcblx0XHRcdFx0dG90YWxUaW1lICogc3RlcCAvIHRvdGFsU3RlcHMsXHJcblx0XHRcdFx0aW5jcmVtZW50UGVyU3RlcFxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cdH07XHJcblx0dmFyIG9uVGFza0Vycm9yID0gKGluZGV4LCBjb2RlLCBpbmZvKSA9PiB7XHJcblx0XHR2YXIgd2lkZ2V0ID0gdGhpcy5zZXR1cHRhc2tzW2luZGV4XTtcclxuXHRcdHdpZGdldC5zZXRMYWJlbChcclxuXHRcdFx0d2lkZ2V0LmdldExhYmVsKCkgKyBcIiBGYWlsZWQuIFwiICsgbWFrZUVycm9yTXNnKGNvZGUsIGluZm8pXHJcblx0XHQpO1xyXG5cdFx0dGhpcy5jbG9zZUJ1dHRvbi50b2dnbGUodHJ1ZSk7XHJcblx0XHR0aGlzLnVwZGF0ZVNpemUoKTtcclxuXHR9O1xyXG5cdHRhc2tQcm9taXNlcy5mb3JFYWNoKGZ1bmN0aW9uKHByb21pc2UsIGluZGV4KSB7XHJcblx0XHRwcm9taXNlLnRoZW4oXHJcblx0XHRcdCgpID0+IG9uVGFza0RvbmUoaW5kZXgpLFxyXG5cdFx0XHQoY29kZSwgaW5mbykgPT4gb25UYXNrRXJyb3IoaW5kZXgsIGNvZGUsIGluZm8pXHJcblx0XHQpO1xyXG5cdH0pO1xyXG59O1xyXG5cclxuLy8gVXNlIGdldFNldHVwUHJvY2VzcygpIHRvIHNldCB1cCB0aGUgd2luZG93IHdpdGggZGF0YSBwYXNzZWQgdG8gaXQgYXQgdGhlIHRpbWUgXHJcbi8vIG9mIG9wZW5pbmdcclxuTG9hZERpYWxvZy5wcm90b3R5cGUuZ2V0U2V0dXBQcm9jZXNzID0gZnVuY3Rpb24gKCBkYXRhICkge1xyXG5cdGRhdGEgPSBkYXRhIHx8IHt9O1xyXG5cdHJldHVybiBMb2FkRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRTZXR1cFByb2Nlc3MuY2FsbCggdGhpcywgZGF0YSApXHJcblx0XHQubmV4dCggKCkgPT4ge1xyXG5cdFx0XHR2YXIgc2hvd09yZXNUYXNrID0gISFkYXRhLm9yZXM7XHJcblx0XHRcdHRoaXMuc2V0dXB0YXNrc1s2XS50b2dnbGUoc2hvd09yZXNUYXNrKTtcclxuXHRcdFx0dmFyIHRhc2tQcm9taXNlcyA9IGRhdGEub3JlcyA/IGRhdGEucHJvbWlzZXMgOiBkYXRhLnByb21pc2VzLnNsaWNlKDAsIC0xKTtcclxuXHRcdFx0ZGF0YS5pc09wZW5lZC50aGVuKCgpID0+IHRoaXMuYWRkVGFza1Byb21pc2VIYW5kbGVycyh0YXNrUHJvbWlzZXMpKTtcclxuXHRcdH0sIHRoaXMgKTtcclxufTtcclxuXHJcbi8vIFByZXZlbnQgd2luZG93IGZyb20gY2xvc2luZyB0b28gcXVpY2tseSwgdXNpbmcgZ2V0SG9sZFByb2Nlc3MoKVxyXG5Mb2FkRGlhbG9nLnByb3RvdHlwZS5nZXRIb2xkUHJvY2VzcyA9IGZ1bmN0aW9uICggZGF0YSApIHtcclxuXHRkYXRhID0gZGF0YSB8fCB7fTtcclxuXHRpZiAoZGF0YS5zdWNjZXNzKSB7XHJcblx0XHQvLyBXYWl0IGEgYml0IGJlZm9yZSBwcm9jZXNzaW5nIHRoZSBjbG9zZSwgd2hpY2ggaGFwcGVucyBhdXRvbWF0aWNhbGx5XHJcblx0XHRyZXR1cm4gTG9hZERpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0SG9sZFByb2Nlc3MuY2FsbCggdGhpcywgZGF0YSApXHJcblx0XHRcdC5uZXh0KDgwMCk7XHJcblx0fVxyXG5cdC8vIE5vIG5lZWQgdG8gd2FpdCBpZiBjbG9zZWQgbWFudWFsbHlcclxuXHRyZXR1cm4gTG9hZERpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0SG9sZFByb2Nlc3MuY2FsbCggdGhpcywgZGF0YSApO1xyXG59O1xyXG5cclxuLy8gVXNlIHRoZSBnZXRUZWFyZG93blByb2Nlc3MoKSBtZXRob2QgdG8gcGVyZm9ybSBhY3Rpb25zIHdoZW5ldmVyIHRoZSBkaWFsb2cgaXMgY2xvc2VkLiBcclxuTG9hZERpYWxvZy5wcm90b3R5cGUuZ2V0VGVhcmRvd25Qcm9jZXNzID0gZnVuY3Rpb24gKCBkYXRhICkge1xyXG5cdHJldHVybiBMb2FkRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRUZWFyZG93blByb2Nlc3MuY2FsbCggdGhpcywgZGF0YSApXHJcblx0XHQuZmlyc3QoICgpID0+IHtcclxuXHRcdC8vIFBlcmZvcm0gY2xlYW51cDogcmVzZXQgbGFiZWxzXHJcblx0XHRcdHRoaXMuc2V0dXB0YXNrcy5mb3JFYWNoKCBzZXR1cHRhc2sgPT4ge1xyXG5cdFx0XHRcdHZhciBjdXJyZW50TGFiZWwgPSBzZXR1cHRhc2suZ2V0TGFiZWwoKTtcclxuXHRcdFx0XHRzZXR1cHRhc2suc2V0TGFiZWwoXHJcblx0XHRcdFx0XHRjdXJyZW50TGFiZWwuc2xpY2UoMCwgY3VycmVudExhYmVsLmluZGV4T2YoXCIuLi5cIikrMylcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9ICk7XHJcblx0XHR9LCB0aGlzICk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBMb2FkRGlhbG9nO1xyXG4vLyA8L25vd2lraT4iLCJpbXBvcnQgQmFubmVyV2lkZ2V0IGZyb20gXCIuL0NvbXBvbmVudHMvQmFubmVyV2lkZ2V0XCI7XHJcbmltcG9ydCBCYW5uZXJMaXN0V2lkZ2V0IGZyb20gXCIuL0NvbXBvbmVudHMvQmFubmVyTGlzdFdpZGdldFwiO1xyXG5pbXBvcnQgYXBwQ29uZmlnIGZyb20gXCIuLi9jb25maWdcIjtcclxuaW1wb3J0IEFQSSwgeyBtYWtlRXJyb3JNc2cgfSBmcm9tIFwiLi4vYXBpXCI7XHJcbmltcG9ydCBQcmVmc0Zvcm1XaWRnZXQgZnJvbSBcIi4vQ29tcG9uZW50cy9QcmVmc0Zvcm1XaWRnZXRcIjtcclxuaW1wb3J0IHsgc2V0UHJlZnMgYXMgQXBpU2V0UHJlZnMgfSBmcm9tIFwiLi4vcHJlZnNcIjtcclxuaW1wb3J0IHsgcGFyc2VUZW1wbGF0ZXMgfSBmcm9tIFwiLi4vVGVtcGxhdGVcIjtcclxuaW1wb3J0IFRvcEJhcldpZGdldCBmcm9tIFwiLi9Db21wb25lbnRzL1RvcEJhcldpZGdldFwiO1xyXG5pbXBvcnQgeyBmaWx0ZXJBbmRNYXAsIHVuaXF1ZUFycmF5IH0gZnJvbSBcIi4uL3V0aWxcIjtcclxuaW1wb3J0ICogYXMgY2FjaGUgZnJvbSBcIi4uL2NhY2hlXCI7XHJcbi8vIDxub3dpa2k+XHJcblxyXG5mdW5jdGlvbiBNYWluV2luZG93KCBjb25maWcgKSB7XHJcblx0TWFpbldpbmRvdy5zdXBlci5jYWxsKCB0aGlzLCBjb25maWcgKTtcclxufVxyXG5PTy5pbmhlcml0Q2xhc3MoIE1haW5XaW5kb3csIE9PLnVpLlByb2Nlc3NEaWFsb2cgKTtcclxuXHJcbk1haW5XaW5kb3cuc3RhdGljLm5hbWUgPSBcIm1haW5cIjtcclxuTWFpbldpbmRvdy5zdGF0aWMudGl0bGUgPSAkKFwiPHNwYW4+XCIpLmNzcyh7XCJmb250LXdlaWdodFwiOlwibm9ybWFsXCJ9KS5hcHBlbmQoXHJcblx0JChcIjxhPlwiKS5jc3Moe1wiZm9udC13ZWlnaHRcIjogXCJib2xkXCJ9KS5hdHRyKHtcImhyZWZcIjogbXcudXRpbC5nZXRVcmwoXCJXUDpSQVRFUlwiKSwgXCJ0YXJnZXRcIjogXCJfYmxhbmtcIn0pLnRleHQoXCJSYXRlclwiKSxcclxuXHRcIiAoXCIsXHJcblx0JChcIjxhPlwiKS5hdHRyKHtcImhyZWZcIjogbXcudXRpbC5nZXRVcmwoXCJXVDpSQVRFUlwiKSwgXCJ0YXJnZXRcIjogXCJfYmxhbmtcIn0pLnRleHQoXCJ0YWxrXCIpLFxyXG5cdFwiKSBcIixcclxuXHQkKFwiPHNwYW4+XCIpLmNzcyh7XCJmb250LXNpemVcIjpcIjkwJVwifSkudGV4dChcInZcIithcHBDb25maWcuc2NyaXB0LnZlcnNpb24pXHJcbik7XHJcbk1haW5XaW5kb3cuc3RhdGljLnNpemUgPSBcImxhcmdlXCI7XHJcbk1haW5XaW5kb3cuc3RhdGljLmFjdGlvbnMgPSBbXHJcblx0Ly8gUHJpbWFyeSAodG9wIHJpZ2h0KTpcclxuXHR7XHJcblx0XHRsYWJlbDogXCJYXCIsIC8vIG5vdCB1c2luZyBhbiBpY29uIHNpbmNlIGNvbG9yIGJlY29tZXMgaW52ZXJ0ZWQsIGkuZS4gd2hpdGUgb24gbGlnaHQtZ3JleVxyXG5cdFx0dGl0bGU6IFwiQ2xvc2UgKGFuZCBkaXNjYXJkIGFueSBjaGFuZ2VzKVwiLFxyXG5cdFx0ZmxhZ3M6IFwicHJpbWFyeVwiLFxyXG5cdFx0bW9kZXM6IFtcImVkaXRcIiwgXCJkaWZmXCIsIFwicHJldmlld1wiXSAvLyBhdmFpbGFibGUgd2hlbiBjdXJyZW50IG1vZGUgaXNuJ3QgXCJwcmVmc1wiXHJcblx0fSxcclxuXHQvLyBTYWZlICh0b3AgbGVmdClcclxuXHR7XHJcblx0XHRhY3Rpb246IFwic2hvd1ByZWZzXCIsXHJcblx0XHRmbGFnczogXCJzYWZlXCIsXHJcblx0XHRpY29uOiBcInNldHRpbmdzXCIsXHJcblx0XHR0aXRsZTogXCJQcmVmZXJlbmNlc1wiLFxyXG5cdFx0bW9kZXM6IFtcImVkaXRcIiwgXCJkaWZmXCIsIFwicHJldmlld1wiXSAvLyBhdmFpbGFibGUgd2hlbiBjdXJyZW50IG1vZGUgaXNuJ3QgXCJwcmVmc1wiXHJcblx0fSxcclxuXHQvLyBPdGhlcnMgKGJvdHRvbSlcclxuXHR7XHJcblx0XHRhY3Rpb246IFwic2F2ZVwiLFxyXG5cdFx0YWNjZXNzS2V5OiBcInNcIixcclxuXHRcdGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXCI8c3BhbiBzdHlsZT0ncGFkZGluZzowIDFlbTsnPlNhdmU8L3NwYW4+XCIpLFxyXG5cdFx0ZmxhZ3M6IFtcInByaW1hcnlcIiwgXCJwcm9ncmVzc2l2ZVwiXSxcclxuXHRcdG1vZGVzOiBbXCJlZGl0XCIsIFwiZGlmZlwiLCBcInByZXZpZXdcIl0gLy8gYXZhaWxhYmxlIHdoZW4gY3VycmVudCBtb2RlIGlzbid0IFwicHJlZnNcIlxyXG5cdH0sXHJcblx0e1xyXG5cdFx0YWN0aW9uOiBcInByZXZpZXdcIixcclxuXHRcdGFjY2Vzc0tleTogXCJwXCIsXHJcblx0XHRsYWJlbDogXCJTaG93IHByZXZpZXdcIixcclxuXHRcdG1vZGVzOiBbXCJlZGl0XCIsIFwiZGlmZlwiXSAvLyBhdmFpbGFibGUgd2hlbiBjdXJyZW50IG1vZGUgaXNuJ3QgXCJwcmV2aWV3XCIgb3IgXCJwcmVmc1wiXHJcblx0fSxcclxuXHR7XHJcblx0XHRhY3Rpb246IFwiY2hhbmdlc1wiLFxyXG5cdFx0YWNjZXNzS2V5OiBcInZcIixcclxuXHRcdGxhYmVsOiBcIlNob3cgY2hhbmdlc1wiLFxyXG5cdFx0bW9kZXM6IFtcImVkaXRcIiwgXCJwcmV2aWV3XCJdIC8vIGF2YWlsYWJsZSB3aGVuIGN1cnJlbnQgbW9kZSBpc24ndCBcImRpZmZcIiBvciBcInByZWZzXCJcclxuXHR9LFxyXG5cdHtcclxuXHRcdGFjdGlvbjogXCJiYWNrXCIsXHJcblx0XHRsYWJlbDogXCJCYWNrXCIsXHJcblx0XHRtb2RlczogW1wiZGlmZlwiLCBcInByZXZpZXdcIl0gLy8gYXZhaWxhYmxlIHdoZW4gY3VycmVudCBtb2RlIGlzIFwiZGlmZlwiIG9yIFwicHJlZnNcIlxyXG5cdH0sXHJcblx0XHJcblx0Ly8gXCJwcmVmc1wiIG1vZGUgb25seVxyXG5cdHtcclxuXHRcdGFjdGlvbjogXCJzYXZlUHJlZnNcIixcclxuXHRcdGxhYmVsOiBcIlVwZGF0ZVwiLFxyXG5cdFx0ZmxhZ3M6IFtcInByaW1hcnlcIiwgXCJwcm9ncmVzc2l2ZVwiXSxcclxuXHRcdG1vZGVzOiBcInByZWZzXCIgXHJcblx0fSxcclxuXHR7XHJcblx0XHRhY3Rpb246IFwiY2xvc2VQcmVmc1wiLFxyXG5cdFx0bGFiZWw6IFwiQ2FuY2VsXCIsXHJcblx0XHRmbGFnczogXCJzYWZlXCIsXHJcblx0XHRtb2RlczogXCJwcmVmc1wiXHJcblx0fVxyXG5dO1xyXG5cclxuLy8gQ3VzdG9taXplIHRoZSBpbml0aWFsaXplKCkgZnVuY3Rpb246IFRoaXMgaXMgd2hlcmUgdG8gYWRkIGNvbnRlbnQgdG8gdGhlIGRpYWxvZyBib2R5IGFuZCBzZXQgdXAgZXZlbnQgaGFuZGxlcnMuXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbiAoKSB7XHJcblx0Ly8gQ2FsbCB0aGUgcGFyZW50IG1ldGhvZC5cclxuXHRNYWluV2luZG93LnN1cGVyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwoIHRoaXMgKTtcclxuXHJcblx0LyogLS0tIFBSRUZTIC0tLSAqL1xyXG5cdHRoaXMucHJlZmVyZW5jZXMgPSBhcHBDb25maWcuZGVmYXVsdFByZWZzO1xyXG5cdFxyXG5cdC8qIC0tLSBUT1AgQkFSIC0tLSAqL1xyXG5cdHRoaXMudG9wQmFyID0gbmV3IFRvcEJhcldpZGdldCh7XHJcblx0XHQkb3ZlcmxheTogdGhpcy4kb3ZlcmxheVxyXG5cdH0gKTtcclxuXHR0aGlzLiRoZWFkLmNzcyh7XCJoZWlnaHRcIjpcIjczcHhcIn0pLmFwcGVuZCh0aGlzLnRvcEJhci4kZWxlbWVudCk7XHJcblxyXG5cdC8qIC0tLSBGT09URVIgLS0tICovXHJcblx0dGhpcy5vcmVzTGFiZWwgPSBuZXcgT08udWkuTGFiZWxXaWRnZXQoe1xyXG5cdFx0JGVsZW1lbnQ6ICQoXCI8c3BhbiBzdHlsZT0nZmxvYXQ6cmlnaHQ7IHBhZGRpbmc6IDEwcHg7IG1heC13aWR0aDogNTAlOyB0ZXh0LWFsaWduOiBjZW50ZXI7Jz5cIiksXHJcblx0XHRsYWJlbDogJChcIjxzcGFuPlwiKS5hcHBlbmQoXHJcblx0XHRcdCQoXCI8YT5cIilcclxuXHRcdFx0XHQuYXR0cih7XCJocmVmXCI6bXcudXRpbC5nZXRVcmwoXCJtdzpPUkVTXCIpLCBcInRhcmdldFwiOlwiX2JsYW5rXCJ9KVxyXG5cdFx0XHRcdC5hcHBlbmQoXHJcblx0XHRcdFx0XHQkKFwiPGltZz5cIilcclxuXHRcdFx0XHRcdFx0LmNzcyh7XCJ2ZXJ0aWNhbC1hbGlnblwiOiBcInRleHQtYm90dG9tO1wifSlcclxuXHRcdFx0XHRcdFx0LmF0dHIoe1xyXG5cdFx0XHRcdFx0XHRcdFwic3JjXCI6IFwiLy91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy90aHVtYi81LzUxL09iamVjdGl2ZV9SZXZpc2lvbl9FdmFsdWF0aW9uX1NlcnZpY2VfbG9nby5zdmcvNDBweC1PYmplY3RpdmVfUmV2aXNpb25fRXZhbHVhdGlvbl9TZXJ2aWNlX2xvZ28uc3ZnLnBuZ1wiLFxyXG5cdFx0XHRcdFx0XHRcdFwidGl0bGVcIjogXCJNYWNoaW5lIHByZWRpY3RlZCBxdWFsaXR5IGZyb20gT1JFU1wiLFxyXG5cdFx0XHRcdFx0XHRcdFwiYWx0XCI6IFwiT1JFUyBsb2dvXCIsXHJcblx0XHRcdFx0XHRcdFx0XCJ3aWR0aFwiOiBcIjIwcHhcIixcclxuXHRcdFx0XHRcdFx0XHRcImhlaWdodFwiOiBcIjIwcHhcIlxyXG5cdFx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdCksXHJcblx0XHRcdFwiIFwiLFxyXG5cdFx0XHQkKFwiPHNwYW4gY2xhc3M9J29yZXNQcmVkaWN0aW9uJz5cIilcclxuXHRcdClcclxuXHR9KS50b2dnbGUoZmFsc2UpO1xyXG5cdHRoaXMucGFnZXR5cGVMYWJlbCA9IG5ldyBPTy51aS5MYWJlbFdpZGdldCh7XHJcblx0XHQkZWxlbWVudDogJChcIjxzcGFuIHN0eWxlPSdmbG9hdDpyaWdodDsgcGFkZGluZzogMTBweDsgbWF4LXdpZHRoOiAzMy4zMyU7IHRleHQtYWxpZ246IGNlbnRlcjsnPlwiKVxyXG5cdH0pLnRvZ2dsZShmYWxzZSk7XHJcblx0dGhpcy4kZm9vdC5wcmVwZW5kKHRoaXMub3Jlc0xhYmVsLiRlbGVtZW50LCB0aGlzLnBhZ2V0eXBlTGFiZWwuJGVsZW1lbnQpO1xyXG5cclxuXHQvKiAtLS0gQ09OVEVOVCBBUkVBIC0tLSAqL1xyXG5cclxuXHQvLyBCYW5uZXJzIGFkZGVkIGR5bmFtaWNhbGx5IHVwb24gb3BlbmluZywgc28ganVzdCBuZWVkIGEgbGF5b3V0IHdpdGggYW4gZW1wdHkgbGlzdFxyXG5cdHRoaXMuYmFubmVyTGlzdCA9IG5ldyBCYW5uZXJMaXN0V2lkZ2V0KHtcclxuXHRcdHByZWZlcmVuY2VzOiB0aGlzLnByZWZlcmVuY2VzXHJcblx0fSk7XHJcblx0dGhpcy5lZGl0TGF5b3V0ID0gbmV3IE9PLnVpLlBhbmVsTGF5b3V0KCB7XHJcblx0XHRwYWRkZWQ6IGZhbHNlLFxyXG5cdFx0ZXhwYW5kZWQ6IGZhbHNlLFxyXG5cdFx0JGNvbnRlbnQ6IHRoaXMuYmFubmVyTGlzdC4kZWxlbWVudFxyXG5cdH0gKTtcclxuXHJcblx0Ly8gUHJlZmVyZW5jZXMsIGZpbGxlZCBpbiB3aXRoIGN1cnJlbnQgcHJlZnMgdXBvbiBsb2FkaW5nLlxyXG5cdC8vIFRPRE86IE1ha2UgdGhpcyBpbnRvIGEgY29tcG9uZW50LCBhZGQgZmllbGRzIGFuZCBpbnB1dHNcclxuXHR0aGlzLnByZWZzRm9ybSA9IG5ldyBQcmVmc0Zvcm1XaWRnZXQoKTtcclxuXHR0aGlzLnByZWZzTGF5b3V0ID0gbmV3IE9PLnVpLlBhbmVsTGF5b3V0KCB7XHJcblx0XHRwYWRkZWQ6IHRydWUsXHJcblx0XHRleHBhbmRlZDogZmFsc2UsXHJcblx0XHQkY29udGVudDogdGhpcy5wcmVmc0Zvcm0uJGVsZW1lbnRcclxuXHR9ICk7XHJcblxyXG5cdC8vIFByZXZpZXcsIFNob3cgY2hhbmdlc1xyXG5cdHRoaXMucGFyc2VkQ29udGVudENvbnRhaW5lciA9IG5ldyBPTy51aS5GaWVsZHNldExheW91dCgge1xyXG5cdFx0bGFiZWw6IFwiUHJldmlld1wiXHJcblx0fSApO1xyXG5cdHRoaXMucGFyc2VkQ29udGVudFdpZGdldCA9IG5ldyBPTy51aS5MYWJlbFdpZGdldCgge2xhYmVsOiBcIlwiLFx0JGVsZW1lbnQ6JChcIjxkaXY+XCIpXHR9KTtcclxuXHR0aGlzLnBhcnNlZENvbnRlbnRDb250YWluZXIuYWRkSXRlbXMoW1xyXG5cdFx0bmV3IE9PLnVpLkZpZWxkTGF5b3V0KFxyXG5cdFx0XHR0aGlzLnBhcnNlZENvbnRlbnRXaWRnZXQsXHRcdFx0XHJcblx0XHRcdHsgYWxpZ246IFwidG9wXCIgfVxyXG5cdFx0KVxyXG5cdF0pO1xyXG5cdHRoaXMucGFyc2VkQ29udGVudExheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCgge1xyXG5cdFx0cGFkZGVkOiB0cnVlLFxyXG5cdFx0ZXhwYW5kZWQ6IGZhbHNlLFxyXG5cdFx0JGNvbnRlbnQ6IHRoaXMucGFyc2VkQ29udGVudENvbnRhaW5lci4kZWxlbWVudFxyXG5cdH0gKTtcclxuXHJcblx0dGhpcy5jb250ZW50QXJlYSA9IG5ldyBPTy51aS5TdGFja0xheW91dCgge1xyXG5cdFx0aXRlbXM6IFtcclxuXHRcdFx0dGhpcy5lZGl0TGF5b3V0LFxyXG5cdFx0XHR0aGlzLnByZWZzTGF5b3V0LFxyXG5cdFx0XHR0aGlzLnBhcnNlZENvbnRlbnRMYXlvdXRcclxuXHRcdF0sXHJcblx0XHRwYWRkZWQ6IGZhbHNlLFxyXG5cdFx0ZXhwYW5kZWQ6IGZhbHNlXHJcblx0fSApO1xyXG5cclxuXHR0aGlzLiRib2R5LmNzcyh7XCJ0b3BcIjpcIjczcHhcIn0pLmFwcGVuZCh0aGlzLmNvbnRlbnRBcmVhLiRlbGVtZW50KTtcclxuXHJcblx0LyogLS0tIEVWRU5UIEhBTkRMSU5HIC0tLSAqL1xyXG5cclxuXHR0aGlzLnRvcEJhci5jb25uZWN0KHRoaXMsIHtcclxuXHRcdFwic2VhcmNoU2VsZWN0XCI6IFwib25TZWFyY2hTZWxlY3RcIixcclxuXHRcdFwic2V0Q2xhc3Nlc1wiOiBcIm9uU2V0Q2xhc3Nlc1wiLFxyXG5cdFx0XCJzZXRJbXBvcnRhbmNlc1wiOiBcIm9uU2V0SW1wb3J0YW5jZXNcIixcclxuXHRcdFwicmVtb3ZlQWxsXCI6IFwib25SZW1vdmVBbGxcIixcclxuXHRcdFwiY2xlYXJBbGxcIjogXCJvbkNsZWFyQWxsXCJcclxuXHR9KTtcclxuXHR0aGlzLmJhbm5lckxpc3QuY29ubmVjdCh0aGlzLCB7XCJ1cGRhdGVkU2l6ZVwiOiBcIm9uQmFubmVyTGlzdFVwZGF0ZVNpemVcIn0pO1xyXG5cclxuXHQvLyBIYW5kbGUgY2VydGFpbiBrZXlib2FyZCBldmVudHMuIFJlcXVpcmVzIHNvbWV0aGluZyBpbiB0aGUgUmF0ZXIgd2luZG93IHRvIGJlIGZvY3VzZWQsXHJcblx0Ly8gc28gYWRkIGEgdGFiaW5kZXggdG8gdGhlIGJvZHkgYW5kIGl0J3MgcGFyZW50IGNvbnRhaW5lci5cclxuXHR0aGlzLiRib2R5LmF0dHIoXCJ0YWJpbmRleFwiLCBcIjk5OVwiKVxyXG5cdFx0LnBhcmVudCgpLmF0dHIoXCJ0YWJpbmRleFwiLCBcIjk5OVwiKS5rZXlkb3duKGZ1bmN0aW9uKCBldmVudCApIHtcclxuXHRcdFx0bGV0IHNjcm9sbEFtb3VudDtcclxuXHRcdFx0c3dpdGNoKGV2ZW50LndoaWNoKSB7XHJcblx0XHRcdGNhc2UgMzM6IC8vIHBhZ2UgdXBcclxuXHRcdFx0XHRzY3JvbGxBbW91bnQgPSB0aGlzLiRib2R5LnNjcm9sbFRvcCgpIC0gdGhpcy4kYm9keS5oZWlnaHQoKSowLjk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgMzQ6IC8vIHBhZ2UgZG93blxyXG5cdFx0XHRcdHNjcm9sbEFtb3VudCA9IHRoaXMuJGJvZHkuc2Nyb2xsVG9wKCkgKyB0aGlzLiRib2R5LmhlaWdodCgpKjAuOTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy4kYm9keS5zY3JvbGxUb3Aoc2Nyb2xsQW1vdW50KTtcclxuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdH0uYmluZCh0aGlzKSk7XHJcblxyXG5cdHRoaXMucHJlZnNGb3JtLmNvbm5lY3QodGhpcywge1wicmVzZXRDYWNoZVwiOiBcIm9uUmVzZXRDYWNoZVwifSk7XHJcblx0XHJcbn07XHJcblxyXG5NYWluV2luZG93LnByb3RvdHlwZS5vbkJhbm5lckxpc3RVcGRhdGVTaXplID0gZnVuY3Rpb24oKSB7XHJcblx0Ly8gR2V0IHRoZSBjdXJyZW50IHNjcm9sbCBhbW91bnRcclxuXHRjb25zdCBzY3JvbGxBbW91bnQgPSB0aGlzLiRib2R5LnNjcm9sbFRvcCgpO1xyXG5cdC8vIFVwZGF0ZSBzaXplICh3aGljaCByZXNldHMgdGhlIHNjcm9sbCB0byAwKVxyXG5cdHRoaXMudXBkYXRlU2l6ZSgpO1xyXG5cdC8vIFNjcm9sbCB0byB3aGVyZSBpdCB3YXMgYmVmb3JlXHJcblx0dGhpcy4kYm9keS5zY3JvbGxUb3Aoc2Nyb2xsQW1vdW50KTtcclxufTtcclxuXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLm1ha2VEcmFnZ2FibGUgPSBmdW5jdGlvbigpIHtcclxuXHRsZXQgJGZyYW1lRWwgPSB0aGlzLiRlbGVtZW50LmZpbmQoXCIub28tdWktd2luZG93LWZyYW1lXCIpO1xyXG5cdGxldCAkaGFuZGxlRWwgPSB0aGlzLiRlbGVtZW50LmZpbmQoXCIub28tdWktcHJvY2Vzc0RpYWxvZy1sb2NhdGlvblwiKS5jc3Moe1wiY3Vyc29yXCI6XCJtb3ZlXCJ9KTtcclxuXHQvLyBQb3NpdGlvbiBmb3IgY3NzIHRyYW5zbGF0ZSB0cmFuc2Zvcm1hdGlvbnMsIHJlbGF0aXZlIHRvIGluaXRpYWwgcG9zaXRpb25cclxuXHQvLyAod2hpY2ggaXMgY2VudGVyZWQgb24gdmlld3BvcnQgd2hlbiBzY3JvbGxlZCB0byB0b3ApXHJcblx0bGV0IHBvc2l0aW9uID0geyB4OiAwLCB5OiAwIH07XHJcblx0Y29uc3QgY29uc3RyYWluID0gZnVuY3Rpb24odmFsLCBtaW5WYWwsIG1heFZhbCkge1xyXG5cdFx0aWYgKHZhbCA8IG1pblZhbCkgcmV0dXJuIG1pblZhbDtcclxuXHRcdGlmICh2YWwgPiBtYXhWYWwpIHJldHVybiBtYXhWYWw7XHJcblx0XHRyZXR1cm4gdmFsO1xyXG5cdH07XHJcblx0Y29uc3QgY29uc3RyYWluWCA9ICh2YWwpID0+IHtcclxuXHRcdC8vIERvbid0IHRvbyBmYXIgaG9yaXpvbnRhbGx5IChsZWF2ZSBhdCBsZWFzdCAxMDBweCB2aXNpYmxlKVxyXG5cdFx0bGV0IGxpbWl0ID0gd2luZG93LmlubmVyV2lkdGgvMiArICRmcmFtZUVsLm91dGVyV2lkdGgoKS8yIC0gMTAwO1xyXG5cdFx0cmV0dXJuIGNvbnN0cmFpbih2YWwsIC0xKmxpbWl0LCBsaW1pdCk7XHJcblx0fTtcclxuXHRjb25zdCBjb25zdHJhaW5ZID0gKHZhbCkgPT4ge1xyXG5cdFx0Ly8gQ2FuJ3QgdGFrZSB0aXRsZSBiYXIgb2ZmIHRoZSB2aWV3cG9ydCwgc2luY2UgaXQncyB0aGUgZHJhZyBoYW5kbGVcclxuXHRcdGxldCBtaW5MaW1pdCA9IC0xKih3aW5kb3cuaW5uZXJIZWlnaHQgLSAkZnJhbWVFbC5vdXRlckhlaWdodCgpKS8yO1xyXG5cdFx0Ly8gRG9uJ3QgZ28gdG9vIGZhciBkb3duIHRoZSBwYWdlOiAod2hvbGUgcGFnZSBoZWlnaHQpIC0gKGluaXRpYWwgcG9zaXRpb24pXHJcblx0XHRsZXQgbWF4TGltaXQgPSAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudCkuc2Nyb2xsSGVpZ2h0IC0gd2luZG93LmlubmVySGVpZ2h0LzI7XHJcblx0XHRyZXR1cm4gY29uc3RyYWluKHZhbCwgbWluTGltaXQsIG1heExpbWl0KTtcclxuXHR9O1xyXG5cclxuXHRsZXQgcG9pbnRlcmRvd24gPSBmYWxzZTtcclxuXHRsZXQgZHJhZ0Zyb20gPSB7fTtcclxuXHJcblx0bGV0IG9uRHJhZ1N0YXJ0ID0gZXZlbnQgPT4ge1xyXG5cdFx0cG9pbnRlcmRvd24gPSB0cnVlO1xyXG5cdFx0ZHJhZ0Zyb20ueCA9IGV2ZW50LmNsaWVudFg7XHJcblx0XHRkcmFnRnJvbS55ID0gZXZlbnQuY2xpZW50WTtcclxuXHR9O1xyXG5cdGxldCBvbkRyYWdNb3ZlID0gZXZlbnQgPT4ge1xyXG5cdFx0aWYgKCFwb2ludGVyZG93biB8fCBkcmFnRnJvbS54ID09IG51bGwgfHwgZHJhZ0Zyb20ueSA9PT0gbnVsbCkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRjb25zdCBkeCA9IGV2ZW50LmNsaWVudFggLSBkcmFnRnJvbS54O1xyXG5cdFx0Y29uc3QgZHkgPSBldmVudC5jbGllbnRZIC0gZHJhZ0Zyb20ueTtcclxuXHRcdGRyYWdGcm9tLnggPSBldmVudC5jbGllbnRYO1xyXG5cdFx0ZHJhZ0Zyb20ueSA9IGV2ZW50LmNsaWVudFk7XHJcblx0XHRwb3NpdGlvbi54ID0gY29uc3RyYWluWChwb3NpdGlvbi54ICsgZHgpO1xyXG5cdFx0cG9zaXRpb24ueSA9IGNvbnN0cmFpblkocG9zaXRpb24ueSArIGR5KTtcclxuXHRcdCRmcmFtZUVsLmNzcyhcInRyYW5zZm9ybVwiLCBgdHJhbnNsYXRlKCR7cG9zaXRpb24ueH1weCwgJHtwb3NpdGlvbi55fXB4KWApO1xyXG5cdH07XHJcblx0bGV0IG9uRHJhZ0VuZCA9ICgpID0+IHtcclxuXHRcdHBvaW50ZXJkb3duID0gZmFsc2U7XHJcblx0XHRkZWxldGUgZHJhZ0Zyb20ueDtcclxuXHRcdGRlbGV0ZSBkcmFnRnJvbS55O1xyXG5cdFx0Ly8gTWFrZSBzdXJlIGZpbmFsIHBvc2l0aW9ucyBhcmUgd2hvbGUgbnVtYmVyc1xyXG5cdFx0cG9zaXRpb24ueCA9IE1hdGgucm91bmQocG9zaXRpb24ueCk7XHJcblx0XHRwb3NpdGlvbi55ID0gTWF0aC5yb3VuZChwb3NpdGlvbi55KTtcclxuXHRcdCRmcmFtZUVsLmNzcyhcInRyYW5zZm9ybVwiLCBgdHJhbnNsYXRlKCR7cG9zaXRpb24ueH1weCwgJHtwb3NpdGlvbi55fXB4KWApO1xyXG5cdH07XHJcblxyXG5cdC8vIFVzZSBwb2ludGVyIGV2ZW50cyBpZiBhdmFpbGFibGU7IG90aGVyd2lzZSB1c2UgbW91c2UgZXZlbnRzXHJcblx0Y29uc3QgcG9pbnRlciA9IChcIlBvaW50ZXJFdmVudFwiIGluIHdpbmRvdykgPyBcInBvaW50ZXJcIiA6IFwibW91c2VcIjtcclxuXHQkaGFuZGxlRWwub24ocG9pbnRlcitcImVudGVyLnJhdGVyTWFpbldpblwiLCAoKSA9PiAkZnJhbWVFbC5jc3MoXCJ3aWxsLWNoYW5nZVwiLCBcInRyYW5zZm9ybVwiKSApOyAvLyBUZWxsIGJyb3dzZXIgdG8gb3B0aW1pc2UgdHJhbnNmb3JtXHJcblx0JGhhbmRsZUVsLm9uKHBvaW50ZXIrXCJsZWF2ZS5yYXRlck1haW5XaW5cIiwgKCkgPT4geyBpZiAoIXBvaW50ZXJkb3duKSAkZnJhbWVFbC5jc3MoXCJ3aWxsLWNoYW5nZVwiLCBcIlwiKTsgfSApOyAvLyBSZW1vdmUgb3B0aW1pc2F0aW9uIGlmIG5vdCBkcmFnZ2luZ1xyXG5cdCRoYW5kbGVFbC5vbihwb2ludGVyK1wiZG93bi5yYXRlck1haW5XaW5cIiwgb25EcmFnU3RhcnQpO1xyXG5cdCQoXCJib2R5XCIpLm9uKHBvaW50ZXIrXCJtb3ZlLnJhdGVyTWFpbldpblwiLCBvbkRyYWdNb3ZlKTtcclxuXHQkKFwiYm9keVwiKS5vbihwb2ludGVyK1widXAucmF0ZXJNYWluV2luXCIsIG9uRHJhZ0VuZCk7XHJcbn07XHJcblxyXG4vLyBPdmVycmlkZSB0aGUgZ2V0Qm9keUhlaWdodCgpIG1ldGhvZCB0byBzcGVjaWZ5IGEgY3VzdG9tIGhlaWdodFxyXG5NYWluV2luZG93LnByb3RvdHlwZS5nZXRCb2R5SGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xyXG5cdHZhciBjdXJyZW50bGF5b3V0ID0gdGhpcy5jb250ZW50QXJlYS5nZXRDdXJyZW50SXRlbSgpO1xyXG5cdHZhciBsYXlvdXRIZWlnaHQgPSBjdXJyZW50bGF5b3V0ICYmIGN1cnJlbnRsYXlvdXQuJGVsZW1lbnQub3V0ZXJIZWlnaHQodHJ1ZSk7XHJcblx0dmFyIGNvbnRlbnRIZWlnaHQgPSBjdXJyZW50bGF5b3V0ICYmIGN1cnJlbnRsYXlvdXQuJGVsZW1lbnQuY2hpbGRyZW4oXCI6Zmlyc3QtY2hpbGRcIikub3V0ZXJIZWlnaHQodHJ1ZSk7XHJcblx0cmV0dXJuIE1hdGgubWF4KDIwMCwgbGF5b3V0SGVpZ2h0LCBjb250ZW50SGVpZ2h0KTtcclxufTtcclxuXHJcbi8vIFVzZSBnZXRTZXR1cFByb2Nlc3MoKSB0byBzZXQgdXAgdGhlIHdpbmRvdyB3aXRoIGRhdGEgcGFzc2VkIHRvIGl0IGF0IHRoZSB0aW1lIFxyXG4vLyBvZiBvcGVuaW5nXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLmdldFNldHVwUHJvY2VzcyA9IGZ1bmN0aW9uICggZGF0YSApIHtcclxuXHRkYXRhID0gZGF0YSB8fCB7fTtcclxuXHRyZXR1cm4gTWFpbldpbmRvdy5zdXBlci5wcm90b3R5cGUuZ2V0U2V0dXBQcm9jZXNzLmNhbGwoIHRoaXMsIGRhdGEgKVxyXG5cdFx0Lm5leHQoICgpID0+IHtcclxuXHRcdFx0dGhpcy5tYWtlRHJhZ2dhYmxlKCk7XHJcblx0XHRcdC8vIFNldCB1cCBwcmVmZXJlbmNlc1xyXG5cdFx0XHR0aGlzLnNldFByZWZlcmVuY2VzKGRhdGEucHJlZmVyZW5jZXMpO1xyXG5cdFx0XHR0aGlzLnByZWZzRm9ybS5zZXRQcmVmVmFsdWVzKGRhdGEucHJlZmVyZW5jZXMpO1xyXG5cdFx0XHQvLyBTZXQgc3ViamVjdCBwYWdlIGluZm9cclxuXHRcdFx0dGhpcy5zdWJqZWN0UGFnZSA9IGRhdGEuc3ViamVjdFBhZ2U7XHJcblx0XHRcdHRoaXMucGFnZUluZm8gPSB7XHJcblx0XHRcdFx0cmVkaXJlY3Q6IGRhdGEucmVkaXJlY3RUYXJnZXQsXHJcblx0XHRcdFx0aXNEaXNhbWJpZzogZGF0YS5kaXNhbWJpZyxcclxuXHRcdFx0XHRoYXNTdHVidGFnOiBkYXRhLnN0dWJ0YWcsXHJcblx0XHRcdFx0aXNBcnRpY2xlOiBkYXRhLmlzQXJ0aWNsZVxyXG5cdFx0XHR9O1xyXG5cdFx0XHQvLyBTZXQgdXAgZWRpdCBtb2RlIGJhbm5lcnNcclxuXHRcdFx0dGhpcy5hY3Rpb25zLnNldE1vZGUoXCJlZGl0XCIpO1xyXG5cdFx0XHR0aGlzLmJhbm5lckxpc3Qub3Jlc0NsYXNzID0gKGRhdGEuaXNBcnRpY2xlICYmIGRhdGEuaXNMaXN0KVxyXG5cdFx0XHRcdD8gXCJMaXN0XCJcclxuXHRcdFx0XHQ6IGRhdGEub3JlcyAmJiBkYXRhLm9yZXMucHJlZGljdGlvbjtcclxuXHRcdFx0dGhpcy5iYW5uZXJMaXN0LnBhZ2VJbmZvID0gdGhpcy5wYWdlSW5mbztcclxuXHRcdFx0dGhpcy5iYW5uZXJMaXN0LmFkZEl0ZW1zKFxyXG5cdFx0XHRcdGRhdGEuYmFubmVycy5tYXAoIGJhbm5lclRlbXBsYXRlID0+IG5ldyBCYW5uZXJXaWRnZXQoXHJcblx0XHRcdFx0XHRiYW5uZXJUZW1wbGF0ZSxcclxuXHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0cHJlZmVyZW5jZXM6IHRoaXMucHJlZmVyZW5jZXMsXHJcblx0XHRcdFx0XHRcdCRvdmVybGF5OiB0aGlzLiRvdmVybGF5LFxyXG5cdFx0XHRcdFx0XHRpc0FydGljbGU6IHRoaXMucGFnZUluZm8uaXNBcnRpY2xlXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0KSApXHJcblx0XHRcdCk7XHJcblx0XHRcdGxldCBzaGVsbFRlbXBsYXRlQmFubmVyID0gdGhpcy5iYW5uZXJMaXN0Lml0ZW1zLmZpbmQoYmFubmVyID0+IGJhbm5lci5pc1NoZWxsVGVtcGxhdGUpO1xyXG5cdFx0XHRpZiAoc2hlbGxUZW1wbGF0ZUJhbm5lciAmJiBzaGVsbFRlbXBsYXRlQmFubmVyLnNoZWxsUGFyYW0xVmFsdWUpIHtcclxuXHRcdFx0XHRzaGVsbFRlbXBsYXRlQmFubmVyLm5vblN0YW5kYXJkVGVtcGxhdGVzID0gdGhpcy5iYW5uZXJMaXN0Lml0ZW1zLnJlZHVjZShcclxuXHRcdFx0XHRcdChiYW5uZXJzTGlzdCwgY3VyQmFubmVyKSA9PiBiYW5uZXJzTGlzdC5yZXBsYWNlKGN1ckJhbm5lci53aWtpdGV4dCwgXCJcIiksXHJcblx0XHRcdFx0XHRzaGVsbFRlbXBsYXRlQmFubmVyLnNoZWxsUGFyYW0xVmFsdWVcclxuXHRcdFx0XHQpLnRyaW0oKS5yZXBsYWNlKC9cXG4rL2csIFwiXFxuXCIpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMuYmFubmVyTGlzdC5hZGRTaGVsbFRlbXBsYXRlSWZOZWVlZGVkKClcclxuXHRcdFx0XHQuc3luY1NoZWxsVGVtcGxhdGVXaXRoQmlvZ3JhcGh5QmFubmVyKCk7XHJcblx0XHRcdC8vIFNob3cgcGFnZSB0eXBlLCBvciBPUkVTIHByZWRpY3Rpb24sIGlmIGF2YWlsYWJsZVxyXG5cdFx0XHRpZiAodGhpcy5wYWdlSW5mby5yZWRpcmVjdCkge1xyXG5cdFx0XHRcdHRoaXMucGFnZXR5cGVMYWJlbC5zZXRMYWJlbChcIlJlZGlyZWN0IHBhZ2VcIikudG9nZ2xlKHRydWUpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMucGFnZUluZm8uaXNEaXNhbWJpZykge1xyXG5cdFx0XHRcdHRoaXMucGFnZXR5cGVMYWJlbC5zZXRMYWJlbChcIkRpc2FtYmlndWF0aW9uIHBhZ2VcIikudG9nZ2xlKHRydWUpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMucGFnZUluZm8uaXNBcnRpY2xlICYmIGRhdGEuaXNHQSkge1xyXG5cdFx0XHRcdHRoaXMucGFnZXR5cGVMYWJlbC5zZXRMYWJlbChcIkdvb2QgYXJ0aWNsZVwiKS50b2dnbGUodHJ1ZSk7XHJcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5wYWdlSW5mby5pc0FydGljbGUgJiYgZGF0YS5pc0ZBKSB7XHJcblx0XHRcdFx0dGhpcy5wYWdldHlwZUxhYmVsLnNldExhYmVsKFwiRmVhdHVyZWQgYXJ0aWNsZVwiKS50b2dnbGUodHJ1ZSk7XHJcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5wYWdlSW5mby5pc0FydGljbGUgJiYgZGF0YS5pc0ZMKSB7XHJcblx0XHRcdFx0dGhpcy5wYWdldHlwZUxhYmVsLnNldExhYmVsKFwiRmVhdHVyZWQgbGlzdFwiKS50b2dnbGUodHJ1ZSk7XHJcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5wYWdlSW5mby5pc0FydGljbGUgJiYgZGF0YS5pc0xpc3QpIHtcclxuXHRcdFx0XHR0aGlzLnBhZ2V0eXBlTGFiZWwuc2V0TGFiZWwoXCJMaXN0IGFydGljbGVcIikudG9nZ2xlKHRydWUpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKGRhdGEub3Jlcykge1xyXG5cdFx0XHRcdHRoaXMub3Jlc0NsYXNzID0gZGF0YS5vcmVzLnByZWRpY3Rpb247XHJcblx0XHRcdFx0dGhpcy5vcmVzTGFiZWwudG9nZ2xlKHRydWUpLiRlbGVtZW50LmZpbmQoXCIub3Jlc1ByZWRpY3Rpb25cIikuYXBwZW5kKFxyXG5cdFx0XHRcdFx0XCJQcmVkaWN0aW9uOiBcIixcclxuXHRcdFx0XHRcdCQoXCI8c3Ryb25nPlwiKS50ZXh0KGRhdGEub3Jlcy5wcmVkaWN0aW9uKSxcclxuXHRcdFx0XHRcdFwiJm5ic3A7KFwiICsgZGF0YS5vcmVzLnByb2JhYmlsaXR5ICsgXCIpXCJcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMucGFnZUluZm8uaXNBcnRpY2xlKSB7XHJcblx0XHRcdFx0dGhpcy5wYWdldHlwZUxhYmVsLnNldExhYmVsKFwiQXJ0aWNsZSBwYWdlXCIpLnRvZ2dsZSh0cnVlKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLnBhZ2V0eXBlTGFiZWwuc2V0TGFiZWwoIHRoaXMuc3ViamVjdFBhZ2UuZ2V0TmFtZXNwYWNlUHJlZml4KCkuc2xpY2UoMCwtMSkgKyBcIiBwYWdlXCIgKS50b2dnbGUodHJ1ZSk7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gU2V0IHByb3BzIGZvciB1c2UgaW4gbWFraW5nIHdpa2l0ZXh0IGFuZCBlZGl0IHN1bW1hcmllc1xyXG5cdFx0XHR0aGlzLnRhbGtXaWtpdGV4dCA9IGRhdGEudGFsa1dpa2l0ZXh0O1xyXG5cdFx0XHR0aGlzLmV4aXN0aW5nQmFubmVyTmFtZXMgPSBkYXRhLmJhbm5lcnMubWFwKCBiYW5uZXJUZW1wbGF0ZSA9PiBiYW5uZXJUZW1wbGF0ZS5uYW1lICk7XHJcblx0XHRcdHRoaXMudGFsa3BhZ2UgPSBkYXRhLnRhbGtwYWdlO1xyXG5cdFx0XHQvLyBGb3JjZSBhIHNpemUgdXBkYXRlIHRvIGVuc3VyZSBldmV5dGhpbmcgZml0cyBva2F5XHJcblx0XHRcdHRoaXMudXBkYXRlU2l6ZSgpO1xyXG5cdFx0fSwgdGhpcyApO1xyXG59O1xyXG5cclxuLy8gU2V0IHVwIHRoZSB3aW5kb3cgaXQgaXMgcmVhZHk6IGF0dGFjaGVkIHRvIHRoZSBET00sIGFuZCBvcGVuaW5nIGFuaW1hdGlvbiBjb21wbGV0ZWRcclxuTWFpbldpbmRvdy5wcm90b3R5cGUuZ2V0UmVhZHlQcm9jZXNzID0gZnVuY3Rpb24gKCBkYXRhICkge1xyXG5cdGRhdGEgPSBkYXRhIHx8IHt9O1xyXG5cdHJldHVybiBNYWluV2luZG93LnN1cGVyLnByb3RvdHlwZS5nZXRSZWFkeVByb2Nlc3MuY2FsbCggdGhpcywgZGF0YSApXHJcblx0XHQubmV4dCggKCkgPT4gdGhpcy50b3BCYXIuc2VhcmNoQm94LmZvY3VzKCkgKTtcclxufTtcclxuXHJcbi8vIFVzZSB0aGUgZ2V0QWN0aW9uUHJvY2VzcygpIG1ldGhvZCB0byBkbyB0aGluZ3Mgd2hlbiBhY3Rpb25zIGFyZSBjbGlja2VkXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLmdldEFjdGlvblByb2Nlc3MgPSBmdW5jdGlvbiAoIGFjdGlvbiApIHtcclxuXHRpZiAoIGFjdGlvbiA9PT0gXCJzaG93UHJlZnNcIiApIHtcclxuXHRcdHRoaXMuYWN0aW9ucy5zZXRNb2RlKFwicHJlZnNcIik7XHJcblx0XHR0aGlzLmNvbnRlbnRBcmVhLnNldEl0ZW0oIHRoaXMucHJlZnNMYXlvdXQgKTtcclxuXHRcdHRoaXMudG9wQmFyLnNldERpc2FibGVkKHRydWUpO1xyXG5cdFx0dGhpcy51cGRhdGVTaXplKCk7XHJcblxyXG5cdH0gZWxzZSBpZiAoIGFjdGlvbiA9PT0gXCJzYXZlUHJlZnNcIiApIHtcclxuXHRcdHZhciB1cGRhdGVkUHJlZnMgPSB0aGlzLnByZWZzRm9ybS5nZXRQcmVmcygpO1xyXG5cdFx0cmV0dXJuIG5ldyBPTy51aS5Qcm9jZXNzKCkubmV4dChcclxuXHRcdFx0QXBpU2V0UHJlZnModXBkYXRlZFByZWZzKS50aGVuKFxyXG5cdFx0XHRcdC8vIFN1Y2Nlc3NcclxuXHRcdFx0XHQoKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnNldFByZWZlcmVuY2VzKHVwZGF0ZWRQcmVmcyk7XHJcblx0XHRcdFx0XHR0aGlzLmFjdGlvbnMuc2V0TW9kZShcImVkaXRcIik7XHJcblx0XHRcdFx0XHR0aGlzLmNvbnRlbnRBcmVhLnNldEl0ZW0oIHRoaXMuZWRpdExheW91dCApO1xyXG5cdFx0XHRcdFx0dGhpcy50b3BCYXIuc2V0RGlzYWJsZWQoZmFsc2UpO1xyXG5cdFx0XHRcdFx0dGhpcy51cGRhdGVTaXplKCk7XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHQvLyBGYWlsdXJlXHJcblx0XHRcdFx0KGNvZGUsIGVycikgPT4gJC5EZWZlcnJlZCgpLnJlamVjdChcclxuXHRcdFx0XHRcdG5ldyBPTy51aS5FcnJvcihcclxuXHRcdFx0XHRcdFx0JChcIjxkaXY+XCIpLmFwcGVuZChcclxuXHRcdFx0XHRcdFx0XHQkKFwiPHN0cm9uZyBzdHlsZT0nZGlzcGxheTpibG9jazsnPlwiKS50ZXh0KFwiQ291bGQgbm90IHNhdmUgcHJlZmVyZW5jZXMuXCIpLFxyXG5cdFx0XHRcdFx0XHRcdCQoXCI8c3BhbiBzdHlsZT0nY29sb3I6Izc3Nyc+XCIpLnRleHQoIG1ha2VFcnJvck1zZyhjb2RlLCBlcnIpIClcclxuXHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHRcdClcclxuXHRcdFx0KVxyXG5cdFx0KTtcclxuXHJcblx0fSBlbHNlIGlmICggYWN0aW9uID09PSBcImNsZWFyQ2FjaGVcIiApIHtcclxuXHRcdHJldHVybiBuZXcgT08udWkuUHJvY2VzcygpLm5leHQoKCkgPT4ge1xyXG5cdFx0XHRjYWNoZS5jbGVhckFsbEl0ZW1zKCk7XHJcblx0XHRcdHRoaXMuY2xvc2Uoe3Jlc3RhcnQ6IHRydWV9KTtcclxuXHRcdH0pO1xyXG5cclxuXHJcblx0fSBlbHNlIGlmICggYWN0aW9uID09PSBcImNsb3NlUHJlZnNcIiApIHtcclxuXHRcdHRoaXMuYWN0aW9ucy5zZXRNb2RlKFwiZWRpdFwiKTtcclxuXHRcdHRoaXMuY29udGVudEFyZWEuc2V0SXRlbSggdGhpcy5lZGl0TGF5b3V0ICk7XHJcblx0XHR0aGlzLnRvcEJhci5zZXREaXNhYmxlZChmYWxzZSk7XHJcblx0XHR0aGlzLnByZWZzRm9ybS5zZXRQcmVmVmFsdWVzKHRoaXMucHJlZmVyZW5jZXMpO1xyXG5cdFx0dGhpcy51cGRhdGVTaXplKCk7XHJcblxyXG5cdH0gZWxzZSBpZiAoIGFjdGlvbiA9PT0gXCJzYXZlXCIgKSB7XHJcblx0XHRyZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKS5uZXh0KFxyXG5cdFx0XHRBUEkuZWRpdFdpdGhSZXRyeShcclxuXHRcdFx0XHR0aGlzLnRhbGtwYWdlLmdldFByZWZpeGVkVGV4dCgpLFxyXG5cdFx0XHRcdHtydnNlY3Rpb246IDB9LFxyXG5cdFx0XHRcdHJldmlzaW9uID0+ICh7XHJcblx0XHRcdFx0XHRzZWN0aW9uOiAwLFxyXG5cdFx0XHRcdFx0dGV4dDogdGhpcy50cmFuc2Zvcm1UYWxrV2lraXRleHQocmV2aXNpb24uY29udGVudCksXHJcblx0XHRcdFx0XHRzdW1tYXJ5OiB0aGlzLm1ha2VFZGl0U3VtbWFyeSgpLFxyXG5cdFx0XHRcdFx0d2F0Y2hsaXN0OiB0aGlzLnByZWZlcmVuY2VzLndhdGNobGlzdFxyXG5cdFx0XHRcdH0pXHJcblx0XHRcdCkuY2F0Y2goKGNvZGUsIGVycikgPT4gJC5EZWZlcnJlZCgpLnJlamVjdChcclxuXHRcdFx0XHRuZXcgT08udWkuRXJyb3IoXHJcblx0XHRcdFx0XHQkKFwiPGRpdj5cIikuYXBwZW5kKFxyXG5cdFx0XHRcdFx0XHQkKFwiPHN0cm9uZyBzdHlsZT0nZGlzcGxheTpibG9jazsnPlwiKS50ZXh0KFwiQ291bGQgbm90IHNhdmUgeW91ciBjaGFuZ2VzLlwiKSxcclxuXHRcdFx0XHRcdFx0JChcIjxzcGFuIHN0eWxlPSdjb2xvcjojNzc3Jz5cIikudGV4dCggbWFrZUVycm9yTXNnKGNvZGUsIGVycikgKVxyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHRcdClcclxuXHRcdFx0KSApXHJcblx0XHQpLm5leHQoICgpID0+IHRoaXMuY2xvc2Uoe1xyXG5cdFx0XHRzdWNjZXNzOiB0cnVlLFxyXG5cdFx0XHR1cGdyYWRlZFN0dWI6IHRoaXMucGFnZUluZm8uaGFzU3R1YnRhZyAmJiB0aGlzLmlzUmF0ZWRBbmROb3RTdHViKClcclxuXHRcdH0pICk7XHJcblxyXG5cdH0gZWxzZSBpZiAoIGFjdGlvbiA9PT0gXCJwcmV2aWV3XCIgKSB7XHJcblx0XHRyZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKS5uZXh0KFxyXG5cdFx0XHRBUEkucG9zdCh7XHJcblx0XHRcdFx0YWN0aW9uOiBcInBhcnNlXCIsXHJcblx0XHRcdFx0Y29udGVudG1vZGVsOiBcIndpa2l0ZXh0XCIsXHJcblx0XHRcdFx0dGV4dDogdGhpcy50cmFuc2Zvcm1UYWxrV2lraXRleHQodGhpcy50YWxrV2lraXRleHQpICsgXCJcXG48aHI+XFxuXCIgKyBcIicnJ0VkaXQgc3VtbWFyeTonJycgXCIgKyB0aGlzLm1ha2VFZGl0U3VtbWFyeSgpLFxyXG5cdFx0XHRcdHRpdGxlOiB0aGlzLnRhbGtwYWdlLmdldFByZWZpeGVkVGV4dCgpLFxyXG5cdFx0XHRcdHBzdDogMVxyXG5cdFx0XHR9KS50aGVuKCByZXN1bHQgPT4ge1xyXG5cdFx0XHRcdGlmICggIXJlc3VsdCB8fCAhcmVzdWx0LnBhcnNlIHx8ICFyZXN1bHQucGFyc2UudGV4dCB8fCAhcmVzdWx0LnBhcnNlLnRleHRbXCIqXCJdICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZWplY3QoXCJFbXB0eSByZXN1bHRcIik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHZhciBwcmV2aWV3SHRtbFNuaXBwZXQgPSBuZXcgT08udWkuSHRtbFNuaXBwZXQocmVzdWx0LnBhcnNlLnRleHRbXCIqXCJdKTtcclxuXHJcblx0XHRcdFx0dGhpcy5wYXJzZWRDb250ZW50V2lkZ2V0LnNldExhYmVsKHByZXZpZXdIdG1sU25pcHBldCk7XHJcblx0XHRcdFx0dGhpcy5wYXJzZWRDb250ZW50Q29udGFpbmVyLnNldExhYmVsKFwiUHJldmlldzpcIik7XHJcblx0XHRcdFx0dGhpcy5hY3Rpb25zLnNldE1vZGUoXCJwcmV2aWV3XCIpO1xyXG5cdFx0XHRcdHRoaXMuY29udGVudEFyZWEuc2V0SXRlbSggdGhpcy5wYXJzZWRDb250ZW50TGF5b3V0ICk7XHJcblx0XHRcdFx0dGhpcy50b3BCYXIuc2V0RGlzYWJsZWQodHJ1ZSk7XHJcblx0XHRcdFx0dGhpcy51cGRhdGVTaXplKCk7XHJcblx0XHRcdH0pXHJcblx0XHRcdFx0LmNhdGNoKCAoY29kZSwgZXJyKSA9PiAkLkRlZmVycmVkKCkucmVqZWN0KFxyXG5cdFx0XHRcdFx0bmV3IE9PLnVpLkVycm9yKFxyXG5cdFx0XHRcdFx0XHQkKFwiPGRpdj5cIikuYXBwZW5kKFxyXG5cdFx0XHRcdFx0XHRcdCQoXCI8c3Ryb25nIHN0eWxlPSdkaXNwbGF5OmJsb2NrOyc+XCIpLnRleHQoXCJDb3VsZCBub3Qgc2hvdyBjaGFuZ2VzLlwiKSxcclxuXHRcdFx0XHRcdFx0XHQkKFwiPHNwYW4gc3R5bGU9J2NvbG9yOiM3NzcnPlwiKS50ZXh0KCBtYWtlRXJyb3JNc2coY29kZSwgZXJyKSApXHJcblx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdClcclxuXHRcdFx0XHQpIClcclxuXHRcdCk7XHJcblxyXG5cdH0gZWxzZSBpZiAoIGFjdGlvbiA9PT0gXCJjaGFuZ2VzXCIgKSB7XHJcblx0XHRyZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKS5uZXh0KFxyXG5cdFx0XHRBUEkucG9zdCh7XHJcblx0XHRcdFx0YWN0aW9uOiBcImNvbXBhcmVcIixcclxuXHRcdFx0XHRmb3JtYXQ6IFwianNvblwiLFxyXG5cdFx0XHRcdGZyb210ZXh0OiB0aGlzLnRhbGtXaWtpdGV4dCxcclxuXHRcdFx0XHRmcm9tY29udGVudG1vZGVsOiBcIndpa2l0ZXh0XCIsXHJcblx0XHRcdFx0dG90ZXh0OiB0aGlzLnRyYW5zZm9ybVRhbGtXaWtpdGV4dCh0aGlzLnRhbGtXaWtpdGV4dCksXHJcblx0XHRcdFx0dG9jb250ZW50bW9kZWw6IFwid2lraXRleHRcIixcclxuXHRcdFx0XHRwcm9wOiBcImRpZmZcIlxyXG5cdFx0XHR9KVxyXG5cdFx0XHRcdC50aGVuKCByZXN1bHQgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKCAhcmVzdWx0IHx8ICFyZXN1bHQuY29tcGFyZSB8fCAhcmVzdWx0LmNvbXBhcmVbXCIqXCJdICkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gJC5EZWZlcnJlZCgpLnJlamVjdChcIkVtcHR5IHJlc3VsdFwiKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHZhciAkZGlmZiA9ICQoXCI8dGFibGU+XCIpLmFkZENsYXNzKFwiZGlmZlwiKS5jc3MoXCJ3aWR0aFwiLCBcIjEwMCVcIikuYXBwZW5kKFxyXG5cdFx0XHRcdFx0XHQkKFwiPHRyPlwiKS5hcHBlbmQoXHJcblx0XHRcdFx0XHRcdFx0JChcIjx0aD5cIikuYXR0cih7XCJjb2xzcGFuXCI6XCIyXCIsIFwic2NvcGVcIjpcImNvbFwifSkuY3NzKFwid2lkdGhcIiwgXCI1MCVcIikudGV4dChcIkxhdGVzdCByZXZpc2lvblwiKSxcclxuXHRcdFx0XHRcdFx0XHQkKFwiPHRoPlwiKS5hdHRyKHtcImNvbHNwYW5cIjpcIjJcIiwgXCJzY29wZVwiOlwiY29sXCJ9KS5jc3MoXCJ3aWR0aFwiLCBcIjUwJVwiKS50ZXh0KFwiTmV3IHRleHRcIilcclxuXHRcdFx0XHRcdFx0KSxcclxuXHRcdFx0XHRcdFx0cmVzdWx0LmNvbXBhcmVbXCIqXCJdLFxyXG5cdFx0XHRcdFx0XHQkKFwiPHRmb290PlwiKS5hcHBlbmQoXHJcblx0XHRcdFx0XHRcdFx0JChcIjx0cj5cIikuYXBwZW5kKFxyXG5cdFx0XHRcdFx0XHRcdFx0JChcIjx0ZCBjb2xzcGFuPSc0Jz5cIikuYXBwZW5kKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQkKFwiPHN0cm9uZz5cIikudGV4dChcIkVkaXQgc3VtbWFyeTogXCIpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLm1ha2VFZGl0U3VtbWFyeSgpXHJcblx0XHRcdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHRcdHRoaXMucGFyc2VkQ29udGVudFdpZGdldC5zZXRMYWJlbCgkZGlmZik7XHJcblx0XHRcdFx0XHR0aGlzLnBhcnNlZENvbnRlbnRDb250YWluZXIuc2V0TGFiZWwoXCJDaGFuZ2VzOlwiKTtcclxuXHRcdFx0XHRcdHRoaXMuYWN0aW9ucy5zZXRNb2RlKFwiZGlmZlwiKTtcclxuXHRcdFx0XHRcdHRoaXMuY29udGVudEFyZWEuc2V0SXRlbSggdGhpcy5wYXJzZWRDb250ZW50TGF5b3V0ICk7XHJcblx0XHRcdFx0XHR0aGlzLnRvcEJhci5zZXREaXNhYmxlZCh0cnVlKTtcclxuXHRcdFx0XHRcdHRoaXMudXBkYXRlU2l6ZSgpO1xyXG5cdFx0XHRcdH0gKVxyXG5cdFx0XHRcdC5jYXRjaCggKGNvZGUsIGVycikgPT4gJC5EZWZlcnJlZCgpLnJlamVjdChcclxuXHRcdFx0XHRcdG5ldyBPTy51aS5FcnJvcihcclxuXHRcdFx0XHRcdFx0JChcIjxkaXY+XCIpLmFwcGVuZChcclxuXHRcdFx0XHRcdFx0XHQkKFwiPHN0cm9uZyBzdHlsZT0nZGlzcGxheTpibG9jazsnPlwiKS50ZXh0KFwiQ291bGQgbm90IHNob3cgY2hhbmdlcy5cIiksXHJcblx0XHRcdFx0XHRcdFx0JChcIjxzcGFuIHN0eWxlPSdjb2xvcjojNzc3Jz5cIikudGV4dCggbWFrZUVycm9yTXNnKGNvZGUsIGVycikgKVxyXG5cdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHQpXHJcblx0XHRcdFx0KSApXHJcblx0XHQpO1xyXG5cclxuXHR9IGVsc2UgaWYgKCBhY3Rpb24gPT09IFwiYmFja1wiICkge1xyXG5cdFx0dGhpcy5hY3Rpb25zLnNldE1vZGUoXCJlZGl0XCIpO1xyXG5cdFx0dGhpcy5jb250ZW50QXJlYS5zZXRJdGVtKCB0aGlzLmVkaXRMYXlvdXQgKTtcclxuXHRcdHRoaXMudG9wQmFyLnNldERpc2FibGVkKGZhbHNlKTtcclxuXHRcdHRoaXMudXBkYXRlU2l6ZSgpO1xyXG5cclxuXHR9IGVsc2UgaWYgKCFhY3Rpb24gJiYgdGhpcy5iYW5uZXJMaXN0LmNoYW5nZWQpIHtcclxuXHRcdC8vIENvbmZpcm0gY2xvc2luZyBvZiBkaWFsb2cgaWYgdGhlcmUgaGF2ZSBiZWVuIGNoYW5nZXMgXHJcblx0XHRyZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKS5uZXh0KFxyXG5cdFx0XHRPTy51aS5jb25maXJtKFwiQ2hhbmdlcyBtYWRlIHdpbGwgYmUgZGlzY2FyZGVkLlwiLCB7dGl0bGU6XCJDbG9zZSBSYXRlcj9cIn0pXHJcblx0XHRcdFx0LnRoZW4oY29uZmlybWVkID0+IGNvbmZpcm1lZCA/IHRoaXMuY2xvc2UoKSA6IG51bGwpXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIE1haW5XaW5kb3cuc3VwZXIucHJvdG90eXBlLmdldEFjdGlvblByb2Nlc3MuY2FsbCggdGhpcywgYWN0aW9uICk7XHJcbn07XHJcblxyXG4vLyBVc2UgdGhlIGdldFRlYXJkb3duUHJvY2VzcygpIG1ldGhvZCB0byBwZXJmb3JtIGFjdGlvbnMgd2hlbmV2ZXIgdGhlIGRpYWxvZyBpcyBjbG9zZWQuXHJcbi8vIGBkYXRhYCBpcyB0aGUgZGF0YSBwYXNzZWQgaW50byB0aGUgd2luZG93J3MgLmNsb3NlKCkgbWV0aG9kLlxyXG5NYWluV2luZG93LnByb3RvdHlwZS5nZXRUZWFyZG93blByb2Nlc3MgPSBmdW5jdGlvbiAoIGRhdGEgKSB7XHJcblx0cmV0dXJuIE1haW5XaW5kb3cuc3VwZXIucHJvdG90eXBlLmdldFRlYXJkb3duUHJvY2Vzcy5jYWxsKCB0aGlzLCBkYXRhIClcclxuXHRcdC5maXJzdCggKCkgPT4ge1xyXG5cdFx0XHR0aGlzLmJhbm5lckxpc3QuY2xlYXJJdGVtcygpO1xyXG5cdFx0XHR0aGlzLnRvcEJhci5zZWFyY2hCb3guc2V0VmFsdWUoXCJcIik7XHJcblx0XHRcdHRoaXMuY29udGVudEFyZWEuc2V0SXRlbSggdGhpcy5lZGl0TGF5b3V0ICk7XHJcblx0XHRcdHRoaXMudG9wQmFyLnNldERpc2FibGVkKGZhbHNlKTtcclxuXHRcdFx0dGhpcy5vcmVzTGFiZWwudG9nZ2xlKGZhbHNlKS4kZWxlbWVudC5maW5kKFwiLm9yZXNQcmVkaWN0aW9uXCIpLmVtcHR5KCk7XHJcblx0XHRcdHRoaXMucGFnZXR5cGVMYWJlbC50b2dnbGUoZmFsc2UpLnNldExhYmVsKFwiXCIpO1xyXG5cclxuXHRcdFx0dGhpcy4kZWxlbWVudC5maW5kKFwiLm9vLXVpLXdpbmRvdy1mcmFtZVwiKS5jc3MoXCJ0cmFuc2Zvcm1cIixcIlwiKTtcclxuXHRcdFx0dGhpcy4kZWxlbWVudC5maW5kKFwiLm9vLXVpLXByb2Nlc3NEaWFsb2ctbG9jYXRpb25cIikub2ZmKFwiLnJhdGVyTWFpbldpblwiKTtcclxuXHRcdFx0JChcImJvZHlcIikub2ZmKFwiLnJhdGVyTWFpbldpblwiKTtcclxuXHRcdH0gKTtcclxufTtcclxuXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLnNldFByZWZlcmVuY2VzID0gZnVuY3Rpb24ocHJlZnMpIHtcclxuXHR0aGlzLnByZWZlcmVuY2VzID0gJC5leHRlbmQoe30sIGFwcENvbmZpZy5kZWZhdWx0UHJlZnMsIHByZWZzKTtcclxuXHQvLyBBcHBsaWVzIHByZWZlcmVuY2VzIHRvIGV4aXN0aW5nIGl0ZW1zIGluIHRoZSB3aW5kb3c6XHJcblx0dGhpcy5iYW5uZXJMaXN0LnNldFByZWZlcmVuY2VzKHRoaXMucHJlZmVyZW5jZXMpO1xyXG59O1xyXG5cclxuTWFpbldpbmRvdy5wcm90b3R5cGUub25SZXNldENhY2hlID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5leGVjdXRlQWN0aW9uKFwiY2xlYXJDYWNoZVwiKTtcclxufTtcclxuXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLm9uU2VhcmNoU2VsZWN0ID0gZnVuY3Rpb24oZGF0YSkge1xyXG5cdHRoaXMudG9wQmFyLnNlYXJjaEJveC5wdXNoUGVuZGluZygpO1xyXG5cdHZhciBuYW1lID0gdGhpcy50b3BCYXIuc2VhcmNoQm94LmdldFZhbHVlKCkudHJpbSgpO1xyXG5cdGlmICghbmFtZSkge1xyXG5cdFx0dGhpcy50b3BCYXIuc2VhcmNoQm94LnBvcFBlbmRpbmcoKS5mb2N1cygpO1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHR2YXIgZXhpc3RpbmdCYW5uZXIgPSB0aGlzLmJhbm5lckxpc3QuaXRlbXMuZmluZChiYW5uZXIgPT4ge1xyXG5cdFx0cmV0dXJuIGJhbm5lci5tYWluVGV4dCA9PT0gbmFtZSB8fFx0YmFubmVyLnJlZGlyZWN0VGFyZ2V0TWFpblRleHQgPT09IG5hbWU7XHJcblx0fSk7XHJcblxyXG5cdC8vIEFib3J0IGFuZCBzaG93IGFsZXJ0IGlmIGJhbm5lciBhbHJlYWR5IGV4aXN0c1xyXG5cdGlmIChleGlzdGluZ0Jhbm5lcikge1xyXG5cdFx0dGhpcy50b3BCYXIuc2VhcmNoQm94LnBvcFBlbmRpbmcoKTtcclxuXHRcdHJldHVybiBPTy51aS5hbGVydChcIlRoZXJlIGlzIGFscmVhZHkgYSB7e1wiICsgbmFtZSArIFwifX0gYmFubmVyXCIpLnRoZW4odGhpcy5zZWFyY2hCb3guZm9jdXMoKSk7XHJcblx0fVxyXG5cclxuXHQvLyBDb25maXJtYXRpb24gcmVxdWlyZWQgZm9yIGJhbm5lcnMgbWlzc2luZyBXaWtpUHJvamVjdCBmcm9tIG5hbWUsIGFuZCBmb3IgdW5jcmVhdGVkIGRpc2FtYmlndWF0aW9uIHRhbGsgcGFnZXNcclxuXHR2YXIgY29uZmlybVRleHQ7XHJcblx0aWYgKCEvXltXd10oPzpQfGlraVtQcF1yb2plY3QpLy50ZXN0KG5hbWUpKSB7XHJcblx0XHRjb25maXJtVGV4dCA9IG5ldyBPTy51aS5IdG1sU25pcHBldChcclxuXHRcdFx0XCJ7e1wiICsgbXcuaHRtbC5lc2NhcGUobmFtZSkgKyBcIn19IGlzIG5vdCBhIHJlY29nbmlzZWQgV2lraVByb2plY3QgYmFubmVyLjxici8+RG8geW91IHdhbnQgdG8gY29udGludWU/XCJcclxuXHRcdCk7XHJcblx0fSBlbHNlIGlmIChuYW1lID09PSBcIldpa2lQcm9qZWN0IERpc2FtYmlndWF0aW9uXCIgJiYgJChcIiNjYS10YWxrLm5ld1wiKS5sZW5ndGggIT09IDAgJiYgdGhpcy5iYW5uZXJMaXN0Lml0ZW1zLmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXHJcblx0XHRjb25maXJtVGV4dCA9IFwiTmV3IHRhbGsgcGFnZXMgc2hvdWxkbid0IGJlIGNyZWF0ZWQgaWYgdGhleSB3aWxsIG9ubHkgY29udGFpbiB0aGUgXFx7XFx7V2lraVByb2plY3QgRGlzYW1iaWd1YXRpb25cXH1cXH0gYmFubmVyLiBDb250aW51ZT9cIjtcclxuXHR9XHJcblx0JC53aGVuKCBjb25maXJtVGV4dCA/IE9PLnVpLmNvbmZpcm0oY29uZmlybVRleHQpIDogdHJ1ZSlcclxuXHRcdC50aGVuKCBjb25maXJtZWQgPT4ge1xyXG5cdFx0XHRpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xyXG5cdFx0XHQvLyBDcmVhdGUgVGVtcGxhdGUgb2JqZWN0XHJcblx0XHRcdHJldHVybiBCYW5uZXJXaWRnZXQubmV3RnJvbVRlbXBsYXRlTmFtZShuYW1lLCBkYXRhLCB7XHJcblx0XHRcdFx0cHJlZmVyZW5jZXM6IHRoaXMucHJlZmVyZW5jZXMsXHJcblx0XHRcdFx0JG92ZXJsYXk6IHRoaXMuJG92ZXJsYXksXHJcblx0XHRcdFx0aXNBcnRpY2xlOiB0aGlzLnBhZ2VJbmZvLmlzQXJ0aWNsZVxyXG5cdFx0XHR9KVxyXG5cdFx0XHRcdC50aGVuKGJhbm5lciA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLmJhbm5lckxpc3QuYWRkSXRlbXMoIFtiYW5uZXJdICk7XHJcblx0XHRcdFx0XHRiYW5uZXIuc2V0Q2hhbmdlZCgpO1xyXG5cdFx0XHRcdFx0dGhpcy51cGRhdGVTaXplKCk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHR9KVxyXG5cdFx0LnRoZW4oICgpID0+IHRoaXMudG9wQmFyLnNlYXJjaEJveC5zZXRWYWx1ZShcIlwiKS5mb2N1cygpLnBvcFBlbmRpbmcoKSApO1xyXG59O1xyXG5cclxuTWFpbldpbmRvdy5wcm90b3R5cGUub25TZXRDbGFzc2VzID0gZnVuY3Rpb24oY2xhc3NWYWwpIHtcclxuXHRjb25zdCBzaGVsbFRlbXBsYXRlID0gdGhpcy5iYW5uZXJMaXN0Lml0ZW1zLmZpbmQoYmFubmVyID0+IGJhbm5lci5pc1NoZWxsVGVtcGxhdGUpO1xyXG5cdGlmIChzaGVsbFRlbXBsYXRlKSB7XHJcblx0XHRzaGVsbFRlbXBsYXRlLmNsYXNzRHJvcGRvd24uZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoY2xhc3NWYWwpO1xyXG5cdFx0c2hlbGxUZW1wbGF0ZS5jbGFzc0Ryb3Bkb3duLnNldEF1dG9maWxsZWQoZmFsc2UpO1xyXG5cdH1cclxuXHR0aGlzLmJhbm5lckxpc3QuaXRlbXMuZm9yRWFjaChiYW5uZXIgPT4ge1xyXG5cdFx0aWYgKGJhbm5lci5oYXNDbGFzc1JhdGluZ3MgJiYhYmFubmVyLmlzU2hlbGxUZW1wbGF0ZSkge1xyXG5cdFx0XHRiYW5uZXIuY2xhc3NEcm9wZG93bi5nZXRNZW51KCkuc2VsZWN0SXRlbUJ5RGF0YShzaGVsbFRlbXBsYXRlID8gbnVsbCA6IGNsYXNzVmFsKTtcclxuXHRcdFx0YmFubmVyLmNsYXNzRHJvcGRvd24uc2V0QXV0b2ZpbGxlZChmYWxzZSk7XHJcblx0XHR9XHJcblx0fSk7XHJcbn07XHJcblxyXG5NYWluV2luZG93LnByb3RvdHlwZS5vblNldEltcG9ydGFuY2VzID0gZnVuY3Rpb24oaW1wb3J0YW5jZVZhbCkge1xyXG5cdHRoaXMuYmFubmVyTGlzdC5pdGVtcy5mb3JFYWNoKGJhbm5lciA9PiB7XHJcblx0XHRpZiAoYmFubmVyLmhhc0ltcG9ydGFuY2VSYXRpbmdzKSB7XHJcblx0XHRcdGJhbm5lci5pbXBvcnRhbmNlRHJvcGRvd24uZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoaW1wb3J0YW5jZVZhbCk7XHJcblx0XHRcdGJhbm5lci5pbXBvcnRhbmNlRHJvcGRvd24uc2V0QXV0b2ZpbGxlZChmYWxzZSk7XHJcblx0XHR9XHJcblx0fSk7XHJcbn07XHJcblxyXG5NYWluV2luZG93LnByb3RvdHlwZS5vblJlbW92ZUFsbCA9IGZ1bmN0aW9uKCkge1xyXG5cdHRoaXMuYmFubmVyTGlzdC5jbGVhckl0ZW1zKCk7XHJcbn07XHJcblxyXG5NYWluV2luZG93LnByb3RvdHlwZS5vbkNsZWFyQWxsID0gZnVuY3Rpb24oKSB7XHJcblx0dGhpcy5iYW5uZXJMaXN0Lml0ZW1zLmZvckVhY2goIGJhbm5lciA9PiBiYW5uZXIub25DbGVhckJ1dHRvbkNsaWNrKCkgKTtcclxufTtcclxuXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLnRyYW5zZm9ybVRhbGtXaWtpdGV4dCA9IGZ1bmN0aW9uKHRhbGtXaWtpdGV4dCkge1xyXG5cdHZhciBiYW5uZXJzV2lraXRleHQgPSB0aGlzLmJhbm5lckxpc3QubWFrZVdpa2l0ZXh0KCk7XHJcblx0aWYgKCF0YWxrV2lraXRleHQpIHtcclxuXHRcdHJldHVybiBiYW5uZXJzV2lraXRleHQudHJpbSgpO1xyXG5cdH1cclxuXHQvLyBSZXBhcnNlIHRlbXBsYXRlcywgaW4gY2FzZSB0YWxrcGFnZSB3aWtpdGV4dCBoYXMgY2hhbmdlZFxyXG5cdHZhciB0YWxrVGVtcGxhdGVzID0gcGFyc2VUZW1wbGF0ZXModGFsa1dpa2l0ZXh0LCB0cnVlKTtcclxuXHQvLyByZXBsYWNlIGV4aXN0aW5nIGJhbm5lcnMgd2lraXRleHQgd2l0aCBhIGNvbnRyb2wgY2hhcmFjdGVyXHJcblx0dGFsa1RlbXBsYXRlcy5mb3JFYWNoKHRlbXBsYXRlID0+IHtcclxuXHRcdGlmICh0aGlzLmV4aXN0aW5nQmFubmVyTmFtZXMuaW5jbHVkZXModGVtcGxhdGUubmFtZSkpIHtcclxuXHRcdFx0dGFsa1dpa2l0ZXh0ID0gdGFsa1dpa2l0ZXh0LnJlcGxhY2UodGVtcGxhdGUud2lraXRleHQsIFwiXFx4MDFcIik7XHJcblx0XHR9XHJcblx0fSk7XHJcblx0Ly8gcmVwbGFjZSBpbnNlcnRpb24gcG9pbnQgKGZpcnN0IGNvbnRyb2wgY2hhcmFjdGVyKSB3aXRoIGEgZGlmZmVyZW50IGNvbnRyb2wgY2hhcmFjdGVyXHJcblx0dGFsa1dpa2l0ZXh0ID0gdGFsa1dpa2l0ZXh0LnJlcGxhY2UoXCJcXHgwMVwiLCBcIlxceDAyXCIpO1xyXG5cdC8vIHJlbW92ZSBvdGhlciBjb250cm9sIGNoYXJhY3RlcnNcclxuXHQvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCAqL1xyXG5cdHRhbGtXaWtpdGV4dCA9IHRhbGtXaWtpdGV4dC5yZXBsYWNlKC8oPzpcXHN8XFxuKSpcXHgwMSg/Olxcc3xcXG4pKi9nLFwiXCIpO1xyXG5cdC8vIHNwbGl0IGludG8gd2lraXRleHQgYmVmb3JlL2FmdGVyIHRoZSByZW1haW5pbmcgY29udHJvbCBjaGFyYWN0ZXIgKGFuZCB0cmltIGVhY2ggc2VjdGlvbilcclxuXHR2YXIgdGFsa1dpa2l0ZXh0U2VjdGlvbnMgPSB0YWxrV2lraXRleHQuc3BsaXQoXCJcXHgwMlwiKS5tYXAodCA9PiB0LnRyaW0oKSk7XHJcblx0aWYgKHRhbGtXaWtpdGV4dFNlY3Rpb25zLmxlbmd0aCA9PT0gMikge1xyXG5cdFx0Ly8gRm91bmQgdGhlIGluc2VydGlvbiBwb2ludCBmb3IgdGhlIGJhbm5lcnNcclxuXHRcdHJldHVybiAodGFsa1dpa2l0ZXh0U2VjdGlvbnNbMF0gKyBcIlxcblwiICsgYmFubmVyc1dpa2l0ZXh0LnRyaW0oKSArIFwiXFxuXCIgKyB0YWxrV2lraXRleHRTZWN0aW9uc1sxXSkudHJpbSgpO1xyXG5cdH1cclxuXHQvLyBDaGVjayBpZiB0aGVyZSdzIGFueXRoaW5nIGJlc2lkZSB0ZW1wbGF0ZXNcclxuXHR2YXIgdGVtcFN0ciA9IHRhbGtXaWtpdGV4dDtcclxuXHR0YWxrVGVtcGxhdGVzLmZvckVhY2godGVtcGxhdGUgPT4ge1xyXG5cdFx0dGVtcFN0ciA9IHRlbXBTdHIucmVwbGFjZSh0ZW1wbGF0ZS53aWtpdGV4dCwgXCJcIik7XHJcblx0fSk7XHJcblx0aWYgKC9eI1JFRElSRUNUL2kudGVzdCh0YWxrV2lraXRleHQpIHx8ICF0ZW1wU3RyLnRyaW0oKSkge1xyXG5cdFx0Ly8gSXMgYSByZWRpcmVjdCwgb3IgZXZlcnl0aGluZyBpcyBhIHRlbXBsYXRlOiBpbnNlcnQgYXQgdGhlIGVuZFxyXG5cdFx0cmV0dXJuIHRhbGtXaWtpdGV4dC50cmltKCkgKyBcIlxcblwiICsgYmFubmVyc1dpa2l0ZXh0LnRyaW0oKTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0Ly8gVGhlcmUgaXMgbm9uLXRlbXBsYXRlIGNvbnRlbnQsIHNvIGluc2VydCBhdCB0aGUgc3RhcnRcclxuXHRcdHJldHVybiBiYW5uZXJzV2lraXRleHQudHJpbSgpICsgXCJcXG5cIiArIHRhbGtXaWtpdGV4dC50cmltKCk7XHJcblx0fVxyXG59O1xyXG5cclxuTWFpbldpbmRvdy5wcm90b3R5cGUuaXNSYXRlZEFuZE5vdFN0dWIgPSBmdW5jdGlvbigpIHtcclxuXHRjb25zdCBub25TdHViUmF0aW5nZ3MgPSB0aGlzLmJhbm5lckxpc3QuaXRlbXMuZmlsdGVyKGJhbm5lciA9PlxyXG5cdFx0YmFubmVyLmhhc0NsYXNzUmF0aW5ncyAmJlxyXG5cdFx0YmFubmVyLmNsYXNzRHJvcGRvd24uZ2V0VmFsdWUoKSAmJlxyXG5cdFx0YmFubmVyLmNsYXNzRHJvcGRvd24uZ2V0VmFsdWUoKSAhPT0gXCJTdHViXCJcclxuXHQpO1xyXG5cdHJldHVybiBub25TdHViUmF0aW5nZ3MubGVuZ3RoID4gMDtcclxufTtcclxuXHJcbk1haW5XaW5kb3cucHJvdG90eXBlLm1ha2VFZGl0U3VtbWFyeSA9IGZ1bmN0aW9uKCkge1xyXG5cdGNvbnN0IHJlbW92ZWRCYW5uZXJzID0gW107XHJcblx0Y29uc3QgZWRpdGVkQmFubmVycyA9IFtdO1xyXG5cdGNvbnN0IG5ld0Jhbm5lcnMgPSBbXTtcclxuXHRjb25zdCBzaG9ydE5hbWUgPSBuYW1lID0+IG5hbWUucmVwbGFjZShcIldpa2lQcm9qZWN0IFwiLFwiXCIpLnJlcGxhY2UoXCJTdWJzdDpcIixcIlwiKTtcclxuXHJcblx0Ly8gT3ZlcmFsbCBjbGFzcy9pbXBvcnRhbmNlLCBpZiBhbGwgdGhlIHNhbWVcclxuXHRjb25zdCBhbGxDbGFzc2VzID0gdW5pcXVlQXJyYXkoXHJcblx0XHRmaWx0ZXJBbmRNYXAodGhpcy5iYW5uZXJMaXN0Lml0ZW1zLFxyXG5cdFx0XHRiYW5uZXIgPT4gYmFubmVyLmhhc0NsYXNzUmF0aW5ncyB8fCBiYW5uZXIuaXNTaGVsbFRlbXBsYXRlLFxyXG5cdFx0XHRiYW5uZXIgPT4gYmFubmVyLmNsYXNzRHJvcGRvd24uZ2V0VmFsdWUoKVxyXG5cdFx0KVxyXG5cdCk7XHJcblx0bGV0IG92ZXJhbGxDbGFzcyA9IGFsbENsYXNzZXMubGVuZ3RoID09PSAxICYmIGFsbENsYXNzZXNbMF07XHJcblx0Y29uc3QgYWxsSW1wb3J0YW5jZXMgPSB1bmlxdWVBcnJheShcclxuXHRcdGZpbHRlckFuZE1hcCh0aGlzLmJhbm5lckxpc3QuaXRlbXMsXHJcblx0XHRcdGJhbm5lciA9PiBiYW5uZXIuaGFzSW1wb3J0YW5jZVJhdGluZ3MsXHJcblx0XHRcdGJhbm5lciA9PiBiYW5uZXIuaW1wb3J0YW5jZURyb3Bkb3duLmdldFZhbHVlKClcclxuXHRcdClcclxuXHQpO1xyXG5cdGxldCBvdmVyYWxsSW1wb3J0YW5jZSA9IGFsbEltcG9ydGFuY2VzLmxlbmd0aCA9PT0gMSAmJiBhbGxJbXBvcnRhbmNlc1swXTtcclxuXHQvLyBEb24ndCB1c2UgdGhlbSB1bmxlc3Mgc29tZSBoYXZlIGNoYW5nZWRcclxuXHRsZXQgc29tZUNsYXNzZXNDaGFuZ2VkID0gZmFsc2U7XHJcblx0bGV0IHNvbWVJbXBvcnRhbmNlc0NoYW5nZWQgPSBmYWxzZTtcclxuXHJcblx0Ly8gcmVtb3ZlZCBiYW5uZXJzOlxyXG5cdHRoaXMuZXhpc3RpbmdCYW5uZXJOYW1lcy5mb3JFYWNoKG5hbWUgPT4ge1xyXG5cdFx0Y29uc3QgYmFubmVyID0gdGhpcy5iYW5uZXJMaXN0Lml0ZW1zLmZpbmQoIGJhbm5lciA9PiBiYW5uZXIubmFtZSA9PT0gbmFtZSB8fCBiYW5uZXIuYnlwYXNzZWROYW1lID09PSBuYW1lICk7XHJcblx0XHRpZiAoIWJhbm5lcikge1xyXG5cdFx0XHRyZW1vdmVkQmFubmVycy5wdXNoKFwi4oiSXCIgKyBzaG9ydE5hbWUobmFtZSkpO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG5cdC8vIGVkaXRlZCAmIG5ldyBiYW5uZXJzXHJcblx0dGhpcy5iYW5uZXJMaXN0Lml0ZW1zLmZvckVhY2goIGJhbm5lciA9PiB7XHJcblx0XHRjb25zdCBpc05ldyA9ICFiYW5uZXIud2lraXRleHQ7IC8vIG5vdCBhZGRlZCBmcm9tIHdpa2l0ZXh0IG9uIHBhZ2VcclxuXHRcdGlmICghaXNOZXcgJiYgIWJhbm5lci5jaGFuZ2VkKSB7XHJcblx0XHRcdC8vIE5vdCBjaGFuZ2VkXHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGxldCBuZXdDbGFzcyA9IGJhbm5lci5oYXNDbGFzc1JhdGluZ3MgJiYgIChpc05ldyB8fCBiYW5uZXIuY2xhc3NDaGFuZ2VkKSAmJiBiYW5uZXIuY2xhc3NEcm9wZG93bi5nZXRWYWx1ZSgpO1xyXG5cdFx0aWYgKG5ld0NsYXNzKSB7IHNvbWVDbGFzc2VzQ2hhbmdlZCA9IHRydWU7IH1cclxuXHRcdGlmIChvdmVyYWxsQ2xhc3MpIHsgbmV3Q2xhc3MgPSBudWxsOyB9XHJcblxyXG5cdFx0bGV0IG5ld0ltcG9ydGFuY2UgPSBiYW5uZXIuaGFzSW1wb3J0YW5jZVJhdGluZ3MgJiYgKGlzTmV3IHx8IGJhbm5lci5pbXBvcnRhbmNlQ2hhbmdlZCkgJiYgYmFubmVyLmltcG9ydGFuY2VEcm9wZG93bi5nZXRWYWx1ZSgpO1xyXG5cdFx0aWYgKG5ld0ltcG9ydGFuY2UpIHsgc29tZUltcG9ydGFuY2VzQ2hhbmdlZCA9IHRydWU7IH1cclxuXHRcdGlmIChvdmVyYWxsSW1wb3J0YW5jZSkgeyBuZXdJbXBvcnRhbmNlID0gbnVsbDsgfVxyXG5cclxuXHRcdGxldCByYXRpbmcgPSAobmV3Q2xhc3MgJiYgbmV3SW1wb3J0YW5jZSlcclxuXHRcdFx0PyBuZXdDbGFzcyArIFwiL1wiICsgbmV3SW1wb3J0YW5jZVxyXG5cdFx0XHQ6IG5ld0NsYXNzIHx8IG5ld0ltcG9ydGFuY2UgfHwgXCJcIjtcclxuXHRcdGlmIChyYXRpbmcpIHsgcmF0aW5nID0gXCIgKFwiICsgcmF0aW5nICsgXCIpXCI7IH1cclxuXHRcdFxyXG5cdFx0aWYgKGlzTmV3KSB7XHJcblx0XHRcdG5ld0Jhbm5lcnMucHVzaChcIitcIiArIHNob3J0TmFtZShiYW5uZXIubmFtZSkgKyByYXRpbmcpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0ZWRpdGVkQmFubmVycy5wdXNoKHNob3J0TmFtZShiYW5uZXIubmFtZSkgKyByYXRpbmcpO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG5cdC8vIG92ZXJhbGwgcmF0aW5nXHJcblx0bGV0IG92ZXJhbGxSYXRpbmcgPSAoc29tZUNsYXNzZXNDaGFuZ2VkICYmIG92ZXJhbGxDbGFzcyAmJiBzb21lSW1wb3J0YW5jZXNDaGFuZ2VkICYmIG92ZXJhbGxJbXBvcnRhbmNlKVxyXG5cdFx0PyBvdmVyYWxsQ2xhc3MgKyBcIi9cIiArIG92ZXJhbGxJbXBvcnRhbmNlXHJcblx0XHQ6IChzb21lQ2xhc3Nlc0NoYW5nZWQgJiYgb3ZlcmFsbENsYXNzKSB8fCAoc29tZUltcG9ydGFuY2VzQ2hhbmdlZCAmJiBvdmVyYWxsSW1wb3J0YW5jZSkgfHwgXCJcIjtcclxuXHRpZiAob3ZlcmFsbFJhdGluZykgeyBvdmVyYWxsUmF0aW5nID0gXCIgKFwiICsgb3ZlcmFsbFJhdGluZyArIFwiKVwiOyB9XHJcblxyXG5cdHJldHVybiBgQXNzZXNzbWVudCR7b3ZlcmFsbFJhdGluZ306ICR7Wy4uLmVkaXRlZEJhbm5lcnMsIC4uLm5ld0Jhbm5lcnMsIC4uLnJlbW92ZWRCYW5uZXJzXS5qb2luKFwiLCBcIil9JHthcHBDb25maWcuc2NyaXB0LmFkdmVydH1gO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWFpbldpbmRvdztcclxuLy8gPC9ub3dpa2k+IiwiaW1wb3J0IGNvbmZpZyBmcm9tIFwiLi9jb25maWdcIjtcclxuLy8gPG5vd2lraT5cclxuXHJcbnZhciBBUEkgPSBuZXcgbXcuQXBpKCB7XHJcblx0YWpheDoge1xyXG5cdFx0aGVhZGVyczogeyBcclxuXHRcdFx0XCJBcGktVXNlci1BZ2VudFwiOiBcIlJhdGVyL1wiICsgY29uZmlnLnNjcmlwdC52ZXJzaW9uICsgXHJcblx0XHRcdFx0XCIgKCBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Vc2VyOkV2YWQzNy9SYXRlciApXCJcclxuXHRcdH1cclxuXHR9XHJcbn0gKTtcclxuXHJcbi8qIC0tLS0tLS0tLS0gQVBJIGZvciBPUkVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cclxuQVBJLmdldE9SRVMgPSBmdW5jdGlvbihyZXZpc2lvbklEKSB7XHJcblx0cmV0dXJuICQuZ2V0KFwiaHR0cHM6Ly9vcmVzLndpa2ltZWRpYS5vcmcvdjMvc2NvcmVzL2Vud2lraT9tb2RlbHM9YXJ0aWNsZXF1YWxpdHkmcmV2aWRzPVwiK3JldmlzaW9uSUQpO1xyXG59O1xyXG5cclxuLyogLS0tLS0tLS0tLSBSYXcgd2lraXRleHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xyXG5BUEkuZ2V0UmF3ID0gZnVuY3Rpb24ocGFnZSkge1xyXG5cdHJldHVybiAkLmdldChcImh0dHBzOlwiICsgY29uZmlnLm13LndnU2VydmVyICsgbXcudXRpbC5nZXRVcmwocGFnZSwge2FjdGlvbjpcInJhd1wifSkpXHJcblx0XHQudGhlbihmdW5jdGlvbihkYXRhKSB7XHJcblx0XHRcdGlmICggIWRhdGEgKSB7XHJcblx0XHRcdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZWplY3QoXCJvay1idXQtZW1wdHlcIik7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGRhdGE7XHJcblx0XHR9KTtcclxufTtcclxuXHJcbi8qIC0tLS0tLS0tLS0gRWRpdCB3aXRoIHJldHJ5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cclxuLyoqXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSB0aXRsZVxyXG4gKiBAcGFyYW0ge09iamVjdD99IHBhcmFtcyBhZGRpdGlvbmFsIHBhcmFtcyBmb3IgdGhlIGdldCByZXF1ZXN0XHJcbiAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdCwgc3RyaW5nPn0gcGFnZSwgc3RhcnR0aW1lIHRpbWVzdGFtcFxyXG4gKi9cclxudmFyIGdldFBhZ2UgPSBmdW5jdGlvbih0aXRsZSwgcGFyYW1zKSB7XHJcblx0cmV0dXJuIEFQSS5nZXQoXHJcblx0XHQkLmV4dGVuZChcclxuXHRcdFx0e1xyXG5cdFx0XHRcdFwiYWN0aW9uXCI6IFwicXVlcnlcIixcclxuXHRcdFx0XHRcImZvcm1hdFwiOiBcImpzb25cIixcclxuXHRcdFx0XHRcImN1cnRpbWVzdGFtcFwiOiAxLFxyXG5cdFx0XHRcdFwidGl0bGVzXCI6IHRpdGxlLFxyXG5cdFx0XHRcdFwicHJvcFwiOiBcInJldmlzaW9uc3xpbmZvXCIsXHJcblx0XHRcdFx0XCJydnByb3BcIjogXCJjb250ZW50fHRpbWVzdGFtcFwiLFxyXG5cdFx0XHRcdFwicnZzbG90c1wiOiBcIm1haW5cIlx0XHRcdFx0XHRcclxuXHRcdFx0fSxcclxuXHRcdFx0cGFyYW1zXHJcblx0XHQpXHJcblx0KS50aGVuKHJlc3BvbnNlID0+IHtcclxuXHRcdHZhciBwYWdlID0gT2JqZWN0LnZhbHVlcyhyZXNwb25zZS5xdWVyeS5wYWdlcylbMF07XHJcblx0XHR2YXIgc3RhcnR0aW1lID0gcmVzcG9uc2UuY3VydGltZXN0YW1wO1xyXG5cdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlKHBhZ2UsIHN0YXJ0dGltZSk7XHJcblx0fSk7XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtPYmplY3R9IHBhZ2UgZGV0YWlscyBvYmplY3QgZnJvbSBBUElcclxuICogQHBhcmFtIHtzdHJpbmd9IHN0YXJ0dGltZSB0aW1lc3RhbXBcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIGNhbGxiYWNrIHRoYXQgcHJlcGFyZXMgdGhlIGVkaXQ6XHJcbiAqICB7T2JqZWN0fSBzaW1wbGlmaWVkUGFnZSA9PiB7T2JqZWN0fFByb21pc2U8T2JqZWN0Pn0gZWRpdCBwYXJhbXNcclxuICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gcGFyYW1zIGZvciBlZGl0IHF1ZXJ5XHJcbiAqL1xyXG52YXIgcHJvY2Vzc1BhZ2UgPSBmdW5jdGlvbihwYWdlLCBzdGFydHRpbWUsIHRyYW5zZm9ybSkge1xyXG5cdHZhciBiYXNldGltZXN0YW1wID0gcGFnZS5yZXZpc2lvbnMgJiYgcGFnZS5yZXZpc2lvbnNbMF0udGltZXN0YW1wO1xyXG5cdHZhciBzaW1wbGlmaWVkUGFnZSA9IHtcclxuXHRcdHBhZ2VpZDogcGFnZS5wYWdlaWQsXHJcblx0XHRtaXNzaW5nOiBwYWdlLm1pc3NpbmcgPT09IFwiXCIsXHJcblx0XHRyZWRpcmVjdDogcGFnZS5yZWRpcmVjdCA9PT0gXCJcIixcclxuXHRcdGNhdGVnb3JpZXM6IHBhZ2UuY2F0ZWdvcmllcyxcclxuXHRcdG5zOiBwYWdlLm5zLFxyXG5cdFx0dGl0bGU6IHBhZ2UudGl0bGUsXHJcblx0XHRjb250ZW50OiBwYWdlLnJldmlzaW9ucyAmJiBwYWdlLnJldmlzaW9uc1swXS5zbG90cy5tYWluW1wiKlwiXVxyXG5cdH07XHJcblx0cmV0dXJuICQud2hlbiggdHJhbnNmb3JtKHNpbXBsaWZpZWRQYWdlKSApXHJcblx0XHQudGhlbiggZWRpdFBhcmFtcyA9PlxyXG5cdFx0XHQkLmV4dGVuZCgge1xyXG5cdFx0XHRcdGFjdGlvbjogXCJlZGl0XCIsXHJcblx0XHRcdFx0dGl0bGU6IHBhZ2UudGl0bGUsXHJcblx0XHRcdFx0Ly8gUHJvdGVjdCBhZ2FpbnN0IGVycm9ycyBhbmQgY29uZmxpY3RzXHJcblx0XHRcdFx0YXNzZXJ0OiBcInVzZXJcIixcclxuXHRcdFx0XHRiYXNldGltZXN0YW1wOiBiYXNldGltZXN0YW1wLFxyXG5cdFx0XHRcdHN0YXJ0dGltZXN0YW1wOiBzdGFydHRpbWVcclxuXHRcdFx0fSwgZWRpdFBhcmFtcyApXHJcblx0XHQpO1xyXG59O1xyXG5cclxuLyoqIGVkaXRXaXRoUmV0cnlcclxuICogXHJcbiAqIEVkaXRzIGEgcGFnZSwgcmVzb2x2aW5nIGVkaXQgY29uZmxpY3RzLCBhbmQgcmV0cnlpbmcgZWRpdHMgdGhhdCBmYWlsLiBUaGVcclxuICogdHJhbmZvcm0gZnVuY3Rpb24gbWF5IHJldHVybiBhIHJlamVjdGVkIHByb21pc2UgaWYgdGhlIHBhZ2Ugc2hvdWxkIG5vdCBiZVxyXG4gKiBlZGl0ZWQ7IHRoZSBAcmV0dXJucyB7UHJvbWlzZX0gd2lsbCB3aWxsIGJlIHJlamVjdGVkIHdpdGggdGhlIHNhbWUgcmVqZWN0aW9uXHJcbiAqIHZhbHVlcy5cclxuICogXHJcbiAqIE5vdGU6IFVubGlrZSBbbXcuQXBpI0VkaXRdLCBhIG1pc3NpbmcgcGFnZSB3aWxsIGJlIGNyZWF0ZWQsIHVubGVzcyB0aGVcclxuICogdHJhbnNmb3JtIGNhbGxiYWNrIGluY2x1ZGVzIHRoZSBcIm5vY3JlYXRlXCIgcGFyYW0uXHJcbiAqIFxyXG4gKiBbbXcuQXBpI0VkaXRdOiA8aHR0cHM6Ly9kb2Mud2lraW1lZGlhLm9yZy9tZWRpYXdpa2ktY29yZS9tYXN0ZXIvanMvIyEvYXBpL213LkFwaS5wbHVnaW4uZWRpdD5cclxuICogXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSB0aXRsZSBwYWdlIHRvIGJlIGVkaXRlZFxyXG4gKiBAcGFyYW0ge09iamVjdHxudWxsfSBnZXRQYXJhbXMgYWRkaXRpb25hbCBwYXJhbXMgZm9yIHRoZSBnZXQgcmVxdWVzdFxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gY2FsbGJhY2sgdGhhdCBwcmVwYXJlcyB0aGUgZWRpdDpcclxuICogIHtPYmplY3R9IHNpbXBsaWZpZWRQYWdlID0+IHtPYmplY3R8UHJvbWlzZTxPYmplY3Q+fSBwYXJhbXMgZm9yIEFQSSBlZGl0aW5nXHJcbiAqIEByZXR1cm5zIHtQcm9taXNlPG9iamVjdD59IHByb21pc2UsIHJlc29sdmVkIG9uIHN1Y2Nlc3MsIHJlamVjdGVkIGlmXHJcbiAqICBwYWdlIHdhcyBub3QgZWRpdGVkXHJcbiAqL1xyXG5BUEkuZWRpdFdpdGhSZXRyeSA9IGZ1bmN0aW9uKHRpdGxlLCBnZXRQYXJhbXMsIHRyYW5zZm9ybSkge1xyXG5cdHJldHVybiBnZXRQYWdlKHRpdGxlLCBnZXRQYXJhbXMpXHJcblx0XHQudGhlbihcclxuXHRcdC8vIFN1Y2NlczogcHJvY2VzcyB0aGUgcGFnZVxyXG5cdFx0XHQocGFnZSwgc3RhcnR0aW1lKSA9PiBwcm9jZXNzUGFnZShwYWdlLCBzdGFydHRpbWUsIHRyYW5zZm9ybSksXHJcblx0XHRcdC8vIEZhaWx1cmU6IHRyeSBhZ2FpblxyXG5cdFx0XHQoKSA9PiBnZXRQYWdlKHRpdGxlLCBnZXRQYXJhbXMpLnRoZW4ocHJvY2Vzc1BhZ2UsIHRyYW5zZm9ybSlcclxuXHRcdClcclxuXHRcdC50aGVuKGVkaXRQYXJhbXMgPT5cclxuXHRcdFx0QVBJLnBvc3RXaXRoVG9rZW4oXCJjc3JmXCIsIGVkaXRQYXJhbXMpXHJcblx0XHRcdFx0LmNhdGNoKCBlcnJvckNvZGUgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKCBlcnJvckNvZGUgPT09IFwiZWRpdGNvbmZsaWN0XCIgKSB7XHJcblx0XHRcdFx0XHRcdC8vIFRyeSBhZ2Fpbiwgc3RhcnRpbmcgb3ZlclxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gQVBJLmVkaXRXaXRoUmV0cnkodGl0bGUsIGdldFBhcmFtcywgdHJhbnNmb3JtKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8vIFRyeSBhZ2FpblxyXG5cdFx0XHRcdFx0cmV0dXJuIEFQSS5wb3N0V2l0aFRva2VuKFwiY3NyZlwiLCBlZGl0UGFyYW1zKTtcclxuXHRcdFx0XHR9KVxyXG5cdFx0KTtcclxufTtcclxuXHJcbnZhciBtYWtlRXJyb3JNc2cgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kKSB7XHJcblx0dmFyIGNvZGUsIHhociwgbWVzc2FnZTtcclxuXHRpZiAoIHR5cGVvZiBmaXJzdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygc2Vjb25kID09PSBcInN0cmluZ1wiICkge1xyXG5cdFx0Ly8gRXJyb3JzIGZyb20gJC5nZXQgYmVpbmcgcmVqZWN0ZWQgKE9SRVMgJiBSYXcgd2lraXRleHQpXHJcblx0XHR2YXIgZXJyb3JPYmogPSBmaXJzdC5yZXNwb25zZUpTT04gJiYgZmlyc3QucmVzcG9uc2VKU09OLmVycm9yO1xyXG5cdFx0aWYgKCBlcnJvck9iaiApIHtcclxuXHRcdFx0Ly8gR290IGFuIGFwaS1zcGVjaWZpYyBlcnJvciBjb2RlL21lc3NhZ2VcclxuXHRcdFx0Y29kZSA9IGVycm9yT2JqLmNvZGU7XHJcblx0XHRcdG1lc3NhZ2UgPSBlcnJvck9iai5tZXNzYWdlO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0eGhyID0gZmlyc3Q7XHJcblx0XHR9XHJcblx0fSBlbHNlIGlmICggdHlwZW9mIGZpcnN0ID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiBzZWNvbmQgPT09IFwib2JqZWN0XCIgKSB7XHJcblx0XHQvLyBFcnJvcnMgZnJvbSBtdy5BcGkgb2JqZWN0XHJcblx0XHR2YXIgbXdFcnJvck9iaiA9IHNlY29uZC5lcnJvcjtcclxuXHRcdGlmIChtd0Vycm9yT2JqKSB7XHJcblx0XHRcdC8vIEdvdCBhbiBhcGktc3BlY2lmaWMgZXJyb3IgY29kZS9tZXNzYWdlXHJcblx0XHRcdGNvZGUgPSBlcnJvck9iai5jb2RlO1xyXG5cdFx0XHRtZXNzYWdlID0gZXJyb3JPYmouaW5mbztcclxuXHRcdH0gZWxzZSBpZiAoZmlyc3QgPT09IFwib2stYnV0LWVtcHR5XCIpIHtcclxuXHRcdFx0Y29kZSA9IG51bGw7XHJcblx0XHRcdG1lc3NhZ2UgPSBcIkdvdCBhbiBlbXB0eSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXJcIjtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHhociA9IHNlY29uZCAmJiBzZWNvbmQueGhyO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0aWYgKGNvZGUgJiYgbWVzc2FnZSkge1xyXG5cdFx0cmV0dXJuIGBBUEkgZXJyb3IgJHtjb2RlfTogJHttZXNzYWdlfWA7XHJcblx0fSBlbHNlIGlmIChtZXNzYWdlKSB7XHJcblx0XHRyZXR1cm4gYEFQSSBlcnJvcjogJHttZXNzYWdlfWA7XHJcblx0fSBlbHNlIGlmICh4aHIpIHtcclxuXHRcdHJldHVybiBgSFRUUCBlcnJvciAke3hoci5zdGF0dXN9YDtcclxuXHR9IGVsc2UgaWYgKFxyXG5cdFx0dHlwZW9mIGZpcnN0ID09PSBcInN0cmluZ1wiICYmIGZpcnN0ICE9PSBcImVycm9yXCIgJiZcclxuXHRcdHR5cGVvZiBzZWNvbmQgPT09IFwic3RyaW5nXCIgJiYgc2Vjb25kICE9PSBcImVycm9yXCJcclxuXHQpIHtcclxuXHRcdHJldHVybiBgRXJyb3IgJHtmaXJzdH06ICR7c2Vjb25kfWA7XHJcblx0fSBlbHNlIGlmICh0eXBlb2YgZmlyc3QgPT09IFwic3RyaW5nXCIgJiYgZmlyc3QgIT09IFwiZXJyb3JcIikge1xyXG5cdFx0cmV0dXJuIGBFcnJvcjogJHtmaXJzdH1gO1xyXG5cdH0gZWxzZSB7XHJcblx0XHRyZXR1cm4gXCJVbmtub3duIEFQSSBlcnJvclwiO1xyXG5cdH1cclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEFQSTtcclxuZXhwb3J0IHsgbWFrZUVycm9yTXNnIH07XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCBjb25maWcgZnJvbSBcIi4vY29uZmlnXCI7XHJcbmltcG9ydCB7IGdldFByZWZzIH0gZnJvbSBcIi4vcHJlZnNcIjtcclxuaW1wb3J0IEFQSSwgeyBtYWtlRXJyb3JNc2cgfSBmcm9tIFwiLi9hcGlcIjtcclxuaW1wb3J0IHNldHVwUmF0ZXIgZnJvbSBcIi4vc2V0dXBcIjtcclxuLy8gPG5vd2lraT5cclxuXHJcbnZhciBhdXRvU3RhcnQgPSBmdW5jdGlvbiBhdXRvU3RhcnQoKSB7XHJcblxyXG5cdHJldHVybiBnZXRQcmVmcygpLnRoZW4ocHJlZnMgPT4ge1xyXG5cdFx0Ly8gQ2hlY2sgaWYgcHJlZiBpcyB0dXJuZWQgb2ZmXHJcblx0XHRpZiAoIXByZWZzLmF1dG9zdGFydCkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHQvLyBDaGVjayBpZiBwcmVmIGlzIHR1cm5lZCBvZmYgZm9yIHJlZGlyZWN0cywgYW5kIGN1cnJlbnQgcGFnZSBpcyBhIHJlZGlyZWN0XHJcblx0XHRpZiAoIXByZWZzLmF1dG9zdGFydFJlZGlyZWN0cyAmJiB3aW5kb3cubG9jYXRpb24uc2VhcmNoLmluY2x1ZGVzKFwicmVkaXJlY3Q9bm9cIikpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0Ly8gQ2hlY2sgaWYgdmlld2luZyBkaWZmL2hpc3Rvcnkvb2xkIHZlcnNpb25cclxuXHRcdGlmICgvKGFjdGlvbnxkaWZmfG9sZGlkKS8udGVzdCh3aW5kb3cubG9jYXRpb24uc2VhcmNoKSkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRjb25zdCBzdWJqZWN0VGl0bGUgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dChjb25maWcubXcud2dQYWdlTmFtZSkuZ2V0U3ViamVjdFBhZ2UoKTtcclxuXHRcdC8vIENoZWNrIGlmIHN1YmplY3QgcGFnZSBpcyB0aGUgbWFpbiBwYWdlXHJcblx0XHRpZiAoc3ViamVjdFRpdGxlLmdldFByZWZpeGVkVGV4dCgpID09PSBcIk1haW4gUGFnZVwiKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdC8vIENoZWNrIHN1YmplY3QgcGFnZSBuYW1lc3BhY2VcclxuXHRcdGlmIChcclxuXHRcdFx0cHJlZnMuYXV0b3N0YXJ0TmFtZXNwYWNlcyAmJlxyXG5cdFx0XHRwcmVmcy5hdXRvc3RhcnROYW1lc3BhY2VzLmxlbmd0aCAmJlxyXG5cdFx0XHQhcHJlZnMuYXV0b3N0YXJ0TmFtZXNwYWNlcy5pbmNsdWRlcyhjb25maWcubXcud2dOYW1lc3BhY2VOdW1iZXIpXHJcblx0XHQpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFxyXG5cdFx0Ly8gSWYgdGFsayBwYWdlIGRvZXMgbm90IGV4aXN0LCBjYW4ganVzdCBhdXRvc3RhcnRcclxuXHRcdGlmICggJChcIiNjYS10YWxrLm5ld1wiKS5sZW5ndGggKSB7XHJcblx0XHRcdHJldHVybiBzZXR1cFJhdGVyKCk7XHJcblx0XHR9XHRcclxuXHJcblx0XHQvKiBDaGVjayB0ZW1wbGF0ZXMgcHJlc2VudCBvbiB0YWxrIHBhZ2UuIEZldGNoZXMgaW5kaXJlY3RseSB0cmFuc2NsdWRlZCB0ZW1wbGF0ZXMsIHNvIHdpbGwgZmluZFxyXG5cdFx0XHRUZW1wbGF0ZTpXUEJhbm5lck1ldGEgKGFuZCBpdHMgc3VidGVtcGxhdGVzKS4gQnV0IHNvbWUgYmFubmVycyBzdWNoIGFzIE1JTEhJU1QgZG9uJ3QgdXNlIHRoYXRcclxuXHRcdFx0bWV0YSB0ZW1wbGF0ZSwgc28gd2UgYWxzbyBoYXZlIHRvIGNoZWNrIGZvciB0ZW1wbGF0ZSB0aXRsZXMgY29udGFpbmcgJ1dpa2lQcm9qZWN0J1xyXG5cdFx0Ki9cclxuXHRcdGNvbnN0IHRhbGtUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KGNvbmZpZy5tdy53Z1BhZ2VOYW1lKS5nZXRUYWxrUGFnZSgpO1xyXG5cdFx0cmV0dXJuIEFQSS5nZXQoe1xyXG5cdFx0XHRhY3Rpb246IFwicXVlcnlcIixcclxuXHRcdFx0Zm9ybWF0OiBcImpzb25cIixcclxuXHRcdFx0cHJvcDogXCJ0ZW1wbGF0ZXNcIixcclxuXHRcdFx0dGl0bGVzOiB0YWxrVGl0bGUuZ2V0UHJlZml4ZWRUZXh0KCksXHJcblx0XHRcdHRsbmFtZXNwYWNlOiBcIjEwXCIsXHJcblx0XHRcdHRsbGltaXQ6IFwiNTAwXCIsXHJcblx0XHRcdGluZGV4cGFnZWlkczogMVxyXG5cdFx0fSlcclxuXHRcdFx0LnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XHJcblx0XHRcdFx0dmFyIGlkID0gcmVzdWx0LnF1ZXJ5LnBhZ2VpZHM7XHJcblx0XHRcdFx0dmFyIHRlbXBsYXRlcyA9IHJlc3VsdC5xdWVyeS5wYWdlc1tpZF0udGVtcGxhdGVzO1xyXG5cdFx0XHRcclxuXHRcdFx0XHRpZiAoICF0ZW1wbGF0ZXMgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gc2V0dXBSYXRlcigpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHJcblx0XHRcdFx0dmFyIGhhc1dpa2lwcm9qZWN0ID0gdGVtcGxhdGVzLnNvbWUodGVtcGxhdGUgPT4gLyhXaWtpUHJvamVjdHxXUEJhbm5lcikvLnRlc3QodGVtcGxhdGUudGl0bGUpKTtcclxuXHRcdFx0XHJcblx0XHRcdFx0aWYgKCAhaGFzV2lraXByb2plY3QgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gc2V0dXBSYXRlcigpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHJcblx0XHRcdH0sXHJcblx0XHRcdGZ1bmN0aW9uKGNvZGUsIGpxeGhyKSB7XHJcblx0XHRcdC8vIFNpbGVudGx5IGlnbm9yZSBmYWlsdXJlcyAoanVzdCBsb2cgdG8gY29uc29sZSlcclxuXHRcdFx0XHRjb25zb2xlLndhcm4oXHJcblx0XHRcdFx0XHRcIltSYXRlcl0gRXJyb3Igd2hpbGUgY2hlY2tpbmcgd2hldGhlciB0byBhdXRvc3RhcnQuXCIgK1xyXG5cdFx0XHRcdCggY29kZSA9PSBudWxsICkgPyBcIlwiIDogXCIgXCIgKyBtYWtlRXJyb3JNc2coY29kZSwganF4aHIpXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHRyZXR1cm4gJC5EZWZlcnJlZCgpLnJlamVjdCgpO1xyXG5cdFx0XHR9KTtcclxuXHR9KTtcclxuXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBhdXRvU3RhcnQ7XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCB7aXNBZnRlckRhdGV9IGZyb20gXCIuL3V0aWxcIjtcclxuLy8gPG5vd2lraT5cclxuXHJcbi8qKiB3cml0ZVxyXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5XHJcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSB2YWxcclxuICogQHBhcmFtIHtOdW1iZXJ9IHN0YWxlRGF5cyBOdW1iZXIgb2YgZGF5cyBhZnRlciB3aGljaCB0aGUgZGF0YSBiZWNvbWVzIHN0YWxlICh1c2FibGUsIGJ1dCBzaG91bGRcclxuICogIGJlIHVwZGF0ZWQgZm9yIG5leHQgdGltZSkuXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBleHBpcnlEYXlzIE51bWJlciBvZiBkYXlzIGFmdGVyIHdoaWNoIHRoZSBjYWNoZWQgZGF0YSBtYXkgYmUgZGVsZXRlZC5cclxuICovXHJcbmNvbnN0IHdyaXRlID0gZnVuY3Rpb24oa2V5LCB2YWwsIHN0YWxlRGF5cywgZXhwaXJ5RGF5cykge1xyXG5cdHRyeSB7XHJcblx0XHRjb25zdCBkZWZhdWx0U3RhbGVEYXlzID0gMTtcclxuXHRcdGNvbnN0IGRlZmF1bHRFeHBpcnlEYXlzID0gMzA7XHJcblx0XHRjb25zdCBtaWxsaXNlY29uZHNQZXJEYXkgPSAyNCo2MCo2MCoxMDAwO1xyXG5cclxuXHRcdGNvbnN0IHN0YWxlRHVyYXRpb24gPSAoc3RhbGVEYXlzIHx8IGRlZmF1bHRTdGFsZURheXMpKm1pbGxpc2Vjb25kc1BlckRheTtcclxuXHRcdGNvbnN0IGV4cGlyeUR1cmF0aW9uID0gKGV4cGlyeURheXMgfHwgZGVmYXVsdEV4cGlyeURheXMpKm1pbGxpc2Vjb25kc1BlckRheTtcclxuXHJcblx0XHRjb25zdCBzdHJpbmdWYWwgPSBKU09OLnN0cmluZ2lmeSh7XHJcblx0XHRcdHZhbHVlOiB2YWwsXHJcblx0XHRcdHN0YWxlRGF0ZTogbmV3IERhdGUoRGF0ZS5ub3coKSArIHN0YWxlRHVyYXRpb24pLnRvSVNPU3RyaW5nKCksXHJcblx0XHRcdGV4cGlyeURhdGU6IG5ldyBEYXRlKERhdGUubm93KCkgKyBleHBpcnlEdXJhdGlvbikudG9JU09TdHJpbmcoKVxyXG5cdFx0fSk7XHJcblx0XHRsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIlJhdGVyLVwiK2tleSwgc3RyaW5nVmFsKTtcclxuXHR9ICBjYXRjaChlKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5XHJcbn07XHJcbi8qKiByZWFkXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcclxuICogQHJldHVybnMge0FycmF5fE9iamVjdHxTdHJpbmd8TnVsbH0gQ2FjaGVkIGFycmF5IG9yIG9iamVjdCwgb3IgZW1wdHkgc3RyaW5nIGlmIG5vdCB5ZXQgY2FjaGVkLFxyXG4gKiAgICAgICAgICBvciBudWxsIGlmIHRoZXJlIHdhcyBlcnJvci5cclxuICovXHJcbmNvbnN0IHJlYWQgPSBmdW5jdGlvbihrZXkpIHtcclxuXHRsZXQgdmFsO1xyXG5cdHRyeSB7XHJcblx0XHRjb25zdCBzdHJpbmdWYWwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlJhdGVyLVwiK2tleSk7XHJcblx0XHRpZiAoIHN0cmluZ1ZhbCAhPT0gXCJcIiApIHtcclxuXHRcdFx0dmFsID0gSlNPTi5wYXJzZShzdHJpbmdWYWwpO1xyXG5cdFx0fVxyXG5cdH0gIGNhdGNoKGUpIHtcclxuXHRcdGNvbnNvbGUubG9nKFwiW1JhdGVyXSBlcnJvciByZWFkaW5nIFwiICsga2V5ICsgXCIgZnJvbSBsb2NhbFN0b3JhZ2UgY2FjaGU6XCIpO1xyXG5cdFx0Y29uc29sZS5sb2coXHJcblx0XHRcdFwiXFx0XCIgKyBlLm5hbWUgKyBcIiBtZXNzYWdlOiBcIiArIGUubWVzc2FnZSArXHJcblx0XHRcdCggZS5hdCA/IFwiIGF0OiBcIiArIGUuYXQgOiBcIlwiKSArXHJcblx0XHRcdCggZS50ZXh0ID8gXCIgdGV4dDogXCIgKyBlLnRleHQgOiBcIlwiKVxyXG5cdFx0KTtcclxuXHR9XHJcblx0cmV0dXJuIHZhbCB8fCBudWxsO1xyXG59O1xyXG5cclxuY29uc3QgaXNSYXRlcktleSA9IGtleSA9PiBrZXkgJiYga2V5LmluZGV4T2YoXCJSYXRlci1cIikgPT09IDA7XHJcblxyXG5jb25zdCBjbGVhckl0ZW1JZkludmFsaWQgPSBmdW5jdGlvbihrZXkpIHtcclxuXHRpZiAoICFpc1JhdGVyS2V5KGtleSkgKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdGNvbnN0IGl0ZW0gPSByZWFkKGtleS5yZXBsYWNlKFwiUmF0ZXItXCIsXCJcIikpO1xyXG5cdGNvbnN0IGlzSW52YWxpZCA9ICFpdGVtIHx8ICFpdGVtLmV4cGlyeURhdGUgfHwgaXNBZnRlckRhdGUoaXRlbS5leHBpcnlEYXRlKTtcclxuXHRpZiAoIGlzSW52YWxpZCApIHtcclxuXHRcdGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XHJcblx0fVxyXG59O1xyXG5cclxuY29uc3QgY2xlYXJJbnZhbGlkSXRlbXMgPSBmdW5jdGlvbigpIHtcclxuXHQvLyBMb29wIGJhY2t3YXJkcyBhcyBsb2NhbFN0b3JhZ2UgbGVuZ3RoIHdpbGwgZGVjcmVhc2UgYXMgaXRlbXMgYXJlIHJlbW92ZWRcclxuXHRmb3IgKGxldCBpID0gbG9jYWxTdG9yYWdlLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcclxuXHRcdHNldFRpbWVvdXQoY2xlYXJJdGVtSWZJbnZhbGlkLCAxMDAsIGxvY2FsU3RvcmFnZS5rZXkoaSkpO1xyXG5cdH1cclxufTtcclxuXHJcbmNvbnN0IGNsZWFyQWxsSXRlbXMgPSBmdW5jdGlvbigpIHtcclxuXHQvLyBMb29wIGJhY2t3YXJkcyBhcyBsb2NhbFN0b3JhZ2UgbGVuZ3RoIHdpbGwgZGVjcmVhc2UgYXMgaXRlbXMgYXJlIHJlbW92ZWRcclxuXHRmb3IgKGxldCBpID0gbG9jYWxTdG9yYWdlLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcclxuXHRcdGxldCBrZXkgPSBsb2NhbFN0b3JhZ2Uua2V5KGkpO1xyXG5cdFx0aWYgKGlzUmF0ZXJLZXkoa2V5KSkge1xyXG5cdFx0XHRsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xyXG5cdFx0fVxyXG5cdH1cclxufTtcclxuXHJcbmV4cG9ydCB7IHdyaXRlLCByZWFkLCBjbGVhckl0ZW1JZkludmFsaWQsIGNsZWFySW52YWxpZEl0ZW1zLCBjbGVhckFsbEl0ZW1zIH07XHJcbi8vIDwvbm93aWtpPiIsIi8vIDxub3dpa2k+XHJcbmNvbnN0IHBhY2thZ2Vqc29uID0gcmVxdWlyZShcIi4uL3BhY2thZ2UuanNvblwiKTtcclxudmFyIHZlcnNpb24gPSBwYWNrYWdlanNvbi52ZXJzaW9uO1xyXG5cclxuLy8gQSBnbG9iYWwgb2JqZWN0IHRoYXQgc3RvcmVzIGFsbCB0aGUgcGFnZSBhbmQgdXNlciBjb25maWd1cmF0aW9uIGFuZCBzZXR0aW5nc1xyXG52YXIgY29uZmlnID0ge1xyXG5cdC8vIFNjcmlwdCBpbmZvXHJcblx0c2NyaXB0OiB7XHJcblx0XHQvLyBBZHZlcnQgdG8gYXBwZW5kIHRvIGVkaXQgc3VtbWFyaWVzXHJcblx0XHRhZHZlcnQ6ICBgIChbW1dQOlJBVEVSIyR7dmVyc2lvbn18UmF0ZXJdXSlgLFxyXG5cdFx0dmVyc2lvbjogdmVyc2lvblxyXG5cdH0sXHJcblx0Ly8gRGVmYXVsdCBwcmVmZXJlbmNlcywgaWYgdXNlciBzdWJwYWdlIHJhdGVyUHJlZnMuanNvbiBkb2VzIG5vdCBleGlzdFxyXG5cdGRlZmF1bHRQcmVmczoge1xyXG5cdFx0XCJhdXRvc3RhcnRcIjogZmFsc2UsXHJcblx0XHRcImF1dG9zdGFydFJlZGlyZWN0c1wiOiBmYWxzZSxcclxuXHRcdFwiYXV0b3N0YXJ0TmFtZXNwYWNlc1wiOiBbMF0sXHJcblx0XHRcIm1pbkZvclNoZWxsXCI6IDEsXHJcblx0XHRcImJ5cGFzc1JlZGlyZWN0c1wiOiB0cnVlLFxyXG5cdFx0XCJhdXRvZmlsbENsYXNzRnJvbU90aGVyc1wiOiB0cnVlLFxyXG5cdFx0XCJhdXRvZmlsbENsYXNzRnJvbU9yZXNcIjogdHJ1ZSxcclxuXHRcdFwiYXV0b2ZpbGxJbXBvcnRhbmNlXCI6IHRydWUsXHJcblx0XHRcImNvbGxhcHNlUGFyYW1zTG93ZXJMaW1pdFwiOiA2LFxyXG5cdFx0XCJ3YXRjaGxpc3RcIjogXCJwcmVmZXJlbmNlc1wiXHJcblx0fSxcclxuXHQvLyBNZWRpYVdpa2kgY29uZmlndXJhdGlvbiB2YWx1ZXNcclxuXHRtdzogbXcuY29uZmlnLmdldCggW1xyXG5cdFx0XCJza2luXCIsXHJcblx0XHRcIndnUGFnZU5hbWVcIixcclxuXHRcdFwid2dOYW1lc3BhY2VOdW1iZXJcIixcclxuXHRcdFwid2dVc2VyTmFtZVwiLFxyXG5cdFx0XCJ3Z0Zvcm1hdHRlZE5hbWVzcGFjZXNcIixcclxuXHRcdFwid2dNb250aE5hbWVzXCIsXHJcblx0XHRcIndnUmV2aXNpb25JZFwiLFxyXG5cdFx0XCJ3Z1NjcmlwdFBhdGhcIixcclxuXHRcdFwid2dTZXJ2ZXJcIixcclxuXHRcdFwid2dDYXRlZ29yaWVzXCIsXHJcblx0XHRcIndnSXNNYWluUGFnZVwiXHJcblx0XSApLFxyXG5cdGJhbm5lckRlZmF1bHRzOiB7XHJcblx0XHRjbGFzc2VzOiBbXHJcblx0XHRcdFwiRkFcIixcclxuXHRcdFx0XCJGTFwiLFxyXG5cdFx0XHRcIkFcIixcclxuXHRcdFx0XCJHQVwiLFxyXG5cdFx0XHRcIkJcIixcclxuXHRcdFx0XCJDXCIsXHJcblx0XHRcdFwiU3RhcnRcIixcclxuXHRcdFx0XCJTdHViXCIsXHJcblx0XHRcdFwiTGlzdFwiXHJcblx0XHRdLFxyXG5cdFx0aW1wb3J0YW5jZXM6IFtcclxuXHRcdFx0XCJUb3BcIixcclxuXHRcdFx0XCJIaWdoXCIsXHJcblx0XHRcdFwiTWlkXCIsXHJcblx0XHRcdFwiTG93XCJcclxuXHRcdF0sXHJcblx0XHRleHRlbmRlZENsYXNzZXM6IFtcclxuXHRcdFx0XCJDYXRlZ29yeVwiLFxyXG5cdFx0XHRcIkRyYWZ0XCIsXHJcblx0XHRcdFwiRmlsZVwiLFxyXG5cdFx0XHRcIkZNXCIsXHJcblx0XHRcdFwiUG9ydGFsXCIsXHJcblx0XHRcdFwiUHJvamVjdFwiLFxyXG5cdFx0XHRcIlRlbXBsYXRlXCIsXHJcblx0XHRcdFwiQnBsdXNcIixcclxuXHRcdFx0XCJGdXR1cmVcIixcclxuXHRcdFx0XCJDdXJyZW50XCIsXHJcblx0XHRcdFwiRGlzYW1iaWdcIixcclxuXHRcdFx0XCJOQVwiLFxyXG5cdFx0XHRcIlJlZGlyZWN0XCIsXHJcblx0XHRcdFwiQm9va1wiXHJcblx0XHRdLFxyXG5cdFx0ZXh0ZW5kZWRJbXBvcnRhbmNlczogW1xyXG5cdFx0XHRcIlRvcFwiLFxyXG5cdFx0XHRcIkhpZ2hcIixcclxuXHRcdFx0XCJNaWRcIixcclxuXHRcdFx0XCJMb3dcIixcclxuXHRcdFx0XCJCb3R0b21cIixcclxuXHRcdFx0XCJOQVwiXHJcblx0XHRdXHJcblx0fSxcclxuXHRjdXN0b21CYW5uZXJzOiB7XHJcblx0XHRcIldpa2lQcm9qZWN0IE1pbGl0YXJ5IGhpc3RvcnlcIjoge1xyXG5cdFx0XHRjbGFzc2VzOiBbXHJcblx0XHRcdFx0XCJGQVwiLFxyXG5cdFx0XHRcdFwiRkxcIixcclxuXHRcdFx0XHRcIkFcIixcclxuXHRcdFx0XHRcIkdBXCIsXHJcblx0XHRcdFx0XCJCXCIsXHJcblx0XHRcdFx0XCJDXCIsXHJcblx0XHRcdFx0XCJTdGFydFwiLFxyXG5cdFx0XHRcdFwiU3R1YlwiLFxyXG5cdFx0XHRcdFwiTGlzdFwiLFxyXG5cdFx0XHRcdFwiQUxcIixcclxuXHRcdFx0XHRcIkJMXCIsXHJcblx0XHRcdFx0XCJDTFwiLFxyXG5cdFx0XHRcdFwiQ2F0ZWdvcnlcIixcclxuXHRcdFx0XHRcIkRyYWZ0XCIsXHJcblx0XHRcdFx0XCJGaWxlXCIsXHJcblx0XHRcdFx0XCJQb3J0YWxcIixcclxuXHRcdFx0XHRcIlByb2plY3RcIixcclxuXHRcdFx0XHRcIlRlbXBsYXRlXCIsXHJcblx0XHRcdFx0XCJEaXNhbWJpZ1wiLFxyXG5cdFx0XHRcdFwiUmVkaXJlY3RcIixcclxuXHRcdFx0XHRcIkJvb2tcIlx0XHRcdFxyXG5cdFx0XHRdLFxyXG5cdFx0XHRpbXBvcnRhbmNlczogW11cclxuXHRcdH0sXHJcblx0XHRcIldpa2lQcm9qZWN0IFBvcnRhbHNcIjoge1xyXG5cdFx0XHRjbGFzc2VzOiBbXHJcblx0XHRcdFx0XCJGUG9cIixcclxuXHRcdFx0XHRcIkNvbXBsZXRlXCIsXHJcblx0XHRcdFx0XCJTdWJzdGFudGlhbFwiLFxyXG5cdFx0XHRcdFwiQmFzaWNcIixcclxuXHRcdFx0XHRcIkluY29tcGxldGVcIixcclxuXHRcdFx0XHRcIk1ldGFcIixcclxuXHRcdFx0XHRcIkxpc3RcIixcclxuXHRcdFx0XHRcIkNhdGVnb3J5XCIsXHJcblx0XHRcdFx0XCJEcmFmdFwiLFxyXG5cdFx0XHRcdFwiRmlsZVwiLFxyXG5cdFx0XHRcdFwiUHJvamVjdFwiLFxyXG5cdFx0XHRcdFwiVGVtcGxhdGVcIixcclxuXHRcdFx0XHRcIkRpc2FtYmlnXCIsXHJcblx0XHRcdFx0XCJOQVwiLFxyXG5cdFx0XHRcdFwiUmVkaXJlY3RcIlxyXG5cdFx0XHRdLFxyXG5cdFx0XHRpbXBvcnRhbmNlczogW1xyXG5cdFx0XHRcdFwiVG9wXCIsXHJcblx0XHRcdFx0XCJIaWdoXCIsXHJcblx0XHRcdFx0XCJNaWRcIixcclxuXHRcdFx0XHRcIkxvd1wiLFxyXG5cdFx0XHRcdFwiQm90dG9tXCIsXHJcblx0XHRcdFx0XCJOQVwiXHJcblx0XHRcdF1cclxuXHRcdH0sXHJcblx0XHRcIldpa2lQcm9qZWN0IFZpZGVvIGdhbWVzXCI6IHtcclxuXHRcdFx0Y2xhc3NlczogW1xyXG5cdFx0XHRcdFwiRkFcIixcIkZMXCIsXCJGTVwiLFwiR0FcIixcIkJcIixcIkNcIixcIlN0YXJ0XCIsXCJTdHViXCIsXCJMaXN0XCIsXCJDYXRlZ29yeVwiLFwiRHJhZnRcIixcIkZpbGVcIixcIlBvcnRhbFwiLFwiUHJvamVjdFwiLFwiVGVtcGxhdGVcIixcIkRpc2FtYmlnXCIsXCJSZWRpcmVjdFwiXHJcblx0XHRcdF0sXHJcblx0XHRcdGltcG9ydGFuY2VzOiBbXHJcblx0XHRcdFx0XCJUb3BcIixcIkhpZ2hcIixcIk1pZFwiLFwiTG93XCIsXCJOQVwiXHJcblx0XHRcdF1cclxuXHRcdH1cclxuXHR9LFxyXG5cdHNoZWxsVGVtcGxhdGVzOiBbXHJcblx0XHRcIldpa2lQcm9qZWN0IGJhbm5lciBzaGVsbFwiLFxyXG5cdFx0XCJXaWtpUHJvamVjdEJhbm5lcnNcIixcclxuXHRcdFwiV2lraVByb2plY3QgQmFubmVyc1wiLFxyXG5cdFx0XCJXUEJcIixcclxuXHRcdFwiV1BCU1wiLFxyXG5cdFx0XCJXaWtpcHJvamVjdGJhbm5lcnNoZWxsXCIsXHJcblx0XHRcIldpa2lQcm9qZWN0IEJhbm5lciBTaGVsbFwiLFxyXG5cdFx0XCJXcGJcIixcclxuXHRcdFwiV1BCYW5uZXJTaGVsbFwiLFxyXG5cdFx0XCJXcGJzXCIsXHJcblx0XHRcIldpa2lwcm9qZWN0YmFubmVyc1wiLFxyXG5cdFx0XCJXUCBCYW5uZXIgU2hlbGxcIixcclxuXHRcdFwiV1AgYmFubmVyIHNoZWxsXCIsXHJcblx0XHRcIkJhbm5lcnNoZWxsXCIsXHJcblx0XHRcIldpa2lwcm9qZWN0IGJhbm5lciBzaGVsbFwiLFxyXG5cdFx0XCJXaWtpUHJvamVjdCBCYW5uZXJzIFNoZWxsXCIsXHJcblx0XHRcIldpa2lQcm9qZWN0QmFubmVyIFNoZWxsXCIsXHJcblx0XHRcIldpa2lQcm9qZWN0QmFubmVyU2hlbGxcIixcclxuXHRcdFwiV2lraVByb2plY3QgQmFubmVyU2hlbGxcIixcclxuXHRcdFwiV2lraXByb2plY3RCYW5uZXJTaGVsbFwiLFxyXG5cdFx0XCJXaWtpUHJvamVjdCBiYW5uZXIgc2hlbGwvcmVkaXJlY3RcIixcclxuXHRcdFwiV2lraVByb2plY3QgU2hlbGxcIixcclxuXHRcdFwiQmFubmVyIHNoZWxsXCIsXHJcblx0XHRcIlNjb3BlIHNoZWxsXCIsXHJcblx0XHRcIlByb2plY3Qgc2hlbGxcIixcclxuXHRcdFwiV2lraVByb2plY3QgYmFubmVyXCJcclxuXHRdLFxyXG5cdGRlZmF1bHRQYXJhbWV0ZXJEYXRhOiB7XHJcblx0XHRcImF1dG9cIjoge1xyXG5cdFx0XHRcImxhYmVsXCI6IHtcclxuXHRcdFx0XHRcImVuXCI6IFwiQXV0by1yYXRlZFwiXHJcblx0XHRcdH0sXHJcblx0XHRcdFwiZGVzY3JpcHRpb25cIjoge1xyXG5cdFx0XHRcdFwiZW5cIjogXCJBdXRvbWF0aWNhbGx5IHJhdGVkIGJ5IGEgYm90LiBBbGxvd2VkIHZhbHVlczogWyd5ZXMnXS5cIlxyXG5cdFx0XHR9LFxyXG5cdFx0XHRcImF1dG92YWx1ZVwiOiBcInllc1wiXHJcblx0XHR9LFxyXG5cdFx0XCJsaXN0YXNcIjoge1xyXG5cdFx0XHRcImxhYmVsXCI6IHtcclxuXHRcdFx0XHRcImVuXCI6IFwiTGlzdCBhc1wiXHJcblx0XHRcdH0sXHJcblx0XHRcdFwiZGVzY3JpcHRpb25cIjoge1xyXG5cdFx0XHRcdFwiZW5cIjogXCJTb3J0a2V5IGZvciB0YWxrIHBhZ2VcIlxyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cdFx0XCJzbWFsbFwiOiB7XHJcblx0XHRcdFwibGFiZWxcIjoge1xyXG5cdFx0XHRcdFwiZW5cIjogXCJTbWFsbD9cIixcclxuXHRcdFx0fSxcclxuXHRcdFx0XCJkZXNjcmlwdGlvblwiOiB7XHJcblx0XHRcdFx0XCJlblwiOiBcIkRpc3BsYXkgYSBzbWFsbCB2ZXJzaW9uLiBBbGxvd2VkIHZhbHVlczogWyd5ZXMnXS5cIlxyXG5cdFx0XHR9LFxyXG5cdFx0XHRcImF1dG92YWx1ZVwiOiBcInllc1wiXHJcblx0XHR9LFxyXG5cdFx0XCJhdHRlbnRpb25cIjoge1xyXG5cdFx0XHRcImxhYmVsXCI6IHtcclxuXHRcdFx0XHRcImVuXCI6IFwiQXR0ZW50aW9uIHJlcXVpcmVkP1wiLFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRcImRlc2NyaXB0aW9uXCI6IHtcclxuXHRcdFx0XHRcImVuXCI6IFwiSW1tZWRpYXRlIGF0dGVudGlvbiByZXF1aXJlZC4gQWxsb3dlZCB2YWx1ZXM6IFsneWVzJ10uXCJcclxuXHRcdFx0fSxcclxuXHRcdFx0XCJhdXRvdmFsdWVcIjogXCJ5ZXNcIlxyXG5cdFx0fSxcclxuXHRcdFwibmVlZHMtaW1hZ2VcIjoge1xyXG5cdFx0XHRcImxhYmVsXCI6IHtcclxuXHRcdFx0XHRcImVuXCI6IFwiTmVlZHMgaW1hZ2U/XCIsXHJcblx0XHRcdH0sXHJcblx0XHRcdFwiZGVzY3JpcHRpb25cIjoge1xyXG5cdFx0XHRcdFwiZW5cIjogXCJSZXF1ZXN0IHRoYXQgYW4gaW1hZ2Ugb3IgcGhvdG9ncmFwaCBvZiB0aGUgc3ViamVjdCBiZSBhZGRlZCB0byB0aGUgYXJ0aWNsZS4gQWxsb3dlZCB2YWx1ZXM6IFsneWVzJ10uXCJcclxuXHRcdFx0fSxcclxuXHRcdFx0XCJhbGlhc2VzXCI6IFtcclxuXHRcdFx0XHRcIm5lZWRzLXBob3RvXCJcclxuXHRcdFx0XSxcclxuXHRcdFx0XCJhdXRvdmFsdWVcIjogXCJ5ZXNcIixcclxuXHRcdFx0XCJzdWdnZXN0ZWRcIjogdHJ1ZVxyXG5cdFx0fSxcclxuXHRcdFwibmVlZHMtaW5mb2JveFwiOiB7XHJcblx0XHRcdFwibGFiZWxcIjoge1xyXG5cdFx0XHRcdFwiZW5cIjogXCJOZWVkcyBpbmZvYm94P1wiLFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRcImRlc2NyaXB0aW9uXCI6IHtcclxuXHRcdFx0XHRcImVuXCI6IFwiUmVxdWVzdCB0aGF0IGFuIGluZm9ib3ggYmUgYWRkZWQgdG8gdGhlIGFydGljbGUuIEFsbG93ZWQgdmFsdWVzOiBbJ3llcyddLlwiXHJcblx0XHRcdH0sXHJcblx0XHRcdFwiYWxpYXNlc1wiOiBbXHJcblx0XHRcdFx0XCJuZWVkcy1waG90b1wiXHJcblx0XHRcdF0sXHJcblx0XHRcdFwiYXV0b3ZhbHVlXCI6IFwieWVzXCIsXHJcblx0XHRcdFwic3VnZ2VzdGVkXCI6IHRydWVcclxuXHRcdH1cclxuXHR9XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjb25maWc7XHJcbi8vIDwvbm93aWtpPiIsIi8vIDxub3dpa2k+XHJcblxyXG4vLyBBdHRyaWJ1dGlvbjogRGlmZiBzdHlsZXMgYmFzZWQgb24gPGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dpa2lwZWRpYTpBdXRvV2lraUJyb3dzZXIvc3R5bGUuY3NzPlxyXG5jb25zdCBzdHlsZXMgPSBgdGFibGUuZGlmZiwgdGQuZGlmZi1vdGl0bGUsIHRkLmRpZmYtbnRpdGxlIHsgdGFibGUtbGF5b3V0OiBhdXRvICFpbXBvcnRhbnQ7OyB9XHJcbnRkLmRpZmYtb3RpdGxlLCB0ZC5kaWZmLW50aXRsZSB7IHRleHQtYWxpZ246IGNlbnRlcjsgfVxyXG50ZC5kaWZmLW1hcmtlciB7IHRleHQtYWxpZ246IHJpZ2h0OyBmb250LXdlaWdodDogYm9sZDsgZm9udC1zaXplOiAxLjI1ZW07IH1cclxudGQuZGlmZi1saW5lbm8geyBmb250LXdlaWdodDogYm9sZDsgfVxyXG50ZC5kaWZmLWFkZGVkbGluZSwgdGQuZGlmZi1kZWxldGVkbGluZSwgdGQuZGlmZi1jb250ZXh0IHsgZm9udC1zaXplOiA4OCU7IHZlcnRpY2FsLWFsaWduOiB0b3A7IHdoaXRlLXNwYWNlOiAtbW96LXByZS13cmFwOyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IH1cclxudGQuZGlmZi1hZGRlZGxpbmUsIHRkLmRpZmYtZGVsZXRlZGxpbmUgeyBib3JkZXItc3R5bGU6IHNvbGlkOyBib3JkZXItd2lkdGg6IDFweCAxcHggMXB4IDRweDsgYm9yZGVyLXJhZGl1czogMC4zM2VtOyB9XHJcbnRkLmRpZmYtYWRkZWRsaW5lIHsgYm9yZGVyLWNvbG9yOiAjYTNkM2ZmOyB9XHJcbnRkLmRpZmYtZGVsZXRlZGxpbmUgeyBib3JkZXItY29sb3I6ICNmZmU0OWM7IH1cclxudGQuZGlmZi1jb250ZXh0IHsgYmFja2dyb3VuZDogI2YzZjNmMzsgY29sb3I6ICMzMzMzMzM7IGJvcmRlci1zdHlsZTogc29saWQ7IGJvcmRlci13aWR0aDogMXB4IDFweCAxcHggNHB4OyBib3JkZXItY29sb3I6ICNlNmU2ZTY7IGJvcmRlci1yYWRpdXM6IDAuMzNlbTsgfVxyXG4uZGlmZmNoYW5nZSB7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IH1cclxudGFibGUuZGlmZiB7XHJcbiAgICBib3JkZXI6IG5vbmU7XHJcbiAgICB3aWR0aDogOTglOyBib3JkZXItc3BhY2luZzogNHB4O1xyXG4gICAgdGFibGUtbGF5b3V0OiBmaXhlZDsgLyogRW5zdXJlcyB0aGF0IGNvbHVtcyBhcmUgb2YgZXF1YWwgd2lkdGggKi9cclxufVxyXG50ZC5kaWZmLWFkZGVkbGluZSAuZGlmZmNoYW5nZSwgdGQuZGlmZi1kZWxldGVkbGluZSAuZGlmZmNoYW5nZSB7IGJvcmRlci1yYWRpdXM6IDAuMzNlbTsgcGFkZGluZzogMC4yNWVtIDA7IH1cclxudGQuZGlmZi1hZGRlZGxpbmUgLmRpZmZjaGFuZ2Uge1x0YmFja2dyb3VuZDogI2Q4ZWNmZjsgfVxyXG50ZC5kaWZmLWRlbGV0ZWRsaW5lIC5kaWZmY2hhbmdlIHsgYmFja2dyb3VuZDogI2ZlZWVjODsgfVxyXG50YWJsZS5kaWZmIHRkIHtcdHBhZGRpbmc6IDAuMzNlbSAwLjY2ZW07IH1cclxudGFibGUuZGlmZiBjb2wuZGlmZi1tYXJrZXIgeyB3aWR0aDogMiU7IH1cclxudGFibGUuZGlmZiBjb2wuZGlmZi1jb250ZW50IHsgd2lkdGg6IDQ4JTsgfVxyXG50YWJsZS5kaWZmIHRkIGRpdiB7XHJcbiAgICAvKiBGb3JjZS13cmFwIHZlcnkgbG9uZyBsaW5lcyBzdWNoIGFzIFVSTHMgb3IgcGFnZS13aWRlbmluZyBjaGFyIHN0cmluZ3MuICovXHJcbiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XHJcbiAgICAvKiBBcyBmYWxsYmFjayAoRkY8My41LCBPcGVyYSA8MTAuNSksIHNjcm9sbGJhcnMgd2lsbCBiZSBhZGRlZCBmb3IgdmVyeSB3aWRlIGNlbGxzXHJcbiAgICAgICAgaW5zdGVhZCBvZiB0ZXh0IG92ZXJmbG93aW5nIG9yIHdpZGVuaW5nICovXHJcbiAgICBvdmVyZmxvdzogYXV0bztcclxufWAgK1xyXG5cclxuLy8gT3ZlcnJpZGUgT09VSSB3aW5kb3cgbWFuYWdlciBwcmV2ZW50aW5nIGJhY2tncm91bmQgc2Nyb2xsaW5nL2ludGVyYWN0aW9uXHJcbmBodG1sIGJvZHkucmF0ZXItbWFpbldpbmRvdy1vcGVuIHtcclxuXHRwb3NpdGlvbjogdW5zZXQ7XHJcblx0b3ZlcmZsb3c6IHVuc2V0O1xyXG59XHJcbmh0bWwgYm9keS5yYXRlci1tYWluV2luZG93LW9wZW4gLm9vLXVpLXdpbmRvd01hbmFnZXItbW9kYWwgPiAub28tdWktZGlhbG9nLm9vLXVpLXdpbmRvdy1hY3RpdmUge1xyXG4gICAgcG9zaXRpb246IHN0YXRpYztcclxuICAgIHBhZGRpbmc6IDA7XHJcbn1gICtcclxuLy8gSW5jcmVhc2Ugei1pbmRleCwgdG8gYmUgYWJvdmUgc2tpbiBtZW51cyBldGM7IHNtb290aCB0cmFuc2l0aW9uIGZvciBkcmFnZ2luZyAodHJhbnNmb3JtOnRyYW5zbGF0ZSlcclxuYGh0bWwgYm9keS5yYXRlci1tYWluV2luZG93LW9wZW4gLm9vLXVpLWRpYWxvZy5vby11aS13aW5kb3ctYWN0aXZlID4gZGl2IHtcclxuICAgIHotaW5kZXg6IDExMDtcclxuICAgIHRyYW5zaXRpb246IGFsbCAwLjI1cyBlYXNlLW91dCAwcywgdHJhbnNmb3JtIDBzICFpbXBvcnRhbnRcclxufVxyXG5gICsgXHJcbi8vIEVuc3VyZSBjbG9zZSBkaWFsb2cgaXMgdmlzaWJsZVxyXG5gaHRtbCBib2R5LnJhdGVyLW1haW5XaW5kb3ctb3BlbiAjbXctdGVsZXBvcnQtdGFyZ2V0IHtcclxuICAgIHRvcDogMDtcclxuICAgIGJvdHRvbTogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICByaWdodDowO1xyXG59XHJcbmA7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBzdHlsZXM7XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCBBUEksIHsgbWFrZUVycm9yTXNnIH0gZnJvbSBcIi4vYXBpXCI7XHJcbmltcG9ydCB7IGlzQWZ0ZXJEYXRlIH0gZnJvbSBcIi4vdXRpbFwiO1xyXG5pbXBvcnQgKiBhcyBjYWNoZSBmcm9tIFwiLi9jYWNoZVwiO1xyXG4vLyA8bm93aWtpPlxyXG5cclxudmFyIGNhY2hlQmFubmVycyA9IGZ1bmN0aW9uKGJhbm5lcnMpIHtcclxuXHRjYWNoZS53cml0ZShcImJhbm5lcnNcIiwgYmFubmVycywgMiwgNjApO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEdldHMgYmFubmVycy9vcHRpb25zIGZyb20gdGhlIEFwaVxyXG4gKiBcclxuICogQHJldHVybnMge1Byb21pc2V9IFJlc29sdmVkIHdpdGg6IGJhbm5lcnMgb2JqZWN0LCBiYW5uZXJPcHRpb25zIGFycmF5XHJcbiAqL1xyXG52YXIgZ2V0TGlzdE9mQmFubmVyc0Zyb21BcGkgPSBmdW5jdGlvbigpIHtcclxuXHJcblx0dmFyIGZpbmlzaGVkUHJvbWlzZSA9ICQuRGVmZXJyZWQoKTtcclxuXHJcblx0dmFyIHF1ZXJ5U2tlbGV0b24gPSB7XHJcblx0XHRhY3Rpb246IFwicXVlcnlcIixcclxuXHRcdGZvcm1hdDogXCJqc29uXCIsXHJcblx0XHRsaXN0OiBcImNhdGVnb3J5bWVtYmVyc1wiLFxyXG5cdFx0Y21wcm9wOiBcInRpdGxlXCIsXHJcblx0XHRjbW5hbWVzcGFjZTogXCIxMFwiLFxyXG5cdFx0Y21saW1pdDogXCI1MDBcIlxyXG5cdH07XHJcblxyXG5cdHZhciBjYXRlZ29yaWVzID0gW1xyXG5cdFx0e1xyXG5cdFx0XHR0aXRsZTogXCJDYXRlZ29yeTpXaWtpUHJvamVjdCBiYW5uZXJzIHdpdGggcXVhbGl0eSBhc3Nlc3NtZW50XCIsXHJcblx0XHRcdGFiYnJldmlhdGlvbjogXCJ3aXRoUmF0aW5nc1wiLFxyXG5cdFx0XHRiYW5uZXJzOiBbXSxcclxuXHRcdFx0cHJvY2Vzc2VkOiAkLkRlZmVycmVkKClcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdHRpdGxlOiBcIkNhdGVnb3J5Oldpa2lQcm9qZWN0IGJhbm5lcnMgd2l0aG91dCBxdWFsaXR5IGFzc2Vzc21lbnRcIixcclxuXHRcdFx0YWJicmV2aWF0aW9uOiBcIndpdGhvdXRSYXRpbmdzXCIsXHJcblx0XHRcdGJhbm5lcnM6IFtdLFxyXG5cdFx0XHRwcm9jZXNzZWQ6ICQuRGVmZXJyZWQoKVxyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0dGl0bGU6IFwiQ2F0ZWdvcnk6V2lraVByb2plY3QgYmFubmVyIHdyYXBwZXIgdGVtcGxhdGVzXCIsXHJcblx0XHRcdGFiYnJldmlhdGlvbjogXCJ3cmFwcGVyc1wiLFxyXG5cdFx0XHRiYW5uZXJzOiBbXSxcclxuXHRcdFx0cHJvY2Vzc2VkOiAkLkRlZmVycmVkKClcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdHRpdGxlOiBcIkNhdGVnb3J5Oldpa2lQcm9qZWN0IGJhbm5lciB0ZW1wbGF0ZXMgbm90IGJhc2VkIG9uIFdQQmFubmVyTWV0YVwiLFxyXG5cdFx0XHRhYmJyZXZpYXRpb246IFwibm90V1BCTVwiLFxyXG5cdFx0XHRiYW5uZXJzOiBbXSxcclxuXHRcdFx0cHJvY2Vzc2VkOiAkLkRlZmVycmVkKClcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdHRpdGxlOiBcIkNhdGVnb3J5OkluYWN0aXZlIFdpa2lQcm9qZWN0IGJhbm5lcnNcIixcclxuXHRcdFx0YWJicmV2aWF0aW9uOiBcImluYWN0aXZlXCIsXHJcblx0XHRcdGJhbm5lcnM6IFtdLFxyXG5cdFx0XHRwcm9jZXNzZWQ6ICQuRGVmZXJyZWQoKVxyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0dGl0bGU6IFwiQ2F0ZWdvcnk6V3JhcHBlciB0ZW1wbGF0ZXMgZm9yIFdpa2lQcm9qZWN0IFdvbWVuIGluIFJlZFwiLFxyXG5cdFx0XHRhYmJyZXZpYXRpb246IFwid2lyXCIsXHJcblx0XHRcdGJhbm5lcnM6IFtdLFxyXG5cdFx0XHRwcm9jZXNzZWQ6ICQuRGVmZXJyZWQoKVxyXG5cdFx0fVxyXG5cdF07XHJcblxyXG5cdHZhciBwcm9jZXNzUXVlcnkgPSBmdW5jdGlvbihyZXN1bHQsIGNhdEluZGV4KSB7XHJcblx0XHRpZiAoICFyZXN1bHQucXVlcnkgfHwgIXJlc3VsdC5xdWVyeS5jYXRlZ29yeW1lbWJlcnMgKSB7XHJcblx0XHRcdC8vIE5vIHJlc3VsdHNcclxuXHRcdFx0Ly8gVE9ETzogZXJyb3Igb3Igd2FybmluZyAqKioqKioqKlxyXG5cdFx0XHRmaW5pc2hlZFByb21pc2UucmVqZWN0KCk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0Ly8gR2F0aGVyIHRpdGxlcyBpbnRvIGFycmF5IC0gZXhjbHVkaW5nIFwiVGVtcGxhdGU6XCIgcHJlZml4XHJcblx0XHR2YXIgcmVzdWx0VGl0bGVzID0gcmVzdWx0LnF1ZXJ5LmNhdGVnb3J5bWVtYmVycy5tYXAoZnVuY3Rpb24oaW5mbykge1xyXG5cdFx0XHRyZXR1cm4gaW5mby50aXRsZS5zbGljZSg5KTtcclxuXHRcdH0pO1xyXG5cdFx0QXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoY2F0ZWdvcmllc1tjYXRJbmRleF0uYmFubmVycywgcmVzdWx0VGl0bGVzKTtcclxuXHRcdFxyXG5cdFx0Ly8gQ29udGludWUgcXVlcnkgaWYgbmVlZGVkXHJcblx0XHRpZiAoIHJlc3VsdC5jb250aW51ZSApIHtcclxuXHRcdFx0ZG9BcGlRdWVyeSgkLmV4dGVuZChjYXRlZ29yaWVzW2NhdEluZGV4XS5xdWVyeSwgcmVzdWx0LmNvbnRpbnVlKSwgY2F0SW5kZXgpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRcclxuXHRcdGNhdGVnb3JpZXNbY2F0SW5kZXhdLnByb2Nlc3NlZC5yZXNvbHZlKCk7XHJcblx0fTtcclxuXHJcblx0dmFyIGRvQXBpUXVlcnkgPSBmdW5jdGlvbihxLCBjYXRJbmRleCkge1xyXG5cdFx0QVBJLmdldCggcSApXHJcblx0XHRcdC5kb25lKCBmdW5jdGlvbihyZXN1bHQpIHtcclxuXHRcdFx0XHRwcm9jZXNzUXVlcnkocmVzdWx0LCBjYXRJbmRleCk7XHJcblx0XHRcdH0gKVxyXG5cdFx0XHQuZmFpbCggZnVuY3Rpb24oY29kZSwganF4aHIpIHtcclxuXHRcdFx0XHRjb25zb2xlLndhcm4oXCJbUmF0ZXJdIFwiICsgbWFrZUVycm9yTXNnKGNvZGUsIGpxeGhyLCBcIkNvdWxkIG5vdCByZXRyaWV2ZSBwYWdlcyBmcm9tIFtbOlwiICsgcS5jbXRpdGxlICsgXCJdXVwiKSk7XHJcblx0XHRcdFx0ZmluaXNoZWRQcm9taXNlLnJlamVjdCgpO1xyXG5cdFx0XHR9ICk7XHJcblx0fTtcclxuXHRcclxuXHRjYXRlZ29yaWVzLmZvckVhY2goZnVuY3Rpb24oY2F0LCBpbmRleCwgYXJyKSB7XHJcblx0XHRjYXQucXVlcnkgPSAkLmV4dGVuZCggeyBcImNtdGl0bGVcIjpjYXQudGl0bGUgfSwgcXVlcnlTa2VsZXRvbiApO1xyXG5cdFx0JC53aGVuKCBhcnJbaW5kZXgtMV0gJiYgYXJyW2luZGV4LTFdLnByb2Nlc3NlZCB8fCB0cnVlICkudGhlbihmdW5jdGlvbigpe1xyXG5cdFx0XHRkb0FwaVF1ZXJ5KGNhdC5xdWVyeSwgaW5kZXgpO1xyXG5cdFx0fSk7XHJcblx0fSk7XHJcblx0XHJcblx0Y2F0ZWdvcmllc1tjYXRlZ29yaWVzLmxlbmd0aC0xXS5wcm9jZXNzZWQudGhlbihmdW5jdGlvbigpe1xyXG5cdFx0bGV0IGJhbm5lcnMgPSB7fTtcclxuXHRcdGNhdGVnb3JpZXMuZm9yRWFjaChjYXRPYmplY3QgPT4ge1xyXG5cdFx0XHRiYW5uZXJzW2NhdE9iamVjdC5hYmJyZXZpYXRpb25dID0gY2F0T2JqZWN0LmJhbm5lcnM7XHJcblx0XHR9KTtcclxuXHRcdFxyXG5cdFx0ZmluaXNoZWRQcm9taXNlLnJlc29sdmUoYmFubmVycyk7XHJcblx0fSk7XHJcblx0XHJcblx0cmV0dXJuIGZpbmlzaGVkUHJvbWlzZTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBHZXRzIGJhbm5lcnMgZnJvbSBjYWNoZSwgaWYgdGhlcmUgYW5kIG5vdCB0b28gb2xkXHJcbiAqIFxyXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gUmVzb2x2ZWQgd2l0aCBiYW5uZXJzIG9iamVjdFxyXG4gKi9cclxudmFyIGdldEJhbm5lcnNGcm9tQ2FjaGUgPSBmdW5jdGlvbigpIHtcclxuXHR2YXIgY2FjaGVkQmFubmVycyA9IGNhY2hlLnJlYWQoXCJiYW5uZXJzXCIpO1xyXG5cdGlmIChcclxuXHRcdCFjYWNoZWRCYW5uZXJzIHx8XHJcblx0XHQhY2FjaGVkQmFubmVycy52YWx1ZSB8fFxyXG5cdFx0IWNhY2hlZEJhbm5lcnMuc3RhbGVEYXRlXHJcblx0KSB7XHJcblx0XHRyZXR1cm4gJC5EZWZlcnJlZCgpLnJlamVjdCgpO1xyXG5cdH1cclxuXHRpZiAoIGlzQWZ0ZXJEYXRlKGNhY2hlZEJhbm5lcnMuc3RhbGVEYXRlKSApIHtcclxuXHRcdC8vIFVwZGF0ZSBpbiB0aGUgYmFja2dyb3VuZDsgc3RpbGwgdXNlIG9sZCBsaXN0IHVudGlsIHRoZW4gIFxyXG5cdFx0Z2V0TGlzdE9mQmFubmVyc0Zyb21BcGkoKS50aGVuKGNhY2hlQmFubmVycyk7XHJcblx0fVxyXG5cdHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZShjYWNoZWRCYW5uZXJzLnZhbHVlKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBHZXRzIGJhbm5lciBuYW1lcywgZ3JvdXBlZCBieSB0eXBlICh3aXRoUmF0aW5ncywgd2l0aG91dFJhdGluZ3MsIHdyYXBwZXJzLCBub3RXUEJNKVxyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBPYmplY3Qgb2Ygc3RyaW5nIGFycmF5cyBrZXllZCBieSB0eXBlICh3aXRoUmF0aW5ncywgd2l0aG91dFJhdGluZ3MsIHdyYXBwZXJzLCBub3RXUEJNKVxyXG4gKi9cclxudmFyIGdldEJhbm5lck5hbWVzID0gKCkgPT4gZ2V0QmFubmVyc0Zyb21DYWNoZSgpXHJcblx0LnRoZW4oIGJhbm5lcnMgPT4ge1xyXG5cdFx0Ly8gRW5zdXJlIGFsbCBrZXlzIGV4aXN0XHJcblx0XHRpZiAoIWJhbm5lcnMud2l0aFJhdGluZ3MgfHwgIWJhbm5lcnMud2l0aG91dFJhdGluZ3MgfHwgIWJhbm5lcnMud3JhcHBlcnMgfHwgIWJhbm5lcnMubm90V1BCTSB8fCAhYmFubmVycy5pbmFjdGl2ZSB8fCAhYmFubmVycy53aXIpIHtcclxuXHRcdFx0Z2V0TGlzdE9mQmFubmVyc0Zyb21BcGkoKS50aGVuKGNhY2hlQmFubmVycyk7XHJcblx0XHRcdHJldHVybiAkLmV4dGVuZChcclxuXHRcdFx0XHR7IHdpdGhSYXRpbmdzOiBbXSwgd2l0aG91dFJhdGluZ3M6IFtdLCB3cmFwcGVyczogW10sIG5vdFdQQk06IFtdLCBpbmFjdGl2ZTogW10sIHdpcjogW10gfSxcclxuXHRcdFx0XHRiYW5uZXJzXHJcblx0XHRcdCk7XHJcblx0XHR9XHJcblx0XHQvLyBTdWNjZXNzOiBwYXNzIHRocm91Z2hcclxuXHRcdHJldHVybiBiYW5uZXJzO1xyXG5cdH0gKVxyXG5cdC5jYXRjaCggKCkgPT4ge1xyXG5cdFx0Ly8gRmFpbHVyZTogZ2V0IGZyb20gQXBpLCB0aGVuIGNhY2hlIHRoZW1cclxuXHRcdGxldCBiYW5uZXJzUHJvbWlzZSA9IGdldExpc3RPZkJhbm5lcnNGcm9tQXBpKCk7XHJcblx0XHRiYW5uZXJzUHJvbWlzZS50aGVuKGNhY2hlQmFubmVycyk7XHJcblx0XHRyZXR1cm4gYmFubmVyc1Byb21pc2U7XHJcblx0fSApO1xyXG5cclxuZXhwb3J0IHsgZ2V0QmFubmVyTmFtZXMgfTtcclxuLy8gPC9ub3dpa2k+IiwiaW1wb3J0IEFQSSBmcm9tIFwiLi9hcGlcIjtcclxuaW1wb3J0IHsgaXNBZnRlckRhdGUgfSBmcm9tIFwiLi91dGlsXCI7XHJcbmltcG9ydCBjb25maWcgZnJvbSBcIi4vY29uZmlnXCI7XHJcbmltcG9ydCAqIGFzIGNhY2hlIGZyb20gXCIuL2NhY2hlXCI7XHJcbi8vIDxub3dpa2k+XHJcblxyXG5jb25zdCBwcmVmc1BhZ2UgPSBgVXNlcjoke213LmNvbmZpZy5nZXQoXCJ3Z1VzZXJOYW1lXCIpfS9yYXRlclByZWZzLmpzb25gO1xyXG5cclxuY29uc3Qgd3JpdGVQcmVmc1RvQ2FjaGUgPSBwcmVmcyA9PiBjYWNoZS53cml0ZShcclxuXHRcInByZWZzXCIsXHJcblx0cHJlZnMsXHJcblx0KDEvMjQvNjApKjEsIC8vIDEgbWluXHJcblx0KDEvMjQvNjApKjEgIC8vIDEgbWluXHJcbik7XHJcblxyXG5jb25zdCBnZXRQcmVmc0Zyb21BcGkgPSBmdW5jdGlvbigpIHtcclxuXHRyZXR1cm4gQVBJLmdldCh7XHJcblx0XHRcImFjdGlvblwiOiBcInF1ZXJ5XCIsXHJcblx0XHRcImZvcm1hdFwiOiBcImpzb25cIixcclxuXHRcdFwicHJvcFwiOiBcInJldmlzaW9uc1wiLFxyXG5cdFx0XCJ0aXRsZXNcIjogcHJlZnNQYWdlLFxyXG5cdFx0XCJydnByb3BcIjogXCJjb250ZW50XCIsXHJcblx0XHRcInJ2c2xvdHNcIjogXCJtYWluXCJcclxuXHR9KS50aGVuKHJlc3BvbnNlID0+IHtcclxuXHRcdGNvbnN0IHBhZ2UgPSByZXNwb25zZS5xdWVyeS5wYWdlc1tPYmplY3Qua2V5cyhyZXNwb25zZS5xdWVyeS5wYWdlcylbMF1dO1xyXG5cdFx0aWYgKCFwYWdlLnBhZ2VpZCB8fCBwYWdlLm1pc3Npbmc9PT1cIlwiKSB7XHJcblx0XHRcdHJldHVybiBjb25maWcuZGVmYXVsdFByZWZzO1xyXG5cdFx0fVxyXG5cdFx0bGV0IHByZWZzO1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0cHJlZnMgPSBKU09OLnBhcnNlKCBwYWdlLnJldmlzaW9uc1swXS5zbG90cy5tYWluW1wiKlwiXSApO1xyXG5cdFx0fSBjYXRjaChlKSB7XHJcblx0XHRcdHJldHVybiAkLkRlZmVycmVkKCkucmVqZWN0KFwiSlNPTi1wYXJzaW5nLWVycm9yXCIsIGUpO1xyXG5cdFx0fVxyXG5cdFx0d3JpdGVQcmVmc1RvQ2FjaGUocHJlZnMpO1xyXG5cdFx0cmV0dXJuIHByZWZzO1xyXG5cdH0pO1xyXG59O1xyXG5cclxuY29uc3QgZ2V0UHJlZnNGcm9tQ2FjaGUgPSBmdW5jdGlvbigpIHtcclxuXHR2YXIgY2FjaGVkUHJlZnMgPSBjYWNoZS5yZWFkKFwicHJlZnNcIik7XHJcblx0aWYgKFxyXG5cdFx0IWNhY2hlZFByZWZzIHx8XHJcblx0XHQhY2FjaGVkUHJlZnMudmFsdWUgfHxcclxuXHRcdCFjYWNoZWRQcmVmcy5zdGFsZURhdGUgfHxcclxuXHRcdGlzQWZ0ZXJEYXRlKGNhY2hlZFByZWZzLnN0YWxlRGF0ZSlcclxuXHQpIHtcclxuXHRcdC8vIE5vIGNhY2hlZCB2YWx1ZSwgb3IgaXMgdG9vIG9sZFxyXG5cdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZWplY3QoKTtcclxuXHR9XHJcblx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlKGNhY2hlZFByZWZzLnZhbHVlKTtcclxufTtcclxuXHJcbmNvbnN0IGdldFByZWZzID0gKCkgPT4gZ2V0UHJlZnNGcm9tQ2FjaGUoKS50aGVuKFxyXG5cdC8vIFN1Y2Nlc3M6IHBhc3MgdGhyb3VnaCAoZmlyc3QgcGFyYW0gb25seSlcclxuXHRwcmVmcyA9PiAkLkRlZmVycmVkKCkucmVzb2x2ZShwcmVmcyksXHJcblx0Ly8gRmFpbHVyZTogZ2V0IGZyb20gQXBpXHJcblx0KCkgPT4gZ2V0UHJlZnNGcm9tQXBpKClcclxuKTtcclxuXHJcbi8qKlxyXG4gKiBcclxuICogQHBhcmFtIHtPYmplY3R9IHVwZGF0ZWRQcmVmcyBvYmplY3Qgd2l0aCBrZXk6dmFsdWUgcGFpcnMgZm9yIHByZWZlcmVuY2VzIGpzb24uXHJcbiAqL1xyXG5jb25zdCBzZXRQcmVmcyA9IGZ1bmN0aW9uKHVwZGF0ZWRQcmVmcykge1xyXG5cdHJldHVybiBBUEkuZWRpdFdpdGhSZXRyeShwcmVmc1BhZ2UsXHRudWxsLFxyXG5cdFx0KCkgPT4gKHtcclxuXHRcdFx0XCJ0ZXh0XCI6IEpTT04uc3RyaW5naWZ5KHVwZGF0ZWRQcmVmcyksXHJcblx0XHRcdFwic3VtbWFyeVwiOiBcIlNhdmluZyBSYXRlciBwcmVmZXJlbmNlcyBcIiArIGNvbmZpZy5zY3JpcHQuYWR2ZXJ0XHJcblx0XHR9KVxyXG5cdClcclxuXHRcdC50aGVuKCAoKSA9PiB3cml0ZVByZWZzVG9DYWNoZSh1cGRhdGVkUHJlZnMpICk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCAoe2dldDogZ2V0UHJlZnMsIHNldDogc2V0UHJlZnN9KTtcclxuZXhwb3J0IHsgZ2V0UHJlZnMsIHNldFByZWZzIH07XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCBjb25maWcgZnJvbSBcIi4vY29uZmlnXCI7XHJcbmltcG9ydCBBUEkgZnJvbSBcIi4vYXBpXCI7XHJcbmltcG9ydCB7IHBhcnNlVGVtcGxhdGVzLCBnZXRXaXRoUmVkaXJlY3RUbyB9IGZyb20gXCIuL1RlbXBsYXRlXCI7XHJcbmltcG9ydCB7Z2V0QmFubmVyTmFtZXN9IGZyb20gXCIuL2dldEJhbm5lcnNcIjtcclxuaW1wb3J0ICogYXMgY2FjaGUgZnJvbSBcIi4vY2FjaGVcIjtcclxuaW1wb3J0IHdpbmRvd01hbmFnZXIgZnJvbSBcIi4vd2luZG93TWFuYWdlclwiO1xyXG5pbXBvcnQgeyBnZXRQcmVmcyB9IGZyb20gXCIuL3ByZWZzXCI7XHJcbmltcG9ydCB7IGZpbHRlckFuZE1hcCB9IGZyb20gXCIuL3V0aWxcIjtcclxuLy8gPG5vd2lraT5cclxuXHJcbnZhciBzZXR1cFJhdGVyID0gZnVuY3Rpb24oY2xpY2tFdmVudCkge1xyXG5cdGlmICggY2xpY2tFdmVudCApIHtcclxuXHRcdGNsaWNrRXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHR9XHJcblxyXG5cdHZhciBzZXR1cENvbXBsZXRlZFByb21pc2UgPSAkLkRlZmVycmVkKCk7XHJcbiAgICBcclxuXHR2YXIgY3VycmVudFBhZ2UgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dChjb25maWcubXcud2dQYWdlTmFtZSk7XHJcblx0dmFyIHRhbGtQYWdlID0gY3VycmVudFBhZ2UgJiYgY3VycmVudFBhZ2UuZ2V0VGFsa1BhZ2UoKTtcclxuXHR2YXIgc3ViamVjdFBhZ2UgPSBjdXJyZW50UGFnZSAmJiBjdXJyZW50UGFnZS5nZXRTdWJqZWN0UGFnZSgpO1xyXG5cdHZhciBzdWJqZWN0SXNBcnRpY2xlID0gY29uZmlnLm13LndnTmFtZXNwYWNlTnVtYmVyIDw9IDE7XHJcbiBcclxuXHQvLyBHZXQgcHJlZmVyZW5jZXMgKHRhc2sgMClcclxuXHR2YXIgcHJlZnNQcm9taXNlID0gZ2V0UHJlZnMoKTtcclxuXHJcblx0Ly8gR2V0IGxpc3RzIG9mIGFsbCBiYW5uZXJzICh0YXNrIDEpXHJcblx0dmFyIGJhbm5lcnNQcm9taXNlID0gZ2V0QmFubmVyTmFtZXMoKTtcclxuXHJcblx0Ly8gTG9hZCB0YWxrIHBhZ2UgKHRhc2sgMilcclxuXHR2YXIgbG9hZFRhbGtQcm9taXNlID0gQVBJLmdldCgge1xyXG5cdFx0YWN0aW9uOiBcInF1ZXJ5XCIsXHJcblx0XHRwcm9wOiBcInJldmlzaW9uc1wiLFxyXG5cdFx0cnZwcm9wOiBcImNvbnRlbnRcIixcclxuXHRcdHJ2c2VjdGlvbjogXCIwXCIsXHJcblx0XHR0aXRsZXM6IHRhbGtQYWdlLmdldFByZWZpeGVkVGV4dCgpLFxyXG5cdFx0aW5kZXhwYWdlaWRzOiAxXHJcblx0fSApLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG5cdFx0dmFyIGlkID0gcmVzdWx0LnF1ZXJ5LnBhZ2VpZHM7XHRcdFxyXG5cdFx0dmFyIHdpa2l0ZXh0ID0gKCBpZCA8IDAgKSA/IFwiXCIgOiByZXN1bHQucXVlcnkucGFnZXNbaWRdLnJldmlzaW9uc1swXVtcIipcIl07XHJcblx0XHRyZXR1cm4gd2lraXRleHQ7XHJcblx0fSk7XHJcblxyXG5cdC8vIFBhcnNlIHRhbGsgcGFnZSBmb3IgYmFubmVycyAodGFzayAzKVxyXG5cdHZhciBwYXJzZVRhbGtQcm9taXNlID0gbG9hZFRhbGtQcm9taXNlLnRoZW4od2lraXRleHQgPT4gcGFyc2VUZW1wbGF0ZXMod2lraXRleHQsIHRydWUpKSAvLyBHZXQgYWxsIHRlbXBsYXRlc1xyXG5cdFx0LnRoZW4odGVtcGxhdGVzID0+IHRlbXBsYXRlcy5maWx0ZXIodGVtcGxhdGUgPT4gdGVtcGxhdGUuZ2V0VGl0bGUoKSAhPT0gbnVsbCkpIC8vIEZpbHRlciBvdXQgaW52YWxpZCB0ZW1wbGF0ZXMgKGUuZy4gcGFyc2VyIGZ1bmN0aW9ucylcclxuXHRcdC50aGVuKHRlbXBsYXRlcyA9PiBnZXRXaXRoUmVkaXJlY3RUbyh0ZW1wbGF0ZXMpKSAvLyBDaGVjayBmb3IgcmVkaXJlY3RzXHJcblx0XHQudGhlbih0ZW1wbGF0ZXMgPT4ge1xyXG5cdFx0XHRyZXR1cm4gYmFubmVyc1Byb21pc2UudGhlbigoYWxsQmFubmVycykgPT4geyAvLyBHZXQgbGlzdCBvZiBhbGwgYmFubmVyIHRlbXBsYXRlc1xyXG5cdFx0XHRcdHJldHVybiBmaWx0ZXJBbmRNYXAoXHJcblx0XHRcdFx0XHR0ZW1wbGF0ZXMsIFx0XHRcdFxyXG5cdFx0XHRcdFx0Ly8gRmlsdGVyIG91dCBub24tYmFubmVyc1xyXG5cdFx0XHRcdFx0dGVtcGxhdGUgPT4geyBcclxuXHRcdFx0XHRcdFx0aWYgKHRlbXBsYXRlLmlzU2hlbGxUZW1wbGF0ZSgpKSB7IHJldHVybiB0cnVlOyB9XHJcblx0XHRcdFx0XHRcdHZhciBtYWluVGV4dCA9IHRlbXBsYXRlLnJlZGlyZWN0VGFyZ2V0XHJcblx0XHRcdFx0XHRcdFx0PyB0ZW1wbGF0ZS5yZWRpcmVjdFRhcmdldC5nZXRNYWluVGV4dCgpXHJcblx0XHRcdFx0XHRcdFx0OiB0ZW1wbGF0ZS5nZXRUaXRsZSgpLmdldE1haW5UZXh0KCk7XHJcblx0XHRcdFx0XHRcdHJldHVybiBhbGxCYW5uZXJzLndpdGhSYXRpbmdzLmluY2x1ZGVzKG1haW5UZXh0KSB8fCBcclxuXHRcdFx0XHRcdFx0YWxsQmFubmVycy53aXRob3V0UmF0aW5ncy5pbmNsdWRlcyhtYWluVGV4dCkgfHxcclxuXHRcdFx0XHRcdFx0YWxsQmFubmVycy53cmFwcGVycy5pbmNsdWRlcyhtYWluVGV4dCkgfHxcclxuXHRcdFx0XHRcdFx0YWxsQmFubmVycy5ub3RXUEJNLmluY2x1ZGVzKG1haW5UZXh0KSB8fFxyXG5cdFx0XHRcdFx0XHRhbGxCYW5uZXJzLmluYWN0aXZlLmluY2x1ZGVzKG1haW5UZXh0KSB8fFxyXG5cdFx0XHRcdFx0XHRhbGxCYW5uZXJzLndpci5pbmNsdWRlcyhtYWluVGV4dCk7XHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0Ly8gU2V0IGFkZGl0aW9uYWwgcHJvcGVydGllcyBpZiBuZWVkZWRcclxuXHRcdFx0XHRcdHRlbXBsYXRlID0+IHtcclxuXHRcdFx0XHRcdFx0dmFyIG1haW5UZXh0ID0gdGVtcGxhdGUucmVkaXJlY3RUYXJnZXRcclxuXHRcdFx0XHRcdFx0XHQ/IHRlbXBsYXRlLnJlZGlyZWN0VGFyZ2V0LmdldE1haW5UZXh0KClcclxuXHRcdFx0XHRcdFx0XHQ6IHRlbXBsYXRlLmdldFRpdGxlKCkuZ2V0TWFpblRleHQoKTtcclxuXHRcdFx0XHRcdFx0aWYgKGFsbEJhbm5lcnMud3JhcHBlcnMuaW5jbHVkZXMobWFpblRleHQpKSB7XHJcblx0XHRcdFx0XHRcdFx0dGVtcGxhdGUucmVkaXJlY3RUYXJnZXQgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dChcIlRlbXBsYXRlOlN1YnN0OlwiICsgbWFpblRleHQpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRhbGxCYW5uZXJzLndpdGhvdXRSYXRpbmdzLmluY2x1ZGVzKG1haW5UZXh0KSB8fFxyXG5cdFx0XHRcdFx0XHRcdGFsbEJhbm5lcnMud2lyLmluY2x1ZGVzKG1haW5UZXh0KVxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHR0ZW1wbGF0ZS53aXRob3V0UmF0aW5ncyA9IHRydWU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYgKCBhbGxCYW5uZXJzLmluYWN0aXZlLmluY2x1ZGVzKG1haW5UZXh0KSApIHtcclxuXHRcdFx0XHRcdFx0XHR0ZW1wbGF0ZS5pbmFjdGl2ZVByb2plY3QgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdHJldHVybiB0ZW1wbGF0ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdFxyXG5cdC8vIFJldHJpZXZlIGFuZCBzdG9yZSBjbGFzc2VzLCBpbXBvcnRhbmNlcywgYW5kIFRlbXBsYXRlRGF0YSAodGFzayA0KVxyXG5cdHZhciB0ZW1wbGF0ZURldGFpbHNQcm9taXNlID0gcGFyc2VUYWxrUHJvbWlzZS50aGVuKGZ1bmN0aW9uKHRlbXBsYXRlcykge1xyXG5cdFx0Ly8gV2FpdCBmb3IgYWxsIHByb21pc2VzIHRvIHJlc29sdmVcclxuXHRcdHJldHVybiAkLndoZW4uYXBwbHkobnVsbCwgW1xyXG5cdFx0XHQuLi50ZW1wbGF0ZXMubWFwKHRlbXBsYXRlID0+IHRlbXBsYXRlLmlzU2hlbGxUZW1wbGF0ZSgpID8gbnVsbCA6IHRlbXBsYXRlLnNldENsYXNzZXNBbmRJbXBvcnRhbmNlcygpKSxcclxuXHRcdFx0Li4udGVtcGxhdGVzLm1hcCh0ZW1wbGF0ZSA9PiB0ZW1wbGF0ZS5zZXRQYXJhbURhdGFBbmRTdWdnZXN0aW9ucygpKVxyXG5cdFx0XSkudGhlbigoKSA9PiB7XHJcblx0XHRcdC8vIEFkZCBtaXNzaW5nIHJlcXVpcmVkL3N1Z2dlc3RlZCB2YWx1ZXNcclxuXHRcdFx0dGVtcGxhdGVzLmZvckVhY2godGVtcGxhdGUgPT4gdGVtcGxhdGUuYWRkTWlzc2luZ1BhcmFtcygpKTtcclxuXHRcdFx0Ly8gUmV0dXJuIHRoZSBub3ctbW9kaWZpZWQgdGVtcGxhdGVzXHJcblx0XHRcdHJldHVybiB0ZW1wbGF0ZXM7XHJcblx0XHR9KTtcclxuXHR9KTtcclxuXHJcblx0Ly8gQ2hlY2sgc3ViamVjdCBwYWdlIGZlYXR1cmVzICh0YXNrIDUpIC0gYnV0IGRvbid0IGVycm9yIG91dCBpZiByZXF1ZXN0IGZhaWxzXHJcblx0dmFyIHN1YmplY3RQYWdlQ2hlY2tQcm9taXNlID0gQVBJLmdldCh7XHJcblx0XHRhY3Rpb246IFwicXVlcnlcIixcclxuXHRcdGZvcm1hdDogXCJqc29uXCIsXHJcblx0XHRmb3JtYXR2ZXJzaW9uOiBcIjJcIixcclxuXHRcdHByb3A6IFwiY2F0ZWdvcmllc1wiLFxyXG5cdFx0dGl0bGVzOiBzdWJqZWN0UGFnZS5nZXRQcmVmaXhlZFRleHQoKSxcclxuXHRcdHJlZGlyZWN0czogMSxcclxuXHRcdGNsY2F0ZWdvcmllczogW1xyXG5cdFx0XHRcIkNhdGVnb3J5OkFsbCBkaXNhbWJpZ3VhdGlvbiBwYWdlc1wiLFxyXG5cdFx0XHRcIkNhdGVnb3J5OkFsbCBzdHViIGFydGljbGVzXCIsXHJcblx0XHRcdFwiQ2F0ZWdvcnk6R29vZCBhcnRpY2xlc1wiLFxyXG5cdFx0XHRcIkNhdGVnb3J5OkZlYXR1cmVkIGFydGljbGVzXCIsXHJcblx0XHRcdFwiQ2F0ZWdvcnk6RmVhdHVyZWQgbGlzdHNcIlxyXG5cdFx0XVxyXG5cdH0pLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG5cdFx0aWYgKCAhcmVzcG9uc2UgfHwgIXJlc3BvbnNlLnF1ZXJ5IHx8ICFyZXNwb25zZS5xdWVyeS5wYWdlcyApIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0XHRjb25zdCByZWRpcmVjdFRhcmdldCA9IHJlc3BvbnNlLnF1ZXJ5LnJlZGlyZWN0cyAmJiByZXNwb25zZS5xdWVyeS5yZWRpcmVjdHNbMF0udG8gfHwgZmFsc2U7XHJcblx0XHRpZiAoIHJlZGlyZWN0VGFyZ2V0IHx8ICFzdWJqZWN0SXNBcnRpY2xlICkge1xyXG5cdFx0XHRyZXR1cm4geyByZWRpcmVjdFRhcmdldCB9O1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgcGFnZSA9IHJlc3BvbnNlLnF1ZXJ5LnBhZ2VzWzBdO1xyXG5cdFx0Y29uc3QgaGFzQ2F0ZWdvcnkgPSBjYXRlZ29yeSA9PiBwYWdlLmNhdGVnb3JpZXMgJiYgcGFnZS5jYXRlZ29yaWVzLmZpbmQoY2F0ID0+IGNhdC50aXRsZSA9PT0gXCJDYXRlZ29yeTpcIitjYXRlZ29yeSk7XHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRyZWRpcmVjdFRhcmdldCxcclxuXHRcdFx0ZGlzYW1iaWc6IGhhc0NhdGVnb3J5KFwiQWxsIGRpc2FtYmlndWF0aW9uIHBhZ2VzXCIpLFxyXG5cdFx0XHRzdHVidGFnOiBoYXNDYXRlZ29yeShcIkFsbCBzdHViIGFydGljbGVzXCIpLFxyXG5cdFx0XHRpc0dBOiBoYXNDYXRlZ29yeShcIkdvb2QgYXJ0aWNsZXNcIiksXHJcblx0XHRcdGlzRkE6IGhhc0NhdGVnb3J5KFwiRmVhdHVyZWQgYXJ0aWNsZXNcIiksXHJcblx0XHRcdGlzRkw6IGhhc0NhdGVnb3J5KFwiRmVhdHVyZWQgbGlzdHNcIiksXHJcblx0XHRcdGlzTGlzdDogIWhhc0NhdGVnb3J5KFwiRmVhdHVyZWQgbGlzdHNcIikgJiYgL15MaXN0cz8gb2YvLnRlc3Qoc3ViamVjdFBhZ2UuZ2V0UHJlZml4ZWRUZXh0KCkpXHJcblx0XHR9O1xyXG5cdH0pLmNhdGNoKCgpID0+IG51bGwpOyAvLyBGYWlsdXJlIGlnbm9yZWRcclxuXHJcblx0Ly8gUmV0cmlldmUgcmF0aW5nIGZyb20gT1JFUyAodGFzayA2LCBvbmx5IG5lZWRlZCBmb3IgYXJ0aWNsZXMpIC0gYnV0IGRvbid0IGVycm9yIG91dCBpZiByZXF1ZXN0IGZhaWxzXHJcblx0dmFyIHNob3VsZEdldE9yZXMgPSAoIHN1YmplY3RJc0FydGljbGUgKTsgLy8gVE9ETzogRG9uJ3QgbmVlZCB0byBnZXQgT1JFUyBmb3IgcmVkaXJlY3RzIG9yIGRpc2FtYmlnc1xyXG5cdGlmICggc2hvdWxkR2V0T3JlcyApIHtcclxuXHRcdHZhciBsYXRlc3RSZXZJZFByb21pc2UgPSAhY3VycmVudFBhZ2UuaXNUYWxrUGFnZSgpXHJcblx0XHRcdD8gJC5EZWZlcnJlZCgpLnJlc29sdmUoY29uZmlnLm13LndnUmV2aXNpb25JZClcclxuXHRcdFx0OiBBUEkuZ2V0KCB7XHJcblx0XHRcdFx0YWN0aW9uOiBcInF1ZXJ5XCIsXHJcblx0XHRcdFx0Zm9ybWF0OiBcImpzb25cIixcclxuXHRcdFx0XHRwcm9wOiBcInJldmlzaW9uc1wiLFxyXG5cdFx0XHRcdHRpdGxlczogc3ViamVjdFBhZ2UuZ2V0UHJlZml4ZWRUZXh0KCksXHJcblx0XHRcdFx0cnZwcm9wOiBcImlkc1wiLFxyXG5cdFx0XHRcdGluZGV4cGFnZWlkczogMVxyXG5cdFx0XHR9ICkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcclxuXHRcdFx0XHRpZiAocmVzdWx0LnF1ZXJ5LnJlZGlyZWN0cykge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR2YXIgaWQgPSByZXN1bHQucXVlcnkucGFnZWlkcztcclxuXHRcdFx0XHR2YXIgcGFnZSA9IHJlc3VsdC5xdWVyeS5wYWdlc1tpZF07XHJcblx0XHRcdFx0aWYgKHBhZ2UubWlzc2luZyA9PT0gXCJcIikge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoIGlkIDwgMCApIHtcclxuXHRcdFx0XHRcdHJldHVybiAkLkRlZmVycmVkKCkucmVqZWN0KCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiBwYWdlLnJldmlzaW9uc1swXS5yZXZpZDtcclxuXHRcdFx0fSk7XHJcblx0XHR2YXIgb3Jlc1Byb21pc2UgPSBsYXRlc3RSZXZJZFByb21pc2UudGhlbihmdW5jdGlvbihsYXRlc3RSZXZJZCkge1xyXG5cdFx0XHRpZiAoIWxhdGVzdFJldklkKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBBUEkuZ2V0T1JFUyhsYXRlc3RSZXZJZClcclxuXHRcdFx0XHQudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcclxuXHRcdFx0XHRcdHZhciBkYXRhID0gcmVzdWx0LmVud2lraS5zY29yZXNbbGF0ZXN0UmV2SWRdLmFydGljbGVxdWFsaXR5O1xyXG5cdFx0XHRcdFx0aWYgKCBkYXRhLmVycm9yICkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gJC5EZWZlcnJlZCgpLnJlamVjdChkYXRhLmVycm9yLnR5cGUsIGRhdGEuZXJyb3IubWVzc2FnZSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRjb25zdCBwcmVkaWN0aW9uID0gZGF0YS5zY29yZS5wcmVkaWN0aW9uO1xyXG5cdFx0XHRcdFx0Y29uc3QgcHJvYmFiaWxpdGllcyA9IGRhdGEuc2NvcmUucHJvYmFiaWxpdHk7XHJcblx0XHRcdFx0XHRpZiAocHJlZGljdGlvbiA9PT0gXCJGQVwiIHx8IHByZWRpY3Rpb24gPT09IFwiR0FcIikge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdFx0XHRcdHByZWRpY3Rpb246IFwiQiBvciBoaWdoZXJcIixcclxuXHRcdFx0XHRcdFx0XHRwcm9iYWJpbGl0eTogKChwcm9iYWJpbGl0aWVzLkZBICsgcHJvYmFiaWxpdGllcy5HQSArIHByb2JhYmlsaXRpZXMuQikqMTAwKS50b0ZpeGVkKDEpK1wiJVwiXHJcblx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdFx0XHRwcmVkaWN0aW9uLFxyXG5cdFx0XHRcdFx0XHRwcm9iYWJpbGl0eTogKHByb2JhYmlsaXRpZXNbIHByZWRpY3Rpb24gXSoxMDApLnRvRml4ZWQoMSkrXCIlXCJcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0fSkuY2F0Y2goKCkgPT4gbnVsbCk7IC8vIEZhaWx1cmUgaWdub3JlZDtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0Ly8gT3BlbiB0aGUgbG9hZCBkaWFsb2dcclxuXHR2YXIgaXNPcGVuZWRQcm9taXNlID0gJC5EZWZlcnJlZCgpO1xyXG5cdHZhciBsb2FkRGlhbG9nV2luID0gd2luZG93TWFuYWdlci5vcGVuV2luZG93KFwibG9hZERpYWxvZ1wiLCB7XHJcblx0XHRwcm9taXNlczogW1xyXG5cdFx0XHRiYW5uZXJzUHJvbWlzZSxcclxuXHRcdFx0bG9hZFRhbGtQcm9taXNlLFxyXG5cdFx0XHRwYXJzZVRhbGtQcm9taXNlLFxyXG5cdFx0XHR0ZW1wbGF0ZURldGFpbHNQcm9taXNlLFxyXG5cdFx0XHRzdWJqZWN0UGFnZUNoZWNrUHJvbWlzZSxcclxuXHRcdFx0c2hvdWxkR2V0T3JlcyAmJiBvcmVzUHJvbWlzZVxyXG5cdFx0XSxcclxuXHRcdG9yZXM6IHNob3VsZEdldE9yZXMsXHJcblx0XHRpc09wZW5lZDogaXNPcGVuZWRQcm9taXNlXHJcblx0fSk7XHJcblxyXG5cdGxvYWREaWFsb2dXaW4ub3BlbmVkLnRoZW4oaXNPcGVuZWRQcm9taXNlLnJlc29sdmUpO1xyXG5cclxuXHJcblx0JC53aGVuKFxyXG5cdFx0cHJlZnNQcm9taXNlLFxyXG5cdFx0bG9hZFRhbGtQcm9taXNlLFxyXG5cdFx0dGVtcGxhdGVEZXRhaWxzUHJvbWlzZSxcclxuXHRcdHN1YmplY3RQYWdlQ2hlY2tQcm9taXNlLFxyXG5cdFx0c2hvdWxkR2V0T3JlcyAmJiBvcmVzUHJvbWlzZVxyXG5cdCkudGhlbihcclxuXHRcdC8vIEFsbCBzdWNjZWRlZFxyXG5cdFx0ZnVuY3Rpb24ocHJlZmVyZW5jZXMsIHRhbGtXaWtpdGV4dCwgYmFubmVycywgc3ViamVjdFBhZ2VDaGVjaywgb3Jlc1ByZWRpY2l0aW9uICkge1xyXG5cdFx0XHR2YXIgcmVzdWx0ID0ge1xyXG5cdFx0XHRcdHN1Y2Nlc3M6IHRydWUsXHJcblx0XHRcdFx0dGFsa3BhZ2U6IHRhbGtQYWdlLFxyXG5cdFx0XHRcdHN1YmplY3RQYWdlOiBzdWJqZWN0UGFnZSxcclxuXHRcdFx0XHR0YWxrV2lraXRleHQ6IHRhbGtXaWtpdGV4dCxcclxuXHRcdFx0XHRiYW5uZXJzOiBiYW5uZXJzLFxyXG5cdFx0XHRcdHByZWZlcmVuY2VzOiBwcmVmZXJlbmNlcyxcclxuXHRcdFx0XHRpc0FydGljbGU6IHN1YmplY3RJc0FydGljbGVcclxuXHRcdFx0fTtcclxuXHRcdFx0aWYgKHN1YmplY3RQYWdlQ2hlY2spIHtcclxuXHRcdFx0XHRyZXN1bHQgPSB7IC4uLnJlc3VsdCwgLi4uc3ViamVjdFBhZ2VDaGVjayB9O1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChvcmVzUHJlZGljaXRpb24gJiYgc3ViamVjdFBhZ2VDaGVjayAmJiAhc3ViamVjdFBhZ2VDaGVjay5pc0dBICYmICFzdWJqZWN0UGFnZUNoZWNrLmlzRkEgJiYgIXN1YmplY3RQYWdlQ2hlY2suaXNGTCkge1xyXG5cdFx0XHRcdHJlc3VsdC5vcmVzID0gb3Jlc1ByZWRpY2l0aW9uO1xyXG5cdFx0XHR9XHJcblx0XHRcdHdpbmRvd01hbmFnZXIuY2xvc2VXaW5kb3coXCJsb2FkRGlhbG9nXCIsIHJlc3VsdCk7XHJcblx0XHRcdFxyXG5cdFx0fVxyXG5cdCk7IC8vIEFueSBmYWlsdXJlcyBhcmUgaGFuZGxlZCBieSB0aGUgbG9hZERpYWxvZyB3aW5kb3cgaXRzZWxmXHJcblxyXG5cdC8vIE9uIHdpbmRvdyBjbG9zZWQsIGNoZWNrIGRhdGEsIGFuZCByZXNvbHZlL3JlamVjdCBzZXR1cENvbXBsZXRlZFByb21pc2VcclxuXHRsb2FkRGlhbG9nV2luLmNsb3NlZC50aGVuKGZ1bmN0aW9uKGRhdGEpIHtcclxuXHRcdGlmIChkYXRhICYmIGRhdGEuc3VjY2Vzcykge1xyXG5cdFx0XHQvLyBHb3QgZXZlcnl0aGluZyBuZWVkZWQ6IFJlc29sdmUgcHJvbWlzZSB3aXRoIHRoaXMgZGF0YVxyXG5cdFx0XHRzZXR1cENvbXBsZXRlZFByb21pc2UucmVzb2x2ZShkYXRhKTtcclxuXHRcdH0gZWxzZSBpZiAoZGF0YSAmJiBkYXRhLmVycm9yKSB7XHJcblx0XHRcdC8vIFRoZXJlIHdhcyBhbiBlcnJvcjogUmVqZWN0IHByb21pc2Ugd2l0aCBlcnJvciBjb2RlL2luZm9cclxuXHRcdFx0c2V0dXBDb21wbGV0ZWRQcm9taXNlLnJlamVjdChkYXRhLmVycm9yLmNvZGUsIGRhdGEuZXJyb3IuaW5mbyk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvLyBXaW5kb3cgY2xvc2VkIGJlZm9yZSBjb21wbGV0aW9uOiByZXNvbHZlIHByb21pc2Ugd2l0aG91dCBhbnkgZGF0YVxyXG5cdFx0XHRzZXR1cENvbXBsZXRlZFByb21pc2UucmVzb2x2ZShudWxsKTtcclxuXHRcdH1cclxuXHRcdGNhY2hlLmNsZWFySW52YWxpZEl0ZW1zKCk7XHJcblx0fSk7XHJcblx0cmV0dXJuIHNldHVwQ29tcGxldGVkUHJvbWlzZTtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHNldHVwUmF0ZXI7XHJcbi8vIDwvbm93aWtpPiIsIi8vIDxub3dpa2k+XHJcblxyXG4vLyBWYXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIGFuZCBvYmplY3RzIHRoYXQgbWlnaHQgYmUgdXNlZCBpbiBtdWx0aXBsZSBwbGFjZXNcclxuXHJcbnZhciBpc0FmdGVyRGF0ZSA9IGZ1bmN0aW9uKGRhdGVTdHJpbmcpIHtcclxuXHRyZXR1cm4gbmV3IERhdGUoZGF0ZVN0cmluZykgPCBuZXcgRGF0ZSgpO1xyXG59O1xyXG5cclxudmFyIHllc1dvcmRzID0gW1xyXG5cdFwiYWRkXCIsXHJcblx0XCJhZGRlZFwiLFxyXG5cdFwiYWZmaXJtXCIsXHJcblx0XCJhZmZpcm1lZFwiLFxyXG5cdFwiaW5jbHVkZVwiLFxyXG5cdFwiaW5jbHVkZWRcIixcclxuXHRcIm9uXCIsXHJcblx0XCJ0cnVlXCIsXHJcblx0XCJ5ZXNcIixcclxuXHRcInlcIixcclxuXHRcIjFcIlxyXG5dO1xyXG52YXIgbm9Xb3JkcyA9IFtcclxuXHRcImRlY2xpbmVcIixcclxuXHRcImRlY2xpbmVkXCIsXHJcblx0XCJleGNsdWRlXCIsXHJcblx0XCJleGNsdWRlZFwiLFxyXG5cdFwiZmFsc2VcIixcclxuXHRcIm5vbmVcIixcclxuXHRcIm5vdFwiLFxyXG5cdFwibm9cIixcclxuXHRcIm5cIixcclxuXHRcIm9mZlwiLFxyXG5cdFwib21pdFwiLFxyXG5cdFwib21pdHRlZFwiLFxyXG5cdFwicmVtb3ZlXCIsXHJcblx0XCJyZW1vdmVkXCIsXHJcblx0XCIwXCJcclxuXTtcclxudmFyIG5vcm1hbGlzZVllc05vID0gZnVuY3Rpb24odmFsKSB7XHJcblx0aWYgKHZhbCA9PSBudWxsKSB7XHJcblx0XHRyZXR1cm4gdmFsO1xyXG5cdH1cclxuXHR2YXIgdHJpbW1lZExjVmFsID0gdmFsLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG5cdGlmICh5ZXNXb3Jkcy5pbmNsdWRlcyh0cmltbWVkTGNWYWwpKSB7XHJcblx0XHRyZXR1cm4gXCJ5ZXNcIjtcclxuXHR9IGVsc2UgaWYgKG5vV29yZHMuaW5jbHVkZXModHJpbW1lZExjVmFsKSkge1xyXG5cdFx0cmV0dXJuIFwibm9cIjtcclxuXHR9IGVsc2Uge1xyXG5cdFx0cmV0dXJuIHRyaW1tZWRMY1ZhbDtcclxuXHR9XHJcbn07XHJcblxyXG4vKipcclxuICogXHJcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaWx0ZXJQcmVkaWNhdGUgKGN1cnJlbnRWYWwsIGN1cnJlbnRJbmRleCwgYXJyYXkpID0+IHtib29sZWFufVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtYXBUcmFuc2Zvcm0gKGN1cnJlbnRWYWwsIGN1cnJlbnRJbmRleCwgYXJyYXkpID0+IHthbnl9XHJcbiAqIEByZXR1cm5zIHtBcnJheX1cclxuICovXHJcbnZhciBmaWx0ZXJBbmRNYXAgPSBmdW5jdGlvbihhcnJheSwgZmlsdGVyUHJlZGljYXRlLCBtYXBUcmFuc2Zvcm0pIHtcclxuXHRyZXR1cm4gYXJyYXkucmVkdWNlKFxyXG5cdFx0KGFjY3VtdWxhdGVkLCBjdXJyZW50VmFsLCBjdXJyZW50SW5kZXgpID0+IHtcclxuXHRcdFx0aWYgKGZpbHRlclByZWRpY2F0ZShjdXJyZW50VmFsLCBjdXJyZW50SW5kZXgsIGFycmF5KSkge1xyXG5cdFx0XHRcdHJldHVybiBbLi4uYWNjdW11bGF0ZWQsIG1hcFRyYW5zZm9ybShjdXJyZW50VmFsLCBjdXJyZW50SW5kZXgsIGFycmF5KV07XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGFjY3VtdWxhdGVkO1xyXG5cdFx0fSxcclxuXHRcdFtdXHJcblx0KTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBcclxuICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0gYXJyYXkgXHJcbiAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH0gaXRlbSB3aXRoIHRoZSBoaWdoZXN0IGZyZXF1ZW5jeVxyXG4gKiBlLmcuIGBtb3N0RnJlcXVlbnQoW1wiYXBwbGVcIiwgXCJhcHBsZVwiLCBcIm9yYW5nZVwiXSlgIHJldHVybnMgYFwiYXBwbGVcImBcclxuICovXHJcbmZ1bmN0aW9uIG1vc3RGcmVxdWVudChhcnJheSkge1xyXG5cdGlmICghYXJyYXkgfHwgIUFycmF5LmlzQXJyYXkoYXJyYXkpIHx8IGFycmF5Lmxlbmd0aCA9PT0gMClcclxuXHRcdHJldHVybiBudWxsO1xyXG5cdHZhciBtYXAgPSB7fTtcclxuXHR2YXIgbW9zdEZyZXEgPSBudWxsO1xyXG5cdGFycmF5LmZvckVhY2goKGl0ZW0pID0+IHtcclxuXHRcdG1hcFtpdGVtXSA9IChtYXBbaXRlbV0gfHwgMCkgKyAxO1xyXG5cdFx0aWYgKG1vc3RGcmVxID09PSBudWxsIHx8IG1hcFtpdGVtXSA+IG1hcFttb3N0RnJlcV0pIHtcclxuXHRcdFx0bW9zdEZyZXEgPSBpdGVtO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG5cdHJldHVybiBtb3N0RnJlcTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFxyXG4gKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBhcnJheSBcclxuICogQHJldHVybnMge3N0cmluZ1tdfG51bWJlcltdfSBhcnJheSB3aXRoIG9ubHkgdW5pcXVlIHZhbHVlc1xyXG4gKiBlLmcuIGB1bmlxdWVBcnJheShbXCJhcHBsZVwiLCBcImFwcGxlXCIsIFwib3JhbmdlXCJdKWAgcmV0dXJucyBgW1wiYXBwbGVcIiwgXCJvcmFuZ2VcIl1gXHJcbiAqL1xyXG5mdW5jdGlvbiB1bmlxdWVBcnJheShhcnJheSkge1xyXG5cdGlmICghYXJyYXkgfHwgIUFycmF5LmlzQXJyYXkoYXJyYXkpIHx8IGFycmF5Lmxlbmd0aCA9PT0gMClcclxuXHRcdHJldHVybiBbXTtcclxuXHR2YXIgc2VlbiA9IHt9O1xyXG5cdHZhciB1bmlxdWUgPSBbXTtcclxuXHRhcnJheS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcblx0XHRpZiAoIXNlZW5baXRlbV0pIHtcclxuXHRcdFx0dW5pcXVlLnB1c2goaXRlbSk7XHJcblx0XHRcdHNlZW5baXRlbV0gPSB0cnVlO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG5cdHJldHVybiB1bmlxdWU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNsYXNzTWFzayhjbGFzc1ZhbCkge1xyXG5cdGlmICghY2xhc3NWYWwpIHtcclxuXHRcdHJldHVybiBjbGFzc1ZhbDtcclxuXHR9XHJcblx0c3dpdGNoIChjbGFzc1ZhbC50b0xvd2VyQ2FzZSgpKSB7XHJcblx0Y2FzZSBcImZhXCI6XHJcblx0Y2FzZSBcImZsXCI6XHJcblx0Y2FzZSBcImFcIjpcclxuXHRjYXNlIFwiZ2FcIjpcclxuXHRjYXNlIFwiYlwiOlxyXG5cdGNhc2UgXCJjXCI6XHJcblx0Y2FzZSBcIm5hXCI6XHJcblx0Y2FzZSBcImZtXCI6XHJcblx0Y2FzZSBcImFsXCI6XHJcblx0Y2FzZSBcImJsXCI6XHJcblx0Y2FzZSBcImNsXCI6XHJcblx0XHRyZXR1cm4gY2xhc3NWYWwudG9VcHBlckNhc2UoKTtcclxuXHRjYXNlIFwic3RhcnRcIjpcclxuXHRjYXNlIFwic3R1YlwiOlxyXG5cdGNhc2UgXCJsaXN0XCI6XHJcblx0Y2FzZSBcInBvcnRhbFwiOlxyXG5cdGNhc2UgXCJwcm9qZWN0XCI6XHJcblx0Y2FzZSBcImRyYWZ0XCI6XHJcblx0Y2FzZSBcImJvb2tcIjpcclxuXHRjYXNlIFwiZnV0dXJlXCI6XHJcblx0Y2FzZSBcImN1cnJlbnRcIjpcclxuXHRjYXNlIFwiY29tcGxldGVcIjpcclxuXHRjYXNlIFwic3Vic3RhbnRpYWxcIjpcclxuXHRjYXNlIFwiYmFzaWNcIjpcclxuXHRjYXNlIFwiaW5jb21wbGV0ZVwiOlxyXG5cdGNhc2UgXCJtZXRhXCI6XHJcblx0XHRyZXR1cm4gY2xhc3NWYWwuc2xpY2UoMCwxKS50b1VwcGVyQ2FzZSgpICsgY2xhc3NWYWwuc2xpY2UoMSkudG9Mb3dlckNhc2UoKTtcclxuXHRjYXNlIFwiaW1hZ2VcIjpcclxuXHRjYXNlIFwiaW1nXCI6XHJcblx0Y2FzZSBcImZpbGVcIjpcclxuXHRcdHJldHVybiBcIkZpbGVcIjtcclxuXHRjYXNlIFwiY2F0ZWdvcnlcIjpcclxuXHRjYXNlIFwiY2F0XCI6XHJcblx0Y2FzZSBcImNhdGVnXCI6XHJcblx0XHRyZXR1cm4gXCJDYXRlZ29yeVwiO1xyXG5cdGNhc2UgXCJkaXNhbWJpZ3VhdGlvblwiOlxyXG5cdGNhc2UgXCJkaXNhbWJpZ1wiOlxyXG5cdGNhc2UgXCJkaXNhbWJcIjpcclxuXHRjYXNlIFwiZGFiXCI6XHJcblx0XHRyZXR1cm4gXCJEaXNhbWJpZ1wiO1xyXG5cdGNhc2UgXCJyZWRpcmVjdFwiOlxyXG5cdGNhc2UgXCJyZWRpclwiOlxyXG5cdGNhc2UgXCJyZWRcIjpcclxuXHRcdHJldHVybiBcIlJlZGlyZWN0XCI7XHJcblx0Y2FzZSBcInRlbXBsYXRlXCI6XHJcblx0Y2FzZSBcInRlbXBcIjpcclxuXHRjYXNlIFwidHBsXCI6XHJcblx0XHRyZXR1cm4gXCJUZW1wbGF0ZVwiO1xyXG5cdGNhc2UgXCJicGx1c1wiOlxyXG5cdGNhc2UgXCJiK1wiOlxyXG5cdFx0cmV0dXJuIFwiQnBsdXNcIjtcclxuXHRjYXNlIFwiZnBvXCI6XHJcblx0XHRyZXR1cm4gXCJGUG9cIjtcclxuXHRkZWZhdWx0OlxyXG5cdFx0cmV0dXJuIGNsYXNzVmFsO1xyXG5cdH1cclxufVxyXG5cclxuZnVuY3Rpb24gaW1wb3J0YW5jZU1hc2soaW1wb3J0YW5jZSkge1xyXG5cdGlmICghaW1wb3J0YW5jZSkge1xyXG5cdFx0cmV0dXJuIGltcG9ydGFuY2U7XHJcblx0fVxyXG5cdGlmIChpbXBvcnRhbmNlLnRvTG93ZXJDYXNlKCkgPT09IFwibmFcIikge1xyXG5cdFx0cmV0dXJuIFwiTkFcIjtcclxuXHR9XHJcblx0cmV0dXJuIGltcG9ydGFuY2Uuc2xpY2UoMCwxKS50b1VwcGVyQ2FzZSgpICsgaW1wb3J0YW5jZS5zbGljZSgxKS50b0xvd2VyQ2FzZSgpO1xyXG59XHJcblxyXG5leHBvcnQge1xyXG5cdGlzQWZ0ZXJEYXRlLFxyXG5cdGZpbHRlckFuZE1hcCxcclxuXHRub3JtYWxpc2VZZXNObyxcclxuXHRtb3N0RnJlcXVlbnQsXHJcblx0dW5pcXVlQXJyYXksXHJcblx0Y2xhc3NNYXNrLFxyXG5cdGltcG9ydGFuY2VNYXNrXHJcbn07XHJcbi8vIDwvbm93aWtpPiIsImltcG9ydCBMb2FkRGlhbG9nIGZyb20gXCIuL1dpbmRvd3MvTG9hZERpYWxvZ1wiO1xyXG5pbXBvcnQgTWFpbldpbmRvdyBmcm9tIFwiLi9XaW5kb3dzL01haW5XaW5kb3dcIjtcclxuLy8gPG5vd2lraT5cclxuXHJcbnZhciBmYWN0b3J5ID0gbmV3IE9PLkZhY3RvcnkoKTtcclxuXHJcbi8vIFJlZ2lzdGVyIHdpbmRvdyBjb25zdHJ1Y3RvcnMgd2l0aCB0aGUgZmFjdG9yeS5cclxuZmFjdG9yeS5yZWdpc3RlcihMb2FkRGlhbG9nKTtcclxuZmFjdG9yeS5yZWdpc3RlcihNYWluV2luZG93KTtcclxuXHJcbnZhciBtYW5hZ2VyID0gbmV3IE9PLnVpLldpbmRvd01hbmFnZXIoIHtcclxuXHRcImZhY3RvcnlcIjogZmFjdG9yeVxyXG59ICk7XHJcbiQoIGRvY3VtZW50LmJvZHkgKS5hcHBlbmQoIG1hbmFnZXIuJGVsZW1lbnQgKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG1hbmFnZXI7XHJcbi8vIDwvbm93aWtpPiJdfQ==