From ccaa89bf56a591177c8abe758b85b1500e80ffdd Mon Sep 17 00:00:00 2001 From: Jason Green Date: Wed, 4 Mar 2015 17:20:51 +0000 Subject: [PATCH] bump version 0.2.6 --- bower.json | 2 +- lib/milo.js | 2 +- milo.bundle.js | 4 ++-- package.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bower.json b/bower.json index ebfb7b9..27c62a9 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "milojs", - "version": "0.2.5", + "version": "0.2.6", "homepage": "https://github.com/milojs/milo", "authors": [ "MOL Technical " diff --git a/lib/milo.js b/lib/milo.js index d551f67..78e622f 100644 --- a/lib/milo.js +++ b/lib/milo.js @@ -63,7 +63,7 @@ _.extend(milo, { Component: require('./components/c_class'), Command: require('./command'), registry: require('./registry'), - milo_version: '0.2.5', + milo_version: '0.2.6', createComponentClass: require('./util/create_component_class'), destroy: destroy }); diff --git a/milo.bundle.js b/milo.bundle.js index b490596..86bc769 100644 --- a/milo.bundle.js +++ b/milo.bundle.js @@ -9239,7 +9239,7 @@ _.extend(milo, { Component: require('./components/c_class'), Command: require('./command'), registry: require('./registry'), - milo_version: '0.2.5', + milo_version: '0.2.6', createComponentClass: require('./util/create_component_class'), destroy: destroy }); @@ -19062,5 +19062,5 @@ function makeFindMethod(eachMethod, findWhat) { } },{}]},{},[66]) -//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvYWJzdHJhY3QvZmFjZXQuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2Fic3RyYWN0L2ZhY2V0ZWRfb2JqZWN0LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9hYnN0cmFjdC9yZWdpc3RyeS5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvYXR0cmlidXRlcy9hX2JpbmQuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2F0dHJpYnV0ZXMvYV9jbGFzcy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvYXR0cmlidXRlcy9hX2xvYWQuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2F0dHJpYnV0ZXMvaW5kZXguanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2JpbmRlci5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY2xhc3Nlcy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tbWFuZC9hY3Rpb25zX2hpc3RvcnkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbW1hbmQvY21kX3JlZ2lzdHJ5LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21tYW5kL2luZGV4LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21tYW5kL3RyYW5zYWN0aW9uLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21tYW5kL3RyYW5zYWN0aW9uX2hpc3RvcnkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19jbGFzcy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jX2ZhY2V0LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0NvbnRhaW5lci5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jX2ZhY2V0cy9EYXRhLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0RvbS5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jX2ZhY2V0cy9EcmFnLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0Ryb3AuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvRXZlbnRzLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0ZyYW1lLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0l0ZW0uanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvTGlzdC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jX2ZhY2V0cy9Nb2RlbEZhY2V0LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL09wdGlvbnMuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvVGVtcGxhdGUuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvVHJhbnNmZXIuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvY2ZfcmVnaXN0cnkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19pbmZvLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfcmVnaXN0cnkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY191dGlscy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jbGFzc2VzL1ZpZXcuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvbXNnX2FwaS9kYXRhLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL21zZ19hcGkvZGVfZGF0YS5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9tc2dfYXBpL2Ryb3AuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvbXNnX3NyYy9kb21fZXZlbnRzLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL21zZ19zcmMvZnJhbWUuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvc2NvcGUuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvQnV0dG9uLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0NvbWJvLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0NvbWJvTGlzdC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy91aS9EYXRlLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0Ryb3BUYXJnZXQuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvRm9sZFRyZWUuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvR3JvdXAuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvSHlwZXJsaW5rLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0ltYWdlLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0lucHV0LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0lucHV0TGlzdC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy91aS9MaXN0LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0xpc3RJdGVtLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL1JhZGlvR3JvdXAuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvU2VsZWN0LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL1N1cGVyQ29tYm8uanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvVGV4dC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy91aS9UZXh0YXJlYS5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy91aS9UaW1lLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL1dyYXBwZXIuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvYm9vdHN0cmFwL0FsZXJ0LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL2Jvb3RzdHJhcC9EaWFsb2cuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvYm9vdHN0cmFwL0Ryb3Bkb3duLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb25maWcuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2xvYWRlci5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvbWlsby5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvcmVnaXN0cnkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL2RlX2NvbnN0cnMuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL2RvbV9zb3VyY2UuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL21haWwvaW5kZXguanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL21haWwvbWFpbF9hcGkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL21haWwvbWFpbF9zb3VyY2UuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL3dpbmRvdy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvdXNlX2NvbXBvbmVudHMuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3VzZV9mYWNldHMuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvY29tcG9uZW50X25hbWUuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvY3JlYXRlX2NvbXBvbmVudF9jbGFzcy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvdXRpbC9kZXByZWNhdGUuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvZG9tLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi91dGlsL2RvbV9saXN0ZW5lcnMuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvZG9tcmVhZHkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvZHJhZ2Ryb3AuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvZXJyb3IuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvZnJhZ21lbnQuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvaW5kZXguanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvanNvbl9wYXJzZS5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvdXRpbC9yZXF1ZXN0LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi91dGlsL3NlbGVjdGlvbi9pbmRleC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvdXRpbC9zdG9yYWdlL2luZGV4LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi91dGlsL3N0b3JhZ2UvbW9kZWwuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvc3RvcmFnZS9tc2dfc3JjLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi91dGlsL3VuaXF1ZV9pZC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvdXRpbC93ZWJzb2NrZXQvaW5kZXguanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvd2Vic29ja2V0L21zZ19hcGkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvd2Vic29ja2V0L21zZ19zcmMuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL2Jhc2UzMi9saWIvYmFzZTMyLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLWJ1aWx0aW5zL2J1aWx0aW4vZnMuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvYWJzdHJhY3QvbWl4aW4uanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvY2xhc3Nlcy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9jb25maWcuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbWVzc2VuZ2VyL2luZGV4LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21lc3Nlbmdlci9tX2FwaS5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tZXNzZW5nZXIvbV9hcGlfcnguanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbWVzc2VuZ2VyL21fc291cmNlLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21lc3Nlbmdlci9tc25ncl9zb3VyY2UuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbWlsby1jb3JlLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21pbmRlci5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tb2RlbC9jaGFuZ2VfZGF0YS5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tb2RlbC9jb25uZWN0b3IuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbW9kZWwvaW5kZXguanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbW9kZWwvbV9tc2dfYXBpLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21vZGVsL21fcGF0aC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tb2RlbC9tb2RlbF91dGlscy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tb2RlbC9wYXRoX21zZ19hcGkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbW9kZWwvcGF0aF91dGlscy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tb2RlbC9zeW50aGVzaXplL2luZGV4LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL3V0aWwvY2hlY2suanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvdXRpbC9pbmRleC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi91dGlsL2xvZ2dlci5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi91dGlsL2xvZ2dlcl9jbGFzcy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9kb3QvZG9ULmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbm9kZV9tb2R1bGVzL2RvdC9pbmRleC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9tb2wtcHJvdG8vbGliL3Byb3RvLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbm9kZV9tb2R1bGVzL21vbC1wcm90by9saWIvcHJvdG9fYXJyYXkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9ub2RlX21vZHVsZXMvbW9sLXByb3RvL2xpYi9wcm90b19mdW5jdGlvbi5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9tb2wtcHJvdG8vbGliL3Byb3RvX251bWJlci5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9tb2wtcHJvdG8vbGliL3Byb3RvX29iamVjdC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9tb2wtcHJvdG8vbGliL3Byb3RvX3Byb3RvdHlwZS5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9tb2wtcHJvdG8vbGliL3Byb3RvX3N0cmluZy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9tb2wtcHJvdG8vbGliL3Byb3RvX3V0aWwuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9ub2RlX21vZHVsZXMvbW9sLXByb3RvL2xpYi91dGlscy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdE1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3g1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdHFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDblBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9tQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdFZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6cUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcFVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4YkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbk1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbE5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdnBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDek9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbk9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdlNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdFhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL01BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeE9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdllBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3puQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuXG52YXIgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZhY2V0O1xuXG5cbi8qKlxuICogYG1pbG8uY2xhc3Nlcy5GYWNldGBcbiAqIEJhc2UgRmFjZXQgY2xhc3MgaXMgYW4gYW5jZXN0b3Igb2YgW0NvbXBvbmVudEZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXQuanMuaHRtbCkgY2xhc3MsIHRoZSBtYWluIGJ1aWxkaW5nIGJsb2NrIGluIG1pbG8uXG4gKiBcbiAqIEBwYXJhbSB7RmFjZXRlZE9iamVjdH0gb3duZXIgYW4gaW5zdGFuY2Ugb2YgRmFjZXRlZE9iamVjdCBzdWJjbGFzcyB0aGF0IHN0b3JlcyB0aGUgZmFjZXQgb24gaXRzIHByb3BlcnR5ICB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgYG5hbWVgIHByb3BlcnR5IG9mIGZhY2V0XG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIG9wdGlvbmFsIGZhY2V0IGNvbmZpZ3VyYXRpb24sIHVzZWQgaW4gc3ViY2xhc3Nlc1xuICovXG5mdW5jdGlvbiBGYWNldChvd25lciwgY29uZmlnKSB7XG4gICAgdGhpcy5uYW1lID0gXy5maXJzdExvd2VyQ2FzZSh0aGlzLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIHRoaXMub3duZXIgPSBvd25lcjtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgICB0aGlzLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG4vKipcbiAqIGBpbml0YCBtZXRob2Qgb2Ygc3ViY2xhc3Mgd2lsbCBiZSBjYWxsZWQgYnkgRmFjZXQgY29uc3RydWN0b3IuXG4gKi9cbl8uZXh0ZW5kUHJvdG8oRmFjZXQsIHtcbiAgICBpbml0OiBmdW5jdGlvbigpIHt9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgRmFjZXQgPSByZXF1aXJlKCcuL2ZhY2V0JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZhY2V0ZWRPYmplY3Q7XG5cblxuLyoqXG4gKiBgbWlsby5jbGFzc2VzLkZhY2V0ZWRPYmplY3RgXG4gKiBDb21wb25lbnQgY2xhc3MgaXMgYmFzZWQgb24gYW4gYWJzdHJhY3QgYGBgRmFjZXRlZE9iamVjdGBgYCBjbGFzcy4gVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBpbiBhbnkgc2l0dWF0aW9uIHdoZXJlIG9iamVjdHMgY2FuIGJlIHJlcHJlc2VudGVkIHZpYSBjb2xsZWN0aW9uIG9mIGZhY2V0cyAoYSBmYWNldCBpcyBhbiBvYmplY3Qgb2YgYSBjZXJ0YWluIGNsYXNzLCBpdCBob2xkcyBpdHMgb3duIGNvbmZpZ3VyYXRpb24sIGRhdGEgYW5kIG1ldGhvZHMpLlxuICogSW4gYSB3YXksIFwiZmFjZXRzIHBhdHRlcm5cIiBpcyBhbiBpbnZlcnNpb24gb2YgXCJhZGFwdGVyIHBhdHRlcm5cIiAtIHdoaWxlIHRoZSBsYXR0ZXIgYWxsb3dzIGZpbmRpbmcgYSBjbGFzcy9tZXRob2RzIHRoYXQgaGFzIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHksIGZhY2V0ZWQgb2JqZWN0IGlzIHNpbXBseSBjb25zdHJ1Y3RlZCB0byBoYXZlIHRoZXNlIGZ1bmN0aW9uYWxpdGllcy5cbiAqIFdpdGggdGhpcyBhcmNoaXRlY3R1cmUgaXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIGEgdmlydHVhbGx5IHVubGltaXRlZCBudW1iZXIgb2YgY29tcG9uZW50IGNsYXNzZXMgd2l0aCBhIHZlcnkgbGltaXRlZCBudW1iZXIgb2YgYnVpbGRpbmcgYmxvY2tzIHdpdGhvdXQgaGF2aW5nIGFueSBoaWVyYXJjaHkgb2YgY2xhc3NlcyAtIGFsbCBjb21wb25lbnRzIGluaGVyaXQgZGlyZWN0bHkgZnJvbSBDb21wb25lbnQgY2xhc3MuXG4gKlxuICogVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYmUgY2FsbGVkIGJ5IGFsbCBzdWJjbGFzc2VzIGNvbnN0cnVjdG9yIChpdCB3aWxsIGhhcHBlbiBhdXRvbWF0aWNhbGx5IGlmIGEgc3ViY2xhc3MgaXMgY3JlYXRlZCB3aXRoIGBfLmNyZWF0ZVN1YmNsYXNzYCkuXG4gKlxuICogQHJldHVybiB7RmFjZXRlZE9iamVjdH1cbiAqL1xuZnVuY3Rpb24gRmFjZXRlZE9iamVjdCgpIHtcbiAgICAvLyB0aGlzLmZhY2V0c0NvbmZpZyBhbmQgdGhpcy5mYWNldHNDbGFzc2VzIHdlcmUgc3RvcmVkIG9uIGEgc3BlY2lmaWMgY2xhc3MgcHJvdG90eXBlXG4gICAgLy8gd2hlbiB0aGUgY2xhc3Mgd2FzIGNyZWF0ZWQgYnkgRmFjZXRlZE9iamVjdC5jcmVhdGVGYWNldGVkQ2xhc3NcbiAgICB2YXIgZmFjZXRzQ29uZmlnID0gdGhpcy5mYWNldHNDb25maWcgfHwge307XG5cbiAgICB2YXIgZmFjZXRzRGVzY3JpcHRvcnMgPSB7fVxuICAgICAgICAsIGZhY2V0cyA9IHt9O1xuXG4gICAgLy8gRmFjZXRlZE9iamVjdCBjbGFzcyBpdHNlbGYgaXMgbm90IG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZCAtIGl0IGhhcyBubyBmYWNldHNcbiAgICAvLyBJdCBtYXkgY2hhbmdlLCBhcyBhZGRpbmcgZmFjZXRzIGlzIHBvc3NpYmxlIHRvIGluc3RhbmNlc1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09IEZhY2V0ZWRPYmplY3QpICAgICAgXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmFjZXRlZE9iamVjdCBpcyBhbiBhYnN0cmFjdCBjbGFzcywgY2FuXFwndCBiZSBpbnN0YW50aWF0ZWQnKTtcblxuICAgIC8vIGluc3RhbnRpYXRlIGNsYXNzIGZhY2V0c1xuICAgIGlmICh0aGlzLmZhY2V0c0NsYXNzZXMpXG4gICAgICAgIF8uZWFjaEtleSh0aGlzLmZhY2V0c0NsYXNzZXMsIGluc3RhbnRpYXRlRmFjZXQsIHRoaXMsIHRydWUpO1xuXG4gICAgLy8gYWRkIGZhY2V0cyB0byB0aGUgY2xhc3MgYXMgcHJvcGVydGllcyB1bmRlciB0aGVpciBvd24gbmFtZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIGZhY2V0c0Rlc2NyaXB0b3JzKTtcblxuICAgIC8vIHN0b3JlIGFsbCBmYWNldHMgb24gYGZhY2V0c2AgcHJvcGVydHkgc28gdGhhdCB0aGV5IGNhbiBiZSBlbnVtZXJhdGVkXG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZmFjZXRzJywgZmFjZXRzKTsgICBcblxuICAgIC8vIGNhbGwgYGluaXRgbWV0aG9kIGlmIGl0IGlzIGRlZmluZWQgaW4gc3ViY2xhc3NcbiAgICBpZiAodGhpcy5pbml0KVxuICAgICAgICB0aGlzLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIC8vIGluc3RhbnRpYXRlIGZhY2V0IHdpdGggYSBnaXZlbiBjbGFzcyAoRmFjZXRDbGFzcykgYW5kIG5hbWUgKGZhY2V0TmFtZSlcbiAgICBmdW5jdGlvbiBpbnN0YW50aWF0ZUZhY2V0KEZhY2V0Q2xhc3MsIGZhY2V0TmFtZSkge1xuICAgICAgICAvLyBnZXQgZmFjZXQgY29uZmlndXJhdGlvblxuICAgICAgICB2YXIgZmN0Q29uZmlnID0gZmFjZXRzQ29uZmlnW2ZhY2V0TmFtZV07XG5cbiAgICAgICAgLy8gaW5zdGF0aWF0ZSBmYWNldHNcbiAgICAgICAgZmFjZXRzW2ZhY2V0TmFtZV0gPSBuZXcgRmFjZXRDbGFzcyh0aGlzLCBmY3RDb25maWcpO1xuXG4gICAgICAgIC8vIGFkZCBmYWNldCB0byBwcm9wZXJ0eSBkZXNjcmlwdG9yc1xuICAgICAgICBmYWNldHNEZXNjcmlwdG9yc1tmYWNldE5hbWVdID0ge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBmYWNldHNbZmFjZXROYW1lXVxuICAgICAgICB9O1xuICAgIH1cbn1cblxuXG4vKipcbiAqICMjIyNGYWNldGVkT2JqZWN0IGNsYXNzIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbY3JlYXRlRmFjZXRlZENsYXNzXSgjRmFjZXRlZE9iamVjdCQkY3JlYXRlRmFjZXRlZENsYXNzKVxuICogLSBbaGFzRmFjZXRdKCNGYWNldGVkT2JqZWN0JCRoYXNGYWNldClcbiAqL1xuXy5leHRlbmQoRmFjZXRlZE9iamVjdCwge1xuICAgIGNyZWF0ZUZhY2V0ZWRDbGFzczogRmFjZXRlZE9iamVjdCQkY3JlYXRlRmFjZXRlZENsYXNzLFxuICAgIGhhc0ZhY2V0OiBGYWNldGVkT2JqZWN0JCRoYXNGYWNldCxcbiAgICBnZXRGYWNldENvbmZpZzogRmFjZXRlZE9iamVjdCQkZ2V0RmFjZXRDb25maWdcbn0pO1xuXG5cbi8qKlxuICogIyMjI0ZhY2V0ZWRPYmplY3QgaW5zdGFuY2UgbWV0aG9kcyMjIyNcbiAqXG4gKiAtIFthZGRGYWNldF0oI0ZhY2V0ZWRPYmplY3QkYWRkRmFjZXQpXG4gKi9cbl8uZXh0ZW5kUHJvdG8oRmFjZXRlZE9iamVjdCwge1xuICAgIGFkZEZhY2V0OiBGYWNldGVkT2JqZWN0JGFkZEZhY2V0XG59KTtcblxuXG4vKipcbiAqIEZhY2V0ZWRPYmplY3QgaW5zdGFuY2UgbWV0aG9kLlxuICogQWRkcyBhIGZhY2V0IHRvIHRoZSBpbnN0YW5jZSBvZiBGYWNldGVkT2JqZWN0IHN1YmNsYXNzLlxuICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjZXQgdGhhdCB3YXMgY3JlYXRlZC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBGYWNldENsYXNzIGZhY2V0IGNsYXNzIGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gZmFjZXRDb25maWcgb3B0aW9uYWwgZmFjZXQgY29uZmlndXJhdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IGZhY2V0TmFtZSBvcHRpb25hbCBmYWNldCBuYW1lLCBGYWNldENsYXNzLm5hbWUgd2lsbCBiZSB1c2VkIGlmIGZhY2V0TmFtZSBpcyBub3QgcGFzc2VkLlxuICogQHBhcmFtIHtCb29sZWFufSB0aHJvd09uRXJyb3JzIElmIHNldCB0byBmYWxzZSwgdGhlbiBlcnJvcnMgd2lsbCBvbmx5IGJlIGxvZ2dlZCB0byBjb25zb2xlLiBUcnVlIGJ5IGRlZmF1bHQuXG4gKiBAcmV0dXJuIHtGYWNldH1cbiAqL1xuZnVuY3Rpb24gRmFjZXRlZE9iamVjdCRhZGRGYWNldChGYWNldENsYXNzLCBmYWNldENvbmZpZywgZmFjZXROYW1lLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgY2hlY2soRmFjZXRDbGFzcywgRnVuY3Rpb24pO1xuICAgIGNoZWNrKGZhY2V0TmFtZSwgTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSk7XG5cbiAgICAvLyBmaXJzdCBsZXR0ZXIgb2YgZmFjZXQgbmFtZSBzaG91bGQgYmUgbG93ZXJjYXNlXG4gICAgZmFjZXROYW1lID0gXy5maXJzdExvd2VyQ2FzZShmYWNldE5hbWUgfHwgRmFjZXRDbGFzcy5uYW1lKTtcblxuICAgIC8vIGdldCBmYWNldHMgZGVmaW5lZCBpbiBjbGFzc1xuICAgIHZhciBwcm90b0ZhY2V0cyA9IHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmZhY2V0c0NsYXNzZXM7XG5cbiAgICAvLyBjaGVjayB0aGF0IHRoaXMgZmFjZXROYW1lIHdhcyBub3QgYWxyZWFkeSB1c2VkIGluIHRoZSBjbGFzc1xuICAgIGlmIChwcm90b0ZhY2V0cyAmJiBwcm90b0ZhY2V0c1tmYWNldE5hbWVdKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhY2V0ICcgKyBmYWNldE5hbWUgKyAnIGlzIGFscmVhZHkgcGFydCBvZiB0aGUgY2xhc3MgJyArIHRoaXMuY29uc3RydWN0b3IubmFtZSk7XG5cbiAgICAvLyBjaGVjayB0aGF0IHRoaXMgZmFjZU5hbWUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBvbiB0aGUgZmFjZXRlZCBvYmplY3RcbiAgICBpZiAodGhpc1tmYWNldE5hbWVdKSB7XG4gICAgICAgIHZhciBtZXNzYWdlID0gJ2ZhY2V0ICcgKyBmYWNldE5hbWUgKyAnIGlzIGFscmVhZHkgcHJlc2VudCBpbiBvYmplY3QnO1xuICAgICAgICBpZiAodGhyb3dPbkVycm9ycyA9PT0gZmFsc2UpXG4gICAgICAgICAgICByZXR1cm4gbG9nZ2VyLmVycm9yKCdGYWNldGVkT2JqZWN0IGFkZEZhY2V0OiAnLCBtZXNzYWdlKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8vIGluc3RhbnRpYXRlIHRoZSBmYWNldFxuICAgIHZhciBuZXdGYWNldCA9IHRoaXMuZmFjZXRzW2ZhY2V0TmFtZV0gPSBuZXcgRmFjZXRDbGFzcyh0aGlzLCBmYWNldENvbmZpZyk7XG5cbiAgICAvLyBhZGQgZmFjZXQgdG8gZmFjZXRlZCBvYmplY3RcbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsIGZhY2V0TmFtZSwgbmV3RmFjZXQsIF8uRU5VTSk7XG5cbiAgICByZXR1cm4gbmV3RmFjZXQ7XG59XG5cblxuLyoqXG4gKiBGYWNldGVkT2JqZWN0IGNsYXNzIG1ldGhvZFxuICogUmV0dXJucyByZWZlcmVuY2UgdG8gdGhlIGZhY2V0IGNsYXNzIGlmIHRoZSBmYWNldCB3aXRoIGBmYWNldE5hbWVgIGlzIHBhcnQgb2YgdGhlIGNsYXNzLCBgdW5kZWZpbmVkYCBvdGhlcndpc2UuIElmIHN1YmNsYXNzIGlzIGNyZWF0ZWQgdXNpbmcgXy5jcmVhdGVTdWJjbGFzcyAoYXMgaXQgc2hvdWxkIGJlKSBpdCB3aWxsIGFsc28gaGF2ZSB0aGlzIG1ldGhvZC5cbiAqIFxuICogQHBhcmFtIHtTdWJjbGFzcyhGYWNldGVkT2JqZWN0KX0gdGhpcyB0aGlzIGluIHRoaXMgbWV0aG9kIHJlZmVycyB0byBGYWNldGVkT2JqZWN0IChvciBpdHMgc3ViY2xhc3MpIHRoYXQgY2FsbHMgdGhpcyBtZXRob2RcbiAqIEBwYXJhbSB7U3RyaW5nfSBmYWNldE5hbWVcbiAqIEByZXR1cm4ge1N1YmNsYXNzKEZhY2V0KXx1bmRlZmluZWR9IFxuICovXG5mdW5jdGlvbiBGYWNldGVkT2JqZWN0JCRoYXNGYWNldChmYWNldE5hbWUpIHtcbiAgICAvLyB0aGlzIHJlZmVycyB0byB0aGUgRmFjZXRlZE9iamVjdCBjbGFzcyAob3Igc3ViY2xhc3MpLCBub3QgaW5zdGFuY2VcbiAgICB2YXIgcHJvdG9GYWNldHMgPSB0aGlzLnByb3RvdHlwZS5mYWNldHNDbGFzc2VzO1xuICAgIHJldHVybiBwcm90b0ZhY2V0cyAmJiBwcm90b0ZhY2V0c1tmYWNldE5hbWVdO1xufVxuXG4vKipcbiAqIEZhY2V0ZWRPYmplY3QgY2xhc3MgbWV0aG9kXG4gKiBSZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBmYWNldFxuICogQHBhcmFtIHtTdHJpbmd9IGZhY2V0TmFtZSB0aGUgZmFjZXQgd2hpY2ggY29uZmlnIHNob3VsZCBiZSByZXRyaWV2ZWRcbiAqIEByZXR1cm4ge09iamVjdH0gdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgd2FzIHBhc3NlZCB0byB0aGUgZmFjZXRcbiAqL1xuZnVuY3Rpb24gRmFjZXRlZE9iamVjdCQkZ2V0RmFjZXRDb25maWcoZmFjZXROYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRmFjZXQoZmFjZXROYW1lKSA/IHRoaXMucHJvdG90eXBlLmZhY2V0c0NvbmZpZ1tmYWNldE5hbWVdIDogbnVsbDtcbn1cblxuXG4vKipcbiAqIEZhY2V0ZWRPYmplY3QgY2xhc3MgbWV0aG9kXG4gKiBDbGFzcyBmYWN0b3J5IHRoYXQgY3JlYXRlcyBjbGFzc2VzIChjb25zdHJ1Y3RvciBmdW5jdGlvbnMpIGZyb20gdGhlIG1hcHMgb2YgZmFjZXRzIGFuZCB0aGVpciBjb25maWd1cmF0aW9ucy5cbiAqIENyZWF0ZWQgY2xhc3Mgd2lsbCBiZSBzdWJjbGFzcyBvZiBgRmFjZXRlZE9iamVjdGAuXG4gKlxuICogQHBhcmFtIHtTdWJjbGFzcyhGYWNldGVkT2JqZWN0KX0gdGhpcyB0aGlzIGluIHRoaXMgbWV0aG9kIHJlZmVycyB0byBGYWNldGVkT2JqZWN0IChvciBpdHMgc3ViY2xhc3MpIHRoYXQgY2FsbHMgdGhpcyBtZXRob2RcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIGNsYXNzIG5hbWUgKHdpbGwgYmUgZnVuY3Rpb24gbmFtZSBvZiBjbGFzcyBjb25zdHJ1Y3RvciBmdW5jdGlvbilcbiAqIEBwYXJhbSB7T2JqZWN0W1N1YmNsYXNzKEZhY2V0KV19IGZhY2V0c0NsYXNzZXMgbWFwIG9mIGNsYXNzZXMgb2YgZmFjZXRzIHRoYXQgd2lsbCBjb25zdGl0dXRlIHRoZSBjcmVhdGVkIGNsYXNzXG4gKiBAcGFyYW0ge09iamVjdFtPYmplY3RdfSBmYWNldHNDb25maWcgbWFwIG9mIGZhY2V0cyBjb25maWd1cmF0aW9uLCBzaG91bGQgaGF2ZSB0aGUgc2FtZSBrZXlzIGFzIHRoZSBtYXAgb2YgY2xhc3Nlcy4gU29tZSBmYWNldHMgbWF5IG5vdCBoYXZlIGNvbmZpZ3VyYXRpb24sIGJ1dCB0aGUgY29uZmlndXJhdGlvbiBmb3IgYSBmYWNldCB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiBmYWNldHNDbGFzc2VzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uXG4gKiBAcmV0dXJuIHtTdWJjbGFzcyhGYWNldGVkT2JqZWN0KX1cbiAqL1xuZnVuY3Rpb24gRmFjZXRlZE9iamVjdCQkY3JlYXRlRmFjZXRlZENsYXNzKG5hbWUsIGZhY2V0c0NsYXNzZXMsIGZhY2V0c0NvbmZpZykge1xuICAgIGNoZWNrKG5hbWUsIFN0cmluZyk7XG4gICAgY2hlY2soZmFjZXRzQ2xhc3NlcywgTWF0Y2guT3B0aW9uYWwoTWF0Y2guT2JqZWN0SGFzaChNYXRjaC5TdWJjbGFzcyhGYWNldCwgdHJ1ZSkpKSk7XG4gICAgY2hlY2soZmFjZXRzQ29uZmlnLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKTtcblxuICAgIC8vIHRocm93IGV4Y2VwdGlvbiBpZiBjb25maWcgcGFzc2VkIGZvciBmYWNldCBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gY2xhc3NcbiAgICBpZiAoZmFjZXRzQ29uZmlnKVxuICAgICAgICBfLmVhY2hLZXkoZmFjZXRzQ29uZmlnLCBmdW5jdGlvbihmY3RDb25maWcsIGZjdE5hbWUpIHtcbiAgICAgICAgICAgIGlmICghIGZhY2V0c0NsYXNzZXMuaGFzT3duUHJvcGVydHkoZmN0TmFtZSkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb25maWd1cmF0aW9uIGZvciBmYWNldCAoJyArIGZjdE5hbWUgKyAnKSBwYXNzZWQgdGhhdCBpcyBub3QgaW4gY2xhc3MnKTtcbiAgICAgICAgfSk7XG5cbiAgICAvLyBjcmVhdGUgc3ViY2xhc3Mgb2YgdGhlIGN1cnJlbnQgY2xhc3MgKHRoaXMgcmVmZXJzIHRvIHRoZSBjbGFzcyB0aGF0IGNhbGxzIHRoaXMgbWV0aG9kKVxuICAgIHZhciBGYWNldGVkQ2xhc3MgPSBfLmNyZWF0ZVN1YmNsYXNzKHRoaXMsIG5hbWUsIHRydWUpO1xuXG4gICAgLy8gZ2V0IGZhY2V0cyBjbGFzc2VzIGFuZCBjb25maWd1cmF0aW9ucyBmcm9tIHBhcmVudCBjbGFzc1xuICAgIGZhY2V0c0NsYXNzZXMgPSBhZGRJbmhlcml0ZWRGYWNldHModGhpcywgZmFjZXRzQ2xhc3NlcywgJ2ZhY2V0c0NsYXNzZXMnKTtcbiAgICBmYWNldHNDb25maWcgPSBhZGRJbmhlcml0ZWRGYWNldHModGhpcywgZmFjZXRzQ29uZmlnLCAnZmFjZXRzQ29uZmlnJyk7XG5cbiAgICAvLyBzdG9yZSBmYWNldHMgY2xhc3NlcyBhbmQgY29uZmlndXJhdGlvbnMgb2YgY2xhc3MgcHJvdG90eXBlXG4gICAgXy5leHRlbmRQcm90byhGYWNldGVkQ2xhc3MsIHtcbiAgICAgICAgZmFjZXRzQ2xhc3NlczogZmFjZXRzQ2xhc3NlcyxcbiAgICAgICAgZmFjZXRzQ29uZmlnOiBmYWNldHNDb25maWdcbiAgICB9KTtcblxuICAgIHJldHVybiBGYWNldGVkQ2xhc3M7XG5cblxuICAgIGZ1bmN0aW9uIGFkZEluaGVyaXRlZEZhY2V0cyhzdXBlckNsYXNzLCBmYWNldHNJbmZvLCBmYWNldHNJbmZvTmFtZSkge1xuICAgICAgICB2YXIgaW5oZXJpdGVkRmFjZXRzSW5mbyA9IHN1cGVyQ2xhc3MucHJvdG90eXBlW2ZhY2V0c0luZm9OYW1lXTtcbiAgICAgICAgaWYgKGluaGVyaXRlZEZhY2V0c0luZm8pXG4gICAgICAgICAgICByZXR1cm4gXyhpbmhlcml0ZWRGYWNldHNJbmZvKVxuICAgICAgICAgICAgICAgICAgICAuY2xvbmUoKVxuICAgICAgICAgICAgICAgICAgICAuZXh0ZW5kKGZhY2V0c0luZm8gfHwge30pLl8oKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIGZhY2V0c0luZm87XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENsYXNzUmVnaXN0cnk7XG5cblxuLyoqXG4gKiBgbWlsby5jbGFzc2VzLkNsYXNzUmVnaXN0cnlgIC0gdGhlIHJlZ2lzdHJ5IG9mIGNsYXNzZXMgY2xhc3MuXG4gKiBDb21wb25lbnRzIGFuZCBGYWNldHMgcmVnaXN0ZXIgdGhlbXNlbHZlcyBpbiByZWdpc3RyaWVzLiBJdCBhbGxvd3MgdG8gYXZvaWQgcmVxdWlyaW5nIHRoZW0gZnJvbSBvbmUgbW9kdWxlIGFuZCBwcmV2ZW50cyBjaXJjdWxhciBkZXBlbmRlbmNpZXMgYmV0d2VlbiBtb2R1bGVzLlxuICogXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBGb3VuZGF0aW9uQ2xhc3MgQWxsIGNsYXNzZXMgdGhhdCBhcmUgcmVnaXN0ZXJlZCBpbiB0aGUgcmVnaXN0cnkgc2hvdWxkIGJlIHN1YmNsYXNzZXMgb2YgdGhlIEZvdW5kYXRpb25DbGFzc1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBDbGFzc1JlZ2lzdHJ5IChGb3VuZGF0aW9uQ2xhc3MpIHtcbiAgICBpZiAoRm91bmRhdGlvbkNsYXNzKVxuICAgICAgICB0aGlzLnNldENsYXNzKEZvdW5kYXRpb25DbGFzcyk7XG5cbiAgICB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXMgPSB7fTtcbn1cblxuXG4vKipcbiAqICMjIyNDbGFzc1JlZ2lzdHJ5IGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbYWRkXSgjYWRkKVxuICogLSBbZ2V0XSgjZ2V0KVxuICogLSBbcmVtb3ZlXSgjcmVtb3ZlKVxuICogLSBbY2xlYW5dKCNjbGVhbilcbiAqIC0gW3NldENsYXNzXSgjc2V0Q2xhc3MpXG4gKi9cbl8uZXh0ZW5kUHJvdG8oQ2xhc3NSZWdpc3RyeSwge1xuICAgIGFkZDogYWRkLFxuICAgIGdldDogZ2V0LFxuICAgIHJlbW92ZTogcmVtb3ZlLFxuICAgIGNsZWFuOiBjbGVhbixcbiAgICBzZXRDbGFzczogc2V0Q2xhc3Ncbn0pO1xuXG5cbi8qKlxuICogQ2xhc3NSZWdpc3RyeSBpbnN0YW5jZSBtZXRob2QgdGhhdCByZWdpc3RlcnMgYSBjbGFzcyBpbiB0aGUgcmVnaXN0cnkuXG4gKiBUaGUgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGEgY2xhc3MgaXMgcmVnaXN0ZXJlZCB1bmRlciB0aGUgc2FtZSBuYW1lIGFzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBjbGFzcy5cbiAqIFRoZSBtZXRob2QgYWxsb3dzIHJlZ2lzdGVyaW5nIHRoZSBzYW1lIGNsYXNzIHVuZGVyIGEgZGlmZmVyZW50IG5hbWUsIHNvIGNsYXNzIGFsaWFzZXMgY2FuIGJlIGNyZWF0ZWQuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gYUNsYXNzIGNsYXNzIHRvIHJlZ2lzdGVyIGluIHRoZSByZWdpc3RyeS4gU2hvdWxkIGJlIHN1YmNsYXNzIG9mIGB0aGlzLkZvdW5kYXRpb25DbGFzc2AuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBPcHRpb25hbCBjbGFzcyBuYW1lLiBJZiBjbGFzcyBuYW1lIGlzIG5vdCBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgdGFrZW4gZnJvbSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBuYW1lLiBDbGFzcyBuYW1lIHNob3VsZCBiZSBhIHZhbGlkIGlkZW50aWZpZXIgYW5kIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGFkZChhQ2xhc3MsIG5hbWUpIHtcbiAgICBuYW1lID0gbmFtZSB8fCBhQ2xhc3MubmFtZTtcblxuICAgIGNoZWNrKG5hbWUsIE1hdGNoLklkZW50aWZpZXJTdHJpbmcsICdjbGFzcyBuYW1lIG11c3QgYmUgaWRlbnRpZmllciBzdHJpbmcnKTtcblxuICAgIGlmICh0aGlzLkZvdW5kYXRpb25DbGFzcykge1xuICAgICAgICBpZiAoYUNsYXNzICE9IHRoaXMuRm91bmRhdGlvbkNsYXNzKVxuICAgICAgICAgICAgY2hlY2soYUNsYXNzLCBNYXRjaC5TdWJjbGFzcyh0aGlzLkZvdW5kYXRpb25DbGFzcyksICdjbGFzcyBtdXN0IGJlIGEgc3ViKGNsYXNzKSBvZiBhIGZvdW5kYXRpb24gY2xhc3MnKTtcbiAgICB9IGVsc2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmb3VuZGF0aW9uIGNsYXNzIG11c3QgYmUgc2V0IGJlZm9yZSBhZGRpbmcgY2xhc3NlcyB0byByZWdpc3RyeScpO1xuXG4gICAgaWYgKHRoaXMuX19yZWdpc3RlcmVkQ2xhc3Nlc1tuYW1lXSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjbGFzcyBcIicgKyBuYW1lICsgJ1wiIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCcpO1xuXG4gICAgdGhpcy5fX3JlZ2lzdGVyZWRDbGFzc2VzW25hbWVdID0gYUNsYXNzO1xufTtcblxuXG4vKipcbiAqIEdldHMgY2xhc3MgZnJvbSByZWdpc3RyeSBieSBuYW1lXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgQ2xhc3MgbmFtZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGdldChuYW1lKSB7XG4gICAgY2hlY2sobmFtZSwgU3RyaW5nLCAnY2xhc3MgbmFtZSBtdXN0IGJlIHN0cmluZycpO1xuICAgIHJldHVybiB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXNbbmFtZV07XG59O1xuXG5cbi8qKlxuICogUmVtb3ZlIGNsYXNzIGZyb20gcmVnaXN0cnkgYnkgaXRzIG5hbWUuXG4gKiBJZiBjbGFzcyBpcyBub3QgcmVnaXN0ZXJlZCwgdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uXG4gKiBcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBuYW1lT3JDbGFzcyBDbGFzcyBuYW1lLiBJZiBjbGFzcyBjb25zdHJ1Y3RvciBpcyBzdXBwbGllZCwgaXRzIG5hbWUgd2lsbCBiZSB1c2VkLlxuICovXG5mdW5jdGlvbiByZW1vdmUobmFtZU9yQ2xhc3MpIHtcbiAgICBjaGVjayhuYW1lT3JDbGFzcywgTWF0Y2guT25lT2YoU3RyaW5nLCBGdW5jdGlvbiksICdjbGFzcyBvciBuYW1lIG11c3QgYmUgc3VwcGxpZWQnKTtcblxuICAgIHZhciBuYW1lID0gdHlwZW9mIG5hbWVPckNsYXNzID09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG5hbWVPckNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG5hbWVPckNsYXNzLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICBpZiAoISB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXNbbmFtZV0pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2xhc3MgaXMgbm90IHJlZ2lzdGVyZWQnKTtcblxuICAgIGRlbGV0ZSB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXNbbmFtZV07XG59O1xuXG5cbi8qKlxuICogUmVtb3ZlcyBhbGwgY2xhc3NlcyBmcm9tIHJlZ2lzdHJ5LlxuICovXG5mdW5jdGlvbiBjbGVhbigpIHtcbiAgICB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXMgPSB7fTtcbn07XG5cblxuLyoqXG4gKiBTZXRzIGBGb3VuZGF0aW9uQ2xhc3NgIG9mIHRoZSByZWdpc3RyeS4gSXQgc2hvdWxkIGJlIHNldCBiZWZvcmUgYW55IGNsYXNzIGNhbiBiZSBhZGRlZC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBGb3VuZGF0aW9uQ2xhc3MgQW55IGNsYXNzIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgcmVnaXN0cnkgc2hvdWxkIGJlIGEgc3ViY2xhc3Mgb2YgdGhpcyBjbGFzcy4gRm91bmRhdGlvbkNsYXNzIGl0c2VsZiBjYW4gYmUgYWRkZWQgdG8gdGhlIHJlZ2lzdHJ5IHRvby5cbiAqL1xuZnVuY3Rpb24gc2V0Q2xhc3MoRm91bmRhdGlvbkNsYXNzKSB7XG4gICAgY2hlY2soRm91bmRhdGlvbkNsYXNzLCBGdW5jdGlvbik7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnRm91bmRhdGlvbkNsYXNzJywgRm91bmRhdGlvbkNsYXNzLCBfLkVOVU0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQXR0cmlidXRlID0gcmVxdWlyZSgnLi9hX2NsYXNzJylcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxuXG52YXIgQVRUUklCVVRFX1JFR0VYUD0gL14oW15cXDpcXFtcXF1dKikoPzpcXFsoW15cXDpcXFtcXF1dKilcXF0pP1xcOj8oW146XSopJC9cbiAgICAsIEZBQ0VUU19TUExJVF9SRUdFWFAgPSAvXFxzKig/OlxcLHxcXHMpXFxzKi9cbiAgICAsIEFUVFJJQlVURV9URU1QTEFURSA9ICclY29tcENsYXNzJWNvbXBGYWNldHM6JWNvbXBOYW1lJztcblxuXG4vKipcbiAqIGBtaWxvLmF0dHJpYnV0ZXMuYmluZGBcbiAqIEJpbmRBdHRyaWJ1dGUgY2xhc3MgcGFyc2VzL3ZhbGlkYXRlcy9ldGMuIGFuIGF0dHJpYnV0ZSB0aGF0IGJpbmRzIERPTSBlbGVtZW50cyB0byBtaWxvIGNvbXBvbmVudHMuXG4gKiBQb3NzaWJsZSBhdHRyaWJ1dGUgdmFsdWVzIGFyZTpcbiAqXG4gKiAtIGA6bXlWaWV3YCAtIG9ubHkgY29tcG9uZW50IG5hbWVcbiAqIC0gYFZpZXc6bXlWaWV3YCAtIGNsYXNzIGFuZCBjb21wb25lbnQgbmFtZVxuICogLSBgW0V2ZW50cywgRGF0YV06bXlWaWV3YCAtIGZhY2V0cyBhbmQgY29tcG9uZW50IG5hbWVcbiAqIC0gYFZpZXdbRXZlbnRzXTpteVZpZXdgIC0gY2xhc3MsIGZhY2V0KHMpIGFuZCBjb21wb25lbnQgbmFtZVxuICpcbiAqIFNlZSBbYmluZGVyXSguLi9iaW5kZXIuanMuaHRtbCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKi9cbnZhciBCaW5kQXR0cmlidXRlID0gXy5jcmVhdGVTdWJjbGFzcyhBdHRyaWJ1dGUsICdCaW5kQXR0cmlidXRlJywgdHJ1ZSk7XG5cblxuLyoqXG4gKiAjIyMjQmluZEF0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2F0dHJOYW1lXSgjYXR0ck5hbWUpXG4gKiAtIFtwYXJzZV0oI3BhcnNlKVxuICogLSBbdmFsaWRhdGVdKCN2YWxpZGF0ZSlcbiAqIC0gW3JlbmRlcl0oI3JlbmRlcilcbiAqL1xuXy5leHRlbmRQcm90byhCaW5kQXR0cmlidXRlLCB7XG4gICAgYXR0ck5hbWU6IGF0dHJOYW1lLFxuICAgIHBhcnNlOiBwYXJzZSxcbiAgICB2YWxpZGF0ZTogdmFsaWRhdGUsXG4gICAgcmVuZGVyOiByZW5kZXJcbn0pO1xuXG5cbi8qKlxuICogQmluZEF0dHJpYnV0ZSBjbGFzcyBtZXRob2RzXG4gKlxuICogLSBbc2V0SW5mb10oI0JpbmRBdHRyaWJ1dGUkJHNldEluZm8pXG4gKi9cbl8uZXh0ZW5kKEJpbmRBdHRyaWJ1dGUsIHtcbiAgICBzZXRJbmZvOiBCaW5kQXR0cmlidXRlJCRzZXRJbmZvXG59KTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IEJpbmRBdHRyaWJ1dGU7XG5cblxuLyoqXG4gKiBCaW5kQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCB0aGF0IHJldHVybnMgYXR0cmlidXRlIG5hbWUsIGJ5IGRlZmF1bHQgLSBgJ21sLWJpbmQnYC5cbiAqIFRvIGNvbmZpZ3VyZSBiaW5kIGF0dHJpYnV0ZSBuYW1lIHVzZTpcbiAqIGBgYFxuICogbWlsby5jb25maWcoeyBhdHRyczogeyBiaW5kOiAnY2MtYmluZCcgfSB9KTsgLy8gd2lsbCBzZXQgYmluZCBhdHRyaWJ1dGUgdG8gJ2NjLWJpbmQnXG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGF0dHJOYW1lKCkge1xuICAgIHJldHVybiBjb25maWcuYXR0cnMuYmluZDtcbn1cblxuXG4vKipcbiAqIEJpbmRBdHRyaWJ1dGUgaW5zdGFuY2UgbWV0aG9kIHRoYXQgcGFyc2VzIGJpbmQgYXR0cmlidXRlIGlmIGl0IGlzIHByZXNlbnQgb24gdGhlIGVsZW1lbnQuXG4gKiBJdCBkZWZpbmVzIHByb3BlcnRpZXMgYGNvbXBDbGFzc2AsIGBjb21wRmFjZXRzYCBhbmQgYGNvbXBOYW1lYCBvbiBCaW5kQXR0cmlidXRlIGluc3RhbmNlLlxuICogUmV0dXJucyB0aGUgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAqXG4gKiBAcmV0dXJuIHtCaW5kQXR0cmlidXRlfVxuICovXG4gZnVuY3Rpb24gcGFyc2UoKSB7XG4gICAgaWYgKCEgdGhpcy5ub2RlKSByZXR1cm47XG5cbiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldCgpO1xuXG4gICAgaWYgKHZhbHVlKVxuICAgICAgICB2YXIgYmluZFRvID0gdmFsdWUubWF0Y2goQVRUUklCVVRFX1JFR0VYUCk7XG5cbiAgICBpZiAoISBiaW5kVG8pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBiaW5kIGF0dHJpYnV0ZSAnICsgdmFsdWUpO1xuXG4gICAgdGhpcy5jb21wQ2xhc3MgPSBiaW5kVG9bMV0gfHwgJ0NvbXBvbmVudCc7XG4gICAgdGhpcy5jb21wRmFjZXRzID0gKGJpbmRUb1syXSAmJiBiaW5kVG9bMl0uc3BsaXQoRkFDRVRTX1NQTElUX1JFR0VYUCkpIHx8IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNvbXBOYW1lID0gYmluZFRvWzNdIHx8IHVuZGVmaW5lZDsgLy8gdW5kZWZpbmVkIGlzIG5vdCBzYW1lIGFzICcnXG5cbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIEJpbmRBdHRyaWJ1dGUgaW5zdGFuY2UgbWV0aG9kIHRoYXQgdmFsaWRhdGVzIGJpbmQgYXR0cmlidXRlLCB0aHJvd3MgaWYgaXQgaGFzIGFuIGludmFsaWQgdmFsdWUuXG4gKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICpcbiAqIEByZXR1cm4ge0JpbmRBdHRyaWJ1dGV9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuICAgIGNoZWNrKHRoaXMuY29tcE5hbWUsIE1hdGNoLklkZW50aWZpZXJTdHJpbmcpO1xuXG4gICAgaWYgKCEgdGhpcy5jb21wQ2xhc3MpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZW1wdHkgY29tcG9uZW50IGNsYXNzIG5hbWUgJyArIHRoaXMuY29tcENsYXNzKTtcblxuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogQmluZEF0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdmFsdWUgZm9yIGdpdmVuIHZhbHVlcyBvZiBwcm9wZXJ0aWVzIGBjb21wQ2xhc3NgLCBgY29tcE5hbWVgIGFuZCBgY29tcEZhY2V0c2AuXG4gKiBJZiBgdGhpcy5jb21wTmFtZWAgaXMgbm90IHNldCBpdCB3aWxsIGJlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHRoaXMuY29tcE5hbWUgPSB0aGlzLmNvbXBOYW1lIHx8IG1pbG8udXRpbC5jb21wb25lbnROYW1lKCk7XG4gICAgcmV0dXJuIEFUVFJJQlVURV9URU1QTEFURVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCclY29tcENsYXNzJywgdGhpcy5jb21wQ2xhc3MgfHwgJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJyVjb21wRmFjZXRzJywgdGhpcy5jb21wRmFjZXRzICYmIHRoaXMuY29tcEZhY2V0cy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnWycgKyB0aGlzLmNvbXBGYWNldHMuam9pbignLCAnKSArICddJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICcnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCclY29tcE5hbWUnLCB0aGlzLmNvbXBOYW1lKTtcbn1cblxuXG4vKipcbiAqIEJpbmRBdHRyaWJ1dGUgY2xhc3MgbWV0aG9kXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKiBAcGFyYW0ge1N0cmluZ30gY29tcG9uZW50Q2xhc3Mgb3B0aW9uYWwgY2xhc3MgbmFtZVxuICogQHBhcmFtIHtTdHJpbmd9IGNvbXBvbmVudE5hbWUgb3B0aW9uYWxcbiAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nPn0gY29tcG9uZW50RmFjZXRzIG9wdGlvbmFsIGV4dHJhIGZhY2V0IHRvIGFkZCB0byB0aGUgY2xhc3NcbiAqL1xuZnVuY3Rpb24gQmluZEF0dHJpYnV0ZSQkc2V0SW5mbyhlbCwgY29tcG9uZW50Q2xhc3MsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudEZhY2V0cykge1xuICAgIHZhciBhdHRyID0gbmV3IEJpbmRBdHRyaWJ1dGUoZWwpO1xuICAgIF8uZXh0ZW5kKGF0dHIsIHtcbiAgICAgICAgY29tcENsYXNzOiBjb21wb25lbnRDbGFzcyxcbiAgICAgICAgY29tcE5hbWU6IGNvbXBvbmVudE5hbWUsXG4gICAgICAgIGNvbXBGYWNldHM6IGNvbXBvbmVudEZhY2V0c1xuICAgIH0pO1xuICAgIGF0dHIuZGVjb3JhdGUoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gQXR0cmlidXRlO1xuXG5cbi8qKlxuICogQW4gYWJzY3RyYWN0IGNsYXNzIGZvciBwYXJzaW5nIGFuZCB2YWxpZGF0aW9uIG9mIGVsZW1lbnQgYXR0cmlidXRlcy5cbiAqIFN1YmNsYXNzZXMgc2hvdWxkIGRlZmluZSBtZXRob2RzIGBhdHRyTmFtZWAsIGBwYXJzZWAsIGB2YWxpZGF0ZWAgYW5kIGByZW5kZXJgLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWwgRE9NIGVsZW1lbnQgd2hlcmUgYXR0cmlidXRlIGlzIGF0dGFjaGVkXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBPcHRpb25hbCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUsIHVzdWFsbHkgc3VwcGxpZWQgYnkgc3ViY2xhc3MgdmlhIGBhdHRyTmFtZWAgbWV0aG9kXG4gKi9cbmZ1bmN0aW9uIEF0dHJpYnV0ZShlbCwgbmFtZSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWUgfHwgdGhpcy5hdHRyTmFtZSgpO1xuICAgIHRoaXMuZWwgPSBlbDtcblxuICAgIC8vIGF0dHJpYnV0ZSBub2RlXG4gICAgdGhpcy5ub2RlID0gZWwuYXR0cmlidXRlc1t0aGlzLm5hbWVdO1xufVxuXG5cbl8uZXh0ZW5kKEF0dHJpYnV0ZSwge1xuICAgIHJlbW92ZTogQXR0cmlidXRlJCRyZW1vdmVcbn0pO1xuXG5cbi8qKlxuICogIyMjI0F0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2dldF0oI0F0dHJpYnV0ZSRnZXQpXG4gKiAtIFtzZXRdKCNBdHRyaWJ1dGUkc2V0KVxuICogLSBbZGVjb3JhdGVdKCNBdHRyaWJ1dGUkZGVjb3JhdGUpXG4gKlxuICogVGhlIGZvbGxvd2luZyBpbnN0YW5jZSBtZXRob2RzIHNob3VsZCBiZSBkZWZpbmVkIGJ5IHN1YmNsYXNzXG4gKlxuICogLSBhdHRyTmFtZSAtIHNob3VsZCByZXR1cm4gYXR0cmlidXRlIG5hbWVcbiAqIC0gcGFyc2UgLSBzaG91bGQgcGFyc2UgYXR0cmlidXRlIHZhbHVlXG4gKiAtIHZhbGlkYXRlIC0gc2hvdWxkIHZhbGlkYXRlIGF0dHJpYnV0ZSB2YWx1ZSwgdGhyb3dpbmcgZXhjZXB0aW9uIGlmIGl0IGlzIGluY29ycmVjdCBcbiAqIC0gcmVuZGVyIC0gc2hvdWxkIHJldHVybiBhdHRyaWJ1dGUgdmFsdWUgZm9yIGEgZ2l2ZW4gYXR0cmlidXRlIHN0YXRlIChvdGhlciBwcm9wZXJ0aWVzLCBhcyBkZWZpbmVkIGluIHN1YmNsYXNzKVxuICovXG5fLmV4dGVuZFByb3RvKEF0dHJpYnV0ZSwge1xuICAgIGdldDogQXR0cmlidXRlJGdldCxcbiAgICBzZXQ6IEF0dHJpYnV0ZSRzZXQsXG4gICAgcmVtb3ZlOiBBdHRyaWJ1dGUkcmVtb3ZlLFxuICAgIGRlY29yYXRlOiBBdHRyaWJ1dGUkZGVjb3JhdGUsXG5cbiAgICBkZXN0cm95OiBBdHRyaWJ1dGUkZGVzdHJveSxcblxuICAgIC8vIHNob3VsZCBiZSBkZWZpbmVkIGluIHN1YmNsYXNzXG4gICAgYXR0ck5hbWU6IHRvQmVJbXBsZW1lbnRlZCxcbiAgICBwYXJzZTogdG9CZUltcGxlbWVudGVkLFxuICAgIHZhbGlkYXRlOiB0b0JlSW1wbGVtZW50ZWQsXG4gICAgcmVuZGVyOiB0b0JlSW1wbGVtZW50ZWRcbn0pO1xuXG5cbmZ1bmN0aW9uIEF0dHJpYnV0ZSQkcmVtb3ZlKGVsLCBkZWVwKSB7XG4gICAgdmFyIG5hbWUgPSB0aGlzLnByb3RvdHlwZS5hdHRyTmFtZSgpO1xuICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcblxuICAgIGlmIChkZWVwKSB7XG4gICAgICAgIHZhciBzZWxlY3RvciA9ICdbJyArIG5hbWUgKyAnXSc7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAgICBfLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkRWwpIHtcbiAgICAgICAgICAgIGNoaWxkRWwucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICB9KVxuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBBdHRyaWJ1dGUkcmVtb3ZlKCkge1xuICAgIGRlbGV0ZSB0aGlzLm5vZGU7XG59XG5cblxuZnVuY3Rpb24gQXR0cmlidXRlJGRlc3Ryb3koKSB7XG4gICAgZGVsZXRlIHRoaXMuZWw7XG4gICAgZGVsZXRlIHRoaXMubm9kZTtcbn1cblxuLyoqXG4gKiBBdHRyaWJ1dGUgaW5zdGFuY2UgbWV0aG9kIHRoYXQgcmV0dXJucyBhdHRyaWJ1dGUgdmFsdWUgYXMgc3RyaW5nLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gQXR0cmlidXRlJGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbC5nZXRBdHRyaWJ1dGUodGhpcy5uYW1lKTtcbn1cblxuXG4vKipcbiAqIEF0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2QgdGhhdCBzZXRzIGF0dHJpYnV0ZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqL1xuZnVuY3Rpb24gQXR0cmlidXRlJHNldCh2YWx1ZSkge1xuICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKHRoaXMubmFtZSwgdmFsdWUpO1xufVxuXG5cbi8qKlxuICogQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCB0aGF0IGRlY29yYXRlcyBlbGVtZW50IHdpdGggaXRzIHJlbmRlcmVkIHZhbHVlLlxuICogVXNlcyBgcmVuZGVyYCBtZXRob2QgdGhhdCBzaG91bGQgYmUgZGVmaWVuZCBpbiBzdWJjbGFzcy5cbiAqL1xuZnVuY3Rpb24gQXR0cmlidXRlJGRlY29yYXRlKCkge1xuICAgIHRoaXMuc2V0KHRoaXMucmVuZGVyKCkpO1xufVxuXG5cbmZ1bmN0aW9uIHRvQmVJbXBsZW1lbnRlZCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxpbmcgdGhlIG1ldGhvZCBvZiBhbiBhYnNjdHJhY3QgY2xhc3MnKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEF0dHJpYnV0ZSA9IHJlcXVpcmUoJy4vYV9jbGFzcycpXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbi8qKlxuICogYG1pbG8uYXR0cmlidXRlcy5sb2FkYFxuICogTG9hZEF0dHJpYnV0ZSBjbGFzcyBwYXJzZXMvdmFsaWRhdGVzL2V0Yy4gYW4gYXR0cmlidXRlIHRoYXQgbG9hZHMgc3ViLXZpZXdzIGludG8gdGhlIHBhZ2UuXG4gKiBBdHRyaWJ1dGUgdmFsdWUgc2hvdWxkIGJlIFVSTCBvZiB0aGUgZmlsZSB0byBsb2FkIHN1YnZpZXcgZnJvbS5cbiAqIFNlZSBbbG9hZGVyXSguLi9sb2FkZXIuanMuaHRtbCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKi9cbnZhciBMb2FkQXR0cmlidXRlID0gXy5jcmVhdGVTdWJjbGFzcyhBdHRyaWJ1dGUsICdMb2FkQXR0cmlidXRlJywgdHJ1ZSk7XG5cblxuLyoqXG4gKiAjIyMjTG9hZEF0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2F0dHJOYW1lXSgjYXR0ck5hbWUpXG4gKiAtIFtwYXJzZV0oI3BhcnNlKVxuICogLSBbdmFsaWRhdGVdKCN2YWxpZGF0ZSlcbiAqIC0gW3JlbmRlcl0oI3JlbmRlcilcbiAqL1xuXy5leHRlbmRQcm90byhMb2FkQXR0cmlidXRlLCB7XG4gICAgYXR0ck5hbWU6IGF0dHJOYW1lLFxuICAgIHBhcnNlOiBwYXJzZSxcbiAgICB2YWxpZGF0ZTogdmFsaWRhdGUsXG4gICAgcmVuZGVyOiByZW5kZXJcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IExvYWRBdHRyaWJ1dGU7XG5cblxuLyoqXG4gKiBCaW5kQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCB0aGF0IHJldHVybnMgYXR0cmlidXRlIG5hbWUsIGJ5IGRlZmF1bHQgLSBgJ21sLWxvYWQnYC5cbiAqIFRvIGNvbmZpZ3VyZSBsb2FkIGF0dHJpYnV0ZSBuYW1lIHVzZTpcbiAqIGBgYFxuICogbWlsby5jb25maWcoeyBhdHRyczogeyBsb2FkOiAnY2MtbG9hZCcgfSB9KTsgLy8gd2lsbCBzZXQgYmluZCBhdHRyaWJ1dGUgdG8gJ2NjLWxvYWQnXG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGF0dHJOYW1lKCkge1xuICAgIHJldHVybiBjb25maWcuYXR0cnMubG9hZDtcbn1cblxuXG4vKipcbiAqIExvYWRBdHRyaWJ1dGUgaW5zdGFuY2UgbWV0aG9kIHRoYXQgcGFyc2VzIGxvYWQgYXR0cmlidXRlIGlmIGl0IGlzIHByZXNlbnQgb24gdGhlIGVsZW1lbnQuXG4gKiBJdCBkZWZpbmVzIHByb3BlcnR5IGBsb2FkVXJsYCBvbiBMb2FkQXR0cmlidXRlIGluc3RhbmNlLlxuICogUmV0dXJucyB0aGUgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAqXG4gKiBAcmV0dXJuIHtMb2FkQXR0cmlidXRlfVxuICovXG5mdW5jdGlvbiBwYXJzZSgpIHtcbiAgICBpZiAoISB0aGlzLm5vZGUpIHJldHVybjtcblxuICAgIHRoaXMubG9hZFVybCA9IHRoaXMuZ2V0KCk7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBMb2FkQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCB0aGF0IHNob3VsZCB2YWxpZGF0ZSBsb2FkIGF0dHJpYnV0ZSBhbmQgdGhyb3cgaWYgaXQgaGFzIGFuIGludmFsaWQgdmFsdWUuXG4gKiBUT0RPIC0gaW1wbGVtZW50IHVybCB2YWxpZGF0aW9uLlxuICogUmV0dXJucyB0aGUgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAqXG4gKiBAcmV0dXJuIHtMb2FkQXR0cmlidXRlfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZSgpIHtcbiAgICAvLyBUT0RPIHVybCB2YWxpZGF0aW9uXG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBMb2FkQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCAtIHJldHVybnMgVVJMXG4gKlxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMubG9hZFVybDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTdWJjbGFzc2VzIG9mIFtBdHRyaWJ1dGVdKC4vYV9jbGFzcy5qcy5odG1sKSBjbGFzc1xuICpcbiAqIC0gW0JpbmRBdHRyaWJ1dGVdKC4vYV9iaW5kLmpzLmh0bWwpXG4gKiAtIFtMb2FkQXR0cmlidXRlXSguL2FfbG9hZC5qcy5odG1sKVxuICovXG52YXIgYXR0cmlidXRlcyA9IG1vZHVsZS5leHBvcnRzID0ge1xuICAgIGJpbmQ6IHJlcXVpcmUoJy4vYV9iaW5kJyksXG4gICAgbG9hZDogcmVxdWlyZSgnLi9hX2xvYWQnKVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9NYWlsID0gcmVxdWlyZSgnLi9zZXJ2aWNlcy9tYWlsJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY29tcG9uZW50cy9jX3JlZ2lzdHJ5JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL2NmX3JlZ2lzdHJ5JylcbiAgICAsIENvbXBvbmVudCA9IGNvbXBvbmVudHNSZWdpc3RyeS5nZXQoJ0NvbXBvbmVudCcpXG4gICAgLCBDb21wb25lbnRJbmZvID0gcmVxdWlyZSgnLi9jb21wb25lbnRzL2NfaW5mbycpXG4gICAgLCBTY29wZSA9IHJlcXVpcmUoJy4vY29tcG9uZW50cy9zY29wZScpXG4gICAgLCBCaW5kQXR0cmlidXRlID0gcmVxdWlyZSgnLi9hdHRyaWJ1dGVzL2FfYmluZCcpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgdXRpbERvbSA9IHJlcXVpcmUoJy4vdXRpbC9kb20nKVxuICAgICwgTWF0Y2ggPSAgY2hlY2suTWF0Y2g7XG5cblxuYmluZGVyLnNjYW4gPSBzY2FuO1xuYmluZGVyLmNyZWF0ZSA9IGNyZWF0ZTtcbmJpbmRlci50d29QYXNzID0gdHdvUGFzcztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGJpbmRlcjtcblxuXG4vKipcbiAqIGBtaWxvLmJpbmRlcmBcbiAqXG4gKiBSZWN1cnNpdmVseSBzY2FucyB0aGUgZG9jdW1lbnQgdHJlZSBpbnNpZGUgYHNjb3BlRWxgIChkb2N1bWVudC5ib2R5IGJ5IGRlZmF1bHQpIGxvb2tpbmcgZm9yIF9fbWwtYmluZF9fIGF0dHJpYnV0ZSB0aGF0IHNob3VsZCBjb250YWluIHRoZSBjbGFzcywgYWRkaXRpb25hbCBmYWNldHMgYW5kIHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgdGhhdCBzaG91bGQgYmUgY3JlYXRlZCBhbmQgYm91bmQgdG8gdGhlIGVsZW1lbnQuXG4gKlxuICogUG9zc2libGUgdmFsdWVzIG9mIF9fbWwtYmluZF9fIGF0dHJpYnV0ZTpcbiAqXG4gKiAtIGA6bXlWaWV3YCAtIG9ubHkgY29tcG9uZW50IG5hbWUuIEFuIGluc3RhbmNlIG9mIENvbXBvbmVudCBjbGFzcyB3aWxsIGJlIGNyZWF0ZWQgd2l0aG91dCBhbnkgZmFjZXRzLlxuICogLSBgVmlldzpteVZpZXdgIC0gY2xhc3MgYW5kIGNvbXBvbmVudCBuYW1lLiBBbiBpbnN0YW5jZSBvZiBWaWV3IGNsYXNzIHdpbGwgYmUgY3JlYXRlZC5cbiAqIC0gYFtFdmVudHMsIERhdGFdOm15Vmlld2AgLSBmYWNldHMgYW5kIGNvbXBvbmVudCBuYW1lLiBBbiBpbnN0YW5jZSBvZiBDb21wb25lbnQgY2xhc3Mgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIGFkZGl0aW9uIG9mIGZhY2V0cyBFdmVudHMgYW5kIERhdGEuXG4gKiAtIGBWaWV3W0V2ZW50cywgRGF0YV06bXlWaWV3YCAtIGNsYXNzLCBmYWNldChzKSBhbmQgY29tcG9uZW50IG5hbWUuIEFuIGluc3RhbmNlIG9mIFZpZXcgY2xhc3Mgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIGFkZGl0aW9uIG9mIGZhY2V0cyBFdmVudHMgYW5kIERhdGEuXG4gKlxuICogRnVuY3Rpb24gcmV0dXJucyBhbiBpbnN0YW5jZSBvZiBbYFNjb3BlYF0oLi9jb21wb25lbnRzL3Njb3BlLmpzLmh0bWwpIGNsYXNzIGNvbnRhaW5pbmcgYWxsIGNvbXBvbmVudHMgY3JlYXRlZCBhcyBhIHJlc3VsdCBvZiBzY2FubmluZyBET00uXG4gKlxuICogSWYgdGhlIGNvbXBvbmVudCBoYXMgW2BDb250YWluZXJgXSguL2NvbXBvbmVudHMvY19mYWNldHMvQ29udGFpbmVyLmpzKSBmYWNldCwgY2hpbGRyZW4gb2YgdGhpcyBlbGVtZW50IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBgc2NvcGVgIG9iamVjdCwgYXZhaWxhYmxlIGFzIHNjb3BlIHByb3BlcnR5IG9uIHRoZSBDb250YWluZXIgZmFjZXQgb2YgdGhpcyBjb21wb25lbnQuIE5hbWVzIG9mIGNvbXBvbmVudHMgd2l0aGluIHRoZSBzY29wZSBzaG91bGQgYmUgdW5pcXVlLCBidXQgdGhleSBjYW4gYmUgdGhlIHNhbWUgYXMgdGhlIG5hbWVzIG9mIGNvbXBvbmVudHMgaW4gb3V0ZXIgc2NvcGUgKG9yIHNvbWUgb3RoZXIgc2NvcGUpLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gc2NvcGVFbCByb290IGVsZW1lbnQgaW5zaWRlIHdoaWNoIERPTSB3aWxsIGJlIHNjYW5uZWQgYW5kIGJvdW5kXG4gKiBAcGFyYW0ge1Njb3BlfSByb290U2NvcGUgT3B0aW9uYWwgUm9vdCBzY29wZSBvYmplY3Qgd2hlcmUgdG9wIGxldmVsIGNvbXBvbmVudHMgd2lsbCBiZSBzYXZlZC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYmluZFJvb3RFbGVtZW50IElmIHNldCB0byBmYWxzZSwgdGhlbiB0aGUgcm9vdCBlbGVtZW50IHdpbGwgbm90IGJlIGJvdW5kLiBUcnVlIGJ5IGRlZmF1bHQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHRocm93T25FcnJvcnMgSWYgc2V0IHRvIGZhbHNlLCB0aGVuIGVycm9ycyB3aWxsIG9ubHkgYmUgbG9nZ2VkIHRvIGNvbnNvbGUuIFRydWUgYnkgZGVmYXVsdC5cbiAqIEByZXR1cm4ge1Njb3BlfVxuICovXG5mdW5jdGlvbiBiaW5kZXIoc2NvcGVFbCwgcm9vdFNjb3BlLCBiaW5kUm9vdEVsZW1lbnQsIHRocm93T25FcnJvcnMpIHtcbiAgICByZXR1cm4gY3JlYXRlQmluZGVyU2NvcGUoc2NvcGVFbCwgZnVuY3Rpb24oc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgICAgIHZhciBpbmZvID0gbmV3IENvbXBvbmVudEluZm8oc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKTtcbiAgICAgICAgcmV0dXJuIENvbXBvbmVudC5jcmVhdGUoaW5mbywgdGhyb3dPbkVycm9ycyk7XG4gICAgfSwgcm9vdFNjb3BlLCBiaW5kUm9vdEVsZW1lbnQsIHRocm93T25FcnJvcnMpO1xufVxuXG5cbi8vIGJpbmQgaW4gdHdvIHBhc3Nlc1xuZnVuY3Rpb24gdHdvUGFzcyhzY29wZUVsLCByb290U2NvcGUsIGJpbmRSb290RWxlbWVudCwgdGhyb3dPbkVycm9ycykge1xuICAgIHZhciBzY2FuU2NvcGUgPSBiaW5kZXIuc2NhbihzY29wZUVsLCByb290U2NvcGUsIGJpbmRSb290RWxlbWVudCwgdGhyb3dPbkVycm9ycyk7XG4gICAgcmV0dXJuIGJpbmRlci5jcmVhdGUoc2NhblNjb3BlLCB1bmRlZmluZWQsIHRocm93T25FcnJvcnMpO1xufVxuXG5cbi8vIHNjYW4gRE9NIGZvciBCaW5kQXR0cmlidXRlXG5mdW5jdGlvbiBzY2FuKHNjb3BlRWwsIHJvb3RTY29wZSwgYmluZFJvb3RFbGVtZW50LCB0aHJvd09uRXJyb3JzKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJpbmRlclNjb3BlKHNjb3BlRWwsIGZ1bmN0aW9uKHNjb3BlLCBlbCwgYXR0ciwgdGhyb3dPbkVycm9ycykge1xuICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudEluZm8oc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKTtcbiAgICB9LCByb290U2NvcGUsIGJpbmRSb290RWxlbWVudCwgdGhyb3dPbkVycm9ycyk7XG59XG5cblxuLy8gY3JlYXRlIGJvdW5kIGNvbXBvbmVudHNcbmZ1bmN0aW9uIGNyZWF0ZShzY2FuU2NvcGUsIGhvc3RPYmplY3QsIHRocm93T25FcnJvcnMpIHtcbiAgICB2YXIgc2NvcGUgPSBuZXcgU2NvcGUoc2NhblNjb3BlLl9yb290RWwsIGhvc3RPYmplY3QpXG4gICAgICAgICwgYWRkTWV0aG9kID0gdGhyb3dPbkVycm9ycyA9PT0gZmFsc2UgPyAnX3NhZmVBZGQnIDogJ19hZGQnO1xuXG4gICAgc2NhblNjb3BlLl9lYWNoKGZ1bmN0aW9uKGNvbXBJbmZvKSB7XG4gICAgICAgIC8vIHNldCBjb3JyZWN0IGNvbXBvbmVudCdzIHNjb3BlXG4gICAgICAgIHZhciBpbmZvID0gXy5jbG9uZShjb21wSW5mbylcbiAgICAgICAgaW5mby5zY29wZSA9IHNjb3BlO1xuXG4gICAgICAgIC8vIGNyZWF0ZSBjb21wb25lbnRcbiAgICAgICAgdmFyIGFDb21wb25lbnQgPSBDb21wb25lbnQuY3JlYXRlKGluZm8sIHRocm93T25FcnJvcnMpO1xuXG4gICAgICAgIHNjb3BlW2FkZE1ldGhvZF0oYUNvbXBvbmVudCwgYUNvbXBvbmVudC5uYW1lKTtcbiAgICAgICAgaWYgKGFDb21wb25lbnQuY29udGFpbmVyKVxuICAgICAgICAgICAgYUNvbXBvbmVudC5jb250YWluZXIuc2NvcGUgPSBjcmVhdGUoY29tcEluZm8uY29udGFpbmVyLnNjb3BlLCBhQ29tcG9uZW50LmNvbnRhaW5lciwgdGhyb3dPbkVycm9ycyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2NvcGU7XG59XG5cbi8qKlxuICogYGNyZWF0ZUJpbmRlclNjb3BlYFxuICogQHBhcmFtICB7RWxlbWVudH0gc2NvcGVFbCAgICAgICAgICAgICBzY29wZUVsIHJvb3QgZWxlbWVudCBpbnNpZGUgd2hpY2ggRE9NIHdpbGwgYmUgc2Nhbm5lZCBhbmQgYm91bmQgKGRvY3VtZW50LmJvZHkgYnkgZGVmYXVsdCkuXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gc2NvcGVPYmplY3RGYWN0b3J5IFNlZSBbYmluZGVyXSgjbWlsby5iaW5kZXIpXG4gKiBAcGFyYW0gIHtTY29wZX0gcm9vdFNjb3BlICAgICAgICAgICAgIE9wdGlvbmFsIFJvb3Qgc2NvcGUgb2JqZWN0IHdoZXJlIHRvcCBsZXZlbCBjb21wb25lbnRzIHdpbGwgYmUgc2F2ZWQuXG4gKiBAcGFyYW0gIHtCb29sZWFufSBiaW5kUm9vdEVsZW1lbnQgICAgIElmIHNldCB0byBmYWxzZSwgdGhlbiB0aGUgcm9vdCBlbGVtZW50IHdpbGwgbm90IGJlIGJvdW5kLiBUcnVlIGJ5IGRlZmF1bHQuXG4gKiBAcGFyYW0gIHtCb29sZWFufSB0aHJvd09uRXJyb3JzICAgICAgIElmIHNldCB0byBmYWxzZSwgdGhlbiBlcnJvcnMgd2lsbCBvbmx5IGJlIGxvZ2dlZCB0byBjb25zb2xlLiBUcnVlIGJ5IGRlZmF1bHQuXG4gKiBAcmV0dXJuIHtTY29wZX0gICAgICAgICAgICAgICAgICAgICAgIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmluZGVyU2NvcGUoc2NvcGVFbCwgc2NvcGVPYmplY3RGYWN0b3J5LCByb290U2NvcGUsIGJpbmRSb290RWxlbWVudCwgdGhyb3dPbkVycm9ycykge1xuICAgIHZhciBzY29wZUVsID0gc2NvcGVFbCB8fCBkb2N1bWVudC5ib2R5XG4gICAgICAgICwgc2NvcGUgPSByb290U2NvcGUgfHwgbmV3IFNjb3BlKHNjb3BlRWwpXG4gICAgICAgICwgYWRkTWV0aG9kID0gdGhyb3dPbkVycm9ycyA9PT0gZmFsc2UgPyAnX3NhZmVBZGQnIDogJ19hZGQnO1xuXG4gICAgY3JlYXRlU2NvcGVGb3JFbGVtZW50KHNjb3BlLCBzY29wZUVsLCBiaW5kUm9vdEVsZW1lbnQpO1xuXG4gICAgcmV0dXJuIHNjb3BlO1xuXG5cbiAgICBmdW5jdGlvbiBjcmVhdGVTY29wZUZvckVsZW1lbnQoc2NvcGUsIGVsLCBiaW5kUm9vdEVsZW1lbnQpIHtcbiAgICAgICAgLy8gZ2V0IGVsZW1lbnQncyBiaW5kaW5nIGF0dHJpYnV0ZSAobWwtYmluZCBieSBkZWZhdWx0KVxuICAgICAgICB2YXIgYXR0ciA9IG5ldyBCaW5kQXR0cmlidXRlKGVsKTtcblxuICAgICAgICAvLyBpZiBlbGVtZW50IGhhcyBiaW5kIGF0dHJpYnV0ZSBjcmF0ZSBzY29wZSBvYmplY3QgKENvbXBvbmVudCBvciBDb21wb25lbnRJbmZvKVxuICAgICAgICBpZiAoYXR0ci5ub2RlICYmIGJpbmRSb290RWxlbWVudCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHZhciBzY29wZWRPYmplY3QgPSBzY29wZU9iamVjdEZhY3Rvcnkoc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKVxuICAgICAgICAgICAgICAgICwgaXNDb250YWluZXIgPSB0eXBlb2Ygc2NvcGVkT2JqZWN0ICE9ICd1bmRlZmluZWQnICYmIHNjb3BlZE9iamVjdC5jb250YWluZXI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB0aGVyZSBhcmUgY2hpbGROb2RlcyBhZGQgY2hpbGRyZW4gdG8gbmV3IHNjb3BlIGlmIHRoaXMgZWxlbWVudCBoYXMgY29tcG9uZW50IHdpdGggQ29udGFpbmVyIGZhY2V0XG4gICAgICAgIC8vIG90aGVyd2lzZSBjcmVhdGUgYSBuZXcgc2NvcGVcbiAgICAgICAgaWYgKGVsLmNoaWxkTm9kZXMgJiYgZWwuY2hpbGROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChpc0NvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIHZhciBpbm5lclNjb3BlID0gbmV3IFNjb3BlKGVsKTtcbiAgICAgICAgICAgICAgICBzY29wZWRPYmplY3QuY29udGFpbmVyLnNjb3BlID0gaW5uZXJTY29wZTtcbiAgICAgICAgICAgICAgICBpbm5lclNjb3BlLl9ob3N0T2JqZWN0ID0gc2NvcGVkT2JqZWN0LmNvbnRhaW5lcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3JlYXRlU2NvcGVGb3JDaGlsZHJlbihlbCwgaXNDb250YWluZXIgPyBpbm5lclNjb3BlIDogc2NvcGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgc2NvcGUgd2Fzbid0IHByZXZpb3VzbHkgY3JlYXRlZCBvbiBjb250YWluZXIgZmFjZXQsIGNyZWF0ZSBlbXB0eSBzY29wZSBhbnl3YXlcbiAgICAgICAgaWYgKGlzQ29udGFpbmVyICYmICEgc2NvcGVkT2JqZWN0LmNvbnRhaW5lci5zY29wZSlcbiAgICAgICAgICAgIHNjb3BlZE9iamVjdC5jb250YWluZXIuc2NvcGUgPSBuZXcgU2NvcGUoZWwpO1xuXG5cbiAgICAgICAgLy8gVE9ETyBjb25kaXRpb24gYWZ0ZXIgJiYgaXMgYSBoYWNrLCBzaG91bGQgbm90IGJlIHVzZWQhXG4gICAgICAgIGlmIChzY29wZWRPYmplY3QpIC8vICYmICEgc2NvcGVbYXR0ci5jb21wTmFtZV0pXG4gICAgICAgICAgICBzY29wZVthZGRNZXRob2RdKHNjb3BlZE9iamVjdCwgYXR0ci5jb21wTmFtZSk7XG5cbiAgICAgICAgLy8gXy5kZWZlcihwb3N0Q2hpbGRyZW5Cb3VuZE1lc3NhZ2UsIGVsKTtcbiAgICAgICAgcG9zdENoaWxkcmVuQm91bmRNZXNzYWdlKGVsKTtcblxuICAgICAgICByZXR1cm4gc2NvcGVkT2JqZWN0O1xuXG5cbiAgICAgICAgZnVuY3Rpb24gcG9zdENoaWxkcmVuQm91bmRNZXNzYWdlKGVsKSB7XG4gICAgICAgICAgICB2YXIgZWxDb21wID0gQ29tcG9uZW50LmdldENvbXBvbmVudChlbCk7XG5cbiAgICAgICAgICAgIGlmIChlbENvbXApXG4gICAgICAgICAgICAgICAgZWxDb21wLnBvc3RNZXNzYWdlU3luYygnY2hpbGRyZW5ib3VuZCcpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBjcmVhdGVTY29wZUZvckNoaWxkcmVuKGNvbnRhaW5lckVsLCBzY29wZSkge1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSB1dGlsRG9tLmNoaWxkcmVuKGNvbnRhaW5lckVsKTtcblxuICAgICAgICBfLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgIGNyZWF0ZVNjb3BlRm9yRWxlbWVudChzY29wZSwgbm9kZSwgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc2NvcGU7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29yZUNsYXNzZXMgPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5jbGFzc2VzO1xuXG4vLyA8YSBuYW1lPVwiY2xhc3Nlc1wiPjwvYT5cbi8vIG1pbG8uY2xhc3Nlc1xuLy8gLS0tLS0tLS0tLS1cblxuLy8gVGhpcyBtb2R1bGUgY29udGFpbnMgZm91bmRhdGlvbiBjbGFzc2VzIGFuZCBjbGFzcyByZWdpc3RyaWVzLlxuXG52YXIgY2xhc3NlcyA9IHtcbiAgICBGYWNldDogcmVxdWlyZSgnLi9hYnN0cmFjdC9mYWNldCcpLFxuICAgIEZhY2V0ZWRPYmplY3Q6IHJlcXVpcmUoJy4vYWJzdHJhY3QvZmFjZXRlZF9vYmplY3QnKSxcbiAgICBTY29wZTogcmVxdWlyZSgnLi9jb21wb25lbnRzL3Njb3BlJyksXG4gICAgQ2xhc3NSZWdpc3RyeTogcmVxdWlyZSgnLi9hYnN0cmFjdC9yZWdpc3RyeScpLFxuICAgIE1peGluOiBjb3JlQ2xhc3Nlcy5NaXhpbixcbiAgICBNZXNzYWdlU291cmNlOiBjb3JlQ2xhc3Nlcy5NZXNzYWdlU291cmNlLFxuICAgIE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2U6IGNvcmVDbGFzc2VzLk1lc3Nlbmdlck1lc3NhZ2VTb3VyY2UsXG4gICAgTWVzc2VuZ2VyQVBJOiBjb3JlQ2xhc3Nlcy5NZXNzZW5nZXJBUEksXG4gICAgRE9NRXZlbnRzU291cmNlOiByZXF1aXJlKCcuL2NvbXBvbmVudHMvbXNnX3NyYy9kb21fZXZlbnRzJyksXG4gICAgVHJhbnNhY3Rpb246IHJlcXVpcmUoJy4vY29tbWFuZC90cmFuc2FjdGlvbicpLFxuICAgIFRyYW5zYWN0aW9uSGlzdG9yeTogcmVxdWlyZSgnLi9jb21tYW5kL3RyYW5zYWN0aW9uX2hpc3RvcnknKVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzc2VzO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gQWN0aW9uc0hpc3Rvcnk7XG5cblxuLyoqXG4gKiBTdG9yZXMgbGlzdCBvZiBjb21tYW5kcyBvciB0cmFuc2FjdGlvbnNcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSBtYXhMZW5ndGhcbiAqL1xuZnVuY3Rpb24gQWN0aW9uc0hpc3RvcnkobWF4TGVuZ3RoKSB7XG4gICAgdGhpcy5fbWF4TGVuZ3RoID0gbWF4TGVuZ3RoIHx8IEluZmluaXR5O1xuICAgIHRoaXMuYWN0aW9ucyA9IFtdO1xuICAgIHRoaXMucG9zaXRpb24gPSAwO1xufVxuXG5cbl8uZXh0ZW5kUHJvdG8oQWN0aW9uc0hpc3RvcnksIHtcbiAgICBzdG9yZTogQWN0aW9uc0hpc3Rvcnkkc3RvcmUsXG4gICAgZGVsZXRlTGFzdDogQWN0aW9uc0hpc3RvcnkkZGVsZXRlTGFzdCxcbiAgICB1bmRvOiBBY3Rpb25zSGlzdG9yeSR1bmRvLFxuICAgIHJlZG86IEFjdGlvbnNIaXN0b3J5JHJlZG8sXG4gICAgdW5kb0FsbDogQWN0aW9uc0hpc3RvcnkkdW5kb0FsbCxcbiAgICByZWRvQWxsOiBBY3Rpb25zSGlzdG9yeSRyZWRvQWxsLFxuICAgIHVuZG9BbGxBc3luYzogQWN0aW9uc0hpc3RvcnkkdW5kb0FsbEFzeW5jLFxuICAgIHJlZG9BbGxBc3luYzogQWN0aW9uc0hpc3RvcnkkcmVkb0FsbEFzeW5jLFxuICAgIGVhY2g6IEFjdGlvbnNIaXN0b3J5JGVhY2gsXG4gICAgZWFjaFJldmVyc2U6IEFjdGlvbnNIaXN0b3J5JGVhY2hSZXZlcnNlLFxuICAgIGdldExhc3RBY3Rpb246IEFjdGlvbnNIaXN0b3J5JGdldExhc3RBY3Rpb24sXG5cbiAgICBnZXREZXNjcmlwdGlvbjogQWN0aW9uc0hpc3RvcnkkZ2V0RGVzY3JpcHRpb25cbn0pO1xuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JHN0b3JlKGNvbW1hbmQpIHtcbiAgICBfdHJ1bmNhdGVUb0N1cnJlbnRQb3NpdGlvbi5jYWxsKHRoaXMpO1xuICAgIHRoaXMuYWN0aW9ucy5wdXNoKGNvbW1hbmQpO1xuXG4gICAgaWYgKHRoaXMuYWN0aW9ucy5sZW5ndGggPiB0aGlzLl9tYXhMZW5ndGgpIHtcbiAgICAgICAgdmFyIGFjdCA9IHRoaXMuYWN0aW9ucy5zaGlmdCgpO1xuICAgICAgICBhY3QuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHRoaXMucG9zaXRpb24gPSB0aGlzLmFjdGlvbnMubGVuZ3RoO1xuICAgIHJldHVybiB0aGlzLnBvc2l0aW9uIC0gMVxufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JGRlbGV0ZUxhc3QoKSB7XG4gICAgaWYgKCF0aGlzLmFjdGlvbnMubGVuZ3RoKSByZXR1cm47XG4gICAgdGhpcy5wb3NpdGlvbi0tO1xuICAgIHRoaXMuYWN0aW9ucy5sZW5ndGgtLTtcbn1cblxuXG5mdW5jdGlvbiBfdHJ1bmNhdGVUb0N1cnJlbnRQb3NpdGlvbigpIHtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5wb3NpdGlvbjsgaSA8IHRoaXMuYWN0aW9ucy5sZW5ndGg7IGkrKylcbiAgICAgICAgdGhpcy5hY3Rpb25zW2ldLmRlc3Ryb3koKTtcbiAgICB0aGlzLmFjdGlvbnMubGVuZ3RoID0gdGhpcy5wb3NpdGlvbjtcbn1cblxuXG5mdW5jdGlvbiBBY3Rpb25zSGlzdG9yeSR1bmRvKGNiKSB7XG4gICAgaWYgKHRoaXMucG9zaXRpb24gPT0gMCkgcmV0dXJuOyAvLyBub3RoaW5nIHRvIHVuZG9cbiAgICB2YXIgYWN0ID0gdGhpcy5hY3Rpb25zWy0tdGhpcy5wb3NpdGlvbl07XG4gICAgYWN0LnVuZG8oY2IpO1xuICAgIHJldHVybiBhY3Q7XG59XG5cblxuZnVuY3Rpb24gQWN0aW9uc0hpc3RvcnkkcmVkbyhjYikge1xuICAgIGlmICh0aGlzLnBvc2l0aW9uID09IHRoaXMuYWN0aW9ucy5sZW5ndGgpIHJldHVybjsgLy8gbm90aGluZyB0byByZWRvXG4gICAgdmFyIGFjdCA9IHRoaXMuYWN0aW9uc1t0aGlzLnBvc2l0aW9uKytdO1xuICAgIGFjdC5yZWRvKGNiKTtcbiAgICByZXR1cm4gYWN0O1xufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JHVuZG9BbGwoKSB7XG4gICAgd2hpbGUgKHRoaXMucG9zaXRpb24pIHRoaXMudW5kbygpO1xufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JHJlZG9BbGwoKSB7XG4gICAgd2hpbGUgKHRoaXMucG9zaXRpb24gPCB0aGlzLmFjdGlvbnMubGVuZ3RoKSB0aGlzLnJlZG8oKTtcbn1cblxuXG5mdW5jdGlvbiBBY3Rpb25zSGlzdG9yeSR1bmRvQWxsQXN5bmMoY2IpIHtcbiAgICBpZiAodGhpcy5wb3NpdGlvbikge1xuICAgICAgICB0aGlzLnVuZG8oKTtcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb24pXG4gICAgICAgICAgICBfLmRlZmVyTWV0aG9kKHRoaXMsICd1bmRvQWxsQXN5bmMnLCBjYik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGlmIChjYikgXy5kZWZlcihjYik7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JHJlZG9BbGxBc3luYyhjYikge1xuICAgIGlmICh0aGlzLnBvc2l0aW9uIDwgdGhpcy5hY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnJlZG8oKTtcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb24gPCB0aGlzLmFjdGlvbnMubGVuZ3RoKSBcbiAgICAgICAgICAgIF8uZGVmZXJNZXRob2QodGhpcywgJ3JlZG9BbGxBc3luYycsIGNiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgaWYgKGNiKSBfLmRlZmVyKGNiKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gQWN0aW9uc0hpc3RvcnkkZWFjaChmdW5jT3JNZXRob2QsIHRoaXNBcmcpIHtcbiAgICB2YXIgZnVuYyA9IHR5cGVvZiBmdW5jT3JNZXRob2QgPT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uKGFjdCkgeyBhY3RbZnVuY09yTWV0aG9kXSgpOyB9XG4gICAgICAgICAgICAgICAgOiBmdW5jT3JNZXRob2Q7XG5cbiAgICB0aGlzLmFjdGlvbnMuZm9yRWFjaChmdW5jLCB0aGlzQXJnIHx8IHRoaXMpO1xufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JGVhY2hSZXZlcnNlKGZ1bmNPck1ldGhvZCwgdGhpc0FyZykge1xuICAgIHRoaXMuYWN0aW9ucy5yZXZlcnNlKCk7XG4gICAgdGhpcy5lYWNoKGZ1bmNPck1ldGhvZCwgdGhpc0FyZyk7XG4gICAgdGhpcy5hY3Rpb25zLnJldmVyc2UoKTtcbn1cblxuXG5mdW5jdGlvbiBBY3Rpb25zSGlzdG9yeSRnZXRMYXN0QWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnBvc2l0aW9uICYmIHRoaXMuYWN0aW9uc1t0aGlzLnBvc2l0aW9uIC0gMV07XG59XG5cblxuZnVuY3Rpb24gQWN0aW9uc0hpc3RvcnkkZ2V0RGVzY3JpcHRpb24oKSB7XG4gICAgdmFyIGFjdGlvbnMgPSB0aGlzLmFjdGlvbnMubWFwKGZ1bmN0aW9uKGFjdCkge1xuICAgICAgICByZXR1cm4gYWN0LmdldERlc2NyaXB0aW9uKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWN0aW9uczogYWN0aW9ucyxcbiAgICAgICAgcG9zaXRpb246IHRoaXMucG9zaXRpb24sXG4gICAgICAgIGxlbmd0aDogYWN0aW9ucy5sZW5ndGhcbiAgICB9O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ2xhc3NSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2Fic3RyYWN0L3JlZ2lzdHJ5JylcbiAgICAsIENvbW1hbmQgPSByZXF1aXJlKCcuL2luZGV4Jyk7XG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuY29tcG9uZW50c2BcbiAqIEFuIGluc3RhbmNlIG9mIFtDbGFzc1JlZ2lzdHJ5XSguLi9hYnN0cmFjdC9yZWdpc3RyeS5qcy5odG1sKSBjbGFzcyB0aGF0IGlzIHVzZWQgYnkgbWlsbyB0byByZWdpc3RlciBhbmQgZmluZCBjb21wb25lbnRzLlxuICovXG52YXIgY29tbWFuZHNSZWdpc3RyeSA9IG5ldyBDbGFzc1JlZ2lzdHJ5KENvbW1hbmQpO1xuXG4vLyBhZGQgY29tbW9uIGFuY2VzdG9yIHRvIGFsbCBjb21wb25lbnRzIHRvIHRoZSByZWdpc3RyeS5cbmNvbW1hbmRzUmVnaXN0cnkuYWRkKENvbW1hbmQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbW1hbmRzUmVnaXN0cnk7XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlcjtcblxuXG52YXIgVU5ET19DT01NQU5EID0gJ191bmRvQ29tbWFuZCc7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBDb21tYW5kO1xuXG5cbi8qKlxuICogQ29tbWFuZCBjbGFzcyB0byBpbXBsZW1lbnQgXCJjb21tYW5kIHBhdHRlcm5cIiAtIHBhY2thZ2luZyBsbCBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIGRlbGF5ZWQgbWV0aG9kIGV4ZWN1dGlvblxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBtZXRob2QgbmFtZSBvciBmdW5jdGlvbiB0byBiZSBleGVjdXRlZFxuICogQHBhcmFtIHtMaXN0fSAqYXJndW1lbnRzIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIG1ldGhvZCBvciBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBDb21tYW5kKGZ1bmMpIHsgLy8gLCAuLi4gYXJndW1lbnRzXG4gICAgdGhpcy5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiBDb21tYW5kIGluc3RhbmNlIG1ldGhvZHNcbiAqIFxuICogLSBbaW5pdF0oI0NvbW1hbmQkZXhlY3V0ZSkgLSBpbml0aWFsaXplIGNvbW1hbmQsIHNob3VsZCBiZSBvdmVyd3JpdHRlbiBieSBzdWJjbGFzc2VzXG4gKiAtIFtleGVjdXRlXSgjQ29tbWFuZCRleGVjdXRlKSAtIGV4ZWN1dGUgY29tbWFuZFxuICogLSBbc2V0VW5kb10oI0NvbW1hbmQkc2V0VW5kbykgLSBzZXQgdW5kbyBjb21tYW5kIGZvciB0aGlzIGNvbW1hbmRcbiAqIC0gW2dldFVuZG9dKCNDb21tYW5kJGdldFVuZG8pIC0gZ2V0IHVuZG8gY29tbWFuZCBvZiB0aGlzIGNvbW1hbmRcbiAqIC0gW3NldEFyZ3VtZW50c10oI0NvbW1hbmQkc2V0QXJndW1lbnRzKSAtIHNldCBjb21tYW5kcyBhcmd1bWVudHNcbiAqIC0gW2FkZEFyZ3VtZW50c10oI0NvbW1hbmQkYWRkQXJndW1lbnRzKSAtIGFkZCBhcmd1bWVudHMgdG8gY29tbWFuZFxuICogLSBbZGVzdHJveV0oI0NvbW1hbmQkZGVzdHJveSlcbiAqL1xuXy5leHRlbmRQcm90byhDb21tYW5kLCB7XG4gICAgaW5pdDogQ29tbWFuZCRpbml0LFxuICAgIGV4ZWN1dGU6IENvbW1hbmQkZXhlY3V0ZSxcbiAgICBzZXRVbmRvOiBDb21tYW5kJHNldFVuZG8sXG4gICAgZ2V0VW5kbzogQ29tbWFuZCRnZXRVbmRvLFxuICAgIHVuZG86IENvbW1hbmQkdW5kbyxcbiAgICByZWRvOiBDb21tYW5kJGV4ZWN1dGUsIC8vIHNhbWUgZm9yIGNvbW1hbmQsIGRpZmZlcmVudCBmb3IgdHJhbnNhY3Rpb25cbiAgICBzZXRBcmd1bWVudHM6IENvbW1hbmQkc2V0QXJndW1lbnRzLFxuICAgIGFkZEFyZ3VtZW50czogQ29tbWFuZCRhZGRBcmd1bWVudHMsXG4gICAgZ2V0QXJndW1lbnRzOiBDb21tYW5kJGdldEFyZ3VtZW50cyxcbiAgICBjaGFuZ2VBcmd1bWVudHM6IENvbW1hbmQkY2hhbmdlQXJndW1lbnRzLFxuICAgIGRlc3Ryb3k6IENvbW1hbmQkZGVzdHJveSxcblxuICAgIHNldENvbW1lbnQ6IENvbW1hbmQkc2V0Q29tbWVudCxcbiAgICBnZXREZXNjcmlwdGlvbjogQ29tbWFuZCRnZXREZXNjcmlwdGlvblxufSk7XG5cblxuLyoqXG4gKiBDb21tYW5kIGNsYXNzIG1ldGhvZHNcbiAqXG4gKiAtIFtjcmVhdGVdKCNDb21tYW5kJCRjcmVhdGUpIC0gY29tbWFuZHMgZmFjdG9yeVxuICovXG5fLmV4dGVuZChDb21tYW5kLCB7XG4gICAgY3JlYXRlOiBDb21tYW5kJCRjcmVhdGUsXG4gICAgY3JlYXRlV2l0aFVuZG86IENvbW1hbmQkJGNyZWF0ZVdpdGhVbmRvXG59KTtcblxuXG5mdW5jdGlvbiBDb21tYW5kJGluaXQoZnVuYykgeyAvLyAsIC4uLiBhcmd1bWVudHNcbiAgICBjaGVjayhmdW5jLCBNYXRjaC5PcHRpb25hbChGdW5jdGlvbikpO1xuICAgIHRoaXMuZnVuYyA9IGZ1bmMgfHwgZnVuY3Rpb24oKXt9O1xuICAgIHRoaXMuYXJncyA9IF8uc2xpY2UoYXJndW1lbnRzLCAxKTsgICAgXG59XG5cblxuLyoqXG4gKiBFeGVjdXRlIGNvbW1hbmQgbWFraW5nIGNvbW1hbmQgb2JqZWN0IGF2YWlsYWJsZSB2aWEgZnVuY3Rpb24gcHJvcGVydHkuIFxuICovXG5mdW5jdGlvbiBDb21tYW5kJGV4ZWN1dGUoY2IpIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5mdW5jLmFwcGx5KHRoaXMsIHRoaXMuYXJncyk7XG4gICAgaWYgKGNiKSBfLmRlZmVyKGNiKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5cbi8qKlxuICogU2V0IHVuZG8gY29tbWFuZCBmb3IgdGhpcyBjb21tYW5kLiBUaGlzIGNvbW1hbmQgYmVjb21lcyB1bmRvIGNvbW1hbmQgZm9yIHVuZG8gY29tbWFuZCAoc28gdW5kbyBjb21tYW5kIGNhbiBjaGFuZ2UgdGhpcyBjb21tYW5kIGR1cmluZyBpdHMgZXhlY3V0aW9uKS5cbiAqIFxuICogQHBhcmFtIHtDb21tYW5kfSB1bmRvQ29tbWFuZFxuICovXG5mdW5jdGlvbiBDb21tYW5kJHNldFVuZG8odW5kb0NvbW1hbmQpIHtcbiAgICBpZiAodGhpc1tVTkRPX0NPTU1BTkRdKVxuICAgICAgICBsb2dnZXIud2FybignQ29tbWFuZCBzZXRVbmRvOiB1bmRvIGNvbW1hbmQgaXMgYWxyZWFkeSBzZXQnKTtcblxuICAgIHRoaXNbVU5ET19DT01NQU5EXSA9IHVuZG9Db21tYW5kO1xuICAgIHVuZG9Db21tYW5kW1VORE9fQ09NTUFORF0gPSB0aGlzO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyB1bmRvIGNvbW1hbmQgb2YgYSBnaXZlbiBjb21tYW5kXG4gKlxuICogQHJldHVybiB7Q29tbWFuZH1cbiAqL1xuZnVuY3Rpb24gQ29tbWFuZCRnZXRVbmRvKCkge1xuICAgIHJldHVybiB0aGlzW1VORE9fQ09NTUFORF07XG59XG5cblxuLyoqXG4gKiBFeGVjdXRlcyB1bmRvIGNvbW1hbmQgb2YgY3VycmVudCBjb21tYW5kXG4gKi9cbmZ1bmN0aW9uIENvbW1hbmQkdW5kbyhjYikge1xuICAgIHZhciB1bmRvQ21kID0gdGhpcy5nZXRVbmRvKCk7XG4gICAgaWYgKCEgdW5kb0NtZCkgcmV0dXJuIGxvZ2dlci5lcnJvcignQ29tbWFuZCB1bmRvIGNhbGxlZCB3aXRob3V0IHVuZG8gY29tbWFuZCBwcmVzZW50Jyk7XG4gICAgdmFyIHJlc3VsdCA9IHVuZG9DbWQuZXhlY3V0ZSgpO1xuICAgIGlmIChjYikgXy5kZWZlcihjYik7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG4vKipcbiAqIFNldCBjb21tYW5kJ3MgYXJndW1lbnRzLiBJZiBhcmd1bWVudHMgd2VyZSBzZXQgZHVyaW5nIGNvbW1hbmQncyBjcmVhdGlvbiwgdGhpcyBtZXRob2Qgd2lsbCBvdmVyd3JpdGUgYXJndW1lbnRzIGFuZCBsb2cgd2FybmluZy5cbiAqXG4gKiBAcGFyYW0ge0xpc3R9ICphcmd1bWVudHNcbiAqL1xuZnVuY3Rpb24gQ29tbWFuZCRzZXRBcmd1bWVudHMoKSB7IC8vLCAuLi4gYXJndW1lbnRzXG4gICAgaWYgKHRoaXMuYXJncyAmJiB0aGlzLmFyZ3MubGVuZ3RoKVxuICAgICAgICBsb2dnZXIud2FybignQ29tbWFuZCBzZXRBcmd1bWVudHM6IGNvbW1hbmQgYXJndW1lbnRzIGFyZSBhbHJlYWR5IHNldCcpO1xuICAgIHRoaXMuYXJncyA9IF8udG9BcnJheShhcmd1bWVudHMpO1xufVxuXG5cbmZ1bmN0aW9uIENvbW1hbmQkZ2V0QXJndW1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLmFyZ3M7XG59XG5cblxuZnVuY3Rpb24gQ29tbWFuZCRjaGFuZ2VBcmd1bWVudHMoKSB7IC8vLCAuLi4gYXJndW1lbnRzXG4gICAgdGhpcy5hcmdzID0gXy50b0FycmF5KGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiBBZGQgKGFwcGVuZCkgYXJndW1lbnRzIHRvIGNvbW1hbmRcbiAqXG4gKiBAcGFyYW0ge0xpc3R9ICphcmd1bWVudHMgYXJndW1lbnRzIGxpc3QgdG8gYmUgYXBwZW5kZWQgdG8gY29tbWFuZFxuICovXG5mdW5jdGlvbiBDb21tYW5kJGFkZEFyZ3VtZW50cygpIHsgLy8sIC4uLiBhcmd1bWVudHNcbiAgICBpZiAoISB0aGlzLmFyZ3MpIHRoaXMuYXJncyA9IFtdO1xuICAgIF8uYXBwZW5kQXJyYXkodGhpcy5hcmdzLCBhcmd1bWVudHMpO1xufVxuXG5cbi8qKlxuICogQ29tbWFuZHMgZmFjdG9yeS4gTGlrZWx5IG90IGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyB0byBpbXBsZW1lbnQgY3VzdG9tIGxvZ2ljIG9mIGNvbW1hbmQgY29uc3RydWN0aW9uXG4gKiBcbiAqIEB0aGlzIHtGdW5jdGlvbn0gQ2xhc3Mgb2YgY29tbWFuZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBtZXRob2QgbmFtZSBvciBmdW5jdGlvbiB0byBiZSBleGVjdXRlZFxuICogQHBhcmFtIHtMaXN0fSAqYXJndW1lbnRzIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIG1ldGhvZCBvciBmdW5jdGlvblxuICogQHJldHVybiB7Q29tbWFuZH1cbiAqL1xuZnVuY3Rpb24gQ29tbWFuZCQkY3JlYXRlKGZ1bmMpIHsgLy8gLCAuLi4gYXJndW1lbnRzXG4gICAgcmV0dXJuIF8ubmV3QXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG5mdW5jdGlvbiBDb21tYW5kJCRjcmVhdGVXaXRoVW5kbygpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyZWF0ZVdpdGhVbmRvIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBzdWJzY2xhc3MnKTtcbn1cblxuXG4vKipcbiAqIERlc3Ryb3kgY3VycmVudCBjb21tYW5kICh0byBwcmV2ZW50IHBvdGVudGlhbCBtZW1vcnkgbGVha3Mgd2hlbiBjb21tYW5kcyBwb2ludCB0byBET00gZWxlbWVudHMpXG4gKi9cbmZ1bmN0aW9uIENvbW1hbmQkZGVzdHJveSgpIHtcbiAgICBkZWxldGUgdGhpcy5mdW5jO1xuICAgIGRlbGV0ZSB0aGlzLmFyZ3M7XG4gICAgdmFyIHVuZG9DbWQgPSB0aGlzW1VORE9fQ09NTUFORF07XG4gICAgaWYgKHVuZG9DbWQpIHtcbiAgICAgICAgZGVsZXRlIHRoaXNbVU5ET19DT01NQU5EXVtVTkRPX0NPTU1BTkRdO1xuICAgICAgICBkZWxldGUgdGhpc1tVTkRPX0NPTU1BTkRdO1xuICAgICAgICB1bmRvQ21kLmRlc3Ryb3koKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gQ29tbWFuZCRzZXRDb21tZW50KGNvbW1lbnQpIHtcbiAgICB0aGlzLmNvbW1lbnQgPSBjb21tZW50O1xufVxuXG5cbmZ1bmN0aW9uIENvbW1hbmQkZ2V0RGVzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZnVuYzogdGhpcy5mdW5jLm5hbWUsXG4gICAgICAgIGNvbW1lbnQ6IHRoaXMuY29tbWVudFxuICAgIH07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIEFjdGlvbnNIaXN0b3J5ID0gcmVxdWlyZSgnLi9hY3Rpb25zX2hpc3RvcnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gVHJhbnNhY3Rpb247XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24oKSB7XG4gICAgdGhpcy5jb21tYW5kcyA9IG5ldyBBY3Rpb25zSGlzdG9yeTtcbn1cblxuXG5fLmV4dGVuZFByb3RvKFRyYW5zYWN0aW9uLCB7XG4gICAgZXhlY3V0ZTogVHJhbnNhY3Rpb24kZXhlY3V0ZSxcbiAgICB1bmRvOiBUcmFuc2FjdGlvbiR1bmRvLFxuICAgIHJlZG86IFRyYW5zYWN0aW9uJHJlZG8sXG4gICAgZGVzdHJveTogVHJhbnNhY3Rpb24kZGVzdHJveSxcbiAgICBzdG9yZUNvbW1hbmQ6IFRyYW5zYWN0aW9uJHN0b3JlQ29tbWFuZCxcbiAgICBtZXJnZTogVHJhbnNhY3Rpb24kbWVyZ2UsXG5cbiAgICBzZXRDb21tZW50OiBUcmFuc2FjdGlvbiRzZXRDb21tZW50LFxuICAgIGdldERlc2NyaXB0aW9uOiBUcmFuc2FjdGlvbiRnZXREZXNjcmlwdGlvblxufSk7XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24kZXhlY3V0ZSgpIHtcbiAgICB0aGlzLmNvbW1hbmRzLmVhY2goJ2V4ZWN1dGUnKTtcbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbiR1bmRvKGNiKSB7XG4gICAgdGhpcy5jb21tYW5kcy51bmRvQWxsQXN5bmMoY2IpO1xufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uJHJlZG8oY2IpIHtcbiAgICB0aGlzLmNvbW1hbmRzLnJlZG9BbGxBc3luYyhjYik7XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24kZGVzdHJveSgpIHtcbiAgICB0aGlzLmNvbW1hbmRzLmVhY2goJ2Rlc3Ryb3knKTtcbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbiRzdG9yZUNvbW1hbmQoY29tbWFuZCkge1xuICAgIHRoaXMuY29tbWFuZHMuc3RvcmUoY29tbWFuZCk7XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24kbWVyZ2UodHJhbnNhY3Rpb24pIHtcbiAgICB0cmFuc2FjdGlvbi5jb21tYW5kcy5lYWNoKGZ1bmN0aW9uKGNtZCkge1xuICAgICAgICB0aGlzLmNvbW1hbmRzLnN0b3JlKGNtZCk7XG4gICAgfSwgdGhpcyk7XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24kc2V0Q29tbWVudChjb21tZW50KSB7XG4gICAgdGhpcy5jb21tZW50ID0gY29tbWVudFxufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uJGdldERlc2NyaXB0aW9uKCkge1xuICAgIHZhciBjb21tYW5kcyA9IHRoaXMuY29tbWFuZHMuZ2V0RGVzY3JpcHRpb24oKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kczogY29tbWFuZHMuYWN0aW9ucyxcbiAgICAgICAgY29tbWVudDogdGhpcy5jb21tZW50XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBBY3Rpb25zSGlzdG9yeSA9IHJlcXVpcmUoJy4vYWN0aW9uc19oaXN0b3J5JylcbiAgICAsIFRyYW5zYWN0aW9uID0gcmVxdWlyZSgnLi90cmFuc2FjdGlvbicpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2FjdGlvbkhpc3Rvcnk7XG5cblxudmFyIFNDSEVEVUxFRCA9ICdfc2NoZWR1bGVkJztcblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3RvcnkobWF4TGVuZ3RoKSB7XG4gICAgdGhpcy50cmFuc2FjdGlvbnMgPSBuZXcgQWN0aW9uc0hpc3RvcnkobWF4TGVuZ3RoKTtcbiAgICB0aGlzLmN1cnJlbnRCYXRjaCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzW1NDSEVEVUxFRF0gPSBmYWxzZTtcbn1cblxuXG5fLmV4dGVuZFByb3RvKFRyYW5zYWN0aW9uSGlzdG9yeSwge1xuICAgIHN0b3JlQ29tbWFuZDogVHJhbnNhY3Rpb25IaXN0b3J5JHN0b3JlQ29tbWFuZCxcbiAgICBlbmRUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb25IaXN0b3J5JGVuZFRyYW5zYWN0aW9uLFxuICAgIHN0b3JlVHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uSGlzdG9yeSRzdG9yZVRyYW5zYWN0aW9uLFxuICAgIGRlbGV0ZUxhc3RUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb25IaXN0b3J5JGRlbGV0ZUxhc3RUcmFuc2FjdGlvbixcbiAgICB1bmRvOiBUcmFuc2FjdGlvbkhpc3RvcnkkdW5kbyxcbiAgICByZWRvOiBUcmFuc2FjdGlvbkhpc3RvcnkkcmVkbyxcbiAgICBpblRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkhpc3RvcnkkaW5UcmFuc2FjdGlvbixcblxuICAgIGdldERlc2NyaXB0aW9uOiBUcmFuc2FjdGlvbkhpc3RvcnkkZ2V0RGVzY3JpcHRpb24sXG4gICAgdXNlTWVzc2VuZ2VyOiBUcmFuc2FjdGlvbkhpc3RvcnkkdXNlTWVzc2VuZ2VyLFxuICAgIGRlc3Ryb3k6IFRyYW5zYWN0aW9uSGlzdG9yeSRkZXN0cm95XG59KTtcblxuXG4vKipcbiAqIFN0b3JlcyBjb21tYW5kIGluIHRoZSBoaXN0b3J5LiBcbiAqIEBwYXJhbSB7Q29tbWFuZH0gY29tbWFuZCAgICAgICAgICAgXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGFwcGVuZFRyYW5zYWN0aW9uIElmIGB0cnVlYCwgYXBwZW5kcyB0byB0aGUgY3VycmVudCBvciBwcmV2aW91cyB0cmFuc2FjdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHRyYW5zYWN0aW9uLlxuICovXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3Rvcnkkc3RvcmVDb21tYW5kKGNvbW1hbmQsIGFwcGVuZFRyYW5zYWN0aW9uKSB7XG4gICAgaWYgKGFwcGVuZFRyYW5zYWN0aW9uICYmICEodGhpcy5jdXJyZW50VHJhbnNhY3Rpb24gfHwgdGhpcy5jdXJyZW50QmF0Y2gpKSB7XG4gICAgICAgIHZhciB0cmFuc2FjdGlvbiA9IHRoaXMudHJhbnNhY3Rpb25zLmdldExhc3RBY3Rpb24oKTtcbiAgICAgICAgdHJhbnNhY3Rpb24uc3RvcmVDb21tYW5kKGNvbW1hbmQpO1xuICAgICAgICBfcG9zdFRyYW5zYWN0aW9uTWVzc2FnZS5jYWxsKHRoaXMsICdhcHBlbmRlZCcsIHRyYW5zYWN0aW9uKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghIHRoaXMuY3VycmVudEJhdGNoKSB0aGlzLmN1cnJlbnRCYXRjaCA9IG5ldyBUcmFuc2FjdGlvbjtcbiAgICB0aGlzLmN1cnJlbnRCYXRjaC5zdG9yZUNvbW1hbmQoY29tbWFuZCk7XG4gICAgaWYgKCEgdGhpc1tTQ0hFRFVMRURdKSB7XG4gICAgICAgIHRoaXNbU0NIRURVTEVEXSA9IHRydWU7XG4gICAgICAgIF8uZGVmZXJNZXRob2QodGhpcywgX3N0b3JlVHJhbnNhY3Rpb24pO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3RvcnkkZGVsZXRlTGFzdFRyYW5zYWN0aW9uKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRCYXRjaCB8fCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbikge1xuICAgICAgICB0aGlzLmN1cnJlbnRCYXRjaCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMuZGVsZXRlTGFzdCgpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBfc3RvcmVUcmFuc2FjdGlvbigpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50QmF0Y2gpIHtcbiAgICAgICAgX2FkZEJhdGNoVG9UcmFuc2FjdGlvbi5jYWxsKHRoaXMpO1xuICAgICAgICBfLmRlZmVyTWV0aG9kKHRoaXMsIF9zdG9yZVRyYW5zYWN0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBfc3RvcmVDdXJyZW50VHJhbnNhY3Rpb24uY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpc1tTQ0hFRFVMRURdID0gZmFsc2U7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uSGlzdG9yeSRlbmRUcmFuc2FjdGlvbigpIHtcbiAgICBfYWRkQmF0Y2hUb1RyYW5zYWN0aW9uLmNhbGwodGhpcyk7XG4gICAgX3N0b3JlQ3VycmVudFRyYW5zYWN0aW9uLmNhbGwodGhpcyk7XG59XG5cblxuZnVuY3Rpb24gX2FkZEJhdGNoVG9UcmFuc2FjdGlvbigpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50QmF0Y2gpIHtcbiAgICAgICAgaWYgKCEgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24pIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uO1xuICAgICAgICB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi5tZXJnZSh0aGlzLmN1cnJlbnRCYXRjaCk7XG4gICAgICAgIHRoaXMuY3VycmVudEJhdGNoID0gdW5kZWZpbmVkO1xuICAgIH0gXG59XG5cblxuZnVuY3Rpb24gX3N0b3JlQ3VycmVudFRyYW5zYWN0aW9uKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbikge1xuICAgICAgICB2YXIgdCA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uO1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucy5zdG9yZSh0KTtcbiAgICAgICAgX3Bvc3RUcmFuc2FjdGlvbk1lc3NhZ2UuY2FsbCh0aGlzLCAnc3RvcmVkJywgdCk7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uSGlzdG9yeSRzdG9yZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSB7XG4gICAgdGhpcy5lbmRUcmFuc2FjdGlvbigpO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbnMuc3RvcmUodHJhbnNhY3Rpb24pO1xuICAgIF9wb3N0VHJhbnNhY3Rpb25NZXNzYWdlLmNhbGwodGhpcywgJ3N0b3JlZCcsIHRyYW5zYWN0aW9uKTtcbn1cblxuXG5mdW5jdGlvbiBfcG9zdFRyYW5zYWN0aW9uTWVzc2FnZShtc2csIHRyYW5zYWN0aW9uKSB7XG4gICAgaWYgKHRoaXMuX21lc3NlbmdlcilcbiAgICAgICAgdGhpcy5fbWVzc2VuZ2VyLnBvc3RNZXNzYWdlKG1zZywgeyB0cmFuc2FjdGlvbjogdHJhbnNhY3Rpb24gfSk7XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb25IaXN0b3J5JHVuZG8oY2IpIHtcbiAgICB2YXIgdCA9IHRoaXMudHJhbnNhY3Rpb25zLnVuZG8oY2IpO1xuICAgIGlmICh0KSBfcG9zdFRyYW5zYWN0aW9uTWVzc2FnZS5jYWxsKHRoaXMsICd1bmRvbmUnLCB0KTtcbiAgICByZXR1cm4gdDtcbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3RvcnkkcmVkbyhjYikge1xuICAgIHZhciB0ID0gdGhpcy50cmFuc2FjdGlvbnMucmVkbyhjYik7XG4gICAgaWYgKHQpIF9wb3N0VHJhbnNhY3Rpb25NZXNzYWdlLmNhbGwodGhpcywgJ3JlZG9uZScsIHQpO1xuICAgIHJldHVybiB0O1xufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uSGlzdG9yeSRpblRyYW5zYWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzW1NDSEVEVUxFRF07XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb25IaXN0b3J5JGdldERlc2NyaXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9ucy5nZXREZXNjcmlwdGlvbigpO1xufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uSGlzdG9yeSR1c2VNZXNzZW5nZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcywgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3RvcnkkZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5fbWVzc2VuZ2VyKSB0aGlzLl9tZXNzZW5nZXIuZGVzdHJveSgpO1xuICAgIGRlbGV0ZSB0aGlzLnRyYW5zYWN0aW9ucztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgRmFjZXRlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2Fic3RyYWN0L2ZhY2V0ZWRfb2JqZWN0JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jX2ZhY2V0cy9jZl9yZWdpc3RyeScpXG4gICAgLCBDb21wb25lbnRGYWNldCA9IGZhY2V0c1JlZ2lzdHJ5LmdldCgnQ29tcG9uZW50RmFjZXQnKVxuICAgICwgY29tcG9uZW50VXRpbHMgPSByZXF1aXJlKCcuL2NfdXRpbHMnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaFxuICAgICwgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJylcbiAgICAsIG1pbG9Db21wb25lbnROYW1lID0gcmVxdWlyZSgnLi4vdXRpbC9jb21wb25lbnRfbmFtZScpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgZG9tVXRpbHMgPSByZXF1aXJlKCcuLi91dGlsL2RvbScpXG4gICAgLCBCaW5kQXR0cmlidXRlID0gcmVxdWlyZSgnLi4vYXR0cmlidXRlcy9hX2JpbmQnKVxuICAgICwgU2NvcGUgPSByZXF1aXJlKCcuL3Njb3BlJylcbiAgICAsIERPTVN0b3JhZ2UgPSByZXF1aXJlKCcuLi91dGlsL3N0b3JhZ2UnKTtcblxudmFyIF9tYWtlQ29tcG9uZW50Q29uZGl0aW9uRnVuYyA9IGNvbXBvbmVudFV0aWxzLl9tYWtlQ29tcG9uZW50Q29uZGl0aW9uRnVuYztcblxuXG4vKipcbiAqIGBtaWxvLkNvbXBvbmVudGBcbiAqIEJhc2UgQ29tcG9uZW50IGNsYXNzLiBTdWJjbGFzcyBvZiBbRmFjZXRlZE9iamVjdF0oLi4vYWJzdHJhY3QvZmFjZXRlZF9vYmplY3QuanMuaHRtbCksIGJ1dCBub25lIG9mIHRoaXMgY2xhc3MgbWV0aG9kcyBzaG91bGQgYmUgZGlyZWN0bHkgdXNlZCB3aXRoIGNvbXBvbmVudC5cbiAqIEl0cyBjb25zdHJ1Y3RvciBwYXNzZXMgaXRzIHBhcmFtZXRlcnMsIGluY2x1ZGluZyBpdHMgW3Njb3BlXSguL3Njb3BlLmpzLmh0bWwpLCBET00gZWxlbWVudCBhbmQgbmFtZSB0byBbYGluaXRgXSgjaW5pdCkgbWV0aG9kLlxuICogVGhlIGNvbnN0cnVjdG9yIG9mIENvbXBvbmVudCBjbGFzcyByYXJlbHkgbmVlZHMgdG8gYmUgdXNlZCBkaXJlY3RseSwgYXMgW21pbG8uYmluZGVyXSguLi9iaW5kZXIuanMuaHRtbCkgY3JlYXRlcyBjb21wb25lbnRzIHdoZW4gaXQgc2NhbnMgRE9NIHRyZWUuXG4gKiBbYENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzc2BdKCNjcmVhdGVDb21wb25lbnRDbGFzcykgc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIGEgc3ViY2xhc3Mgb2YgQ29tcG9uZW50IGNsYXNzIHdpdGggY29uZmlndXJlZCBmYWNldHMuXG4gKlxuICpcbiAqICMjIyNDb21wb25lbnQgaW5zdGFuY2UgcHJvcGVydGllcyMjIyNcbiAqXG4gKiAtIGVsIC0gRE9NIGVsZW1lbnQgdGhhdCBjb21wb25lbnQgaXMgYXR0YWNoZWQgdG8uIElmIHRoZSBzZWNvbmQgY29tcG9uZW50IGlzIGF0dGFjaGVkIHRvIHRoZSBzYW1lIERPTSBlbGVtZW50LCB0aGUgd2FybmluZyB3aWxsIGJlIGxvZ2dlZCB0byBjb25zb2xlLiBUbyBnZXQgY29tcG9uZW50IHJlZmVyZW5jZSBmcm9tIERPTSBlbGVtZW50IHVzZSBbQ29tcG9uZW50LmdldENvbXBvbmVudF0oLi9jX3V0aWxzLmpzLmh0bWwjZ2V0Q29tcG9uZW50KSBjbGFzcyBtZXRob2QuIFRvIGluc3BlY3QgY29tcG9uZW50IHZpYSBlbGVtZW50IGluIGJyb3dzZXIgY2hlY2sgYF9fX21pbG9fY29tcG9uZW50YCBwcm9wZXJ0eSBvZiBlbGVtZW50IChwcm9wZXJ0eSBuYW1lIGJlIGNoYW5nZWQgdXNpbmcgYG1pbG8uY29uZmlnYCkuXG4gKiAtIHNjb3BlIC0gcGFyZW50IHNjb3BlIG9iamVjdCwgYW4gaW5zdGFuY2Ugb2YgW1Njb3BlXSguL3Njb3BlLmpzLmh0bWwpIGNsYXNzLiBUbyBnZXQgcGFyZW50IGNvbXBvbmVudCB1c2UgW2dldFNjb3BlUGFyZW50XSgjQ29tcG9uZW50JGdldFNjb3BlUGFyZW50KSBpbnN0YW5jZSBtZXRob2Qgb2YgY29tcG9uZW50LiBUaGUgYWN0dWFsIHBhdGggdG8gZ2V0IHBhcmVudCBvZiBjb25wb25lbnQgaXMgYGNvbXBvbmVudC5zY29wZS5faG9zdE9iamVjdC5vd25lcmAsIHdoZXJlIGBfaG9zdE9iamVjdGAgcmVmZXJzIHRvIFtDb250YWluZXJdKGNfZmFjZXRzL0NvbnRhaW5lci5qcy5odG1sKSBmYWNldCBvZiBwYXJlbnQgY29tcG9uZW50IGFuZCBgb3duZXJgIHRvIHRoZSBwYXJlbnQgaXRzZWxmLiBUaGUgY2hpbGRyZW4gb2YgY29tcG9uZW50IGFyZSBhY2Nlc3NpYmxlIHZpYSB0aGUgc2NvcGUgb2YgaXRzIGNvbnRhaW5lciBmYWNldDogYGNvbXBvbmVudC5jb250YWluZXIuc2NvcGVgLiBUaGUgc2NvcGUgaGllcmFyY2h5IGNhbiBiZSB0aGUgc2FtZSBvciBkaWZmZXJlbnQgYXMgdGhlIERPTSBoaWVyYXJjaHkgLSBET00gY2hpbGRyZW4gb2YgdGhlIGNvbXBvbmVudCB3aWxsIGJlIG9uIHRoZSBzYW1lIHNjb3BlIGFzIGNvbXBvbmVudCBpZiBpdCBkb2VzIG5vdCBoYXZlIGBDb250YWluZXJgIGZhY2V0IGFuZCBpbiB0aGUgc2NvcGUgb2YgaXRzIENvbnRhaW5lciBmYWNldCBpZiBpdCBoYXMgaXQuIFNlZSBbU2NvcGVdKC4vc2NvcGUuanMuaHRtbCkuXG4gKiAtIG5hbWUgLSB0aGUgbmFtZSBvZiBjb21wb25lbnQsIHNob3VsZCBiZSB1bmlxdWUgZm9yIHRoZSBzY29wZSB3aGVyZSBjb21wb25lbnQgYmVsb25ncy4gVG8gZmluZCBjb21wb25lbnQgaW4gc2NvcGUgdGhlIGNvbXBvbmVudCdzIG5hbWUgc2hvdWxkIGJlIHVzZWQgYXMgcHJvcGVydHkgb2Ygc2NvcGUgb2JqZWN0LiBTZWUgW1Njb3BlXSguL3Njb3BlLmpzLmh0bWwpLlxuICogLSBmYWNldHMgLSBtYXAgb2YgcmVmZXJlbmNlcyBvZiBhbGwgY29tcG9uZW50J3MgZmFjZXRzIChmYWNldCBuYW1lcyBhcmUgbG93ZXJjYXNlIGluIHRoaXMgbWFwKS4gQWxsIGZhY2V0cyBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgYXMgcHJvcGVydGllcyBvZiBjb21wb25lbnQsIHRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gaXRlcmF0ZSBmYWNldHMgKGl0IGlzIHVzZWQgaW4gdGhpcyB3YXkgaW4gW2FsbEZhY2V0c10oI0NvbXBvbmVudCRhbGxGYWNldHMpIGNvbXBvbmVudCdzIGluc3RhbmNlIG1ldGhvZCB0aGF0IGFsbG93cyB0byBjYWxsIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUgb24gYWxsIGZhY2V0cykuXG4gKiAtIGV4dHJhRmFjZXRzIC0gYW4gYXJyYXkgb2YgbmFtZXMgb2YgZmFjZXRzIHRoYXQgYXJlIGFkZGVkIHRvIGNvbXBvbmVudCBhbmQgZG8gbm90IGZvcm0gdGhlIHBhcnQgb2YgY29tcG9uZW50J3MgY2xhc3MuXG4gKiAtIF9tZXNzZW5nZXIgLSB0aGUgcmVmZXJlbmNlIHRvIGNvbXBvbmVudCdzIFttZXNzZW5nZXJdKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sKS4gUmFyZWx5IG5lZWRzIHRvIGJlIHVzZWQgZGlyZWN0bHkgYXMgYWxsIGNvbW1vbmx5IHVzZWQgbWV0aG9kcyBvZiBtZXNlbmdlciBhcmUgYXZhaWxhYmxlIGRpcmVjdGx5IG9uIGNvbXBvbmVudC5cbiAqXG4gKlxuICogIyMjI0NvbXBvbmVudCBldmVudHMjIyMjXG4gKlxuICogLSAnY2hpbGRyZW5ib3VuZCcgLSBzeW5jaHJvbm91c2x5IGRpc3BhdGNoZWQgd2hlbiBjaGlsZHJlbiBvZiBET00gZWxlbWVudCB3aGljaCBjb21wbmVudCBpcyBjb25uZWN0ZWQgdG8gYXJlIGNvbm5lY3RlZCB0byBjb21wb25lbnRzLiBUaGUgZXZlbnQgaXMgZGlzcGF0Y2hlZCB3aGVuIGNvbXBvbmVudCBpcyBjcmVhdGVkIHdpdGggYG1pbG8uYmluZGVyYCAoYXMgaXMgYWxtb3N0IGFsd2F5cyB0aGUgY2FzZSwgYXMgYWxsIENvbXBvbmVudCBjbGFzcyBtZXRob2RzIHRoYXQgY3JlYXRlL2NvcHkgY29tcG9uZW50cyB1c2UgYG1pbG8uYmluZGVyYCBpbnRlcm5hbGx5IC0gY29tcG9uZW50IGNvbnN0cnVjdG9yIGFuZCBDb21wb25lbnQuY3JlYXRlIG1ldGhvZHMgYXJlIG5vdCB1c2VkIGluIGZyYW1ld29yayBvdXRzaWRlIG9mIGBtaWxvLmJpbmRlcmAgYW5kIHJhcmVseSBpZiBldmVyIG5lZWQgdG8gYmUgdXNlZCBpbiBhcGxpY2F0aW9uKS5cbiAqIC0gJ2FkZGVkdG9zY29wZScgLSBzeW5jaHJvbm91c2x5IGRpc3BhdGNoZWQgd2hlbiBjb21wb25lbnQgaXMgYWRkZWQgdG8gc2NvcGUuXG4gKiAtICdzdGF0ZXJlYWR5JyAtIGF5bmNocm9ub3VzbHkgZGlzcGF0Y2hlZCB3aGVuIGNvbXBvbmVudCAodG9nZXRoZXIgd2l0aCBpdHMgc2NvcGUgY2hpbGRyZW4pIGlzIGNyZWF0ZWQgd2l0aCBbQ29tcG9uZW50LmNyZWF0ZUZyb21TdGF0ZV0oI0NvbXBvbmVudCQkY3JlYXRlRnJvbVN0YXRlKSAob3IgYGNyZWF0ZUZyb21EYXRhVHJhbnNmZXJgKSBtZXRob2QuIENhbiBiZSBkaXNwYXRjaGVkIGJ5IGFwcGxpY2F0aW9uIGlmIHRoZSBjb21wb25lbnQncyBzdGF0ZSBpcyBzZXQgd2l0aCBzb21lIG90aGVyIG1lY2hhbmlzbS4gVGhpcyBldmVudCBpcyBub3QgdXNlZCBpbiBgbWlsb2AsIGl0IGNhbiBiZSB1c2VkIGluIGFwcGxpY2F0aW9uIGluIHBhcnRpY3VsYXIgc3ViY2xhc3NlcyBvZiBjb21wb25lbnQuXG4gKiAtICdnZXRzdGF0ZXN0YXJ0ZWQnIC0gZW1pdHRlZCBzeW5jaHJvbm91c2x5IGp1c3QgYmVmb3JlIGdldFN0YXRlIGV4ZWN1dGVzIHNvIGNvbXBvbmVudHMgYW5kIGZhY2V0cyBjYW4gY2xlYW4gdXAgdGhlaXIgc3RhdGUgZm9yIHNlcmlhbGl6YXRpb24uIFxuICogLSAnZ2V0c3RhdGVjb21wbGV0ZWQnIC0gZW1pdHRlZCBhc3luY2hyb25vdXNseSBhZnRlciBnZXRTdGF0ZSBleGVjdXRlcyBzbyBjb21wb25lbnRzIGFuZCBmYWNldHMgY2FuIHJlc3RvcmUgdGhlaXIgc3RhdGUgYWZ0ZXIgc2VyaWFsaXphdGlvbi5cbiAqXG4gKlxuICogIyMjI0NvbXBvbmVudCBcImxpZmVjeWNsZVwiIyMjI1xuICpcbiAqIDEuIENvbXBvbmVudCBjb25zdHJ1Y3RvciBpcyBjYWxsZWQuIENvbXBvbmVudCdzIGNvbnN0cnVjdG9yIHNpbXBseSBjYWxscyBjb25zdHJ1Y3RvciBvZiBbRmFjZXRlZE9iamVjdF0oLi4vYWJzdHJhY3QvZmFjZXRlZF9vYmplY3QuanMuaHRtbCkgdGhhdCBpcyBhIHN1cGVyY2xhc3Mgb2YgQ29tcG9uZW50LiBTdWJjbGFzc2VzIG9mIENvbXBvbmVudCBzaG91bGQgbm90IGltcGxlbWVudCB0aGVpciBvd24gY29uc3RydWN0b3IsIHRoZXkgY2FuIG9wdGlvbmFsbHkgaW1wbGVtZW50IGBpbml0YCBtZXRob2QsIGJ1dCBtb3N0IGNvbXBvbmVudHMgZG8gbm90IG5lZWQgdG8gZG8gaXQuXG4gKiAyLiBjb25zdHJ1Y3RvcnMgYW5kIGBpbml0YCBtZXRob2RzIG9mIGFsbCBmYWNldHMgYXJlIGNhbGxlZCBpbiBzZXF1ZW5jZS4gU2FtZSBhcyBjb21wb25lbnRzLCBmYWNldCBkbyBub3QgaW1wbGVtZW50IHRoZWlyIGNvbnN0cnVjdG9ycywgdGhleSBjYW4gb3B0aW9uYWxseSBpbXBsZW1lbnQgYGluaXRgIGFuZCBgc3RhcnRgIG1ldGhvZHMgKHNlZSBiZWxvdykuIEluc2lkZSBgaW5pdGAgbWV0aG9kIHRoZXJlIHNob3VsZCBiZSBvbmx5IGdlbmVyYWwgaW5pdGlhbGl6YXRpb24gY29kZSB3aXRob3V0IGFueSBkZXBlbmRlbmN5IG9uIGNvbXBvbmVudCBpdHNlbGYgKGl0IGlzIG5vdCByZWFkeSB5ZXQpIGFuZCBvdGhlciBmYWNldHMgKGFzIHRoZXJlIGlzIG5vIHNwZWNpZmljIGZhY2V0cyBjcmVhdGlvbiBvcmRlcikuIElmIGZhY2V0IGltcGxlbWVudHMgYGluaXRgIG1ldGhvZCBpdCBNVVNUIGNhbGwgaW5oZXJpdGVkIGluaXQgd2l0aCBgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKWAuXG4gKiAzLiBgaW5pdGAgbWV0aG9kIG9mIGNvbXBvbmVudCBpcyBjYWxsZWQuIEF0IHRoaXMgcG9pbnQgYWxsIGZhY2V0cyBhcmUgY3JlYXRlZCBidXQgZmFjZXRzIHN0aWxsIGNhbiBiZSBub3QgcmVhZHkgYXMgdGhleSBjYW4gaGF2ZSBpbml0aWFsaXphdGlvbiBjb2RlIGluIGBzdGFydGAgbWV0aG9kLiBJZiBjb21wb25lbnQgc3ViY2xhc3MgaW1wbGVtZW50cyBgaW5pdGAgbWV0aG9kIGl0IE1VU1QgY2FsbCBpbmhlcml0ZWQgbWV0aG9kIHdpdGggYDxTdXBlcmNsYXNzPi5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpYCwgd2hlcmUgPFN1cGVyY2xhc3M+IGlzIENvbXBvbmVudCBvciBhbm90aGVyIHN1cGVyY2xhc3MgdGhlIGNvbXBvbmVudCBpcyBhIHN1YmNsYXNzIG9mLlxuICogNC4gYGNoZWNrYCBtZXRob2Qgb2YgYWxsIGZhY2V0cyBpcyBjYWxsZWQuIFRoaXMgbWV0aG9kIGFkZHMgZmFjZXRzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBjb21wb25lbnQgZGVjbGFyYXRpb24gKGJlaW5nIHBhcnQgb2YgdGhlIGNsYXNzIG9yIGV4cGxpY2l0ZWx5IGxpc3RlZCBpbiBiaW5kIGF0dHJpYnV0ZSkgYnV0IGFyZSByZXF1aXJlZCBieSBmYWNldHMgdGhhdCB0aGUgY29tcG5lbnQgYWxyZWFkeSBoYXMuIFN1YmNsYXNzZXMgb2YgW0NvbXBvbmVudEZhY2V0XSguL2NfZmFjZXQuanMuaHRtbCkgZG8gbm90IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kLlxuICogNS4gYHN0YXJ0YCBtZXRob2Qgb2YgYWxsIGZhY2V0cyBpcyBjYWxsZWQuIFRoaXMgbWV0aG9kIGlzIHVzdWFsbHkgaW1wbGVtZW50ZWQgYnkgQ29tcG9uZW50RmFjZXQgc3ViY2xhc3NlcyBhbmQgaXQgY2FuIGhhdmUgYW55IGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBkZXBlbmRzIG9uIGNvbXBvbmVudCBvciBvbiBvdGhlciBmYWNldHMgdGhhdCBhcmUgdGhlIGRlcGVuZGVuY2llcyBvZiBhIGZhY2V0LiBJbmhlcml0ZWQgYHN0YXJ0YCBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbnQgaGUgc2FtZSB3YXkgYXMgd3JpdHRlbiBhYm92ZS5cbiAqIDYuIGBzdGFydGAgbWV0aG9kIG9mIGNvbXBvbmVudCBpcyBjYWxsZWQuIFRoaXMgY29tcG9uZW50IG1ldGhvZCBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyBpZiB0aGV5IG5lZWQgdG8gaGF2ZSBzb21lIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHNvbWUgZmFjZXRzIGFuZCByZXF1aXJlcyB0aGF0IHRoZXNlIGZhY2V0cyBhcmUgZnVsbHkgaW5pYWxpemVkLiBPZnRlbiBzdWNoIGNvZGUgYWxzbyBkZXBlbmRzIG9uIGNvbXBvbmVudCdzIHNjb3BlIGNoaWxkcmVuIGFzIHdlbGwgc28gdGhpcyBjb2RlIHNob3VsZCBiZSBpbnNpZGUgYCdjaGlsZHJlbmJvdW5kJ2AgZXZlbnQgc3Vic2NyaWJlci5cbiAqIDcuICdhZGRlZHRvc2NvcGUnIGV2ZW50IGlzIGRpc3BhdGNoZWQgd2hlbiBjb21wb25lbnQgaXMgYWRkZWQgdG8gaXRzIHBhcmVudCdzIHNjb3BlIG9yIHRvIHRvcCBsZXZlbCBzY29wZSBjcmVhdGVkIGJ5IGBtaWxvLmJpbmRlcmAuXG4gKiA4LiBjb21wb25lbnQncyBjaGlsZHJlbiBhcmUgY3JlYXRlZCAoc3RlcHMgMS02IGFib3ZlIGFyZSBmb2xsb3dlZCBmb3IgZWFjaCBjaGlsZCkuXG4gKiA5LiAnY2hpbGRyZW5ib3VuZCcgZXZlbnQgaXMgZGlzcGF0Y2hlZCB3aGVuIGFsbCBjb21wb25lbnQncyBjaGlsZHJlbiBhcmUgY3JlYXRlZCBhbmQgYWRkZWQgdG8gdGhlaXIgc2NvcGUgKHNlZSBldmVudCBkZXNjcmlwdGlvbiBiZWxvdykuXG4gKiAxMC4gJ3N0YXRlcmVhZHknIGV2ZW50IGlzIGRpc3BhdGNoZWQgZm9yIGNvbXBvbmVudCBhbmQgYWxsIGl0cyBjaGlsZHJlbiB3aGVuIGNvbXBvbmVudCBpcyBjcmVhdGUgZnJvbSBzdGF0ZSAoc2VlIGV2ZW50IGRlc2NyaXB0aW9uIGJlbG93KS5cbiAqIDExLiBhdCB0aGlzIHBvaW50IGNvbXBvbmVudCBpcyBpbiB0aGUgXCJpbnRlcmFjdGl2ZVwiIHN0YXRlIHdoZW4gaXQgYW5kIGl0cyBmYWNldHMgd2lsbCBvbmx5IHJlc3BvbmQgdG8gbWVzc2FnZXMvZXZlbnRzIHRoYXQgdGhleSBzdWJzY3JpYmVkIHRvIGR1cmluZyBpbml0aWFsaXphdGlvbi5cbiAqXG4gKlxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgc2NvcGUgdG8gd2hpY2ggY29tcG9uZW50IHdpbGwgYmVsb25nLiBJdCBpcyB1c3VhbGx5IGEgdG9wIGxldmVsIHNjb3BlIG9iamVjdCByZXR1cm5lZCBieSBgbWlsby5iaW5kZXJgIG9yIGBzY29wZWAgcHJvcGVydHkgb2YgQ29udGFpbmVyIGZhY2V0LlxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IERPTSBlbGVtZW50IHRoYXQgY29tcG9uZW50IGlzIGF0dGFjaGVkIHRvXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBjb21wb25lbnQgbmFtZSwgc2hvdWxkIGJlIHVuaXF1ZSBpbiB0aGUgc2NvcGUgb2YgY29tcG9uZW50XG4gKiBAcGFyYW0ge0NvbXBvbmVudEluZm99IGNvbXBvbmVudEluZm8gaW5zdGFuY2Ugb2YgQ29tcG9uZW50SW5mbyBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNvcHkgb2YgY29tcG9uZW50XG4gKiAgVE9ETyB0cnkgcmVtb3ZpbmcgaXRcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xudmFyIENvbXBvbmVudCA9IF8uY3JlYXRlU3ViY2xhc3MoRmFjZXRlZE9iamVjdCwgJ0NvbXBvbmVudCcsIHRydWUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbXBvbmVudDtcblxuX3JlZ2lzdGVyV2l0aERvbVN0b3JhZ2UoJ0NvbXBvbmVudCcpO1xuXG5cbi8qKlxuICogIyMjI0NvbXBvbmVudCBjbGFzcyBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2NyZWF0ZUNvbXBvbmVudENsYXNzXSgjQ29tcG9uZW50JCRjcmVhdGVDb21wb25lbnRDbGFzcylcbiAqIC0gW2NyZWF0ZV0oI0NvbXBvbmVudCQkY3JlYXRlKVxuICogLSBbY29weV0oI0NvbXBvbmVudCQkY29weSlcbiAqIC0gW2NyZWF0ZU9uRWxlbWVudF0oI0NvbXBvbmVudCQkY3JlYXRlT25FbGVtZW50KVxuICogLSBbaXNDb21wb25lbnRdKGNfdXRpbHMuanMuaHRtbCNpc0NvbXBvbmVudClcbiAqIC0gW2dldENvbXBvbmVudF0oY191dGlscy5qcy5odG1sI2dldENvbXBvbmVudClcbiAqIC0gW2dldENvbnRhaW5pbmdDb21wb25lbnRdKGNfdXRpbHMuanMuaHRtbCNnZXRDb250YWluaW5nQ29tcG9uZW50KVxuICogLSBbY3JlYXRlRnJvbVN0YXRlXSgjQ29tcG9uZW50JCRjcmVhdGVGcm9tU3RhdGUpXG4gKiAtIFtjcmVhdGVGcm9tRGF0YVRyYW5zZmVyXSgjQ29tcG9uZW50JCRjcmVhdGVGcm9tRGF0YVRyYW5zZmVyKVxuICovXG5fLmV4dGVuZChDb21wb25lbnQsIHtcbiAgICBjcmVhdGVDb21wb25lbnRDbGFzczogQ29tcG9uZW50JCRjcmVhdGVDb21wb25lbnRDbGFzcyxcbiAgICBjcmVhdGU6IENvbXBvbmVudCQkY3JlYXRlLFxuICAgIGNvcHk6IENvbXBvbmVudCQkY29weSxcbiAgICBjcmVhdGVPbkVsZW1lbnQ6IENvbXBvbmVudCQkY3JlYXRlT25FbGVtZW50LFxuICAgIGlzQ29tcG9uZW50OiBjb21wb25lbnRVdGlscy5pc0NvbXBvbmVudCxcbiAgICBnZXRDb21wb25lbnQ6IGNvbXBvbmVudFV0aWxzLmdldENvbXBvbmVudCxcbiAgICBnZXRDb250YWluaW5nQ29tcG9uZW50OiBjb21wb25lbnRVdGlscy5nZXRDb250YWluaW5nQ29tcG9uZW50LFxuICAgIGNyZWF0ZUZyb21TdGF0ZTogQ29tcG9uZW50JCRjcmVhdGVGcm9tU3RhdGUsXG4gICAgY3JlYXRlRnJvbURhdGFUcmFuc2ZlcjogQ29tcG9uZW50JCRjcmVhdGVGcm9tRGF0YVRyYW5zZmVyXG59KTtcbmRlbGV0ZSBDb21wb25lbnQuY3JlYXRlRmFjZXRlZENsYXNzO1xuXG5cbi8qKlxuICogIyMjI0NvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2luaXRdKCNDb21wb25lbnQkaW5pdClcbiAqIC0gW2NyZWF0ZUVsZW1lbnRdKCNDb21wb25lbnQkY3JlYXRlRWxlbWVudClcbiAqIC0gW2hhc0ZhY2V0XSgjQ29tcG9uZW50JGhhc0ZhY2V0KVxuICogLSBbYWRkRmFjZXRdKCNDb21wb25lbnQkYWRkRmFjZXQpXG4gKiAtIFthbGxGYWNldHNdKCNDb21wb25lbnQkYWxsRmFjZXRzKVxuICogLSBbcmVuYW1lXSgjQ29tcG9uZW50JHJlbmFtZSlcbiAqIC0gW3JlbW92ZV0oI0NvbXBvbmVudCRyZW1vdmUpXG4gKiAtIFtnZXRTdGF0ZV0oI0NvbXBvbmVudCRnZXRTdGF0ZSlcbiAqIC0gW2dldFRyYW5zZmVyU3RhdGVdKCNDb21wb25lbnQkZ2V0VHJhbnNmZXJTdGF0ZSlcbiAqIC0gW3NldFN0YXRlXSgjQ29tcG9uZW50JHNldFN0YXRlKVxuICogLSBbZ2V0U2NvcGVQYXJlbnRdKCNDb21wb25lbnQkZ2V0U2NvcGVQYXJlbnQpXG4gKiAtIFtnZXRUb3BTY29wZVBhcmVudF0oI0NvbXBvbmVudCRnZXRUb3BTY29wZVBhcmVudClcbiAqIC0gW2dldFNjb3BlUGFyZW50V2l0aENsYXNzXSgjQ29tcG9uZW50JGdldFNjb3BlUGFyZW50V2l0aENsYXNzKVxuICogLSBbZ2V0VG9wU2NvcGVQYXJlbnRXaXRoQ2xhc3NdKCNDb21wb25lbnQkZ2V0VG9wU2NvcGVQYXJlbnRXaXRoQ2xhc3MpXG4gKiAtIFt3YWxrU2NvcGVUcmVlXSgjQ29tcG9uZW50JHdhbGtTY29wZVRyZWUpXG4gKiAtIFticm9hZGNhc3RdKCNDb21wb25lbnQkYnJvYWRjYXN0KVxuICogLSBbZGVzdHJveV0oI0NvbXBvbmVudCRkZXN0cm95KVxuICogLSBbaXNEZXN0cm95ZWRdKCNDb21wb25lbnQkaXNEZXN0cm95ZWQpXG4gKlxuICpcbiAqICMjIyMjW01lc3Nlbmdlcl0oLi4vbWVzc2VuZ2VyL2luZGV4LmpzLmh0bWwpIG1ldGhvZHMgYXZhaWxhYmxlIG9uIGNvbXBvbmVudCMjIyMjXG4gKlxuICogLSBbb25dKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sI01lc3NlbmdlciRvbikgLSBzaW5nbGUgc3Vic2NyaWJlXG4gKiAtIFtvZmZdKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sI01lc3NlbmdlciRvZmYpIC0gc2luZ2xlIHVuc3Vic2NyaWJlXG4gKiAtIFtvbk1lc3NhZ2VzXSguLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCNNZXNzZW5nZXIkb25NZXNzYWdlcykgLSBtdWx0aXBsZSBzdWJzY3JpYmVcbiAqIC0gW29mZk1lc3NhZ2VzXSguLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCNNZXNzZW5nZXIkb2ZmTWVzc2FnZXMpIC0gbXVsdGlwbGUgdW5zdWJzY3JpYmVcbiAqIC0gW3Bvc3RNZXNzYWdlXSguLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCNNZXNzZW5nZXIkcG9zdE1lc3NhZ2UpIC0gcG9zdCBtZXNzYWdlIG9uIGNvbXBvbmVudFxuICogLSBbZ2V0U3Vic2NyaWJlcnNdKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sI01lc3NlbmdlciRnZXRTdWJzY3JpYmVycykgLSBnZXQgc3Vic2NyaWJlcnMgZm9yIGEgZ2l2ZW4gbWVzc2FnZVxuICovXG5fLmV4dGVuZFByb3RvKENvbXBvbmVudCwge1xuICAgIGluaXQ6IENvbXBvbmVudCRpbml0LFxuICAgIHN0YXJ0OiBDb21wb25lbnQkc3RhcnQsXG4gICAgY3JlYXRlRWxlbWVudDogQ29tcG9uZW50JGNyZWF0ZUVsZW1lbnQsXG4gICAgaGFzRmFjZXQ6IENvbXBvbmVudCRoYXNGYWNldCxcbiAgICBhZGRGYWNldDogQ29tcG9uZW50JGFkZEZhY2V0LFxuICAgIGFsbEZhY2V0czogQ29tcG9uZW50JGFsbEZhY2V0cyxcbiAgICByZW5hbWU6IENvbXBvbmVudCRyZW5hbWUsXG4gICAgcmVtb3ZlOiBDb21wb25lbnQkcmVtb3ZlLFxuICAgIGluc2VydEludG86IENvbXBvbmVudCRpbnNlcnRJbnRvLFxuXG4gICAgZ2V0U3RhdGU6IENvbXBvbmVudCRnZXRTdGF0ZSxcbiAgICBnZXRUcmFuc2ZlclN0YXRlOiBDb21wb25lbnQkZ2V0VHJhbnNmZXJTdGF0ZSxcbiAgICBfZ2V0U3RhdGU6IENvbXBvbmVudCRfZ2V0U3RhdGUsXG4gICAgc2V0U3RhdGU6IENvbXBvbmVudCRzZXRTdGF0ZSxcbiAgICBcbiAgICBnZXRTY29wZVBhcmVudDogQ29tcG9uZW50JGdldFNjb3BlUGFyZW50LFxuICAgIGdldFRvcFNjb3BlUGFyZW50OiBDb21wb25lbnQkZ2V0VG9wU2NvcGVQYXJlbnQsXG4gICAgZ2V0U2NvcGVQYXJlbnRXaXRoQ2xhc3M6IENvbXBvbmVudCRnZXRTY29wZVBhcmVudFdpdGhDbGFzcyxcbiAgICBnZXRUb3BTY29wZVBhcmVudFdpdGhDbGFzczogQ29tcG9uZW50JGdldFRvcFNjb3BlUGFyZW50V2l0aENsYXNzLFxuXG4gICAgc2V0U2NvcGVQYXJlbnRGcm9tRE9NOiBDb21wb25lbnQkc2V0U2NvcGVQYXJlbnRGcm9tRE9NLFxuXG4gICAgd2Fsa1Njb3BlVHJlZTogQ29tcG9uZW50JHdhbGtTY29wZVRyZWUsXG5cbiAgICB0cmVlUGF0aE9mOiBDb21wb25lbnQkdHJlZVBhdGhPZixcbiAgICBnZXRDb21wb25lbnRBdFRyZWVQYXRoOiBDb21wb25lbnQkZ2V0Q29tcG9uZW50QXRUcmVlUGF0aCxcbiAgICBpbnNlcnRBdFRyZWVQYXRoOiBDb21wb25lbnQkaW5zZXJ0QXRUcmVlUGF0aCxcblxuICAgIGJyb2FkY2FzdDogQ29tcG9uZW50JGJyb2FkY2FzdCxcbiAgICBkZXN0cm95OiBDb21wb25lbnQkZGVzdHJveSxcbiAgICBpc0Rlc3Ryb3llZDogQ29tcG9uZW50JGlzRGVzdHJveWVkXG59KTtcblxuXG4vKipcbiAqIEV4cG9zZSBNZXNzZW5nZXIgbWV0aG9kcyBvbiBDb21wb25lbnQgcHJvdG90eXBlXG4gKi9cbnZhciBNRVNTRU5HRVJfUFJPUEVSVFkgPSAnX21lc3Nlbmdlcic7XG5NZXNzZW5nZXIudXNlV2l0aChDb21wb25lbnQsIE1FU1NFTkdFUl9QUk9QRVJUWSwgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcblxuXG52YXIgQ09NUE9ORU5UX0RBVEFfVFlQRV9QUkVGSVggPSAneC1hcHBsaWNhdGlvbi9taWxvLWNvbXBvbmVudCc7XG52YXIgQ09NUE9ORU5UX0RBVEFfVFlQRV9SRUdFWCA9IC94LWFwcGxpY2F0aW9uXFwvbWlsby1jb21wb25lbnRcXC8oW2Etel8kXVswLTlhLXpfJF0qKSg/OlxcLygpKS9pO1xuXG4vKipcbiAqIENvbXBvbmVudCBjbGFzcyBtZXRob2RcbiAqIENyZWF0ZXMgYSBzdWJjbGFzcyBvZiBjb21wb25lbnQgZnJvbSB0aGUgbWFwIG9mIGNvbmZpZ3VyZWQgZmFjZXRzLlxuICogVGhpcyBtZXRob2Qgd3JhcHMgYW5kIHJlcGxhY2VzIFtgY3JlYXRlRmFjZXRlZENsYXNzYF0oLi4vYWJzdHJhY3QvZmFjZXRlZF9vYmplY3QuanMuaHRtbCNjcmVhdGVGYWNldGVkQ2xhc3MpIGNsYXNzIG1ldGhvZCBvZiBGYWNldGVkT2JqZWN0LlxuICogVW5saWtlIGNyZWF0ZUZhY2V0ZWRDbGFzcywgdGhpcyBtZXRob2QgdGFrZSBmYWNldCBjbGFzc2VzIGZyb20gcmVnaXN0cnkgYnkgdGhlaXIgbmFtZSwgc28gb25seSBtYXAgb2YgZmFjZXRzIGNvbmZpZ3VyYXRpb24gbmVlZHMgdG8gYmUgcGFzc2VkLiBBbGwgZmFjZXRzIGNsYXNzZXMgc2hvdWxkIGJlIHN1YmNsYXNzZXMgb2YgW0NvbXBvbmVudEZhY2V0XSguL2NfZmFjZXQuanMuaHRtbClcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBjbGFzcyBuYW1lXG4gKiBAcGFyYW0ge09iamVjdFtPYmplY3RdIHwgQXJyYXlbU3RyaW5nXX0gZmFjZXRzQ29uZmlnIG1hcCBvZiBmYWNldHMgY29uZmlndXJhdGlvbi5cbiAqICBJZiBzb21lIGZhY2V0IGRvZXMgbm90IHJlcXVpcmUgY29uZmlndXJhdGlvbiwgYHVuZGVmaW5lZGAgc2hvdWxkIGJlIHBhc3NlZCBhcyB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGZhY2V0LlxuICogIElmIG5vIGZhY2V0IHJlcXVpcmVzIGNvbmZpZ3VyYXRpb24sIHRoZSBhcnJheSBvZiBmYWNldHMgbmFtZXMgY2FuIGJlIHBhc3NlZC5cbiAqIEByZXR1cm4ge1N1YmNsYXNzKENvbXBvbmVudCl9XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCQkY3JlYXRlQ29tcG9uZW50Q2xhc3MobmFtZSwgZmFjZXRzQ29uZmlnKSB7XG4gICAgLy8gY29udmVydCBhcnJheSBvZiBmYWNldCBuYW1lcyB0byBtYXAgb2YgZW1wdHkgZmFjZXRzIGNvbmZpZ3VyYXRpb25zXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmFjZXRzQ29uZmlnKSkge1xuICAgICAgICB2YXIgY29uZmlnTWFwID0ge307XG4gICAgICAgIGZhY2V0c0NvbmZpZy5mb3JFYWNoKGZ1bmN0aW9uKGZjdCkge1xuICAgICAgICAgICAgdmFyIGZjdE5hbWUgPSBfLmZpcnN0TG93ZXJDYXNlKGZjdCk7XG4gICAgICAgICAgICBjb25maWdNYXBbZmN0TmFtZV0gPSB7fTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZhY2V0c0NvbmZpZyA9IGNvbmZpZ01hcDtcbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgbWFwIG9mIGZhY2V0cyBjbGFzc2VzIGZyb20gZmFjZXRSZWdpc3RyeVxuICAgIHZhciBmYWNldHNDbGFzc2VzO1xuICAgIGlmICh0eXBlb2YgZmFjZXRzQ29uZmlnID09ICdvYmplY3QnICYmIF8ua2V5cyhmYWNldHNDb25maWcpLmxlbmd0aCkge1xuICAgICAgICBmYWNldHNDbGFzc2VzID0ge307XG4gICAgICAgIF8uZWFjaEtleShmYWNldHNDb25maWcsIGZ1bmN0aW9uKGZjdENvbmZpZywgZmN0KSB7XG4gICAgICAgICAgICB2YXIgZmN0TmFtZSA9IF8uZmlyc3RMb3dlckNhc2UoZmN0KTtcbiAgICAgICAgICAgIHZhciBmY3RDbGFzc05hbWUgPSBfLmZpcnN0VXBwZXJDYXNlKGZjdCk7XG4gICAgICAgICAgICBmYWNldHNDbGFzc2VzW2ZjdE5hbWVdID0gZmFjZXRzUmVnaXN0cnkuZ2V0KGZjdENsYXNzTmFtZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBzdWJjbGFzcyBvZiBDb21wb25lbnQgdXNpbmcgbWV0aG9kIG9mIEZhY2V0ZWRPYmplY3RcbiAgICB2YXIgQ29tcG9uZW50Q2xhc3MgPSBGYWNldGVkT2JqZWN0LmNyZWF0ZUZhY2V0ZWRDbGFzcy5jYWxsKHRoaXMsIG5hbWUsIGZhY2V0c0NsYXNzZXMsIGZhY2V0c0NvbmZpZyk7XG4gICAgXG4gICAgX3JlZ2lzdGVyV2l0aERvbVN0b3JhZ2UobmFtZSk7XG5cbiAgICByZXR1cm4gQ29tcG9uZW50Q2xhc3M7XG59XG5cblxuZnVuY3Rpb24gX3JlZ2lzdGVyV2l0aERvbVN0b3JhZ2UoY2xhc3NOYW1lKSB7XG4gICAgRE9NU3RvcmFnZS5yZWdpc3RlckRhdGFUeXBlKGNsYXNzTmFtZSwgQ29tcG9uZW50X2RvbVN0b3JhZ2VTZXJpYWxpemVyLCBDb21wb25lbnRfZG9tU3RvcmFnZVBhcnNlcik7XG59XG5cblxuZnVuY3Rpb24gQ29tcG9uZW50X2RvbVN0b3JhZ2VTZXJpYWxpemVyKGNvbXBvbmVudCkge1xuICAgIHZhciBzdGF0ZSA9IGNvbXBvbmVudC5nZXRTdGF0ZSgpO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzdGF0ZSk7ICAgXG59XG5cblxuZnVuY3Rpb24gQ29tcG9uZW50X2RvbVN0b3JhZ2VQYXJzZXIoY29tcFN0ciwgY29tcENsYXNzTmFtZSkge1xuICAgIHZhciBzdGF0ZSA9IF8uanNvblBhcnNlKGNvbXBTdHIpO1xuICAgIGlmIChzdGF0ZSlcbiAgICAgICAgcmV0dXJuIENvbXBvbmVudC5jcmVhdGVGcm9tU3RhdGUoc3RhdGUpO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGNsYXNzIG1ldGhvZFxuICogQ3JlYXRlcyBjb21wb25lbnQgZnJvbSBbQ29tcG9uZW50SW5mb10oLi9jX2luZm8uanMuaHRtbCkgKHVzZWQgYnkgW21pbG8uYmluZGVyXSguLi9iaW5kZXIuanMuaHRtbCkgYW5kIHRvIGNvcHkgY29tcG9uZW50KVxuICogQ29tcG9uZW50IG9mIGFueSByZWdpc3RlcmVkIGNsYXNzIChzZWUgW2NvbXBvbmVudHNSZWdpc3RyeV0oLi9jX3JlZ2lzdHJ5LmpzLmh0bWwpKSB3aXRoIGFueSBhZGRpdGlvbmFsIHJlZ2lzdGVyZWQgZmFjZXRzIChzZWUgW2ZhY2V0c1JlZ2lzdHJ5XSguL2NfZmFjZXRzL2NmX3JlZ2lzdHJ5LmpzLmh0bWwpKSBjYW4gYmUgY3JlYXRlZCB1c2luZyB0aGlzIG1ldGhvZC5cbiAqXG4gKiBAcGFyYW0ge0NvbXBvbmVudEluZm99IGluZm9cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gdGhyb3dPbkVycm9ycyBJZiBzZXQgdG8gZmFsc2UsIHRoZW4gZXJyb3JzIHdpbGwgb25seSBiZSBsb2dnZWQgdG8gY29uc29sZS4gVHJ1ZSBieSBkZWZhdWx0LlxuIEAgQHJldHVybiB7Q29tcG9uZW50fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkJGNyZWF0ZShpbmZvLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgdmFyIENvbXBvbmVudENsYXNzID0gaW5mby5Db21wb25lbnRDbGFzcztcblxuICAgIGlmICh0eXBlb2YgQ29tcG9uZW50Q2xhc3MgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgbWVzc2FnZSA9ICdjcmVhdGU6IGNvbXBvbmVudCBjbGFzcyBzaG91bGQgYmUgZnVuY3Rpb24sIFwiJyArIHR5cGVvZiBDb21wb25lbnRDbGFzcyArICdcIiBwYXNzZWQnOyBcbiAgICAgICAgaWYgKHRocm93T25FcnJvcnMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0NvbXBvbmVudCcsIG1lc3NhZ2UsICc7dXNpbmcgYmFzZSBDb21wb25lbnQgY2xhc3MgaW5zdGVhZCcpO1xuICAgICAgICAgICAgQ29tcG9uZW50Q2xhc3MgPSBDb21wb25lbnQ7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHZhciBhQ29tcG9uZW50ID0gbmV3IENvbXBvbmVudENsYXNzKGluZm8uc2NvcGUsIGluZm8uZWwsIGluZm8ubmFtZSwgaW5mbyk7XG5cbiAgICBpZiAoaW5mby5leHRyYUZhY2V0c0NsYXNzZXMpXG4gICAgICAgIF8uZWFjaEtleShpbmZvLmV4dHJhRmFjZXRzQ2xhc3NlcywgZnVuY3Rpb24oRmFjZXRDbGFzcykge1xuICAgICAgICAgICAgaWYgKCEgYUNvbXBvbmVudC5oYXNGYWNldChGYWNldENsYXNzKSlcbiAgICAgICAgICAgICAgICBhQ29tcG9uZW50LmFkZEZhY2V0KEZhY2V0Q2xhc3MsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0aHJvd09uRXJyb3JzKTtcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gYUNvbXBvbmVudDtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBjbGFzcyBtZXRob2RcbiAqIENyZWF0ZSBhIGNvcHkgb2YgY29tcG9uZW50LCBpbmNsdWRpbmcgYSBjb3B5IG9mIERPTSBlbGVtZW50LiBSZXR1cm5zIGEgY29weSBvZiBgY29tcG9uZW50YCAob2YgdGhlIHNhbWUgY2xhc3MpIHdpdGggbmV3IERPTSBlbGVtZW50IChub3QgaW5zZXJ0ZWQgaW50byBwYWdlKS5cbiAqIENvbXBvbmVudCBpcyBhZGRlZCB0byB0aGUgc2FtZSBzY29wZSBhcyB0aGUgb3JpZ2luYWwgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wb25lbnQgYW4gaW5zdGFuY2Ugb2YgQ29tcG9uZW50IGNsYXNzIG9yIHN1YmNsYXNzXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXBDb3B5IG9wdGlvbmFsIGB0cnVlYCB0byBtYWtlIGRlZXAgY29weSBvZiBET00gZWxlbWVudCwgb3RoZXJ3aXNlIG9ubHkgZWxlbWVudCB3aXRob3V0IGNoaWxkcmVuIGlzIGNvcGllZFxuICogQHJldHVybiB7Q29tcG9uZW50fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkJGNvcHkoY29tcG9uZW50LCBkZWVwQ29weSkge1xuICAgIGNoZWNrKGNvbXBvbmVudCwgQ29tcG9uZW50KTtcbiAgICBjaGVjayhkZWVwQ29weSwgTWF0Y2guT3B0aW9uYWwoQm9vbGVhbikpO1xuXG4gICAgaWYgKGRlZXBDb3B5ICYmICFjb21wb25lbnQuY29udGFpbmVyKSBcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZGVlcCBjb3B5IGNvbXBvbmVudCB3aXRob3V0IGNvbnRhaW5lciBmYWNldCcpO1xuXG4gICAgLy8gY29weSBET00gZWxlbWVudCwgdXNpbmcgRG9tIGZhY2V0IGlmIGl0IGlzIGF2YWlsYWJsZVxuICAgIHZhciBuZXdFbCA9IGNvbXBvbmVudC5kb20gXG4gICAgICAgICAgICAgICAgICAgID8gY29tcG9uZW50LmRvbS5jb3B5KGRlZXBDb3B5KVxuICAgICAgICAgICAgICAgICAgICA6IGNvbXBvbmVudC5lbC5jbG9uZU5vZGUoZGVlcENvcHkpO1xuXG4gICAgdmFyIENvbXBvbmVudENsYXNzID0gY29tcG9uZW50LmNvbnN0cnVjdG9yO1xuXG4gICAgLy8gY3JlYXRlIGNvbXBvbmVudCBvZiB0aGUgc2FtZSBjbGFzcyBvbiB0aGUgZWxlbWVudFxuICAgIHZhciBhQ29tcG9uZW50ID0gQ29tcG9uZW50Q2xhc3MuY3JlYXRlT25FbGVtZW50KG5ld0VsLCB1bmRlZmluZWQsIGNvbXBvbmVudC5zY29wZSwgY29tcG9uZW50LmV4dHJhRmFjZXRzKTtcbiAgICB2YXIgc3RhdGUgPSBjb21wb25lbnQuX2dldFN0YXRlKGRlZXBDb3B5IHx8IGZhbHNlKTtcbiAgICBhQ29tcG9uZW50LnNldFN0YXRlKHN0YXRlKTtcbiAgICBfLmRlZmVyTWV0aG9kKGFDb21wb25lbnQsICdicm9hZGNhc3QnLCAnc3RhdGVyZWFkeScpO1xuICAgIHJldHVybiBhQ29tcG9uZW50O1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGNsYXNzIG1ldGhvZFxuICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBjb21wb25lbnQgYXRhY2hlZCB0byBlbGVtZW50LiBBbGwgc3ViY2xhc3NlcyBvZiBjb21wb25lbnQgaW5oZXJpdCB0aGlzIG1ldGhvZC5cbiAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBvZiB0aGUgY2xhc3MgdGhpcyBtZXRob2QgaXMgdXNlZCB3aXRoICh0aGVjb250ZXh0IG9mIHRoZSBtZXRob2QgY2FsbCkuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbCBvcHRpb25hbCBlbGVtZW50IHRvIGF0dGFjaCBjb21wb25lbnQgdG8uIElmIGVsZW1lbnQgaXMgbm90IHBhc3NlZCwgaXQgd2lsbCBiZSBjcmVhdGVkXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5uZXJIVE1MIG9wdGlvbmFsIGlubmVyIGh0bWwgdG8gaW5zZXJ0IGluIGVsZW1lbnQgYmVmb3JlIGJpbmRpbmcuXG4gKiBAcGFyYW0ge1Njb3BlfSByb290U2NvcGUgb3B0aW9uYWwgc2NvcGUgdG8gcHV0IGNvbXBvbmVudCBpbi4gSWYgbm90IHBhc3NlZCwgY29tcG9uZW50IHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIHNjb3BlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnQuIElmIHN1Y2ggc2NvcGUgZG9lcyBub3QgZXhpc3QsIG5ldyBzY29wZSB3aWxsIGJlIGNyZWF0ZWQuXG4gKiBAcGFyYW0ge0FycmF5W1N0cmluZ119IGV4dHJhRmFjZXRzIGxpc3Qgb2YgZXh0cmEgZmFjZXQgdG8gYWRkIHRvIGNvbXBvbmVudFxuICogQHJldHVybiB7U3ViY2xhc3MoQ29tcG9uZW50KX1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JCRjcmVhdGVPbkVsZW1lbnQoZWwsIGlubmVySFRNTCwgcm9vdFNjb3BlLCBleHRyYUZhY2V0cykge1xuICAgIGNoZWNrKGlubmVySFRNTCwgTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSk7XG4gICAgY2hlY2socm9vdFNjb3BlLCBNYXRjaC5PcHRpb25hbChTY29wZSkpO1xuICAgIGNoZWNrKGV4dHJhRmFjZXRzLCBNYXRjaC5PcHRpb25hbChbU3RyaW5nXSkpO1xuXG4gICAgLy8gXCJ0aGlzXCIgcmVmZXJzIHRvIHRoZSBjbGFzcyBvZiBjb21wb25lbnQgaGVyZSwgYXMgdGhpcyBpcyBhIGNsYXNzIG1ldGhvZFxuICAgIGlmIChlbCAmJiBpbm5lckhUTUwpIGVsLmlubmVySFRNTCA9IGlubmVySFRNTDtcbiAgICBlbCA9IGVsIHx8IF9jcmVhdGVDb21wb25lbnRFbGVtZW50LmNhbGwodGhpcywgaW5uZXJIVE1MKTtcbiAgICByb290U2NvcGUgPSByb290U2NvcGUgfHwgX2ZpbmRPckNyZWF0ZUNvbXBvbmVudFJvb3RTY29wZShlbCk7XG4gICAgdmFyIGFDb21wb25lbnQgPSBfYWRkQXR0cmlidXRlQW5kQmluZENvbXBvbmVudC5jYWxsKHRoaXMsIGVsLCByb290U2NvcGUsIGV4dHJhRmFjZXRzKTtcbiAgICBhQ29tcG9uZW50LmJyb2FkY2FzdCgnc3RhdGVyZWFkeScpO1xuICAgIHJldHVybiBhQ29tcG9uZW50O1xufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ29tcG9uZW50RWxlbWVudChpbm5lckhUTUwpIHtcbiAgICAvLyBcInRoaXNcIiByZWZlcnMgdG8gdGhlIGNsYXNzIG9mIGNvbXBvbmVudCBoZXJlLCBhcyB0aGlzIGlzIGEgY2xhc3MgbWV0aG9kXG4gICAgdmFyIERvbSA9IGZhY2V0c1JlZ2lzdHJ5LmdldCgnRG9tJylcbiAgICAgICAgLCBkb21GYWNldENvbmZpZyA9IHRoaXMuZ2V0RmFjZXRDb25maWcoJ2RvbScpXG4gICAgICAgICwgdGVtcGxhdGVGYWNldENvbmZpZyA9IHRoaXMuZ2V0RmFjZXRDb25maWcoJ3RlbXBsYXRlJylcbiAgICAgICAgLCB0ZW1wbGF0ZSA9IHRlbXBsYXRlRmFjZXRDb25maWcgJiYgdGVtcGxhdGVGYWNldENvbmZpZy50ZW1wbGF0ZTtcblxuICAgIHZhciBlbENvbmZpZyA9IHtcbiAgICAgICAgZG9tQ29uZmlnOiBkb21GYWNldENvbmZpZyxcbiAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlLFxuICAgICAgICBjb250ZW50OiBpbm5lckhUTUxcbiAgICB9O1xuXG4gICAgcmV0dXJuIERvbS5jcmVhdGVFbGVtZW50KGVsQ29uZmlnKTtcbn1cblxuZnVuY3Rpb24gX2ZpbmRPckNyZWF0ZUNvbXBvbmVudFJvb3RTY29wZShlbCkge1xuICAgIHZhciBwYXJlbnQgPSBDb21wb25lbnQuZ2V0Q29udGFpbmluZ0NvbXBvbmVudChlbCwgZmFsc2UsICdDb250YWluZXInKTtcbiAgICByZXR1cm4gcGFyZW50ID8gcGFyZW50LmNvbnRhaW5lci5zY29wZSA6IG5ldyBTY29wZShlbCk7XG59XG5cbmZ1bmN0aW9uIF9hZGRBdHRyaWJ1dGVBbmRCaW5kQ29tcG9uZW50KGVsLCByb290U2NvcGUsIGV4dHJhRmFjZXRzKSB7XG4gICAgLy8gYWRkIGJpbmQgYXR0cmlidXRlIHRvIGVsZW1lbnRcbiAgICB2YXIgYXR0ciA9IG5ldyBCaW5kQXR0cmlidXRlKGVsKTtcbiAgICAvLyBcInRoaXNcIiByZWZlcnMgdG8gdGhlIGNsYXNzIG9mIGNvbXBvbmVudCBoZXJlLCBhcyB0aGlzIGlzIGEgY2xhc3MgbWV0aG9kXG4gICAgYXR0ci5jb21wQ2xhc3MgPSB0aGlzLm5hbWU7XG4gICAgYXR0ci5jb21wRmFjZXRzID0gZXh0cmFGYWNldHM7XG4gICAgYXR0ci5kZWNvcmF0ZSgpO1xuXG4gICAgLy8gc2hvdWxkIGJlIHJlcXVpcmVkIGhlcmUgdG8gcmVzb2x2ZSBjaXJjdWxhciBkZXBlbmRlbmN5XG4gICAgdmFyIG1pbG9CaW5kZXIgPSByZXF1aXJlKCcuLi9iaW5kZXInKTtcbiAgICBtaWxvQmluZGVyKGVsLCByb290U2NvcGUpO1xuXG4gICAgcmV0dXJuIHJvb3RTY29wZVthdHRyLmNvbXBOYW1lXTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgY2xhc3MgbWV0aG9kXG4gKiBDcmVhdGVzIGNvbXBvbmVudCBmcm9tIGNvbXBvbmVudCBzdGF0ZSwgdGhhdCBpbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dCBpdHMgY2xhc3MsIGV4dHJhIGZhY2V0cywgZmFjZXRzIGRhdGEgYW5kIGFsbCBzY29wZSBjaGlsZHJlbi5cbiAqIFRoaXMgaXMgdXNlZCB0byBzYXZlL2xvYWQsIGNvcHkvcGFzdGUgYW5kIGRyYWcvZHJvcCBjb21wb25lbnRcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGUgc3RhdGUgZnJvbSB3aGljaCBjb21wb25lbnQgd2lsbCBiZSBjcmVhdGVkXG4gKiBAcGFyYW0ge1Njb3BlfSByb290U2NvcGUgc2NvcGUgdG8gd2hpY2ggY29tcG9uZW50IHdpbGwgYmUgYWRkZWRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gbmV3VW5pcXVlTmFtZSBvcHRpb25hbCBgdHJ1ZWAgdG8gY3JlYXRlIGNvbXBvbmVudCB3aXRoIHRoZSBuYW1lIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBvbmUuIGBGYWxzZWAgYnkgZGVmYXVsdC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gdGhyb3dPbkVycm9ycyBJZiBzZXQgdG8gZmFsc2UsIHRoZW4gZXJyb3JzIHdpbGwgb25seSBiZSBsb2dnZWQgdG8gY29uc29sZS4gVHJ1ZSBieSBkZWZhdWx0LlxuICogQHJldHVybiB7Q29tcG9uZW50fSBjb21wb25lbnRcbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JCRjcmVhdGVGcm9tU3RhdGUoc3RhdGUsIHJvb3RTY29wZSwgbmV3VW5pcXVlTmFtZSwgdGhyb3dPbkVycm9ycykge1xuICAgIGNoZWNrKHN0YXRlLCBNYXRjaC5PYmplY3RJbmNsdWRpbmcoe1xuICAgICAgICBjb21wTmFtZTogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSxcbiAgICAgICAgY29tcENsYXNzOiBNYXRjaC5PcHRpb25hbChTdHJpbmcpLFxuICAgICAgICBleHRyYUZhY2V0czogTWF0Y2guT3B0aW9uYWwoW1N0cmluZ10pLFxuICAgICAgICBmYWNldHNTdGF0ZXM6IE1hdGNoLk9wdGlvbmFsKE9iamVjdCksXG4gICAgICAgIG91dGVySFRNTDogU3RyaW5nXG4gICAgfSkpO1xuXG4gICAgdmFyIG1pbG9CaW5kZXIgPSByZXF1aXJlKCcuLi9iaW5kZXInKTtcblxuICAgIC8vIGNyZWF0ZSB3cmFwcGVyIGVsZW1lbnQgb3B0aW9uYWxseSByZW5hbWluZyBjb21wb25lbnRcbiAgICB2YXIgd3JhcEVsID0gX2NyZWF0ZUNvbXBvbmVudFdyYXBFbGVtZW50KHN0YXRlLCBuZXdVbmlxdWVOYW1lKTtcblxuICAgIC8vIGluc3RhbnRpYXRlIGFsbCBjb21wb25lbnRzIGZyb20gSFRNTFxuICAgIHZhciBzY29wZSA9IG1pbG9CaW5kZXIod3JhcEVsLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdGhyb3dPbkVycm9ycyk7XG5cbiAgICAvLyBhcyB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUgY29tcG9uZW50LCBjYWxsIHRvIF9hbnkgd2lsbCByZXR1cm4gaXRcbiAgICB2YXIgY29tcG9uZW50ID0gc2NvcGUuX2FueSgpO1xuXG4gICAgLy8gc2V0IGNvbXBvbmVudCdzIHNjb3BlXG4gICAgaWYgKHJvb3RTY29wZSkge1xuICAgICAgICBjb21wb25lbnQuc2NvcGUgPSByb290U2NvcGU7XG4gICAgICAgIHJvb3RTY29wZS5fYWRkKGNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgLy8gcmVzdG9yZSBjb21wb25lbnQgc3RhdGVcbiAgICBjb21wb25lbnQuc2V0U3RhdGUoc3RhdGUpO1xuICAgIF8uZGVmZXJNZXRob2QoY29tcG9uZW50LCAnYnJvYWRjYXN0JywgJ3N0YXRlcmVhZHknKTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7ICAgXG59XG5cblxuLy8gdXNlZCBieSBDb21wb25lbnQkJGNyZWF0ZUZyb21TdGF0ZVxuZnVuY3Rpb24gX2NyZWF0ZUNvbXBvbmVudFdyYXBFbGVtZW50KHN0YXRlLCBuZXdVbmlxdWVOYW1lKSB7XG4gICAgdmFyIHdyYXBFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHdyYXBFbC5pbm5lckhUTUwgPSBzdGF0ZS5vdXRlckhUTUw7XG5cbiAgICB2YXIgY2hpbGRyZW4gPSBkb21VdGlscy5jaGlsZHJlbih3cmFwRWwpO1xuICAgIGlmIChjaGlsZHJlbi5sZW5ndGggIT0gMSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgY3JlYXRlIGNvbXBvbmVudDogaW5jb3JyZWN0IEhUTUwsIGVsZW1lbnRzIG51bWJlcjogJyArIGNoaWxkcmVuLmxlbmd0aCArICcgKHNob3VsZCBiZSAxKScpO1xuICAgIHZhciBjb21wRWwgPSBjaGlsZHJlblswXTtcbiAgICB2YXIgYXR0ciA9IG5ldyBCaW5kQXR0cmlidXRlKGNvbXBFbCk7XG4gICAgYXR0ci5jb21wTmFtZSA9IG5ld1VuaXF1ZU5hbWUgPyBtaWxvQ29tcG9uZW50TmFtZSgpIDogc3RhdGUuY29tcE5hbWU7XG4gICAgYXR0ci5jb21wQ2xhc3MgPSBzdGF0ZS5jb21wQ2xhc3M7XG4gICAgYXR0ci5jb21wRmFjZXRzID0gc3RhdGUuZXh0cmFGYWNldHM7XG4gICAgYXR0ci5kZWNvcmF0ZSgpO1xuXG4gICAgcmV0dXJuIHdyYXBFbDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgY29tcG9uZW50IGZyb20gYSBEYXRhVHJhbnNmZXIgb2JqZWN0IChpZiBwb3NzaWJsZSlcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9EYXRhVHJhbnNmZXJcbiAqIEBwYXJhbSB7RGF0YVRyYW5zZmVyfSBkYXRhVHJhbnNmZXIgRGF0YSB0cmFuc2ZlclxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkJGNyZWF0ZUZyb21EYXRhVHJhbnNmZXIoZGF0YVRyYW5zZmVyKSB7XG4gICAgdmFyIGRhdGFUeXBlID0gXy5maW5kKGRhdGFUcmFuc2Zlci50eXBlcywgZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIENPTVBPTkVOVF9EQVRBX1RZUEVfUkVHRVgudGVzdCh0eXBlKTtcbiAgICB9KTtcbiAgICBpZiAoIWRhdGFUeXBlKSByZXR1cm47XG5cbiAgICB2YXIgc3RhdGUgPSBfLmpzb25QYXJzZShkYXRhVHJhbnNmZXIuZ2V0RGF0YShkYXRhVHlwZSkpO1xuICAgIGlmICghc3RhdGUpIHJldHVybjtcblxuICAgIHJldHVybiBDb21wb25lbnQuY3JlYXRlRnJvbVN0YXRlKHN0YXRlLCB1bmRlZmluZWQsIHRydWUpO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZC5cbiAqIEluaXRpYWxpemVzIGNvbXBvbmVudC4gQXV0b21hdGljYWxseSBjYWxsZWQgYnkgaW5oZXJpdGVkIGNvbnN0cnVjdG9yIG9mIEZhY2V0ZWRPYmplY3QuXG4gKiBTdWJjbGFzc2VzIHNob3VsZCBjYWxsIGluaGVyaXRlZCBpbml0IG1ldGhvZHM6XG4gKiBgYGBcbiAqIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1Njb3BlfSBzY29wZSBzY29wZSB0byB3aGljaCBjb21wb25lbnQgd2lsbCBiZWxvbmcuIEl0IGlzIHVzdWFsbHkgYSB0b3AgbGV2ZWwgc2NvcGUgb2JqZWN0IHJldHVybmVkIGJ5IGBtaWxvLmJpbmRlcmAgb3IgYHNjb3BlYCBwcm9wZXJ0eSBvZiBDb250YWluZXIgZmFjZXQuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgRE9NIGVsZW1lbnQgdGhhdCBjb21wb25lbnQgaXMgYXR0YWNoZWQgdG9cbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIGNvbXBvbmVudCBuYW1lLCBzaG91bGQgYmUgdW5pcXVlIGluIHRoZSBzY29wZSBvZiBjb21wb25lbnRcbiAqIEBwYXJhbSB7Q29tcG9uZW50SW5mb30gY29tcG9uZW50SW5mbyBpbnN0YW5jZSBvZiBDb21wb25lbnRJbmZvIGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgY29weSBvZiBjb21wb25lbnRcbiAqICBUT0RPIHRyeSByZW1vdmluZyBpdFxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkaW5pdChzY29wZSwgZWxlbWVudCwgbmFtZSwgY29tcG9uZW50SW5mbykge1xuICAgIC8vIGNyZWF0ZSBET00gZWxlbWVudCBpZiBpdCB3YXNuJ3QgcGFzc2VkIHRvIENvbnN0cnVjdG9yXG4gICAgdGhpcy5lbCA9IGVsZW1lbnQgfHwgdGhpcy5jcmVhdGVFbGVtZW50KCk7XG5cbiAgICAvLyBzdG9yZSByZWZlcmVuY2UgdG8gY29tcG9uZW50IG9uIERPTSBlbGVtZW50XG4gICAgaWYgKHRoaXMuZWwpIHtcbiAgICAgICAgLy8gY2hlY2sgdGhhdCBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSBjb21wb25lbnQgYWxyZWFkeSBhdGFjaGVkXG4gICAgICAgIHZhciBlbENvbXAgPSB0aGlzLmVsW2NvbmZpZy5jb21wb25lbnRSZWZdO1xuICAgICAgICBpZiAoZWxDb21wKVxuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ2NvbXBvbmVudCAnICsgbmFtZSArICcgYXR0YWNoZWQgdG8gZWxlbWVudCB0aGF0IGFscmVhZHkgaGFzIGNvbXBvbmVudCAnICsgZWxDb21wLm5hbWUpO1xuXG4gICAgICAgIHRoaXMuZWxbY29uZmlnLmNvbXBvbmVudFJlZl0gPSB0aGlzO1xuICAgIH1cblxuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIGNvbXBvbmVudEluZm86IGNvbXBvbmVudEluZm8sXG4gICAgICAgIGV4dHJhRmFjZXRzOiBbXVxuICAgIH0sIF8uRU5VTSk7XG5cbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcblxuICAgIC8vIGNyZWF0ZSBjb21wb25lbnQgbWVzc2VuZ2VyXG4gICAgdmFyIG1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcyk7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBNRVNTRU5HRVJfUFJPUEVSVFksIG1lc3Nlbmdlcik7XG5cbiAgICAvLyBjaGVjayBhbGwgZmFjZXRzIGRlcGVuZGVuY2llcyAocmVxdWlyZWQgZmFjZXRzKVxuICAgIHRoaXMuYWxsRmFjZXRzKCdjaGVjaycpO1xuXG4gICAgLy8gc3RhcnQgYWxsIGZhY2V0c1xuICAgIHRoaXMuYWxsRmFjZXRzKCdzdGFydCcpO1xuXG4gICAgLy8gY2FsbCBzdGFydCBtZXRob2QgaWYgaXQncyBkZWZpbmVkIGluIHN1YmNsYXNzXG4gICAgaWYgKHRoaXMuc3RhcnQpIHRoaXMuc3RhcnQoKTtcbn1cblxuXG4vKipcbiAqIFRoaXMgaXMgYSBzdHViIHRvIGF2b2lkIGNvbmZ1c2lvbiB3aGV0aGVyIHRoZSBtZXRob2Qgb2Ygc3VwZXJjbGFzcyBzaG91bGQgYmUgY2FsbGVkIGluIHN1YmNsYXNzZXNcbiAqIFRoZSBzdGFydCBtZXRob2Qgb2Ygc3ViY2xhc3MgaW5zdGFuY2UgaXMgY2FsbGVkIG9uY2UgYWxsIHRoZSBmYWNldHMgYXJlIGNyZWF0ZWQsIGluaXRpYWxpemVkIGFuZCBzdGFydGVkIChzZWUgYWJvdmUpXG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRzdGFydCgpIHt9XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogSW5pdGlhbGl6ZXMgdGhlIGVsZW1lbnQgd2hpY2ggdGhpcyBjb21wb25lbnQgaXMgYm91bmQgdG9cbiAqXG4gKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQgb3V0c2lkZSB0aGUgRE9NIGFuZFxuICogd2lsbCBnZW5lcmF0ZSBhIG5ldyBlbGVtZW50IGZvciB0aGUgY29tcG9uZW50LlxuICogXG4gKiBAcmV0dXJuIHtFbGVtZW50fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkY3JlYXRlRWxlbWVudCgpIHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09ICd1bmRlZmluZWQnKVxuICAgICAgICByZXR1cm47XG5cbiAgICB0aGlzLmVsID0gdGhpcy5kb21cbiAgICAgICAgICAgICAgICA/IHRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoKVxuICAgICAgICAgICAgICAgIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG5cbiAgICByZXR1cm4gdGhpcy5lbDtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgdHJ1ZSBpZiBjb21wb25lbnQgaGFzIGZhY2V0XG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IGZhY2V0TmFtZU9yQ2xhc3NcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRoYXNGYWNldChmYWNldE5hbWVPckNsYXNzKSB7XG4gICAgdmFyIGZhY2V0TmFtZSA9IF8uZmlyc3RMb3dlckNhc2UodHlwZW9mIGZhY2V0TmFtZU9yQ2xhc3MgPT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZmFjZXROYW1lT3JDbGFzcy5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmYWNldE5hbWVPckNsYXNzKTtcblxuICAgIHZhciBmYWNldCA9IHRoaXNbZmFjZXROYW1lXTtcbiAgICBpZiAoISBmYWNldCBpbnN0YW5jZW9mIENvbXBvbmVudEZhY2V0KVxuICAgICAgICBsb2dnZXIud2FybignZXhwZWN0ZWQgZmFjZXQnLCBmYWNldE5hbWUsICdidXQgdGhpcyBwcm9wZXJ0eSBuYW1lIGlzIHVzZWQgZm9yIHNvbWV0aGluZyBlbHNlJyk7XG5cbiAgICByZXR1cm4gISEgZmFjZXQ7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogQWRkcyBmYWNldCB3aXRoIGdpdmVuIG5hbWUgb3IgY2xhc3MgdG8gdGhlIGluc3RhbmNlIG9mIENvbXBvbmVudCAob3IgaXRzIHN1YmNsYXNzKS5cbiAqIFxuICogQHBhcmFtIHtTdHJpbmd8U3ViY2xhc3MoQ29tcG9uZW50KX0gZmFjZXROYW1lT3JDbGFzcyBuYW1lIG9mIGZhY2V0IGNsYXNzIG9yIHRoZSBjbGFzcyBpdHNlbGYuIElmIG5hbWUgaXMgcGFzc2VkLCB0aGUgY2xhc3Mgd2lsbCBiZSByZXRpcmV2ZWQgZnJvbSBmYWNldHNSZWdpc3RyeVxuICogQHBhcmFtIHtPYmplY3R9IGZhY2V0Q29uZmlnIG9wdGlvbmFsIGZhY2V0IGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBmYWNldE5hbWUgb3B0aW9uYWwgZmFjZXQgbmFtZS4gQWxsb3dzIHRvIGFkZCBmYWNldCB1bmRlciBhIG5hbWUgZGlmZmVyZW50IGZyb20gdGhlIGNsYXNzIG5hbWUgc3VwcGxpZWQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHRocm93T25FcnJvcnMgSWYgc2V0IHRvIGZhbHNlLCB0aGVuIGVycm9ycyB3aWxsIG9ubHkgYmUgbG9nZ2VkIHRvIGNvbnNvbGUuIFRydWUgYnkgZGVmYXVsdC5cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGFkZEZhY2V0KGZhY2V0TmFtZU9yQ2xhc3MsIGZhY2V0Q29uZmlnLCBmYWNldE5hbWUsIHRocm93T25FcnJvcnMpIHtcbiAgICBjaGVjayhmYWNldE5hbWVPckNsYXNzLCBNYXRjaC5PbmVPZihTdHJpbmcsIE1hdGNoLlN1YmNsYXNzKENvbXBvbmVudEZhY2V0KSkpO1xuICAgIGNoZWNrKGZhY2V0Q29uZmlnLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKTtcbiAgICBjaGVjayhmYWNldE5hbWUsIE1hdGNoLk9wdGlvbmFsKFN0cmluZykpO1xuXG4gICAgdmFyIEZhY2V0Q2xhc3M7XG4gICAgLy8gaWYgb25seSBuYW1lIHBhc3NlZCwgcmV0cmlldmUgZmFjZXQgY2xhc3MgZnJvbSByZWdpc3RyeVxuICAgIGlmICh0eXBlb2YgZmFjZXROYW1lT3JDbGFzcyA9PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgZmFjZXRDbGFzc05hbWUgPSBfLmZpcnN0VXBwZXJDYXNlKGZhY2V0TmFtZU9yQ2xhc3MpO1xuICAgICAgICBGYWNldENsYXNzID0gZmFjZXRzUmVnaXN0cnkuZ2V0KGZhY2V0Q2xhc3NOYW1lKTtcbiAgICB9IGVsc2UgXG4gICAgICAgIEZhY2V0Q2xhc3MgPSBmYWNldE5hbWVPckNsYXNzO1xuXG4gICAgaWYgKCFmYWNldE5hbWUpXG4gICAgICAgIGZhY2V0TmFtZSA9IF8uZmlyc3RMb3dlckNhc2UoRmFjZXRDbGFzcy5uYW1lKTtcblxuICAgIHRoaXMuZXh0cmFGYWNldHMucHVzaChmYWNldE5hbWUpO1xuXG4gICAgLy8gYWRkIGZhY2V0IHVzaW5nIG1ldGhvZCBvZiBGYWNldGVkT2JqZWN0XG4gICAgdmFyIG5ld0ZhY2V0ID0gRmFjZXRlZE9iamVjdC5wcm90b3R5cGUuYWRkRmFjZXQuY2FsbCh0aGlzLCBGYWNldENsYXNzLCBmYWNldENvbmZpZywgZmFjZXROYW1lLCB0aHJvd09uRXJyb3JzKTtcblxuICAgIC8vIGNoZWNrIGRlcGVuZWRlbmNpZXMgYW5kIHN0YXJ0IGZhY2V0XG4gICAgaWYgKG5ld0ZhY2V0LmNoZWNrKSBuZXdGYWNldC5jaGVjaygpO1xuICAgIGlmIChuZXdGYWNldC5zdGFydCkgbmV3RmFjZXQuc3RhcnQoKTtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2QuXG4gKiBFbnZva2UgZ2l2ZW4gbWV0aG9kIHdpdGggb3B0aW9uYWwgcGFyYW1ldGVycyBvbiBhbGwgZmFjZXRzLlxuICogUmV0dXJucyB0aGUgbWFwIG9mIHZhbHVlcyByZXR1cm5lZCBieSBhbGwgZmFjZXRzLiBJZiB0aGUgZmFjZXQgZG9lc24ndCBoYXZlIHRoZSBtZXRob2QgaXQgaXMgc2ltcGx5IG5vdCBjYWxsZWQgYW5kIHRoZSB2YWx1ZSBpbiB0aGUgbWFwIHdpbGwgYmUgdW5kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXRob2QgbWV0aG9kIG5hbWUgdG8gZW52b2tlIG9uIHRoZSBmYWNldFxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkYWxsRmFjZXRzKG1ldGhvZCkgeyAvLyAsLi4uIGFyZ3VtZW50c1xuICAgIHZhciBhcmdzID0gXy5zbGljZShhcmd1bWVudHMsIDEpO1xuXG4gICAgcmV0dXJuIF8ubWFwS2V5cyh0aGlzLmZhY2V0cywgZnVuY3Rpb24oZmFjZXQsIGZjdE5hbWUpIHtcbiAgICAgICAgaWYgKGZhY2V0ICYmIHR5cGVvZiBmYWNldFttZXRob2RdID09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICByZXR1cm4gZmFjZXRbbWV0aG9kXS5hcHBseShmYWNldCwgYXJncyk7XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogXG4gKiBAcGFyYW0ge1tTdHJpbmddfSBuYW1lIG9wdGlvbmFsIG5ldyBuYW1lIG9mIGNvbXBvbmVudCwgXG4gKiBAcGFyYW0ge1tCb29sZWFuXX0gcmVuYW1lSW5TY29wZSBvcHRpb25hbCBmYWxzZSB0byBub3QgcmVuYW1lIENvbXBvbmVudEluZm8gb2JqZWN0IGluIGl0cyBzY29wZSwgdHJ1ZSBieSBkZWZhdWx0XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRyZW5hbWUobmFtZSwgcmVuYW1lSW5TY29wZSkge1xuICAgIG5hbWUgPSBuYW1lIHx8IG1pbG9Db21wb25lbnROYW1lKCk7XG4gICAgdGhpcy5jb21wb25lbnRJbmZvLnJlbmFtZShuYW1lLCBmYWxzZSk7XG4gICAgU2NvcGUucmVuYW1lKHRoaXMsIG5hbWUsIHJlbmFtZUluU2NvcGUpO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZC5cbiAqIFJlbW92ZXMgY29tcG9uZW50IGZyb20gaXRzIHNjb3BlLlxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcHJlc2VydmVTY29wZVByb3BlcnR5IHRydWUgbm90IHRvIGRlbGV0ZSBzY29wZSBwcm9wZXJ0eSBvZiBjb21wb25lbnRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcXVpZXQgb3B0aW9uYWwgdHJ1ZSB0byBzdXBwcmVzcyB0aGUgd2FybmluZyBtZXNzYWdlIGlmIHRoZSBjb21wb25lbnQgaXMgbm90IGluIHNjb3BlXG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRyZW1vdmUocHJlc2VydmVTY29wZVByb3BlcnR5LCBxdWlldCkge1xuICAgIGlmICh0aGlzLnNjb3BlKSB7XG4gICAgICAgIHRoaXMuc2NvcGUuX3JlbW92ZSh0aGlzLm5hbWUsIHF1aWV0KTtcbiAgICAgICAgaWYgKCEgcHJlc2VydmVTY29wZVByb3BlcnR5KVxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NvcGU7XG4gICAgfVxufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZC5cbiAqIEluc2VydHMgdGhlIGNvbXBvbmVudCBpbnRvIHRoZSBET00gYW5kIGF0dGVtcHRzIHRvIGFkanVzdCB0aGUgc2NvcGUgdHJlZSBhY2NvcmRpbmdseS5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBhcmVudEVsICAgIFRoZSBlbGVtZW50IGludG8gd2hpY2ggdGhlIGNvbXBvbmVudCBzaG91bGQgYmUgaW5zZXJ0ZWQuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByZWZlcmVuY2VFbCAob3B0aW9uYWwpIFRoZSByZWZlcmVuY2UgZWxlbWVudCBpdCBzaG91bGQgYmUgaW5zZXJ0ZWQgYmVmb3JlLlxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkaW5zZXJ0SW50byhwYXJlbnRFbCwgcmVmZXJlbmNlRWwpIHtcbiAgICBwYXJlbnRFbC5pbnNlcnRCZWZvcmUodGhpcy5lbCwgcmVmZXJlbmNlRWwpO1xuICAgIHRoaXMuc2V0U2NvcGVQYXJlbnRGcm9tRE9NKCk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXRyaWV2ZXMgYWxsIGNvbXBvbmVudCBzdGF0ZSwgaW5jbHVkaW5nIGluZm9ybWF0aW9uIGFib3V0IGl0cyBjbGFzcywgZXh0cmEgZmFjZXRzLCBmYWNldHMgZGF0YSBhbmQgYWxsIHNjb3BlIGNoaWxkcmVuLlxuICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHNhdmUvbG9hZCwgY29weS9wYXN0ZSBhbmQgZHJhZy9kcm9wIGNvbXBvbmVudCBcbiAqIFJldHVybnMgY29tcG9uZW50IHN0YXRlXG4gKlxuICogQHRoaXMge0NvbXBvbmVudH0gY29tcG9uZW50IHdoaWNoIHN0YXRlIHdpbGwgYmUgc2F2ZWRcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGdldFN0YXRlKCkge1xuICAgIHRoaXMuYnJvYWRjYXN0KCdnZXRzdGF0ZXN0YXJ0ZWQnLCB7IHJvb3RDb21wb25lbnQ6IHRoaXMgfSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLl9nZXRTdGF0ZSh0cnVlKTtcbiAgICBzdGF0ZS5vdXRlckhUTUwgPSB0aGlzLmVsLm91dGVySFRNTDtcbiAgICBfLmRlZmVyTWV0aG9kKHRoaXMsICdicm9hZGNhc3QnLCAnZ2V0c3RhdGVjb21wbGV0ZWQnLCB7IHJvb3RDb21wb25lbnQ6IHRoaXMgfSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICByZXR1cm4gc3RhdGU7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXRyaWV2ZXMgYWxsIGNvbXBvbmVudCBzdGF0ZSwgaW5jbHVkaW5nIGluZm9ybWF0aW9uIGFib3V0IGl0cyBjbGFzcywgZXh0cmEgZmFjZXRzLCBmYWNldHMgZGF0YSBhbmQgYWxsIHNjb3BlIGNoaWxkcmVuLlxuICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHNhdmUvbG9hZCwgY29weS9wYXN0ZSBhbmQgZHJhZy9kcm9wIGNvbXBvbmVudCBcbiAqIElmIGNvbXBvbmVudCBoYXMgW1RyYW5zZmVyXSguL2NfZmFjZXRzL1RyYW5zZmVyLmpzLmh0bWwpIGZhY2V0IG9uIGl0LCB0aGlzIG1ldGhvZCByZXRyaWV2ZXMgc3RhdGUgZnJvbSB0aGlzIGZhY2V0XG4gKiBSZXR1cm5zIGNvbXBvbmVudCBzdGF0ZVxuICpcbiAqIEB0aGlzIHtDb21wb25lbnR9IGNvbXBvbmVudCB3aGljaCBzdGF0ZSB3aWxsIGJlIHNhdmVkXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBjYW4gYmUgdXNlZCBieSBzdWJjbGFzc2VzLiBcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGdldFRyYW5zZmVyU3RhdGUob3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLnRyYW5zZmVyXG4gICAgICAgICAgICA/IHRoaXMudHJhbnNmZXIuZ2V0U3RhdGUob3B0aW9ucylcbiAgICAgICAgICAgIDogdGhpcy5nZXRTdGF0ZShvcHRpb25zKTtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgdGhlIHN0YXRlIG9mIGNvbXBvbmVudFxuICogVXNlZCBieSBjbGFzcyBtZXRob2QgYENvbXBvbmVudC5nZXRTdGF0ZWAgYW5kIGJ5IFtDb250YWluZXJdKC4vY19mYWNldHMvQ29udGFpbmVyLmpzLmh0bWwpIGZhY2V0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXBTdGF0ZSBmYWxzZSB0byBnZXQgc2hhbGxvdyBzdGF0ZSBmcm9tIGFsbCBmYWNldHMgKHRydWUgYnkgZGVmYXVsdClcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JF9nZXRTdGF0ZShkZWVwU3RhdGUpe1xuXG4gICAgdmFyIGZhY2V0c1N0YXRlcyA9IHRoaXMuYWxsRmFjZXRzKCdnZXRTdGF0ZScsIGRlZXBTdGF0ZSA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWUpO1xuICAgIGZhY2V0c1N0YXRlcyA9IF8uZmlsdGVyS2V5cyhmYWNldHNTdGF0ZXMsIGZ1bmN0aW9uKGZjdFN0YXRlKSB7XG4gICAgICAgIHJldHVybiAhISBmY3RTdGF0ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBOYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgIGNvbXBDbGFzczogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgICBleHRyYUZhY2V0czogdGhpcy5leHRyYUZhY2V0cyxcbiAgICAgICAgZmFjZXRzU3RhdGVzOiBmYWNldHNTdGF0ZXNcbiAgICB9O1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyB0aGUgc3RhdGUgb2YgY29tcG9uZW50LlxuICogVXNlZCBieSBjbGFzcyBtZXRob2QgYENvbXBvbmVudC5jcmVhdGVGcm9tU3RhdGVgIGFuZCBieSBbQ29udGFpbmVyXSguL2NfZmFjZXRzL0NvbnRhaW5lci5qcy5odG1sKSBmYWNldC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIHN0YXRlIHRvIHNldCB0aGUgY29tcG9uZW50XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRzZXRTdGF0ZShzdGF0ZSkge1xuICAgIGlmIChzdGF0ZS5mYWNldHNTdGF0ZXMpXG4gICAgICAgIF8uZWFjaEtleShzdGF0ZS5mYWNldHNTdGF0ZXMsIGZ1bmN0aW9uKGZjdFN0YXRlLCBmY3ROYW1lKSB7XG4gICAgICAgICAgICB2YXIgZmFjZXQgPSB0aGlzW2ZjdE5hbWVdO1xuICAgICAgICAgICAgaWYgKGZhY2V0ICYmIHR5cGVvZiBmYWNldC5zZXRTdGF0ZSA9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgICAgIGZhY2V0LnNldFN0YXRlKGZjdFN0YXRlKTtcbiAgICAgICAgfSwgdGhpcyk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogUmV0dXJucyB0aGUgc2NvcGUgcGFyZW50IG9mIGEgY29tcG9uZW50LlxuICogSWYgYGNvbmRpdGlvbk9yRmFjZXRgIHBhcmFtZXRlciBpcyBub3Qgc3BlY2lmaWVkLCBhbiBpbW1lZGlhdGUgcGFyZW50IHdpbGwgYmUgcmV0dXJuZWQsIG90aGVyd2lzZSB0aGUgY2xvc2VzdCBhbmNlc3RvciB3aXRoIGEgc3BlY2lmaWVkIGZhY2V0IG9yIHBhc3NpbmcgY29uZGl0aW9uIHRlc3QuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IGNvbmRpdGlvbk9yRmFjZXQgb3B0aW9uYWwgY29uZGl0aW9uIHRoYXQgY29tcG9uZW50IHNob3VsZCBwYXNzIChvciBmYWNldCBuYW1lIGl0IHNob3VsZCBjb250YWluKVxuICogQHJldHVybiB7Q29tcG9uZW50fHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGdldFNjb3BlUGFyZW50KGNvbmRpdGlvbk9yRmFjZXQpIHtcbiAgICByZXR1cm4gX2NhbGxHZXRTY29wZVBhcmVudC5jYWxsKHRoaXMsIF9nZXRTY29wZVBhcmVudCwgY29uZGl0aW9uT3JGYWNldCk7XG59XG5cbmZ1bmN0aW9uIF9jYWxsR2V0U2NvcGVQYXJlbnQoX2dldFNjb3BlUGFyZW50RnVuYywgY29uZGl0aW9uT3JGYWNldCkge1xuICAgIGNoZWNrKGNvbmRpdGlvbk9yRmFjZXQsIE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9uZU9mKEZ1bmN0aW9uLCBTdHJpbmcpKSk7XG4gICAgdmFyIGNvbmRpdGlvbkZ1bmMgPSBjb21wb25lbnRVdGlscy5fbWFrZUNvbXBvbmVudENvbmRpdGlvbkZ1bmMoY29uZGl0aW9uT3JGYWNldCk7XG4gICAgcmV0dXJuIF9nZXRTY29wZVBhcmVudEZ1bmMuY2FsbCh0aGlzLCBjb25kaXRpb25GdW5jKTsgICBcbn1cblxuZnVuY3Rpb24gX2dldFNjb3BlUGFyZW50KGNvbmRpdGlvbkZ1bmMpIHtcbiAgICB2YXIgcGFyZW50O1xuICAgIHRyeSB7IHBhcmVudCA9IHRoaXMuc2NvcGUuX2hvc3RPYmplY3Qub3duZXI7IH0gY2F0Y2goZSkge31cblxuICAgIC8vIFdoZXJlIHRoZXJlIGlzIG5vIHBhcmVudCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB1bmRlZmluZWRcbiAgICAvLyBUaGUgcGFyZW50IGNvbXBvbmVudCBpcyBjaGVja2VkIHJlY3Vyc2l2ZWx5XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgICBpZiAoISBjb25kaXRpb25GdW5jIHx8IGNvbmRpdGlvbkZ1bmMocGFyZW50KSApXG4gICAgICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gX2dldFNjb3BlUGFyZW50LmNhbGwocGFyZW50LCBjb25kaXRpb25GdW5jKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHNjb3BlIHBhcmVudCB3aXRoIGEgZ2l2ZW4gY2xhc3MsIHdpdGggc2FtZSBjbGFzcyBpZiBub3Qgc3BlY2lmaWVkXG4gKlxuICogQHBhcmFtIHtbRnVuY3Rpb25dfSBDb21wb25lbnRDbGFzcyBjb21wb25lbnQgY2xhc3MgdGhhdCB0aGUgcGFyZW50IHNob3VsZCBoYXZlLCBzYW1lIGNsYXNzIGJ5IGRlZmF1bHRcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGdldFNjb3BlUGFyZW50V2l0aENsYXNzKENvbXBvbmVudENsYXNzKSB7XG4gICAgQ29tcG9uZW50Q2xhc3MgPSBDb21wb25lbnRDbGFzcyB8fCB0aGlzLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBfZ2V0U2NvcGVQYXJlbnQuY2FsbCh0aGlzLCBmdW5jdGlvbihjb21wKSB7XG4gICAgICAgIHJldHVybiBjb21wIGluc3RhbmNlb2YgQ29tcG9uZW50Q2xhc3M7XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogUmV0dXJucyB0aGUgdG9wbW9zdCBzY29wZSBwYXJlbnQgb2YgYSBjb21wb25lbnQuXG4gKiBJZiBgY29uZGl0aW9uT3JGYWNldGAgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSB0b3Btb3N0IHNjb3BlIHBhcmVudCB3aWxsIGJlIHJldHVybmVkLCBvdGhlcndpc2UgdGhlIHRvcG1vc3QgYW5jZXN0b3Igd2l0aCBhIHNwZWNpZmllZCBmYWNldCBvciBwYXNzaW5nIGNvbmRpdGlvbiB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBjb25kaXRpb25PckZhY2V0IG9wdGlvbmFsIGNvbmRpdGlvbiB0aGF0IGNvbXBvbmVudCBzaG91bGQgcGFzcyAob3IgZmFjZXQgbmFtZSBpdCBzaG91bGQgY29udGFpbilcbiAqIEByZXR1cm4ge0NvbXBvbmVudHx1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRnZXRUb3BTY29wZVBhcmVudChjb25kaXRpb25PckZhY2V0KSB7XG4gICAgcmV0dXJuIF9jYWxsR2V0U2NvcGVQYXJlbnQuY2FsbCh0aGlzLCBfZ2V0VG9wU2NvcGVQYXJlbnQsIGNvbmRpdGlvbk9yRmFjZXQpO1xufVxuXG5mdW5jdGlvbiBfZ2V0VG9wU2NvcGVQYXJlbnQoY29uZGl0aW9uRnVuYykge1xuICAgIHZhciB0b3BQYXJlbnRcbiAgICAgICAgLCBwYXJlbnQgPSB0aGlzO1xuICAgIGRvIHtcbiAgICAgICAgcGFyZW50ID0gX2dldFNjb3BlUGFyZW50LmNhbGwocGFyZW50LCBjb25kaXRpb25GdW5jKTtcbiAgICAgICAgaWYgKHBhcmVudClcbiAgICAgICAgICAgIHRvcFBhcmVudCA9IHBhcmVudDtcbiAgICB9IHdoaWxlIChwYXJlbnQpO1xuXG4gICAgcmV0dXJuIHRvcFBhcmVudDtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgc2NvcGUgcGFyZW50IHdpdGggYSBnaXZlbiBjbGFzcywgd2l0aCBzYW1lIGNsYXNzIGlmIG5vdCBzcGVjaWZpZWRcbiAqXG4gKiBAcGFyYW0ge1tGdW5jdGlvbl19IENvbXBvbmVudENsYXNzIGNvbXBvbmVudCBjbGFzcyB0aGF0IHRoZSBwYXJlbnQgc2hvdWxkIGhhdmUsIHNhbWUgY2xhc3MgYnkgZGVmYXVsdFxuICogQHJldHVybiB7Q29tcG9uZW50fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkZ2V0VG9wU2NvcGVQYXJlbnRXaXRoQ2xhc3MoQ29tcG9uZW50Q2xhc3MpIHtcbiAgICBDb21wb25lbnRDbGFzcyA9IENvbXBvbmVudENsYXNzIHx8IHRoaXMuY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIF9nZXRUb3BTY29wZVBhcmVudC5jYWxsKHRoaXMsIGZ1bmN0aW9uKGNvbXApIHtcbiAgICAgICAgcmV0dXJuIGNvbXAgaW5zdGFuY2VvZiBDb21wb25lbnRDbGFzcztcbiAgICB9KTtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIEZpbmRzIHNjb3BlIHBhcmVudCBvZiBjb21wb25lbnQgdXNpbmcgRE9NIHRyZWUgKHVubGlrZSBnZXRTY29wZVBhcmVudCB0aGF0IHNpbXBseSBnb2VzIHVwIHRoZSBzY29wZSB0cmVlKS5cbiAqIFdoaWxlIGdldFNjb3BlUGFyZW50IGlzIGZhc3RlciBpdCBtYXkgZmFpbCBpZiBzY29wZSBjaGFpbiBpcyBub3Qgc2V0dXAgeWV0IChlLmcuLCB3aGVuIGNvbXBvbmVudCBoYXMgYmVlbiBqdXN0IGluc2VydGVkKS5cbiAqIFRoZSBzY29wZSBwcm9wZXJ0eSBvZiBjb21wb25lbnQgd2lsbCBiZSBjaGFuZ2VkIHRvIHBvaW50IHRvIHNjb3BlIG9iamVjdCBvZiBjb250YWluZXIgZmFjZXQgb2YgdGhhdCBwYXJlbnQuXG4gKiBSZXR1cm5lZCBzY29wZSBwYXJlbnQgb2YgdGhlIGNvbXBvbmVudCB3aWxsIGJlIHVuZGVmaW5lZCAoYXMgd2VsbCBhcyBjb21wb25lbnQncyBzY29wZSBwcm9wZXJ0eSkgaWYgbm8gcGFyZW50IGluIHRoZSBET00gdHJlZSBoYXMgY29udGFpbmVyIGZhY2V0LlxuICogVE9ETyBNZXRob2Qgd2lsbCBub3QgYmluZCBET00gY2hpbGRyZW4gY29ycmVjdGx5IGlmIGNvbXBvbmVudCBoYXMgbm8gY29udGFpbmVyIGZhY2V0LlxuICpcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JHNldFNjb3BlUGFyZW50RnJvbURPTSgpIHtcbiAgICB2YXIgcGFyZW50RWwgPSB0aGlzLmVsLnBhcmVudE5vZGU7XG5cbiAgICB2YXIgcGFyZW50LCBmb3VuZFBhcmVudDtcbiAgICB3aGlsZSAocGFyZW50RWwgJiYgISBmb3VuZFBhcmVudCkge1xuICAgICAgICBwYXJlbnQgPSBDb21wb25lbnQuZ2V0Q29tcG9uZW50KHBhcmVudEVsKTtcbiAgICAgICAgZm91bmRQYXJlbnQgPSBwYXJlbnQgJiYgcGFyZW50LmNvbnRhaW5lcjtcbiAgICAgICAgcGFyZW50RWwgPSBwYXJlbnRFbC5wYXJlbnROb2RlO1xuICAgIH1cblxuICAgIHRoaXMucmVtb3ZlKCk7IC8vIHJlbW92ZSBjb21wb25lbnQgZnJvbSBpdHMgY3VycmVudCBzY29wZSAoaWYgaXQgaXMgZGVmaW5lZClcbiAgICBpZiAoZm91bmRQYXJlbnQpIHtcbiAgICAgICAgdGhpcy5yZW5hbWUodW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgICAgIHBhcmVudC5jb250YWluZXIuc2NvcGUuX2FkZCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9ICAgICAgICBcbn1cblxuXG4vKipcbiAqIFdhbGtzIGNvbXBvbmVudCB0cmVlLCBjYWxsaW5nIHByb3ZpZGVkIGNhbGxiYWNrIG9uIGVhY2ggY29tcG9uZW50XG4gKlxuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcGFyYW0gdGhpc0FyZ1xuICovXG5mdW5jdGlvbiBDb21wb25lbnQkd2Fsa1Njb3BlVHJlZShjYWxsYmFjaywgdGhpc0FyZykge1xuICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdGhpcyk7XG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lcikgcmV0dXJuO1xuICAgIHRoaXMuY29udGFpbmVyLnNjb3BlLl9lYWNoKGZ1bmN0aW9uKGNvbXBvbmVudCkge1xuICAgICAgICBjb21wb25lbnQud2Fsa1Njb3BlVHJlZShjYWxsYmFjaywgdGhpc0FyZyk7XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gQ29tcG9uZW50JHRyZWVQYXRoT2YoY29tcG9uZW50KSB7XG4gICAgcmV0dXJuIGRvbVV0aWxzLnRyZWVQYXRoT2YodGhpcy5lbCwgY29tcG9uZW50LmVsKTtcbn1cblxuXG5mdW5jdGlvbiBDb21wb25lbnQkZ2V0Q29tcG9uZW50QXRUcmVlUGF0aCh0cmVlUGF0aCwgbmVhcmVzdCkge1xuICAgIHZhciBub2RlID0gZG9tVXRpbHMuZ2V0Tm9kZUF0VHJlZVBhdGgodGhpcy5lbCwgdHJlZVBhdGgsIG5lYXJlc3QpO1xuICAgIHJldHVybiBDb21wb25lbnQuZ2V0Q29tcG9uZW50KG5vZGUpO1xufVxuXG5cbmZ1bmN0aW9uIENvbXBvbmVudCRpbnNlcnRBdFRyZWVQYXRoKHRyZWVQYXRoLCBjb21wb25lbnQsIG5lYXJlc3QpIHtcbiAgICB2YXIgd2FzSW5zZXJ0ZWQgPSBkb21VdGlscy5pbnNlcnRBdFRyZWVQYXRoKHRoaXMuZWwsIHRyZWVQYXRoLCBjb21wb25lbnQuZWwpO1xuICAgIGlmICh3YXNJbnNlcnRlZCkgY29tcG9uZW50LnNldFNjb3BlUGFyZW50RnJvbURPTSgpO1xuICAgIHJldHVybiB3YXNJbnNlcnRlZDtcbn1cblxuXG4vKipcbiAqIEJyb2FkY2FzdCBtZXNzYWdlIHRvIGNvbXBvbmVudCBhbmQgdG8gYWxsIGl0cyBzY29wZSBjaGlsZHJlblxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gbXNnIG1lc3NhZ2UgdG8gYmUgc2VudFxuICogQHBhcmFtIHtbQW55XX0gZGF0YSBvcHRpb25hbCBtZXNzYWdlIGRhdGFcbiAqIEBwYXJhbSB7W0Z1bmN0aW9uXX0gY2FsbGJhY2sgb3B0aW9uYWwgY2FsbGJhY2tcbiAqIEBwYXJhbSB7W0Jvb2xlYW5dfSBzeW5jaHJvbm91c2x5IGlmIGl0IHNob3VsZCB1c2UgcG9zdE1lc3NhZ2VTeW5jXG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRicm9hZGNhc3QobXNnLCBkYXRhLCBjYWxsYmFjaywgc3luY2hyb25vdXNseSkge1xuICAgIHZhciBwb3N0TWV0aG9kID0gc3luY2hyb25vdXNseSA/ICdwb3N0TWVzc2FnZVN5bmMnIDogJ3Bvc3RNZXNzYWdlJztcbiAgICB0aGlzLndhbGtTY29wZVRyZWUoZnVuY3Rpb24oY29tcG9uZW50KSB7XG4gICAgICAgIGNvbXBvbmVudFtwb3N0TWV0aG9kXShtc2csIGRhdGEsIGNhbGxiYWNrKTtcbiAgICB9KTtcbn1cblxuXG4vKipcbiAqIERlc3Ryb3kgY29tcG9uZW50OiByZW1vdmVzIGNvbXBvbmVudCBmcm9tIERPTSwgcmVtb3ZlcyBpdCBmcm9tIHNjb3BlLCBkZWxldGVzIGFsbCByZWZlcmVuY2VzIHRvIERPTSBub2RlcyBhbmQgdW5zdWJzY3JpYmVzIGZyb20gYWxsIG1lc3NhZ2VzIGJvdGggY29tcG9uZW50IGFuZCBhbGwgZmFjZXRzXG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRkZXN0cm95KHF1aWV0KSB7XG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkge1xuICAgICAgICBpZiAoIXF1aWV0KSBsb2dnZXIud2FybignQ29tcG9uZW50IGRlc3Ryb3k6IGNvbXBvbmVudCBpcyBhbHJlYWR5IGRlc3Ryb3llZCcpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlKGZhbHNlLCBxdWlldCk7XG4gICAgdGhpcy5hbGxGYWNldHMoJ2Rlc3Ryb3knKTtcbiAgICB0aGlzW01FU1NFTkdFUl9QUk9QRVJUWV0uZGVzdHJveSgpO1xuICAgIGlmICh0aGlzLmVsKSB7XG4gICAgICAgIGRvbVV0aWxzLmRldGFjaENvbXBvbmVudCh0aGlzLmVsKTtcbiAgICAgICAgZG9tVXRpbHMucmVtb3ZlRWxlbWVudCh0aGlzLmVsKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuZWw7XG4gICAgfVxuICAgIHRoaXMuY29tcG9uZW50SW5mby5kZXN0cm95KCk7XG4gICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBjb21wb25lbnQgd2FzIGRlc3Ryb3llZFxuICpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRpc0Rlc3Ryb3llZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVzdHJveWVkO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIGBtaWxvLkNvbXBvbmVudC5GYWNldGBcbiAqXG4gKiBUaGUgY2xhc3MgZm90IHRoZSBmYWNldCBvZiBjb21wb25lbnQuIFdoZW4gYSBjb21wb25lbnQgaXMgY3JlYXRlZCwgaXRcbiAqIGNyZWF0ZXMgYWxsIGl0cyBmYWNldHMuXG4gKlxuICogU2VlIEZhY2V0cyBzZWN0aW9uIG9uIGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZSBmYWNldHMgYW5kIG9uXG4gKiBob3cgdG8gY3JlYXRlIG5ldyBmYWNldHMgY2xhc3Nlcy5cbiAqXG4gKiAtIENvbXBvbmVudCAtIGJhc2ljIGNvbXBwb25lbnQgY2xhc3NcbiAqIC0gQ29tcG9uZW50RmFjZXQgLSBiYXNpY1xuICovXG5cbnZhciBGYWNldCA9IHJlcXVpcmUoJy4uL2Fic3RyYWN0L2ZhY2V0JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlciA9IG1pbG9Db3JlLk1lc3NlbmdlclxuICAgICwgY29tcG9uZW50VXRpbHMgPSByZXF1aXJlKCcuL2NfdXRpbHMnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG52YXIgQ29tcG9uZW50RmFjZXQgPSBfLmNyZWF0ZVN1YmNsYXNzKEZhY2V0LCAnQ29tcG9uZW50RmFjZXQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBDb21wb25lbnRGYWNldDtcblxuXG4vKipcbiAqIHBvc3REb21QYXJlbnRcbiAqXG4gKiBJZiBmYWNldCBoYXMgRE9NIHBhcmVudCBmYWNldCAoc2VlIGBkb21QYXJlbnRgIG1ldGhvZCksIHBvc3RzIHRoZSBtZXNzYWdlIHRvIHRoaXMgZmFjZXQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VUeXBlXG4gKiBAcGFyYW0ge09iamVjdH0gbWVzc2FnZURhdGFcbiAqL1xudmFyIHBvc3REb21QYXJlbnQgPSBfLnBhcnRpYWwoX3Bvc3RQYXJlbnQsIGRvbVBhcmVudCk7XG5cbi8qKlxuICogcG9zdFNjb3BlUGFyZW50XG4gKlxuICogSWYgZmFjZXQgaGFzIHNjb3BlIHBhcmVudCBmYWNldCAoc2VlIGBzY29wZVBhcmVudGAgbWV0aG9kKSwgcG9zdHMgdGhlIG1lc3NhZ2UgdG8gdGhpcyBmYWNldC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVR5cGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtZXNzYWdlRGF0YVxuICovXG52YXIgcG9zdFNjb3BlUGFyZW50ID0gXy5wYXJ0aWFsKF9wb3N0UGFyZW50LCBzY29wZVBhcmVudCk7XG5cblxuXy5leHRlbmRQcm90byhDb21wb25lbnRGYWNldCwge1xuICAgIGluaXQ6IENvbXBvbmVudEZhY2V0JGluaXQsXG4gICAgc3RhcnQ6IENvbXBvbmVudEZhY2V0JHN0YXJ0LFxuICAgIGNoZWNrOiBDb21wb25lbnRGYWNldCRjaGVjayxcbiAgICBkZXN0cm95OiBDb21wb25lbnRGYWNldCRkZXN0cm95LFxuICAgIG9uQ29uZmlnTWVzc2FnZXM6IENvbXBvbmVudEZhY2V0JG9uQ29uZmlnTWVzc2FnZXMsXG4gICAgZG9tUGFyZW50OiBkb21QYXJlbnQsXG4gICAgcG9zdERvbVBhcmVudDogcG9zdERvbVBhcmVudCxcbiAgICBzY29wZVBhcmVudDogc2NvcGVQYXJlbnQsXG4gICAgcG9zdFNjb3BlUGFyZW50OiBwb3N0U2NvcGVQYXJlbnQsXG4gICAgZ2V0TWVzc2FnZVNvdXJjZTogZ2V0TWVzc2FnZVNvdXJjZSxcbiAgICBkaXNwYXRjaFNvdXJjZU1lc3NhZ2U6IGRpc3BhdGNoU291cmNlTWVzc2FnZSxcbiAgICBfY3JlYXRlTWVzc2VuZ2VyOiBfY3JlYXRlTWVzc2VuZ2VyLFxuICAgIF9zZXRNZXNzYWdlU291cmNlOiBfc2V0TWVzc2FnZVNvdXJjZSxcbiAgICBfY3JlYXRlTWVzc2FnZVNvdXJjZTogX2NyZWF0ZU1lc3NhZ2VTb3VyY2UsXG4gICAgX2NyZWF0ZU1lc3NhZ2VTb3VyY2VXaXRoQVBJOiBfY3JlYXRlTWVzc2FnZVNvdXJjZVdpdGhBUElcbn0pO1xuXG5fLmV4dGVuZChDb21wb25lbnRGYWNldCwge1xuICAgIHJlcXVpcmVzRmFjZXQ6IHJlcXVpcmVzRmFjZXRcbn0pO1xuXG5cbi8qKlxuICogRXhwb3NlIE1lc3NlbmdlciBtZXRob2RzIG9uIEZhY2V0IHByb3RvdHlwZVxuICovXG52YXIgTUVTU0VOR0VSX1BST1BFUlRZID0gJ19tZXNzZW5nZXInO1xuTWVzc2VuZ2VyLnVzZVdpdGgoQ29tcG9uZW50RmFjZXQsIE1FU1NFTkdFUl9QUk9QRVJUWSwgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcblxuXG4vLyBpbml0Q29tcG9uZW50RmFjZXRcbmZ1bmN0aW9uIENvbXBvbmVudEZhY2V0JGluaXQoKSB7XG4gICAgdGhpcy5fY3JlYXRlTWVzc2VuZ2VyKCk7XG59XG5cblxuLy8gc29tZSBzdWJjbGFzc2VzIChlLmcuIE1vZGVsRmFjZXQpIG92ZXJycmlkZSB0aGlzIG1ldGhvZCBhbmQgZG8gbm90IGNyZWF0ZSB0aGVpciBvd24gbWVzc2VuZ2VyXG5mdW5jdGlvbiBfY3JlYXRlTWVzc2VuZ2VyKCl7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBNRVNTRU5HRVJfUFJPUEVSVFksIG5ldyBNZXNzZW5nZXIodGhpcykpO1xufVxuXG5cbi8vIHN0YXJ0Q29tcG9uZW50RmFjZXRcbmZ1bmN0aW9uIENvbXBvbmVudEZhY2V0JHN0YXJ0KCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5tZXNzYWdlcylcbiAgICAgICAgdGhpcy5vbkNvbmZpZ01lc3NhZ2VzKHRoaXMuY29uZmlnLm1lc3NhZ2VzKTtcbn1cblxuXG5mdW5jdGlvbiBDb21wb25lbnRGYWNldCRvbkNvbmZpZ01lc3NhZ2VzKG1lc3NhZ2VTdWJzY3JpYmVycykge1xuICAgIHZhciBub3RZZXRSZWdpc3RlcmVkTWFwID0gXy5tYXBLZXlzKG1lc3NhZ2VTdWJzY3JpYmVycywgZnVuY3Rpb24oc3Vic2NyaWJlciwgbWVzc2FnZXMpIHtcbiAgICAgICAgdmFyIHN1YnNjcmliZXJUeXBlID0gdHlwZW9mIHN1YnNjcmliZXI7XG4gICAgICAgIGlmIChzdWJzY3JpYmVyVHlwZSA9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMub24obWVzc2FnZXMsIHN1YnNjcmliZXIpO1xuXG4gICAgICAgIGlmIChzdWJzY3JpYmVyVHlwZSA9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdmFyIGNvbnRleHRUeXBlID0gdHlwZW9mIHN1YnNjcmliZXIuY29udGV4dDtcbiAgICAgICAgICAgIGlmIChjb250ZXh0VHlwZSA9PSAnb2JqZWN0JylcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vbihtZXNzYWdlcywgc3Vic2NyaWJlcik7XG5cbiAgICAgICAgICAgIGlmIChjb250ZXh0VHlwZSA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGlmIChzdWJzY3JpYmVyLmNvbnRleHQgPT0gdGhpcy5uYW1lIHx8IHN1YnNjcmliZXIuY29udGV4dCA9PSAnZmFjZXQnKVxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcjogc3Vic2NyaWJlci5zdWJzY3JpYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogdGhpc1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN1YnNjcmliZXIuY29udGV4dCA9PSAnb3duZXInKVxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcjogc3Vic2NyaWJlci5zdWJzY3JpYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogdGhpcy5vd25lclxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHN1YnNjcmliZXIgY29udGV4dCBpbiBjb25maWd1cmF0aW9uOiAnICsgc3Vic2NyaWJlci5jb250ZXh0KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9uKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHN1YnNjcmliZXIgY29udGV4dCB0eXBlIGluIGNvbmZpZ3VyYXRpb246ICcgKyBjb250ZXh0VHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gc3Vic2NyaWJlciB0eXBlIGluIGNvbmZpZ3VyYXRpb246ICcgKyBzdWJzY3JpYmVyVHlwZSk7XG4gICAgfSwgdGhpcyk7XG5cbiAgICByZXR1cm4gbm90WWV0UmVnaXN0ZXJlZE1hcDtcbn1cblxuXG4vLyBjaGVja0RlcGVuZGVuY2llc1xuZnVuY3Rpb24gQ29tcG9uZW50RmFjZXQkY2hlY2soKSB7XG4gICAgaWYgKHRoaXMucmVxdWlyZSkge1xuICAgICAgICB0aGlzLnJlcXVpcmUuZm9yRWFjaChmdW5jdGlvbihyZXFGYWNldCkge1xuICAgICAgICAgICAgaWYgKCEgdGhpcy5vd25lci5oYXNGYWNldChyZXFGYWNldCkpXG4gICAgICAgICAgICAgICAgdGhpcy5vd25lci5hZGRGYWNldChyZXFGYWNldCk7XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH1cbn1cblxuXG4vLyBkZXN0cm95cyBmYWNldFxuZnVuY3Rpb24gQ29tcG9uZW50RmFjZXQkZGVzdHJveSgpIHtcbiAgICBpZiAodGhpc1tNRVNTRU5HRVJfUFJPUEVSVFldKSB0aGlzW01FU1NFTkdFUl9QUk9QRVJUWV0uZGVzdHJveSgpO1xuICAgIHRoaXMuX2Rlc3Ryb3llZCA9IHRydWU7XG59XG5cblxuLyoqXG4gKiBkb21QYXJlbnRcbiAqXG4gKiBAcmV0dXJuIHtDb21wb25lbnRGYWNldH0gcmVmZXJlbmNlIHRvIHRoZSBmYWNldCBvZiB0aGUgc2FtZSBjbGFzcyBvZiB0aGUgY2xvc2VzdCBwYXJlbnQgRE9NIGVsZW1lbnQsIHRoYXQgaGFzIGEgY29tcG9uZW50IHdpdGggdGhlIHNhbWUgZmFjZXQgY2xhc3MgYXR0YWNoZWQgdG8gaXQuIElmIHN1Y2ggZWxlbWVudCBkb2Vzbid0IGV4aXN0IG1ldGhvZCB3aWxsIHJldHVybiB1bmRlZmluZWQuXG4gKi9cbmZ1bmN0aW9uIGRvbVBhcmVudCgpIHtcbiAgICB2YXIgcGFyZW50Q29tcG9uZW50ID0gY29tcG9uZW50VXRpbHMuZ2V0Q29udGFpbmluZ0NvbXBvbmVudCh0aGlzLm93bmVyLmVsLCBmYWxzZSwgdGhpcy5uYW1lKTtcbiAgICByZXR1cm4gcGFyZW50Q29tcG9uZW50ICYmIHBhcmVudENvbXBvbmVudFt0aGlzLm5hbWVdO1xufVxuXG5cbi8qKlxuICogc2NvcGVQYXJlbnRcbiAqXG4gKiBAcmV0dXJuIHtDb21wb25lbnRGYWNldH0gcmVmZXJlbmNlIHRvIHRoZSBmYWNldCBvZiB0aGUgc2FtZSBjbGFzcyBhcyBgdGhpc2AgZmFjZXQgb2YgdGhlIGNsb3Nlc3Qgc2NvcGUgcGFyZW50IChpLmUuLCB0aGUgY29tcG9uZW50IHRoYXQgaGFzIHRoZSBzY29wZSBvZiB0aGUgY3VycmVudCBjb21wb25lbnQgaW4gaXRzIGNvbnRhaW5lciBmYWNldCkuXG4gKi9cbmZ1bmN0aW9uIHNjb3BlUGFyZW50KCkge1xuICAgIHZhciBwYXJlbnRDb21wb25lbnQgPSB0aGlzLm93bmVyLmdldFNjb3BlUGFyZW50KHRoaXMubmFtZSk7XG4gICAgcmV0dXJuIHBhcmVudENvbXBvbmVudCAmJiBwYXJlbnRDb21wb25lbnRbdGhpcy5uYW1lXTtcbn1cblxuXG5mdW5jdGlvbiBfcG9zdFBhcmVudChnZXRQYXJlbnRNZXRob2QsIG1lc3NhZ2VUeXBlLCBtZXNzYWdlRGF0YSkge1xuICAgIHZhciBwYXJlbnRGYWNldCA9IGdldFBhcmVudE1ldGhvZC5jYWxsKHRoaXMpO1xuICAgIGlmIChwYXJlbnRGYWNldClcbiAgICAgICAgcGFyZW50RmFjZXQucG9zdE1lc3NhZ2UobWVzc2FnZVR5cGUsIG1lc3NhZ2VEYXRhKTtcbn1cblxuXG5mdW5jdGlvbiBfc2V0TWVzc2FnZVNvdXJjZShtZXNzYWdlU291cmNlKSB7XG4gICAgdGhpc1tNRVNTRU5HRVJfUFJPUEVSVFldLl9zZXRNZXNzYWdlU291cmNlKG1lc3NhZ2VTb3VyY2UpO1xufVxuXG5cbmZ1bmN0aW9uIGdldE1lc3NhZ2VTb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXNbTUVTU0VOR0VSX1BST1BFUlRZXS5nZXRNZXNzYWdlU291cmNlKCk7XG59XG5cblxuZnVuY3Rpb24gZGlzcGF0Y2hTb3VyY2VNZXNzYWdlKG1lc3NhZ2UsIGRhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRNZXNzYWdlU291cmNlKCkuZGlzcGF0Y2hNZXNzYWdlKG1lc3NhZ2UsIGRhdGEpO1xufVxuXG5cbmZ1bmN0aW9uIF9jcmVhdGVNZXNzYWdlU291cmNlKE1lc3NhZ2VTb3VyY2VDbGFzcywgb3B0aW9ucykge1xuICAgIHZhciBtZXNzYWdlU291cmNlID0gbmV3IE1lc3NhZ2VTb3VyY2VDbGFzcyh0aGlzLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdGhpcy5vd25lciwgb3B0aW9ucyk7XG4gICAgdGhpcy5fc2V0TWVzc2FnZVNvdXJjZShtZXNzYWdlU291cmNlKVxuXG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX21lc3NhZ2VTb3VyY2UnLCBtZXNzYWdlU291cmNlKTtcbn1cblxuXG5mdW5jdGlvbiBfY3JlYXRlTWVzc2FnZVNvdXJjZVdpdGhBUEkoTWVzc2FnZVNvdXJjZUNsYXNzLCBtZXNzZW5nZXJBUElPckNsYXNzLCBvcHRpb25zKSB7XG4gICAgdmFyIG1lc3NhZ2VTb3VyY2UgPSBuZXcgTWVzc2FnZVNvdXJjZUNsYXNzKHRoaXMsIHVuZGVmaW5lZCwgbWVzc2VuZ2VyQVBJT3JDbGFzcywgdGhpcy5vd25lciwgb3B0aW9ucyk7XG4gICAgdGhpcy5fc2V0TWVzc2FnZVNvdXJjZShtZXNzYWdlU291cmNlKVxuXG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX21lc3NhZ2VTb3VyY2UnLCBtZXNzYWdlU291cmNlKTtcbn1cblxuXG5mdW5jdGlvbiByZXF1aXJlc0ZhY2V0KGZhY2V0TmFtZSkge1xuICAgIC8vICd0aGlzJyByZWZlcnMgdG8gdGhlIEZhY2V0IENsYXNzXG4gICAgdmFyIGZhY2V0UmVxdWlyZSA9IHRoaXMucHJvdG90eXBlLnJlcXVpcmU7XG5cbiAgICByZXR1cm4gZmFjZXRSZXF1aXJlICYmIChmYWNldFJlcXVpcmUuaW5kZXhPZihfLmZpcnN0VXBwZXJDYXNlKGZhY2V0TmFtZSkpID49IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGZhY2V0UmVxdWlyZS5pbmRleE9mKF8uZmlyc3RMb3dlckNhc2UoZmFjZXROYW1lKSkgPj0gMCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBtaWxvQmluZGVyID0gcmVxdWlyZSgnLi4vLi4vYmluZGVyJylcbiAgICAsIFNjb3BlID0gcmVxdWlyZSgnLi4vc2NvcGUnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIGRvbVV0aWxzID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kb20nKTtcblxuXG4vKipcbiAqIGBtaWxvLnJlZ2lzdHJ5LmZhY2V0cy5nZXQoJ0NvbnRhaW5lcicpYFxuICogQSBzcGVjaWFsIGNvbXBvbmVudCBmYWNldCB0aGF0IG1ha2VzIGNvbXBvbmVudCBjcmVhdGUgaXRzIG93biBpbm5lciBzY29wZS5cbiAqIFdoZW4gW21pbG8uYmluZGVyXSguLi8uLi9iaW5kZXIuanMuaHRtbCkgYmluZHMgRE9NIHRyZWUgYW5kIGNyZWF0ZXMgY29tcG9uZW50cywgaWYgY29tcG9uZW50cyBhcmUgaW5zaWRlIGNvbXBvbmVudCBXSVRIIENvbnRhaW5lciBmYWNldCwgdGhleSBhcmUgcHV0IG9uIHRoZSBgc2NvcGVgIG9mIGl0IChjb21wb25lbnQuY29udGFpbmVyLnNjb3BlIC0gc2VlIFtTY29wZV0oLi4vc2NvcGUuanMuaHRtbCkpLCBvdGhlcndpc2UgdGhleSBhcmUgcHV0IG9uIHRoZSBzYW1lIHNjb3BlIGV2ZW4gdGhvdWdoIHRoZXkgbWF5IGJlIGRlZXBlciBpbiBET00gdHJlZS5cbiAqIEl0IGFsbG93cyBjcmVhdGluZyBuYW1lc3BhY2VzIGF2b2lkaW5nIGNvbXBvbmVudHMgbmFtZXMgY29uZmxpY3RzLCBhdCB0aGUgc2FtZSB0aW1lIGNyZWF0aW5nIG1vcmUgc2hhbGxvdyBjb21wb25lbnRzIHRyZWUgdGhhbiB0aGUgRE9NIHRyZWUuXG4gKiBUbyBjcmVhdGUgY29tcG9uZW50cyBmb3IgZWxlbWVudHMgaW5zaWRlIHRoZSBjdXJyZW50IGNvbXBvbmVudCB1c2U6XG4gKiBgYGBcbiAqIGNvbXBvbmVudC5jb250YWluZXIuYmluZGVyKCk7XG4gKiBgYGBcbiAqIFNlZSBbbWlsby5iaW5kZXJdKC4uLy4uL2JpbmRlci5qcy5odG1sKVxuICovXG52YXIgQ29udGFpbmVyID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0NvbnRhaW5lcicpO1xuXG5cbi8qKlxuICogIyMjI0NvbnRhaW5lciBmYWNldCBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2JpbmRlcl0oI0NvbnRhaW5lciRiaW5kZXIpIC0gY3JlYXRlIGNvbXBvbmVudHMgZnJvbSBET00gaW5zaWRlIHRoZSBjdXJyZW50IG9uZVxuICovXG5fLmV4dGVuZFByb3RvKENvbnRhaW5lciwge1xuICAgIHN0YXJ0OiBDb250YWluZXIkc3RhcnQsXG4gICAgcGF0aDogQ29udGFpbmVyJHBhdGgsXG4gICAgZ2V0U3RhdGU6IENvbnRhaW5lciRnZXRTdGF0ZSxcbiAgICBzZXRTdGF0ZTogQ29udGFpbmVyJHNldFN0YXRlLFxuICAgIGJpbmRlcjogQ29udGFpbmVyJGJpbmRlcixcbiAgICBkZXN0cm95OiBDb250YWluZXIkZGVzdHJveSxcbiAgICB1bndyYXA6IENvbnRhaW5lciR1bndyYXAsXG5cbiAgICBhcHBlbmQ6IENvbnRhaW5lciRhcHBlbmQsXG4gICAgaW5zZXJ0QmVmb3JlOiBDb250YWluZXIkaW5zZXJ0QmVmb3JlLFxuICAgIHJlbW92ZTogQ29udGFpbmVyJHJlbW92ZVxufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChDb250YWluZXIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbnRhaW5lcjtcblxuXG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2QuXG4gKiBTY2FucyBET00sIGNyZWF0ZXMgY29tcG9uZW50cyBhbmQgYWRkcyB0byBzY29wZSBjaGlsZHJlbiBvZiBjb21wb25lbnQgZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gQ29udGFpbmVyJGJpbmRlcigpIHtcbiAgICByZXR1cm4gbWlsb0JpbmRlcih0aGlzLm93bmVyLmVsLCB0aGlzLnNjb3BlLCBmYWxzZSk7XG59XG5cblxuLyoqXG4gKiBDb250YWluZXIgaW5zdGFuY2UgbWV0aG9kLlxuICogU2V0dXAgZW1wdHkgc2NvcGUgb2JqZWN0IG9uIHN0YXJ0XG4gKi9cbmZ1bmN0aW9uIENvbnRhaW5lciRzdGFydCgpIHtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuc3RhcnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLnNjb3BlID0gbmV3IFNjb3BlKHRoaXMub3duZXIuZWwsIHRoaXMpO1xufVxuXG5cbnZhciBhbGxvd2VkTmFtZVBhdHRlcm4gPSAvXltBLVphLXpdW0EtWmEtejAtOVxcX1xcJF0qJC87XG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2QuXG4gKiBTYWZlbHkgdHJhdmVyc2VzIGNvbXBvbmVudCBzY29wZVxuICogUmV0dXJucyBjb21wb25lbnQgaW4gc2NvcGUgZm9yIGEgZ2l2ZW4gcGF0aFxuICogSWYgcGF0aCBpcyBpbnZhbGlkIHRoZSBtZXRob2Qgd2lsbCB0aHJvdywgaWYgdGhlcmUgaXMgbm8gY29tcG9uZW50IGF0IGEgZ2l2ZW4gcGF0aCBvciBzb21lIG9mIHRoZSBjb21wb25lbnRzIGFsb25nIHRoZSBwYXRoIGRvZXMgbm90IGhhdmUgQ29udGFpbmVyIGZhY2V0IHRoZSBtZXRob2Qgd2lsbCByZXR1cm4gdW5kZWZpbmVkLCBcbiAqIFxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGggcGF0aCBvZiBjaGlsZCBjb21wb25lbnQgaW4gc2NvcGUsIGVhY2ggbmFtZSBzaG91bGQgYmUgcHJlZml4ZWQgd2l0aCAnLicsIGUuZy46ICcuY2hpbGQuc3ViY2hpbGQnXG4gKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gKi9cbmZ1bmN0aW9uIENvbnRhaW5lciRwYXRoKHBhdGgpIHtcbiAgICBwYXRoID0gcGF0aC5zcGxpdCgnLicpO1xuICAgIHZhciBsZW4gPSBwYXRoLmxlbmd0aDtcbiAgICBpZiAocGF0aFswXSB8fCBsZW4gPCAyKSB0aHJvd0ludmFsaWRQYXRoKCk7XG4gICAgdmFyIGNvbXAgPSB0aGlzLm93bmVyO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIG5hbWUgPSBwYXRoW2ldO1xuICAgICAgICBpZiAoIWFsbG93ZWROYW1lUGF0dGVybi50ZXN0KG5hbWUpKSB0aHJvd0ludmFsaWRQYXRoKCk7XG4gICAgICAgIGlmICghY29tcC5jb250YWluZXIpIHJldHVybjtcbiAgICAgICAgY29tcCA9IGNvbXAuY29udGFpbmVyLnNjb3BlW25hbWVdO1xuICAgICAgICBpZiAoIWNvbXApIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXA7XG5cbiAgICBmdW5jdGlvbiB0aHJvd0ludmFsaWRQYXRoKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhdGggJyArIHBhdGggKyAnIGlzIGludmFsaWQnKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBDb250YWluZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBDYWxsZWQgYnkgYENvbXBvbmVudC5wcm90b3R5cGUuZ2V0U3RhdGVgIHRvIGdldCBmYWNldCdzIHN0YXRlXG4gKiBSZXR1cm5zIHRoZSBzdGF0ZSBvZiBjb21wb25lbnRzIGluIHRoZSBzY29wZVxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVlcENvcHkgdHJ1ZSBieSBkZWZhdWx0XG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIENvbnRhaW5lciRnZXRTdGF0ZShkZWVwQ29weSkge1xuICAgIHZhciBzdGF0ZSA9IHsgc2NvcGU6IHt9IH07XG4gICAgaWYgKGRlZXBDb3B5ICE9PSBmYWxzZSlcbiAgICAgICAgdGhpcy5zY29wZS5fZWFjaChmdW5jdGlvbihjb21wb25lbnQsIGNvbXBOYW1lKSB7XG4gICAgICAgICAgICBzdGF0ZS5zY29wZVtjb21wTmFtZV0gPSBjb21wb25lbnQuX2dldFN0YXRlKCk7XG4gICAgICAgIH0pO1xuICAgIHJldHVybiBzdGF0ZTtcbn1cblxuXG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2RcbiAqIENhbGxlZCBieSBgQ29tcG9uZW50LnByb3RvdHlwZS5zZXRTdGF0ZWAgdG8gc2V0IGZhY2V0J3Mgc3RhdGVcbiAqIFNldHMgdGhlIHN0YXRlIG9mIGNvbXBvbmVudHMgaW4gdGhlIHNjb3BlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgZGF0YSB0byBzZXQgb24gZmFjZXQncyBtb2RlbFxuICovXG5mdW5jdGlvbiBDb250YWluZXIkc2V0U3RhdGUoc3RhdGUpIHtcbiAgICBfLmVhY2hLZXkoc3RhdGUuc2NvcGUsIGZ1bmN0aW9uKGNvbXBEYXRhLCBjb21wTmFtZSkge1xuICAgICAgICB2YXIgY29tcG9uZW50ID0gdGhpcy5zY29wZVtjb21wTmFtZV07XG4gICAgICAgIGlmIChjb21wb25lbnQpXG4gICAgICAgICAgICBjb21wb25lbnQuc2V0U3RhdGUoY29tcERhdGEpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsb2dnZXIud2FybignY29tcG9uZW50IFwiJyArIGNvbXBOYW1lICsgJ1wiIGRvZXMgbm90IGV4aXN0IG9uIHNjb3BlJyk7XG4gICAgfSwgdGhpcyk7XG59XG5cbmZ1bmN0aW9uIENvbnRhaW5lciRkZXN0cm95KCkge1xuICAgIHRoaXMuc2NvcGUuX2VhY2goZnVuY3Rpb24oY29tcG9uZW50KSB7XG4gICAgICAgIGNvbXBvbmVudC5kZXN0cm95KCk7XG4gICAgfSk7XG4gICAgdGhpcy5zY29wZS5fZGV0YWNoRWxlbWVudCgpO1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiBDb250YWluZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBNb3ZlcyBhbGwgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBvd25lciBpbnRvIHRoZSBwYXJlbnQgc2NvcGVcbiAqIFxuICogQHBhcmFtIHtCb29sZWFufSByZW5hbWVDaGlsZHJlbiBwYXNzIGZhbHNlIHRvIG5vdCByZW5hbWUgc2NvcGUgY2hpbGRyZW4gKGRlZmF1bHQgaXMgdHJ1ZSlcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVzdHJveSBJZiBub3QgZmFsc2UsIHRoZSBjb21wb25lbnQgd2lsbCBiZSBkZXN0cm95ZWQgYXQgdGhlIGVuZCAoZGVmYXVsdCBpcyB0cnVlKS5cbiAqL1xuZnVuY3Rpb24gQ29udGFpbmVyJHVud3JhcChyZW5hbWVDaGlsZHJlbiwgZGVzdHJveSkge1xuICAgIGRvbVV0aWxzLnVud3JhcEVsZW1lbnQodGhpcy5vd25lci5lbCk7XG4gICAgdGhpcy5zY29wZSAmJiB0aGlzLnNjb3BlLl9lYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBjaGlsZC5yZW1vdmUoKTtcbiAgICAgICAgaWYgKHJlbmFtZUNoaWxkcmVuICE9PSBmYWxzZSkgY2hpbGQucmVuYW1lKHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgICAgICB0aGlzLm93bmVyLnNjb3BlICYmIHRoaXMub3duZXIuc2NvcGUuX2FkZChjaGlsZCk7XG4gICAgfSwgdGhpcyk7XG4gICAgaWYgKGRlc3Ryb3kgIT09IGZhbHNlKSB0aGlzLm93bmVyLmRlc3Ryb3koKTtcbn1cblxuXG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2RcbiAqIEFwcGVuZCBjb21wb25lbnQgdG8gRE9NIGFuZCB0byBzY29wZVxuICogQHBhcmFtIHtDb21wb25lbnR9IGNvbXAgY29tcG9uZW50IHRoYXQgd2lsbCBiZSBhcHBlbmRlZFxuICovXG5mdW5jdGlvbiBDb250YWluZXIkYXBwZW5kKGNvbXApIHtcbiAgICB0aGlzLnNjb3BlLl9hZGQoY29tcCk7XG4gICAgdGhpcy5vd25lci5lbC5hcHBlbmRDaGlsZChjb21wLmVsKTtcbn1cblxuXG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2RcbiAqIEluc2VydCBjb21wb25lbnQgdG8gRE9NIGFuZCB0byBzY29wZSBiZWZvcmUgYW5vdGhlciBjb21wb25lbnRcbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wIGNvbXBvbmVudCB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWRcbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBzaWJsaW5nIGNvbXBvbmVudCBiZWZvcmUgd2hpY2ggY29tcG9uZW50IHdpbGwgYmUgYXBwZW5kZWRcbiAqL1xuZnVuY3Rpb24gQ29udGFpbmVyJGluc2VydEJlZm9yZShjb21wLCBzaWJsaW5nKSB7XG4gICAgdGhpcy5zY29wZS5fYWRkKGNvbXApO1xuICAgIHRoaXMuZWwuaW5zZXJ0QmVmb3JlKGNvbXAuZWwsIHNpYmxpbmcgJiYgc2libGluZy5lbCk7XG59XG5cbmZ1bmN0aW9uIENvbnRhaW5lciRyZW1vdmUoY29tcCkge1xuICAgIHRoaXMuc2NvcGUuX3JlbW92ZShjb21wKTtcbiAgICB0aGlzLm93bmVyLmVsLnJlbW92ZUNoaWxkKGNvbXAuZWwpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWl4aW4gPSBtaWxvQ29yZS5jbGFzc2VzLk1peGluXG4gICAgLCBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcblxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyXG4gICAgLCBET01FdmVudHNTb3VyY2UgPSByZXF1aXJlKCcuLi9tc2dfc3JjL2RvbV9ldmVudHMnKVxuICAgICwgRGF0YU1zZ0FQSSA9IHJlcXVpcmUoJy4uL21zZ19hcGkvZGF0YScpXG4gICAgLCBnZXRFbGVtZW50RGF0YUFjY2VzcyA9IHJlcXVpcmUoJy4uL21zZ19hcGkvZGVfZGF0YScpXG4gICAgLCBNb2RlbCA9IG1pbG9Db3JlLk1vZGVsXG4gICAgLCBwYXRoVXRpbHMgPSBNb2RlbC5fdXRpbHMucGF0aFxuICAgICwgbW9kZWxVdGlscyA9IE1vZGVsLl91dGlscy5tb2RlbFxuICAgICwgY2hhbmdlRGF0YUhhbmRsZXIgPSBNb2RlbC5fdXRpbHMuY2hhbmdlRGF0YUhhbmRsZXJcbiAgICAsIGdldFRyYW5zYWN0aW9uRmxhZyA9IGNoYW5nZURhdGFIYW5kbGVyLmdldFRyYW5zYWN0aW9uRmxhZ1xuICAgICwgc2V0VHJhbnNhY3Rpb25GbGFnID0gY2hhbmdlRGF0YUhhbmRsZXIuc2V0VHJhbnNhY3Rpb25GbGFnXG4gICAgLCBwb3N0VHJhbnNhY3Rpb25GaW5pc2hlZCA9IGNoYW5nZURhdGFIYW5kbGVyLnBvc3RUcmFuc2FjdGlvbkZpbmlzaGVkXG5cbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXI7XG5cblxuLyoqXG4gKiBgbWlsby5yZWdpc3RyeS5mYWNldHMuZ2V0KCdEYXRhJylgXG4gKiBGYWNldCB0byBnaXZlIGFjY2VzcyB0byBET00gZGF0YVxuICovXG52YXIgRGF0YSA9IF8uY3JlYXRlU3ViY2xhc3MoQ29tcG9uZW50RmFjZXQsICdEYXRhJyk7XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZHNcbiAqXG4gKiAtIFtzdGFydF0oI0RhdGEkc3RhcnQpIC0gc3RhcnQgRGF0YSBmYWNldFxuICogLSBbZ2V0XSgjRGF0YSRnZXQpIC0gZ2V0IERPTSBkYXRhIGZyb20gRE9NIHRyZWVcbiAqIC0gW3NldF0oI0RhdGEkc2V0KSAtIHNldCBET00gZGF0YSB0byBET00gdHJlZVxuICogLSBbcGF0aF0oI0RhdGEkcGF0aCkgLSBnZXQgcmVmZXJlbmNlIHRvIERhdGEgZmFjZXQgYnkgcGF0aFxuICovXG5fLmV4dGVuZFByb3RvKERhdGEsIHtcbiAgICBzdGFydDogRGF0YSRzdGFydCxcbiAgICBnZXRTdGF0ZTogRGF0YSRnZXRTdGF0ZSxcbiAgICBzZXRTdGF0ZTogRGF0YSRzZXRTdGF0ZSxcblxuICAgIGdldDogRGF0YSRnZXQsXG4gICAgc2V0OiBEYXRhJHNldCxcbiAgICBkZWw6IERhdGEkZGVsLFxuICAgIHNwbGljZTogRGF0YSRzcGxpY2UsXG4gICAgbGVuOiBEYXRhJGxlbixcbiAgICBwYXRoOiBEYXRhJHBhdGgsXG4gICAgZ2V0UGF0aDogRGF0YSRnZXRQYXRoLFxuICAgIGdldEtleTogRGF0YSRnZXRLZXksXG5cbiAgICBfZ2V0OiBEYXRhJF9nZXQsXG4gICAgX3NldDogRGF0YSRfc2V0LFxuICAgIF9kZWw6IERhdGEkX2RlbCxcbiAgICBfc3BsaWNlOiBEYXRhJF9zcGxpY2UsXG4gICAgX2xlbjogRGF0YSRfbGVuLFxuXG4gICAgX3NldFNjYWxhclZhbHVlOiBEYXRhJF9zZXRTY2FsYXJWYWx1ZSxcbiAgICBfZ2V0U2NhbGFyVmFsdWU6IERhdGEkX2dldFNjYWxhclZhbHVlLFxuICAgIF9idWJibGVVcERhdGFDaGFuZ2U6IERhdGEkX2J1YmJsZVVwRGF0YUNoYW5nZSxcbiAgICBfcXVldWVEYXRhQ2hhbmdlOiBEYXRhJF9xdWV1ZURhdGFDaGFuZ2UsXG4gICAgX3Bvc3REYXRhQ2hhbmdlczogRGF0YSRfcG9zdERhdGFDaGFuZ2VzLFxuICAgIF9wcmVwYXJlTWVzc2FnZVNvdXJjZTogX3ByZXBhcmVNZXNzYWdlU291cmNlXG59KTtcblxuZmFjZXRzUmVnaXN0cnkuYWRkKERhdGEpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGE7XG5cblxuLyoqXG4gKiBNb2RlbFBhdGggbWV0aG9kcyBhZGRlZCB0byBEYXRhIHByb3RvdHlwZVxuICovXG5bJ3B1c2gnLCAncG9wJywgJ3Vuc2hpZnQnLCAnc2hpZnQnXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICB2YXIgbWV0aG9kID0gTW9kZWwuUGF0aC5wcm90b3R5cGVbbWV0aG9kTmFtZV07XG4gICAgXy5kZWZpbmVQcm9wZXJ0eShEYXRhLnByb3RvdHlwZSwgbWV0aG9kTmFtZSwgbWV0aG9kKTtcbn0pO1xuXG5cblxuLy8gdGhlc2UgbWV0aG9kcyB3aWxsIGJlIHdyYXBwZWQgdG8gc3VwcG9ydCBcIipcIiBwYXR0ZXJuIHN1YnNjcmlwdGlvbnNcbnZhciBwcm94eURhdGFTb3VyY2VNZXRob2RzID0ge1xuICAgICAgICAvLyB2YWx1ZTogJ3ZhbHVlJyxcbiAgICAgICAgdHJpZ2dlcjogJ3RyaWdnZXInXG4gICAgfTtcblxuXG4vKipcbiAqIERhdGEgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTdGFydHMgRGF0YSBmYWNldFxuICogQ2FsbGVkIGJ5IGNvbXBvbmVudCBhZnRlciBjb21wb25lbnQgaXMgaW5pdGlhbGl6ZWQuXG4gKi9cbmZ1bmN0aW9uIERhdGEkc3RhcnQoKSB7XG4gICAgLy8gY2hhbmdlIG1lc3NlbmdlciBtZXRob2RzIHRvIHdvcmsgd2l0aCBcIipcIiBzdWJzY3JpcHRpb25zIChsaWtlIE1vZGVsIGNsYXNzKVxuICAgIHBhdGhVdGlscy53cmFwTWVzc2VuZ2VyTWV0aG9kcy5jYWxsKHRoaXMpO1xuXG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLnN0YXJ0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAvLyBnZXQvc2V0IG1ldGhvZHMgdG8gc2V0IGRhdGEgb2YgZWxlbWVudFxuICAgIHRoaXMuZWxEYXRhID0gZ2V0RWxlbWVudERhdGFBY2Nlc3ModGhpcy5vd25lci5lbCk7XG5cbiAgICB0aGlzLl9kYXRhQ2hhbmdlc1F1ZXVlID0gW107XG5cbiAgICB0aGlzLl9wcmVwYXJlTWVzc2FnZVNvdXJjZSgpO1xuXG4gICAgLy8gc3RvcmUgZmFjZXQgZGF0YSBwYXRoXG4gICAgdGhpcy5fcGF0aCA9ICcuJyArIHRoaXMub3duZXIubmFtZTtcblxuICAgIC8vIGN1cnJlbnQgdmFsdWVcbiAgICB0aGlzLl92YWx1ZSA9IHRoaXMuZ2V0KCk7XG5cbiAgICAvLyBwcmVwYXJlIGludGVybmFsIGFuZCBleHRlcm5hbCBtZXNzZW5nZXJzXG4gICAgLy8gdGhpcy5fcHJlcGFyZU1lc3NlbmdlcnMoKTtcblxuICAgIC8vIHN1YnNjcmliZSB0byBET00gZXZlbnQgYW5kIGFjY2Vzc29ycycgbWVzc2FnZXNcbiAgICB0aGlzLm9uU3luYygnJywgb25Pd25EYXRhQ2hhbmdlKTtcblxuICAgIC8vIG1lc3NhZ2UgdG8gbWFyayB0aGUgZW5kIG9mIGJhdGNoIG9uIHRoZSBjdXJyZW50IGxldmVsXG4gICAgdGhpcy5vblN5bmMoJ2RhdGFjaGFuZ2VzZmluaXNoZWQnLCBvbkRhdGFDaGFuZ2VzRmluaXNoZWQpO1xuXG4gICAgLy8gY2hhbmdlcyBpbiBzY29wZSBjaGlsZHJlbiB3aXRoIERhdGEgZmFjZXRcbiAgICB0aGlzLm9uU3luYygnY2hpbGRkYXRhJywgb25DaGlsZERhdGEpO1xuXG4gICAgLy8gdG8gZW5hYmxlIHJlYWN0aXZlIGNvbm5lY3Rpb25zXG4gICAgdGhpcy5vblN5bmMoJ2NoYW5nZWRhdGEnLCBjaGFuZ2VEYXRhSGFuZGxlcik7XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogQ3JlYXRlIGFuZCBjb25uZWN0IGludGVybmFsIGFuZCBleHRlcm5hbCBtZXNzZW5nZXJzIG9mIERhdGEgZmFjZXQuXG4gKiBFeHRlcm5hbCBtZXNzZW5nZXIncyBtZXRob2RzIGFyZSBwcm94aWVkIG9uIHRoZSBEYXRhIGZhY2V0IGFuZCB0aGV5IGFsbG93cyBcIipcIiBzdWJzY3JpcHRpb25zLlxuICovXG4vLyBmdW5jdGlvbiBfcHJlcGFyZU1lc3NlbmdlcnMoKSB7XG4gICAgLy8gRGF0YSBmYWNldCB3aWxsIHBvc3QgYWxsIGl0cyBjaGFuZ2VzIG9uIGludGVybmFsIG1lc3NlbmdlclxuICAgIC8vIHZhciBpbnRlcm5hbE1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcyk7XG5cbiAgICAvLyBtZXNzYWdlIHNvdXJjZSB0byBjb25uZWN0IGludGVybmFsIG1lc3NlbmdlciB0byBleHRlcm5hbFxuICAgIC8vIHZhciBpbnRlcm5hbE1lc3NlbmdlclNvdXJjZSA9IG5ldyBNZXNzZW5nZXJNZXNzYWdlU291cmNlKHRoaXMsIHVuZGVmaW5lZCwgbmV3IE1vZGVsTXNnQVBJLCBpbnRlcm5hbE1lc3Nlbmdlcik7XG5cbiAgICAvLyBleHRlcm5hbCBtZXNzZW5nZXIgdG8gd2hpY2ggYWxsIG1vZGVsIHVzZXJzIHdpbGwgc3Vic2NyaWJlLFxuICAgIC8vIHRoYXQgd2lsbCBhbGxvdyBcIipcIiBzdWJzY3JpcHRpb25zIGFuZCBzdXBwb3J0IFwiY2hhbmdlZGF0YVwiIG1lc3NhZ2UgYXBpLlxuICAgIC8vIHZhciBleHRlcm5hbE1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcywgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzLCBpbnRlcm5hbE1lc3NlbmdlclNvdXJjZSk7XG5cbi8vICAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuLy8gICAgICAgICBfbWVzc2VuZ2VyOiBleHRlcm5hbE1lc3Nlbmdlcixcbi8vICAgICAgICAgX2ludGVybmFsTWVzc2VuZ2VyOiBpbnRlcm5hbE1lc3NlbmdlclxuLy8gICAgIH0pO1xuLy8gfVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEluaXRpYWxpemVzIERPTUV2ZW50c1NvdXJjZSBhbmQgY29ubmVjdHMgaXQgdG8gRGF0YSBmYWNldCBtZXNzZW5nZXJcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfcHJlcGFyZU1lc3NhZ2VTb3VyY2UoKSB7XG4gICAgdmFyIGRhdGFBUEkgPSBuZXcgRGF0YU1zZ0FQSSh0aGlzLm93bmVyKVxuICAgICAgICAsIGRhdGFFdmVudHNTb3VyY2UgPSBuZXcgRE9NRXZlbnRzU291cmNlKHRoaXMsIHByb3h5RGF0YVNvdXJjZU1ldGhvZHMsIGRhdGFBUEksIHRoaXMub3duZXIpO1xuICAgIHRoaXMuX3NldE1lc3NhZ2VTb3VyY2UoZGF0YUV2ZW50c1NvdXJjZSk7XG5cbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsICdfZGF0YUV2ZW50c1NvdXJjZScsIGRhdGFFdmVudHNTb3VyY2UpO1xuXG4gICAgLy8gbWFrZSB2YWx1ZSBtZXRob2Qgb2YgRGF0YU1zZ0FQSSBhdmFpbGFibGUgb24gRGF0YSBmYWNldFxuICAgIC8vIHRoaXMgaXMgYSBwcml2YXRlIG1ldGhvZCwgZ2V0KCkgc2hvdWxkIGJlIHVzZWQgdG8gZ2V0IGRhdGEuXG4gICAgTWl4aW4ucHJvdG90eXBlLl9jcmVhdGVQcm94eU1ldGhvZC5jYWxsKGRhdGFBUEksICd2YWx1ZScsICd2YWx1ZScsIHRoaXMpO1xufVxuXG5cbi8qKlxuICogU3Vic2NyaWJlciB0byBkYXRhIGNoYW5nZSBldmVudFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gbXNnVHlwZSBpbiB0aGlzIGluc3RhbmNlIHdpbGwgYmUgJydcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIGRhdGEgY2hhbmdlIGluZm9ybWF0aW9uXG4gKi9cbmZ1bmN0aW9uIG9uT3duRGF0YUNoYW5nZShtc2dUeXBlLCBkYXRhKSB7XG4gICAgdGhpcy5fYnViYmxlVXBEYXRhQ2hhbmdlKGRhdGEpO1xuICAgIHRoaXMuX3F1ZXVlRGF0YUNoYW5nZShkYXRhKTtcbiAgICBpZiAoZGF0YS5wYXRoID09PSAnJykge1xuICAgICAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhkYXRhKTtcbiAgICAgICAgdGhpcy5wb3N0TWVzc2FnZSgnZGF0YWNoYW5nZXNmaW5pc2hlZCcsIHsgdHJhbnNhY3Rpb246IGluVHJhbnNhY3Rpb24gfSk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFNlbmRzIGRhdGEgYG1lc3NhZ2VgIHRvIERPTSBwYXJlbnRcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG1zZ0RhdGEgZGF0YSBjaGFuZ2UgbWVzc2FnZVxuICovXG5mdW5jdGlvbiBEYXRhJF9idWJibGVVcERhdGFDaGFuZ2UobXNnRGF0YSkge1xuICAgIHZhciBwYXJlbnREYXRhID0gdGhpcy5zY29wZVBhcmVudCgpO1xuXG4gICAgaWYgKHBhcmVudERhdGEpIHtcbiAgICAgICAgdmFyIHBhcmVudE1zZyA9IF8uY2xvbmUobXNnRGF0YSk7XG4gICAgICAgIHBhcmVudE1zZy5wYXRoID0gKHRoaXMuX3BhdGggfHwgKCcuJyArIHRoaXMub3duZXIubmFtZSkpICArIHBhcmVudE1zZy5wYXRoO1xuICAgICAgICBwYXJlbnREYXRhLnBvc3RNZXNzYWdlKCdjaGlsZGRhdGEnLCBwYXJlbnRNc2cgfHwgbXNnRGF0YSk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFF1ZXVlcyBkYXRhIG1lc3NhZ2VzIHRvIGJlIGRpc3BhdGNoZWQgdG8gY29ubmVjdG9yXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBjaGFuZ2UgZGF0YSBjaGFuZ2UgZGVzY3JpcHRpb25cbiAqL1xuZnVuY3Rpb24gRGF0YSRfcXVldWVEYXRhQ2hhbmdlKGNoYW5nZSkge1xuICAgIHRoaXMuX2RhdGFDaGFuZ2VzUXVldWUucHVzaChjaGFuZ2UpO1xufVxuXG5cbi8qKlxuICogU3Vic2NyaWJlciB0byBkYXRhY2hhbmdlc2ZpbmlzaGVkIGV2ZW50LlxuICogQ2FsbHMgdGhlIG1ldGhvZCB0byBwb3N0IGNoYW5nZXMgYmF0Y2ggYW5kIGJ1YmJsZXMgdXAgdGhlIG1lc3NhZ2VcbiAqXG4gKiBAcGFyYW0gIHtbdHlwZV19IG1zZyAgW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7W3R5cGVdfSBkYXRhIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gb25EYXRhQ2hhbmdlc0ZpbmlzaGVkKG1zZywgZGF0YSkge1xuICAgIHRoaXMuX3Bvc3REYXRhQ2hhbmdlcyhkYXRhLmluVHJhbnNhY3Rpb24pO1xuICAgIHZhciBwYXJlbnREYXRhID0gdGhpcy5zY29wZVBhcmVudCgpO1xuICAgIGlmIChwYXJlbnREYXRhKSBwYXJlbnREYXRhLnBvc3RNZXNzYWdlKCdkYXRhY2hhbmdlc2ZpbmlzaGVkJywgZGF0YSk7XG59XG5cblxuLyoqXG4gKiBEaXNwYXRjaGVzIGFsbCBjaGFuZ2VzIGNvbGxlY3RlZCBpbiB0aGUgYmF0Y2hcbiAqIFVzZWQgZm9yIGRhdGEgcHJvcGFnYXRpb24gLSBjb25uZWN0b3Igc3Vic2NyaWJlcyB0byB0aGlzIG1lc3NhZ2VcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBEYXRhJF9wb3N0RGF0YUNoYW5nZXMoaW5UcmFuc2FjdGlvbikge1xuICAgIHZhciBxdWV1ZSA9IHRoaXMuX2RhdGFDaGFuZ2VzUXVldWUucmV2ZXJzZSgpO1xuICAgIHRoaXMucG9zdE1lc3NhZ2VTeW5jKCdkYXRhY2hhbmdlcycsIHtcbiAgICAgICAgY2hhbmdlczogcXVldWUsXG4gICAgICAgIHRyYW5zYWN0aW9uOiBpblRyYW5zYWN0aW9uXG4gICAgfSk7XG4gICAgdGhpcy5fZGF0YUNoYW5nZXNRdWV1ZSA9IFtdOyAvLyBpdCBjYW4ndCBiZSAubGVuZ3RoID0gMCwgYXMgdGhlIGFjdHVhbCBhcnJheSBtYXkgc3RpbGwgYmUgdXNlZFxufVxuXG5cbi8qKlxuICogU3Vic2NyaWJlciB0byBkYXRhIGNoYW5nZSBldmVudCBpbiBjaGlsZCBEYXRhIGZhY2V0XG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtc2dUeXBlXG4gKiBAcGFyYW0ge09iZWpjdH0gZGF0YSBkYXRhIGNoYW5nZSBpbmZvcm1hdGlvblxuICovXG5mdW5jdGlvbiBvbkNoaWxkRGF0YShtc2dUeXBlLCBkYXRhKSB7XG4gICAgdGhpcy5wb3N0TWVzc2FnZShkYXRhLnBhdGgsIGRhdGEpO1xuICAgIHRoaXMuX2J1YmJsZVVwRGF0YUNoYW5nZShkYXRhKTtcbiAgICB0aGlzLl9xdWV1ZURhdGFDaGFuZ2UoZGF0YSk7XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyBkYXRhIGluIERPTSBoaWVyYXJjaHkgcmVjdXJzaXZlbHkuXG4gKiBSZXR1cm5zIHRoZSBvYmplY3Qgd2l0aCB0aGUgZGF0YSBhY3R1YWxseSBzZXQgKGNhbiBiZSBkaWZmZXJlbnQsIGlmIGNvbXBvbmVudHMgbWF0Y2hpbmcgc29tZSBwcm9wZXJ0aWVzIGFyZSBtaXNzaW5nKS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxTdHJpbmd8TnVtYmVyfSB2YWx1ZSB2YWx1ZSB0byBiZSBzZXQuIElmIHRoZSB2YWx1ZSBpZiBzY2FsYXIsIGl0IHdpbGwgYmUgc2V0IG9uIGNvbXBvbmVudCdzIGVsZW1lbnQsIGlmIHRoZSB2YWx1ZSBpcyBvYmplY3QgLSBvbiBET00gdHJlZSBpbnNpZGUgY29tcG9uZW50XG4gKiBAcmV0dXJuIHtPYmplY3R8U3RyaW5nfE51bWJlcn1cbiAqL1xuZnVuY3Rpb24gRGF0YSRzZXQodmFsdWUpIHtcbiAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhEYXRhJHNldCk7XG5cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXhlY3V0ZUhvb2suY2FsbCh0aGlzLCAnc2V0JywgYXJndW1lbnRzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlICE9IG5vSG9vaykgdGhyb3cgZTtcbiAgICB9XG5cbiAgICBzZXRUcmFuc2FjdGlvbkZsYWcodGhpcy5fc2V0LCBpblRyYW5zYWN0aW9uKTtcblxuICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMuX3ZhbHVlXG4gICAgICAgICwgbmV3VmFsdWUgPSB0aGlzLl9zZXQodmFsdWUpO1xuXG4gICAgLy8gdGhpcyBtZXNzYWdlIHRyaWdnZXJzIG9uT3duRGF0YUNoYW5nZSwgYXMgd2VsbCBhcyBhY3R1YWxsIERPTSBjaGFuZ2VcbiAgICAvLyBzbyB0aGUgcGFyZW50IGdldHMgbm90aWZpZWRcbiAgICB2YXIgbXNnID0geyBwYXRoOiAnJywgdHlwZTogJ2NoYW5nZWQnLFxuICAgICAgICAgICAgICAgIG5ld1ZhbHVlOiBuZXdWYWx1ZSwgb2xkVmFsdWU6IG9sZFZhbHVlIH07XG4gICAgc2V0VHJhbnNhY3Rpb25GbGFnKG1zZywgaW5UcmFuc2FjdGlvbik7XG4gICAgdGhpcy5wb3N0TWVzc2FnZSgnJywgbXNnKTtcblxuICAgIHJldHVybiBuZXdWYWx1ZTtcbn1cblxuXG5mdW5jdGlvbiBEYXRhJF9zZXQodmFsdWUpIHtcbiAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhEYXRhJF9zZXQpO1xuXG4gICAgdmFyIHZhbHVlU2V0O1xuICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbHVlU2V0ID0gW107XG5cbiAgICAgICAgICAgIHZhciBsaXN0RmFjZXQgPSB0aGlzLm93bmVyLmxpc3Q7XG4gICAgICAgICAgICBpZiAobGlzdEZhY2V0KXtcbiAgICAgICAgICAgICAgICB2YXIgbGlzdExlbmd0aCA9IGxpc3RGYWNldC5jb3VudCgpXG4gICAgICAgICAgICAgICAgICAgICwgbmV3SXRlbXNDb3VudCA9IHZhbHVlLmxlbmd0aCAtIGxpc3RMZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKG5ld0l0ZW1zQ291bnQgPj0gMykge1xuICAgICAgICAgICAgICAgICAgICBsaXN0RmFjZXQuX2FkZEl0ZW1zKG5ld0l0ZW1zQ291bnQpO1xuICAgICAgICAgICAgICAgICAgICBsaXN0RmFjZXQuX3VwZGF0ZURhdGFQYXRocyhsaXN0TGVuZ3RoLCBsaXN0RmFjZXQuY291bnQoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihjaGlsZFZhbHVlLCBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBzZXRDaGlsZERhdGEuY2FsbCh0aGlzLCB2YWx1ZVNldCwgY2hpbGRWYWx1ZSwgaW5kZXgsICdbJCRdJyk7XG4gICAgICAgICAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgICAgICAgICB2YXIgbGlzdENvdW50ID0gbGlzdEZhY2V0LmNvdW50KClcbiAgICAgICAgICAgICAgICAgICAgLCByZW1vdmVDb3VudCA9IGxpc3RDb3VudCAtIHZhbHVlLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIHdoaWxlIChyZW1vdmVDb3VudC0tID4gMClcbiAgICAgICAgICAgICAgICAgICAgbGlzdEZhY2V0Ll9yZW1vdmVJdGVtKHZhbHVlLmxlbmd0aCk7XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybignRGF0YTogc2V0dGluZyBhcnJheSBkYXRhIHdpdGhvdXQgTGlzdCBmYWNldCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWVTZXQgPSB7fTtcbiAgICAgICAgICAgIF8uZWFjaEtleSh2YWx1ZSwgZnVuY3Rpb24oY2hpbGRWYWx1ZSwga2V5KSB7XG4gICAgICAgICAgICAgICAgc2V0Q2hpbGREYXRhLmNhbGwodGhpcywgdmFsdWVTZXQsIGNoaWxkVmFsdWUsIGtleSwgJy4kJCcpO1xuICAgICAgICAgICAgfSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICB9IGVsc2VcbiAgICAgICAgdmFsdWVTZXQgPSB0aGlzLl9zZXRTY2FsYXJWYWx1ZSh2YWx1ZSk7XG5cbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlU2V0O1xuXG4gICAgcmV0dXJuIHZhbHVlU2V0O1xuXG5cbiAgICBmdW5jdGlvbiBzZXRDaGlsZERhdGEodmFsdWVTZXQsIGNoaWxkVmFsdWUsIGtleSwgcGF0aFN5bnRheCkge1xuICAgICAgICB2YXIgY2hpbGRQYXRoID0gcGF0aFN5bnRheC5yZXBsYWNlKCckJCcsIGtleSk7XG4gICAgICAgIHZhciBjaGlsZERhdGFGYWNldCA9IHRoaXMucGF0aChjaGlsZFBhdGgsIHR5cGVvZiBjaGlsZFZhbHVlICE9ICd1bmRlZmluZWQnKTtcbiAgICAgICAgaWYgKGNoaWxkRGF0YUZhY2V0KSB7XG4gICAgICAgICAgICBzZXRUcmFuc2FjdGlvbkZsYWcoY2hpbGREYXRhRmFjZXQuc2V0LCBpblRyYW5zYWN0aW9uKTtcbiAgICAgICAgICAgIHZhbHVlU2V0W2tleV0gPSBjaGlsZERhdGFGYWNldC5zZXQoY2hpbGRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogRGVsZXRlcyBjb21wb25lbnQgZnJvbSB2aWV3IGFuZCBzY29wZSwgb25seSBpbiBjYXNlIGl0IGhhcyBJdGVtIGZhY2V0IG9uIGl0XG4gKi9cbmZ1bmN0aW9uIERhdGEkZGVsKCkge1xuICAgIHZhciBpblRyYW5zYWN0aW9uID0gZ2V0VHJhbnNhY3Rpb25GbGFnKERhdGEkZGVsKTtcblxuICAgIHRyeSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBleGVjdXRlSG9vay5jYWxsKHRoaXMsICdkZWwnKTtcbiAgICAgICAgcG9zdFRyYW5zYWN0aW9uRmluaXNoZWQuY2FsbCh0aGlzLCBpblRyYW5zYWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlICE9IG5vSG9vaykgdGhyb3cgZTtcbiAgICB9XG5cbiAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLl92YWx1ZTtcblxuICAgIHNldFRyYW5zYWN0aW9uRmxhZyh0aGlzLl9kZWwsIGluVHJhbnNhY3Rpb24pO1xuICAgIHRoaXMuX2RlbCgpO1xuXG4gICAgLy8gdGhpcyBtZXNzYWdlIHRyaWdnZXJzIG9uT3duRGF0YUNoYW5nZSwgYXMgd2VsbCBhcyBhY3R1YWxsIERPTSBjaGFuZ2VcbiAgICAvLyBzbyB0aGUgcGFyZW50IGdldHMgbm90aWZpZWRcbiAgICB2YXIgbXNnID0geyBwYXRoOiAnJywgdHlwZTogJ2RlbGV0ZWQnLCBvbGRWYWx1ZTogb2xkVmFsdWUgfTtcbiAgICBzZXRUcmFuc2FjdGlvbkZsYWcobXNnLCBpblRyYW5zYWN0aW9uKTtcbiAgICB0aGlzLnBvc3RNZXNzYWdlKCcnLCBtc2cpO1xufVxuXG5cbmZ1bmN0aW9uIERhdGEkX2RlbCgpIHtcbiAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhEYXRhJF9kZWwpO1xuICAgIHNldFRyYW5zYWN0aW9uRmxhZyh0aGlzLl9zZXQsIGluVHJhbnNhY3Rpb24pO1xuICAgIHRoaXMuX3NldCgpO1xufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFNldHMgc2NhbGFyIHZhbHVlIHRvIERPTSBlbGVtZW50XG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsdWUgdmFsdWUgdG8gc2V0IHRvIERPTSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIERhdGEkX3NldFNjYWxhclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxEYXRhLnNldCh0aGlzLm93bmVyLmVsLCB2YWx1ZSk7XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogR2V0IHN0cnVjdHVyZWQgZGF0YSBmcm9tIERPTSBoaWVyYXJjaHkgcmVjdXJzaXZlbHlcbiAqIFJldHVybnMgRE9NIGRhdGFcbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXBHZXQgdHJ1ZSBieSBkZWZhdWx0XG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIERhdGEkZ2V0KGRlZXBHZXQpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXhlY3V0ZUhvb2suY2FsbCh0aGlzLCAnZ2V0JywgYXJndW1lbnRzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlICE9IG5vSG9vaykgdGhyb3cgZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZ2V0KGRlZXBHZXQpO1xufVxuXG5mdW5jdGlvbiBEYXRhJF9nZXQoZGVlcEdldCkge1xuICAgIGlmIChkZWVwR2V0ID09PSBmYWxzZSkgLy8gYSBoYWNrIHRvIGVuYWJsZSBnZXR0aW5nIHNoYWxsb3cgc3RhdGVcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgdmFyIGNvbXAgPSB0aGlzLm93bmVyXG4gICAgICAgICwgc2NvcGVEYXRhO1xuXG4gICAgaWYgKGNvbXAubGlzdCkge1xuICAgICAgICBzY29wZURhdGEgPSBbXTtcbiAgICAgICAgY29tcC5saXN0LmVhY2goZnVuY3Rpb24obGlzdEl0ZW0sIGluZGV4KSB7XG4gICAgICAgICAgICBzY29wZURhdGFbaW5kZXhdID0gbGlzdEl0ZW0uZGF0YS5nZXQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGNvbXAuY29udGFpbmVyKVxuICAgICAgICAgICAgY29tcC5jb250YWluZXIuc2NvcGUuX2VhY2goZnVuY3Rpb24oc2NvcGVJdGVtLCBuYW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEgY29tcC5saXN0LmNvbnRhaW5zKHNjb3BlSXRlbSkgJiYgc2NvcGVJdGVtLmRhdGEpXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlRGF0YVtuYW1lXSA9IHNjb3BlSXRlbS5kYXRhLmdldCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChjb21wLmNvbnRhaW5lcikge1xuICAgICAgICBzY29wZURhdGEgPSB7fTtcbiAgICAgICAgY29tcC5jb250YWluZXIuc2NvcGUuX2VhY2goZnVuY3Rpb24oc2NvcGVJdGVtLCBuYW1lKSB7XG4gICAgICAgICAgICBpZiAoc2NvcGVJdGVtLmRhdGEpXG4gICAgICAgICAgICAgICAgc2NvcGVEYXRhW25hbWVdID0gc2NvcGVJdGVtLmRhdGEuZ2V0KCk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZVxuICAgICAgICBzY29wZURhdGEgPSB0aGlzLl9nZXRTY2FsYXJWYWx1ZSgpO1xuXG4gICAgdGhpcy5fdmFsdWUgPSBzY29wZURhdGE7XG5cbiAgICByZXR1cm4gc2NvcGVEYXRhO1xufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEdldHMgc2NhbGFyIGRhdGEgZnJvbSBET00gZWxlbWVudFxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIERhdGEkX2dldFNjYWxhclZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmVsRGF0YS5nZXQodGhpcy5vd25lci5lbCk7XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogU3BsaWNlcyBMaXN0IGl0ZW1zLiBSZXF1aXJlcyBMaXN0IGZhY2V0IHRvIGJlIHByZXNlbnQgb24gY29tcG9uZW50LiBXb3JrcyBpbiB0aGUgc2FtZSB3YXkgYXMgYXJyYXkgc3BsaWNlLlxuICogUmV0dXJucyBkYXRhIHJldHJpZXZlZCBmcm9tIHJlbW92ZWQgaXRlbXNcbiAqXG4gKiBAcGFyYW0ge0ludGVnZXJ9IHNwbGljZUluZGV4IGluZGV4IHRvIGRlbGV0ZS9pbnNlcnQgYXRcbiAqIEBwYXJhbSB7SW50ZWdlcn0gc3BsaWNlSG93TWFueSBudW1iZXIgb2YgaXRlbXMgdG8gZGVsZXRlXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBvcHRpb25hbCBpdGVtcyB0byBpbnNlcnRcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBEYXRhJHNwbGljZShzcGxpY2VJbmRleCwgc3BsaWNlSG93TWFueSkgeyAvLywgLi4uIGFyZ3VtZW50c1xuICAgIHZhciBpblRyYW5zYWN0aW9uID0gZ2V0VHJhbnNhY3Rpb25GbGFnKERhdGEkc3BsaWNlKTtcbiAgICB2YXIgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGV4ZWN1dGVIb29rLmNhbGwodGhpcywgJ3NwbGljZScsIGFyZ3VtZW50cyk7XG4gICAgICAgIHBvc3RUcmFuc2FjdGlvbkZpbmlzaGVkLmNhbGwodGhpcywgaW5UcmFuc2FjdGlvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSAhPSBub0hvb2spIHRocm93IGU7XG4gICAgfVxuXG4gICAgc2V0VHJhbnNhY3Rpb25GbGFnKHRoaXMuX3NwbGljZSwgaW5UcmFuc2FjdGlvbik7XG4gICAgcmVzdWx0ID0gdGhpcy5fc3BsaWNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICBpZiAoIXJlc3VsdCkgcmV0dXJuO1xuXG4gICAgdmFyIG1zZyA9IHsgcGF0aDogJycsIHR5cGU6ICdzcGxpY2UnLFxuICAgICAgICAgICAgICAgIGluZGV4OiByZXN1bHQuc3BsaWNlSW5kZXgsXG4gICAgICAgICAgICAgICAgcmVtb3ZlZDogcmVzdWx0LnJlbW92ZWQsXG4gICAgICAgICAgICAgICAgYWRkZWRDb3VudDogcmVzdWx0LmFkZGVkQ291bnQsXG4gICAgICAgICAgICAgICAgbmV3VmFsdWU6IHRoaXMuX3ZhbHVlIH07XG4gICAgc2V0VHJhbnNhY3Rpb25GbGFnKG1zZywgaW5UcmFuc2FjdGlvbik7XG4gICAgdGhpcy5wb3N0TWVzc2FnZSgnJywgbXNnKTtcblxuICAgIHJldHVybiByZXN1bHQucmVtb3ZlZDtcbn1cblxuXG52YXIgbm9Ib29rID0ge307XG5mdW5jdGlvbiBleGVjdXRlSG9vayhtZXRob2ROYW1lLCBhcmdzKSB7XG4gICAgdmFyIGhvb2sgPSB0aGlzLmNvbmZpZ1ttZXRob2ROYW1lXTtcbiAgICBzd2l0Y2ggKHR5cGVvZiBob29rKSB7XG4gICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgICAgICAgIHJldHVybiBob29rLmFwcGx5KHRoaXMub3duZXIsIGFyZ3MpO1xuXG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vd25lcltob29rXS5hcHBseSh0aGlzLm93bmVyLCBhcmdzKTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbm9Ib29rO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBEYXRhJF9zcGxpY2Uoc3BsaWNlSW5kZXgsIHNwbGljZUhvd01hbnkpIHsgLy8sIC4uLiBhcmd1bWVudHNcbiAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhEYXRhJF9zcGxpY2UpO1xuXG4gICAgdmFyIGxpc3RGYWNldCA9IHRoaXMub3duZXIubGlzdDtcbiAgICBpZiAoISBsaXN0RmFjZXQpXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignRGF0YTogY2Fubm90IHVzZSBzcGxpY2UgbWV0aG9kIHdpdGhvdXQgTGlzdCBmYWNldCcpO1xuXG4gICAgdmFyIHJlbW92ZWQgPSBbXTtcblxuICAgIHZhciBsaXN0TGVuZ3RoID0gbGlzdEZhY2V0LmNvdW50KCk7XG4gICAgYXJndW1lbnRzWzBdID0gc3BsaWNlSW5kZXggPVxuICAgICAgICBtb2RlbFV0aWxzLm5vcm1hbGl6ZVNwbGljZUluZGV4KHNwbGljZUluZGV4LCBsaXN0TGVuZ3RoKTtcblxuICAgIGlmIChzcGxpY2VIb3dNYW55ID4gMCAmJiBsaXN0TGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKHZhciBpID0gc3BsaWNlSW5kZXg7IGkgPCBzcGxpY2VJbmRleCArIHNwbGljZUhvd01hbnk7IGkrKykge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBsaXN0RmFjZXQuaXRlbShzcGxpY2VJbmRleCk7XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIHZhciBpdGVtRGF0YSA9IGl0ZW0uZGF0YS5nZXQoKTtcbiAgICAgICAgICAgICAgICBsaXN0RmFjZXQuX3JlbW92ZUl0ZW0oc3BsaWNlSW5kZXgpO1xuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0RhdGE6IG5vIGl0ZW0gZm9yIGluZGV4JywgaSk7XG5cbiAgICAgICAgICAgIHJlbW92ZWQucHVzaChpdGVtRGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBsaXN0RmFjZXQuX3VwZGF0ZURhdGFQYXRocyhzcGxpY2VJbmRleCwgbGlzdEZhY2V0LmNvdW50KCkpO1xuICAgIH1cblxuICAgIHZhciBhZGRlZCA9IFtdO1xuXG4gICAgdmFyIGFyZ3NMZW4gPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgICAgICwgYWRkSXRlbXMgPSBhcmdzTGVuID4gMlxuICAgICAgICAsIGFkZGVkQ291bnQgPSBhcmdzTGVuIC0gMjtcbiAgICBpZiAoYWRkSXRlbXMpIHtcbiAgICAgICAgbGlzdEZhY2V0Ll9hZGRJdGVtcyhhZGRlZENvdW50LCBzcGxpY2VJbmRleCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAyLCBqID0gc3BsaWNlSW5kZXg7IGkgPCBhcmdzTGVuOyBpKyssIGorKykge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBsaXN0RmFjZXQuaXRlbShqKTtcbiAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgc2V0VHJhbnNhY3Rpb25GbGFnKGl0ZW0uZGF0YS5zZXQsIGluVHJhbnNhY3Rpb24pO1xuICAgICAgICAgICAgICAgIHZhciBpdGVtRGF0YSA9IGl0ZW0uZGF0YS5zZXQoYXJndW1lbnRzW2ldKTtcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdEYXRhOiBubyBpdGVtIGZvciBpbmRleCcsIGopO1xuXG4gICAgICAgICAgICBhZGRlZC5wdXNoKGl0ZW1EYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoYW5nZSBwYXRocyBvZiBpdGVtcyB0aGF0IHdlcmUgYWRkZWQgYW5kIGl0ZW1zIGFmdGVyIHRoZW1cbiAgICAgICAgbGlzdEZhY2V0Ll91cGRhdGVEYXRhUGF0aHMoc3BsaWNlSW5kZXgsIGxpc3RGYWNldC5jb3VudCgpKTtcbiAgICB9XG5cbiAgICAvLyBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkpIHtcbiAgICAvLyAgICAgXy5wcmVwZW5kQXJyYXkoYWRkZWQsIFtzcGxpY2VJbmRleCwgc3BsaWNlSG93TWFueV0pO1xuICAgIC8vICAgICBBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KHRoaXMuX3ZhbHVlLCBhZGRlZCk7XG4gICAgLy8gfSBlbHNlXG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5nZXQoKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHNwbGljZUluZGV4OiBzcGxpY2VJbmRleCxcbiAgICAgICAgcmVtb3ZlZDogcmVtb3ZlZCxcbiAgICAgICAgYWRkZWRDb3VudDogYWRkSXRlbXMgPyBhZGRlZENvdW50IDogMFxuICAgIH07XG59XG5cblxuZnVuY3Rpb24gRGF0YSRsZW4oKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGV4ZWN1dGVIb29rLmNhbGwodGhpcywgJ2xlbicpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUgIT0gbm9Ib29rKSB0aHJvdyBlO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdGhpcy5fbGVuKCk7XG59XG5cblxuZnVuY3Rpb24gRGF0YSRfbGVuKCkge1xuICAgIGlmICh0aGlzLm93bmVyLmxpc3QpIHJldHVybiB0aGlzLm93bmVyLmxpc3QuY291bnQoKTtcbiAgICBlbHNlIGxvZ2dlci5lcnJvcignRGF0YTogbGVuIGNhbGxlZCB3aXRob3V0IGxpc3QgZmFjZXQnKTtcbn1cblxuXG4vKipcbiAqIERhdGEgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIGRhdGEgZmFjZXQgb2YgYSBjaGlsZCBjb21wb25lbnQgKGJ5IHNjb3BlcykgY29ycmVzcG9uZGluZyB0byB0aGUgcGF0aFxuICogQHBhcmFtIHtTdHJpbmd9IGFjY2Vzc1BhdGggZGF0YSBhY2Nlc3MgcGF0aFxuICovXG5mdW5jdGlvbiBEYXRhJHBhdGgoYWNjZXNzUGF0aCwgY3JlYXRlSXRlbSkge1xuICAgIC8vIGNyZWF0ZUl0ZW0gPSB0cnVlOyAvLyB0aGlzIGhhY2sgc2VlbXMgdG8gYmUgbm8gbG9uZ2VyIG5lZWRlZC4uLlxuXG4gICAgaWYgKCEgYWNjZXNzUGF0aClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgcGFyc2VkUGF0aCA9IHBhdGhVdGlscy5wYXJzZUFjY2Vzc1BhdGgoYWNjZXNzUGF0aCk7XG4gICAgdmFyIGN1cnJlbnRDb21wb25lbnQgPSB0aGlzLm93bmVyO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBhcnNlZFBhdGgubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIHBhdGhOb2RlID0gcGFyc2VkUGF0aFtpXVxuICAgICAgICAgICAgLCBub2RlS2V5ID0gcGF0aFV0aWxzLmdldFBhdGhOb2RlS2V5KHBhdGhOb2RlKTtcbiAgICAgICAgaWYgKHBhdGhOb2RlLnN5bnRheCA9PSAnYXJyYXknICYmIGN1cnJlbnRDb21wb25lbnQubGlzdCkge1xuICAgICAgICAgICAgdmFyIGl0ZW1Db21wb25lbnQgPSBjdXJyZW50Q29tcG9uZW50Lmxpc3QuaXRlbShub2RlS2V5KTtcbiAgICAgICAgICAgIGlmICghIGl0ZW1Db21wb25lbnQgJiYgY3JlYXRlSXRlbSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBpdGVtQ29tcG9uZW50ID0gY3VycmVudENvbXBvbmVudC5saXN0Ll9hZGRJdGVtKG5vZGVLZXkpO1xuICAgICAgICAgICAgICAgIGl0ZW1Db21wb25lbnQuZGF0YS5fcGF0aCA9IHBhdGhOb2RlLnByb3BlcnR5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudENvbXBvbmVudCA9IGl0ZW1Db21wb25lbnQ7XG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudENvbXBvbmVudC5jb250YWluZXIpXG4gICAgICAgICAgICBjdXJyZW50Q29tcG9uZW50ID0gY3VycmVudENvbXBvbmVudC5jb250YWluZXIuc2NvcGVbbm9kZUtleV07XG5cbiAgICAgICAgdmFyIGN1cnJlbnREYXRhRmFjZXQgPSBjdXJyZW50Q29tcG9uZW50ICYmIGN1cnJlbnRDb21wb25lbnQuZGF0YTtcbiAgICAgICAgaWYgKCEgY3VycmVudERhdGFGYWNldClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50RGF0YUZhY2V0O1xufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgcGF0aCB0byBhY2Nlc3MgdGhpcyBkYXRhIGZhY2V0IGZyb20gcGFyZW50ICh1c2luZyBwYXRoIG1ldGhvZClcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIERhdGEkZ2V0UGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGF0aDtcbn1cblxuXG4vKipcbiAqIERhdGEgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIGtleSB0byBhY2Nlc3MgdGhlIHZhbHVlIHJlbGF0ZWQgdG8gdGhpcyBkYXRhIGZhY2V0IG9uIHRoZSB2YWx1ZSByZWxhdGVkIHRvIHBhcmVudCBkYXRhIGZhY2V0LlxuICogSWYgY29tcG9uZW50IGhhcyBMaXN0IGZhY2V0LCByZXR1cm5zIGluZGV4XG4gKlxuICogQHJldHVybiB7U3RyaW5nfEludGVnZXJ9XG4gKi9cbmZ1bmN0aW9uIERhdGEkZ2V0S2V5KCkge1xuICAgIHZhciBwYXRoID0gdGhpcy5fcGF0aDtcbiAgICByZXR1cm4gcGF0aFswXSA9PSAnWydcbiAgICAgICAgICAgID8gK3BhdGguc2xpY2UoMSwgLTEpIC8vIHJlbW92ZSBcIltcIiBhbmQgXCJdXCJcbiAgICAgICAgICAgIDogcGF0aC5zbGljZSgxKSAvLyByZW1vdmUgbGVhZGluZyBcIi5cIlxufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIENhbGxlZCBieSBgQ29tcG9uZW50LnByb3RvdHlwZS5nZXRTdGF0ZWAgdG8gZ2V0IGZhY2V0J3Mgc3RhdGVcbiAqIFJldHVybnMgRE9NIGRhdGFcbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXBTdGF0ZSwgdHJ1ZSBieSBkZWZhdWx0XG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIERhdGEkZ2V0U3RhdGUoZGVlcFN0YXRlKSB7XG4gICAgcmV0dXJuIHsgc3RhdGU6IHRoaXMuZ2V0KGRlZXBTdGF0ZSkgfTtcbn1cblxuXG4vKipcbiAqIERhdGEgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBDYWxsZWQgYnkgYENvbXBvbmVudC5wcm90b3R5cGUuc2V0U3RhdGVgIHRvIHNldCBmYWNldCdzIHN0YXRlXG4gKiBTaW1wbHkgc2V0cyBtb2RlbCBkYXRhXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIGRhdGEgdG8gc2V0IG9uIGZhY2V0J3MgbW9kZWxcbiAqL1xuZnVuY3Rpb24gRGF0YSRzZXRTdGF0ZShzdGF0ZSkge1xuICAgIHJldHVybiB0aGlzLnNldChzdGF0ZS5zdGF0ZSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY2ZfcmVnaXN0cnknKSBcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBkb1QgPSBtaWxvQ29yZS51dGlsLmRvVFxuICAgICwgYmluZGVyID0gcmVxdWlyZSgnLi4vLi4vYmluZGVyJylcbiAgICAsIEJpbmRBdHRyaWJ1dGUgPSByZXF1aXJlKCcuLi8uLi9hdHRyaWJ1dGVzL2FfYmluZCcpXG4gICAgLCBkb21VdGlscyA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZG9tJylcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uLy4uL2NvbmZpZycpO1xuXG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzLmdldCgnRG9tJylgXG4gKiBGYWNldCB3aXRoIGNvbXBvbmVudCByZWxhdGVkIGRvbSB1dGlsc1xuICovXG52YXIgRG9tID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0RvbScpO1xuXG5fLmV4dGVuZChEb20sIHtcbiAgICBjcmVhdGVFbGVtZW50OiBEb20kJGNyZWF0ZUVsZW1lbnRcbn0pO1xuXG5cbi8qKlxuICogRmFjZXQgY2xhc3MgbWV0aG9kXG4gKiBDcmVhdGVzIGFuIGVsZW1lbnQgZnJvbSBhIHBhc3NlZCBjb25maWd1YXRpb24gb2JqZWN0XG4gKiBcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgd2l0aCB0aGUgcHJvcGVydGllcyBgZG9tQ29uZmlnYCwgYGNvbnRlbnRgLCBgdGVtcGxhdGVgXG4gKiBAcmV0dXJuIHtFbGVtZW50fSBhbiBodG1sIGVsZW1lbnQgXG4gKi9cbmZ1bmN0aW9uIERvbSQkY3JlYXRlRWxlbWVudChjb25maWcpIHtcbiAgICB2YXIgZG9tQ29uZmlnID0gY29uZmlnLmRvbUNvbmZpZyB8fCB7fVxuICAgICAgICAsIHRhZ05hbWUgPSBkb21Db25maWcudGFnTmFtZSB8fCAnZGl2J1xuICAgICAgICAsIG5ld0VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKVxuICAgICAgICAsIGNvbnRlbnQgPSBjb25maWcuY29udGVudFxuICAgICAgICAsIHRlbXBsYXRlID0gY29uZmlnLnRlbXBsYXRlO1xuXG4gICAgLy8gVE9ETyBpdCB3aWxsIGJlIGNhbGxlZCBhZ2FpbiB3aGVuL2lmIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWRcbiAgICAvLyBTaG91bGQgYmUgc29tZXByb3BlcnR5IG9uIGVsZW1lbnQgdG8gaW5kaWNhdGUgaXQncyBiZWVuIGNhbGxlZD9cbiAgICBfYXBwbHlDb25maWdUb0VsZW1lbnQobmV3RWwsIGRvbUNvbmZpZyk7XG5cbiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHRlbXBsYXRlKVxuICAgICAgICAgICAgbmV3RWwuaW5uZXJIVE1MID0gZG9ULnRlbXBsYXRlKHRlbXBsYXRlKSh7Y29udGVudDogY29udGVudH0pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBuZXdFbC5pbm5lckhUTUwgPSBjb250ZW50O1xuICAgIH1cbiAgICByZXR1cm4gbmV3RWw7XG59XG5cblxuZnVuY3Rpb24gX2FwcGx5Q29uZmlnVG9FbGVtZW50KGVsLCBjb25maWcpIHtcbiAgICB2YXIgY3NzQ2xhc3NlcyA9IGNvbmZpZyAmJiBjb25maWcuY2xzXG4gICAgICAgICwgY29uZmlnQXR0cmlidXRlcyA9IGNvbmZpZyAmJiBjb25maWcuYXR0cmlidXRlcztcblxuICAgIGlmIChjb25maWdBdHRyaWJ1dGVzKVxuICAgICAgICBfLmVhY2hLZXkoY29uZmlnQXR0cmlidXRlcywgZnVuY3Rpb24oYXR0clZhbHVlLCBhdHRyTmFtZSkge1xuICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgIGlmIChjc3NDbGFzc2VzKVxuICAgICAgICBfYXR0YWNoQ3NzQ2xhc3NlcyhlbCwgJ2FkZCcsIGNzc0NsYXNzZXMpO1xufVxuXG5cbl8uZXh0ZW5kUHJvdG8oRG9tLCB7XG4gICAgc3RhcnQ6IHN0YXJ0LFxuXG4gICAgc2hvdzogc2hvdyxcbiAgICBoaWRlOiBoaWRlLFxuICAgIHRvZ2dsZTogdG9nZ2xlLFxuICAgIGRldGFjaDogZGV0YWNoLFxuICAgIHJlbW92ZTogcmVtb3ZlLFxuICAgIGFwcGVuZDogYXBwZW5kLFxuICAgIHByZXBlbmQ6IHByZXBlbmQsXG4gICAgYXBwZW5kQ2hpbGRyZW46IGFwcGVuZENoaWxkcmVuLFxuICAgIHByZXBlbmRDaGlsZHJlbjogcHJlcGVuZENoaWxkcmVuLFxuICAgIGluc2VydEFmdGVyOiBpbnNlcnRBZnRlcixcbiAgICBpbnNlcnRCZWZvcmU6IGluc2VydEJlZm9yZSxcbiAgICBhcHBlbmRUb1Njb3BlUGFyZW50OiBhcHBlbmRUb1Njb3BlUGFyZW50LFxuICAgIGNoaWxkcmVuOiBEb20kY2hpbGRyZW4sXG4gICAgc2V0U3R5bGU6IHNldFN0eWxlLFxuICAgIHNldFN0eWxlczogc2V0U3R5bGVzLFxuICAgIGNvcHk6IGNvcHksXG4gICAgY3JlYXRlRWxlbWVudDogY3JlYXRlRWxlbWVudCxcblxuICAgIGFkZENzc0NsYXNzZXM6IF8ucGFydGlhbChfbWFuYWdlQ3NzQ2xhc3NlcywgJ2FkZCcpLFxuICAgIHJlbW92ZUNzc0NsYXNzZXM6IF8ucGFydGlhbChfbWFuYWdlQ3NzQ2xhc3NlcywgJ3JlbW92ZScpLFxuICAgIHRvZ2dsZUNzc0NsYXNzZXM6IF8ucGFydGlhbChfbWFuYWdlQ3NzQ2xhc3NlcywgJ3RvZ2dsZScpLFxuXG4gICAgZmluZDogZmluZCxcbiAgICBoYXNUZXh0QmVmb3JlU2VsZWN0aW9uOiBoYXNUZXh0QmVmb3JlU2VsZWN0aW9uLFxuICAgIGhhc1RleHRBZnRlclNlbGVjdGlvbjogaGFzVGV4dEFmdGVyU2VsZWN0aW9uLFxufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChEb20pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERvbTtcblxuXG4vLyBzdGFydCBEb20gZmFjZXRcbmZ1bmN0aW9uIHN0YXJ0KCkge1xuICAgIHZhciBlbCA9IHRoaXMub3duZXIuZWw7XG4gICAgX2FwcGx5Q29uZmlnVG9FbGVtZW50KGVsLCB0aGlzLmNvbmZpZyk7XG4gICAgdmFyIGN1cnJlbnRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKVxuICAgIHRoaXMuX3Zpc2libGUgPSBjdXJyZW50U3R5bGUgJiYgY3VycmVudFN0eWxlLmRpc3BsYXkgIT0gJ25vbmUnO1xufVxuXG4vLyBzaG93IEhUTUwgZWxlbWVudCBvZiBjb21wb25lbnRcbmZ1bmN0aW9uIHNob3coKSB7XG4gICAgdGhpcy50b2dnbGUodHJ1ZSk7XG59XG5cbi8vIGhpZGUgSFRNTCBlbGVtZW50IG9mIGNvbXBvbmVudFxuZnVuY3Rpb24gaGlkZSgpIHtcbiAgICB0aGlzLnRvZ2dsZShmYWxzZSk7XG59XG5cbi8vIHNob3cvaGlkZVxuZnVuY3Rpb24gdG9nZ2xlKGRvU2hvdykge1xuICAgIGRvU2hvdyA9IHR5cGVvZiBkb1Nob3cgPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/ICEgdGhpcy5fdmlzaWJsZVxuICAgICAgICAgICAgICAgIDogISEgZG9TaG93O1xuXG4gICAgdGhpcy5fdmlzaWJsZSA9IGRvU2hvdztcbiAgICB2YXIgZWwgPSB0aGlzLm93bmVyLmVsO1xuXG4gICAgZWwuc3R5bGUuZGlzcGxheSA9IGRvU2hvdyA/ICdibG9jaycgOiAnbm9uZSc7XG5cbiAgICByZXR1cm4gZG9TaG93O1xufVxuXG5cbmZ1bmN0aW9uIF9tYW5hZ2VDc3NDbGFzc2VzKG1ldGhvZE5hbWUsIGNzc0NsYXNzZXMsIGVuZm9yY2UpIHtcbiAgICBfYXR0YWNoQ3NzQ2xhc3Nlcyh0aGlzLm93bmVyLmVsLCBtZXRob2ROYW1lLCBjc3NDbGFzc2VzLCBlbmZvcmNlKTtcbn1cblxuXG5mdW5jdGlvbiBfYXR0YWNoQ3NzQ2xhc3NlcyhlbCwgbWV0aG9kTmFtZSwgY3NzQ2xhc3NlcywgZW5mb3JjZSkge1xuICAgIHZhciBjbGFzc0xpc3QgPSBlbC5jbGFzc0xpc3RcbiAgICAgICAgLCBkb1RvZ2dsZSA9IG1ldGhvZE5hbWUgPT0gJ3RvZ2dsZSc7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjc3NDbGFzc2VzKSlcbiAgICAgICAgY3NzQ2xhc3Nlcy5mb3JFYWNoKGNhbGxNZXRob2QpO1xuICAgIGVsc2UgaWYgKHR5cGVvZiBjc3NDbGFzc2VzID09ICdzdHJpbmcnKVxuICAgICAgICBjYWxsTWV0aG9kKGNzc0NsYXNzZXMpO1xuICAgIGVsc2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHR5cGUgb2YgQ1NTIGNsYXNzZXMgcGFyYW1ldGVyJyk7XG5cbiAgICBmdW5jdGlvbiBjYWxsTWV0aG9kKGNzc0Nscykge1xuICAgICAgICBkb1RvZ2dsZVxuICAgICAgICAgICAgLy8gT25seSBwYXNzICdlbmZvcmNlJyBpZiBhIHZhbHVlIGhhcyBiZWVuIHByb3ZpZGVkIChUaGUgJ3RvZ2dsZScgZnVuY3Rpb24gb2YgdGhlIGNsYXNzTGlzdCB3aWxsIHRyZWF0IHVuZGVmaW5lZCA9PT0gZmFsc2UgcmVzdWx0aW5nIGluIG9ubHkgYWxsb3dpbmcgY2xhc3NlcyB0byBiZSByZW1vdmVkKVxuICAgICAgICAgICAgPyBlbmZvcmNlID09PSB1bmRlZmluZWQgPyBjbGFzc0xpc3RbbWV0aG9kTmFtZV0oY3NzQ2xzKSA6IGNsYXNzTGlzdFttZXRob2ROYW1lXShjc3NDbHMsIGVuZm9yY2UpXG4gICAgICAgICAgICA6IGNsYXNzTGlzdFttZXRob2ROYW1lXShjc3NDbHMpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBkZXRhY2goKSB7XG4gICAgaWYgKHRoaXMub3duZXIuZWwpICBcbiAgICAgICAgZG9tVXRpbHMuZGV0YWNoQ29tcG9uZW50KHRoaXMub3duZXIuZWwpO1xufVxuXG5cbmZ1bmN0aW9uIHNldFN0eWxlKHByb3BlcnR5LCB2YWx1ZSkge1xuICAgIGlmICghdGhpcy5vd25lci5lbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY2FsbCBzZXRTdHlsZSBvbiBvd25lciB3aXRoIG5vIGVsZW1lbnQ6IFwiICsgdGhpcy5vd25lci5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICB9XG4gICAgdGhpcy5vd25lci5lbC5zdHlsZVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gc2V0U3R5bGVzKHByb3BlcnRpZXMpIHtcbiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBwcm9wZXJ0aWVzKVxuICAgICAgICB0aGlzLm93bmVyLmVsLnN0eWxlW3Byb3BlcnR5XSA9IHByb3BlcnRpZXNbcHJvcGVydHldO1xufVxuXG5cbi8vIGNyZWF0ZSBhIGNvcHkgb2YgRE9NIGVsZW1lbnQgdXNpbmcgZmFjZXQgY29uZmlnIGlmIHNldFxuZnVuY3Rpb24gY29weShpc0RlZXApIHtcbiAgICByZXR1cm4gdGhpcy5vd25lci5lbCAmJiB0aGlzLm93bmVyLmVsLmNsb25lTm9kZShpc0RlZXApO1xufVxuXG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoKSB7XG4gICAgdmFyIG5ld0VsID0gRG9tLmNyZWF0ZUVsZW1lbnQodGhpcy5jb25maWcpO1xuICAgIHJldHVybiBuZXdFbDtcbn1cblxuXG4vLyByZW1vdmUgSFRNTCBlbGVtZW50IG9mIGNvbXBvbmVudFxuZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgIGRvbVV0aWxzLnJlbW92ZUVsZW1lbnQodGhpcy5vd25lci5lbCk7XG59XG5cbi8vIGFwcGVuZCBpbnNpZGUgSFRNTCBlbGVtZW50IG9mIGNvbXBvbmVudFxuZnVuY3Rpb24gYXBwZW5kKGVsKSB7XG4gICAgdGhpcy5vd25lci5lbC5hcHBlbmRDaGlsZChlbCk7XG59XG5cbi8vIHByZXBlbmQgaW5zaWRlIEhUTUwgZWxlbWVudCBvZiBjb21wb25lbnRcbmZ1bmN0aW9uIHByZXBlbmQoZWwpIHtcbiAgICB2YXIgdGhpc0VsID0gdGhpcy5vd25lci5lbFxuICAgICAgICAsIGZpcnN0Q2hpbGQgPSB0aGlzRWwuZmlyc3RDaGlsZDtcbiAgICBpZiAoZmlyc3RDaGlsZClcbiAgICAgICAgdGhpc0VsLmluc2VydEJlZm9yZShlbCwgZmlyc3RDaGlsZCk7XG4gICAgZWxzZVxuICAgICAgICB0aGlzRWwuYXBwZW5kQ2hpbGQoZWwpO1xufVxuXG4vLyBhcHBlbmRzIGNoaWxkcmVuIG9mIGVsZW1lbnQgaW5zaWRlIHRoaXMgY29tcG9uZW50J3MgZWxlbWVudFxuZnVuY3Rpb24gYXBwZW5kQ2hpbGRyZW4oZWwpIHtcbiAgICB3aGlsZShlbC5jaGlsZE5vZGVzLmxlbmd0aClcbiAgICAgICAgdGhpcy5hcHBlbmQoZWwuY2hpbGROb2Rlc1swXSk7XG59XG5cbi8vIHByZXBlbmRzIGNoaWxkcmVuIG9mIGVsZW1lbnQgaW5zaWRlIHRoaXMgY29tcG9uZW50J3MgZWxlbWVudFxuZnVuY3Rpb24gcHJlcGVuZENoaWxkcmVuKGVsKSB7XG4gICAgd2hpbGUoZWwuY2hpbGROb2Rlcy5sZW5ndGgpXG4gICAgICAgIHRoaXMucHJlcGVuZChlbC5jaGlsZE5vZGVzW2VsLmNoaWxkTm9kZXMubGVuZ3RoIC0gMV0pO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRBZnRlcihlbCkge1xuICAgIHZhciB0aGlzRWwgPSB0aGlzLm93bmVyLmVsXG4gICAgICAgICwgcGFyZW50ID0gdGhpc0VsLnBhcmVudE5vZGU7ICAgIFxuICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoZWwsIHRoaXNFbC5uZXh0U2libGluZyk7XG59XG5cbmZ1bmN0aW9uIGluc2VydEJlZm9yZShlbCkge1xuICAgIHZhciB0aGlzRWwgPSB0aGlzLm93bmVyLmVsXG4gICAgICAgICwgcGFyZW50ID0gdGhpc0VsLnBhcmVudE5vZGU7XG4gICAgcGFyZW50Lmluc2VydEJlZm9yZShlbCwgdGhpc0VsKTtcbn1cblxuXG4vLyBhcHBlbmRzIGNvbXBvbmVudCdzIGVsZW1lbnQgdG8gc2NvcGUgcGFyZW50LiBJZiBpdCB3YXMgYWxyZWR5IGluIERPTSBpdCB3aWxsIGJlIG1vdmVkXG5mdW5jdGlvbiBhcHBlbmRUb1Njb3BlUGFyZW50KCkge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLm93bmVyLmdldFNjb3BlUGFyZW50KCk7XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LmVsLmFwcGVuZENoaWxkKHRoaXMub3duZXIuZWwpO1xufVxuXG5cbi8qKlxuICogRG9tIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyB0aGUgbGlzdCBvZiBjaGlsZCBlbGVtZW50cyBvZiB0aGUgY29tcG9uZW50IGVsZW1lbnRcbiAqXG4gKiBAcmV0dXJuIHtBcnJheVtFbGVtZW50XX1cbiAqL1xuZnVuY3Rpb24gRG9tJGNoaWxkcmVuKCkge1xuICAgIHJldHVybiBkb21VdGlscy5jaGlsZHJlbih0aGlzLm93bmVyLmVsKTtcbn1cblxuXG52YXIgZmluZERpcmVjdGlvbnMgPSB7XG4gICAgJ3VwJzogJ3ByZXZpb3VzTm9kZScsXG4gICAgJ2Rvd24nOiAnbmV4dE5vZGUnXG59O1xuXG4vLyBGaW5kcyBjb21wb25lbnQgcGFzc2luZyBvcHRpb25hbCBpdGVyYXRvcidzIHRlc3Rcbi8vIGluIHRoZSBzYW1lIHNjb3BlIGFzIHRoZSBjdXJyZW50IGNvbXBvbmVudCAodGhpcylcbi8vIGJ5IHRyYXZlcnNpbmcgRE9NIHRyZWUgdXB3YXJkcyAoZGlyZWN0aW9uID0gXCJ1cFwiKVxuLy8gb3IgZG93bndhcmRzIChkaXJlY3Rpb24gPSBcImRvd25cIilcbmZ1bmN0aW9uIGZpbmQoZGlyZWN0aW9uLCBpdGVyYXRvcikge1xuICAgIGlmICghIGZpbmREaXJlY3Rpb25zLmhhc093blByb3BlcnR5KGRpcmVjdGlvbikpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW5jb3JyZWN0IGZpbmQgZGlyZWN0aW9uOiAnICsgZGlyZWN0aW9uKTtcblxuICAgIHZhciBlbCA9IHRoaXMub3duZXIuZWxcbiAgICAgICAgLCBzY29wZSA9IHRoaXMub3duZXIuc2NvcGVcbiAgICAgICAgLCB0cmVlV2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihzY29wZS5fcm9vdEVsLCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCk7XG5cbiAgICB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gZWw7XG4gICAgdmFyIG5leHROb2RlID0gdHJlZVdhbGtlcltmaW5kRGlyZWN0aW9uc1tkaXJlY3Rpb25dXSgpXG4gICAgICAgICwgY29tcG9uZW50c05hbWVzID0gT2JqZWN0LmtleXMoc2NvcGUpXG4gICAgICAgICwgZm91bmQgPSBmYWxzZTtcblxuICAgIHdoaWxlIChuZXh0Tm9kZSkge1xuICAgICAgICB2YXIgYXR0ciA9IG5ldyBCaW5kQXR0cmlidXRlKG5leHROb2RlKTtcbiAgICAgICAgaWYgKGF0dHIubm9kZSkge1xuICAgICAgICAgICAgYXR0ci5wYXJzZSgpLnZhbGlkYXRlKCk7XG4gICAgICAgICAgICBpZiAoc2NvcGUuaGFzT3duUHJvcGVydHkoYXR0ci5jb21wTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gc2NvcGVbYXR0ci5jb21wTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKCEgaXRlcmF0b3IgfHwgaXRlcmF0b3IoY29tcG9uZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gbmV4dE5vZGU7XG4gICAgICAgIG5leHROb2RlID0gdHJlZVdhbGtlcltmaW5kRGlyZWN0aW9uc1tkaXJlY3Rpb25dXSgpO1xuICAgIH1cblxuICAgIGlmIChmb3VuZCkgcmV0dXJuIGNvbXBvbmVudDtcbn1cblxuXG4vLyByZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgaGFzIHRleHQgYmVmb3JlIHNlbGVjdGlvblxuZnVuY3Rpb24gaGFzVGV4dEJlZm9yZVNlbGVjdGlvbigpIHtcbiAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICghIHNlbGVjdGlvbi5pc0NvbGxhcHNlZCkgcmV0dXJuIHRydWU7XG4gICAgXG4gICAgdmFyIHRleHQgPSBzZWxlY3Rpb24uZm9jdXNOb2RlICYmIHNlbGVjdGlvbi5mb2N1c05vZGUudGV4dENvbnRlbnQ7XG4gICAgdmFyIHN0YXJ0UG9zID0gdGV4dCAmJiB0ZXh0LmNoYXJBdCgwKSA9PSAnICcgPyAxIDogMDtcbiAgICBpZiAoc2VsZWN0aW9uLmFuY2hvck9mZnNldCAhPSBzdGFydFBvcykgcmV0dXJuIHRydWU7XG5cbiAgICAvLyB3YWxrIHVwIHRoZSBET00gdHJlZSB0byBjaGVjayBpZiB0aGVyZSBhcmUgdGV4dCBub2RlcyBiZWZvcmUgY3Vyc29yXG4gICAgdmFyIHRyZWVXYWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKHRoaXMub3duZXIuZWwsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcbiAgICB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGU7XG4gICAgdmFyIHByZXZOb2RlID0gdHJlZVdhbGtlci5wcmV2aW91c05vZGUoKTtcblxuICAgIHZhciBpc1RleHQgPSBwcmV2Tm9kZSA/ICFwcmV2Tm9kZS5ub2RlVmFsdWUudHJpbSgpID09ICcnIDogZmFsc2U7XG5cbiAgICByZXR1cm4gaXNUZXh0O1xufVxuXG5cbmZ1bmN0aW9uIGhhc1RleHRBZnRlclNlbGVjdGlvbigpIHtcbiAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICghIHNlbGVjdGlvbi5pc0NvbGxhcHNlZCkgcmV0dXJuIHRydWU7XG5cbiAgICB2YXIgdGV4dCA9IHNlbGVjdGlvbi5mb2N1c05vZGUgJiYgc2VsZWN0aW9uLmZvY3VzTm9kZS50ZXh0Q29udGVudDtcbiAgICB2YXIgc3RhcnRQb3MgPSB0ZXh0ICYmIHRleHQuY2hhckF0KHRleHQubGVuZ3RoLTEpID09ICcgJyA/IHNlbGVjdGlvbi5hbmNob3JOb2RlLmxlbmd0aC0xIDogc2VsZWN0aW9uLmFuY2hvck5vZGUubGVuZ3RoO1xuICAgIGlmIChzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0IDwgc3RhcnRQb3MpIHJldHVybiB0cnVlO1xuXG4gICAgLy8gd2FsayB1cCB0aGUgRE9NIHRyZWUgdG8gY2hlY2sgaWYgdGhlcmUgYXJlIHRleHQgbm9kZXMgYWZ0ZXIgY3Vyc29yXG4gICAgdmFyIHRyZWVXYWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKHRoaXMub3duZXIuZWwsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcbiAgICB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGU7XG4gICAgdmFyIG5leHROb2RlID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpO1xuICAgIFxuICAgIC8vVG8gY2FwdHVyZSB3aGVuIHRyZWV3YWxrZXIgZ2l2ZXMgdXMgYW4gZW1wdHkgdGV4dCBub2RlICh1bmtub3duIHJlYXNvbilcbiAgICB2YXIgaXNUZXh0ID0gbmV4dE5vZGUgPyAhbmV4dE5vZGUubm9kZVZhbHVlLnRyaW0oKSA9PSAnJyA6IGZhbHNlO1xuXG4gICAgcmV0dXJuIGlzVGV4dDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gPGEgbmFtZT1cImNvbXBvbmVudHMtZmFjZXRzLWRyYWdcIj48L2E+XG4vLyAjIyNkcmFnIGZhY2V0XG5cbnZhciBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIERPTUV2ZW50c1NvdXJjZSA9IHJlcXVpcmUoJy4uL21zZ19zcmMvZG9tX2V2ZW50cycpXG4gICAgLCBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIERyYWdEcm9wID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kcmFnZHJvcCcpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyO1xuXG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzLmdldCgnRHJhZycpYFxuICogRmFjZXQgZm9yIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgZHJhZ2dlZFxuICogRHJhZyBmYWNldCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczpcbiAqXG4gKiAgLSBtZXRhOiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzXG4gKiAgICAgIC0gcGFyYW1zOiBvYmplY3Qgb2Yga2V5LXZhbHVlIHBhaXJzIHRoYXQgd2lsbCBiZSBwYXNzZWQgaW4gbWV0YWRhdGEgZGF0YSB0eXBlIChjYW4gYWxzbyBiZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0aGF0IHJldHVybnMgdGhpcyBvYmplY3QpLiBTZWUgY29uZmlnLmRyYWdEcm9wLmRhdGFUeXBlcy5jb21wb25lbnRNZXRhVGVtcGxhdGVcbiAqICAgICAgLSBkYXRhOiBkYXRhIHRoYXQgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIGFib3ZlIG1ldGEgZGF0YSB0eXBlIChvciBmdW5jdGlvbilcbiAqICAtIGFsbG93ZWRFZmZlY3RzOiBzdHJpbmcgKG9yIGZ1bmN0aW9uKSBhcyBzcGVjaWZpZWQgaGVyZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9EcmFnRHJvcC9EcmFnX09wZXJhdGlvbnMjZHJhZ3N0YXJ0XG4gKiAgLSBkcmFnSW1hZ2U6XG4gKiAgICAgIC0gdXJsOiBwYXRoIHRvIGltYWdlIHRvIGRpc3BsYXkgd2hlbiBkcmFnZ2luZywgaW5zdGVhZCBvZiB0aGUgb3duZXIgZWxlbWVudFxuICogICAgICAtIHg6IHggb2Zmc2V0IGZvciB0aGUgaW1hZ2VcbiAqICAgICAgLSB5OiB5IG9mZnNldCBmb3IgdGhlIGltYWdlXG4gKiAgLSBkcmFnQ2xzOiBDU1MgY2xhc3MgdG8gYXBwbHkgdG8gdGhlIGNvbXBvbmVudCBiZWluZyBkcmFnZ2VkXG4gKiAgLSBkYXRhVHlwZXM6IG1hcCBvZiBhZGRpdGlvbmFsIGRhdGEgdHlwZXMgdGhlIGNvbXBvbmVudCB3aWxsIHN1cHBseSB0byBkYXRhIHRyYW5zZmVyIG9iamVjdCwga2V5IGlzIGRhdGEgdHlwZSwgdmFsdWUgaXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgaXQsIGNvbXBvbmVudCB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgY29udGV4dCB0byB0aGlzIGZ1bmN0aW9uXG4gKlxuICogSWYgZnVuY3Rpb24gaXMgc3BlY2lmaWVkIGluIGFueSBwYXJhbWV0ZXIgaXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgY29tcG9uZW50IGFzIHRoZSBjb250ZXh0XG4gKi9cbnZhciBEcmFnID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0RyYWcnKTtcblxuXy5leHRlbmRQcm90byhEcmFnLCB7XG4gICAgaW5pdDogRHJhZyRpbml0LFxuICAgIHN0YXJ0OiBEcmFnJHN0YXJ0LFxuICAgIHNldEhhbmRsZTogRHJhZyRzZXRIYW5kbGVcbn0pO1xuXG5mYWNldHNSZWdpc3RyeS5hZGQoRHJhZyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRHJhZztcblxuXG5mdW5jdGlvbiBEcmFnJGluaXQoKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgICBcblxuICAgIHRoaXMuX2NyZWF0ZU1lc3NhZ2VTb3VyY2VXaXRoQVBJKERPTUV2ZW50c1NvdXJjZSk7XG4gICAgdGhpcy5fZHJhZ0RhdGEgPSB7fTtcblxuICAgIHZhciBkYXRhVHlwZUluZm8gPSB0aGlzLmNvbmZpZy5fZGF0YVR5cGVJbmZvIHx8ICcnO1xuICAgIHRoaXMuX2RhdGFUeXBlSW5mbyA9IHR5cGVvZiBkYXRhVHlwZUluZm8gPT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZGF0YVR5cGVJbmZvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmdW5jdGlvbigpIHsgcmV0dXJuIGRhdGFUeXBlSW5mbzsgfTtcbn1cblxuXG4vKipcbiAqIERyYWcgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTZXRzIHRoZSBkcmFnIGhhbmRsZSBlbGVtZW50IG9mIGNvbXBvbmVudC4gVGhpcyBlbGVtZW50IGhhcyB0byBiZSBkcmFnZ2VkIGZvciB0aGUgY29tcG9uZW50IHRvIGJlIGRyYWdnZWQuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBoYW5kbGVFbFxuICovXG5mdW5jdGlvbiBEcmFnJHNldEhhbmRsZShoYW5kbGVFbCkge1xuICAgIGlmICghIHRoaXMub3duZXIuZWwuY29udGFpbnMoaGFuZGxlRWwpKVxuICAgICAgICByZXR1cm4gbG9nZ2VyLndhcm4oJ2RyYWcgaGFuZGxlIHNob3VsZCBiZSBpbnNpZGUgZWxlbWVudCB0byBiZSBkcmFnZ2VkJylcbiAgICB0aGlzLl9kcmFnSGFuZGxlID0gaGFuZGxlRWw7XG59XG5cblxuZnVuY3Rpb24gRHJhZyRzdGFydCgpIHtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuc3RhcnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBfYWRkRHJhZ0F0dHJpYnV0ZS5jYWxsKHRoaXMpO1xuICAgIF9jcmVhdGVEcmFnSW1hZ2UuY2FsbCh0aGlzKTtcblxuICAgIHRoaXMub25NZXNzYWdlcyh7XG4gICAgICAgICdtb3VzZWRvd24nOiBvbk1vdXNlRG93bixcbiAgICAgICAgJ21vdXNlZW50ZXIgbW91c2VsZWF2ZSBtb3VzZW1vdmUnOiBvbk1vdXNlTW92ZW1lbnQsXG4gICAgICAgICdkcmFnc3RhcnQnOiBvbkRyYWdTdGFydCxcbiAgICAgICAgJ2RyYWcnOiBvbkRyYWdnaW5nLFxuICAgICAgICAnZHJhZ2VuZCc6IG9uRHJhZ0VuZFxuICAgIH0pO1xuXG4gICAgdGhpcy5vd25lci5vbk1lc3NhZ2VzKHtcbiAgICAgICAgJ2dldHN0YXRlc3RhcnRlZCc6XG4gICAgICAgICAgICB7IHN1YnNjcmliZXI6IF9yZW1vdmVEcmFnQXR0cmlidXRlLCBjb250ZXh0OiB0aGlzIH0sXG4gICAgICAgICdnZXRzdGF0ZWNvbXBsZXRlZCc6XG4gICAgICAgICAgICB7IHN1YnNjcmliZXI6IF9hZGREcmFnQXR0cmlidXRlLCBjb250ZXh0OiB0aGlzIH1cbiAgICB9KTtcbn1cblxuXG4vKipcbiAqIEFkZHMgZHJhZ2dhYmxlIGF0dHJpYnV0ZSB0byBjb21wb25lbnQncyBlbGVtZW50XG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gX2FkZERyYWdBdHRyaWJ1dGUoKSB7XG4gICAgaWYgKHRoaXMub3duZXIuZWwpXG4gICAgICAgIHRoaXMub3duZXIuZWwuc2V0QXR0cmlidXRlKCdkcmFnZ2FibGUnLCB0cnVlKTtcbn1cblxuXG5mdW5jdGlvbiBfcmVtb3ZlRHJhZ0F0dHJpYnV0ZSgpIHtcbiAgICBpZiAodGhpcy5vd25lci5lbClcbiAgICAgICAgdGhpcy5vd25lci5lbC5yZW1vdmVBdHRyaWJ1dGUoJ2RyYWdnYWJsZScpO1xufVxuXG5cbmZ1bmN0aW9uIF9jcmVhdGVEcmFnSW1hZ2UoKSB7XG4gICAgdmFyIGRyYWdJbWFnZSA9IHRoaXMuY29uZmlnLmRyYWdJbWFnZTtcbiAgICBpZiAoZHJhZ0ltYWdlKSB7XG4gICAgICAgIHRoaXMuX2RyYWdFbGVtZW50ID0gbmV3IEltYWdlKCk7XG4gICAgICAgIHRoaXMuX2RyYWdFbGVtZW50LnNyYyA9IGRyYWdJbWFnZS51cmw7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIG9uTW91c2VEb3duKGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAgICB0aGlzLl9fbW91c2VEb3duVGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIGlmICh0YXJnZXRJbkRyYWdIYW5kbGUuY2FsbCh0aGlzKSkge1xuICAgICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkuZW1wdHkoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIG9uTW91c2VNb3ZlbWVudChldmVudFR5cGUsIGV2ZW50KSB7XG4gICAgdmFyIHNob3VsZEJlRHJhZ2dhYmxlID0gdGFyZ2V0SW5EcmFnSGFuZGxlLmNhbGwodGhpcyk7XG4gICAgdGhpcy5vd25lci5lbC5zZXRBdHRyaWJ1dGUoJ2RyYWdnYWJsZScsIHNob3VsZEJlRHJhZ2dhYmxlKTtcbiAgICBpZiAoZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoJ2RhdGEtZHJhZ0VuYWJsZUV2ZW50JykgIT0gJ2ZhbHNlJylcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG59XG5cblxuZnVuY3Rpb24gb25EcmFnU3RhcnQoZXZlbnRUeXBlLCBldmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9mZiB8fCAhIHRhcmdldEluRHJhZ0hhbmRsZS5jYWxsKHRoaXMpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZHJhZ0ltYWdlID0gdGhpcy5jb25maWcuZHJhZ0ltYWdlO1xuICAgIGlmIChkcmFnSW1hZ2UpXG4gICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5zZXREcmFnSW1hZ2UodGhpcy5fZHJhZ0VsZW1lbnQsIGRyYWdJbWFnZS54IHx8IDAsIGRyYWdJbWFnZS55IHx8IDApO1xuXG4gICAgdmFyIG93bmVyID0gdGhpcy5vd25lcjtcbiAgICB2YXIgZHQgPSBuZXcgRHJhZ0Ryb3AoZXZlbnQpO1xuXG4gICAgdGhpcy5fZHJhZ0RhdGEgPSBkdC5zZXRDb21wb25lbnRTdGF0ZShvd25lcik7XG4gICAgc2V0TWV0YS5jYWxsKHRoaXMpO1xuICAgIHNldEFkZGl0aW9uYWxEYXRhVHlwZXMuY2FsbCh0aGlzKTtcbiAgICBfc2V0QWxsb3dlZEVmZmVjdHMuY2FsbCh0aGlzLCBkdCk7XG5cbiAgICBpZiAodGhpcy5jb25maWcuZHJhZ0NscylcbiAgICAgICAgdGhpcy5vd25lci5lbC5jbGFzc0xpc3QudG9nZ2xlKHRoaXMuY29uZmlnLmRyYWdDbHMsIHRydWUpO1xuXG4gICAgRHJhZ0Ryb3Auc2VydmljZS5wb3N0TWVzc2FnZVN5bmMoJ2RyYWdkcm9wc3RhcnRlZCcsIHtcbiAgICAgICAgZXZlbnRUeXBlOiAnZHJhZ3N0YXJ0JyxcbiAgICAgICAgZHJhZ0Ryb3A6IGR0LFxuICAgICAgICBkcmFnRmFjZXQ6IHRoaXNcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHNldE1ldGEoKSB7XG4gICAgICAgIHZhciBwYXJhbXMgPSBnZXRNZXRhRGF0YS5jYWxsKHRoaXMsICdwYXJhbXMnKVxuICAgICAgICAgICAgLCBkYXRhID0gZ2V0TWV0YURhdGEuY2FsbCh0aGlzLCAnZGF0YScpO1xuXG4gICAgICAgIHRoaXMuX2RyYWdNZXRhRGF0YVR5cGUgPSBkdC5zZXRDb21wb25lbnRNZXRhKG93bmVyLCBwYXJhbXMsIGRhdGEpO1xuICAgICAgICB0aGlzLl9kcmFnTWV0YURhdGEgPSBkYXRhO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldE1ldGFEYXRhKHByb3BlcnR5KSB7XG4gICAgICAgIHRyeSB7IHZhciBmdW5jID0gdGhpcy5jb25maWcubWV0YVtwcm9wZXJ0eV07IH0gY2F0Y2goZSkge31cbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jID09ICdzdHJpbmcnKSBmdW5jID0gb3duZXJbZnVuY107XG4gICAgICAgIHJldHVybiBfLnJlc3VsdChmdW5jLCBvd25lcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0QWRkaXRpb25hbERhdGFUeXBlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmRhdGFUeXBlcykge1xuICAgICAgICAgICAgdGhpcy5fZGF0YVR5cGVzRGF0YSA9IF8ubWFwS2V5cyh0aGlzLmNvbmZpZy5kYXRhVHlwZXMsIGZ1bmN0aW9uIChnZXREYXRhRnVuYywgZGF0YVR5cGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGdldERhdGFGdW5jLmNhbGwodGhpcy5vd25lciwgZGF0YVR5cGUpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PSAnb2JqZWN0JykgZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhKSBkdC5zZXREYXRhKGRhdGFUeXBlLCBkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgIH0sIHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIG9uRHJhZ2dpbmcoZXZlbnRUeXBlLCBldmVudCkge1xuICAgIGlmIChfZHJhZ0lzRGlzYWJsZWQuY2FsbCh0aGlzLCBldmVudCkpIHJldHVybjtcblxuICAgIHZhciBkdCA9IG5ldyBEcmFnRHJvcChldmVudCk7XG4gICAgZHQuc2V0Q29tcG9uZW50U3RhdGUodGhpcy5vd25lciwgdGhpcy5fZHJhZ0RhdGEpO1xuICAgIGR0LnNldERhdGEodGhpcy5fZHJhZ01ldGFEYXRhVHlwZSwgdGhpcy5fZHJhZ01ldGFEYXRhKTtcbiAgICBpZiAodGhpcy5fZGF0YVR5cGVzRGF0YSkge1xuICAgICAgICBfLmVhY2hLZXkodGhpcy5fZGF0YVR5cGVzRGF0YSwgZnVuY3Rpb24oZGF0YSwgZGF0YVR5cGUpIHtcbiAgICAgICAgICAgIGlmIChkYXRhKSBkdC5zZXREYXRhKGRhdGFUeXBlLCBkYXRhKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3NldEFsbG93ZWRFZmZlY3RzLmNhbGwodGhpcywgZHQpO1xufVxuXG5cbmZ1bmN0aW9uIG9uRHJhZ0VuZChldmVudFR5cGUsIGV2ZW50KSB7XG4gICAgaWYgKF9kcmFnSXNEaXNhYmxlZC5jYWxsKHRoaXMsIGV2ZW50KSkgcmV0dXJuO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLmRyYWdDbHMpXG4gICAgICAgIHRoaXMub3duZXIuZWwuY2xhc3NMaXN0LnRvZ2dsZSh0aGlzLmNvbmZpZy5kcmFnQ2xzLCBmYWxzZSk7XG5cbiAgICB2YXIgZHQgPSBuZXcgRHJhZ0Ryb3AoZXZlbnQpO1xuICAgIERyYWdEcm9wLnNlcnZpY2UucG9zdE1lc3NhZ2VTeW5jKCdjb21wbGV0ZWRyYWdkcm9wJywge1xuICAgICAgICBldmVudFR5cGU6ICdkcmFnZW5kJyxcbiAgICAgICAgZHJhZ0Ryb3A6IGR0LFxuICAgICAgICBkcmFnRmFjZXQ6IHRoaXNcbiAgICB9KTtcbn1cblxuXG5mdW5jdGlvbiBfc2V0QWxsb3dlZEVmZmVjdHMoRHJhZ0Ryb3ApIHtcbiAgICB2YXIgZWZmZWN0cyA9IF8ucmVzdWx0KHRoaXMuY29uZmlnLmFsbG93ZWRFZmZlY3RzLCB0aGlzLm93bmVyKTtcbiAgICBEcmFnRHJvcC5zZXRBbGxvd2VkRWZmZWN0cyhlZmZlY3RzKTtcbn1cblxuXG5mdW5jdGlvbiB0YXJnZXRJbkRyYWdIYW5kbGUoKSB7XG4gICAgcmV0dXJuICEgdGhpcy5fZHJhZ0hhbmRsZSB8fCB0aGlzLl9kcmFnSGFuZGxlLmNvbnRhaW5zKHRoaXMuX19tb3VzZURvd25UYXJnZXQpO1xufVxuXG5cbmZ1bmN0aW9uIF9kcmFnSXNEaXNhYmxlZChldmVudCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5vZmYpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gPGEgbmFtZT1cImNvbXBvbmVudHMtZmFjZXRzLWRyb3BcIj48L2E+XG4vLyAjIyNkcm9wIGZhY2V0XG5cbnZhciBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIERPTUV2ZW50c1NvdXJjZSA9IHJlcXVpcmUoJy4uL21zZ19zcmMvZG9tX2V2ZW50cycpXG4gICAgLCBEcm9wTXNnQVBJID0gcmVxdWlyZSgnLi4vbXNnX2FwaS9kcm9wJylcbiAgICAsIERyYWdEcm9wID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kcmFnZHJvcCcpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzLmdldCgnRHJvcCcpYFxuICogRmFjZXQgZm9yIGNvbXBvbmVudHMgdGhhdCBjYW4gYWNjZXB0IGRyb3BzXG4gKiBEcm9wIGZhY2V0IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzOlxuICpcbiAqICAtIGFsbG93IC0gYW4gb2JqZWN0IHRoYXQgd2lsbCBkZWZpbmUgYWxsb3dlZCBkYXRhIHR5cGVzIGR1cmluZyBkcmFnIChgZHJhZ2VudGVyYCBhbmQgYGRyYWdvdmVyYCBldmVudHMpIHdpdGggdGhlc2UgcHJvcGVydGllczpcbiAqICAgICAgLSBjb21wb25lbnRzOiBgdHJ1ZWAgYnkgZGVmYXVsdCAoYWxsIGNvbXBvbmVudHMgd2lsbCBiZSBhY2NlcHRlZClcbiAqICAgICAgICAgICAgICAgICAgICAgICAgT1Igc3RyaW5nIHdpdGggYWxsb3dlZCBjb21wb25lbnQgY2xhc3NcbiAqICAgICAgICAgICAgICAgICAgICAgICAgT1IgbGlzdCBvZiBhbGxvd2VkIGNvbXBvbmVudHMgY2xhc3NlcyAoc3RyaW5ncylcbiAqICAgICAgICAgICAgICAgICAgICAgICAgT1IgbWFwIHdpdGggYWxsb3dlZCBjbGFzc2VzIGluIGtleXMgYW5kIGB0cnVlYC90ZXN0IGZ1bmN0aW9ucyBpbiB2YWx1ZXNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgT1IgdGVzdCBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgcGFzc2VkIG9iamVjdCBkZWZpbmVkIGJlbG93XG4gKiAgICAgICAgICAgICAgICAgICAgICAgIE9SIGBmYWxzZWAgdG8gTk9UIGFjY2VwdCBjb21wb25lbnRzXG4gKiAgICAgIC0gZGF0YVR5cGVzOiAgYGZhbHNlYCBieSBkZWZhdWx0IChubyBvdGhlciBkYXRhIHR5cGVzIHdpbGwgYmUgYWNjZXB0ZWQpXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIE9SIHN0cmluZyB3aXRoIGFsbG93ZWQgZGF0YSB0eXBlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIE9SIGxpc3Qgb2YgYWRkaXRpb25hbCBkYXRhIHR5cGVzIHRoYXQgYSBkcm9wIHRhcmdldCB3b3VsZCBhY2NlcHRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgT1IgdGVzdCBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgcGFzc2VkIERyYWdEcm9wIG9iamVjdFxuICogICAgICAgICAgICAgICAgICAgICAgICBPUiBgdHJ1ZWAgdG8gYWNjZXB0IGFsbCBkYXRhIHR5cGVzXG4gKiAgICAgIC0gY2hlY2tQYXJlbnQ6IGBmYWxzZWAgYnkgZGVmYXVsdFxuICogICAgICAgICAgICAgICAgICAgICAgICBPUiBgdHJ1ZWAgd2lsbCBjYWxsIHBhcmVudCBjb21wb25lbnQgZHJvcCBhbGxvdyB0byBjaGVjayBpZiBwYXJlbnQgY29tcG9uZW50IHdpbGwgYWNjZXB0IHRoZSBjb21wb25lbnRcbiAqICAgICAgSWYgdGVzdCBmdW5jdGlvbnMgYXJlIHVzZWQsIHRoZXkgc2hvdWxkIHJldHVybiBib29sZWFuLiBFYWNoIHRlc3QgZnVuY3Rpb24gY2FuIGFsc28gc2V0IGRyb3AgZWZmZWN0IGFzIGRlZmluZWQgaGVyZTpcbiAqICAgICAgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RhdGFUcmFuc2ZlciNkcm9wRWZmZWN0LjI4LjI5XG4gKiAgICAgIFNldHRpbmcgZHJvcCBlZmZlY3QgdGhhdCBpcyBub3QgYWxsb3dlZCBieSBkcmFnZ2VkIG9iamVjdCB3aWxsIHByZXZlbnQgZHJvcC5cbiAqICAgICAgVGVzdCBmdW5jdGlvbnMgZm9yIGNvbXBvbmVudHMgd2lsbCBiZSBwYXNzZWQgdGhlIG93bmVyIG9mIERyb3AgZmFjZXQgYXMgY29udGV4dCwgdGhlIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgcHJvcGVydGllcyBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyOlxuICogICAgICAgICAgY29tcENsYXNzIC0gbmFtZSBvZiBjb21wb25lbnQgY2xhc3MgYXMgc3RvcmVkIGluIHJlZ2lzdHJ5XG4gKiAgICAgICAgICBjb21wTmFtZSAtIG5hbWUgb2YgY29tcG9uZW50IChhbGwgbG93ZXJjYXNlKVxuICogICAgICAgICAgcGFyYW1zIC0gcGFyYW1ldGVycyBhcyBlbmNvZGVkIGluIGRhdGFUeXBlLCBwYXNzZWQgdG8gYG1pbG8udXRpbC5kcmFnRHJvcC5zZXRDb21wb25lbnRNZXRhYCBieSBEcmFnIGZhY2V0XG4gKiAgICAgICAgICBtZXRhRGF0YVR5cGUgLSBkYXRhIHR5cGUgb2YgdGhlIGRhdGEgdGhhdCBoYXMgY29tcENsYXNzLCBjb21wTmFtZSBhbmQgcGFyYW1zIGVuY29kZWRcbiAqXG4gKiAgICAgIC4uLiBhbmQgRHJhZ0Ryb3AgaW5zdGFuY2UgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXJcbiAqXG4gKiAgICAgIFRlc3QgZnVuY3Rpb24gZm9yIG90aGVyIGRhdGEgdHlwZXMgd2lsbCBiZSBwYXNzZWQgdGhlIG93bmVyIG9mIERyb3AgZmFjZXQgYXMgY29udGV4dCBhbmQgRHJhZ0Ryb3AgaW5zdGFuY2UgYXMgdGhlIGZpcnN0IHBhcmFtZXRlclxuICpcbiAqICMjIyNFdmVudHMjIyMjXG4gKlxuICogSW4gYWRkaXRpb24gdG8gY29uZmlndXJpbmcgYWxsb3dlZCBjb21wb25lbnRzIGFuZCBkYXRhIHR5cGVzLCBjb21wb25lbnRzIGNsYXNzZXMgc2hvdWxkIHN1YnNjcmliZSB0byBldmVudHMuXG4gKiBBdCB0aGUgdmVyeSBsZWFzdCwgdGhleSBzaG91bGQgc3Vic2NyaWJlIHRvIGBkcm9wYCBldmVudC5cbiAqXG4gKiBEcm9wIGZhY2V0IGVtaXRzIGRyYWdpbi9kcmFnb3V0IG1lc3NhZ2VzIHRoYXQgYXJlIGVtaXR0ZWQgd2hlbmV2ZXIgYWN0dWFsIGNvbXBvbmVudCBlbGVtZW50IGlzIGVudGVyZWQgb3IgbGVmdFxuICogKHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIGRyYWdlbnRlciBhbmQgZHJhZ2xlYXZlIG1lc3NhZ2VzIHRoYXQgYXJlIGVtaXR0ZWQgd2hlbmV2ZXIgYW55IGNoaWxkIGVsZW1lbnQgaXMgZW50ZXJlZCBvciBsZWZ0LCBhcyBsb25nIGFzIGV2ZW50IGJ1YmJsZXMgdXApXG4gKiBJZiBjaGlsZCBjb21wb25lbnQgaGFzIGRyb3AgZmFjZXQgYXR0YWNoZWQsIGRyYWdvdXQgd2lsbCBiZSBlbWl0dGVkIG9uIHRoZSBjdXJyZW50IGNvbXBvbmVudCB3aGVuIHRoZSBjaGlsZCBpcyBlbnRlcmVkLlxuICpcbiAqIFlvdSBjYW4gc2VlIHRoZSBkZW1vbnN0cmF0aW9uIG9mIHdoZW4gbWVzc2FnZXMgYXJlIGVtaXR0ZWQgW2hlcmVdKGh0dHA6Ly9qc2Jpbi5jb20vYnVxb3YvNilcbiAqIFxuICovXG52YXIgRHJvcCA9IF8uY3JlYXRlU3ViY2xhc3MoQ29tcG9uZW50RmFjZXQsICdEcm9wJyk7XG5cblxuXy5leHRlbmRQcm90byhEcm9wLCB7XG4gICAgaW5pdDogRHJvcCRpbml0LFxuICAgIHN0YXJ0OiBEcm9wJHN0YXJ0XG4gICAgLy8gX3JlYXR0YWNoOiBfcmVhdHRhY2hFdmVudHNPbkVsZW1lbnRDaGFuZ2Vcbn0pO1xuXG5mYWNldHNSZWdpc3RyeS5hZGQoRHJvcCk7XG5cbm1vZHVsZS5leHBvcnRzID0gRHJvcDtcblxuXG5mdW5jdGlvbiBEcm9wJGluaXQoKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLl9jcmVhdGVNZXNzYWdlU291cmNlV2l0aEFQSShET01FdmVudHNTb3VyY2UsIG5ldyBEcm9wTXNnQVBJKTtcbn1cblxuXG5mdW5jdGlvbiBEcm9wJHN0YXJ0KCkge1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5zdGFydC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMub3duZXIuZWwuY2xhc3NMaXN0LmFkZCgnY2MtbW9kdWxlLXJlbGF0aXZlJyk7XG4gICAgdGhpcy5vbk1lc3NhZ2VzKHtcbiAgICAgICAgJ2RyYWdlbnRlciBkcmFnb3Zlcic6IG9uRHJhZ2dpbmcsXG4gICAgICAgICdkcm9wJzogb25Ecm9wLFxuICAgICAgICAnZHJhZ2VudGVyIGRyYWdvdmVyIGRyYWdsZWF2ZSBkcm9wIGRyYWdpbiBkcmFnb3V0JzogcG9zdFRvU2VydmljZVxuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIG9uRHJhZ2dpbmcoZXZlbnRUeXBlLCBldmVudCkge1xuICAgIHZhciBkdCA9IG5ldyBEcmFnRHJvcChldmVudCk7XG5cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgaWYgKCEgX2hhbmRsZURyb3BEZXBlbmRlbmN5LmNhbGwodGhpcywgZHQpKVxuICAgICAgICBkdC5zZXREcm9wRWZmZWN0KCdub25lJyk7XG59XG5cblxuZnVuY3Rpb24gb25Ecm9wKGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB2YXIgZHQgPSBuZXcgRHJhZ0Ryb3AoZXZlbnQpO1xuICAgIERyYWdEcm9wLnNlcnZpY2UucG9zdE1lc3NhZ2VTeW5jKCdkcmFnZHJvcGNvbXBsZXRlZCcsIHtcbiAgICAgICAgZXZlbnRUeXBlOiAnZHJvcCcsXG4gICAgICAgIGRyYWdEcm9wOiBkdCxcbiAgICAgICAgZHJvcEZhY2V0OiB0aGlzLFxuICAgICAgICBjb21wb25lbnQ6IHRoaXMub3duZXJcbiAgICB9KTtcbn1cblxuXG5mdW5jdGlvbiBwb3N0VG9TZXJ2aWNlKGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAgICBEcmFnRHJvcC5zZXJ2aWNlLnBvc3RNZXNzYWdlU3luYyhldmVudFR5cGUsIHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICBkcm9wRmFjZXQ6IHRoaXMsXG4gICAgICAgIGNvbXBvbmVudDogdGhpcy5vd25lclxuICAgIH0pO1xufVxuXG5cbnZhciBfaGFuZGxlRHJvcERlcGVuZGVuY3kgPSBfLnRocm90dGxlKF9oYW5kbGVEcm9wRGVwZW5kZW5jeU5vdGhyb3R0bGUsIDUwKTtcbmZ1bmN0aW9uIF9oYW5kbGVEcm9wRGVwZW5kZW5jeU5vdGhyb3R0bGUoZHQsIG9yaWdpbmFsRHJvcENvbXBvbmVudCkge1xuICAgIHZhciBhbGxvdyA9IHRoaXMuY29uZmlnLmFsbG93XG4gICAgICAgICwgcGFyZW50QWxsb3dlZCA9IHRydWU7XG5cbiAgICBvcmlnaW5hbERyb3BDb21wb25lbnQgPSBvcmlnaW5hbERyb3BDb21wb25lbnQgfHwgdGhpcy5vd25lcjtcblxuICAgIGlmIChhbGxvdyAmJiBhbGxvdy5jaGVja1BhcmVudCkge1xuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5vd25lci5nZXRTY29wZVBhcmVudCgnRHJvcCcpO1xuICAgICAgICBpZiAocGFyZW50KVxuICAgICAgICAgICAgcGFyZW50QWxsb3dlZCA9IF9oYW5kbGVEcm9wRGVwZW5kZW5jeU5vdGhyb3R0bGUuY2FsbChwYXJlbnQuZHJvcCwgZHQsIG9yaWdpbmFsRHJvcENvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmVudEFsbG93ZWQgJiYgX2lzRHJvcEFsbG93ZWQuY2FsbCh0aGlzLCBkdCwgb3JpZ2luYWxEcm9wQ29tcG9uZW50KTtcbn1cblxuXG4vKipcbiAqIENoZWNrcyBpZiBkcm9wIGlzIGFsbG93ZWQgYmFzZWQgb24gZmFjZXQgY29uZmlndXJhdGlvbiAoc2VlIGFib3ZlKVxuICogXG4gKiBAcGFyYW0ge0RyYWdEcm9wfSBkdFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gX2lzRHJvcEFsbG93ZWQoZHQsIG9yaWdpbmFsRHJvcENvbXBvbmVudCkge1xuICAgIHZhciBhbGxvdyA9IHRoaXMuY29uZmlnLmFsbG93O1xuXG4gICAgaWYgKGR0LmlzQ29tcG9uZW50KCkpIHtcbiAgICAgICAgdmFyIGFsbG93Q29tcHMgPSBhbGxvdyAmJiBhbGxvdy5jb21wb25lbnRzXG4gICAgICAgICAgICAsIG1ldGEgPSBkdC5nZXRDb21wb25lbnRNZXRhKCk7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlb2YgYWxsb3dDb21wcykge1xuICAgICAgICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgICAgIHJldHVybiBhbGxvd0NvbXBzO1xuICAgICAgICAgICAgLy8gY29tcG9uZW50IGNsYXNzXG4gICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgIHJldHVybiBtZXRhICYmIG1ldGEuY29tcENsYXNzID09IGFsbG93Q29tcHM7XG4gICAgICAgICAgICAvLyB0ZXN0IGZ1bmN0aW9uXG4gICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFsbG93Q29tcHMuY2FsbCh0aGlzLm93bmVyLCBtZXRhLCBkdCwgb3JpZ2luYWxEcm9wQ29tcG9uZW50KTtcbiAgICAgICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYWxsb3dDb21wcykpXG4gICAgICAgICAgICAgICAgICAgIC8vIGxpc3Qgb2YgYWxsb3dlZCBjbGFzc2VzXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGxvd0NvbXBzLmluZGV4T2YobWV0YSAmJiBtZXRhLmNvbXBDbGFzcykgPj0gMDtcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbWFwIG9mIGNsYXNzOiBib29sZWFufHRlc3QgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgdmFyIHRlc3QgPSBhbGxvd0NvbXBzW21ldGEgJiYgbWV0YS5jb21wQ2xhc3NdO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gISEgXy5yZXN1bHQodGVzdCwgdGhpcy5vd25lciwgbWV0YSwgZHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbmNvcnJlY3QgYWxsb3dlZCBjb21wb25lbnRzIGluIGNvbmZpZycpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGRhdGFUeXBlcyA9IGFsbG93ICYmIGFsbG93LmRhdGFUeXBlc1xuICAgICAgICBzd2l0Y2ggKHR5cGVvZiBkYXRhVHlwZXMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gZHQudHlwZXMuaW5kZXhPZihkYXRhVHlwZXMpID49IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPIHRlc3QgZm9yIG90aGVyIGRhdGEgdHlwZXNcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY2ZfcmVnaXN0cnknKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyXG4gICAgLCBET01FdmVudHNTb3VyY2UgPSByZXF1aXJlKCcuLi9tc2dfc3JjL2RvbV9ldmVudHMnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzLmdldCgnRXZlbnRzJylgXG4gKiBDb21wb25lbnQgZmFjZXQgdGhhdCBtYW5hZ2VzIHN1YnNjcmlwdGlvbnMgdG8gRE9NIGV2ZW50cyB1c2luZyBbTWVzc2VuZ2VyXSguLi8uLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCkgd2l0aCBbRE9NRXZlbnRzU291cmNlXSguLi9tc2dfc3JjL2RvbV9ldmVudHMuanMuaHRtbCkuXG4gKiBBbGwgcHVibGljIG1ldGhvZHMgb2YgTWVzc2VuZ2VyIGFuZCBgdHJpZ2dlcmAgbWV0aG9kIG9mIFtET01FdmVudHNTb3VyY2VdKC4uL21zZ19zcmMvZG9tX2V2ZW50cy5qcy5odG1sKSBhcmUgcHJveGllZCBkaXJlY3RseSB0byB0aGlzIGZhY2V0LlxuICogRm9yIGV4YW1wbGUsIHRvIHN1YnNjcmliZSB0byBgY2xpY2tgIGV2ZW50IHVzZTpcbiAqIGBgYFxuICogY29tcG9uZW50LmZyYW1lLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkge1xuICogICAgIC8vIC4uLlxuICogfSk7XG4gKiBgYGBcbiAqIFNlZSBbTWVzc2VuZ2VyXSguLi8uLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbClcbiAqL1xudmFyIEV2ZW50cyA9IF8uY3JlYXRlU3ViY2xhc3MoQ29tcG9uZW50RmFjZXQsICdFdmVudHMnKTtcblxuXG4vKipcbiAqICMjIyNFdmVudHMgZmFjZXQgaW5zdGFuY2UgbWV0aG9kcyMjIyNcbiAqXG4gKiAtIFtpbml0XSgjRXZlbnRzJGluaXQpIC0gY2FsbGVkIGJ5IGNvbnN0cnVjdG9yIGF1dG9tYXRpY2FsbHlcbiAqL1xuXy5leHRlbmRQcm90byhFdmVudHMsIHtcbiAgICBpbml0OiBFdmVudHMkaW5pdFxuICAgIC8vIF9yZWF0dGFjaDogX3JlYXR0YWNoRXZlbnRzT25FbGVtZW50Q2hhbmdlXG59KTtcblxuZmFjZXRzUmVnaXN0cnkuYWRkKEV2ZW50cyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRzO1xuXG5cbi8qKlxuICogRXhwb3NlIERPTUV2ZW50c1NvdXJjZSB0cmlnZ2VyIG1ldGhvZCBvbiBFdmVudHMgcHJvdG90eXBlXG4gKi9cbnZhciBNU0dfU09VUkNFX0tFWSA9ICdfZG9tRXZlbnRzU291cmNlJ1xuRE9NRXZlbnRzU291cmNlLnVzZVdpdGgoRXZlbnRzLCBNU0dfU09VUkNFX0tFWSwgWyd0cmlnZ2VyJ10pO1xuXG5cbi8qKlxuICogRXZlbnRzIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogSW5pdGlhbHplcyBmYWNldCwgY29ubmVjdHMgRE9NRXZlbnRzU291cmNlIHRvIGZhY2V0J3MgbWVzc2VuZ2VyXG4gKi9cbmZ1bmN0aW9uIEV2ZW50cyRpbml0KCkge1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB2YXIgZG9tRXZlbnRzU291cmNlID0gbmV3IERPTUV2ZW50c1NvdXJjZSh0aGlzLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdGhpcy5vd25lcik7XG4gICAgdGhpcy5fc2V0TWVzc2FnZVNvdXJjZShkb21FdmVudHNTb3VyY2UpO1xuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgTVNHX1NPVVJDRV9LRVksIGRvbUV2ZW50c1NvdXJjZSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY2ZfcmVnaXN0cnknKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyXG4gICAgLCBGcmFtZU1lc3NhZ2VTb3VyY2UgPSByZXF1aXJlKCcuLi9tc2dfc3JjL2ZyYW1lJylcbiAgICAsIGRvbUV2ZW50c0NvbnN0cnVjdG9ycyA9IHJlcXVpcmUoJy4uLy4uL3NlcnZpY2VzL2RlX2NvbnN0cnMnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzLmdldCgnRnJhbWUnKWBcbiAqIENvbXBvbmVudCBmYWNldCB0aGF0IHNpbXBsaWZpZXMgc2VuZGluZyB3aW5kb3cgbWVzc2FnZXMgdG8gaWZyYW1lIGFuZCBzdWJzY3JpYmluZyB0byBtZXNzYWdlcyBvbiBpbm5lciB3aW5kb3cgb2YgaWZyYW1lLlxuICogQWxsIHB1YmxpYyBtZXRob2RzIG9mIE1lc3NlbmdlciBhbmQgYHRyaWdnZXJgIG1ldGhvZCBvZiBbRnJhbWVNZXNzYWdlU291cmNlXSguLi9tc2dfc3JjL2ZyYW1lLmpzLmh0bWwpIGFyZSBwcm94aWVkIGRpcmVjdGx5IHRvIHRoaXMgZmFjZXQuXG4gKiBGb3IgZXhhbXBsZSwgdG8gc2VuZCBjdXN0b20gbWVzc2FnZSB0byBpZnJhbWUgd2luZG93IHVzZTpcbiAqIGBgYFxuICogaWZyYW1lQ29tcG9uZW50LmZyYW1lLnRyaWdnZXIoJ215bWVzc2FnZScsIG15RGF0YSk7XG4gKiBgYGBcbiAqIFRvIHN1YnNjcmliZSB0byB0aGlzIG1lc3NhZ2VzIGluc2lkZSBmcmFtZSB1c2UgKHdpdGggbWlsbyAtIHNlZSBbbWlsby5tYWlsXSguLi8uLi9tYWlsL2luZGV4LmpzLmh0bWwpKTpcbiAqIGBgYFxuICogbWlsby5tYWlsLm9uKCdtZXNzYWdlOm15bWVzc2FnZScsIGZ1bmN0aW9uKG1zZ1R5cGUsIG1zZ0RhdGEpIHtcbiAqICAgICAvLyBkYXRhIGlzIGluc2lkZSBvZiB3aW5kb3cgbWVzc2FnZSBkYXRhXG4gKiAgICAgLy8gbXNnVHlwZSA9PSAnbWVzc2FnZTpteW1lc3NhZ2UnXG4gKiAgICAgdmFyIG15RGF0YSA9IG1zZ0RhdGEuZGF0YTtcbiAqICAgICAvLyAuLi4gYXBwIGxvZ2ljIGhlcmVcbiAqIH0pO1xuICogYGBgXG4gKiBvciB3aXRob3V0IG1pbG86XG4gKiBgYGBcbiAqIHdpbmRvdy5hdHRhY2hFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24obWVzc2FnZSkge1xuICogICAgIHZhciBtc2dUeXBlID0gbWVzc2FnZS50eXBlOyAvLyBlLmcuLCAnbXltZXNzYWdlJ1xuICogICAgIHZhciBteURhdGEgPSBtZXNzYWdlLmRhdGE7XG4gKiAgICAgLy8gLi4uIG1lc3NhZ2Ugcm91dGluZyBhbmQgY29kZSBoZXJlXG4gKiB9KTtcbiAqIGBgYFxuICogTWlsbyBkb2VzIHJvdXRpbmcgYmFzZWQgb24gc2VudCBtZXNzYWdlIHR5cGUgYXV0b21hdGljYWxseS5cbiAqIFNlZSBbTWVzc2VuZ2VyXSguLi8uLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCkgYW5kIFttaWxvLm1haWxdKC4uLy4uL21haWwvaW5kZXguanMuaHRtbCkuXG4gKi9cbiB2YXIgRnJhbWUgPSBfLmNyZWF0ZVN1YmNsYXNzKENvbXBvbmVudEZhY2V0LCAnRnJhbWUnKTtcblxuXG4vKipcbiAqIENhbGxzIHBhc3NlZCBmdW5jdGlvbiB3aGVuIGZyYW1lIERPTSBiZWNvbWVzIHJlYWR5LiBJZiBhbHJlYWR5IHJlYWR5IGNhbGxzIGltbWVkaWF0ZWx5XG4gKi9cbnZhciBGcmFtZSR3aGVuUmVhZHkgPSBfbWFrZVdoZW5SZWFkeUZ1bmMoRnJhbWUkaXNSZWFkeSwgJ2RvbXJlYWR5Jyk7XG5cbi8qKlxuICogQ2FsbHMgcGFzc2VkIGZ1bmN0aW9uIHdoZW4gZnJhbWUgbWlsbyBiZWNvbWVzIHJlYWR5LiBJZiBhbHJlYWR5IHJlYWR5IGNhbGxzIGltbWVkaWF0ZWx5XG4gKi9cbnZhciBGcmFtZSR3aGVuTWlsb1JlYWR5ID0gX21ha2VXaGVuUmVhZHlGdW5jKEZyYW1lJGlzTWlsb1JlYWR5LCAnbWVzc2FnZTptaWxvcmVhZHknKTtcblxuXG4vKipcbiAqICMjIyNFdmVudHMgZmFjZXQgaW5zdGFuY2UgbWV0aG9kcyMjIyNcbiAqXG4gKiAtIFtpbml0XSgjRnJhbWUkaW5pdCkgLSBjYWxsZWQgYnkgY29uc3RydWN0b3IgYXV0b21hdGljYWxseVxuICovXG5fLmV4dGVuZFByb3RvKEZyYW1lLCB7XG4gICAgaW5pdDogRnJhbWUkaW5pdCxcbiAgICBzdGFydDogRnJhbWUkc3RhcnQsXG4gICAgZGVzdHJveTogRnJhbWUkZGVzdHJveSxcbiAgICBnZXRXaW5kb3c6IEZyYW1lJGdldFdpbmRvdyxcbiAgICBpc1JlYWR5OiBGcmFtZSRpc1JlYWR5LFxuICAgIHdoZW5SZWFkeTogRnJhbWUkd2hlblJlYWR5LFxuICAgIGlzTWlsb1JlYWR5OiBGcmFtZSRpc01pbG9SZWFkeSxcbiAgICB3aGVuTWlsb1JlYWR5OiBGcmFtZSR3aGVuTWlsb1JlYWR5LFxuICAgIG1pbG86IEZyYW1lJG1pbG9cbiAgICAvLyBfcmVhdHRhY2g6IF9yZWF0dGFjaEV2ZW50c09uRWxlbWVudENoYW5nZVxufSk7XG5cblxuZmFjZXRzUmVnaXN0cnkuYWRkKEZyYW1lKTtcblxubW9kdWxlLmV4cG9ydHMgPSBGcmFtZTtcblxuXG4vKipcbiAqIEV4cG9zZSBGcmFtZU1lc3NhZ2VTb3VyY2UgdHJpZ2dlciBtZXRob2Qgb24gRXZlbnRzIHByb3RvdHlwZVxuICovXG52YXIgTVNHX1NPVVJDRV9LRVkgPSAnX21lc3NhZ2VTb3VyY2UnO1xuRnJhbWVNZXNzYWdlU291cmNlLnVzZVdpdGgoRnJhbWUsIE1TR19TT1VSQ0VfS0VZLCBbJ3RyaWdnZXInXSk7XG5cblxuLyoqXG4gKiBGcmFtZSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEluaXRpYWx6ZXMgZmFjZXQsIGNvbm5lY3RzIEZyYW1lTWVzc2FnZVNvdXJjZSB0byBmYWNldCdzIG1lc3NlbmdlclxuICovXG5mdW5jdGlvbiBGcmFtZSRpbml0KCkge1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgXG4gICAgdmFyIG1lc3NhZ2VTb3VyY2UgPSBuZXcgRnJhbWVNZXNzYWdlU291cmNlKHRoaXMsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0aGlzLm93bmVyKTtcbiAgICB0aGlzLl9zZXRNZXNzYWdlU291cmNlKG1lc3NhZ2VTb3VyY2UpO1xuXG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBNU0dfU09VUkNFX0tFWSwgbWVzc2FnZVNvdXJjZSk7XG59XG5cblxuLyoqXG4gKiBGcmFtZSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEVtaXRzIGZyYW1lbG9hZGVkIGV2ZW50IHdoZW4gcmVhZHkuXG4gKi9cbmZ1bmN0aW9uIEZyYW1lJHN0YXJ0KCkge1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5zdGFydC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBtaWxvKHBvc3REb21SZWFkeSk7XG5cbiAgICBmdW5jdGlvbiBwb3N0RG9tUmVhZHkoZXZlbnQpIHtcbiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSgnZG9tcmVhZHknLCBldmVudCk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIEZyYW1lJGRlc3Ryb3koKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG4vKipcbiAqIEZyYW1lIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogUmV0cmlldmVzIHRoZSBpbnRlcm5hbCB3aW5kb3cgb2YgdGhlIGZyYW1lIFxuICpcbiAqIEBwYXJhbSB7V2luZG93fVxuICovXG5mdW5jdGlvbiBGcmFtZSRnZXRXaW5kb3coKSB7XG4gICAgcmV0dXJuIHRoaXMub3duZXIuZWwuY29udGVudFdpbmRvdztcbn1cblxuXG4vKipcbiAqIEZyYW1lIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyBkb2N1bWVudC5yZWFkeVN0YXRlIGlmIGZyYW1lIGRvdW1lbnQgc3RhdGUgaXMgJ2ludGVyYWN0aXZlJyBvciAnY29tcGxldGUnLCBmYWxzZSBvdGhlcndpc2VcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd8Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gRnJhbWUkaXNSZWFkeSgpIHtcbiAgICB2YXIgcmVhZHlTdGF0ZSA9IHRoaXMuZ2V0V2luZG93KCkuZG9jdW1lbnQucmVhZHlTdGF0ZTtcbiAgICByZXR1cm4gIHJlYWR5U3RhdGUgIT0gJ2xvYWRpbmcnID8gcmVhZHlTdGF0ZSA6IGZhbHNlO1xufVxuXG5cbi8qKlxuICogRnJhbWUgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHRydWUgaWYgbWlsbyBpcyBsb2FkZWQgYW5kIGhhcyBmaW5pc2hlZCBpbml0aWFsaXppbmcgaW5zaWRlIHRoZSBmcmFtZVxuICpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIEZyYW1lJGlzTWlsb1JlYWR5KCkge1xuICAgIHZhciBmcmFtZU1pbG8gPSB0aGlzLmdldFdpbmRvdygpLm1pbG87XG4gICAgcmV0dXJuIHRoaXMuaXNSZWFkeSgpICYmIGZyYW1lTWlsbyAmJiBmcmFtZU1pbG8ubWlsb192ZXJzaW9uO1xufVxuXG5cbi8qKlxuICogR2l2ZXMgYWNjZXNzIHRvIG1pbG8gaW4gdGhlIGZyYW1lIChhc3N1bWluZyBpdCBpcyBsb2FkZWQgdGhlcmUpXG4gKiBDYWxscyBmdW5jdGlvbiB3aGVuIGJvdGggbWlsbyBhbmQgRE9NIGFyZSByZWFkeSBpZiBmdW5jdGlvbiBpcyBwYXNzZWQuXG4gKiBSZXR1cm5zIHRoZSByZWZlcmVuY2UgdG8gbWlsbyBpbnNpZGUgdGhlIGZyYW1lIGlmIHRoZSB3aW5kb3cgaXMgYWxyZWFkeSBhdmFpbGFibGUuXG4gKiBcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gbWlsbyBhbmQgRE9NIGFyZSByZWFkeSBpbiB0aGUgZnJhbWVcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSByZWZlcmVuY2UgdG8gbWlsbyBpbiB0aGUgZnJhbWUgXG4gKi9cbmZ1bmN0aW9uIEZyYW1lJG1pbG8oZnVuYykge1xuICAgIGlmICh0eXBlb2YgZnVuYyA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdGhpcy53aGVuTWlsb1JlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5nZXRXaW5kb3coKS5taWxvKGZ1bmMpXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB2YXIgd2luID0gdGhpcy5nZXRXaW5kb3coKTtcbiAgICByZXR1cm4gd2luICYmIHdpbi5taWxvO1xufVxuXG5cbmZ1bmN0aW9uIF9tYWtlV2hlblJlYWR5RnVuYyhpc1JlYWR5RnVuYywgZXZlbnQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gRnJhbWVfd2hlblJlYWR5RnVuYyhmdW5jKSB7IC8vICwgYXJndW1lbnRzXG4gICAgICAgIHZhciBzZWxmID0gdGhpc1xuICAgICAgICAgICAgLCBhcmdzID0gXy5zbGljZShhcmd1bWVudHMsIDEpO1xuICAgICAgICBpZiAoaXNSZWFkeUZ1bmMuY2FsbCh0aGlzKSlcbiAgICAgICAgICAgIGNhbGxGdW5jKCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMub24oZXZlbnQsIGNhbGxGdW5jKTtcblxuICAgICAgICBmdW5jdGlvbiBjYWxsRnVuYygpIHtcbiAgICAgICAgICAgIGZ1bmMuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY2ZfcmVnaXN0cnknKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTW9kZWwgPSBtaWxvQ29yZS5Nb2RlbFxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBtaWxvTWFpbCA9IHJlcXVpcmUoJy4uLy4uL3NlcnZpY2VzL21haWwnKTtcblxuXG52YXIgSXRlbUZhY2V0ID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0l0ZW0nKTtcblxuXy5leHRlbmRQcm90byhJdGVtRmFjZXQsIHtcbiAgICBnZXRTdGF0ZTogSXRlbUZhY2V0JGdldFN0YXRlLFxuICAgIHNldFN0YXRlOiBJdGVtRmFjZXQkc2V0U3RhdGUsXG4gICAgZ2V0SW5kZXg6IEl0ZW1GYWNldCRnZXRJbmRleCxcbiAgICBzZXRJbmRleDogSXRlbUZhY2V0JHNldEluZGV4LFxuICAgIHJlbW92ZUl0ZW06IEl0ZW1GYWNldCRyZW1vdmVJdGVtLFxuICAgIGV4dHJhY3RJdGVtOiBJdGVtRmFjZXQkZXh0cmFjdEl0ZW0sXG4gICAgcmVxdWlyZTogWydDb250YWluZXInLCAnRG9tJywgJ0RhdGEnXVxufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChJdGVtRmFjZXQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEl0ZW1GYWNldDtcblxuXG5mdW5jdGlvbiBJdGVtRmFjZXQkZ2V0U3RhdGUoKSB7XG4gICAgcmV0dXJuIHsgc3RhdGU6IHtcbiAgICAgICAgaW5kZXg6IHRoaXMuZ2V0SW5kZXgoKVxuICAgIH19O1xufVxuXG5cbmZ1bmN0aW9uIEl0ZW1GYWNldCRzZXRTdGF0ZShzdGF0ZSkge1xuICAgIHRoaXMuc2V0SW5kZXgoc3RhdGUuc3RhdGUuaW5kZXgpO1xufVxuXG5cbi8qKlxuICogRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgb3duZXIgY29tcG9uZW50IGluIGl0J3MgcGFyZW50IGxpc3QgY29tcG9uZW50XG4gKiBAcmV0dXJuIHtJbnRlZ2VyfSBUaGUgaW5kZXhcbiAqL1xuZnVuY3Rpb24gSXRlbUZhY2V0JGdldEluZGV4KCkge1xuICAgIHJldHVybiB0aGlzLmluZGV4O1xufVxuXG5cbi8qKlxuICogRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTZXRzIHRoZSBpbmRleCBvZiB0aGlzIGNvbXBvbmVudFxuICogQHBhcmFtIHtJbnRlZ2VyfSBpbmRleCBUaGUgaW5kZXggdG8gYmUgc2V0XG4gKi9cbmZ1bmN0aW9uIEl0ZW1GYWNldCRzZXRJbmRleChpbmRleCkge1xuICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbn1cblxuXG4vKipcbiAqIEl0ZW1GYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFJlbW92ZXMgY29tcG9uZW50IGZyb20gdGhlIGxpc3QsIGNvbXBvbmVudCBnZXRzIGRlc3Ryb3llZFxuICovXG5mdW5jdGlvbiBJdGVtRmFjZXQkcmVtb3ZlSXRlbSgpIHtcbiAgICAvLyB0aGlzLmxpc3QgYW5kIHRoaXMuaW5kZXggYXJlIHNldCBieSB0aGUgbGlzdCB3aGVuIHRoZSBpdGVtIGlzIGFkZGVkXG4gICAgdGhpcy5saXN0LnJlbW92ZUl0ZW0odGhpcy5pbmRleCk7XG59XG5cblxuLyoqXG4gKiBJdGVtRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZW1vdmVzIGNvbXBvbmVudCBmcm9tIHRoZSBsaXN0LCBjb21wb25lbnQgaXMgTk9UIGRlc3Ryb3llZFxuICovXG5mdW5jdGlvbiBJdGVtRmFjZXQkZXh0cmFjdEl0ZW0oKSB7XG4gICAgdGhpcy5saXN0LmV4dHJhY3RJdGVtKHRoaXMuaW5kZXgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50RmFjZXQgPSByZXF1aXJlKCcuLi9jX2ZhY2V0JylcbiAgICAsIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgbWlsb01haWwgPSByZXF1aXJlKCcuLi8uLi9zZXJ2aWNlcy9tYWlsJylcbiAgICAsIG1pbG9CaW5kZXIgPSByZXF1aXJlKCcuLi8uLi9iaW5kZXInKVxuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXJcbiAgICAsIGRvVCA9IG1pbG9Db3JlLnV0aWwuZG9UXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2hcbiAgICAsIGRvbVV0aWxzID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kb20nKVxuICAgICwgY29tcG9uZW50TmFtZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvY29tcG9uZW50X25hbWUnKVxuICAgICwgbWlsb0NvbmZpZyA9IHJlcXVpcmUoJy4uLy4uL2NvbmZpZycpO1xuXG5cbnZhciBMSVNUX1NBTVBMRV9DU1NfQ0xBU1MgPSAnbWwtbGlzdC1pdGVtLXNhbXBsZSc7XG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzLmdldCgnTGlzdCcpYFxuICogRmFjZXQgZW5hYmxpbmcgbGlzdCBmdW5jdGlvbmFsaXR5XG4gKi9cbnZhciBMaXN0ID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0xpc3QnKTtcblxuXy5leHRlbmRQcm90byhMaXN0LCB7XG4gICAgaW5pdDogTGlzdCRpbml0LFxuICAgIHN0YXJ0OiBMaXN0JHN0YXJ0LFxuICAgIGRlc3Ryb3k6IExpc3QkZGVzdHJveSxcblxuICAgIHJlcXVpcmU6IFsnQ29udGFpbmVyJywgJ0RvbScsICdEYXRhJ10sXG4gICAgX2l0ZW1QcmV2aW91c0NvbXBvbmVudDogX2l0ZW1QcmV2aW91c0NvbXBvbmVudCxcblxuICAgIGl0ZW06IExpc3QkaXRlbSxcbiAgICBjb3VudDogTGlzdCRjb3VudCxcbiAgICBjb250YWluczogTGlzdCRjb250YWlucyxcbiAgICBhZGRJdGVtOiBMaXN0JGFkZEl0ZW0sXG4gICAgYWRkSXRlbXM6IExpc3QkYWRkSXRlbXMsXG4gICAgcmVwbGFjZUl0ZW06IExpc3QkcmVwbGFjZUl0ZW0sXG4gICAgcmVtb3ZlSXRlbTogTGlzdCRyZW1vdmVJdGVtLFxuICAgIGV4dHJhY3RJdGVtOiBMaXN0JGV4dHJhY3RJdGVtLFxuICAgIGVhY2g6IExpc3QkZWFjaCxcbiAgICBfc2V0SXRlbTogTGlzdCRfc2V0SXRlbSxcbiAgICBfcmVtb3ZlSXRlbTogTGlzdCRfcmVtb3ZlSXRlbSxcbiAgICBfYWRkSXRlbTogTGlzdCRfYWRkSXRlbSxcbiAgICBfYWRkSXRlbXM6IExpc3QkX2FkZEl0ZW1zLFxuICAgIF9jcmVhdGVDYWNoZVRlbXBsYXRlOiBMaXN0JF9jcmVhdGVDYWNoZVRlbXBsYXRlLFxuICAgIF91cGRhdGVEYXRhUGF0aHM6IExpc3QkX3VwZGF0ZURhdGFQYXRoc1xufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChMaXN0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBMaXN0O1xuXG5cbi8qKlxuICogRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXplZCBMaXN0IGZhY2V0IGluc3RhbmNlIGFuZCBzZXRzIHVwIGl0ZW0gcHJvcGVydGllcy5cbiAqL1xuZnVuY3Rpb24gTGlzdCRpbml0KCkge1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgX2xpc3RJdGVtczogW10sXG4gICAgICAgIF9saXN0SXRlbXNIYXNoOiB7fVxuICAgIH0pO1xuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgJ2l0ZW1TYW1wbGUnLCBudWxsLCBfLldSSVQpO1xufVxuXG5cbi8qKlxuICogRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTdGFydHMgdGhlIExpc3QgZmFjZXQgaW5zdGFuY2UsIGZpbmRzIGNoaWxkIHdpdGggSXRlbSBmYWNldC5cbiAqL1xuZnVuY3Rpb24gTGlzdCRzdGFydCgpIHtcbiAgICAvLyBGaXJlZCBieSBfX2JpbmRlcl9fIHdoZW4gYWxsIGNoaWxkcmVuIG9mIGNvbXBvbmVudCBhcmUgYm91bmRcbiAgICB0aGlzLm93bmVyLm9uKCdjaGlsZHJlbmJvdW5kJywgb25DaGlsZHJlbkJvdW5kKTtcbn1cblxuXG5mdW5jdGlvbiBvbkNoaWxkcmVuQm91bmQoKSB7XG4gICAgLy8gZ2V0IGl0ZW1zIGFscmVhZHkgaW4gdGhlIGxpc3RcbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmRvbS5jaGlsZHJlbigpXG4gICAgICAgICwgaXRlbXMgPSB0aGlzLmxpc3QuX2xpc3RJdGVtc1xuICAgICAgICAsIGl0ZW1zSGFzaCA9IHRoaXMubGlzdC5fbGlzdEl0ZW1zSGFzaDtcblxuICAgIGNoaWxkcmVuICYmIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oY2hpbGRFbCkge1xuICAgICAgICB2YXIgY29tcCA9IENvbXBvbmVudC5nZXRDb21wb25lbnQoY2hpbGRFbCk7XG4gICAgICAgIGlmIChjb21wICYmIGNvbXAuaXRlbSkge1xuICAgICAgICAgICAgaXRlbXMucHVzaChjb21wKTtcbiAgICAgICAgICAgIGl0ZW1zSGFzaFtjb21wLm5hbWVdID0gY29tcDtcbiAgICAgICAgICAgIGNvbXAuaXRlbS5saXN0ID0gdGhpcy5saXN0O1xuICAgICAgICB9XG4gICAgfSwgdGhpcyk7XG5cbiAgICBpZiAoaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBmb3VuZEl0ZW0gPSBpdGVtc1swXTtcbiAgICAgICAgaXRlbXMuc3BsaWNlKDAsIDEpO1xuICAgICAgICBkZWxldGUgaXRlbXNIYXNoW2ZvdW5kSXRlbS5uYW1lXTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbihpdGVtLCBpbmRleCkge1xuICAgICAgICAgICAgaXRlbS5pdGVtLnNldEluZGV4KGluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIC8vIENvbXBvbmVudCBtdXN0IGhhdmUgb25lIGNoaWxkIHdpdGggYW4gSXRlbSBmYWNldCBcbiAgICBpZiAoISBmb3VuZEl0ZW0pIHRocm93IG5ldyBFcnJvcignTm8gY2hpbGQgY29tcG9uZW50IGhhcyBJdGVtIGZhY2V0Jyk7XG5cbiAgICB0aGlzLmxpc3QuaXRlbVNhbXBsZSA9IGZvdW5kSXRlbTtcblxuICAgIC8vIEFmdGVyIGtlZXBpbmcgYSByZWZlcmVuY2UgdG8gdGhlIGl0ZW0gc2FtcGxlLCBpdCBtdXN0IGJlIGhpZGRlbiBhbmQgcmVtb3ZlZCBmcm9tIHNjb3BlXG4gICAgZm91bmRJdGVtLmRvbS5oaWRlKCk7XG4gICAgZm91bmRJdGVtLnJlbW92ZSh0cnVlKTtcbiAgICBmb3VuZEl0ZW0uZG9tLnJlbW92ZUNzc0NsYXNzZXMoTElTVF9TQU1QTEVfQ1NTX0NMQVNTKTtcblxuICAgIC8vIHJlbW92ZSByZWZlcmVuY2VzIHRvIGNvbXBvbmVudHMgZnJvbSBzYW1wbGUgaXRlbVxuICAgIGZvdW5kSXRlbS53YWxrU2NvcGVUcmVlKGZ1bmN0aW9uKGNvbXApIHtcbiAgICAgICAgZGVsZXRlIGNvbXAuZWxbbWlsb0NvbmZpZy5jb21wb25lbnRSZWZdO1xuICAgIH0pO1xuXG4gICAgdGhpcy5saXN0Ll9jcmVhdGVDYWNoZVRlbXBsYXRlKCk7XG59XG5cblxuZnVuY3Rpb24gTGlzdCRfY3JlYXRlQ2FjaGVUZW1wbGF0ZSgpIHtcbiAgICBpZiAoIXRoaXMuaXRlbVNhbXBsZSkgcmV0dXJuIGZhbHNlO1xuICAgIFxuICAgIHZhciBpdGVtU2FtcGxlID0gdGhpcy5pdGVtU2FtcGxlO1xuXG4gICAgLy8gY3JlYXRlIGl0ZW0gdGVtcGxhdGUgdG8gaW5zZXJ0IG1hbnkgaXRlbXMgYXQgb25jZVxuICAgIHZhciBpdGVtRWxDb3B5ID0gaXRlbVNhbXBsZS5lbC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgdmFyIGF0dHIgPSBpdGVtU2FtcGxlLmNvbXBvbmVudEluZm8uYXR0cjtcbiAgICB2YXIgYXR0ckNvcHkgPSBfLmNsb25lKGF0dHIpO1xuICAgIGF0dHIuY29tcE5hbWUgPSAne3s9IGl0LmNvbXBvbmVudE5hbWUoKSB9fSc7XG4gICAgYXR0ci5lbCA9IGl0ZW1FbENvcHk7XG4gICAgYXR0ci5kZWNvcmF0ZSgpO1xuXG4gICAgdmFyIGl0ZW1zVGVtcGxhdGVTdHIgPSBcbiAgICAgICAgICAne3sgdmFyIGkgPSBpdC5jb3VudDsgd2hpbGUoaS0tKSB7IH19J1xuICAgICAgICArIGl0ZW1FbENvcHkub3V0ZXJIVE1MXG4gICAgICAgICsgJ3t7IH0gfX0nO1xuXG4gICAgdGhpcy5pdGVtc1RlbXBsYXRlID0gZG9ULmNvbXBpbGUoaXRlbXNUZW1wbGF0ZVN0cik7XG59XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHJpZXZlIGEgcGFydGljdWxhciBjaGlsZCBpdGVtIGJ5IGluZGV4XG4gKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgY2hpbGQgaXRlbSB0byBnZXQuXG4gKiBAcmV0dXJuIHtDb21wb25lbnR9IFRoZSBjb21wb25lbnQgZm91bmRcbiAqL1xuZnVuY3Rpb24gTGlzdCRpdGVtKGluZGV4KSB7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3RJdGVtc1tpbmRleF07XG59XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEdldHMgdGhlIHRvdGFsIG51bWJlciBvZiBjaGlsZCBpdGVtc1xuICogQHJldHVybiB7SW50ZWdlcn0gVGhlIHRvdGFsXG4gKi9cbmZ1bmN0aW9uIExpc3QkY291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3RJdGVtcy5sZW5ndGg7XG59XG5cblxuZnVuY3Rpb24gTGlzdCRfc2V0SXRlbShpbmRleCwgY29tcG9uZW50KSB7XG4gICAgdGhpcy5fbGlzdEl0ZW1zLnNwbGljZShpbmRleCwgMCwgY29tcG9uZW50KTtcbiAgICB0aGlzLl9saXN0SXRlbXNIYXNoW2NvbXBvbmVudC5uYW1lXSA9IGNvbXBvbmVudDtcbiAgICBjb21wb25lbnQuaXRlbS5saXN0ID0gdGhpcztcbiAgICBjb21wb25lbnQuaXRlbS5zZXRJbmRleCgraW5kZXgpO1xufVxuXG5cbi8qKlxuICogRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHRydWUgaWYgYSBwYXJ0aWN1bGFyIGNoaWxkIGl0ZW0gZXhpc3RzIGluIHRoZSBsaXN0XG4gKiBAcGFyYW0ge0NvbXBvbmVudH0gY29tcG9uZW50IFRoZSBjb21wb25lbnQgdG8gbG9vayBmb3IuXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBMaXN0JGNvbnRhaW5zKGNvbXBvbmVudCkge1xuICAgIHJldHVybiB0aGlzLl9saXN0SXRlbXNIYXNoW2NvbXBvbmVudC5uYW1lXSA9PSBjb21wb25lbnQ7XG59XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEFkZHMgYSBuZXcgY2hpbGQgY29tcG9uZW50IGF0IGEgcGFydGljdWxhciBpbmRleCBhbmQgcmV0dXJucyB0aGUgbmV3IGNvbXBvbmVudC5cbiAqIFRoaXMgbWV0aG9kIHVzZXMgZGF0YSBmYWNldCwgc28gbm90aWZpY2F0aW9uIHdpbGwgYmUgZW1pdHRlZCBvbiBkYXRhIGZhY2V0LlxuICogQHBhcmFtIHtJbnRlZ2VyfSBpbmRleCBUaGUgaW5kZXggdG8gYWRkIGF0XG4gKiBAcmV0dXJuIHtDb21wb25lbnR9IFRoZSBuZXdseSBjcmVhdGVkIGNvbXBvbmVudFxuICovXG5mdW5jdGlvbiBMaXN0JGFkZEl0ZW0oaW5kZXgsIGl0ZW1EYXRhKSB7XG4gICAgaW5kZXggPSBpbmRleCB8fCB0aGlzLmNvdW50KCk7XG4gICAgdGhpcy5vd25lci5kYXRhLnNwbGljZShpbmRleCwgMCwgaXRlbURhdGEgfHwge30pO1xuICAgIHJldHVybiB0aGlzLml0ZW0oaW5kZXgpO1xufVxuXG5cbi8qKlxuICogRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBBZGRzIGEgbmV3IGNoaWxkIGNvbXBvbmVudCBhdCBhIHBhcnRpY3VsYXIgaW5kZXggYW5kIHJldHVybnMgdGhlIG5ldyBjb21wb25lbnRcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggVGhlIGluZGV4IHRvIGFkZCBhdFxuICogQHJldHVybiB7Q29tcG9uZW50fSBUaGUgbmV3bHkgY3JlYXRlZCBjb21wb25lbnRcbiAqL1xuZnVuY3Rpb24gTGlzdCRfYWRkSXRlbShpbmRleCkge1xuICAgIGluZGV4ID0gaW5kZXggfHwgdGhpcy5jb3VudCgpO1xuICAgIGlmICh0aGlzLml0ZW0oaW5kZXgpKVxuICAgICAgICB0aHJvdyBFcnJvcignYXR0ZW1wdCB0byBjcmVhdGUgaXRlbSB3aXRoIElEIG9mIGV4aXN0aW5nIGl0ZW0nKTtcblxuICAgIC8vIENvcHkgY29tcG9uZW50XG4gICAgdmFyIGNvbXBvbmVudCA9IENvbXBvbmVudC5jb3B5KHRoaXMuaXRlbVNhbXBsZSwgdHJ1ZSk7XG4gICAgdmFyIHByZXZDb21wb25lbnQgPSB0aGlzLl9pdGVtUHJldmlvdXNDb21wb25lbnQoaW5kZXgpO1xuXG4gICAgaWYgKCFwcmV2Q29tcG9uZW50LmVsLnBhcmVudE5vZGUpXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignbGlzdCBpdGVtIHNhbXBsZSB3YXMgcmVtb3ZlZCBmcm9tIERPTSwgcHJvYmFibHkgY2F1c2VkIGJ5IHdyb25nIGRhdGEuIFJlc2V0IGxpc3QgZGF0YSB3aXRoIGFycmF5Jyk7XG5cbiAgICAvLyBBZGQgaXQgdG8gdGhlIERPTVxuICAgIHByZXZDb21wb25lbnQuZG9tLmluc2VydEFmdGVyKGNvbXBvbmVudC5lbCk7XG5cbiAgICAvLyBBZGQgdG8gbGlzdCBpdGVtc1xuICAgIHRoaXMuX3NldEl0ZW0oaW5kZXgsIGNvbXBvbmVudCk7XG5cbiAgICAvLyBTaG93IHRoZSBsaXN0IGl0ZW0gY29tcG9uZW50XG4gICAgY29tcG9uZW50LmVsLnN0eWxlLmRpc3BsYXkgPSAnJztcblxuICAgIF91cGRhdGVJdGVtc0luZGV4ZXMuY2FsbCh0aGlzLCBpbmRleCArIDEpO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbn1cblxuXG5mdW5jdGlvbiBfdXBkYXRlSXRlbXNJbmRleGVzKGZyb21JbmRleCwgdG9JbmRleCkge1xuICAgIGZyb21JbmRleCA9IGZyb21JbmRleCB8fCAwO1xuICAgIHRvSW5kZXggPSB0b0luZGV4IHx8IHRoaXMuY291bnQoKTtcbiAgICBmb3IgKHZhciBpID0gZnJvbUluZGV4OyBpIDwgdG9JbmRleDsgaSsrKSB7XG4gICAgICAgIHZhciBjb21wb25lbnQgPSB0aGlzLl9saXN0SXRlbXNbaV07XG4gICAgICAgIGlmIChjb21wb25lbnQpXG4gICAgICAgICAgICBjb21wb25lbnQuaXRlbS5zZXRJbmRleChpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0xpc3Q6IG5vIGl0ZW0gYXQgcG9zaXRpb24nLCBpKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gTGlzdCRhZGRJdGVtcyhjb3VudCwgaW5kZXgpIHsgLy8gLC4uLiBpdGVtcyBkYXRhXG4gICAgdmFyIGl0ZW1zRGF0YSA9IF8uc2xpY2UoYXJndW1lbnRzLCAyKTtcbiAgICBpZiAoaXRlbXNEYXRhLmxlbmd0aCA8IGNvdW50KSBcbiAgICAgICAgaXRlbXNEYXRhLmNvbmNhdChfLnJlcGVhdChjb3VudCAtIGl0ZW1zRGF0YS5sZW5ndGgsIHt9KSk7XG4gICAgdmFyIHNwbGljZUFyZ3MgPSBbaW5kZXgsIDBdLmNvbmNhdChpdGVtc0RhdGEpO1xuICAgIHZhciBkYXRhRmFjZXQgPSB0aGlzLm93bmVyLmRhdGE7XG4gICAgZGF0YUZhY2V0LnNwbGljZS5hcHBseShkYXRhRmFjZXQsIHNwbGljZUFyZ3MpO1xufVxuXG5cbi8qKlxuICogTGlzdCBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEFkZHMgYSBnaXZlbiBudW1iZXIgb2YgaXRlbXMgdXNpbmcgdGVtcGxhdGUgcmVuZGVyaW5nIHJhdGhlciB0aGFuIGFkZGluZyBlbGVtZW50cyBvbmUgYnkgb25lXG4gKlxuICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudCBudW1iZXIgb2YgaXRlbXMgdG8gYWRkXG4gKiBAcGFyYW0ge1tJbnRlZ2VyXX0gaW5kZXggb3B0aW9uYWwgaW5kZXggb2YgaXRlbSBhZnRlciB3aGljaCB0byBhZGRcbiAqL1xuZnVuY3Rpb24gTGlzdCRfYWRkSXRlbXMoY291bnQsIGluZGV4KSB7XG4gICAgY2hlY2soY291bnQsIE1hdGNoLkludGVnZXIpO1xuICAgIGlmIChjb3VudCA8IDApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FuXFwndCBhZGQgbmVnYXRpdmUgbnVtYmVyIG9mIGl0ZW1zJyk7XG5cbiAgICBpZiAoY291bnQgPT0gMCkgcmV0dXJuO1xuXG4gICAgdmFyIGl0ZW1zSFRNTCA9IHRoaXMuaXRlbXNUZW1wbGF0ZSh7XG4gICAgICAgIGNvbXBvbmVudE5hbWU6IGNvbXBvbmVudE5hbWUsXG4gICAgICAgIGNvdW50OiBjb3VudFxuICAgIH0pO1xuXG4gICAgdmFyIHdyYXBFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHdyYXBFbC5pbm5lckhUTUwgPSBpdGVtc0hUTUw7XG5cbiAgICBtaWxvQmluZGVyKHdyYXBFbCwgdGhpcy5vd25lci5jb250YWluZXIuc2NvcGUpO1xuICAgIHZhciBjaGlsZHJlbiA9IGRvbVV0aWxzLmNoaWxkcmVuKHdyYXBFbCk7XG5cbiAgICBpZiAoY291bnQgIT0gY2hpbGRyZW4ubGVuZ3RoKVxuICAgICAgICBsb2dnZXIuZXJyb3IoJ251bWJlciBvZiBpdGVtcyBhZGRlZCBpcyBkaWZmZXJlbnQgZnJvbSByZXF1ZXN0ZWQnKTtcblxuICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGxpc3RMZW5ndGggPSB0aGlzLmNvdW50KCk7XG4gICAgICAgIHZhciBzcGxpY2VJbmRleCA9IGluZGV4IDwgMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdHlwZW9mIGluZGV4ID09ICd1bmRlZmluZWQnIHx8IGluZGV4ID4gbGlzdExlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGxpc3RMZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbmRleDtcblxuICAgICAgICB2YXIgcHJldkNvbXBvbmVudCA9IHNwbGljZUluZGV4ID09IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLml0ZW1TYW1wbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9saXN0SXRlbXNbc3BsaWNlSW5kZXggLSAxXTtcblxuICAgICAgICB2YXIgZnJhZyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICAgICAgLCBuZXdDb21wb25lbnRzID0gW107XG5cbiAgICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlbCwgaSkge1xuICAgICAgICAgICAgdmFyIGNvbXBvbmVudCA9IENvbXBvbmVudC5nZXRDb21wb25lbnQoZWwpO1xuICAgICAgICAgICAgaWYgKCEgY29tcG9uZW50KVxuICAgICAgICAgICAgICAgIHJldHVybiBsb2dnZXIuZXJyb3IoJ0xpc3Q6IGVsZW1lbnQgaW4gbmV3IGl0ZW1zIGlzIG5vdCBhIGNvbXBvbmVudCcpO1xuICAgICAgICAgICAgbmV3Q29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gICAgICAgICAgICB0aGlzLl9zZXRJdGVtKHNwbGljZUluZGV4KyssIGNvbXBvbmVudCk7XG4gICAgICAgICAgICBmcmFnLmFwcGVuZENoaWxkKGVsKTtcbiAgICAgICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgX3VwZGF0ZUl0ZW1zSW5kZXhlcy5jYWxsKHRoaXMsIHNwbGljZUluZGV4KTtcblxuICAgICAgICBpZiAoIXByZXZDb21wb25lbnQuZWwucGFyZW50Tm9kZSlcbiAgICAgICAgICAgIHJldHVybiBsb2dnZXIud2FybignbGlzdCBpdGVtIHNhbXBsZSB3YXMgcmVtb3ZlZCBmcm9tIERPTSwgcHJvYmFibHkgY2F1c2VkIGJ5IHdyb25nIGRhdGEuIFJlc2V0IGxpc3QgZGF0YSB3aXRoIGFycmF5Jyk7XG5cbiAgICAgICAgLy8gQWRkIGl0IHRvIHRoZSBET01cbiAgICAgICAgcHJldkNvbXBvbmVudC5kb20uaW5zZXJ0QWZ0ZXIoZnJhZyk7XG5cbiAgICAgICAgXy5kZWZlck1ldGhvZChuZXdDb21wb25lbnRzLCAnZm9yRWFjaCcsIGZ1bmN0aW9uKGNvbXApIHtcbiAgICAgICAgICAgIGNvbXAuYnJvYWRjYXN0KCdzdGF0ZXJlYWR5Jyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIExpc3QgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZW1vdmVcbiAqIEByZXR1cm4ge0FycmF5W09iamVjdF19IFRoZSBzcGxpY2VkIGRhdGFcbiAqL1xuZnVuY3Rpb24gTGlzdCRyZW1vdmVJdGVtKGluZGV4KSB7XG4gICAgcmV0dXJuIHRoaXMub3duZXIuZGF0YS5zcGxpY2UoaW5kZXgsIDEpO1xufVxuXG5cbi8qKlxuICogTGlzdCBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIGV4dHJhY3RcbiAqIEByZXR1cm4ge0NvbXBvbmVudH0gVGhlIGV4dHJhY3RlZCBpdGVtXG4gKi9cbmZ1bmN0aW9uIExpc3QkZXh0cmFjdEl0ZW0oaW5kZXgpIHtcbiAgICB2YXIgaXRlbUNvbXAgPSB0aGlzLl9yZW1vdmVJdGVtKGluZGV4LCBmYWxzZSk7XG4gICAgdGhpcy5fdXBkYXRlRGF0YVBhdGhzKGluZGV4LCB0aGlzLmNvdW50KCkpO1xuICAgIHJldHVybiBpdGVtQ29tcDtcbn1cblxuXG4vKipcbiAqIExpc3QgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZW1vdmVzIGl0ZW0sIHJldHVybnMgdGhlIHJlbW92ZWQgaXRlbSB0aGF0IGlzIGRlc3Ryb3llZCBieSBkZWZhdWx0LlxuICogXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGluZGV4IGl0ZW0gaW5kZXhcbiAqIEBwYXJhbSAge0Jvb2xlYW59IGRvRGVzdHJveUl0ZW0gb3B0aW9uYWwgZmFsc2UgdG8gcHJldmVudCBpdGVtIGRlc3RydWN0aW9uLCB0cnVlIGJ5IGRlZmF1bHRcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xuZnVuY3Rpb24gTGlzdCRfcmVtb3ZlSXRlbShpbmRleCwgZG9EZXN0cm95SXRlbSkge1xuICAgIHZhciBjb21wID0gdGhpcy5pdGVtKGluZGV4KTtcblxuICAgIGlmICghIGNvbXApXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignYXR0ZW1wdCB0byByZW1vdmUgbGlzdCBpdGVtIHdpdGggaWQgdGhhdCBkb2VzIG5vdCBleGlzdCcpO1xuXG4gICAgdGhpcy5fbGlzdEl0ZW1zW2luZGV4XSA9IHVuZGVmaW5lZDtcbiAgICBkZWxldGUgdGhpcy5fbGlzdEl0ZW1zSGFzaFtjb21wLm5hbWVdO1xuICAgIGlmIChkb0Rlc3Ryb3lJdGVtICE9PSBmYWxzZSkgY29tcC5kZXN0cm95KCk7XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbXAucmVtb3ZlKCk7XG4gICAgICAgIGNvbXAuZG9tLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIHRoaXMuX2xpc3RJdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIF91cGRhdGVJdGVtc0luZGV4ZXMuY2FsbCh0aGlzLCBpbmRleCk7XG5cbiAgICByZXR1cm4gY29tcDtcbn1cblxuXG5mdW5jdGlvbiBMaXN0JHJlcGxhY2VJdGVtKGluZGV4LCBuZXdJdGVtKXtcbiAgICB2YXIgb2xkSXRlbSA9IHRoaXMuaXRlbShpbmRleCk7XG4gICAgb2xkSXRlbS5kb20uaW5zZXJ0QWZ0ZXIobmV3SXRlbS5lbCk7XG4gICAgdGhpcy5fcmVtb3ZlSXRlbShpbmRleCk7XG4gICAgdGhpcy5fc2V0SXRlbShpbmRleCwgbmV3SXRlbSk7XG59XG5cblxuLy8gUmV0dXJucyB0aGUgcHJldmlvdXMgaXRlbSBjb21wb25lbnQgZ2l2ZW4gYW4gaW5kZXhcbmZ1bmN0aW9uIF9pdGVtUHJldmlvdXNDb21wb25lbnQoaW5kZXgpIHtcbiAgICB3aGlsZSAoaW5kZXggPj0gMCAmJiAhIHRoaXMuX2xpc3RJdGVtc1tpbmRleF0pXG4gICAgICAgIGluZGV4LS07XG5cbiAgICByZXR1cm4gaW5kZXggPj0gMFxuICAgICAgICAgICAgICAgID8gdGhpcy5fbGlzdEl0ZW1zW2luZGV4XVxuICAgICAgICAgICAgICAgIDogdGhpcy5pdGVtU2FtcGxlO1xufVxuXG5cbi8vIHRvSW5kZXggaXMgbm90IGluY2x1ZGVkXG4vLyBubyByYW5nZSBjaGVja2luZyBpcyBtYWRlXG5mdW5jdGlvbiBMaXN0JF91cGRhdGVEYXRhUGF0aHMoZnJvbUluZGV4LCB0b0luZGV4KSB7XG4gICAgZm9yICh2YXIgaSA9IGZyb21JbmRleDsgaSA8IHRvSW5kZXg7IGkrKykge1xuICAgICAgICB2YXIgaXRlbSA9IHRoaXMuaXRlbShpKTtcbiAgICAgICAgaWYgKGl0ZW0pXG4gICAgICAgICAgICBpdGVtLmRhdGEuX3BhdGggPSAnWycgKyBpICsgJ10nO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsb2dnZXIud2FybignRGF0YTogbm8gaXRlbSBmb3IgaW5kZXgnLCBqKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFNpbWlsYXIgdG8gZm9yRWFjaCBtZXRob2Qgb2YgQXJyYXksIGl0ZXJhdGVzIGVhY2ggb2YgdGhlIGNoaWxkIGl0ZW1zLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQW4gaXRlcmF0b3IgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGVhY2ggY2hpbGQgaXRlbS5cbiAqIEBwYXJhbSB7W3R5cGVdfSAgIHRoaXNBcmcgIENvbnRleHQgdG8gc2V0IGB0aGlzYC5cbiAqL1xuZnVuY3Rpb24gTGlzdCRlYWNoKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgdGhpcy5fbGlzdEl0ZW1zLmZvckVhY2goZnVuY3Rpb24oaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgaWYgKGl0ZW0pIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIHBhc3NlcyBpdGVtLCBpbmRleCB0byBjYWxsYmFja1xuICAgICAgICBlbHNlIGxvZ2dlci53YXJuKCdMaXN0JGVhY2g6IGl0ZW0nLCBpbmRleCwgJ2lzIHVuZGVmaW5lZCcpO1xuICAgIH0sIHRoaXNBcmcgfHwgdGhpcyk7XG59XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIERlc3Ryb3lzIHRoZSBsaXN0XG4gKi9cbmZ1bmN0aW9uIExpc3QkZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5pdGVtU2FtcGxlKSB0aGlzLml0ZW1TYW1wbGUuZGVzdHJveSh0cnVlKTtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50RmFjZXQgPSByZXF1aXJlKCcuLi9jX2ZhY2V0JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jZl9yZWdpc3RyeScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNb2RlbCA9IG1pbG9Db3JlLk1vZGVsXG4gICAgLCBNaXhpbiA9IG1pbG9Db3JlLmNsYXNzZXMuTWl4aW5cbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxuXG4vLyBnZW5lcmljIGRyYWcgaGFuZGxlciwgc2hvdWxkIGJlIG92ZXJyaWRkZW5cbnZhciBNb2RlbEZhY2V0ID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ01vZGVsJyk7XG5cbl8uZXh0ZW5kUHJvdG8oTW9kZWxGYWNldCwge1xuICAgIGluaXQ6IE1vZGVsRmFjZXQkaW5pdCxcbiAgICBnZXRTdGF0ZTogTW9kZWxGYWNldCRnZXRTdGF0ZSxcbiAgICBzZXRTdGF0ZTogTW9kZWxGYWNldCRzZXRTdGF0ZSxcbiAgICBfY3JlYXRlTWVzc2VuZ2VyOiBNb2RlbEZhY2V0JF9jcmVhdGVNZXNzZW5nZXIsXG4gICAgZGVzdHJveTogTW9kZWxGYWNldCRkZXN0cm95XG59KTtcblxuZmFjZXRzUmVnaXN0cnkuYWRkKE1vZGVsRmFjZXQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1vZGVsRmFjZXQ7XG5cblxuLyoqXG4gKiBFeHBvc2UgTW9kZWwgY2xhc3MgbWV0aG9kcyBvbiBNb2RlbEZhY2V0XG4gKi9cbk1vZGVsLnVzZVdpdGgoTW9kZWxGYWNldCwgJ20nKTtcblxuXG5mdW5jdGlvbiBNb2RlbEZhY2V0JGluaXQoKSB7XG4gICAgdGhpcy5tID0gbmV3IE1vZGVsKHRoaXMuY29uZmlnLmRhdGEsIHRoaXMpO1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgLy8gdGhpcy5tLnByb3h5TWV0aG9kcyh0aGlzKTsgLy8gQ3JlYXRlcyBtb2RlbCdzIG1ldGhvZHMgZGlyZWN0bHkgb24gZmFjZXRcbn1cblxuXG4vKipcbiAqIE1vZGVsRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBDYWxsZWQgYnkgYENvbXBvbmVudC5wcm90b3R5cGUuZ2V0U3RhdGVgIHRvIGdldCBmYWNldCdzIHN0YXRlXG4gKiBTaW1wbHkgcmV0dXJucyBtb2RlbCBkYXRhXG4gKlxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBNb2RlbEZhY2V0JGdldFN0YXRlKCkge1xuICAgIHZhciBtb2RlbFZhbHVlID0gdGhpcy5tLmdldCgpO1xuICAgIGlmICh0eXBlb2YgbW9kZWxWYWx1ZSA9PSAnb2JqZWN0JylcbiAgICAgICAgbW9kZWxWYWx1ZSA9IF8uZGVlcENsb25lKG1vZGVsVmFsdWUpO1xuICAgIHJldHVybiB7IHN0YXRlOiBtb2RlbFZhbHVlIH07XG59XG5cblxuLyoqXG4gKiBNb2RlbEZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogQ2FsbGVkIGJ5IGBDb21wb25lbnQucHJvdG90eXBlLnNldFN0YXRlYCB0byBzZXQgZmFjZXQncyBzdGF0ZVxuICogU2ltcGx5IHNldHMgbW9kZWwgZGF0YVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZSBkYXRhIHRvIHNldCBvbiBmYWNldCdzIG1vZGVsXG4gKi9cbmZ1bmN0aW9uIE1vZGVsRmFjZXQkc2V0U3RhdGUoc3RhdGUpIHtcbiAgICByZXR1cm4gdGhpcy5tLnNldChzdGF0ZS5zdGF0ZSk7XG59XG5cblxuZnVuY3Rpb24gTW9kZWxGYWNldCRfY3JlYXRlTWVzc2VuZ2VyKCkgeyAvLyBDYWxsZWQgYnkgaW5oZXJpdGVkIGluaXRcbiAgICB0aGlzLl9tZXNzZW5nZXIgPSB0aGlzLm0uX21lc3Nlbmdlcjtcbn1cblxuXG5mdW5jdGlvbiBNb2RlbEZhY2V0JGRlc3Ryb3koKSB7XG4gICAgdGhpcy5tLmRlc3Ryb3koKTtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50RmFjZXQgPSByZXF1aXJlKCcuLi9jX2ZhY2V0JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jZl9yZWdpc3RyeScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNb2RlbCA9IG1pbG9Db3JlLk1vZGVsXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxuLy8gZ2VuZXJpYyBkcmFnIGhhbmRsZXIsIHNob3VsZCBiZSBvdmVycmlkZGVuXG52YXIgT3B0aW9ucyA9IF8uY3JlYXRlU3ViY2xhc3MoQ29tcG9uZW50RmFjZXQsICdPcHRpb25zJyk7XG5cbl8uZXh0ZW5kUHJvdG8oT3B0aW9ucywge1xuICAgIGluaXQ6IE9wdGlvbnMkaW5pdCxcbiAgICBkZXN0cm95OiBPcHRpb25zJGRlc3Ryb3ksXG4gICAgX2NyZWF0ZU1lc3NlbmdlcjogT3B0aW9ucyRfY3JlYXRlTWVzc2VuZ2VyXG59KTtcblxuZmFjZXRzUmVnaXN0cnkuYWRkKE9wdGlvbnMpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9wdGlvbnM7XG5cblxuZnVuY3Rpb24gT3B0aW9ucyRpbml0KCkge1xuICAgIHRoaXMubSA9IG5ldyBNb2RlbCh0aGlzLmNvbmZpZy5vcHRpb25zLCB0aGlzKTtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMubS5wcm94eU1ldGhvZHModGhpcyk7IC8vIENyZWF0ZXMgbW9kZWwncyBtZXRob2RzIGRpcmVjdGx5IG9uIGZhY2V0XG59XG5cblxuZnVuY3Rpb24gT3B0aW9ucyRfY3JlYXRlTWVzc2VuZ2VyKCkgeyAvLyBDYWxsZWQgYnkgaW5oZXJpdGVkIGluaXRcbiAgICB0aGlzLl9tZXNzZW5nZXIgPSB0aGlzLm0uX21lc3Nlbmdlcjtcbn1cblxuXG5mdW5jdGlvbiBPcHRpb25zJGRlc3Ryb3koKSB7XG4gICAgdGhpcy5tLmRlc3Ryb3koKTtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyA8YSBuYW1lPVwiY29tcG9uZW50cy1mYWNldHMtdGVtcGxhdGVcIj48L2E+XG4vLyAjIyN0ZW1wbGF0ZSBmYWNldFxuXG4vLyBzaW1wbGlmaWVzIHJlbmRlcmluZyBvZiBjb21wb25lbnQgZWxlbWVudCBmcm9tIHRlbXBsYXRlLlxuLy8gICBBbnkgdGVtcGxhdGluZyBlbmdpbmcgY2FuIGJlIHVzZWQgdGhhdCBzdXBwb3J0cyB0ZW1wbGF0ZSBjb21waWxhdGlvblxuLy8gICAob3IgeW91IGNhbiBtb2NrIHRoaXMgY29tcGlsYXRpb24gZWFzaWx5IGJ5IGNyZWF0aW5nIGNsb3N1cmUgc3RvcmluZ1xuLy8gICB0ZW1wbGF0ZSBzdHJpbmcgaW4gY2FzZSB5b3VyIGVuZ2luZSBkb2Vzbid0IHN1cHBvcnQgY29tcGlsYXRpb24pLlxuLy8gICBCeSBkZWZhdWx0IG1pbG8gdXNlcyBbZG9UXSgpLCB0aGUgbW9zdCB2ZXJzYXRpbGUsIGNvbnNjaXNlIGFuZCBhdCB0aGVcbi8vICAgc2FtZSB0aW1lIHRoZSBmYXN0ZXN0IHRlbXBsYXRpbmcgZW5naW5lLlxuLy8gICBJZiB5b3UgdXNlIG1pbG8gaW4gYnJvd3NlciwgaXQgaXMgdGhlIHBhcnQgb2YgbWlsbyBidW5kbGUgYW5kIGF2YWlsYWJsZVxuLy8gICBhcyBnbG9iYWwgdmFyaWFibGUgYGRvVGAuXG5cbnZhciBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaFxuICAgICwgYmluZGVyID0gcmVxdWlyZSgnLi4vLi4vYmluZGVyJyk7XG5cblxuLy8gZGF0YSBtb2RlbCBjb25uZWN0aW9uIGZhY2V0XG52YXIgVGVtcGxhdGUgPSBfLmNyZWF0ZVN1YmNsYXNzKENvbXBvbmVudEZhY2V0LCAnVGVtcGxhdGUnKTtcblxuXy5leHRlbmRQcm90byhUZW1wbGF0ZSwge1xuICAgIGluaXQ6IFRlbXBsYXRlJGluaXQsXG4gICAgc3RhcnQ6IFRlbXBsYXRlJHN0YXJ0LFxuICAgIHNldDogVGVtcGxhdGUkc2V0LFxuICAgIGdldENvbXBpbGVkOiBUZW1wbGF0ZSRnZXRDb21waWxlZCxcbiAgICByZW5kZXI6IFRlbXBsYXRlJHJlbmRlcixcbiAgICBiaW5kZXI6IFRlbXBsYXRlJGJpbmRlclxuXG4gICAgLy8gX3JlYXR0YWNoOiBfcmVhdHRhY2hFdmVudHNPbkVsZW1lbnRDaGFuZ2Vcbn0pO1xuXG5mYWNldHNSZWdpc3RyeS5hZGQoVGVtcGxhdGUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRlbXBsYXRlO1xuXG5cbmZ1bmN0aW9uIFRlbXBsYXRlJGluaXQoKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIC8vIHRlbXBsYXRlcyBhcmUgaW50ZXJwb2xhdGVkIHdpdGggZGVmYXVsdCAoZG9UKSBvciBjb25maWd1cmVkIGVuZ2luZSAodGhpcy5jb25maWcuY29tcGlsZSlcbiAgICAvLyB1bmxlc3MgdGhpcy5jb25maWcuaW50ZXJwb2xhdGUgaXMgZmFsc2VcbiAgICB2YXIgY29tcGlsZSA9IHRoaXMuY29uZmlnLmludGVycG9sYXRlID09PSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuY29uZmlnLmNvbXBpbGUgfHwgbWlsby5jb25maWcudGVtcGxhdGUuY29tcGlsZTtcblxuICAgIHRoaXMuc2V0KHRoaXMuY29uZmlnLnRlbXBsYXRlIHx8ICcnLCBjb21waWxlLCB0aGlzLmNvbmZpZy5jb21waWxlT3B0aW9ucyk7XG59XG5cblxuZnVuY3Rpb24gVGVtcGxhdGUkc3RhcnQoKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLnN0YXJ0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHRoaXMuY29uZmlnLmF1dG9SZW5kZXIpIHtcbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmF1dG9CaW5kZXIpXG4gICAgICAgICAgICB0aGlzLmJpbmRlcigpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBUZW1wbGF0ZSRnZXRDb21waWxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGU7XG59XG5cblxuZnVuY3Rpb24gVGVtcGxhdGUkc2V0KHRlbXBsYXRlU3RyLCBjb21waWxlLCBjb21waWxlT3B0aW9ucykge1xuICAgIGNoZWNrKHRlbXBsYXRlU3RyLCBNYXRjaC5PbmVPZihTdHJpbmcsIEZ1bmN0aW9uKSk7XG4gICAgY2hlY2soY29tcGlsZSwgTWF0Y2guT3B0aW9uYWwoRnVuY3Rpb24pKTtcblxuICAgIGlmICh0eXBlb2YgdGVtcGxhdGVTdHIgPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgdGhpcy5fdGVtcGxhdGUgPSB0ZW1wbGF0ZVN0cjtcbiAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5fdGVtcGxhdGVTdHIgPSB0ZW1wbGF0ZVN0cjtcbiAgICAgICAgaWYgKGNvbXBpbGUpXG4gICAgICAgICAgICB0aGlzLl9jb21waWxlID0gY29tcGlsZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgY29tcGlsZSA9IHRoaXMuX2NvbXBpbGU7XG5cbiAgICAgICAgaWYgKGNvbXBpbGUpXG4gICAgICAgICAgICB0aGlzLl90ZW1wbGF0ZSA9IGNvbXBpbGUodGVtcGxhdGVTdHIsIGNvbXBpbGVPcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG5mdW5jdGlvbiBUZW1wbGF0ZSRyZW5kZXIoZGF0YSkgeyAvLyB3ZSBuZWVkIGRhdGEgb25seSBpZiB1c2UgdGVtcGxhdGluZyBlbmdpbmVcbiAgICB0aGlzLm93bmVyLmVsLmlubmVySFRNTCA9IHRoaXMuX3RlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5fdGVtcGxhdGUoZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl90ZW1wbGF0ZVN0cjtcblxuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbmZ1bmN0aW9uIFRlbXBsYXRlJGJpbmRlcigpIHtcbiAgICBpZiAodGhpcy5vd25lci5jb250YWluZXIpXG4gICAgICAgIHJldHVybiB0aGlzLm93bmVyLmNvbnRhaW5lci5iaW5kZXIoKTtcbiAgICBlbHNlXG4gICAgICAgIGxvZ2dlci5lcnJvcignVGVtcGxhdGVGYWNldDogQmluZGVyIGNhbGxlZCB3aXRob3V0IGNvbnRhaW5lciBmYWNldC4nKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY2ZfcmVnaXN0cnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbi8qKlxuICogVHJhbnNmZXIgZmFjZXQgaXMgZGVzaWduZWQgZm9yIGNvbXBvbmVudHMgdG8gYmUgYWJsZSB0byByZXByZXNlbnQgb3RoZXIgY29tcG9uZW50c1xuICogSWYgYSBbQ29tcG9uZW50XSguLi9jX2NsYXNzLmpzLmh0bWwpIGhhcyBUcmFuc2ZlciBmYWNldCwgd2hlbiBgQ29tcG9uZW50LmdldFN0YXRlYCBpcyBjYWxsZWQgZm9yIHRoaXMgY29tcG9uZXQgaXQgcmV0dXJucyBwcmV2aW91c2x5IHNhdmVkIGRhdGEsIHBvc3NpYmx5IGZyb20gYW5vdGhlciBjb21wb25lbnQuXG4gKiBGb3IgZXhhbXBsZSwgYSBsaXN0IG9mIGRvY3VtZW50cyBjYW4gdXNlIHRoaXMgZmFjZXQgc28gdGhhdCBlYWNoIGl0ZW0gaW4gdGhlIGxpc3QgY2FuIHN0b3JlIGFjdHVhbCBkb2N1bWVudCBjb21wb25lbnQgb24gaXQuXG4gKi9cbnZhciBUcmFuc2ZlciA9IF8uY3JlYXRlU3ViY2xhc3MoQ29tcG9uZW50RmFjZXQsICdUcmFuc2ZlcicpO1xuXG5fLmV4dGVuZFByb3RvKFRyYW5zZmVyLCB7XG4gICAgaW5pdDogVHJhbnNmZXIkaW5pdCxcbiAgICBnZXRTdGF0ZTogVHJhbnNmZXIkZ2V0U3RhdGUsXG4gICAgc2V0U3RhdGU6IFRyYW5zZmVyJHNldFN0YXRlLFxuICAgIHNldEFjdGl2ZVN0YXRlOiBUcmFuc2ZlciRzZXRBY3RpdmVTdGF0ZSxcbiAgICBzZXRTdGF0ZVdpdGhLZXk6IFRyYW5zZmVyJHNldFN0YXRlV2l0aEtleSxcbiAgICBnZXRTdGF0ZVdpdGhLZXk6IFRyYW5zZmVyJGdldFN0YXRlV2l0aEtleSxcbiAgICBnZXRDb21wb25lbnRNZXRhOiBUcmFuc2ZlciRnZXRDb21wb25lbnRNZXRhXG59KTtcblxuZmFjZXRzUmVnaXN0cnkuYWRkKFRyYW5zZmVyKTtcblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2ZlcjtcblxuXG5mdW5jdGlvbiBUcmFuc2ZlciRpbml0KCkge1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5fYWN0aXZlU3RhdGUgPSAnJztcbiAgICB0aGlzLl9kZWZhdWx0S2V5ID0gJyc7XG4gICAgdGhpcy5fc3RhdGUgPSB7fTtcbn1cblxuXG4vKipcbiAqIFRyYW5zZmVyIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyB0cmFuc2ZlciBzdGF0ZSBmb3IgY29tcG9uZW50LiBDYW4gYmUgb2J0YWluZWQgZnJvbSBhbm90aGVyIGNvbXBvbmVudCBieSB1c2luZyBgQ29tcG9uZW50LmdldFN0YXRlYFxuICpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gVHJhbnNmZXIkZ2V0U3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlW3RoaXMuX2FjdGl2ZVN0YXRlXSB8fCB0aGlzLl9zdGF0ZVt0aGlzLl9kZWZhdWx0S2V5XTtcbn1cblxuXG4vKipcbiAqIFRyYW5zZmVyIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyB0cmFuc2ZlciBzdGF0ZSBmb3IgY29tcG9uZW50LiBDYW4gYmUgb2J0YWluZWQgZnJvbSBhbm90aGVyIGNvbXBvbmVudCBieSB1c2luZyBgQ29tcG9uZW50LmdldFN0YXRlYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICovXG5mdW5jdGlvbiBUcmFuc2ZlciRzZXRTdGF0ZShzdGF0ZSkge1xuICAgIHRoaXMuX3N0YXRlWycnXSA9IHN0YXRlO1xuICAgIHRoaXMuc2V0QWN0aXZlU3RhdGUoJycpO1xufVxuXG4vKipcbiAqIFRyYW5zZmVyIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyB0aGUgYWN0aXZlIHN0YXRlICh1c2VkIGJ5IGdldFN0YXRlKVxuICogQHBhcmFtIHtbdHlwZV19IGtleSBbZGVzY3JpcHRpb25dXG4gKi9cbmZ1bmN0aW9uIFRyYW5zZmVyJHNldEFjdGl2ZVN0YXRlKGtleSkge1xuICAgIHRoaXMuX2FjdGl2ZVN0YXRlID0ga2V5O1xufVxuXG4vKipcbiAqIFRyYW5zZmVyIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyB0cmFuc2ZlciBzdGF0ZSBmb3IgY29tcG9uZW50IHdpdGhvdXQgZGVmYXVsdCBrZXkuIENhbiBiZSBvYnRhaW5lZCBmcm9tIGFub3RoZXIgY29tcG9uZW50IGJ5IHVzaW5nIGBDb21wb25lbnQuZ2V0U3RhdGVgXG4gKiBXaGVuIHRoZSBhY3RpdmUgc3RhdGUgaXMgc2V0IHRvIHRoZSBleHBlY3RlZCBrZXlcbiAqIEBwYXJhbSB7W3R5cGVdfSBrZXkgICBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0ge1t0eXBlXX0gc3RhdGUgW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtIHtCb29sZWFufSBpc0RlZmF1bHRLZXkgKE9wdGlvbmFsKVxuICovXG5mdW5jdGlvbiBUcmFuc2ZlciRzZXRTdGF0ZVdpdGhLZXkoa2V5LCBzdGF0ZSwgaXNEZWZhdWx0S2V5KSB7XG4gICAgaWYgKCFrZXkpIHRocm93IG5ldyBFcnJvcignVHJhbnNmZXIkc2V0U3RhdGVXaXRoS2V5OiBubyBrZXknKTtcblxuICAgIGlmIChpc0RlZmF1bHRLZXkpXG4gICAgICAgIHRoaXMuX2RlZmF1bHRLZXkgPSBrZXk7XG4gICAgZWxzZVxuICAgICAgICB0aGlzLl9kZWZhdWx0S2V5ID0gdGhpcy5fZGVmYXVsdEtleSB8fCBrZXk7XG5cbiAgICB0aGlzLl9zdGF0ZVtrZXldID0gc3RhdGU7XG4gICAgdGhpcy5zZXRBY3RpdmVTdGF0ZShrZXkpO1xufVxuXG5cbmZ1bmN0aW9uIFRyYW5zZmVyJGdldFN0YXRlV2l0aEtleShrZXkpIHtcbiAgICByZXR1cm4gdHlwZW9mIGtleSA9PSAnc3RyaW5nJyAmJiB0aGlzLl9zdGF0ZVtrZXldO1xufVxuXG5cbmZ1bmN0aW9uIFRyYW5zZmVyJGdldENvbXBvbmVudE1ldGEoKSB7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5nZXRTdGF0ZSgpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBOYW1lOiBzdGF0ZSAmJiBzdGF0ZS5jb21wTmFtZSxcbiAgICAgICAgY29tcENsYXNzOiBzdGF0ZSAmJiBzdGF0ZS5jb21wQ2xhc3NcbiAgICB9O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ2xhc3NSZWdpc3RyeSA9IHJlcXVpcmUoJy4uLy4uL2Fic3RyYWN0L3JlZ2lzdHJ5JylcbiAgICAsIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpO1xuXG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzYFxuICogQ29tcG9uZW50IGZhY2V0cyByZWdpc3RyeS4gQW4gaW5zdGFuY2Ugb2YgW0NsYXNzUmVnaXN0cnldKC4uLy4uL2Fic3RyYWN0L3JlZ2lzdHJ5LmpzLmh0bWwpIGNsYXNzIHRoYXQgaXMgdXNlZCBieSBtaWxvIHRvIHJlZ2lzdGVyIGFuZCBmaW5kIGZhY2V0cy5cbiAqL1xuIHZhciBmYWNldHNSZWdpc3RyeSA9IG5ldyBDbGFzc1JlZ2lzdHJ5KENvbXBvbmVudEZhY2V0KTtcblxuXG4vLyBBZGRzIGNvbW1vbiBhbmNlc3RvciB0byBhbGwgZmFjZXRzIG9mIGNvbXBvbmVudHMgdG8gdGhlIHJlZ2lzdHJ5LlxuZmFjZXRzUmVnaXN0cnkuYWRkKENvbXBvbmVudEZhY2V0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmYWNldHNSZWdpc3RyeTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY19yZWdpc3RyeScpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY19mYWNldHMvY2ZfcmVnaXN0cnknKVxuICAgICwgY29tcG9uZW50TmFtZSA9IHJlcXVpcmUoJy4uL3V0aWwvY29tcG9uZW50X25hbWUnKVxuICAgICwgU2NvcGUgPSByZXF1aXJlKCcuL3Njb3BlJylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxubW9kdWxlLmV4cG9ydHMgPSBDb21wb25lbnRJbmZvO1xuXG5cbi8qKlxuICogU2ltcGxlIGNsYXNzIHRvIGhvbGQgaW5mb3JtYXRpb24gYWxsb3dpbmcgdG8gY3JlYXRlL2NvcHkgY29tcG9uZW50IHVzaW5nIFtgQ29tcG9uZW50LmNyZWF0ZWBdKC4vY19jbGFzcy5qcy5odG1sI2NyZWF0ZSkgYW5kIFtgQ29tcG9uZW50LmNvcHlgXSguL2NfY2xhc3MuanMuaHRtbCNjb3B5KS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U2NvcGV9IHNjb3BlIHNjb3BlIG9iamVjdCB0aGUgY29tcG9uZW50IGJlbG9ncyB0bywgdXN1YWxseSBlaXRoZXIgdG9wIGxldmVsIHNjb3BlIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieSBbbWlsby5iaW5kZXJdKC4uL2JpbmRlci5qcy5odG1sKSBvciBgc2NvcGVgIHByb3BlcnR5IG9mIFtDb250YWluZXJdKC4vY19mYWNldHMvQ29udGFpbmVyLmpzLmh0bWwpIGZhY2V0IG9mIGNvbnRhaW5pbmcgY29tcG9uZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsIERPTSBlbGVtZW50IHRoZSBjb21wb25lbnQgaXMgYXR0YWNoZWQgdG9cbiAqIEBwYXJhbSB7QmluZEF0dHJpYnV0ZX0gYXR0ciBCaW5kQXR0cmlidXRlIGluc3RhbmNlIHRoYXQgdGhlIGNvbXBvbmVudCB3YXMgY3JlYXRlZCB3aXRoXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHRocm93T25FcnJvcnMgSWYgc2V0IHRvIGZhbHNlLCB0aGVuIGVycm9ycyB3aWxsIG9ubHkgYmUgbG9nZ2VkIHRvIGNvbnNvbGUuIFRydWUgYnkgZGVmYXVsdC5cbiAqIEByZXR1cm4ge0NvbXBvbmVudEluZm99XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudEluZm8oc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgYXR0ci5wYXJzZSgpLnZhbGlkYXRlKCk7XG5cbiAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG4gICAgdGhpcy5lbCA9IGVsO1xuICAgIHRoaXMuYXR0ciA9IGF0dHI7XG4gICAgdGhpcy5uYW1lID0gYXR0ci5jb21wTmFtZTtcbiAgICB0aGlzLkNvbXBvbmVudENsYXNzID0gZ2V0Q29tcG9uZW50Q2xhc3MoYXR0ciwgdGhyb3dPbkVycm9ycyk7XG4gICAgdGhpcy5leHRyYUZhY2V0c0NsYXNzZXMgPSBnZXRDb21wb25lbnRFeHRyYUZhY2V0cyh0aGlzLkNvbXBvbmVudENsYXNzLCBhdHRyLCB0aHJvd09uRXJyb3JzKTtcblxuICAgIGlmICh0aGlzLkNvbXBvbmVudENsYXNzXG4gICAgICAgICAgICAmJiBoYXNDb250YWluZXJGYWNldCh0aGlzLkNvbXBvbmVudENsYXNzLCB0aGlzLmV4dHJhRmFjZXRzQ2xhc3NlcykpIHtcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSB7fTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiAjIyMjQ29tcG9uZW50SW5mbyBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICogXG4gKiAtIFtkZXN0cm95XSgjQ29tcG9uZW50SW5mbyRkZXN0cm95KVxuICogLSBbcmVuYW1lXSgjQ29tcG9uZW50SW5mbyRyZW5hbWUpXG4gKi9cbl8uZXh0ZW5kUHJvdG8oQ29tcG9uZW50SW5mbywge1xuICAgIGRlc3Ryb3k6IENvbXBvbmVudEluZm8kZGVzdHJveSxcbiAgICByZW5hbWU6IENvbXBvbmVudEluZm8kcmVuYW1lXG59KTtcblxuXG4vKipcbiAqIENvbXBvbmVudEluZm8gaW5zdGFuY2UgbWV0aG9kXG4gKiBEZXN0cm95cyBDb21wb25lbnRJbmZvIGJ5IHJlbW92aW5nIHRoZSByZWZlcmVuY2VzIHRvIERPTSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudEluZm8kZGVzdHJveSgpIHtcbiAgICBkZWxldGUgdGhpcy5lbDtcbiAgICB0aGlzLmF0dHIuZGVzdHJveSgpO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50SW5mbyBpbnN0YW5jZSBtZXRob2RcbiAqIFJlbmFtZXMgQ29tcG9uZW50SW5mbyBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge1tTdHJpbmddfSBuYW1lIG9wdGlvbmFsIG5ldyBjb21wb25lbnQgbmFtZSwgZ2VuZXJhdGVkIGZyb20gdGltZXN0YW1wIGJ5IGRlZmF1bHRcbiAqIEBwYXJhbSB7W0Jvb2xlYW5dfSByZW5hbWVJblNjb3BlIG9wdGlvbmFsIGZhbHNlIHRvIG5vdCByZW5hbWUgQ29tcG9uZW50SW5mbyBvYmplY3QgaW4gaXRzIHNjb3BlLCB0cnVlIGJ5IGRlZmF1bHRcbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50SW5mbyRyZW5hbWUobmFtZSwgcmVuYW1lSW5TY29wZSkge1xuICAgIG5hbWUgPSBuYW1lIHx8IGNvbXBvbmVudE5hbWUoKTtcbiAgICBTY29wZS5yZW5hbWUodGhpcywgbmFtZSwgcmVuYW1lSW5TY29wZSk7XG4gICAgdGhpcy5hdHRyLmNvbXBOYW1lID0gbmFtZTtcbiAgICB0aGlzLmF0dHIuZGVjb3JhdGUoKTtcbn1cblxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnRDbGFzcyhhdHRyLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgdmFyIENvbXBvbmVudENsYXNzID0gY29tcG9uZW50c1JlZ2lzdHJ5LmdldChhdHRyLmNvbXBDbGFzcyk7XG4gICAgaWYgKCEgQ29tcG9uZW50Q2xhc3MpXG4gICAgICAgIHJlcG9ydEJpbmRlckVycm9yKHRocm93T25FcnJvcnMsICdjbGFzcyAnICsgYXR0ci5jb21wQ2xhc3MgKyAnIGlzIG5vdCByZWdpc3RlcmVkJyk7XG4gICAgcmV0dXJuIENvbXBvbmVudENsYXNzO1xufVxuXG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudEV4dHJhRmFjZXRzKENvbXBvbmVudENsYXNzLCBhdHRyLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgdmFyIGZhY2V0cyA9IGF0dHIuY29tcEZhY2V0c1xuICAgICAgICAsIGV4dHJhRmFjZXRzQ2xhc3NlcyA9IHt9O1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmFjZXRzKSlcbiAgICAgICAgZmFjZXRzLmZvckVhY2goZnVuY3Rpb24oZmN0TmFtZSkge1xuICAgICAgICAgICAgZmN0TmFtZSA9IF8uZmlyc3RVcHBlckNhc2UoZmN0TmFtZSk7XG4gICAgICAgICAgICBpZiAoQ29tcG9uZW50Q2xhc3MuaGFzRmFjZXQoZmN0TmFtZSkpXG4gICAgICAgICAgICAgICAgcmVwb3J0QmluZGVyRXJyb3IodGhyb3dPbkVycm9ycywgJ2NsYXNzICcgKyBDb21wb25lbnRDbGFzcy5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJyBhbHJlYWR5IGhhcyBmYWNldCAnICsgZmN0TmFtZSk7XG4gICAgICAgICAgICBpZiAoZXh0cmFGYWNldHNDbGFzc2VzW2ZjdE5hbWVdKVxuICAgICAgICAgICAgICAgIHJlcG9ydEJpbmRlckVycm9yKHRocm93T25FcnJvcnMsICdjb21wb25lbnQgJyArIGF0dHIuY29tcE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnIGFscmVhZHkgaGFzIGZhY2V0ICcgKyBmY3ROYW1lKTtcbiAgICAgICAgICAgIHZhciBGYWNldENsYXNzID0gZmFjZXRzUmVnaXN0cnkuZ2V0KGZjdE5hbWUpO1xuICAgICAgICAgICAgZXh0cmFGYWNldHNDbGFzc2VzW2ZjdE5hbWVdID0gRmFjZXRDbGFzcztcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gZXh0cmFGYWNldHNDbGFzc2VzO1xufVxuXG5cbmZ1bmN0aW9uIHJlcG9ydEJpbmRlckVycm9yKHRocm93T25FcnJvcnMsIG1lc3NhZ2UpIHtcbiAgICBpZiAodGhyb3dPbkVycm9ycyA9PT0gZmFsc2UpXG4gICAgICAgIGxvZ2dlci5lcnJvcignQ29tcG9uZW50SW5mbyBiaW5kZXIgZXJyb3I6JywgbWVzc2FnZSk7XG4gICAgZWxzZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG59O1xuXG5cbmZ1bmN0aW9uIGhhc0NvbnRhaW5lckZhY2V0KENvbXBvbmVudENsYXNzLCBleHRyYUZhY2V0c0NsYXNzZXMpIHtcbiAgICByZXR1cm4gKENvbXBvbmVudENsYXNzLmhhc0ZhY2V0KCdjb250YWluZXInKVxuICAgICAgICB8fCAnQ29udGFpbmVyJyBpbiBleHRyYUZhY2V0c0NsYXNzZXNcbiAgICAgICAgfHwgXy5zb21lS2V5KGV4dHJhRmFjZXRzQ2xhc3NlcywgZmFjZXRSZXF1aXJlc0NvbnRhaW5lcilcbiAgICAgICAgfHwgY2xhc3NIYXNGYWNldFRoYXRSZXF1aXJlc0NvbnRhaW5lcigpKTtcblxuICAgIGZ1bmN0aW9uIGNsYXNzSGFzRmFjZXRUaGF0UmVxdWlyZXNDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiAoQ29tcG9uZW50Q2xhc3MucHJvdG90eXBlLmZhY2V0c0NsYXNzZXNcbiAgICAgICAgICAgICYmIF8uc29tZUtleShDb21wb25lbnRDbGFzcy5wcm90b3R5cGUuZmFjZXRzQ2xhc3NlcywgZmFjZXRSZXF1aXJlc0NvbnRhaW5lcikpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmFjZXRSZXF1aXJlc0NvbnRhaW5lcihGYWNldENsYXNzKSB7XG4gICAgICAgIHJldHVybiBGYWNldENsYXNzLnJlcXVpcmVzRmFjZXQoJ2NvbnRhaW5lcicpO1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENsYXNzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9hYnN0cmFjdC9yZWdpc3RyeScpXG4gICAgLCBDb21wb25lbnQgPSByZXF1aXJlKCcuL2NfY2xhc3MnKTtcblxuLyoqXG4gKiBgbWlsby5yZWdpc3RyeS5jb21wb25lbnRzYFxuICogQW4gaW5zdGFuY2Ugb2YgW0NsYXNzUmVnaXN0cnldKC4uL2Fic3RyYWN0L3JlZ2lzdHJ5LmpzLmh0bWwpIGNsYXNzIHRoYXQgaXMgdXNlZCBieSBtaWxvIHRvIHJlZ2lzdGVyIGFuZCBmaW5kIGNvbXBvbmVudHMuXG4gKi9cbnZhciBjb21wb25lbnRzUmVnaXN0cnkgPSBuZXcgQ2xhc3NSZWdpc3RyeShDb21wb25lbnQpO1xuXG4vLyBhZGQgY29tbW9uIGFuY2VzdG9yIHRvIGFsbCBjb21wb25lbnRzIHRvIHRoZSByZWdpc3RyeS5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoQ29tcG9uZW50KTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb21wb25lbnRzUmVnaXN0cnk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxudmFyIGNvbXBvbmVudFV0aWxzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgaXNDb21wb25lbnQ6IGlzQ29tcG9uZW50LFxuICAgIGdldENvbXBvbmVudDogZ2V0Q29tcG9uZW50LFxuICAgIGdldENvbnRhaW5pbmdDb21wb25lbnQ6IGdldENvbnRhaW5pbmdDb21wb25lbnQsXG4gICAgX21ha2VDb21wb25lbnRDb25kaXRpb25GdW5jOiBfbWFrZUNvbXBvbmVudENvbmRpdGlvbkZ1bmNcbn07XG5cblxuLyoqXG4gKiBpc0NvbXBvbmVudFxuICpcbiAqIENoZWNrcyBpZiBlbGVtZW50IGhhcyBhIGNvbXBvbmVudCBhdHRhY2hlZCB0byBpdCBieVxuICogY2hlY2tpbmcgdGhlIHByZXNlbmNlIG9mIHByb3BlcnR5IGRpZmluZWQgaW4gbWlsby5jb25maWdcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsIERPTSBlbGVtZW50XG4gKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlLCBpZiBpdCBoYXMgbWlsbyBjb21wb25lbnQgYXR0YWNoZWQgdG8gaXRcbiAqL1xuZnVuY3Rpb24gaXNDb21wb25lbnQoZWwpIHtcbiAgICByZXR1cm4gZWwuaGFzT3duUHJvcGVydHkoY29uZmlnLmNvbXBvbmVudFJlZik7XG59XG5cblxuLyoqXG4gKiBnZXRDb21wb25lbnRcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsIERPTSBlbGVtZW50XG4gKiBAcmV0dXJuIHtDb21wb25lbnR9IGNvbXBvbmVudCBhdHRhY2hlZCB0byBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGdldENvbXBvbmVudChlbCkge1xuICAgIHJldHVybiBlbCAmJiBlbFtjb25maWcuY29tcG9uZW50UmVmXTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNsb3Nlc3QgY29tcG9uZW50IHdoaWNoIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudCxcbiAqIG9wdGlvbmFsbHksIG9ubHkgY29tcG9uZW50IHRoYXQgcGFzc2VzIGBjb25kaXRpb25gIHRlc3Qgb3IgY29udGFpbnMgc3BlY2lmaWVkIGZhY2V0XG4gKlxuICogVW5sZXNzIGByZXR1cm5DdXJyZW50YCBwYXJhbWV0ZXIgaXMgZmFsc2UsIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVyblxuICogdGhlIGN1cnJlbnQgY29tcG9uZW50IG9mIHRoZSBlbGVtZW50ICh0cnVlIGJ5IGRlZmF1bHQpLlxuICpcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBET00gRWxlbWVudCBvciB0ZXh0IE5vZGVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcmV0dXJuQ3VycmVudCBvcHRpb25hbCBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29tcG9uZW50IG9mIHRoZSBlbGVtZW50IGNhbiBiZSByZXR1cm5lZC4gVHJ1ZSBieSBkZWZhdWx0LCBzaG91bGQgYmUgZmFsc2UgdG8gcmV0dXJuIG9ubHkgYW5jZXN0b3JzLlxuICogQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IGNvbmRpdGlvbk9yRmFjZXQgb3B0aW9uYWwgY29uZGl0aW9uIHRoYXQgY29tcG9uZW50IHNob3VsZCBwYXNzIChvciBmYWNldCBuYW1lIGl0IHNob3VsZCBjb250YWluKVxuICogQHJldHVybiB7Q29tcG9uZW50fSBcbiAqL1xuZnVuY3Rpb24gZ2V0Q29udGFpbmluZ0NvbXBvbmVudChub2RlLCByZXR1cm5DdXJyZW50LCBjb25kaXRpb25PckZhY2V0KSB7XG4gICAgLy8gY2hlY2sobm9kZSwgTm9kZSk7IC0gY2FuJ3QgY2hlY2sgdGl5cGUgaGVyZSBhcyBpdCBpcyBtb3N0IGxpa2VseSBjb21pbmcgZnJvbSBhbm90aGVyIGZyYW1lXG4gICAgY2hlY2socmV0dXJuQ3VycmVudCwgTWF0Y2guT3B0aW9uYWwoQm9vbGVhbikpO1xuICAgIGNoZWNrKGNvbmRpdGlvbk9yRmFjZXQsIE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9uZU9mKEZ1bmN0aW9uLCBTdHJpbmcpKSk7XG5cbiAgICB2YXIgY29uZGl0aW9uRnVuYyA9IF9tYWtlQ29tcG9uZW50Q29uZGl0aW9uRnVuYyhjb25kaXRpb25PckZhY2V0KTtcblxuICAgIHJldHVybiBfZ2V0Q29udGFpbmluZ0NvbXBvbmVudChub2RlLCByZXR1cm5DdXJyZW50LCBjb25kaXRpb25GdW5jKTtcbn1cblxuXG5mdW5jdGlvbiBfbWFrZUNvbXBvbmVudENvbmRpdGlvbkZ1bmMoY29uZGl0aW9uT3JGYWNldCkge1xuICAgIGlmICh0eXBlb2YgY29uZGl0aW9uT3JGYWNldCA9PSAnZnVuY3Rpb24nKVxuICAgICAgICByZXR1cm4gY29uZGl0aW9uT3JGYWNldDtcbiAgICBlbHNlIGlmICh0eXBlb2YgY29uZGl0aW9uT3JGYWNldCA9PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgZmFjZXROYW1lID0gXy5maXJzdExvd2VyQ2FzZShjb25kaXRpb25PckZhY2V0KTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjb21wKSB7XG4gICAgICAgICAgIHJldHVybiBjb21wLmhhc0ZhY2V0KGZhY2V0TmFtZSk7XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIF9nZXRDb250YWluaW5nQ29tcG9uZW50KGVsLCByZXR1cm5DdXJyZW50LCBjb25kaXRpb25GdW5jKSB7XG4gICAgLy8gV2hlcmUgdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBhIGNvbXBvbmVudCBpdCBzaG91bGQgYmUgcmV0dXJuZWRcbiAgICAvLyBpZiByZXR1cm5DdXJyZW50IGlzIHRydWUgb3IgdW5kZWZpbmVkXG4gICAgaWYgKHJldHVybkN1cnJlbnQgIT09IGZhbHNlKSB7XG4gICAgICAgIHZhciBjb21wID0gZ2V0Q29tcG9uZW50KGVsKTtcbiAgICAgICAgaWYgKGNvbXAgJiYgKCEgY29uZGl0aW9uRnVuYyB8fCBjb25kaXRpb25GdW5jKGNvbXApKSlcbiAgICAgICAgICAgIHJldHVybiBjb21wO1xuICAgIH1cblxuICAgIC8vIFdoZXJlIHRoZXJlIGlzIG5vIHBhcmVudCBlbGVtZW50LCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHVuZGVmaW5lZFxuICAgIC8vIFRoZSBwYXJlbnQgZWxlbWVudCBpcyBjaGVja2VkIHJlY3Vyc2l2ZWx5XG4gICAgaWYgKGVsLnBhcmVudE5vZGUpXG4gICAgICAgIHJldHVybiBfZ2V0Q29udGFpbmluZ0NvbXBvbmVudChlbC5wYXJlbnROb2RlLCB0cnVlLCBjb25kaXRpb25GdW5jKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpO1xuXG5cbnZhciBWaWV3ID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdWaWV3JywgWydjb250YWluZXInXSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoVmlldyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmlldztcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgZ2V0RWxlbWVudERhdGFBY2Nlc3MgPSByZXF1aXJlKCcuL2RlX2RhdGEnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2VuZ2VyQVBJID0gbWlsb0NvcmUuY2xhc3Nlcy5NZXNzZW5nZXJBUElcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5cbi8vIGNsYXNzIHRvIGhhbmRsZSBzdWJzY3JpYnRpb25zIHRvIGNoYW5nZXMgaW4gRE9NIGZvciBVSSAobWF5YmUgYWxzbyBjb250ZW50IGVkaXRhYmxlKSBlbGVtZW50c1xuXG4vKipcbiAqIEEgY2xhc3NcbiAqL1xudmFyIERhdGFNc2dBUEkgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NlbmdlckFQSSwgJ0RhdGFNc2dBUEknLCB0cnVlKTtcblxuXG5fLmV4dGVuZFByb3RvKERhdGFNc2dBUEksIHtcbiAgICAvLyBpbXBsZW1lbnRpbmcgTWVzc2FnZVNvdXJjZSBpbnRlcmZhY2VcbiAgICBpbml0OiBEYXRhTXNnQVBJJGluaXQsXG4gICAgdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlOiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UsXG4gICAgZmlsdGVyU291cmNlTWVzc2FnZTogZmlsdGVyU291cmNlTWVzc2FnZSxcbiAgICBjcmVhdGVJbnRlcm5hbERhdGE6IGNyZWF0ZUludGVybmFsRGF0YSxcblxuICAgIC8vIGNsYXNzIHNwZWNpZmljIG1ldGhvZHNcbiAgICB2YWx1ZTogRGF0YU1zZ0FQSSR2YWx1ZVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRGF0YU1zZ0FQSTtcblxuXG5mdW5jdGlvbiBEYXRhTXNnQVBJJGluaXQoY29tcG9uZW50KSB7XG4gICAgTWVzc2VuZ2VyQVBJLnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICB0aGlzLmVsRGF0YSA9IGdldEVsZW1lbnREYXRhQWNjZXNzKGNvbXBvbmVudC5lbCk7XG59XG5cblxuLy8gZ2V0RG9tRWxlbWVudERhdGFWYWx1ZVxuZnVuY3Rpb24gRGF0YU1zZ0FQSSR2YWx1ZSgpIHsgLy8gdmFsdWUgbWV0aG9kXG4gICAgdmFyIGNvbXBvbmVudEdldHRlciA9IHRoaXMuY29tcG9uZW50LmRhdGEuY29uZmlnLmdldDtcbiAgICB2YXIgbmV3VmFsdWUgPSB0eXBlb2YgY29tcG9uZW50R2V0dGVyID09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICAgICAgICAgPyBjb21wb25lbnRHZXR0ZXIuY2FsbCh0aGlzLmNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmVsRGF0YS5nZXQodGhpcy5jb21wb25lbnQuZWwpO1xuXG4gICAgdGhpcy5jb21wb25lbnQuZGF0YS5fdmFsdWUgPSBuZXdWYWx1ZTtcblxuICAgIHJldHVybiBuZXdWYWx1ZTtcbn1cblxuXG4vLyBUT0RPOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gcmVsZXZhbnQgRE9NIGV2ZW50IGRlcGVuZGVudCBvbiBlbGVtZW50IHRhZ1xuLy8gQ2FuIGFsc28gaW1wbGVtZW50IGJlZm9yZWRhdGFjaGFuZ2VkIGV2ZW50IHRvIGFsbG93IHByZXZlbnRpbmcgdGhlIGNoYW5nZVxuLy8gdHJhbnNsYXRlVG9Eb21FdmVudFxuZnVuY3Rpb24gdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICB2YXIgY29tcG9uZW50RXZlbnQgPSB0aGlzLmNvbXBvbmVudC5kYXRhLmNvbmZpZy5ldmVudDtcbiAgICB2YXIgZXZlbnQgPSBjb21wb25lbnRFdmVudCB8fCB0aGlzLmVsRGF0YS5ldmVudCh0aGlzLmNvbXBvbmVudC5lbCk7XG5cbiAgICBpZiAobWVzc2FnZSA9PSAnJyAmJiBldmVudClcbiAgICAgICAgcmV0dXJuIGV2ZW50OyAgLy8gdGhpcy50YWdFdmVudDtcbn1cblxuXG4vLyBmaWx0ZXJEYXRhTWVzc2FnZVxuZnVuY3Rpb24gZmlsdGVyU291cmNlTWVzc2FnZShzb3VyY2VNZXNzYWdlLCBtZXNzYWdlLCBkYXRhKSB7XG4gICAgcmV0dXJuIGRhdGEubmV3VmFsdWUgIT0gZGF0YS5vbGRWYWx1ZTtcbn1cblxuXG5mdW5jdGlvbiBjcmVhdGVJbnRlcm5hbERhdGEoc291cmNlTWVzc2FnZSwgbWVzc2FnZSwgZGF0YSkge1xuICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMuY29tcG9uZW50LmRhdGEuX3ZhbHVlXG4gICAgICAgICwgbmV3VmFsdWUgPSB0aGlzLnZhbHVlKCk7XG5cbiAgICB2YXIgaW50ZXJuYWxEYXRhID0geyBcbiAgICAgICAgcGF0aDogJycsXG4gICAgICAgIHR5cGU6ICdjaGFuZ2VkJyxcbiAgICAgICAgb2xkVmFsdWU6IG9sZFZhbHVlLFxuICAgICAgICBuZXdWYWx1ZTogbmV3VmFsdWVcbiAgICB9O1xuICAgIHJldHVybiBpbnRlcm5hbERhdGE7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG4vKipcbiAqIFJldHVybnMgZGF0YSBhY2Nlc3MgbWV0aG9kcyBhbmQgZXZlbnRzIGZvciBnaXZlbiBET00gZWxlbWVudC5cbiAqIFVzZWQgYnkgW0RhdGFdKC4uL2NfZmFjZXRzL0RhdGEuanMuaHRtbCkgZmFjZXQgYW5kIGJ5IFtEYXRhTXNnQVBJXSguL2RhdGEuanMuaHRtbClcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbnZhciBnZXRFbGVtZW50RGF0YUFjY2VzcyA9IGZ1bmN0aW9uKGVsKSB7XG4gICAgdmFyIHRhZ05hbWUgPSBlbC50YWdOYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgLCBlbERhdGEgPSBkb21FbGVtZW50c0RhdGFBY2Nlc3NbdGFnTmFtZV07XG4gICAgcmV0dXJuIGVsRGF0YSB8fCBkb21FbGVtZW50c0RhdGFBY2Nlc3MuYnlEZWZhdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEVsZW1lbnREYXRhQWNjZXNzO1xuXG5cbi8qKlxuICogRGF0YSBhY2Nlc3MgbWV0aG9kcyBhbmQgZXZlbnRzIGZvciBET00gZWxlbWVudHMuXG4gKi9cbnZhciBkb21FbGVtZW50c0RhdGFBY2Nlc3MgPSB7XG4gICAgYnlEZWZhdWx0OiB7XG4gICAgICAgIHByb3BlcnR5OiAnaW5uZXJIVE1MJyxcbiAgICB9LFxuICAgICdkaXYnOiB7XG4gICAgICAgIHByb3BlcnR5OiAnaW5uZXJIVE1MJywgLy8gaGFjaywgc2hvdWxkIGJlIGlubmVySFRNTD8gdG8gbWFrZSB3b3JrIHdpdGggRWRpdGFibGUgZmFjZXRcbiAgICAgICAgLy8gZXZlbnQ6ICdpbnB1dCdcbiAgICB9LFxuICAgICdzcGFuJzoge1xuICAgICAgICBwcm9wZXJ0eTogJ2lubmVySFRNTCcsXG4gICAgICAgIGV2ZW50OiAnaW5wdXQnXG4gICAgfSxcbiAgICAncCc6IHtcbiAgICAgICAgcHJvcGVydHk6ICdpbm5lckhUTUwnLFxuICAgICAgICBldmVudDogJ2lucHV0J1xuICAgIH0sXG4gICAgJ2lucHV0Jzoge1xuICAgICAgICBwcm9wZXJ0eTogaW5wdXREYXRhUHJvcGVydHksXG4gICAgICAgIGV2ZW50OiBpbnB1dENoYW5nZUV2ZW50XG4gICAgfSxcbiAgICAndGV4dGFyZWEnOiB7XG4gICAgICAgIHByb3BlcnR5OiAndmFsdWUnLFxuICAgICAgICBldmVudDogJ2lucHV0J1xuICAgIH0sXG4gICAgJ3NlbGVjdCc6IHtcbiAgICAgICAgcHJvcGVydHk6ICd2YWx1ZScsXG4gICAgICAgIGV2ZW50OiAnY2hhbmdlJ1xuICAgIH0sXG4gICAgJ2ltZyc6IHtcbiAgICAgICAgcHJvcGVydHk6ICdzcmMnXG4gICAgfSxcbiAgICAnY2FwdGlvbic6IHtcbiAgICAgICAgcHJvcGVydHk6ICdpbm5lckhUTUwnLFxuICAgICAgICBldmVudDogJ2lucHV0J1xuICAgIH0sXG4gICAgJ3RoZWFkJzoge1xuICAgICAgICBwcm9wZXJ0eTogJ2lubmVySFRNTCcsXG4gICAgICAgIGV2ZW50OiAnaW5wdXQnXG4gICAgfSxcbiAgICAndGJvZHknOiB7XG4gICAgICAgIHByb3BlcnR5OiAnaW5uZXJIVE1MJyxcbiAgICAgICAgZXZlbnQ6ICdpbnB1dCdcbiAgICB9LFxuICAgICd0Zm9vdCc6IHtcbiAgICAgICAgcHJvcGVydHk6ICdpbm5lckhUTUwnLFxuICAgICAgICBldmVudDogJ2lucHV0J1xuICAgIH1cbn07XG5cblxuLy8gY29udmVydCBzdHJpbmdzIHRvIGZ1bmN0aW9ucyBhbmQgY3JlYXRlIGdldHNldCBtZXRob2RzXG5fLmVhY2hLZXkoZG9tRWxlbWVudHNEYXRhQWNjZXNzLCBmdW5jdGlvbih0YWdJbmZvKSB7XG4gICAgdmFyIHByb3BlcnR5ID0gdGFnSW5mby5wcm9wZXJ0eVxuICAgICAgICAsIGV2ZW50ID0gdGFnSW5mby5ldmVudDtcbiAgICBpZiAodHlwZW9mIHByb3BlcnR5ICE9ICdmdW5jdGlvbicpXG4gICAgICAgIHRhZ0luZm8ucHJvcGVydHkgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHByb3BlcnR5OyB9O1xuICAgIHZhciBwcm9wRnVuYyA9IHRhZ0luZm8ucHJvcGVydHk7XG4gICAgaWYgKHR5cGVvZiBldmVudCAhPSAnZnVuY3Rpb24nKVxuICAgICAgICB0YWdJbmZvLmV2ZW50ID0gZnVuY3Rpb24oKSB7IHJldHVybiBldmVudDsgfTtcbiAgICBpZiAoISB0YWdJbmZvLmdldClcbiAgICAgICAgdGFnSW5mby5nZXQgPSBmdW5jdGlvbihlbCkgeyByZXR1cm4gZWxbcHJvcEZ1bmMoZWwpXTsgfVxuICAgIGlmICghIHRhZ0luZm8uc2V0KVxuICAgICAgICB0YWdJbmZvLnNldCA9IGZ1bmN0aW9uKGVsLCB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIChlbFtwcm9wRnVuYyhlbCldID0gdHlwZW9mIHZhbHVlID09ICd1bmRlZmluZWQnID8gJycgOiB2YWx1ZSk7XG4gICAgICAgIH1cbn0pO1xuXG5cbi8qKlxuICogVHlwZXMgb2YgaW5wdXQgZWxlbWVudHNcbiAqL1xudmFyIGlucHV0RWxlbWVudFR5cGVzID0ge1xuICAgIGJ5RGVmYXVsdDoge1xuICAgICAgICBwcm9wZXJ0eTogJ3ZhbHVlJyxcbiAgICAgICAgZXZlbnQ6ICdpbnB1dCdcbiAgICB9LFxuICAgICdjaGVja2JveCc6IHtcbiAgICAgICAgcHJvcGVydHk6ICdjaGVja2VkJyxcbiAgICAgICAgZXZlbnQ6ICdjaGFuZ2UnXG4gICAgfSxcbiAgICAncmFkaW8nOiB7XG4gICAgICAgIHByb3BlcnR5OiAnY2hlY2tlZCcsXG4gICAgICAgIGV2ZW50OiAnY2hhbmdlJ1xuICAgIH0sXG4gICAgJ3RleHQnOiB7XG4gICAgICAgIHByb3BlcnR5OiAndmFsdWUnLFxuICAgICAgICBldmVudDogJ2lucHV0J1xuICAgIH1cbn1cblxuXG4vKipcbiAqIFJldHVybiBwcm9wZXJ0eSBvZiBpbnB1dCBlbGVtZW50IHRvIGdldC9zZXQgaXRzIGRhdGFcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGlucHV0RGF0YVByb3BlcnR5KGVsKSB7XG4gICAgdmFyIGlucHV0VHlwZSA9IGlucHV0RWxlbWVudFR5cGVzW2VsLnR5cGVdO1xuICAgIHJldHVybiBpbnB1dFR5cGVcbiAgICAgICAgICAgID8gaW5wdXRUeXBlLnByb3BlcnR5XG4gICAgICAgICAgICA6IGlucHV0RWxlbWVudFR5cGVzLmJ5RGVmYXVsdC5wcm9wZXJ0eTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgRE9NIGV2ZW50IHR5cGUgdG8gbGlzdGVuIHRvIHRvIHJlYWN0IHRvIGlucHV0IGVsZW1lbnQgY2hhbmdlXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBpbnB1dENoYW5nZUV2ZW50KGVsKSB7XG4gICAgdmFyIGlucHV0VHlwZSA9IGlucHV0RWxlbWVudFR5cGVzW2VsLnR5cGVdO1xuICAgIHJldHVybiBpbnB1dFR5cGVcbiAgICAgICAgICAgID8gaW5wdXRUeXBlLmV2ZW50XG4gICAgICAgICAgICA6IGlucHV0RWxlbWVudFR5cGVzLmJ5RGVmYXVsdC5ldmVudDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgTWVzc2VuZ2VyQVBJID0gcmVxdWlyZSgnbWlsby1jb3JlJykuY2xhc3Nlcy5NZXNzZW5nZXJBUEk7XG5cblxudmFyIERyb3BNc2dBUEkgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NlbmdlckFQSSwgJ0Ryb3BNc2dBUEknLCB0cnVlKTtcblxuXG5fLmV4dGVuZFByb3RvKERyb3BNc2dBUEksIHtcbiAgICAvLyBpbXBsZW1lbnRpbmcgTWVzc2FnZVNvdXJjZSBpbnRlcmZhY2VcbiAgICB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2U6IHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZSxcbiAgICBmaWx0ZXJTb3VyY2VNZXNzYWdlOiBmaWx0ZXJTb3VyY2VNZXNzYWdlLFxufSk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBEcm9wTXNnQVBJO1xuXG5cbnZhciBkcm9wRXZlbnRzTWFwID0ge1xuICAgICdkcmFnaW4nOiAnZHJhZ2VudGVyJyxcbiAgICAnZHJhZ291dCc6ICdkcmFnbGVhdmUnXG59O1xuXG5cbmZ1bmN0aW9uIHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgcmV0dXJuIGRyb3BFdmVudHNNYXAuaGFzT3duUHJvcGVydHkobWVzc2FnZSlcbiAgICAgICAgICAgID8gZHJvcEV2ZW50c01hcFttZXNzYWdlXVxuICAgICAgICAgICAgOiBtZXNzYWdlO1xufVxuXG5mdW5jdGlvbiByZXNldEZpbHRlclZhcnMoKSB7XG4gICAgZGVsZXRlIHRoaXMuX2N1cnJlbnRUYXJnZXQ7XG4gICAgZGVsZXRlIHRoaXMuX2luc2lkZTtcbn1cblxuZnVuY3Rpb24gZmlsdGVyU291cmNlTWVzc2FnZShzb3VyY2VNZXNzYWdlLCBtZXNzYWdlLCBkYXRhKSB7IC8vIGRhdGEgaXMgRE9NIGV2ZW50IG9iamVjdFxuICAgIHZhciBvayA9IHRydWU7XG5cbiAgICBpZiAoc291cmNlTWVzc2FnZSA9PSAnZHJhZ2VudGVyJyAmJiBtZXNzYWdlID09ICdkcmFnaW4nKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRUYXJnZXQgPSBkYXRhLnRhcmdldDtcbiAgICAgICAgb2sgPSAhdGhpcy5faW5zaWRlO1xuICAgICAgICB0aGlzLl9pbnNpZGUgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoc291cmNlTWVzc2FnZSA9PSAnZHJhZ2xlYXZlJyAmJiBtZXNzYWdlID09ICdkcmFnb3V0Jykge1xuICAgICAgICBvayA9IHRoaXMuX2N1cnJlbnRUYXJnZXQgPT0gZGF0YS50YXJnZXQ7XG4gICAgICAgIGlmIChvaykgcmVzZXRGaWx0ZXJWYXJzLmNhbGwodGhpcyk7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VNZXNzYWdlID09ICdkcm9wJykgcmVzZXRGaWx0ZXJWYXJzLmNhbGwodGhpcyk7XG5cbiAgICByZXR1cm4gb2s7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIERPTUVtaXR0ZXJTb3VyY2UgPSByZXF1aXJlKCcuLi8uLi9zZXJ2aWNlcy9kb21fc291cmNlJylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NhZ2VTb3VyY2UgPSBtaWxvQ29yZS5jbGFzc2VzLk1lc3NhZ2VTb3VyY2VcbiAgICAsIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2g7XG5cbnZhciBET01FdmVudHNTb3VyY2UgPSBfLmNyZWF0ZVN1YmNsYXNzKERPTUVtaXR0ZXJTb3VyY2UsICdET01FdmVudHNTb3VyY2UnLCB0cnVlKTtcblxuXG5fLmV4dGVuZFByb3RvKERPTUV2ZW50c1NvdXJjZSwge1xuICAgIGluaXQ6IGluaXQsXG4gICAgZGVzdHJveTogRE9NRXZlbnRzU291cmNlJGRlc3Ryb3ksXG4gICAgZW1pdHRlcjogZW1pdHRlclxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRE9NRXZlbnRzU291cmNlO1xuXG5cbnZhciB1c2VDYXB0dXJlUGF0dGVybiA9IC9fX2NhcHR1cmUkL1xuICAgICwgdXNlQ2FwdHVyZVBvc3RmaXggPSAnX19jYXB0dXJlJztcblxuXG4vLyBpbml0IERPTSBldmVudCBzb3VyY2VcbmZ1bmN0aW9uIGluaXQoaG9zdE9iamVjdCwgcHJveHlNZXRob2RzLCBtZXNzZW5nZXJBUElPckNsYXNzLCBjb21wb25lbnQpIHtcbiAgICBjaGVjayhjb21wb25lbnQsIENvbXBvbmVudCk7XG4gICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7XG4gICAgTWVzc2FnZVNvdXJjZS5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5cbmZ1bmN0aW9uIERPTUV2ZW50c1NvdXJjZSRkZXN0cm95KCkge1xuICAgIE1lc3NhZ2VTb3VyY2UucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBkZWxldGUgdGhpcy5jb21wb25lbnQ7XG59XG5cblxuLy8gZ2V0IERPTSBlbGVtZW50IG9mIGNvbXBvbmVudFxuZnVuY3Rpb24gZW1pdHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnQuZWw7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vICMjI2NvbXBvbmVudCBpZnJhbWUgc291cmNlXG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NhZ2VTb3VyY2UgPSBtaWxvQ29yZS5jbGFzc2VzLk1lc3NhZ2VTb3VyY2VcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxudmFyIEZyYW1lTWVzc2FnZVNvdXJjZSA9IF8uY3JlYXRlU3ViY2xhc3MoTWVzc2FnZVNvdXJjZSwgJ0ZyYW1lTWVzc2FnZVNvdXJjZScsIHRydWUpO1xuXG5cbl8uZXh0ZW5kUHJvdG8oRnJhbWVNZXNzYWdlU291cmNlLCB7XG4gICAgLy8gaW1wbGVtZW50aW5nIE1lc3NhZ2VTb3VyY2UgaW50ZXJmYWNlXG4gICAgaW5pdDogaW5pdCxcbiAgICBhZGRTb3VyY2VTdWJzY3JpYmVyOiBhZGRTb3VyY2VTdWJzY3JpYmVyLFxuICAgIHJlbW92ZVNvdXJjZVN1YnNjcmliZXI6IHJlbW92ZVNvdXJjZVN1YnNjcmliZXIsXG4gICAgdHJpZ2dlcjogdHJpZ2dlcixcblxuICAgIC8vY2xhc3Mgc3BlY2lmaWMgbWV0aG9kc1xuICAgIGZyYW1lV2luZG93OiBmcmFtZVdpbmRvdyxcbiAgICBoYW5kbGVFdmVudDogaGFuZGxlRXZlbnQgIC8vIGV2ZW50IGRpc3BhdGNoZXIgLSBhcyBkZWZpbmVkIGJ5IEV2ZW50IERPTSBBUElcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZyYW1lTWVzc2FnZVNvdXJjZTtcblxuXG5mdW5jdGlvbiBpbml0KGhvc3RPYmplY3QsIHByb3h5TWV0aG9kcywgbWVzc2VuZ2VyQVBJT3JDbGFzcywgY29tcG9uZW50KSB7XG4gICAgY2hlY2soY29tcG9uZW50LCBDb21wb25lbnQpO1xuICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50O1xuXG4gICAgaWYgKGNvbXBvbmVudC5lbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT0gJ2lmcmFtZScpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY29tcG9uZW50IGZvciBGcmFtZU1lc3NhZ2VTb3VyY2UgY2FuIG9ubHkgYmUgYXR0YWNoZWQgdG8gaWZyYW1lIGVsZW1lbnQnKTtcblxuICAgIE1lc3NhZ2VTb3VyY2UucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG5mdW5jdGlvbiBmcmFtZVdpbmRvdygpIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnQuZWwuY29udGVudFdpbmRvdztcbn1cblxuXG4vLyBhZGRJRnJhbWVNZXNzYWdlTGlzdGVuZXJcbmZ1bmN0aW9uIGFkZFNvdXJjZVN1YnNjcmliZXIoc291cmNlTWVzc2FnZSkge1xuICAgIHZhciB3aW4gPSB0aGlzLmZyYW1lV2luZG93KCk7XG4gICAgaWYgKHdpbikgd2luLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLCBmYWxzZSk7XG4gICAgZWxzZSBsb2dnZXIud2FybignRnJhbWVNZXNzYWdlU291cmNlOiBmcmFtZSB3aW5kb3cgaXMgdW5kZWZpbmVkJyk7XG59XG5cblxuLy8gcmVtb3ZlSUZyYW1lTWVzc2FnZUxpc3RlbmVyXG5mdW5jdGlvbiByZW1vdmVTb3VyY2VTdWJzY3JpYmVyKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICB2YXIgd2luID0gdGhpcy5mcmFtZVdpbmRvdygpO1xuICAgIGlmICh3aW4pIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcywgZmFsc2UpO1xuICAgIGVsc2UgbG9nZ2VyLndhcm4oJ0ZyYW1lTWVzc2FnZVNvdXJjZTogZnJhbWUgd2luZG93IGlzIHVuZGVmaW5lZCcpO1xufVxuXG5cbmZ1bmN0aW9uIHRyaWdnZXIobXNnVHlwZSwgZGF0YSkge1xuICAgIGRhdGEgPSBkYXRhIHx8IHt9O1xuICAgIGRhdGEudHlwZSA9IG1zZ1R5cGU7XG5cbiAgICB0aGlzLmZyYW1lV2luZG93KCkucG9zdE1lc3NhZ2UoZGF0YSwgJyonKTtcbn1cblxuXG4vLyBUT0RPIG1heWJlIHJlZmFjdG9yIHRvIEZyYW1lTXNnQVBJP1xuZnVuY3Rpb24gaGFuZGxlRXZlbnQoZXZlbnQpIHtcbiAgICB0aGlzLmRpc3BhdGNoTWVzc2FnZShldmVudC5kYXRhLnR5cGUsIGV2ZW50KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY29tcG9uZW50TmFtZSA9IHJlcXVpcmUoJy4uL3V0aWwvY29tcG9uZW50X25hbWUnKVxuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlcjtcblxuXG4vKipcbiAqIFNjb3BlIGNsYXNzLlxuICogQHBhcmFtIHtFbGVtZW50fSByb290RWwgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGlzIHNjb3BlXG4gKiBAcGFyYW0ge09iamVjdH0gaG9zdE9iamVjdCB0aGUgaG9zdCBcbiAqIEByZXR1cm4ge1Njb3BlfVxuICovXG5mdW5jdGlvbiBTY29wZShyb290RWwsIGhvc3RPYmplY3QpIHtcbiAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICBfcm9vdEVsOiByb290RWwsXG4gICAgICAgIF9ob3N0T2JqZWN0OiBob3N0T2JqZWN0XG4gICAgfSwgXy5XUklUKTsgLy8gd3JpdGFibGVcbn07XG5cbl8uZXh0ZW5kUHJvdG8oU2NvcGUsIHtcbiAgICBfYWRkOiBTY29wZSRfYWRkLFxuICAgIF9zYWZlQWRkOiBTY29wZSRfc2FmZUFkZCxcbiAgICBfY29weTogU2NvcGUkX2NvcHksXG4gICAgX2VhY2g6IFNjb3BlJF9lYWNoLFxuICAgIF9tb3ZlOiBTY29wZSRfbW92ZSxcbiAgICBfbWVyZ2U6IFNjb3BlJF9tZXJnZSxcbiAgICBfbGVuZ3RoOiBTY29wZSRfbGVuZ3RoLFxuICAgIF9hbnk6IFNjb3BlJF9hbnksXG4gICAgX3JlbW92ZTogU2NvcGUkX3JlbW92ZSxcbiAgICBfY2xlYW46IFNjb3BlJF9jbGVhbixcbiAgICBfZGV0YWNoRWxlbWVudDogU2NvcGUkX2RldGFjaEVsZW1lbnQsXG4gICAgX2hhczogU2NvcGUkX2hhcyxcbiAgICBfZmlsdGVyOiBTY29wZSRfZmlsdGVyXG59KTtcblxuXG5fLmV4dGVuZChTY29wZSwge1xuICAgIHJlbmFtZTogU2NvcGUkJHJlbmFtZVxufSk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBTY29wZTtcblxuXG52YXIgYWxsb3dlZE5hbWVQYXR0ZXJuID0gL15bQS1aYS16XVtBLVphLXowLTlcXF9cXCRdKiQvO1xuXG5cbi8qKlxuICogU2NvcGUgaW5zdGFuY2UgbWV0aG9kLlxuICogQWRkcyBvYmplY3QgdG8gdGhlIHNjb3BlLCB0aHJvd2luZyBpZiBuYW1lIGlzIG5vdCB1bmlxdWVcbiAqIEBwYXJhbSB7Q29tcG9uZW50fENvbXBvbmVudEluZm99IG9iamVjdCBjb21wb25lbnQgb3IgY29tcG9uZW50IGluZm8gdG8gYWRkIHRvIHRoZSBzY29wZVxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byBhZGRcbiAqL1xuZnVuY3Rpb24gU2NvcGUkX2FkZChvYmplY3QsIG5hbWUpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgPT0gJ3N0cmluZycpXG4gICAgICAgIG9iamVjdC5uYW1lID0gbmFtZTtcbiAgICBlbHNlXG4gICAgICAgIG5hbWUgPSBvYmplY3QubmFtZTtcbiAgICBcbiAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkdXBsaWNhdGUgb2JqZWN0IG5hbWU6ICcgKyBuYW1lKTtcblxuICAgIGNoZWNrTmFtZShuYW1lKTtcbiAgICBfX2FkZC5jYWxsKHRoaXMsIG9iamVjdCwgbmFtZSk7XG59XG5cblxuLyoqXG4gKiBTY29wZSBpbnN0YW5jZSBtZXRob2RcbiAqIEFkZHMgb2JqZWN0IHRvIHNjb3BlIHJlbmFtaW5nIGl0IGlmIG5hbWUgaXMgbm90IHVuaXF1ZVxuICogQHBhcmFtIHtDb21wb25lbnR8Q29tcG9uZW50SW5mb30gb2JqZWN0IGNvbXBvbmVudCBvciBjb21wb25lbnQgaW5mbyB0byBhZGQgdG8gdGhlIHNjb3BlXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIGFkZFxuICovXG5mdW5jdGlvbiBTY29wZSRfc2FmZUFkZChvYmplY3QsIG5hbWUpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgPT0gJ3N0cmluZycpXG4gICAgICAgIG9iamVjdC5uYW1lID0gbmFtZTtcbiAgICBlbHNlXG4gICAgICAgIG5hbWUgPSBvYmplY3QubmFtZTtcblxuICAgIHZhciBzaG91bGRSZW5hbWUgPSB0aGlzLmhhc093blByb3BlcnR5KG5hbWUpO1xuICAgIGlmIChzaG91bGRSZW5hbWUpXG4gICAgICAgIGxvZ2dlci5lcnJvcignU2NvcGU6IGR1cGxpY2F0ZSBvYmplY3QgbmFtZTogJyArIG5hbWUpO1xuICAgIGVsc2Uge1xuICAgICAgICBzaG91bGRSZW5hbWUgPSAhIGFsbG93ZWROYW1lUGF0dGVybi50ZXN0KG5hbWUpO1xuICAgICAgICBpZiAoc2hvdWxkUmVuYW1lKVxuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdTY29wZTogbmFtZSBzaG91bGQgc3RhcnQgZnJvbSBsZXR0ZXIsIHRoaXMgbmFtZSBpcyBub3QgYWxsb3dlZDogJyArIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRSZW5hbWUpIHtcbiAgICAgICAgbmFtZSA9IGNvbXBvbmVudE5hbWUoKTtcbiAgICAgICAgb2JqZWN0Lm5hbWUgPSBuYW1lO1xuICAgIH1cblxuICAgIF9fYWRkLmNhbGwodGhpcywgb2JqZWN0LCBuYW1lKTtcbn1cblxuXG5mdW5jdGlvbiBfX2FkZChvYmplY3QsIG5hbWUpIHtcbiAgICB0aGlzW25hbWVdID0gb2JqZWN0O1xuICAgIG9iamVjdC5zY29wZSA9IHRoaXM7XG5cbiAgICBpZiAodHlwZW9mIG9iamVjdC5wb3N0TWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgb2JqZWN0LnBvc3RNZXNzYWdlKCdhZGRlZHRvc2NvcGUnKTsgXG59XG5cblxuLyoqXG4gKiBJbnN0YW5jZSBtZXRob2QuXG4gKiBjb3BpZXMgYWxsIG9iamVjdHMgZnJvbSBvbmUgc2NvcGUgdG8gYW5vdGhlcixcbiAqIHRocm93aW5nIGlmIHNvbWUgb2JqZWN0IGlzIG5vdCB1bmlxdWVcbiAqIEBwYXJhbSB7U2NvcGV9IGFTY29wZSB0aGUgc2NvcGUgdG8gY29weVxuICovXG5mdW5jdGlvbiBTY29wZSRfY29weShhU2NvcGUpIHtcbiAgICBjaGVjayhhU2NvcGUsIFNjb3BlKTtcblxuICAgIGFTY29wZS5fZWFjaChTY29wZSRfYWRkLCB0aGlzKTtcbn1cblxuXG4vKipcbiAqIEluc3RhbmNlIG1ldGhvZC5cbiAqIE1vdmVzIGEgY29tcG9uZW50IGZyb20gdGhpcyBzY29wZSB0byBhbm90aGVyIHNjb3BlLlxuICogQHBhcmFtIHtDb21wb25lbnR9IGNvbXBvbmVudCB0aGUgY29tcG9uZW50IHRvIGJlIG1vdmVkXG4gKiBAcGFyYW0ge1Njb3BlfSBvdGhlclNjb3BlIHRoZSBzY29wZSB0byBjb3B5IHRoZSBjb21wb25lbnQgdG9cbiAqL1xuZnVuY3Rpb24gU2NvcGUkX21vdmUoY29tcG9uZW50LCBvdGhlclNjb3BlKSB7XG4gICAgb3RoZXJTY29wZS5fYWRkKGNvbXBvbmVudCk7XG4gICAgdGhpcy5fcmVtb3ZlKGNvbXBvbmVudC5uYW1lKTtcbiAgICBjb21wb25lbnQuc2NvcGUgPSBvdGhlclNjb3BlO1xufVxuXG5cbi8qKlxuICogSW5zdGFuY2UgbWV0aG9kLlxuICogTWVyZ2VzIG9uZSBzY29wZSBpbnRvIHRoaXMgc2NvcGVcbiAqIEBwYXJhbSB7U2NvcGV9IHNjb3BlIHRoZSBzY29wZSB0byBhYnNvcmJcbiAqL1xuZnVuY3Rpb24gU2NvcGUkX21lcmdlKHNjb3BlKSB7XG4gICAgc2NvcGUuX2VhY2goZnVuY3Rpb24gKGNvbXApIHtcbiAgICAgICAgdGhpcy5fYWRkKGNvbXAsIGNvbXAubmFtZSk7XG4gICAgICAgIHNjb3BlLl9yZW1vdmUoY29tcC5uYW1lKTtcbiAgICB9LCB0aGlzKTtcbn1cblxuXG4vKipcbiAqIEluc3RhbmNlIG1ldGhvZC5cbiAqIEVudW1lcmF0ZXMgZWFjaCBjb21wb25lbnQgaW4gdGhlIHNjb3BlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayB0aGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSBmb3IgZWFjaCBjb21wb25lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIHRoZSBjb250ZXh0XG4gKi9cbmZ1bmN0aW9uIFNjb3BlJF9lYWNoKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgXy5lYWNoS2V5KHRoaXMsIGNhbGxiYWNrLCB0aGlzQXJnIHx8IHRoaXMsIHRydWUpOyAvLyBlbnVtZXJhdGVzIGVudW1lcmFibGUgcHJvcGVydGllcyBvbmx5XG59XG5cblxuLyoqXG4gKiBJbnN0YW5jZSBtZXRob2QuXG4gKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvZiBjb21wb25lbnRzIGJhc2VkIG9uIGEgY2FsbGJhY2tcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHRoZSBmdW5jdGlvbiB0byBleGVjdXRlIGZvciBlYWNoIGNvbXBvbmVudFxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgdGhlIGNvbnRleHRcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBTY29wZSRfZmlsdGVyKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgcmV0dXJuIF8uZmlsdGVyS2V5cyh0aGlzLCBjYWxsYmFjaywgdGhpc0FyZyB8fCB0aGlzLCB0cnVlKTtcbn1cblxuXG4vKipcbiAqIENoZWNrcyB0aGUgdmFsaWRpdHkgb2YgYSBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgZm9yIGVhY2ggY29tcG9uZW50XG4gKi9cbmZ1bmN0aW9uIGNoZWNrTmFtZShuYW1lKSB7XG4gICAgaWYgKCEgYWxsb3dlZE5hbWVQYXR0ZXJuLnRlc3QobmFtZSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbmFtZSBzaG91bGQgc3RhcnQgZnJvbSBsZXR0ZXIsIHRoaXMgbmFtZSBpcyBub3QgYWxsb3dlZDogJyArIG5hbWUpO1xufVxuXG5cbi8qKlxuICogSW5zdGFuY2UgbWV0aG9kLlxuICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgaW4gdGhlIHNjb3BlXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIFNjb3BlJF9sZW5ndGgoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMpLmxlbmd0aDtcbn1cblxuXG4vKipcbiAqIEluc3RhbmNlIG1ldGhvZC5cbiAqIFJldHVybnMgYSBjb21wb25lbnQgZnJvbSB0aGUgc2NvcGUuIEl0IG1heSBsb29rIGxpa2UgaXQgcmV0dXJucyB0aGUgZmlyc3QgY29tcG9uZW50XG4gKiBidXQgaW4gcmVhbGl0eSBnaXZlbiB0aGF0IHNjb3BlcyBhcmUgaGFzaGVzLCB0aGVyZSBpcyBubyBzdWNoIHRoaW5nLlxuICogQHJldHVybiB7Q29tcG9uZW50fVxuICovXG5mdW5jdGlvbiBTY29wZSRfYW55KCkge1xuICAgIHZhciBrZXkgPSBPYmplY3Qua2V5cyh0aGlzKVswXTtcbiAgICByZXR1cm4ga2V5ICYmIHRoaXNba2V5XTtcbn1cblxuXG4vKipcbiAqIEluc3RhbmNlIG1ldGhvZC5cbiAqIFJlbW92ZXMgYSBjb21wb25lbnQgZnJvbSB0aGUgc2NvcGUgYnkgaXQncyBuYW1lLlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byByZW1vdmVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcXVpZXQgb3B0aW9uYWwgdHJ1ZSB0byBzdXBwcmVzcyB0aGUgd2FybmluZyBtZXNzYWdlIGlmIHRoZSBjb21wb25lbnQgaXMgbm90IGluIHNjb3BlXG4gKi9cbmZ1bmN0aW9uIFNjb3BlJF9yZW1vdmUobmFtZSwgcXVpZXQpIHtcbiAgICBpZiAoISAobmFtZSBpbiB0aGlzKSkge1xuICAgICAgICBpZiAoIXF1aWV0KSBsb2dnZXIud2FybigncmVtb3Zpbmcgb2JqZWN0IHRoYXQgaXMgbm90IGluIHNjb3BlJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgb2JqZWN0ID0gdGhpc1tuYW1lXTtcblxuICAgIGRlbGV0ZSB0aGlzW25hbWVdO1xuXG4gICAgaWYgKHR5cGVvZiBvYmplY3QucG9zdE1lc3NhZ2UgPT09ICdmdW5jdGlvbicpXG4gICAgICAgIG9iamVjdC5wb3N0TWVzc2FnZSgncmVtb3ZlZGZyb21zY29wZScpO1xufVxuXG5cbi8qKlxuICogSW5zdGFuY2UgbWV0aG9kLlxuICogUmVtb3ZlcyBhbGwgY29tcG9uZW50cyBmcm9tIHRoZSBzY29wZS5cbiAqL1xuZnVuY3Rpb24gU2NvcGUkX2NsZWFuKCkge1xuICAgIHRoaXMuX2VhY2goZnVuY3Rpb24ob2JqZWN0LCBuYW1lKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzW25hbWVdLnNjb3BlO1xuICAgICAgICBkZWxldGUgdGhpc1tuYW1lXTtcbiAgICB9LCB0aGlzKTtcbn1cblxuZnVuY3Rpb24gU2NvcGUkX2RldGFjaEVsZW1lbnQoKSB7XG4gICAgdGhpcy5fcm9vdEVsID0gbnVsbDtcbn1cblxuXG4vKipcbiAqIENoZWNrcyBpZiBzY29wZSBoYXMgb2JqZWN0IGJ5IG9iamVjdCBuYW1lXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBTY29wZSRfaGFzKG9iamVjdCkge1xuICAgIHJldHVybiB0aGlzLmhhc093blByb3BlcnR5KG9iamVjdC5uYW1lKTtcbn1cblxuXG4vKipcbiAqIENoYW5nZSBvYmplY3QgbmFtZSwgcmVuYW1pbmcgaXQgaW4gc2NvcGUgdW5sZXNzIHJlbmFtZUluU2NvcGUgaXMgZmFsc2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG5ldyBuYW1lXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHJlbmFtZUluU2NvcGUgdHJ1ZSBieSBkZWZhdWx0XG4gKi9cbmZ1bmN0aW9uIFNjb3BlJCRyZW5hbWUob2JqLCBuYW1lLCByZW5hbWVJblNjb3BlKSB7XG4gICAgaWYgKG9iai5zY29wZSAmJiByZW5hbWVJblNjb3BlICE9PSBmYWxzZSkge1xuICAgICAgICBvYmouc2NvcGUuX3JlbW92ZShvYmoubmFtZSk7XG4gICAgICAgIG9iai5zY29wZS5fYWRkKG9iaiwgbmFtZSk7XG4gICAgfSBlbHNlXG4gICAgICAgIG9iai5uYW1lID0gbmFtZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxudmFyIE1MQnV0dG9uID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTEJ1dHRvbicsIHtcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktYnV0dG9uJ1xuICAgIH1cbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MQnV0dG9uKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTEJ1dHRvbjtcblxuXy5leHRlbmRQcm90byhNTEJ1dHRvbiwge1xuICAgIGRpc2FibGU6IE1MQnV0dG9uJGRpc2FibGUsXG4gICAgaXNEaXNhYmxlZDogTUxCdXR0b24kaXNEaXNhYmxlZFxufSk7XG5cblxuZnVuY3Rpb24gTUxCdXR0b24kZGlzYWJsZShkaXNhYmxlKSB7XG4gICAgdGhpcy5lbC5kaXNhYmxlZCA9IGRpc2FibGU7XG59XG5cbmZ1bmN0aW9uIE1MQnV0dG9uJGlzRGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5lbC5kaXNhYmxlZDtcbn1cblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5JylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG52YXIgQ09NQk9fQ0hBTkdFX01FU1NBR0UgPSAnbWxjb21ib2NoYW5nZSc7XG5cbnZhciBEQVRBTElTVF9URU1QTEFURSA9ICd7e34gaXQuY29tYm9PcHRpb25zIDpvcHRpb24gfX0gXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwie3s9IG9wdGlvbi5sYWJlbCB9fVwiPjwvb3B0aW9uPiBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHt7fn19JztcblxudmFyIE1MQ29tYm8gPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MQ29tYm8nLCB7XG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZGF0YToge1xuICAgICAgICBnZXQ6IE1MQ29tYm9fZ2V0LFxuICAgICAgICBzZXQ6IE1MQ29tYm9fc2V0LFxuICAgICAgICBkZWw6IE1MQ29tYm9fZGVsLFxuICAgICAgICBzcGxpY2U6IHVuZGVmaW5lZCxcbiAgICAgICAgZXZlbnQ6IENPTUJPX0NIQU5HRV9NRVNTQUdFXG4gICAgfSxcbiAgICBtb2RlbDoge1xuICAgICAgICBtZXNzYWdlczoge1xuICAgICAgICAgICAgJyoqKic6IHsgc3Vic2NyaWJlcjogb25PcHRpb25zQ2hhbmdlLCBjb250ZXh0OiAnb3duZXInIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLWRhdGFsaXN0J1xuICAgIH0sXG4gICAgY29udGFpbmVyOiB1bmRlZmluZWRcbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MQ29tYm8pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MQ29tYm87XG5cblxuXy5leHRlbmRQcm90byhNTENvbWJvLCB7XG4gICAgaW5pdDogTUxDb21ibyRpbml0XG59KTtcblxuXG5mdW5jdGlvbiBNTENvbWJvJGluaXQoKSB7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5vbignY2hpbGRyZW5ib3VuZCcsIG9uQ2hpbGRyZW5Cb3VuZCk7XG59XG5cbmZ1bmN0aW9uIG9uQ2hpbGRyZW5Cb3VuZCgpIHtcbiAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICAnX2NvbWJvSW5wdXQnOiB0aGlzLmNvbnRhaW5lci5zY29wZS5pbnB1dCxcbiAgICAgICAgJ19jb21ib0xpc3QnOiB0aGlzLmNvbnRhaW5lci5zY29wZS5kYXRhbGlzdFxuICAgIH0pO1xuXG4gICAgdGhpcy5fY29tYm9MaXN0LnRlbXBsYXRlLnNldChEQVRBTElTVF9URU1QTEFURSk7XG5cbiAgICB0aGlzLl9jb21ib0lucHV0LmRhdGEub24oJ2lucHV0JyxcbiAgICAgICAgeyBzdWJzY3JpYmVyOiBkaXNwYXRjaENoYW5nZU1lc3NhZ2UsIGNvbnRleHQ6IHRoaXMgfSk7XG59XG5cbmZ1bmN0aW9uIE1MQ29tYm9fZ2V0KCkge1xuICAgIGlmICghIHRoaXMuX2NvbWJvSW5wdXQpIHJldHVybjtcbiAgICByZXR1cm4gdGhpcy5fY29tYm9JbnB1dC5kYXRhLmdldCgpO1xufVxuXG5mdW5jdGlvbiBNTENvbWJvX3NldCh2YWx1ZSkge1xuICAgIHJldHVybiBjaGFuZ2VDb21ib0RhdGEuY2FsbCh0aGlzLCAnc2V0JywgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiBNTENvbWJvX2RlbCgpIHtcbiAgICByZXR1cm4gY2hhbmdlQ29tYm9EYXRhLmNhbGwodGhpcywgJ2RlbCcsIHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gY2hhbmdlQ29tYm9EYXRhKG1ldGhvZCwgdmFsdWUpIHtcbiAgICBpZiAoISB0aGlzLl9jb21ib0lucHV0KSByZXR1cm47XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuX2NvbWJvSW5wdXQuZGF0YVttZXRob2RdKHZhbHVlKTtcbiAgICBkaXNwYXRjaENoYW5nZU1lc3NhZ2UuY2FsbCh0aGlzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5cbi8vIFBvc3QgdGhlIGRhdGEgY2hhbmdlXG5mdW5jdGlvbiBkaXNwYXRjaENoYW5nZU1lc3NhZ2UoKSB7XG4gICAgdGhpcy5kYXRhLmRpc3BhdGNoU291cmNlTWVzc2FnZShDT01CT19DSEFOR0VfTUVTU0FHRSk7XG59XG5cbmZ1bmN0aW9uIG9uT3B0aW9uc0NoYW5nZShtc2csIGRhdGEpIHtcbiAgICB0aGlzLl9jb21ib0xpc3QudGVtcGxhdGUucmVuZGVyKHtcbiAgICAgICAgY29tYm9PcHRpb25zOiB0aGlzLm1vZGVsLmdldCgpXG4gICAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG52YXIgQ09NQk9fTElTVF9DSEFOR0VfTUVTU0FHRSA9ICdtbGNvbWJvbGlzdGNoYW5nZSc7XG5cblxudmFyIE1MQ29tYm9MaXN0ID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTENvbWJvTGlzdCcsIHtcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktY29tYm8tbGlzdCdcbiAgICB9LFxuICAgIGRhdGE6IHtcbiAgICAgICAgZ2V0OiBNTENvbWJvTGlzdF9nZXQsXG4gICAgICAgIHNldDogTUxDb21ib0xpc3Rfc2V0LFxuICAgICAgICBkZWw6IE1MQ29tYm9MaXN0X2RlbCxcbiAgICAgICAgZXZlbnQ6IENPTUJPX0xJU1RfQ0hBTkdFX01FU1NBR0VcbiAgICB9LFxuICAgIGV2ZW50czogdW5kZWZpbmVkLFxuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkLFxuICAgIG1vZGVsOiB7XG4gICAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgICAgICAnKioqJzogeyBzdWJzY3JpYmVyOiBvbkl0ZW1zQ2hhbmdlLCBjb250ZXh0OiAnb3duZXInfVxuICAgICAgICB9XG4gICAgfSxcbiAgICB0ZW1wbGF0ZToge1xuICAgICAgICB0ZW1wbGF0ZTogJzxkaXYgbWwtYmluZD1cIk1MU3VwZXJDb21ibzpjb21ib1wiPjwvZGl2PlxcXG4gICAgICAgICAgICAgICAgICAgPGRpdiBtbC1iaW5kPVwiTUxMaXN0Omxpc3RcIj5cXFxuICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG1sLWJpbmQ9XCJNTExpc3RJdGVtOml0ZW1cIiBjbGFzcz1cImxpc3QtaXRlbVwiPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBtbC1iaW5kPVwiW2RhdGFdOmxhYmVsXCI+PC9zcGFuPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBtbC1iaW5kPVwiW2V2ZW50c106ZGVsZXRlQnRuXCIgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXJlbW92ZVwiPjwvc3Bhbj5cXFxuICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgIDwvZGl2PidcbiAgICB9XG59KTtcblxuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MQ29tYm9MaXN0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTENvbWJvTGlzdDtcblxuXG5fLmV4dGVuZFByb3RvKE1MQ29tYm9MaXN0LCB7XG4gICAgaW5pdDogTUxDb21ib0xpc3QkaW5pdCxcbiAgICBzZXRPcHRpb25zOiBNTENvbWJvTGlzdCRzZXRPcHRpb25zLFxuICAgIHNldERhdGFWYWxpZGF0aW9uOiBNTENvbWJvTGlzdCRzZXREYXRhVmFsaWRhdGlvbixcbiAgICB0b2dnbGVBZGRCdXR0b246IE1MQ29tYm9MaXN0JHRvZ2dsZUFkZEJ1dHRvbixcbiAgICBkZXN0cm95OiBNTENvbWJvTGlzdCRkZXN0cm95LFxuICAgIHNldEFkZEl0ZW1Qcm9tcHQ6IE1MQ29tYm9MaXN0JHNldEFkZEl0ZW1Qcm9tcHQsXG4gICAgY2xlYXJDb21ib0lucHV0IDogTUxDb21ib0xpc3QkY2xlYXJDb21ib0lucHV0XG59KTtcblxuXG5mdW5jdGlvbiBNTENvbWJvTGlzdCRpbml0KCkge1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMuX2RhdGFWYWxpZGF0aW9uID0gZnVuY3Rpb24gKCkge307XG4gICAgdGhpcy5tb2RlbC5zZXQoW10pO1xuICAgIHRoaXMub25jZSgnY2hpbGRyZW5ib3VuZCcsIG9uQ2hpbGRyZW5Cb3VuZCk7XG59XG5cblxuZnVuY3Rpb24gTUxDb21ib0xpc3Qkc2V0RGF0YVZhbGlkYXRpb24oZGF0YVZhbGlkYXRpb24pIHtcbiAgICBpZiAodHlwZW9mIGRhdGFWYWxpZGF0aW9uID09ICdmdW5jdGlvbicpXG4gICAgICAgIHRoaXMuX2RhdGFWYWxpZGF0aW9uID0gZGF0YVZhbGlkYXRpb247XG59XG5cbmZ1bmN0aW9uIE1MQ29tYm9MaXN0JHNldE9wdGlvbnMoYXJyKSB7XG4gICAgdGhpcy5fY29tYm8uc2V0T3B0aW9ucyhhcnIpO1xufVxuXG5cbmZ1bmN0aW9uIE1MQ29tYm9MaXN0JGNsZWFyQ29tYm9JbnB1dCAoKSB7XG4gICAgdGhpcy5fY29tYm8uY2xlYXJDb21ib0lucHV0KCk7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogSGlkZXMgYWRkIGJ1dHRvblxuICogQHBhcmFtIHtCb29sZWFufSBzaG93XG4gKi9cbmZ1bmN0aW9uIE1MQ29tYm9MaXN0JHRvZ2dsZUFkZEJ1dHRvbihzaG93KSB7XG4gICAgdGhpcy5fY29tYm8udG9nZ2xlQWRkQnV0dG9uKHNob3cpO1xufVxuXG5cbmZ1bmN0aW9uIE1MQ29tYm9MaXN0JHNldEFkZEl0ZW1Qcm9tcHQocHJvbXB0KSB7XG4gICB0aGlzLl9jb21iby5zZXRBZGRJdGVtUHJvbXB0KHByb21wdCk7XG59XG5cblxuZnVuY3Rpb24gTUxDb21ib0xpc3QkZGVzdHJveSgpIHtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLl9jb25uZWN0b3IgJiYgbWlsby5taW5kZXIuZGVzdHJveUNvbm5lY3Rvcih0aGlzLl9jb25uZWN0b3IpO1xuICAgIHRoaXMuX2Nvbm5lY3RvciA9IG51bGw7XG59XG5cblxuZnVuY3Rpb24gb25DaGlsZHJlbkJvdW5kKCkge1xuICAgIHRoaXMudGVtcGxhdGUucmVuZGVyKCkuYmluZGVyKCk7XG4gICAgY29tcG9uZW50U2V0dXAuY2FsbCh0aGlzKTtcbn1cblxuZnVuY3Rpb24gY29tcG9uZW50U2V0dXAoKSB7XG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgJ19jb21ibyc6IHRoaXMuY29udGFpbmVyLnNjb3BlLmNvbWJvLFxuICAgICAgICAnX2xpc3QnOiB0aGlzLmNvbnRhaW5lci5zY29wZS5saXN0XG4gICAgfSk7XG5cbiAgICB0aGlzLl9jb25uZWN0b3IgPSBtaWxvLm1pbmRlcih0aGlzLl9saXN0Lm1vZGVsLCAnPDw8LT4+PicsIHRoaXMubW9kZWwpO1xuICAgIHRoaXMuX2NvbWJvLmRhdGEub24oJycsIHsgc3Vic2NyaWJlcjogb25Db21ib0NoYW5nZSwgY29udGV4dDogdGhpcyB9KTtcbiAgICB0aGlzLl9jb21iby5vbignYWRkaXRlbScsIHsgc3Vic2NyaWJlcjogb25BZGRJdGVtLCBjb250ZXh0OiB0aGlzIH0pO1xufVxuXG5mdW5jdGlvbiBvbkNvbWJvQ2hhbmdlKG1zZywgZGF0YSkge1xuICAgIGlmIChkYXRhLm5ld1ZhbHVlICYmIHRoaXMuX2RhdGFWYWxpZGF0aW9uKG1zZywgZGF0YSwgdGhpcy5fbGlzdC5tb2RlbC5nZXQoKSkpXG4gICAgICAgIHRoaXMuX2xpc3QubW9kZWwucHVzaChkYXRhLm5ld1ZhbHVlKTtcbiAgICB0aGlzLl9jb21iby5kYXRhLmRlbCgpO1xuICAgIC8vIGJlY2F1c2Ugb2Ygc3VwZXJjb21ibyBsaXN0ZW5lcnMgb2ZmIHlvdSBoYXZlIHRvIHNldCBfdmFsdWUgZXhwbGljaXRseVxuICAgIHRoaXMuX2NvbWJvLmRhdGEuX3ZhbHVlID0gJyc7XG59XG5cbmZ1bmN0aW9uIG9uSXRlbXNDaGFuZ2UobXNnLCBkYXRhKSB7XG4gICAgdGhpcy5kYXRhLmRpc3BhdGNoU291cmNlTWVzc2FnZShDT01CT19MSVNUX0NIQU5HRV9NRVNTQUdFKTtcbn1cblxuZnVuY3Rpb24gTUxDb21ib0xpc3RfZ2V0KCkge1xuICAgIHZhciB2YWx1ZSA9IHRoaXMubW9kZWwuZ2V0KCk7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyA/IF8uY2xvbmUodmFsdWUpIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIE1MQ29tYm9MaXN0X3NldCh2YWx1ZSkge1xuICAgIHRoaXMubW9kZWwuc2V0KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gTUxDb21ib0xpc3RfZGVsKCkge1xuICAgIHJldHVybiB0aGlzLm1vZGVsLnNldChbXSk7XG59XG5cblxuZnVuY3Rpb24gb25BZGRJdGVtKG1zZywgZGF0YSkge1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoJ2FkZGl0ZW0nLCBkYXRhKTtcbiAgICB0aGlzLmV2ZW50cy5wb3N0TWVzc2FnZSgnbWlsb19jb21ib2xpc3RhZGRpdGVtJywgZGF0YSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG52YXIgTUxEYXRlID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTERhdGUnLCB7XG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZGF0YToge1xuICAgICAgICBnZXQ6IE1MRGF0ZV9nZXQsXG4gICAgICAgIHNldDogTUxEYXRlX3NldCxcbiAgICAgICAgZGVsOiBNTERhdGVfZGVsLFxuICAgIH0sXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLWRhdGUnXG4gICAgfVxufSk7XG5cbl8uZXh0ZW5kUHJvdG8oTUxEYXRlLCB7XG4gICAgZ2V0TWluOiBNTERhdGUkZ2V0TWluLFxuICAgIHNldE1pbjogTUxEYXRlJHNldE1pbixcbiAgICBnZXRNYXg6IE1MRGF0ZSRnZXRNYXgsXG4gICAgc2V0TWF4OiBNTERhdGUkc2V0TWF4XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTERhdGUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MRGF0ZTtcblxuXG5mdW5jdGlvbiBNTERhdGUkZ2V0TWluKCkge1xuICAgIHJldHVybiBfLmRhdGUodGhpcy5lbC5taW4pO1xufVxuXG5cbmZ1bmN0aW9uIE1MRGF0ZSRzZXRNaW4odmFsdWUpIHtcbiAgICB2YXIgZGF0ZSA9IF8udG9EYXRlKHZhbHVlKTtcblxuICAgIHRoaXMuZWwubWluID0gZGF0ZSA/IHRvSVNPODYwMUZvcm1hdChkYXRlKSA6ICcnO1xufVxuXG5cbmZ1bmN0aW9uIE1MRGF0ZSRnZXRNYXgoKSB7XG4gICAgcmV0dXJuIF8uZGF0ZSh0aGlzLmVsLm1heCk7XG59XG5cblxuZnVuY3Rpb24gTUxEYXRlJHNldE1heCh2YWx1ZSkge1xuICAgIHZhciBkYXRlID0gXy50b0RhdGUodmFsdWUpO1xuXG4gICAgdGhpcy5lbC5tYXggPSBkYXRlID8gdG9JU084NjAxRm9ybWF0KGRhdGUpIDogJyc7XG59XG5cblxuZnVuY3Rpb24gTUxEYXRlX2dldCgpIHtcbiAgICByZXR1cm4gXy50b0RhdGUodGhpcy5lbC52YWx1ZSk7XG59XG5cblxuZnVuY3Rpb24gTUxEYXRlX3NldCh2YWx1ZSkge1xuICAgIHZhciBkYXRlID0gXy50b0RhdGUodmFsdWUpO1xuXG4gICAgdGhpcy5lbC52YWx1ZSA9IGRhdGUgPyB0b0lTTzg2MDFGb3JtYXQoZGF0ZSkgOiAnJztcblxuICAgIGRpc3BhdGNoSW5wdXRNZXNzYWdlLmNhbGwodGhpcyk7XG59XG5cbmZ1bmN0aW9uIE1MRGF0ZV9kZWwoKSB7XG4gICAgdGhpcy5lbC52YWx1ZSA9ICcnO1xuXG4gICAgZGlzcGF0Y2hJbnB1dE1lc3NhZ2UuY2FsbCh0aGlzKTtcbn1cblxuXG5mdW5jdGlvbiBkaXNwYXRjaElucHV0TWVzc2FnZSgpIHtcbiAgICB0aGlzLmRhdGEuZGlzcGF0Y2hTb3VyY2VNZXNzYWdlKCdpbnB1dCcpOyAvLyBEaXNwYXRjaCB0aGUgJ2lucHV0JyAodXN1YWxseSBkaXNwYXRjaGVkIGJ5IHRoZSB1bmRlcmx5aW5nIDxpbnB1dD4gZWxlbWVudCkgZXZlbnQgc28gdGhhdCB0aGUgZGF0YSBjaGFuZ2UgY2FuIGJlIGxpc3RlbmVkIHRvXG59XG5cblxuZnVuY3Rpb24gdG9JU084NjAxRm9ybWF0KGRhdGUpIHtcbiAgICB2YXIgZGF0ZUFyciA9IFtcbiAgICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICBwYWQoZGF0ZS5nZXRNb250aCgpICsgMSksXG4gICAgICAgIHBhZChkYXRlLmdldERhdGUoKSlcbiAgICBdO1xuXG4gICAgdmFyIGRhdGVTdHIgPSBkYXRlQXJyLmpvaW4oJy0nKTtcblxuICAgIHJldHVybiBkYXRlU3RyO1xuXG4gICAgZnVuY3Rpb24gcGFkKG4pIHsgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4gOiBuOyB9XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKTtcblxuXG52YXIgTUxEcm9wVGFyZ2V0ID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTERyb3BUYXJnZXQnLCBbJ2Ryb3AnXSk7XG5cblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTERyb3BUYXJnZXQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MRHJvcFRhcmdldDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGRvVCA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnV0aWwuZG9UXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5JylcbiAgICAsIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgdW5pcXVlSWQgPSByZXF1aXJlKCcuLi8uLi91dGlsL3VuaXF1ZV9pZCcpO1xuXG52YXIgVFJFRV9URU1QTEFURSA9ICc8dWwgY2xhc3M9XCJtbC11aS1mb2xkdHJlZS1saXN0XCI+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7fiBpdC5kYXRhLml0ZW1zIDppdGVtOmluZGV4IH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB2YXIgaGFzU3ViVHJlZSA9IGl0ZW0uaXRlbXMgJiYgaXRlbS5pdGVtcy5sZW5ndGg7IH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkge3s/IGhhc1N1YlRyZWUgfX1jbGFzcz1cIm1sLXVpLWZvbGR0cmVlLS1oYXMtbXVsdGlwbGVcInt7P319PlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC11aS1mb2xkdHJlZS1pdGVtXCI+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7PyBoYXNTdWJUcmVlIH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtdWktZm9sZHRyZWUtYnV0dG9uXCI+PC9kaXY+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7P319XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7PSBpdC5pdGVtVGVtcGxhdGUoeyBpdGVtOiBpdGVtLCBpZDogaXQuaXRlbUlEc1tpbmRleF0gfSkgfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ez8gaGFzU3ViVHJlZSB9fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ez0gaXQudHJlZVRlbXBsYXRlKGl0ZW0pIH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3s/fX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7fn19XFxcbiAgICAgICAgICAgICAgICAgICAgPC91bD4nO1xuXG52YXIgREVGQVVMVF9DT01QSUxFRF9JVEVNX1RFTVBMQVRFID0gZG9ULmNvbXBpbGUoJ1xcXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1sLXVpLWZvbGR0cmVlLWxhYmVsXCIgZGF0YS1pdGVtLWlkPVwie3s9IGl0LmlkIH19XCI+XFxcbiAgICAgICAgICAgICAgICB7ez0gaXQuaXRlbS5sYWJlbCB9fVxcXG4gICAgICAgICAgICA8L3NwYW4+JylcbiAgICAsIENPTVBJTEVEX1RSRUVfVEVNUExBVEUgPSBkb1QuY29tcGlsZShUUkVFX1RFTVBMQVRFKTtcblxuXG52YXIgTUxGb2xkVHJlZSA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxGb2xkVHJlZScsIHtcbiAgICBjb250YWluZXI6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHtcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICAgICdjbGljayBkYmxjbGljayc6IHsgc3Vic2NyaWJlcjogb25JdGVtRXZlbnQsIGNvbnRleHQ6ICdvd25lcicgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktZm9sZHRyZWUtbWFpbidcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTEZvbGRUcmVlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTEZvbGRUcmVlO1xuXG5fLmV4dGVuZFByb3RvKE1MRm9sZFRyZWUsIHtcbiAgICBzZXRJdGVtVGVtcGxhdGU6IE1MRm9sZFRyZWUkc2V0SXRlbVRlbXBsYXRlLFxuICAgIHJlbmRlclRyZWU6IE1MRm9sZFRyZWUkcmVuZGVyVHJlZVxufSk7XG5cbmZ1bmN0aW9uIGZvbGRVbmZvbGQoZWwpIHtcbiAgICBlbC5jbGFzc0xpc3QudG9nZ2xlKCdtbC11aS1mb2xkdHJlZS0tdW5mb2xkJyk7XG59XG5cbmZ1bmN0aW9uIGl0ZW1NZXNzYWdlKG1zZywgZWwpIHtcbiAgICB2YXIgaWQgPSBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaXRlbS1pZCcpXG4gICAgICAgICwgaXRlbSA9IHRoaXMuX2l0ZW1zTWFwW2lkXTtcblxuICAgIHRoaXMucG9zdE1lc3NhZ2UoJ21sZm9sZHRyZWVfJyArIG1zZywge1xuICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICBlbDogZWxcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gb25JdGVtRXZlbnQobXNnLCBlKSB7XG4gICAgdmFyIGVsID0gZS50YXJnZXQ7XG4gICAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnbWwtdWktZm9sZHRyZWUtYnV0dG9uJykpXG4gICAgICAgIGZvbGRVbmZvbGQoZWwucGFyZW50Tm9kZS5wYXJlbnROb2RlKTtcbiAgICBlbHNlIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ21sLXVpLWZvbGR0cmVlLWxhYmVsJykpXG4gICAgICAgIGl0ZW1NZXNzYWdlLmNhbGwodGhpcywgbXNnLCBlbCk7XG4gICAgZWxzZSByZXR1cm47XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbn1cblxuZnVuY3Rpb24gTUxGb2xkVHJlZSRzZXRJdGVtVGVtcGxhdGUgKHRlbXBsYXRlU3RyKSB7XG4gICAgdGhpcy5faXRlbVRlbXBsYXRlID0gZG9ULmNvbXBpbGUodGVtcGxhdGVTdHIpO1xufVxuXG5mdW5jdGlvbiBNTEZvbGRUcmVlJHJlbmRlclRyZWUgKGRhdGEpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgc2VsZi5faXRlbXNNYXAgPSB7fTtcbiAgICB0aGlzLmVsLmlubmVySFRNTCA9IF9yZW5kZXJUcmVlKGRhdGEpO1xuXG4gICAgZnVuY3Rpb24gX3JlbmRlclRyZWUgKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEuaXRlbXMpXG4gICAgICAgICAgICB2YXIgaXRlbXNJRHMgPSBfLm1hcChkYXRhLml0ZW1zLCBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlkID0gdW5pcXVlSWQoKTtcbiAgICAgICAgICAgICAgICBzZWxmLl9pdGVtc01hcFtpZF0gPSBpdGVtO1xuICAgICAgICAgICAgICAgIHJldHVybiBpZDsgXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gQ09NUElMRURfVFJFRV9URU1QTEFURSh7XG4gICAgICAgICAgICBpdGVtSURzOiBpdGVtc0lEcyxcbiAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICBpdGVtVGVtcGxhdGU6IHNlbGYuX2l0ZW1UZW1wbGF0ZSB8fCBERUZBVUxUX0NPTVBJTEVEX0lURU1fVEVNUExBVEUsXG4gICAgICAgICAgICB0cmVlVGVtcGxhdGU6IF9yZW5kZXJUcmVlXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpO1xuXG5cbnZhciBNTEdyb3VwID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTEdyb3VwJywge1xuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkLFxuICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktZ3JvdXAnXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxHcm91cCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxHcm91cDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpO1xuXG5cbnZhciBNTEh5cGVybGluayA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxIeXBlcmxpbmsnLCB7XG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZGF0YTogdW5kZWZpbmVkLFxuICAgIGRvbToge1xuICAgICAgICBjbHM6ICdtbC11aS1oeXBlcmxpbmsnXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxIeXBlcmxpbmspO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MSHlwZXJsaW5rO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5JylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG52YXIgSU1BR0VfQ0hBTkdFX01FU1NBR0UgPSAnbWxpbWFnZWNoYW5nZSc7XG5cbnZhciBNTEltYWdlID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTEltYWdlJywge1xuICAgIGRhdGE6IHtcbiAgICAgICAgc2V0OiBNTEltYWdlX3NldCxcbiAgICAgICAgZ2V0OiBNTEltYWdlX2dldCxcbiAgICAgICAgZGVsOiBNTEltYWdlX2RlbCxcbiAgICAgICAgc3BsaWNlOiB1bmRlZmluZWQsXG4gICAgICAgIGV2ZW50OiBJTUFHRV9DSEFOR0VfTUVTU0FHRVxuICAgIH0sXG4gICAgbW9kZWw6IHtcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICAgICcuc3JjJzogeyBzdWJzY3JpYmVyOiBvbk1vZGVsQ2hhbmdlLCBjb250ZXh0OiAnb3duZXInIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgY29udGFpbmVyOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIHRhZ05hbWU6ICdpbWcnLFxuICAgICAgICBjbHM6ICdtbC11aS1pbWFnZSdcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTEltYWdlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTEltYWdlO1xuXG5cbl8uZXh0ZW5kUHJvdG8oTUxJbWFnZSwge1xuICAgIGluaXQ6IE1MSW1hZ2UkaW5pdFxufSk7XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXplIHJhZGlvIGdyb3VwIGFuZCBzZXR1cFxuICovXG5mdW5jdGlvbiBNTEltYWdlJGluaXQoKSB7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiBTZXRzIGltYWdlIHZhbHVlXG4gKiBSZXBsYWNlcyB0aGUgZGF0YSBzZXQgb3BlcmF0aW9uIHRvIGRlYWwgd2l0aCByYWRpbyBidXR0b25zXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHNldFxuICovXG5mdW5jdGlvbiBNTEltYWdlX3NldCh2YWx1ZSkge1xuICAgIHRoaXMubW9kZWwuc2V0KHZhbHVlKTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5cblxuLyoqXG4gKiBHZXRzIGdyb3VwIHZhbHVlXG4gKiBSZXRyaWV2ZXMgdGhlIHNlbGVjdGVkIHZhbHVlIG9mIHRoZSBncm91cFxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gTUxJbWFnZV9nZXQoKSB7XG4gICAgdmFyIHZhbHVlID0gdGhpcy5tb2RlbC5nZXQoKTtcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnID8gXy5jbG9uZSh2YWx1ZSkgOiB2YWx1ZTtcbn1cblxuXG4vKipcbiAqIERlbGV0ZWQgZ3JvdXAgdmFsdWVcbiAqIERlbGV0ZXMgdGhlIHZhbHVlIG9mIHRoZSBncm91cCwgc2V0dGluZyBpdCB0byBlbXB0eVxuICovXG5mdW5jdGlvbiBNTEltYWdlX2RlbCgpIHtcbiAgICB0aGlzLm1vZGVsLmRlbCgpO1xufVxuXG5cbi8vIFBvc3QgdGhlIGRhdGEgY2hhbmdlXG5mdW5jdGlvbiBkaXNwYXRjaENoYW5nZU1lc3NhZ2UoKSB7XG4gICAgdGhpcy5kYXRhLmRpc3BhdGNoU291cmNlTWVzc2FnZShJTUFHRV9DSEFOR0VfTUVTU0FHRSk7XG59XG5cblxuZnVuY3Rpb24gb25Nb2RlbENoYW5nZShwYXRoLCBkYXRhKSB7XG4gICAgdGhpcy5lbC5zcmMgPSBkYXRhLm5ld1ZhbHVlO1xuICAgIGRpc3BhdGNoQ2hhbmdlTWVzc2FnZS5jYWxsKHRoaXMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5JylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG52YXIgTUxJbnB1dCA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxJbnB1dCcsIHtcbiAgICBkYXRhOiB1bmRlZmluZWQsXG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLWlucHV0J1xuICAgIH1cbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MSW5wdXQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MSW5wdXQ7XG5cbl8uZXh0ZW5kUHJvdG8oTUxJbnB1dCwge1xuICAgIGRpc2FibGU6IE1MSW5wdXQkZGlzYWJsZSxcbiAgICBpc0Rpc2FibGVkOiBNTElucHV0JGlzRGlzYWJsZWQsXG4gICAgc2V0TWF4TGVuZ3RoOiBNTElucHV0JHNldE1heExlbmd0aFxufSk7XG5cbmZ1bmN0aW9uIE1MSW5wdXQkZGlzYWJsZShkaXNhYmxlKSB7XG4gICAgdGhpcy5lbC5kaXNhYmxlZCA9IGRpc2FibGU7XG59XG5cbmZ1bmN0aW9uIE1MSW5wdXQkaXNEaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmVsLmRpc2FibGVkO1xufVxuXG5mdW5jdGlvbiBNTElucHV0JHNldE1heExlbmd0aChsZW5ndGgpIHtcbiAgICB0aGlzLmVsLnNldEF0dHJpYnV0ZSgnbWF4bGVuZ3RoJywgbGVuZ3RoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cbnZhciBJTlBVVF9MSVNUX0NIQU5HRV9NRVNTQUdFID0gJ21saW5wdXRsaXN0Y2hhbmdlJztcblxudmFyIGFzeW5jSGFuZGxlciA9IGZ1bmN0aW9uICh2YWx1ZSwgY2FsbGJhY2spIHtjYWxsYmFjayh2YWx1ZSk7fTtcblxudmFyIE1MSW5wdXRMaXN0ID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTElucHV0TGlzdCcsIHtcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktaW5wdXQtbGlzdCdcbiAgICB9LFxuICAgIGRhdGE6IHtcbiAgICAgICAgZ2V0OiBNTElucHV0TGlzdF9nZXQsXG4gICAgICAgIHNldDogTUxJbnB1dExpc3Rfc2V0LFxuICAgICAgICBkZWw6IE1MSW5wdXRMaXN0X2RlbCxcbiAgICAgICAgc3BsaWNlOiBNTElucHV0TGlzdF9zcGxpY2UsXG4gICAgICAgIGV2ZW50OiBJTlBVVF9MSVNUX0NIQU5HRV9NRVNTQUdFXG4gICAgfSxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBjb250YWluZXI6IHVuZGVmaW5lZCxcbiAgICBtb2RlbDoge1xuICAgICAgICBtZXNzYWdlczoge1xuICAgICAgICAgICAgJyoqKic6IHsgc3Vic2NyaWJlcjogb25JdGVtc0NoYW5nZSwgY29udGV4dDogJ293bmVyJyB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHRlbXBsYXRlOiB7XG4gICAgICAgIHRlbXBsYXRlOiAnXFxcbiAgICAgICAgICAgIDxkaXYgbWwtYmluZD1cIk1MTGlzdDpsaXN0XCI+XFxcbiAgICAgICAgICAgICAgICA8ZGl2IG1sLWJpbmQ9XCJNTExpc3RJdGVtOml0ZW1cIiBjbGFzcz1cImxpc3QtaXRlbVwiPlxcXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIG1sLWJpbmQ9XCJbZGF0YV06bGFiZWxcIj48L3NwYW4+XFxcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gbWwtYmluZD1cIltldmVudHNdOmRlbGV0ZUJ0blwiIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1yZW1vdmVcIj48L3NwYW4+XFxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXFxuICAgICAgICAgICAgPC9kaXY+XFxcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1sLWJpbmQ9XCJNTElucHV0OmlucHV0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIj5cXFxuICAgICAgICAgICAgPGJ1dHRvbiBtbC1iaW5kPVwiTUxCdXR0b246YnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIj5cXFxuICAgICAgICAgICAgICAgIEFkZFxcXG4gICAgICAgICAgICA8L2J1dHRvbj4nXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxJbnB1dExpc3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MSW5wdXRMaXN0O1xuXG5fLmV4dGVuZFByb3RvKE1MSW5wdXRMaXN0LCB7XG4gICAgaW5pdDogTUxJbnB1dExpc3QkaW5pdCxcbiAgICBzZXRBc3luYzogTUxJbnB1dExpc3Qkc2V0QXN5bmMsXG4gICAgc2V0UGxhY2VIb2xkZXI6IE1MSW5wdXRMaXN0JHNldFBsYWNlSG9sZGVyLFxuICAgIGRlc3Ryb3k6IE1MSW5wdXRMaXN0JGRlc3Ryb3lcbn0pO1xuXG5mdW5jdGlvbiBNTElucHV0TGlzdCRpbml0KCkge1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMub25jZSgnY2hpbGRyZW5ib3VuZCcsIG9uQ2hpbGRyZW5Cb3VuZCk7XG4gICAgdGhpcy5tb2RlbC5zZXQoW10pO1xufVxuXG5mdW5jdGlvbiBvbkNoaWxkcmVuQm91bmQoKSB7XG4gICAgcmVuZGVyLmNhbGwodGhpcyk7XG59XG5cbmZ1bmN0aW9uIE1MSW5wdXRMaXN0JHNldFBsYWNlSG9sZGVyKHBsYWNlSG9sZGVyKSB7XG4gICAgdGhpcy5faW5wdXQuZWwuc2V0QXR0cmlidXRlKCdwbGFjZUhvbGRlcicsIHBsYWNlSG9sZGVyKTtcbn1cblxuZnVuY3Rpb24gTUxJbnB1dExpc3Qkc2V0QXN5bmMobmV3SGFuZGxlcikge1xuICAgIGFzeW5jSGFuZGxlciA9IG5ld0hhbmRsZXIgfHwgYXN5bmNIYW5kbGVyO1xufVxuXG5mdW5jdGlvbiBNTElucHV0TGlzdCRkZXN0cm95KCkge1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMuX2Nvbm5lY3RvciAmJiBtaWxvLm1pbmRlci5kZXN0cm95Q29ubmVjdG9yKHRoaXMuX2Nvbm5lY3Rvcik7XG4gICAgdGhpcy5fY29ubmVjdG9yID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHRoaXMudGVtcGxhdGUucmVuZGVyKCkuYmluZGVyKCk7XG4gICAgY29tcG9uZW50U2V0dXAuY2FsbCh0aGlzKTtcbn1cblxuZnVuY3Rpb24gY29tcG9uZW50U2V0dXAoKSB7XG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgJ19pbnB1dCc6IHRoaXMuY29udGFpbmVyLnNjb3BlLmlucHV0LFxuICAgICAgICAnX2J1dHRvbic6IHRoaXMuY29udGFpbmVyLnNjb3BlLmJ1dHRvbixcbiAgICAgICAgJ19saXN0JzogdGhpcy5jb250YWluZXIuc2NvcGUubGlzdFxuICAgIH0pO1xuICAgIHRoaXMuX2Nvbm5lY3RvciA9IG1pbG8ubWluZGVyKHRoaXMuX2xpc3QubW9kZWwsICc8PDwtPj4+JywgdGhpcy5tb2RlbCk7XG4gICAgdGhpcy5fYnV0dG9uLmV2ZW50cy5vbignY2xpY2snLCB7c3Vic2NyaWJlcjogb25DbGljaywgY29udGV4dDogdGhpcyB9KTsgICBcbn1cblxuZnVuY3Rpb24gb25DbGljayhtc2cpIHtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLl9pbnB1dC5kYXRhLmdldCgwKTtcbiAgICBpZiAodGhpcy5faW5wdXQuZGF0YSlcbiAgICAgICAgYXN5bmNIYW5kbGVyKHZhbHVlLCBmdW5jdGlvbiAobGFiZWwsIHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9saXN0Lm1vZGVsLnB1c2goeyBsYWJlbDogbGFiZWwsIHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9pbnB1dC5kYXRhLmRlbCgpO1xufVxuXG5mdW5jdGlvbiBvbkl0ZW1zQ2hhbmdlKG1zZywgZGF0YSkge1xuICAgIHRoaXMuZGF0YS5kaXNwYXRjaFNvdXJjZU1lc3NhZ2UoSU5QVVRfTElTVF9DSEFOR0VfTUVTU0FHRSk7XG59XG5cbmZ1bmN0aW9uIE1MSW5wdXRMaXN0X2dldCgpIHtcbiAgICB2YXIgbW9kZWwgPSB0aGlzLm1vZGVsLmdldCgpO1xuICAgIHJldHVybiBtb2RlbCA/IF8uY2xvbmUobW9kZWwpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBNTElucHV0TGlzdF9zZXQodmFsdWUpIHtcbiAgICB0aGlzLm1vZGVsLnNldCh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIE1MSW5wdXRMaXN0X2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbC5zZXQoW10pO1xufVxuXG5mdW5jdGlvbiBNTElucHV0TGlzdF9zcGxpY2UoKSB7IC8vIC4uLiBhcmd1bWVudHNcbiAgICB0aGlzLm1vZGVsLnNwbGljZS5hcHBseSh0aGlzLm1vZGVsLCBhcmd1bWVudHMpO1xufSIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cbnZhciBMSVNUX0NIQU5HRV9NRVNTQUdFID0gJ21sbGlzdGNoYW5nZSdcbiAgICAsIERFTEVURV9CVVRUT05fTkFNRSA9ICdkZWxldGVCdG4nO1xuXG5cbnZhciBNTExpc3QgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MTGlzdCcsIHtcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktbGlzdCdcbiAgICB9LFxuICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBtb2RlbDogdW5kZWZpbmVkLFxuICAgIGxpc3Q6IHVuZGVmaW5lZFxufSk7XG5cblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTExpc3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MTGlzdDtcblxuXG5fLmV4dGVuZFByb3RvKE1MTGlzdCwge1xuICAgIGluaXQ6IE1MTGlzdCRpbml0LFxuICAgIGRlc3Ryb3k6IE1MTGlzdCRkZXN0cm95LFxuICAgIHJlbW92ZUl0ZW06IE1MTGlzdCRyZW1vdmVJdGVtLFxuICAgIG1vdmVJdGVtOiBNTExpc3QkbW92ZUl0ZW1cbn0pO1xuXG5cbmZ1bmN0aW9uIE1MTGlzdCRpbml0KCkge1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMub24oJ2NoaWxkcmVuYm91bmQnLCBvbkNoaWxkcmVuQm91bmQpO1xufVxuXG5cbmZ1bmN0aW9uIE1MTGlzdCRkZXN0cm95KCkge1xuICAgIHRoaXMuX2Nvbm5lY3RvciAmJiBtaWxvLm1pbmRlci5kZXN0cm95Q29ubmVjdG9yKHRoaXMuX2Nvbm5lY3Rvcik7XG4gICAgdGhpcy5fY29ubmVjdG9yID0gbnVsbDtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG5mdW5jdGlvbiBNTExpc3QkcmVtb3ZlSXRlbShpbmRleCl7XG4gICAgdGhpcy5tb2RlbC5zcGxpY2UoaW5kZXgsIDEpO1xufVxuXG5cbmZ1bmN0aW9uIE1MTGlzdCRtb3ZlSXRlbShmcm9tLCB0bykge1xuICAgIHZhciBzcGxpY2VkRGF0YSA9IHRoaXMubW9kZWwuc3BsaWNlKGZyb20sIDEpO1xuICAgIHJldHVybiB0aGlzLm1vZGVsLnNwbGljZSh0bywgMCwgc3BsaWNlZERhdGFbMF0pO1xufVxuXG5cbmZ1bmN0aW9uIG9uQ2hpbGRyZW5Cb3VuZCgpIHtcbiAgICB0aGlzLm1vZGVsLnNldChbXSk7XG4gICAgdGhpcy5fY29ubmVjdG9yID0gbWlsby5taW5kZXIodGhpcy5tb2RlbCwgJzw8PC0nLCB0aGlzLmRhdGEpLmRlZmVyQ2hhbmdlTW9kZSgnPDw8LT4+PicpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBEcmFnRHJvcCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZHJhZ2Ryb3AnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxudmFyIExJU1RJVEVNX0NIQU5HRV9NRVNTQUdFID0gJ21sbGlzdGl0ZW1jaGFuZ2UnXG5cbnZhciBNTExpc3RJdGVtID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTExpc3RJdGVtJywge1xuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkLFxuICAgIGRvbTogdW5kZWZpbmVkLFxuICAgIGRyYWc6IHtcbiAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgcGFyYW1zOiBnZXRNZXRhRGF0YVxuICAgICAgICB9XG4gICAgfSxcbiAgICBkcm9wOiB7XG4gICAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgICAgICAnZHJhZ2VudGVyJzogeyBzdWJzY3JpYmVyOiBvbkRyYWdIb3ZlciwgY29udGV4dDogJ293bmVyJyB9LFxuICAgICAgICAgICAgJ2RyYWdvdmVyJzogeyBzdWJzY3JpYmVyOiBvbkRyYWdIb3ZlciwgY29udGV4dDogJ293bmVyJyB9LFxuICAgICAgICAgICAgJ2RyYWdsZWF2ZSc6IHsgc3Vic2NyaWJlcjogb25EcmFnT3V0LCBjb250ZXh0OiAnb3duZXInIH0sXG4gICAgICAgICAgICAnZHJvcCc6IHsgc3Vic2NyaWJlcjogb25JdGVtRHJvcCwgY29udGV4dDogJ293bmVyJyB9XG4gICAgICAgIH0sXG4gICAgICAgIGFsbG93OiB7XG4gICAgICAgICAgICBjb21wb25lbnRzOiBpc0NvbXBvbmVudEFsbG93ZWRcbiAgICAgICAgfVxuICAgIH0sXG4gICAgZGF0YToge1xuICAgICAgICBnZXQ6IE1MTGlzdEl0ZW1fZ2V0LFxuICAgICAgICBzZXQ6IE1MTGlzdEl0ZW1fc2V0LFxuICAgICAgICBkZWw6IE1MTGlzdEl0ZW1fZGVsLFxuICAgICAgICBldmVudDogTElTVElURU1fQ0hBTkdFX01FU1NBR0VcbiAgICB9LFxuICAgIG1vZGVsOiB1bmRlZmluZWQsXG4gICAgaXRlbTogdW5kZWZpbmVkXG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTExpc3RJdGVtKTtcblxudmFyIE1MTGlzdEl0ZW0gPSBtb2R1bGUuZXhwb3J0cyA9IE1MTGlzdEl0ZW07XG5cblxuXy5leHRlbmRQcm90byhNTExpc3RJdGVtLCB7XG4gICAgaW5pdDogTUxMaXN0SXRlbSRpbml0LFxuICAgIG1vdmVJdGVtOiBNTExpc3RJdGVtJG1vdmVJdGVtLFxuICAgIHJlbW92ZUl0ZW06IE1MTGlzdEl0ZW0kcmVtb3ZlSXRlbSxcbiAgICBpc0Ryb3BBbGxvd2VkOiBNTExpc3RJdGVtJGlzRHJvcEFsbG93ZWRcbn0pO1xuXG5cbmZ1bmN0aW9uIE1MTGlzdEl0ZW0kaW5pdCgpIHtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLm9uKCdjaGlsZHJlbmJvdW5kJywgb25DaGlsZHJlbkJvdW5kKTtcbn1cblxuXG5mdW5jdGlvbiBvbkNoaWxkcmVuQm91bmQoKSB7XG4gICAgdmFyIGRlbGV0ZUJ0biA9IHRoaXMuY29udGFpbmVyLnNjb3BlLmRlbGV0ZUJ0bjtcbiAgICBkZWxldGVCdG4gJiYgZGVsZXRlQnRuLmV2ZW50cy5vbignY2xpY2snLCB7IHN1YnNjcmliZXI6IHRoaXMucmVtb3ZlSXRlbSwgY29udGV4dDogdGhpcyB9KTtcbn1cblxuXG5mdW5jdGlvbiBNTExpc3RJdGVtJHJlbW92ZUl0ZW0oKSB7XG4gICAgdHJ5IHsgdmFyIGxpc3RPd25lciA9IHRoaXMuaXRlbS5saXN0Lm93bmVyOyB9IGNhdGNoKGUpIHt9XG4gICAgbGlzdE93bmVyICYmIGxpc3RPd25lci5yZW1vdmVJdGVtKHRoaXMuaXRlbS5pbmRleCk7XG59XG5cblxuZnVuY3Rpb24gTUxMaXN0SXRlbSRtb3ZlSXRlbShpbmRleCkge1xuICAgIHZhciBsaXN0T3duZXIgPSB0aGlzLml0ZW0ubGlzdC5vd25lcjtcbiAgICBsaXN0T3duZXIgJiYgbGlzdE93bmVyLm1vdmVJdGVtKHRoaXMuaXRlbS5pbmRleCwgaW5kZXgpO1xufVxuXG5cbmZ1bmN0aW9uIE1MTGlzdEl0ZW0kaXNEcm9wQWxsb3dlZChtZXRhLCBkcmFnRHJvcCl7XG4gICAgcmV0dXJuIG1ldGEucGFyYW1zICYmIG1ldGEucGFyYW1zLmluZGV4ICYmIG1ldGEuY29tcENsYXNzID09ICdNTExpc3RJdGVtJztcbn1cblxuXG5mdW5jdGlvbiBpc0NvbXBvbmVudEFsbG93ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNEcm9wQWxsb3dlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5cbmZ1bmN0aW9uIG9uSXRlbURyb3AoZXZlbnRUeXBlLCBldmVudCkge1xuICAgIG9uRHJhZ091dC5jYWxsKHRoaXMpO1xuICAgIHZhciBkdCA9IG5ldyBEcmFnRHJvcChldmVudCk7XG4gICAgdmFyIG1ldGEgPSBkdC5nZXRDb21wb25lbnRNZXRhKCk7XG4gICAgdmFyIHN0YXRlID0gZHQuZ2V0Q29tcG9uZW50U3RhdGUoKTtcbiAgICB2YXIgbGlzdE93bmVyID0gdGhpcy5pdGVtLmxpc3Qub3duZXI7XG4gICAgdmFyIGluZGV4ID0gbWV0YS5wYXJhbXMgJiYgbWV0YS5wYXJhbXMuaW5kZXg7XG5cbiAgICBsaXN0T3duZXIubW92ZUl0ZW0oK2luZGV4LCB0aGlzLml0ZW0uaW5kZXgsIHN0YXRlKTtcbn1cblxuXG5mdW5jdGlvbiBvbkRyYWdIb3ZlcihldmVudFR5cGUsIGV2ZW50KSB7XG4gICAgdGhpcy5kb20uYWRkQ3NzQ2xhc3NlcygnbWwtZHJhZy1vdmVyJyk7XG59XG5cblxuZnVuY3Rpb24gb25EcmFnT3V0KGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAgICB0aGlzLmRvbS5yZW1vdmVDc3NDbGFzc2VzKCdtbC1kcmFnLW92ZXInKTtcbn1cblxuXG5mdW5jdGlvbiBnZXRNZXRhRGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbmRleDogdGhpcy5pdGVtLmluZGV4XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIE1MTGlzdEl0ZW1fZ2V0KCkge1xuICAgIHZhciB2YWx1ZSA9IHRoaXMubW9kZWwuZ2V0KCk7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyA/IF8uY2xvbmUodmFsdWUpIDogdmFsdWU7XG59XG5cblxuZnVuY3Rpb24gTUxMaXN0SXRlbV9zZXQodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09ICdvYmplY3QnKVxuICAgICAgICB0aGlzLmRhdGEuX3NldCh2YWx1ZSk7XG4gICAgdGhpcy5tb2RlbC5zZXQodmFsdWUpO1xuICAgIF9zZW5kQ2hhbmdlTWVzc2FnZS5jYWxsKHRoaXMpO1xuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuXG5mdW5jdGlvbiBNTExpc3RJdGVtX2RlbCgpIHtcbiAgICB0aGlzLmRhdGEuX2RlbCgpO1xuICAgIHRoaXMubW9kZWwuZGVsKCk7XG4gICAgX3NlbmRDaGFuZ2VNZXNzYWdlLmNhbGwodGhpcyk7ICAgIFxufVxuXG5cbmZ1bmN0aW9uIF9zZW5kQ2hhbmdlTWVzc2FnZSgpIHtcbiAgICB0aGlzLmRhdGEuZGlzcGF0Y2hTb3VyY2VNZXNzYWdlKExJU1RJVEVNX0NIQU5HRV9NRVNTQUdFKTtcbn1cblxuXG5cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCB1bmlxdWVJZCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdW5pcXVlX2lkJylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG52YXIgUkFESU9fQ0hBTkdFX01FU1NBR0UgPSAnbWxyYWRpb2dyb3VwY2hhbmdlJ1xuICAgICwgRUxFTUVOVF9OQU1FX1BST1BFUlRZID0gJ19tbFJhZGlvR3JvdXBFbGVtZW50SUQnXG4gICAgLCBFTEVNRU5UX05BTUVfUFJFRklYID0gJ21sLXJhZGlvLWdyb3VwLSc7XG5cbnZhciBNTFJhZGlvR3JvdXAgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MUmFkaW9Hcm91cCcsIHtcbiAgICBkYXRhOiB7XG4gICAgICAgIHNldDogTUxSYWRpb0dyb3VwX3NldCxcbiAgICAgICAgZ2V0OiBNTFJhZGlvR3JvdXBfZ2V0LFxuICAgICAgICBkZWw6IE1MUmFkaW9Hcm91cF9kZWwsXG4gICAgICAgIHNwbGljZTogdW5kZWZpbmVkLFxuICAgICAgICBldmVudDogUkFESU9fQ0hBTkdFX01FU1NBR0VcbiAgICB9LFxuICAgIG1vZGVsOiB7XG4gICAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgICAgICAnKioqJzogeyBzdWJzY3JpYmVyOiBvbk9wdGlvbnNDaGFuZ2UsIGNvbnRleHQ6ICdvd25lcicgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBldmVudHM6IHtcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICAgICdjbGljayc6IHsgc3Vic2NyaWJlcjogb25Hcm91cENsaWNrLCBjb250ZXh0OiAnb3duZXInIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgY29udGFpbmVyOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLXJhZGlvLWdyb3VwJ1xuICAgIH0sXG4gICAgdGVtcGxhdGU6IHtcbiAgICAgICAgdGVtcGxhdGU6ICd7e34gaXQucmFkaW9PcHRpb25zIDpvcHRpb24gfX0gXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IyNkZWYuZWxJRDp7ez0gaXQuZWxlbWVudE5hbWUgfX0te3s9IG9wdGlvbi52YWx1ZSB9fSN9fSBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ7ez0gaXQuX3JlbmRlck9wdGlvbnMub3B0aW9uQ3NzQ2xhc3MgfHwgXCInICsgRUxFTUVOVF9OQU1FX1BSRUZJWCArICdvcHRpb25cIiB9fVwiPiBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cInt7IyBkZWYuZWxJRCB9fVwiIHR5cGU9XCJyYWRpb1wiIHZhbHVlPVwie3s9IG9wdGlvbi52YWx1ZSB9fVwiIG5hbWU9XCJ7ez0gaXQuZWxlbWVudE5hbWUgfX1cIj4gXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwie3sjIGRlZi5lbElEIH19XCI+e3s9IG9wdGlvbi5sYWJlbCB9fTwvbGFiZWw+IFxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+IFxcXG4gICAgICAgICAgICAgICAgICAge3t+fX0nXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxSYWRpb0dyb3VwKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTFJhZGlvR3JvdXA7XG5cblxuXy5leHRlbmRQcm90byhNTFJhZGlvR3JvdXAsIHtcbiAgICBpbml0OiBNTFJhZGlvR3JvdXAkaW5pdCxcbiAgICBkZXN0cm95OiBNTFJhZGlvR3JvdXAkZGVzdHJveSxcbiAgICBzZXRSZW5kZXJPcHRpb25zOiBNTFJhZGlvR3JvdXAkc2V0UmVuZGVyT3B0aW9uc1xufSk7XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXplIHJhZGlvIGdyb3VwIGFuZCBzZXR1cFxuICovXG5mdW5jdGlvbiBNTFJhZGlvR3JvdXAkaW5pdCgpIHtcbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsICdfcmFkaW9MaXN0JywgW10sIF8uQ09ORik7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBFTEVNRU5UX05BTUVfUFJPUEVSVFksIEVMRU1FTlRfTkFNRV9QUkVGSVggKyB1bmlxdWVJZCgpKTtcbiAgICB0aGlzLl9yZW5kZXJPcHRpb25zID0ge307XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuZnVuY3Rpb24gTUxSYWRpb0dyb3VwJHNldFJlbmRlck9wdGlvbnMob3B0aW9ucykge1xuICAgIHRoaXMuX3JlbmRlck9wdGlvbnMgPSBvcHRpb25zO1xufVxuXG5cbi8qKlxuICogU2V0cyBncm91cCB2YWx1ZVxuICogUmVwbGFjZXMgdGhlIGRhdGEgc2V0IG9wZXJhdGlvbiB0byBkZWFsIHdpdGggcmFkaW8gYnV0dG9uc1xuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlIFRoZSB2YWx1ZSB0byBiZSBzZXRcbiAqL1xuZnVuY3Rpb24gTUxSYWRpb0dyb3VwX3NldCh2YWx1ZSkge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5fcmFkaW9MaXN0XG4gICAgICAgICwgc2V0UmVzdWx0O1xuICAgIGlmIChvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICBvcHRpb25zLmZvckVhY2goZnVuY3Rpb24ocmFkaW8pIHtcbiAgICAgICAgICAgIHJhZGlvLmNoZWNrZWQgPSByYWRpby52YWx1ZSA9PSB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChyYWRpby5jaGVja2VkKVxuICAgICAgICAgICAgICAgIHNldFJlc3VsdCA9IHZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICBkaXNwYXRjaENoYW5nZU1lc3NhZ2UuY2FsbCh0aGlzKTtcblxuICAgICAgICByZXR1cm4gc2V0UmVzdWx0O1xuICAgIH1cbn1cblxuXG4vKipcbiAqIEdldHMgZ3JvdXAgdmFsdWVcbiAqIFJldHJpZXZlcyB0aGUgc2VsZWN0ZWQgdmFsdWUgb2YgdGhlIGdyb3VwXG4gKlxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBNTFJhZGlvR3JvdXBfZ2V0KCkge1xuICAgIHZhciBjaGVja2VkID0gXy5maW5kKHRoaXMuX3JhZGlvTGlzdCwgZnVuY3Rpb24ocmFkaW8pIHtcbiAgICAgICAgcmV0dXJuIHJhZGlvLmNoZWNrZWQ7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY2hlY2tlZCAmJiBjaGVja2VkLnZhbHVlIHx8IHVuZGVmaW5lZDtcbn1cblxuXG4vKipcbiAqIERlbGV0ZWQgZ3JvdXAgdmFsdWVcbiAqIERlbGV0ZXMgdGhlIHZhbHVlIG9mIHRoZSBncm91cCwgc2V0dGluZyBpdCB0byBlbXB0eVxuICovXG5mdW5jdGlvbiBNTFJhZGlvR3JvdXBfZGVsKCkge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5fcmFkaW9MaXN0O1xuICAgIGlmIChvcHRpb25zLmxlbmd0aClcbiAgICAgICAgb3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKHJhZGlvKSB7XG4gICAgICAgICAgICByYWRpby5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgIH0pO1xuXG4gICAgZGlzcGF0Y2hDaGFuZ2VNZXNzYWdlLmNhbGwodGhpcyk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuXG4vKipcbiAqIE1hbmFnZSByYWRpbyBjaGlsZHJlbiBjbGlja3NcbiAqL1xuZnVuY3Rpb24gb25Hcm91cENsaWNrKGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0LnR5cGUgPT0gJ3JhZGlvJylcbiAgICAgICAgZGlzcGF0Y2hDaGFuZ2VNZXNzYWdlLmNhbGwodGhpcyk7XG59XG5cbi8vIFBvc3QgdGhlIGRhdGEgY2hhbmdlXG5mdW5jdGlvbiBkaXNwYXRjaENoYW5nZU1lc3NhZ2UoKSB7XG4gICAgdGhpcy5kYXRhLmRpc3BhdGNoU291cmNlTWVzc2FnZShSQURJT19DSEFOR0VfTUVTU0FHRSk7XG59XG5cblxuLy8gU2V0IHJhZGlvIGJ1dHRvbiBjaGlsZHJlbiBvbiBtb2RlbCBjaGFuZ2VcbmZ1bmN0aW9uIG9uT3B0aW9uc0NoYW5nZShwYXRoLCBkYXRhKSB7XG4gICAgdGhpcy50ZW1wbGF0ZS5yZW5kZXIoe1xuICAgICAgICByYWRpb09wdGlvbnM6IHRoaXMubW9kZWwuZ2V0KCksXG4gICAgICAgIGVsZW1lbnROYW1lOiB0aGlzW0VMRU1FTlRfTkFNRV9QUk9QRVJUWV0sXG4gICAgICAgIF9yZW5kZXJPcHRpb25zOiB0aGlzLl9yZW5kZXJPcHRpb25zXG4gICAgfSk7XG5cbiAgICB2YXIgcmFkaW9FbHMgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9XCJyYWRpb1wiXScpXG4gICAgICAgICwgb3B0aW9ucyA9IF8udG9BcnJheShyYWRpb0Vscyk7XG5cbiAgICB0aGlzLl9yYWRpb0xpc3QubGVuZ3RoID0gMDtcbiAgICB0aGlzLl9yYWRpb0xpc3Quc3BsaWNlLmFwcGx5KHRoaXMuX3JhZGlvTGlzdCwgWzAsIDBdLmNvbmNhdChvcHRpb25zKSk7XG59XG5cblxuZnVuY3Rpb24gTUxSYWRpb0dyb3VwJGRlc3Ryb3koKSB7XG4gICAgZGVsZXRlIHRoaXMuX3JhZGlvTGlzdDtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxudmFyIE1MU2VsZWN0ID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTFNlbGVjdCcsIHtcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktc2VsZWN0J1xuICAgIH0sXG4gICAgZGF0YTogdW5kZWZpbmVkLFxuICAgIGV2ZW50czogdW5kZWZpbmVkLFxuICAgIG1vZGVsOiB7XG4gICAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgICAgICAnKionOiB7IHN1YnNjcmliZXI6IG9uT3B0aW9uc0NoYW5nZSwgY29udGV4dDogJ293bmVyJyB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHRlbXBsYXRlOiB7XG4gICAgICAgIHRlbXBsYXRlOiAne3t+IGl0LnNlbGVjdE9wdGlvbnMgOm9wdGlvbiB9fSBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInt7PSBvcHRpb24udmFsdWUgfX1cIiB7ez8gb3B0aW9uLnNlbGVjdGVkIH19c2VsZWN0ZWR7ez99fT57ez0gb3B0aW9uLmxhYmVsIH19PC9vcHRpb24+IFxcXG4gICAgICAgICAgICAgICAgICAge3t+fX0nXG4gICAgfVxufSk7XG5cblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTFNlbGVjdCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxTZWxlY3Q7XG5cblxuXy5leHRlbmRQcm90byhNTFNlbGVjdCwge1xuICAgIHNldE9wdGlvbnM6IE1MU2VsZWN0JHNldE9wdGlvbnMsXG4gICAgZGlzYWJsZTogTUxTZWxlY3QkZGlzYWJsZVxufSk7XG5cblxuZnVuY3Rpb24gTUxTZWxlY3Qkc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gICAgLy8gU2V0IG9wdGlvbnMgdGVtcG9yYXJpbHkgZGlzYWJsZXMgbW9kZWwgc3Vic2NyaXB0aW9ucyAoQXMgYSB3b3JrYXJvdW5kIGZvciBwZXJmb3JtYW5jZSBpc3N1ZXMgcmVsYXRpbmcgdG8gbW9kZWwgdXBkYXRlcyAvIHRlbXBsYXRlIHJlLXJlbmRlcmluZylcbiAgICB2YXIgbW9kZWxDaGFuZ2VMaXN0ZW5lciA9IHsgY29udGV4dDogdGhpcywgc3Vic2NyaWJlcjogb25PcHRpb25zQ2hhbmdlIH07XG5cbiAgICB0aGlzLm1vZGVsLm9mZignKionLCBtb2RlbENoYW5nZUxpc3RlbmVyKTtcbiAgICB0aGlzLm1vZGVsLnNldChvcHRpb25zKTtcbiAgICB0aGlzLm1vZGVsLm9uKCcqKicsIG1vZGVsQ2hhbmdlTGlzdGVuZXIpO1xuXG4gICAgb25PcHRpb25zQ2hhbmdlLmNhbGwodGhpcyk7XG59XG5cblxuZnVuY3Rpb24gTUxTZWxlY3QkZGlzYWJsZShkaXNhYmxlKSB7XG4gICAgdGhpcy5lbC5kaXNhYmxlZCA9IGRpc2FibGU7XG59XG5cblxuZnVuY3Rpb24gb25PcHRpb25zQ2hhbmdlKHBhdGgsIGRhdGEpIHtcbiAgICB0aGlzLnRlbXBsYXRlLnJlbmRlcih7IHNlbGVjdE9wdGlvbnM6IHRoaXMubW9kZWwuZ2V0KCkgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTUxTdXBlckNvbWJvXG4gKiBBIGNvbWJvIHNlbGVjdCBsaXN0IHdpdGggaW50ZWxsaWdlbnQgc2Nyb2xsaW5nIG9mIHN1cGVyIGxhcmdlIGxpc3RzLlxuICovXG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBkb1QgPSBtaWxvQ29yZS51dGlsLmRvVFxuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXI7XG5cbnZhciBDT01CT19PUEVOID0gJ21sLXVpLXN1cGVyY29tYm8tb3Blbic7XG52YXIgQ09NQk9fQ0hBTkdFX01FU1NBR0UgPSAnbWxzdXBlcmNvbWJvY2hhbmdlJztcblxudmFyIE9QVElPTlNfVEVNUExBVEUgPSAne3t+IGl0LmNvbWJvT3B0aW9ucyA6b3B0aW9uOmluZGV4IH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHt7PyBvcHRpb24uc2VsZWN0ZWR9fWNsYXNzPVwic2VsZWN0ZWRcIiB7ez99fWRhdGEtdmFsdWU9XCJ7ez0gaW5kZXggfX1cIj57ez0gb3B0aW9uLmxhYmVsIH19PC9kaXY+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7fn19JztcblxudmFyIE1BWF9SRU5ERVJFRCA9IDEwMDtcbnZhciBCVUZGRVIgPSAyNTtcbnZhciBERUZBVUxUX0VMRU1FTlRfSEVJR0hUID0gMjA7XG5cbnZhciBNTFN1cGVyQ29tYm8gPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MU3VwZXJDb21ibycsIHtcbiAgICBldmVudHM6IHtcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICAgICdtb3VzZWxlYXZlJzoge3N1YnNjcmliZXI6IG9uTW91c2VMZWF2ZSwgY29udGV4dDogJ293bmVyJ30sXG4gICAgICAgICAgICAnbW91c2VvdmVyJzoge3N1YnNjcmliZXI6IG9uTW91c2VPdmVyLCBjb250ZXh0OiAnb3duZXInfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBkYXRhOiB7XG4gICAgICAgIGdldDogTUxTdXBlckNvbWJvX2dldCxcbiAgICAgICAgc2V0OiBNTFN1cGVyQ29tYm9fc2V0LFxuICAgICAgICBkZWw6IE1MU3VwZXJDb21ib19kZWwsXG4gICAgICAgIHNwbGljZTogdW5kZWZpbmVkLFxuICAgICAgICBldmVudDogQ09NQk9fQ0hBTkdFX01FU1NBR0VcbiAgICB9LFxuICAgIGRvbToge1xuICAgICAgICBjbHM6ICdtbC11aS1zdXBlcmNvbWJvJ1xuICAgIH0sXG4gICAgdGVtcGxhdGU6IHtcbiAgICAgICAgdGVtcGxhdGU6ICc8aW5wdXQgbWwtYmluZD1cIltkYXRhLCBldmVudHNdOmlucHV0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWwtdWktaW5wdXRcIj5cXFxuICAgICAgICAgICAgICAgICAgIDxkaXYgbWwtYmluZD1cIltkb21dOmFkZEl0ZW1EaXZcIiBjbGFzcz1cIm1sLXVpLXN1cGVyY29tYm8tYWRkXCI+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG1sLWJpbmQ9XCI6YWRkUHJvbXB0XCI+PC9zcGFuPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1sLWJpbmQ9XCJbZXZlbnRzLCBkb21dOmFkZEJ0blwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IG1sLXVpLWJ1dHRvblwiPkFkZDwvYnV0dG9uPlxcXG4gICAgICAgICAgICAgICAgICAgPC9kaXY+XFxcbiAgICAgICAgICAgICAgICAgICA8ZGl2IG1sLWJpbmQ9XCJbZG9tLCBldmVudHNdOmxpc3RcIiBjbGFzcz1cIm1sLXVpLXN1cGVyY29tYm8tZHJvcGRvd25cIj5cXFxuICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG1sLWJpbmQ9XCJbZG9tXTpiZWZvcmVcIj48L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG1sLWJpbmQ9XCJbdGVtcGxhdGUsIGRvbSwgZXZlbnRzXTpvcHRpb25zXCIgY2xhc3M9XCJtbC11aS1zdXBlcmNvbWJvLW9wdGlvbnNcIj48L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG1sLWJpbmQ9XCJbZG9tXTphZnRlclwiPjwvZGl2PlxcXG4gICAgICAgICAgICAgICAgICAgPC9kaXY+J1xuICAgIH0sXG4gICAgY29udGFpbmVyOiB1bmRlZmluZWRcbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MU3VwZXJDb21ibyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxTdXBlckNvbWJvO1xuXG4vKipcbiAqIFB1YmxpYyBBcGlcbiAqL1xuXy5leHRlbmRQcm90byhNTFN1cGVyQ29tYm8sIHtcbiAgICBpbml0OiBNTFN1cGVyQ29tYm8kaW5pdCxcbiAgICBzaG93T3B0aW9uczogTUxTdXBlckNvbWJvJHNob3dPcHRpb25zLFxuICAgIGhpZGVPcHRpb25zOiBNTFN1cGVyQ29tYm8kaGlkZU9wdGlvbnMsXG4gICAgdG9nZ2xlT3B0aW9uczogTUxTdXBlckNvbWJvJHRvZ2dsZU9wdGlvbnMsXG4gICAgc2V0T3B0aW9uczogTUxTdXBlckNvbWJvJHNldE9wdGlvbnMsXG4gICAgaW5pdE9wdGlvbnNVUkw6IE1MU3VwZXJDb21ibyRpbml0T3B0aW9uc1VSTCxcbiAgICBzZXRGaWx0ZXJlZE9wdGlvbnM6IE1MU3VwZXJDb21ibyRzZXRGaWx0ZXJlZE9wdGlvbnMsXG4gICAgdXBkYXRlOiBNTFN1cGVyQ29tYm8kdXBkYXRlLFxuICAgIHRvZ2dsZUFkZEJ1dHRvbjogTUxTdXBlckNvbWJvJHRvZ2dsZUFkZEJ1dHRvbixcbiAgICBzZXRBZGRJdGVtUHJvbXB0OiBNTFN1cGVyQ29tYm8kc2V0QWRkSXRlbVByb21wdCxcbiAgICBjbGVhckNvbWJvSW5wdXQ6IE1MU3VwZXJDb21ib19kZWxcbn0pO1xuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogSW5pdGlhbGlzZSB0aGUgY29tcG9uZW50LCB3YWl0IGZvciBjaGlsZHJlbmJvdW5kLCBzZXR1cCBlbXB0eSBvcHRpb25zIGFycmF5cy5cbiAqL1xuZnVuY3Rpb24gTUxTdXBlckNvbWJvJGluaXQoKSB7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB0aGlzLm9uY2UoJ2NoaWxkcmVuYm91bmQnLCBvbkNoaWxkcmVuQm91bmQpO1xuXG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgX29wdGlvbnNEYXRhOiBbXSxcbiAgICAgICAgX2ZpbHRlcmVkT3B0aW9uc0RhdGE6IFtdXG4gICAgfSwgXy5XUklUKTtcbn1cblxuLyoqXG4gKiBIYW5kbGVyIGZvciBpbml0IGNoaWxkcmVuYm91bmQgbGlzdGVuZXIuIFJlbmRlcnMgdGVtcGxhdGUuXG4gKi9cbmZ1bmN0aW9uIG9uQ2hpbGRyZW5Cb3VuZCgpIHtcbiAgICB0aGlzLnRlbXBsYXRlLnJlbmRlcigpLmJpbmRlcigpO1xuICAgIGNvbXBvbmVudFNldHVwLmNhbGwodGhpcyk7XG59XG5cblxuLyoqXG4gKiBEZWZpbmUgaW5zdGFuY2UgcHJvcGVydGllcywgZ2V0IHN1YmNvbXBvbmVudHMsIGNhbGwgc2V0dXAgc3ViLXRhc2tzXG4gKi9cbmZ1bmN0aW9uIGNvbXBvbmVudFNldHVwKCkge1xuICAgIHZhciBzY29wZSA9IHRoaXMuY29udGFpbmVyLnNjb3BlO1xuXG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgX2NvbWJvSW5wdXQ6IHNjb3BlLmlucHV0LFxuICAgICAgICBfY29tYm9MaXN0OiBzY29wZS5saXN0LFxuICAgICAgICBfY29tYm9PcHRpb25zOiBzY29wZS5vcHRpb25zLFxuICAgICAgICBfY29tYm9CZWZvcmU6IHNjb3BlLmJlZm9yZSxcbiAgICAgICAgX2NvbWJvQWZ0ZXI6IHNjb3BlLmFmdGVyLFxuICAgICAgICBfY29tYm9BZGRJdGVtRGl2OiBzY29wZS5hZGRJdGVtRGl2LFxuICAgICAgICBfY29tYm9BZGRQcm9tcHQ6IHNjb3BlLmFkZFByb21wdCxcbiAgICAgICAgX2NvbWJvQWRkQnRuOiBzY29wZS5hZGRCdG4sXG4gICAgICAgIF9vcHRpb25UZW1wbGF0ZTogZG9ULmNvbXBpbGUoT1BUSU9OU19URU1QTEFURSlcbiAgICB9KTtcblxuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIF9zdGFydEluZGV4OiAwLFxuICAgICAgICBfZW5kSW5kZXg6IE1BWF9SRU5ERVJFRCxcbiAgICAgICAgX2hpZGRlbjogZmFsc2UsXG4gICAgICAgIF9lbGVtZW50SGVpZ2h0OiBERUZBVUxUX0VMRU1FTlRfSEVJR0hULFxuICAgICAgICBfdG90YWw6IDAsXG4gICAgICAgIF9vcHRpb25zSGVpZ2h0OiAyMDAsXG4gICAgICAgIF9sYXN0U2Nyb2xsUG9zOiAwLFxuICAgICAgICBfY3VycmVudFZhbHVlOiBudWxsLFxuICAgICAgICBfc2VsZWN0ZWQ6IG51bGwsXG4gICAgICAgIF9pc0FkZEJ1dHRvblNob3duOiBmYWxzZVxuICAgIH0sIF8uV1JJVCk7XG5cbiAgICAvLyBDb21wb25lbnQgU2V0dXBcbiAgICB0aGlzLmRvbS5zZXRTdHlsZXMoeyBwb3NpdGlvbjogJ3JlbGF0aXZlJyB9KTtcbiAgICBzZXR1cENvbWJvTGlzdCh0aGlzLl9jb21ib0xpc3QsIHRoaXMuX2NvbWJvT3B0aW9ucywgdGhpcyk7XG4gICAgc2V0dXBDb21ib0lucHV0KHRoaXMuX2NvbWJvSW5wdXQsIHRoaXMpO1xuICAgIHNldHVwQ29tYm9CdG4odGhpcy5fY29tYm9BZGRCdG4sIHRoaXMpO1xuXG4gICAgdGhpcy5ldmVudHMub24oJ2tleWRvd24nLCB7IHN1YnNjcmliZXI6IGNoYW5nZVNlbGVjdGVkLCBjb250ZXh0OiB0aGlzIH0pO1xuICAgIC8vdGhpcy5ldmVudHMub24oJ21vdXNlbGVhdmUnLCB7IHN1YnNjcmliZXI6IE1MU3VwZXJDb21ibyRoaWRlT3B0aW9ucywgY29udGV4dDogdGhpcyB9KTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTaG93cyBvciBoaWRlcyBvcHRpb24gbGlzdC5cbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHNob3cgdHJ1ZSB0byBzaG93LCBmYWxzZSB0byBoaWRlXG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyR0b2dnbGVPcHRpb25zKHNob3cpIHtcbiAgICB0aGlzLl9oaWRkZW4gPSAhc2hvdztcbiAgICB0aGlzLl9jb21ib0xpc3QuZG9tLnRvZ2dsZShzaG93KTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTaG93cyBvcHRpb25zIGxpc3RcbiAqL1xuZnVuY3Rpb24gTUxTdXBlckNvbWJvJHNob3dPcHRpb25zKCkge1xuICAgIHRoaXMuX2hpZGRlbiA9IGZhbHNlO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZChDT01CT19PUEVOKTtcbiAgICB0aGlzLl9jb21ib0xpc3QuZG9tLnRvZ2dsZSh0cnVlKTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBIaWRlcyBvcHRpb25zIGxpc3RcbiAqL1xuZnVuY3Rpb24gTUxTdXBlckNvbWJvJGhpZGVPcHRpb25zKCkge1xuICAgIHRoaXMuX2hpZGRlbiA9IHRydWU7XG4gICAgdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKENPTUJPX09QRU4pO1xuICAgIHRoaXMuX2NvbWJvTGlzdC5kb20udG9nZ2xlKGZhbHNlKTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBIaWRlcyBhZGQgYnV0dG9uXG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyR0b2dnbGVBZGRCdXR0b24oc2hvdywgb3B0aW9ucykge1xuICAgIHRoaXMuX2NvbWJvQWRkSXRlbURpdi5kb20udG9nZ2xlKHNob3cpO1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMucHJlc2VydmVTdGF0ZSkgdGhpcy5fX3Nob3dBZGRPbkNsaWNrID0gdGhpcy5faXNBZGRCdXR0b25TaG93bjtcbiAgICB0aGlzLl9pc0FkZEJ1dHRvblNob3duID0gc2hvdztcbn1cblxuXG5mdW5jdGlvbiBNTFN1cGVyQ29tYm8kc2V0QWRkSXRlbVByb21wdChwcm9tcHQpIHtcbiAgICB0aGlzLl9hZGRJdGVtUHJvbXB0ID0gcHJvbXB0O1xuICAgIHRoaXMuX2NvbWJvQWRkUHJvbXB0LmVsLmlubmVySFRNTCA9IHByb21wdDtcbiAgICB0aGlzLnRvZ2dsZUFkZEJ1dHRvbihmYWxzZSk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTZXRzIHRoZSBvcHRpb25zIG9mIHRoZSBkcm9wZG93blxuICpcbiAqIEBwYXJhbSB7QXJyYXlbT2JqZWN0XX0gYXJyIHRoZSBvcHRpb25zIHRvIHNldCB3aXRoIGxhYmVsIGFuZCB2YWx1ZSBwYWlycy4gVmFsdWUgY2FuIGJlIGFuIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gTUxTdXBlckNvbWJvJHNldE9wdGlvbnMoYXJyKSB7XG4gICAgdGhpcy5fb3B0aW9uc0RhdGEgPSBhcnI7XG4gICAgdGhpcy5zZXRGaWx0ZXJlZE9wdGlvbnMoYXJyKTtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIEluaXRpYWxpc2UgdGhlIHJlbW90ZSBvcHRpb25zIG9mIHRoZSBkcm9wZG93blxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBvcHRpb25zIHRvIGluaXRpYWxpc2UuXG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyRpbml0T3B0aW9uc1VSTChvcHRpb25zKSB7XG4gICAgdGhpcy5fb3B0aW9uc1VSTCA9IG9wdGlvbnMudXJsO1xuICAgIHRoaXMuX2Zvcm1hdE9wdGlvbnNVUkwgPSBvcHRpb25zLmZvcm1hdE9wdGlvbnMgfHwgZnVuY3Rpb24oZSl7cmV0dXJuIGU7fTtcbn1cblxuXG4vKipcbiAqIFByaXZhdGUgbWV0aG9kXG4gKiBTZXRzIHRoZSBvcHRpb25zIG9mIHRoZSBkcm9wZG93biBiYXNlZCBvbiBhIHJlcXVlc3RcbiAqL1xuZnVuY3Rpb24gX2dldE9wdGlvbnNVUkwoY2IpIHtcbiAgICB2YXIgdXJsID0gdGhpcy5fb3B0aW9uc1VSTCxcbiAgICAgICAgcXVlcnlTdHJpbmcgPSB0aGlzLl9jb21ib0lucHV0LmRhdGEuZ2V0KCk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGNiID0gY2IgfHwgXy5ub29wO1xuICAgIG1pbG8udXRpbC5yZXF1ZXN0LnBvc3QodXJsLCB7IG5hbWU6IHF1ZXJ5U3RyaW5nIH0sIGZ1bmN0aW9uIChlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignQ2FuIG5vdCBzZWFyY2ggZm9yIFwiJyArIHF1ZXJ5U3RyaW5nICsgJ1wiJyk7XG4gICAgICAgICAgICByZXR1cm4gY2IobmV3IEVycm9yKCdSZXF1ZXN0IGVycm9yJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlc3BvbnNlRGF0YSA9IF8uanNvblBhcnNlKHJlc3BvbnNlKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlRGF0YSkgY2IobnVsbCwgcmVzcG9uc2VEYXRhKTtcbiAgICAgICAgZWxzZSBjYihuZXcgRXJyb3IoJ0RhdGEgZXJyb3InKSk7XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTZXRzIHRoZSBmaWx0ZXJlZCBvcHRpb25zLCB3aGljaCBpcyBhIHN1YnNldCBvZiBub3JtYWwgb3B0aW9uc1xuICpcbiAqIEBwYXJhbSB7W3R5cGVdfSBhcnIgVGhlIG9wdGlvbnMgdG8gc2V0XG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyRzZXRGaWx0ZXJlZE9wdGlvbnMoYXJyKSB7XG4gICAgaWYgKCEgYXJyKSByZXR1cm4gbG9nZ2VyLmVycm9yKCdzZXRGaWx0ZXJlZE9wdGlvbnM6IHBhcmFtZXRlciBpcyB1bmRlZmluZWQnKTtcbiAgICB0aGlzLl9maWx0ZXJlZE9wdGlvbnNEYXRhID0gYXJyO1xuICAgIHRoaXMuX3RvdGFsID0gYXJyLmxlbmd0aDtcbiAgICB0aGlzLnVwZGF0ZSgpO1xufVxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIFVwZGF0ZXMgdGhlIGxpc3QuIFRoaXMgaXMgdXNlZCBvbiBzY3JvbGwsIGFuZCBtYWtlcyB1c2Ugb2YgdGhlIGZpbHRlcmVkT3B0aW9ucyB0b1xuICogaW50ZWxsaWdlbnRseSBzaG93IGEgc3Vic2V0IG9mIHRoZSBmaWx0ZXJlZCBsaXN0IGF0IGEgdGltZS5cbiAqL1xuZnVuY3Rpb24gTUxTdXBlckNvbWJvJHVwZGF0ZSgpIHtcbiAgICB2YXIgd2FzSGlkZGVuID0gdGhpcy5faGlkZGVuO1xuXG4gICAgdmFyIGFyclRvU2hvdyA9IHRoaXMuX2ZpbHRlcmVkT3B0aW9uc0RhdGEuc2xpY2UodGhpcy5fc3RhcnRJbmRleCwgdGhpcy5fZW5kSW5kZXgpO1xuXG4gICAgdGhpcy5fY29tYm9PcHRpb25zLnRlbXBsYXRlLnJlbmRlcih7XG4gICAgICAgIGNvbWJvT3B0aW9uczogYXJyVG9TaG93XG4gICAgfSk7XG5cbiAgICB0aGlzLl9lbGVtZW50SGVpZ2h0ID0gdGhpcy5fZWxlbWVudEhlaWdodCB8fCBERUZBVUxUX0VMRU1FTlRfSEVJR0hUO1xuXG4gICAgaWYgKHdhc0hpZGRlbilcbiAgICAgICAgdGhpcy5oaWRlT3B0aW9ucygpO1xuXG4gICAgdmFyIGJlZm9yZUhlaWdodCA9IHRoaXMuX3N0YXJ0SW5kZXggKiB0aGlzLl9lbGVtZW50SGVpZ2h0O1xuICAgIHZhciBhZnRlckhlaWdodCA9ICh0aGlzLl90b3RhbCAtIHRoaXMuX2VuZEluZGV4KSAqIHRoaXMuX2VsZW1lbnRIZWlnaHQ7XG4gICAgdGhpcy5fY29tYm9CZWZvcmUuZWwuc3R5bGUuaGVpZ2h0ID0gYmVmb3JlSGVpZ2h0ICsgJ3B4JztcbiAgICB0aGlzLl9jb21ib0FmdGVyLmVsLnN0eWxlLmhlaWdodCA9IGFmdGVySGVpZ2h0ID4gMCA/IGFmdGVySGVpZ2h0ICsgJ3B4JyA6ICcwcHgnO1xufVxuXG4vKipcbiAqIFNldHVwIHRoZSBjb21ibyBsaXN0XG4gKlxuICogQHBhcmFtICB7Q29tcG9uZW50fSBsaXN0XG4gKiBAcGFyYW0gIHtBcnJheX0gb3B0aW9uc1xuICogQHBhcmFtICB7Q29tcG9uZW50fSBzZWxmXG4gKi9cbmZ1bmN0aW9uIHNldHVwQ29tYm9MaXN0KGxpc3QsIG9wdGlvbnMsIHNlbGYpIHtcbiAgICBzZWxmLnRvZ2dsZUFkZEJ1dHRvbihmYWxzZSk7XG4gICAgb3B0aW9ucy50ZW1wbGF0ZS5zZXQoT1BUSU9OU19URU1QTEFURSk7XG5cbiAgICBsaXN0LmRvbS5zZXRTdHlsZXMoe1xuICAgICAgICBvdmVyZmxvdzogJ3Njcm9sbCcsXG4gICAgICAgIGhlaWdodDogc2VsZi5fb3B0aW9uc0hlaWdodCArICdweCcsXG4gICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICB6SW5kZXg6IDEwXG4gICAgICAgIC8vIHRvcDogeVBvcyArICdweCcsXG4gICAgICAgIC8vIGxlZnQ6IHhQb3MgKyAncHgnLFxuICAgIH0pO1xuXG4gICAgc2VsZi5oaWRlT3B0aW9ucygpO1xuICAgIGxpc3QuZXZlbnRzLm9uTWVzc2FnZXMoe1xuICAgICAgICAnY2xpY2snOiB7c3Vic2NyaWJlcjogb25MaXN0Q2xpY2ssIGNvbnRleHQ6IHNlbGZ9LFxuICAgICAgICAnc2Nyb2xsJzoge3N1YnNjcmliZXI6IG9uTGlzdFNjcm9sbCwgY29udGV4dDogc2VsZn1cbiAgICB9KTtcbn1cblxuLyoqXG4gKiBTZXR1cCB0aGUgaW5wdXQgY29tcG9uZW50XG4gKlxuICogQHBhcmFtICB7Q29tcG9uZW50fSBpbnB1dFxuICogQHBhcmFtICB7Q29tcG9uZW50fSBzZWxmXG4gKi9cbmZ1bmN0aW9uIHNldHVwQ29tYm9JbnB1dChpbnB1dCwgc2VsZikge1xuICAgIGlucHV0LmV2ZW50cy5vbmNlKCdmb2N1cycsIGZ1bmN0aW9uKCl7XG4gICAgICAgIGlucHV0LmRhdGEub24oJycsIHsgc3Vic2NyaWJlcjogb25EYXRhQ2hhbmdlLCBjb250ZXh0OiBzZWxmIH0pO1xuICAgICAgICBpbnB1dC5ldmVudHMub24oJ2NsaWNrJywge3N1YnNjcmliZXI6IG9uSW5wdXRDbGljaywgY29udGV4dDogc2VsZiB9KTtcbiAgICAgICAgaW5wdXQuZXZlbnRzLm9uKCdrZXlkb3duJywge3N1YnNjcmliZXI6IG9uRW50ZXJLZXksIGNvbnRleHQ6IHNlbGYgfSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogU2V0dXAgdGhlIGJ1dHRvblxuICogQHBhcmFtICB7Q29tcG9uZW50fSBidG5cbiAqIEBwYXJhbSAge0NvbXBvbmVudH0gc2VsZlxuICovXG5mdW5jdGlvbiBzZXR1cENvbWJvQnRuKGJ0biwgc2VsZikge1xuICAgIGJ0bi5ldmVudHMub24oJ2NsaWNrJywgeyBzdWJzY3JpYmVyOiBvbkFkZEJ0biwgY29udGV4dDogc2VsZiB9KTtcbn1cblxuXG4vKipcbiAqIEN1c3RvbSBkYXRhIGZhY2V0IGdldCBtZXRob2RcbiAqL1xuZnVuY3Rpb24gTUxTdXBlckNvbWJvX2dldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFZhbHVlO1xufVxuXG4vKipcbiAqIEN1c3RvbSBkYXRhIGZhY2V0IHNldCBtZXRob2RcbiAqIEBwYXJhbSB7VmFyaWFibGV9IG9ialxuICovXG5mdW5jdGlvbiBNTFN1cGVyQ29tYm9fc2V0KG9iaikge1xuICAgIHRoaXMuX2N1cnJlbnRWYWx1ZSA9IG9iajtcbiAgICB0aGlzLl9jb21ib0lucHV0LmRhdGEuc2V0KG9iaiAmJiBvYmoubGFiZWwpO1xuICAgIF8uZGVmZXJNZXRob2QodGhpcywgJ2hpZGVPcHRpb25zJyk7XG59XG5cbi8qKlxuICogQ3VzdG9tIGRhdGEgZmFjZXQgZGVsIG1ldGhvZFxuICovXG5mdW5jdGlvbiBNTFN1cGVyQ29tYm9fZGVsKCkge1xuICAgIHRoaXMuX2N1cnJlbnRWYWx1ZSA9IG51bGw7XG4gICAgdGhpcy5fY29tYm9JbnB1dC5kYXRhLnNldCgnJyk7XG59XG5cblxuLyoqXG4gKiBJbnB1dCBkYXRhIGNoYW5nZSBoYW5kbGVyXG4gKiBXaGVuIHRoZSBpbnB1dCBkYXRhIGNoYW5nZXMsIHRoaXMgbWV0aG9kIGZpbHRlcnMgdGhlIG9wdGlvbnNEYXRhLCBhbmQgc2V0cyB0aGUgZmlyc3QgZWxlbWVudFxuICogdG8gYmUgc2VsZWN0ZWQuXG4gKiBAcGFyYW0gIHtTdHJpbmd9IG1zZ1xuICogQHBhcmFtICB7T2JqZXh0fSBkYXRhXG4gKi9cbmZ1bmN0aW9uIG9uRGF0YUNoYW5nZShtc2csIGRhdGEpIHtcbiAgICB2YXIgdGV4dCA9IGRhdGEubmV3VmFsdWUgJiYgZGF0YS5uZXdWYWx1ZS50cmltKCk7XG4gICAgaWYgKHRoaXMuX29wdGlvbnNVUkwpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICBfZ2V0T3B0aW9uc1VSTC5jYWxsKHRoaXMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2VEYXRhKXtcbiAgICAgICAgICAgIGlmIChlcnIgfHwgIXJlc3BvbnNlRGF0YSkgcmV0dXJuO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHJlc3BvbnNlRGF0YS5kYXRhLm1hcChzZWxmLl9mb3JtYXRPcHRpb25zVVJMKTtcbiAgICAgICAgICAgICAgICBzZWxmLnNldE9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgX3VwZGF0ZU9wdGlvbnNBbmRBZGRCdXR0b24uY2FsbChzZWxmLCB0ZXh0LCBzZWxmLl9vcHRpb25zRGF0YSk7XG4gICAgICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0RhdGEgZXJyb3InLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGZpbHRlcmVkRGF0YSA9IF9maWx0ZXJEYXRhLmNhbGwodGhpcywgdGV4dCk7XG4gICAgICAgIF91cGRhdGVPcHRpb25zQW5kQWRkQnV0dG9uLmNhbGwodGhpcywgdGV4dCwgZmlsdGVyZWREYXRhKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gX2ZpbHRlckRhdGEodGV4dCkge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zRGF0YS5maWx0ZXIoZnVuY3Rpb24ob3B0aW9uKSB7XG4gICAgICAgIGRlbGV0ZSBvcHRpb24uc2VsZWN0ZWQ7XG4gICAgICAgIGlmIChvcHRpb24ubGFiZWwpIHtcbiAgICAgICAgICAgIHZhciBsYWJlbCA9IG9wdGlvbi5sYWJlbC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGxhYmVsLnRyaW0oKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YodGV4dC50b0xvd2VyQ2FzZSgpKSA9PSAwO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gX3VwZGF0ZU9wdGlvbnNBbmRBZGRCdXR0b24odGV4dCwgZmlsdGVyZWRBcnIpIHtcbiAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgdGhpcy50b2dnbGVBZGRCdXR0b24oZmFsc2UsIHsgcHJlc2VydmVTdGF0ZTogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZmlsdGVyZWRBcnIubGVuZ3RoICYmIF8uZmluZChmaWx0ZXJlZEFyciwgaXNFeGFjdE1hdGNoKSkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVBZGRCdXR0b24oZmFsc2UsIHsgcHJlc2VydmVTdGF0ZTogdHJ1ZSB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9hZGRJdGVtUHJvbXB0KSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUFkZEJ1dHRvbih0aGlzLl9vcHRpb25zRGF0YS5sZW5ndGggPiAxIHx8IHRoaXMuX29wdGlvbnNVUkwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbHRlcmVkQXJyLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5zaG93T3B0aW9ucygpO1xuICAgICAgICAgICAgZmlsdGVyZWRBcnJbMF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWQgPSBmaWx0ZXJlZEFyclswXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZU9wdGlvbnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2V0RmlsdGVyZWRPcHRpb25zKGZpbHRlcmVkQXJyKTtcbiAgICB0aGlzLl9jb21ib0xpc3QuZWwuc2Nyb2xsVG9wID0gMDtcblxuICAgIGZ1bmN0aW9uIGlzRXhhY3RNYXRjaChpdGVtKSB7XG4gICAgICAgIHJldHVybiBpdGVtLmxhYmVsLnRvTG93ZXJDYXNlKCkgPT09IHRleHQudG9Mb3dlckNhc2UoKTtcbiAgICB9XG59XG5cbi8qKlxuICogQSBtYXAgb2Yga2V5Q29kZXMgdG8gZGlyZWN0aW9uc1xuICogQHR5cGUge09iamVjdH1cbiAqL1xudmFyIGRpcmVjdGlvbk1hcCA9IHsgJzQwJzogMSwgJzM4JzogLTEgfTtcblxuLyoqXG4gKiBMaXN0IGtleWRvd24gaGFuZGxlclxuICogQ2hhbmdlcyB0aGUgc2VsZWN0ZWQgbGlzdCBpdGVtIGJ5IGZpbmRpbmcgdGhlIGFkamFjZW50IGl0ZW0gYW5kIHNldHRpbmcgaXQgdG8gc2VsZWN0ZWQuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0gIHtFdmVudH0gZXZlbnRcbiAqL1xuZnVuY3Rpb24gY2hhbmdlU2VsZWN0ZWQodHlwZSwgZXZlbnQpIHtcbiAgICAvL1RPRE8gdGVzdCBtb2NoYVxuICAgIHZhciBkaXJlY3Rpb24gPSBkaXJlY3Rpb25NYXBbZXZlbnQua2V5Q29kZV07XG5cbiAgICBpZihkaXJlY3Rpb24pXG4gICAgICAgIF9jaGFuZ2VTZWxlY3RlZC5jYWxsKHRoaXMsIGRpcmVjdGlvbik7XG59XG5cbmZ1bmN0aW9uIF9jaGFuZ2VTZWxlY3RlZChkaXJlY3Rpb24pIHtcbiAgICAvLyBUT0RPOiByZWZhY3RvciBhbmQgdGlkeSB1cCwgbG9va3MgbGlrZSBzb21lIGNvZGUgZHVwbGljYXRpb24uXG4gICAgdmFyIHNlbGVjdGVkID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VsZWN0ZWQnKVswXVxuICAgICAgICAsIHNjcm9sbFBvcyA9IHRoaXMuX2NvbWJvTGlzdC5lbC5zY3JvbGxUb3BcbiAgICAgICAgLCBzZWxlY3RlZFBvcyA9IHNlbGVjdGVkID8gc2VsZWN0ZWQub2Zmc2V0VG9wIDogMFxuICAgICAgICAsIHJlbGF0aXZlUG9zID0gc2VsZWN0ZWRQb3MgLSBzY3JvbGxQb3M7XG5cbiAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gX2dldERhdGFWYWx1ZUZyb21FbGVtZW50LmNhbGwodGhpcywgc2VsZWN0ZWQpXG4gICAgICAgICAgICAsIHRoaXNJdGVtID0gdGhpcy5fZmlsdGVyZWRPcHRpb25zRGF0YVtpbmRleF1cbiAgICAgICAgICAgICwgYWRqSXRlbSA9IHRoaXMuX2ZpbHRlcmVkT3B0aW9uc0RhdGFbaW5kZXggKyBkaXJlY3Rpb25dO1xuXG4gICAgICAgIGlmIChhZGpJdGVtKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpc0l0ZW0uc2VsZWN0ZWQ7XG4gICAgICAgICAgICBhZGpJdGVtLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkID0gYWRqSXRlbTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5fZmlsdGVyZWRPcHRpb25zRGF0YVswXSkge1xuICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWRPcHRpb25zRGF0YVswXS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlbGF0aXZlUG9zID4gdGhpcy5fb3B0aW9uc0hlaWdodCAtIHRoaXMuX2VsZW1lbnRIZWlnaHQqMiAmJiBkaXJlY3Rpb24gPT09IDEpXG4gICAgICAgIHRoaXMuX2NvbWJvTGlzdC5lbC5zY3JvbGxUb3AgKz0gdGhpcy5fZWxlbWVudEhlaWdodCpkaXJlY3Rpb24qNTtcblxuICAgIGlmIChyZWxhdGl2ZVBvcyA8IHRoaXMuX2VsZW1lbnRIZWlnaHQgJiYgZGlyZWN0aW9uID09PSAtMSlcbiAgICAgICAgdGhpcy5fY29tYm9MaXN0LmVsLnNjcm9sbFRvcCArPSB0aGlzLl9lbGVtZW50SGVpZ2h0KmRpcmVjdGlvbio1O1xufVxuXG5cbi8qKlxuICogTW91c2Ugb3ZlciBoYW5kbGVyXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0gIHtFdmVudH0gZXZlbnRcbiAqL1xuZnVuY3Rpb24gb25Nb3VzZU92ZXIodHlwZSwgZXZlbnQpIHtcbiAgICB0aGlzLl9tb3VzZUlzT3ZlciA9IHRydWU7XG59XG5cblxuLyoqXG4gKiBNb3VzZSBsZWF2ZSBoYW5kbGVyXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0gIHtFdmVudH0gZXZlbnRcbiAqL1xuZnVuY3Rpb24gb25Nb3VzZUxlYXZlKHR5cGUsIGV2ZW50KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuX21vdXNlSXNPdmVyID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuX21vdXNlT3V0VGltZXIpIGNsZWFySW50ZXJ2YWwodGhpcy5fbW91c2VPdXRUaW1lcik7XG4gICAgdGhpcy5fbW91c2VPdXRUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgICAgaWYgKCFzZWxmLl9tb3VzZUlzT3ZlcilcbiAgICAgICAgICAgIF9vbk1vdXNlTGVhdmUuY2FsbChzZWxmKTtcbiAgICB9LCA3NTApO1xufVxuXG5mdW5jdGlvbiBfb25Nb3VzZUxlYXZlKCkge1xuICAgIHRoaXMuaGlkZU9wdGlvbnMoKTtcbiAgICB0aGlzLnRvZ2dsZUFkZEJ1dHRvbihmYWxzZSwgeyBwcmVzZXJ2ZVN0YXRlOiB0cnVlIH0pO1xufVxuXG5cbi8qKlxuICogSW5wdXQgY2xpY2sgaGFuZGxlclxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gdHlwZVxuICogQHBhcmFtICB7RXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIG9uSW5wdXRDbGljayh0eXBlLCBldmVudCkge1xuICAgIHRoaXMuc2hvd09wdGlvbnMoKTtcbiAgICBpZiAodGhpcy5fX3Nob3dBZGRPbkNsaWNrKSB0aGlzLnRvZ2dsZUFkZEJ1dHRvbih0cnVlKTtcbn1cblxuXG4vKipcbiAqIEVudGVyIGtleSBoYW5kbGVyXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0gIHtFdmVudH0gZXZlbnRcbiAqL1xuZnVuY3Rpb24gb25FbnRlcktleSh0eXBlLCBldmVudCkge1xuICAgIGlmIChldmVudC5rZXlDb2RlID09IDEzKSB7XG4gICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZClcbiAgICAgICAgICAgIF9zZXREYXRhLmNhbGwodGhpcyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEFkZCBidXR0b24gaGFuZGxlclxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gdHlwZVxuICogQHBhcmFtICB7RXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIG9uQWRkQnRuICh0eXBlLCBldmVudCkge1xuICAgIHZhciBkYXRhID0geyBsYWJlbDogdGhpcy5fY29tYm9JbnB1dC5lbC52YWx1ZSB9O1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoJ2FkZGl0ZW0nLCBkYXRhKTtcbiAgICB0aGlzLmV2ZW50cy5wb3N0TWVzc2FnZSgnbWlsb19zdXBlcmNvbWJvYWRkaXRlbScsIGRhdGEpO1xuICAgIHRoaXMudG9nZ2xlQWRkQnV0dG9uKGZhbHNlLCB7IHByZXNlcnZlU3RhdGU6IHRydWUgfSk7XG5cbn1cblxuLyoqXG4gKiBMaXN0IGNsaWNrIGhhbmRsZXJcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSAge0V2ZW50fSBldmVudFxuICovXG5mdW5jdGlvbiBvbkxpc3RDbGljayAodHlwZSwgZXZlbnQpIHtcbiAgICB2YXIgaW5kZXggPSBfZ2V0RGF0YVZhbHVlRnJvbUVsZW1lbnQuY2FsbCh0aGlzLCBldmVudC50YXJnZXQpO1xuICAgIHZhciBkYXRhID0gdGhpcy5fZmlsdGVyZWRPcHRpb25zRGF0YVtpbmRleF07XG5cbiAgICB0aGlzLl9zZWxlY3RlZCA9IGRhdGE7XG4gICAgX3NldERhdGEuY2FsbCh0aGlzKTtcbiAgICB0aGlzLnVwZGF0ZSgpO1xufVxuXG5cbi8qKlxuICogTGlzdCBzY3JvbGwgaGFuZGxlclxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gdHlwZVxuICogQHBhcmFtICB7RXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIG9uTGlzdFNjcm9sbCAodHlwZSwgZXZlbnQpIHtcbiAgICB2YXIgc2Nyb2xsUG9zID0gZXZlbnQudGFyZ2V0LnNjcm9sbFRvcFxuICAgICAgICAsIGRpcmVjdGlvbiA9IHNjcm9sbFBvcyA+IHRoaXMuX2xhc3RTY3JvbGxQb3MgPyAnZG93bicgOiAndXAnXG4gICAgICAgICwgZmlyc3RDaGlsZCA9IHRoaXMuX2NvbWJvT3B0aW9ucy5lbC5sYXN0RWxlbWVudENoaWxkXG4gICAgICAgICwgbGFzdENoaWxkID0gdGhpcy5fY29tYm9PcHRpb25zLmVsLmZpcnN0RWxlbWVudENoaWxkXG4gICAgICAgICwgbGFzdEVsUG9zaXRpb24gPSBmaXJzdENoaWxkID8gZmlyc3RDaGlsZC5vZmZzZXRUb3AgOiAwXG4gICAgICAgICwgZmlyc3RFbFBvc2l0aW9uID0gbGFzdENoaWxkID8gbGFzdENoaWxkLm9mZnNldFRvcCA6IDBcbiAgICAgICAgLCBkaXN0RnJvbUxhc3RFbCA9IGxhc3RFbFBvc2l0aW9uIC0gc2Nyb2xsUG9zIC0gdGhpcy5fb3B0aW9uc0hlaWdodCArIHRoaXMuX2VsZW1lbnRIZWlnaHRcbiAgICAgICAgLCBkaXN0RnJvbUZpcnN0RWwgPSBzY3JvbGxQb3MgLSBmaXJzdEVsUG9zaXRpb25cbiAgICAgICAgLCBlbHNGcm9tU3RhcnQgPSBNYXRoLmZsb29yKGRpc3RGcm9tRmlyc3RFbCAvIHRoaXMuX2VsZW1lbnRIZWlnaHQpXG4gICAgICAgICwgZWxzVG9UaGVFbmQgPSBNYXRoLmZsb29yKGRpc3RGcm9tTGFzdEVsIC8gdGhpcy5fZWxlbWVudEhlaWdodClcbiAgICAgICAgLCB0b3RhbEVsZW1lbnRzQmVmb3JlID0gTWF0aC5mbG9vcihzY3JvbGxQb3MgLyB0aGlzLl9lbGVtZW50SGVpZ2h0KSAtIEJVRkZFUjtcblxuICAgIGlmICgoZGlyZWN0aW9uID09ICdkb3duJyAmJiBlbHNUb1RoZUVuZCA8IEJVRkZFUilcbiAgICAgICAgfHwgKGRpcmVjdGlvbiA9PSAndXAnICYmIGVsc0Zyb21TdGFydCA8IEJVRkZFUikpIHtcbiAgICAgICAgdGhpcy5fc3RhcnRJbmRleCA9IHRvdGFsRWxlbWVudHNCZWZvcmUgPiAwID8gdG90YWxFbGVtZW50c0JlZm9yZSA6IDA7XG4gICAgICAgIHRoaXMuX2VuZEluZGV4ID0gdG90YWxFbGVtZW50c0JlZm9yZSArIE1BWF9SRU5ERVJFRDtcbiAgICAgICAgdGhpcy5fZWxlbWVudEhlaWdodCA9IGZpcnN0Q2hpbGQuc3R5bGUuaGVpZ2h0O1xuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cbiAgICB0aGlzLl9sYXN0U2Nyb2xsUG9zID0gc2Nyb2xsUG9zO1xufVxuXG5cbi8qKlxuICogUHJpdmF0ZSBtZXRob2RcbiAqIFJldHJpZXZlcyB0aGUgZGF0YS12YWx1ZSBhdHRyaWJ1dGUgdmFsdWUgZnJvbSB0aGUgZWxlbWVudCBhbmQgcmV0dXJucyBpdCBhcyBhbiBpbmRleCBvZlxuICogdGhlIGZpbHRlcmVkT3B0aW9uc1xuICpcbiAqIEBwYXJhbSAge0VsZW1lbnR9IGVsXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIF9nZXREYXRhVmFsdWVGcm9tRWxlbWVudChlbCkge1xuICAgIHJldHVybiBOdW1iZXIoZWwuZ2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJykpICsgdGhpcy5fc3RhcnRJbmRleDtcbn1cblxuLyoqXG4gKiBQcml2YXRlIG1ldGhvZFxuICogU2V0cyB0aGUgZGF0YSBvZiB0aGUgU3VwZXJDb21ibywgdGFraW5nIGNhcmUgdG8gcmVzZXQgc29tZSB0aGluZ3MgYW5kIHRlbXBvcmFyaWx5XG4gKiB1bnN1YnNjcmliZSBkYXRhIGxpc3RlbmVycy5cbiAqL1xuZnVuY3Rpb24gX3NldERhdGEoKSB7XG4gICAgZGVsZXRlIHRoaXMuX3NlbGVjdGVkLnNlbGVjdGVkO1xuICAgIHRoaXMuaGlkZU9wdGlvbnMoKTtcbiAgICB0aGlzLnRvZ2dsZUFkZEJ1dHRvbihmYWxzZSk7XG4gICAgdGhpcy5fY29tYm9JbnB1dC5kYXRhLm9mZignJywgeyBzdWJzY3JpYmVyOiBvbkRhdGFDaGFuZ2UsIGNvbnRleHQ6IHRoaXMgfSk7XG4gICAgLy9zdXBlcmNvbWJvIGxpc3RlbmVycyBvZmZcbiAgICB0aGlzLmRhdGEuc2V0KHRoaXMuX3NlbGVjdGVkKTtcbiAgICB0aGlzLmRhdGEuZGlzcGF0Y2hTb3VyY2VNZXNzYWdlKENPTUJPX0NIQU5HRV9NRVNTQUdFKTtcbiAgICB0aGlzLl9jb21ib0lucHV0LmRhdGEub24oJycsIHsgc3Vic2NyaWJlcjogb25EYXRhQ2hhbmdlLCBjb250ZXh0OiB0aGlzIH0pO1xuICAgIC8vc3VwZXJjb21ibyBsaXN0ZW5lcnMgb25cbiAgICB0aGlzLl9zZWxlY3RlZCA9IG51bGw7XG4gICAgdGhpcy5zZXRGaWx0ZXJlZE9wdGlvbnModGhpcy5fb3B0aW9uc0RhdGEpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5Jyk7XG5cblxudmFyIE1MVGV4dCA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxUZXh0Jywge1xuICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktdGV4dCdcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTFRleHQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MVGV4dDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyO1xuXG5cbnZhciBNTFRleHRhcmVhID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTFRleHRhcmVhJywge1xuICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktdGV4dGFyZWEnXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxUZXh0YXJlYSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxUZXh0YXJlYTtcblxuXG52YXIgU0FNUExFX0FVVE9SRVNJWkVfVEVYVCA9ICdMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dWVyIGFkaXBpc2NpbmcgZWxpdCwnO1xuXG5cbl8uZXh0ZW5kUHJvdG8oTUxUZXh0YXJlYSwge1xuICAgIHN0YXJ0QXV0b3Jlc2l6ZTogTUxUZXh0YXJlYSRzdGFydEF1dG9yZXNpemUsXG4gICAgc3RvcEF1dG9yZXNpemU6IE1MVGV4dGFyZWEkc3RvcEF1dG9yZXNpemUsXG4gICAgaXNBdXRvcmVzaXplZDogTUxUZXh0YXJlYSRpc0F1dG9yZXNpemVkLFxuICAgIGRpc2FibGU6IE1MVGV4dGFyZWEkZGlzYWJsZVxufSk7XG5cblxuZnVuY3Rpb24gTUxUZXh0YXJlYSRzdGFydEF1dG9yZXNpemUob3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9hdXRvcmVzaXplKVxuICAgICAgICByZXR1cm4gbG9nZ2VyLndhcm4oJ01MVGV4dGFyZWEgc3RhcnRBdXRvcmVzaXplOiBhdXRvcmVzaXplIGlzIGFscmVhZHkgb24nKTtcbiAgICB0aGlzLl9hdXRvcmVzaXplID0gdHJ1ZTtcbiAgICB0aGlzLl9hdXRvcmVzaXplT3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBfYWRqdXN0QXJlYUhlaWdodC5jYWxsKHRoaXMpO1xuICAgIF9tYW5hZ2VTdWJzY3JpcHRpb25zLmNhbGwodGhpcywgJ29uJyk7XG59XG5cblxuZnVuY3Rpb24gX21hbmFnZVN1YnNjcmlwdGlvbnMob25PZmYpIHtcbiAgICB0aGlzLmV2ZW50c1tvbk9mZl0oJ2NsaWNrJywgeyBzdWJzY3JpYmVyOiBfYWRqdXN0QXJlYUhlaWdodCwgY29udGV4dDogdGhpcyB9KTtcbiAgICB0aGlzLmRhdGFbb25PZmZdKCcnLCB7IHN1YnNjcmliZXI6IF9hZGp1c3RBcmVhSGVpZ2h0LCBjb250ZXh0OiB0aGlzIH0pO1xufVxuXG5cbmZ1bmN0aW9uIF9hZGp1c3RBcmVhSGVpZ2h0KCkge1xuICAgIHRoaXMuZWwuc3R5bGUuaGVpZ2h0ID0gMDtcblxuICAgIHZhciBuZXdIZWlnaHQgPSB0aGlzLmVsLnNjcm9sbEhlaWdodFxuICAgICAgICAsIG1pbkhlaWdodCA9IHRoaXMuX2F1dG9yZXNpemVPcHRpb25zLm1pbkhlaWdodFxuICAgICAgICAsIG1heEhlaWdodCA9IHRoaXMuX2F1dG9yZXNpemVPcHRpb25zLm1heEhlaWdodDtcblxuICAgIG5ld0hlaWdodCA9IG5ld0hlaWdodCA+PSBtYXhIZWlnaHRcbiAgICAgICAgICAgICAgICA/IG1heEhlaWdodFxuICAgICAgICAgICAgICAgIDogbmV3SGVpZ2h0IDw9IG1pbkhlaWdodFxuICAgICAgICAgICAgICAgID8gbWluSGVpZ2h0XG4gICAgICAgICAgICAgICAgOiBuZXdIZWlnaHQ7XG5cbiAgICB0aGlzLmVsLnN0eWxlLmhlaWdodCA9IG5ld0hlaWdodCArICdweCc7XG59XG5cblxuZnVuY3Rpb24gTUxUZXh0YXJlYSRzdG9wQXV0b3Jlc2l6ZSgpIHtcbiAgICBpZiAoISB0aGlzLl9hdXRvcmVzaXplKVxuICAgICAgICByZXR1cm4gbG9nZ2VyLndhcm4oJ01MVGV4dGFyZWEgc3RvcEF1dG9yZXNpemU6IGF1dG9yZXNpemUgaXMgbm90IG9uJyk7XG4gICAgdGhpcy5fYXV0b3Jlc2l6ZSA9IGZhbHNlO1xuICAgIF9tYW5hZ2VTdWJzY3JpcHRpb25zLmNhbGwodGhpcywgJ29mZicpO1xufVxuXG5cbmZ1bmN0aW9uIE1MVGV4dGFyZWEkaXNBdXRvcmVzaXplZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXV0b3Jlc2l6ZTtcbn1cblxuXG5mdW5jdGlvbiBNTFRleHRhcmVhJGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuX2F1dG9yZXNpemUpXG4gICAgICAgIHRoaXMuc3RvcEF1dG9yZXNpemUoKTtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gTUxUZXh0YXJlYSRkaXNhYmxlKGRpc2FibGUpIHtcbiAgICB0aGlzLmVsLmRpc2FibGVkID0gZGlzYWJsZTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbnZhciBNTFRpbWUgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MVGltZScsIHtcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkYXRhOiB7XG4gICAgICAgIGdldDogTUxUaW1lX2dldCxcbiAgICAgICAgc2V0OiBNTFRpbWVfc2V0LFxuICAgICAgICBkZWw6IE1MVGltZV9kZWwsXG4gICAgfSxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktdGltZSdcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTFRpbWUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MVGltZTtcblxuXG52YXIgVElNRV9SRUdFWCA9IC9eKFswLTldezEsMn0pKD86XFw6fFxcLikoWzAtOV17MSwyfSkkL1xuICAgICwgVElNRV9URU1QTEFURSA9ICdoaDptbSc7XG5cbmZ1bmN0aW9uIE1MVGltZV9nZXQoKSB7XG4gICAgdmFyIHRpbWVTdHIgPSB0aGlzLmVsLnZhbHVlO1xuICAgIHZhciBtYXRjaCA9IHRpbWVTdHIubWF0Y2goVElNRV9SRUdFWCk7XG4gICAgaWYgKCEgbWF0Y2gpIHJldHVybjtcbiAgICB2YXIgaG91cnMgPSBtYXRjaFsxXVxuICAgICAgICAsIG1pbnMgPSBtYXRjaFsyXTtcbiAgICBpZiAoaG91cnMgPiAyMyB8fCBtaW5zID4gNTkpIHJldHVybjtcbiAgICB2YXIgdGltZSA9IG5ldyBEYXRlKDE5NzAsIDAsIDEsIGhvdXJzLCBtaW5zKTtcblxuICAgIHJldHVybiBfLnRvRGF0ZSh0aW1lKTtcbn1cblxuXG5mdW5jdGlvbiBNTFRpbWVfc2V0KHZhbHVlKSB7XG4gICAgdmFyIHRpbWUgPSBfLnRvRGF0ZSh2YWx1ZSk7XG4gICAgaWYgKCEgdGltZSkge1xuICAgICAgICB0aGlzLmVsLnZhbHVlID0gJyc7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdGltZVN0ciA9IFRJTUVfVEVNUExBVEVcbiAgICAgICAgICAgIC5yZXBsYWNlKCdoaCcsIHBhZCh0aW1lLmdldEhvdXJzKCkpKVxuICAgICAgICAgICAgLnJlcGxhY2UoJ21tJywgcGFkKHRpbWUuZ2V0TWludXRlcygpKSk7XG5cbiAgICB0aGlzLmVsLnZhbHVlID0gdGltZVN0cjtcbiAgICByZXR1cm4gdGltZVN0cjtcblxuICAgIGZ1bmN0aW9uIHBhZChuKSB7cmV0dXJuIG4gPCAxMCA/ICcwJyArIG4gOiBuOyB9XG59XG5cblxuZnVuY3Rpb24gTUxUaW1lX2RlbCgpIHtcbiAgICB0aGlzLmVsLnZhbHVlID0gJyc7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKTtcblxuXG52YXIgTUxXcmFwcGVyID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTFdyYXBwZXInLCB7XG4gICAgY29udGFpbmVyOiB1bmRlZmluZWQsXG4gICAgZGF0YTogdW5kZWZpbmVkLFxuICAgIGV2ZW50czogdW5kZWZpbmVkLFxuICAgIGRvbToge1xuICAgICAgICBjbHM6ICdtbC11aS13cmFwcGVyJ1xuICAgIH1cbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MV3JhcHBlcik7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxXcmFwcGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi8uLi9jX3JlZ2lzdHJ5JylcbiAgICAsIGNvbXBvbmVudE5hbWUgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlsL2NvbXBvbmVudF9uYW1lJylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2hcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxuXG52YXIgQUxFUlRfQ1NTX0NMQVNTRVMgPSB7XG4gICAgc3VjY2VzczogJ2FsZXJ0LXN1Y2Nlc3MnLFxuICAgIHdhcm5pbmc6ICdhbGVydC13YXJuaW5nJyxcbiAgICBpbmZvOiAnYWxlcnQtaW5mbycsXG4gICAgZGFuZ2VyOiAnYWxlcnQtZGFuZ2VyJyxcbiAgICBmaXhlZDogJ2FsZXJ0LWZpeGVkJ1xufTtcblxuXG52YXIgTUxBbGVydCA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxBbGVydCcsIHtcbiAgICBjb250YWluZXI6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiBbJ21sLWJzLWFsZXJ0JywgJ2FsZXJ0JywgJ2ZhZGUnXSxcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgJ3JvbGUnOiAnYWxlcnQnLFxuICAgICAgICAgICAgJ2FyaWEtaGlkZGVuJzogJ3RydWUnXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHRlbXBsYXRlOiB7XG4gICAgICAgIHRlbXBsYXRlOiAnXFxcbiAgICAgICAgICAgIHt7PyBpdC5jbG9zZSB9fVxcXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtbC1iaW5kPVwiW2V2ZW50c106Y2xvc2VCdG5cIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cImFsZXJ0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvYnV0dG9uPlxcXG4gICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICB7ez0gaXQubWVzc2FnZX19J1xuICAgIH1cbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MQWxlcnQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MQWxlcnQ7XG5cblxuXy5leHRlbmQoTUxBbGVydCwge1xuICAgIGNyZWF0ZUFsZXJ0OiBNTEFsZXJ0JCRjcmVhdGVBbGVydCxcbiAgICBvcGVuQWxlcnQ6IE1MQWxlcnQkJG9wZW5BbGVydCxcbn0pO1xuXG5cbl8uZXh0ZW5kUHJvdG8oTUxBbGVydCwge1xuICAgIG9wZW5BbGVydDogTUxBbGVydCRvcGVuQWxlcnQsXG4gICAgY2xvc2VBbGVydDogTUxBbGVydCRjbG9zZUFsZXJ0XG59KTtcblxuXG4vKipcbiAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgYWxlcnQgaW5zdGFuY2UuIFRvIGNyZWF0ZSBhbmQgb3BlbiBhdCB0aGUgc2FtZSB0aW1lIHVzZSBbb3BlbkFsZXJ0XSgjTUxBbGVydCQkb3BlbkFsZXJ0KVxuICogYG9wdGlvbnNgIGlzIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgICAgIG1lc3NhZ2U6IHN0cmluZyBhbGVydCBtZXNzYWdlXG4gKiAgICAgIHR5cGU6ICAgIG9wdGlvbmFsIHN0cmluZyB0aGUgdHlwZSBvZiBhbGVydCBtZXNzYWdlLCBvbmUgb2Ygc3VjY2Vzcywgd2FybmluZywgaW5mbywgZGFuZ2VyLCBmaXhlZFxuICogICAgICAgICAgICAgICBkZWZhdWx0ICdpbmZvJ1xuICogICAgICBjbG9zZTogICBvcHRpb25hbCBmYWxzZSB0byBwcmV2ZW50IHVzZXIgZnJvbSBjbG9zaW5nXG4gKiAgICAgICAgICAgICAgIG9yIHRydWUgKGRlZmF1bHQpIHRvIGVuYWJsZSBjbG9zaW5nIGFuZCByZW5kZXIgYSBjbG9zZSBidXR0b25cbiAqICAgICAgdGltZW91dDogb3B0aW9uYWwgdGltZXIsIGluIG1pbGxpc2Vjb25kcyB0byBhdXRvbWF0aWNhbGx5IGNsb3NlIHRoZSBhbGVydFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIGFsZXJ0IGNvbmZpZ3VyYXRpb25cbiAqL1xuZnVuY3Rpb24gTUxBbGVydCQkY3JlYXRlQWxlcnQob3B0aW9ucykge1xuICAgIGNoZWNrKG9wdGlvbnMsIHtcbiAgICAgICAgbWVzc2FnZTogU3RyaW5nLFxuICAgICAgICB0eXBlOiBNYXRjaC5PcHRpb25hbChTdHJpbmcpLFxuICAgICAgICBjbG9zZTogTWF0Y2guT3B0aW9uYWwoQm9vbGVhbiksXG4gICAgICAgIHRpbWVvdXQ6IE1hdGNoLk9wdGlvbmFsKE51bWJlcilcbiAgICB9KTtcblxuICAgIHZhciBhbGVydCA9IE1MQWxlcnQuY3JlYXRlT25FbGVtZW50KCk7XG5cbiAgICBvcHRpb25zID0gX3ByZXBhcmVPcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgdmFyIGFsZXJ0Q2xzID0gQUxFUlRfQ1NTX0NMQVNTRVNbb3B0aW9ucy50eXBlXTtcbiAgICBhbGVydC5kb20uYWRkQ3NzQ2xhc3NlcyhhbGVydENscyk7XG5cbiAgICBhbGVydC5fYWxlcnQgPSB7XG4gICAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgfTtcblxuICAgIGFsZXJ0LnRlbXBsYXRlLnJlbmRlcihvcHRpb25zKS5iaW5kZXIoKTtcblxuICAgIHZhciBhbGVydFNjb3BlID0gYWxlcnQuY29udGFpbmVyLnNjb3BlO1xuXG4gICAgaWYgKG9wdGlvbnMuY2xvc2UpXG4gICAgICAgIGFsZXJ0U2NvcGUuY2xvc2VCdG4uZXZlbnRzLm9uKCdjbGljaycsXG4gICAgICAgICAgICB7IHN1YnNjcmliZXI6IF9vbkNsb3NlQnRuQ2xpY2ssIGNvbnRleHQ6IGFsZXJ0IH0pO1xuXG4gICAgaWYgKG9wdGlvbnMudGltZW91dClcbiAgICAgICAgdmFyIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgICAgICAgaWYoYWxlcnQuX2FsZXJ0LnZpc2libGUpXG4gICAgICAgICAgICAgICAgYWxlcnQuY2xvc2VBbGVydCgpO1xuICAgICAgICB9LCBvcHRpb25zLnRpbWVvdXQpO1xuXG4gICAgcmV0dXJuIGFsZXJ0O1xufVxuXG5cbi8qKlxuICogQ3JlYXRlIGFuZCBzaG93IGFsZXJ0IHBvcHVwXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgb2JqZWN0IHdpdGggbWVzc2FnZSwgdHlwZSwgY2xvc2UgYW5kIHRpbWVvdXRcbiAqIEByZXR1cm4ge01MQWxlcnR9IHRoZSBhbGVydCBpbnN0YW5jZVxuICovXG5mdW5jdGlvbiBNTEFsZXJ0JCRvcGVuQWxlcnQob3B0aW9ucykge1xuICAgIHZhciBhbGVydCA9IE1MQWxlcnQuY3JlYXRlQWxlcnQob3B0aW9ucyk7XG4gICAgYWxlcnQub3BlbkFsZXJ0KCk7XG4gICAgcmV0dXJuIGFsZXJ0O1xufVxuXG5cbmZ1bmN0aW9uIF9vbkNsb3NlQnRuQ2xpY2sodHlwZSwgZXZlbnQpIHtcbiAgICB0aGlzLmNsb3NlQWxlcnQoKTtcbn1cblxuXG5mdW5jdGlvbiBfcHJlcGFyZU9wdGlvbnMob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBfLmNsb25lKG9wdGlvbnMpO1xuICAgIG9wdGlvbnMuY2xvc2UgPSB0eXBlb2Ygb3B0aW9ucy5jbG9zZSA9PSAndW5kZWZpbmVkJyB8fCBvcHRpb25zLmNsb3NlID09PSB0cnVlO1xuICAgIG9wdGlvbnMudGltZW91dCA9IE1hdGguZmxvb3Iob3B0aW9ucy50aW1lb3V0KTtcbiAgICBvcHRpb25zLnR5cGUgPSBvcHRpb25zLnR5cGUgfHwgJ2luZm8nO1xuXG4gICAgcmV0dXJuIG9wdGlvbnM7XG59XG5cblxuLyoqXG4gKiBPcGVuIHRoZSBhbGVydFxuICovXG5mdW5jdGlvbiBNTEFsZXJ0JG9wZW5BbGVydCgpIHtcbiAgICBfdG9nZ2xlQWxlcnQuY2FsbCh0aGlzLCB0cnVlKTtcbn1cblxuXG4vKipcbiAqIENsb3NlIHRoZSBhbGVydFxuICovXG5mdW5jdGlvbiBNTEFsZXJ0JGNsb3NlQWxlcnQoKSB7XG4gICAgX3RvZ2dsZUFsZXJ0LmNhbGwodGhpcywgZmFsc2UpO1xuICAgIHRoaXMuZGVzdHJveSgpO1xufVxuXG5cbmZ1bmN0aW9uIF90b2dnbGVBbGVydChkb1Nob3cpIHtcbiAgICBkb1Nob3cgPSB0eXBlb2YgZG9TaG93ID09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgPyAhIHRoaXMuX2FsZXJ0LnZpc2libGVcbiAgICAgICAgICAgICAgICA6ICEhIGRvU2hvdztcblxuICAgIHZhciBhZGRSZW1vdmUgPSBkb1Nob3cgPyAnYWRkJyA6ICdyZW1vdmUnXG4gICAgICAgICwgYXBwZW5kUmVtb3ZlID0gZG9TaG93ID8gJ2FwcGVuZENoaWxkJyA6ICdyZW1vdmVDaGlsZCc7XG5cbiAgICB0aGlzLl9hbGVydC52aXNpYmxlID0gZG9TaG93O1xuXG4gICAgZG9jdW1lbnQuYm9keVthcHBlbmRSZW1vdmVdKHRoaXMuZWwpO1xuICAgIHRoaXMuZG9tLnRvZ2dsZShkb1Nob3cpO1xuICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICFkb1Nob3cpO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0W2FkZFJlbW92ZV0oJ2luJyk7XG4gICAgdGhpcy5lbFtkb1Nob3cgPyAnZm9jdXMnIDogJ2JsdXInXSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi8uLi9jX3JlZ2lzdHJ5JylcbiAgICAsIGNvbXBvbmVudE5hbWUgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlsL2NvbXBvbmVudF9uYW1lJylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2hcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxuXG52YXIgREVGQVVMVF9CVVRUT05TID0gWyB7IHR5cGU6ICdkZWZhdWx0JywgbGFiZWw6ICdPSycsIHJlc3VsdDogJ09LJyB9IF07XG5cbnZhciBDTE9TRV9PUFRJT05TID0gWydiYWNrZHJvcCcsICdrZXlib2FyZCcsICdidXR0b24nXTtcblxudmFyIEJVVFRPTl9DU1NfQ0xBU1NFUyA9IHsgLy8gVE9ETyAtIHVzZSBpbiB0ZW1wbGF0ZVxuICAgIGRlZmF1bHQ6ICdidG4tZGVmYXVsdCcsXG4gICAgcHJpbWFyeTogJ2J0bi1wcmltYXJ5JyxcbiAgICBzdWNjZXNzOiAnYnRuLXN1Y2Nlc3MnLFxuICAgIGluZm86ICdidG4taW5mbycsXG4gICAgd2FybmluZzogJ2J0bi13YXJuaW5nJyxcbiAgICBkYW5nZXI6ICdidG4tZGFuZ2VyJyxcbiAgICBsaW5rOiAnYnRuLWxpbmsnXG59O1xuXG5cbi8qKlxuICogRGlhbG9nIGNsYXNzIHRvIHNob3cgY3VzdG9tIGRpYWxvZyBib3hlcyBiYXNlZCBvbiBjb25maWd1cmF0aW9uIC0gc2VlIFtjcmVhdGVEaWFsb2ddKCNNTERpYWxvZyQkY3JlYXRlRGlhbG9nKSBtZXRob2QuXG4gKiBPbmx5IG9uZSBkaWFsb2cgY2FuIGJlIG9wZW5lZCBhdCBhIHRpbWUgLSB0cnlpbmcgdG8gb3BlbiBhbm90aGVyIHdpbGwgbG9nIGVycm9yIHRvIGNvbnNvbGUuIEN1cnJlbnRseSBvcGVuZWQgZGlhbG9nIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgW2dldEN1cnJlbnREaWFsb2ddKCNNTERpYWxvZyQkZ2V0Q3VycmVudERpYWxvZykgY2xhc3MgbWV0aG9kLlxuICovXG52YXIgTUxEaWFsb2cgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MRGlhbG9nJywge1xuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkLFxuICAgIGV2ZW50czogdW5kZWZpbmVkLFxuICAgIGRvbToge1xuICAgICAgICBjbHM6IFsnbWwtYnMtZGlhbG9nJywgJ21vZGFsJywgJ2ZhZGUnXSxcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgJ3JvbGUnOiAnZGlhbG9nJyxcbiAgICAgICAgICAgICdhcmlhLWhpZGRlbic6ICd0cnVlJ1xuICAgICAgICB9XG4gICAgfSxcbiAgICB0ZW1wbGF0ZToge1xuICAgICAgICB0ZW1wbGF0ZTogJ1xcXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIHt7PSBpdC5jc3NDbGFzcyB9fVwiPlxcXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cXFxuICAgICAgICAgICAgICAgICAgICB7ez8gaXQudGl0bGUgfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3s/IGl0LmNsb3NlLmJ1dHRvbiB9fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWwtYmluZD1cIltldmVudHNdOmNsb3NlQnRuXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIj4mdGltZXM7PC9idXR0b24+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIj57ez0gaXQudGl0bGUgfX08L2g0PlxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgICAgIHt7PyBpdC5odG1sIHx8IGl0LnRleHQgfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIiBtbC1iaW5kPVwiW2NvbnRhaW5lcl06ZGlhbG9nQm9keVwiPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3s/IGl0Lmh0bWwgfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ez0gaXQuaHRtbCB9fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3s/P319XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+e3s9IGl0LnRleHQgfX08L3A+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgICAgIHt7PyBpdC5idXR0b25zICYmIGl0LmJ1dHRvbnMubGVuZ3RoIH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7fiBpdC5idXR0b25zIDpidG4gfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4te3s9IGJ0bi50eXBlIH19e3s/IGJ0bi5jbHMgfX0ge3s9IGJ0bi5jbHMgfX17ez99fVwiXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1sLWJpbmQ9XCJbZXZlbnRzXTp7ez0gYnRuLm5hbWUgfX1cIj57ez0gYnRuLmxhYmVsIH19PC9idXR0b24+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e359fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxcbiAgICAgICAgICAgIDwvZGl2PidcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTERpYWxvZyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxEaWFsb2c7XG5cblxuXy5leHRlbmQoTUxEaWFsb2csIHtcbiAgICBjcmVhdGVEaWFsb2c6IE1MRGlhbG9nJCRjcmVhdGVEaWFsb2csXG4gICAgb3BlbkRpYWxvZzogTUxEaWFsb2ckJG9wZW5EaWFsb2csXG4gICAgZ2V0T3BlbmVkRGlhbG9nOiBNTERpYWxvZyQkZ2V0T3BlbmVkRGlhbG9nXG59KTtcblxuXG5fLmV4dGVuZFByb3RvKE1MRGlhbG9nLCB7XG4gICAgb3BlbkRpYWxvZzogTUxEaWFsb2ckb3BlbkRpYWxvZyxcbiAgICBjbG9zZURpYWxvZzogTUxEaWFsb2ckY2xvc2VEaWFsb2csXG4gICAgZGVzdHJveTogTUxEaWFsb2ckZGVzdHJveVxufSk7XG5cblxuLyoqXG4gKiBDcmVhdGVzIGFuZCByZXR1cm5zIGRpYWxvZyBpbnN0YW5jZS4gVG8gY3JlYXRlIGFuZCBvcGVuIGF0IHRoZSBzYW1lIHRpbWUgW29wZW5EaWFsb2ddKCNNTERpYWxvZyQkb3BlbkRpYWxvZylcbiAqIGBvcHRpb25zYCBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAgIHRpdGxlOiBvcHRpb25hbCBkaWFsb2cgdGl0bGVcbiAqICAgICBodG1sOiBvcHRpb25hbCBkaWFsb2cgdGV4dCBhcyBodG1sICh3aWxsIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRleHQgaWYgYm90aCB0ZXh0IG5kIGh0bWwgYXJlIHBhc3NlZClcbiAqICAgICAgIG9yXG4gKiAgICAgdGV4dDogb3B0aW9uYWwgZGlhbG9nIHRleHRcbiAqICAgICBjbG9zZTogb3B0aW9uYWwgZmFsc2UgdG8gcHJldmVudCBiYWNrZHJvcCBhbmQgZXNjIGtleSBmcm9tIGNsb3NpbmcgdGhlIGRpYWxvZyBhbmQgcmVtb3ZpbmcgY2xvc2UgYnV0dG9uIGluIHRvcCByaWdodCBjb3JuZXJcbiAqICAgICAgICAgICAgb3IgdHJ1ZSAoZGVmYXVsdCkgdG8gZW5hYmxlIGFsbCBjbG9zZSBvcHRpb25zXG4gKiAgICAgICAgICAgIG9yIG9iamVjdCB3aXRoIHByb3BlcnRpZXNcbiAqICAgICAgICAgYmFja2Ryb3A6IGZhbHNlIG9yIHRydWUgKGRlZmF1bHQpLCBjbG9zZSBkaWFsb2cgd2hlbiBiYWNrZHJvcCBjbGlja2VkXG4gKiAgICAgICAgIGtleWJvYXJkOiBmYWxzZSBvciB0cnVlIChkZWZhdWx0KSwgY2xvc2UgZGlhbG9nIHdoZW4gZXNjIGtleSBpcyBwcmVzc2VkXG4gKiAgICAgICAgIGJ1dHRvbjogZmFsc2Ugb3IgdHJ1ZSAoZGVmYXVsdCksIHNob3cgY2xvc2UgYnV0dG9uIGluIHRoZSBoZWFkZXIgKHdvbid0IGJlIHNob3duIGlmIHRoZXJlIGlzIG5vIGhlYWRlciB3aGVuIHRpdGxlIGlzIG5vdCBwYXNzZWQpXG4gKiAgICAgYnV0dG9uczogb3B0aW9uYWwgYXJyYXkgb2YgYnV0dG9ucyBjb25maWd1cmF0aW9ucywgd2hlcmUgZWFjaCBidXR0b24gY29uZmlnIGlzIGFuIG9iamVjdFxuICogICAgICAgICBuYW1lOiAgIG9wdGlvbmFsIG5hbWUgb2YgY29tcG9uZW50LCBzaG91bGQgYmUgdW5pcXVlIGFuZCBzaG91bGQgbm90IGJlIGBjbG9zZUJ0bmAsIGlmIG5vdCBwYXNzZWQgYSB0aW1lc3RhbXAgYmFzZWQgbmFtZSB3aWxsIGJlIHVzZWRcbiAqICAgICAgICAgdHlwZTogICBidXR0b24gdHlwZSwgd2lsbCBkZXRlcm1pbmUgYnV0dG9uIENTUyBzdHlsZS4gUG9zc2libGUgdHlwZXMgYXJlOiBkZWZ1bHQsIHByaW1hcnksIHN1Y2Nlc3MsIGluZm8sIHdhcm5pbmcsIGRhbmdlciwgbGluayAobWFwIHRvIHJlbGF0ZWQgYm9vdHN0cmFwIGJ1dHRvbiBzdHlsZXMpXG4gKiAgICAgICAgIGxhYmVsOiAgYnV0dG9uIGxhYmVsXG4gKiAgICAgICAgIGNsb3NlOiAgb3B0aW9uYWwgZmFsc2UgdG8gcHJldmVudCB0aGlzIGJ1dHRvbiBmcm9tIGNsb3NpbmcgZGlhbG9nXG4gKiAgICAgICAgIHJlc3VsdDogc3RyaW5nIHdpdGggZGlhbG9nIGNsb3NlIHJlc3VsdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIGRpYWxvZyBzdWJzY3JpYmVyIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXJcbiAqICAgICAgICAgZGF0YTogICBhbnkgdmFsdWUvb2JqZWN0IG9yIGZ1bmN0aW9uIHRvIGNyZWF0ZSBkYXRhIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gZGlhbG9nIHN1YnNjcmliZXIgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuXG4gKiAgICAgICAgICAgICAgICAgSWYgZnVuY3Rpb24gaXMgcGFzc2VkIGl0IHdpbGwgYmUgY2FsbGVkIHdpdGggZGlhbG9nIGFzIGNvbnRleHQgYW5kIGJ1dHRvbiBvcHRpb25zIGFzIHBhcmFtZXRlci5cbiAqXG4gKiAgICAgSWYgYHRpdGxlYCBpcyBub3QgcGFzc2VkLCBkaWFsb2cgd2lsbCBub3QgaGF2ZSB0aXRsZSBzZWN0aW9uXG4gKiAgICAgSWYgbmVpdGhlciBgdGV4dGAgbm9yIGBodG1sYCBpcyBwYXNzZWQsIGRpYWxvZyB3aWxsIG5vdCBoYXZlIGJvZHkgc2VjdGlvbi5cbiAqICAgICBJZiBgYnV0dG9uc2AgYXJlIG5vdCBwYXNzZWQsIHRoZXJlIHdpbGwgb25seSBiZSBPSyBidXR0b24uXG4gKlxuICogV2hlbiBkaWFsb2cgaXMgY2xvc2VkLCB0aGUgc3Vic2NyaWJlciBpcyBjYWxsZWQgd2l0aCByZWF1bHQgYW5kIG9wdGlvbmFsIGRhdGEgYXMgZGVmaW5lZCBpbiBidXR0b25zIGNvbmZpZ3VyYXRpb25zLlxuICogSWYgYmFja2Ryb3AgaXMgY2xpY2tlZCBvciBFU0Mga2V5IGlzIHByZXNzZWQgdGhlIHJlc3VsdCB3aWxsIGJlICdkaXNtaXNzZWQnXG4gKiBJZiBjbG9zZSBidXR0b24gaW4gdGhlIHRvcCByaWdodCBjb3JuZXIgaXMgY2xpY2tlZCwgdGhlIHJlc3VsdCB3aWxsIGJlICdjbG9zZWQnIChkZWZhdWx0IHJlc3VsdClcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBkaWFsb2cgY29uZmlndXJhdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gaW5pdGlhbGl6ZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB0byBpbml0aWFsaXplIHRoZSBkaWFsb2dcbiAqL1xuZnVuY3Rpb24gTUxEaWFsb2ckJGNyZWF0ZURpYWxvZyhvcHRpb25zLCBpbml0aWFsaXplKSB7XG4gICAgY2hlY2sob3B0aW9ucywge1xuICAgICAgICB0aXRsZTogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSxcbiAgICAgICAgaHRtbDogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSxcbiAgICAgICAgdGV4dDogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSxcbiAgICAgICAgY2xvc2U6IE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9uZU9mKEJvb2xlYW4sIHtcbiAgICAgICAgICAgIGJhY2tkcm9wOiBNYXRjaC5PcHRpb25hbChCb29sZWFuKSxcbiAgICAgICAgICAgIGtleWJvYXJkOiBNYXRjaC5PcHRpb25hbChCb29sZWFuKSxcbiAgICAgICAgICAgIGJ1dHRvbjogTWF0Y2guT3B0aW9uYWwoQm9vbGVhbilcbiAgICAgICAgfSkpLFxuICAgICAgICBidXR0b25zOiBNYXRjaC5PcHRpb25hbChbIHtcbiAgICAgICAgICAgIG5hbWU6IE1hdGNoLk9wdGlvbmFsKFN0cmluZyksXG4gICAgICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgICAgICBsYWJlbDogU3RyaW5nLFxuICAgICAgICAgICAgY2xvc2U6IE1hdGNoLk9wdGlvbmFsKEJvb2xlYW4pLFxuICAgICAgICAgICAgcmVzdWx0OiBNYXRjaC5PcHRpb25hbChTdHJpbmcpLFxuICAgICAgICAgICAgZGF0YTogTWF0Y2guT3B0aW9uYWwoTWF0Y2guQW55KSxcbiAgICAgICAgICAgIGNsczogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKVxuICAgICAgICB9IF0pLFxuICAgICAgICBjc3NDbGFzczogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKVxuICAgIH0pO1xuXG4gICAgdmFyIGRpYWxvZyA9IE1MRGlhbG9nLmNyZWF0ZU9uRWxlbWVudCgpO1xuXG4gICAgb3B0aW9ucyA9IF9wcmVwYXJlT3B0aW9ucyhvcHRpb25zKTtcbiAgICBkaWFsb2cuX2RpYWxvZyA9IHtcbiAgICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICB9O1xuXG4gICAgZGlhbG9nLnRlbXBsYXRlXG4gICAgICAgIC5yZW5kZXIob3B0aW9ucylcbiAgICAgICAgLmJpbmRlcigpO1xuXG4gICAgdmFyIGRpYWxvZ1Njb3BlID0gZGlhbG9nLmNvbnRhaW5lci5zY29wZTtcblxuICAgIGlmIChvcHRpb25zLmNsb3NlLmJhY2tkcm9wKVxuICAgICAgICBkaWFsb2cuZXZlbnRzLm9uKCdjbGljaycsXG4gICAgICAgICAgICB7IHN1YnNjcmliZXI6IF9vbkJhY2tkcm9wQ2xpY2ssIGNvbnRleHQ6IGRpYWxvZyB9KTtcblxuICAgIGlmIChvcHRpb25zLnRpdGxlICYmIG9wdGlvbnMuY2xvc2UuYnV0dG9uKVxuICAgICAgICBkaWFsb2dTY29wZS5jbG9zZUJ0bi5ldmVudHMub24oJ2NsaWNrJyxcbiAgICAgICAgICAgIHsgc3Vic2NyaWJlcjogX29uQ2xvc2VCdG5DbGljaywgY29udGV4dDogZGlhbG9nIH0pO1xuXG4gICAgb3B0aW9ucy5idXR0b25zLmZvckVhY2goZnVuY3Rpb24oYnRuKSB7XG4gICAgICAgIHZhciBidXR0b25TdWJzY3JpYmVyID0ge1xuICAgICAgICAgICAgc3Vic2NyaWJlcjogXy5wYXJ0aWFsKF9kaWFsb2dCdXR0b25DbGljaywgYnRuKSxcbiAgICAgICAgICAgIGNvbnRleHQ6IGRpYWxvZ1xuICAgICAgICB9O1xuICAgICAgICBkaWFsb2dTY29wZVtidG4ubmFtZV0uZXZlbnRzLm9uKCdjbGljaycsIGJ1dHRvblN1YnNjcmliZXIpO1xuICAgIH0pO1xuXG4gICAgaWYgKGluaXRpYWxpemUpIGluaXRpYWxpemUoZGlhbG9nKTtcbiAgICByZXR1cm4gZGlhbG9nO1xufVxuXG5cbmZ1bmN0aW9uIF9kaWFsb2dCdXR0b25DbGljayhidXR0b24pIHtcbiAgICBpZiAoYnV0dG9uLmNsb3NlICE9PSBmYWxzZSlcbiAgICAgICAgX3RvZ2dsZURpYWxvZy5jYWxsKHRoaXMsIGZhbHNlKTtcblxuICAgIHZhciBkYXRhID0gXy5yZXN1bHQoYnV0dG9uLmRhdGEsIHRoaXMsIGJ1dHRvbik7XG4gICAgX2Rpc3BhdGNoUmVzdWx0LmNhbGwodGhpcywgYnV0dG9uLnJlc3VsdCwgZGF0YSk7XG59XG5cblxuZnVuY3Rpb24gX2Rpc3BhdGNoUmVzdWx0KHJlc3VsdCwgZGF0YSkge1xuICAgIHZhciBzdWJzY3JpYmVyID0gdGhpcy5fZGlhbG9nLnN1YnNjcmliZXI7XG4gICAgaWYgKHR5cGVvZiBzdWJzY3JpYmVyID09ICdmdW5jdGlvbicpXG4gICAgICAgIHN1YnNjcmliZXIuY2FsbCh0aGlzLCByZXN1bHQsIGRhdGEpO1xuICAgIGVsc2VcbiAgICAgICAgc3Vic2NyaWJlci5zdWJzY3JpYmVyLmNhbGwoc3Vic2NyaWJlci5jb250ZXh0LCByZXN1bHQsIGRhdGEpO1xufVxuXG5cbmZ1bmN0aW9uIF9vbkJhY2tkcm9wQ2xpY2soZXZlbnRUeXBlLCBldmVudCkge1xuICAgIGlmIChldmVudC50YXJnZXQgPT0gdGhpcy5lbClcbiAgICAgICAgdGhpcy5jbG9zZURpYWxvZygnZGlzbWlzc2VkJyk7XG59XG5cblxuZnVuY3Rpb24gX29uQ2xvc2VCdG5DbGljaygpIHtcbiAgICB0aGlzLmNsb3NlRGlhbG9nKCdjbG9zZWQnKTtcbn1cblxuXG5mdW5jdGlvbiBfb25LZXlEb3duKGV2ZW50KSB7XG4gICAgaWYgKG9wZW5lZERpYWxvZ1xuICAgICAgICAgICAgJiYgb3BlbmVkRGlhbG9nLl9kaWFsb2cub3B0aW9ucy5jbG9zZS5rZXlib2FyZFxuICAgICAgICAgICAgJiYgZXZlbnQua2V5Q29kZSA9PSAyNykgLy8gZXNjIGtleVxuICAgICAgICBvcGVuZWREaWFsb2cuY2xvc2VEaWFsb2coJ2Rpc21pc3NlZCcpO1xufVxuXG5cbmZ1bmN0aW9uIF9wcmVwYXJlT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IF8uY2xvbmUob3B0aW9ucyk7XG4gICAgb3B0aW9ucy5idXR0b25zID0gXy5jbG9uZShvcHRpb25zLmJ1dHRvbnMgfHwgREVGQVVMVF9CVVRUT05TKTtcbiAgICBvcHRpb25zLmJ1dHRvbnMuZm9yRWFjaChmdW5jdGlvbihidG4pIHtcbiAgICAgICAgYnRuLm5hbWUgPSBidG4ubmFtZSB8fCBjb21wb25lbnROYW1lKCk7XG4gICAgfSk7XG5cbiAgICBvcHRpb25zLmNsb3NlID0gdHlwZW9mIG9wdGlvbnMuY2xvc2UgPT0gJ3VuZGVmaW5lZCcgfHwgb3B0aW9ucy5jbG9zZSA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBfLm9iamVjdChDTE9TRV9PUFRJT05TLCB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0eXBlb2Ygb3B0aW9ucy5jbG9zZSA9PSAnb2JqZWN0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXy5tYXBUb09iamVjdChDTE9TRV9PUFRJT05TLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihvcHQpIHsgcmV0dXJuIG9wdGlvbnMuY2xvc2Vbb3B0XSAhPT0gZmFsc2U7IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfLm9iamVjdChDTE9TRV9PUFRJT05TLCBmYWxzZSk7XG5cbiAgICByZXR1cm4gb3B0aW9ucztcbn1cblxuXG4vKipcbiAqIENyZWF0ZSBhbmQgc2hvdyBkaWFsb2cgcG9wdXBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBvYmplY3Qgd2l0aCB0aXRsZSwgdGV4dCBhbmQgYnV0dG9ucy4gU2VlIFtjcmVhdGVEaWFsb2ddKCNNTERpYWxvZyQkY3JlYXRlRGlhbG9nKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBzdWJzY3JpYmVyIG9wdGlvbmFsIHN1YnNjcmliZXIgZnVuY3Rpb24gb3Igb2JqZWN0IHRoYXQgaXMgcGFzc2VkIHJlc3VsdCBhbmQgb3B0aW9uYWwgZGF0YS4gVW5sZXNzIGNvbnRleHQgaXMgZGVmaW5lZCwgZGlhbG9nIHdpbGwgYmUgdGhlIGNvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIE1MRGlhbG9nJCRvcGVuRGlhbG9nKG9wdGlvbnMsIHN1YnNjcmliZXIsIGluaXRpYWxpemUpIHtcbiAgICB2YXIgZGlhbG9nID0gTUxEaWFsb2cuY3JlYXRlRGlhbG9nKG9wdGlvbnMsIGluaXRpYWxpemUpO1xuICAgIGRpYWxvZy5vcGVuRGlhbG9nKHN1YnNjcmliZXIpO1xuICAgIHJldHVybiBkaWFsb2c7XG59XG5cblxuXG5mdW5jdGlvbiBfdG9nZ2xlRGlhbG9nKGRvU2hvdykge1xuICAgIGRvU2hvdyA9IHR5cGVvZiBkb1Nob3cgPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/ICEgdGhpcy5fZGlhbG9nLnZpc2libGVcbiAgICAgICAgICAgICAgICA6ICEhIGRvU2hvdztcblxuICAgIHZhciBhZGRSZW1vdmUgPSBkb1Nob3cgPyAnYWRkJyA6ICdyZW1vdmUnXG4gICAgICAgICwgYXBwZW5kUmVtb3ZlID0gZG9TaG93ID8gJ2FwcGVuZENoaWxkJyA6ICdyZW1vdmVDaGlsZCc7XG5cbiAgICB0aGlzLl9kaWFsb2cudmlzaWJsZSA9IGRvU2hvdztcblxuICAgIGlmIChkb1Nob3cgJiYgISBkaWFsb2dzSW5pdGlhbGl6ZWQpXG4gICAgICAgIF9pbml0aWFsaXplRGlhbG9ncygpO1xuXG4gICAgZG9jdW1lbnQuYm9keVthcHBlbmRSZW1vdmVdKHRoaXMuZWwpO1xuICAgIGlmIChiYWNrZHJvcEVsKVxuICAgICAgICBkb2N1bWVudC5ib2R5W2FwcGVuZFJlbW92ZV0oYmFja2Ryb3BFbCk7XG4gICAgdGhpcy5kb20udG9nZ2xlKGRvU2hvdyk7XG4gICAgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgIWRvU2hvdyk7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3RbYWRkUmVtb3ZlXSgnbW9kYWwtb3BlbicpO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0W2FkZFJlbW92ZV0oJ2luJyk7XG5cbiAgICBvcGVuZWREaWFsb2cgPSBkb1Nob3cgPyB0aGlzIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuZWxbZG9TaG93ID8gJ2ZvY3VzJyA6ICdibHVyJ10oKTtcbn1cblxuXG52YXIgZGlhbG9nc0luaXRpYWxpemVkLCBiYWNrZHJvcEVsO1xuXG5mdW5jdGlvbiBfaW5pdGlhbGl6ZURpYWxvZ3MoKSB7XG4gICAgYmFja2Ryb3BFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGJhY2tkcm9wRWwuY2xhc3NOYW1lID0gJ21vZGFsLWJhY2tkcm9wIGZhZGUgaW4nO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBfb25LZXlEb3duKTtcbiAgICBkaWFsb2dzSW5pdGlhbGl6ZWQgPSB0cnVlO1xufVxuXG5cbnZhciBvcGVuZWREaWFsb2c7XG5cbi8qKlxuICogT3BlbnMgZGlhbG9nIGluc3RhbmNlLlxuICogU3Vic2NyaWJlciBvYmplY3Qgc2hvdWxkIGhhdmUgdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBzdWJzY3JpYmVyIGZvciB0aGUgTWVzc2VuZ2VyIChhbHRob3VnaCBNZXNzZW5nZXIgaXMgbm90IHVzZWQpIC0gZWl0aGVyIGZ1bmN0aW9uIG9yIG9iamVjdCB3aXRoIHN1YnNjcmliZXIgYW5kIGNvbnRleHQgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdH0gc3Vic2NyaWJlciBzdWJzY3JpYmVyIG9iamVjdFxuICovXG5mdW5jdGlvbiBNTERpYWxvZyRvcGVuRGlhbG9nKHN1YnNjcmliZXIpIHtcbiAgICBjaGVjayhzdWJzY3JpYmVyLCBNYXRjaC5PbmVPZihGdW5jdGlvbiwgeyBzdWJzY3JpYmVyOiBGdW5jdGlvbiwgY29udGV4dDogTWF0Y2guQW55IH0pKTtcblxuICAgIGlmIChvcGVuZWREaWFsb2cpXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignTUxEaWFsb2cgb3BlbkRpYWxvZzogY2FuXFwndCBvcGVuIGRpYWxvZywgYW5vdGhlciBkaWFsb2cgaXMgYWxyZWFkeSBvcGVuJyk7XG5cbiAgICB0aGlzLl9kaWFsb2cuc3Vic2NyaWJlciA9IHN1YnNjcmliZXI7XG4gICAgX3RvZ2dsZURpYWxvZy5jYWxsKHRoaXMsIHRydWUpO1xufVxuXG5cbi8qKlxuICogQ2xvc2VzIGRpYWxvZyBpbnN0YW5jZSwgb3B0aW9uYWxseSBwYXNzaW5nIHJlc3VsdCBhbmQgZGF0YSB0byBkaWFsb2cgc3Vic2NyaWJlci5cbiAqIElmIG5vIHJlc3VsdCBpcyBwYXNzZWQsICdjbG9zZWQnIHdpbGwgYmUgcGFzc2VkIHRvIHN1YnNjcmliZXIuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHJlc3VsdCBkaWFsb2cgcmVzdWx0LCBwYXNzZWQgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciB0byBzdWJjc3JpYmVyXG4gKiBAcGFyYW0ge0FueX0gZGF0YSBvcHRpb25hbCBkaWFsb2cgZGF0YSwgcGFzc2VkIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyIHRvIHN1YnNjcmliZXJcbiAqL1xuZnVuY3Rpb24gTUxEaWFsb2ckY2xvc2VEaWFsb2cocmVzdWx0LCBkYXRhKSB7XG4gICAgaWYgKCEgb3BlbmVkRGlhbG9nKVxuICAgICAgICByZXR1cm4gbG9nZ2VyLndhcm4oJ01MRGlhbG9nIGNsb3NlRGlhbG9nOiBjYW5cXCd0IGNsb3NlIGRpYWxvZywgbm8gZGlhbG9nIG9wZW4nKTtcblxuICAgIHJlc3VsdCA9IHJlc3VsdCB8fCAnY2xvc2VkJztcblxuICAgIF90b2dnbGVEaWFsb2cuY2FsbCh0aGlzLCBmYWxzZSk7XG4gICAgX2Rpc3BhdGNoUmVzdWx0LmNhbGwodGhpcywgcmVzdWx0LCBkYXRhKTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgY3VycmVudGx5IG9wZW5lZCBkaWFsb2dcbiAqXG4gKiBAcmV0dXJuIHtNTERpYWxvZ31cbiAqL1xuZnVuY3Rpb24gTUxEaWFsb2ckJGdldE9wZW5lZERpYWxvZygpIHtcbiAgICByZXR1cm4gb3BlbmVkRGlhbG9nO1xufVxuXG5cbmZ1bmN0aW9uIE1MRGlhbG9nJGRlc3Ryb3koKSB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIF9vbktleURvd24pO1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi8uLi9jX3JlZ2lzdHJ5JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXJcbiAgICAsIERPTUxpc3RlbmVycyA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWwvZG9tX2xpc3RlbmVycycpO1xuXG5cbnZhciBUT0dHTEVfQ1NTX0NMQVNTID0gJ2Ryb3Bkb3duLXRvZ2dsZSdcbiAgICAsIE1FTlVfQ1NTX0NMQVNTID0gJ2Ryb3Bkb3duLW1lbnUnO1xuXG5cbnZhciBNTERyb3Bkb3duID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTERyb3Bkb3duJywge1xuICAgIGV2ZW50czogdW5kZWZpbmVkLFxuICAgIGRvbToge1xuICAgICAgICBjbHM6IFsnbWwtYnMtZHJvcGRvd24nLCAnZHJvcGRvd24nXVxuICAgIH1cbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MRHJvcGRvd24pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MRHJvcGRvd247XG5cblxuXy5leHRlbmRQcm90byhNTERyb3Bkb3duLCB7XG4gICAgc3RhcnQ6IE1MRHJvcGRvd24kc3RhcnQsXG4gICAgZGVzdHJveTogTUxEcm9wZG93biRkZXN0cm95LFxuICAgIHRvZ2dsZU1lbnU6IE1MRHJvcGRvd24kdG9nZ2xlTWVudSxcbiAgICBzaG93TWVudTogTUxEcm9wZG93biRzaG93TWVudSxcbiAgICBoaWRlTWVudTogTUxEcm9wZG93biRoaWRlTWVudVxufSk7XG5cblxuZnVuY3Rpb24gTUxEcm9wZG93biRzdGFydCgpIHtcbiAgICB2YXIgdG9nZ2xlRWwgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy4nICsgVE9HR0xFX0NTU19DTEFTUylcbiAgICAgICAgLCBtZW51RWwgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy4nICsgTUVOVV9DU1NfQ0xBU1MpO1xuXG4gICAgaWYgKCEgKHRvZ2dsZUVsICYmIG1lbnVFbCkpXG4gICAgICAgIHJldHVybiBsb2dnZXIuZXJyb3IoJ01MRHJvcGRvd246JywgVE9HR0xFX0NTU19DTEFTUywgJ29yJywgTUVOVV9DU1NfQ0xBU1MsICdpc25cXCd0IGZvdW5kJyk7XG5cbiAgICB2YXIgZG9jID0gd2luZG93LmRvY3VtZW50XG4gICAgICAgICwgY2xpY2tIYW5kbGVyID0gdGhpcy50b2dnbGVNZW51LmJpbmQodGhpcywgdW5kZWZpbmVkKTtcblxuICAgIHZhciBsaXN0ZW5lcnMgPSBuZXcgRE9NTGlzdGVuZXJzO1xuICAgIHRoaXMuX2Ryb3Bkb3duID0ge1xuICAgICAgICBtZW51OiBtZW51RWwsXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH07XG4gICAgdGhpcy5oaWRlTWVudSgpO1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGxpc3RlbmVycy5hZGQodG9nZ2xlRWwsICdjbGljaycsIGNsaWNrSGFuZGxlcik7XG4gICAgLy9tYXliZSBvbmx5IGFkZCB0aGlzIGV2ZW50cyBpZiBpcyBvcGVuP1xuICAgIGxpc3RlbmVycy5hZGQoZG9jLCAnbW91c2VvdXQnLCBvbkRvY091dCk7XG4gICAgbGlzdGVuZXJzLmFkZChkb2MsICdjbGljaycsIG9uQ2xpY2spO1xuXG5cbiAgICBmdW5jdGlvbiBvbkRvY091dChldmVudCkge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0XG4gICAgICAgICAgICAsIHJlbGF0ZWRUYXJnZXQgPSBldmVudC5yZWxhdGVkVGFyZ2V0XG4gICAgICAgICAgICAsIGxpc3RlbmVycyA9IHNlbGYuX2Ryb3Bkb3duLmxpc3RlbmVycztcblxuICAgICAgICBpZiAoaXNJZnJhbWUodGFyZ2V0KSlcbiAgICAgICAgICAgIGxpc3RlbmVycy5yZW1vdmUodGFyZ2V0LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQsICdjbGljaycsIG9uQ2xpY2spO1xuXG4gICAgICAgIGlmIChpc0lmcmFtZShyZWxhdGVkVGFyZ2V0KSlcbiAgICAgICAgICAgIGxpc3RlbmVycy5hZGQocmVsYXRlZFRhcmdldC5jb250ZW50V2luZG93LmRvY3VtZW50LCAnY2xpY2snLCBvbkNsaWNrKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbkNsaWNrKGV2ZW50KSB7XG4gICAgICAgIGlmICghc2VsZi5lbC5jb250YWlucyhldmVudC50YXJnZXQpKVxuICAgICAgICAgICAgc2VsZi5oaWRlTWVudSgpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBpc0lmcmFtZShlbCkge1xuICAgIHJldHVybiBlbCAmJiBlbC50YWdOYW1lID09ICdJRlJBTUUnO1xufVxuXG5cbmZ1bmN0aW9uIE1MRHJvcGRvd24kZGVzdHJveSgpIHtcbiAgICB0aGlzLl9kcm9wZG93bi5saXN0ZW5lcnMucmVtb3ZlQWxsKCk7XG4gICAgZGVsZXRlIHRoaXMuX2Ryb3Bkb3duO1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5cbmZ1bmN0aW9uIE1MRHJvcGRvd24kc2hvd01lbnUoKSB7XG4gICAgdGhpcy50b2dnbGVNZW51KHRydWUpO1xufVxuXG5cbmZ1bmN0aW9uIE1MRHJvcGRvd24kaGlkZU1lbnUoKSB7XG4gICAgdGhpcy50b2dnbGVNZW51KGZhbHNlKTtcbn1cblxuXG5mdW5jdGlvbiBNTERyb3Bkb3duJHRvZ2dsZU1lbnUoZG9TaG93KSB7XG4gICAgZG9TaG93ID0gdHlwZW9mIGRvU2hvdyA9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgID8gISB0aGlzLl9kcm9wZG93bi52aXNpYmxlXG4gICAgICAgICAgICAgICAgOiAhISBkb1Nob3c7XG5cbiAgICB0aGlzLl9kcm9wZG93bi52aXNpYmxlID0gZG9TaG93O1xuXG4gICAgdmFyIG1lbnUgPSB0aGlzLl9kcm9wZG93bi5tZW51O1xuICAgIG1lbnUuc3R5bGUuZGlzcGxheSA9IGRvU2hvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2Jsb2NrJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ25vbmUnO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbi8vIDxhIG5hbWU9XCJjb25maWdcIj48L2E+XG4vLyBtaWxvLmNvbmZpZ1xuLy8gLS0tLS0tLS0tLS1cblxuLy8gSXQgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgYWxsb3dzIHRvIGNoYW5nZSBtaWxvIGNvbmZpZ3VyYXRpb25zIGFuZCBhbHNvXG4vLyBhY2Nlc3MgdGhlbSBvbiBjb25maWcncyBwcm9wZXJ0aWVzLlxuXG4vLyBgYGBqYXZhc2NyaXB0XG4vLyBtaWxvLmNvbmZpZyh7XG4vLyAgICAgYXR0cnM6IHtcbi8vICAgICAgICAgYmluZDogJ21sLWJpbmQnLFxuLy8gICAgICAgICBsb2FkOiAnbWwtbG9hZCdcbi8vICAgICB9XG4vLyB9KTtcbi8vIGBgYFxuXG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGRvVCA9IG1pbG9Db3JlLnV0aWwuZG9UO1xuXG5cbnZhciBjb25maWcgPSBtb2R1bGUuZXhwb3J0cyA9IG1pbG9Db3JlLmNvbmZpZztcblxuXG5jb25maWcoe1xuICAgIGF0dHJzOiB7XG4gICAgICAgIGJpbmQ6ICdtbC1iaW5kJyxcbiAgICAgICAgbG9hZDogJ21sLWxvYWQnXG4gICAgfSxcbiAgICBjb21wb25lbnRSZWY6ICdfX19taWxvX2NvbXBvbmVudCcsXG4gICAgY29tcG9uZW50UHJlZml4OiAnbWlsb18nLFxuICAgIHRlbXBsYXRlOiB7XG4gICAgICAgIGNvbXBpbGU6IGRvVC5jb21waWxlXG4gICAgfSxcbiAgICBkb21TdG9yYWdlOiB7XG4gICAgICAgIHR5cGVTdWZmaXg6ICc6X19fbWlsb19kYXRhX3R5cGUnLFxuICAgICAgICBwcmVmaXhTZXBhcmF0b3I6ICcvJyxcbiAgICAgICAgcm9vdDogJycsXG4gICAgICAgIG1lc3NhZ2VLZXk6ICdfX19taWxvX21lc3NhZ2UvJyxcbiAgICAgICAgbWVzc2FnZVRpbWVzdGFtcDogJ19fX21pbG9fdGltZXN0YW1wJyxcbiAgICAgICAgcXVvdGFFeGNlZWRlZDoge1xuICAgICAgICAgICAgdGhyb3dFcnJvcjogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGZhbHNlXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGRyYWdEcm9wOiB7XG4gICAgICAgIGRhdGFUeXBlczoge1xuICAgICAgICAgICAgY29tcG9uZW50OiAneC1hcHBsaWNhdGlvbi9taWxvL2NvbXBvbmVudCcsXG4gICAgICAgICAgICBjb21wb25lbnRNZXRhVGVtcGxhdGU6ICd4LWFwcGxpY2F0aW9uL21pbG8vY29tcG9uZW50LW1ldGEvJWNsYXNzLyVuYW1lLyVwYXJhbXMnLFxuICAgICAgICAgICAgY29tcG9uZW50TWV0YVJlZ2V4OiAvXnhcXC1hcHBsaWNhdGlvblxcL21pbG9cXC9jb21wb25lbnRcXC1tZXRhXFwvKFthLXowLTldKylcXC8oW2EtejAtOV0rKVxcLyhbYS16MC05XSopJC8sXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJlcXVlc3Q6IHtcbiAgICAgICAganNvbnBUaW1lb3V0OiA2MDAwMCxcbiAgICAgICAganNvbnBDYWxsYmFja1ByZWZpeDogJ19fX21pbG9fY2FsbGJhY2tfJyxcbiAgICAgICAgb3B0aW9uc0tleTogJ19fX21pbG9fb3B0aW9ucycsXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICB0aW1lb3V0OiA2MDAwMFxuICAgICAgICB9XG4gICAgfSxcbiAgICB3ZWJzb2NrZXQ6IHtcbiAgICAgICAgcnBjOiB7XG4gICAgICAgICAgICB0aW1lb3V0OiAxNTAwMCxcbiAgICAgICAgICAgIHJlc3BvbnNlUHJlZml4OiAncmVzcG9uc2VfJ1xuICAgICAgICB9XG4gICAgfSxcbiAgICBkZXByZWNhdGlvbldhcm5pbmc6ICdvbmNlJ1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1pbG9NYWlsID0gcmVxdWlyZSgnLi9zZXJ2aWNlcy9tYWlsJylcbiAgICAsIHJlcXVlc3QgPSByZXF1aXJlKCcuL3V0aWwvcmVxdWVzdCcpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCB1dGlsRG9tID0gcmVxdWlyZSgnLi91dGlsL2RvbScpXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuL2NvbmZpZycpXG4gICAgLCBMb2FkQXR0cmlidXRlID0gcmVxdWlyZSgnLi9hdHRyaWJ1dGVzL2FfbG9hZCcpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gbG9hZGVyO1xuXG4vKipcbiAqIGBtaWxvLmxvYWRlcmBcbiAqIFxuICogUmVjdXJzaXZlbHkgc2NhbnMgdGhlIGRvY3VtZW50IHRyZWUgaW5zaWRlIGByb290RWxgIChkb2N1bWVudC5ib2R5IGJ5IGRlZmF1bHQpIGxvb2tpbmcgZm9yIF9fbWwtbG9hZF9fIEBhdHRyaWJ1dGUuXG4gKiBPbmUgbGV2ZWwgbG9hZCBpcyBleGVjdXRlZC4gTm8gYWRkaXRpb25hbCBsb2FkZXIgZ2V0IGNhbGxlZCBvbiBpbnNpZGUgX19tbC1sb2FkX18gYXR0cmlidXRlcy4gXG4gKlxuICogUG9zc2libGUgdXNhZ2VzOlxuICogLSBtaWxvLmxvYWRlcihbbXlSb290RWwsXVtteVJlbW92ZUF0dHJpYnV0ZSxdbXlDYWxsYmFjaylcbiAqIFxuICogQHBhcmFtICB7RWxlbWVudH0gIHJvb3RFbCAgICAgICAgICBSb290IGVsZW1lbnQgaW5zaWRlIHdoaWNoIERPTSB3aWxsIGJlIHNjYW5uZWQgKGRvY3VtZW50LmJvZHkgYnkgZGVmYXVsdCkuXG4gKiBAcGFyYW0gIHtCb29sZWFufSAgcmVtb3ZlQXR0cmlidXRlIElmIHNldCB0byB0cnVlLCB0aGVuIHRoZSBfX21sLWxvYWRfXyBhdHRyaWJ1dGUgd2lsbCBiZSByZW1vdmVkIG9uY2UgbG9hZGVyIGhhcyBiZWVuIGV4ZWN1dGVkIChGYWxzZSBieSBkZWZhdWx0KS5cbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjYWxsYmFjayAgICAgICAgQ2FsbGJhY2sgdG8gY2FsbCBhZnRlciBhbGwgZWxlbWVudHMgZ2V0IGxvYWRlZCAoUmVxdWlyZWQpLlxuICovXG5mdW5jdGlvbiBsb2FkZXIocm9vdEVsLCByZW1vdmVBdHRyaWJ1dGUsIGNhbGxiYWNrKSB7XG4gICAgbWlsbyhmdW5jdGlvbigpIHtcbiAgICAgICAgX2xvYWRlcihyb290RWwsIHJlbW92ZUF0dHJpYnV0ZSwgY2FsbGJhY2spO1xuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIF9sb2FkZXIocm9vdEVsLCByZW1vdmVBdHRyaWJ1dGUsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiByb290RWwgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYWxsYmFjayA9IHJvb3RFbDtcbiAgICAgICAgcm9vdEVsID0gdW5kZWZpbmVkO1xuICAgICAgICByZW1vdmVBdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJlbW92ZUF0dHJpYnV0ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNhbGxiYWNrID0gcmVtb3ZlQXR0cmlidXRlO1xuICAgICAgICByZW1vdmVBdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByb290RWwgPSByb290RWwgfHwgZG9jdW1lbnQuYm9keTtcblxuICAgIG1pbG9NYWlsLnBvc3RNZXNzYWdlKCdsb2FkZXInLCB7IHN0YXRlOiAnc3RhcnRlZCcgfSk7XG4gICAgX2xvYWRWaWV3c0luRWxlbWVudChyb290RWwsIHJlbW92ZUF0dHJpYnV0ZSwgZnVuY3Rpb24odmlld3MpIHtcbiAgICAgICAgbWlsb01haWwucG9zdE1lc3NhZ2UoJ2xvYWRlcicsIHsgXG4gICAgICAgICAgICBzdGF0ZTogJ2ZpbmlzaGVkJyxcbiAgICAgICAgICAgIHZpZXdzOiB2aWV3c1xuICAgICAgICB9KTtcbiAgICAgICAgY2FsbGJhY2sodmlld3MpO1xuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIF9sb2FkVmlld3NJbkVsZW1lbnQocm9vdEVsLCByZW1vdmVBdHRyaWJ1dGUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGxvYWRFbGVtZW50cyA9IHJvb3RFbC5nZXRBdHRyaWJ1dGUoY29uZmlnLmF0dHJzLmxvYWQpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFtyb290RWxdXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHJvb3RFbC5xdWVyeVNlbGVjdG9yQWxsKCdbJyArIGNvbmZpZy5hdHRycy5sb2FkICsgJ10nKTtcblxuICAgIHZhciB2aWV3cyA9IHt9XG4gICAgICAgICwgdG90YWxDb3VudCA9IGxvYWRFbGVtZW50cy5sZW5ndGhcbiAgICAgICAgLCBsb2FkZWRDb3VudCA9IDA7XG5cbiAgICBfLmZvckVhY2gobG9hZEVsZW1lbnRzLCBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgbG9hZFZpZXcoZWwsIHJlbW92ZUF0dHJpYnV0ZSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICB2aWV3c1tlbC5pZF0gPSBlcnIgfHwgZWw7XG4gICAgICAgICAgICBsb2FkZWRDb3VudCsrO1xuICAgICAgICAgICAgaWYgKGxvYWRlZENvdW50ID09IHRvdGFsQ291bnQpXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sodmlld3MpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cblxuZnVuY3Rpb24gbG9hZFZpZXcoZWwsIHJlbW92ZUF0dHJpYnV0ZSwgY2FsbGJhY2spIHtcbiAgICBpZiAodXRpbERvbS5jaGlsZHJlbihlbCkubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhblxcJ3QgbG9hZCBodG1sIGludG8gZWxlbWVudCB0aGF0IGlzIG5vdCBlbXB0eScpO1xuXG4gICAgdmFyIGF0dHIgPSBuZXcgTG9hZEF0dHJpYnV0ZShlbCk7XG5cbiAgICBhdHRyLnBhcnNlKCkudmFsaWRhdGUoKTtcblxuICAgIHJlcXVlc3QuZ2V0KGF0dHIubG9hZFVybCwgZnVuY3Rpb24oZXJyLCBodG1sKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIGVyci5tZXNzYWdlID0gZXJyLm1lc3NhZ2UgfHwgJ2NhblxcJ3QgbG9hZCBmaWxlICcgKyBhdHRyLmxvYWRVcmw7XG4gICAgICAgICAgICAvLyBsb2dnZXIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIGlmIChyZW1vdmVBdHRyaWJ1dGUpIExvYWRBdHRyaWJ1dGUucmVtb3ZlKGVsKTtcbiAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxuLy8gcmVnaXN0ZXIgaW5jbHVkZWQgZmFjZXRzXG5yZXF1aXJlKCcuL3VzZV9mYWNldHMnKTtcblxuLy8gcmVnaXN0ZXIgaW5jbHVkZWQgY29tcG9uZW50c1xucmVxdWlyZSgnLi91c2VfY29tcG9uZW50cycpO1xuXG5cbi8qKlxuICogYG1pbG9gXG4gKlxuICogQSBtaW5pbWFsaXN0IGJyb3dzZXIgZnJhbWV3b3JrIHRoYXQgYmluZHMgRE9NIGVsZW1lbnRzIHRvIEpTIGNvbXBvbmVudHMgYW5kIGNvbXBvbmVudHMgdG8gbW9kZWxzLlxuICpcbiAqIGBtaWxvYCBpcyBhdmFpbGFibGUgYXMgZ2xvYmFsIG9iamVjdCBpbiB0aGUgYnJvd3Nlci5cbiAqIEF0IHRoZSBtb21lbnQgaXQgaXMgbm90IHBvc3NpaWJsZSB0byByZXF1aXJlIGl0IHdpdGggYnJvd3NlcmlmeSB0byBoYXZlIGl0IGJ1bmRsZWQgd2l0aCB0aGUgYXBwIGJlY2F1c2Ugb2YgdGhlIHdheSBbYnJmc10oaHR0cHM6Ly9naXRodWIuY29tL3N1YnN0YWNrL2JyZnMpIGJyb3dzZXJpZnkgcGx1Z2luIGlzIGltcGxlbWVudGVkLlxuICogSXQgaXMgcG9zc2libGUgdGhvdWdoIHRvIHJlcXVpcmUgYG1pbG9gIHdpdGggbm9kZSB0byB1c2UgdW5pdmVyc2FsIHBhcnRzIG9mIHRoZSBmcmFtZXdvcmsgKGFic3RyYWN0IGNsYXNzZXMsIE1lc3NlbmdlciwgTW9kZWwsIGV0Yy4pOlxuICogYGBgXG4gKiB2YXIgbWlsbyA9IHJlcXVpcmUoJ21pbG9qcycpO1xuICogYGBgXG4gKiBcbiAqIGBtaWxvYCBpdHNlbGYgaXMgYSBmdW5jdGlvbiB0aGF0IGluIHRoZSBicm93c2VyIGNhbiBiZSB1c2VkIHRvIGRlbGF5IGV4ZWN1dGlvbiB1bnRpbCBET00gaXMgcmVhZHkuXG4gKi9cbmZ1bmN0aW9uIG1pbG8oZnVuYykge1xuICAgIG1pbG8udXRpbC5kb21SZWFkeShmdW5jKTtcbn1cblxuXG4vKipcbiAqICMjIyNNaWxvIHBhY2thZ2VzIyMjI1xuICpcbiAqIC0gW2xvYWRlcl0oLi9sb2FkZXIuanMuaHRtbCkgLSBsb2FkaW5nIHN1YnZpZXdzIGludG8gcGFnZVxuICogLSBbYmluZGVyXSguL2JpbmRlci5qcy5odG1sKSAtIGNvbXBvbmVudHMgaW5zdGFudGlhdGlvbiBhbmQgYmluZGluZyBvZiBET00gZWxlbWVudHMgdG8gdGhlbVxuICogLSBbbWluZGVyXSguL21pbmRlci5qcy5odG1sKSAtIGRhdGEgcmVhY3Rpdml0eSwgb25lIG9yIHR3byB3YXksIHNoYWxsb3cgb3IgZGVlcCwgYXMgeW91IGxpa2UgaXRcbiAqIC0gW21haWxdKC4vbWFpbC9pbmRleC5qcy5odG1sKSAtIGFwcGxpY2FpdG9uIGxldmVsIG1lc3NlbmdlciwgYWxzbyBjb25uZWN0cyB0byBtZXNzYWdlcyBmcm9tIG90aGVyIHdpbmRvd3MgZGlzcGF0Y2hlZCB3aXRoIGB3aW5kb3cucG9zdE1lc3NhZ2VgLlxuICogLSBbY29uZmlnXSguL2NvbmZpZy5qcy5odG1sKSAtIG1pbG8gY29uZmlndXJhdGlvblxuICogLSBbdXRpbF0oLi91dGlsL2luZGV4LmpzLmh0bWwpIC0gbG9nZ2VyLCByZXF1ZXN0LCBkb20sIGNoZWNrLCBlcnJvciwgZXRjLlxuICogLSBbY2xhc3Nlc10oLi9jbGFzc2VzLmpzLmh0bWwpIC0gYWJzdHJhY3QgYW5kIGJhc2UgY2xhc3Nlc1xuICogLSBbYXR0cmlidXRlc10oLi9hdHRyaWJ1dGVzL2luZGV4LmpzLmh0bWwpIC0gY2xhc3NlcyB0aGF0IHdyYXAgRE9NIGVsZW1lbnRzIGF0dHJpYnV0ZXMgcmVjb2duaXplZCBieSBtaWxvXG4gKiAtIFtDb21wb25lbnRGYWNldF0oLi9jb21wb25lbnRzL2NfZmFjZXQuanMuaHRtbCkgLSBiYXNlIGNsYXNzIG9mIENvbXBvbmVudCBmYWNldFxuICogLSBbQ29tcG9uZW50XSguL2NvbXBvbmVudHMvY19jbGFzcy5qcy5odG1sKSAtIGJhc2UgQ29tcG9uZW50IGNsYXNzXG4gKiAtIFtNZXNzZW5nZXJdKC4vbWVzc2VuZ2VyL2luZGV4LmpzLmh0bWwpIC0gZ2VuZXJpYyBNZXNzZW5nZXIgdXNlZCBpbiBtb3N0IG90aGVyIG1pbG8gY2xhc3NlcywgY2FuIGJlIG1peGVkIGludG8gYXBwIGNsYXNzZXMgdG9vLlxuICogLSBbTW9kZWxdKC4vbW9kZWwvaW5kZXguanMuaHRtbCkgLSBNb2RlbCBjbGFzcyB0aGF0IGVtaXRzIG1lc3NhZ2VzIG9uIGNoYW5nZXMgdG8gYW55IGRlcHRoIHdpdGhvdXQgdGltZXIgYmFzZWQgd2F0Y2hpbmdcbiAqIC0gW3JlZ2lzdHJ5XSguL3JlZ2lzdHJ5LmpzLmh0bWwpIC0gcmVnaXN0cmllcyBvZiBmYXNldHMgYW5kIGNvbXBvbmVudHMgY2xhc3Nlc1xuICovXG5fLmV4dGVuZChtaWxvLCB7XG4gICAgTWVzc2VuZ2VyOiBtaWxvQ29yZS5NZXNzZW5nZXIsXG4gICAgTW9kZWw6IG1pbG9Db3JlLk1vZGVsLFxuICAgIG1pbmRlcjogbWlsb0NvcmUubWluZGVyLFxuICAgIGxvYWRlcjogcmVxdWlyZSgnLi9sb2FkZXInKSxcbiAgICBiaW5kZXI6IHJlcXVpcmUoJy4vYmluZGVyJyksXG4gICAgbWFpbDogcmVxdWlyZSgnLi9zZXJ2aWNlcy9tYWlsJyksXG4gICAgd2luZG93OiByZXF1aXJlKCcuL3NlcnZpY2VzL3dpbmRvdycpLFxuICAgIGNvbmZpZzogcmVxdWlyZSgnLi9jb25maWcnKSxcbiAgICB1dGlsOiByZXF1aXJlKCcuL3V0aWwnKSxcbiAgICBjbGFzc2VzOiByZXF1aXJlKCcuL2NsYXNzZXMnKSxcbiAgICBhdHRyaWJ1dGVzOiByZXF1aXJlKCcuL2F0dHJpYnV0ZXMnKSxcbiAgICBDb21wb25lbnRGYWNldDogcmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXQnKSxcbiAgICBDb21wb25lbnQ6IHJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2NsYXNzJyksXG4gICAgQ29tbWFuZDogcmVxdWlyZSgnLi9jb21tYW5kJyksXG4gICAgcmVnaXN0cnk6IHJlcXVpcmUoJy4vcmVnaXN0cnknKSxcbiAgICBtaWxvX3ZlcnNpb246ICcwLjIuNScsXG4gICAgY3JlYXRlQ29tcG9uZW50Q2xhc3M6IHJlcXVpcmUoJy4vdXRpbC9jcmVhdGVfY29tcG9uZW50X2NsYXNzJyksXG4gICAgZGVzdHJveTogZGVzdHJveVxufSk7XG5cblxuLy8gZXhwb3J0IGZvciBub2RlL2Jyb3dzZXJpZnlcbmlmICh0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSAgICBcbiAgICBtb2R1bGUuZXhwb3J0cyA9IG1pbG87XG5cbi8vIGdsb2JhbCBtaWxvIGZvciBicm93c2VyXG5pZiAodHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0Jykge1xuICAgIHdpbmRvdy5taWxvID0gbWlsbztcbiAgICBtaWxvLm1haWwudHJpZ2dlcignbWlsb3JlYWR5Jyk7XG59XG5cblxuZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICBtaWxvQ29yZS5kZXN0cm95KCk7XG4gICAgbWlsby5tYWlsLmRlc3Ryb3koKTtcbiAgICBtaWxvLndpbmRvdy5kZXN0cm95KCk7XG4gICAgbWlsby51dGlsLmRlc3Ryb3koKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBSZWdpc3RyaWVzIG9mIGZhY2V0cyBhbmQgb2YgY29tcG9uZW50c1xuICpcbiAqIC0gW2ZhY2V0c10oLi9jb21wb25lbnRzL2NfZmFjZXRzL2NmX3JlZ2lzdHJ5LmpzLmh0bWwpXG4gKiAtIFtjb21wb25lbnRzXSguL2NvbXBvbmVudHMvY19yZWdpc3RyeS5qcy5odG1sKVxuICovXG52YXIgcmVnaXN0cnkgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBmYWNldHM6IHJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9jZl9yZWdpc3RyeScpLFxuICAgIGNvbXBvbmVudHM6IHJlcXVpcmUoJy4vY29tcG9uZW50cy9jX3JlZ2lzdHJ5JyksXG4gICAgY29tbWFuZHM6IHJlcXVpcmUoJy4vY29tbWFuZC9jbWRfcmVnaXN0cnknKVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gPGEgbmFtZT1cImNvbXBvbmVudHMtZG9tLWNvbnN0cnVjdG9yc1wiPjwvYT5cbi8vICMjI2RvbSBldmVudHMgY29uc3RydWN0b3JzXG5cblxudmFyIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9SZWZlcmVuY2UvRXZlbnRzXG5cbnZhciBldmVudFR5cGVzID0ge1xuICAgIENsaXBib2FyZEV2ZW50OiBbJ2NvcHknLCAnY3V0JywgJ3Bhc3RlJywgJ2JlZm9yZWNvcHknLCAnYmVmb3JlY3V0JywgJ2JlZm9yZXBhc3RlJ10sXG4gICAgRXZlbnQ6IFsnaW5wdXQnLCAncmVhZHlzdGF0ZWNoYW5nZSddLFxuICAgIEZvY3VzRXZlbnQ6IFsnZm9jdXMnLCAnYmx1cicsICdmb2N1c2luJywgJ2ZvY3Vzb3V0J10sXG4gICAgS2V5Ym9hcmRFdmVudDogWydrZXlkb3duJywgJ2tleXByZXNzJywgICdrZXl1cCddLFxuICAgIE1vdXNlRXZlbnQ6IFsnY2xpY2snLCAnY29udGV4dG1lbnUnLCAnZGJsY2xpY2snLCAnbW91c2Vkb3duJywgJ21vdXNldXAnLFxuICAgICAgICAgICAgICAgICAnbW91c2VlbnRlcicsICdtb3VzZWxlYXZlJywgJ21vdXNlbW92ZScsICdtb3VzZW91dCcsICdtb3VzZW92ZXInLFxuICAgICAgICAgICAgICAgICAnc2hvdycgLyogY29udGV4dCBtZW51ICovXSxcbiAgICBUb3VjaEV2ZW50OiBbJ3RvdWNoc3RhcnQnLCAndG91Y2hlbmQnLCAndG91Y2htb3ZlJywgJ3RvdWNoZW50ZXInLCAndG91Y2hsZWF2ZScsICd0b3VjaGNhbmNlbCddLFxufTtcblxuXG4vLyBtb2NrIHdpbmRvdyBhbmQgZXZlbnQgY29uc3RydWN0b3JzIGZvciB0ZXN0aW5nXG5pZiAodHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJylcbiAgICB2YXIgZ2xvYmFsID0gd2luZG93O1xuZWxzZSB7XG4gICAgZ2xvYmFsID0ge307XG4gICAgXy5lYWNoS2V5KGV2ZW50VHlwZXMsIGZ1bmN0aW9uKGVUeXBlcywgZXZlbnRDb25zdHJ1Y3Rvck5hbWUpIHtcbiAgICAgICAgdmFyIGV2ZW50Q29uc3RydWN0b3IgPSBfLm1ha2VGdW5jdGlvbihldmVudENvbnN0cnVjdG9yTmFtZSwgJ3R5cGUnLCAncHJvcGVydGllcycsXG4gICAgICAgICAgICAndGhpcy50eXBlID0gdHlwZTsgXy5leHRlbmQodGhpcywgcHJvcGVydGllcyk7Jyk7XG4gICAgICAgIGdsb2JhbFtldmVudENvbnN0cnVjdG9yTmFtZV0gPSBldmVudENvbnN0cnVjdG9yO1xuICAgIH0pO1xufVxuXG5cbnZhciBkb21FdmVudHNDb25zdHJ1Y3RvcnMgPSB7fTtcblxuXy5lYWNoS2V5KGV2ZW50VHlwZXMsIGZ1bmN0aW9uKGVUeXBlcywgZXZlbnRDb25zdHJ1Y3Rvck5hbWUpIHtcbiAgICBlVHlwZXMuZm9yRWFjaChmdW5jdGlvbih0eXBlKSB7XG4gICAgICAgIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkoZG9tRXZlbnRzQ29uc3RydWN0b3JzLCB0eXBlKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZHVwbGljYXRlIGV2ZW50IHR5cGUgJyArIHR5cGUpO1xuXG4gICAgICAgIGRvbUV2ZW50c0NvbnN0cnVjdG9yc1t0eXBlXSA9IGdsb2JhbFtldmVudENvbnN0cnVjdG9yTmFtZV07XG4gICAgfSk7XG59KTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGRvbUV2ZW50c0NvbnN0cnVjdG9ycztcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2FnZVNvdXJjZSA9IG1pbG9Db3JlLmNsYXNzZXMuTWVzc2FnZVNvdXJjZVxuICAgICwgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY29tcG9uZW50cy9jX2NsYXNzJylcbiAgICAsIGRvbUV2ZW50c0NvbnN0cnVjdG9ycyA9IHJlcXVpcmUoJy4vZGVfY29uc3RycycpIC8vIFRPRE8gbWVyZ2Ugd2l0aCBET01FdmVudFNvdXJjZSA/P1xuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2g7XG5cbnZhciBET01FbWl0dGVyU291cmNlID0gXy5jcmVhdGVTdWJjbGFzcyhNZXNzYWdlU291cmNlLCAnRE9NRW1pdHRlclNvdXJjZScsIHRydWUpO1xuXG5cbl8uZXh0ZW5kUHJvdG8oRE9NRW1pdHRlclNvdXJjZSwge1xuICAgIC8vIGltcGxlbWVudGluZyBNZXNzYWdlU291cmNlIGludGVyZmFjZVxuICAgIGluaXQ6IGluaXQsXG4gICAgZGVzdHJveTogRE9NRW1pdHRlclNvdXJjZSRkZXN0cm95LFxuICAgIGFkZFNvdXJjZVN1YnNjcmliZXI6IF8ucGFydGlhbChzb3VyY2VTdWJzY3JpYmVyTWV0aG9kLCAnYWRkRXZlbnRMaXN0ZW5lcicpLFxuICAgIHJlbW92ZVNvdXJjZVN1YnNjcmliZXI6IF8ucGFydGlhbChzb3VyY2VTdWJzY3JpYmVyTWV0aG9kLCAncmVtb3ZlRXZlbnRMaXN0ZW5lcicpLFxuICAgIHBvc3RNZXNzYWdlOiBET01FbWl0dGVyU291cmNlJHBvc3RNZXNzYWdlLFxuICAgIHRyaWdnZXI6IHRyaWdnZXIsXG5cbiAgICAvLyBjbGFzcyBzcGVjaWZpYyBtZXRob2RzXG4gICAgZW1pdHRlcjogZW1pdHRlcixcbiAgICBoYW5kbGVFdmVudDogaGFuZGxlRXZlbnQsICAvLyBldmVudCBkaXNwYXRjaGVyIC0gYXMgZGVmaW5lZCBieSBFdmVudCBET00gQVBJXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBET01FbWl0dGVyU291cmNlO1xuXG5cbnZhciB1c2VDYXB0dXJlUGF0dGVybiA9IC9fX2NhcHR1cmUkL1xuICAgICwgdXNlQ2FwdHVyZVBvc3RmaXggPSAnX19jYXB0dXJlJztcblxuXG4vLyBpbml0IERPTSBldmVudCBzb3VyY2VcbmZ1bmN0aW9uIGluaXQoaG9zdE9iamVjdCwgcHJveHlNZXRob2RzLCBtZXNzZW5nZXJBUElPckNsYXNzLCBldmVudEVtaXR0ZXIpIHtcbiAgICB0aGlzLmV2ZW50RW1pdHRlciA9IGV2ZW50RW1pdHRlcjtcbiAgICBNZXNzYWdlU291cmNlLnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuZnVuY3Rpb24gRE9NRW1pdHRlclNvdXJjZSRkZXN0cm95KCkge1xuICAgIE1lc3NhZ2VTb3VyY2UucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBkZWxldGUgdGhpcy5ldmVudEVtaXR0ZXI7XG59XG5cblxuLy8gZ2V0IERPTSBlbGVtZW50IG9mIGNvbXBvbmVudFxuZnVuY3Rpb24gZW1pdHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5ldmVudEVtaXR0ZXI7XG59XG5cblxuZnVuY3Rpb24gc291cmNlU3Vic2NyaWJlck1ldGhvZChtZXRob2QsIGV2ZW50VHlwZSkge1xuICAgIGlmICghIChldmVudFR5cGUgJiYgdHlwZW9mIGV2ZW50VHlwZSA9PSAnc3RyaW5nJykpIHJldHVybjtcbiAgICB2YXIgY2FwdHVyZSA9IHVzZUNhcHR1cmVQYXR0ZXJuLnRlc3QoZXZlbnRUeXBlKTtcbiAgICBldmVudFR5cGUgPSBldmVudFR5cGUucmVwbGFjZSh1c2VDYXB0dXJlUGF0dGVybiwgJycpO1xuICAgIHRoaXMuZW1pdHRlcigpW21ldGhvZF0oZXZlbnRUeXBlLCB0aGlzLCBjYXB0dXJlKTtcbn1cblxuXG4vLyBldmVudCBkaXNwYXRjaGVyIC0gYXMgZGVmaW5lZCBieSBFdmVudCBET00gQVBJXG5mdW5jdGlvbiBoYW5kbGVFdmVudChldmVudCkge1xuICAgIHZhciBpc0NhcHR1cmVQaGFzZTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJylcbiAgICAgICAgaXNDYXB0dXJlUGhhc2UgPSBldmVudC5ldmVudFBoYXNlID09IHdpbmRvdy5FdmVudC5DQVBUVVJJTkdfUEhBU0U7XG5cbiAgICBpZiAoaXNDYXB0dXJlUGhhc2UpXG4gICAgICAgIGV2ZW50ICs9IHVzZUNhcHR1cmVQb3N0Zml4O1xuXG4gICAgdGhpcy5kaXNwYXRjaE1lc3NhZ2UoZXZlbnQudHlwZSwgZXZlbnQpO1xufVxuXG5cbmZ1bmN0aW9uIERPTUVtaXR0ZXJTb3VyY2UkcG9zdE1lc3NhZ2UobWVzc2FnZSwgZGF0YSkge1xuICAgIHRoaXMubWVzc2VuZ2VyLnBvc3RNZXNzYWdlU3luYyhtZXNzYWdlLCBkYXRhKTtcbn1cblxuXG5mdW5jdGlvbiB0cmlnZ2VyKGV2ZW50VHlwZSwgcHJvcGVydGllcykge1xuICAgIGNoZWNrKGV2ZW50VHlwZSwgU3RyaW5nKTtcbiAgICBjaGVjayhwcm9wZXJ0aWVzLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKTtcblxuICAgIGV2ZW50VHlwZSA9IGV2ZW50VHlwZS5yZXBsYWNlKHVzZUNhcHR1cmVQYXR0ZXJuLCAnJyk7XG4gICAgdmFyIEV2ZW50Q29uc3RydWN0b3IgPSBkb21FdmVudHNDb25zdHJ1Y3RvcnNbZXZlbnRUeXBlXTtcblxuICAgIGlmICh0eXBlb2YgRXZlbnRDb25zdHJ1Y3RvciAhPSAnZnVuY3Rpb24nKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIGV2ZW50IHR5cGUnKTtcblxuICAgIC8vIGNoZWNrIGlmIGl0IGlzIGNvcnJlY3RcbiAgICBpZiAodHlwZW9mIHByb3BlcnRpZXMgIT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHByb3BlcnRpZXMudHlwZSA9IGV2ZW50VHlwZTtcblxuICAgIHZhciBkb21FdmVudCA9IG5ldyBFdmVudENvbnN0cnVjdG9yKGV2ZW50VHlwZSwgcHJvcGVydGllcyk7XG4gICAgdmFyIG5vdENhbmNlbGxlZCA9IHRoaXMuZW1pdHRlcigpLmRpc3BhdGNoRXZlbnQoZG9tRXZlbnQpO1xuICAgIHJldHVybiBub3RDYW5jZWxsZWQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogYG1pbG8ubWFpbGBcbiAqIEl0IGlzIGFuIGFwcGxpY2F0aW9uIGxldmVsIG1lc3NlbmdlciB0aGF0IGlzIGFuIGluc3RhbmNlIG9mIE1lc3NlbmdlciBjbGFzcy5cbiAqXG4gKiBBdCB0aGUgbW9tZW50LCBpbiBhZGRpdGlvbiB0byBhcHBsaWNhdGlvbiBtZXNzYWdlcyB0aGF0IHlvdSBkZWZpbmUsIHlvdSBjYW4gc3Vic2NyaWJlIHRvIF9fZG9tcmVhZHlfXyBtZXNzYWdlIHRoYXQgaXMgZ3VhcmFudGVlZCB0byBmaXJlIG9uY2UsXG4gKiBldmVuIGlmIERPTSB3YXMgcmVhZHkgYXQgdGhlIHRpbWUgb2YgdGhlIHN1YnNjcmlwdGlvbi5cbiAqXG4gKiBNZXNzYWdpbmcgYmV0d2VlbiBmcmFtZXMgaXMgYXZhaWxhYmxlIHZpYSBtaWxvLm1haWwuIFNlZSBbRnJhbWUgZmFjZXRdKC4uL2NvbXBvbmVudHMvY19mYWNldHMvRnJhbWUuanMuaHRtbCkuXG4gKlxuICogU2VlIFtNZXNzZW5nZXJdKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sKS5cbiAqIFxuKiovXG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlciA9IG1pbG9Db3JlLk1lc3NlbmdlclxuICAgICwgTWFpbE1zZ0FQSSA9IHJlcXVpcmUoJy4vbWFpbF9hcGknKVxuICAgICwgTWFpbE1lc3NhZ2VTb3VyY2UgPSByZXF1aXJlKCcuL21haWxfc291cmNlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxuXG52YXIgbWlsb01haWwgPSBuZXcgTWVzc2VuZ2VyO1xuXG52YXIgbWFpbE1zZ1NvdXJjZSA9IG5ldyBNYWlsTWVzc2FnZVNvdXJjZShtaWxvTWFpbCwgeyB0cmlnZ2VyOiAndHJpZ2dlcicgfSwgbmV3IE1haWxNc2dBUEkpO1xuXG5taWxvTWFpbC5fc2V0TWVzc2FnZVNvdXJjZShtYWlsTXNnU291cmNlKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG1pbG9NYWlsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2VuZ2VyQVBJID0gbWlsb0NvcmUuY2xhc3Nlcy5NZXNzZW5nZXJBUElcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5cbnZhciBNYWlsTXNnQVBJID0gXy5jcmVhdGVTdWJjbGFzcyhNZXNzZW5nZXJBUEksICdNYWlsTXNnQVBJJywgdHJ1ZSk7XG5cblxuXy5leHRlbmRQcm90byhNYWlsTXNnQVBJLCB7XG4gICAgdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlOiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UsXG4gICAgZmlsdGVyU291cmNlTWVzc2FnZTogZmlsdGVyU291cmNlTWVzc2FnZVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTWFpbE1zZ0FQSTtcblxuXG4vLyBUT0RPOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gcmVsZXZhbnQgRE9NIGV2ZW50IGRlcGVuZGVudCBvbiBlbGVtZW50IHRhZ1xuLy8gQ2FuIGFsc28gaW1wbGVtZW50IGJlZm9yZWRhdGFjaGFuZ2VkIGV2ZW50IHRvIGFsbG93IHByZXZlbnRpbmcgdGhlIGNoYW5nZVxuLy8gdHJhbnNsYXRlVG9Eb21FdmVudFxudmFyIHdpbmRvd01lc3NhZ2VSZWdFeHAgPSAvXm1lc3NhZ2VcXDovXG4gICAgLCB3aW5kb3dNZXNzYWdlUHJlZml4ID0gJ21lc3NhZ2U6JztcblxuZnVuY3Rpb24gdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICBpZiAobWVzc2FnZSA9PSAnZG9tcmVhZHknKVxuICAgICAgICByZXR1cm4gJ3JlYWR5c3RhdGVjaGFuZ2UnO1xuICAgIGVsc2UgaWYgKHdpbmRvd01lc3NhZ2VSZWdFeHAudGVzdChtZXNzYWdlKSlcbiAgICAgICAgcmV0dXJuICdtZXNzYWdlJztcbn1cblxuXG4vLyBmaWx0ZXJEYXRhTWVzc2FnZVxuZnVuY3Rpb24gZmlsdGVyU291cmNlTWVzc2FnZShzb3VyY2VNZXNzYWdlLCBtc2dUeXBlLCBtc2dEYXRhKSB7XG4gICAgaWYgKHNvdXJjZU1lc3NhZ2UgPT0gJ3JlYWR5c3RhdGVjaGFuZ2UnKSB7XG4gICAgICAgIC8vcmV0dXJuIGRvY3VtZW50LnJlYWR5U3RhdGUgPT0gJ2ludGVyYWN0aXZlJztcbiAgICAgICAgLy8gIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX2RvbVJlYWR5RmlyZWQnLCB0cnVlLCBfLldSSVQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHNvdXJjZU1lc3NhZ2UgPT0gJ21lc3NhZ2UnKVxuICAgICAgICByZXR1cm4gd2luZG93TWVzc2FnZVByZWZpeCArIG1zZ0RhdGEuZGF0YS50eXBlID09IG1zZ1R5cGU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2FnZVNvdXJjZSA9IG1pbG9Db3JlLmNsYXNzZXMuTWVzc2FnZVNvdXJjZVxuICAgICwgZG9tRXZlbnRzQ29uc3RydWN0b3JzID0gcmVxdWlyZSgnLi4vZGVfY29uc3RycycpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxuXG52YXIgTWFpbE1lc3NhZ2VTb3VyY2UgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NhZ2VTb3VyY2UsICdNYWlsTWVzc2FnZVNvdXJjZScsIHRydWUpO1xuXG5cbl8uZXh0ZW5kUHJvdG8oTWFpbE1lc3NhZ2VTb3VyY2UsIHtcbiAgICAvLyBpbXBsZW1lbnRpbmcgTWVzc2FnZVNvdXJjZSBpbnRlcmZhY2VcbiAgICBhZGRTb3VyY2VTdWJzY3JpYmVyOiBhZGRTb3VyY2VTdWJzY3JpYmVyLFxuICAgIHJlbW92ZVNvdXJjZVN1YnNjcmliZXI6IHJlbW92ZVNvdXJjZVN1YnNjcmliZXIsXG4gICAgdHJpZ2dlcjogdHJpZ2dlcixcblxuICAgIC8vIGNsYXNzIHNwZWNpZmljIG1ldGhvZHNcbiAgICBfd2luZG93U3Vic2NyaWJlck1ldGhvZDogX3dpbmRvd1N1YnNjcmliZXJNZXRob2QsXG4gICAgaGFuZGxlRXZlbnQ6IGhhbmRsZUV2ZW50LCAgLy8gZXZlbnQgZGlzcGF0Y2hlciAtIGFzIGRlZmluZWQgYnkgRXZlbnQgRE9NIEFQSVxufSk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBNYWlsTWVzc2FnZVNvdXJjZTtcblxuXG5mdW5jdGlvbiBhZGRTb3VyY2VTdWJzY3JpYmVyKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICBpZiAoaXNSZWFkeVN0YXRlQ2hhbmdlKHNvdXJjZU1lc3NhZ2UpKSB7XG4gICAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09ICdsb2FkaW5nJylcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3JlYWR5c3RhdGVjaGFuZ2UnLCB0aGlzLCBmYWxzZSk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIEV2ZW50Q29uc3RydWN0b3IgPSBkb21FdmVudHNDb25zdHJ1Y3RvcnMucmVhZHlzdGF0ZWNoYW5nZTtcbiAgICAgICAgICAgIHZhciBkb21FdmVudCA9IG5ldyBFdmVudENvbnN0cnVjdG9yKCdyZWFkeXN0YXRlY2hhbmdlJywgeyB0YXJnZXQ6IGRvY3VtZW50IH0pO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaE1lc3NhZ2UoJ3JlYWR5c3RhdGVjaGFuZ2UnLCBkb21FdmVudCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2VcbiAgICAgICAgdGhpcy5fd2luZG93U3Vic2NyaWJlck1ldGhvZCgnYWRkRXZlbnRMaXN0ZW5lcicsIHNvdXJjZU1lc3NhZ2UpO1xufVxuXG5cbmZ1bmN0aW9uIHJlbW92ZVNvdXJjZVN1YnNjcmliZXIoc291cmNlTWVzc2FnZSkge1xuICAgIGlmIChpc1JlYWR5U3RhdGVDaGFuZ2Uoc291cmNlTWVzc2FnZSkpXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3JlYWR5c3RhdGVjaGFuZ2UnLCB0aGlzLCBmYWxzZSk7XG4gICAgZWxzZSBcbiAgICAgICAgdGhpcy5fd2luZG93U3Vic2NyaWJlck1ldGhvZCgncmVtb3ZlRXZlbnRMaXN0ZW5lcicsIHNvdXJjZU1lc3NhZ2UpO1xufVxuXG5cbmZ1bmN0aW9uIGlzUmVhZHlTdGF0ZUNoYW5nZShzb3VyY2VNZXNzYWdlKSB7XG4gICAgcmV0dXJuIHNvdXJjZU1lc3NhZ2UgPT0gJ3JlYWR5c3RhdGVjaGFuZ2UnICYmIHR5cGVvZiBkb2N1bWVudCA9PSAnb2JqZWN0Jztcbn1cblxuZnVuY3Rpb24gaXNXaW5kb3dNZXNzYWdlKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICByZXR1cm4gc291cmNlTWVzc2FnZSA9PSAnbWVzc2FnZScgJiYgdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0Jztcbn1cblxuZnVuY3Rpb24gX3dpbmRvd1N1YnNjcmliZXJNZXRob2QobWV0aG9kLCBzb3VyY2VNZXNzYWdlKSB7XG4gICAgaWYgKGlzV2luZG93TWVzc2FnZShzb3VyY2VNZXNzYWdlKSlcbiAgICAgICAgd2luZG93W21ldGhvZF0oJ21lc3NhZ2UnLCB0aGlzLCBmYWxzZSk7XG59XG5cblxuLy8gZXZlbnQgZGlzcGF0Y2hlciAtIGFzIGRlZmluZWQgYnkgRXZlbnQgRE9NIEFQSVxuZnVuY3Rpb24gaGFuZGxlRXZlbnQoZXZlbnQpIHtcbiAgICB0aGlzLmRpc3BhdGNoTWVzc2FnZShldmVudC50eXBlLCBldmVudCk7XG59XG5cblxuZnVuY3Rpb24gdHJpZ2dlcihtc2dUeXBlLCBkYXRhKSB7XG4gICAgZGF0YSA9IGRhdGEgfHwge307XG4gICAgZGF0YS50eXBlID0gJ21lc3NhZ2U6JyArIG1zZ1R5cGU7XG4gICAgXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcpXG4gICAgICAgIHdpbmRvdy5wb3N0TWVzc2FnZShkYXRhLCAnKicpXG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlciA9IG1pbG9Db3JlLk1lc3NlbmdlclxuICAgICwgRE9NRW1pdHRlclNvdXJjZSA9IHJlcXVpcmUoJy4vZG9tX3NvdXJjZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxudmFyIHdpbmRvd1NlcnZpY2UgPSBuZXcgTWVzc2VuZ2VyO1xudmFyIGRvbUVtaXR0ZXJTb3VyY2UgPSBuZXcgRE9NRW1pdHRlclNvdXJjZSh3aW5kb3dTZXJ2aWNlLCB7IHRyaWdnZXI6ICd0cmlnZ2VyJyB9LCB1bmRlZmluZWQsIHdpbmRvdyk7XG53aW5kb3dTZXJ2aWNlLl9zZXRNZXNzYWdlU291cmNlKGRvbUVtaXR0ZXJTb3VyY2UpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gd2luZG93U2VydmljZTtcblxuXG5fLmV4dGVuZCh3aW5kb3dTZXJ2aWNlLCB7XG4gICAgaXNUb3A6IHdpbmRvd1NlcnZpY2VfaXNUb3Bcbn0pO1xuXG5cbmZ1bmN0aW9uIHdpbmRvd1NlcnZpY2VfaXNUb3AoKSB7XG4gICAgcmV0dXJuIHdpbmRvdy50b3AgPT0gd2luZG93LnNlbGYgfHwgd2luZG93Ll9fa2FybWFfXztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxucmVxdWlyZSgnLi9jb21wb25lbnRzL2NsYXNzZXMvVmlldycpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0dyb3VwJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvV3JhcHBlcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL1RleHQnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9TZWxlY3QnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9JbnB1dCcpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0lucHV0TGlzdCcpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL1RleHRhcmVhJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvUmFkaW9Hcm91cCcpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0J1dHRvbicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0h5cGVybGluaycpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0xpc3QnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9MaXN0SXRlbScpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL1RpbWUnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9EYXRlJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvQ29tYm8nKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9TdXBlckNvbWJvJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvQ29tYm9MaXN0Jyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvSW1hZ2UnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9Ecm9wVGFyZ2V0Jyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvRm9sZFRyZWUnKTtcblxucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL2Jvb3RzdHJhcC9Ecm9wZG93bicpO1xuLy8gcmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL2Jvb3RzdHJhcC9EaWFsb2cnKTtcbiIsIid1c2Ugc3RyaWN0JztcblxucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL0RvbScpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL0RhdGEnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9GcmFtZScpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL0V2ZW50cycpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL09wdGlvbnMnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9UZW1wbGF0ZScpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL0NvbnRhaW5lcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL01vZGVsRmFjZXQnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9EcmFnJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY19mYWNldHMvRHJvcCcpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL0xpc3QnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9JdGVtJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY19mYWNldHMvVHJhbnNmZXInKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHVuaXF1ZUlkID0gcmVxdWlyZSgnLi91bmlxdWVfaWQnKVxuICAgICwgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJylcbiAgICAsIHByZWZpeCA9IGNvbmZpZy5jb21wb25lbnRQcmVmaXg7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBjb21wb25lbnROYW1lO1xuXG5cbmZ1bmN0aW9uIGNvbXBvbmVudE5hbWUoKSB7XG4gICAgcmV0dXJuIHByZWZpeCArIHVuaXF1ZUlkKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaFxuICAgICwgY29tcG9uZW50UmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jb21wb25lbnRzL2NfcmVnaXN0cnknKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUNvbXBvbmVudENsYXNzO1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gd2hpY2ggY3JlYXRlcyBhbmQgcmVnaXN0ZXJzIG5ldyBtaWxvIGNvbXBvbmVudC4gIFRoZSBjb21wb25lbnQgY3JlYXRlZCB3aWxsIGhhdmVcbiAqIGEgcmVmZXJlbmNlIHRvIHRoZSBzdXBlciBjbGFzcyB1c2VkIGluIGl0cyBjcmVhdGlvbiAoQWNjZXNzYWJsZSB1c2luZyA8Q29tcG9uZW50Q2xhc3M+LnN1cGVyKS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnLmNsYXNzTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBuZXcgY29tcG9uZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gWydDb21wb25lbnQnXSBjb25maWcuc3VwZXJDbGFzc05hbWUgLSBUaGUgbmFtZSBvZiBhbiBleGlzdGluZyBjb21wb25lbnQgdG8gYmUgdXNlZCBhcyB0aGUgbmV3IGNvbXBvbmVudCdzIHN1cGVyIGNsYXNzXG4gKiBAcGFyYW0ge29iamVjdD19IGNvbmZpZy5mYWNldHMgLSBGYWNldCBjb25maWd1cmF0aW9uIChIYXNoIG9mIGZhY2V0IG5hbWUge3N0cmluZ30gdG8gY29uZmlnIHtvYmplY3R9KVxuICogQHBhcmFtIHtvYmplY3Q9fSBjb25maWcubWV0aG9kcyAtIE1ldGhvZHMgb2YgdGhlIG5ldyBjb21wb25lbnQgKEhhc2ggb2YgZnVuY3Rpb24gbmFtZSB7c3RyaW5nfSB0byBmdW5jdGlvbiB7ZnVuY3Rpb259KVxuICogQHBhcmFtIHtvYmplY3Q9fSBjb25maWcuc3RhdGljTWV0aG9kcyAtIFN0YXRpYyBtZXRob2RzIG9mIHRoZSBuZXcgY29tcG9uZW50IChIYXNoIG9mIGZ1bmN0aW9uIG5hbWUge3N0cmluZ30gdG8gZnVuY3Rpb24ge2Z1bmN0aW9ufSlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50Q2xhc3MoY29uZmlnKSB7XG4gICAgY2hlY2soY29uZmlnLCB7XG4gICAgICAgIHN1cGVyQ2xhc3NOYW1lOiBNYXRjaC5PcHRpb25hbChTdHJpbmcpLFxuICAgICAgICBjbGFzc05hbWU6IFN0cmluZyxcbiAgICAgICAgZmFjZXRzOiBNYXRjaC5PcHRpb25hbChPYmplY3QpLFxuICAgICAgICBtZXRob2RzOiBNYXRjaC5PcHRpb25hbChNYXRjaC5PYmplY3RIYXNoKEZ1bmN0aW9uKSksXG4gICAgICAgIHN0YXRpY01ldGhvZHM6IE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9iamVjdEhhc2goRnVuY3Rpb24pKSxcbiAgICB9KTtcbiAgICB2YXIgU3VwZXJDbGFzcyA9IGNvbXBvbmVudFJlZ2lzdHJ5LmdldChjb25maWcuc3VwZXJDbGFzc05hbWUgfHwgJ0NvbXBvbmVudCcpO1xuICAgIHZhciBDb21wb25lbnRDbGFzcyA9IFN1cGVyQ2xhc3MuY3JlYXRlQ29tcG9uZW50Q2xhc3MoY29uZmlnLmNsYXNzTmFtZSwgY29uZmlnLmZhY2V0cyk7XG5cbiAgICBpZiAoY29uZmlnLm1ldGhvZHMpIF8uZXh0ZW5kUHJvdG8oQ29tcG9uZW50Q2xhc3MsIGNvbmZpZy5tZXRob2RzKTtcblxuICAgIGlmIChjb25maWcuc3RhdGljTWV0aG9kcykge1xuICAgICAgICBpZiAoY29uZmlnLnN0YXRpY01ldGhvZHMuc3VwZXIgIT09IHVuZGVmaW5lZCkgdGhyb3cgJ1xcJ3N1cGVyXFwnIGlzIGEgcmVzZXJ2ZWQga2V5d29yZCc7XG4gICAgICAgIF8uZXh0ZW5kKENvbXBvbmVudENsYXNzLCBjb25maWcuc3RhdGljTWV0aG9kcyk7XG4gICAgfVxuXG4gICAgQ29tcG9uZW50Q2xhc3Muc3VwZXIgPSBTdXBlckNsYXNzLnByb3RvdHlwZTtcbiAgICBjb21wb25lbnRSZWdpc3RyeS5hZGQoQ29tcG9uZW50Q2xhc3MpO1xuICAgIHJldHVybiBDb21wb25lbnRDbGFzcztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkZXByZWNhdGUoZm4sIG1lc3NhZ2UpIHtcbiAgICB2YXIgd2FybmVkO1xuICAgIHN3aXRjaCAodHlwZW9mIGZuKSB7XG4gICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgICByZXR1cm4gXy5tYXBLZXlzKGZuLCBmdW5jdGlvbihmKSB7IHJldHVybiBkZXByZWNhdGUoZiwgbWVzc2FnZSk7IH0pO1xuICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wIGluIGZuKVxuICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWRbcHJvcF0gPSBkZXByZWNhdGUoZm5bcHJvcF0sIG1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZm47XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgICAgICBpZiAoY29uZmlnLmRlcHJlY2F0aW9uV2FybmluZ1xuICAgICAgICAgICAgJiYgKCF3YXJuZWQgfHwgY29uZmlnLmRlcHJlY2F0aW9uV2FybmluZyA9PSAnYWx3YXlzJykpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihtZXNzYWdlIHx8ICdGdW5jdGlvbiAnICsgZm4ubmFtZSArICcgaXMgREVQUkVDQVRFRCcpO1xuICAgICAgICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlcjtcblxudmFyIGRvbVV0aWxzID0ge1xuICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICBmaWx0ZXJOb2RlTGlzdEJ5VHlwZTogZmlsdGVyTm9kZUxpc3RCeVR5cGUsXG4gICAgY29udGFpbmluZ0VsZW1lbnQ6IGNvbnRhaW5pbmdFbGVtZW50LFxuICAgIHNlbGVjdEVsZW1lbnRDb250ZW50czogc2VsZWN0RWxlbWVudENvbnRlbnRzLFxuICAgIHNlbGVjdEVsZW1lbnRUZXh0OiBzZWxlY3RFbGVtZW50VGV4dCxcbiAgICBnZXRFbGVtZW50T2Zmc2V0OiBnZXRFbGVtZW50T2Zmc2V0LFxuICAgIHNldENhcmV0UG9zaXRpb246IHNldENhcmV0UG9zaXRpb24sXG4gICAgZ2V0U2VsZWN0aW9uRGlyZWN0aW9uOiBnZXRTZWxlY3Rpb25EaXJlY3Rpb24sXG4gICAgc2V0U2VsZWN0aW9uOiBzZXRTZWxlY3Rpb24sXG4gICAgY2xlYXJTZWxlY3Rpb246IGNsZWFyU2VsZWN0aW9uLFxuICAgIHJlbW92ZUVsZW1lbnQ6IHJlbW92ZUVsZW1lbnQsXG4gICAgdW53cmFwRWxlbWVudDogdW53cmFwRWxlbWVudCxcbiAgICB3cmFwSW5FbGVtZW50OiB3cmFwSW5FbGVtZW50LFxuICAgIGRldGFjaENvbXBvbmVudDogZGV0YWNoQ29tcG9uZW50LFxuICAgIGZpcnN0VGV4dE5vZGU6IGZpcnN0VGV4dE5vZGUsXG4gICAgbGFzdFRleHROb2RlOiBsYXN0VGV4dE5vZGUsXG4gICAgdHJpbU5vZGVSaWdodDogdHJpbU5vZGVSaWdodCxcbiAgICB0cmltTm9kZUxlZnQ6IHRyaW1Ob2RlTGVmdCxcbiAgICBzdHJpcEh0bWw6IHN0cmlwSHRtbCxcbiAgICBodG1sRW50aXRpZXM6IGh0bWxFbnRpdGllcyxcbiAgICB3YWxrVHJlZTogd2Fsa1RyZWUsXG4gICAgY3JlYXRlVHJlZVdhbGtlcjogY3JlYXRlVHJlZVdhbGtlcixcblxuICAgIHRyZWVQYXRoT2Y6IHRyZWVQYXRoT2YsXG4gICAgZ2V0Tm9kZUF0VHJlZVBhdGg6IGdldE5vZGVBdFRyZWVQYXRoLFxuICAgIGluc2VydEF0VHJlZVBhdGg6IGluc2VydEF0VHJlZVBhdGgsXG4gICAgaXNUcmVlUGF0aEJlZm9yZTogaXNUcmVlUGF0aEJlZm9yZSxcblxuICAgIGdldE5vZGVXaW5kb3c6IGdldE5vZGVXaW5kb3csXG5cbiAgICBnZXRDb21wb25lbnRzRnJvbVJhbmdlOiBnZXRDb21wb25lbnRzRnJvbVJhbmdlLFxuICAgIGRlbGV0ZVJhbmdlV2l0aENvbXBvbmVudHM6IGRlbGV0ZVJhbmdlV2l0aENvbXBvbmVudHMsXG4gICAgZm9yRWFjaE5vZGVzSW5SYW5nZTogZm9yRWFjaE5vZGVzSW5SYW5nZSxcbiAgICBhcmVSYW5nZXNFcXVhbDogYXJlUmFuZ2VzRXF1YWwsXG5cbiAgICBhZGREZWJ1Z1BvaW50OiBhZGREZWJ1Z1BvaW50XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRvbVV0aWxzO1xuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGlzdCBvZiBlbGVtZW50IGNoaWxkcmVuIG9mIERPTSBlbGVtZW50XG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbCBlbGVtZW50IHRvIHJldHVybiB0aGUgY2hpbGRyZW4gb2YgKG9ubHkgRE9NIGVsZW1lbnRzKVxuICogQHJldHVybiB7QXJyYXlbRWxlbWVudF19XG4gKi9cbiBmdW5jdGlvbiBjaGlsZHJlbihlbCkge1xuICAgIHJldHVybiBmaWx0ZXJOb2RlTGlzdEJ5VHlwZShlbC5jaGlsZE5vZGVzLCBOb2RlLkVMRU1FTlRfTk9ERSk7XG4gfVxuXG5cbi8qKlxuICogRmlsdGVycyB0aGUgbGlzdCBvZiBub2RlcyBieSB0eXBlXG4gKlxuICogQHBhcmFtIHtOb2RlTGlzdH0gbm9kZUxpc3QgdGhlIGxpc3Qgb2Ygbm9kZXMsIGZvciBleGFtcGxlIGNoaWxkTm9kZXMgcHJvcGVydHkgb2YgRE9NIGVsZW1lbnRcbiAqIEBwYXJhbSB7SW50ZWdlcn0gbm9kZVR5cGUgYW4gaW50ZWdlciBjb25zdGFudCBbZGVmaW5lZCBieSBET00gQVBJXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTm9kZS5ub2RlVHlwZSksIGUuZy4gYE5vZGUuRUxFTUVOVF9OT0RFYCBvciBgTm9kZS5URVhUX05PREVgXG4gKiBAcmV0dXJuIHtBcnJheVtOb2RlXX1cbiAqL1xuZnVuY3Rpb24gZmlsdGVyTm9kZUxpc3RCeVR5cGUobm9kZUxpc3QsIG5vZGVUeXBlKSB7XG4gICAgcmV0dXJuIF8uZmlsdGVyKG5vZGVMaXN0LCBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PSBub2RlVHlwZTtcbiAgICB9KTtcbn1cblxuXG4vKipcbiAqIEZpbmQgbmVhcmVzdCBwYXJlbnQgZWxlbWVudCBmb3Igbm9kZS5cbiAqIElmIG5vZGUgaXMgYW4gZWxlbWVudCwgaXQgd2lsbCBiZSByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAqL1xuZnVuY3Rpb24gY29udGFpbmluZ0VsZW1lbnQobm9kZSkge1xuICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5cbi8qKlxuICogU2VsZWN0cyBpbm5lciBjb250ZW50cyBvZiBET00gZWxlbWVudFxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWwgRE9NIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gc2VsZWN0RWxlbWVudENvbnRlbnRzKGVsKSB7XG4gICAgdmFyIGRvYyA9IGVsLm93bmVyRG9jdW1lbnQ7XG4gICAgaWYgKCEgZG9jKSByZXR1cm4gbG9nZ2VyLmVycm9yKCdzZWxlY3RFbGVtZW50Q29udGVudHM6IGVsZW1lbnQgaGFzIG5vIGRvY3VtZW50Jyk7XG4gICAgdmFyIHJhbmdlID0gZG9jLmNyZWF0ZVJhbmdlKCk7XG4gICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVsKTtcbiAgICB2YXIgd2luID0gZ2V0Tm9kZVdpbmRvdyhlbClcbiAgICAgICAgLCBzZWwgPSB3aW4uZ2V0U2VsZWN0aW9uKCk7XG4gICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG59XG5cblxuLyoqXG4gKiBTZWxlY3RzIHRleHQgaW5zaWRlIGVsZW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqL1xuZnVuY3Rpb24gc2VsZWN0RWxlbWVudFRleHQoZWwpIHtcbiAgICB2YXIgZnJvbU5vZGUgPSBmaXJzdFRleHROb2RlKGVsKVxuICAgICAgICAsIHRvTm9kZSA9IGxhc3RUZXh0Tm9kZShlbCk7XG5cbiAgICBpZiAoZnJvbU5vZGUgJiYgdG9Ob2RlKVxuICAgICAgICBzZXRTZWxlY3Rpb24oZnJvbU5vZGUsIDAsIHRvTm9kZSwgdG9Ob2RlLnRleHRDb250ZW50Lmxlbmd0aCk7XG59XG5cblxuLyoqXG4gKiBTZXRzIHRoZSBjYXJldCBwb3NpdGlvbiB0byB0aGUgcG9zaXRpb24gaW4gdGhlIG5vZGVcbiAqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgRE9NIG5vZGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBwb3MgY2FyZXQgcG9zaXRpb25cbiAqL1xuZnVuY3Rpb24gc2V0Q2FyZXRQb3NpdGlvbihub2RlLCBwb3MpIHtcbiAgICB2YXIgZG9jID0gbm9kZS5vd25lckRvY3VtZW50O1xuICAgIGlmICghIGRvYykgcmV0dXJuIGxvZ2dlci5lcnJvcignc2V0Q2FyZXRQb3NpdGlvbjogZWxlbWVudCBoYXMgbm8gZG9jdW1lbnQnKTtcbiAgICB2YXIgcmFuZ2UgPSBkb2MuY3JlYXRlUmFuZ2UoKTtcbiAgICByYW5nZS5zZXRTdGFydChub2RlLCBwb3MpO1xuICAgIHZhciB3aW4gPSBnZXROb2RlV2luZG93KG5vZGUpXG4gICAgICAgICwgc2VsID0gd2luLmdldFNlbGVjdGlvbigpO1xuICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xufVxuXG4vKipcbiAqIGdldCB0aGUgZGlyZWN0aW9uIG9mIGEgc2VsZWN0aW9uXG4gKlxuICogMSBmb3J3YXJkLCAtMSBiYWNrd2FyZCwgMCBubyBkaXJlY3Rpb24sIHVuZGVmaW5lZCBvbmUgb2YgdGhlIG5vZGUgaXMgZGV0YWNoZWQgb3IgaW4gYSBkaWZmZXJlbnQgZnJhbWVcbiAqXG4gKiBAcGFyYW0ge3NlbH0gYSBzZWxlY3Rpb24gb2JqZWN0XG4gKiBAcmV0dXJuIHstMXwwfDF8dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb25EaXJlY3Rpb24oc2VsKXtcbiAgICByZXR1cm4gX2dldERpcmVjdGlvbihzZWwuYW5jaG9yTm9kZSwgc2VsLmFuY2hvck9mZnNldCwgc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gX2dldERpcmVjdGlvbihmcm9tTm9kZSwgc3RhcnRPZmZzZXQsIHRvTm9kZSwgZW5kT2Zmc2V0KXtcbiAgICB2YXIgZG9jUG9zaXRpb24gPSBmcm9tTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0b05vZGUpO1xuICAgIGlmIChkb2NQb3NpdGlvbiAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKXtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGVsc2UgaWYgKGRvY1Bvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpe1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGVsc2UgaWYgKGZyb21Ob2RlID09IHRvTm9kZSl7XG4gICAgICAgIGlmIChzdGFydE9mZnNldCA8IGVuZE9mZnNldCl7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGFydE9mZnNldCA+IGVuZE9mZnNldCl7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBTZWxlY3RzIGEgcmFuZ2UgaW4gYSBkb2N1bWVudFxuICpcbiAqIEBwYXJhbSB7Tm9kZX0gZnJvbU5vZGUgRE9NIG5vZGUgdG8gc3RhcnQgc2VsZWN0aW9uIGluXG4gKiBAcGFyYW0ge051bWJlcn0gc3RhcnRPZmZzZXRcbiAqIEBwYXJhbSB7Tm9kZX0gdG9Ob2RlIERPTSBub2RlIHRvIGVuZCBzZWxlY3Rpb24gaW5cbiAqIEBwYXJhbSB7TnVtYmVyfSBlbmRPZmZzZXRcbiAqL1xuZnVuY3Rpb24gc2V0U2VsZWN0aW9uKGZyb21Ob2RlLCBzdGFydE9mZnNldCwgdG9Ob2RlLCBlbmRPZmZzZXQpIHtcbiAgICB2YXIgZG9jID0gZnJvbU5vZGUub3duZXJEb2N1bWVudDtcbiAgICBpZiAoISBkb2MpIHJldHVybiBsb2dnZXIoJ3NldENhcmV0UG9zaXRpb246IGVsZW1lbnQgaGFzIG5vIGRvY3VtZW50Jyk7XG4gICAgdmFyIGJhY2t3YXJkID0gX2dldERpcmVjdGlvbihmcm9tTm9kZSwgc3RhcnRPZmZzZXQsIHRvTm9kZSwgZW5kT2Zmc2V0KSA9PSAtMTtcbiAgICB2YXIgcmFuZ2UgPSBkb2MuY3JlYXRlUmFuZ2UoKTtcbiAgICB2YXIgY29udGFpbmVyLCBvcmlnaW5hbENvbnRlbnRFZGl0YWJsZTtcbiAgICAvLyBkb2VzIG5vdCB3b3JrIGluIG5vbiBjb250ZW50RWRpdGFibGUgaXRlbXNcblxuICAgIHZhciB3aW4gPSBnZXROb2RlV2luZG93KGZyb21Ob2RlKVxuICAgICAgICAsIHNlbCA9IHdpbi5nZXRTZWxlY3Rpb24oKTtcblxuXG4gICAgaWYgKGJhY2t3YXJkKXtcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQodG9Ob2RlLCBlbmRPZmZzZXQpO1xuICAgICAgICByYW5nZS5zZXRFbmQoZnJvbU5vZGUsIHN0YXJ0T2Zmc2V0KTtcbiAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoZnJvbU5vZGUsIHN0YXJ0T2Zmc2V0KTtcbiAgICAgICAgcmFuZ2Uuc2V0RW5kKHRvTm9kZSwgZW5kT2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjb250YWluZXIgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lciA9PSBOb2RlLkVMRU1FTlRfTk9ERSA/XG4gICAgICAgIHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyIDpcbiAgICAgICAgcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIucGFyZW50RWxlbWVudDtcblxuICAgIGlmICghY29udGFpbmVyLmlzQ29udGVudEVkaXRhYmxlKXtcbiAgICAgICAgb3JpZ2luYWxDb250ZW50RWRpdGFibGUgPSBjb250YWluZXIuY29udGVudEVkaXRhYmxlOyAvLyBmYWxzZSBvciBpbmhlcml0XG4gICAgICAgIGNvbnRhaW5lci5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICB9XG5cbiAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgIGlmIChiYWNrd2FyZCl7XG4gICAgICAgIHNlbC5leHRlbmQodG9Ob2RlLCBlbmRPZmZzZXQpO1xuICAgIH1cblxuICAgIGlmIChvcmlnaW5hbENvbnRlbnRFZGl0YWJsZSl7XG4gICAgICAgIC8vIHJlc3RvcmluZyBjb250ZW50RWRpdGFibGVcbiAgICAgICAgY29udGFpbmVyLmNvbnRlbnRFZGl0YWJsZSA9IG9yaWdpbmFsQ29udGVudEVkaXRhYmxlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDbGVhcnMgc2VsZWN0aW9uIGluIGEgZ2l2ZW4gd2luZG93XG4gKiBAcGFyYW0ge1dpbmRvd30gd2luXG4gKi9cbmZ1bmN0aW9uIGNsZWFyU2VsZWN0aW9uKHdpbikge1xuICAgIHdpbiA9IHdpbiB8fCB3aW5kb3c7XG4gICAgdmFyIHNlbCA9IHdpbi5nZXRTZWxlY3Rpb24oKTtcbiAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG59XG5cblxuLyoqXG4gKiBDYWxjdWxhdGVzIGFuIGVsZW1lbnQncyB0b3RhbCB0b3AgYW5kIGxlZnQgb2Zmc2V0IGZyb20gdGhlIGRvY3VtZW50IGVkZ2UuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbCB0aGUgZWxlbWVudCBmb3Igd2hpY2ggcG9zaXRpb24gbmVlZHMgdG8gYmUgcmV0dXJuZWRcbiAqIEBwYXJhbSB7aW5jbHVkZUJvcmRlcn0gaWYgaXMgdG8gaW5jbHVkZSB0aGUgYm9yZGVyIHdpZHRoXG4gKiBAcmV0dXJuIHtPYmplY3R9IHZlY3RvciBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHRvcE9mZnNldCBhbmQgbGVmdE9mZnNldFxuICovXG5mdW5jdGlvbiBnZXRFbGVtZW50T2Zmc2V0KGVsLCBpbmNsdWRlQm9yZGVyKSB7XG4gICAgdmFyIHlQb3MsIHhQb3M7XG5cbiAgICB5UG9zID0gZWwub2Zmc2V0VG9wO1xuICAgIHhQb3MgPSBlbC5vZmZzZXRMZWZ0O1xuICAgIGVsID0gZWwub2Zmc2V0UGFyZW50O1xuXG4gICAgd2hpbGUgKGVsKSB7XG4gICAgICAgIHlQb3MgKz0gZWwub2Zmc2V0VG9wICsgZ2V0Qm9yZGVyKGVsLCAnSGVpZ2h0JywgaW5jbHVkZUJvcmRlcik7XG4gICAgICAgIHhQb3MgKz0gZWwub2Zmc2V0TGVmdCArIGdldEJvcmRlcihlbCwgJ1dpZHRoJywgaW5jbHVkZUJvcmRlcik7XG4gICAgICAgIGVsID0gZWwub2Zmc2V0UGFyZW50O1xuICAgIH1cblxuICAgIHJldHVybiB7IHRvcE9mZnNldDogeVBvcywgbGVmdE9mZnNldDogeFBvcyB9O1xufVxuXG5cbmZ1bmN0aW9uIGdldEJvcmRlcihlbCwgdHlwZSwgaW5jbHVkZUJvcmRlcikge1xuICAgIGlmIChpbmNsdWRlQm9yZGVyKSB7XG4gICAgICAgIHZhciBzaWRlID0gKHR5cGUgPT0gJ0hlaWdodCcpID8gJ3RvcCcgOiAnbGVmdCcsXG4gICAgICAgICAgICBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCksXG4gICAgICAgICAgICBzaWRlVmFsdWUgPSBwYXJzZUludChzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnYm9yZGVyLScgKyBzaWRlICsgJy13aWR0aCcpLCAxMCk7XG5cbiAgICAgICAgaWYgKHNpZGVWYWx1ZSkgcmV0dXJuIHNpZGVWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIGVsZW1lbnQgZnJvbSB0aGUgZG9jdW1lbnRcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsIHRoZSBlbGVtZW50IHRvIGJlIHJlbW92ZWRcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbCkge1xuICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnROb2RlO1xuICAgIGlmIChwYXJlbnQpe1xuICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQoZWwpO1xuICAgICAgICBwYXJlbnQubm9ybWFsaXplKCk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgdGV4dCBub2RlIG9mIGFuIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR8Tm9kZX0gbm9kZSB0aGUgbm9kZSB0byBiZSBzZWFyY2hlZCwgaWYgdGhlIG5vZGUgaXMgdGV4dCBub2RlIHdlIHJldHVybiB0aGUgbm9kZS5cbiAqIEByZXR1cm4ge1RleHROb2RlfVxuICovXG5mdW5jdGlvbiBmaXJzdFRleHROb2RlKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkgcmV0dXJuIG5vZGU7XG4gICAgdmFyIHRyZWVXYWxrZXIgPSBjcmVhdGVUcmVlV2Fsa2VyKG5vZGUsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcbiAgICByZXR1cm4gdHJlZVdhbGtlci5maXJzdENoaWxkKCk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsYXN0IGNoaWxkIHRleHQgbm9kZSBvZiBhbiBlbGVtZW50XG4gKlxuICogQHBhcmFtIHtFbGVtZW50fE5vZGV9IG5vZGUgdGhlIG5vZGUgdG8gYmUgc2VhcmNoZWQsIGlmIHRoZSBub2RlIGlzIHRleHQgbm9kZSB3ZSByZXR1cm4gdGhlIG5vZGUuXG4gKiBAcmV0dXJuIHtUZXh0Tm9kZX1cbiAqL1xuZnVuY3Rpb24gbGFzdFRleHROb2RlKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkgcmV0dXJuIG5vZGU7XG4gICAgdmFyIHRyZWVXYWxrZXIgPSBjcmVhdGVUcmVlV2Fsa2VyKG5vZGUsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcbiAgICByZXR1cm4gdHJlZVdhbGtlci5sYXN0Q2hpbGQoKTtcbn1cblxuXG4vKipcbiAqIFJlbW92ZXMgZWxlbWVudCBmcm9tIHRoZSBkb2N1bWVudCBwdXR0aW5nIGl0cyBjaGlsZHJlbiBpbiBpdHMgcGxhY2VcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsIHRoZSBlbGVtZW50IHRvIGJlIFwidW53cmFwcGVkXCJcbiAqL1xuZnVuY3Rpb24gdW53cmFwRWxlbWVudChlbCkge1xuICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnROb2RlO1xuXG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgICB2YXIgZnJhZyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgICAgLy8gbXVzdCBiZSBjb3BpZWQgdG8gYXZvaWQgaXRlcmF0aW5nIGEgbXV0YXRpbmcgbGlzdCBvZiBjaGlsZE5vZGVzXG4gICAgICAgIHZhciBjaGlsZHJlbiA9IF8uc2xpY2UoZWwuY2hpbGROb2Rlcyk7XG4gICAgICAgIGNoaWxkcmVuLmZvckVhY2goZnJhZy5hcHBlbmRDaGlsZCwgZnJhZyk7XG4gICAgICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQoZnJhZywgZWwpO1xuICAgICAgICBwYXJlbnQubm9ybWFsaXplKCk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogV3JhcHMgYW4gZWxlbWVudCBpbiBhbm90aGVyIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0gIHtFbGVtZW50fSB3cmFwSW50b0VsXG4gKiBAcGFyYW0gIHtFbGVtZW50fSBlbFxuICovXG5mdW5jdGlvbiB3cmFwSW5FbGVtZW50KHdyYXBJbnRvRWwsIGVsKSB7XG4gICAgdmFyIHBhcmVudCA9IGVsLnBhcmVudE5vZGU7XG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUod3JhcEludG9FbCwgZWwpO1xuICAgICAgICB3cmFwSW50b0VsLmFwcGVuZENoaWxkKGVsKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBUcmltcyBhIHRleHQgbm9kZSBvZiB0cmFpbGluZyBzcGFjZXMsIGFuZCByZXR1cm5zIHRydWUgaWYgYSB0cmltIHdhcyBwZXJmb3JtZWQuXG4gKlxuICogQHBhcmFtICB7VGV4dE5vZGV9IG5vZGVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHRyaW1Ob2RlUmlnaHQobm9kZSkge1xuICAgIHJldHVybiBfdHJpbU5vZGUobm9kZSwgJ3RyaW1SaWdodCcpO1xufVxuXG5cbi8qKlxuICogVHJpbXMgYSB0ZXh0IG5vZGUgb2YgbGVhZGluZyBzcGFjZXMsIGFuZCByZXR1cm5zIHRydWUgaWYgYSB0cmltIHdhcyBwZXJmb3JtZWQuXG4gKlxuICogQHBhcmFtICB7VGV4dE5vZGV9IG5vZGVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHRyaW1Ob2RlTGVmdChub2RlKSB7XG4gICAgcmV0dXJuIF90cmltTm9kZShub2RlLCAndHJpbUxlZnQnKTtcbn1cblxuXG5mdW5jdGlvbiBfdHJpbU5vZGUobm9kZSwgbWV0aG9kTmFtZSkge1xuICAgIHZhciBsZW4gPSBub2RlLmxlbmd0aDtcbiAgICBub2RlLnRleHRDb250ZW50ID0gbm9kZS50ZXh0Q29udGVudFttZXRob2ROYW1lXSgpO1xuICAgIHJldHVybiBsZW4gIT09IG5vZGUubGVuZ3RoO1xufVxuXG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgcmVmZXJlbmNlIHRvIGNvbXBvbmVudCBmcm9tIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0gIHtFbGVtZW50fSBlbFxuICovXG5mdW5jdGlvbiBkZXRhY2hDb21wb25lbnQoZWwpIHtcbiAgICBkZWxldGUgZWxbY29uZmlnLmNvbXBvbmVudFJlZl07XG59XG5cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGNvbnRlbnQgb2YgYSBodG1sIHN0cmluZ1xuICogQHBhcmFtICB7U3RyaW5nfSBzdHIgQW55IHN0cmluZ1xuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBzdHJpbmcgY2xlYW5lZCBvZiBhbnkgaHRtbCBjb250ZW50LlxuICovXG5mdW5jdGlvbiBzdHJpcEh0bWwoc3RyKSB7XG4gICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuICAgIGRpdi5pbm5lckhUTUwgPSBzdHI7XG4gICAgcmV0dXJuIGRpdi50ZXh0Q29udGVudCB8fCAnJztcbn1cblxuXG4vKipcbiAqIENvbnZlbmllbmNlIHdyYXBwZXIgZm9yIG5hdGl2ZSBUcmVlV2Fsa2VyIHRoYXQgYXV0b21hdGljYWxseSB3YWxrcyB0aGUgdHJlZSBhbmQgY2FsbHMgYW4gaXRlcmF0b3IgZnVuY3Rpb24uXG4gKiBUaGlzIHdpbGwgbm90IGl0ZXJhdGUgdGhlIHJvb3QgZWxlbWVudC5cbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSByb290IFRoZSBjb250YWluaW5nIHJvb3QgZWxlbWVudCB0byBiZSB3YWxrZWQuIFdpbGwgbm90IGJlIGl0ZXJhdGVkLlxuICogQHBhcmFtICB7Tm9kZUZpbGVyfSBmaWx0ZXIgQSBOb2RlRmlsdGVyIGNvbnN0YW50LCBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvQVBJL1RyZWVXYWxrZXJcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBpdGVyYXRvciBBIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBlYWNoIG5vZGUuIFJldHVybmluZyAnZmFsc2UnIHdpbGwgYnJlYWsuXG4gKiBAcGFyYW0gIHtPYmplY3R9IGNvbnRleHQgQW4gb3B0aW9uYWwgY29udGV4dCB0byBwYXNzZWQsIGRlZmF1bHRzIHRvIHJvb3QuXG4gKi9cbmZ1bmN0aW9uIHdhbGtUcmVlKHJvb3QsIGZpbHRlciwgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICB2YXIgdHcgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKHJvb3QsIGZpbHRlcik7XG4gICAgd2hpbGUodHcubmV4dE5vZGUoKSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gaXRlcmF0b3IuY2FsbChjb250ZXh0IHx8IHJvb3QsIHR3LmN1cnJlbnROb2RlKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIGJyZWFrO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIFJldHVybnMgYXJyYXkgb2YgY2hpbGQgaW5kZXhlcyBvZiBlbGVtZW50IHBhdGggaW5zaWRlIHJvb3QgZWxlbWVudCBpbiBET00gdHJlZSB1c2luZyBicmVhZHRoIGZpcnN0IHRyZWUgdHJhdmVyc2FsLlxuICogUmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIGVsZW1lbnQgaXMgbm90IGluc2lkZSByb290IGVsZW1lbnQsIDAgaWYgdGhlIHJvb3QgZWxlbWVudCBpdHNlbGYgaXMgcGFzc2VkLlxuICpcbiAqIEBwYXJhbSAge0VsZW1lbnR9IHJvb3RFbCBlbGVtZW50IHRvIHNlYXJjaFxuICogQHBhcmFtICB7RWxlbWVudH0gZWwgZWxlbWVudCB0byBmaW5kIHRoZSBpbmRleCBvZlxuICogQHJldHVybiB7QXJyYXlbTnVtYmVyXX1cbiAqL1xuZnVuY3Rpb24gdHJlZVBhdGhPZihyb290RWwsIGVsKSB7XG4gICAgaWYgKCEgKHJvb3RFbCAmJiByb290RWwuY29udGFpbnMoZWwpKSkgcmV0dXJuO1xuXG4gICAgdmFyIHRyZWVQYXRoID0gW11cbiAgICAgICAgLCBub2RlID0gcm9vdEVsO1xuXG4gICAgd2hpbGUgKG5vZGUgIT0gZWwpIHtcbiAgICAgICAgdmFyIG5vZGVJbmRleCA9IF8uZmluZEluZGV4KG5vZGUuY2hpbGROb2RlcywgY29udGFpbnNFbCk7XG4gICAgICAgIHRyZWVQYXRoLnB1c2gobm9kZUluZGV4KTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1tub2RlSW5kZXhdO1xuICAgIH1cblxuICAgIHJldHVybiB0cmVlUGF0aDtcblxuICAgIGZ1bmN0aW9uIGNvbnRhaW5zRWwoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkLmNvbnRhaW5zKGVsKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGVsZW1lbnQgYXQgZ2l2ZW4gdHJlZSBwYXRoXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSByb290RWxcbiAqIEBwYXJhbSB7QXJyYXlbTnVtYmVyXX0gdHJlZVBhdGhcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gbmVhcmVzdCByZXR1cm4gbmVhcmVzdCBwb3NzaWJsZSBub2RlIGlmIGV4YWN0IG5vZGUgZG9lcyBub3QgZXhpc3RcbiAqIEByZXR1cm4ge05vZGV9XG4gKi9cbmZ1bmN0aW9uIGdldE5vZGVBdFRyZWVQYXRoKHJvb3RFbCwgdHJlZVBhdGgsIG5lYXJlc3QpIHtcbiAgICBpZiAoIXRyZWVQYXRoKSByZXR1cm47XG5cbiAgICB2YXIgbGVuID0gdHJlZVBhdGgubGVuZ3RoO1xuICAgIGlmIChsZW4gPT09IDApIHJldHVybiByb290RWw7XG5cbiAgICB2YXIgbm9kZSA9IHJvb3RFbDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZE5vZGVzO1xuICAgICAgICBpZiAoISBjaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKCEgbmVhcmVzdCkgbm9kZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjaGlsZEluZGV4ID0gdHJlZVBhdGhbaV1cbiAgICAgICAgICAgICwgY2hpbGQgPSBjaGlsZHJlbltjaGlsZEluZGV4XTtcbiAgICAgICAgaWYgKCEgY2hpbGQpIHtcbiAgICAgICAgICAgIG5vZGUgPSBuZWFyZXN0XG4gICAgICAgICAgICAgICAgICAgID8gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBub2RlID0gY2hpbGQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG59XG5cblxuLyoqXG4gKiBJbnNlcnRzIGFuIGVsZW1lbnQgaW5zaWRlIHJvb3QgYXQgYSBnaXZlbiBwYXRoIGluIHRyZWUgKHRoYXQgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgdGhlIGluZGV4IHJldHVybmVkIGJ5IGB0cmVlUGF0aE9mYCBmdW5jdGlvbikuIElmIGVsZW1lbnQgaXMgYWxyZWFkeSBpbiB0aGUgcm9vdCdzIHRyZWUsIGl0IHdpbGwgYmUgcmVtb3ZlZCBmaXJzdCBhbmQgdGhlbiBtb3ZlZCB0byB0aGUgcGFzc2VkIHRyZWVJbmRleFxuICogSW5zZXJ0aW9uIGF0IGluZGV4IDAgaXMgbm90IHBvc3NpYmxlIGFuZCB3aWxsIHJldHVybiB1bmRlZmluZWQgYXMgaXQgd291bGQgbWVhbiByZXBsYWNpbmcgdGhlIHJvb3QgZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHJvb3RFbCBlbGVtZW50IGludG8gd2hpY2ggdG8gaW5zZXJ0XG4gKiBAcGFyYW0ge051bWJlcn0gdHJlZUluZGV4IGluZGV4IGluIERPTSB0cmVlIGluc2lkZSByb290IGVsZW1lbnQgKHNlZSB0cmVlUGF0aE9mKVxuICogQHBhcmFtIHtFbGVtZW50fSBlbCBlbGVtZW50IHRvIGJlIGluc2VydGVkXG4gKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIHdhcyBzdWNjZXNzZnVsbHkgaW5zZXJ0ZWRcbiAqL1xuZnVuY3Rpb24gaW5zZXJ0QXRUcmVlUGF0aChyb290RWwsIHRyZWVQYXRoLCBlbCwgbmVhcmVzdCkge1xuICAgIHZhciB0b05vcm1hbGl6ZSA9IGVsLm5vZGVUeXBlID09IE5vZGUuVEVYVF9OT0RFO1xuICAgIGlmIChyb290RWwuY29udGFpbnMoZWwpKVxuICAgICAgICByZW1vdmVFbGVtZW50KGVsKTsgLy8gY2FuJ3QgdXNlIHJlbW92ZUNoaWxkIGFzIHJvb3RFbCBoZXJlIGlzIG5vdCBhbiBpbW1lZGlhdGUgcGFyZW50XG5cbiAgICBpZiAodHJlZVBhdGgubGVuZ3RoID09IDApIHJldHVybjtcblxuICAgIHZhciBwYXJlbnQgPSBnZXROb2RlQXRUcmVlUGF0aChyb290RWwsIHRyZWVQYXRoLnNsaWNlKDAsIC0xKSwgbmVhcmVzdClcbiAgICAgICAgLCBjaGlsZHJlbiA9IHBhcmVudC5jaGlsZE5vZGVzO1xuXG4gICAgaWYgKCEgY2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKG5lYXJlc3QpIHtcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgY2hpbGRyZW4gPSBwYXJlbnQuY2hpbGROb2RlcztcbiAgICAgICAgfSBlbHNlIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgY2hpbGRJbmRleCA9IHRyZWVQYXRoW3RyZWVQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICwgY2hpbGQgPSBjaGlsZHJlbltjaGlsZEluZGV4XTtcblxuICAgIGlmIChjaGlsZCkge1xuICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGVsLCBjaGlsZCk7XG4gICAgICAgIGlmICh0b05vcm1hbGl6ZSkgcGFyZW50Lm5vcm1hbGl6ZSgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAoY2hpbGRJbmRleCA9PT0gMCB8fCBuZWFyZXN0KSkge1xuICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoZWwpO1xuICAgICAgICBpZiAodG9Ob3JtYWxpemUpIHBhcmVudC5ub3JtYWxpemUoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY2hpbGQgPSBjaGlsZHJlbltjaGlsZEluZGV4IC0gMV07XG4gICAgICAgIGlmIChjaGlsZCB8fCBuZWFyZXN0KSB7XG4gICAgICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoZWwpO1xuICAgICAgICAgICAgaWYgKHRvTm9ybWFsaXplKSBwYXJlbnQubm9ybWFsaXplKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBmaXJzdCB0cmVlIHBhdGggcG9pbnRzIHRvIGEgbm9kZSB3aGljaCBpcyBiZWZvcmUgdGhlIG90aGVyIGluIHRoZSBkb2N1bWVudCBvcmRlci5cbiAqIEBwYXJhbSAge0FycmF5fSAgcGF0aDEgICBBIHRyZWVwYXRoIGFycmF5XG4gKiBAcGFyYW0gIHtBcnJheX0gIHBhdGgyICAgQSB0cmVlcGF0aCBhcnJheVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNUcmVlUGF0aEJlZm9yZShwYXRoMSwgcGF0aDIpIHtcbiAgICB2YXIgaSA9IDBcbiAgICAgICAgLCBpc0JlZm9yZTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGF0aDEpICYmIEFycmF5LmlzQXJyYXkocGF0aDIpKVxuICAgICAgICByZXR1cm4gbG9nZ2VyLmVycm9yKCdpc1RyZWVQYXRoQmVmb3JlOiBPbmUgb3IgYm90aCBwYXRocyBhcmUgbm90IHZhbGlkIHRyZWVwYXRoIGFycmF5cy4nKTtcblxuICAgIGZvciAoaTsgaSA8IHBhdGgxLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwYXRoMVtpXSA8IHBhdGgyW2ldKSB7XG4gICAgICAgICAgICBpc0JlZm9yZSA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmIChwYXRoMVtpXSA+IHBhdGgyW2ldKSB7XG4gICAgICAgICAgICBpc0JlZm9yZSA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGlzQmVmb3JlID09ICd1bmRlZmluZWQnKVxuICAgICAgICBpZiAocGF0aDEubGVuZ3RoIDwgcGF0aDIubGVuZ3RoKVxuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ2lzVHJlZVBhdGhCZWZvcmU6IE9uZSBub2RlIGlzIGluc2lkZSBhbm90aGVyJyk7XG5cbiAgICByZXR1cm4gaXNCZWZvcmUgfHwgZmFsc2U7XG59XG5cblxuLyoqXG4gKiBDb252ZXJ0cyBub24gbGF0aW4gY2hhcmFjdGVycyB0byBIVE1MIGVudGl0eSBjb2Rlcy5cbiAqIEBwYXJhbSAge1N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gY29udmVydFxuICogQHJldHVybiB7U3RyaW5nfSAgICAgdGhlIHN0cmluZyB3aXRoIGh0bWwgZW50aXRpZXNcbiAqL1xuZnVuY3Rpb24gaHRtbEVudGl0aWVzKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1xcdTAwQTAtXFx1OTk5OTk8PlxcJl0vZ2ltLCBmdW5jdGlvbihpKSB7XG4gICAgICAgIHJldHVybiAnJiMnK2kuY2hhckNvZGVBdCgwKSsnOyc7XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gY3JlYXRlVHJlZVdhbGtlcihlbCwgd2hhdFRvU2hvdykge1xuICAgIHdoYXRUb1Nob3cgPSB3aGF0VG9TaG93IHx8IChOb2RlRmlsdGVyLlNIT1dfVEVYVCB8IE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UKTtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihlbCwgd2hhdFRvU2hvdyk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZWZlcmVuY2UgdG8gdGhlIHdpbmRvdyB0aGUgbm9kZSBpcyBpblxuICpcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICogQHJldHVybiB7V2luZG93fVxuICovXG5mdW5jdGlvbiBnZXROb2RlV2luZG93KG5vZGUpIHtcbiAgICB2YXIgZG9jID0gbm9kZS5vd25lckRvY3VtZW50O1xuICAgIHJldHVybiBkb2MgJiYgKGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93KTtcbn1cblxuXG5cbi8qKlxuICogZG8gc29tZXRoaW5nIGZvciBlYWNoIG5vZGVzIGNvbnRhaW5lZCBpbiBhIHJhbmdlXG4gKlxuICogQHBhcmFtIHtyYW5nZX0gYSByYW5nZVxuICogQHBhcmFtIHtjYn0gYSBmdW5jdGlvbiB0YWtpbmcgYSBub2RlIGFzIGFyZ3VtZW50XG5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaE5vZGVzSW5SYW5nZShyYW5nZSwgY2Ipe1xuICAgIHZhciByYW5nZUNvbnRhaW5lciA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyXG4gICAgICAgICwgZG9jID0gcmFuZ2VDb250YWluZXIub3duZXJEb2N1bWVudDtcblxuICAgIGZ1bmN0aW9uIGlzTm9kZUluc2lkZVJhbmdlKG5vZGUpe1xuICAgICAgICB2YXIgbm9kZVJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgdmFyIGlzSW5zaWRlID0gZmFsc2U7XG4gICAgICAgIG5vZGVSYW5nZS5zZWxlY3ROb2RlKG5vZGUpO1xuXG4gICAgICAgIGlmIChub2RlUmFuZ2UuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKHdpbmRvdy5SYW5nZS5TVEFSVF9UT19TVEFSVCwgcmFuZ2UpICE9IC0xXG4gICAgICAgICAgICAmJiBub2RlUmFuZ2UuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKHdpbmRvdy5SYW5nZS5FTkRfVE9fRU5ELCByYW5nZSkgIT0gMSl7XG4gICAgICAgICAgICBpc0luc2lkZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZVJhbmdlLmRldGFjaCgpO1xuICAgICAgICByZXR1cm4gaXNJbnNpZGU7XG4gICAgfVxuXG4gICAgdmFyIHRyZWVXYWxrZXIgPSBkb2MuY3JlYXRlVHJlZVdhbGtlcihyYW5nZUNvbnRhaW5lcixcbiAgICAgICAgICAgIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UIHwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xuXG4gICAgdmFyIGN1cnJlbnROb2RlO1xuICAgIHdoaWxlIChjdXJyZW50Tm9kZSA9IHRyZWVXYWxrZXIubmV4dE5vZGUoKSl7IC8vIHNob3VsZCBiZSBhc3NpZ25tZW50XG4gICAgICAgIGlmIChpc05vZGVJbnNpZGVSYW5nZShjdXJyZW50Tm9kZSkpe1xuICAgICAgICAgICAgY2IoY3VycmVudE5vZGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIGdldCBhbGwgY29tcG9uZW50cyBjb250YWluZWQgaW4gYSByYW5nZVxuICpcbiAqIEBwYXJhbSB7cmFuZ2V9IGEgRE9NIHJhbmdlLlxuICovXG5mdW5jdGlvbiBnZXRDb21wb25lbnRzRnJvbVJhbmdlKHJhbmdlKSB7XG4gICAgdmFyIHdpbiA9IGdldE5vZGVXaW5kb3cocmFuZ2Uuc3RhcnRDb250YWluZXIpXG4gICAgICAgICwgQ29tcG9uZW50ID0gd2luLm1pbG8uQ29tcG9uZW50O1xuXG4gICAgdmFyIGNvbXBvbmVudHMgPSBbXTtcbiAgICBmb3JFYWNoTm9kZXNJblJhbmdlKHJhbmdlLCBmdW5jdGlvbiAobm9kZSl7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICB2YXIgY29tcCA9IENvbXBvbmVudC5nZXRDb21wb25lbnQobm9kZSk7XG4gICAgICAgICAgICBpZiAoY29tcClcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2goY29tcCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBjb21wb25lbnRzO1xufVxuXG4vKipcbiAqIGRlbGV0ZSBhIHJhbmdlXG4gKlxuICogQHBhcmFtIHtyYW5nZX0gZGVsZXRlIGEgRE9NIHJhbmdlIGFuZCBhbGwgdGhlIGNvbXBvbmVudHMgaW5zaWRlXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZVJhbmdlV2l0aENvbXBvbmVudHMocmFuZ2UpIHtcbiAgICB2YXIgY29tcG9uZW50cyA9IGdldENvbXBvbmVudHNGcm9tUmFuZ2UocmFuZ2UpO1xuXG4gICAgY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGNvbXApIHtcbiAgICAgICAgY29tcC5kZXN0cm95KHRydWUpO1xuICAgIH0pO1xuXG4gICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTtcbn1cblxuLyoqXG4gKiBjaGVjayBpZiB0d28gcmFuZ2VzIGFyZSBlcXVpdmFsZW50XG4gKlxuICogQHBhcmFtIHtyYW5nZX0gcmFuZ2UxXG4gKiBAcGFyYW0ge3JhbmdlfSByYW5nZTJcbiAqIEByZXR1cm4ge0Jvb2xlYW59IGFyZSB0aGUgdHdvIHJhbmdlcyBlcXVpdmFsZW50XG4gKi9cbmZ1bmN0aW9uIGFyZVJhbmdlc0VxdWFsKHJhbmdlMSwgcmFuZ2UyKXtcbiAgICByZXR1cm4gcmFuZ2UxLmNvbXBhcmVCb3VuZGFyeVBvaW50cyh3aW5kb3cuUmFuZ2UuU1RBUlRfVE9fU1RBUlQsIHJhbmdlMikgPT0gMCAmJiByYW5nZTEuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKHdpbmRvdy5SYW5nZS5FTkRfVE9fRU5ELCByYW5nZTIpID09IDA7XG59XG5cblxuLyoqXG4gKiBBZGRzIGEgc2luZ2xlIHBpeGVsIGRpdiB0byB0aGUgYm9keSBhdCBhIGdpdmVuIHggYW5kIHkgcG9zaXRpb24uIFVzZWZ1bCBmb3IgZGVidWdnaW5nIHBvc2l0aW9uIHNwZWNpZmljIGNvZGUuXG4gKiBAcGFyYW0ge051bWJlcn0geFxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqL1xuZnVuY3Rpb24gYWRkRGVidWdQb2ludCh4LCB5KSB7XG4gICAgdmFyIGRiRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkYkVsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnd2lkdGg6IDFweDsgaGVpZ2h0OiAxcHg7IHBvc2l0aW9uOmZpeGVkOyBsZWZ0OicreCsncHg7IHRvcDonK3krJ3B4OyBiYWNrZ3JvdW5kLWNvbG9yOnJlZDsgei1pbmRleDogMTAwJyk7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRiRWwpO30sIDIwMCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IERPTUxpc3RlbmVycztcblxuXG5mdW5jdGlvbiBET01MaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMgPSBbXTtcbn1cblxuXG5fLmV4dGVuZFByb3RvKERPTUxpc3RlbmVycywge1xuICAgIGFkZDogRE9NTGlzdGVuZXJzJGFkZCxcbiAgICByZW1vdmU6IERPTUxpc3RlbmVycyRyZW1vdmUsXG4gICAgcmVtb3ZlQWxsOiBET01MaXN0ZW5lcnMkcmVtb3ZlQWxsXG59KTtcblxuXG5mdW5jdGlvbiBET01MaXN0ZW5lcnMkYWRkKHRhcmdldCwgZXZlbnRUeXBlLCBoYW5kbGVyKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMucHVzaCh7XG4gICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSxcbiAgICAgICAgaGFuZGxlcjogaGFuZGxlclxuICAgIH0pO1xuICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlcik7XG59XG5cblxuZnVuY3Rpb24gRE9NTGlzdGVuZXJzJHJlbW92ZSh0YXJnZXQsIGV2ZW50VHlwZSwgaGFuZGxlcikge1xuICAgIHZhciBsaXN0ZW5lciA9IHtcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlLFxuICAgICAgICBoYW5kbGVyOiBoYW5kbGVyXG4gICAgfTtcbiAgICB2YXIgaWR4ID0gXy5maW5kSW5kZXgodGhpcy5saXN0ZW5lcnMsIF8ucGFydGlhbChfLmlzRXF1YWwsIGxpc3RlbmVyKSk7XG5cbiAgICBpZiAoaWR4ID4gLTEpIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgIF9yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIERPTUxpc3RlbmVycyRyZW1vdmVBbGwoKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMuZm9yRWFjaChfcmVtb3ZlTGlzdGVuZXIpO1xuICAgIHRoaXMubGlzdGVuZXJzID0gW107XG59XG5cblxuZnVuY3Rpb24gX3JlbW92ZUxpc3RlbmVyKGwpIHtcbiAgICBsLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGwuZXZlbnRUeXBlLCBsLmhhbmRsZXIpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxubW9kdWxlLmV4cG9ydHMgPSBkb21SZWFkeTtcblxuXG52YXIgZG9tUmVhZHlGdW5jcyA9IFtdXG4gICAgLCBkb21SZWFkeVN1YnNjcmliZWQgPSBmYWxzZTtcblxuXG5mdW5jdGlvbiBkb21SZWFkeShmdW5jKSB7IC8vICwgYXJndW1lbnRzXG4gICAgdmFyIHNlbGYgPSB0aGlzXG4gICAgICAgICwgYXJncyA9IF8uc2xpY2UoYXJndW1lbnRzLCAxKTtcbiAgICBpZiAoaXNSZWFkeS5jYWxsKHRoaXMpKVxuICAgICAgICBjYWxsRnVuYygpO1xuICAgIGVsc2Uge1xuICAgICAgICBpZiAoIWRvbVJlYWR5U3Vic2NyaWJlZCkge1xuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncmVhZHlzdGF0ZWNoYW5nZScsIG9uRG9tUmVhZHkpO1xuICAgICAgICAgICAgZG9tUmVhZHlTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBkb21SZWFkeUZ1bmNzLnB1c2goY2FsbEZ1bmMpOyAvLyBjbG9zdXJlIGlzIGFkZGVkLCBzbyBldmVyeSB0aW1lIGRpZmZlcmVudCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZFxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhbGxGdW5jKCkge1xuICAgICAgICBmdW5jLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBvbkRvbVJlYWR5KCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3JlYWR5c3RhdGVjaGFuZ2UnLCBvbkRvbVJlYWR5KTtcbiAgICBkb21SZWFkeUZ1bmNzLmZvckVhY2goZnVuY3Rpb24oZnVuYykgeyBmdW5jKCk7IH0pO1xufVxuXG5cbl8uZXh0ZW5kKGRvbVJlYWR5LCB7XG4gICAgaXNSZWFkeTogaXNSZWFkeVxufSk7XG5cblxuZnVuY3Rpb24gaXNSZWFkeSgpIHtcbiAgICB2YXIgcmVhZHlTdGF0ZSA9IGRvY3VtZW50LnJlYWR5U3RhdGU7XG4gICAgcmV0dXJuIHJlYWR5U3RhdGUgPT0gJ2xvYWRpbmcnID8gZmFsc2UgOiByZWFkeVN0YXRlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY29tcG9uZW50cy9jX2NsYXNzJylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlciA9IG1pbG9Db3JlLk1lc3NlbmdlclxuICAgICwgZHJhZ0Ryb3BDb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKS5kcmFnRHJvcFxuICAgICwgY29tcG9uZW50TWV0YVJlZ2V4ID0gZHJhZ0Ryb3BDb25maWcuZGF0YVR5cGVzLmNvbXBvbmVudE1ldGFSZWdleFxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBiYXNlMzIgPSByZXF1aXJlKCdiYXNlMzInKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IERyYWdEcm9wO1xuXG5cbi8qKlxuICogV3JhcHBlciBmb3IgZXZlbnQuZGF0YVRyYW5zZmVyIG9mIGRyYWctZHJvcCBIVE1MIEFQSVxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtldmVudH0gRE9NIGV2ZW50XG4gKiBAcmV0dXJuIHtEcmFnRHJvcH1cbiAqL1xuZnVuY3Rpb24gRHJhZ0Ryb3AoZXZlbnQpIHtcbiAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7XG4gICAgdGhpcy5kYXRhVHJhbnNmZXIgPSBldmVudC5kYXRhVHJhbnNmZXI7XG4gICAgdGhpcy50eXBlcyA9IGV2ZW50LmRhdGFUcmFuc2Zlci50eXBlcztcbn1cblxuLyoqXG4gKiBVc2FnZTpcbiAqIHZhciB0ZXN0RFQgPSBuZXcgRHJhZ0Ryb3AoZXZlbnQpO1xuICogdGVzdERULnNldENvbXBvbmVudE1ldGEobmV3Q29tcG9uZW50LCB7dGVzdDogJ3Rlc3QnLCB0ZXN0MjogJ3Rlc3QyJ30pO1xuICogdGVzdERULmdldENvbXBvbmVudE1ldGEoKTtcbiAqL1xuXG5fLmV4dGVuZChEcmFnRHJvcCwge1xuICAgIGNvbXBvbmVudERhdGFUeXBlOiBEcmFnRHJvcCQkY29tcG9uZW50RGF0YVR5cGVcbn0pO1xuXG5fLmV4dGVuZFByb3RvKERyYWdEcm9wLCB7XG4gICAgaXNDb21wb25lbnQ6IERyYWdEcm9wJGlzQ29tcG9uZW50LFxuICAgIGdldENvbXBvbmVudFN0YXRlOiBEcmFnRHJvcCRnZXRDb21wb25lbnRTdGF0ZSxcbiAgICBzZXRDb21wb25lbnRTdGF0ZTogRHJhZ0Ryb3Akc2V0Q29tcG9uZW50U3RhdGUsXG4gICAgZ2V0Q29tcG9uZW50TWV0YTogRHJhZ0Ryb3AkZ2V0Q29tcG9uZW50TWV0YSxcbiAgICBzZXRDb21wb25lbnRNZXRhOiBEcmFnRHJvcCRzZXRDb21wb25lbnRNZXRhLFxuICAgIGdldEFsbG93ZWRFZmZlY3RzOiBEcmFnRHJvcCRnZXRBbGxvd2VkRWZmZWN0cyxcbiAgICBzZXRBbGxvd2VkRWZmZWN0czogRHJhZ0Ryb3Akc2V0QWxsb3dlZEVmZmVjdHMsXG4gICAgZ2V0RHJvcEVmZmVjdDogRHJhZ0Ryb3AkZ2V0RHJvcEVmZmVjdCxcbiAgICBzZXREcm9wRWZmZWN0OiBEcmFnRHJvcCRzZXREcm9wRWZmZWN0LFxuICAgIGlzRWZmZWN0QWxsb3dlZDogRHJhZ0Ryb3AkaXNFZmZlY3RBbGxvd2VkLFxuICAgIGdldERhdGE6IERyYWdEcm9wJGdldERhdGEsXG4gICAgc2V0RGF0YTogRHJhZ0Ryb3Akc2V0RGF0YSxcbiAgICBjbGVhckRhdGE6IERyYWdEcm9wJGNsZWFyRGF0YVxufSk7XG5cblxuZnVuY3Rpb24gRHJhZ0Ryb3AkJGNvbXBvbmVudERhdGFUeXBlKCkge1xuICAgIHJldHVybiBkcmFnRHJvcENvbmZpZy5kYXRhVHlwZXMuY29tcG9uZW50O1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJGlzQ29tcG9uZW50KCkge1xuICAgIHJldHVybiBfLmluZGV4T2YodGhpcy50eXBlcywgRHJhZ0Ryb3AuY29tcG9uZW50RGF0YVR5cGUoKSkgPj0gMDtcbn1cblxuXG5mdW5jdGlvbiBEcmFnRHJvcCRnZXRDb21wb25lbnRTdGF0ZSgpIHtcbiAgICB2YXIgZGF0YVR5cGUgPSBEcmFnRHJvcC5jb21wb25lbnREYXRhVHlwZSgpXG4gICAgICAgICwgc3RhdGVTdHIgPSB0aGlzLmRhdGFUcmFuc2Zlci5nZXREYXRhKGRhdGFUeXBlKVxuICAgICAgICAsIHN0YXRlID0gXy5qc29uUGFyc2Uoc3RhdGVTdHIpO1xuXG4gICAgcmV0dXJuIHN0YXRlO1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJHNldENvbXBvbmVudFN0YXRlKGNvbXBvbmVudCwgc3RhdGVTdHIpe1xuICAgIGlmICghIHN0YXRlU3RyKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGNvbXBvbmVudC5nZXRUcmFuc2ZlclN0YXRlKHsgcmVxdWVzdGVkQnk6ICdkcmFnJyB9KTtcbiAgICAgICAgc3RhdGVTdHIgPSBKU09OLnN0cmluZ2lmeShzdGF0ZSk7XG4gICAgfVxuICAgIHZhciBkYXRhVHlwZSA9IERyYWdEcm9wLmNvbXBvbmVudERhdGFUeXBlKCk7XG5cbiAgICBzdGF0ZVN0ciAmJiB0aGlzLmRhdGFUcmFuc2Zlci5zZXREYXRhKGRhdGFUeXBlLCBzdGF0ZVN0cik7XG4gICAgdGhpcy5kYXRhVHJhbnNmZXIuc2V0RGF0YSgndGV4dC9odG1sJywgY29tcG9uZW50LmVsLm91dGVySFRNTCk7XG4gICAgcmV0dXJuIHN0YXRlU3RyO1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJHNldENvbXBvbmVudE1ldGEoY29tcG9uZW50LCBwYXJhbXMsIGRhdGEpIHtcbiAgICB2YXIgbWV0YSA9IF9jb21wb25lbnRNZXRhKGNvbXBvbmVudCk7XG5cbiAgICB2YXIgcGFyYW1zU3RyID0gXy50b1F1ZXJ5U3RyaW5nKHBhcmFtcyk7XG4gICAgdmFyIGRhdGFUeXBlID0gZHJhZ0Ryb3BDb25maWcuZGF0YVR5cGVzLmNvbXBvbmVudE1ldGFUZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgnJWNsYXNzJywgX2VuY29kZShtZXRhLmNvbXBDbGFzcyB8fCAnJykpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCclbmFtZScsIF9lbmNvZGUobWV0YS5jb21wTmFtZSB8fCAnJykpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCclcGFyYW1zJywgX2VuY29kZShwYXJhbXNTdHIgfHwgJycpKTtcblxuICAgIGlmIChkYXRhICYmIHR5cGVvZiBkYXRhID09ICdvYmplY3QnKSBkYXRhID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG5cbiAgICB0aGlzLmRhdGFUcmFuc2Zlci5zZXREYXRhKGRhdGFUeXBlLCBkYXRhIHx8ICcnKTtcblxuICAgIHJldHVybiBkYXRhVHlwZTtcbn1cblxuXG5mdW5jdGlvbiBfZW5jb2RlKHN0cikge1xuICAgIHJldHVybiBiYXNlMzIuZW5jb2RlKHN0cikudG9Mb3dlckNhc2UoKTtcbn1cblxuXG5mdW5jdGlvbiBfY29tcG9uZW50TWV0YShjb21wb25lbnQpIHtcbiAgICByZXR1cm4gY29tcG9uZW50LnRyYW5zZmVyXG4gICAgICAgICAgICA/IGNvbXBvbmVudC50cmFuc2Zlci5nZXRDb21wb25lbnRNZXRhKClcbiAgICAgICAgICAgIDogeyBcbiAgICAgICAgICAgICAgICBjb21wQ2xhc3M6IGNvbXBvbmVudC5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgICAgICAgICAgIGNvbXBOYW1lOiBjb21wb25lbnQubmFtZVxuICAgICAgICAgICAgfTtcbn1cblxuXG5mdW5jdGlvbiBEcmFnRHJvcCRnZXRDb21wb25lbnRNZXRhKCkge1xuICAgIHZhciBtYXRjaDtcbiAgICB2YXIgbWV0YURhdGFUeXBlID0gXy5maW5kKHRoaXMudHlwZXMsIGZ1bmN0aW9uIChkVHlwZSkge1xuICAgICAgICBtYXRjaCA9IGRUeXBlLm1hdGNoKGNvbXBvbmVudE1ldGFSZWdleCk7XG4gICAgICAgIHJldHVybiAhIW1hdGNoO1xuICAgIH0pO1xuICAgIGlmICghbWV0YURhdGFUeXBlKSByZXR1cm47XG5cbiAgICBmb3IgKHZhciBpPTE7IGk8NDsgaSsrKVxuICAgICAgICBtYXRjaFtpXSA9IGJhc2UzMi5kZWNvZGUobWF0Y2hbaV0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tcENsYXNzOiBtYXRjaFsxXSxcbiAgICAgICAgY29tcE5hbWU6IG1hdGNoWzJdLFxuICAgICAgICBwYXJhbXM6IF8uZnJvbVF1ZXJ5U3RyaW5nKG1hdGNoWzNdKSxcbiAgICAgICAgbWV0YURhdGFUeXBlOiBtZXRhRGF0YVR5cGUsXG4gICAgICAgIG1ldGFEYXRhOiBfLmpzb25QYXJzZSh0aGlzLmRhdGFUcmFuc2Zlci5nZXREYXRhKG1ldGFEYXRhVHlwZSkpIFxuICAgICAgICAgICAgICAgICAgICA/IF8uanNvblBhcnNlKHRoaXMuZGF0YVRyYW5zZmVyLmdldERhdGEobWV0YURhdGFUeXBlKSkgXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5kYXRhVHJhbnNmZXIuZ2V0RGF0YShtZXRhRGF0YVR5cGUpXG4gICAgfTtcbn1cblxuXG4vLyBhcyBkZWZpbmVkIGhlcmU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvRHJhZ0Ryb3AvRHJhZ19PcGVyYXRpb25zI2RyYWdzdGFydFxuZnVuY3Rpb24gRHJhZ0Ryb3AkZ2V0QWxsb3dlZEVmZmVjdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQ7XG59XG5cblxuZnVuY3Rpb24gRHJhZ0Ryb3Akc2V0QWxsb3dlZEVmZmVjdHMoZWZmZWN0cykge1xuICAgIHRoaXMuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSBlZmZlY3RzO1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJGdldERyb3BFZmZlY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3Q7XG59XG5cblxuZnVuY3Rpb24gRHJhZ0Ryb3Akc2V0RHJvcEVmZmVjdChlZmZlY3QpIHtcbiAgICB0aGlzLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gZWZmZWN0O1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJGlzRWZmZWN0QWxsb3dlZChlZmZlY3QpIHtcbiAgICB2YXIgYWxsb3dlZEVmZmVjdHMgPSB0aGlzLmdldEFsbG93ZWRFZmZlY3RzKClcbiAgICAgICAgLCBpc0NvcHkgPSBlZmZlY3QgPT0gJ2NvcHknXG4gICAgICAgICwgaXNNb3ZlID0gZWZmZWN0ID09ICdtb3ZlJ1xuICAgICAgICAsIGlzTGluayA9IGVmZmVjdCA9PSAnbGluaydcbiAgICAgICAgLCBpc0FsbG93ZWQgPSBpc0NvcHkgfHwgaXNMaW5rIHx8IGlzTW92ZTtcblxuICAgIHN3aXRjaCAoYWxsb3dlZEVmZmVjdHMpIHtcbiAgICAgICAgY2FzZSAnY29weSc6XG4gICAgICAgIGNhc2UgJ21vdmUnOlxuICAgICAgICBjYXNlICdsaW5rJzpcbiAgICAgICAgICAgIHJldHVybiBhbGxvd2VkRWZmZWN0cyA9PSBlZmZlY3Q7XG4gICAgICAgIGNhc2UgJ2NvcHlMaW5rJzpcbiAgICAgICAgICAgIHJldHVybiBpc0NvcHkgfHwgaXNMaW5rO1xuICAgICAgICBjYXNlICdjb3B5TW92ZSc6XG4gICAgICAgICAgICByZXR1cm4gaXNDb3B5IHx8IGlzTW92ZTtcbiAgICAgICAgY2FzZSAnbGlua01vdmUnOlxuICAgICAgICAgICAgcmV0dXJuIGlzTGluayB8fCBpc01vdmU7XG4gICAgICAgIGNhc2UgJ2FsbCc6XG4gICAgICAgIGNhc2UgJ3VuaW5pdGlhbGl6ZWQnOlxuICAgICAgICAgICAgcmV0dXJuIGlzQWxsb3dlZDtcbiAgICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJGdldERhdGEoZGF0YVR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhVHJhbnNmZXIuZ2V0RGF0YShkYXRhVHlwZSk7XG59XG5cblxuZnVuY3Rpb24gRHJhZ0Ryb3Akc2V0RGF0YShkYXRhVHlwZSwgZGF0YVN0cikge1xuICAgIHRoaXMuZGF0YVRyYW5zZmVyLnNldERhdGEoZGF0YVR5cGUsIGRhdGFTdHIpO1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJGNsZWFyRGF0YShkYXRhVHlwZSkge1xuICAgIHRoaXMuZGF0YVRyYW5zZmVyLmNsZWFyRGF0YShkYXRhVHlwZSk7XG59XG5cblxuLyoqXG4gKiBEcmFnIGRyb3Agc2VydmljZSBjb21wZW5zYXRpbmcgZm9yIHRoZSBsYWNrIG9mIGNvbW11bmljYXRpb24gZnJvbSBkcm9wIHRhcmdldCB0byBkcmFnIHNvdXJjZSBpbiBET00gQVBJXG4gKi9cbnZhciBkcmFnRHJvcFNlcnZpY2UgPSBuZXcgTWVzc2VuZ2VyO1xuXG52YXIgX2N1cnJlbnREcmFnRHJvcCwgX2N1cnJlbnREcmFnRmFjZXQ7XG5cbl8uZXh0ZW5kKERyYWdEcm9wLCB7XG4gICAgc2VydmljZTogZHJhZ0Ryb3BTZXJ2aWNlLFxuICAgIGRlc3Ryb3k6IERyYWdEcm9wX2Rlc3Ryb3lcbn0pO1xuXG5cbmRyYWdEcm9wU2VydmljZS5vbk1lc3NhZ2VzKHtcbiAgICAvLyBkYXRhIGlzIERyYWdEcm9wRGF0YVRyYW5zZmVyIGluc3RhbmNlXG4gICAgLy8gZmlyZWQgYnkgRHJhZyBmYWNldCBvbiBcImRyYWdzdGFydFwiIGV2ZW50XG4gICAgJ2RyYWdkcm9wc3RhcnRlZCc6IG9uRHJhZ0Ryb3BTdGFydGVkLCBcbiAgICAvLyBkYXRhIGlzIG9iamVjdCB3aXRoIGF0IGxlYXN0IGRyb3BFZmZlY3QgcHJvcGVydHlcbiAgICAvLyBmaXJlZCBieSBEcm9wIGZhY2V0IG9uIFwiZHJvcFwiIGV2ZW50XG4gICAgJ2RyYWdkcm9wY29tcGxldGVkJzogb25EcmFnRHJvcENvbXBsZXRlZCwgXG4gICAgLy8gZmlyZWQgYnkgRHJhZyBmYWNldCBvbiBcImRyYWdlbmRcIiBldmVudCB0byBjb21wbGV0ZSBkcmFnXG4gICAgLy8gaWYgZHJvcCBoYXBwZW5kZWQgaW4gYW5vdGhlciB3aW5kb3cgb3IgaWYgaXQgd2FzIGNhbmNlbGxlZFxuICAgICdjb21wbGV0ZWRyYWdkcm9wJzogb25Db21wbGV0ZURyYWdEcm9wXG59KTtcblxuXG5fLmV4dGVuZChkcmFnRHJvcFNlcnZpY2UsIHtcbiAgICBnZXRDdXJyZW50RHJhZ0Ryb3A6IGdldEN1cnJlbnREcmFnRHJvcFxufSk7XG5cblxuZnVuY3Rpb24gb25EcmFnRHJvcFN0YXJ0ZWQobXNnLCBkYXRhKSB7XG4gICAgX2N1cnJlbnREcmFnRHJvcCA9IGRhdGEuZHJhZ0Ryb3A7XG4gICAgX2N1cnJlbnREcmFnRmFjZXQgPSBkYXRhLmRyYWdGYWNldDtcbn1cblxuXG5mdW5jdGlvbiBvbkRyYWdEcm9wQ29tcGxldGVkKG1zZywgZGF0YSkge1xuICAgIF9jdXJyZW50RHJhZ0ZhY2V0ICYmIF9jdXJyZW50RHJhZ0ZhY2V0LnBvc3RNZXNzYWdlU3luYygnZHJhZ2Ryb3Bjb21wbGV0ZWQnLCBkYXRhKTtcbiAgICBfY3VycmVudERyYWdEcm9wID0gdW5kZWZpbmVkO1xuICAgIF9jdXJyZW50RHJhZ0ZhY2V0ID0gdW5kZWZpbmVkO1xufVxuXG5cbmZ1bmN0aW9uIG9uQ29tcGxldGVEcmFnRHJvcChtc2csIGRhdGEpIHtcbiAgICBpZiAoX2N1cnJlbnREcmFnRHJvcClcbiAgICAgICAgZHJhZ0Ryb3BTZXJ2aWNlLnBvc3RNZXNzYWdlU3luYygnZHJhZ2Ryb3Bjb21wbGV0ZWQnLCBkYXRhKTtcbn1cblxuXG5mdW5jdGlvbiBnZXRDdXJyZW50RHJhZ0Ryb3AoKSB7XG4gICAgcmV0dXJuIF9jdXJyZW50RHJhZ0Ryb3A7XG59XG5cblxuZnVuY3Rpb24gRHJhZ0Ryb3BfZGVzdHJveSgpIHtcbiAgICBkcmFnRHJvcFNlcnZpY2Uub2ZmQWxsKCk7XG59XG4iLCIvLyA8YSBuYW1lPVwidXRpbHMtZXJyb3JcIj48L2E+XG4vLyBtaWxvLnV0aWxzLmVycm9yXG4vLyAtLS0tLS0tLS0tLVxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxuLy8gbW9kdWxlIGV4cG9ydHMgZXJyb3IgY2xhc3NlcyBmb3IgYWxsIG5hbWVzIGRlZmluZWQgaW4gdGhpcyBhcnJheVxudmFyIGVycm9yQ2xhc3NOYW1lcyA9IFsnQWJzdHJhY3RDbGFzcycsICdNaXhpbicsICdNZXNzZW5nZXInLCAnQ29tcG9uZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ0F0dHJpYnV0ZScsICdCaW5kZXInLCAnTG9hZGVyJywgJ01haWxNZXNzYWdlU291cmNlJywgJ0ZhY2V0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ1Njb3BlJywgJ01vZGVsJywgJ0RvbUZhY2V0JywgJ0VkaXRhYmxlRmFjZXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAnTGlzdCcsICdDb25uZWN0b3InLCAnUmVnaXN0cnknLCAnRnJhbWVNZXNzYWdlU291cmNlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ0Ryb3AnLCAnQW5ndWxhcicsICdTdG9yYWdlTWVzc2FnZVNvdXJjZSddO1xuXG52YXIgZXJyb3IgPSB7XG4gICAgdG9CZUltcGxlbWVudGVkOiBlcnJvciR0b0JlSW1wbGVtZW50ZWQsXG4gICAgY3JlYXRlQ2xhc3M6IGVycm9yJGNyZWF0ZUNsYXNzXG59O1xuXG5lcnJvckNsYXNzTmFtZXMuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgZXJyb3JbbmFtZV0gPSBlcnJvciRjcmVhdGVDbGFzcyhuYW1lICsgJ0Vycm9yJyk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBlcnJvcjtcblxuXG5mdW5jdGlvbiBlcnJvciRjcmVhdGVDbGFzcyhlcnJvckNsYXNzTmFtZSkge1xuICAgIHZhciBFcnJvckNsYXNzID0gXy5tYWtlRnVuY3Rpb24oZXJyb3JDbGFzc05hbWUsICdtZXNzYWdlJyxcbiAgICAgICAgICAgICd0aGlzLm5hbWUgPSBcIicgKyBlcnJvckNsYXNzTmFtZSArICdcIjsgXFxcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgXCJUaGVyZSB3YXMgYW4gIGVycm9yXCI7Jyk7XG4gICAgXy5tYWtlU3ViY2xhc3MoRXJyb3JDbGFzcywgRXJyb3IpO1xuXG4gICAgcmV0dXJuIEVycm9yQ2xhc3M7XG59XG5cblxuZnVuY3Rpb24gZXJyb3IkdG9CZUltcGxlbWVudGVkKCkge1xuICAgIHRocm93IG5ldyBlcnJvci5BYnN0cmFjdENsYXNzKCdjYWxsaW5nIHRoZSBtZXRob2Qgb2YgYW4gYWJzY3RyYWN0IGNsYXNzJyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NvbXBvbmVudHMvY19jbGFzcycpXG4gICAgLCBCaW5kQXR0cmlidXRlID0gcmVxdWlyZSgnLi4vYXR0cmlidXRlcy9hX2JpbmQnKVxuICAgICwgYmluZGVyID0gcmVxdWlyZSgnLi4vYmluZGVyJylcbiAgICAsIGRvbVV0aWxzID0gcmVxdWlyZSgnLi9kb20nKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXJcbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG5cbnZhciBjcmVhdGVSYW5nZVBhdGhzID0gX2NyZWF0ZU5vZGVzQW5kUGF0aHNGdW5jKGRvbVV0aWxzLnRyZWVQYXRoT2YpO1xudmFyIGNyZWF0ZVJhbmdlTm9kZXMgPSBfY3JlYXRlTm9kZXNBbmRQYXRoc0Z1bmMoZG9tVXRpbHMuZ2V0Tm9kZUF0VHJlZVBhdGgpO1xuXG5cbnZhciBmcmFnbWVudFV0aWxzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZ2V0U3RhdGU6IGZyYWdtZW50X2dldFN0YXRlLFxuICAgIGdldFN0YXRlQXN5bmM6IGZyYWdtZW50X2dldFN0YXRlQXN5bmMsXG5cbiAgICBleHBhbmRSYW5nZVRvU2libGluZ3M6IGV4cGFuZFJhbmdlVG9TaWJsaW5ncyxcbiAgICBnZXRSYW5nZVNpYmxpbmdzOiBnZXRSYW5nZVNpYmxpbmdzLFxuICAgIGNyZWF0ZVJhbmdlRnJvbVNpYmxpbmdzOiBjcmVhdGVSYW5nZUZyb21TaWJsaW5ncyxcbiAgICBjcmVhdGVSYW5nZUZyb21Ob2RlczogY3JlYXRlUmFuZ2VGcm9tU2libGluZ3MsIC8vIGFsaWFzXG4gICAgY3JlYXRlUmFuZ2VQYXRoczogY3JlYXRlUmFuZ2VQYXRocyxcbiAgICBjcmVhdGVSYW5nZU5vZGVzOiBjcmVhdGVSYW5nZU5vZGVzXG59O1xuXG5cbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGUgc3RhdGUgb2Ygd3JhcHBlZCByYW5nZSB3aXRoIGNvbXBvbmVudHMsIGluY2x1ZGluZyBwYXJ0aWFsbHkgc2VsZWN0ZWQuIFRoZSByYW5nZSB3aWxsIGJlIGNsb25lZCBhbmQgd3JhcHBlZCBpbiBjb21wb25lbnQgd2l0aCBjb250YWluZXIgZmFjZXQgYmVmb3JlIGdldHRpbmcgaXRzIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGxvZyBlcnJvciBhbmQgcmV0dXJuIHVuZGVmaW5lZCBpZiByYW5nZSBoYXMgbm8gY29tbW9uIGFuY2VzdG9yIHRoYXQgaGFzIGNvbXBvbmVudCB3aXRoIGNvbnRhaW5lciBmYWNldFxuICogXG4gKiBAcGFyYW0ge1JhbmdlfSByYW5nZSBET00gUmFuZ2UgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcmVuYW1lQ2hpbGRyZW4gb3B0aW9uYWwgcGFyYW1ldGVyLCBgdHJ1ZWAgdG8gcmVuYW1lIGZyYWdtZW50IGNoaWxkIGNvbXBvbmVudHNcbiAqIEBwYXJhbSB7U3RyaW5nfSB3cmFwcGVyQ2xhc3NOYW1lIG9wdGlvbmFsIHBhcmFtZXRlciB0byB3cmFwIGluIGEgY3VzdG9tIGNvbXBvbmVudCBjbGFzc1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBmcmFnbWVudF9nZXRTdGF0ZShyYW5nZSwgcmVuYW1lQ2hpbGRyZW4sIHdyYXBwZXJDbGFzc05hbWUpIHtcbiAgICB2YXIgcmFuZ2VDb250YWluZXIgPSBfZ2V0UmFuZ2VDb250YWluZXIocmFuZ2UpO1xuICAgIGlmICghIHJhbmdlQ29udGFpbmVyKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignZnJhZ21lbnQuZ2V0U3RhdGU6IHJhbmdlIGhhcyBubyBjb21tb24gY29udGFpbmVyJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZnJhZyA9IHJhbmdlLmNsb25lQ29udGVudHMoKVxuICAgICAgICAsIHdyYXBwZXIgPSBfd3JhcEZyYWdtZW50SW5Db250YWluZXIoZnJhZywgd3JhcHBlckNsYXNzTmFtZSk7XG5cbiAgICBfdHJhbnNmZXJTdGF0ZXMocmFuZ2VDb250YWluZXIsIHdyYXBwZXIpO1xuICAgIGlmIChyZW5hbWVDaGlsZHJlbikgX3JlbmFtZUNoaWxkcmVuKHdyYXBwZXIpO1xuICAgIHZhciB3cmFwcGVyU3RhdGUgPSB3cmFwcGVyLmdldFN0YXRlKCk7XG4gICAgXy5kZWZlck1ldGhvZCh3cmFwcGVyLCAnZGVzdHJveScpO1xuICAgIHJldHVybiB3cmFwcGVyU3RhdGU7XG59XG5cblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZSBzdGF0ZSBvZiB3cmFwcGVkIHJhbmdlIHdpdGggY29tcG9uZW50cywgaW5jbHVkaW5nIHBhcnRpYWxseSBzZWxlY3RlZC4gVGhlIHJhbmdlIHdpbGwgYmUgY2xvbmVkIGFuZCB3cmFwcGVkIGluIGNvbXBvbmVudCB3aXRoIGNvbnRhaW5lciBmYWNldCBiZWZvcmUgZ2V0dGluZyBpdHMgc3RhdGUuXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHJlc3VsdCBhbmQgYW55IGVycm9yIHZpYSBjYWxsYmFjay5cbiAqIFxuICogQHBhcmFtIHtSYW5nZX0gcmFuZ2UgRE9NIFJhbmdlIGluc3RhbmNlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHJlbmFtZUNoaWxkcmVuIG9wdGlvbmFsIHBhcmFtZXRlciwgYHRydWVgIHRvIHJlbmFtZSBmcmFnbWVudCBjaGlsZCBjb21wb25lbnRzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBhbHdheXMgdGhlIGxhc3QgcGFyYW1ldGVyLCBvcHRpb25hbCBwYXJhbWV0ZXJzIGNhbiBiZSBkcm9wcGVkOyByZXN1bHQgaXMgcGFzc2VkIHZpYSBjYWxsYmFjayB3aXRoIGFueSBlcnJvciBhcyBmaXJzdCBwYXJhbWV0ZXJcbiAqL1xuZnVuY3Rpb24gZnJhZ21lbnRfZ2V0U3RhdGVBc3luYyhyYW5nZSwgcmVuYW1lQ2hpbGRyZW4sIGNhbGxiYWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIHJhbmdlQ29udGFpbmVyID0gX2dldFJhbmdlQ29udGFpbmVyKHJhbmdlKTtcbiAgICAgICAgaWYgKCEgcmFuZ2VDb250YWluZXIpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcignZnJhZ21lbnQuZ2V0U3RhdGU6IHJhbmdlIGhhcyBubyBjb21tb24gY29udGFpbmVyJykpO1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBkbyBOT1QgY29ubmVjdCByZXR1cm4gdG8gcHJldmlvdXMgY2FsbGJhY2ssIGdldFN0YXRlIHNob3VsZCByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHJlbmFtZUNoaWxkcmVuID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gcmVuYW1lQ2hpbGRyZW47XG4gICAgICAgICAgICByZW5hbWVDaGlsZHJlbiA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZyYWcgPSByYW5nZS5jbG9uZUNvbnRlbnRzKClcbiAgICAgICAgICAgICwgd3JhcHBlciA9IF93cmFwRnJhZ21lbnRJbkNvbnRhaW5lcihmcmFnKTtcblxuICAgICAgICBfdHJhbnNmZXJTdGF0ZXMocmFuZ2VDb250YWluZXIsIHdyYXBwZXIpO1xuICAgICAgICBfLmRlZmVyKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgd3JhcHBlci5icm9hZGNhc3QoJ3N0YXRlcmVhZHknKTtcbiAgICAgICAgICAgIF8uZGVmZXIoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlbmFtZUNoaWxkcmVuKSBfcmVuYW1lQ2hpbGRyZW4od3JhcHBlcik7XG4gICAgICAgICAgICAgICAgdmFyIHdyYXBwZXJTdGF0ZSA9IHdyYXBwZXIuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICB3cmFwcGVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB3cmFwcGVyU3RhdGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBfd3JhcEZyYWdtZW50SW5Db250YWluZXIoZnJhZywgd3JhcHBlckNsYXNzTmFtZSkge1xuICAgIHZhciB3cmFwRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgICAgICAsIGF0dHIgPSBuZXcgQmluZEF0dHJpYnV0ZSh3cmFwRWwpO1xuXG4gICAgXy5leHRlbmQoYXR0ciwge1xuICAgICAgICBjb21wQ2xhc3M6IHdyYXBwZXJDbGFzc05hbWUgfHwgJ0NvbXBvbmVudCcsXG4gICAgICAgIGNvbXBGYWNldHM6IHdyYXBwZXJDbGFzc05hbWUgPyBbXSA6IFsnY29udGFpbmVyJ10sXG4gICAgICAgIGNvbXBOYW1lOiAnd3JhcHBlcidcbiAgICB9KTtcblxuICAgIGF0dHIuZGVjb3JhdGUoKTtcblxuICAgIHdyYXBFbC5hcHBlbmRDaGlsZChmcmFnKTtcbiAgICB2YXIgc2NvcGUgPSBiaW5kZXIod3JhcEVsKTtcbiAgICByZXR1cm4gc2NvcGUud3JhcHBlcjtcbn1cblxuXG5mdW5jdGlvbiBfZ2V0UmFuZ2VDb250YWluZXIocmFuZ2UpIHtcbiAgICB2YXIgZWwgPSBkb21VdGlscy5jb250YWluaW5nRWxlbWVudChyYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcik7XG4gICAgcmV0dXJuIENvbXBvbmVudC5nZXRDb250YWluaW5nQ29tcG9uZW50KGVsLCB0cnVlLCAnY29udGFpbmVyJyk7XG59XG5cblxuZnVuY3Rpb24gX3RyYW5zZmVyU3RhdGVzKGZyb21Db21wLCB0b0NvbXApIHtcbiAgICB2YXIgZnJvbVNjb3BlID0gZnJvbUNvbXAuY29udGFpbmVyLnNjb3BlO1xuICAgIHRvQ29tcC5jb250YWluZXIuc2NvcGUuX2VhY2goZnVuY3Rpb24odG9DaGlsZENvbXAsIG5hbWUpIHtcbiAgICAgICAgdmFyIGZyb21DaGlsZENvbXAgPSBmcm9tU2NvcGVbbmFtZV07XG4gICAgICAgIGlmICghIGZyb21DaGlsZENvbXApIHJldHVybiBsb2dnZXIuZXJyb3IoJ2ZyYWdtZW50LmdldFN0YXRlOiBjb25wb25lbnQnLCBuYW1lLCAnbm90IGZvdW5kIGluIHJhbmdlJyk7XG4gICAgICAgIHZhciBzdGF0ZSA9IGZyb21DaGlsZENvbXAuX2dldFN0YXRlKHRydWUpO1xuICAgICAgICB0b0NoaWxkQ29tcC5zZXRTdGF0ZShzdGF0ZSk7XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gX3JlbmFtZUNoaWxkcmVuKGNvbXApIHtcbiAgICBjb21wLmNvbnRhaW5lci5zY29wZS5fZWFjaChmdW5jdGlvbihjaGlsZCkge1xuICAgICAgICBjaGlsZC5yZW5hbWUoKTtcbiAgICB9KTtcbn1cblxuXG5mdW5jdGlvbiBleHBhbmRSYW5nZVRvU2libGluZ3MocmFuZ2UpIHtcbiAgICB2YXIgc2libGluZ3MgPSBnZXRSYW5nZVNpYmxpbmdzKHJhbmdlKTtcbiAgICByYW5nZSA9IGNyZWF0ZVJhbmdlRnJvbVNpYmxpbmdzKHNpYmxpbmdzKTtcbiAgICByZXR1cm4gcmFuZ2U7XG59XG5cblxuZnVuY3Rpb24gY3JlYXRlUmFuZ2VGcm9tU2libGluZ3Mobm9kZXMpIHtcbiAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIGlmIChub2Rlcy5zaWJsaW5ncykge1xuICAgICAgICByYW5nZS5zZXRTdGFydEJlZm9yZShub2Rlcy5zdGFydCk7XG4gICAgICAgIHJhbmdlLnNldEVuZEFmdGVyKG5vZGVzLmVuZCk7XG4gICAgfSBlbHNlXG4gICAgICAgIHJhbmdlLnNlbGVjdE5vZGUobm9kZXMuc3RhcnQpO1xuICAgIHJldHVybiByYW5nZTtcbn1cblxuXG5mdW5jdGlvbiBnZXRSYW5nZVNpYmxpbmdzKHJhbmdlKSB7XG4gICAgdmFyIGNvbnRhaW5lck5vZGUgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lclxuICAgICAgICAsIHN0YXJ0Tm9kZSA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyXG4gICAgICAgICwgZW5kTm9kZSA9IHJhbmdlLmVuZENvbnRhaW5lcjtcblxuICAgIGlmIChzdGFydE5vZGUgPT0gZW5kTm9kZSkge1xuICAgICAgICBpZiAoc3RhcnROb2RlICE9IGNvbnRhaW5lck5vZGUpIGxvZ2dlci5lcnJvcignZGVsZXRlU2VsZWN0aW9uQ29tbWFuZCBsb2dpY2FsIGVycm9yOiBzdGFydD09ZW5kLCBidXQgY29udGFpbmVyIGlzIGRpZmZlcmVudCcpO1xuICAgICAgICByZXR1cm4geyBzaWJsaW5nczogZmFsc2UsIHN0YXJ0OiBzdGFydE5vZGUgfTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnROb2RlID09IGNvbnRhaW5lck5vZGUgfHwgZW5kTm9kZSA9PSBjb250YWluZXJOb2RlKVxuICAgICAgICByZXR1cm4geyBzaWJsaW5nczogZmFsc2UsIHN0YXJ0OiBjb250YWluZXJOb2RlIH07XG5cbiAgICB2YXIgc3RhcnRTaWJsaW5nID0gX2ZpbmRDb250YWluaW5nQ2hpbGQoY29udGFpbmVyTm9kZSwgc3RhcnROb2RlKTtcbiAgICB2YXIgZW5kU2libGluZyA9IF9maW5kQ29udGFpbmluZ0NoaWxkKGNvbnRhaW5lck5vZGUsIGVuZE5vZGUpO1xuXG4gICAgaWYgKHN0YXJ0U2libGluZyAmJiBlbmRTaWJsaW5nKSB7XG4gICAgICAgIGlmIChzdGFydFNpYmxpbmcgPT0gZW5kU2libGluZykge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdkZWxldGVTZWxlY3Rpb25Db21tYW5kIGxvZ2ljYWwgZXJyb3I6IHNhbWUgc2libGluZ3MnKTtcbiAgICAgICAgICAgIHJldHVybiB7IHNpYmxpbmdzOiBmYWxzZSwgc3RhcnQ6IHN0YXJ0U2libGluZyB9O1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIHJldHVybiB7IHNpYmxpbmdzOiB0cnVlLCBzdGFydDogc3RhcnRTaWJsaW5nLCBlbmQ6IGVuZFNpYmxpbmcgfTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gX2ZpbmRDb250YWluaW5nQ2hpbGQoY29udGFpbmVyTm9kZSwgc2VsTm9kZSkge1xuICAgIHJldHVybiBfLmZpbmQoY29udGFpbmVyTm9kZS5jaGlsZE5vZGVzLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmNvbnRhaW5zKHNlbE5vZGUpO1xuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIF9jcmVhdGVOb2Rlc0FuZFBhdGhzRnVuYyhmdW5jKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHJvb3RFbCwgZnJvbU9iaikge1xuICAgICAgICB2YXIgdG9PYmogPSB7XG4gICAgICAgICAgICBzaWJsaW5nczogZnJvbU9iai5zaWJsaW5ncyxcbiAgICAgICAgICAgIHN0YXJ0OiBmdW5jKHJvb3RFbCwgZnJvbU9iai5zdGFydClcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRvT2JqLnNpYmxpbmdzKVxuICAgICAgICAgICAgdG9PYmouZW5kID0gZnVuYyhyb290RWwsIGZyb21PYmouZW5kKTtcbiAgICAgICAgcmV0dXJuIHRvT2JqO1xuICAgIH07XG59XG5cblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgZGVwcmVjYXRlID0gcmVxdWlyZSgnLi9kZXByZWNhdGUnKTtcblxuLyoqXG4gKiBgbWlsby51dGlsYFxuICovXG52YXIgdXRpbCA9IHtcbiAgICBsb2dnZXI6IG1pbG9Db3JlLnV0aWwubG9nZ2VyLFxuICAgIHJlcXVlc3Q6IHJlcXVpcmUoJy4vcmVxdWVzdCcpLFxuICAgIHdlYnNvY2tldDogcmVxdWlyZSgnLi93ZWJzb2NrZXQnKSxcbiAgICBjaGVjazogbWlsb0NvcmUudXRpbC5jaGVjayxcbiAgICBlcnJvcjogZGVwcmVjYXRlKHJlcXVpcmUoJy4vZXJyb3InKSwgJ21pbG8udXRpbC5lcnJvciBpcyBERVBSRUNBVEVEIGFuZCB3aWxsIGJlIFJFTU9WRUQgc29vbiEnKSxcbiAgICBjb3VudDogZGVwcmVjYXRlKHJlcXVpcmUoJy4vdW5pcXVlX2lkJyksICdtaWxvLnV0aWwuY291bnQgaXMgREVQUkVDQVRFRCEgVXNlIG1pbG8udXRpbC51bmlxdWVJZCBpbnN0ZWFkJyksXG4gICAgdW5pcXVlSWQ6IHJlcXVpcmUoJy4vdW5pcXVlX2lkJyksXG4gICAgY29tcG9uZW50TmFtZTogcmVxdWlyZSgnLi9jb21wb25lbnRfbmFtZScpLFxuICAgIGRvbTogcmVxdWlyZSgnLi9kb20nKSxcbiAgICBkb21MaXN0ZW5lcnM6IHJlcXVpcmUoJy4vZG9tX2xpc3RlbmVycycpLFxuICAgIHNlbGVjdGlvbjogcmVxdWlyZSgnLi9zZWxlY3Rpb24nKSxcbiAgICBmcmFnbWVudDogcmVxdWlyZSgnLi9mcmFnbWVudCcpLFxuICAgIGpzb25QYXJzZTogZGVwcmVjYXRlKHJlcXVpcmUoJy4vanNvbl9wYXJzZScpLCAnbWlsby51dGlsLmpzb25QYXJzZSBpcyBERVBSRUNBVEVEISBVc2UgXy5qc29uUGFyc2UgaW5zdGVhZCcpLFxuICAgIHN0b3JhZ2U6IHJlcXVpcmUoJy4vc3RvcmFnZScpLFxuICAgIGRvbVJlYWR5OiByZXF1aXJlKCcuL2RvbXJlYWR5JyksXG4gICAgZHJhZ0Ryb3A6IHJlcXVpcmUoJy4vZHJhZ2Ryb3AnKSxcbiAgICBkaWFsb2c6IGRlcHJlY2F0ZShyZXF1aXJlKCcuLi9jb21wb25lbnRzL3VpL2Jvb3RzdHJhcC9EaWFsb2cnKSxcbiAgICAgICAgJ21pbG8udXRpbC5kaWFsb2cgaXMgREVQUkVDQVRFRCEgVXNlIG1pbG8ucmVnaXN0cnkuY29tcG9uZW50cy5nZXQoXFwnTUxEaWFsb2dcXCcpIGluc3RlYWQnKSxcbiAgICBhbGVydDogZGVwcmVjYXRlKHJlcXVpcmUoJy4uL2NvbXBvbmVudHMvdWkvYm9vdHN0cmFwL0FsZXJ0JyksXG4gICAgICAgICdtaWxvLnV0aWwuYWxlcnQgaXMgREVQUkVDQVRFRCEgVXNlIG1pbG8ucmVnaXN0cnkuY29tcG9uZW50cy5nZXQoXFwnTUxBbGVydFxcJykgaW5zdGVhZCcpLFxuICAgIGRlcHJlY2F0ZTogZGVwcmVjYXRlLFxuICAgIGRvVDogbWlsb0NvcmUudXRpbC5kb1QsXG4gICAgZGVzdHJveTogdXRpbF9kZXN0cm95XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHV0aWw7XG5cblxuZnVuY3Rpb24gdXRpbF9kZXN0cm95KCkge1xuICAgIHV0aWwucmVxdWVzdC5kZXN0cm95KCk7XG4gICAgdXRpbC5kcmFnRHJvcC5kZXN0cm95KCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBqc29uUGFyc2U7XG5cblxuLyoqXG4gKiBgbWlsby51dGlsLmpzb25QYXJzZWBcbiAqIFNhZmUgSlNPTi5wYXJzZSwgcmV0dXJucyB1bmRlZmluZWQgaWYgSlNPTi5wYXJzZSB0aHJvd3MgYW4gZXhjZXB0aW9uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciAtIEpTT04gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIG9iamVjdFxuICogQHJldHVybiB7T2JqZWN0fHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24ganNvblBhcnNlKHN0cikge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHN0cik7XG4gICAgfSBjYXRjaCAoZSkge31cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gbWlsby51dGlscy5yZXF1ZXN0XG4vLyAtLS0tLS0tLS0tLVxuXG4vLyBDb252ZW5pZW5jZSBmdW5jdGlvbnMgd3JhcHBpbmcgWE1MSFRUUFJlcXVlc3QgZnVuY3Rpb25hbGl0eS5cblxuLy8gYGBgXG4vLyB2YXIgcmVxdWVzdCA9IG1pbG8udXRpbHMucmVxdWVzdFxuLy8gICAgICwgb3B0czogeyBtZXRob2Q6ICdHRVQnIH07XG5cbi8vIHJlcXVlc3QodXJsLCBvcHRzLCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbi8vICAgICBsb2dnZXIuZGVidWcoZGF0YSk7XG4vLyB9KTtcblxuLy8gcmVxdWVzdC5nZXQodXJsLCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbi8vICAgICBsb2dnZXIuZGVidWcoZGF0YSk7XG4vLyB9KTtcbi8vIGBgYFxuXG4vLyBPbmx5IGdlbmVyaWMgcmVxdWVzdCBhbmQgZ2V0LCBqc29uLCBwb3N0IGNvbnZlbmllbmNlIG1ldGhvZHMgYXJlIGN1cnJlbnRseSBpbXBsZW1lbnRlZC5cblxuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCB1bmlxdWVJZCA9IHJlcXVpcmUoJy4vdW5pcXVlX2lkJylcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVlc3Q7XG5cblxudmFyIF9wZW5kaW5nUmVxdWVzdHMgPSBbXTtcblxudmFyIHByb21pc2VUaGVuID0gY3JlYXRlUHJvbWlzZU92ZXJyaWRlKCd0aGVuJyk7XG52YXIgcHJvbWlzZUNhdGNoID0gY3JlYXRlUHJvbWlzZU92ZXJyaWRlKCdjYXRjaCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB3aGljaCBpcyB1c2VkIHRvIG92ZXJyaWRlIHN0YW5kYXJkIHByb21pc2UgYmVoYXZpb3VyIGFuZCBhbGxvdyBwcm9taXNlIGluc3RhbmNlc1xuICogY3JlYXRlZCB0byBtYWludGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgcmVxdWVzdCBvYmplY3Qgbm8gbWF0dGVyIGlmIC50aGVuKCkgb3IgLmNhdGNoKCkgaXMgY2FsbGVkLlxuICovXG5mdW5jdGlvbiBjcmVhdGVQcm9taXNlT3ZlcnJpZGUoZnVuY3Rpb25OYW1lKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgcHJvbWlzZSA9IFByb21pc2UucHJvdG90eXBlW2Z1bmN0aW9uTmFtZV0uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAga2VlcFJlcXVlc3RPYmplY3QocHJvbWlzZSwgdGhpcy5fcmVxdWVzdCk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiByZXF1ZXN0KHVybCwgb3B0cywgY2FsbGJhY2spIHtcbiAgICBvcHRzLnVybCA9IHVybDtcbiAgICBvcHRzLmNvbnRlbnRUeXBlID0gb3B0cy5jb250ZW50VHlwZSB8fCAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JztcbiAgICBpZiAoX21lc3NlbmdlcikgcmVxdWVzdC5wb3N0TWVzc2FnZVN5bmMoJ3JlcXVlc3QnLCB7IG9wdGlvbnM6IG9wdHMgfSk7XG5cbiAgICB2YXIgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgcmVxLm9wZW4ob3B0cy5tZXRob2QsIG9wdHMudXJsLCB0cnVlKTtcbiAgICByZXEuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgb3B0cy5jb250ZW50VHlwZSk7XG4gICAgc2V0UmVxdWVzdEhlYWRlcnMocmVxLCBvcHRzLmhlYWRlcnMpO1xuXG4gICAgcmVxLnRpbWVvdXQgPSBvcHRzLnRpbWVvdXQgfHwgY29uZmlnLnJlcXVlc3QuZGVmYXVsdHMudGltZW91dDtcbiAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gcmVxLm9udGltZW91dCA9IHJlcS5vbmFib3J0ID0gb25SZWFkeTtcblxuICAgIHZhciB4UHJvbWlzZSA9IF9jcmVhdGVYUHJvbWlzZShyZXEpO1xuXG4gICAgcmVxLnNlbmQoSlNPTi5zdHJpbmdpZnkob3B0cy5kYXRhKSk7XG4gICAgcmVxW2NvbmZpZy5yZXF1ZXN0Lm9wdGlvbnNLZXldID0gb3B0cztcblxuICAgIF9wZW5kaW5nUmVxdWVzdHMucHVzaChyZXEpO1xuXG4gICAgcmV0dXJuIHhQcm9taXNlLnByb21pc2U7XG5cbiAgICBmdW5jdGlvbiBvblJlYWR5KGUpIHtcbiAgICAgICAgX29uUmVhZHkocmVxLCBjYWxsYmFjaywgeFByb21pc2UsIGUudHlwZSk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIF9jcmVhdGVYUHJvbWlzZShyZXF1ZXN0KSB7XG4gICAgdmFyIHJlc29sdmVQcm9taXNlLCByZWplY3RQcm9taXNlO1xuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcbiAgICAgICAgcmVqZWN0UHJvbWlzZSA9IHJlamVjdDtcbiAgICB9KTtcblxuICAgIGtlZXBSZXF1ZXN0T2JqZWN0KHByb21pc2UsIHJlcXVlc3QpO1xuICAgIHByb21pc2UuY2F0Y2goXy5ub29wKTsgLy8gU29tZXRpbWVzIGVycm9ycyBhcmUgaGFuZGxlZCB3aXRoaW4gY2FsbGJhY2tzLCBzbyB1bmNhdWdodCBwcm9taXNlIGVycm9yIG1lc3NhZ2Ugc2hvdWxkIGJlIHN1cHByZXNzZWQuXG5cbiAgICByZXR1cm4ge1xuICAgICAgICBwcm9taXNlOiBwcm9taXNlLFxuICAgICAgICByZXNvbHZlOiByZXNvbHZlUHJvbWlzZSxcbiAgICAgICAgcmVqZWN0OiByZWplY3RQcm9taXNlXG4gICAgfVxufVxuXG4vLyBFbnN1cmVzIHRoYXQgdGhlIHByb21pc2UgKGFuZCBhbnkgcHJvbWlzZXMgY3JlYXRlZCB3aGVuIGNhbGxpbmcgLnRoZW4vLmNhdGNoKSBoYXMgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHJlcXVlc3Qgb2JqZWN0XG5mdW5jdGlvbiBrZWVwUmVxdWVzdE9iamVjdChwcm9taXNlLCByZXF1ZXN0KSB7XG4gICAgcHJvbWlzZS5fcmVxdWVzdCA9IHJlcXVlc3Q7XG4gICAgcHJvbWlzZS50aGVuID0gcHJvbWlzZVRoZW47XG4gICAgcHJvbWlzZS5jYXRjaCA9IHByb21pc2VDYXRjaDtcblxuICAgIHJldHVybiBwcm9taXNlO1xufVxuXG5cbmZ1bmN0aW9uIHNldFJlcXVlc3RIZWFkZXJzKHJlcSwgaGVhZGVycykge1xuICAgIGlmIChoZWFkZXJzKVxuICAgICAgICBfLmVhY2hLZXkoaGVhZGVycywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICAgICAgcmVxLnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0pO1xufVxuXG5mdW5jdGlvbiBfb25SZWFkeShyZXEsIGNhbGxiYWNrLCB4UHJvbWlzZSwgZXZlbnRUeXBlKSB7XG4gICAgaWYgKHJlcS5yZWFkeVN0YXRlICE9IDQpIHJldHVybjtcbiAgICBpZiAoIXJlcS5zdGF0dXMgJiYgZXZlbnRUeXBlID09ICdyZWFkeXN0YXRlY2hhbmdlJykgcmV0dXJuO1xuXG4gICAgXy5zcGxpY2VJdGVtKF9wZW5kaW5nUmVxdWVzdHMsIHJlcSk7XG5cbiAgICB2YXIgZXJyb3I7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKCByZXEuc3RhdHVzID49IDIwMCAmJiByZXEuc3RhdHVzIDwgNDAwICkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSgnc3VjY2VzcycpO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKG51bGwsIHJlcS5yZXNwb25zZVRleHQsIHJlcSk7XG4gICAgICAgICAgICB9IGNhdGNoKGUpIHsgZXJyb3IgPSBlOyB9XG4gICAgICAgICAgICB4UHJvbWlzZS5yZXNvbHZlKHJlcS5yZXNwb25zZVRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGVycm9yUmVhc29uID0gcmVxLnN0YXR1cyB8fCBldmVudFR5cGU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKCdlcnJvcicpO1xuICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKCdlcnJvcicgKyBlcnJvclJlYXNvbik7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soZXJyb3JSZWFzb24sIHJlcS5yZXNwb25zZVRleHQsIHJlcSk7XG4gICAgICAgICAgICB9IGNhdGNoKGUpIHsgZXJyb3IgPSBlOyB9XG4gICAgICAgICAgICB4UHJvbWlzZS5yZWplY3QoeyByZWFzb246IGVycm9yUmVhc29uLCByZXNwb25zZTogcmVxLnJlc3BvbnNlVGV4dCB9KTtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2goZSkge1xuICAgICAgICBlcnJvciA9IGVycm9yIHx8IGU7XG4gICAgfVxuXG4gICAgLy8gbm90IHJlbW92aW5nIHN1YnNjcmlwdGlvbiBjcmVhdGVzIG1lbW9yeSBsZWFrLCBkZWxldGluZyBwcm9wZXJ0eSB3b3VsZCBub3QgcmVtb3ZlIHN1YnNjcmlwdGlvblxuICAgIHJlcS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSByZXEub250aW1lb3V0ID0gcmVxLm9uYWJvcnQgPSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIV9wZW5kaW5nUmVxdWVzdHMubGVuZ3RoKVxuICAgICAgICBwb3N0TWVzc2FnZSgncmVxdWVzdHNjb21wbGV0ZWQnKTtcblxuICAgIGlmIChlcnJvcikgdGhyb3cgbmV3IEVycm9yKCdFeGNlcHRpb246ICcgKyBlcnJvcik7XG5cbiAgICBmdW5jdGlvbiBwb3N0TWVzc2FnZShtc2cpIHtcbiAgICAgICAgaWYgKF9tZXNzZW5nZXIpIHJlcXVlc3QucG9zdE1lc3NhZ2UobXNnLFxuICAgICAgICAgICAgeyBzdGF0dXM6IHN0YXR1cywgcmVzcG9uc2U6IHJlcS5yZXNwb25zZVRleHQgfSk7XG4gICAgfVxufVxuXG5cbl8uZXh0ZW5kKHJlcXVlc3QsIHtcbiAgICBnZXQ6IHJlcXVlc3QkZ2V0LFxuICAgIHBvc3Q6IHJlcXVlc3QkcG9zdCxcbiAgICBqc29uOiByZXF1ZXN0JGpzb24sXG4gICAganNvbnA6IHJlcXVlc3QkanNvbnAsXG4gICAgZmlsZTogcmVxdWVzdCRmaWxlLFxuICAgIHVzZU1lc3NlbmdlcjogcmVxdWVzdCR1c2VNZXNzZW5nZXIsXG4gICAgZGVzdHJveTogcmVxdWVzdCRkZXN0cm95LFxuICAgIHdoZW5SZXF1ZXN0c0NvbXBsZXRlZDogd2hlblJlcXVlc3RzQ29tcGxldGVkXG59KTtcblxuXG52YXIgX21lc3NlbmdlcjtcblxuXG5mdW5jdGlvbiByZXF1ZXN0JHVzZU1lc3NlbmdlcigpIHtcbiAgICBfbWVzc2VuZ2VyID0gbmV3IE1lc3NlbmdlcihyZXF1ZXN0LCBbJ29uJywgJ29uY2UnLCAnb25TeW5jJywgJ29mZicsICdvbk1lc3NhZ2VzJywgJ29mZk1lc3NhZ2VzJywgJ3Bvc3RNZXNzYWdlJywgJ3Bvc3RNZXNzYWdlU3luYyddKTtcbn1cblxuXG5mdW5jdGlvbiByZXF1ZXN0JGdldCh1cmwsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHJlcXVlc3QodXJsLCB7IG1ldGhvZDogJ0dFVCcgfSwgY2FsbGJhY2spO1xufVxuXG5cbmZ1bmN0aW9uIHJlcXVlc3QkcG9zdCh1cmwsIGRhdGEsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHJlcXVlc3QodXJsLCB7IG1ldGhvZDogJ1BPU1QnLCBkYXRhOiBkYXRhIH0sIGNhbGxiYWNrKTtcbn1cblxuXG5mdW5jdGlvbiByZXF1ZXN0JGpzb24odXJsLCBjYWxsYmFjaykge1xuICAgIHZhciBwcm9taXNlID0gcmVxdWVzdCh1cmwsIHsgbWV0aG9kOiAnR0VUJyB9KTtcblxuICAgIHZhciBqc29uUHJvbWlzZSA9IHByb21pc2UudGhlbihKU09OLnBhcnNlKTtcblxuICAgIGlmIChjYWxsYmFjaylcbiAgICAgICAganNvblByb21pc2VcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKGVyckRhdGEpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVyckRhdGEucmVhc29uLCBlcnJEYXRhLnJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4ganNvblByb21pc2U7XG59XG5cblxudmFyIGpzb25wT3B0aW9ucyA9IHsgbWV0aG9kOiAnR0VUJywganNvbnA6IHRydWUgfTtcbmZ1bmN0aW9uIHJlcXVlc3QkanNvbnAodXJsLCBjYWxsYmFjaykge1xuICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKSxcbiAgICAgICAgeFByb21pc2UgPSBfY3JlYXRlWFByb21pc2Uoc2NyaXB0KSxcbiAgICAgICAgaGVhZCA9IHdpbmRvdy5kb2N1bWVudC5oZWFkLFxuICAgICAgICB1bmlxdWVDYWxsYmFjayA9IGNvbmZpZy5yZXF1ZXN0Lmpzb25wQ2FsbGJhY2tQcmVmaXggKyB1bmlxdWVJZCgpO1xuXG4gICAgdmFyIG9wdHMgPSBfLmV4dGVuZCh7IHVybDogdXJsIH0sIGpzb25wT3B0aW9ucyk7XG4gICAgaWYgKF9tZXNzZW5nZXIpIHJlcXVlc3QucG9zdE1lc3NhZ2VTeW5jKCdyZXF1ZXN0JywgeyBvcHRpb25zOiBvcHRzIH0pO1xuXG4gICAgaWYgKCEgXy5pc0VxdWFsKF8ub21pdEtleXMob3B0cywgJ3VybCcpLCBqc29ucE9wdGlvbnMpKVxuICAgICAgICBsb2dnZXIud2FybignSWdub3JlZCBub3QgYWxsb3dlZCByZXF1ZXN0IG9wdGlvbnMgY2hhbmdlIGluIEpTT05QIHJlcXVlc3QgLSBvbmx5IFVSTCBjYW4gYmUgY2hhbmdlZCcpO1xuXG4gICAgdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdObyBKU09OUCByZXNwb25zZSBvciBubyBjYWxsYmFjayBpbiByZXNwb25zZScpO1xuICAgICAgICBfb25SZXN1bHQoZXJyKTtcbiAgICB9LCBjb25maWcucmVxdWVzdC5qc29ucFRpbWVvdXQpO1xuXG4gICAgd2luZG93W3VuaXF1ZUNhbGxiYWNrXSA9IF8ucGFydGlhbChfb25SZXN1bHQsIG51bGwpO1xuXG4gICAgX3BlbmRpbmdSZXF1ZXN0cy5wdXNoKHdpbmRvd1t1bmlxdWVDYWxsYmFja10pO1xuXG4gICAgc2NyaXB0LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JztcbiAgICBzY3JpcHQuc3JjID0gb3B0cy51cmwgKyAob3B0cy51cmwuaW5kZXhPZignPycpID09IC0xID8gJz8nIDogJyYnKSArICdjYWxsYmFjaz0nICsgdW5pcXVlQ2FsbGJhY2s7XG5cbiAgICBoZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG5cbiAgICByZXR1cm4geFByb21pc2UucHJvbWlzZTtcblxuXG4gICAgZnVuY3Rpb24gX29uUmVzdWx0KGVyciwgcmVzdWx0KSB7XG4gICAgICAgIF8uc3BsaWNlSXRlbShfcGVuZGluZ1JlcXVlc3RzLCB3aW5kb3dbdW5pcXVlQ2FsbGJhY2tdKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBvc3RNZXNzYWdlKGVyciA/ICdlcnJvcicgOiAnc3VjY2VzcycsIGVyciwgcmVzdWx0KTtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ05vIEpTT05QIHJlc3BvbnNlIG9yIHRpbWVvdXQnKTtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSgnZXJyb3Jqc29ucHRpbWVvdXQnLCBlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soZXJyLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoKGUpIHsgdmFyIGVycm9yID0gZTsgfVxuICAgICAgICBpZiAoZXJyKSB4UHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgZWxzZSB4UHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG5cbiAgICAgICAgY2xlYW5VcCgpO1xuICAgICAgICBpZiAoIV9wZW5kaW5nUmVxdWVzdHMubGVuZ3RoKVxuICAgICAgICAgICAgcG9zdE1lc3NhZ2UoJ3JlcXVlc3RzY29tcGxldGVkJyk7XG5cbiAgICAgICAgaWYgKGVycm9yKSB0aHJvdyBlcnJvcjtcbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgaGVhZC5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgICAgICBkZWxldGUgd2luZG93W3VuaXF1ZUNhbGxiYWNrXTtcbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIHBvc3RNZXNzYWdlKG1zZywgc3RhdHVzLCByZXN1bHQpIHtcbiAgICAgICAgaWYgKF9tZXNzZW5nZXIpIHJlcXVlc3QucG9zdE1lc3NhZ2UobXNnLFxuICAgICAgICAgICAgeyBzdGF0dXM6IHN0YXR1cywgcmVzcG9uc2U6IHJlc3VsdCB9KTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gcmVxdWVzdCRmaWxlKG9wdHMsIGZpbGVEYXRhLCBjYWxsYmFjaywgcHJvZ3Jlc3MpIHtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT0gJ3N0cmluZycpXG4gICAgICAgIG9wdHMgPSB7IG1ldGhvZDogJ1BPU1QnLCB1cmw6IG9wdHMgfTtcblxuICAgIG9wdHMubWV0aG9kID0gb3B0cy5tZXRob2QgfHwgJ1BPU1QnO1xuICAgIG9wdHMuZmlsZSA9IHRydWU7XG5cbiAgICBpZiAoX21lc3NlbmdlcikgcmVxdWVzdC5wb3N0TWVzc2FnZVN5bmMoJ3JlcXVlc3QnLCB7IG9wdGlvbnM6IG9wdHMgfSk7XG5cbiAgICB2YXIgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgaWYgKHByb2dyZXNzKSByZXEudXBsb2FkLm9ucHJvZ3Jlc3MgPSBwcm9ncmVzcztcblxuICAgIHJlcS5vcGVuKG9wdHMubWV0aG9kLCBvcHRzLnVybCwgdHJ1ZSk7XG4gICAgc2V0UmVxdWVzdEhlYWRlcnMocmVxLCBvcHRzLmhlYWRlcnMpO1xuXG4gICAgcmVxLnRpbWVvdXQgPSBvcHRzLnRpbWVvdXQgfHwgY29uZmlnLnJlcXVlc3QuZGVmYXVsdHMudGltZW91dDtcbiAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gcmVxLm9udGltZW91dCA9IHJlcS5vbmFib3J0ID0gb25SZWFkeTtcblxuICAgIHZhciB4UHJvbWlzZSA9IF9jcmVhdGVYUHJvbWlzZShyZXEpO1xuXG4gICAgaWYgKG9wdHMuYmluYXJ5KVxuICAgICAgICByZXEuc2VuZChmaWxlRGF0YSk7XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlRGF0YSk7XG4gICAgICAgIHJlcS5zZW5kKGZvcm1EYXRhKTtcbiAgICB9XG5cbiAgICBfcGVuZGluZ1JlcXVlc3RzLnB1c2gocmVxKTtcblxuICAgIHJldHVybiB4UHJvbWlzZS5wcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gb25SZWFkeShlKSB7XG4gICAgICAgIGlmIChwcm9ncmVzcykgcmVxLnVwbG9hZC5vbnByb2dyZXNzID0gdW5kZWZpbmVkO1xuICAgICAgICBfb25SZWFkeShyZXEsIGNhbGxiYWNrLCB4UHJvbWlzZSwgZS50eXBlKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gcmVxdWVzdCRkZXN0cm95KCkge1xuICAgIGlmIChfbWVzc2VuZ2VyKSBfbWVzc2VuZ2VyLmRlc3Ryb3koKTtcbiAgICByZXF1ZXN0Ll9kZXN0cm95ZWQgPSB0cnVlO1xufVxuXG5cbmZ1bmN0aW9uIHdoZW5SZXF1ZXN0c0NvbXBsZXRlZChjYWxsYmFjaywgdGltZW91dCkge1xuICAgIGNhbGxiYWNrID0gXy5vbmNlKGNhbGxiYWNrKTtcbiAgICBpZiAodGltZW91dClcbiAgICAgICAgXy5kZWxheShjYWxsYmFjaywgdGltZW91dCwgJ3RpbWVvdXQnKTtcblxuICAgIGlmIChfcGVuZGluZ1JlcXVlc3RzLmxlbmd0aClcbiAgICAgICAgX21lc3Nlbmdlci5vbmNlKCdyZXF1ZXN0c2NvbXBsZXRlZCcsIGNhbGxiYWNrKTtcbiAgICBlbHNlXG4gICAgICAgIF8uZGVmZXIoY2FsbGJhY2spO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBkb21VdGlscyA9IHJlcXVpcmUoJy4uL2RvbScpXG4gICAgLCBjb250YWluaW5nRWxlbWVudCA9IGRvbVV0aWxzLmNvbnRhaW5pbmdFbGVtZW50XG4gICAgLCBzZXRDYXJldFBvc2l0aW9uID0gZG9tVXRpbHMuc2V0Q2FyZXRQb3NpdGlvblxuICAgICwgZ2V0Q29tcG9uZW50c0Zyb21SYW5nZSA9IGRvbVV0aWxzLmdldENvbXBvbmVudHNGcm9tUmFuZ2VcbiAgICAsIGRlbGV0ZVJhbmdlV2l0aENvbXBvbmVudHMgPSBkb21VdGlscy5kZWxldGVSYW5nZVdpdGhDb21wb25lbnRzXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vLi4vY29tcG9uZW50cy9jX2NsYXNzJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxubW9kdWxlLmV4cG9ydHMgPSBUZXh0U2VsZWN0aW9uO1xuXG5cbi8qKlxuICogVGV4dCBzZWxlY3Rpb24gY2xhc3MuXG4gKiBTZXJ2ZXMgYXMgYSBoZWxwZXIgdG8gbWFuYWdlIGN1cnJlbnQgc2VsZWN0aW9uXG4gKiBUaGUgb2JqZWN0IGNhbm5vdCBiZSByZXVzZWQsIGlmIHRoZSBzZWxlY3Rpb24gY2hhbmdlcyBzb21lIG9mIGl0cyBwcm9wZXJ0aWVzIG1heSBjb250YWluIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gcHJldmlvdXMgc2VsZWN0aW9uXG4gKlxuICogQHBhcmFtIHtXaW5kb3d9IHdpbiB3aW5kb3cgaW4gd2hpY2ggdGV4dCBzZWxlY3Rpb24gaXMgcHJvY2Vzc2VkXG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24od2luKSB7XG4gICAgaWYgKCEgdGhpcyBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24pXG4gICAgICAgIHJldHVybiBuZXcgVGV4dFNlbGVjdGlvbih3aW4pO1xuICAgIHRoaXMud2luZG93ID0gd2luIHx8IHdpbmRvdztcbiAgICB0aGlzLmluaXQoKTtcbn1cblxuXG4vKipcbiAqIFRleHRTZWxlY3Rpb24gaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHNlbGVjdGlvbiBzdGFydCBlbGVtZW50XG4gKlxuICogQHJldHVybiB7RWxlbWVudHxudWxsfVxuICovXG52YXIgVGV4dFNlbGVjdGlvbiRzdGFydEVsZW1lbnQgPSBcbiAgICBfLnBhcnRpYWwoX2dldEVsZW1lbnQsICdfc3RhcnRFbGVtZW50JywgJ3N0YXJ0Q29udGFpbmVyJyk7XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyBzZWxlY3Rpb24gZW5kIGVsZW1lbnRcbiAqXG4gKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9XG4gKi9cbnZhciBUZXh0U2VsZWN0aW9uJGVuZEVsZW1lbnQgPSBcbiAgICBfLnBhcnRpYWwoX2dldEVsZW1lbnQsICdfZW5kRWxlbWVudCcsICdlbmRDb250YWluZXInKTtcblxuXG4vKipcbiAqIFRleHRTZWxlY3Rpb24gaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHNlbGVjdGlvbiBlbmQgZWxlbWVudFxuICpcbiAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAqL1xudmFyIFRleHRTZWxlY3Rpb24kY29udGFpbmluZ0VsZW1lbnQgPSBcbiAgICBfLnBhcnRpYWwoX2dldEVsZW1lbnQsICdfY29udGFpbmluZ0VsZW1lbnQnLCAnY29tbW9uQW5jZXN0b3JDb250YWluZXInKTtcblxuXG4vKipcbiAqIFRleHRTZWxlY3Rpb24gaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHNlbGVjdGlvbiBzdGFydCBDb21wb25lbnRcbiAqXG4gKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gKi9cbnZhciBUZXh0U2VsZWN0aW9uJHN0YXJ0Q29tcG9uZW50ID0gXG4gICAgXy5wYXJ0aWFsKF9nZXRDb21wb25lbnQsICdfc3RhcnRDb21wb25lbnQnLCAnc3RhcnRFbGVtZW50Jyk7XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyBzZWxlY3Rpb24gZW5kIENvbXBvbmVudFxuICpcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xudmFyIFRleHRTZWxlY3Rpb24kZW5kQ29tcG9uZW50ID0gXG4gICAgXy5wYXJ0aWFsKF9nZXRDb21wb25lbnQsICdfZW5kQ29tcG9uZW50JywgJ2VuZEVsZW1lbnQnKTtcblxuXG4vKipcbiAqIFRleHRTZWxlY3Rpb24gaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHNlbGVjdGlvbiBlbmQgQ29tcG9uZW50XG4gKlxuICogQHJldHVybiB7Q29tcG9uZW50fVxuICovXG52YXIgVGV4dFNlbGVjdGlvbiRjb250YWluaW5nQ29tcG9uZW50ID0gXG4gICAgXy5wYXJ0aWFsKF9nZXRDb21wb25lbnQsICdfY29udGFpbmluZ0NvbXBvbmVudCcsICdjb250YWluaW5nRWxlbWVudCcpO1xuXG5cbl8uZXh0ZW5kUHJvdG8oVGV4dFNlbGVjdGlvbiwge1xuICAgIGluaXQ6IFRleHRTZWxlY3Rpb24kaW5pdCxcbiAgICB0ZXh0OiBUZXh0U2VsZWN0aW9uJHRleHQsXG4gICAgdGV4dE5vZGVzOiBUZXh0U2VsZWN0aW9uJHRleHROb2RlcyxcbiAgICBjbGVhcjogVGV4dFNlbGVjdGlvbiRjbGVhcixcblxuICAgIHN0YXJ0RWxlbWVudDogVGV4dFNlbGVjdGlvbiRzdGFydEVsZW1lbnQsXG4gICAgZW5kRWxlbWVudDogVGV4dFNlbGVjdGlvbiRlbmRFbGVtZW50LFxuICAgIGNvbnRhaW5pbmdFbGVtZW50OiBUZXh0U2VsZWN0aW9uJGNvbnRhaW5pbmdFbGVtZW50LFxuXG4gICAgc3RhcnRDb21wb25lbnQ6IFRleHRTZWxlY3Rpb24kc3RhcnRDb21wb25lbnQsXG4gICAgZW5kQ29tcG9uZW50OiBUZXh0U2VsZWN0aW9uJGVuZENvbXBvbmVudCxcbiAgICBjb250YWluaW5nQ29tcG9uZW50OiBUZXh0U2VsZWN0aW9uJGNvbnRhaW5pbmdDb21wb25lbnQsXG5cbiAgICBjb250YWluZWRDb21wb25lbnRzOiBUZXh0U2VsZWN0aW9uJGNvbnRhaW5lZENvbXBvbmVudHMsXG4gICAgZWFjaENvbnRhaW5lZENvbXBvbmVudDogVGV4dFNlbGVjdGlvbiRlYWNoQ29udGFpbmVkQ29tcG9uZW50LFxuICAgIGRlbDogVGV4dFNlbGVjdGlvbiRkZWwsXG4gICAgX2dldFBvc3REZWxldGVTZWxlY3Rpb25Qb2ludDogX2dldFBvc3REZWxldGVTZWxlY3Rpb25Qb2ludCxcbiAgICBfc2VsZWN0QWZ0ZXJEZWxldGU6IF9zZWxlY3RBZnRlckRlbGV0ZSxcblxuICAgIGdldFJhbmdlOiBUZXh0U2VsZWN0aW9uJGdldFJhbmdlLFxuICAgIGdldFN0YXRlOiBUZXh0U2VsZWN0aW9uJGdldFN0YXRlLFxuICAgIGdldE5vcm1hbGl6ZWRSYW5nZTogVGV4dFNlbGVjdGlvbiQkZ2V0Tm9ybWFsaXplZFJhbmdlLFxuICAgIGdldERpcmVjdGlvbjogVGV4dFNlbGVjdGlvbiQkZ2V0RGlyZWN0aW9uXG59KTtcblxuXG5fLmV4dGVuZChUZXh0U2VsZWN0aW9uLCB7XG4gICAgY3JlYXRlRnJvbVJhbmdlOiBUZXh0U2VsZWN0aW9uJCRjcmVhdGVGcm9tUmFuZ2UsXG4gICAgY3JlYXRlRnJvbVN0YXRlOiBUZXh0U2VsZWN0aW9uJCRjcmVhdGVGcm9tU3RhdGUsXG4gICAgY3JlYXRlU3RhdGVPYmplY3Q6IFRleHRTZWxlY3Rpb24kJGNyZWF0ZVN0YXRlT2JqZWN0XG59KTtcblxuXG4vKipcbiAqIFRleHRTZWxlY3Rpb24gaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXplcyBUZXh0U2VsZWN0aW9uIGZyb20gdGhlIGN1cnJlbnQgc2VsZWN0aW9uXG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kaW5pdCgpIHtcbiAgICB0aGlzLnNlbGVjdGlvbiA9IHRoaXMud2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICh0aGlzLnNlbGVjdGlvbi5yYW5nZUNvdW50KVxuICAgICAgICB0aGlzLnJhbmdlID0gdGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICB0aGlzLmlzQ29sbGFwc2VkID0gdGhpcy5zZWxlY3Rpb24uaXNDb2xsYXBzZWQ7XG59XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogUmV0cmlldmVzIGFuZCByZXR1cm5zIHNlbGVjdGlvbiB0ZXh0XG4gKlxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBUZXh0U2VsZWN0aW9uJHRleHQoKSB7XG4gICAgaWYgKCEgdGhpcy5yYW5nZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGlmICghIHRoaXMuX3RleHQpXG4gICAgICAgIHRoaXMuX3RleHQgPSB0aGlzLnJhbmdlLnRvU3RyaW5nKCk7XG5cbiAgICByZXR1cm4gdGhpcy5fdGV4dDtcbn1cblxuXG4vKipcbiAqIFRleHRTZWxlY3Rpb24gaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXRyaWV2ZXMgYW5kIHJldHVybnMgc2VsZWN0aW9uIHRleHQgbm9kZXNcbiAqXG4gKiBAcmV0dXJuIHtBcnJheVtOb2RlXX1cbiAqL1xuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiR0ZXh0Tm9kZXMoKSB7XG4gICAgaWYgKCEgdGhpcy5yYW5nZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGlmICghIHRoaXMuX3RleHROb2RlcylcbiAgICAgICAgdGhpcy5fdGV4dE5vZGVzID0gX2dldFRleHROb2Rlcy5jYWxsKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLl90ZXh0Tm9kZXM7XG59XG5cblxuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiRjbGVhcigpIHtcbiAgICB0aGlzLnNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbn1cblxuXG4vKipcbiAqIFJldHJpZXZlcyB0ZXh0IGFuZCB0ZXh0IG5vZGVzIGZyb20gc2VsZWN0aW9uIHNhdmluZyB0aGVtIG9uIHByb3BlcnRpZXMgb2Ygb2JqZWN0XG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7VGV4dFNlbGVjdGlvbn0gdGhpc1xuICovXG5mdW5jdGlvbiBfZ2V0VGV4dE5vZGVzKCkge1xuICAgIC8vIGxpc3Qgb2Ygc2VsZWN0ZWQgdGV4dCBub2Rlc1xuICAgIHZhciB0ZXh0Tm9kZXMgPSBbXTtcblxuICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkKVxuICAgICAgICByZXR1cm4gdGV4dE5vZGVzO1xuXG4gICAgLy8gY3JlYXRlIFRyZWVXYWxrZXIgdG8gdHJhdmVyc2UgdGhlIHRyZWUgdG8gc2VsZWN0IGFsbCB0ZXh0IG5vZGVzXG4gICAgdmFyIHNlbFN0YXJ0ID0gdGhpcy5yYW5nZS5zdGFydENvbnRhaW5lclxuICAgICAgICAsIHNlbEVuZCA9IHRoaXMucmFuZ2UuZW5kQ29udGFpbmVyXG4gICAgICAgICwgcmFuZ2VDb250YWluZXIgPSB0aGlzLnJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgdmFyIHRyZWVXYWxrZXIgPSB0aGlzLndpbmRvdy5kb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKHJhbmdlQ29udGFpbmVyLCBOb2RlRmlsdGVyLlNIT1dfVEVYVCk7XG4gICAgdmFyIG5vZGUgPSB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gc2VsU3RhcnQ7XG5cbiAgICAvLyB0cmF2ZXJzZSBET00gdHJlZSB0byBjb2xsZWN0IGFsbCBzZWxlY3RlZCB0ZXh0IG5vZGVzXG4gICAgd2hpbGUgKG5vZGUgJiYgKCEgaW5FbmQgfHwgc2VsRW5kLmNvbnRhaW5zKG5vZGUpKSkge1xuICAgICAgICB0ZXh0Tm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgdmFyIGluRW5kID0gaW5FbmQgfHwgc2VsRW5kLmNvbnRhaW5zKG5vZGUpO1xuICAgICAgICBub2RlID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGV4dE5vZGVzO1xufVxuXG5cbi8qKlxuICogUmV0cmlldmVzIGFuZCByZXR1cm5zIHN0YXJ0L2VuZCBlbGVtZW50IGZyb20gc2VsZWN0aW9uIHNhdmluZyB0aGVtIG9uIHByb3BlcnRpZXMgb2Ygb2JqZWN0XG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7VGV4dFNlbGVjdGlvbn0gdGhpc1xuICogQHJldHVybiB7RWxlbWVudHxudWxsfVxuICovXG5mdW5jdGlvbiBfZ2V0RWxlbWVudCh0aGlzUHJvcE5hbWUsIHJhbmdlUHJvcE5hbWUpIHtcbiAgICBpZiAoISB0aGlzLnJhbmdlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgaWYgKHR5cGVvZiB0aGlzW3RoaXNQcm9wTmFtZV0gPT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHRoaXNbdGhpc1Byb3BOYW1lXSA9IGNvbnRhaW5pbmdFbGVtZW50KHRoaXMucmFuZ2VbcmFuZ2VQcm9wTmFtZV0pO1xuICAgIHJldHVybiB0aGlzW3RoaXNQcm9wTmFtZV07XG59XG5cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW5kIHJldHVybnMgc3RhcnQvZW5kIGNvbXBvbmVudCBmcm9tIHNlbGVjdGlvbiBzYXZpbmcgdGhlbSBvbiBwcm9wZXJ0aWVzIG9mIG9iamVjdFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1RleHRTZWxlY3Rpb259IHRoaXNcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xuZnVuY3Rpb24gX2dldENvbXBvbmVudCh0aGlzUHJvcE5hbWUsIGVsTWV0aG9kTmFtZSkge1xuICAgIGlmICghIHRoaXMucmFuZ2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBpZiAodHlwZW9mIHRoaXNbdGhpc1Byb3BOYW1lXSA9PSAndW5kZWZpbmVkJylcbiAgICAgICAgdGhpc1t0aGlzUHJvcE5hbWVdID0gQ29tcG9uZW50LmdldENvbnRhaW5pbmdDb21wb25lbnQodGhpc1tlbE1ldGhvZE5hbWVdKCkpO1xuICAgIHJldHVybiB0aGlzW3RoaXNQcm9wTmFtZV07XG59XG5cblxuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiRjb250YWluZWRDb21wb25lbnRzKCkge1xuICAgIGlmICh0aGlzLl9jb250YWluZWRDb21wb25lbnRzKVxuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVkQ29tcG9uZW50cztcblxuICAgIHZhciBjb21wb25lbnRzID0gdGhpcy5fY29udGFpbmVkQ29tcG9uZW50cyA9IFtdO1xuXG4gICAgaWYgKHRoaXMuaXNDb2xsYXBzZWQgfHwgISB0aGlzLnJhbmdlKSByZXR1cm4gY29tcG9uZW50cztcblxuICAgIHJldHVybiBnZXRDb21wb25lbnRzRnJvbVJhbmdlKHRoaXMucmFuZ2UpO1xufVxuXG5cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kZWFjaENvbnRhaW5lZENvbXBvbmVudChjYWxsYmFjaywgdGhpc0FyZykge1xuICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkIHx8ICEgdGhpcy5yYW5nZSkgcmV0dXJuO1xuXG4gICAgdmFyIGNvbXBvbmVudHMgPSB0aGlzLmNvbnRhaW5lZENvbXBvbmVudHMoKTtcblxuICAgIGNvbXBvbmVudHMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7XG59XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogRGVsZXRlcyB0aGUgY3VycmVudCBzZWxlY3Rpb24gYW5kIGFsbCBjb21wb25lbnRzIGluIGl0XG4gKiBcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gc2VsZWN0RW5kQ29udGFpbmVyIHNldCB0byB0cnVlIGlmIHRoZSBlbmQgY29udGFpbmVyIHNob3VsZCBiZSBzZWxlY3RlZCBhZnRlciBkZWxldGlvblxuICovXG5mdW5jdGlvbiBUZXh0U2VsZWN0aW9uJGRlbChzZWxlY3RFbmRDb250YWluZXIpIHtcbiAgICBpZiAodGhpcy5pc0NvbGxhcHNlZCB8fCAhIHRoaXMucmFuZ2UpIHJldHVybjtcblxuICAgIHZhciBzZWxQb2ludCA9IHRoaXMuX2dldFBvc3REZWxldGVTZWxlY3Rpb25Qb2ludChzZWxlY3RFbmRDb250YWluZXIpO1xuXG4gICAgZGVsZXRlUmFuZ2VXaXRoQ29tcG9uZW50cyh0aGlzLnJhbmdlKTtcblxuICAgIHRoaXMuX3NlbGVjdEFmdGVyRGVsZXRlKHNlbFBvaW50KTtcbiAgICBzZWxQb2ludC5ub2RlLnBhcmVudE5vZGUubm9ybWFsaXplKCk7XG59XG5cblxuZnVuY3Rpb24gX2dldFBvc3REZWxldGVTZWxlY3Rpb25Qb2ludChzZWxlY3RFbmRDb250YWluZXIpIHtcbiAgICB2YXIgc2VsTm9kZSA9IHRoaXMucmFuZ2Uuc3RhcnRDb250YWluZXI7XG4gICAgdmFyIHNlbE9mZnNldCA9IHRoaXMucmFuZ2Uuc3RhcnRPZmZzZXQ7XG4gICAgaWYgKHNlbGVjdEVuZENvbnRhaW5lciAmJiB0aGlzLnJhbmdlLnN0YXJ0Q29udGFpbmVyICE9IHRoaXMucmFuZ2UuZW5kQ29udGFpbmVyKSB7XG4gICAgICAgIHNlbE5vZGUgPSB0aGlzLnJhbmdlLmVuZENvbnRhaW5lcjtcbiAgICAgICAgc2VsT2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIHsgbm9kZTogc2VsTm9kZSwgb2Zmc2V0OiBzZWxPZmZzZXQgfTtcbn1cblxuXG5mdW5jdGlvbiBfc2VsZWN0QWZ0ZXJEZWxldGUoc2VsUG9pbnQpIHtcbiAgICB2YXIgc2VsTm9kZSA9IHNlbFBvaW50Lm5vZGVcbiAgICAgICAgLCBzZWxPZmZzZXQgPSBzZWxQb2ludC5vZmZzZXQ7XG5cbiAgICBpZiAoIXNlbE5vZGUpIHJldHVybjtcbiAgICBpZiAoc2VsTm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSlcbiAgICAgICAgc2VsTm9kZS50ZXh0Q29udGVudCA9IHNlbE5vZGUudGV4dENvbnRlbnQudHJpbVJpZ2h0KCk7XG4gICAgaWYgKCFzZWxOb2RlLm5vZGVWYWx1ZSlcbiAgICAgICAgc2VsTm9kZS5ub2RlVmFsdWUgPSAnXFx1MDBBMCc7IC8vbm9uLWJyZWFraW5nIHNwYWNlLCBcXHUyMDBCIGZvciB6ZXJvIHdpZHRoIHNwYWNlO1xuXG4gICAgdmFyIHBvc2l0aW9uID0gc2VsT2Zmc2V0ID4gc2VsTm9kZS5sZW5ndGggPyBzZWxOb2RlLmxlbmd0aCA6IHNlbE9mZnNldDtcbiAgICBzZXRDYXJldFBvc2l0aW9uKHNlbE5vZGUsIHBvc2l0aW9uKTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgc2VsZWN0aW9uIHJhbmdlXG4gKlxuICogQHJldHVybiB7UmFuZ2V9XG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kZ2V0UmFuZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZ2U7XG59XG5cblxuLyoqXG4gKiBTdG9yZXMgc2VsZWN0aW9uIHdpbmRvdywgbm9kZXMgYW5kIG9mZnNldHMgaW4gb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kZ2V0U3RhdGUocm9vdEVsKSB7XG4gICAgdmFyIHIgPSB0aGlzLnJhbmdlO1xuICAgIHZhciBkb2MgPSByb290RWwub3duZXJEb2N1bWVudFxuICAgICAgICAsIHdpbiA9IGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93O1xuICAgIGlmICghcikgcmV0dXJuIHsgd2luZG93OiB3aW4gfTtcbiAgICByZXR1cm4gVGV4dFNlbGVjdGlvbi5jcmVhdGVTdGF0ZU9iamVjdChyb290RWwsIHIuc3RhcnRDb250YWluZXIsIHIuc3RhcnRPZmZzZXQsIHIuZW5kQ29udGFpbmVyLCByLmVuZE9mZnNldCk7XG59XG5cblxuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiQkY3JlYXRlU3RhdGVPYmplY3Qocm9vdEVsLCBzdGFydENvbnRhaW5lciwgc3RhcnRPZmZzZXQsIGVuZENvbnRhaW5lciwgZW5kT2Zmc2V0KSB7XG4gICAgZW5kQ29udGFpbmVyID0gZW5kQ29udGFpbmVyIHx8IHN0YXJ0Q29udGFpbmVyO1xuICAgIGVuZE9mZnNldCA9IGVuZE9mZnNldCB8fCBzdGFydE9mZnNldDtcbiAgICB2YXIgZG9jID0gcm9vdEVsLm93bmVyRG9jdW1lbnRcbiAgICAgICAgLCB3aW4gPSBkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdztcbiAgICByZXR1cm4ge1xuICAgICAgICB3aW5kb3c6IHdpbixcbiAgICAgICAgcm9vdEVsOiByb290RWwsXG4gICAgICAgIHN0YXJ0OiBfZ2V0U2VsZWN0aW9uUG9pbnRTdGF0ZShyb290RWwsIHN0YXJ0Q29udGFpbmVyLCBzdGFydE9mZnNldCksXG4gICAgICAgIGVuZDogX2dldFNlbGVjdGlvblBvaW50U3RhdGUocm9vdEVsLCBlbmRDb250YWluZXIsIGVuZE9mZnNldClcbiAgICB9O1xufVxuXG5cbmZ1bmN0aW9uIF9nZXRTZWxlY3Rpb25Qb2ludFN0YXRlKHJvb3RFbCwgbm9kZSwgb2Zmc2V0KSB7XG4gICAgdmFyIHRyZWVQYXRoID0gZG9tVXRpbHMudHJlZVBhdGhPZihyb290RWwsIG5vZGUpO1xuICAgIGlmICghIHRyZWVQYXRoKSBsb2dnZXIuZXJyb3IoJ1NlbGVjdGlvbiBwb2ludCBpcyBvdXRzaWRlIG9mIHJvb3QgZWxlbWVudCcpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHRyZWVQYXRoOiB0cmVlUGF0aCxcbiAgICAgICAgb2Zmc2V0OiBvZmZzZXRcbiAgICB9O1xufVxuXG5cbi8qKlxuICogUmVzdG9yZXMgYWN0dWFsIHNlbGVjdGlvbiB0byB0aGUgc3RvcmVkIHJhbmdlXG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kJGNyZWF0ZUZyb21TdGF0ZShzdGF0ZSkge1xuICAgIHZhciBkb21VdGlscyA9IHN0YXRlLndpbmRvdy5taWxvLnV0aWwuZG9tO1xuXG4gICAgaWYgKHN0YXRlLnJvb3RFbCAmJiBzdGF0ZS5zdGFydCAmJiBzdGF0ZS5lbmQpIHtcbiAgICAgICAgdmFyIHN0YXJ0Tm9kZSA9IF9zZWxlY3Rpb25Ob2RlRnJvbVN0YXRlKHN0YXRlLnJvb3RFbCwgc3RhdGUuc3RhcnQpXG4gICAgICAgICAgICAsIGVuZE5vZGUgPSBfc2VsZWN0aW9uTm9kZUZyb21TdGF0ZShzdGF0ZS5yb290RWwsIHN0YXRlLmVuZCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRvbVV0aWxzLnNldFNlbGVjdGlvbihzdGFydE5vZGUsIHN0YXRlLnN0YXJ0Lm9mZnNldCwgZW5kTm9kZSwgc3RhdGUuZW5kLm9mZnNldCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRleHRTZWxlY3Rpb24oc3RhdGUud2luZG93KTtcbiAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1RleHQgc2VsZWN0aW9uOiBjYW5cXCd0IGNyZWF0ZSBzZWxlY3Rpb24nLCBlLCBlLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZG9tVXRpbHMuY2xlYXJTZWxlY3Rpb24oc3RhdGUud2luZG93KTtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXh0U2VsZWN0aW9uKHN0YXRlLndpbmRvdyk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIF9zZWxlY3Rpb25Ob2RlRnJvbVN0YXRlKHJvb3RFbCwgcG9pbnRTdGF0ZSkge1xuICAgIHZhciBub2RlID0gZG9tVXRpbHMuZ2V0Tm9kZUF0VHJlZVBhdGgocm9vdEVsLCBwb2ludFN0YXRlLnRyZWVQYXRoKTtcbiAgICBpZiAoISBub2RlKSBsb2dnZXIuZXJyb3IoJ1RleHRTZWxlY3Rpb24gY3JlYXRlRnJvbVN0YXRlOiBubyBub2RlIGF0IHRyZWVQYXRoJyk7XG4gICAgcmV0dXJuIG5vZGU7XG59XG5cblxuLyoqXG4gKiBDcmVhdGVzIHNlbGVjdGlvbiBmcm9tIHBhc3NlZCByYW5nZVxuICogXG4gKiBAcGFyYW0ge1JhbmdlfSByYW5nZVxuICogQHBhcmFtIHtCb29sZWFufSBiYWNrd2FyZFxuICpcbiAqIEByZXR1cm4ge1RleHRTZWxlY3Rpb259XG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kJGNyZWF0ZUZyb21SYW5nZShyYW5nZSwgYmFja3dhcmQpIHtcbiAgICB2YXIgd2luID0gcmFuZ2Uuc3RhcnRDb250YWluZXIub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld1xuICAgICAgICAsIHNlbCA9IHdpbi5nZXRTZWxlY3Rpb24oKVxuICAgICAgICAsIGVuZFJhbmdlO1xuXG4gICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuXG4gICAgaWYgKGJhY2t3YXJkKXtcbiAgICAgICAgZW5kUmFuZ2UgPSByYW5nZS5jbG9uZVJhbmdlKCk7XG4gICAgICAgIGVuZFJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcblxuICAgICAgICBzZWwuYWRkUmFuZ2UoZW5kUmFuZ2UpO1xuICAgICAgICBzZWwuZXh0ZW5kKHJhbmdlLnN0YXJ0Q29udGFpbmVyLCByYW5nZS5zdGFydE9mZnNldCkgICAgICAgIFxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFRleHRTZWxlY3Rpb24od2luKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgbm9ybWFsaXplZCBjb3B5IG9mIHRoZSByYW5nZVxuICogSWYgeW91IHRyaXBsZSBjbGljayBhbiBpdGVtLCB0aGUgZW5kIG9mIHRoZSByYW5nZSBpcyBwb3NpdGlvbmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIE5FWFQgbm9kZS5cbiAqIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHJhbmdlIHdpdGggdGhlIGVuZCBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgb2YgdGhlIGxhc3QgdGV4dG5vZGUgY29udGFpbmVkIFxuICogaW5zaWRlIGEgY29tcG9uZW50IHdpdGggdGhlIFwiZWRpdGFibGVcIiBmYWNldFxuICogXG4gKiBAcmV0dXJuIHtyYW5nZX1cbiAqL1xuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiQkZ2V0Tm9ybWFsaXplZFJhbmdlKCl7XG4gICAgdmFyIGRvYyA9IHRoaXMucmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIub3duZXJEb2N1bWVudFxuICAgICAgICAsIHR3LCBwcmV2aW91c05vZGVcbiAgICAgICAgLCBuZXdSYW5nZSA9IHRoaXMucmFuZ2UuY2xvbmVSYW5nZSgpO1xuXG4gICAgaWYgKG5ld1JhbmdlLmVuZENvbnRhaW5lci5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgdHcgPSBkb2MuY3JlYXRlVHJlZVdhbGtlcihkb2MuYm9keSwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xuICAgICAgICB0dy5jdXJyZW50Tm9kZSA9IG5ld1JhbmdlLmVuZENvbnRhaW5lcjtcbiAgICAgICAgcHJldmlvdXNOb2RlID0gdHcucHJldmlvdXNOb2RlKCk7XG4gICAgICAgIG5ld1JhbmdlLnNldEVuZChwcmV2aW91c05vZGUsIHByZXZpb3VzTm9kZS5sZW5ndGgpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdSYW5nZTtcbn1cblxuLyoqXG4gKiBnZXQgdGhlIGRpcmVjdGlvbiBvZiBhIHNlbGVjdGlvblxuICpcbiAqIDEgZm9yd2FyZCwgLTEgYmFja3dhcmQsIDAgbm8gZGlyZWN0aW9uLCB1bmRlZmluZWQgb25lIG9mIHRoZSBub2RlIGlzIGRldGFjaGVkIG9yIGluIGEgZGlmZmVyZW50IGZyYW1lXG4gKlxuICogQHJldHVybiB7LTF8MHwxfHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiQkZ2V0RGlyZWN0aW9uKCl7XG4gICAgcmV0dXJuIGRvbVV0aWxzLmdldFNlbGVjdGlvbkRpcmVjdGlvbih0aGlzLnNlbGVjdGlvbik7ICAgIFxufVxuXG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlciA9IG1pbG9Db3JlLk1lc3NlbmdlclxuICAgICwgU3RvcmFnZU1lc3NhZ2VTb3VyY2UgPSByZXF1aXJlKCcuL21zZ19zcmMnKVxuICAgICwgY29uZmlnID0gcmVxdWlyZSgnLi4vLi4vY29uZmlnJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5yZXF1aXJlKCcuL21vZGVsJylcblxubW9kdWxlLmV4cG9ydHMgPSBET01TdG9yYWdlO1xuXG5cbi8vIHNoYXJlZCBrZXlzIHN0b3JlZCBieSBhbGwgaW5zdGFuY2VzLCBpbmNsdWRlIGtleSBwcmVmaXhlc1xudmFyIF9zdG9yZWRLZXlzID0ge1xuICAgIHRydWU6IHt9LCAvLyBzZXNzaW9uIHN0b3JhZ2VcbiAgICBmYWxzZToge30gLy8gbG9jYWwgc3RvcmFnZVxufTtcblxuXG4vKipcbiAqIERPTVN0b3JhZ2UgY2xhc3MgdG8gc2ltcGxpZnkgc3RvcmFnZSBhbmQgcmV0cmlldmFsIG9mIG11bHRpcGxlIGl0ZW1zIHdpdGggdHlwZXMgcHJlc2VydmF0aW9uIHRvIERPTSBzdG9yYWdlIChsb2NhbFN0b3JhZ2UgYW5kIHNlc3Npb25TdG9yYWdlKS5cbiAqIFR5cGVzIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBrZXkgY3JlYXRlZCBmcm9tIHZhbHVlIGtleXMgd2l0aCBhcHBlbmRlZCBgbWlsby5jb25maWcuZG9tU3RvcmFnZS50eXBlU3VmZml4YFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlQcmVmaXggcHJlZml4IHRoYXQgd2lsbCBiZSBhZGRlZCB0byBhbGwga2V5cyBmb2xsb3dlZCBieSBgbWlsby5jb25maWcuZG9tU3RvcmFnZS5wcmVmaXhTZXBhcmF0b3JgIChcIi9cIiBieSBkZWZhdWx0KS5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gc2Vzc2lvbk9ubHkgdHJ1ZSB0byB1c2Ugc2Vzc2lvblN0b3JhZ2UuIGxvY2FsU3RvcmFnZSB3aWxsIGJlIHVzZWQgYnkgZGVmYXVsdC5cbiAqIEBwYXJhbSB7V2luZG93fSB3aW4gd2luZG93IHRvIHdvcmsgaW5cbiAqL1xuZnVuY3Rpb24gRE9NU3RvcmFnZShrZXlQcmVmaXgsIHNlc3Npb25Pbmx5LCB3aW4pIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuICAgIHdpbiA9IHdpbiB8fCB3aW5kb3c7XG5cbiAgICBrZXlQcmVmaXggPSBjb25maWcuZG9tU3RvcmFnZS5yb290ICtcbiAgICAgICAgICAgICAgICAoa2V5UHJlZml4XG4gICAgICAgICAgICAgICAgICAgID8ga2V5UHJlZml4ICsgY29uZmlnLmRvbVN0b3JhZ2UucHJlZml4U2VwYXJhdG9yXG4gICAgICAgICAgICAgICAgICAgIDogJycpO1xuXG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAga2V5UHJlZml4OiBrZXlQcmVmaXgsXG4gICAgICAgIHNlc3Npb25Pbmx5OiAhISBzZXNzaW9uT25seSxcbiAgICAgICAgd2luZG93OiB3aW4sXG4gICAgICAgIF9zdG9yYWdlOiBzZXNzaW9uT25seSA/IHdpbi5zZXNzaW9uU3RvcmFnZSA6IHdpbi5sb2NhbFN0b3JhZ2UsXG4gICAgICAgIF90eXBlU3VmZml4OiBjb25maWcuZG9tU3RvcmFnZS50eXBlU3VmZml4LFxuICAgICAgICBfa2V5czoge31cbiAgICB9LCBfLldSSVQpO1xufVxuXG5cbl8uZXh0ZW5kUHJvdG8oRE9NU3RvcmFnZSwge1xuICAgIGdldDogRE9NU3RvcmFnZSRnZXQsXG4gICAgc2V0OiBET01TdG9yYWdlJHNldCxcbiAgICByZW1vdmU6IERPTVN0b3JhZ2UkcmVtb3ZlLFxuICAgIGhhc0l0ZW06IERPTVN0b3JhZ2UkaGFzSXRlbSxcbiAgICBnZXRJdGVtOiBET01TdG9yYWdlJGdldEl0ZW0sXG4gICAgc2V0SXRlbTogRE9NU3RvcmFnZSRzZXRJdGVtLFxuICAgIHJlbW92ZUl0ZW06IERPTVN0b3JhZ2UkcmVtb3ZlSXRlbSxcbiAgICBfc3RvcmFnZUtleTogRE9NU3RvcmFnZSRfc3RvcmFnZUtleSxcbiAgICBfZG9tU3RvcmFnZUtleTogRE9NU3RvcmFnZSRfZG9tU3RvcmFnZUtleSxcbiAgICBnZXRBbGxLZXlzOiBET01TdG9yYWdlJGdldEFsbEtleXMsXG4gICAgZ2V0QWxsSXRlbXM6IERPTVN0b3JhZ2UkZ2V0QWxsSXRlbXMsXG4gICAgY3JlYXRlTWVzc2VuZ2VyOiBET01TdG9yYWdlJGNyZWF0ZU1lc3NlbmdlcixcbiAgICBkZXN0cm95OiBET01TdG9yYWdlJGRlc3Ryb3lcbn0pO1xuXG5cbi8qKlxuICogRXhwb3NlIE1lc2VuZ2VyIGFuZCBNZXNzYWdlU291cmNlIG1ldGhvZHMgb24gRE9NU3RvcmFnZVxuICovXG5NZXNzZW5nZXIudXNlV2l0aChET01TdG9yYWdlLCAnX21lc3NlbmdlcicsIE1lc3Nlbmdlci5kZWZhdWx0TWV0aG9kcyk7XG5TdG9yYWdlTWVzc2FnZVNvdXJjZS51c2VXaXRoKERPTVN0b3JhZ2UsICdfbWVzc2FnZVNvdXJjZScsIFsndHJpZ2dlciddKTtcblxuXG52YXIgX3Nlc3Npb25TdG9yYWdlID0gbmV3IERPTVN0b3JhZ2UoJycsIHRydWUpXG4gICAgLCBfbG9jYWxTdG9yYWdlID0gbmV3IERPTVN0b3JhZ2UoJycsIGZhbHNlKTtcblxudmFyIF9kb21TdG9yYWdlID0ge1xuICAgICAgICB0cnVlOiBfc2Vzc2lvblN0b3JhZ2UsXG4gICAgICAgIGZhbHNlOiBfbG9jYWxTdG9yYWdlXG4gICAgfTtcblxuXy5leHRlbmQoRE9NU3RvcmFnZSwge1xuICAgIHJlZ2lzdGVyRGF0YVR5cGU6IERPTVN0b3JhZ2UkJHJlZ2lzdGVyRGF0YVR5cGUsXG4gICAgbG9jYWw6IF9sb2NhbFN0b3JhZ2UsXG4gICAgc2Vzc2lvbjogX3Nlc3Npb25TdG9yYWdlLFxuICAgIHN0b3JhZ2U6IF9kb21TdG9yYWdlLFxuICAgIF9zdG9yZWRLZXlzOiBfc3RvcmVkS2V5cyAvLyBleHBvc2VkIGZvciB0ZXN0aW5nXG59KTtcblxuXG4vKipcbiAqIFNldHMgZGF0YSB0byBET00gc3RvcmFnZS4gYHRoaXMua2V5UHJlZml4YCBpcyBwcmVwZW5kZWQgdG8ga2V5cy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSBzaW5nbGUgb2JqZWN0IGNhbiBiZSBwYXNzZWQgaW4gd2hpY2ggY2FzZSBrZXlzIHdpbGwgYmUgdXNlZCBhcyBrZXlzIGluIGxvY2FsIHN0b3JhZ2UuXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBhbHRlcm5hdGl2ZWx5IGp1c3QgdGhlIGxpc3Qgb2YgYXJndW1lbnRzIGNhbiBiZSBwYXNzZWQgd2hlcmUgYXJndW1lbnRzIGNhbiBiZSBzZXF1ZW50aWFsbHkgdXNlZCBhcyBrZXlzIGFuZCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2Ukc2V0KGRhdGEpIHsgLy8gb3IgYXJndW1lbnRzXG4gICAgaWYgKHR5cGVvZiBkYXRhID09ICdvYmplY3QnKVxuICAgICAgICBfLmVhY2hLZXkoZGF0YSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICAgICAgdGhpcy5zZXRJdGVtKGtleSwgdmFsdWUpO1xuICAgICAgICB9LCB0aGlzKTtcbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIGFyZ3NMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgICBpZiAoYXJnc0xlbiAlIDIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRG9tU3RvcmFnZUVycm9yKCdET01TdG9yYWdlOiBzZXQgc2hvdWxkIGhhdmUgZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzIG9yIG9iamVjdCcpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJnc0xlbjsgaSsrKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gYXJndW1lbnRzW2ldXG4gICAgICAgICAgICAgICAgLCB2YWx1ZSA9IGFyZ3VtZW50c1srK2ldO1xuXG4gICAgICAgICAgICB0aGlzLnNldEl0ZW0oa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLyoqXG4gKiBHZXRzIGRhdGEgZnJvbSBET00gc3RvcmFnZS4gYHRoaXMua2V5UHJlZml4YCBpcyBwcmVwZW5kZWQgdG8gcGFzc2VkIGtleXMsIGJ1dCByZXR1cm5lZCBvYmplY3Qgd2lsbCBoYXZlIGtleXMgd2l0aG91dCByb290IGtleXMuXG4gKlxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMga2V5cyBjYW4gYmUgcGFzc2VkIGFzIHN0cmluZ3Mgb3IgYXJyYXlzIG9mIHN0cmluZ3NcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2UkZ2V0KCkgeyAvLyAsIC4uLiBhcmd1bWVudHNcbiAgICB2YXIgZGF0YSA9IHt9O1xuICAgIF8uZGVlcEZvckVhY2goYXJndW1lbnRzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgZGF0YVtrZXldID0gdGhpcy5nZXRJdGVtKGtleSk7XG4gICAgfSwgdGhpcyk7XG4gICAgcmV0dXJuIGRhdGE7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIGtleXMgZnJvbSBET00gc3RvcmFnZS4gYHRoaXMua2V5UHJlZml4YCBpcyBwcmVwZW5kZWQgdG8gcGFzc2VkIGtleXMuXG4gKlxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMga2V5cyBjYW4gYmUgcGFzc2VkIGFzIHN0cmluZ3Mgb3IgYXJyYXlzIG9mIHN0cmluZ3NcbiAqL1xuZnVuY3Rpb24gRE9NU3RvcmFnZSRyZW1vdmUoKSB7IC8vLCAuLi4gYXJndW1lbnRzXG4gICAgXy5kZWVwRm9yRWFjaChhcmd1bWVudHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICB9LCB0aGlzKTtcbn1cblxuXG4vKipcbiAqIENoZWNrIGZvciBwcmVzZW5jZSBvZiBzaW5nbGUgaXRlbSBpbiBET00gc3RvcmFnZS4gYHRoaXMua2V5UHJlZml4YCBpcyBwcmVwZW5kZWQgdG8gcGFzc2VkIGtleS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBET01TdG9yYWdlJGhhc0l0ZW0oa2V5KSB7XG4gICAgdmFyIHBLZXkgPSB0aGlzLl9zdG9yYWdlS2V5KGtleSk7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JhZ2UuZ2V0SXRlbShwS2V5KSAhPSBudWxsO1xufVxuXG5cbi8qKlxuICogR2V0cyBzaW5nbGUgaXRlbSBmcm9tIERPTSBzdG9yYWdlIHByZXBlbmRpbmcgYHRoaXMua2V5UHJlZml4YCB0byBwYXNzZWQga2V5LlxuICogUmVhZHMgdHlwZSBvZiB0aGUgb3JpZ2luYWxseSBzdG9yZWQgdmFsdWUgZnJvbSBga2V5ICsgdGhpcy5fdHlwZVN1ZmZpeGAgYW5kIGNvbnZlcnRzIGRhdGEgdG8gdGhlIG9yaWdpbmFsIHR5cGUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiBET01TdG9yYWdlJGdldEl0ZW0oa2V5KSB7XG4gICAgdmFyIHBLZXkgPSB0aGlzLl9zdG9yYWdlS2V5KGtleSk7XG4gICAgdmFyIGRhdGFUeXBlID0gX2dldEtleURhdGFUeXBlLmNhbGwodGhpcywgcEtleSk7XG4gICAgdmFyIHZhbHVlU3RyID0gdGhpcy5fc3RvcmFnZS5nZXRJdGVtKHBLZXkpO1xuICAgIHZhciB2YWx1ZSA9IF9wYXJzZURhdGEodmFsdWVTdHIsIGRhdGFUeXBlKTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5cblxuLyoqXG4gKiBTZXRzIHNpbmdsZSBpdGVtIHRvIERPTSBzdG9yYWdlIHByZXBlbmRpbmcgYHRoaXMua2V5UHJlZml4YCB0byBwYXNzZWQga2V5LlxuICogU3RvcmVzIHR5cGUgb2YgdGhlIHN0b3JlZCB2YWx1ZSB0byBga2V5ICsgdGhpcy5fdHlwZVN1ZmZpeGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiBET01TdG9yYWdlJHNldEl0ZW0oa2V5LCB2YWx1ZSkge1xuICAgIHZhciBwS2V5ID0gdGhpcy5fc3RvcmFnZUtleShrZXkpO1xuICAgIHZhciBkYXRhVHlwZSA9IF9zZXRLZXlEYXRhVHlwZS5jYWxsKHRoaXMsIHBLZXksIHZhbHVlKTtcbiAgICB2YXIgdmFsdWVTdHIgPSBfc2VyaWFsaXplRGF0YSh2YWx1ZSwgZGF0YVR5cGUpO1xuICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX3N0b3JhZ2Uuc2V0SXRlbShwS2V5LCB2YWx1ZVN0cik7XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICAgIGlmIChlLm5hbWUgPT0gJ1F1b3RhRXhjZWVkZWRFcnJvcicpIHtcbiAgICAgICAgICAgIHZhciBjZmcgPSBjb25maWcuZG9tU3RvcmFnZS5xdW90YUV4Y2VlZGVkO1xuICAgICAgICAgICAgaWYgKGNmZy5tZXNzYWdlKVxuICAgICAgICAgICAgICAgIG1pbG8ubWFpbC5wb3N0TWVzc2FnZSgncXVvdGFleGNlZWRlZGVycm9yJywgdmFsdWUpO1xuICAgICAgICAgICAgaWYgKGNmZy50aHJvd0Vycm9yKVxuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgdGhpcy5fa2V5c1trZXldID0gdHJ1ZTtcbiAgICBfZG9tU3RvcmFnZVt0aGlzLnNlc3Npb25Pbmx5XS5fa2V5c1twS2V5XSA9IHRydWU7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIHNpbmdsZSBpdGVtIGZyb20gRE9NIHN0b3JhZ2UgcHJlcGVuZGluZyBgdGhpcy5rZXlQcmVmaXhgIHRvIHBhc3NlZCBrZXkuXG4gKiBUeXBlIG9mIHRoZSBzdG9yZWQgdmFsdWUgKGluIGBrZXkgKyB0aGlzLl90eXBlU3VmZml4YCBrZXkpIGlzIGFsc28gcmVtb3ZlZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2UkcmVtb3ZlSXRlbShrZXkpIHtcbiAgICB2YXIgcEtleSA9IHRoaXMuX3N0b3JhZ2VLZXkoa2V5KTtcbiAgICB0aGlzLl9zdG9yYWdlLnJlbW92ZUl0ZW0ocEtleSk7XG4gICAgX3JlbW92ZUtleURhdGFUeXBlLmNhbGwodGhpcywgcEtleSlcbiAgICBkZWxldGUgdGhpcy5fa2V5c1trZXldO1xuICAgIGRlbGV0ZSBfZG9tU3RvcmFnZVt0aGlzLnNlc3Npb25Pbmx5XS5fa2V5c1twS2V5XTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgdGhlIGFycmF5IG9mIGFsbCBrZXlzIHN0b3JlZCBieSB0aGlzIGluc3RhbmNlIG9mIERPTVN0b3JhZ2VcbiAqXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gRE9NU3RvcmFnZSRnZXRBbGxLZXlzKCkge1xuICAgIHZhciBzdG9yZWRLZXlzID0gT2JqZWN0LmtleXModGhpcy5fa2V5cyk7XG4gICAgdmFyIGtleXNJblN0b3JhZ2UgPSBzdG9yZWRLZXlzLmZpbHRlcihmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzSXRlbShrZXkpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZSBkZWxldGUgdGhpcy5fa2V5c1trZXldO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiBrZXlzSW5TdG9yYWdlO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWFwIHdpdGggYWxsIGtleXMgYW5kIHZhbHVlcyAoZGVzZXJpYWxpemVkKSBzdG9yZWQgdXNpbmcgdGhpcyBpbnN0YW5jZSBvZiBET01TdG9yYWdlXG4gKlxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBET01TdG9yYWdlJGdldEFsbEl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLmdldCh0aGlzLmdldEFsbEtleXMoKSk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHByZWZpeGVkIGtleSBmb3IgRE9NIHN0b3JhZ2UgZm9yIGdpdmVuIHVucHJlZml4ZWQga2V5LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gRE9NU3RvcmFnZSRfc3RvcmFnZUtleShrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5rZXlQcmVmaXggKyBrZXk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHVucHJlZml4ZWQga2V5IHRvIGJlIHVzZWQgd2l0aCB0aGlzIGluc3RhbmNlIG9mIERPTVN0b3JhZ2UgZmlyIGdpdmVuIGFjdHVhbCBrZXkgaW4gc3RvcmFnZVxuICogSWYga2V5IGhhcyBkaWZmZXJlbnQgcHJlZml4IGZyb20gdGhlIGtleVByZWZpeCByZXR1cm5zIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdG9yYWdlS2V5IGFjdHVhbCBrZXkgaW4gbG9jYWwvc2Vzc2lvbiBzdG9yYWdlXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2UkX2RvbVN0b3JhZ2VLZXkoc3RvcmFnZUtleSkge1xuICAgIGlmIChzdG9yYWdlS2V5LmluZGV4T2YodGhpcy5fdHlwZVN1ZmZpeCkgPj0gMCkgcmV0dXJuO1xuICAgIHJldHVybiBfLnVuUHJlZml4KHN0b3JhZ2VLZXksIHRoaXMua2V5UHJlZml4KTtcbn1cblxuXG4vKipcbiAqIEdldHMgb3JpZ2luYWxseSBzdG9yZWQgZGF0YSB0eXBlIGZvciBnaXZlbiAocHJlZml4ZWQpIGBrZXlgLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gcEtleSBwcmVmaXhlZCBrZXkgb2Ygc3RvcmVkIHZhbHVlXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIF9nZXRLZXlEYXRhVHlwZShwS2V5KSB7XG4gICAgcEtleSA9IF9kYXRhVHlwZUtleS5jYWxsKHRoaXMsIHBLZXkpO1xuICAgIHJldHVybiB0aGlzLl9zdG9yYWdlLmdldEl0ZW0ocEtleSk7XG59XG5cblxuLyoqXG4gKiBTdG9yZXMgZGF0YSB0eXBlIGZvciBnaXZlbiAocHJlZml4ZWQpIGBrZXlgIGFuZCBgdmFsdWVgLlxuICogUmV0dXJucyBkYXRhIHR5cGUgZm9yIGB2YWx1ZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHBLZXkgcHJlZml4ZWQga2V5IG9mIHN0b3JlZCB2YWx1ZVxuICogQHBhcmFtIHtBbnl9IHZhbHVlXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIF9zZXRLZXlEYXRhVHlwZShwS2V5LCB2YWx1ZSkge1xuICAgIHZhciBkYXRhVHlwZSA9IF9nZXRWYWx1ZVR5cGUodmFsdWUpO1xuICAgIHBLZXkgPSBfZGF0YVR5cGVLZXkuY2FsbCh0aGlzLCBwS2V5KTtcbiAgICB0aGlzLl9zdG9yYWdlLnNldEl0ZW0ocEtleSwgZGF0YVR5cGUpO1xuICAgIHJldHVybiBkYXRhVHlwZTtcbn1cblxuXG4vKipcbiAqIFJlbW92ZXMgc3RvcmVkIGRhdGEgdHlwZSBmb3IgZ2l2ZW4gKHByZWZpeGVkKSBga2V5YC5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHBLZXkgcHJlZml4ZWQga2V5IG9mIHN0b3JlZCB2YWx1ZVxuICovXG5mdW5jdGlvbiBfcmVtb3ZlS2V5RGF0YVR5cGUocEtleSkge1xuICAgIHBLZXkgPSBfZGF0YVR5cGVLZXkuY2FsbCh0aGlzLCBwS2V5KTtcbiAgICB0aGlzLl9zdG9yYWdlLnJlbW92ZUl0ZW0ocEtleSk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBrZXkgdG8gc3RvcmUgZGF0YSB0eXBlIGZvciBnaXZlbiAocHJlZml4ZWQpIGBrZXlgLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gcEtleSBwcmVmaXhlZCBrZXkgb2Ygc3RvcmVkIHZhbHVlXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIF9kYXRhVHlwZUtleShwS2V5KSB7XG4gICAgcmV0dXJuIHBLZXkgKyB0aGlzLl90eXBlU3VmZml4O1xufVxuXG5cbi8qKlxuICogUmV0dXJucyB0eXBlIG9mIHZhbHVlIGFzIHN0cmluZy4gQ2xhc3MgbmFtZSByZXR1cm5lZCBmb3Igb2JqZWN0cyAoJ251bGwnIGZvciBudWxsKS5cbiAqIEBwYXJhbSAge0FueX0gdmFsdWVcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gX2dldFZhbHVlVHlwZSh2YWx1ZSkge1xuICAgIHZhciB2YWx1ZVR5cGUgPSB0eXBlb2YgdmFsdWVcbiAgICAgICAgLCBjbGFzc05hbWUgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgICwgZGF0YVR5cGUgPSB2YWx1ZXNEYXRhVHlwZXNbY2xhc3NOYW1lXTtcbiAgICByZXR1cm4gZGF0YVR5cGUgfHwgKFxuICAgICAgICAgICAgdmFsdWVUeXBlICE9ICdvYmplY3QnXG4gICAgICAgICAgICAgICAgPyB2YWx1ZVR5cGVcbiAgICAgICAgICAgICAgICA6IHZhbHVlID09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgPyAnbnVsbCdcbiAgICAgICAgICAgICAgICAgICAgOiB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lKTtcbn1cbnZhciB2YWx1ZXNEYXRhVHlwZXMgPSB7XG4gICAgLy8gY2FuIGJlIHJlZ2lzdGVyZWQgd2l0aCBgcmVnaXN0ZXJEYXRhVHlwZWBcbn1cblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdmFsdWUgdG8gYmUgc3RvcmVkIGluIERPTSBzdG9yYWdlLlxuICpcbiAqIEBwYXJhbSAge0FueX0gdmFsdWUgdmFsdWUgdG8gYmUgc2VyaWFsaXplZFxuICogQHBhcmFtICB7U3RyaW5nfSB2YWx1ZVR5cGUgb3B0aW9uYWwgZGF0YSB0eXBlIHRvIGRlZmluZSBzZXJpYWxpemVyLCBfZ2V0VmFsdWVUeXBlIGlzIHVzZWQgaWYgbm90IHBhc3NlZC5cbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gX3NlcmlhbGl6ZURhdGEodmFsdWUsIHZhbHVlVHlwZSkge1xuICAgIHZhbHVlVHlwZSA9IHZhbHVlVHlwZSB8fCBfZ2V0VmFsdWVUeXBlKHZhbHVlKTtcbiAgICB2YXIgc2VyaWFsaXplciA9IGRhdGFTZXJpYWxpemVyc1t2YWx1ZVR5cGVdO1xuICAgIHJldHVybiBzZXJpYWxpemVyXG4gICAgICAgICAgICA/IHNlcmlhbGl6ZXIodmFsdWUsIHZhbHVlVHlwZSlcbiAgICAgICAgICAgIDogdmFsdWUgJiYgdmFsdWUudG9TdHJpbmcgPT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ1xuICAgICAgICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gICAgICAgICAgICAgICAgOiAnJyArIHZhbHVlO1xufVxudmFyIGRhdGFTZXJpYWxpemVycyA9IHtcbiAgICAnQXJyYXknOiBKU09OLnN0cmluZ2lmeVxufVxuXG5cbi8qKlxuICogUGFyc2VzIHN0cmluZyByZXRyaWV2ZWQgZnJvbSBET00gc3RvcmFnZS5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHZhbHVlU3RyXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHZhbHVlVHlwZSBkYXRhIHR5cGUgdGhhdCBkZWZpbmVzIHBhcnNlci4gT3JpZ2luYWwgc3Jpbmcgd2lsbCBiZSByZXR1cm5lZCBpZiBwYXJzZXIgaXMgbm90IGRlZmluZWQuXG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmZ1bmN0aW9uIF9wYXJzZURhdGEodmFsdWVTdHIsIHZhbHVlVHlwZSkge1xuICAgIHZhciBwYXJzZXIgPSBkYXRhUGFyc2Vyc1t2YWx1ZVR5cGVdO1xuICAgIHJldHVybiBwYXJzZXJcbiAgICAgICAgICAgID8gcGFyc2VyKHZhbHVlU3RyLCB2YWx1ZVR5cGUpXG4gICAgICAgICAgICA6IHZhbHVlU3RyO1xufVxudmFyIGRhdGFQYXJzZXJzID0ge1xuICAgIE9iamVjdDogXy5qc29uUGFyc2UsXG4gICAgQXJyYXk6IF8uanNvblBhcnNlLFxuICAgIERhdGU6IGZ1bmN0aW9uKHZhbFN0cikgeyByZXR1cm4gbmV3IERhdGUodmFsU3RyKTsgfSxcbiAgICBib29sZWFuOiBmdW5jdGlvbih2YWxTdHIpIHsgcmV0dXJuIHZhbFN0ciA9PSAndHJ1ZSc7IH0sXG4gICAgbnVtYmVyOiBOdW1iZXIsXG4gICAgZnVuY3Rpb246IF8udG9GdW5jdGlvbixcbiAgICBSZWdFeHA6IF8udG9SZWdFeHBcbn07XG5cblxuLyoqXG4gKiBSZWdpc3RlcnMgZGF0YSB0eXBlIHRvIGJlIHNhdmVkIGluIERPTSBzdG9yYWdlLiBDbGFzcyBuYW1lIGNhbiBiZSB1c2VkIG9yIHJlc3VsdCBvZiBgdHlwZW9mYCBvcGVyYXRvciBmb3Igbm9uLW9iamVjdHMgdG8gb3ZlcnJpZGUgZGVmYXVsdCBjb252ZXJzaW9ucy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVUeXBlIGNsYXNzIChjb25zdHJ1Y3RvcikgbmFtZSBvciB0aGUgc3RyaW5nIHJldHVybmVkIGJ5IHR5cGVvZi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlcmlhbGl6ZXIgb3B0aW9uYWwgc2VyaWFsaXplciBmb3IgdGhpcyB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwYXJzZXIgb3B0aW9uYWwgcGFyc2VyIGZvciB0aGlzIHR5cGVcbiAqIEBwYXJhbSB7W1N0cmluZ119IHN0b3JlQXNEYXRhVHlwZSBvcHRpb25hbCBuYW1lIG9mIHN0b3JlZCBkYXRhIHR5cGUgaWYgZGlmZmVyZW50IGZyb20gdmFsdWVUeXBlXG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2UkJHJlZ2lzdGVyRGF0YVR5cGUodmFsdWVUeXBlLCBzZXJpYWxpemVyLCBwYXJzZXIsIHN0b3JlQXNEYXRhVHlwZSkge1xuICAgIGlmIChzZXJpYWxpemVyKSBkYXRhU2VyaWFsaXplcnNbdmFsdWVUeXBlXSA9IHNlcmlhbGl6ZXI7XG4gICAgaWYgKHBhcnNlcikgZGF0YVBhcnNlcnNbdmFsdWVUeXBlXSA9IHBhcnNlcjtcbiAgICB2YWx1ZXNEYXRhVHlwZXNbdmFsdWVUeXBlXSA9IHN0b3JlQXNEYXRhVHlwZSB8fCB2YWx1ZVR5cGU7XG59XG5cblxuZnVuY3Rpb24gRE9NU3RvcmFnZSRjcmVhdGVNZXNzZW5nZXIoKSB7XG4gICAgdmFyIHN0b3JhZ2VNZXNzYWdlU291cmNlID0gbmV3IFN0b3JhZ2VNZXNzYWdlU291cmNlKHRoaXMpO1xuICAgIHZhciBtZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKHRoaXMsIHVuZGVmaW5lZCwgc3RvcmFnZU1lc3NhZ2VTb3VyY2UpO1xuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIF9tZXNzZW5nZXI6IG1lc3NlbmdlcixcbiAgICAgICAgX21lc3NhZ2VTb3VyY2U6IHN0b3JhZ2VNZXNzYWdlU291cmNlXG4gICAgfSwgXy5XUklUKTtcbn1cblxuXG5mdW5jdGlvbiBET01TdG9yYWdlJGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc3RvcmFnZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLndpbmRvdyA9IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5fbWVzc2VuZ2VyKSB0aGlzLl9tZXNzZW5nZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2Rlc3Ryb3llZCA9IHRydWU7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNb2RlbCA9IG1pbG9Db3JlLk1vZGVsXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cbk1vZGVsLnJlZ2lzdGVyV2l0aERPTVN0b3JhZ2UgPSBNb2RlbCQkcmVnaXN0ZXJXaXRoRE9NU3RvcmFnZTtcblxuXG5mdW5jdGlvbiBNb2RlbCQkcmVnaXN0ZXJXaXRoRE9NU3RvcmFnZSgpIHtcbiAgICB2YXIgRE9NU3RvcmFnZSA9IHJlcXVpcmUoJy4vaW5kZXgnKTtcbiAgICBET01TdG9yYWdlLnJlZ2lzdGVyRGF0YVR5cGUoJ01vZGVsJywgTW9kZWxfZG9tU3RvcmFnZVNlcmlhbGl6ZXIsIE1vZGVsX2RvbVN0b3JhZ2VQYXJzZXIpO1xuICAgIERPTVN0b3JhZ2UucmVnaXN0ZXJEYXRhVHlwZSgnTW9kZWxQYXRoJywgTW9kZWxfZG9tU3RvcmFnZVNlcmlhbGl6ZXIsIE1vZGVsX2RvbVN0b3JhZ2VQYXJzZXIsICdNb2RlbCcpO1xufVxuXG5cbmZ1bmN0aW9uIE1vZGVsX2RvbVN0b3JhZ2VTZXJpYWxpemVyKHZhbHVlKSB7XG4gICAgdmFyIGRhdGEgPSB2YWx1ZS5nZXQoKTtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG59XG5cblxuZnVuY3Rpb24gTW9kZWxfZG9tU3RvcmFnZVBhcnNlcih2YWx1ZVN0cikge1xuICAgIHZhciBkYXRhID0gXy5qc29uUGFyc2UodmFsdWVTdHIpO1xuICAgIHJldHVybiBuZXcgTW9kZWwoZGF0YSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NhZ2VTb3VyY2UgPSBtaWxvQ29yZS5jbGFzc2VzLk1lc3NhZ2VTb3VyY2VcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY29uZmlnID0gcmVxdWlyZSgnLi4vLi4vY29uZmlnJylcbiAgICAsIHVuaXF1ZUlkID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91bmlxdWVfaWQnKTtcblxudmFyIFN0b3JhZ2VNZXNzYWdlU291cmNlID0gXy5jcmVhdGVTdWJjbGFzcyhNZXNzYWdlU291cmNlLCAnU3RvcmFnZU1lc3NhZ2VTb3VyY2UnLCB0cnVlKTtcblxuXG5fLmV4dGVuZFByb3RvKFN0b3JhZ2VNZXNzYWdlU291cmNlLCB7XG4gICAgLy8gaW1wbGVtZW50aW5nIE1lc3NhZ2VTb3VyY2UgaW50ZXJmYWNlXG4gICAgaW5pdDogaW5pdCxcbiAgICBhZGRTb3VyY2VTdWJzY3JpYmVyOiBTdG9yYWdlTWVzc2FnZVNvdXJjZSRhZGRTb3VyY2VTdWJzY3JpYmVyLFxuICAgIHJlbW92ZVNvdXJjZVN1YnNjcmliZXI6IFN0b3JhZ2VNZXNzYWdlU291cmNlJHJlbW92ZVNvdXJjZVN1YnNjcmliZXIsXG4gICAgcG9zdE1lc3NhZ2U6IFN0b3JhZ2VNZXNzYWdlU291cmNlJHBvc3RNZXNzYWdlLFxuICAgIHRyaWdnZXI6IFN0b3JhZ2VNZXNzYWdlU291cmNlJHRyaWdnZXIsXG5cbiAgICAvL2NsYXNzIHNwZWNpZmljIG1ldGhvZHNcbiAgICBoYW5kbGVFdmVudDogaGFuZGxlRXZlbnQgIC8vIGV2ZW50IGRpc3BhdGNoZXIgLSBhcyBkZWZpbmVkIGJ5IEV2ZW50IERPTSBBUElcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0b3JhZ2VNZXNzYWdlU291cmNlO1xuXG5cbmZ1bmN0aW9uIGluaXQoaG9zdE9iamVjdCwgcHJveHlNZXRob2RzLCBtZXNzZW5nZXJBUElPckNsYXNzKSB7XG4gICAgaWYgKGhvc3RPYmplY3QuY29uc3RydWN0b3IubmFtZSAhPSAnRE9NU3RvcmFnZScpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaG9zdE9iamVjdCBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgRE9NU3RvcmFnZScpO1xuICAgIHRoaXMuc3RvcmFnZSA9IGhvc3RPYmplY3Q7XG4gICAgdGhpcy5tZXNzYWdlS2V5ID0gY29uZmlnLmRvbVN0b3JhZ2UubWVzc2FnZUtleTtcbiAgICB0aGlzLndpbmRvdyA9IGhvc3RPYmplY3Qud2luZG93O1xuICAgIE1lc3NhZ2VTb3VyY2UucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG5mdW5jdGlvbiBTdG9yYWdlTWVzc2FnZVNvdXJjZSRhZGRTb3VyY2VTdWJzY3JpYmVyKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICB0aGlzLndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzdG9yYWdlJywgdGhpcywgZmFsc2UpO1xufVxuXG5cbmZ1bmN0aW9uIFN0b3JhZ2VNZXNzYWdlU291cmNlJHJlbW92ZVNvdXJjZVN1YnNjcmliZXIoc291cmNlTWVzc2FnZSkge1xuICAgIHRoaXMud2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3N0b3JhZ2UnLCB0aGlzLCBmYWxzZSk7XG59XG5cblxuZnVuY3Rpb24gU3RvcmFnZU1lc3NhZ2VTb3VyY2UkcG9zdE1lc3NhZ2UobWVzc2FnZSwgZGF0YSkge1xuICAgIHRoaXMubWVzc2VuZ2VyLnBvc3RNZXNzYWdlU3luYyhtZXNzYWdlLCBkYXRhKTtcbn1cblxuXG5mdW5jdGlvbiBTdG9yYWdlTWVzc2FnZVNvdXJjZSR0cmlnZ2VyKG1zZ1R5cGUsIGRhdGEpIHtcbiAgICB2YXIga2V5ID0gdGhpcy5tZXNzYWdlS2V5ICsgbXNnVHlwZTtcbiAgICBkYXRhID0gZGF0YSB8fCB7fTtcbiAgICBkYXRhW2NvbmZpZy5kb21TdG9yYWdlLm1lc3NhZ2VUaW1lc3RhbXBdID0gdW5pcXVlSWQoKTtcbiAgICBfLmRlZmVyTWV0aG9kKHRoaXMuc3RvcmFnZSwgJ3NldEl0ZW0nLCBrZXksIGRhdGEpO1xufVxuXG5cbmZ1bmN0aW9uIGhhbmRsZUV2ZW50KGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnN0b3JhZ2VBcmVhICE9IHRoaXMuc3RvcmFnZS5fc3RvcmFnZSkgcmV0dXJuO1xuICAgIHZhciBrZXkgPSB0aGlzLnN0b3JhZ2UuX2RvbVN0b3JhZ2VLZXkoZXZlbnQua2V5KTsgaWYgKCEga2V5KSByZXR1cm47XG4gICAgdmFyIG1zZ1R5cGUgPSBfLnVuUHJlZml4KGtleSwgdGhpcy5tZXNzYWdlS2V5KTsgaWYgKCEgbXNnVHlwZSkgcmV0dXJuO1xuICAgIHZhciBkYXRhID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0oa2V5KTsgaWYgKCEgZGF0YSkgcmV0dXJuO1xuICAgIHRoaXMuZGlzcGF0Y2hNZXNzYWdlKG1zZ1R5cGUsIGRhdGEpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdGltZXN0YW1wID0gRGF0ZS5ub3coKVxuICAgICwgY291bnQgPSAnJ1xuICAgICwgdW5pcXVlSUQgPSAnJyArIHRpbWVzdGFtcDtcblxuZnVuY3Rpb24gdW5pcXVlQ291bnQoKSB7XG4gICAgdmFyIG5ld1RpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgdW5pcXVlSUQgPSAnJyArIG5ld1RpbWVzdGFtcDtcbiAgICBpZiAodGltZXN0YW1wID09IG5ld1RpbWVzdGFtcCkge1xuICAgICAgICBjb3VudCA9IGNvdW50ID09PSAnJyA/IDAgOiBjb3VudCArIDE7XG4gICAgICAgIHVuaXF1ZUlEICs9ICdfJyArIGNvdW50O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRpbWVzdGFtcCA9IG5ld1RpbWVzdGFtcDtcbiAgICAgICAgY291bnQgPSAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gdW5pcXVlSUQ7XG59XG5cbnVuaXF1ZUNvdW50LmdldCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB1bmlxdWVJRDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB1bmlxdWVDb3VudDtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBgbWlsby51dGlsLndlYnNvY2tldGAgXG4qKi9cblxuXG52YXIgTWVzc2VuZ2VyID0gcmVxdWlyZSgnbWlsby1jb3JlJykuTWVzc2VuZ2VyXG4gICAgLCBXU01lc3NhZ2VTb3VyY2UgPSByZXF1aXJlKCcuL21zZ19zcmMnKVxuICAgICwgV1NNc2dBUEkgPSByZXF1aXJlKCcuL21zZ19hcGknKTtcblxuXG5mdW5jdGlvbiB3ZWJzb2NrZXQoKSB7XG4gICAgdmFyIHdzTWVzc2VuZ2VyID0gbmV3IE1lc3NlbmdlcjtcbiAgICB2YXIgd3NNc2dTb3VyY2UgPSBuZXcgV1NNZXNzYWdlU291cmNlKHdzTWVzc2VuZ2VyLCB7IHNlbmQ6ICd0cmlnZ2VyJywgY29ubmVjdDogJ2Nvbm5lY3QnIH0sIG5ldyBXU01zZ0FQSSk7XG4gICAgd3NNZXNzZW5nZXIuX3NldE1lc3NhZ2VTb3VyY2Uod3NNc2dTb3VyY2UpO1xuICAgIHJldHVybiB3c01lc3Nlbmdlcjtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IHdlYnNvY2tldDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlckFQSSA9IG1pbG9Db3JlLmNsYXNzZXMuTWVzc2VuZ2VyQVBJXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxuXG52YXIgV1NNc2dBUEkgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NlbmdlckFQSSwgJ1dTTXNnQVBJJywgdHJ1ZSk7XG5cblxuXy5leHRlbmRQcm90byhXU01zZ0FQSSwge1xuICAgIHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZTogdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlLFxuICAgIGZpbHRlclNvdXJjZU1lc3NhZ2U6IGZpbHRlclNvdXJjZU1lc3NhZ2UsXG4gICAgY3JlYXRlSW50ZXJuYWxEYXRhOiBjcmVhdGVJbnRlcm5hbERhdGFcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdTTXNnQVBJO1xuXG5cbnZhciBTT0NLRVRfTUVTU0FHRVMgPSBbJ29wZW4nLCAnY2xvc2UnLCAnZXJyb3InLCAnbWVzc2FnZSddO1xuXG5mdW5jdGlvbiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHJldHVybiBTT0NLRVRfTUVTU0FHRVMuaW5kZXhPZihtZXNzYWdlKSA+PSAwXG4gICAgICAgICAgICA/IG1lc3NhZ2VcbiAgICAgICAgICAgIDogJ21lc3NhZ2UnO1xufVxuXG5cbmZ1bmN0aW9uIGZpbHRlclNvdXJjZU1lc3NhZ2Uoc291cmNlTWVzc2FnZSwgbWVzc2FnZSwgbXNnRGF0YSkge1xuICAgIGlmIChTT0NLRVRfTUVTU0FHRVMuaW5kZXhPZihtZXNzYWdlKSA+PSAwKSByZXR1cm4gdHJ1ZTsgLy8gaW50ZXJuYWwgbWVzc2FnZSBpcyBvbmUgb2YgZXh0ZXJuYWwgbWVzc2FnZXNcbiAgICBpZiAoc291cmNlTWVzc2FnZSA9PSAnbWVzc2FnZScpIHtcbiAgICAgICAgdmFyIG1zZ1R5cGUgPSBtc2dEYXRhICYmIG1zZ0RhdGEudHlwZTtcbiAgICAgICAgcmV0dXJuIG1zZ1R5cGUgPT0gbWVzc2FnZTsgLy8gdHlwZSBlcXVhbHMgaW50ZXJuYWwgbWVzc2FnZVxuICAgIH1cbn07XG5cblxuZnVuY3Rpb24gY3JlYXRlSW50ZXJuYWxEYXRhKHNvdXJjZU1lc3NhZ2UsIG1lc3NhZ2UsIGV2ZW50KSB7XG4gICAgdmFyIGludGVybmFsRGF0YSA9IHNvdXJjZU1lc3NhZ2UgPT0gJ21lc3NhZ2UnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IF8uanNvblBhcnNlKGV2ZW50LmRhdGEpIHx8IGV2ZW50LmRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIDogZXZlbnQ7XG4gICAgcmV0dXJuIGludGVybmFsRGF0YTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2FnZVNvdXJjZSA9IG1pbG9Db3JlLmNsYXNzZXMuTWVzc2FnZVNvdXJjZVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgdW5pcXVlSWQgPSByZXF1aXJlKCcuLi8uLi91dGlsL3VuaXF1ZV9pZCcpXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuLi8uLi9jb25maWcnKVxuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5cbnZhciBXU01lc3NhZ2VTb3VyY2UgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NhZ2VTb3VyY2UsICdXU01lc3NhZ2VTb3VyY2UnLCB0cnVlKTtcblxuXG5fLmV4dGVuZFByb3RvKFdTTWVzc2FnZVNvdXJjZSwge1xuICAgIC8vIGltcGxlbWVudGluZyBNZXNzYWdlU291cmNlIGludGVyZmFjZVxuICAgIGFkZFNvdXJjZVN1YnNjcmliZXI6IGFkZFNvdXJjZVN1YnNjcmliZXIsXG4gICAgcmVtb3ZlU291cmNlU3Vic2NyaWJlcjogcmVtb3ZlU291cmNlU3Vic2NyaWJlcixcbiAgICBcbiAgICAvLyBjbGFzcyBzcGVjaWZpYyBtZXRob2RzXG4gICAgaGFuZGxlRXZlbnQ6IFdTTWVzc2FnZVNvdXJjZSRoYW5kbGVFdmVudCxcbiAgICBjb25uZWN0OiBXU01lc3NhZ2VTb3VyY2UkY29ubmVjdCxcbiAgICB0cmlnZ2VyOiBXU01lc3NhZ2VTb3VyY2UkdHJpZ2dlclxufSk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBXU01lc3NhZ2VTb3VyY2U7XG5cblxuZnVuY3Rpb24gV1NNZXNzYWdlU291cmNlJGNvbm5lY3Qob3B0aW9ucykge1xuICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHZhciBob3N0ID0gb3B0aW9ucy5ob3N0IHx8IHdpbmRvdy5sb2NhdGlvbi5ob3N0LnJlcGxhY2UoLzouKi8sICcnKVxuICAgICAgICAsIHBvcnQgPSBvcHRpb25zLnBvcnQgfHwgJzgwODAnO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgaWYgKHRoaXMuX3dzKSB7XG4gICAgICAgIC8vIFRPRE8gc2hvdWxkIHVuc3Vic2NyaWJlIGRpZmZlcmVudGx5XG4gICAgICAgIHRoaXMuX3dzLm9ub3BlbiA9IHRoaXMud3Mub25tZXNzYWdlID0gdGhpcy53cy5vbmNsb3NlID0gdGhpcy53cy5vbmVycm9yID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl93cy5jbG9zZSgpO1xuICAgIH1cblxuICAgIHRoaXMuX3dzID0gbmV3IFdlYlNvY2tldCgnd3M6Ly8nICsgaG9zdCArICc6JyArIHBvcnQpO1xuXG4gICAgLy8gVE9ETyByZWNvbm5lY3Rcbn1cblxuXG5cbmZ1bmN0aW9uIGFkZFNvdXJjZVN1YnNjcmliZXIgKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICBfd3NTdWJzY3JpYmVyTWV0aG9kLmNhbGwodGhpcywgJ2FkZEV2ZW50TGlzdGVuZXInLCBzb3VyY2VNZXNzYWdlKTtcbn1cblxuXG5mdW5jdGlvbiByZW1vdmVTb3VyY2VTdWJzY3JpYmVyIChzb3VyY2VNZXNzYWdlKSB7XG4gICAgX3dzU3Vic2NyaWJlck1ldGhvZC5jYWxsKHRoaXMsICdyZW1vdmVFdmVudExpc3RlbmVyJywgc291cmNlTWVzc2FnZSk7XG59XG5cblxuZnVuY3Rpb24gX3dzU3Vic2NyaWJlck1ldGhvZCAobWV0aG9kLCBzb3VyY2VNZXNzYWdlKSB7ICAgIFxuICAgIGlmICghdGhpcy5fd3MpIHJldHVybiBsb2dnZXIuZXJyb3IoJ3dlYnNvY2tldCBpcyBub3QgY3JlYXRlZCcpO1xuICAgIHRoaXMuX3dzW21ldGhvZF0oc291cmNlTWVzc2FnZSwgdGhpcyk7XG59XG5cblxuLy8gZXZlbnQgZGlzcGF0Y2hlciAtIGFzIGRlZmluZWQgYnkgRXZlbnQgRE9NIEFQSVxuZnVuY3Rpb24gV1NNZXNzYWdlU291cmNlJGhhbmRsZUV2ZW50IChldmVudCkge1xuICAgIHRoaXMuZGlzcGF0Y2hNZXNzYWdlKGV2ZW50LnR5cGUsIGV2ZW50KTtcbn1cblxuXG5mdW5jdGlvbiBXU01lc3NhZ2VTb3VyY2UkdHJpZ2dlciAobXNnLCBkYXRhLCBjYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5fd3MpIHJldHVybiBsb2dnZXIuZXJyb3IoJ3dlYnNvY2tldCBpcyBub3QgY3JlYXRlZCcpO1xuXG4gICAgZGF0YSA9IGRhdGEgfHwge307XG4gICAgZGF0YS50eXBlID0gbXNnO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIFxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBkYXRhLmNhbGxiYWNrQ29ycklkID0gdW5pcXVlSWQoKTtcbiAgICAgICAgdmFyIGludGVydmFsID0gXy5kZWxheShvblRpbWVvdXQsIGNvbmZpZy53ZWJzb2NrZXQucnBjLnRpbWVvdXQpO1xuICAgICAgICB0b2dnbGVScGNTdWJzY3JpcHRpb24oJ29uY2UnLCBkYXRhLmNhbGxiYWNrQ29ycklkKTtcbiAgICB9ICAgIFxuXG4gICAgdGhpcy5fd3Muc2VuZChKU09OLnN0cmluZ2lmeShkYXRhKSk7XG5cblxuICAgIGZ1bmN0aW9uIG9uVGltZW91dCgpIHtcbiAgICAgICAgdG9nZ2xlUnBjU3Vic2NyaXB0aW9uKCdvZmYnLCBkYXRhLmNhbGxiYWNrQ29ycklkKTtcbiAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKCd3ZWJzb2NrZXQgcnBjOiB0aW1lb3V0JykpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uUmVzcG9uc2UobXNnLCBtc2dEYXRhKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICBpZiAodHlwZW9mIG1zZ0RhdGEgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHZhciBlcnIgPSBtc2dEYXRhLmVycm9yID8gbmV3IEVycm9yKG1zZ0RhdGEuZXJyb3IpIDogbnVsbDtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgbXNnRGF0YS5kYXRhKVxuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcignd2Vic29ja2V0IHJwYzogaW52YWxpZCByZXNwb25zZSBkYXRhJyksIG1zZ0RhdGEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvZ2dsZVJwY1N1YnNjcmlwdGlvbihvbk9mZiwgY29ycklkKSB7XG4gICAgICAgIHNlbGYubWVzc2VuZ2VyW29uT2ZmXShjb25maWcud2Vic29ja2V0LnJwYy5yZXNwb25zZVByZWZpeCArIGNvcnJJZCwgb25SZXNwb25zZSk7XG4gICAgfVxufVxuIiwiOyhmdW5jdGlvbigpe1xuXG4vLyBUaGlzIHdvdWxkIGJlIHRoZSBwbGFjZSB0byBlZGl0IGlmIHlvdSB3YW50IGEgZGlmZmVyZW50XG4vLyBCYXNlMzIgaW1wbGVtZW50YXRpb25cblxudmFyIGFscGhhYmV0ID0gJzAxMjM0NTY3ODlhYmNkZWZnaGprbW5wcXJ0dXZ3eHl6J1xudmFyIGFsaWFzID0geyBvOjAsIGk6MSwgbDoxLCBzOjUgfVxuXG4vKipcbiAqIEJ1aWxkIGEgbG9va3VwIHRhYmxlIGFuZCBtZW1vaXplIGl0XG4gKlxuICogUmV0dXJuIGFuIG9iamVjdCB0aGF0IG1hcHMgYSBjaGFyYWN0ZXIgdG8gaXRzXG4gKiBieXRlIHZhbHVlLlxuICovXG5cbnZhciBsb29rdXAgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdGFibGUgPSB7fVxuICAgIC8vIEludmVydCAnYWxwaGFiZXQnXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbHBoYWJldC5sZW5ndGg7IGkrKykge1xuICAgICAgICB0YWJsZVthbHBoYWJldFtpXV0gPSBpXG4gICAgfVxuICAgIC8vIFNwbGljZSBpbiAnYWxpYXMnXG4gICAgZm9yICh2YXIga2V5IGluIGFsaWFzKSB7XG4gICAgICAgIGlmICghYWxpYXMuaGFzT3duUHJvcGVydHkoa2V5KSkgY29udGludWVcbiAgICAgICAgdGFibGVba2V5XSA9IHRhYmxlWycnICsgYWxpYXNba2V5XV1cbiAgICB9XG4gICAgbG9va3VwID0gZnVuY3Rpb24oKSB7IHJldHVybiB0YWJsZSB9XG4gICAgcmV0dXJuIHRhYmxlXG59XG5cbi8qKlxuICogQSBzdHJlYW1pbmcgZW5jb2RlclxuICpcbiAqICAgICB2YXIgZW5jb2RlciA9IG5ldyBiYXNlMzIuRW5jb2RlcigpXG4gKiAgICAgdmFyIG91dHB1dDEgPSBlbmNvZGVyLnVwZGF0ZShpbnB1dDEpXG4gKiAgICAgdmFyIG91dHB1dDIgPSBlbmNvZGVyLnVwZGF0ZShpbnB1dDIpXG4gKiAgICAgdmFyIGxhc3RvdXRwdXQgPSBlbmNvZGUudXBkYXRlKGxhc3RpbnB1dCwgdHJ1ZSlcbiAqL1xuXG5mdW5jdGlvbiBFbmNvZGVyKCkge1xuICAgIHZhciBza2lwID0gMCAvLyBob3cgbWFueSBiaXRzIHdlIHdpbGwgc2tpcCBmcm9tIHRoZSBmaXJzdCBieXRlXG4gICAgdmFyIGJpdHMgPSAwIC8vIDUgaGlnaCBiaXRzLCBjYXJyeSBmcm9tIG9uZSBieXRlIHRvIHRoZSBuZXh0XG5cbiAgICB0aGlzLm91dHB1dCA9ICcnXG5cbiAgICAvLyBSZWFkIG9uZSBieXRlIG9mIGlucHV0XG4gICAgLy8gU2hvdWxkIG5vdCByZWFsbHkgYmUgdXNlZCBleGNlcHQgYnkgXCJ1cGRhdGVcIlxuICAgIHRoaXMucmVhZEJ5dGUgPSBmdW5jdGlvbihieXRlKSB7XG4gICAgICAgIC8vIGNvZXJjZSB0aGUgYnl0ZSB0byBhbiBpbnRcbiAgICAgICAgaWYgKHR5cGVvZiBieXRlID09ICdzdHJpbmcnKSBieXRlID0gYnl0ZS5jaGFyQ29kZUF0KDApXG5cbiAgICAgICAgaWYgKHNraXAgPCAwKSB7IC8vIHdlIGhhdmUgYSBjYXJyeSBmcm9tIHRoZSBwcmV2aW91cyBieXRlXG4gICAgICAgICAgICBiaXRzIHw9IChieXRlID4+ICgtc2tpcCkpXG4gICAgICAgIH0gZWxzZSB7IC8vIG5vIGNhcnJ5XG4gICAgICAgICAgICBiaXRzID0gKGJ5dGUgPDwgc2tpcCkgJiAyNDhcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChza2lwID4gMykge1xuICAgICAgICAgICAgLy8gbm90IGVub3VnaCBkYXRhIHRvIHByb2R1Y2UgYSBjaGFyYWN0ZXIsIGdldCB1cyBhbm90aGVyIG9uZVxuICAgICAgICAgICAgc2tpcCAtPSA4XG4gICAgICAgICAgICByZXR1cm4gMVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNraXAgPCA0KSB7XG4gICAgICAgICAgICAvLyBwcm9kdWNlIGEgY2hhcmFjdGVyXG4gICAgICAgICAgICB0aGlzLm91dHB1dCArPSBhbHBoYWJldFtiaXRzID4+IDNdXG4gICAgICAgICAgICBza2lwICs9IDVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAwXG4gICAgfVxuXG4gICAgLy8gRmx1c2ggYW55IHJlbWFpbmluZyBiaXRzIGxlZnQgaW4gdGhlIHN0cmVhbVxuICAgIHRoaXMuZmluaXNoID0gZnVuY3Rpb24oY2hlY2spIHtcbiAgICAgICAgdmFyIG91dHB1dCA9IHRoaXMub3V0cHV0ICsgKHNraXAgPCAwID8gYWxwaGFiZXRbYml0cyA+PiAzXSA6ICcnKSArIChjaGVjayA/ICckJyA6ICcnKVxuICAgICAgICB0aGlzLm91dHB1dCA9ICcnXG4gICAgICAgIHJldHVybiBvdXRwdXRcbiAgICB9XG59XG5cbi8qKlxuICogUHJvY2VzcyBhZGRpdGlvbmFsIGlucHV0XG4gKlxuICogaW5wdXQ6IHN0cmluZyBvZiBieXRlcyB0byBjb252ZXJ0XG4gKiBmbHVzaDogYm9vbGVhbiwgc2hvdWxkIHdlIGZsdXNoIGFueSB0cmFpbGluZyBiaXRzIGxlZnRcbiAqICAgICAgICBpbiB0aGUgc3RyZWFtXG4gKiByZXR1cm5zOiBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzIHJlcHJlc2VudGluZyAnaW5wdXQnIGluIGJhc2UzMlxuICovXG5cbkVuY29kZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKGlucHV0LCBmbHVzaCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyApIHtcbiAgICAgICAgaSArPSB0aGlzLnJlYWRCeXRlKGlucHV0W2ldKVxuICAgIH1cbiAgICAvLyBjb25zdW1lIGFsbCBvdXRwdXRcbiAgICB2YXIgb3V0cHV0ID0gdGhpcy5vdXRwdXRcbiAgICB0aGlzLm91dHB1dCA9ICcnXG4gICAgaWYgKGZsdXNoKSB7XG4gICAgICBvdXRwdXQgKz0gdGhpcy5maW5pc2goKVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0XG59XG5cbi8vIEZ1bmN0aW9ucyBhbmFsb2dvdXNseSB0byBFbmNvZGVyXG5cbmZ1bmN0aW9uIERlY29kZXIoKSB7XG4gICAgdmFyIHNraXAgPSAwIC8vIGhvdyBtYW55IGJpdHMgd2UgaGF2ZSBmcm9tIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXJcbiAgICB2YXIgYnl0ZSA9IDAgLy8gY3VycmVudCBieXRlIHdlJ3JlIHByb2R1Y2luZ1xuXG4gICAgdGhpcy5vdXRwdXQgPSAnJ1xuXG4gICAgLy8gQ29uc3VtZSBhIGNoYXJhY3RlciBmcm9tIHRoZSBzdHJlYW0sIHN0b3JlXG4gICAgLy8gdGhlIG91dHB1dCBpbiB0aGlzLm91dHB1dC4gQXMgYmVmb3JlLCBiZXR0ZXJcbiAgICAvLyB0byB1c2UgdXBkYXRlKCkuXG4gICAgdGhpcy5yZWFkQ2hhciA9IGZ1bmN0aW9uKGNoYXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjaGFyICE9ICdzdHJpbmcnKXtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2hhciA9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIGNoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2hhciA9IGNoYXIudG9Mb3dlckNhc2UoKVxuICAgICAgICB2YXIgdmFsID0gbG9va3VwKClbY2hhcl1cbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIGNoYXJhY3RlciBkb2VzIG5vdCBleGlzdCBpbiBvdXIgbG9va3VwIHRhYmxlXG4gICAgICAgICAgICByZXR1cm4gLy8gc2tpcCBzaWxlbnRseS4gQW4gYWx0ZXJuYXRpdmUgd291bGQgYmU6XG4gICAgICAgICAgICAvLyB0aHJvdyBFcnJvcignQ291bGQgbm90IGZpbmQgY2hhcmFjdGVyIFwiJyArIGNoYXIgKyAnXCIgaW4gbG9va3VwIHRhYmxlLicpXG4gICAgICAgIH1cbiAgICAgICAgdmFsIDw8PSAzIC8vIG1vdmUgdG8gdGhlIGhpZ2ggYml0c1xuICAgICAgICBieXRlIHw9IHZhbCA+Pj4gc2tpcFxuICAgICAgICBza2lwICs9IDVcbiAgICAgICAgaWYgKHNraXAgPj0gOCkge1xuICAgICAgICAgICAgLy8gd2UgaGF2ZSBlbm91Z2ggdG8gcHJlZHVjZSBvdXRwdXRcbiAgICAgICAgICAgIHRoaXMub3V0cHV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZSlcbiAgICAgICAgICAgIHNraXAgLT0gOFxuICAgICAgICAgICAgaWYgKHNraXAgPiAwKSBieXRlID0gKHZhbCA8PCAoNSAtIHNraXApKSAmIDI1NVxuICAgICAgICAgICAgZWxzZSBieXRlID0gMFxuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICB0aGlzLmZpbmlzaCA9IGZ1bmN0aW9uKGNoZWNrKSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSB0aGlzLm91dHB1dCArIChza2lwIDwgMCA/IGFscGhhYmV0W2JpdHMgPj4gM10gOiAnJykgKyAoY2hlY2sgPyAnJCcgOiAnJylcbiAgICAgICAgdGhpcy5vdXRwdXQgPSAnJ1xuICAgICAgICByZXR1cm4gb3V0cHV0XG4gICAgfVxufVxuXG5EZWNvZGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbihpbnB1dCwgZmx1c2gpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMucmVhZENoYXIoaW5wdXRbaV0pXG4gICAgfVxuICAgIHZhciBvdXRwdXQgPSB0aGlzLm91dHB1dFxuICAgIHRoaXMub3V0cHV0ID0gJydcbiAgICBpZiAoZmx1c2gpIHtcbiAgICAgIG91dHB1dCArPSB0aGlzLmZpbmlzaCgpXG4gICAgfVxuICAgIHJldHVybiBvdXRwdXRcbn1cblxuLyoqIENvbnZlbmllbmNlIGZ1bmN0aW9uc1xuICpcbiAqIFRoZXNlIGFyZSB0aGUgb25lcyB0byB1c2UgaWYgeW91IGp1c3QgaGF2ZSBhIHN0cmluZyBhbmRcbiAqIHdhbnQgdG8gY29udmVydCBpdCB3aXRob3V0IGRlYWxpbmcgd2l0aCBzdHJlYW1zIGFuZCB3aGF0bm90LlxuICovXG5cbi8vIFN0cmluZyBvZiBkYXRhIGdvZXMgaW4sIEJhc2UzMi1lbmNvZGVkIHN0cmluZyBjb21lcyBvdXQuXG5mdW5jdGlvbiBlbmNvZGUoaW5wdXQpIHtcbiAgdmFyIGVuY29kZXIgPSBuZXcgRW5jb2RlcigpXG4gIHZhciBvdXRwdXQgPSBlbmNvZGVyLnVwZGF0ZShpbnB1dCwgdHJ1ZSlcbiAgcmV0dXJuIG91dHB1dFxufVxuXG4vLyBCYXNlMzItZW5jb2RlZCBzdHJpbmcgZ29lcyBpbiwgZGVjb2RlZCBkYXRhIGNvbWVzIG91dC5cbmZ1bmN0aW9uIGRlY29kZShpbnB1dCkge1xuICAgIHZhciBkZWNvZGVyID0gbmV3IERlY29kZXIoKVxuICAgIHZhciBvdXRwdXQgPSBkZWNvZGVyLnVwZGF0ZShpbnB1dCwgdHJ1ZSlcbiAgICByZXR1cm4gb3V0cHV0XG59XG5cbnZhciBiYXNlMzIgPSB7XG4gICAgRGVjb2RlcjogRGVjb2RlcixcbiAgICBFbmNvZGVyOiBFbmNvZGVyLFxuICAgIGVuY29kZTogZW5jb2RlLFxuICAgIGRlY29kZTogZGVjb2RlXG59XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAvLyB3ZSdyZSBpbiBhIGJyb3dzZXIgLSBPTUchXG4gIHdpbmRvdy5iYXNlMzIgPSBiYXNlMzJcbn1cblxuaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gIC8vIG5vZGVqcy9icm93c2VyaWZ5XG4gIG1vZHVsZS5leHBvcnRzID0gYmFzZTMyXG59XG59KSgpO1xuIiwiXG4vLyBub3QgaW1wbGVtZW50ZWRcbi8vIFRoZSByZWFzb24gZm9yIGhhdmluZyBhbiBlbXB0eSBmaWxlIGFuZCBub3QgdGhyb3dpbmcgaXMgdG8gYWxsb3dcbi8vIHVudHJhZGl0aW9uYWwgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtb2R1bGUuXG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBfID0gcmVxdWlyZSgnbW9sLXByb3RvJylcbiAgICAsIGNoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9jaGVjaycpXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IE1peGluO1xuXG4vKipcbiAqIGBtaWxvLmNsYXNzZXMuTWl4aW5gIC0gYW4gYWJzdHJhY3QgTWl4aW4gY2xhc3MuXG4gKiBDYW4gYmUgc3ViY2xhc3NlZCB1c2luZzpcbiAqIGBgYFxuICogdmFyIE15TWl4aW4gPSBfLmNyZWF0ZVN1YmNsYXNzKG1pbG8uY2xhc3Nlcy5NaXhpbiwgJ015TWl4aW4nKTtcbiAqIGBgYFxuICpcbiAqIE1peGluIHBhdHRlcm4gaXMgYWxzbyB1c2VkLCBidXQgTWl4aW4gaW4gbWlsbyBpcyBpbXBsZW1lbnRlZCBhcyBhIHNlcGFyYXRlIG9iamVjdCB0aGF0IGlzIHN0b3JlZCBvbiB0aGUgcHJvcGVydHkgb2YgdGhlIGhvc3Qgb2JqZWN0IGFuZCBjYW4gY3JlYXRlIHByb3h5IG1ldGhvZHMgb24gdGhlIGhvc3Qgb2JqZWN0IGlmIHJlcXVpcmVkLlxuICogQ2xhc3NlcyBbTWVzc2VuZ2VyXSguLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCkgYW5kIFtNZXNzYWdlU291cmNlXSguLi9tZXNzZW5nZXIvbV9zb3VyY2UuanMuaHRtbCkgYXJlIHN1YmNsYXNzZXMgb2YgTWl4aW4gYWJzdHJhY3QgY2xhc3MuIGB0aGlzYCBpbiBwcm94eSBtZXRob2RzIHJlZmVycyB0byBNaXhpbiBpbnN0YW5jZSwgdGhlIHJlZmVyZW5jZSB0byB0aGUgaG9zdCBvYmplY3QgaXMgYHRoaXMuX2hvc3RPYmplY3RgLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBob3N0T2JqZWN0IE9wdGlvbmFsIG9iamVjdCB3aGVyZSBhIE1peGluIGluc3RhbmNlIHdpbGwgYmUgc3RvcmVkIG9uLiBJdCBpcyB1c2VkIHRvIHByb3h5IG1ldGhvZHMgYW5kIGFsc28gdG8gZmluZCB0aGUgcmVmZXJlbmNlIHdoZW4gaXQgaXMgbmVlZGVkIGZvciBob3N0IG9iamVjdCBpbXBsZW1lbnRhdGlvbi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm94eU1ldGhvZHMgT3B0aW9uYWwgbWFwIG9mIHByb3h5IG1ldGhvZCBuYW1lcyBhcyBrZXlzIGFuZCBNaXhpbiBtZXRob2RzIG5hbWVzIGFzIHZhbHVlcywgc28gcHJveGllZCBtZXRob2RzIGNhbiBiZSByZW5hbWVkIHRvIGF2b2lkIG5hbWUtc3BhY2UgY29uZmxpY3RzIGlmIHR3byBkaWZmZXJlbnQgTWl4aW4gaW5zdGFuY2VzIHdpdGggdGhlIHNhbWUgbWV0aG9kIG5hbWVzIGFyZSBwdXQgb24gdGhlIG9iamVjdFxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgYWxsIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBpbml0IG1ldGhvZCBvZiBNaXhpbiBzdWJjbGFzcyB0b2dldGhlciB3aXRoIGhvc3RPYmplY3QgYW5kIHByb3h5TWV0aG9kc1xuICogQHJldHVybiB7TWl4aW59XG4gKi9cbmZ1bmN0aW9uIE1peGluKGhvc3RPYmplY3QsIHByb3h5TWV0aG9kcykgeyAvLyAsIG90aGVyIGFyZ3MgLSBwYXNzZWQgdG8gaW5pdCBtZXRob2RcbiAgICBjaGVjayhob3N0T2JqZWN0LCBNYXRjaC5PcHRpb25hbChNYXRjaC5PbmVPZihPYmplY3QsIEZ1bmN0aW9uKSkpO1xuXG4gICAgLy8gc3RvcmUgaG9zdE9iamVjdFxuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgJ19ob3N0T2JqZWN0JywgaG9zdE9iamVjdCk7XG5cbiAgICAvLyBwcm94eSBtZXRob2RzIHRvIGhvc3RPYmplY3RcbiAgICBpZiAocHJveHlNZXRob2RzKVxuICAgICAgICB0aGlzLl9jcmVhdGVQcm94eU1ldGhvZHMocHJveHlNZXRob2RzKTtcblxuICAgIC8vIGNhbGxpbmcgaW5pdCBpZiBpdCBpcyBkZWZpbmVkIGluIHRoZSBjbGFzc1xuICAgIGlmICh0aGlzLmluaXQpXG4gICAgICAgIHRoaXMuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5cbi8qKlxuICogIyMjI01peGluIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKiBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgYnkgY29uc3RydWN0b3IsIHRoZXkgYXJlIG5vdCB0byBiZSBjYWxsZWQgZnJvbSBzdWJjbGFzc2VzLlxuICpcbiAqIC0gW19jcmVhdGVQcm94eU1ldGhvZF0oI19jcmVhdGVQcm94eU1ldGhvZClcbiAqIC0gW19jcmVhdGVQcm94eU1ldGhvZHNdKCNfY3JlYXRlUHJveHlNZXRob2RzKVxuICovXG5fLmV4dGVuZFByb3RvKE1peGluLCB7XG4gICAgX2NyZWF0ZVByb3h5TWV0aG9kOiBfY3JlYXRlUHJveHlNZXRob2QsICAvLyBkZXByZWNhdGVkLCBzaG91bGQgbm90IGJlIHVzZWRcbiAgICBfY3JlYXRlUHJveHlNZXRob2RzOiBfY3JlYXRlUHJveHlNZXRob2RzICAvLyBkZXByZWNhdGVkLCBzaG91bGQgbm90IGJlIHVzZWRcbn0pO1xuXG5cbi8qKlxuICogIyMjI01peGluIGNsYXNzIG1ldGhvZHMjIyMjXG4gKiBUaGVzZSBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbiBob3N0IGNsYXNzIGRlY2xhcmF0aW9uLlxuICpcbiAqIC0gW3VzZVdpdGhdKCNNaXhpbiQkdXNlV2l0aClcbiAqL1xuXy5leHRlbmQoTWl4aW4sIHtcbiAgICB1c2VXaXRoOiBNaXhpbiQkdXNlV2l0aFxufSk7XG5cblxuLyoqXG4gKiBDcmVhdGVzIGEgcHJveGllZCBtZXRob2Qgb2YgTWl4aW4gc3ViY2xhc3Mgb24gaG9zdCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1peGluTWV0aG9kTmFtZSBuYW1lIG9mIG1ldGhvZCBpbiBNaXhpbiBzdWJjbGFzc1xuICogQHBhcmFtIHtTdHJpbmd9IHByb3h5TWV0aG9kTmFtZSBuYW1lIG9mIGNyZWF0ZWQgcHJveHkgbWV0aG9kIG9uIGhvc3Qgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gaG9zdE9iamVjdCBPcHRpb25hbCByZWZlcmVuY2UgdG8gdGhlIGhvc3Qgb2JqZWN0OyBpZiBub3Qgc3BlY2lmaWVkIHRoZSBob3N0IG9iamVjdCBwYXNzZWQgdG8gY29uc3RydWN0b3Igd2lsIGJlIHVzZWQuIEl0IGFsbG93cyB0byB1c2UgdGhlIHNhbWUgaW5zdGFuY2Ugb2YgTWl4aW4gb24gdHdvIGhvc3Qgb2JqZWN0cy5cbiAqL1xuZnVuY3Rpb24gX2NyZWF0ZVByb3h5TWV0aG9kKHByb3h5TWV0aG9kTmFtZSwgbWl4aW5NZXRob2ROYW1lLCBob3N0T2JqZWN0KSB7XG4gICAgaG9zdE9iamVjdCA9IGhvc3RPYmplY3QgfHwgdGhpcy5faG9zdE9iamVjdDtcblxuICAgIC8vIE1peGluIGNsYXNzIGRvZXMgbm90IGFsbG93IHNoYWRvd2luZyBtZXRob2RzIHRoYXQgZXhpc3Qgb24gdGhlIGhvc3Qgb2JqZWN0XG4gICAgaWYgKGhvc3RPYmplY3RbcHJveHlNZXRob2ROYW1lXSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtZXRob2QgJyArIHByb3h5TWV0aG9kTmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnIGFscmVhZHkgZGVmaW5lZCBpbiBob3N0IG9iamVjdCcpO1xuXG4gICAgdmFyIG1ldGhvZCA9IHRoaXNbbWl4aW5NZXRob2ROYW1lXVxuICAgIGNoZWNrKG1ldGhvZCwgRnVuY3Rpb24pO1xuXG4gICAgLy8gQmluZCBwcm94aWVkIE1peGluJ3MgbWV0aG9kIHRvIE1peGluIGluc3RhbmNlXG4gICAgdmFyIGJvdW5kTWV0aG9kID0gbWV0aG9kLmJpbmQodGhpcyk7XG5cbiAgICBfLmRlZmluZVByb3BlcnR5KGhvc3RPYmplY3QsIHByb3h5TWV0aG9kTmFtZSwgYm91bmRNZXRob2QsIF8uV1JJVCk7XG59XG5cblxuLyoqXG4gKiBDcmVhdGVzIHByb3hpZWQgbWV0aG9kcyBvZiBNaXhpbiBzdWJjbGFzcyBvbiBob3N0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge0hhc2hbU3RyaW5nXXxBcnJheVtTdHJpbmddfSBwcm94eU1ldGhvZHMgbWFwIG9mIG5hbWVzIG9mIG1ldGhvZHMsIGtleSAtIHByb3h5IG1ldGhvZCBuYW1lLCB2YWx1ZSAtIG1peGluIG1ldGhvZCBuYW1lLiBDYW4gYmUgYXJyYXkuXG4gKiBAcGFyYW0ge09iamVjdH0gaG9zdE9iamVjdCBhbiBvcHRpb25hbCByZWZlcmVuY2UgdG8gdGhlIGhvc3Qgb2JqZWN0OyBpZiBub3Qgc3BlY2lmaWVkIHRoZSBob3N0IG9iamVjdCBwYXNzZWQgdG8gY29uc3RydWN0b3Igd2lsIGJlIHVzZWQuIEl0IGFsbG93cyB0byB1c2UgdGhlIHNhbWUgaW5zdGFuY2Ugb2YgTWl4aW4gb24gdHdvIGhvc3Qgb2JqZWN0cy5cbiAqL1xuZnVuY3Rpb24gX2NyZWF0ZVByb3h5TWV0aG9kcyhwcm94eU1ldGhvZHMsIGhvc3RPYmplY3QpIHtcbiAgICBjaGVjayhwcm94eU1ldGhvZHMsIE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9uZU9mKFtTdHJpbmddLCBNYXRjaC5PYmplY3RIYXNoKFN0cmluZykpKSk7XG5cbiAgICAvLyBjcmVhdGluZyBhbmQgYmluZGluZyBwcm94eSBtZXRob2RzIG9uIHRoZSBob3N0IG9iamVjdFxuICAgIGlmIChBcnJheS5pc0FycmF5KHByb3h5TWV0aG9kcykpXG4gICAgICAgIHByb3h5TWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgICAgIC8vIG1ldGhvZCBjYWxsZWQgdGhpcyB3YXkgdG8gYWxsb3cgdXNpbmcgX2NyZWF0ZVByb3h5TWV0aG9kcyB3aXRoIG9iamVjdHNcbiAgICAgICAgICAgIC8vIHRoYXQgYXJlIG5vdCBpbmhlcml0aW5nIGZyb20gTWl4aW5cbiAgICAgICAgICAgIF9jcmVhdGVQcm94eU1ldGhvZC5jYWxsKHRoaXMsIG1ldGhvZE5hbWUsIG1ldGhvZE5hbWUsIGhvc3RPYmplY3QpO1xuICAgICAgICB9LCB0aGlzKTtcbiAgICBlbHNlXG4gICAgICAgIF8uZWFjaEtleShwcm94eU1ldGhvZHMsIGZ1bmN0aW9uKG1peGluTWV0aG9kTmFtZSwgcHJveHlNZXRob2ROYW1lKSB7XG4gICAgICAgICAgICAvLyBtZXRob2QgY2FsbGVkIHRoaXMgd2F5IHRvIGFsbG93IHVzaW5nIF9jcmVhdGVQcm94eU1ldGhvZHMgd2l0aCBvYmplY3RzXG4gICAgICAgICAgICAvLyB0aGF0IGFyZSBub3QgaW5oZXJpdGluZyBmcm9tIE1peGluXG4gICAgICAgICAgICBfY3JlYXRlUHJveHlNZXRob2QuY2FsbCh0aGlzLCBwcm94eU1ldGhvZE5hbWUsIG1peGluTWV0aG9kTmFtZSwgaG9zdE9iamVjdCk7XG4gICAgICAgIH0sIHRoaXMpO1xufVxuXG5cbi8qKlxuICogU2V0cyBtaXhpbiBpbnN0YW5jZSBwcm9wZXJ0eSBuYW1lIG9uIHRoZSBob3N0IGNsYXNzXG4gKiBDYW4gYmUgY2FsbGVkIG9ubHkgb25jZVxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aGlzIE1peGluIHN1YmNsYXNzIChub3QgaW5zdGFuY2UpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBob3N0Q2xhc3NcbiAqIEBwYXJhbSB7U3RyaW5nfSBpbnN0YW5jZUtleVxuICovXG5mdW5jdGlvbiBNaXhpbl9zZXRJbnN0YW5jZUtleShob3N0Q2xhc3MsIG1ldGhvZCwgaW5zdGFuY2VLZXkpIHtcbiAgICBjaGVjayhob3N0Q2xhc3MsIEZ1bmN0aW9uKTtcbiAgICBjaGVjayhpbnN0YW5jZUtleSwgTWF0Y2guSWRlbnRpZmllclN0cmluZyk7XG5cbiAgICB2YXIgcHJvcCA9IGNvbmZpZy5taXhpbi5pbnN0YW5jZVByb3BlcnRpZXNNYXBcbiAgICAgICAgLCBpbnN0YW5jZUtleXMgPSBob3N0Q2xhc3NbcHJvcF0gPSBob3N0Q2xhc3NbcHJvcF0gfHwge307XG5cbiAgICBpZiAoaW5zdGFuY2VLZXlzW21ldGhvZC5uYW1lXSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXhpbjogaW5zdGFuY2UgcHJvcGVydHkgZm9yIG1ldGhvZCB3aXRoIG5hbWUgJ1xuICAgICAgICAgICAgKyBtZXRob2QubmFtZSArICcgaXMgYWxyZWFkeSBzZXQnKTtcblxuICAgIGluc3RhbmNlS2V5c1ttZXRob2QubmFtZV0gPSBpbnN0YW5jZUtleTtcbn1cblxuXG4vKipcbiAqIEFkZHMgbWV0aG9kIG9mIE1peGluIHN1YmNsYXNzIHRvIGhvc3QgY2xhc3MgcHJvdG90eXBlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aGlzIE1peGluIHN1YmNsYXNzIChub3QgaW5zdGFuY2UpXG4gKiBAcGFyYW0ge1N0cmluZ30gbWl4aW5NZXRob2ROYW1lIG5hbWUgb2YgbWV0aG9kIGluIE1peGluIHN1YmNsYXNzXG4gKiBAcGFyYW0ge1N0cmluZ30gaG9zdE1ldGhvZE5hbWUgKG9wdGlvbmFsKSBuYW1lIG9mIGNyZWF0ZWQgcHJveHkgbWV0aG9kIG9uIGhvc3Qgb2JqZWN0LCBzYW1lIGlmIG5vdCBzcGVjaWZpZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBob3N0T2JqZWN0IG9iamVjdCBjbGFzcywgbXVzdCBiZSBzcGVjaWZpZWQgYXMgdGhlIGxhc3QgcGFyYW1ldGVyICgybmQgb3IgM3JkKVxuICovXG5mdW5jdGlvbiBNaXhpbl9hZGRNZXRob2QoaG9zdENsYXNzLCBpbnN0YW5jZUtleSwgbWl4aW5NZXRob2ROYW1lLCBob3N0TWV0aG9kTmFtZSkge1xuICAgIHZhciBtZXRob2QgPSB0aGlzLnByb3RvdHlwZVttaXhpbk1ldGhvZE5hbWVdO1xuICAgIGNoZWNrKG1ldGhvZCwgRnVuY3Rpb24pO1xuXG4gICAgdmFyIHdyYXBwZWRNZXRob2QgPSBfd3JhcE1peGluTWV0aG9kLmNhbGwodGhpcywgbWV0aG9kKTtcblxuICAgIF8uZGVmaW5lUHJvcGVydHkoaG9zdENsYXNzLnByb3RvdHlwZSwgaG9zdE1ldGhvZE5hbWUsIHdyYXBwZWRNZXRob2QsIF8uV1JJVCk7XG5cbiAgICBNaXhpbl9zZXRJbnN0YW5jZUtleShob3N0Q2xhc3MsIG1ldGhvZCwgaW5zdGFuY2VLZXkpXG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIG1ldGhvZCB0aGF0IHdpbGwgYmUgZXhwb3NlZCBvbiB0aGUgaG9zdCBjbGFzcyBwcm90b3R5cGVcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gdGhpcyBNaXhpbiBzdWJjbGFzcyAobm90IGluc3RhbmNlKVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIF93cmFwTWl4aW5NZXRob2QobWV0aG9kKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkgeyAvLyAsLi4uIGFyZ3VtZW50c1xuICAgICAgICB2YXIgbWl4aW5JbnN0YW5jZSA9IF9nZXRNaXhpbkluc3RhbmNlLmNhbGwodGhpcywgbWV0aG9kLm5hbWUpO1xuICAgICAgICByZXR1cm4gbWV0aG9kLmFwcGx5KG1peGluSW5zdGFuY2UsIGFyZ3VtZW50cyk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgcmVmZXJlbmNlIHRvIHRoZSBpbnN0YW5jZSBvZiBtaXhpbiBzdWJjbGFzcy5cbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgd2hlbiBtZXRob2RzIGFyZSBleHBvc2VkIG9uIHRoZSBob3N0IGNsYXNzIHByb3RvdHlwZSAodXNpbmcgYWRkTWVodG9kcykgcmF0aGVyIHRoYW4gb24gaG9zdCBpbnN0YW5jZS5cbiAqIFN1YmNsYXNzZXMgc2hvdWxkIG5vdCB1c2UgdGhpcyBtZXRob2RzIC0gd2hlbmV2ZXIgc3ViY2xhc3MgbWV0aG9kIGlzIGV4cG9zZWQgb24gdGhlIHByb3RvdHlwZSBpdCB3aWxsIGJlIHdyYXBwZWQgdG8gc2V0IGNvcnJlY3QgY29udGV4dCBmb3IgdGhlIHN1YmNsYXNzIG1ldGhvZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBfZ2V0TWl4aW5JbnN0YW5jZShtZXRob2ROYW1lKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBNaXhpbikgcmV0dXJuIHRoaXM7XG4gICAgdmFyIGluc3RhbmNlS2V5cyA9IHRoaXMuY29uc3RydWN0b3JbY29uZmlnLm1peGluLmluc3RhbmNlUHJvcGVydGllc01hcF1cbiAgICByZXR1cm4gdGhpc1tpbnN0YW5jZUtleXNbbWV0aG9kTmFtZV1dO1xufVxuXG5cbi8qKlxuICogQWRkcyBtZXRob2RzIG9mIE1peGluIHN1YmNsYXNzIHRvIGhvc3QgY2xhc3MgcHJvdG90eXBlLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRoaXMgTWl4aW4gc3ViY2xhc3MgKG5vdCBpbnN0YW5jZSlcbiAqIEBwYXJhbSB7T2JqZWN0fSBob3N0Q2xhc3MgaG9zdCBvYmplY3QgY2xhc3M7IG11c3QgYmUgc3BlY2lmaWVkLlxuICogQHBhcmFtIHtTdHJpbmd9IGluc3RhbmNlS2V5IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGUgaG9zdCBjbGFzcyBpbnN0YW5jZSB3aWxsIHN0b3JlIG1peGluIGluc3RhbmNlIG9uXG4gKiBAcGFyYW0ge0hhc2hbU3RyaW5nXXxBcnJheVtTdHJpbmddfSBtaXhpbk1ldGhvZHMgbWFwIG9mIG5hbWVzIG9mIG1ldGhvZHMsIGtleSAtIGhvc3QgbWV0aG9kIG5hbWUsIHZhbHVlIC0gbWl4aW4gbWV0aG9kIG5hbWUuIENhbiBiZSBhcnJheS5cbiAqL1xuZnVuY3Rpb24gTWl4aW4kJHVzZVdpdGgoaG9zdENsYXNzLCBpbnN0YW5jZUtleSwgbWl4aW5NZXRob2RzKSB7XG4gICAgY2hlY2sobWl4aW5NZXRob2RzLCBNYXRjaC5PcHRpb25hbChNYXRjaC5PbmVPZihbU3RyaW5nXSwgTWF0Y2guT2JqZWN0SGFzaChTdHJpbmcpKSkpO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobWl4aW5NZXRob2RzKSlcbiAgICAgICAgbWl4aW5NZXRob2RzLmZvckVhY2goZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgICAgICAgTWl4aW5fYWRkTWV0aG9kLmNhbGwodGhpcywgaG9zdENsYXNzLCBpbnN0YW5jZUtleSwgbWV0aG9kTmFtZSwgbWV0aG9kTmFtZSk7XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIGVsc2VcbiAgICAgICAgXy5lYWNoS2V5KG1peGluTWV0aG9kcywgZnVuY3Rpb24obWl4aW5NZXRob2ROYW1lLCBob3N0TWV0aG9kTmFtZSkge1xuICAgICAgICAgICAgTWl4aW5fYWRkTWV0aG9kLmNhbGwodGhpcywgaG9zdENsYXNzLCBpbnN0YW5jZUtleSwgbWl4aW5NZXRob2ROYW1lLCBob3N0TWV0aG9kTmFtZSk7XG4gICAgICAgIH0sIHRoaXMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyA8YSBuYW1lPVwiY2xhc3Nlc1wiPjwvYT5cbi8vIG1pbG8uY2xhc3Nlc1xuLy8gLS0tLS0tLS0tLS1cblxuLy8gVGhpcyBtb2R1bGUgY29udGFpbnMgZm91bmRhdGlvbiBjbGFzc2VzXG5cbnZhciBjbGFzc2VzID0ge1xuICAgIE1peGluOiByZXF1aXJlKCcuL2Fic3RyYWN0L21peGluJyksXG4gICAgTWVzc2FnZVNvdXJjZTogcmVxdWlyZSgnLi9tZXNzZW5nZXIvbV9zb3VyY2UnKSxcbiAgICBNZXNzZW5nZXJNZXNzYWdlU291cmNlOiByZXF1aXJlKCcuL21lc3Nlbmdlci9tc25ncl9zb3VyY2UnKSxcbiAgICBNZXNzZW5nZXJBUEk6IHJlcXVpcmUoJy4vbWVzc2VuZ2VyL21fYXBpJyksXG4gICAgTWVzc2VuZ2VyUmVnZXhwQVBJOiByZXF1aXJlKCcuL21lc3Nlbmdlci9tX2FwaV9yeCcpXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzZXM7XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbmZpZztcblxuZnVuY3Rpb24gY29uZmlnKG9wdGlvbnMpIHtcbiAgICBfLmRlZXBFeHRlbmQoY29uZmlnLCBvcHRpb25zKTtcbn1cblxuY29uZmlnKHtcbiAgICBtaXhpbjoge1xuICAgICAgICBpbnN0YW5jZVByb3BlcnRpZXNNYXA6ICdfX19taXhpbl9pbnN0YW5jZXMnXG4gICAgfSxcbiAgICBjaGVjazogdHJ1ZSxcbiAgICBkZWJ1ZzogZmFsc2Vcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgTWl4aW4gPSByZXF1aXJlKCcuLi9hYnN0cmFjdC9taXhpbicpXG4gICAgLCBNZXNzYWdlU291cmNlID0gcmVxdWlyZSgnLi9tX3NvdXJjZScpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJylcbiAgICAsIGNoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9jaGVjaycpXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5cbi8qKlxuICogYG1pbG8uTWVzc2VuZ2VyYFxuICogQSBnZW5lcmljIE1lc3NlbmdlciBjbGFzcyB0aGF0IGlzIHVzZWQgZm9yIGFsbCBraW5kcyBvZiBtZXNzYWdpbmcgaW4gbWlsby4gSXQgaXMgc3ViY2xhc3NlZCBmcm9tIFtNaXhpbl0oLi4vYWJzdHJhY3QvbWl4aW4uanMuaHRtbCkgYW5kIGl0IHByb3hpZXMgaXRzIG1ldGhvZHMgdG8gdGhlIGhvc3Qgb2JqZWN0IGZvciBjb252ZW5pZW5jZS5cbiAqIEFsbCBmYWNldHMgYW5kIGNvbXBvbmVudHMgaGF2ZSBtZXNzZW5nZXIgYXR0YWNoZWQgdG8gdGhlbS4gTWVzc2VuZ2VyIGNsYXNzIGludGVyb3BlcmF0ZXMgd2l0aCBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBjbGFzcyB0aGF0IGNvbm5lY3RzIHRoZSBtZXNzZW5nZXIgdG8gc29tZSBleHRlcm5hbCBzb3VyY2Ugb2YgbWVzc2FnZXMgKGUuZy4sIERPTSBldmVudHMpIGFuZCBbTWVzc2VuZ2VyQVBJXSguL21fYXBpLmpzLmh0bWwpIGNsYXNzIHRoYXQgYWxsb3dzIHRvIGRlZmluZSBoaWdoZXIgbGV2ZWwgbWVzc2FnZXMgdGhhbiBtZXNzYWdlcyB0aGF0IGV4aXN0IG9uIHRoZSBzb3VyY2UuXG4gKiBNZXNzZW5nZXIgY2xhc3MgaXMgdXNlZCBpbnRlcm5hbGx5IGluIG1pbG8gYW5kIGNhbiBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggYW55IG9iamVjdHMvY2xhc3NlcyBpbiB0aGUgYXBwbGljYXRpb24uXG4gKiBtaWxvIGFsc28gZGVmaW5lcyBhIGdsb2JhbCBtZXNzZW5nZXIgW21pbG8ubWFpbF0oLi4vbWFpbC9pbmRleC5qcy5odG1sKSB0aGF0IGRpc3BhdGNoZXMgYGRvbXJlYWR5YCBldmVudCBhbmQgY2FuIGJlIHVzZWQgZm9yIGFueSBhcHBsaWNhdGlvbiB3aWRlIG1lc3NhZ2luZy5cbiAqIFRvIGluaXRpYWxpemUgeW91ciBhcHAgYWZ0ZXIgRE9NIGlzIHJlYWR5IHVzZTpcbiAqIGBgYFxuICogbWlsby5tYWlsLm9uKCdkb21yZWFkeScsIGZ1bmN0aW9uKCkge1xuICogICAgIC8vIGFwcGxpY2F0aW9uIHN0YXJ0c1xuICogfSk7XG4gKiBgYGBcbiAqIG9yIHRoZSBmb2xsb3dpbmcgc2hvcnRlciBmb3JtIG9mIHRoZSBzYW1lOlxuICogYGBgXG4gKiBtaWxvKGZ1bmN0aW9uKCkge1xuICogICAgIC8vIGFwcGxpY2F0aW9uIHN0YXJ0c1xuICogfSk7XG4gKiBgYGBcbiAqL1xudmFyIE1lc3NlbmdlciA9IF8uY3JlYXRlU3ViY2xhc3MoTWl4aW4sICdNZXNzZW5nZXInKTtcblxudmFyIG1lc3NhZ2VzU3BsaXRSZWdFeHAgPSBNZXNzZW5nZXIubWVzc2FnZXNTcGxpdFJlZ0V4cCA9IC9cXHMqKD86XFwsfFxccylcXHMqLztcblxuXG4vKipcbiAqICMjIyNNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kcyMjIyNcbiAqXG4gKiAtIFtpbml0XSgjaW5pdClcbiAqIC0gW29uXSgjTWVzc2VuZ2VyJG9uKSAoYWxpYXMgLSBvbk1lc3NhZ2UsIGRlcHJlY2F0ZWQpXG4gKiAtIFtvZmZdKCNNZXNzZW5nZXIkb2ZmKSAoYWxpYXMgLSBvZmZNZXNzYWdlLCBkZXByZWNhdGVkKVxuICogLSBbb25NZXNzYWdlc10oI29uTWVzc2FnZXMpXG4gKiAtIFtvZmZNZXNzYWdlc10oI29mZk1lc3NhZ2VzKVxuICogLSBbb25jZV0oI29uY2UpXG4gKiAtIFtvbmNlU3luY10oI29uY2VTeW5jKVxuICogLSBbcG9zdE1lc3NhZ2VdKCNwb3N0TWVzc2FnZSlcbiAqIC0gW2dldFN1YnNjcmliZXJzXSgjZ2V0U3Vic2NyaWJlcnMpXG4gKlxuICogXCJQcml2YXRlXCIgbWV0aG9kc1xuICpcbiAqIC0gW19jaG9vc2VTdWJzY3JpYmVyc0hhc2hdKCNfY2hvb3NlU3Vic2NyaWJlcnNIYXNoKVxuICogLSBbX3JlZ2lzdGVyU3Vic2NyaWJlcl0oI19yZWdpc3RlclN1YnNjcmliZXIpXG4gKiAtIFtfcmVtb3ZlU3Vic2NyaWJlcl0oI19yZW1vdmVTdWJzY3JpYmVyKVxuICogLSBbX3JlbW92ZUFsbFN1YnNjcmliZXJzXSgjX3JlbW92ZUFsbFN1YnNjcmliZXJzKVxuICogLSBbX2NhbGxQYXR0ZXJuU3Vic2NyaWJlcnNdKCNfY2FsbFBhdHRlcm5TdWJzY3JpYmVycylcbiAqIC0gW19jYWxsU3Vic2NyaWJlcnNdKCNfY2FsbFN1YnNjcmliZXJzKVxuICogLSBbX3NldE1lc3NhZ2VTb3VyY2VdKCNfc2V0TWVzc2FnZVNvdXJjZSlcbiAqIC0gW2dldE1lc3NhZ2VTb3VyY2VdKCNnZXRNZXNzYWdlU291cmNlKVxuICovXG5fLmV4dGVuZFByb3RvKE1lc3Nlbmdlciwge1xuICAgIGluaXQ6IGluaXQsIC8vIGNhbGxlZCBieSBNaXhpbiAoc3VwZXJjbGFzcylcbiAgICBkZXN0cm95OiBNZXNzZW5nZXIkZGVzdHJveSxcbiAgICBvbjogTWVzc2VuZ2VyJG9uLFxuICAgIG9uY2U6IE1lc3NlbmdlciRvbmNlLFxuICAgIG9uY2VTeW5jOiBNZXNzZW5nZXIkb25jZVN5bmMsXG4gICAgb25TeW5jOiBNZXNzZW5nZXIkb25TeW5jLFxuICAgIG9uQXN5bmM6IE1lc3NlbmdlciRvbkFzeW5jLFxuICAgIG9uTWVzc2FnZTogTWVzc2VuZ2VyJG9uLCAvLyBkZXByZWNhdGVkXG4gICAgb2ZmOiBNZXNzZW5nZXIkb2ZmLFxuICAgIG9mZk1lc3NhZ2U6IE1lc3NlbmdlciRvZmYsIC8vIGRlcHJlY2F0ZWRcbiAgICBvbk1lc3NhZ2VzOiBvbk1lc3NhZ2VzLFxuICAgIG9mZk1lc3NhZ2VzOiBvZmZNZXNzYWdlcyxcbiAgICBvZmZBbGw6IE1lc3NlbmdlciRvZmZBbGwsXG4gICAgcG9zdE1lc3NhZ2U6IHBvc3RNZXNzYWdlLFxuICAgIHBvc3RNZXNzYWdlU3luYzogcG9zdE1lc3NhZ2VTeW5jLFxuICAgIGdldFN1YnNjcmliZXJzOiBnZXRTdWJzY3JpYmVycyxcbiAgICBnZXRNZXNzYWdlU291cmNlOiBnZXRNZXNzYWdlU291cmNlLFxuICAgIF9jaG9vc2VTdWJzY3JpYmVyc0hhc2g6IF9jaG9vc2VTdWJzY3JpYmVyc0hhc2gsXG4gICAgX3JlZ2lzdGVyU3Vic2NyaWJlcjogX3JlZ2lzdGVyU3Vic2NyaWJlcixcbiAgICBfcmVtb3ZlU3Vic2NyaWJlcjogX3JlbW92ZVN1YnNjcmliZXIsXG4gICAgX3JlbW92ZUFsbFN1YnNjcmliZXJzOiBfcmVtb3ZlQWxsU3Vic2NyaWJlcnMsXG4gICAgX2NhbGxQYXR0ZXJuU3Vic2NyaWJlcnM6IF9jYWxsUGF0dGVyblN1YnNjcmliZXJzLFxuICAgIF9jYWxsU3Vic2NyaWJlcnM6IF9jYWxsU3Vic2NyaWJlcnMsXG4gICAgX2NhbGxTdWJzY3JpYmVyOiBfY2FsbFN1YnNjcmliZXIsXG4gICAgX3NldE1lc3NhZ2VTb3VyY2U6IF9zZXRNZXNzYWdlU291cmNlXG59KTtcblxuXG4vKipcbiAqIEEgZGVmYXVsdCBtYXAgb2YgcHJveHkgbWV0aG9kcyB1c2VkIGJ5IENvbXBvbmVudEZhY2V0IGFuZCBDb21wb25lbnQgY2xhc3NlcyB0byBwYXNzIHRvIE1lc3NlbmdlciB3aGVuIGl0IGlzIGluc3RhbnRpYXRlZC5cbiAqIFRoaXMgbWFwIGlzIGZvciBjb252ZW5pZW5jZSBvbmx5LCBpdCBpcyBOT1QgdXNlZCBpbnRlcm5hbGx5IGJ5IE1lc3NlbmdlciwgYSBob3N0IGNsYXNzIHNob3VsZCBwYXNzIGl0IGZvciBtZXRob2RzIHRvIGJlIHByb3hpZWQgdGhpcyB3YXkuXG4gKi9cbk1lc3Nlbmdlci5kZWZhdWx0TWV0aG9kcyA9IHtcbiAgICBvbjogJ29uJyxcbiAgICBvblN5bmM6ICdvblN5bmMnLFxuICAgIG9uY2U6ICdvbmNlJyxcbiAgICBvbmNlU3luYzogJ29uY2VTeW5jJyxcbiAgICBvZmY6ICdvZmYnLFxuICAgIG9uTWVzc2FnZXM6ICdvbk1lc3NhZ2VzJyxcbiAgICBvZmZNZXNzYWdlczogJ29mZk1lc3NhZ2VzJyxcbiAgICBwb3N0TWVzc2FnZTogJ3Bvc3RNZXNzYWdlJyxcbiAgICBwb3N0TWVzc2FnZVN5bmM6ICdwb3N0TWVzc2FnZVN5bmMnLFxuICAgIGdldFN1YnNjcmliZXJzOiAnZ2V0U3Vic2NyaWJlcnMnXG59O1xuXG5cbm1vZHVsZS5leHBvcnRzID0gTWVzc2VuZ2VyO1xuXG5cbk1lc3Nlbmdlci5zdWJzY3JpcHRpb25zID0gW107XG5cblxuLyoqXG4gKiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXplcyBNZXNzZW5nZXIuIE1ldGhvZCBpcyBjYWxsZWQgYnkgTWl4aW4gY2xhc3MgY29uc3RydWN0b3IuXG4gKiBTZWUgW29uXSgjTWVzc2VuZ2VyJG9uKSBtZXRob2QsIFtNZXNzZW5nZXJdKCNNZXNzZW5nZXIpIGNsYXNzIGFib3ZlIGFuZCBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaG9zdE9iamVjdCBPcHRpb25hbCBvYmplY3QgdGhhdCBzdG9yZXMgdGhlIG1lc3NlbmdlciBvbiBvbmUgb2YgaXRzIHByb3BlcnRpZXMuIEl0IGlzIHVzZWQgdG8gcHJveHkgbWV0aG9kcyBvZiBtZXNzZW5nZXIgYW5kIGFsc28gYXMgYSBjb250ZXh0IGZvciBzdWJzY3JpYmVycyB3aGVuIHRoZXkgYXJlIGNhbGxlZCBieSB0aGUgTWVzc2VuZ2VyLiBTZWUgYG9uYCBtZXRob2QuXG4gKiBAcGFyYW0ge09iamVjdH0gcHJveHlNZXRob2RzIE9wdGlvbmFsIG1hcCBvZiBtZXRob2QgbmFtZXM7IGtleSAtIHByb3h5IG1ldGhvZCBuYW1lLCB2YWx1ZSAtIG1lc3NlbmdlcidzIG1ldGhvZCBuYW1lLlxuICogQHBhcmFtIHtNZXNzYWdlU291cmNlfSBtZXNzYWdlU291cmNlIE9wdGlvbmFsIG1lc3NhZ2VTb3VyY2UgbGlua2VkIHRvIHRoZSBtZXNzZW5nZXIuIElmIG1lc3NhZ2VTb3VyY2UgaXMgc3VwcGxpZWQsIHRoZSByZWZlcmVuY2UgdG8gdGhlIG1lc3NlbmdlciB3aWxsIHN0b3JlZCBvbiBpdHMgJ21lc3NlbmdlcicgcHJvcGVydHlcbiAqL1xuZnVuY3Rpb24gaW5pdChob3N0T2JqZWN0LCBwcm94eU1ldGhvZHMsIG1lc3NhZ2VTb3VyY2UpIHtcbiAgICAvLyBob3N0T2JqZWN0IGFuZCBwcm94eU1ldGhvZHMgYXJlIHVzZWQgaW4gTWl4aW4gYW5kIGNoZWNrZWQgdGhlcmVcbiAgICBpZiAobWVzc2FnZVNvdXJjZSlcbiAgICAgICAgdGhpcy5fc2V0TWVzc2FnZVNvdXJjZShtZXNzYWdlU291cmNlKTtcblxuICAgIF9pbml0aWFsaXplU3Vic2NyaWJlcnMuY2FsbCh0aGlzKTtcbn1cblxuXG5mdW5jdGlvbiBfaW5pdGlhbGl6ZVN1YnNjcmliZXJzKCkge1xuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIF9tZXNzYWdlU3Vic2NyaWJlcnM6IHt9LFxuICAgICAgICBfcGF0dGVybk1lc3NhZ2VTdWJzY3JpYmVyczoge30sXG4gICAgfSwgXy5DT05GKTtcbn1cblxuXG4vKipcbiAqIERlc3Ryb3lzIG1lc3Nlbmdlci4gTWF5YmUgbmVlZHMgdG8gdW5zdWJzY3JpYmUgYWxsIHN1YnNjcmliZXJzXG4gKi9cbmZ1bmN0aW9uIE1lc3NlbmdlciRkZXN0cm95KCkge1xuICAgIHRoaXMub2ZmQWxsKCk7XG4gICAgdmFyIG1lc3NhZ2VTb3VyY2UgPSB0aGlzLmdldE1lc3NhZ2VTb3VyY2UoKTtcbiAgICBpZiAobWVzc2FnZVNvdXJjZSlcbiAgICAgICAgbWVzc2FnZVNvdXJjZS5kZXN0cm95KCk7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kLlxuICogUmVnaXN0ZXJzIGEgc3Vic2NyaWJlciBmdW5jdGlvbiBmb3IgYSBjZXJ0YWluIG1lc3NhZ2UocykuXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3Vic2NyaXB0aW9uIHdhcyBzdWNjZXNzZnVsLiBJdCBjYW4gYmUgdW5zdWNjZXNzZnVsIGlmIHRoZSBwYXNzZWQgc3Vic2NyaWJlciBoYXMgYWxyZWFkeSBiZWVuIHN1YnNjcmliZWQgdG8gdGhpcyBtZXNzYWdlIHR5cGUgLSBkb3VibGUgc3Vic2NyaXB0aW9uIG5ldmVyIGhhcHBlbnMgYW5kIGl0IGlzIHNhZmUgdG8gc3Vic2NyaWJlIGFnYWluIC0gbm8gZXJyb3Igb3Igd2FybmluZyBpcyB0aHJvd24gb3IgbG9nZ2VkLlxuICogU3Vic2NyaWJlciBpcyBwYXNzZWQgdHdvIHBhcmFtZXRlcnM6IGBtZXNzYWdlYCAoc3RyaW5nKSBhbmQgYGRhdGFgIChvYmplY3QpLiBEYXRhIG9iamVjdCBpcyBzdXBwbGllZCB3aGVuIG1lc3NhZ2UgaXMgZGlzcGF0Y2hlZCwgTWVzc2VuZ2VyIGl0c2VsZiBhZGRzIG5vdGhpbmcgdG8gaXQuIEZvciBleGFtcGxlLCBbZXZlbnRzIGZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXRzL0V2ZW50cy5qcy5odG1sKSBzZW5kcyBhY3R1YWwgRE9NIGV2ZW50IHdoZW4gaXQgcG9zdHMgbWVzc2FnZS5cbiAqIFVzYWdlOlxuICogYGBgXG4gKiAvLyBzdWJzY3JpYmVzIG9uTW91c2VVcERvd24gdG8gdHdvIERPTSBldmVudHMgb24gY29tcG9uZW50IHZpYSBldmVudHMgZmFjZXQuXG4gKiBteUNvbXAuZXZlbnRzLm9uKCdtb3VzZWRvd24gbW91c2V1cCcsIG9uTW91c2VVcERvd24pO1xuICogZnVuY3Rpb24gb25Nb3VzZVVwRG93bihldmVudFR5cGUsIGV2ZW50KSB7XG4gKiAgICAgLy8gLi4uXG4gKiB9XG4gKlxuICogbXlDb21wLmRhdGEub24oLy4rLywgZnVuY3Rpb24obXNnLCBkYXRhKSB7XG4gKiAgICAgbG9nZ2VyLmRlYnVnKG1zZywgZGF0YSk7XG4gKiB9KTsgLy8gc3Vic2NyaWJlcyBhbm9ueW1vdXMgZnVuY3Rpb24gdG8gYWxsIG5vbi1lbXB0eSBtZXNzYWdlcyBvbiBkYXRhIGZhY2V0XG4gKiAvLyBpdCB3aWxsIG5vdCBiZSBwb3NzaWJsZSB0byB1bnN1YnNjcmliZSBhbm9ueW1vdXMgc3Vic2NyaWJlciBzZXBhcmF0ZWx5LFxuICogLy8gYnV0IG15Q29tcC5kYXRhLm9mZigvLisvKSB3aWxsIHVuc3Vic2NyaWJlIGl0XG4gKiBgYGBcbiAqIElmIG1lc3NlbmdlciBoYXMgW01lc3NhZ2VTb3VyY2VdKC4vbV9zb3VyY2UuanMuaHRtbCkgYXR0YWNoZWQgdG8gaXQsIE1lc3NhZ2VTb3VyY2Ugd2lsbCBiZSBub3RpZmllZCB3aGVuIHRoZSBmaXJzdCBzdWJzY3JpYmVyIGZvciBhIGdpdmVuIG1lc3NhZ2UgaXMgYWRkZWQsIHNvIGl0IGNhbiBzdWJzY3JpYmUgdG8gdGhlIHNvdXJjZS5cbiAqIFtDb21wb25lbnRzXSguLi9jb21wb25lbnRzL2NfY2xhc3MuanMuaHRtbCkgYW5kIFtmYWNldHNdKC4uL2NvbXBvbmVudHMvY19mYWNldC5qcy5odG1sKSBjaGFuZ2UgdGhpcyBtZXRob2QgbmFtZSB0byBgb25gIHdoZW4gdGhleSBwcm94eSBpdC5cbiAqIFNlZSBbcG9zdE1lc3NhZ2VdKCNwb3N0TWVzc2FnZSkuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXlbU3RyaW5nXXxSZWdFeHB9IG1lc3NhZ2VzIE1lc3NhZ2UgdHlwZXMgdGhhdCBzaG91bGQgZW52b2tlIHRoZSBzdWJzY3JpYmVyLlxuICogIElmIHN0cmluZyBpcyBwYXNzZWQsIGl0IGNhbiBiZSBhIHNpZ2xlIG1lc3NhZ2Ugb3IgbXVsdGlwbGUgbWVzc2FnZSB0eXBlcyBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSB3aXRoIG9wdGlvbmFsIGNvbW1hcy5cbiAqICBJZiBhbiBhcnJheSBvZiBzdHJpbmdzIGlzIHBhc3NlZCwgZWFjaCBzdHJpbmcgaXMgYSBtZXNzYWdlIHR5cGUgdG8gc3Vic2NyaWJlIGZvci5cbiAqICBJZiBhIFJlZ0V4cCBpcyBwYXNzZWQsIHRoZSBzdWJzY3JpYmVyIHdpbGwgYmUgZW52b2tlZCB3aGVuIHRoZSBtZXNzYWdlIGRpc3BhdGNoZWQgb24gdGhlIG1lc3NlbmdlciBtYXRjaGVzIHRoZSBwYXR0ZXJuIChvciBJUyB0aGUgUmVnRXhwIHdpdGggaWRlbnRpY2FsIHBhdHRlcm4pLlxuICogIFBhdHRlcm4gc3Vic2NyaWJlciBkb2VzIE5PVCBjYXVzZSBhbnkgc3Vic2NyaXB0aW9uIHRvIE1lc3NhZ2VTb3VyY2UsIGl0IG9ubHkgY2FwdHVyZXMgbWVzc2FnZXMgdGhhdCBhcmUgYWxyZWFkeSBzdWJzY3JpYmVkIHRvIHdpdGggcHJlY2lzZSBtZXNzYWdlIHR5cGVzLlxuICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R9IHN1YnNjcmliZXIgTWVzc2FnZSBzdWJzY3JpYmVyIC0gYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIG1lc3NhZ2UgaXMgZGlzcGF0Y2hlZCBvbiB0aGUgbWVzc2VuZ2VyICh1c3VhbGx5IHZpYSBwcm94aWVkIHBvc3RNZXNzYWdlIG1ldGhvZCBvZiBob3N0IG9iamVjdCkuXG4gKiAgSWYgaG9zdE9iamVjdCB3YXMgc3VwcGxpZWQgdG8gTWVzc2VuZ2VyIGNvbnN0cnVjdG9yLCBob3N0T2JqZWN0IHdpbGwgYmUgdGhlIGNvbnRleHQgKHRoZSB2YWx1ZSBvZiB0aGlzKSBmb3IgdGhlIHN1YnNjcmliZXIgZW52b2NhdGlvbi5cbiAqICBTdWJzY3JpYmVyIGNhbiBhbHNvIGJlIGFuIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgYHN1YnNjcmliZXJgIChmdW5jdGlvbikgYW5kIGBjb250ZXh0YCAoXCJ0aGlzXCIgdmFsdWUgd2hlbiBzdWJzY3JpYmVyIGlzIGNhbGxlZClcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIE1lc3NlbmdlciRvbihtZXNzYWdlcywgc3Vic2NyaWJlcikge1xuICAgIHJldHVybiBfTWVzc2VuZ2VyX29uV2l0aE9wdGlvbnMuY2FsbCh0aGlzLCBtZXNzYWdlcywgc3Vic2NyaWJlcik7XG59XG5cblxuZnVuY3Rpb24gTWVzc2VuZ2VyJG9uY2UobWVzc2FnZXMsIHN1YnNjcmliZXIpIHtcbiAgICByZXR1cm4gX01lc3Nlbmdlcl9vbldpdGhPcHRpb25zLmNhbGwodGhpcywgbWVzc2FnZXMsIHN1YnNjcmliZXIsIHsgZGlzcGF0Y2hUaW1lczogMSB9KTtcbn1cblxuZnVuY3Rpb24gTWVzc2VuZ2VyJG9uY2VTeW5jKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKSB7XG4gICAgcmV0dXJuIF9NZXNzZW5nZXJfb25XaXRoT3B0aW9ucy5jYWxsKHRoaXMsIG1lc3NhZ2VzLCBzdWJzY3JpYmVyLCB7IGRpc3BhdGNoVGltZXM6IDEsIHN5bmM6IHRydWUgfSk7XG59XG5cblxuZnVuY3Rpb24gTWVzc2VuZ2VyJG9uU3luYyhtZXNzYWdlcywgc3Vic2NyaWJlcikge1xuICAgIHJldHVybiBfTWVzc2VuZ2VyX29uV2l0aE9wdGlvbnMuY2FsbCh0aGlzLCBtZXNzYWdlcywgc3Vic2NyaWJlciwgeyBzeW5jOiB0cnVlIH0pO1xufVxuXG5cbmZ1bmN0aW9uIE1lc3NlbmdlciRvbkFzeW5jKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKSB7XG4gICAgcmV0dXJuIF9NZXNzZW5nZXJfb25XaXRoT3B0aW9ucy5jYWxsKHRoaXMsIG1lc3NhZ2VzLCBzdWJzY3JpYmVyLCB7IHN5bmM6IGZhbHNlIH0pO1xufVxuXG5cbmZ1bmN0aW9uIF9NZXNzZW5nZXJfb25XaXRoT3B0aW9ucyhtZXNzYWdlcywgc3Vic2NyaWJlciwgb3B0aW9ucykge1xuICAgIGNoZWNrKG1lc3NhZ2VzLCBNYXRjaC5PbmVPZihTdHJpbmcsIFtTdHJpbmddLCBSZWdFeHApKTtcbiAgICBjaGVjayhzdWJzY3JpYmVyLCBNYXRjaC5PbmVPZihGdW5jdGlvbiwge1xuICAgICAgICBzdWJzY3JpYmVyOiBGdW5jdGlvbixcbiAgICAgICAgY29udGV4dDogTWF0Y2guQW55LFxuICAgICAgICBvcHRpb25zOiBNYXRjaC5PcHRpb25hbChPYmplY3QpLFxuICAgIH0pKTtcblxuICAgIGlmICh0eXBlb2Ygc3Vic2NyaWJlciA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHN1YnNjcmliZXIgPSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyOiBzdWJzY3JpYmVyLFxuICAgICAgICAgICAgY29udGV4dDogdGhpcy5faG9zdE9iamVjdCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgICBzdWJzY3JpYmVyLm9wdGlvbnMgPSBzdWJzY3JpYmVyLm9wdGlvbnMgfHwge307XG4gICAgICAgIF8uZXh0ZW5kKHN1YnNjcmliZXIub3B0aW9ucywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9NZXNzZW5nZXJfb24uY2FsbCh0aGlzLCBtZXNzYWdlcywgc3Vic2NyaWJlcik7XG59XG5cblxuZnVuY3Rpb24gX01lc3Nlbmdlcl9vbihtZXNzYWdlcywgc3Vic2NyaWJlcikge1xuICAgIF8uZGVmaW5lUHJvcGVydHkoc3Vic2NyaWJlciwgJ19fbWVzc2FnZXMnLCBtZXNzYWdlcyk7XG4gICAgcmV0dXJuIF9lYWNoTWVzc2FnZS5jYWxsKHRoaXMsICdfcmVnaXN0ZXJTdWJzY3JpYmVyJywgbWVzc2FnZXMsIHN1YnNjcmliZXIpO1xufVxuXG5cbmZ1bmN0aW9uIF9lYWNoTWVzc2FnZShtZXRob2ROYW1lLCBtZXNzYWdlcywgc3Vic2NyaWJlcikge1xuICAgIGlmICh0eXBlb2YgbWVzc2FnZXMgPT0gJ3N0cmluZycpXG4gICAgICAgIG1lc3NhZ2VzID0gbWVzc2FnZXMuc3BsaXQobWVzc2FnZXNTcGxpdFJlZ0V4cCk7XG5cbiAgICB2YXIgc3Vic2NyaWJlcnNIYXNoID0gdGhpcy5fY2hvb3NlU3Vic2NyaWJlcnNIYXNoKG1lc3NhZ2VzKTtcblxuICAgIGlmIChtZXNzYWdlcyBpbnN0YW5jZW9mIFJlZ0V4cClcbiAgICAgICAgcmV0dXJuIHRoaXNbbWV0aG9kTmFtZV0oc3Vic2NyaWJlcnNIYXNoLCBtZXNzYWdlcywgc3Vic2NyaWJlcik7XG5cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcblxuICAgICAgICBtZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHZhciBzdWJzY3JpcHRpb25DaGFuZ2VkID0gdGhpc1ttZXRob2ROYW1lXShzdWJzY3JpYmVyc0hhc2gsIG1lc3NhZ2UsIHN1YnNjcmliZXIpO1xuICAgICAgICAgICAgY2hhbmdlZCA9IGNoYW5nZWQgfHwgc3Vic2NyaXB0aW9uQ2hhbmdlZDtcbiAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgcmV0dXJuIGNoYW5nZWQ7XG4gICAgfVxufVxuXG5cbi8qKlxuICogXCJQcml2YXRlXCIgTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZFxuICogSXQgaXMgY2FsbGVkIGJ5IFtvbl0oI01lc3NlbmdlciRvbikgdG8gcmVnaXN0ZXIgc3Vic2NyaWJlciBmb3Igb25lIG1lc3NhZ2UgdHlwZS5cbiAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgc3Vic2NyaWJlciBpcyBub3QgeWV0IHJlZ2lzdGVyZWQgZm9yIHRoaXMgdHlwZSBvZiBtZXNzYWdlLlxuICogSWYgbWVzc2VuZ2VyIGhhcyBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBhdHRhY2hlZCB0byBpdCwgTWVzc2FnZVNvdXJjZSB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGZpcnN0IHN1YnNjcmliZXIgZm9yIGEgZ2l2ZW4gbWVzc2FnZSBpcyBhZGRlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHN1YnNjcmliZXJzSGFzaCBUaGUgbWFwIG9mIHN1YnNjcmliZXJzIGRldGVybWluZWQgYnkgW29uXSgjTWVzc2VuZ2VyJG9uKSBiYXNlZCBvbiBNZXNzYWdlIHR5cGUsIGNhbiBiZSBgdGhpcy5fcGF0dGVybk1lc3NhZ2VTdWJzY3JpYmVyc2Agb3IgYHRoaXMuX21lc3NhZ2VTdWJzY3JpYmVyc2BcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIE1lc3NhZ2UgdHlwZVxuICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R9IHN1YnNjcmliZXIgU3Vic2NyaWJlciBmdW5jdGlvbiB0byBiZSBhZGRlZCBvciBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIGBzdWJzY3JpYmVyYCAoZnVuY3Rpb24pIGFuZCBgY29udGV4dGAgKHZhbHVlIG9mIFwidGhpc1wiIHdoZW4gc3Vic2NyaWJlciBpcyBjYWxsZWQpXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBfcmVnaXN0ZXJTdWJzY3JpYmVyKHN1YnNjcmliZXJzSGFzaCwgbWVzc2FnZSwgc3Vic2NyaWJlcikge1xuICAgIGlmICghIChzdWJzY3JpYmVyc0hhc2hbbWVzc2FnZV0gJiYgc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdLmxlbmd0aCkpIHtcbiAgICAgICAgc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdID0gW107XG4gICAgICAgIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgUmVnRXhwKVxuICAgICAgICAgICAgc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdLnBhdHRlcm4gPSBtZXNzYWdlO1xuICAgICAgICBpZiAodGhpcy5fbWVzc2FnZVNvdXJjZSlcbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VTb3VyY2Uub25TdWJzY3JpYmVyQWRkZWQobWVzc2FnZSk7XG4gICAgICAgIHZhciBub1N1YnNjcmliZXJzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgbXNnU3Vic2NyaWJlcnMgPSBzdWJzY3JpYmVyc0hhc2hbbWVzc2FnZV07XG4gICAgdmFyIG5vdFlldFJlZ2lzdGVyZWQgPSBub1N1YnNjcmliZXJzIHx8IF9pbmRleE9mU3Vic2NyaWJlci5jYWxsKHRoaXMsIG1zZ1N1YnNjcmliZXJzLCBzdWJzY3JpYmVyKSA9PSAtMTtcblxuICAgIGlmIChub3RZZXRSZWdpc3RlcmVkKVxuICAgICAgICBtc2dTdWJzY3JpYmVycy5wdXNoKHN1YnNjcmliZXIpO1xuXG4gICAgcmV0dXJuIG5vdFlldFJlZ2lzdGVyZWQ7XG59XG5cblxuLyoqXG4gKiBGaW5kcyBzdWJzY3JpYmVyIGluZGV4IGluIHRoZSBsaXN0XG4gKlxuICogQHBhcmFtIHtBcnJheVtGdW5jdGlvbnxPYmplY3RdfSBsaXN0IGxpc3Qgb2Ygc3Vic2NyaWJlcnNcbiAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBzdWJzY3JpYmVyIHN1YnNjcmliZXIgZnVuY3Rpb24gb3Igb2JqZWN0IHdpdGggcHJvcGVydGllcyBgc3Vic2NyaWJlcmAgKGZ1bmN0aW9uKSBhbmQgYGNvbnRleHRgIChcInRoaXNcIiBvYmplY3QpXG4gKi9cbmZ1bmN0aW9uIF9pbmRleE9mU3Vic2NyaWJlcihsaXN0LCBzdWJzY3JpYmVyKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBfLmZpbmRJbmRleChsaXN0LCBmdW5jdGlvbihzdWJzY3Ipe1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5zdWJzY3JpYmVyID09IHN1YnNjci5zdWJzY3JpYmVyXG4gICAgICAgICAgICAgICAgJiYgc3Vic2NyaWJlci5jb250ZXh0ID09IHN1YnNjci5jb250ZXh0XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kLlxuICogU3Vic2NyaWJlcyB0byBtdWx0aXBsZSBtZXNzYWdlcyBwYXNzZWQgYXMgbWFwIHRvZ2V0aGVyIHdpdGggc3Vic2NyaWJlcnMuXG4gKiBVc2FnZTpcbiAqIGBgYFxuICogbXlDb21wLmV2ZW50cy5vbk1lc3NhZ2VzKHtcbiAqICAgICAnbW91c2Vkb3duJzogb25Nb3VzZURvd24sXG4gKiAgICAgJ21vdXNldXAnOiBvbk1vdXNlVXBcbiAqIH0pO1xuICogZnVuY3Rpb24gb25Nb3VzZURvd24oZXZlbnRUeXBlLCBldmVudCkge31cbiAqIGZ1bmN0aW9uIG9uTW91c2VVcChldmVudFR5cGUsIGV2ZW50KSB7fVxuICogYGBgXG4gKiBSZXR1cm5zIG1hcCB3aXRoIHRoZSBzYW1lIGtleXMgKG1lc3NhZ2UgdHlwZXMpIGFuZCBib29sZWFuIHZhbHVlcyBpbmRpY2F0aW5nIHdoZXRoZXIgcGFydGljdWxhciBzdWJzY3JpYmVyIHdhcyBhZGRlZC5cbiAqIEl0IGlzIE5PVCBwb3NzaWJsZSB0byBhZGQgcGF0dGVybiBzdWJzY3JpYmVyIHVzaW5nIHRoaXMgbWV0aG9kLCBhcyBhbHRob3VnaCB5b3UgY2FuIHVzZSBSZWdFeHAgYXMgdGhlIGtleSwgSmF2YVNjcmlwdCB3aWxsIGF1dG9tYXRpY2FsbHkgY29udmVydCBpdCB0byBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtPYmplY3RbRnVuY3Rpb25dfSBtZXNzYWdlU3Vic2NyaWJlcnMgTWFwIG9mIG1lc3NhZ2Ugc3Vic2NyaWJlcnMgdG8gYmUgYWRkZWRcbiAqIEByZXR1cm4ge09iamVjdFtCb29sZWFuXX1cbiAqL1xuZnVuY3Rpb24gb25NZXNzYWdlcyhtZXNzYWdlU3Vic2NyaWJlcnMpIHtcbiAgICBjaGVjayhtZXNzYWdlU3Vic2NyaWJlcnMsIE1hdGNoLk9iamVjdEhhc2goTWF0Y2guT25lT2YoRnVuY3Rpb24sIHsgc3Vic2NyaWJlcjogRnVuY3Rpb24sIGNvbnRleHQ6IE1hdGNoLkFueSB9KSkpO1xuXG4gICAgdmFyIG5vdFlldFJlZ2lzdGVyZWRNYXAgPSBfLm1hcEtleXMobWVzc2FnZVN1YnNjcmliZXJzLCBmdW5jdGlvbihzdWJzY3JpYmVyLCBtZXNzYWdlcykge1xuICAgICAgICByZXR1cm4gdGhpcy5vbihtZXNzYWdlcywgc3Vic2NyaWJlcik7XG4gICAgfSwgdGhpcyk7XG5cbiAgICByZXR1cm4gbm90WWV0UmVnaXN0ZXJlZE1hcDtcbn1cblxuXG4vKipcbiAqIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2QuXG4gKiBSZW1vdmVzIGEgc3Vic2NyaWJlciBmb3IgbWVzc2FnZShzKS4gUmVtb3ZlcyBhbGwgc3Vic2NyaWJlcnMgZm9yIHRoZSBtZXNzYWdlIGlmIHN1YnNjcmliZXIgaXNuJ3QgcGFzc2VkLlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHN1YnNjcmliZXIgd2FzIHJlZ2lzdGVyZWQuIE5vIGVycm9yIG9yIHdhcm5pbmcgaXMgdGhyb3duIG9yIGxvZ2dlZCBpZiB5b3UgcmVtb3ZlIHN1YnNjcmliZXIgdGhhdCB3YXMgbm90IHJlZ2lzdGVyZWQuXG4gKiBbQ29tcG9uZW50c10oLi4vY29tcG9uZW50cy9jX2NsYXNzLmpzLmh0bWwpIGFuZCBbZmFjZXRzXSguLi9jb21wb25lbnRzL2NfZmFjZXQuanMuaHRtbCkgY2hhbmdlIHRoaXMgbWV0aG9kIG5hbWUgdG8gYG9mZmAgd2hlbiB0aGV5IHByb3h5IGl0LlxuICogVXNhZ2U6XG4gKiBgYGBcbiAqIC8vIHVuc3Vic2NyaWJlcyBvbk1vdXNlVXBEb3duIGZyb20gdHdvIERPTSBldmVudHMuXG4gKiBteUNvbXAuZXZlbnRzLm9mZignbW91c2Vkb3duIG1vdXNldXAnLCBvbk1vdXNlVXBEb3duKTtcbiAqIGBgYFxuICogSWYgbWVzc2VuZ2VyIGhhcyBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBhdHRhY2hlZCB0byBpdCwgTWVzc2FnZVNvdXJjZSB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGxhc3Qgc3Vic2NyaWJlciBmb3IgYSBnaXZlbiBtZXNzYWdlIGlzIHJlbW92ZWQgYW5kIHRoZXJlIGlzIG5vIG1vcmUgc3Vic2NyaWJlcnMgZm9yIHRoaXMgbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheVtTdHJpbmddfFJlZ0V4cH0gbWVzc2FnZXMgTWVzc2FnZSB0eXBlcyB0aGF0IGEgc3Vic2NyaWJlciBzaG91bGQgYmUgcmVtb3ZlZCBmb3IuXG4gKiAgSWYgc3RyaW5nIGlzIHBhc3NlZCwgaXQgY2FuIGJlIGEgc2lnbGUgbWVzc2FnZSBvciBtdWx0aXBsZSBtZXNzYWdlIHR5cGVzIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIHdpdGggb3B0aW9uYWwgY29tbWFzLlxuICogIElmIGFuIGFycmF5IG9mIHN0cmluZ3MgaXMgcGFzc2VkLCBlYWNoIHN0cmluZyBpcyBhIG1lc3NhZ2UgdHlwZSB0byByZW1vdmUgYSBzdWJzY3JpYmVyIGZvci5cbiAqICBJZiBhIFJlZ0V4cCBpcyBwYXNzZWQsIHRoZSBwYXR0ZXJuIHN1YnNjcmliZXIgd2lsbCBiZSByZW1vdmVkLlxuICogIFJlZ0V4cCBzdWJzY3JpYmVyIGRvZXMgTk9UIGNhdXNlIGFueSBzdWJzY3JpcHRpb24gdG8gTWVzc2FnZVNvdXJjZSwgaXQgb25seSBjYXB0dXJlcyBtZXNzYWdlcyB0aGF0IGFyZSBhbHJlYWR5IHN1YnNjcmliZWQgdG8gd2l0aCBwcmVjaXNlIG1lc3NhZ2UgdHlwZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdWJzY3JpYmVyIE1lc3NhZ2Ugc3Vic2NyaWJlciAtIE9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb2Ygc3Vic2NyaWJlcnMgZm9yIHRoZSBtZXNzYWdlKHMpLiBJZiBzdWJzY3JpYmVyIGlzIG5vdCBzdXBwbGllZCwgYWxsIHN1YnNjcmliZXJzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoaXMgbWVzc2FnZShzKS5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIE1lc3NlbmdlciRvZmYobWVzc2FnZXMsIHN1YnNjcmliZXIpIHtcbiAgICBjaGVjayhtZXNzYWdlcywgTWF0Y2guT25lT2YoU3RyaW5nLCBbU3RyaW5nXSwgUmVnRXhwKSk7XG4gICAgY2hlY2soc3Vic2NyaWJlciwgTWF0Y2guT3B0aW9uYWwoTWF0Y2guT25lT2YoRnVuY3Rpb24sIHtcbiAgICAgICAgc3Vic2NyaWJlcjogRnVuY3Rpb24sXG4gICAgICAgIGNvbnRleHQ6IE1hdGNoLkFueSxcbiAgICAgICAgb3B0aW9uczogTWF0Y2guT3B0aW9uYWwoT2JqZWN0KSxcbiAgICAgICAgLy8gX19tZXNzYWdlczogTWF0Y2guT3B0aW9uYWwoTWF0Y2guT25lT2YoU3RyaW5nLCBbU3RyaW5nXSwgUmVnRXhwKSlcbiAgICB9KSkpO1xuXG4gICAgcmV0dXJuIF9NZXNzZW5nZXJfb2ZmLmNhbGwodGhpcywgbWVzc2FnZXMsIHN1YnNjcmliZXIpO1xufVxuXG5cbmZ1bmN0aW9uIF9NZXNzZW5nZXJfb2ZmKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKSB7XG4gICAgcmV0dXJuIF9lYWNoTWVzc2FnZS5jYWxsKHRoaXMsICdfcmVtb3ZlU3Vic2NyaWJlcicsIG1lc3NhZ2VzLCBzdWJzY3JpYmVyKTtcbn1cblxuXG4vKipcbiAqIFwiUHJpdmF0ZVwiIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2RcbiAqIEl0IGlzIGNhbGxlZCBieSBbb2ZmXSgjTWVzc2VuZ2VyJG9mZikgdG8gcmVtb3ZlIHN1YnNjcmliZXIgZm9yIG9uZSBtZXNzYWdlIHR5cGUuXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHN1YnNjcmliZXIgd2FzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgdHlwZSBvZiBtZXNzYWdlLlxuICogSWYgbWVzc2VuZ2VyIGhhcyBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBhdHRhY2hlZCB0byBpdCwgTWVzc2FnZVNvdXJjZSB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGxhc3Qgc3Vic2NyaWJlciBmb3IgYSBnaXZlbiBtZXNzYWdlIGlzIHJlbW92ZWQgYW5kIHRoZXJlIGlzIG5vIG1vcmUgc3Vic2NyaWJlcnMgZm9yIHRoaXMgbWVzc2FnZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHN1YnNjcmliZXJzSGFzaCBUaGUgbWFwIG9mIHN1YnNjcmliZXJzIGRldGVybWluZWQgYnkgW29mZl0oI01lc3NlbmdlciRvZmYpIGJhc2VkIG9uIG1lc3NhZ2UgdHlwZSwgY2FuIGJlIGB0aGlzLl9wYXR0ZXJuTWVzc2FnZVN1YnNjcmliZXJzYCBvciBgdGhpcy5fbWVzc2FnZVN1YnNjcmliZXJzYFxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZSB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdWJzY3JpYmVyIFN1YnNjcmliZXIgZnVuY3Rpb24gdG8gYmUgcmVtb3ZlZFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gX3JlbW92ZVN1YnNjcmliZXIoc3Vic2NyaWJlcnNIYXNoLCBtZXNzYWdlLCBzdWJzY3JpYmVyKSB7XG4gICAgdmFyIG1zZ1N1YnNjcmliZXJzID0gc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdO1xuICAgIGlmICghIG1zZ1N1YnNjcmliZXJzIHx8ICEgbXNnU3Vic2NyaWJlcnMubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG5vdGhpbmcgcmVtb3ZlZFxuXG4gICAgaWYgKHN1YnNjcmliZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdWJzY3JpYmVyID09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBzdWJzY3JpYmVyID0geyBzdWJzY3JpYmVyOiBzdWJzY3JpYmVyLCBjb250ZXh0OiB0aGlzLl9ob3N0T2JqZWN0IH07XG5cbiAgICAgICAgdmFyIHN1YnNjcmliZXJJbmRleCA9IF9pbmRleE9mU3Vic2NyaWJlci5jYWxsKHRoaXMsIG1zZ1N1YnNjcmliZXJzLCBzdWJzY3JpYmVyKTtcbiAgICAgICAgaWYgKHN1YnNjcmliZXJJbmRleCA9PSAtMSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gbm90aGluZyByZW1vdmVkXG4gICAgICAgIG1zZ1N1YnNjcmliZXJzLnNwbGljZShzdWJzY3JpYmVySW5kZXgsIDEpO1xuICAgICAgICBpZiAoISBtc2dTdWJzY3JpYmVycy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLl9yZW1vdmVBbGxTdWJzY3JpYmVycyhzdWJzY3JpYmVyc0hhc2gsIG1lc3NhZ2UpO1xuXG4gICAgfSBlbHNlXG4gICAgICAgIHRoaXMuX3JlbW92ZUFsbFN1YnNjcmliZXJzKHN1YnNjcmliZXJzSGFzaCwgbWVzc2FnZSk7XG5cbiAgICByZXR1cm4gdHJ1ZTsgLy8gc3Vic2NyaWJlcihzKSByZW1vdmVkXG59XG5cblxuLyoqXG4gKiBcIlByaXZhdGVcIiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBJdCBpcyBjYWxsZWQgYnkgW19yZW1vdmVTdWJzY3JpYmVyXSgjX3JlbW92ZVN1YnNjcmliZXIpIHRvIHJlbW92ZSBhbGwgc3Vic2NyaWJlcnMgZm9yIG9uZSBtZXNzYWdlIHR5cGUuXG4gKiBJZiBtZXNzZW5nZXIgaGFzIFtNZXNzYWdlU291cmNlXSguL21fc291cmNlLmpzLmh0bWwpIGF0dGFjaGVkIHRvIGl0LCBNZXNzYWdlU291cmNlIHdpbGwgYmUgbm90aWZpZWQgdGhhdCBhbGwgbWVzc2FnZSBzdWJzY3JpYmVycyB3ZXJlIHJlbW92ZWQgc28gaXQgY2FuIHVuc3Vic2NyaWJlIGZyb20gdGhlIHNvdXJjZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHN1YnNjcmliZXJzSGFzaCBUaGUgbWFwIG9mIHN1YnNjcmliZXJzIGRldGVybWluZWQgYnkgW29mZl0oI01lc3NlbmdlciRvZmYpIGJhc2VkIG9uIG1lc3NhZ2UgdHlwZSwgY2FuIGJlIGB0aGlzLl9wYXR0ZXJuTWVzc2FnZVN1YnNjcmliZXJzYCBvciBgdGhpcy5fbWVzc2FnZVN1YnNjcmliZXJzYFxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZSB0eXBlXG4gKi9cbmZ1bmN0aW9uIF9yZW1vdmVBbGxTdWJzY3JpYmVycyhzdWJzY3JpYmVyc0hhc2gsIG1lc3NhZ2UpIHtcbiAgICBkZWxldGUgc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdO1xuICAgIGlmICh0aGlzLl9tZXNzYWdlU291cmNlICYmIHR5cGVvZiBtZXNzYWdlID09ICdzdHJpbmcnKVxuICAgICAgICB0aGlzLl9tZXNzYWdlU291cmNlLm9uU3Vic2NyaWJlclJlbW92ZWQobWVzc2FnZSk7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kLlxuICogVW5zdWJzY3JpYmVzIGZyb20gbXVsdGlwbGUgbWVzc2FnZXMgcGFzc2VkIGFzIG1hcCB0b2dldGhlciB3aXRoIHN1YnNjcmliZXJzLlxuICogUmV0dXJucyBtYXAgd2l0aCB0aGUgc2FtZSBrZXlzIChtZXNzYWdlIHR5cGVzKSBhbmQgYm9vbGVhbiB2YWx1ZXMgaW5kaWNhdGluZyB3aGV0aGVyIHBhcnRpY3VsYXIgc3Vic2NyaWJlciB3YXMgcmVtb3ZlZC5cbiAqIElmIGEgc3Vic2NyaWJlciBmb3Igb25lIG9mIHRoZSBtZXNzYWdlcyBpcyBub3Qgc3VwcGxpZWQsIGFsbCBzdWJzY3JpYmVycyBmb3IgdGhpcyBtZXNzYWdlIHdpbGwgYmUgcmVtb3ZlZC5cbiAqIFVzYWdlOlxuICogYGBgXG4gKiBteUNvbXAuZXZlbnRzLm9mZk1lc3NhZ2VzKHtcbiAqICAgICAnbW91c2Vkb3duJzogb25Nb3VzZURvd24sXG4gKiAgICAgJ21vdXNldXAnOiBvbk1vdXNlVXAsXG4gKiAgICAgJ2NsaWNrJzogdW5kZWZpbmVkIC8vIGFsbCBzdWJzY3JpYmVycyB0byB0aGlzIG1lc3NhZ2Ugd2lsbCBiZSByZW1vdmVkXG4gKiB9KTtcbiAqIGBgYFxuICogSXQgaXMgTk9UIHBvc3NpYmxlIHRvIHJlbW92ZSBwYXR0ZXJuIHN1YnNjcmliZXIocykgdXNpbmcgdGhpcyBtZXRob2QsIGFzIGFsdGhvdWdoIHlvdSBjYW4gdXNlIFJlZ0V4cCBhcyB0aGUga2V5LCBKYXZhU2NyaXB0IHdpbGwgYXV0b21hdGljYWxseSBjb252ZXJ0IGl0IHRvIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdFtGdW5jdGlvbl19IG1lc3NhZ2VTdWJzY3JpYmVycyBNYXAgb2YgbWVzc2FnZSBzdWJzY3JpYmVycyB0byBiZSByZW1vdmVkXG4gKiBAcmV0dXJuIHtPYmplY3RbQm9vbGVhbl19XG4gKi9cbmZ1bmN0aW9uIG9mZk1lc3NhZ2VzKG1lc3NhZ2VTdWJzY3JpYmVycykge1xuICAgIGNoZWNrKG1lc3NhZ2VTdWJzY3JpYmVycywgTWF0Y2guT2JqZWN0SGFzaChNYXRjaC5PcHRpb25hbChNYXRjaC5PbmVPZihGdW5jdGlvbiwgeyBzdWJzY3JpYmVyOiBGdW5jdGlvbiwgY29udGV4dDogTWF0Y2guQW55IH0pKSkpO1xuXG4gICAgdmFyIHN1YnNjcmliZXJSZW1vdmVkTWFwID0gXy5tYXBLZXlzKG1lc3NhZ2VTdWJzY3JpYmVycywgZnVuY3Rpb24oc3Vic2NyaWJlciwgbWVzc2FnZXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2ZmKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKTtcbiAgICB9LCB0aGlzKTtcblxuICAgIHJldHVybiBzdWJzY3JpYmVyUmVtb3ZlZE1hcDtcbn1cblxuXG4vKipcbiAqIFVuc3Vic2NyaWJlcyBhbGwgc3Vic2NyaWJlcnNcbiAqL1xuZnVuY3Rpb24gTWVzc2VuZ2VyJG9mZkFsbCgpIHtcbiAgICBfb2ZmQWxsU3Vic2NyaWJlcnMuY2FsbCh0aGlzLCB0aGlzLl9wYXR0ZXJuTWVzc2FnZVN1YnNjcmliZXJzKTtcbiAgICBfb2ZmQWxsU3Vic2NyaWJlcnMuY2FsbCh0aGlzLCB0aGlzLl9tZXNzYWdlU3Vic2NyaWJlcnMpO1xufVxuXG5cbmZ1bmN0aW9uIF9vZmZBbGxTdWJzY3JpYmVycyhzdWJzY3JpYmVyc0hhc2gpIHtcbiAgICBfLmVhY2hLZXkoc3Vic2NyaWJlcnNIYXNoLCBmdW5jdGlvbihzdWJzY3JpYmVycywgbWVzc2FnZSkge1xuICAgICAgICB0aGlzLl9yZW1vdmVBbGxTdWJzY3JpYmVycyhzdWJzY3JpYmVyc0hhc2gsIG1lc3NhZ2UpO1xuICAgIH0sIHRoaXMpO1xufVxuXG5cbi8vIFRPRE8gLSBzZW5kIGV2ZW50IHRvIG1lc3NhZ2VTb3VyY2VcblxuXG4vKipcbiAqIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2QuXG4gKiBEaXNwYXRjaGVzIHRoZSBtZXNzYWdlIGNhbGxpbmcgYWxsIHN1YnNjcmliZXJzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgbWVzc2FnZSBhbmQsIGlmIHRoZSBtZXNzYWdlIGlzIGEgc3RyaW5nLCBjYWxsaW5nIGFsbCBwYXR0ZXJuIHN1YnNjcmliZXJzIHdoZW4gbWVzc2FnZSBtYXRjaGVzIHRoZSBwYXR0ZXJuLlxuICogRWFjaCBzdWJzY3JpYmVyIGlzIHBhc3NlZCB0aGUgc2FtZSBwYXJhbWV0ZXJzIHRoYXQgYXJlIHBhc3NlZCB0byB0aGVpcyBtZXRob2QuXG4gKiBUaGUgY29udGV4dCBvZiB0aGUgc3Vic2NyaWJlciBlbnZvY2F0aW9uIGlzIHNldCB0byB0aGUgaG9zdCBvYmplY3QgKGB0aGlzLl9ob3N0T2JqZWN0YCkgdGhhdCB3YXMgcGFzc2VkIHRvIHRoZSBtZXNzZW5nZXIgY29uc3RydWN0b3IuXG4gKiBTdWJzY3JpYmVycyBhcmUgY2FsbGVkIGluIHRoZSBuZXh0IHRpY2sgKFwiYXN5bmNocm9ub3VzbHlcIikgYXBhcnQgZnJvbSB0aG9zZSB0aGF0IHdlcmUgc3Vic2NyaWJlZCB3aXRoIGBvblN5bmNgIChvciB0aGF0IGhhdmUgYG9wdGlvbnMuc3luYyA9PSB0cnVlYCkuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBtZXNzYWdlIG1lc3NhZ2UgdG8gYmUgZGlzcGF0Y2hlZFxuICogIElmIHRoZSBtZXNzYWdlIGlzIGEgc3RyaW5nLCB0aGUgc3Vic2NyaWJlcnMgcmVnaXN0ZXJlZCB3aXRoIGV4YWN0bHkgdGhpcyBtZXNzYWdlIHdpbGwgYmUgY2FsbGVkIGFuZCBhbHNvIHBhdHRlcm4gc3Vic2NyaWJlcnMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyB0aGUgZGlzcGF0Y2hlZCBtZXNzYWdlLlxuICogIElmIHRoZSBtZXNzYWdlIGlzIFJlZ0V4cCwgb25seSB0aGUgc3Vic2NyaWJlcnMgcmVnaXN0ZXJlZCB3aXRoIGV4YWN0bHkgdGhpcyBwYXR0ZXJuIHdpbGwgYmUgY2FsbGVkLlxuICogQHBhcmFtIHtBbnl9IGRhdGEgZGF0YSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBzdWJzY3JpYmVyIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLiBNZXNzZW5nZXIgZG9lcyBub3QgbW9kaWZ5IHRoaXMgZGF0YSBpbiBhbnkgd2F5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgb3B0aW9uYWwgY2FsbGJhY2sgdG8gcGFzcyB0byBzdWJzY3JpYmVyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IF9zeW5jaHJvbm91cyBpZiB0cnVlIHBhc3NlZCwgc3Vic2NyaWJlcnMgd2lsbCBiZSBlbnZva2VkIHN5bmNocm9ub3VzbHkgYXBhcnQgZnJvbSB0aG9zZSB0aGF0IGhhdmUgYG9wdGlvbnMuc3luYyA9PSBmYWxzZWAuIFRoaXMgcGFyYW1ldGVyIHNob3VsZCBub3QgYmUgdXNlZCwgaW5zdGVhZCBwb3N0TWVzc2FnZVN5bmMgc2hvdWxkIGJlIHVzZWQuXG4gKi9cbmZ1bmN0aW9uIHBvc3RNZXNzYWdlKG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrLCBfc3luY2hyb25vdXMpIHtcbiAgICBjaGVjayhtZXNzYWdlLCBNYXRjaC5PbmVPZihTdHJpbmcsIFJlZ0V4cCkpO1xuICAgIGNoZWNrKGNhbGxiYWNrLCBNYXRjaC5PcHRpb25hbChGdW5jdGlvbikpO1xuXG4gICAgdmFyIHN1YnNjcmliZXJzSGFzaCA9IHRoaXMuX2Nob29zZVN1YnNjcmliZXJzSGFzaChtZXNzYWdlKTtcbiAgICB2YXIgbXNnU3Vic2NyaWJlcnMgPSBzdWJzY3JpYmVyc0hhc2hbbWVzc2FnZV07XG5cbiAgICB0aGlzLl9jYWxsU3Vic2NyaWJlcnMobWVzc2FnZSwgZGF0YSwgY2FsbGJhY2ssIG1zZ1N1YnNjcmliZXJzLCBfc3luY2hyb25vdXMpO1xuXG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlID09ICdzdHJpbmcnKVxuICAgICAgICB0aGlzLl9jYWxsUGF0dGVyblN1YnNjcmliZXJzKG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrLCBtc2dTdWJzY3JpYmVycywgX3N5bmNocm9ub3VzKTtcbn1cblxuXG4vKipcbiAqIFNhbWUgYXMgcG9zdE1lc3NhZ2UgYXBhcnQgZnJvbSBlbnZva2luZyBzdWJzY3JpYmVycyBzeW5jaHJvbm91c2x5LCBhcGFydCBmcm9tIHRob3NlIHN1YnNjcmliZWQgd2l0aCBgb25Bc3luY2AgKG9yIHdpdGggYG9wdGlvbnMuc3luYyA9PSBmYWxzZWApLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gbWVzc2FnZVxuICogQHBhcmFtIHtBbnl9IGRhdGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKi9cbmZ1bmN0aW9uIHBvc3RNZXNzYWdlU3luYyhtZXNzYWdlLCBkYXRhLCBjYWxsYmFjaykge1xuICAgIHRoaXMucG9zdE1lc3NhZ2UobWVzc2FnZSwgZGF0YSwgY2FsbGJhY2ssIHRydWUpO1xufVxuXG5cbi8qKlxuICogXCJQcml2YXRlXCIgTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZFxuICogRW52b2tlcyBwYXR0ZXJuIHN1YnNjcmliZXJzIHdpdGggdGhlIHBhdHRlcm4gdGhhdCBtYXRjaGVzIHRoZSBtZXNzYWdlLlxuICogVGhlIG1ldGhvZCBpcyBjYWxsZWQgYnkgW3Bvc3RNZXNzYWdlXSgjcG9zdE1lc3NhZ2UpIC0gc2VlIG1vcmUgaW5mb3JtYXRpb24gdGhlcmUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIG1lc3NhZ2UgdG8gYmUgZGlzcGF0Y2hlZC4gUGF0dGVybiBzdWJzY3JpYmVycyByZWdpc3RlcmVkIHdpdGggdGhlIHBhdHRlcm4gdGhhdCBtYXRjaGVzIHRoZSBkaXNwYXRjaGVkIG1lc3NhZ2Ugd2lsbCBiZSBjYWxsZWQuXG4gKiBAcGFyYW0ge0FueX0gZGF0YSBkYXRhIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHN1YnNjcmliZXIgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuIE1lc3NlbmdlciBkb2VzIG5vdCBtb2RpZnkgdGhpcyBkYXRhIGluIGFueSB3YXkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBvcHRpb25hbCBjYWxsYmFjayB0byBwYXNzIHRvIHN1YnNjcmliZXJcbiAqIEBwYXJhbSB7QXJyYXlbRnVuY3Rpb258T2JqZWN0XX0gY2FsbGVkTXNnU3Vic2NyaWJlcnMgYXJyYXkgb2Ygc3Vic2NyaWJlcnMgYWxyZWFkeSBjYWxsZWQsIHRoZXkgd29uJ3QgYmUgY2FsbGVkIGFnYWluIGlmIHRoZXkgYXJlIGFtb25nIHBhdHRlcm4gc3Vic2NyaWJlcnMuXG4gKi9cbmZ1bmN0aW9uIF9jYWxsUGF0dGVyblN1YnNjcmliZXJzKG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrLCBjYWxsZWRNc2dTdWJzY3JpYmVycywgX3N5bmNocm9ub3VzKSB7XG4gICAgXy5lYWNoS2V5KHRoaXMuX3BhdHRlcm5NZXNzYWdlU3Vic2NyaWJlcnMsXG4gICAgICAgIGZ1bmN0aW9uKHBhdHRlcm5TdWJzY3JpYmVycykge1xuICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSBwYXR0ZXJuU3Vic2NyaWJlcnMucGF0dGVybjtcbiAgICAgICAgICAgIGlmIChwYXR0ZXJuLnRlc3QobWVzc2FnZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGVkTXNnU3Vic2NyaWJlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhdHRlcm5TdWJzY3JpYmVycyA9IHBhdHRlcm5TdWJzY3JpYmVycy5maWx0ZXIoZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gX2luZGV4T2ZTdWJzY3JpYmVyLmNhbGwodGhpcywgY2FsbGVkTXNnU3Vic2NyaWJlcnMsIHN1YnNjcmliZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ID09IC0xO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FsbFN1YnNjcmliZXJzKG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrLCBwYXR0ZXJuU3Vic2NyaWJlcnMsIF9zeW5jaHJvbm91cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAsIHRoaXMpO1xufVxuXG5cbi8qKlxuICogXCJQcml2YXRlXCIgTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZFxuICogRW52b2tlcyBzdWJzY3JpYmVycyBmcm9tIHRoZSBwYXNzZWQgbGlzdC5cbiAqIFRoZSBtZXRob2QgaXMgY2FsbGVkIGJ5IFtwb3N0TWVzc2FnZV0oI3Bvc3RNZXNzYWdlKSBhbmQgW19jYWxsUGF0dGVyblN1YnNjcmliZXJzXSgjX2NhbGxQYXR0ZXJuU3Vic2NyaWJlcnMpLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBtZXNzYWdlIHRvIGJlIGRpc3BhdGNoZWQsIHBhc3NlZCB0byBzdWJzY3JpYmVycyBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyLlxuICogQHBhcmFtIHtBbnl9IGRhdGEgZGF0YSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBzdWJzY3JpYmVyIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLiBNZXNzZW5nZXIgZG9lcyBub3QgbW9kaWZ5IHRoaXMgZGF0YSBpbiBhbnkgd2F5LlxuICogQHBhcmFtIHtBcnJheVtGdW5jdGlvbnxPYmplY3RdfSBtc2dTdWJzY3JpYmVycyB0aGUgYXJyYXkgb2YgbWVzc2FnZSBzdWJzY3JpYmVycyB0byBiZSBjYWxsZWQuIEVhY2ggc3Vic2NyaWJlciBpcyBjYWxsZWQgd2l0aCB0aGUgaG9zdCBvYmplY3QgKHNlZSBNZXNzZW5nZXIgY29uc3RydWN0b3IpIGFzIHRoZSBjb250ZXh0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgb3B0aW9uYWwgY2FsbGJhY2sgdG8gcGFzcyB0byBzdWJzY3JpYmVyXG4gKi9cbmZ1bmN0aW9uIF9jYWxsU3Vic2NyaWJlcnMobWVzc2FnZSwgZGF0YSwgY2FsbGJhY2ssIG1zZ1N1YnNjcmliZXJzLCBfc3luY2hyb25vdXMpIHtcbiAgICBpZiAobXNnU3Vic2NyaWJlcnMgJiYgbXNnU3Vic2NyaWJlcnMubGVuZ3RoKSB7XG4gICAgICAgIC8vIGNsb25pbmcgaXMgbmVjZXNzYXJ5IGFzIHNvbWUgb2YgdGhlIHN1YnNjcmliZXJzXG4gICAgICAgIC8vIGNhbiBiZSB1bnN1YnNjcmliZWQgZHVyaW5nIHRoZSBkaXNwYXRjaFxuICAgICAgICAvLyBzbyB0aGlzIGFycmF5IHdvdWxkIGNoYW5nZSBpbiB0aGUgcHJvY2Vzc1xuICAgICAgICBtc2dTdWJzY3JpYmVycyA9IG1zZ1N1YnNjcmliZXJzLnNsaWNlKCk7XG5cbiAgICAgICAgbXNnU3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxsU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBtZXNzYWdlLCBkYXRhLCBjYWxsYmFjaywgX3N5bmNocm9ub3VzKTtcbiAgICAgICAgfSwgdGhpcyk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIF9jYWxsU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBtZXNzYWdlLCBkYXRhLCBjYWxsYmFjaywgX3N5bmNocm9ub3VzKSB7XG4gICAgdmFyIHN5bmNTdWJzY3JpYmVyID0gc3Vic2NyaWJlci5vcHRpb25zICYmIHN1YnNjcmliZXIub3B0aW9ucy5zeW5jXG4gICAgICAgICwgc3luY2hybyA9IChfc3luY2hyb25vdXMgJiYgc3luY1N1YnNjcmliZXIgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgfHwgc3luY1N1YnNjcmliZXI7XG5cbiAgICB2YXIgZGlzcGF0Y2hUaW1lcyA9IHN1YnNjcmliZXIub3B0aW9ucyAmJiBzdWJzY3JpYmVyLm9wdGlvbnMuZGlzcGF0Y2hUaW1lcztcbiAgICBpZiAoZGlzcGF0Y2hUaW1lcykge1xuICAgICAgICBpZiAoZGlzcGF0Y2hUaW1lcyA8PSAxKSB7XG4gICAgICAgICAgICB2YXIgbWVzc2FnZXMgPSBzdWJzY3JpYmVyLl9fbWVzc2FnZXM7XG4gICAgICAgICAgICB0aGlzLm9mZihtZXNzYWdlcywgc3Vic2NyaWJlcik7XG4gICAgICAgIH0gZWxzZSBpZiAoZGlzcGF0Y2hUaW1lcyA+IDEpXG4gICAgICAgICAgICBzdWJzY3JpYmVyLm9wdGlvbnMuZGlzcGF0Y2hUaW1lcy0tO1xuICAgIH1cblxuICAgIGlmIChzeW5jaHJvKVxuICAgICAgICBzdWJzY3JpYmVyLnN1YnNjcmliZXIuY2FsbChzdWJzY3JpYmVyLmNvbnRleHQsIG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrKTtcbiAgICBlbHNlXG4gICAgICAgIF8uZGVmZXJNZXRob2Qoc3Vic2NyaWJlci5zdWJzY3JpYmVyLCAnY2FsbCcsIHN1YnNjcmliZXIuY29udGV4dCwgbWVzc2FnZSwgZGF0YSwgY2FsbGJhY2spO1xufVxuXG5cbi8qKlxuICogTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZC5cbiAqIFJldHVybnMgdGhlIGFycmF5IG9mIHN1YnNjcmliZXJzIHRoYXQgd291bGQgYmUgY2FsbGVkIGlmIHRoZSBtZXNzYWdlIHdlcmUgZGlzcGF0Y2hlZC5cbiAqIElmIGBpbmNsdWRlUGF0dGVyblN1YnNjcmliZXJzID09PSBmYWxzZWAsIHBhdHRlcm4gc3Vic2NyaWJlcnMgd2l0aCBtYXRjaGluZyBwYXR0ZXJzIHdpbGwgbm90IGJlIGluY2x1ZGVkIChieSBkZWZhdWx0IHRoZXkgYXJlIGluY2x1ZGVkKS5cbiAqIElmIHRoZXJlIGFyZSBubyBzdWJzY3JpYmVycyB0byB0aGUgbWVzc2FnZSwgYHVuZGVmaW5lZGAgd2lsbCBiZSByZXR1cm5lZCwgbm90IGFuIGVtcHR5IGFycmF5LCBzbyBpdCBpcyBzYWZlIHRvIHVzZSB0aGUgcmVzdWx0IGluIGJvb2xlYW4gdGVzdHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBtZXNzYWdlIE1lc3NhZ2UgdG8gZ2V0IHN1YnNjcmliZXJzIGZvci5cbiAqICBJZiB0aGUgbWVzc2FnZSBpcyBSZWdFeHAsIG9ubHkgcGF0dGVybiBzdWJzY3JpYmVycyByZWdpc3RlcmVkIHdpdGggZXhhY3RseSB0aGlzIHBhdHRlcm4gd2lsbCBiZSByZXR1cm5lZC5cbiAqICBJZiB0aGUgbWVzc2FnZSBpcyBTdHJpbmcsIHN1YnNjcmliZXJzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc3RyaW5nIG1lc3NhZ2VzIGFuZCBwYXR0ZXJuIHN1YnNjcmliZXJzIHJlZ2lzdGVyZWQgd2l0aCBtYXRjaGluZyBwYXR0ZXJuIHdpbGwgYmUgcmV0dXJuZWQgKHVubGVzcyB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyBmYWxzZSkuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGluY2x1ZGVQYXR0ZXJuU3Vic2NyaWJlcnMgT3B0aW9uYWwgZmFsc2UgdG8gcHJldmVudCBpbmNsdXNpb24gb2YgcGF0dGVyIHN1YnNjcmliZXJzLCBieSBkZWZhdWx0IHRoZXkgYXJlIGluY2x1ZGVkLlxuICogQHJldHVybiB7QXJyYXl8dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBnZXRTdWJzY3JpYmVycyhtZXNzYWdlLCBpbmNsdWRlUGF0dGVyblN1YnNjcmliZXJzKSB7XG4gICAgY2hlY2sobWVzc2FnZSwgTWF0Y2guT25lT2YoU3RyaW5nLCBSZWdFeHApKTtcblxuICAgIHZhciBzdWJzY3JpYmVyc0hhc2ggPSB0aGlzLl9jaG9vc2VTdWJzY3JpYmVyc0hhc2gobWVzc2FnZSk7XG4gICAgdmFyIG1zZ1N1YnNjcmliZXJzID0gc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBbXS5jb25jYXQoc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogW107XG5cbiAgICAvLyBwYXR0ZXJuIHN1YnNjcmliZXJzIGFyZSBpbmN1ZGVkIGJ5IGRlZmF1bHRcbiAgICBpZiAoaW5jbHVkZVBhdHRlcm5TdWJzY3JpYmVycyAhPT0gZmFsc2UgJiYgdHlwZW9mIG1lc3NhZ2UgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgXy5lYWNoS2V5KHRoaXMuX3BhdHRlcm5NZXNzYWdlU3Vic2NyaWJlcnMsXG4gICAgICAgICAgICBmdW5jdGlvbihwYXR0ZXJuU3Vic2NyaWJlcnMpIHtcbiAgICAgICAgICAgICAgICB2YXIgcGF0dGVybiA9IHBhdHRlcm5TdWJzY3JpYmVycy5wYXR0ZXJuO1xuICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuU3Vic2NyaWJlcnMgJiYgcGF0dGVyblN1YnNjcmliZXJzLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgcGF0dGVybi50ZXN0KG1lc3NhZ2UpKVxuICAgICAgICAgICAgICAgICAgICBfLmFwcGVuZEFycmF5KG1zZ1N1YnNjcmliZXJzLCBwYXR0ZXJuU3Vic2NyaWJlcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIHJldHVybiB1bmRlZmluZWQgaWYgdGhlcmUgYXJlIG5vIHN1YnNjcmliZXJzXG4gICAgcmV0dXJuIG1zZ1N1YnNjcmliZXJzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8gbXNnU3Vic2NyaWJlcnNcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbn1cblxuXG4vKipcbiAqIFwiUHJpdmF0ZVwiIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgdGhlIG1hcCBvZiBzdWJzY3JpYmVycyBmb3IgYSBnaXZlbiBtZXNzYWdlIHR5cGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gbWVzc2FnZSBNZXNzYWdlIHRvIGNob29zZSB0aGUgbWFwIG9mIHN1YnNjcmliZXJzIGZvclxuICogQHJldHVybiB7T2JqZWN0W0Z1bmN0aW9uXX1cbiAqL1xuZnVuY3Rpb24gX2Nob29zZVN1YnNjcmliZXJzSGFzaChtZXNzYWdlKSB7XG4gICAgcmV0dXJuIG1lc3NhZ2UgaW5zdGFuY2VvZiBSZWdFeHBcbiAgICAgICAgICAgICAgICA/IHRoaXMuX3BhdHRlcm5NZXNzYWdlU3Vic2NyaWJlcnNcbiAgICAgICAgICAgICAgICA6IHRoaXMuX21lc3NhZ2VTdWJzY3JpYmVycztcbn1cblxuXG4vKipcbiAqIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2RcbiAqIFNldHMgW01lc3NhZ2VTb3VyY2VdKC4vbV9zb3VyY2UuanMuaHRtbCkgZm9yIHRoZSBtZXNzZW5nZXIgYWxzbyBzZXR0aW5nIHRoZSByZWZlcmVuY2UgdG8gdGhlIG1lc3NlbmdlciBpbiB0aGUgTWVzc2FnZVNvdXJjZS5cbiAqIE1lc3NhZ2VTb3VyY2UgY2FuIGJlIHBhc3NlZCB0byBtZXNzYWdlIGNvbnN0cnVjdG9yOyB0aGlzIG1ldGhvZCBhbGxvd3MgdG8gc2V0IGl0IGF0IGEgbGF0ZXIgdGltZS4gRm9yIGV4YW1wbGUsIHRoZSBzdWJjbGFzc2VzIG9mIFtDb21wb25lbnRGYWNldF0oLi4vY29tcG9uZW50cy9jX2ZhY2V0LmpzLmh0bWwpIHVzZSB0aGlzIG1ldGhvZCB0byBzZXQgZGlmZmVyZW50IE1lc3NhZ2VTb3VyY2UnZXMgaW4gdGhlIG1lc3NlbmdlciB0aGF0IGlzIGNyZWF0ZWQgYnkgQ29tcG9uZW50RmFjZXQuXG4gKiBDdXJyZW50bHkgdGhlIG1ldGhvZCBpcyBpbXBsZW1lbnRlZCBpbiBzdWNoIHdheSB0aGF0IGl0IGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIC0gTWVzc2FnZVNvdXJjZSBjYW5ub3QgYmUgY2hhbmdlZCBhZnRlciB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuXG4gKlxuICogQHBhcmFtIHtNZXNzYWdlU291cmNlfSBtZXNzYWdlU291cmNlIGFuIGluc3RhbmNlIG9mIE1lc3NhZ2VTb3VyY2UgY2xhc3MgdG8gYXR0YWNoIHRvIHRoaXMgbWVzc2VuZ2VyIChhbmQgdG8gaGF2ZSB0aGlzIG1lc3NlbmdlciBhdHRhY2hlZCB0byBpdCB0b28pXG4gKi9cbmZ1bmN0aW9uIF9zZXRNZXNzYWdlU291cmNlKG1lc3NhZ2VTb3VyY2UpIHtcbiAgICBjaGVjayhtZXNzYWdlU291cmNlLCBNZXNzYWdlU291cmNlKTtcblxuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgJ19tZXNzYWdlU291cmNlJywgbWVzc2FnZVNvdXJjZSk7XG4gICAgbWVzc2FnZVNvdXJjZS5tZXNzZW5nZXIgPSB0aGlzO1xufVxuXG5cbi8qKlxuICogTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyBtZXNzZW5nZXIgTWVzc2FnZVNvdXJjZVxuICpcbiAqIEByZXR1cm4ge01lc3NhZ2VTb3VyY2V9XG4gKi9cbmZ1bmN0aW9uIGdldE1lc3NhZ2VTb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21lc3NhZ2VTb3VyY2Vcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKVxuICAgICwgbG9nZ2VyID0gcmVxdWlyZSgnLi4vdXRpbC9sb2dnZXInKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IE1lc3NlbmdlckFQSTtcblxuXG4vKipcbiAqIGBtaWxvLmNsYXNzZXMuTWVzc2VuZ2VyQVBJYFxuICogQmFzZSBjbGFzcywgc3ViY2xhc3NlcyBvZiB3aGljaCBjYW4gc3VwcGxlbWVudCB0aGUgZnVuY3Rpb25hbGl0eSBvZiBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBieSBpbXBsZW1lbnRpbmcgdGhyZWUgbWV0aG9kczpcbiAqXG4gKiAtIGB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2VgIHRvIHRyYW5zbGF0ZSBzb3VyY2UgbWVzc2FnZXMgKHJlY2lldmVkIGZyb20gZXh0ZXJuYWwgc291cmNlIHZpYSBgTWVzc2FnZVNPdXJjZWApIHRvIGludGVybmFsIG1lc3NhZ2VzICh0aGF0IGFyZSBkaXNwYXRjaGVkIG9uIE1lc3NlbmdlciksIGFsbG93aW5nIHRvIG1ha2UgaW50ZXJuYWwgbWVzc2FnZXMgbW9yZSBkZXRhaWxlZCB0aGFuIHNvdXJjZSBtZXNzYWdlcy4gRm9yIGV4YW1wbGUsIFtEYXRhIGZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXRzL0RhdGEuanMuaHRtbCkgdXNlcyBbRGF0YU1zZ0FQSV0oLi4vY29tcG9uZW50cy9tc2dfYXBpL2RhdGEuanMuaHRtbCkgdG8gZGVmaW5lIHNldmVyYWwgaW50ZXJuYWwgbWVzc2FnZXMgcmVsYXRlZCB0byB0aGUgY2hhbmdlIG9mIHN0YXRlIGluIGNvbnRlbnRlZGl0YWJsZSBET00gZWxlbWVudC5cbiAqIC0gYGNyZWF0ZUludGVybmFsRGF0YWAgdG8gbW9kaWZ5IG1lc3NhZ2UgZGF0YSByZWNlaXZlZCBmcm9tIHNvdXJjZSB0byBzb21lIG1vcmUgbWVhbmluZ2Z1bCBvciBtb3JlIGRldGFpbGVkIG1lc3NhZ2UgZGF0YSB0aGF0IHdpbGwgYmUgZGlzcGF0Y2hlZCBvbiBNZXNzZW5nZXIuIEZvciBleGFtcGxlLCBbRGF0YSBmYWNldF0oLi4vY29tcG9uZW50cy9jX2ZhY2V0cy9EYXRhLmpzLmh0bWwpIHVzZXMgW0RhdGFNc2dBUEldKC4uL2NvbXBvbmVudHMvbXNnX2FwaS9kYXRhLmpzLmh0bWwpIChzdWJjbGFzcyBvZiBNZXNzZW5nZXJBUEkpIHRvIHRyYW5zbGF0ZSBET00gbWVzc2FnZXMgdG8gZGF0YSBjaGFuZ2UgbWVzc2FnZXMuXG4gKiAtIGBmaWx0ZXJTb3VyY2VNZXNzYWdlYCB0byBlbmFibGUvZGlzYWJsZSBtZXNzYWdlIGRpc3BhdGNoIGJhc2VkIG9uIHNvbWUgY29uZGl0aW9ucyBpbiBkYXRhLlxuICpcbiAqIElmIGBNZXNzYWdlU291cmNlYCBjb25zdHJ1Y3RvciBpcyBub3QgcGFzc2VkIGFuIGluc3RhbmNlIG9mIHNvbWUgc3ViY2xhc3Mgb2YgYE1lc3NlbmdlckFQSWAsIGl0IGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBNZXNzZW5nZXJBUEkgdGhhdCBkZWZpbmVzIGFsbCAzIG9mIHRob3NlIG1ldGhvZHMgaW4gYSB0cml2aWFsIHdheS4gU2VlIHRoZXNlIG1ldGhvZHMgYmVsb3cgZm9yIHRoZWlyIHNpZ25hdHVyZXMuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAdGhpcyB7TWVzc2VuZ2VyQVBJfVxuICogQHJldHVybiB7TWVzc2VuZ2VyQVBJfVxuICovXG5mdW5jdGlvbiBNZXNzZW5nZXJBUEkoKSB7XG4gICAgaWYgKHRoaXMuaW5pdClcbiAgICAgICAgdGhpcy5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiAjIyMjTWVzc2VuZ2VyQVBJIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbaW5pdF0oI2luaXQpIC0gaW5pdGlhbGl6ZXMgTWVzc2VuZ2VyQVBJXG4gKiAtIFthZGRJbnRlcm5hbE1lc3NhZ2VdKCNhZGRJbnRlcm5hbE1lc3NhZ2UpIC0gYWRkcyBpbnRlcm5hbCBtZXNzYWdlXG4gKiAtIFtyZW1vdmVJbnRlcm5hbE1lc3NhZ2VdKCNyZW1vdmVJbnRlcm5hbE1lc3NhZ2UpIC0gcmVtb3ZlcyBpbnRlcm5hbCBtZXNzYWdlXG4gKiAtIFtnZXRJbnRlcm5hbE1lc3NhZ2VzXSgjZ2V0SW50ZXJuYWxNZXNzYWdlcykgLSByZXR1cm5zIHRoZSBsaXN0IG9mIGludGVybmFsIG1lc3NhZ2VzIGZvciBnaXZlbiBzb3VyY2UgbWVzc2FnZVxuICpcbiAqIFRoZXNlIG1ldGhvZHMgc2hvdWxkIGJlIHJlZGVmaW5lZCBieSBzdWJjbGFzczpcbiAqXG4gKiAtIFt0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2VdKCN0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UpIC0gY29udmVydHMgaW50ZXJuYWwgbWVzc2FnZSB0eXBlIHRvIHNvdXJjZSAoZXh0ZXJuYWwpIG1lc3NhZ2UgdHlwZVxuICogLSBbY3JlYXRlSW50ZXJuYWxEYXRhXSgjY3JlYXRlSW50ZXJuYWxEYXRhKSAtIGNvbnZlcnRzIHNvdXJjZSBtZXNzYWdlIGRhdGEgcmVjZWl2ZWQgdmlhIE1lc3NhZ2VTb3VyY2UgdG8gaW50ZXJuYWwgbWVzc2FnZSBkYXRhXG4gKiAtIFtmaWx0ZXJTb3VyY2VNZXNzYWdlXSgjZmlsdGVyU291cmNlTWVzc2FnZSkgLSBmaWx0ZXJzIHNvdXJjZSBtZXNzYWdlIGJhc2VkIG9uIHRoZSBkYXRhIG9mIHRoZSBtZXNzYWdlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBpbnRlcm5hbCBtZXNzYWdlIHRoYXQgaXMgYWJvdXQgdG8gYmUgc2VudCBvbiBNZXNzZW5nZXJcbiAqL1xuXy5leHRlbmRQcm90byhNZXNzZW5nZXJBUEksIHtcbiAgICBpbml0OiBpbml0LFxuICAgIGRlc3Ryb3k6IE1lc3NlbmdlckFQSSRkZXN0cm95LFxuICAgIGFkZEludGVybmFsTWVzc2FnZTogYWRkSW50ZXJuYWxNZXNzYWdlLFxuICAgIHJlbW92ZUludGVybmFsTWVzc2FnZTogcmVtb3ZlSW50ZXJuYWxNZXNzYWdlLFxuICAgIGdldEludGVybmFsTWVzc2FnZXM6IGdldEludGVybmFsTWVzc2FnZXMsXG5cbiAgICAvLyBzaG91bGQgYmUgcmVkZWZpbmVkIGJ5IHN1YmNsYXNzXG4gICAgdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlOiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UsXG4gICAgY3JlYXRlSW50ZXJuYWxEYXRhOiBjcmVhdGVJbnRlcm5hbERhdGEsXG4gICAgZmlsdGVyU291cmNlTWVzc2FnZTogZmlsdGVyU291cmNlTWVzc2FnZVxufSk7XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBDYWxsZWQgYnkgTWVzc2VuZ2VyQVBJIGNvbnN0cnVjdG9yLiBTdWJjbGFzc2VzIHRoYXQgcmUtaW1wbGVtZW50IGBpbml0YCBtZXRob2Qgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgdXNpbmc6IGBNZXNzZW5nZXJBUEkucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKWBcbiAqL1xuZnVuY3Rpb24gaW5pdCgpIHtcbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsICdfaW50ZXJuYWxNZXNzYWdlcycsIHt9KTtcbn1cblxuXG4vKipcbiAqIERlc3Ryb3lzIG1lc3NlbmdlciBBUElcbiAqL1xuZnVuY3Rpb24gTWVzc2VuZ2VyQVBJJGRlc3Ryb3koKSB7XG5cbn1cblxuXG4vKipcbiAqIE1lc3NlbmdlckFQSSBpbnN0YW5jZSBtZXRob2RcbiAqIFRyYW5zbGF0ZXMgaW50ZXJuYWwgYG1lc3NhZ2VgIHRvIHNvdXJjZSBtZXNzYWdlLCBhZGRzIGludGVybmFsIGBtZXNzYWdlYCB0byB0aGUgbGlzdCwgbWFraW5nIHN1cmUgdGhlIHNhbWUgYG1lc3NhZ2VgIHdhc24ndCBwYXNzZWQgYmVmb3JlIChpdCB3b3VsZCBpbmRpY2F0ZSBNZXNzZW5nZXIgZXJyb3IpLlxuICogUmV0dXJucyBzb3VyY2UgbWVzc2FnZSBpZiBpdCBpcyB1c2VkIGZpcnN0IHRpbWUgKHNvIHRoYXQgYE1lc3NhZ2VTb3VyY2VgIHN1YmNyaWJlcyB0byB0aGlzIHNvdXJjZSBtZXNzYWdlKSBvciBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBpbnRlcm5hbCBtZXNzYWdlIHRvIGJlIHRyYW5zbGF0ZWQgYW5kIGFkZGVkXG4gKiBAcmV0dXJuIHtTdHJpbmd8dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBhZGRJbnRlcm5hbE1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHZhciBpbnRlcm5hbE1zZ3NcbiAgICAgICAgLCBzb3VyY2VNZXNzYWdlID0gdGhpcy50cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UobWVzc2FnZSk7XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZU1lc3NhZ2UgPT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcblxuICAgIGlmICh0aGlzLl9pbnRlcm5hbE1lc3NhZ2VzLmhhc093blByb3BlcnR5KHNvdXJjZU1lc3NhZ2UpKSB7XG4gICAgICAgIGludGVybmFsTXNncyA9IHRoaXMuX2ludGVybmFsTWVzc2FnZXNbc291cmNlTWVzc2FnZV07XG4gICAgICAgIGlmIChpbnRlcm5hbE1zZ3MuaW5kZXhPZihtZXNzYWdlKSA9PSAtMSlcbiAgICAgICAgICAgIGludGVybmFsTXNncy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsb2dnZXIud2FybignRHVwbGljYXRlIGFkZEludGVybmFsTWVzc2FnZSBjYWxsIGZvciBpbnRlcm5hbCBtZXNzYWdlICcgKyBtZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpbnRlcm5hbE1zZ3MgPSB0aGlzLl9pbnRlcm5hbE1lc3NhZ2VzW3NvdXJjZU1lc3NhZ2VdID0gW107XG4gICAgICAgIGludGVybmFsTXNncy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gc291cmNlTWVzc2FnZTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZW1vdmVzIGludGVybmFsIGBtZXNzYWdlYCBmcm9tIHRoZSBsaXN0IGNvbm5lY3RlZCB0byBjb3JyZXNwb25kaW5nIHNvdXJjZSBtZXNzYWdlIChgdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlYCBpcyB1c2VkIGZvciB0cmFuc2xhdGlvbikuXG4gKiBSZXR1cm5zIHNvdXJjZSBtZXNzYWdlLCBpZiB0aGUgbGFzdCBpbnRlcm5hbCBtZXNzYWdlIHdhcyByZW1vdmVkIChzbyB0aGF0IGBNZXNzYWdlU291cmNlYCBjYW4gdW5zdWJzY3JpYmUgZnJvbSB0aGlzIHNvdXJjZSBtZXNzYWdlKSwgb3IgYHVuZGVmaW5lZGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgaW50ZXJuYWwgbWVzc2FnZSB0byBiZSB0cmFuc2xhdGVkIGFuZCByZW1vdmVkXG4gKiBAcmV0dXJuIHtTdHJpbmd8dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiByZW1vdmVJbnRlcm5hbE1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHZhciBzb3VyY2VNZXNzYWdlID0gdGhpcy50cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UobWVzc2FnZSk7XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZU1lc3NhZ2UgPT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcblxuICAgIHZhciBpbnRlcm5hbE1zZ3MgPSB0aGlzLl9pbnRlcm5hbE1lc3NhZ2VzW3NvdXJjZU1lc3NhZ2VdO1xuXG4gICAgaWYgKGludGVybmFsTXNncyAmJiBpbnRlcm5hbE1zZ3MubGVuZ3RoKSB7XG4gICAgICAgIHZhciBtZXNzYWdlSW5kZXggPSBpbnRlcm5hbE1zZ3MuaW5kZXhPZihtZXNzYWdlKTtcbiAgICAgICAgaWYgKG1lc3NhZ2VJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBpbnRlcm5hbE1zZ3Muc3BsaWNlKG1lc3NhZ2VJbmRleCwgMSk7XG4gICAgICAgICAgICBpZiAoaW50ZXJuYWxNc2dzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2ludGVybmFsTWVzc2FnZXNbc291cmNlTWVzc2FnZV07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZU1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgdW5leHBlY3RlZE5vdGlmaWNhdGlvbldhcm5pbmcoKTtcbiAgICB9IGVsc2VcbiAgICAgICAgdW5leHBlY3RlZE5vdGlmaWNhdGlvbldhcm5pbmcoKTtcblxuXG4gICAgZnVuY3Rpb24gdW5leHBlY3RlZE5vdGlmaWNhdGlvbldhcm5pbmcoKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdub3RpZmljYXRpb24gcmVjZWl2ZWQ6IHVuLXN1YnNjcmliZSBmcm9tIGludGVybmFsIG1lc3NhZ2UgJyArIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICsgJyB3aXRob3V0IHByZXZpb3VzIHN1YnNjcmlwdGlvbiBub3RpZmljYXRpb24nKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBpbnRlcm5hbCBtZXNzYWdlcyB0aGF0IHdlcmUgdHJhbnNsYXRlZCB0byBnaXZlbiBgc291cmNlTWVzc2FnZWAuXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IGBNZXNzYWdlU291cmNlYCB0byBkaXNwYXRjaCBzb3VyY2UgbWVzc2FnZSBvbiB0aGUgYE1lc2VuZ2VyYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc291cmNlTWVzc2FnZSBzb3VyY2UgbWVzc2FnZVxuICogQHJldHVybiB7QXJyYXlbU3RyaW5nXX1cbiAqL1xuZnVuY3Rpb24gZ2V0SW50ZXJuYWxNZXNzYWdlcyhzb3VyY2VNZXNzYWdlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ludGVybmFsTWVzc2FnZXNbc291cmNlTWVzc2FnZV07XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBTdWJjbGFzc2VzIHNob3VsZCByZS1pbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gZGVmaW5lIHRoZSBydWxlIGZvciB0cmFuc2xhdGlvbiBvZiBpbnRlcm5hbCBgbWVzc2FnZWAgdG8gc291cmNlIG1lc3NhZ2UuIFRoaXMgY2xhc3Mgc2ltcGx5IHJldHVybnMgdGhlIHNhbWUgYG1lc3NhZ2VgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIGludGVybmFsIG1lc3NhZ2UgdG8gYmUgdHJhbnNsYXRlZFxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHJldHVybiBtZXNzYWdlXG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBTdWJjbGFzc2VzIHNob3VsZCByZS1pbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gZGVmaW5lIHRoZSBydWxlIGZvciB0cmFuc2xhdGlvbiBvZiBzb3VyY2UgbWVzc2FnZSBkYXRhIHRvIGludGVybmFsIG1lc3NhZ2UgZGF0YS4gVGhpcyBjbGFzcyBzaW1wbHkgcmV0dXJucyB0aGUgc2FtZSBgc291cmNlRGF0YWAuXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGluIFtkaXNwYXRjaE1lc3NhZ2VdKC4vbV9zb3VyY2UuanMuaHRtbCNkaXNwYXRjaE1lc3NhZ2UpIG1ldGhvZCBvZiBgTWVzc2FnZVNvdXJjZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNvdXJjZU1lc3NhZ2Ugc291cmNlIG1lc3NhZ2UsIGNhbiBiZSB1c2VkIGluIHRyYW5zbGF0aW9uIHJ1bGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIGludGVybmFsIG1lc3NhZ2UsIGNhbiBiZSB1c2VkIGluIHRyYW5zbGF0aW9uIHJ1bGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2VEYXRhIGRhdGEgcmVjZWl2ZWQgZnJvbSBzb3VyY2UgdGhhdCBoYXMgdG8gYmUgdHJhbnNsYXRlZCB0byBkYXRhIHRoYXQgd2lsbCBiZSBzZW50IHRvIGludGVybmFsIE1lc3NlbmdlciBzdWJzY3JpYmVyXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUludGVybmFsRGF0YShzb3VyY2VNZXNzYWdlLCBtZXNzYWdlLCBzb3VyY2VEYXRhKSB7XG4gICAgcmV0dXJuIHNvdXJjZURhdGE7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBTdWJjbGFzc2VzIHNob3VsZCByZS1pbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gZGVmaW5lIHRoZSBkaXNwYXRjaCBmaWx0ZXIgZm9yIGludGVybmFsIG1lc3NhZ2VzLiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGB0cnVlYCB0byBhbGxvdyBhbmQgYGZhbHNlYCB0byBwcmV2ZW50IGludGVybmFsIG1lc3NhZ2UgZGlzcGF0Y2guIFRoaXMgY2xhc3MgYWx3YXlzIHJldHVybnMgYHRydWVgLlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBpbiBbZGlzcGF0Y2hNZXNzYWdlXSguL21fc291cmNlLmpzLmh0bWwjZGlzcGF0Y2hNZXNzYWdlKSBtZXRob2Qgb2YgYE1lc3NhZ2VTb3VyY2VgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzb3VyY2VNZXNzYWdlIHNvdXJjZSBtZXNzYWdlLCBjYW4gYmUgdXNlZCBpbiBmaWx0ZXIgcnVsZVxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgaW50ZXJuYWwgbWVzc2FnZSwgY2FuIGJlIHVzZWQgaW4gZmlsdGVyIHJ1bGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnRlcm5hbERhdGEgZGF0YSB0cmFuc2xhdGVkIGJ5IGBjcmVhdGVJbnRlcm5hbERhdGFgIG1ldGhvZCBmcm9tIHNvdXJjZSBkYXRhLCBjYW4gYmUgdXNlZCBpbiBmaWx0ZXIgcnVsZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gZmlsdGVyU291cmNlTWVzc2FnZShzb3VyY2VNZXNzYWdlLCBtZXNzYWdlLCBpbnRlcm5hbERhdGEpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIE1lc3NlbmdlckFQSSA9IHJlcXVpcmUoJy4vbV9hcGknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpO1xuXG5cbi8qKlxuICogQSBnZW5lcmljIHN1YnNjbGFzcyBvZiBbTWVzc2VuZ2VyQVBJXSguL21fYXBpLmpzLmh0bWwpIHRoYXQgc3VwcG9ydHMgcGF0dGVybiBzdWJzY3JpcHRpb25zIHRvIHNvdXJjZS5cbiAqIENhbiBiZSB1c2VmdWwgaWYgdGhlIHNvdXJjZSBpcyBhbm90aGVyIE1lc3Nlbmdlci5cbiAqL1xuIHZhciBNZXNzZW5nZXJSZWdleHBBUEkgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NlbmdlckFQSSwgJ01lc3NlbmdlclJlZ2V4cEFQSScpO1xuXG4gbW9kdWxlLmV4cG9ydHMgPSBNZXNzZW5nZXJSZWdleHBBUEk7XG5cblxuXy5leHRlbmRQcm90byhNZXNzZW5nZXJSZWdleHBBUEksIHtcbiAgICBpbml0OiBpbml0LFxuICAgIGFkZEludGVybmFsTWVzc2FnZTogYWRkSW50ZXJuYWxNZXNzYWdlLFxuICAgIHJlbW92ZUludGVybmFsTWVzc2FnZTogcmVtb3ZlSW50ZXJuYWxNZXNzYWdlLFxuICAgIGdldEludGVybmFsTWVzc2FnZXM6IGdldEludGVybmFsTWVzc2FnZXNcbn0pO1xuXG5cbi8qKlxuICogTWVzc2VuZ2VyUmVnZXhwQVBJIGluc3RhbmNlIG1ldGhvZFxuICogQ2FsbGVkIGJ5IE1lc3NlbmdlclJlZ2V4cEFQSSBjb25zdHJ1Y3Rvci5cbiAqL1xuZnVuY3Rpb24gaW5pdCgpIHtcbiAgICBNZXNzZW5nZXJBUEkucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICBfcGF0dGVybkludGVybmFsTWVzc2FnZXM6IHt9XG4gICAgfSk7XG4gICAgdGhpcy5fY2F0Y2hBbGxTdWJzY3JpYmVkID0gZmFsc2U7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJSZWdleHBBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBBdWdtZW50cyBNZXNzZW5nZXJBUEkgbWV0aG9kIGJ5IHN0b3JpbmcgcmVnZXhwXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgaW50ZXJuYWwgbWVzc2FnZSB0byBiZSB0cmFuc2xhdGVkIGFuZCBhZGRlZFxuICogQHJldHVybiB7U3RyaW5nfFJlZ0V4cHx1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIGFkZEludGVybmFsTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgdmFyIHNvdXJjZU1lc3NhZ2UgPSBNZXNzZW5nZXJBUEkucHJvdG90eXBlLmFkZEludGVybmFsTWVzc2FnZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIFxuICAgIC8vIHN0b3JlIHJlZ2V4cCBpdHNlbGYgaWYgc291cmNlTWVzc2FnZSBpcyByZWdleHBcbiAgICBpZiAoc291cmNlTWVzc2FnZSAmJiBzb3VyY2VNZXNzYWdlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHRoaXMuX2ludGVybmFsTWVzc2FnZXNbc291cmNlTWVzc2FnZV0ucGF0dGVybiA9IHNvdXJjZU1lc3NhZ2U7XG4gICAgICAgIHRoaXMuX3BhdHRlcm5JbnRlcm5hbE1lc3NhZ2VzW3NvdXJjZU1lc3NhZ2VdID0gdGhpcy5faW50ZXJuYWxNZXNzYWdlc1tzb3VyY2VNZXNzYWdlXTtcbiAgICAgICAgaWYgKHRoaXMuX2NhdGNoQWxsU3Vic2NyaWJlZCkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5fY2F0Y2hBbGxTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIC8uKi87XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvdXJjZU1lc3NhZ2U7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJSZWdleHBBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBBdWdtZW50cyBNZXNzZW5nZXJBUEkgbWV0aG9kIGJ5IHJlbW92aW5nIHJlZ2V4cCBzdWJzY2lycHRpb25cbiAqIFxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgaW50ZXJuYWwgbWVzc2FnZSB0byBiZSB0cmFuc2xhdGVkIGFuZCBhZGRlZFxuICogQHJldHVybiB7U3RyaW5nfFJlZ0V4cHx1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUludGVybmFsTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgdmFyIHNvdXJjZU1lc3NhZ2UgPSBNZXNzZW5nZXJBUEkucHJvdG90eXBlLnJlbW92ZUludGVybmFsTWVzc2FnZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgaWYgKHNvdXJjZU1lc3NhZ2UgJiYgc291cmNlTWVzc2FnZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICBkZWxldGUgdGhpcy5fcGF0dGVybkludGVybmFsTWVzc2FnZXNbc291cmNlTWVzc2FnZV07XG4gICAgICAgIHZhciBub1BhdHRlcm5JbnRlcm5hbE1lc3NhZ2VzID0gISBPYmplY3Qua2V5cyh0aGlzLl9wYXR0ZXJuSW50ZXJuYWxNZXNzYWdlcykubGVuZ3RoO1xuICAgICAgICBpZiAobm9QYXR0ZXJuSW50ZXJuYWxNZXNzYWdlcykge1xuICAgICAgICAgICAgdGhpcy5fY2F0Y2hBbGxTdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gLy4qLztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzb3VyY2VNZXNzYWdlO1xufVxuXG5cbi8qKlxuICogTWVzc2VuZ2VyQVBJIGluc3RhbmNlIG1ldGhvZFxuICogQXVnbWVudHMgTWVzc2VuZ2VyQVBJIG1ldGhvZCBieSByZXR1cm5pbmcgbWVzc2FnZXMgc3Vic2NyaWJlZCB3aXRoIHJlZ2V4cFxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBieSBgTWVzc2FnZVNvdXJjZWAgdG8gZGlzcGF0Y2ggc291cmNlIG1lc3NhZ2Ugb24gdGhlIGBNZXNlbmdlcmAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBzb3VyY2VNZXNzYWdlIHNvdXJjZSBtZXNzYWdlXG4gKiBAcmV0dXJuIHtBcnJheVtTdHJpbmddfVxuICovXG5mdW5jdGlvbiBnZXRJbnRlcm5hbE1lc3NhZ2VzKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICB2YXIgaW50ZXJuYWxNZXNzYWdlcyA9IE1lc3NlbmdlckFQSS5wcm90b3R5cGUuZ2V0SW50ZXJuYWxNZXNzYWdlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgLy8gYWRkIGludGVybmFsIG1lc3NhZ2VzIGZvciByZWdleHAgc291cmNlIHN1YnNjcmlwdGlvbnNcbiAgICBpZiAodHlwZW9mIHNvdXJjZU1lc3NhZ2UgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgaW50ZXJuYWxNZXNzYWdlcyA9IGludGVybmFsTWVzc2FnZXMgfHwgW107XG4gICAgICAgIHZhciBpbnRlcm5hbE1lc3NhZ2VzSGFzaCA9IF8ub2JqZWN0KGludGVybmFsTWVzc2FnZXMsIHRydWUpO1xuXG4gICAgICAgIF8uZWFjaEtleSh0aGlzLl9wYXR0ZXJuSW50ZXJuYWxNZXNzYWdlcywgZnVuY3Rpb24ocGF0dGVybk1lc3NhZ2VzKSB7XG4gICAgICAgICAgICB2YXIgc291cmNlUGF0dGVybiA9IHBhdHRlcm5NZXNzYWdlcy5wYXR0ZXJuO1xuXG4gICAgICAgICAgICBpZiAoc291cmNlUGF0dGVybi50ZXN0KHNvdXJjZU1lc3NhZ2UpKVxuICAgICAgICAgICAgICAgIHBhdHRlcm5NZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGludGVybmFsTWVzc2FnZXNIYXNoW21lc3NhZ2VdKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGludGVybmFsTWVzc2FnZXMucHVzaChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxNZXNzYWdlc0hhc2hbbWVzc2FnZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9IFxuXG4gICAgcmV0dXJuIGludGVybmFsTWVzc2FnZXM7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBNaXhpbiA9IHJlcXVpcmUoJy4uL2Fic3RyYWN0L21peGluJylcbiAgICAsIE1lc3NlbmdlckFQSSA9IHJlcXVpcmUoJy4vbV9hcGknKVxuICAgICwgbG9nZ2VyID0gcmVxdWlyZSgnLi4vdXRpbC9sb2dnZXInKVxuICAgICwgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpXG4gICAgLCBjaGVjayA9IHJlcXVpcmUoJy4uL3V0aWwvY2hlY2snKVxuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxuXG4vKipcbiAqIGBtaWxvLmNsYXNzZXMuTWVzc2FnZVNvdXJjZWBcbiAqIEFuIGFic3RyYWN0IGNsYXNzIChzdWJjbGFzcyBvZiBbTWl4aW5dKC4uL2Fic3RyYWN0L21peGluLmpzLmh0bWwpKSBmb3IgY29ubmVjdGluZyBbTWVzc2VuZ2VyXSguL2luZGV4LmpzLmh0bWwpIHRvIGV4dGVybmFsIHNvdXJjZXMgb2YgbWVzc2FnZXMgKGxpa2UgRE9NIGV2ZW50cykgYW5kIGRlZmluaW5nIGhpZ2hlciBsZXZlbCBtZXNzYWdlcy5cbiAqIEFuIGluc3RhbmNlIG9mIE1lc3NhZ2VTb3VyY2UgY2FuIGVpdGhlciBiZSBwYXNzZWQgdG8gTWVzc2VuZ2VyIGNvbnN0cnVjdG9yIG9yIGxhdGVyIHVzaW5nIGBfc2V0TWVzc2FnZVNvdXJjZWAgbWV0aG9kIG9mIE1lc3Nlbmdlci4gT25jZSBzZXQsIE1lc3NhZ2VTb3VyY2Ugb2YgTWVzc2VuZ2VyIGNhbm5vdCBiZSBjaGFuZ2VkLlxuICovXG52YXIgTWVzc2FnZVNvdXJjZSA9IF8uY3JlYXRlU3ViY2xhc3MoTWl4aW4sICdNZXNzYWdlU291cmNlJywgdHJ1ZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTWVzc2FnZVNvdXJjZTtcblxuXG4vKipcbiAqICMjIyNNZXNzYWdlU291cmNlIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbaW5pdF0oI2luaXQpIC0gaW5pdGlhbGl6ZXMgbWVzc2FnZVNvdXJjZSAtIGNhbGxlZCBieSBNaXhpbiBzdXBlcmNsYXNzXG4gKiAtIFtzZXRNZXNzZW5nZXJdKCNzZXRNZXNzZW5nZXIpIC0gY29ubmVjdHMgTWVzc2VuZ2VyIHRvIE1lc3NhZ2VTb3VyY2UsIGlzIGNhbGxlZCBmcm9tIGBpbml0YCBvciBgX3NldE1lc3NhZ2VTb3VyY2VgIG1ldGhvZHMgb2YgW01lc3Nlbmdlcl0oLi9pbmRleC5qcy5odG1sKS5cbiAqIC0gW29uU3Vic2NyaWJlckFkZGVkXSgjb25TdWJzY3JpYmVyQWRkZWQpIC0gY2FsbGVkIGJ5IE1lc3NlbmdlciB0byBub3RpZnkgd2hlbiB0aGUgZmlyc3Qgc3Vic2NyaWJlciBmb3IgYW4gaW50ZXJuYWwgbWVzc2FnZSB3YXMgYWRkZWQsIHNvIE1lc3NhZ2VTb3VyY2UgY2FuIHN1YnNjcmliZSB0byBzb3VyY2VcbiAqIC0gW29uU3Vic2NyaWJlclJlbW92ZWRdKCNvblN1YnNjcmliZXJSZW1vdmVkKSAtIGNhbGxlZCBieSBNZXNzZW5nZXIgdG8gbm90aWZ5IHdoZW4gdGhlIGxhc3Qgc3Vic2NyaWJlciBmb3IgYW4gaW50ZXJuYWwgbWVzc2FnZSB3YXMgcmVtb3ZlZCwgc28gTWVzc2FnZVNvdXJjZSBjYW4gdW5zdWJzY3JpYmUgZnJvbSBzb3VyY2VcbiAqIC0gW2Rpc3BhdGNoTWVzc2FnZV0oI2Rpc3BhdGNoTWVzc2FnZSkgLSBkaXNwYXRjaGVzIHNvdXJjZSBtZXNzYWdlLiBNZXNzYWdlU291cmNlIHN1YmNsYXNzIHNob3VsZCBpbXBsZW1lbnQgbWVjaGFuaXNtIHdoZW4gb24gYWN0dWFsIHNvdXJjZSBtZXNzYWdlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC5cbiAqXG4gKiBNZXRob2RzIGJlbG93IHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzczpcbiAqXG4gKiAtIFt0cmlnZ2VyXSgjdHJpZ2dlcikgLSB0cmlnZ2VycyBtZXNzYWdlcyBvbiB0aGUgc291cmNlIChhbiBvcHRpb25hbCBtZXRob2QpXG4gKiAtIFthZGRTb3VyY2VTdWJzY3JpYmVyXSgjYWRkU291cmNlU3Vic2NyaWJlcikgLSBhZGRzIGxpc3RlbmVyL3N1YnNjcmliZXIgdG8gZXh0ZXJuYWwgbWVzc2FnZVxuICogLSBbcmVtb3ZlU291cmNlU3Vic2NyaWJlcl0oI3JlbW92ZVNvdXJjZVN1YnNjcmliZXIpIC0gcmVtb3ZlcyBsaXN0ZW5lci9zdWJzY3JpYmVyIGZyb20gZXh0ZXJuYWwgbWVzc2FnZVxuICovXG5fLmV4dGVuZFByb3RvKE1lc3NhZ2VTb3VyY2UsIHtcbiAgICBpbml0OiBpbml0LFxuICAgIGRlc3Ryb3k6IE1lc3NhZ2VTb3VyY2UkZGVzdHJveSxcbiAgICBzZXRNZXNzZW5nZXI6IHNldE1lc3NlbmdlcixcbiAgICBvblN1YnNjcmliZXJBZGRlZDogb25TdWJzY3JpYmVyQWRkZWQsXG4gICAgb25TdWJzY3JpYmVyUmVtb3ZlZDogb25TdWJzY3JpYmVyUmVtb3ZlZCwgXG4gICAgZGlzcGF0Y2hNZXNzYWdlOiBkaXNwYXRjaE1lc3NhZ2UsXG4gICAgcG9zdE1lc3NhZ2U6IHBvc3RNZXNzYWdlLFxuICAgIF9wcmVwYXJlTWVzc2VuZ2VyQVBJOiBfcHJlcGFyZU1lc3NlbmdlckFQSSxcblxuICAgIC8vIE1ldGhvZHMgYmVsb3cgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzc1xuICAgIHRyaWdnZXI6IHRvQmVJbXBsZW1lbnRlZCxcbiAgICBhZGRTb3VyY2VTdWJzY3JpYmVyOiB0b0JlSW1wbGVtZW50ZWQsXG4gICAgcmVtb3ZlU291cmNlU3Vic2NyaWJlcjogdG9CZUltcGxlbWVudGVkXG59KTtcblxuXG4vKipcbiAqIE1lc3NhZ2VTb3VyY2UgaW5zdGFuY2UgbWV0aG9kLlxuICogQ2FsbGVkIGJ5IE1peGluIGNvbnN0cnVjdG9yLlxuICogTWVzc2FnZVNvdXJjZSBjb25zdHJ1Y3RvciBzaG91bGQgYmUgcGFzc2VkIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgdGhpcyBtZXRob2Qgc2lnbmF0dXJlLlxuICogSWYgYW4gaW5zdGFuY2Ugb2YgW01lc3NlbmdlckFQSV0oLi9tX2FwaS5qcy5odG1sKSBpcyBwYXNzZWQgYXMgdGhlIHRoaXJkIHBhcmFtZXRlciwgaXQgZXh0ZW5kcyBNZXNzYWdlU291cmNlIGZ1bmN0aW9uYWxpdHkgdG8gYWxsb3cgaXQgdG8gZGVmaW5lIG5ldyBtZXNzYWdlcywgdG8gZmlsdGVyIG1lc3NhZ2VzIGJhc2VkIG9uIHRoZWlyIGRhdGEgYW5kIHRvIGNoYW5nZSBtZXNzYWdlIGRhdGEuIFNlZSBbTWVzc2VuZ2VyQVBJXSguL21fYXBpLmpzLmh0bWwpLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBob3N0T2JqZWN0IE9wdGlvbmFsIG9iamVjdCB0aGF0IHN0b3JlcyB0aGUgTWVzc2FnZVNvdXJjZSBvbiBvbmUgb2YgaXRzIHByb3BlcnRpZXMuIEl0IGlzIHVzZWQgdG8gcHJveHkgbWV0aG9kcyBvZiBNZXNzYWdlU291cmNlLlxuICogQHBhcmFtIHtPYmplY3RbU3RyaW5nXX0gcHJveHlNZXRob2RzIE9wdGlvbmFsIG1hcCBvZiBtZXRob2QgbmFtZXM7IGtleSAtIHByb3h5IG1ldGhvZCBuYW1lLCB2YWx1ZSAtIE1lc3NhZ2VTb3VyY2UncyBtZXRob2QgbmFtZS5cbiAqIEBwYXJhbSB7TWVzc2VuZ2VyQVBJfSBtZXNzZW5nZXJBUEkgT3B0aW9uYWwgaW5zdGFuY2Ugb2YgTWVzc2VuZ2VyQVBJLlxuICovXG5mdW5jdGlvbiBpbml0KGhvc3RPYmplY3QsIHByb3h5TWV0aG9kcywgbWVzc2VuZ2VyQVBJKSB7XG4gICAgdGhpcy5fcHJlcGFyZU1lc3NlbmdlckFQSShtZXNzZW5nZXJBUEkpO1xufVxuXG5cbi8qKlxuICogRGVzdHJveXMgbWVzc2FnZSBzb3VyY2VcbiAqL1xuZnVuY3Rpb24gTWVzc2FnZVNvdXJjZSRkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLm1lc3NlbmdlckFQSSlcbiAgICAgICAgdGhpcy5tZXNzZW5nZXJBUEkuZGVzdHJveSgpO1xufVxuXG5cbi8qKlxuICogTWVzc2FnZVNvdXJjZSBpbnN0YW5jZSBtZXRob2QuXG4gKiBTZXRzIHJlZmVyZW5jZSB0byBNZXNzZW5nZXIgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtNZXNzZW5nZXJ9IG1lc3NlbmdlciByZWZlcmVuY2UgdG8gTWVzc2VuZ2VyIGluc3RhbmNlIGxpbmtlZCB0byB0aGlzIE1lc3NhZ2VTb3VyY2VcbiAqL1xuZnVuY3Rpb24gc2V0TWVzc2VuZ2VyKG1lc3Nlbmdlcikge1xuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgJ21lc3NlbmdlcicsIG1lc3Nlbmdlcik7XG59XG5cblxuLyoqXG4gKiBNZXNzYWdlU291cmNlIGluc3RhbmNlIG1ldGhvZC5cbiAqIFByZXBhcmVzIFtNZXNzZW5nZXJBUEldKC4vbV9hcGkuanMuaHRtbCkgcGFzc2VkIHRvIGNvbnN0cnVjdG9yIGJ5IHByb3h5aW5nIGl0cyBtZXRob2RzIHRvIGl0c2VsZiBvciBpZiBNZXNzZW5nZXJBUEkgd2Fzbid0IHBhc3NlZCBkZWZpbmVzIHR3byBtZXRob2RzIHRvIGF2b2lkIGNoZWNraW5nIHRoZWlyIGF2YWlsYWJpbGl0eSBldmVyeSB0aW1lIHRoZSBtZXNzYWdlIGlzIGRpc3BhdGNoZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7TWVzc2VuZ2VyQVBJfSBtZXNzZW5nZXJBUEkgT3B0aW9uYWwgaW5zdGFuY2Ugb2YgTWVzc2VuZ2VyQVBJXG4gKi9cbmZ1bmN0aW9uIF9wcmVwYXJlTWVzc2VuZ2VyQVBJKG1lc3NlbmdlckFQSSkge1xuICAgIGNoZWNrKG1lc3NlbmdlckFQSSwgTWF0Y2guT3B0aW9uYWwoTWVzc2VuZ2VyQVBJKSk7XG5cbiAgICBpZiAoISBtZXNzZW5nZXJBUEkpXG4gICAgICAgIG1lc3NlbmdlckFQSSA9IG5ldyBNZXNzZW5nZXJBUEk7XG5cbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsICdtZXNzZW5nZXJBUEknLCBtZXNzZW5nZXJBUEkpO1xufVxuXG5cbi8qKlxuICogTWVzc2FnZVNvdXJjZSBpbnN0YW5jZSBtZXRob2QuXG4gKiBTdWJzY3JpYmVzIHRvIGV4dGVybmFsIHNvdXJjZSB1c2luZyBgYWRkU291cmNlU3Vic2NyaWJlcmAgbWV0aG9kIHRoYXQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHN1YmNsYXNzLlxuICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFtNZXNzZW5nZXJdKC4vaW5kZXguanMuaHRtbCkgd2hlbiB0aGUgZmlyc3Qgc3Vic2NyaWJlciB0byB0aGUgYG1lc3NhZ2VgIGlzIGFkZGVkLlxuICogRGVsZWdhdGVzIHRvIHN1cHBsaWVkIG9yIGRlZmF1bHQgW01lc3NlbmdlckFQSV0oLi9tX2FwaS5qcy5odG1sKSBmb3IgdHJhbnNsYXRpb24gb2YgYG1lc3NhZ2VgIHRvIGBzb3VyY2VNZXNzYWdlYC4gYE1lc3NhZ2VBUEkucHJvdG90eXBlLmFkZEludGVybmFsTWVzc2FnZWAgd2lsbCByZXR1cm4gdW5kZWZpbmVkIGlmIHRoaXMgYHNvdXJjZU1lc3NhZ2VgIHdhcyBhbHJlYWR5IHN1YnNjcmliZWQgdG8gdG8gcHJldmVudCBkdXBsaWNhdGUgc3Vic2NyaXB0aW9uLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIGludGVybmFsIE1lc3NlbmdlciBtZXNzYWdlIHRoYXQgaGFzIHRvIGJlIHN1YnNjcmliZWQgdG8gYXQgdGhlIGV4dGVybmFsIHNvdXJjZSBvZiBtZXNzYWdlcy5cbiAqL1xuZnVuY3Rpb24gb25TdWJzY3JpYmVyQWRkZWQobWVzc2FnZSkge1xuICAgIHZhciBuZXdTb3VyY2VNZXNzYWdlID0gdGhpcy5tZXNzZW5nZXJBUEkuYWRkSW50ZXJuYWxNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIGlmICh0eXBlb2YgbmV3U291cmNlTWVzc2FnZSAhPSAndW5kZWZpbmVkJylcbiAgICAgICAgdGhpcy5hZGRTb3VyY2VTdWJzY3JpYmVyKG5ld1NvdXJjZU1lc3NhZ2UpO1xufVxuXG5cbi8qKlxuICogTWVzc2FnZVNvdXJjZSBpbnN0YW5jZSBtZXRob2QuXG4gKiBVbnN1YnNjcmliZXMgZnJvbSBleHRlcm5hbCBzb3VyY2UgdXNpbmcgYHJlbW92ZVNvdXJjZVN1YnNjcmliZXJgIG1ldGhvZCB0aGF0IHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzcy5cbiAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBbTWVzc2VuZ2VyXSguL2luZGV4LmpzLmh0bWwpIHdoZW4gdGhlIGxhc3Qgc3Vic2NyaWJlciB0byB0aGUgYG1lc3NhZ2VgIGlzIHJlbW92ZWQuXG4gKiBEZWxlZ2F0ZXMgdG8gc3VwcGxpZWQgb3IgZGVmYXVsdCBbTWVzc2VuZ2VyQVBJXSguL21fYXBpLmpzLmh0bWwpIGZvciB0cmFuc2xhdGlvbiBvZiBgbWVzc2FnZWAgdG8gYHNvdXJjZU1lc3NhZ2VgLiBgTWVzc2FnZUFQSS5wcm90b3R5cGUucmVtb3ZlSW50ZXJuYWxNZXNzYWdlYCB3aWxsIHJldHVybiB1bmRlZmluZWQgaWYgdGhpcyBgc291cmNlTWVzc2FnZWAgd2FzIG5vdCB5ZXQgc3Vic2NyaWJlZCB0byB0byBwcmV2ZW50IHVuc3Vic2NyaXB0aW9uIHdpdGhvdXQgcHJldmlvdXMgc3Vic2NyaXB0aW9uLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIGludGVybmFsIE1lc3NlbmdlciBtZXNzYWdlIHRoYXQgaGFzIHRvIGJlIHVuc3Vic2NyaWJlZCBmcm9tIGF0IHRoZSBleHRlcm5hbCBzb3VyY2Ugb2YgbWVzc2FnZXMuXG4gKi9cbmZ1bmN0aW9uIG9uU3Vic2NyaWJlclJlbW92ZWQobWVzc2FnZSkge1xuICAgIHZhciByZW1vdmVkU291cmNlTWVzc2FnZSA9IHRoaXMubWVzc2VuZ2VyQVBJLnJlbW92ZUludGVybmFsTWVzc2FnZShtZXNzYWdlKTtcbiAgICBpZiAodHlwZW9mIHJlbW92ZWRTb3VyY2VNZXNzYWdlICE9ICd1bmRlZmluZWQnKVxuICAgICAgICB0aGlzLnJlbW92ZVNvdXJjZVN1YnNjcmliZXIocmVtb3ZlZFNvdXJjZU1lc3NhZ2UpO1xufVxuXG5cbi8qKlxuICogTWVzc2FnZVNvdXJjZSBpbnN0YW5jZSBtZXRob2QuXG4gKiBEaXNwYXRjaGVzIHNvdXJjZU1lc3NhZ2UgdG8gTWVzc2VuZ2VyLlxuICogTWVjaGFuaXNtIHRoYXQgY2FsbHMgdGhpcyBtZXRob2Qgd2hlbiB0aGUgc291cmNlIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzIChzZWUgW0RPTUV2ZW50c1NvdXJjZV0oLi4vY29tcG9uZW50cy9tc2dfc3JjL2RvbV9ldmVudHMuanMuaHRtbCkgZm9yIGV4YW1wbGUpLlxuICogRGVsZWdhdGVzIHRvIHN1cHBsaWVkIG9yIGRlZmF1bHQgW01lc3NlbmdlckFQSV0oLi9tX2FwaS5qcy5odG1sKSB0byBjcmVhdGUgaW50ZXJuYWwgbWVzc2FnZSBkYXRhIChgY3JlYXRlSW50ZXJuYWxEYXRhYCkgYW5kIHRvIGZpbHRlciB0aGUgbWVzc2FnZSBiYXNlZCBvbiBpdHMgZGF0YSBhbmQvb3IgbWVzc2FnZSAoYGZpbHRlclNvdXJjZU1lc3NhZ2VgKS5cbiAqIEJhc2UgTWVzc2VuZ2VyQVBJIGNsYXNzIGltcGxlbWVudHMgdGhlc2UgdHdvIG1ldGhvZHMgaW4gYSB0cml2aWFsIHdheSAoYGNyZWF0ZUludGVybmFsRGF0YWAgc2ltcGx5IHJldHVybnMgZXh0ZXJuYWwgZGF0YSwgYGZpbHRlclNvdXJjZU1lc3NhZ2VgIHJldHVybnMgYHRydWVgKSwgdGhleSBhcmUgbWVhbnQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNvdXJjZU1lc3NhZ2Ugc291cmNlIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBleHRlcm5hbCBzb3VyY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2VEYXRhIGRhdGEgcmVjZWl2ZWQgZnJvbSBleHRlcm5hbCBzb3VyY2VcbiAqL1xuZnVuY3Rpb24gZGlzcGF0Y2hNZXNzYWdlKHNvdXJjZU1lc3NhZ2UsIHNvdXJjZURhdGEpIHtcbiAgICB2YXIgYXBpID0gdGhpcy5tZXNzZW5nZXJBUElcbiAgICAgICAgLCBpbnRlcm5hbE1lc3NhZ2VzID0gYXBpLmdldEludGVybmFsTWVzc2FnZXMoc291cmNlTWVzc2FnZSk7XG5cbiAgICBpZiAoaW50ZXJuYWxNZXNzYWdlcykgXG4gICAgICAgIGludGVybmFsTWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgICAgICAgICAgdmFyIGludGVybmFsRGF0YSA9IGFwaS5jcmVhdGVJbnRlcm5hbERhdGEoc291cmNlTWVzc2FnZSwgbWVzc2FnZSwgc291cmNlRGF0YSk7XG5cbiAgICAgICAgICAgIHZhciBzaG91bGREaXNwYXRjaCA9IGFwaS5maWx0ZXJTb3VyY2VNZXNzYWdlKHNvdXJjZU1lc3NhZ2UsIG1lc3NhZ2UsIGludGVybmFsRGF0YSk7XG4gICAgICAgICAgICBpZiAoc2hvdWxkRGlzcGF0Y2gpIFxuICAgICAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UobWVzc2FnZSwgaW50ZXJuYWxEYXRhKTsgICAgICBcbiAgICAgICAgICAgIFxuICAgICAgICB9LCB0aGlzKTtcbn1cblxuXG4vKipcbiAqIFBvc3RzIG1lc3NhZ2Ugb24gdGhlIG1lc3Nlbmdlci4gVGhpcyBtZXRob2QgaXMgc2VwYXJhdGVkIHNvIHNwZWNpZmljIG1lc3NhZ2Ugc291cmNlcyBjYW4gbWFrZSBtZXNzYWdlIGRpc3BhdGNoIHN5bmNocm9ub3VzIGJ5IHVzaW5nIGBwb3N0TWVzc2FnZVN5bmNgXG4gKiBcbiAqIEBwYXJhbSAge1N0cmluZ30gbWVzc2FnZVxuICogQHBhcmFtICB7T2JqZWN0fSBkYXRhXG4gKi9cbmZ1bmN0aW9uIHBvc3RNZXNzYWdlKG1lc3NhZ2UsIGRhdGEpIHtcbiAgICB0aGlzLm1lc3Nlbmdlci5wb3N0TWVzc2FnZShtZXNzYWdlLCBkYXRhKTtcbn1cblxuXG5mdW5jdGlvbiB0b0JlSW1wbGVtZW50ZWQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjYWxsaW5nIHRoZSBtZXRob2Qgb2YgYW4gYWJzY3RyYWN0IGNsYXNzJyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIE1lc3NhZ2VTb3VyY2UgPSByZXF1aXJlKCcuL21fc291cmNlJylcbiAgICAsIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKVxuICAgICwgY2hlY2sgPSByZXF1aXJlKCcuLi91dGlsL2NoZWNrJyk7XG5cblxuLyoqXG4gKiBTdWJjbGFzcyBvZiBNZXNzYWdlU291cmNlIHRoYXQgYWxsb3dzIHRvIGNvbm5lY3QgTWVzc2VuZ2VyIHRvIGFub3RoZXIgTWVzc2VuZ2VyIHVzaW5nIGl0IGFzIGV4dGVybmFsIHNvdXJjZS5cbiAqL1xudmFyIE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2UgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NhZ2VTb3VyY2UsICdNZXNzZW5nZXJNZXNzYWdlU291cmNlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTWVzc2VuZ2VyTWVzc2FnZVNvdXJjZTtcblxuXG4vKipcbiAqICMjIyNNZXNzZW5nZXJNZXNzYWdlU291cmNlIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKi9cbl8uZXh0ZW5kUHJvdG8oTWVzc2VuZ2VyTWVzc2FnZVNvdXJjZSwge1xuICAgIGluaXQ6IGluaXQsXG4gICAgYWRkU291cmNlU3Vic2NyaWJlcjogYWRkU291cmNlU3Vic2NyaWJlcixcbiAgICByZW1vdmVTb3VyY2VTdWJzY3JpYmVyOiByZW1vdmVTb3VyY2VTdWJzY3JpYmVyLFxuICAgIHBvc3RNZXNzYWdlOiBNZXNzZW5nZXJNZXNzYWdlU291cmNlJHBvc3RNZXNzYWdlXG59KTtcblxuLyoqXG4gKiBJbml0aWFsaXplcyBNZXNzZW5nZXJNZXNzYWdlU291cmNlXG4gKiBEZWZpbmVzIG9uZSBwYXJhbWV0ZXIgaW4gYWRkaXRpb24gdG8gW01lc3NhZ2VTb3VyY2VdKC4vbV9zb3VyY2UuanMuaHRtbCkgcGFyYW1ldGVyc1xuICpcbiAqIEBwYXJhbSB7TWVzc2VuZ2VyfSBzb3VyY2VNZXNzZW5nZXIgbWVzc2VuZ2VyIHRoaXMgbWVzc2FnZSBzb3VyY2UgY29ubmVjdHMgdG9cbiAqL1xuZnVuY3Rpb24gaW5pdChob3N0T2JqZWN0LCBwcm94eU1ldGhvZHMsIG1lc3NlbmdlckFQSSwgc291cmNlTWVzc2VuZ2VyKSB7XG4gICAgTWVzc2FnZVNvdXJjZS5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMuc291cmNlTWVzc2VuZ2VyID0gc291cmNlTWVzc2VuZ2VyO1xufVxuXG5cbi8qKlxuICogU3Vic2NyaWJlcyB0byBzb3VyY2UgbWVzc2FnZS4gU2VlIFtNZXNzYWdlU291cmNlXSguL21fc291cmNlLmpzLmh0bWwpIGRvY3MuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8UmVnZXh9IHNvdXJjZU1lc3NhZ2Ugc291cmNlIG1lc3NhZ2UgdG8gc3Vic2NyaWJlIHRvXG4gKi9cbmZ1bmN0aW9uIGFkZFNvdXJjZVN1YnNjcmliZXIoc291cmNlTWVzc2FnZSkge1xuICAgIHRoaXMuc291cmNlTWVzc2VuZ2VyLm9uU3luYyhzb3VyY2VNZXNzYWdlLCB7IGNvbnRleHQ6IHRoaXMsIHN1YnNjcmliZXI6IHRoaXMuZGlzcGF0Y2hNZXNzYWdlIH0pO1xufVxuXG5cbi8qKlxuICogVW5zdWJzY3JpYmVzIGZyb20gc291cmNlIG1lc3NhZ2UuIFNlZSBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBkb2NzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ2V4fSBzb3VyY2VNZXNzYWdlIHNvdXJjZSBtZXNzYWdlIHRvIHVuc3Vic2NyaWJlIGZyb21cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlU291cmNlU3Vic2NyaWJlcihzb3VyY2VNZXNzYWdlKSB7XG4gICAgdGhpcy5zb3VyY2VNZXNzZW5nZXIub2ZmKHNvdXJjZU1lc3NhZ2UsIHsgY29udGV4dDogdGhpcywgc3Vic2NyaWJlcjogdGhpcy5kaXNwYXRjaE1lc3NhZ2UgfSk7XG59XG5cblxuLyoqXG4gKiBPdmVycmlkZXMgZGVmYWx1dCBtZXNzYWdlIHNvdXJjZSB0byBkaXNwYXRjaCBtZXNzYWdlcyBzeW5jaHJvbm91c2x5XG4gKiBcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICovXG5mdW5jdGlvbiBNZXNzZW5nZXJNZXNzYWdlU291cmNlJHBvc3RNZXNzYWdlKG1lc3NhZ2UsIGRhdGEpIHtcbiAgICB0aGlzLm1lc3Nlbmdlci5wb3N0TWVzc2FnZVN5bmMobWVzc2FnZSwgZGF0YSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBfID0gcmVxdWlyZSgnbW9sLXByb3RvJyk7XG5cblxuLyoqXG4gKiAjIyMjTWlsbyBwYWNrYWdlcyMjIyNcbiAqXG4gKiAtIFttaW5kZXJdKC4vbWluZGVyLmpzLmh0bWwpIC0gZGF0YSByZWFjdGl2aXR5LCBvbmUgb3IgdHdvIHdheSwgc2hhbGxvdyBvciBkZWVwLCBhcyB5b3UgbGlrZSBpdFxuICogLSBbY29uZmlnXSguL2NvbmZpZy5qcy5odG1sKSAtIG1pbG8gY29uZmlndXJhdGlvblxuICogLSBbdXRpbF0oLi91dGlsL2luZGV4LmpzLmh0bWwpIC0gbG9nZ2VyLCByZXF1ZXN0LCBkb20sIGNoZWNrLCBlcnJvciwgZXRjLlxuICogLSBbY2xhc3Nlc10oLi9jbGFzc2VzLmpzLmh0bWwpIC0gYWJzdHJhY3QgYW5kIGJhc2UgY2xhc3Nlc1xuICogLSBbTWVzc2VuZ2VyXSguL21lc3Nlbmdlci9pbmRleC5qcy5odG1sKSAtIGdlbmVyaWMgTWVzc2VuZ2VyIHVzZWQgaW4gbW9zdCBvdGhlciBtaWxvIGNsYXNzZXMsIGNhbiBiZSBtaXhlZCBpbnRvIGFwcCBjbGFzc2VzIHRvby5cbiAqIC0gW01vZGVsXSguL21vZGVsL2luZGV4LmpzLmh0bWwpIC0gTW9kZWwgY2xhc3MgdGhhdCBlbWl0cyBtZXNzYWdlcyBvbiBjaGFuZ2VzIHRvIGFueSBkZXB0aCB3aXRob3V0IHRpbWVyIGJhc2VkIHdhdGNoaW5nXG4gKi9cbnZhciBtaWxvID0ge1xuICAgIG1pbmRlcjogcmVxdWlyZSgnLi9taW5kZXInKSxcbiAgICBjb25maWc6IHJlcXVpcmUoJy4vY29uZmlnJyksXG4gICAgdXRpbDogcmVxdWlyZSgnLi91dGlsJyksXG4gICAgY2xhc3NlczogcmVxdWlyZSgnLi9jbGFzc2VzJyksXG4gICAgTWVzc2VuZ2VyOiByZXF1aXJlKCcuL21lc3NlbmdlcicpLFxuICAgIE1vZGVsOiByZXF1aXJlKCcuL21vZGVsJyksXG4gICAgZGVzdHJveTogZGVzdHJveSxcbiAgICBwcm90bzogX1xufTtcblxuXG4vLyBleHBvcnQgZm9yIG5vZGUvYnJvd3NlcmlmeVxuaWYgKHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpICAgIFxuICAgIG1vZHVsZS5leHBvcnRzID0gbWlsbztcblxuLy8gZ2xvYmFsIG1pbG8gZm9yIGJyb3dzZXJcbmlmICh0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnKVxuICAgIHdpbmRvdy5taWxvID0gbWlsbztcblxuXG5mdW5jdGlvbiBkZXN0cm95KCkge1xuICAgIG1pbG8ubWluZGVyLmRlc3Ryb3koKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbm5lY3RvciA9IHJlcXVpcmUoJy4vbW9kZWwvY29ubmVjdG9yJylcbiAgICAsIE1lc3NlbmdlciA9IHJlcXVpcmUoJy4vbWVzc2VuZ2VyJylcbiAgICAsIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKVxuICAgICwgbG9nZ2VyID0gcmVxdWlyZSgnLi91dGlsL2xvZ2dlcicpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gbWluZGVyO1xuXG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIG9uZSBvciBtYW55IENvbm5lY3RvciBvYmplY3RzIHRoYXRcbiAqIGNyZWF0ZSBsaXZlIHJlYWN0aXZlIGNvbm5lY3Rpb24gYmV0d2VlbiBvYmplY3RzIGltcGxlbWVudGluZ1xuICogZGF0YVNvdXJjZSBpbnRlcmZhY2U6XG4gKiBPYmplY3RzIHNob3VsZCBlbWl0IG1lc3NhZ2VzIHdoZW4gYW55IHBhcnQgb2YgdGhlaXIgZGF0YSBjaGFuZ2VzLFxuICogbWV0aG9kcyBgb25gIGFuZCBgb2ZmYCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgdG8gc3Vic2NyaWJlL3Vuc3Vic2NyaWJlXG4gKiB0byBjaGFuZ2Ugbm90aWZpY2F0aW9uIG1lc3NhZ2VzLCBtZXRob2RzIGBzZXRgIGFuZCBgZ2V0YCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgdG8gZ2V0L3NldCBkYXRhXG4gKiBvbiBwYXRoIG9iamVjdHMsIHBvaW50aW5nIHRvIHBhcnRpY3VsYXIgcGFydHMgb2YgdGhlIG9iamVjdCwgbWV0aG9kIGBwYXRoYFxuICogc2hvdWxkIHJldHVybiBwYXRoIG9iamVjdCBmb3IgYSBnaXZlbiBwYXRoIHN0cmluZyAoc2VlIHBhdGggdXRpbHMgZm9yIHBhdGggc3RyaW5nIHN5bnRheCkuXG4gKiBCb3RoIE1vZGVsIGFuZCBEYXRhIGZhY2V0IGFyZSBzdWNoIGRhdGEgc291cmNlcywgdGhleSBjYW4gYmUgbGlua2VkIGJ5IENvbm5lY3RvciBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRzMSB0aGUgZmlyc3QgZGF0YSBzb3VyY2UuIEluc3RlYWQgb2YgdGhlIGZpcnN0IGRhdGEgc291cmNlIGFuIGFycmF5IGNhbiBiZSBwYXNzZWQgd2l0aCBhcnJheXMgb2YgQ29ubmVjdGlvbiBvYmplY3RzIHBhcmFtZXRlcnMgaW4gZWFjaCBhcnJheSBlbGVtZW50LlxuICogQHBhcmFtIHtTdHJpbmd9IG1vZGUgdGhlIGNvbm5lY3Rpb24gbW9kZSB0aGF0IGRlZmluZXMgdGhlIGRpcmVjdGlvbiBhbmQgdGhlIGRlcHRoIG9mIGNvbm5lY3Rpb24uIFBvc3NpYmxlIHZhbHVlcyBhcmUgJy0+JywgJzw8LScsICc8PDwtPj4+JywgZXRjLlxuICogQHBhcmFtIHtPYmplY3R9IGRzMiB0aGUgc2Vjb25kIGRhdGEgc291cmNlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBub3QgaW1wbGVtZW50ZWQgeWV0XG4gKi9cbmZ1bmN0aW9uIG1pbmRlcihkczEsIG1vZGUsIGRzMiwgb3B0aW9ucykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRzMSkpIHtcbiAgICAgICAgdmFyIGNvbm5EZXNjcmlwdGlvbnMgPSBkczE7XG4gICAgICAgIHZhciBjb25uZWN0b3JzID0gY29ubkRlc2NyaXB0aW9ucy5tYXAoZnVuY3Rpb24oZGVzY3IpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29ubmVjdG9yKGRlc2NyWzBdLCBkZXNjclsxXSwgZGVzY3JbMl0sIGRlc2NyWzNdKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbm5lY3RvcnMuZm9yRWFjaChfYWRkQ29ubmVjdG9yKTtcbiAgICAgICAgcmV0dXJuIGNvbm5lY3RvcnM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGNuY3QgPSBuZXcgQ29ubmVjdG9yKGRzMSwgbW9kZSwgZHMyLCBvcHRpb25zKTtcbiAgICAgICAgX2FkZENvbm5lY3RvcihjbmN0KTtcbiAgICAgICAgcmV0dXJuIGNuY3Q7XG4gICAgfVxufVxuXG5cbi8qKlxuICogbWVzc2VuZ2VyIG9mIG1pbmRlciB3aGVyZSBpdCBlbWl0cyBldmVudHMgcmVsYXRlZCB0byBhbGwgY29ubmVjdG9yc1xuICogQHR5cGUge01lc3Nlbmdlcn1cbiAqL1xudmFyIF9tZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKG1pbmRlciwgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcblxuXG52YXIgX2Nvbm5lY3RvcnMgPSBbXVxuICAgICwgX3JlY2VpdmVkTWVzc2FnZXMgPSBbXVxuICAgICwgX2lzUHJvcGFnYXRpbmcgPSBmYWxzZTtcblxuXG5fLmV4dGVuZChtaW5kZXIsIHtcbiAgICBnZXRDb25uZWN0b3JzOiBtaW5kZXJfZ2V0Q29ubmVjdG9ycyxcbiAgICBnZXRFeHBhbmRlZENvbm5lY3Rpb25zOiBtaW5kZXJfZ2V0RXhwYW5kZWRDb25uZWN0aW9ucyxcbiAgICBpc1Byb3BhZ2F0aW5nOiBtaW5kZXJfaXNQcm9wYWdhdGluZyxcbiAgICB3aGVuUHJvcGFnYXRpb25Db21wbGV0ZWQ6IG1pbmRlcl93aGVuUHJvcGFnYXRpb25Db21wbGV0ZWQsXG4gICAgZGVzdHJveUNvbm5lY3RvcjogbWluZGVyX2Rlc3Ryb3lDb25uZWN0b3IsXG4gICAgZGVzdHJveTogbWluZGVyX2Rlc3Ryb3lcbn0pO1xuXG5cbmZ1bmN0aW9uIF9hZGRDb25uZWN0b3IoY25jdCkge1xuICAgIGNuY3QuX19fbWluZGVyX2lkID0gX2Nvbm5lY3RvcnMucHVzaChjbmN0KSAtIDE7XG4gICAgY25jdC5vbigvLiovLCBvbkNvbm5lY3Rvck1lc3NhZ2UpO1xuICAgIG1pbmRlci5wb3N0TWVzc2FnZSgnYWRkZWQnLCB7IGNvbm5lY3RvcjogY25jdCB9KTtcbiAgICBtaW5kZXIucG9zdE1lc3NhZ2UoJ3R1cm5lZG9uJywgeyBjb25uZWN0b3I6IGNuY3QgfSk7XG59XG5cblxuZnVuY3Rpb24gb25Db25uZWN0b3JNZXNzYWdlKG1zZywgZGF0YSkge1xuICAgIHZhciBkYXRhID0gZGF0YSA/IF8uY2xvbmUoZGF0YSkgOiB7fTtcbiAgICBfLmV4dGVuZChkYXRhLCB7XG4gICAgICAgIGlkOiB0aGlzLl9fX21pbmRlcl9pZCxcbiAgICAgICAgY29ubmVjdG9yOiB0aGlzXG4gICAgfSk7XG4gICAgbWluZGVyLnBvc3RNZXNzYWdlKG1zZywgZGF0YSk7XG4gICAgaWYgKCEgX3JlY2VpdmVkTWVzc2FnZXMubGVuZ3RoICYmICEgX2lzUHJvcGFnYXRpbmcpIHtcbiAgICAgICAgXy5kZWZlcihfaWRsZUNoZWNrKTtcbiAgICAgICAgX2lzUHJvcGFnYXRpbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIF9yZWNlaXZlZE1lc3NhZ2VzLnB1c2goeyBtc2c6IG1zZywgZGF0YTogZGF0YSB9KTtcbn1cblxuXG5mdW5jdGlvbiBfaWRsZUNoZWNrKCkge1xuICAgIGlmIChfcmVjZWl2ZWRNZXNzYWdlcy5sZW5ndGgpIHtcbiAgICAgICAgX3JlY2VpdmVkTWVzc2FnZXMubGVuZ3RoID0gMDtcbiAgICAgICAgXy5kZWZlcihfaWRsZUNoZWNrKTtcbiAgICAgICAgbWluZGVyLnBvc3RNZXNzYWdlKCdwcm9wYWdhdGlvbnRpY2tlZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIF9pc1Byb3BhZ2F0aW5nID0gZmFsc2U7XG4gICAgICAgIG1pbmRlci5wb3N0TWVzc2FnZSgncHJvcGFnYXRpb25jb21wbGV0ZWQnKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gbWluZGVyX2lzUHJvcGFnYXRpbmcoKSB7XG4gICAgcmV0dXJuIF9pc1Byb3BhZ2F0aW5nO1xufVxuXG5cbmZ1bmN0aW9uIG1pbmRlcl93aGVuUHJvcGFnYXRpb25Db21wbGV0ZWQoY2FsbGJhY2spIHtcbiAgICBpZiAoX2lzUHJvcGFnYXRpbmcpXG4gICAgICAgIG1pbmRlci5vbmNlKCdwcm9wYWdhdGlvbmNvbXBsZXRlZCcsIGV4ZWN1dGVDYWxsYmFjayk7XG4gICAgZWxzZVxuICAgICAgICBfLmRlZmVyKGV4ZWN1dGVDYWxsYmFjayk7XG5cbiAgICBmdW5jdGlvbiBleGVjdXRlQ2FsbGJhY2soKSB7XG4gICAgICAgIGlmIChfaXNQcm9wYWdhdGluZylcbiAgICAgICAgICAgIG1pbmRlci5vbmNlKCdwcm9wYWdhdGlvbmNvbXBsZXRlZCcsIGV4ZWN1dGVDYWxsYmFjayk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIG1pbmRlcl9nZXRDb25uZWN0b3JzKG9uT2ZmKSB7XG4gICAgaWYgKHR5cGVvZiBvbk9mZiA9PSAndW5kZWZpbmVkJylcbiAgICAgICAgcmV0dXJuIF9jb25uZWN0b3JzO1xuXG4gICAgcmV0dXJuIF9jb25uZWN0b3JzLmZpbHRlcihmdW5jdGlvbihjbmN0KSB7XG4gICAgICAgIHJldHVybiBjbmN0LmlzT24gPT09IG9uT2ZmO1xuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIG1pbmRlcl9kZXN0cm95Q29ubmVjdG9yKGNuY3QpIHtcbiAgICBjbmN0LmRlc3Ryb3koKTtcbiAgICB2YXIgaW5kZXggPSBfY29ubmVjdG9ycy5pbmRleE9mKGNuY3QpO1xuICAgIGlmIChpbmRleCA+PSAwKVxuICAgICAgICBkZWxldGUgX2Nvbm5lY3RvcnNbaW5kZXhdO1xuICAgIGVsc2VcbiAgICAgICAgbG9nZ2VyLndhcm4oJ21pbmRlcjogY29ubmVjdG9yIGRlc3Ryb3llZCB0aGF0IGlzIG5vdCByZWdpc3RlcmVkIGluIG1pbmRlcicpO1xufVxuXG5cbmZ1bmN0aW9uIG1pbmRlcl9nZXRFeHBhbmRlZENvbm5lY3Rpb25zKG9uT2ZmLCBzZWFyY2hTdHIpIHtcbiAgICB2YXIgY29ubmVjdG9ycyA9IG1pbmRlci5nZXRDb25uZWN0b3JzKG9uT2ZmKTtcbiAgICB2YXIgY29ubmVjdGlvbnMgPSAgY29ubmVjdG9ycy5tYXAoZnVuY3Rpb24oY25jdCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbiA9IHtcbiAgICAgICAgICAgIGxlZnRTb3VyY2U6IF9nZXRFeHBhbmRlZFNvdXJjZShjbmN0LmRzMSksXG4gICAgICAgICAgICByaWdodFNvdXJjZTogX2dldEV4cGFuZGVkU291cmNlKGNuY3QuZHMyKSxcbiAgICAgICAgICAgIG1vZGU6IGNuY3QubW9kZSxcbiAgICAgICAgICAgIGlzT246IGNuY3QuaXNPblxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgaWYgKGNuY3Qub3B0aW9ucylcbiAgICAgICAgICAgIGNvbm5lY3Rpb24ub3B0aW9ucyA9IGNuY3Qub3B0aW9ucztcblxuICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgICB9KTtcblxuICAgIGlmIChzZWFyY2hTdHIpXG4gICAgICAgIGNvbm5lY3Rpb25zID0gY29ubmVjdGlvbnMuZmlsdGVyKGZ1bmN0aW9uKGNuY3RuKSB7XG4gICAgICAgICAgICByZXR1cm4gX3NvdXJjZU1hdGNoZXNTdHJpbmcoY25jdG4ubGVmdFNvdXJjZSwgc2VhcmNoU3RyKVxuICAgICAgICAgICAgICAgICAgICB8fCBfc291cmNlTWF0Y2hlc1N0cmluZyhjbmN0bi5yaWdodFNvdXJjZSwgc2VhcmNoU3RyKTtcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gY29ubmVjdGlvbnM7XG59XG5cblxuZnVuY3Rpb24gX2dldEV4cGFuZGVkU291cmNlKGRzKSB7XG4gICAgdmFyIHNvdXJjZSA9IFtdO1xuICAgIGlmICh0eXBlb2YgZHMgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAoZHMuX21vZGVsICYmIGRzLl9hY2Nlc3NQYXRoKSB7XG4gICAgICAgICAgICBzb3VyY2UudW5zaGlmdChkcy5fYWNjZXNzUGF0aCk7XG4gICAgICAgICAgICBkcyA9IGRzLl9tb2RlbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHNvdXJjZS51bnNoaWZ0KGRzKTtcbiAgICAgICAgZHMgPSBkcy5faG9zdE9iamVjdDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRzID09ICdvYmplY3QnKSB7XG4gICAgICAgIHNvdXJjZS51bnNoaWZ0KGRzKTtcblxuICAgICAgICBpZiAoZHMub3duZXIpXG4gICAgICAgICAgICBzb3VyY2UudW5zaGlmdChkcy5vd25lcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvdXJjZTtcbn1cblxuXG5mdW5jdGlvbiBfc291cmNlTWF0Y2hlc1N0cmluZyhzb3VyY2UsIG1hdGNoU3RyKSB7XG4gICAgcmV0dXJuIHNvdXJjZS5zb21lKGZ1bmN0aW9uKHNyY05vZGUpIHtcbiAgICAgICAgdmFyIGNsYXNzTmFtZSA9IHNyY05vZGUuY29uc3RydWN0b3IgJiYgc3JjTm9kZS5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICByZXR1cm4gX3N0cmluZ01hdGNoKGNsYXNzTmFtZSwgbWF0Y2hTdHIpXG4gICAgICAgICAgICAgICAgfHwgX3N0cmluZ01hdGNoKHNyY05vZGUubmFtZSwgbWF0Y2hTdHIpXG4gICAgICAgICAgICAgICAgfHwgX3N0cmluZ01hdGNoKHNyY05vZGUsIG1hdGNoU3RyKTtcbiAgICB9KTtcbn1cblxuXG5mdW5jdGlvbiBfc3RyaW5nTWF0Y2goc3RyLCBzdWJzdHIpIHtcbiAgICByZXR1cm4gc3RyICYmIHR5cGVvZiBzdHIgPT0gJ3N0cmluZycgJiYgc3RyLmluZGV4T2Yoc3Vic3RyKSA+PSAwO1xufVxuXG5cbmZ1bmN0aW9uIG1pbmRlcl9kZXN0cm95KCkge1xuICAgIF9jb25uZWN0b3JzLmZvckVhY2goZnVuY3Rpb24oY25jdCkge1xuICAgICAgICBkZXN0cm95RFMoY25jdC5kczEpO1xuICAgICAgICBkZXN0cm95RFMoY25jdC5kczIpO1xuICAgICAgICBjbmN0LmRlc3Ryb3koKTtcbiAgICB9KTtcbiAgICBfbWVzc2VuZ2VyLmRlc3Ryb3koKTtcbiAgICBtaW5kZXIuX2Rlc3Ryb3llZCA9IHRydWU7XG5cbiAgICBmdW5jdGlvbiBkZXN0cm95RFMoZHMpIHtcbiAgICAgICAgaWYgKGRzICYmICFkcy5fZGVzdHJveWVkKSBkcy5kZXN0cm95KCk7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBsb2dnZXIgPSByZXF1aXJlKCcuLi91dGlsL2xvZ2dlcicpXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKVxuICAgICwgcGF0aFV0aWxzID0gcmVxdWlyZSgnLi9wYXRoX3V0aWxzJylcbiAgICAsIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKTtcblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIHByb2Nlc3MgXCJjaGFuZ2VkYXRhXCIgbWVzc2FnZXMgZW1pdHRlZCBieSBDb25uZWN0b3Igb2JqZWN0LlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGNoYW5nZURhdGFIYW5kbGVyO1xuXG5cbl8uZXh0ZW5kKGNoYW5nZURhdGFIYW5kbGVyLCB7XG4gICAgc2V0VHJhbnNhY3Rpb25GbGFnOiBzZXRUcmFuc2FjdGlvbkZsYWcsXG4gICAgZ2V0VHJhbnNhY3Rpb25GbGFnOiBnZXRUcmFuc2FjdGlvbkZsYWcsXG4gICAgcGFzc1RyYW5zYWN0aW9uRmxhZzogcGFzc1RyYW5zYWN0aW9uRmxhZyxcbiAgICBwb3N0VHJhbnNhY3Rpb25GaW5pc2hlZDogcG9zdFRyYW5zYWN0aW9uRmluaXNoZWRcbn0pO1xuXG5cbi8qKlxuICogQ2hhbmdlIGRhdGEgdXNlcyBoaWRkZW4gcHJvcGVydHkgb24gYWNjZXNzb3IgbWV0aG9kcyB0byBwYXNzIGZsYWcgdGhhdCB0aGUgYWNjZXNzb3IgaXMgZXhlY3V0ZWQgYXMgYSBwYXJ0IG9mIGNoYW5nZSB0cmFuc2FjdGlvbi5cbiAqIEFjY2Vzc29yIG1ldGhvZHMgYXJlIHN1cHBvc2VkIHRvIHN0b3JlIHRoaXMgZmxhZyBpbiBhIGxvY2FsIHZhcmlhYmxlIGFuZCB0byBjbGVhciBpdCAoYmVjYXVzZSBhbm90aGVyIGFjY2Vzc29yIGNhbiBiZSBleGVjdXRlZCBpbiBvciBvdXQgb2YgdHJhbnNhY3Rpb24pIHVzaW5nIGBnZXRUcmFuc2FjdGlvbkZsYWdgXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgYWNjZXNzb3IgbWV0aG9kIHJlZmVyZW5jZVxuICogQHBhcmFtIHtCb29sZWFufSBmbGFnIGEgZmxhZyB0byBiZSBzZXRcbiAqL1xuZnVuY3Rpb24gc2V0VHJhbnNhY3Rpb25GbGFnKGZ1bmMsIGZsYWcpIHtcbiAgICBfLmRlZmluZVByb3BlcnR5KGZ1bmMsICdfX2luQ2hhbmdlVHJhbnNhY3Rpb24nLCBmbGFnLCBfLkNPTkYgfCBfLldSSVQpO1xufVxuXG5cbi8qKlxuICogUmV0cmlldmVzIGFuZCBjbGVhcnMgdHJhbnNhY3Rpb24gZmxhZyBmcm9tIGFjY2Vzc29yIG1ldGhvZFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIGFjY2Vzc29yIG1ldGhvZCByZWZlcmVuY2VcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uRmxhZyhmdW5jKSB7XG4gICAgdmFyIGluVHJhbnNhY3Rpb24gPSBmdW5jLl9faW5DaGFuZ2VUcmFuc2FjdGlvbjtcbiAgICBkZWxldGUgZnVuYy5fX2luQ2hhbmdlVHJhbnNhY3Rpb247XG4gICAgcmV0dXJuIGluVHJhbnNhY3Rpb247XG59XG5cblxuZnVuY3Rpb24gcGFzc1RyYW5zYWN0aW9uRmxhZyhmcm9tRnVuYywgdG9GdW5jKSB7XG4gICAgdmFyIGluVHJhbnNhY3Rpb24gPSBnZXRUcmFuc2FjdGlvbkZsYWcoZnJvbUZ1bmMpO1xuICAgIHNldFRyYW5zYWN0aW9uRmxhZyh0b0Z1bmMsIGluVHJhbnNhY3Rpb24pO1xuICAgIHJldHVybiBpblRyYW5zYWN0aW9uO1xufVxuXG5cbi8qKlxuICogUG9zdHMgbWVzc2FnZSBvbiB0aGlzIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgdHJhbnNhY3Rpb24gdW5sZXNzIGBpbkNoYW5nZVRyYW5zYWN0aW9uYCBpcyBgdHJ1ZWAuXG4gKi9cbmZ1bmN0aW9uIHBvc3RUcmFuc2FjdGlvbkZpbmlzaGVkKCkge1xuICAgIHRoaXMucG9zdE1lc3NhZ2VTeW5jKCdkYXRhY2hhbmdlcycsIHsgdHJhbnNhY3Rpb246IGZhbHNlLCBjaGFuZ2VzOiBbXSB9KTtcbn1cblxuXG4vKipcbiAqIHN1YnNjcmliZXIgdG8gXCJjaGFuZ2VkYXRhXCIgZXZlbnQgZW1pdHRlZCBieSBbQ29ubmVjdG9yXSguL2Nvbm5lY3Rvci5qcy5odG1sKSBvYmplY3QgdG8gZW5hYmxlIHJlYWN0aXZlIGNvbm5lY3Rpb25zXG4gKiBVc2VkIGJ5IERhdGEgZmFjZXQsIE1vZGVsIGFuZCBNb2RlbFBhdGguIENhbiBiZSB1c2VkIGJ5IGFueSBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIGdldC9zZXQvZGVsL3NwbGljZSBhcGkgYW5kIHNldHMgZGF0YSBkZWVwbHkgdG8gdGhlIHdob2xlIHRyZWUuXG4gKiBPYmplY3Qgc2hvdWxkIGNhbGwgYGNoYW5nZURhdGFIYW5kbGVyLmluaXRpYWxpemUuY2FsbCh0aGlzKWAgaW4gaXRzIGNvbnN0cnVjdG9yLlxuICogVE9ETzogb3B0aW1pemUgbWVzc2FnZXMgbGlzdCB0byBhdm9pZCBzZXR0aW5nIGR1cGxpY2F0ZSB2YWx1ZXMgZG93biB0aGUgdHJlZVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgc2hvdWxkIGJlIFwiY2hhbmdlZGF0YVwiIGhlcmVcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIGJhdGNoIG9mIGRhdGEgY2hhbmdlIGRlc2NpcHRpb24gb2JqZWN0c1xuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgY2FsbGJhY2sgdG8gY2FsbCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBkYXRhIGlzIHByb2Nlc3NlZFxuICovXG5mdW5jdGlvbiBjaGFuZ2VEYXRhSGFuZGxlcihtZXNzYWdlLCBkYXRhLCBjYWxsYmFjaykge1xuICAgIHByb2Nlc3NDaGFuZ2VzLmNhbGwodGhpcywgZGF0YS5jaGFuZ2VzLCBjYWxsYmFjayk7XG59XG5cblxuLy8gbWFwIG9mIG1lc3NhZ2UgdHlwZXMgdG8gbWV0aG9kc1xudmFyIENIQU5HRV9UWVBFX1RPX01FVEhPRF9NQVAgPSB7XG4gICAgJ2FkZGVkJzogICAnc2V0JyxcbiAgICAnY2hhbmdlZCc6ICdzZXQnLFxuICAgICdkZWxldGVkJzogJ2RlbCcsXG4gICAgJ3JlbW92ZWQnOiAnZGVsJ1xufTtcblxuXG4vKipcbiAqIFByb2Nlc3NlcyBxdWV1ZWQgXCJjaGFuZ2VkYXRhXCIgbWVzc2FnZXMuXG4gKiBQb3N0cyBcImNoYW5nZXN0YXJ0ZWRcIiBhbmQgXCJjaGFuZ2Vjb21wbGV0ZWRcIiBtZXNzYWdlcyBhbmQgY2FsbHMgY2FsbGJhY2tcbiAqXG4gKiBAcGFyYW0ge1tGdW5jdGlvbl19IGNhbGxiYWNrIG9wdGlvbmFsIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIHdpdGggYChudWxsLCBmYWxzZSlgIHBhcmFtZXRlcnMgYmVmb3JlIGNoYW5nZSBwcm9jZXNzaW5nIHN0YXJ0cyBhbmQgYChudWxsLCB0cnVlKWAgYWZ0ZXIgaXQncyBmaW5pc2hlZC5cbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0NoYW5nZXModHJhbnNhY3Rpb24sIGNhbGxiYWNrKSB7XG4gICAgbm90aWZ5LmNhbGwodGhpcywgY2FsbGJhY2ssIGZhbHNlKTtcbiAgICBwcm9jZXNzVHJhbnNhY3Rpb24uY2FsbCh0aGlzLFxuICAgICAgICBwcmVwYXJlVHJhbnNhY3Rpb24oXG4gICAgICAgICAgICB2YWxpZGF0ZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSkpO1xuICAgIG5vdGlmeS5jYWxsKHRoaXMsIGNhbGxiYWNrLCB0cnVlKTtcbn1cblxuXG5mdW5jdGlvbiBub3RpZnkoY2FsbGJhY2ssIGNoYW5nZUZpbmlzaGVkKSB7XG4gICAgY2FsbGJhY2sgJiYgY2FsbGJhY2sobnVsbCwgY2hhbmdlRmluaXNoZWQpO1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoY2hhbmdlRmluaXNoZWQgPyAnY2hhbmdlY29tcGxldGVkJyA6ICdjaGFuZ2VzdGFydGVkJyk7XG59XG5cblxuLyoqXG4gKiBDaGVja3MgdGhhdCBhbGwgbWVzc2FnZXMgZnJvbSB0aGUgdHJhbnNhY3Rpb24gY29tZSBmcm9tIHRoZSBzYW1lIHNvdXJjZS5cbiAqIEhhY2s6IHJldmVyc2VzIHRoZSB0cmFuc2FjdGlvbiBpZiBpdCBjb21lcyBmcm9tIHRoZSBEYXRhIGZhY2V0XG4gKiBSZXR1cm5zIHRoZSByZWZlcmVuY2UgdG8gdGhlIHRyYW5zYWN0aW9uIChmb3IgY2hhaW5pbmcpXG4gKiBcbiAqIEBwYXJhbSAge0FycmF5fSB0cmFuc2FjdGlvbiB0cmFuc2FjdGlvbiBvZiBkYXRhIGNoYW5nZXNcbiAqIEByZXR1cm4ge0FycmF5fSBcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbikge1xuICAgIHZhciBzb3VyY2UgPSB0cmFuc2FjdGlvblswXS5zb3VyY2VcbiAgICAgICAgLCBzYW1lU291cmNlID0gdHJ1ZTtcblxuICAgIGlmICh0cmFuc2FjdGlvbi5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxLCBsZW4gPSB0cmFuc2FjdGlvbi5sZW5ndGg7IGkgPCBsZW47IGkrKylcbiAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvbltpXS5zb3VyY2UgIT0gc291cmNlKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdjaGFuZ2VkYXRhOiBjaGFuZ2VzIGZyb20gZGlmZmVyZW50IHNvdXJjZXMgaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24sIHNvdXJjZXM6JywgdHJhbnNhY3Rpb25baV0uc291cmNlLm5hbWUsIHNvdXJjZS5uYW1lKTtcbiAgICAgICAgICAgICAgICBzYW1lU291cmNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgc291cmNlID0gdHJhbnNhY3Rpb25baV0uc291cmNlO1xuICAgICAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cmFuc2FjdGlvbjtcbn1cblxuXG5mdW5jdGlvbiBwcmVwYXJlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pIHtcbiAgICB2YXIgdG9kbyA9IFtdXG4gICAgICAgICwgcGF0aHNUb1NwbGljZSA9IFtdXG4gICAgICAgICwgcGF0aHNUb0NoYW5nZSA9IFtdXG4gICAgICAgICwgaGFkU3BsaWNlXG4gICAgICAgICwgZXhpdExvb3AgPSB7fTtcblxuXG4gICAgdHJ5IHsgdHJhbnNhY3Rpb24uZm9yRWFjaChjaGVja0NoYW5nZSk7IH1cbiAgICBjYXRjaCAoZSkgeyBpZiAoZSAhPSBleGl0TG9vcCkgdGhyb3cgZTsgfVxuXG4gICAgcmV0dXJuIHRvZG87XG5cblxuICAgIGZ1bmN0aW9uIGNoZWNrQ2hhbmdlKGRhdGEpIHtcbiAgICAgICAgKGRhdGEudHlwZSA9PSAnc3BsaWNlJyA/IGNoZWNrU3BsaWNlIDogY2hlY2tNZXRob2QpKGRhdGEpO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gY2hlY2tTcGxpY2UoZGF0YSkge1xuICAgICAgICB2YXIgcGFyc2VkUGF0aCA9IHBhdGhVdGlscy5wYXJzZUFjY2Vzc1BhdGgoZGF0YS5wYXRoKTtcbiAgICAgICAgdmFyIHBhcmVudFBhdGhDaGFuZ2VkID0gcGF0aHNUb0NoYW5nZS5zb21lKGZ1bmN0aW9uKHBhcmVudFBhdGgpIHtcbiAgICAgICAgICAgIGlmIChwYXJzZWRQYXRoLmxlbmd0aCA8IHBhcmVudFBhdGgubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICAgICByZXR1cm4gX3BhdGhJc1BhcmVudE9mKHBhcmVudFBhdGgsIHBhcnNlZFBhdGgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocGFyZW50UGF0aENoYW5nZWQpIHJldHVybjtcblxuICAgICAgICB0b2RvLnB1c2goZGF0YSk7XG5cbiAgICAgICAgaWYgKCEgY29uZmlnLmRlYnVnKSB0aHJvdyBleGl0TG9vcDtcbiAgICAgICAgcGF0aHNUb1NwbGljZS5wdXNoKHBhcnNlZFBhdGgpO1xuICAgICAgICBoYWRTcGxpY2UgPSB0cnVlO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gY2hlY2tNZXRob2QoZGF0YSkge1xuICAgICAgICB2YXIgcGFyc2VkUGF0aCA9IHBhdGhVdGlscy5wYXJzZUFjY2Vzc1BhdGgoZGF0YS5wYXRoKTtcbiAgICAgICAgdmFyIHBhcmVudFBhdGhTcGxpY2VkID0gcGF0aHNUb1NwbGljZSAmJiBwYXRoc1RvU3BsaWNlLnNvbWUoZnVuY3Rpb24ocGFyZW50UGF0aCkge1xuICAgICAgICAgICAgaWYgKHBhcnNlZFBhdGgubGVuZ3RoIDw9IHBhcmVudFBhdGgubGVuZ3RoXG4gICAgICAgICAgICAgICAgfHwgcGFyc2VkUGF0aFtwYXJlbnRQYXRoLmxlbmd0aF0uc3ludGF4ICE9ICdhcnJheScpIHJldHVybjtcbiAgICAgICAgICAgIHJldHVybiBfcGF0aElzUGFyZW50T2YocGFyZW50UGF0aCwgcGFyc2VkUGF0aCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChwYXJlbnRQYXRoU3BsaWNlZCkgcmV0dXJuO1xuICAgICAgICBpZiAoaGFkU3BsaWNlKSBsb2dnZXIuZXJyb3IoJ2NoYW5nZWRhdGE6IGNoaWxkIGNoYW5nZSBpcyBleGVjdXRlZCBhZnRlciBzcGxpY2U7IHByb2JhYmx5IGRhdGEgc291cmNlIGRpZCBub3QgZW1pdCBtZXNzYWdlIHdpdGggZGF0YS50eXBlPT1cImZpbmlzaGVkXCInKTtcblxuICAgICAgICB2YXIgcGFyZW50UGF0aENoYW5nZWQgPSBwYXRoc1RvQ2hhbmdlLnNvbWUoZnVuY3Rpb24ocGFyZW50UGF0aCkge1xuICAgICAgICAgICAgaWYgKHBhcnNlZFBhdGgubGVuZ3RoIDw9IHBhcmVudFBhdGgubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICAgICByZXR1cm4gX3BhdGhJc1BhcmVudE9mKHBhcmVudFBhdGgsIHBhcnNlZFBhdGgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocGFyZW50UGF0aENoYW5nZWQpIHJldHVybjtcblxuICAgICAgICBwYXRoc1RvQ2hhbmdlLnB1c2gocGFyc2VkUGF0aCk7XG5cbiAgICAgICAgdG9kby5wdXNoKGRhdGEpO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gX3BhdGhJc1BhcmVudE9mKHBhcmVudFBhdGgsIGNoaWxkUGF0aCkge1xuICAgICAgICByZXR1cm4gcGFyZW50UGF0aC5ldmVyeShmdW5jdGlvbihwYXRoTm9kZSwgaW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoTm9kZS5wcm9wZXJ0eSA9PSBjaGlsZFBhdGhbaW5kZXhdLnByb3BlcnR5O1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gcHJvY2Vzc1RyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSB7XG4gICAgdHJhbnNhY3Rpb24uZm9yRWFjaChwcm9jZXNzQ2hhbmdlLCB0aGlzKTtcbiAgICBwb3N0VHJhbnNhY3Rpb25GaW5pc2hlZC5jYWxsKHRoaXMsIGZhbHNlKTtcblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NDaGFuZ2UoZGF0YSkge1xuICAgICAgICB2YXIgbW9kZWxQYXRoID0gdGhpcy5wYXRoKGRhdGEucGF0aCwgZGF0YS50eXBlICE9ICdyZW1vdmVkJyAmJiBkYXRhLnR5cGUgIT0gJ2RlbGV0ZWQnKTtcbiAgICAgICAgaWYgKCEgbW9kZWxQYXRoKSByZXR1cm47XG4gICAgICAgIChkYXRhLnR5cGUgPT0gJ3NwbGljZScgPyBleGVjdXRlU3BsaWNlIDogZXhlY3V0ZU1ldGhvZCkobW9kZWxQYXRoLCBkYXRhKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gZXhlY3V0ZVNwbGljZShtb2RlbFBhdGgsIGRhdGEpIHtcbiAgICB2YXIgaW5kZXggPSBkYXRhLmluZGV4XG4gICAgICAgICwgaG93TWFueSA9IGRhdGEucmVtb3ZlZC5sZW5ndGhcbiAgICAgICAgLCBzcGxpY2VBcmdzID0gW2luZGV4LCBob3dNYW55XTtcblxuICAgIHNwbGljZUFyZ3MgPSBzcGxpY2VBcmdzLmNvbmNhdChkYXRhLm5ld1ZhbHVlLnNsaWNlKGluZGV4LCBpbmRleCArIGRhdGEuYWRkZWRDb3VudCkpO1xuICAgIHNldFRyYW5zYWN0aW9uRmxhZyhtb2RlbFBhdGguc3BsaWNlLCB0cnVlKTtcbiAgICBtb2RlbFBhdGguc3BsaWNlLmFwcGx5KG1vZGVsUGF0aCwgc3BsaWNlQXJncyk7XG59XG5cblxuZnVuY3Rpb24gZXhlY3V0ZU1ldGhvZChtb2RlbFBhdGgsIGRhdGEpIHtcbiAgICB2YXIgbWV0aG9kTmFtZSA9IENIQU5HRV9UWVBFX1RPX01FVEhPRF9NQVBbZGF0YS50eXBlXTtcbiAgICBpZiAobWV0aG9kTmFtZSkge1xuICAgICAgICBzZXRUcmFuc2FjdGlvbkZsYWcobW9kZWxQYXRoW21ldGhvZE5hbWVdLCB0cnVlKTtcbiAgICAgICAgbW9kZWxQYXRoW21ldGhvZE5hbWVdKGRhdGEubmV3VmFsdWUpO1xuICAgIH0gZWxzZVxuICAgICAgICBsb2dnZXIuZXJyb3IoJ3Vua25vd24gZGF0YSBjaGFuZ2UgdHlwZScpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgTWVzc2VuZ2VyID0gcmVxdWlyZSgnLi4vbWVzc2VuZ2VyJylcbiAgICAsIHBhdGhVdGlscyA9IHJlcXVpcmUoJy4vcGF0aF91dGlscycpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJylcbiAgICAsIGxvZ2dlciA9IHJlcXVpcmUoJy4uL3V0aWwvbG9nZ2VyJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBDb25uZWN0b3I7XG5cblxudmFyIG1vZGVQYXR0ZXJuID0gL14oXFw8KilcXC0rKFxcPiopJC87XG5cblxuLyoqXG4gKiBDb25uZWN0b3JcbiAqIENsYXNzIHRoYXQgY3JlYXRlcyBjb25uZWN0b3Igb2JqZWN0IGZvciBkYXRhIGNvbm5lY3Rpb24gYmV0d2VlblxuICogdHdvIGRhdGEtc291cmNlc1xuICogRGF0YS1zb3VyY2VzIHNob3VsZCBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBBUEk6XG4gKiBnZXQoKSAtIGdldCB2YWx1ZSBmcm9tIGRhdGFzb3VyY2Ugb3IgaXRzIHBhdGhcbiAqIHNldCh2YWx1ZSkgLSBzZXQgdmFsdWUgdG8gZGF0YXNvdXJjZSBvciB0byBpdHMgcGF0aFxuICogb24ocGF0aCwgc3Vic2NyaWJlcikgLSBzdWJzY3JpcHRpb24gdG8gZGF0YSBjaGFuZ2VzIHdpdGggXCIqXCIgc3VwcG9ydFxuICogb2ZmKHBhdGgsIHN1YnNjcmliZXIpXG4gKiBwYXRoKGFjY2Vzc1BhdGgpIC0gdG8gcmV0dXJuIHRoZSBvYmplY3QgdGhhdCBnaXZlcyByZWZlcmVuY2UgdG8gc29tZSBwYXJ0IG9mIGRhdGFzb3VyY2VcbiAqIGFuZCBjb21wbGllcyB3aXRoIHRoYXQgYXBpIHRvby5cbiAqXG4gKiAjIyMjRXZlbnRzIyMjI1xuICpcbiAqIC0gJ3R1cm5lZG9uJyAtIGNvbm5lY3RvciB3YXMgdHVybmVkIG9uXG4gKiAtICd0dXJuZWRvZmYnIC0gY29ubmVjdG9yIHdhcyB0dXJuZWQgb2ZmXG4gKiAtICdjaGFuZ2VzdGFydGVkJyAtIGNoYW5nZSBvbiBjb25uZWN0ZWQgZGF0YXNvdXJjZSBpcyBzdGFydGVkXG4gKiAtICdjaGFuZ2Vjb21wbGV0ZWQnIC0gY2hhbmdlIG9uIGNvbm5lY3RlZCBkYXRhc291cmNlIGlzIGNvbXBsZXRlZFxuICogLSAnZGVzdHJveWVkJyAtIGNvbm5lY3RvciB3YXMgZGVzdHJveWVkXG4gKiBcbiAqIEBwYXJhbSB7T2JqZWN0fSBkczEgdGhlIGZpcnN0IGRhdGEgc291cmNlLlxuICogQHBhcmFtIHtTdHJpbmd9IG1vZGUgdGhlIGNvbm5lY3Rpb24gbW9kZSB0aGF0IGRlZmluZXMgdGhlIGRpcmVjdGlvbiBhbmQgdGhlIGRlcHRoIG9mIGNvbm5lY3Rpb24uIFBvc3NpYmxlIHZhbHVlcyBhcmUgJy0+JywgJzw8LScsICc8PDwtPj4+JywgZXRjLlxuICogQHBhcmFtIHtPYmplY3R9IGRzMiB0aGUgc2Vjb25kIGRhdGEgc291cmNlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBub3QgaW1wbGVtZW50ZWQgeWV0XG4gKiBAcmV0dXJuIHtDb25uZWN0b3J9IHdoZW4gY2FsbGVkIHdpdGggYG5ld2AsIGNyZWF0ZXMgYSBDb25uZWN0b3Igb2JqZWN0LlxuICovXG5mdW5jdGlvbiBDb25uZWN0b3IoZHMxLCBtb2RlLCBkczIsIG9wdGlvbnMpIHtcbiAgICBzZXR1cE1vZGUuY2FsbCh0aGlzLCBtb2RlKTtcblxuICAgIF8uZXh0ZW5kKHRoaXMsIHtcbiAgICAgICAgZHMxOiBkczEsXG4gICAgICAgIGRzMjogZHMyLFxuICAgICAgICBpc09uOiBmYWxzZSxcbiAgICAgICAgX2NoYW5nZXNRdWV1ZTE6IFtdLFxuICAgICAgICBfY2hhbmdlc1F1ZXVlMjogW10sXG4gICAgICAgIF9tZXNzZW5nZXI6IG5ldyBNZXNzZW5nZXIodGhpcywgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKVxuICAgIH0pO1xuXG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgICB2YXIgcGF0aFRyYW5zbGF0aW9uID0gb3B0aW9ucy5wYXRoVHJhbnNsYXRpb247XG4gICAgICAgIGlmIChwYXRoVHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgIHBhdGhUcmFuc2xhdGlvbiA9IF8uY2xvbmUocGF0aFRyYW5zbGF0aW9uKTtcbiAgICAgICAgICAgIHZhciBwYXR0ZXJuVHJhbnNsYXRpb24gPSBnZXRQYXR0ZXJuVHJhbnNsYXRpb25zKHBhdGhUcmFuc2xhdGlvbik7XG4gICAgICAgICAgICBfLmV4dGVuZCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcGF0aFRyYW5zbGF0aW9uMTogcmV2ZXJzZVRyYW5zbGF0aW9uUnVsZXMocGF0aFRyYW5zbGF0aW9uKSxcbiAgICAgICAgICAgICAgICBwYXRoVHJhbnNsYXRpb24yOiBwYXRoVHJhbnNsYXRpb24sXG4gICAgICAgICAgICAgICAgcGF0dGVyblRyYW5zbGF0aW9uMTogcmV2ZXJzZVBhdHRlcm5UcmFuc2xhdGlvblJ1bGVzKHBhdHRlcm5UcmFuc2xhdGlvbiksXG4gICAgICAgICAgICAgICAgcGF0dGVyblRyYW5zbGF0aW9uMjogcGF0dGVyblRyYW5zbGF0aW9uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkYXRhVHJhbnNsYXRpb24gPSBvcHRpb25zLmRhdGFUcmFuc2xhdGlvbjtcbiAgICAgICAgaWYgKGRhdGFUcmFuc2xhdGlvbikge1xuICAgICAgICAgICAgXy5leHRlbmQodGhpcywge1xuICAgICAgICAgICAgICAgIGRhdGFUcmFuc2xhdGlvbjE6IGRhdGFUcmFuc2xhdGlvblsnPC0nXSxcbiAgICAgICAgICAgICAgICBkYXRhVHJhbnNsYXRpb24yOiBkYXRhVHJhbnNsYXRpb25bJy0+J11cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRhdGFWYWxpZGF0aW9uID0gb3B0aW9ucy5kYXRhVmFsaWRhdGlvbjtcbiAgICAgICAgaWYgKGRhdGFWYWxpZGF0aW9uKSB7XG4gICAgICAgICAgICBfLmV4dGVuZCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgZGF0YVZhbGlkYXRpb24xOiBkYXRhVmFsaWRhdGlvblsnPC0nXSxcbiAgICAgICAgICAgICAgICBkYXRhVmFsaWRhdGlvbjI6IGRhdGFWYWxpZGF0aW9uWyctPiddXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudHVybk9uKCk7XG59XG5cblxuZnVuY3Rpb24gc2V0dXBNb2RlKG1vZGUpe1xuICAgIHZhciBwYXJzZWRNb2RlID0gbW9kZS5tYXRjaChtb2RlUGF0dGVybik7XG5cbiAgICBpZiAoISBwYXJzZWRNb2RlKVxuICAgICAgICBtb2RlUGFyc2VFcnJvcigpO1xuXG4gICAgdmFyIGRlcHRoMSA9IHBhcnNlZE1vZGVbMV0ubGVuZ3RoXG4gICAgICAgICwgZGVwdGgyID0gcGFyc2VkTW9kZVsyXS5sZW5ndGg7XG5cbiAgICBpZiAoZGVwdGgxICYmIGRlcHRoMiAmJiBkZXB0aDEgIT0gZGVwdGgyKVxuICAgICAgICBtb2RlUGFyc2VFcnJvcigpO1xuXG4gICAgaWYgKCEgZGVwdGgxICYmICEgZGVwdGgyKVxuICAgICAgICBtb2RlUGFyc2VFcnJvcigpO1xuXG4gICAgXy5leHRlbmQodGhpcywge1xuICAgICAgICBtb2RlOiBtb2RlLFxuICAgICAgICBkZXB0aDE6IGRlcHRoMSxcbiAgICAgICAgZGVwdGgyOiBkZXB0aDIsXG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBtb2RlUGFyc2VFcnJvcigpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIENvbm5lY3RvciBtb2RlOiAnICsgbW9kZSk7XG4gICAgfVxufVxuXG5cbl8uZXh0ZW5kUHJvdG8oQ29ubmVjdG9yLCB7XG4gICAgdHVybk9uOiBDb25uZWN0b3IkdHVybk9uLFxuICAgIHR1cm5PZmY6IENvbm5lY3RvciR0dXJuT2ZmLFxuICAgIGRlc3Ryb3k6IENvbm5lY3RvciRkZXN0cm95LFxuICAgIGNoYW5nZU1vZGU6IENvbm5lY3RvciRjaGFuZ2VNb2RlLFxuICAgIGRlZmVyQ2hhbmdlTW9kZTogQ29ubmVjdG9yJGRlZmVyQ2hhbmdlTW9kZVxufSk7XG5cbi8qKlxuICogRnVuY3Rpb24gY2hhbmdlIHRoZSBtb2RlIG9mIHRoZSBjb25uZWN0aW9uXG4gKlxuICogQHBhcmFtIEBwYXJhbSB7U3RyaW5nfSBtb2RlIHRoZSBjb25uZWN0aW9uIG1vZGUgdGhhdCBkZWZpbmVzIHRoZSBkaXJlY3Rpb24gYW5kIHRoZSBkZXB0aCBvZiBjb25uZWN0aW9uLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICctPicsICc8PC0nLCAnPDw8LT4+PicsIGV0Yy5cbiAqIEByZXR1cm4ge09iamVjdFtTdHJpbmddfVxuICovXG5mdW5jdGlvbiBDb25uZWN0b3IkY2hhbmdlTW9kZShtb2RlKSB7XG4gICAgdGhpcy50dXJuT2ZmKCk7XG4gICAgc2V0dXBNb2RlLmNhbGwodGhpcywgbW9kZSk7XG4gICAgdGhpcy50dXJuT24oKTtcbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIEZ1bmN0aW9uIGNoYW5nZSB0aGUgbW9kZSBvZiB0aGUgY29ubmVjdGlvblxuICpcbiAqIEBwYXJhbSBAcGFyYW0ge1N0cmluZ30gbW9kZSB0aGUgY29ubmVjdGlvbiBtb2RlIHRoYXQgZGVmaW5lcyB0aGUgZGlyZWN0aW9uIGFuZCB0aGUgZGVwdGggb2YgY29ubmVjdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZSAnLT4nLCAnPDwtJywgJzw8PC0+Pj4nLCBldGMuXG4gKiBAcmV0dXJuIHtPYmplY3RbU3RyaW5nXX1cbiAqL1xuZnVuY3Rpb24gQ29ubmVjdG9yJGRlZmVyQ2hhbmdlTW9kZShtb2RlKSB7XG4gICAgXy5kZWZlck1ldGhvZCh0aGlzLCAnY2hhbmdlTW9kZScsIG1vZGUpO1xuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogRnVuY3Rpb24gdGhhdCByZXZlcnNlcyB0cmFuc2xhdGlvbiBydWxlcyBmb3IgcGF0aHMgb2YgY29ubmVjdGVkIG9kYXRhIHNvdXJjZXNcbiAqXG4gKiBAcGFyYW0ge09iamVjdFtTdHJpbmddfSBydWxlcyBtYXAgb2YgcGF0aHMgZGVmaW5pbmcgdGhlIHRyYW5zbGF0aW9uIHJ1bGVzXG4gKiBAcmV0dXJuIHtPYmplY3RbU3RyaW5nXX1cbiAqL1xuZnVuY3Rpb24gcmV2ZXJzZVRyYW5zbGF0aW9uUnVsZXMocnVsZXMpIHtcbiAgICB2YXIgcmV2ZXJzZVJ1bGVzID0ge307XG4gICAgXy5lYWNoS2V5KHJ1bGVzLCBmdW5jdGlvbihwYXRoMl92YWx1ZSwgcGF0aDFfa2V5KSB7XG4gICAgICAgIHJldmVyc2VSdWxlc1twYXRoMl92YWx1ZV0gPSBwYXRoMV9rZXk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJldmVyc2VSdWxlcztcbn1cblxuXG5mdW5jdGlvbiBnZXRQYXR0ZXJuVHJhbnNsYXRpb25zKHBhdGhUcmFuc2xhdGlvbikge1xuICAgIHZhciBwYXR0ZXJuVHJhbnNsYXRpb24gPSBbXTtcbiAgICBfLmVhY2hLZXkocGF0aFRyYW5zbGF0aW9uLCBmdW5jdGlvbihwYXRoMl92YWx1ZSwgcGF0aDFfa2V5KSB7XG4gICAgICAgIHZhciBzdGFySW5kZXgxID0gcGF0aDFfa2V5LmluZGV4T2YoJyonKVxuICAgICAgICAgICAgLCBzdGFySW5kZXgyID0gcGF0aDJfdmFsdWUuaW5kZXhPZignKicpO1xuICAgICAgICBpZiAoc3RhckluZGV4MSA+PSAwICYmIHN0YXJJbmRleDIgPj0gMCkgeyAvLyBwYXR0ZXJuIHRyYW5zbGF0aW9uXG4gICAgICAgICAgICBpZiAocGF0aDFfa2V5LnNsaWNlKHN0YXJJbmRleDEpICE9IHBhdGgyX3ZhbHVlLnNsaWNlKHN0YXJJbmRleDIpKVxuICAgICAgICAgICAgICAgIF90aHJvd0ludmFsaWRUcmFuc2xhdGlvbihwYXRoMV9rZXksIHBhdGgyX3ZhbHVlKTtcbiAgICAgICAgICAgIGRlbGV0ZSBwYXRoVHJhbnNsYXRpb25bcGF0aDFfa2V5XTsgICAgICAgICAgICBcblxuICAgICAgICAgICAgcGF0dGVyblRyYW5zbGF0aW9uLnB1c2goe1xuICAgICAgICAgICAgICAgIGZyb21QYXR0ZXJuOiBwYXRoVXRpbHMuY3JlYXRlUmVnZXhQYXRoKHBhdGgxX2tleSksXG4gICAgICAgICAgICAgICAgZnJvbVN0YXRpY1BhdGg6IF9nZXRTdGF0aWNQYXRoKHBhdGgxX2tleSwgc3RhckluZGV4MSksXG4gICAgICAgICAgICAgICAgdG9QYXR0ZXJuOiBwYXRoVXRpbHMuY3JlYXRlUmVnZXhQYXRoKHBhdGgyX3ZhbHVlKSxcbiAgICAgICAgICAgICAgICB0b1N0YXRpY1BhdGg6IF9nZXRTdGF0aWNQYXRoKHBhdGgyX3ZhbHVlLCBzdGFySW5kZXgyKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhckluZGV4MSA+PSAwIHx8IHN0YXJJbmRleDIgPj0gMCkgLy8gcGF0dGVybiBvbmx5IG9uIG9uZSBzaWRlIG9mIHRyYW5zbGF0aW9uXG4gICAgICAgICAgICBfdGhyb3dJbnZhbGlkVHJhbnNsYXRpb24ocGF0aDFfa2V5LCBwYXRoMl92YWx1ZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcGF0dGVyblRyYW5zbGF0aW9uO1xuXG5cbiAgICBmdW5jdGlvbiBfdGhyb3dJbnZhbGlkVHJhbnNsYXRpb24ocGF0aDEsIHBhdGgyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYXR0ZXJuIHRyYW5zbGF0aW9uOiAnICsgcGF0aDEgKyAnLCAnICsgcGF0aDIpO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gX2dldFN0YXRpY1BhdGgocGF0aCwgc3RhckluZGV4KSB7XG4gICAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoL1tcXC5cXFtdP1xcKi4qJC8sICcnKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gcmV2ZXJzZVBhdHRlcm5UcmFuc2xhdGlvblJ1bGVzKHBhdHRlcm5UcmFuc2xhdGlvbikge1xuICAgIHJldHVybiBwYXR0ZXJuVHJhbnNsYXRpb24ubWFwKGZ1bmN0aW9uKHB0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmcm9tUGF0dGVybjogcHQudG9QYXR0ZXJuLFxuICAgICAgICAgICAgZnJvbVN0YXRpY1BhdGg6IHB0LnRvU3RhdGljUGF0aCxcbiAgICAgICAgICAgIHRvUGF0dGVybjogcHQuZnJvbVBhdHRlcm4sXG4gICAgICAgICAgICB0b1N0YXRpY1BhdGg6IHB0LmZyb21TdGF0aWNQYXRoXG4gICAgICAgIH07XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiB0dXJuT25cbiAqIE1ldGhvZCBvZiBDb25uZWN0b3IgdGhhdCBlbmFibGVzIGNvbm5lY3Rpb24gKGlmIGl0IHdhcyBwcmV2aW91c2x5IGRpc2FibGVkKVxuICovXG5mdW5jdGlvbiBDb25uZWN0b3IkdHVybk9uKCkge1xuICAgIGlmICh0aGlzLmlzT24pXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignZGF0YSBzb3VyY2VzIGFyZSBhbHJlYWR5IGNvbm5lY3RlZCcpO1xuXG4gICAgdmFyIHN1YnNjcmlwdGlvblBhdGggPSB0aGlzLl9zdWJzY3JpcHRpb25QYXRoID1cbiAgICAgICAgbmV3IEFycmF5KHRoaXMuZGVwdGgxIHx8IHRoaXMuZGVwdGgyKS5qb2luKCcqJyk7XG5cbiAgICB2YXIgc3Vic2NyaXB0aW9uUGF0dGVybiA9IHBhdGhVdGlscy5jcmVhdGVSZWdleFBhdGgoc3Vic2NyaXB0aW9uUGF0aCk7XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHRoaXMuZGVwdGgxKVxuICAgICAgICB0aGlzLl9saW5rMSA9IGxpbmtEYXRhU291cmNlKCdfbGluazInLCB0aGlzLmRzMiwgdGhpcy5kczEsIHRoaXMuX2NoYW5nZXNRdWV1ZTEsIHRoaXMucGF0aFRyYW5zbGF0aW9uMSwgdGhpcy5wYXR0ZXJuVHJhbnNsYXRpb24xLCB0aGlzLmRhdGFUcmFuc2xhdGlvbjEsIHRoaXMuZGF0YVZhbGlkYXRpb24xKTtcbiAgICBpZiAodGhpcy5kZXB0aDIpXG4gICAgICAgIHRoaXMuX2xpbmsyID0gbGlua0RhdGFTb3VyY2UoJ19saW5rMScsIHRoaXMuZHMxLCB0aGlzLmRzMiwgdGhpcy5fY2hhbmdlc1F1ZXVlMiwgdGhpcy5wYXRoVHJhbnNsYXRpb24yLCB0aGlzLnBhdHRlcm5UcmFuc2xhdGlvbjIsIHRoaXMuZGF0YVRyYW5zbGF0aW9uMiwgdGhpcy5kYXRhVmFsaWRhdGlvbjIpO1xuXG4gICAgdGhpcy5pc09uID0gdHJ1ZTtcbiAgICB0aGlzLnBvc3RNZXNzYWdlKCd0dXJuZWRvbicpO1xuXG5cbiAgICBmdW5jdGlvbiBsaW5rRGF0YVNvdXJjZShyZXZlcnNlTGluaywgZnJvbURTLCB0b0RTLCBjaGFuZ2VzUXVldWUsIHBhdGhUcmFuc2xhdGlvbiwgcGF0dGVyblRyYW5zbGF0aW9uLCBkYXRhVHJhbnNsYXRpb24sIGRhdGFWYWxpZGF0aW9uKSB7XG4gICAgICAgIGZyb21EUy5vblN5bmMoJ2RhdGFjaGFuZ2VzJywgb25EYXRhKTtcbiAgICAgICAgcmV0dXJuIG9uRGF0YTtcblxuICAgICAgICBmdW5jdGlvbiBvbkRhdGEobWVzc2FnZSwgYmF0Y2gpIHtcbiAgICAgICAgICAgIHZhciBzZW5kRGF0YSA9IHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VzOiBbXSxcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbjogYmF0Y2gudHJhbnNhY3Rpb25cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYmF0Y2guY2hhbmdlcy5mb3JFYWNoKGZ1bmN0aW9uKGNoYW5nZSkge1xuICAgICAgICAgICAgICAgIHZhciBzb3VyY2VQYXRoID0gY2hhbmdlLnBhdGhcbiAgICAgICAgICAgICAgICAgICAgLCB0YXJnZXRQYXRoID0gdHJhbnNsYXRlUGF0aChzb3VyY2VQYXRoKTtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0UGF0aCA9PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgdmFyIGNoYW5nZSA9IF8uY2xvbmUoY2hhbmdlKTtcbiAgICAgICAgICAgICAgICBfLmV4dGVuZChjaGFuZ2UsIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmcm9tRFMsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IHRhcmdldFBhdGhcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZURhdGEoc291cmNlUGF0aCwgY2hhbmdlKTtcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZURhdGEoc291cmNlUGF0aCwgY2hhbmdlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoISBjaGFuZ2VzUXVldWUubGVuZ3RoKVxuICAgICAgICAgICAgICAgIF8uZGVmZXIocG9zdENoYW5nZURhdGEpO1xuXG4gICAgICAgICAgICBjaGFuZ2VzUXVldWUucHVzaChzZW5kRGF0YSk7XG5cblxuICAgICAgICAgICAgZnVuY3Rpb24gdHJhbnNsYXRlUGF0aChzb3VyY2VQYXRoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhdGhUcmFuc2xhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdHJhbnNsYXRlZFBhdGggPSBwYXRoVHJhbnNsYXRpb25bc291cmNlUGF0aF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2xhdGVkUGF0aCkgcmV0dXJuIHRyYW5zbGF0ZWRQYXRoO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhdHRlcm5UcmFuc2xhdGlvbi5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHB0ID0gXy5maW5kKHBhdHRlcm5UcmFuc2xhdGlvbiwgZnVuY3Rpb24ocFRyYW5zbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcFRyYW5zbGF0aW9uLmZyb21QYXR0ZXJuLnRlc3Qoc291cmNlUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXB0KSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIHZhciB0cmFuc2xhdGVkUGF0aCA9IHNvdXJjZVBhdGgucmVwbGFjZShwdC5mcm9tU3RhdGljUGF0aCwgcHQudG9TdGF0aWNQYXRoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEgKChzdWJzY3JpcHRpb25QYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBzdWJzY3JpcHRpb25QYXR0ZXJuLnRlc3Qoc291cmNlUGF0aCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdWJzY3JpcHRpb25QYXR0ZXJuID09IHNvdXJjZVBhdGgpKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlZFBhdGggfHwgc291cmNlUGF0aDtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBmdW5jdGlvbiB0cmFuc2xhdGVEYXRhKHNvdXJjZVBhdGgsIGNoYW5nZSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhVHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRyYW5zbGF0ZSA9IGRhdGFUcmFuc2xhdGlvbltzb3VyY2VQYXRoXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zbGF0ZSAmJiB0eXBlb2YgdHJhbnNsYXRlID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZS5vbGRWYWx1ZSA9IHRyYW5zbGF0ZShjaGFuZ2Uub2xkVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlLm5ld1ZhbHVlID0gdHJhbnNsYXRlKGNoYW5nZS5uZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICBcbiAgICAgICAgICAgIGZ1bmN0aW9uIHZhbGlkYXRlRGF0YShzb3VyY2VQYXRoLCBjaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICBwcm9wYWdhdGVEYXRhKGNoYW5nZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZGF0YVZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbGlkYXRvcnMgPSBkYXRhVmFsaWRhdGlvbltzb3VyY2VQYXRoXVxuICAgICAgICAgICAgICAgICAgICAgICAgLCBwYXNzZWRDb3VudCA9IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICwgYWxyZWFkeUZhaWxlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0b3JzKVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5mb3JFYWNoKGNhbGxWYWxpZGF0b3IpOyAgIFxuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY2FsbFZhbGlkYXRvcih2YWxpZGF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yKGNoYW5nZS5uZXdWYWx1ZSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucGF0aCA9IHNvdXJjZVBhdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBhbHJlYWR5RmFpbGVkICYmIChlcnIgfHwgcmVzcG9uc2UudmFsaWQpICYmICsrcGFzc2VkQ291bnQgPT0gdmFsaWRhdG9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tRFMucG9zdE1lc3NhZ2UoJ3ZhbGlkYXRlZCcsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoISByZXNwb25zZS52YWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHlGYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21EUy5wb3N0TWVzc2FnZSgndmFsaWRhdGVkJywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgZnVuY3Rpb24gcHJvcGFnYXRlRGF0YShjaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICBzZW5kRGF0YS5jaGFuZ2VzLnB1c2goY2hhbmdlKTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBmdW5jdGlvbiBwb3N0Q2hhbmdlRGF0YSgpIHtcbiAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGVuZGxlc3MgbG9vcCBvZiB1cGRhdGVzIGZvciAyLXdheSBjb25uZWN0aW9uXG4gICAgICAgICAgICAgICAgaWYgKHNlbGZbcmV2ZXJzZUxpbmtdKSB2YXIgY2FsbGJhY2sgPSBzdWJzY3JpcHRpb25Td2l0Y2g7XG5cbiAgICAgICAgICAgICAgICB2YXIgdHJhbnNhY3Rpb25zID0gbWVyZ2VUcmFuc2FjdGlvbnMoY2hhbmdlc1F1ZXVlKTtcbiAgICAgICAgICAgICAgICBjaGFuZ2VzUXVldWUubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMuZm9yRWFjaChmdW5jdGlvbih0cmFuc2FjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIGRhdGEgY2hhbmdlIGluc3RydWN0aW9uIGFzIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgdG9EUy5wb3N0TWVzc2FnZVN5bmMoJ2NoYW5nZWRhdGEnLCB7IGNoYW5nZXM6IHRyYW5zYWN0aW9uIH0sIGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBmdW5jdGlvbiBzdWJzY3JpcHRpb25Td2l0Y2goZXJyLCBjaGFuZ2VGaW5pc2hlZCkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHJldHVybjtcbiAgICAgICAgICAgICAgICB2YXIgb25PZmYgPSBjaGFuZ2VGaW5pc2hlZCA/ICdvblN5bmMnIDogJ29mZic7XG4gICAgICAgICAgICAgICAgdG9EU1tvbk9mZl0oJ2RhdGFjaGFuZ2VzJywgc2VsZltyZXZlcnNlTGlua10pO1xuXG4gICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBjaGFuZ2VGaW5pc2hlZCA/ICdjaGFuZ2Vjb21wbGV0ZWQnIDogJ2NoYW5nZXN0YXJ0ZWQnO1xuICAgICAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UobWVzc2FnZSwgeyBzb3VyY2U6IGZyb21EUywgdGFyZ2V0OiB0b0RTIH0pO1xuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIG1lcmdlVHJhbnNhY3Rpb25zKGJhdGNoZXMpIHtcbiAgICAgICAgICAgICAgICB2YXIgdHJhbnNhY3Rpb25zID0gW11cbiAgICAgICAgICAgICAgICAgICAgLCBjdXJyZW50VHJhbnNhY3Rpb247XG5cbiAgICAgICAgICAgICAgICBiYXRjaGVzLmZvckVhY2goZnVuY3Rpb24oYmF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEgYmF0Y2gudHJhbnNhY3Rpb24pIGN1cnJlbnRUcmFuc2FjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEgYmF0Y2guY2hhbmdlcy5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYmF0Y2gudHJhbnNhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VHJhbnNhY3Rpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5hcHBlbmRBcnJheShjdXJyZW50VHJhbnNhY3Rpb24sIGJhdGNoLmNoYW5nZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRyYW5zYWN0aW9uID0gXy5jbG9uZShiYXRjaC5jaGFuZ2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMucHVzaChjdXJyZW50VHJhbnNhY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9ucy5wdXNoKGJhdGNoLmNoYW5nZXMpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zYWN0aW9ucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG4vKipcbiAqIHR1cm5PZmZcbiAqIE1ldGhvZCBvZiBDb25uZWN0b3IgdGhhdCBkaXNhYmxlcyBjb25uZWN0aW9uIChpZiBpdCB3YXMgcHJldmlvdXNseSBlbmFibGVkKVxuICovXG5mdW5jdGlvbiBDb25uZWN0b3IkdHVybk9mZigpIHtcbiAgICBpZiAoISB0aGlzLmlzT24pXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignZGF0YSBzb3VyY2VzIGFyZSBhbHJlYWR5IGRpc2Nvbm5lY3RlZCcpO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHVubGlua0RhdGFTb3VyY2UodGhpcy5kczEsICdfbGluazInLCB0aGlzLnBhdGhUcmFuc2xhdGlvbjIpO1xuICAgIHVubGlua0RhdGFTb3VyY2UodGhpcy5kczIsICdfbGluazEnLCB0aGlzLnBhdGhUcmFuc2xhdGlvbjEpO1xuXG4gICAgdGhpcy5pc09uID0gZmFsc2U7XG4gICAgdGhpcy5wb3N0TWVzc2FnZSgndHVybmVkb2ZmJyk7XG5cblxuICAgIGZ1bmN0aW9uIHVubGlua0RhdGFTb3VyY2UoZnJvbURTLCBsaW5rTmFtZSwgcGF0aFRyYW5zbGF0aW9uKSB7XG4gICAgICAgIGlmIChzZWxmW2xpbmtOYW1lXSkge1xuICAgICAgICAgICAgZnJvbURTLm9mZignZGF0YWNoYW5nZXMnLCBzZWxmW2xpbmtOYW1lXSk7XG4gICAgICAgICAgICBkZWxldGUgc2VsZltsaW5rTmFtZV07XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLyoqXG4gKiBEZXN0cm95cyBjb25uZWN0b3Igb2JqZWN0IGJ5IHR1cm5pbmcgaXQgb2ZmIGFuZCByZW1vdmluZyByZWZlcmVuY2VzIHRvIGNvbm5lY3RlZCBzb3VyY2VzXG4gKi9cbmZ1bmN0aW9uIENvbm5lY3RvciRkZXN0cm95KCkge1xuICAgIHRoaXMudHVybk9mZigpO1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoJ2Rlc3Ryb3llZCcpO1xuICAgIHRoaXMuX21lc3Nlbmdlci5kZXN0cm95KCk7XG4gICAgZGVsZXRlIHRoaXMuZHMxO1xuICAgIGRlbGV0ZSB0aGlzLmRzMjtcbiAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgTW9kZWxQYXRoID0gcmVxdWlyZSgnLi9tX3BhdGgnKVxuICAgICwgc3ludGhlc2l6ZSA9IHJlcXVpcmUoJy4vc3ludGhlc2l6ZScpXG4gICAgLCBwYXRoVXRpbHMgPSByZXF1aXJlKCcuL3BhdGhfdXRpbHMnKVxuICAgICwgbW9kZWxVdGlscyA9IHJlcXVpcmUoJy4vbW9kZWxfdXRpbHMnKVxuICAgICwgY2hhbmdlRGF0YUhhbmRsZXIgPSByZXF1aXJlKCcuL2NoYW5nZV9kYXRhJylcbiAgICAsIE1lc3NlbmdlciA9IHJlcXVpcmUoJy4uL21lc3NlbmdlcicpXG4gICAgLCBNZXNzZW5nZXJNZXNzYWdlU291cmNlID0gcmVxdWlyZSgnLi4vbWVzc2VuZ2VyL21zbmdyX3NvdXJjZScpXG4gICAgLCBNb2RlbE1zZ0FQSSA9IHJlcXVpcmUoJy4vbV9tc2dfYXBpJylcbiAgICAsIE1peGluID0gcmVxdWlyZSgnLi4vYWJzdHJhY3QvbWl4aW4nKVxuICAgICwgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpXG4gICAgLCBjaGVjayA9IHJlcXVpcmUoJy4uL3V0aWwvY2hlY2snKVxuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaFxuICAgICwgbG9nZ2VyID0gcmVxdWlyZSgnLi4vdXRpbC9sb2dnZXInKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IE1vZGVsO1xuXG5cbi8qKlxuICogYG1pbG8uTW9kZWxgXG4gKiBNb2RlbCBjbGFzcyBpbnN0YW50aWF0ZXMgb2JqZWN0cyB0aGF0IGFsbG93IGRlZXAgZGF0YSBhY2Nlc3Mgd2l0aCBfX3NhZmUgZ2V0dGVyc19fIHRoYXQgcmV0dXJuIHVuZGVmaW5lZCAocmF0aGVyIHRoYW4gdGhyb3dpbmcgZXhjZXB0aW9uKSB3aGVuIHByb3BlcnRpZXMvaXRlbXMgb2YgdW5leGlzdGluZyBvYmplY3RzL2FycmF5cyBhcmUgcmVxdWVzdGVkIGFuZCBfX3NhZmUgc2V0dGVyc19fIHRoYXQgY3JlYXRlIG9iamVjdCB0cmVlcyB3aGVuIHByb3BlcnRpZXMvaXRlbXMgb2YgdW5leGlzdGluZyBvYmplY3RzL2FycmF5cyBhcmUgc2V0IGFuZCBhbHNvIHBvc3QgbWVzc2FnZXMgdG8gYWxsb3cgc3Vic2NyaXB0aW9uIG9uIGNoYW5nZXMgYW5kIGVuYWJsZSBkYXRhIHJlYWN0aXZpdHkuXG4gKiBSZWFjdGl2aXR5IGlzIGltcGxlbWVtbnRlZCB2aWEgW0Nvbm5lY3Rvcl0oLi9jb25uZWN0b3IuanMuaHRtbCkgdGhhdCBjYW4gYmUgaW5zdGFudGlhdGVkIGVpdGhlciBkaXJlY3RseSBvciB3aXRoIG1vcmUgY29udmVuaWVudCBpbnRlcmZhY2Ugb2YgW21pbG8ubWluZGVyXSguLi9taW5kZXIuanMuaHRtbCkuIEF0IHRoZSBtb21lbnQgbW9kZWwgY2FuIGJlIGNvbm5lY3RlZCB0byBbRGF0YSBmYWNldF0oLi4vY29tcG9uZW50cy9jX2ZhY2V0cy9EYXRhLmpzLmh0bWwpIG9yIHRvIGFub3RoZXIgbW9kZWwgb3IgW01vZGVsUGF0aF0oLi9tX3BhdGguanMuaHRtbCkuXG4gKiBNb2RlbCBjb25zdHJ1Y3RvciByZXR1cm5zIG9iamVjdHMgdGhhdCBhcmUgZnVuY3Rpb25zIGF0IHRoZSBzYW1lIHRpbWU7IHdoZW4gY2FsbGVkIHRoZXkgcmV0dXJuIE1vZGVsUGF0aCBvYmplY3RzIHRoYXQgYWxsb3cgZ2V0L3NldCBhY2Nlc3MgdG8gYW55IHBvaW50IGluIG1vZGVsIGRhdGEuIFNlZSBbTW9kZWxEYXRhXSgjTW9kZWxEYXRhKSBiZWxvdy5cbiAqXG4gKiBZb3UgY2FuIHN1YnNjcmliZSB0byBtb2RlbCBjaGFuZ2VzIHdpdGggYG9uYCBtZXRob2QgYnkgcGFzc2luZyBtb2RlbCBhY2Nlc3MgcGF0aCBpbiBwbGFjZSBvZiBtZXNzYWdlLCBwYXR0ZXJuIG9yIHN0cmluZyB3aXRoIGFueSBudW1iZXIgb2Ygc3RhcnMgdG8gc3Vic2NyaWJlIHRvIGEgY2VydGFpbiBkZXB0aCBpbiBtb2RlbCAoZS5nLiwgYCcqKionYCB0byBzdWJzY3JpYmUgdG8gdGhyZWUgbGV2ZWxzKS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBkYXRhIG9wdGlvbmFsIGluaXRpYWwgYXJyYXkgZGF0YS4gSWYgaXQgaXMgcGxhbm5lZCB0byBjb25uZWN0IG1vZGVsIHRvIHZpZXcgaXQgaXMgdXN1YWxseSBiZXR0ZXIgdG8gaW5zdGFudGlhdGUgYW4gZW1wdHkgTW9kZWwgKGB2YXIgbSA9IG5ldyBNb2RlbGApLCBjb25uZWN0IGl0IHRvIFtDb21wb25lbnRdKC4uL2NvbXBvbmVudHMvY19jbGFzcy5qcy5odG1sKSdzIFtEYXRhIGZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXRzL0RhdGEuanMuaHRtbCkgKGUuZy4sIGBtaWxvLm1pbmRlcihtLCAnPDwtPj4nLCBjLmRhdGEpO2ApIGFuZCB0aGVuIHNldCB0aGUgbW9kZWwgd2l0aCBgbS5zZXQoZGF0YSlgIC0gdGhlIHZpZXcgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gaG9zdE9iamVjdCBvcHRpb25hbCBvYmplY3QgdGhhdCBob3N0cyBtb2RlbCBvbiBvbmUgb2YgaXRzIHByb3BlcnRpZXMuIENhbiBiZSB1c2VkIHdoZW4gbW9kZWwgaXRzZWxmIGlzIHRoZSBjb250ZXh0IG9mIHRoZSBtZXNzYWdlIHN1YnNjcmliZXIgYW5kIHlvdSBuZWVkIHRvIHRyYXZlcnMgdG8gdGhpcyBvYmplY3QgKGFsdGhvdWdoIGl0IGlzIHBvc3NpYmxlIHRvIHNldCBhbnkgY29udGV4dCkuIENhbiBhbHNvIGJlIHVzZWQgdG8gcHJveHkgbW9kZWwncyBtZXRob2RzIHRvIHRoZSBob3N0IGxpa2UgW01vZGVsIGZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXRzL01vZGVsRmFjZXQuanMuaHRtbCkgaXMgZG9pbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBwYXNzIHsgcmVhY3RpdmU6IGZhbHNlIH0gdG8gdXNlIG1vZGVsIHdpdGhvdXQgbWVzc2FnaW5nIHdoZW4gaXQgaXMgbm90IG5lZWRlZCAtIGl0IG1ha2VzIGl0IG11Y2ggZmFzdGVyXG4gKiBAcmV0dXJuIHtNb2RlbH1cbiAqL1xuZnVuY3Rpb24gTW9kZWwoZGF0YSwgaG9zdE9iamVjdCwgb3B0aW9ucykge1xuICAgIC8vIGBtb2RlbGAgd2lsbCBiZSByZXR1cm5lZCBieSBjb25zdHJ1Y3RvciBpbnN0ZWFkIG9mIGB0aGlzYC4gYG1vZGVsYFxuICAgIC8vIChgbW9kZWxQYXRoYCBmdW5jdGlvbikgc2hvdWxkIHJldHVybiBhIE1vZGVsUGF0aCBvYmplY3Qgd2l0aCBcInN5bnRoZXNpemVkXCIgbWV0aG9kc1xuICAgIC8vIHRvIGdldC9zZXQgbW9kZWwgcHJvcGVydGllcywgdG8gc3Vic2NyaWJlIHRvIHByb3BlcnR5IGNoYW5nZXMsIGV0Yy5cbiAgICAvLyBBZGRpdGlvbmFsIGFyZ3VtZW50cyBvZiBtb2RlbFBhdGggY2FuIGJlIHVzZWQgaW4gdGhlIHBhdGggdXNpbmcgaW50ZXJwb2xhdGlvbiAtIHNlZSBNb2RlbFBhdGggYmVsb3cuXG4gICAgdmFyIG1vZGVsID0gZnVuY3Rpb24gbW9kZWxQYXRoKGFjY2Vzc1BhdGgpIHsgLy8gLCAuLi4gYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBpbnRlcnBvbGF0ZWRcbiAgICAgICAgcmV0dXJuIE1vZGVsJHBhdGguYXBwbHkobW9kZWwsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICBtb2RlbC5fX3Byb3RvX18gPSBNb2RlbC5wcm90b3R5cGU7XG5cbiAgICBtb2RlbC5faG9zdE9iamVjdCA9IGhvc3RPYmplY3Q7XG4gICAgbW9kZWwuX29wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgaWYgKG1vZGVsLl9vcHRpb25zLnJlYWN0aXZlICE9PSBmYWxzZSkge1xuICAgICAgICBtb2RlbC5fcHJlcGFyZU1lc3NlbmdlcnMoKTtcbiAgICAgICAgLy8gc3Vic2NyaWJlIHRvIFwiY2hhbmdlZGF0YVwiIG1lc3NhZ2UgdG8gZW5hYmxlIHJlYWN0aXZlIGNvbm5lY3Rpb25zXG4gICAgICAgIG1vZGVsLm9uU3luYygnY2hhbmdlZGF0YScsIGNoYW5nZURhdGFIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSkgbW9kZWwuX2RhdGEgPSBkYXRhO1xuXG4gICAgcmV0dXJuIG1vZGVsO1xufVxuXG5Nb2RlbC5wcm90b3R5cGUuX19wcm90b19fID0gTW9kZWwuX19wcm90b19fO1xuXG5cbi8qKlxuICogIyMjI01vZGVsIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbcGF0aF0oI3BhdGgpIC0gcmV0dXJucyBNb2RlbFBhdGggb2JqZWN0IHRoYXQgYWxsb3dzIGFjY2VzcyB0byBhbnkgcG9pbnQgaW4gTW9kZWxcbiAqIC0gW2dldF0oI01vZGVsJGdldCkgLSBnZXQgbW9kZWwgZGF0YVxuICogLSBzZXQgLSBzZXQgbW9kZWwgZGF0YSwgc3ludGhlc2l6ZWRcbiAqIC0gc3BsaWNlIC0gc3BsaWNlIG1vZGVsIGRhdGEgKGFzIGFycmF5IG9yIHBzZXVkby1hcnJheSksIHN5bnRoZXNpemVkXG4gKiAtIFtsZW5dKC4vbV9wYXRoLmpzLmh0bWwjTW9kZWxQYXRoJGxlbikgLSByZXR1cm5zIGxlbmd0aCBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KSBpbiBtb2RlbCBpbiBzYWZlIHdheSwgMCBpZiBubyBsZW5ndGggaXMgc2V0XG4gKiAtIFtwdXNoXSguL21fcGF0aC5qcy5odG1sI01vZGVsUGF0aCRwdXNoKSAtIGFkZCBpdGVtcyB0byB0aGUgZW5kIG9mIGFycmF5IChvciBwc2V1ZG8tYXJyYXkpIGluIG1vZGVsXG4gKiAtIFtwb3BdKC4vbV9wYXRoLmpzLmh0bWwjTW9kZWxQYXRoJHBvcCkgLSByZW1vdmUgaXRlbSBmcm9tIHRoZSBlbmQgb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkgaW4gbW9kZWxcbiAqIC0gW3Vuc2hpZnRdKC4vbV9wYXRoLmpzLmh0bWwjTW9kZWxQYXRoJHVuc2hpZnQpIC0gYWRkIGl0ZW1zIHRvIHRoZSBiZWdpbm5pbmcgb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkgaW4gbW9kZWxcbiAqIC0gW3NoaWZ0XSguL21fcGF0aC5qcy5odG1sI01vZGVsUGF0aCRzaGlmdCkgLSByZW1vdmUgaXRlbSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkgaW4gbW9kZWxcbiAqIC0gW3Byb3h5TWVzc2VuZ2VyXSgjcHJveHlNZXNzZW5nZXIpIC0gcHJveHkgbW9kZWwncyBNZXNzZW5nZXIgbWV0aG9kcyB0byBob3N0IG9iamVjdFxuICogLSBbcHJveHlNZXRob2RzXSgjcHJveHlNZXRob2RzKSAtIHByb3h5IG1vZGVsIG1ldGhvZHMgdG8gaG9zdCBvYmplY3RcbiAqL1xuXy5leHRlbmRQcm90byhNb2RlbCwge1xuICAgIHBhdGg6IE1vZGVsJHBhdGgsXG4gICAgZ2V0OiBNb2RlbCRnZXQsXG4gICAgcHJveHlNZXNzZW5nZXI6IHByb3h5TWVzc2VuZ2VyLCAvLyBkZXByZWNhdGVkLCBzaG91bGQgbm90IGJlIHVzZWRcbiAgICBwcm94eU1ldGhvZHM6IHByb3h5TWV0aG9kcyxcbiAgICBfcHJlcGFyZU1lc3NlbmdlcnM6IF9wcmVwYXJlTWVzc2VuZ2VycyxcbiAgICBfZ2V0SG9zdE9iamVjdDogX2dldEhvc3RPYmplY3QsXG4gICAgZGVzdHJveTogTW9kZWwkZGVzdHJveVxufSk7XG5cbi8vIHNldCwgZGVsLCBzcGxpY2UgYXJlIGFkZGVkIHRvIG1vZGVsXG5fLmV4dGVuZFByb3RvKE1vZGVsLCBzeW50aGVzaXplLm1vZGVsTWV0aG9kcyk7XG5cblxuLyoqXG4gKiAtIFBhdGg6IE1vZGVsUGF0aCBjbGFzcyBhcyBgbWlsby5Nb2RlbC5QYXRoYFxuICovXG5fLmV4dGVuZChNb2RlbCwge1xuICAgIFBhdGg6IE1vZGVsUGF0aCxcbiAgICB1c2VXaXRoOiBNb2RlbCQkdXNlV2l0aCxcbiAgICBfdXRpbHM6IHtcbiAgICAgICAgcGF0aDogcGF0aFV0aWxzLFxuICAgICAgICBtb2RlbDogbW9kZWxVdGlscyxcbiAgICAgICAgY2hhbmdlRGF0YUhhbmRsZXI6IGNoYW5nZURhdGFIYW5kbGVyXG4gICAgfVxufSk7XG5cblxuLyoqXG4gKiBFeHBvc2UgTWVzc2VuZ2VyIG1ldGhvZHMgb24gRmFjZXQgcHJvdG90eXBlXG4gKi9cbnZhciBNRVNTRU5HRVJfUFJPUEVSVFkgPSAnX21lc3Nlbmdlcic7XG5NZXNzZW5nZXIudXNlV2l0aChNb2RlbCwgTUVTU0VOR0VSX1BST1BFUlRZLCBNZXNzZW5nZXIuZGVmYXVsdE1ldGhvZHMpO1xuXG5cbi8qKlxuICogTW9kZWxQYXRoIG1ldGhvZHMgYWRkZWQgdG8gTW9kZWwgcHJvdG90eXBlXG4gKi9cblsnbGVuJywgJ3B1c2gnLCAncG9wJywgJ3Vuc2hpZnQnLCAnc2hpZnQnXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICB2YXIgbWV0aG9kID0gTW9kZWxQYXRoLnByb3RvdHlwZVttZXRob2ROYW1lXTtcbiAgICBfLmRlZmluZVByb3BlcnR5KE1vZGVsLnByb3RvdHlwZSwgbWV0aG9kTmFtZSwgbWV0aG9kKTtcbn0pO1xuXG5cbi8qKlxuICogTW9kZWwgaW5zdGFuY2UgbWV0aG9kLlxuICogR2V0IG1vZGVsIGRhdGEuXG4gKlxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiBNb2RlbCRnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG59XG5cblxuLyoqXG4gKiBNb2RlbCBpbnN0YW5jZSBtZXRob2QuXG4gKiBSZXR1cm5zIE1vZGVsUGF0aCBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSBzYW1lIEFQSSBhcyBtb2RlbCBidXQgYWxsb3dzIGFjY2VzcyB0byBhbnkgcG9pbnQgaW5zaWRlIG1vZGVsIGFzIGRlZmluZWQgYnkgYGFjY2Vzc1BhdGhgLlxuICogU2VlIFtNb2RlbFBhdGhdKC4vbV9wYXRoLmpzLmh0bWwpIGNsYXNzIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY2Nlc3NQYXRoIHN0cmluZyB0aGF0IGRlZmluZXMgcGF0aCB0byBhY2Nlc3MgbW9kZWwuXG4gKiAgUGF0aCBzdHJpbmcgY29uc2lzdHMgb2YgcGFydHMgdG8gZGVmaW5lIGVpdGhlciBwcm9wZXJ0eSBhY2Nlc3MgKGBcIi5uYW1lXCJgIHRvIGFjY2VzcyBwcm9wZXJ0eSBuYW1lKSBvciBhcnJheSBpdGVtIGFjY2VzcyAoYFwiWzFdXCJgIHRvIGFjY2VzcyBpdGVtIHdpdGggaW5kZXggMSkuXG4gKiAgQWNjZXNzIHBhdGggY2FuIGNvbnRhaW4gYXMgbWFueSBwYXJ0cyBhcyBuZWNlc3NhcnkgKGUuZy4gYFwiLmxpc3RbMF0ubmFtZVwiYCB0byBhY2Nlc3MgcHJvcGVydHkgYG5hbWVgIGluIHRoZSBmaXJzdCBlbGVtZW50IG9mIGFycmF5IHN0b3JlZCBpbiBwcm9wZXJ0eSBgbGlzdGAuXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBvZiB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgaW50ZXJwb2xhdGVkIHBhdGhzLlxuICogIEUuZy4gYG0ucGF0aChcIlskMV0uJDJcIiwgaWQsIHByb3ApYCByZXR1cm5zIE1vZGVsUGF0aCB0byBhY2Nlc3MgcHJvcGVydHkgd2l0aCBuYW1lIGBwcm9wYCBpbiBhcnJheSBpdGVtIHdpdGggaW5kZXggYGlkYC4gQWx0aG91Z2ggdGhpcyBNb2RlbFBhdGggb2JqZWN0IHdpbGwgd29yayBleGFjdGx5IGFzIGBtKFwiW1wiICsgaWQgKyBcIl0uXCIgKyBwcm9wKWAsIHRoZSBpbnRlcnBvbGF0ZWQgaXMgbXVjaCBtb3JlIGVmZmljaWVudCBhcyBNb2RlbFBhdGggd2l0aCBpbnRlcnBvbGF0aW9uIHdpbGwgbm90IHN5bnRoZXNpemUgbmV3IGdldHRlcnMgYW5kIHNldHRlcnMsIHdoaWxlIE1vZGVsUGF0aCB3aXRoIGNvbXB1dGVkIGFjY2VzcyBwYXRoIHdpbGwgc3ludGhlc2l6ZSBuZXcgZ2V0dGVycyBhbmQgc2V0dGVycyBmb3IgZWFjaCBwYWlyIG9mIHZhbHVlcyBvZiBgaWRgIGFuZCBgcHJvcGAuXG4gKiBAcmV0dXJuIHtNb2RlbFBhdGh9XG4gKi9cbmZ1bmN0aW9uIE1vZGVsJHBhdGgoYWNjZXNzUGF0aCkgeyAgLy8gLCAuLi4gYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBpbnRlcnBvbGF0ZWRcbiAgICBpZiAoISBhY2Nlc3NQYXRoKSByZXR1cm4gdGhpcztcblxuICAgIC8vIFwibnVsbFwiIGlzIGNvbnRleHQgdG8gcGFzcyB0byBNb2RlbFBhdGgsIGZpcnN0IHBhcmFtZXRlciBvZiBiaW5kXG4gICAgLy8gXCJ0aGlzXCIgKG1vZGVsKSBpcyBhZGRlZCBpbiBmcm9udCBvZiBhbGwgYXJndW1lbnRzXG4gICAgXy5zcGxpY2UoYXJndW1lbnRzLCAwLCAwLCBudWxsLCB0aGlzKTtcblxuICAgIC8vIGNhbGxpbmcgTW9kZWxQYXRoIGNvbnN0cnVjdG9yIHdpdGggbmV3IGFuZCB0aGUgbGlzdCBvZiBhcmd1bWVudHM6IHRoaXMgKG1vZGVsKSwgYWNjZXNzUGF0aCwgLi4uXG4gICAgcmV0dXJuIG5ldyAoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuYXBwbHkoTW9kZWxQYXRoLCBhcmd1bWVudHMpKTtcbn1cblxuXG4vKipcbiAqIE1vZGVsIGluc3RhbmNlIG1ldGhvZC5cbiAqIFByb3h5IG1vZGVsJ3MgTWVzc2VuZ2VyIG1ldGhvZHMgdG8gaG9zdCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG1vZGVsSG9zdE9iamVjdCBvcHRpb25hbCBob3N0IG9iamVjdC4gSWYgbm90IHBhc3NlZCwgaG9zdE9iamVjdCBwYXNzZWQgdG8gTW9kZWwgY29uc3RydWN0b3Igd2lsbCBiZSB1c2VkLlxuICovXG5mdW5jdGlvbiBwcm94eU1lc3Nlbmdlcihtb2RlbEhvc3RPYmplY3QpIHtcbiAgICBtb2RlbEhvc3RPYmplY3QgPSBtb2RlbEhvc3RPYmplY3QgfHwgdGhpcy5faG9zdE9iamVjdDtcbiAgICBNaXhpbi5wcm90b3R5cGUuX2NyZWF0ZVByb3h5TWV0aG9kcy5jYWxsKHRoaXNbTUVTU0VOR0VSX1BST1BFUlRZXSwgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzLCBtb2RlbEhvc3RPYmplY3QpO1xufVxuXG5cbnZhciBtb2RlbE1ldGhvZHNUb1Byb3h5ID0gWydwYXRoJywgJ2dldCcsICdzZXQnLCAnZGVsJywgJ3NwbGljZScsICdsZW4nLCAncHVzaCcsICdwb3AnLCAndW5zaGlmdCcsICdzaGlmdCddO1xuXG5cbi8qKlxuICogRXhwb3NlIG1vZGVsIG1ldGhvZHMgb25cbiAqIFNlZSBzYW1lIG1ldGhvZCBpbiBNaXhpbiBjbGFzcyBmb3IgcGFyYW1ldGVycyBtZWFuaW5nXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaG9zdENsYXNzXG4gKiBAcGFyYW0ge1t0eXBlXX0gaW5zdGFuY2VLZXlcbiAqIEBwYXJhbSB7W3R5cGVdfSBtaXhpbk1ldGhvZHMgb3B0aW9uYWxcbiAqL1xuZnVuY3Rpb24gTW9kZWwkJHVzZVdpdGgoaG9zdENsYXNzLCBpbnN0YW5jZUtleSwgbWl4aW5NZXRob2RzKSB7XG4gICAgbWl4aW5NZXRob2RzID0gbWl4aW5NZXRob2RzIHx8IG1vZGVsTWV0aG9kc1RvUHJveHk7XG4gICAgTWl4aW4udXNlV2l0aC5jYWxsKE1vZGVsLCBob3N0Q2xhc3MsIGluc3RhbmNlS2V5LCBtaXhpbk1ldGhvZHMpO1xufVxuXG5cbi8qKlxuICogTW9kZWwgaW5zdGFuY2UgbWV0aG9kLlxuICogUHJveHkgbW9kZWwgbWV0aG9kcyB0byBob3N0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbW9kZWxIb3N0T2JqZWN0IG9wdGlvbmFsIGhvc3Qgb2JqZWN0LiBJZiBub3QgcGFzc2VkLCBob3N0T2JqZWN0IHBhc3NlZCB0byBNb2RlbCBjb25zdHJ1Y3RvciB3aWxsIGJlIHVzZWQuXG4gKi9cbmZ1bmN0aW9uIHByb3h5TWV0aG9kcyhtb2RlbEhvc3RPYmplY3QpIHtcbiAgICBtb2RlbEhvc3RPYmplY3QgPSBtb2RlbEhvc3RPYmplY3QgfHwgdGhpcy5faG9zdE9iamVjdDtcbiAgICBNaXhpbi5wcm90b3R5cGUuX2NyZWF0ZVByb3h5TWV0aG9kcy5jYWxsKHRoaXMsIG1vZGVsTWV0aG9kc1RvUHJveHksIG1vZGVsSG9zdE9iamVjdCk7XG59XG5cblxuLyoqXG4gKiBNb2RlbCBpbnN0YW5jZSBtZXRob2QuXG4gKiBDcmVhdGUgYW5kIGNvbm5lY3QgaW50ZXJuYWwgYW5kIGV4dGVybmFsIG1vZGVsJ3MgbWVzc2VuZ2Vycy5cbiAqIEV4dGVybmFsIG1lc3NlbmdlcidzIG1ldGhvZHMgYXJlIHByb3hpZWQgb24gdGhlIG1vZGVsIGFuZCB0aGV5IGFsbG93cyBcIipcIiBzdWJzY3JpcHRpb25zLlxuICovXG5mdW5jdGlvbiBfcHJlcGFyZU1lc3NlbmdlcnMoKSB7XG4gICAgLy8gbW9kZWwgd2lsbCBwb3N0IGFsbCBpdHMgY2hhbmdlcyBvbiBpbnRlcm5hbCBtZXNzZW5nZXJcbiAgICB2YXIgaW50ZXJuYWxNZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKHRoaXMsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcblxuICAgIC8vIG1lc3NhZ2Ugc291cmNlIHRvIGNvbm5lY3QgaW50ZXJuYWwgbWVzc2VuZ2VyIHRvIGV4dGVybmFsXG4gICAgdmFyIGludGVybmFsTWVzc2VuZ2VyU291cmNlID0gbmV3IE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2UodGhpcywgdW5kZWZpbmVkLCBuZXcgTW9kZWxNc2dBUEksIGludGVybmFsTWVzc2VuZ2VyKTtcblxuICAgIC8vIGV4dGVybmFsIG1lc3NlbmdlciB0byB3aGljaCBhbGwgbW9kZWwgdXNlcnMgd2lsbCBzdWJzY3JpYmUsXG4gICAgLy8gdGhhdCB3aWxsIGFsbG93IFwiKlwiIHN1YnNjcmlwdGlvbnMgYW5kIHN1cHBvcnQgXCJjaGFuZ2VkYXRhXCIgbWVzc2FnZSBhcGkuXG4gICAgdmFyIGV4dGVybmFsTWVzc2VuZ2VyID0gbmV3IE1lc3Nlbmdlcih0aGlzLCB1bmRlZmluZWQsIGludGVybmFsTWVzc2VuZ2VyU291cmNlKTtcblxuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgTUVTU0VOR0VSX1BST1BFUlRZLCBleHRlcm5hbE1lc3Nlbmdlcik7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX2ludGVybmFsTWVzc2VuZ2VyJywgaW50ZXJuYWxNZXNzZW5nZXIpO1xufVxuXG5cbmZ1bmN0aW9uIF9nZXRIb3N0T2JqZWN0KCkge1xuICAgIHJldHVybiB0aGlzLl9ob3N0T2JqZWN0O1xufVxuXG5cbmZ1bmN0aW9uIE1vZGVsJGRlc3Ryb3koKSB7XG4gICAgdGhpc1tNRVNTRU5HRVJfUFJPUEVSVFldLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9pbnRlcm5hbE1lc3Nlbmdlci5kZXN0cm95KCk7XG4gICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIE1lc3NlbmdlclJlZ2V4cEFQSSA9IHJlcXVpcmUoJy4uL21lc3Nlbmdlci9tX2FwaV9yeCcpXG4gICAgLCBwYXRoVXRpbHMgPSByZXF1aXJlKCcuL3BhdGhfdXRpbHMnKVxuICAgICwgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpO1xuXG5cbi8qKlxuICogU3ViY2xhc3Mgb2YgTWVzc2VuZ2VyUmVnZXhwQVBJIHRoYXQgaXMgdXNlZCB0byB0cmFuc2xhdGUgbWVzc2FnZXMgb2YgZXh0ZXJuYWwgbWVzc2VuZ2VyIG9mIE1vZGVsIHRvIGludGVybmFsIG1lc3NlbmdlciBvZiBNb2RlbC5cbiAqL1xudmFyIE1vZGVsTXNnQVBJID0gXy5jcmVhdGVTdWJjbGFzcyhNZXNzZW5nZXJSZWdleHBBUEksICdNb2RlbE1zZ0FQSScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1vZGVsTXNnQVBJO1xuXG5cbi8qKlxuICogIyMjI01vZGVsTXNnQVBJIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlXSgjdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKSAtIHRyYW5zbGF0ZXMgc3Vic2NyaXB0aW9uIHBhdGhzIHdpdGggXCIqXCJzIHRvIHJlZ2V4LCBsZWF2aW5nIG90aGVyIHN0cmluZ3MgdW50b3VjaGVkXG4gKi9cbl8uZXh0ZW5kUHJvdG8oTW9kZWxNc2dBUEksIHtcbiAgICB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2U6IHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZSxcbn0pO1xuXG5cbi8qKlxuICogTW9kZWxNc2dBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBUcmFuc2xhdGVzIHN1YnNjcmlwdGlvbiBwYXRocyB3aXRoIFwiKlwicyB0byByZWdleCwgbGVhdmluZyBvdGhlciBzdHJpbmdzIHVudG91Y2hlZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYWNjZXNzUGF0aCByZWxhdGl2ZSBhY2Nlc3MgcGF0aCB0byBiZSB0cmFuc2xhdGVkXG4gKiBAcmV0dXJuIHtSZWdFeHB8U3RyaW5nfVxuICovXG5mdW5jdGlvbiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UoYWNjZXNzUGF0aCkge1xuICAgIGlmIChhY2Nlc3NQYXRoIGluc3RhbmNlb2YgUmVnRXhwKSByZXR1cm4gYWNjZXNzUGF0aDtcblxuICAgIHJldHVybiBwYXRoVXRpbHMuY3JlYXRlUmVnZXhQYXRoKGFjY2Vzc1BhdGgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc3ludGhlc2l6ZSA9IHJlcXVpcmUoJy4vc3ludGhlc2l6ZScpXG4gICAgLCBwYXRoVXRpbHMgPSByZXF1aXJlKCcuL3BhdGhfdXRpbHMnKVxuICAgICwgY2hhbmdlRGF0YUhhbmRsZXIgPSByZXF1aXJlKCcuL2NoYW5nZV9kYXRhJylcbiAgICAsIE1lc3NlbmdlciA9IHJlcXVpcmUoJy4uL21lc3NlbmdlcicpXG4gICAgLCBNb2RlbFBhdGhNc2dBUEkgPSByZXF1aXJlKCcuL3BhdGhfbXNnX2FwaScpXG4gICAgLCBNZXNzZW5nZXJNZXNzYWdlU291cmNlID0gcmVxdWlyZSgnLi4vbWVzc2VuZ2VyL21zbmdyX3NvdXJjZScpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJylcbiAgICAsIGNoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9jaGVjaycpXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gTW9kZWxQYXRoO1xuXG5cbi8qKlxuICogYG1pbG8uTW9kZWwuUGF0aGBcbiAqIE1vZGVsUGF0aCBvYmplY3QgdGhhdCBhbGxvd3MgYWNjZXNzIHRvIGFueSBwb2ludCBpbnNpZGUgW01vZGVsXSguL2luZGV4LmpzLmh0bWwpIGFzIGRlZmluZWQgYnkgYGFjY2Vzc1BhdGhgXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge01vZGVsfSBtb2RlbCBNb2RlbCBpbnN0YW5jZSB0aGF0IE1vZGVsUGF0aCBnaXZlcyBhY2Nlc3MgdG8uXG4gKiBAcGFyYW0ge1N0cmluZ30gYWNjZXNzUGF0aCBzdHJpbmcgdGhhdCBkZWZpbmVzIHBhdGggdG8gYWNjZXNzIG1vZGVsLlxuICogIFBhdGggc3RyaW5nIGNvbnNpc3RzIG9mIHBhcnRzIHRvIGRlZmluZSBlaXRoZXIgcHJvcGVydHkgYWNjZXNzIChgXCIubmFtZVwiYCB0byBhY2Nlc3MgcHJvcGVydHkgbmFtZSkgb3IgYXJyYXkgaXRlbSBhY2Nlc3MgKGBcIlsxXVwiYCB0byBhY2Nlc3MgaXRlbSB3aXRoIGluZGV4IDEpLlxuICogIEFjY2VzcyBwYXRoIGNhbiBjb250YWluIGFzIG1hbnkgcGFydHMgYXMgbmVjZXNzYXJ5IChlLmcuIGBcIi5saXN0WzBdLm5hbWVcImAgdG8gYWNjZXNzIHByb3BlcnR5IGBuYW1lYCBpbiB0aGUgZmlyc3QgZWxlbWVudCBvZiBhcnJheSBzdG9yZWQgaW4gcHJvcGVydHkgYGxpc3RgLlxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgYWRkaXRpb25hbCBhcmd1bWVudHMgb2YgdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGludGVycG9sYXRlZCBwYXRocy5cbiAqICBFLmcuIGBtLnBhdGgoXCJbJDFdLiQyXCIsIGlkLCBwcm9wKWAgcmV0dXJucyBNb2RlbFBhdGggdG8gYWNjZXNzIHByb3BlcnR5IHdpdGggbmFtZSBgcHJvcGAgaW4gYXJyYXkgaXRlbSB3aXRoIGluZGV4IGBpZGAuIEFsdGhvdWdoIHRoaXMgTW9kZWxQYXRoIG9iamVjdCB3aWxsIHdvcmsgZXhhY3RseSBhcyBgbShcIltcIiArIGlkICsgXCJdLlwiICsgcHJvcClgLCB0aGUgaW50ZXJwb2xhdGVkIGlzIG11Y2ggbW9yZSBlZmZpY2llbnQgYXMgTW9kZWxQYXRoIHdpdGggaW50ZXJwb2xhdGlvbiB3aWxsIG5vdCBzeW50aGVzaXplIG5ldyBnZXR0ZXJzIGFuZCBzZXR0ZXJzLCB3aGlsZSBNb2RlbFBhdGggd2l0aCBjb21wdXRlZCBhY2Nlc3MgcGF0aCB3aWxsIHN5bnRoZXNpemUgbmV3IGdldHRlcnMgYW5kIHNldHRlcnMgZm9yIGVhY2ggcGFpciBvZiB2YWx1ZXMgb2YgYGlkYCBhbmQgYHByb3BgLlxuICogQHJldHVybiB7TW9kZWxQYXRofVxuICovXG5mdW5jdGlvbiBNb2RlbFBhdGgobW9kZWwsIHBhdGgpIHsgLy8gLC4uLiAtIGFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciBpbnRlcnBvbGF0aW9uXG4gICAgLy8gY2hlY2sobW9kZWwsIE1vZGVsKTtcbiAgICBjaGVjayhwYXRoLCBTdHJpbmcpO1xuXG4gICAgLy8gYG1vZGVsUGF0aGAgd2lsbCBiZSByZXR1cm5lZCBieSBjb25zdHJ1Y3RvciBpbnN0ZWFkIG9mIGB0aGlzYC4gYG1vZGVsUGF0aGBcbiAgICAvLyAoYG1vZGVsUGF0aF9wYXRoYCBmdW5jdGlvbikgc2hvdWxkIGFsc28gcmV0dXJuIGEgTW9kZWxQYXRoIG9iamVjdCB3aXRoIFwic3ludGhlc2l6ZWRcIiBtZXRob2RzXG4gICAgLy8gdG8gZ2V0L3NldCBtb2RlbCBwcm9wZXJ0aWVzLCB0byBzdWJzY3JpYmUgdG8gcHJvcGVydHkgY2hhbmdlcywgZXRjLlxuICAgIC8vIEFkZGl0aW9uYWwgYXJndW1lbnRzIG9mIG1vZGVsUGF0aCBjYW4gYmUgdXNlZCBpbiB0aGUgcGF0aCB1c2luZyBpbnRlcnBvbGF0aW9uIC0gc2VlIE1vZGVsUGF0aCBiZWxvdy5cbiAgICB2YXIgbW9kZWxQYXRoID0gZnVuY3Rpb24gbW9kZWxQYXRoX3BhdGgoYWNjZXNzUGF0aCkgeyAvLyAsIC4uLiBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIGludGVycG9sYXRlZFxuICAgICAgICByZXR1cm4gTW9kZWxQYXRoJHBhdGguYXBwbHkobW9kZWxQYXRoLCBhcmd1bWVudHMpO1xuICAgIH07XG4gICAgbW9kZWxQYXRoLl9fcHJvdG9fXyA9IE1vZGVsUGF0aC5wcm90b3R5cGU7XG5cblxuICAgIF8uZGVmaW5lUHJvcGVydGllcyhtb2RlbFBhdGgsIHtcbiAgICAgICAgX21vZGVsOiBtb2RlbCxcbiAgICAgICAgX3BhdGg6IHBhdGgsXG4gICAgICAgIF9hcmdzOiBfLnNsaWNlKGFyZ3VtZW50cywgMSksIC8vIHBhdGggd2lsbCBiZSB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGlzIGFycmF5XG4gICAgICAgIF9vcHRpb25zOiBtb2RlbC5fb3B0aW9uc1xuICAgIH0pO1xuXG4gICAgLy8gcGFyc2UgYWNjZXNzIHBhdGhcbiAgICB2YXIgcGFyc2VkUGF0aCA9IHBhdGhVdGlscy5wYXJzZUFjY2Vzc1BhdGgocGF0aCk7XG5cbiAgICAvLyBjb21wdXRlIGFjY2VzcyBwYXRoIHN0cmluZ1xuICAgIF8uZGVmaW5lUHJvcGVydHkobW9kZWxQYXRoLCAnX2FjY2Vzc1BhdGgnLCBpbnRlcnBvbGF0ZUFjY2Vzc1BhdGgocGFyc2VkUGF0aCwgbW9kZWxQYXRoLl9hcmdzKSk7XG5cbiAgICBpZiAobW9kZWxQYXRoLl9vcHRpb25zLnJlYWN0aXZlICE9PSBmYWxzZSkge1xuICAgICAgICAvLyBtZXNzZW5nZXIgZmFpbHMgb24gXCIqXCIgc3Vic2NyaXB0aW9uc1xuICAgICAgICBtb2RlbFBhdGguX3ByZXBhcmVNZXNzZW5nZXIoKTtcbiAgICAgICAgLy8gc3Vic2NyaWJlIHRvIFwiY2hhbmdlZGF0YVwiIG1lc3NhZ2UgdG8gZW5hYmxlIHJlYWN0aXZlIGNvbm5lY3Rpb25zXG4gICAgICAgIG1vZGVsUGF0aC5vblN5bmMoJ2NoYW5nZWRhdGEnLCBjaGFuZ2VEYXRhSGFuZGxlcik7XG4gICAgfVxuXG4gICAgLy8gY29tcGlsaW5nIGdldHRlciBhbmQgc2V0dGVyXG4gICAgdmFyIG1ldGhvZHMgPSBzeW50aGVzaXplKHBhdGgsIHBhcnNlZFBhdGgpO1xuXG4gICAgLy8gYWRkaW5nIG1ldGhvZHMgdG8gbW9kZWwgcGF0aFxuICAgIF8uZGVmaW5lUHJvcGVydGllcyhtb2RlbFBhdGgsIG1ldGhvZHMpO1xuXG4gICAgT2JqZWN0LmZyZWV6ZShtb2RlbFBhdGgpO1xuXG4gICAgcmV0dXJuIG1vZGVsUGF0aDtcbn1cblxuTW9kZWxQYXRoLnByb3RvdHlwZS5fX3Byb3RvX18gPSBNb2RlbFBhdGguX19wcm90b19fO1xuXG5cbi8qKlxuICogSW50ZXJwb2xhdGVzIHBhdGggZWxlbWVudHMgdG8gY29tcHV0ZSByZWFsIHBhdGhcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBwYXJzZWRQYXRoIHBhcnNlZCBwYXRoIC0gYXJyYXkgb2YgcGF0aCBub2Rlc1xuICogQHBhcmFtIHtBcnJheX0gYXJncyBwYXRoIGludGVycG9sYXRpb24gYXJndW1lbnRzLCBhcmdzWzBdIGlzIHBhdGggaXRzZWxmXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGludGVycG9sYXRlQWNjZXNzUGF0aChwYXJzZWRQYXRoLCBhcmdzKSB7XG4gICAgcmV0dXJuIHBhcnNlZFBhdGgucmVkdWNlKGZ1bmN0aW9uKGFjY2Vzc1BhdGhTdHIsIGN1cnJOb2RlLCBpbmRleCkge1xuICAgICAgICB2YXIgaW50ZXJwb2xhdGUgPSBjdXJyTm9kZS5pbnRlcnBvbGF0ZTtcbiAgICAgICAgcmV0dXJuIGFjY2Vzc1BhdGhTdHIgK1xuICAgICAgICAgICAgICAgIChpbnRlcnBvbGF0ZVxuICAgICAgICAgICAgICAgICAgICA/IChjdXJyTm9kZS5zeW50YXggPT0gJ2FycmF5J1xuICAgICAgICAgICAgICAgICAgICAgICAgPyAnWycgKyBhcmdzW2ludGVycG9sYXRlXSArICddJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnLicgKyBhcmdzW2ludGVycG9sYXRlXSlcbiAgICAgICAgICAgICAgICAgICAgOiBjdXJyTm9kZS5wcm9wZXJ0eSk7XG4gICAgfSwgJycpO1xufVxuXG5cbi8qKlxuICogIyMjI01vZGVsUGF0aCBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW3BhdGhdKCNNb2RlbFBhdGgkcGF0aCkgLSBnaXZlcyBhY2Nlc3MgdG8gcGF0aCBpbnNpZGUgTW9kZWxQYXRoXG4gKiAtIGdldCAtIHN5bnRoZXNpemVkXG4gKiAtIHNldCAtIHN5bnRoZXNpemVkXG4gKiAtIHNwbGljZSAtIHNwbGljZSBtb2RlbCBkYXRhIChhcyBhcnJheSBvciBwc2V1ZG8tYXJyYXkpLCBzeW50aGVzaXplZFxuICogLSBbbGVuXSgjTW9kZWxQYXRoJGxlbikgLSByZXR1cm5zIGxlbmd0aCBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KSBpbiBzYWZlIHdheSwgMCBpZiBubyBsZW5ndGggaXMgc2V0XG4gKiAtIFtwdXNoXSgjTW9kZWxQYXRoJHB1c2gpIC0gYWRkIGl0ZW1zIHRvIHRoZSBlbmQgb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkgaW4gTW9kZWxQYXRoXG4gKiAtIFtwb3BdKCNNb2RlbFBhdGgkcG9wKSAtIHJlbW92ZSBpdGVtIGZyb20gdGhlIGVuZCBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KSBpbiBNb2RlbFBhdGhcbiAqIC0gW3Vuc2hpZnRdKCNNb2RlbFBhdGgkdW5zaGlmdCkgLSBhZGQgaXRlbXMgdG8gdGhlIGJlZ2lubmluZyBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KSBpbiBNb2RlbFBhdGhcbiAqIC0gW3NoaWZ0XSgjTW9kZWxQYXRoJHNoaWZ0KSAtIHJlbW92ZSBpdGVtIGZyb20gdGhlIGJlZ2lubmluZyBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KSBpbiBNb2RlbFBhdGhcbiAqL1xuXy5leHRlbmRQcm90byhNb2RlbFBhdGgsIHtcbiAgICBwYXRoOiBNb2RlbFBhdGgkcGF0aCxcbiAgICBsZW46IE1vZGVsUGF0aCRsZW4sXG4gICAgcHVzaDogTW9kZWxQYXRoJHB1c2gsXG4gICAgcG9wOiBNb2RlbFBhdGgkcG9wLFxuICAgIHVuc2hpZnQ6IE1vZGVsUGF0aCR1bnNoaWZ0LFxuICAgIHNoaWZ0OiBNb2RlbFBhdGgkc2hpZnQsXG4gICAgX3ByZXBhcmVNZXNzZW5nZXI6IF9wcmVwYXJlTWVzc2VuZ2VyLFxuICAgIF9nZXREZWZpbml0aW9uOiBfZ2V0RGVmaW5pdGlvbixcbiAgICBkZXN0cm95OiBNb2RlbFBhdGgkZGVzdHJveVxufSk7XG5cblxuXy5leHRlbmQoTW9kZWxQYXRoLCB7XG4gICAgX2NyZWF0ZUZyb21EZWZpbml0aW9uOiBfY3JlYXRlRnJvbURlZmluaXRpb25cbn0pXG5cblxuLyoqXG4gKiBFeHBvc2UgTWVzc2VuZ2VyIG1ldGhvZHMgb24gRmFjZXQgcHJvdG90eXBlXG4gKi9cbnZhciBNRVNTRU5HRVJfUFJPUEVSVFkgPSAnX21lc3Nlbmdlcic7XG5NZXNzZW5nZXIudXNlV2l0aChNb2RlbFBhdGgsIE1FU1NFTkdFUl9QUk9QRVJUWSwgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcblxuXG4vKipcbiAqIE1vZGVsUGF0aCBpbnN0YW5jZSBtZXRob2RcbiAqIEdpdmVzIGFjY2VzcyB0byBwYXRoIGluc2lkZSBNb2RlbFBhdGguIE1ldGhvZCB3b3JrcyBzaW1pbGFybHkgdG8gW3BhdGggbWV0aG9kXSgjTW9kZWwkcGF0aCkgb2YgbW9kZWwsIHVzaW5nIHJlbGF0aXZlIHBhdGhzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY2Nlc3NQYXRoIHN0cmluZyB0aGF0IGRlZmluZXMgcGF0aCB0byBhY2Nlc3MgbW9kZWwuXG4gKiAgUGF0aCBzdHJpbmcgY29uc2lzdHMgb2YgcGFydHMgdG8gZGVmaW5lIGVpdGhlciBwcm9wZXJ0eSBhY2Nlc3MgKGBcIi5uYW1lXCJgIHRvIGFjY2VzcyBwcm9wZXJ0eSBuYW1lKSBvciBhcnJheSBpdGVtIGFjY2VzcyAoYFwiWzFdXCJgIHRvIGFjY2VzcyBpdGVtIHdpdGggaW5kZXggMSkuXG4gKiAgQWNjZXNzIHBhdGggY2FuIGNvbnRhaW4gYXMgbWFueSBwYXJ0cyBhcyBuZWNlc3NhcnkgKGUuZy4gYFwiLmxpc3RbMF0ubmFtZVwiYCB0byBhY2Nlc3MgcHJvcGVydHkgYG5hbWVgIGluIHRoZSBmaXJzdCBlbGVtZW50IG9mIGFycmF5IHN0b3JlZCBpbiBwcm9wZXJ0eSBgbGlzdGAuXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBvZiB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgaW50ZXJwb2xhdGVkIHBhdGhzLlxuICogIEUuZy4gYG0ucGF0aChcIlskMV0uJDJcIiwgaWQsIHByb3ApYCByZXR1cm5zIE1vZGVsUGF0aCB0byBhY2Nlc3MgcHJvcGVydHkgd2l0aCBuYW1lIGBwcm9wYCBpbiBhcnJheSBpdGVtIHdpdGggaW5kZXggYGlkYC4gQWx0aG91Z2ggdGhpcyBNb2RlbFBhdGggb2JqZWN0IHdpbGwgd29yayBleGFjdGx5IGFzIGBtKFwiW1wiICsgaWQgKyBcIl0uXCIgKyBwcm9wKWAsIHRoZSBpbnRlcnBvbGF0ZWQgaXMgbXVjaCBtb3JlIGVmZmljaWVudCBhcyBNb2RlbFBhdGggd2l0aCBpbnRlcnBvbGF0aW9uIHdpbGwgbm90IHN5bnRoZXNpemUgbmV3IGdldHRlcnMgYW5kIHNldHRlcnMsIHdoaWxlIE1vZGVsUGF0aCB3aXRoIGNvbXB1dGVkIGFjY2VzcyBwYXRoIHdpbGwgc3ludGhlc2l6ZSBuZXcgZ2V0dGVycyBhbmQgc2V0dGVycyBmb3IgZWFjaCBwYWlyIG9mIHZhbHVlcyBvZiBgaWRgIGFuZCBgcHJvcGAuXG4gKiBAcmV0dXJuIHtNb2RlbFBhdGh9XG4gKi9cbmZ1bmN0aW9uIE1vZGVsUGF0aCRwYXRoKGFjY2Vzc1BhdGgpIHsgIC8vICwgLi4uIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgaW50ZXJwb2xhdGVkXG4gICAgaWYgKCEgYWNjZXNzUGF0aCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgdGhpc1BhdGhBcmdzQ291bnQgPSB0aGlzLl9hcmdzLmxlbmd0aCAtIDE7XG5cbiAgICBpZiAodGhpc1BhdGhBcmdzQ291bnQgPiAwKSB7Ly8gdGhpcyBwYXRoIGhhcyBpbnRlcnBvbGF0ZWQgYXJndW1lbnRzIHRvb1xuICAgICAgICBhY2Nlc3NQYXRoID0gYWNjZXNzUGF0aC5yZXBsYWNlKC9cXCRbMS05XVswLTldKi9nLCBmdW5jdGlvbihzdHIpIHtcbiAgICAgICAgICAgIHJldHVybiAnJCcgKyAoK3N0ci5zbGljZSgxKSArIHRoaXNQYXRoQXJnc0NvdW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFyIG5ld1BhdGggPSB0aGlzLl9wYXRoICsgYWNjZXNzUGF0aDtcblxuICAgIC8vIHRoaXMuX21vZGVsIGlzIGFkZGVkIGluIGZyb250IG9mIGFsbCBhcmd1bWVudHMgYXMgdGhlIGZpcnN0IHBhcmFtZXRlclxuICAgIC8vIG9mIE1vZGVsUGF0aCBjb25zdHJ1Y3RvclxuICAgIHZhciBhcmdzID0gW3RoaXMuX21vZGVsLCBuZXdQYXRoXVxuICAgICAgICAgICAgICAgIC5jb25jYXQodGhpcy5fYXJncy5zbGljZSgxKSkgLy8gcmVtb3ZlIG9sZCBwYXRoIGZyb20gX2FyZ3MsIGFzIGl0IGlzIDEgYmFzZWRcbiAgICAgICAgICAgICAgICAuY29uY2F0KF8uc2xpY2UoYXJndW1lbnRzLCAxKSk7IC8vIGFkZCBuZXcgaW50ZXJwb2xhdGlvbiBhcmd1bWVudHNcblxuICAgIC8vIGNhbGxpbmcgTW9kZWxQYXRoIGNvbnN0cnVjdG9yIHdpdGggbmV3IGFuZCB0aGUgbGlzdCBvZiBhcmd1bWVudHM6IHRoaXMgKG1vZGVsKSwgYWNjZXNzUGF0aCwgLi4uXG4gICAgcmV0dXJuIF8ubmV3QXBwbHkoTW9kZWxQYXRoLCBhcmdzKTtcbn1cblxuXG4vKipcbiAqIE1vZGVsUGF0aCBhbmQgTW9kZWwgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIGxlbmd0aCBwcm9wZXJ0eSBhbmQgc2V0cyBpdCB0byAwIGlmIGl0IHdhc24ndCBzZXQuXG4gKlxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiBNb2RlbFBhdGgkbGVuKCkge1xuICAgIHJldHVybiB0aGlzLnBhdGgoJy5sZW5ndGgnKS5nZXQoKSB8fCAwO1xufVxuXG5cbi8qKlxuICogTW9kZWxQYXRoIGFuZCBNb2RlbCBpbnN0YW5jZSBtZXRob2RcbiAqIEFkZHMgaXRlbXMgdG8gdGhlIGVuZCBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KS4gUmV0dXJucyBuZXcgbGVuZ3RoLlxuICpcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIGxpc3Qgb2YgaXRlbXMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIGFycmF5IChwc2V1ZG8gYXJyYXkpXG4gKiBAcmV0dXJuIHtJbnRlZ2VyfVxuICovXG5mdW5jdGlvbiBNb2RlbFBhdGgkcHVzaCgpIHsgLy8gYXJndW1lbnRzXG4gICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuKCk7XG4gICAgdmFyIG5ld0xlbmd0aCA9IGxlbmd0aCArIGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICBfLnNwbGljZShhcmd1bWVudHMsIDAsIDAsIGxlbmd0aCwgMCk7XG4gICAgdGhpcy5zcGxpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIHJldHVybiBuZXdMZW5ndGg7XG59XG5cblxuLyoqXG4gKiBNb2RlbFBhdGggYW5kIE1vZGVsIGluc3RhbmNlIG1ldGhvZFxuICogUmVtb3ZlcyBpdGVtIGZyb20gdGhlIGVuZCBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KS4gUmV0dXJucyB0aGlzIGl0ZW0uXG4gKlxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiBNb2RlbFBhdGgkcG9wKCkge1xuICAgIHJldHVybiB0aGlzLnNwbGljZSh0aGlzLmxlbigpIC0gMSwgMSlbMF07XG59XG5cblxuLyoqXG4gKiBNb2RlbFBhdGggYW5kIE1vZGVsIGluc3RhbmNlIG1ldGhvZFxuICogSW5zZXJ0cyBpdGVtcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS4gUmV0dXJucyBuZXcgbGVuZ3RoLlxuICpcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIGl0ZW1zIHRvIGJlIGluc2VydGVkIGluIHRoZSBiZWdpbm5pbmcgb2YgYXJyYXlcbiAqIEByZXR1cm4ge0ludGVnZXJ9XG4gKi9cbmZ1bmN0aW9uIE1vZGVsUGF0aCR1bnNoaWZ0KCkgeyAvLyBhcmd1bWVudHNcbiAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW4oKTtcbiAgICBsZW5ndGggKz0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIF8uc3BsaWNlKGFyZ3VtZW50cywgMCwgMCwgMCwgMCk7XG4gICAgdGhpcy5zcGxpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIHJldHVybiBsZW5ndGg7XG59XG5cblxuLyoqXG4gKiBNb2RlbFBhdGggYW5kIE1vZGVsIGluc3RhbmNlIG1ldGhvZFxuICogUmVtb3ZlcyB0aGUgaXRlbSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkuIFJldHVybnMgdGhpcyBpdGVtLlxuICpcbiAqIEByZXR1cm4ge0FueX1cbiAqL1xuZnVuY3Rpb24gTW9kZWxQYXRoJHNoaWZ0KCkgeyAvLyBhcmd1bWVudHNcbiAgICByZXR1cm4gdGhpcy5zcGxpY2UoMCwgMSlbMF07XG59XG5cblxuLyoqXG4gKiBNb2RlbFBhdGggaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXplcyBNb2RlbFBhdGggbWVzZW5nZXIgd2l0aCBNb2RlbCdzIG1lc3NlbmdlciBhcyBpdHMgc291cmNlIChbTWVzc2VuZ2VyTWVzc2FnZVNvdXJjZV0oLi4vbWVzc2VuZ2VyL21zbmdyX3NvdXJjZS5qcy5odG1sKSkgYW5kIFtNb2RlbFBhdGhNc2dBUEldKC4vcGF0aF9tc2dfYXBpLmpzLmh0bWwpIGFzIFtNZXNzZW5nZXJBUEldKC4uL21lc3Nlbmdlci9tX2FwaS5qcy5odG1sKVxuICovXG5mdW5jdGlvbiBfcHJlcGFyZU1lc3NlbmdlcigpIHtcbiAgICB2YXIgbVBhdGhBUEkgPSBuZXcgTW9kZWxQYXRoTXNnQVBJKHRoaXMuX2FjY2Vzc1BhdGgpO1xuXG4gICAgLy8gY3JlYXRlIE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2UgY29ubmVjdGVkIHRvIE1vZGVsJ3MgbWVzc2VuZ2VyXG4gICAgdmFyIG1vZGVsTWVzc2FnZVNvdXJjZSA9IG5ldyBNZXNzZW5nZXJNZXNzYWdlU291cmNlKHRoaXMsIHVuZGVmaW5lZCwgbVBhdGhBUEksIHRoaXMuX21vZGVsKTtcblxuICAgIC8vIGNyZWF0ZSBtZXNzZW5nZXIgd2l0aCBtb2RlbCBwYXNzZWQgYXMgaG9zdE9iamVjdCAoZGVmYXVsdCBtZXNzYWdlIGRpc3BhdGNoIGNvbnRleHQpXG4gICAgLy8gYW5kIHdpdGhvdXQgcHJveHlpbmcgbWV0aG9kcyAod2UgZG9uJ3Qgd2FudCB0byBwcm94eSB0aGVtIHRvIE1vZGVsKVxuICAgIHZhciBtUGF0aE1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcywgdW5kZWZpbmVkLCBtb2RlbE1lc3NhZ2VTb3VyY2UpO1xuXG4gICAgLy8gc3RvcmUgbWVzc2VuZ2VyIG9uIE1vZGVsUGF0aCBpbnN0YW5jZVxuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgTUVTU0VOR0VSX1BST1BFUlRZLCBtUGF0aE1lc3Nlbmdlcik7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvYmplY3QgYWxsb3dpbmcgdG8gcmVjcmVhdGUgbW9kZWwgcGF0aFxuICpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gX2dldERlZmluaXRpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbW9kZWw6IHRoaXMuX21vZGVsLFxuICAgICAgICBwYXRoOiB0aGlzLl9wYXRoLFxuICAgICAgICBhcmdzOiB0aGlzLl9hcmdzXG4gICAgfTtcbn1cblxuXG4vKipcbiAqIENsYXNzIG1ldGhvZFxuICogQ3JlYXRlcyBtb2RlbFBhdGggb2JqZWN0IGZyb20gZGVmaW5pdGlvbiBjcmVhdGVkIGJ5IF9nZXREZWZpbml0aW9uXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBkZWZpbml0aW9uXG4gKiBAcmV0dXJuIHtNb2RlbFBhdGh9XG4gKi9cbmZ1bmN0aW9uIF9jcmVhdGVGcm9tRGVmaW5pdGlvbihkZWZpbml0aW9uKSB7XG4gICAgY2hlY2soZGVmaW5pdGlvbiwge1xuICAgICAgICBtb2RlbDogRnVuY3Rpb24sIC8vIE1vZGVsXG4gICAgICAgIHBhdGg6IFN0cmluZyxcbiAgICAgICAgYXJnczogQXJyYXlcbiAgICB9KTtcblxuICAgIHZhciBtID0gZGVmaW5pdGlvbi5tb2RlbDtcblxuICAgIHJldHVybiBtLmFwcGx5KG0sIGRlZmluaXRpb24uYXJncyk7XG59XG5cblxuZnVuY3Rpb24gTW9kZWxQYXRoJGRlc3Ryb3koKSB7XG4gICAgdGhpc1tNRVNTRU5HRVJfUFJPUEVSVFldLmRlc3Ryb3koKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgbW9kZWxVdGlscyA9IHtcbiAgICBub3JtYWxpemVTcGxpY2VJbmRleDogbm9ybWFsaXplU3BsaWNlSW5kZXhcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gbW9kZWxVdGlscztcblxuXG5mdW5jdGlvbiBub3JtYWxpemVTcGxpY2VJbmRleChzcGxpY2VJbmRleCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIHNwbGljZUluZGV4ID4gbGVuZ3RoXG4gICAgICAgICAgICA/IGxlbmd0aFxuICAgICAgICAgICAgOiBzcGxpY2VJbmRleCA+PSAwXG4gICAgICAgICAgICAgICAgPyBzcGxpY2VJbmRleFxuICAgICAgICAgICAgICAgIDogc3BsaWNlSW5kZXggKyBsZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgID8gc3BsaWNlSW5kZXggKyBsZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgOiAwO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgTWVzc2VuZ2VyQVBJID0gcmVxdWlyZSgnLi4vbWVzc2VuZ2VyL21fYXBpJylcbiAgICAsIHBhdGhVdGlscyA9IHJlcXVpcmUoJy4vcGF0aF91dGlscycpXG4gICAgLCBsb2dnZXIgPSByZXF1aXJlKCcuLi91dGlsL2xvZ2dlcicpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJyk7XG5cblxuLyoqXG4gKiBTdWJjbGFzcyBvZiBNZXNzZW5nZXJBUEkgdGhhdCBpcyB1c2VkIHRvIHRyYW5zbGF0ZSBtZXNzYWdlcyBvZiBNZXNzZW5nZXIgb24gTW9kZWxQYXRoIHRvIE1lc3NlbmdlciBvbiBNb2RlbC5cbiAqL1xudmFyIE1vZGVsUGF0aE1zZ0FQSSA9IF8uY3JlYXRlU3ViY2xhc3MoTWVzc2VuZ2VyQVBJLCAnTW9kZWxQYXRoTXNnQVBJJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTW9kZWxQYXRoTXNnQVBJO1xuXG5cbi8qKlxuICogIyMjI01vZGVsUGF0aE1zZ0FQSSBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2luaXRdKCNpbml0KSAtIGluaXRpYWxpemVzIE1vZGVsUGF0aE1zZ0FQSVxuICogLSBbdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlXSgjdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKSAtIHRyYW5zbGF0ZXMgcmVsYXRpdmUgYWNjZXNzIHBhdGhzIG9mIE1vZGVsUGF0aCB0byBmdWxsIHBhdGggb2YgTW9kZWxcbiAqIC0gW2NyZWF0ZUludGVybmFsRGF0YV0oI2NyZWF0ZUludGVybmFsRGF0YSkgLSBjaGFuZ2VzIHBhdGggaW4gbWVzc2FnZSBvbiBtb2RlbCB0byByZWxhdGl2ZSBwYXRoIGFuZCBhZGRzIGBmdWxsUGF0aGAgcHJvcGVydHkgdG8gbWVzc2FnZSBkYXRhXG4gKi9cbl8uZXh0ZW5kUHJvdG8oTW9kZWxQYXRoTXNnQVBJLCB7XG4gICAgaW5pdDogaW5pdCxcbiAgICB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2U6IHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZSxcbiAgICBjcmVhdGVJbnRlcm5hbERhdGE6IGNyZWF0ZUludGVybmFsRGF0YSxcbn0pO1xuXG5cbi8qKlxuICogTW9kZWxQYXRoTXNnQVBJIGluc3RhbmNlIG1ldGhvZFxuICogQ2FsbGVkIGJ5IE1lc3NlbmdlckFQSSBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcm9vdFBhdGggcm9vdCBwYXRoIG9mIG1vZGVsIHBhdGhcbiAqL1xuZnVuY3Rpb24gaW5pdChyb290UGF0aCkge1xuICAgIE1lc3NlbmdlckFQSS5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMucm9vdFBhdGggPSByb290UGF0aDtcbn1cblxuLyoqXG4gKiBNb2RlbFBhdGhNc2dBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBUcmFuc2xhdGVzIHJlbGF0aXZlIGFjY2VzcyBwYXRocyBvZiBNb2RlbFBhdGggdG8gZnVsbCBwYXRoIG9mIE1vZGVsLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY2Nlc3NQYXRoIHJlbGF0aXZlIGFjY2VzcyBwYXRoIHRvIGJlIHRyYW5zbGF0ZWRcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICAvLyBUT0RPIHNob3VsZCBwcmVwZW5kIFJlZ0V4ZXNcbiAgICAvLyBUT0RPIHNob3VsZCBub3QgcHJlcGVuZCBjaGFuZ2VkYXRhIHRvbz8/P1xuICAgIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgUmVnRXhwKVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICBpZiAobWVzc2FnZSA9PSAnZGF0YWNoYW5nZXMnKVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICBcbiAgICByZXR1cm4gdGhpcy5yb290UGF0aCArIG1lc3NhZ2U7XG59XG5cblxuLyoqXG4gKiBNb2RlbFBhdGhNc2dBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBDaGFuZ2VzIHBhdGggaW4gbWVzc2FnZSBvbiBtb2RlbCB0byByZWxhdGl2ZSBwYXRoIGFuZCBhZGRzIGBmdWxsUGF0aGAgcHJvcGVydHkgdG8gbWVzc2FnZSBkYXRhLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzb3VyY2VNZXNzYWdlIGZ1bGwgYWNjZXNzIHBhdGggb24gTW9kZWxcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIHJlbGF0aXZlIGFjY2VzcyBwYXRoIG9uIE1vZGVsUGF0aFxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZURhdGEgZGF0YSByZWNlaXZlZCBmcm9tIE1vZGVsLCB3aWxsIGJlIHRyYW5zbGF0ZWQgYXMgZGVzY3JpYmVkIHRvIGJlIGRpc3BhdGNoZWQgdG8gTW9kZWxQYXRoXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUludGVybmFsRGF0YShzb3VyY2VNZXNzYWdlLCBtZXNzYWdlLCBzb3VyY2VEYXRhKSB7XG4gICAgLy8gVE9ETyByZXR1cm4gb24gY2hhbmdlZGF0YSB0b28/Pz9cbiAgICBpZiAobWVzc2FnZSA9PSAnZGF0YWNoYW5nZXMnKSB7XG4gICAgICAgIHZhciBpbnRlcm5hbENoYW5nZXMgPSBzb3VyY2VEYXRhLmNoYW5nZXNcbiAgICAgICAgICAgIC5tYXAodHJ1bmNhdGVDaGFuZ2VQYXRoLCB0aGlzKVxuICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbihjaGFuZ2UpIHsgcmV0dXJuIGNoYW5nZTsgfSk7XG4gICAgICAgIHZhciBpbnRlcm5hbERhdGEgPSB7XG4gICAgICAgICAgICBjaGFuZ2VzOiBpbnRlcm5hbENoYW5nZXMsXG4gICAgICAgICAgICB0cmFuc2FjdGlvbjogc291cmNlRGF0YS50cmFuc2FjdGlvblxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBpbnRlcm5hbERhdGFcbiAgICB9XG5cbiAgICB2YXIgaW50ZXJuYWxEYXRhID0gdHJ1bmNhdGVDaGFuZ2VQYXRoLmNhbGwodGhpcywgc291cmNlRGF0YSk7XG4gICAgcmV0dXJuIGludGVybmFsRGF0YTtcbn1cblxuXG5mdW5jdGlvbiB0cnVuY2F0ZUNoYW5nZVBhdGgoY2hhbmdlKSB7XG4gICAgdmFyIGZ1bGxQYXRoID0gY2hhbmdlLnBhdGhcbiAgICAgICAgLCBwYXRoID0gXy51blByZWZpeChmdWxsUGF0aCwgdGhpcy5yb290UGF0aCk7XG5cbiAgICBpZiAodHlwZW9mIHBhdGggPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIGNoYW5nZSA9IF8uY2xvbmUoY2hhbmdlKTtcbiAgICAgICAgY2hhbmdlLmZ1bGxQYXRoID0gZnVsbFBhdGg7XG4gICAgICAgIGNoYW5nZS5wYXRoID0gcGF0aDtcbiAgICAgICAgcmV0dXJuIGNoYW5nZTtcbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIDxhIG5hbWU9XCJtb2RlbC1wYXRoXCI+PC9hPlxuLy8gIyMjIG1vZGVsIHBhdGggdXRpbHNcblxudmFyIGNoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9jaGVjaycpXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJyk7XG5cbnZhciBwYXRoVXRpbHMgPSB7XG4gICAgcGFyc2VBY2Nlc3NQYXRoOiBwYXJzZUFjY2Vzc1BhdGgsXG4gICAgY3JlYXRlUmVnZXhQYXRoOiBjcmVhdGVSZWdleFBhdGgsXG4gICAgZ2V0UGF0aE5vZGVLZXk6IGdldFBhdGhOb2RlS2V5LFxuICAgIHdyYXBNZXNzZW5nZXJNZXRob2RzOiB3cmFwTWVzc2VuZ2VyTWV0aG9kc1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoVXRpbHM7XG5cblxudmFyIHByb3BlcnR5UGF0aFN5bnRheCA9ICdcXFxcLltBLVphLXpfLV1bQS1aYS16MC05Xy1dKidcbiAgICAsIGFycmF5UGF0aFN5bnRheCA9ICdcXFxcW1swLTldK1xcXFxdJ1xuICAgICwgaW50ZXJwb2xhdGlvblN5bnRheCA9ICdcXFxcJFsxLTldWzAtOV0qJ1xuICAgICwgcHJvcGVydHlJbnRlcnBvbGF0ZVN5bnRheCA9ICdcXFxcLicgKyBpbnRlcnBvbGF0aW9uU3ludGF4XG4gICAgLCBhcnJheUludGVycG9sYXRlU3ludGF4ID0gJ1xcXFxbJyArIGludGVycG9sYXRpb25TeW50YXggKyAnXFxcXF0nXG5cbiAgICAsIHByb3BlcnR5U3RhclN5bnRheCA9ICdcXFxcLlxcXFwqJ1xuICAgICwgYXJyYXlTdGFyU3ludGF4ID0gJ1xcXFxbXFxcXCpcXFxcXSdcbiAgICAsIHN0YXJTeW50YXggPSAnXFxcXConXG5cbiAgICAsIHBhdGhQYXJzZVN5bnRheCA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVBhdGhTeW50YXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlQYXRoU3ludGF4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5SW50ZXJwb2xhdGVTeW50YXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlJbnRlcnBvbGF0ZVN5bnRheFxuICAgICAgICAgICAgICAgICAgICAgICAgXS5qb2luKCd8JylcbiAgICAsIHBhdGhQYXJzZVBhdHRlcm4gPSBuZXcgUmVnRXhwKHBhdGhQYXJzZVN5bnRheCwgJ2cnKVxuXG4gICAgLCBwYXR0ZXJuUGF0aFBhcnNlU3ludGF4ID0gIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhQYXJzZVN5bnRheCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5U3RhclN5bnRheCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5U3RhclN5bnRheCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJTeW50YXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5qb2luKCd8JylcbiAgICAsIHBhdHRlcm5QYXRoUGFyc2VQYXR0ZXJuID0gbmV3IFJlZ0V4cChwYXR0ZXJuUGF0aFBhcnNlU3ludGF4LCAnZycpXG5cbiAgICAvLywgdGFyZ2V0UGF0aFBhcnNlUGF0dGVybiA9IC9cXC5bQS1aYS16XVtBLVphLXowLTlfXSp8XFxbWzAtOV0rXFxdfFxcLlxcJFsxLTldWzAtOV0qfFxcW1xcJFsxLTldWzAtOV0qXFxdfFxcJFsxLTldWzAtOV0vZ1xuICAgICwgcGF0aE5vZGVUeXBlcyA9IHtcbiAgICAgICAgJy4nOiB7IHN5bnRheDogJ29iamVjdCcsIGVtcHR5OiAne30nIH0sXG4gICAgICAgICdbJzogeyBzeW50YXg6ICdhcnJheScsIGVtcHR5OiAnW10nfSxcbiAgICAgICAgJyonOiB7IHN5bnRheDogJ21hdGNoJywgZW1wdHk6ICd7fSd9LFxuICAgIH07XG5cbmZ1bmN0aW9uIHBhcnNlQWNjZXNzUGF0aChwYXRoLCBub2RlUGFyc2VQYXR0ZXJuKSB7XG4gICAgbm9kZVBhcnNlUGF0dGVybiA9IG5vZGVQYXJzZVBhdHRlcm4gfHwgcGF0aFBhcnNlUGF0dGVybjtcblxuICAgIHZhciBwYXJzZWRQYXRoID0gW107XG5cbiAgICBpZiAoISBwYXRoKVxuICAgICAgICByZXR1cm4gcGFyc2VkUGF0aDtcblxuICAgIHZhciB1bnBhcnNlZCA9IHBhdGgucmVwbGFjZShub2RlUGFyc2VQYXR0ZXJuLCBmdW5jdGlvbihub2RlU3RyKSB7XG4gICAgICAgIHZhciBwYXRoTm9kZSA9IHsgcHJvcGVydHk6IG5vZGVTdHIgfTtcbiAgICAgICAgXy5leHRlbmQocGF0aE5vZGUsIHBhdGhOb2RlVHlwZXNbbm9kZVN0clswXV0pO1xuICAgICAgICBpZiAobm9kZVN0clsxXSA9PSAnJCcpXG4gICAgICAgICAgICBwYXRoTm9kZS5pbnRlcnBvbGF0ZSA9IGdldFBhdGhOb2RlS2V5KHBhdGhOb2RlLCB0cnVlKTtcblxuICAgICAgICBwYXJzZWRQYXRoLnB1c2gocGF0aE5vZGUpO1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfSk7XG4gICAgaWYgKHVucGFyc2VkKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2luY29ycmVjdCBtb2RlbCBwYXRoOiAnICsgcGF0aCk7XG5cbiAgICByZXR1cm4gcGFyc2VkUGF0aDtcbn1cblxuXG52YXIgbm9kZVJlZ2V4ID0ge1xuICAgICcuKic6IHByb3BlcnR5UGF0aFN5bnRheCxcbiAgICAnWypdJzogYXJyYXlQYXRoU3ludGF4XG59O1xubm9kZVJlZ2V4WycqJ10gPSBub2RlUmVnZXhbJy4qJ10gKyAnfCcgKyBub2RlUmVnZXhbJ1sqXSddO1xuXG5mdW5jdGlvbiBjcmVhdGVSZWdleFBhdGgocGF0aCkge1xuICAgIGNoZWNrKHBhdGgsIE1hdGNoLk9uZU9mKFN0cmluZywgUmVnRXhwKSk7XG5cbiAgICBpZiAocGF0aCBpbnN0YW5jZW9mIFJlZ0V4cCB8fCBwYXRoLmluZGV4T2YoJyonKSA9PSAtMSlcbiAgICAgICAgcmV0dXJuIHBhdGg7XG5cbiAgICB2YXIgcGFyc2VkUGF0aCA9IHBhdGhVdGlscy5wYXJzZUFjY2Vzc1BhdGgocGF0aCwgcGF0dGVyblBhdGhQYXJzZVBhdHRlcm4pXG4gICAgICAgICwgcmVnZXhTdHIgPSAnXidcbiAgICAgICAgLy8gLCByZWdleFN0ckVuZCA9ICcnXG4gICAgICAgICwgcGF0dGVybnNTdGFydGVkID0gZmFsc2U7XG5cbiAgICBwYXJzZWRQYXRoLmZvckVhY2goZnVuY3Rpb24ocGF0aE5vZGUpIHtcbiAgICAgICAgdmFyIHByb3AgPSBwYXRoTm9kZS5wcm9wZXJ0eVxuICAgICAgICAgICAgLCByZWdleCA9IG5vZGVSZWdleFtwcm9wXTtcbiAgICAgICAgXG4gICAgICAgIGlmIChyZWdleCkge1xuICAgICAgICAgICAgLy8gcmVnZXhTdHIgKz0gJygnICsgcmVnZXg7XG4gICAgICAgICAgICAvLyByZWdleFN0ckVuZCArPSAnfCknO1xuICAgICAgICAgICAgcmVnZXhTdHIgKz0gJygnICsgcmVnZXggKyAnfCknO1xuICAgICAgICAgICAgLy8gcmVnZXhTdHJFbmQgKz0gJ3wpJztcbiAgICAgICAgICAgIHBhdHRlcm5zU3RhcnRlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpZiAocGF0dGVybnNTdGFydGVkKVxuICAgICAgICAgICAgLy8gIHRocm93IG5ldyBFcnJvcignXCIqXCIgcGF0aCBzZWdtZW50IGNhbm5vdCBiZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBwYXRoOiAnICsgcGF0aCk7XG4gICAgICAgICAgICByZWdleFN0ciArPSBwcm9wLnJlcGxhY2UoLyhcXC58XFxbfFxcXSkvZywgJ1xcXFwkMScpOyAvLyBhZGQgc2xhc2ggaW4gZnJvbnQgb2Ygc3ltYm9scyB0aGF0IGhhdmUgc3BlY2lhbCBtZWFuaW5nIGluIHJlZ2V4XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlZ2V4U3RyICs9IC8qIHJlZ2V4U3RyRW5kICsgKi8gJyQnO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAocmVnZXhTdHIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5cXCd0IGNvbnN0cnVjdCByZWdleCBmb3IgcGF0aCBwYXR0ZXJuOiAnICsgcGF0aCk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIGdldFBhdGhOb2RlS2V5KHBhdGhOb2RlLCBpbnRlcnBvbGF0ZWQpIHtcbiAgICB2YXIgcHJvcCA9IHBhdGhOb2RlLnByb3BlcnR5XG4gICAgICAgICwgc3RhcnRJbmRleCA9IGludGVycG9sYXRlZCA/IDIgOiAxO1xuICAgIHJldHVybiBwYXRoTm9kZS5zeW50YXggPT0gJ2FycmF5J1xuICAgICAgICA/IHByb3Auc2xpY2Uoc3RhcnRJbmRleCwgcHJvcC5sZW5ndGggLSAxKVxuICAgICAgICA6IHByb3Auc2xpY2Uoc3RhcnRJbmRleCk7XG59XG5cblxuLy8gVE9ETyBhbGxvdyBmb3IgbXVsdGlwbGUgbWVzc2FnZXMgaW4gYSBzdHJpbmdcbmZ1bmN0aW9uIHdyYXBNZXNzZW5nZXJNZXRob2RzKG1ldGhvZHNOYW1lcykge1xuICAgIG1ldGhvZHNOYW1lcyA9IG1ldGhvZHNOYW1lcyB8fCBbJ29uJywgJ29mZiddO1xuICAgIHZhciB3cmFwcGVkTWV0aG9kcyA9IF8ubWFwVG9PYmplY3QobWV0aG9kc05hbWVzLCBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgICAgIHZhciBvcmlnTWV0aG9kID0gdGhpc1ttZXRob2ROYW1lXTtcbiAgICAgICAgLy8gcmVwbGFjaW5nIG1lc3NhZ2Ugc3Vic3JpYmUvdW5zdWJzY3JpYmUvZXRjLiB0byBjb252ZXJ0IFwiKlwiIG1lc3NhZ2UgcGF0dGVybnMgdG8gcmVnZXhwc1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24ocGF0aCwgc3Vic2NyaWJlcikge1xuICAgICAgICAgICAgdmFyIHJlZ2V4UGF0aCA9IGNyZWF0ZVJlZ2V4UGF0aChwYXRoKTtcbiAgICAgICAgICAgIG9yaWdNZXRob2QuY2FsbCh0aGlzLCByZWdleFBhdGgsIHN1YnNjcmliZXIpO1xuICAgICAgICB9O1xuICAgIH0sIHRoaXMpO1xuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB3cmFwcGVkTWV0aG9kcyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBwYXRoVXRpbHMgPSByZXF1aXJlKCcuLi9wYXRoX3V0aWxzJylcbiAgICAsIG1vZGVsVXRpbHMgPSByZXF1aXJlKCcuLi9tb2RlbF91dGlscycpXG4gICAgLCBsb2dnZXIgPSByZXF1aXJlKCcuLi8uLi91dGlsL2xvZ2dlcicpXG4gICAgLCBmcyA9IHJlcXVpcmUoJ2ZzJylcbiAgICAsIGRvVCA9IHJlcXVpcmUoJ2RvdCcpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJylcbiAgICAsIGNoYW5nZURhdGFIYW5kbGVyID0gcmVxdWlyZSgnLi4vY2hhbmdlX2RhdGEnKVxuICAgICwgZ2V0VHJhbnNhY3Rpb25GbGFnID0gY2hhbmdlRGF0YUhhbmRsZXIuZ2V0VHJhbnNhY3Rpb25GbGFnXG4gICAgLCBwb3N0VHJhbnNhY3Rpb25GaW5pc2hlZCA9IGNoYW5nZURhdGFIYW5kbGVyLnBvc3RUcmFuc2FjdGlvbkZpbmlzaGVkO1xuXG5cbi8qKlxuICogVGVtcGxhdGVzIHRvIHN5bnRoZXNpemUgbW9kZWwgZ2V0dGVycyBhbmQgc2V0dGVyc1xuICovXG52YXIgdGVtcGxhdGVzID0ge1xuICAgIGdldDogXCIndXNlIHN0cmljdCc7XFxuLyogT25seSB1c2UgdGhpcyBzdHlsZSBvZiBjb21tZW50cywgbm90IFxcXCIvL1xcXCIgKi9cXG5cXG5tZXRob2QgPSBmdW5jdGlvbiBnZXQoKSB7XFxuICAgIHZhciBtID0ge3sjIGRlZi5tb2RlbEFjY2Vzc1ByZWZpeCB9fTtcXG4gICAgcmV0dXJuIG0ge3t+IGl0LnBhcnNlZFBhdGggOnBhdGhOb2RlIH19XFxuICAgICAgICB7ez8gcGF0aE5vZGUuaW50ZXJwb2xhdGV9fVxcbiAgICAgICAgICAgICYmIChtID0gbVt0aGlzLl9hcmdzWyB7ez0gcGF0aE5vZGUuaW50ZXJwb2xhdGUgfX0gXV0pXFxuICAgICAgICB7ez8/fX1cXG4gICAgICAgICAgICAmJiAobSA9IG17ez0gcGF0aE5vZGUucHJvcGVydHkgfX0pXFxuICAgICAgICB7ez99fSB7e359fTtcXG59O1xcblwiLFxuICAgIHNldDogXCIndXNlIHN0cmljdCc7XFxuLyogT25seSB1c2UgdGhpcyBzdHlsZSBvZiBjb21tZW50cywgbm90IFxcXCIvL1xcXCIgKi9cXG5cXG57eyMgZGVmLmluY2x1ZGVfZGVmaW5lcyB9fVxcbnt7IyBkZWYuaW5jbHVkZV9jcmVhdGVfdHJlZSB9fVxcblxcblxcbi8qKlxcbiAqIFRlbXBsYXRlIHRoYXQgc3ludGhlc2l6ZXMgc2V0dGVyIGZvciBNb2RlbCBhbmQgZm9yIE1vZGVsUGF0aFxcbiAqL1xcbm1ldGhvZCA9IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xcbiAgICB7eyMgZGVmLmluaXRWYXJzOidzZXQnIH19XFxuXFxuICAgIHt7IyBkZWYuY3JlYXRlVHJlZTonc2V0JyB9fVxcblxcbiAgICB7e1xcbiAgICAgICAgY3Vyck5vZGUgPSBuZXh0Tm9kZTtcXG4gICAgICAgIGN1cnJQcm9wID0gY3Vyck5vZGUgJiYgY3Vyck5vZGUucHJvcGVydHk7XFxuICAgIH19XFxuXFxuICAgIHt7IC8qIGFzc2lnbiB2YWx1ZSB0byB0aGUgbGFzdCBwcm9wZXJ0eSAqLyB9fVxcbiAgICB7ez8gY3VyclByb3AgfX1cXG4gICAgICAgIHdhc0RlZiA9IHt7IyBkZWYud2FzRGVmaW5lZH19O1xcbiAgICAgICAge3sjIGRlZi5jaGFuZ2VBY2Nlc3NQYXRoIH19XFxuXFxuICAgICAgICB2YXIgb2xkID0gbXt7IyBkZWYuY3VyclByb3AgfX07XFxuXFxuICAgICAgICB7eyAvKiBjbG9uZSB2YWx1ZSB0byBwcmV2ZW50IHNhbWUgcmVmZXJlbmNlIGluIGxpbmtlZCBtb2RlbHMgKi8gfX1cXG4gICAgICAgIG17eyMgZGVmLmN1cnJQcm9wIH19ID0gY2xvbmVUcmVlKHZhbHVlKTtcXG4gICAge3s/fX1cXG5cXG4gICAge3sgLyogYWRkIG1lc3NhZ2UgcmVsYXRlZCB0byB0aGUgbGFzdCBwcm9wZXJ0eSBjaGFuZ2UgKi8gfX1cXG4gICAgaWYgKHRoaXMuX29wdGlvbnMucmVhY3RpdmUgIT09IGZhbHNlKSB7XFxuICAgICAgICBpZiAoISB3YXNEZWYpXFxuICAgICAgICAgICAge3sjIGRlZi5hZGRNc2cgfX0gYWNjZXNzUGF0aCwgdHlwZTogJ2FkZGVkJyxcXG4gICAgICAgICAgICAgICAgbmV3VmFsdWU6IHZhbHVlIH0pO1xcbiAgICAgICAgZWxzZSBpZiAob2xkICE9IHZhbHVlKVxcbiAgICAgICAgICAgIHt7IyBkZWYuYWRkTXNnIH19IGFjY2Vzc1BhdGgsIHR5cGU6ICdjaGFuZ2VkJyxcXG4gICAgICAgICAgICAgICAgb2xkVmFsdWU6IG9sZCwgbmV3VmFsdWU6IHZhbHVlIH0pO1xcblxcbiAgICAgICAge3sgLyogYWRkIG1lc3NhZ2UgcmVsYXRlZCB0byBjaGFuZ2VzIGluIChzdWIpcHJvcGVydGllcyBpbnNpZGUgcmVtb3ZlZCBhbmQgYXNzaWduZWQgdmFsdWUgKi8gfX1cXG4gICAgICAgIGlmICghIHdhc0RlZiB8fCBvbGQgIT0gdmFsdWUpXFxuICAgICAgICAgICAgYWRkVHJlZUNoYW5nZXNNZXNzYWdlcyhtZXNzYWdlcywgbWVzc2FnZXNIYXNoLFxcbiAgICAgICAgICAgICAgICBhY2Nlc3NQYXRoLCBvbGQsIHZhbHVlKTsgLyogZGVmaW5lZCBpbiB0aGUgZnVuY3Rpb24gdGhhdCBzeW50aGVzaXplcyBNb2RlbFBhdGggc2V0dGVyICovXFxuXFxuICAgICAgICB7eyAvKiBwb3N0IGFsbCBzdG9yZWQgbWVzc2FnZXMgKi8gfX1cXG4gICAgICAgIHt7IyBkZWYucG9zdE1lc3NhZ2VzIH19XFxuICAgIH1cXG59O1xcblwiLFxuICAgIGRlbDogXCIndXNlIHN0cmljdCc7XFxuLyogT25seSB1c2UgdGhpcyBzdHlsZSBvZiBjb21tZW50cywgbm90IFxcXCIvL1xcXCIgKi9cXG5cXG57eyMgZGVmLmluY2x1ZGVfZGVmaW5lcyB9fVxcbnt7IyBkZWYuaW5jbHVkZV90cmF2ZXJzZV90cmVlIH19XFxuXFxubWV0aG9kID0gZnVuY3Rpb24gZGVsKCkge1xcbiAgICB7eyMgZGVmLmluaXRWYXJzOidkZWwnIH19XFxuXFxuICAgIHt7PyBpdC5wYXJzZWRQYXRoLmxlbmd0aCB9fVxcbiAgICAgICAge3sjIGRlZi50cmF2ZXJzZVRyZWUgfX1cXG5cXG4gICAgICAgIHt7XFxuICAgICAgICAgICAgdmFyIGN1cnJOb2RlID0gaXQucGFyc2VkUGF0aFtjb3VudF07XFxuICAgICAgICAgICAgdmFyIGN1cnJQcm9wID0gY3Vyck5vZGUucHJvcGVydHk7ICAgICAgIFxcbiAgICAgICAgfX1cXG5cXG4gICAgICAgIGlmICghIHRyZWVEb2VzTm90RXhpc3QgJiYgbSAmJiBtLmhhc093blByb3BlcnR5ICYmIHt7IyBkZWYud2FzRGVmaW5lZH19KSB7XFxuICAgICAgICAgICAgdmFyIG9sZCA9IG17eyMgZGVmLmN1cnJQcm9wIH19O1xcbiAgICAgICAgICAgIGRlbGV0ZSBte3sjIGRlZi5jdXJyUHJvcCB9fTtcXG4gICAgICAgICAgICB7eyMgZGVmLmNoYW5nZUFjY2Vzc1BhdGggfX1cXG4gICAgICAgICAgICB2YXIgZGlkRGVsZXRlID0gdHJ1ZTtcXG4gICAgICAgIH1cXG4gICAge3s/P319XFxuICAgICAgICBpZiAodHlwZW9mIG0gIT0gJ3VuZGVmaW5lZCcpIHtcXG4gICAgICAgICAgICB2YXIgb2xkID0gbTtcXG4gICAgICAgICAgICB7eyMgZGVmLm1vZGVsQWNjZXNzUHJlZml4IH19ID0gdW5kZWZpbmVkO1xcbiAgICAgICAgICAgIHZhciBkaWREZWxldGUgPSB0cnVlO1xcbiAgICAgICAgfVxcbiAgICB7ez99fVxcblxcbiAgICBpZiAoZGlkRGVsZXRlICYmIHRoaXMuX29wdGlvbnMucmVhY3RpdmUgIT09IGZhbHNlKSB7XFxuICAgICAgICB7eyMgZGVmLmFkZE1zZyB9fSBhY2Nlc3NQYXRoLCB0eXBlOiAnZGVsZXRlZCcsIG9sZFZhbHVlOiBvbGQgfSk7XFxuXFxuICAgICAgICBhZGRUcmVlQ2hhbmdlc01lc3NhZ2VzKG1lc3NhZ2VzLCBtZXNzYWdlc0hhc2gsXFxuICAgICAgICAgICAgYWNjZXNzUGF0aCwgb2xkLCB1bmRlZmluZWQpOyAvKiBkZWZpbmVkIGluIHRoZSBmdW5jdGlvbiB0aGF0IHN5bnRoZXNpemVzIE1vZGVsUGF0aCBzZXR0ZXIgKi9cXG5cXG4gICAgICAgIHt7IC8qIHBvc3QgYWxsIHN0b3JlZCBtZXNzYWdlcyAqLyB9fVxcbiAgICAgICAge3sjIGRlZi5wb3N0TWVzc2FnZXMgfX1cXG4gICAgfVxcbn07XFxuXCIsXG4gICAgc3BsaWNlOiBcIid1c2Ugc3RyaWN0JztcXG4vKiBPbmx5IHVzZSB0aGlzIHN0eWxlIG9mIGNvbW1lbnRzLCBub3QgXFxcIi8vXFxcIiAqL1xcblxcbnt7IyBkZWYuaW5jbHVkZV9kZWZpbmVzIH19XFxue3sjIGRlZi5pbmNsdWRlX2NyZWF0ZV90cmVlIH19XFxue3sjIGRlZi5pbmNsdWRlX3RyYXZlcnNlX3RyZWUgfX1cXG5cXG5tZXRob2QgPSBmdW5jdGlvbiBzcGxpY2Uoc3BsaWNlSW5kZXgsIHNwbGljZUhvd01hbnkpIHsgLyogLC4uLiAtIGV4dHJhIGFyZ3VtZW50cyB0byBzcGxpY2UgaW50byBhcnJheSAqL1xcbiAgICB7eyMgZGVmLmluaXRWYXJzOidzcGxpY2UnIH19XFxuXFxuICAgIHZhciBhcmdzTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcXG4gICAgdmFyIGFkZEl0ZW1zID0gYXJnc0xlbiA+IDI7XFxuXFxuICAgIGlmIChhZGRJdGVtcykge1xcbiAgICAgICAge3sgLyogb25seSBjcmVhdGUgbW9kZWwgdHJlZSBpZiBpdGVtcyBhcmUgaW5zZXJ0ZWQgaW4gYXJyYXkgKi8gfX1cXG5cXG4gICAgICAgIHt7IC8qIGlmIG1vZGVsIGlzIHVuZGVmaW5lZCBpdCB3aWxsIGJlIHNldCB0byBhbiBlbXB0eSBhcnJheSAqLyB9fSAgXFxuICAgICAgICB2YXIgdmFsdWUgPSBbXTtcXG4gICAgICAgIHt7IyBkZWYuY3JlYXRlVHJlZTonc3BsaWNlJyB9fVxcblxcbiAgICAgICAge3s/IG5leHROb2RlIH19XFxuICAgICAgICAgICAge3tcXG4gICAgICAgICAgICAgICAgdmFyIGN1cnJOb2RlID0gbmV4dE5vZGU7XFxuICAgICAgICAgICAgICAgIHZhciBjdXJyUHJvcCA9IGN1cnJOb2RlLnByb3BlcnR5O1xcbiAgICAgICAgICAgICAgICB2YXIgZW1wdHlQcm9wID0gJ1tdJztcXG4gICAgICAgICAgICB9fVxcblxcbiAgICAgICAgICAgIHt7IyBkZWYuY3JlYXRlVHJlZVN0ZXAgfX1cXG4gICAgICAgIHt7P319XFxuXFxuICAgIH0gZWxzZSBpZiAoc3BsaWNlSG93TWFueSA+IDApIHtcXG4gICAgICAgIHt7IC8qIGlmIGl0ZW1zIGFyZSBub3QgaW5zZXJ0ZWQsIG9ubHkgdHJhdmVyc2UgbW9kZWwgdHJlZSBpZiBpdGVtcyBhcmUgZGVsZXRlZCBmcm9tIGFycmF5ICovIH19XFxuICAgICAgICB7ez8gaXQucGFyc2VkUGF0aC5sZW5ndGggfX1cXG4gICAgICAgICAgICB7eyMgZGVmLnRyYXZlcnNlVHJlZSB9fVxcblxcbiAgICAgICAgICAgIHt7XFxuICAgICAgICAgICAgICAgIHZhciBjdXJyTm9kZSA9IGl0LnBhcnNlZFBhdGhbY291bnRdO1xcbiAgICAgICAgICAgICAgICB2YXIgY3VyclByb3AgPSBjdXJyTm9kZS5wcm9wZXJ0eTsgICAgICAgXFxuICAgICAgICAgICAgfX1cXG5cXG4gICAgICAgICAgICB7eyAvKiBleHRyYSBicmFjZSBjbG9zZXMgJ2Vsc2UnIGluIGRlZi50cmF2ZXJzZVRyZWVTdGVwICovIH19XFxuICAgICAgICAgICAge3sjIGRlZi50cmF2ZXJzZVRyZWVTdGVwIH19IH1cXG4gICAgICAgIHt7P319XFxuICAgIH1cXG5cXG4gICAge3sgLyogc3BsaWNlIGl0ZW1zICovIH19XFxuICAgIGlmIChhZGRJdGVtcyB8fCAoISB0cmVlRG9lc05vdEV4aXN0ICYmIG1cXG4gICAgICAgICAgICAmJiBtLmxlbmd0aCA+IHNwbGljZUluZGV4ICkgKSB7XFxuICAgICAgICB2YXIgb2xkTGVuZ3RoID0gbS5sZW5ndGggPSBtLmxlbmd0aCB8fCAwO1xcblxcbiAgICAgICAgYXJndW1lbnRzWzBdID0gc3BsaWNlSW5kZXggPSBub3JtYWxpemVTcGxpY2VJbmRleChzcGxpY2VJbmRleCwgbS5sZW5ndGgpO1xcblxcbiAgICAgICAge3sgLyogY2xvbmUgYWRkZWQgYXJndW1lbnRzIHRvIHByZXZlbnQgc2FtZSByZWZlcmVuY2VzIGluIGxpbmtlZCBtb2RlbHMgKi8gfX1cXG4gICAgICAgIGlmIChhZGRJdGVtcylcXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3NMZW47IGkrKylcXG4gICAgICAgICAgICAgICAgYXJndW1lbnRzW2ldID0gY2xvbmVUcmVlKGFyZ3VtZW50c1tpXSk7XFxuXFxuICAgICAgICB7eyAvKiBhY3R1YWwgc3BsaWNlIGNhbGwgKi8gfX1cXG4gICAgICAgIHZhciByZW1vdmVkID0gQXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShtLCBhcmd1bWVudHMpO1xcblxcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMucmVhY3RpdmUgIT09IGZhbHNlKSB7XFxuICAgICAgICAgICAge3sjIGRlZi5hZGRNc2cgfX0gYWNjZXNzUGF0aCwgdHlwZTogJ3NwbGljZScsXFxuICAgICAgICAgICAgICAgICAgICBpbmRleDogc3BsaWNlSW5kZXgsIHJlbW92ZWQ6IHJlbW92ZWQsIGFkZGVkQ291bnQ6IGFkZEl0ZW1zID8gYXJnc0xlbiAtIDIgOiAwLFxcbiAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWU6IG0gfSk7XFxuXFxuICAgICAgICAgICAgaWYgKHJlbW92ZWQgJiYgcmVtb3ZlZC5sZW5ndGgpXFxuICAgICAgICAgICAgICAgIHJlbW92ZWQuZm9yRWFjaChmdW5jdGlvbihpdGVtLCBpbmRleCkge1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW1QYXRoID0gYWNjZXNzUGF0aCArICdbJyArIChzcGxpY2VJbmRleCArIGluZGV4KSArICddJztcXG4gICAgICAgICAgICAgICAgICAgIHt7IyBkZWYuYWRkTXNnIH19IGl0ZW1QYXRoLCB0eXBlOiAncmVtb3ZlZCcsIG9sZFZhbHVlOiBpdGVtIH0pO1xcblxcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlSXNUcmVlKGl0ZW0pKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1lc3NhZ2VzKG1lc3NhZ2VzLCBtZXNzYWdlc0hhc2gsIGl0ZW1QYXRoLCBpdGVtLCAncmVtb3ZlZCcsICdvbGRWYWx1ZScpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICBpZiAoYWRkSXRlbXMpXFxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJnc0xlbjsgaSsrKSB7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGFyZ3VtZW50c1tpXTtcXG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtUGF0aCA9IGFjY2Vzc1BhdGggKyAnWycgKyAoc3BsaWNlSW5kZXggKyBpIC0gMikgKyAnXSc7XFxuICAgICAgICAgICAgICAgICAgICB7eyMgZGVmLmFkZE1zZyB9fSBpdGVtUGF0aCwgdHlwZTogJ2FkZGVkJywgbmV3VmFsdWU6IGl0ZW0gfSk7XFxuXFxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVJc1RyZWUoaXRlbSkpXFxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWVzc2FnZXMobWVzc2FnZXMsIG1lc3NhZ2VzSGFzaCwgaXRlbVBhdGgsIGl0ZW0sICdhZGRlZCcsICduZXdWYWx1ZScpO1xcbiAgICAgICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAge3sgLyogcG9zdCBhbGwgc3RvcmVkIG1lc3NhZ2VzICovIH19XFxuICAgICAgICAgICAge3sjIGRlZi5wb3N0TWVzc2FnZXMgfX1cXG4gICAgICAgIH1cXG4gICAgfVxcblxcbiAgICByZXR1cm4gcmVtb3ZlZCB8fCBbXTtcXG59XFxuXCJcbn07XG5cbnZhciBpbmNsdWRlX2RlZmluZXMgPSBcIid1c2Ugc3RyaWN0JztcXG4vKiBPbmx5IHVzZSB0aGlzIHN0eWxlIG9mIGNvbW1lbnRzLCBub3QgXFxcIi8vXFxcIiAqL1xcblxcbi8qKlxcbiAqIEluc2VydHMgaW5pdGlhbGl6YXRpb24gY29kZVxcbiAqL1xcbiB7eyMjIGRlZi5pbml0VmFyczptZXRob2Q6XFxuICAgIHZhciBtID0ge3sjIGRlZi5tb2RlbEFjY2Vzc1ByZWZpeCB9fTtcXG4gICAgdmFyIG1lc3NhZ2VzID0gW10sIG1lc3NhZ2VzSGFzaCA9IHt9O1xcbiAgICB2YXIgYWNjZXNzUGF0aCA9ICcnO1xcbiAgICB2YXIgdHJlZURvZXNOb3RFeGlzdDtcXG4gICAgLyogaGFjayB0byBwcmV2ZW50IHNlbmRpbmcgZmluaXNoZWQgZXZlbnRzIHRvIGFsbG93IGZvciBwcm9wYWdhdGlvbiBvZiBiYXRjaGVzIHdpdGhvdXQgc3BsaXR0aW5nIHRoZW0gKi9cXG4gICAgdmFyIGluQ2hhbmdlVHJhbnNhY3Rpb24gPSBnZXRUcmFuc2FjdGlvbkZsYWcoIHt7PSBtZXRob2QgfX0gKTtcXG4gI319XFxuXFxuLyoqXFxuICogSW5zZXJ0cyB0aGUgYmVnaW5uaW5nIG9mIGZ1bmN0aW9uIGNhbGwgdG8gYWRkIG1lc3NhZ2UgdG8gbGlzdFxcbiAqL1xcbnt7IyMgZGVmLmFkZE1zZzogYWRkQ2hhbmdlTWVzc2FnZShtZXNzYWdlcywgbWVzc2FnZXNIYXNoLCB7IHBhdGg6ICN9fVxcblxcbi8qKlxcbiAqIEluc2VydHMgY3VycmVudCBwcm9wZXJ0eS9pbmRleCBmb3IgYm90aCBub3JtYWwgYW5kIGludGVycG9sYXRlZCBwcm9wZXJ0aWVzL2luZGV4ZXNcXG4gKi9cXG57eyMjIGRlZi5jdXJyUHJvcDp7ez8gY3Vyck5vZGUuaW50ZXJwb2xhdGUgfX1bdGhpcy5fYXJnc1sge3s9IGN1cnJOb2RlLmludGVycG9sYXRlIH19IF1de3s/P319e3s9IGN1cnJQcm9wIH19e3s/fX0gI319XFxuXFxuLyoqXFxuICogSW5zZXJ0cyBjb25kaXRpb24gdG8gdGVzdCB3aGV0aGVyIG5vcm1hbC9pbnRlcnBvbGF0ZWQgcHJvcGVydHkvaW5kZXggZXhpc3RzXFxuICovXFxue3sjIyBkZWYud2FzRGVmaW5lZDogbS5oYXNPd25Qcm9wZXJ0eShcXG4gICAge3s/IGN1cnJOb2RlLmludGVycG9sYXRlIH19XFxuICAgICAgICB0aGlzLl9hcmdzWyB7ez0gY3Vyck5vZGUuaW50ZXJwb2xhdGUgfX0gXVxcbiAgICB7ez8/fX1cXG4gICAgICAgICd7ez0gaXQuZ2V0UGF0aE5vZGVLZXkoY3Vyck5vZGUpIH19J1xcbiAgICB7ez99fVxcbikgI319XFxuXFxuXFxuLyoqXFxuICogSW5zZXJ0cyBjb2RlIHRvIHVwZGF0ZSBhY2Nlc3MgcGF0aCBmb3IgY3VycmVudCBwcm9wZXJ0eVxcbiAqIEJlY2F1c2Ugb2YgdGhlIHBvc3NpYmlsaXR5IG9mIGludGVycG9sYXRlZCBwcm9wZXJ0aWVzLCBpdCBjYW4ndCBiZSBjYWxjdWxhdGVkIGluIHRlbXBsYXRlLCBpdCBjYW4gb25seSBiZSBjYWxjdWxhdGVkIGR1cmluZyBhY2Nlc3NvciBjYWxsLlxcbiAqL1xcbnt7IyMgZGVmLmNoYW5nZUFjY2Vzc1BhdGg6XFxuICAgIGFjY2Vzc1BhdGggKz0ge3s/IGN1cnJOb2RlLmludGVycG9sYXRlIH19XFxuICAgICAgICB7ez8gY3Vyck5vZGUuc3ludGF4ID09ICdhcnJheScgfX1cXG4gICAgICAgICAgICAnWycgKyB0aGlzLl9hcmdzWyB7ez0gY3Vyck5vZGUuaW50ZXJwb2xhdGUgfX0gXSArICddJztcXG4gICAgICAgIHt7Pz99fVxcbiAgICAgICAgICAgICcuJyArIHRoaXMuX2FyZ3NbIHt7PSBjdXJyTm9kZS5pbnRlcnBvbGF0ZSB9fSBdO1xcbiAgICAgICAge3s/fX1cXG4gICAge3s/P319XFxuICAgICAgICAne3s9IGN1cnJQcm9wIH19JztcXG4gICAge3s/fX1cXG4jfX1cXG5cXG5cXG4vKipcXG4gKiBJbnNlcnRzIGNvZGUgdG8gcG9zdCBzdG9yZWQgbWVzc2FnZXNcXG4gKi9cXG57eyMjIGRlZi5wb3N0TWVzc2FnZXM6XFxuICAgIGlmIChtZXNzYWdlcy5sZW5ndGgpIHtcXG4gICAgICAgIHt7IyBkZWYubW9kZWxQb3N0QmF0Y2hDb2RlIH19KCdkYXRhY2hhbmdlcycsIHtcXG4gICAgICAgICAgICBjaGFuZ2VzOiBtZXNzYWdlcyxcXG4gICAgICAgICAgICB0cmFuc2FjdGlvbjogaW5DaGFuZ2VUcmFuc2FjdGlvblxcbiAgICAgICAgfSk7XFxuXFxuICAgICAgICBtZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uKG1zZykge1xcbiAgICAgICAgICAgIHt7IyBkZWYubW9kZWxQb3N0TWVzc2FnZUNvZGUgfX0obXNnLnBhdGgsIG1zZyk7XFxuICAgICAgICB9LCB0aGlzKTtcXG4gICAgfVxcbiN9fVxcblwiXG4gICAgLCBpbmNsdWRlX2NyZWF0ZV90cmVlID0gXCIndXNlIHN0cmljdCc7XFxuLyogT25seSB1c2UgdGhpcyBzdHlsZSBvZiBjb21tZW50cywgbm90IFxcXCIvL1xcXCIgKi9cXG5cXG4vKipcXG4gKiBJbnNlcnRzIGNvZGUgdG8gY3JlYXRlIG1vZGVsIHRyZWUgYXMgbmVjY2Vzc2FyeSBmb3IgYHNldGAgYW5kIGBzcGxpY2VgIGFjY2Vzc29ycyBhbmQgdG8gYWRkIG1lc3NhZ2VzIHRvIHNlbmQgbGlzdCBpZiB0aGUgdHJlZSBjaGFuZ2VzLlxcbiAqL1xcbnt7IyMgZGVmLmNyZWF0ZVRyZWU6bWV0aG9kOlxcbiAgICB2YXIgd2FzRGVmID0gdHJ1ZTtcXG4gICAgdmFyIG9sZCA9IG07XFxuXFxuICAgIHt7IHZhciBlbXB0eVByb3AgPSBpdC5wYXJzZWRQYXRoWzBdICYmIGl0LnBhcnNlZFBhdGhbMF0uZW1wdHk7IH19XFxuICAgIHt7PyBlbXB0eVByb3AgfX1cXG4gICAgICAgIHt7IC8qIGNyZWF0ZSB0b3AgbGV2ZWwgbW9kZWwgaWYgaXQgd2FzIG5vdCBwcmV2aW91c2x5IGRlZmluZWQgKi8gfX1cXG4gICAgICAgIGlmICghIG0pIHtcXG4gICAgICAgICAgICBtID0ge3sjIGRlZi5tb2RlbEFjY2Vzc1ByZWZpeCB9fSA9IHt7PSBlbXB0eVByb3AgfX07XFxuICAgICAgICAgICAgd2FzRGVmID0gZmFsc2U7XFxuXFxuICAgICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMucmVhY3RpdmUgIT09IGZhbHNlKSB7XFxuICAgICAgICAgICAgICAgIHt7IyBkZWYuYWRkTXNnIH19ICcnLCB0eXBlOiAnYWRkZWQnLFxcbiAgICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZTogbSB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIHt7Pz99fVxcbiAgICAgICAge3s/IG1ldGhvZCA9PSAnc3BsaWNlJyB9fVxcbiAgICAgICAgICAgIGlmICghIG0pIHtcXG4gICAgICAgIHt7P319XFxuICAgICAgICAgICAgICAgIG0gPSB7eyMgZGVmLm1vZGVsQWNjZXNzUHJlZml4IH19ID0gY2xvbmVUcmVlKHZhbHVlKTtcXG4gICAgICAgICAgICAgICAgd2FzRGVmID0gdHlwZW9mIG9sZCAhPSAndW5kZWZpbmVkJztcXG4gICAgICAgIHt7PyBtZXRob2QgPT0gJ3NwbGljZScgfX1cXG4gICAgICAgICAgICB9XFxuICAgICAgICB7ez99fSAgICAgICBcXG4gICAge3s/fX1cXG5cXG5cXG4gICAge3sgLyogY3JlYXRlIG1vZGVsIHRyZWUgaWYgaXQgZG9lc24ndCBleGlzdCAqLyB9fVxcbiAgICB7eyAgdmFyIG1vZGVsRGF0YVByb3BlcnR5ID0gJyc7XFxuICAgICAgICB2YXIgbmV4dE5vZGUgPSBpdC5wYXJzZWRQYXRoWzBdO1xcbiAgICAgICAgdmFyIGNvdW50ID0gaXQucGFyc2VkUGF0aC5sZW5ndGggLSAxO1xcblxcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XFxuICAgICAgICAgICAgdmFyIGN1cnJOb2RlID0gbmV4dE5vZGU7XFxuICAgICAgICAgICAgdmFyIGN1cnJQcm9wID0gY3Vyck5vZGUucHJvcGVydHk7XFxuICAgICAgICAgICAgbmV4dE5vZGUgPSBpdC5wYXJzZWRQYXRoW2kgKyAxXTtcXG4gICAgICAgICAgICB2YXIgZW1wdHlQcm9wID0gbmV4dE5vZGUgJiYgbmV4dE5vZGUuZW1wdHk7XFxuICAgIH19XFxuXFxuICAgICAgICB7eyMgZGVmLmNyZWF0ZVRyZWVTdGVwIH19XFxuXFxuICAgIHt7ICB9IC8qIGZvciBsb29wICovIH19XFxuI319XFxuXFxuXFxuLyoqXFxuICogSW5zZXJ0cyBjb2RlIHRvIGNyZWF0ZSBvbmUgc3RlcCBpbiB0aGUgbW9kZWwgdHJlZVxcbiAqL1xcbnt7IyMgZGVmLmNyZWF0ZVRyZWVTdGVwOlxcbiAgICB7eyMgZGVmLmNoYW5nZUFjY2Vzc1BhdGggfX1cXG5cXG4gICAgaWYgKCEge3sjIGRlZi53YXNEZWZpbmVkIH19KSB7IFxcbiAgICAgICAge3sgLyogcHJvcGVydHkgZG9lcyBub3QgZXhpc3QgKi8gfX1cXG4gICAgICAgIG0gPSBte3sjIGRlZi5jdXJyUHJvcCB9fSA9IHt7PSBlbXB0eVByb3AgfX07XFxuXFxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5yZWFjdGl2ZSAhPT0gZmFsc2UpIHtcXG4gICAgICAgICAgICB7eyMgZGVmLmFkZE1zZyB9fSBhY2Nlc3NQYXRoLCB0eXBlOiAnYWRkZWQnLCBcXG4gICAgICAgICAgICAgICAgICBuZXdWYWx1ZTogbSB9KTtcXG4gICAgICAgIH1cXG5cXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbXt7IyBkZWYuY3VyclByb3AgfX0gIT0gJ29iamVjdCcpIHtcXG4gICAgICAgIHt7IC8qIHByb3BlcnR5IGlzIG5vdCBvYmplY3QgKi8gfX1cXG4gICAgICAgIHZhciBvbGQgPSBte3sjIGRlZi5jdXJyUHJvcCB9fTtcXG4gICAgICAgIG0gPSBte3sjIGRlZi5jdXJyUHJvcCB9fSA9IHt7PSBlbXB0eVByb3AgfX07XFxuXFxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5yZWFjdGl2ZSAhPT0gZmFsc2UpIHtcXG4gICAgICAgICAgICB7eyMgZGVmLmFkZE1zZyB9fSBhY2Nlc3NQYXRoLCB0eXBlOiAnY2hhbmdlZCcsIFxcbiAgICAgICAgICAgICAgICAgIG9sZFZhbHVlOiBvbGQsIG5ld1ZhbHVlOiBtIH0pO1xcbiAgICAgICAgfVxcblxcbiAgICB9IGVsc2Uge1xcbiAgICAgICAge3sgLyogcHJvcGVydHkgZXhpc3RzLCBqdXN0IHRyYXZlcnNlIGRvd24gdGhlIG1vZGVsIHRyZWUgKi8gfX1cXG4gICAgICAgIG0gPSBte3sjIGRlZi5jdXJyUHJvcCB9fTtcXG4gICAgfVxcbiN9fVxcblwiXG4gICAgLCBpbmNsdWRlX3RyYXZlcnNlX3RyZWUgPSBcIid1c2Ugc3RyaWN0JztcXG4vKiBPbmx5IHVzZSB0aGlzIHN0eWxlIG9mIGNvbW1lbnRzLCBub3QgXFxcIi8vXFxcIiAqL1xcblxcbi8qKlxcbiAqIEluc2VydHMgY29kZSB0byB0cmF2ZXJzZSBtb2RlbCB0cmVlIGZvciBgZGVsZXRlYCBhbmQgYHNwbGljZWAgYWNjZXNzb3JzLlxcbiAqL1xcbnt7IyMgZGVmLnRyYXZlcnNlVHJlZTpcXG4gICAge3sgXFxuICAgICAgICB2YXIgY291bnQgPSBpdC5wYXJzZWRQYXRoLmxlbmd0aC0xO1xcblxcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7IFxcbiAgICAgICAgICAgIHZhciBjdXJyTm9kZSA9IGl0LnBhcnNlZFBhdGhbaV07XFxuICAgICAgICAgICAgdmFyIGN1cnJQcm9wID0gY3Vyck5vZGUucHJvcGVydHk7XFxuICAgIH19XFxuICAgICAgICAgICAge3sjIGRlZi50cmF2ZXJzZVRyZWVTdGVwIH19XFxuXFxuICAgIHt7IH0gLyogZm9yIGxvb3AgKi9cXG5cXG4gICAgICAgIHZhciBpID0gY291bnQ7XFxuICAgICAgICB3aGlsZSAoaS0tKSB7IC8qIGNsb3NpbmcgYnJhY2VzIGZvciBlbHNlJ3MgYWJvdmUgKi9cXG4gICAgfX1cXG4gICAgICAgICAgICB9XFxuICAgIHt7IH0gLyogd2hpbGUgbG9vcCAqLyB9fVxcbiN9fVxcblxcblxcbi8qKlxcbiAqIEluc2VydHMgY29kZSB0byB0cmF2ZXJzZSBvbmUgc3RlcCBpbiB0aGUgbW9kZWwgdHJlZVxcbiAqL1xcbnt7IyMgZGVmLnRyYXZlcnNlVHJlZVN0ZXA6XFxuICAgIGlmICghIChtICYmIG0uaGFzT3duUHJvcGVydHkgJiYge3sjIGRlZi53YXNEZWZpbmVkfX0gKSApXFxuICAgICAgICB0cmVlRG9lc05vdEV4aXN0ID0gdHJ1ZTtcXG4gICAgZWxzZSB7XFxuICAgICAgICBtID0gbXt7IyBkZWYuY3VyclByb3AgfX07XFxuICAgICAgICB7eyMgZGVmLmNoYW5nZUFjY2Vzc1BhdGggfX1cXG4gICAge3sgLyogYnJhY2UgZnJvbSBlbHNlIGlzIG5vdCBjbG9zZWQgb24gcHVycG9zZSAtIGFsbCBicmFjZXMgYXJlIGNsb3NlZCBpbiB3aGlsZSBsb29wICovIH19XFxuI319XFxuXCI7XG5cbnZhciBkb3REZWYgPSB7XG4gICAgaW5jbHVkZV9kZWZpbmVzOiBpbmNsdWRlX2RlZmluZXMsXG4gICAgaW5jbHVkZV9jcmVhdGVfdHJlZTogaW5jbHVkZV9jcmVhdGVfdHJlZSxcbiAgICBpbmNsdWRlX3RyYXZlcnNlX3RyZWU6IGluY2x1ZGVfdHJhdmVyc2VfdHJlZSxcbiAgICBnZXRQYXRoTm9kZUtleTogcGF0aFV0aWxzLmdldFBhdGhOb2RlS2V5LFxuICAgIG1vZGVsQWNjZXNzUHJlZml4OiAndGhpcy5fbW9kZWwuX2RhdGEnLFxuICAgIG1vZGVsUG9zdE1lc3NhZ2VDb2RlOiAndGhpcy5fbW9kZWwuX2ludGVybmFsTWVzc2VuZ2VyLnBvc3RNZXNzYWdlJyxcbiAgICBtb2RlbFBvc3RCYXRjaENvZGU6ICd0aGlzLl9tb2RlbC5wb3N0TWVzc2FnZVN5bmMnLFxuICAgIGludGVybmFsTWVzc2VuZ2VyOiAndGhpcy5fbW9kZWwuX2ludGVybmFsTWVzc2VuZ2VyJ1xufTtcblxudmFyIG1vZGVsRG90RGVmID0gXyhkb3REZWYpLmNsb25lKCkuZXh0ZW5kKHtcbiAgICBtb2RlbEFjY2Vzc1ByZWZpeDogJ3RoaXMuX2RhdGEnLFxuICAgIG1vZGVsUG9zdE1lc3NhZ2VDb2RlOiAndGhpcy5faW50ZXJuYWxNZXNzZW5nZXIucG9zdE1lc3NhZ2UnLFxuICAgIG1vZGVsUG9zdEJhdGNoQ29kZTogJ3RoaXMucG9zdE1lc3NhZ2VTeW5jJyxcbiAgICBpbnRlcm5hbE1lc3NlbmdlcjogJ3RoaXMuX2ludGVybmFsTWVzc2VuZ2VyJ1xufSkuXygpO1xuXG5cbnZhciBkb3RTZXR0aW5ncyA9IF8uY2xvbmUoZG9ULnRlbXBsYXRlU2V0dGluZ3MpO1xuZG90U2V0dGluZ3Muc3RyaXAgPSBmYWxzZTtcblxudmFyIHN5bnRoZXNpemVycyA9IF8ubWFwS2V5cyh0ZW1wbGF0ZXMsIGZ1bmN0aW9uKHRtcGwpIHtcbiAgICByZXR1cm4gZG9ULnRlbXBsYXRlKHRtcGwsIGRvdFNldHRpbmdzLCBkb3REZWYpOyBcbn0pO1xuXG5cbnZhciBtb2RlbFN5bnRoZXNpemVycyA9IF8ubWFwVG9PYmplY3QoWydzZXQnLCAnZGVsJywgJ3NwbGljZSddLCBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgcmV0dXJuIGRvVC50ZW1wbGF0ZSh0ZW1wbGF0ZXNbbWV0aG9kTmFtZV0sIGRvdFNldHRpbmdzLCBtb2RlbERvdERlZik7XG59KTtcblxuXG4vKipcbiAqIEZ1bmN0aW9uIHRoYXQgc3ludGhlc2l6ZXMgYWNjZXNzb3IgbWV0aG9kcy5cbiAqIEZ1bmN0aW9uIGlzIG1lbW9pemVkIHNvIGFjY2Vzc29ycyBhcmUgY2FjaGVkICh1cCB0byAxMDAwKS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aCBNb2RlbC9Nb2RlbFBhdGggYWNjZXNzIHBhdGhcbiAqIEBwYXJhbSB7QXJyYXl9IHBhcnNlZFBhdGggYXJyYXkgb2YgcGF0aCBub2Rlc1xuICogQHJldHVybiB7T2JqZWN0W0Z1bmN0aW9uXX1cbiAqL1xudmFyIHN5bnRoZXNpemVQYXRoTWV0aG9kcyA9IF8ubWVtb2l6ZShfc3ludGhlc2l6ZVBhdGhNZXRob2RzLCB1bmRlZmluZWQsIDEwMDApO1xuXG5mdW5jdGlvbiBfc3ludGhlc2l6ZVBhdGhNZXRob2RzKHBhdGgsIHBhcnNlZFBhdGgpIHtcbiAgICB2YXIgbWV0aG9kcyA9IF8ubWFwS2V5cyhzeW50aGVzaXplcnMsIGZ1bmN0aW9uKHN5bnRoc3pyKSB7XG4gICAgICAgIHJldHVybiBfc3ludGhlc2l6ZShzeW50aHN6ciwgcGF0aCwgcGFyc2VkUGF0aCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG1ldGhvZHM7XG59XG5cblxudmFyIG5vcm1hbGl6ZVNwbGljZUluZGV4ID0gbW9kZWxVdGlscy5ub3JtYWxpemVTcGxpY2VJbmRleDsgLy8gdXNlZCBpbiBzcGxpY2UuZG90LmpzXG5cblxuZnVuY3Rpb24gX3N5bnRoZXNpemUoc3ludGhlc2l6ZXIsIHBhdGgsIHBhcnNlZFBhdGgpIHtcbiAgICB2YXIgbWV0aG9kXG4gICAgICAgICwgbWV0aG9kQ29kZSA9IHN5bnRoZXNpemVyKHtcbiAgICAgICAgICAgIHBhcnNlZFBhdGg6IHBhcnNlZFBhdGgsXG4gICAgICAgICAgICBnZXRQYXRoTm9kZUtleTogcGF0aFV0aWxzLmdldFBhdGhOb2RlS2V5XG4gICAgICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgZXZhbChtZXRob2RDb2RlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IE1vZGVsRXJyb3IoJ01vZGVsUGF0aCBtZXRob2QgY29tcGlsYXRpb24gZXJyb3I7IHBhdGg6ICcgKyBwYXRoICsgJywgY29kZTogJyArIG1ldGhvZENvZGUpO1xuICAgIH1cblxuICAgIHJldHVybiBtZXRob2Q7XG5cblxuICAgIC8vIGZ1bmN0aW9ucyB1c2VkIGJ5IG1ldGhvZHMgYHNldGAsIGBkZWxldGVgIGFuZCBgc3BsaWNlYCAoc3ludGhlc2l6ZWQgYnkgdGVtcGxhdGUpXG4gICAgZnVuY3Rpb24gYWRkQ2hhbmdlTWVzc2FnZShtZXNzYWdlcywgbWVzc2FnZXNIYXNoLCBtc2cpIHtcbiAgICAgICAgbWVzc2FnZXMucHVzaChtc2cpO1xuICAgICAgICBtZXNzYWdlc0hhc2hbbXNnLnBhdGhdID0gbXNnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFRyZWVDaGFuZ2VzTWVzc2FnZXMobWVzc2FnZXMsIG1lc3NhZ2VzSGFzaCwgcm9vdFBhdGgsIG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgICAgICB2YXIgb2xkSXNUcmVlID0gdmFsdWVJc1RyZWUob2xkVmFsdWUpXG4gICAgICAgICAgICAsIG5ld0lzVHJlZSA9IHZhbHVlSXNUcmVlKG5ld1ZhbHVlKTtcblxuICAgICAgICBpZiAobmV3SXNUcmVlKVxuICAgICAgICAgICAgYWRkTWVzc2FnZXMobWVzc2FnZXMsIG1lc3NhZ2VzSGFzaCwgcm9vdFBhdGgsIG5ld1ZhbHVlLCAnYWRkZWQnLCAnbmV3VmFsdWUnKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChvbGRJc1RyZWUpXG4gICAgICAgICAgICBhZGRNZXNzYWdlcyhtZXNzYWdlcywgbWVzc2FnZXNIYXNoLCByb290UGF0aCwgb2xkVmFsdWUsICdyZW1vdmVkJywgJ29sZFZhbHVlJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkTWVzc2FnZXMobWVzc2FnZXMsIG1lc3NhZ2VzSGFzaCwgcm9vdFBhdGgsIG9iaiwgbXNnVHlwZSwgdmFsdWVQcm9wKSB7XG4gICAgICAgIF9hZGRNZXNzYWdlcyhyb290UGF0aCwgb2JqKTtcblxuXG4gICAgICAgIGZ1bmN0aW9uIF9hZGRNZXNzYWdlcyhyb290UGF0aCwgb2JqKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhdGhTeW50YXggPSByb290UGF0aCArICdbJCRdJztcbiAgICAgICAgICAgICAgICBvYmouZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkTWVzc2FnZSh2YWx1ZSwgaW5kZXgsIHBhdGhTeW50YXgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgcGF0aFN5bnRheCA9IHJvb3RQYXRoICsgJy4kJCc7XG4gICAgICAgICAgICAgICAgXy5lYWNoS2V5KG9iaiwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICAgICAgICAgICAgICBhZGRNZXNzYWdlKHZhbHVlLCBrZXksIHBhdGhTeW50YXgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gYWRkTWVzc2FnZSh2YWx1ZSwga2V5LCBwYXRoU3ludGF4KSB7XG4gICAgICAgICAgICB2YXIgcGF0aCA9IHBhdGhTeW50YXgucmVwbGFjZSgnJCQnLCBrZXkpXG4gICAgICAgICAgICAgICAgLCBleGlzdGluZ01zZyA9IG1lc3NhZ2VzSGFzaFtwYXRoXTtcblxuICAgICAgICAgICAgaWYgKGV4aXN0aW5nTXNnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nTXNnLnR5cGUgPT0gbXNnVHlwZSlcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdzZXR0ZXIgZXJyb3I6IHNhbWUgbWVzc2FnZSB0eXBlIHBvc3RlZCBvbiB0aGUgc2FtZSBwYXRoJyk7XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nTXNnLnR5cGUgPSAnY2hhbmdlZCc7XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nTXNnW3ZhbHVlUHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBtc2cgPSB7IHBhdGg6IHBhdGgsIHR5cGU6IG1zZ1R5cGUgfTtcbiAgICAgICAgICAgICAgICBtc2dbdmFsdWVQcm9wXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGFkZENoYW5nZU1lc3NhZ2UobWVzc2FnZXMsIG1lc3NhZ2VzSGFzaCwgbXNnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbHVlSXNUcmVlKHZhbHVlKSlcbiAgICAgICAgICAgICAgICBfYWRkTWVzc2FnZXMocGF0aCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xvbmVUcmVlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZUlzTm9ybWFsT2JqZWN0KHZhbHVlKVxuICAgICAgICAgICAgICAgID8gXy5kZWVwQ2xvbmUodmFsdWUpXG4gICAgICAgICAgICAgICAgOiB2YWx1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm90ZWN0VmFsdWUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuICEgdmFsdWVJc05vcm1hbE9iamVjdCh2YWx1ZSlcbiAgICAgICAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgICAgICAgOiBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA/IHZhbHVlLnNsaWNlKClcbiAgICAgICAgICAgICAgICAgICAgOiBPYmplY3QuY3JlYXRlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWx1ZUlzVHJlZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWVJc05vcm1hbE9iamVjdCh2YWx1ZSlcbiAgICAgICAgICAgICAgICAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbHVlSXNOb3JtYWxPYmplY3QodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGxcbiAgICAgICAgICAgICAgICAmJiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgICAgICYmICEgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSlcbiAgICAgICAgICAgICAgICAmJiAhICh2YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkQmF0Y2hJZHNUb01lc3NhZ2UobXNnLCBiYXRjaElkLCBtc2dJZCkge1xuICAgICAgICBfLmRlZmluZVByb3BlcnRpZXMobXNnLCB7XG4gICAgICAgICAgICBfX2JhdGNoX2lkOiBiYXRjaElkLFxuICAgICAgICAgICAgX19tc2dfaWQ6IG1zZ0lkXG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIEV4cG9ydHMgYHN5bnRoZXNpemVgIGZ1bmN0aW9uIHdpdGggdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAtIC5tb2RlbE1ldGhvZHMuc2V0IC0gYHNldGAgbWV0aG9kIGZvciBNb2RlbFxuICogLSAubW9kZWxNZXRob2RzLmRlbCAtIGBkZWxgIG1ldGhvZCBmb3IgTW9kZWxcbiAqIC0gLm1vZGVsTWV0aG9kcy5zcGxpY2UgLSBgc3BsaWNlYCBtZXRob2QgZm9yIE1vZGVsXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gc3ludGhlc2l6ZVBhdGhNZXRob2RzO1xuXG52YXIgbW9kZWxNZXRob2RzID0gXy5tYXBLZXlzKG1vZGVsU3ludGhlc2l6ZXJzLCBmdW5jdGlvbihzeW50aGVzaXplcikge1xuICAgIHJldHVybiBfc3ludGhlc2l6ZShzeW50aGVzaXplciwgJycsIFtdKTtcbn0pO1xuXG5zeW50aGVzaXplUGF0aE1ldGhvZHMubW9kZWxNZXRob2RzID0gbW9kZWxNZXRob2RzO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIGBtaWxvLnV0aWxzLmNoZWNrYFxuICpcbiAqIENoZWNrIGlzIGEgbW9kdWxlIGZvciBwYXJhbWV0ZXJzIGNoZWNraW5nIGV4dHJhY3RlZCBmcm9tIFtNZXRlb3JdKGh0dHA6Ly9kb2NzLm1ldGVvci5jb20vKSBmcmFtZXdvcmsuXG4gKlxuICogSXQgYWxsb3dzIHRvIGJvdGggZG9jdW1lbnQgYW5kIHRvIGNoZWNrIHBhcmFtZXRlciB0eXBlcyBpbiB5b3VyIGZ1bmN0aW9uXG4gKiBtYWtpbmcgY29kZSBib3RoIHJlYWRhYmxlIGFuZCBzdGFibGUuXG4gKlxuICpcbiAqICMjIyBVc2FnZVxuICpgYGBcbiAqIHZhciBjaGVjayA9IG1pbG8uY2hlY2tcbiAqICAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2g7XG4gKlxuICogZnVuY3Rpb24gTXkobmFtZSwgb2JqLCBjYikge1xuICogICAgIC8vIGlmIGFueSBvZiBjaGVja3MgZmFpbCBhbiBlcnJvciB3aWxsIGJlIHRocm93blxuICogICAgIGNoZWNrKG5hbWUsIFN0cmluZyk7XG4gKiAgICAgY2hlY2sob2JqLCBNYXRjaC5PYmplY3RJbmNsdWRpbmcoeyBvcHRpb25zOiBPYmplY3QgfSkpO1xuICogICAgIGNoZWNrKGNiLCBGdW5jdGlvbik7XG4gKlxuICogICAgIC8vIC4uLiB5b3VyIGNvZGVcbiAqIH1cbiAqYGBgXG4gKiBTZWUgW01ldGVvciBkb2NzXShodHRwOi8vZG9jcy5tZXRlb3IuY29tLyNtYXRjaCkgdG8gc2VlIGhvdyBpdCB3b3Jrc1xuICpcbiAqXG4gKiAjIyMgUGF0dGVybnNcbiAqXG4gKiBBbGwgcGF0dGVybnMgYW5kIGZ1bmN0aW9ucyBkZXNjcmliZWQgaW4gTWV0ZW9yIGRvY3Mgd29yay5cbiAqXG4gKiBVbmxpa2UgaW4gTWV0ZW9yLCBPYmplY3QgcGF0dGVybiBtYXRjaGVzIGluc3RhbmNlIG9mIGFueSBjbGFzcyxcbiAqIG5vdCBvbmx5IHBsYWluIG9iamVjdC5cbiAqXG4gKiBJbiBhZGRpdGlvbiB0byBwYXR0ZXJucyBkZXNjcmliZWQgaW4gTWV0ZW9yIGRvY3MgdGhlIGZvbGxvd2luZyBwYXR0ZXJucyBhcmUgaW1wbGVtZW50ZWRcbiAqXG4gKiAqIE1hdGNoLl9fT2JqZWN0SGFzaF9fKF9wYXR0ZXJuXylcbiAqXG4gKiAgIE1hdGNoZXMgYW4gb2JqZWN0IHdoZXJlIGFsbCBwcm9wZXJ0aWVzIG1hdGNoIGEgZ2l2ZW4gcGF0dGVyblxuICpcbiAqICogTWF0Y2guX19TdWJjbGFzc19fKF9jb25zdHJ1Y3Rvcl8gWywgX21hdGNoVGhpc0NsYXNzVG9vX10pXG4gKlxuICogICBNYXRjaGVzIGEgY2xhc3MgdGhhdCBpcyBhIHN1YmNsYXNzIG9mIGEgZ2l2ZW4gY2xhc3MuIElmIHRoZSBzZWNvbmQgcGFyYW1ldGVyXG4gKiAgIGlzIHRydWUsIGl0IHdpbGwgYWxzbyBtYXRjaCB0aGUgY2xhc3MgaXRzZWxmLlxuICpcbiAqICAgV2l0aG91dCB0aGlzIHBhdHRlcm4gdG8gY2hlY2sgaWYgX015U3ViY2xhc3NfIGlzIGEgc3ViY2xhc3Mgb2YgX015Q2xhc3NfXG4gKiAgIHlvdSB3b3VsZCBoYXZlIHRvIHVzZVxuICpcbiAqICAgICAgIGNoZWNrKE15U3ViY2xhc3MsIE1hdGNoLldoZXJlKGZ1bmN0aW9uKCkge1xuICogICAgICAgICAgIHJldHVybiBNeVN1YmNsYXNzLnByb3RvdHlwZSBpbnN0YW5jZW9mIE15Q2xhc3M7XG4gKiAgICAgICB9KTtcbiAqXG4gKlxuICogVGhpbmdzIHdlIGV4cGxpY2l0bHkgZG8gTk9UIHN1cHBvcnQ6XG4gKiAgICAtIGhldGVyb2dlbm91cyBhcnJheXNcbioqL1xuXG52YXIgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKTtcblxudmFyIGNoZWNrID0gZnVuY3Rpb24gKHZhbHVlLCBwYXR0ZXJuKSB7XG4gICAgaWYgKGNvbmZpZy5jaGVjayA9PT0gZmFsc2UpXG4gICAgICAgIHJldHVybjtcblxuICAgIC8vIFJlY29yZCB0aGF0IGNoZWNrIGdvdCBjYWxsZWQsIGlmIHNvbWVib2R5IGNhcmVkLlxuICAgIHRyeSB7XG4gICAgICAgIGNoZWNrU3VidHJlZSh2YWx1ZSwgcGF0dGVybik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICgoZXJyIGluc3RhbmNlb2YgTWF0Y2guRXJyb3IpICYmIGVyci5wYXRoKVxuICAgICAgICAgICAgZXJyLm1lc3NhZ2UgKz0gXCIgaW4gZmllbGQgXCIgKyBlcnIucGF0aDtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY2hlY2s7XG5cbnZhciBNYXRjaCA9IGNoZWNrLk1hdGNoID0ge1xuICAgIE9wdGlvbmFsOiBmdW5jdGlvbiAocGF0dGVybikge1xuICAgICAgICByZXR1cm4gbmV3IE9wdGlvbmFsKHBhdHRlcm4pO1xuICAgIH0sXG4gICAgT25lT2Y6IGZ1bmN0aW9uICgvKiBhcmd1bWVudHMgKi8pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPbmVPZihhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgQW55OiBbJ19fYW55X18nXSxcbiAgICBXaGVyZTogZnVuY3Rpb24gKGNvbmRpdGlvbikge1xuICAgICAgICByZXR1cm4gbmV3IFdoZXJlKGNvbmRpdGlvbik7XG4gICAgfSxcbiAgICBPYmplY3RJbmNsdWRpbmc6IGZ1bmN0aW9uIChwYXR0ZXJuKSB7XG4gICAgICAgIHJldHVybiBuZXcgT2JqZWN0SW5jbHVkaW5nKHBhdHRlcm4pO1xuICAgIH0sXG4gICAgLy8gTWF0Y2hlcyBvbmx5IHNpZ25lZCAzMi1iaXQgaW50ZWdlcnNcbiAgICBJbnRlZ2VyOiBbJ19faW50ZWdlcl9fJ10sXG5cbiAgICAvLyBNYXRjaGVzIHN0cmluZyB0aGF0IGlzIGEgdmFsaWQgaWRlbnRpZmllciwgd2lsbCBub3QgYWxsb3cgamF2YXNjcmlwdCByZXNlcnZlZCB3b3Jkc1xuICAgIElkZW50aWZpZXJTdHJpbmc6IC9eW2Etel8kXVswLTlhLXpfJF0qJC9pLFxuXG4gICAgLy8gTWF0Y2hlcyBoYXNoIChvYmplY3QpIHdpdGggdmFsdWVzIG1hdGNoaW5nIHBhdHRlcm5cbiAgICBPYmplY3RIYXNoOiBmdW5jdGlvbihwYXR0ZXJuKSB7XG4gICAgICAgIHJldHVybiBuZXcgT2JqZWN0SGFzaChwYXR0ZXJuKTtcbiAgICB9LFxuXG4gICAgU3ViY2xhc3M6IGZ1bmN0aW9uKFN1cGVyY2xhc3MsIG1hdGNoU3VwZXJjbGFzc1Rvbykge1xuICAgICAgICByZXR1cm4gbmV3IFN1YmNsYXNzKFN1cGVyY2xhc3MsIG1hdGNoU3VwZXJjbGFzc1Rvbyk7XG4gICAgfSxcblxuICAgIC8vIFhYWCBtYXRjaGVycyBzaG91bGQga25vdyBob3cgdG8gZGVzY3JpYmUgdGhlbXNlbHZlcyBmb3IgZXJyb3JzXG4gICAgRXJyb3I6IFR5cGVFcnJvcixcblxuICAgIC8vIE1ldGVvci5tYWtlRXJyb3JUeXBlKFwiTWF0Y2guRXJyb3JcIiwgZnVuY3Rpb24gKG1zZykge1xuICAgICAgICAvLyB0aGlzLm1lc3NhZ2UgPSBcIk1hdGNoIGVycm9yOiBcIiArIG1zZztcbiAgICAgICAgLy8gVGhlIHBhdGggb2YgdGhlIHZhbHVlIHRoYXQgZmFpbGVkIHRvIG1hdGNoLiBJbml0aWFsbHkgZW1wdHksIHRoaXMgZ2V0c1xuICAgICAgICAvLyBwb3B1bGF0ZWQgYnkgY2F0Y2hpbmcgYW5kIHJldGhyb3dpbmcgdGhlIGV4Y2VwdGlvbiBhcyBpdCBnb2VzIGJhY2sgdXAgdGhlXG4gICAgICAgIC8vIHN0YWNrLlxuICAgICAgICAvLyBFLmcuOiBcInZhbHNbM10uZW50aXR5LmNyZWF0ZWRcIlxuICAgICAgICAvLyB0aGlzLnBhdGggPSBcIlwiO1xuICAgICAgICAvLyBJZiB0aGlzIGdldHMgc2VudCBvdmVyIEREUCwgZG9uJ3QgZ2l2ZSBmdWxsIGludGVybmFsIGRldGFpbHMgYnV0IGF0IGxlYXN0XG4gICAgICAgIC8vIHByb3ZpZGUgc29tZXRoaW5nIGJldHRlciB0aGFuIDUwMCBJbnRlcm5hbCBzZXJ2ZXIgZXJyb3IuXG4gICAgLy8gICAgIHRoaXMuc2FuaXRpemVkRXJyb3IgPSBuZXcgTWV0ZW9yLkVycm9yKDQwMCwgXCJNYXRjaCBmYWlsZWRcIik7XG4gICAgLy8gfSksXG5cbiAgICAvLyBUZXN0cyB0byBzZWUgaWYgdmFsdWUgbWF0Y2hlcyBwYXR0ZXJuLiBVbmxpa2UgY2hlY2ssIGl0IG1lcmVseSByZXR1cm5zIHRydWVcbiAgICAvLyBvciBmYWxzZSAodW5sZXNzIGFuIGVycm9yIG90aGVyIHRoYW4gTWF0Y2guRXJyb3Igd2FzIHRocm93bikuXG4gICAgdGVzdDogZnVuY3Rpb24gKHZhbHVlLCBwYXR0ZXJuKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjaGVja1N1YnRyZWUodmFsdWUsIHBhdHRlcm4pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgTWF0Y2guRXJyb3IpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgLy8gUmV0aHJvdyBvdGhlciBlcnJvcnMuXG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuZnVuY3Rpb24gT3B0aW9uYWwocGF0dGVybikge1xuICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm47XG59O1xuXG5mdW5jdGlvbiBPbmVPZihjaG9pY2VzKSB7XG4gICAgaWYgKGNob2ljZXMubGVuZ3RoID09IDApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk11c3QgcHJvdmlkZSBhdCBsZWFzdCBvbmUgY2hvaWNlIHRvIE1hdGNoLk9uZU9mXCIpO1xuICAgIHRoaXMuY2hvaWNlcyA9IGNob2ljZXM7XG59O1xuXG5mdW5jdGlvbiBXaGVyZShjb25kaXRpb24pIHtcbiAgICB0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbjtcbn07XG5cbmZ1bmN0aW9uIE9iamVjdEluY2x1ZGluZyhwYXR0ZXJuKSB7XG4gICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjtcbn07XG5cbmZ1bmN0aW9uIE9iamVjdEhhc2gocGF0dGVybikge1xuICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm47XG59O1xuXG5mdW5jdGlvbiBTdWJjbGFzcyhTdXBlcmNsYXNzLCBtYXRjaFN1cGVyY2xhc3NUb28pIHtcbiAgICB0aGlzLlN1cGVyY2xhc3MgPSBTdXBlcmNsYXNzO1xuICAgIHRoaXMubWF0Y2hTdXBlcmNsYXNzID0gbWF0Y2hTdXBlcmNsYXNzVG9vO1xufTtcblxudmFyIHR5cGVvZkNoZWNrcyA9IFtcbiAgICBbU3RyaW5nLCBcInN0cmluZ1wiXSxcbiAgICBbTnVtYmVyLCBcIm51bWJlclwiXSxcbiAgICBbQm9vbGVhbiwgXCJib29sZWFuXCJdLFxuICAgIFtGdW5jdGlvbiwgXCJmdW5jdGlvblwiXSxcbiAgICAvLyBXaGlsZSB3ZSBkb24ndCBhbGxvdyB1bmRlZmluZWQgaW4gSlNPTiwgdGhpcyBpcyBnb29kIGZvciBvcHRpb25hbFxuICAgIC8vIGFyZ3VtZW50cyB3aXRoIE9uZU9mLlxuICAgIFt1bmRlZmluZWQsIFwidW5kZWZpbmVkXCJdXG5dO1xuXG5mdW5jdGlvbiBjaGVja1N1YnRyZWUodmFsdWUsIHBhdHRlcm4pIHtcbiAgICAvLyBNYXRjaCBhbnl0aGluZyFcbiAgICBpZiAocGF0dGVybiA9PT0gTWF0Y2guQW55KVxuICAgICAgICByZXR1cm47XG5cbiAgICAvLyBCYXNpYyBhdG9taWMgdHlwZXMuXG4gICAgLy8gRG8gbm90IG1hdGNoIGJveGVkIG9iamVjdHMgKGUuZy4gU3RyaW5nLCBCb29sZWFuKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHlwZW9mQ2hlY2tzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChwYXR0ZXJuID09PSB0eXBlb2ZDaGVja3NbaV1bMF0pIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IHR5cGVvZkNoZWNrc1tpXVsxXSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJFeHBlY3RlZCBcIiArIHR5cGVvZkNoZWNrc1tpXVsxXSArIFwiLCBnb3QgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwYXR0ZXJuID09PSBudWxsKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiRXhwZWN0ZWQgbnVsbCwgZ290IFwiICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvLyBNYXRjaC5JbnRlZ2VyIGlzIHNwZWNpYWwgdHlwZSBlbmNvZGVkIHdpdGggYXJyYXlcbiAgICBpZiAocGF0dGVybiA9PT0gTWF0Y2guSW50ZWdlcikge1xuICAgICAgICAvLyBUaGVyZSBpcyBubyBjb25zaXN0ZW50IGFuZCByZWxpYWJsZSB3YXkgdG8gY2hlY2sgaWYgdmFyaWFibGUgaXMgYSA2NC1iaXRcbiAgICAgICAgLy8gaW50ZWdlci4gT25lIG9mIHRoZSBwb3B1bGFyIHNvbHV0aW9ucyBpcyB0byBnZXQgcmVtaW5kZXIgb2YgZGl2aXNpb24gYnkgMVxuICAgICAgICAvLyBidXQgdGhpcyBtZXRob2QgZmFpbHMgb24gcmVhbGx5IGxhcmdlIGZsb2F0cyB3aXRoIGJpZyBwcmVjaXNpb24uXG4gICAgICAgIC8vIEUuZy46IDEuMzQ4MTkyMzA4NDkxODI0ZSsyMyAlIDEgPT09IDAgaW4gVjhcbiAgICAgICAgLy8gQml0d2lzZSBvcGVyYXRvcnMgd29yayBjb25zaXN0YW50bHkgYnV0IGFsd2F5cyBjYXN0IHZhcmlhYmxlIHRvIDMyLWJpdFxuICAgICAgICAvLyBzaWduZWQgaW50ZWdlciBhY2NvcmRpbmcgdG8gSmF2YVNjcmlwdCBzcGVjcy5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgKHZhbHVlIHwgMCkgPT09IHZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIHRocm93IG5ldyBNYXRjaC5FcnJvcignRXhwZWN0ZWQgSW50ZWdlciwgZ290ICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgPyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgOiB2YWx1ZSkpO1xuICAgIH1cblxuICAgIGlmIChwYXR0ZXJuID09PSBNYXRjaC5JZGVudGlmaWVyU3RyaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIE1hdGNoLklkZW50aWZpZXJTdHJpbmcudGVzdCh2YWx1ZSlcbiAgICAgICAgICAgICAgICAmJiBfanNLZXl3b3Jkcy5pbmRleE9mKGtleSkgPT0gLTEpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRocm93IG5ldyBNYXRjaC5FcnJvcignRXhwZWN0ZWQgaWRlbnRpZmllciBzdHJpbmcsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0ID8gSlNPTi5zdHJpbmdpZnkodmFsdWUpIDogdmFsdWUpKTtcbiAgICB9XG5cbiAgICAvLyBcIk9iamVjdFwiIGlzIHNob3J0aGFuZCBmb3IgTWF0Y2guT2JqZWN0SW5jbHVkaW5nKHt9KTtcbiAgICBpZiAocGF0dGVybiA9PT0gT2JqZWN0KVxuICAgICAgICBwYXR0ZXJuID0gTWF0Y2guT2JqZWN0SW5jbHVkaW5nKHt9KTtcblxuICAgIC8vIEFycmF5IChjaGVja2VkIEFGVEVSIEFueSwgd2hpY2ggaXMgaW1wbGVtZW50ZWQgYXMgYW4gQXJyYXkpLlxuICAgIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgaWYgKHBhdHRlcm4ubGVuZ3RoICE9PSAxKVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJCYWQgcGF0dGVybjogYXJyYXlzIG11c3QgaGF2ZSBvbmUgdHlwZSBlbGVtZW50XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkocGF0dGVybikpO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJFeHBlY3RlZCBhcnJheSwgZ290IFwiICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlRWxlbWVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY2hlY2tTdWJ0cmVlKHZhbHVlRWxlbWVudCwgcGF0dGVyblswXSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTWF0Y2guRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyLnBhdGggPSBfcHJlcGVuZFBhdGgoaW5kZXgsIGVyci5wYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFyYml0cmFyeSB2YWxpZGF0aW9uIGNoZWNrcy4gVGhlIGNvbmRpdGlvbiBjYW4gcmV0dXJuIGZhbHNlIG9yIHRocm93IGFcbiAgICAvLyBNYXRjaC5FcnJvciAoaWUsIGl0IGNhbiBpbnRlcm5hbGx5IHVzZSBjaGVjaygpKSB0byBmYWlsLlxuICAgIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgV2hlcmUpIHtcbiAgICAgICAgaWYgKHBhdHRlcm4uY29uZGl0aW9uKHZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gWFhYIHRoaXMgZXJyb3IgaXMgdGVycmlibGVcbiAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiRmFpbGVkIE1hdGNoLldoZXJlIHZhbGlkYXRpb25cIik7XG4gICAgfVxuXG5cbiAgICBpZiAocGF0dGVybiBpbnN0YW5jZW9mIE9wdGlvbmFsKVxuICAgICAgICBwYXR0ZXJuID0gTWF0Y2guT25lT2YodW5kZWZpbmVkLCBwYXR0ZXJuLnBhdHRlcm4pO1xuXG4gICAgaWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBPbmVPZikge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdHRlcm4uY2hvaWNlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjaGVja1N1YnRyZWUodmFsdWUsIHBhdHRlcm4uY2hvaWNlc1tpXSk7XG4gICAgICAgICAgICAgICAgLy8gTm8gZXJyb3I/IFlheSwgcmV0dXJuLlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIC8vIE90aGVyIGVycm9ycyBzaG91bGQgYmUgdGhyb3duLiBNYXRjaCBlcnJvcnMganVzdCBtZWFuIHRyeSBhbm90aGVyXG4gICAgICAgICAgICAgICAgLy8gY2hvaWNlLlxuICAgICAgICAgICAgICAgIGlmICghKGVyciBpbnN0YW5jZW9mIE1hdGNoLkVycm9yKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFhYWCB0aGlzIGVycm9yIGlzIHRlcnJpYmxlXG4gICAgICAgIHRocm93IG5ldyBNYXRjaC5FcnJvcihcIkZhaWxlZCBNYXRjaC5PbmVPZiBvciBNYXRjaC5PcHRpb25hbCB2YWxpZGF0aW9uXCIpO1xuICAgIH1cblxuICAgIC8vIEEgZnVuY3Rpb24gdGhhdCBpc24ndCBzb21ldGhpbmcgd2Ugc3BlY2lhbC1jYXNlIGlzIGFzc3VtZWQgdG8gYmUgYVxuICAgIC8vIGNvbnN0cnVjdG9yLlxuICAgIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgcGF0dGVybilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gWFhYIHdoYXQgaWYgLm5hbWUgaXNuJ3QgZGVmaW5lZFxuICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJFeHBlY3RlZCBcIiArIHBhdHRlcm4uY29uc3RydWN0b3IubmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIHVua25vd25LZXlzQWxsb3dlZCA9IGZhbHNlO1xuICAgIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgT2JqZWN0SW5jbHVkaW5nKSB7XG4gICAgICAgIHVua25vd25LZXlzQWxsb3dlZCA9IHRydWU7XG4gICAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnBhdHRlcm47XG4gICAgfVxuXG4gICAgaWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBPYmplY3RIYXNoKSB7XG4gICAgICAgIHZhciBrZXlQYXR0ZXJuID0gcGF0dGVybi5wYXR0ZXJuO1xuICAgICAgICB2YXIgZW1wdHlIYXNoID0gdHJ1ZTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgICAgICBlbXB0eUhhc2ggPSBmYWxzZTtcbiAgICAgICAgICAgIGNoZWNrKHZhbHVlW2tleV0sIGtleVBhdHRlcm4pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbXB0eUhhc2gpXG4gICAgICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJFeHBlY3RlZCBcIiArIHBhdHRlcm4uY29uc3RydWN0b3IubmFtZSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocGF0dGVybiBpbnN0YW5jZW9mIFN1YmNsYXNzKSB7XG4gICAgICAgIHZhciBTdXBlcmNsYXNzID0gcGF0dGVybi5TdXBlcmNsYXNzO1xuICAgICAgICBpZiAocGF0dGVybi5tYXRjaFN1cGVyY2xhc3MgJiYgdmFsdWUgPT0gU3VwZXJjbGFzcylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKCEgKHZhbHVlLnByb3RvdHlwZSBpbnN0YW5jZW9mIFN1cGVyY2xhc3MpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiRXhwZWN0ZWQgXCIgKyBwYXR0ZXJuLmNvbnN0cnVjdG9yLm5hbWUgKyBcIiBvZiBcIiArIFN1cGVyY2xhc3MubmFtZSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHBhdHRlcm4gIT09IFwib2JqZWN0XCIpXG4gICAgICAgIHRocm93IEVycm9yKFwiQmFkIHBhdHRlcm46IHVua25vd24gcGF0dGVybiB0eXBlXCIpO1xuXG4gICAgLy8gQW4gb2JqZWN0LCB3aXRoIHJlcXVpcmVkIGFuZCBvcHRpb25hbCBrZXlzLiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBkb1xuICAgIC8vIHN0cnVjdHVyYWwgbWF0Y2hlcyBhZ2FpbnN0IG9iamVjdHMgb2Ygc3BlY2lhbCB0eXBlcyB0aGF0IGhhcHBlbiB0byBtYXRjaFxuICAgIC8vIHRoZSBwYXR0ZXJuOiB0aGlzIHJlYWxseSBuZWVkcyB0byBiZSBhIHBsYWluIG9sZCB7T2JqZWN0fSFcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JylcbiAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiRXhwZWN0ZWQgb2JqZWN0LCBnb3QgXCIgKyB0eXBlb2YgdmFsdWUpO1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbClcbiAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiRXhwZWN0ZWQgb2JqZWN0LCBnb3QgbnVsbFwiKTtcblxuICAgIHZhciByZXF1aXJlZFBhdHRlcm5zID0ge307XG4gICAgdmFyIG9wdGlvbmFsUGF0dGVybnMgPSB7fTtcblxuICAgIF8uZWFjaEtleShwYXR0ZXJuLCBmdW5jdGlvbihzdWJQYXR0ZXJuLCBrZXkpIHtcbiAgICAgICAgaWYgKHBhdHRlcm5ba2V5XSBpbnN0YW5jZW9mIE9wdGlvbmFsKVxuICAgICAgICAgICAgb3B0aW9uYWxQYXR0ZXJuc1trZXldID0gcGF0dGVybltrZXldLnBhdHRlcm47XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJlcXVpcmVkUGF0dGVybnNba2V5XSA9IHBhdHRlcm5ba2V5XTtcbiAgICB9LCB0aGlzLCB0cnVlKTtcblxuICAgIF8uZWFjaEtleSh2YWx1ZSwgZnVuY3Rpb24oc3ViVmFsdWUsIGtleSkge1xuICAgICAgICB2YXIgc3ViVmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHJlcXVpcmVkUGF0dGVybnMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIGNoZWNrU3VidHJlZShzdWJWYWx1ZSwgcmVxdWlyZWRQYXR0ZXJuc1trZXldKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgcmVxdWlyZWRQYXR0ZXJuc1trZXldO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25hbFBhdHRlcm5zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjaGVja1N1YnRyZWUoc3ViVmFsdWUsIG9wdGlvbmFsUGF0dGVybnNba2V5XSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghdW5rbm93bktleXNBbGxvd2VkKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJVbmtub3duIGtleVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTWF0Y2guRXJyb3IpXG4gICAgICAgICAgICAgICAgZXJyLnBhdGggPSBfcHJlcGVuZFBhdGgoa2V5LCBlcnIucGF0aCk7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICB9LCB0aGlzLCB0cnVlKTtcblxuICAgIF8uZWFjaEtleShyZXF1aXJlZFBhdHRlcm5zLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBNYXRjaC5FcnJvcihcIk1pc3Npbmcga2V5ICdcIiArIGtleSArIFwiJ1wiKTtcbiAgICB9LCB0aGlzLCB0cnVlKTtcbn07XG5cblxudmFyIF9qc0tleXdvcmRzID0gW1wiZG9cIiwgXCJpZlwiLCBcImluXCIsIFwiZm9yXCIsIFwibGV0XCIsIFwibmV3XCIsIFwidHJ5XCIsIFwidmFyXCIsIFwiY2FzZVwiLFxuICAgIFwiZWxzZVwiLCBcImVudW1cIiwgXCJldmFsXCIsIFwiZmFsc2VcIiwgXCJudWxsXCIsIFwidGhpc1wiLCBcInRydWVcIiwgXCJ2b2lkXCIsIFwid2l0aFwiLFxuICAgIFwiYnJlYWtcIiwgXCJjYXRjaFwiLCBcImNsYXNzXCIsIFwiY29uc3RcIiwgXCJzdXBlclwiLCBcInRocm93XCIsIFwid2hpbGVcIiwgXCJ5aWVsZFwiLFxuICAgIFwiZGVsZXRlXCIsIFwiZXhwb3J0XCIsIFwiaW1wb3J0XCIsIFwicHVibGljXCIsIFwicmV0dXJuXCIsIFwic3RhdGljXCIsIFwic3dpdGNoXCIsXG4gICAgXCJ0eXBlb2ZcIiwgXCJkZWZhdWx0XCIsIFwiZXh0ZW5kc1wiLCBcImZpbmFsbHlcIiwgXCJwYWNrYWdlXCIsIFwicHJpdmF0ZVwiLCBcImNvbnRpbnVlXCIsXG4gICAgXCJkZWJ1Z2dlclwiLCBcImZ1bmN0aW9uXCIsIFwiYXJndW1lbnRzXCIsIFwiaW50ZXJmYWNlXCIsIFwicHJvdGVjdGVkXCIsIFwiaW1wbGVtZW50c1wiLFxuICAgIFwiaW5zdGFuY2VvZlwiXTtcblxuLy8gQXNzdW1lcyB0aGUgYmFzZSBvZiBwYXRoIGlzIGFscmVhZHkgZXNjYXBlZCBwcm9wZXJseVxuLy8gcmV0dXJucyBrZXkgKyBiYXNlXG5mdW5jdGlvbiBfcHJlcGVuZFBhdGgoa2V5LCBiYXNlKSB7XG4gICAgaWYgKCh0eXBlb2Yga2V5KSA9PT0gXCJudW1iZXJcIiB8fCBrZXkubWF0Y2goL15bMC05XSskLykpXG4gICAgICAgIGtleSA9IFwiW1wiICsga2V5ICsgXCJdXCI7XG4gICAgZWxzZSBpZiAoIWtleS5tYXRjaChNYXRjaC5JZGVudGlmaWVyU3RyaW5nKSB8fCBfanNLZXl3b3Jkcy5pbmRleE9mKGtleSkgIT0gLTEpXG4gICAgICAgIGtleSA9IEpTT04uc3RyaW5naWZ5KFtrZXldKTtcblxuICAgIGlmIChiYXNlICYmIGJhc2VbMF0gIT09IFwiW1wiKVxuICAgICAgICByZXR1cm4ga2V5ICsgJy4nICsgYmFzZTtcbiAgICByZXR1cm4ga2V5ICsgYmFzZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogYG1pbG8udXRpbGBcbiAqL1xudmFyIHV0aWwgPSB7XG4gICAgbG9nZ2VyOiByZXF1aXJlKCcuL2xvZ2dlcicpLFxuICAgIGNoZWNrOiByZXF1aXJlKCcuL2NoZWNrJyksXG4gICAgZG9UOiByZXF1aXJlKCdkb3QnKVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB1dGlsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyA8YSBuYW1lPVwidXRpbHMtbG9nZ2VyXCI+PC9hPlxuLy8gbWlsby51dGlscy5sb2dnZXJcbi8vIC0tLS0tLS0tLS0tXG5cbi8vIEFwcGxpY2F0aW9uIGxvZ2dlciB0aGF0IGhhcyBlcnJvciwgd2FybiwgaW5mbyBhbmQgZGVidWdcbi8vIG1ldGhvZHMsIHRoYXQgY2FuIGJlIHN1cHByZXNzZWQgYnkgc2V0dGluZyBsb2cgbGV2ZWwuXG5cbi8vIFByb3BlcnRpZXM6XG5cbi8vIC0gbGV2ZWxcblxuLy8gICAtIDAgLSBlcnJvclxuLy8gICAtIDEgLSB3YXJuXG4vLyAgIC0gMiAtIGluZm9cbi8vICAgLSAzIC0gZGVidWcgKGRlZmF1bHQpXG5cbi8vIC0gZW5hYmxlZFxuXG4vLyAgIHRydWUgYnkgZGVmYXVsdC4gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgYWxsIGxvZ2dpbmcgaW4gYnJvd3NlciBjb25zb2xlLlxuXG5cbnZhciBMb2dnZXIgPSByZXF1aXJlKCcuL2xvZ2dlcl9jbGFzcycpO1xuXG52YXIgbG9nZ2VyID0gbmV3IExvZ2dlcih7IGxldmVsOiAzIH0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxvZ2dlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gIyMjIExvZ2dlciBDbGFzc1xuXG4vLyBQcm9wZXJ0aWVzOlxuXG4vLyAtIGxldmVsXG5cbi8vICAgLSAwIC0gZXJyb3Jcbi8vICAgLSAxIC0gd2FyblxuLy8gICAtIDIgLSBpbmZvXG4vLyAgIC0gMyAtIGRlYnVnIChkZWZhdWx0KVxuXG4vLyAtIGVuYWJsZWRcblxuLy8gICB0cnVlIGJ5IGRlZmF1bHQuIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIGFsbCBsb2dnaW5nIGluIGJyb3dzZXIgY29uc29sZS5cblxuXG52YXIgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpO1xuXG5cbi8qKlxuICogTG9nIGxldmVscy5cbiAqL1xuXG52YXIgbGV2ZWxzID0gW1xuICAgICdlcnJvcicsXG4gICAgJ3dhcm4nLFxuICAgICdpbmZvJyxcbiAgICAnZGVidWcnXG5dO1xuXG52YXIgbWF4TGV2ZWxMZW5ndGggPSBNYXRoLm1heC5hcHBseShNYXRoLCBsZXZlbHMubWFwKGZ1bmN0aW9uKGxldmVsKSB7IHJldHVybiBsZXZlbC5sZW5ndGg7IH0pKTtcblxuLyoqXG4gKiBDb2xvcnMgZm9yIGxvZyBsZXZlbHMuXG4gKi9cblxudmFyIGNvbG9ycyA9IFtcbiAgICAzMSxcbiAgICAzMyxcbiAgICAzNixcbiAgICA5MFxuXTtcblxuLyoqXG4gKiBQYWRzIHRoZSBuaWNlIG91dHB1dCB0byB0aGUgbG9uZ2VzdCBsb2cgbGV2ZWwuXG4gKi9cbmZ1bmN0aW9uIHBhZChzdHIpIHtcbiAgICBpZiAoc3RyLmxlbmd0aCA8IG1heExldmVsTGVuZ3RoKVxuICAgICAgICByZXR1cm4gc3RyICsgbmV3IEFycmF5KG1heExldmVsTGVuZ3RoIC0gc3RyLmxlbmd0aCArIDEpLmpvaW4oJyAnKTtcblxuICAgIHJldHVybiBzdHI7XG59O1xuXG5cbmZ1bmN0aW9uIGNvbG9yZWQoc3RyLCBjb2xvcikge1xuICAgIHJldHVybiAnXFx4MUJbJyArIGNvbG9yICsgJ20nICsgc3RyICsgJyAtXFx4MUJbMzltJztcbn1cblxuXG52YXIgREVGQVVMVF9PUFRJT05TID0ge1xuICAgIGxldmVsOiAzLFxuICAgIHRocm93TGV2ZWw6IC0xLCAvLyBuZXZlciB0aHJvd1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgbG9nUHJlZml4OiAnJ1xufVxuXG5cbi8qKlxuICogTG9nZ2VyIChjb25zb2xlKS5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG52YXIgTG9nZ2VyID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgICBfLmV4dGVuZCh0aGlzLCBERUZBVUxUX09QVElPTlMpO1xuICAgIF8uZXh0ZW5kKHRoaXMsIG9wdHMgfHwge30pO1xufTtcblxuXG4vKipcbiAqIExvZyBtZXRob2QuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Mb2dnZXIucHJvdG90eXBlLmxvZyA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgdmFyIGluZGV4ID0gbGV2ZWxzLmluZGV4T2YodHlwZSk7XG5cbiAgICBpZiAoISB0aGlzLmVuYWJsZWQgfHwgaW5kZXggPiB0aGlzLmxldmVsKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgIHZhciBhcmdzID0gXy5zbGljZShhcmd1bWVudHMsIDEpO1xuXG4gICAgaWYgKGluZGV4IDw9IHRoaXMudGhyb3dMZXZlbClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFt0aGlzLmxvZ1ByZWZpeCwgdHlwZSArICc6J10uY29uY2F0KGFyZ3MpLmpvaW4oJyAnKSk7XG5cbiAgICBjb25zb2xlLmxvZy5hcHBseShcbiAgICAgICAgICBjb25zb2xlXG4gICAgICAgICwgWyB0aGlzLmxvZ1ByZWZpeENvbG9yXG4gICAgICAgICAgICAgID8gJyAgICcgKyBjb2xvcmVkKHRoaXMubG9nUHJlZml4LCB0aGlzLmxvZ1ByZWZpeENvbG9yKVxuICAgICAgICAgICAgICA6IHRoaXMubG9nUHJlZml4LFxuICAgICAgICAgICAgKHRoaXMuY29sb3JzXG4gICAgICAgICAgICAgID8gJyAnICsgY29sb3JlZChwYWQodHlwZSksIGNvbG9yc1tpbmRleF0pXG4gICAgICAgICAgICAgIDogdHlwZSkgKyAnOidcbiAgICAgICAgICBdLmNvbmNhdChhcmdzKVxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogR2VuZXJhdGUgbWV0aG9kcy5cbiAqL1xuXG5sZXZlbHMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgIExvZ2dlci5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubG9nLmFwcGx5KHRoaXMsIFtuYW1lXS5jb25jYXQoXy50b0FycmF5KGFyZ3VtZW50cykpKTtcbiAgICB9O1xufSk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBMb2dnZXI7XG4iLCIvLyBkb1QuanNcbi8vIDIwMTEtMjAxNCwgTGF1cmEgRG9rdG9yb3ZhLCBodHRwczovL2dpdGh1Yi5jb20vb2xhZG8vZG9UXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5cbihmdW5jdGlvbigpIHtcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0dmFyIGRvVCA9IHtcblx0XHR2ZXJzaW9uOiBcIjEuMC4zXCIsXG5cdFx0dGVtcGxhdGVTZXR0aW5nczoge1xuXHRcdFx0ZXZhbHVhdGU6ICAgIC9cXHtcXHsoW1xcc1xcU10rPyhcXH0/KSspXFx9XFx9L2csXG5cdFx0XHRpbnRlcnBvbGF0ZTogL1xce1xcez0oW1xcc1xcU10rPylcXH1cXH0vZyxcblx0XHRcdGVuY29kZTogICAgICAvXFx7XFx7IShbXFxzXFxTXSs/KVxcfVxcfS9nLFxuXHRcdFx0dXNlOiAgICAgICAgIC9cXHtcXHsjKFtcXHNcXFNdKz8pXFx9XFx9L2csXG5cdFx0XHR1c2VQYXJhbXM6ICAgLyhefFteXFx3JF0pZGVmKD86XFwufFxcW1tcXCdcXFwiXSkoW1xcdyRcXC5dKykoPzpbXFwnXFxcIl1cXF0pP1xccypcXDpcXHMqKFtcXHckXFwuXSt8XFxcIlteXFxcIl0rXFxcInxcXCdbXlxcJ10rXFwnfFxce1teXFx9XStcXH0pL2csXG5cdFx0XHRkZWZpbmU6ICAgICAgL1xce1xceyMjXFxzKihbXFx3XFwuJF0rKVxccyooXFw6fD0pKFtcXHNcXFNdKz8pI1xcfVxcfS9nLFxuXHRcdFx0ZGVmaW5lUGFyYW1zOi9eXFxzKihbXFx3JF0rKTooW1xcc1xcU10rKS8sXG5cdFx0XHRjb25kaXRpb25hbDogL1xce1xce1xcPyhcXD8pP1xccyooW1xcc1xcU10qPylcXHMqXFx9XFx9L2csXG5cdFx0XHRpdGVyYXRlOiAgICAgL1xce1xce35cXHMqKD86XFx9XFx9fChbXFxzXFxTXSs/KVxccypcXDpcXHMqKFtcXHckXSspXFxzKig/OlxcOlxccyooW1xcdyRdKykpP1xccypcXH1cXH0pL2csXG5cdFx0XHR2YXJuYW1lOlx0XCJpdFwiLFxuXHRcdFx0c3RyaXA6XHRcdHRydWUsXG5cdFx0XHRhcHBlbmQ6XHRcdHRydWUsXG5cdFx0XHRzZWxmY29udGFpbmVkOiBmYWxzZSxcblx0XHRcdGRvTm90U2tpcEVuY29kZWQ6IGZhbHNlXG5cdFx0fSxcblx0XHR0ZW1wbGF0ZTogdW5kZWZpbmVkLCAvL2ZuLCBjb21waWxlIHRlbXBsYXRlXG5cdFx0Y29tcGlsZTogIHVuZGVmaW5lZCAgLy9mbiwgZm9yIGV4cHJlc3Ncblx0fSwgX2dsb2JhbHM7XG5cblx0ZG9ULmVuY29kZUhUTUxTb3VyY2UgPSBmdW5jdGlvbihkb05vdFNraXBFbmNvZGVkKSB7XG5cdFx0dmFyIGVuY29kZUhUTUxSdWxlcyA9IHsgXCImXCI6IFwiJiMzODtcIiwgXCI8XCI6IFwiJiM2MDtcIiwgXCI+XCI6IFwiJiM2MjtcIiwgJ1wiJzogXCImIzM0O1wiLCBcIidcIjogXCImIzM5O1wiLCBcIi9cIjogXCImIzQ3O1wiIH0sXG5cdFx0XHRtYXRjaEhUTUwgPSBkb05vdFNraXBFbmNvZGVkID8gL1smPD5cIidcXC9dL2cgOiAvJig/ISM/XFx3KzspfDx8PnxcInwnfFxcLy9nO1xuXHRcdHJldHVybiBmdW5jdGlvbihjb2RlKSB7XG5cdFx0XHRyZXR1cm4gY29kZSA/IGNvZGUudG9TdHJpbmcoKS5yZXBsYWNlKG1hdGNoSFRNTCwgZnVuY3Rpb24obSkge3JldHVybiBlbmNvZGVIVE1MUnVsZXNbbV0gfHwgbTt9KSA6IFwiXCI7XG5cdFx0fTtcblx0fTtcblxuXHRfZ2xvYmFscyA9IChmdW5jdGlvbigpeyByZXR1cm4gdGhpcyB8fCAoMCxldmFsKShcInRoaXNcIik7IH0oKSk7XG5cblx0aWYgKHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlLmV4cG9ydHMpIHtcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGRvVDtcblx0fSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdGRlZmluZShmdW5jdGlvbigpe3JldHVybiBkb1Q7fSk7XG5cdH0gZWxzZSB7XG5cdFx0X2dsb2JhbHMuZG9UID0gZG9UO1xuXHR9XG5cblx0dmFyIHN0YXJ0ZW5kID0ge1xuXHRcdGFwcGVuZDogeyBzdGFydDogXCInKyhcIiwgICAgICBlbmQ6IFwiKSsnXCIsICAgICAgc3RhcnRlbmNvZGU6IFwiJytlbmNvZGVIVE1MKFwiIH0sXG5cdFx0c3BsaXQ6ICB7IHN0YXJ0OiBcIic7b3V0Kz0oXCIsIGVuZDogXCIpO291dCs9J1wiLCBzdGFydGVuY29kZTogXCInO291dCs9ZW5jb2RlSFRNTChcIiB9XG5cdH0sIHNraXAgPSAvJF4vO1xuXG5cdGZ1bmN0aW9uIHJlc29sdmVEZWZzKGMsIGJsb2NrLCBkZWYpIHtcblx0XHRyZXR1cm4gKCh0eXBlb2YgYmxvY2sgPT09IFwic3RyaW5nXCIpID8gYmxvY2sgOiBibG9jay50b1N0cmluZygpKVxuXHRcdC5yZXBsYWNlKGMuZGVmaW5lIHx8IHNraXAsIGZ1bmN0aW9uKG0sIGNvZGUsIGFzc2lnbiwgdmFsdWUpIHtcblx0XHRcdGlmIChjb2RlLmluZGV4T2YoXCJkZWYuXCIpID09PSAwKSB7XG5cdFx0XHRcdGNvZGUgPSBjb2RlLnN1YnN0cmluZyg0KTtcblx0XHRcdH1cblx0XHRcdGlmICghKGNvZGUgaW4gZGVmKSkge1xuXHRcdFx0XHRpZiAoYXNzaWduID09PSBcIjpcIikge1xuXHRcdFx0XHRcdGlmIChjLmRlZmluZVBhcmFtcykgdmFsdWUucmVwbGFjZShjLmRlZmluZVBhcmFtcywgZnVuY3Rpb24obSwgcGFyYW0sIHYpIHtcblx0XHRcdFx0XHRcdGRlZltjb2RlXSA9IHthcmc6IHBhcmFtLCB0ZXh0OiB2fTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRpZiAoIShjb2RlIGluIGRlZikpIGRlZltjb2RlXT0gdmFsdWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bmV3IEZ1bmN0aW9uKFwiZGVmXCIsIFwiZGVmWydcIitjb2RlK1wiJ109XCIgKyB2YWx1ZSkoZGVmKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0fSlcblx0XHQucmVwbGFjZShjLnVzZSB8fCBza2lwLCBmdW5jdGlvbihtLCBjb2RlKSB7XG5cdFx0XHRpZiAoYy51c2VQYXJhbXMpIGNvZGUgPSBjb2RlLnJlcGxhY2UoYy51c2VQYXJhbXMsIGZ1bmN0aW9uKG0sIHMsIGQsIHBhcmFtKSB7XG5cdFx0XHRcdGlmIChkZWZbZF0gJiYgZGVmW2RdLmFyZyAmJiBwYXJhbSkge1xuXHRcdFx0XHRcdHZhciBydyA9IChkK1wiOlwiK3BhcmFtKS5yZXBsYWNlKC8nfFxcXFwvZywgXCJfXCIpO1xuXHRcdFx0XHRcdGRlZi5fX2V4cCA9IGRlZi5fX2V4cCB8fCB7fTtcblx0XHRcdFx0XHRkZWYuX19leHBbcnddID0gZGVmW2RdLnRleHQucmVwbGFjZShuZXcgUmVnRXhwKFwiKF58W15cXFxcdyRdKVwiICsgZGVmW2RdLmFyZyArIFwiKFteXFxcXHckXSlcIiwgXCJnXCIpLCBcIiQxXCIgKyBwYXJhbSArIFwiJDJcIik7XG5cdFx0XHRcdFx0cmV0dXJuIHMgKyBcImRlZi5fX2V4cFsnXCIrcncrXCInXVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHZhciB2ID0gbmV3IEZ1bmN0aW9uKFwiZGVmXCIsIFwicmV0dXJuIFwiICsgY29kZSkoZGVmKTtcblx0XHRcdHJldHVybiB2ID8gcmVzb2x2ZURlZnMoYywgdiwgZGVmKSA6IHY7XG5cdFx0fSk7XG5cdH1cblxuXHRmdW5jdGlvbiB1bmVzY2FwZShjb2RlKSB7XG5cdFx0cmV0dXJuIGNvZGUucmVwbGFjZSgvXFxcXCgnfFxcXFwpL2csIFwiJDFcIikucmVwbGFjZSgvW1xcclxcdFxcbl0vZywgXCIgXCIpO1xuXHR9XG5cblx0ZG9ULnRlbXBsYXRlID0gZnVuY3Rpb24odG1wbCwgYywgZGVmKSB7XG5cdFx0YyA9IGMgfHwgZG9ULnRlbXBsYXRlU2V0dGluZ3M7XG5cdFx0dmFyIGNzZSA9IGMuYXBwZW5kID8gc3RhcnRlbmQuYXBwZW5kIDogc3RhcnRlbmQuc3BsaXQsIG5lZWRodG1sZW5jb2RlLCBzaWQgPSAwLCBpbmR2LFxuXHRcdFx0c3RyICA9IChjLnVzZSB8fCBjLmRlZmluZSkgPyByZXNvbHZlRGVmcyhjLCB0bXBsLCBkZWYgfHwge30pIDogdG1wbDtcblxuXHRcdHN0ciA9IChcInZhciBvdXQ9J1wiICsgKGMuc3RyaXAgPyBzdHIucmVwbGFjZSgvKF58XFxyfFxcbilcXHQqICt8ICtcXHQqKFxccnxcXG58JCkvZyxcIiBcIilcblx0XHRcdFx0XHQucmVwbGFjZSgvXFxyfFxcbnxcXHR8XFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLFwiXCIpOiBzdHIpXG5cdFx0XHQucmVwbGFjZSgvJ3xcXFxcL2csIFwiXFxcXCQmXCIpXG5cdFx0XHQucmVwbGFjZShjLmludGVycG9sYXRlIHx8IHNraXAsIGZ1bmN0aW9uKG0sIGNvZGUpIHtcblx0XHRcdFx0cmV0dXJuIGNzZS5zdGFydCArIHVuZXNjYXBlKGNvZGUpICsgY3NlLmVuZDtcblx0XHRcdH0pXG5cdFx0XHQucmVwbGFjZShjLmVuY29kZSB8fCBza2lwLCBmdW5jdGlvbihtLCBjb2RlKSB7XG5cdFx0XHRcdG5lZWRodG1sZW5jb2RlID0gdHJ1ZTtcblx0XHRcdFx0cmV0dXJuIGNzZS5zdGFydGVuY29kZSArIHVuZXNjYXBlKGNvZGUpICsgY3NlLmVuZDtcblx0XHRcdH0pXG5cdFx0XHQucmVwbGFjZShjLmNvbmRpdGlvbmFsIHx8IHNraXAsIGZ1bmN0aW9uKG0sIGVsc2VjYXNlLCBjb2RlKSB7XG5cdFx0XHRcdHJldHVybiBlbHNlY2FzZSA/XG5cdFx0XHRcdFx0KGNvZGUgPyBcIic7fWVsc2UgaWYoXCIgKyB1bmVzY2FwZShjb2RlKSArIFwiKXtvdXQrPSdcIiA6IFwiJzt9ZWxzZXtvdXQrPSdcIikgOlxuXHRcdFx0XHRcdChjb2RlID8gXCInO2lmKFwiICsgdW5lc2NhcGUoY29kZSkgKyBcIil7b3V0Kz0nXCIgOiBcIic7fW91dCs9J1wiKTtcblx0XHRcdH0pXG5cdFx0XHQucmVwbGFjZShjLml0ZXJhdGUgfHwgc2tpcCwgZnVuY3Rpb24obSwgaXRlcmF0ZSwgdm5hbWUsIGluYW1lKSB7XG5cdFx0XHRcdGlmICghaXRlcmF0ZSkgcmV0dXJuIFwiJzt9IH0gb3V0Kz0nXCI7XG5cdFx0XHRcdHNpZCs9MTsgaW5kdj1pbmFtZSB8fCBcImlcIitzaWQ7IGl0ZXJhdGU9dW5lc2NhcGUoaXRlcmF0ZSk7XG5cdFx0XHRcdHJldHVybiBcIic7dmFyIGFyclwiK3NpZCtcIj1cIitpdGVyYXRlK1wiO2lmKGFyclwiK3NpZCtcIil7dmFyIFwiK3ZuYW1lK1wiLFwiK2luZHYrXCI9LTEsbFwiK3NpZCtcIj1hcnJcIitzaWQrXCIubGVuZ3RoLTE7d2hpbGUoXCIraW5kditcIjxsXCIrc2lkK1wiKXtcIlxuXHRcdFx0XHRcdCt2bmFtZStcIj1hcnJcIitzaWQrXCJbXCIraW5kditcIis9MV07b3V0Kz0nXCI7XG5cdFx0XHR9KVxuXHRcdFx0LnJlcGxhY2UoYy5ldmFsdWF0ZSB8fCBza2lwLCBmdW5jdGlvbihtLCBjb2RlKSB7XG5cdFx0XHRcdHJldHVybiBcIic7XCIgKyB1bmVzY2FwZShjb2RlKSArIFwib3V0Kz0nXCI7XG5cdFx0XHR9KVxuXHRcdFx0KyBcIic7cmV0dXJuIG91dDtcIilcblx0XHRcdC5yZXBsYWNlKC9cXG4vZywgXCJcXFxcblwiKS5yZXBsYWNlKC9cXHQvZywgJ1xcXFx0JykucmVwbGFjZSgvXFxyL2csIFwiXFxcXHJcIilcblx0XHRcdC5yZXBsYWNlKC8oXFxzfDt8XFx9fF58XFx7KW91dFxcKz0nJzsvZywgJyQxJykucmVwbGFjZSgvXFwrJycvZywgXCJcIik7XG5cdFx0XHQvLy5yZXBsYWNlKC8oXFxzfDt8XFx9fF58XFx7KW91dFxcKz0nJ1xcKy9nLCckMW91dCs9Jyk7XG5cblx0XHRpZiAobmVlZGh0bWxlbmNvZGUpIHtcblx0XHRcdGlmICghYy5zZWxmY29udGFpbmVkICYmIF9nbG9iYWxzICYmICFfZ2xvYmFscy5fZW5jb2RlSFRNTCkgX2dsb2JhbHMuX2VuY29kZUhUTUwgPSBkb1QuZW5jb2RlSFRNTFNvdXJjZShjLmRvTm90U2tpcEVuY29kZWQpO1xuXHRcdFx0c3RyID0gXCJ2YXIgZW5jb2RlSFRNTCA9IHR5cGVvZiBfZW5jb2RlSFRNTCAhPT0gJ3VuZGVmaW5lZCcgPyBfZW5jb2RlSFRNTCA6IChcIlxuXHRcdFx0XHQrIGRvVC5lbmNvZGVIVE1MU291cmNlLnRvU3RyaW5nKCkgKyBcIihcIiArIChjLmRvTm90U2tpcEVuY29kZWQgfHwgJycpICsgXCIpKTtcIlxuXHRcdFx0XHQrIHN0cjtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBuZXcgRnVuY3Rpb24oYy52YXJuYW1lLCBzdHIpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdGlmICh0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIikgY29uc29sZS5sb2coXCJDb3VsZCBub3QgY3JlYXRlIGEgdGVtcGxhdGUgZnVuY3Rpb246IFwiICsgc3RyKTtcblx0XHRcdHRocm93IGU7XG5cdFx0fVxuXHR9O1xuXG5cdGRvVC5jb21waWxlID0gZnVuY3Rpb24odG1wbCwgZGVmKSB7XG5cdFx0cmV0dXJuIGRvVC50ZW1wbGF0ZSh0bXBsLCBudWxsLCBkZWYpO1xuXHR9O1xufSgpKTtcbiIsIi8qIGRvVCArIGF1dG8tY29tcGlsYXRpb24gb2YgZG9UIHRlbXBsYXRlc1xuICpcbiAqIDIwMTIsIExhdXJhIERva3Rvcm92YSwgaHR0cHM6Ly9naXRodWIuY29tL29sYWRvL2RvVFxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKlxuICogQ29tcGlsZXMgLmRlZiwgLmRvdCwgLmpzdCBmaWxlcyBmb3VuZCB1bmRlciB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKiBJdCBpZ25vcmVzIHN1Yi1kaXJlY3Rvcmllcy5cbiAqIFRlbXBsYXRlIGZpbGVzIGNhbiBoYXZlIG11bHRpcGxlIGV4dGVuc2lvbnMgYXQgdGhlIHNhbWUgdGltZS5cbiAqIEZpbGVzIHdpdGggLmRlZiBleHRlbnNpb24gY2FuIGJlIGluY2x1ZGVkIGluIG90aGVyIGZpbGVzIHZpYSB7eyNkZWYubmFtZX19XG4gKiBGaWxlcyB3aXRoIC5kb3QgZXh0ZW5zaW9uIGFyZSBjb21waWxlZCBpbnRvIGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kXG4gKiBjYW4gYmUgYWNjZXNzZWQgYXMgcmVuZGVyZXIuZmlsZW5hbWVcbiAqIEZpbGVzIHdpdGggLmpzdCBleHRlbnNpb24gYXJlIGNvbXBpbGVkIGludG8gLmpzIGZpbGVzLiBQcm9kdWNlZCAuanMgZmlsZSBjYW4gYmVcbiAqIGxvYWRlZCBhcyBhIGNvbW1vbkpTLCBBTUQgbW9kdWxlLCBvciBqdXN0IGluc3RhbGxlZCBpbnRvIGEgZ2xvYmFsIHZhcmlhYmxlXG4gKiAoZGVmYXVsdCBpcyBzZXQgdG8gd2luZG93LnJlbmRlcikuXG4gKiBBbGwgaW5saW5lIGRlZmluZXMgZGVmaW5lZCBpbiB0aGUgLmpzdCBmaWxlIGFyZVxuICogY29tcGlsZWQgaW50byBzZXBhcmF0ZSBmdW5jdGlvbnMgYW5kIGFyZSBhdmFpbGFibGUgdmlhIF9yZW5kZXIuZmlsZW5hbWUuZGVmaW5lbmFtZVxuICpcbiAqIEJhc2ljIHVzYWdlOlxuICogdmFyIGRvdHMgPSByZXF1aXJlKFwiZG90XCIpLnByb2Nlc3Moe3BhdGg6IFwiLi92aWV3c1wifSk7XG4gKiBkb3RzLm15dGVtcGxhdGUoe2ZvbzpcImhlbGxvIHdvcmxkXCJ9KTtcbiAqXG4gKiBUaGUgYWJvdmUgc25pcHBldCB3aWxsOlxuICogMS4gQ29tcGlsZSBhbGwgdGVtcGxhdGVzIGluIHZpZXdzIGZvbGRlciAoLmRvdCwgLmRlZiwgLmpzdClcbiAqIDIuIFBsYWNlIC5qcyBmaWxlcyBjb21waWxlZCBmcm9tIC5qc3QgdGVtcGxhdGVzIGludG8gdGhlIHNhbWUgZm9sZGVyLlxuICogICAgVGhlc2UgZmlsZXMgY2FuIGJlIHVzZWQgd2l0aCByZXF1aXJlLCBpLmUuIHJlcXVpcmUoXCIuL3ZpZXdzL215dGVtcGxhdGVcIikuXG4gKiAzLiBSZXR1cm4gYW4gb2JqZWN0IHdpdGggZnVuY3Rpb25zIGNvbXBpbGVkIGZyb20gLmRvdCB0ZW1wbGF0ZXMgYXMgaXRzIHByb3BlcnRpZXMuXG4gKiA0LiBSZW5kZXIgbXl0ZW1wbGF0ZSB0ZW1wbGF0ZS5cbiAqL1xuXG52YXIgZnMgPSByZXF1aXJlKFwiZnNcIiksXG5cdGRvVCA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4vZG9UXCIpO1xuXG5kb1QucHJvY2VzcyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0Ly9wYXRoLCBkZXN0aW5hdGlvbiwgZ2xvYmFsLCByZW5kZXJtb2R1bGUsIHRlbXBsYXRlU2V0dGluZ3Ncblx0cmV0dXJuIG5ldyBJbnN0YWxsRG90cyhvcHRpb25zKS5jb21waWxlQWxsKCk7XG59O1xuXG5mdW5jdGlvbiBJbnN0YWxsRG90cyhvKSB7XG5cdHRoaXMuX19wYXRoIFx0XHQ9IG8ucGF0aCB8fCBcIi4vXCI7XG5cdGlmICh0aGlzLl9fcGF0aFt0aGlzLl9fcGF0aC5sZW5ndGgtMV0gIT09ICcvJykgdGhpcy5fX3BhdGggKz0gJy8nO1xuXHR0aGlzLl9fZGVzdGluYXRpb25cdD0gby5kZXN0aW5hdGlvbiB8fCB0aGlzLl9fcGF0aDtcblx0aWYgKHRoaXMuX19kZXN0aW5hdGlvblt0aGlzLl9fZGVzdGluYXRpb24ubGVuZ3RoLTFdICE9PSAnLycpIHRoaXMuX19kZXN0aW5hdGlvbiArPSAnLyc7XG5cdHRoaXMuX19nbG9iYWxcdFx0PSBvLmdsb2JhbCB8fCBcIndpbmRvdy5yZW5kZXJcIjtcblx0dGhpcy5fX3JlbmRlcm1vZHVsZVx0PSBvLnJlbmRlcm1vZHVsZSB8fCB7fTtcblx0dGhpcy5fX3NldHRpbmdzIFx0PSBvLnRlbXBsYXRlU2V0dGluZ3MgPyBjb3B5KG8udGVtcGxhdGVTZXR0aW5ncywgY29weShkb1QudGVtcGxhdGVTZXR0aW5ncykpIDogdW5kZWZpbmVkO1xuXHR0aGlzLl9faW5jbHVkZXNcdFx0PSB7fTtcbn1cblxuSW5zdGFsbERvdHMucHJvdG90eXBlLmNvbXBpbGVUb0ZpbGUgPSBmdW5jdGlvbihwYXRoLCB0ZW1wbGF0ZSwgZGVmKSB7XG5cdGRlZiA9IGRlZiB8fCB7fTtcblx0dmFyIG1vZHVsZW5hbWUgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmxhc3RJbmRleE9mKFwiL1wiKSsxLCBwYXRoLmxhc3RJbmRleE9mKFwiLlwiKSlcblx0XHQsIGRlZnMgPSBjb3B5KHRoaXMuX19pbmNsdWRlcywgY29weShkZWYpKVxuXHRcdCwgc2V0dGluZ3MgPSB0aGlzLl9fc2V0dGluZ3MgfHwgZG9ULnRlbXBsYXRlU2V0dGluZ3Ncblx0XHQsIGNvbXBpbGVvcHRpb25zID0gY29weShzZXR0aW5ncylcblx0XHQsIGRlZmF1bHRjb21waWxlZCA9IGRvVC50ZW1wbGF0ZSh0ZW1wbGF0ZSwgc2V0dGluZ3MsIGRlZnMpXG5cdFx0LCBleHBvcnRzID0gW11cblx0XHQsIGNvbXBpbGVkID0gXCJcIlxuXHRcdCwgZm47XG5cblx0Zm9yICh2YXIgcHJvcGVydHkgaW4gZGVmcykge1xuXHRcdGlmIChkZWZzW3Byb3BlcnR5XSAhPT0gZGVmW3Byb3BlcnR5XSAmJiBkZWZzW3Byb3BlcnR5XSAhPT0gdGhpcy5fX2luY2x1ZGVzW3Byb3BlcnR5XSkge1xuXHRcdFx0Zm4gPSB1bmRlZmluZWQ7XG5cdFx0XHRpZiAodHlwZW9mIGRlZnNbcHJvcGVydHldID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRmbiA9IGRvVC50ZW1wbGF0ZShkZWZzW3Byb3BlcnR5XSwgc2V0dGluZ3MsIGRlZnMpO1xuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgZGVmc1twcm9wZXJ0eV0gPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0Zm4gPSBkZWZzW3Byb3BlcnR5XTtcblx0XHRcdH0gZWxzZSBpZiAoZGVmc1twcm9wZXJ0eV0uYXJnKSB7XG5cdFx0XHRcdGNvbXBpbGVvcHRpb25zLnZhcm5hbWUgPSBkZWZzW3Byb3BlcnR5XS5hcmc7XG5cdFx0XHRcdGZuID0gZG9ULnRlbXBsYXRlKGRlZnNbcHJvcGVydHldLnRleHQsIGNvbXBpbGVvcHRpb25zLCBkZWZzKTtcblx0XHRcdH1cblx0XHRcdGlmIChmbikge1xuXHRcdFx0XHRjb21waWxlZCArPSBmbi50b1N0cmluZygpLnJlcGxhY2UoJ2Fub255bW91cycsIHByb3BlcnR5KTtcblx0XHRcdFx0ZXhwb3J0cy5wdXNoKHByb3BlcnR5KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Y29tcGlsZWQgKz0gZGVmYXVsdGNvbXBpbGVkLnRvU3RyaW5nKCkucmVwbGFjZSgnYW5vbnltb3VzJywgbW9kdWxlbmFtZSk7XG5cdGZzLndyaXRlRmlsZVN5bmMocGF0aCwgXCIoZnVuY3Rpb24oKXtcIiArIGNvbXBpbGVkXG5cdFx0KyBcInZhciBpdHNlbGY9XCIgKyBtb2R1bGVuYW1lICsgXCIsIF9lbmNvZGVIVE1MPShcIiArIGRvVC5lbmNvZGVIVE1MU291cmNlLnRvU3RyaW5nKCkgKyBcIihcIiArIChzZXR0aW5ncy5kb05vdFNraXBFbmNvZGVkIHx8ICcnKSArIFwiKSk7XCJcblx0XHQrIGFkZGV4cG9ydHMoZXhwb3J0cylcblx0XHQrIFwiaWYodHlwZW9mIG1vZHVsZSE9PSd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSBtb2R1bGUuZXhwb3J0cz1pdHNlbGY7ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT09J2Z1bmN0aW9uJylkZWZpbmUoZnVuY3Rpb24oKXtyZXR1cm4gaXRzZWxmO30pO2Vsc2Uge1wiXG5cdFx0KyB0aGlzLl9fZ2xvYmFsICsgXCI9XCIgKyB0aGlzLl9fZ2xvYmFsICsgXCJ8fHt9O1wiICsgdGhpcy5fX2dsb2JhbCArIFwiWydcIiArIG1vZHVsZW5hbWUgKyBcIiddPWl0c2VsZjt9fSgpKTtcIik7XG59O1xuXG5mdW5jdGlvbiBhZGRleHBvcnRzKGV4cG9ydHMpIHtcblx0Zm9yICh2YXIgcmV0ID0nJywgaT0wOyBpPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0cmV0ICs9IFwiaXRzZWxmLlwiICsgZXhwb3J0c1tpXSsgXCI9XCIgKyBleHBvcnRzW2ldK1wiO1wiO1xuXHR9XG5cdHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGNvcHkobywgdG8pIHtcblx0dG8gPSB0byB8fCB7fTtcblx0Zm9yICh2YXIgcHJvcGVydHkgaW4gbykge1xuXHRcdHRvW3Byb3BlcnR5XSA9IG9bcHJvcGVydHldO1xuXHR9XG5cdHJldHVybiB0bztcbn1cblxuZnVuY3Rpb24gcmVhZGRhdGEocGF0aCkge1xuXHR2YXIgZGF0YSA9IGZzLnJlYWRGaWxlU3luYyhwYXRoKTtcblx0aWYgKGRhdGEpIHJldHVybiBkYXRhLnRvU3RyaW5nKCk7XG5cdGNvbnNvbGUubG9nKFwicHJvYmxlbXMgd2l0aCBcIiArIHBhdGgpO1xufVxuXG5JbnN0YWxsRG90cy5wcm90b3R5cGUuY29tcGlsZVBhdGggPSBmdW5jdGlvbihwYXRoKSB7XG5cdHZhciBkYXRhID0gcmVhZGRhdGEocGF0aCk7XG5cdGlmIChkYXRhKSB7XG5cdFx0cmV0dXJuIGRvVC50ZW1wbGF0ZShkYXRhLFxuXHRcdFx0XHRcdHRoaXMuX19zZXR0aW5ncyB8fCBkb1QudGVtcGxhdGVTZXR0aW5ncyxcblx0XHRcdFx0XHRjb3B5KHRoaXMuX19pbmNsdWRlcykpO1xuXHR9XG59O1xuXG5JbnN0YWxsRG90cy5wcm90b3R5cGUuY29tcGlsZUFsbCA9IGZ1bmN0aW9uKCkge1xuXHRjb25zb2xlLmxvZyhcIkNvbXBpbGluZyBhbGwgZG9UIHRlbXBsYXRlcy4uLlwiKTtcblxuXHR2YXIgZGVmRm9sZGVyID0gdGhpcy5fX3BhdGgsXG5cdFx0c291cmNlcyA9IGZzLnJlYWRkaXJTeW5jKGRlZkZvbGRlciksXG5cdFx0aywgbCwgbmFtZTtcblxuXHRmb3IoIGsgPSAwLCBsID0gc291cmNlcy5sZW5ndGg7IGsgPCBsOyBrKyspIHtcblx0XHRuYW1lID0gc291cmNlc1trXTtcblx0XHRpZiAoL1xcLmRlZihcXC5kb3R8XFwuanN0KT8kLy50ZXN0KG5hbWUpKSB7XG5cdFx0XHRjb25zb2xlLmxvZyhcIkxvYWRlZCBkZWYgXCIgKyBuYW1lKTtcblx0XHRcdHRoaXMuX19pbmNsdWRlc1tuYW1lLnN1YnN0cmluZygwLCBuYW1lLmluZGV4T2YoJy4nKSldID0gcmVhZGRhdGEoZGVmRm9sZGVyICsgbmFtZSk7XG5cdFx0fVxuXHR9XG5cblx0Zm9yKCBrID0gMCwgbCA9IHNvdXJjZXMubGVuZ3RoOyBrIDwgbDsgaysrKSB7XG5cdFx0bmFtZSA9IHNvdXJjZXNba107XG5cdFx0aWYgKC9cXC5kb3QoXFwuZGVmfFxcLmpzdCk/JC8udGVzdChuYW1lKSkge1xuXHRcdFx0Y29uc29sZS5sb2coXCJDb21waWxpbmcgXCIgKyBuYW1lICsgXCIgdG8gZnVuY3Rpb25cIik7XG5cdFx0XHR0aGlzLl9fcmVuZGVybW9kdWxlW25hbWUuc3Vic3RyaW5nKDAsIG5hbWUuaW5kZXhPZignLicpKV0gPSB0aGlzLmNvbXBpbGVQYXRoKGRlZkZvbGRlciArIG5hbWUpO1xuXHRcdH1cblx0XHRpZiAoL1xcLmpzdChcXC5kb3R8XFwuZGVmKT8kLy50ZXN0KG5hbWUpKSB7XG5cdFx0XHRjb25zb2xlLmxvZyhcIkNvbXBpbGluZyBcIiArIG5hbWUgKyBcIiB0byBmaWxlXCIpO1xuXHRcdFx0dGhpcy5jb21waWxlVG9GaWxlKHRoaXMuX19kZXN0aW5hdGlvbiArIG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUuaW5kZXhPZignLicpKSArICcuanMnLFxuXHRcdFx0XHRcdHJlYWRkYXRhKGRlZkZvbGRlciArIG5hbWUpKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHRoaXMuX19yZW5kZXJtb2R1bGU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cblxuLyoqXG4gKiBbX19Qcm90b3R5cGUgZnVuY3Rpb25zX19dKHByb3RvX3Byb3RvdHlwZS5qcy5odG1sKVxuICpcbiAqIC0gW2V4dGVuZFByb3RvXShwcm90b19wcm90b3R5cGUuanMuaHRtbCNleHRlbmRQcm90bylcbiAqIC0gW2NyZWF0ZVN1YmNsYXNzXShwcm90b19wcm90b3R5cGUuanMuaHRtbCNjcmVhdGVTdWJjbGFzcylcbiAqIC0gW21ha2VTdWJjbGFzc10ocHJvdG9fcHJvdG90eXBlLmpzLmh0bWwjbWFrZVN1YmNsYXNzKVxuICogLSBbbmV3QXBwbHldKHByb3RvX3Byb3RvdHlwZS5qcy5odG1sI25ld0FwcGx5KVxuICovXG52YXIgcHJvdG90eXBlTWV0aG9kcyA9IHJlcXVpcmUoJy4vcHJvdG9fcHJvdG90eXBlJyk7XG5cblxuLyoqXG4gKiBbX19PYmplY3QgZnVuY3Rpb25zX19dKHByb3RvX29iamVjdC5qcy5odG1sKVxuICpcbiAqIC0gW2V4dGVuZF0ocHJvdG9fb2JqZWN0LmpzLmh0bWwjZXh0ZW5kKVxuICogLSBbY2xvbmVdKHByb3RvX29iamVjdC5qcy5odG1sI2Nsb25lKVxuICogLSBbZGVmaW5lUHJvcGVydHldKHByb3RvX29iamVjdC5qcy5odG1sI2RlZmluZVByb3BlcnR5KVxuICogLSBbZGVmaW5lUHJvcGVydGllc10ocHJvdG9fb2JqZWN0LmpzLmh0bWwjZGVmaW5lUHJvcGVydGllcylcbiAqIC0gW2RlZXBFeHRlbmRdKHByb3RvX29iamVjdC5qcy5odG1sI2RlZXBFeHRlbmQpXG4gKiAtIFtkZWVwQ2xvbmVdKHByb3RvX29iamVjdC5qcy5odG1sI2RlZXBDbG9uZSlcbiAqIC0gW2tleXNdKHByb3RvX29iamVjdC5qcy5odG1sI2tleXMpXG4gKiAtIFthbGxLZXlzXShwcm90b19vYmplY3QuanMuaHRtbCNhbGxLZXlzKVxuICogLSBbdmFsdWVzXShwcm90b19vYmplY3QuanMuaHRtbCN2YWx1ZXMpXG4gKiAtIFtrZXlPZl0ocHJvdG9fb2JqZWN0LmpzLmh0bWwja2V5T2YpXG4gKiAtIFthbGxLZXlzT2ZdKHByb3RvX29iamVjdC5qcy5odG1sI2FsbEtleXNPZilcbiAqIC0gW2VhY2hLZXldKHByb3RvX29iamVjdC5qcy5odG1sI2VhY2hLZXkpXG4gKiAtIFttYXBLZXlzXShwcm90b19vYmplY3QuanMuaHRtbCNtYXBLZXlzKVxuICogLSBbcmVkdWNlS2V5c10ocHJvdG9fb2JqZWN0LmpzLmh0bWwjcmVkdWNlS2V5cylcbiAqIC0gW2ZpbHRlcktleXNdKHByb3RvX29iamVjdC5qcy5odG1sI2ZpbHRlcktleXMpXG4gKiAtIFtzb21lS2V5XShwcm90b19vYmplY3QuanMuaHRtbCNzb21lS2V5KVxuICogLSBbZXZlcnlLZXldKHByb3RvX29iamVjdC5qcy5odG1sI2V2ZXJ5S2V5KVxuICogLSBbZmluZFZhbHVlXShwcm90b19vYmplY3QuanMuaHRtbCNmaW5kVmFsdWUpXG4gKiAtIFtmaW5kS2V5XShwcm90b19vYmplY3QuanMuaHRtbCNmaW5kS2V5KVxuICogLSBbcGlja0tleXNdKHByb3RvX29iamVjdC5qcy5odG1sI3BpY2tLZXlzKVxuICogLSBbb21pdEtleXNdKHByb3RvX29iamVjdC5qcy5odG1sI29taXRLZXlzKVxuICogLSBbaXNFcXVhbF0ocHJvdG9fb2JqZWN0LmpzLmh0bWwjaXNFcXVhbClcbiAqIC0gW2lzTm90XShwcm90b19vYmplY3QuanMuaHRtbCNpc05vdClcbiAqL1xudmFyIG9iamVjdE1ldGhvZHMgPSByZXF1aXJlKCcuL3Byb3RvX29iamVjdCcpO1xuXG5cbi8qKlxuICogW19fQXJyYXkgZnVuY3Rpb25zX19dKHByb3RvX2FycmF5LmpzLmh0bWwpXG4gKlxuICogLSBbZmluZF0ocHJvdG9fYXJyYXkuanMuaHRtbCNmaW5kKVxuICogLSBbZmluZEluZGV4XShwcm90b19hcnJheS5qcy5odG1sI2ZpbmRJbmRleClcbiAqIC0gW2FwcGVuZEFycmF5XShwcm90b19hcnJheS5qcy5odG1sI2FwcGVuZEFycmF5KVxuICogLSBbcHJlcGVuZEFycmF5XShwcm90b19hcnJheS5qcy5odG1sI3ByZXBlbmRBcnJheSlcbiAqIC0gW3NwbGljZUl0ZW1dKHByb3RvX2FycmF5LmpzLmh0bWwjc3BsaWNlSXRlbSlcbiAqIC0gW3RvQXJyYXldKHByb3RvX2FycmF5LmpzLmh0bWwjdG9BcnJheSlcbiAqIC0gW29iamVjdF0ocHJvdG9fYXJyYXkuanMuaHRtbCNvYmplY3QpXG4gKiAtIFttYXBUb09iamVjdF0ocHJvdG9fYXJyYXkuanMuaHRtbCNtYXBUb09iamVjdClcbiAqIC0gW3VuaXF1ZV0ocHJvdG9fYXJyYXkuanMuaHRtbCN1bmlxdWUpXG4gKiAtIFtkZWVwRm9yRWFjaF0ocHJvdG9fYXJyYXkuanMuaHRtbCNkZWVwRm9yRWFjaClcbiAqXG4gKiBGdW5jdGlvbnMgdGhhdCBBcnJheSBbaW1wbGVtZW50cyBuYXRpdmVseV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvcHJvdG90eXBlI01ldGhvZHMpIGFyZSBhbHNvIGFkZGVkIC0gdGhleSBjYW4gYmUgdXNlZCB3aXRoIGFycmF5LWxpa2Ugb2JqZWN0cyBhbmQgZm9yIGNoYWluaW5nIChuYXRpdmUgZnVuY3Rpb25zIGFyZSBhbHdheXMgY2FsbGVkKS5cbiAqL1xudmFyIGFycmF5TWV0aG9kcyA9IHJlcXVpcmUoJy4vcHJvdG9fYXJyYXknKTtcblxuXG4vKipcbiAqIFtfX0Z1bmN0aW9uIGZ1bmN0aW9uc19fXShwcm90b19mdW5jdGlvbi5qcy5odG1sKVxuICpcbiAqIC0gW21ha2VGdW5jdGlvbl0ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNtYWtlRnVuY3Rpb24pXG4gKiAtIFtwYXJ0aWFsXShwcm90b19mdW5jdGlvbi5qcy5odG1sI3BhcnRpYWwpXG4gKiAtIFtwYXJ0aWFsUmlnaHRdKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjcGFydGlhbFJpZ2h0KVxuICogLSBbbWVtb2l6ZV0ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNtZW1vaXplKVxuICogLSBbZGVsYXldKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjZGVsYXkpXG4gKiAtIFtkZWZlcl0ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNkZWZlcilcbiAqIC0gW2RlbGF5ZWRdKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjZGVsYXllZClcbiAqIC0gW2RlZmVycmVkXShwcm90b19mdW5jdGlvbi5qcy5odG1sI2RlZmVycmVkKVxuICogLSBbZGVmZXJUaWNrc10ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNkZWZlclRpY2tzKVxuICogLSBbZGVsYXlNZXRob2RdKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjZGVsYXlNZXRob2QpXG4gKiAtIFtkZWZlck1ldGhvZF0ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNkZWZlck1ldGhvZClcbiAqIC0gW2RlYm91bmNlXShwcm90b19mdW5jdGlvbi5qcy5odG1sI2RlYm91bmNlKVxuICogLSBbdGhyb3R0bGVdKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjdGhyb3R0bGUpXG4gKiAtIFtvbmNlXShwcm90b19mdW5jdGlvbi5qcy5odG1sI29uY2UpXG4gKiAtIFt3YWl0Rm9yXShwcm90b19mdW5jdGlvbi5qcy5odG1sI3dhaXRGb3IpXG4qL1xudmFyIGZ1bmN0aW9uTWV0aG9kcyA9IHJlcXVpcmUoJy4vcHJvdG9fZnVuY3Rpb24nKTtcblxuXG4vKipcbiAqIFtfX1N0cmluZyBmdW5jdGlvbnNfX10ocHJvdG9fc3RyaW5nLmpzLmh0bWwpXG4gKlxuICogLSBbZmlyc3RVcHBlckNhc2VdKHByb3RvX3N0cmluZy5qcy5odG1sI2ZpcnN0VXBwZXJDYXNlKVxuICogLSBbZmlyc3RMb3dlckNhc2VdKHByb3RvX3N0cmluZy5qcy5odG1sI2ZpcnN0TG93ZXJDYXNlKVxuICogLSBbdG9SZWdFeHBdKHByb3RvX3N0cmluZy5qcy5odG1sI3RvUmVnRXhwKVxuICogLSBbdG9GdW5jdGlvbl0ocHJvdG9fc3RyaW5nLmpzLmh0bWwjdG9GdW5jdGlvbilcbiAqIC0gW3RvRGF0ZV0ocHJvdG9fc3RyaW5nLmpzLmh0bWwjdG9EYXRlKVxuICogLSBbdG9RdWVyeVN0cmluZ10ocHJvdG9fc3RyaW5nLmpzLmh0bWwjdG9RdWVyeVN0cmluZylcbiAqIC0gW2Zyb21RdWVyeVN0cmluZ10ocHJvdG9fc3RyaW5nLmpzLmh0bWwjZnJvbVF1ZXJ5U3RyaW5nKVxuICogLSBbanNvblBhcnNlXShwcm90b19zdHJpbmcuanMuaHRtbCNqc29uUGFyc2UpXG4gKiAtIFtoYXNoQ29kZV0ocHJvdG9fc3RyaW5nLmpzLmh0bWwjaGFzaENvZGUpXG4gKiAtIFt1blByZWZpeF0ocHJvdG9fc3RyaW5nLmpzLmh0bWwjdW5QcmVmaXgpXG4gKi9cbnZhciBzdHJpbmdNZXRob2RzID0gcmVxdWlyZSgnLi9wcm90b19zdHJpbmcnKTtcblxuXG4vKipcbiAqIFtfX051bWJlciBmdW5jdGlvbnNfX10ocHJvdG9fbnVtYmVyLmpzLmh0bWwpXG4gKlxuICogLSBbaXNOdW1lcmljXShwcm90b19udW1iZXIuanMuaHRtbCNpc051bWVyaWMpXG4gKi9cbnZhciBudW1iZXJNZXRob2RzID0gcmVxdWlyZSgnLi9wcm90b19udW1iZXInKTtcblxuXG4vKipcbiAqIFtfX1V0aWxpdHkgZnVuY3Rpb25zX19dKHByb3RvX3V0aWwuanMuaHRtbClcbiAqXG4gKiAtIFt0aW1lc10ocHJvdG9fdXRpbC5qcy5odG1sI3RpbWVzKVxuICogLSBbcmVwZWF0XShwcm90b191dGlsLmpzLmh0bWwjcmVwZWF0KVxuICogLSBbdGFwXShwcm90b191dGlsLmpzLmh0bWwjdGFwKVxuICogLSBbcmVzdWx0XShwcm90b191dGlsLmpzLmh0bWwjcmVzdWx0KVxuICogLSBbaWRlbnRpdHldKHByb3RvX3V0aWwuanMuaHRtbCNpZGVudGl0eSlcbiAqIC0gW3Byb3BlcnR5XShwcm90b191dGlsLmpzLmh0bWwjcHJvcGVydHkpXG4gKiAtIFtjb21wYXJlUHJvcGVydHldKHByb3RvX3V0aWwuanMuaHRtbCNjb21wYXJlUHJvcGVydHkpXG4gKiAtIFtub29wXShwcm90b191dGlsLmpzLmh0bWwjbm9vcClcbiAqL1xudmFyIHV0aWxNZXRob2RzID0gcmVxdWlyZSgnLi9wcm90b191dGlsJyk7XG5cblxuLyoqXG4gKiBDaGFpbmluZ1xuICogPT09PT09PT1cbiAqXG4gKiBgX2AgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgd3JhcHBlZCB2YWx1ZSAob2JqZWN0LCBmdW5jdGlvbiwgYXJyYXksIGV0Yy4pIHRvIGFsbG93IGNoYWluaW5nIG9mIFByb3RvIGZ1bmN0aW9ucy5cbiAqIFRvIHVud3JhcCwgYF9gIG1ldGhvZCBvZiBhIHdyYXBwZWQgdmFsdWUgc2hvdWxkIGJlIHVzZWQuXG4gKiBVc2FnZTpcbiAqIGBgYFxuICogdmFyIGFyciA9IF8oeyAwOiAzLCAxOiA0LCAyOiA1LCBsZW5ndGg6IDN9KVxuICogICAgICAgICAgICAgIC50b0FycmF5KClcbiAqICAgICAgICAgICAgICAucHJlcGVuZEFycmF5KFsxLCAyXSlcbiAqICAgICAgICAgICAgICAuYXBwZW5kQXJyYXkoWzYsIDcsIDhdKVxuICogICAgICAgICAgICAgIC5fKCk7XG4gKiBgYGBcbiAqIEEgd3JhcHBlZCBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgYF9gIChgUHJvdG9gIGNsYXNzKS5cbiAqXG4gKiBDaGFpbmluZyBpcyBpbXBsZW1lbnRlZCBmb3IgZGV2ZWxvcG1lbnQgY29udmVuaWVuY2UsIGJ1dCBpdCBoYXMgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQsIG5vdCBvbmx5IHRvIHdyYXAgYW5kIHVud3JhcCB2YWx1ZXMgYnV0IGluIGVhY2ggZnVuY3Rpb24gY2FsbC5cbiAqIEFsdGhvdWdoIGFsbCBQcm90byBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIGFzIG1ldGhvZHMgb3BlcmF0aW5nIG9uIHRoaXMgYW5kIHRoZSBvdmVyaGVhZCB0byByZWRlZmluZSB0aGVtIGFzIGZ1bmN0aW9ucyBpcyB2ZXJ5IHNtYWxsLCB0aGUgb3ZlcmhlYWQgdG8gcmVkZWZpbmUgdGhlbSBhcyBtZXRob2RzIG9mIHdyYXBwZWQgdmFsdWUgaXMgc2xpZ2h0bHkgaGlnaGVyIC0gY2hhaW5pbmcgaXMgMTUtMjUlIHNsb3dlciB0aGFuIHVzaW5nIGZ1bmN0aW9ucyAocHJvcGVydGllcyBvZiBfIHRoYXQgdGFrZSB0aGUgZmlyc3QgcGFyYW1ldGVyKS5cbiAqIEluIGNhc2VzIHdoZW4gcGVyZm9ybWFuY2UgaXMgY3JpdGljYWwsIHlvdSBtYXkgd2FudCB0byBhdm9pZCB1c2luZyBjaGFpbmluZy5cbiAqXG4gKiBAcGFyYW0ge0FueX0gc2VsZiBBIHZhbHVlIHRvIGJlIHdyYXBwZWRcbiAqIEByZXR1cm4ge1Byb3RvfVxuICovXG5mdW5jdGlvbiBQcm90byhzZWxmKSB7XG4gICAgLy8gd3JhcCBwYXNzZWQgcGFyYW1ldGVyIGluIF8gb2JqZWN0XG4gICAgdmFyIHdyYXBwZWQgPSBPYmplY3QuY3JlYXRlKFByb3RvLnByb3RvdHlwZSk7XG4gICAgd3JhcHBlZC5zZWxmID0gc2VsZjtcbiAgICByZXR1cm4gd3JhcHBlZDtcbn07XG5cbnZhciBfID0gUHJvdG87XG5cblxuLy8gc3RvcmUgcmF3IG1ldGhvZHMgZnJvbSBkaWZmZXJlbnQgbW9kdWxlcyBpbiBfXyBvYmplY3QgKGRvdWJsZSBcIl9cIilcbnZhciBfXyA9IHt9O1xuXG5vYmplY3RNZXRob2RzLmV4dGVuZC5jYWxsKF9fLCBvYmplY3RNZXRob2RzKTtcbl9fLmV4dGVuZC5jYWxsKF9fLCBwcm90b3R5cGVNZXRob2RzKTtcbl9fLmV4dGVuZC5jYWxsKF9fLCBhcnJheU1ldGhvZHMpO1xuX18uZXh0ZW5kLmNhbGwoX18sIHN0cmluZ01ldGhvZHMpO1xuX18uZXh0ZW5kLmNhbGwoX18sIG51bWJlck1ldGhvZHMpO1xuX18uZXh0ZW5kLmNhbGwoX18sIGZ1bmN0aW9uTWV0aG9kcyk7XG5fXy5leHRlbmQuY2FsbChfXywgdXRpbE1ldGhvZHMpO1xuXG5cbi8vIGFkZCBfXyBhcyBwcm9wZXJ0eSBvZiBQcm90bywgc28gdGhleSBjYW4gYmUgdXNlZCBhcyBtaXhpbnMgaW4gb3RoZXIgY2xhc3Nlc1xuX18uZGVmaW5lUHJvcGVydHkoUHJvdG8sICdfXycsIF9fKTtcblxuXG4vLyBhZGQgXyBtZXRob2QgdG8gdW53cmFwIHdyYXBwZWQgdmFsdWUgKFByb3RvIGluc3RhbmNlKVxuZnVuY3Rpb24gdW53cmFwUHJvdG8oKSB7IHJldHVybiB0aGlzLnNlbGY7IH1cbl9fLmV4dGVuZFByb3RvLmNhbGwoUHJvdG8sIHsgXzogdW53cmFwUHJvdG8gfSk7XG5cbi8vIGFkZCBjb25zdGFudHMgKGZ1bmN0aW9ucyB3aWxsIGJlIG92ZXJ3cml0dGVuKVxuX18uZXh0ZW5kLmNhbGwoUHJvdG8sIG9iamVjdE1ldGhvZHMuX2NvbnN0YW50cyk7XG5cbi8vIGFkZCBmdW5jdGlvbnMgdGhhdCB0YWtlIGZpcnN0IHBhcmFtZXRlciBpbnN0ZWFkIG9mIFwidGhpc1wiIHRvIFByb3RvXG52YXIgcHJvdG9GdW5jcyA9IF9fLm1hcEtleXMuY2FsbChfXywgdXRpbHMubWFrZVByb3RvRnVuY3Rpb24sIHRydWUpO1xuX18uZXh0ZW5kLmNhbGwoUHJvdG8sIHByb3RvRnVuY3MpO1xuXG4vLyBhZGQgUHJvdG8gd3JhcHBlZCB2YWx1ZSBpbnN0YW5jZSBtZXRob2RzIHRvIFByb3RvIHByb3RvdHlwZVxudmFyIHByb3RvSW5zdGFuY2VNZXRob2RzID0gX18ubWFwS2V5cy5jYWxsKF9fLCB1dGlscy5tYWtlUHJvdG9JbnN0YW5jZU1ldGhvZCwgdHJ1ZSk7XG5fXy5leHRlbmRQcm90by5jYWxsKFByb3RvLCBwcm90b0luc3RhbmNlTWV0aG9kcyk7XG5cblxuLyoqXG4gKiBJbiB3aW5kb3dzIGVudmlyb25tZW50LCBhIGdsb2JhbCBgX2AgdmFsdWUgaXMgcHJlc2VydmVkIGluIGBfLnVuZGVyc2NvcmVgXG4gKi9cbmlmICh0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnKSB7XG4gICAgLy8gcHJlc2VydmUgZXhpc3RpbmcgXyBvYmplY3RcbiAgICBpZiAod2luZG93Ll8pXG4gICAgICAgIFByb3RvLnVuZGVyc2NvcmUgPSB3aW5kb3cuX1xuXG4gICAgLy8gZXhwb3NlIGdsb2JhbCBfIGFuZCBQcm90b1xuICAgIHdpbmRvdy5fID0gUHJvdG87XG59XG5cbmlmICh0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKVxuICAgIC8vIGV4cG9ydCBmb3Igbm9kZS9icm93c2VyaWZ5XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBQcm90bztcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9fID0gcmVxdWlyZSgnLi9wcm90b19vYmplY3QnKVxuICAgICwgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cblxuLyoqXG4gKiAtIFtmaW5kXSgjZmluZClcbiAqIC0gW2ZpbmRJbmRleF0oI2ZpbmRJbmRleClcbiAqIC0gW2FwcGVuZEFycmF5XSgjYXBwZW5kQXJyYXkpXG4gKiAtIFtwcmVwZW5kQXJyYXldKCNwcmVwZW5kQXJyYXkpXG4gKiAtIFtzcGxpY2VJdGVtXSgjc3BsaWNlSXRlbSlcbiAqIC0gW3RvQXJyYXldKCN0b0FycmF5KVxuICogLSBbb2JqZWN0XSgjb2JqZWN0KVxuICogLSBbbWFwVG9PYmplY3RdKCNtYXBUb09iamVjdClcbiAqIC0gW3VuaXF1ZV0oI3VuaXF1ZSlcbiAqIC0gW2RlZXBGb3JFYWNoXSgjZGVlcEZvckVhY2gpXG4gKlxuICogVGhlc2UgbWV0aG9kcyBjYW4gYmUgW2NoYWluZWRdKHByb3RvLmpzLmh0bWwjUHJvdG8pLlxuICovXG52YXIgYXJyYXlNZXRob2RzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgLy8gZmluZDogc2VlIGJlbG93XG4gICAgLy8gZmluZEluZGV4OiBzZWUgYmVsb3dcbiAgICBhcHBlbmRBcnJheTogYXBwZW5kQXJyYXksXG4gICAgcHJlcGVuZEFycmF5OiBwcmVwZW5kQXJyYXksXG4gICAgdG9BcnJheTogdG9BcnJheSxcbiAgICBvYmplY3Q6IG9iamVjdCxcbiAgICBtYXBUb09iamVjdDogbWFwVG9PYmplY3QsXG4gICAgdW5pcXVlOiB1bmlxdWUsXG4gICAgZGVlcEZvckVhY2g6IGRlZXBGb3JFYWNoLFxuICAgIHNwbGljZUl0ZW06IHNwbGljZUl0ZW1cbn07XG5cblxuLyoqXG4gKiBGdW5jdGlvbnMgdGhhdCBBcnJheSBbaW1wbGVtZW50cyBuYXRpdmVseV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvcHJvdG90eXBlI01ldGhvZHMpIGFyZSBhbHNvIGluY2x1ZGVkIGZvciBjb252ZW5pZW5jZSAtIHRoZXkgY2FuIGJlIHVzZWQgd2l0aCBhcnJheS1saWtlIG9iamVjdHMgYW5kIGZvciBjaGFpbmluZyAobmF0aXZlIGZ1bmN0aW9ucyBhcmUgYWx3YXlzIGNhbGxlZCkuXG4gKiBUaGVzZSBtZXRob2RzIGNhbiBiZSBbY2hhaW5lZF0ocHJvdG8uanMuaHRtbCNQcm90bykgdG9vLlxuICovXG52YXIgbmF0aXZlQXJyYXlNZXRob2RzTmFtZXMgPSBbICdqb2luJywgJ3BvcCcsICdwdXNoJywgJ2NvbmNhdCcsXG4gICAgJ3JldmVyc2UnLCAnc2hpZnQnLCAndW5zaGlmdCcsICdzbGljZScsICdzcGxpY2UnLFxuICAgICdzb3J0JywgJ2ZpbHRlcicsICdmb3JFYWNoJywgJ3NvbWUnLCAnZXZlcnknLFxuICAgICdtYXAnLCAnaW5kZXhPZicsICdsYXN0SW5kZXhPZicsICdyZWR1Y2UnLCAncmVkdWNlUmlnaHQnXTtcblxudmFyIG5hdGl2ZUFycmF5TWV0aG9kcyA9IG1hcFRvT2JqZWN0LmNhbGwobmF0aXZlQXJyYXlNZXRob2RzTmFtZXMsXG4gICAgICAgIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGVbbWV0aG9kTmFtZV07XG4gICAgICAgIH0pO1xuXG5fXy5leHRlbmQuY2FsbChhcnJheU1ldGhvZHMsIG5hdGl2ZUFycmF5TWV0aG9kcyk7XG5cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBFUzYgW0FycmF5IF9fZmluZF9fIG1ldGhvZF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZmluZCkgKG5hdGl2ZSBtZXRob2QgaXMgdXNlZCBpZiBhdmFpbGFibGUpLlxuICogUmV0dXJucyBhcnJheSBlbGVtZW50IHRoYXQgcGFzc2VzIGNhbGxiYWNrIHRlc3QuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gc2VsZiBhcnJheSB0byBzZWFyY2ggaW5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHNob3VsZCByZXR1cm4gYHRydWVgIGZvciBpdGVtIHRvIHBhc3MgdGhlIHRlc3QsIHBhc3NlZCBgdmFsdWVgLCBgaW5kZXhgIGFuZCBgc2VsZmAgYXMgcGFyYW1ldGVyc1xuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgb3B0aW9uYWwgY29udGV4dCAoYHRoaXNgKSBvZiBjYWxsYmFjayBjYWxsXG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmFycmF5TWV0aG9kcy5maW5kID0gQXJyYXkucHJvdG90eXBlLmZpbmRcbiAgICB8fCB1dGlscy5tYWtlRmluZE1ldGhvZChhcnJheU1ldGhvZHMuZm9yRWFjaCwgJ3ZhbHVlJyk7XG5cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBFUzYgW0FycmF5IF9fZmluZEluZGV4X18gbWV0aG9kXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9maW5kSW5kZXgpIChuYXRpdmUgbWV0aG9kIGlzIHVzZWQgaWYgYXZhaWxhYmxlKS5cbiAqIFJldHVybnMgdGhlIGluZGV4IG9mIGFycmF5IGVsZW1lbnQgdGhhdCBwYXNzZXMgY2FsbGJhY2sgdGVzdC4gUmV0dXJucyBgLTFgIGlmIG5vdCBmb3VuZC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBzZWxmIGFycmF5IHRvIHNlYXJjaCBpblxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgc2hvdWxkIHJldHVybiBgdHJ1ZWAgZm9yIGl0ZW0gdG8gcGFzcyB0aGUgdGVzdCwgcGFzc2VkIGB2YWx1ZWAsIGBpbmRleGAgYW5kIGBzZWxmYCBhcyBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBvcHRpb25hbCBjb250ZXh0IChgdGhpc2ApIG9mIGNhbGxiYWNrIGNhbGxcbiAqIEByZXR1cm4ge0ludGVnZXJ9XG4gKi9cbmFycmF5TWV0aG9kcy5maW5kSW5kZXggPSBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4XG4gICAgfHwgdXRpbHMubWFrZUZpbmRNZXRob2QoYXJyYXlNZXRob2RzLmZvckVhY2gsICdpbmRleCcpO1xuXG5cbi8qKlxuICogQXBwZW5kcyBgYXJyYXlUb0FwcGVuZGAgdG8gdGhlIGVuZCBvZiBhcnJheSBgc2VsZmAgaW4gcGxhY2UgKGNhbiBiZSBhbiBpbnN0YW5jZSBvZiBBcnJheSBvciBhcnJheS1saWtlIG9iamVjdCkuXG4gKiBDaGFuZ2VzIHRoZSB2YWx1ZSBvZiBgc2VsZmAgKGl0IHVzZXMgYEFycmF5LnByb3RvdHlwZS5zcGxpY2VgKSBhbmQgcmV0dXJucyBgc2VsZmAuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gc2VsZiBBbiBhcnJheSB0aGF0IHdpbGwgYmUgbW9kaWZpZWRcbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXktbGlrZX0gYXJyYXlUb0FwcGVuZCBBbiBhcnJheSB0aGF0IHdpbGwgYmUgYXBwZW5kZWRcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBhcHBlbmRBcnJheShhcnJheVRvQXBwZW5kKSB7XG4gICAgaWYgKCEgYXJyYXlUb0FwcGVuZC5sZW5ndGgpIHJldHVybiB0aGlzO1xuICAgIGlmICghIEFycmF5LmlzQXJyYXkoYXJyYXlUb0FwcGVuZCkpXG4gICAgICAgIGFycmF5VG9BcHBlbmQgPSB0b0FycmF5LmNhbGwoYXJyYXlUb0FwcGVuZCk7XG4gICAgXG4gICAgdmFyIGFyZ3MgPSBbdGhpcy5sZW5ndGgsIDBdLmNvbmNhdChhcnJheVRvQXBwZW5kKTtcbiAgICBhcnJheU1ldGhvZHMuc3BsaWNlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBQcmVwZW5kcyBgYXJyYXlUb1ByZXBlbmRgIHRvIHRoZSBiZWdpbm5pZyBvZiBhcnJheSBgc2VsZmAgaW4gcGxhY2UgKGNhbiBiZSBhbiBpbnN0YW5jZSBvZiBBcnJheSBvciBhcnJheS1saWtlIG9iamVjdCkuXG4gKiBDaGFuZ2VzIHRoZSB2YWx1ZSBvZiBgc2VsZmAgKGl0IHVzZXMgYEFycmF5LnByb3RvdHlwZS5zcGxpY2VgKSBhbmQgcmV0dXJucyBgc2VsZmAuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gc2VsZiBBbiBhcnJheSB0aGF0IHdpbGwgYmUgbW9kaWZpZWRcbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXktbGlrZX0gYXJyYXlUb0FwcGVuZCBBbiBhcnJheSB0aGF0IHdpbGwgYmUgcHJlcGVuZGVkXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gcHJlcGVuZEFycmF5KGFycmF5VG9QcmVwZW5kKSB7XG4gICAgaWYgKCEgYXJyYXlUb1ByZXBlbmQubGVuZ3RoKSByZXR1cm4gdGhpcztcbiAgICBpZiAoISBBcnJheS5pc0FycmF5KGFycmF5VG9QcmVwZW5kKSlcbiAgICAgICAgYXJyYXlUb1ByZXBlbmQgPSB0b0FycmF5LmNhbGwoYXJyYXlUb1ByZXBlbmQpO1xuXG4gICAgdmFyIGFyZ3MgPSBbMCwgMF0uY29uY2F0KGFycmF5VG9QcmVwZW5kKTtcbiAgICBhcnJheU1ldGhvZHMuc3BsaWNlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIGl0ZW0gZnJvbSBhcnJheSB0aGF0IGlzIGZvdW5kIHVzaW5nIGluZGV4T2YgKGkuZS4gJz09PScpXG4gKiBNb2RpZmllcyBvcmlnaW5hbCBhcnJheSBhbmQgcmV0dXJucyB0aGUgcmVmZXJlbmNlIHRvIGl0LlxuICogXG4gKiBAcGFyYW0ge0FycmF5fSBzZWxmIEFuIGFycmF5IHRoYXQgd2lsbCBiZSBtb2RpZmllZFxuICogQHBhcmFtICB7QW55fSBpdGVtIGl0ZW0gdG8gYmUgcmVtb3ZlZFxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHNwbGljZUl0ZW0oaXRlbSkge1xuICAgIHZhciBpbmRleCA9IHRoaXMuaW5kZXhPZihpdGVtKTtcbiAgICBpZiAoaW5kZXggPj0gMCkgdGhpcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBuZXcgYXJyYXkgY3JlYXRlZCBmcm9tIGFycmF5LWxpa2Ugb2JqZWN0IChlLmcuLCBgYXJndW1lbnRzYCBwc2V1ZG8tYXJyYXkpLlxuICpcbiAqIEBwYXJhbSB7QXJyYXktbGlrZX0gc2VsZiBPYmplY3Qgd2l0aCBudW1lcmljIHByb3BlcnR5IGxlbmd0aFxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHRvQXJyYXkoKSB7XG4gICAgcmV0dXJuIGFycmF5TWV0aG9kcy5zbGljZS5jYWxsKHRoaXMpO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBhbiBvYmplY3QgY3JlYXRlZCBmcm9tIHRoZSBhcnJheSBvZiBga2V5c2AgYW5kIG9wdGlvbmFsIGFycmF5IG9mIGB2YWx1ZXNgLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHNlbGYgQXJyYXkgb2Yga2V5c1xuICogQHBhcmFtIHtBcnJheXxhbnl9IHZhbHVlcyBPcHRpb25hbCBhcnJheSBvZiB2YWx1ZXMgb3IgdGhlIHZhbHVlIHRvIGJlIGFzc2lnbmVkIHRvIGVhY2ggcHJvcGVydHkuXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIG9iamVjdCh2YWx1ZXMpIHtcbiAgICB2YXIgb2JqID0ge31cbiAgICAgICAgLCB2YWx1ZXNJc0FycmF5ID0gQXJyYXkuaXNBcnJheSh2YWx1ZXMpO1xuICAgIGFycmF5TWV0aG9kcy5mb3JFYWNoLmNhbGwodGhpcywgZnVuY3Rpb24oa2V5LCBpbmRleCkge1xuICAgICAgICBvYmpba2V5XSA9IHZhbHVlc0lzQXJyYXkgPyB2YWx1ZXNbaW5kZXhdIDogdmFsdWVzO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG9iajtcbn1cblxuXG4vKipcbiAqIE1hcHMgYXJyYXkgdG8gb2JqZWN0LlxuICogQXJyYXkgZWxlbWVudHMgYmVjb21lIGtleXMsIHZhbHVlIGFyZSB0YWtlbiBmcm9tIGBjYWxsYmFja2AuXG4gKiBcbiAqIEBwYXJhbSB7QXJyYXl9IHNlbGYgQW4gYXJyYXkgd2hpY2ggdmFsdWVzIHdpbGwgYmVjb21lIGtleXMgb2YgdGhlIHJlc3VsdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgaXMgcGFzc2VkIGB2YWx1ZWAsIGBpbmRleGAgYW5kIGBzZWxmYCBhbmQgc2hvdWxkIHJldHVybiB2YWx1ZSB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIEFuIG9wdGlvbmFsIGNvbnRleHQgb2YgaXRlcmF0aW9uICh0aGUgdmFsdWVvZiBgdGhpc2ApLCB3aWxsIGJlIHVuZGVmaW5lZCBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgcGFzc2VkLlxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBtYXBUb09iamVjdChjYWxsYmFjaywgdGhpc0FyZykge1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHRoaXMsIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkge1xuICAgICAgICByZXN1bHRbdmFsdWVdID0gY2FsbGJhY2suY2FsbCh0aGlzQXJnLCB2YWx1ZSwgaW5kZXgsIHRoaXMpO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFycmF5IHdpdGhvdXQgZHVwbGljYXRlcy4gRG9lcyBub3QgbW9kaWZ5IG9yaWdpbmFsIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHNlbGYgb3JpZ2luYWwgYXJyYXlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGNvbXBhcmlzb24gZnVuY3Rpb24sIHNob3VsZCByZXR1cm4gdHJ1ZSBmb3IgZXF1YWwgaXRlbXMsIFwiPT09XCIgaXMgdXNlZCBpZiBub3QgcGFzc2VkLlxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHVuaXF1ZShjYWxsYmFjaykge1xuICAgIHZhciBmaWx0ZXJlZCA9IFtdO1xuICAgIGlmICghIGNhbGxiYWNrKVxuICAgICAgICBpdGVtSW5kZXggPSBpdGVtSW5kZXhPZjtcblxuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGl0ZW1JbmRleChpdGVtKTtcbiAgICAgICAgaWYgKGluZGV4ID09IC0xKVxuICAgICAgICAgICAgZmlsdGVyZWQucHVzaChpdGVtKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmaWx0ZXJlZDtcblxuXG4gICAgZnVuY3Rpb24gaXRlbUluZGV4KGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TWV0aG9kcy5maW5kSW5kZXguY2FsbChmaWx0ZXJlZCwgZnVuY3Rpb24oaXQpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhpdGVtLCBpdCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGl0ZW1JbmRleE9mKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkLmluZGV4T2YoaXRlbSk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogSXRlcmF0ZXMgYXJyYXkgYW5kIGVsZW1lbnRzIHRoYXQgYXJlIGFycmF5cyBjYWxsaW5nIGNhbGxiYWNrIHdpdGggZWFjaCBlbGVtZW50IHRoYXQgaXMgbm90IGFuIGFycmF5LiBDYW4gYmUgdXNlZCB0byBpdGVyYXRlIG92ZXIgYXJndW1lbnRzIGxpc3QgdG8gYXZvaWQgY2hlY2tpbmcgd2hldGhlciBhcnJheSBvciBsaXN0IG9mIHBhcmFtZXRlcnMgaXMgcGFzc2VkLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXktbGlrZX0gc2VsZiBhcnJheSBvZiBlbGVtZW50cyBhbmQgYXJyYXlzdG8gaXRlcmF0ZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGNhbGxlZCBmb3IgZWFjaCBpdGVtIHRoYXQgaXMgbm90IGFuIGFycmF5LiBDYWxsYmFjayBpcyBwYXNzZWQgaXRlbSwgaW5kZXggYW5kIG9yaWdpbmFsIGFycmF5IGFzIHBhcmFtZXRlcnMuXG4gKiBAcGFyYW0ge0FueX0gdGhpc0FyZyBvcHRpb25hbCBjYWxsYmFjayBlbnZvY2F0aW9uIGNvbnRleHRcbiAqL1xuZnVuY3Rpb24gZGVlcEZvckVhY2goY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICB2YXIgaW5kZXggPSAwLCBhcnIgPSB0aGlzO1xuICAgIF9kZWVwRm9yRWFjaC5jYWxsKHRoaXMpO1xuXG4gICAgZnVuY3Rpb24gX2RlZXBGb3JFYWNoKCkge1xuICAgICAgICBhcnJheU1ldGhvZHMuZm9yRWFjaC5jYWxsKHRoaXMsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgICAgICAgICAgX2RlZXBGb3JFYWNoLmNhbGwodmFsdWUpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWUsIGluZGV4KyssIGFycik7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgbWFrZVByb3RvRnVuY3Rpb24gPSByZXF1aXJlKCcuL3V0aWxzJykubWFrZVByb3RvRnVuY3Rpb25cbiAgICAsIHJlcGVhdCA9IHJlcXVpcmUoJy4vcHJvdG9fdXRpbCcpLnJlcGVhdDtcblxuXG4vKipcbiAqIC0gW21ha2VGdW5jdGlvbl0oI21ha2VGdW5jdGlvbilcbiAqIC0gW3BhcnRpYWxdKCNwYXJ0aWFsKVxuICogLSBbcGFydGlhbFJpZ2h0XSgjcGFydGlhbFJpZ2h0KVxuICogLSBbbWVtb2l6ZV0oI21lbW9pemUpXG4gKiAtIFtkZWxheV0oI2RlbGF5KVxuICogLSBbZGVmZXJdKCNkZWZlcilcbiAqIC0gW2RlbGF5ZWRdKCNkZWxheWVkKVxuICogLSBbZGVmZXJyZWRdKCNkZWZlcnJlZClcbiAqIC0gW2RlZmVyVGlja3NdKCNkZWZlclRpY2tzKVxuICogLSBbZGVsYXlNZXRob2RdKCNkZWxheU1ldGhvZClcbiAqIC0gW2RlZmVyTWV0aG9kXSgjZGVmZXJNZXRob2QpXG4gKiAtIFtkZWJvdW5jZV0oI2RlYm91bmNlKVxuICogLSBbdGhyb3R0bGVdKCN0aHJvdHRsZSlcbiAqIC0gW29uY2VdKCNvbmNlKVxuICogLSBbd2FpdEZvcl0oI3dhaXRGb3IpXG4gKiAtIFtub3RdKCNub3QpXG4gKlxuICogVGhlc2UgbWV0aG9kcyBjYW4gYmUgW2NoYWluZWRdKHByb3RvLmpzLmh0bWwjUHJvdG8pXG4gKi9cbnZhciBmdW5jdGlvbk1ldGhvZHMgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBtYWtlRnVuY3Rpb246IG1ha2VGdW5jdGlvbixcbiAgICBwYXJ0aWFsOiBwYXJ0aWFsLFxuICAgIHBhcnRpYWxSaWdodDogcGFydGlhbFJpZ2h0LFxuICAgIG1lbW9pemU6IG1lbW9pemUsXG4gICAgZGVsYXk6IGRlbGF5LFxuICAgIGRlZmVyOiBkZWZlcixcbiAgICBkZWxheWVkOiBkZWxheWVkLFxuICAgIGRlZmVycmVkOiBkZWZlcnJlZCxcbiAgICBkZWZlclRpY2tzOiBkZWZlclRpY2tzLFxuICAgIGRlbGF5TWV0aG9kOiBkZWxheU1ldGhvZCxcbiAgICBkZWZlck1ldGhvZDogZGVmZXJNZXRob2QsXG4gICAgZGVib3VuY2U6IGRlYm91bmNlLFxuICAgIHRocm90dGxlOiB0aHJvdHRsZSxcbiAgICBvbmNlOiBvbmNlLFxuICAgIHdhaXRGb3I6IHdhaXRGb3IsXG4gICAgbm90OiBub3Rcbn07XG5cblxudmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuXG5cbi8qKlxuICogU2ltaWxhcmx5IHRvIEZ1bmN0aW9uIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBmdW5jdGlvbiBmcm9tIGNvZGUuXG4gKiBVbmxpa2UgRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIGZ1bmN0aW9uIG5hbWVcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBuZXcgZnVuY3Rpb24gbmFtZVxuICogQHBhcmFtIHtTdHJpbmd9IGFyZzEsIGFyZzIsIC4uLiB0aGUgbmFtZXMgb2YgZnVuY3Rpb24gcGFyYW1ldGVyc1xuICogQHBhcmFtIHtTdHJpbmd9IGZ1bmNCb2R5IGZ1bmN0aW9uIGJvZHlcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBtYWtlRnVuY3Rpb24oYXJnMSwgYXJnMiwgZnVuY0JvZHkpIHtcbiAgICB2YXIgbmFtZSA9IHRoaXNcbiAgICAgICAgLCBjb3VudCA9IGFyZ3VtZW50cy5sZW5ndGggLSAxXG4gICAgICAgICwgZnVuY0JvZHkgPSBhcmd1bWVudHNbY291bnRdXG4gICAgICAgICwgZnVuY1xuICAgICAgICAsIGNvZGUgPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspXG4gICAgICAgIGNvZGUgKz0gJywgJyArIGFyZ3VtZW50c1tpXTtcbiAgICBjb2RlID0gWydmdW5jID0gZnVuY3Rpb24gJywgbmFtZSwgJygnLCBjb2RlLnNsaWNlKDIpLCAnKSB7XFxuJ1xuICAgICAgICAgICAgICAgICwgZnVuY0JvZHksICdcXG59J10uam9pbignJyk7XG4gICAgZXZhbChjb2RlKTtcbiAgICByZXR1cm4gZnVuYztcbn1cblxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiBhcyBhIHJlc3VsdCBvZiBwYXJ0aWFsIGZ1bmN0aW9uIGFwcGxpY2F0aW9uIHdpdGggdGhlIHBhc3NlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgRnVuY3Rpb24gdG8gYmUgYXBwbGllZFxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgQXJndW1lbnRzIGFmdGVyIHNlbGYgd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIGNhbGwgd2hlbiB0aGUgcGFydGlhbCBmdW5jdGlvbiBpcyBjYWxsZWQuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gcGFydGlhbCgpIHsgLy8gLCAuLi4gYXJndW1lbnRzXG4gICAgdmFyIGZ1bmMgPSB0aGlzO1xuICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XG4gICAgfTtcbn1cblxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiBhcyBhIHJlc3VsdCBvZiBwYXJ0aWFsIGZ1bmN0aW9uIGFwcGxpY2F0aW9uIHdpdGggdGhlIHBhc3NlZCBwYXJhbWV0ZXJzLCBidXQgcGFyYW1ldGVycyBhcmUgYXBwZW5kZWQgb24gdGhlIHJpZ2h0LlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgRnVuY3Rpb24gdG8gYmUgYXBwbGllZFxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgQXJndW1lbnRzIGFmdGVyIHNlbGYgd2lsbCBiZSBhcHBlbmRlZCBvbiB0aGUgcmlnaHQgdG8gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIGNhbGwgd2hlbiB0aGUgcGFydGlhbCBmdW5jdGlvbiBpcyBjYWxsZWQuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gcGFydGlhbFJpZ2h0KCkgeyAvLyAsIC4uLiBhcmd1bWVudHNcbiAgICB2YXIgZnVuYyA9IHRoaXM7XG4gICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBzbGljZS5jYWxsKGFyZ3VtZW50cykuY29uY2F0KGFyZ3MpKTtcbiAgICB9O1xufVxuXG5cbi8qKlxuICogQ3JlYXRlcyBhIG1lbW9pemVkIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uIHVzaW5nIHN1cHBsaWVkIGhhc2ggZnVuY3Rpb24gYXMga2V5LiBJZiB0aGUgaGFzaCBpcyBub3Qgc3VwcGxpZWQsIHVzZXMgaXRzIGZpcnN0IHBhcmFtZXRlciBhcyB0aGUgaGFzaC5cbiAqIFxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2VsZiBmdW5jdGlvbiB0byBiZSBtZW1vaXplZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFzaEZ1bmMgb3B0aW9uYWwgaGFzaCBmdW5jdGlvbiB0aGF0IGlzIHBhc3NlZCBhbGwgZnVuY3Rpb24gYXJndW1lbnRzIGFuZCBzaG91bGQgcmV0dXJuIGNhY2hlIGtleS5cbiAqIEBwYXJhbSB7SW50ZWdlcn0gbGltaXQgb3B0aW9uYWwgbWF4aW11bSBudW1iZXIgb2YgcmVzdWx0cyB0byBiZSBzdG9yZWQgaW4gdGhlIGNhY2hlLiAxMDAwIGJ5IGRlZmF1bHQuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gbWVtb2l6ZWQgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZShoYXNoRnVuYywgbGltaXQpIHtcbiAgICB2YXIgZnVuYyA9IHRoaXM7XG4gICAgdmFyIGNhY2hlID0ge30sIGtleXNMaXN0ID0gW107XG4gICAgbGltaXQgPSBsaW1pdCB8fCAxMDAwO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIga2V5ID0gaGFzaEZ1bmMgPyBoYXNoRnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogYXJndW1lbnRzWzBdO1xuICAgICAgICBpZiAoY2FjaGUuaGFzT3duUHJvcGVydHkoa2V5KSlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZVtrZXldO1xuXG4gICAgICAgIHZhciByZXN1bHQgPSBjYWNoZVtrZXldID0gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICBrZXlzTGlzdC5wdXNoKGtleSk7XG5cbiAgICAgICAgaWYgKGtleXNMaXN0Lmxlbmd0aCA+IGxpbWl0KVxuICAgICAgICAgICAgZGVsZXRlIGNhY2hlW2tleXNMaXN0LnNoaWZ0KCldO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbn1cblxuXG4vKipcbiAqIERlbGF5cyBmdW5jdGlvbiBleGVjdXRpb24gYnkgYSBnaXZlbiB0aW1lIGluIG1pbGxpc2Vjb25kcy5cbiAqIFRoZSBjb250ZXh0IGluIGZ1bmN0aW9uIHdoZW4gaXQgaXMgZXhlY3V0ZWQgaXMgc2V0IHRvIGBudWxsYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxmIGZ1bmN0aW9uIHRoYXQgZXhlY3V0aW9uIGhhcyB0byBiZSBkZWxheWVkXG4gKiBAcGFyYW0ge051bWJlcn0gd2FpdCBhcHByb3hpbWF0ZSBkYWxheSB0aW1lIGluIG1pbGxpc2Vjb25kc1xuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgb3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGRlbGF5KHdhaXQpIHsgLy8gLCBhcmd1bWVudHNcbiAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICByZXR1cm4gX2RlbGF5KHRoaXMsIHdhaXQsIGFyZ3MpO1xufVxuIFxuXG4vKipcbiAqIERlZmVycyBmdW5jdGlvbiBleGVjdXRpb24gKGV4ZWN1dGVzIGFzIHNvb24gYXMgZXhlY3V0aW9uIGxvb3AgYmVjb21lcyBmcmVlKVxuICogVGhlIGNvbnRleHQgaW4gZnVuY3Rpb24gd2hlbiBpdCBpcyBleGVjdXRlZCBpcyBzZXQgdG8gYG51bGxgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgZnVuY3Rpb24gdGhhdCBleGVjdXRpb24gaGFzIHRvIGJlIGRlbGF5ZWRcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIG9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBkZWZlcigpIHsgLy8gLCBhcmd1bWVudHNcbiAgICByZXR1cm4gX2RlbGF5KHRoaXMsIDEsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9kZWxheShmdW5jLCB3YWl0LCBhcmdzLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuYy5hcHBseS5iaW5kKGZ1bmMsIGNvbnRleHQgfHwgbnVsbCwgYXJncyksIHdhaXQpO1xufVxuXG4vKipcbiAqIFNhbWUgYXMgXy5kZWZlciwgdGFrZXMgZmlyc3QgYXJndW1lbnQgYXMgdGhlIGZ1bmN0aW9uIHRvIGJlIGRlZmVycmVkXG4gKi9cbnZhciBkZWZlckZ1bmMgPSBtYWtlUHJvdG9GdW5jdGlvbihkZWZlcik7XG5cbi8qKlxuICogRGVmZXJzIGZ1bmN0aW9uIGV4ZWN1dGlvbiBmb3IgYHRpbWVzYCB0aWNrcyAoZXhlY3V0ZXMgYWZ0ZXIgZXhlY3V0aW9uIGxvb3AgYmVjb21lcyBmcmVlIGB0aW1lc2AgdGltZXMpXG4gKiBUaGUgY29udGV4dCBpbiBmdW5jdGlvbiB3aGVuIGl0IGlzIGV4ZWN1dGVkIGlzIHNldCB0byBgbnVsbGAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2VsZiBmdW5jdGlvbiB0aGF0IGV4ZWN1dGlvbiBoYXMgdG8gYmUgZGVsYXllZFxuICogQHBhcmFtIHtJbnRlZ2VyfSB0aWNrcyBudW1iZXIgb2YgdGltZXMgdG8gZGVmZXIgZXhlY3V0aW9uXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBvcHRpb25hbCBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gZGVmZXJUaWNrcyh0aWNrcykgeyAvLyAsIGFyZ3VtZW50c1xuICAgIGlmICh0aWNrcyA8IDIpIHJldHVybiBkZWZlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHZhciBhcmdzID0gcmVwZWF0LmNhbGwoZGVmZXJGdW5jLCB0aWNrcyAtIDEpO1xuICAgIGFyZ3MgPSBhcmdzLmNvbmNhdCh0aGlzLCBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOyBcbiAgICByZXR1cm4gZGVmZXJGdW5jLmFwcGx5KG51bGwsIGFyZ3MpO1xufVxuXG5cbi8qKlxuICogV29ya3MgbGlrZSBfLmRlbGF5IGJ1dCBhbGxvd3MgdG8gZGVmZXIgbWV0aG9kIGNhbGwgb2YgYHNlbGZgIHdoaWNoIHdpbGwgYmUgdGhlIGZpcnN0IF8uZGVsYXlNZXRob2QgcGFyYW1ldGVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgb2JqZWN0IHRvIGRlbGF5IG1ldGhvZCBjYWxsIG9mXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gZnVuY09yTWV0aG9kTmFtZSBmdW5jdGlvbiBvciBuYW1lIG9mIG1ldGhvZFxuICogQHBhcmFtIHtOdW1iZXJ9IHdhaXQgYXBwcm94aW1hdGUgZGFsYXkgdGltZSBpbiBtaWxsaXNlY29uZHNcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIGFyZ3VtZW50cyB0byBwYXNzIHRvIG1ldGhvZFxuICovXG5mdW5jdGlvbiBkZWxheU1ldGhvZChmdW5jT3JNZXRob2ROYW1lLCB3YWl0KSB7IC8vICwgLi4uIGFyZ3VtZW50c1xuICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgIHJldHVybiBfZGVsYXlNZXRob2QodGhpcywgZnVuY09yTWV0aG9kTmFtZSwgd2FpdCwgYXJncyk7XG59XG5cblxuLyoqXG4gKiBXb3JrcyBsaWtlIF8uZGVmZXIgYnV0IGFsbG93cyB0byBkZWZlciBtZXRob2QgY2FsbCBvZiBgc2VsZmAgd2hpY2ggd2lsbCBiZSB0aGUgZmlyc3QgXy5kZWZlck1ldGhvZCBwYXJhbWV0ZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBvYmplY3QgdG8gZGVmZXIgbWV0aG9kIGNhbGwgb2ZcbiAqIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBmdW5jT3JNZXRob2ROYW1lIGZ1bmN0aW9uIG9yIG5hbWUgb2YgbWV0aG9kXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBhcmd1bWVudHMgdG8gcGFzcyB0byBtZXRob2RcbiAqL1xuZnVuY3Rpb24gZGVmZXJNZXRob2QoZnVuY09yTWV0aG9kTmFtZSkgeyAvLyAsIC4uLiBhcmd1bWVudHNcbiAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICByZXR1cm4gX2RlbGF5TWV0aG9kKHRoaXMsIGZ1bmNPck1ldGhvZE5hbWUsIDEsIGFyZ3MpO1xufVxuXG5mdW5jdGlvbiBfZGVsYXlNZXRob2Qob2JqZWN0LCBmdW5jT3JNZXRob2ROYW1lLCB3YWl0LCBhcmdzKSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBmdW5jID0gdHlwZW9mIGZ1bmNPck1ldGhvZE5hbWUgPT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgPyBvYmplY3RbZnVuY09yTWV0aG9kTmFtZV1cbiAgICAgICAgICAgICAgICAgICAgOiBmdW5jT3JNZXRob2ROYW1lO1xuICAgICAgICBmdW5jLmFwcGx5KG9iamVjdCwgYXJncyk7XG4gICAgfSwgd2FpdCk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGZ1bmN0aW9uIHRoYXQgd2lsbCBleGVjdXRlIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBgd2FpdGAgbXMgYWZ0ZXIgaXQgaGFzIGJlZW4gY2FsbGVkXG4gKiBUaGUgY29udGV4dCBpbiBmdW5jdGlvbiB3aGVuIGl0IGlzIGV4ZWN1dGVkIGlzIHNldCB0byBgbnVsbGAuXG4gKiBBcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBhcmUgYXBwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gZGVsYXllZC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxmIGZ1bmN0aW9uIHdoaWNoIGV4ZWN1dGlvbiBoYXMgdG8gYmUgZGVmZXJyZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3YWl0IGFwcHJveGltYXRlIGRhbGF5IHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBvcHRpb25hbCBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBkZWxheWVkKHdhaXQpIHsgLy8sIC4uLiBhcmd1bWVudHNcbiAgICB2YXIgZnVuYyA9IHRoaXNcbiAgICAgICAgLCBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHsgLy8gLi4uIGFyZ3VtZW50c1xuICAgICAgICB2YXIgcGFzc0FyZ3MgPSBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgICAgICByZXR1cm4gX2RlbGF5KGZ1bmMsIHdhaXQsIHBhc3NBcmdzLCB0aGlzKTtcbiAgICB9O1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBmdW5jdGlvbiB0aGF0IHdpbGwgZXhlY3V0ZSB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gb24gdGhlIG5leHQgdGljayBvbmNlIGl0IGhhcyBiZWVuIGNhbGxlZFxuICogVGhlIGNvbnRleHQgaW4gZnVuY3Rpb24gd2hlbiBpdCBpcyBleGVjdXRlZCBpcyBzZXQgdG8gYG51bGxgLlxuICogQXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gYXJlIGFwcGVuZGVkIHRvIHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIGRlZmVycmVkLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgZnVuY3Rpb24gd2hpY2ggZXhlY3V0aW9uIGhhcyB0byBiZSBkZWZlcnJlZFxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgb3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gZGVmZXJyZWQoKSB7IC8vLCAuLi4gYXJndW1lbnRzXG4gICAgdmFyIGZ1bmMgPSB0aGlzXG4gICAgICAgICwgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7IC8vIC4uLiBhcmd1bWVudHNcbiAgICAgICAgdmFyIHBhc3NBcmdzID0gYXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICAgICAgcmV0dXJuIF9kZWxheShmdW5jLCAxLCBwYXNzQXJncywgdGhpcyk7XG4gICAgfTtcbn1cblxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgY2FsbCBvcmlnaW5hbCBmdW5jdGlvbiBvbmNlIGl0IGhhcyBub3QgYmVlbiBjYWxsZWQgZm9yIGEgc3BlY2lmaWVkIHRpbWVcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxmIGZ1bmN0aW9uIHRoYXQgZXhlY3V0aW9uIGhhcyB0byBiZSBkZWxheWVkXG4gKiBAcGFyYW0ge051bWJlcn0gd2FpdCBhcHByb3hpbWF0ZSBkYWxheSB0aW1lIGluIG1pbGxpc2Vjb25kc1xuICogQHBhcmFtIHtCb29sZWFufSBpbW1lZGlhdGUgdHJ1ZSB0byBpbnZva2UgZnVuY2l0b24gaW1tZWRpYXRlbHkgYW5kIHRoZW4gaWdub3JlIGZvbGxvd2luZyBjYWxscyBmb3Igd2FpdCBtaWxsaXNlY29uZHNcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBkZWJvdW5jZSh3YWl0LCBpbW1lZGlhdGUpIHtcbiAgICB2YXIgZnVuYyA9IHRoaXM7IC8vIGZpcnN0IHBhcmFtZXRlciBvZiBfLmRlYm91bmNlXG4gICAgdmFyIHRpbWVvdXQsIGFyZ3MsIGNvbnRleHQsIHRpbWVzdGFtcCwgcmVzdWx0O1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgY29udGV4dCA9IHRoaXM7IC8vIHN0b3JlIG9yaWdpbmFsIGNvbnRleHRcbiAgICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdmFyIGNhbGxOb3cgPSBpbW1lZGlhdGUgJiYgISB0aW1lb3V0O1xuICAgICAgICBpZiAoISB0aW1lb3V0KVxuICAgICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQpO1xuICAgICAgICBpZiAoY2FsbE5vdylcbiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgZnVuY3Rpb24gbGF0ZXIoKSB7XG4gICAgICAgICAgICB2YXIgbGFzdCA9IERhdGUubm93KCkgLSB0aW1lc3RhbXA7XG4gICAgICAgICAgICBpZiAobGFzdCA8IHdhaXQpXG4gICAgICAgICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQgLSBsYXN0KTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmICghIGltbWVkaWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24sIHRoYXQsIHdoZW4gaW52b2tlZCwgd2lsbCBvbmx5IGJlIHRyaWdnZXJlZCBhdCBtb3N0IG9uY2UgZHVyaW5nIGEgZ2l2ZW4gd2luZG93IG9mIHRpbWUuIFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgZnVuY3Rpb24gdGhhdCBleGVjdXRpb24gaGFzIHRvIGJlIGRlbGF5ZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3YWl0IGFwcHJveGltYXRlIGRlbGF5IHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBge2xlYWRpbmc6IGZhbHNlfWAgdG8gZGlzYWJsZSB0aGUgZXhlY3V0aW9uIG9uIHRoZSBsZWFkaW5nIGVkZ2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiB0aHJvdHRsZSh3YWl0LCBvcHRpb25zKSB7XG4gICAgdmFyIGZ1bmMgPSB0aGlzOyAvLyBmaXJzdCBwYXJhbWV0ZXIgb2YgXy50aHJvdHRsZVxuICAgIHZhciBjb250ZXh0LCBhcmdzLCByZXN1bHQ7XG4gICAgdmFyIHRpbWVvdXQgPSBudWxsO1xuICAgIHZhciBwcmV2aW91cyA9IDA7XG4gICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcblxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGlmICghcHJldmlvdXMgJiYgb3B0aW9ucy5sZWFkaW5nID09PSBmYWxzZSkgcHJldmlvdXMgPSBub3c7XG4gICAgICAgIHZhciByZW1haW5pbmcgPSB3YWl0IC0gKG5vdyAtIHByZXZpb3VzKTtcbiAgICAgICAgY29udGV4dCA9IHRoaXM7XG4gICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIGlmIChyZW1haW5pbmcgPD0gMCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICAgICAgICBwcmV2aW91cyA9IG5vdztcbiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRpbWVvdXQgJiYgb3B0aW9ucy50cmFpbGluZyAhPT0gZmFsc2UpXG4gICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgcmVtYWluaW5nKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBsYXRlcigpIHtcbiAgICAgICAgcHJldmlvdXMgPSBvcHRpb25zLmxlYWRpbmcgPT09IGZhbHNlID8gMCA6IERhdGUubm93KCk7XG4gICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIENhbGwgcGFzc2VkIGZ1bmN0aW9uIG9ubHkgb25jZVxuICogQHJldHVybiB7RnVuY3Rpb259IHNlbGZcbiAqL1xuZnVuY3Rpb24gb25jZSgpIHtcbiAgICB2YXIgZnVuYyA9IHRoaXNcbiAgICAgICAgLCByYW4gPSBmYWxzZVxuICAgICAgICAsIG1lbW87XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAocmFuKSByZXR1cm4gbWVtbztcbiAgICAgICAgcmFuID0gdHJ1ZTtcbiAgICAgICAgbWVtbyA9IGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgZnVuYyA9IG51bGw7XG4gICAgICAgIHJldHVybiBtZW1vO1xuICAgIH07XG59XG5cblxuLyoqXG4gKiBFeGVjdXRlIGEgZnVuY3Rpb24gd2hlbiB0aGUgY29uZGl0aW9uIGZ1bmN0aW9uIHJldHVybnMgYSB0cnV0aHkgdmFsdWVcbiAqIGl0IHJ1bnMgdGhlIGNvbmRpdGlvbiBmdW5jdGlvbiBldmVyeSBgY2hlY2tJbnRlcnZhbGAgbWlsbGlzZWNvbmRzIChkZWZhdWx0IDUwKVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgZnVuY3Rpb246IGlmIGl0IHJldHVybnMgdHJ1ZSB0aGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHJ1bnMgd2hlbiB0aGUgY29uZGl0aW9uIGlzIHRydWVcbiAqIEBwYXJhbSB7TnVtYmVyfSBtYXhUaW1lb3V0IHRpbWVvdXQgYmVmb3JlIGdpdmluZyB1cCAodGltZSBpbiBtaWxsaXNlY29uZHMpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aW1lZE91dEZ1bmMgYSBmdW5jdGlvbiBjYWxsZWQgaWYgdGltZW91dCBpcyByZWFjaGVkXG4gKiBAcGFyYW0ge051bWJlcn0gY2hlY2tJbnRlcnZhbCB0aW1lIGludGVydmFsIHdoZW4geW91IHJ1biB0aGUgY29uZGl0aW9uIGZ1bmN0aW9uICh0aW1lIGluIG1pbGxpc2Vjb25kcyksIGRlZmF1bHQgNTAgbXNcbiAqL1xuZnVuY3Rpb24gd2FpdEZvcihjYWxsYmFjaywgbWF4VGltZW91dCwgdGltZWRPdXRGdW5jLCBjaGVja0ludGVydmFsKXtcbiAgICB2YXIgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIHZhciBjb25kaXRpb24gPSB0aGlzO1xuICAgIGNoZWNrSW50ZXJ2YWwgPSBjaGVja0ludGVydmFsIHx8IDUwO1xuICAgIHZhciBpbnRlcnZhbCA9IHNldEludGVydmFsKHRlc3RDb25kaXRpb24sIGNoZWNrSW50ZXJ2YWwpO1xuXG4gICAgZnVuY3Rpb24gdGVzdENvbmRpdGlvbigpIHtcbiAgICAgICAgaWYgKGNvbmRpdGlvbigpKSBjYWxsYmFjaygpO1xuICAgICAgICBlbHNlIGlmIChEYXRlLm5vdygpIC0gc3RhcnQgPj0gbWF4VGltZW91dClcbiAgICAgICAgICAgIHRpbWVkT3V0RnVuYyAmJiB0aW1lZE91dEZ1bmMoKTtcbiAgICAgICAgZWxzZSByZXR1cm47XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgIH07XG59XG5cblxuLyoqXG4gKiByZXR1cm5zIHRoZSBmdW5jdGlvbiB0aGF0IG5lZ2F0ZXMgKCEgb3BlcmF0b3IpIHRoZSByZXN1bHQgb2YgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxmIGZ1bmN0aW9uIHRvIG5lZ2F0ZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIG5vdCgpIHtcbiAgICB2YXIgZnVuYyA9IHRoaXM7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gIWZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIC0gW2lzTnVtZXJpY10oI2lzTnVtZXJpYylcbiAqL1xudmFyIG51bWJlck1ldGhvZHMgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBpc051bWVyaWM6IGlzTnVtZXJpY1xufTtcblxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIHRlc3QgaWYgYSB2YWx1ZSBpcyBudW1lcmljXG4gKlxuICogQHBhcmFtIHtBbnl9IHNlbGYgdmFsdWUgdG8gYmUgdGVzdGVkXG4gKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIGl0IGlzIGEgbnVtZXJpYyB2YWx1ZVxuICovXG5mdW5jdGlvbiBpc051bWVyaWMoKSB7XG4gICAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KHRoaXMpKSAmJiBpc0Zpbml0ZSh0aGlzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG5cbi8qKlxuICogLSBbZXh0ZW5kXSgjZXh0ZW5kKVxuICogLSBbY2xvbmVdKCNjbG9uZSlcbiAqIC0gW2RlZmluZVByb3BlcnR5XSgjZGVmaW5lUHJvcGVydHkpXG4gKiAtIFtkZWZpbmVQcm9wZXJ0aWVzXSgjZGVmaW5lUHJvcGVydGllcylcbiAqIC0gW2RlZXBFeHRlbmRdKCNkZWVwRXh0ZW5kKVxuICogLSBbZGVlcENsb25lXSgjZGVlcENsb25lKVxuICogLSBba2V5c10oI2tleXMpXG4gKiAtIFthbGxLZXlzXSgjYWxsS2V5cylcbiAqIC0gW3ZhbHVlc10oI3ZhbHVlcylcbiAqIC0gW2tleU9mXSgja2V5T2YpXG4gKiAtIFthbGxLZXlzT2ZdKCNhbGxLZXlzT2YpXG4gKiAtIFtlYWNoS2V5XSgjZWFjaEtleSlcbiAqIC0gW21hcEtleXNdKCNtYXBLZXlzKVxuICogLSBbcmVkdWNlS2V5c10oI3JlZHVjZUtleXMpXG4gKiAtIFtmaWx0ZXJLZXlzXSgjZmlsdGVyS2V5cylcbiAqIC0gW3NvbWVLZXldKCNzb21lS2V5KVxuICogLSBbZXZlcnlLZXldKCNldmVyeUtleSlcbiAqIC0gW2ZpbmRWYWx1ZV0oI2ZpbmRWYWx1ZSlcbiAqIC0gW2ZpbmRLZXldKCNmaW5kS2V5KVxuICogLSBbcGlja0tleXNdKCNwaWNrS2V5cylcbiAqIC0gW29taXRLZXlzXSgjb21pdEtleXMpXG4gKiAtIFtpc0VxdWFsXSgjaXNFcXVhbClcbiAqIC0gW2lzTm90XSgjaXNOb3QpXG4gKlxuICogQWxsIHRoZXNlIG1ldGhvZHMgY2FuIGJlIFtjaGFpbmVkXShwcm90by5qcy5odG1sI1Byb3RvKVxuICovXG52YXIgb2JqZWN0TWV0aG9kcyA9IG1vZHVsZS5leHBvcnRzID0ge1xuICAgIGV4dGVuZDogZXh0ZW5kLFxuICAgIGNsb25lOiBjbG9uZSxcbiAgICBkZWZpbmVQcm9wZXJ0eTogZGVmaW5lUHJvcGVydHksXG4gICAgZGVmaW5lUHJvcGVydGllczogZGVmaW5lUHJvcGVydGllcyxcbiAgICBkZWVwRXh0ZW5kOiBkZWVwRXh0ZW5kLFxuICAgIGRlZXBDbG9uZTogZGVlcENsb25lLFxuICAgIGtleXM6IGtleXMsXG4gICAgYWxsS2V5czogYWxsS2V5cyxcbiAgICB2YWx1ZXM6IHZhbHVlcyxcbiAgICBrZXlPZjoga2V5T2YsXG4gICAgYWxsS2V5c09mOiBhbGxLZXlzT2YsXG4gICAgZWFjaEtleTogZWFjaEtleSxcbiAgICBtYXBLZXlzOiBtYXBLZXlzLFxuICAgIHJlZHVjZUtleXM6IHJlZHVjZUtleXMsXG4gICAgZmlsdGVyS2V5czogZmlsdGVyS2V5cyxcbiAgICBzb21lS2V5OiBzb21lS2V5LFxuICAgIGV2ZXJ5S2V5OiBldmVyeUtleSxcbiAgICBwaWNrS2V5czogcGlja0tleXMsXG4gICAgb21pdEtleXM6IG9taXRLZXlzLFxuICAgIGlzRXF1YWw6IGlzRXF1YWwsXG4gICAgaXNOb3Q6IGlzTm90XG59O1xuXG5cbi8qKlxuICogIyMjI1Byb3BlcnR5IGRlc2NyaXB0b3IgY29uc3RhbnRzIyMjI1xuICogVGhlIHN1bSBvZiB0aGVzZSBjb25zdGFudHMgY2FuIGJlIHVzZWQgYXMgbGFzdCBwYXJhbWV0ZXIgb2YgZGVmaW5lUHJvcGVydHkgYW5kIGRlZmluZVByb3BlcnRpZXMgdG8gZGV0ZXJtaW5lIHR5cGVzIG9mIHByb3BlcnRpZXMuXG4gKi9cbnZhciBjb25zdGFudHMgPSB7XG4gICAgRU5VTUVSQUJMRTogMSxcbiAgICBFTlVNOiAxLFxuICAgIENPTkZJR1VSQUJMRTogMixcbiAgICBDT05GOiAyLFxuICAgIFdSSVRBQkxFOiA0LFxuICAgIFdSSVQ6IDRcbn07XG5cbmRlZmluZVByb3BlcnR5LmNhbGwob2JqZWN0TWV0aG9kcywgJ19jb25zdGFudHMnLCBjb25zdGFudHMpO1xuXG5cbi8qKlxuICogQW5hbG9ndWUgb2YgRVM2IFtBcnJheSBfX2ZpbmRfXyBtZXRob2RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZpbmQpLlxuICogUmV0dXJucyB0aGUgdmFsdWUgb2Ygb2JqZWN0IHByb3BlcnR5IHRoYXQgcGFzc2VzIGNhbGxiYWNrIHRlc3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgb2JqZWN0IHRvIHNlYXJjaCBpblxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgc2hvdWxkIHJldHVybiBgdHJ1ZWAgZm9yIGl0ZW0gdG8gcGFzcyB0aGUgdGVzdCwgcGFzc2VkIGB2YWx1ZWAsIGBrZXlgIGFuZCBgc2VsZmAgYXMgcGFyYW1ldGVyc1xuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgb3B0aW9uYWwgY29udGV4dCAoYHRoaXNgKSBvZiBjYWxsYmFjayBjYWxsXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIEFuIG9wdGlvbmFsIGB0cnVlYCB0byBpdGVyYXRlIGVudW1lcmFibGUgcHJvcGVydGllcyBvbmx5LlxuICogQHJldHVybiB7QW55fVxuICovXG5vYmplY3RNZXRob2RzLmZpbmRWYWx1ZSA9IHV0aWxzLm1ha2VGaW5kTWV0aG9kKGVhY2hLZXksICd2YWx1ZScpO1xuXG5cbi8qKlxuICogQW5hbG9ndWUgb2YgRVM2IFtBcnJheSBfX2ZpbmRJbmRleF9fIG1ldGhvZF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZmluZEluZGV4KS5cbiAqIFJldHVybnMgdGhlIGtleSBvZiBvYmplY3QgcHJvcGVydHkgdGhhdCBwYXNzZXMgY2FsbGJhY2sgdGVzdC4gUmV0dXJucyBgdW5kZWZpbmVkYCBpZiBub3QgZm91bmQgKHVubGlrZSBgZmluZEluZGV4YCwgdGhhdCByZXR1cm5zIC0xIGluIHRoaXMgY2FzZSkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgb2JqZWN0IHRvIHNlYXJjaCBpblxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgc2hvdWxkIHJldHVybiBgdHJ1ZWAgZm9yIGl0ZW0gdG8gcGFzcyB0aGUgdGVzdCwgcGFzc2VkIGB2YWx1ZWAsIGBrZXlgIGFuZCBgc2VsZmAgYXMgcGFyYW1ldGVyc1xuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgb3B0aW9uYWwgY29udGV4dCAoYHRoaXNgKSBvZiBjYWxsYmFjayBjYWxsXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIEFuIG9wdGlvbmFsIGB0cnVlYCB0byBpdGVyYXRlIGVudW1lcmFibGUgcHJvcGVydGllcyBvbmx5LlxuICogQHJldHVybiB7SW50ZWdlcn1cbiAqL1xub2JqZWN0TWV0aG9kcy5maW5kS2V5ID0gdXRpbHMubWFrZUZpbmRNZXRob2QoZWFjaEtleSwgJ2tleScpO1xuXG5cbi8qKlxuICogRXh0ZW5kcyBvYmplY3QgYHNlbGZgIHdpdGggdGhlIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdCBgb2JqYCBjb3B5aW5nIGFsbCBvd24gcHJvcGVydGllcyAobm90IHRob3NlIGluaGVyaXRlZCB2aWEgcHJvdG90eXBlIGNoYWluKSwgaW5jbHVkaW5nIG5vbi1lbnVtZXJhYmxlIHByb3BlcnRpZXMgKHVubGVzcyBgb25seUVudW1lcmFibGVgIGlzIHRydXRoeSkuXG4gKiBDcmVhdGVkIHByb3BlcnRpZXMgd2lsbCBoYXZlIHRoZSBzYW1lIGRlc2NyaXB0b3JzIGFzIHRoZSBwcm9wZXJ0aXMgb2YgYG9iamAuXG4gKiBSZXR1cm5zIGBzZWxmYCB0byBhbGxvdyBjaGFpbmluZyB3aXRoIG90aGVyIGZ1bmN0aW9ucy5cbiAqIENhbiBiZSB1c2VkIHdpdGggZnVuY3Rpb25zLCB0byBjb3B5IGNsYXNzIG1ldGhvZHMsIGUuZy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3QgdG8gYmUgZXh0ZW5kZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogQW4gb2JqZWN0IHdoaWNoIHByb3BlcnRpZXMgd2lsbCBiZSBjb3BpZWQgdG8gc2VsZlxuICogQHBhcmFtIHtCb29sZWFufSBvbmx5RW51bWVyYWJsZSBPcHRpb25hbCBmbGFnIHRvIHByZXZlbnQgY29weWluZyBub24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzLCBgZmFsc2VgIGJ5IGRlZmF1bHRcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZXh0ZW5kKG9iaiwgb25seUVudW1lcmFibGUpIHtcbiAgICB2YXIgZGVzY3JpcHRvcnMgPSB7fTtcblxuICAgIGVhY2hLZXkuY2FsbChvYmosIGZ1bmN0aW9uKHZhbHVlLCBwcm9wKSB7XG4gICAgICAgIGRlc2NyaXB0b3JzW3Byb3BdID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApO1xuICAgIH0sIHRoaXMsIG9ubHlFbnVtZXJhYmxlKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIGRlc2NyaXB0b3JzKTtcblxuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogTWFrZXMgYSBzaGFsbG93IGNsb25lIG9mIG9iamVjdCBgb2JqYCBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB0aGUgc2FtZSBjbGFzczsgdGhlIHByb3BlcnRpZXMgd2lsbCBoYXZlIHRoZSBzYW1lIGRlc2NyaXB0b3JzLlxuICogVG8gY2xvbmUgYW4gYXJyYXkgdXNlXG4gKiBgYGBcbiAqIHZhciBjbG9uZWRBcnJheSA9IFtdLmNvbmNhdChhcnIpO1xuICogYGBgXG4gKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgdXNlZCB0byBjbG9uZSBhbiBhcnJheSwgYmVjYXVzZSBpdCBpcyBpbmVmZmljaWVudC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3QgdG8gYmUgY2xvbmVkXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGNsb25lKCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMpKSByZXR1cm4gdGhpcy5zbGljZSgpO1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIG5ldyBEYXRlKHRoaXMpO1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgUmVnRXhwKSByZXR1cm4gbmV3IFJlZ0V4cCh0aGlzKTtcbiAgICB2YXIgY2xvbmVkT2JqZWN0ID0gT2JqZWN0LmNyZWF0ZSh0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSk7XG4gICAgZXh0ZW5kLmNhbGwoY2xvbmVkT2JqZWN0LCB0aGlzKTtcbiAgICByZXR1cm4gY2xvbmVkT2JqZWN0O1xufVxuXG5cbi8qKlxuICogU3ludGF4IHN1Z2FyIHRvIHNob3J0ZW4gdXNhZ2Ugb2YgYE9iamVjdC5kZWZpbmVQcm9wZXJ0eWAuXG4gKiBUaGUgc2ltcGxlc3QgdXNhZ2UgKHRvIGFkZCBub24tZW51bWVyYWJsZSwgbm9uLWNvbmZpZ3VyYWJsZSwgbm9uLXdyaXRhYmxlIHByb3BlcnR5KTpcbiAqIGBgYFxuICogXy5kZWZpbmVQcm9wZXJ0eShvYmosICdrZXknLCB2YWx1ZSk7XG4gKiBgYGBcbiAqXG4gKiBUbyBkZWZpbmUgc29tZSBvdGhlciBwcm9wZXJ0aWVzIHVzZSBzdW0gb2YgdGhlIGZsYWdzIGBfLkVOVU1FUkFCTEVgIChvciBgXy5FTlVNYCksIGBfLkNPTkZJR1VSQUJMRWAgKG9yIGBfLkNPTkZgKSBhbmQgYF8uV1JJVEFCTEVgIChvciBgXy5XUklUYCk6XG4gKiBgYGBcbiAqIF8uZGVmaW5lUHJvcGVydHkob2JqLCAna2V5JywgdmFsdWUsIF8uRU5VTSArIF8uV1JJVCk7XG4gKiBgYGBcbiAqIFJldHVybnMgYHNlbGZgLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB0byBhZGQgYSBwcm9wZXJ0eSB0b1xuICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5TmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3aWxsIGJlIGFkZGVkXG4gKiBAcGFyYW0ge0FueX0gdmFsdWUgdGhlIHZhbHVlIG9mIGFkZGVkIHByb3BlcnR5XG4gKiBAcGFyYW0ge0ludGVnZXJ9IGRlY3JpcHRvckZsYWdzIGJpdCBtYXNrIG9mIHByb3BlcnR5IGRlc2NyaXB0b3IgcHJvcGVydGllcyBjb21wb3NlZCBmcm9tIGBfLkVOVU1FUkFCTEVgIChvciBgXy5FTlVNYCksIGBfLkNPTkZJR1VSQUJMRWAgKG9yIGBfLkNPTkZgKSBhbmQgYF8uV1JJVEFCTEVgIChvciBgXy5XUklUYClcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSwgZGVjcmlwdG9yRmxhZ3MpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlOYW1lLFxuICAgICAgICBfZ2V0RGVzY3JpcHRvcih2YWx1ZSwgZGVjcmlwdG9yRmxhZ3MpKTtcbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG5mdW5jdGlvbiBfZ2V0RGVzY3JpcHRvcih2YWx1ZSwgZGVjcmlwdG9yRmxhZ3MpIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHsgdmFsdWU6IHZhbHVlIH07XG4gICAgaWYgKGRlY3JpcHRvckZsYWdzKVxuICAgICAgICBleHRlbmQuY2FsbChkZXNjcmlwdG9yLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiAhISAoZGVjcmlwdG9yRmxhZ3MgJiBjb25zdGFudHMuRU5VTUVSQUJMRSksXG4gICAgICAgICAgICBjb25maWd1cmFibGU6ICEhIChkZWNyaXB0b3JGbGFncyAmIGNvbnN0YW50cy5DT05GSUdVUkFCTEUpLFxuICAgICAgICAgICAgd3JpdGFibGU6ICEhIChkZWNyaXB0b3JGbGFncyAmIGNvbnN0YW50cy5XUklUQUJMRSlcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbn1cblxuXG4vKipcbiAqIFN5bnRheCBzdWdhciB0byBzaG9ydGVuIHVzYWdlIG9mIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AuXG4gKiBUaGUgc2ltcGxlc3QgdXNhZ2UgKHRvIGFkZCBub24tZW51bWVyYWJsZSwgbm9uLWNvbmZpZ3VyYWJsZSwgbm9uLXdyaXRhYmxlIHByb3BlcnRpZXMpOlxuICogYGBgXG4gKiBfLmRlZmluZVByb3BlcnRpZXMob2JqLCB7XG4gKiAgICAga2V5MTogdmFsdWUxLFxuICogICAgIGtleTI6IHZhbHVlMlxuICogfSk7XG4gKiBgYGBcbiAqIFRvIGRlZmluZSBzb21lIG90aGVyIHByb3BlcnRpZXMgdXNlIHN1bSBvZiB0aGUgZmxhZ3MgYF8uRU5VTUVSQUJMRWAgKG9yIGBfLkVOVU1gKSwgYF8uQ09ORklHVVJBQkxFYCAob3IgYF8uQ09ORmApIGFuZCBgXy5XUklUQUJMRWAgKG9yIGBfLldSSVRgKTpcbiAqIGBgYFxuICogXy5kZWZpbmVQcm9wZXJ0aWVzKG9iaiwge1xuICogICAgIGtleTE6IHZhbHVlMSxcbiAqICAgICBrZXkyOiB2YWx1ZTJcbiAqIH0sIF8uRU5VTSArIF8uV1JJVCk7XG4gKiBgYGBcbiAqIFJldHVybnMgYHNlbGZgLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB0byBhZGQgYSBwcm9wZXJ0eSB0b1xuICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnR5VmFsdWVzIEEgbWFwIG9mIGtleXMgYW5kIHZhbHVlcyBvZiBwcm9wZXJ0aWVzIHRoYXR3aWxsIGJlIGFkZGVkLiBUaGUgZGVzY3JpcHRvcnMgb2YgcHJvcGVydGllcyB3aWxsIGJlIGRlZmluZWQgYnkgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzLlxuICogQHBhcmFtIHtJbnRlZ2VyfSBkZWNyaXB0b3JGbGFncyBiaXQgbWFzayBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9yIHByb3BlcnRpZXMgY29tcG9zZWQgZnJvbSBgXy5FTlVNRVJBQkxFYCAob3IgYF8uRU5VTWApLCBgXy5DT05GSUdVUkFCTEVgIChvciBgXy5DT05GYCkgYW5kIGBfLldSSVRBQkxFYCAob3IgYF8uV1JJVGApXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMocHJvcGVydHlWYWx1ZXMsIGRlY3JpcHRvckZsYWdzKSB7XG4gICAgdmFyIGRlc2NyaXB0b3JzID0gbWFwS2V5cy5jYWxsKHByb3BlcnR5VmFsdWVzLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gX2dldERlc2NyaXB0b3IodmFsdWUsIGRlY3JpcHRvckZsYWdzKTtcbiAgICB9LCB0cnVlKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCBkZXNjcmlwdG9ycyk7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBFeHRlbmRzIG9iamVjdCBgc2VsZmAgd2l0aCBwcm9wZXJ0aWVzIG9mIGBvYmpgIHRvIGFueSBkZXB0aCwgd2l0aG91dCBvdmVyd3J0aXRpbmcgZXhpc3Rpbmcgb2JqZWN0IHByb3BlcnRpZXMgb2YgYHNlbGZgIHdpdGggb2JqZWN0IHByb3BlcnRpZXMgb2YgYG9iamAuXG4gKiBTY2FsYXIgcHJvcGVydGllcyBvZiBgb2JqYCB3aWxsIG92ZXJ3cml0ZSBwcm9wZXJ0aWVzIG9mIGBzZWxmYC4gU2NhbGFyIHBvcnBlcnRpZXMgb2YgYHNlbGZgIHdpbGwgYWxzbyBiZSBvdmVyd3JpdHRlbi5cbiAqIENvcnJlY3RseSB3b3JrcyB3aXRoIHJlY3Vyc2l2ZSBvYmplY3RzLlxuICogVXNhZ2U6XG4gKiBgYGBcbiAqIHZhciBvYmogPSB7XG4gKiAgICAgaW5uZXI6IHtcbiAqICAgICAgICAgYTogMVxuICogICAgIH1cbiAqIH07XG4gKlxuICogXy5kZWVwRXh0ZW5kKG9iaiwge1xuICogICAgIGlubmVyOiB7XG4gKiAgICAgICAgIGI6IDJcbiAqICAgICB9XG4gKiB9KTtcbiAqXG4gKiBhc3NlcnQuZGVlcEVxdWFsKG9iaiwge1xuICogICAgIGlubmVyOiB7XG4gKiAgICAgICAgIGE6IDEsXG4gKiAgICAgICAgIGI6IDJcbiAqICAgICB9XG4gKiB9KTsgLy8gYXNzZXJ0IHBhc3Nlc1xuICogYGBgXG4gKiBSZXR1cm5zIGBzZWxmYC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3QgdG8gYmUgZXh0ZW5kZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogQW4gb2JqZWN0IHdpdGggcHJvcGVydGllcyB0byBjb3B5IHRvXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIE9wdGlvbmFsIGB0cnVlYCB0byB1c2Ugb25seSBlbnVtZXJhYmxlIHByb3BlcnRpZXNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZGVlcEV4dGVuZChvYmosIG9ubHlFbnVtZXJhYmxlKSB7XG4gICAgcmV0dXJuIF9leHRlbmRUcmVlKHRoaXMsIG9iaiwgb25seUVudW1lcmFibGUsIFtdKTtcbn1cblxuXG5mdW5jdGlvbiBfZXh0ZW5kVHJlZShzZWxmTm9kZSwgb2JqTm9kZSwgb25seUVudW1lcmFibGUsIG9ialRyYXZlcnNlZCkge1xuICAgIGlmIChvYmpUcmF2ZXJzZWQuaW5kZXhPZihvYmpOb2RlKSA+PSAwKSByZXR1cm47IC8vIG5vZGUgYWxyZWFkeSB0cmF2ZXJzZWQsIG9iaiBoYXMgcmVjdXJzaW9uXG5cbiAgICAvLyBzdG9yZSBub2RlIHRvIHJlY29nbmlzZSByZWN1cnNpb25cbiAgICBvYmpUcmF2ZXJzZWQucHVzaChvYmpOb2RlKTtcblxuICAgIHZhciBsb29wID0gQXJyYXkuaXNBcnJheShvYmpOb2RlKSA/IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoIDogZWFjaEtleTtcblxuICAgIGxvb3AuY2FsbChvYmpOb2RlLCBmdW5jdGlvbih2YWx1ZSwgcHJvcCkge1xuICAgICAgICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqTm9kZSwgcHJvcCk7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcgJiYgdmFsdWUgIT0gbnVsbFxuICAgICAgICAgICAgICAgICYmICEgKHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSAmJiAhICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgICBpZiAoISAoc2VsZk5vZGUuaGFzT3duUHJvcGVydHkocHJvcClcbiAgICAgICAgICAgICAgICAgICAgJiYgdHlwZW9mIHNlbGZOb2RlW3Byb3BdID09ICdvYmplY3QnICYmIHNlbGZOb2RlW3Byb3BdICE9IG51bGwpKVxuICAgICAgICAgICAgICAgIHNlbGZOb2RlW3Byb3BdID0gKEFycmF5LmlzQXJyYXkodmFsdWUpKSA/IFtdIDoge307XG4gICAgICAgICAgICBfZXh0ZW5kVHJlZShzZWxmTm9kZVtwcm9wXSwgdmFsdWUsIG9ubHlFbnVtZXJhYmxlLCBvYmpUcmF2ZXJzZWQpO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxmTm9kZSwgcHJvcCwgZGVzY3JpcHRvcik7XG4gICAgfSwgdGhpcywgb25seUVudW1lcmFibGUpO1xuXG4gICAgcmV0dXJuIHNlbGZOb2RlO1xufVxuXG5cbi8qKlxuICogQ2xvbmVzIGFsbCBvYmplY3QgdHJlZS4gQ2xhc3Mgb2Ygb3JpZ2luYWwgb2JqZWN0IGlzIG5vdCBwcmVzZXJ2ZWQuIFJldHVybnMgYHNlbGZgXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgQW4gb2JqZWN0IHRvIGJlIGV4dGVuZGVkXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIE9wdGlvbmFsIGB0cnVlYCB0byB1c2Ugb25seSBlbnVtZXJhYmxlIHByb3BlcnRpZXNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZGVlcENsb25lKG9ubHlFbnVtZXJhYmxlKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gbmV3IERhdGUodGhpcyk7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBSZWdFeHApIHJldHVybiBuZXcgUmVnRXhwKHRoaXMpO1xuICAgIHZhciBjbG9uZWRPYmplY3QgPSBBcnJheS5pc0FycmF5KHRoaXMpID8gW10gOiB7fTtcbiAgICBkZWVwRXh0ZW5kLmNhbGwoY2xvbmVkT2JqZWN0LCB0aGlzLCBvbmx5RW51bWVyYWJsZSk7XG4gICAgcmV0dXJuIGNsb25lZE9iamVjdDtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgYXJyYXkgb2YgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBvYmplY3QgdG8gcmV0dXJuIGtleXMgb2ZcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBrZXlzKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzKTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgYXJyYXkgb2YgdmFsdWVzIG9mIHRoZSBvYmplY3QncyBrZXlzXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgb2JqZWN0IHRvIHJldHVybiB2YWx1ZXMgZnJvbVxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHZhbHVlcyhvbmx5RW51bWVyYWJsZSkge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gb25seUVudW1lcmFibGVcbiAgICAgICAgICAgICAgICA/IE9iamVjdC5rZXlzKHRoaXMpXG4gICAgICAgICAgICAgICAgOiBhbGxLZXlzLmNhbGwodGhpcyk7XG5cbiAgICByZXR1cm4gcHJvcGVydGllcy5tYXAoZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICByZXR1cm4gdGhpc1twcm9wXTtcbiAgICB9LCB0aGlzKTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgYXJyYXkgb2YgYWxsIHByb3BlcnR5IG5hbWVzIG9mIGFuIG9iamVjdCBgc2VsZmAgKGluY2x1ZGluZyBub24tZW51bWVyYmFsZSkuXG4gKiBUbyBnZXQgb25seSBlbnVtZXJhYmxlIHByb3BlcnRpZXMsIHVzZSBgT2JqZWN0LmtleXMoKWAuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgQW4gb2JqZWN0IHRvIGdldCBhbGwgcHJvcGVydGllcyBvZi5cbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG4gZnVuY3Rpb24gYWxsS2V5cygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcyk7XG4gfVxuXG5cbi8qKlxuICogQW4gYW5hbG9ndWUgb2YgYGluZGV4T2ZgIG1ldGhvZCBvZiBBcnJheSBwcm90b3R5cGUuXG4gKiBSZXR1cm5zIHRoZSBga2V5YCBvZiBgc2VhcmNoRWxlbWVudGAgaW4gdGhlIG9iamVjdCBgc2VsZmAuXG4gKiBBcyBvYmplY3Qga2V5cyBhcmUgdW5zb3J0ZWQsIGlmIHRoZXJlIGFyZSBzZXZlcmFsIGtleXMgdGhhdCBob2xkIGBzZWFyY2hFbGVtZW50YCBhbnkgb2YgdGhlbSBjYW4gYmUgcmV0dXJuZWQuIFVzZSBgYWxsS2V5c09mYCB0byByZXR1cm4gYWxsIGtleXMuXG4gKiBBbGwgb3duIHByb3BlcnRpZXMgYXJlIHNlYXJjaGVkIChub3QgdGhvc2UgaW5oZXJpdGVkIHZpYSBwcm90b3R5cGUgY2hhaW4pLCBpbmNsdWRpbmcgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcyAodW5sZXNzIGBvbmx5RW51bWVyYWJsZWAgaXMgdHJ1dGh5KS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3QgdG8gc2VhcmNoIGEgdmFsdWUgaW5cbiAqIEBwYXJhbSB7QW55fSBzZWFyY2hFbGVtZW50IEFuIGVsZW1lbnQgdGhhdCB3aWxsIGJlIHNlYXJjaGVkLiBBbiBleGFjdCBlcXVhbGl0eSBpcyB0ZXN0ZWQsIHNvIGAwYCBpcyBub3QgdGhlIHNhbWUgYXMgYCcwJ2AuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIEFuIG9wdGlvbmFsIHRydWUgdG8gc2VhcmNoIGFtb25nIGVudW1lcmFibGUgcHJvcGVydGllcyBvbmx5LlxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBrZXlPZihzZWFyY2hFbGVtZW50LCBvbmx5RW51bWVyYWJsZSkge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gb25seUVudW1lcmFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gT2JqZWN0LmtleXModGhpcylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYWxsS2V5cy5jYWxsKHRoaXMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAoc2VhcmNoRWxlbWVudCA9PT0gdGhpc1twcm9wZXJ0aWVzW2ldXSlcbiAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzW2ldO1xuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuXG4vKipcbiAqIFdvcmtzIHNpbWlsYXJseSB0byB0aGUgcHJldmlvdXMgZnVuY3Rpb24sIGJ1dCByZXR1cm5zIHRoZSBhcnJheSBvZiBrZXlzIGhvbGRpbmcgYHNlYXJjaEVsZW1lbnRgIGFzIHRoZWlyIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB0byBzZWFyY2ggYSB2YWx1ZSBpblxuICogQHBhcmFtIHtBbnl9IHNlYXJjaEVsZW1lbnQgQW4gZWxlbWVudCB0aGF0IHdpbGwgYmUgc2VhcmNoZWQuIEFuIGV4YWN0IGVxdWFsaXR5IGlzIHRlc3RlZCwgc28gYDBgIGlzIG5vdCB0aGUgc2FtZSBhcyBgJzAnYC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25seUVudW1lcmFibGUgQW4gb3B0aW9uYWwgdHJ1ZSB0byBzZWFyY2ggYW1vbmcgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9ubHkuXG4gKiBAcmV0dXJuIHtBcnJheVtTdHJpbmddfVxuICovXG5mdW5jdGlvbiBhbGxLZXlzT2Yoc2VhcmNoRWxlbWVudCwgb25seUVudW1lcmFibGUpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IG9ubHlFbnVtZXJhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IE9iamVjdC5rZXlzKHRoaXMpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGFsbEtleXMuY2FsbCh0aGlzKTtcblxuICAgIHZhciBrZXlzID0gcHJvcGVydGllcy5maWx0ZXIoZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICByZXR1cm4gc2VhcmNoRWxlbWVudCA9PT0gdGhpc1twcm9wXTtcbiAgICB9LCB0aGlzKTtcblxuICAgIHJldHVybiBrZXlzO1xufVxuXG5cbi8qKlxuICogQW4gYW5hbG9ndWUgb2YgW2ZvckVhY2hdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZvckVhY2gpIG1ldGhvZCBvZiBBcnJheSBwcm90b3R5cGUuXG4gKiBJdGVyYXRlcyBhbGwgb3duIHByb3BlcnRpZXMgb2YgYHNlbGZgIChvciBvbmx5IGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgaWYgYG9ubHlFbnVtZXJhYmxlYCBpcyB0cnV0aHkpIGNhbGxpbmcgY2FsbGJhY2sgZm9yIGVhY2gga2V5LlxuICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggYXJyYXlzLCBpdCB3aWxsIGluY2x1ZGUgYGxlbmd0aGAgcHJvcGVydHkgaW4gaXRlcmF0aW9uLlxuICogVG8gaXRlcmF0ZSBhcnJheS1saWtlIG9iamVjdHMgKGUuZy4sIGBhcmd1bWVudHNgIHBzZXVkby1hcnJheSkgdXNlOlxuICogYGBgXG4gKiBfLmZvckVhY2goYXJndW1lbnRzLCBjYWxsYmFjaywgdGhpc0FyZyk7XG4gKiBgYGBcbiAqIEZ1bmN0aW9uIHJldHVybnMgYHNlbGZgIHRvIGFsbG93IFtjaGFpbmluZ10ocHJvdG8uanMuaHRtbClcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3Qgd2hpY2ggcHJvcGVydGllcyB3aWxsIGJlIGl0ZXJhdGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBpcyBwYXNzZWQgYHZhbHVlYCwgYGtleWAgYW5kIGBzZWxmYCwgaXRzIHJldHVybiB2YWx1ZSBpcyBub3QgdXNlZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIEFuIG9wdGlvbmFsIGNvbnRleHQgb2YgaXRlcmF0aW9uICh0aGUgdmFsdWVvZiBgdGhpc2ApLCB3aWxsIGJlIHVuZGVmaW5lZCBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgcGFzc2VkLlxuICogQHBhcmFtIHtCb29sZWFufSBvbmx5RW51bWVyYWJsZSBBbiBvcHRpb25hbCBgdHJ1ZWAgdG8gaXRlcmF0ZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb25seS5cbiAqL1xuZnVuY3Rpb24gZWFjaEtleShjYWxsYmFjaywgdGhpc0FyZywgb25seUVudW1lcmFibGUpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IG9ubHlFbnVtZXJhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IE9iamVjdC5rZXlzKHRoaXMpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGFsbEtleXMuY2FsbCh0aGlzKTtcblxuICAgIHByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbihwcm9wKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdGhpc1twcm9wXSwgcHJvcCwgdGhpcyk7XG4gICAgfSwgdGhpcyk7XG5cbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIEFuIGFuYWxvZ3VlIG9mIFttYXBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L21hcCkgbWV0aG9kIG9mIEFycmF5IHByb3RvdHlwZS5cbiAqIFJldHVybnMgdGhlIG9iamVjdCB0aGF0IGlzIHRoZSByZXN1bHQgb2YgdGhlIGFwcGxpY2F0aW9uIG9mIGNhbGxiYWNrIHRvIHZhbHVlcyBpbiBhbGwgb3duIHByb3BlcnRpZXMgb2YgYHNlbGZgIChvciBvbmx5IGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgaWYgYG9ubHlFbnVtZXJhYmxlYCBpcyB0cnV0aHkpLlxuICogVGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlIHRoZSBpbnN0YW5jZSBvZiB0aGUgc2FtZSBjbGFzcyBhcyBgc2VsZmAuXG4gKiBQcm9wZXJ0eSBkZXNjcmlwdG9ycyBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgaGF2ZSB0aGUgc2FtZSBgZW51bWVyYWJsZWAsIGBjb25maWd1cmFibGVgIGFuZCBgd3JpdGFibGVgIHNldHRpbmdzIGFzIHRoZSBwcm9wZXJ0aWVzIG9mIGBzZWxmYC5cbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGFycmF5cywgaXQgd2lsbCBpbmNsdWRlIGBsZW5ndGhgIHByb3BlcnR5IGluIGl0ZXJhdGlvbi5cbiAqIFRvIG1hcCBhcnJheS1saWtlIG9iamVjdHMgdXNlOlxuICogYGBgXG4gKiB2YXIgcmVzdWx0ID0gXy5tYXAoYXJndW1lbnRzLCBjYWxsYmFjaywgdGhpc0FyZyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3Qgd2hpY2ggcHJvcGVydGllcyB3aWxsIGJlIGl0ZXJhdGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBpcyBwYXNzZWQgYHZhbHVlYCwgYGtleWAgYW5kIGBzZWxmYCBhbmQgc2hvdWxkIHJldHVybiB2YWx1ZSB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG1hcC5cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIEFuIG9wdGlvbmFsIGNvbnRleHQgb2YgaXRlcmF0aW9uICh0aGUgdmFsdWVvZiBgdGhpc2ApLCB3aWxsIGJlIHVuZGVmaW5lZCBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgcGFzc2VkLlxuICogQHBhcmFtIHtCb29sZWFufSBvbmx5RW51bWVyYWJsZSBBbiBvcHRpb25hbCBgdHJ1ZWAgdG8gaXRlcmF0ZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb25seS5cbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gbWFwS2V5cyhjYWxsYmFjaywgdGhpc0FyZywgb25seUVudW1lcmFibGUpIHtcbiAgICB2YXIgZGVzY3JpcHRvcnMgPSB7fTtcbiAgICBlYWNoS2V5LmNhbGwodGhpcywgbWFwUHJvcGVydHksIHRoaXNBcmcsIG9ubHlFbnVtZXJhYmxlKTtcbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgZGVzY3JpcHRvcnMpO1xuXG4gICAgZnVuY3Rpb24gbWFwUHJvcGVydHkodmFsdWUsIGtleSwgc2VsZikge1xuICAgICAgICBkZXNjcmlwdG9yc1trZXldID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzZWxmLCBrZXkpO1xuICAgICAgICBkZXNjcmlwdG9yc1trZXldLnZhbHVlID0gY2FsbGJhY2suY2FsbCh0aGlzLCB2YWx1ZSwga2V5LCBzZWxmKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBBbiBhbmFsb2d1ZSBvZiBbcmVkdWNlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9SZWR1Y2UpIG1ldGhvZCBvZiBBcnJheSBwcm90b3R5cGUuXG4gKiBUaGlzIG1ldGhvZCByZWR1Y2VzIHRoZSBvYmplY3QgdG8gYSBzaW5nbGUgdmFsdWUuIEl0ZXJhdGlvbiBvcmRlciBpcyBpbXBvc3NpYmxlIHRvIGNvbnRyb2wgd2l0aCBvYmplY3QuXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBhcnJheXMsIGl0IHdpbGwgaW5jbHVkZSBgbGVuZ3RoYCBwcm9wZXJ0eSBpbiBpdGVyYXRpb24uXG4gKiBUbyByZWR1Y2UgYXJyYXktbGlrZSBvYmplY3RzIHVzZTpcbiAqIGBgYFxuICogdmFyIHJlc3VsdCA9IF8ucmVkdWNlKGFyZ3VtZW50cywgY2FsbGJhY2ssIGluaXRpYWxWYWx1ZSwgdGhpc0FyZyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3Qgd2hpY2ggcHJvcGVydGllcyB3aWxsIGJlIGl0ZXJhdGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBpcyBwYXNzZWQgYHByZXZpb3VzVmFsdWVgLCBgdmFsdWVgLCBga2V5YCBhbmQgYHNlbGZgIGFuZCBzaG91bGQgcmV0dXJuIHZhbHVlIHRoYXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBgcHJldmlvdXNWYWx1ZWAgZm9yIHRoZSBuZXh0IGBjYWxsYmFja2AgY2FsbC5cbiAqIEBwYXJhbSB7QW55fSBpbml0aWFsVmFsdWUgVGhlIGluaXRpYWwgdmFsdWUgcGFzc2VkIHRvIGNhbGxiYWNrIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgb24gdGhlIGZpcnN0IGNhbGwuXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBBbiBvcHRpb25hbCBjb250ZXh0IG9mIGl0ZXJhdGlvbiAodGhlIHZhbHVlb2YgYHRoaXNgKSwgd2lsbCBiZSB1bmRlZmluZWQgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHBhc3NlZC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25seUVudW1lcmFibGUgQW4gb3B0aW9uYWwgYHRydWVgIHRvIGl0ZXJhdGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9ubHkuXG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmZ1bmN0aW9uIHJlZHVjZUtleXMoY2FsbGJhY2ssIGluaXRpYWxWYWx1ZSwgdGhpc0FyZywgb25seUVudW1lcmFibGUpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IG9ubHlFbnVtZXJhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IE9iamVjdC5rZXlzKHRoaXMpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGFsbEtleXMuY2FsbCh0aGlzKTtcblxuICAgIHZhciBtZW1vID0gaW5pdGlhbFZhbHVlO1xuXG4gICAgcHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgICAgbWVtbyA9IGNhbGxiYWNrLmNhbGwodGhpc0FyZywgbWVtbywgdGhpc1twcm9wXSwgcHJvcCwgdGhpcyk7XG4gICAgfSwgdGhpcyk7XG5cbiAgICByZXR1cm4gbWVtbztcbn1cblxuXG4vKipcbiAqIEFuIGFuYWxvZ3VlIG9mIFtmaWx0ZXJdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZpbHRlcikgbWV0aG9kIG9mIEFycmF5IHByb3RvdHlwZS5cbiAqIFJldHVybnMgdGhlIG5ldyBvYmplY3Qgd2l0aCBrZXlzIGZvciB3aGljaCBjYWxsYmFjayByZXR1cm5zIHRydWUuXG4gKiBQcm9wZXJ0eSBkZXNjcmlwdG9ycyBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgaGF2ZSB0aGUgc2FtZSBgZW51bWVyYWJsZWAsIGBjb25maWd1cmFibGVgIGFuZCBgd3JpdGFibGVgIHNldHRpbmdzIGFzIHRoZSBwcm9wZXJ0aWVzIG9mIGBzZWxmYC5cbiAqIFRvIGZpbHRlciBhcnJheS1saWtlIG9iamVjdHMgdXNlOlxuICogYGBgXG4gKiB2YXIgcmVzdWx0ID0gXy5maWx0ZXIoYXJndW1lbnRzLCBjYWxsYmFjaywgdGhpc0FyZyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3Qgd2hpY2ggcHJvcGVydGllcyB3aWxsIGJlIGl0ZXJhdGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBpcyBwYXNzZWQgYHZhbHVlYCwgYGtleWAgYW5kIGBzZWxmYC4gSWYgaXQgcmV0dXJucyB0cnV0aHkgdmFsdWUsIHRoZSBrZXkvdmFsdWUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIEFuIG9wdGlvbmFsIGNvbnRleHQgb2YgaXRlcmF0aW9uICh0aGUgdmFsdWVvZiBgdGhpc2ApLCB3aWxsIGJlIHVuZGVmaW5lZCBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgcGFzc2VkLlxuICogQHBhcmFtIHtCb29sZWFufSBvbmx5RW51bWVyYWJsZSBBbiBvcHRpb25hbCBgdHJ1ZWAgdG8gaXRlcmF0ZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb25seS5cbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZmlsdGVyS2V5cyhjYWxsYmFjaywgdGhpc0FyZywgb25seUVudW1lcmFibGUpIHtcbiAgICB2YXIgZGVzY3JpcHRvcnMgPSB7fTtcbiAgICBlYWNoS2V5LmNhbGwodGhpcywgZmlsdGVyUHJvcGVydHksIHRoaXNBcmcsIG9ubHlFbnVtZXJhYmxlKTtcbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgZGVzY3JpcHRvcnMpOztcblxuICAgIGZ1bmN0aW9uIGZpbHRlclByb3BlcnR5KHZhbHVlLCBrZXksIHNlbGYpIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrLmNhbGwodGhpcywgdmFsdWUsIGtleSwgc2VsZikpXG4gICAgICAgICAgICBkZXNjcmlwdG9yc1trZXldID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzZWxmLCBrZXkpO1xuICAgIH1cbn1cblxuXG52YXIgX3Bhc3NlZCA9IHt9XG4gICAgLCBfZGlkTm90UGFzcyA9IHt9O1xuXG4vKipcbiAqIEFuIGFuYWxvZ3VlIG9mIFtzb21lXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9zb21lKSBtZXRob2Qgb2YgQXJyYXkgcHJvdG90eXBlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB3aGljaCBwcm9wZXJ0aWVzIHdpbGwgYmUgaXRlcmF0ZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIGlzIHBhc3NlZCBgdmFsdWVgLCBga2V5YCBhbmQgYHNlbGZgLiBJZiBpdCByZXR1cm5zIHRydXRoeSB2YWx1ZSwgdGhlIGZ1bmN0aW9uIGltbWVhZGl0ZWx5IHJldHVybnMgYHRydWVgLlxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgQW4gb3B0aW9uYWwgY29udGV4dCBvZiBpdGVyYXRpb24gKHRoZSB2YWx1ZW9mIGB0aGlzYCksIHdpbGwgYmUgdW5kZWZpbmVkIGlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBwYXNzZWQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIEFuIG9wdGlvbmFsIGB0cnVlYCB0byBpdGVyYXRlIGVudW1lcmFibGUgcHJvcGVydGllcyBvbmx5LlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gc29tZUtleShjYWxsYmFjaywgdGhpc0FyZywgb25seUVudW1lcmFibGUpIHtcbiAgICB0cnkge1xuICAgICAgICBlYWNoS2V5LmNhbGwodGhpcywgdGVzdFByb3BlcnR5LCB0aGlzQXJnLCBvbmx5RW51bWVyYWJsZSk7XG4gICAgfSBjYXRjaCAodGVzdCkge1xuICAgICAgICBpZiAodGVzdCA9PT0gX3Bhc3NlZCkgcmV0dXJuIHRydWU7XG4gICAgICAgIGVsc2UgdGhyb3cgdGVzdDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgZnVuY3Rpb24gdGVzdFByb3BlcnR5KHZhbHVlLCBrZXksIHNlbGYpIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrLmNhbGwodGhpcywgdmFsdWUsIGtleSwgc2VsZikpXG4gICAgICAgICAgICB0aHJvdyBfcGFzc2VkO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIEFuIGFuYWxvZ3VlIG9mIFtldmVyeV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZXZlcnkpIG1ldGhvZCBvZiBBcnJheSBwcm90b3R5cGUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgQW4gb2JqZWN0IHdoaWNoIHByb3BlcnRpZXMgd2lsbCBiZSBpdGVyYXRlZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgaXMgcGFzc2VkIGB2YWx1ZWAsIGBrZXlgIGFuZCBgc2VsZmAuIElmIGl0IHJldHVybnMgZmFsc3kgdmFsdWUsIHRoZSBmdW5jdGlvbiBpbW1lYWRpdGVseSByZXR1cm5zIGBmYWxzZWAuXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBBbiBvcHRpb25hbCBjb250ZXh0IG9mIGl0ZXJhdGlvbiAodGhlIHZhbHVlb2YgYHRoaXNgKSwgd2lsbCBiZSB1bmRlZmluZWQgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHBhc3NlZC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25seUVudW1lcmFibGUgQW4gb3B0aW9uYWwgYHRydWVgIHRvIGl0ZXJhdGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9ubHkuXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBldmVyeUtleShjYWxsYmFjaywgdGhpc0FyZywgb25seUVudW1lcmFibGUpIHtcbiAgICB0cnkge1xuICAgICAgICBlYWNoS2V5LmNhbGwodGhpcywgdGVzdFByb3BlcnR5LCB0aGlzQXJnLCBvbmx5RW51bWVyYWJsZSk7XG4gICAgfSBjYXRjaCAodGVzdCkge1xuICAgICAgICBpZiAodGVzdCA9PT0gX2RpZE5vdFBhc3MpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZWxzZSB0aHJvdyB0ZXN0O1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGZ1bmN0aW9uIHRlc3RQcm9wZXJ0eSh2YWx1ZSwga2V5LCBzZWxmKSB7XG4gICAgICAgIGlmICghIGNhbGxiYWNrLmNhbGwodGhpcywgdmFsdWUsIGtleSwgc2VsZikpXG4gICAgICAgICAgICB0aHJvdyBfZGlkTm90UGFzcztcbiAgICB9XG59XG5cblxudmFyIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGVcbiAgICAsIGNvbmNhdCA9IEFycmF5UHJvdG8uY29uY2F0O1xuLyoqXG4gKiBSZXR1cm5zIG9iamVjdCBvZiB0aGUgc2FtZSBjbGFzcyB3aXRoIG9ubHkgc3BlY2lmaWVkIGtleXMsIHRoYXQgYXJlIHBhc3NlZCBhcyBzdHJpbmcgcGFyYW1ldGVycyBvciBhcnJheShzKSBvZiBrZXlzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIGFuIG9iamVjdCB0byBwaWNrIGtleXMgZnJvbVxuICogQHBhcmFtIHtMaXN0W1N0cmluZ3xBcnJheV19IGFyZ3VtZW50cyBsaXN0IG9mIGtleXMgKG9yIGFycmF5KHMpIG9mIGtleXMpXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIHBpY2tLZXlzKCkgeyAvLyAsIC4uLiBrZXlzXG4gICAgdmFyIGtleXMgPSBjb25jYXQuYXBwbHkoQXJyYXlQcm90bywgYXJndW1lbnRzKVxuICAgICAgICAsIG9iaiA9IE9iamVjdC5jcmVhdGUodGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpO1xuICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSlcbiAgICAgICAgICAgIG9ialtrZXldID0gdGhpc1trZXldO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiBvYmo7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIG9iamVjdCBvZiB0aGUgc2FtZSBjbGFzcyB3aXRob3V0IHNwZWNpZmllZCBrZXlzLCB0aGF0IGFyZSBwYXNzZWQgYXMgc3RyaW5nIHBhcmFtZXRlcnMgb3IgYXJyYXkocykgb2Yga2V5cy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBhbiBvYmplY3QgdG8gb21pdCBrZXlzIGluXG4gKiBAcGFyYW0ge0xpc3RbU3RyaW5nfEFycmF5XX0gYXJndW1lbnRzIGxpc3Qgb2Yga2V5cyAob3IgYXJyYXkocykgb2Yga2V5cylcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gb21pdEtleXMoKSB7IC8vICwgLi4uIGtleXNcbiAgICB2YXIga2V5cyA9IGNvbmNhdC5hcHBseShBcnJheVByb3RvLCBhcmd1bWVudHMpXG4gICAgICAgICwgb2JqID0gY2xvbmUuY2FsbCh0aGlzKTtcbiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KXtcbiAgICAgICAgZGVsZXRlIG9ialtrZXldO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiBvYmo7XG59XG5cblxuLyoqXG4gKiBQZXJmb3JtcyBkZWVwIGVxdWFsaXR5IHRlc3Qgb2YgdGhlIG9iamVjdC4gRG9lcyBub3Qgd29yayB3aXRoIHJlY3Vyc2l2ZSBvYmplY3RzXG4gKiBAcGFyYW0gIHtBbnl9IHNlbGYgb2JqZWN0IHRvIGNvbXBhcmVcbiAqIEBwYXJhbSAge0FueX0gb2JqIG9iamVjdCB0byBjb21wYXJlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc0VxdWFsKG9iaikge1xuICAgIGlmICh0aGlzID09PSBvYmopIHJldHVybiB0aGlzICE9PSAwIHx8IDEvdGhpcyA9PSAxL29iajsgLy8gMCBhbmQgLTAgYXJlIGNvbnNpZGVyZWQgbm90IGVxdWFsLCBhbHRob3VnaCAwID09PSAtMCBpcyB0cnVlXG4gICAgaWYgKHRoaXMgPT0gbnVsbCB8fCBvYmogPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBjbGFzc05hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgaWYgKGNsYXNzTmFtZSAhPSBvYmouY29uc3RydWN0b3IubmFtZSkgcmV0dXJuIGZhbHNlO1xuICAgIHN3aXRjaCAoY2xhc3NOYW1lKSB7XG4gICAgICAgIGNhc2UgJ1N0cmluZyc6XG4gICAgICAgICAgICByZXR1cm4gdGhpcyA9PSBTdHJpbmcob2JqKTtcbiAgICAgICAgY2FzZSAnTnVtYmVyJzpcbiAgICAgICAgICAgIHJldHVybiB0aGlzICE9ICt0aGlzID8gb2JqICE9ICtvYmogOiAodGhpcyA9PSAwID8gMS90aGlzID09IDEvb2JqIDogdGhpcyA9PSArb2JqKTtcbiAgICAgICAgY2FzZSAnRGF0ZSc6XG4gICAgICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgICAgICAgICAgcmV0dXJuICt0aGlzID09ICtvYmo7XG4gICAgICAgIGNhc2UgJ1JlZ0V4cCc6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2UgPT0gb2JqLnNvdXJjZVxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLmdsb2JhbCA9PSBvYmouZ2xvYmFsXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMubXVsdGlsaW5lID09IG9iai5tdWx0aWxpbmVcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5pZ25vcmVDYXNlID09IG9iai5pZ25vcmVDYXNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMgIT0gJ29iamVjdCcgfHwgdHlwZW9mIG9iaiAhPSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcykpXG4gICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PSBvYmoubGVuZ3RoXG4gICAgICAgICAgICAgICAgJiYgdGhpcy5ldmVyeShmdW5jdGlvbihpdGVtLCBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNFcXVhbC5jYWxsKGl0ZW0sIG9ialtpbmRleF0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gYWxsS2V5cy5jYWxsKHRoaXMpLmxlbmd0aCA9PSBhbGxLZXlzLmNhbGwob2JqKS5sZW5ndGhcbiAgICAgICAgICAgICAgICAmJiBldmVyeUtleS5jYWxsKHRoaXMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzRXF1YWwuY2FsbCh2YWx1ZSwgb2JqW2tleV0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIFRoZSBvcHBvc2l0ZSBvZiBpc0VxdWFsXG4gKiBAcGFyYW0gIHtBbnl9IHNlbGYgb2JqZWN0IHRvIGNvbXBhcmVcbiAqIEBwYXJhbSAge0FueX0gb2JqIG9iamVjdCB0byBjb21wYXJlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc05vdChvYmopIHtcbiAgICByZXR1cm4gIWlzRXF1YWwuY2FsbCh0aGlzLCBvYmopO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIC0gW2V4dGVuZFByb3RvXSgjZXh0ZW5kUHJvdG8pXG4gKiAtIFtjcmVhdGVTdWJjbGFzc10oI2NyZWF0ZVN1YmNsYXNzKVxuICogLSBbbWFrZVN1YmNsYXNzXSgjbWFrZVN1YmNsYXNzKVxuICogLSBbbmV3QXBwbHldKCNuZXdBcHBseSlcbiAqXG4gKiBUaGVzZSBtZXRob2RzIGNhbiBiZSBbY2hhaW5lZF0ocHJvdG8uanMuaHRtbCNQcm90bylcbiAqL1xudmFyIHByb3RvdHlwZU1ldGhvZHMgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBleHRlbmRQcm90bzogZXh0ZW5kUHJvdG8sXG4gICAgY3JlYXRlU3ViY2xhc3M6IGNyZWF0ZVN1YmNsYXNzLFxuICAgIG1ha2VTdWJjbGFzczogbWFrZVN1YmNsYXNzLFxuICAgIG5ld0FwcGx5OiBuZXdBcHBseVxufTtcblxuXG52YXIgX18gPSByZXF1aXJlKCcuL3Byb3RvX29iamVjdCcpO1xuXG5fXy5leHRlbmQuY2FsbChfXywgcmVxdWlyZSgnLi9wcm90b19mdW5jdGlvbicpKTtcblxuXG4vKipcbiAqIEFkZHMgbm9uLWVudW1lcmFibGUsIG5vbi1jb25maWd1cmFibGUgYW5kIG5vbi13cml0YWJsZSBwcm9wZXJ0aWVzIHRvIHRoZSBwcm90b3R5cGUgb2YgY29uc3RydWN0b3IgZnVuY3Rpb24uXG4gKiBVc2FnZTpcbiAqIGBgYFxuICogZnVuY3Rpb24gTXlDbGFzcygpIHt9XG4gKiBfLmV4dGVuZFByb3RvKE15Q2xhc3MsIHtcbiAqICAgICBtZXRob2QxOiBmdW5jdGlvbigpIHt9LFxuICogICAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkge31cbiAqIH0pO1xuICogYGBgXG4gKiBUbyBleHRlbmQgY2xhc3MgdmlhIG9iamVjdDpcbiAqIGBgYFxuICogXy5leHRlbmRQcm90byhvYmouY29uc3RydWN0b3IsIG1ldGhvZHMpO1xuICogYGBgXG4gKiBSZXR1cm5zIHBhc3NlZCBjb25zdHJ1Y3Rvciwgc28gZnVuY3Rpb25zIF8uZXh0ZW5kUHJvdG8sIFtfLmV4dGVuZF0ob2JqZWN0LmpzLmh0bWwjZXh0ZW5kKSBhbmQgXy5tYWtlU3ViY2xhc3MgY2FuIGJlIFtjaGFpbmVkXShwcm90by5qcy5odG1sKS4gXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2VsZiBjb25zdHJ1Y3RvciBmdW5jdGlvblxuICogQHBhcmFtIHtPYmplY3R9IG1ldGhvZHMgYSBtYXAgb2YgZnVuY3Rpb25zLCBrZXlzIHdpbGwgYmUgaW5zdGFuY2UgbWV0aG9kcyAocHJvcGVydGllcyBvZiB0aGUgY29uc3RydWN0b3IgcHJvdG90eXBlKVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGV4dGVuZFByb3RvKG1ldGhvZHMpIHtcbiAgICB2YXIgcHJvcERlc2NyaXB0b3JzID0ge307XG5cbiAgICBfXy5lYWNoS2V5LmNhbGwobWV0aG9kcywgZnVuY3Rpb24obWV0aG9kLCBuYW1lKSB7XG4gICAgICAgIHByb3BEZXNjcmlwdG9yc1tuYW1lXSA9IHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiBtZXRob2RcbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMucHJvdG90eXBlLCBwcm9wRGVzY3JpcHRvcnMpO1xuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogTWFrZXMgYSBzdWJjbGFzcyBvZiBjbGFzcyBgdGhpc0NsYXNzYC5cbiAqIFRoZSByZXR1cm5lZCBmdW5jdGlvbiB3aWxsIGhhdmUgc3BlY2lmaWVkIGBuYW1lYCBpZiBzdXBwbGllZC5cbiAqIFRoZSBjb25zdHJ1Y3RvciBvZiBzdXBlcmNsYXNzIHdpbGwgYmUgY2FsbGVkIGluIHN1YmNsYXNzIGNvbnN0cnVjdG9yIGJ5IGRlZmF1bHQgdW5sZXNzIGBhcHBseUNvbnN0cnVjdG9yID09PSBmYWxzZWAgKG5vdCBqdXN0IGZhbHN5KS5cbiAqIENvcGllcyBgdGhpc0NsYXNzYCBjbGFzcyBtZXRob2RzIHRvIGNyZWF0ZWQgc3ViY2xhc3MuIEZvciB0aGVtIHRvIHdvcmsgY29ycmVjdGx5IHRoZXkgc2hvdWxkIHVzZSBgdGhpc2AgdG8gcmVmZXIgdG8gdGhlIGNsYXNzIHJhdGhlciB0aGFuIGV4cGxpY2l0IHN1cGVyY2xhc3MgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aGlzQ2xhc3MgQSBjbGFzcyB0byBtYWtlIHN1YmNsYXNzIG9mXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBPcHRpb25hbCBuYW1lIG9mIHN1YmNsYXNzIGNvbnN0cnVjdG9yIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGFwcGx5Q29uc3RydWN0b3IgT3B0aW9uYWwgZmFsc2UgdmFsdWUgKG5vdCBmYWxzeSkgdG8gcHJldmVudCBjYWxsIG9mIGluaGVyaXRlZCBjb25zdHJ1Y3RvciBpbiB0aGUgY29uc3RydWN0b3Igb2Ygc3ViY2xhc3NcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBjcmVhdGVTdWJjbGFzcyhuYW1lLCBhcHBseUNvbnN0cnVjdG9yKSB7XG4gICAgdmFyIHRoaXNDbGFzcyA9IHRoaXM7XG4gICAgdmFyIHN1YmNsYXNzO1xuXG4gICAgLy8gbmFtZSBpcyBvcHRpb25hbFxuICAgIG5hbWUgPSBuYW1lIHx8ICcnO1xuXG4gICAgLy8gYXBwbHkgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvclxuICAgIHZhciBjb25zdHJ1Y3RvckNvZGUgPSBhcHBseUNvbnN0cnVjdG9yID09PSBmYWxzZVxuICAgICAgICAgICAgPyAnJ1xuICAgICAgICAgICAgOiAndGhpc0NsYXNzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7JztcblxuICAgIGV2YWwoJ3N1YmNsYXNzID0gZnVuY3Rpb24gJyArIG5hbWUgKyAnKCl7ICcgKyBjb25zdHJ1Y3RvckNvZGUgKyAnIH0nKTtcblxuICAgIG1ha2VTdWJjbGFzcy5jYWxsKHN1YmNsYXNzLCB0aGlzQ2xhc3MpO1xuXG4gICAgLy8gY29weSBjbGFzcyBtZXRob2RzXG4gICAgLy8gLSBmb3IgdGhlbSB0byB3b3JrIGNvcnJlY3RseSB0aGV5IHNob3VsZCBub3QgZXhwbGljdGx5IHVzZSBzdXBlcmNsYXNzIG5hbWVcbiAgICAvLyBhbmQgdXNlIFwidGhpc1wiIGluc3RlYWRcbiAgICBfXy5kZWVwRXh0ZW5kLmNhbGwoc3ViY2xhc3MsIHRoaXNDbGFzcywgdHJ1ZSk7XG5cbiAgICByZXR1cm4gc3ViY2xhc3M7XG59XG5cblxuLyoqXG4gKiBTZXRzIHVwIHByb3RvdHlwZSBjaGFpbiB0byBjaGFuZ2UgYHRoaXNDbGFzc2AgKGEgY29uc3RydWN0b3IgZnVuY3Rpb24pIHNvIHRoYXQgaXQgYmVjb21lcyBhIHN1YmNsYXNzIG9mIGBTdXBlcmNsYXNzYC5cbiAqIFJldHVybnMgYHRoaXNDbGFzc2Agc28gaXQgY2FuIGJlIFtjaGFpbmVkXShwcm90by5qcy5odG1sKSB3aXRoIF8uZXh0ZW5kUHJvdG8gYW5kIFtfLmV4dGVuZF0ob2JqZWN0LmpzLmh0bWwjZXh0ZW5kKS5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aGlzQ2xhc3MgQSBjbGFzcyB0aGF0IHdpbGwgYmVjb21lIGEgc3ViY2xhc3Mgb2YgU3VwZXJjbGFzc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gU3VwZXJjbGFzcyBBIGNsYXNzIHRoYXQgd2lsbCBiZWNvbWUgYSBzdXBlcmNsYXNzIG9mIHRoaXNDbGFzc1xuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIG1ha2VTdWJjbGFzcyhTdXBlcmNsYXNzKSB7XG4gICAgLy8gcHJvdG90eXBlIGNoYWluXG4gICAgdGhpcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN1cGVyY2xhc3MucHJvdG90eXBlKTtcbiAgICBcbiAgICAvLyBzdWJjbGFzcyBpZGVudGl0eVxuICAgIGV4dGVuZFByb3RvLmNhbGwodGhpcywge1xuICAgICAgICBjb25zdHJ1Y3RvcjogdGhpc1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogQ2FsbHMgY29uc3RydWN0b3IgYHRoaXNgIHdpdGggYXJndW1lbnRzIHBhc3NlZCBhcyBhcnJheVxuICogXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aGlzQ2xhc3MgQSBjbGFzcyBjb25zdHJ1Y3RvciB0aGF0IHdpbGwgYmUgY2FsbGVkXG4gKiBAcmV0dXJuIHtBcnJheXxBcnJheS1saWtlfSBhcmdzIEFycmF5IG9mIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIG5ld0FwcGx5KGFyZ3MpIHtcbiAgICBpZiAoISBBcnJheS5pc0FycmF5KGFyZ3MpKVxuICAgICAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncyk7XG4gICAgLy8gXCJudWxsXCIgaXMgY29udGV4dCB0byBwYXNzIHRvIGNsYXNzIGNvbnN0cnVjdG9yLCBmaXJzdCBwYXJhbWV0ZXIgb2YgYmluZFxuICAgIHZhciBhcmdzID0gW251bGxdLmNvbmNhdChhcmdzKTtcbiAgICByZXR1cm4gbmV3IChGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseSh0aGlzLCBhcmdzKSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIF9fID0gcmVxdWlyZSgnLi9wcm90b19vYmplY3QnKTtcblxuXG4vKipcbiAqIC0gW2ZpcnN0VXBwZXJDYXNlXSgjZmlyc3RVcHBlckNhc2UpXG4gKiAtIFtmaXJzdExvd2VyQ2FzZV0oI2ZpcnN0TG93ZXJDYXNlKVxuICogLSBbdG9SZWdFeHBdKCN0b1JlZ0V4cClcbiAqIC0gW3RvRnVuY3Rpb25dKCN0b0Z1bmN0aW9uKVxuICogLSBbdG9EYXRlXSgjdG9EYXRlKVxuICogLSBbdG9RdWVyeVN0cmluZ10oI3RvUXVlcnlTdHJpbmcpXG4gKiAtIFtmcm9tUXVlcnlTdHJpbmddKCNmcm9tUXVlcnlTdHJpbmcpXG4gKiAtIFtqc29uUGFyc2VdKCNqc29uUGFyc2UpXG4gKiAtIFtoYXNoQ29kZV0oI2hhc2hDb2RlKVxuICogLSBbdW5QcmVmaXhdKCN1blByZWZpeClcbiAqL1xuIHZhciBzdHJpbmdNZXRob2RzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZmlyc3RVcHBlckNhc2U6IGZpcnN0VXBwZXJDYXNlLFxuICAgIGZpcnN0TG93ZXJDYXNlOiBmaXJzdExvd2VyQ2FzZSxcbiAgICB0b1JlZ0V4cDogdG9SZWdFeHAsXG4gICAgdG9GdW5jdGlvbjogdG9GdW5jdGlvbixcbiAgICB0b0RhdGU6IHRvRGF0ZSxcbiAgICB0b1F1ZXJ5U3RyaW5nOiB0b1F1ZXJ5U3RyaW5nLFxuICAgIGZyb21RdWVyeVN0cmluZzogZnJvbVF1ZXJ5U3RyaW5nLFxuICAgIGpzb25QYXJzZToganNvblBhcnNlLFxuICAgIGhhc2hDb2RlOiBoYXNoQ29kZSxcbiAgICB1blByZWZpeDogdW5QcmVmaXhcbn07XG5cblxuLyoqXG4gKiBSZXR1cm5zIHN0cmluZyB3aXRoIHRoZSBmaXJzdCBjaGFyYWN0ZXIgY2hhbmdlZCB0byB1cHBlciBjYXNlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxmIEEgc3RyaW5nIHRoYXQgd2lsbCBoYXZlIGl0cyBmaXJzdCBjaGFyYWN0ZXIgcmVwbGFjZWRcbiAqL1xuZnVuY3Rpb24gZmlyc3RVcHBlckNhc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMgPyB0aGlzWzBdLnRvVXBwZXJDYXNlKCkgKyB0aGlzLnNsaWNlKDEpIDogdGhpcztcbn1cblxuXG4vKipcbiAqIFJldHVybnMgc3RyaW5nIHdpdGggdGhlIGZpcnN0IGNoYXJhY3RlciBjaGFuZ2VkIHRvIGxvd2VyIGNhc2UuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGYgQSBzdHJpbmcgdGhhdCB3aWxsIGhhdmUgaXRzIGZpcnN0IGNoYXJhY3RlciByZXBsYWNlZFxuICovXG5mdW5jdGlvbiBmaXJzdExvd2VyQ2FzZSgpIHtcbiAgICByZXR1cm4gdGhpcyA/IHRoaXNbMF0udG9Mb3dlckNhc2UoKSArIHRoaXMuc2xpY2UoMSkgOiB0aGlzO1xufVxuXG5cbi8qKlxuICogQ29udmVydHMgc3RyaW5nIGNyZWF0ZWQgYnkgYHRvU3RyaW5nYCBtZXRob2Qgb2YgUmVnRXhwIGJhY2sgdG8gUmVnRXhwXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGYgc3RyaW5nIGNvbnRhaW5pbmcgcmVndWxhciBleHByZXNzaW9uIGluY2x1ZGluZyBlbmNsb3NpbmcgXCIvXCIgc3ltYm9scyBhbmQgZmxhZ3NcbiAqIEByZXR1cm4ge1JlZ0V4cH1cbiAqL1xuZnVuY3Rpb24gdG9SZWdFeHAoKSB7XG4gICAgdmFyIHJ4ID0gdGhpcy5tYXRjaChyZWdleHBTdHJpbmdQYXR0ZXJuKTtcbiAgICBpZiAocngpIHJldHVybiBuZXcgUmVnRXhwKHJ4WzFdLCByeFsyXSk7XG59XG52YXIgcmVnZXhwU3RyaW5nUGF0dGVybiA9IC9eXFwvKC4qKVxcLyhbZ2lteV0qKSQvO1xuXG5cbi8qKlxuICogQ29udmVydHMgc3RyaW5nIGNyZWF0ZWQgYnkgYHRvU3RyaW5nYCBtZXRob2Qgb2YgZnVuY3Rpb24gYmFjayB0byBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxmIHN0cmluZyBjb250YWluaW5nIGZ1bGwgZnVuY3Rpb24gY29kZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIHRvRnVuY3Rpb24oKSB7XG4gICAgdmFyIGZ1bmM7XG4gICAgdmFyIGNvZGUgPSAnZnVuYyA9ICcgKyB0aGlzICsgJzsnO1xuICAgIHRyeSB7XG4gICAgICAgIGV2YWwoY29kZSk7XG4gICAgICAgIHJldHVybiBmdW5jO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxufVxuXG5cbi8qKlxuICogQ29udmVydHMgc3RyaW5nIHRvIGRhdGUgaW4gYSBzYWZlIHdheSBzbyB0aGF0IHRoZSByZXNpdWx0IGlzIHVuZGVmaW5lZCBpZiBkYXRlIGlzIGludmFsaWRcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xEYXRlfSBzZWxmIHN0cmluZyBvciBkYXRlIG9iamVjdCB0byBjb252ZXJ0IHRvIFZBTElEIGRhdGVcbiAqIEByZXR1cm4ge1t0eXBlXX0gW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiB0b0RhdGUoKSB7XG4gICAgaWYgKCEgdGhpcykgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICAgIHZhciBkYXRlID0gbmV3IERhdGUodGhpcyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICBpZiAoZGF0ZSAmJiBkYXRlLmdldFRpbWUgJiYgIWlzTmFOKGRhdGUuZ2V0VGltZSgpKSlcbiAgICAgICAgcmV0dXJuIGRhdGU7XG59XG5cblxuLyoqXG4gKiBDb252ZXJ0IHBhcmFtcyBvYmplY3QgdG8gYSB1cmwgc3R5bGUgcXVlcnkgc3RyaW5nICh3aXRob3V0IFwiP1wiKVxuICogXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBUaGUgb2JqZWN0IGhhc2ggdG8gYmUgY29udmVydGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlbmNvZGUgb3B0aW9uYWwgZnVuY3Rpb24gdXNlZCB0byBlbmNvZGUgZGF0YSwgZW5jb2RlVVJJQ29tcG9uZW50IGlzIHVzZWQgaWYgbm90IHNwZWNpZmllZFxuICogQHJldHVybiB7U3RyaW5nfSB0aGUgcmVzdWx0aW5nIHF1ZXJ5IHN0cmluZ1xuICovXG5mdW5jdGlvbiB0b1F1ZXJ5U3RyaW5nKGVuY29kZSkge1xuICAgIHZhciBxcyA9ICcnXG4gICAgICAgICwgcGFyYW1zID0gdGhpcyB8fCB7fVxuICAgICAgICAsIGVuY29kZSA9IGVuY29kZSB8fCBlbmNvZGVVUklDb21wb25lbnQ7XG5cbiAgICBfXy5lYWNoS2V5LmNhbGwocGFyYW1zLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgIHFzICs9IGtleSArICc9JyArIGVuY29kZSh2YWx1ZSkgKyAnJic7XG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIHFzLnNsaWNlKDAsIC0xKTtcbn1cblxuXG4vKipcbiAqIENvbnZlcnQgdXJsIHN0eWxlIHF1ZXJ5IHN0cmluZyAod2l0aG91dCBcIj9cIikgaW50byBvYmplY3QgaGFzaFxuICogXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZiBUaGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZGVjb2RlIG9wdGlvbmFsIGRlY29kZSBmdW5jdGlvbiwgZGVjb2RlVVJJQ29tcG9uZW50IHdpbGwgYmUgdXNlZCBpZiBub3Qgc3VwcGxpZWRcbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIHJlc3VsdGluZyBvYmplY3QgaGFzaFxuICovXG5mdW5jdGlvbiBmcm9tUXVlcnlTdHJpbmcoZGVjb2RlKSB7XG4gICAgdmFyIHBhaXJzID0gdGhpcy5zcGxpdCgnJicpXG4gICAgICAgICwgcmVzdWx0cyA9IHt9XG4gICAgICAgICwgZGVjb2RlID0gZGVjb2RlIHx8IGRlY29kZVVSSUNvbXBvbmVudDtcblxuICAgIHBhaXJzLmZvckVhY2goZnVuY3Rpb24ocGFpcikge1xuICAgICAgICB2YXIgc3BsaXRQYWlyID0gcGFpci5zcGxpdCgnPScpO1xuICAgICAgICBpZiAoc3BsaXRQYWlyLmxlbmd0aCA8IDIpIHJldHVybjtcbiAgICAgICAgdmFyIGtleSA9IHNwbGl0UGFpclswXVxuICAgICAgICAgICAgLCB2YWx1ZSA9IGRlY29kZShzcGxpdFBhaXJbMV0gfHwgJycpO1xuICAgICAgICBpZiAoIWtleSkgcmV0dXJuO1xuICAgICAgICByZXN1bHRzW2tleV0gPSB2YWx1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xufVxuXG5cbi8qKlxuICogU2FmZSBKU09OLnBhcnNlLCByZXR1cm5zIHVuZGVmaW5lZCBpZiBKU09OLnBhcnNlIHRocm93cyBhbiBleGNlcHRpb25cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZiBKU09OIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvYmplY3RcbiAqIEByZXR1cm4ge09iamVjdHx1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIGpzb25QYXJzZSgpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzKTtcbiAgICB9IGNhdGNoIChlKSB7fVxufVxuXG5cbi8qKlxuICogRGFuIEJlcm5zdGVpbidzIGFsZ29yeXRobSB0byBjcmVhdGUgaGFzaCBmcm9tIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxmIHN0cmluZyB0byBjb252ZXJ0IHRvIGhhc2hcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqL1xuZnVuY3Rpb24gaGFzaENvZGUoKSB7XG4gICAgdmFyIGhhc2ggPSA1MzgxXG4gICAgICAgICwgc3RyID0gdGhpc1xuICAgICAgICAsIGxlbiA9IHN0ci5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgY2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBoYXNoID0gKChoYXNoIDw8IDUpICsgaGFzaCkgKyBjaGFyOyAvKiBoYXNoICogMzMgKyBjICovXG4gICAgfVxuICAgIHJldHVybiBoYXNoO1xufVxuXG5cbi8qKlxuICogUmVtb3ZlcyBnaXZlbiBwcmVmaXggZnJvbSB0aGUgc3RyaW5nLiBJZiBzdHJpbmcgZG9lcyBub3QgYmVnaW4gZnJvbSB0aGUgcHJlZml4LCByZXR1cm5zIHVuZGVmaW5lZFxuICogXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZlxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiB1blByZWZpeChzdHIpIHtcbiAgICBpZiAodGhpcy5pbmRleE9mKHN0cikgPT0gMClcbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZShzdHIsICcnKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiAtIFt0aW1lc10oI3RpbWVzKVxuICogLSBbcmVwZWF0XSgjcmVwZWF0KVxuICogLSBbdGFwXSgjdGFwKVxuICogLSBbcmVzdWx0XSgjcmVzdWx0KVxuICogLSBbaWRlbnRpdHldKCNpZGVudGl0eSlcbiAqIC0gW3Byb3BlcnR5XSgjcHJvcGVydHkpXG4gKiAtIFtjb21wYXJlUHJvcGVydHldKCNjb21wYXJlUHJvcGVydHkpXG4gKiAtIFtub29wXSgjbm9vcClcbiAqL1xudmFyIHV0aWxNZXRob2RzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgdGltZXM6IHRpbWVzLFxuICAgIHJlcGVhdDogcmVwZWF0LFxuICAgIHRhcDogdGFwLFxuICAgIHJlc3VsdDogcmVzdWx0LFxuICAgIGlkZW50aXR5OiBpZGVudGl0eSxcbiAgICBwcm9wZXJ0eTogcHJvcGVydHksXG4gICAgY29tcGFyZVByb3BlcnR5OiBjb21wYXJlUHJvcGVydHksXG4gICAgbm9vcDogbm9vcFxufTtcblxuXG4vKipcbiAqIENhbGxzIGBjYWxsYmFja2AgYHNlbGZgIHRpbWVzIHdpdGggYHRoaXNBcmdgIGFzIGNvbnRleHQuIENhbGxiYWNrIGlzIHBhc3NlZCBpdGVyYXRpb24gaW5kZXggZnJvbSAwIHRvIGBzZWxmLTFgXG4gKiBcbiAqIEBwYXJhbSB7SW50ZWdlcn0gc2VsZlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7QW55fSB0aGlzQXJnXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gdGltZXMoY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICB2YXIgYXJyID0gQXJyYXkoTWF0aC5tYXgoMCwgdGhpcykpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpczsgaSsrKVxuICAgICAgICBhcnJbaV0gPSBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIGkpO1xuICAgIHJldHVybiBhcnI7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFycmF5IHdpdGggdGhlIGZpcnN0IGFyZ3VtZW50IHJlcGVhdGVkIGB0aW1lc2AgdGltZXNcbiAqIEBwYXJhbSAge0FueX0gc2VsZlxuICogQHBhcmFtICB7SW50ZWdlcn0gdGltZXNcbiAqIEByZXR1cm4ge0FycmF5W0FueV19XG4gKi9cbmZ1bmN0aW9uIHJlcGVhdCh0aW1lcykge1xuICAgIHZhciBhcnIgPSBBcnJheShNYXRoLm1heCgwLCB0aW1lcykpOztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRpbWVzOyBpKyspXG4gICAgICAgIGFycltpXSA9IHRoaXM7XG4gICAgcmV0dXJuIGFycjtcbn1cblxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIHRhcCBpbnRvIGNoYWluZWQgbWV0aG9kcyBhbmQgdG8gaW5zcGVjdCBpbnRlcm1lZGlhcnkgcmVzdWx0XG4gKlxuICogQHBhcmFtIHtBbnl9IHNlbGYgdmFsdWUgdGhhdCdzIHBhc3NlZCBiZXR3ZWVuIGNoYWluZWQgbWV0aG9kc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHZhbHVlIChib3RoIGFzIGNvbnRleHQgYW5kIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIpXG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmZ1bmN0aW9uIHRhcChmdW5jKSB7XG4gICAgZnVuYy5jYWxsKHRoaXMsIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xufTtcblxuXG4vKipcbiAqIENhbGxzIGZ1bmN0aW9uIGBzZWxmYCAoZmlyc3QgcGFyYW1ldGVyIG9mIF8ucmVzdWx0KSB3aXRoIGdpdmVuIGNvbnRleHQgYW5kIGFyZ3VtZW50c1xuICogXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufEFueX0gc2VsZlxuICogQHBhcmFtIHtBbnl9IHRoaXNBcmcgY29udGV4dFxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgZXh0cmEgYXJndW1lbnRzXG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmZ1bmN0aW9uIHJlc3VsdCh0aGlzQXJnKSB7IC8vLCBhcmd1bWVudHNcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gdGhpcy5hcHBseSh0aGlzQXJnLCBhcmdzKVxuICAgICAgICAgICAgOiB0aGlzO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBzZWxmLiBVc2VmdWwgZm9yIHVzaW5nIGFzIGFuIGl0ZXJhdG9yIGlmIHRoZSBhY3R1YWwgdmFsdWUgbmVlZHMgdG8gYmUgcmV0dXJuZWQuIFVubGlrZSBpbiB1bmRlcnNjb3JlIGFuZCBsb2Rhc2gsIHRoaXMgZnVuY3Rpb24gaXMgTk9UIHVzZWQgYXMgZGVmYXVsdCBpdGVyYXRvci5cbiAqXG4gKiBAcGFyYW0ge0FueX0gc2VsZiBcbiAqIEByZXR1cm4ge0FueX1cbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGZ1bmN0aW9uIHRoYXQgcGlja3MgdGhlIHByb3BlcnR5IGZyb20gdGhlIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxmXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gcHJvcGVydHkoKSB7XG4gICAgdmFyIGtleSA9IHRoaXM7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqW2tleV07XG4gICAgfTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCBpbiBhcnJheSBzb3J0IHRvIHNvcnQgYnkgYSBnaXZlbiBwcm9wZXJ0eVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxmXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gY29tcGFyZVByb3BlcnR5KCkge1xuICAgIHZhciBrZXkgPSB0aGlzO1xuICAgIHJldHVybiBmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgIHJldHVybiBhW2tleV0gPCBiW2tleV1cbiAgICAgICAgICAgID8gLTFcbiAgICAgICAgICAgIDogYVtrZXldID4gYltrZXldXG4gICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgOiAwO1xuICAgIH07XG59XG5cblxuLyoqXG4gKiBGdW5jdGlvbiB0aGF0IGRvZXMgbm90aGluZ1xuICovXG5mdW5jdGlvbiBub29wKCkge31cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbWFrZVByb3RvSW5zdGFuY2VNZXRob2Q6IG1ha2VQcm90b0luc3RhbmNlTWV0aG9kLFxuICAgIG1ha2VQcm90b0Z1bmN0aW9uOiBtYWtlUHJvdG9GdW5jdGlvbixcbiAgICBtYWtlRmluZE1ldGhvZDogbWFrZUZpbmRNZXRob2Rcbn1cblxuXG5mdW5jdGlvbiBtYWtlUHJvdG9JbnN0YW5jZU1ldGhvZChtZXRob2QpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuc2VsZiA9IG1ldGhvZC5hcHBseSh0aGlzLnNlbGYsIGFyZ3VtZW50cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG59XG5cblxuZnVuY3Rpb24gbWFrZVByb3RvRnVuY3Rpb24obWV0aG9kKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyB3aGVuIHRoZSBtZXRob2QgaXMgZXhlY3V0ZWQsIHRoZSB2YWx1ZSBvZiBcInRoaXNcIiB3aWxsIGJlIGFyZ3VtZW50c1swXSxcbiAgICAgICAgLy8gb3RoZXIgYXJndW1lbnRzIHN0YXJ0aW5nIGZyb20gIzEgd2lsbCBwYXNzZWQgdG8gbWV0aG9kIGFzIHBhcmFtZXRlcnMuXG4gICAgICAgIHJldHVybiBtZXRob2QuY2FsbC5hcHBseShtZXRob2QsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn1cblxuXG52YXIgX2Vycm9yID0gbmV3IEVycm9yO1xuXG4vKipcbiAqIFJldHVybnMgYGZpbmRgIG9yIGBmaW5kSW5kZXhgIG1ldGhvZCwgZGVwZW5kaW5nIG9uIHBhcmFtZXRlclxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hNZXRob2QgLSBtZXRob2QgdG8gdXNlIGZvciBpdGVyYXRpb24gKGZvckVhY2ggZm9yIGFycmF5IG9yIGVhY2hLZXkgZm9yIG9iamVjdClcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaW5kV2hhdCAndmFsdWUnIC0gcmV0dXJucyBmaW5kIG1ldGhvZCBvZiBBcnJheSAoaW1wbGVtZW50ZWQgaW4gRVM2KSBvciBmaW5kVmFsdWUgbWV0aG9kIG9mIE9iamVjdCwgYW55dGhpbmcgZWxzZSA9IHJldHVybnMgZmluZEluZGV4L2ZpbmRLZXkgbWV0aG9kcy5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBtYWtlRmluZE1ldGhvZChlYWNoTWV0aG9kLCBmaW5kV2hhdCkge1xuICAgIHZhciBhcmdJbmRleCA9IGZpbmRXaGF0ID09ICd2YWx1ZScgPyAwIDogMTtcblxuICAgIHJldHVybiBmdW5jdGlvbiBmaW5kVmFsdWVPckluZGV4KGNhbGxiYWNrLCB0aGlzQXJnLCBvbmx5RW51bWVyYWJsZSkge1xuICAgICAgICB2YXIgY2F1Z2h0RXJyb3I7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlYWNoTWV0aG9kLmNhbGwodGhpcywgdGVzdEl0ZW0sIHRoaXNBcmcsIG9ubHlFbnVtZXJhYmxlKTtcbiAgICAgICAgfSBjYXRjaCAoZm91bmQpIHtcbiAgICAgICAgICAgIGlmIChmb3VuZCA9PT0gX2Vycm9yKSB0aHJvdyBjYXVnaHRFcnJvcjtcbiAgICAgICAgICAgIGVsc2UgcmV0dXJuIGZvdW5kO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGxvb2tpbmcgZm9yIGluZGV4IGFuZCBub3QgZm91bmQsIHJldHVybiAtMVxuICAgICAgICBpZiAoYXJnSW5kZXggJiYgZWFjaE1ldGhvZCA9PSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaClcbiAgICAgICAgICAgIHJldHVybiAtMTsgXG5cbiAgICAgICAgZnVuY3Rpb24gdGVzdEl0ZW0odmFsdWUsIGluZGV4LCBzZWxmKSB7XG4gICAgICAgICAgICB2YXIgdGVzdDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGVzdCA9IGNhbGxiYWNrLmNhbGwodGhpcywgdmFsdWUsIGluZGV4LCBzZWxmKTtcbiAgICAgICAgICAgIH0gY2F0Y2goZXJyKSB7XG4gICAgICAgICAgICAgICAgY2F1Z2h0RXJyb3IgPSBlcnI7XG4gICAgICAgICAgICAgICAgdGhyb3cgX2Vycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRlc3QpXG4gICAgICAgICAgICAgICAgdGhyb3cgYXJndW1lbnRzW2FyZ0luZGV4XTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ== +//@ sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvYWJzdHJhY3QvZmFjZXQuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2Fic3RyYWN0L2ZhY2V0ZWRfb2JqZWN0LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9hYnN0cmFjdC9yZWdpc3RyeS5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvYXR0cmlidXRlcy9hX2JpbmQuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2F0dHJpYnV0ZXMvYV9jbGFzcy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvYXR0cmlidXRlcy9hX2xvYWQuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2F0dHJpYnV0ZXMvaW5kZXguanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2JpbmRlci5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY2xhc3Nlcy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tbWFuZC9hY3Rpb25zX2hpc3RvcnkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbW1hbmQvY21kX3JlZ2lzdHJ5LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21tYW5kL2luZGV4LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21tYW5kL3RyYW5zYWN0aW9uLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21tYW5kL3RyYW5zYWN0aW9uX2hpc3RvcnkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19jbGFzcy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jX2ZhY2V0LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0NvbnRhaW5lci5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jX2ZhY2V0cy9EYXRhLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0RvbS5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jX2ZhY2V0cy9EcmFnLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0Ryb3AuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvRXZlbnRzLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0ZyYW1lLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL0l0ZW0uanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvTGlzdC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jX2ZhY2V0cy9Nb2RlbEZhY2V0LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfZmFjZXRzL09wdGlvbnMuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvVGVtcGxhdGUuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvVHJhbnNmZXIuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19mYWNldHMvY2ZfcmVnaXN0cnkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY19pbmZvLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL2NfcmVnaXN0cnkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvY191dGlscy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9jbGFzc2VzL1ZpZXcuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvbXNnX2FwaS9kYXRhLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL21zZ19hcGkvZGVfZGF0YS5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy9tc2dfYXBpL2Ryb3AuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvbXNnX3NyYy9kb21fZXZlbnRzLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL21zZ19zcmMvZnJhbWUuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvc2NvcGUuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvQnV0dG9uLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0NvbWJvLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0NvbWJvTGlzdC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy91aS9EYXRlLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0Ryb3BUYXJnZXQuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvRm9sZFRyZWUuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvR3JvdXAuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvSHlwZXJsaW5rLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0ltYWdlLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0lucHV0LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0lucHV0TGlzdC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy91aS9MaXN0LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL0xpc3RJdGVtLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL1JhZGlvR3JvdXAuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvU2VsZWN0LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL1N1cGVyQ29tYm8uanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvVGV4dC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy91aS9UZXh0YXJlYS5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvY29tcG9uZW50cy91aS9UaW1lLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL1dyYXBwZXIuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvYm9vdHN0cmFwL0FsZXJ0LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb21wb25lbnRzL3VpL2Jvb3RzdHJhcC9EaWFsb2cuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2NvbXBvbmVudHMvdWkvYm9vdHN0cmFwL0Ryb3Bkb3duLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi9jb25maWcuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL2xvYWRlci5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvbWlsby5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvcmVnaXN0cnkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL2RlX2NvbnN0cnMuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL2RvbV9zb3VyY2UuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL21haWwvaW5kZXguanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL21haWwvbWFpbF9hcGkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL21haWwvbWFpbF9zb3VyY2UuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3NlcnZpY2VzL3dpbmRvdy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvdXNlX2NvbXBvbmVudHMuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3VzZV9mYWNldHMuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvY29tcG9uZW50X25hbWUuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvY3JlYXRlX2NvbXBvbmVudF9jbGFzcy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvdXRpbC9kZXByZWNhdGUuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvZG9tLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi91dGlsL2RvbV9saXN0ZW5lcnMuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvZG9tcmVhZHkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvZHJhZ2Ryb3AuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvZXJyb3IuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvZnJhZ21lbnQuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvaW5kZXguanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvanNvbl9wYXJzZS5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvdXRpbC9yZXF1ZXN0LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi91dGlsL3NlbGVjdGlvbi9pbmRleC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvdXRpbC9zdG9yYWdlL2luZGV4LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi91dGlsL3N0b3JhZ2UvbW9kZWwuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvc3RvcmFnZS9tc2dfc3JjLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL2xpYi91dGlsL3VuaXF1ZV9pZC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9saWIvdXRpbC93ZWJzb2NrZXQvaW5kZXguanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvd2Vic29ja2V0L21zZ19hcGkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbGliL3V0aWwvd2Vic29ja2V0L21zZ19zcmMuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL2Jhc2UzMi9saWIvYmFzZTMyLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLWJ1aWx0aW5zL2J1aWx0aW4vZnMuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvYWJzdHJhY3QvbWl4aW4uanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvY2xhc3Nlcy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9jb25maWcuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbWVzc2VuZ2VyL2luZGV4LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21lc3Nlbmdlci9tX2FwaS5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tZXNzZW5nZXIvbV9hcGlfcnguanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbWVzc2VuZ2VyL21fc291cmNlLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21lc3Nlbmdlci9tc25ncl9zb3VyY2UuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbWlsby1jb3JlLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21pbmRlci5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tb2RlbC9jaGFuZ2VfZGF0YS5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tb2RlbC9jb25uZWN0b3IuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbW9kZWwvaW5kZXguanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbW9kZWwvbV9tc2dfYXBpLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL21vZGVsL21fcGF0aC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tb2RlbC9tb2RlbF91dGlscy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tb2RlbC9wYXRoX21zZ19hcGkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvbW9kZWwvcGF0aF91dGlscy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi9tb2RlbC9zeW50aGVzaXplL2luZGV4LmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbGliL3V0aWwvY2hlY2suanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9saWIvdXRpbC9pbmRleC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi91dGlsL2xvZ2dlci5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL2xpYi91dGlsL2xvZ2dlcl9jbGFzcy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9kb3QvZG9ULmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbm9kZV9tb2R1bGVzL2RvdC9pbmRleC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9tb2wtcHJvdG8vbGliL3Byb3RvLmpzIiwiL1VzZXJzL2phc29uaWFuZ3JlZW4vd29yay9DQy9taWxvL25vZGVfbW9kdWxlcy9taWxvLWNvcmUvbm9kZV9tb2R1bGVzL21vbC1wcm90by9saWIvcHJvdG9fYXJyYXkuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9ub2RlX21vZHVsZXMvbW9sLXByb3RvL2xpYi9wcm90b19mdW5jdGlvbi5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9tb2wtcHJvdG8vbGliL3Byb3RvX251bWJlci5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9tb2wtcHJvdG8vbGliL3Byb3RvX29iamVjdC5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9tb2wtcHJvdG8vbGliL3Byb3RvX3Byb3RvdHlwZS5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9tb2wtcHJvdG8vbGliL3Byb3RvX3N0cmluZy5qcyIsIi9Vc2Vycy9qYXNvbmlhbmdyZWVuL3dvcmsvQ0MvbWlsby9ub2RlX21vZHVsZXMvbWlsby1jb3JlL25vZGVfbW9kdWxlcy9tb2wtcHJvdG8vbGliL3Byb3RvX3V0aWwuanMiLCIvVXNlcnMvamFzb25pYW5ncmVlbi93b3JrL0NDL21pbG8vbm9kZV9tb2R1bGVzL21pbG8tY29yZS9ub2RlX21vZHVsZXMvbW9sLXByb3RvL2xpYi91dGlscy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdE1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3g1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdHFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDblBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9tQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdFZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6cUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcFVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4YkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbk1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbE5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdnBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDek9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbk9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdlNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdFhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL01BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeE9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdllBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3puQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuXG52YXIgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZhY2V0O1xuXG5cbi8qKlxuICogYG1pbG8uY2xhc3Nlcy5GYWNldGBcbiAqIEJhc2UgRmFjZXQgY2xhc3MgaXMgYW4gYW5jZXN0b3Igb2YgW0NvbXBvbmVudEZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXQuanMuaHRtbCkgY2xhc3MsIHRoZSBtYWluIGJ1aWxkaW5nIGJsb2NrIGluIG1pbG8uXG4gKiBcbiAqIEBwYXJhbSB7RmFjZXRlZE9iamVjdH0gb3duZXIgYW4gaW5zdGFuY2Ugb2YgRmFjZXRlZE9iamVjdCBzdWJjbGFzcyB0aGF0IHN0b3JlcyB0aGUgZmFjZXQgb24gaXRzIHByb3BlcnR5ICB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgYG5hbWVgIHByb3BlcnR5IG9mIGZhY2V0XG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIG9wdGlvbmFsIGZhY2V0IGNvbmZpZ3VyYXRpb24sIHVzZWQgaW4gc3ViY2xhc3Nlc1xuICovXG5mdW5jdGlvbiBGYWNldChvd25lciwgY29uZmlnKSB7XG4gICAgdGhpcy5uYW1lID0gXy5maXJzdExvd2VyQ2FzZSh0aGlzLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIHRoaXMub3duZXIgPSBvd25lcjtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgICB0aGlzLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG4vKipcbiAqIGBpbml0YCBtZXRob2Qgb2Ygc3ViY2xhc3Mgd2lsbCBiZSBjYWxsZWQgYnkgRmFjZXQgY29uc3RydWN0b3IuXG4gKi9cbl8uZXh0ZW5kUHJvdG8oRmFjZXQsIHtcbiAgICBpbml0OiBmdW5jdGlvbigpIHt9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgRmFjZXQgPSByZXF1aXJlKCcuL2ZhY2V0JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZhY2V0ZWRPYmplY3Q7XG5cblxuLyoqXG4gKiBgbWlsby5jbGFzc2VzLkZhY2V0ZWRPYmplY3RgXG4gKiBDb21wb25lbnQgY2xhc3MgaXMgYmFzZWQgb24gYW4gYWJzdHJhY3QgYGBgRmFjZXRlZE9iamVjdGBgYCBjbGFzcy4gVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBpbiBhbnkgc2l0dWF0aW9uIHdoZXJlIG9iamVjdHMgY2FuIGJlIHJlcHJlc2VudGVkIHZpYSBjb2xsZWN0aW9uIG9mIGZhY2V0cyAoYSBmYWNldCBpcyBhbiBvYmplY3Qgb2YgYSBjZXJ0YWluIGNsYXNzLCBpdCBob2xkcyBpdHMgb3duIGNvbmZpZ3VyYXRpb24sIGRhdGEgYW5kIG1ldGhvZHMpLlxuICogSW4gYSB3YXksIFwiZmFjZXRzIHBhdHRlcm5cIiBpcyBhbiBpbnZlcnNpb24gb2YgXCJhZGFwdGVyIHBhdHRlcm5cIiAtIHdoaWxlIHRoZSBsYXR0ZXIgYWxsb3dzIGZpbmRpbmcgYSBjbGFzcy9tZXRob2RzIHRoYXQgaGFzIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHksIGZhY2V0ZWQgb2JqZWN0IGlzIHNpbXBseSBjb25zdHJ1Y3RlZCB0byBoYXZlIHRoZXNlIGZ1bmN0aW9uYWxpdGllcy5cbiAqIFdpdGggdGhpcyBhcmNoaXRlY3R1cmUgaXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIGEgdmlydHVhbGx5IHVubGltaXRlZCBudW1iZXIgb2YgY29tcG9uZW50IGNsYXNzZXMgd2l0aCBhIHZlcnkgbGltaXRlZCBudW1iZXIgb2YgYnVpbGRpbmcgYmxvY2tzIHdpdGhvdXQgaGF2aW5nIGFueSBoaWVyYXJjaHkgb2YgY2xhc3NlcyAtIGFsbCBjb21wb25lbnRzIGluaGVyaXQgZGlyZWN0bHkgZnJvbSBDb21wb25lbnQgY2xhc3MuXG4gKlxuICogVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYmUgY2FsbGVkIGJ5IGFsbCBzdWJjbGFzc2VzIGNvbnN0cnVjdG9yIChpdCB3aWxsIGhhcHBlbiBhdXRvbWF0aWNhbGx5IGlmIGEgc3ViY2xhc3MgaXMgY3JlYXRlZCB3aXRoIGBfLmNyZWF0ZVN1YmNsYXNzYCkuXG4gKlxuICogQHJldHVybiB7RmFjZXRlZE9iamVjdH1cbiAqL1xuZnVuY3Rpb24gRmFjZXRlZE9iamVjdCgpIHtcbiAgICAvLyB0aGlzLmZhY2V0c0NvbmZpZyBhbmQgdGhpcy5mYWNldHNDbGFzc2VzIHdlcmUgc3RvcmVkIG9uIGEgc3BlY2lmaWMgY2xhc3MgcHJvdG90eXBlXG4gICAgLy8gd2hlbiB0aGUgY2xhc3Mgd2FzIGNyZWF0ZWQgYnkgRmFjZXRlZE9iamVjdC5jcmVhdGVGYWNldGVkQ2xhc3NcbiAgICB2YXIgZmFjZXRzQ29uZmlnID0gdGhpcy5mYWNldHNDb25maWcgfHwge307XG5cbiAgICB2YXIgZmFjZXRzRGVzY3JpcHRvcnMgPSB7fVxuICAgICAgICAsIGZhY2V0cyA9IHt9O1xuXG4gICAgLy8gRmFjZXRlZE9iamVjdCBjbGFzcyBpdHNlbGYgaXMgbm90IG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZCAtIGl0IGhhcyBubyBmYWNldHNcbiAgICAvLyBJdCBtYXkgY2hhbmdlLCBhcyBhZGRpbmcgZmFjZXRzIGlzIHBvc3NpYmxlIHRvIGluc3RhbmNlc1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09IEZhY2V0ZWRPYmplY3QpICAgICAgXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmFjZXRlZE9iamVjdCBpcyBhbiBhYnN0cmFjdCBjbGFzcywgY2FuXFwndCBiZSBpbnN0YW50aWF0ZWQnKTtcblxuICAgIC8vIGluc3RhbnRpYXRlIGNsYXNzIGZhY2V0c1xuICAgIGlmICh0aGlzLmZhY2V0c0NsYXNzZXMpXG4gICAgICAgIF8uZWFjaEtleSh0aGlzLmZhY2V0c0NsYXNzZXMsIGluc3RhbnRpYXRlRmFjZXQsIHRoaXMsIHRydWUpO1xuXG4gICAgLy8gYWRkIGZhY2V0cyB0byB0aGUgY2xhc3MgYXMgcHJvcGVydGllcyB1bmRlciB0aGVpciBvd24gbmFtZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIGZhY2V0c0Rlc2NyaXB0b3JzKTtcblxuICAgIC8vIHN0b3JlIGFsbCBmYWNldHMgb24gYGZhY2V0c2AgcHJvcGVydHkgc28gdGhhdCB0aGV5IGNhbiBiZSBlbnVtZXJhdGVkXG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZmFjZXRzJywgZmFjZXRzKTsgICBcblxuICAgIC8vIGNhbGwgYGluaXRgbWV0aG9kIGlmIGl0IGlzIGRlZmluZWQgaW4gc3ViY2xhc3NcbiAgICBpZiAodGhpcy5pbml0KVxuICAgICAgICB0aGlzLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIC8vIGluc3RhbnRpYXRlIGZhY2V0IHdpdGggYSBnaXZlbiBjbGFzcyAoRmFjZXRDbGFzcykgYW5kIG5hbWUgKGZhY2V0TmFtZSlcbiAgICBmdW5jdGlvbiBpbnN0YW50aWF0ZUZhY2V0KEZhY2V0Q2xhc3MsIGZhY2V0TmFtZSkge1xuICAgICAgICAvLyBnZXQgZmFjZXQgY29uZmlndXJhdGlvblxuICAgICAgICB2YXIgZmN0Q29uZmlnID0gZmFjZXRzQ29uZmlnW2ZhY2V0TmFtZV07XG5cbiAgICAgICAgLy8gaW5zdGF0aWF0ZSBmYWNldHNcbiAgICAgICAgZmFjZXRzW2ZhY2V0TmFtZV0gPSBuZXcgRmFjZXRDbGFzcyh0aGlzLCBmY3RDb25maWcpO1xuXG4gICAgICAgIC8vIGFkZCBmYWNldCB0byBwcm9wZXJ0eSBkZXNjcmlwdG9yc1xuICAgICAgICBmYWNldHNEZXNjcmlwdG9yc1tmYWNldE5hbWVdID0ge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBmYWNldHNbZmFjZXROYW1lXVxuICAgICAgICB9O1xuICAgIH1cbn1cblxuXG4vKipcbiAqICMjIyNGYWNldGVkT2JqZWN0IGNsYXNzIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbY3JlYXRlRmFjZXRlZENsYXNzXSgjRmFjZXRlZE9iamVjdCQkY3JlYXRlRmFjZXRlZENsYXNzKVxuICogLSBbaGFzRmFjZXRdKCNGYWNldGVkT2JqZWN0JCRoYXNGYWNldClcbiAqL1xuXy5leHRlbmQoRmFjZXRlZE9iamVjdCwge1xuICAgIGNyZWF0ZUZhY2V0ZWRDbGFzczogRmFjZXRlZE9iamVjdCQkY3JlYXRlRmFjZXRlZENsYXNzLFxuICAgIGhhc0ZhY2V0OiBGYWNldGVkT2JqZWN0JCRoYXNGYWNldCxcbiAgICBnZXRGYWNldENvbmZpZzogRmFjZXRlZE9iamVjdCQkZ2V0RmFjZXRDb25maWdcbn0pO1xuXG5cbi8qKlxuICogIyMjI0ZhY2V0ZWRPYmplY3QgaW5zdGFuY2UgbWV0aG9kcyMjIyNcbiAqXG4gKiAtIFthZGRGYWNldF0oI0ZhY2V0ZWRPYmplY3QkYWRkRmFjZXQpXG4gKi9cbl8uZXh0ZW5kUHJvdG8oRmFjZXRlZE9iamVjdCwge1xuICAgIGFkZEZhY2V0OiBGYWNldGVkT2JqZWN0JGFkZEZhY2V0XG59KTtcblxuXG4vKipcbiAqIEZhY2V0ZWRPYmplY3QgaW5zdGFuY2UgbWV0aG9kLlxuICogQWRkcyBhIGZhY2V0IHRvIHRoZSBpbnN0YW5jZSBvZiBGYWNldGVkT2JqZWN0IHN1YmNsYXNzLlxuICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjZXQgdGhhdCB3YXMgY3JlYXRlZC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBGYWNldENsYXNzIGZhY2V0IGNsYXNzIGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gZmFjZXRDb25maWcgb3B0aW9uYWwgZmFjZXQgY29uZmlndXJhdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IGZhY2V0TmFtZSBvcHRpb25hbCBmYWNldCBuYW1lLCBGYWNldENsYXNzLm5hbWUgd2lsbCBiZSB1c2VkIGlmIGZhY2V0TmFtZSBpcyBub3QgcGFzc2VkLlxuICogQHBhcmFtIHtCb29sZWFufSB0aHJvd09uRXJyb3JzIElmIHNldCB0byBmYWxzZSwgdGhlbiBlcnJvcnMgd2lsbCBvbmx5IGJlIGxvZ2dlZCB0byBjb25zb2xlLiBUcnVlIGJ5IGRlZmF1bHQuXG4gKiBAcmV0dXJuIHtGYWNldH1cbiAqL1xuZnVuY3Rpb24gRmFjZXRlZE9iamVjdCRhZGRGYWNldChGYWNldENsYXNzLCBmYWNldENvbmZpZywgZmFjZXROYW1lLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgY2hlY2soRmFjZXRDbGFzcywgRnVuY3Rpb24pO1xuICAgIGNoZWNrKGZhY2V0TmFtZSwgTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSk7XG5cbiAgICAvLyBmaXJzdCBsZXR0ZXIgb2YgZmFjZXQgbmFtZSBzaG91bGQgYmUgbG93ZXJjYXNlXG4gICAgZmFjZXROYW1lID0gXy5maXJzdExvd2VyQ2FzZShmYWNldE5hbWUgfHwgRmFjZXRDbGFzcy5uYW1lKTtcblxuICAgIC8vIGdldCBmYWNldHMgZGVmaW5lZCBpbiBjbGFzc1xuICAgIHZhciBwcm90b0ZhY2V0cyA9IHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmZhY2V0c0NsYXNzZXM7XG5cbiAgICAvLyBjaGVjayB0aGF0IHRoaXMgZmFjZXROYW1lIHdhcyBub3QgYWxyZWFkeSB1c2VkIGluIHRoZSBjbGFzc1xuICAgIGlmIChwcm90b0ZhY2V0cyAmJiBwcm90b0ZhY2V0c1tmYWNldE5hbWVdKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhY2V0ICcgKyBmYWNldE5hbWUgKyAnIGlzIGFscmVhZHkgcGFydCBvZiB0aGUgY2xhc3MgJyArIHRoaXMuY29uc3RydWN0b3IubmFtZSk7XG5cbiAgICAvLyBjaGVjayB0aGF0IHRoaXMgZmFjZU5hbWUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBvbiB0aGUgZmFjZXRlZCBvYmplY3RcbiAgICBpZiAodGhpc1tmYWNldE5hbWVdKSB7XG4gICAgICAgIHZhciBtZXNzYWdlID0gJ2ZhY2V0ICcgKyBmYWNldE5hbWUgKyAnIGlzIGFscmVhZHkgcHJlc2VudCBpbiBvYmplY3QnO1xuICAgICAgICBpZiAodGhyb3dPbkVycm9ycyA9PT0gZmFsc2UpXG4gICAgICAgICAgICByZXR1cm4gbG9nZ2VyLmVycm9yKCdGYWNldGVkT2JqZWN0IGFkZEZhY2V0OiAnLCBtZXNzYWdlKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8vIGluc3RhbnRpYXRlIHRoZSBmYWNldFxuICAgIHZhciBuZXdGYWNldCA9IHRoaXMuZmFjZXRzW2ZhY2V0TmFtZV0gPSBuZXcgRmFjZXRDbGFzcyh0aGlzLCBmYWNldENvbmZpZyk7XG5cbiAgICAvLyBhZGQgZmFjZXQgdG8gZmFjZXRlZCBvYmplY3RcbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsIGZhY2V0TmFtZSwgbmV3RmFjZXQsIF8uRU5VTSk7XG5cbiAgICByZXR1cm4gbmV3RmFjZXQ7XG59XG5cblxuLyoqXG4gKiBGYWNldGVkT2JqZWN0IGNsYXNzIG1ldGhvZFxuICogUmV0dXJucyByZWZlcmVuY2UgdG8gdGhlIGZhY2V0IGNsYXNzIGlmIHRoZSBmYWNldCB3aXRoIGBmYWNldE5hbWVgIGlzIHBhcnQgb2YgdGhlIGNsYXNzLCBgdW5kZWZpbmVkYCBvdGhlcndpc2UuIElmIHN1YmNsYXNzIGlzIGNyZWF0ZWQgdXNpbmcgXy5jcmVhdGVTdWJjbGFzcyAoYXMgaXQgc2hvdWxkIGJlKSBpdCB3aWxsIGFsc28gaGF2ZSB0aGlzIG1ldGhvZC5cbiAqIFxuICogQHBhcmFtIHtTdWJjbGFzcyhGYWNldGVkT2JqZWN0KX0gdGhpcyB0aGlzIGluIHRoaXMgbWV0aG9kIHJlZmVycyB0byBGYWNldGVkT2JqZWN0IChvciBpdHMgc3ViY2xhc3MpIHRoYXQgY2FsbHMgdGhpcyBtZXRob2RcbiAqIEBwYXJhbSB7U3RyaW5nfSBmYWNldE5hbWVcbiAqIEByZXR1cm4ge1N1YmNsYXNzKEZhY2V0KXx1bmRlZmluZWR9IFxuICovXG5mdW5jdGlvbiBGYWNldGVkT2JqZWN0JCRoYXNGYWNldChmYWNldE5hbWUpIHtcbiAgICAvLyB0aGlzIHJlZmVycyB0byB0aGUgRmFjZXRlZE9iamVjdCBjbGFzcyAob3Igc3ViY2xhc3MpLCBub3QgaW5zdGFuY2VcbiAgICB2YXIgcHJvdG9GYWNldHMgPSB0aGlzLnByb3RvdHlwZS5mYWNldHNDbGFzc2VzO1xuICAgIHJldHVybiBwcm90b0ZhY2V0cyAmJiBwcm90b0ZhY2V0c1tmYWNldE5hbWVdO1xufVxuXG4vKipcbiAqIEZhY2V0ZWRPYmplY3QgY2xhc3MgbWV0aG9kXG4gKiBSZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBmYWNldFxuICogQHBhcmFtIHtTdHJpbmd9IGZhY2V0TmFtZSB0aGUgZmFjZXQgd2hpY2ggY29uZmlnIHNob3VsZCBiZSByZXRyaWV2ZWRcbiAqIEByZXR1cm4ge09iamVjdH0gdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgd2FzIHBhc3NlZCB0byB0aGUgZmFjZXRcbiAqL1xuZnVuY3Rpb24gRmFjZXRlZE9iamVjdCQkZ2V0RmFjZXRDb25maWcoZmFjZXROYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRmFjZXQoZmFjZXROYW1lKSA/IHRoaXMucHJvdG90eXBlLmZhY2V0c0NvbmZpZ1tmYWNldE5hbWVdIDogbnVsbDtcbn1cblxuXG4vKipcbiAqIEZhY2V0ZWRPYmplY3QgY2xhc3MgbWV0aG9kXG4gKiBDbGFzcyBmYWN0b3J5IHRoYXQgY3JlYXRlcyBjbGFzc2VzIChjb25zdHJ1Y3RvciBmdW5jdGlvbnMpIGZyb20gdGhlIG1hcHMgb2YgZmFjZXRzIGFuZCB0aGVpciBjb25maWd1cmF0aW9ucy5cbiAqIENyZWF0ZWQgY2xhc3Mgd2lsbCBiZSBzdWJjbGFzcyBvZiBgRmFjZXRlZE9iamVjdGAuXG4gKlxuICogQHBhcmFtIHtTdWJjbGFzcyhGYWNldGVkT2JqZWN0KX0gdGhpcyB0aGlzIGluIHRoaXMgbWV0aG9kIHJlZmVycyB0byBGYWNldGVkT2JqZWN0IChvciBpdHMgc3ViY2xhc3MpIHRoYXQgY2FsbHMgdGhpcyBtZXRob2RcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIGNsYXNzIG5hbWUgKHdpbGwgYmUgZnVuY3Rpb24gbmFtZSBvZiBjbGFzcyBjb25zdHJ1Y3RvciBmdW5jdGlvbilcbiAqIEBwYXJhbSB7T2JqZWN0W1N1YmNsYXNzKEZhY2V0KV19IGZhY2V0c0NsYXNzZXMgbWFwIG9mIGNsYXNzZXMgb2YgZmFjZXRzIHRoYXQgd2lsbCBjb25zdGl0dXRlIHRoZSBjcmVhdGVkIGNsYXNzXG4gKiBAcGFyYW0ge09iamVjdFtPYmplY3RdfSBmYWNldHNDb25maWcgbWFwIG9mIGZhY2V0cyBjb25maWd1cmF0aW9uLCBzaG91bGQgaGF2ZSB0aGUgc2FtZSBrZXlzIGFzIHRoZSBtYXAgb2YgY2xhc3Nlcy4gU29tZSBmYWNldHMgbWF5IG5vdCBoYXZlIGNvbmZpZ3VyYXRpb24sIGJ1dCB0aGUgY29uZmlndXJhdGlvbiBmb3IgYSBmYWNldCB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiBmYWNldHNDbGFzc2VzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uXG4gKiBAcmV0dXJuIHtTdWJjbGFzcyhGYWNldGVkT2JqZWN0KX1cbiAqL1xuZnVuY3Rpb24gRmFjZXRlZE9iamVjdCQkY3JlYXRlRmFjZXRlZENsYXNzKG5hbWUsIGZhY2V0c0NsYXNzZXMsIGZhY2V0c0NvbmZpZykge1xuICAgIGNoZWNrKG5hbWUsIFN0cmluZyk7XG4gICAgY2hlY2soZmFjZXRzQ2xhc3NlcywgTWF0Y2guT3B0aW9uYWwoTWF0Y2guT2JqZWN0SGFzaChNYXRjaC5TdWJjbGFzcyhGYWNldCwgdHJ1ZSkpKSk7XG4gICAgY2hlY2soZmFjZXRzQ29uZmlnLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKTtcblxuICAgIC8vIHRocm93IGV4Y2VwdGlvbiBpZiBjb25maWcgcGFzc2VkIGZvciBmYWNldCBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gY2xhc3NcbiAgICBpZiAoZmFjZXRzQ29uZmlnKVxuICAgICAgICBfLmVhY2hLZXkoZmFjZXRzQ29uZmlnLCBmdW5jdGlvbihmY3RDb25maWcsIGZjdE5hbWUpIHtcbiAgICAgICAgICAgIGlmICghIGZhY2V0c0NsYXNzZXMuaGFzT3duUHJvcGVydHkoZmN0TmFtZSkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb25maWd1cmF0aW9uIGZvciBmYWNldCAoJyArIGZjdE5hbWUgKyAnKSBwYXNzZWQgdGhhdCBpcyBub3QgaW4gY2xhc3MnKTtcbiAgICAgICAgfSk7XG5cbiAgICAvLyBjcmVhdGUgc3ViY2xhc3Mgb2YgdGhlIGN1cnJlbnQgY2xhc3MgKHRoaXMgcmVmZXJzIHRvIHRoZSBjbGFzcyB0aGF0IGNhbGxzIHRoaXMgbWV0aG9kKVxuICAgIHZhciBGYWNldGVkQ2xhc3MgPSBfLmNyZWF0ZVN1YmNsYXNzKHRoaXMsIG5hbWUsIHRydWUpO1xuXG4gICAgLy8gZ2V0IGZhY2V0cyBjbGFzc2VzIGFuZCBjb25maWd1cmF0aW9ucyBmcm9tIHBhcmVudCBjbGFzc1xuICAgIGZhY2V0c0NsYXNzZXMgPSBhZGRJbmhlcml0ZWRGYWNldHModGhpcywgZmFjZXRzQ2xhc3NlcywgJ2ZhY2V0c0NsYXNzZXMnKTtcbiAgICBmYWNldHNDb25maWcgPSBhZGRJbmhlcml0ZWRGYWNldHModGhpcywgZmFjZXRzQ29uZmlnLCAnZmFjZXRzQ29uZmlnJyk7XG5cbiAgICAvLyBzdG9yZSBmYWNldHMgY2xhc3NlcyBhbmQgY29uZmlndXJhdGlvbnMgb2YgY2xhc3MgcHJvdG90eXBlXG4gICAgXy5leHRlbmRQcm90byhGYWNldGVkQ2xhc3MsIHtcbiAgICAgICAgZmFjZXRzQ2xhc3NlczogZmFjZXRzQ2xhc3NlcyxcbiAgICAgICAgZmFjZXRzQ29uZmlnOiBmYWNldHNDb25maWdcbiAgICB9KTtcblxuICAgIHJldHVybiBGYWNldGVkQ2xhc3M7XG5cblxuICAgIGZ1bmN0aW9uIGFkZEluaGVyaXRlZEZhY2V0cyhzdXBlckNsYXNzLCBmYWNldHNJbmZvLCBmYWNldHNJbmZvTmFtZSkge1xuICAgICAgICB2YXIgaW5oZXJpdGVkRmFjZXRzSW5mbyA9IHN1cGVyQ2xhc3MucHJvdG90eXBlW2ZhY2V0c0luZm9OYW1lXTtcbiAgICAgICAgaWYgKGluaGVyaXRlZEZhY2V0c0luZm8pXG4gICAgICAgICAgICByZXR1cm4gXyhpbmhlcml0ZWRGYWNldHNJbmZvKVxuICAgICAgICAgICAgICAgICAgICAuY2xvbmUoKVxuICAgICAgICAgICAgICAgICAgICAuZXh0ZW5kKGZhY2V0c0luZm8gfHwge30pLl8oKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIGZhY2V0c0luZm87XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENsYXNzUmVnaXN0cnk7XG5cblxuLyoqXG4gKiBgbWlsby5jbGFzc2VzLkNsYXNzUmVnaXN0cnlgIC0gdGhlIHJlZ2lzdHJ5IG9mIGNsYXNzZXMgY2xhc3MuXG4gKiBDb21wb25lbnRzIGFuZCBGYWNldHMgcmVnaXN0ZXIgdGhlbXNlbHZlcyBpbiByZWdpc3RyaWVzLiBJdCBhbGxvd3MgdG8gYXZvaWQgcmVxdWlyaW5nIHRoZW0gZnJvbSBvbmUgbW9kdWxlIGFuZCBwcmV2ZW50cyBjaXJjdWxhciBkZXBlbmRlbmNpZXMgYmV0d2VlbiBtb2R1bGVzLlxuICogXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBGb3VuZGF0aW9uQ2xhc3MgQWxsIGNsYXNzZXMgdGhhdCBhcmUgcmVnaXN0ZXJlZCBpbiB0aGUgcmVnaXN0cnkgc2hvdWxkIGJlIHN1YmNsYXNzZXMgb2YgdGhlIEZvdW5kYXRpb25DbGFzc1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBDbGFzc1JlZ2lzdHJ5IChGb3VuZGF0aW9uQ2xhc3MpIHtcbiAgICBpZiAoRm91bmRhdGlvbkNsYXNzKVxuICAgICAgICB0aGlzLnNldENsYXNzKEZvdW5kYXRpb25DbGFzcyk7XG5cbiAgICB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXMgPSB7fTtcbn1cblxuXG4vKipcbiAqICMjIyNDbGFzc1JlZ2lzdHJ5IGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbYWRkXSgjYWRkKVxuICogLSBbZ2V0XSgjZ2V0KVxuICogLSBbcmVtb3ZlXSgjcmVtb3ZlKVxuICogLSBbY2xlYW5dKCNjbGVhbilcbiAqIC0gW3NldENsYXNzXSgjc2V0Q2xhc3MpXG4gKi9cbl8uZXh0ZW5kUHJvdG8oQ2xhc3NSZWdpc3RyeSwge1xuICAgIGFkZDogYWRkLFxuICAgIGdldDogZ2V0LFxuICAgIHJlbW92ZTogcmVtb3ZlLFxuICAgIGNsZWFuOiBjbGVhbixcbiAgICBzZXRDbGFzczogc2V0Q2xhc3Ncbn0pO1xuXG5cbi8qKlxuICogQ2xhc3NSZWdpc3RyeSBpbnN0YW5jZSBtZXRob2QgdGhhdCByZWdpc3RlcnMgYSBjbGFzcyBpbiB0aGUgcmVnaXN0cnkuXG4gKiBUaGUgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGEgY2xhc3MgaXMgcmVnaXN0ZXJlZCB1bmRlciB0aGUgc2FtZSBuYW1lIGFzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBjbGFzcy5cbiAqIFRoZSBtZXRob2QgYWxsb3dzIHJlZ2lzdGVyaW5nIHRoZSBzYW1lIGNsYXNzIHVuZGVyIGEgZGlmZmVyZW50IG5hbWUsIHNvIGNsYXNzIGFsaWFzZXMgY2FuIGJlIGNyZWF0ZWQuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gYUNsYXNzIGNsYXNzIHRvIHJlZ2lzdGVyIGluIHRoZSByZWdpc3RyeS4gU2hvdWxkIGJlIHN1YmNsYXNzIG9mIGB0aGlzLkZvdW5kYXRpb25DbGFzc2AuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBPcHRpb25hbCBjbGFzcyBuYW1lLiBJZiBjbGFzcyBuYW1lIGlzIG5vdCBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgdGFrZW4gZnJvbSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBuYW1lLiBDbGFzcyBuYW1lIHNob3VsZCBiZSBhIHZhbGlkIGlkZW50aWZpZXIgYW5kIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGFkZChhQ2xhc3MsIG5hbWUpIHtcbiAgICBuYW1lID0gbmFtZSB8fCBhQ2xhc3MubmFtZTtcblxuICAgIGNoZWNrKG5hbWUsIE1hdGNoLklkZW50aWZpZXJTdHJpbmcsICdjbGFzcyBuYW1lIG11c3QgYmUgaWRlbnRpZmllciBzdHJpbmcnKTtcblxuICAgIGlmICh0aGlzLkZvdW5kYXRpb25DbGFzcykge1xuICAgICAgICBpZiAoYUNsYXNzICE9IHRoaXMuRm91bmRhdGlvbkNsYXNzKVxuICAgICAgICAgICAgY2hlY2soYUNsYXNzLCBNYXRjaC5TdWJjbGFzcyh0aGlzLkZvdW5kYXRpb25DbGFzcyksICdjbGFzcyBtdXN0IGJlIGEgc3ViKGNsYXNzKSBvZiBhIGZvdW5kYXRpb24gY2xhc3MnKTtcbiAgICB9IGVsc2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmb3VuZGF0aW9uIGNsYXNzIG11c3QgYmUgc2V0IGJlZm9yZSBhZGRpbmcgY2xhc3NlcyB0byByZWdpc3RyeScpO1xuXG4gICAgaWYgKHRoaXMuX19yZWdpc3RlcmVkQ2xhc3Nlc1tuYW1lXSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjbGFzcyBcIicgKyBuYW1lICsgJ1wiIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCcpO1xuXG4gICAgdGhpcy5fX3JlZ2lzdGVyZWRDbGFzc2VzW25hbWVdID0gYUNsYXNzO1xufTtcblxuXG4vKipcbiAqIEdldHMgY2xhc3MgZnJvbSByZWdpc3RyeSBieSBuYW1lXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgQ2xhc3MgbmFtZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGdldChuYW1lKSB7XG4gICAgY2hlY2sobmFtZSwgU3RyaW5nLCAnY2xhc3MgbmFtZSBtdXN0IGJlIHN0cmluZycpO1xuICAgIHJldHVybiB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXNbbmFtZV07XG59O1xuXG5cbi8qKlxuICogUmVtb3ZlIGNsYXNzIGZyb20gcmVnaXN0cnkgYnkgaXRzIG5hbWUuXG4gKiBJZiBjbGFzcyBpcyBub3QgcmVnaXN0ZXJlZCwgdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uXG4gKiBcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBuYW1lT3JDbGFzcyBDbGFzcyBuYW1lLiBJZiBjbGFzcyBjb25zdHJ1Y3RvciBpcyBzdXBwbGllZCwgaXRzIG5hbWUgd2lsbCBiZSB1c2VkLlxuICovXG5mdW5jdGlvbiByZW1vdmUobmFtZU9yQ2xhc3MpIHtcbiAgICBjaGVjayhuYW1lT3JDbGFzcywgTWF0Y2guT25lT2YoU3RyaW5nLCBGdW5jdGlvbiksICdjbGFzcyBvciBuYW1lIG11c3QgYmUgc3VwcGxpZWQnKTtcblxuICAgIHZhciBuYW1lID0gdHlwZW9mIG5hbWVPckNsYXNzID09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG5hbWVPckNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG5hbWVPckNsYXNzLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICBpZiAoISB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXNbbmFtZV0pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2xhc3MgaXMgbm90IHJlZ2lzdGVyZWQnKTtcblxuICAgIGRlbGV0ZSB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXNbbmFtZV07XG59O1xuXG5cbi8qKlxuICogUmVtb3ZlcyBhbGwgY2xhc3NlcyBmcm9tIHJlZ2lzdHJ5LlxuICovXG5mdW5jdGlvbiBjbGVhbigpIHtcbiAgICB0aGlzLl9fcmVnaXN0ZXJlZENsYXNzZXMgPSB7fTtcbn07XG5cblxuLyoqXG4gKiBTZXRzIGBGb3VuZGF0aW9uQ2xhc3NgIG9mIHRoZSByZWdpc3RyeS4gSXQgc2hvdWxkIGJlIHNldCBiZWZvcmUgYW55IGNsYXNzIGNhbiBiZSBhZGRlZC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBGb3VuZGF0aW9uQ2xhc3MgQW55IGNsYXNzIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgcmVnaXN0cnkgc2hvdWxkIGJlIGEgc3ViY2xhc3Mgb2YgdGhpcyBjbGFzcy4gRm91bmRhdGlvbkNsYXNzIGl0c2VsZiBjYW4gYmUgYWRkZWQgdG8gdGhlIHJlZ2lzdHJ5IHRvby5cbiAqL1xuZnVuY3Rpb24gc2V0Q2xhc3MoRm91bmRhdGlvbkNsYXNzKSB7XG4gICAgY2hlY2soRm91bmRhdGlvbkNsYXNzLCBGdW5jdGlvbik7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnRm91bmRhdGlvbkNsYXNzJywgRm91bmRhdGlvbkNsYXNzLCBfLkVOVU0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQXR0cmlidXRlID0gcmVxdWlyZSgnLi9hX2NsYXNzJylcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxuXG52YXIgQVRUUklCVVRFX1JFR0VYUD0gL14oW15cXDpcXFtcXF1dKikoPzpcXFsoW15cXDpcXFtcXF1dKilcXF0pP1xcOj8oW146XSopJC9cbiAgICAsIEZBQ0VUU19TUExJVF9SRUdFWFAgPSAvXFxzKig/OlxcLHxcXHMpXFxzKi9cbiAgICAsIEFUVFJJQlVURV9URU1QTEFURSA9ICclY29tcENsYXNzJWNvbXBGYWNldHM6JWNvbXBOYW1lJztcblxuXG4vKipcbiAqIGBtaWxvLmF0dHJpYnV0ZXMuYmluZGBcbiAqIEJpbmRBdHRyaWJ1dGUgY2xhc3MgcGFyc2VzL3ZhbGlkYXRlcy9ldGMuIGFuIGF0dHJpYnV0ZSB0aGF0IGJpbmRzIERPTSBlbGVtZW50cyB0byBtaWxvIGNvbXBvbmVudHMuXG4gKiBQb3NzaWJsZSBhdHRyaWJ1dGUgdmFsdWVzIGFyZTpcbiAqXG4gKiAtIGA6bXlWaWV3YCAtIG9ubHkgY29tcG9uZW50IG5hbWVcbiAqIC0gYFZpZXc6bXlWaWV3YCAtIGNsYXNzIGFuZCBjb21wb25lbnQgbmFtZVxuICogLSBgW0V2ZW50cywgRGF0YV06bXlWaWV3YCAtIGZhY2V0cyBhbmQgY29tcG9uZW50IG5hbWVcbiAqIC0gYFZpZXdbRXZlbnRzXTpteVZpZXdgIC0gY2xhc3MsIGZhY2V0KHMpIGFuZCBjb21wb25lbnQgbmFtZVxuICpcbiAqIFNlZSBbYmluZGVyXSguLi9iaW5kZXIuanMuaHRtbCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKi9cbnZhciBCaW5kQXR0cmlidXRlID0gXy5jcmVhdGVTdWJjbGFzcyhBdHRyaWJ1dGUsICdCaW5kQXR0cmlidXRlJywgdHJ1ZSk7XG5cblxuLyoqXG4gKiAjIyMjQmluZEF0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2F0dHJOYW1lXSgjYXR0ck5hbWUpXG4gKiAtIFtwYXJzZV0oI3BhcnNlKVxuICogLSBbdmFsaWRhdGVdKCN2YWxpZGF0ZSlcbiAqIC0gW3JlbmRlcl0oI3JlbmRlcilcbiAqL1xuXy5leHRlbmRQcm90byhCaW5kQXR0cmlidXRlLCB7XG4gICAgYXR0ck5hbWU6IGF0dHJOYW1lLFxuICAgIHBhcnNlOiBwYXJzZSxcbiAgICB2YWxpZGF0ZTogdmFsaWRhdGUsXG4gICAgcmVuZGVyOiByZW5kZXJcbn0pO1xuXG5cbi8qKlxuICogQmluZEF0dHJpYnV0ZSBjbGFzcyBtZXRob2RzXG4gKlxuICogLSBbc2V0SW5mb10oI0JpbmRBdHRyaWJ1dGUkJHNldEluZm8pXG4gKi9cbl8uZXh0ZW5kKEJpbmRBdHRyaWJ1dGUsIHtcbiAgICBzZXRJbmZvOiBCaW5kQXR0cmlidXRlJCRzZXRJbmZvXG59KTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IEJpbmRBdHRyaWJ1dGU7XG5cblxuLyoqXG4gKiBCaW5kQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCB0aGF0IHJldHVybnMgYXR0cmlidXRlIG5hbWUsIGJ5IGRlZmF1bHQgLSBgJ21sLWJpbmQnYC5cbiAqIFRvIGNvbmZpZ3VyZSBiaW5kIGF0dHJpYnV0ZSBuYW1lIHVzZTpcbiAqIGBgYFxuICogbWlsby5jb25maWcoeyBhdHRyczogeyBiaW5kOiAnY2MtYmluZCcgfSB9KTsgLy8gd2lsbCBzZXQgYmluZCBhdHRyaWJ1dGUgdG8gJ2NjLWJpbmQnXG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGF0dHJOYW1lKCkge1xuICAgIHJldHVybiBjb25maWcuYXR0cnMuYmluZDtcbn1cblxuXG4vKipcbiAqIEJpbmRBdHRyaWJ1dGUgaW5zdGFuY2UgbWV0aG9kIHRoYXQgcGFyc2VzIGJpbmQgYXR0cmlidXRlIGlmIGl0IGlzIHByZXNlbnQgb24gdGhlIGVsZW1lbnQuXG4gKiBJdCBkZWZpbmVzIHByb3BlcnRpZXMgYGNvbXBDbGFzc2AsIGBjb21wRmFjZXRzYCBhbmQgYGNvbXBOYW1lYCBvbiBCaW5kQXR0cmlidXRlIGluc3RhbmNlLlxuICogUmV0dXJucyB0aGUgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAqXG4gKiBAcmV0dXJuIHtCaW5kQXR0cmlidXRlfVxuICovXG4gZnVuY3Rpb24gcGFyc2UoKSB7XG4gICAgaWYgKCEgdGhpcy5ub2RlKSByZXR1cm47XG5cbiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldCgpO1xuXG4gICAgaWYgKHZhbHVlKVxuICAgICAgICB2YXIgYmluZFRvID0gdmFsdWUubWF0Y2goQVRUUklCVVRFX1JFR0VYUCk7XG5cbiAgICBpZiAoISBiaW5kVG8pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBiaW5kIGF0dHJpYnV0ZSAnICsgdmFsdWUpO1xuXG4gICAgdGhpcy5jb21wQ2xhc3MgPSBiaW5kVG9bMV0gfHwgJ0NvbXBvbmVudCc7XG4gICAgdGhpcy5jb21wRmFjZXRzID0gKGJpbmRUb1syXSAmJiBiaW5kVG9bMl0uc3BsaXQoRkFDRVRTX1NQTElUX1JFR0VYUCkpIHx8IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNvbXBOYW1lID0gYmluZFRvWzNdIHx8IHVuZGVmaW5lZDsgLy8gdW5kZWZpbmVkIGlzIG5vdCBzYW1lIGFzICcnXG5cbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIEJpbmRBdHRyaWJ1dGUgaW5zdGFuY2UgbWV0aG9kIHRoYXQgdmFsaWRhdGVzIGJpbmQgYXR0cmlidXRlLCB0aHJvd3MgaWYgaXQgaGFzIGFuIGludmFsaWQgdmFsdWUuXG4gKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICpcbiAqIEByZXR1cm4ge0JpbmRBdHRyaWJ1dGV9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuICAgIGNoZWNrKHRoaXMuY29tcE5hbWUsIE1hdGNoLklkZW50aWZpZXJTdHJpbmcpO1xuXG4gICAgaWYgKCEgdGhpcy5jb21wQ2xhc3MpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZW1wdHkgY29tcG9uZW50IGNsYXNzIG5hbWUgJyArIHRoaXMuY29tcENsYXNzKTtcblxuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogQmluZEF0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdmFsdWUgZm9yIGdpdmVuIHZhbHVlcyBvZiBwcm9wZXJ0aWVzIGBjb21wQ2xhc3NgLCBgY29tcE5hbWVgIGFuZCBgY29tcEZhY2V0c2AuXG4gKiBJZiBgdGhpcy5jb21wTmFtZWAgaXMgbm90IHNldCBpdCB3aWxsIGJlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHRoaXMuY29tcE5hbWUgPSB0aGlzLmNvbXBOYW1lIHx8IG1pbG8udXRpbC5jb21wb25lbnROYW1lKCk7XG4gICAgcmV0dXJuIEFUVFJJQlVURV9URU1QTEFURVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCclY29tcENsYXNzJywgdGhpcy5jb21wQ2xhc3MgfHwgJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJyVjb21wRmFjZXRzJywgdGhpcy5jb21wRmFjZXRzICYmIHRoaXMuY29tcEZhY2V0cy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnWycgKyB0aGlzLmNvbXBGYWNldHMuam9pbignLCAnKSArICddJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICcnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCclY29tcE5hbWUnLCB0aGlzLmNvbXBOYW1lKTtcbn1cblxuXG4vKipcbiAqIEJpbmRBdHRyaWJ1dGUgY2xhc3MgbWV0aG9kXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKiBAcGFyYW0ge1N0cmluZ30gY29tcG9uZW50Q2xhc3Mgb3B0aW9uYWwgY2xhc3MgbmFtZVxuICogQHBhcmFtIHtTdHJpbmd9IGNvbXBvbmVudE5hbWUgb3B0aW9uYWxcbiAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nPn0gY29tcG9uZW50RmFjZXRzIG9wdGlvbmFsIGV4dHJhIGZhY2V0IHRvIGFkZCB0byB0aGUgY2xhc3NcbiAqL1xuZnVuY3Rpb24gQmluZEF0dHJpYnV0ZSQkc2V0SW5mbyhlbCwgY29tcG9uZW50Q2xhc3MsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudEZhY2V0cykge1xuICAgIHZhciBhdHRyID0gbmV3IEJpbmRBdHRyaWJ1dGUoZWwpO1xuICAgIF8uZXh0ZW5kKGF0dHIsIHtcbiAgICAgICAgY29tcENsYXNzOiBjb21wb25lbnRDbGFzcyxcbiAgICAgICAgY29tcE5hbWU6IGNvbXBvbmVudE5hbWUsXG4gICAgICAgIGNvbXBGYWNldHM6IGNvbXBvbmVudEZhY2V0c1xuICAgIH0pO1xuICAgIGF0dHIuZGVjb3JhdGUoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gQXR0cmlidXRlO1xuXG5cbi8qKlxuICogQW4gYWJzY3RyYWN0IGNsYXNzIGZvciBwYXJzaW5nIGFuZCB2YWxpZGF0aW9uIG9mIGVsZW1lbnQgYXR0cmlidXRlcy5cbiAqIFN1YmNsYXNzZXMgc2hvdWxkIGRlZmluZSBtZXRob2RzIGBhdHRyTmFtZWAsIGBwYXJzZWAsIGB2YWxpZGF0ZWAgYW5kIGByZW5kZXJgLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWwgRE9NIGVsZW1lbnQgd2hlcmUgYXR0cmlidXRlIGlzIGF0dGFjaGVkXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBPcHRpb25hbCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUsIHVzdWFsbHkgc3VwcGxpZWQgYnkgc3ViY2xhc3MgdmlhIGBhdHRyTmFtZWAgbWV0aG9kXG4gKi9cbmZ1bmN0aW9uIEF0dHJpYnV0ZShlbCwgbmFtZSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWUgfHwgdGhpcy5hdHRyTmFtZSgpO1xuICAgIHRoaXMuZWwgPSBlbDtcblxuICAgIC8vIGF0dHJpYnV0ZSBub2RlXG4gICAgdGhpcy5ub2RlID0gZWwuYXR0cmlidXRlc1t0aGlzLm5hbWVdO1xufVxuXG5cbl8uZXh0ZW5kKEF0dHJpYnV0ZSwge1xuICAgIHJlbW92ZTogQXR0cmlidXRlJCRyZW1vdmVcbn0pO1xuXG5cbi8qKlxuICogIyMjI0F0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2dldF0oI0F0dHJpYnV0ZSRnZXQpXG4gKiAtIFtzZXRdKCNBdHRyaWJ1dGUkc2V0KVxuICogLSBbZGVjb3JhdGVdKCNBdHRyaWJ1dGUkZGVjb3JhdGUpXG4gKlxuICogVGhlIGZvbGxvd2luZyBpbnN0YW5jZSBtZXRob2RzIHNob3VsZCBiZSBkZWZpbmVkIGJ5IHN1YmNsYXNzXG4gKlxuICogLSBhdHRyTmFtZSAtIHNob3VsZCByZXR1cm4gYXR0cmlidXRlIG5hbWVcbiAqIC0gcGFyc2UgLSBzaG91bGQgcGFyc2UgYXR0cmlidXRlIHZhbHVlXG4gKiAtIHZhbGlkYXRlIC0gc2hvdWxkIHZhbGlkYXRlIGF0dHJpYnV0ZSB2YWx1ZSwgdGhyb3dpbmcgZXhjZXB0aW9uIGlmIGl0IGlzIGluY29ycmVjdCBcbiAqIC0gcmVuZGVyIC0gc2hvdWxkIHJldHVybiBhdHRyaWJ1dGUgdmFsdWUgZm9yIGEgZ2l2ZW4gYXR0cmlidXRlIHN0YXRlIChvdGhlciBwcm9wZXJ0aWVzLCBhcyBkZWZpbmVkIGluIHN1YmNsYXNzKVxuICovXG5fLmV4dGVuZFByb3RvKEF0dHJpYnV0ZSwge1xuICAgIGdldDogQXR0cmlidXRlJGdldCxcbiAgICBzZXQ6IEF0dHJpYnV0ZSRzZXQsXG4gICAgcmVtb3ZlOiBBdHRyaWJ1dGUkcmVtb3ZlLFxuICAgIGRlY29yYXRlOiBBdHRyaWJ1dGUkZGVjb3JhdGUsXG5cbiAgICBkZXN0cm95OiBBdHRyaWJ1dGUkZGVzdHJveSxcblxuICAgIC8vIHNob3VsZCBiZSBkZWZpbmVkIGluIHN1YmNsYXNzXG4gICAgYXR0ck5hbWU6IHRvQmVJbXBsZW1lbnRlZCxcbiAgICBwYXJzZTogdG9CZUltcGxlbWVudGVkLFxuICAgIHZhbGlkYXRlOiB0b0JlSW1wbGVtZW50ZWQsXG4gICAgcmVuZGVyOiB0b0JlSW1wbGVtZW50ZWRcbn0pO1xuXG5cbmZ1bmN0aW9uIEF0dHJpYnV0ZSQkcmVtb3ZlKGVsLCBkZWVwKSB7XG4gICAgdmFyIG5hbWUgPSB0aGlzLnByb3RvdHlwZS5hdHRyTmFtZSgpO1xuICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcblxuICAgIGlmIChkZWVwKSB7XG4gICAgICAgIHZhciBzZWxlY3RvciA9ICdbJyArIG5hbWUgKyAnXSc7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAgICBfLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkRWwpIHtcbiAgICAgICAgICAgIGNoaWxkRWwucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICB9KVxuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBBdHRyaWJ1dGUkcmVtb3ZlKCkge1xuICAgIGRlbGV0ZSB0aGlzLm5vZGU7XG59XG5cblxuZnVuY3Rpb24gQXR0cmlidXRlJGRlc3Ryb3koKSB7XG4gICAgZGVsZXRlIHRoaXMuZWw7XG4gICAgZGVsZXRlIHRoaXMubm9kZTtcbn1cblxuLyoqXG4gKiBBdHRyaWJ1dGUgaW5zdGFuY2UgbWV0aG9kIHRoYXQgcmV0dXJucyBhdHRyaWJ1dGUgdmFsdWUgYXMgc3RyaW5nLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gQXR0cmlidXRlJGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbC5nZXRBdHRyaWJ1dGUodGhpcy5uYW1lKTtcbn1cblxuXG4vKipcbiAqIEF0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2QgdGhhdCBzZXRzIGF0dHJpYnV0ZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqL1xuZnVuY3Rpb24gQXR0cmlidXRlJHNldCh2YWx1ZSkge1xuICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKHRoaXMubmFtZSwgdmFsdWUpO1xufVxuXG5cbi8qKlxuICogQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCB0aGF0IGRlY29yYXRlcyBlbGVtZW50IHdpdGggaXRzIHJlbmRlcmVkIHZhbHVlLlxuICogVXNlcyBgcmVuZGVyYCBtZXRob2QgdGhhdCBzaG91bGQgYmUgZGVmaWVuZCBpbiBzdWJjbGFzcy5cbiAqL1xuZnVuY3Rpb24gQXR0cmlidXRlJGRlY29yYXRlKCkge1xuICAgIHRoaXMuc2V0KHRoaXMucmVuZGVyKCkpO1xufVxuXG5cbmZ1bmN0aW9uIHRvQmVJbXBsZW1lbnRlZCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxpbmcgdGhlIG1ldGhvZCBvZiBhbiBhYnNjdHJhY3QgY2xhc3MnKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEF0dHJpYnV0ZSA9IHJlcXVpcmUoJy4vYV9jbGFzcycpXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbi8qKlxuICogYG1pbG8uYXR0cmlidXRlcy5sb2FkYFxuICogTG9hZEF0dHJpYnV0ZSBjbGFzcyBwYXJzZXMvdmFsaWRhdGVzL2V0Yy4gYW4gYXR0cmlidXRlIHRoYXQgbG9hZHMgc3ViLXZpZXdzIGludG8gdGhlIHBhZ2UuXG4gKiBBdHRyaWJ1dGUgdmFsdWUgc2hvdWxkIGJlIFVSTCBvZiB0aGUgZmlsZSB0byBsb2FkIHN1YnZpZXcgZnJvbS5cbiAqIFNlZSBbbG9hZGVyXSguLi9sb2FkZXIuanMuaHRtbCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKi9cbnZhciBMb2FkQXR0cmlidXRlID0gXy5jcmVhdGVTdWJjbGFzcyhBdHRyaWJ1dGUsICdMb2FkQXR0cmlidXRlJywgdHJ1ZSk7XG5cblxuLyoqXG4gKiAjIyMjTG9hZEF0dHJpYnV0ZSBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2F0dHJOYW1lXSgjYXR0ck5hbWUpXG4gKiAtIFtwYXJzZV0oI3BhcnNlKVxuICogLSBbdmFsaWRhdGVdKCN2YWxpZGF0ZSlcbiAqIC0gW3JlbmRlcl0oI3JlbmRlcilcbiAqL1xuXy5leHRlbmRQcm90byhMb2FkQXR0cmlidXRlLCB7XG4gICAgYXR0ck5hbWU6IGF0dHJOYW1lLFxuICAgIHBhcnNlOiBwYXJzZSxcbiAgICB2YWxpZGF0ZTogdmFsaWRhdGUsXG4gICAgcmVuZGVyOiByZW5kZXJcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IExvYWRBdHRyaWJ1dGU7XG5cblxuLyoqXG4gKiBCaW5kQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCB0aGF0IHJldHVybnMgYXR0cmlidXRlIG5hbWUsIGJ5IGRlZmF1bHQgLSBgJ21sLWxvYWQnYC5cbiAqIFRvIGNvbmZpZ3VyZSBsb2FkIGF0dHJpYnV0ZSBuYW1lIHVzZTpcbiAqIGBgYFxuICogbWlsby5jb25maWcoeyBhdHRyczogeyBsb2FkOiAnY2MtbG9hZCcgfSB9KTsgLy8gd2lsbCBzZXQgYmluZCBhdHRyaWJ1dGUgdG8gJ2NjLWxvYWQnXG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGF0dHJOYW1lKCkge1xuICAgIHJldHVybiBjb25maWcuYXR0cnMubG9hZDtcbn1cblxuXG4vKipcbiAqIExvYWRBdHRyaWJ1dGUgaW5zdGFuY2UgbWV0aG9kIHRoYXQgcGFyc2VzIGxvYWQgYXR0cmlidXRlIGlmIGl0IGlzIHByZXNlbnQgb24gdGhlIGVsZW1lbnQuXG4gKiBJdCBkZWZpbmVzIHByb3BlcnR5IGBsb2FkVXJsYCBvbiBMb2FkQXR0cmlidXRlIGluc3RhbmNlLlxuICogUmV0dXJucyB0aGUgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAqXG4gKiBAcmV0dXJuIHtMb2FkQXR0cmlidXRlfVxuICovXG5mdW5jdGlvbiBwYXJzZSgpIHtcbiAgICBpZiAoISB0aGlzLm5vZGUpIHJldHVybjtcblxuICAgIHRoaXMubG9hZFVybCA9IHRoaXMuZ2V0KCk7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBMb2FkQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCB0aGF0IHNob3VsZCB2YWxpZGF0ZSBsb2FkIGF0dHJpYnV0ZSBhbmQgdGhyb3cgaWYgaXQgaGFzIGFuIGludmFsaWQgdmFsdWUuXG4gKiBUT0RPIC0gaW1wbGVtZW50IHVybCB2YWxpZGF0aW9uLlxuICogUmV0dXJucyB0aGUgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAqXG4gKiBAcmV0dXJuIHtMb2FkQXR0cmlidXRlfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZSgpIHtcbiAgICAvLyBUT0RPIHVybCB2YWxpZGF0aW9uXG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBMb2FkQXR0cmlidXRlIGluc3RhbmNlIG1ldGhvZCAtIHJldHVybnMgVVJMXG4gKlxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMubG9hZFVybDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTdWJjbGFzc2VzIG9mIFtBdHRyaWJ1dGVdKC4vYV9jbGFzcy5qcy5odG1sKSBjbGFzc1xuICpcbiAqIC0gW0JpbmRBdHRyaWJ1dGVdKC4vYV9iaW5kLmpzLmh0bWwpXG4gKiAtIFtMb2FkQXR0cmlidXRlXSguL2FfbG9hZC5qcy5odG1sKVxuICovXG52YXIgYXR0cmlidXRlcyA9IG1vZHVsZS5leHBvcnRzID0ge1xuICAgIGJpbmQ6IHJlcXVpcmUoJy4vYV9iaW5kJyksXG4gICAgbG9hZDogcmVxdWlyZSgnLi9hX2xvYWQnKVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9NYWlsID0gcmVxdWlyZSgnLi9zZXJ2aWNlcy9tYWlsJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY29tcG9uZW50cy9jX3JlZ2lzdHJ5JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL2NmX3JlZ2lzdHJ5JylcbiAgICAsIENvbXBvbmVudCA9IGNvbXBvbmVudHNSZWdpc3RyeS5nZXQoJ0NvbXBvbmVudCcpXG4gICAgLCBDb21wb25lbnRJbmZvID0gcmVxdWlyZSgnLi9jb21wb25lbnRzL2NfaW5mbycpXG4gICAgLCBTY29wZSA9IHJlcXVpcmUoJy4vY29tcG9uZW50cy9zY29wZScpXG4gICAgLCBCaW5kQXR0cmlidXRlID0gcmVxdWlyZSgnLi9hdHRyaWJ1dGVzL2FfYmluZCcpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgdXRpbERvbSA9IHJlcXVpcmUoJy4vdXRpbC9kb20nKVxuICAgICwgTWF0Y2ggPSAgY2hlY2suTWF0Y2g7XG5cblxuYmluZGVyLnNjYW4gPSBzY2FuO1xuYmluZGVyLmNyZWF0ZSA9IGNyZWF0ZTtcbmJpbmRlci50d29QYXNzID0gdHdvUGFzcztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGJpbmRlcjtcblxuXG4vKipcbiAqIGBtaWxvLmJpbmRlcmBcbiAqXG4gKiBSZWN1cnNpdmVseSBzY2FucyB0aGUgZG9jdW1lbnQgdHJlZSBpbnNpZGUgYHNjb3BlRWxgIChkb2N1bWVudC5ib2R5IGJ5IGRlZmF1bHQpIGxvb2tpbmcgZm9yIF9fbWwtYmluZF9fIGF0dHJpYnV0ZSB0aGF0IHNob3VsZCBjb250YWluIHRoZSBjbGFzcywgYWRkaXRpb25hbCBmYWNldHMgYW5kIHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgdGhhdCBzaG91bGQgYmUgY3JlYXRlZCBhbmQgYm91bmQgdG8gdGhlIGVsZW1lbnQuXG4gKlxuICogUG9zc2libGUgdmFsdWVzIG9mIF9fbWwtYmluZF9fIGF0dHJpYnV0ZTpcbiAqXG4gKiAtIGA6bXlWaWV3YCAtIG9ubHkgY29tcG9uZW50IG5hbWUuIEFuIGluc3RhbmNlIG9mIENvbXBvbmVudCBjbGFzcyB3aWxsIGJlIGNyZWF0ZWQgd2l0aG91dCBhbnkgZmFjZXRzLlxuICogLSBgVmlldzpteVZpZXdgIC0gY2xhc3MgYW5kIGNvbXBvbmVudCBuYW1lLiBBbiBpbnN0YW5jZSBvZiBWaWV3IGNsYXNzIHdpbGwgYmUgY3JlYXRlZC5cbiAqIC0gYFtFdmVudHMsIERhdGFdOm15Vmlld2AgLSBmYWNldHMgYW5kIGNvbXBvbmVudCBuYW1lLiBBbiBpbnN0YW5jZSBvZiBDb21wb25lbnQgY2xhc3Mgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIGFkZGl0aW9uIG9mIGZhY2V0cyBFdmVudHMgYW5kIERhdGEuXG4gKiAtIGBWaWV3W0V2ZW50cywgRGF0YV06bXlWaWV3YCAtIGNsYXNzLCBmYWNldChzKSBhbmQgY29tcG9uZW50IG5hbWUuIEFuIGluc3RhbmNlIG9mIFZpZXcgY2xhc3Mgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIGFkZGl0aW9uIG9mIGZhY2V0cyBFdmVudHMgYW5kIERhdGEuXG4gKlxuICogRnVuY3Rpb24gcmV0dXJucyBhbiBpbnN0YW5jZSBvZiBbYFNjb3BlYF0oLi9jb21wb25lbnRzL3Njb3BlLmpzLmh0bWwpIGNsYXNzIGNvbnRhaW5pbmcgYWxsIGNvbXBvbmVudHMgY3JlYXRlZCBhcyBhIHJlc3VsdCBvZiBzY2FubmluZyBET00uXG4gKlxuICogSWYgdGhlIGNvbXBvbmVudCBoYXMgW2BDb250YWluZXJgXSguL2NvbXBvbmVudHMvY19mYWNldHMvQ29udGFpbmVyLmpzKSBmYWNldCwgY2hpbGRyZW4gb2YgdGhpcyBlbGVtZW50IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBgc2NvcGVgIG9iamVjdCwgYXZhaWxhYmxlIGFzIHNjb3BlIHByb3BlcnR5IG9uIHRoZSBDb250YWluZXIgZmFjZXQgb2YgdGhpcyBjb21wb25lbnQuIE5hbWVzIG9mIGNvbXBvbmVudHMgd2l0aGluIHRoZSBzY29wZSBzaG91bGQgYmUgdW5pcXVlLCBidXQgdGhleSBjYW4gYmUgdGhlIHNhbWUgYXMgdGhlIG5hbWVzIG9mIGNvbXBvbmVudHMgaW4gb3V0ZXIgc2NvcGUgKG9yIHNvbWUgb3RoZXIgc2NvcGUpLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gc2NvcGVFbCByb290IGVsZW1lbnQgaW5zaWRlIHdoaWNoIERPTSB3aWxsIGJlIHNjYW5uZWQgYW5kIGJvdW5kXG4gKiBAcGFyYW0ge1Njb3BlfSByb290U2NvcGUgT3B0aW9uYWwgUm9vdCBzY29wZSBvYmplY3Qgd2hlcmUgdG9wIGxldmVsIGNvbXBvbmVudHMgd2lsbCBiZSBzYXZlZC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYmluZFJvb3RFbGVtZW50IElmIHNldCB0byBmYWxzZSwgdGhlbiB0aGUgcm9vdCBlbGVtZW50IHdpbGwgbm90IGJlIGJvdW5kLiBUcnVlIGJ5IGRlZmF1bHQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHRocm93T25FcnJvcnMgSWYgc2V0IHRvIGZhbHNlLCB0aGVuIGVycm9ycyB3aWxsIG9ubHkgYmUgbG9nZ2VkIHRvIGNvbnNvbGUuIFRydWUgYnkgZGVmYXVsdC5cbiAqIEByZXR1cm4ge1Njb3BlfVxuICovXG5mdW5jdGlvbiBiaW5kZXIoc2NvcGVFbCwgcm9vdFNjb3BlLCBiaW5kUm9vdEVsZW1lbnQsIHRocm93T25FcnJvcnMpIHtcbiAgICByZXR1cm4gY3JlYXRlQmluZGVyU2NvcGUoc2NvcGVFbCwgZnVuY3Rpb24oc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgICAgIHZhciBpbmZvID0gbmV3IENvbXBvbmVudEluZm8oc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKTtcbiAgICAgICAgcmV0dXJuIENvbXBvbmVudC5jcmVhdGUoaW5mbywgdGhyb3dPbkVycm9ycyk7XG4gICAgfSwgcm9vdFNjb3BlLCBiaW5kUm9vdEVsZW1lbnQsIHRocm93T25FcnJvcnMpO1xufVxuXG5cbi8vIGJpbmQgaW4gdHdvIHBhc3Nlc1xuZnVuY3Rpb24gdHdvUGFzcyhzY29wZUVsLCByb290U2NvcGUsIGJpbmRSb290RWxlbWVudCwgdGhyb3dPbkVycm9ycykge1xuICAgIHZhciBzY2FuU2NvcGUgPSBiaW5kZXIuc2NhbihzY29wZUVsLCByb290U2NvcGUsIGJpbmRSb290RWxlbWVudCwgdGhyb3dPbkVycm9ycyk7XG4gICAgcmV0dXJuIGJpbmRlci5jcmVhdGUoc2NhblNjb3BlLCB1bmRlZmluZWQsIHRocm93T25FcnJvcnMpO1xufVxuXG5cbi8vIHNjYW4gRE9NIGZvciBCaW5kQXR0cmlidXRlXG5mdW5jdGlvbiBzY2FuKHNjb3BlRWwsIHJvb3RTY29wZSwgYmluZFJvb3RFbGVtZW50LCB0aHJvd09uRXJyb3JzKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJpbmRlclNjb3BlKHNjb3BlRWwsIGZ1bmN0aW9uKHNjb3BlLCBlbCwgYXR0ciwgdGhyb3dPbkVycm9ycykge1xuICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudEluZm8oc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKTtcbiAgICB9LCByb290U2NvcGUsIGJpbmRSb290RWxlbWVudCwgdGhyb3dPbkVycm9ycyk7XG59XG5cblxuLy8gY3JlYXRlIGJvdW5kIGNvbXBvbmVudHNcbmZ1bmN0aW9uIGNyZWF0ZShzY2FuU2NvcGUsIGhvc3RPYmplY3QsIHRocm93T25FcnJvcnMpIHtcbiAgICB2YXIgc2NvcGUgPSBuZXcgU2NvcGUoc2NhblNjb3BlLl9yb290RWwsIGhvc3RPYmplY3QpXG4gICAgICAgICwgYWRkTWV0aG9kID0gdGhyb3dPbkVycm9ycyA9PT0gZmFsc2UgPyAnX3NhZmVBZGQnIDogJ19hZGQnO1xuXG4gICAgc2NhblNjb3BlLl9lYWNoKGZ1bmN0aW9uKGNvbXBJbmZvKSB7XG4gICAgICAgIC8vIHNldCBjb3JyZWN0IGNvbXBvbmVudCdzIHNjb3BlXG4gICAgICAgIHZhciBpbmZvID0gXy5jbG9uZShjb21wSW5mbylcbiAgICAgICAgaW5mby5zY29wZSA9IHNjb3BlO1xuXG4gICAgICAgIC8vIGNyZWF0ZSBjb21wb25lbnRcbiAgICAgICAgdmFyIGFDb21wb25lbnQgPSBDb21wb25lbnQuY3JlYXRlKGluZm8sIHRocm93T25FcnJvcnMpO1xuXG4gICAgICAgIHNjb3BlW2FkZE1ldGhvZF0oYUNvbXBvbmVudCwgYUNvbXBvbmVudC5uYW1lKTtcbiAgICAgICAgaWYgKGFDb21wb25lbnQuY29udGFpbmVyKVxuICAgICAgICAgICAgYUNvbXBvbmVudC5jb250YWluZXIuc2NvcGUgPSBjcmVhdGUoY29tcEluZm8uY29udGFpbmVyLnNjb3BlLCBhQ29tcG9uZW50LmNvbnRhaW5lciwgdGhyb3dPbkVycm9ycyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2NvcGU7XG59XG5cbi8qKlxuICogYGNyZWF0ZUJpbmRlclNjb3BlYFxuICogQHBhcmFtICB7RWxlbWVudH0gc2NvcGVFbCAgICAgICAgICAgICBzY29wZUVsIHJvb3QgZWxlbWVudCBpbnNpZGUgd2hpY2ggRE9NIHdpbGwgYmUgc2Nhbm5lZCBhbmQgYm91bmQgKGRvY3VtZW50LmJvZHkgYnkgZGVmYXVsdCkuXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gc2NvcGVPYmplY3RGYWN0b3J5IFNlZSBbYmluZGVyXSgjbWlsby5iaW5kZXIpXG4gKiBAcGFyYW0gIHtTY29wZX0gcm9vdFNjb3BlICAgICAgICAgICAgIE9wdGlvbmFsIFJvb3Qgc2NvcGUgb2JqZWN0IHdoZXJlIHRvcCBsZXZlbCBjb21wb25lbnRzIHdpbGwgYmUgc2F2ZWQuXG4gKiBAcGFyYW0gIHtCb29sZWFufSBiaW5kUm9vdEVsZW1lbnQgICAgIElmIHNldCB0byBmYWxzZSwgdGhlbiB0aGUgcm9vdCBlbGVtZW50IHdpbGwgbm90IGJlIGJvdW5kLiBUcnVlIGJ5IGRlZmF1bHQuXG4gKiBAcGFyYW0gIHtCb29sZWFufSB0aHJvd09uRXJyb3JzICAgICAgIElmIHNldCB0byBmYWxzZSwgdGhlbiBlcnJvcnMgd2lsbCBvbmx5IGJlIGxvZ2dlZCB0byBjb25zb2xlLiBUcnVlIGJ5IGRlZmF1bHQuXG4gKiBAcmV0dXJuIHtTY29wZX0gICAgICAgICAgICAgICAgICAgICAgIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmluZGVyU2NvcGUoc2NvcGVFbCwgc2NvcGVPYmplY3RGYWN0b3J5LCByb290U2NvcGUsIGJpbmRSb290RWxlbWVudCwgdGhyb3dPbkVycm9ycykge1xuICAgIHZhciBzY29wZUVsID0gc2NvcGVFbCB8fCBkb2N1bWVudC5ib2R5XG4gICAgICAgICwgc2NvcGUgPSByb290U2NvcGUgfHwgbmV3IFNjb3BlKHNjb3BlRWwpXG4gICAgICAgICwgYWRkTWV0aG9kID0gdGhyb3dPbkVycm9ycyA9PT0gZmFsc2UgPyAnX3NhZmVBZGQnIDogJ19hZGQnO1xuXG4gICAgY3JlYXRlU2NvcGVGb3JFbGVtZW50KHNjb3BlLCBzY29wZUVsLCBiaW5kUm9vdEVsZW1lbnQpO1xuXG4gICAgcmV0dXJuIHNjb3BlO1xuXG5cbiAgICBmdW5jdGlvbiBjcmVhdGVTY29wZUZvckVsZW1lbnQoc2NvcGUsIGVsLCBiaW5kUm9vdEVsZW1lbnQpIHtcbiAgICAgICAgLy8gZ2V0IGVsZW1lbnQncyBiaW5kaW5nIGF0dHJpYnV0ZSAobWwtYmluZCBieSBkZWZhdWx0KVxuICAgICAgICB2YXIgYXR0ciA9IG5ldyBCaW5kQXR0cmlidXRlKGVsKTtcblxuICAgICAgICAvLyBpZiBlbGVtZW50IGhhcyBiaW5kIGF0dHJpYnV0ZSBjcmF0ZSBzY29wZSBvYmplY3QgKENvbXBvbmVudCBvciBDb21wb25lbnRJbmZvKVxuICAgICAgICBpZiAoYXR0ci5ub2RlICYmIGJpbmRSb290RWxlbWVudCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHZhciBzY29wZWRPYmplY3QgPSBzY29wZU9iamVjdEZhY3Rvcnkoc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKVxuICAgICAgICAgICAgICAgICwgaXNDb250YWluZXIgPSB0eXBlb2Ygc2NvcGVkT2JqZWN0ICE9ICd1bmRlZmluZWQnICYmIHNjb3BlZE9iamVjdC5jb250YWluZXI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB0aGVyZSBhcmUgY2hpbGROb2RlcyBhZGQgY2hpbGRyZW4gdG8gbmV3IHNjb3BlIGlmIHRoaXMgZWxlbWVudCBoYXMgY29tcG9uZW50IHdpdGggQ29udGFpbmVyIGZhY2V0XG4gICAgICAgIC8vIG90aGVyd2lzZSBjcmVhdGUgYSBuZXcgc2NvcGVcbiAgICAgICAgaWYgKGVsLmNoaWxkTm9kZXMgJiYgZWwuY2hpbGROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChpc0NvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIHZhciBpbm5lclNjb3BlID0gbmV3IFNjb3BlKGVsKTtcbiAgICAgICAgICAgICAgICBzY29wZWRPYmplY3QuY29udGFpbmVyLnNjb3BlID0gaW5uZXJTY29wZTtcbiAgICAgICAgICAgICAgICBpbm5lclNjb3BlLl9ob3N0T2JqZWN0ID0gc2NvcGVkT2JqZWN0LmNvbnRhaW5lcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3JlYXRlU2NvcGVGb3JDaGlsZHJlbihlbCwgaXNDb250YWluZXIgPyBpbm5lclNjb3BlIDogc2NvcGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgc2NvcGUgd2Fzbid0IHByZXZpb3VzbHkgY3JlYXRlZCBvbiBjb250YWluZXIgZmFjZXQsIGNyZWF0ZSBlbXB0eSBzY29wZSBhbnl3YXlcbiAgICAgICAgaWYgKGlzQ29udGFpbmVyICYmICEgc2NvcGVkT2JqZWN0LmNvbnRhaW5lci5zY29wZSlcbiAgICAgICAgICAgIHNjb3BlZE9iamVjdC5jb250YWluZXIuc2NvcGUgPSBuZXcgU2NvcGUoZWwpO1xuXG5cbiAgICAgICAgLy8gVE9ETyBjb25kaXRpb24gYWZ0ZXIgJiYgaXMgYSBoYWNrLCBzaG91bGQgbm90IGJlIHVzZWQhXG4gICAgICAgIGlmIChzY29wZWRPYmplY3QpIC8vICYmICEgc2NvcGVbYXR0ci5jb21wTmFtZV0pXG4gICAgICAgICAgICBzY29wZVthZGRNZXRob2RdKHNjb3BlZE9iamVjdCwgYXR0ci5jb21wTmFtZSk7XG5cbiAgICAgICAgLy8gXy5kZWZlcihwb3N0Q2hpbGRyZW5Cb3VuZE1lc3NhZ2UsIGVsKTtcbiAgICAgICAgcG9zdENoaWxkcmVuQm91bmRNZXNzYWdlKGVsKTtcblxuICAgICAgICByZXR1cm4gc2NvcGVkT2JqZWN0O1xuXG5cbiAgICAgICAgZnVuY3Rpb24gcG9zdENoaWxkcmVuQm91bmRNZXNzYWdlKGVsKSB7XG4gICAgICAgICAgICB2YXIgZWxDb21wID0gQ29tcG9uZW50LmdldENvbXBvbmVudChlbCk7XG5cbiAgICAgICAgICAgIGlmIChlbENvbXApXG4gICAgICAgICAgICAgICAgZWxDb21wLnBvc3RNZXNzYWdlU3luYygnY2hpbGRyZW5ib3VuZCcpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBjcmVhdGVTY29wZUZvckNoaWxkcmVuKGNvbnRhaW5lckVsLCBzY29wZSkge1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSB1dGlsRG9tLmNoaWxkcmVuKGNvbnRhaW5lckVsKTtcblxuICAgICAgICBfLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgIGNyZWF0ZVNjb3BlRm9yRWxlbWVudChzY29wZSwgbm9kZSwgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc2NvcGU7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29yZUNsYXNzZXMgPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5jbGFzc2VzO1xuXG4vLyA8YSBuYW1lPVwiY2xhc3Nlc1wiPjwvYT5cbi8vIG1pbG8uY2xhc3Nlc1xuLy8gLS0tLS0tLS0tLS1cblxuLy8gVGhpcyBtb2R1bGUgY29udGFpbnMgZm91bmRhdGlvbiBjbGFzc2VzIGFuZCBjbGFzcyByZWdpc3RyaWVzLlxuXG52YXIgY2xhc3NlcyA9IHtcbiAgICBGYWNldDogcmVxdWlyZSgnLi9hYnN0cmFjdC9mYWNldCcpLFxuICAgIEZhY2V0ZWRPYmplY3Q6IHJlcXVpcmUoJy4vYWJzdHJhY3QvZmFjZXRlZF9vYmplY3QnKSxcbiAgICBTY29wZTogcmVxdWlyZSgnLi9jb21wb25lbnRzL3Njb3BlJyksXG4gICAgQ2xhc3NSZWdpc3RyeTogcmVxdWlyZSgnLi9hYnN0cmFjdC9yZWdpc3RyeScpLFxuICAgIE1peGluOiBjb3JlQ2xhc3Nlcy5NaXhpbixcbiAgICBNZXNzYWdlU291cmNlOiBjb3JlQ2xhc3Nlcy5NZXNzYWdlU291cmNlLFxuICAgIE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2U6IGNvcmVDbGFzc2VzLk1lc3Nlbmdlck1lc3NhZ2VTb3VyY2UsXG4gICAgTWVzc2VuZ2VyQVBJOiBjb3JlQ2xhc3Nlcy5NZXNzZW5nZXJBUEksXG4gICAgRE9NRXZlbnRzU291cmNlOiByZXF1aXJlKCcuL2NvbXBvbmVudHMvbXNnX3NyYy9kb21fZXZlbnRzJyksXG4gICAgVHJhbnNhY3Rpb246IHJlcXVpcmUoJy4vY29tbWFuZC90cmFuc2FjdGlvbicpLFxuICAgIFRyYW5zYWN0aW9uSGlzdG9yeTogcmVxdWlyZSgnLi9jb21tYW5kL3RyYW5zYWN0aW9uX2hpc3RvcnknKVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzc2VzO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gQWN0aW9uc0hpc3Rvcnk7XG5cblxuLyoqXG4gKiBTdG9yZXMgbGlzdCBvZiBjb21tYW5kcyBvciB0cmFuc2FjdGlvbnNcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSBtYXhMZW5ndGhcbiAqL1xuZnVuY3Rpb24gQWN0aW9uc0hpc3RvcnkobWF4TGVuZ3RoKSB7XG4gICAgdGhpcy5fbWF4TGVuZ3RoID0gbWF4TGVuZ3RoIHx8IEluZmluaXR5O1xuICAgIHRoaXMuYWN0aW9ucyA9IFtdO1xuICAgIHRoaXMucG9zaXRpb24gPSAwO1xufVxuXG5cbl8uZXh0ZW5kUHJvdG8oQWN0aW9uc0hpc3RvcnksIHtcbiAgICBzdG9yZTogQWN0aW9uc0hpc3Rvcnkkc3RvcmUsXG4gICAgZGVsZXRlTGFzdDogQWN0aW9uc0hpc3RvcnkkZGVsZXRlTGFzdCxcbiAgICB1bmRvOiBBY3Rpb25zSGlzdG9yeSR1bmRvLFxuICAgIHJlZG86IEFjdGlvbnNIaXN0b3J5JHJlZG8sXG4gICAgdW5kb0FsbDogQWN0aW9uc0hpc3RvcnkkdW5kb0FsbCxcbiAgICByZWRvQWxsOiBBY3Rpb25zSGlzdG9yeSRyZWRvQWxsLFxuICAgIHVuZG9BbGxBc3luYzogQWN0aW9uc0hpc3RvcnkkdW5kb0FsbEFzeW5jLFxuICAgIHJlZG9BbGxBc3luYzogQWN0aW9uc0hpc3RvcnkkcmVkb0FsbEFzeW5jLFxuICAgIGVhY2g6IEFjdGlvbnNIaXN0b3J5JGVhY2gsXG4gICAgZWFjaFJldmVyc2U6IEFjdGlvbnNIaXN0b3J5JGVhY2hSZXZlcnNlLFxuICAgIGdldExhc3RBY3Rpb246IEFjdGlvbnNIaXN0b3J5JGdldExhc3RBY3Rpb24sXG5cbiAgICBnZXREZXNjcmlwdGlvbjogQWN0aW9uc0hpc3RvcnkkZ2V0RGVzY3JpcHRpb25cbn0pO1xuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JHN0b3JlKGNvbW1hbmQpIHtcbiAgICBfdHJ1bmNhdGVUb0N1cnJlbnRQb3NpdGlvbi5jYWxsKHRoaXMpO1xuICAgIHRoaXMuYWN0aW9ucy5wdXNoKGNvbW1hbmQpO1xuXG4gICAgaWYgKHRoaXMuYWN0aW9ucy5sZW5ndGggPiB0aGlzLl9tYXhMZW5ndGgpIHtcbiAgICAgICAgdmFyIGFjdCA9IHRoaXMuYWN0aW9ucy5zaGlmdCgpO1xuICAgICAgICBhY3QuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHRoaXMucG9zaXRpb24gPSB0aGlzLmFjdGlvbnMubGVuZ3RoO1xuICAgIHJldHVybiB0aGlzLnBvc2l0aW9uIC0gMVxufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JGRlbGV0ZUxhc3QoKSB7XG4gICAgaWYgKCF0aGlzLmFjdGlvbnMubGVuZ3RoKSByZXR1cm47XG4gICAgdGhpcy5wb3NpdGlvbi0tO1xuICAgIHRoaXMuYWN0aW9ucy5sZW5ndGgtLTtcbn1cblxuXG5mdW5jdGlvbiBfdHJ1bmNhdGVUb0N1cnJlbnRQb3NpdGlvbigpIHtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5wb3NpdGlvbjsgaSA8IHRoaXMuYWN0aW9ucy5sZW5ndGg7IGkrKylcbiAgICAgICAgdGhpcy5hY3Rpb25zW2ldLmRlc3Ryb3koKTtcbiAgICB0aGlzLmFjdGlvbnMubGVuZ3RoID0gdGhpcy5wb3NpdGlvbjtcbn1cblxuXG5mdW5jdGlvbiBBY3Rpb25zSGlzdG9yeSR1bmRvKGNiKSB7XG4gICAgaWYgKHRoaXMucG9zaXRpb24gPT0gMCkgcmV0dXJuOyAvLyBub3RoaW5nIHRvIHVuZG9cbiAgICB2YXIgYWN0ID0gdGhpcy5hY3Rpb25zWy0tdGhpcy5wb3NpdGlvbl07XG4gICAgYWN0LnVuZG8oY2IpO1xuICAgIHJldHVybiBhY3Q7XG59XG5cblxuZnVuY3Rpb24gQWN0aW9uc0hpc3RvcnkkcmVkbyhjYikge1xuICAgIGlmICh0aGlzLnBvc2l0aW9uID09IHRoaXMuYWN0aW9ucy5sZW5ndGgpIHJldHVybjsgLy8gbm90aGluZyB0byByZWRvXG4gICAgdmFyIGFjdCA9IHRoaXMuYWN0aW9uc1t0aGlzLnBvc2l0aW9uKytdO1xuICAgIGFjdC5yZWRvKGNiKTtcbiAgICByZXR1cm4gYWN0O1xufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JHVuZG9BbGwoKSB7XG4gICAgd2hpbGUgKHRoaXMucG9zaXRpb24pIHRoaXMudW5kbygpO1xufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JHJlZG9BbGwoKSB7XG4gICAgd2hpbGUgKHRoaXMucG9zaXRpb24gPCB0aGlzLmFjdGlvbnMubGVuZ3RoKSB0aGlzLnJlZG8oKTtcbn1cblxuXG5mdW5jdGlvbiBBY3Rpb25zSGlzdG9yeSR1bmRvQWxsQXN5bmMoY2IpIHtcbiAgICBpZiAodGhpcy5wb3NpdGlvbikge1xuICAgICAgICB0aGlzLnVuZG8oKTtcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb24pXG4gICAgICAgICAgICBfLmRlZmVyTWV0aG9kKHRoaXMsICd1bmRvQWxsQXN5bmMnLCBjYik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGlmIChjYikgXy5kZWZlcihjYik7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JHJlZG9BbGxBc3luYyhjYikge1xuICAgIGlmICh0aGlzLnBvc2l0aW9uIDwgdGhpcy5hY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnJlZG8oKTtcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb24gPCB0aGlzLmFjdGlvbnMubGVuZ3RoKSBcbiAgICAgICAgICAgIF8uZGVmZXJNZXRob2QodGhpcywgJ3JlZG9BbGxBc3luYycsIGNiKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgaWYgKGNiKSBfLmRlZmVyKGNiKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gQWN0aW9uc0hpc3RvcnkkZWFjaChmdW5jT3JNZXRob2QsIHRoaXNBcmcpIHtcbiAgICB2YXIgZnVuYyA9IHR5cGVvZiBmdW5jT3JNZXRob2QgPT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uKGFjdCkgeyBhY3RbZnVuY09yTWV0aG9kXSgpOyB9XG4gICAgICAgICAgICAgICAgOiBmdW5jT3JNZXRob2Q7XG5cbiAgICB0aGlzLmFjdGlvbnMuZm9yRWFjaChmdW5jLCB0aGlzQXJnIHx8IHRoaXMpO1xufVxuXG5cbmZ1bmN0aW9uIEFjdGlvbnNIaXN0b3J5JGVhY2hSZXZlcnNlKGZ1bmNPck1ldGhvZCwgdGhpc0FyZykge1xuICAgIHRoaXMuYWN0aW9ucy5yZXZlcnNlKCk7XG4gICAgdGhpcy5lYWNoKGZ1bmNPck1ldGhvZCwgdGhpc0FyZyk7XG4gICAgdGhpcy5hY3Rpb25zLnJldmVyc2UoKTtcbn1cblxuXG5mdW5jdGlvbiBBY3Rpb25zSGlzdG9yeSRnZXRMYXN0QWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnBvc2l0aW9uICYmIHRoaXMuYWN0aW9uc1t0aGlzLnBvc2l0aW9uIC0gMV07XG59XG5cblxuZnVuY3Rpb24gQWN0aW9uc0hpc3RvcnkkZ2V0RGVzY3JpcHRpb24oKSB7XG4gICAgdmFyIGFjdGlvbnMgPSB0aGlzLmFjdGlvbnMubWFwKGZ1bmN0aW9uKGFjdCkge1xuICAgICAgICByZXR1cm4gYWN0LmdldERlc2NyaXB0aW9uKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWN0aW9uczogYWN0aW9ucyxcbiAgICAgICAgcG9zaXRpb246IHRoaXMucG9zaXRpb24sXG4gICAgICAgIGxlbmd0aDogYWN0aW9ucy5sZW5ndGhcbiAgICB9O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ2xhc3NSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2Fic3RyYWN0L3JlZ2lzdHJ5JylcbiAgICAsIENvbW1hbmQgPSByZXF1aXJlKCcuL2luZGV4Jyk7XG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuY29tcG9uZW50c2BcbiAqIEFuIGluc3RhbmNlIG9mIFtDbGFzc1JlZ2lzdHJ5XSguLi9hYnN0cmFjdC9yZWdpc3RyeS5qcy5odG1sKSBjbGFzcyB0aGF0IGlzIHVzZWQgYnkgbWlsbyB0byByZWdpc3RlciBhbmQgZmluZCBjb21wb25lbnRzLlxuICovXG52YXIgY29tbWFuZHNSZWdpc3RyeSA9IG5ldyBDbGFzc1JlZ2lzdHJ5KENvbW1hbmQpO1xuXG4vLyBhZGQgY29tbW9uIGFuY2VzdG9yIHRvIGFsbCBjb21wb25lbnRzIHRvIHRoZSByZWdpc3RyeS5cbmNvbW1hbmRzUmVnaXN0cnkuYWRkKENvbW1hbmQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbW1hbmRzUmVnaXN0cnk7XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlcjtcblxuXG52YXIgVU5ET19DT01NQU5EID0gJ191bmRvQ29tbWFuZCc7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBDb21tYW5kO1xuXG5cbi8qKlxuICogQ29tbWFuZCBjbGFzcyB0byBpbXBsZW1lbnQgXCJjb21tYW5kIHBhdHRlcm5cIiAtIHBhY2thZ2luZyBsbCBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIGRlbGF5ZWQgbWV0aG9kIGV4ZWN1dGlvblxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBtZXRob2QgbmFtZSBvciBmdW5jdGlvbiB0byBiZSBleGVjdXRlZFxuICogQHBhcmFtIHtMaXN0fSAqYXJndW1lbnRzIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIG1ldGhvZCBvciBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBDb21tYW5kKGZ1bmMpIHsgLy8gLCAuLi4gYXJndW1lbnRzXG4gICAgdGhpcy5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiBDb21tYW5kIGluc3RhbmNlIG1ldGhvZHNcbiAqIFxuICogLSBbaW5pdF0oI0NvbW1hbmQkZXhlY3V0ZSkgLSBpbml0aWFsaXplIGNvbW1hbmQsIHNob3VsZCBiZSBvdmVyd3JpdHRlbiBieSBzdWJjbGFzc2VzXG4gKiAtIFtleGVjdXRlXSgjQ29tbWFuZCRleGVjdXRlKSAtIGV4ZWN1dGUgY29tbWFuZFxuICogLSBbc2V0VW5kb10oI0NvbW1hbmQkc2V0VW5kbykgLSBzZXQgdW5kbyBjb21tYW5kIGZvciB0aGlzIGNvbW1hbmRcbiAqIC0gW2dldFVuZG9dKCNDb21tYW5kJGdldFVuZG8pIC0gZ2V0IHVuZG8gY29tbWFuZCBvZiB0aGlzIGNvbW1hbmRcbiAqIC0gW3NldEFyZ3VtZW50c10oI0NvbW1hbmQkc2V0QXJndW1lbnRzKSAtIHNldCBjb21tYW5kcyBhcmd1bWVudHNcbiAqIC0gW2FkZEFyZ3VtZW50c10oI0NvbW1hbmQkYWRkQXJndW1lbnRzKSAtIGFkZCBhcmd1bWVudHMgdG8gY29tbWFuZFxuICogLSBbZGVzdHJveV0oI0NvbW1hbmQkZGVzdHJveSlcbiAqL1xuXy5leHRlbmRQcm90byhDb21tYW5kLCB7XG4gICAgaW5pdDogQ29tbWFuZCRpbml0LFxuICAgIGV4ZWN1dGU6IENvbW1hbmQkZXhlY3V0ZSxcbiAgICBzZXRVbmRvOiBDb21tYW5kJHNldFVuZG8sXG4gICAgZ2V0VW5kbzogQ29tbWFuZCRnZXRVbmRvLFxuICAgIHVuZG86IENvbW1hbmQkdW5kbyxcbiAgICByZWRvOiBDb21tYW5kJGV4ZWN1dGUsIC8vIHNhbWUgZm9yIGNvbW1hbmQsIGRpZmZlcmVudCBmb3IgdHJhbnNhY3Rpb25cbiAgICBzZXRBcmd1bWVudHM6IENvbW1hbmQkc2V0QXJndW1lbnRzLFxuICAgIGFkZEFyZ3VtZW50czogQ29tbWFuZCRhZGRBcmd1bWVudHMsXG4gICAgZ2V0QXJndW1lbnRzOiBDb21tYW5kJGdldEFyZ3VtZW50cyxcbiAgICBjaGFuZ2VBcmd1bWVudHM6IENvbW1hbmQkY2hhbmdlQXJndW1lbnRzLFxuICAgIGRlc3Ryb3k6IENvbW1hbmQkZGVzdHJveSxcblxuICAgIHNldENvbW1lbnQ6IENvbW1hbmQkc2V0Q29tbWVudCxcbiAgICBnZXREZXNjcmlwdGlvbjogQ29tbWFuZCRnZXREZXNjcmlwdGlvblxufSk7XG5cblxuLyoqXG4gKiBDb21tYW5kIGNsYXNzIG1ldGhvZHNcbiAqXG4gKiAtIFtjcmVhdGVdKCNDb21tYW5kJCRjcmVhdGUpIC0gY29tbWFuZHMgZmFjdG9yeVxuICovXG5fLmV4dGVuZChDb21tYW5kLCB7XG4gICAgY3JlYXRlOiBDb21tYW5kJCRjcmVhdGUsXG4gICAgY3JlYXRlV2l0aFVuZG86IENvbW1hbmQkJGNyZWF0ZVdpdGhVbmRvXG59KTtcblxuXG5mdW5jdGlvbiBDb21tYW5kJGluaXQoZnVuYykgeyAvLyAsIC4uLiBhcmd1bWVudHNcbiAgICBjaGVjayhmdW5jLCBNYXRjaC5PcHRpb25hbChGdW5jdGlvbikpO1xuICAgIHRoaXMuZnVuYyA9IGZ1bmMgfHwgZnVuY3Rpb24oKXt9O1xuICAgIHRoaXMuYXJncyA9IF8uc2xpY2UoYXJndW1lbnRzLCAxKTsgICAgXG59XG5cblxuLyoqXG4gKiBFeGVjdXRlIGNvbW1hbmQgbWFraW5nIGNvbW1hbmQgb2JqZWN0IGF2YWlsYWJsZSB2aWEgZnVuY3Rpb24gcHJvcGVydHkuIFxuICovXG5mdW5jdGlvbiBDb21tYW5kJGV4ZWN1dGUoY2IpIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5mdW5jLmFwcGx5KHRoaXMsIHRoaXMuYXJncyk7XG4gICAgaWYgKGNiKSBfLmRlZmVyKGNiKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5cbi8qKlxuICogU2V0IHVuZG8gY29tbWFuZCBmb3IgdGhpcyBjb21tYW5kLiBUaGlzIGNvbW1hbmQgYmVjb21lcyB1bmRvIGNvbW1hbmQgZm9yIHVuZG8gY29tbWFuZCAoc28gdW5kbyBjb21tYW5kIGNhbiBjaGFuZ2UgdGhpcyBjb21tYW5kIGR1cmluZyBpdHMgZXhlY3V0aW9uKS5cbiAqIFxuICogQHBhcmFtIHtDb21tYW5kfSB1bmRvQ29tbWFuZFxuICovXG5mdW5jdGlvbiBDb21tYW5kJHNldFVuZG8odW5kb0NvbW1hbmQpIHtcbiAgICBpZiAodGhpc1tVTkRPX0NPTU1BTkRdKVxuICAgICAgICBsb2dnZXIud2FybignQ29tbWFuZCBzZXRVbmRvOiB1bmRvIGNvbW1hbmQgaXMgYWxyZWFkeSBzZXQnKTtcblxuICAgIHRoaXNbVU5ET19DT01NQU5EXSA9IHVuZG9Db21tYW5kO1xuICAgIHVuZG9Db21tYW5kW1VORE9fQ09NTUFORF0gPSB0aGlzO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyB1bmRvIGNvbW1hbmQgb2YgYSBnaXZlbiBjb21tYW5kXG4gKlxuICogQHJldHVybiB7Q29tbWFuZH1cbiAqL1xuZnVuY3Rpb24gQ29tbWFuZCRnZXRVbmRvKCkge1xuICAgIHJldHVybiB0aGlzW1VORE9fQ09NTUFORF07XG59XG5cblxuLyoqXG4gKiBFeGVjdXRlcyB1bmRvIGNvbW1hbmQgb2YgY3VycmVudCBjb21tYW5kXG4gKi9cbmZ1bmN0aW9uIENvbW1hbmQkdW5kbyhjYikge1xuICAgIHZhciB1bmRvQ21kID0gdGhpcy5nZXRVbmRvKCk7XG4gICAgaWYgKCEgdW5kb0NtZCkgcmV0dXJuIGxvZ2dlci5lcnJvcignQ29tbWFuZCB1bmRvIGNhbGxlZCB3aXRob3V0IHVuZG8gY29tbWFuZCBwcmVzZW50Jyk7XG4gICAgdmFyIHJlc3VsdCA9IHVuZG9DbWQuZXhlY3V0ZSgpO1xuICAgIGlmIChjYikgXy5kZWZlcihjYik7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG4vKipcbiAqIFNldCBjb21tYW5kJ3MgYXJndW1lbnRzLiBJZiBhcmd1bWVudHMgd2VyZSBzZXQgZHVyaW5nIGNvbW1hbmQncyBjcmVhdGlvbiwgdGhpcyBtZXRob2Qgd2lsbCBvdmVyd3JpdGUgYXJndW1lbnRzIGFuZCBsb2cgd2FybmluZy5cbiAqXG4gKiBAcGFyYW0ge0xpc3R9ICphcmd1bWVudHNcbiAqL1xuZnVuY3Rpb24gQ29tbWFuZCRzZXRBcmd1bWVudHMoKSB7IC8vLCAuLi4gYXJndW1lbnRzXG4gICAgaWYgKHRoaXMuYXJncyAmJiB0aGlzLmFyZ3MubGVuZ3RoKVxuICAgICAgICBsb2dnZXIud2FybignQ29tbWFuZCBzZXRBcmd1bWVudHM6IGNvbW1hbmQgYXJndW1lbnRzIGFyZSBhbHJlYWR5IHNldCcpO1xuICAgIHRoaXMuYXJncyA9IF8udG9BcnJheShhcmd1bWVudHMpO1xufVxuXG5cbmZ1bmN0aW9uIENvbW1hbmQkZ2V0QXJndW1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLmFyZ3M7XG59XG5cblxuZnVuY3Rpb24gQ29tbWFuZCRjaGFuZ2VBcmd1bWVudHMoKSB7IC8vLCAuLi4gYXJndW1lbnRzXG4gICAgdGhpcy5hcmdzID0gXy50b0FycmF5KGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiBBZGQgKGFwcGVuZCkgYXJndW1lbnRzIHRvIGNvbW1hbmRcbiAqXG4gKiBAcGFyYW0ge0xpc3R9ICphcmd1bWVudHMgYXJndW1lbnRzIGxpc3QgdG8gYmUgYXBwZW5kZWQgdG8gY29tbWFuZFxuICovXG5mdW5jdGlvbiBDb21tYW5kJGFkZEFyZ3VtZW50cygpIHsgLy8sIC4uLiBhcmd1bWVudHNcbiAgICBpZiAoISB0aGlzLmFyZ3MpIHRoaXMuYXJncyA9IFtdO1xuICAgIF8uYXBwZW5kQXJyYXkodGhpcy5hcmdzLCBhcmd1bWVudHMpO1xufVxuXG5cbi8qKlxuICogQ29tbWFuZHMgZmFjdG9yeS4gTGlrZWx5IG90IGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyB0byBpbXBsZW1lbnQgY3VzdG9tIGxvZ2ljIG9mIGNvbW1hbmQgY29uc3RydWN0aW9uXG4gKiBcbiAqIEB0aGlzIHtGdW5jdGlvbn0gQ2xhc3Mgb2YgY29tbWFuZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBtZXRob2QgbmFtZSBvciBmdW5jdGlvbiB0byBiZSBleGVjdXRlZFxuICogQHBhcmFtIHtMaXN0fSAqYXJndW1lbnRzIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIG1ldGhvZCBvciBmdW5jdGlvblxuICogQHJldHVybiB7Q29tbWFuZH1cbiAqL1xuZnVuY3Rpb24gQ29tbWFuZCQkY3JlYXRlKGZ1bmMpIHsgLy8gLCAuLi4gYXJndW1lbnRzXG4gICAgcmV0dXJuIF8ubmV3QXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG5mdW5jdGlvbiBDb21tYW5kJCRjcmVhdGVXaXRoVW5kbygpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyZWF0ZVdpdGhVbmRvIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBzdWJzY2xhc3MnKTtcbn1cblxuXG4vKipcbiAqIERlc3Ryb3kgY3VycmVudCBjb21tYW5kICh0byBwcmV2ZW50IHBvdGVudGlhbCBtZW1vcnkgbGVha3Mgd2hlbiBjb21tYW5kcyBwb2ludCB0byBET00gZWxlbWVudHMpXG4gKi9cbmZ1bmN0aW9uIENvbW1hbmQkZGVzdHJveSgpIHtcbiAgICBkZWxldGUgdGhpcy5mdW5jO1xuICAgIGRlbGV0ZSB0aGlzLmFyZ3M7XG4gICAgdmFyIHVuZG9DbWQgPSB0aGlzW1VORE9fQ09NTUFORF07XG4gICAgaWYgKHVuZG9DbWQpIHtcbiAgICAgICAgZGVsZXRlIHRoaXNbVU5ET19DT01NQU5EXVtVTkRPX0NPTU1BTkRdO1xuICAgICAgICBkZWxldGUgdGhpc1tVTkRPX0NPTU1BTkRdO1xuICAgICAgICB1bmRvQ21kLmRlc3Ryb3koKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gQ29tbWFuZCRzZXRDb21tZW50KGNvbW1lbnQpIHtcbiAgICB0aGlzLmNvbW1lbnQgPSBjb21tZW50O1xufVxuXG5cbmZ1bmN0aW9uIENvbW1hbmQkZ2V0RGVzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZnVuYzogdGhpcy5mdW5jLm5hbWUsXG4gICAgICAgIGNvbW1lbnQ6IHRoaXMuY29tbWVudFxuICAgIH07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIEFjdGlvbnNIaXN0b3J5ID0gcmVxdWlyZSgnLi9hY3Rpb25zX2hpc3RvcnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gVHJhbnNhY3Rpb247XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24oKSB7XG4gICAgdGhpcy5jb21tYW5kcyA9IG5ldyBBY3Rpb25zSGlzdG9yeTtcbn1cblxuXG5fLmV4dGVuZFByb3RvKFRyYW5zYWN0aW9uLCB7XG4gICAgZXhlY3V0ZTogVHJhbnNhY3Rpb24kZXhlY3V0ZSxcbiAgICB1bmRvOiBUcmFuc2FjdGlvbiR1bmRvLFxuICAgIHJlZG86IFRyYW5zYWN0aW9uJHJlZG8sXG4gICAgZGVzdHJveTogVHJhbnNhY3Rpb24kZGVzdHJveSxcbiAgICBzdG9yZUNvbW1hbmQ6IFRyYW5zYWN0aW9uJHN0b3JlQ29tbWFuZCxcbiAgICBtZXJnZTogVHJhbnNhY3Rpb24kbWVyZ2UsXG5cbiAgICBzZXRDb21tZW50OiBUcmFuc2FjdGlvbiRzZXRDb21tZW50LFxuICAgIGdldERlc2NyaXB0aW9uOiBUcmFuc2FjdGlvbiRnZXREZXNjcmlwdGlvblxufSk7XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24kZXhlY3V0ZSgpIHtcbiAgICB0aGlzLmNvbW1hbmRzLmVhY2goJ2V4ZWN1dGUnKTtcbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbiR1bmRvKGNiKSB7XG4gICAgdGhpcy5jb21tYW5kcy51bmRvQWxsQXN5bmMoY2IpO1xufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uJHJlZG8oY2IpIHtcbiAgICB0aGlzLmNvbW1hbmRzLnJlZG9BbGxBc3luYyhjYik7XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24kZGVzdHJveSgpIHtcbiAgICB0aGlzLmNvbW1hbmRzLmVhY2goJ2Rlc3Ryb3knKTtcbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbiRzdG9yZUNvbW1hbmQoY29tbWFuZCkge1xuICAgIHRoaXMuY29tbWFuZHMuc3RvcmUoY29tbWFuZCk7XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24kbWVyZ2UodHJhbnNhY3Rpb24pIHtcbiAgICB0cmFuc2FjdGlvbi5jb21tYW5kcy5lYWNoKGZ1bmN0aW9uKGNtZCkge1xuICAgICAgICB0aGlzLmNvbW1hbmRzLnN0b3JlKGNtZCk7XG4gICAgfSwgdGhpcyk7XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb24kc2V0Q29tbWVudChjb21tZW50KSB7XG4gICAgdGhpcy5jb21tZW50ID0gY29tbWVudFxufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uJGdldERlc2NyaXB0aW9uKCkge1xuICAgIHZhciBjb21tYW5kcyA9IHRoaXMuY29tbWFuZHMuZ2V0RGVzY3JpcHRpb24oKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYW5kczogY29tbWFuZHMuYWN0aW9ucyxcbiAgICAgICAgY29tbWVudDogdGhpcy5jb21tZW50XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBBY3Rpb25zSGlzdG9yeSA9IHJlcXVpcmUoJy4vYWN0aW9uc19oaXN0b3J5JylcbiAgICAsIFRyYW5zYWN0aW9uID0gcmVxdWlyZSgnLi90cmFuc2FjdGlvbicpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2FjdGlvbkhpc3Rvcnk7XG5cblxudmFyIFNDSEVEVUxFRCA9ICdfc2NoZWR1bGVkJztcblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3RvcnkobWF4TGVuZ3RoKSB7XG4gICAgdGhpcy50cmFuc2FjdGlvbnMgPSBuZXcgQWN0aW9uc0hpc3RvcnkobWF4TGVuZ3RoKTtcbiAgICB0aGlzLmN1cnJlbnRCYXRjaCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzW1NDSEVEVUxFRF0gPSBmYWxzZTtcbn1cblxuXG5fLmV4dGVuZFByb3RvKFRyYW5zYWN0aW9uSGlzdG9yeSwge1xuICAgIHN0b3JlQ29tbWFuZDogVHJhbnNhY3Rpb25IaXN0b3J5JHN0b3JlQ29tbWFuZCxcbiAgICBlbmRUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb25IaXN0b3J5JGVuZFRyYW5zYWN0aW9uLFxuICAgIHN0b3JlVHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uSGlzdG9yeSRzdG9yZVRyYW5zYWN0aW9uLFxuICAgIGRlbGV0ZUxhc3RUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb25IaXN0b3J5JGRlbGV0ZUxhc3RUcmFuc2FjdGlvbixcbiAgICB1bmRvOiBUcmFuc2FjdGlvbkhpc3RvcnkkdW5kbyxcbiAgICByZWRvOiBUcmFuc2FjdGlvbkhpc3RvcnkkcmVkbyxcbiAgICBpblRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkhpc3RvcnkkaW5UcmFuc2FjdGlvbixcblxuICAgIGdldERlc2NyaXB0aW9uOiBUcmFuc2FjdGlvbkhpc3RvcnkkZ2V0RGVzY3JpcHRpb24sXG4gICAgdXNlTWVzc2VuZ2VyOiBUcmFuc2FjdGlvbkhpc3RvcnkkdXNlTWVzc2VuZ2VyLFxuICAgIGRlc3Ryb3k6IFRyYW5zYWN0aW9uSGlzdG9yeSRkZXN0cm95XG59KTtcblxuXG4vKipcbiAqIFN0b3JlcyBjb21tYW5kIGluIHRoZSBoaXN0b3J5LiBcbiAqIEBwYXJhbSB7Q29tbWFuZH0gY29tbWFuZCAgICAgICAgICAgXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGFwcGVuZFRyYW5zYWN0aW9uIElmIGB0cnVlYCwgYXBwZW5kcyB0byB0aGUgY3VycmVudCBvciBwcmV2aW91cyB0cmFuc2FjdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHRyYW5zYWN0aW9uLlxuICovXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3Rvcnkkc3RvcmVDb21tYW5kKGNvbW1hbmQsIGFwcGVuZFRyYW5zYWN0aW9uKSB7XG4gICAgaWYgKGFwcGVuZFRyYW5zYWN0aW9uICYmICEodGhpcy5jdXJyZW50VHJhbnNhY3Rpb24gfHwgdGhpcy5jdXJyZW50QmF0Y2gpKSB7XG4gICAgICAgIHZhciB0cmFuc2FjdGlvbiA9IHRoaXMudHJhbnNhY3Rpb25zLmdldExhc3RBY3Rpb24oKTtcbiAgICAgICAgdHJhbnNhY3Rpb24uc3RvcmVDb21tYW5kKGNvbW1hbmQpO1xuICAgICAgICBfcG9zdFRyYW5zYWN0aW9uTWVzc2FnZS5jYWxsKHRoaXMsICdhcHBlbmRlZCcsIHRyYW5zYWN0aW9uKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghIHRoaXMuY3VycmVudEJhdGNoKSB0aGlzLmN1cnJlbnRCYXRjaCA9IG5ldyBUcmFuc2FjdGlvbjtcbiAgICB0aGlzLmN1cnJlbnRCYXRjaC5zdG9yZUNvbW1hbmQoY29tbWFuZCk7XG4gICAgaWYgKCEgdGhpc1tTQ0hFRFVMRURdKSB7XG4gICAgICAgIHRoaXNbU0NIRURVTEVEXSA9IHRydWU7XG4gICAgICAgIF8uZGVmZXJNZXRob2QodGhpcywgX3N0b3JlVHJhbnNhY3Rpb24pO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3RvcnkkZGVsZXRlTGFzdFRyYW5zYWN0aW9uKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRCYXRjaCB8fCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbikge1xuICAgICAgICB0aGlzLmN1cnJlbnRCYXRjaCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMuZGVsZXRlTGFzdCgpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBfc3RvcmVUcmFuc2FjdGlvbigpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50QmF0Y2gpIHtcbiAgICAgICAgX2FkZEJhdGNoVG9UcmFuc2FjdGlvbi5jYWxsKHRoaXMpO1xuICAgICAgICBfLmRlZmVyTWV0aG9kKHRoaXMsIF9zdG9yZVRyYW5zYWN0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBfc3RvcmVDdXJyZW50VHJhbnNhY3Rpb24uY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpc1tTQ0hFRFVMRURdID0gZmFsc2U7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uSGlzdG9yeSRlbmRUcmFuc2FjdGlvbigpIHtcbiAgICBfYWRkQmF0Y2hUb1RyYW5zYWN0aW9uLmNhbGwodGhpcyk7XG4gICAgX3N0b3JlQ3VycmVudFRyYW5zYWN0aW9uLmNhbGwodGhpcyk7XG59XG5cblxuZnVuY3Rpb24gX2FkZEJhdGNoVG9UcmFuc2FjdGlvbigpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50QmF0Y2gpIHtcbiAgICAgICAgaWYgKCEgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24pIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uO1xuICAgICAgICB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi5tZXJnZSh0aGlzLmN1cnJlbnRCYXRjaCk7XG4gICAgICAgIHRoaXMuY3VycmVudEJhdGNoID0gdW5kZWZpbmVkO1xuICAgIH0gXG59XG5cblxuZnVuY3Rpb24gX3N0b3JlQ3VycmVudFRyYW5zYWN0aW9uKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbikge1xuICAgICAgICB2YXIgdCA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uO1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucy5zdG9yZSh0KTtcbiAgICAgICAgX3Bvc3RUcmFuc2FjdGlvbk1lc3NhZ2UuY2FsbCh0aGlzLCAnc3RvcmVkJywgdCk7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uSGlzdG9yeSRzdG9yZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSB7XG4gICAgdGhpcy5lbmRUcmFuc2FjdGlvbigpO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbnMuc3RvcmUodHJhbnNhY3Rpb24pO1xuICAgIF9wb3N0VHJhbnNhY3Rpb25NZXNzYWdlLmNhbGwodGhpcywgJ3N0b3JlZCcsIHRyYW5zYWN0aW9uKTtcbn1cblxuXG5mdW5jdGlvbiBfcG9zdFRyYW5zYWN0aW9uTWVzc2FnZShtc2csIHRyYW5zYWN0aW9uKSB7XG4gICAgaWYgKHRoaXMuX21lc3NlbmdlcilcbiAgICAgICAgdGhpcy5fbWVzc2VuZ2VyLnBvc3RNZXNzYWdlKG1zZywgeyB0cmFuc2FjdGlvbjogdHJhbnNhY3Rpb24gfSk7XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb25IaXN0b3J5JHVuZG8oY2IpIHtcbiAgICB2YXIgdCA9IHRoaXMudHJhbnNhY3Rpb25zLnVuZG8oY2IpO1xuICAgIGlmICh0KSBfcG9zdFRyYW5zYWN0aW9uTWVzc2FnZS5jYWxsKHRoaXMsICd1bmRvbmUnLCB0KTtcbiAgICByZXR1cm4gdDtcbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3RvcnkkcmVkbyhjYikge1xuICAgIHZhciB0ID0gdGhpcy50cmFuc2FjdGlvbnMucmVkbyhjYik7XG4gICAgaWYgKHQpIF9wb3N0VHJhbnNhY3Rpb25NZXNzYWdlLmNhbGwodGhpcywgJ3JlZG9uZScsIHQpO1xuICAgIHJldHVybiB0O1xufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uSGlzdG9yeSRpblRyYW5zYWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzW1NDSEVEVUxFRF07XG59XG5cblxuZnVuY3Rpb24gVHJhbnNhY3Rpb25IaXN0b3J5JGdldERlc2NyaXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9ucy5nZXREZXNjcmlwdGlvbigpO1xufVxuXG5cbmZ1bmN0aW9uIFRyYW5zYWN0aW9uSGlzdG9yeSR1c2VNZXNzZW5nZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcywgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcbn1cblxuXG5mdW5jdGlvbiBUcmFuc2FjdGlvbkhpc3RvcnkkZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5fbWVzc2VuZ2VyKSB0aGlzLl9tZXNzZW5nZXIuZGVzdHJveSgpO1xuICAgIGRlbGV0ZSB0aGlzLnRyYW5zYWN0aW9ucztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgRmFjZXRlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2Fic3RyYWN0L2ZhY2V0ZWRfb2JqZWN0JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jX2ZhY2V0cy9jZl9yZWdpc3RyeScpXG4gICAgLCBDb21wb25lbnRGYWNldCA9IGZhY2V0c1JlZ2lzdHJ5LmdldCgnQ29tcG9uZW50RmFjZXQnKVxuICAgICwgY29tcG9uZW50VXRpbHMgPSByZXF1aXJlKCcuL2NfdXRpbHMnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaFxuICAgICwgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJylcbiAgICAsIG1pbG9Db21wb25lbnROYW1lID0gcmVxdWlyZSgnLi4vdXRpbC9jb21wb25lbnRfbmFtZScpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgZG9tVXRpbHMgPSByZXF1aXJlKCcuLi91dGlsL2RvbScpXG4gICAgLCBCaW5kQXR0cmlidXRlID0gcmVxdWlyZSgnLi4vYXR0cmlidXRlcy9hX2JpbmQnKVxuICAgICwgU2NvcGUgPSByZXF1aXJlKCcuL3Njb3BlJylcbiAgICAsIERPTVN0b3JhZ2UgPSByZXF1aXJlKCcuLi91dGlsL3N0b3JhZ2UnKTtcblxudmFyIF9tYWtlQ29tcG9uZW50Q29uZGl0aW9uRnVuYyA9IGNvbXBvbmVudFV0aWxzLl9tYWtlQ29tcG9uZW50Q29uZGl0aW9uRnVuYztcblxuXG4vKipcbiAqIGBtaWxvLkNvbXBvbmVudGBcbiAqIEJhc2UgQ29tcG9uZW50IGNsYXNzLiBTdWJjbGFzcyBvZiBbRmFjZXRlZE9iamVjdF0oLi4vYWJzdHJhY3QvZmFjZXRlZF9vYmplY3QuanMuaHRtbCksIGJ1dCBub25lIG9mIHRoaXMgY2xhc3MgbWV0aG9kcyBzaG91bGQgYmUgZGlyZWN0bHkgdXNlZCB3aXRoIGNvbXBvbmVudC5cbiAqIEl0cyBjb25zdHJ1Y3RvciBwYXNzZXMgaXRzIHBhcmFtZXRlcnMsIGluY2x1ZGluZyBpdHMgW3Njb3BlXSguL3Njb3BlLmpzLmh0bWwpLCBET00gZWxlbWVudCBhbmQgbmFtZSB0byBbYGluaXRgXSgjaW5pdCkgbWV0aG9kLlxuICogVGhlIGNvbnN0cnVjdG9yIG9mIENvbXBvbmVudCBjbGFzcyByYXJlbHkgbmVlZHMgdG8gYmUgdXNlZCBkaXJlY3RseSwgYXMgW21pbG8uYmluZGVyXSguLi9iaW5kZXIuanMuaHRtbCkgY3JlYXRlcyBjb21wb25lbnRzIHdoZW4gaXQgc2NhbnMgRE9NIHRyZWUuXG4gKiBbYENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzc2BdKCNjcmVhdGVDb21wb25lbnRDbGFzcykgc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIGEgc3ViY2xhc3Mgb2YgQ29tcG9uZW50IGNsYXNzIHdpdGggY29uZmlndXJlZCBmYWNldHMuXG4gKlxuICpcbiAqICMjIyNDb21wb25lbnQgaW5zdGFuY2UgcHJvcGVydGllcyMjIyNcbiAqXG4gKiAtIGVsIC0gRE9NIGVsZW1lbnQgdGhhdCBjb21wb25lbnQgaXMgYXR0YWNoZWQgdG8uIElmIHRoZSBzZWNvbmQgY29tcG9uZW50IGlzIGF0dGFjaGVkIHRvIHRoZSBzYW1lIERPTSBlbGVtZW50LCB0aGUgd2FybmluZyB3aWxsIGJlIGxvZ2dlZCB0byBjb25zb2xlLiBUbyBnZXQgY29tcG9uZW50IHJlZmVyZW5jZSBmcm9tIERPTSBlbGVtZW50IHVzZSBbQ29tcG9uZW50LmdldENvbXBvbmVudF0oLi9jX3V0aWxzLmpzLmh0bWwjZ2V0Q29tcG9uZW50KSBjbGFzcyBtZXRob2QuIFRvIGluc3BlY3QgY29tcG9uZW50IHZpYSBlbGVtZW50IGluIGJyb3dzZXIgY2hlY2sgYF9fX21pbG9fY29tcG9uZW50YCBwcm9wZXJ0eSBvZiBlbGVtZW50IChwcm9wZXJ0eSBuYW1lIGJlIGNoYW5nZWQgdXNpbmcgYG1pbG8uY29uZmlnYCkuXG4gKiAtIHNjb3BlIC0gcGFyZW50IHNjb3BlIG9iamVjdCwgYW4gaW5zdGFuY2Ugb2YgW1Njb3BlXSguL3Njb3BlLmpzLmh0bWwpIGNsYXNzLiBUbyBnZXQgcGFyZW50IGNvbXBvbmVudCB1c2UgW2dldFNjb3BlUGFyZW50XSgjQ29tcG9uZW50JGdldFNjb3BlUGFyZW50KSBpbnN0YW5jZSBtZXRob2Qgb2YgY29tcG9uZW50LiBUaGUgYWN0dWFsIHBhdGggdG8gZ2V0IHBhcmVudCBvZiBjb25wb25lbnQgaXMgYGNvbXBvbmVudC5zY29wZS5faG9zdE9iamVjdC5vd25lcmAsIHdoZXJlIGBfaG9zdE9iamVjdGAgcmVmZXJzIHRvIFtDb250YWluZXJdKGNfZmFjZXRzL0NvbnRhaW5lci5qcy5odG1sKSBmYWNldCBvZiBwYXJlbnQgY29tcG9uZW50IGFuZCBgb3duZXJgIHRvIHRoZSBwYXJlbnQgaXRzZWxmLiBUaGUgY2hpbGRyZW4gb2YgY29tcG9uZW50IGFyZSBhY2Nlc3NpYmxlIHZpYSB0aGUgc2NvcGUgb2YgaXRzIGNvbnRhaW5lciBmYWNldDogYGNvbXBvbmVudC5jb250YWluZXIuc2NvcGVgLiBUaGUgc2NvcGUgaGllcmFyY2h5IGNhbiBiZSB0aGUgc2FtZSBvciBkaWZmZXJlbnQgYXMgdGhlIERPTSBoaWVyYXJjaHkgLSBET00gY2hpbGRyZW4gb2YgdGhlIGNvbXBvbmVudCB3aWxsIGJlIG9uIHRoZSBzYW1lIHNjb3BlIGFzIGNvbXBvbmVudCBpZiBpdCBkb2VzIG5vdCBoYXZlIGBDb250YWluZXJgIGZhY2V0IGFuZCBpbiB0aGUgc2NvcGUgb2YgaXRzIENvbnRhaW5lciBmYWNldCBpZiBpdCBoYXMgaXQuIFNlZSBbU2NvcGVdKC4vc2NvcGUuanMuaHRtbCkuXG4gKiAtIG5hbWUgLSB0aGUgbmFtZSBvZiBjb21wb25lbnQsIHNob3VsZCBiZSB1bmlxdWUgZm9yIHRoZSBzY29wZSB3aGVyZSBjb21wb25lbnQgYmVsb25ncy4gVG8gZmluZCBjb21wb25lbnQgaW4gc2NvcGUgdGhlIGNvbXBvbmVudCdzIG5hbWUgc2hvdWxkIGJlIHVzZWQgYXMgcHJvcGVydHkgb2Ygc2NvcGUgb2JqZWN0LiBTZWUgW1Njb3BlXSguL3Njb3BlLmpzLmh0bWwpLlxuICogLSBmYWNldHMgLSBtYXAgb2YgcmVmZXJlbmNlcyBvZiBhbGwgY29tcG9uZW50J3MgZmFjZXRzIChmYWNldCBuYW1lcyBhcmUgbG93ZXJjYXNlIGluIHRoaXMgbWFwKS4gQWxsIGZhY2V0cyBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgYXMgcHJvcGVydGllcyBvZiBjb21wb25lbnQsIHRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gaXRlcmF0ZSBmYWNldHMgKGl0IGlzIHVzZWQgaW4gdGhpcyB3YXkgaW4gW2FsbEZhY2V0c10oI0NvbXBvbmVudCRhbGxGYWNldHMpIGNvbXBvbmVudCdzIGluc3RhbmNlIG1ldGhvZCB0aGF0IGFsbG93cyB0byBjYWxsIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUgb24gYWxsIGZhY2V0cykuXG4gKiAtIGV4dHJhRmFjZXRzIC0gYW4gYXJyYXkgb2YgbmFtZXMgb2YgZmFjZXRzIHRoYXQgYXJlIGFkZGVkIHRvIGNvbXBvbmVudCBhbmQgZG8gbm90IGZvcm0gdGhlIHBhcnQgb2YgY29tcG9uZW50J3MgY2xhc3MuXG4gKiAtIF9tZXNzZW5nZXIgLSB0aGUgcmVmZXJlbmNlIHRvIGNvbXBvbmVudCdzIFttZXNzZW5nZXJdKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sKS4gUmFyZWx5IG5lZWRzIHRvIGJlIHVzZWQgZGlyZWN0bHkgYXMgYWxsIGNvbW1vbmx5IHVzZWQgbWV0aG9kcyBvZiBtZXNlbmdlciBhcmUgYXZhaWxhYmxlIGRpcmVjdGx5IG9uIGNvbXBvbmVudC5cbiAqXG4gKlxuICogIyMjI0NvbXBvbmVudCBldmVudHMjIyMjXG4gKlxuICogLSAnY2hpbGRyZW5ib3VuZCcgLSBzeW5jaHJvbm91c2x5IGRpc3BhdGNoZWQgd2hlbiBjaGlsZHJlbiBvZiBET00gZWxlbWVudCB3aGljaCBjb21wbmVudCBpcyBjb25uZWN0ZWQgdG8gYXJlIGNvbm5lY3RlZCB0byBjb21wb25lbnRzLiBUaGUgZXZlbnQgaXMgZGlzcGF0Y2hlZCB3aGVuIGNvbXBvbmVudCBpcyBjcmVhdGVkIHdpdGggYG1pbG8uYmluZGVyYCAoYXMgaXMgYWxtb3N0IGFsd2F5cyB0aGUgY2FzZSwgYXMgYWxsIENvbXBvbmVudCBjbGFzcyBtZXRob2RzIHRoYXQgY3JlYXRlL2NvcHkgY29tcG9uZW50cyB1c2UgYG1pbG8uYmluZGVyYCBpbnRlcm5hbGx5IC0gY29tcG9uZW50IGNvbnN0cnVjdG9yIGFuZCBDb21wb25lbnQuY3JlYXRlIG1ldGhvZHMgYXJlIG5vdCB1c2VkIGluIGZyYW1ld29yayBvdXRzaWRlIG9mIGBtaWxvLmJpbmRlcmAgYW5kIHJhcmVseSBpZiBldmVyIG5lZWQgdG8gYmUgdXNlZCBpbiBhcGxpY2F0aW9uKS5cbiAqIC0gJ2FkZGVkdG9zY29wZScgLSBzeW5jaHJvbm91c2x5IGRpc3BhdGNoZWQgd2hlbiBjb21wb25lbnQgaXMgYWRkZWQgdG8gc2NvcGUuXG4gKiAtICdzdGF0ZXJlYWR5JyAtIGF5bmNocm9ub3VzbHkgZGlzcGF0Y2hlZCB3aGVuIGNvbXBvbmVudCAodG9nZXRoZXIgd2l0aCBpdHMgc2NvcGUgY2hpbGRyZW4pIGlzIGNyZWF0ZWQgd2l0aCBbQ29tcG9uZW50LmNyZWF0ZUZyb21TdGF0ZV0oI0NvbXBvbmVudCQkY3JlYXRlRnJvbVN0YXRlKSAob3IgYGNyZWF0ZUZyb21EYXRhVHJhbnNmZXJgKSBtZXRob2QuIENhbiBiZSBkaXNwYXRjaGVkIGJ5IGFwcGxpY2F0aW9uIGlmIHRoZSBjb21wb25lbnQncyBzdGF0ZSBpcyBzZXQgd2l0aCBzb21lIG90aGVyIG1lY2hhbmlzbS4gVGhpcyBldmVudCBpcyBub3QgdXNlZCBpbiBgbWlsb2AsIGl0IGNhbiBiZSB1c2VkIGluIGFwcGxpY2F0aW9uIGluIHBhcnRpY3VsYXIgc3ViY2xhc3NlcyBvZiBjb21wb25lbnQuXG4gKiAtICdnZXRzdGF0ZXN0YXJ0ZWQnIC0gZW1pdHRlZCBzeW5jaHJvbm91c2x5IGp1c3QgYmVmb3JlIGdldFN0YXRlIGV4ZWN1dGVzIHNvIGNvbXBvbmVudHMgYW5kIGZhY2V0cyBjYW4gY2xlYW4gdXAgdGhlaXIgc3RhdGUgZm9yIHNlcmlhbGl6YXRpb24uIFxuICogLSAnZ2V0c3RhdGVjb21wbGV0ZWQnIC0gZW1pdHRlZCBhc3luY2hyb25vdXNseSBhZnRlciBnZXRTdGF0ZSBleGVjdXRlcyBzbyBjb21wb25lbnRzIGFuZCBmYWNldHMgY2FuIHJlc3RvcmUgdGhlaXIgc3RhdGUgYWZ0ZXIgc2VyaWFsaXphdGlvbi5cbiAqXG4gKlxuICogIyMjI0NvbXBvbmVudCBcImxpZmVjeWNsZVwiIyMjI1xuICpcbiAqIDEuIENvbXBvbmVudCBjb25zdHJ1Y3RvciBpcyBjYWxsZWQuIENvbXBvbmVudCdzIGNvbnN0cnVjdG9yIHNpbXBseSBjYWxscyBjb25zdHJ1Y3RvciBvZiBbRmFjZXRlZE9iamVjdF0oLi4vYWJzdHJhY3QvZmFjZXRlZF9vYmplY3QuanMuaHRtbCkgdGhhdCBpcyBhIHN1cGVyY2xhc3Mgb2YgQ29tcG9uZW50LiBTdWJjbGFzc2VzIG9mIENvbXBvbmVudCBzaG91bGQgbm90IGltcGxlbWVudCB0aGVpciBvd24gY29uc3RydWN0b3IsIHRoZXkgY2FuIG9wdGlvbmFsbHkgaW1wbGVtZW50IGBpbml0YCBtZXRob2QsIGJ1dCBtb3N0IGNvbXBvbmVudHMgZG8gbm90IG5lZWQgdG8gZG8gaXQuXG4gKiAyLiBjb25zdHJ1Y3RvcnMgYW5kIGBpbml0YCBtZXRob2RzIG9mIGFsbCBmYWNldHMgYXJlIGNhbGxlZCBpbiBzZXF1ZW5jZS4gU2FtZSBhcyBjb21wb25lbnRzLCBmYWNldCBkbyBub3QgaW1wbGVtZW50IHRoZWlyIGNvbnN0cnVjdG9ycywgdGhleSBjYW4gb3B0aW9uYWxseSBpbXBsZW1lbnQgYGluaXRgIGFuZCBgc3RhcnRgIG1ldGhvZHMgKHNlZSBiZWxvdykuIEluc2lkZSBgaW5pdGAgbWV0aG9kIHRoZXJlIHNob3VsZCBiZSBvbmx5IGdlbmVyYWwgaW5pdGlhbGl6YXRpb24gY29kZSB3aXRob3V0IGFueSBkZXBlbmRlbmN5IG9uIGNvbXBvbmVudCBpdHNlbGYgKGl0IGlzIG5vdCByZWFkeSB5ZXQpIGFuZCBvdGhlciBmYWNldHMgKGFzIHRoZXJlIGlzIG5vIHNwZWNpZmljIGZhY2V0cyBjcmVhdGlvbiBvcmRlcikuIElmIGZhY2V0IGltcGxlbWVudHMgYGluaXRgIG1ldGhvZCBpdCBNVVNUIGNhbGwgaW5oZXJpdGVkIGluaXQgd2l0aCBgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKWAuXG4gKiAzLiBgaW5pdGAgbWV0aG9kIG9mIGNvbXBvbmVudCBpcyBjYWxsZWQuIEF0IHRoaXMgcG9pbnQgYWxsIGZhY2V0cyBhcmUgY3JlYXRlZCBidXQgZmFjZXRzIHN0aWxsIGNhbiBiZSBub3QgcmVhZHkgYXMgdGhleSBjYW4gaGF2ZSBpbml0aWFsaXphdGlvbiBjb2RlIGluIGBzdGFydGAgbWV0aG9kLiBJZiBjb21wb25lbnQgc3ViY2xhc3MgaW1wbGVtZW50cyBgaW5pdGAgbWV0aG9kIGl0IE1VU1QgY2FsbCBpbmhlcml0ZWQgbWV0aG9kIHdpdGggYDxTdXBlcmNsYXNzPi5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpYCwgd2hlcmUgPFN1cGVyY2xhc3M+IGlzIENvbXBvbmVudCBvciBhbm90aGVyIHN1cGVyY2xhc3MgdGhlIGNvbXBvbmVudCBpcyBhIHN1YmNsYXNzIG9mLlxuICogNC4gYGNoZWNrYCBtZXRob2Qgb2YgYWxsIGZhY2V0cyBpcyBjYWxsZWQuIFRoaXMgbWV0aG9kIGFkZHMgZmFjZXRzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBjb21wb25lbnQgZGVjbGFyYXRpb24gKGJlaW5nIHBhcnQgb2YgdGhlIGNsYXNzIG9yIGV4cGxpY2l0ZWx5IGxpc3RlZCBpbiBiaW5kIGF0dHJpYnV0ZSkgYnV0IGFyZSByZXF1aXJlZCBieSBmYWNldHMgdGhhdCB0aGUgY29tcG5lbnQgYWxyZWFkeSBoYXMuIFN1YmNsYXNzZXMgb2YgW0NvbXBvbmVudEZhY2V0XSguL2NfZmFjZXQuanMuaHRtbCkgZG8gbm90IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kLlxuICogNS4gYHN0YXJ0YCBtZXRob2Qgb2YgYWxsIGZhY2V0cyBpcyBjYWxsZWQuIFRoaXMgbWV0aG9kIGlzIHVzdWFsbHkgaW1wbGVtZW50ZWQgYnkgQ29tcG9uZW50RmFjZXQgc3ViY2xhc3NlcyBhbmQgaXQgY2FuIGhhdmUgYW55IGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBkZXBlbmRzIG9uIGNvbXBvbmVudCBvciBvbiBvdGhlciBmYWNldHMgdGhhdCBhcmUgdGhlIGRlcGVuZGVuY2llcyBvZiBhIGZhY2V0LiBJbmhlcml0ZWQgYHN0YXJ0YCBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbnQgaGUgc2FtZSB3YXkgYXMgd3JpdHRlbiBhYm92ZS5cbiAqIDYuIGBzdGFydGAgbWV0aG9kIG9mIGNvbXBvbmVudCBpcyBjYWxsZWQuIFRoaXMgY29tcG9uZW50IG1ldGhvZCBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyBpZiB0aGV5IG5lZWQgdG8gaGF2ZSBzb21lIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHNvbWUgZmFjZXRzIGFuZCByZXF1aXJlcyB0aGF0IHRoZXNlIGZhY2V0cyBhcmUgZnVsbHkgaW5pYWxpemVkLiBPZnRlbiBzdWNoIGNvZGUgYWxzbyBkZXBlbmRzIG9uIGNvbXBvbmVudCdzIHNjb3BlIGNoaWxkcmVuIGFzIHdlbGwgc28gdGhpcyBjb2RlIHNob3VsZCBiZSBpbnNpZGUgYCdjaGlsZHJlbmJvdW5kJ2AgZXZlbnQgc3Vic2NyaWJlci5cbiAqIDcuICdhZGRlZHRvc2NvcGUnIGV2ZW50IGlzIGRpc3BhdGNoZWQgd2hlbiBjb21wb25lbnQgaXMgYWRkZWQgdG8gaXRzIHBhcmVudCdzIHNjb3BlIG9yIHRvIHRvcCBsZXZlbCBzY29wZSBjcmVhdGVkIGJ5IGBtaWxvLmJpbmRlcmAuXG4gKiA4LiBjb21wb25lbnQncyBjaGlsZHJlbiBhcmUgY3JlYXRlZCAoc3RlcHMgMS02IGFib3ZlIGFyZSBmb2xsb3dlZCBmb3IgZWFjaCBjaGlsZCkuXG4gKiA5LiAnY2hpbGRyZW5ib3VuZCcgZXZlbnQgaXMgZGlzcGF0Y2hlZCB3aGVuIGFsbCBjb21wb25lbnQncyBjaGlsZHJlbiBhcmUgY3JlYXRlZCBhbmQgYWRkZWQgdG8gdGhlaXIgc2NvcGUgKHNlZSBldmVudCBkZXNjcmlwdGlvbiBiZWxvdykuXG4gKiAxMC4gJ3N0YXRlcmVhZHknIGV2ZW50IGlzIGRpc3BhdGNoZWQgZm9yIGNvbXBvbmVudCBhbmQgYWxsIGl0cyBjaGlsZHJlbiB3aGVuIGNvbXBvbmVudCBpcyBjcmVhdGUgZnJvbSBzdGF0ZSAoc2VlIGV2ZW50IGRlc2NyaXB0aW9uIGJlbG93KS5cbiAqIDExLiBhdCB0aGlzIHBvaW50IGNvbXBvbmVudCBpcyBpbiB0aGUgXCJpbnRlcmFjdGl2ZVwiIHN0YXRlIHdoZW4gaXQgYW5kIGl0cyBmYWNldHMgd2lsbCBvbmx5IHJlc3BvbmQgdG8gbWVzc2FnZXMvZXZlbnRzIHRoYXQgdGhleSBzdWJzY3JpYmVkIHRvIGR1cmluZyBpbml0aWFsaXphdGlvbi5cbiAqXG4gKlxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgc2NvcGUgdG8gd2hpY2ggY29tcG9uZW50IHdpbGwgYmVsb25nLiBJdCBpcyB1c3VhbGx5IGEgdG9wIGxldmVsIHNjb3BlIG9iamVjdCByZXR1cm5lZCBieSBgbWlsby5iaW5kZXJgIG9yIGBzY29wZWAgcHJvcGVydHkgb2YgQ29udGFpbmVyIGZhY2V0LlxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IERPTSBlbGVtZW50IHRoYXQgY29tcG9uZW50IGlzIGF0dGFjaGVkIHRvXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBjb21wb25lbnQgbmFtZSwgc2hvdWxkIGJlIHVuaXF1ZSBpbiB0aGUgc2NvcGUgb2YgY29tcG9uZW50XG4gKiBAcGFyYW0ge0NvbXBvbmVudEluZm99IGNvbXBvbmVudEluZm8gaW5zdGFuY2Ugb2YgQ29tcG9uZW50SW5mbyBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNvcHkgb2YgY29tcG9uZW50XG4gKiAgVE9ETyB0cnkgcmVtb3ZpbmcgaXRcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xudmFyIENvbXBvbmVudCA9IF8uY3JlYXRlU3ViY2xhc3MoRmFjZXRlZE9iamVjdCwgJ0NvbXBvbmVudCcsIHRydWUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbXBvbmVudDtcblxuX3JlZ2lzdGVyV2l0aERvbVN0b3JhZ2UoJ0NvbXBvbmVudCcpO1xuXG5cbi8qKlxuICogIyMjI0NvbXBvbmVudCBjbGFzcyBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2NyZWF0ZUNvbXBvbmVudENsYXNzXSgjQ29tcG9uZW50JCRjcmVhdGVDb21wb25lbnRDbGFzcylcbiAqIC0gW2NyZWF0ZV0oI0NvbXBvbmVudCQkY3JlYXRlKVxuICogLSBbY29weV0oI0NvbXBvbmVudCQkY29weSlcbiAqIC0gW2NyZWF0ZU9uRWxlbWVudF0oI0NvbXBvbmVudCQkY3JlYXRlT25FbGVtZW50KVxuICogLSBbaXNDb21wb25lbnRdKGNfdXRpbHMuanMuaHRtbCNpc0NvbXBvbmVudClcbiAqIC0gW2dldENvbXBvbmVudF0oY191dGlscy5qcy5odG1sI2dldENvbXBvbmVudClcbiAqIC0gW2dldENvbnRhaW5pbmdDb21wb25lbnRdKGNfdXRpbHMuanMuaHRtbCNnZXRDb250YWluaW5nQ29tcG9uZW50KVxuICogLSBbY3JlYXRlRnJvbVN0YXRlXSgjQ29tcG9uZW50JCRjcmVhdGVGcm9tU3RhdGUpXG4gKiAtIFtjcmVhdGVGcm9tRGF0YVRyYW5zZmVyXSgjQ29tcG9uZW50JCRjcmVhdGVGcm9tRGF0YVRyYW5zZmVyKVxuICovXG5fLmV4dGVuZChDb21wb25lbnQsIHtcbiAgICBjcmVhdGVDb21wb25lbnRDbGFzczogQ29tcG9uZW50JCRjcmVhdGVDb21wb25lbnRDbGFzcyxcbiAgICBjcmVhdGU6IENvbXBvbmVudCQkY3JlYXRlLFxuICAgIGNvcHk6IENvbXBvbmVudCQkY29weSxcbiAgICBjcmVhdGVPbkVsZW1lbnQ6IENvbXBvbmVudCQkY3JlYXRlT25FbGVtZW50LFxuICAgIGlzQ29tcG9uZW50OiBjb21wb25lbnRVdGlscy5pc0NvbXBvbmVudCxcbiAgICBnZXRDb21wb25lbnQ6IGNvbXBvbmVudFV0aWxzLmdldENvbXBvbmVudCxcbiAgICBnZXRDb250YWluaW5nQ29tcG9uZW50OiBjb21wb25lbnRVdGlscy5nZXRDb250YWluaW5nQ29tcG9uZW50LFxuICAgIGNyZWF0ZUZyb21TdGF0ZTogQ29tcG9uZW50JCRjcmVhdGVGcm9tU3RhdGUsXG4gICAgY3JlYXRlRnJvbURhdGFUcmFuc2ZlcjogQ29tcG9uZW50JCRjcmVhdGVGcm9tRGF0YVRyYW5zZmVyXG59KTtcbmRlbGV0ZSBDb21wb25lbnQuY3JlYXRlRmFjZXRlZENsYXNzO1xuXG5cbi8qKlxuICogIyMjI0NvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2luaXRdKCNDb21wb25lbnQkaW5pdClcbiAqIC0gW2NyZWF0ZUVsZW1lbnRdKCNDb21wb25lbnQkY3JlYXRlRWxlbWVudClcbiAqIC0gW2hhc0ZhY2V0XSgjQ29tcG9uZW50JGhhc0ZhY2V0KVxuICogLSBbYWRkRmFjZXRdKCNDb21wb25lbnQkYWRkRmFjZXQpXG4gKiAtIFthbGxGYWNldHNdKCNDb21wb25lbnQkYWxsRmFjZXRzKVxuICogLSBbcmVuYW1lXSgjQ29tcG9uZW50JHJlbmFtZSlcbiAqIC0gW3JlbW92ZV0oI0NvbXBvbmVudCRyZW1vdmUpXG4gKiAtIFtnZXRTdGF0ZV0oI0NvbXBvbmVudCRnZXRTdGF0ZSlcbiAqIC0gW2dldFRyYW5zZmVyU3RhdGVdKCNDb21wb25lbnQkZ2V0VHJhbnNmZXJTdGF0ZSlcbiAqIC0gW3NldFN0YXRlXSgjQ29tcG9uZW50JHNldFN0YXRlKVxuICogLSBbZ2V0U2NvcGVQYXJlbnRdKCNDb21wb25lbnQkZ2V0U2NvcGVQYXJlbnQpXG4gKiAtIFtnZXRUb3BTY29wZVBhcmVudF0oI0NvbXBvbmVudCRnZXRUb3BTY29wZVBhcmVudClcbiAqIC0gW2dldFNjb3BlUGFyZW50V2l0aENsYXNzXSgjQ29tcG9uZW50JGdldFNjb3BlUGFyZW50V2l0aENsYXNzKVxuICogLSBbZ2V0VG9wU2NvcGVQYXJlbnRXaXRoQ2xhc3NdKCNDb21wb25lbnQkZ2V0VG9wU2NvcGVQYXJlbnRXaXRoQ2xhc3MpXG4gKiAtIFt3YWxrU2NvcGVUcmVlXSgjQ29tcG9uZW50JHdhbGtTY29wZVRyZWUpXG4gKiAtIFticm9hZGNhc3RdKCNDb21wb25lbnQkYnJvYWRjYXN0KVxuICogLSBbZGVzdHJveV0oI0NvbXBvbmVudCRkZXN0cm95KVxuICogLSBbaXNEZXN0cm95ZWRdKCNDb21wb25lbnQkaXNEZXN0cm95ZWQpXG4gKlxuICpcbiAqICMjIyMjW01lc3Nlbmdlcl0oLi4vbWVzc2VuZ2VyL2luZGV4LmpzLmh0bWwpIG1ldGhvZHMgYXZhaWxhYmxlIG9uIGNvbXBvbmVudCMjIyMjXG4gKlxuICogLSBbb25dKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sI01lc3NlbmdlciRvbikgLSBzaW5nbGUgc3Vic2NyaWJlXG4gKiAtIFtvZmZdKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sI01lc3NlbmdlciRvZmYpIC0gc2luZ2xlIHVuc3Vic2NyaWJlXG4gKiAtIFtvbk1lc3NhZ2VzXSguLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCNNZXNzZW5nZXIkb25NZXNzYWdlcykgLSBtdWx0aXBsZSBzdWJzY3JpYmVcbiAqIC0gW29mZk1lc3NhZ2VzXSguLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCNNZXNzZW5nZXIkb2ZmTWVzc2FnZXMpIC0gbXVsdGlwbGUgdW5zdWJzY3JpYmVcbiAqIC0gW3Bvc3RNZXNzYWdlXSguLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCNNZXNzZW5nZXIkcG9zdE1lc3NhZ2UpIC0gcG9zdCBtZXNzYWdlIG9uIGNvbXBvbmVudFxuICogLSBbZ2V0U3Vic2NyaWJlcnNdKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sI01lc3NlbmdlciRnZXRTdWJzY3JpYmVycykgLSBnZXQgc3Vic2NyaWJlcnMgZm9yIGEgZ2l2ZW4gbWVzc2FnZVxuICovXG5fLmV4dGVuZFByb3RvKENvbXBvbmVudCwge1xuICAgIGluaXQ6IENvbXBvbmVudCRpbml0LFxuICAgIHN0YXJ0OiBDb21wb25lbnQkc3RhcnQsXG4gICAgY3JlYXRlRWxlbWVudDogQ29tcG9uZW50JGNyZWF0ZUVsZW1lbnQsXG4gICAgaGFzRmFjZXQ6IENvbXBvbmVudCRoYXNGYWNldCxcbiAgICBhZGRGYWNldDogQ29tcG9uZW50JGFkZEZhY2V0LFxuICAgIGFsbEZhY2V0czogQ29tcG9uZW50JGFsbEZhY2V0cyxcbiAgICByZW5hbWU6IENvbXBvbmVudCRyZW5hbWUsXG4gICAgcmVtb3ZlOiBDb21wb25lbnQkcmVtb3ZlLFxuICAgIGluc2VydEludG86IENvbXBvbmVudCRpbnNlcnRJbnRvLFxuXG4gICAgZ2V0U3RhdGU6IENvbXBvbmVudCRnZXRTdGF0ZSxcbiAgICBnZXRUcmFuc2ZlclN0YXRlOiBDb21wb25lbnQkZ2V0VHJhbnNmZXJTdGF0ZSxcbiAgICBfZ2V0U3RhdGU6IENvbXBvbmVudCRfZ2V0U3RhdGUsXG4gICAgc2V0U3RhdGU6IENvbXBvbmVudCRzZXRTdGF0ZSxcbiAgICBcbiAgICBnZXRTY29wZVBhcmVudDogQ29tcG9uZW50JGdldFNjb3BlUGFyZW50LFxuICAgIGdldFRvcFNjb3BlUGFyZW50OiBDb21wb25lbnQkZ2V0VG9wU2NvcGVQYXJlbnQsXG4gICAgZ2V0U2NvcGVQYXJlbnRXaXRoQ2xhc3M6IENvbXBvbmVudCRnZXRTY29wZVBhcmVudFdpdGhDbGFzcyxcbiAgICBnZXRUb3BTY29wZVBhcmVudFdpdGhDbGFzczogQ29tcG9uZW50JGdldFRvcFNjb3BlUGFyZW50V2l0aENsYXNzLFxuXG4gICAgc2V0U2NvcGVQYXJlbnRGcm9tRE9NOiBDb21wb25lbnQkc2V0U2NvcGVQYXJlbnRGcm9tRE9NLFxuXG4gICAgd2Fsa1Njb3BlVHJlZTogQ29tcG9uZW50JHdhbGtTY29wZVRyZWUsXG5cbiAgICB0cmVlUGF0aE9mOiBDb21wb25lbnQkdHJlZVBhdGhPZixcbiAgICBnZXRDb21wb25lbnRBdFRyZWVQYXRoOiBDb21wb25lbnQkZ2V0Q29tcG9uZW50QXRUcmVlUGF0aCxcbiAgICBpbnNlcnRBdFRyZWVQYXRoOiBDb21wb25lbnQkaW5zZXJ0QXRUcmVlUGF0aCxcblxuICAgIGJyb2FkY2FzdDogQ29tcG9uZW50JGJyb2FkY2FzdCxcbiAgICBkZXN0cm95OiBDb21wb25lbnQkZGVzdHJveSxcbiAgICBpc0Rlc3Ryb3llZDogQ29tcG9uZW50JGlzRGVzdHJveWVkXG59KTtcblxuXG4vKipcbiAqIEV4cG9zZSBNZXNzZW5nZXIgbWV0aG9kcyBvbiBDb21wb25lbnQgcHJvdG90eXBlXG4gKi9cbnZhciBNRVNTRU5HRVJfUFJPUEVSVFkgPSAnX21lc3Nlbmdlcic7XG5NZXNzZW5nZXIudXNlV2l0aChDb21wb25lbnQsIE1FU1NFTkdFUl9QUk9QRVJUWSwgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcblxuXG52YXIgQ09NUE9ORU5UX0RBVEFfVFlQRV9QUkVGSVggPSAneC1hcHBsaWNhdGlvbi9taWxvLWNvbXBvbmVudCc7XG52YXIgQ09NUE9ORU5UX0RBVEFfVFlQRV9SRUdFWCA9IC94LWFwcGxpY2F0aW9uXFwvbWlsby1jb21wb25lbnRcXC8oW2Etel8kXVswLTlhLXpfJF0qKSg/OlxcLygpKS9pO1xuXG4vKipcbiAqIENvbXBvbmVudCBjbGFzcyBtZXRob2RcbiAqIENyZWF0ZXMgYSBzdWJjbGFzcyBvZiBjb21wb25lbnQgZnJvbSB0aGUgbWFwIG9mIGNvbmZpZ3VyZWQgZmFjZXRzLlxuICogVGhpcyBtZXRob2Qgd3JhcHMgYW5kIHJlcGxhY2VzIFtgY3JlYXRlRmFjZXRlZENsYXNzYF0oLi4vYWJzdHJhY3QvZmFjZXRlZF9vYmplY3QuanMuaHRtbCNjcmVhdGVGYWNldGVkQ2xhc3MpIGNsYXNzIG1ldGhvZCBvZiBGYWNldGVkT2JqZWN0LlxuICogVW5saWtlIGNyZWF0ZUZhY2V0ZWRDbGFzcywgdGhpcyBtZXRob2QgdGFrZSBmYWNldCBjbGFzc2VzIGZyb20gcmVnaXN0cnkgYnkgdGhlaXIgbmFtZSwgc28gb25seSBtYXAgb2YgZmFjZXRzIGNvbmZpZ3VyYXRpb24gbmVlZHMgdG8gYmUgcGFzc2VkLiBBbGwgZmFjZXRzIGNsYXNzZXMgc2hvdWxkIGJlIHN1YmNsYXNzZXMgb2YgW0NvbXBvbmVudEZhY2V0XSguL2NfZmFjZXQuanMuaHRtbClcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBjbGFzcyBuYW1lXG4gKiBAcGFyYW0ge09iamVjdFtPYmplY3RdIHwgQXJyYXlbU3RyaW5nXX0gZmFjZXRzQ29uZmlnIG1hcCBvZiBmYWNldHMgY29uZmlndXJhdGlvbi5cbiAqICBJZiBzb21lIGZhY2V0IGRvZXMgbm90IHJlcXVpcmUgY29uZmlndXJhdGlvbiwgYHVuZGVmaW5lZGAgc2hvdWxkIGJlIHBhc3NlZCBhcyB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGZhY2V0LlxuICogIElmIG5vIGZhY2V0IHJlcXVpcmVzIGNvbmZpZ3VyYXRpb24sIHRoZSBhcnJheSBvZiBmYWNldHMgbmFtZXMgY2FuIGJlIHBhc3NlZC5cbiAqIEByZXR1cm4ge1N1YmNsYXNzKENvbXBvbmVudCl9XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCQkY3JlYXRlQ29tcG9uZW50Q2xhc3MobmFtZSwgZmFjZXRzQ29uZmlnKSB7XG4gICAgLy8gY29udmVydCBhcnJheSBvZiBmYWNldCBuYW1lcyB0byBtYXAgb2YgZW1wdHkgZmFjZXRzIGNvbmZpZ3VyYXRpb25zXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmFjZXRzQ29uZmlnKSkge1xuICAgICAgICB2YXIgY29uZmlnTWFwID0ge307XG4gICAgICAgIGZhY2V0c0NvbmZpZy5mb3JFYWNoKGZ1bmN0aW9uKGZjdCkge1xuICAgICAgICAgICAgdmFyIGZjdE5hbWUgPSBfLmZpcnN0TG93ZXJDYXNlKGZjdCk7XG4gICAgICAgICAgICBjb25maWdNYXBbZmN0TmFtZV0gPSB7fTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZhY2V0c0NvbmZpZyA9IGNvbmZpZ01hcDtcbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgbWFwIG9mIGZhY2V0cyBjbGFzc2VzIGZyb20gZmFjZXRSZWdpc3RyeVxuICAgIHZhciBmYWNldHNDbGFzc2VzO1xuICAgIGlmICh0eXBlb2YgZmFjZXRzQ29uZmlnID09ICdvYmplY3QnICYmIF8ua2V5cyhmYWNldHNDb25maWcpLmxlbmd0aCkge1xuICAgICAgICBmYWNldHNDbGFzc2VzID0ge307XG4gICAgICAgIF8uZWFjaEtleShmYWNldHNDb25maWcsIGZ1bmN0aW9uKGZjdENvbmZpZywgZmN0KSB7XG4gICAgICAgICAgICB2YXIgZmN0TmFtZSA9IF8uZmlyc3RMb3dlckNhc2UoZmN0KTtcbiAgICAgICAgICAgIHZhciBmY3RDbGFzc05hbWUgPSBfLmZpcnN0VXBwZXJDYXNlKGZjdCk7XG4gICAgICAgICAgICBmYWNldHNDbGFzc2VzW2ZjdE5hbWVdID0gZmFjZXRzUmVnaXN0cnkuZ2V0KGZjdENsYXNzTmFtZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBzdWJjbGFzcyBvZiBDb21wb25lbnQgdXNpbmcgbWV0aG9kIG9mIEZhY2V0ZWRPYmplY3RcbiAgICB2YXIgQ29tcG9uZW50Q2xhc3MgPSBGYWNldGVkT2JqZWN0LmNyZWF0ZUZhY2V0ZWRDbGFzcy5jYWxsKHRoaXMsIG5hbWUsIGZhY2V0c0NsYXNzZXMsIGZhY2V0c0NvbmZpZyk7XG4gICAgXG4gICAgX3JlZ2lzdGVyV2l0aERvbVN0b3JhZ2UobmFtZSk7XG5cbiAgICByZXR1cm4gQ29tcG9uZW50Q2xhc3M7XG59XG5cblxuZnVuY3Rpb24gX3JlZ2lzdGVyV2l0aERvbVN0b3JhZ2UoY2xhc3NOYW1lKSB7XG4gICAgRE9NU3RvcmFnZS5yZWdpc3RlckRhdGFUeXBlKGNsYXNzTmFtZSwgQ29tcG9uZW50X2RvbVN0b3JhZ2VTZXJpYWxpemVyLCBDb21wb25lbnRfZG9tU3RvcmFnZVBhcnNlcik7XG59XG5cblxuZnVuY3Rpb24gQ29tcG9uZW50X2RvbVN0b3JhZ2VTZXJpYWxpemVyKGNvbXBvbmVudCkge1xuICAgIHZhciBzdGF0ZSA9IGNvbXBvbmVudC5nZXRTdGF0ZSgpO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzdGF0ZSk7ICAgXG59XG5cblxuZnVuY3Rpb24gQ29tcG9uZW50X2RvbVN0b3JhZ2VQYXJzZXIoY29tcFN0ciwgY29tcENsYXNzTmFtZSkge1xuICAgIHZhciBzdGF0ZSA9IF8uanNvblBhcnNlKGNvbXBTdHIpO1xuICAgIGlmIChzdGF0ZSlcbiAgICAgICAgcmV0dXJuIENvbXBvbmVudC5jcmVhdGVGcm9tU3RhdGUoc3RhdGUpO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGNsYXNzIG1ldGhvZFxuICogQ3JlYXRlcyBjb21wb25lbnQgZnJvbSBbQ29tcG9uZW50SW5mb10oLi9jX2luZm8uanMuaHRtbCkgKHVzZWQgYnkgW21pbG8uYmluZGVyXSguLi9iaW5kZXIuanMuaHRtbCkgYW5kIHRvIGNvcHkgY29tcG9uZW50KVxuICogQ29tcG9uZW50IG9mIGFueSByZWdpc3RlcmVkIGNsYXNzIChzZWUgW2NvbXBvbmVudHNSZWdpc3RyeV0oLi9jX3JlZ2lzdHJ5LmpzLmh0bWwpKSB3aXRoIGFueSBhZGRpdGlvbmFsIHJlZ2lzdGVyZWQgZmFjZXRzIChzZWUgW2ZhY2V0c1JlZ2lzdHJ5XSguL2NfZmFjZXRzL2NmX3JlZ2lzdHJ5LmpzLmh0bWwpKSBjYW4gYmUgY3JlYXRlZCB1c2luZyB0aGlzIG1ldGhvZC5cbiAqXG4gKiBAcGFyYW0ge0NvbXBvbmVudEluZm99IGluZm9cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gdGhyb3dPbkVycm9ycyBJZiBzZXQgdG8gZmFsc2UsIHRoZW4gZXJyb3JzIHdpbGwgb25seSBiZSBsb2dnZWQgdG8gY29uc29sZS4gVHJ1ZSBieSBkZWZhdWx0LlxuIEAgQHJldHVybiB7Q29tcG9uZW50fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkJGNyZWF0ZShpbmZvLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgdmFyIENvbXBvbmVudENsYXNzID0gaW5mby5Db21wb25lbnRDbGFzcztcblxuICAgIGlmICh0eXBlb2YgQ29tcG9uZW50Q2xhc3MgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgbWVzc2FnZSA9ICdjcmVhdGU6IGNvbXBvbmVudCBjbGFzcyBzaG91bGQgYmUgZnVuY3Rpb24sIFwiJyArIHR5cGVvZiBDb21wb25lbnRDbGFzcyArICdcIiBwYXNzZWQnOyBcbiAgICAgICAgaWYgKHRocm93T25FcnJvcnMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0NvbXBvbmVudCcsIG1lc3NhZ2UsICc7dXNpbmcgYmFzZSBDb21wb25lbnQgY2xhc3MgaW5zdGVhZCcpO1xuICAgICAgICAgICAgQ29tcG9uZW50Q2xhc3MgPSBDb21wb25lbnQ7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHZhciBhQ29tcG9uZW50ID0gbmV3IENvbXBvbmVudENsYXNzKGluZm8uc2NvcGUsIGluZm8uZWwsIGluZm8ubmFtZSwgaW5mbyk7XG5cbiAgICBpZiAoaW5mby5leHRyYUZhY2V0c0NsYXNzZXMpXG4gICAgICAgIF8uZWFjaEtleShpbmZvLmV4dHJhRmFjZXRzQ2xhc3NlcywgZnVuY3Rpb24oRmFjZXRDbGFzcykge1xuICAgICAgICAgICAgaWYgKCEgYUNvbXBvbmVudC5oYXNGYWNldChGYWNldENsYXNzKSlcbiAgICAgICAgICAgICAgICBhQ29tcG9uZW50LmFkZEZhY2V0KEZhY2V0Q2xhc3MsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0aHJvd09uRXJyb3JzKTtcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gYUNvbXBvbmVudDtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBjbGFzcyBtZXRob2RcbiAqIENyZWF0ZSBhIGNvcHkgb2YgY29tcG9uZW50LCBpbmNsdWRpbmcgYSBjb3B5IG9mIERPTSBlbGVtZW50LiBSZXR1cm5zIGEgY29weSBvZiBgY29tcG9uZW50YCAob2YgdGhlIHNhbWUgY2xhc3MpIHdpdGggbmV3IERPTSBlbGVtZW50IChub3QgaW5zZXJ0ZWQgaW50byBwYWdlKS5cbiAqIENvbXBvbmVudCBpcyBhZGRlZCB0byB0aGUgc2FtZSBzY29wZSBhcyB0aGUgb3JpZ2luYWwgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wb25lbnQgYW4gaW5zdGFuY2Ugb2YgQ29tcG9uZW50IGNsYXNzIG9yIHN1YmNsYXNzXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXBDb3B5IG9wdGlvbmFsIGB0cnVlYCB0byBtYWtlIGRlZXAgY29weSBvZiBET00gZWxlbWVudCwgb3RoZXJ3aXNlIG9ubHkgZWxlbWVudCB3aXRob3V0IGNoaWxkcmVuIGlzIGNvcGllZFxuICogQHJldHVybiB7Q29tcG9uZW50fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkJGNvcHkoY29tcG9uZW50LCBkZWVwQ29weSkge1xuICAgIGNoZWNrKGNvbXBvbmVudCwgQ29tcG9uZW50KTtcbiAgICBjaGVjayhkZWVwQ29weSwgTWF0Y2guT3B0aW9uYWwoQm9vbGVhbikpO1xuXG4gICAgaWYgKGRlZXBDb3B5ICYmICFjb21wb25lbnQuY29udGFpbmVyKSBcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZGVlcCBjb3B5IGNvbXBvbmVudCB3aXRob3V0IGNvbnRhaW5lciBmYWNldCcpO1xuXG4gICAgLy8gY29weSBET00gZWxlbWVudCwgdXNpbmcgRG9tIGZhY2V0IGlmIGl0IGlzIGF2YWlsYWJsZVxuICAgIHZhciBuZXdFbCA9IGNvbXBvbmVudC5kb20gXG4gICAgICAgICAgICAgICAgICAgID8gY29tcG9uZW50LmRvbS5jb3B5KGRlZXBDb3B5KVxuICAgICAgICAgICAgICAgICAgICA6IGNvbXBvbmVudC5lbC5jbG9uZU5vZGUoZGVlcENvcHkpO1xuXG4gICAgdmFyIENvbXBvbmVudENsYXNzID0gY29tcG9uZW50LmNvbnN0cnVjdG9yO1xuXG4gICAgLy8gY3JlYXRlIGNvbXBvbmVudCBvZiB0aGUgc2FtZSBjbGFzcyBvbiB0aGUgZWxlbWVudFxuICAgIHZhciBhQ29tcG9uZW50ID0gQ29tcG9uZW50Q2xhc3MuY3JlYXRlT25FbGVtZW50KG5ld0VsLCB1bmRlZmluZWQsIGNvbXBvbmVudC5zY29wZSwgY29tcG9uZW50LmV4dHJhRmFjZXRzKTtcbiAgICB2YXIgc3RhdGUgPSBjb21wb25lbnQuX2dldFN0YXRlKGRlZXBDb3B5IHx8IGZhbHNlKTtcbiAgICBhQ29tcG9uZW50LnNldFN0YXRlKHN0YXRlKTtcbiAgICBfLmRlZmVyTWV0aG9kKGFDb21wb25lbnQsICdicm9hZGNhc3QnLCAnc3RhdGVyZWFkeScpO1xuICAgIHJldHVybiBhQ29tcG9uZW50O1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGNsYXNzIG1ldGhvZFxuICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBjb21wb25lbnQgYXRhY2hlZCB0byBlbGVtZW50LiBBbGwgc3ViY2xhc3NlcyBvZiBjb21wb25lbnQgaW5oZXJpdCB0aGlzIG1ldGhvZC5cbiAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBvZiB0aGUgY2xhc3MgdGhpcyBtZXRob2QgaXMgdXNlZCB3aXRoICh0aGVjb250ZXh0IG9mIHRoZSBtZXRob2QgY2FsbCkuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbCBvcHRpb25hbCBlbGVtZW50IHRvIGF0dGFjaCBjb21wb25lbnQgdG8uIElmIGVsZW1lbnQgaXMgbm90IHBhc3NlZCwgaXQgd2lsbCBiZSBjcmVhdGVkXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5uZXJIVE1MIG9wdGlvbmFsIGlubmVyIGh0bWwgdG8gaW5zZXJ0IGluIGVsZW1lbnQgYmVmb3JlIGJpbmRpbmcuXG4gKiBAcGFyYW0ge1Njb3BlfSByb290U2NvcGUgb3B0aW9uYWwgc2NvcGUgdG8gcHV0IGNvbXBvbmVudCBpbi4gSWYgbm90IHBhc3NlZCwgY29tcG9uZW50IHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIHNjb3BlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnQuIElmIHN1Y2ggc2NvcGUgZG9lcyBub3QgZXhpc3QsIG5ldyBzY29wZSB3aWxsIGJlIGNyZWF0ZWQuXG4gKiBAcGFyYW0ge0FycmF5W1N0cmluZ119IGV4dHJhRmFjZXRzIGxpc3Qgb2YgZXh0cmEgZmFjZXQgdG8gYWRkIHRvIGNvbXBvbmVudFxuICogQHJldHVybiB7U3ViY2xhc3MoQ29tcG9uZW50KX1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JCRjcmVhdGVPbkVsZW1lbnQoZWwsIGlubmVySFRNTCwgcm9vdFNjb3BlLCBleHRyYUZhY2V0cykge1xuICAgIGNoZWNrKGlubmVySFRNTCwgTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSk7XG4gICAgY2hlY2socm9vdFNjb3BlLCBNYXRjaC5PcHRpb25hbChTY29wZSkpO1xuICAgIGNoZWNrKGV4dHJhRmFjZXRzLCBNYXRjaC5PcHRpb25hbChbU3RyaW5nXSkpO1xuXG4gICAgLy8gXCJ0aGlzXCIgcmVmZXJzIHRvIHRoZSBjbGFzcyBvZiBjb21wb25lbnQgaGVyZSwgYXMgdGhpcyBpcyBhIGNsYXNzIG1ldGhvZFxuICAgIGlmIChlbCAmJiBpbm5lckhUTUwpIGVsLmlubmVySFRNTCA9IGlubmVySFRNTDtcbiAgICBlbCA9IGVsIHx8IF9jcmVhdGVDb21wb25lbnRFbGVtZW50LmNhbGwodGhpcywgaW5uZXJIVE1MKTtcbiAgICByb290U2NvcGUgPSByb290U2NvcGUgfHwgX2ZpbmRPckNyZWF0ZUNvbXBvbmVudFJvb3RTY29wZShlbCk7XG4gICAgdmFyIGFDb21wb25lbnQgPSBfYWRkQXR0cmlidXRlQW5kQmluZENvbXBvbmVudC5jYWxsKHRoaXMsIGVsLCByb290U2NvcGUsIGV4dHJhRmFjZXRzKTtcbiAgICBhQ29tcG9uZW50LmJyb2FkY2FzdCgnc3RhdGVyZWFkeScpO1xuICAgIHJldHVybiBhQ29tcG9uZW50O1xufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ29tcG9uZW50RWxlbWVudChpbm5lckhUTUwpIHtcbiAgICAvLyBcInRoaXNcIiByZWZlcnMgdG8gdGhlIGNsYXNzIG9mIGNvbXBvbmVudCBoZXJlLCBhcyB0aGlzIGlzIGEgY2xhc3MgbWV0aG9kXG4gICAgdmFyIERvbSA9IGZhY2V0c1JlZ2lzdHJ5LmdldCgnRG9tJylcbiAgICAgICAgLCBkb21GYWNldENvbmZpZyA9IHRoaXMuZ2V0RmFjZXRDb25maWcoJ2RvbScpXG4gICAgICAgICwgdGVtcGxhdGVGYWNldENvbmZpZyA9IHRoaXMuZ2V0RmFjZXRDb25maWcoJ3RlbXBsYXRlJylcbiAgICAgICAgLCB0ZW1wbGF0ZSA9IHRlbXBsYXRlRmFjZXRDb25maWcgJiYgdGVtcGxhdGVGYWNldENvbmZpZy50ZW1wbGF0ZTtcblxuICAgIHZhciBlbENvbmZpZyA9IHtcbiAgICAgICAgZG9tQ29uZmlnOiBkb21GYWNldENvbmZpZyxcbiAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlLFxuICAgICAgICBjb250ZW50OiBpbm5lckhUTUxcbiAgICB9O1xuXG4gICAgcmV0dXJuIERvbS5jcmVhdGVFbGVtZW50KGVsQ29uZmlnKTtcbn1cblxuZnVuY3Rpb24gX2ZpbmRPckNyZWF0ZUNvbXBvbmVudFJvb3RTY29wZShlbCkge1xuICAgIHZhciBwYXJlbnQgPSBDb21wb25lbnQuZ2V0Q29udGFpbmluZ0NvbXBvbmVudChlbCwgZmFsc2UsICdDb250YWluZXInKTtcbiAgICByZXR1cm4gcGFyZW50ID8gcGFyZW50LmNvbnRhaW5lci5zY29wZSA6IG5ldyBTY29wZShlbCk7XG59XG5cbmZ1bmN0aW9uIF9hZGRBdHRyaWJ1dGVBbmRCaW5kQ29tcG9uZW50KGVsLCByb290U2NvcGUsIGV4dHJhRmFjZXRzKSB7XG4gICAgLy8gYWRkIGJpbmQgYXR0cmlidXRlIHRvIGVsZW1lbnRcbiAgICB2YXIgYXR0ciA9IG5ldyBCaW5kQXR0cmlidXRlKGVsKTtcbiAgICAvLyBcInRoaXNcIiByZWZlcnMgdG8gdGhlIGNsYXNzIG9mIGNvbXBvbmVudCBoZXJlLCBhcyB0aGlzIGlzIGEgY2xhc3MgbWV0aG9kXG4gICAgYXR0ci5jb21wQ2xhc3MgPSB0aGlzLm5hbWU7XG4gICAgYXR0ci5jb21wRmFjZXRzID0gZXh0cmFGYWNldHM7XG4gICAgYXR0ci5kZWNvcmF0ZSgpO1xuXG4gICAgLy8gc2hvdWxkIGJlIHJlcXVpcmVkIGhlcmUgdG8gcmVzb2x2ZSBjaXJjdWxhciBkZXBlbmRlbmN5XG4gICAgdmFyIG1pbG9CaW5kZXIgPSByZXF1aXJlKCcuLi9iaW5kZXInKTtcbiAgICBtaWxvQmluZGVyKGVsLCByb290U2NvcGUpO1xuXG4gICAgcmV0dXJuIHJvb3RTY29wZVthdHRyLmNvbXBOYW1lXTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgY2xhc3MgbWV0aG9kXG4gKiBDcmVhdGVzIGNvbXBvbmVudCBmcm9tIGNvbXBvbmVudCBzdGF0ZSwgdGhhdCBpbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dCBpdHMgY2xhc3MsIGV4dHJhIGZhY2V0cywgZmFjZXRzIGRhdGEgYW5kIGFsbCBzY29wZSBjaGlsZHJlbi5cbiAqIFRoaXMgaXMgdXNlZCB0byBzYXZlL2xvYWQsIGNvcHkvcGFzdGUgYW5kIGRyYWcvZHJvcCBjb21wb25lbnRcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGUgc3RhdGUgZnJvbSB3aGljaCBjb21wb25lbnQgd2lsbCBiZSBjcmVhdGVkXG4gKiBAcGFyYW0ge1Njb3BlfSByb290U2NvcGUgc2NvcGUgdG8gd2hpY2ggY29tcG9uZW50IHdpbGwgYmUgYWRkZWRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gbmV3VW5pcXVlTmFtZSBvcHRpb25hbCBgdHJ1ZWAgdG8gY3JlYXRlIGNvbXBvbmVudCB3aXRoIHRoZSBuYW1lIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBvbmUuIGBGYWxzZWAgYnkgZGVmYXVsdC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gdGhyb3dPbkVycm9ycyBJZiBzZXQgdG8gZmFsc2UsIHRoZW4gZXJyb3JzIHdpbGwgb25seSBiZSBsb2dnZWQgdG8gY29uc29sZS4gVHJ1ZSBieSBkZWZhdWx0LlxuICogQHJldHVybiB7Q29tcG9uZW50fSBjb21wb25lbnRcbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JCRjcmVhdGVGcm9tU3RhdGUoc3RhdGUsIHJvb3RTY29wZSwgbmV3VW5pcXVlTmFtZSwgdGhyb3dPbkVycm9ycykge1xuICAgIGNoZWNrKHN0YXRlLCBNYXRjaC5PYmplY3RJbmNsdWRpbmcoe1xuICAgICAgICBjb21wTmFtZTogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSxcbiAgICAgICAgY29tcENsYXNzOiBNYXRjaC5PcHRpb25hbChTdHJpbmcpLFxuICAgICAgICBleHRyYUZhY2V0czogTWF0Y2guT3B0aW9uYWwoW1N0cmluZ10pLFxuICAgICAgICBmYWNldHNTdGF0ZXM6IE1hdGNoLk9wdGlvbmFsKE9iamVjdCksXG4gICAgICAgIG91dGVySFRNTDogU3RyaW5nXG4gICAgfSkpO1xuXG4gICAgdmFyIG1pbG9CaW5kZXIgPSByZXF1aXJlKCcuLi9iaW5kZXInKTtcblxuICAgIC8vIGNyZWF0ZSB3cmFwcGVyIGVsZW1lbnQgb3B0aW9uYWxseSByZW5hbWluZyBjb21wb25lbnRcbiAgICB2YXIgd3JhcEVsID0gX2NyZWF0ZUNvbXBvbmVudFdyYXBFbGVtZW50KHN0YXRlLCBuZXdVbmlxdWVOYW1lKTtcblxuICAgIC8vIGluc3RhbnRpYXRlIGFsbCBjb21wb25lbnRzIGZyb20gSFRNTFxuICAgIHZhciBzY29wZSA9IG1pbG9CaW5kZXIod3JhcEVsLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdGhyb3dPbkVycm9ycyk7XG5cbiAgICAvLyBhcyB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUgY29tcG9uZW50LCBjYWxsIHRvIF9hbnkgd2lsbCByZXR1cm4gaXRcbiAgICB2YXIgY29tcG9uZW50ID0gc2NvcGUuX2FueSgpO1xuXG4gICAgLy8gc2V0IGNvbXBvbmVudCdzIHNjb3BlXG4gICAgaWYgKHJvb3RTY29wZSkge1xuICAgICAgICBjb21wb25lbnQuc2NvcGUgPSByb290U2NvcGU7XG4gICAgICAgIHJvb3RTY29wZS5fYWRkKGNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgLy8gcmVzdG9yZSBjb21wb25lbnQgc3RhdGVcbiAgICBjb21wb25lbnQuc2V0U3RhdGUoc3RhdGUpO1xuICAgIF8uZGVmZXJNZXRob2QoY29tcG9uZW50LCAnYnJvYWRjYXN0JywgJ3N0YXRlcmVhZHknKTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7ICAgXG59XG5cblxuLy8gdXNlZCBieSBDb21wb25lbnQkJGNyZWF0ZUZyb21TdGF0ZVxuZnVuY3Rpb24gX2NyZWF0ZUNvbXBvbmVudFdyYXBFbGVtZW50KHN0YXRlLCBuZXdVbmlxdWVOYW1lKSB7XG4gICAgdmFyIHdyYXBFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHdyYXBFbC5pbm5lckhUTUwgPSBzdGF0ZS5vdXRlckhUTUw7XG5cbiAgICB2YXIgY2hpbGRyZW4gPSBkb21VdGlscy5jaGlsZHJlbih3cmFwRWwpO1xuICAgIGlmIChjaGlsZHJlbi5sZW5ndGggIT0gMSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgY3JlYXRlIGNvbXBvbmVudDogaW5jb3JyZWN0IEhUTUwsIGVsZW1lbnRzIG51bWJlcjogJyArIGNoaWxkcmVuLmxlbmd0aCArICcgKHNob3VsZCBiZSAxKScpO1xuICAgIHZhciBjb21wRWwgPSBjaGlsZHJlblswXTtcbiAgICB2YXIgYXR0ciA9IG5ldyBCaW5kQXR0cmlidXRlKGNvbXBFbCk7XG4gICAgYXR0ci5jb21wTmFtZSA9IG5ld1VuaXF1ZU5hbWUgPyBtaWxvQ29tcG9uZW50TmFtZSgpIDogc3RhdGUuY29tcE5hbWU7XG4gICAgYXR0ci5jb21wQ2xhc3MgPSBzdGF0ZS5jb21wQ2xhc3M7XG4gICAgYXR0ci5jb21wRmFjZXRzID0gc3RhdGUuZXh0cmFGYWNldHM7XG4gICAgYXR0ci5kZWNvcmF0ZSgpO1xuXG4gICAgcmV0dXJuIHdyYXBFbDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgY29tcG9uZW50IGZyb20gYSBEYXRhVHJhbnNmZXIgb2JqZWN0IChpZiBwb3NzaWJsZSlcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9EYXRhVHJhbnNmZXJcbiAqIEBwYXJhbSB7RGF0YVRyYW5zZmVyfSBkYXRhVHJhbnNmZXIgRGF0YSB0cmFuc2ZlclxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkJGNyZWF0ZUZyb21EYXRhVHJhbnNmZXIoZGF0YVRyYW5zZmVyKSB7XG4gICAgdmFyIGRhdGFUeXBlID0gXy5maW5kKGRhdGFUcmFuc2Zlci50eXBlcywgZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIENPTVBPTkVOVF9EQVRBX1RZUEVfUkVHRVgudGVzdCh0eXBlKTtcbiAgICB9KTtcbiAgICBpZiAoIWRhdGFUeXBlKSByZXR1cm47XG5cbiAgICB2YXIgc3RhdGUgPSBfLmpzb25QYXJzZShkYXRhVHJhbnNmZXIuZ2V0RGF0YShkYXRhVHlwZSkpO1xuICAgIGlmICghc3RhdGUpIHJldHVybjtcblxuICAgIHJldHVybiBDb21wb25lbnQuY3JlYXRlRnJvbVN0YXRlKHN0YXRlLCB1bmRlZmluZWQsIHRydWUpO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZC5cbiAqIEluaXRpYWxpemVzIGNvbXBvbmVudC4gQXV0b21hdGljYWxseSBjYWxsZWQgYnkgaW5oZXJpdGVkIGNvbnN0cnVjdG9yIG9mIEZhY2V0ZWRPYmplY3QuXG4gKiBTdWJjbGFzc2VzIHNob3VsZCBjYWxsIGluaGVyaXRlZCBpbml0IG1ldGhvZHM6XG4gKiBgYGBcbiAqIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1Njb3BlfSBzY29wZSBzY29wZSB0byB3aGljaCBjb21wb25lbnQgd2lsbCBiZWxvbmcuIEl0IGlzIHVzdWFsbHkgYSB0b3AgbGV2ZWwgc2NvcGUgb2JqZWN0IHJldHVybmVkIGJ5IGBtaWxvLmJpbmRlcmAgb3IgYHNjb3BlYCBwcm9wZXJ0eSBvZiBDb250YWluZXIgZmFjZXQuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgRE9NIGVsZW1lbnQgdGhhdCBjb21wb25lbnQgaXMgYXR0YWNoZWQgdG9cbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIGNvbXBvbmVudCBuYW1lLCBzaG91bGQgYmUgdW5pcXVlIGluIHRoZSBzY29wZSBvZiBjb21wb25lbnRcbiAqIEBwYXJhbSB7Q29tcG9uZW50SW5mb30gY29tcG9uZW50SW5mbyBpbnN0YW5jZSBvZiBDb21wb25lbnRJbmZvIGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgY29weSBvZiBjb21wb25lbnRcbiAqICBUT0RPIHRyeSByZW1vdmluZyBpdFxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkaW5pdChzY29wZSwgZWxlbWVudCwgbmFtZSwgY29tcG9uZW50SW5mbykge1xuICAgIC8vIGNyZWF0ZSBET00gZWxlbWVudCBpZiBpdCB3YXNuJ3QgcGFzc2VkIHRvIENvbnN0cnVjdG9yXG4gICAgdGhpcy5lbCA9IGVsZW1lbnQgfHwgdGhpcy5jcmVhdGVFbGVtZW50KCk7XG5cbiAgICAvLyBzdG9yZSByZWZlcmVuY2UgdG8gY29tcG9uZW50IG9uIERPTSBlbGVtZW50XG4gICAgaWYgKHRoaXMuZWwpIHtcbiAgICAgICAgLy8gY2hlY2sgdGhhdCBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSBjb21wb25lbnQgYWxyZWFkeSBhdGFjaGVkXG4gICAgICAgIHZhciBlbENvbXAgPSB0aGlzLmVsW2NvbmZpZy5jb21wb25lbnRSZWZdO1xuICAgICAgICBpZiAoZWxDb21wKVxuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ2NvbXBvbmVudCAnICsgbmFtZSArICcgYXR0YWNoZWQgdG8gZWxlbWVudCB0aGF0IGFscmVhZHkgaGFzIGNvbXBvbmVudCAnICsgZWxDb21wLm5hbWUpO1xuXG4gICAgICAgIHRoaXMuZWxbY29uZmlnLmNvbXBvbmVudFJlZl0gPSB0aGlzO1xuICAgIH1cblxuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIGNvbXBvbmVudEluZm86IGNvbXBvbmVudEluZm8sXG4gICAgICAgIGV4dHJhRmFjZXRzOiBbXVxuICAgIH0sIF8uRU5VTSk7XG5cbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcblxuICAgIC8vIGNyZWF0ZSBjb21wb25lbnQgbWVzc2VuZ2VyXG4gICAgdmFyIG1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcyk7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBNRVNTRU5HRVJfUFJPUEVSVFksIG1lc3Nlbmdlcik7XG5cbiAgICAvLyBjaGVjayBhbGwgZmFjZXRzIGRlcGVuZGVuY2llcyAocmVxdWlyZWQgZmFjZXRzKVxuICAgIHRoaXMuYWxsRmFjZXRzKCdjaGVjaycpO1xuXG4gICAgLy8gc3RhcnQgYWxsIGZhY2V0c1xuICAgIHRoaXMuYWxsRmFjZXRzKCdzdGFydCcpO1xuXG4gICAgLy8gY2FsbCBzdGFydCBtZXRob2QgaWYgaXQncyBkZWZpbmVkIGluIHN1YmNsYXNzXG4gICAgaWYgKHRoaXMuc3RhcnQpIHRoaXMuc3RhcnQoKTtcbn1cblxuXG4vKipcbiAqIFRoaXMgaXMgYSBzdHViIHRvIGF2b2lkIGNvbmZ1c2lvbiB3aGV0aGVyIHRoZSBtZXRob2Qgb2Ygc3VwZXJjbGFzcyBzaG91bGQgYmUgY2FsbGVkIGluIHN1YmNsYXNzZXNcbiAqIFRoZSBzdGFydCBtZXRob2Qgb2Ygc3ViY2xhc3MgaW5zdGFuY2UgaXMgY2FsbGVkIG9uY2UgYWxsIHRoZSBmYWNldHMgYXJlIGNyZWF0ZWQsIGluaXRpYWxpemVkIGFuZCBzdGFydGVkIChzZWUgYWJvdmUpXG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRzdGFydCgpIHt9XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogSW5pdGlhbGl6ZXMgdGhlIGVsZW1lbnQgd2hpY2ggdGhpcyBjb21wb25lbnQgaXMgYm91bmQgdG9cbiAqXG4gKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQgb3V0c2lkZSB0aGUgRE9NIGFuZFxuICogd2lsbCBnZW5lcmF0ZSBhIG5ldyBlbGVtZW50IGZvciB0aGUgY29tcG9uZW50LlxuICogXG4gKiBAcmV0dXJuIHtFbGVtZW50fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkY3JlYXRlRWxlbWVudCgpIHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09ICd1bmRlZmluZWQnKVxuICAgICAgICByZXR1cm47XG5cbiAgICB0aGlzLmVsID0gdGhpcy5kb21cbiAgICAgICAgICAgICAgICA/IHRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoKVxuICAgICAgICAgICAgICAgIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG5cbiAgICByZXR1cm4gdGhpcy5lbDtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgdHJ1ZSBpZiBjb21wb25lbnQgaGFzIGZhY2V0XG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IGZhY2V0TmFtZU9yQ2xhc3NcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRoYXNGYWNldChmYWNldE5hbWVPckNsYXNzKSB7XG4gICAgdmFyIGZhY2V0TmFtZSA9IF8uZmlyc3RMb3dlckNhc2UodHlwZW9mIGZhY2V0TmFtZU9yQ2xhc3MgPT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZmFjZXROYW1lT3JDbGFzcy5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmYWNldE5hbWVPckNsYXNzKTtcblxuICAgIHZhciBmYWNldCA9IHRoaXNbZmFjZXROYW1lXTtcbiAgICBpZiAoISBmYWNldCBpbnN0YW5jZW9mIENvbXBvbmVudEZhY2V0KVxuICAgICAgICBsb2dnZXIud2FybignZXhwZWN0ZWQgZmFjZXQnLCBmYWNldE5hbWUsICdidXQgdGhpcyBwcm9wZXJ0eSBuYW1lIGlzIHVzZWQgZm9yIHNvbWV0aGluZyBlbHNlJyk7XG5cbiAgICByZXR1cm4gISEgZmFjZXQ7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogQWRkcyBmYWNldCB3aXRoIGdpdmVuIG5hbWUgb3IgY2xhc3MgdG8gdGhlIGluc3RhbmNlIG9mIENvbXBvbmVudCAob3IgaXRzIHN1YmNsYXNzKS5cbiAqIFxuICogQHBhcmFtIHtTdHJpbmd8U3ViY2xhc3MoQ29tcG9uZW50KX0gZmFjZXROYW1lT3JDbGFzcyBuYW1lIG9mIGZhY2V0IGNsYXNzIG9yIHRoZSBjbGFzcyBpdHNlbGYuIElmIG5hbWUgaXMgcGFzc2VkLCB0aGUgY2xhc3Mgd2lsbCBiZSByZXRpcmV2ZWQgZnJvbSBmYWNldHNSZWdpc3RyeVxuICogQHBhcmFtIHtPYmplY3R9IGZhY2V0Q29uZmlnIG9wdGlvbmFsIGZhY2V0IGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBmYWNldE5hbWUgb3B0aW9uYWwgZmFjZXQgbmFtZS4gQWxsb3dzIHRvIGFkZCBmYWNldCB1bmRlciBhIG5hbWUgZGlmZmVyZW50IGZyb20gdGhlIGNsYXNzIG5hbWUgc3VwcGxpZWQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHRocm93T25FcnJvcnMgSWYgc2V0IHRvIGZhbHNlLCB0aGVuIGVycm9ycyB3aWxsIG9ubHkgYmUgbG9nZ2VkIHRvIGNvbnNvbGUuIFRydWUgYnkgZGVmYXVsdC5cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGFkZEZhY2V0KGZhY2V0TmFtZU9yQ2xhc3MsIGZhY2V0Q29uZmlnLCBmYWNldE5hbWUsIHRocm93T25FcnJvcnMpIHtcbiAgICBjaGVjayhmYWNldE5hbWVPckNsYXNzLCBNYXRjaC5PbmVPZihTdHJpbmcsIE1hdGNoLlN1YmNsYXNzKENvbXBvbmVudEZhY2V0KSkpO1xuICAgIGNoZWNrKGZhY2V0Q29uZmlnLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKTtcbiAgICBjaGVjayhmYWNldE5hbWUsIE1hdGNoLk9wdGlvbmFsKFN0cmluZykpO1xuXG4gICAgdmFyIEZhY2V0Q2xhc3M7XG4gICAgLy8gaWYgb25seSBuYW1lIHBhc3NlZCwgcmV0cmlldmUgZmFjZXQgY2xhc3MgZnJvbSByZWdpc3RyeVxuICAgIGlmICh0eXBlb2YgZmFjZXROYW1lT3JDbGFzcyA9PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgZmFjZXRDbGFzc05hbWUgPSBfLmZpcnN0VXBwZXJDYXNlKGZhY2V0TmFtZU9yQ2xhc3MpO1xuICAgICAgICBGYWNldENsYXNzID0gZmFjZXRzUmVnaXN0cnkuZ2V0KGZhY2V0Q2xhc3NOYW1lKTtcbiAgICB9IGVsc2UgXG4gICAgICAgIEZhY2V0Q2xhc3MgPSBmYWNldE5hbWVPckNsYXNzO1xuXG4gICAgaWYgKCFmYWNldE5hbWUpXG4gICAgICAgIGZhY2V0TmFtZSA9IF8uZmlyc3RMb3dlckNhc2UoRmFjZXRDbGFzcy5uYW1lKTtcblxuICAgIHRoaXMuZXh0cmFGYWNldHMucHVzaChmYWNldE5hbWUpO1xuXG4gICAgLy8gYWRkIGZhY2V0IHVzaW5nIG1ldGhvZCBvZiBGYWNldGVkT2JqZWN0XG4gICAgdmFyIG5ld0ZhY2V0ID0gRmFjZXRlZE9iamVjdC5wcm90b3R5cGUuYWRkRmFjZXQuY2FsbCh0aGlzLCBGYWNldENsYXNzLCBmYWNldENvbmZpZywgZmFjZXROYW1lLCB0aHJvd09uRXJyb3JzKTtcblxuICAgIC8vIGNoZWNrIGRlcGVuZWRlbmNpZXMgYW5kIHN0YXJ0IGZhY2V0XG4gICAgaWYgKG5ld0ZhY2V0LmNoZWNrKSBuZXdGYWNldC5jaGVjaygpO1xuICAgIGlmIChuZXdGYWNldC5zdGFydCkgbmV3RmFjZXQuc3RhcnQoKTtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2QuXG4gKiBFbnZva2UgZ2l2ZW4gbWV0aG9kIHdpdGggb3B0aW9uYWwgcGFyYW1ldGVycyBvbiBhbGwgZmFjZXRzLlxuICogUmV0dXJucyB0aGUgbWFwIG9mIHZhbHVlcyByZXR1cm5lZCBieSBhbGwgZmFjZXRzLiBJZiB0aGUgZmFjZXQgZG9lc24ndCBoYXZlIHRoZSBtZXRob2QgaXQgaXMgc2ltcGx5IG5vdCBjYWxsZWQgYW5kIHRoZSB2YWx1ZSBpbiB0aGUgbWFwIHdpbGwgYmUgdW5kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXRob2QgbWV0aG9kIG5hbWUgdG8gZW52b2tlIG9uIHRoZSBmYWNldFxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkYWxsRmFjZXRzKG1ldGhvZCkgeyAvLyAsLi4uIGFyZ3VtZW50c1xuICAgIHZhciBhcmdzID0gXy5zbGljZShhcmd1bWVudHMsIDEpO1xuXG4gICAgcmV0dXJuIF8ubWFwS2V5cyh0aGlzLmZhY2V0cywgZnVuY3Rpb24oZmFjZXQsIGZjdE5hbWUpIHtcbiAgICAgICAgaWYgKGZhY2V0ICYmIHR5cGVvZiBmYWNldFttZXRob2RdID09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICByZXR1cm4gZmFjZXRbbWV0aG9kXS5hcHBseShmYWNldCwgYXJncyk7XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogXG4gKiBAcGFyYW0ge1tTdHJpbmddfSBuYW1lIG9wdGlvbmFsIG5ldyBuYW1lIG9mIGNvbXBvbmVudCwgXG4gKiBAcGFyYW0ge1tCb29sZWFuXX0gcmVuYW1lSW5TY29wZSBvcHRpb25hbCBmYWxzZSB0byBub3QgcmVuYW1lIENvbXBvbmVudEluZm8gb2JqZWN0IGluIGl0cyBzY29wZSwgdHJ1ZSBieSBkZWZhdWx0XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRyZW5hbWUobmFtZSwgcmVuYW1lSW5TY29wZSkge1xuICAgIG5hbWUgPSBuYW1lIHx8IG1pbG9Db21wb25lbnROYW1lKCk7XG4gICAgdGhpcy5jb21wb25lbnRJbmZvLnJlbmFtZShuYW1lLCBmYWxzZSk7XG4gICAgU2NvcGUucmVuYW1lKHRoaXMsIG5hbWUsIHJlbmFtZUluU2NvcGUpO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZC5cbiAqIFJlbW92ZXMgY29tcG9uZW50IGZyb20gaXRzIHNjb3BlLlxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcHJlc2VydmVTY29wZVByb3BlcnR5IHRydWUgbm90IHRvIGRlbGV0ZSBzY29wZSBwcm9wZXJ0eSBvZiBjb21wb25lbnRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcXVpZXQgb3B0aW9uYWwgdHJ1ZSB0byBzdXBwcmVzcyB0aGUgd2FybmluZyBtZXNzYWdlIGlmIHRoZSBjb21wb25lbnQgaXMgbm90IGluIHNjb3BlXG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRyZW1vdmUocHJlc2VydmVTY29wZVByb3BlcnR5LCBxdWlldCkge1xuICAgIGlmICh0aGlzLnNjb3BlKSB7XG4gICAgICAgIHRoaXMuc2NvcGUuX3JlbW92ZSh0aGlzLm5hbWUsIHF1aWV0KTtcbiAgICAgICAgaWYgKCEgcHJlc2VydmVTY29wZVByb3BlcnR5KVxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NvcGU7XG4gICAgfVxufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZC5cbiAqIEluc2VydHMgdGhlIGNvbXBvbmVudCBpbnRvIHRoZSBET00gYW5kIGF0dGVtcHRzIHRvIGFkanVzdCB0aGUgc2NvcGUgdHJlZSBhY2NvcmRpbmdseS5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBhcmVudEVsICAgIFRoZSBlbGVtZW50IGludG8gd2hpY2ggdGhlIGNvbXBvbmVudCBzaG91bGQgYmUgaW5zZXJ0ZWQuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByZWZlcmVuY2VFbCAob3B0aW9uYWwpIFRoZSByZWZlcmVuY2UgZWxlbWVudCBpdCBzaG91bGQgYmUgaW5zZXJ0ZWQgYmVmb3JlLlxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkaW5zZXJ0SW50byhwYXJlbnRFbCwgcmVmZXJlbmNlRWwpIHtcbiAgICBwYXJlbnRFbC5pbnNlcnRCZWZvcmUodGhpcy5lbCwgcmVmZXJlbmNlRWwpO1xuICAgIHRoaXMuc2V0U2NvcGVQYXJlbnRGcm9tRE9NKCk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXRyaWV2ZXMgYWxsIGNvbXBvbmVudCBzdGF0ZSwgaW5jbHVkaW5nIGluZm9ybWF0aW9uIGFib3V0IGl0cyBjbGFzcywgZXh0cmEgZmFjZXRzLCBmYWNldHMgZGF0YSBhbmQgYWxsIHNjb3BlIGNoaWxkcmVuLlxuICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHNhdmUvbG9hZCwgY29weS9wYXN0ZSBhbmQgZHJhZy9kcm9wIGNvbXBvbmVudCBcbiAqIFJldHVybnMgY29tcG9uZW50IHN0YXRlXG4gKlxuICogQHRoaXMge0NvbXBvbmVudH0gY29tcG9uZW50IHdoaWNoIHN0YXRlIHdpbGwgYmUgc2F2ZWRcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGdldFN0YXRlKCkge1xuICAgIHRoaXMuYnJvYWRjYXN0KCdnZXRzdGF0ZXN0YXJ0ZWQnLCB7IHJvb3RDb21wb25lbnQ6IHRoaXMgfSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLl9nZXRTdGF0ZSh0cnVlKTtcbiAgICBzdGF0ZS5vdXRlckhUTUwgPSB0aGlzLmVsLm91dGVySFRNTDtcbiAgICBfLmRlZmVyTWV0aG9kKHRoaXMsICdicm9hZGNhc3QnLCAnZ2V0c3RhdGVjb21wbGV0ZWQnLCB7IHJvb3RDb21wb25lbnQ6IHRoaXMgfSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICByZXR1cm4gc3RhdGU7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXRyaWV2ZXMgYWxsIGNvbXBvbmVudCBzdGF0ZSwgaW5jbHVkaW5nIGluZm9ybWF0aW9uIGFib3V0IGl0cyBjbGFzcywgZXh0cmEgZmFjZXRzLCBmYWNldHMgZGF0YSBhbmQgYWxsIHNjb3BlIGNoaWxkcmVuLlxuICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHNhdmUvbG9hZCwgY29weS9wYXN0ZSBhbmQgZHJhZy9kcm9wIGNvbXBvbmVudCBcbiAqIElmIGNvbXBvbmVudCBoYXMgW1RyYW5zZmVyXSguL2NfZmFjZXRzL1RyYW5zZmVyLmpzLmh0bWwpIGZhY2V0IG9uIGl0LCB0aGlzIG1ldGhvZCByZXRyaWV2ZXMgc3RhdGUgZnJvbSB0aGlzIGZhY2V0XG4gKiBSZXR1cm5zIGNvbXBvbmVudCBzdGF0ZVxuICpcbiAqIEB0aGlzIHtDb21wb25lbnR9IGNvbXBvbmVudCB3aGljaCBzdGF0ZSB3aWxsIGJlIHNhdmVkXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBjYW4gYmUgdXNlZCBieSBzdWJjbGFzc2VzLiBcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGdldFRyYW5zZmVyU3RhdGUob3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLnRyYW5zZmVyXG4gICAgICAgICAgICA/IHRoaXMudHJhbnNmZXIuZ2V0U3RhdGUob3B0aW9ucylcbiAgICAgICAgICAgIDogdGhpcy5nZXRTdGF0ZShvcHRpb25zKTtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgdGhlIHN0YXRlIG9mIGNvbXBvbmVudFxuICogVXNlZCBieSBjbGFzcyBtZXRob2QgYENvbXBvbmVudC5nZXRTdGF0ZWAgYW5kIGJ5IFtDb250YWluZXJdKC4vY19mYWNldHMvQ29udGFpbmVyLmpzLmh0bWwpIGZhY2V0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXBTdGF0ZSBmYWxzZSB0byBnZXQgc2hhbGxvdyBzdGF0ZSBmcm9tIGFsbCBmYWNldHMgKHRydWUgYnkgZGVmYXVsdClcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JF9nZXRTdGF0ZShkZWVwU3RhdGUpe1xuXG4gICAgdmFyIGZhY2V0c1N0YXRlcyA9IHRoaXMuYWxsRmFjZXRzKCdnZXRTdGF0ZScsIGRlZXBTdGF0ZSA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWUpO1xuICAgIGZhY2V0c1N0YXRlcyA9IF8uZmlsdGVyS2V5cyhmYWNldHNTdGF0ZXMsIGZ1bmN0aW9uKGZjdFN0YXRlKSB7XG4gICAgICAgIHJldHVybiAhISBmY3RTdGF0ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBOYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgIGNvbXBDbGFzczogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgICBleHRyYUZhY2V0czogdGhpcy5leHRyYUZhY2V0cyxcbiAgICAgICAgZmFjZXRzU3RhdGVzOiBmYWNldHNTdGF0ZXNcbiAgICB9O1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyB0aGUgc3RhdGUgb2YgY29tcG9uZW50LlxuICogVXNlZCBieSBjbGFzcyBtZXRob2QgYENvbXBvbmVudC5jcmVhdGVGcm9tU3RhdGVgIGFuZCBieSBbQ29udGFpbmVyXSguL2NfZmFjZXRzL0NvbnRhaW5lci5qcy5odG1sKSBmYWNldC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIHN0YXRlIHRvIHNldCB0aGUgY29tcG9uZW50XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRzZXRTdGF0ZShzdGF0ZSkge1xuICAgIGlmIChzdGF0ZS5mYWNldHNTdGF0ZXMpXG4gICAgICAgIF8uZWFjaEtleShzdGF0ZS5mYWNldHNTdGF0ZXMsIGZ1bmN0aW9uKGZjdFN0YXRlLCBmY3ROYW1lKSB7XG4gICAgICAgICAgICB2YXIgZmFjZXQgPSB0aGlzW2ZjdE5hbWVdO1xuICAgICAgICAgICAgaWYgKGZhY2V0ICYmIHR5cGVvZiBmYWNldC5zZXRTdGF0ZSA9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgICAgIGZhY2V0LnNldFN0YXRlKGZjdFN0YXRlKTtcbiAgICAgICAgfSwgdGhpcyk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogUmV0dXJucyB0aGUgc2NvcGUgcGFyZW50IG9mIGEgY29tcG9uZW50LlxuICogSWYgYGNvbmRpdGlvbk9yRmFjZXRgIHBhcmFtZXRlciBpcyBub3Qgc3BlY2lmaWVkLCBhbiBpbW1lZGlhdGUgcGFyZW50IHdpbGwgYmUgcmV0dXJuZWQsIG90aGVyd2lzZSB0aGUgY2xvc2VzdCBhbmNlc3RvciB3aXRoIGEgc3BlY2lmaWVkIGZhY2V0IG9yIHBhc3NpbmcgY29uZGl0aW9uIHRlc3QuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IGNvbmRpdGlvbk9yRmFjZXQgb3B0aW9uYWwgY29uZGl0aW9uIHRoYXQgY29tcG9uZW50IHNob3VsZCBwYXNzIChvciBmYWNldCBuYW1lIGl0IHNob3VsZCBjb250YWluKVxuICogQHJldHVybiB7Q29tcG9uZW50fHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGdldFNjb3BlUGFyZW50KGNvbmRpdGlvbk9yRmFjZXQpIHtcbiAgICByZXR1cm4gX2NhbGxHZXRTY29wZVBhcmVudC5jYWxsKHRoaXMsIF9nZXRTY29wZVBhcmVudCwgY29uZGl0aW9uT3JGYWNldCk7XG59XG5cbmZ1bmN0aW9uIF9jYWxsR2V0U2NvcGVQYXJlbnQoX2dldFNjb3BlUGFyZW50RnVuYywgY29uZGl0aW9uT3JGYWNldCkge1xuICAgIGNoZWNrKGNvbmRpdGlvbk9yRmFjZXQsIE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9uZU9mKEZ1bmN0aW9uLCBTdHJpbmcpKSk7XG4gICAgdmFyIGNvbmRpdGlvbkZ1bmMgPSBjb21wb25lbnRVdGlscy5fbWFrZUNvbXBvbmVudENvbmRpdGlvbkZ1bmMoY29uZGl0aW9uT3JGYWNldCk7XG4gICAgcmV0dXJuIF9nZXRTY29wZVBhcmVudEZ1bmMuY2FsbCh0aGlzLCBjb25kaXRpb25GdW5jKTsgICBcbn1cblxuZnVuY3Rpb24gX2dldFNjb3BlUGFyZW50KGNvbmRpdGlvbkZ1bmMpIHtcbiAgICB2YXIgcGFyZW50O1xuICAgIHRyeSB7IHBhcmVudCA9IHRoaXMuc2NvcGUuX2hvc3RPYmplY3Qub3duZXI7IH0gY2F0Y2goZSkge31cblxuICAgIC8vIFdoZXJlIHRoZXJlIGlzIG5vIHBhcmVudCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB1bmRlZmluZWRcbiAgICAvLyBUaGUgcGFyZW50IGNvbXBvbmVudCBpcyBjaGVja2VkIHJlY3Vyc2l2ZWx5XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgICBpZiAoISBjb25kaXRpb25GdW5jIHx8IGNvbmRpdGlvbkZ1bmMocGFyZW50KSApXG4gICAgICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gX2dldFNjb3BlUGFyZW50LmNhbGwocGFyZW50LCBjb25kaXRpb25GdW5jKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHNjb3BlIHBhcmVudCB3aXRoIGEgZ2l2ZW4gY2xhc3MsIHdpdGggc2FtZSBjbGFzcyBpZiBub3Qgc3BlY2lmaWVkXG4gKlxuICogQHBhcmFtIHtbRnVuY3Rpb25dfSBDb21wb25lbnRDbGFzcyBjb21wb25lbnQgY2xhc3MgdGhhdCB0aGUgcGFyZW50IHNob3VsZCBoYXZlLCBzYW1lIGNsYXNzIGJ5IGRlZmF1bHRcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JGdldFNjb3BlUGFyZW50V2l0aENsYXNzKENvbXBvbmVudENsYXNzKSB7XG4gICAgQ29tcG9uZW50Q2xhc3MgPSBDb21wb25lbnRDbGFzcyB8fCB0aGlzLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBfZ2V0U2NvcGVQYXJlbnQuY2FsbCh0aGlzLCBmdW5jdGlvbihjb21wKSB7XG4gICAgICAgIHJldHVybiBjb21wIGluc3RhbmNlb2YgQ29tcG9uZW50Q2xhc3M7XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kLlxuICogUmV0dXJucyB0aGUgdG9wbW9zdCBzY29wZSBwYXJlbnQgb2YgYSBjb21wb25lbnQuXG4gKiBJZiBgY29uZGl0aW9uT3JGYWNldGAgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSB0b3Btb3N0IHNjb3BlIHBhcmVudCB3aWxsIGJlIHJldHVybmVkLCBvdGhlcndpc2UgdGhlIHRvcG1vc3QgYW5jZXN0b3Igd2l0aCBhIHNwZWNpZmllZCBmYWNldCBvciBwYXNzaW5nIGNvbmRpdGlvbiB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBjb25kaXRpb25PckZhY2V0IG9wdGlvbmFsIGNvbmRpdGlvbiB0aGF0IGNvbXBvbmVudCBzaG91bGQgcGFzcyAob3IgZmFjZXQgbmFtZSBpdCBzaG91bGQgY29udGFpbilcbiAqIEByZXR1cm4ge0NvbXBvbmVudHx1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRnZXRUb3BTY29wZVBhcmVudChjb25kaXRpb25PckZhY2V0KSB7XG4gICAgcmV0dXJuIF9jYWxsR2V0U2NvcGVQYXJlbnQuY2FsbCh0aGlzLCBfZ2V0VG9wU2NvcGVQYXJlbnQsIGNvbmRpdGlvbk9yRmFjZXQpO1xufVxuXG5mdW5jdGlvbiBfZ2V0VG9wU2NvcGVQYXJlbnQoY29uZGl0aW9uRnVuYykge1xuICAgIHZhciB0b3BQYXJlbnRcbiAgICAgICAgLCBwYXJlbnQgPSB0aGlzO1xuICAgIGRvIHtcbiAgICAgICAgcGFyZW50ID0gX2dldFNjb3BlUGFyZW50LmNhbGwocGFyZW50LCBjb25kaXRpb25GdW5jKTtcbiAgICAgICAgaWYgKHBhcmVudClcbiAgICAgICAgICAgIHRvcFBhcmVudCA9IHBhcmVudDtcbiAgICB9IHdoaWxlIChwYXJlbnQpO1xuXG4gICAgcmV0dXJuIHRvcFBhcmVudDtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgc2NvcGUgcGFyZW50IHdpdGggYSBnaXZlbiBjbGFzcywgd2l0aCBzYW1lIGNsYXNzIGlmIG5vdCBzcGVjaWZpZWRcbiAqXG4gKiBAcGFyYW0ge1tGdW5jdGlvbl19IENvbXBvbmVudENsYXNzIGNvbXBvbmVudCBjbGFzcyB0aGF0IHRoZSBwYXJlbnQgc2hvdWxkIGhhdmUsIHNhbWUgY2xhc3MgYnkgZGVmYXVsdFxuICogQHJldHVybiB7Q29tcG9uZW50fVxuICovXG5mdW5jdGlvbiBDb21wb25lbnQkZ2V0VG9wU2NvcGVQYXJlbnRXaXRoQ2xhc3MoQ29tcG9uZW50Q2xhc3MpIHtcbiAgICBDb21wb25lbnRDbGFzcyA9IENvbXBvbmVudENsYXNzIHx8IHRoaXMuY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIF9nZXRUb3BTY29wZVBhcmVudC5jYWxsKHRoaXMsIGZ1bmN0aW9uKGNvbXApIHtcbiAgICAgICAgcmV0dXJuIGNvbXAgaW5zdGFuY2VvZiBDb21wb25lbnRDbGFzcztcbiAgICB9KTtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIEZpbmRzIHNjb3BlIHBhcmVudCBvZiBjb21wb25lbnQgdXNpbmcgRE9NIHRyZWUgKHVubGlrZSBnZXRTY29wZVBhcmVudCB0aGF0IHNpbXBseSBnb2VzIHVwIHRoZSBzY29wZSB0cmVlKS5cbiAqIFdoaWxlIGdldFNjb3BlUGFyZW50IGlzIGZhc3RlciBpdCBtYXkgZmFpbCBpZiBzY29wZSBjaGFpbiBpcyBub3Qgc2V0dXAgeWV0IChlLmcuLCB3aGVuIGNvbXBvbmVudCBoYXMgYmVlbiBqdXN0IGluc2VydGVkKS5cbiAqIFRoZSBzY29wZSBwcm9wZXJ0eSBvZiBjb21wb25lbnQgd2lsbCBiZSBjaGFuZ2VkIHRvIHBvaW50IHRvIHNjb3BlIG9iamVjdCBvZiBjb250YWluZXIgZmFjZXQgb2YgdGhhdCBwYXJlbnQuXG4gKiBSZXR1cm5lZCBzY29wZSBwYXJlbnQgb2YgdGhlIGNvbXBvbmVudCB3aWxsIGJlIHVuZGVmaW5lZCAoYXMgd2VsbCBhcyBjb21wb25lbnQncyBzY29wZSBwcm9wZXJ0eSkgaWYgbm8gcGFyZW50IGluIHRoZSBET00gdHJlZSBoYXMgY29udGFpbmVyIGZhY2V0LlxuICogVE9ETyBNZXRob2Qgd2lsbCBub3QgYmluZCBET00gY2hpbGRyZW4gY29ycmVjdGx5IGlmIGNvbXBvbmVudCBoYXMgbm8gY29udGFpbmVyIGZhY2V0LlxuICpcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50JHNldFNjb3BlUGFyZW50RnJvbURPTSgpIHtcbiAgICB2YXIgcGFyZW50RWwgPSB0aGlzLmVsLnBhcmVudE5vZGU7XG5cbiAgICB2YXIgcGFyZW50LCBmb3VuZFBhcmVudDtcbiAgICB3aGlsZSAocGFyZW50RWwgJiYgISBmb3VuZFBhcmVudCkge1xuICAgICAgICBwYXJlbnQgPSBDb21wb25lbnQuZ2V0Q29tcG9uZW50KHBhcmVudEVsKTtcbiAgICAgICAgZm91bmRQYXJlbnQgPSBwYXJlbnQgJiYgcGFyZW50LmNvbnRhaW5lcjtcbiAgICAgICAgcGFyZW50RWwgPSBwYXJlbnRFbC5wYXJlbnROb2RlO1xuICAgIH1cblxuICAgIHRoaXMucmVtb3ZlKCk7IC8vIHJlbW92ZSBjb21wb25lbnQgZnJvbSBpdHMgY3VycmVudCBzY29wZSAoaWYgaXQgaXMgZGVmaW5lZClcbiAgICBpZiAoZm91bmRQYXJlbnQpIHtcbiAgICAgICAgdGhpcy5yZW5hbWUodW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgICAgIHBhcmVudC5jb250YWluZXIuc2NvcGUuX2FkZCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9ICAgICAgICBcbn1cblxuXG4vKipcbiAqIFdhbGtzIGNvbXBvbmVudCB0cmVlLCBjYWxsaW5nIHByb3ZpZGVkIGNhbGxiYWNrIG9uIGVhY2ggY29tcG9uZW50XG4gKlxuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcGFyYW0gdGhpc0FyZ1xuICovXG5mdW5jdGlvbiBDb21wb25lbnQkd2Fsa1Njb3BlVHJlZShjYWxsYmFjaywgdGhpc0FyZykge1xuICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdGhpcyk7XG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lcikgcmV0dXJuO1xuICAgIHRoaXMuY29udGFpbmVyLnNjb3BlLl9lYWNoKGZ1bmN0aW9uKGNvbXBvbmVudCkge1xuICAgICAgICBjb21wb25lbnQud2Fsa1Njb3BlVHJlZShjYWxsYmFjaywgdGhpc0FyZyk7XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gQ29tcG9uZW50JHRyZWVQYXRoT2YoY29tcG9uZW50KSB7XG4gICAgcmV0dXJuIGRvbVV0aWxzLnRyZWVQYXRoT2YodGhpcy5lbCwgY29tcG9uZW50LmVsKTtcbn1cblxuXG5mdW5jdGlvbiBDb21wb25lbnQkZ2V0Q29tcG9uZW50QXRUcmVlUGF0aCh0cmVlUGF0aCwgbmVhcmVzdCkge1xuICAgIHZhciBub2RlID0gZG9tVXRpbHMuZ2V0Tm9kZUF0VHJlZVBhdGgodGhpcy5lbCwgdHJlZVBhdGgsIG5lYXJlc3QpO1xuICAgIHJldHVybiBDb21wb25lbnQuZ2V0Q29tcG9uZW50KG5vZGUpO1xufVxuXG5cbmZ1bmN0aW9uIENvbXBvbmVudCRpbnNlcnRBdFRyZWVQYXRoKHRyZWVQYXRoLCBjb21wb25lbnQsIG5lYXJlc3QpIHtcbiAgICB2YXIgd2FzSW5zZXJ0ZWQgPSBkb21VdGlscy5pbnNlcnRBdFRyZWVQYXRoKHRoaXMuZWwsIHRyZWVQYXRoLCBjb21wb25lbnQuZWwpO1xuICAgIGlmICh3YXNJbnNlcnRlZCkgY29tcG9uZW50LnNldFNjb3BlUGFyZW50RnJvbURPTSgpO1xuICAgIHJldHVybiB3YXNJbnNlcnRlZDtcbn1cblxuXG4vKipcbiAqIEJyb2FkY2FzdCBtZXNzYWdlIHRvIGNvbXBvbmVudCBhbmQgdG8gYWxsIGl0cyBzY29wZSBjaGlsZHJlblxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gbXNnIG1lc3NhZ2UgdG8gYmUgc2VudFxuICogQHBhcmFtIHtbQW55XX0gZGF0YSBvcHRpb25hbCBtZXNzYWdlIGRhdGFcbiAqIEBwYXJhbSB7W0Z1bmN0aW9uXX0gY2FsbGJhY2sgb3B0aW9uYWwgY2FsbGJhY2tcbiAqIEBwYXJhbSB7W0Jvb2xlYW5dfSBzeW5jaHJvbm91c2x5IGlmIGl0IHNob3VsZCB1c2UgcG9zdE1lc3NhZ2VTeW5jXG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRicm9hZGNhc3QobXNnLCBkYXRhLCBjYWxsYmFjaywgc3luY2hyb25vdXNseSkge1xuICAgIHZhciBwb3N0TWV0aG9kID0gc3luY2hyb25vdXNseSA/ICdwb3N0TWVzc2FnZVN5bmMnIDogJ3Bvc3RNZXNzYWdlJztcbiAgICB0aGlzLndhbGtTY29wZVRyZWUoZnVuY3Rpb24oY29tcG9uZW50KSB7XG4gICAgICAgIGNvbXBvbmVudFtwb3N0TWV0aG9kXShtc2csIGRhdGEsIGNhbGxiYWNrKTtcbiAgICB9KTtcbn1cblxuXG4vKipcbiAqIERlc3Ryb3kgY29tcG9uZW50OiByZW1vdmVzIGNvbXBvbmVudCBmcm9tIERPTSwgcmVtb3ZlcyBpdCBmcm9tIHNjb3BlLCBkZWxldGVzIGFsbCByZWZlcmVuY2VzIHRvIERPTSBub2RlcyBhbmQgdW5zdWJzY3JpYmVzIGZyb20gYWxsIG1lc3NhZ2VzIGJvdGggY29tcG9uZW50IGFuZCBhbGwgZmFjZXRzXG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRkZXN0cm95KHF1aWV0KSB7XG4gICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkge1xuICAgICAgICBpZiAoIXF1aWV0KSBsb2dnZXIud2FybignQ29tcG9uZW50IGRlc3Ryb3k6IGNvbXBvbmVudCBpcyBhbHJlYWR5IGRlc3Ryb3llZCcpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlKGZhbHNlLCBxdWlldCk7XG4gICAgdGhpcy5hbGxGYWNldHMoJ2Rlc3Ryb3knKTtcbiAgICB0aGlzW01FU1NFTkdFUl9QUk9QRVJUWV0uZGVzdHJveSgpO1xuICAgIGlmICh0aGlzLmVsKSB7XG4gICAgICAgIGRvbVV0aWxzLmRldGFjaENvbXBvbmVudCh0aGlzLmVsKTtcbiAgICAgICAgZG9tVXRpbHMucmVtb3ZlRWxlbWVudCh0aGlzLmVsKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuZWw7XG4gICAgfVxuICAgIHRoaXMuY29tcG9uZW50SW5mby5kZXN0cm95KCk7XG4gICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBjb21wb25lbnQgd2FzIGRlc3Ryb3llZFxuICpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudCRpc0Rlc3Ryb3llZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVzdHJveWVkO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIGBtaWxvLkNvbXBvbmVudC5GYWNldGBcbiAqXG4gKiBUaGUgY2xhc3MgZm90IHRoZSBmYWNldCBvZiBjb21wb25lbnQuIFdoZW4gYSBjb21wb25lbnQgaXMgY3JlYXRlZCwgaXRcbiAqIGNyZWF0ZXMgYWxsIGl0cyBmYWNldHMuXG4gKlxuICogU2VlIEZhY2V0cyBzZWN0aW9uIG9uIGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZSBmYWNldHMgYW5kIG9uXG4gKiBob3cgdG8gY3JlYXRlIG5ldyBmYWNldHMgY2xhc3Nlcy5cbiAqXG4gKiAtIENvbXBvbmVudCAtIGJhc2ljIGNvbXBwb25lbnQgY2xhc3NcbiAqIC0gQ29tcG9uZW50RmFjZXQgLSBiYXNpY1xuICovXG5cbnZhciBGYWNldCA9IHJlcXVpcmUoJy4uL2Fic3RyYWN0L2ZhY2V0JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlciA9IG1pbG9Db3JlLk1lc3NlbmdlclxuICAgICwgY29tcG9uZW50VXRpbHMgPSByZXF1aXJlKCcuL2NfdXRpbHMnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG52YXIgQ29tcG9uZW50RmFjZXQgPSBfLmNyZWF0ZVN1YmNsYXNzKEZhY2V0LCAnQ29tcG9uZW50RmFjZXQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBDb21wb25lbnRGYWNldDtcblxuXG4vKipcbiAqIHBvc3REb21QYXJlbnRcbiAqXG4gKiBJZiBmYWNldCBoYXMgRE9NIHBhcmVudCBmYWNldCAoc2VlIGBkb21QYXJlbnRgIG1ldGhvZCksIHBvc3RzIHRoZSBtZXNzYWdlIHRvIHRoaXMgZmFjZXQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VUeXBlXG4gKiBAcGFyYW0ge09iamVjdH0gbWVzc2FnZURhdGFcbiAqL1xudmFyIHBvc3REb21QYXJlbnQgPSBfLnBhcnRpYWwoX3Bvc3RQYXJlbnQsIGRvbVBhcmVudCk7XG5cbi8qKlxuICogcG9zdFNjb3BlUGFyZW50XG4gKlxuICogSWYgZmFjZXQgaGFzIHNjb3BlIHBhcmVudCBmYWNldCAoc2VlIGBzY29wZVBhcmVudGAgbWV0aG9kKSwgcG9zdHMgdGhlIG1lc3NhZ2UgdG8gdGhpcyBmYWNldC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVR5cGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtZXNzYWdlRGF0YVxuICovXG52YXIgcG9zdFNjb3BlUGFyZW50ID0gXy5wYXJ0aWFsKF9wb3N0UGFyZW50LCBzY29wZVBhcmVudCk7XG5cblxuXy5leHRlbmRQcm90byhDb21wb25lbnRGYWNldCwge1xuICAgIGluaXQ6IENvbXBvbmVudEZhY2V0JGluaXQsXG4gICAgc3RhcnQ6IENvbXBvbmVudEZhY2V0JHN0YXJ0LFxuICAgIGNoZWNrOiBDb21wb25lbnRGYWNldCRjaGVjayxcbiAgICBkZXN0cm95OiBDb21wb25lbnRGYWNldCRkZXN0cm95LFxuICAgIG9uQ29uZmlnTWVzc2FnZXM6IENvbXBvbmVudEZhY2V0JG9uQ29uZmlnTWVzc2FnZXMsXG4gICAgZG9tUGFyZW50OiBkb21QYXJlbnQsXG4gICAgcG9zdERvbVBhcmVudDogcG9zdERvbVBhcmVudCxcbiAgICBzY29wZVBhcmVudDogc2NvcGVQYXJlbnQsXG4gICAgcG9zdFNjb3BlUGFyZW50OiBwb3N0U2NvcGVQYXJlbnQsXG4gICAgZ2V0TWVzc2FnZVNvdXJjZTogZ2V0TWVzc2FnZVNvdXJjZSxcbiAgICBkaXNwYXRjaFNvdXJjZU1lc3NhZ2U6IGRpc3BhdGNoU291cmNlTWVzc2FnZSxcbiAgICBfY3JlYXRlTWVzc2VuZ2VyOiBfY3JlYXRlTWVzc2VuZ2VyLFxuICAgIF9zZXRNZXNzYWdlU291cmNlOiBfc2V0TWVzc2FnZVNvdXJjZSxcbiAgICBfY3JlYXRlTWVzc2FnZVNvdXJjZTogX2NyZWF0ZU1lc3NhZ2VTb3VyY2UsXG4gICAgX2NyZWF0ZU1lc3NhZ2VTb3VyY2VXaXRoQVBJOiBfY3JlYXRlTWVzc2FnZVNvdXJjZVdpdGhBUElcbn0pO1xuXG5fLmV4dGVuZChDb21wb25lbnRGYWNldCwge1xuICAgIHJlcXVpcmVzRmFjZXQ6IHJlcXVpcmVzRmFjZXRcbn0pO1xuXG5cbi8qKlxuICogRXhwb3NlIE1lc3NlbmdlciBtZXRob2RzIG9uIEZhY2V0IHByb3RvdHlwZVxuICovXG52YXIgTUVTU0VOR0VSX1BST1BFUlRZID0gJ19tZXNzZW5nZXInO1xuTWVzc2VuZ2VyLnVzZVdpdGgoQ29tcG9uZW50RmFjZXQsIE1FU1NFTkdFUl9QUk9QRVJUWSwgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcblxuXG4vLyBpbml0Q29tcG9uZW50RmFjZXRcbmZ1bmN0aW9uIENvbXBvbmVudEZhY2V0JGluaXQoKSB7XG4gICAgdGhpcy5fY3JlYXRlTWVzc2VuZ2VyKCk7XG59XG5cblxuLy8gc29tZSBzdWJjbGFzc2VzIChlLmcuIE1vZGVsRmFjZXQpIG92ZXJycmlkZSB0aGlzIG1ldGhvZCBhbmQgZG8gbm90IGNyZWF0ZSB0aGVpciBvd24gbWVzc2VuZ2VyXG5mdW5jdGlvbiBfY3JlYXRlTWVzc2VuZ2VyKCl7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBNRVNTRU5HRVJfUFJPUEVSVFksIG5ldyBNZXNzZW5nZXIodGhpcykpO1xufVxuXG5cbi8vIHN0YXJ0Q29tcG9uZW50RmFjZXRcbmZ1bmN0aW9uIENvbXBvbmVudEZhY2V0JHN0YXJ0KCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5tZXNzYWdlcylcbiAgICAgICAgdGhpcy5vbkNvbmZpZ01lc3NhZ2VzKHRoaXMuY29uZmlnLm1lc3NhZ2VzKTtcbn1cblxuXG5mdW5jdGlvbiBDb21wb25lbnRGYWNldCRvbkNvbmZpZ01lc3NhZ2VzKG1lc3NhZ2VTdWJzY3JpYmVycykge1xuICAgIHZhciBub3RZZXRSZWdpc3RlcmVkTWFwID0gXy5tYXBLZXlzKG1lc3NhZ2VTdWJzY3JpYmVycywgZnVuY3Rpb24oc3Vic2NyaWJlciwgbWVzc2FnZXMpIHtcbiAgICAgICAgdmFyIHN1YnNjcmliZXJUeXBlID0gdHlwZW9mIHN1YnNjcmliZXI7XG4gICAgICAgIGlmIChzdWJzY3JpYmVyVHlwZSA9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMub24obWVzc2FnZXMsIHN1YnNjcmliZXIpO1xuXG4gICAgICAgIGlmIChzdWJzY3JpYmVyVHlwZSA9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdmFyIGNvbnRleHRUeXBlID0gdHlwZW9mIHN1YnNjcmliZXIuY29udGV4dDtcbiAgICAgICAgICAgIGlmIChjb250ZXh0VHlwZSA9PSAnb2JqZWN0JylcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vbihtZXNzYWdlcywgc3Vic2NyaWJlcik7XG5cbiAgICAgICAgICAgIGlmIChjb250ZXh0VHlwZSA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGlmIChzdWJzY3JpYmVyLmNvbnRleHQgPT0gdGhpcy5uYW1lIHx8IHN1YnNjcmliZXIuY29udGV4dCA9PSAnZmFjZXQnKVxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcjogc3Vic2NyaWJlci5zdWJzY3JpYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogdGhpc1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN1YnNjcmliZXIuY29udGV4dCA9PSAnb3duZXInKVxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcjogc3Vic2NyaWJlci5zdWJzY3JpYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogdGhpcy5vd25lclxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHN1YnNjcmliZXIgY29udGV4dCBpbiBjb25maWd1cmF0aW9uOiAnICsgc3Vic2NyaWJlci5jb250ZXh0KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9uKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHN1YnNjcmliZXIgY29udGV4dCB0eXBlIGluIGNvbmZpZ3VyYXRpb246ICcgKyBjb250ZXh0VHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gc3Vic2NyaWJlciB0eXBlIGluIGNvbmZpZ3VyYXRpb246ICcgKyBzdWJzY3JpYmVyVHlwZSk7XG4gICAgfSwgdGhpcyk7XG5cbiAgICByZXR1cm4gbm90WWV0UmVnaXN0ZXJlZE1hcDtcbn1cblxuXG4vLyBjaGVja0RlcGVuZGVuY2llc1xuZnVuY3Rpb24gQ29tcG9uZW50RmFjZXQkY2hlY2soKSB7XG4gICAgaWYgKHRoaXMucmVxdWlyZSkge1xuICAgICAgICB0aGlzLnJlcXVpcmUuZm9yRWFjaChmdW5jdGlvbihyZXFGYWNldCkge1xuICAgICAgICAgICAgaWYgKCEgdGhpcy5vd25lci5oYXNGYWNldChyZXFGYWNldCkpXG4gICAgICAgICAgICAgICAgdGhpcy5vd25lci5hZGRGYWNldChyZXFGYWNldCk7XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH1cbn1cblxuXG4vLyBkZXN0cm95cyBmYWNldFxuZnVuY3Rpb24gQ29tcG9uZW50RmFjZXQkZGVzdHJveSgpIHtcbiAgICBpZiAodGhpc1tNRVNTRU5HRVJfUFJPUEVSVFldKSB0aGlzW01FU1NFTkdFUl9QUk9QRVJUWV0uZGVzdHJveSgpO1xuICAgIHRoaXMuX2Rlc3Ryb3llZCA9IHRydWU7XG59XG5cblxuLyoqXG4gKiBkb21QYXJlbnRcbiAqXG4gKiBAcmV0dXJuIHtDb21wb25lbnRGYWNldH0gcmVmZXJlbmNlIHRvIHRoZSBmYWNldCBvZiB0aGUgc2FtZSBjbGFzcyBvZiB0aGUgY2xvc2VzdCBwYXJlbnQgRE9NIGVsZW1lbnQsIHRoYXQgaGFzIGEgY29tcG9uZW50IHdpdGggdGhlIHNhbWUgZmFjZXQgY2xhc3MgYXR0YWNoZWQgdG8gaXQuIElmIHN1Y2ggZWxlbWVudCBkb2Vzbid0IGV4aXN0IG1ldGhvZCB3aWxsIHJldHVybiB1bmRlZmluZWQuXG4gKi9cbmZ1bmN0aW9uIGRvbVBhcmVudCgpIHtcbiAgICB2YXIgcGFyZW50Q29tcG9uZW50ID0gY29tcG9uZW50VXRpbHMuZ2V0Q29udGFpbmluZ0NvbXBvbmVudCh0aGlzLm93bmVyLmVsLCBmYWxzZSwgdGhpcy5uYW1lKTtcbiAgICByZXR1cm4gcGFyZW50Q29tcG9uZW50ICYmIHBhcmVudENvbXBvbmVudFt0aGlzLm5hbWVdO1xufVxuXG5cbi8qKlxuICogc2NvcGVQYXJlbnRcbiAqXG4gKiBAcmV0dXJuIHtDb21wb25lbnRGYWNldH0gcmVmZXJlbmNlIHRvIHRoZSBmYWNldCBvZiB0aGUgc2FtZSBjbGFzcyBhcyBgdGhpc2AgZmFjZXQgb2YgdGhlIGNsb3Nlc3Qgc2NvcGUgcGFyZW50IChpLmUuLCB0aGUgY29tcG9uZW50IHRoYXQgaGFzIHRoZSBzY29wZSBvZiB0aGUgY3VycmVudCBjb21wb25lbnQgaW4gaXRzIGNvbnRhaW5lciBmYWNldCkuXG4gKi9cbmZ1bmN0aW9uIHNjb3BlUGFyZW50KCkge1xuICAgIHZhciBwYXJlbnRDb21wb25lbnQgPSB0aGlzLm93bmVyLmdldFNjb3BlUGFyZW50KHRoaXMubmFtZSk7XG4gICAgcmV0dXJuIHBhcmVudENvbXBvbmVudCAmJiBwYXJlbnRDb21wb25lbnRbdGhpcy5uYW1lXTtcbn1cblxuXG5mdW5jdGlvbiBfcG9zdFBhcmVudChnZXRQYXJlbnRNZXRob2QsIG1lc3NhZ2VUeXBlLCBtZXNzYWdlRGF0YSkge1xuICAgIHZhciBwYXJlbnRGYWNldCA9IGdldFBhcmVudE1ldGhvZC5jYWxsKHRoaXMpO1xuICAgIGlmIChwYXJlbnRGYWNldClcbiAgICAgICAgcGFyZW50RmFjZXQucG9zdE1lc3NhZ2UobWVzc2FnZVR5cGUsIG1lc3NhZ2VEYXRhKTtcbn1cblxuXG5mdW5jdGlvbiBfc2V0TWVzc2FnZVNvdXJjZShtZXNzYWdlU291cmNlKSB7XG4gICAgdGhpc1tNRVNTRU5HRVJfUFJPUEVSVFldLl9zZXRNZXNzYWdlU291cmNlKG1lc3NhZ2VTb3VyY2UpO1xufVxuXG5cbmZ1bmN0aW9uIGdldE1lc3NhZ2VTb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXNbTUVTU0VOR0VSX1BST1BFUlRZXS5nZXRNZXNzYWdlU291cmNlKCk7XG59XG5cblxuZnVuY3Rpb24gZGlzcGF0Y2hTb3VyY2VNZXNzYWdlKG1lc3NhZ2UsIGRhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRNZXNzYWdlU291cmNlKCkuZGlzcGF0Y2hNZXNzYWdlKG1lc3NhZ2UsIGRhdGEpO1xufVxuXG5cbmZ1bmN0aW9uIF9jcmVhdGVNZXNzYWdlU291cmNlKE1lc3NhZ2VTb3VyY2VDbGFzcywgb3B0aW9ucykge1xuICAgIHZhciBtZXNzYWdlU291cmNlID0gbmV3IE1lc3NhZ2VTb3VyY2VDbGFzcyh0aGlzLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdGhpcy5vd25lciwgb3B0aW9ucyk7XG4gICAgdGhpcy5fc2V0TWVzc2FnZVNvdXJjZShtZXNzYWdlU291cmNlKVxuXG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX21lc3NhZ2VTb3VyY2UnLCBtZXNzYWdlU291cmNlKTtcbn1cblxuXG5mdW5jdGlvbiBfY3JlYXRlTWVzc2FnZVNvdXJjZVdpdGhBUEkoTWVzc2FnZVNvdXJjZUNsYXNzLCBtZXNzZW5nZXJBUElPckNsYXNzLCBvcHRpb25zKSB7XG4gICAgdmFyIG1lc3NhZ2VTb3VyY2UgPSBuZXcgTWVzc2FnZVNvdXJjZUNsYXNzKHRoaXMsIHVuZGVmaW5lZCwgbWVzc2VuZ2VyQVBJT3JDbGFzcywgdGhpcy5vd25lciwgb3B0aW9ucyk7XG4gICAgdGhpcy5fc2V0TWVzc2FnZVNvdXJjZShtZXNzYWdlU291cmNlKVxuXG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX21lc3NhZ2VTb3VyY2UnLCBtZXNzYWdlU291cmNlKTtcbn1cblxuXG5mdW5jdGlvbiByZXF1aXJlc0ZhY2V0KGZhY2V0TmFtZSkge1xuICAgIC8vICd0aGlzJyByZWZlcnMgdG8gdGhlIEZhY2V0IENsYXNzXG4gICAgdmFyIGZhY2V0UmVxdWlyZSA9IHRoaXMucHJvdG90eXBlLnJlcXVpcmU7XG5cbiAgICByZXR1cm4gZmFjZXRSZXF1aXJlICYmIChmYWNldFJlcXVpcmUuaW5kZXhPZihfLmZpcnN0VXBwZXJDYXNlKGZhY2V0TmFtZSkpID49IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGZhY2V0UmVxdWlyZS5pbmRleE9mKF8uZmlyc3RMb3dlckNhc2UoZmFjZXROYW1lKSkgPj0gMCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBtaWxvQmluZGVyID0gcmVxdWlyZSgnLi4vLi4vYmluZGVyJylcbiAgICAsIFNjb3BlID0gcmVxdWlyZSgnLi4vc2NvcGUnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIGRvbVV0aWxzID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kb20nKTtcblxuXG4vKipcbiAqIGBtaWxvLnJlZ2lzdHJ5LmZhY2V0cy5nZXQoJ0NvbnRhaW5lcicpYFxuICogQSBzcGVjaWFsIGNvbXBvbmVudCBmYWNldCB0aGF0IG1ha2VzIGNvbXBvbmVudCBjcmVhdGUgaXRzIG93biBpbm5lciBzY29wZS5cbiAqIFdoZW4gW21pbG8uYmluZGVyXSguLi8uLi9iaW5kZXIuanMuaHRtbCkgYmluZHMgRE9NIHRyZWUgYW5kIGNyZWF0ZXMgY29tcG9uZW50cywgaWYgY29tcG9uZW50cyBhcmUgaW5zaWRlIGNvbXBvbmVudCBXSVRIIENvbnRhaW5lciBmYWNldCwgdGhleSBhcmUgcHV0IG9uIHRoZSBgc2NvcGVgIG9mIGl0IChjb21wb25lbnQuY29udGFpbmVyLnNjb3BlIC0gc2VlIFtTY29wZV0oLi4vc2NvcGUuanMuaHRtbCkpLCBvdGhlcndpc2UgdGhleSBhcmUgcHV0IG9uIHRoZSBzYW1lIHNjb3BlIGV2ZW4gdGhvdWdoIHRoZXkgbWF5IGJlIGRlZXBlciBpbiBET00gdHJlZS5cbiAqIEl0IGFsbG93cyBjcmVhdGluZyBuYW1lc3BhY2VzIGF2b2lkaW5nIGNvbXBvbmVudHMgbmFtZXMgY29uZmxpY3RzLCBhdCB0aGUgc2FtZSB0aW1lIGNyZWF0aW5nIG1vcmUgc2hhbGxvdyBjb21wb25lbnRzIHRyZWUgdGhhbiB0aGUgRE9NIHRyZWUuXG4gKiBUbyBjcmVhdGUgY29tcG9uZW50cyBmb3IgZWxlbWVudHMgaW5zaWRlIHRoZSBjdXJyZW50IGNvbXBvbmVudCB1c2U6XG4gKiBgYGBcbiAqIGNvbXBvbmVudC5jb250YWluZXIuYmluZGVyKCk7XG4gKiBgYGBcbiAqIFNlZSBbbWlsby5iaW5kZXJdKC4uLy4uL2JpbmRlci5qcy5odG1sKVxuICovXG52YXIgQ29udGFpbmVyID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0NvbnRhaW5lcicpO1xuXG5cbi8qKlxuICogIyMjI0NvbnRhaW5lciBmYWNldCBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2JpbmRlcl0oI0NvbnRhaW5lciRiaW5kZXIpIC0gY3JlYXRlIGNvbXBvbmVudHMgZnJvbSBET00gaW5zaWRlIHRoZSBjdXJyZW50IG9uZVxuICovXG5fLmV4dGVuZFByb3RvKENvbnRhaW5lciwge1xuICAgIHN0YXJ0OiBDb250YWluZXIkc3RhcnQsXG4gICAgcGF0aDogQ29udGFpbmVyJHBhdGgsXG4gICAgZ2V0U3RhdGU6IENvbnRhaW5lciRnZXRTdGF0ZSxcbiAgICBzZXRTdGF0ZTogQ29udGFpbmVyJHNldFN0YXRlLFxuICAgIGJpbmRlcjogQ29udGFpbmVyJGJpbmRlcixcbiAgICBkZXN0cm95OiBDb250YWluZXIkZGVzdHJveSxcbiAgICB1bndyYXA6IENvbnRhaW5lciR1bndyYXAsXG5cbiAgICBhcHBlbmQ6IENvbnRhaW5lciRhcHBlbmQsXG4gICAgaW5zZXJ0QmVmb3JlOiBDb250YWluZXIkaW5zZXJ0QmVmb3JlLFxuICAgIHJlbW92ZTogQ29udGFpbmVyJHJlbW92ZVxufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChDb250YWluZXIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbnRhaW5lcjtcblxuXG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2QuXG4gKiBTY2FucyBET00sIGNyZWF0ZXMgY29tcG9uZW50cyBhbmQgYWRkcyB0byBzY29wZSBjaGlsZHJlbiBvZiBjb21wb25lbnQgZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gQ29udGFpbmVyJGJpbmRlcigpIHtcbiAgICByZXR1cm4gbWlsb0JpbmRlcih0aGlzLm93bmVyLmVsLCB0aGlzLnNjb3BlLCBmYWxzZSk7XG59XG5cblxuLyoqXG4gKiBDb250YWluZXIgaW5zdGFuY2UgbWV0aG9kLlxuICogU2V0dXAgZW1wdHkgc2NvcGUgb2JqZWN0IG9uIHN0YXJ0XG4gKi9cbmZ1bmN0aW9uIENvbnRhaW5lciRzdGFydCgpIHtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuc3RhcnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLnNjb3BlID0gbmV3IFNjb3BlKHRoaXMub3duZXIuZWwsIHRoaXMpO1xufVxuXG5cbnZhciBhbGxvd2VkTmFtZVBhdHRlcm4gPSAvXltBLVphLXpdW0EtWmEtejAtOVxcX1xcJF0qJC87XG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2QuXG4gKiBTYWZlbHkgdHJhdmVyc2VzIGNvbXBvbmVudCBzY29wZVxuICogUmV0dXJucyBjb21wb25lbnQgaW4gc2NvcGUgZm9yIGEgZ2l2ZW4gcGF0aFxuICogSWYgcGF0aCBpcyBpbnZhbGlkIHRoZSBtZXRob2Qgd2lsbCB0aHJvdywgaWYgdGhlcmUgaXMgbm8gY29tcG9uZW50IGF0IGEgZ2l2ZW4gcGF0aCBvciBzb21lIG9mIHRoZSBjb21wb25lbnRzIGFsb25nIHRoZSBwYXRoIGRvZXMgbm90IGhhdmUgQ29udGFpbmVyIGZhY2V0IHRoZSBtZXRob2Qgd2lsbCByZXR1cm4gdW5kZWZpbmVkLCBcbiAqIFxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGggcGF0aCBvZiBjaGlsZCBjb21wb25lbnQgaW4gc2NvcGUsIGVhY2ggbmFtZSBzaG91bGQgYmUgcHJlZml4ZWQgd2l0aCAnLicsIGUuZy46ICcuY2hpbGQuc3ViY2hpbGQnXG4gKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gKi9cbmZ1bmN0aW9uIENvbnRhaW5lciRwYXRoKHBhdGgpIHtcbiAgICBwYXRoID0gcGF0aC5zcGxpdCgnLicpO1xuICAgIHZhciBsZW4gPSBwYXRoLmxlbmd0aDtcbiAgICBpZiAocGF0aFswXSB8fCBsZW4gPCAyKSB0aHJvd0ludmFsaWRQYXRoKCk7XG4gICAgdmFyIGNvbXAgPSB0aGlzLm93bmVyO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIG5hbWUgPSBwYXRoW2ldO1xuICAgICAgICBpZiAoIWFsbG93ZWROYW1lUGF0dGVybi50ZXN0KG5hbWUpKSB0aHJvd0ludmFsaWRQYXRoKCk7XG4gICAgICAgIGlmICghY29tcC5jb250YWluZXIpIHJldHVybjtcbiAgICAgICAgY29tcCA9IGNvbXAuY29udGFpbmVyLnNjb3BlW25hbWVdO1xuICAgICAgICBpZiAoIWNvbXApIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXA7XG5cbiAgICBmdW5jdGlvbiB0aHJvd0ludmFsaWRQYXRoKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhdGggJyArIHBhdGggKyAnIGlzIGludmFsaWQnKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBDb250YWluZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBDYWxsZWQgYnkgYENvbXBvbmVudC5wcm90b3R5cGUuZ2V0U3RhdGVgIHRvIGdldCBmYWNldCdzIHN0YXRlXG4gKiBSZXR1cm5zIHRoZSBzdGF0ZSBvZiBjb21wb25lbnRzIGluIHRoZSBzY29wZVxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVlcENvcHkgdHJ1ZSBieSBkZWZhdWx0XG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIENvbnRhaW5lciRnZXRTdGF0ZShkZWVwQ29weSkge1xuICAgIHZhciBzdGF0ZSA9IHsgc2NvcGU6IHt9IH07XG4gICAgaWYgKGRlZXBDb3B5ICE9PSBmYWxzZSlcbiAgICAgICAgdGhpcy5zY29wZS5fZWFjaChmdW5jdGlvbihjb21wb25lbnQsIGNvbXBOYW1lKSB7XG4gICAgICAgICAgICBzdGF0ZS5zY29wZVtjb21wTmFtZV0gPSBjb21wb25lbnQuX2dldFN0YXRlKCk7XG4gICAgICAgIH0pO1xuICAgIHJldHVybiBzdGF0ZTtcbn1cblxuXG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2RcbiAqIENhbGxlZCBieSBgQ29tcG9uZW50LnByb3RvdHlwZS5zZXRTdGF0ZWAgdG8gc2V0IGZhY2V0J3Mgc3RhdGVcbiAqIFNldHMgdGhlIHN0YXRlIG9mIGNvbXBvbmVudHMgaW4gdGhlIHNjb3BlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgZGF0YSB0byBzZXQgb24gZmFjZXQncyBtb2RlbFxuICovXG5mdW5jdGlvbiBDb250YWluZXIkc2V0U3RhdGUoc3RhdGUpIHtcbiAgICBfLmVhY2hLZXkoc3RhdGUuc2NvcGUsIGZ1bmN0aW9uKGNvbXBEYXRhLCBjb21wTmFtZSkge1xuICAgICAgICB2YXIgY29tcG9uZW50ID0gdGhpcy5zY29wZVtjb21wTmFtZV07XG4gICAgICAgIGlmIChjb21wb25lbnQpXG4gICAgICAgICAgICBjb21wb25lbnQuc2V0U3RhdGUoY29tcERhdGEpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsb2dnZXIud2FybignY29tcG9uZW50IFwiJyArIGNvbXBOYW1lICsgJ1wiIGRvZXMgbm90IGV4aXN0IG9uIHNjb3BlJyk7XG4gICAgfSwgdGhpcyk7XG59XG5cbmZ1bmN0aW9uIENvbnRhaW5lciRkZXN0cm95KCkge1xuICAgIHRoaXMuc2NvcGUuX2VhY2goZnVuY3Rpb24oY29tcG9uZW50KSB7XG4gICAgICAgIGNvbXBvbmVudC5kZXN0cm95KCk7XG4gICAgfSk7XG4gICAgdGhpcy5zY29wZS5fZGV0YWNoRWxlbWVudCgpO1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiBDb250YWluZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBNb3ZlcyBhbGwgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBvd25lciBpbnRvIHRoZSBwYXJlbnQgc2NvcGVcbiAqIFxuICogQHBhcmFtIHtCb29sZWFufSByZW5hbWVDaGlsZHJlbiBwYXNzIGZhbHNlIHRvIG5vdCByZW5hbWUgc2NvcGUgY2hpbGRyZW4gKGRlZmF1bHQgaXMgdHJ1ZSlcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVzdHJveSBJZiBub3QgZmFsc2UsIHRoZSBjb21wb25lbnQgd2lsbCBiZSBkZXN0cm95ZWQgYXQgdGhlIGVuZCAoZGVmYXVsdCBpcyB0cnVlKS5cbiAqL1xuZnVuY3Rpb24gQ29udGFpbmVyJHVud3JhcChyZW5hbWVDaGlsZHJlbiwgZGVzdHJveSkge1xuICAgIGRvbVV0aWxzLnVud3JhcEVsZW1lbnQodGhpcy5vd25lci5lbCk7XG4gICAgdGhpcy5zY29wZSAmJiB0aGlzLnNjb3BlLl9lYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBjaGlsZC5yZW1vdmUoKTtcbiAgICAgICAgaWYgKHJlbmFtZUNoaWxkcmVuICE9PSBmYWxzZSkgY2hpbGQucmVuYW1lKHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgICAgICB0aGlzLm93bmVyLnNjb3BlICYmIHRoaXMub3duZXIuc2NvcGUuX2FkZChjaGlsZCk7XG4gICAgfSwgdGhpcyk7XG4gICAgaWYgKGRlc3Ryb3kgIT09IGZhbHNlKSB0aGlzLm93bmVyLmRlc3Ryb3koKTtcbn1cblxuXG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2RcbiAqIEFwcGVuZCBjb21wb25lbnQgdG8gRE9NIGFuZCB0byBzY29wZVxuICogQHBhcmFtIHtDb21wb25lbnR9IGNvbXAgY29tcG9uZW50IHRoYXQgd2lsbCBiZSBhcHBlbmRlZFxuICovXG5mdW5jdGlvbiBDb250YWluZXIkYXBwZW5kKGNvbXApIHtcbiAgICB0aGlzLnNjb3BlLl9hZGQoY29tcCk7XG4gICAgdGhpcy5vd25lci5lbC5hcHBlbmRDaGlsZChjb21wLmVsKTtcbn1cblxuXG4vKipcbiAqIENvbnRhaW5lciBpbnN0YW5jZSBtZXRob2RcbiAqIEluc2VydCBjb21wb25lbnQgdG8gRE9NIGFuZCB0byBzY29wZSBiZWZvcmUgYW5vdGhlciBjb21wb25lbnRcbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wIGNvbXBvbmVudCB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWRcbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBzaWJsaW5nIGNvbXBvbmVudCBiZWZvcmUgd2hpY2ggY29tcG9uZW50IHdpbGwgYmUgYXBwZW5kZWRcbiAqL1xuZnVuY3Rpb24gQ29udGFpbmVyJGluc2VydEJlZm9yZShjb21wLCBzaWJsaW5nKSB7XG4gICAgdGhpcy5zY29wZS5fYWRkKGNvbXApO1xuICAgIHRoaXMuZWwuaW5zZXJ0QmVmb3JlKGNvbXAuZWwsIHNpYmxpbmcgJiYgc2libGluZy5lbCk7XG59XG5cbmZ1bmN0aW9uIENvbnRhaW5lciRyZW1vdmUoY29tcCkge1xuICAgIHRoaXMuc2NvcGUuX3JlbW92ZShjb21wKTtcbiAgICB0aGlzLm93bmVyLmVsLnJlbW92ZUNoaWxkKGNvbXAuZWwpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWl4aW4gPSBtaWxvQ29yZS5jbGFzc2VzLk1peGluXG4gICAgLCBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcblxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyXG4gICAgLCBET01FdmVudHNTb3VyY2UgPSByZXF1aXJlKCcuLi9tc2dfc3JjL2RvbV9ldmVudHMnKVxuICAgICwgRGF0YU1zZ0FQSSA9IHJlcXVpcmUoJy4uL21zZ19hcGkvZGF0YScpXG4gICAgLCBnZXRFbGVtZW50RGF0YUFjY2VzcyA9IHJlcXVpcmUoJy4uL21zZ19hcGkvZGVfZGF0YScpXG4gICAgLCBNb2RlbCA9IG1pbG9Db3JlLk1vZGVsXG4gICAgLCBwYXRoVXRpbHMgPSBNb2RlbC5fdXRpbHMucGF0aFxuICAgICwgbW9kZWxVdGlscyA9IE1vZGVsLl91dGlscy5tb2RlbFxuICAgICwgY2hhbmdlRGF0YUhhbmRsZXIgPSBNb2RlbC5fdXRpbHMuY2hhbmdlRGF0YUhhbmRsZXJcbiAgICAsIGdldFRyYW5zYWN0aW9uRmxhZyA9IGNoYW5nZURhdGFIYW5kbGVyLmdldFRyYW5zYWN0aW9uRmxhZ1xuICAgICwgc2V0VHJhbnNhY3Rpb25GbGFnID0gY2hhbmdlRGF0YUhhbmRsZXIuc2V0VHJhbnNhY3Rpb25GbGFnXG4gICAgLCBwb3N0VHJhbnNhY3Rpb25GaW5pc2hlZCA9IGNoYW5nZURhdGFIYW5kbGVyLnBvc3RUcmFuc2FjdGlvbkZpbmlzaGVkXG5cbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXI7XG5cblxuLyoqXG4gKiBgbWlsby5yZWdpc3RyeS5mYWNldHMuZ2V0KCdEYXRhJylgXG4gKiBGYWNldCB0byBnaXZlIGFjY2VzcyB0byBET00gZGF0YVxuICovXG52YXIgRGF0YSA9IF8uY3JlYXRlU3ViY2xhc3MoQ29tcG9uZW50RmFjZXQsICdEYXRhJyk7XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZHNcbiAqXG4gKiAtIFtzdGFydF0oI0RhdGEkc3RhcnQpIC0gc3RhcnQgRGF0YSBmYWNldFxuICogLSBbZ2V0XSgjRGF0YSRnZXQpIC0gZ2V0IERPTSBkYXRhIGZyb20gRE9NIHRyZWVcbiAqIC0gW3NldF0oI0RhdGEkc2V0KSAtIHNldCBET00gZGF0YSB0byBET00gdHJlZVxuICogLSBbcGF0aF0oI0RhdGEkcGF0aCkgLSBnZXQgcmVmZXJlbmNlIHRvIERhdGEgZmFjZXQgYnkgcGF0aFxuICovXG5fLmV4dGVuZFByb3RvKERhdGEsIHtcbiAgICBzdGFydDogRGF0YSRzdGFydCxcbiAgICBnZXRTdGF0ZTogRGF0YSRnZXRTdGF0ZSxcbiAgICBzZXRTdGF0ZTogRGF0YSRzZXRTdGF0ZSxcblxuICAgIGdldDogRGF0YSRnZXQsXG4gICAgc2V0OiBEYXRhJHNldCxcbiAgICBkZWw6IERhdGEkZGVsLFxuICAgIHNwbGljZTogRGF0YSRzcGxpY2UsXG4gICAgbGVuOiBEYXRhJGxlbixcbiAgICBwYXRoOiBEYXRhJHBhdGgsXG4gICAgZ2V0UGF0aDogRGF0YSRnZXRQYXRoLFxuICAgIGdldEtleTogRGF0YSRnZXRLZXksXG5cbiAgICBfZ2V0OiBEYXRhJF9nZXQsXG4gICAgX3NldDogRGF0YSRfc2V0LFxuICAgIF9kZWw6IERhdGEkX2RlbCxcbiAgICBfc3BsaWNlOiBEYXRhJF9zcGxpY2UsXG4gICAgX2xlbjogRGF0YSRfbGVuLFxuXG4gICAgX3NldFNjYWxhclZhbHVlOiBEYXRhJF9zZXRTY2FsYXJWYWx1ZSxcbiAgICBfZ2V0U2NhbGFyVmFsdWU6IERhdGEkX2dldFNjYWxhclZhbHVlLFxuICAgIF9idWJibGVVcERhdGFDaGFuZ2U6IERhdGEkX2J1YmJsZVVwRGF0YUNoYW5nZSxcbiAgICBfcXVldWVEYXRhQ2hhbmdlOiBEYXRhJF9xdWV1ZURhdGFDaGFuZ2UsXG4gICAgX3Bvc3REYXRhQ2hhbmdlczogRGF0YSRfcG9zdERhdGFDaGFuZ2VzLFxuICAgIF9wcmVwYXJlTWVzc2FnZVNvdXJjZTogX3ByZXBhcmVNZXNzYWdlU291cmNlXG59KTtcblxuZmFjZXRzUmVnaXN0cnkuYWRkKERhdGEpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGE7XG5cblxuLyoqXG4gKiBNb2RlbFBhdGggbWV0aG9kcyBhZGRlZCB0byBEYXRhIHByb3RvdHlwZVxuICovXG5bJ3B1c2gnLCAncG9wJywgJ3Vuc2hpZnQnLCAnc2hpZnQnXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICB2YXIgbWV0aG9kID0gTW9kZWwuUGF0aC5wcm90b3R5cGVbbWV0aG9kTmFtZV07XG4gICAgXy5kZWZpbmVQcm9wZXJ0eShEYXRhLnByb3RvdHlwZSwgbWV0aG9kTmFtZSwgbWV0aG9kKTtcbn0pO1xuXG5cblxuLy8gdGhlc2UgbWV0aG9kcyB3aWxsIGJlIHdyYXBwZWQgdG8gc3VwcG9ydCBcIipcIiBwYXR0ZXJuIHN1YnNjcmlwdGlvbnNcbnZhciBwcm94eURhdGFTb3VyY2VNZXRob2RzID0ge1xuICAgICAgICAvLyB2YWx1ZTogJ3ZhbHVlJyxcbiAgICAgICAgdHJpZ2dlcjogJ3RyaWdnZXInXG4gICAgfTtcblxuXG4vKipcbiAqIERhdGEgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTdGFydHMgRGF0YSBmYWNldFxuICogQ2FsbGVkIGJ5IGNvbXBvbmVudCBhZnRlciBjb21wb25lbnQgaXMgaW5pdGlhbGl6ZWQuXG4gKi9cbmZ1bmN0aW9uIERhdGEkc3RhcnQoKSB7XG4gICAgLy8gY2hhbmdlIG1lc3NlbmdlciBtZXRob2RzIHRvIHdvcmsgd2l0aCBcIipcIiBzdWJzY3JpcHRpb25zIChsaWtlIE1vZGVsIGNsYXNzKVxuICAgIHBhdGhVdGlscy53cmFwTWVzc2VuZ2VyTWV0aG9kcy5jYWxsKHRoaXMpO1xuXG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLnN0YXJ0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAvLyBnZXQvc2V0IG1ldGhvZHMgdG8gc2V0IGRhdGEgb2YgZWxlbWVudFxuICAgIHRoaXMuZWxEYXRhID0gZ2V0RWxlbWVudERhdGFBY2Nlc3ModGhpcy5vd25lci5lbCk7XG5cbiAgICB0aGlzLl9kYXRhQ2hhbmdlc1F1ZXVlID0gW107XG5cbiAgICB0aGlzLl9wcmVwYXJlTWVzc2FnZVNvdXJjZSgpO1xuXG4gICAgLy8gc3RvcmUgZmFjZXQgZGF0YSBwYXRoXG4gICAgdGhpcy5fcGF0aCA9ICcuJyArIHRoaXMub3duZXIubmFtZTtcblxuICAgIC8vIGN1cnJlbnQgdmFsdWVcbiAgICB0aGlzLl92YWx1ZSA9IHRoaXMuZ2V0KCk7XG5cbiAgICAvLyBwcmVwYXJlIGludGVybmFsIGFuZCBleHRlcm5hbCBtZXNzZW5nZXJzXG4gICAgLy8gdGhpcy5fcHJlcGFyZU1lc3NlbmdlcnMoKTtcblxuICAgIC8vIHN1YnNjcmliZSB0byBET00gZXZlbnQgYW5kIGFjY2Vzc29ycycgbWVzc2FnZXNcbiAgICB0aGlzLm9uU3luYygnJywgb25Pd25EYXRhQ2hhbmdlKTtcblxuICAgIC8vIG1lc3NhZ2UgdG8gbWFyayB0aGUgZW5kIG9mIGJhdGNoIG9uIHRoZSBjdXJyZW50IGxldmVsXG4gICAgdGhpcy5vblN5bmMoJ2RhdGFjaGFuZ2VzZmluaXNoZWQnLCBvbkRhdGFDaGFuZ2VzRmluaXNoZWQpO1xuXG4gICAgLy8gY2hhbmdlcyBpbiBzY29wZSBjaGlsZHJlbiB3aXRoIERhdGEgZmFjZXRcbiAgICB0aGlzLm9uU3luYygnY2hpbGRkYXRhJywgb25DaGlsZERhdGEpO1xuXG4gICAgLy8gdG8gZW5hYmxlIHJlYWN0aXZlIGNvbm5lY3Rpb25zXG4gICAgdGhpcy5vblN5bmMoJ2NoYW5nZWRhdGEnLCBjaGFuZ2VEYXRhSGFuZGxlcik7XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogQ3JlYXRlIGFuZCBjb25uZWN0IGludGVybmFsIGFuZCBleHRlcm5hbCBtZXNzZW5nZXJzIG9mIERhdGEgZmFjZXQuXG4gKiBFeHRlcm5hbCBtZXNzZW5nZXIncyBtZXRob2RzIGFyZSBwcm94aWVkIG9uIHRoZSBEYXRhIGZhY2V0IGFuZCB0aGV5IGFsbG93cyBcIipcIiBzdWJzY3JpcHRpb25zLlxuICovXG4vLyBmdW5jdGlvbiBfcHJlcGFyZU1lc3NlbmdlcnMoKSB7XG4gICAgLy8gRGF0YSBmYWNldCB3aWxsIHBvc3QgYWxsIGl0cyBjaGFuZ2VzIG9uIGludGVybmFsIG1lc3NlbmdlclxuICAgIC8vIHZhciBpbnRlcm5hbE1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcyk7XG5cbiAgICAvLyBtZXNzYWdlIHNvdXJjZSB0byBjb25uZWN0IGludGVybmFsIG1lc3NlbmdlciB0byBleHRlcm5hbFxuICAgIC8vIHZhciBpbnRlcm5hbE1lc3NlbmdlclNvdXJjZSA9IG5ldyBNZXNzZW5nZXJNZXNzYWdlU291cmNlKHRoaXMsIHVuZGVmaW5lZCwgbmV3IE1vZGVsTXNnQVBJLCBpbnRlcm5hbE1lc3Nlbmdlcik7XG5cbiAgICAvLyBleHRlcm5hbCBtZXNzZW5nZXIgdG8gd2hpY2ggYWxsIG1vZGVsIHVzZXJzIHdpbGwgc3Vic2NyaWJlLFxuICAgIC8vIHRoYXQgd2lsbCBhbGxvdyBcIipcIiBzdWJzY3JpcHRpb25zIGFuZCBzdXBwb3J0IFwiY2hhbmdlZGF0YVwiIG1lc3NhZ2UgYXBpLlxuICAgIC8vIHZhciBleHRlcm5hbE1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcywgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzLCBpbnRlcm5hbE1lc3NlbmdlclNvdXJjZSk7XG5cbi8vICAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuLy8gICAgICAgICBfbWVzc2VuZ2VyOiBleHRlcm5hbE1lc3Nlbmdlcixcbi8vICAgICAgICAgX2ludGVybmFsTWVzc2VuZ2VyOiBpbnRlcm5hbE1lc3NlbmdlclxuLy8gICAgIH0pO1xuLy8gfVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEluaXRpYWxpemVzIERPTUV2ZW50c1NvdXJjZSBhbmQgY29ubmVjdHMgaXQgdG8gRGF0YSBmYWNldCBtZXNzZW5nZXJcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfcHJlcGFyZU1lc3NhZ2VTb3VyY2UoKSB7XG4gICAgdmFyIGRhdGFBUEkgPSBuZXcgRGF0YU1zZ0FQSSh0aGlzLm93bmVyKVxuICAgICAgICAsIGRhdGFFdmVudHNTb3VyY2UgPSBuZXcgRE9NRXZlbnRzU291cmNlKHRoaXMsIHByb3h5RGF0YVNvdXJjZU1ldGhvZHMsIGRhdGFBUEksIHRoaXMub3duZXIpO1xuICAgIHRoaXMuX3NldE1lc3NhZ2VTb3VyY2UoZGF0YUV2ZW50c1NvdXJjZSk7XG5cbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsICdfZGF0YUV2ZW50c1NvdXJjZScsIGRhdGFFdmVudHNTb3VyY2UpO1xuXG4gICAgLy8gbWFrZSB2YWx1ZSBtZXRob2Qgb2YgRGF0YU1zZ0FQSSBhdmFpbGFibGUgb24gRGF0YSBmYWNldFxuICAgIC8vIHRoaXMgaXMgYSBwcml2YXRlIG1ldGhvZCwgZ2V0KCkgc2hvdWxkIGJlIHVzZWQgdG8gZ2V0IGRhdGEuXG4gICAgTWl4aW4ucHJvdG90eXBlLl9jcmVhdGVQcm94eU1ldGhvZC5jYWxsKGRhdGFBUEksICd2YWx1ZScsICd2YWx1ZScsIHRoaXMpO1xufVxuXG5cbi8qKlxuICogU3Vic2NyaWJlciB0byBkYXRhIGNoYW5nZSBldmVudFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gbXNnVHlwZSBpbiB0aGlzIGluc3RhbmNlIHdpbGwgYmUgJydcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIGRhdGEgY2hhbmdlIGluZm9ybWF0aW9uXG4gKi9cbmZ1bmN0aW9uIG9uT3duRGF0YUNoYW5nZShtc2dUeXBlLCBkYXRhKSB7XG4gICAgdGhpcy5fYnViYmxlVXBEYXRhQ2hhbmdlKGRhdGEpO1xuICAgIHRoaXMuX3F1ZXVlRGF0YUNoYW5nZShkYXRhKTtcbiAgICBpZiAoZGF0YS5wYXRoID09PSAnJykge1xuICAgICAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhkYXRhKTtcbiAgICAgICAgdGhpcy5wb3N0TWVzc2FnZSgnZGF0YWNoYW5nZXNmaW5pc2hlZCcsIHsgdHJhbnNhY3Rpb246IGluVHJhbnNhY3Rpb24gfSk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFNlbmRzIGRhdGEgYG1lc3NhZ2VgIHRvIERPTSBwYXJlbnRcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG1zZ0RhdGEgZGF0YSBjaGFuZ2UgbWVzc2FnZVxuICovXG5mdW5jdGlvbiBEYXRhJF9idWJibGVVcERhdGFDaGFuZ2UobXNnRGF0YSkge1xuICAgIHZhciBwYXJlbnREYXRhID0gdGhpcy5zY29wZVBhcmVudCgpO1xuXG4gICAgaWYgKHBhcmVudERhdGEpIHtcbiAgICAgICAgdmFyIHBhcmVudE1zZyA9IF8uY2xvbmUobXNnRGF0YSk7XG4gICAgICAgIHBhcmVudE1zZy5wYXRoID0gKHRoaXMuX3BhdGggfHwgKCcuJyArIHRoaXMub3duZXIubmFtZSkpICArIHBhcmVudE1zZy5wYXRoO1xuICAgICAgICBwYXJlbnREYXRhLnBvc3RNZXNzYWdlKCdjaGlsZGRhdGEnLCBwYXJlbnRNc2cgfHwgbXNnRGF0YSk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFF1ZXVlcyBkYXRhIG1lc3NhZ2VzIHRvIGJlIGRpc3BhdGNoZWQgdG8gY29ubmVjdG9yXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBjaGFuZ2UgZGF0YSBjaGFuZ2UgZGVzY3JpcHRpb25cbiAqL1xuZnVuY3Rpb24gRGF0YSRfcXVldWVEYXRhQ2hhbmdlKGNoYW5nZSkge1xuICAgIHRoaXMuX2RhdGFDaGFuZ2VzUXVldWUucHVzaChjaGFuZ2UpO1xufVxuXG5cbi8qKlxuICogU3Vic2NyaWJlciB0byBkYXRhY2hhbmdlc2ZpbmlzaGVkIGV2ZW50LlxuICogQ2FsbHMgdGhlIG1ldGhvZCB0byBwb3N0IGNoYW5nZXMgYmF0Y2ggYW5kIGJ1YmJsZXMgdXAgdGhlIG1lc3NhZ2VcbiAqXG4gKiBAcGFyYW0gIHtbdHlwZV19IG1zZyAgW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7W3R5cGVdfSBkYXRhIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gb25EYXRhQ2hhbmdlc0ZpbmlzaGVkKG1zZywgZGF0YSkge1xuICAgIHRoaXMuX3Bvc3REYXRhQ2hhbmdlcyhkYXRhLmluVHJhbnNhY3Rpb24pO1xuICAgIHZhciBwYXJlbnREYXRhID0gdGhpcy5zY29wZVBhcmVudCgpO1xuICAgIGlmIChwYXJlbnREYXRhKSBwYXJlbnREYXRhLnBvc3RNZXNzYWdlKCdkYXRhY2hhbmdlc2ZpbmlzaGVkJywgZGF0YSk7XG59XG5cblxuLyoqXG4gKiBEaXNwYXRjaGVzIGFsbCBjaGFuZ2VzIGNvbGxlY3RlZCBpbiB0aGUgYmF0Y2hcbiAqIFVzZWQgZm9yIGRhdGEgcHJvcGFnYXRpb24gLSBjb25uZWN0b3Igc3Vic2NyaWJlcyB0byB0aGlzIG1lc3NhZ2VcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBEYXRhJF9wb3N0RGF0YUNoYW5nZXMoaW5UcmFuc2FjdGlvbikge1xuICAgIHZhciBxdWV1ZSA9IHRoaXMuX2RhdGFDaGFuZ2VzUXVldWUucmV2ZXJzZSgpO1xuICAgIHRoaXMucG9zdE1lc3NhZ2VTeW5jKCdkYXRhY2hhbmdlcycsIHtcbiAgICAgICAgY2hhbmdlczogcXVldWUsXG4gICAgICAgIHRyYW5zYWN0aW9uOiBpblRyYW5zYWN0aW9uXG4gICAgfSk7XG4gICAgdGhpcy5fZGF0YUNoYW5nZXNRdWV1ZSA9IFtdOyAvLyBpdCBjYW4ndCBiZSAubGVuZ3RoID0gMCwgYXMgdGhlIGFjdHVhbCBhcnJheSBtYXkgc3RpbGwgYmUgdXNlZFxufVxuXG5cbi8qKlxuICogU3Vic2NyaWJlciB0byBkYXRhIGNoYW5nZSBldmVudCBpbiBjaGlsZCBEYXRhIGZhY2V0XG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtc2dUeXBlXG4gKiBAcGFyYW0ge09iZWpjdH0gZGF0YSBkYXRhIGNoYW5nZSBpbmZvcm1hdGlvblxuICovXG5mdW5jdGlvbiBvbkNoaWxkRGF0YShtc2dUeXBlLCBkYXRhKSB7XG4gICAgdGhpcy5wb3N0TWVzc2FnZShkYXRhLnBhdGgsIGRhdGEpO1xuICAgIHRoaXMuX2J1YmJsZVVwRGF0YUNoYW5nZShkYXRhKTtcbiAgICB0aGlzLl9xdWV1ZURhdGFDaGFuZ2UoZGF0YSk7XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyBkYXRhIGluIERPTSBoaWVyYXJjaHkgcmVjdXJzaXZlbHkuXG4gKiBSZXR1cm5zIHRoZSBvYmplY3Qgd2l0aCB0aGUgZGF0YSBhY3R1YWxseSBzZXQgKGNhbiBiZSBkaWZmZXJlbnQsIGlmIGNvbXBvbmVudHMgbWF0Y2hpbmcgc29tZSBwcm9wZXJ0aWVzIGFyZSBtaXNzaW5nKS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxTdHJpbmd8TnVtYmVyfSB2YWx1ZSB2YWx1ZSB0byBiZSBzZXQuIElmIHRoZSB2YWx1ZSBpZiBzY2FsYXIsIGl0IHdpbGwgYmUgc2V0IG9uIGNvbXBvbmVudCdzIGVsZW1lbnQsIGlmIHRoZSB2YWx1ZSBpcyBvYmplY3QgLSBvbiBET00gdHJlZSBpbnNpZGUgY29tcG9uZW50XG4gKiBAcmV0dXJuIHtPYmplY3R8U3RyaW5nfE51bWJlcn1cbiAqL1xuZnVuY3Rpb24gRGF0YSRzZXQodmFsdWUpIHtcbiAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhEYXRhJHNldCk7XG5cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXhlY3V0ZUhvb2suY2FsbCh0aGlzLCAnc2V0JywgYXJndW1lbnRzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlICE9IG5vSG9vaykgdGhyb3cgZTtcbiAgICB9XG5cbiAgICBzZXRUcmFuc2FjdGlvbkZsYWcodGhpcy5fc2V0LCBpblRyYW5zYWN0aW9uKTtcblxuICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMuX3ZhbHVlXG4gICAgICAgICwgbmV3VmFsdWUgPSB0aGlzLl9zZXQodmFsdWUpO1xuXG4gICAgLy8gdGhpcyBtZXNzYWdlIHRyaWdnZXJzIG9uT3duRGF0YUNoYW5nZSwgYXMgd2VsbCBhcyBhY3R1YWxsIERPTSBjaGFuZ2VcbiAgICAvLyBzbyB0aGUgcGFyZW50IGdldHMgbm90aWZpZWRcbiAgICB2YXIgbXNnID0geyBwYXRoOiAnJywgdHlwZTogJ2NoYW5nZWQnLFxuICAgICAgICAgICAgICAgIG5ld1ZhbHVlOiBuZXdWYWx1ZSwgb2xkVmFsdWU6IG9sZFZhbHVlIH07XG4gICAgc2V0VHJhbnNhY3Rpb25GbGFnKG1zZywgaW5UcmFuc2FjdGlvbik7XG4gICAgdGhpcy5wb3N0TWVzc2FnZSgnJywgbXNnKTtcblxuICAgIHJldHVybiBuZXdWYWx1ZTtcbn1cblxuXG5mdW5jdGlvbiBEYXRhJF9zZXQodmFsdWUpIHtcbiAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhEYXRhJF9zZXQpO1xuXG4gICAgdmFyIHZhbHVlU2V0O1xuICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbHVlU2V0ID0gW107XG5cbiAgICAgICAgICAgIHZhciBsaXN0RmFjZXQgPSB0aGlzLm93bmVyLmxpc3Q7XG4gICAgICAgICAgICBpZiAobGlzdEZhY2V0KXtcbiAgICAgICAgICAgICAgICB2YXIgbGlzdExlbmd0aCA9IGxpc3RGYWNldC5jb3VudCgpXG4gICAgICAgICAgICAgICAgICAgICwgbmV3SXRlbXNDb3VudCA9IHZhbHVlLmxlbmd0aCAtIGxpc3RMZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKG5ld0l0ZW1zQ291bnQgPj0gMykge1xuICAgICAgICAgICAgICAgICAgICBsaXN0RmFjZXQuX2FkZEl0ZW1zKG5ld0l0ZW1zQ291bnQpO1xuICAgICAgICAgICAgICAgICAgICBsaXN0RmFjZXQuX3VwZGF0ZURhdGFQYXRocyhsaXN0TGVuZ3RoLCBsaXN0RmFjZXQuY291bnQoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihjaGlsZFZhbHVlLCBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBzZXRDaGlsZERhdGEuY2FsbCh0aGlzLCB2YWx1ZVNldCwgY2hpbGRWYWx1ZSwgaW5kZXgsICdbJCRdJyk7XG4gICAgICAgICAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgICAgICAgICB2YXIgbGlzdENvdW50ID0gbGlzdEZhY2V0LmNvdW50KClcbiAgICAgICAgICAgICAgICAgICAgLCByZW1vdmVDb3VudCA9IGxpc3RDb3VudCAtIHZhbHVlLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIHdoaWxlIChyZW1vdmVDb3VudC0tID4gMClcbiAgICAgICAgICAgICAgICAgICAgbGlzdEZhY2V0Ll9yZW1vdmVJdGVtKHZhbHVlLmxlbmd0aCk7XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybignRGF0YTogc2V0dGluZyBhcnJheSBkYXRhIHdpdGhvdXQgTGlzdCBmYWNldCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWVTZXQgPSB7fTtcbiAgICAgICAgICAgIF8uZWFjaEtleSh2YWx1ZSwgZnVuY3Rpb24oY2hpbGRWYWx1ZSwga2V5KSB7XG4gICAgICAgICAgICAgICAgc2V0Q2hpbGREYXRhLmNhbGwodGhpcywgdmFsdWVTZXQsIGNoaWxkVmFsdWUsIGtleSwgJy4kJCcpO1xuICAgICAgICAgICAgfSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICB9IGVsc2VcbiAgICAgICAgdmFsdWVTZXQgPSB0aGlzLl9zZXRTY2FsYXJWYWx1ZSh2YWx1ZSk7XG5cbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlU2V0O1xuXG4gICAgcmV0dXJuIHZhbHVlU2V0O1xuXG5cbiAgICBmdW5jdGlvbiBzZXRDaGlsZERhdGEodmFsdWVTZXQsIGNoaWxkVmFsdWUsIGtleSwgcGF0aFN5bnRheCkge1xuICAgICAgICB2YXIgY2hpbGRQYXRoID0gcGF0aFN5bnRheC5yZXBsYWNlKCckJCcsIGtleSk7XG4gICAgICAgIHZhciBjaGlsZERhdGFGYWNldCA9IHRoaXMucGF0aChjaGlsZFBhdGgsIHR5cGVvZiBjaGlsZFZhbHVlICE9ICd1bmRlZmluZWQnKTtcbiAgICAgICAgaWYgKGNoaWxkRGF0YUZhY2V0KSB7XG4gICAgICAgICAgICBzZXRUcmFuc2FjdGlvbkZsYWcoY2hpbGREYXRhRmFjZXQuc2V0LCBpblRyYW5zYWN0aW9uKTtcbiAgICAgICAgICAgIHZhbHVlU2V0W2tleV0gPSBjaGlsZERhdGFGYWNldC5zZXQoY2hpbGRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogRGVsZXRlcyBjb21wb25lbnQgZnJvbSB2aWV3IGFuZCBzY29wZSwgb25seSBpbiBjYXNlIGl0IGhhcyBJdGVtIGZhY2V0IG9uIGl0XG4gKi9cbmZ1bmN0aW9uIERhdGEkZGVsKCkge1xuICAgIHZhciBpblRyYW5zYWN0aW9uID0gZ2V0VHJhbnNhY3Rpb25GbGFnKERhdGEkZGVsKTtcblxuICAgIHRyeSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBleGVjdXRlSG9vay5jYWxsKHRoaXMsICdkZWwnKTtcbiAgICAgICAgcG9zdFRyYW5zYWN0aW9uRmluaXNoZWQuY2FsbCh0aGlzLCBpblRyYW5zYWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlICE9IG5vSG9vaykgdGhyb3cgZTtcbiAgICB9XG5cbiAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLl92YWx1ZTtcblxuICAgIHNldFRyYW5zYWN0aW9uRmxhZyh0aGlzLl9kZWwsIGluVHJhbnNhY3Rpb24pO1xuICAgIHRoaXMuX2RlbCgpO1xuXG4gICAgLy8gdGhpcyBtZXNzYWdlIHRyaWdnZXJzIG9uT3duRGF0YUNoYW5nZSwgYXMgd2VsbCBhcyBhY3R1YWxsIERPTSBjaGFuZ2VcbiAgICAvLyBzbyB0aGUgcGFyZW50IGdldHMgbm90aWZpZWRcbiAgICB2YXIgbXNnID0geyBwYXRoOiAnJywgdHlwZTogJ2RlbGV0ZWQnLCBvbGRWYWx1ZTogb2xkVmFsdWUgfTtcbiAgICBzZXRUcmFuc2FjdGlvbkZsYWcobXNnLCBpblRyYW5zYWN0aW9uKTtcbiAgICB0aGlzLnBvc3RNZXNzYWdlKCcnLCBtc2cpO1xufVxuXG5cbmZ1bmN0aW9uIERhdGEkX2RlbCgpIHtcbiAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhEYXRhJF9kZWwpO1xuICAgIHNldFRyYW5zYWN0aW9uRmxhZyh0aGlzLl9zZXQsIGluVHJhbnNhY3Rpb24pO1xuICAgIHRoaXMuX3NldCgpO1xufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFNldHMgc2NhbGFyIHZhbHVlIHRvIERPTSBlbGVtZW50XG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsdWUgdmFsdWUgdG8gc2V0IHRvIERPTSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIERhdGEkX3NldFNjYWxhclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxEYXRhLnNldCh0aGlzLm93bmVyLmVsLCB2YWx1ZSk7XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogR2V0IHN0cnVjdHVyZWQgZGF0YSBmcm9tIERPTSBoaWVyYXJjaHkgcmVjdXJzaXZlbHlcbiAqIFJldHVybnMgRE9NIGRhdGFcbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXBHZXQgdHJ1ZSBieSBkZWZhdWx0XG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIERhdGEkZ2V0KGRlZXBHZXQpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXhlY3V0ZUhvb2suY2FsbCh0aGlzLCAnZ2V0JywgYXJndW1lbnRzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlICE9IG5vSG9vaykgdGhyb3cgZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZ2V0KGRlZXBHZXQpO1xufVxuXG5mdW5jdGlvbiBEYXRhJF9nZXQoZGVlcEdldCkge1xuICAgIGlmIChkZWVwR2V0ID09PSBmYWxzZSkgLy8gYSBoYWNrIHRvIGVuYWJsZSBnZXR0aW5nIHNoYWxsb3cgc3RhdGVcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgdmFyIGNvbXAgPSB0aGlzLm93bmVyXG4gICAgICAgICwgc2NvcGVEYXRhO1xuXG4gICAgaWYgKGNvbXAubGlzdCkge1xuICAgICAgICBzY29wZURhdGEgPSBbXTtcbiAgICAgICAgY29tcC5saXN0LmVhY2goZnVuY3Rpb24obGlzdEl0ZW0sIGluZGV4KSB7XG4gICAgICAgICAgICBzY29wZURhdGFbaW5kZXhdID0gbGlzdEl0ZW0uZGF0YS5nZXQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGNvbXAuY29udGFpbmVyKVxuICAgICAgICAgICAgY29tcC5jb250YWluZXIuc2NvcGUuX2VhY2goZnVuY3Rpb24oc2NvcGVJdGVtLCBuYW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEgY29tcC5saXN0LmNvbnRhaW5zKHNjb3BlSXRlbSkgJiYgc2NvcGVJdGVtLmRhdGEpXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlRGF0YVtuYW1lXSA9IHNjb3BlSXRlbS5kYXRhLmdldCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChjb21wLmNvbnRhaW5lcikge1xuICAgICAgICBzY29wZURhdGEgPSB7fTtcbiAgICAgICAgY29tcC5jb250YWluZXIuc2NvcGUuX2VhY2goZnVuY3Rpb24oc2NvcGVJdGVtLCBuYW1lKSB7XG4gICAgICAgICAgICBpZiAoc2NvcGVJdGVtLmRhdGEpXG4gICAgICAgICAgICAgICAgc2NvcGVEYXRhW25hbWVdID0gc2NvcGVJdGVtLmRhdGEuZ2V0KCk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZVxuICAgICAgICBzY29wZURhdGEgPSB0aGlzLl9nZXRTY2FsYXJWYWx1ZSgpO1xuXG4gICAgdGhpcy5fdmFsdWUgPSBzY29wZURhdGE7XG5cbiAgICByZXR1cm4gc2NvcGVEYXRhO1xufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEdldHMgc2NhbGFyIGRhdGEgZnJvbSBET00gZWxlbWVudFxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIERhdGEkX2dldFNjYWxhclZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmVsRGF0YS5nZXQodGhpcy5vd25lci5lbCk7XG59XG5cblxuLyoqXG4gKiBEYXRhIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogU3BsaWNlcyBMaXN0IGl0ZW1zLiBSZXF1aXJlcyBMaXN0IGZhY2V0IHRvIGJlIHByZXNlbnQgb24gY29tcG9uZW50LiBXb3JrcyBpbiB0aGUgc2FtZSB3YXkgYXMgYXJyYXkgc3BsaWNlLlxuICogUmV0dXJucyBkYXRhIHJldHJpZXZlZCBmcm9tIHJlbW92ZWQgaXRlbXNcbiAqXG4gKiBAcGFyYW0ge0ludGVnZXJ9IHNwbGljZUluZGV4IGluZGV4IHRvIGRlbGV0ZS9pbnNlcnQgYXRcbiAqIEBwYXJhbSB7SW50ZWdlcn0gc3BsaWNlSG93TWFueSBudW1iZXIgb2YgaXRlbXMgdG8gZGVsZXRlXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBvcHRpb25hbCBpdGVtcyB0byBpbnNlcnRcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBEYXRhJHNwbGljZShzcGxpY2VJbmRleCwgc3BsaWNlSG93TWFueSkgeyAvLywgLi4uIGFyZ3VtZW50c1xuICAgIHZhciBpblRyYW5zYWN0aW9uID0gZ2V0VHJhbnNhY3Rpb25GbGFnKERhdGEkc3BsaWNlKTtcbiAgICB2YXIgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGV4ZWN1dGVIb29rLmNhbGwodGhpcywgJ3NwbGljZScsIGFyZ3VtZW50cyk7XG4gICAgICAgIHBvc3RUcmFuc2FjdGlvbkZpbmlzaGVkLmNhbGwodGhpcywgaW5UcmFuc2FjdGlvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSAhPSBub0hvb2spIHRocm93IGU7XG4gICAgfVxuXG4gICAgc2V0VHJhbnNhY3Rpb25GbGFnKHRoaXMuX3NwbGljZSwgaW5UcmFuc2FjdGlvbik7XG4gICAgcmVzdWx0ID0gdGhpcy5fc3BsaWNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICBpZiAoIXJlc3VsdCkgcmV0dXJuO1xuXG4gICAgdmFyIG1zZyA9IHsgcGF0aDogJycsIHR5cGU6ICdzcGxpY2UnLFxuICAgICAgICAgICAgICAgIGluZGV4OiByZXN1bHQuc3BsaWNlSW5kZXgsXG4gICAgICAgICAgICAgICAgcmVtb3ZlZDogcmVzdWx0LnJlbW92ZWQsXG4gICAgICAgICAgICAgICAgYWRkZWRDb3VudDogcmVzdWx0LmFkZGVkQ291bnQsXG4gICAgICAgICAgICAgICAgbmV3VmFsdWU6IHRoaXMuX3ZhbHVlIH07XG4gICAgc2V0VHJhbnNhY3Rpb25GbGFnKG1zZywgaW5UcmFuc2FjdGlvbik7XG4gICAgdGhpcy5wb3N0TWVzc2FnZSgnJywgbXNnKTtcblxuICAgIHJldHVybiByZXN1bHQucmVtb3ZlZDtcbn1cblxuXG52YXIgbm9Ib29rID0ge307XG5mdW5jdGlvbiBleGVjdXRlSG9vayhtZXRob2ROYW1lLCBhcmdzKSB7XG4gICAgdmFyIGhvb2sgPSB0aGlzLmNvbmZpZ1ttZXRob2ROYW1lXTtcbiAgICBzd2l0Y2ggKHR5cGVvZiBob29rKSB7XG4gICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgICAgICAgIHJldHVybiBob29rLmFwcGx5KHRoaXMub3duZXIsIGFyZ3MpO1xuXG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vd25lcltob29rXS5hcHBseSh0aGlzLm93bmVyLCBhcmdzKTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbm9Ib29rO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBEYXRhJF9zcGxpY2Uoc3BsaWNlSW5kZXgsIHNwbGljZUhvd01hbnkpIHsgLy8sIC4uLiBhcmd1bWVudHNcbiAgICB2YXIgaW5UcmFuc2FjdGlvbiA9IGdldFRyYW5zYWN0aW9uRmxhZyhEYXRhJF9zcGxpY2UpO1xuXG4gICAgdmFyIGxpc3RGYWNldCA9IHRoaXMub3duZXIubGlzdDtcbiAgICBpZiAoISBsaXN0RmFjZXQpXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignRGF0YTogY2Fubm90IHVzZSBzcGxpY2UgbWV0aG9kIHdpdGhvdXQgTGlzdCBmYWNldCcpO1xuXG4gICAgdmFyIHJlbW92ZWQgPSBbXTtcblxuICAgIHZhciBsaXN0TGVuZ3RoID0gbGlzdEZhY2V0LmNvdW50KCk7XG4gICAgYXJndW1lbnRzWzBdID0gc3BsaWNlSW5kZXggPVxuICAgICAgICBtb2RlbFV0aWxzLm5vcm1hbGl6ZVNwbGljZUluZGV4KHNwbGljZUluZGV4LCBsaXN0TGVuZ3RoKTtcblxuICAgIGlmIChzcGxpY2VIb3dNYW55ID4gMCAmJiBsaXN0TGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKHZhciBpID0gc3BsaWNlSW5kZXg7IGkgPCBzcGxpY2VJbmRleCArIHNwbGljZUhvd01hbnk7IGkrKykge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBsaXN0RmFjZXQuaXRlbShzcGxpY2VJbmRleCk7XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIHZhciBpdGVtRGF0YSA9IGl0ZW0uZGF0YS5nZXQoKTtcbiAgICAgICAgICAgICAgICBsaXN0RmFjZXQuX3JlbW92ZUl0ZW0oc3BsaWNlSW5kZXgpO1xuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0RhdGE6IG5vIGl0ZW0gZm9yIGluZGV4JywgaSk7XG5cbiAgICAgICAgICAgIHJlbW92ZWQucHVzaChpdGVtRGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBsaXN0RmFjZXQuX3VwZGF0ZURhdGFQYXRocyhzcGxpY2VJbmRleCwgbGlzdEZhY2V0LmNvdW50KCkpO1xuICAgIH1cblxuICAgIHZhciBhZGRlZCA9IFtdO1xuXG4gICAgdmFyIGFyZ3NMZW4gPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgICAgICwgYWRkSXRlbXMgPSBhcmdzTGVuID4gMlxuICAgICAgICAsIGFkZGVkQ291bnQgPSBhcmdzTGVuIC0gMjtcbiAgICBpZiAoYWRkSXRlbXMpIHtcbiAgICAgICAgbGlzdEZhY2V0Ll9hZGRJdGVtcyhhZGRlZENvdW50LCBzcGxpY2VJbmRleCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAyLCBqID0gc3BsaWNlSW5kZXg7IGkgPCBhcmdzTGVuOyBpKyssIGorKykge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBsaXN0RmFjZXQuaXRlbShqKTtcbiAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgc2V0VHJhbnNhY3Rpb25GbGFnKGl0ZW0uZGF0YS5zZXQsIGluVHJhbnNhY3Rpb24pO1xuICAgICAgICAgICAgICAgIHZhciBpdGVtRGF0YSA9IGl0ZW0uZGF0YS5zZXQoYXJndW1lbnRzW2ldKTtcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdEYXRhOiBubyBpdGVtIGZvciBpbmRleCcsIGopO1xuXG4gICAgICAgICAgICBhZGRlZC5wdXNoKGl0ZW1EYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoYW5nZSBwYXRocyBvZiBpdGVtcyB0aGF0IHdlcmUgYWRkZWQgYW5kIGl0ZW1zIGFmdGVyIHRoZW1cbiAgICAgICAgbGlzdEZhY2V0Ll91cGRhdGVEYXRhUGF0aHMoc3BsaWNlSW5kZXgsIGxpc3RGYWNldC5jb3VudCgpKTtcbiAgICB9XG5cbiAgICAvLyBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkpIHtcbiAgICAvLyAgICAgXy5wcmVwZW5kQXJyYXkoYWRkZWQsIFtzcGxpY2VJbmRleCwgc3BsaWNlSG93TWFueV0pO1xuICAgIC8vICAgICBBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KHRoaXMuX3ZhbHVlLCBhZGRlZCk7XG4gICAgLy8gfSBlbHNlXG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5nZXQoKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHNwbGljZUluZGV4OiBzcGxpY2VJbmRleCxcbiAgICAgICAgcmVtb3ZlZDogcmVtb3ZlZCxcbiAgICAgICAgYWRkZWRDb3VudDogYWRkSXRlbXMgPyBhZGRlZENvdW50IDogMFxuICAgIH07XG59XG5cblxuZnVuY3Rpb24gRGF0YSRsZW4oKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGV4ZWN1dGVIb29rLmNhbGwodGhpcywgJ2xlbicpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUgIT0gbm9Ib29rKSB0aHJvdyBlO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdGhpcy5fbGVuKCk7XG59XG5cblxuZnVuY3Rpb24gRGF0YSRfbGVuKCkge1xuICAgIGlmICh0aGlzLm93bmVyLmxpc3QpIHJldHVybiB0aGlzLm93bmVyLmxpc3QuY291bnQoKTtcbiAgICBlbHNlIGxvZ2dlci5lcnJvcignRGF0YTogbGVuIGNhbGxlZCB3aXRob3V0IGxpc3QgZmFjZXQnKTtcbn1cblxuXG4vKipcbiAqIERhdGEgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIGRhdGEgZmFjZXQgb2YgYSBjaGlsZCBjb21wb25lbnQgKGJ5IHNjb3BlcykgY29ycmVzcG9uZGluZyB0byB0aGUgcGF0aFxuICogQHBhcmFtIHtTdHJpbmd9IGFjY2Vzc1BhdGggZGF0YSBhY2Nlc3MgcGF0aFxuICovXG5mdW5jdGlvbiBEYXRhJHBhdGgoYWNjZXNzUGF0aCwgY3JlYXRlSXRlbSkge1xuICAgIC8vIGNyZWF0ZUl0ZW0gPSB0cnVlOyAvLyB0aGlzIGhhY2sgc2VlbXMgdG8gYmUgbm8gbG9uZ2VyIG5lZWRlZC4uLlxuXG4gICAgaWYgKCEgYWNjZXNzUGF0aClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgcGFyc2VkUGF0aCA9IHBhdGhVdGlscy5wYXJzZUFjY2Vzc1BhdGgoYWNjZXNzUGF0aCk7XG4gICAgdmFyIGN1cnJlbnRDb21wb25lbnQgPSB0aGlzLm93bmVyO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBhcnNlZFBhdGgubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIHBhdGhOb2RlID0gcGFyc2VkUGF0aFtpXVxuICAgICAgICAgICAgLCBub2RlS2V5ID0gcGF0aFV0aWxzLmdldFBhdGhOb2RlS2V5KHBhdGhOb2RlKTtcbiAgICAgICAgaWYgKHBhdGhOb2RlLnN5bnRheCA9PSAnYXJyYXknICYmIGN1cnJlbnRDb21wb25lbnQubGlzdCkge1xuICAgICAgICAgICAgdmFyIGl0ZW1Db21wb25lbnQgPSBjdXJyZW50Q29tcG9uZW50Lmxpc3QuaXRlbShub2RlS2V5KTtcbiAgICAgICAgICAgIGlmICghIGl0ZW1Db21wb25lbnQgJiYgY3JlYXRlSXRlbSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBpdGVtQ29tcG9uZW50ID0gY3VycmVudENvbXBvbmVudC5saXN0Ll9hZGRJdGVtKG5vZGVLZXkpO1xuICAgICAgICAgICAgICAgIGl0ZW1Db21wb25lbnQuZGF0YS5fcGF0aCA9IHBhdGhOb2RlLnByb3BlcnR5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudENvbXBvbmVudCA9IGl0ZW1Db21wb25lbnQ7XG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudENvbXBvbmVudC5jb250YWluZXIpXG4gICAgICAgICAgICBjdXJyZW50Q29tcG9uZW50ID0gY3VycmVudENvbXBvbmVudC5jb250YWluZXIuc2NvcGVbbm9kZUtleV07XG5cbiAgICAgICAgdmFyIGN1cnJlbnREYXRhRmFjZXQgPSBjdXJyZW50Q29tcG9uZW50ICYmIGN1cnJlbnRDb21wb25lbnQuZGF0YTtcbiAgICAgICAgaWYgKCEgY3VycmVudERhdGFGYWNldClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50RGF0YUZhY2V0O1xufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgcGF0aCB0byBhY2Nlc3MgdGhpcyBkYXRhIGZhY2V0IGZyb20gcGFyZW50ICh1c2luZyBwYXRoIG1ldGhvZClcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIERhdGEkZ2V0UGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGF0aDtcbn1cblxuXG4vKipcbiAqIERhdGEgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIGtleSB0byBhY2Nlc3MgdGhlIHZhbHVlIHJlbGF0ZWQgdG8gdGhpcyBkYXRhIGZhY2V0IG9uIHRoZSB2YWx1ZSByZWxhdGVkIHRvIHBhcmVudCBkYXRhIGZhY2V0LlxuICogSWYgY29tcG9uZW50IGhhcyBMaXN0IGZhY2V0LCByZXR1cm5zIGluZGV4XG4gKlxuICogQHJldHVybiB7U3RyaW5nfEludGVnZXJ9XG4gKi9cbmZ1bmN0aW9uIERhdGEkZ2V0S2V5KCkge1xuICAgIHZhciBwYXRoID0gdGhpcy5fcGF0aDtcbiAgICByZXR1cm4gcGF0aFswXSA9PSAnWydcbiAgICAgICAgICAgID8gK3BhdGguc2xpY2UoMSwgLTEpIC8vIHJlbW92ZSBcIltcIiBhbmQgXCJdXCJcbiAgICAgICAgICAgIDogcGF0aC5zbGljZSgxKSAvLyByZW1vdmUgbGVhZGluZyBcIi5cIlxufVxuXG5cbi8qKlxuICogRGF0YSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIENhbGxlZCBieSBgQ29tcG9uZW50LnByb3RvdHlwZS5nZXRTdGF0ZWAgdG8gZ2V0IGZhY2V0J3Mgc3RhdGVcbiAqIFJldHVybnMgRE9NIGRhdGFcbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRlZXBTdGF0ZSwgdHJ1ZSBieSBkZWZhdWx0XG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIERhdGEkZ2V0U3RhdGUoZGVlcFN0YXRlKSB7XG4gICAgcmV0dXJuIHsgc3RhdGU6IHRoaXMuZ2V0KGRlZXBTdGF0ZSkgfTtcbn1cblxuXG4vKipcbiAqIERhdGEgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBDYWxsZWQgYnkgYENvbXBvbmVudC5wcm90b3R5cGUuc2V0U3RhdGVgIHRvIHNldCBmYWNldCdzIHN0YXRlXG4gKiBTaW1wbHkgc2V0cyBtb2RlbCBkYXRhXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIGRhdGEgdG8gc2V0IG9uIGZhY2V0J3MgbW9kZWxcbiAqL1xuZnVuY3Rpb24gRGF0YSRzZXRTdGF0ZShzdGF0ZSkge1xuICAgIHJldHVybiB0aGlzLnNldChzdGF0ZS5zdGF0ZSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY2ZfcmVnaXN0cnknKSBcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBkb1QgPSBtaWxvQ29yZS51dGlsLmRvVFxuICAgICwgYmluZGVyID0gcmVxdWlyZSgnLi4vLi4vYmluZGVyJylcbiAgICAsIEJpbmRBdHRyaWJ1dGUgPSByZXF1aXJlKCcuLi8uLi9hdHRyaWJ1dGVzL2FfYmluZCcpXG4gICAgLCBkb21VdGlscyA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZG9tJylcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uLy4uL2NvbmZpZycpO1xuXG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzLmdldCgnRG9tJylgXG4gKiBGYWNldCB3aXRoIGNvbXBvbmVudCByZWxhdGVkIGRvbSB1dGlsc1xuICovXG52YXIgRG9tID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0RvbScpO1xuXG5fLmV4dGVuZChEb20sIHtcbiAgICBjcmVhdGVFbGVtZW50OiBEb20kJGNyZWF0ZUVsZW1lbnRcbn0pO1xuXG5cbi8qKlxuICogRmFjZXQgY2xhc3MgbWV0aG9kXG4gKiBDcmVhdGVzIGFuIGVsZW1lbnQgZnJvbSBhIHBhc3NlZCBjb25maWd1YXRpb24gb2JqZWN0XG4gKiBcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgd2l0aCB0aGUgcHJvcGVydGllcyBgZG9tQ29uZmlnYCwgYGNvbnRlbnRgLCBgdGVtcGxhdGVgXG4gKiBAcmV0dXJuIHtFbGVtZW50fSBhbiBodG1sIGVsZW1lbnQgXG4gKi9cbmZ1bmN0aW9uIERvbSQkY3JlYXRlRWxlbWVudChjb25maWcpIHtcbiAgICB2YXIgZG9tQ29uZmlnID0gY29uZmlnLmRvbUNvbmZpZyB8fCB7fVxuICAgICAgICAsIHRhZ05hbWUgPSBkb21Db25maWcudGFnTmFtZSB8fCAnZGl2J1xuICAgICAgICAsIG5ld0VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKVxuICAgICAgICAsIGNvbnRlbnQgPSBjb25maWcuY29udGVudFxuICAgICAgICAsIHRlbXBsYXRlID0gY29uZmlnLnRlbXBsYXRlO1xuXG4gICAgLy8gVE9ETyBpdCB3aWxsIGJlIGNhbGxlZCBhZ2FpbiB3aGVuL2lmIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWRcbiAgICAvLyBTaG91bGQgYmUgc29tZXByb3BlcnR5IG9uIGVsZW1lbnQgdG8gaW5kaWNhdGUgaXQncyBiZWVuIGNhbGxlZD9cbiAgICBfYXBwbHlDb25maWdUb0VsZW1lbnQobmV3RWwsIGRvbUNvbmZpZyk7XG5cbiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHRlbXBsYXRlKVxuICAgICAgICAgICAgbmV3RWwuaW5uZXJIVE1MID0gZG9ULnRlbXBsYXRlKHRlbXBsYXRlKSh7Y29udGVudDogY29udGVudH0pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBuZXdFbC5pbm5lckhUTUwgPSBjb250ZW50O1xuICAgIH1cbiAgICByZXR1cm4gbmV3RWw7XG59XG5cblxuZnVuY3Rpb24gX2FwcGx5Q29uZmlnVG9FbGVtZW50KGVsLCBjb25maWcpIHtcbiAgICB2YXIgY3NzQ2xhc3NlcyA9IGNvbmZpZyAmJiBjb25maWcuY2xzXG4gICAgICAgICwgY29uZmlnQXR0cmlidXRlcyA9IGNvbmZpZyAmJiBjb25maWcuYXR0cmlidXRlcztcblxuICAgIGlmIChjb25maWdBdHRyaWJ1dGVzKVxuICAgICAgICBfLmVhY2hLZXkoY29uZmlnQXR0cmlidXRlcywgZnVuY3Rpb24oYXR0clZhbHVlLCBhdHRyTmFtZSkge1xuICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgIGlmIChjc3NDbGFzc2VzKVxuICAgICAgICBfYXR0YWNoQ3NzQ2xhc3NlcyhlbCwgJ2FkZCcsIGNzc0NsYXNzZXMpO1xufVxuXG5cbl8uZXh0ZW5kUHJvdG8oRG9tLCB7XG4gICAgc3RhcnQ6IHN0YXJ0LFxuXG4gICAgc2hvdzogc2hvdyxcbiAgICBoaWRlOiBoaWRlLFxuICAgIHRvZ2dsZTogdG9nZ2xlLFxuICAgIGRldGFjaDogZGV0YWNoLFxuICAgIHJlbW92ZTogcmVtb3ZlLFxuICAgIGFwcGVuZDogYXBwZW5kLFxuICAgIHByZXBlbmQ6IHByZXBlbmQsXG4gICAgYXBwZW5kQ2hpbGRyZW46IGFwcGVuZENoaWxkcmVuLFxuICAgIHByZXBlbmRDaGlsZHJlbjogcHJlcGVuZENoaWxkcmVuLFxuICAgIGluc2VydEFmdGVyOiBpbnNlcnRBZnRlcixcbiAgICBpbnNlcnRCZWZvcmU6IGluc2VydEJlZm9yZSxcbiAgICBhcHBlbmRUb1Njb3BlUGFyZW50OiBhcHBlbmRUb1Njb3BlUGFyZW50LFxuICAgIGNoaWxkcmVuOiBEb20kY2hpbGRyZW4sXG4gICAgc2V0U3R5bGU6IHNldFN0eWxlLFxuICAgIHNldFN0eWxlczogc2V0U3R5bGVzLFxuICAgIGNvcHk6IGNvcHksXG4gICAgY3JlYXRlRWxlbWVudDogY3JlYXRlRWxlbWVudCxcblxuICAgIGFkZENzc0NsYXNzZXM6IF8ucGFydGlhbChfbWFuYWdlQ3NzQ2xhc3NlcywgJ2FkZCcpLFxuICAgIHJlbW92ZUNzc0NsYXNzZXM6IF8ucGFydGlhbChfbWFuYWdlQ3NzQ2xhc3NlcywgJ3JlbW92ZScpLFxuICAgIHRvZ2dsZUNzc0NsYXNzZXM6IF8ucGFydGlhbChfbWFuYWdlQ3NzQ2xhc3NlcywgJ3RvZ2dsZScpLFxuXG4gICAgZmluZDogZmluZCxcbiAgICBoYXNUZXh0QmVmb3JlU2VsZWN0aW9uOiBoYXNUZXh0QmVmb3JlU2VsZWN0aW9uLFxuICAgIGhhc1RleHRBZnRlclNlbGVjdGlvbjogaGFzVGV4dEFmdGVyU2VsZWN0aW9uLFxufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChEb20pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERvbTtcblxuXG4vLyBzdGFydCBEb20gZmFjZXRcbmZ1bmN0aW9uIHN0YXJ0KCkge1xuICAgIHZhciBlbCA9IHRoaXMub3duZXIuZWw7XG4gICAgX2FwcGx5Q29uZmlnVG9FbGVtZW50KGVsLCB0aGlzLmNvbmZpZyk7XG4gICAgdmFyIGN1cnJlbnRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKVxuICAgIHRoaXMuX3Zpc2libGUgPSBjdXJyZW50U3R5bGUgJiYgY3VycmVudFN0eWxlLmRpc3BsYXkgIT0gJ25vbmUnO1xufVxuXG4vLyBzaG93IEhUTUwgZWxlbWVudCBvZiBjb21wb25lbnRcbmZ1bmN0aW9uIHNob3coKSB7XG4gICAgdGhpcy50b2dnbGUodHJ1ZSk7XG59XG5cbi8vIGhpZGUgSFRNTCBlbGVtZW50IG9mIGNvbXBvbmVudFxuZnVuY3Rpb24gaGlkZSgpIHtcbiAgICB0aGlzLnRvZ2dsZShmYWxzZSk7XG59XG5cbi8vIHNob3cvaGlkZVxuZnVuY3Rpb24gdG9nZ2xlKGRvU2hvdykge1xuICAgIGRvU2hvdyA9IHR5cGVvZiBkb1Nob3cgPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/ICEgdGhpcy5fdmlzaWJsZVxuICAgICAgICAgICAgICAgIDogISEgZG9TaG93O1xuXG4gICAgdGhpcy5fdmlzaWJsZSA9IGRvU2hvdztcbiAgICB2YXIgZWwgPSB0aGlzLm93bmVyLmVsO1xuXG4gICAgZWwuc3R5bGUuZGlzcGxheSA9IGRvU2hvdyA/ICdibG9jaycgOiAnbm9uZSc7XG5cbiAgICByZXR1cm4gZG9TaG93O1xufVxuXG5cbmZ1bmN0aW9uIF9tYW5hZ2VDc3NDbGFzc2VzKG1ldGhvZE5hbWUsIGNzc0NsYXNzZXMsIGVuZm9yY2UpIHtcbiAgICBfYXR0YWNoQ3NzQ2xhc3Nlcyh0aGlzLm93bmVyLmVsLCBtZXRob2ROYW1lLCBjc3NDbGFzc2VzLCBlbmZvcmNlKTtcbn1cblxuXG5mdW5jdGlvbiBfYXR0YWNoQ3NzQ2xhc3NlcyhlbCwgbWV0aG9kTmFtZSwgY3NzQ2xhc3NlcywgZW5mb3JjZSkge1xuICAgIHZhciBjbGFzc0xpc3QgPSBlbC5jbGFzc0xpc3RcbiAgICAgICAgLCBkb1RvZ2dsZSA9IG1ldGhvZE5hbWUgPT0gJ3RvZ2dsZSc7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjc3NDbGFzc2VzKSlcbiAgICAgICAgY3NzQ2xhc3Nlcy5mb3JFYWNoKGNhbGxNZXRob2QpO1xuICAgIGVsc2UgaWYgKHR5cGVvZiBjc3NDbGFzc2VzID09ICdzdHJpbmcnKVxuICAgICAgICBjYWxsTWV0aG9kKGNzc0NsYXNzZXMpO1xuICAgIGVsc2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHR5cGUgb2YgQ1NTIGNsYXNzZXMgcGFyYW1ldGVyJyk7XG5cbiAgICBmdW5jdGlvbiBjYWxsTWV0aG9kKGNzc0Nscykge1xuICAgICAgICBkb1RvZ2dsZVxuICAgICAgICAgICAgLy8gT25seSBwYXNzICdlbmZvcmNlJyBpZiBhIHZhbHVlIGhhcyBiZWVuIHByb3ZpZGVkIChUaGUgJ3RvZ2dsZScgZnVuY3Rpb24gb2YgdGhlIGNsYXNzTGlzdCB3aWxsIHRyZWF0IHVuZGVmaW5lZCA9PT0gZmFsc2UgcmVzdWx0aW5nIGluIG9ubHkgYWxsb3dpbmcgY2xhc3NlcyB0byBiZSByZW1vdmVkKVxuICAgICAgICAgICAgPyBlbmZvcmNlID09PSB1bmRlZmluZWQgPyBjbGFzc0xpc3RbbWV0aG9kTmFtZV0oY3NzQ2xzKSA6IGNsYXNzTGlzdFttZXRob2ROYW1lXShjc3NDbHMsIGVuZm9yY2UpXG4gICAgICAgICAgICA6IGNsYXNzTGlzdFttZXRob2ROYW1lXShjc3NDbHMpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBkZXRhY2goKSB7XG4gICAgaWYgKHRoaXMub3duZXIuZWwpICBcbiAgICAgICAgZG9tVXRpbHMuZGV0YWNoQ29tcG9uZW50KHRoaXMub3duZXIuZWwpO1xufVxuXG5cbmZ1bmN0aW9uIHNldFN0eWxlKHByb3BlcnR5LCB2YWx1ZSkge1xuICAgIGlmICghdGhpcy5vd25lci5lbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY2FsbCBzZXRTdHlsZSBvbiBvd25lciB3aXRoIG5vIGVsZW1lbnQ6IFwiICsgdGhpcy5vd25lci5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICB9XG4gICAgdGhpcy5vd25lci5lbC5zdHlsZVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gc2V0U3R5bGVzKHByb3BlcnRpZXMpIHtcbiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBwcm9wZXJ0aWVzKVxuICAgICAgICB0aGlzLm93bmVyLmVsLnN0eWxlW3Byb3BlcnR5XSA9IHByb3BlcnRpZXNbcHJvcGVydHldO1xufVxuXG5cbi8vIGNyZWF0ZSBhIGNvcHkgb2YgRE9NIGVsZW1lbnQgdXNpbmcgZmFjZXQgY29uZmlnIGlmIHNldFxuZnVuY3Rpb24gY29weShpc0RlZXApIHtcbiAgICByZXR1cm4gdGhpcy5vd25lci5lbCAmJiB0aGlzLm93bmVyLmVsLmNsb25lTm9kZShpc0RlZXApO1xufVxuXG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoKSB7XG4gICAgdmFyIG5ld0VsID0gRG9tLmNyZWF0ZUVsZW1lbnQodGhpcy5jb25maWcpO1xuICAgIHJldHVybiBuZXdFbDtcbn1cblxuXG4vLyByZW1vdmUgSFRNTCBlbGVtZW50IG9mIGNvbXBvbmVudFxuZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgIGRvbVV0aWxzLnJlbW92ZUVsZW1lbnQodGhpcy5vd25lci5lbCk7XG59XG5cbi8vIGFwcGVuZCBpbnNpZGUgSFRNTCBlbGVtZW50IG9mIGNvbXBvbmVudFxuZnVuY3Rpb24gYXBwZW5kKGVsKSB7XG4gICAgdGhpcy5vd25lci5lbC5hcHBlbmRDaGlsZChlbCk7XG59XG5cbi8vIHByZXBlbmQgaW5zaWRlIEhUTUwgZWxlbWVudCBvZiBjb21wb25lbnRcbmZ1bmN0aW9uIHByZXBlbmQoZWwpIHtcbiAgICB2YXIgdGhpc0VsID0gdGhpcy5vd25lci5lbFxuICAgICAgICAsIGZpcnN0Q2hpbGQgPSB0aGlzRWwuZmlyc3RDaGlsZDtcbiAgICBpZiAoZmlyc3RDaGlsZClcbiAgICAgICAgdGhpc0VsLmluc2VydEJlZm9yZShlbCwgZmlyc3RDaGlsZCk7XG4gICAgZWxzZVxuICAgICAgICB0aGlzRWwuYXBwZW5kQ2hpbGQoZWwpO1xufVxuXG4vLyBhcHBlbmRzIGNoaWxkcmVuIG9mIGVsZW1lbnQgaW5zaWRlIHRoaXMgY29tcG9uZW50J3MgZWxlbWVudFxuZnVuY3Rpb24gYXBwZW5kQ2hpbGRyZW4oZWwpIHtcbiAgICB3aGlsZShlbC5jaGlsZE5vZGVzLmxlbmd0aClcbiAgICAgICAgdGhpcy5hcHBlbmQoZWwuY2hpbGROb2Rlc1swXSk7XG59XG5cbi8vIHByZXBlbmRzIGNoaWxkcmVuIG9mIGVsZW1lbnQgaW5zaWRlIHRoaXMgY29tcG9uZW50J3MgZWxlbWVudFxuZnVuY3Rpb24gcHJlcGVuZENoaWxkcmVuKGVsKSB7XG4gICAgd2hpbGUoZWwuY2hpbGROb2Rlcy5sZW5ndGgpXG4gICAgICAgIHRoaXMucHJlcGVuZChlbC5jaGlsZE5vZGVzW2VsLmNoaWxkTm9kZXMubGVuZ3RoIC0gMV0pO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRBZnRlcihlbCkge1xuICAgIHZhciB0aGlzRWwgPSB0aGlzLm93bmVyLmVsXG4gICAgICAgICwgcGFyZW50ID0gdGhpc0VsLnBhcmVudE5vZGU7ICAgIFxuICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoZWwsIHRoaXNFbC5uZXh0U2libGluZyk7XG59XG5cbmZ1bmN0aW9uIGluc2VydEJlZm9yZShlbCkge1xuICAgIHZhciB0aGlzRWwgPSB0aGlzLm93bmVyLmVsXG4gICAgICAgICwgcGFyZW50ID0gdGhpc0VsLnBhcmVudE5vZGU7XG4gICAgcGFyZW50Lmluc2VydEJlZm9yZShlbCwgdGhpc0VsKTtcbn1cblxuXG4vLyBhcHBlbmRzIGNvbXBvbmVudCdzIGVsZW1lbnQgdG8gc2NvcGUgcGFyZW50LiBJZiBpdCB3YXMgYWxyZWR5IGluIERPTSBpdCB3aWxsIGJlIG1vdmVkXG5mdW5jdGlvbiBhcHBlbmRUb1Njb3BlUGFyZW50KCkge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLm93bmVyLmdldFNjb3BlUGFyZW50KCk7XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LmVsLmFwcGVuZENoaWxkKHRoaXMub3duZXIuZWwpO1xufVxuXG5cbi8qKlxuICogRG9tIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyB0aGUgbGlzdCBvZiBjaGlsZCBlbGVtZW50cyBvZiB0aGUgY29tcG9uZW50IGVsZW1lbnRcbiAqXG4gKiBAcmV0dXJuIHtBcnJheVtFbGVtZW50XX1cbiAqL1xuZnVuY3Rpb24gRG9tJGNoaWxkcmVuKCkge1xuICAgIHJldHVybiBkb21VdGlscy5jaGlsZHJlbih0aGlzLm93bmVyLmVsKTtcbn1cblxuXG52YXIgZmluZERpcmVjdGlvbnMgPSB7XG4gICAgJ3VwJzogJ3ByZXZpb3VzTm9kZScsXG4gICAgJ2Rvd24nOiAnbmV4dE5vZGUnXG59O1xuXG4vLyBGaW5kcyBjb21wb25lbnQgcGFzc2luZyBvcHRpb25hbCBpdGVyYXRvcidzIHRlc3Rcbi8vIGluIHRoZSBzYW1lIHNjb3BlIGFzIHRoZSBjdXJyZW50IGNvbXBvbmVudCAodGhpcylcbi8vIGJ5IHRyYXZlcnNpbmcgRE9NIHRyZWUgdXB3YXJkcyAoZGlyZWN0aW9uID0gXCJ1cFwiKVxuLy8gb3IgZG93bndhcmRzIChkaXJlY3Rpb24gPSBcImRvd25cIilcbmZ1bmN0aW9uIGZpbmQoZGlyZWN0aW9uLCBpdGVyYXRvcikge1xuICAgIGlmICghIGZpbmREaXJlY3Rpb25zLmhhc093blByb3BlcnR5KGRpcmVjdGlvbikpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW5jb3JyZWN0IGZpbmQgZGlyZWN0aW9uOiAnICsgZGlyZWN0aW9uKTtcblxuICAgIHZhciBlbCA9IHRoaXMub3duZXIuZWxcbiAgICAgICAgLCBzY29wZSA9IHRoaXMub3duZXIuc2NvcGVcbiAgICAgICAgLCB0cmVlV2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihzY29wZS5fcm9vdEVsLCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCk7XG5cbiAgICB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gZWw7XG4gICAgdmFyIG5leHROb2RlID0gdHJlZVdhbGtlcltmaW5kRGlyZWN0aW9uc1tkaXJlY3Rpb25dXSgpXG4gICAgICAgICwgY29tcG9uZW50c05hbWVzID0gT2JqZWN0LmtleXMoc2NvcGUpXG4gICAgICAgICwgZm91bmQgPSBmYWxzZTtcblxuICAgIHdoaWxlIChuZXh0Tm9kZSkge1xuICAgICAgICB2YXIgYXR0ciA9IG5ldyBCaW5kQXR0cmlidXRlKG5leHROb2RlKTtcbiAgICAgICAgaWYgKGF0dHIubm9kZSkge1xuICAgICAgICAgICAgYXR0ci5wYXJzZSgpLnZhbGlkYXRlKCk7XG4gICAgICAgICAgICBpZiAoc2NvcGUuaGFzT3duUHJvcGVydHkoYXR0ci5jb21wTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gc2NvcGVbYXR0ci5jb21wTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKCEgaXRlcmF0b3IgfHwgaXRlcmF0b3IoY29tcG9uZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gbmV4dE5vZGU7XG4gICAgICAgIG5leHROb2RlID0gdHJlZVdhbGtlcltmaW5kRGlyZWN0aW9uc1tkaXJlY3Rpb25dXSgpO1xuICAgIH1cblxuICAgIGlmIChmb3VuZCkgcmV0dXJuIGNvbXBvbmVudDtcbn1cblxuXG4vLyByZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgaGFzIHRleHQgYmVmb3JlIHNlbGVjdGlvblxuZnVuY3Rpb24gaGFzVGV4dEJlZm9yZVNlbGVjdGlvbigpIHtcbiAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICghIHNlbGVjdGlvbi5pc0NvbGxhcHNlZCkgcmV0dXJuIHRydWU7XG4gICAgXG4gICAgdmFyIHRleHQgPSBzZWxlY3Rpb24uZm9jdXNOb2RlICYmIHNlbGVjdGlvbi5mb2N1c05vZGUudGV4dENvbnRlbnQ7XG4gICAgdmFyIHN0YXJ0UG9zID0gdGV4dCAmJiB0ZXh0LmNoYXJBdCgwKSA9PSAnICcgPyAxIDogMDtcbiAgICBpZiAoc2VsZWN0aW9uLmFuY2hvck9mZnNldCAhPSBzdGFydFBvcykgcmV0dXJuIHRydWU7XG5cbiAgICAvLyB3YWxrIHVwIHRoZSBET00gdHJlZSB0byBjaGVjayBpZiB0aGVyZSBhcmUgdGV4dCBub2RlcyBiZWZvcmUgY3Vyc29yXG4gICAgdmFyIHRyZWVXYWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKHRoaXMub3duZXIuZWwsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcbiAgICB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGU7XG4gICAgdmFyIHByZXZOb2RlID0gdHJlZVdhbGtlci5wcmV2aW91c05vZGUoKTtcblxuICAgIHZhciBpc1RleHQgPSBwcmV2Tm9kZSA/ICFwcmV2Tm9kZS5ub2RlVmFsdWUudHJpbSgpID09ICcnIDogZmFsc2U7XG5cbiAgICByZXR1cm4gaXNUZXh0O1xufVxuXG5cbmZ1bmN0aW9uIGhhc1RleHRBZnRlclNlbGVjdGlvbigpIHtcbiAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICghIHNlbGVjdGlvbi5pc0NvbGxhcHNlZCkgcmV0dXJuIHRydWU7XG5cbiAgICB2YXIgdGV4dCA9IHNlbGVjdGlvbi5mb2N1c05vZGUgJiYgc2VsZWN0aW9uLmZvY3VzTm9kZS50ZXh0Q29udGVudDtcbiAgICB2YXIgc3RhcnRQb3MgPSB0ZXh0ICYmIHRleHQuY2hhckF0KHRleHQubGVuZ3RoLTEpID09ICcgJyA/IHNlbGVjdGlvbi5hbmNob3JOb2RlLmxlbmd0aC0xIDogc2VsZWN0aW9uLmFuY2hvck5vZGUubGVuZ3RoO1xuICAgIGlmIChzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0IDwgc3RhcnRQb3MpIHJldHVybiB0cnVlO1xuXG4gICAgLy8gd2FsayB1cCB0aGUgRE9NIHRyZWUgdG8gY2hlY2sgaWYgdGhlcmUgYXJlIHRleHQgbm9kZXMgYWZ0ZXIgY3Vyc29yXG4gICAgdmFyIHRyZWVXYWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKHRoaXMub3duZXIuZWwsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcbiAgICB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGU7XG4gICAgdmFyIG5leHROb2RlID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpO1xuICAgIFxuICAgIC8vVG8gY2FwdHVyZSB3aGVuIHRyZWV3YWxrZXIgZ2l2ZXMgdXMgYW4gZW1wdHkgdGV4dCBub2RlICh1bmtub3duIHJlYXNvbilcbiAgICB2YXIgaXNUZXh0ID0gbmV4dE5vZGUgPyAhbmV4dE5vZGUubm9kZVZhbHVlLnRyaW0oKSA9PSAnJyA6IGZhbHNlO1xuXG4gICAgcmV0dXJuIGlzVGV4dDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gPGEgbmFtZT1cImNvbXBvbmVudHMtZmFjZXRzLWRyYWdcIj48L2E+XG4vLyAjIyNkcmFnIGZhY2V0XG5cbnZhciBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIERPTUV2ZW50c1NvdXJjZSA9IHJlcXVpcmUoJy4uL21zZ19zcmMvZG9tX2V2ZW50cycpXG4gICAgLCBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIERyYWdEcm9wID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kcmFnZHJvcCcpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyO1xuXG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzLmdldCgnRHJhZycpYFxuICogRmFjZXQgZm9yIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgZHJhZ2dlZFxuICogRHJhZyBmYWNldCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczpcbiAqXG4gKiAgLSBtZXRhOiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzXG4gKiAgICAgIC0gcGFyYW1zOiBvYmplY3Qgb2Yga2V5LXZhbHVlIHBhaXJzIHRoYXQgd2lsbCBiZSBwYXNzZWQgaW4gbWV0YWRhdGEgZGF0YSB0eXBlIChjYW4gYWxzbyBiZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0aGF0IHJldHVybnMgdGhpcyBvYmplY3QpLiBTZWUgY29uZmlnLmRyYWdEcm9wLmRhdGFUeXBlcy5jb21wb25lbnRNZXRhVGVtcGxhdGVcbiAqICAgICAgLSBkYXRhOiBkYXRhIHRoYXQgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIGFib3ZlIG1ldGEgZGF0YSB0eXBlIChvciBmdW5jdGlvbilcbiAqICAtIGFsbG93ZWRFZmZlY3RzOiBzdHJpbmcgKG9yIGZ1bmN0aW9uKSBhcyBzcGVjaWZpZWQgaGVyZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9EcmFnRHJvcC9EcmFnX09wZXJhdGlvbnMjZHJhZ3N0YXJ0XG4gKiAgLSBkcmFnSW1hZ2U6XG4gKiAgICAgIC0gdXJsOiBwYXRoIHRvIGltYWdlIHRvIGRpc3BsYXkgd2hlbiBkcmFnZ2luZywgaW5zdGVhZCBvZiB0aGUgb3duZXIgZWxlbWVudFxuICogICAgICAtIHg6IHggb2Zmc2V0IGZvciB0aGUgaW1hZ2VcbiAqICAgICAgLSB5OiB5IG9mZnNldCBmb3IgdGhlIGltYWdlXG4gKiAgLSBkcmFnQ2xzOiBDU1MgY2xhc3MgdG8gYXBwbHkgdG8gdGhlIGNvbXBvbmVudCBiZWluZyBkcmFnZ2VkXG4gKiAgLSBkYXRhVHlwZXM6IG1hcCBvZiBhZGRpdGlvbmFsIGRhdGEgdHlwZXMgdGhlIGNvbXBvbmVudCB3aWxsIHN1cHBseSB0byBkYXRhIHRyYW5zZmVyIG9iamVjdCwga2V5IGlzIGRhdGEgdHlwZSwgdmFsdWUgaXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgaXQsIGNvbXBvbmVudCB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgY29udGV4dCB0byB0aGlzIGZ1bmN0aW9uXG4gKlxuICogSWYgZnVuY3Rpb24gaXMgc3BlY2lmaWVkIGluIGFueSBwYXJhbWV0ZXIgaXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgY29tcG9uZW50IGFzIHRoZSBjb250ZXh0XG4gKi9cbnZhciBEcmFnID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0RyYWcnKTtcblxuXy5leHRlbmRQcm90byhEcmFnLCB7XG4gICAgaW5pdDogRHJhZyRpbml0LFxuICAgIHN0YXJ0OiBEcmFnJHN0YXJ0LFxuICAgIHNldEhhbmRsZTogRHJhZyRzZXRIYW5kbGVcbn0pO1xuXG5mYWNldHNSZWdpc3RyeS5hZGQoRHJhZyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRHJhZztcblxuXG5mdW5jdGlvbiBEcmFnJGluaXQoKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgICBcblxuICAgIHRoaXMuX2NyZWF0ZU1lc3NhZ2VTb3VyY2VXaXRoQVBJKERPTUV2ZW50c1NvdXJjZSk7XG4gICAgdGhpcy5fZHJhZ0RhdGEgPSB7fTtcblxuICAgIHZhciBkYXRhVHlwZUluZm8gPSB0aGlzLmNvbmZpZy5fZGF0YVR5cGVJbmZvIHx8ICcnO1xuICAgIHRoaXMuX2RhdGFUeXBlSW5mbyA9IHR5cGVvZiBkYXRhVHlwZUluZm8gPT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZGF0YVR5cGVJbmZvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmdW5jdGlvbigpIHsgcmV0dXJuIGRhdGFUeXBlSW5mbzsgfTtcbn1cblxuXG4vKipcbiAqIERyYWcgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTZXRzIHRoZSBkcmFnIGhhbmRsZSBlbGVtZW50IG9mIGNvbXBvbmVudC4gVGhpcyBlbGVtZW50IGhhcyB0byBiZSBkcmFnZ2VkIGZvciB0aGUgY29tcG9uZW50IHRvIGJlIGRyYWdnZWQuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBoYW5kbGVFbFxuICovXG5mdW5jdGlvbiBEcmFnJHNldEhhbmRsZShoYW5kbGVFbCkge1xuICAgIGlmICghIHRoaXMub3duZXIuZWwuY29udGFpbnMoaGFuZGxlRWwpKVxuICAgICAgICByZXR1cm4gbG9nZ2VyLndhcm4oJ2RyYWcgaGFuZGxlIHNob3VsZCBiZSBpbnNpZGUgZWxlbWVudCB0byBiZSBkcmFnZ2VkJylcbiAgICB0aGlzLl9kcmFnSGFuZGxlID0gaGFuZGxlRWw7XG59XG5cblxuZnVuY3Rpb24gRHJhZyRzdGFydCgpIHtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuc3RhcnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBfYWRkRHJhZ0F0dHJpYnV0ZS5jYWxsKHRoaXMpO1xuICAgIF9jcmVhdGVEcmFnSW1hZ2UuY2FsbCh0aGlzKTtcblxuICAgIHRoaXMub25NZXNzYWdlcyh7XG4gICAgICAgICdtb3VzZWRvd24nOiBvbk1vdXNlRG93bixcbiAgICAgICAgJ21vdXNlZW50ZXIgbW91c2VsZWF2ZSBtb3VzZW1vdmUnOiBvbk1vdXNlTW92ZW1lbnQsXG4gICAgICAgICdkcmFnc3RhcnQnOiBvbkRyYWdTdGFydCxcbiAgICAgICAgJ2RyYWcnOiBvbkRyYWdnaW5nLFxuICAgICAgICAnZHJhZ2VuZCc6IG9uRHJhZ0VuZFxuICAgIH0pO1xuXG4gICAgdGhpcy5vd25lci5vbk1lc3NhZ2VzKHtcbiAgICAgICAgJ2dldHN0YXRlc3RhcnRlZCc6XG4gICAgICAgICAgICB7IHN1YnNjcmliZXI6IF9yZW1vdmVEcmFnQXR0cmlidXRlLCBjb250ZXh0OiB0aGlzIH0sXG4gICAgICAgICdnZXRzdGF0ZWNvbXBsZXRlZCc6XG4gICAgICAgICAgICB7IHN1YnNjcmliZXI6IF9hZGREcmFnQXR0cmlidXRlLCBjb250ZXh0OiB0aGlzIH1cbiAgICB9KTtcbn1cblxuXG4vKipcbiAqIEFkZHMgZHJhZ2dhYmxlIGF0dHJpYnV0ZSB0byBjb21wb25lbnQncyBlbGVtZW50XG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gX2FkZERyYWdBdHRyaWJ1dGUoKSB7XG4gICAgaWYgKHRoaXMub3duZXIuZWwpXG4gICAgICAgIHRoaXMub3duZXIuZWwuc2V0QXR0cmlidXRlKCdkcmFnZ2FibGUnLCB0cnVlKTtcbn1cblxuXG5mdW5jdGlvbiBfcmVtb3ZlRHJhZ0F0dHJpYnV0ZSgpIHtcbiAgICBpZiAodGhpcy5vd25lci5lbClcbiAgICAgICAgdGhpcy5vd25lci5lbC5yZW1vdmVBdHRyaWJ1dGUoJ2RyYWdnYWJsZScpO1xufVxuXG5cbmZ1bmN0aW9uIF9jcmVhdGVEcmFnSW1hZ2UoKSB7XG4gICAgdmFyIGRyYWdJbWFnZSA9IHRoaXMuY29uZmlnLmRyYWdJbWFnZTtcbiAgICBpZiAoZHJhZ0ltYWdlKSB7XG4gICAgICAgIHRoaXMuX2RyYWdFbGVtZW50ID0gbmV3IEltYWdlKCk7XG4gICAgICAgIHRoaXMuX2RyYWdFbGVtZW50LnNyYyA9IGRyYWdJbWFnZS51cmw7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIG9uTW91c2VEb3duKGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAgICB0aGlzLl9fbW91c2VEb3duVGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIGlmICh0YXJnZXRJbkRyYWdIYW5kbGUuY2FsbCh0aGlzKSkge1xuICAgICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkuZW1wdHkoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIG9uTW91c2VNb3ZlbWVudChldmVudFR5cGUsIGV2ZW50KSB7XG4gICAgdmFyIHNob3VsZEJlRHJhZ2dhYmxlID0gdGFyZ2V0SW5EcmFnSGFuZGxlLmNhbGwodGhpcyk7XG4gICAgdGhpcy5vd25lci5lbC5zZXRBdHRyaWJ1dGUoJ2RyYWdnYWJsZScsIHNob3VsZEJlRHJhZ2dhYmxlKTtcbiAgICBpZiAoZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoJ2RhdGEtZHJhZ0VuYWJsZUV2ZW50JykgIT0gJ2ZhbHNlJylcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG59XG5cblxuZnVuY3Rpb24gb25EcmFnU3RhcnQoZXZlbnRUeXBlLCBldmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9mZiB8fCAhIHRhcmdldEluRHJhZ0hhbmRsZS5jYWxsKHRoaXMpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZHJhZ0ltYWdlID0gdGhpcy5jb25maWcuZHJhZ0ltYWdlO1xuICAgIGlmIChkcmFnSW1hZ2UpXG4gICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5zZXREcmFnSW1hZ2UodGhpcy5fZHJhZ0VsZW1lbnQsIGRyYWdJbWFnZS54IHx8IDAsIGRyYWdJbWFnZS55IHx8IDApO1xuXG4gICAgdmFyIG93bmVyID0gdGhpcy5vd25lcjtcbiAgICB2YXIgZHQgPSBuZXcgRHJhZ0Ryb3AoZXZlbnQpO1xuXG4gICAgdGhpcy5fZHJhZ0RhdGEgPSBkdC5zZXRDb21wb25lbnRTdGF0ZShvd25lcik7XG4gICAgc2V0TWV0YS5jYWxsKHRoaXMpO1xuICAgIHNldEFkZGl0aW9uYWxEYXRhVHlwZXMuY2FsbCh0aGlzKTtcbiAgICBfc2V0QWxsb3dlZEVmZmVjdHMuY2FsbCh0aGlzLCBkdCk7XG5cbiAgICBpZiAodGhpcy5jb25maWcuZHJhZ0NscylcbiAgICAgICAgdGhpcy5vd25lci5lbC5jbGFzc0xpc3QudG9nZ2xlKHRoaXMuY29uZmlnLmRyYWdDbHMsIHRydWUpO1xuXG4gICAgRHJhZ0Ryb3Auc2VydmljZS5wb3N0TWVzc2FnZVN5bmMoJ2RyYWdkcm9wc3RhcnRlZCcsIHtcbiAgICAgICAgZXZlbnRUeXBlOiAnZHJhZ3N0YXJ0JyxcbiAgICAgICAgZHJhZ0Ryb3A6IGR0LFxuICAgICAgICBkcmFnRmFjZXQ6IHRoaXNcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHNldE1ldGEoKSB7XG4gICAgICAgIHZhciBwYXJhbXMgPSBnZXRNZXRhRGF0YS5jYWxsKHRoaXMsICdwYXJhbXMnKVxuICAgICAgICAgICAgLCBkYXRhID0gZ2V0TWV0YURhdGEuY2FsbCh0aGlzLCAnZGF0YScpO1xuXG4gICAgICAgIHRoaXMuX2RyYWdNZXRhRGF0YVR5cGUgPSBkdC5zZXRDb21wb25lbnRNZXRhKG93bmVyLCBwYXJhbXMsIGRhdGEpO1xuICAgICAgICB0aGlzLl9kcmFnTWV0YURhdGEgPSBkYXRhO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldE1ldGFEYXRhKHByb3BlcnR5KSB7XG4gICAgICAgIHRyeSB7IHZhciBmdW5jID0gdGhpcy5jb25maWcubWV0YVtwcm9wZXJ0eV07IH0gY2F0Y2goZSkge31cbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jID09ICdzdHJpbmcnKSBmdW5jID0gb3duZXJbZnVuY107XG4gICAgICAgIHJldHVybiBfLnJlc3VsdChmdW5jLCBvd25lcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0QWRkaXRpb25hbERhdGFUeXBlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmRhdGFUeXBlcykge1xuICAgICAgICAgICAgdGhpcy5fZGF0YVR5cGVzRGF0YSA9IF8ubWFwS2V5cyh0aGlzLmNvbmZpZy5kYXRhVHlwZXMsIGZ1bmN0aW9uIChnZXREYXRhRnVuYywgZGF0YVR5cGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGdldERhdGFGdW5jLmNhbGwodGhpcy5vd25lciwgZGF0YVR5cGUpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PSAnb2JqZWN0JykgZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhKSBkdC5zZXREYXRhKGRhdGFUeXBlLCBkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgIH0sIHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIG9uRHJhZ2dpbmcoZXZlbnRUeXBlLCBldmVudCkge1xuICAgIGlmIChfZHJhZ0lzRGlzYWJsZWQuY2FsbCh0aGlzLCBldmVudCkpIHJldHVybjtcblxuICAgIHZhciBkdCA9IG5ldyBEcmFnRHJvcChldmVudCk7XG4gICAgZHQuc2V0Q29tcG9uZW50U3RhdGUodGhpcy5vd25lciwgdGhpcy5fZHJhZ0RhdGEpO1xuICAgIGR0LnNldERhdGEodGhpcy5fZHJhZ01ldGFEYXRhVHlwZSwgdGhpcy5fZHJhZ01ldGFEYXRhKTtcbiAgICBpZiAodGhpcy5fZGF0YVR5cGVzRGF0YSkge1xuICAgICAgICBfLmVhY2hLZXkodGhpcy5fZGF0YVR5cGVzRGF0YSwgZnVuY3Rpb24oZGF0YSwgZGF0YVR5cGUpIHtcbiAgICAgICAgICAgIGlmIChkYXRhKSBkdC5zZXREYXRhKGRhdGFUeXBlLCBkYXRhKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3NldEFsbG93ZWRFZmZlY3RzLmNhbGwodGhpcywgZHQpO1xufVxuXG5cbmZ1bmN0aW9uIG9uRHJhZ0VuZChldmVudFR5cGUsIGV2ZW50KSB7XG4gICAgaWYgKF9kcmFnSXNEaXNhYmxlZC5jYWxsKHRoaXMsIGV2ZW50KSkgcmV0dXJuO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLmRyYWdDbHMpXG4gICAgICAgIHRoaXMub3duZXIuZWwuY2xhc3NMaXN0LnRvZ2dsZSh0aGlzLmNvbmZpZy5kcmFnQ2xzLCBmYWxzZSk7XG5cbiAgICB2YXIgZHQgPSBuZXcgRHJhZ0Ryb3AoZXZlbnQpO1xuICAgIERyYWdEcm9wLnNlcnZpY2UucG9zdE1lc3NhZ2VTeW5jKCdjb21wbGV0ZWRyYWdkcm9wJywge1xuICAgICAgICBldmVudFR5cGU6ICdkcmFnZW5kJyxcbiAgICAgICAgZHJhZ0Ryb3A6IGR0LFxuICAgICAgICBkcmFnRmFjZXQ6IHRoaXNcbiAgICB9KTtcbn1cblxuXG5mdW5jdGlvbiBfc2V0QWxsb3dlZEVmZmVjdHMoRHJhZ0Ryb3ApIHtcbiAgICB2YXIgZWZmZWN0cyA9IF8ucmVzdWx0KHRoaXMuY29uZmlnLmFsbG93ZWRFZmZlY3RzLCB0aGlzLm93bmVyKTtcbiAgICBEcmFnRHJvcC5zZXRBbGxvd2VkRWZmZWN0cyhlZmZlY3RzKTtcbn1cblxuXG5mdW5jdGlvbiB0YXJnZXRJbkRyYWdIYW5kbGUoKSB7XG4gICAgcmV0dXJuICEgdGhpcy5fZHJhZ0hhbmRsZSB8fCB0aGlzLl9kcmFnSGFuZGxlLmNvbnRhaW5zKHRoaXMuX19tb3VzZURvd25UYXJnZXQpO1xufVxuXG5cbmZ1bmN0aW9uIF9kcmFnSXNEaXNhYmxlZChldmVudCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5vZmYpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gPGEgbmFtZT1cImNvbXBvbmVudHMtZmFjZXRzLWRyb3BcIj48L2E+XG4vLyAjIyNkcm9wIGZhY2V0XG5cbnZhciBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIERPTUV2ZW50c1NvdXJjZSA9IHJlcXVpcmUoJy4uL21zZ19zcmMvZG9tX2V2ZW50cycpXG4gICAgLCBEcm9wTXNnQVBJID0gcmVxdWlyZSgnLi4vbXNnX2FwaS9kcm9wJylcbiAgICAsIERyYWdEcm9wID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kcmFnZHJvcCcpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzLmdldCgnRHJvcCcpYFxuICogRmFjZXQgZm9yIGNvbXBvbmVudHMgdGhhdCBjYW4gYWNjZXB0IGRyb3BzXG4gKiBEcm9wIGZhY2V0IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzOlxuICpcbiAqICAtIGFsbG93IC0gYW4gb2JqZWN0IHRoYXQgd2lsbCBkZWZpbmUgYWxsb3dlZCBkYXRhIHR5cGVzIGR1cmluZyBkcmFnIChgZHJhZ2VudGVyYCBhbmQgYGRyYWdvdmVyYCBldmVudHMpIHdpdGggdGhlc2UgcHJvcGVydGllczpcbiAqICAgICAgLSBjb21wb25lbnRzOiBgdHJ1ZWAgYnkgZGVmYXVsdCAoYWxsIGNvbXBvbmVudHMgd2lsbCBiZSBhY2NlcHRlZClcbiAqICAgICAgICAgICAgICAgICAgICAgICAgT1Igc3RyaW5nIHdpdGggYWxsb3dlZCBjb21wb25lbnQgY2xhc3NcbiAqICAgICAgICAgICAgICAgICAgICAgICAgT1IgbGlzdCBvZiBhbGxvd2VkIGNvbXBvbmVudHMgY2xhc3NlcyAoc3RyaW5ncylcbiAqICAgICAgICAgICAgICAgICAgICAgICAgT1IgbWFwIHdpdGggYWxsb3dlZCBjbGFzc2VzIGluIGtleXMgYW5kIGB0cnVlYC90ZXN0IGZ1bmN0aW9ucyBpbiB2YWx1ZXNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgT1IgdGVzdCBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgcGFzc2VkIG9iamVjdCBkZWZpbmVkIGJlbG93XG4gKiAgICAgICAgICAgICAgICAgICAgICAgIE9SIGBmYWxzZWAgdG8gTk9UIGFjY2VwdCBjb21wb25lbnRzXG4gKiAgICAgIC0gZGF0YVR5cGVzOiAgYGZhbHNlYCBieSBkZWZhdWx0IChubyBvdGhlciBkYXRhIHR5cGVzIHdpbGwgYmUgYWNjZXB0ZWQpXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIE9SIHN0cmluZyB3aXRoIGFsbG93ZWQgZGF0YSB0eXBlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIE9SIGxpc3Qgb2YgYWRkaXRpb25hbCBkYXRhIHR5cGVzIHRoYXQgYSBkcm9wIHRhcmdldCB3b3VsZCBhY2NlcHRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgT1IgdGVzdCBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgcGFzc2VkIERyYWdEcm9wIG9iamVjdFxuICogICAgICAgICAgICAgICAgICAgICAgICBPUiBgdHJ1ZWAgdG8gYWNjZXB0IGFsbCBkYXRhIHR5cGVzXG4gKiAgICAgIC0gY2hlY2tQYXJlbnQ6IGBmYWxzZWAgYnkgZGVmYXVsdFxuICogICAgICAgICAgICAgICAgICAgICAgICBPUiBgdHJ1ZWAgd2lsbCBjYWxsIHBhcmVudCBjb21wb25lbnQgZHJvcCBhbGxvdyB0byBjaGVjayBpZiBwYXJlbnQgY29tcG9uZW50IHdpbGwgYWNjZXB0IHRoZSBjb21wb25lbnRcbiAqICAgICAgSWYgdGVzdCBmdW5jdGlvbnMgYXJlIHVzZWQsIHRoZXkgc2hvdWxkIHJldHVybiBib29sZWFuLiBFYWNoIHRlc3QgZnVuY3Rpb24gY2FuIGFsc28gc2V0IGRyb3AgZWZmZWN0IGFzIGRlZmluZWQgaGVyZTpcbiAqICAgICAgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RhdGFUcmFuc2ZlciNkcm9wRWZmZWN0LjI4LjI5XG4gKiAgICAgIFNldHRpbmcgZHJvcCBlZmZlY3QgdGhhdCBpcyBub3QgYWxsb3dlZCBieSBkcmFnZ2VkIG9iamVjdCB3aWxsIHByZXZlbnQgZHJvcC5cbiAqICAgICAgVGVzdCBmdW5jdGlvbnMgZm9yIGNvbXBvbmVudHMgd2lsbCBiZSBwYXNzZWQgdGhlIG93bmVyIG9mIERyb3AgZmFjZXQgYXMgY29udGV4dCwgdGhlIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgcHJvcGVydGllcyBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyOlxuICogICAgICAgICAgY29tcENsYXNzIC0gbmFtZSBvZiBjb21wb25lbnQgY2xhc3MgYXMgc3RvcmVkIGluIHJlZ2lzdHJ5XG4gKiAgICAgICAgICBjb21wTmFtZSAtIG5hbWUgb2YgY29tcG9uZW50IChhbGwgbG93ZXJjYXNlKVxuICogICAgICAgICAgcGFyYW1zIC0gcGFyYW1ldGVycyBhcyBlbmNvZGVkIGluIGRhdGFUeXBlLCBwYXNzZWQgdG8gYG1pbG8udXRpbC5kcmFnRHJvcC5zZXRDb21wb25lbnRNZXRhYCBieSBEcmFnIGZhY2V0XG4gKiAgICAgICAgICBtZXRhRGF0YVR5cGUgLSBkYXRhIHR5cGUgb2YgdGhlIGRhdGEgdGhhdCBoYXMgY29tcENsYXNzLCBjb21wTmFtZSBhbmQgcGFyYW1zIGVuY29kZWRcbiAqXG4gKiAgICAgIC4uLiBhbmQgRHJhZ0Ryb3AgaW5zdGFuY2UgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXJcbiAqXG4gKiAgICAgIFRlc3QgZnVuY3Rpb24gZm9yIG90aGVyIGRhdGEgdHlwZXMgd2lsbCBiZSBwYXNzZWQgdGhlIG93bmVyIG9mIERyb3AgZmFjZXQgYXMgY29udGV4dCBhbmQgRHJhZ0Ryb3AgaW5zdGFuY2UgYXMgdGhlIGZpcnN0IHBhcmFtZXRlclxuICpcbiAqICMjIyNFdmVudHMjIyMjXG4gKlxuICogSW4gYWRkaXRpb24gdG8gY29uZmlndXJpbmcgYWxsb3dlZCBjb21wb25lbnRzIGFuZCBkYXRhIHR5cGVzLCBjb21wb25lbnRzIGNsYXNzZXMgc2hvdWxkIHN1YnNjcmliZSB0byBldmVudHMuXG4gKiBBdCB0aGUgdmVyeSBsZWFzdCwgdGhleSBzaG91bGQgc3Vic2NyaWJlIHRvIGBkcm9wYCBldmVudC5cbiAqXG4gKiBEcm9wIGZhY2V0IGVtaXRzIGRyYWdpbi9kcmFnb3V0IG1lc3NhZ2VzIHRoYXQgYXJlIGVtaXR0ZWQgd2hlbmV2ZXIgYWN0dWFsIGNvbXBvbmVudCBlbGVtZW50IGlzIGVudGVyZWQgb3IgbGVmdFxuICogKHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIGRyYWdlbnRlciBhbmQgZHJhZ2xlYXZlIG1lc3NhZ2VzIHRoYXQgYXJlIGVtaXR0ZWQgd2hlbmV2ZXIgYW55IGNoaWxkIGVsZW1lbnQgaXMgZW50ZXJlZCBvciBsZWZ0LCBhcyBsb25nIGFzIGV2ZW50IGJ1YmJsZXMgdXApXG4gKiBJZiBjaGlsZCBjb21wb25lbnQgaGFzIGRyb3AgZmFjZXQgYXR0YWNoZWQsIGRyYWdvdXQgd2lsbCBiZSBlbWl0dGVkIG9uIHRoZSBjdXJyZW50IGNvbXBvbmVudCB3aGVuIHRoZSBjaGlsZCBpcyBlbnRlcmVkLlxuICpcbiAqIFlvdSBjYW4gc2VlIHRoZSBkZW1vbnN0cmF0aW9uIG9mIHdoZW4gbWVzc2FnZXMgYXJlIGVtaXR0ZWQgW2hlcmVdKGh0dHA6Ly9qc2Jpbi5jb20vYnVxb3YvNilcbiAqIFxuICovXG52YXIgRHJvcCA9IF8uY3JlYXRlU3ViY2xhc3MoQ29tcG9uZW50RmFjZXQsICdEcm9wJyk7XG5cblxuXy5leHRlbmRQcm90byhEcm9wLCB7XG4gICAgaW5pdDogRHJvcCRpbml0LFxuICAgIHN0YXJ0OiBEcm9wJHN0YXJ0XG4gICAgLy8gX3JlYXR0YWNoOiBfcmVhdHRhY2hFdmVudHNPbkVsZW1lbnRDaGFuZ2Vcbn0pO1xuXG5mYWNldHNSZWdpc3RyeS5hZGQoRHJvcCk7XG5cbm1vZHVsZS5leHBvcnRzID0gRHJvcDtcblxuXG5mdW5jdGlvbiBEcm9wJGluaXQoKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLl9jcmVhdGVNZXNzYWdlU291cmNlV2l0aEFQSShET01FdmVudHNTb3VyY2UsIG5ldyBEcm9wTXNnQVBJKTtcbn1cblxuXG5mdW5jdGlvbiBEcm9wJHN0YXJ0KCkge1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5zdGFydC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMub3duZXIuZWwuY2xhc3NMaXN0LmFkZCgnY2MtbW9kdWxlLXJlbGF0aXZlJyk7XG4gICAgdGhpcy5vbk1lc3NhZ2VzKHtcbiAgICAgICAgJ2RyYWdlbnRlciBkcmFnb3Zlcic6IG9uRHJhZ2dpbmcsXG4gICAgICAgICdkcm9wJzogb25Ecm9wLFxuICAgICAgICAnZHJhZ2VudGVyIGRyYWdvdmVyIGRyYWdsZWF2ZSBkcm9wIGRyYWdpbiBkcmFnb3V0JzogcG9zdFRvU2VydmljZVxuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIG9uRHJhZ2dpbmcoZXZlbnRUeXBlLCBldmVudCkge1xuICAgIHZhciBkdCA9IG5ldyBEcmFnRHJvcChldmVudCk7XG5cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgaWYgKCEgX2hhbmRsZURyb3BEZXBlbmRlbmN5LmNhbGwodGhpcywgZHQpKVxuICAgICAgICBkdC5zZXREcm9wRWZmZWN0KCdub25lJyk7XG59XG5cblxuZnVuY3Rpb24gb25Ecm9wKGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB2YXIgZHQgPSBuZXcgRHJhZ0Ryb3AoZXZlbnQpO1xuICAgIERyYWdEcm9wLnNlcnZpY2UucG9zdE1lc3NhZ2VTeW5jKCdkcmFnZHJvcGNvbXBsZXRlZCcsIHtcbiAgICAgICAgZXZlbnRUeXBlOiAnZHJvcCcsXG4gICAgICAgIGRyYWdEcm9wOiBkdCxcbiAgICAgICAgZHJvcEZhY2V0OiB0aGlzLFxuICAgICAgICBjb21wb25lbnQ6IHRoaXMub3duZXJcbiAgICB9KTtcbn1cblxuXG5mdW5jdGlvbiBwb3N0VG9TZXJ2aWNlKGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAgICBEcmFnRHJvcC5zZXJ2aWNlLnBvc3RNZXNzYWdlU3luYyhldmVudFR5cGUsIHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICBkcm9wRmFjZXQ6IHRoaXMsXG4gICAgICAgIGNvbXBvbmVudDogdGhpcy5vd25lclxuICAgIH0pO1xufVxuXG5cbnZhciBfaGFuZGxlRHJvcERlcGVuZGVuY3kgPSBfLnRocm90dGxlKF9oYW5kbGVEcm9wRGVwZW5kZW5jeU5vdGhyb3R0bGUsIDUwKTtcbmZ1bmN0aW9uIF9oYW5kbGVEcm9wRGVwZW5kZW5jeU5vdGhyb3R0bGUoZHQsIG9yaWdpbmFsRHJvcENvbXBvbmVudCkge1xuICAgIHZhciBhbGxvdyA9IHRoaXMuY29uZmlnLmFsbG93XG4gICAgICAgICwgcGFyZW50QWxsb3dlZCA9IHRydWU7XG5cbiAgICBvcmlnaW5hbERyb3BDb21wb25lbnQgPSBvcmlnaW5hbERyb3BDb21wb25lbnQgfHwgdGhpcy5vd25lcjtcblxuICAgIGlmIChhbGxvdyAmJiBhbGxvdy5jaGVja1BhcmVudCkge1xuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5vd25lci5nZXRTY29wZVBhcmVudCgnRHJvcCcpO1xuICAgICAgICBpZiAocGFyZW50KVxuICAgICAgICAgICAgcGFyZW50QWxsb3dlZCA9IF9oYW5kbGVEcm9wRGVwZW5kZW5jeU5vdGhyb3R0bGUuY2FsbChwYXJlbnQuZHJvcCwgZHQsIG9yaWdpbmFsRHJvcENvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmVudEFsbG93ZWQgJiYgX2lzRHJvcEFsbG93ZWQuY2FsbCh0aGlzLCBkdCwgb3JpZ2luYWxEcm9wQ29tcG9uZW50KTtcbn1cblxuXG4vKipcbiAqIENoZWNrcyBpZiBkcm9wIGlzIGFsbG93ZWQgYmFzZWQgb24gZmFjZXQgY29uZmlndXJhdGlvbiAoc2VlIGFib3ZlKVxuICogXG4gKiBAcGFyYW0ge0RyYWdEcm9wfSBkdFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gX2lzRHJvcEFsbG93ZWQoZHQsIG9yaWdpbmFsRHJvcENvbXBvbmVudCkge1xuICAgIHZhciBhbGxvdyA9IHRoaXMuY29uZmlnLmFsbG93O1xuXG4gICAgaWYgKGR0LmlzQ29tcG9uZW50KCkpIHtcbiAgICAgICAgdmFyIGFsbG93Q29tcHMgPSBhbGxvdyAmJiBhbGxvdy5jb21wb25lbnRzXG4gICAgICAgICAgICAsIG1ldGEgPSBkdC5nZXRDb21wb25lbnRNZXRhKCk7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlb2YgYWxsb3dDb21wcykge1xuICAgICAgICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgICAgIHJldHVybiBhbGxvd0NvbXBzO1xuICAgICAgICAgICAgLy8gY29tcG9uZW50IGNsYXNzXG4gICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgIHJldHVybiBtZXRhICYmIG1ldGEuY29tcENsYXNzID09IGFsbG93Q29tcHM7XG4gICAgICAgICAgICAvLyB0ZXN0IGZ1bmN0aW9uXG4gICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFsbG93Q29tcHMuY2FsbCh0aGlzLm93bmVyLCBtZXRhLCBkdCwgb3JpZ2luYWxEcm9wQ29tcG9uZW50KTtcbiAgICAgICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYWxsb3dDb21wcykpXG4gICAgICAgICAgICAgICAgICAgIC8vIGxpc3Qgb2YgYWxsb3dlZCBjbGFzc2VzXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGxvd0NvbXBzLmluZGV4T2YobWV0YSAmJiBtZXRhLmNvbXBDbGFzcykgPj0gMDtcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbWFwIG9mIGNsYXNzOiBib29sZWFufHRlc3QgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgdmFyIHRlc3QgPSBhbGxvd0NvbXBzW21ldGEgJiYgbWV0YS5jb21wQ2xhc3NdO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gISEgXy5yZXN1bHQodGVzdCwgdGhpcy5vd25lciwgbWV0YSwgZHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbmNvcnJlY3QgYWxsb3dlZCBjb21wb25lbnRzIGluIGNvbmZpZycpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGRhdGFUeXBlcyA9IGFsbG93ICYmIGFsbG93LmRhdGFUeXBlc1xuICAgICAgICBzd2l0Y2ggKHR5cGVvZiBkYXRhVHlwZXMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gZHQudHlwZXMuaW5kZXhPZihkYXRhVHlwZXMpID49IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPIHRlc3QgZm9yIG90aGVyIGRhdGEgdHlwZXNcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY2ZfcmVnaXN0cnknKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyXG4gICAgLCBET01FdmVudHNTb3VyY2UgPSByZXF1aXJlKCcuLi9tc2dfc3JjL2RvbV9ldmVudHMnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzLmdldCgnRXZlbnRzJylgXG4gKiBDb21wb25lbnQgZmFjZXQgdGhhdCBtYW5hZ2VzIHN1YnNjcmlwdGlvbnMgdG8gRE9NIGV2ZW50cyB1c2luZyBbTWVzc2VuZ2VyXSguLi8uLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCkgd2l0aCBbRE9NRXZlbnRzU291cmNlXSguLi9tc2dfc3JjL2RvbV9ldmVudHMuanMuaHRtbCkuXG4gKiBBbGwgcHVibGljIG1ldGhvZHMgb2YgTWVzc2VuZ2VyIGFuZCBgdHJpZ2dlcmAgbWV0aG9kIG9mIFtET01FdmVudHNTb3VyY2VdKC4uL21zZ19zcmMvZG9tX2V2ZW50cy5qcy5odG1sKSBhcmUgcHJveGllZCBkaXJlY3RseSB0byB0aGlzIGZhY2V0LlxuICogRm9yIGV4YW1wbGUsIHRvIHN1YnNjcmliZSB0byBgY2xpY2tgIGV2ZW50IHVzZTpcbiAqIGBgYFxuICogY29tcG9uZW50LmZyYW1lLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkge1xuICogICAgIC8vIC4uLlxuICogfSk7XG4gKiBgYGBcbiAqIFNlZSBbTWVzc2VuZ2VyXSguLi8uLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbClcbiAqL1xudmFyIEV2ZW50cyA9IF8uY3JlYXRlU3ViY2xhc3MoQ29tcG9uZW50RmFjZXQsICdFdmVudHMnKTtcblxuXG4vKipcbiAqICMjIyNFdmVudHMgZmFjZXQgaW5zdGFuY2UgbWV0aG9kcyMjIyNcbiAqXG4gKiAtIFtpbml0XSgjRXZlbnRzJGluaXQpIC0gY2FsbGVkIGJ5IGNvbnN0cnVjdG9yIGF1dG9tYXRpY2FsbHlcbiAqL1xuXy5leHRlbmRQcm90byhFdmVudHMsIHtcbiAgICBpbml0OiBFdmVudHMkaW5pdFxuICAgIC8vIF9yZWF0dGFjaDogX3JlYXR0YWNoRXZlbnRzT25FbGVtZW50Q2hhbmdlXG59KTtcblxuZmFjZXRzUmVnaXN0cnkuYWRkKEV2ZW50cyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRzO1xuXG5cbi8qKlxuICogRXhwb3NlIERPTUV2ZW50c1NvdXJjZSB0cmlnZ2VyIG1ldGhvZCBvbiBFdmVudHMgcHJvdG90eXBlXG4gKi9cbnZhciBNU0dfU09VUkNFX0tFWSA9ICdfZG9tRXZlbnRzU291cmNlJ1xuRE9NRXZlbnRzU291cmNlLnVzZVdpdGgoRXZlbnRzLCBNU0dfU09VUkNFX0tFWSwgWyd0cmlnZ2VyJ10pO1xuXG5cbi8qKlxuICogRXZlbnRzIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogSW5pdGlhbHplcyBmYWNldCwgY29ubmVjdHMgRE9NRXZlbnRzU291cmNlIHRvIGZhY2V0J3MgbWVzc2VuZ2VyXG4gKi9cbmZ1bmN0aW9uIEV2ZW50cyRpbml0KCkge1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB2YXIgZG9tRXZlbnRzU291cmNlID0gbmV3IERPTUV2ZW50c1NvdXJjZSh0aGlzLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdGhpcy5vd25lcik7XG4gICAgdGhpcy5fc2V0TWVzc2FnZVNvdXJjZShkb21FdmVudHNTb3VyY2UpO1xuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgTVNHX1NPVVJDRV9LRVksIGRvbUV2ZW50c1NvdXJjZSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY2ZfcmVnaXN0cnknKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyXG4gICAgLCBGcmFtZU1lc3NhZ2VTb3VyY2UgPSByZXF1aXJlKCcuLi9tc2dfc3JjL2ZyYW1lJylcbiAgICAsIGRvbUV2ZW50c0NvbnN0cnVjdG9ycyA9IHJlcXVpcmUoJy4uLy4uL3NlcnZpY2VzL2RlX2NvbnN0cnMnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzLmdldCgnRnJhbWUnKWBcbiAqIENvbXBvbmVudCBmYWNldCB0aGF0IHNpbXBsaWZpZXMgc2VuZGluZyB3aW5kb3cgbWVzc2FnZXMgdG8gaWZyYW1lIGFuZCBzdWJzY3JpYmluZyB0byBtZXNzYWdlcyBvbiBpbm5lciB3aW5kb3cgb2YgaWZyYW1lLlxuICogQWxsIHB1YmxpYyBtZXRob2RzIG9mIE1lc3NlbmdlciBhbmQgYHRyaWdnZXJgIG1ldGhvZCBvZiBbRnJhbWVNZXNzYWdlU291cmNlXSguLi9tc2dfc3JjL2ZyYW1lLmpzLmh0bWwpIGFyZSBwcm94aWVkIGRpcmVjdGx5IHRvIHRoaXMgZmFjZXQuXG4gKiBGb3IgZXhhbXBsZSwgdG8gc2VuZCBjdXN0b20gbWVzc2FnZSB0byBpZnJhbWUgd2luZG93IHVzZTpcbiAqIGBgYFxuICogaWZyYW1lQ29tcG9uZW50LmZyYW1lLnRyaWdnZXIoJ215bWVzc2FnZScsIG15RGF0YSk7XG4gKiBgYGBcbiAqIFRvIHN1YnNjcmliZSB0byB0aGlzIG1lc3NhZ2VzIGluc2lkZSBmcmFtZSB1c2UgKHdpdGggbWlsbyAtIHNlZSBbbWlsby5tYWlsXSguLi8uLi9tYWlsL2luZGV4LmpzLmh0bWwpKTpcbiAqIGBgYFxuICogbWlsby5tYWlsLm9uKCdtZXNzYWdlOm15bWVzc2FnZScsIGZ1bmN0aW9uKG1zZ1R5cGUsIG1zZ0RhdGEpIHtcbiAqICAgICAvLyBkYXRhIGlzIGluc2lkZSBvZiB3aW5kb3cgbWVzc2FnZSBkYXRhXG4gKiAgICAgLy8gbXNnVHlwZSA9PSAnbWVzc2FnZTpteW1lc3NhZ2UnXG4gKiAgICAgdmFyIG15RGF0YSA9IG1zZ0RhdGEuZGF0YTtcbiAqICAgICAvLyAuLi4gYXBwIGxvZ2ljIGhlcmVcbiAqIH0pO1xuICogYGBgXG4gKiBvciB3aXRob3V0IG1pbG86XG4gKiBgYGBcbiAqIHdpbmRvdy5hdHRhY2hFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24obWVzc2FnZSkge1xuICogICAgIHZhciBtc2dUeXBlID0gbWVzc2FnZS50eXBlOyAvLyBlLmcuLCAnbXltZXNzYWdlJ1xuICogICAgIHZhciBteURhdGEgPSBtZXNzYWdlLmRhdGE7XG4gKiAgICAgLy8gLi4uIG1lc3NhZ2Ugcm91dGluZyBhbmQgY29kZSBoZXJlXG4gKiB9KTtcbiAqIGBgYFxuICogTWlsbyBkb2VzIHJvdXRpbmcgYmFzZWQgb24gc2VudCBtZXNzYWdlIHR5cGUgYXV0b21hdGljYWxseS5cbiAqIFNlZSBbTWVzc2VuZ2VyXSguLi8uLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCkgYW5kIFttaWxvLm1haWxdKC4uLy4uL21haWwvaW5kZXguanMuaHRtbCkuXG4gKi9cbiB2YXIgRnJhbWUgPSBfLmNyZWF0ZVN1YmNsYXNzKENvbXBvbmVudEZhY2V0LCAnRnJhbWUnKTtcblxuXG4vKipcbiAqIENhbGxzIHBhc3NlZCBmdW5jdGlvbiB3aGVuIGZyYW1lIERPTSBiZWNvbWVzIHJlYWR5LiBJZiBhbHJlYWR5IHJlYWR5IGNhbGxzIGltbWVkaWF0ZWx5XG4gKi9cbnZhciBGcmFtZSR3aGVuUmVhZHkgPSBfbWFrZVdoZW5SZWFkeUZ1bmMoRnJhbWUkaXNSZWFkeSwgJ2RvbXJlYWR5Jyk7XG5cbi8qKlxuICogQ2FsbHMgcGFzc2VkIGZ1bmN0aW9uIHdoZW4gZnJhbWUgbWlsbyBiZWNvbWVzIHJlYWR5LiBJZiBhbHJlYWR5IHJlYWR5IGNhbGxzIGltbWVkaWF0ZWx5XG4gKi9cbnZhciBGcmFtZSR3aGVuTWlsb1JlYWR5ID0gX21ha2VXaGVuUmVhZHlGdW5jKEZyYW1lJGlzTWlsb1JlYWR5LCAnbWVzc2FnZTptaWxvcmVhZHknKTtcblxuXG4vKipcbiAqICMjIyNFdmVudHMgZmFjZXQgaW5zdGFuY2UgbWV0aG9kcyMjIyNcbiAqXG4gKiAtIFtpbml0XSgjRnJhbWUkaW5pdCkgLSBjYWxsZWQgYnkgY29uc3RydWN0b3IgYXV0b21hdGljYWxseVxuICovXG5fLmV4dGVuZFByb3RvKEZyYW1lLCB7XG4gICAgaW5pdDogRnJhbWUkaW5pdCxcbiAgICBzdGFydDogRnJhbWUkc3RhcnQsXG4gICAgZGVzdHJveTogRnJhbWUkZGVzdHJveSxcbiAgICBnZXRXaW5kb3c6IEZyYW1lJGdldFdpbmRvdyxcbiAgICBpc1JlYWR5OiBGcmFtZSRpc1JlYWR5LFxuICAgIHdoZW5SZWFkeTogRnJhbWUkd2hlblJlYWR5LFxuICAgIGlzTWlsb1JlYWR5OiBGcmFtZSRpc01pbG9SZWFkeSxcbiAgICB3aGVuTWlsb1JlYWR5OiBGcmFtZSR3aGVuTWlsb1JlYWR5LFxuICAgIG1pbG86IEZyYW1lJG1pbG9cbiAgICAvLyBfcmVhdHRhY2g6IF9yZWF0dGFjaEV2ZW50c09uRWxlbWVudENoYW5nZVxufSk7XG5cblxuZmFjZXRzUmVnaXN0cnkuYWRkKEZyYW1lKTtcblxubW9kdWxlLmV4cG9ydHMgPSBGcmFtZTtcblxuXG4vKipcbiAqIEV4cG9zZSBGcmFtZU1lc3NhZ2VTb3VyY2UgdHJpZ2dlciBtZXRob2Qgb24gRXZlbnRzIHByb3RvdHlwZVxuICovXG52YXIgTVNHX1NPVVJDRV9LRVkgPSAnX21lc3NhZ2VTb3VyY2UnO1xuRnJhbWVNZXNzYWdlU291cmNlLnVzZVdpdGgoRnJhbWUsIE1TR19TT1VSQ0VfS0VZLCBbJ3RyaWdnZXInXSk7XG5cblxuLyoqXG4gKiBGcmFtZSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEluaXRpYWx6ZXMgZmFjZXQsIGNvbm5lY3RzIEZyYW1lTWVzc2FnZVNvdXJjZSB0byBmYWNldCdzIG1lc3NlbmdlclxuICovXG5mdW5jdGlvbiBGcmFtZSRpbml0KCkge1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgXG4gICAgdmFyIG1lc3NhZ2VTb3VyY2UgPSBuZXcgRnJhbWVNZXNzYWdlU291cmNlKHRoaXMsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0aGlzLm93bmVyKTtcbiAgICB0aGlzLl9zZXRNZXNzYWdlU291cmNlKG1lc3NhZ2VTb3VyY2UpO1xuXG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBNU0dfU09VUkNFX0tFWSwgbWVzc2FnZVNvdXJjZSk7XG59XG5cblxuLyoqXG4gKiBGcmFtZSBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEVtaXRzIGZyYW1lbG9hZGVkIGV2ZW50IHdoZW4gcmVhZHkuXG4gKi9cbmZ1bmN0aW9uIEZyYW1lJHN0YXJ0KCkge1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5zdGFydC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBtaWxvKHBvc3REb21SZWFkeSk7XG5cbiAgICBmdW5jdGlvbiBwb3N0RG9tUmVhZHkoZXZlbnQpIHtcbiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSgnZG9tcmVhZHknLCBldmVudCk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIEZyYW1lJGRlc3Ryb3koKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG4vKipcbiAqIEZyYW1lIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogUmV0cmlldmVzIHRoZSBpbnRlcm5hbCB3aW5kb3cgb2YgdGhlIGZyYW1lIFxuICpcbiAqIEBwYXJhbSB7V2luZG93fVxuICovXG5mdW5jdGlvbiBGcmFtZSRnZXRXaW5kb3coKSB7XG4gICAgcmV0dXJuIHRoaXMub3duZXIuZWwuY29udGVudFdpbmRvdztcbn1cblxuXG4vKipcbiAqIEZyYW1lIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyBkb2N1bWVudC5yZWFkeVN0YXRlIGlmIGZyYW1lIGRvdW1lbnQgc3RhdGUgaXMgJ2ludGVyYWN0aXZlJyBvciAnY29tcGxldGUnLCBmYWxzZSBvdGhlcndpc2VcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd8Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gRnJhbWUkaXNSZWFkeSgpIHtcbiAgICB2YXIgcmVhZHlTdGF0ZSA9IHRoaXMuZ2V0V2luZG93KCkuZG9jdW1lbnQucmVhZHlTdGF0ZTtcbiAgICByZXR1cm4gIHJlYWR5U3RhdGUgIT0gJ2xvYWRpbmcnID8gcmVhZHlTdGF0ZSA6IGZhbHNlO1xufVxuXG5cbi8qKlxuICogRnJhbWUgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHRydWUgaWYgbWlsbyBpcyBsb2FkZWQgYW5kIGhhcyBmaW5pc2hlZCBpbml0aWFsaXppbmcgaW5zaWRlIHRoZSBmcmFtZVxuICpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIEZyYW1lJGlzTWlsb1JlYWR5KCkge1xuICAgIHZhciBmcmFtZU1pbG8gPSB0aGlzLmdldFdpbmRvdygpLm1pbG87XG4gICAgcmV0dXJuIHRoaXMuaXNSZWFkeSgpICYmIGZyYW1lTWlsbyAmJiBmcmFtZU1pbG8ubWlsb192ZXJzaW9uO1xufVxuXG5cbi8qKlxuICogR2l2ZXMgYWNjZXNzIHRvIG1pbG8gaW4gdGhlIGZyYW1lIChhc3N1bWluZyBpdCBpcyBsb2FkZWQgdGhlcmUpXG4gKiBDYWxscyBmdW5jdGlvbiB3aGVuIGJvdGggbWlsbyBhbmQgRE9NIGFyZSByZWFkeSBpZiBmdW5jdGlvbiBpcyBwYXNzZWQuXG4gKiBSZXR1cm5zIHRoZSByZWZlcmVuY2UgdG8gbWlsbyBpbnNpZGUgdGhlIGZyYW1lIGlmIHRoZSB3aW5kb3cgaXMgYWxyZWFkeSBhdmFpbGFibGUuXG4gKiBcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gbWlsbyBhbmQgRE9NIGFyZSByZWFkeSBpbiB0aGUgZnJhbWVcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSByZWZlcmVuY2UgdG8gbWlsbyBpbiB0aGUgZnJhbWUgXG4gKi9cbmZ1bmN0aW9uIEZyYW1lJG1pbG8oZnVuYykge1xuICAgIGlmICh0eXBlb2YgZnVuYyA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdGhpcy53aGVuTWlsb1JlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5nZXRXaW5kb3coKS5taWxvKGZ1bmMpXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB2YXIgd2luID0gdGhpcy5nZXRXaW5kb3coKTtcbiAgICByZXR1cm4gd2luICYmIHdpbi5taWxvO1xufVxuXG5cbmZ1bmN0aW9uIF9tYWtlV2hlblJlYWR5RnVuYyhpc1JlYWR5RnVuYywgZXZlbnQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gRnJhbWVfd2hlblJlYWR5RnVuYyhmdW5jKSB7IC8vICwgYXJndW1lbnRzXG4gICAgICAgIHZhciBzZWxmID0gdGhpc1xuICAgICAgICAgICAgLCBhcmdzID0gXy5zbGljZShhcmd1bWVudHMsIDEpO1xuICAgICAgICBpZiAoaXNSZWFkeUZ1bmMuY2FsbCh0aGlzKSlcbiAgICAgICAgICAgIGNhbGxGdW5jKCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMub24oZXZlbnQsIGNhbGxGdW5jKTtcblxuICAgICAgICBmdW5jdGlvbiBjYWxsRnVuYygpIHtcbiAgICAgICAgICAgIGZ1bmMuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY2ZfcmVnaXN0cnknKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTW9kZWwgPSBtaWxvQ29yZS5Nb2RlbFxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBtaWxvTWFpbCA9IHJlcXVpcmUoJy4uLy4uL3NlcnZpY2VzL21haWwnKTtcblxuXG52YXIgSXRlbUZhY2V0ID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0l0ZW0nKTtcblxuXy5leHRlbmRQcm90byhJdGVtRmFjZXQsIHtcbiAgICBnZXRTdGF0ZTogSXRlbUZhY2V0JGdldFN0YXRlLFxuICAgIHNldFN0YXRlOiBJdGVtRmFjZXQkc2V0U3RhdGUsXG4gICAgZ2V0SW5kZXg6IEl0ZW1GYWNldCRnZXRJbmRleCxcbiAgICBzZXRJbmRleDogSXRlbUZhY2V0JHNldEluZGV4LFxuICAgIHJlbW92ZUl0ZW06IEl0ZW1GYWNldCRyZW1vdmVJdGVtLFxuICAgIGV4dHJhY3RJdGVtOiBJdGVtRmFjZXQkZXh0cmFjdEl0ZW0sXG4gICAgcmVxdWlyZTogWydDb250YWluZXInLCAnRG9tJywgJ0RhdGEnXVxufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChJdGVtRmFjZXQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEl0ZW1GYWNldDtcblxuXG5mdW5jdGlvbiBJdGVtRmFjZXQkZ2V0U3RhdGUoKSB7XG4gICAgcmV0dXJuIHsgc3RhdGU6IHtcbiAgICAgICAgaW5kZXg6IHRoaXMuZ2V0SW5kZXgoKVxuICAgIH19O1xufVxuXG5cbmZ1bmN0aW9uIEl0ZW1GYWNldCRzZXRTdGF0ZShzdGF0ZSkge1xuICAgIHRoaXMuc2V0SW5kZXgoc3RhdGUuc3RhdGUuaW5kZXgpO1xufVxuXG5cbi8qKlxuICogRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgb3duZXIgY29tcG9uZW50IGluIGl0J3MgcGFyZW50IGxpc3QgY29tcG9uZW50XG4gKiBAcmV0dXJuIHtJbnRlZ2VyfSBUaGUgaW5kZXhcbiAqL1xuZnVuY3Rpb24gSXRlbUZhY2V0JGdldEluZGV4KCkge1xuICAgIHJldHVybiB0aGlzLmluZGV4O1xufVxuXG5cbi8qKlxuICogRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTZXRzIHRoZSBpbmRleCBvZiB0aGlzIGNvbXBvbmVudFxuICogQHBhcmFtIHtJbnRlZ2VyfSBpbmRleCBUaGUgaW5kZXggdG8gYmUgc2V0XG4gKi9cbmZ1bmN0aW9uIEl0ZW1GYWNldCRzZXRJbmRleChpbmRleCkge1xuICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbn1cblxuXG4vKipcbiAqIEl0ZW1GYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFJlbW92ZXMgY29tcG9uZW50IGZyb20gdGhlIGxpc3QsIGNvbXBvbmVudCBnZXRzIGRlc3Ryb3llZFxuICovXG5mdW5jdGlvbiBJdGVtRmFjZXQkcmVtb3ZlSXRlbSgpIHtcbiAgICAvLyB0aGlzLmxpc3QgYW5kIHRoaXMuaW5kZXggYXJlIHNldCBieSB0aGUgbGlzdCB3aGVuIHRoZSBpdGVtIGlzIGFkZGVkXG4gICAgdGhpcy5saXN0LnJlbW92ZUl0ZW0odGhpcy5pbmRleCk7XG59XG5cblxuLyoqXG4gKiBJdGVtRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZW1vdmVzIGNvbXBvbmVudCBmcm9tIHRoZSBsaXN0LCBjb21wb25lbnQgaXMgTk9UIGRlc3Ryb3llZFxuICovXG5mdW5jdGlvbiBJdGVtRmFjZXQkZXh0cmFjdEl0ZW0oKSB7XG4gICAgdGhpcy5saXN0LmV4dHJhY3RJdGVtKHRoaXMuaW5kZXgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50RmFjZXQgPSByZXF1aXJlKCcuLi9jX2ZhY2V0JylcbiAgICAsIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgbWlsb01haWwgPSByZXF1aXJlKCcuLi8uLi9zZXJ2aWNlcy9tYWlsJylcbiAgICAsIG1pbG9CaW5kZXIgPSByZXF1aXJlKCcuLi8uLi9iaW5kZXInKVxuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXJcbiAgICAsIGRvVCA9IG1pbG9Db3JlLnV0aWwuZG9UXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2hcbiAgICAsIGRvbVV0aWxzID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kb20nKVxuICAgICwgY29tcG9uZW50TmFtZSA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvY29tcG9uZW50X25hbWUnKVxuICAgICwgbWlsb0NvbmZpZyA9IHJlcXVpcmUoJy4uLy4uL2NvbmZpZycpO1xuXG5cbnZhciBMSVNUX1NBTVBMRV9DU1NfQ0xBU1MgPSAnbWwtbGlzdC1pdGVtLXNhbXBsZSc7XG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzLmdldCgnTGlzdCcpYFxuICogRmFjZXQgZW5hYmxpbmcgbGlzdCBmdW5jdGlvbmFsaXR5XG4gKi9cbnZhciBMaXN0ID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ0xpc3QnKTtcblxuXy5leHRlbmRQcm90byhMaXN0LCB7XG4gICAgaW5pdDogTGlzdCRpbml0LFxuICAgIHN0YXJ0OiBMaXN0JHN0YXJ0LFxuICAgIGRlc3Ryb3k6IExpc3QkZGVzdHJveSxcblxuICAgIHJlcXVpcmU6IFsnQ29udGFpbmVyJywgJ0RvbScsICdEYXRhJ10sXG4gICAgX2l0ZW1QcmV2aW91c0NvbXBvbmVudDogX2l0ZW1QcmV2aW91c0NvbXBvbmVudCxcblxuICAgIGl0ZW06IExpc3QkaXRlbSxcbiAgICBjb3VudDogTGlzdCRjb3VudCxcbiAgICBjb250YWluczogTGlzdCRjb250YWlucyxcbiAgICBhZGRJdGVtOiBMaXN0JGFkZEl0ZW0sXG4gICAgYWRkSXRlbXM6IExpc3QkYWRkSXRlbXMsXG4gICAgcmVwbGFjZUl0ZW06IExpc3QkcmVwbGFjZUl0ZW0sXG4gICAgcmVtb3ZlSXRlbTogTGlzdCRyZW1vdmVJdGVtLFxuICAgIGV4dHJhY3RJdGVtOiBMaXN0JGV4dHJhY3RJdGVtLFxuICAgIGVhY2g6IExpc3QkZWFjaCxcbiAgICBfc2V0SXRlbTogTGlzdCRfc2V0SXRlbSxcbiAgICBfcmVtb3ZlSXRlbTogTGlzdCRfcmVtb3ZlSXRlbSxcbiAgICBfYWRkSXRlbTogTGlzdCRfYWRkSXRlbSxcbiAgICBfYWRkSXRlbXM6IExpc3QkX2FkZEl0ZW1zLFxuICAgIF9jcmVhdGVDYWNoZVRlbXBsYXRlOiBMaXN0JF9jcmVhdGVDYWNoZVRlbXBsYXRlLFxuICAgIF91cGRhdGVEYXRhUGF0aHM6IExpc3QkX3VwZGF0ZURhdGFQYXRoc1xufSk7XG5cbmZhY2V0c1JlZ2lzdHJ5LmFkZChMaXN0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBMaXN0O1xuXG5cbi8qKlxuICogRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXplZCBMaXN0IGZhY2V0IGluc3RhbmNlIGFuZCBzZXRzIHVwIGl0ZW0gcHJvcGVydGllcy5cbiAqL1xuZnVuY3Rpb24gTGlzdCRpbml0KCkge1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgX2xpc3RJdGVtczogW10sXG4gICAgICAgIF9saXN0SXRlbXNIYXNoOiB7fVxuICAgIH0pO1xuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgJ2l0ZW1TYW1wbGUnLCBudWxsLCBfLldSSVQpO1xufVxuXG5cbi8qKlxuICogRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTdGFydHMgdGhlIExpc3QgZmFjZXQgaW5zdGFuY2UsIGZpbmRzIGNoaWxkIHdpdGggSXRlbSBmYWNldC5cbiAqL1xuZnVuY3Rpb24gTGlzdCRzdGFydCgpIHtcbiAgICAvLyBGaXJlZCBieSBfX2JpbmRlcl9fIHdoZW4gYWxsIGNoaWxkcmVuIG9mIGNvbXBvbmVudCBhcmUgYm91bmRcbiAgICB0aGlzLm93bmVyLm9uKCdjaGlsZHJlbmJvdW5kJywgb25DaGlsZHJlbkJvdW5kKTtcbn1cblxuXG5mdW5jdGlvbiBvbkNoaWxkcmVuQm91bmQoKSB7XG4gICAgLy8gZ2V0IGl0ZW1zIGFscmVhZHkgaW4gdGhlIGxpc3RcbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmRvbS5jaGlsZHJlbigpXG4gICAgICAgICwgaXRlbXMgPSB0aGlzLmxpc3QuX2xpc3RJdGVtc1xuICAgICAgICAsIGl0ZW1zSGFzaCA9IHRoaXMubGlzdC5fbGlzdEl0ZW1zSGFzaDtcblxuICAgIGNoaWxkcmVuICYmIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oY2hpbGRFbCkge1xuICAgICAgICB2YXIgY29tcCA9IENvbXBvbmVudC5nZXRDb21wb25lbnQoY2hpbGRFbCk7XG4gICAgICAgIGlmIChjb21wICYmIGNvbXAuaXRlbSkge1xuICAgICAgICAgICAgaXRlbXMucHVzaChjb21wKTtcbiAgICAgICAgICAgIGl0ZW1zSGFzaFtjb21wLm5hbWVdID0gY29tcDtcbiAgICAgICAgICAgIGNvbXAuaXRlbS5saXN0ID0gdGhpcy5saXN0O1xuICAgICAgICB9XG4gICAgfSwgdGhpcyk7XG5cbiAgICBpZiAoaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBmb3VuZEl0ZW0gPSBpdGVtc1swXTtcbiAgICAgICAgaXRlbXMuc3BsaWNlKDAsIDEpO1xuICAgICAgICBkZWxldGUgaXRlbXNIYXNoW2ZvdW5kSXRlbS5uYW1lXTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbihpdGVtLCBpbmRleCkge1xuICAgICAgICAgICAgaXRlbS5pdGVtLnNldEluZGV4KGluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIC8vIENvbXBvbmVudCBtdXN0IGhhdmUgb25lIGNoaWxkIHdpdGggYW4gSXRlbSBmYWNldCBcbiAgICBpZiAoISBmb3VuZEl0ZW0pIHRocm93IG5ldyBFcnJvcignTm8gY2hpbGQgY29tcG9uZW50IGhhcyBJdGVtIGZhY2V0Jyk7XG5cbiAgICB0aGlzLmxpc3QuaXRlbVNhbXBsZSA9IGZvdW5kSXRlbTtcblxuICAgIC8vIEFmdGVyIGtlZXBpbmcgYSByZWZlcmVuY2UgdG8gdGhlIGl0ZW0gc2FtcGxlLCBpdCBtdXN0IGJlIGhpZGRlbiBhbmQgcmVtb3ZlZCBmcm9tIHNjb3BlXG4gICAgZm91bmRJdGVtLmRvbS5oaWRlKCk7XG4gICAgZm91bmRJdGVtLnJlbW92ZSh0cnVlKTtcbiAgICBmb3VuZEl0ZW0uZG9tLnJlbW92ZUNzc0NsYXNzZXMoTElTVF9TQU1QTEVfQ1NTX0NMQVNTKTtcblxuICAgIC8vIHJlbW92ZSByZWZlcmVuY2VzIHRvIGNvbXBvbmVudHMgZnJvbSBzYW1wbGUgaXRlbVxuICAgIGZvdW5kSXRlbS53YWxrU2NvcGVUcmVlKGZ1bmN0aW9uKGNvbXApIHtcbiAgICAgICAgZGVsZXRlIGNvbXAuZWxbbWlsb0NvbmZpZy5jb21wb25lbnRSZWZdO1xuICAgIH0pO1xuXG4gICAgdGhpcy5saXN0Ll9jcmVhdGVDYWNoZVRlbXBsYXRlKCk7XG59XG5cblxuZnVuY3Rpb24gTGlzdCRfY3JlYXRlQ2FjaGVUZW1wbGF0ZSgpIHtcbiAgICBpZiAoIXRoaXMuaXRlbVNhbXBsZSkgcmV0dXJuIGZhbHNlO1xuICAgIFxuICAgIHZhciBpdGVtU2FtcGxlID0gdGhpcy5pdGVtU2FtcGxlO1xuXG4gICAgLy8gY3JlYXRlIGl0ZW0gdGVtcGxhdGUgdG8gaW5zZXJ0IG1hbnkgaXRlbXMgYXQgb25jZVxuICAgIHZhciBpdGVtRWxDb3B5ID0gaXRlbVNhbXBsZS5lbC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgdmFyIGF0dHIgPSBpdGVtU2FtcGxlLmNvbXBvbmVudEluZm8uYXR0cjtcbiAgICB2YXIgYXR0ckNvcHkgPSBfLmNsb25lKGF0dHIpO1xuICAgIGF0dHIuY29tcE5hbWUgPSAne3s9IGl0LmNvbXBvbmVudE5hbWUoKSB9fSc7XG4gICAgYXR0ci5lbCA9IGl0ZW1FbENvcHk7XG4gICAgYXR0ci5kZWNvcmF0ZSgpO1xuXG4gICAgdmFyIGl0ZW1zVGVtcGxhdGVTdHIgPSBcbiAgICAgICAgICAne3sgdmFyIGkgPSBpdC5jb3VudDsgd2hpbGUoaS0tKSB7IH19J1xuICAgICAgICArIGl0ZW1FbENvcHkub3V0ZXJIVE1MXG4gICAgICAgICsgJ3t7IH0gfX0nO1xuXG4gICAgdGhpcy5pdGVtc1RlbXBsYXRlID0gZG9ULmNvbXBpbGUoaXRlbXNUZW1wbGF0ZVN0cik7XG59XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHJpZXZlIGEgcGFydGljdWxhciBjaGlsZCBpdGVtIGJ5IGluZGV4XG4gKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgY2hpbGQgaXRlbSB0byBnZXQuXG4gKiBAcmV0dXJuIHtDb21wb25lbnR9IFRoZSBjb21wb25lbnQgZm91bmRcbiAqL1xuZnVuY3Rpb24gTGlzdCRpdGVtKGluZGV4KSB7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3RJdGVtc1tpbmRleF07XG59XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEdldHMgdGhlIHRvdGFsIG51bWJlciBvZiBjaGlsZCBpdGVtc1xuICogQHJldHVybiB7SW50ZWdlcn0gVGhlIHRvdGFsXG4gKi9cbmZ1bmN0aW9uIExpc3QkY291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3RJdGVtcy5sZW5ndGg7XG59XG5cblxuZnVuY3Rpb24gTGlzdCRfc2V0SXRlbShpbmRleCwgY29tcG9uZW50KSB7XG4gICAgdGhpcy5fbGlzdEl0ZW1zLnNwbGljZShpbmRleCwgMCwgY29tcG9uZW50KTtcbiAgICB0aGlzLl9saXN0SXRlbXNIYXNoW2NvbXBvbmVudC5uYW1lXSA9IGNvbXBvbmVudDtcbiAgICBjb21wb25lbnQuaXRlbS5saXN0ID0gdGhpcztcbiAgICBjb21wb25lbnQuaXRlbS5zZXRJbmRleCgraW5kZXgpO1xufVxuXG5cbi8qKlxuICogRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHRydWUgaWYgYSBwYXJ0aWN1bGFyIGNoaWxkIGl0ZW0gZXhpc3RzIGluIHRoZSBsaXN0XG4gKiBAcGFyYW0ge0NvbXBvbmVudH0gY29tcG9uZW50IFRoZSBjb21wb25lbnQgdG8gbG9vayBmb3IuXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBMaXN0JGNvbnRhaW5zKGNvbXBvbmVudCkge1xuICAgIHJldHVybiB0aGlzLl9saXN0SXRlbXNIYXNoW2NvbXBvbmVudC5uYW1lXSA9PSBjb21wb25lbnQ7XG59XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEFkZHMgYSBuZXcgY2hpbGQgY29tcG9uZW50IGF0IGEgcGFydGljdWxhciBpbmRleCBhbmQgcmV0dXJucyB0aGUgbmV3IGNvbXBvbmVudC5cbiAqIFRoaXMgbWV0aG9kIHVzZXMgZGF0YSBmYWNldCwgc28gbm90aWZpY2F0aW9uIHdpbGwgYmUgZW1pdHRlZCBvbiBkYXRhIGZhY2V0LlxuICogQHBhcmFtIHtJbnRlZ2VyfSBpbmRleCBUaGUgaW5kZXggdG8gYWRkIGF0XG4gKiBAcmV0dXJuIHtDb21wb25lbnR9IFRoZSBuZXdseSBjcmVhdGVkIGNvbXBvbmVudFxuICovXG5mdW5jdGlvbiBMaXN0JGFkZEl0ZW0oaW5kZXgsIGl0ZW1EYXRhKSB7XG4gICAgaW5kZXggPSBpbmRleCB8fCB0aGlzLmNvdW50KCk7XG4gICAgdGhpcy5vd25lci5kYXRhLnNwbGljZShpbmRleCwgMCwgaXRlbURhdGEgfHwge30pO1xuICAgIHJldHVybiB0aGlzLml0ZW0oaW5kZXgpO1xufVxuXG5cbi8qKlxuICogRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBBZGRzIGEgbmV3IGNoaWxkIGNvbXBvbmVudCBhdCBhIHBhcnRpY3VsYXIgaW5kZXggYW5kIHJldHVybnMgdGhlIG5ldyBjb21wb25lbnRcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggVGhlIGluZGV4IHRvIGFkZCBhdFxuICogQHJldHVybiB7Q29tcG9uZW50fSBUaGUgbmV3bHkgY3JlYXRlZCBjb21wb25lbnRcbiAqL1xuZnVuY3Rpb24gTGlzdCRfYWRkSXRlbShpbmRleCkge1xuICAgIGluZGV4ID0gaW5kZXggfHwgdGhpcy5jb3VudCgpO1xuICAgIGlmICh0aGlzLml0ZW0oaW5kZXgpKVxuICAgICAgICB0aHJvdyBFcnJvcignYXR0ZW1wdCB0byBjcmVhdGUgaXRlbSB3aXRoIElEIG9mIGV4aXN0aW5nIGl0ZW0nKTtcblxuICAgIC8vIENvcHkgY29tcG9uZW50XG4gICAgdmFyIGNvbXBvbmVudCA9IENvbXBvbmVudC5jb3B5KHRoaXMuaXRlbVNhbXBsZSwgdHJ1ZSk7XG4gICAgdmFyIHByZXZDb21wb25lbnQgPSB0aGlzLl9pdGVtUHJldmlvdXNDb21wb25lbnQoaW5kZXgpO1xuXG4gICAgaWYgKCFwcmV2Q29tcG9uZW50LmVsLnBhcmVudE5vZGUpXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignbGlzdCBpdGVtIHNhbXBsZSB3YXMgcmVtb3ZlZCBmcm9tIERPTSwgcHJvYmFibHkgY2F1c2VkIGJ5IHdyb25nIGRhdGEuIFJlc2V0IGxpc3QgZGF0YSB3aXRoIGFycmF5Jyk7XG5cbiAgICAvLyBBZGQgaXQgdG8gdGhlIERPTVxuICAgIHByZXZDb21wb25lbnQuZG9tLmluc2VydEFmdGVyKGNvbXBvbmVudC5lbCk7XG5cbiAgICAvLyBBZGQgdG8gbGlzdCBpdGVtc1xuICAgIHRoaXMuX3NldEl0ZW0oaW5kZXgsIGNvbXBvbmVudCk7XG5cbiAgICAvLyBTaG93IHRoZSBsaXN0IGl0ZW0gY29tcG9uZW50XG4gICAgY29tcG9uZW50LmVsLnN0eWxlLmRpc3BsYXkgPSAnJztcblxuICAgIF91cGRhdGVJdGVtc0luZGV4ZXMuY2FsbCh0aGlzLCBpbmRleCArIDEpO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbn1cblxuXG5mdW5jdGlvbiBfdXBkYXRlSXRlbXNJbmRleGVzKGZyb21JbmRleCwgdG9JbmRleCkge1xuICAgIGZyb21JbmRleCA9IGZyb21JbmRleCB8fCAwO1xuICAgIHRvSW5kZXggPSB0b0luZGV4IHx8IHRoaXMuY291bnQoKTtcbiAgICBmb3IgKHZhciBpID0gZnJvbUluZGV4OyBpIDwgdG9JbmRleDsgaSsrKSB7XG4gICAgICAgIHZhciBjb21wb25lbnQgPSB0aGlzLl9saXN0SXRlbXNbaV07XG4gICAgICAgIGlmIChjb21wb25lbnQpXG4gICAgICAgICAgICBjb21wb25lbnQuaXRlbS5zZXRJbmRleChpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0xpc3Q6IG5vIGl0ZW0gYXQgcG9zaXRpb24nLCBpKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gTGlzdCRhZGRJdGVtcyhjb3VudCwgaW5kZXgpIHsgLy8gLC4uLiBpdGVtcyBkYXRhXG4gICAgdmFyIGl0ZW1zRGF0YSA9IF8uc2xpY2UoYXJndW1lbnRzLCAyKTtcbiAgICBpZiAoaXRlbXNEYXRhLmxlbmd0aCA8IGNvdW50KSBcbiAgICAgICAgaXRlbXNEYXRhLmNvbmNhdChfLnJlcGVhdChjb3VudCAtIGl0ZW1zRGF0YS5sZW5ndGgsIHt9KSk7XG4gICAgdmFyIHNwbGljZUFyZ3MgPSBbaW5kZXgsIDBdLmNvbmNhdChpdGVtc0RhdGEpO1xuICAgIHZhciBkYXRhRmFjZXQgPSB0aGlzLm93bmVyLmRhdGE7XG4gICAgZGF0YUZhY2V0LnNwbGljZS5hcHBseShkYXRhRmFjZXQsIHNwbGljZUFyZ3MpO1xufVxuXG5cbi8qKlxuICogTGlzdCBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEFkZHMgYSBnaXZlbiBudW1iZXIgb2YgaXRlbXMgdXNpbmcgdGVtcGxhdGUgcmVuZGVyaW5nIHJhdGhlciB0aGFuIGFkZGluZyBlbGVtZW50cyBvbmUgYnkgb25lXG4gKlxuICogQHBhcmFtIHtJbnRlZ2VyfSBjb3VudCBudW1iZXIgb2YgaXRlbXMgdG8gYWRkXG4gKiBAcGFyYW0ge1tJbnRlZ2VyXX0gaW5kZXggb3B0aW9uYWwgaW5kZXggb2YgaXRlbSBhZnRlciB3aGljaCB0byBhZGRcbiAqL1xuZnVuY3Rpb24gTGlzdCRfYWRkSXRlbXMoY291bnQsIGluZGV4KSB7XG4gICAgY2hlY2soY291bnQsIE1hdGNoLkludGVnZXIpO1xuICAgIGlmIChjb3VudCA8IDApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FuXFwndCBhZGQgbmVnYXRpdmUgbnVtYmVyIG9mIGl0ZW1zJyk7XG5cbiAgICBpZiAoY291bnQgPT0gMCkgcmV0dXJuO1xuXG4gICAgdmFyIGl0ZW1zSFRNTCA9IHRoaXMuaXRlbXNUZW1wbGF0ZSh7XG4gICAgICAgIGNvbXBvbmVudE5hbWU6IGNvbXBvbmVudE5hbWUsXG4gICAgICAgIGNvdW50OiBjb3VudFxuICAgIH0pO1xuXG4gICAgdmFyIHdyYXBFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHdyYXBFbC5pbm5lckhUTUwgPSBpdGVtc0hUTUw7XG5cbiAgICBtaWxvQmluZGVyKHdyYXBFbCwgdGhpcy5vd25lci5jb250YWluZXIuc2NvcGUpO1xuICAgIHZhciBjaGlsZHJlbiA9IGRvbVV0aWxzLmNoaWxkcmVuKHdyYXBFbCk7XG5cbiAgICBpZiAoY291bnQgIT0gY2hpbGRyZW4ubGVuZ3RoKVxuICAgICAgICBsb2dnZXIuZXJyb3IoJ251bWJlciBvZiBpdGVtcyBhZGRlZCBpcyBkaWZmZXJlbnQgZnJvbSByZXF1ZXN0ZWQnKTtcblxuICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGxpc3RMZW5ndGggPSB0aGlzLmNvdW50KCk7XG4gICAgICAgIHZhciBzcGxpY2VJbmRleCA9IGluZGV4IDwgMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdHlwZW9mIGluZGV4ID09ICd1bmRlZmluZWQnIHx8IGluZGV4ID4gbGlzdExlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGxpc3RMZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbmRleDtcblxuICAgICAgICB2YXIgcHJldkNvbXBvbmVudCA9IHNwbGljZUluZGV4ID09IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLml0ZW1TYW1wbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9saXN0SXRlbXNbc3BsaWNlSW5kZXggLSAxXTtcblxuICAgICAgICB2YXIgZnJhZyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICAgICAgLCBuZXdDb21wb25lbnRzID0gW107XG5cbiAgICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlbCwgaSkge1xuICAgICAgICAgICAgdmFyIGNvbXBvbmVudCA9IENvbXBvbmVudC5nZXRDb21wb25lbnQoZWwpO1xuICAgICAgICAgICAgaWYgKCEgY29tcG9uZW50KVxuICAgICAgICAgICAgICAgIHJldHVybiBsb2dnZXIuZXJyb3IoJ0xpc3Q6IGVsZW1lbnQgaW4gbmV3IGl0ZW1zIGlzIG5vdCBhIGNvbXBvbmVudCcpO1xuICAgICAgICAgICAgbmV3Q29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gICAgICAgICAgICB0aGlzLl9zZXRJdGVtKHNwbGljZUluZGV4KyssIGNvbXBvbmVudCk7XG4gICAgICAgICAgICBmcmFnLmFwcGVuZENoaWxkKGVsKTtcbiAgICAgICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgX3VwZGF0ZUl0ZW1zSW5kZXhlcy5jYWxsKHRoaXMsIHNwbGljZUluZGV4KTtcblxuICAgICAgICBpZiAoIXByZXZDb21wb25lbnQuZWwucGFyZW50Tm9kZSlcbiAgICAgICAgICAgIHJldHVybiBsb2dnZXIud2FybignbGlzdCBpdGVtIHNhbXBsZSB3YXMgcmVtb3ZlZCBmcm9tIERPTSwgcHJvYmFibHkgY2F1c2VkIGJ5IHdyb25nIGRhdGEuIFJlc2V0IGxpc3QgZGF0YSB3aXRoIGFycmF5Jyk7XG5cbiAgICAgICAgLy8gQWRkIGl0IHRvIHRoZSBET01cbiAgICAgICAgcHJldkNvbXBvbmVudC5kb20uaW5zZXJ0QWZ0ZXIoZnJhZyk7XG5cbiAgICAgICAgXy5kZWZlck1ldGhvZChuZXdDb21wb25lbnRzLCAnZm9yRWFjaCcsIGZ1bmN0aW9uKGNvbXApIHtcbiAgICAgICAgICAgIGNvbXAuYnJvYWRjYXN0KCdzdGF0ZXJlYWR5Jyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIExpc3QgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBAcGFyYW0ge0ludGVnZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZW1vdmVcbiAqIEByZXR1cm4ge0FycmF5W09iamVjdF19IFRoZSBzcGxpY2VkIGRhdGFcbiAqL1xuZnVuY3Rpb24gTGlzdCRyZW1vdmVJdGVtKGluZGV4KSB7XG4gICAgcmV0dXJuIHRoaXMub3duZXIuZGF0YS5zcGxpY2UoaW5kZXgsIDEpO1xufVxuXG5cbi8qKlxuICogTGlzdCBmYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIGV4dHJhY3RcbiAqIEByZXR1cm4ge0NvbXBvbmVudH0gVGhlIGV4dHJhY3RlZCBpdGVtXG4gKi9cbmZ1bmN0aW9uIExpc3QkZXh0cmFjdEl0ZW0oaW5kZXgpIHtcbiAgICB2YXIgaXRlbUNvbXAgPSB0aGlzLl9yZW1vdmVJdGVtKGluZGV4LCBmYWxzZSk7XG4gICAgdGhpcy5fdXBkYXRlRGF0YVBhdGhzKGluZGV4LCB0aGlzLmNvdW50KCkpO1xuICAgIHJldHVybiBpdGVtQ29tcDtcbn1cblxuXG4vKipcbiAqIExpc3QgZmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZW1vdmVzIGl0ZW0sIHJldHVybnMgdGhlIHJlbW92ZWQgaXRlbSB0aGF0IGlzIGRlc3Ryb3llZCBieSBkZWZhdWx0LlxuICogXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGluZGV4IGl0ZW0gaW5kZXhcbiAqIEBwYXJhbSAge0Jvb2xlYW59IGRvRGVzdHJveUl0ZW0gb3B0aW9uYWwgZmFsc2UgdG8gcHJldmVudCBpdGVtIGRlc3RydWN0aW9uLCB0cnVlIGJ5IGRlZmF1bHRcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xuZnVuY3Rpb24gTGlzdCRfcmVtb3ZlSXRlbShpbmRleCwgZG9EZXN0cm95SXRlbSkge1xuICAgIHZhciBjb21wID0gdGhpcy5pdGVtKGluZGV4KTtcblxuICAgIGlmICghIGNvbXApXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignYXR0ZW1wdCB0byByZW1vdmUgbGlzdCBpdGVtIHdpdGggaWQgdGhhdCBkb2VzIG5vdCBleGlzdCcpO1xuXG4gICAgdGhpcy5fbGlzdEl0ZW1zW2luZGV4XSA9IHVuZGVmaW5lZDtcbiAgICBkZWxldGUgdGhpcy5fbGlzdEl0ZW1zSGFzaFtjb21wLm5hbWVdO1xuICAgIGlmIChkb0Rlc3Ryb3lJdGVtICE9PSBmYWxzZSkgY29tcC5kZXN0cm95KCk7XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbXAucmVtb3ZlKCk7XG4gICAgICAgIGNvbXAuZG9tLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIHRoaXMuX2xpc3RJdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIF91cGRhdGVJdGVtc0luZGV4ZXMuY2FsbCh0aGlzLCBpbmRleCk7XG5cbiAgICByZXR1cm4gY29tcDtcbn1cblxuXG5mdW5jdGlvbiBMaXN0JHJlcGxhY2VJdGVtKGluZGV4LCBuZXdJdGVtKXtcbiAgICB2YXIgb2xkSXRlbSA9IHRoaXMuaXRlbShpbmRleCk7XG4gICAgb2xkSXRlbS5kb20uaW5zZXJ0QWZ0ZXIobmV3SXRlbS5lbCk7XG4gICAgdGhpcy5fcmVtb3ZlSXRlbShpbmRleCk7XG4gICAgdGhpcy5fc2V0SXRlbShpbmRleCwgbmV3SXRlbSk7XG59XG5cblxuLy8gUmV0dXJucyB0aGUgcHJldmlvdXMgaXRlbSBjb21wb25lbnQgZ2l2ZW4gYW4gaW5kZXhcbmZ1bmN0aW9uIF9pdGVtUHJldmlvdXNDb21wb25lbnQoaW5kZXgpIHtcbiAgICB3aGlsZSAoaW5kZXggPj0gMCAmJiAhIHRoaXMuX2xpc3RJdGVtc1tpbmRleF0pXG4gICAgICAgIGluZGV4LS07XG5cbiAgICByZXR1cm4gaW5kZXggPj0gMFxuICAgICAgICAgICAgICAgID8gdGhpcy5fbGlzdEl0ZW1zW2luZGV4XVxuICAgICAgICAgICAgICAgIDogdGhpcy5pdGVtU2FtcGxlO1xufVxuXG5cbi8vIHRvSW5kZXggaXMgbm90IGluY2x1ZGVkXG4vLyBubyByYW5nZSBjaGVja2luZyBpcyBtYWRlXG5mdW5jdGlvbiBMaXN0JF91cGRhdGVEYXRhUGF0aHMoZnJvbUluZGV4LCB0b0luZGV4KSB7XG4gICAgZm9yICh2YXIgaSA9IGZyb21JbmRleDsgaSA8IHRvSW5kZXg7IGkrKykge1xuICAgICAgICB2YXIgaXRlbSA9IHRoaXMuaXRlbShpKTtcbiAgICAgICAgaWYgKGl0ZW0pXG4gICAgICAgICAgICBpdGVtLmRhdGEuX3BhdGggPSAnWycgKyBpICsgJ10nO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsb2dnZXIud2FybignRGF0YTogbm8gaXRlbSBmb3IgaW5kZXgnLCBqKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIFNpbWlsYXIgdG8gZm9yRWFjaCBtZXRob2Qgb2YgQXJyYXksIGl0ZXJhdGVzIGVhY2ggb2YgdGhlIGNoaWxkIGl0ZW1zLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQW4gaXRlcmF0b3IgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGVhY2ggY2hpbGQgaXRlbS5cbiAqIEBwYXJhbSB7W3R5cGVdfSAgIHRoaXNBcmcgIENvbnRleHQgdG8gc2V0IGB0aGlzYC5cbiAqL1xuZnVuY3Rpb24gTGlzdCRlYWNoKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgdGhpcy5fbGlzdEl0ZW1zLmZvckVhY2goZnVuY3Rpb24oaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgaWYgKGl0ZW0pIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIHBhc3NlcyBpdGVtLCBpbmRleCB0byBjYWxsYmFja1xuICAgICAgICBlbHNlIGxvZ2dlci53YXJuKCdMaXN0JGVhY2g6IGl0ZW0nLCBpbmRleCwgJ2lzIHVuZGVmaW5lZCcpO1xuICAgIH0sIHRoaXNBcmcgfHwgdGhpcyk7XG59XG5cblxuLyoqXG4gKiBGYWNldCBpbnN0YW5jZSBtZXRob2RcbiAqIERlc3Ryb3lzIHRoZSBsaXN0XG4gKi9cbmZ1bmN0aW9uIExpc3QkZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5pdGVtU2FtcGxlKSB0aGlzLml0ZW1TYW1wbGUuZGVzdHJveSh0cnVlKTtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50RmFjZXQgPSByZXF1aXJlKCcuLi9jX2ZhY2V0JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jZl9yZWdpc3RyeScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNb2RlbCA9IG1pbG9Db3JlLk1vZGVsXG4gICAgLCBNaXhpbiA9IG1pbG9Db3JlLmNsYXNzZXMuTWl4aW5cbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxuXG4vLyBnZW5lcmljIGRyYWcgaGFuZGxlciwgc2hvdWxkIGJlIG92ZXJyaWRkZW5cbnZhciBNb2RlbEZhY2V0ID0gXy5jcmVhdGVTdWJjbGFzcyhDb21wb25lbnRGYWNldCwgJ01vZGVsJyk7XG5cbl8uZXh0ZW5kUHJvdG8oTW9kZWxGYWNldCwge1xuICAgIGluaXQ6IE1vZGVsRmFjZXQkaW5pdCxcbiAgICBnZXRTdGF0ZTogTW9kZWxGYWNldCRnZXRTdGF0ZSxcbiAgICBzZXRTdGF0ZTogTW9kZWxGYWNldCRzZXRTdGF0ZSxcbiAgICBfY3JlYXRlTWVzc2VuZ2VyOiBNb2RlbEZhY2V0JF9jcmVhdGVNZXNzZW5nZXIsXG4gICAgZGVzdHJveTogTW9kZWxGYWNldCRkZXN0cm95XG59KTtcblxuZmFjZXRzUmVnaXN0cnkuYWRkKE1vZGVsRmFjZXQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1vZGVsRmFjZXQ7XG5cblxuLyoqXG4gKiBFeHBvc2UgTW9kZWwgY2xhc3MgbWV0aG9kcyBvbiBNb2RlbEZhY2V0XG4gKi9cbk1vZGVsLnVzZVdpdGgoTW9kZWxGYWNldCwgJ20nKTtcblxuXG5mdW5jdGlvbiBNb2RlbEZhY2V0JGluaXQoKSB7XG4gICAgdGhpcy5tID0gbmV3IE1vZGVsKHRoaXMuY29uZmlnLmRhdGEsIHRoaXMpO1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgLy8gdGhpcy5tLnByb3h5TWV0aG9kcyh0aGlzKTsgLy8gQ3JlYXRlcyBtb2RlbCdzIG1ldGhvZHMgZGlyZWN0bHkgb24gZmFjZXRcbn1cblxuXG4vKipcbiAqIE1vZGVsRmFjZXQgaW5zdGFuY2UgbWV0aG9kXG4gKiBDYWxsZWQgYnkgYENvbXBvbmVudC5wcm90b3R5cGUuZ2V0U3RhdGVgIHRvIGdldCBmYWNldCdzIHN0YXRlXG4gKiBTaW1wbHkgcmV0dXJucyBtb2RlbCBkYXRhXG4gKlxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBNb2RlbEZhY2V0JGdldFN0YXRlKCkge1xuICAgIHZhciBtb2RlbFZhbHVlID0gdGhpcy5tLmdldCgpO1xuICAgIGlmICh0eXBlb2YgbW9kZWxWYWx1ZSA9PSAnb2JqZWN0JylcbiAgICAgICAgbW9kZWxWYWx1ZSA9IF8uZGVlcENsb25lKG1vZGVsVmFsdWUpO1xuICAgIHJldHVybiB7IHN0YXRlOiBtb2RlbFZhbHVlIH07XG59XG5cblxuLyoqXG4gKiBNb2RlbEZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogQ2FsbGVkIGJ5IGBDb21wb25lbnQucHJvdG90eXBlLnNldFN0YXRlYCB0byBzZXQgZmFjZXQncyBzdGF0ZVxuICogU2ltcGx5IHNldHMgbW9kZWwgZGF0YVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZSBkYXRhIHRvIHNldCBvbiBmYWNldCdzIG1vZGVsXG4gKi9cbmZ1bmN0aW9uIE1vZGVsRmFjZXQkc2V0U3RhdGUoc3RhdGUpIHtcbiAgICByZXR1cm4gdGhpcy5tLnNldChzdGF0ZS5zdGF0ZSk7XG59XG5cblxuZnVuY3Rpb24gTW9kZWxGYWNldCRfY3JlYXRlTWVzc2VuZ2VyKCkgeyAvLyBDYWxsZWQgYnkgaW5oZXJpdGVkIGluaXRcbiAgICB0aGlzLl9tZXNzZW5nZXIgPSB0aGlzLm0uX21lc3Nlbmdlcjtcbn1cblxuXG5mdW5jdGlvbiBNb2RlbEZhY2V0JGRlc3Ryb3koKSB7XG4gICAgdGhpcy5tLmRlc3Ryb3koKTtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50RmFjZXQgPSByZXF1aXJlKCcuLi9jX2ZhY2V0JylcbiAgICAsIGZhY2V0c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9jZl9yZWdpc3RyeScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNb2RlbCA9IG1pbG9Db3JlLk1vZGVsXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxuLy8gZ2VuZXJpYyBkcmFnIGhhbmRsZXIsIHNob3VsZCBiZSBvdmVycmlkZGVuXG52YXIgT3B0aW9ucyA9IF8uY3JlYXRlU3ViY2xhc3MoQ29tcG9uZW50RmFjZXQsICdPcHRpb25zJyk7XG5cbl8uZXh0ZW5kUHJvdG8oT3B0aW9ucywge1xuICAgIGluaXQ6IE9wdGlvbnMkaW5pdCxcbiAgICBkZXN0cm95OiBPcHRpb25zJGRlc3Ryb3ksXG4gICAgX2NyZWF0ZU1lc3NlbmdlcjogT3B0aW9ucyRfY3JlYXRlTWVzc2VuZ2VyXG59KTtcblxuZmFjZXRzUmVnaXN0cnkuYWRkKE9wdGlvbnMpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9wdGlvbnM7XG5cblxuZnVuY3Rpb24gT3B0aW9ucyRpbml0KCkge1xuICAgIHRoaXMubSA9IG5ldyBNb2RlbCh0aGlzLmNvbmZpZy5vcHRpb25zLCB0aGlzKTtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMubS5wcm94eU1ldGhvZHModGhpcyk7IC8vIENyZWF0ZXMgbW9kZWwncyBtZXRob2RzIGRpcmVjdGx5IG9uIGZhY2V0XG59XG5cblxuZnVuY3Rpb24gT3B0aW9ucyRfY3JlYXRlTWVzc2VuZ2VyKCkgeyAvLyBDYWxsZWQgYnkgaW5oZXJpdGVkIGluaXRcbiAgICB0aGlzLl9tZXNzZW5nZXIgPSB0aGlzLm0uX21lc3Nlbmdlcjtcbn1cblxuXG5mdW5jdGlvbiBPcHRpb25zJGRlc3Ryb3koKSB7XG4gICAgdGhpcy5tLmRlc3Ryb3koKTtcbiAgICBDb21wb25lbnRGYWNldC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyA8YSBuYW1lPVwiY29tcG9uZW50cy1mYWNldHMtdGVtcGxhdGVcIj48L2E+XG4vLyAjIyN0ZW1wbGF0ZSBmYWNldFxuXG4vLyBzaW1wbGlmaWVzIHJlbmRlcmluZyBvZiBjb21wb25lbnQgZWxlbWVudCBmcm9tIHRlbXBsYXRlLlxuLy8gICBBbnkgdGVtcGxhdGluZyBlbmdpbmcgY2FuIGJlIHVzZWQgdGhhdCBzdXBwb3J0cyB0ZW1wbGF0ZSBjb21waWxhdGlvblxuLy8gICAob3IgeW91IGNhbiBtb2NrIHRoaXMgY29tcGlsYXRpb24gZWFzaWx5IGJ5IGNyZWF0aW5nIGNsb3N1cmUgc3RvcmluZ1xuLy8gICB0ZW1wbGF0ZSBzdHJpbmcgaW4gY2FzZSB5b3VyIGVuZ2luZSBkb2Vzbid0IHN1cHBvcnQgY29tcGlsYXRpb24pLlxuLy8gICBCeSBkZWZhdWx0IG1pbG8gdXNlcyBbZG9UXSgpLCB0aGUgbW9zdCB2ZXJzYXRpbGUsIGNvbnNjaXNlIGFuZCBhdCB0aGVcbi8vICAgc2FtZSB0aW1lIHRoZSBmYXN0ZXN0IHRlbXBsYXRpbmcgZW5naW5lLlxuLy8gICBJZiB5b3UgdXNlIG1pbG8gaW4gYnJvd3NlciwgaXQgaXMgdGhlIHBhcnQgb2YgbWlsbyBidW5kbGUgYW5kIGF2YWlsYWJsZVxuLy8gICBhcyBnbG9iYWwgdmFyaWFibGUgYGRvVGAuXG5cbnZhciBDb21wb25lbnRGYWNldCA9IHJlcXVpcmUoJy4uL2NfZmFjZXQnKVxuICAgICwgZmFjZXRzUmVnaXN0cnkgPSByZXF1aXJlKCcuL2NmX3JlZ2lzdHJ5JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaFxuICAgICwgYmluZGVyID0gcmVxdWlyZSgnLi4vLi4vYmluZGVyJyk7XG5cblxuLy8gZGF0YSBtb2RlbCBjb25uZWN0aW9uIGZhY2V0XG52YXIgVGVtcGxhdGUgPSBfLmNyZWF0ZVN1YmNsYXNzKENvbXBvbmVudEZhY2V0LCAnVGVtcGxhdGUnKTtcblxuXy5leHRlbmRQcm90byhUZW1wbGF0ZSwge1xuICAgIGluaXQ6IFRlbXBsYXRlJGluaXQsXG4gICAgc3RhcnQ6IFRlbXBsYXRlJHN0YXJ0LFxuICAgIHNldDogVGVtcGxhdGUkc2V0LFxuICAgIGdldENvbXBpbGVkOiBUZW1wbGF0ZSRnZXRDb21waWxlZCxcbiAgICByZW5kZXI6IFRlbXBsYXRlJHJlbmRlcixcbiAgICBiaW5kZXI6IFRlbXBsYXRlJGJpbmRlclxuXG4gICAgLy8gX3JlYXR0YWNoOiBfcmVhdHRhY2hFdmVudHNPbkVsZW1lbnRDaGFuZ2Vcbn0pO1xuXG5mYWNldHNSZWdpc3RyeS5hZGQoVGVtcGxhdGUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRlbXBsYXRlO1xuXG5cbmZ1bmN0aW9uIFRlbXBsYXRlJGluaXQoKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIC8vIHRlbXBsYXRlcyBhcmUgaW50ZXJwb2xhdGVkIHdpdGggZGVmYXVsdCAoZG9UKSBvciBjb25maWd1cmVkIGVuZ2luZSAodGhpcy5jb25maWcuY29tcGlsZSlcbiAgICAvLyB1bmxlc3MgdGhpcy5jb25maWcuaW50ZXJwb2xhdGUgaXMgZmFsc2VcbiAgICB2YXIgY29tcGlsZSA9IHRoaXMuY29uZmlnLmludGVycG9sYXRlID09PSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuY29uZmlnLmNvbXBpbGUgfHwgbWlsby5jb25maWcudGVtcGxhdGUuY29tcGlsZTtcblxuICAgIHRoaXMuc2V0KHRoaXMuY29uZmlnLnRlbXBsYXRlIHx8ICcnLCBjb21waWxlLCB0aGlzLmNvbmZpZy5jb21waWxlT3B0aW9ucyk7XG59XG5cblxuZnVuY3Rpb24gVGVtcGxhdGUkc3RhcnQoKSB7XG4gICAgQ29tcG9uZW50RmFjZXQucHJvdG90eXBlLnN0YXJ0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHRoaXMuY29uZmlnLmF1dG9SZW5kZXIpIHtcbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmF1dG9CaW5kZXIpXG4gICAgICAgICAgICB0aGlzLmJpbmRlcigpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBUZW1wbGF0ZSRnZXRDb21waWxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGU7XG59XG5cblxuZnVuY3Rpb24gVGVtcGxhdGUkc2V0KHRlbXBsYXRlU3RyLCBjb21waWxlLCBjb21waWxlT3B0aW9ucykge1xuICAgIGNoZWNrKHRlbXBsYXRlU3RyLCBNYXRjaC5PbmVPZihTdHJpbmcsIEZ1bmN0aW9uKSk7XG4gICAgY2hlY2soY29tcGlsZSwgTWF0Y2guT3B0aW9uYWwoRnVuY3Rpb24pKTtcblxuICAgIGlmICh0eXBlb2YgdGVtcGxhdGVTdHIgPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgdGhpcy5fdGVtcGxhdGUgPSB0ZW1wbGF0ZVN0cjtcbiAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5fdGVtcGxhdGVTdHIgPSB0ZW1wbGF0ZVN0cjtcbiAgICAgICAgaWYgKGNvbXBpbGUpXG4gICAgICAgICAgICB0aGlzLl9jb21waWxlID0gY29tcGlsZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgY29tcGlsZSA9IHRoaXMuX2NvbXBpbGU7XG5cbiAgICAgICAgaWYgKGNvbXBpbGUpXG4gICAgICAgICAgICB0aGlzLl90ZW1wbGF0ZSA9IGNvbXBpbGUodGVtcGxhdGVTdHIsIGNvbXBpbGVPcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG5mdW5jdGlvbiBUZW1wbGF0ZSRyZW5kZXIoZGF0YSkgeyAvLyB3ZSBuZWVkIGRhdGEgb25seSBpZiB1c2UgdGVtcGxhdGluZyBlbmdpbmVcbiAgICB0aGlzLm93bmVyLmVsLmlubmVySFRNTCA9IHRoaXMuX3RlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5fdGVtcGxhdGUoZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl90ZW1wbGF0ZVN0cjtcblxuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbmZ1bmN0aW9uIFRlbXBsYXRlJGJpbmRlcigpIHtcbiAgICBpZiAodGhpcy5vd25lci5jb250YWluZXIpXG4gICAgICAgIHJldHVybiB0aGlzLm93bmVyLmNvbnRhaW5lci5iaW5kZXIoKTtcbiAgICBlbHNlXG4gICAgICAgIGxvZ2dlci5lcnJvcignVGVtcGxhdGVGYWNldDogQmluZGVyIGNhbGxlZCB3aXRob3V0IGNvbnRhaW5lciBmYWNldC4nKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY2ZfcmVnaXN0cnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbi8qKlxuICogVHJhbnNmZXIgZmFjZXQgaXMgZGVzaWduZWQgZm9yIGNvbXBvbmVudHMgdG8gYmUgYWJsZSB0byByZXByZXNlbnQgb3RoZXIgY29tcG9uZW50c1xuICogSWYgYSBbQ29tcG9uZW50XSguLi9jX2NsYXNzLmpzLmh0bWwpIGhhcyBUcmFuc2ZlciBmYWNldCwgd2hlbiBgQ29tcG9uZW50LmdldFN0YXRlYCBpcyBjYWxsZWQgZm9yIHRoaXMgY29tcG9uZXQgaXQgcmV0dXJucyBwcmV2aW91c2x5IHNhdmVkIGRhdGEsIHBvc3NpYmx5IGZyb20gYW5vdGhlciBjb21wb25lbnQuXG4gKiBGb3IgZXhhbXBsZSwgYSBsaXN0IG9mIGRvY3VtZW50cyBjYW4gdXNlIHRoaXMgZmFjZXQgc28gdGhhdCBlYWNoIGl0ZW0gaW4gdGhlIGxpc3QgY2FuIHN0b3JlIGFjdHVhbCBkb2N1bWVudCBjb21wb25lbnQgb24gaXQuXG4gKi9cbnZhciBUcmFuc2ZlciA9IF8uY3JlYXRlU3ViY2xhc3MoQ29tcG9uZW50RmFjZXQsICdUcmFuc2ZlcicpO1xuXG5fLmV4dGVuZFByb3RvKFRyYW5zZmVyLCB7XG4gICAgaW5pdDogVHJhbnNmZXIkaW5pdCxcbiAgICBnZXRTdGF0ZTogVHJhbnNmZXIkZ2V0U3RhdGUsXG4gICAgc2V0U3RhdGU6IFRyYW5zZmVyJHNldFN0YXRlLFxuICAgIHNldEFjdGl2ZVN0YXRlOiBUcmFuc2ZlciRzZXRBY3RpdmVTdGF0ZSxcbiAgICBzZXRTdGF0ZVdpdGhLZXk6IFRyYW5zZmVyJHNldFN0YXRlV2l0aEtleSxcbiAgICBnZXRTdGF0ZVdpdGhLZXk6IFRyYW5zZmVyJGdldFN0YXRlV2l0aEtleSxcbiAgICBnZXRDb21wb25lbnRNZXRhOiBUcmFuc2ZlciRnZXRDb21wb25lbnRNZXRhXG59KTtcblxuZmFjZXRzUmVnaXN0cnkuYWRkKFRyYW5zZmVyKTtcblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2ZlcjtcblxuXG5mdW5jdGlvbiBUcmFuc2ZlciRpbml0KCkge1xuICAgIENvbXBvbmVudEZhY2V0LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5fYWN0aXZlU3RhdGUgPSAnJztcbiAgICB0aGlzLl9kZWZhdWx0S2V5ID0gJyc7XG4gICAgdGhpcy5fc3RhdGUgPSB7fTtcbn1cblxuXG4vKipcbiAqIFRyYW5zZmVyIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyB0cmFuc2ZlciBzdGF0ZSBmb3IgY29tcG9uZW50LiBDYW4gYmUgb2J0YWluZWQgZnJvbSBhbm90aGVyIGNvbXBvbmVudCBieSB1c2luZyBgQ29tcG9uZW50LmdldFN0YXRlYFxuICpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gVHJhbnNmZXIkZ2V0U3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlW3RoaXMuX2FjdGl2ZVN0YXRlXSB8fCB0aGlzLl9zdGF0ZVt0aGlzLl9kZWZhdWx0S2V5XTtcbn1cblxuXG4vKipcbiAqIFRyYW5zZmVyIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyB0cmFuc2ZlciBzdGF0ZSBmb3IgY29tcG9uZW50LiBDYW4gYmUgb2J0YWluZWQgZnJvbSBhbm90aGVyIGNvbXBvbmVudCBieSB1c2luZyBgQ29tcG9uZW50LmdldFN0YXRlYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICovXG5mdW5jdGlvbiBUcmFuc2ZlciRzZXRTdGF0ZShzdGF0ZSkge1xuICAgIHRoaXMuX3N0YXRlWycnXSA9IHN0YXRlO1xuICAgIHRoaXMuc2V0QWN0aXZlU3RhdGUoJycpO1xufVxuXG4vKipcbiAqIFRyYW5zZmVyIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyB0aGUgYWN0aXZlIHN0YXRlICh1c2VkIGJ5IGdldFN0YXRlKVxuICogQHBhcmFtIHtbdHlwZV19IGtleSBbZGVzY3JpcHRpb25dXG4gKi9cbmZ1bmN0aW9uIFRyYW5zZmVyJHNldEFjdGl2ZVN0YXRlKGtleSkge1xuICAgIHRoaXMuX2FjdGl2ZVN0YXRlID0ga2V5O1xufVxuXG4vKipcbiAqIFRyYW5zZmVyIGZhY2V0IGluc3RhbmNlIG1ldGhvZFxuICogU2V0cyB0cmFuc2ZlciBzdGF0ZSBmb3IgY29tcG9uZW50IHdpdGhvdXQgZGVmYXVsdCBrZXkuIENhbiBiZSBvYnRhaW5lZCBmcm9tIGFub3RoZXIgY29tcG9uZW50IGJ5IHVzaW5nIGBDb21wb25lbnQuZ2V0U3RhdGVgXG4gKiBXaGVuIHRoZSBhY3RpdmUgc3RhdGUgaXMgc2V0IHRvIHRoZSBleHBlY3RlZCBrZXlcbiAqIEBwYXJhbSB7W3R5cGVdfSBrZXkgICBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0ge1t0eXBlXX0gc3RhdGUgW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtIHtCb29sZWFufSBpc0RlZmF1bHRLZXkgKE9wdGlvbmFsKVxuICovXG5mdW5jdGlvbiBUcmFuc2ZlciRzZXRTdGF0ZVdpdGhLZXkoa2V5LCBzdGF0ZSwgaXNEZWZhdWx0S2V5KSB7XG4gICAgaWYgKCFrZXkpIHRocm93IG5ldyBFcnJvcignVHJhbnNmZXIkc2V0U3RhdGVXaXRoS2V5OiBubyBrZXknKTtcblxuICAgIGlmIChpc0RlZmF1bHRLZXkpXG4gICAgICAgIHRoaXMuX2RlZmF1bHRLZXkgPSBrZXk7XG4gICAgZWxzZVxuICAgICAgICB0aGlzLl9kZWZhdWx0S2V5ID0gdGhpcy5fZGVmYXVsdEtleSB8fCBrZXk7XG5cbiAgICB0aGlzLl9zdGF0ZVtrZXldID0gc3RhdGU7XG4gICAgdGhpcy5zZXRBY3RpdmVTdGF0ZShrZXkpO1xufVxuXG5cbmZ1bmN0aW9uIFRyYW5zZmVyJGdldFN0YXRlV2l0aEtleShrZXkpIHtcbiAgICByZXR1cm4gdHlwZW9mIGtleSA9PSAnc3RyaW5nJyAmJiB0aGlzLl9zdGF0ZVtrZXldO1xufVxuXG5cbmZ1bmN0aW9uIFRyYW5zZmVyJGdldENvbXBvbmVudE1ldGEoKSB7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5nZXRTdGF0ZSgpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBOYW1lOiBzdGF0ZSAmJiBzdGF0ZS5jb21wTmFtZSxcbiAgICAgICAgY29tcENsYXNzOiBzdGF0ZSAmJiBzdGF0ZS5jb21wQ2xhc3NcbiAgICB9O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ2xhc3NSZWdpc3RyeSA9IHJlcXVpcmUoJy4uLy4uL2Fic3RyYWN0L3JlZ2lzdHJ5JylcbiAgICAsIENvbXBvbmVudEZhY2V0ID0gcmVxdWlyZSgnLi4vY19mYWNldCcpO1xuXG5cbi8qKlxuICogYG1pbG8ucmVnaXN0cnkuZmFjZXRzYFxuICogQ29tcG9uZW50IGZhY2V0cyByZWdpc3RyeS4gQW4gaW5zdGFuY2Ugb2YgW0NsYXNzUmVnaXN0cnldKC4uLy4uL2Fic3RyYWN0L3JlZ2lzdHJ5LmpzLmh0bWwpIGNsYXNzIHRoYXQgaXMgdXNlZCBieSBtaWxvIHRvIHJlZ2lzdGVyIGFuZCBmaW5kIGZhY2V0cy5cbiAqL1xuIHZhciBmYWNldHNSZWdpc3RyeSA9IG5ldyBDbGFzc1JlZ2lzdHJ5KENvbXBvbmVudEZhY2V0KTtcblxuXG4vLyBBZGRzIGNvbW1vbiBhbmNlc3RvciB0byBhbGwgZmFjZXRzIG9mIGNvbXBvbmVudHMgdG8gdGhlIHJlZ2lzdHJ5LlxuZmFjZXRzUmVnaXN0cnkuYWRkKENvbXBvbmVudEZhY2V0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmYWNldHNSZWdpc3RyeTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY19yZWdpc3RyeScpXG4gICAgLCBmYWNldHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4vY19mYWNldHMvY2ZfcmVnaXN0cnknKVxuICAgICwgY29tcG9uZW50TmFtZSA9IHJlcXVpcmUoJy4uL3V0aWwvY29tcG9uZW50X25hbWUnKVxuICAgICwgU2NvcGUgPSByZXF1aXJlKCcuL3Njb3BlJylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxubW9kdWxlLmV4cG9ydHMgPSBDb21wb25lbnRJbmZvO1xuXG5cbi8qKlxuICogU2ltcGxlIGNsYXNzIHRvIGhvbGQgaW5mb3JtYXRpb24gYWxsb3dpbmcgdG8gY3JlYXRlL2NvcHkgY29tcG9uZW50IHVzaW5nIFtgQ29tcG9uZW50LmNyZWF0ZWBdKC4vY19jbGFzcy5qcy5odG1sI2NyZWF0ZSkgYW5kIFtgQ29tcG9uZW50LmNvcHlgXSguL2NfY2xhc3MuanMuaHRtbCNjb3B5KS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U2NvcGV9IHNjb3BlIHNjb3BlIG9iamVjdCB0aGUgY29tcG9uZW50IGJlbG9ncyB0bywgdXN1YWxseSBlaXRoZXIgdG9wIGxldmVsIHNjb3BlIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieSBbbWlsby5iaW5kZXJdKC4uL2JpbmRlci5qcy5odG1sKSBvciBgc2NvcGVgIHByb3BlcnR5IG9mIFtDb250YWluZXJdKC4vY19mYWNldHMvQ29udGFpbmVyLmpzLmh0bWwpIGZhY2V0IG9mIGNvbnRhaW5pbmcgY29tcG9uZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsIERPTSBlbGVtZW50IHRoZSBjb21wb25lbnQgaXMgYXR0YWNoZWQgdG9cbiAqIEBwYXJhbSB7QmluZEF0dHJpYnV0ZX0gYXR0ciBCaW5kQXR0cmlidXRlIGluc3RhbmNlIHRoYXQgdGhlIGNvbXBvbmVudCB3YXMgY3JlYXRlZCB3aXRoXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHRocm93T25FcnJvcnMgSWYgc2V0IHRvIGZhbHNlLCB0aGVuIGVycm9ycyB3aWxsIG9ubHkgYmUgbG9nZ2VkIHRvIGNvbnNvbGUuIFRydWUgYnkgZGVmYXVsdC5cbiAqIEByZXR1cm4ge0NvbXBvbmVudEluZm99XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudEluZm8oc2NvcGUsIGVsLCBhdHRyLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgYXR0ci5wYXJzZSgpLnZhbGlkYXRlKCk7XG5cbiAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG4gICAgdGhpcy5lbCA9IGVsO1xuICAgIHRoaXMuYXR0ciA9IGF0dHI7XG4gICAgdGhpcy5uYW1lID0gYXR0ci5jb21wTmFtZTtcbiAgICB0aGlzLkNvbXBvbmVudENsYXNzID0gZ2V0Q29tcG9uZW50Q2xhc3MoYXR0ciwgdGhyb3dPbkVycm9ycyk7XG4gICAgdGhpcy5leHRyYUZhY2V0c0NsYXNzZXMgPSBnZXRDb21wb25lbnRFeHRyYUZhY2V0cyh0aGlzLkNvbXBvbmVudENsYXNzLCBhdHRyLCB0aHJvd09uRXJyb3JzKTtcblxuICAgIGlmICh0aGlzLkNvbXBvbmVudENsYXNzXG4gICAgICAgICAgICAmJiBoYXNDb250YWluZXJGYWNldCh0aGlzLkNvbXBvbmVudENsYXNzLCB0aGlzLmV4dHJhRmFjZXRzQ2xhc3NlcykpIHtcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSB7fTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiAjIyMjQ29tcG9uZW50SW5mbyBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICogXG4gKiAtIFtkZXN0cm95XSgjQ29tcG9uZW50SW5mbyRkZXN0cm95KVxuICogLSBbcmVuYW1lXSgjQ29tcG9uZW50SW5mbyRyZW5hbWUpXG4gKi9cbl8uZXh0ZW5kUHJvdG8oQ29tcG9uZW50SW5mbywge1xuICAgIGRlc3Ryb3k6IENvbXBvbmVudEluZm8kZGVzdHJveSxcbiAgICByZW5hbWU6IENvbXBvbmVudEluZm8kcmVuYW1lXG59KTtcblxuXG4vKipcbiAqIENvbXBvbmVudEluZm8gaW5zdGFuY2UgbWV0aG9kXG4gKiBEZXN0cm95cyBDb21wb25lbnRJbmZvIGJ5IHJlbW92aW5nIHRoZSByZWZlcmVuY2VzIHRvIERPTSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIENvbXBvbmVudEluZm8kZGVzdHJveSgpIHtcbiAgICBkZWxldGUgdGhpcy5lbDtcbiAgICB0aGlzLmF0dHIuZGVzdHJveSgpO1xufVxuXG5cbi8qKlxuICogQ29tcG9uZW50SW5mbyBpbnN0YW5jZSBtZXRob2RcbiAqIFJlbmFtZXMgQ29tcG9uZW50SW5mbyBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge1tTdHJpbmddfSBuYW1lIG9wdGlvbmFsIG5ldyBjb21wb25lbnQgbmFtZSwgZ2VuZXJhdGVkIGZyb20gdGltZXN0YW1wIGJ5IGRlZmF1bHRcbiAqIEBwYXJhbSB7W0Jvb2xlYW5dfSByZW5hbWVJblNjb3BlIG9wdGlvbmFsIGZhbHNlIHRvIG5vdCByZW5hbWUgQ29tcG9uZW50SW5mbyBvYmplY3QgaW4gaXRzIHNjb3BlLCB0cnVlIGJ5IGRlZmF1bHRcbiAqL1xuZnVuY3Rpb24gQ29tcG9uZW50SW5mbyRyZW5hbWUobmFtZSwgcmVuYW1lSW5TY29wZSkge1xuICAgIG5hbWUgPSBuYW1lIHx8IGNvbXBvbmVudE5hbWUoKTtcbiAgICBTY29wZS5yZW5hbWUodGhpcywgbmFtZSwgcmVuYW1lSW5TY29wZSk7XG4gICAgdGhpcy5hdHRyLmNvbXBOYW1lID0gbmFtZTtcbiAgICB0aGlzLmF0dHIuZGVjb3JhdGUoKTtcbn1cblxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnRDbGFzcyhhdHRyLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgdmFyIENvbXBvbmVudENsYXNzID0gY29tcG9uZW50c1JlZ2lzdHJ5LmdldChhdHRyLmNvbXBDbGFzcyk7XG4gICAgaWYgKCEgQ29tcG9uZW50Q2xhc3MpXG4gICAgICAgIHJlcG9ydEJpbmRlckVycm9yKHRocm93T25FcnJvcnMsICdjbGFzcyAnICsgYXR0ci5jb21wQ2xhc3MgKyAnIGlzIG5vdCByZWdpc3RlcmVkJyk7XG4gICAgcmV0dXJuIENvbXBvbmVudENsYXNzO1xufVxuXG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudEV4dHJhRmFjZXRzKENvbXBvbmVudENsYXNzLCBhdHRyLCB0aHJvd09uRXJyb3JzKSB7XG4gICAgdmFyIGZhY2V0cyA9IGF0dHIuY29tcEZhY2V0c1xuICAgICAgICAsIGV4dHJhRmFjZXRzQ2xhc3NlcyA9IHt9O1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmFjZXRzKSlcbiAgICAgICAgZmFjZXRzLmZvckVhY2goZnVuY3Rpb24oZmN0TmFtZSkge1xuICAgICAgICAgICAgZmN0TmFtZSA9IF8uZmlyc3RVcHBlckNhc2UoZmN0TmFtZSk7XG4gICAgICAgICAgICBpZiAoQ29tcG9uZW50Q2xhc3MuaGFzRmFjZXQoZmN0TmFtZSkpXG4gICAgICAgICAgICAgICAgcmVwb3J0QmluZGVyRXJyb3IodGhyb3dPbkVycm9ycywgJ2NsYXNzICcgKyBDb21wb25lbnRDbGFzcy5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJyBhbHJlYWR5IGhhcyBmYWNldCAnICsgZmN0TmFtZSk7XG4gICAgICAgICAgICBpZiAoZXh0cmFGYWNldHNDbGFzc2VzW2ZjdE5hbWVdKVxuICAgICAgICAgICAgICAgIHJlcG9ydEJpbmRlckVycm9yKHRocm93T25FcnJvcnMsICdjb21wb25lbnQgJyArIGF0dHIuY29tcE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnIGFscmVhZHkgaGFzIGZhY2V0ICcgKyBmY3ROYW1lKTtcbiAgICAgICAgICAgIHZhciBGYWNldENsYXNzID0gZmFjZXRzUmVnaXN0cnkuZ2V0KGZjdE5hbWUpO1xuICAgICAgICAgICAgZXh0cmFGYWNldHNDbGFzc2VzW2ZjdE5hbWVdID0gRmFjZXRDbGFzcztcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gZXh0cmFGYWNldHNDbGFzc2VzO1xufVxuXG5cbmZ1bmN0aW9uIHJlcG9ydEJpbmRlckVycm9yKHRocm93T25FcnJvcnMsIG1lc3NhZ2UpIHtcbiAgICBpZiAodGhyb3dPbkVycm9ycyA9PT0gZmFsc2UpXG4gICAgICAgIGxvZ2dlci5lcnJvcignQ29tcG9uZW50SW5mbyBiaW5kZXIgZXJyb3I6JywgbWVzc2FnZSk7XG4gICAgZWxzZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG59O1xuXG5cbmZ1bmN0aW9uIGhhc0NvbnRhaW5lckZhY2V0KENvbXBvbmVudENsYXNzLCBleHRyYUZhY2V0c0NsYXNzZXMpIHtcbiAgICByZXR1cm4gKENvbXBvbmVudENsYXNzLmhhc0ZhY2V0KCdjb250YWluZXInKVxuICAgICAgICB8fCAnQ29udGFpbmVyJyBpbiBleHRyYUZhY2V0c0NsYXNzZXNcbiAgICAgICAgfHwgXy5zb21lS2V5KGV4dHJhRmFjZXRzQ2xhc3NlcywgZmFjZXRSZXF1aXJlc0NvbnRhaW5lcilcbiAgICAgICAgfHwgY2xhc3NIYXNGYWNldFRoYXRSZXF1aXJlc0NvbnRhaW5lcigpKTtcblxuICAgIGZ1bmN0aW9uIGNsYXNzSGFzRmFjZXRUaGF0UmVxdWlyZXNDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiAoQ29tcG9uZW50Q2xhc3MucHJvdG90eXBlLmZhY2V0c0NsYXNzZXNcbiAgICAgICAgICAgICYmIF8uc29tZUtleShDb21wb25lbnRDbGFzcy5wcm90b3R5cGUuZmFjZXRzQ2xhc3NlcywgZmFjZXRSZXF1aXJlc0NvbnRhaW5lcikpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmFjZXRSZXF1aXJlc0NvbnRhaW5lcihGYWNldENsYXNzKSB7XG4gICAgICAgIHJldHVybiBGYWNldENsYXNzLnJlcXVpcmVzRmFjZXQoJ2NvbnRhaW5lcicpO1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENsYXNzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9hYnN0cmFjdC9yZWdpc3RyeScpXG4gICAgLCBDb21wb25lbnQgPSByZXF1aXJlKCcuL2NfY2xhc3MnKTtcblxuLyoqXG4gKiBgbWlsby5yZWdpc3RyeS5jb21wb25lbnRzYFxuICogQW4gaW5zdGFuY2Ugb2YgW0NsYXNzUmVnaXN0cnldKC4uL2Fic3RyYWN0L3JlZ2lzdHJ5LmpzLmh0bWwpIGNsYXNzIHRoYXQgaXMgdXNlZCBieSBtaWxvIHRvIHJlZ2lzdGVyIGFuZCBmaW5kIGNvbXBvbmVudHMuXG4gKi9cbnZhciBjb21wb25lbnRzUmVnaXN0cnkgPSBuZXcgQ2xhc3NSZWdpc3RyeShDb21wb25lbnQpO1xuXG4vLyBhZGQgY29tbW9uIGFuY2VzdG9yIHRvIGFsbCBjb21wb25lbnRzIHRvIHRoZSByZWdpc3RyeS5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoQ29tcG9uZW50KTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb21wb25lbnRzUmVnaXN0cnk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxudmFyIGNvbXBvbmVudFV0aWxzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgaXNDb21wb25lbnQ6IGlzQ29tcG9uZW50LFxuICAgIGdldENvbXBvbmVudDogZ2V0Q29tcG9uZW50LFxuICAgIGdldENvbnRhaW5pbmdDb21wb25lbnQ6IGdldENvbnRhaW5pbmdDb21wb25lbnQsXG4gICAgX21ha2VDb21wb25lbnRDb25kaXRpb25GdW5jOiBfbWFrZUNvbXBvbmVudENvbmRpdGlvbkZ1bmNcbn07XG5cblxuLyoqXG4gKiBpc0NvbXBvbmVudFxuICpcbiAqIENoZWNrcyBpZiBlbGVtZW50IGhhcyBhIGNvbXBvbmVudCBhdHRhY2hlZCB0byBpdCBieVxuICogY2hlY2tpbmcgdGhlIHByZXNlbmNlIG9mIHByb3BlcnR5IGRpZmluZWQgaW4gbWlsby5jb25maWdcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsIERPTSBlbGVtZW50XG4gKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlLCBpZiBpdCBoYXMgbWlsbyBjb21wb25lbnQgYXR0YWNoZWQgdG8gaXRcbiAqL1xuZnVuY3Rpb24gaXNDb21wb25lbnQoZWwpIHtcbiAgICByZXR1cm4gZWwuaGFzT3duUHJvcGVydHkoY29uZmlnLmNvbXBvbmVudFJlZik7XG59XG5cblxuLyoqXG4gKiBnZXRDb21wb25lbnRcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsIERPTSBlbGVtZW50XG4gKiBAcmV0dXJuIHtDb21wb25lbnR9IGNvbXBvbmVudCBhdHRhY2hlZCB0byBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGdldENvbXBvbmVudChlbCkge1xuICAgIHJldHVybiBlbCAmJiBlbFtjb25maWcuY29tcG9uZW50UmVmXTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNsb3Nlc3QgY29tcG9uZW50IHdoaWNoIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudCxcbiAqIG9wdGlvbmFsbHksIG9ubHkgY29tcG9uZW50IHRoYXQgcGFzc2VzIGBjb25kaXRpb25gIHRlc3Qgb3IgY29udGFpbnMgc3BlY2lmaWVkIGZhY2V0XG4gKlxuICogVW5sZXNzIGByZXR1cm5DdXJyZW50YCBwYXJhbWV0ZXIgaXMgZmFsc2UsIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVyblxuICogdGhlIGN1cnJlbnQgY29tcG9uZW50IG9mIHRoZSBlbGVtZW50ICh0cnVlIGJ5IGRlZmF1bHQpLlxuICpcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBET00gRWxlbWVudCBvciB0ZXh0IE5vZGVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcmV0dXJuQ3VycmVudCBvcHRpb25hbCBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29tcG9uZW50IG9mIHRoZSBlbGVtZW50IGNhbiBiZSByZXR1cm5lZC4gVHJ1ZSBieSBkZWZhdWx0LCBzaG91bGQgYmUgZmFsc2UgdG8gcmV0dXJuIG9ubHkgYW5jZXN0b3JzLlxuICogQHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IGNvbmRpdGlvbk9yRmFjZXQgb3B0aW9uYWwgY29uZGl0aW9uIHRoYXQgY29tcG9uZW50IHNob3VsZCBwYXNzIChvciBmYWNldCBuYW1lIGl0IHNob3VsZCBjb250YWluKVxuICogQHJldHVybiB7Q29tcG9uZW50fSBcbiAqL1xuZnVuY3Rpb24gZ2V0Q29udGFpbmluZ0NvbXBvbmVudChub2RlLCByZXR1cm5DdXJyZW50LCBjb25kaXRpb25PckZhY2V0KSB7XG4gICAgLy8gY2hlY2sobm9kZSwgTm9kZSk7IC0gY2FuJ3QgY2hlY2sgdGl5cGUgaGVyZSBhcyBpdCBpcyBtb3N0IGxpa2VseSBjb21pbmcgZnJvbSBhbm90aGVyIGZyYW1lXG4gICAgY2hlY2socmV0dXJuQ3VycmVudCwgTWF0Y2guT3B0aW9uYWwoQm9vbGVhbikpO1xuICAgIGNoZWNrKGNvbmRpdGlvbk9yRmFjZXQsIE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9uZU9mKEZ1bmN0aW9uLCBTdHJpbmcpKSk7XG5cbiAgICB2YXIgY29uZGl0aW9uRnVuYyA9IF9tYWtlQ29tcG9uZW50Q29uZGl0aW9uRnVuYyhjb25kaXRpb25PckZhY2V0KTtcblxuICAgIHJldHVybiBfZ2V0Q29udGFpbmluZ0NvbXBvbmVudChub2RlLCByZXR1cm5DdXJyZW50LCBjb25kaXRpb25GdW5jKTtcbn1cblxuXG5mdW5jdGlvbiBfbWFrZUNvbXBvbmVudENvbmRpdGlvbkZ1bmMoY29uZGl0aW9uT3JGYWNldCkge1xuICAgIGlmICh0eXBlb2YgY29uZGl0aW9uT3JGYWNldCA9PSAnZnVuY3Rpb24nKVxuICAgICAgICByZXR1cm4gY29uZGl0aW9uT3JGYWNldDtcbiAgICBlbHNlIGlmICh0eXBlb2YgY29uZGl0aW9uT3JGYWNldCA9PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgZmFjZXROYW1lID0gXy5maXJzdExvd2VyQ2FzZShjb25kaXRpb25PckZhY2V0KTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjb21wKSB7XG4gICAgICAgICAgIHJldHVybiBjb21wLmhhc0ZhY2V0KGZhY2V0TmFtZSk7XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIF9nZXRDb250YWluaW5nQ29tcG9uZW50KGVsLCByZXR1cm5DdXJyZW50LCBjb25kaXRpb25GdW5jKSB7XG4gICAgLy8gV2hlcmUgdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBhIGNvbXBvbmVudCBpdCBzaG91bGQgYmUgcmV0dXJuZWRcbiAgICAvLyBpZiByZXR1cm5DdXJyZW50IGlzIHRydWUgb3IgdW5kZWZpbmVkXG4gICAgaWYgKHJldHVybkN1cnJlbnQgIT09IGZhbHNlKSB7XG4gICAgICAgIHZhciBjb21wID0gZ2V0Q29tcG9uZW50KGVsKTtcbiAgICAgICAgaWYgKGNvbXAgJiYgKCEgY29uZGl0aW9uRnVuYyB8fCBjb25kaXRpb25GdW5jKGNvbXApKSlcbiAgICAgICAgICAgIHJldHVybiBjb21wO1xuICAgIH1cblxuICAgIC8vIFdoZXJlIHRoZXJlIGlzIG5vIHBhcmVudCBlbGVtZW50LCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHVuZGVmaW5lZFxuICAgIC8vIFRoZSBwYXJlbnQgZWxlbWVudCBpcyBjaGVja2VkIHJlY3Vyc2l2ZWx5XG4gICAgaWYgKGVsLnBhcmVudE5vZGUpXG4gICAgICAgIHJldHVybiBfZ2V0Q29udGFpbmluZ0NvbXBvbmVudChlbC5wYXJlbnROb2RlLCB0cnVlLCBjb25kaXRpb25GdW5jKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpO1xuXG5cbnZhciBWaWV3ID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdWaWV3JywgWydjb250YWluZXInXSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoVmlldyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmlldztcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgZ2V0RWxlbWVudERhdGFBY2Nlc3MgPSByZXF1aXJlKCcuL2RlX2RhdGEnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2VuZ2VyQVBJID0gbWlsb0NvcmUuY2xhc3Nlcy5NZXNzZW5nZXJBUElcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5cbi8vIGNsYXNzIHRvIGhhbmRsZSBzdWJzY3JpYnRpb25zIHRvIGNoYW5nZXMgaW4gRE9NIGZvciBVSSAobWF5YmUgYWxzbyBjb250ZW50IGVkaXRhYmxlKSBlbGVtZW50c1xuXG4vKipcbiAqIEEgY2xhc3NcbiAqL1xudmFyIERhdGFNc2dBUEkgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NlbmdlckFQSSwgJ0RhdGFNc2dBUEknLCB0cnVlKTtcblxuXG5fLmV4dGVuZFByb3RvKERhdGFNc2dBUEksIHtcbiAgICAvLyBpbXBsZW1lbnRpbmcgTWVzc2FnZVNvdXJjZSBpbnRlcmZhY2VcbiAgICBpbml0OiBEYXRhTXNnQVBJJGluaXQsXG4gICAgdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlOiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UsXG4gICAgZmlsdGVyU291cmNlTWVzc2FnZTogZmlsdGVyU291cmNlTWVzc2FnZSxcbiAgICBjcmVhdGVJbnRlcm5hbERhdGE6IGNyZWF0ZUludGVybmFsRGF0YSxcblxuICAgIC8vIGNsYXNzIHNwZWNpZmljIG1ldGhvZHNcbiAgICB2YWx1ZTogRGF0YU1zZ0FQSSR2YWx1ZVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRGF0YU1zZ0FQSTtcblxuXG5mdW5jdGlvbiBEYXRhTXNnQVBJJGluaXQoY29tcG9uZW50KSB7XG4gICAgTWVzc2VuZ2VyQVBJLnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICB0aGlzLmVsRGF0YSA9IGdldEVsZW1lbnREYXRhQWNjZXNzKGNvbXBvbmVudC5lbCk7XG59XG5cblxuLy8gZ2V0RG9tRWxlbWVudERhdGFWYWx1ZVxuZnVuY3Rpb24gRGF0YU1zZ0FQSSR2YWx1ZSgpIHsgLy8gdmFsdWUgbWV0aG9kXG4gICAgdmFyIGNvbXBvbmVudEdldHRlciA9IHRoaXMuY29tcG9uZW50LmRhdGEuY29uZmlnLmdldDtcbiAgICB2YXIgbmV3VmFsdWUgPSB0eXBlb2YgY29tcG9uZW50R2V0dGVyID09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICAgICAgICAgPyBjb21wb25lbnRHZXR0ZXIuY2FsbCh0aGlzLmNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmVsRGF0YS5nZXQodGhpcy5jb21wb25lbnQuZWwpO1xuXG4gICAgdGhpcy5jb21wb25lbnQuZGF0YS5fdmFsdWUgPSBuZXdWYWx1ZTtcblxuICAgIHJldHVybiBuZXdWYWx1ZTtcbn1cblxuXG4vLyBUT0RPOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gcmVsZXZhbnQgRE9NIGV2ZW50IGRlcGVuZGVudCBvbiBlbGVtZW50IHRhZ1xuLy8gQ2FuIGFsc28gaW1wbGVtZW50IGJlZm9yZWRhdGFjaGFuZ2VkIGV2ZW50IHRvIGFsbG93IHByZXZlbnRpbmcgdGhlIGNoYW5nZVxuLy8gdHJhbnNsYXRlVG9Eb21FdmVudFxuZnVuY3Rpb24gdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICB2YXIgY29tcG9uZW50RXZlbnQgPSB0aGlzLmNvbXBvbmVudC5kYXRhLmNvbmZpZy5ldmVudDtcbiAgICB2YXIgZXZlbnQgPSBjb21wb25lbnRFdmVudCB8fCB0aGlzLmVsRGF0YS5ldmVudCh0aGlzLmNvbXBvbmVudC5lbCk7XG5cbiAgICBpZiAobWVzc2FnZSA9PSAnJyAmJiBldmVudClcbiAgICAgICAgcmV0dXJuIGV2ZW50OyAgLy8gdGhpcy50YWdFdmVudDtcbn1cblxuXG4vLyBmaWx0ZXJEYXRhTWVzc2FnZVxuZnVuY3Rpb24gZmlsdGVyU291cmNlTWVzc2FnZShzb3VyY2VNZXNzYWdlLCBtZXNzYWdlLCBkYXRhKSB7XG4gICAgcmV0dXJuIGRhdGEubmV3VmFsdWUgIT0gZGF0YS5vbGRWYWx1ZTtcbn1cblxuXG5mdW5jdGlvbiBjcmVhdGVJbnRlcm5hbERhdGEoc291cmNlTWVzc2FnZSwgbWVzc2FnZSwgZGF0YSkge1xuICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMuY29tcG9uZW50LmRhdGEuX3ZhbHVlXG4gICAgICAgICwgbmV3VmFsdWUgPSB0aGlzLnZhbHVlKCk7XG5cbiAgICB2YXIgaW50ZXJuYWxEYXRhID0geyBcbiAgICAgICAgcGF0aDogJycsXG4gICAgICAgIHR5cGU6ICdjaGFuZ2VkJyxcbiAgICAgICAgb2xkVmFsdWU6IG9sZFZhbHVlLFxuICAgICAgICBuZXdWYWx1ZTogbmV3VmFsdWVcbiAgICB9O1xuICAgIHJldHVybiBpbnRlcm5hbERhdGE7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG4vKipcbiAqIFJldHVybnMgZGF0YSBhY2Nlc3MgbWV0aG9kcyBhbmQgZXZlbnRzIGZvciBnaXZlbiBET00gZWxlbWVudC5cbiAqIFVzZWQgYnkgW0RhdGFdKC4uL2NfZmFjZXRzL0RhdGEuanMuaHRtbCkgZmFjZXQgYW5kIGJ5IFtEYXRhTXNnQVBJXSguL2RhdGEuanMuaHRtbClcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbnZhciBnZXRFbGVtZW50RGF0YUFjY2VzcyA9IGZ1bmN0aW9uKGVsKSB7XG4gICAgdmFyIHRhZ05hbWUgPSBlbC50YWdOYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgLCBlbERhdGEgPSBkb21FbGVtZW50c0RhdGFBY2Nlc3NbdGFnTmFtZV07XG4gICAgcmV0dXJuIGVsRGF0YSB8fCBkb21FbGVtZW50c0RhdGFBY2Nlc3MuYnlEZWZhdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEVsZW1lbnREYXRhQWNjZXNzO1xuXG5cbi8qKlxuICogRGF0YSBhY2Nlc3MgbWV0aG9kcyBhbmQgZXZlbnRzIGZvciBET00gZWxlbWVudHMuXG4gKi9cbnZhciBkb21FbGVtZW50c0RhdGFBY2Nlc3MgPSB7XG4gICAgYnlEZWZhdWx0OiB7XG4gICAgICAgIHByb3BlcnR5OiAnaW5uZXJIVE1MJyxcbiAgICB9LFxuICAgICdkaXYnOiB7XG4gICAgICAgIHByb3BlcnR5OiAnaW5uZXJIVE1MJywgLy8gaGFjaywgc2hvdWxkIGJlIGlubmVySFRNTD8gdG8gbWFrZSB3b3JrIHdpdGggRWRpdGFibGUgZmFjZXRcbiAgICAgICAgLy8gZXZlbnQ6ICdpbnB1dCdcbiAgICB9LFxuICAgICdzcGFuJzoge1xuICAgICAgICBwcm9wZXJ0eTogJ2lubmVySFRNTCcsXG4gICAgICAgIGV2ZW50OiAnaW5wdXQnXG4gICAgfSxcbiAgICAncCc6IHtcbiAgICAgICAgcHJvcGVydHk6ICdpbm5lckhUTUwnLFxuICAgICAgICBldmVudDogJ2lucHV0J1xuICAgIH0sXG4gICAgJ2lucHV0Jzoge1xuICAgICAgICBwcm9wZXJ0eTogaW5wdXREYXRhUHJvcGVydHksXG4gICAgICAgIGV2ZW50OiBpbnB1dENoYW5nZUV2ZW50XG4gICAgfSxcbiAgICAndGV4dGFyZWEnOiB7XG4gICAgICAgIHByb3BlcnR5OiAndmFsdWUnLFxuICAgICAgICBldmVudDogJ2lucHV0J1xuICAgIH0sXG4gICAgJ3NlbGVjdCc6IHtcbiAgICAgICAgcHJvcGVydHk6ICd2YWx1ZScsXG4gICAgICAgIGV2ZW50OiAnY2hhbmdlJ1xuICAgIH0sXG4gICAgJ2ltZyc6IHtcbiAgICAgICAgcHJvcGVydHk6ICdzcmMnXG4gICAgfSxcbiAgICAnY2FwdGlvbic6IHtcbiAgICAgICAgcHJvcGVydHk6ICdpbm5lckhUTUwnLFxuICAgICAgICBldmVudDogJ2lucHV0J1xuICAgIH0sXG4gICAgJ3RoZWFkJzoge1xuICAgICAgICBwcm9wZXJ0eTogJ2lubmVySFRNTCcsXG4gICAgICAgIGV2ZW50OiAnaW5wdXQnXG4gICAgfSxcbiAgICAndGJvZHknOiB7XG4gICAgICAgIHByb3BlcnR5OiAnaW5uZXJIVE1MJyxcbiAgICAgICAgZXZlbnQ6ICdpbnB1dCdcbiAgICB9LFxuICAgICd0Zm9vdCc6IHtcbiAgICAgICAgcHJvcGVydHk6ICdpbm5lckhUTUwnLFxuICAgICAgICBldmVudDogJ2lucHV0J1xuICAgIH1cbn07XG5cblxuLy8gY29udmVydCBzdHJpbmdzIHRvIGZ1bmN0aW9ucyBhbmQgY3JlYXRlIGdldHNldCBtZXRob2RzXG5fLmVhY2hLZXkoZG9tRWxlbWVudHNEYXRhQWNjZXNzLCBmdW5jdGlvbih0YWdJbmZvKSB7XG4gICAgdmFyIHByb3BlcnR5ID0gdGFnSW5mby5wcm9wZXJ0eVxuICAgICAgICAsIGV2ZW50ID0gdGFnSW5mby5ldmVudDtcbiAgICBpZiAodHlwZW9mIHByb3BlcnR5ICE9ICdmdW5jdGlvbicpXG4gICAgICAgIHRhZ0luZm8ucHJvcGVydHkgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHByb3BlcnR5OyB9O1xuICAgIHZhciBwcm9wRnVuYyA9IHRhZ0luZm8ucHJvcGVydHk7XG4gICAgaWYgKHR5cGVvZiBldmVudCAhPSAnZnVuY3Rpb24nKVxuICAgICAgICB0YWdJbmZvLmV2ZW50ID0gZnVuY3Rpb24oKSB7IHJldHVybiBldmVudDsgfTtcbiAgICBpZiAoISB0YWdJbmZvLmdldClcbiAgICAgICAgdGFnSW5mby5nZXQgPSBmdW5jdGlvbihlbCkgeyByZXR1cm4gZWxbcHJvcEZ1bmMoZWwpXTsgfVxuICAgIGlmICghIHRhZ0luZm8uc2V0KVxuICAgICAgICB0YWdJbmZvLnNldCA9IGZ1bmN0aW9uKGVsLCB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIChlbFtwcm9wRnVuYyhlbCldID0gdHlwZW9mIHZhbHVlID09ICd1bmRlZmluZWQnID8gJycgOiB2YWx1ZSk7XG4gICAgICAgIH1cbn0pO1xuXG5cbi8qKlxuICogVHlwZXMgb2YgaW5wdXQgZWxlbWVudHNcbiAqL1xudmFyIGlucHV0RWxlbWVudFR5cGVzID0ge1xuICAgIGJ5RGVmYXVsdDoge1xuICAgICAgICBwcm9wZXJ0eTogJ3ZhbHVlJyxcbiAgICAgICAgZXZlbnQ6ICdpbnB1dCdcbiAgICB9LFxuICAgICdjaGVja2JveCc6IHtcbiAgICAgICAgcHJvcGVydHk6ICdjaGVja2VkJyxcbiAgICAgICAgZXZlbnQ6ICdjaGFuZ2UnXG4gICAgfSxcbiAgICAncmFkaW8nOiB7XG4gICAgICAgIHByb3BlcnR5OiAnY2hlY2tlZCcsXG4gICAgICAgIGV2ZW50OiAnY2hhbmdlJ1xuICAgIH0sXG4gICAgJ3RleHQnOiB7XG4gICAgICAgIHByb3BlcnR5OiAndmFsdWUnLFxuICAgICAgICBldmVudDogJ2lucHV0J1xuICAgIH1cbn1cblxuXG4vKipcbiAqIFJldHVybiBwcm9wZXJ0eSBvZiBpbnB1dCBlbGVtZW50IHRvIGdldC9zZXQgaXRzIGRhdGFcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGlucHV0RGF0YVByb3BlcnR5KGVsKSB7XG4gICAgdmFyIGlucHV0VHlwZSA9IGlucHV0RWxlbWVudFR5cGVzW2VsLnR5cGVdO1xuICAgIHJldHVybiBpbnB1dFR5cGVcbiAgICAgICAgICAgID8gaW5wdXRUeXBlLnByb3BlcnR5XG4gICAgICAgICAgICA6IGlucHV0RWxlbWVudFR5cGVzLmJ5RGVmYXVsdC5wcm9wZXJ0eTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgRE9NIGV2ZW50IHR5cGUgdG8gbGlzdGVuIHRvIHRvIHJlYWN0IHRvIGlucHV0IGVsZW1lbnQgY2hhbmdlXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBpbnB1dENoYW5nZUV2ZW50KGVsKSB7XG4gICAgdmFyIGlucHV0VHlwZSA9IGlucHV0RWxlbWVudFR5cGVzW2VsLnR5cGVdO1xuICAgIHJldHVybiBpbnB1dFR5cGVcbiAgICAgICAgICAgID8gaW5wdXRUeXBlLmV2ZW50XG4gICAgICAgICAgICA6IGlucHV0RWxlbWVudFR5cGVzLmJ5RGVmYXVsdC5ldmVudDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgTWVzc2VuZ2VyQVBJID0gcmVxdWlyZSgnbWlsby1jb3JlJykuY2xhc3Nlcy5NZXNzZW5nZXJBUEk7XG5cblxudmFyIERyb3BNc2dBUEkgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NlbmdlckFQSSwgJ0Ryb3BNc2dBUEknLCB0cnVlKTtcblxuXG5fLmV4dGVuZFByb3RvKERyb3BNc2dBUEksIHtcbiAgICAvLyBpbXBsZW1lbnRpbmcgTWVzc2FnZVNvdXJjZSBpbnRlcmZhY2VcbiAgICB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2U6IHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZSxcbiAgICBmaWx0ZXJTb3VyY2VNZXNzYWdlOiBmaWx0ZXJTb3VyY2VNZXNzYWdlLFxufSk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBEcm9wTXNnQVBJO1xuXG5cbnZhciBkcm9wRXZlbnRzTWFwID0ge1xuICAgICdkcmFnaW4nOiAnZHJhZ2VudGVyJyxcbiAgICAnZHJhZ291dCc6ICdkcmFnbGVhdmUnXG59O1xuXG5cbmZ1bmN0aW9uIHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgcmV0dXJuIGRyb3BFdmVudHNNYXAuaGFzT3duUHJvcGVydHkobWVzc2FnZSlcbiAgICAgICAgICAgID8gZHJvcEV2ZW50c01hcFttZXNzYWdlXVxuICAgICAgICAgICAgOiBtZXNzYWdlO1xufVxuXG5mdW5jdGlvbiByZXNldEZpbHRlclZhcnMoKSB7XG4gICAgZGVsZXRlIHRoaXMuX2N1cnJlbnRUYXJnZXQ7XG4gICAgZGVsZXRlIHRoaXMuX2luc2lkZTtcbn1cblxuZnVuY3Rpb24gZmlsdGVyU291cmNlTWVzc2FnZShzb3VyY2VNZXNzYWdlLCBtZXNzYWdlLCBkYXRhKSB7IC8vIGRhdGEgaXMgRE9NIGV2ZW50IG9iamVjdFxuICAgIHZhciBvayA9IHRydWU7XG5cbiAgICBpZiAoc291cmNlTWVzc2FnZSA9PSAnZHJhZ2VudGVyJyAmJiBtZXNzYWdlID09ICdkcmFnaW4nKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRUYXJnZXQgPSBkYXRhLnRhcmdldDtcbiAgICAgICAgb2sgPSAhdGhpcy5faW5zaWRlO1xuICAgICAgICB0aGlzLl9pbnNpZGUgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoc291cmNlTWVzc2FnZSA9PSAnZHJhZ2xlYXZlJyAmJiBtZXNzYWdlID09ICdkcmFnb3V0Jykge1xuICAgICAgICBvayA9IHRoaXMuX2N1cnJlbnRUYXJnZXQgPT0gZGF0YS50YXJnZXQ7XG4gICAgICAgIGlmIChvaykgcmVzZXRGaWx0ZXJWYXJzLmNhbGwodGhpcyk7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VNZXNzYWdlID09ICdkcm9wJykgcmVzZXRGaWx0ZXJWYXJzLmNhbGwodGhpcyk7XG5cbiAgICByZXR1cm4gb2s7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIERPTUVtaXR0ZXJTb3VyY2UgPSByZXF1aXJlKCcuLi8uLi9zZXJ2aWNlcy9kb21fc291cmNlJylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NhZ2VTb3VyY2UgPSBtaWxvQ29yZS5jbGFzc2VzLk1lc3NhZ2VTb3VyY2VcbiAgICAsIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2g7XG5cbnZhciBET01FdmVudHNTb3VyY2UgPSBfLmNyZWF0ZVN1YmNsYXNzKERPTUVtaXR0ZXJTb3VyY2UsICdET01FdmVudHNTb3VyY2UnLCB0cnVlKTtcblxuXG5fLmV4dGVuZFByb3RvKERPTUV2ZW50c1NvdXJjZSwge1xuICAgIGluaXQ6IGluaXQsXG4gICAgZGVzdHJveTogRE9NRXZlbnRzU291cmNlJGRlc3Ryb3ksXG4gICAgZW1pdHRlcjogZW1pdHRlclxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRE9NRXZlbnRzU291cmNlO1xuXG5cbnZhciB1c2VDYXB0dXJlUGF0dGVybiA9IC9fX2NhcHR1cmUkL1xuICAgICwgdXNlQ2FwdHVyZVBvc3RmaXggPSAnX19jYXB0dXJlJztcblxuXG4vLyBpbml0IERPTSBldmVudCBzb3VyY2VcbmZ1bmN0aW9uIGluaXQoaG9zdE9iamVjdCwgcHJveHlNZXRob2RzLCBtZXNzZW5nZXJBUElPckNsYXNzLCBjb21wb25lbnQpIHtcbiAgICBjaGVjayhjb21wb25lbnQsIENvbXBvbmVudCk7XG4gICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7XG4gICAgTWVzc2FnZVNvdXJjZS5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5cbmZ1bmN0aW9uIERPTUV2ZW50c1NvdXJjZSRkZXN0cm95KCkge1xuICAgIE1lc3NhZ2VTb3VyY2UucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBkZWxldGUgdGhpcy5jb21wb25lbnQ7XG59XG5cblxuLy8gZ2V0IERPTSBlbGVtZW50IG9mIGNvbXBvbmVudFxuZnVuY3Rpb24gZW1pdHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnQuZWw7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vICMjI2NvbXBvbmVudCBpZnJhbWUgc291cmNlXG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NhZ2VTb3VyY2UgPSBtaWxvQ29yZS5jbGFzc2VzLk1lc3NhZ2VTb3VyY2VcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxudmFyIEZyYW1lTWVzc2FnZVNvdXJjZSA9IF8uY3JlYXRlU3ViY2xhc3MoTWVzc2FnZVNvdXJjZSwgJ0ZyYW1lTWVzc2FnZVNvdXJjZScsIHRydWUpO1xuXG5cbl8uZXh0ZW5kUHJvdG8oRnJhbWVNZXNzYWdlU291cmNlLCB7XG4gICAgLy8gaW1wbGVtZW50aW5nIE1lc3NhZ2VTb3VyY2UgaW50ZXJmYWNlXG4gICAgaW5pdDogaW5pdCxcbiAgICBhZGRTb3VyY2VTdWJzY3JpYmVyOiBhZGRTb3VyY2VTdWJzY3JpYmVyLFxuICAgIHJlbW92ZVNvdXJjZVN1YnNjcmliZXI6IHJlbW92ZVNvdXJjZVN1YnNjcmliZXIsXG4gICAgdHJpZ2dlcjogdHJpZ2dlcixcblxuICAgIC8vY2xhc3Mgc3BlY2lmaWMgbWV0aG9kc1xuICAgIGZyYW1lV2luZG93OiBmcmFtZVdpbmRvdyxcbiAgICBoYW5kbGVFdmVudDogaGFuZGxlRXZlbnQgIC8vIGV2ZW50IGRpc3BhdGNoZXIgLSBhcyBkZWZpbmVkIGJ5IEV2ZW50IERPTSBBUElcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZyYW1lTWVzc2FnZVNvdXJjZTtcblxuXG5mdW5jdGlvbiBpbml0KGhvc3RPYmplY3QsIHByb3h5TWV0aG9kcywgbWVzc2VuZ2VyQVBJT3JDbGFzcywgY29tcG9uZW50KSB7XG4gICAgY2hlY2soY29tcG9uZW50LCBDb21wb25lbnQpO1xuICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50O1xuXG4gICAgaWYgKGNvbXBvbmVudC5lbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT0gJ2lmcmFtZScpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY29tcG9uZW50IGZvciBGcmFtZU1lc3NhZ2VTb3VyY2UgY2FuIG9ubHkgYmUgYXR0YWNoZWQgdG8gaWZyYW1lIGVsZW1lbnQnKTtcblxuICAgIE1lc3NhZ2VTb3VyY2UucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG5mdW5jdGlvbiBmcmFtZVdpbmRvdygpIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnQuZWwuY29udGVudFdpbmRvdztcbn1cblxuXG4vLyBhZGRJRnJhbWVNZXNzYWdlTGlzdGVuZXJcbmZ1bmN0aW9uIGFkZFNvdXJjZVN1YnNjcmliZXIoc291cmNlTWVzc2FnZSkge1xuICAgIHZhciB3aW4gPSB0aGlzLmZyYW1lV2luZG93KCk7XG4gICAgaWYgKHdpbikgd2luLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLCBmYWxzZSk7XG4gICAgZWxzZSBsb2dnZXIud2FybignRnJhbWVNZXNzYWdlU291cmNlOiBmcmFtZSB3aW5kb3cgaXMgdW5kZWZpbmVkJyk7XG59XG5cblxuLy8gcmVtb3ZlSUZyYW1lTWVzc2FnZUxpc3RlbmVyXG5mdW5jdGlvbiByZW1vdmVTb3VyY2VTdWJzY3JpYmVyKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICB2YXIgd2luID0gdGhpcy5mcmFtZVdpbmRvdygpO1xuICAgIGlmICh3aW4pIHdpbi5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcywgZmFsc2UpO1xuICAgIGVsc2UgbG9nZ2VyLndhcm4oJ0ZyYW1lTWVzc2FnZVNvdXJjZTogZnJhbWUgd2luZG93IGlzIHVuZGVmaW5lZCcpO1xufVxuXG5cbmZ1bmN0aW9uIHRyaWdnZXIobXNnVHlwZSwgZGF0YSkge1xuICAgIGRhdGEgPSBkYXRhIHx8IHt9O1xuICAgIGRhdGEudHlwZSA9IG1zZ1R5cGU7XG5cbiAgICB0aGlzLmZyYW1lV2luZG93KCkucG9zdE1lc3NhZ2UoZGF0YSwgJyonKTtcbn1cblxuXG4vLyBUT0RPIG1heWJlIHJlZmFjdG9yIHRvIEZyYW1lTXNnQVBJP1xuZnVuY3Rpb24gaGFuZGxlRXZlbnQoZXZlbnQpIHtcbiAgICB0aGlzLmRpc3BhdGNoTWVzc2FnZShldmVudC5kYXRhLnR5cGUsIGV2ZW50KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY29tcG9uZW50TmFtZSA9IHJlcXVpcmUoJy4uL3V0aWwvY29tcG9uZW50X25hbWUnKVxuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlcjtcblxuXG4vKipcbiAqIFNjb3BlIGNsYXNzLlxuICogQHBhcmFtIHtFbGVtZW50fSByb290RWwgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGlzIHNjb3BlXG4gKiBAcGFyYW0ge09iamVjdH0gaG9zdE9iamVjdCB0aGUgaG9zdCBcbiAqIEByZXR1cm4ge1Njb3BlfVxuICovXG5mdW5jdGlvbiBTY29wZShyb290RWwsIGhvc3RPYmplY3QpIHtcbiAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICBfcm9vdEVsOiByb290RWwsXG4gICAgICAgIF9ob3N0T2JqZWN0OiBob3N0T2JqZWN0XG4gICAgfSwgXy5XUklUKTsgLy8gd3JpdGFibGVcbn07XG5cbl8uZXh0ZW5kUHJvdG8oU2NvcGUsIHtcbiAgICBfYWRkOiBTY29wZSRfYWRkLFxuICAgIF9zYWZlQWRkOiBTY29wZSRfc2FmZUFkZCxcbiAgICBfY29weTogU2NvcGUkX2NvcHksXG4gICAgX2VhY2g6IFNjb3BlJF9lYWNoLFxuICAgIF9tb3ZlOiBTY29wZSRfbW92ZSxcbiAgICBfbWVyZ2U6IFNjb3BlJF9tZXJnZSxcbiAgICBfbGVuZ3RoOiBTY29wZSRfbGVuZ3RoLFxuICAgIF9hbnk6IFNjb3BlJF9hbnksXG4gICAgX3JlbW92ZTogU2NvcGUkX3JlbW92ZSxcbiAgICBfY2xlYW46IFNjb3BlJF9jbGVhbixcbiAgICBfZGV0YWNoRWxlbWVudDogU2NvcGUkX2RldGFjaEVsZW1lbnQsXG4gICAgX2hhczogU2NvcGUkX2hhcyxcbiAgICBfZmlsdGVyOiBTY29wZSRfZmlsdGVyXG59KTtcblxuXG5fLmV4dGVuZChTY29wZSwge1xuICAgIHJlbmFtZTogU2NvcGUkJHJlbmFtZVxufSk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBTY29wZTtcblxuXG52YXIgYWxsb3dlZE5hbWVQYXR0ZXJuID0gL15bQS1aYS16XVtBLVphLXowLTlcXF9cXCRdKiQvO1xuXG5cbi8qKlxuICogU2NvcGUgaW5zdGFuY2UgbWV0aG9kLlxuICogQWRkcyBvYmplY3QgdG8gdGhlIHNjb3BlLCB0aHJvd2luZyBpZiBuYW1lIGlzIG5vdCB1bmlxdWVcbiAqIEBwYXJhbSB7Q29tcG9uZW50fENvbXBvbmVudEluZm99IG9iamVjdCBjb21wb25lbnQgb3IgY29tcG9uZW50IGluZm8gdG8gYWRkIHRvIHRoZSBzY29wZVxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byBhZGRcbiAqL1xuZnVuY3Rpb24gU2NvcGUkX2FkZChvYmplY3QsIG5hbWUpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgPT0gJ3N0cmluZycpXG4gICAgICAgIG9iamVjdC5uYW1lID0gbmFtZTtcbiAgICBlbHNlXG4gICAgICAgIG5hbWUgPSBvYmplY3QubmFtZTtcbiAgICBcbiAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkdXBsaWNhdGUgb2JqZWN0IG5hbWU6ICcgKyBuYW1lKTtcblxuICAgIGNoZWNrTmFtZShuYW1lKTtcbiAgICBfX2FkZC5jYWxsKHRoaXMsIG9iamVjdCwgbmFtZSk7XG59XG5cblxuLyoqXG4gKiBTY29wZSBpbnN0YW5jZSBtZXRob2RcbiAqIEFkZHMgb2JqZWN0IHRvIHNjb3BlIHJlbmFtaW5nIGl0IGlmIG5hbWUgaXMgbm90IHVuaXF1ZVxuICogQHBhcmFtIHtDb21wb25lbnR8Q29tcG9uZW50SW5mb30gb2JqZWN0IGNvbXBvbmVudCBvciBjb21wb25lbnQgaW5mbyB0byBhZGQgdG8gdGhlIHNjb3BlXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIGFkZFxuICovXG5mdW5jdGlvbiBTY29wZSRfc2FmZUFkZChvYmplY3QsIG5hbWUpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgPT0gJ3N0cmluZycpXG4gICAgICAgIG9iamVjdC5uYW1lID0gbmFtZTtcbiAgICBlbHNlXG4gICAgICAgIG5hbWUgPSBvYmplY3QubmFtZTtcblxuICAgIHZhciBzaG91bGRSZW5hbWUgPSB0aGlzLmhhc093blByb3BlcnR5KG5hbWUpO1xuICAgIGlmIChzaG91bGRSZW5hbWUpXG4gICAgICAgIGxvZ2dlci5lcnJvcignU2NvcGU6IGR1cGxpY2F0ZSBvYmplY3QgbmFtZTogJyArIG5hbWUpO1xuICAgIGVsc2Uge1xuICAgICAgICBzaG91bGRSZW5hbWUgPSAhIGFsbG93ZWROYW1lUGF0dGVybi50ZXN0KG5hbWUpO1xuICAgICAgICBpZiAoc2hvdWxkUmVuYW1lKVxuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdTY29wZTogbmFtZSBzaG91bGQgc3RhcnQgZnJvbSBsZXR0ZXIsIHRoaXMgbmFtZSBpcyBub3QgYWxsb3dlZDogJyArIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRSZW5hbWUpIHtcbiAgICAgICAgbmFtZSA9IGNvbXBvbmVudE5hbWUoKTtcbiAgICAgICAgb2JqZWN0Lm5hbWUgPSBuYW1lO1xuICAgIH1cblxuICAgIF9fYWRkLmNhbGwodGhpcywgb2JqZWN0LCBuYW1lKTtcbn1cblxuXG5mdW5jdGlvbiBfX2FkZChvYmplY3QsIG5hbWUpIHtcbiAgICB0aGlzW25hbWVdID0gb2JqZWN0O1xuICAgIG9iamVjdC5zY29wZSA9IHRoaXM7XG5cbiAgICBpZiAodHlwZW9mIG9iamVjdC5wb3N0TWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgb2JqZWN0LnBvc3RNZXNzYWdlKCdhZGRlZHRvc2NvcGUnKTsgXG59XG5cblxuLyoqXG4gKiBJbnN0YW5jZSBtZXRob2QuXG4gKiBjb3BpZXMgYWxsIG9iamVjdHMgZnJvbSBvbmUgc2NvcGUgdG8gYW5vdGhlcixcbiAqIHRocm93aW5nIGlmIHNvbWUgb2JqZWN0IGlzIG5vdCB1bmlxdWVcbiAqIEBwYXJhbSB7U2NvcGV9IGFTY29wZSB0aGUgc2NvcGUgdG8gY29weVxuICovXG5mdW5jdGlvbiBTY29wZSRfY29weShhU2NvcGUpIHtcbiAgICBjaGVjayhhU2NvcGUsIFNjb3BlKTtcblxuICAgIGFTY29wZS5fZWFjaChTY29wZSRfYWRkLCB0aGlzKTtcbn1cblxuXG4vKipcbiAqIEluc3RhbmNlIG1ldGhvZC5cbiAqIE1vdmVzIGEgY29tcG9uZW50IGZyb20gdGhpcyBzY29wZSB0byBhbm90aGVyIHNjb3BlLlxuICogQHBhcmFtIHtDb21wb25lbnR9IGNvbXBvbmVudCB0aGUgY29tcG9uZW50IHRvIGJlIG1vdmVkXG4gKiBAcGFyYW0ge1Njb3BlfSBvdGhlclNjb3BlIHRoZSBzY29wZSB0byBjb3B5IHRoZSBjb21wb25lbnQgdG9cbiAqL1xuZnVuY3Rpb24gU2NvcGUkX21vdmUoY29tcG9uZW50LCBvdGhlclNjb3BlKSB7XG4gICAgb3RoZXJTY29wZS5fYWRkKGNvbXBvbmVudCk7XG4gICAgdGhpcy5fcmVtb3ZlKGNvbXBvbmVudC5uYW1lKTtcbiAgICBjb21wb25lbnQuc2NvcGUgPSBvdGhlclNjb3BlO1xufVxuXG5cbi8qKlxuICogSW5zdGFuY2UgbWV0aG9kLlxuICogTWVyZ2VzIG9uZSBzY29wZSBpbnRvIHRoaXMgc2NvcGVcbiAqIEBwYXJhbSB7U2NvcGV9IHNjb3BlIHRoZSBzY29wZSB0byBhYnNvcmJcbiAqL1xuZnVuY3Rpb24gU2NvcGUkX21lcmdlKHNjb3BlKSB7XG4gICAgc2NvcGUuX2VhY2goZnVuY3Rpb24gKGNvbXApIHtcbiAgICAgICAgdGhpcy5fYWRkKGNvbXAsIGNvbXAubmFtZSk7XG4gICAgICAgIHNjb3BlLl9yZW1vdmUoY29tcC5uYW1lKTtcbiAgICB9LCB0aGlzKTtcbn1cblxuXG4vKipcbiAqIEluc3RhbmNlIG1ldGhvZC5cbiAqIEVudW1lcmF0ZXMgZWFjaCBjb21wb25lbnQgaW4gdGhlIHNjb3BlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayB0aGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSBmb3IgZWFjaCBjb21wb25lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIHRoZSBjb250ZXh0XG4gKi9cbmZ1bmN0aW9uIFNjb3BlJF9lYWNoKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgXy5lYWNoS2V5KHRoaXMsIGNhbGxiYWNrLCB0aGlzQXJnIHx8IHRoaXMsIHRydWUpOyAvLyBlbnVtZXJhdGVzIGVudW1lcmFibGUgcHJvcGVydGllcyBvbmx5XG59XG5cblxuLyoqXG4gKiBJbnN0YW5jZSBtZXRob2QuXG4gKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvZiBjb21wb25lbnRzIGJhc2VkIG9uIGEgY2FsbGJhY2tcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHRoZSBmdW5jdGlvbiB0byBleGVjdXRlIGZvciBlYWNoIGNvbXBvbmVudFxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgdGhlIGNvbnRleHRcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBTY29wZSRfZmlsdGVyKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgcmV0dXJuIF8uZmlsdGVyS2V5cyh0aGlzLCBjYWxsYmFjaywgdGhpc0FyZyB8fCB0aGlzLCB0cnVlKTtcbn1cblxuXG4vKipcbiAqIENoZWNrcyB0aGUgdmFsaWRpdHkgb2YgYSBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgZm9yIGVhY2ggY29tcG9uZW50XG4gKi9cbmZ1bmN0aW9uIGNoZWNrTmFtZShuYW1lKSB7XG4gICAgaWYgKCEgYWxsb3dlZE5hbWVQYXR0ZXJuLnRlc3QobmFtZSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbmFtZSBzaG91bGQgc3RhcnQgZnJvbSBsZXR0ZXIsIHRoaXMgbmFtZSBpcyBub3QgYWxsb3dlZDogJyArIG5hbWUpO1xufVxuXG5cbi8qKlxuICogSW5zdGFuY2UgbWV0aG9kLlxuICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgaW4gdGhlIHNjb3BlXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIFNjb3BlJF9sZW5ndGgoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMpLmxlbmd0aDtcbn1cblxuXG4vKipcbiAqIEluc3RhbmNlIG1ldGhvZC5cbiAqIFJldHVybnMgYSBjb21wb25lbnQgZnJvbSB0aGUgc2NvcGUuIEl0IG1heSBsb29rIGxpa2UgaXQgcmV0dXJucyB0aGUgZmlyc3QgY29tcG9uZW50XG4gKiBidXQgaW4gcmVhbGl0eSBnaXZlbiB0aGF0IHNjb3BlcyBhcmUgaGFzaGVzLCB0aGVyZSBpcyBubyBzdWNoIHRoaW5nLlxuICogQHJldHVybiB7Q29tcG9uZW50fVxuICovXG5mdW5jdGlvbiBTY29wZSRfYW55KCkge1xuICAgIHZhciBrZXkgPSBPYmplY3Qua2V5cyh0aGlzKVswXTtcbiAgICByZXR1cm4ga2V5ICYmIHRoaXNba2V5XTtcbn1cblxuXG4vKipcbiAqIEluc3RhbmNlIG1ldGhvZC5cbiAqIFJlbW92ZXMgYSBjb21wb25lbnQgZnJvbSB0aGUgc2NvcGUgYnkgaXQncyBuYW1lLlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byByZW1vdmVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcXVpZXQgb3B0aW9uYWwgdHJ1ZSB0byBzdXBwcmVzcyB0aGUgd2FybmluZyBtZXNzYWdlIGlmIHRoZSBjb21wb25lbnQgaXMgbm90IGluIHNjb3BlXG4gKi9cbmZ1bmN0aW9uIFNjb3BlJF9yZW1vdmUobmFtZSwgcXVpZXQpIHtcbiAgICBpZiAoISAobmFtZSBpbiB0aGlzKSkge1xuICAgICAgICBpZiAoIXF1aWV0KSBsb2dnZXIud2FybigncmVtb3Zpbmcgb2JqZWN0IHRoYXQgaXMgbm90IGluIHNjb3BlJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgb2JqZWN0ID0gdGhpc1tuYW1lXTtcblxuICAgIGRlbGV0ZSB0aGlzW25hbWVdO1xuXG4gICAgaWYgKHR5cGVvZiBvYmplY3QucG9zdE1lc3NhZ2UgPT09ICdmdW5jdGlvbicpXG4gICAgICAgIG9iamVjdC5wb3N0TWVzc2FnZSgncmVtb3ZlZGZyb21zY29wZScpO1xufVxuXG5cbi8qKlxuICogSW5zdGFuY2UgbWV0aG9kLlxuICogUmVtb3ZlcyBhbGwgY29tcG9uZW50cyBmcm9tIHRoZSBzY29wZS5cbiAqL1xuZnVuY3Rpb24gU2NvcGUkX2NsZWFuKCkge1xuICAgIHRoaXMuX2VhY2goZnVuY3Rpb24ob2JqZWN0LCBuYW1lKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzW25hbWVdLnNjb3BlO1xuICAgICAgICBkZWxldGUgdGhpc1tuYW1lXTtcbiAgICB9LCB0aGlzKTtcbn1cblxuZnVuY3Rpb24gU2NvcGUkX2RldGFjaEVsZW1lbnQoKSB7XG4gICAgdGhpcy5fcm9vdEVsID0gbnVsbDtcbn1cblxuXG4vKipcbiAqIENoZWNrcyBpZiBzY29wZSBoYXMgb2JqZWN0IGJ5IG9iamVjdCBuYW1lXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBTY29wZSRfaGFzKG9iamVjdCkge1xuICAgIHJldHVybiB0aGlzLmhhc093blByb3BlcnR5KG9iamVjdC5uYW1lKTtcbn1cblxuXG4vKipcbiAqIENoYW5nZSBvYmplY3QgbmFtZSwgcmVuYW1pbmcgaXQgaW4gc2NvcGUgdW5sZXNzIHJlbmFtZUluU2NvcGUgaXMgZmFsc2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG5ldyBuYW1lXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHJlbmFtZUluU2NvcGUgdHJ1ZSBieSBkZWZhdWx0XG4gKi9cbmZ1bmN0aW9uIFNjb3BlJCRyZW5hbWUob2JqLCBuYW1lLCByZW5hbWVJblNjb3BlKSB7XG4gICAgaWYgKG9iai5zY29wZSAmJiByZW5hbWVJblNjb3BlICE9PSBmYWxzZSkge1xuICAgICAgICBvYmouc2NvcGUuX3JlbW92ZShvYmoubmFtZSk7XG4gICAgICAgIG9iai5zY29wZS5fYWRkKG9iaiwgbmFtZSk7XG4gICAgfSBlbHNlXG4gICAgICAgIG9iai5uYW1lID0gbmFtZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxudmFyIE1MQnV0dG9uID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTEJ1dHRvbicsIHtcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktYnV0dG9uJ1xuICAgIH1cbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MQnV0dG9uKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTEJ1dHRvbjtcblxuXy5leHRlbmRQcm90byhNTEJ1dHRvbiwge1xuICAgIGRpc2FibGU6IE1MQnV0dG9uJGRpc2FibGUsXG4gICAgaXNEaXNhYmxlZDogTUxCdXR0b24kaXNEaXNhYmxlZFxufSk7XG5cblxuZnVuY3Rpb24gTUxCdXR0b24kZGlzYWJsZShkaXNhYmxlKSB7XG4gICAgdGhpcy5lbC5kaXNhYmxlZCA9IGRpc2FibGU7XG59XG5cbmZ1bmN0aW9uIE1MQnV0dG9uJGlzRGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5lbC5kaXNhYmxlZDtcbn1cblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5JylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG52YXIgQ09NQk9fQ0hBTkdFX01FU1NBR0UgPSAnbWxjb21ib2NoYW5nZSc7XG5cbnZhciBEQVRBTElTVF9URU1QTEFURSA9ICd7e34gaXQuY29tYm9PcHRpb25zIDpvcHRpb24gfX0gXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwie3s9IG9wdGlvbi5sYWJlbCB9fVwiPjwvb3B0aW9uPiBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHt7fn19JztcblxudmFyIE1MQ29tYm8gPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MQ29tYm8nLCB7XG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZGF0YToge1xuICAgICAgICBnZXQ6IE1MQ29tYm9fZ2V0LFxuICAgICAgICBzZXQ6IE1MQ29tYm9fc2V0LFxuICAgICAgICBkZWw6IE1MQ29tYm9fZGVsLFxuICAgICAgICBzcGxpY2U6IHVuZGVmaW5lZCxcbiAgICAgICAgZXZlbnQ6IENPTUJPX0NIQU5HRV9NRVNTQUdFXG4gICAgfSxcbiAgICBtb2RlbDoge1xuICAgICAgICBtZXNzYWdlczoge1xuICAgICAgICAgICAgJyoqKic6IHsgc3Vic2NyaWJlcjogb25PcHRpb25zQ2hhbmdlLCBjb250ZXh0OiAnb3duZXInIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLWRhdGFsaXN0J1xuICAgIH0sXG4gICAgY29udGFpbmVyOiB1bmRlZmluZWRcbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MQ29tYm8pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MQ29tYm87XG5cblxuXy5leHRlbmRQcm90byhNTENvbWJvLCB7XG4gICAgaW5pdDogTUxDb21ibyRpbml0XG59KTtcblxuXG5mdW5jdGlvbiBNTENvbWJvJGluaXQoKSB7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5vbignY2hpbGRyZW5ib3VuZCcsIG9uQ2hpbGRyZW5Cb3VuZCk7XG59XG5cbmZ1bmN0aW9uIG9uQ2hpbGRyZW5Cb3VuZCgpIHtcbiAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICAnX2NvbWJvSW5wdXQnOiB0aGlzLmNvbnRhaW5lci5zY29wZS5pbnB1dCxcbiAgICAgICAgJ19jb21ib0xpc3QnOiB0aGlzLmNvbnRhaW5lci5zY29wZS5kYXRhbGlzdFxuICAgIH0pO1xuXG4gICAgdGhpcy5fY29tYm9MaXN0LnRlbXBsYXRlLnNldChEQVRBTElTVF9URU1QTEFURSk7XG5cbiAgICB0aGlzLl9jb21ib0lucHV0LmRhdGEub24oJ2lucHV0JyxcbiAgICAgICAgeyBzdWJzY3JpYmVyOiBkaXNwYXRjaENoYW5nZU1lc3NhZ2UsIGNvbnRleHQ6IHRoaXMgfSk7XG59XG5cbmZ1bmN0aW9uIE1MQ29tYm9fZ2V0KCkge1xuICAgIGlmICghIHRoaXMuX2NvbWJvSW5wdXQpIHJldHVybjtcbiAgICByZXR1cm4gdGhpcy5fY29tYm9JbnB1dC5kYXRhLmdldCgpO1xufVxuXG5mdW5jdGlvbiBNTENvbWJvX3NldCh2YWx1ZSkge1xuICAgIHJldHVybiBjaGFuZ2VDb21ib0RhdGEuY2FsbCh0aGlzLCAnc2V0JywgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiBNTENvbWJvX2RlbCgpIHtcbiAgICByZXR1cm4gY2hhbmdlQ29tYm9EYXRhLmNhbGwodGhpcywgJ2RlbCcsIHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gY2hhbmdlQ29tYm9EYXRhKG1ldGhvZCwgdmFsdWUpIHtcbiAgICBpZiAoISB0aGlzLl9jb21ib0lucHV0KSByZXR1cm47XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuX2NvbWJvSW5wdXQuZGF0YVttZXRob2RdKHZhbHVlKTtcbiAgICBkaXNwYXRjaENoYW5nZU1lc3NhZ2UuY2FsbCh0aGlzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5cbi8vIFBvc3QgdGhlIGRhdGEgY2hhbmdlXG5mdW5jdGlvbiBkaXNwYXRjaENoYW5nZU1lc3NhZ2UoKSB7XG4gICAgdGhpcy5kYXRhLmRpc3BhdGNoU291cmNlTWVzc2FnZShDT01CT19DSEFOR0VfTUVTU0FHRSk7XG59XG5cbmZ1bmN0aW9uIG9uT3B0aW9uc0NoYW5nZShtc2csIGRhdGEpIHtcbiAgICB0aGlzLl9jb21ib0xpc3QudGVtcGxhdGUucmVuZGVyKHtcbiAgICAgICAgY29tYm9PcHRpb25zOiB0aGlzLm1vZGVsLmdldCgpXG4gICAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG52YXIgQ09NQk9fTElTVF9DSEFOR0VfTUVTU0FHRSA9ICdtbGNvbWJvbGlzdGNoYW5nZSc7XG5cblxudmFyIE1MQ29tYm9MaXN0ID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTENvbWJvTGlzdCcsIHtcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktY29tYm8tbGlzdCdcbiAgICB9LFxuICAgIGRhdGE6IHtcbiAgICAgICAgZ2V0OiBNTENvbWJvTGlzdF9nZXQsXG4gICAgICAgIHNldDogTUxDb21ib0xpc3Rfc2V0LFxuICAgICAgICBkZWw6IE1MQ29tYm9MaXN0X2RlbCxcbiAgICAgICAgZXZlbnQ6IENPTUJPX0xJU1RfQ0hBTkdFX01FU1NBR0VcbiAgICB9LFxuICAgIGV2ZW50czogdW5kZWZpbmVkLFxuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkLFxuICAgIG1vZGVsOiB7XG4gICAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgICAgICAnKioqJzogeyBzdWJzY3JpYmVyOiBvbkl0ZW1zQ2hhbmdlLCBjb250ZXh0OiAnb3duZXInfVxuICAgICAgICB9XG4gICAgfSxcbiAgICB0ZW1wbGF0ZToge1xuICAgICAgICB0ZW1wbGF0ZTogJzxkaXYgbWwtYmluZD1cIk1MU3VwZXJDb21ibzpjb21ib1wiPjwvZGl2PlxcXG4gICAgICAgICAgICAgICAgICAgPGRpdiBtbC1iaW5kPVwiTUxMaXN0Omxpc3RcIj5cXFxuICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG1sLWJpbmQ9XCJNTExpc3RJdGVtOml0ZW1cIiBjbGFzcz1cImxpc3QtaXRlbVwiPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBtbC1iaW5kPVwiW2RhdGFdOmxhYmVsXCI+PC9zcGFuPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBtbC1iaW5kPVwiW2V2ZW50c106ZGVsZXRlQnRuXCIgY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXJlbW92ZVwiPjwvc3Bhbj5cXFxuICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgIDwvZGl2PidcbiAgICB9XG59KTtcblxuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MQ29tYm9MaXN0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTENvbWJvTGlzdDtcblxuXG5fLmV4dGVuZFByb3RvKE1MQ29tYm9MaXN0LCB7XG4gICAgaW5pdDogTUxDb21ib0xpc3QkaW5pdCxcbiAgICBzZXRPcHRpb25zOiBNTENvbWJvTGlzdCRzZXRPcHRpb25zLFxuICAgIHNldERhdGFWYWxpZGF0aW9uOiBNTENvbWJvTGlzdCRzZXREYXRhVmFsaWRhdGlvbixcbiAgICB0b2dnbGVBZGRCdXR0b246IE1MQ29tYm9MaXN0JHRvZ2dsZUFkZEJ1dHRvbixcbiAgICBkZXN0cm95OiBNTENvbWJvTGlzdCRkZXN0cm95LFxuICAgIHNldEFkZEl0ZW1Qcm9tcHQ6IE1MQ29tYm9MaXN0JHNldEFkZEl0ZW1Qcm9tcHQsXG4gICAgY2xlYXJDb21ib0lucHV0IDogTUxDb21ib0xpc3QkY2xlYXJDb21ib0lucHV0XG59KTtcblxuXG5mdW5jdGlvbiBNTENvbWJvTGlzdCRpbml0KCkge1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMuX2RhdGFWYWxpZGF0aW9uID0gZnVuY3Rpb24gKCkge307XG4gICAgdGhpcy5tb2RlbC5zZXQoW10pO1xuICAgIHRoaXMub25jZSgnY2hpbGRyZW5ib3VuZCcsIG9uQ2hpbGRyZW5Cb3VuZCk7XG59XG5cblxuZnVuY3Rpb24gTUxDb21ib0xpc3Qkc2V0RGF0YVZhbGlkYXRpb24oZGF0YVZhbGlkYXRpb24pIHtcbiAgICBpZiAodHlwZW9mIGRhdGFWYWxpZGF0aW9uID09ICdmdW5jdGlvbicpXG4gICAgICAgIHRoaXMuX2RhdGFWYWxpZGF0aW9uID0gZGF0YVZhbGlkYXRpb247XG59XG5cbmZ1bmN0aW9uIE1MQ29tYm9MaXN0JHNldE9wdGlvbnMoYXJyKSB7XG4gICAgdGhpcy5fY29tYm8uc2V0T3B0aW9ucyhhcnIpO1xufVxuXG5cbmZ1bmN0aW9uIE1MQ29tYm9MaXN0JGNsZWFyQ29tYm9JbnB1dCAoKSB7XG4gICAgdGhpcy5fY29tYm8uY2xlYXJDb21ib0lucHV0KCk7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogSGlkZXMgYWRkIGJ1dHRvblxuICogQHBhcmFtIHtCb29sZWFufSBzaG93XG4gKi9cbmZ1bmN0aW9uIE1MQ29tYm9MaXN0JHRvZ2dsZUFkZEJ1dHRvbihzaG93KSB7XG4gICAgdGhpcy5fY29tYm8udG9nZ2xlQWRkQnV0dG9uKHNob3cpO1xufVxuXG5cbmZ1bmN0aW9uIE1MQ29tYm9MaXN0JHNldEFkZEl0ZW1Qcm9tcHQocHJvbXB0KSB7XG4gICB0aGlzLl9jb21iby5zZXRBZGRJdGVtUHJvbXB0KHByb21wdCk7XG59XG5cblxuZnVuY3Rpb24gTUxDb21ib0xpc3QkZGVzdHJveSgpIHtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLl9jb25uZWN0b3IgJiYgbWlsby5taW5kZXIuZGVzdHJveUNvbm5lY3Rvcih0aGlzLl9jb25uZWN0b3IpO1xuICAgIHRoaXMuX2Nvbm5lY3RvciA9IG51bGw7XG59XG5cblxuZnVuY3Rpb24gb25DaGlsZHJlbkJvdW5kKCkge1xuICAgIHRoaXMudGVtcGxhdGUucmVuZGVyKCkuYmluZGVyKCk7XG4gICAgY29tcG9uZW50U2V0dXAuY2FsbCh0aGlzKTtcbn1cblxuZnVuY3Rpb24gY29tcG9uZW50U2V0dXAoKSB7XG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgJ19jb21ibyc6IHRoaXMuY29udGFpbmVyLnNjb3BlLmNvbWJvLFxuICAgICAgICAnX2xpc3QnOiB0aGlzLmNvbnRhaW5lci5zY29wZS5saXN0XG4gICAgfSk7XG5cbiAgICB0aGlzLl9jb25uZWN0b3IgPSBtaWxvLm1pbmRlcih0aGlzLl9saXN0Lm1vZGVsLCAnPDw8LT4+PicsIHRoaXMubW9kZWwpO1xuICAgIHRoaXMuX2NvbWJvLmRhdGEub24oJycsIHsgc3Vic2NyaWJlcjogb25Db21ib0NoYW5nZSwgY29udGV4dDogdGhpcyB9KTtcbiAgICB0aGlzLl9jb21iby5vbignYWRkaXRlbScsIHsgc3Vic2NyaWJlcjogb25BZGRJdGVtLCBjb250ZXh0OiB0aGlzIH0pO1xufVxuXG5mdW5jdGlvbiBvbkNvbWJvQ2hhbmdlKG1zZywgZGF0YSkge1xuICAgIGlmIChkYXRhLm5ld1ZhbHVlICYmIHRoaXMuX2RhdGFWYWxpZGF0aW9uKG1zZywgZGF0YSwgdGhpcy5fbGlzdC5tb2RlbC5nZXQoKSkpXG4gICAgICAgIHRoaXMuX2xpc3QubW9kZWwucHVzaChkYXRhLm5ld1ZhbHVlKTtcbiAgICB0aGlzLl9jb21iby5kYXRhLmRlbCgpO1xuICAgIC8vIGJlY2F1c2Ugb2Ygc3VwZXJjb21ibyBsaXN0ZW5lcnMgb2ZmIHlvdSBoYXZlIHRvIHNldCBfdmFsdWUgZXhwbGljaXRseVxuICAgIHRoaXMuX2NvbWJvLmRhdGEuX3ZhbHVlID0gJyc7XG59XG5cbmZ1bmN0aW9uIG9uSXRlbXNDaGFuZ2UobXNnLCBkYXRhKSB7XG4gICAgdGhpcy5kYXRhLmRpc3BhdGNoU291cmNlTWVzc2FnZShDT01CT19MSVNUX0NIQU5HRV9NRVNTQUdFKTtcbn1cblxuZnVuY3Rpb24gTUxDb21ib0xpc3RfZ2V0KCkge1xuICAgIHZhciB2YWx1ZSA9IHRoaXMubW9kZWwuZ2V0KCk7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyA/IF8uY2xvbmUodmFsdWUpIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIE1MQ29tYm9MaXN0X3NldCh2YWx1ZSkge1xuICAgIHRoaXMubW9kZWwuc2V0KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gTUxDb21ib0xpc3RfZGVsKCkge1xuICAgIHJldHVybiB0aGlzLm1vZGVsLnNldChbXSk7XG59XG5cblxuZnVuY3Rpb24gb25BZGRJdGVtKG1zZywgZGF0YSkge1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoJ2FkZGl0ZW0nLCBkYXRhKTtcbiAgICB0aGlzLmV2ZW50cy5wb3N0TWVzc2FnZSgnbWlsb19jb21ib2xpc3RhZGRpdGVtJywgZGF0YSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG52YXIgTUxEYXRlID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTERhdGUnLCB7XG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZGF0YToge1xuICAgICAgICBnZXQ6IE1MRGF0ZV9nZXQsXG4gICAgICAgIHNldDogTUxEYXRlX3NldCxcbiAgICAgICAgZGVsOiBNTERhdGVfZGVsLFxuICAgIH0sXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLWRhdGUnXG4gICAgfVxufSk7XG5cbl8uZXh0ZW5kUHJvdG8oTUxEYXRlLCB7XG4gICAgZ2V0TWluOiBNTERhdGUkZ2V0TWluLFxuICAgIHNldE1pbjogTUxEYXRlJHNldE1pbixcbiAgICBnZXRNYXg6IE1MRGF0ZSRnZXRNYXgsXG4gICAgc2V0TWF4OiBNTERhdGUkc2V0TWF4XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTERhdGUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MRGF0ZTtcblxuXG5mdW5jdGlvbiBNTERhdGUkZ2V0TWluKCkge1xuICAgIHJldHVybiBfLmRhdGUodGhpcy5lbC5taW4pO1xufVxuXG5cbmZ1bmN0aW9uIE1MRGF0ZSRzZXRNaW4odmFsdWUpIHtcbiAgICB2YXIgZGF0ZSA9IF8udG9EYXRlKHZhbHVlKTtcblxuICAgIHRoaXMuZWwubWluID0gZGF0ZSA/IHRvSVNPODYwMUZvcm1hdChkYXRlKSA6ICcnO1xufVxuXG5cbmZ1bmN0aW9uIE1MRGF0ZSRnZXRNYXgoKSB7XG4gICAgcmV0dXJuIF8uZGF0ZSh0aGlzLmVsLm1heCk7XG59XG5cblxuZnVuY3Rpb24gTUxEYXRlJHNldE1heCh2YWx1ZSkge1xuICAgIHZhciBkYXRlID0gXy50b0RhdGUodmFsdWUpO1xuXG4gICAgdGhpcy5lbC5tYXggPSBkYXRlID8gdG9JU084NjAxRm9ybWF0KGRhdGUpIDogJyc7XG59XG5cblxuZnVuY3Rpb24gTUxEYXRlX2dldCgpIHtcbiAgICByZXR1cm4gXy50b0RhdGUodGhpcy5lbC52YWx1ZSk7XG59XG5cblxuZnVuY3Rpb24gTUxEYXRlX3NldCh2YWx1ZSkge1xuICAgIHZhciBkYXRlID0gXy50b0RhdGUodmFsdWUpO1xuXG4gICAgdGhpcy5lbC52YWx1ZSA9IGRhdGUgPyB0b0lTTzg2MDFGb3JtYXQoZGF0ZSkgOiAnJztcblxuICAgIGRpc3BhdGNoSW5wdXRNZXNzYWdlLmNhbGwodGhpcyk7XG59XG5cbmZ1bmN0aW9uIE1MRGF0ZV9kZWwoKSB7XG4gICAgdGhpcy5lbC52YWx1ZSA9ICcnO1xuXG4gICAgZGlzcGF0Y2hJbnB1dE1lc3NhZ2UuY2FsbCh0aGlzKTtcbn1cblxuXG5mdW5jdGlvbiBkaXNwYXRjaElucHV0TWVzc2FnZSgpIHtcbiAgICB0aGlzLmRhdGEuZGlzcGF0Y2hTb3VyY2VNZXNzYWdlKCdpbnB1dCcpOyAvLyBEaXNwYXRjaCB0aGUgJ2lucHV0JyAodXN1YWxseSBkaXNwYXRjaGVkIGJ5IHRoZSB1bmRlcmx5aW5nIDxpbnB1dD4gZWxlbWVudCkgZXZlbnQgc28gdGhhdCB0aGUgZGF0YSBjaGFuZ2UgY2FuIGJlIGxpc3RlbmVkIHRvXG59XG5cblxuZnVuY3Rpb24gdG9JU084NjAxRm9ybWF0KGRhdGUpIHtcbiAgICB2YXIgZGF0ZUFyciA9IFtcbiAgICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICBwYWQoZGF0ZS5nZXRNb250aCgpICsgMSksXG4gICAgICAgIHBhZChkYXRlLmdldERhdGUoKSlcbiAgICBdO1xuXG4gICAgdmFyIGRhdGVTdHIgPSBkYXRlQXJyLmpvaW4oJy0nKTtcblxuICAgIHJldHVybiBkYXRlU3RyO1xuXG4gICAgZnVuY3Rpb24gcGFkKG4pIHsgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4gOiBuOyB9XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKTtcblxuXG52YXIgTUxEcm9wVGFyZ2V0ID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTERyb3BUYXJnZXQnLCBbJ2Ryb3AnXSk7XG5cblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTERyb3BUYXJnZXQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MRHJvcFRhcmdldDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGRvVCA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnV0aWwuZG9UXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5JylcbiAgICAsIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgdW5pcXVlSWQgPSByZXF1aXJlKCcuLi8uLi91dGlsL3VuaXF1ZV9pZCcpO1xuXG52YXIgVFJFRV9URU1QTEFURSA9ICc8dWwgY2xhc3M9XCJtbC11aS1mb2xkdHJlZS1saXN0XCI+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7fiBpdC5kYXRhLml0ZW1zIDppdGVtOmluZGV4IH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB2YXIgaGFzU3ViVHJlZSA9IGl0ZW0uaXRlbXMgJiYgaXRlbS5pdGVtcy5sZW5ndGg7IH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkge3s/IGhhc1N1YlRyZWUgfX1jbGFzcz1cIm1sLXVpLWZvbGR0cmVlLS1oYXMtbXVsdGlwbGVcInt7P319PlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC11aS1mb2xkdHJlZS1pdGVtXCI+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7PyBoYXNTdWJUcmVlIH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtdWktZm9sZHRyZWUtYnV0dG9uXCI+PC9kaXY+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7P319XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7PSBpdC5pdGVtVGVtcGxhdGUoeyBpdGVtOiBpdGVtLCBpZDogaXQuaXRlbUlEc1tpbmRleF0gfSkgfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ez8gaGFzU3ViVHJlZSB9fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ez0gaXQudHJlZVRlbXBsYXRlKGl0ZW0pIH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3s/fX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7fn19XFxcbiAgICAgICAgICAgICAgICAgICAgPC91bD4nO1xuXG52YXIgREVGQVVMVF9DT01QSUxFRF9JVEVNX1RFTVBMQVRFID0gZG9ULmNvbXBpbGUoJ1xcXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1sLXVpLWZvbGR0cmVlLWxhYmVsXCIgZGF0YS1pdGVtLWlkPVwie3s9IGl0LmlkIH19XCI+XFxcbiAgICAgICAgICAgICAgICB7ez0gaXQuaXRlbS5sYWJlbCB9fVxcXG4gICAgICAgICAgICA8L3NwYW4+JylcbiAgICAsIENPTVBJTEVEX1RSRUVfVEVNUExBVEUgPSBkb1QuY29tcGlsZShUUkVFX1RFTVBMQVRFKTtcblxuXG52YXIgTUxGb2xkVHJlZSA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxGb2xkVHJlZScsIHtcbiAgICBjb250YWluZXI6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHtcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICAgICdjbGljayBkYmxjbGljayc6IHsgc3Vic2NyaWJlcjogb25JdGVtRXZlbnQsIGNvbnRleHQ6ICdvd25lcicgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktZm9sZHRyZWUtbWFpbidcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTEZvbGRUcmVlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTEZvbGRUcmVlO1xuXG5fLmV4dGVuZFByb3RvKE1MRm9sZFRyZWUsIHtcbiAgICBzZXRJdGVtVGVtcGxhdGU6IE1MRm9sZFRyZWUkc2V0SXRlbVRlbXBsYXRlLFxuICAgIHJlbmRlclRyZWU6IE1MRm9sZFRyZWUkcmVuZGVyVHJlZVxufSk7XG5cbmZ1bmN0aW9uIGZvbGRVbmZvbGQoZWwpIHtcbiAgICBlbC5jbGFzc0xpc3QudG9nZ2xlKCdtbC11aS1mb2xkdHJlZS0tdW5mb2xkJyk7XG59XG5cbmZ1bmN0aW9uIGl0ZW1NZXNzYWdlKG1zZywgZWwpIHtcbiAgICB2YXIgaWQgPSBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaXRlbS1pZCcpXG4gICAgICAgICwgaXRlbSA9IHRoaXMuX2l0ZW1zTWFwW2lkXTtcblxuICAgIHRoaXMucG9zdE1lc3NhZ2UoJ21sZm9sZHRyZWVfJyArIG1zZywge1xuICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICBlbDogZWxcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gb25JdGVtRXZlbnQobXNnLCBlKSB7XG4gICAgdmFyIGVsID0gZS50YXJnZXQ7XG4gICAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnbWwtdWktZm9sZHRyZWUtYnV0dG9uJykpXG4gICAgICAgIGZvbGRVbmZvbGQoZWwucGFyZW50Tm9kZS5wYXJlbnROb2RlKTtcbiAgICBlbHNlIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ21sLXVpLWZvbGR0cmVlLWxhYmVsJykpXG4gICAgICAgIGl0ZW1NZXNzYWdlLmNhbGwodGhpcywgbXNnLCBlbCk7XG4gICAgZWxzZSByZXR1cm47XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbn1cblxuZnVuY3Rpb24gTUxGb2xkVHJlZSRzZXRJdGVtVGVtcGxhdGUgKHRlbXBsYXRlU3RyKSB7XG4gICAgdGhpcy5faXRlbVRlbXBsYXRlID0gZG9ULmNvbXBpbGUodGVtcGxhdGVTdHIpO1xufVxuXG5mdW5jdGlvbiBNTEZvbGRUcmVlJHJlbmRlclRyZWUgKGRhdGEpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgc2VsZi5faXRlbXNNYXAgPSB7fTtcbiAgICB0aGlzLmVsLmlubmVySFRNTCA9IF9yZW5kZXJUcmVlKGRhdGEpO1xuXG4gICAgZnVuY3Rpb24gX3JlbmRlclRyZWUgKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEuaXRlbXMpXG4gICAgICAgICAgICB2YXIgaXRlbXNJRHMgPSBfLm1hcChkYXRhLml0ZW1zLCBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlkID0gdW5pcXVlSWQoKTtcbiAgICAgICAgICAgICAgICBzZWxmLl9pdGVtc01hcFtpZF0gPSBpdGVtO1xuICAgICAgICAgICAgICAgIHJldHVybiBpZDsgXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gQ09NUElMRURfVFJFRV9URU1QTEFURSh7XG4gICAgICAgICAgICBpdGVtSURzOiBpdGVtc0lEcyxcbiAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICBpdGVtVGVtcGxhdGU6IHNlbGYuX2l0ZW1UZW1wbGF0ZSB8fCBERUZBVUxUX0NPTVBJTEVEX0lURU1fVEVNUExBVEUsXG4gICAgICAgICAgICB0cmVlVGVtcGxhdGU6IF9yZW5kZXJUcmVlXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpO1xuXG5cbnZhciBNTEdyb3VwID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTEdyb3VwJywge1xuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkLFxuICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktZ3JvdXAnXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxHcm91cCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxHcm91cDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpO1xuXG5cbnZhciBNTEh5cGVybGluayA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxIeXBlcmxpbmsnLCB7XG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZGF0YTogdW5kZWZpbmVkLFxuICAgIGRvbToge1xuICAgICAgICBjbHM6ICdtbC11aS1oeXBlcmxpbmsnXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxIeXBlcmxpbmspO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MSHlwZXJsaW5rO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5JylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG52YXIgSU1BR0VfQ0hBTkdFX01FU1NBR0UgPSAnbWxpbWFnZWNoYW5nZSc7XG5cbnZhciBNTEltYWdlID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTEltYWdlJywge1xuICAgIGRhdGE6IHtcbiAgICAgICAgc2V0OiBNTEltYWdlX3NldCxcbiAgICAgICAgZ2V0OiBNTEltYWdlX2dldCxcbiAgICAgICAgZGVsOiBNTEltYWdlX2RlbCxcbiAgICAgICAgc3BsaWNlOiB1bmRlZmluZWQsXG4gICAgICAgIGV2ZW50OiBJTUFHRV9DSEFOR0VfTUVTU0FHRVxuICAgIH0sXG4gICAgbW9kZWw6IHtcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICAgICcuc3JjJzogeyBzdWJzY3JpYmVyOiBvbk1vZGVsQ2hhbmdlLCBjb250ZXh0OiAnb3duZXInIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgY29udGFpbmVyOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIHRhZ05hbWU6ICdpbWcnLFxuICAgICAgICBjbHM6ICdtbC11aS1pbWFnZSdcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTEltYWdlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTEltYWdlO1xuXG5cbl8uZXh0ZW5kUHJvdG8oTUxJbWFnZSwge1xuICAgIGluaXQ6IE1MSW1hZ2UkaW5pdFxufSk7XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXplIHJhZGlvIGdyb3VwIGFuZCBzZXR1cFxuICovXG5mdW5jdGlvbiBNTEltYWdlJGluaXQoKSB7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiBTZXRzIGltYWdlIHZhbHVlXG4gKiBSZXBsYWNlcyB0aGUgZGF0YSBzZXQgb3BlcmF0aW9uIHRvIGRlYWwgd2l0aCByYWRpbyBidXR0b25zXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHNldFxuICovXG5mdW5jdGlvbiBNTEltYWdlX3NldCh2YWx1ZSkge1xuICAgIHRoaXMubW9kZWwuc2V0KHZhbHVlKTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5cblxuLyoqXG4gKiBHZXRzIGdyb3VwIHZhbHVlXG4gKiBSZXRyaWV2ZXMgdGhlIHNlbGVjdGVkIHZhbHVlIG9mIHRoZSBncm91cFxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gTUxJbWFnZV9nZXQoKSB7XG4gICAgdmFyIHZhbHVlID0gdGhpcy5tb2RlbC5nZXQoKTtcbiAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnID8gXy5jbG9uZSh2YWx1ZSkgOiB2YWx1ZTtcbn1cblxuXG4vKipcbiAqIERlbGV0ZWQgZ3JvdXAgdmFsdWVcbiAqIERlbGV0ZXMgdGhlIHZhbHVlIG9mIHRoZSBncm91cCwgc2V0dGluZyBpdCB0byBlbXB0eVxuICovXG5mdW5jdGlvbiBNTEltYWdlX2RlbCgpIHtcbiAgICB0aGlzLm1vZGVsLmRlbCgpO1xufVxuXG5cbi8vIFBvc3QgdGhlIGRhdGEgY2hhbmdlXG5mdW5jdGlvbiBkaXNwYXRjaENoYW5nZU1lc3NhZ2UoKSB7XG4gICAgdGhpcy5kYXRhLmRpc3BhdGNoU291cmNlTWVzc2FnZShJTUFHRV9DSEFOR0VfTUVTU0FHRSk7XG59XG5cblxuZnVuY3Rpb24gb25Nb2RlbENoYW5nZShwYXRoLCBkYXRhKSB7XG4gICAgdGhpcy5lbC5zcmMgPSBkYXRhLm5ld1ZhbHVlO1xuICAgIGRpc3BhdGNoQ2hhbmdlTWVzc2FnZS5jYWxsKHRoaXMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5JylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG52YXIgTUxJbnB1dCA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxJbnB1dCcsIHtcbiAgICBkYXRhOiB1bmRlZmluZWQsXG4gICAgZXZlbnRzOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLWlucHV0J1xuICAgIH1cbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MSW5wdXQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MSW5wdXQ7XG5cbl8uZXh0ZW5kUHJvdG8oTUxJbnB1dCwge1xuICAgIGRpc2FibGU6IE1MSW5wdXQkZGlzYWJsZSxcbiAgICBpc0Rpc2FibGVkOiBNTElucHV0JGlzRGlzYWJsZWQsXG4gICAgc2V0TWF4TGVuZ3RoOiBNTElucHV0JHNldE1heExlbmd0aFxufSk7XG5cbmZ1bmN0aW9uIE1MSW5wdXQkZGlzYWJsZShkaXNhYmxlKSB7XG4gICAgdGhpcy5lbC5kaXNhYmxlZCA9IGRpc2FibGU7XG59XG5cbmZ1bmN0aW9uIE1MSW5wdXQkaXNEaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmVsLmRpc2FibGVkO1xufVxuXG5mdW5jdGlvbiBNTElucHV0JHNldE1heExlbmd0aChsZW5ndGgpIHtcbiAgICB0aGlzLmVsLnNldEF0dHJpYnV0ZSgnbWF4bGVuZ3RoJywgbGVuZ3RoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cbnZhciBJTlBVVF9MSVNUX0NIQU5HRV9NRVNTQUdFID0gJ21saW5wdXRsaXN0Y2hhbmdlJztcblxudmFyIGFzeW5jSGFuZGxlciA9IGZ1bmN0aW9uICh2YWx1ZSwgY2FsbGJhY2spIHtjYWxsYmFjayh2YWx1ZSk7fTtcblxudmFyIE1MSW5wdXRMaXN0ID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTElucHV0TGlzdCcsIHtcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktaW5wdXQtbGlzdCdcbiAgICB9LFxuICAgIGRhdGE6IHtcbiAgICAgICAgZ2V0OiBNTElucHV0TGlzdF9nZXQsXG4gICAgICAgIHNldDogTUxJbnB1dExpc3Rfc2V0LFxuICAgICAgICBkZWw6IE1MSW5wdXRMaXN0X2RlbCxcbiAgICAgICAgc3BsaWNlOiBNTElucHV0TGlzdF9zcGxpY2UsXG4gICAgICAgIGV2ZW50OiBJTlBVVF9MSVNUX0NIQU5HRV9NRVNTQUdFXG4gICAgfSxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBjb250YWluZXI6IHVuZGVmaW5lZCxcbiAgICBtb2RlbDoge1xuICAgICAgICBtZXNzYWdlczoge1xuICAgICAgICAgICAgJyoqKic6IHsgc3Vic2NyaWJlcjogb25JdGVtc0NoYW5nZSwgY29udGV4dDogJ293bmVyJyB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHRlbXBsYXRlOiB7XG4gICAgICAgIHRlbXBsYXRlOiAnXFxcbiAgICAgICAgICAgIDxkaXYgbWwtYmluZD1cIk1MTGlzdDpsaXN0XCI+XFxcbiAgICAgICAgICAgICAgICA8ZGl2IG1sLWJpbmQ9XCJNTExpc3RJdGVtOml0ZW1cIiBjbGFzcz1cImxpc3QtaXRlbVwiPlxcXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIG1sLWJpbmQ9XCJbZGF0YV06bGFiZWxcIj48L3NwYW4+XFxcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gbWwtYmluZD1cIltldmVudHNdOmRlbGV0ZUJ0blwiIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1yZW1vdmVcIj48L3NwYW4+XFxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXFxuICAgICAgICAgICAgPC9kaXY+XFxcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1sLWJpbmQ9XCJNTElucHV0OmlucHV0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIj5cXFxuICAgICAgICAgICAgPGJ1dHRvbiBtbC1iaW5kPVwiTUxCdXR0b246YnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIj5cXFxuICAgICAgICAgICAgICAgIEFkZFxcXG4gICAgICAgICAgICA8L2J1dHRvbj4nXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxJbnB1dExpc3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MSW5wdXRMaXN0O1xuXG5fLmV4dGVuZFByb3RvKE1MSW5wdXRMaXN0LCB7XG4gICAgaW5pdDogTUxJbnB1dExpc3QkaW5pdCxcbiAgICBzZXRBc3luYzogTUxJbnB1dExpc3Qkc2V0QXN5bmMsXG4gICAgc2V0UGxhY2VIb2xkZXI6IE1MSW5wdXRMaXN0JHNldFBsYWNlSG9sZGVyLFxuICAgIGRlc3Ryb3k6IE1MSW5wdXRMaXN0JGRlc3Ryb3lcbn0pO1xuXG5mdW5jdGlvbiBNTElucHV0TGlzdCRpbml0KCkge1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMub25jZSgnY2hpbGRyZW5ib3VuZCcsIG9uQ2hpbGRyZW5Cb3VuZCk7XG4gICAgdGhpcy5tb2RlbC5zZXQoW10pO1xufVxuXG5mdW5jdGlvbiBvbkNoaWxkcmVuQm91bmQoKSB7XG4gICAgcmVuZGVyLmNhbGwodGhpcyk7XG59XG5cbmZ1bmN0aW9uIE1MSW5wdXRMaXN0JHNldFBsYWNlSG9sZGVyKHBsYWNlSG9sZGVyKSB7XG4gICAgdGhpcy5faW5wdXQuZWwuc2V0QXR0cmlidXRlKCdwbGFjZUhvbGRlcicsIHBsYWNlSG9sZGVyKTtcbn1cblxuZnVuY3Rpb24gTUxJbnB1dExpc3Qkc2V0QXN5bmMobmV3SGFuZGxlcikge1xuICAgIGFzeW5jSGFuZGxlciA9IG5ld0hhbmRsZXIgfHwgYXN5bmNIYW5kbGVyO1xufVxuXG5mdW5jdGlvbiBNTElucHV0TGlzdCRkZXN0cm95KCkge1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMuX2Nvbm5lY3RvciAmJiBtaWxvLm1pbmRlci5kZXN0cm95Q29ubmVjdG9yKHRoaXMuX2Nvbm5lY3Rvcik7XG4gICAgdGhpcy5fY29ubmVjdG9yID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHRoaXMudGVtcGxhdGUucmVuZGVyKCkuYmluZGVyKCk7XG4gICAgY29tcG9uZW50U2V0dXAuY2FsbCh0aGlzKTtcbn1cblxuZnVuY3Rpb24gY29tcG9uZW50U2V0dXAoKSB7XG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgJ19pbnB1dCc6IHRoaXMuY29udGFpbmVyLnNjb3BlLmlucHV0LFxuICAgICAgICAnX2J1dHRvbic6IHRoaXMuY29udGFpbmVyLnNjb3BlLmJ1dHRvbixcbiAgICAgICAgJ19saXN0JzogdGhpcy5jb250YWluZXIuc2NvcGUubGlzdFxuICAgIH0pO1xuICAgIHRoaXMuX2Nvbm5lY3RvciA9IG1pbG8ubWluZGVyKHRoaXMuX2xpc3QubW9kZWwsICc8PDwtPj4+JywgdGhpcy5tb2RlbCk7XG4gICAgdGhpcy5fYnV0dG9uLmV2ZW50cy5vbignY2xpY2snLCB7c3Vic2NyaWJlcjogb25DbGljaywgY29udGV4dDogdGhpcyB9KTsgICBcbn1cblxuZnVuY3Rpb24gb25DbGljayhtc2cpIHtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLl9pbnB1dC5kYXRhLmdldCgwKTtcbiAgICBpZiAodGhpcy5faW5wdXQuZGF0YSlcbiAgICAgICAgYXN5bmNIYW5kbGVyKHZhbHVlLCBmdW5jdGlvbiAobGFiZWwsIHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9saXN0Lm1vZGVsLnB1c2goeyBsYWJlbDogbGFiZWwsIHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9pbnB1dC5kYXRhLmRlbCgpO1xufVxuXG5mdW5jdGlvbiBvbkl0ZW1zQ2hhbmdlKG1zZywgZGF0YSkge1xuICAgIHRoaXMuZGF0YS5kaXNwYXRjaFNvdXJjZU1lc3NhZ2UoSU5QVVRfTElTVF9DSEFOR0VfTUVTU0FHRSk7XG59XG5cbmZ1bmN0aW9uIE1MSW5wdXRMaXN0X2dldCgpIHtcbiAgICB2YXIgbW9kZWwgPSB0aGlzLm1vZGVsLmdldCgpO1xuICAgIHJldHVybiBtb2RlbCA/IF8uY2xvbmUobW9kZWwpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBNTElucHV0TGlzdF9zZXQodmFsdWUpIHtcbiAgICB0aGlzLm1vZGVsLnNldCh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIE1MSW5wdXRMaXN0X2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbC5zZXQoW10pO1xufVxuXG5mdW5jdGlvbiBNTElucHV0TGlzdF9zcGxpY2UoKSB7IC8vIC4uLiBhcmd1bWVudHNcbiAgICB0aGlzLm1vZGVsLnNwbGljZS5hcHBseSh0aGlzLm1vZGVsLCBhcmd1bWVudHMpO1xufSIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cbnZhciBMSVNUX0NIQU5HRV9NRVNTQUdFID0gJ21sbGlzdGNoYW5nZSdcbiAgICAsIERFTEVURV9CVVRUT05fTkFNRSA9ICdkZWxldGVCdG4nO1xuXG5cbnZhciBNTExpc3QgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MTGlzdCcsIHtcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktbGlzdCdcbiAgICB9LFxuICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBtb2RlbDogdW5kZWZpbmVkLFxuICAgIGxpc3Q6IHVuZGVmaW5lZFxufSk7XG5cblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTExpc3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MTGlzdDtcblxuXG5fLmV4dGVuZFByb3RvKE1MTGlzdCwge1xuICAgIGluaXQ6IE1MTGlzdCRpbml0LFxuICAgIGRlc3Ryb3k6IE1MTGlzdCRkZXN0cm95LFxuICAgIHJlbW92ZUl0ZW06IE1MTGlzdCRyZW1vdmVJdGVtLFxuICAgIG1vdmVJdGVtOiBNTExpc3QkbW92ZUl0ZW1cbn0pO1xuXG5cbmZ1bmN0aW9uIE1MTGlzdCRpbml0KCkge1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMub24oJ2NoaWxkcmVuYm91bmQnLCBvbkNoaWxkcmVuQm91bmQpO1xufVxuXG5cbmZ1bmN0aW9uIE1MTGlzdCRkZXN0cm95KCkge1xuICAgIHRoaXMuX2Nvbm5lY3RvciAmJiBtaWxvLm1pbmRlci5kZXN0cm95Q29ubmVjdG9yKHRoaXMuX2Nvbm5lY3Rvcik7XG4gICAgdGhpcy5fY29ubmVjdG9yID0gbnVsbDtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG5mdW5jdGlvbiBNTExpc3QkcmVtb3ZlSXRlbShpbmRleCl7XG4gICAgdGhpcy5tb2RlbC5zcGxpY2UoaW5kZXgsIDEpO1xufVxuXG5cbmZ1bmN0aW9uIE1MTGlzdCRtb3ZlSXRlbShmcm9tLCB0bykge1xuICAgIHZhciBzcGxpY2VkRGF0YSA9IHRoaXMubW9kZWwuc3BsaWNlKGZyb20sIDEpO1xuICAgIHJldHVybiB0aGlzLm1vZGVsLnNwbGljZSh0bywgMCwgc3BsaWNlZERhdGFbMF0pO1xufVxuXG5cbmZ1bmN0aW9uIG9uQ2hpbGRyZW5Cb3VuZCgpIHtcbiAgICB0aGlzLm1vZGVsLnNldChbXSk7XG4gICAgdGhpcy5fY29ubmVjdG9yID0gbWlsby5taW5kZXIodGhpcy5tb2RlbCwgJzw8PC0nLCB0aGlzLmRhdGEpLmRlZmVyQ2hhbmdlTW9kZSgnPDw8LT4+PicpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBEcmFnRHJvcCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZHJhZ2Ryb3AnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxudmFyIExJU1RJVEVNX0NIQU5HRV9NRVNTQUdFID0gJ21sbGlzdGl0ZW1jaGFuZ2UnXG5cbnZhciBNTExpc3RJdGVtID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTExpc3RJdGVtJywge1xuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkLFxuICAgIGRvbTogdW5kZWZpbmVkLFxuICAgIGRyYWc6IHtcbiAgICAgICAgbWV0YToge1xuICAgICAgICAgICAgcGFyYW1zOiBnZXRNZXRhRGF0YVxuICAgICAgICB9XG4gICAgfSxcbiAgICBkcm9wOiB7XG4gICAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgICAgICAnZHJhZ2VudGVyJzogeyBzdWJzY3JpYmVyOiBvbkRyYWdIb3ZlciwgY29udGV4dDogJ293bmVyJyB9LFxuICAgICAgICAgICAgJ2RyYWdvdmVyJzogeyBzdWJzY3JpYmVyOiBvbkRyYWdIb3ZlciwgY29udGV4dDogJ293bmVyJyB9LFxuICAgICAgICAgICAgJ2RyYWdsZWF2ZSc6IHsgc3Vic2NyaWJlcjogb25EcmFnT3V0LCBjb250ZXh0OiAnb3duZXInIH0sXG4gICAgICAgICAgICAnZHJvcCc6IHsgc3Vic2NyaWJlcjogb25JdGVtRHJvcCwgY29udGV4dDogJ293bmVyJyB9XG4gICAgICAgIH0sXG4gICAgICAgIGFsbG93OiB7XG4gICAgICAgICAgICBjb21wb25lbnRzOiBpc0NvbXBvbmVudEFsbG93ZWRcbiAgICAgICAgfVxuICAgIH0sXG4gICAgZGF0YToge1xuICAgICAgICBnZXQ6IE1MTGlzdEl0ZW1fZ2V0LFxuICAgICAgICBzZXQ6IE1MTGlzdEl0ZW1fc2V0LFxuICAgICAgICBkZWw6IE1MTGlzdEl0ZW1fZGVsLFxuICAgICAgICBldmVudDogTElTVElURU1fQ0hBTkdFX01FU1NBR0VcbiAgICB9LFxuICAgIG1vZGVsOiB1bmRlZmluZWQsXG4gICAgaXRlbTogdW5kZWZpbmVkXG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTExpc3RJdGVtKTtcblxudmFyIE1MTGlzdEl0ZW0gPSBtb2R1bGUuZXhwb3J0cyA9IE1MTGlzdEl0ZW07XG5cblxuXy5leHRlbmRQcm90byhNTExpc3RJdGVtLCB7XG4gICAgaW5pdDogTUxMaXN0SXRlbSRpbml0LFxuICAgIG1vdmVJdGVtOiBNTExpc3RJdGVtJG1vdmVJdGVtLFxuICAgIHJlbW92ZUl0ZW06IE1MTGlzdEl0ZW0kcmVtb3ZlSXRlbSxcbiAgICBpc0Ryb3BBbGxvd2VkOiBNTExpc3RJdGVtJGlzRHJvcEFsbG93ZWRcbn0pO1xuXG5cbmZ1bmN0aW9uIE1MTGlzdEl0ZW0kaW5pdCgpIHtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLm9uKCdjaGlsZHJlbmJvdW5kJywgb25DaGlsZHJlbkJvdW5kKTtcbn1cblxuXG5mdW5jdGlvbiBvbkNoaWxkcmVuQm91bmQoKSB7XG4gICAgdmFyIGRlbGV0ZUJ0biA9IHRoaXMuY29udGFpbmVyLnNjb3BlLmRlbGV0ZUJ0bjtcbiAgICBkZWxldGVCdG4gJiYgZGVsZXRlQnRuLmV2ZW50cy5vbignY2xpY2snLCB7IHN1YnNjcmliZXI6IHRoaXMucmVtb3ZlSXRlbSwgY29udGV4dDogdGhpcyB9KTtcbn1cblxuXG5mdW5jdGlvbiBNTExpc3RJdGVtJHJlbW92ZUl0ZW0oKSB7XG4gICAgdHJ5IHsgdmFyIGxpc3RPd25lciA9IHRoaXMuaXRlbS5saXN0Lm93bmVyOyB9IGNhdGNoKGUpIHt9XG4gICAgbGlzdE93bmVyICYmIGxpc3RPd25lci5yZW1vdmVJdGVtKHRoaXMuaXRlbS5pbmRleCk7XG59XG5cblxuZnVuY3Rpb24gTUxMaXN0SXRlbSRtb3ZlSXRlbShpbmRleCkge1xuICAgIHZhciBsaXN0T3duZXIgPSB0aGlzLml0ZW0ubGlzdC5vd25lcjtcbiAgICBsaXN0T3duZXIgJiYgbGlzdE93bmVyLm1vdmVJdGVtKHRoaXMuaXRlbS5pbmRleCwgaW5kZXgpO1xufVxuXG5cbmZ1bmN0aW9uIE1MTGlzdEl0ZW0kaXNEcm9wQWxsb3dlZChtZXRhLCBkcmFnRHJvcCl7XG4gICAgcmV0dXJuIG1ldGEucGFyYW1zICYmIG1ldGEucGFyYW1zLmluZGV4ICYmIG1ldGEuY29tcENsYXNzID09ICdNTExpc3RJdGVtJztcbn1cblxuXG5mdW5jdGlvbiBpc0NvbXBvbmVudEFsbG93ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNEcm9wQWxsb3dlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5cbmZ1bmN0aW9uIG9uSXRlbURyb3AoZXZlbnRUeXBlLCBldmVudCkge1xuICAgIG9uRHJhZ091dC5jYWxsKHRoaXMpO1xuICAgIHZhciBkdCA9IG5ldyBEcmFnRHJvcChldmVudCk7XG4gICAgdmFyIG1ldGEgPSBkdC5nZXRDb21wb25lbnRNZXRhKCk7XG4gICAgdmFyIHN0YXRlID0gZHQuZ2V0Q29tcG9uZW50U3RhdGUoKTtcbiAgICB2YXIgbGlzdE93bmVyID0gdGhpcy5pdGVtLmxpc3Qub3duZXI7XG4gICAgdmFyIGluZGV4ID0gbWV0YS5wYXJhbXMgJiYgbWV0YS5wYXJhbXMuaW5kZXg7XG5cbiAgICBsaXN0T3duZXIubW92ZUl0ZW0oK2luZGV4LCB0aGlzLml0ZW0uaW5kZXgsIHN0YXRlKTtcbn1cblxuXG5mdW5jdGlvbiBvbkRyYWdIb3ZlcihldmVudFR5cGUsIGV2ZW50KSB7XG4gICAgdGhpcy5kb20uYWRkQ3NzQ2xhc3NlcygnbWwtZHJhZy1vdmVyJyk7XG59XG5cblxuZnVuY3Rpb24gb25EcmFnT3V0KGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAgICB0aGlzLmRvbS5yZW1vdmVDc3NDbGFzc2VzKCdtbC1kcmFnLW92ZXInKTtcbn1cblxuXG5mdW5jdGlvbiBnZXRNZXRhRGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbmRleDogdGhpcy5pdGVtLmluZGV4XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIE1MTGlzdEl0ZW1fZ2V0KCkge1xuICAgIHZhciB2YWx1ZSA9IHRoaXMubW9kZWwuZ2V0KCk7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JyA/IF8uY2xvbmUodmFsdWUpIDogdmFsdWU7XG59XG5cblxuZnVuY3Rpb24gTUxMaXN0SXRlbV9zZXQodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09ICdvYmplY3QnKVxuICAgICAgICB0aGlzLmRhdGEuX3NldCh2YWx1ZSk7XG4gICAgdGhpcy5tb2RlbC5zZXQodmFsdWUpO1xuICAgIF9zZW5kQ2hhbmdlTWVzc2FnZS5jYWxsKHRoaXMpO1xuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuXG5mdW5jdGlvbiBNTExpc3RJdGVtX2RlbCgpIHtcbiAgICB0aGlzLmRhdGEuX2RlbCgpO1xuICAgIHRoaXMubW9kZWwuZGVsKCk7XG4gICAgX3NlbmRDaGFuZ2VNZXNzYWdlLmNhbGwodGhpcyk7ICAgIFxufVxuXG5cbmZ1bmN0aW9uIF9zZW5kQ2hhbmdlTWVzc2FnZSgpIHtcbiAgICB0aGlzLmRhdGEuZGlzcGF0Y2hTb3VyY2VNZXNzYWdlKExJU1RJVEVNX0NIQU5HRV9NRVNTQUdFKTtcbn1cblxuXG5cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCB1bmlxdWVJZCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdW5pcXVlX2lkJylcbiAgICAsIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG52YXIgUkFESU9fQ0hBTkdFX01FU1NBR0UgPSAnbWxyYWRpb2dyb3VwY2hhbmdlJ1xuICAgICwgRUxFTUVOVF9OQU1FX1BST1BFUlRZID0gJ19tbFJhZGlvR3JvdXBFbGVtZW50SUQnXG4gICAgLCBFTEVNRU5UX05BTUVfUFJFRklYID0gJ21sLXJhZGlvLWdyb3VwLSc7XG5cbnZhciBNTFJhZGlvR3JvdXAgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MUmFkaW9Hcm91cCcsIHtcbiAgICBkYXRhOiB7XG4gICAgICAgIHNldDogTUxSYWRpb0dyb3VwX3NldCxcbiAgICAgICAgZ2V0OiBNTFJhZGlvR3JvdXBfZ2V0LFxuICAgICAgICBkZWw6IE1MUmFkaW9Hcm91cF9kZWwsXG4gICAgICAgIHNwbGljZTogdW5kZWZpbmVkLFxuICAgICAgICBldmVudDogUkFESU9fQ0hBTkdFX01FU1NBR0VcbiAgICB9LFxuICAgIG1vZGVsOiB7XG4gICAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgICAgICAnKioqJzogeyBzdWJzY3JpYmVyOiBvbk9wdGlvbnNDaGFuZ2UsIGNvbnRleHQ6ICdvd25lcicgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBldmVudHM6IHtcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICAgICdjbGljayc6IHsgc3Vic2NyaWJlcjogb25Hcm91cENsaWNrLCBjb250ZXh0OiAnb3duZXInIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgY29udGFpbmVyOiB1bmRlZmluZWQsXG4gICAgZG9tOiB7XG4gICAgICAgIGNsczogJ21sLXVpLXJhZGlvLWdyb3VwJ1xuICAgIH0sXG4gICAgdGVtcGxhdGU6IHtcbiAgICAgICAgdGVtcGxhdGU6ICd7e34gaXQucmFkaW9PcHRpb25zIDpvcHRpb24gfX0gXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IyNkZWYuZWxJRDp7ez0gaXQuZWxlbWVudE5hbWUgfX0te3s9IG9wdGlvbi52YWx1ZSB9fSN9fSBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ7ez0gaXQuX3JlbmRlck9wdGlvbnMub3B0aW9uQ3NzQ2xhc3MgfHwgXCInICsgRUxFTUVOVF9OQU1FX1BSRUZJWCArICdvcHRpb25cIiB9fVwiPiBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cInt7IyBkZWYuZWxJRCB9fVwiIHR5cGU9XCJyYWRpb1wiIHZhbHVlPVwie3s9IG9wdGlvbi52YWx1ZSB9fVwiIG5hbWU9XCJ7ez0gaXQuZWxlbWVudE5hbWUgfX1cIj4gXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwie3sjIGRlZi5lbElEIH19XCI+e3s9IG9wdGlvbi5sYWJlbCB9fTwvbGFiZWw+IFxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+IFxcXG4gICAgICAgICAgICAgICAgICAge3t+fX0nXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxSYWRpb0dyb3VwKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNTFJhZGlvR3JvdXA7XG5cblxuXy5leHRlbmRQcm90byhNTFJhZGlvR3JvdXAsIHtcbiAgICBpbml0OiBNTFJhZGlvR3JvdXAkaW5pdCxcbiAgICBkZXN0cm95OiBNTFJhZGlvR3JvdXAkZGVzdHJveSxcbiAgICBzZXRSZW5kZXJPcHRpb25zOiBNTFJhZGlvR3JvdXAkc2V0UmVuZGVyT3B0aW9uc1xufSk7XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXplIHJhZGlvIGdyb3VwIGFuZCBzZXR1cFxuICovXG5mdW5jdGlvbiBNTFJhZGlvR3JvdXAkaW5pdCgpIHtcbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsICdfcmFkaW9MaXN0JywgW10sIF8uQ09ORik7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBFTEVNRU5UX05BTUVfUFJPUEVSVFksIEVMRU1FTlRfTkFNRV9QUkVGSVggKyB1bmlxdWVJZCgpKTtcbiAgICB0aGlzLl9yZW5kZXJPcHRpb25zID0ge307XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuZnVuY3Rpb24gTUxSYWRpb0dyb3VwJHNldFJlbmRlck9wdGlvbnMob3B0aW9ucykge1xuICAgIHRoaXMuX3JlbmRlck9wdGlvbnMgPSBvcHRpb25zO1xufVxuXG5cbi8qKlxuICogU2V0cyBncm91cCB2YWx1ZVxuICogUmVwbGFjZXMgdGhlIGRhdGEgc2V0IG9wZXJhdGlvbiB0byBkZWFsIHdpdGggcmFkaW8gYnV0dG9uc1xuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlIFRoZSB2YWx1ZSB0byBiZSBzZXRcbiAqL1xuZnVuY3Rpb24gTUxSYWRpb0dyb3VwX3NldCh2YWx1ZSkge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5fcmFkaW9MaXN0XG4gICAgICAgICwgc2V0UmVzdWx0O1xuICAgIGlmIChvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICBvcHRpb25zLmZvckVhY2goZnVuY3Rpb24ocmFkaW8pIHtcbiAgICAgICAgICAgIHJhZGlvLmNoZWNrZWQgPSByYWRpby52YWx1ZSA9PSB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChyYWRpby5jaGVja2VkKVxuICAgICAgICAgICAgICAgIHNldFJlc3VsdCA9IHZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICBkaXNwYXRjaENoYW5nZU1lc3NhZ2UuY2FsbCh0aGlzKTtcblxuICAgICAgICByZXR1cm4gc2V0UmVzdWx0O1xuICAgIH1cbn1cblxuXG4vKipcbiAqIEdldHMgZ3JvdXAgdmFsdWVcbiAqIFJldHJpZXZlcyB0aGUgc2VsZWN0ZWQgdmFsdWUgb2YgdGhlIGdyb3VwXG4gKlxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBNTFJhZGlvR3JvdXBfZ2V0KCkge1xuICAgIHZhciBjaGVja2VkID0gXy5maW5kKHRoaXMuX3JhZGlvTGlzdCwgZnVuY3Rpb24ocmFkaW8pIHtcbiAgICAgICAgcmV0dXJuIHJhZGlvLmNoZWNrZWQ7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY2hlY2tlZCAmJiBjaGVja2VkLnZhbHVlIHx8IHVuZGVmaW5lZDtcbn1cblxuXG4vKipcbiAqIERlbGV0ZWQgZ3JvdXAgdmFsdWVcbiAqIERlbGV0ZXMgdGhlIHZhbHVlIG9mIHRoZSBncm91cCwgc2V0dGluZyBpdCB0byBlbXB0eVxuICovXG5mdW5jdGlvbiBNTFJhZGlvR3JvdXBfZGVsKCkge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5fcmFkaW9MaXN0O1xuICAgIGlmIChvcHRpb25zLmxlbmd0aClcbiAgICAgICAgb3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKHJhZGlvKSB7XG4gICAgICAgICAgICByYWRpby5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgIH0pO1xuXG4gICAgZGlzcGF0Y2hDaGFuZ2VNZXNzYWdlLmNhbGwodGhpcyk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuXG4vKipcbiAqIE1hbmFnZSByYWRpbyBjaGlsZHJlbiBjbGlja3NcbiAqL1xuZnVuY3Rpb24gb25Hcm91cENsaWNrKGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0LnR5cGUgPT0gJ3JhZGlvJylcbiAgICAgICAgZGlzcGF0Y2hDaGFuZ2VNZXNzYWdlLmNhbGwodGhpcyk7XG59XG5cbi8vIFBvc3QgdGhlIGRhdGEgY2hhbmdlXG5mdW5jdGlvbiBkaXNwYXRjaENoYW5nZU1lc3NhZ2UoKSB7XG4gICAgdGhpcy5kYXRhLmRpc3BhdGNoU291cmNlTWVzc2FnZShSQURJT19DSEFOR0VfTUVTU0FHRSk7XG59XG5cblxuLy8gU2V0IHJhZGlvIGJ1dHRvbiBjaGlsZHJlbiBvbiBtb2RlbCBjaGFuZ2VcbmZ1bmN0aW9uIG9uT3B0aW9uc0NoYW5nZShwYXRoLCBkYXRhKSB7XG4gICAgdGhpcy50ZW1wbGF0ZS5yZW5kZXIoe1xuICAgICAgICByYWRpb09wdGlvbnM6IHRoaXMubW9kZWwuZ2V0KCksXG4gICAgICAgIGVsZW1lbnROYW1lOiB0aGlzW0VMRU1FTlRfTkFNRV9QUk9QRVJUWV0sXG4gICAgICAgIF9yZW5kZXJPcHRpb25zOiB0aGlzLl9yZW5kZXJPcHRpb25zXG4gICAgfSk7XG5cbiAgICB2YXIgcmFkaW9FbHMgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9XCJyYWRpb1wiXScpXG4gICAgICAgICwgb3B0aW9ucyA9IF8udG9BcnJheShyYWRpb0Vscyk7XG5cbiAgICB0aGlzLl9yYWRpb0xpc3QubGVuZ3RoID0gMDtcbiAgICB0aGlzLl9yYWRpb0xpc3Quc3BsaWNlLmFwcGx5KHRoaXMuX3JhZGlvTGlzdCwgWzAsIDBdLmNvbmNhdChvcHRpb25zKSk7XG59XG5cblxuZnVuY3Rpb24gTUxSYWRpb0dyb3VwJGRlc3Ryb3koKSB7XG4gICAgZGVsZXRlIHRoaXMuX3JhZGlvTGlzdDtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxudmFyIE1MU2VsZWN0ID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTFNlbGVjdCcsIHtcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktc2VsZWN0J1xuICAgIH0sXG4gICAgZGF0YTogdW5kZWZpbmVkLFxuICAgIGV2ZW50czogdW5kZWZpbmVkLFxuICAgIG1vZGVsOiB7XG4gICAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgICAgICAnKionOiB7IHN1YnNjcmliZXI6IG9uT3B0aW9uc0NoYW5nZSwgY29udGV4dDogJ293bmVyJyB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHRlbXBsYXRlOiB7XG4gICAgICAgIHRlbXBsYXRlOiAne3t+IGl0LnNlbGVjdE9wdGlvbnMgOm9wdGlvbiB9fSBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInt7PSBvcHRpb24udmFsdWUgfX1cIiB7ez8gb3B0aW9uLnNlbGVjdGVkIH19c2VsZWN0ZWR7ez99fT57ez0gb3B0aW9uLmxhYmVsIH19PC9vcHRpb24+IFxcXG4gICAgICAgICAgICAgICAgICAge3t+fX0nXG4gICAgfVxufSk7XG5cblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTFNlbGVjdCk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxTZWxlY3Q7XG5cblxuXy5leHRlbmRQcm90byhNTFNlbGVjdCwge1xuICAgIHNldE9wdGlvbnM6IE1MU2VsZWN0JHNldE9wdGlvbnMsXG4gICAgZGlzYWJsZTogTUxTZWxlY3QkZGlzYWJsZVxufSk7XG5cblxuZnVuY3Rpb24gTUxTZWxlY3Qkc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gICAgLy8gU2V0IG9wdGlvbnMgdGVtcG9yYXJpbHkgZGlzYWJsZXMgbW9kZWwgc3Vic2NyaXB0aW9ucyAoQXMgYSB3b3JrYXJvdW5kIGZvciBwZXJmb3JtYW5jZSBpc3N1ZXMgcmVsYXRpbmcgdG8gbW9kZWwgdXBkYXRlcyAvIHRlbXBsYXRlIHJlLXJlbmRlcmluZylcbiAgICB2YXIgbW9kZWxDaGFuZ2VMaXN0ZW5lciA9IHsgY29udGV4dDogdGhpcywgc3Vic2NyaWJlcjogb25PcHRpb25zQ2hhbmdlIH07XG5cbiAgICB0aGlzLm1vZGVsLm9mZignKionLCBtb2RlbENoYW5nZUxpc3RlbmVyKTtcbiAgICB0aGlzLm1vZGVsLnNldChvcHRpb25zKTtcbiAgICB0aGlzLm1vZGVsLm9uKCcqKicsIG1vZGVsQ2hhbmdlTGlzdGVuZXIpO1xuXG4gICAgb25PcHRpb25zQ2hhbmdlLmNhbGwodGhpcyk7XG59XG5cblxuZnVuY3Rpb24gTUxTZWxlY3QkZGlzYWJsZShkaXNhYmxlKSB7XG4gICAgdGhpcy5lbC5kaXNhYmxlZCA9IGRpc2FibGU7XG59XG5cblxuZnVuY3Rpb24gb25PcHRpb25zQ2hhbmdlKHBhdGgsIGRhdGEpIHtcbiAgICB0aGlzLnRlbXBsYXRlLnJlbmRlcih7IHNlbGVjdE9wdGlvbnM6IHRoaXMubW9kZWwuZ2V0KCkgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTUxTdXBlckNvbWJvXG4gKiBBIGNvbWJvIHNlbGVjdCBsaXN0IHdpdGggaW50ZWxsaWdlbnQgc2Nyb2xsaW5nIG9mIHN1cGVyIGxhcmdlIGxpc3RzLlxuICovXG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBkb1QgPSBtaWxvQ29yZS51dGlsLmRvVFxuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXI7XG5cbnZhciBDT01CT19PUEVOID0gJ21sLXVpLXN1cGVyY29tYm8tb3Blbic7XG52YXIgQ09NQk9fQ0hBTkdFX01FU1NBR0UgPSAnbWxzdXBlcmNvbWJvY2hhbmdlJztcblxudmFyIE9QVElPTlNfVEVNUExBVEUgPSAne3t+IGl0LmNvbWJvT3B0aW9ucyA6b3B0aW9uOmluZGV4IH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHt7PyBvcHRpb24uc2VsZWN0ZWR9fWNsYXNzPVwic2VsZWN0ZWRcIiB7ez99fWRhdGEtdmFsdWU9XCJ7ez0gaW5kZXggfX1cIj57ez0gb3B0aW9uLmxhYmVsIH19PC9kaXY+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7fn19JztcblxudmFyIE1BWF9SRU5ERVJFRCA9IDEwMDtcbnZhciBCVUZGRVIgPSAyNTtcbnZhciBERUZBVUxUX0VMRU1FTlRfSEVJR0hUID0gMjA7XG5cbnZhciBNTFN1cGVyQ29tYm8gPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MU3VwZXJDb21ibycsIHtcbiAgICBldmVudHM6IHtcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICAgICdtb3VzZWxlYXZlJzoge3N1YnNjcmliZXI6IG9uTW91c2VMZWF2ZSwgY29udGV4dDogJ293bmVyJ30sXG4gICAgICAgICAgICAnbW91c2VvdmVyJzoge3N1YnNjcmliZXI6IG9uTW91c2VPdmVyLCBjb250ZXh0OiAnb3duZXInfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBkYXRhOiB7XG4gICAgICAgIGdldDogTUxTdXBlckNvbWJvX2dldCxcbiAgICAgICAgc2V0OiBNTFN1cGVyQ29tYm9fc2V0LFxuICAgICAgICBkZWw6IE1MU3VwZXJDb21ib19kZWwsXG4gICAgICAgIHNwbGljZTogdW5kZWZpbmVkLFxuICAgICAgICBldmVudDogQ09NQk9fQ0hBTkdFX01FU1NBR0VcbiAgICB9LFxuICAgIGRvbToge1xuICAgICAgICBjbHM6ICdtbC11aS1zdXBlcmNvbWJvJ1xuICAgIH0sXG4gICAgdGVtcGxhdGU6IHtcbiAgICAgICAgdGVtcGxhdGU6ICc8aW5wdXQgbWwtYmluZD1cIltkYXRhLCBldmVudHNdOmlucHV0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWwtdWktaW5wdXRcIj5cXFxuICAgICAgICAgICAgICAgICAgIDxkaXYgbWwtYmluZD1cIltkb21dOmFkZEl0ZW1EaXZcIiBjbGFzcz1cIm1sLXVpLXN1cGVyY29tYm8tYWRkXCI+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG1sLWJpbmQ9XCI6YWRkUHJvbXB0XCI+PC9zcGFuPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1sLWJpbmQ9XCJbZXZlbnRzLCBkb21dOmFkZEJ0blwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IG1sLXVpLWJ1dHRvblwiPkFkZDwvYnV0dG9uPlxcXG4gICAgICAgICAgICAgICAgICAgPC9kaXY+XFxcbiAgICAgICAgICAgICAgICAgICA8ZGl2IG1sLWJpbmQ9XCJbZG9tLCBldmVudHNdOmxpc3RcIiBjbGFzcz1cIm1sLXVpLXN1cGVyY29tYm8tZHJvcGRvd25cIj5cXFxuICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG1sLWJpbmQ9XCJbZG9tXTpiZWZvcmVcIj48L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG1sLWJpbmQ9XCJbdGVtcGxhdGUsIGRvbSwgZXZlbnRzXTpvcHRpb25zXCIgY2xhc3M9XCJtbC11aS1zdXBlcmNvbWJvLW9wdGlvbnNcIj48L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG1sLWJpbmQ9XCJbZG9tXTphZnRlclwiPjwvZGl2PlxcXG4gICAgICAgICAgICAgICAgICAgPC9kaXY+J1xuICAgIH0sXG4gICAgY29udGFpbmVyOiB1bmRlZmluZWRcbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MU3VwZXJDb21ibyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxTdXBlckNvbWJvO1xuXG4vKipcbiAqIFB1YmxpYyBBcGlcbiAqL1xuXy5leHRlbmRQcm90byhNTFN1cGVyQ29tYm8sIHtcbiAgICBpbml0OiBNTFN1cGVyQ29tYm8kaW5pdCxcbiAgICBzaG93T3B0aW9uczogTUxTdXBlckNvbWJvJHNob3dPcHRpb25zLFxuICAgIGhpZGVPcHRpb25zOiBNTFN1cGVyQ29tYm8kaGlkZU9wdGlvbnMsXG4gICAgdG9nZ2xlT3B0aW9uczogTUxTdXBlckNvbWJvJHRvZ2dsZU9wdGlvbnMsXG4gICAgc2V0T3B0aW9uczogTUxTdXBlckNvbWJvJHNldE9wdGlvbnMsXG4gICAgaW5pdE9wdGlvbnNVUkw6IE1MU3VwZXJDb21ibyRpbml0T3B0aW9uc1VSTCxcbiAgICBzZXRGaWx0ZXJlZE9wdGlvbnM6IE1MU3VwZXJDb21ibyRzZXRGaWx0ZXJlZE9wdGlvbnMsXG4gICAgdXBkYXRlOiBNTFN1cGVyQ29tYm8kdXBkYXRlLFxuICAgIHRvZ2dsZUFkZEJ1dHRvbjogTUxTdXBlckNvbWJvJHRvZ2dsZUFkZEJ1dHRvbixcbiAgICBzZXRBZGRJdGVtUHJvbXB0OiBNTFN1cGVyQ29tYm8kc2V0QWRkSXRlbVByb21wdCxcbiAgICBjbGVhckNvbWJvSW5wdXQ6IE1MU3VwZXJDb21ib19kZWxcbn0pO1xuXG5cbi8qKlxuICogQ29tcG9uZW50IGluc3RhbmNlIG1ldGhvZFxuICogSW5pdGlhbGlzZSB0aGUgY29tcG9uZW50LCB3YWl0IGZvciBjaGlsZHJlbmJvdW5kLCBzZXR1cCBlbXB0eSBvcHRpb25zIGFycmF5cy5cbiAqL1xuZnVuY3Rpb24gTUxTdXBlckNvbWJvJGluaXQoKSB7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB0aGlzLm9uY2UoJ2NoaWxkcmVuYm91bmQnLCBvbkNoaWxkcmVuQm91bmQpO1xuXG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgX29wdGlvbnNEYXRhOiBbXSxcbiAgICAgICAgX2ZpbHRlcmVkT3B0aW9uc0RhdGE6IFtdXG4gICAgfSwgXy5XUklUKTtcbn1cblxuLyoqXG4gKiBIYW5kbGVyIGZvciBpbml0IGNoaWxkcmVuYm91bmQgbGlzdGVuZXIuIFJlbmRlcnMgdGVtcGxhdGUuXG4gKi9cbmZ1bmN0aW9uIG9uQ2hpbGRyZW5Cb3VuZCgpIHtcbiAgICB0aGlzLnRlbXBsYXRlLnJlbmRlcigpLmJpbmRlcigpO1xuICAgIGNvbXBvbmVudFNldHVwLmNhbGwodGhpcyk7XG59XG5cblxuLyoqXG4gKiBEZWZpbmUgaW5zdGFuY2UgcHJvcGVydGllcywgZ2V0IHN1YmNvbXBvbmVudHMsIGNhbGwgc2V0dXAgc3ViLXRhc2tzXG4gKi9cbmZ1bmN0aW9uIGNvbXBvbmVudFNldHVwKCkge1xuICAgIHZhciBzY29wZSA9IHRoaXMuY29udGFpbmVyLnNjb3BlO1xuXG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgX2NvbWJvSW5wdXQ6IHNjb3BlLmlucHV0LFxuICAgICAgICBfY29tYm9MaXN0OiBzY29wZS5saXN0LFxuICAgICAgICBfY29tYm9PcHRpb25zOiBzY29wZS5vcHRpb25zLFxuICAgICAgICBfY29tYm9CZWZvcmU6IHNjb3BlLmJlZm9yZSxcbiAgICAgICAgX2NvbWJvQWZ0ZXI6IHNjb3BlLmFmdGVyLFxuICAgICAgICBfY29tYm9BZGRJdGVtRGl2OiBzY29wZS5hZGRJdGVtRGl2LFxuICAgICAgICBfY29tYm9BZGRQcm9tcHQ6IHNjb3BlLmFkZFByb21wdCxcbiAgICAgICAgX2NvbWJvQWRkQnRuOiBzY29wZS5hZGRCdG4sXG4gICAgICAgIF9vcHRpb25UZW1wbGF0ZTogZG9ULmNvbXBpbGUoT1BUSU9OU19URU1QTEFURSlcbiAgICB9KTtcblxuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIF9zdGFydEluZGV4OiAwLFxuICAgICAgICBfZW5kSW5kZXg6IE1BWF9SRU5ERVJFRCxcbiAgICAgICAgX2hpZGRlbjogZmFsc2UsXG4gICAgICAgIF9lbGVtZW50SGVpZ2h0OiBERUZBVUxUX0VMRU1FTlRfSEVJR0hULFxuICAgICAgICBfdG90YWw6IDAsXG4gICAgICAgIF9vcHRpb25zSGVpZ2h0OiAyMDAsXG4gICAgICAgIF9sYXN0U2Nyb2xsUG9zOiAwLFxuICAgICAgICBfY3VycmVudFZhbHVlOiBudWxsLFxuICAgICAgICBfc2VsZWN0ZWQ6IG51bGwsXG4gICAgICAgIF9pc0FkZEJ1dHRvblNob3duOiBmYWxzZVxuICAgIH0sIF8uV1JJVCk7XG5cbiAgICAvLyBDb21wb25lbnQgU2V0dXBcbiAgICB0aGlzLmRvbS5zZXRTdHlsZXMoeyBwb3NpdGlvbjogJ3JlbGF0aXZlJyB9KTtcbiAgICBzZXR1cENvbWJvTGlzdCh0aGlzLl9jb21ib0xpc3QsIHRoaXMuX2NvbWJvT3B0aW9ucywgdGhpcyk7XG4gICAgc2V0dXBDb21ib0lucHV0KHRoaXMuX2NvbWJvSW5wdXQsIHRoaXMpO1xuICAgIHNldHVwQ29tYm9CdG4odGhpcy5fY29tYm9BZGRCdG4sIHRoaXMpO1xuXG4gICAgdGhpcy5ldmVudHMub24oJ2tleWRvd24nLCB7IHN1YnNjcmliZXI6IGNoYW5nZVNlbGVjdGVkLCBjb250ZXh0OiB0aGlzIH0pO1xuICAgIC8vdGhpcy5ldmVudHMub24oJ21vdXNlbGVhdmUnLCB7IHN1YnNjcmliZXI6IE1MU3VwZXJDb21ibyRoaWRlT3B0aW9ucywgY29udGV4dDogdGhpcyB9KTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTaG93cyBvciBoaWRlcyBvcHRpb24gbGlzdC5cbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHNob3cgdHJ1ZSB0byBzaG93LCBmYWxzZSB0byBoaWRlXG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyR0b2dnbGVPcHRpb25zKHNob3cpIHtcbiAgICB0aGlzLl9oaWRkZW4gPSAhc2hvdztcbiAgICB0aGlzLl9jb21ib0xpc3QuZG9tLnRvZ2dsZShzaG93KTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTaG93cyBvcHRpb25zIGxpc3RcbiAqL1xuZnVuY3Rpb24gTUxTdXBlckNvbWJvJHNob3dPcHRpb25zKCkge1xuICAgIHRoaXMuX2hpZGRlbiA9IGZhbHNlO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZChDT01CT19PUEVOKTtcbiAgICB0aGlzLl9jb21ib0xpc3QuZG9tLnRvZ2dsZSh0cnVlKTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBIaWRlcyBvcHRpb25zIGxpc3RcbiAqL1xuZnVuY3Rpb24gTUxTdXBlckNvbWJvJGhpZGVPcHRpb25zKCkge1xuICAgIHRoaXMuX2hpZGRlbiA9IHRydWU7XG4gICAgdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKENPTUJPX09QRU4pO1xuICAgIHRoaXMuX2NvbWJvTGlzdC5kb20udG9nZ2xlKGZhbHNlKTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBIaWRlcyBhZGQgYnV0dG9uXG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyR0b2dnbGVBZGRCdXR0b24oc2hvdywgb3B0aW9ucykge1xuICAgIHRoaXMuX2NvbWJvQWRkSXRlbURpdi5kb20udG9nZ2xlKHNob3cpO1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMucHJlc2VydmVTdGF0ZSkgdGhpcy5fX3Nob3dBZGRPbkNsaWNrID0gdGhpcy5faXNBZGRCdXR0b25TaG93bjtcbiAgICB0aGlzLl9pc0FkZEJ1dHRvblNob3duID0gc2hvdztcbn1cblxuXG5mdW5jdGlvbiBNTFN1cGVyQ29tYm8kc2V0QWRkSXRlbVByb21wdChwcm9tcHQpIHtcbiAgICB0aGlzLl9hZGRJdGVtUHJvbXB0ID0gcHJvbXB0O1xuICAgIHRoaXMuX2NvbWJvQWRkUHJvbXB0LmVsLmlubmVySFRNTCA9IHByb21wdDtcbiAgICB0aGlzLnRvZ2dsZUFkZEJ1dHRvbihmYWxzZSk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTZXRzIHRoZSBvcHRpb25zIG9mIHRoZSBkcm9wZG93blxuICpcbiAqIEBwYXJhbSB7QXJyYXlbT2JqZWN0XX0gYXJyIHRoZSBvcHRpb25zIHRvIHNldCB3aXRoIGxhYmVsIGFuZCB2YWx1ZSBwYWlycy4gVmFsdWUgY2FuIGJlIGFuIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gTUxTdXBlckNvbWJvJHNldE9wdGlvbnMoYXJyKSB7XG4gICAgdGhpcy5fb3B0aW9uc0RhdGEgPSBhcnI7XG4gICAgdGhpcy5zZXRGaWx0ZXJlZE9wdGlvbnMoYXJyKTtcbn1cblxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIEluaXRpYWxpc2UgdGhlIHJlbW90ZSBvcHRpb25zIG9mIHRoZSBkcm9wZG93blxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBvcHRpb25zIHRvIGluaXRpYWxpc2UuXG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyRpbml0T3B0aW9uc1VSTChvcHRpb25zKSB7XG4gICAgdGhpcy5fb3B0aW9uc1VSTCA9IG9wdGlvbnMudXJsO1xuICAgIHRoaXMuX2Zvcm1hdE9wdGlvbnNVUkwgPSBvcHRpb25zLmZvcm1hdE9wdGlvbnMgfHwgZnVuY3Rpb24oZSl7cmV0dXJuIGU7fTtcbn1cblxuXG4vKipcbiAqIFByaXZhdGUgbWV0aG9kXG4gKiBTZXRzIHRoZSBvcHRpb25zIG9mIHRoZSBkcm9wZG93biBiYXNlZCBvbiBhIHJlcXVlc3RcbiAqL1xuZnVuY3Rpb24gX2dldE9wdGlvbnNVUkwoY2IpIHtcbiAgICB2YXIgdXJsID0gdGhpcy5fb3B0aW9uc1VSTCxcbiAgICAgICAgcXVlcnlTdHJpbmcgPSB0aGlzLl9jb21ib0lucHV0LmRhdGEuZ2V0KCk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGNiID0gY2IgfHwgXy5ub29wO1xuICAgIG1pbG8udXRpbC5yZXF1ZXN0LnBvc3QodXJsLCB7IG5hbWU6IHF1ZXJ5U3RyaW5nIH0sIGZ1bmN0aW9uIChlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignQ2FuIG5vdCBzZWFyY2ggZm9yIFwiJyArIHF1ZXJ5U3RyaW5nICsgJ1wiJyk7XG4gICAgICAgICAgICByZXR1cm4gY2IobmV3IEVycm9yKCdSZXF1ZXN0IGVycm9yJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlc3BvbnNlRGF0YSA9IF8uanNvblBhcnNlKHJlc3BvbnNlKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlRGF0YSkgY2IobnVsbCwgcmVzcG9uc2VEYXRhKTtcbiAgICAgICAgZWxzZSBjYihuZXcgRXJyb3IoJ0RhdGEgZXJyb3InKSk7XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiBDb21wb25lbnQgaW5zdGFuY2UgbWV0aG9kXG4gKiBTZXRzIHRoZSBmaWx0ZXJlZCBvcHRpb25zLCB3aGljaCBpcyBhIHN1YnNldCBvZiBub3JtYWwgb3B0aW9uc1xuICpcbiAqIEBwYXJhbSB7W3R5cGVdfSBhcnIgVGhlIG9wdGlvbnMgdG8gc2V0XG4gKi9cbmZ1bmN0aW9uIE1MU3VwZXJDb21ibyRzZXRGaWx0ZXJlZE9wdGlvbnMoYXJyKSB7XG4gICAgaWYgKCEgYXJyKSByZXR1cm4gbG9nZ2VyLmVycm9yKCdzZXRGaWx0ZXJlZE9wdGlvbnM6IHBhcmFtZXRlciBpcyB1bmRlZmluZWQnKTtcbiAgICB0aGlzLl9maWx0ZXJlZE9wdGlvbnNEYXRhID0gYXJyO1xuICAgIHRoaXMuX3RvdGFsID0gYXJyLmxlbmd0aDtcbiAgICB0aGlzLnVwZGF0ZSgpO1xufVxuXG4vKipcbiAqIENvbXBvbmVudCBpbnN0YW5jZSBtZXRob2RcbiAqIFVwZGF0ZXMgdGhlIGxpc3QuIFRoaXMgaXMgdXNlZCBvbiBzY3JvbGwsIGFuZCBtYWtlcyB1c2Ugb2YgdGhlIGZpbHRlcmVkT3B0aW9ucyB0b1xuICogaW50ZWxsaWdlbnRseSBzaG93IGEgc3Vic2V0IG9mIHRoZSBmaWx0ZXJlZCBsaXN0IGF0IGEgdGltZS5cbiAqL1xuZnVuY3Rpb24gTUxTdXBlckNvbWJvJHVwZGF0ZSgpIHtcbiAgICB2YXIgd2FzSGlkZGVuID0gdGhpcy5faGlkZGVuO1xuXG4gICAgdmFyIGFyclRvU2hvdyA9IHRoaXMuX2ZpbHRlcmVkT3B0aW9uc0RhdGEuc2xpY2UodGhpcy5fc3RhcnRJbmRleCwgdGhpcy5fZW5kSW5kZXgpO1xuXG4gICAgdGhpcy5fY29tYm9PcHRpb25zLnRlbXBsYXRlLnJlbmRlcih7XG4gICAgICAgIGNvbWJvT3B0aW9uczogYXJyVG9TaG93XG4gICAgfSk7XG5cbiAgICB0aGlzLl9lbGVtZW50SGVpZ2h0ID0gdGhpcy5fZWxlbWVudEhlaWdodCB8fCBERUZBVUxUX0VMRU1FTlRfSEVJR0hUO1xuXG4gICAgaWYgKHdhc0hpZGRlbilcbiAgICAgICAgdGhpcy5oaWRlT3B0aW9ucygpO1xuXG4gICAgdmFyIGJlZm9yZUhlaWdodCA9IHRoaXMuX3N0YXJ0SW5kZXggKiB0aGlzLl9lbGVtZW50SGVpZ2h0O1xuICAgIHZhciBhZnRlckhlaWdodCA9ICh0aGlzLl90b3RhbCAtIHRoaXMuX2VuZEluZGV4KSAqIHRoaXMuX2VsZW1lbnRIZWlnaHQ7XG4gICAgdGhpcy5fY29tYm9CZWZvcmUuZWwuc3R5bGUuaGVpZ2h0ID0gYmVmb3JlSGVpZ2h0ICsgJ3B4JztcbiAgICB0aGlzLl9jb21ib0FmdGVyLmVsLnN0eWxlLmhlaWdodCA9IGFmdGVySGVpZ2h0ID4gMCA/IGFmdGVySGVpZ2h0ICsgJ3B4JyA6ICcwcHgnO1xufVxuXG4vKipcbiAqIFNldHVwIHRoZSBjb21ibyBsaXN0XG4gKlxuICogQHBhcmFtICB7Q29tcG9uZW50fSBsaXN0XG4gKiBAcGFyYW0gIHtBcnJheX0gb3B0aW9uc1xuICogQHBhcmFtICB7Q29tcG9uZW50fSBzZWxmXG4gKi9cbmZ1bmN0aW9uIHNldHVwQ29tYm9MaXN0KGxpc3QsIG9wdGlvbnMsIHNlbGYpIHtcbiAgICBzZWxmLnRvZ2dsZUFkZEJ1dHRvbihmYWxzZSk7XG4gICAgb3B0aW9ucy50ZW1wbGF0ZS5zZXQoT1BUSU9OU19URU1QTEFURSk7XG5cbiAgICBsaXN0LmRvbS5zZXRTdHlsZXMoe1xuICAgICAgICBvdmVyZmxvdzogJ3Njcm9sbCcsXG4gICAgICAgIGhlaWdodDogc2VsZi5fb3B0aW9uc0hlaWdodCArICdweCcsXG4gICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICB6SW5kZXg6IDEwXG4gICAgICAgIC8vIHRvcDogeVBvcyArICdweCcsXG4gICAgICAgIC8vIGxlZnQ6IHhQb3MgKyAncHgnLFxuICAgIH0pO1xuXG4gICAgc2VsZi5oaWRlT3B0aW9ucygpO1xuICAgIGxpc3QuZXZlbnRzLm9uTWVzc2FnZXMoe1xuICAgICAgICAnY2xpY2snOiB7c3Vic2NyaWJlcjogb25MaXN0Q2xpY2ssIGNvbnRleHQ6IHNlbGZ9LFxuICAgICAgICAnc2Nyb2xsJzoge3N1YnNjcmliZXI6IG9uTGlzdFNjcm9sbCwgY29udGV4dDogc2VsZn1cbiAgICB9KTtcbn1cblxuLyoqXG4gKiBTZXR1cCB0aGUgaW5wdXQgY29tcG9uZW50XG4gKlxuICogQHBhcmFtICB7Q29tcG9uZW50fSBpbnB1dFxuICogQHBhcmFtICB7Q29tcG9uZW50fSBzZWxmXG4gKi9cbmZ1bmN0aW9uIHNldHVwQ29tYm9JbnB1dChpbnB1dCwgc2VsZikge1xuICAgIGlucHV0LmV2ZW50cy5vbmNlKCdmb2N1cycsIGZ1bmN0aW9uKCl7XG4gICAgICAgIGlucHV0LmRhdGEub24oJycsIHsgc3Vic2NyaWJlcjogb25EYXRhQ2hhbmdlLCBjb250ZXh0OiBzZWxmIH0pO1xuICAgICAgICBpbnB1dC5ldmVudHMub24oJ2NsaWNrJywge3N1YnNjcmliZXI6IG9uSW5wdXRDbGljaywgY29udGV4dDogc2VsZiB9KTtcbiAgICAgICAgaW5wdXQuZXZlbnRzLm9uKCdrZXlkb3duJywge3N1YnNjcmliZXI6IG9uRW50ZXJLZXksIGNvbnRleHQ6IHNlbGYgfSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogU2V0dXAgdGhlIGJ1dHRvblxuICogQHBhcmFtICB7Q29tcG9uZW50fSBidG5cbiAqIEBwYXJhbSAge0NvbXBvbmVudH0gc2VsZlxuICovXG5mdW5jdGlvbiBzZXR1cENvbWJvQnRuKGJ0biwgc2VsZikge1xuICAgIGJ0bi5ldmVudHMub24oJ2NsaWNrJywgeyBzdWJzY3JpYmVyOiBvbkFkZEJ0biwgY29udGV4dDogc2VsZiB9KTtcbn1cblxuXG4vKipcbiAqIEN1c3RvbSBkYXRhIGZhY2V0IGdldCBtZXRob2RcbiAqL1xuZnVuY3Rpb24gTUxTdXBlckNvbWJvX2dldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFZhbHVlO1xufVxuXG4vKipcbiAqIEN1c3RvbSBkYXRhIGZhY2V0IHNldCBtZXRob2RcbiAqIEBwYXJhbSB7VmFyaWFibGV9IG9ialxuICovXG5mdW5jdGlvbiBNTFN1cGVyQ29tYm9fc2V0KG9iaikge1xuICAgIHRoaXMuX2N1cnJlbnRWYWx1ZSA9IG9iajtcbiAgICB0aGlzLl9jb21ib0lucHV0LmRhdGEuc2V0KG9iaiAmJiBvYmoubGFiZWwpO1xuICAgIF8uZGVmZXJNZXRob2QodGhpcywgJ2hpZGVPcHRpb25zJyk7XG59XG5cbi8qKlxuICogQ3VzdG9tIGRhdGEgZmFjZXQgZGVsIG1ldGhvZFxuICovXG5mdW5jdGlvbiBNTFN1cGVyQ29tYm9fZGVsKCkge1xuICAgIHRoaXMuX2N1cnJlbnRWYWx1ZSA9IG51bGw7XG4gICAgdGhpcy5fY29tYm9JbnB1dC5kYXRhLnNldCgnJyk7XG59XG5cblxuLyoqXG4gKiBJbnB1dCBkYXRhIGNoYW5nZSBoYW5kbGVyXG4gKiBXaGVuIHRoZSBpbnB1dCBkYXRhIGNoYW5nZXMsIHRoaXMgbWV0aG9kIGZpbHRlcnMgdGhlIG9wdGlvbnNEYXRhLCBhbmQgc2V0cyB0aGUgZmlyc3QgZWxlbWVudFxuICogdG8gYmUgc2VsZWN0ZWQuXG4gKiBAcGFyYW0gIHtTdHJpbmd9IG1zZ1xuICogQHBhcmFtICB7T2JqZXh0fSBkYXRhXG4gKi9cbmZ1bmN0aW9uIG9uRGF0YUNoYW5nZShtc2csIGRhdGEpIHtcbiAgICB2YXIgdGV4dCA9IGRhdGEubmV3VmFsdWUgJiYgZGF0YS5uZXdWYWx1ZS50cmltKCk7XG4gICAgaWYgKHRoaXMuX29wdGlvbnNVUkwpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICBfZ2V0T3B0aW9uc1VSTC5jYWxsKHRoaXMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2VEYXRhKXtcbiAgICAgICAgICAgIGlmIChlcnIgfHwgIXJlc3BvbnNlRGF0YSkgcmV0dXJuO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHJlc3BvbnNlRGF0YS5kYXRhLm1hcChzZWxmLl9mb3JtYXRPcHRpb25zVVJMKTtcbiAgICAgICAgICAgICAgICBzZWxmLnNldE9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgX3VwZGF0ZU9wdGlvbnNBbmRBZGRCdXR0b24uY2FsbChzZWxmLCB0ZXh0LCBzZWxmLl9vcHRpb25zRGF0YSk7XG4gICAgICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0RhdGEgZXJyb3InLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGZpbHRlcmVkRGF0YSA9IF9maWx0ZXJEYXRhLmNhbGwodGhpcywgdGV4dCk7XG4gICAgICAgIF91cGRhdGVPcHRpb25zQW5kQWRkQnV0dG9uLmNhbGwodGhpcywgdGV4dCwgZmlsdGVyZWREYXRhKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gX2ZpbHRlckRhdGEodGV4dCkge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zRGF0YS5maWx0ZXIoZnVuY3Rpb24ob3B0aW9uKSB7XG4gICAgICAgIGRlbGV0ZSBvcHRpb24uc2VsZWN0ZWQ7XG4gICAgICAgIGlmIChvcHRpb24ubGFiZWwpIHtcbiAgICAgICAgICAgIHZhciBsYWJlbCA9IG9wdGlvbi5sYWJlbC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGxhYmVsLnRyaW0oKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YodGV4dC50b0xvd2VyQ2FzZSgpKSA9PSAwO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gX3VwZGF0ZU9wdGlvbnNBbmRBZGRCdXR0b24odGV4dCwgZmlsdGVyZWRBcnIpIHtcbiAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgdGhpcy50b2dnbGVBZGRCdXR0b24oZmFsc2UsIHsgcHJlc2VydmVTdGF0ZTogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZmlsdGVyZWRBcnIubGVuZ3RoICYmIF8uZmluZChmaWx0ZXJlZEFyciwgaXNFeGFjdE1hdGNoKSkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVBZGRCdXR0b24oZmFsc2UsIHsgcHJlc2VydmVTdGF0ZTogdHJ1ZSB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9hZGRJdGVtUHJvbXB0KSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUFkZEJ1dHRvbih0aGlzLl9vcHRpb25zRGF0YS5sZW5ndGggPiAxIHx8IHRoaXMuX29wdGlvbnNVUkwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbHRlcmVkQXJyLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5zaG93T3B0aW9ucygpO1xuICAgICAgICAgICAgZmlsdGVyZWRBcnJbMF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWQgPSBmaWx0ZXJlZEFyclswXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZU9wdGlvbnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2V0RmlsdGVyZWRPcHRpb25zKGZpbHRlcmVkQXJyKTtcbiAgICB0aGlzLl9jb21ib0xpc3QuZWwuc2Nyb2xsVG9wID0gMDtcblxuICAgIGZ1bmN0aW9uIGlzRXhhY3RNYXRjaChpdGVtKSB7XG4gICAgICAgIHJldHVybiBpdGVtLmxhYmVsLnRvTG93ZXJDYXNlKCkgPT09IHRleHQudG9Mb3dlckNhc2UoKTtcbiAgICB9XG59XG5cbi8qKlxuICogQSBtYXAgb2Yga2V5Q29kZXMgdG8gZGlyZWN0aW9uc1xuICogQHR5cGUge09iamVjdH1cbiAqL1xudmFyIGRpcmVjdGlvbk1hcCA9IHsgJzQwJzogMSwgJzM4JzogLTEgfTtcblxuLyoqXG4gKiBMaXN0IGtleWRvd24gaGFuZGxlclxuICogQ2hhbmdlcyB0aGUgc2VsZWN0ZWQgbGlzdCBpdGVtIGJ5IGZpbmRpbmcgdGhlIGFkamFjZW50IGl0ZW0gYW5kIHNldHRpbmcgaXQgdG8gc2VsZWN0ZWQuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0gIHtFdmVudH0gZXZlbnRcbiAqL1xuZnVuY3Rpb24gY2hhbmdlU2VsZWN0ZWQodHlwZSwgZXZlbnQpIHtcbiAgICAvL1RPRE8gdGVzdCBtb2NoYVxuICAgIHZhciBkaXJlY3Rpb24gPSBkaXJlY3Rpb25NYXBbZXZlbnQua2V5Q29kZV07XG5cbiAgICBpZihkaXJlY3Rpb24pXG4gICAgICAgIF9jaGFuZ2VTZWxlY3RlZC5jYWxsKHRoaXMsIGRpcmVjdGlvbik7XG59XG5cbmZ1bmN0aW9uIF9jaGFuZ2VTZWxlY3RlZChkaXJlY3Rpb24pIHtcbiAgICAvLyBUT0RPOiByZWZhY3RvciBhbmQgdGlkeSB1cCwgbG9va3MgbGlrZSBzb21lIGNvZGUgZHVwbGljYXRpb24uXG4gICAgdmFyIHNlbGVjdGVkID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VsZWN0ZWQnKVswXVxuICAgICAgICAsIHNjcm9sbFBvcyA9IHRoaXMuX2NvbWJvTGlzdC5lbC5zY3JvbGxUb3BcbiAgICAgICAgLCBzZWxlY3RlZFBvcyA9IHNlbGVjdGVkID8gc2VsZWN0ZWQub2Zmc2V0VG9wIDogMFxuICAgICAgICAsIHJlbGF0aXZlUG9zID0gc2VsZWN0ZWRQb3MgLSBzY3JvbGxQb3M7XG5cbiAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gX2dldERhdGFWYWx1ZUZyb21FbGVtZW50LmNhbGwodGhpcywgc2VsZWN0ZWQpXG4gICAgICAgICAgICAsIHRoaXNJdGVtID0gdGhpcy5fZmlsdGVyZWRPcHRpb25zRGF0YVtpbmRleF1cbiAgICAgICAgICAgICwgYWRqSXRlbSA9IHRoaXMuX2ZpbHRlcmVkT3B0aW9uc0RhdGFbaW5kZXggKyBkaXJlY3Rpb25dO1xuXG4gICAgICAgIGlmIChhZGpJdGVtKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpc0l0ZW0uc2VsZWN0ZWQ7XG4gICAgICAgICAgICBhZGpJdGVtLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkID0gYWRqSXRlbTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5fZmlsdGVyZWRPcHRpb25zRGF0YVswXSkge1xuICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWRPcHRpb25zRGF0YVswXS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlbGF0aXZlUG9zID4gdGhpcy5fb3B0aW9uc0hlaWdodCAtIHRoaXMuX2VsZW1lbnRIZWlnaHQqMiAmJiBkaXJlY3Rpb24gPT09IDEpXG4gICAgICAgIHRoaXMuX2NvbWJvTGlzdC5lbC5zY3JvbGxUb3AgKz0gdGhpcy5fZWxlbWVudEhlaWdodCpkaXJlY3Rpb24qNTtcblxuICAgIGlmIChyZWxhdGl2ZVBvcyA8IHRoaXMuX2VsZW1lbnRIZWlnaHQgJiYgZGlyZWN0aW9uID09PSAtMSlcbiAgICAgICAgdGhpcy5fY29tYm9MaXN0LmVsLnNjcm9sbFRvcCArPSB0aGlzLl9lbGVtZW50SGVpZ2h0KmRpcmVjdGlvbio1O1xufVxuXG5cbi8qKlxuICogTW91c2Ugb3ZlciBoYW5kbGVyXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0gIHtFdmVudH0gZXZlbnRcbiAqL1xuZnVuY3Rpb24gb25Nb3VzZU92ZXIodHlwZSwgZXZlbnQpIHtcbiAgICB0aGlzLl9tb3VzZUlzT3ZlciA9IHRydWU7XG59XG5cblxuLyoqXG4gKiBNb3VzZSBsZWF2ZSBoYW5kbGVyXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0gIHtFdmVudH0gZXZlbnRcbiAqL1xuZnVuY3Rpb24gb25Nb3VzZUxlYXZlKHR5cGUsIGV2ZW50KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuX21vdXNlSXNPdmVyID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuX21vdXNlT3V0VGltZXIpIGNsZWFySW50ZXJ2YWwodGhpcy5fbW91c2VPdXRUaW1lcik7XG4gICAgdGhpcy5fbW91c2VPdXRUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgICAgaWYgKCFzZWxmLl9tb3VzZUlzT3ZlcilcbiAgICAgICAgICAgIF9vbk1vdXNlTGVhdmUuY2FsbChzZWxmKTtcbiAgICB9LCA3NTApO1xufVxuXG5mdW5jdGlvbiBfb25Nb3VzZUxlYXZlKCkge1xuICAgIHRoaXMuaGlkZU9wdGlvbnMoKTtcbiAgICB0aGlzLnRvZ2dsZUFkZEJ1dHRvbihmYWxzZSwgeyBwcmVzZXJ2ZVN0YXRlOiB0cnVlIH0pO1xufVxuXG5cbi8qKlxuICogSW5wdXQgY2xpY2sgaGFuZGxlclxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gdHlwZVxuICogQHBhcmFtICB7RXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIG9uSW5wdXRDbGljayh0eXBlLCBldmVudCkge1xuICAgIHRoaXMuc2hvd09wdGlvbnMoKTtcbiAgICBpZiAodGhpcy5fX3Nob3dBZGRPbkNsaWNrKSB0aGlzLnRvZ2dsZUFkZEJ1dHRvbih0cnVlKTtcbn1cblxuXG4vKipcbiAqIEVudGVyIGtleSBoYW5kbGVyXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0gIHtFdmVudH0gZXZlbnRcbiAqL1xuZnVuY3Rpb24gb25FbnRlcktleSh0eXBlLCBldmVudCkge1xuICAgIGlmIChldmVudC5rZXlDb2RlID09IDEzKSB7XG4gICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZClcbiAgICAgICAgICAgIF9zZXREYXRhLmNhbGwodGhpcyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEFkZCBidXR0b24gaGFuZGxlclxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gdHlwZVxuICogQHBhcmFtICB7RXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIG9uQWRkQnRuICh0eXBlLCBldmVudCkge1xuICAgIHZhciBkYXRhID0geyBsYWJlbDogdGhpcy5fY29tYm9JbnB1dC5lbC52YWx1ZSB9O1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoJ2FkZGl0ZW0nLCBkYXRhKTtcbiAgICB0aGlzLmV2ZW50cy5wb3N0TWVzc2FnZSgnbWlsb19zdXBlcmNvbWJvYWRkaXRlbScsIGRhdGEpO1xuICAgIHRoaXMudG9nZ2xlQWRkQnV0dG9uKGZhbHNlLCB7IHByZXNlcnZlU3RhdGU6IHRydWUgfSk7XG5cbn1cblxuLyoqXG4gKiBMaXN0IGNsaWNrIGhhbmRsZXJcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSAge0V2ZW50fSBldmVudFxuICovXG5mdW5jdGlvbiBvbkxpc3RDbGljayAodHlwZSwgZXZlbnQpIHtcbiAgICB2YXIgaW5kZXggPSBfZ2V0RGF0YVZhbHVlRnJvbUVsZW1lbnQuY2FsbCh0aGlzLCBldmVudC50YXJnZXQpO1xuICAgIHZhciBkYXRhID0gdGhpcy5fZmlsdGVyZWRPcHRpb25zRGF0YVtpbmRleF07XG5cbiAgICB0aGlzLl9zZWxlY3RlZCA9IGRhdGE7XG4gICAgX3NldERhdGEuY2FsbCh0aGlzKTtcbiAgICB0aGlzLnVwZGF0ZSgpO1xufVxuXG5cbi8qKlxuICogTGlzdCBzY3JvbGwgaGFuZGxlclxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gdHlwZVxuICogQHBhcmFtICB7RXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIG9uTGlzdFNjcm9sbCAodHlwZSwgZXZlbnQpIHtcbiAgICB2YXIgc2Nyb2xsUG9zID0gZXZlbnQudGFyZ2V0LnNjcm9sbFRvcFxuICAgICAgICAsIGRpcmVjdGlvbiA9IHNjcm9sbFBvcyA+IHRoaXMuX2xhc3RTY3JvbGxQb3MgPyAnZG93bicgOiAndXAnXG4gICAgICAgICwgZmlyc3RDaGlsZCA9IHRoaXMuX2NvbWJvT3B0aW9ucy5lbC5sYXN0RWxlbWVudENoaWxkXG4gICAgICAgICwgbGFzdENoaWxkID0gdGhpcy5fY29tYm9PcHRpb25zLmVsLmZpcnN0RWxlbWVudENoaWxkXG4gICAgICAgICwgbGFzdEVsUG9zaXRpb24gPSBmaXJzdENoaWxkID8gZmlyc3RDaGlsZC5vZmZzZXRUb3AgOiAwXG4gICAgICAgICwgZmlyc3RFbFBvc2l0aW9uID0gbGFzdENoaWxkID8gbGFzdENoaWxkLm9mZnNldFRvcCA6IDBcbiAgICAgICAgLCBkaXN0RnJvbUxhc3RFbCA9IGxhc3RFbFBvc2l0aW9uIC0gc2Nyb2xsUG9zIC0gdGhpcy5fb3B0aW9uc0hlaWdodCArIHRoaXMuX2VsZW1lbnRIZWlnaHRcbiAgICAgICAgLCBkaXN0RnJvbUZpcnN0RWwgPSBzY3JvbGxQb3MgLSBmaXJzdEVsUG9zaXRpb25cbiAgICAgICAgLCBlbHNGcm9tU3RhcnQgPSBNYXRoLmZsb29yKGRpc3RGcm9tRmlyc3RFbCAvIHRoaXMuX2VsZW1lbnRIZWlnaHQpXG4gICAgICAgICwgZWxzVG9UaGVFbmQgPSBNYXRoLmZsb29yKGRpc3RGcm9tTGFzdEVsIC8gdGhpcy5fZWxlbWVudEhlaWdodClcbiAgICAgICAgLCB0b3RhbEVsZW1lbnRzQmVmb3JlID0gTWF0aC5mbG9vcihzY3JvbGxQb3MgLyB0aGlzLl9lbGVtZW50SGVpZ2h0KSAtIEJVRkZFUjtcblxuICAgIGlmICgoZGlyZWN0aW9uID09ICdkb3duJyAmJiBlbHNUb1RoZUVuZCA8IEJVRkZFUilcbiAgICAgICAgfHwgKGRpcmVjdGlvbiA9PSAndXAnICYmIGVsc0Zyb21TdGFydCA8IEJVRkZFUikpIHtcbiAgICAgICAgdGhpcy5fc3RhcnRJbmRleCA9IHRvdGFsRWxlbWVudHNCZWZvcmUgPiAwID8gdG90YWxFbGVtZW50c0JlZm9yZSA6IDA7XG4gICAgICAgIHRoaXMuX2VuZEluZGV4ID0gdG90YWxFbGVtZW50c0JlZm9yZSArIE1BWF9SRU5ERVJFRDtcbiAgICAgICAgdGhpcy5fZWxlbWVudEhlaWdodCA9IGZpcnN0Q2hpbGQuc3R5bGUuaGVpZ2h0O1xuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cbiAgICB0aGlzLl9sYXN0U2Nyb2xsUG9zID0gc2Nyb2xsUG9zO1xufVxuXG5cbi8qKlxuICogUHJpdmF0ZSBtZXRob2RcbiAqIFJldHJpZXZlcyB0aGUgZGF0YS12YWx1ZSBhdHRyaWJ1dGUgdmFsdWUgZnJvbSB0aGUgZWxlbWVudCBhbmQgcmV0dXJucyBpdCBhcyBhbiBpbmRleCBvZlxuICogdGhlIGZpbHRlcmVkT3B0aW9uc1xuICpcbiAqIEBwYXJhbSAge0VsZW1lbnR9IGVsXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIF9nZXREYXRhVmFsdWVGcm9tRWxlbWVudChlbCkge1xuICAgIHJldHVybiBOdW1iZXIoZWwuZ2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJykpICsgdGhpcy5fc3RhcnRJbmRleDtcbn1cblxuLyoqXG4gKiBQcml2YXRlIG1ldGhvZFxuICogU2V0cyB0aGUgZGF0YSBvZiB0aGUgU3VwZXJDb21ibywgdGFraW5nIGNhcmUgdG8gcmVzZXQgc29tZSB0aGluZ3MgYW5kIHRlbXBvcmFyaWx5XG4gKiB1bnN1YnNjcmliZSBkYXRhIGxpc3RlbmVycy5cbiAqL1xuZnVuY3Rpb24gX3NldERhdGEoKSB7XG4gICAgZGVsZXRlIHRoaXMuX3NlbGVjdGVkLnNlbGVjdGVkO1xuICAgIHRoaXMuaGlkZU9wdGlvbnMoKTtcbiAgICB0aGlzLnRvZ2dsZUFkZEJ1dHRvbihmYWxzZSk7XG4gICAgdGhpcy5fY29tYm9JbnB1dC5kYXRhLm9mZignJywgeyBzdWJzY3JpYmVyOiBvbkRhdGFDaGFuZ2UsIGNvbnRleHQ6IHRoaXMgfSk7XG4gICAgLy9zdXBlcmNvbWJvIGxpc3RlbmVycyBvZmZcbiAgICB0aGlzLmRhdGEuc2V0KHRoaXMuX3NlbGVjdGVkKTtcbiAgICB0aGlzLmRhdGEuZGlzcGF0Y2hTb3VyY2VNZXNzYWdlKENPTUJPX0NIQU5HRV9NRVNTQUdFKTtcbiAgICB0aGlzLl9jb21ib0lucHV0LmRhdGEub24oJycsIHsgc3Vic2NyaWJlcjogb25EYXRhQ2hhbmdlLCBjb250ZXh0OiB0aGlzIH0pO1xuICAgIC8vc3VwZXJjb21ibyBsaXN0ZW5lcnMgb25cbiAgICB0aGlzLl9zZWxlY3RlZCA9IG51bGw7XG4gICAgdGhpcy5zZXRGaWx0ZXJlZE9wdGlvbnModGhpcy5fb3B0aW9uc0RhdGEpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jX3JlZ2lzdHJ5Jyk7XG5cblxudmFyIE1MVGV4dCA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxUZXh0Jywge1xuICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktdGV4dCdcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTFRleHQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MVGV4dDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NfY2xhc3MnKVxuICAgICwgY29tcG9uZW50c1JlZ2lzdHJ5ID0gcmVxdWlyZSgnLi4vY19yZWdpc3RyeScpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyO1xuXG5cbnZhciBNTFRleHRhcmVhID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTFRleHRhcmVhJywge1xuICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktdGV4dGFyZWEnXG4gICAgfVxufSk7XG5cbmNvbXBvbmVudHNSZWdpc3RyeS5hZGQoTUxUZXh0YXJlYSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxUZXh0YXJlYTtcblxuXG52YXIgU0FNUExFX0FVVE9SRVNJWkVfVEVYVCA9ICdMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dWVyIGFkaXBpc2NpbmcgZWxpdCwnO1xuXG5cbl8uZXh0ZW5kUHJvdG8oTUxUZXh0YXJlYSwge1xuICAgIHN0YXJ0QXV0b3Jlc2l6ZTogTUxUZXh0YXJlYSRzdGFydEF1dG9yZXNpemUsXG4gICAgc3RvcEF1dG9yZXNpemU6IE1MVGV4dGFyZWEkc3RvcEF1dG9yZXNpemUsXG4gICAgaXNBdXRvcmVzaXplZDogTUxUZXh0YXJlYSRpc0F1dG9yZXNpemVkLFxuICAgIGRpc2FibGU6IE1MVGV4dGFyZWEkZGlzYWJsZVxufSk7XG5cblxuZnVuY3Rpb24gTUxUZXh0YXJlYSRzdGFydEF1dG9yZXNpemUob3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9hdXRvcmVzaXplKVxuICAgICAgICByZXR1cm4gbG9nZ2VyLndhcm4oJ01MVGV4dGFyZWEgc3RhcnRBdXRvcmVzaXplOiBhdXRvcmVzaXplIGlzIGFscmVhZHkgb24nKTtcbiAgICB0aGlzLl9hdXRvcmVzaXplID0gdHJ1ZTtcbiAgICB0aGlzLl9hdXRvcmVzaXplT3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBfYWRqdXN0QXJlYUhlaWdodC5jYWxsKHRoaXMpO1xuICAgIF9tYW5hZ2VTdWJzY3JpcHRpb25zLmNhbGwodGhpcywgJ29uJyk7XG59XG5cblxuZnVuY3Rpb24gX21hbmFnZVN1YnNjcmlwdGlvbnMob25PZmYpIHtcbiAgICB0aGlzLmV2ZW50c1tvbk9mZl0oJ2NsaWNrJywgeyBzdWJzY3JpYmVyOiBfYWRqdXN0QXJlYUhlaWdodCwgY29udGV4dDogdGhpcyB9KTtcbiAgICB0aGlzLmRhdGFbb25PZmZdKCcnLCB7IHN1YnNjcmliZXI6IF9hZGp1c3RBcmVhSGVpZ2h0LCBjb250ZXh0OiB0aGlzIH0pO1xufVxuXG5cbmZ1bmN0aW9uIF9hZGp1c3RBcmVhSGVpZ2h0KCkge1xuICAgIHRoaXMuZWwuc3R5bGUuaGVpZ2h0ID0gMDtcblxuICAgIHZhciBuZXdIZWlnaHQgPSB0aGlzLmVsLnNjcm9sbEhlaWdodFxuICAgICAgICAsIG1pbkhlaWdodCA9IHRoaXMuX2F1dG9yZXNpemVPcHRpb25zLm1pbkhlaWdodFxuICAgICAgICAsIG1heEhlaWdodCA9IHRoaXMuX2F1dG9yZXNpemVPcHRpb25zLm1heEhlaWdodDtcblxuICAgIG5ld0hlaWdodCA9IG5ld0hlaWdodCA+PSBtYXhIZWlnaHRcbiAgICAgICAgICAgICAgICA/IG1heEhlaWdodFxuICAgICAgICAgICAgICAgIDogbmV3SGVpZ2h0IDw9IG1pbkhlaWdodFxuICAgICAgICAgICAgICAgID8gbWluSGVpZ2h0XG4gICAgICAgICAgICAgICAgOiBuZXdIZWlnaHQ7XG5cbiAgICB0aGlzLmVsLnN0eWxlLmhlaWdodCA9IG5ld0hlaWdodCArICdweCc7XG59XG5cblxuZnVuY3Rpb24gTUxUZXh0YXJlYSRzdG9wQXV0b3Jlc2l6ZSgpIHtcbiAgICBpZiAoISB0aGlzLl9hdXRvcmVzaXplKVxuICAgICAgICByZXR1cm4gbG9nZ2VyLndhcm4oJ01MVGV4dGFyZWEgc3RvcEF1dG9yZXNpemU6IGF1dG9yZXNpemUgaXMgbm90IG9uJyk7XG4gICAgdGhpcy5fYXV0b3Jlc2l6ZSA9IGZhbHNlO1xuICAgIF9tYW5hZ2VTdWJzY3JpcHRpb25zLmNhbGwodGhpcywgJ29mZicpO1xufVxuXG5cbmZ1bmN0aW9uIE1MVGV4dGFyZWEkaXNBdXRvcmVzaXplZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXV0b3Jlc2l6ZTtcbn1cblxuXG5mdW5jdGlvbiBNTFRleHRhcmVhJGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuX2F1dG9yZXNpemUpXG4gICAgICAgIHRoaXMuc3RvcEF1dG9yZXNpemUoKTtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gTUxUZXh0YXJlYSRkaXNhYmxlKGRpc2FibGUpIHtcbiAgICB0aGlzLmVsLmRpc2FibGVkID0gZGlzYWJsZTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21pbG8tY29yZScpLnByb3RvO1xuXG5cbnZhciBNTFRpbWUgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MVGltZScsIHtcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkYXRhOiB7XG4gICAgICAgIGdldDogTUxUaW1lX2dldCxcbiAgICAgICAgc2V0OiBNTFRpbWVfc2V0LFxuICAgICAgICBkZWw6IE1MVGltZV9kZWwsXG4gICAgfSxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiAnbWwtdWktdGltZSdcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTFRpbWUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MVGltZTtcblxuXG52YXIgVElNRV9SRUdFWCA9IC9eKFswLTldezEsMn0pKD86XFw6fFxcLikoWzAtOV17MSwyfSkkL1xuICAgICwgVElNRV9URU1QTEFURSA9ICdoaDptbSc7XG5cbmZ1bmN0aW9uIE1MVGltZV9nZXQoKSB7XG4gICAgdmFyIHRpbWVTdHIgPSB0aGlzLmVsLnZhbHVlO1xuICAgIHZhciBtYXRjaCA9IHRpbWVTdHIubWF0Y2goVElNRV9SRUdFWCk7XG4gICAgaWYgKCEgbWF0Y2gpIHJldHVybjtcbiAgICB2YXIgaG91cnMgPSBtYXRjaFsxXVxuICAgICAgICAsIG1pbnMgPSBtYXRjaFsyXTtcbiAgICBpZiAoaG91cnMgPiAyMyB8fCBtaW5zID4gNTkpIHJldHVybjtcbiAgICB2YXIgdGltZSA9IG5ldyBEYXRlKDE5NzAsIDAsIDEsIGhvdXJzLCBtaW5zKTtcblxuICAgIHJldHVybiBfLnRvRGF0ZSh0aW1lKTtcbn1cblxuXG5mdW5jdGlvbiBNTFRpbWVfc2V0KHZhbHVlKSB7XG4gICAgdmFyIHRpbWUgPSBfLnRvRGF0ZSh2YWx1ZSk7XG4gICAgaWYgKCEgdGltZSkge1xuICAgICAgICB0aGlzLmVsLnZhbHVlID0gJyc7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdGltZVN0ciA9IFRJTUVfVEVNUExBVEVcbiAgICAgICAgICAgIC5yZXBsYWNlKCdoaCcsIHBhZCh0aW1lLmdldEhvdXJzKCkpKVxuICAgICAgICAgICAgLnJlcGxhY2UoJ21tJywgcGFkKHRpbWUuZ2V0TWludXRlcygpKSk7XG5cbiAgICB0aGlzLmVsLnZhbHVlID0gdGltZVN0cjtcbiAgICByZXR1cm4gdGltZVN0cjtcblxuICAgIGZ1bmN0aW9uIHBhZChuKSB7cmV0dXJuIG4gPCAxMCA/ICcwJyArIG4gOiBuOyB9XG59XG5cblxuZnVuY3Rpb24gTUxUaW1lX2RlbCgpIHtcbiAgICB0aGlzLmVsLnZhbHVlID0gJyc7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBDb21wb25lbnQgPSByZXF1aXJlKCcuLi9jX2NsYXNzJylcbiAgICAsIGNvbXBvbmVudHNSZWdpc3RyeSA9IHJlcXVpcmUoJy4uL2NfcmVnaXN0cnknKTtcblxuXG52YXIgTUxXcmFwcGVyID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTFdyYXBwZXInLCB7XG4gICAgY29udGFpbmVyOiB1bmRlZmluZWQsXG4gICAgZGF0YTogdW5kZWZpbmVkLFxuICAgIGV2ZW50czogdW5kZWZpbmVkLFxuICAgIGRvbToge1xuICAgICAgICBjbHM6ICdtbC11aS13cmFwcGVyJ1xuICAgIH1cbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MV3JhcHBlcik7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxXcmFwcGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi8uLi9jX3JlZ2lzdHJ5JylcbiAgICAsIGNvbXBvbmVudE5hbWUgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlsL2NvbXBvbmVudF9uYW1lJylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2hcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxuXG52YXIgQUxFUlRfQ1NTX0NMQVNTRVMgPSB7XG4gICAgc3VjY2VzczogJ2FsZXJ0LXN1Y2Nlc3MnLFxuICAgIHdhcm5pbmc6ICdhbGVydC13YXJuaW5nJyxcbiAgICBpbmZvOiAnYWxlcnQtaW5mbycsXG4gICAgZGFuZ2VyOiAnYWxlcnQtZGFuZ2VyJyxcbiAgICBmaXhlZDogJ2FsZXJ0LWZpeGVkJ1xufTtcblxuXG52YXIgTUxBbGVydCA9IENvbXBvbmVudC5jcmVhdGVDb21wb25lbnRDbGFzcygnTUxBbGVydCcsIHtcbiAgICBjb250YWluZXI6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHVuZGVmaW5lZCxcbiAgICBkb206IHtcbiAgICAgICAgY2xzOiBbJ21sLWJzLWFsZXJ0JywgJ2FsZXJ0JywgJ2ZhZGUnXSxcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgJ3JvbGUnOiAnYWxlcnQnLFxuICAgICAgICAgICAgJ2FyaWEtaGlkZGVuJzogJ3RydWUnXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHRlbXBsYXRlOiB7XG4gICAgICAgIHRlbXBsYXRlOiAnXFxcbiAgICAgICAgICAgIHt7PyBpdC5jbG9zZSB9fVxcXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtbC1iaW5kPVwiW2V2ZW50c106Y2xvc2VCdG5cIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cImFsZXJ0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvYnV0dG9uPlxcXG4gICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICB7ez0gaXQubWVzc2FnZX19J1xuICAgIH1cbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MQWxlcnQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MQWxlcnQ7XG5cblxuXy5leHRlbmQoTUxBbGVydCwge1xuICAgIGNyZWF0ZUFsZXJ0OiBNTEFsZXJ0JCRjcmVhdGVBbGVydCxcbiAgICBvcGVuQWxlcnQ6IE1MQWxlcnQkJG9wZW5BbGVydCxcbn0pO1xuXG5cbl8uZXh0ZW5kUHJvdG8oTUxBbGVydCwge1xuICAgIG9wZW5BbGVydDogTUxBbGVydCRvcGVuQWxlcnQsXG4gICAgY2xvc2VBbGVydDogTUxBbGVydCRjbG9zZUFsZXJ0XG59KTtcblxuXG4vKipcbiAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgYWxlcnQgaW5zdGFuY2UuIFRvIGNyZWF0ZSBhbmQgb3BlbiBhdCB0aGUgc2FtZSB0aW1lIHVzZSBbb3BlbkFsZXJ0XSgjTUxBbGVydCQkb3BlbkFsZXJ0KVxuICogYG9wdGlvbnNgIGlzIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgICAgIG1lc3NhZ2U6IHN0cmluZyBhbGVydCBtZXNzYWdlXG4gKiAgICAgIHR5cGU6ICAgIG9wdGlvbmFsIHN0cmluZyB0aGUgdHlwZSBvZiBhbGVydCBtZXNzYWdlLCBvbmUgb2Ygc3VjY2Vzcywgd2FybmluZywgaW5mbywgZGFuZ2VyLCBmaXhlZFxuICogICAgICAgICAgICAgICBkZWZhdWx0ICdpbmZvJ1xuICogICAgICBjbG9zZTogICBvcHRpb25hbCBmYWxzZSB0byBwcmV2ZW50IHVzZXIgZnJvbSBjbG9zaW5nXG4gKiAgICAgICAgICAgICAgIG9yIHRydWUgKGRlZmF1bHQpIHRvIGVuYWJsZSBjbG9zaW5nIGFuZCByZW5kZXIgYSBjbG9zZSBidXR0b25cbiAqICAgICAgdGltZW91dDogb3B0aW9uYWwgdGltZXIsIGluIG1pbGxpc2Vjb25kcyB0byBhdXRvbWF0aWNhbGx5IGNsb3NlIHRoZSBhbGVydFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIGFsZXJ0IGNvbmZpZ3VyYXRpb25cbiAqL1xuZnVuY3Rpb24gTUxBbGVydCQkY3JlYXRlQWxlcnQob3B0aW9ucykge1xuICAgIGNoZWNrKG9wdGlvbnMsIHtcbiAgICAgICAgbWVzc2FnZTogU3RyaW5nLFxuICAgICAgICB0eXBlOiBNYXRjaC5PcHRpb25hbChTdHJpbmcpLFxuICAgICAgICBjbG9zZTogTWF0Y2guT3B0aW9uYWwoQm9vbGVhbiksXG4gICAgICAgIHRpbWVvdXQ6IE1hdGNoLk9wdGlvbmFsKE51bWJlcilcbiAgICB9KTtcblxuICAgIHZhciBhbGVydCA9IE1MQWxlcnQuY3JlYXRlT25FbGVtZW50KCk7XG5cbiAgICBvcHRpb25zID0gX3ByZXBhcmVPcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgdmFyIGFsZXJ0Q2xzID0gQUxFUlRfQ1NTX0NMQVNTRVNbb3B0aW9ucy50eXBlXTtcbiAgICBhbGVydC5kb20uYWRkQ3NzQ2xhc3NlcyhhbGVydENscyk7XG5cbiAgICBhbGVydC5fYWxlcnQgPSB7XG4gICAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgfTtcblxuICAgIGFsZXJ0LnRlbXBsYXRlLnJlbmRlcihvcHRpb25zKS5iaW5kZXIoKTtcblxuICAgIHZhciBhbGVydFNjb3BlID0gYWxlcnQuY29udGFpbmVyLnNjb3BlO1xuXG4gICAgaWYgKG9wdGlvbnMuY2xvc2UpXG4gICAgICAgIGFsZXJ0U2NvcGUuY2xvc2VCdG4uZXZlbnRzLm9uKCdjbGljaycsXG4gICAgICAgICAgICB7IHN1YnNjcmliZXI6IF9vbkNsb3NlQnRuQ2xpY2ssIGNvbnRleHQ6IGFsZXJ0IH0pO1xuXG4gICAgaWYgKG9wdGlvbnMudGltZW91dClcbiAgICAgICAgdmFyIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgICAgICAgaWYoYWxlcnQuX2FsZXJ0LnZpc2libGUpXG4gICAgICAgICAgICAgICAgYWxlcnQuY2xvc2VBbGVydCgpO1xuICAgICAgICB9LCBvcHRpb25zLnRpbWVvdXQpO1xuXG4gICAgcmV0dXJuIGFsZXJ0O1xufVxuXG5cbi8qKlxuICogQ3JlYXRlIGFuZCBzaG93IGFsZXJ0IHBvcHVwXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgb2JqZWN0IHdpdGggbWVzc2FnZSwgdHlwZSwgY2xvc2UgYW5kIHRpbWVvdXRcbiAqIEByZXR1cm4ge01MQWxlcnR9IHRoZSBhbGVydCBpbnN0YW5jZVxuICovXG5mdW5jdGlvbiBNTEFsZXJ0JCRvcGVuQWxlcnQob3B0aW9ucykge1xuICAgIHZhciBhbGVydCA9IE1MQWxlcnQuY3JlYXRlQWxlcnQob3B0aW9ucyk7XG4gICAgYWxlcnQub3BlbkFsZXJ0KCk7XG4gICAgcmV0dXJuIGFsZXJ0O1xufVxuXG5cbmZ1bmN0aW9uIF9vbkNsb3NlQnRuQ2xpY2sodHlwZSwgZXZlbnQpIHtcbiAgICB0aGlzLmNsb3NlQWxlcnQoKTtcbn1cblxuXG5mdW5jdGlvbiBfcHJlcGFyZU9wdGlvbnMob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBfLmNsb25lKG9wdGlvbnMpO1xuICAgIG9wdGlvbnMuY2xvc2UgPSB0eXBlb2Ygb3B0aW9ucy5jbG9zZSA9PSAndW5kZWZpbmVkJyB8fCBvcHRpb25zLmNsb3NlID09PSB0cnVlO1xuICAgIG9wdGlvbnMudGltZW91dCA9IE1hdGguZmxvb3Iob3B0aW9ucy50aW1lb3V0KTtcbiAgICBvcHRpb25zLnR5cGUgPSBvcHRpb25zLnR5cGUgfHwgJ2luZm8nO1xuXG4gICAgcmV0dXJuIG9wdGlvbnM7XG59XG5cblxuLyoqXG4gKiBPcGVuIHRoZSBhbGVydFxuICovXG5mdW5jdGlvbiBNTEFsZXJ0JG9wZW5BbGVydCgpIHtcbiAgICBfdG9nZ2xlQWxlcnQuY2FsbCh0aGlzLCB0cnVlKTtcbn1cblxuXG4vKipcbiAqIENsb3NlIHRoZSBhbGVydFxuICovXG5mdW5jdGlvbiBNTEFsZXJ0JGNsb3NlQWxlcnQoKSB7XG4gICAgX3RvZ2dsZUFsZXJ0LmNhbGwodGhpcywgZmFsc2UpO1xuICAgIHRoaXMuZGVzdHJveSgpO1xufVxuXG5cbmZ1bmN0aW9uIF90b2dnbGVBbGVydChkb1Nob3cpIHtcbiAgICBkb1Nob3cgPSB0eXBlb2YgZG9TaG93ID09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgPyAhIHRoaXMuX2FsZXJ0LnZpc2libGVcbiAgICAgICAgICAgICAgICA6ICEhIGRvU2hvdztcblxuICAgIHZhciBhZGRSZW1vdmUgPSBkb1Nob3cgPyAnYWRkJyA6ICdyZW1vdmUnXG4gICAgICAgICwgYXBwZW5kUmVtb3ZlID0gZG9TaG93ID8gJ2FwcGVuZENoaWxkJyA6ICdyZW1vdmVDaGlsZCc7XG5cbiAgICB0aGlzLl9hbGVydC52aXNpYmxlID0gZG9TaG93O1xuXG4gICAgZG9jdW1lbnQuYm9keVthcHBlbmRSZW1vdmVdKHRoaXMuZWwpO1xuICAgIHRoaXMuZG9tLnRvZ2dsZShkb1Nob3cpO1xuICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICFkb1Nob3cpO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0W2FkZFJlbW92ZV0oJ2luJyk7XG4gICAgdGhpcy5lbFtkb1Nob3cgPyAnZm9jdXMnIDogJ2JsdXInXSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi8uLi9jX3JlZ2lzdHJ5JylcbiAgICAsIGNvbXBvbmVudE5hbWUgPSByZXF1aXJlKCcuLi8uLi8uLi91dGlsL2NvbXBvbmVudF9uYW1lJylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIGxvZ2dlciA9IG1pbG9Db3JlLnV0aWwubG9nZ2VyXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2hcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxuXG52YXIgREVGQVVMVF9CVVRUT05TID0gWyB7IHR5cGU6ICdkZWZhdWx0JywgbGFiZWw6ICdPSycsIHJlc3VsdDogJ09LJyB9IF07XG5cbnZhciBDTE9TRV9PUFRJT05TID0gWydiYWNrZHJvcCcsICdrZXlib2FyZCcsICdidXR0b24nXTtcblxudmFyIEJVVFRPTl9DU1NfQ0xBU1NFUyA9IHsgLy8gVE9ETyAtIHVzZSBpbiB0ZW1wbGF0ZVxuICAgIGRlZmF1bHQ6ICdidG4tZGVmYXVsdCcsXG4gICAgcHJpbWFyeTogJ2J0bi1wcmltYXJ5JyxcbiAgICBzdWNjZXNzOiAnYnRuLXN1Y2Nlc3MnLFxuICAgIGluZm86ICdidG4taW5mbycsXG4gICAgd2FybmluZzogJ2J0bi13YXJuaW5nJyxcbiAgICBkYW5nZXI6ICdidG4tZGFuZ2VyJyxcbiAgICBsaW5rOiAnYnRuLWxpbmsnXG59O1xuXG5cbi8qKlxuICogRGlhbG9nIGNsYXNzIHRvIHNob3cgY3VzdG9tIGRpYWxvZyBib3hlcyBiYXNlZCBvbiBjb25maWd1cmF0aW9uIC0gc2VlIFtjcmVhdGVEaWFsb2ddKCNNTERpYWxvZyQkY3JlYXRlRGlhbG9nKSBtZXRob2QuXG4gKiBPbmx5IG9uZSBkaWFsb2cgY2FuIGJlIG9wZW5lZCBhdCBhIHRpbWUgLSB0cnlpbmcgdG8gb3BlbiBhbm90aGVyIHdpbGwgbG9nIGVycm9yIHRvIGNvbnNvbGUuIEN1cnJlbnRseSBvcGVuZWQgZGlhbG9nIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgW2dldEN1cnJlbnREaWFsb2ddKCNNTERpYWxvZyQkZ2V0Q3VycmVudERpYWxvZykgY2xhc3MgbWV0aG9kLlxuICovXG52YXIgTUxEaWFsb2cgPSBDb21wb25lbnQuY3JlYXRlQ29tcG9uZW50Q2xhc3MoJ01MRGlhbG9nJywge1xuICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkLFxuICAgIGV2ZW50czogdW5kZWZpbmVkLFxuICAgIGRvbToge1xuICAgICAgICBjbHM6IFsnbWwtYnMtZGlhbG9nJywgJ21vZGFsJywgJ2ZhZGUnXSxcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgJ3JvbGUnOiAnZGlhbG9nJyxcbiAgICAgICAgICAgICdhcmlhLWhpZGRlbic6ICd0cnVlJ1xuICAgICAgICB9XG4gICAgfSxcbiAgICB0ZW1wbGF0ZToge1xuICAgICAgICB0ZW1wbGF0ZTogJ1xcXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIHt7PSBpdC5jc3NDbGFzcyB9fVwiPlxcXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cXFxuICAgICAgICAgICAgICAgICAgICB7ez8gaXQudGl0bGUgfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3s/IGl0LmNsb3NlLmJ1dHRvbiB9fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWwtYmluZD1cIltldmVudHNdOmNsb3NlQnRuXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIj4mdGltZXM7PC9idXR0b24+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIj57ez0gaXQudGl0bGUgfX08L2g0PlxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgICAgIHt7PyBpdC5odG1sIHx8IGl0LnRleHQgfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIiBtbC1iaW5kPVwiW2NvbnRhaW5lcl06ZGlhbG9nQm9keVwiPlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3s/IGl0Lmh0bWwgfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ez0gaXQuaHRtbCB9fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3s/P319XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+e3s9IGl0LnRleHQgfX08L3A+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgICAgIHt7PyBpdC5idXR0b25zICYmIGl0LmJ1dHRvbnMubGVuZ3RoIH19XFxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7fiBpdC5idXR0b25zIDpidG4gfX1cXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4te3s9IGJ0bi50eXBlIH19e3s/IGJ0bi5jbHMgfX0ge3s9IGJ0bi5jbHMgfX17ez99fVwiXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1sLWJpbmQ9XCJbZXZlbnRzXTp7ez0gYnRuLm5hbWUgfX1cIj57ez0gYnRuLmxhYmVsIH19PC9idXR0b24+XFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e359fVxcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXFxuICAgICAgICAgICAgICAgICAgICB7ez99fVxcXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxcbiAgICAgICAgICAgIDwvZGl2PidcbiAgICB9XG59KTtcblxuY29tcG9uZW50c1JlZ2lzdHJ5LmFkZChNTERpYWxvZyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTUxEaWFsb2c7XG5cblxuXy5leHRlbmQoTUxEaWFsb2csIHtcbiAgICBjcmVhdGVEaWFsb2c6IE1MRGlhbG9nJCRjcmVhdGVEaWFsb2csXG4gICAgb3BlbkRpYWxvZzogTUxEaWFsb2ckJG9wZW5EaWFsb2csXG4gICAgZ2V0T3BlbmVkRGlhbG9nOiBNTERpYWxvZyQkZ2V0T3BlbmVkRGlhbG9nXG59KTtcblxuXG5fLmV4dGVuZFByb3RvKE1MRGlhbG9nLCB7XG4gICAgb3BlbkRpYWxvZzogTUxEaWFsb2ckb3BlbkRpYWxvZyxcbiAgICBjbG9zZURpYWxvZzogTUxEaWFsb2ckY2xvc2VEaWFsb2csXG4gICAgZGVzdHJveTogTUxEaWFsb2ckZGVzdHJveVxufSk7XG5cblxuLyoqXG4gKiBDcmVhdGVzIGFuZCByZXR1cm5zIGRpYWxvZyBpbnN0YW5jZS4gVG8gY3JlYXRlIGFuZCBvcGVuIGF0IHRoZSBzYW1lIHRpbWUgW29wZW5EaWFsb2ddKCNNTERpYWxvZyQkb3BlbkRpYWxvZylcbiAqIGBvcHRpb25zYCBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAgIHRpdGxlOiBvcHRpb25hbCBkaWFsb2cgdGl0bGVcbiAqICAgICBodG1sOiBvcHRpb25hbCBkaWFsb2cgdGV4dCBhcyBodG1sICh3aWxsIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRleHQgaWYgYm90aCB0ZXh0IG5kIGh0bWwgYXJlIHBhc3NlZClcbiAqICAgICAgIG9yXG4gKiAgICAgdGV4dDogb3B0aW9uYWwgZGlhbG9nIHRleHRcbiAqICAgICBjbG9zZTogb3B0aW9uYWwgZmFsc2UgdG8gcHJldmVudCBiYWNrZHJvcCBhbmQgZXNjIGtleSBmcm9tIGNsb3NpbmcgdGhlIGRpYWxvZyBhbmQgcmVtb3ZpbmcgY2xvc2UgYnV0dG9uIGluIHRvcCByaWdodCBjb3JuZXJcbiAqICAgICAgICAgICAgb3IgdHJ1ZSAoZGVmYXVsdCkgdG8gZW5hYmxlIGFsbCBjbG9zZSBvcHRpb25zXG4gKiAgICAgICAgICAgIG9yIG9iamVjdCB3aXRoIHByb3BlcnRpZXNcbiAqICAgICAgICAgYmFja2Ryb3A6IGZhbHNlIG9yIHRydWUgKGRlZmF1bHQpLCBjbG9zZSBkaWFsb2cgd2hlbiBiYWNrZHJvcCBjbGlja2VkXG4gKiAgICAgICAgIGtleWJvYXJkOiBmYWxzZSBvciB0cnVlIChkZWZhdWx0KSwgY2xvc2UgZGlhbG9nIHdoZW4gZXNjIGtleSBpcyBwcmVzc2VkXG4gKiAgICAgICAgIGJ1dHRvbjogZmFsc2Ugb3IgdHJ1ZSAoZGVmYXVsdCksIHNob3cgY2xvc2UgYnV0dG9uIGluIHRoZSBoZWFkZXIgKHdvbid0IGJlIHNob3duIGlmIHRoZXJlIGlzIG5vIGhlYWRlciB3aGVuIHRpdGxlIGlzIG5vdCBwYXNzZWQpXG4gKiAgICAgYnV0dG9uczogb3B0aW9uYWwgYXJyYXkgb2YgYnV0dG9ucyBjb25maWd1cmF0aW9ucywgd2hlcmUgZWFjaCBidXR0b24gY29uZmlnIGlzIGFuIG9iamVjdFxuICogICAgICAgICBuYW1lOiAgIG9wdGlvbmFsIG5hbWUgb2YgY29tcG9uZW50LCBzaG91bGQgYmUgdW5pcXVlIGFuZCBzaG91bGQgbm90IGJlIGBjbG9zZUJ0bmAsIGlmIG5vdCBwYXNzZWQgYSB0aW1lc3RhbXAgYmFzZWQgbmFtZSB3aWxsIGJlIHVzZWRcbiAqICAgICAgICAgdHlwZTogICBidXR0b24gdHlwZSwgd2lsbCBkZXRlcm1pbmUgYnV0dG9uIENTUyBzdHlsZS4gUG9zc2libGUgdHlwZXMgYXJlOiBkZWZ1bHQsIHByaW1hcnksIHN1Y2Nlc3MsIGluZm8sIHdhcm5pbmcsIGRhbmdlciwgbGluayAobWFwIHRvIHJlbGF0ZWQgYm9vdHN0cmFwIGJ1dHRvbiBzdHlsZXMpXG4gKiAgICAgICAgIGxhYmVsOiAgYnV0dG9uIGxhYmVsXG4gKiAgICAgICAgIGNsb3NlOiAgb3B0aW9uYWwgZmFsc2UgdG8gcHJldmVudCB0aGlzIGJ1dHRvbiBmcm9tIGNsb3NpbmcgZGlhbG9nXG4gKiAgICAgICAgIHJlc3VsdDogc3RyaW5nIHdpdGggZGlhbG9nIGNsb3NlIHJlc3VsdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIGRpYWxvZyBzdWJzY3JpYmVyIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXJcbiAqICAgICAgICAgZGF0YTogICBhbnkgdmFsdWUvb2JqZWN0IG9yIGZ1bmN0aW9uIHRvIGNyZWF0ZSBkYXRhIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gZGlhbG9nIHN1YnNjcmliZXIgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuXG4gKiAgICAgICAgICAgICAgICAgSWYgZnVuY3Rpb24gaXMgcGFzc2VkIGl0IHdpbGwgYmUgY2FsbGVkIHdpdGggZGlhbG9nIGFzIGNvbnRleHQgYW5kIGJ1dHRvbiBvcHRpb25zIGFzIHBhcmFtZXRlci5cbiAqXG4gKiAgICAgSWYgYHRpdGxlYCBpcyBub3QgcGFzc2VkLCBkaWFsb2cgd2lsbCBub3QgaGF2ZSB0aXRsZSBzZWN0aW9uXG4gKiAgICAgSWYgbmVpdGhlciBgdGV4dGAgbm9yIGBodG1sYCBpcyBwYXNzZWQsIGRpYWxvZyB3aWxsIG5vdCBoYXZlIGJvZHkgc2VjdGlvbi5cbiAqICAgICBJZiBgYnV0dG9uc2AgYXJlIG5vdCBwYXNzZWQsIHRoZXJlIHdpbGwgb25seSBiZSBPSyBidXR0b24uXG4gKlxuICogV2hlbiBkaWFsb2cgaXMgY2xvc2VkLCB0aGUgc3Vic2NyaWJlciBpcyBjYWxsZWQgd2l0aCByZWF1bHQgYW5kIG9wdGlvbmFsIGRhdGEgYXMgZGVmaW5lZCBpbiBidXR0b25zIGNvbmZpZ3VyYXRpb25zLlxuICogSWYgYmFja2Ryb3AgaXMgY2xpY2tlZCBvciBFU0Mga2V5IGlzIHByZXNzZWQgdGhlIHJlc3VsdCB3aWxsIGJlICdkaXNtaXNzZWQnXG4gKiBJZiBjbG9zZSBidXR0b24gaW4gdGhlIHRvcCByaWdodCBjb3JuZXIgaXMgY2xpY2tlZCwgdGhlIHJlc3VsdCB3aWxsIGJlICdjbG9zZWQnIChkZWZhdWx0IHJlc3VsdClcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBkaWFsb2cgY29uZmlndXJhdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gaW5pdGlhbGl6ZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB0byBpbml0aWFsaXplIHRoZSBkaWFsb2dcbiAqL1xuZnVuY3Rpb24gTUxEaWFsb2ckJGNyZWF0ZURpYWxvZyhvcHRpb25zLCBpbml0aWFsaXplKSB7XG4gICAgY2hlY2sob3B0aW9ucywge1xuICAgICAgICB0aXRsZTogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSxcbiAgICAgICAgaHRtbDogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSxcbiAgICAgICAgdGV4dDogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKSxcbiAgICAgICAgY2xvc2U6IE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9uZU9mKEJvb2xlYW4sIHtcbiAgICAgICAgICAgIGJhY2tkcm9wOiBNYXRjaC5PcHRpb25hbChCb29sZWFuKSxcbiAgICAgICAgICAgIGtleWJvYXJkOiBNYXRjaC5PcHRpb25hbChCb29sZWFuKSxcbiAgICAgICAgICAgIGJ1dHRvbjogTWF0Y2guT3B0aW9uYWwoQm9vbGVhbilcbiAgICAgICAgfSkpLFxuICAgICAgICBidXR0b25zOiBNYXRjaC5PcHRpb25hbChbIHtcbiAgICAgICAgICAgIG5hbWU6IE1hdGNoLk9wdGlvbmFsKFN0cmluZyksXG4gICAgICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgICAgICBsYWJlbDogU3RyaW5nLFxuICAgICAgICAgICAgY2xvc2U6IE1hdGNoLk9wdGlvbmFsKEJvb2xlYW4pLFxuICAgICAgICAgICAgcmVzdWx0OiBNYXRjaC5PcHRpb25hbChTdHJpbmcpLFxuICAgICAgICAgICAgZGF0YTogTWF0Y2guT3B0aW9uYWwoTWF0Y2guQW55KSxcbiAgICAgICAgICAgIGNsczogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKVxuICAgICAgICB9IF0pLFxuICAgICAgICBjc3NDbGFzczogTWF0Y2guT3B0aW9uYWwoU3RyaW5nKVxuICAgIH0pO1xuXG4gICAgdmFyIGRpYWxvZyA9IE1MRGlhbG9nLmNyZWF0ZU9uRWxlbWVudCgpO1xuXG4gICAgb3B0aW9ucyA9IF9wcmVwYXJlT3B0aW9ucyhvcHRpb25zKTtcbiAgICBkaWFsb2cuX2RpYWxvZyA9IHtcbiAgICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICB9O1xuXG4gICAgZGlhbG9nLnRlbXBsYXRlXG4gICAgICAgIC5yZW5kZXIob3B0aW9ucylcbiAgICAgICAgLmJpbmRlcigpO1xuXG4gICAgdmFyIGRpYWxvZ1Njb3BlID0gZGlhbG9nLmNvbnRhaW5lci5zY29wZTtcblxuICAgIGlmIChvcHRpb25zLmNsb3NlLmJhY2tkcm9wKVxuICAgICAgICBkaWFsb2cuZXZlbnRzLm9uKCdjbGljaycsXG4gICAgICAgICAgICB7IHN1YnNjcmliZXI6IF9vbkJhY2tkcm9wQ2xpY2ssIGNvbnRleHQ6IGRpYWxvZyB9KTtcblxuICAgIGlmIChvcHRpb25zLnRpdGxlICYmIG9wdGlvbnMuY2xvc2UuYnV0dG9uKVxuICAgICAgICBkaWFsb2dTY29wZS5jbG9zZUJ0bi5ldmVudHMub24oJ2NsaWNrJyxcbiAgICAgICAgICAgIHsgc3Vic2NyaWJlcjogX29uQ2xvc2VCdG5DbGljaywgY29udGV4dDogZGlhbG9nIH0pO1xuXG4gICAgb3B0aW9ucy5idXR0b25zLmZvckVhY2goZnVuY3Rpb24oYnRuKSB7XG4gICAgICAgIHZhciBidXR0b25TdWJzY3JpYmVyID0ge1xuICAgICAgICAgICAgc3Vic2NyaWJlcjogXy5wYXJ0aWFsKF9kaWFsb2dCdXR0b25DbGljaywgYnRuKSxcbiAgICAgICAgICAgIGNvbnRleHQ6IGRpYWxvZ1xuICAgICAgICB9O1xuICAgICAgICBkaWFsb2dTY29wZVtidG4ubmFtZV0uZXZlbnRzLm9uKCdjbGljaycsIGJ1dHRvblN1YnNjcmliZXIpO1xuICAgIH0pO1xuXG4gICAgaWYgKGluaXRpYWxpemUpIGluaXRpYWxpemUoZGlhbG9nKTtcbiAgICByZXR1cm4gZGlhbG9nO1xufVxuXG5cbmZ1bmN0aW9uIF9kaWFsb2dCdXR0b25DbGljayhidXR0b24pIHtcbiAgICBpZiAoYnV0dG9uLmNsb3NlICE9PSBmYWxzZSlcbiAgICAgICAgX3RvZ2dsZURpYWxvZy5jYWxsKHRoaXMsIGZhbHNlKTtcblxuICAgIHZhciBkYXRhID0gXy5yZXN1bHQoYnV0dG9uLmRhdGEsIHRoaXMsIGJ1dHRvbik7XG4gICAgX2Rpc3BhdGNoUmVzdWx0LmNhbGwodGhpcywgYnV0dG9uLnJlc3VsdCwgZGF0YSk7XG59XG5cblxuZnVuY3Rpb24gX2Rpc3BhdGNoUmVzdWx0KHJlc3VsdCwgZGF0YSkge1xuICAgIHZhciBzdWJzY3JpYmVyID0gdGhpcy5fZGlhbG9nLnN1YnNjcmliZXI7XG4gICAgaWYgKHR5cGVvZiBzdWJzY3JpYmVyID09ICdmdW5jdGlvbicpXG4gICAgICAgIHN1YnNjcmliZXIuY2FsbCh0aGlzLCByZXN1bHQsIGRhdGEpO1xuICAgIGVsc2VcbiAgICAgICAgc3Vic2NyaWJlci5zdWJzY3JpYmVyLmNhbGwoc3Vic2NyaWJlci5jb250ZXh0LCByZXN1bHQsIGRhdGEpO1xufVxuXG5cbmZ1bmN0aW9uIF9vbkJhY2tkcm9wQ2xpY2soZXZlbnRUeXBlLCBldmVudCkge1xuICAgIGlmIChldmVudC50YXJnZXQgPT0gdGhpcy5lbClcbiAgICAgICAgdGhpcy5jbG9zZURpYWxvZygnZGlzbWlzc2VkJyk7XG59XG5cblxuZnVuY3Rpb24gX29uQ2xvc2VCdG5DbGljaygpIHtcbiAgICB0aGlzLmNsb3NlRGlhbG9nKCdjbG9zZWQnKTtcbn1cblxuXG5mdW5jdGlvbiBfb25LZXlEb3duKGV2ZW50KSB7XG4gICAgaWYgKG9wZW5lZERpYWxvZ1xuICAgICAgICAgICAgJiYgb3BlbmVkRGlhbG9nLl9kaWFsb2cub3B0aW9ucy5jbG9zZS5rZXlib2FyZFxuICAgICAgICAgICAgJiYgZXZlbnQua2V5Q29kZSA9PSAyNykgLy8gZXNjIGtleVxuICAgICAgICBvcGVuZWREaWFsb2cuY2xvc2VEaWFsb2coJ2Rpc21pc3NlZCcpO1xufVxuXG5cbmZ1bmN0aW9uIF9wcmVwYXJlT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IF8uY2xvbmUob3B0aW9ucyk7XG4gICAgb3B0aW9ucy5idXR0b25zID0gXy5jbG9uZShvcHRpb25zLmJ1dHRvbnMgfHwgREVGQVVMVF9CVVRUT05TKTtcbiAgICBvcHRpb25zLmJ1dHRvbnMuZm9yRWFjaChmdW5jdGlvbihidG4pIHtcbiAgICAgICAgYnRuLm5hbWUgPSBidG4ubmFtZSB8fCBjb21wb25lbnROYW1lKCk7XG4gICAgfSk7XG5cbiAgICBvcHRpb25zLmNsb3NlID0gdHlwZW9mIG9wdGlvbnMuY2xvc2UgPT0gJ3VuZGVmaW5lZCcgfHwgb3B0aW9ucy5jbG9zZSA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBfLm9iamVjdChDTE9TRV9PUFRJT05TLCB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0eXBlb2Ygb3B0aW9ucy5jbG9zZSA9PSAnb2JqZWN0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXy5tYXBUb09iamVjdChDTE9TRV9PUFRJT05TLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihvcHQpIHsgcmV0dXJuIG9wdGlvbnMuY2xvc2Vbb3B0XSAhPT0gZmFsc2U7IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfLm9iamVjdChDTE9TRV9PUFRJT05TLCBmYWxzZSk7XG5cbiAgICByZXR1cm4gb3B0aW9ucztcbn1cblxuXG4vKipcbiAqIENyZWF0ZSBhbmQgc2hvdyBkaWFsb2cgcG9wdXBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBvYmplY3Qgd2l0aCB0aXRsZSwgdGV4dCBhbmQgYnV0dG9ucy4gU2VlIFtjcmVhdGVEaWFsb2ddKCNNTERpYWxvZyQkY3JlYXRlRGlhbG9nKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBzdWJzY3JpYmVyIG9wdGlvbmFsIHN1YnNjcmliZXIgZnVuY3Rpb24gb3Igb2JqZWN0IHRoYXQgaXMgcGFzc2VkIHJlc3VsdCBhbmQgb3B0aW9uYWwgZGF0YS4gVW5sZXNzIGNvbnRleHQgaXMgZGVmaW5lZCwgZGlhbG9nIHdpbGwgYmUgdGhlIGNvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIE1MRGlhbG9nJCRvcGVuRGlhbG9nKG9wdGlvbnMsIHN1YnNjcmliZXIsIGluaXRpYWxpemUpIHtcbiAgICB2YXIgZGlhbG9nID0gTUxEaWFsb2cuY3JlYXRlRGlhbG9nKG9wdGlvbnMsIGluaXRpYWxpemUpO1xuICAgIGRpYWxvZy5vcGVuRGlhbG9nKHN1YnNjcmliZXIpO1xuICAgIHJldHVybiBkaWFsb2c7XG59XG5cblxuXG5mdW5jdGlvbiBfdG9nZ2xlRGlhbG9nKGRvU2hvdykge1xuICAgIGRvU2hvdyA9IHR5cGVvZiBkb1Nob3cgPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/ICEgdGhpcy5fZGlhbG9nLnZpc2libGVcbiAgICAgICAgICAgICAgICA6ICEhIGRvU2hvdztcblxuICAgIHZhciBhZGRSZW1vdmUgPSBkb1Nob3cgPyAnYWRkJyA6ICdyZW1vdmUnXG4gICAgICAgICwgYXBwZW5kUmVtb3ZlID0gZG9TaG93ID8gJ2FwcGVuZENoaWxkJyA6ICdyZW1vdmVDaGlsZCc7XG5cbiAgICB0aGlzLl9kaWFsb2cudmlzaWJsZSA9IGRvU2hvdztcblxuICAgIGlmIChkb1Nob3cgJiYgISBkaWFsb2dzSW5pdGlhbGl6ZWQpXG4gICAgICAgIF9pbml0aWFsaXplRGlhbG9ncygpO1xuXG4gICAgZG9jdW1lbnQuYm9keVthcHBlbmRSZW1vdmVdKHRoaXMuZWwpO1xuICAgIGlmIChiYWNrZHJvcEVsKVxuICAgICAgICBkb2N1bWVudC5ib2R5W2FwcGVuZFJlbW92ZV0oYmFja2Ryb3BFbCk7XG4gICAgdGhpcy5kb20udG9nZ2xlKGRvU2hvdyk7XG4gICAgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgIWRvU2hvdyk7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3RbYWRkUmVtb3ZlXSgnbW9kYWwtb3BlbicpO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0W2FkZFJlbW92ZV0oJ2luJyk7XG5cbiAgICBvcGVuZWREaWFsb2cgPSBkb1Nob3cgPyB0aGlzIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuZWxbZG9TaG93ID8gJ2ZvY3VzJyA6ICdibHVyJ10oKTtcbn1cblxuXG52YXIgZGlhbG9nc0luaXRpYWxpemVkLCBiYWNrZHJvcEVsO1xuXG5mdW5jdGlvbiBfaW5pdGlhbGl6ZURpYWxvZ3MoKSB7XG4gICAgYmFja2Ryb3BFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGJhY2tkcm9wRWwuY2xhc3NOYW1lID0gJ21vZGFsLWJhY2tkcm9wIGZhZGUgaW4nO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBfb25LZXlEb3duKTtcbiAgICBkaWFsb2dzSW5pdGlhbGl6ZWQgPSB0cnVlO1xufVxuXG5cbnZhciBvcGVuZWREaWFsb2c7XG5cbi8qKlxuICogT3BlbnMgZGlhbG9nIGluc3RhbmNlLlxuICogU3Vic2NyaWJlciBvYmplY3Qgc2hvdWxkIGhhdmUgdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBzdWJzY3JpYmVyIGZvciB0aGUgTWVzc2VuZ2VyIChhbHRob3VnaCBNZXNzZW5nZXIgaXMgbm90IHVzZWQpIC0gZWl0aGVyIGZ1bmN0aW9uIG9yIG9iamVjdCB3aXRoIHN1YnNjcmliZXIgYW5kIGNvbnRleHQgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdH0gc3Vic2NyaWJlciBzdWJzY3JpYmVyIG9iamVjdFxuICovXG5mdW5jdGlvbiBNTERpYWxvZyRvcGVuRGlhbG9nKHN1YnNjcmliZXIpIHtcbiAgICBjaGVjayhzdWJzY3JpYmVyLCBNYXRjaC5PbmVPZihGdW5jdGlvbiwgeyBzdWJzY3JpYmVyOiBGdW5jdGlvbiwgY29udGV4dDogTWF0Y2guQW55IH0pKTtcblxuICAgIGlmIChvcGVuZWREaWFsb2cpXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignTUxEaWFsb2cgb3BlbkRpYWxvZzogY2FuXFwndCBvcGVuIGRpYWxvZywgYW5vdGhlciBkaWFsb2cgaXMgYWxyZWFkeSBvcGVuJyk7XG5cbiAgICB0aGlzLl9kaWFsb2cuc3Vic2NyaWJlciA9IHN1YnNjcmliZXI7XG4gICAgX3RvZ2dsZURpYWxvZy5jYWxsKHRoaXMsIHRydWUpO1xufVxuXG5cbi8qKlxuICogQ2xvc2VzIGRpYWxvZyBpbnN0YW5jZSwgb3B0aW9uYWxseSBwYXNzaW5nIHJlc3VsdCBhbmQgZGF0YSB0byBkaWFsb2cgc3Vic2NyaWJlci5cbiAqIElmIG5vIHJlc3VsdCBpcyBwYXNzZWQsICdjbG9zZWQnIHdpbGwgYmUgcGFzc2VkIHRvIHN1YnNjcmliZXIuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHJlc3VsdCBkaWFsb2cgcmVzdWx0LCBwYXNzZWQgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciB0byBzdWJjc3JpYmVyXG4gKiBAcGFyYW0ge0FueX0gZGF0YSBvcHRpb25hbCBkaWFsb2cgZGF0YSwgcGFzc2VkIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyIHRvIHN1YnNjcmliZXJcbiAqL1xuZnVuY3Rpb24gTUxEaWFsb2ckY2xvc2VEaWFsb2cocmVzdWx0LCBkYXRhKSB7XG4gICAgaWYgKCEgb3BlbmVkRGlhbG9nKVxuICAgICAgICByZXR1cm4gbG9nZ2VyLndhcm4oJ01MRGlhbG9nIGNsb3NlRGlhbG9nOiBjYW5cXCd0IGNsb3NlIGRpYWxvZywgbm8gZGlhbG9nIG9wZW4nKTtcblxuICAgIHJlc3VsdCA9IHJlc3VsdCB8fCAnY2xvc2VkJztcblxuICAgIF90b2dnbGVEaWFsb2cuY2FsbCh0aGlzLCBmYWxzZSk7XG4gICAgX2Rpc3BhdGNoUmVzdWx0LmNhbGwodGhpcywgcmVzdWx0LCBkYXRhKTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgY3VycmVudGx5IG9wZW5lZCBkaWFsb2dcbiAqXG4gKiBAcmV0dXJuIHtNTERpYWxvZ31cbiAqL1xuZnVuY3Rpb24gTUxEaWFsb2ckJGdldE9wZW5lZERpYWxvZygpIHtcbiAgICByZXR1cm4gb3BlbmVkRGlhbG9nO1xufVxuXG5cbmZ1bmN0aW9uIE1MRGlhbG9nJGRlc3Ryb3koKSB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIF9vbktleURvd24pO1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vLi4vY19jbGFzcycpXG4gICAgLCBjb21wb25lbnRzUmVnaXN0cnkgPSByZXF1aXJlKCcuLi8uLi9jX3JlZ2lzdHJ5JylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXJcbiAgICAsIERPTUxpc3RlbmVycyA9IHJlcXVpcmUoJy4uLy4uLy4uL3V0aWwvZG9tX2xpc3RlbmVycycpO1xuXG5cbnZhciBUT0dHTEVfQ1NTX0NMQVNTID0gJ2Ryb3Bkb3duLXRvZ2dsZSdcbiAgICAsIE1FTlVfQ1NTX0NMQVNTID0gJ2Ryb3Bkb3duLW1lbnUnO1xuXG5cbnZhciBNTERyb3Bkb3duID0gQ29tcG9uZW50LmNyZWF0ZUNvbXBvbmVudENsYXNzKCdNTERyb3Bkb3duJywge1xuICAgIGV2ZW50czogdW5kZWZpbmVkLFxuICAgIGRvbToge1xuICAgICAgICBjbHM6IFsnbWwtYnMtZHJvcGRvd24nLCAnZHJvcGRvd24nXVxuICAgIH1cbn0pO1xuXG5jb21wb25lbnRzUmVnaXN0cnkuYWRkKE1MRHJvcGRvd24pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1MRHJvcGRvd247XG5cblxuXy5leHRlbmRQcm90byhNTERyb3Bkb3duLCB7XG4gICAgc3RhcnQ6IE1MRHJvcGRvd24kc3RhcnQsXG4gICAgZGVzdHJveTogTUxEcm9wZG93biRkZXN0cm95LFxuICAgIHRvZ2dsZU1lbnU6IE1MRHJvcGRvd24kdG9nZ2xlTWVudSxcbiAgICBzaG93TWVudTogTUxEcm9wZG93biRzaG93TWVudSxcbiAgICBoaWRlTWVudTogTUxEcm9wZG93biRoaWRlTWVudVxufSk7XG5cblxuZnVuY3Rpb24gTUxEcm9wZG93biRzdGFydCgpIHtcbiAgICB2YXIgdG9nZ2xlRWwgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy4nICsgVE9HR0xFX0NTU19DTEFTUylcbiAgICAgICAgLCBtZW51RWwgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy4nICsgTUVOVV9DU1NfQ0xBU1MpO1xuXG4gICAgaWYgKCEgKHRvZ2dsZUVsICYmIG1lbnVFbCkpXG4gICAgICAgIHJldHVybiBsb2dnZXIuZXJyb3IoJ01MRHJvcGRvd246JywgVE9HR0xFX0NTU19DTEFTUywgJ29yJywgTUVOVV9DU1NfQ0xBU1MsICdpc25cXCd0IGZvdW5kJyk7XG5cbiAgICB2YXIgZG9jID0gd2luZG93LmRvY3VtZW50XG4gICAgICAgICwgY2xpY2tIYW5kbGVyID0gdGhpcy50b2dnbGVNZW51LmJpbmQodGhpcywgdW5kZWZpbmVkKTtcblxuICAgIHZhciBsaXN0ZW5lcnMgPSBuZXcgRE9NTGlzdGVuZXJzO1xuICAgIHRoaXMuX2Ryb3Bkb3duID0ge1xuICAgICAgICBtZW51OiBtZW51RWwsXG4gICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH07XG4gICAgdGhpcy5oaWRlTWVudSgpO1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGxpc3RlbmVycy5hZGQodG9nZ2xlRWwsICdjbGljaycsIGNsaWNrSGFuZGxlcik7XG4gICAgLy9tYXliZSBvbmx5IGFkZCB0aGlzIGV2ZW50cyBpZiBpcyBvcGVuP1xuICAgIGxpc3RlbmVycy5hZGQoZG9jLCAnbW91c2VvdXQnLCBvbkRvY091dCk7XG4gICAgbGlzdGVuZXJzLmFkZChkb2MsICdjbGljaycsIG9uQ2xpY2spO1xuXG5cbiAgICBmdW5jdGlvbiBvbkRvY091dChldmVudCkge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0XG4gICAgICAgICAgICAsIHJlbGF0ZWRUYXJnZXQgPSBldmVudC5yZWxhdGVkVGFyZ2V0XG4gICAgICAgICAgICAsIGxpc3RlbmVycyA9IHNlbGYuX2Ryb3Bkb3duLmxpc3RlbmVycztcblxuICAgICAgICBpZiAoaXNJZnJhbWUodGFyZ2V0KSlcbiAgICAgICAgICAgIGxpc3RlbmVycy5yZW1vdmUodGFyZ2V0LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQsICdjbGljaycsIG9uQ2xpY2spO1xuXG4gICAgICAgIGlmIChpc0lmcmFtZShyZWxhdGVkVGFyZ2V0KSlcbiAgICAgICAgICAgIGxpc3RlbmVycy5hZGQocmVsYXRlZFRhcmdldC5jb250ZW50V2luZG93LmRvY3VtZW50LCAnY2xpY2snLCBvbkNsaWNrKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbkNsaWNrKGV2ZW50KSB7XG4gICAgICAgIGlmICghc2VsZi5lbC5jb250YWlucyhldmVudC50YXJnZXQpKVxuICAgICAgICAgICAgc2VsZi5oaWRlTWVudSgpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBpc0lmcmFtZShlbCkge1xuICAgIHJldHVybiBlbCAmJiBlbC50YWdOYW1lID09ICdJRlJBTUUnO1xufVxuXG5cbmZ1bmN0aW9uIE1MRHJvcGRvd24kZGVzdHJveSgpIHtcbiAgICB0aGlzLl9kcm9wZG93bi5saXN0ZW5lcnMucmVtb3ZlQWxsKCk7XG4gICAgZGVsZXRlIHRoaXMuX2Ryb3Bkb3duO1xuICAgIENvbXBvbmVudC5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5cbmZ1bmN0aW9uIE1MRHJvcGRvd24kc2hvd01lbnUoKSB7XG4gICAgdGhpcy50b2dnbGVNZW51KHRydWUpO1xufVxuXG5cbmZ1bmN0aW9uIE1MRHJvcGRvd24kaGlkZU1lbnUoKSB7XG4gICAgdGhpcy50b2dnbGVNZW51KGZhbHNlKTtcbn1cblxuXG5mdW5jdGlvbiBNTERyb3Bkb3duJHRvZ2dsZU1lbnUoZG9TaG93KSB7XG4gICAgZG9TaG93ID0gdHlwZW9mIGRvU2hvdyA9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgID8gISB0aGlzLl9kcm9wZG93bi52aXNpYmxlXG4gICAgICAgICAgICAgICAgOiAhISBkb1Nob3c7XG5cbiAgICB0aGlzLl9kcm9wZG93bi52aXNpYmxlID0gZG9TaG93O1xuXG4gICAgdmFyIG1lbnUgPSB0aGlzLl9kcm9wZG93bi5tZW51O1xuICAgIG1lbnUuc3R5bGUuZGlzcGxheSA9IGRvU2hvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2Jsb2NrJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ25vbmUnO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbi8vIDxhIG5hbWU9XCJjb25maWdcIj48L2E+XG4vLyBtaWxvLmNvbmZpZ1xuLy8gLS0tLS0tLS0tLS1cblxuLy8gSXQgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgYWxsb3dzIHRvIGNoYW5nZSBtaWxvIGNvbmZpZ3VyYXRpb25zIGFuZCBhbHNvXG4vLyBhY2Nlc3MgdGhlbSBvbiBjb25maWcncyBwcm9wZXJ0aWVzLlxuXG4vLyBgYGBqYXZhc2NyaXB0XG4vLyBtaWxvLmNvbmZpZyh7XG4vLyAgICAgYXR0cnM6IHtcbi8vICAgICAgICAgYmluZDogJ21sLWJpbmQnLFxuLy8gICAgICAgICBsb2FkOiAnbWwtbG9hZCdcbi8vICAgICB9XG4vLyB9KTtcbi8vIGBgYFxuXG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGRvVCA9IG1pbG9Db3JlLnV0aWwuZG9UO1xuXG5cbnZhciBjb25maWcgPSBtb2R1bGUuZXhwb3J0cyA9IG1pbG9Db3JlLmNvbmZpZztcblxuXG5jb25maWcoe1xuICAgIGF0dHJzOiB7XG4gICAgICAgIGJpbmQ6ICdtbC1iaW5kJyxcbiAgICAgICAgbG9hZDogJ21sLWxvYWQnXG4gICAgfSxcbiAgICBjb21wb25lbnRSZWY6ICdfX19taWxvX2NvbXBvbmVudCcsXG4gICAgY29tcG9uZW50UHJlZml4OiAnbWlsb18nLFxuICAgIHRlbXBsYXRlOiB7XG4gICAgICAgIGNvbXBpbGU6IGRvVC5jb21waWxlXG4gICAgfSxcbiAgICBkb21TdG9yYWdlOiB7XG4gICAgICAgIHR5cGVTdWZmaXg6ICc6X19fbWlsb19kYXRhX3R5cGUnLFxuICAgICAgICBwcmVmaXhTZXBhcmF0b3I6ICcvJyxcbiAgICAgICAgcm9vdDogJycsXG4gICAgICAgIG1lc3NhZ2VLZXk6ICdfX19taWxvX21lc3NhZ2UvJyxcbiAgICAgICAgbWVzc2FnZVRpbWVzdGFtcDogJ19fX21pbG9fdGltZXN0YW1wJyxcbiAgICAgICAgcXVvdGFFeGNlZWRlZDoge1xuICAgICAgICAgICAgdGhyb3dFcnJvcjogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGZhbHNlXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGRyYWdEcm9wOiB7XG4gICAgICAgIGRhdGFUeXBlczoge1xuICAgICAgICAgICAgY29tcG9uZW50OiAneC1hcHBsaWNhdGlvbi9taWxvL2NvbXBvbmVudCcsXG4gICAgICAgICAgICBjb21wb25lbnRNZXRhVGVtcGxhdGU6ICd4LWFwcGxpY2F0aW9uL21pbG8vY29tcG9uZW50LW1ldGEvJWNsYXNzLyVuYW1lLyVwYXJhbXMnLFxuICAgICAgICAgICAgY29tcG9uZW50TWV0YVJlZ2V4OiAvXnhcXC1hcHBsaWNhdGlvblxcL21pbG9cXC9jb21wb25lbnRcXC1tZXRhXFwvKFthLXowLTldKylcXC8oW2EtejAtOV0rKVxcLyhbYS16MC05XSopJC8sXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJlcXVlc3Q6IHtcbiAgICAgICAganNvbnBUaW1lb3V0OiA2MDAwMCxcbiAgICAgICAganNvbnBDYWxsYmFja1ByZWZpeDogJ19fX21pbG9fY2FsbGJhY2tfJyxcbiAgICAgICAgb3B0aW9uc0tleTogJ19fX21pbG9fb3B0aW9ucycsXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICB0aW1lb3V0OiA2MDAwMFxuICAgICAgICB9XG4gICAgfSxcbiAgICB3ZWJzb2NrZXQ6IHtcbiAgICAgICAgcnBjOiB7XG4gICAgICAgICAgICB0aW1lb3V0OiAxNTAwMCxcbiAgICAgICAgICAgIHJlc3BvbnNlUHJlZml4OiAncmVzcG9uc2VfJ1xuICAgICAgICB9XG4gICAgfSxcbiAgICBkZXByZWNhdGlvbldhcm5pbmc6ICdvbmNlJ1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1pbG9NYWlsID0gcmVxdWlyZSgnLi9zZXJ2aWNlcy9tYWlsJylcbiAgICAsIHJlcXVlc3QgPSByZXF1aXJlKCcuL3V0aWwvcmVxdWVzdCcpXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCB1dGlsRG9tID0gcmVxdWlyZSgnLi91dGlsL2RvbScpXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuL2NvbmZpZycpXG4gICAgLCBMb2FkQXR0cmlidXRlID0gcmVxdWlyZSgnLi9hdHRyaWJ1dGVzL2FfbG9hZCcpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gbG9hZGVyO1xuXG4vKipcbiAqIGBtaWxvLmxvYWRlcmBcbiAqIFxuICogUmVjdXJzaXZlbHkgc2NhbnMgdGhlIGRvY3VtZW50IHRyZWUgaW5zaWRlIGByb290RWxgIChkb2N1bWVudC5ib2R5IGJ5IGRlZmF1bHQpIGxvb2tpbmcgZm9yIF9fbWwtbG9hZF9fIEBhdHRyaWJ1dGUuXG4gKiBPbmUgbGV2ZWwgbG9hZCBpcyBleGVjdXRlZC4gTm8gYWRkaXRpb25hbCBsb2FkZXIgZ2V0IGNhbGxlZCBvbiBpbnNpZGUgX19tbC1sb2FkX18gYXR0cmlidXRlcy4gXG4gKlxuICogUG9zc2libGUgdXNhZ2VzOlxuICogLSBtaWxvLmxvYWRlcihbbXlSb290RWwsXVtteVJlbW92ZUF0dHJpYnV0ZSxdbXlDYWxsYmFjaylcbiAqIFxuICogQHBhcmFtICB7RWxlbWVudH0gIHJvb3RFbCAgICAgICAgICBSb290IGVsZW1lbnQgaW5zaWRlIHdoaWNoIERPTSB3aWxsIGJlIHNjYW5uZWQgKGRvY3VtZW50LmJvZHkgYnkgZGVmYXVsdCkuXG4gKiBAcGFyYW0gIHtCb29sZWFufSAgcmVtb3ZlQXR0cmlidXRlIElmIHNldCB0byB0cnVlLCB0aGVuIHRoZSBfX21sLWxvYWRfXyBhdHRyaWJ1dGUgd2lsbCBiZSByZW1vdmVkIG9uY2UgbG9hZGVyIGhhcyBiZWVuIGV4ZWN1dGVkIChGYWxzZSBieSBkZWZhdWx0KS5cbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjYWxsYmFjayAgICAgICAgQ2FsbGJhY2sgdG8gY2FsbCBhZnRlciBhbGwgZWxlbWVudHMgZ2V0IGxvYWRlZCAoUmVxdWlyZWQpLlxuICovXG5mdW5jdGlvbiBsb2FkZXIocm9vdEVsLCByZW1vdmVBdHRyaWJ1dGUsIGNhbGxiYWNrKSB7XG4gICAgbWlsbyhmdW5jdGlvbigpIHtcbiAgICAgICAgX2xvYWRlcihyb290RWwsIHJlbW92ZUF0dHJpYnV0ZSwgY2FsbGJhY2spO1xuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIF9sb2FkZXIocm9vdEVsLCByZW1vdmVBdHRyaWJ1dGUsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiByb290RWwgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYWxsYmFjayA9IHJvb3RFbDtcbiAgICAgICAgcm9vdEVsID0gdW5kZWZpbmVkO1xuICAgICAgICByZW1vdmVBdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJlbW92ZUF0dHJpYnV0ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNhbGxiYWNrID0gcmVtb3ZlQXR0cmlidXRlO1xuICAgICAgICByZW1vdmVBdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByb290RWwgPSByb290RWwgfHwgZG9jdW1lbnQuYm9keTtcblxuICAgIG1pbG9NYWlsLnBvc3RNZXNzYWdlKCdsb2FkZXInLCB7IHN0YXRlOiAnc3RhcnRlZCcgfSk7XG4gICAgX2xvYWRWaWV3c0luRWxlbWVudChyb290RWwsIHJlbW92ZUF0dHJpYnV0ZSwgZnVuY3Rpb24odmlld3MpIHtcbiAgICAgICAgbWlsb01haWwucG9zdE1lc3NhZ2UoJ2xvYWRlcicsIHsgXG4gICAgICAgICAgICBzdGF0ZTogJ2ZpbmlzaGVkJyxcbiAgICAgICAgICAgIHZpZXdzOiB2aWV3c1xuICAgICAgICB9KTtcbiAgICAgICAgY2FsbGJhY2sodmlld3MpO1xuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIF9sb2FkVmlld3NJbkVsZW1lbnQocm9vdEVsLCByZW1vdmVBdHRyaWJ1dGUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGxvYWRFbGVtZW50cyA9IHJvb3RFbC5nZXRBdHRyaWJ1dGUoY29uZmlnLmF0dHJzLmxvYWQpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFtyb290RWxdXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHJvb3RFbC5xdWVyeVNlbGVjdG9yQWxsKCdbJyArIGNvbmZpZy5hdHRycy5sb2FkICsgJ10nKTtcblxuICAgIHZhciB2aWV3cyA9IHt9XG4gICAgICAgICwgdG90YWxDb3VudCA9IGxvYWRFbGVtZW50cy5sZW5ndGhcbiAgICAgICAgLCBsb2FkZWRDb3VudCA9IDA7XG5cbiAgICBfLmZvckVhY2gobG9hZEVsZW1lbnRzLCBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgbG9hZFZpZXcoZWwsIHJlbW92ZUF0dHJpYnV0ZSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICB2aWV3c1tlbC5pZF0gPSBlcnIgfHwgZWw7XG4gICAgICAgICAgICBsb2FkZWRDb3VudCsrO1xuICAgICAgICAgICAgaWYgKGxvYWRlZENvdW50ID09IHRvdGFsQ291bnQpXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sodmlld3MpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cblxuZnVuY3Rpb24gbG9hZFZpZXcoZWwsIHJlbW92ZUF0dHJpYnV0ZSwgY2FsbGJhY2spIHtcbiAgICBpZiAodXRpbERvbS5jaGlsZHJlbihlbCkubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhblxcJ3QgbG9hZCBodG1sIGludG8gZWxlbWVudCB0aGF0IGlzIG5vdCBlbXB0eScpO1xuXG4gICAgdmFyIGF0dHIgPSBuZXcgTG9hZEF0dHJpYnV0ZShlbCk7XG5cbiAgICBhdHRyLnBhcnNlKCkudmFsaWRhdGUoKTtcblxuICAgIHJlcXVlc3QuZ2V0KGF0dHIubG9hZFVybCwgZnVuY3Rpb24oZXJyLCBodG1sKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIGVyci5tZXNzYWdlID0gZXJyLm1lc3NhZ2UgfHwgJ2NhblxcJ3QgbG9hZCBmaWxlICcgKyBhdHRyLmxvYWRVcmw7XG4gICAgICAgICAgICAvLyBsb2dnZXIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIGlmIChyZW1vdmVBdHRyaWJ1dGUpIExvYWRBdHRyaWJ1dGUucmVtb3ZlKGVsKTtcbiAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxuLy8gcmVnaXN0ZXIgaW5jbHVkZWQgZmFjZXRzXG5yZXF1aXJlKCcuL3VzZV9mYWNldHMnKTtcblxuLy8gcmVnaXN0ZXIgaW5jbHVkZWQgY29tcG9uZW50c1xucmVxdWlyZSgnLi91c2VfY29tcG9uZW50cycpO1xuXG5cbi8qKlxuICogYG1pbG9gXG4gKlxuICogQSBtaW5pbWFsaXN0IGJyb3dzZXIgZnJhbWV3b3JrIHRoYXQgYmluZHMgRE9NIGVsZW1lbnRzIHRvIEpTIGNvbXBvbmVudHMgYW5kIGNvbXBvbmVudHMgdG8gbW9kZWxzLlxuICpcbiAqIGBtaWxvYCBpcyBhdmFpbGFibGUgYXMgZ2xvYmFsIG9iamVjdCBpbiB0aGUgYnJvd3Nlci5cbiAqIEF0IHRoZSBtb21lbnQgaXQgaXMgbm90IHBvc3NpaWJsZSB0byByZXF1aXJlIGl0IHdpdGggYnJvd3NlcmlmeSB0byBoYXZlIGl0IGJ1bmRsZWQgd2l0aCB0aGUgYXBwIGJlY2F1c2Ugb2YgdGhlIHdheSBbYnJmc10oaHR0cHM6Ly9naXRodWIuY29tL3N1YnN0YWNrL2JyZnMpIGJyb3dzZXJpZnkgcGx1Z2luIGlzIGltcGxlbWVudGVkLlxuICogSXQgaXMgcG9zc2libGUgdGhvdWdoIHRvIHJlcXVpcmUgYG1pbG9gIHdpdGggbm9kZSB0byB1c2UgdW5pdmVyc2FsIHBhcnRzIG9mIHRoZSBmcmFtZXdvcmsgKGFic3RyYWN0IGNsYXNzZXMsIE1lc3NlbmdlciwgTW9kZWwsIGV0Yy4pOlxuICogYGBgXG4gKiB2YXIgbWlsbyA9IHJlcXVpcmUoJ21pbG9qcycpO1xuICogYGBgXG4gKiBcbiAqIGBtaWxvYCBpdHNlbGYgaXMgYSBmdW5jdGlvbiB0aGF0IGluIHRoZSBicm93c2VyIGNhbiBiZSB1c2VkIHRvIGRlbGF5IGV4ZWN1dGlvbiB1bnRpbCBET00gaXMgcmVhZHkuXG4gKi9cbmZ1bmN0aW9uIG1pbG8oZnVuYykge1xuICAgIG1pbG8udXRpbC5kb21SZWFkeShmdW5jKTtcbn1cblxuXG4vKipcbiAqICMjIyNNaWxvIHBhY2thZ2VzIyMjI1xuICpcbiAqIC0gW2xvYWRlcl0oLi9sb2FkZXIuanMuaHRtbCkgLSBsb2FkaW5nIHN1YnZpZXdzIGludG8gcGFnZVxuICogLSBbYmluZGVyXSguL2JpbmRlci5qcy5odG1sKSAtIGNvbXBvbmVudHMgaW5zdGFudGlhdGlvbiBhbmQgYmluZGluZyBvZiBET00gZWxlbWVudHMgdG8gdGhlbVxuICogLSBbbWluZGVyXSguL21pbmRlci5qcy5odG1sKSAtIGRhdGEgcmVhY3Rpdml0eSwgb25lIG9yIHR3byB3YXksIHNoYWxsb3cgb3IgZGVlcCwgYXMgeW91IGxpa2UgaXRcbiAqIC0gW21haWxdKC4vbWFpbC9pbmRleC5qcy5odG1sKSAtIGFwcGxpY2FpdG9uIGxldmVsIG1lc3NlbmdlciwgYWxzbyBjb25uZWN0cyB0byBtZXNzYWdlcyBmcm9tIG90aGVyIHdpbmRvd3MgZGlzcGF0Y2hlZCB3aXRoIGB3aW5kb3cucG9zdE1lc3NhZ2VgLlxuICogLSBbY29uZmlnXSguL2NvbmZpZy5qcy5odG1sKSAtIG1pbG8gY29uZmlndXJhdGlvblxuICogLSBbdXRpbF0oLi91dGlsL2luZGV4LmpzLmh0bWwpIC0gbG9nZ2VyLCByZXF1ZXN0LCBkb20sIGNoZWNrLCBlcnJvciwgZXRjLlxuICogLSBbY2xhc3Nlc10oLi9jbGFzc2VzLmpzLmh0bWwpIC0gYWJzdHJhY3QgYW5kIGJhc2UgY2xhc3Nlc1xuICogLSBbYXR0cmlidXRlc10oLi9hdHRyaWJ1dGVzL2luZGV4LmpzLmh0bWwpIC0gY2xhc3NlcyB0aGF0IHdyYXAgRE9NIGVsZW1lbnRzIGF0dHJpYnV0ZXMgcmVjb2duaXplZCBieSBtaWxvXG4gKiAtIFtDb21wb25lbnRGYWNldF0oLi9jb21wb25lbnRzL2NfZmFjZXQuanMuaHRtbCkgLSBiYXNlIGNsYXNzIG9mIENvbXBvbmVudCBmYWNldFxuICogLSBbQ29tcG9uZW50XSguL2NvbXBvbmVudHMvY19jbGFzcy5qcy5odG1sKSAtIGJhc2UgQ29tcG9uZW50IGNsYXNzXG4gKiAtIFtNZXNzZW5nZXJdKC4vbWVzc2VuZ2VyL2luZGV4LmpzLmh0bWwpIC0gZ2VuZXJpYyBNZXNzZW5nZXIgdXNlZCBpbiBtb3N0IG90aGVyIG1pbG8gY2xhc3NlcywgY2FuIGJlIG1peGVkIGludG8gYXBwIGNsYXNzZXMgdG9vLlxuICogLSBbTW9kZWxdKC4vbW9kZWwvaW5kZXguanMuaHRtbCkgLSBNb2RlbCBjbGFzcyB0aGF0IGVtaXRzIG1lc3NhZ2VzIG9uIGNoYW5nZXMgdG8gYW55IGRlcHRoIHdpdGhvdXQgdGltZXIgYmFzZWQgd2F0Y2hpbmdcbiAqIC0gW3JlZ2lzdHJ5XSguL3JlZ2lzdHJ5LmpzLmh0bWwpIC0gcmVnaXN0cmllcyBvZiBmYXNldHMgYW5kIGNvbXBvbmVudHMgY2xhc3Nlc1xuICovXG5fLmV4dGVuZChtaWxvLCB7XG4gICAgTWVzc2VuZ2VyOiBtaWxvQ29yZS5NZXNzZW5nZXIsXG4gICAgTW9kZWw6IG1pbG9Db3JlLk1vZGVsLFxuICAgIG1pbmRlcjogbWlsb0NvcmUubWluZGVyLFxuICAgIGxvYWRlcjogcmVxdWlyZSgnLi9sb2FkZXInKSxcbiAgICBiaW5kZXI6IHJlcXVpcmUoJy4vYmluZGVyJyksXG4gICAgbWFpbDogcmVxdWlyZSgnLi9zZXJ2aWNlcy9tYWlsJyksXG4gICAgd2luZG93OiByZXF1aXJlKCcuL3NlcnZpY2VzL3dpbmRvdycpLFxuICAgIGNvbmZpZzogcmVxdWlyZSgnLi9jb25maWcnKSxcbiAgICB1dGlsOiByZXF1aXJlKCcuL3V0aWwnKSxcbiAgICBjbGFzc2VzOiByZXF1aXJlKCcuL2NsYXNzZXMnKSxcbiAgICBhdHRyaWJ1dGVzOiByZXF1aXJlKCcuL2F0dHJpYnV0ZXMnKSxcbiAgICBDb21wb25lbnRGYWNldDogcmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXQnKSxcbiAgICBDb21wb25lbnQ6IHJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2NsYXNzJyksXG4gICAgQ29tbWFuZDogcmVxdWlyZSgnLi9jb21tYW5kJyksXG4gICAgcmVnaXN0cnk6IHJlcXVpcmUoJy4vcmVnaXN0cnknKSxcbiAgICBtaWxvX3ZlcnNpb246ICcwLjIuNicsXG4gICAgY3JlYXRlQ29tcG9uZW50Q2xhc3M6IHJlcXVpcmUoJy4vdXRpbC9jcmVhdGVfY29tcG9uZW50X2NsYXNzJyksXG4gICAgZGVzdHJveTogZGVzdHJveVxufSk7XG5cblxuLy8gZXhwb3J0IGZvciBub2RlL2Jyb3dzZXJpZnlcbmlmICh0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSAgICBcbiAgICBtb2R1bGUuZXhwb3J0cyA9IG1pbG87XG5cbi8vIGdsb2JhbCBtaWxvIGZvciBicm93c2VyXG5pZiAodHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0Jykge1xuICAgIHdpbmRvdy5taWxvID0gbWlsbztcbiAgICBtaWxvLm1haWwudHJpZ2dlcignbWlsb3JlYWR5Jyk7XG59XG5cblxuZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICBtaWxvQ29yZS5kZXN0cm95KCk7XG4gICAgbWlsby5tYWlsLmRlc3Ryb3koKTtcbiAgICBtaWxvLndpbmRvdy5kZXN0cm95KCk7XG4gICAgbWlsby51dGlsLmRlc3Ryb3koKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBSZWdpc3RyaWVzIG9mIGZhY2V0cyBhbmQgb2YgY29tcG9uZW50c1xuICpcbiAqIC0gW2ZhY2V0c10oLi9jb21wb25lbnRzL2NfZmFjZXRzL2NmX3JlZ2lzdHJ5LmpzLmh0bWwpXG4gKiAtIFtjb21wb25lbnRzXSguL2NvbXBvbmVudHMvY19yZWdpc3RyeS5qcy5odG1sKVxuICovXG52YXIgcmVnaXN0cnkgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBmYWNldHM6IHJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9jZl9yZWdpc3RyeScpLFxuICAgIGNvbXBvbmVudHM6IHJlcXVpcmUoJy4vY29tcG9uZW50cy9jX3JlZ2lzdHJ5JyksXG4gICAgY29tbWFuZHM6IHJlcXVpcmUoJy4vY29tbWFuZC9jbWRfcmVnaXN0cnknKVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gPGEgbmFtZT1cImNvbXBvbmVudHMtZG9tLWNvbnN0cnVjdG9yc1wiPjwvYT5cbi8vICMjI2RvbSBldmVudHMgY29uc3RydWN0b3JzXG5cblxudmFyIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9SZWZlcmVuY2UvRXZlbnRzXG5cbnZhciBldmVudFR5cGVzID0ge1xuICAgIENsaXBib2FyZEV2ZW50OiBbJ2NvcHknLCAnY3V0JywgJ3Bhc3RlJywgJ2JlZm9yZWNvcHknLCAnYmVmb3JlY3V0JywgJ2JlZm9yZXBhc3RlJ10sXG4gICAgRXZlbnQ6IFsnaW5wdXQnLCAncmVhZHlzdGF0ZWNoYW5nZSddLFxuICAgIEZvY3VzRXZlbnQ6IFsnZm9jdXMnLCAnYmx1cicsICdmb2N1c2luJywgJ2ZvY3Vzb3V0J10sXG4gICAgS2V5Ym9hcmRFdmVudDogWydrZXlkb3duJywgJ2tleXByZXNzJywgICdrZXl1cCddLFxuICAgIE1vdXNlRXZlbnQ6IFsnY2xpY2snLCAnY29udGV4dG1lbnUnLCAnZGJsY2xpY2snLCAnbW91c2Vkb3duJywgJ21vdXNldXAnLFxuICAgICAgICAgICAgICAgICAnbW91c2VlbnRlcicsICdtb3VzZWxlYXZlJywgJ21vdXNlbW92ZScsICdtb3VzZW91dCcsICdtb3VzZW92ZXInLFxuICAgICAgICAgICAgICAgICAnc2hvdycgLyogY29udGV4dCBtZW51ICovXSxcbiAgICBUb3VjaEV2ZW50OiBbJ3RvdWNoc3RhcnQnLCAndG91Y2hlbmQnLCAndG91Y2htb3ZlJywgJ3RvdWNoZW50ZXInLCAndG91Y2hsZWF2ZScsICd0b3VjaGNhbmNlbCddLFxufTtcblxuXG4vLyBtb2NrIHdpbmRvdyBhbmQgZXZlbnQgY29uc3RydWN0b3JzIGZvciB0ZXN0aW5nXG5pZiAodHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJylcbiAgICB2YXIgZ2xvYmFsID0gd2luZG93O1xuZWxzZSB7XG4gICAgZ2xvYmFsID0ge307XG4gICAgXy5lYWNoS2V5KGV2ZW50VHlwZXMsIGZ1bmN0aW9uKGVUeXBlcywgZXZlbnRDb25zdHJ1Y3Rvck5hbWUpIHtcbiAgICAgICAgdmFyIGV2ZW50Q29uc3RydWN0b3IgPSBfLm1ha2VGdW5jdGlvbihldmVudENvbnN0cnVjdG9yTmFtZSwgJ3R5cGUnLCAncHJvcGVydGllcycsXG4gICAgICAgICAgICAndGhpcy50eXBlID0gdHlwZTsgXy5leHRlbmQodGhpcywgcHJvcGVydGllcyk7Jyk7XG4gICAgICAgIGdsb2JhbFtldmVudENvbnN0cnVjdG9yTmFtZV0gPSBldmVudENvbnN0cnVjdG9yO1xuICAgIH0pO1xufVxuXG5cbnZhciBkb21FdmVudHNDb25zdHJ1Y3RvcnMgPSB7fTtcblxuXy5lYWNoS2V5KGV2ZW50VHlwZXMsIGZ1bmN0aW9uKGVUeXBlcywgZXZlbnRDb25zdHJ1Y3Rvck5hbWUpIHtcbiAgICBlVHlwZXMuZm9yRWFjaChmdW5jdGlvbih0eXBlKSB7XG4gICAgICAgIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkoZG9tRXZlbnRzQ29uc3RydWN0b3JzLCB0eXBlKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZHVwbGljYXRlIGV2ZW50IHR5cGUgJyArIHR5cGUpO1xuXG4gICAgICAgIGRvbUV2ZW50c0NvbnN0cnVjdG9yc1t0eXBlXSA9IGdsb2JhbFtldmVudENvbnN0cnVjdG9yTmFtZV07XG4gICAgfSk7XG59KTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGRvbUV2ZW50c0NvbnN0cnVjdG9ycztcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2FnZVNvdXJjZSA9IG1pbG9Db3JlLmNsYXNzZXMuTWVzc2FnZVNvdXJjZVxuICAgICwgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY29tcG9uZW50cy9jX2NsYXNzJylcbiAgICAsIGRvbUV2ZW50c0NvbnN0cnVjdG9ycyA9IHJlcXVpcmUoJy4vZGVfY29uc3RycycpIC8vIFRPRE8gbWVyZ2Ugd2l0aCBET01FdmVudFNvdXJjZSA/P1xuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBjaGVjayA9IG1pbG9Db3JlLnV0aWwuY2hlY2tcbiAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2g7XG5cbnZhciBET01FbWl0dGVyU291cmNlID0gXy5jcmVhdGVTdWJjbGFzcyhNZXNzYWdlU291cmNlLCAnRE9NRW1pdHRlclNvdXJjZScsIHRydWUpO1xuXG5cbl8uZXh0ZW5kUHJvdG8oRE9NRW1pdHRlclNvdXJjZSwge1xuICAgIC8vIGltcGxlbWVudGluZyBNZXNzYWdlU291cmNlIGludGVyZmFjZVxuICAgIGluaXQ6IGluaXQsXG4gICAgZGVzdHJveTogRE9NRW1pdHRlclNvdXJjZSRkZXN0cm95LFxuICAgIGFkZFNvdXJjZVN1YnNjcmliZXI6IF8ucGFydGlhbChzb3VyY2VTdWJzY3JpYmVyTWV0aG9kLCAnYWRkRXZlbnRMaXN0ZW5lcicpLFxuICAgIHJlbW92ZVNvdXJjZVN1YnNjcmliZXI6IF8ucGFydGlhbChzb3VyY2VTdWJzY3JpYmVyTWV0aG9kLCAncmVtb3ZlRXZlbnRMaXN0ZW5lcicpLFxuICAgIHBvc3RNZXNzYWdlOiBET01FbWl0dGVyU291cmNlJHBvc3RNZXNzYWdlLFxuICAgIHRyaWdnZXI6IHRyaWdnZXIsXG5cbiAgICAvLyBjbGFzcyBzcGVjaWZpYyBtZXRob2RzXG4gICAgZW1pdHRlcjogZW1pdHRlcixcbiAgICBoYW5kbGVFdmVudDogaGFuZGxlRXZlbnQsICAvLyBldmVudCBkaXNwYXRjaGVyIC0gYXMgZGVmaW5lZCBieSBFdmVudCBET00gQVBJXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBET01FbWl0dGVyU291cmNlO1xuXG5cbnZhciB1c2VDYXB0dXJlUGF0dGVybiA9IC9fX2NhcHR1cmUkL1xuICAgICwgdXNlQ2FwdHVyZVBvc3RmaXggPSAnX19jYXB0dXJlJztcblxuXG4vLyBpbml0IERPTSBldmVudCBzb3VyY2VcbmZ1bmN0aW9uIGluaXQoaG9zdE9iamVjdCwgcHJveHlNZXRob2RzLCBtZXNzZW5nZXJBUElPckNsYXNzLCBldmVudEVtaXR0ZXIpIHtcbiAgICB0aGlzLmV2ZW50RW1pdHRlciA9IGV2ZW50RW1pdHRlcjtcbiAgICBNZXNzYWdlU291cmNlLnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuZnVuY3Rpb24gRE9NRW1pdHRlclNvdXJjZSRkZXN0cm95KCkge1xuICAgIE1lc3NhZ2VTb3VyY2UucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBkZWxldGUgdGhpcy5ldmVudEVtaXR0ZXI7XG59XG5cblxuLy8gZ2V0IERPTSBlbGVtZW50IG9mIGNvbXBvbmVudFxuZnVuY3Rpb24gZW1pdHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5ldmVudEVtaXR0ZXI7XG59XG5cblxuZnVuY3Rpb24gc291cmNlU3Vic2NyaWJlck1ldGhvZChtZXRob2QsIGV2ZW50VHlwZSkge1xuICAgIGlmICghIChldmVudFR5cGUgJiYgdHlwZW9mIGV2ZW50VHlwZSA9PSAnc3RyaW5nJykpIHJldHVybjtcbiAgICB2YXIgY2FwdHVyZSA9IHVzZUNhcHR1cmVQYXR0ZXJuLnRlc3QoZXZlbnRUeXBlKTtcbiAgICBldmVudFR5cGUgPSBldmVudFR5cGUucmVwbGFjZSh1c2VDYXB0dXJlUGF0dGVybiwgJycpO1xuICAgIHRoaXMuZW1pdHRlcigpW21ldGhvZF0oZXZlbnRUeXBlLCB0aGlzLCBjYXB0dXJlKTtcbn1cblxuXG4vLyBldmVudCBkaXNwYXRjaGVyIC0gYXMgZGVmaW5lZCBieSBFdmVudCBET00gQVBJXG5mdW5jdGlvbiBoYW5kbGVFdmVudChldmVudCkge1xuICAgIHZhciBpc0NhcHR1cmVQaGFzZTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJylcbiAgICAgICAgaXNDYXB0dXJlUGhhc2UgPSBldmVudC5ldmVudFBoYXNlID09IHdpbmRvdy5FdmVudC5DQVBUVVJJTkdfUEhBU0U7XG5cbiAgICBpZiAoaXNDYXB0dXJlUGhhc2UpXG4gICAgICAgIGV2ZW50ICs9IHVzZUNhcHR1cmVQb3N0Zml4O1xuXG4gICAgdGhpcy5kaXNwYXRjaE1lc3NhZ2UoZXZlbnQudHlwZSwgZXZlbnQpO1xufVxuXG5cbmZ1bmN0aW9uIERPTUVtaXR0ZXJTb3VyY2UkcG9zdE1lc3NhZ2UobWVzc2FnZSwgZGF0YSkge1xuICAgIHRoaXMubWVzc2VuZ2VyLnBvc3RNZXNzYWdlU3luYyhtZXNzYWdlLCBkYXRhKTtcbn1cblxuXG5mdW5jdGlvbiB0cmlnZ2VyKGV2ZW50VHlwZSwgcHJvcGVydGllcykge1xuICAgIGNoZWNrKGV2ZW50VHlwZSwgU3RyaW5nKTtcbiAgICBjaGVjayhwcm9wZXJ0aWVzLCBNYXRjaC5PcHRpb25hbChPYmplY3QpKTtcblxuICAgIGV2ZW50VHlwZSA9IGV2ZW50VHlwZS5yZXBsYWNlKHVzZUNhcHR1cmVQYXR0ZXJuLCAnJyk7XG4gICAgdmFyIEV2ZW50Q29uc3RydWN0b3IgPSBkb21FdmVudHNDb25zdHJ1Y3RvcnNbZXZlbnRUeXBlXTtcblxuICAgIGlmICh0eXBlb2YgRXZlbnRDb25zdHJ1Y3RvciAhPSAnZnVuY3Rpb24nKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIGV2ZW50IHR5cGUnKTtcblxuICAgIC8vIGNoZWNrIGlmIGl0IGlzIGNvcnJlY3RcbiAgICBpZiAodHlwZW9mIHByb3BlcnRpZXMgIT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHByb3BlcnRpZXMudHlwZSA9IGV2ZW50VHlwZTtcblxuICAgIHZhciBkb21FdmVudCA9IG5ldyBFdmVudENvbnN0cnVjdG9yKGV2ZW50VHlwZSwgcHJvcGVydGllcyk7XG4gICAgdmFyIG5vdENhbmNlbGxlZCA9IHRoaXMuZW1pdHRlcigpLmRpc3BhdGNoRXZlbnQoZG9tRXZlbnQpO1xuICAgIHJldHVybiBub3RDYW5jZWxsZWQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogYG1pbG8ubWFpbGBcbiAqIEl0IGlzIGFuIGFwcGxpY2F0aW9uIGxldmVsIG1lc3NlbmdlciB0aGF0IGlzIGFuIGluc3RhbmNlIG9mIE1lc3NlbmdlciBjbGFzcy5cbiAqXG4gKiBBdCB0aGUgbW9tZW50LCBpbiBhZGRpdGlvbiB0byBhcHBsaWNhdGlvbiBtZXNzYWdlcyB0aGF0IHlvdSBkZWZpbmUsIHlvdSBjYW4gc3Vic2NyaWJlIHRvIF9fZG9tcmVhZHlfXyBtZXNzYWdlIHRoYXQgaXMgZ3VhcmFudGVlZCB0byBmaXJlIG9uY2UsXG4gKiBldmVuIGlmIERPTSB3YXMgcmVhZHkgYXQgdGhlIHRpbWUgb2YgdGhlIHN1YnNjcmlwdGlvbi5cbiAqXG4gKiBNZXNzYWdpbmcgYmV0d2VlbiBmcmFtZXMgaXMgYXZhaWxhYmxlIHZpYSBtaWxvLm1haWwuIFNlZSBbRnJhbWUgZmFjZXRdKC4uL2NvbXBvbmVudHMvY19mYWNldHMvRnJhbWUuanMuaHRtbCkuXG4gKlxuICogU2VlIFtNZXNzZW5nZXJdKC4uL21lc3Nlbmdlci9pbmRleC5qcy5odG1sKS5cbiAqIFxuKiovXG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlciA9IG1pbG9Db3JlLk1lc3NlbmdlclxuICAgICwgTWFpbE1zZ0FQSSA9IHJlcXVpcmUoJy4vbWFpbF9hcGknKVxuICAgICwgTWFpbE1lc3NhZ2VTb3VyY2UgPSByZXF1aXJlKCcuL21haWxfc291cmNlJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxuXG52YXIgbWlsb01haWwgPSBuZXcgTWVzc2VuZ2VyO1xuXG52YXIgbWFpbE1zZ1NvdXJjZSA9IG5ldyBNYWlsTWVzc2FnZVNvdXJjZShtaWxvTWFpbCwgeyB0cmlnZ2VyOiAndHJpZ2dlcicgfSwgbmV3IE1haWxNc2dBUEkpO1xuXG5taWxvTWFpbC5fc2V0TWVzc2FnZVNvdXJjZShtYWlsTXNnU291cmNlKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG1pbG9NYWlsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2VuZ2VyQVBJID0gbWlsb0NvcmUuY2xhc3Nlcy5NZXNzZW5nZXJBUElcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5cbnZhciBNYWlsTXNnQVBJID0gXy5jcmVhdGVTdWJjbGFzcyhNZXNzZW5nZXJBUEksICdNYWlsTXNnQVBJJywgdHJ1ZSk7XG5cblxuXy5leHRlbmRQcm90byhNYWlsTXNnQVBJLCB7XG4gICAgdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlOiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UsXG4gICAgZmlsdGVyU291cmNlTWVzc2FnZTogZmlsdGVyU291cmNlTWVzc2FnZVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTWFpbE1zZ0FQSTtcblxuXG4vLyBUT0RPOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gcmVsZXZhbnQgRE9NIGV2ZW50IGRlcGVuZGVudCBvbiBlbGVtZW50IHRhZ1xuLy8gQ2FuIGFsc28gaW1wbGVtZW50IGJlZm9yZWRhdGFjaGFuZ2VkIGV2ZW50IHRvIGFsbG93IHByZXZlbnRpbmcgdGhlIGNoYW5nZVxuLy8gdHJhbnNsYXRlVG9Eb21FdmVudFxudmFyIHdpbmRvd01lc3NhZ2VSZWdFeHAgPSAvXm1lc3NhZ2VcXDovXG4gICAgLCB3aW5kb3dNZXNzYWdlUHJlZml4ID0gJ21lc3NhZ2U6JztcblxuZnVuY3Rpb24gdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICBpZiAobWVzc2FnZSA9PSAnZG9tcmVhZHknKVxuICAgICAgICByZXR1cm4gJ3JlYWR5c3RhdGVjaGFuZ2UnO1xuICAgIGVsc2UgaWYgKHdpbmRvd01lc3NhZ2VSZWdFeHAudGVzdChtZXNzYWdlKSlcbiAgICAgICAgcmV0dXJuICdtZXNzYWdlJztcbn1cblxuXG4vLyBmaWx0ZXJEYXRhTWVzc2FnZVxuZnVuY3Rpb24gZmlsdGVyU291cmNlTWVzc2FnZShzb3VyY2VNZXNzYWdlLCBtc2dUeXBlLCBtc2dEYXRhKSB7XG4gICAgaWYgKHNvdXJjZU1lc3NhZ2UgPT0gJ3JlYWR5c3RhdGVjaGFuZ2UnKSB7XG4gICAgICAgIC8vcmV0dXJuIGRvY3VtZW50LnJlYWR5U3RhdGUgPT0gJ2ludGVyYWN0aXZlJztcbiAgICAgICAgLy8gIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX2RvbVJlYWR5RmlyZWQnLCB0cnVlLCBfLldSSVQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHNvdXJjZU1lc3NhZ2UgPT0gJ21lc3NhZ2UnKVxuICAgICAgICByZXR1cm4gd2luZG93TWVzc2FnZVByZWZpeCArIG1zZ0RhdGEuZGF0YS50eXBlID09IG1zZ1R5cGU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2FnZVNvdXJjZSA9IG1pbG9Db3JlLmNsYXNzZXMuTWVzc2FnZVNvdXJjZVxuICAgICwgZG9tRXZlbnRzQ29uc3RydWN0b3JzID0gcmVxdWlyZSgnLi4vZGVfY29uc3RycycpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxuXG52YXIgTWFpbE1lc3NhZ2VTb3VyY2UgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NhZ2VTb3VyY2UsICdNYWlsTWVzc2FnZVNvdXJjZScsIHRydWUpO1xuXG5cbl8uZXh0ZW5kUHJvdG8oTWFpbE1lc3NhZ2VTb3VyY2UsIHtcbiAgICAvLyBpbXBsZW1lbnRpbmcgTWVzc2FnZVNvdXJjZSBpbnRlcmZhY2VcbiAgICBhZGRTb3VyY2VTdWJzY3JpYmVyOiBhZGRTb3VyY2VTdWJzY3JpYmVyLFxuICAgIHJlbW92ZVNvdXJjZVN1YnNjcmliZXI6IHJlbW92ZVNvdXJjZVN1YnNjcmliZXIsXG4gICAgdHJpZ2dlcjogdHJpZ2dlcixcblxuICAgIC8vIGNsYXNzIHNwZWNpZmljIG1ldGhvZHNcbiAgICBfd2luZG93U3Vic2NyaWJlck1ldGhvZDogX3dpbmRvd1N1YnNjcmliZXJNZXRob2QsXG4gICAgaGFuZGxlRXZlbnQ6IGhhbmRsZUV2ZW50LCAgLy8gZXZlbnQgZGlzcGF0Y2hlciAtIGFzIGRlZmluZWQgYnkgRXZlbnQgRE9NIEFQSVxufSk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBNYWlsTWVzc2FnZVNvdXJjZTtcblxuXG5mdW5jdGlvbiBhZGRTb3VyY2VTdWJzY3JpYmVyKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICBpZiAoaXNSZWFkeVN0YXRlQ2hhbmdlKHNvdXJjZU1lc3NhZ2UpKSB7XG4gICAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09ICdsb2FkaW5nJylcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3JlYWR5c3RhdGVjaGFuZ2UnLCB0aGlzLCBmYWxzZSk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIEV2ZW50Q29uc3RydWN0b3IgPSBkb21FdmVudHNDb25zdHJ1Y3RvcnMucmVhZHlzdGF0ZWNoYW5nZTtcbiAgICAgICAgICAgIHZhciBkb21FdmVudCA9IG5ldyBFdmVudENvbnN0cnVjdG9yKCdyZWFkeXN0YXRlY2hhbmdlJywgeyB0YXJnZXQ6IGRvY3VtZW50IH0pO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaE1lc3NhZ2UoJ3JlYWR5c3RhdGVjaGFuZ2UnLCBkb21FdmVudCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2VcbiAgICAgICAgdGhpcy5fd2luZG93U3Vic2NyaWJlck1ldGhvZCgnYWRkRXZlbnRMaXN0ZW5lcicsIHNvdXJjZU1lc3NhZ2UpO1xufVxuXG5cbmZ1bmN0aW9uIHJlbW92ZVNvdXJjZVN1YnNjcmliZXIoc291cmNlTWVzc2FnZSkge1xuICAgIGlmIChpc1JlYWR5U3RhdGVDaGFuZ2Uoc291cmNlTWVzc2FnZSkpXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3JlYWR5c3RhdGVjaGFuZ2UnLCB0aGlzLCBmYWxzZSk7XG4gICAgZWxzZSBcbiAgICAgICAgdGhpcy5fd2luZG93U3Vic2NyaWJlck1ldGhvZCgncmVtb3ZlRXZlbnRMaXN0ZW5lcicsIHNvdXJjZU1lc3NhZ2UpO1xufVxuXG5cbmZ1bmN0aW9uIGlzUmVhZHlTdGF0ZUNoYW5nZShzb3VyY2VNZXNzYWdlKSB7XG4gICAgcmV0dXJuIHNvdXJjZU1lc3NhZ2UgPT0gJ3JlYWR5c3RhdGVjaGFuZ2UnICYmIHR5cGVvZiBkb2N1bWVudCA9PSAnb2JqZWN0Jztcbn1cblxuZnVuY3Rpb24gaXNXaW5kb3dNZXNzYWdlKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICByZXR1cm4gc291cmNlTWVzc2FnZSA9PSAnbWVzc2FnZScgJiYgdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0Jztcbn1cblxuZnVuY3Rpb24gX3dpbmRvd1N1YnNjcmliZXJNZXRob2QobWV0aG9kLCBzb3VyY2VNZXNzYWdlKSB7XG4gICAgaWYgKGlzV2luZG93TWVzc2FnZShzb3VyY2VNZXNzYWdlKSlcbiAgICAgICAgd2luZG93W21ldGhvZF0oJ21lc3NhZ2UnLCB0aGlzLCBmYWxzZSk7XG59XG5cblxuLy8gZXZlbnQgZGlzcGF0Y2hlciAtIGFzIGRlZmluZWQgYnkgRXZlbnQgRE9NIEFQSVxuZnVuY3Rpb24gaGFuZGxlRXZlbnQoZXZlbnQpIHtcbiAgICB0aGlzLmRpc3BhdGNoTWVzc2FnZShldmVudC50eXBlLCBldmVudCk7XG59XG5cblxuZnVuY3Rpb24gdHJpZ2dlcihtc2dUeXBlLCBkYXRhKSB7XG4gICAgZGF0YSA9IGRhdGEgfHwge307XG4gICAgZGF0YS50eXBlID0gJ21lc3NhZ2U6JyArIG1zZ1R5cGU7XG4gICAgXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcpXG4gICAgICAgIHdpbmRvdy5wb3N0TWVzc2FnZShkYXRhLCAnKicpXG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlciA9IG1pbG9Db3JlLk1lc3NlbmdlclxuICAgICwgRE9NRW1pdHRlclNvdXJjZSA9IHJlcXVpcmUoJy4vZG9tX3NvdXJjZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cblxudmFyIHdpbmRvd1NlcnZpY2UgPSBuZXcgTWVzc2VuZ2VyO1xudmFyIGRvbUVtaXR0ZXJTb3VyY2UgPSBuZXcgRE9NRW1pdHRlclNvdXJjZSh3aW5kb3dTZXJ2aWNlLCB7IHRyaWdnZXI6ICd0cmlnZ2VyJyB9LCB1bmRlZmluZWQsIHdpbmRvdyk7XG53aW5kb3dTZXJ2aWNlLl9zZXRNZXNzYWdlU291cmNlKGRvbUVtaXR0ZXJTb3VyY2UpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gd2luZG93U2VydmljZTtcblxuXG5fLmV4dGVuZCh3aW5kb3dTZXJ2aWNlLCB7XG4gICAgaXNUb3A6IHdpbmRvd1NlcnZpY2VfaXNUb3Bcbn0pO1xuXG5cbmZ1bmN0aW9uIHdpbmRvd1NlcnZpY2VfaXNUb3AoKSB7XG4gICAgcmV0dXJuIHdpbmRvdy50b3AgPT0gd2luZG93LnNlbGYgfHwgd2luZG93Ll9fa2FybWFfXztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxucmVxdWlyZSgnLi9jb21wb25lbnRzL2NsYXNzZXMvVmlldycpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0dyb3VwJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvV3JhcHBlcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL1RleHQnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9TZWxlY3QnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9JbnB1dCcpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0lucHV0TGlzdCcpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL1RleHRhcmVhJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvUmFkaW9Hcm91cCcpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0J1dHRvbicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0h5cGVybGluaycpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL0xpc3QnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9MaXN0SXRlbScpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL1RpbWUnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9EYXRlJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvQ29tYm8nKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9TdXBlckNvbWJvJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvQ29tYm9MaXN0Jyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvSW1hZ2UnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy91aS9Ecm9wVGFyZ2V0Jyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvdWkvRm9sZFRyZWUnKTtcblxucmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL2Jvb3RzdHJhcC9Ecm9wZG93bicpO1xuLy8gcmVxdWlyZSgnLi9jb21wb25lbnRzL3VpL2Jvb3RzdHJhcC9EaWFsb2cnKTtcbiIsIid1c2Ugc3RyaWN0JztcblxucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL0RvbScpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL0RhdGEnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9GcmFtZScpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL0V2ZW50cycpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL09wdGlvbnMnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9UZW1wbGF0ZScpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL0NvbnRhaW5lcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL01vZGVsRmFjZXQnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9EcmFnJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY19mYWNldHMvRHJvcCcpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NfZmFjZXRzL0xpc3QnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jX2ZhY2V0cy9JdGVtJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY19mYWNldHMvVHJhbnNmZXInKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHVuaXF1ZUlkID0gcmVxdWlyZSgnLi91bmlxdWVfaWQnKVxuICAgICwgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJylcbiAgICAsIHByZWZpeCA9IGNvbmZpZy5jb21wb25lbnRQcmVmaXg7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBjb21wb25lbnROYW1lO1xuXG5cbmZ1bmN0aW9uIGNvbXBvbmVudE5hbWUoKSB7XG4gICAgcmV0dXJuIHByZWZpeCArIHVuaXF1ZUlkKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaFxuICAgICwgY29tcG9uZW50UmVnaXN0cnkgPSByZXF1aXJlKCcuLi9jb21wb25lbnRzL2NfcmVnaXN0cnknKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUNvbXBvbmVudENsYXNzO1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gd2hpY2ggY3JlYXRlcyBhbmQgcmVnaXN0ZXJzIG5ldyBtaWxvIGNvbXBvbmVudC4gIFRoZSBjb21wb25lbnQgY3JlYXRlZCB3aWxsIGhhdmVcbiAqIGEgcmVmZXJlbmNlIHRvIHRoZSBzdXBlciBjbGFzcyB1c2VkIGluIGl0cyBjcmVhdGlvbiAoQWNjZXNzYWJsZSB1c2luZyA8Q29tcG9uZW50Q2xhc3M+LnN1cGVyKS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnLmNsYXNzTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBuZXcgY29tcG9uZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gWydDb21wb25lbnQnXSBjb25maWcuc3VwZXJDbGFzc05hbWUgLSBUaGUgbmFtZSBvZiBhbiBleGlzdGluZyBjb21wb25lbnQgdG8gYmUgdXNlZCBhcyB0aGUgbmV3IGNvbXBvbmVudCdzIHN1cGVyIGNsYXNzXG4gKiBAcGFyYW0ge29iamVjdD19IGNvbmZpZy5mYWNldHMgLSBGYWNldCBjb25maWd1cmF0aW9uIChIYXNoIG9mIGZhY2V0IG5hbWUge3N0cmluZ30gdG8gY29uZmlnIHtvYmplY3R9KVxuICogQHBhcmFtIHtvYmplY3Q9fSBjb25maWcubWV0aG9kcyAtIE1ldGhvZHMgb2YgdGhlIG5ldyBjb21wb25lbnQgKEhhc2ggb2YgZnVuY3Rpb24gbmFtZSB7c3RyaW5nfSB0byBmdW5jdGlvbiB7ZnVuY3Rpb259KVxuICogQHBhcmFtIHtvYmplY3Q9fSBjb25maWcuc3RhdGljTWV0aG9kcyAtIFN0YXRpYyBtZXRob2RzIG9mIHRoZSBuZXcgY29tcG9uZW50IChIYXNoIG9mIGZ1bmN0aW9uIG5hbWUge3N0cmluZ30gdG8gZnVuY3Rpb24ge2Z1bmN0aW9ufSlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50Q2xhc3MoY29uZmlnKSB7XG4gICAgY2hlY2soY29uZmlnLCB7XG4gICAgICAgIHN1cGVyQ2xhc3NOYW1lOiBNYXRjaC5PcHRpb25hbChTdHJpbmcpLFxuICAgICAgICBjbGFzc05hbWU6IFN0cmluZyxcbiAgICAgICAgZmFjZXRzOiBNYXRjaC5PcHRpb25hbChPYmplY3QpLFxuICAgICAgICBtZXRob2RzOiBNYXRjaC5PcHRpb25hbChNYXRjaC5PYmplY3RIYXNoKEZ1bmN0aW9uKSksXG4gICAgICAgIHN0YXRpY01ldGhvZHM6IE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9iamVjdEhhc2goRnVuY3Rpb24pKSxcbiAgICB9KTtcbiAgICB2YXIgU3VwZXJDbGFzcyA9IGNvbXBvbmVudFJlZ2lzdHJ5LmdldChjb25maWcuc3VwZXJDbGFzc05hbWUgfHwgJ0NvbXBvbmVudCcpO1xuICAgIHZhciBDb21wb25lbnRDbGFzcyA9IFN1cGVyQ2xhc3MuY3JlYXRlQ29tcG9uZW50Q2xhc3MoY29uZmlnLmNsYXNzTmFtZSwgY29uZmlnLmZhY2V0cyk7XG5cbiAgICBpZiAoY29uZmlnLm1ldGhvZHMpIF8uZXh0ZW5kUHJvdG8oQ29tcG9uZW50Q2xhc3MsIGNvbmZpZy5tZXRob2RzKTtcblxuICAgIGlmIChjb25maWcuc3RhdGljTWV0aG9kcykge1xuICAgICAgICBpZiAoY29uZmlnLnN0YXRpY01ldGhvZHMuc3VwZXIgIT09IHVuZGVmaW5lZCkgdGhyb3cgJ1xcJ3N1cGVyXFwnIGlzIGEgcmVzZXJ2ZWQga2V5d29yZCc7XG4gICAgICAgIF8uZXh0ZW5kKENvbXBvbmVudENsYXNzLCBjb25maWcuc3RhdGljTWV0aG9kcyk7XG4gICAgfVxuXG4gICAgQ29tcG9uZW50Q2xhc3Muc3VwZXIgPSBTdXBlckNsYXNzLnByb3RvdHlwZTtcbiAgICBjb21wb25lbnRSZWdpc3RyeS5hZGQoQ29tcG9uZW50Q2xhc3MpO1xuICAgIHJldHVybiBDb21wb25lbnRDbGFzcztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkZXByZWNhdGUoZm4sIG1lc3NhZ2UpIHtcbiAgICB2YXIgd2FybmVkO1xuICAgIHN3aXRjaCAodHlwZW9mIGZuKSB7XG4gICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgICByZXR1cm4gXy5tYXBLZXlzKGZuLCBmdW5jdGlvbihmKSB7IHJldHVybiBkZXByZWNhdGUoZiwgbWVzc2FnZSk7IH0pO1xuICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wIGluIGZuKVxuICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWRbcHJvcF0gPSBkZXByZWNhdGUoZm5bcHJvcF0sIG1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZm47XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgICAgICBpZiAoY29uZmlnLmRlcHJlY2F0aW9uV2FybmluZ1xuICAgICAgICAgICAgJiYgKCF3YXJuZWQgfHwgY29uZmlnLmRlcHJlY2F0aW9uV2FybmluZyA9PSAnYWx3YXlzJykpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihtZXNzYWdlIHx8ICdGdW5jdGlvbiAnICsgZm4ubmFtZSArICcgaXMgREVQUkVDQVRFRCcpO1xuICAgICAgICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlcjtcblxudmFyIGRvbVV0aWxzID0ge1xuICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICBmaWx0ZXJOb2RlTGlzdEJ5VHlwZTogZmlsdGVyTm9kZUxpc3RCeVR5cGUsXG4gICAgY29udGFpbmluZ0VsZW1lbnQ6IGNvbnRhaW5pbmdFbGVtZW50LFxuICAgIHNlbGVjdEVsZW1lbnRDb250ZW50czogc2VsZWN0RWxlbWVudENvbnRlbnRzLFxuICAgIHNlbGVjdEVsZW1lbnRUZXh0OiBzZWxlY3RFbGVtZW50VGV4dCxcbiAgICBnZXRFbGVtZW50T2Zmc2V0OiBnZXRFbGVtZW50T2Zmc2V0LFxuICAgIHNldENhcmV0UG9zaXRpb246IHNldENhcmV0UG9zaXRpb24sXG4gICAgZ2V0U2VsZWN0aW9uRGlyZWN0aW9uOiBnZXRTZWxlY3Rpb25EaXJlY3Rpb24sXG4gICAgc2V0U2VsZWN0aW9uOiBzZXRTZWxlY3Rpb24sXG4gICAgY2xlYXJTZWxlY3Rpb246IGNsZWFyU2VsZWN0aW9uLFxuICAgIHJlbW92ZUVsZW1lbnQ6IHJlbW92ZUVsZW1lbnQsXG4gICAgdW53cmFwRWxlbWVudDogdW53cmFwRWxlbWVudCxcbiAgICB3cmFwSW5FbGVtZW50OiB3cmFwSW5FbGVtZW50LFxuICAgIGRldGFjaENvbXBvbmVudDogZGV0YWNoQ29tcG9uZW50LFxuICAgIGZpcnN0VGV4dE5vZGU6IGZpcnN0VGV4dE5vZGUsXG4gICAgbGFzdFRleHROb2RlOiBsYXN0VGV4dE5vZGUsXG4gICAgdHJpbU5vZGVSaWdodDogdHJpbU5vZGVSaWdodCxcbiAgICB0cmltTm9kZUxlZnQ6IHRyaW1Ob2RlTGVmdCxcbiAgICBzdHJpcEh0bWw6IHN0cmlwSHRtbCxcbiAgICBodG1sRW50aXRpZXM6IGh0bWxFbnRpdGllcyxcbiAgICB3YWxrVHJlZTogd2Fsa1RyZWUsXG4gICAgY3JlYXRlVHJlZVdhbGtlcjogY3JlYXRlVHJlZVdhbGtlcixcblxuICAgIHRyZWVQYXRoT2Y6IHRyZWVQYXRoT2YsXG4gICAgZ2V0Tm9kZUF0VHJlZVBhdGg6IGdldE5vZGVBdFRyZWVQYXRoLFxuICAgIGluc2VydEF0VHJlZVBhdGg6IGluc2VydEF0VHJlZVBhdGgsXG4gICAgaXNUcmVlUGF0aEJlZm9yZTogaXNUcmVlUGF0aEJlZm9yZSxcblxuICAgIGdldE5vZGVXaW5kb3c6IGdldE5vZGVXaW5kb3csXG5cbiAgICBnZXRDb21wb25lbnRzRnJvbVJhbmdlOiBnZXRDb21wb25lbnRzRnJvbVJhbmdlLFxuICAgIGRlbGV0ZVJhbmdlV2l0aENvbXBvbmVudHM6IGRlbGV0ZVJhbmdlV2l0aENvbXBvbmVudHMsXG4gICAgZm9yRWFjaE5vZGVzSW5SYW5nZTogZm9yRWFjaE5vZGVzSW5SYW5nZSxcbiAgICBhcmVSYW5nZXNFcXVhbDogYXJlUmFuZ2VzRXF1YWwsXG5cbiAgICBhZGREZWJ1Z1BvaW50OiBhZGREZWJ1Z1BvaW50XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRvbVV0aWxzO1xuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGlzdCBvZiBlbGVtZW50IGNoaWxkcmVuIG9mIERPTSBlbGVtZW50XG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbCBlbGVtZW50IHRvIHJldHVybiB0aGUgY2hpbGRyZW4gb2YgKG9ubHkgRE9NIGVsZW1lbnRzKVxuICogQHJldHVybiB7QXJyYXlbRWxlbWVudF19XG4gKi9cbiBmdW5jdGlvbiBjaGlsZHJlbihlbCkge1xuICAgIHJldHVybiBmaWx0ZXJOb2RlTGlzdEJ5VHlwZShlbC5jaGlsZE5vZGVzLCBOb2RlLkVMRU1FTlRfTk9ERSk7XG4gfVxuXG5cbi8qKlxuICogRmlsdGVycyB0aGUgbGlzdCBvZiBub2RlcyBieSB0eXBlXG4gKlxuICogQHBhcmFtIHtOb2RlTGlzdH0gbm9kZUxpc3QgdGhlIGxpc3Qgb2Ygbm9kZXMsIGZvciBleGFtcGxlIGNoaWxkTm9kZXMgcHJvcGVydHkgb2YgRE9NIGVsZW1lbnRcbiAqIEBwYXJhbSB7SW50ZWdlcn0gbm9kZVR5cGUgYW4gaW50ZWdlciBjb25zdGFudCBbZGVmaW5lZCBieSBET00gQVBJXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTm9kZS5ub2RlVHlwZSksIGUuZy4gYE5vZGUuRUxFTUVOVF9OT0RFYCBvciBgTm9kZS5URVhUX05PREVgXG4gKiBAcmV0dXJuIHtBcnJheVtOb2RlXX1cbiAqL1xuZnVuY3Rpb24gZmlsdGVyTm9kZUxpc3RCeVR5cGUobm9kZUxpc3QsIG5vZGVUeXBlKSB7XG4gICAgcmV0dXJuIF8uZmlsdGVyKG5vZGVMaXN0LCBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PSBub2RlVHlwZTtcbiAgICB9KTtcbn1cblxuXG4vKipcbiAqIEZpbmQgbmVhcmVzdCBwYXJlbnQgZWxlbWVudCBmb3Igbm9kZS5cbiAqIElmIG5vZGUgaXMgYW4gZWxlbWVudCwgaXQgd2lsbCBiZSByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAqL1xuZnVuY3Rpb24gY29udGFpbmluZ0VsZW1lbnQobm9kZSkge1xuICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5cbi8qKlxuICogU2VsZWN0cyBpbm5lciBjb250ZW50cyBvZiBET00gZWxlbWVudFxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWwgRE9NIGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gc2VsZWN0RWxlbWVudENvbnRlbnRzKGVsKSB7XG4gICAgdmFyIGRvYyA9IGVsLm93bmVyRG9jdW1lbnQ7XG4gICAgaWYgKCEgZG9jKSByZXR1cm4gbG9nZ2VyLmVycm9yKCdzZWxlY3RFbGVtZW50Q29udGVudHM6IGVsZW1lbnQgaGFzIG5vIGRvY3VtZW50Jyk7XG4gICAgdmFyIHJhbmdlID0gZG9jLmNyZWF0ZVJhbmdlKCk7XG4gICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVsKTtcbiAgICB2YXIgd2luID0gZ2V0Tm9kZVdpbmRvdyhlbClcbiAgICAgICAgLCBzZWwgPSB3aW4uZ2V0U2VsZWN0aW9uKCk7XG4gICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG59XG5cblxuLyoqXG4gKiBTZWxlY3RzIHRleHQgaW5zaWRlIGVsZW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqL1xuZnVuY3Rpb24gc2VsZWN0RWxlbWVudFRleHQoZWwpIHtcbiAgICB2YXIgZnJvbU5vZGUgPSBmaXJzdFRleHROb2RlKGVsKVxuICAgICAgICAsIHRvTm9kZSA9IGxhc3RUZXh0Tm9kZShlbCk7XG5cbiAgICBpZiAoZnJvbU5vZGUgJiYgdG9Ob2RlKVxuICAgICAgICBzZXRTZWxlY3Rpb24oZnJvbU5vZGUsIDAsIHRvTm9kZSwgdG9Ob2RlLnRleHRDb250ZW50Lmxlbmd0aCk7XG59XG5cblxuLyoqXG4gKiBTZXRzIHRoZSBjYXJldCBwb3NpdGlvbiB0byB0aGUgcG9zaXRpb24gaW4gdGhlIG5vZGVcbiAqXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgRE9NIG5vZGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBwb3MgY2FyZXQgcG9zaXRpb25cbiAqL1xuZnVuY3Rpb24gc2V0Q2FyZXRQb3NpdGlvbihub2RlLCBwb3MpIHtcbiAgICB2YXIgZG9jID0gbm9kZS5vd25lckRvY3VtZW50O1xuICAgIGlmICghIGRvYykgcmV0dXJuIGxvZ2dlci5lcnJvcignc2V0Q2FyZXRQb3NpdGlvbjogZWxlbWVudCBoYXMgbm8gZG9jdW1lbnQnKTtcbiAgICB2YXIgcmFuZ2UgPSBkb2MuY3JlYXRlUmFuZ2UoKTtcbiAgICByYW5nZS5zZXRTdGFydChub2RlLCBwb3MpO1xuICAgIHZhciB3aW4gPSBnZXROb2RlV2luZG93KG5vZGUpXG4gICAgICAgICwgc2VsID0gd2luLmdldFNlbGVjdGlvbigpO1xuICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xufVxuXG4vKipcbiAqIGdldCB0aGUgZGlyZWN0aW9uIG9mIGEgc2VsZWN0aW9uXG4gKlxuICogMSBmb3J3YXJkLCAtMSBiYWNrd2FyZCwgMCBubyBkaXJlY3Rpb24sIHVuZGVmaW5lZCBvbmUgb2YgdGhlIG5vZGUgaXMgZGV0YWNoZWQgb3IgaW4gYSBkaWZmZXJlbnQgZnJhbWVcbiAqXG4gKiBAcGFyYW0ge3NlbH0gYSBzZWxlY3Rpb24gb2JqZWN0XG4gKiBAcmV0dXJuIHstMXwwfDF8dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb25EaXJlY3Rpb24oc2VsKXtcbiAgICByZXR1cm4gX2dldERpcmVjdGlvbihzZWwuYW5jaG9yTm9kZSwgc2VsLmFuY2hvck9mZnNldCwgc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gX2dldERpcmVjdGlvbihmcm9tTm9kZSwgc3RhcnRPZmZzZXQsIHRvTm9kZSwgZW5kT2Zmc2V0KXtcbiAgICB2YXIgZG9jUG9zaXRpb24gPSBmcm9tTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0b05vZGUpO1xuICAgIGlmIChkb2NQb3NpdGlvbiAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKXtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGVsc2UgaWYgKGRvY1Bvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpe1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGVsc2UgaWYgKGZyb21Ob2RlID09IHRvTm9kZSl7XG4gICAgICAgIGlmIChzdGFydE9mZnNldCA8IGVuZE9mZnNldCl7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGFydE9mZnNldCA+IGVuZE9mZnNldCl7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBTZWxlY3RzIGEgcmFuZ2UgaW4gYSBkb2N1bWVudFxuICpcbiAqIEBwYXJhbSB7Tm9kZX0gZnJvbU5vZGUgRE9NIG5vZGUgdG8gc3RhcnQgc2VsZWN0aW9uIGluXG4gKiBAcGFyYW0ge051bWJlcn0gc3RhcnRPZmZzZXRcbiAqIEBwYXJhbSB7Tm9kZX0gdG9Ob2RlIERPTSBub2RlIHRvIGVuZCBzZWxlY3Rpb24gaW5cbiAqIEBwYXJhbSB7TnVtYmVyfSBlbmRPZmZzZXRcbiAqL1xuZnVuY3Rpb24gc2V0U2VsZWN0aW9uKGZyb21Ob2RlLCBzdGFydE9mZnNldCwgdG9Ob2RlLCBlbmRPZmZzZXQpIHtcbiAgICB2YXIgZG9jID0gZnJvbU5vZGUub3duZXJEb2N1bWVudDtcbiAgICBpZiAoISBkb2MpIHJldHVybiBsb2dnZXIoJ3NldENhcmV0UG9zaXRpb246IGVsZW1lbnQgaGFzIG5vIGRvY3VtZW50Jyk7XG4gICAgdmFyIGJhY2t3YXJkID0gX2dldERpcmVjdGlvbihmcm9tTm9kZSwgc3RhcnRPZmZzZXQsIHRvTm9kZSwgZW5kT2Zmc2V0KSA9PSAtMTtcbiAgICB2YXIgcmFuZ2UgPSBkb2MuY3JlYXRlUmFuZ2UoKTtcbiAgICB2YXIgY29udGFpbmVyLCBvcmlnaW5hbENvbnRlbnRFZGl0YWJsZTtcbiAgICAvLyBkb2VzIG5vdCB3b3JrIGluIG5vbiBjb250ZW50RWRpdGFibGUgaXRlbXNcblxuICAgIHZhciB3aW4gPSBnZXROb2RlV2luZG93KGZyb21Ob2RlKVxuICAgICAgICAsIHNlbCA9IHdpbi5nZXRTZWxlY3Rpb24oKTtcblxuXG4gICAgaWYgKGJhY2t3YXJkKXtcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQodG9Ob2RlLCBlbmRPZmZzZXQpO1xuICAgICAgICByYW5nZS5zZXRFbmQoZnJvbU5vZGUsIHN0YXJ0T2Zmc2V0KTtcbiAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoZnJvbU5vZGUsIHN0YXJ0T2Zmc2V0KTtcbiAgICAgICAgcmFuZ2Uuc2V0RW5kKHRvTm9kZSwgZW5kT2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjb250YWluZXIgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lciA9PSBOb2RlLkVMRU1FTlRfTk9ERSA/XG4gICAgICAgIHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyIDpcbiAgICAgICAgcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIucGFyZW50RWxlbWVudDtcblxuICAgIGlmICghY29udGFpbmVyLmlzQ29udGVudEVkaXRhYmxlKXtcbiAgICAgICAgb3JpZ2luYWxDb250ZW50RWRpdGFibGUgPSBjb250YWluZXIuY29udGVudEVkaXRhYmxlOyAvLyBmYWxzZSBvciBpbmhlcml0XG4gICAgICAgIGNvbnRhaW5lci5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICB9XG5cbiAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgIGlmIChiYWNrd2FyZCl7XG4gICAgICAgIHNlbC5leHRlbmQodG9Ob2RlLCBlbmRPZmZzZXQpO1xuICAgIH1cblxuICAgIGlmIChvcmlnaW5hbENvbnRlbnRFZGl0YWJsZSl7XG4gICAgICAgIC8vIHJlc3RvcmluZyBjb250ZW50RWRpdGFibGVcbiAgICAgICAgY29udGFpbmVyLmNvbnRlbnRFZGl0YWJsZSA9IG9yaWdpbmFsQ29udGVudEVkaXRhYmxlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDbGVhcnMgc2VsZWN0aW9uIGluIGEgZ2l2ZW4gd2luZG93XG4gKiBAcGFyYW0ge1dpbmRvd30gd2luXG4gKi9cbmZ1bmN0aW9uIGNsZWFyU2VsZWN0aW9uKHdpbikge1xuICAgIHdpbiA9IHdpbiB8fCB3aW5kb3c7XG4gICAgdmFyIHNlbCA9IHdpbi5nZXRTZWxlY3Rpb24oKTtcbiAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG59XG5cblxuLyoqXG4gKiBDYWxjdWxhdGVzIGFuIGVsZW1lbnQncyB0b3RhbCB0b3AgYW5kIGxlZnQgb2Zmc2V0IGZyb20gdGhlIGRvY3VtZW50IGVkZ2UuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbCB0aGUgZWxlbWVudCBmb3Igd2hpY2ggcG9zaXRpb24gbmVlZHMgdG8gYmUgcmV0dXJuZWRcbiAqIEBwYXJhbSB7aW5jbHVkZUJvcmRlcn0gaWYgaXMgdG8gaW5jbHVkZSB0aGUgYm9yZGVyIHdpZHRoXG4gKiBAcmV0dXJuIHtPYmplY3R9IHZlY3RvciBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHRvcE9mZnNldCBhbmQgbGVmdE9mZnNldFxuICovXG5mdW5jdGlvbiBnZXRFbGVtZW50T2Zmc2V0KGVsLCBpbmNsdWRlQm9yZGVyKSB7XG4gICAgdmFyIHlQb3MsIHhQb3M7XG5cbiAgICB5UG9zID0gZWwub2Zmc2V0VG9wO1xuICAgIHhQb3MgPSBlbC5vZmZzZXRMZWZ0O1xuICAgIGVsID0gZWwub2Zmc2V0UGFyZW50O1xuXG4gICAgd2hpbGUgKGVsKSB7XG4gICAgICAgIHlQb3MgKz0gZWwub2Zmc2V0VG9wICsgZ2V0Qm9yZGVyKGVsLCAnSGVpZ2h0JywgaW5jbHVkZUJvcmRlcik7XG4gICAgICAgIHhQb3MgKz0gZWwub2Zmc2V0TGVmdCArIGdldEJvcmRlcihlbCwgJ1dpZHRoJywgaW5jbHVkZUJvcmRlcik7XG4gICAgICAgIGVsID0gZWwub2Zmc2V0UGFyZW50O1xuICAgIH1cblxuICAgIHJldHVybiB7IHRvcE9mZnNldDogeVBvcywgbGVmdE9mZnNldDogeFBvcyB9O1xufVxuXG5cbmZ1bmN0aW9uIGdldEJvcmRlcihlbCwgdHlwZSwgaW5jbHVkZUJvcmRlcikge1xuICAgIGlmIChpbmNsdWRlQm9yZGVyKSB7XG4gICAgICAgIHZhciBzaWRlID0gKHR5cGUgPT0gJ0hlaWdodCcpID8gJ3RvcCcgOiAnbGVmdCcsXG4gICAgICAgICAgICBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCksXG4gICAgICAgICAgICBzaWRlVmFsdWUgPSBwYXJzZUludChzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnYm9yZGVyLScgKyBzaWRlICsgJy13aWR0aCcpLCAxMCk7XG5cbiAgICAgICAgaWYgKHNpZGVWYWx1ZSkgcmV0dXJuIHNpZGVWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIGVsZW1lbnQgZnJvbSB0aGUgZG9jdW1lbnRcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsIHRoZSBlbGVtZW50IHRvIGJlIHJlbW92ZWRcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbCkge1xuICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnROb2RlO1xuICAgIGlmIChwYXJlbnQpe1xuICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQoZWwpO1xuICAgICAgICBwYXJlbnQubm9ybWFsaXplKCk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgdGV4dCBub2RlIG9mIGFuIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR8Tm9kZX0gbm9kZSB0aGUgbm9kZSB0byBiZSBzZWFyY2hlZCwgaWYgdGhlIG5vZGUgaXMgdGV4dCBub2RlIHdlIHJldHVybiB0aGUgbm9kZS5cbiAqIEByZXR1cm4ge1RleHROb2RlfVxuICovXG5mdW5jdGlvbiBmaXJzdFRleHROb2RlKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkgcmV0dXJuIG5vZGU7XG4gICAgdmFyIHRyZWVXYWxrZXIgPSBjcmVhdGVUcmVlV2Fsa2VyKG5vZGUsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcbiAgICByZXR1cm4gdHJlZVdhbGtlci5maXJzdENoaWxkKCk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsYXN0IGNoaWxkIHRleHQgbm9kZSBvZiBhbiBlbGVtZW50XG4gKlxuICogQHBhcmFtIHtFbGVtZW50fE5vZGV9IG5vZGUgdGhlIG5vZGUgdG8gYmUgc2VhcmNoZWQsIGlmIHRoZSBub2RlIGlzIHRleHQgbm9kZSB3ZSByZXR1cm4gdGhlIG5vZGUuXG4gKiBAcmV0dXJuIHtUZXh0Tm9kZX1cbiAqL1xuZnVuY3Rpb24gbGFzdFRleHROb2RlKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkgcmV0dXJuIG5vZGU7XG4gICAgdmFyIHRyZWVXYWxrZXIgPSBjcmVhdGVUcmVlV2Fsa2VyKG5vZGUsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcbiAgICByZXR1cm4gdHJlZVdhbGtlci5sYXN0Q2hpbGQoKTtcbn1cblxuXG4vKipcbiAqIFJlbW92ZXMgZWxlbWVudCBmcm9tIHRoZSBkb2N1bWVudCBwdXR0aW5nIGl0cyBjaGlsZHJlbiBpbiBpdHMgcGxhY2VcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsIHRoZSBlbGVtZW50IHRvIGJlIFwidW53cmFwcGVkXCJcbiAqL1xuZnVuY3Rpb24gdW53cmFwRWxlbWVudChlbCkge1xuICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnROb2RlO1xuXG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgICB2YXIgZnJhZyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgICAgLy8gbXVzdCBiZSBjb3BpZWQgdG8gYXZvaWQgaXRlcmF0aW5nIGEgbXV0YXRpbmcgbGlzdCBvZiBjaGlsZE5vZGVzXG4gICAgICAgIHZhciBjaGlsZHJlbiA9IF8uc2xpY2UoZWwuY2hpbGROb2Rlcyk7XG4gICAgICAgIGNoaWxkcmVuLmZvckVhY2goZnJhZy5hcHBlbmRDaGlsZCwgZnJhZyk7XG4gICAgICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQoZnJhZywgZWwpO1xuICAgICAgICBwYXJlbnQubm9ybWFsaXplKCk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogV3JhcHMgYW4gZWxlbWVudCBpbiBhbm90aGVyIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0gIHtFbGVtZW50fSB3cmFwSW50b0VsXG4gKiBAcGFyYW0gIHtFbGVtZW50fSBlbFxuICovXG5mdW5jdGlvbiB3cmFwSW5FbGVtZW50KHdyYXBJbnRvRWwsIGVsKSB7XG4gICAgdmFyIHBhcmVudCA9IGVsLnBhcmVudE5vZGU7XG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUod3JhcEludG9FbCwgZWwpO1xuICAgICAgICB3cmFwSW50b0VsLmFwcGVuZENoaWxkKGVsKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBUcmltcyBhIHRleHQgbm9kZSBvZiB0cmFpbGluZyBzcGFjZXMsIGFuZCByZXR1cm5zIHRydWUgaWYgYSB0cmltIHdhcyBwZXJmb3JtZWQuXG4gKlxuICogQHBhcmFtICB7VGV4dE5vZGV9IG5vZGVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHRyaW1Ob2RlUmlnaHQobm9kZSkge1xuICAgIHJldHVybiBfdHJpbU5vZGUobm9kZSwgJ3RyaW1SaWdodCcpO1xufVxuXG5cbi8qKlxuICogVHJpbXMgYSB0ZXh0IG5vZGUgb2YgbGVhZGluZyBzcGFjZXMsIGFuZCByZXR1cm5zIHRydWUgaWYgYSB0cmltIHdhcyBwZXJmb3JtZWQuXG4gKlxuICogQHBhcmFtICB7VGV4dE5vZGV9IG5vZGVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHRyaW1Ob2RlTGVmdChub2RlKSB7XG4gICAgcmV0dXJuIF90cmltTm9kZShub2RlLCAndHJpbUxlZnQnKTtcbn1cblxuXG5mdW5jdGlvbiBfdHJpbU5vZGUobm9kZSwgbWV0aG9kTmFtZSkge1xuICAgIHZhciBsZW4gPSBub2RlLmxlbmd0aDtcbiAgICBub2RlLnRleHRDb250ZW50ID0gbm9kZS50ZXh0Q29udGVudFttZXRob2ROYW1lXSgpO1xuICAgIHJldHVybiBsZW4gIT09IG5vZGUubGVuZ3RoO1xufVxuXG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgcmVmZXJlbmNlIHRvIGNvbXBvbmVudCBmcm9tIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0gIHtFbGVtZW50fSBlbFxuICovXG5mdW5jdGlvbiBkZXRhY2hDb21wb25lbnQoZWwpIHtcbiAgICBkZWxldGUgZWxbY29uZmlnLmNvbXBvbmVudFJlZl07XG59XG5cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGNvbnRlbnQgb2YgYSBodG1sIHN0cmluZ1xuICogQHBhcmFtICB7U3RyaW5nfSBzdHIgQW55IHN0cmluZ1xuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBzdHJpbmcgY2xlYW5lZCBvZiBhbnkgaHRtbCBjb250ZW50LlxuICovXG5mdW5jdGlvbiBzdHJpcEh0bWwoc3RyKSB7XG4gICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuICAgIGRpdi5pbm5lckhUTUwgPSBzdHI7XG4gICAgcmV0dXJuIGRpdi50ZXh0Q29udGVudCB8fCAnJztcbn1cblxuXG4vKipcbiAqIENvbnZlbmllbmNlIHdyYXBwZXIgZm9yIG5hdGl2ZSBUcmVlV2Fsa2VyIHRoYXQgYXV0b21hdGljYWxseSB3YWxrcyB0aGUgdHJlZSBhbmQgY2FsbHMgYW4gaXRlcmF0b3IgZnVuY3Rpb24uXG4gKiBUaGlzIHdpbGwgbm90IGl0ZXJhdGUgdGhlIHJvb3QgZWxlbWVudC5cbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSByb290IFRoZSBjb250YWluaW5nIHJvb3QgZWxlbWVudCB0byBiZSB3YWxrZWQuIFdpbGwgbm90IGJlIGl0ZXJhdGVkLlxuICogQHBhcmFtICB7Tm9kZUZpbGVyfSBmaWx0ZXIgQSBOb2RlRmlsdGVyIGNvbnN0YW50LCBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvQVBJL1RyZWVXYWxrZXJcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBpdGVyYXRvciBBIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBlYWNoIG5vZGUuIFJldHVybmluZyAnZmFsc2UnIHdpbGwgYnJlYWsuXG4gKiBAcGFyYW0gIHtPYmplY3R9IGNvbnRleHQgQW4gb3B0aW9uYWwgY29udGV4dCB0byBwYXNzZWQsIGRlZmF1bHRzIHRvIHJvb3QuXG4gKi9cbmZ1bmN0aW9uIHdhbGtUcmVlKHJvb3QsIGZpbHRlciwgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICB2YXIgdHcgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKHJvb3QsIGZpbHRlcik7XG4gICAgd2hpbGUodHcubmV4dE5vZGUoKSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gaXRlcmF0b3IuY2FsbChjb250ZXh0IHx8IHJvb3QsIHR3LmN1cnJlbnROb2RlKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIGJyZWFrO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIFJldHVybnMgYXJyYXkgb2YgY2hpbGQgaW5kZXhlcyBvZiBlbGVtZW50IHBhdGggaW5zaWRlIHJvb3QgZWxlbWVudCBpbiBET00gdHJlZSB1c2luZyBicmVhZHRoIGZpcnN0IHRyZWUgdHJhdmVyc2FsLlxuICogUmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIGVsZW1lbnQgaXMgbm90IGluc2lkZSByb290IGVsZW1lbnQsIDAgaWYgdGhlIHJvb3QgZWxlbWVudCBpdHNlbGYgaXMgcGFzc2VkLlxuICpcbiAqIEBwYXJhbSAge0VsZW1lbnR9IHJvb3RFbCBlbGVtZW50IHRvIHNlYXJjaFxuICogQHBhcmFtICB7RWxlbWVudH0gZWwgZWxlbWVudCB0byBmaW5kIHRoZSBpbmRleCBvZlxuICogQHJldHVybiB7QXJyYXlbTnVtYmVyXX1cbiAqL1xuZnVuY3Rpb24gdHJlZVBhdGhPZihyb290RWwsIGVsKSB7XG4gICAgaWYgKCEgKHJvb3RFbCAmJiByb290RWwuY29udGFpbnMoZWwpKSkgcmV0dXJuO1xuXG4gICAgdmFyIHRyZWVQYXRoID0gW11cbiAgICAgICAgLCBub2RlID0gcm9vdEVsO1xuXG4gICAgd2hpbGUgKG5vZGUgIT0gZWwpIHtcbiAgICAgICAgdmFyIG5vZGVJbmRleCA9IF8uZmluZEluZGV4KG5vZGUuY2hpbGROb2RlcywgY29udGFpbnNFbCk7XG4gICAgICAgIHRyZWVQYXRoLnB1c2gobm9kZUluZGV4KTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1tub2RlSW5kZXhdO1xuICAgIH1cblxuICAgIHJldHVybiB0cmVlUGF0aDtcblxuICAgIGZ1bmN0aW9uIGNvbnRhaW5zRWwoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkLmNvbnRhaW5zKGVsKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGVsZW1lbnQgYXQgZ2l2ZW4gdHJlZSBwYXRoXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSByb290RWxcbiAqIEBwYXJhbSB7QXJyYXlbTnVtYmVyXX0gdHJlZVBhdGhcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gbmVhcmVzdCByZXR1cm4gbmVhcmVzdCBwb3NzaWJsZSBub2RlIGlmIGV4YWN0IG5vZGUgZG9lcyBub3QgZXhpc3RcbiAqIEByZXR1cm4ge05vZGV9XG4gKi9cbmZ1bmN0aW9uIGdldE5vZGVBdFRyZWVQYXRoKHJvb3RFbCwgdHJlZVBhdGgsIG5lYXJlc3QpIHtcbiAgICBpZiAoIXRyZWVQYXRoKSByZXR1cm47XG5cbiAgICB2YXIgbGVuID0gdHJlZVBhdGgubGVuZ3RoO1xuICAgIGlmIChsZW4gPT09IDApIHJldHVybiByb290RWw7XG5cbiAgICB2YXIgbm9kZSA9IHJvb3RFbDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZE5vZGVzO1xuICAgICAgICBpZiAoISBjaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKCEgbmVhcmVzdCkgbm9kZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjaGlsZEluZGV4ID0gdHJlZVBhdGhbaV1cbiAgICAgICAgICAgICwgY2hpbGQgPSBjaGlsZHJlbltjaGlsZEluZGV4XTtcbiAgICAgICAgaWYgKCEgY2hpbGQpIHtcbiAgICAgICAgICAgIG5vZGUgPSBuZWFyZXN0XG4gICAgICAgICAgICAgICAgICAgID8gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBub2RlID0gY2hpbGQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG59XG5cblxuLyoqXG4gKiBJbnNlcnRzIGFuIGVsZW1lbnQgaW5zaWRlIHJvb3QgYXQgYSBnaXZlbiBwYXRoIGluIHRyZWUgKHRoYXQgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgdGhlIGluZGV4IHJldHVybmVkIGJ5IGB0cmVlUGF0aE9mYCBmdW5jdGlvbikuIElmIGVsZW1lbnQgaXMgYWxyZWFkeSBpbiB0aGUgcm9vdCdzIHRyZWUsIGl0IHdpbGwgYmUgcmVtb3ZlZCBmaXJzdCBhbmQgdGhlbiBtb3ZlZCB0byB0aGUgcGFzc2VkIHRyZWVJbmRleFxuICogSW5zZXJ0aW9uIGF0IGluZGV4IDAgaXMgbm90IHBvc3NpYmxlIGFuZCB3aWxsIHJldHVybiB1bmRlZmluZWQgYXMgaXQgd291bGQgbWVhbiByZXBsYWNpbmcgdGhlIHJvb3QgZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHJvb3RFbCBlbGVtZW50IGludG8gd2hpY2ggdG8gaW5zZXJ0XG4gKiBAcGFyYW0ge051bWJlcn0gdHJlZUluZGV4IGluZGV4IGluIERPTSB0cmVlIGluc2lkZSByb290IGVsZW1lbnQgKHNlZSB0cmVlUGF0aE9mKVxuICogQHBhcmFtIHtFbGVtZW50fSBlbCBlbGVtZW50IHRvIGJlIGluc2VydGVkXG4gKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIHdhcyBzdWNjZXNzZnVsbHkgaW5zZXJ0ZWRcbiAqL1xuZnVuY3Rpb24gaW5zZXJ0QXRUcmVlUGF0aChyb290RWwsIHRyZWVQYXRoLCBlbCwgbmVhcmVzdCkge1xuICAgIHZhciB0b05vcm1hbGl6ZSA9IGVsLm5vZGVUeXBlID09IE5vZGUuVEVYVF9OT0RFO1xuICAgIGlmIChyb290RWwuY29udGFpbnMoZWwpKVxuICAgICAgICByZW1vdmVFbGVtZW50KGVsKTsgLy8gY2FuJ3QgdXNlIHJlbW92ZUNoaWxkIGFzIHJvb3RFbCBoZXJlIGlzIG5vdCBhbiBpbW1lZGlhdGUgcGFyZW50XG5cbiAgICBpZiAodHJlZVBhdGgubGVuZ3RoID09IDApIHJldHVybjtcblxuICAgIHZhciBwYXJlbnQgPSBnZXROb2RlQXRUcmVlUGF0aChyb290RWwsIHRyZWVQYXRoLnNsaWNlKDAsIC0xKSwgbmVhcmVzdClcbiAgICAgICAgLCBjaGlsZHJlbiA9IHBhcmVudC5jaGlsZE5vZGVzO1xuXG4gICAgaWYgKCEgY2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKG5lYXJlc3QpIHtcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgY2hpbGRyZW4gPSBwYXJlbnQuY2hpbGROb2RlcztcbiAgICAgICAgfSBlbHNlIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgY2hpbGRJbmRleCA9IHRyZWVQYXRoW3RyZWVQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICwgY2hpbGQgPSBjaGlsZHJlbltjaGlsZEluZGV4XTtcblxuICAgIGlmIChjaGlsZCkge1xuICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGVsLCBjaGlsZCk7XG4gICAgICAgIGlmICh0b05vcm1hbGl6ZSkgcGFyZW50Lm5vcm1hbGl6ZSgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAoY2hpbGRJbmRleCA9PT0gMCB8fCBuZWFyZXN0KSkge1xuICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoZWwpO1xuICAgICAgICBpZiAodG9Ob3JtYWxpemUpIHBhcmVudC5ub3JtYWxpemUoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY2hpbGQgPSBjaGlsZHJlbltjaGlsZEluZGV4IC0gMV07XG4gICAgICAgIGlmIChjaGlsZCB8fCBuZWFyZXN0KSB7XG4gICAgICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoZWwpO1xuICAgICAgICAgICAgaWYgKHRvTm9ybWFsaXplKSBwYXJlbnQubm9ybWFsaXplKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBmaXJzdCB0cmVlIHBhdGggcG9pbnRzIHRvIGEgbm9kZSB3aGljaCBpcyBiZWZvcmUgdGhlIG90aGVyIGluIHRoZSBkb2N1bWVudCBvcmRlci5cbiAqIEBwYXJhbSAge0FycmF5fSAgcGF0aDEgICBBIHRyZWVwYXRoIGFycmF5XG4gKiBAcGFyYW0gIHtBcnJheX0gIHBhdGgyICAgQSB0cmVlcGF0aCBhcnJheVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNUcmVlUGF0aEJlZm9yZShwYXRoMSwgcGF0aDIpIHtcbiAgICB2YXIgaSA9IDBcbiAgICAgICAgLCBpc0JlZm9yZTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGF0aDEpICYmIEFycmF5LmlzQXJyYXkocGF0aDIpKVxuICAgICAgICByZXR1cm4gbG9nZ2VyLmVycm9yKCdpc1RyZWVQYXRoQmVmb3JlOiBPbmUgb3IgYm90aCBwYXRocyBhcmUgbm90IHZhbGlkIHRyZWVwYXRoIGFycmF5cy4nKTtcblxuICAgIGZvciAoaTsgaSA8IHBhdGgxLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwYXRoMVtpXSA8IHBhdGgyW2ldKSB7XG4gICAgICAgICAgICBpc0JlZm9yZSA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmIChwYXRoMVtpXSA+IHBhdGgyW2ldKSB7XG4gICAgICAgICAgICBpc0JlZm9yZSA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGlzQmVmb3JlID09ICd1bmRlZmluZWQnKVxuICAgICAgICBpZiAocGF0aDEubGVuZ3RoIDwgcGF0aDIubGVuZ3RoKVxuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ2lzVHJlZVBhdGhCZWZvcmU6IE9uZSBub2RlIGlzIGluc2lkZSBhbm90aGVyJyk7XG5cbiAgICByZXR1cm4gaXNCZWZvcmUgfHwgZmFsc2U7XG59XG5cblxuLyoqXG4gKiBDb252ZXJ0cyBub24gbGF0aW4gY2hhcmFjdGVycyB0byBIVE1MIGVudGl0eSBjb2Rlcy5cbiAqIEBwYXJhbSAge1N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gY29udmVydFxuICogQHJldHVybiB7U3RyaW5nfSAgICAgdGhlIHN0cmluZyB3aXRoIGh0bWwgZW50aXRpZXNcbiAqL1xuZnVuY3Rpb24gaHRtbEVudGl0aWVzKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1xcdTAwQTAtXFx1OTk5OTk8PlxcJl0vZ2ltLCBmdW5jdGlvbihpKSB7XG4gICAgICAgIHJldHVybiAnJiMnK2kuY2hhckNvZGVBdCgwKSsnOyc7XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gY3JlYXRlVHJlZVdhbGtlcihlbCwgd2hhdFRvU2hvdykge1xuICAgIHdoYXRUb1Nob3cgPSB3aGF0VG9TaG93IHx8IChOb2RlRmlsdGVyLlNIT1dfVEVYVCB8IE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UKTtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihlbCwgd2hhdFRvU2hvdyk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZWZlcmVuY2UgdG8gdGhlIHdpbmRvdyB0aGUgbm9kZSBpcyBpblxuICpcbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICogQHJldHVybiB7V2luZG93fVxuICovXG5mdW5jdGlvbiBnZXROb2RlV2luZG93KG5vZGUpIHtcbiAgICB2YXIgZG9jID0gbm9kZS5vd25lckRvY3VtZW50O1xuICAgIHJldHVybiBkb2MgJiYgKGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93KTtcbn1cblxuXG5cbi8qKlxuICogZG8gc29tZXRoaW5nIGZvciBlYWNoIG5vZGVzIGNvbnRhaW5lZCBpbiBhIHJhbmdlXG4gKlxuICogQHBhcmFtIHtyYW5nZX0gYSByYW5nZVxuICogQHBhcmFtIHtjYn0gYSBmdW5jdGlvbiB0YWtpbmcgYSBub2RlIGFzIGFyZ3VtZW50XG5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaE5vZGVzSW5SYW5nZShyYW5nZSwgY2Ipe1xuICAgIHZhciByYW5nZUNvbnRhaW5lciA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyXG4gICAgICAgICwgZG9jID0gcmFuZ2VDb250YWluZXIub3duZXJEb2N1bWVudDtcblxuICAgIGZ1bmN0aW9uIGlzTm9kZUluc2lkZVJhbmdlKG5vZGUpe1xuICAgICAgICB2YXIgbm9kZVJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgdmFyIGlzSW5zaWRlID0gZmFsc2U7XG4gICAgICAgIG5vZGVSYW5nZS5zZWxlY3ROb2RlKG5vZGUpO1xuXG4gICAgICAgIGlmIChub2RlUmFuZ2UuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKHdpbmRvdy5SYW5nZS5TVEFSVF9UT19TVEFSVCwgcmFuZ2UpICE9IC0xXG4gICAgICAgICAgICAmJiBub2RlUmFuZ2UuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKHdpbmRvdy5SYW5nZS5FTkRfVE9fRU5ELCByYW5nZSkgIT0gMSl7XG4gICAgICAgICAgICBpc0luc2lkZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZVJhbmdlLmRldGFjaCgpO1xuICAgICAgICByZXR1cm4gaXNJbnNpZGU7XG4gICAgfVxuXG4gICAgdmFyIHRyZWVXYWxrZXIgPSBkb2MuY3JlYXRlVHJlZVdhbGtlcihyYW5nZUNvbnRhaW5lcixcbiAgICAgICAgICAgIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UIHwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xuXG4gICAgdmFyIGN1cnJlbnROb2RlO1xuICAgIHdoaWxlIChjdXJyZW50Tm9kZSA9IHRyZWVXYWxrZXIubmV4dE5vZGUoKSl7IC8vIHNob3VsZCBiZSBhc3NpZ25tZW50XG4gICAgICAgIGlmIChpc05vZGVJbnNpZGVSYW5nZShjdXJyZW50Tm9kZSkpe1xuICAgICAgICAgICAgY2IoY3VycmVudE5vZGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIGdldCBhbGwgY29tcG9uZW50cyBjb250YWluZWQgaW4gYSByYW5nZVxuICpcbiAqIEBwYXJhbSB7cmFuZ2V9IGEgRE9NIHJhbmdlLlxuICovXG5mdW5jdGlvbiBnZXRDb21wb25lbnRzRnJvbVJhbmdlKHJhbmdlKSB7XG4gICAgdmFyIHdpbiA9IGdldE5vZGVXaW5kb3cocmFuZ2Uuc3RhcnRDb250YWluZXIpXG4gICAgICAgICwgQ29tcG9uZW50ID0gd2luLm1pbG8uQ29tcG9uZW50O1xuXG4gICAgdmFyIGNvbXBvbmVudHMgPSBbXTtcbiAgICBmb3JFYWNoTm9kZXNJblJhbmdlKHJhbmdlLCBmdW5jdGlvbiAobm9kZSl7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICB2YXIgY29tcCA9IENvbXBvbmVudC5nZXRDb21wb25lbnQobm9kZSk7XG4gICAgICAgICAgICBpZiAoY29tcClcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2goY29tcCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBjb21wb25lbnRzO1xufVxuXG4vKipcbiAqIGRlbGV0ZSBhIHJhbmdlXG4gKlxuICogQHBhcmFtIHtyYW5nZX0gZGVsZXRlIGEgRE9NIHJhbmdlIGFuZCBhbGwgdGhlIGNvbXBvbmVudHMgaW5zaWRlXG4gKi9cbmZ1bmN0aW9uIGRlbGV0ZVJhbmdlV2l0aENvbXBvbmVudHMocmFuZ2UpIHtcbiAgICB2YXIgY29tcG9uZW50cyA9IGdldENvbXBvbmVudHNGcm9tUmFuZ2UocmFuZ2UpO1xuXG4gICAgY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGNvbXApIHtcbiAgICAgICAgY29tcC5kZXN0cm95KHRydWUpO1xuICAgIH0pO1xuXG4gICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTtcbn1cblxuLyoqXG4gKiBjaGVjayBpZiB0d28gcmFuZ2VzIGFyZSBlcXVpdmFsZW50XG4gKlxuICogQHBhcmFtIHtyYW5nZX0gcmFuZ2UxXG4gKiBAcGFyYW0ge3JhbmdlfSByYW5nZTJcbiAqIEByZXR1cm4ge0Jvb2xlYW59IGFyZSB0aGUgdHdvIHJhbmdlcyBlcXVpdmFsZW50XG4gKi9cbmZ1bmN0aW9uIGFyZVJhbmdlc0VxdWFsKHJhbmdlMSwgcmFuZ2UyKXtcbiAgICByZXR1cm4gcmFuZ2UxLmNvbXBhcmVCb3VuZGFyeVBvaW50cyh3aW5kb3cuUmFuZ2UuU1RBUlRfVE9fU1RBUlQsIHJhbmdlMikgPT0gMCAmJiByYW5nZTEuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKHdpbmRvdy5SYW5nZS5FTkRfVE9fRU5ELCByYW5nZTIpID09IDA7XG59XG5cblxuLyoqXG4gKiBBZGRzIGEgc2luZ2xlIHBpeGVsIGRpdiB0byB0aGUgYm9keSBhdCBhIGdpdmVuIHggYW5kIHkgcG9zaXRpb24uIFVzZWZ1bCBmb3IgZGVidWdnaW5nIHBvc2l0aW9uIHNwZWNpZmljIGNvZGUuXG4gKiBAcGFyYW0ge051bWJlcn0geFxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqL1xuZnVuY3Rpb24gYWRkRGVidWdQb2ludCh4LCB5KSB7XG4gICAgdmFyIGRiRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkYkVsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnd2lkdGg6IDFweDsgaGVpZ2h0OiAxcHg7IHBvc2l0aW9uOmZpeGVkOyBsZWZ0OicreCsncHg7IHRvcDonK3krJ3B4OyBiYWNrZ3JvdW5kLWNvbG9yOnJlZDsgei1pbmRleDogMTAwJyk7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRiRWwpO30sIDIwMCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIF8gPSByZXF1aXJlKCdtaWxvLWNvcmUnKS5wcm90bztcblxuXG5tb2R1bGUuZXhwb3J0cyA9IERPTUxpc3RlbmVycztcblxuXG5mdW5jdGlvbiBET01MaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMgPSBbXTtcbn1cblxuXG5fLmV4dGVuZFByb3RvKERPTUxpc3RlbmVycywge1xuICAgIGFkZDogRE9NTGlzdGVuZXJzJGFkZCxcbiAgICByZW1vdmU6IERPTUxpc3RlbmVycyRyZW1vdmUsXG4gICAgcmVtb3ZlQWxsOiBET01MaXN0ZW5lcnMkcmVtb3ZlQWxsXG59KTtcblxuXG5mdW5jdGlvbiBET01MaXN0ZW5lcnMkYWRkKHRhcmdldCwgZXZlbnRUeXBlLCBoYW5kbGVyKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMucHVzaCh7XG4gICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSxcbiAgICAgICAgaGFuZGxlcjogaGFuZGxlclxuICAgIH0pO1xuICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlcik7XG59XG5cblxuZnVuY3Rpb24gRE9NTGlzdGVuZXJzJHJlbW92ZSh0YXJnZXQsIGV2ZW50VHlwZSwgaGFuZGxlcikge1xuICAgIHZhciBsaXN0ZW5lciA9IHtcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlLFxuICAgICAgICBoYW5kbGVyOiBoYW5kbGVyXG4gICAgfTtcbiAgICB2YXIgaWR4ID0gXy5maW5kSW5kZXgodGhpcy5saXN0ZW5lcnMsIF8ucGFydGlhbChfLmlzRXF1YWwsIGxpc3RlbmVyKSk7XG5cbiAgICBpZiAoaWR4ID4gLTEpIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgIF9yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIERPTUxpc3RlbmVycyRyZW1vdmVBbGwoKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMuZm9yRWFjaChfcmVtb3ZlTGlzdGVuZXIpO1xuICAgIHRoaXMubGlzdGVuZXJzID0gW107XG59XG5cblxuZnVuY3Rpb24gX3JlbW92ZUxpc3RlbmVyKGwpIHtcbiAgICBsLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGwuZXZlbnRUeXBlLCBsLmhhbmRsZXIpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxubW9kdWxlLmV4cG9ydHMgPSBkb21SZWFkeTtcblxuXG52YXIgZG9tUmVhZHlGdW5jcyA9IFtdXG4gICAgLCBkb21SZWFkeVN1YnNjcmliZWQgPSBmYWxzZTtcblxuXG5mdW5jdGlvbiBkb21SZWFkeShmdW5jKSB7IC8vICwgYXJndW1lbnRzXG4gICAgdmFyIHNlbGYgPSB0aGlzXG4gICAgICAgICwgYXJncyA9IF8uc2xpY2UoYXJndW1lbnRzLCAxKTtcbiAgICBpZiAoaXNSZWFkeS5jYWxsKHRoaXMpKVxuICAgICAgICBjYWxsRnVuYygpO1xuICAgIGVsc2Uge1xuICAgICAgICBpZiAoIWRvbVJlYWR5U3Vic2NyaWJlZCkge1xuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncmVhZHlzdGF0ZWNoYW5nZScsIG9uRG9tUmVhZHkpO1xuICAgICAgICAgICAgZG9tUmVhZHlTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBkb21SZWFkeUZ1bmNzLnB1c2goY2FsbEZ1bmMpOyAvLyBjbG9zdXJlIGlzIGFkZGVkLCBzbyBldmVyeSB0aW1lIGRpZmZlcmVudCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZFxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhbGxGdW5jKCkge1xuICAgICAgICBmdW5jLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBvbkRvbVJlYWR5KCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3JlYWR5c3RhdGVjaGFuZ2UnLCBvbkRvbVJlYWR5KTtcbiAgICBkb21SZWFkeUZ1bmNzLmZvckVhY2goZnVuY3Rpb24oZnVuYykgeyBmdW5jKCk7IH0pO1xufVxuXG5cbl8uZXh0ZW5kKGRvbVJlYWR5LCB7XG4gICAgaXNSZWFkeTogaXNSZWFkeVxufSk7XG5cblxuZnVuY3Rpb24gaXNSZWFkeSgpIHtcbiAgICB2YXIgcmVhZHlTdGF0ZSA9IGRvY3VtZW50LnJlYWR5U3RhdGU7XG4gICAgcmV0dXJuIHJlYWR5U3RhdGUgPT0gJ2xvYWRpbmcnID8gZmFsc2UgOiByZWFkeVN0YXRlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vY29tcG9uZW50cy9jX2NsYXNzJylcbiAgICAsIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlciA9IG1pbG9Db3JlLk1lc3NlbmdlclxuICAgICwgZHJhZ0Ryb3BDb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKS5kcmFnRHJvcFxuICAgICwgY29tcG9uZW50TWV0YVJlZ2V4ID0gZHJhZ0Ryb3BDb25maWcuZGF0YVR5cGVzLmNvbXBvbmVudE1ldGFSZWdleFxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBiYXNlMzIgPSByZXF1aXJlKCdiYXNlMzInKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IERyYWdEcm9wO1xuXG5cbi8qKlxuICogV3JhcHBlciBmb3IgZXZlbnQuZGF0YVRyYW5zZmVyIG9mIGRyYWctZHJvcCBIVE1MIEFQSVxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtldmVudH0gRE9NIGV2ZW50XG4gKiBAcmV0dXJuIHtEcmFnRHJvcH1cbiAqL1xuZnVuY3Rpb24gRHJhZ0Ryb3AoZXZlbnQpIHtcbiAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7XG4gICAgdGhpcy5kYXRhVHJhbnNmZXIgPSBldmVudC5kYXRhVHJhbnNmZXI7XG4gICAgdGhpcy50eXBlcyA9IGV2ZW50LmRhdGFUcmFuc2Zlci50eXBlcztcbn1cblxuLyoqXG4gKiBVc2FnZTpcbiAqIHZhciB0ZXN0RFQgPSBuZXcgRHJhZ0Ryb3AoZXZlbnQpO1xuICogdGVzdERULnNldENvbXBvbmVudE1ldGEobmV3Q29tcG9uZW50LCB7dGVzdDogJ3Rlc3QnLCB0ZXN0MjogJ3Rlc3QyJ30pO1xuICogdGVzdERULmdldENvbXBvbmVudE1ldGEoKTtcbiAqL1xuXG5fLmV4dGVuZChEcmFnRHJvcCwge1xuICAgIGNvbXBvbmVudERhdGFUeXBlOiBEcmFnRHJvcCQkY29tcG9uZW50RGF0YVR5cGVcbn0pO1xuXG5fLmV4dGVuZFByb3RvKERyYWdEcm9wLCB7XG4gICAgaXNDb21wb25lbnQ6IERyYWdEcm9wJGlzQ29tcG9uZW50LFxuICAgIGdldENvbXBvbmVudFN0YXRlOiBEcmFnRHJvcCRnZXRDb21wb25lbnRTdGF0ZSxcbiAgICBzZXRDb21wb25lbnRTdGF0ZTogRHJhZ0Ryb3Akc2V0Q29tcG9uZW50U3RhdGUsXG4gICAgZ2V0Q29tcG9uZW50TWV0YTogRHJhZ0Ryb3AkZ2V0Q29tcG9uZW50TWV0YSxcbiAgICBzZXRDb21wb25lbnRNZXRhOiBEcmFnRHJvcCRzZXRDb21wb25lbnRNZXRhLFxuICAgIGdldEFsbG93ZWRFZmZlY3RzOiBEcmFnRHJvcCRnZXRBbGxvd2VkRWZmZWN0cyxcbiAgICBzZXRBbGxvd2VkRWZmZWN0czogRHJhZ0Ryb3Akc2V0QWxsb3dlZEVmZmVjdHMsXG4gICAgZ2V0RHJvcEVmZmVjdDogRHJhZ0Ryb3AkZ2V0RHJvcEVmZmVjdCxcbiAgICBzZXREcm9wRWZmZWN0OiBEcmFnRHJvcCRzZXREcm9wRWZmZWN0LFxuICAgIGlzRWZmZWN0QWxsb3dlZDogRHJhZ0Ryb3AkaXNFZmZlY3RBbGxvd2VkLFxuICAgIGdldERhdGE6IERyYWdEcm9wJGdldERhdGEsXG4gICAgc2V0RGF0YTogRHJhZ0Ryb3Akc2V0RGF0YSxcbiAgICBjbGVhckRhdGE6IERyYWdEcm9wJGNsZWFyRGF0YVxufSk7XG5cblxuZnVuY3Rpb24gRHJhZ0Ryb3AkJGNvbXBvbmVudERhdGFUeXBlKCkge1xuICAgIHJldHVybiBkcmFnRHJvcENvbmZpZy5kYXRhVHlwZXMuY29tcG9uZW50O1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJGlzQ29tcG9uZW50KCkge1xuICAgIHJldHVybiBfLmluZGV4T2YodGhpcy50eXBlcywgRHJhZ0Ryb3AuY29tcG9uZW50RGF0YVR5cGUoKSkgPj0gMDtcbn1cblxuXG5mdW5jdGlvbiBEcmFnRHJvcCRnZXRDb21wb25lbnRTdGF0ZSgpIHtcbiAgICB2YXIgZGF0YVR5cGUgPSBEcmFnRHJvcC5jb21wb25lbnREYXRhVHlwZSgpXG4gICAgICAgICwgc3RhdGVTdHIgPSB0aGlzLmRhdGFUcmFuc2Zlci5nZXREYXRhKGRhdGFUeXBlKVxuICAgICAgICAsIHN0YXRlID0gXy5qc29uUGFyc2Uoc3RhdGVTdHIpO1xuXG4gICAgcmV0dXJuIHN0YXRlO1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJHNldENvbXBvbmVudFN0YXRlKGNvbXBvbmVudCwgc3RhdGVTdHIpe1xuICAgIGlmICghIHN0YXRlU3RyKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGNvbXBvbmVudC5nZXRUcmFuc2ZlclN0YXRlKHsgcmVxdWVzdGVkQnk6ICdkcmFnJyB9KTtcbiAgICAgICAgc3RhdGVTdHIgPSBKU09OLnN0cmluZ2lmeShzdGF0ZSk7XG4gICAgfVxuICAgIHZhciBkYXRhVHlwZSA9IERyYWdEcm9wLmNvbXBvbmVudERhdGFUeXBlKCk7XG5cbiAgICBzdGF0ZVN0ciAmJiB0aGlzLmRhdGFUcmFuc2Zlci5zZXREYXRhKGRhdGFUeXBlLCBzdGF0ZVN0cik7XG4gICAgdGhpcy5kYXRhVHJhbnNmZXIuc2V0RGF0YSgndGV4dC9odG1sJywgY29tcG9uZW50LmVsLm91dGVySFRNTCk7XG4gICAgcmV0dXJuIHN0YXRlU3RyO1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJHNldENvbXBvbmVudE1ldGEoY29tcG9uZW50LCBwYXJhbXMsIGRhdGEpIHtcbiAgICB2YXIgbWV0YSA9IF9jb21wb25lbnRNZXRhKGNvbXBvbmVudCk7XG5cbiAgICB2YXIgcGFyYW1zU3RyID0gXy50b1F1ZXJ5U3RyaW5nKHBhcmFtcyk7XG4gICAgdmFyIGRhdGFUeXBlID0gZHJhZ0Ryb3BDb25maWcuZGF0YVR5cGVzLmNvbXBvbmVudE1ldGFUZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgnJWNsYXNzJywgX2VuY29kZShtZXRhLmNvbXBDbGFzcyB8fCAnJykpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCclbmFtZScsIF9lbmNvZGUobWV0YS5jb21wTmFtZSB8fCAnJykpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCclcGFyYW1zJywgX2VuY29kZShwYXJhbXNTdHIgfHwgJycpKTtcblxuICAgIGlmIChkYXRhICYmIHR5cGVvZiBkYXRhID09ICdvYmplY3QnKSBkYXRhID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG5cbiAgICB0aGlzLmRhdGFUcmFuc2Zlci5zZXREYXRhKGRhdGFUeXBlLCBkYXRhIHx8ICcnKTtcblxuICAgIHJldHVybiBkYXRhVHlwZTtcbn1cblxuXG5mdW5jdGlvbiBfZW5jb2RlKHN0cikge1xuICAgIHJldHVybiBiYXNlMzIuZW5jb2RlKHN0cikudG9Mb3dlckNhc2UoKTtcbn1cblxuXG5mdW5jdGlvbiBfY29tcG9uZW50TWV0YShjb21wb25lbnQpIHtcbiAgICByZXR1cm4gY29tcG9uZW50LnRyYW5zZmVyXG4gICAgICAgICAgICA/IGNvbXBvbmVudC50cmFuc2Zlci5nZXRDb21wb25lbnRNZXRhKClcbiAgICAgICAgICAgIDogeyBcbiAgICAgICAgICAgICAgICBjb21wQ2xhc3M6IGNvbXBvbmVudC5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgICAgICAgICAgIGNvbXBOYW1lOiBjb21wb25lbnQubmFtZVxuICAgICAgICAgICAgfTtcbn1cblxuXG5mdW5jdGlvbiBEcmFnRHJvcCRnZXRDb21wb25lbnRNZXRhKCkge1xuICAgIHZhciBtYXRjaDtcbiAgICB2YXIgbWV0YURhdGFUeXBlID0gXy5maW5kKHRoaXMudHlwZXMsIGZ1bmN0aW9uIChkVHlwZSkge1xuICAgICAgICBtYXRjaCA9IGRUeXBlLm1hdGNoKGNvbXBvbmVudE1ldGFSZWdleCk7XG4gICAgICAgIHJldHVybiAhIW1hdGNoO1xuICAgIH0pO1xuICAgIGlmICghbWV0YURhdGFUeXBlKSByZXR1cm47XG5cbiAgICBmb3IgKHZhciBpPTE7IGk8NDsgaSsrKVxuICAgICAgICBtYXRjaFtpXSA9IGJhc2UzMi5kZWNvZGUobWF0Y2hbaV0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tcENsYXNzOiBtYXRjaFsxXSxcbiAgICAgICAgY29tcE5hbWU6IG1hdGNoWzJdLFxuICAgICAgICBwYXJhbXM6IF8uZnJvbVF1ZXJ5U3RyaW5nKG1hdGNoWzNdKSxcbiAgICAgICAgbWV0YURhdGFUeXBlOiBtZXRhRGF0YVR5cGUsXG4gICAgICAgIG1ldGFEYXRhOiBfLmpzb25QYXJzZSh0aGlzLmRhdGFUcmFuc2Zlci5nZXREYXRhKG1ldGFEYXRhVHlwZSkpIFxuICAgICAgICAgICAgICAgICAgICA/IF8uanNvblBhcnNlKHRoaXMuZGF0YVRyYW5zZmVyLmdldERhdGEobWV0YURhdGFUeXBlKSkgXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5kYXRhVHJhbnNmZXIuZ2V0RGF0YShtZXRhRGF0YVR5cGUpXG4gICAgfTtcbn1cblxuXG4vLyBhcyBkZWZpbmVkIGhlcmU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvRHJhZ0Ryb3AvRHJhZ19PcGVyYXRpb25zI2RyYWdzdGFydFxuZnVuY3Rpb24gRHJhZ0Ryb3AkZ2V0QWxsb3dlZEVmZmVjdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQ7XG59XG5cblxuZnVuY3Rpb24gRHJhZ0Ryb3Akc2V0QWxsb3dlZEVmZmVjdHMoZWZmZWN0cykge1xuICAgIHRoaXMuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSBlZmZlY3RzO1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJGdldERyb3BFZmZlY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3Q7XG59XG5cblxuZnVuY3Rpb24gRHJhZ0Ryb3Akc2V0RHJvcEVmZmVjdChlZmZlY3QpIHtcbiAgICB0aGlzLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gZWZmZWN0O1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJGlzRWZmZWN0QWxsb3dlZChlZmZlY3QpIHtcbiAgICB2YXIgYWxsb3dlZEVmZmVjdHMgPSB0aGlzLmdldEFsbG93ZWRFZmZlY3RzKClcbiAgICAgICAgLCBpc0NvcHkgPSBlZmZlY3QgPT0gJ2NvcHknXG4gICAgICAgICwgaXNNb3ZlID0gZWZmZWN0ID09ICdtb3ZlJ1xuICAgICAgICAsIGlzTGluayA9IGVmZmVjdCA9PSAnbGluaydcbiAgICAgICAgLCBpc0FsbG93ZWQgPSBpc0NvcHkgfHwgaXNMaW5rIHx8IGlzTW92ZTtcblxuICAgIHN3aXRjaCAoYWxsb3dlZEVmZmVjdHMpIHtcbiAgICAgICAgY2FzZSAnY29weSc6XG4gICAgICAgIGNhc2UgJ21vdmUnOlxuICAgICAgICBjYXNlICdsaW5rJzpcbiAgICAgICAgICAgIHJldHVybiBhbGxvd2VkRWZmZWN0cyA9PSBlZmZlY3Q7XG4gICAgICAgIGNhc2UgJ2NvcHlMaW5rJzpcbiAgICAgICAgICAgIHJldHVybiBpc0NvcHkgfHwgaXNMaW5rO1xuICAgICAgICBjYXNlICdjb3B5TW92ZSc6XG4gICAgICAgICAgICByZXR1cm4gaXNDb3B5IHx8IGlzTW92ZTtcbiAgICAgICAgY2FzZSAnbGlua01vdmUnOlxuICAgICAgICAgICAgcmV0dXJuIGlzTGluayB8fCBpc01vdmU7XG4gICAgICAgIGNhc2UgJ2FsbCc6XG4gICAgICAgIGNhc2UgJ3VuaW5pdGlhbGl6ZWQnOlxuICAgICAgICAgICAgcmV0dXJuIGlzQWxsb3dlZDtcbiAgICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJGdldERhdGEoZGF0YVR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhVHJhbnNmZXIuZ2V0RGF0YShkYXRhVHlwZSk7XG59XG5cblxuZnVuY3Rpb24gRHJhZ0Ryb3Akc2V0RGF0YShkYXRhVHlwZSwgZGF0YVN0cikge1xuICAgIHRoaXMuZGF0YVRyYW5zZmVyLnNldERhdGEoZGF0YVR5cGUsIGRhdGFTdHIpO1xufVxuXG5cbmZ1bmN0aW9uIERyYWdEcm9wJGNsZWFyRGF0YShkYXRhVHlwZSkge1xuICAgIHRoaXMuZGF0YVRyYW5zZmVyLmNsZWFyRGF0YShkYXRhVHlwZSk7XG59XG5cblxuLyoqXG4gKiBEcmFnIGRyb3Agc2VydmljZSBjb21wZW5zYXRpbmcgZm9yIHRoZSBsYWNrIG9mIGNvbW11bmljYXRpb24gZnJvbSBkcm9wIHRhcmdldCB0byBkcmFnIHNvdXJjZSBpbiBET00gQVBJXG4gKi9cbnZhciBkcmFnRHJvcFNlcnZpY2UgPSBuZXcgTWVzc2VuZ2VyO1xuXG52YXIgX2N1cnJlbnREcmFnRHJvcCwgX2N1cnJlbnREcmFnRmFjZXQ7XG5cbl8uZXh0ZW5kKERyYWdEcm9wLCB7XG4gICAgc2VydmljZTogZHJhZ0Ryb3BTZXJ2aWNlLFxuICAgIGRlc3Ryb3k6IERyYWdEcm9wX2Rlc3Ryb3lcbn0pO1xuXG5cbmRyYWdEcm9wU2VydmljZS5vbk1lc3NhZ2VzKHtcbiAgICAvLyBkYXRhIGlzIERyYWdEcm9wRGF0YVRyYW5zZmVyIGluc3RhbmNlXG4gICAgLy8gZmlyZWQgYnkgRHJhZyBmYWNldCBvbiBcImRyYWdzdGFydFwiIGV2ZW50XG4gICAgJ2RyYWdkcm9wc3RhcnRlZCc6IG9uRHJhZ0Ryb3BTdGFydGVkLCBcbiAgICAvLyBkYXRhIGlzIG9iamVjdCB3aXRoIGF0IGxlYXN0IGRyb3BFZmZlY3QgcHJvcGVydHlcbiAgICAvLyBmaXJlZCBieSBEcm9wIGZhY2V0IG9uIFwiZHJvcFwiIGV2ZW50XG4gICAgJ2RyYWdkcm9wY29tcGxldGVkJzogb25EcmFnRHJvcENvbXBsZXRlZCwgXG4gICAgLy8gZmlyZWQgYnkgRHJhZyBmYWNldCBvbiBcImRyYWdlbmRcIiBldmVudCB0byBjb21wbGV0ZSBkcmFnXG4gICAgLy8gaWYgZHJvcCBoYXBwZW5kZWQgaW4gYW5vdGhlciB3aW5kb3cgb3IgaWYgaXQgd2FzIGNhbmNlbGxlZFxuICAgICdjb21wbGV0ZWRyYWdkcm9wJzogb25Db21wbGV0ZURyYWdEcm9wXG59KTtcblxuXG5fLmV4dGVuZChkcmFnRHJvcFNlcnZpY2UsIHtcbiAgICBnZXRDdXJyZW50RHJhZ0Ryb3A6IGdldEN1cnJlbnREcmFnRHJvcFxufSk7XG5cblxuZnVuY3Rpb24gb25EcmFnRHJvcFN0YXJ0ZWQobXNnLCBkYXRhKSB7XG4gICAgX2N1cnJlbnREcmFnRHJvcCA9IGRhdGEuZHJhZ0Ryb3A7XG4gICAgX2N1cnJlbnREcmFnRmFjZXQgPSBkYXRhLmRyYWdGYWNldDtcbn1cblxuXG5mdW5jdGlvbiBvbkRyYWdEcm9wQ29tcGxldGVkKG1zZywgZGF0YSkge1xuICAgIF9jdXJyZW50RHJhZ0ZhY2V0ICYmIF9jdXJyZW50RHJhZ0ZhY2V0LnBvc3RNZXNzYWdlU3luYygnZHJhZ2Ryb3Bjb21wbGV0ZWQnLCBkYXRhKTtcbiAgICBfY3VycmVudERyYWdEcm9wID0gdW5kZWZpbmVkO1xuICAgIF9jdXJyZW50RHJhZ0ZhY2V0ID0gdW5kZWZpbmVkO1xufVxuXG5cbmZ1bmN0aW9uIG9uQ29tcGxldGVEcmFnRHJvcChtc2csIGRhdGEpIHtcbiAgICBpZiAoX2N1cnJlbnREcmFnRHJvcClcbiAgICAgICAgZHJhZ0Ryb3BTZXJ2aWNlLnBvc3RNZXNzYWdlU3luYygnZHJhZ2Ryb3Bjb21wbGV0ZWQnLCBkYXRhKTtcbn1cblxuXG5mdW5jdGlvbiBnZXRDdXJyZW50RHJhZ0Ryb3AoKSB7XG4gICAgcmV0dXJuIF9jdXJyZW50RHJhZ0Ryb3A7XG59XG5cblxuZnVuY3Rpb24gRHJhZ0Ryb3BfZGVzdHJveSgpIHtcbiAgICBkcmFnRHJvcFNlcnZpY2Uub2ZmQWxsKCk7XG59XG4iLCIvLyA8YSBuYW1lPVwidXRpbHMtZXJyb3JcIj48L2E+XG4vLyBtaWxvLnV0aWxzLmVycm9yXG4vLyAtLS0tLS0tLS0tLVxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfID0gcmVxdWlyZSgnbWlsby1jb3JlJykucHJvdG87XG5cblxuLy8gbW9kdWxlIGV4cG9ydHMgZXJyb3IgY2xhc3NlcyBmb3IgYWxsIG5hbWVzIGRlZmluZWQgaW4gdGhpcyBhcnJheVxudmFyIGVycm9yQ2xhc3NOYW1lcyA9IFsnQWJzdHJhY3RDbGFzcycsICdNaXhpbicsICdNZXNzZW5nZXInLCAnQ29tcG9uZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ0F0dHJpYnV0ZScsICdCaW5kZXInLCAnTG9hZGVyJywgJ01haWxNZXNzYWdlU291cmNlJywgJ0ZhY2V0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ1Njb3BlJywgJ01vZGVsJywgJ0RvbUZhY2V0JywgJ0VkaXRhYmxlRmFjZXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAnTGlzdCcsICdDb25uZWN0b3InLCAnUmVnaXN0cnknLCAnRnJhbWVNZXNzYWdlU291cmNlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgJ0Ryb3AnLCAnQW5ndWxhcicsICdTdG9yYWdlTWVzc2FnZVNvdXJjZSddO1xuXG52YXIgZXJyb3IgPSB7XG4gICAgdG9CZUltcGxlbWVudGVkOiBlcnJvciR0b0JlSW1wbGVtZW50ZWQsXG4gICAgY3JlYXRlQ2xhc3M6IGVycm9yJGNyZWF0ZUNsYXNzXG59O1xuXG5lcnJvckNsYXNzTmFtZXMuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgZXJyb3JbbmFtZV0gPSBlcnJvciRjcmVhdGVDbGFzcyhuYW1lICsgJ0Vycm9yJyk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBlcnJvcjtcblxuXG5mdW5jdGlvbiBlcnJvciRjcmVhdGVDbGFzcyhlcnJvckNsYXNzTmFtZSkge1xuICAgIHZhciBFcnJvckNsYXNzID0gXy5tYWtlRnVuY3Rpb24oZXJyb3JDbGFzc05hbWUsICdtZXNzYWdlJyxcbiAgICAgICAgICAgICd0aGlzLm5hbWUgPSBcIicgKyBlcnJvckNsYXNzTmFtZSArICdcIjsgXFxcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgXCJUaGVyZSB3YXMgYW4gIGVycm9yXCI7Jyk7XG4gICAgXy5tYWtlU3ViY2xhc3MoRXJyb3JDbGFzcywgRXJyb3IpO1xuXG4gICAgcmV0dXJuIEVycm9yQ2xhc3M7XG59XG5cblxuZnVuY3Rpb24gZXJyb3IkdG9CZUltcGxlbWVudGVkKCkge1xuICAgIHRocm93IG5ldyBlcnJvci5BYnN0cmFjdENsYXNzKCdjYWxsaW5nIHRoZSBtZXRob2Qgb2YgYW4gYWJzY3RyYWN0IGNsYXNzJyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIENvbXBvbmVudCA9IHJlcXVpcmUoJy4uL2NvbXBvbmVudHMvY19jbGFzcycpXG4gICAgLCBCaW5kQXR0cmlidXRlID0gcmVxdWlyZSgnLi4vYXR0cmlidXRlcy9hX2JpbmQnKVxuICAgICwgYmluZGVyID0gcmVxdWlyZSgnLi4vYmluZGVyJylcbiAgICAsIGRvbVV0aWxzID0gcmVxdWlyZSgnLi9kb20nKVxuICAgICwgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgbG9nZ2VyID0gbWlsb0NvcmUudXRpbC5sb2dnZXJcbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvO1xuXG5cbnZhciBjcmVhdGVSYW5nZVBhdGhzID0gX2NyZWF0ZU5vZGVzQW5kUGF0aHNGdW5jKGRvbVV0aWxzLnRyZWVQYXRoT2YpO1xudmFyIGNyZWF0ZVJhbmdlTm9kZXMgPSBfY3JlYXRlTm9kZXNBbmRQYXRoc0Z1bmMoZG9tVXRpbHMuZ2V0Tm9kZUF0VHJlZVBhdGgpO1xuXG5cbnZhciBmcmFnbWVudFV0aWxzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZ2V0U3RhdGU6IGZyYWdtZW50X2dldFN0YXRlLFxuICAgIGdldFN0YXRlQXN5bmM6IGZyYWdtZW50X2dldFN0YXRlQXN5bmMsXG5cbiAgICBleHBhbmRSYW5nZVRvU2libGluZ3M6IGV4cGFuZFJhbmdlVG9TaWJsaW5ncyxcbiAgICBnZXRSYW5nZVNpYmxpbmdzOiBnZXRSYW5nZVNpYmxpbmdzLFxuICAgIGNyZWF0ZVJhbmdlRnJvbVNpYmxpbmdzOiBjcmVhdGVSYW5nZUZyb21TaWJsaW5ncyxcbiAgICBjcmVhdGVSYW5nZUZyb21Ob2RlczogY3JlYXRlUmFuZ2VGcm9tU2libGluZ3MsIC8vIGFsaWFzXG4gICAgY3JlYXRlUmFuZ2VQYXRoczogY3JlYXRlUmFuZ2VQYXRocyxcbiAgICBjcmVhdGVSYW5nZU5vZGVzOiBjcmVhdGVSYW5nZU5vZGVzXG59O1xuXG5cbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGUgc3RhdGUgb2Ygd3JhcHBlZCByYW5nZSB3aXRoIGNvbXBvbmVudHMsIGluY2x1ZGluZyBwYXJ0aWFsbHkgc2VsZWN0ZWQuIFRoZSByYW5nZSB3aWxsIGJlIGNsb25lZCBhbmQgd3JhcHBlZCBpbiBjb21wb25lbnQgd2l0aCBjb250YWluZXIgZmFjZXQgYmVmb3JlIGdldHRpbmcgaXRzIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGxvZyBlcnJvciBhbmQgcmV0dXJuIHVuZGVmaW5lZCBpZiByYW5nZSBoYXMgbm8gY29tbW9uIGFuY2VzdG9yIHRoYXQgaGFzIGNvbXBvbmVudCB3aXRoIGNvbnRhaW5lciBmYWNldFxuICogXG4gKiBAcGFyYW0ge1JhbmdlfSByYW5nZSBET00gUmFuZ2UgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcmVuYW1lQ2hpbGRyZW4gb3B0aW9uYWwgcGFyYW1ldGVyLCBgdHJ1ZWAgdG8gcmVuYW1lIGZyYWdtZW50IGNoaWxkIGNvbXBvbmVudHNcbiAqIEBwYXJhbSB7U3RyaW5nfSB3cmFwcGVyQ2xhc3NOYW1lIG9wdGlvbmFsIHBhcmFtZXRlciB0byB3cmFwIGluIGEgY3VzdG9tIGNvbXBvbmVudCBjbGFzc1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBmcmFnbWVudF9nZXRTdGF0ZShyYW5nZSwgcmVuYW1lQ2hpbGRyZW4sIHdyYXBwZXJDbGFzc05hbWUpIHtcbiAgICB2YXIgcmFuZ2VDb250YWluZXIgPSBfZ2V0UmFuZ2VDb250YWluZXIocmFuZ2UpO1xuICAgIGlmICghIHJhbmdlQ29udGFpbmVyKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignZnJhZ21lbnQuZ2V0U3RhdGU6IHJhbmdlIGhhcyBubyBjb21tb24gY29udGFpbmVyJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZnJhZyA9IHJhbmdlLmNsb25lQ29udGVudHMoKVxuICAgICAgICAsIHdyYXBwZXIgPSBfd3JhcEZyYWdtZW50SW5Db250YWluZXIoZnJhZywgd3JhcHBlckNsYXNzTmFtZSk7XG5cbiAgICBfdHJhbnNmZXJTdGF0ZXMocmFuZ2VDb250YWluZXIsIHdyYXBwZXIpO1xuICAgIGlmIChyZW5hbWVDaGlsZHJlbikgX3JlbmFtZUNoaWxkcmVuKHdyYXBwZXIpO1xuICAgIHZhciB3cmFwcGVyU3RhdGUgPSB3cmFwcGVyLmdldFN0YXRlKCk7XG4gICAgXy5kZWZlck1ldGhvZCh3cmFwcGVyLCAnZGVzdHJveScpO1xuICAgIHJldHVybiB3cmFwcGVyU3RhdGU7XG59XG5cblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZSBzdGF0ZSBvZiB3cmFwcGVkIHJhbmdlIHdpdGggY29tcG9uZW50cywgaW5jbHVkaW5nIHBhcnRpYWxseSBzZWxlY3RlZC4gVGhlIHJhbmdlIHdpbGwgYmUgY2xvbmVkIGFuZCB3cmFwcGVkIGluIGNvbXBvbmVudCB3aXRoIGNvbnRhaW5lciBmYWNldCBiZWZvcmUgZ2V0dGluZyBpdHMgc3RhdGUuXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHJlc3VsdCBhbmQgYW55IGVycm9yIHZpYSBjYWxsYmFjay5cbiAqIFxuICogQHBhcmFtIHtSYW5nZX0gcmFuZ2UgRE9NIFJhbmdlIGluc3RhbmNlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHJlbmFtZUNoaWxkcmVuIG9wdGlvbmFsIHBhcmFtZXRlciwgYHRydWVgIHRvIHJlbmFtZSBmcmFnbWVudCBjaGlsZCBjb21wb25lbnRzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBhbHdheXMgdGhlIGxhc3QgcGFyYW1ldGVyLCBvcHRpb25hbCBwYXJhbWV0ZXJzIGNhbiBiZSBkcm9wcGVkOyByZXN1bHQgaXMgcGFzc2VkIHZpYSBjYWxsYmFjayB3aXRoIGFueSBlcnJvciBhcyBmaXJzdCBwYXJhbWV0ZXJcbiAqL1xuZnVuY3Rpb24gZnJhZ21lbnRfZ2V0U3RhdGVBc3luYyhyYW5nZSwgcmVuYW1lQ2hpbGRyZW4sIGNhbGxiYWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIHJhbmdlQ29udGFpbmVyID0gX2dldFJhbmdlQ29udGFpbmVyKHJhbmdlKTtcbiAgICAgICAgaWYgKCEgcmFuZ2VDb250YWluZXIpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcignZnJhZ21lbnQuZ2V0U3RhdGU6IHJhbmdlIGhhcyBubyBjb21tb24gY29udGFpbmVyJykpO1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBkbyBOT1QgY29ubmVjdCByZXR1cm4gdG8gcHJldmlvdXMgY2FsbGJhY2ssIGdldFN0YXRlIHNob3VsZCByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHJlbmFtZUNoaWxkcmVuID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gcmVuYW1lQ2hpbGRyZW47XG4gICAgICAgICAgICByZW5hbWVDaGlsZHJlbiA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZyYWcgPSByYW5nZS5jbG9uZUNvbnRlbnRzKClcbiAgICAgICAgICAgICwgd3JhcHBlciA9IF93cmFwRnJhZ21lbnRJbkNvbnRhaW5lcihmcmFnKTtcblxuICAgICAgICBfdHJhbnNmZXJTdGF0ZXMocmFuZ2VDb250YWluZXIsIHdyYXBwZXIpO1xuICAgICAgICBfLmRlZmVyKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgd3JhcHBlci5icm9hZGNhc3QoJ3N0YXRlcmVhZHknKTtcbiAgICAgICAgICAgIF8uZGVmZXIoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlbmFtZUNoaWxkcmVuKSBfcmVuYW1lQ2hpbGRyZW4od3JhcHBlcik7XG4gICAgICAgICAgICAgICAgdmFyIHdyYXBwZXJTdGF0ZSA9IHdyYXBwZXIuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICB3cmFwcGVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCB3cmFwcGVyU3RhdGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBfd3JhcEZyYWdtZW50SW5Db250YWluZXIoZnJhZywgd3JhcHBlckNsYXNzTmFtZSkge1xuICAgIHZhciB3cmFwRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgICAgICAsIGF0dHIgPSBuZXcgQmluZEF0dHJpYnV0ZSh3cmFwRWwpO1xuXG4gICAgXy5leHRlbmQoYXR0ciwge1xuICAgICAgICBjb21wQ2xhc3M6IHdyYXBwZXJDbGFzc05hbWUgfHwgJ0NvbXBvbmVudCcsXG4gICAgICAgIGNvbXBGYWNldHM6IHdyYXBwZXJDbGFzc05hbWUgPyBbXSA6IFsnY29udGFpbmVyJ10sXG4gICAgICAgIGNvbXBOYW1lOiAnd3JhcHBlcidcbiAgICB9KTtcblxuICAgIGF0dHIuZGVjb3JhdGUoKTtcblxuICAgIHdyYXBFbC5hcHBlbmRDaGlsZChmcmFnKTtcbiAgICB2YXIgc2NvcGUgPSBiaW5kZXIod3JhcEVsKTtcbiAgICByZXR1cm4gc2NvcGUud3JhcHBlcjtcbn1cblxuXG5mdW5jdGlvbiBfZ2V0UmFuZ2VDb250YWluZXIocmFuZ2UpIHtcbiAgICB2YXIgZWwgPSBkb21VdGlscy5jb250YWluaW5nRWxlbWVudChyYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcik7XG4gICAgcmV0dXJuIENvbXBvbmVudC5nZXRDb250YWluaW5nQ29tcG9uZW50KGVsLCB0cnVlLCAnY29udGFpbmVyJyk7XG59XG5cblxuZnVuY3Rpb24gX3RyYW5zZmVyU3RhdGVzKGZyb21Db21wLCB0b0NvbXApIHtcbiAgICB2YXIgZnJvbVNjb3BlID0gZnJvbUNvbXAuY29udGFpbmVyLnNjb3BlO1xuICAgIHRvQ29tcC5jb250YWluZXIuc2NvcGUuX2VhY2goZnVuY3Rpb24odG9DaGlsZENvbXAsIG5hbWUpIHtcbiAgICAgICAgdmFyIGZyb21DaGlsZENvbXAgPSBmcm9tU2NvcGVbbmFtZV07XG4gICAgICAgIGlmICghIGZyb21DaGlsZENvbXApIHJldHVybiBsb2dnZXIuZXJyb3IoJ2ZyYWdtZW50LmdldFN0YXRlOiBjb25wb25lbnQnLCBuYW1lLCAnbm90IGZvdW5kIGluIHJhbmdlJyk7XG4gICAgICAgIHZhciBzdGF0ZSA9IGZyb21DaGlsZENvbXAuX2dldFN0YXRlKHRydWUpO1xuICAgICAgICB0b0NoaWxkQ29tcC5zZXRTdGF0ZShzdGF0ZSk7XG4gICAgfSk7XG59XG5cblxuZnVuY3Rpb24gX3JlbmFtZUNoaWxkcmVuKGNvbXApIHtcbiAgICBjb21wLmNvbnRhaW5lci5zY29wZS5fZWFjaChmdW5jdGlvbihjaGlsZCkge1xuICAgICAgICBjaGlsZC5yZW5hbWUoKTtcbiAgICB9KTtcbn1cblxuXG5mdW5jdGlvbiBleHBhbmRSYW5nZVRvU2libGluZ3MocmFuZ2UpIHtcbiAgICB2YXIgc2libGluZ3MgPSBnZXRSYW5nZVNpYmxpbmdzKHJhbmdlKTtcbiAgICByYW5nZSA9IGNyZWF0ZVJhbmdlRnJvbVNpYmxpbmdzKHNpYmxpbmdzKTtcbiAgICByZXR1cm4gcmFuZ2U7XG59XG5cblxuZnVuY3Rpb24gY3JlYXRlUmFuZ2VGcm9tU2libGluZ3Mobm9kZXMpIHtcbiAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIGlmIChub2Rlcy5zaWJsaW5ncykge1xuICAgICAgICByYW5nZS5zZXRTdGFydEJlZm9yZShub2Rlcy5zdGFydCk7XG4gICAgICAgIHJhbmdlLnNldEVuZEFmdGVyKG5vZGVzLmVuZCk7XG4gICAgfSBlbHNlXG4gICAgICAgIHJhbmdlLnNlbGVjdE5vZGUobm9kZXMuc3RhcnQpO1xuICAgIHJldHVybiByYW5nZTtcbn1cblxuXG5mdW5jdGlvbiBnZXRSYW5nZVNpYmxpbmdzKHJhbmdlKSB7XG4gICAgdmFyIGNvbnRhaW5lck5vZGUgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lclxuICAgICAgICAsIHN0YXJ0Tm9kZSA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyXG4gICAgICAgICwgZW5kTm9kZSA9IHJhbmdlLmVuZENvbnRhaW5lcjtcblxuICAgIGlmIChzdGFydE5vZGUgPT0gZW5kTm9kZSkge1xuICAgICAgICBpZiAoc3RhcnROb2RlICE9IGNvbnRhaW5lck5vZGUpIGxvZ2dlci5lcnJvcignZGVsZXRlU2VsZWN0aW9uQ29tbWFuZCBsb2dpY2FsIGVycm9yOiBzdGFydD09ZW5kLCBidXQgY29udGFpbmVyIGlzIGRpZmZlcmVudCcpO1xuICAgICAgICByZXR1cm4geyBzaWJsaW5nczogZmFsc2UsIHN0YXJ0OiBzdGFydE5vZGUgfTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnROb2RlID09IGNvbnRhaW5lck5vZGUgfHwgZW5kTm9kZSA9PSBjb250YWluZXJOb2RlKVxuICAgICAgICByZXR1cm4geyBzaWJsaW5nczogZmFsc2UsIHN0YXJ0OiBjb250YWluZXJOb2RlIH07XG5cbiAgICB2YXIgc3RhcnRTaWJsaW5nID0gX2ZpbmRDb250YWluaW5nQ2hpbGQoY29udGFpbmVyTm9kZSwgc3RhcnROb2RlKTtcbiAgICB2YXIgZW5kU2libGluZyA9IF9maW5kQ29udGFpbmluZ0NoaWxkKGNvbnRhaW5lck5vZGUsIGVuZE5vZGUpO1xuXG4gICAgaWYgKHN0YXJ0U2libGluZyAmJiBlbmRTaWJsaW5nKSB7XG4gICAgICAgIGlmIChzdGFydFNpYmxpbmcgPT0gZW5kU2libGluZykge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdkZWxldGVTZWxlY3Rpb25Db21tYW5kIGxvZ2ljYWwgZXJyb3I6IHNhbWUgc2libGluZ3MnKTtcbiAgICAgICAgICAgIHJldHVybiB7IHNpYmxpbmdzOiBmYWxzZSwgc3RhcnQ6IHN0YXJ0U2libGluZyB9O1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIHJldHVybiB7IHNpYmxpbmdzOiB0cnVlLCBzdGFydDogc3RhcnRTaWJsaW5nLCBlbmQ6IGVuZFNpYmxpbmcgfTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gX2ZpbmRDb250YWluaW5nQ2hpbGQoY29udGFpbmVyTm9kZSwgc2VsTm9kZSkge1xuICAgIHJldHVybiBfLmZpbmQoY29udGFpbmVyTm9kZS5jaGlsZE5vZGVzLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmNvbnRhaW5zKHNlbE5vZGUpO1xuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIF9jcmVhdGVOb2Rlc0FuZFBhdGhzRnVuYyhmdW5jKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHJvb3RFbCwgZnJvbU9iaikge1xuICAgICAgICB2YXIgdG9PYmogPSB7XG4gICAgICAgICAgICBzaWJsaW5nczogZnJvbU9iai5zaWJsaW5ncyxcbiAgICAgICAgICAgIHN0YXJ0OiBmdW5jKHJvb3RFbCwgZnJvbU9iai5zdGFydClcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRvT2JqLnNpYmxpbmdzKVxuICAgICAgICAgICAgdG9PYmouZW5kID0gZnVuYyhyb290RWwsIGZyb21PYmouZW5kKTtcbiAgICAgICAgcmV0dXJuIHRvT2JqO1xuICAgIH07XG59XG5cblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgZGVwcmVjYXRlID0gcmVxdWlyZSgnLi9kZXByZWNhdGUnKTtcblxuLyoqXG4gKiBgbWlsby51dGlsYFxuICovXG52YXIgdXRpbCA9IHtcbiAgICBsb2dnZXI6IG1pbG9Db3JlLnV0aWwubG9nZ2VyLFxuICAgIHJlcXVlc3Q6IHJlcXVpcmUoJy4vcmVxdWVzdCcpLFxuICAgIHdlYnNvY2tldDogcmVxdWlyZSgnLi93ZWJzb2NrZXQnKSxcbiAgICBjaGVjazogbWlsb0NvcmUudXRpbC5jaGVjayxcbiAgICBlcnJvcjogZGVwcmVjYXRlKHJlcXVpcmUoJy4vZXJyb3InKSwgJ21pbG8udXRpbC5lcnJvciBpcyBERVBSRUNBVEVEIGFuZCB3aWxsIGJlIFJFTU9WRUQgc29vbiEnKSxcbiAgICBjb3VudDogZGVwcmVjYXRlKHJlcXVpcmUoJy4vdW5pcXVlX2lkJyksICdtaWxvLnV0aWwuY291bnQgaXMgREVQUkVDQVRFRCEgVXNlIG1pbG8udXRpbC51bmlxdWVJZCBpbnN0ZWFkJyksXG4gICAgdW5pcXVlSWQ6IHJlcXVpcmUoJy4vdW5pcXVlX2lkJyksXG4gICAgY29tcG9uZW50TmFtZTogcmVxdWlyZSgnLi9jb21wb25lbnRfbmFtZScpLFxuICAgIGRvbTogcmVxdWlyZSgnLi9kb20nKSxcbiAgICBkb21MaXN0ZW5lcnM6IHJlcXVpcmUoJy4vZG9tX2xpc3RlbmVycycpLFxuICAgIHNlbGVjdGlvbjogcmVxdWlyZSgnLi9zZWxlY3Rpb24nKSxcbiAgICBmcmFnbWVudDogcmVxdWlyZSgnLi9mcmFnbWVudCcpLFxuICAgIGpzb25QYXJzZTogZGVwcmVjYXRlKHJlcXVpcmUoJy4vanNvbl9wYXJzZScpLCAnbWlsby51dGlsLmpzb25QYXJzZSBpcyBERVBSRUNBVEVEISBVc2UgXy5qc29uUGFyc2UgaW5zdGVhZCcpLFxuICAgIHN0b3JhZ2U6IHJlcXVpcmUoJy4vc3RvcmFnZScpLFxuICAgIGRvbVJlYWR5OiByZXF1aXJlKCcuL2RvbXJlYWR5JyksXG4gICAgZHJhZ0Ryb3A6IHJlcXVpcmUoJy4vZHJhZ2Ryb3AnKSxcbiAgICBkaWFsb2c6IGRlcHJlY2F0ZShyZXF1aXJlKCcuLi9jb21wb25lbnRzL3VpL2Jvb3RzdHJhcC9EaWFsb2cnKSxcbiAgICAgICAgJ21pbG8udXRpbC5kaWFsb2cgaXMgREVQUkVDQVRFRCEgVXNlIG1pbG8ucmVnaXN0cnkuY29tcG9uZW50cy5nZXQoXFwnTUxEaWFsb2dcXCcpIGluc3RlYWQnKSxcbiAgICBhbGVydDogZGVwcmVjYXRlKHJlcXVpcmUoJy4uL2NvbXBvbmVudHMvdWkvYm9vdHN0cmFwL0FsZXJ0JyksXG4gICAgICAgICdtaWxvLnV0aWwuYWxlcnQgaXMgREVQUkVDQVRFRCEgVXNlIG1pbG8ucmVnaXN0cnkuY29tcG9uZW50cy5nZXQoXFwnTUxBbGVydFxcJykgaW5zdGVhZCcpLFxuICAgIGRlcHJlY2F0ZTogZGVwcmVjYXRlLFxuICAgIGRvVDogbWlsb0NvcmUudXRpbC5kb1QsXG4gICAgZGVzdHJveTogdXRpbF9kZXN0cm95XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHV0aWw7XG5cblxuZnVuY3Rpb24gdXRpbF9kZXN0cm95KCkge1xuICAgIHV0aWwucmVxdWVzdC5kZXN0cm95KCk7XG4gICAgdXRpbC5kcmFnRHJvcC5kZXN0cm95KCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBqc29uUGFyc2U7XG5cblxuLyoqXG4gKiBgbWlsby51dGlsLmpzb25QYXJzZWBcbiAqIFNhZmUgSlNPTi5wYXJzZSwgcmV0dXJucyB1bmRlZmluZWQgaWYgSlNPTi5wYXJzZSB0aHJvd3MgYW4gZXhjZXB0aW9uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciAtIEpTT04gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIG9iamVjdFxuICogQHJldHVybiB7T2JqZWN0fHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24ganNvblBhcnNlKHN0cikge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHN0cik7XG4gICAgfSBjYXRjaCAoZSkge31cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gbWlsby51dGlscy5yZXF1ZXN0XG4vLyAtLS0tLS0tLS0tLVxuXG4vLyBDb252ZW5pZW5jZSBmdW5jdGlvbnMgd3JhcHBpbmcgWE1MSFRUUFJlcXVlc3QgZnVuY3Rpb25hbGl0eS5cblxuLy8gYGBgXG4vLyB2YXIgcmVxdWVzdCA9IG1pbG8udXRpbHMucmVxdWVzdFxuLy8gICAgICwgb3B0czogeyBtZXRob2Q6ICdHRVQnIH07XG5cbi8vIHJlcXVlc3QodXJsLCBvcHRzLCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbi8vICAgICBsb2dnZXIuZGVidWcoZGF0YSk7XG4vLyB9KTtcblxuLy8gcmVxdWVzdC5nZXQodXJsLCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbi8vICAgICBsb2dnZXIuZGVidWcoZGF0YSk7XG4vLyB9KTtcbi8vIGBgYFxuXG4vLyBPbmx5IGdlbmVyaWMgcmVxdWVzdCBhbmQgZ2V0LCBqc29uLCBwb3N0IGNvbnZlbmllbmNlIG1ldGhvZHMgYXJlIGN1cnJlbnRseSBpbXBsZW1lbnRlZC5cblxuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCB1bmlxdWVJZCA9IHJlcXVpcmUoJy4vdW5pcXVlX2lkJylcbiAgICAsIGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgTWVzc2VuZ2VyID0gbWlsb0NvcmUuTWVzc2VuZ2VyO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVlc3Q7XG5cblxudmFyIF9wZW5kaW5nUmVxdWVzdHMgPSBbXTtcblxudmFyIHByb21pc2VUaGVuID0gY3JlYXRlUHJvbWlzZU92ZXJyaWRlKCd0aGVuJyk7XG52YXIgcHJvbWlzZUNhdGNoID0gY3JlYXRlUHJvbWlzZU92ZXJyaWRlKCdjYXRjaCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB3aGljaCBpcyB1c2VkIHRvIG92ZXJyaWRlIHN0YW5kYXJkIHByb21pc2UgYmVoYXZpb3VyIGFuZCBhbGxvdyBwcm9taXNlIGluc3RhbmNlc1xuICogY3JlYXRlZCB0byBtYWludGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgcmVxdWVzdCBvYmplY3Qgbm8gbWF0dGVyIGlmIC50aGVuKCkgb3IgLmNhdGNoKCkgaXMgY2FsbGVkLlxuICovXG5mdW5jdGlvbiBjcmVhdGVQcm9taXNlT3ZlcnJpZGUoZnVuY3Rpb25OYW1lKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgcHJvbWlzZSA9IFByb21pc2UucHJvdG90eXBlW2Z1bmN0aW9uTmFtZV0uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAga2VlcFJlcXVlc3RPYmplY3QocHJvbWlzZSwgdGhpcy5fcmVxdWVzdCk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiByZXF1ZXN0KHVybCwgb3B0cywgY2FsbGJhY2spIHtcbiAgICBvcHRzLnVybCA9IHVybDtcbiAgICBvcHRzLmNvbnRlbnRUeXBlID0gb3B0cy5jb250ZW50VHlwZSB8fCAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JztcbiAgICBpZiAoX21lc3NlbmdlcikgcmVxdWVzdC5wb3N0TWVzc2FnZVN5bmMoJ3JlcXVlc3QnLCB7IG9wdGlvbnM6IG9wdHMgfSk7XG5cbiAgICB2YXIgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgcmVxLm9wZW4ob3B0cy5tZXRob2QsIG9wdHMudXJsLCB0cnVlKTtcbiAgICByZXEuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgb3B0cy5jb250ZW50VHlwZSk7XG4gICAgc2V0UmVxdWVzdEhlYWRlcnMocmVxLCBvcHRzLmhlYWRlcnMpO1xuXG4gICAgcmVxLnRpbWVvdXQgPSBvcHRzLnRpbWVvdXQgfHwgY29uZmlnLnJlcXVlc3QuZGVmYXVsdHMudGltZW91dDtcbiAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gcmVxLm9udGltZW91dCA9IHJlcS5vbmFib3J0ID0gb25SZWFkeTtcblxuICAgIHZhciB4UHJvbWlzZSA9IF9jcmVhdGVYUHJvbWlzZShyZXEpO1xuXG4gICAgcmVxLnNlbmQoSlNPTi5zdHJpbmdpZnkob3B0cy5kYXRhKSk7XG4gICAgcmVxW2NvbmZpZy5yZXF1ZXN0Lm9wdGlvbnNLZXldID0gb3B0cztcblxuICAgIF9wZW5kaW5nUmVxdWVzdHMucHVzaChyZXEpO1xuXG4gICAgcmV0dXJuIHhQcm9taXNlLnByb21pc2U7XG5cbiAgICBmdW5jdGlvbiBvblJlYWR5KGUpIHtcbiAgICAgICAgX29uUmVhZHkocmVxLCBjYWxsYmFjaywgeFByb21pc2UsIGUudHlwZSk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIF9jcmVhdGVYUHJvbWlzZShyZXF1ZXN0KSB7XG4gICAgdmFyIHJlc29sdmVQcm9taXNlLCByZWplY3RQcm9taXNlO1xuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcbiAgICAgICAgcmVqZWN0UHJvbWlzZSA9IHJlamVjdDtcbiAgICB9KTtcblxuICAgIGtlZXBSZXF1ZXN0T2JqZWN0KHByb21pc2UsIHJlcXVlc3QpO1xuICAgIHByb21pc2UuY2F0Y2goXy5ub29wKTsgLy8gU29tZXRpbWVzIGVycm9ycyBhcmUgaGFuZGxlZCB3aXRoaW4gY2FsbGJhY2tzLCBzbyB1bmNhdWdodCBwcm9taXNlIGVycm9yIG1lc3NhZ2Ugc2hvdWxkIGJlIHN1cHByZXNzZWQuXG5cbiAgICByZXR1cm4ge1xuICAgICAgICBwcm9taXNlOiBwcm9taXNlLFxuICAgICAgICByZXNvbHZlOiByZXNvbHZlUHJvbWlzZSxcbiAgICAgICAgcmVqZWN0OiByZWplY3RQcm9taXNlXG4gICAgfVxufVxuXG4vLyBFbnN1cmVzIHRoYXQgdGhlIHByb21pc2UgKGFuZCBhbnkgcHJvbWlzZXMgY3JlYXRlZCB3aGVuIGNhbGxpbmcgLnRoZW4vLmNhdGNoKSBoYXMgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHJlcXVlc3Qgb2JqZWN0XG5mdW5jdGlvbiBrZWVwUmVxdWVzdE9iamVjdChwcm9taXNlLCByZXF1ZXN0KSB7XG4gICAgcHJvbWlzZS5fcmVxdWVzdCA9IHJlcXVlc3Q7XG4gICAgcHJvbWlzZS50aGVuID0gcHJvbWlzZVRoZW47XG4gICAgcHJvbWlzZS5jYXRjaCA9IHByb21pc2VDYXRjaDtcblxuICAgIHJldHVybiBwcm9taXNlO1xufVxuXG5cbmZ1bmN0aW9uIHNldFJlcXVlc3RIZWFkZXJzKHJlcSwgaGVhZGVycykge1xuICAgIGlmIChoZWFkZXJzKVxuICAgICAgICBfLmVhY2hLZXkoaGVhZGVycywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICAgICAgcmVxLnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0pO1xufVxuXG5mdW5jdGlvbiBfb25SZWFkeShyZXEsIGNhbGxiYWNrLCB4UHJvbWlzZSwgZXZlbnRUeXBlKSB7XG4gICAgaWYgKHJlcS5yZWFkeVN0YXRlICE9IDQpIHJldHVybjtcbiAgICBpZiAoIXJlcS5zdGF0dXMgJiYgZXZlbnRUeXBlID09ICdyZWFkeXN0YXRlY2hhbmdlJykgcmV0dXJuO1xuXG4gICAgXy5zcGxpY2VJdGVtKF9wZW5kaW5nUmVxdWVzdHMsIHJlcSk7XG5cbiAgICB2YXIgZXJyb3I7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKCByZXEuc3RhdHVzID49IDIwMCAmJiByZXEuc3RhdHVzIDwgNDAwICkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSgnc3VjY2VzcycpO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKG51bGwsIHJlcS5yZXNwb25zZVRleHQsIHJlcSk7XG4gICAgICAgICAgICB9IGNhdGNoKGUpIHsgZXJyb3IgPSBlOyB9XG4gICAgICAgICAgICB4UHJvbWlzZS5yZXNvbHZlKHJlcS5yZXNwb25zZVRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGVycm9yUmVhc29uID0gcmVxLnN0YXR1cyB8fCBldmVudFR5cGU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKCdlcnJvcicpO1xuICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKCdlcnJvcicgKyBlcnJvclJlYXNvbik7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soZXJyb3JSZWFzb24sIHJlcS5yZXNwb25zZVRleHQsIHJlcSk7XG4gICAgICAgICAgICB9IGNhdGNoKGUpIHsgZXJyb3IgPSBlOyB9XG4gICAgICAgICAgICB4UHJvbWlzZS5yZWplY3QoeyByZWFzb246IGVycm9yUmVhc29uLCByZXNwb25zZTogcmVxLnJlc3BvbnNlVGV4dCB9KTtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2goZSkge1xuICAgICAgICBlcnJvciA9IGVycm9yIHx8IGU7XG4gICAgfVxuXG4gICAgLy8gbm90IHJlbW92aW5nIHN1YnNjcmlwdGlvbiBjcmVhdGVzIG1lbW9yeSBsZWFrLCBkZWxldGluZyBwcm9wZXJ0eSB3b3VsZCBub3QgcmVtb3ZlIHN1YnNjcmlwdGlvblxuICAgIHJlcS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSByZXEub250aW1lb3V0ID0gcmVxLm9uYWJvcnQgPSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIV9wZW5kaW5nUmVxdWVzdHMubGVuZ3RoKVxuICAgICAgICBwb3N0TWVzc2FnZSgncmVxdWVzdHNjb21wbGV0ZWQnKTtcblxuICAgIGlmIChlcnJvcikgdGhyb3cgbmV3IEVycm9yKCdFeGNlcHRpb246ICcgKyBlcnJvcik7XG5cbiAgICBmdW5jdGlvbiBwb3N0TWVzc2FnZShtc2cpIHtcbiAgICAgICAgaWYgKF9tZXNzZW5nZXIpIHJlcXVlc3QucG9zdE1lc3NhZ2UobXNnLFxuICAgICAgICAgICAgeyBzdGF0dXM6IHN0YXR1cywgcmVzcG9uc2U6IHJlcS5yZXNwb25zZVRleHQgfSk7XG4gICAgfVxufVxuXG5cbl8uZXh0ZW5kKHJlcXVlc3QsIHtcbiAgICBnZXQ6IHJlcXVlc3QkZ2V0LFxuICAgIHBvc3Q6IHJlcXVlc3QkcG9zdCxcbiAgICBqc29uOiByZXF1ZXN0JGpzb24sXG4gICAganNvbnA6IHJlcXVlc3QkanNvbnAsXG4gICAgZmlsZTogcmVxdWVzdCRmaWxlLFxuICAgIHVzZU1lc3NlbmdlcjogcmVxdWVzdCR1c2VNZXNzZW5nZXIsXG4gICAgZGVzdHJveTogcmVxdWVzdCRkZXN0cm95LFxuICAgIHdoZW5SZXF1ZXN0c0NvbXBsZXRlZDogd2hlblJlcXVlc3RzQ29tcGxldGVkXG59KTtcblxuXG52YXIgX21lc3NlbmdlcjtcblxuXG5mdW5jdGlvbiByZXF1ZXN0JHVzZU1lc3NlbmdlcigpIHtcbiAgICBfbWVzc2VuZ2VyID0gbmV3IE1lc3NlbmdlcihyZXF1ZXN0LCBbJ29uJywgJ29uY2UnLCAnb25TeW5jJywgJ29mZicsICdvbk1lc3NhZ2VzJywgJ29mZk1lc3NhZ2VzJywgJ3Bvc3RNZXNzYWdlJywgJ3Bvc3RNZXNzYWdlU3luYyddKTtcbn1cblxuXG5mdW5jdGlvbiByZXF1ZXN0JGdldCh1cmwsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHJlcXVlc3QodXJsLCB7IG1ldGhvZDogJ0dFVCcgfSwgY2FsbGJhY2spO1xufVxuXG5cbmZ1bmN0aW9uIHJlcXVlc3QkcG9zdCh1cmwsIGRhdGEsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHJlcXVlc3QodXJsLCB7IG1ldGhvZDogJ1BPU1QnLCBkYXRhOiBkYXRhIH0sIGNhbGxiYWNrKTtcbn1cblxuXG5mdW5jdGlvbiByZXF1ZXN0JGpzb24odXJsLCBjYWxsYmFjaykge1xuICAgIHZhciBwcm9taXNlID0gcmVxdWVzdCh1cmwsIHsgbWV0aG9kOiAnR0VUJyB9KTtcblxuICAgIHZhciBqc29uUHJvbWlzZSA9IHByb21pc2UudGhlbihKU09OLnBhcnNlKTtcblxuICAgIGlmIChjYWxsYmFjaylcbiAgICAgICAganNvblByb21pc2VcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKGVyckRhdGEpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVyckRhdGEucmVhc29uLCBlcnJEYXRhLnJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4ganNvblByb21pc2U7XG59XG5cblxudmFyIGpzb25wT3B0aW9ucyA9IHsgbWV0aG9kOiAnR0VUJywganNvbnA6IHRydWUgfTtcbmZ1bmN0aW9uIHJlcXVlc3QkanNvbnAodXJsLCBjYWxsYmFjaykge1xuICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKSxcbiAgICAgICAgeFByb21pc2UgPSBfY3JlYXRlWFByb21pc2Uoc2NyaXB0KSxcbiAgICAgICAgaGVhZCA9IHdpbmRvdy5kb2N1bWVudC5oZWFkLFxuICAgICAgICB1bmlxdWVDYWxsYmFjayA9IGNvbmZpZy5yZXF1ZXN0Lmpzb25wQ2FsbGJhY2tQcmVmaXggKyB1bmlxdWVJZCgpO1xuXG4gICAgdmFyIG9wdHMgPSBfLmV4dGVuZCh7IHVybDogdXJsIH0sIGpzb25wT3B0aW9ucyk7XG4gICAgaWYgKF9tZXNzZW5nZXIpIHJlcXVlc3QucG9zdE1lc3NhZ2VTeW5jKCdyZXF1ZXN0JywgeyBvcHRpb25zOiBvcHRzIH0pO1xuXG4gICAgaWYgKCEgXy5pc0VxdWFsKF8ub21pdEtleXMob3B0cywgJ3VybCcpLCBqc29ucE9wdGlvbnMpKVxuICAgICAgICBsb2dnZXIud2FybignSWdub3JlZCBub3QgYWxsb3dlZCByZXF1ZXN0IG9wdGlvbnMgY2hhbmdlIGluIEpTT05QIHJlcXVlc3QgLSBvbmx5IFVSTCBjYW4gYmUgY2hhbmdlZCcpO1xuXG4gICAgdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdObyBKU09OUCByZXNwb25zZSBvciBubyBjYWxsYmFjayBpbiByZXNwb25zZScpO1xuICAgICAgICBfb25SZXN1bHQoZXJyKTtcbiAgICB9LCBjb25maWcucmVxdWVzdC5qc29ucFRpbWVvdXQpO1xuXG4gICAgd2luZG93W3VuaXF1ZUNhbGxiYWNrXSA9IF8ucGFydGlhbChfb25SZXN1bHQsIG51bGwpO1xuXG4gICAgX3BlbmRpbmdSZXF1ZXN0cy5wdXNoKHdpbmRvd1t1bmlxdWVDYWxsYmFja10pO1xuXG4gICAgc2NyaXB0LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JztcbiAgICBzY3JpcHQuc3JjID0gb3B0cy51cmwgKyAob3B0cy51cmwuaW5kZXhPZignPycpID09IC0xID8gJz8nIDogJyYnKSArICdjYWxsYmFjaz0nICsgdW5pcXVlQ2FsbGJhY2s7XG5cbiAgICBoZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG5cbiAgICByZXR1cm4geFByb21pc2UucHJvbWlzZTtcblxuXG4gICAgZnVuY3Rpb24gX29uUmVzdWx0KGVyciwgcmVzdWx0KSB7XG4gICAgICAgIF8uc3BsaWNlSXRlbShfcGVuZGluZ1JlcXVlc3RzLCB3aW5kb3dbdW5pcXVlQ2FsbGJhY2tdKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBvc3RNZXNzYWdlKGVyciA/ICdlcnJvcicgOiAnc3VjY2VzcycsIGVyciwgcmVzdWx0KTtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ05vIEpTT05QIHJlc3BvbnNlIG9yIHRpbWVvdXQnKTtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSgnZXJyb3Jqc29ucHRpbWVvdXQnLCBlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soZXJyLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoKGUpIHsgdmFyIGVycm9yID0gZTsgfVxuICAgICAgICBpZiAoZXJyKSB4UHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgZWxzZSB4UHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG5cbiAgICAgICAgY2xlYW5VcCgpO1xuICAgICAgICBpZiAoIV9wZW5kaW5nUmVxdWVzdHMubGVuZ3RoKVxuICAgICAgICAgICAgcG9zdE1lc3NhZ2UoJ3JlcXVlc3RzY29tcGxldGVkJyk7XG5cbiAgICAgICAgaWYgKGVycm9yKSB0aHJvdyBlcnJvcjtcbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgaGVhZC5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgICAgICBkZWxldGUgd2luZG93W3VuaXF1ZUNhbGxiYWNrXTtcbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIHBvc3RNZXNzYWdlKG1zZywgc3RhdHVzLCByZXN1bHQpIHtcbiAgICAgICAgaWYgKF9tZXNzZW5nZXIpIHJlcXVlc3QucG9zdE1lc3NhZ2UobXNnLFxuICAgICAgICAgICAgeyBzdGF0dXM6IHN0YXR1cywgcmVzcG9uc2U6IHJlc3VsdCB9KTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gcmVxdWVzdCRmaWxlKG9wdHMsIGZpbGVEYXRhLCBjYWxsYmFjaywgcHJvZ3Jlc3MpIHtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT0gJ3N0cmluZycpXG4gICAgICAgIG9wdHMgPSB7IG1ldGhvZDogJ1BPU1QnLCB1cmw6IG9wdHMgfTtcblxuICAgIG9wdHMubWV0aG9kID0gb3B0cy5tZXRob2QgfHwgJ1BPU1QnO1xuICAgIG9wdHMuZmlsZSA9IHRydWU7XG5cbiAgICBpZiAoX21lc3NlbmdlcikgcmVxdWVzdC5wb3N0TWVzc2FnZVN5bmMoJ3JlcXVlc3QnLCB7IG9wdGlvbnM6IG9wdHMgfSk7XG5cbiAgICB2YXIgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgaWYgKHByb2dyZXNzKSByZXEudXBsb2FkLm9ucHJvZ3Jlc3MgPSBwcm9ncmVzcztcblxuICAgIHJlcS5vcGVuKG9wdHMubWV0aG9kLCBvcHRzLnVybCwgdHJ1ZSk7XG4gICAgc2V0UmVxdWVzdEhlYWRlcnMocmVxLCBvcHRzLmhlYWRlcnMpO1xuXG4gICAgcmVxLnRpbWVvdXQgPSBvcHRzLnRpbWVvdXQgfHwgY29uZmlnLnJlcXVlc3QuZGVmYXVsdHMudGltZW91dDtcbiAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gcmVxLm9udGltZW91dCA9IHJlcS5vbmFib3J0ID0gb25SZWFkeTtcblxuICAgIHZhciB4UHJvbWlzZSA9IF9jcmVhdGVYUHJvbWlzZShyZXEpO1xuXG4gICAgaWYgKG9wdHMuYmluYXJ5KVxuICAgICAgICByZXEuc2VuZChmaWxlRGF0YSk7XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlRGF0YSk7XG4gICAgICAgIHJlcS5zZW5kKGZvcm1EYXRhKTtcbiAgICB9XG5cbiAgICBfcGVuZGluZ1JlcXVlc3RzLnB1c2gocmVxKTtcblxuICAgIHJldHVybiB4UHJvbWlzZS5wcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gb25SZWFkeShlKSB7XG4gICAgICAgIGlmIChwcm9ncmVzcykgcmVxLnVwbG9hZC5vbnByb2dyZXNzID0gdW5kZWZpbmVkO1xuICAgICAgICBfb25SZWFkeShyZXEsIGNhbGxiYWNrLCB4UHJvbWlzZSwgZS50eXBlKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gcmVxdWVzdCRkZXN0cm95KCkge1xuICAgIGlmIChfbWVzc2VuZ2VyKSBfbWVzc2VuZ2VyLmRlc3Ryb3koKTtcbiAgICByZXF1ZXN0Ll9kZXN0cm95ZWQgPSB0cnVlO1xufVxuXG5cbmZ1bmN0aW9uIHdoZW5SZXF1ZXN0c0NvbXBsZXRlZChjYWxsYmFjaywgdGltZW91dCkge1xuICAgIGNhbGxiYWNrID0gXy5vbmNlKGNhbGxiYWNrKTtcbiAgICBpZiAodGltZW91dClcbiAgICAgICAgXy5kZWxheShjYWxsYmFjaywgdGltZW91dCwgJ3RpbWVvdXQnKTtcblxuICAgIGlmIChfcGVuZGluZ1JlcXVlc3RzLmxlbmd0aClcbiAgICAgICAgX21lc3Nlbmdlci5vbmNlKCdyZXF1ZXN0c2NvbXBsZXRlZCcsIGNhbGxiYWNrKTtcbiAgICBlbHNlXG4gICAgICAgIF8uZGVmZXIoY2FsbGJhY2spO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBkb21VdGlscyA9IHJlcXVpcmUoJy4uL2RvbScpXG4gICAgLCBjb250YWluaW5nRWxlbWVudCA9IGRvbVV0aWxzLmNvbnRhaW5pbmdFbGVtZW50XG4gICAgLCBzZXRDYXJldFBvc2l0aW9uID0gZG9tVXRpbHMuc2V0Q2FyZXRQb3NpdGlvblxuICAgICwgZ2V0Q29tcG9uZW50c0Zyb21SYW5nZSA9IGRvbVV0aWxzLmdldENvbXBvbmVudHNGcm9tUmFuZ2VcbiAgICAsIGRlbGV0ZVJhbmdlV2l0aENvbXBvbmVudHMgPSBkb21VdGlscy5kZWxldGVSYW5nZVdpdGhDb21wb25lbnRzXG4gICAgLCBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgQ29tcG9uZW50ID0gcmVxdWlyZSgnLi4vLi4vY29tcG9uZW50cy9jX2NsYXNzJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90bztcblxubW9kdWxlLmV4cG9ydHMgPSBUZXh0U2VsZWN0aW9uO1xuXG5cbi8qKlxuICogVGV4dCBzZWxlY3Rpb24gY2xhc3MuXG4gKiBTZXJ2ZXMgYXMgYSBoZWxwZXIgdG8gbWFuYWdlIGN1cnJlbnQgc2VsZWN0aW9uXG4gKiBUaGUgb2JqZWN0IGNhbm5vdCBiZSByZXVzZWQsIGlmIHRoZSBzZWxlY3Rpb24gY2hhbmdlcyBzb21lIG9mIGl0cyBwcm9wZXJ0aWVzIG1heSBjb250YWluIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gcHJldmlvdXMgc2VsZWN0aW9uXG4gKlxuICogQHBhcmFtIHtXaW5kb3d9IHdpbiB3aW5kb3cgaW4gd2hpY2ggdGV4dCBzZWxlY3Rpb24gaXMgcHJvY2Vzc2VkXG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24od2luKSB7XG4gICAgaWYgKCEgdGhpcyBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24pXG4gICAgICAgIHJldHVybiBuZXcgVGV4dFNlbGVjdGlvbih3aW4pO1xuICAgIHRoaXMud2luZG93ID0gd2luIHx8IHdpbmRvdztcbiAgICB0aGlzLmluaXQoKTtcbn1cblxuXG4vKipcbiAqIFRleHRTZWxlY3Rpb24gaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHNlbGVjdGlvbiBzdGFydCBlbGVtZW50XG4gKlxuICogQHJldHVybiB7RWxlbWVudHxudWxsfVxuICovXG52YXIgVGV4dFNlbGVjdGlvbiRzdGFydEVsZW1lbnQgPSBcbiAgICBfLnBhcnRpYWwoX2dldEVsZW1lbnQsICdfc3RhcnRFbGVtZW50JywgJ3N0YXJ0Q29udGFpbmVyJyk7XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyBzZWxlY3Rpb24gZW5kIGVsZW1lbnRcbiAqXG4gKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9XG4gKi9cbnZhciBUZXh0U2VsZWN0aW9uJGVuZEVsZW1lbnQgPSBcbiAgICBfLnBhcnRpYWwoX2dldEVsZW1lbnQsICdfZW5kRWxlbWVudCcsICdlbmRDb250YWluZXInKTtcblxuXG4vKipcbiAqIFRleHRTZWxlY3Rpb24gaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHNlbGVjdGlvbiBlbmQgZWxlbWVudFxuICpcbiAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAqL1xudmFyIFRleHRTZWxlY3Rpb24kY29udGFpbmluZ0VsZW1lbnQgPSBcbiAgICBfLnBhcnRpYWwoX2dldEVsZW1lbnQsICdfY29udGFpbmluZ0VsZW1lbnQnLCAnY29tbW9uQW5jZXN0b3JDb250YWluZXInKTtcblxuXG4vKipcbiAqIFRleHRTZWxlY3Rpb24gaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHNlbGVjdGlvbiBzdGFydCBDb21wb25lbnRcbiAqXG4gKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gKi9cbnZhciBUZXh0U2VsZWN0aW9uJHN0YXJ0Q29tcG9uZW50ID0gXG4gICAgXy5wYXJ0aWFsKF9nZXRDb21wb25lbnQsICdfc3RhcnRDb21wb25lbnQnLCAnc3RhcnRFbGVtZW50Jyk7XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyBzZWxlY3Rpb24gZW5kIENvbXBvbmVudFxuICpcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xudmFyIFRleHRTZWxlY3Rpb24kZW5kQ29tcG9uZW50ID0gXG4gICAgXy5wYXJ0aWFsKF9nZXRDb21wb25lbnQsICdfZW5kQ29tcG9uZW50JywgJ2VuZEVsZW1lbnQnKTtcblxuXG4vKipcbiAqIFRleHRTZWxlY3Rpb24gaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHNlbGVjdGlvbiBlbmQgQ29tcG9uZW50XG4gKlxuICogQHJldHVybiB7Q29tcG9uZW50fVxuICovXG52YXIgVGV4dFNlbGVjdGlvbiRjb250YWluaW5nQ29tcG9uZW50ID0gXG4gICAgXy5wYXJ0aWFsKF9nZXRDb21wb25lbnQsICdfY29udGFpbmluZ0NvbXBvbmVudCcsICdjb250YWluaW5nRWxlbWVudCcpO1xuXG5cbl8uZXh0ZW5kUHJvdG8oVGV4dFNlbGVjdGlvbiwge1xuICAgIGluaXQ6IFRleHRTZWxlY3Rpb24kaW5pdCxcbiAgICB0ZXh0OiBUZXh0U2VsZWN0aW9uJHRleHQsXG4gICAgdGV4dE5vZGVzOiBUZXh0U2VsZWN0aW9uJHRleHROb2RlcyxcbiAgICBjbGVhcjogVGV4dFNlbGVjdGlvbiRjbGVhcixcblxuICAgIHN0YXJ0RWxlbWVudDogVGV4dFNlbGVjdGlvbiRzdGFydEVsZW1lbnQsXG4gICAgZW5kRWxlbWVudDogVGV4dFNlbGVjdGlvbiRlbmRFbGVtZW50LFxuICAgIGNvbnRhaW5pbmdFbGVtZW50OiBUZXh0U2VsZWN0aW9uJGNvbnRhaW5pbmdFbGVtZW50LFxuXG4gICAgc3RhcnRDb21wb25lbnQ6IFRleHRTZWxlY3Rpb24kc3RhcnRDb21wb25lbnQsXG4gICAgZW5kQ29tcG9uZW50OiBUZXh0U2VsZWN0aW9uJGVuZENvbXBvbmVudCxcbiAgICBjb250YWluaW5nQ29tcG9uZW50OiBUZXh0U2VsZWN0aW9uJGNvbnRhaW5pbmdDb21wb25lbnQsXG5cbiAgICBjb250YWluZWRDb21wb25lbnRzOiBUZXh0U2VsZWN0aW9uJGNvbnRhaW5lZENvbXBvbmVudHMsXG4gICAgZWFjaENvbnRhaW5lZENvbXBvbmVudDogVGV4dFNlbGVjdGlvbiRlYWNoQ29udGFpbmVkQ29tcG9uZW50LFxuICAgIGRlbDogVGV4dFNlbGVjdGlvbiRkZWwsXG4gICAgX2dldFBvc3REZWxldGVTZWxlY3Rpb25Qb2ludDogX2dldFBvc3REZWxldGVTZWxlY3Rpb25Qb2ludCxcbiAgICBfc2VsZWN0QWZ0ZXJEZWxldGU6IF9zZWxlY3RBZnRlckRlbGV0ZSxcblxuICAgIGdldFJhbmdlOiBUZXh0U2VsZWN0aW9uJGdldFJhbmdlLFxuICAgIGdldFN0YXRlOiBUZXh0U2VsZWN0aW9uJGdldFN0YXRlLFxuICAgIGdldE5vcm1hbGl6ZWRSYW5nZTogVGV4dFNlbGVjdGlvbiQkZ2V0Tm9ybWFsaXplZFJhbmdlLFxuICAgIGdldERpcmVjdGlvbjogVGV4dFNlbGVjdGlvbiQkZ2V0RGlyZWN0aW9uXG59KTtcblxuXG5fLmV4dGVuZChUZXh0U2VsZWN0aW9uLCB7XG4gICAgY3JlYXRlRnJvbVJhbmdlOiBUZXh0U2VsZWN0aW9uJCRjcmVhdGVGcm9tUmFuZ2UsXG4gICAgY3JlYXRlRnJvbVN0YXRlOiBUZXh0U2VsZWN0aW9uJCRjcmVhdGVGcm9tU3RhdGUsXG4gICAgY3JlYXRlU3RhdGVPYmplY3Q6IFRleHRTZWxlY3Rpb24kJGNyZWF0ZVN0YXRlT2JqZWN0XG59KTtcblxuXG4vKipcbiAqIFRleHRTZWxlY3Rpb24gaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXplcyBUZXh0U2VsZWN0aW9uIGZyb20gdGhlIGN1cnJlbnQgc2VsZWN0aW9uXG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kaW5pdCgpIHtcbiAgICB0aGlzLnNlbGVjdGlvbiA9IHRoaXMud2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICh0aGlzLnNlbGVjdGlvbi5yYW5nZUNvdW50KVxuICAgICAgICB0aGlzLnJhbmdlID0gdGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICB0aGlzLmlzQ29sbGFwc2VkID0gdGhpcy5zZWxlY3Rpb24uaXNDb2xsYXBzZWQ7XG59XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogUmV0cmlldmVzIGFuZCByZXR1cm5zIHNlbGVjdGlvbiB0ZXh0XG4gKlxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBUZXh0U2VsZWN0aW9uJHRleHQoKSB7XG4gICAgaWYgKCEgdGhpcy5yYW5nZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGlmICghIHRoaXMuX3RleHQpXG4gICAgICAgIHRoaXMuX3RleHQgPSB0aGlzLnJhbmdlLnRvU3RyaW5nKCk7XG5cbiAgICByZXR1cm4gdGhpcy5fdGV4dDtcbn1cblxuXG4vKipcbiAqIFRleHRTZWxlY3Rpb24gaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXRyaWV2ZXMgYW5kIHJldHVybnMgc2VsZWN0aW9uIHRleHQgbm9kZXNcbiAqXG4gKiBAcmV0dXJuIHtBcnJheVtOb2RlXX1cbiAqL1xuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiR0ZXh0Tm9kZXMoKSB7XG4gICAgaWYgKCEgdGhpcy5yYW5nZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGlmICghIHRoaXMuX3RleHROb2RlcylcbiAgICAgICAgdGhpcy5fdGV4dE5vZGVzID0gX2dldFRleHROb2Rlcy5jYWxsKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLl90ZXh0Tm9kZXM7XG59XG5cblxuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiRjbGVhcigpIHtcbiAgICB0aGlzLnNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbn1cblxuXG4vKipcbiAqIFJldHJpZXZlcyB0ZXh0IGFuZCB0ZXh0IG5vZGVzIGZyb20gc2VsZWN0aW9uIHNhdmluZyB0aGVtIG9uIHByb3BlcnRpZXMgb2Ygb2JqZWN0XG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7VGV4dFNlbGVjdGlvbn0gdGhpc1xuICovXG5mdW5jdGlvbiBfZ2V0VGV4dE5vZGVzKCkge1xuICAgIC8vIGxpc3Qgb2Ygc2VsZWN0ZWQgdGV4dCBub2Rlc1xuICAgIHZhciB0ZXh0Tm9kZXMgPSBbXTtcblxuICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkKVxuICAgICAgICByZXR1cm4gdGV4dE5vZGVzO1xuXG4gICAgLy8gY3JlYXRlIFRyZWVXYWxrZXIgdG8gdHJhdmVyc2UgdGhlIHRyZWUgdG8gc2VsZWN0IGFsbCB0ZXh0IG5vZGVzXG4gICAgdmFyIHNlbFN0YXJ0ID0gdGhpcy5yYW5nZS5zdGFydENvbnRhaW5lclxuICAgICAgICAsIHNlbEVuZCA9IHRoaXMucmFuZ2UuZW5kQ29udGFpbmVyXG4gICAgICAgICwgcmFuZ2VDb250YWluZXIgPSB0aGlzLnJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgdmFyIHRyZWVXYWxrZXIgPSB0aGlzLndpbmRvdy5kb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKHJhbmdlQ29udGFpbmVyLCBOb2RlRmlsdGVyLlNIT1dfVEVYVCk7XG4gICAgdmFyIG5vZGUgPSB0cmVlV2Fsa2VyLmN1cnJlbnROb2RlID0gc2VsU3RhcnQ7XG5cbiAgICAvLyB0cmF2ZXJzZSBET00gdHJlZSB0byBjb2xsZWN0IGFsbCBzZWxlY3RlZCB0ZXh0IG5vZGVzXG4gICAgd2hpbGUgKG5vZGUgJiYgKCEgaW5FbmQgfHwgc2VsRW5kLmNvbnRhaW5zKG5vZGUpKSkge1xuICAgICAgICB0ZXh0Tm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgdmFyIGluRW5kID0gaW5FbmQgfHwgc2VsRW5kLmNvbnRhaW5zKG5vZGUpO1xuICAgICAgICBub2RlID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGV4dE5vZGVzO1xufVxuXG5cbi8qKlxuICogUmV0cmlldmVzIGFuZCByZXR1cm5zIHN0YXJ0L2VuZCBlbGVtZW50IGZyb20gc2VsZWN0aW9uIHNhdmluZyB0aGVtIG9uIHByb3BlcnRpZXMgb2Ygb2JqZWN0XG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7VGV4dFNlbGVjdGlvbn0gdGhpc1xuICogQHJldHVybiB7RWxlbWVudHxudWxsfVxuICovXG5mdW5jdGlvbiBfZ2V0RWxlbWVudCh0aGlzUHJvcE5hbWUsIHJhbmdlUHJvcE5hbWUpIHtcbiAgICBpZiAoISB0aGlzLnJhbmdlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgaWYgKHR5cGVvZiB0aGlzW3RoaXNQcm9wTmFtZV0gPT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIHRoaXNbdGhpc1Byb3BOYW1lXSA9IGNvbnRhaW5pbmdFbGVtZW50KHRoaXMucmFuZ2VbcmFuZ2VQcm9wTmFtZV0pO1xuICAgIHJldHVybiB0aGlzW3RoaXNQcm9wTmFtZV07XG59XG5cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW5kIHJldHVybnMgc3RhcnQvZW5kIGNvbXBvbmVudCBmcm9tIHNlbGVjdGlvbiBzYXZpbmcgdGhlbSBvbiBwcm9wZXJ0aWVzIG9mIG9iamVjdFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1RleHRTZWxlY3Rpb259IHRoaXNcbiAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAqL1xuZnVuY3Rpb24gX2dldENvbXBvbmVudCh0aGlzUHJvcE5hbWUsIGVsTWV0aG9kTmFtZSkge1xuICAgIGlmICghIHRoaXMucmFuZ2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBpZiAodHlwZW9mIHRoaXNbdGhpc1Byb3BOYW1lXSA9PSAndW5kZWZpbmVkJylcbiAgICAgICAgdGhpc1t0aGlzUHJvcE5hbWVdID0gQ29tcG9uZW50LmdldENvbnRhaW5pbmdDb21wb25lbnQodGhpc1tlbE1ldGhvZE5hbWVdKCkpO1xuICAgIHJldHVybiB0aGlzW3RoaXNQcm9wTmFtZV07XG59XG5cblxuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiRjb250YWluZWRDb21wb25lbnRzKCkge1xuICAgIGlmICh0aGlzLl9jb250YWluZWRDb21wb25lbnRzKVxuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVkQ29tcG9uZW50cztcblxuICAgIHZhciBjb21wb25lbnRzID0gdGhpcy5fY29udGFpbmVkQ29tcG9uZW50cyA9IFtdO1xuXG4gICAgaWYgKHRoaXMuaXNDb2xsYXBzZWQgfHwgISB0aGlzLnJhbmdlKSByZXR1cm4gY29tcG9uZW50cztcblxuICAgIHJldHVybiBnZXRDb21wb25lbnRzRnJvbVJhbmdlKHRoaXMucmFuZ2UpO1xufVxuXG5cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kZWFjaENvbnRhaW5lZENvbXBvbmVudChjYWxsYmFjaywgdGhpc0FyZykge1xuICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkIHx8ICEgdGhpcy5yYW5nZSkgcmV0dXJuO1xuXG4gICAgdmFyIGNvbXBvbmVudHMgPSB0aGlzLmNvbnRhaW5lZENvbXBvbmVudHMoKTtcblxuICAgIGNvbXBvbmVudHMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7XG59XG5cblxuLyoqXG4gKiBUZXh0U2VsZWN0aW9uIGluc3RhbmNlIG1ldGhvZFxuICogRGVsZXRlcyB0aGUgY3VycmVudCBzZWxlY3Rpb24gYW5kIGFsbCBjb21wb25lbnRzIGluIGl0XG4gKiBcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gc2VsZWN0RW5kQ29udGFpbmVyIHNldCB0byB0cnVlIGlmIHRoZSBlbmQgY29udGFpbmVyIHNob3VsZCBiZSBzZWxlY3RlZCBhZnRlciBkZWxldGlvblxuICovXG5mdW5jdGlvbiBUZXh0U2VsZWN0aW9uJGRlbChzZWxlY3RFbmRDb250YWluZXIpIHtcbiAgICBpZiAodGhpcy5pc0NvbGxhcHNlZCB8fCAhIHRoaXMucmFuZ2UpIHJldHVybjtcblxuICAgIHZhciBzZWxQb2ludCA9IHRoaXMuX2dldFBvc3REZWxldGVTZWxlY3Rpb25Qb2ludChzZWxlY3RFbmRDb250YWluZXIpO1xuXG4gICAgZGVsZXRlUmFuZ2VXaXRoQ29tcG9uZW50cyh0aGlzLnJhbmdlKTtcblxuICAgIHRoaXMuX3NlbGVjdEFmdGVyRGVsZXRlKHNlbFBvaW50KTtcbiAgICBzZWxQb2ludC5ub2RlLnBhcmVudE5vZGUubm9ybWFsaXplKCk7XG59XG5cblxuZnVuY3Rpb24gX2dldFBvc3REZWxldGVTZWxlY3Rpb25Qb2ludChzZWxlY3RFbmRDb250YWluZXIpIHtcbiAgICB2YXIgc2VsTm9kZSA9IHRoaXMucmFuZ2Uuc3RhcnRDb250YWluZXI7XG4gICAgdmFyIHNlbE9mZnNldCA9IHRoaXMucmFuZ2Uuc3RhcnRPZmZzZXQ7XG4gICAgaWYgKHNlbGVjdEVuZENvbnRhaW5lciAmJiB0aGlzLnJhbmdlLnN0YXJ0Q29udGFpbmVyICE9IHRoaXMucmFuZ2UuZW5kQ29udGFpbmVyKSB7XG4gICAgICAgIHNlbE5vZGUgPSB0aGlzLnJhbmdlLmVuZENvbnRhaW5lcjtcbiAgICAgICAgc2VsT2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIHsgbm9kZTogc2VsTm9kZSwgb2Zmc2V0OiBzZWxPZmZzZXQgfTtcbn1cblxuXG5mdW5jdGlvbiBfc2VsZWN0QWZ0ZXJEZWxldGUoc2VsUG9pbnQpIHtcbiAgICB2YXIgc2VsTm9kZSA9IHNlbFBvaW50Lm5vZGVcbiAgICAgICAgLCBzZWxPZmZzZXQgPSBzZWxQb2ludC5vZmZzZXQ7XG5cbiAgICBpZiAoIXNlbE5vZGUpIHJldHVybjtcbiAgICBpZiAoc2VsTm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSlcbiAgICAgICAgc2VsTm9kZS50ZXh0Q29udGVudCA9IHNlbE5vZGUudGV4dENvbnRlbnQudHJpbVJpZ2h0KCk7XG4gICAgaWYgKCFzZWxOb2RlLm5vZGVWYWx1ZSlcbiAgICAgICAgc2VsTm9kZS5ub2RlVmFsdWUgPSAnXFx1MDBBMCc7IC8vbm9uLWJyZWFraW5nIHNwYWNlLCBcXHUyMDBCIGZvciB6ZXJvIHdpZHRoIHNwYWNlO1xuXG4gICAgdmFyIHBvc2l0aW9uID0gc2VsT2Zmc2V0ID4gc2VsTm9kZS5sZW5ndGggPyBzZWxOb2RlLmxlbmd0aCA6IHNlbE9mZnNldDtcbiAgICBzZXRDYXJldFBvc2l0aW9uKHNlbE5vZGUsIHBvc2l0aW9uKTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgc2VsZWN0aW9uIHJhbmdlXG4gKlxuICogQHJldHVybiB7UmFuZ2V9XG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kZ2V0UmFuZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZ2U7XG59XG5cblxuLyoqXG4gKiBTdG9yZXMgc2VsZWN0aW9uIHdpbmRvdywgbm9kZXMgYW5kIG9mZnNldHMgaW4gb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kZ2V0U3RhdGUocm9vdEVsKSB7XG4gICAgdmFyIHIgPSB0aGlzLnJhbmdlO1xuICAgIHZhciBkb2MgPSByb290RWwub3duZXJEb2N1bWVudFxuICAgICAgICAsIHdpbiA9IGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93O1xuICAgIGlmICghcikgcmV0dXJuIHsgd2luZG93OiB3aW4gfTtcbiAgICByZXR1cm4gVGV4dFNlbGVjdGlvbi5jcmVhdGVTdGF0ZU9iamVjdChyb290RWwsIHIuc3RhcnRDb250YWluZXIsIHIuc3RhcnRPZmZzZXQsIHIuZW5kQ29udGFpbmVyLCByLmVuZE9mZnNldCk7XG59XG5cblxuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiQkY3JlYXRlU3RhdGVPYmplY3Qocm9vdEVsLCBzdGFydENvbnRhaW5lciwgc3RhcnRPZmZzZXQsIGVuZENvbnRhaW5lciwgZW5kT2Zmc2V0KSB7XG4gICAgZW5kQ29udGFpbmVyID0gZW5kQ29udGFpbmVyIHx8IHN0YXJ0Q29udGFpbmVyO1xuICAgIGVuZE9mZnNldCA9IGVuZE9mZnNldCB8fCBzdGFydE9mZnNldDtcbiAgICB2YXIgZG9jID0gcm9vdEVsLm93bmVyRG9jdW1lbnRcbiAgICAgICAgLCB3aW4gPSBkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdztcbiAgICByZXR1cm4ge1xuICAgICAgICB3aW5kb3c6IHdpbixcbiAgICAgICAgcm9vdEVsOiByb290RWwsXG4gICAgICAgIHN0YXJ0OiBfZ2V0U2VsZWN0aW9uUG9pbnRTdGF0ZShyb290RWwsIHN0YXJ0Q29udGFpbmVyLCBzdGFydE9mZnNldCksXG4gICAgICAgIGVuZDogX2dldFNlbGVjdGlvblBvaW50U3RhdGUocm9vdEVsLCBlbmRDb250YWluZXIsIGVuZE9mZnNldClcbiAgICB9O1xufVxuXG5cbmZ1bmN0aW9uIF9nZXRTZWxlY3Rpb25Qb2ludFN0YXRlKHJvb3RFbCwgbm9kZSwgb2Zmc2V0KSB7XG4gICAgdmFyIHRyZWVQYXRoID0gZG9tVXRpbHMudHJlZVBhdGhPZihyb290RWwsIG5vZGUpO1xuICAgIGlmICghIHRyZWVQYXRoKSBsb2dnZXIuZXJyb3IoJ1NlbGVjdGlvbiBwb2ludCBpcyBvdXRzaWRlIG9mIHJvb3QgZWxlbWVudCcpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHRyZWVQYXRoOiB0cmVlUGF0aCxcbiAgICAgICAgb2Zmc2V0OiBvZmZzZXRcbiAgICB9O1xufVxuXG5cbi8qKlxuICogUmVzdG9yZXMgYWN0dWFsIHNlbGVjdGlvbiB0byB0aGUgc3RvcmVkIHJhbmdlXG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kJGNyZWF0ZUZyb21TdGF0ZShzdGF0ZSkge1xuICAgIHZhciBkb21VdGlscyA9IHN0YXRlLndpbmRvdy5taWxvLnV0aWwuZG9tO1xuXG4gICAgaWYgKHN0YXRlLnJvb3RFbCAmJiBzdGF0ZS5zdGFydCAmJiBzdGF0ZS5lbmQpIHtcbiAgICAgICAgdmFyIHN0YXJ0Tm9kZSA9IF9zZWxlY3Rpb25Ob2RlRnJvbVN0YXRlKHN0YXRlLnJvb3RFbCwgc3RhdGUuc3RhcnQpXG4gICAgICAgICAgICAsIGVuZE5vZGUgPSBfc2VsZWN0aW9uTm9kZUZyb21TdGF0ZShzdGF0ZS5yb290RWwsIHN0YXRlLmVuZCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRvbVV0aWxzLnNldFNlbGVjdGlvbihzdGFydE5vZGUsIHN0YXRlLnN0YXJ0Lm9mZnNldCwgZW5kTm9kZSwgc3RhdGUuZW5kLm9mZnNldCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRleHRTZWxlY3Rpb24oc3RhdGUud2luZG93KTtcbiAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1RleHQgc2VsZWN0aW9uOiBjYW5cXCd0IGNyZWF0ZSBzZWxlY3Rpb24nLCBlLCBlLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZG9tVXRpbHMuY2xlYXJTZWxlY3Rpb24oc3RhdGUud2luZG93KTtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXh0U2VsZWN0aW9uKHN0YXRlLndpbmRvdyk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIF9zZWxlY3Rpb25Ob2RlRnJvbVN0YXRlKHJvb3RFbCwgcG9pbnRTdGF0ZSkge1xuICAgIHZhciBub2RlID0gZG9tVXRpbHMuZ2V0Tm9kZUF0VHJlZVBhdGgocm9vdEVsLCBwb2ludFN0YXRlLnRyZWVQYXRoKTtcbiAgICBpZiAoISBub2RlKSBsb2dnZXIuZXJyb3IoJ1RleHRTZWxlY3Rpb24gY3JlYXRlRnJvbVN0YXRlOiBubyBub2RlIGF0IHRyZWVQYXRoJyk7XG4gICAgcmV0dXJuIG5vZGU7XG59XG5cblxuLyoqXG4gKiBDcmVhdGVzIHNlbGVjdGlvbiBmcm9tIHBhc3NlZCByYW5nZVxuICogXG4gKiBAcGFyYW0ge1JhbmdlfSByYW5nZVxuICogQHBhcmFtIHtCb29sZWFufSBiYWNrd2FyZFxuICpcbiAqIEByZXR1cm4ge1RleHRTZWxlY3Rpb259XG4gKi9cbmZ1bmN0aW9uIFRleHRTZWxlY3Rpb24kJGNyZWF0ZUZyb21SYW5nZShyYW5nZSwgYmFja3dhcmQpIHtcbiAgICB2YXIgd2luID0gcmFuZ2Uuc3RhcnRDb250YWluZXIub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld1xuICAgICAgICAsIHNlbCA9IHdpbi5nZXRTZWxlY3Rpb24oKVxuICAgICAgICAsIGVuZFJhbmdlO1xuXG4gICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuXG4gICAgaWYgKGJhY2t3YXJkKXtcbiAgICAgICAgZW5kUmFuZ2UgPSByYW5nZS5jbG9uZVJhbmdlKCk7XG4gICAgICAgIGVuZFJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcblxuICAgICAgICBzZWwuYWRkUmFuZ2UoZW5kUmFuZ2UpO1xuICAgICAgICBzZWwuZXh0ZW5kKHJhbmdlLnN0YXJ0Q29udGFpbmVyLCByYW5nZS5zdGFydE9mZnNldCkgICAgICAgIFxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFRleHRTZWxlY3Rpb24od2luKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgbm9ybWFsaXplZCBjb3B5IG9mIHRoZSByYW5nZVxuICogSWYgeW91IHRyaXBsZSBjbGljayBhbiBpdGVtLCB0aGUgZW5kIG9mIHRoZSByYW5nZSBpcyBwb3NpdGlvbmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIE5FWFQgbm9kZS5cbiAqIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHJhbmdlIHdpdGggdGhlIGVuZCBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgb2YgdGhlIGxhc3QgdGV4dG5vZGUgY29udGFpbmVkIFxuICogaW5zaWRlIGEgY29tcG9uZW50IHdpdGggdGhlIFwiZWRpdGFibGVcIiBmYWNldFxuICogXG4gKiBAcmV0dXJuIHtyYW5nZX1cbiAqL1xuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiQkZ2V0Tm9ybWFsaXplZFJhbmdlKCl7XG4gICAgdmFyIGRvYyA9IHRoaXMucmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIub3duZXJEb2N1bWVudFxuICAgICAgICAsIHR3LCBwcmV2aW91c05vZGVcbiAgICAgICAgLCBuZXdSYW5nZSA9IHRoaXMucmFuZ2UuY2xvbmVSYW5nZSgpO1xuXG4gICAgaWYgKG5ld1JhbmdlLmVuZENvbnRhaW5lci5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgdHcgPSBkb2MuY3JlYXRlVHJlZVdhbGtlcihkb2MuYm9keSwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xuICAgICAgICB0dy5jdXJyZW50Tm9kZSA9IG5ld1JhbmdlLmVuZENvbnRhaW5lcjtcbiAgICAgICAgcHJldmlvdXNOb2RlID0gdHcucHJldmlvdXNOb2RlKCk7XG4gICAgICAgIG5ld1JhbmdlLnNldEVuZChwcmV2aW91c05vZGUsIHByZXZpb3VzTm9kZS5sZW5ndGgpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdSYW5nZTtcbn1cblxuLyoqXG4gKiBnZXQgdGhlIGRpcmVjdGlvbiBvZiBhIHNlbGVjdGlvblxuICpcbiAqIDEgZm9yd2FyZCwgLTEgYmFja3dhcmQsIDAgbm8gZGlyZWN0aW9uLCB1bmRlZmluZWQgb25lIG9mIHRoZSBub2RlIGlzIGRldGFjaGVkIG9yIGluIGEgZGlmZmVyZW50IGZyYW1lXG4gKlxuICogQHJldHVybiB7LTF8MHwxfHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gVGV4dFNlbGVjdGlvbiQkZ2V0RGlyZWN0aW9uKCl7XG4gICAgcmV0dXJuIGRvbVV0aWxzLmdldFNlbGVjdGlvbkRpcmVjdGlvbih0aGlzLnNlbGVjdGlvbik7ICAgIFxufVxuXG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlciA9IG1pbG9Db3JlLk1lc3NlbmdlclxuICAgICwgU3RvcmFnZU1lc3NhZ2VTb3VyY2UgPSByZXF1aXJlKCcuL21zZ19zcmMnKVxuICAgICwgY29uZmlnID0gcmVxdWlyZSgnLi4vLi4vY29uZmlnJylcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5yZXF1aXJlKCcuL21vZGVsJylcblxubW9kdWxlLmV4cG9ydHMgPSBET01TdG9yYWdlO1xuXG5cbi8vIHNoYXJlZCBrZXlzIHN0b3JlZCBieSBhbGwgaW5zdGFuY2VzLCBpbmNsdWRlIGtleSBwcmVmaXhlc1xudmFyIF9zdG9yZWRLZXlzID0ge1xuICAgIHRydWU6IHt9LCAvLyBzZXNzaW9uIHN0b3JhZ2VcbiAgICBmYWxzZToge30gLy8gbG9jYWwgc3RvcmFnZVxufTtcblxuXG4vKipcbiAqIERPTVN0b3JhZ2UgY2xhc3MgdG8gc2ltcGxpZnkgc3RvcmFnZSBhbmQgcmV0cmlldmFsIG9mIG11bHRpcGxlIGl0ZW1zIHdpdGggdHlwZXMgcHJlc2VydmF0aW9uIHRvIERPTSBzdG9yYWdlIChsb2NhbFN0b3JhZ2UgYW5kIHNlc3Npb25TdG9yYWdlKS5cbiAqIFR5cGVzIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBrZXkgY3JlYXRlZCBmcm9tIHZhbHVlIGtleXMgd2l0aCBhcHBlbmRlZCBgbWlsby5jb25maWcuZG9tU3RvcmFnZS50eXBlU3VmZml4YFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlQcmVmaXggcHJlZml4IHRoYXQgd2lsbCBiZSBhZGRlZCB0byBhbGwga2V5cyBmb2xsb3dlZCBieSBgbWlsby5jb25maWcuZG9tU3RvcmFnZS5wcmVmaXhTZXBhcmF0b3JgIChcIi9cIiBieSBkZWZhdWx0KS5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gc2Vzc2lvbk9ubHkgdHJ1ZSB0byB1c2Ugc2Vzc2lvblN0b3JhZ2UuIGxvY2FsU3RvcmFnZSB3aWxsIGJlIHVzZWQgYnkgZGVmYXVsdC5cbiAqIEBwYXJhbSB7V2luZG93fSB3aW4gd2luZG93IHRvIHdvcmsgaW5cbiAqL1xuZnVuY3Rpb24gRE9NU3RvcmFnZShrZXlQcmVmaXgsIHNlc3Npb25Pbmx5LCB3aW4pIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuICAgIHdpbiA9IHdpbiB8fCB3aW5kb3c7XG5cbiAgICBrZXlQcmVmaXggPSBjb25maWcuZG9tU3RvcmFnZS5yb290ICtcbiAgICAgICAgICAgICAgICAoa2V5UHJlZml4XG4gICAgICAgICAgICAgICAgICAgID8ga2V5UHJlZml4ICsgY29uZmlnLmRvbVN0b3JhZ2UucHJlZml4U2VwYXJhdG9yXG4gICAgICAgICAgICAgICAgICAgIDogJycpO1xuXG4gICAgXy5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAga2V5UHJlZml4OiBrZXlQcmVmaXgsXG4gICAgICAgIHNlc3Npb25Pbmx5OiAhISBzZXNzaW9uT25seSxcbiAgICAgICAgd2luZG93OiB3aW4sXG4gICAgICAgIF9zdG9yYWdlOiBzZXNzaW9uT25seSA/IHdpbi5zZXNzaW9uU3RvcmFnZSA6IHdpbi5sb2NhbFN0b3JhZ2UsXG4gICAgICAgIF90eXBlU3VmZml4OiBjb25maWcuZG9tU3RvcmFnZS50eXBlU3VmZml4LFxuICAgICAgICBfa2V5czoge31cbiAgICB9LCBfLldSSVQpO1xufVxuXG5cbl8uZXh0ZW5kUHJvdG8oRE9NU3RvcmFnZSwge1xuICAgIGdldDogRE9NU3RvcmFnZSRnZXQsXG4gICAgc2V0OiBET01TdG9yYWdlJHNldCxcbiAgICByZW1vdmU6IERPTVN0b3JhZ2UkcmVtb3ZlLFxuICAgIGhhc0l0ZW06IERPTVN0b3JhZ2UkaGFzSXRlbSxcbiAgICBnZXRJdGVtOiBET01TdG9yYWdlJGdldEl0ZW0sXG4gICAgc2V0SXRlbTogRE9NU3RvcmFnZSRzZXRJdGVtLFxuICAgIHJlbW92ZUl0ZW06IERPTVN0b3JhZ2UkcmVtb3ZlSXRlbSxcbiAgICBfc3RvcmFnZUtleTogRE9NU3RvcmFnZSRfc3RvcmFnZUtleSxcbiAgICBfZG9tU3RvcmFnZUtleTogRE9NU3RvcmFnZSRfZG9tU3RvcmFnZUtleSxcbiAgICBnZXRBbGxLZXlzOiBET01TdG9yYWdlJGdldEFsbEtleXMsXG4gICAgZ2V0QWxsSXRlbXM6IERPTVN0b3JhZ2UkZ2V0QWxsSXRlbXMsXG4gICAgY3JlYXRlTWVzc2VuZ2VyOiBET01TdG9yYWdlJGNyZWF0ZU1lc3NlbmdlcixcbiAgICBkZXN0cm95OiBET01TdG9yYWdlJGRlc3Ryb3lcbn0pO1xuXG5cbi8qKlxuICogRXhwb3NlIE1lc2VuZ2VyIGFuZCBNZXNzYWdlU291cmNlIG1ldGhvZHMgb24gRE9NU3RvcmFnZVxuICovXG5NZXNzZW5nZXIudXNlV2l0aChET01TdG9yYWdlLCAnX21lc3NlbmdlcicsIE1lc3Nlbmdlci5kZWZhdWx0TWV0aG9kcyk7XG5TdG9yYWdlTWVzc2FnZVNvdXJjZS51c2VXaXRoKERPTVN0b3JhZ2UsICdfbWVzc2FnZVNvdXJjZScsIFsndHJpZ2dlciddKTtcblxuXG52YXIgX3Nlc3Npb25TdG9yYWdlID0gbmV3IERPTVN0b3JhZ2UoJycsIHRydWUpXG4gICAgLCBfbG9jYWxTdG9yYWdlID0gbmV3IERPTVN0b3JhZ2UoJycsIGZhbHNlKTtcblxudmFyIF9kb21TdG9yYWdlID0ge1xuICAgICAgICB0cnVlOiBfc2Vzc2lvblN0b3JhZ2UsXG4gICAgICAgIGZhbHNlOiBfbG9jYWxTdG9yYWdlXG4gICAgfTtcblxuXy5leHRlbmQoRE9NU3RvcmFnZSwge1xuICAgIHJlZ2lzdGVyRGF0YVR5cGU6IERPTVN0b3JhZ2UkJHJlZ2lzdGVyRGF0YVR5cGUsXG4gICAgbG9jYWw6IF9sb2NhbFN0b3JhZ2UsXG4gICAgc2Vzc2lvbjogX3Nlc3Npb25TdG9yYWdlLFxuICAgIHN0b3JhZ2U6IF9kb21TdG9yYWdlLFxuICAgIF9zdG9yZWRLZXlzOiBfc3RvcmVkS2V5cyAvLyBleHBvc2VkIGZvciB0ZXN0aW5nXG59KTtcblxuXG4vKipcbiAqIFNldHMgZGF0YSB0byBET00gc3RvcmFnZS4gYHRoaXMua2V5UHJlZml4YCBpcyBwcmVwZW5kZWQgdG8ga2V5cy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSBzaW5nbGUgb2JqZWN0IGNhbiBiZSBwYXNzZWQgaW4gd2hpY2ggY2FzZSBrZXlzIHdpbGwgYmUgdXNlZCBhcyBrZXlzIGluIGxvY2FsIHN0b3JhZ2UuXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBhbHRlcm5hdGl2ZWx5IGp1c3QgdGhlIGxpc3Qgb2YgYXJndW1lbnRzIGNhbiBiZSBwYXNzZWQgd2hlcmUgYXJndW1lbnRzIGNhbiBiZSBzZXF1ZW50aWFsbHkgdXNlZCBhcyBrZXlzIGFuZCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2Ukc2V0KGRhdGEpIHsgLy8gb3IgYXJndW1lbnRzXG4gICAgaWYgKHR5cGVvZiBkYXRhID09ICdvYmplY3QnKVxuICAgICAgICBfLmVhY2hLZXkoZGF0YSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICAgICAgdGhpcy5zZXRJdGVtKGtleSwgdmFsdWUpO1xuICAgICAgICB9LCB0aGlzKTtcbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIGFyZ3NMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgICBpZiAoYXJnc0xlbiAlIDIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRG9tU3RvcmFnZUVycm9yKCdET01TdG9yYWdlOiBzZXQgc2hvdWxkIGhhdmUgZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzIG9yIG9iamVjdCcpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJnc0xlbjsgaSsrKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gYXJndW1lbnRzW2ldXG4gICAgICAgICAgICAgICAgLCB2YWx1ZSA9IGFyZ3VtZW50c1srK2ldO1xuXG4gICAgICAgICAgICB0aGlzLnNldEl0ZW0oa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLyoqXG4gKiBHZXRzIGRhdGEgZnJvbSBET00gc3RvcmFnZS4gYHRoaXMua2V5UHJlZml4YCBpcyBwcmVwZW5kZWQgdG8gcGFzc2VkIGtleXMsIGJ1dCByZXR1cm5lZCBvYmplY3Qgd2lsbCBoYXZlIGtleXMgd2l0aG91dCByb290IGtleXMuXG4gKlxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMga2V5cyBjYW4gYmUgcGFzc2VkIGFzIHN0cmluZ3Mgb3IgYXJyYXlzIG9mIHN0cmluZ3NcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2UkZ2V0KCkgeyAvLyAsIC4uLiBhcmd1bWVudHNcbiAgICB2YXIgZGF0YSA9IHt9O1xuICAgIF8uZGVlcEZvckVhY2goYXJndW1lbnRzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgZGF0YVtrZXldID0gdGhpcy5nZXRJdGVtKGtleSk7XG4gICAgfSwgdGhpcyk7XG4gICAgcmV0dXJuIGRhdGE7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIGtleXMgZnJvbSBET00gc3RvcmFnZS4gYHRoaXMua2V5UHJlZml4YCBpcyBwcmVwZW5kZWQgdG8gcGFzc2VkIGtleXMuXG4gKlxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMga2V5cyBjYW4gYmUgcGFzc2VkIGFzIHN0cmluZ3Mgb3IgYXJyYXlzIG9mIHN0cmluZ3NcbiAqL1xuZnVuY3Rpb24gRE9NU3RvcmFnZSRyZW1vdmUoKSB7IC8vLCAuLi4gYXJndW1lbnRzXG4gICAgXy5kZWVwRm9yRWFjaChhcmd1bWVudHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICB9LCB0aGlzKTtcbn1cblxuXG4vKipcbiAqIENoZWNrIGZvciBwcmVzZW5jZSBvZiBzaW5nbGUgaXRlbSBpbiBET00gc3RvcmFnZS4gYHRoaXMua2V5UHJlZml4YCBpcyBwcmVwZW5kZWQgdG8gcGFzc2VkIGtleS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBET01TdG9yYWdlJGhhc0l0ZW0oa2V5KSB7XG4gICAgdmFyIHBLZXkgPSB0aGlzLl9zdG9yYWdlS2V5KGtleSk7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JhZ2UuZ2V0SXRlbShwS2V5KSAhPSBudWxsO1xufVxuXG5cbi8qKlxuICogR2V0cyBzaW5nbGUgaXRlbSBmcm9tIERPTSBzdG9yYWdlIHByZXBlbmRpbmcgYHRoaXMua2V5UHJlZml4YCB0byBwYXNzZWQga2V5LlxuICogUmVhZHMgdHlwZSBvZiB0aGUgb3JpZ2luYWxseSBzdG9yZWQgdmFsdWUgZnJvbSBga2V5ICsgdGhpcy5fdHlwZVN1ZmZpeGAgYW5kIGNvbnZlcnRzIGRhdGEgdG8gdGhlIG9yaWdpbmFsIHR5cGUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiBET01TdG9yYWdlJGdldEl0ZW0oa2V5KSB7XG4gICAgdmFyIHBLZXkgPSB0aGlzLl9zdG9yYWdlS2V5KGtleSk7XG4gICAgdmFyIGRhdGFUeXBlID0gX2dldEtleURhdGFUeXBlLmNhbGwodGhpcywgcEtleSk7XG4gICAgdmFyIHZhbHVlU3RyID0gdGhpcy5fc3RvcmFnZS5nZXRJdGVtKHBLZXkpO1xuICAgIHZhciB2YWx1ZSA9IF9wYXJzZURhdGEodmFsdWVTdHIsIGRhdGFUeXBlKTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5cblxuLyoqXG4gKiBTZXRzIHNpbmdsZSBpdGVtIHRvIERPTSBzdG9yYWdlIHByZXBlbmRpbmcgYHRoaXMua2V5UHJlZml4YCB0byBwYXNzZWQga2V5LlxuICogU3RvcmVzIHR5cGUgb2YgdGhlIHN0b3JlZCB2YWx1ZSB0byBga2V5ICsgdGhpcy5fdHlwZVN1ZmZpeGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiBET01TdG9yYWdlJHNldEl0ZW0oa2V5LCB2YWx1ZSkge1xuICAgIHZhciBwS2V5ID0gdGhpcy5fc3RvcmFnZUtleShrZXkpO1xuICAgIHZhciBkYXRhVHlwZSA9IF9zZXRLZXlEYXRhVHlwZS5jYWxsKHRoaXMsIHBLZXksIHZhbHVlKTtcbiAgICB2YXIgdmFsdWVTdHIgPSBfc2VyaWFsaXplRGF0YSh2YWx1ZSwgZGF0YVR5cGUpO1xuICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX3N0b3JhZ2Uuc2V0SXRlbShwS2V5LCB2YWx1ZVN0cik7XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICAgIGlmIChlLm5hbWUgPT0gJ1F1b3RhRXhjZWVkZWRFcnJvcicpIHtcbiAgICAgICAgICAgIHZhciBjZmcgPSBjb25maWcuZG9tU3RvcmFnZS5xdW90YUV4Y2VlZGVkO1xuICAgICAgICAgICAgaWYgKGNmZy5tZXNzYWdlKVxuICAgICAgICAgICAgICAgIG1pbG8ubWFpbC5wb3N0TWVzc2FnZSgncXVvdGFleGNlZWRlZGVycm9yJywgdmFsdWUpO1xuICAgICAgICAgICAgaWYgKGNmZy50aHJvd0Vycm9yKVxuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgdGhpcy5fa2V5c1trZXldID0gdHJ1ZTtcbiAgICBfZG9tU3RvcmFnZVt0aGlzLnNlc3Npb25Pbmx5XS5fa2V5c1twS2V5XSA9IHRydWU7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIHNpbmdsZSBpdGVtIGZyb20gRE9NIHN0b3JhZ2UgcHJlcGVuZGluZyBgdGhpcy5rZXlQcmVmaXhgIHRvIHBhc3NlZCBrZXkuXG4gKiBUeXBlIG9mIHRoZSBzdG9yZWQgdmFsdWUgKGluIGBrZXkgKyB0aGlzLl90eXBlU3VmZml4YCBrZXkpIGlzIGFsc28gcmVtb3ZlZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2UkcmVtb3ZlSXRlbShrZXkpIHtcbiAgICB2YXIgcEtleSA9IHRoaXMuX3N0b3JhZ2VLZXkoa2V5KTtcbiAgICB0aGlzLl9zdG9yYWdlLnJlbW92ZUl0ZW0ocEtleSk7XG4gICAgX3JlbW92ZUtleURhdGFUeXBlLmNhbGwodGhpcywgcEtleSlcbiAgICBkZWxldGUgdGhpcy5fa2V5c1trZXldO1xuICAgIGRlbGV0ZSBfZG9tU3RvcmFnZVt0aGlzLnNlc3Npb25Pbmx5XS5fa2V5c1twS2V5XTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgdGhlIGFycmF5IG9mIGFsbCBrZXlzIHN0b3JlZCBieSB0aGlzIGluc3RhbmNlIG9mIERPTVN0b3JhZ2VcbiAqXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gRE9NU3RvcmFnZSRnZXRBbGxLZXlzKCkge1xuICAgIHZhciBzdG9yZWRLZXlzID0gT2JqZWN0LmtleXModGhpcy5fa2V5cyk7XG4gICAgdmFyIGtleXNJblN0b3JhZ2UgPSBzdG9yZWRLZXlzLmZpbHRlcihmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzSXRlbShrZXkpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZSBkZWxldGUgdGhpcy5fa2V5c1trZXldO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiBrZXlzSW5TdG9yYWdlO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWFwIHdpdGggYWxsIGtleXMgYW5kIHZhbHVlcyAoZGVzZXJpYWxpemVkKSBzdG9yZWQgdXNpbmcgdGhpcyBpbnN0YW5jZSBvZiBET01TdG9yYWdlXG4gKlxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBET01TdG9yYWdlJGdldEFsbEl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLmdldCh0aGlzLmdldEFsbEtleXMoKSk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHByZWZpeGVkIGtleSBmb3IgRE9NIHN0b3JhZ2UgZm9yIGdpdmVuIHVucHJlZml4ZWQga2V5LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gRE9NU3RvcmFnZSRfc3RvcmFnZUtleShrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5rZXlQcmVmaXggKyBrZXk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHVucHJlZml4ZWQga2V5IHRvIGJlIHVzZWQgd2l0aCB0aGlzIGluc3RhbmNlIG9mIERPTVN0b3JhZ2UgZmlyIGdpdmVuIGFjdHVhbCBrZXkgaW4gc3RvcmFnZVxuICogSWYga2V5IGhhcyBkaWZmZXJlbnQgcHJlZml4IGZyb20gdGhlIGtleVByZWZpeCByZXR1cm5zIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdG9yYWdlS2V5IGFjdHVhbCBrZXkgaW4gbG9jYWwvc2Vzc2lvbiBzdG9yYWdlXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2UkX2RvbVN0b3JhZ2VLZXkoc3RvcmFnZUtleSkge1xuICAgIGlmIChzdG9yYWdlS2V5LmluZGV4T2YodGhpcy5fdHlwZVN1ZmZpeCkgPj0gMCkgcmV0dXJuO1xuICAgIHJldHVybiBfLnVuUHJlZml4KHN0b3JhZ2VLZXksIHRoaXMua2V5UHJlZml4KTtcbn1cblxuXG4vKipcbiAqIEdldHMgb3JpZ2luYWxseSBzdG9yZWQgZGF0YSB0eXBlIGZvciBnaXZlbiAocHJlZml4ZWQpIGBrZXlgLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gcEtleSBwcmVmaXhlZCBrZXkgb2Ygc3RvcmVkIHZhbHVlXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIF9nZXRLZXlEYXRhVHlwZShwS2V5KSB7XG4gICAgcEtleSA9IF9kYXRhVHlwZUtleS5jYWxsKHRoaXMsIHBLZXkpO1xuICAgIHJldHVybiB0aGlzLl9zdG9yYWdlLmdldEl0ZW0ocEtleSk7XG59XG5cblxuLyoqXG4gKiBTdG9yZXMgZGF0YSB0eXBlIGZvciBnaXZlbiAocHJlZml4ZWQpIGBrZXlgIGFuZCBgdmFsdWVgLlxuICogUmV0dXJucyBkYXRhIHR5cGUgZm9yIGB2YWx1ZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHBLZXkgcHJlZml4ZWQga2V5IG9mIHN0b3JlZCB2YWx1ZVxuICogQHBhcmFtIHtBbnl9IHZhbHVlXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIF9zZXRLZXlEYXRhVHlwZShwS2V5LCB2YWx1ZSkge1xuICAgIHZhciBkYXRhVHlwZSA9IF9nZXRWYWx1ZVR5cGUodmFsdWUpO1xuICAgIHBLZXkgPSBfZGF0YVR5cGVLZXkuY2FsbCh0aGlzLCBwS2V5KTtcbiAgICB0aGlzLl9zdG9yYWdlLnNldEl0ZW0ocEtleSwgZGF0YVR5cGUpO1xuICAgIHJldHVybiBkYXRhVHlwZTtcbn1cblxuXG4vKipcbiAqIFJlbW92ZXMgc3RvcmVkIGRhdGEgdHlwZSBmb3IgZ2l2ZW4gKHByZWZpeGVkKSBga2V5YC5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHBLZXkgcHJlZml4ZWQga2V5IG9mIHN0b3JlZCB2YWx1ZVxuICovXG5mdW5jdGlvbiBfcmVtb3ZlS2V5RGF0YVR5cGUocEtleSkge1xuICAgIHBLZXkgPSBfZGF0YVR5cGVLZXkuY2FsbCh0aGlzLCBwS2V5KTtcbiAgICB0aGlzLl9zdG9yYWdlLnJlbW92ZUl0ZW0ocEtleSk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBrZXkgdG8gc3RvcmUgZGF0YSB0eXBlIGZvciBnaXZlbiAocHJlZml4ZWQpIGBrZXlgLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gcEtleSBwcmVmaXhlZCBrZXkgb2Ygc3RvcmVkIHZhbHVlXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIF9kYXRhVHlwZUtleShwS2V5KSB7XG4gICAgcmV0dXJuIHBLZXkgKyB0aGlzLl90eXBlU3VmZml4O1xufVxuXG5cbi8qKlxuICogUmV0dXJucyB0eXBlIG9mIHZhbHVlIGFzIHN0cmluZy4gQ2xhc3MgbmFtZSByZXR1cm5lZCBmb3Igb2JqZWN0cyAoJ251bGwnIGZvciBudWxsKS5cbiAqIEBwYXJhbSAge0FueX0gdmFsdWVcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gX2dldFZhbHVlVHlwZSh2YWx1ZSkge1xuICAgIHZhciB2YWx1ZVR5cGUgPSB0eXBlb2YgdmFsdWVcbiAgICAgICAgLCBjbGFzc05hbWUgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgICwgZGF0YVR5cGUgPSB2YWx1ZXNEYXRhVHlwZXNbY2xhc3NOYW1lXTtcbiAgICByZXR1cm4gZGF0YVR5cGUgfHwgKFxuICAgICAgICAgICAgdmFsdWVUeXBlICE9ICdvYmplY3QnXG4gICAgICAgICAgICAgICAgPyB2YWx1ZVR5cGVcbiAgICAgICAgICAgICAgICA6IHZhbHVlID09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgPyAnbnVsbCdcbiAgICAgICAgICAgICAgICAgICAgOiB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lKTtcbn1cbnZhciB2YWx1ZXNEYXRhVHlwZXMgPSB7XG4gICAgLy8gY2FuIGJlIHJlZ2lzdGVyZWQgd2l0aCBgcmVnaXN0ZXJEYXRhVHlwZWBcbn1cblxuXG4vKipcbiAqIFNlcmlhbGl6ZXMgdmFsdWUgdG8gYmUgc3RvcmVkIGluIERPTSBzdG9yYWdlLlxuICpcbiAqIEBwYXJhbSAge0FueX0gdmFsdWUgdmFsdWUgdG8gYmUgc2VyaWFsaXplZFxuICogQHBhcmFtICB7U3RyaW5nfSB2YWx1ZVR5cGUgb3B0aW9uYWwgZGF0YSB0eXBlIHRvIGRlZmluZSBzZXJpYWxpemVyLCBfZ2V0VmFsdWVUeXBlIGlzIHVzZWQgaWYgbm90IHBhc3NlZC5cbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gX3NlcmlhbGl6ZURhdGEodmFsdWUsIHZhbHVlVHlwZSkge1xuICAgIHZhbHVlVHlwZSA9IHZhbHVlVHlwZSB8fCBfZ2V0VmFsdWVUeXBlKHZhbHVlKTtcbiAgICB2YXIgc2VyaWFsaXplciA9IGRhdGFTZXJpYWxpemVyc1t2YWx1ZVR5cGVdO1xuICAgIHJldHVybiBzZXJpYWxpemVyXG4gICAgICAgICAgICA/IHNlcmlhbGl6ZXIodmFsdWUsIHZhbHVlVHlwZSlcbiAgICAgICAgICAgIDogdmFsdWUgJiYgdmFsdWUudG9TdHJpbmcgPT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ1xuICAgICAgICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gICAgICAgICAgICAgICAgOiAnJyArIHZhbHVlO1xufVxudmFyIGRhdGFTZXJpYWxpemVycyA9IHtcbiAgICAnQXJyYXknOiBKU09OLnN0cmluZ2lmeVxufVxuXG5cbi8qKlxuICogUGFyc2VzIHN0cmluZyByZXRyaWV2ZWQgZnJvbSBET00gc3RvcmFnZS5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHZhbHVlU3RyXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHZhbHVlVHlwZSBkYXRhIHR5cGUgdGhhdCBkZWZpbmVzIHBhcnNlci4gT3JpZ2luYWwgc3Jpbmcgd2lsbCBiZSByZXR1cm5lZCBpZiBwYXJzZXIgaXMgbm90IGRlZmluZWQuXG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmZ1bmN0aW9uIF9wYXJzZURhdGEodmFsdWVTdHIsIHZhbHVlVHlwZSkge1xuICAgIHZhciBwYXJzZXIgPSBkYXRhUGFyc2Vyc1t2YWx1ZVR5cGVdO1xuICAgIHJldHVybiBwYXJzZXJcbiAgICAgICAgICAgID8gcGFyc2VyKHZhbHVlU3RyLCB2YWx1ZVR5cGUpXG4gICAgICAgICAgICA6IHZhbHVlU3RyO1xufVxudmFyIGRhdGFQYXJzZXJzID0ge1xuICAgIE9iamVjdDogXy5qc29uUGFyc2UsXG4gICAgQXJyYXk6IF8uanNvblBhcnNlLFxuICAgIERhdGU6IGZ1bmN0aW9uKHZhbFN0cikgeyByZXR1cm4gbmV3IERhdGUodmFsU3RyKTsgfSxcbiAgICBib29sZWFuOiBmdW5jdGlvbih2YWxTdHIpIHsgcmV0dXJuIHZhbFN0ciA9PSAndHJ1ZSc7IH0sXG4gICAgbnVtYmVyOiBOdW1iZXIsXG4gICAgZnVuY3Rpb246IF8udG9GdW5jdGlvbixcbiAgICBSZWdFeHA6IF8udG9SZWdFeHBcbn07XG5cblxuLyoqXG4gKiBSZWdpc3RlcnMgZGF0YSB0eXBlIHRvIGJlIHNhdmVkIGluIERPTSBzdG9yYWdlLiBDbGFzcyBuYW1lIGNhbiBiZSB1c2VkIG9yIHJlc3VsdCBvZiBgdHlwZW9mYCBvcGVyYXRvciBmb3Igbm9uLW9iamVjdHMgdG8gb3ZlcnJpZGUgZGVmYXVsdCBjb252ZXJzaW9ucy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVUeXBlIGNsYXNzIChjb25zdHJ1Y3RvcikgbmFtZSBvciB0aGUgc3RyaW5nIHJldHVybmVkIGJ5IHR5cGVvZi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlcmlhbGl6ZXIgb3B0aW9uYWwgc2VyaWFsaXplciBmb3IgdGhpcyB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwYXJzZXIgb3B0aW9uYWwgcGFyc2VyIGZvciB0aGlzIHR5cGVcbiAqIEBwYXJhbSB7W1N0cmluZ119IHN0b3JlQXNEYXRhVHlwZSBvcHRpb25hbCBuYW1lIG9mIHN0b3JlZCBkYXRhIHR5cGUgaWYgZGlmZmVyZW50IGZyb20gdmFsdWVUeXBlXG4gKi9cbmZ1bmN0aW9uIERPTVN0b3JhZ2UkJHJlZ2lzdGVyRGF0YVR5cGUodmFsdWVUeXBlLCBzZXJpYWxpemVyLCBwYXJzZXIsIHN0b3JlQXNEYXRhVHlwZSkge1xuICAgIGlmIChzZXJpYWxpemVyKSBkYXRhU2VyaWFsaXplcnNbdmFsdWVUeXBlXSA9IHNlcmlhbGl6ZXI7XG4gICAgaWYgKHBhcnNlcikgZGF0YVBhcnNlcnNbdmFsdWVUeXBlXSA9IHBhcnNlcjtcbiAgICB2YWx1ZXNEYXRhVHlwZXNbdmFsdWVUeXBlXSA9IHN0b3JlQXNEYXRhVHlwZSB8fCB2YWx1ZVR5cGU7XG59XG5cblxuZnVuY3Rpb24gRE9NU3RvcmFnZSRjcmVhdGVNZXNzZW5nZXIoKSB7XG4gICAgdmFyIHN0b3JhZ2VNZXNzYWdlU291cmNlID0gbmV3IFN0b3JhZ2VNZXNzYWdlU291cmNlKHRoaXMpO1xuICAgIHZhciBtZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKHRoaXMsIHVuZGVmaW5lZCwgc3RvcmFnZU1lc3NhZ2VTb3VyY2UpO1xuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIF9tZXNzZW5nZXI6IG1lc3NlbmdlcixcbiAgICAgICAgX21lc3NhZ2VTb3VyY2U6IHN0b3JhZ2VNZXNzYWdlU291cmNlXG4gICAgfSwgXy5XUklUKTtcbn1cblxuXG5mdW5jdGlvbiBET01TdG9yYWdlJGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc3RvcmFnZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLndpbmRvdyA9IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5fbWVzc2VuZ2VyKSB0aGlzLl9tZXNzZW5nZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2Rlc3Ryb3llZCA9IHRydWU7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBtaWxvQ29yZSA9IHJlcXVpcmUoJ21pbG8tY29yZScpXG4gICAgLCBNb2RlbCA9IG1pbG9Db3JlLk1vZGVsXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG87XG5cbk1vZGVsLnJlZ2lzdGVyV2l0aERPTVN0b3JhZ2UgPSBNb2RlbCQkcmVnaXN0ZXJXaXRoRE9NU3RvcmFnZTtcblxuXG5mdW5jdGlvbiBNb2RlbCQkcmVnaXN0ZXJXaXRoRE9NU3RvcmFnZSgpIHtcbiAgICB2YXIgRE9NU3RvcmFnZSA9IHJlcXVpcmUoJy4vaW5kZXgnKTtcbiAgICBET01TdG9yYWdlLnJlZ2lzdGVyRGF0YVR5cGUoJ01vZGVsJywgTW9kZWxfZG9tU3RvcmFnZVNlcmlhbGl6ZXIsIE1vZGVsX2RvbVN0b3JhZ2VQYXJzZXIpO1xuICAgIERPTVN0b3JhZ2UucmVnaXN0ZXJEYXRhVHlwZSgnTW9kZWxQYXRoJywgTW9kZWxfZG9tU3RvcmFnZVNlcmlhbGl6ZXIsIE1vZGVsX2RvbVN0b3JhZ2VQYXJzZXIsICdNb2RlbCcpO1xufVxuXG5cbmZ1bmN0aW9uIE1vZGVsX2RvbVN0b3JhZ2VTZXJpYWxpemVyKHZhbHVlKSB7XG4gICAgdmFyIGRhdGEgPSB2YWx1ZS5nZXQoKTtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG59XG5cblxuZnVuY3Rpb24gTW9kZWxfZG9tU3RvcmFnZVBhcnNlcih2YWx1ZVN0cikge1xuICAgIHZhciBkYXRhID0gXy5qc29uUGFyc2UodmFsdWVTdHIpO1xuICAgIHJldHVybiBuZXcgTW9kZWwoZGF0YSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NhZ2VTb3VyY2UgPSBtaWxvQ29yZS5jbGFzc2VzLk1lc3NhZ2VTb3VyY2VcbiAgICAsIF8gPSBtaWxvQ29yZS5wcm90b1xuICAgICwgY29uZmlnID0gcmVxdWlyZSgnLi4vLi4vY29uZmlnJylcbiAgICAsIHVuaXF1ZUlkID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91bmlxdWVfaWQnKTtcblxudmFyIFN0b3JhZ2VNZXNzYWdlU291cmNlID0gXy5jcmVhdGVTdWJjbGFzcyhNZXNzYWdlU291cmNlLCAnU3RvcmFnZU1lc3NhZ2VTb3VyY2UnLCB0cnVlKTtcblxuXG5fLmV4dGVuZFByb3RvKFN0b3JhZ2VNZXNzYWdlU291cmNlLCB7XG4gICAgLy8gaW1wbGVtZW50aW5nIE1lc3NhZ2VTb3VyY2UgaW50ZXJmYWNlXG4gICAgaW5pdDogaW5pdCxcbiAgICBhZGRTb3VyY2VTdWJzY3JpYmVyOiBTdG9yYWdlTWVzc2FnZVNvdXJjZSRhZGRTb3VyY2VTdWJzY3JpYmVyLFxuICAgIHJlbW92ZVNvdXJjZVN1YnNjcmliZXI6IFN0b3JhZ2VNZXNzYWdlU291cmNlJHJlbW92ZVNvdXJjZVN1YnNjcmliZXIsXG4gICAgcG9zdE1lc3NhZ2U6IFN0b3JhZ2VNZXNzYWdlU291cmNlJHBvc3RNZXNzYWdlLFxuICAgIHRyaWdnZXI6IFN0b3JhZ2VNZXNzYWdlU291cmNlJHRyaWdnZXIsXG5cbiAgICAvL2NsYXNzIHNwZWNpZmljIG1ldGhvZHNcbiAgICBoYW5kbGVFdmVudDogaGFuZGxlRXZlbnQgIC8vIGV2ZW50IGRpc3BhdGNoZXIgLSBhcyBkZWZpbmVkIGJ5IEV2ZW50IERPTSBBUElcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0b3JhZ2VNZXNzYWdlU291cmNlO1xuXG5cbmZ1bmN0aW9uIGluaXQoaG9zdE9iamVjdCwgcHJveHlNZXRob2RzLCBtZXNzZW5nZXJBUElPckNsYXNzKSB7XG4gICAgaWYgKGhvc3RPYmplY3QuY29uc3RydWN0b3IubmFtZSAhPSAnRE9NU3RvcmFnZScpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaG9zdE9iamVjdCBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgRE9NU3RvcmFnZScpO1xuICAgIHRoaXMuc3RvcmFnZSA9IGhvc3RPYmplY3Q7XG4gICAgdGhpcy5tZXNzYWdlS2V5ID0gY29uZmlnLmRvbVN0b3JhZ2UubWVzc2FnZUtleTtcbiAgICB0aGlzLndpbmRvdyA9IGhvc3RPYmplY3Qud2luZG93O1xuICAgIE1lc3NhZ2VTb3VyY2UucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG5mdW5jdGlvbiBTdG9yYWdlTWVzc2FnZVNvdXJjZSRhZGRTb3VyY2VTdWJzY3JpYmVyKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICB0aGlzLndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzdG9yYWdlJywgdGhpcywgZmFsc2UpO1xufVxuXG5cbmZ1bmN0aW9uIFN0b3JhZ2VNZXNzYWdlU291cmNlJHJlbW92ZVNvdXJjZVN1YnNjcmliZXIoc291cmNlTWVzc2FnZSkge1xuICAgIHRoaXMud2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3N0b3JhZ2UnLCB0aGlzLCBmYWxzZSk7XG59XG5cblxuZnVuY3Rpb24gU3RvcmFnZU1lc3NhZ2VTb3VyY2UkcG9zdE1lc3NhZ2UobWVzc2FnZSwgZGF0YSkge1xuICAgIHRoaXMubWVzc2VuZ2VyLnBvc3RNZXNzYWdlU3luYyhtZXNzYWdlLCBkYXRhKTtcbn1cblxuXG5mdW5jdGlvbiBTdG9yYWdlTWVzc2FnZVNvdXJjZSR0cmlnZ2VyKG1zZ1R5cGUsIGRhdGEpIHtcbiAgICB2YXIga2V5ID0gdGhpcy5tZXNzYWdlS2V5ICsgbXNnVHlwZTtcbiAgICBkYXRhID0gZGF0YSB8fCB7fTtcbiAgICBkYXRhW2NvbmZpZy5kb21TdG9yYWdlLm1lc3NhZ2VUaW1lc3RhbXBdID0gdW5pcXVlSWQoKTtcbiAgICBfLmRlZmVyTWV0aG9kKHRoaXMuc3RvcmFnZSwgJ3NldEl0ZW0nLCBrZXksIGRhdGEpO1xufVxuXG5cbmZ1bmN0aW9uIGhhbmRsZUV2ZW50KGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnN0b3JhZ2VBcmVhICE9IHRoaXMuc3RvcmFnZS5fc3RvcmFnZSkgcmV0dXJuO1xuICAgIHZhciBrZXkgPSB0aGlzLnN0b3JhZ2UuX2RvbVN0b3JhZ2VLZXkoZXZlbnQua2V5KTsgaWYgKCEga2V5KSByZXR1cm47XG4gICAgdmFyIG1zZ1R5cGUgPSBfLnVuUHJlZml4KGtleSwgdGhpcy5tZXNzYWdlS2V5KTsgaWYgKCEgbXNnVHlwZSkgcmV0dXJuO1xuICAgIHZhciBkYXRhID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0oa2V5KTsgaWYgKCEgZGF0YSkgcmV0dXJuO1xuICAgIHRoaXMuZGlzcGF0Y2hNZXNzYWdlKG1zZ1R5cGUsIGRhdGEpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdGltZXN0YW1wID0gRGF0ZS5ub3coKVxuICAgICwgY291bnQgPSAnJ1xuICAgICwgdW5pcXVlSUQgPSAnJyArIHRpbWVzdGFtcDtcblxuZnVuY3Rpb24gdW5pcXVlQ291bnQoKSB7XG4gICAgdmFyIG5ld1RpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgdW5pcXVlSUQgPSAnJyArIG5ld1RpbWVzdGFtcDtcbiAgICBpZiAodGltZXN0YW1wID09IG5ld1RpbWVzdGFtcCkge1xuICAgICAgICBjb3VudCA9IGNvdW50ID09PSAnJyA/IDAgOiBjb3VudCArIDE7XG4gICAgICAgIHVuaXF1ZUlEICs9ICdfJyArIGNvdW50O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRpbWVzdGFtcCA9IG5ld1RpbWVzdGFtcDtcbiAgICAgICAgY291bnQgPSAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gdW5pcXVlSUQ7XG59XG5cbnVuaXF1ZUNvdW50LmdldCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB1bmlxdWVJRDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB1bmlxdWVDb3VudDtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBgbWlsby51dGlsLndlYnNvY2tldGAgXG4qKi9cblxuXG52YXIgTWVzc2VuZ2VyID0gcmVxdWlyZSgnbWlsby1jb3JlJykuTWVzc2VuZ2VyXG4gICAgLCBXU01lc3NhZ2VTb3VyY2UgPSByZXF1aXJlKCcuL21zZ19zcmMnKVxuICAgICwgV1NNc2dBUEkgPSByZXF1aXJlKCcuL21zZ19hcGknKTtcblxuXG5mdW5jdGlvbiB3ZWJzb2NrZXQoKSB7XG4gICAgdmFyIHdzTWVzc2VuZ2VyID0gbmV3IE1lc3NlbmdlcjtcbiAgICB2YXIgd3NNc2dTb3VyY2UgPSBuZXcgV1NNZXNzYWdlU291cmNlKHdzTWVzc2VuZ2VyLCB7IHNlbmQ6ICd0cmlnZ2VyJywgY29ubmVjdDogJ2Nvbm5lY3QnIH0sIG5ldyBXU01zZ0FQSSk7XG4gICAgd3NNZXNzZW5nZXIuX3NldE1lc3NhZ2VTb3VyY2Uod3NNc2dTb3VyY2UpO1xuICAgIHJldHVybiB3c01lc3Nlbmdlcjtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IHdlYnNvY2tldDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1pbG9Db3JlID0gcmVxdWlyZSgnbWlsby1jb3JlJylcbiAgICAsIE1lc3NlbmdlckFQSSA9IG1pbG9Db3JlLmNsYXNzZXMuTWVzc2VuZ2VyQVBJXG4gICAgLCBfID0gbWlsb0NvcmUucHJvdG9cbiAgICAsIGNoZWNrID0gbWlsb0NvcmUudXRpbC5jaGVja1xuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxuXG52YXIgV1NNc2dBUEkgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NlbmdlckFQSSwgJ1dTTXNnQVBJJywgdHJ1ZSk7XG5cblxuXy5leHRlbmRQcm90byhXU01zZ0FQSSwge1xuICAgIHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZTogdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlLFxuICAgIGZpbHRlclNvdXJjZU1lc3NhZ2U6IGZpbHRlclNvdXJjZU1lc3NhZ2UsXG4gICAgY3JlYXRlSW50ZXJuYWxEYXRhOiBjcmVhdGVJbnRlcm5hbERhdGFcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdTTXNnQVBJO1xuXG5cbnZhciBTT0NLRVRfTUVTU0FHRVMgPSBbJ29wZW4nLCAnY2xvc2UnLCAnZXJyb3InLCAnbWVzc2FnZSddO1xuXG5mdW5jdGlvbiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHJldHVybiBTT0NLRVRfTUVTU0FHRVMuaW5kZXhPZihtZXNzYWdlKSA+PSAwXG4gICAgICAgICAgICA/IG1lc3NhZ2VcbiAgICAgICAgICAgIDogJ21lc3NhZ2UnO1xufVxuXG5cbmZ1bmN0aW9uIGZpbHRlclNvdXJjZU1lc3NhZ2Uoc291cmNlTWVzc2FnZSwgbWVzc2FnZSwgbXNnRGF0YSkge1xuICAgIGlmIChTT0NLRVRfTUVTU0FHRVMuaW5kZXhPZihtZXNzYWdlKSA+PSAwKSByZXR1cm4gdHJ1ZTsgLy8gaW50ZXJuYWwgbWVzc2FnZSBpcyBvbmUgb2YgZXh0ZXJuYWwgbWVzc2FnZXNcbiAgICBpZiAoc291cmNlTWVzc2FnZSA9PSAnbWVzc2FnZScpIHtcbiAgICAgICAgdmFyIG1zZ1R5cGUgPSBtc2dEYXRhICYmIG1zZ0RhdGEudHlwZTtcbiAgICAgICAgcmV0dXJuIG1zZ1R5cGUgPT0gbWVzc2FnZTsgLy8gdHlwZSBlcXVhbHMgaW50ZXJuYWwgbWVzc2FnZVxuICAgIH1cbn07XG5cblxuZnVuY3Rpb24gY3JlYXRlSW50ZXJuYWxEYXRhKHNvdXJjZU1lc3NhZ2UsIG1lc3NhZ2UsIGV2ZW50KSB7XG4gICAgdmFyIGludGVybmFsRGF0YSA9IHNvdXJjZU1lc3NhZ2UgPT0gJ21lc3NhZ2UnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IF8uanNvblBhcnNlKGV2ZW50LmRhdGEpIHx8IGV2ZW50LmRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIDogZXZlbnQ7XG4gICAgcmV0dXJuIGludGVybmFsRGF0YTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgbWlsb0NvcmUgPSByZXF1aXJlKCdtaWxvLWNvcmUnKVxuICAgICwgTWVzc2FnZVNvdXJjZSA9IG1pbG9Db3JlLmNsYXNzZXMuTWVzc2FnZVNvdXJjZVxuICAgICwgXyA9IG1pbG9Db3JlLnByb3RvXG4gICAgLCBsb2dnZXIgPSBtaWxvQ29yZS51dGlsLmxvZ2dlclxuICAgICwgdW5pcXVlSWQgPSByZXF1aXJlKCcuLi8uLi91dGlsL3VuaXF1ZV9pZCcpXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuLi8uLi9jb25maWcnKVxuICAgICwgY2hlY2sgPSBtaWxvQ29yZS51dGlsLmNoZWNrXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5cbnZhciBXU01lc3NhZ2VTb3VyY2UgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NhZ2VTb3VyY2UsICdXU01lc3NhZ2VTb3VyY2UnLCB0cnVlKTtcblxuXG5fLmV4dGVuZFByb3RvKFdTTWVzc2FnZVNvdXJjZSwge1xuICAgIC8vIGltcGxlbWVudGluZyBNZXNzYWdlU291cmNlIGludGVyZmFjZVxuICAgIGFkZFNvdXJjZVN1YnNjcmliZXI6IGFkZFNvdXJjZVN1YnNjcmliZXIsXG4gICAgcmVtb3ZlU291cmNlU3Vic2NyaWJlcjogcmVtb3ZlU291cmNlU3Vic2NyaWJlcixcbiAgICBcbiAgICAvLyBjbGFzcyBzcGVjaWZpYyBtZXRob2RzXG4gICAgaGFuZGxlRXZlbnQ6IFdTTWVzc2FnZVNvdXJjZSRoYW5kbGVFdmVudCxcbiAgICBjb25uZWN0OiBXU01lc3NhZ2VTb3VyY2UkY29ubmVjdCxcbiAgICB0cmlnZ2VyOiBXU01lc3NhZ2VTb3VyY2UkdHJpZ2dlclxufSk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBXU01lc3NhZ2VTb3VyY2U7XG5cblxuZnVuY3Rpb24gV1NNZXNzYWdlU291cmNlJGNvbm5lY3Qob3B0aW9ucykge1xuICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHZhciBob3N0ID0gb3B0aW9ucy5ob3N0IHx8IHdpbmRvdy5sb2NhdGlvbi5ob3N0LnJlcGxhY2UoLzouKi8sICcnKVxuICAgICAgICAsIHBvcnQgPSBvcHRpb25zLnBvcnQgfHwgJzgwODAnO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgaWYgKHRoaXMuX3dzKSB7XG4gICAgICAgIC8vIFRPRE8gc2hvdWxkIHVuc3Vic2NyaWJlIGRpZmZlcmVudGx5XG4gICAgICAgIHRoaXMuX3dzLm9ub3BlbiA9IHRoaXMud3Mub25tZXNzYWdlID0gdGhpcy53cy5vbmNsb3NlID0gdGhpcy53cy5vbmVycm9yID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl93cy5jbG9zZSgpO1xuICAgIH1cblxuICAgIHRoaXMuX3dzID0gbmV3IFdlYlNvY2tldCgnd3M6Ly8nICsgaG9zdCArICc6JyArIHBvcnQpO1xuXG4gICAgLy8gVE9ETyByZWNvbm5lY3Rcbn1cblxuXG5cbmZ1bmN0aW9uIGFkZFNvdXJjZVN1YnNjcmliZXIgKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICBfd3NTdWJzY3JpYmVyTWV0aG9kLmNhbGwodGhpcywgJ2FkZEV2ZW50TGlzdGVuZXInLCBzb3VyY2VNZXNzYWdlKTtcbn1cblxuXG5mdW5jdGlvbiByZW1vdmVTb3VyY2VTdWJzY3JpYmVyIChzb3VyY2VNZXNzYWdlKSB7XG4gICAgX3dzU3Vic2NyaWJlck1ldGhvZC5jYWxsKHRoaXMsICdyZW1vdmVFdmVudExpc3RlbmVyJywgc291cmNlTWVzc2FnZSk7XG59XG5cblxuZnVuY3Rpb24gX3dzU3Vic2NyaWJlck1ldGhvZCAobWV0aG9kLCBzb3VyY2VNZXNzYWdlKSB7ICAgIFxuICAgIGlmICghdGhpcy5fd3MpIHJldHVybiBsb2dnZXIuZXJyb3IoJ3dlYnNvY2tldCBpcyBub3QgY3JlYXRlZCcpO1xuICAgIHRoaXMuX3dzW21ldGhvZF0oc291cmNlTWVzc2FnZSwgdGhpcyk7XG59XG5cblxuLy8gZXZlbnQgZGlzcGF0Y2hlciAtIGFzIGRlZmluZWQgYnkgRXZlbnQgRE9NIEFQSVxuZnVuY3Rpb24gV1NNZXNzYWdlU291cmNlJGhhbmRsZUV2ZW50IChldmVudCkge1xuICAgIHRoaXMuZGlzcGF0Y2hNZXNzYWdlKGV2ZW50LnR5cGUsIGV2ZW50KTtcbn1cblxuXG5mdW5jdGlvbiBXU01lc3NhZ2VTb3VyY2UkdHJpZ2dlciAobXNnLCBkYXRhLCBjYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5fd3MpIHJldHVybiBsb2dnZXIuZXJyb3IoJ3dlYnNvY2tldCBpcyBub3QgY3JlYXRlZCcpO1xuXG4gICAgZGF0YSA9IGRhdGEgfHwge307XG4gICAgZGF0YS50eXBlID0gbXNnO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIFxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBkYXRhLmNhbGxiYWNrQ29ycklkID0gdW5pcXVlSWQoKTtcbiAgICAgICAgdmFyIGludGVydmFsID0gXy5kZWxheShvblRpbWVvdXQsIGNvbmZpZy53ZWJzb2NrZXQucnBjLnRpbWVvdXQpO1xuICAgICAgICB0b2dnbGVScGNTdWJzY3JpcHRpb24oJ29uY2UnLCBkYXRhLmNhbGxiYWNrQ29ycklkKTtcbiAgICB9ICAgIFxuXG4gICAgdGhpcy5fd3Muc2VuZChKU09OLnN0cmluZ2lmeShkYXRhKSk7XG5cblxuICAgIGZ1bmN0aW9uIG9uVGltZW91dCgpIHtcbiAgICAgICAgdG9nZ2xlUnBjU3Vic2NyaXB0aW9uKCdvZmYnLCBkYXRhLmNhbGxiYWNrQ29ycklkKTtcbiAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKCd3ZWJzb2NrZXQgcnBjOiB0aW1lb3V0JykpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uUmVzcG9uc2UobXNnLCBtc2dEYXRhKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICBpZiAodHlwZW9mIG1zZ0RhdGEgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHZhciBlcnIgPSBtc2dEYXRhLmVycm9yID8gbmV3IEVycm9yKG1zZ0RhdGEuZXJyb3IpIDogbnVsbDtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgbXNnRGF0YS5kYXRhKVxuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcignd2Vic29ja2V0IHJwYzogaW52YWxpZCByZXNwb25zZSBkYXRhJyksIG1zZ0RhdGEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvZ2dsZVJwY1N1YnNjcmlwdGlvbihvbk9mZiwgY29ycklkKSB7XG4gICAgICAgIHNlbGYubWVzc2VuZ2VyW29uT2ZmXShjb25maWcud2Vic29ja2V0LnJwYy5yZXNwb25zZVByZWZpeCArIGNvcnJJZCwgb25SZXNwb25zZSk7XG4gICAgfVxufVxuIiwiOyhmdW5jdGlvbigpe1xuXG4vLyBUaGlzIHdvdWxkIGJlIHRoZSBwbGFjZSB0byBlZGl0IGlmIHlvdSB3YW50IGEgZGlmZmVyZW50XG4vLyBCYXNlMzIgaW1wbGVtZW50YXRpb25cblxudmFyIGFscGhhYmV0ID0gJzAxMjM0NTY3ODlhYmNkZWZnaGprbW5wcXJ0dXZ3eHl6J1xudmFyIGFsaWFzID0geyBvOjAsIGk6MSwgbDoxLCBzOjUgfVxuXG4vKipcbiAqIEJ1aWxkIGEgbG9va3VwIHRhYmxlIGFuZCBtZW1vaXplIGl0XG4gKlxuICogUmV0dXJuIGFuIG9iamVjdCB0aGF0IG1hcHMgYSBjaGFyYWN0ZXIgdG8gaXRzXG4gKiBieXRlIHZhbHVlLlxuICovXG5cbnZhciBsb29rdXAgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdGFibGUgPSB7fVxuICAgIC8vIEludmVydCAnYWxwaGFiZXQnXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbHBoYWJldC5sZW5ndGg7IGkrKykge1xuICAgICAgICB0YWJsZVthbHBoYWJldFtpXV0gPSBpXG4gICAgfVxuICAgIC8vIFNwbGljZSBpbiAnYWxpYXMnXG4gICAgZm9yICh2YXIga2V5IGluIGFsaWFzKSB7XG4gICAgICAgIGlmICghYWxpYXMuaGFzT3duUHJvcGVydHkoa2V5KSkgY29udGludWVcbiAgICAgICAgdGFibGVba2V5XSA9IHRhYmxlWycnICsgYWxpYXNba2V5XV1cbiAgICB9XG4gICAgbG9va3VwID0gZnVuY3Rpb24oKSB7IHJldHVybiB0YWJsZSB9XG4gICAgcmV0dXJuIHRhYmxlXG59XG5cbi8qKlxuICogQSBzdHJlYW1pbmcgZW5jb2RlclxuICpcbiAqICAgICB2YXIgZW5jb2RlciA9IG5ldyBiYXNlMzIuRW5jb2RlcigpXG4gKiAgICAgdmFyIG91dHB1dDEgPSBlbmNvZGVyLnVwZGF0ZShpbnB1dDEpXG4gKiAgICAgdmFyIG91dHB1dDIgPSBlbmNvZGVyLnVwZGF0ZShpbnB1dDIpXG4gKiAgICAgdmFyIGxhc3RvdXRwdXQgPSBlbmNvZGUudXBkYXRlKGxhc3RpbnB1dCwgdHJ1ZSlcbiAqL1xuXG5mdW5jdGlvbiBFbmNvZGVyKCkge1xuICAgIHZhciBza2lwID0gMCAvLyBob3cgbWFueSBiaXRzIHdlIHdpbGwgc2tpcCBmcm9tIHRoZSBmaXJzdCBieXRlXG4gICAgdmFyIGJpdHMgPSAwIC8vIDUgaGlnaCBiaXRzLCBjYXJyeSBmcm9tIG9uZSBieXRlIHRvIHRoZSBuZXh0XG5cbiAgICB0aGlzLm91dHB1dCA9ICcnXG5cbiAgICAvLyBSZWFkIG9uZSBieXRlIG9mIGlucHV0XG4gICAgLy8gU2hvdWxkIG5vdCByZWFsbHkgYmUgdXNlZCBleGNlcHQgYnkgXCJ1cGRhdGVcIlxuICAgIHRoaXMucmVhZEJ5dGUgPSBmdW5jdGlvbihieXRlKSB7XG4gICAgICAgIC8vIGNvZXJjZSB0aGUgYnl0ZSB0byBhbiBpbnRcbiAgICAgICAgaWYgKHR5cGVvZiBieXRlID09ICdzdHJpbmcnKSBieXRlID0gYnl0ZS5jaGFyQ29kZUF0KDApXG5cbiAgICAgICAgaWYgKHNraXAgPCAwKSB7IC8vIHdlIGhhdmUgYSBjYXJyeSBmcm9tIHRoZSBwcmV2aW91cyBieXRlXG4gICAgICAgICAgICBiaXRzIHw9IChieXRlID4+ICgtc2tpcCkpXG4gICAgICAgIH0gZWxzZSB7IC8vIG5vIGNhcnJ5XG4gICAgICAgICAgICBiaXRzID0gKGJ5dGUgPDwgc2tpcCkgJiAyNDhcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChza2lwID4gMykge1xuICAgICAgICAgICAgLy8gbm90IGVub3VnaCBkYXRhIHRvIHByb2R1Y2UgYSBjaGFyYWN0ZXIsIGdldCB1cyBhbm90aGVyIG9uZVxuICAgICAgICAgICAgc2tpcCAtPSA4XG4gICAgICAgICAgICByZXR1cm4gMVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNraXAgPCA0KSB7XG4gICAgICAgICAgICAvLyBwcm9kdWNlIGEgY2hhcmFjdGVyXG4gICAgICAgICAgICB0aGlzLm91dHB1dCArPSBhbHBoYWJldFtiaXRzID4+IDNdXG4gICAgICAgICAgICBza2lwICs9IDVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAwXG4gICAgfVxuXG4gICAgLy8gRmx1c2ggYW55IHJlbWFpbmluZyBiaXRzIGxlZnQgaW4gdGhlIHN0cmVhbVxuICAgIHRoaXMuZmluaXNoID0gZnVuY3Rpb24oY2hlY2spIHtcbiAgICAgICAgdmFyIG91dHB1dCA9IHRoaXMub3V0cHV0ICsgKHNraXAgPCAwID8gYWxwaGFiZXRbYml0cyA+PiAzXSA6ICcnKSArIChjaGVjayA/ICckJyA6ICcnKVxuICAgICAgICB0aGlzLm91dHB1dCA9ICcnXG4gICAgICAgIHJldHVybiBvdXRwdXRcbiAgICB9XG59XG5cbi8qKlxuICogUHJvY2VzcyBhZGRpdGlvbmFsIGlucHV0XG4gKlxuICogaW5wdXQ6IHN0cmluZyBvZiBieXRlcyB0byBjb252ZXJ0XG4gKiBmbHVzaDogYm9vbGVhbiwgc2hvdWxkIHdlIGZsdXNoIGFueSB0cmFpbGluZyBiaXRzIGxlZnRcbiAqICAgICAgICBpbiB0aGUgc3RyZWFtXG4gKiByZXR1cm5zOiBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzIHJlcHJlc2VudGluZyAnaW5wdXQnIGluIGJhc2UzMlxuICovXG5cbkVuY29kZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKGlucHV0LCBmbHVzaCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyApIHtcbiAgICAgICAgaSArPSB0aGlzLnJlYWRCeXRlKGlucHV0W2ldKVxuICAgIH1cbiAgICAvLyBjb25zdW1lIGFsbCBvdXRwdXRcbiAgICB2YXIgb3V0cHV0ID0gdGhpcy5vdXRwdXRcbiAgICB0aGlzLm91dHB1dCA9ICcnXG4gICAgaWYgKGZsdXNoKSB7XG4gICAgICBvdXRwdXQgKz0gdGhpcy5maW5pc2goKVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0XG59XG5cbi8vIEZ1bmN0aW9ucyBhbmFsb2dvdXNseSB0byBFbmNvZGVyXG5cbmZ1bmN0aW9uIERlY29kZXIoKSB7XG4gICAgdmFyIHNraXAgPSAwIC8vIGhvdyBtYW55IGJpdHMgd2UgaGF2ZSBmcm9tIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXJcbiAgICB2YXIgYnl0ZSA9IDAgLy8gY3VycmVudCBieXRlIHdlJ3JlIHByb2R1Y2luZ1xuXG4gICAgdGhpcy5vdXRwdXQgPSAnJ1xuXG4gICAgLy8gQ29uc3VtZSBhIGNoYXJhY3RlciBmcm9tIHRoZSBzdHJlYW0sIHN0b3JlXG4gICAgLy8gdGhlIG91dHB1dCBpbiB0aGlzLm91dHB1dC4gQXMgYmVmb3JlLCBiZXR0ZXJcbiAgICAvLyB0byB1c2UgdXBkYXRlKCkuXG4gICAgdGhpcy5yZWFkQ2hhciA9IGZ1bmN0aW9uKGNoYXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjaGFyICE9ICdzdHJpbmcnKXtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2hhciA9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIGNoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2hhciA9IGNoYXIudG9Mb3dlckNhc2UoKVxuICAgICAgICB2YXIgdmFsID0gbG9va3VwKClbY2hhcl1cbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIGNoYXJhY3RlciBkb2VzIG5vdCBleGlzdCBpbiBvdXIgbG9va3VwIHRhYmxlXG4gICAgICAgICAgICByZXR1cm4gLy8gc2tpcCBzaWxlbnRseS4gQW4gYWx0ZXJuYXRpdmUgd291bGQgYmU6XG4gICAgICAgICAgICAvLyB0aHJvdyBFcnJvcignQ291bGQgbm90IGZpbmQgY2hhcmFjdGVyIFwiJyArIGNoYXIgKyAnXCIgaW4gbG9va3VwIHRhYmxlLicpXG4gICAgICAgIH1cbiAgICAgICAgdmFsIDw8PSAzIC8vIG1vdmUgdG8gdGhlIGhpZ2ggYml0c1xuICAgICAgICBieXRlIHw9IHZhbCA+Pj4gc2tpcFxuICAgICAgICBza2lwICs9IDVcbiAgICAgICAgaWYgKHNraXAgPj0gOCkge1xuICAgICAgICAgICAgLy8gd2UgaGF2ZSBlbm91Z2ggdG8gcHJlZHVjZSBvdXRwdXRcbiAgICAgICAgICAgIHRoaXMub3V0cHV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZSlcbiAgICAgICAgICAgIHNraXAgLT0gOFxuICAgICAgICAgICAgaWYgKHNraXAgPiAwKSBieXRlID0gKHZhbCA8PCAoNSAtIHNraXApKSAmIDI1NVxuICAgICAgICAgICAgZWxzZSBieXRlID0gMFxuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICB0aGlzLmZpbmlzaCA9IGZ1bmN0aW9uKGNoZWNrKSB7XG4gICAgICAgIHZhciBvdXRwdXQgPSB0aGlzLm91dHB1dCArIChza2lwIDwgMCA/IGFscGhhYmV0W2JpdHMgPj4gM10gOiAnJykgKyAoY2hlY2sgPyAnJCcgOiAnJylcbiAgICAgICAgdGhpcy5vdXRwdXQgPSAnJ1xuICAgICAgICByZXR1cm4gb3V0cHV0XG4gICAgfVxufVxuXG5EZWNvZGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbihpbnB1dCwgZmx1c2gpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMucmVhZENoYXIoaW5wdXRbaV0pXG4gICAgfVxuICAgIHZhciBvdXRwdXQgPSB0aGlzLm91dHB1dFxuICAgIHRoaXMub3V0cHV0ID0gJydcbiAgICBpZiAoZmx1c2gpIHtcbiAgICAgIG91dHB1dCArPSB0aGlzLmZpbmlzaCgpXG4gICAgfVxuICAgIHJldHVybiBvdXRwdXRcbn1cblxuLyoqIENvbnZlbmllbmNlIGZ1bmN0aW9uc1xuICpcbiAqIFRoZXNlIGFyZSB0aGUgb25lcyB0byB1c2UgaWYgeW91IGp1c3QgaGF2ZSBhIHN0cmluZyBhbmRcbiAqIHdhbnQgdG8gY29udmVydCBpdCB3aXRob3V0IGRlYWxpbmcgd2l0aCBzdHJlYW1zIGFuZCB3aGF0bm90LlxuICovXG5cbi8vIFN0cmluZyBvZiBkYXRhIGdvZXMgaW4sIEJhc2UzMi1lbmNvZGVkIHN0cmluZyBjb21lcyBvdXQuXG5mdW5jdGlvbiBlbmNvZGUoaW5wdXQpIHtcbiAgdmFyIGVuY29kZXIgPSBuZXcgRW5jb2RlcigpXG4gIHZhciBvdXRwdXQgPSBlbmNvZGVyLnVwZGF0ZShpbnB1dCwgdHJ1ZSlcbiAgcmV0dXJuIG91dHB1dFxufVxuXG4vLyBCYXNlMzItZW5jb2RlZCBzdHJpbmcgZ29lcyBpbiwgZGVjb2RlZCBkYXRhIGNvbWVzIG91dC5cbmZ1bmN0aW9uIGRlY29kZShpbnB1dCkge1xuICAgIHZhciBkZWNvZGVyID0gbmV3IERlY29kZXIoKVxuICAgIHZhciBvdXRwdXQgPSBkZWNvZGVyLnVwZGF0ZShpbnB1dCwgdHJ1ZSlcbiAgICByZXR1cm4gb3V0cHV0XG59XG5cbnZhciBiYXNlMzIgPSB7XG4gICAgRGVjb2RlcjogRGVjb2RlcixcbiAgICBFbmNvZGVyOiBFbmNvZGVyLFxuICAgIGVuY29kZTogZW5jb2RlLFxuICAgIGRlY29kZTogZGVjb2RlXG59XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAvLyB3ZSdyZSBpbiBhIGJyb3dzZXIgLSBPTUchXG4gIHdpbmRvdy5iYXNlMzIgPSBiYXNlMzJcbn1cblxuaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gIC8vIG5vZGVqcy9icm93c2VyaWZ5XG4gIG1vZHVsZS5leHBvcnRzID0gYmFzZTMyXG59XG59KSgpO1xuIiwiXG4vLyBub3QgaW1wbGVtZW50ZWRcbi8vIFRoZSByZWFzb24gZm9yIGhhdmluZyBhbiBlbXB0eSBmaWxlIGFuZCBub3QgdGhyb3dpbmcgaXMgdG8gYWxsb3dcbi8vIHVudHJhZGl0aW9uYWwgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtb2R1bGUuXG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBfID0gcmVxdWlyZSgnbW9sLXByb3RvJylcbiAgICAsIGNoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9jaGVjaycpXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IE1peGluO1xuXG4vKipcbiAqIGBtaWxvLmNsYXNzZXMuTWl4aW5gIC0gYW4gYWJzdHJhY3QgTWl4aW4gY2xhc3MuXG4gKiBDYW4gYmUgc3ViY2xhc3NlZCB1c2luZzpcbiAqIGBgYFxuICogdmFyIE15TWl4aW4gPSBfLmNyZWF0ZVN1YmNsYXNzKG1pbG8uY2xhc3Nlcy5NaXhpbiwgJ015TWl4aW4nKTtcbiAqIGBgYFxuICpcbiAqIE1peGluIHBhdHRlcm4gaXMgYWxzbyB1c2VkLCBidXQgTWl4aW4gaW4gbWlsbyBpcyBpbXBsZW1lbnRlZCBhcyBhIHNlcGFyYXRlIG9iamVjdCB0aGF0IGlzIHN0b3JlZCBvbiB0aGUgcHJvcGVydHkgb2YgdGhlIGhvc3Qgb2JqZWN0IGFuZCBjYW4gY3JlYXRlIHByb3h5IG1ldGhvZHMgb24gdGhlIGhvc3Qgb2JqZWN0IGlmIHJlcXVpcmVkLlxuICogQ2xhc3NlcyBbTWVzc2VuZ2VyXSguLi9tZXNzZW5nZXIvaW5kZXguanMuaHRtbCkgYW5kIFtNZXNzYWdlU291cmNlXSguLi9tZXNzZW5nZXIvbV9zb3VyY2UuanMuaHRtbCkgYXJlIHN1YmNsYXNzZXMgb2YgTWl4aW4gYWJzdHJhY3QgY2xhc3MuIGB0aGlzYCBpbiBwcm94eSBtZXRob2RzIHJlZmVycyB0byBNaXhpbiBpbnN0YW5jZSwgdGhlIHJlZmVyZW5jZSB0byB0aGUgaG9zdCBvYmplY3QgaXMgYHRoaXMuX2hvc3RPYmplY3RgLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBob3N0T2JqZWN0IE9wdGlvbmFsIG9iamVjdCB3aGVyZSBhIE1peGluIGluc3RhbmNlIHdpbGwgYmUgc3RvcmVkIG9uLiBJdCBpcyB1c2VkIHRvIHByb3h5IG1ldGhvZHMgYW5kIGFsc28gdG8gZmluZCB0aGUgcmVmZXJlbmNlIHdoZW4gaXQgaXMgbmVlZGVkIGZvciBob3N0IG9iamVjdCBpbXBsZW1lbnRhdGlvbi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm94eU1ldGhvZHMgT3B0aW9uYWwgbWFwIG9mIHByb3h5IG1ldGhvZCBuYW1lcyBhcyBrZXlzIGFuZCBNaXhpbiBtZXRob2RzIG5hbWVzIGFzIHZhbHVlcywgc28gcHJveGllZCBtZXRob2RzIGNhbiBiZSByZW5hbWVkIHRvIGF2b2lkIG5hbWUtc3BhY2UgY29uZmxpY3RzIGlmIHR3byBkaWZmZXJlbnQgTWl4aW4gaW5zdGFuY2VzIHdpdGggdGhlIHNhbWUgbWV0aG9kIG5hbWVzIGFyZSBwdXQgb24gdGhlIG9iamVjdFxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgYWxsIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBpbml0IG1ldGhvZCBvZiBNaXhpbiBzdWJjbGFzcyB0b2dldGhlciB3aXRoIGhvc3RPYmplY3QgYW5kIHByb3h5TWV0aG9kc1xuICogQHJldHVybiB7TWl4aW59XG4gKi9cbmZ1bmN0aW9uIE1peGluKGhvc3RPYmplY3QsIHByb3h5TWV0aG9kcykgeyAvLyAsIG90aGVyIGFyZ3MgLSBwYXNzZWQgdG8gaW5pdCBtZXRob2RcbiAgICBjaGVjayhob3N0T2JqZWN0LCBNYXRjaC5PcHRpb25hbChNYXRjaC5PbmVPZihPYmplY3QsIEZ1bmN0aW9uKSkpO1xuXG4gICAgLy8gc3RvcmUgaG9zdE9iamVjdFxuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgJ19ob3N0T2JqZWN0JywgaG9zdE9iamVjdCk7XG5cbiAgICAvLyBwcm94eSBtZXRob2RzIHRvIGhvc3RPYmplY3RcbiAgICBpZiAocHJveHlNZXRob2RzKVxuICAgICAgICB0aGlzLl9jcmVhdGVQcm94eU1ldGhvZHMocHJveHlNZXRob2RzKTtcblxuICAgIC8vIGNhbGxpbmcgaW5pdCBpZiBpdCBpcyBkZWZpbmVkIGluIHRoZSBjbGFzc1xuICAgIGlmICh0aGlzLmluaXQpXG4gICAgICAgIHRoaXMuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5cbi8qKlxuICogIyMjI01peGluIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKiBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgYnkgY29uc3RydWN0b3IsIHRoZXkgYXJlIG5vdCB0byBiZSBjYWxsZWQgZnJvbSBzdWJjbGFzc2VzLlxuICpcbiAqIC0gW19jcmVhdGVQcm94eU1ldGhvZF0oI19jcmVhdGVQcm94eU1ldGhvZClcbiAqIC0gW19jcmVhdGVQcm94eU1ldGhvZHNdKCNfY3JlYXRlUHJveHlNZXRob2RzKVxuICovXG5fLmV4dGVuZFByb3RvKE1peGluLCB7XG4gICAgX2NyZWF0ZVByb3h5TWV0aG9kOiBfY3JlYXRlUHJveHlNZXRob2QsICAvLyBkZXByZWNhdGVkLCBzaG91bGQgbm90IGJlIHVzZWRcbiAgICBfY3JlYXRlUHJveHlNZXRob2RzOiBfY3JlYXRlUHJveHlNZXRob2RzICAvLyBkZXByZWNhdGVkLCBzaG91bGQgbm90IGJlIHVzZWRcbn0pO1xuXG5cbi8qKlxuICogIyMjI01peGluIGNsYXNzIG1ldGhvZHMjIyMjXG4gKiBUaGVzZSBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbiBob3N0IGNsYXNzIGRlY2xhcmF0aW9uLlxuICpcbiAqIC0gW3VzZVdpdGhdKCNNaXhpbiQkdXNlV2l0aClcbiAqL1xuXy5leHRlbmQoTWl4aW4sIHtcbiAgICB1c2VXaXRoOiBNaXhpbiQkdXNlV2l0aFxufSk7XG5cblxuLyoqXG4gKiBDcmVhdGVzIGEgcHJveGllZCBtZXRob2Qgb2YgTWl4aW4gc3ViY2xhc3Mgb24gaG9zdCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1peGluTWV0aG9kTmFtZSBuYW1lIG9mIG1ldGhvZCBpbiBNaXhpbiBzdWJjbGFzc1xuICogQHBhcmFtIHtTdHJpbmd9IHByb3h5TWV0aG9kTmFtZSBuYW1lIG9mIGNyZWF0ZWQgcHJveHkgbWV0aG9kIG9uIGhvc3Qgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gaG9zdE9iamVjdCBPcHRpb25hbCByZWZlcmVuY2UgdG8gdGhlIGhvc3Qgb2JqZWN0OyBpZiBub3Qgc3BlY2lmaWVkIHRoZSBob3N0IG9iamVjdCBwYXNzZWQgdG8gY29uc3RydWN0b3Igd2lsIGJlIHVzZWQuIEl0IGFsbG93cyB0byB1c2UgdGhlIHNhbWUgaW5zdGFuY2Ugb2YgTWl4aW4gb24gdHdvIGhvc3Qgb2JqZWN0cy5cbiAqL1xuZnVuY3Rpb24gX2NyZWF0ZVByb3h5TWV0aG9kKHByb3h5TWV0aG9kTmFtZSwgbWl4aW5NZXRob2ROYW1lLCBob3N0T2JqZWN0KSB7XG4gICAgaG9zdE9iamVjdCA9IGhvc3RPYmplY3QgfHwgdGhpcy5faG9zdE9iamVjdDtcblxuICAgIC8vIE1peGluIGNsYXNzIGRvZXMgbm90IGFsbG93IHNoYWRvd2luZyBtZXRob2RzIHRoYXQgZXhpc3Qgb24gdGhlIGhvc3Qgb2JqZWN0XG4gICAgaWYgKGhvc3RPYmplY3RbcHJveHlNZXRob2ROYW1lXSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtZXRob2QgJyArIHByb3h5TWV0aG9kTmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnIGFscmVhZHkgZGVmaW5lZCBpbiBob3N0IG9iamVjdCcpO1xuXG4gICAgdmFyIG1ldGhvZCA9IHRoaXNbbWl4aW5NZXRob2ROYW1lXVxuICAgIGNoZWNrKG1ldGhvZCwgRnVuY3Rpb24pO1xuXG4gICAgLy8gQmluZCBwcm94aWVkIE1peGluJ3MgbWV0aG9kIHRvIE1peGluIGluc3RhbmNlXG4gICAgdmFyIGJvdW5kTWV0aG9kID0gbWV0aG9kLmJpbmQodGhpcyk7XG5cbiAgICBfLmRlZmluZVByb3BlcnR5KGhvc3RPYmplY3QsIHByb3h5TWV0aG9kTmFtZSwgYm91bmRNZXRob2QsIF8uV1JJVCk7XG59XG5cblxuLyoqXG4gKiBDcmVhdGVzIHByb3hpZWQgbWV0aG9kcyBvZiBNaXhpbiBzdWJjbGFzcyBvbiBob3N0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge0hhc2hbU3RyaW5nXXxBcnJheVtTdHJpbmddfSBwcm94eU1ldGhvZHMgbWFwIG9mIG5hbWVzIG9mIG1ldGhvZHMsIGtleSAtIHByb3h5IG1ldGhvZCBuYW1lLCB2YWx1ZSAtIG1peGluIG1ldGhvZCBuYW1lLiBDYW4gYmUgYXJyYXkuXG4gKiBAcGFyYW0ge09iamVjdH0gaG9zdE9iamVjdCBhbiBvcHRpb25hbCByZWZlcmVuY2UgdG8gdGhlIGhvc3Qgb2JqZWN0OyBpZiBub3Qgc3BlY2lmaWVkIHRoZSBob3N0IG9iamVjdCBwYXNzZWQgdG8gY29uc3RydWN0b3Igd2lsIGJlIHVzZWQuIEl0IGFsbG93cyB0byB1c2UgdGhlIHNhbWUgaW5zdGFuY2Ugb2YgTWl4aW4gb24gdHdvIGhvc3Qgb2JqZWN0cy5cbiAqL1xuZnVuY3Rpb24gX2NyZWF0ZVByb3h5TWV0aG9kcyhwcm94eU1ldGhvZHMsIGhvc3RPYmplY3QpIHtcbiAgICBjaGVjayhwcm94eU1ldGhvZHMsIE1hdGNoLk9wdGlvbmFsKE1hdGNoLk9uZU9mKFtTdHJpbmddLCBNYXRjaC5PYmplY3RIYXNoKFN0cmluZykpKSk7XG5cbiAgICAvLyBjcmVhdGluZyBhbmQgYmluZGluZyBwcm94eSBtZXRob2RzIG9uIHRoZSBob3N0IG9iamVjdFxuICAgIGlmIChBcnJheS5pc0FycmF5KHByb3h5TWV0aG9kcykpXG4gICAgICAgIHByb3h5TWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgICAgIC8vIG1ldGhvZCBjYWxsZWQgdGhpcyB3YXkgdG8gYWxsb3cgdXNpbmcgX2NyZWF0ZVByb3h5TWV0aG9kcyB3aXRoIG9iamVjdHNcbiAgICAgICAgICAgIC8vIHRoYXQgYXJlIG5vdCBpbmhlcml0aW5nIGZyb20gTWl4aW5cbiAgICAgICAgICAgIF9jcmVhdGVQcm94eU1ldGhvZC5jYWxsKHRoaXMsIG1ldGhvZE5hbWUsIG1ldGhvZE5hbWUsIGhvc3RPYmplY3QpO1xuICAgICAgICB9LCB0aGlzKTtcbiAgICBlbHNlXG4gICAgICAgIF8uZWFjaEtleShwcm94eU1ldGhvZHMsIGZ1bmN0aW9uKG1peGluTWV0aG9kTmFtZSwgcHJveHlNZXRob2ROYW1lKSB7XG4gICAgICAgICAgICAvLyBtZXRob2QgY2FsbGVkIHRoaXMgd2F5IHRvIGFsbG93IHVzaW5nIF9jcmVhdGVQcm94eU1ldGhvZHMgd2l0aCBvYmplY3RzXG4gICAgICAgICAgICAvLyB0aGF0IGFyZSBub3QgaW5oZXJpdGluZyBmcm9tIE1peGluXG4gICAgICAgICAgICBfY3JlYXRlUHJveHlNZXRob2QuY2FsbCh0aGlzLCBwcm94eU1ldGhvZE5hbWUsIG1peGluTWV0aG9kTmFtZSwgaG9zdE9iamVjdCk7XG4gICAgICAgIH0sIHRoaXMpO1xufVxuXG5cbi8qKlxuICogU2V0cyBtaXhpbiBpbnN0YW5jZSBwcm9wZXJ0eSBuYW1lIG9uIHRoZSBob3N0IGNsYXNzXG4gKiBDYW4gYmUgY2FsbGVkIG9ubHkgb25jZVxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aGlzIE1peGluIHN1YmNsYXNzIChub3QgaW5zdGFuY2UpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBob3N0Q2xhc3NcbiAqIEBwYXJhbSB7U3RyaW5nfSBpbnN0YW5jZUtleVxuICovXG5mdW5jdGlvbiBNaXhpbl9zZXRJbnN0YW5jZUtleShob3N0Q2xhc3MsIG1ldGhvZCwgaW5zdGFuY2VLZXkpIHtcbiAgICBjaGVjayhob3N0Q2xhc3MsIEZ1bmN0aW9uKTtcbiAgICBjaGVjayhpbnN0YW5jZUtleSwgTWF0Y2guSWRlbnRpZmllclN0cmluZyk7XG5cbiAgICB2YXIgcHJvcCA9IGNvbmZpZy5taXhpbi5pbnN0YW5jZVByb3BlcnRpZXNNYXBcbiAgICAgICAgLCBpbnN0YW5jZUtleXMgPSBob3N0Q2xhc3NbcHJvcF0gPSBob3N0Q2xhc3NbcHJvcF0gfHwge307XG5cbiAgICBpZiAoaW5zdGFuY2VLZXlzW21ldGhvZC5uYW1lXSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXhpbjogaW5zdGFuY2UgcHJvcGVydHkgZm9yIG1ldGhvZCB3aXRoIG5hbWUgJ1xuICAgICAgICAgICAgKyBtZXRob2QubmFtZSArICcgaXMgYWxyZWFkeSBzZXQnKTtcblxuICAgIGluc3RhbmNlS2V5c1ttZXRob2QubmFtZV0gPSBpbnN0YW5jZUtleTtcbn1cblxuXG4vKipcbiAqIEFkZHMgbWV0aG9kIG9mIE1peGluIHN1YmNsYXNzIHRvIGhvc3QgY2xhc3MgcHJvdG90eXBlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aGlzIE1peGluIHN1YmNsYXNzIChub3QgaW5zdGFuY2UpXG4gKiBAcGFyYW0ge1N0cmluZ30gbWl4aW5NZXRob2ROYW1lIG5hbWUgb2YgbWV0aG9kIGluIE1peGluIHN1YmNsYXNzXG4gKiBAcGFyYW0ge1N0cmluZ30gaG9zdE1ldGhvZE5hbWUgKG9wdGlvbmFsKSBuYW1lIG9mIGNyZWF0ZWQgcHJveHkgbWV0aG9kIG9uIGhvc3Qgb2JqZWN0LCBzYW1lIGlmIG5vdCBzcGVjaWZpZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBob3N0T2JqZWN0IG9iamVjdCBjbGFzcywgbXVzdCBiZSBzcGVjaWZpZWQgYXMgdGhlIGxhc3QgcGFyYW1ldGVyICgybmQgb3IgM3JkKVxuICovXG5mdW5jdGlvbiBNaXhpbl9hZGRNZXRob2QoaG9zdENsYXNzLCBpbnN0YW5jZUtleSwgbWl4aW5NZXRob2ROYW1lLCBob3N0TWV0aG9kTmFtZSkge1xuICAgIHZhciBtZXRob2QgPSB0aGlzLnByb3RvdHlwZVttaXhpbk1ldGhvZE5hbWVdO1xuICAgIGNoZWNrKG1ldGhvZCwgRnVuY3Rpb24pO1xuXG4gICAgdmFyIHdyYXBwZWRNZXRob2QgPSBfd3JhcE1peGluTWV0aG9kLmNhbGwodGhpcywgbWV0aG9kKTtcblxuICAgIF8uZGVmaW5lUHJvcGVydHkoaG9zdENsYXNzLnByb3RvdHlwZSwgaG9zdE1ldGhvZE5hbWUsIHdyYXBwZWRNZXRob2QsIF8uV1JJVCk7XG5cbiAgICBNaXhpbl9zZXRJbnN0YW5jZUtleShob3N0Q2xhc3MsIG1ldGhvZCwgaW5zdGFuY2VLZXkpXG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIG1ldGhvZCB0aGF0IHdpbGwgYmUgZXhwb3NlZCBvbiB0aGUgaG9zdCBjbGFzcyBwcm90b3R5cGVcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gdGhpcyBNaXhpbiBzdWJjbGFzcyAobm90IGluc3RhbmNlKVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIF93cmFwTWl4aW5NZXRob2QobWV0aG9kKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkgeyAvLyAsLi4uIGFyZ3VtZW50c1xuICAgICAgICB2YXIgbWl4aW5JbnN0YW5jZSA9IF9nZXRNaXhpbkluc3RhbmNlLmNhbGwodGhpcywgbWV0aG9kLm5hbWUpO1xuICAgICAgICByZXR1cm4gbWV0aG9kLmFwcGx5KG1peGluSW5zdGFuY2UsIGFyZ3VtZW50cyk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgcmVmZXJlbmNlIHRvIHRoZSBpbnN0YW5jZSBvZiBtaXhpbiBzdWJjbGFzcy5cbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgd2hlbiBtZXRob2RzIGFyZSBleHBvc2VkIG9uIHRoZSBob3N0IGNsYXNzIHByb3RvdHlwZSAodXNpbmcgYWRkTWVodG9kcykgcmF0aGVyIHRoYW4gb24gaG9zdCBpbnN0YW5jZS5cbiAqIFN1YmNsYXNzZXMgc2hvdWxkIG5vdCB1c2UgdGhpcyBtZXRob2RzIC0gd2hlbmV2ZXIgc3ViY2xhc3MgbWV0aG9kIGlzIGV4cG9zZWQgb24gdGhlIHByb3RvdHlwZSBpdCB3aWxsIGJlIHdyYXBwZWQgdG8gc2V0IGNvcnJlY3QgY29udGV4dCBmb3IgdGhlIHN1YmNsYXNzIG1ldGhvZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBfZ2V0TWl4aW5JbnN0YW5jZShtZXRob2ROYW1lKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBNaXhpbikgcmV0dXJuIHRoaXM7XG4gICAgdmFyIGluc3RhbmNlS2V5cyA9IHRoaXMuY29uc3RydWN0b3JbY29uZmlnLm1peGluLmluc3RhbmNlUHJvcGVydGllc01hcF1cbiAgICByZXR1cm4gdGhpc1tpbnN0YW5jZUtleXNbbWV0aG9kTmFtZV1dO1xufVxuXG5cbi8qKlxuICogQWRkcyBtZXRob2RzIG9mIE1peGluIHN1YmNsYXNzIHRvIGhvc3QgY2xhc3MgcHJvdG90eXBlLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRoaXMgTWl4aW4gc3ViY2xhc3MgKG5vdCBpbnN0YW5jZSlcbiAqIEBwYXJhbSB7T2JqZWN0fSBob3N0Q2xhc3MgaG9zdCBvYmplY3QgY2xhc3M7IG11c3QgYmUgc3BlY2lmaWVkLlxuICogQHBhcmFtIHtTdHJpbmd9IGluc3RhbmNlS2V5IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGUgaG9zdCBjbGFzcyBpbnN0YW5jZSB3aWxsIHN0b3JlIG1peGluIGluc3RhbmNlIG9uXG4gKiBAcGFyYW0ge0hhc2hbU3RyaW5nXXxBcnJheVtTdHJpbmddfSBtaXhpbk1ldGhvZHMgbWFwIG9mIG5hbWVzIG9mIG1ldGhvZHMsIGtleSAtIGhvc3QgbWV0aG9kIG5hbWUsIHZhbHVlIC0gbWl4aW4gbWV0aG9kIG5hbWUuIENhbiBiZSBhcnJheS5cbiAqL1xuZnVuY3Rpb24gTWl4aW4kJHVzZVdpdGgoaG9zdENsYXNzLCBpbnN0YW5jZUtleSwgbWl4aW5NZXRob2RzKSB7XG4gICAgY2hlY2sobWl4aW5NZXRob2RzLCBNYXRjaC5PcHRpb25hbChNYXRjaC5PbmVPZihbU3RyaW5nXSwgTWF0Y2guT2JqZWN0SGFzaChTdHJpbmcpKSkpO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobWl4aW5NZXRob2RzKSlcbiAgICAgICAgbWl4aW5NZXRob2RzLmZvckVhY2goZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgICAgICAgTWl4aW5fYWRkTWV0aG9kLmNhbGwodGhpcywgaG9zdENsYXNzLCBpbnN0YW5jZUtleSwgbWV0aG9kTmFtZSwgbWV0aG9kTmFtZSk7XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIGVsc2VcbiAgICAgICAgXy5lYWNoS2V5KG1peGluTWV0aG9kcywgZnVuY3Rpb24obWl4aW5NZXRob2ROYW1lLCBob3N0TWV0aG9kTmFtZSkge1xuICAgICAgICAgICAgTWl4aW5fYWRkTWV0aG9kLmNhbGwodGhpcywgaG9zdENsYXNzLCBpbnN0YW5jZUtleSwgbWl4aW5NZXRob2ROYW1lLCBob3N0TWV0aG9kTmFtZSk7XG4gICAgICAgIH0sIHRoaXMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyA8YSBuYW1lPVwiY2xhc3Nlc1wiPjwvYT5cbi8vIG1pbG8uY2xhc3Nlc1xuLy8gLS0tLS0tLS0tLS1cblxuLy8gVGhpcyBtb2R1bGUgY29udGFpbnMgZm91bmRhdGlvbiBjbGFzc2VzXG5cbnZhciBjbGFzc2VzID0ge1xuICAgIE1peGluOiByZXF1aXJlKCcuL2Fic3RyYWN0L21peGluJyksXG4gICAgTWVzc2FnZVNvdXJjZTogcmVxdWlyZSgnLi9tZXNzZW5nZXIvbV9zb3VyY2UnKSxcbiAgICBNZXNzZW5nZXJNZXNzYWdlU291cmNlOiByZXF1aXJlKCcuL21lc3Nlbmdlci9tc25ncl9zb3VyY2UnKSxcbiAgICBNZXNzZW5nZXJBUEk6IHJlcXVpcmUoJy4vbWVzc2VuZ2VyL21fYXBpJyksXG4gICAgTWVzc2VuZ2VyUmVnZXhwQVBJOiByZXF1aXJlKCcuL21lc3Nlbmdlci9tX2FwaV9yeCcpXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzZXM7XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbmZpZztcblxuZnVuY3Rpb24gY29uZmlnKG9wdGlvbnMpIHtcbiAgICBfLmRlZXBFeHRlbmQoY29uZmlnLCBvcHRpb25zKTtcbn1cblxuY29uZmlnKHtcbiAgICBtaXhpbjoge1xuICAgICAgICBpbnN0YW5jZVByb3BlcnRpZXNNYXA6ICdfX19taXhpbl9pbnN0YW5jZXMnXG4gICAgfSxcbiAgICBjaGVjazogdHJ1ZSxcbiAgICBkZWJ1ZzogZmFsc2Vcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgTWl4aW4gPSByZXF1aXJlKCcuLi9hYnN0cmFjdC9taXhpbicpXG4gICAgLCBNZXNzYWdlU291cmNlID0gcmVxdWlyZSgnLi9tX3NvdXJjZScpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJylcbiAgICAsIGNoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9jaGVjaycpXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5cbi8qKlxuICogYG1pbG8uTWVzc2VuZ2VyYFxuICogQSBnZW5lcmljIE1lc3NlbmdlciBjbGFzcyB0aGF0IGlzIHVzZWQgZm9yIGFsbCBraW5kcyBvZiBtZXNzYWdpbmcgaW4gbWlsby4gSXQgaXMgc3ViY2xhc3NlZCBmcm9tIFtNaXhpbl0oLi4vYWJzdHJhY3QvbWl4aW4uanMuaHRtbCkgYW5kIGl0IHByb3hpZXMgaXRzIG1ldGhvZHMgdG8gdGhlIGhvc3Qgb2JqZWN0IGZvciBjb252ZW5pZW5jZS5cbiAqIEFsbCBmYWNldHMgYW5kIGNvbXBvbmVudHMgaGF2ZSBtZXNzZW5nZXIgYXR0YWNoZWQgdG8gdGhlbS4gTWVzc2VuZ2VyIGNsYXNzIGludGVyb3BlcmF0ZXMgd2l0aCBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBjbGFzcyB0aGF0IGNvbm5lY3RzIHRoZSBtZXNzZW5nZXIgdG8gc29tZSBleHRlcm5hbCBzb3VyY2Ugb2YgbWVzc2FnZXMgKGUuZy4sIERPTSBldmVudHMpIGFuZCBbTWVzc2VuZ2VyQVBJXSguL21fYXBpLmpzLmh0bWwpIGNsYXNzIHRoYXQgYWxsb3dzIHRvIGRlZmluZSBoaWdoZXIgbGV2ZWwgbWVzc2FnZXMgdGhhbiBtZXNzYWdlcyB0aGF0IGV4aXN0IG9uIHRoZSBzb3VyY2UuXG4gKiBNZXNzZW5nZXIgY2xhc3MgaXMgdXNlZCBpbnRlcm5hbGx5IGluIG1pbG8gYW5kIGNhbiBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggYW55IG9iamVjdHMvY2xhc3NlcyBpbiB0aGUgYXBwbGljYXRpb24uXG4gKiBtaWxvIGFsc28gZGVmaW5lcyBhIGdsb2JhbCBtZXNzZW5nZXIgW21pbG8ubWFpbF0oLi4vbWFpbC9pbmRleC5qcy5odG1sKSB0aGF0IGRpc3BhdGNoZXMgYGRvbXJlYWR5YCBldmVudCBhbmQgY2FuIGJlIHVzZWQgZm9yIGFueSBhcHBsaWNhdGlvbiB3aWRlIG1lc3NhZ2luZy5cbiAqIFRvIGluaXRpYWxpemUgeW91ciBhcHAgYWZ0ZXIgRE9NIGlzIHJlYWR5IHVzZTpcbiAqIGBgYFxuICogbWlsby5tYWlsLm9uKCdkb21yZWFkeScsIGZ1bmN0aW9uKCkge1xuICogICAgIC8vIGFwcGxpY2F0aW9uIHN0YXJ0c1xuICogfSk7XG4gKiBgYGBcbiAqIG9yIHRoZSBmb2xsb3dpbmcgc2hvcnRlciBmb3JtIG9mIHRoZSBzYW1lOlxuICogYGBgXG4gKiBtaWxvKGZ1bmN0aW9uKCkge1xuICogICAgIC8vIGFwcGxpY2F0aW9uIHN0YXJ0c1xuICogfSk7XG4gKiBgYGBcbiAqL1xudmFyIE1lc3NlbmdlciA9IF8uY3JlYXRlU3ViY2xhc3MoTWl4aW4sICdNZXNzZW5nZXInKTtcblxudmFyIG1lc3NhZ2VzU3BsaXRSZWdFeHAgPSBNZXNzZW5nZXIubWVzc2FnZXNTcGxpdFJlZ0V4cCA9IC9cXHMqKD86XFwsfFxccylcXHMqLztcblxuXG4vKipcbiAqICMjIyNNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kcyMjIyNcbiAqXG4gKiAtIFtpbml0XSgjaW5pdClcbiAqIC0gW29uXSgjTWVzc2VuZ2VyJG9uKSAoYWxpYXMgLSBvbk1lc3NhZ2UsIGRlcHJlY2F0ZWQpXG4gKiAtIFtvZmZdKCNNZXNzZW5nZXIkb2ZmKSAoYWxpYXMgLSBvZmZNZXNzYWdlLCBkZXByZWNhdGVkKVxuICogLSBbb25NZXNzYWdlc10oI29uTWVzc2FnZXMpXG4gKiAtIFtvZmZNZXNzYWdlc10oI29mZk1lc3NhZ2VzKVxuICogLSBbb25jZV0oI29uY2UpXG4gKiAtIFtvbmNlU3luY10oI29uY2VTeW5jKVxuICogLSBbcG9zdE1lc3NhZ2VdKCNwb3N0TWVzc2FnZSlcbiAqIC0gW2dldFN1YnNjcmliZXJzXSgjZ2V0U3Vic2NyaWJlcnMpXG4gKlxuICogXCJQcml2YXRlXCIgbWV0aG9kc1xuICpcbiAqIC0gW19jaG9vc2VTdWJzY3JpYmVyc0hhc2hdKCNfY2hvb3NlU3Vic2NyaWJlcnNIYXNoKVxuICogLSBbX3JlZ2lzdGVyU3Vic2NyaWJlcl0oI19yZWdpc3RlclN1YnNjcmliZXIpXG4gKiAtIFtfcmVtb3ZlU3Vic2NyaWJlcl0oI19yZW1vdmVTdWJzY3JpYmVyKVxuICogLSBbX3JlbW92ZUFsbFN1YnNjcmliZXJzXSgjX3JlbW92ZUFsbFN1YnNjcmliZXJzKVxuICogLSBbX2NhbGxQYXR0ZXJuU3Vic2NyaWJlcnNdKCNfY2FsbFBhdHRlcm5TdWJzY3JpYmVycylcbiAqIC0gW19jYWxsU3Vic2NyaWJlcnNdKCNfY2FsbFN1YnNjcmliZXJzKVxuICogLSBbX3NldE1lc3NhZ2VTb3VyY2VdKCNfc2V0TWVzc2FnZVNvdXJjZSlcbiAqIC0gW2dldE1lc3NhZ2VTb3VyY2VdKCNnZXRNZXNzYWdlU291cmNlKVxuICovXG5fLmV4dGVuZFByb3RvKE1lc3Nlbmdlciwge1xuICAgIGluaXQ6IGluaXQsIC8vIGNhbGxlZCBieSBNaXhpbiAoc3VwZXJjbGFzcylcbiAgICBkZXN0cm95OiBNZXNzZW5nZXIkZGVzdHJveSxcbiAgICBvbjogTWVzc2VuZ2VyJG9uLFxuICAgIG9uY2U6IE1lc3NlbmdlciRvbmNlLFxuICAgIG9uY2VTeW5jOiBNZXNzZW5nZXIkb25jZVN5bmMsXG4gICAgb25TeW5jOiBNZXNzZW5nZXIkb25TeW5jLFxuICAgIG9uQXN5bmM6IE1lc3NlbmdlciRvbkFzeW5jLFxuICAgIG9uTWVzc2FnZTogTWVzc2VuZ2VyJG9uLCAvLyBkZXByZWNhdGVkXG4gICAgb2ZmOiBNZXNzZW5nZXIkb2ZmLFxuICAgIG9mZk1lc3NhZ2U6IE1lc3NlbmdlciRvZmYsIC8vIGRlcHJlY2F0ZWRcbiAgICBvbk1lc3NhZ2VzOiBvbk1lc3NhZ2VzLFxuICAgIG9mZk1lc3NhZ2VzOiBvZmZNZXNzYWdlcyxcbiAgICBvZmZBbGw6IE1lc3NlbmdlciRvZmZBbGwsXG4gICAgcG9zdE1lc3NhZ2U6IHBvc3RNZXNzYWdlLFxuICAgIHBvc3RNZXNzYWdlU3luYzogcG9zdE1lc3NhZ2VTeW5jLFxuICAgIGdldFN1YnNjcmliZXJzOiBnZXRTdWJzY3JpYmVycyxcbiAgICBnZXRNZXNzYWdlU291cmNlOiBnZXRNZXNzYWdlU291cmNlLFxuICAgIF9jaG9vc2VTdWJzY3JpYmVyc0hhc2g6IF9jaG9vc2VTdWJzY3JpYmVyc0hhc2gsXG4gICAgX3JlZ2lzdGVyU3Vic2NyaWJlcjogX3JlZ2lzdGVyU3Vic2NyaWJlcixcbiAgICBfcmVtb3ZlU3Vic2NyaWJlcjogX3JlbW92ZVN1YnNjcmliZXIsXG4gICAgX3JlbW92ZUFsbFN1YnNjcmliZXJzOiBfcmVtb3ZlQWxsU3Vic2NyaWJlcnMsXG4gICAgX2NhbGxQYXR0ZXJuU3Vic2NyaWJlcnM6IF9jYWxsUGF0dGVyblN1YnNjcmliZXJzLFxuICAgIF9jYWxsU3Vic2NyaWJlcnM6IF9jYWxsU3Vic2NyaWJlcnMsXG4gICAgX2NhbGxTdWJzY3JpYmVyOiBfY2FsbFN1YnNjcmliZXIsXG4gICAgX3NldE1lc3NhZ2VTb3VyY2U6IF9zZXRNZXNzYWdlU291cmNlXG59KTtcblxuXG4vKipcbiAqIEEgZGVmYXVsdCBtYXAgb2YgcHJveHkgbWV0aG9kcyB1c2VkIGJ5IENvbXBvbmVudEZhY2V0IGFuZCBDb21wb25lbnQgY2xhc3NlcyB0byBwYXNzIHRvIE1lc3NlbmdlciB3aGVuIGl0IGlzIGluc3RhbnRpYXRlZC5cbiAqIFRoaXMgbWFwIGlzIGZvciBjb252ZW5pZW5jZSBvbmx5LCBpdCBpcyBOT1QgdXNlZCBpbnRlcm5hbGx5IGJ5IE1lc3NlbmdlciwgYSBob3N0IGNsYXNzIHNob3VsZCBwYXNzIGl0IGZvciBtZXRob2RzIHRvIGJlIHByb3hpZWQgdGhpcyB3YXkuXG4gKi9cbk1lc3Nlbmdlci5kZWZhdWx0TWV0aG9kcyA9IHtcbiAgICBvbjogJ29uJyxcbiAgICBvblN5bmM6ICdvblN5bmMnLFxuICAgIG9uY2U6ICdvbmNlJyxcbiAgICBvbmNlU3luYzogJ29uY2VTeW5jJyxcbiAgICBvZmY6ICdvZmYnLFxuICAgIG9uTWVzc2FnZXM6ICdvbk1lc3NhZ2VzJyxcbiAgICBvZmZNZXNzYWdlczogJ29mZk1lc3NhZ2VzJyxcbiAgICBwb3N0TWVzc2FnZTogJ3Bvc3RNZXNzYWdlJyxcbiAgICBwb3N0TWVzc2FnZVN5bmM6ICdwb3N0TWVzc2FnZVN5bmMnLFxuICAgIGdldFN1YnNjcmliZXJzOiAnZ2V0U3Vic2NyaWJlcnMnXG59O1xuXG5cbm1vZHVsZS5leHBvcnRzID0gTWVzc2VuZ2VyO1xuXG5cbk1lc3Nlbmdlci5zdWJzY3JpcHRpb25zID0gW107XG5cblxuLyoqXG4gKiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXplcyBNZXNzZW5nZXIuIE1ldGhvZCBpcyBjYWxsZWQgYnkgTWl4aW4gY2xhc3MgY29uc3RydWN0b3IuXG4gKiBTZWUgW29uXSgjTWVzc2VuZ2VyJG9uKSBtZXRob2QsIFtNZXNzZW5nZXJdKCNNZXNzZW5nZXIpIGNsYXNzIGFib3ZlIGFuZCBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaG9zdE9iamVjdCBPcHRpb25hbCBvYmplY3QgdGhhdCBzdG9yZXMgdGhlIG1lc3NlbmdlciBvbiBvbmUgb2YgaXRzIHByb3BlcnRpZXMuIEl0IGlzIHVzZWQgdG8gcHJveHkgbWV0aG9kcyBvZiBtZXNzZW5nZXIgYW5kIGFsc28gYXMgYSBjb250ZXh0IGZvciBzdWJzY3JpYmVycyB3aGVuIHRoZXkgYXJlIGNhbGxlZCBieSB0aGUgTWVzc2VuZ2VyLiBTZWUgYG9uYCBtZXRob2QuXG4gKiBAcGFyYW0ge09iamVjdH0gcHJveHlNZXRob2RzIE9wdGlvbmFsIG1hcCBvZiBtZXRob2QgbmFtZXM7IGtleSAtIHByb3h5IG1ldGhvZCBuYW1lLCB2YWx1ZSAtIG1lc3NlbmdlcidzIG1ldGhvZCBuYW1lLlxuICogQHBhcmFtIHtNZXNzYWdlU291cmNlfSBtZXNzYWdlU291cmNlIE9wdGlvbmFsIG1lc3NhZ2VTb3VyY2UgbGlua2VkIHRvIHRoZSBtZXNzZW5nZXIuIElmIG1lc3NhZ2VTb3VyY2UgaXMgc3VwcGxpZWQsIHRoZSByZWZlcmVuY2UgdG8gdGhlIG1lc3NlbmdlciB3aWxsIHN0b3JlZCBvbiBpdHMgJ21lc3NlbmdlcicgcHJvcGVydHlcbiAqL1xuZnVuY3Rpb24gaW5pdChob3N0T2JqZWN0LCBwcm94eU1ldGhvZHMsIG1lc3NhZ2VTb3VyY2UpIHtcbiAgICAvLyBob3N0T2JqZWN0IGFuZCBwcm94eU1ldGhvZHMgYXJlIHVzZWQgaW4gTWl4aW4gYW5kIGNoZWNrZWQgdGhlcmVcbiAgICBpZiAobWVzc2FnZVNvdXJjZSlcbiAgICAgICAgdGhpcy5fc2V0TWVzc2FnZVNvdXJjZShtZXNzYWdlU291cmNlKTtcblxuICAgIF9pbml0aWFsaXplU3Vic2NyaWJlcnMuY2FsbCh0aGlzKTtcbn1cblxuXG5mdW5jdGlvbiBfaW5pdGlhbGl6ZVN1YnNjcmliZXJzKCkge1xuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgIF9tZXNzYWdlU3Vic2NyaWJlcnM6IHt9LFxuICAgICAgICBfcGF0dGVybk1lc3NhZ2VTdWJzY3JpYmVyczoge30sXG4gICAgfSwgXy5DT05GKTtcbn1cblxuXG4vKipcbiAqIERlc3Ryb3lzIG1lc3Nlbmdlci4gTWF5YmUgbmVlZHMgdG8gdW5zdWJzY3JpYmUgYWxsIHN1YnNjcmliZXJzXG4gKi9cbmZ1bmN0aW9uIE1lc3NlbmdlciRkZXN0cm95KCkge1xuICAgIHRoaXMub2ZmQWxsKCk7XG4gICAgdmFyIG1lc3NhZ2VTb3VyY2UgPSB0aGlzLmdldE1lc3NhZ2VTb3VyY2UoKTtcbiAgICBpZiAobWVzc2FnZVNvdXJjZSlcbiAgICAgICAgbWVzc2FnZVNvdXJjZS5kZXN0cm95KCk7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kLlxuICogUmVnaXN0ZXJzIGEgc3Vic2NyaWJlciBmdW5jdGlvbiBmb3IgYSBjZXJ0YWluIG1lc3NhZ2UocykuXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3Vic2NyaXB0aW9uIHdhcyBzdWNjZXNzZnVsLiBJdCBjYW4gYmUgdW5zdWNjZXNzZnVsIGlmIHRoZSBwYXNzZWQgc3Vic2NyaWJlciBoYXMgYWxyZWFkeSBiZWVuIHN1YnNjcmliZWQgdG8gdGhpcyBtZXNzYWdlIHR5cGUgLSBkb3VibGUgc3Vic2NyaXB0aW9uIG5ldmVyIGhhcHBlbnMgYW5kIGl0IGlzIHNhZmUgdG8gc3Vic2NyaWJlIGFnYWluIC0gbm8gZXJyb3Igb3Igd2FybmluZyBpcyB0aHJvd24gb3IgbG9nZ2VkLlxuICogU3Vic2NyaWJlciBpcyBwYXNzZWQgdHdvIHBhcmFtZXRlcnM6IGBtZXNzYWdlYCAoc3RyaW5nKSBhbmQgYGRhdGFgIChvYmplY3QpLiBEYXRhIG9iamVjdCBpcyBzdXBwbGllZCB3aGVuIG1lc3NhZ2UgaXMgZGlzcGF0Y2hlZCwgTWVzc2VuZ2VyIGl0c2VsZiBhZGRzIG5vdGhpbmcgdG8gaXQuIEZvciBleGFtcGxlLCBbZXZlbnRzIGZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXRzL0V2ZW50cy5qcy5odG1sKSBzZW5kcyBhY3R1YWwgRE9NIGV2ZW50IHdoZW4gaXQgcG9zdHMgbWVzc2FnZS5cbiAqIFVzYWdlOlxuICogYGBgXG4gKiAvLyBzdWJzY3JpYmVzIG9uTW91c2VVcERvd24gdG8gdHdvIERPTSBldmVudHMgb24gY29tcG9uZW50IHZpYSBldmVudHMgZmFjZXQuXG4gKiBteUNvbXAuZXZlbnRzLm9uKCdtb3VzZWRvd24gbW91c2V1cCcsIG9uTW91c2VVcERvd24pO1xuICogZnVuY3Rpb24gb25Nb3VzZVVwRG93bihldmVudFR5cGUsIGV2ZW50KSB7XG4gKiAgICAgLy8gLi4uXG4gKiB9XG4gKlxuICogbXlDb21wLmRhdGEub24oLy4rLywgZnVuY3Rpb24obXNnLCBkYXRhKSB7XG4gKiAgICAgbG9nZ2VyLmRlYnVnKG1zZywgZGF0YSk7XG4gKiB9KTsgLy8gc3Vic2NyaWJlcyBhbm9ueW1vdXMgZnVuY3Rpb24gdG8gYWxsIG5vbi1lbXB0eSBtZXNzYWdlcyBvbiBkYXRhIGZhY2V0XG4gKiAvLyBpdCB3aWxsIG5vdCBiZSBwb3NzaWJsZSB0byB1bnN1YnNjcmliZSBhbm9ueW1vdXMgc3Vic2NyaWJlciBzZXBhcmF0ZWx5LFxuICogLy8gYnV0IG15Q29tcC5kYXRhLm9mZigvLisvKSB3aWxsIHVuc3Vic2NyaWJlIGl0XG4gKiBgYGBcbiAqIElmIG1lc3NlbmdlciBoYXMgW01lc3NhZ2VTb3VyY2VdKC4vbV9zb3VyY2UuanMuaHRtbCkgYXR0YWNoZWQgdG8gaXQsIE1lc3NhZ2VTb3VyY2Ugd2lsbCBiZSBub3RpZmllZCB3aGVuIHRoZSBmaXJzdCBzdWJzY3JpYmVyIGZvciBhIGdpdmVuIG1lc3NhZ2UgaXMgYWRkZWQsIHNvIGl0IGNhbiBzdWJzY3JpYmUgdG8gdGhlIHNvdXJjZS5cbiAqIFtDb21wb25lbnRzXSguLi9jb21wb25lbnRzL2NfY2xhc3MuanMuaHRtbCkgYW5kIFtmYWNldHNdKC4uL2NvbXBvbmVudHMvY19mYWNldC5qcy5odG1sKSBjaGFuZ2UgdGhpcyBtZXRob2QgbmFtZSB0byBgb25gIHdoZW4gdGhleSBwcm94eSBpdC5cbiAqIFNlZSBbcG9zdE1lc3NhZ2VdKCNwb3N0TWVzc2FnZSkuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXlbU3RyaW5nXXxSZWdFeHB9IG1lc3NhZ2VzIE1lc3NhZ2UgdHlwZXMgdGhhdCBzaG91bGQgZW52b2tlIHRoZSBzdWJzY3JpYmVyLlxuICogIElmIHN0cmluZyBpcyBwYXNzZWQsIGl0IGNhbiBiZSBhIHNpZ2xlIG1lc3NhZ2Ugb3IgbXVsdGlwbGUgbWVzc2FnZSB0eXBlcyBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSB3aXRoIG9wdGlvbmFsIGNvbW1hcy5cbiAqICBJZiBhbiBhcnJheSBvZiBzdHJpbmdzIGlzIHBhc3NlZCwgZWFjaCBzdHJpbmcgaXMgYSBtZXNzYWdlIHR5cGUgdG8gc3Vic2NyaWJlIGZvci5cbiAqICBJZiBhIFJlZ0V4cCBpcyBwYXNzZWQsIHRoZSBzdWJzY3JpYmVyIHdpbGwgYmUgZW52b2tlZCB3aGVuIHRoZSBtZXNzYWdlIGRpc3BhdGNoZWQgb24gdGhlIG1lc3NlbmdlciBtYXRjaGVzIHRoZSBwYXR0ZXJuIChvciBJUyB0aGUgUmVnRXhwIHdpdGggaWRlbnRpY2FsIHBhdHRlcm4pLlxuICogIFBhdHRlcm4gc3Vic2NyaWJlciBkb2VzIE5PVCBjYXVzZSBhbnkgc3Vic2NyaXB0aW9uIHRvIE1lc3NhZ2VTb3VyY2UsIGl0IG9ubHkgY2FwdHVyZXMgbWVzc2FnZXMgdGhhdCBhcmUgYWxyZWFkeSBzdWJzY3JpYmVkIHRvIHdpdGggcHJlY2lzZSBtZXNzYWdlIHR5cGVzLlxuICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R9IHN1YnNjcmliZXIgTWVzc2FnZSBzdWJzY3JpYmVyIC0gYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIG1lc3NhZ2UgaXMgZGlzcGF0Y2hlZCBvbiB0aGUgbWVzc2VuZ2VyICh1c3VhbGx5IHZpYSBwcm94aWVkIHBvc3RNZXNzYWdlIG1ldGhvZCBvZiBob3N0IG9iamVjdCkuXG4gKiAgSWYgaG9zdE9iamVjdCB3YXMgc3VwcGxpZWQgdG8gTWVzc2VuZ2VyIGNvbnN0cnVjdG9yLCBob3N0T2JqZWN0IHdpbGwgYmUgdGhlIGNvbnRleHQgKHRoZSB2YWx1ZSBvZiB0aGlzKSBmb3IgdGhlIHN1YnNjcmliZXIgZW52b2NhdGlvbi5cbiAqICBTdWJzY3JpYmVyIGNhbiBhbHNvIGJlIGFuIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgYHN1YnNjcmliZXJgIChmdW5jdGlvbikgYW5kIGBjb250ZXh0YCAoXCJ0aGlzXCIgdmFsdWUgd2hlbiBzdWJzY3JpYmVyIGlzIGNhbGxlZClcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIE1lc3NlbmdlciRvbihtZXNzYWdlcywgc3Vic2NyaWJlcikge1xuICAgIHJldHVybiBfTWVzc2VuZ2VyX29uV2l0aE9wdGlvbnMuY2FsbCh0aGlzLCBtZXNzYWdlcywgc3Vic2NyaWJlcik7XG59XG5cblxuZnVuY3Rpb24gTWVzc2VuZ2VyJG9uY2UobWVzc2FnZXMsIHN1YnNjcmliZXIpIHtcbiAgICByZXR1cm4gX01lc3Nlbmdlcl9vbldpdGhPcHRpb25zLmNhbGwodGhpcywgbWVzc2FnZXMsIHN1YnNjcmliZXIsIHsgZGlzcGF0Y2hUaW1lczogMSB9KTtcbn1cblxuZnVuY3Rpb24gTWVzc2VuZ2VyJG9uY2VTeW5jKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKSB7XG4gICAgcmV0dXJuIF9NZXNzZW5nZXJfb25XaXRoT3B0aW9ucy5jYWxsKHRoaXMsIG1lc3NhZ2VzLCBzdWJzY3JpYmVyLCB7IGRpc3BhdGNoVGltZXM6IDEsIHN5bmM6IHRydWUgfSk7XG59XG5cblxuZnVuY3Rpb24gTWVzc2VuZ2VyJG9uU3luYyhtZXNzYWdlcywgc3Vic2NyaWJlcikge1xuICAgIHJldHVybiBfTWVzc2VuZ2VyX29uV2l0aE9wdGlvbnMuY2FsbCh0aGlzLCBtZXNzYWdlcywgc3Vic2NyaWJlciwgeyBzeW5jOiB0cnVlIH0pO1xufVxuXG5cbmZ1bmN0aW9uIE1lc3NlbmdlciRvbkFzeW5jKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKSB7XG4gICAgcmV0dXJuIF9NZXNzZW5nZXJfb25XaXRoT3B0aW9ucy5jYWxsKHRoaXMsIG1lc3NhZ2VzLCBzdWJzY3JpYmVyLCB7IHN5bmM6IGZhbHNlIH0pO1xufVxuXG5cbmZ1bmN0aW9uIF9NZXNzZW5nZXJfb25XaXRoT3B0aW9ucyhtZXNzYWdlcywgc3Vic2NyaWJlciwgb3B0aW9ucykge1xuICAgIGNoZWNrKG1lc3NhZ2VzLCBNYXRjaC5PbmVPZihTdHJpbmcsIFtTdHJpbmddLCBSZWdFeHApKTtcbiAgICBjaGVjayhzdWJzY3JpYmVyLCBNYXRjaC5PbmVPZihGdW5jdGlvbiwge1xuICAgICAgICBzdWJzY3JpYmVyOiBGdW5jdGlvbixcbiAgICAgICAgY29udGV4dDogTWF0Y2guQW55LFxuICAgICAgICBvcHRpb25zOiBNYXRjaC5PcHRpb25hbChPYmplY3QpLFxuICAgIH0pKTtcblxuICAgIGlmICh0eXBlb2Ygc3Vic2NyaWJlciA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHN1YnNjcmliZXIgPSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyOiBzdWJzY3JpYmVyLFxuICAgICAgICAgICAgY29udGV4dDogdGhpcy5faG9zdE9iamVjdCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgICBzdWJzY3JpYmVyLm9wdGlvbnMgPSBzdWJzY3JpYmVyLm9wdGlvbnMgfHwge307XG4gICAgICAgIF8uZXh0ZW5kKHN1YnNjcmliZXIub3B0aW9ucywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9NZXNzZW5nZXJfb24uY2FsbCh0aGlzLCBtZXNzYWdlcywgc3Vic2NyaWJlcik7XG59XG5cblxuZnVuY3Rpb24gX01lc3Nlbmdlcl9vbihtZXNzYWdlcywgc3Vic2NyaWJlcikge1xuICAgIF8uZGVmaW5lUHJvcGVydHkoc3Vic2NyaWJlciwgJ19fbWVzc2FnZXMnLCBtZXNzYWdlcyk7XG4gICAgcmV0dXJuIF9lYWNoTWVzc2FnZS5jYWxsKHRoaXMsICdfcmVnaXN0ZXJTdWJzY3JpYmVyJywgbWVzc2FnZXMsIHN1YnNjcmliZXIpO1xufVxuXG5cbmZ1bmN0aW9uIF9lYWNoTWVzc2FnZShtZXRob2ROYW1lLCBtZXNzYWdlcywgc3Vic2NyaWJlcikge1xuICAgIGlmICh0eXBlb2YgbWVzc2FnZXMgPT0gJ3N0cmluZycpXG4gICAgICAgIG1lc3NhZ2VzID0gbWVzc2FnZXMuc3BsaXQobWVzc2FnZXNTcGxpdFJlZ0V4cCk7XG5cbiAgICB2YXIgc3Vic2NyaWJlcnNIYXNoID0gdGhpcy5fY2hvb3NlU3Vic2NyaWJlcnNIYXNoKG1lc3NhZ2VzKTtcblxuICAgIGlmIChtZXNzYWdlcyBpbnN0YW5jZW9mIFJlZ0V4cClcbiAgICAgICAgcmV0dXJuIHRoaXNbbWV0aG9kTmFtZV0oc3Vic2NyaWJlcnNIYXNoLCBtZXNzYWdlcywgc3Vic2NyaWJlcik7XG5cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcblxuICAgICAgICBtZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHZhciBzdWJzY3JpcHRpb25DaGFuZ2VkID0gdGhpc1ttZXRob2ROYW1lXShzdWJzY3JpYmVyc0hhc2gsIG1lc3NhZ2UsIHN1YnNjcmliZXIpO1xuICAgICAgICAgICAgY2hhbmdlZCA9IGNoYW5nZWQgfHwgc3Vic2NyaXB0aW9uQ2hhbmdlZDtcbiAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgcmV0dXJuIGNoYW5nZWQ7XG4gICAgfVxufVxuXG5cbi8qKlxuICogXCJQcml2YXRlXCIgTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZFxuICogSXQgaXMgY2FsbGVkIGJ5IFtvbl0oI01lc3NlbmdlciRvbikgdG8gcmVnaXN0ZXIgc3Vic2NyaWJlciBmb3Igb25lIG1lc3NhZ2UgdHlwZS5cbiAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgc3Vic2NyaWJlciBpcyBub3QgeWV0IHJlZ2lzdGVyZWQgZm9yIHRoaXMgdHlwZSBvZiBtZXNzYWdlLlxuICogSWYgbWVzc2VuZ2VyIGhhcyBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBhdHRhY2hlZCB0byBpdCwgTWVzc2FnZVNvdXJjZSB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGZpcnN0IHN1YnNjcmliZXIgZm9yIGEgZ2l2ZW4gbWVzc2FnZSBpcyBhZGRlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHN1YnNjcmliZXJzSGFzaCBUaGUgbWFwIG9mIHN1YnNjcmliZXJzIGRldGVybWluZWQgYnkgW29uXSgjTWVzc2VuZ2VyJG9uKSBiYXNlZCBvbiBNZXNzYWdlIHR5cGUsIGNhbiBiZSBgdGhpcy5fcGF0dGVybk1lc3NhZ2VTdWJzY3JpYmVyc2Agb3IgYHRoaXMuX21lc3NhZ2VTdWJzY3JpYmVyc2BcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIE1lc3NhZ2UgdHlwZVxuICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R9IHN1YnNjcmliZXIgU3Vic2NyaWJlciBmdW5jdGlvbiB0byBiZSBhZGRlZCBvciBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIGBzdWJzY3JpYmVyYCAoZnVuY3Rpb24pIGFuZCBgY29udGV4dGAgKHZhbHVlIG9mIFwidGhpc1wiIHdoZW4gc3Vic2NyaWJlciBpcyBjYWxsZWQpXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBfcmVnaXN0ZXJTdWJzY3JpYmVyKHN1YnNjcmliZXJzSGFzaCwgbWVzc2FnZSwgc3Vic2NyaWJlcikge1xuICAgIGlmICghIChzdWJzY3JpYmVyc0hhc2hbbWVzc2FnZV0gJiYgc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdLmxlbmd0aCkpIHtcbiAgICAgICAgc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdID0gW107XG4gICAgICAgIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgUmVnRXhwKVxuICAgICAgICAgICAgc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdLnBhdHRlcm4gPSBtZXNzYWdlO1xuICAgICAgICBpZiAodGhpcy5fbWVzc2FnZVNvdXJjZSlcbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VTb3VyY2Uub25TdWJzY3JpYmVyQWRkZWQobWVzc2FnZSk7XG4gICAgICAgIHZhciBub1N1YnNjcmliZXJzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgbXNnU3Vic2NyaWJlcnMgPSBzdWJzY3JpYmVyc0hhc2hbbWVzc2FnZV07XG4gICAgdmFyIG5vdFlldFJlZ2lzdGVyZWQgPSBub1N1YnNjcmliZXJzIHx8IF9pbmRleE9mU3Vic2NyaWJlci5jYWxsKHRoaXMsIG1zZ1N1YnNjcmliZXJzLCBzdWJzY3JpYmVyKSA9PSAtMTtcblxuICAgIGlmIChub3RZZXRSZWdpc3RlcmVkKVxuICAgICAgICBtc2dTdWJzY3JpYmVycy5wdXNoKHN1YnNjcmliZXIpO1xuXG4gICAgcmV0dXJuIG5vdFlldFJlZ2lzdGVyZWQ7XG59XG5cblxuLyoqXG4gKiBGaW5kcyBzdWJzY3JpYmVyIGluZGV4IGluIHRoZSBsaXN0XG4gKlxuICogQHBhcmFtIHtBcnJheVtGdW5jdGlvbnxPYmplY3RdfSBsaXN0IGxpc3Qgb2Ygc3Vic2NyaWJlcnNcbiAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBzdWJzY3JpYmVyIHN1YnNjcmliZXIgZnVuY3Rpb24gb3Igb2JqZWN0IHdpdGggcHJvcGVydGllcyBgc3Vic2NyaWJlcmAgKGZ1bmN0aW9uKSBhbmQgYGNvbnRleHRgIChcInRoaXNcIiBvYmplY3QpXG4gKi9cbmZ1bmN0aW9uIF9pbmRleE9mU3Vic2NyaWJlcihsaXN0LCBzdWJzY3JpYmVyKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBfLmZpbmRJbmRleChsaXN0LCBmdW5jdGlvbihzdWJzY3Ipe1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5zdWJzY3JpYmVyID09IHN1YnNjci5zdWJzY3JpYmVyXG4gICAgICAgICAgICAgICAgJiYgc3Vic2NyaWJlci5jb250ZXh0ID09IHN1YnNjci5jb250ZXh0XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kLlxuICogU3Vic2NyaWJlcyB0byBtdWx0aXBsZSBtZXNzYWdlcyBwYXNzZWQgYXMgbWFwIHRvZ2V0aGVyIHdpdGggc3Vic2NyaWJlcnMuXG4gKiBVc2FnZTpcbiAqIGBgYFxuICogbXlDb21wLmV2ZW50cy5vbk1lc3NhZ2VzKHtcbiAqICAgICAnbW91c2Vkb3duJzogb25Nb3VzZURvd24sXG4gKiAgICAgJ21vdXNldXAnOiBvbk1vdXNlVXBcbiAqIH0pO1xuICogZnVuY3Rpb24gb25Nb3VzZURvd24oZXZlbnRUeXBlLCBldmVudCkge31cbiAqIGZ1bmN0aW9uIG9uTW91c2VVcChldmVudFR5cGUsIGV2ZW50KSB7fVxuICogYGBgXG4gKiBSZXR1cm5zIG1hcCB3aXRoIHRoZSBzYW1lIGtleXMgKG1lc3NhZ2UgdHlwZXMpIGFuZCBib29sZWFuIHZhbHVlcyBpbmRpY2F0aW5nIHdoZXRoZXIgcGFydGljdWxhciBzdWJzY3JpYmVyIHdhcyBhZGRlZC5cbiAqIEl0IGlzIE5PVCBwb3NzaWJsZSB0byBhZGQgcGF0dGVybiBzdWJzY3JpYmVyIHVzaW5nIHRoaXMgbWV0aG9kLCBhcyBhbHRob3VnaCB5b3UgY2FuIHVzZSBSZWdFeHAgYXMgdGhlIGtleSwgSmF2YVNjcmlwdCB3aWxsIGF1dG9tYXRpY2FsbHkgY29udmVydCBpdCB0byBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtPYmplY3RbRnVuY3Rpb25dfSBtZXNzYWdlU3Vic2NyaWJlcnMgTWFwIG9mIG1lc3NhZ2Ugc3Vic2NyaWJlcnMgdG8gYmUgYWRkZWRcbiAqIEByZXR1cm4ge09iamVjdFtCb29sZWFuXX1cbiAqL1xuZnVuY3Rpb24gb25NZXNzYWdlcyhtZXNzYWdlU3Vic2NyaWJlcnMpIHtcbiAgICBjaGVjayhtZXNzYWdlU3Vic2NyaWJlcnMsIE1hdGNoLk9iamVjdEhhc2goTWF0Y2guT25lT2YoRnVuY3Rpb24sIHsgc3Vic2NyaWJlcjogRnVuY3Rpb24sIGNvbnRleHQ6IE1hdGNoLkFueSB9KSkpO1xuXG4gICAgdmFyIG5vdFlldFJlZ2lzdGVyZWRNYXAgPSBfLm1hcEtleXMobWVzc2FnZVN1YnNjcmliZXJzLCBmdW5jdGlvbihzdWJzY3JpYmVyLCBtZXNzYWdlcykge1xuICAgICAgICByZXR1cm4gdGhpcy5vbihtZXNzYWdlcywgc3Vic2NyaWJlcik7XG4gICAgfSwgdGhpcyk7XG5cbiAgICByZXR1cm4gbm90WWV0UmVnaXN0ZXJlZE1hcDtcbn1cblxuXG4vKipcbiAqIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2QuXG4gKiBSZW1vdmVzIGEgc3Vic2NyaWJlciBmb3IgbWVzc2FnZShzKS4gUmVtb3ZlcyBhbGwgc3Vic2NyaWJlcnMgZm9yIHRoZSBtZXNzYWdlIGlmIHN1YnNjcmliZXIgaXNuJ3QgcGFzc2VkLlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHN1YnNjcmliZXIgd2FzIHJlZ2lzdGVyZWQuIE5vIGVycm9yIG9yIHdhcm5pbmcgaXMgdGhyb3duIG9yIGxvZ2dlZCBpZiB5b3UgcmVtb3ZlIHN1YnNjcmliZXIgdGhhdCB3YXMgbm90IHJlZ2lzdGVyZWQuXG4gKiBbQ29tcG9uZW50c10oLi4vY29tcG9uZW50cy9jX2NsYXNzLmpzLmh0bWwpIGFuZCBbZmFjZXRzXSguLi9jb21wb25lbnRzL2NfZmFjZXQuanMuaHRtbCkgY2hhbmdlIHRoaXMgbWV0aG9kIG5hbWUgdG8gYG9mZmAgd2hlbiB0aGV5IHByb3h5IGl0LlxuICogVXNhZ2U6XG4gKiBgYGBcbiAqIC8vIHVuc3Vic2NyaWJlcyBvbk1vdXNlVXBEb3duIGZyb20gdHdvIERPTSBldmVudHMuXG4gKiBteUNvbXAuZXZlbnRzLm9mZignbW91c2Vkb3duIG1vdXNldXAnLCBvbk1vdXNlVXBEb3duKTtcbiAqIGBgYFxuICogSWYgbWVzc2VuZ2VyIGhhcyBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBhdHRhY2hlZCB0byBpdCwgTWVzc2FnZVNvdXJjZSB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGxhc3Qgc3Vic2NyaWJlciBmb3IgYSBnaXZlbiBtZXNzYWdlIGlzIHJlbW92ZWQgYW5kIHRoZXJlIGlzIG5vIG1vcmUgc3Vic2NyaWJlcnMgZm9yIHRoaXMgbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheVtTdHJpbmddfFJlZ0V4cH0gbWVzc2FnZXMgTWVzc2FnZSB0eXBlcyB0aGF0IGEgc3Vic2NyaWJlciBzaG91bGQgYmUgcmVtb3ZlZCBmb3IuXG4gKiAgSWYgc3RyaW5nIGlzIHBhc3NlZCwgaXQgY2FuIGJlIGEgc2lnbGUgbWVzc2FnZSBvciBtdWx0aXBsZSBtZXNzYWdlIHR5cGVzIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIHdpdGggb3B0aW9uYWwgY29tbWFzLlxuICogIElmIGFuIGFycmF5IG9mIHN0cmluZ3MgaXMgcGFzc2VkLCBlYWNoIHN0cmluZyBpcyBhIG1lc3NhZ2UgdHlwZSB0byByZW1vdmUgYSBzdWJzY3JpYmVyIGZvci5cbiAqICBJZiBhIFJlZ0V4cCBpcyBwYXNzZWQsIHRoZSBwYXR0ZXJuIHN1YnNjcmliZXIgd2lsbCBiZSByZW1vdmVkLlxuICogIFJlZ0V4cCBzdWJzY3JpYmVyIGRvZXMgTk9UIGNhdXNlIGFueSBzdWJzY3JpcHRpb24gdG8gTWVzc2FnZVNvdXJjZSwgaXQgb25seSBjYXB0dXJlcyBtZXNzYWdlcyB0aGF0IGFyZSBhbHJlYWR5IHN1YnNjcmliZWQgdG8gd2l0aCBwcmVjaXNlIG1lc3NhZ2UgdHlwZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdWJzY3JpYmVyIE1lc3NhZ2Ugc3Vic2NyaWJlciAtIE9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb2Ygc3Vic2NyaWJlcnMgZm9yIHRoZSBtZXNzYWdlKHMpLiBJZiBzdWJzY3JpYmVyIGlzIG5vdCBzdXBwbGllZCwgYWxsIHN1YnNjcmliZXJzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoaXMgbWVzc2FnZShzKS5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIE1lc3NlbmdlciRvZmYobWVzc2FnZXMsIHN1YnNjcmliZXIpIHtcbiAgICBjaGVjayhtZXNzYWdlcywgTWF0Y2guT25lT2YoU3RyaW5nLCBbU3RyaW5nXSwgUmVnRXhwKSk7XG4gICAgY2hlY2soc3Vic2NyaWJlciwgTWF0Y2guT3B0aW9uYWwoTWF0Y2guT25lT2YoRnVuY3Rpb24sIHtcbiAgICAgICAgc3Vic2NyaWJlcjogRnVuY3Rpb24sXG4gICAgICAgIGNvbnRleHQ6IE1hdGNoLkFueSxcbiAgICAgICAgb3B0aW9uczogTWF0Y2guT3B0aW9uYWwoT2JqZWN0KSxcbiAgICAgICAgLy8gX19tZXNzYWdlczogTWF0Y2guT3B0aW9uYWwoTWF0Y2guT25lT2YoU3RyaW5nLCBbU3RyaW5nXSwgUmVnRXhwKSlcbiAgICB9KSkpO1xuXG4gICAgcmV0dXJuIF9NZXNzZW5nZXJfb2ZmLmNhbGwodGhpcywgbWVzc2FnZXMsIHN1YnNjcmliZXIpO1xufVxuXG5cbmZ1bmN0aW9uIF9NZXNzZW5nZXJfb2ZmKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKSB7XG4gICAgcmV0dXJuIF9lYWNoTWVzc2FnZS5jYWxsKHRoaXMsICdfcmVtb3ZlU3Vic2NyaWJlcicsIG1lc3NhZ2VzLCBzdWJzY3JpYmVyKTtcbn1cblxuXG4vKipcbiAqIFwiUHJpdmF0ZVwiIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2RcbiAqIEl0IGlzIGNhbGxlZCBieSBbb2ZmXSgjTWVzc2VuZ2VyJG9mZikgdG8gcmVtb3ZlIHN1YnNjcmliZXIgZm9yIG9uZSBtZXNzYWdlIHR5cGUuXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHN1YnNjcmliZXIgd2FzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgdHlwZSBvZiBtZXNzYWdlLlxuICogSWYgbWVzc2VuZ2VyIGhhcyBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBhdHRhY2hlZCB0byBpdCwgTWVzc2FnZVNvdXJjZSB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGxhc3Qgc3Vic2NyaWJlciBmb3IgYSBnaXZlbiBtZXNzYWdlIGlzIHJlbW92ZWQgYW5kIHRoZXJlIGlzIG5vIG1vcmUgc3Vic2NyaWJlcnMgZm9yIHRoaXMgbWVzc2FnZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHN1YnNjcmliZXJzSGFzaCBUaGUgbWFwIG9mIHN1YnNjcmliZXJzIGRldGVybWluZWQgYnkgW29mZl0oI01lc3NlbmdlciRvZmYpIGJhc2VkIG9uIG1lc3NhZ2UgdHlwZSwgY2FuIGJlIGB0aGlzLl9wYXR0ZXJuTWVzc2FnZVN1YnNjcmliZXJzYCBvciBgdGhpcy5fbWVzc2FnZVN1YnNjcmliZXJzYFxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZSB0eXBlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdWJzY3JpYmVyIFN1YnNjcmliZXIgZnVuY3Rpb24gdG8gYmUgcmVtb3ZlZFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gX3JlbW92ZVN1YnNjcmliZXIoc3Vic2NyaWJlcnNIYXNoLCBtZXNzYWdlLCBzdWJzY3JpYmVyKSB7XG4gICAgdmFyIG1zZ1N1YnNjcmliZXJzID0gc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdO1xuICAgIGlmICghIG1zZ1N1YnNjcmliZXJzIHx8ICEgbXNnU3Vic2NyaWJlcnMubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG5vdGhpbmcgcmVtb3ZlZFxuXG4gICAgaWYgKHN1YnNjcmliZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdWJzY3JpYmVyID09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBzdWJzY3JpYmVyID0geyBzdWJzY3JpYmVyOiBzdWJzY3JpYmVyLCBjb250ZXh0OiB0aGlzLl9ob3N0T2JqZWN0IH07XG5cbiAgICAgICAgdmFyIHN1YnNjcmliZXJJbmRleCA9IF9pbmRleE9mU3Vic2NyaWJlci5jYWxsKHRoaXMsIG1zZ1N1YnNjcmliZXJzLCBzdWJzY3JpYmVyKTtcbiAgICAgICAgaWYgKHN1YnNjcmliZXJJbmRleCA9PSAtMSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gbm90aGluZyByZW1vdmVkXG4gICAgICAgIG1zZ1N1YnNjcmliZXJzLnNwbGljZShzdWJzY3JpYmVySW5kZXgsIDEpO1xuICAgICAgICBpZiAoISBtc2dTdWJzY3JpYmVycy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLl9yZW1vdmVBbGxTdWJzY3JpYmVycyhzdWJzY3JpYmVyc0hhc2gsIG1lc3NhZ2UpO1xuXG4gICAgfSBlbHNlXG4gICAgICAgIHRoaXMuX3JlbW92ZUFsbFN1YnNjcmliZXJzKHN1YnNjcmliZXJzSGFzaCwgbWVzc2FnZSk7XG5cbiAgICByZXR1cm4gdHJ1ZTsgLy8gc3Vic2NyaWJlcihzKSByZW1vdmVkXG59XG5cblxuLyoqXG4gKiBcIlByaXZhdGVcIiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kXG4gKiBJdCBpcyBjYWxsZWQgYnkgW19yZW1vdmVTdWJzY3JpYmVyXSgjX3JlbW92ZVN1YnNjcmliZXIpIHRvIHJlbW92ZSBhbGwgc3Vic2NyaWJlcnMgZm9yIG9uZSBtZXNzYWdlIHR5cGUuXG4gKiBJZiBtZXNzZW5nZXIgaGFzIFtNZXNzYWdlU291cmNlXSguL21fc291cmNlLmpzLmh0bWwpIGF0dGFjaGVkIHRvIGl0LCBNZXNzYWdlU291cmNlIHdpbGwgYmUgbm90aWZpZWQgdGhhdCBhbGwgbWVzc2FnZSBzdWJzY3JpYmVycyB3ZXJlIHJlbW92ZWQgc28gaXQgY2FuIHVuc3Vic2NyaWJlIGZyb20gdGhlIHNvdXJjZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHN1YnNjcmliZXJzSGFzaCBUaGUgbWFwIG9mIHN1YnNjcmliZXJzIGRldGVybWluZWQgYnkgW29mZl0oI01lc3NlbmdlciRvZmYpIGJhc2VkIG9uIG1lc3NhZ2UgdHlwZSwgY2FuIGJlIGB0aGlzLl9wYXR0ZXJuTWVzc2FnZVN1YnNjcmliZXJzYCBvciBgdGhpcy5fbWVzc2FnZVN1YnNjcmliZXJzYFxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZSB0eXBlXG4gKi9cbmZ1bmN0aW9uIF9yZW1vdmVBbGxTdWJzY3JpYmVycyhzdWJzY3JpYmVyc0hhc2gsIG1lc3NhZ2UpIHtcbiAgICBkZWxldGUgc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdO1xuICAgIGlmICh0aGlzLl9tZXNzYWdlU291cmNlICYmIHR5cGVvZiBtZXNzYWdlID09ICdzdHJpbmcnKVxuICAgICAgICB0aGlzLl9tZXNzYWdlU291cmNlLm9uU3Vic2NyaWJlclJlbW92ZWQobWVzc2FnZSk7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXIgaW5zdGFuY2UgbWV0aG9kLlxuICogVW5zdWJzY3JpYmVzIGZyb20gbXVsdGlwbGUgbWVzc2FnZXMgcGFzc2VkIGFzIG1hcCB0b2dldGhlciB3aXRoIHN1YnNjcmliZXJzLlxuICogUmV0dXJucyBtYXAgd2l0aCB0aGUgc2FtZSBrZXlzIChtZXNzYWdlIHR5cGVzKSBhbmQgYm9vbGVhbiB2YWx1ZXMgaW5kaWNhdGluZyB3aGV0aGVyIHBhcnRpY3VsYXIgc3Vic2NyaWJlciB3YXMgcmVtb3ZlZC5cbiAqIElmIGEgc3Vic2NyaWJlciBmb3Igb25lIG9mIHRoZSBtZXNzYWdlcyBpcyBub3Qgc3VwcGxpZWQsIGFsbCBzdWJzY3JpYmVycyBmb3IgdGhpcyBtZXNzYWdlIHdpbGwgYmUgcmVtb3ZlZC5cbiAqIFVzYWdlOlxuICogYGBgXG4gKiBteUNvbXAuZXZlbnRzLm9mZk1lc3NhZ2VzKHtcbiAqICAgICAnbW91c2Vkb3duJzogb25Nb3VzZURvd24sXG4gKiAgICAgJ21vdXNldXAnOiBvbk1vdXNlVXAsXG4gKiAgICAgJ2NsaWNrJzogdW5kZWZpbmVkIC8vIGFsbCBzdWJzY3JpYmVycyB0byB0aGlzIG1lc3NhZ2Ugd2lsbCBiZSByZW1vdmVkXG4gKiB9KTtcbiAqIGBgYFxuICogSXQgaXMgTk9UIHBvc3NpYmxlIHRvIHJlbW92ZSBwYXR0ZXJuIHN1YnNjcmliZXIocykgdXNpbmcgdGhpcyBtZXRob2QsIGFzIGFsdGhvdWdoIHlvdSBjYW4gdXNlIFJlZ0V4cCBhcyB0aGUga2V5LCBKYXZhU2NyaXB0IHdpbGwgYXV0b21hdGljYWxseSBjb252ZXJ0IGl0IHRvIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdFtGdW5jdGlvbl19IG1lc3NhZ2VTdWJzY3JpYmVycyBNYXAgb2YgbWVzc2FnZSBzdWJzY3JpYmVycyB0byBiZSByZW1vdmVkXG4gKiBAcmV0dXJuIHtPYmplY3RbQm9vbGVhbl19XG4gKi9cbmZ1bmN0aW9uIG9mZk1lc3NhZ2VzKG1lc3NhZ2VTdWJzY3JpYmVycykge1xuICAgIGNoZWNrKG1lc3NhZ2VTdWJzY3JpYmVycywgTWF0Y2guT2JqZWN0SGFzaChNYXRjaC5PcHRpb25hbChNYXRjaC5PbmVPZihGdW5jdGlvbiwgeyBzdWJzY3JpYmVyOiBGdW5jdGlvbiwgY29udGV4dDogTWF0Y2guQW55IH0pKSkpO1xuXG4gICAgdmFyIHN1YnNjcmliZXJSZW1vdmVkTWFwID0gXy5tYXBLZXlzKG1lc3NhZ2VTdWJzY3JpYmVycywgZnVuY3Rpb24oc3Vic2NyaWJlciwgbWVzc2FnZXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2ZmKG1lc3NhZ2VzLCBzdWJzY3JpYmVyKTtcbiAgICB9LCB0aGlzKTtcblxuICAgIHJldHVybiBzdWJzY3JpYmVyUmVtb3ZlZE1hcDtcbn1cblxuXG4vKipcbiAqIFVuc3Vic2NyaWJlcyBhbGwgc3Vic2NyaWJlcnNcbiAqL1xuZnVuY3Rpb24gTWVzc2VuZ2VyJG9mZkFsbCgpIHtcbiAgICBfb2ZmQWxsU3Vic2NyaWJlcnMuY2FsbCh0aGlzLCB0aGlzLl9wYXR0ZXJuTWVzc2FnZVN1YnNjcmliZXJzKTtcbiAgICBfb2ZmQWxsU3Vic2NyaWJlcnMuY2FsbCh0aGlzLCB0aGlzLl9tZXNzYWdlU3Vic2NyaWJlcnMpO1xufVxuXG5cbmZ1bmN0aW9uIF9vZmZBbGxTdWJzY3JpYmVycyhzdWJzY3JpYmVyc0hhc2gpIHtcbiAgICBfLmVhY2hLZXkoc3Vic2NyaWJlcnNIYXNoLCBmdW5jdGlvbihzdWJzY3JpYmVycywgbWVzc2FnZSkge1xuICAgICAgICB0aGlzLl9yZW1vdmVBbGxTdWJzY3JpYmVycyhzdWJzY3JpYmVyc0hhc2gsIG1lc3NhZ2UpO1xuICAgIH0sIHRoaXMpO1xufVxuXG5cbi8vIFRPRE8gLSBzZW5kIGV2ZW50IHRvIG1lc3NhZ2VTb3VyY2VcblxuXG4vKipcbiAqIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2QuXG4gKiBEaXNwYXRjaGVzIHRoZSBtZXNzYWdlIGNhbGxpbmcgYWxsIHN1YnNjcmliZXJzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgbWVzc2FnZSBhbmQsIGlmIHRoZSBtZXNzYWdlIGlzIGEgc3RyaW5nLCBjYWxsaW5nIGFsbCBwYXR0ZXJuIHN1YnNjcmliZXJzIHdoZW4gbWVzc2FnZSBtYXRjaGVzIHRoZSBwYXR0ZXJuLlxuICogRWFjaCBzdWJzY3JpYmVyIGlzIHBhc3NlZCB0aGUgc2FtZSBwYXJhbWV0ZXJzIHRoYXQgYXJlIHBhc3NlZCB0byB0aGVpcyBtZXRob2QuXG4gKiBUaGUgY29udGV4dCBvZiB0aGUgc3Vic2NyaWJlciBlbnZvY2F0aW9uIGlzIHNldCB0byB0aGUgaG9zdCBvYmplY3QgKGB0aGlzLl9ob3N0T2JqZWN0YCkgdGhhdCB3YXMgcGFzc2VkIHRvIHRoZSBtZXNzZW5nZXIgY29uc3RydWN0b3IuXG4gKiBTdWJzY3JpYmVycyBhcmUgY2FsbGVkIGluIHRoZSBuZXh0IHRpY2sgKFwiYXN5bmNocm9ub3VzbHlcIikgYXBhcnQgZnJvbSB0aG9zZSB0aGF0IHdlcmUgc3Vic2NyaWJlZCB3aXRoIGBvblN5bmNgIChvciB0aGF0IGhhdmUgYG9wdGlvbnMuc3luYyA9PSB0cnVlYCkuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBtZXNzYWdlIG1lc3NhZ2UgdG8gYmUgZGlzcGF0Y2hlZFxuICogIElmIHRoZSBtZXNzYWdlIGlzIGEgc3RyaW5nLCB0aGUgc3Vic2NyaWJlcnMgcmVnaXN0ZXJlZCB3aXRoIGV4YWN0bHkgdGhpcyBtZXNzYWdlIHdpbGwgYmUgY2FsbGVkIGFuZCBhbHNvIHBhdHRlcm4gc3Vic2NyaWJlcnMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyB0aGUgZGlzcGF0Y2hlZCBtZXNzYWdlLlxuICogIElmIHRoZSBtZXNzYWdlIGlzIFJlZ0V4cCwgb25seSB0aGUgc3Vic2NyaWJlcnMgcmVnaXN0ZXJlZCB3aXRoIGV4YWN0bHkgdGhpcyBwYXR0ZXJuIHdpbGwgYmUgY2FsbGVkLlxuICogQHBhcmFtIHtBbnl9IGRhdGEgZGF0YSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBzdWJzY3JpYmVyIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLiBNZXNzZW5nZXIgZG9lcyBub3QgbW9kaWZ5IHRoaXMgZGF0YSBpbiBhbnkgd2F5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgb3B0aW9uYWwgY2FsbGJhY2sgdG8gcGFzcyB0byBzdWJzY3JpYmVyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IF9zeW5jaHJvbm91cyBpZiB0cnVlIHBhc3NlZCwgc3Vic2NyaWJlcnMgd2lsbCBiZSBlbnZva2VkIHN5bmNocm9ub3VzbHkgYXBhcnQgZnJvbSB0aG9zZSB0aGF0IGhhdmUgYG9wdGlvbnMuc3luYyA9PSBmYWxzZWAuIFRoaXMgcGFyYW1ldGVyIHNob3VsZCBub3QgYmUgdXNlZCwgaW5zdGVhZCBwb3N0TWVzc2FnZVN5bmMgc2hvdWxkIGJlIHVzZWQuXG4gKi9cbmZ1bmN0aW9uIHBvc3RNZXNzYWdlKG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrLCBfc3luY2hyb25vdXMpIHtcbiAgICBjaGVjayhtZXNzYWdlLCBNYXRjaC5PbmVPZihTdHJpbmcsIFJlZ0V4cCkpO1xuICAgIGNoZWNrKGNhbGxiYWNrLCBNYXRjaC5PcHRpb25hbChGdW5jdGlvbikpO1xuXG4gICAgdmFyIHN1YnNjcmliZXJzSGFzaCA9IHRoaXMuX2Nob29zZVN1YnNjcmliZXJzSGFzaChtZXNzYWdlKTtcbiAgICB2YXIgbXNnU3Vic2NyaWJlcnMgPSBzdWJzY3JpYmVyc0hhc2hbbWVzc2FnZV07XG5cbiAgICB0aGlzLl9jYWxsU3Vic2NyaWJlcnMobWVzc2FnZSwgZGF0YSwgY2FsbGJhY2ssIG1zZ1N1YnNjcmliZXJzLCBfc3luY2hyb25vdXMpO1xuXG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlID09ICdzdHJpbmcnKVxuICAgICAgICB0aGlzLl9jYWxsUGF0dGVyblN1YnNjcmliZXJzKG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrLCBtc2dTdWJzY3JpYmVycywgX3N5bmNocm9ub3VzKTtcbn1cblxuXG4vKipcbiAqIFNhbWUgYXMgcG9zdE1lc3NhZ2UgYXBhcnQgZnJvbSBlbnZva2luZyBzdWJzY3JpYmVycyBzeW5jaHJvbm91c2x5LCBhcGFydCBmcm9tIHRob3NlIHN1YnNjcmliZWQgd2l0aCBgb25Bc3luY2AgKG9yIHdpdGggYG9wdGlvbnMuc3luYyA9PSBmYWxzZWApLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gbWVzc2FnZVxuICogQHBhcmFtIHtBbnl9IGRhdGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKi9cbmZ1bmN0aW9uIHBvc3RNZXNzYWdlU3luYyhtZXNzYWdlLCBkYXRhLCBjYWxsYmFjaykge1xuICAgIHRoaXMucG9zdE1lc3NhZ2UobWVzc2FnZSwgZGF0YSwgY2FsbGJhY2ssIHRydWUpO1xufVxuXG5cbi8qKlxuICogXCJQcml2YXRlXCIgTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZFxuICogRW52b2tlcyBwYXR0ZXJuIHN1YnNjcmliZXJzIHdpdGggdGhlIHBhdHRlcm4gdGhhdCBtYXRjaGVzIHRoZSBtZXNzYWdlLlxuICogVGhlIG1ldGhvZCBpcyBjYWxsZWQgYnkgW3Bvc3RNZXNzYWdlXSgjcG9zdE1lc3NhZ2UpIC0gc2VlIG1vcmUgaW5mb3JtYXRpb24gdGhlcmUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIG1lc3NhZ2UgdG8gYmUgZGlzcGF0Y2hlZC4gUGF0dGVybiBzdWJzY3JpYmVycyByZWdpc3RlcmVkIHdpdGggdGhlIHBhdHRlcm4gdGhhdCBtYXRjaGVzIHRoZSBkaXNwYXRjaGVkIG1lc3NhZ2Ugd2lsbCBiZSBjYWxsZWQuXG4gKiBAcGFyYW0ge0FueX0gZGF0YSBkYXRhIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHN1YnNjcmliZXIgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuIE1lc3NlbmdlciBkb2VzIG5vdCBtb2RpZnkgdGhpcyBkYXRhIGluIGFueSB3YXkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBvcHRpb25hbCBjYWxsYmFjayB0byBwYXNzIHRvIHN1YnNjcmliZXJcbiAqIEBwYXJhbSB7QXJyYXlbRnVuY3Rpb258T2JqZWN0XX0gY2FsbGVkTXNnU3Vic2NyaWJlcnMgYXJyYXkgb2Ygc3Vic2NyaWJlcnMgYWxyZWFkeSBjYWxsZWQsIHRoZXkgd29uJ3QgYmUgY2FsbGVkIGFnYWluIGlmIHRoZXkgYXJlIGFtb25nIHBhdHRlcm4gc3Vic2NyaWJlcnMuXG4gKi9cbmZ1bmN0aW9uIF9jYWxsUGF0dGVyblN1YnNjcmliZXJzKG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrLCBjYWxsZWRNc2dTdWJzY3JpYmVycywgX3N5bmNocm9ub3VzKSB7XG4gICAgXy5lYWNoS2V5KHRoaXMuX3BhdHRlcm5NZXNzYWdlU3Vic2NyaWJlcnMsXG4gICAgICAgIGZ1bmN0aW9uKHBhdHRlcm5TdWJzY3JpYmVycykge1xuICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSBwYXR0ZXJuU3Vic2NyaWJlcnMucGF0dGVybjtcbiAgICAgICAgICAgIGlmIChwYXR0ZXJuLnRlc3QobWVzc2FnZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGVkTXNnU3Vic2NyaWJlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhdHRlcm5TdWJzY3JpYmVycyA9IHBhdHRlcm5TdWJzY3JpYmVycy5maWx0ZXIoZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gX2luZGV4T2ZTdWJzY3JpYmVyLmNhbGwodGhpcywgY2FsbGVkTXNnU3Vic2NyaWJlcnMsIHN1YnNjcmliZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ID09IC0xO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FsbFN1YnNjcmliZXJzKG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrLCBwYXR0ZXJuU3Vic2NyaWJlcnMsIF9zeW5jaHJvbm91cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAsIHRoaXMpO1xufVxuXG5cbi8qKlxuICogXCJQcml2YXRlXCIgTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZFxuICogRW52b2tlcyBzdWJzY3JpYmVycyBmcm9tIHRoZSBwYXNzZWQgbGlzdC5cbiAqIFRoZSBtZXRob2QgaXMgY2FsbGVkIGJ5IFtwb3N0TWVzc2FnZV0oI3Bvc3RNZXNzYWdlKSBhbmQgW19jYWxsUGF0dGVyblN1YnNjcmliZXJzXSgjX2NhbGxQYXR0ZXJuU3Vic2NyaWJlcnMpLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBtZXNzYWdlIHRvIGJlIGRpc3BhdGNoZWQsIHBhc3NlZCB0byBzdWJzY3JpYmVycyBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyLlxuICogQHBhcmFtIHtBbnl9IGRhdGEgZGF0YSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBzdWJzY3JpYmVyIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLiBNZXNzZW5nZXIgZG9lcyBub3QgbW9kaWZ5IHRoaXMgZGF0YSBpbiBhbnkgd2F5LlxuICogQHBhcmFtIHtBcnJheVtGdW5jdGlvbnxPYmplY3RdfSBtc2dTdWJzY3JpYmVycyB0aGUgYXJyYXkgb2YgbWVzc2FnZSBzdWJzY3JpYmVycyB0byBiZSBjYWxsZWQuIEVhY2ggc3Vic2NyaWJlciBpcyBjYWxsZWQgd2l0aCB0aGUgaG9zdCBvYmplY3QgKHNlZSBNZXNzZW5nZXIgY29uc3RydWN0b3IpIGFzIHRoZSBjb250ZXh0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgb3B0aW9uYWwgY2FsbGJhY2sgdG8gcGFzcyB0byBzdWJzY3JpYmVyXG4gKi9cbmZ1bmN0aW9uIF9jYWxsU3Vic2NyaWJlcnMobWVzc2FnZSwgZGF0YSwgY2FsbGJhY2ssIG1zZ1N1YnNjcmliZXJzLCBfc3luY2hyb25vdXMpIHtcbiAgICBpZiAobXNnU3Vic2NyaWJlcnMgJiYgbXNnU3Vic2NyaWJlcnMubGVuZ3RoKSB7XG4gICAgICAgIC8vIGNsb25pbmcgaXMgbmVjZXNzYXJ5IGFzIHNvbWUgb2YgdGhlIHN1YnNjcmliZXJzXG4gICAgICAgIC8vIGNhbiBiZSB1bnN1YnNjcmliZWQgZHVyaW5nIHRoZSBkaXNwYXRjaFxuICAgICAgICAvLyBzbyB0aGlzIGFycmF5IHdvdWxkIGNoYW5nZSBpbiB0aGUgcHJvY2Vzc1xuICAgICAgICBtc2dTdWJzY3JpYmVycyA9IG1zZ1N1YnNjcmliZXJzLnNsaWNlKCk7XG5cbiAgICAgICAgbXNnU3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxsU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBtZXNzYWdlLCBkYXRhLCBjYWxsYmFjaywgX3N5bmNocm9ub3VzKTtcbiAgICAgICAgfSwgdGhpcyk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIF9jYWxsU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBtZXNzYWdlLCBkYXRhLCBjYWxsYmFjaywgX3N5bmNocm9ub3VzKSB7XG4gICAgdmFyIHN5bmNTdWJzY3JpYmVyID0gc3Vic2NyaWJlci5vcHRpb25zICYmIHN1YnNjcmliZXIub3B0aW9ucy5zeW5jXG4gICAgICAgICwgc3luY2hybyA9IChfc3luY2hyb25vdXMgJiYgc3luY1N1YnNjcmliZXIgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgfHwgc3luY1N1YnNjcmliZXI7XG5cbiAgICB2YXIgZGlzcGF0Y2hUaW1lcyA9IHN1YnNjcmliZXIub3B0aW9ucyAmJiBzdWJzY3JpYmVyLm9wdGlvbnMuZGlzcGF0Y2hUaW1lcztcbiAgICBpZiAoZGlzcGF0Y2hUaW1lcykge1xuICAgICAgICBpZiAoZGlzcGF0Y2hUaW1lcyA8PSAxKSB7XG4gICAgICAgICAgICB2YXIgbWVzc2FnZXMgPSBzdWJzY3JpYmVyLl9fbWVzc2FnZXM7XG4gICAgICAgICAgICB0aGlzLm9mZihtZXNzYWdlcywgc3Vic2NyaWJlcik7XG4gICAgICAgIH0gZWxzZSBpZiAoZGlzcGF0Y2hUaW1lcyA+IDEpXG4gICAgICAgICAgICBzdWJzY3JpYmVyLm9wdGlvbnMuZGlzcGF0Y2hUaW1lcy0tO1xuICAgIH1cblxuICAgIGlmIChzeW5jaHJvKVxuICAgICAgICBzdWJzY3JpYmVyLnN1YnNjcmliZXIuY2FsbChzdWJzY3JpYmVyLmNvbnRleHQsIG1lc3NhZ2UsIGRhdGEsIGNhbGxiYWNrKTtcbiAgICBlbHNlXG4gICAgICAgIF8uZGVmZXJNZXRob2Qoc3Vic2NyaWJlci5zdWJzY3JpYmVyLCAnY2FsbCcsIHN1YnNjcmliZXIuY29udGV4dCwgbWVzc2FnZSwgZGF0YSwgY2FsbGJhY2spO1xufVxuXG5cbi8qKlxuICogTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZC5cbiAqIFJldHVybnMgdGhlIGFycmF5IG9mIHN1YnNjcmliZXJzIHRoYXQgd291bGQgYmUgY2FsbGVkIGlmIHRoZSBtZXNzYWdlIHdlcmUgZGlzcGF0Y2hlZC5cbiAqIElmIGBpbmNsdWRlUGF0dGVyblN1YnNjcmliZXJzID09PSBmYWxzZWAsIHBhdHRlcm4gc3Vic2NyaWJlcnMgd2l0aCBtYXRjaGluZyBwYXR0ZXJzIHdpbGwgbm90IGJlIGluY2x1ZGVkIChieSBkZWZhdWx0IHRoZXkgYXJlIGluY2x1ZGVkKS5cbiAqIElmIHRoZXJlIGFyZSBubyBzdWJzY3JpYmVycyB0byB0aGUgbWVzc2FnZSwgYHVuZGVmaW5lZGAgd2lsbCBiZSByZXR1cm5lZCwgbm90IGFuIGVtcHR5IGFycmF5LCBzbyBpdCBpcyBzYWZlIHRvIHVzZSB0aGUgcmVzdWx0IGluIGJvb2xlYW4gdGVzdHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBtZXNzYWdlIE1lc3NhZ2UgdG8gZ2V0IHN1YnNjcmliZXJzIGZvci5cbiAqICBJZiB0aGUgbWVzc2FnZSBpcyBSZWdFeHAsIG9ubHkgcGF0dGVybiBzdWJzY3JpYmVycyByZWdpc3RlcmVkIHdpdGggZXhhY3RseSB0aGlzIHBhdHRlcm4gd2lsbCBiZSByZXR1cm5lZC5cbiAqICBJZiB0aGUgbWVzc2FnZSBpcyBTdHJpbmcsIHN1YnNjcmliZXJzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc3RyaW5nIG1lc3NhZ2VzIGFuZCBwYXR0ZXJuIHN1YnNjcmliZXJzIHJlZ2lzdGVyZWQgd2l0aCBtYXRjaGluZyBwYXR0ZXJuIHdpbGwgYmUgcmV0dXJuZWQgKHVubGVzcyB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyBmYWxzZSkuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGluY2x1ZGVQYXR0ZXJuU3Vic2NyaWJlcnMgT3B0aW9uYWwgZmFsc2UgdG8gcHJldmVudCBpbmNsdXNpb24gb2YgcGF0dGVyIHN1YnNjcmliZXJzLCBieSBkZWZhdWx0IHRoZXkgYXJlIGluY2x1ZGVkLlxuICogQHJldHVybiB7QXJyYXl8dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBnZXRTdWJzY3JpYmVycyhtZXNzYWdlLCBpbmNsdWRlUGF0dGVyblN1YnNjcmliZXJzKSB7XG4gICAgY2hlY2sobWVzc2FnZSwgTWF0Y2guT25lT2YoU3RyaW5nLCBSZWdFeHApKTtcblxuICAgIHZhciBzdWJzY3JpYmVyc0hhc2ggPSB0aGlzLl9jaG9vc2VTdWJzY3JpYmVyc0hhc2gobWVzc2FnZSk7XG4gICAgdmFyIG1zZ1N1YnNjcmliZXJzID0gc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBbXS5jb25jYXQoc3Vic2NyaWJlcnNIYXNoW21lc3NhZ2VdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogW107XG5cbiAgICAvLyBwYXR0ZXJuIHN1YnNjcmliZXJzIGFyZSBpbmN1ZGVkIGJ5IGRlZmF1bHRcbiAgICBpZiAoaW5jbHVkZVBhdHRlcm5TdWJzY3JpYmVycyAhPT0gZmFsc2UgJiYgdHlwZW9mIG1lc3NhZ2UgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgXy5lYWNoS2V5KHRoaXMuX3BhdHRlcm5NZXNzYWdlU3Vic2NyaWJlcnMsXG4gICAgICAgICAgICBmdW5jdGlvbihwYXR0ZXJuU3Vic2NyaWJlcnMpIHtcbiAgICAgICAgICAgICAgICB2YXIgcGF0dGVybiA9IHBhdHRlcm5TdWJzY3JpYmVycy5wYXR0ZXJuO1xuICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuU3Vic2NyaWJlcnMgJiYgcGF0dGVyblN1YnNjcmliZXJzLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgcGF0dGVybi50ZXN0KG1lc3NhZ2UpKVxuICAgICAgICAgICAgICAgICAgICBfLmFwcGVuZEFycmF5KG1zZ1N1YnNjcmliZXJzLCBwYXR0ZXJuU3Vic2NyaWJlcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIHJldHVybiB1bmRlZmluZWQgaWYgdGhlcmUgYXJlIG5vIHN1YnNjcmliZXJzXG4gICAgcmV0dXJuIG1zZ1N1YnNjcmliZXJzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8gbXNnU3Vic2NyaWJlcnNcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbn1cblxuXG4vKipcbiAqIFwiUHJpdmF0ZVwiIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2RcbiAqIFJldHVybnMgdGhlIG1hcCBvZiBzdWJzY3JpYmVycyBmb3IgYSBnaXZlbiBtZXNzYWdlIHR5cGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gbWVzc2FnZSBNZXNzYWdlIHRvIGNob29zZSB0aGUgbWFwIG9mIHN1YnNjcmliZXJzIGZvclxuICogQHJldHVybiB7T2JqZWN0W0Z1bmN0aW9uXX1cbiAqL1xuZnVuY3Rpb24gX2Nob29zZVN1YnNjcmliZXJzSGFzaChtZXNzYWdlKSB7XG4gICAgcmV0dXJuIG1lc3NhZ2UgaW5zdGFuY2VvZiBSZWdFeHBcbiAgICAgICAgICAgICAgICA/IHRoaXMuX3BhdHRlcm5NZXNzYWdlU3Vic2NyaWJlcnNcbiAgICAgICAgICAgICAgICA6IHRoaXMuX21lc3NhZ2VTdWJzY3JpYmVycztcbn1cblxuXG4vKipcbiAqIE1lc3NlbmdlciBpbnN0YW5jZSBtZXRob2RcbiAqIFNldHMgW01lc3NhZ2VTb3VyY2VdKC4vbV9zb3VyY2UuanMuaHRtbCkgZm9yIHRoZSBtZXNzZW5nZXIgYWxzbyBzZXR0aW5nIHRoZSByZWZlcmVuY2UgdG8gdGhlIG1lc3NlbmdlciBpbiB0aGUgTWVzc2FnZVNvdXJjZS5cbiAqIE1lc3NhZ2VTb3VyY2UgY2FuIGJlIHBhc3NlZCB0byBtZXNzYWdlIGNvbnN0cnVjdG9yOyB0aGlzIG1ldGhvZCBhbGxvd3MgdG8gc2V0IGl0IGF0IGEgbGF0ZXIgdGltZS4gRm9yIGV4YW1wbGUsIHRoZSBzdWJjbGFzc2VzIG9mIFtDb21wb25lbnRGYWNldF0oLi4vY29tcG9uZW50cy9jX2ZhY2V0LmpzLmh0bWwpIHVzZSB0aGlzIG1ldGhvZCB0byBzZXQgZGlmZmVyZW50IE1lc3NhZ2VTb3VyY2UnZXMgaW4gdGhlIG1lc3NlbmdlciB0aGF0IGlzIGNyZWF0ZWQgYnkgQ29tcG9uZW50RmFjZXQuXG4gKiBDdXJyZW50bHkgdGhlIG1ldGhvZCBpcyBpbXBsZW1lbnRlZCBpbiBzdWNoIHdheSB0aGF0IGl0IGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIC0gTWVzc2FnZVNvdXJjZSBjYW5ub3QgYmUgY2hhbmdlZCBhZnRlciB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuXG4gKlxuICogQHBhcmFtIHtNZXNzYWdlU291cmNlfSBtZXNzYWdlU291cmNlIGFuIGluc3RhbmNlIG9mIE1lc3NhZ2VTb3VyY2UgY2xhc3MgdG8gYXR0YWNoIHRvIHRoaXMgbWVzc2VuZ2VyIChhbmQgdG8gaGF2ZSB0aGlzIG1lc3NlbmdlciBhdHRhY2hlZCB0byBpdCB0b28pXG4gKi9cbmZ1bmN0aW9uIF9zZXRNZXNzYWdlU291cmNlKG1lc3NhZ2VTb3VyY2UpIHtcbiAgICBjaGVjayhtZXNzYWdlU291cmNlLCBNZXNzYWdlU291cmNlKTtcblxuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgJ19tZXNzYWdlU291cmNlJywgbWVzc2FnZVNvdXJjZSk7XG4gICAgbWVzc2FnZVNvdXJjZS5tZXNzZW5nZXIgPSB0aGlzO1xufVxuXG5cbi8qKlxuICogTWVzc2VuZ2VyIGluc3RhbmNlIG1ldGhvZFxuICogUmV0dXJucyBtZXNzZW5nZXIgTWVzc2FnZVNvdXJjZVxuICpcbiAqIEByZXR1cm4ge01lc3NhZ2VTb3VyY2V9XG4gKi9cbmZ1bmN0aW9uIGdldE1lc3NhZ2VTb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21lc3NhZ2VTb3VyY2Vcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKVxuICAgICwgbG9nZ2VyID0gcmVxdWlyZSgnLi4vdXRpbC9sb2dnZXInKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IE1lc3NlbmdlckFQSTtcblxuXG4vKipcbiAqIGBtaWxvLmNsYXNzZXMuTWVzc2VuZ2VyQVBJYFxuICogQmFzZSBjbGFzcywgc3ViY2xhc3NlcyBvZiB3aGljaCBjYW4gc3VwcGxlbWVudCB0aGUgZnVuY3Rpb25hbGl0eSBvZiBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBieSBpbXBsZW1lbnRpbmcgdGhyZWUgbWV0aG9kczpcbiAqXG4gKiAtIGB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2VgIHRvIHRyYW5zbGF0ZSBzb3VyY2UgbWVzc2FnZXMgKHJlY2lldmVkIGZyb20gZXh0ZXJuYWwgc291cmNlIHZpYSBgTWVzc2FnZVNPdXJjZWApIHRvIGludGVybmFsIG1lc3NhZ2VzICh0aGF0IGFyZSBkaXNwYXRjaGVkIG9uIE1lc3NlbmdlciksIGFsbG93aW5nIHRvIG1ha2UgaW50ZXJuYWwgbWVzc2FnZXMgbW9yZSBkZXRhaWxlZCB0aGFuIHNvdXJjZSBtZXNzYWdlcy4gRm9yIGV4YW1wbGUsIFtEYXRhIGZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXRzL0RhdGEuanMuaHRtbCkgdXNlcyBbRGF0YU1zZ0FQSV0oLi4vY29tcG9uZW50cy9tc2dfYXBpL2RhdGEuanMuaHRtbCkgdG8gZGVmaW5lIHNldmVyYWwgaW50ZXJuYWwgbWVzc2FnZXMgcmVsYXRlZCB0byB0aGUgY2hhbmdlIG9mIHN0YXRlIGluIGNvbnRlbnRlZGl0YWJsZSBET00gZWxlbWVudC5cbiAqIC0gYGNyZWF0ZUludGVybmFsRGF0YWAgdG8gbW9kaWZ5IG1lc3NhZ2UgZGF0YSByZWNlaXZlZCBmcm9tIHNvdXJjZSB0byBzb21lIG1vcmUgbWVhbmluZ2Z1bCBvciBtb3JlIGRldGFpbGVkIG1lc3NhZ2UgZGF0YSB0aGF0IHdpbGwgYmUgZGlzcGF0Y2hlZCBvbiBNZXNzZW5nZXIuIEZvciBleGFtcGxlLCBbRGF0YSBmYWNldF0oLi4vY29tcG9uZW50cy9jX2ZhY2V0cy9EYXRhLmpzLmh0bWwpIHVzZXMgW0RhdGFNc2dBUEldKC4uL2NvbXBvbmVudHMvbXNnX2FwaS9kYXRhLmpzLmh0bWwpIChzdWJjbGFzcyBvZiBNZXNzZW5nZXJBUEkpIHRvIHRyYW5zbGF0ZSBET00gbWVzc2FnZXMgdG8gZGF0YSBjaGFuZ2UgbWVzc2FnZXMuXG4gKiAtIGBmaWx0ZXJTb3VyY2VNZXNzYWdlYCB0byBlbmFibGUvZGlzYWJsZSBtZXNzYWdlIGRpc3BhdGNoIGJhc2VkIG9uIHNvbWUgY29uZGl0aW9ucyBpbiBkYXRhLlxuICpcbiAqIElmIGBNZXNzYWdlU291cmNlYCBjb25zdHJ1Y3RvciBpcyBub3QgcGFzc2VkIGFuIGluc3RhbmNlIG9mIHNvbWUgc3ViY2xhc3Mgb2YgYE1lc3NlbmdlckFQSWAsIGl0IGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBNZXNzZW5nZXJBUEkgdGhhdCBkZWZpbmVzIGFsbCAzIG9mIHRob3NlIG1ldGhvZHMgaW4gYSB0cml2aWFsIHdheS4gU2VlIHRoZXNlIG1ldGhvZHMgYmVsb3cgZm9yIHRoZWlyIHNpZ25hdHVyZXMuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAdGhpcyB7TWVzc2VuZ2VyQVBJfVxuICogQHJldHVybiB7TWVzc2VuZ2VyQVBJfVxuICovXG5mdW5jdGlvbiBNZXNzZW5nZXJBUEkoKSB7XG4gICAgaWYgKHRoaXMuaW5pdClcbiAgICAgICAgdGhpcy5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cblxuLyoqXG4gKiAjIyMjTWVzc2VuZ2VyQVBJIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbaW5pdF0oI2luaXQpIC0gaW5pdGlhbGl6ZXMgTWVzc2VuZ2VyQVBJXG4gKiAtIFthZGRJbnRlcm5hbE1lc3NhZ2VdKCNhZGRJbnRlcm5hbE1lc3NhZ2UpIC0gYWRkcyBpbnRlcm5hbCBtZXNzYWdlXG4gKiAtIFtyZW1vdmVJbnRlcm5hbE1lc3NhZ2VdKCNyZW1vdmVJbnRlcm5hbE1lc3NhZ2UpIC0gcmVtb3ZlcyBpbnRlcm5hbCBtZXNzYWdlXG4gKiAtIFtnZXRJbnRlcm5hbE1lc3NhZ2VzXSgjZ2V0SW50ZXJuYWxNZXNzYWdlcykgLSByZXR1cm5zIHRoZSBsaXN0IG9mIGludGVybmFsIG1lc3NhZ2VzIGZvciBnaXZlbiBzb3VyY2UgbWVzc2FnZVxuICpcbiAqIFRoZXNlIG1ldGhvZHMgc2hvdWxkIGJlIHJlZGVmaW5lZCBieSBzdWJjbGFzczpcbiAqXG4gKiAtIFt0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2VdKCN0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UpIC0gY29udmVydHMgaW50ZXJuYWwgbWVzc2FnZSB0eXBlIHRvIHNvdXJjZSAoZXh0ZXJuYWwpIG1lc3NhZ2UgdHlwZVxuICogLSBbY3JlYXRlSW50ZXJuYWxEYXRhXSgjY3JlYXRlSW50ZXJuYWxEYXRhKSAtIGNvbnZlcnRzIHNvdXJjZSBtZXNzYWdlIGRhdGEgcmVjZWl2ZWQgdmlhIE1lc3NhZ2VTb3VyY2UgdG8gaW50ZXJuYWwgbWVzc2FnZSBkYXRhXG4gKiAtIFtmaWx0ZXJTb3VyY2VNZXNzYWdlXSgjZmlsdGVyU291cmNlTWVzc2FnZSkgLSBmaWx0ZXJzIHNvdXJjZSBtZXNzYWdlIGJhc2VkIG9uIHRoZSBkYXRhIG9mIHRoZSBtZXNzYWdlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBpbnRlcm5hbCBtZXNzYWdlIHRoYXQgaXMgYWJvdXQgdG8gYmUgc2VudCBvbiBNZXNzZW5nZXJcbiAqL1xuXy5leHRlbmRQcm90byhNZXNzZW5nZXJBUEksIHtcbiAgICBpbml0OiBpbml0LFxuICAgIGRlc3Ryb3k6IE1lc3NlbmdlckFQSSRkZXN0cm95LFxuICAgIGFkZEludGVybmFsTWVzc2FnZTogYWRkSW50ZXJuYWxNZXNzYWdlLFxuICAgIHJlbW92ZUludGVybmFsTWVzc2FnZTogcmVtb3ZlSW50ZXJuYWxNZXNzYWdlLFxuICAgIGdldEludGVybmFsTWVzc2FnZXM6IGdldEludGVybmFsTWVzc2FnZXMsXG5cbiAgICAvLyBzaG91bGQgYmUgcmVkZWZpbmVkIGJ5IHN1YmNsYXNzXG4gICAgdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlOiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UsXG4gICAgY3JlYXRlSW50ZXJuYWxEYXRhOiBjcmVhdGVJbnRlcm5hbERhdGEsXG4gICAgZmlsdGVyU291cmNlTWVzc2FnZTogZmlsdGVyU291cmNlTWVzc2FnZVxufSk7XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBDYWxsZWQgYnkgTWVzc2VuZ2VyQVBJIGNvbnN0cnVjdG9yLiBTdWJjbGFzc2VzIHRoYXQgcmUtaW1wbGVtZW50IGBpbml0YCBtZXRob2Qgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgdXNpbmc6IGBNZXNzZW5nZXJBUEkucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKWBcbiAqL1xuZnVuY3Rpb24gaW5pdCgpIHtcbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsICdfaW50ZXJuYWxNZXNzYWdlcycsIHt9KTtcbn1cblxuXG4vKipcbiAqIERlc3Ryb3lzIG1lc3NlbmdlciBBUElcbiAqL1xuZnVuY3Rpb24gTWVzc2VuZ2VyQVBJJGRlc3Ryb3koKSB7XG5cbn1cblxuXG4vKipcbiAqIE1lc3NlbmdlckFQSSBpbnN0YW5jZSBtZXRob2RcbiAqIFRyYW5zbGF0ZXMgaW50ZXJuYWwgYG1lc3NhZ2VgIHRvIHNvdXJjZSBtZXNzYWdlLCBhZGRzIGludGVybmFsIGBtZXNzYWdlYCB0byB0aGUgbGlzdCwgbWFraW5nIHN1cmUgdGhlIHNhbWUgYG1lc3NhZ2VgIHdhc24ndCBwYXNzZWQgYmVmb3JlIChpdCB3b3VsZCBpbmRpY2F0ZSBNZXNzZW5nZXIgZXJyb3IpLlxuICogUmV0dXJucyBzb3VyY2UgbWVzc2FnZSBpZiBpdCBpcyB1c2VkIGZpcnN0IHRpbWUgKHNvIHRoYXQgYE1lc3NhZ2VTb3VyY2VgIHN1YmNyaWJlcyB0byB0aGlzIHNvdXJjZSBtZXNzYWdlKSBvciBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBpbnRlcm5hbCBtZXNzYWdlIHRvIGJlIHRyYW5zbGF0ZWQgYW5kIGFkZGVkXG4gKiBAcmV0dXJuIHtTdHJpbmd8dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBhZGRJbnRlcm5hbE1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHZhciBpbnRlcm5hbE1zZ3NcbiAgICAgICAgLCBzb3VyY2VNZXNzYWdlID0gdGhpcy50cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UobWVzc2FnZSk7XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZU1lc3NhZ2UgPT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcblxuICAgIGlmICh0aGlzLl9pbnRlcm5hbE1lc3NhZ2VzLmhhc093blByb3BlcnR5KHNvdXJjZU1lc3NhZ2UpKSB7XG4gICAgICAgIGludGVybmFsTXNncyA9IHRoaXMuX2ludGVybmFsTWVzc2FnZXNbc291cmNlTWVzc2FnZV07XG4gICAgICAgIGlmIChpbnRlcm5hbE1zZ3MuaW5kZXhPZihtZXNzYWdlKSA9PSAtMSlcbiAgICAgICAgICAgIGludGVybmFsTXNncy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsb2dnZXIud2FybignRHVwbGljYXRlIGFkZEludGVybmFsTWVzc2FnZSBjYWxsIGZvciBpbnRlcm5hbCBtZXNzYWdlICcgKyBtZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpbnRlcm5hbE1zZ3MgPSB0aGlzLl9pbnRlcm5hbE1lc3NhZ2VzW3NvdXJjZU1lc3NhZ2VdID0gW107XG4gICAgICAgIGludGVybmFsTXNncy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gc291cmNlTWVzc2FnZTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZW1vdmVzIGludGVybmFsIGBtZXNzYWdlYCBmcm9tIHRoZSBsaXN0IGNvbm5lY3RlZCB0byBjb3JyZXNwb25kaW5nIHNvdXJjZSBtZXNzYWdlIChgdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlYCBpcyB1c2VkIGZvciB0cmFuc2xhdGlvbikuXG4gKiBSZXR1cm5zIHNvdXJjZSBtZXNzYWdlLCBpZiB0aGUgbGFzdCBpbnRlcm5hbCBtZXNzYWdlIHdhcyByZW1vdmVkIChzbyB0aGF0IGBNZXNzYWdlU291cmNlYCBjYW4gdW5zdWJzY3JpYmUgZnJvbSB0aGlzIHNvdXJjZSBtZXNzYWdlKSwgb3IgYHVuZGVmaW5lZGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgaW50ZXJuYWwgbWVzc2FnZSB0byBiZSB0cmFuc2xhdGVkIGFuZCByZW1vdmVkXG4gKiBAcmV0dXJuIHtTdHJpbmd8dW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiByZW1vdmVJbnRlcm5hbE1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHZhciBzb3VyY2VNZXNzYWdlID0gdGhpcy50cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UobWVzc2FnZSk7XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZU1lc3NhZ2UgPT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcblxuICAgIHZhciBpbnRlcm5hbE1zZ3MgPSB0aGlzLl9pbnRlcm5hbE1lc3NhZ2VzW3NvdXJjZU1lc3NhZ2VdO1xuXG4gICAgaWYgKGludGVybmFsTXNncyAmJiBpbnRlcm5hbE1zZ3MubGVuZ3RoKSB7XG4gICAgICAgIHZhciBtZXNzYWdlSW5kZXggPSBpbnRlcm5hbE1zZ3MuaW5kZXhPZihtZXNzYWdlKTtcbiAgICAgICAgaWYgKG1lc3NhZ2VJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBpbnRlcm5hbE1zZ3Muc3BsaWNlKG1lc3NhZ2VJbmRleCwgMSk7XG4gICAgICAgICAgICBpZiAoaW50ZXJuYWxNc2dzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2ludGVybmFsTWVzc2FnZXNbc291cmNlTWVzc2FnZV07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZU1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgdW5leHBlY3RlZE5vdGlmaWNhdGlvbldhcm5pbmcoKTtcbiAgICB9IGVsc2VcbiAgICAgICAgdW5leHBlY3RlZE5vdGlmaWNhdGlvbldhcm5pbmcoKTtcblxuXG4gICAgZnVuY3Rpb24gdW5leHBlY3RlZE5vdGlmaWNhdGlvbldhcm5pbmcoKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdub3RpZmljYXRpb24gcmVjZWl2ZWQ6IHVuLXN1YnNjcmliZSBmcm9tIGludGVybmFsIG1lc3NhZ2UgJyArIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICsgJyB3aXRob3V0IHByZXZpb3VzIHN1YnNjcmlwdGlvbiBub3RpZmljYXRpb24nKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBpbnRlcm5hbCBtZXNzYWdlcyB0aGF0IHdlcmUgdHJhbnNsYXRlZCB0byBnaXZlbiBgc291cmNlTWVzc2FnZWAuXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IGBNZXNzYWdlU291cmNlYCB0byBkaXNwYXRjaCBzb3VyY2UgbWVzc2FnZSBvbiB0aGUgYE1lc2VuZ2VyYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc291cmNlTWVzc2FnZSBzb3VyY2UgbWVzc2FnZVxuICogQHJldHVybiB7QXJyYXlbU3RyaW5nXX1cbiAqL1xuZnVuY3Rpb24gZ2V0SW50ZXJuYWxNZXNzYWdlcyhzb3VyY2VNZXNzYWdlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ludGVybmFsTWVzc2FnZXNbc291cmNlTWVzc2FnZV07XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBTdWJjbGFzc2VzIHNob3VsZCByZS1pbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gZGVmaW5lIHRoZSBydWxlIGZvciB0cmFuc2xhdGlvbiBvZiBpbnRlcm5hbCBgbWVzc2FnZWAgdG8gc291cmNlIG1lc3NhZ2UuIFRoaXMgY2xhc3Mgc2ltcGx5IHJldHVybnMgdGhlIHNhbWUgYG1lc3NhZ2VgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIGludGVybmFsIG1lc3NhZ2UgdG8gYmUgdHJhbnNsYXRlZFxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHJldHVybiBtZXNzYWdlXG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBTdWJjbGFzc2VzIHNob3VsZCByZS1pbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gZGVmaW5lIHRoZSBydWxlIGZvciB0cmFuc2xhdGlvbiBvZiBzb3VyY2UgbWVzc2FnZSBkYXRhIHRvIGludGVybmFsIG1lc3NhZ2UgZGF0YS4gVGhpcyBjbGFzcyBzaW1wbHkgcmV0dXJucyB0aGUgc2FtZSBgc291cmNlRGF0YWAuXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGluIFtkaXNwYXRjaE1lc3NhZ2VdKC4vbV9zb3VyY2UuanMuaHRtbCNkaXNwYXRjaE1lc3NhZ2UpIG1ldGhvZCBvZiBgTWVzc2FnZVNvdXJjZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNvdXJjZU1lc3NhZ2Ugc291cmNlIG1lc3NhZ2UsIGNhbiBiZSB1c2VkIGluIHRyYW5zbGF0aW9uIHJ1bGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIGludGVybmFsIG1lc3NhZ2UsIGNhbiBiZSB1c2VkIGluIHRyYW5zbGF0aW9uIHJ1bGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2VEYXRhIGRhdGEgcmVjZWl2ZWQgZnJvbSBzb3VyY2UgdGhhdCBoYXMgdG8gYmUgdHJhbnNsYXRlZCB0byBkYXRhIHRoYXQgd2lsbCBiZSBzZW50IHRvIGludGVybmFsIE1lc3NlbmdlciBzdWJzY3JpYmVyXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUludGVybmFsRGF0YShzb3VyY2VNZXNzYWdlLCBtZXNzYWdlLCBzb3VyY2VEYXRhKSB7XG4gICAgcmV0dXJuIHNvdXJjZURhdGE7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBTdWJjbGFzc2VzIHNob3VsZCByZS1pbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gZGVmaW5lIHRoZSBkaXNwYXRjaCBmaWx0ZXIgZm9yIGludGVybmFsIG1lc3NhZ2VzLiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGB0cnVlYCB0byBhbGxvdyBhbmQgYGZhbHNlYCB0byBwcmV2ZW50IGludGVybmFsIG1lc3NhZ2UgZGlzcGF0Y2guIFRoaXMgY2xhc3MgYWx3YXlzIHJldHVybnMgYHRydWVgLlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBpbiBbZGlzcGF0Y2hNZXNzYWdlXSguL21fc291cmNlLmpzLmh0bWwjZGlzcGF0Y2hNZXNzYWdlKSBtZXRob2Qgb2YgYE1lc3NhZ2VTb3VyY2VgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzb3VyY2VNZXNzYWdlIHNvdXJjZSBtZXNzYWdlLCBjYW4gYmUgdXNlZCBpbiBmaWx0ZXIgcnVsZVxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgaW50ZXJuYWwgbWVzc2FnZSwgY2FuIGJlIHVzZWQgaW4gZmlsdGVyIHJ1bGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnRlcm5hbERhdGEgZGF0YSB0cmFuc2xhdGVkIGJ5IGBjcmVhdGVJbnRlcm5hbERhdGFgIG1ldGhvZCBmcm9tIHNvdXJjZSBkYXRhLCBjYW4gYmUgdXNlZCBpbiBmaWx0ZXIgcnVsZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gZmlsdGVyU291cmNlTWVzc2FnZShzb3VyY2VNZXNzYWdlLCBtZXNzYWdlLCBpbnRlcm5hbERhdGEpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIE1lc3NlbmdlckFQSSA9IHJlcXVpcmUoJy4vbV9hcGknKVxuICAgICwgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpO1xuXG5cbi8qKlxuICogQSBnZW5lcmljIHN1YnNjbGFzcyBvZiBbTWVzc2VuZ2VyQVBJXSguL21fYXBpLmpzLmh0bWwpIHRoYXQgc3VwcG9ydHMgcGF0dGVybiBzdWJzY3JpcHRpb25zIHRvIHNvdXJjZS5cbiAqIENhbiBiZSB1c2VmdWwgaWYgdGhlIHNvdXJjZSBpcyBhbm90aGVyIE1lc3Nlbmdlci5cbiAqL1xuIHZhciBNZXNzZW5nZXJSZWdleHBBUEkgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NlbmdlckFQSSwgJ01lc3NlbmdlclJlZ2V4cEFQSScpO1xuXG4gbW9kdWxlLmV4cG9ydHMgPSBNZXNzZW5nZXJSZWdleHBBUEk7XG5cblxuXy5leHRlbmRQcm90byhNZXNzZW5nZXJSZWdleHBBUEksIHtcbiAgICBpbml0OiBpbml0LFxuICAgIGFkZEludGVybmFsTWVzc2FnZTogYWRkSW50ZXJuYWxNZXNzYWdlLFxuICAgIHJlbW92ZUludGVybmFsTWVzc2FnZTogcmVtb3ZlSW50ZXJuYWxNZXNzYWdlLFxuICAgIGdldEludGVybmFsTWVzc2FnZXM6IGdldEludGVybmFsTWVzc2FnZXNcbn0pO1xuXG5cbi8qKlxuICogTWVzc2VuZ2VyUmVnZXhwQVBJIGluc3RhbmNlIG1ldGhvZFxuICogQ2FsbGVkIGJ5IE1lc3NlbmdlclJlZ2V4cEFQSSBjb25zdHJ1Y3Rvci5cbiAqL1xuZnVuY3Rpb24gaW5pdCgpIHtcbiAgICBNZXNzZW5nZXJBUEkucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBfLmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICBfcGF0dGVybkludGVybmFsTWVzc2FnZXM6IHt9XG4gICAgfSk7XG4gICAgdGhpcy5fY2F0Y2hBbGxTdWJzY3JpYmVkID0gZmFsc2U7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJSZWdleHBBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBBdWdtZW50cyBNZXNzZW5nZXJBUEkgbWV0aG9kIGJ5IHN0b3JpbmcgcmVnZXhwXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgaW50ZXJuYWwgbWVzc2FnZSB0byBiZSB0cmFuc2xhdGVkIGFuZCBhZGRlZFxuICogQHJldHVybiB7U3RyaW5nfFJlZ0V4cHx1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIGFkZEludGVybmFsTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgdmFyIHNvdXJjZU1lc3NhZ2UgPSBNZXNzZW5nZXJBUEkucHJvdG90eXBlLmFkZEludGVybmFsTWVzc2FnZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIFxuICAgIC8vIHN0b3JlIHJlZ2V4cCBpdHNlbGYgaWYgc291cmNlTWVzc2FnZSBpcyByZWdleHBcbiAgICBpZiAoc291cmNlTWVzc2FnZSAmJiBzb3VyY2VNZXNzYWdlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHRoaXMuX2ludGVybmFsTWVzc2FnZXNbc291cmNlTWVzc2FnZV0ucGF0dGVybiA9IHNvdXJjZU1lc3NhZ2U7XG4gICAgICAgIHRoaXMuX3BhdHRlcm5JbnRlcm5hbE1lc3NhZ2VzW3NvdXJjZU1lc3NhZ2VdID0gdGhpcy5faW50ZXJuYWxNZXNzYWdlc1tzb3VyY2VNZXNzYWdlXTtcbiAgICAgICAgaWYgKHRoaXMuX2NhdGNoQWxsU3Vic2NyaWJlZCkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5fY2F0Y2hBbGxTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIC8uKi87XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvdXJjZU1lc3NhZ2U7XG59XG5cblxuLyoqXG4gKiBNZXNzZW5nZXJSZWdleHBBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBBdWdtZW50cyBNZXNzZW5nZXJBUEkgbWV0aG9kIGJ5IHJlbW92aW5nIHJlZ2V4cCBzdWJzY2lycHRpb25cbiAqIFxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgaW50ZXJuYWwgbWVzc2FnZSB0byBiZSB0cmFuc2xhdGVkIGFuZCBhZGRlZFxuICogQHJldHVybiB7U3RyaW5nfFJlZ0V4cHx1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUludGVybmFsTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgdmFyIHNvdXJjZU1lc3NhZ2UgPSBNZXNzZW5nZXJBUEkucHJvdG90eXBlLnJlbW92ZUludGVybmFsTWVzc2FnZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgaWYgKHNvdXJjZU1lc3NhZ2UgJiYgc291cmNlTWVzc2FnZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICBkZWxldGUgdGhpcy5fcGF0dGVybkludGVybmFsTWVzc2FnZXNbc291cmNlTWVzc2FnZV07XG4gICAgICAgIHZhciBub1BhdHRlcm5JbnRlcm5hbE1lc3NhZ2VzID0gISBPYmplY3Qua2V5cyh0aGlzLl9wYXR0ZXJuSW50ZXJuYWxNZXNzYWdlcykubGVuZ3RoO1xuICAgICAgICBpZiAobm9QYXR0ZXJuSW50ZXJuYWxNZXNzYWdlcykge1xuICAgICAgICAgICAgdGhpcy5fY2F0Y2hBbGxTdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gLy4qLztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzb3VyY2VNZXNzYWdlO1xufVxuXG5cbi8qKlxuICogTWVzc2VuZ2VyQVBJIGluc3RhbmNlIG1ldGhvZFxuICogQXVnbWVudHMgTWVzc2VuZ2VyQVBJIG1ldGhvZCBieSByZXR1cm5pbmcgbWVzc2FnZXMgc3Vic2NyaWJlZCB3aXRoIHJlZ2V4cFxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBieSBgTWVzc2FnZVNvdXJjZWAgdG8gZGlzcGF0Y2ggc291cmNlIG1lc3NhZ2Ugb24gdGhlIGBNZXNlbmdlcmAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBzb3VyY2VNZXNzYWdlIHNvdXJjZSBtZXNzYWdlXG4gKiBAcmV0dXJuIHtBcnJheVtTdHJpbmddfVxuICovXG5mdW5jdGlvbiBnZXRJbnRlcm5hbE1lc3NhZ2VzKHNvdXJjZU1lc3NhZ2UpIHtcbiAgICB2YXIgaW50ZXJuYWxNZXNzYWdlcyA9IE1lc3NlbmdlckFQSS5wcm90b3R5cGUuZ2V0SW50ZXJuYWxNZXNzYWdlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgLy8gYWRkIGludGVybmFsIG1lc3NhZ2VzIGZvciByZWdleHAgc291cmNlIHN1YnNjcmlwdGlvbnNcbiAgICBpZiAodHlwZW9mIHNvdXJjZU1lc3NhZ2UgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgaW50ZXJuYWxNZXNzYWdlcyA9IGludGVybmFsTWVzc2FnZXMgfHwgW107XG4gICAgICAgIHZhciBpbnRlcm5hbE1lc3NhZ2VzSGFzaCA9IF8ub2JqZWN0KGludGVybmFsTWVzc2FnZXMsIHRydWUpO1xuXG4gICAgICAgIF8uZWFjaEtleSh0aGlzLl9wYXR0ZXJuSW50ZXJuYWxNZXNzYWdlcywgZnVuY3Rpb24ocGF0dGVybk1lc3NhZ2VzKSB7XG4gICAgICAgICAgICB2YXIgc291cmNlUGF0dGVybiA9IHBhdHRlcm5NZXNzYWdlcy5wYXR0ZXJuO1xuXG4gICAgICAgICAgICBpZiAoc291cmNlUGF0dGVybi50ZXN0KHNvdXJjZU1lc3NhZ2UpKVxuICAgICAgICAgICAgICAgIHBhdHRlcm5NZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGludGVybmFsTWVzc2FnZXNIYXNoW21lc3NhZ2VdKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGludGVybmFsTWVzc2FnZXMucHVzaChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxNZXNzYWdlc0hhc2hbbWVzc2FnZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9IFxuXG4gICAgcmV0dXJuIGludGVybmFsTWVzc2FnZXM7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBNaXhpbiA9IHJlcXVpcmUoJy4uL2Fic3RyYWN0L21peGluJylcbiAgICAsIE1lc3NlbmdlckFQSSA9IHJlcXVpcmUoJy4vbV9hcGknKVxuICAgICwgbG9nZ2VyID0gcmVxdWlyZSgnLi4vdXRpbC9sb2dnZXInKVxuICAgICwgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpXG4gICAgLCBjaGVjayA9IHJlcXVpcmUoJy4uL3V0aWwvY2hlY2snKVxuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaDtcblxuXG4vKipcbiAqIGBtaWxvLmNsYXNzZXMuTWVzc2FnZVNvdXJjZWBcbiAqIEFuIGFic3RyYWN0IGNsYXNzIChzdWJjbGFzcyBvZiBbTWl4aW5dKC4uL2Fic3RyYWN0L21peGluLmpzLmh0bWwpKSBmb3IgY29ubmVjdGluZyBbTWVzc2VuZ2VyXSguL2luZGV4LmpzLmh0bWwpIHRvIGV4dGVybmFsIHNvdXJjZXMgb2YgbWVzc2FnZXMgKGxpa2UgRE9NIGV2ZW50cykgYW5kIGRlZmluaW5nIGhpZ2hlciBsZXZlbCBtZXNzYWdlcy5cbiAqIEFuIGluc3RhbmNlIG9mIE1lc3NhZ2VTb3VyY2UgY2FuIGVpdGhlciBiZSBwYXNzZWQgdG8gTWVzc2VuZ2VyIGNvbnN0cnVjdG9yIG9yIGxhdGVyIHVzaW5nIGBfc2V0TWVzc2FnZVNvdXJjZWAgbWV0aG9kIG9mIE1lc3Nlbmdlci4gT25jZSBzZXQsIE1lc3NhZ2VTb3VyY2Ugb2YgTWVzc2VuZ2VyIGNhbm5vdCBiZSBjaGFuZ2VkLlxuICovXG52YXIgTWVzc2FnZVNvdXJjZSA9IF8uY3JlYXRlU3ViY2xhc3MoTWl4aW4sICdNZXNzYWdlU291cmNlJywgdHJ1ZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTWVzc2FnZVNvdXJjZTtcblxuXG4vKipcbiAqICMjIyNNZXNzYWdlU291cmNlIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbaW5pdF0oI2luaXQpIC0gaW5pdGlhbGl6ZXMgbWVzc2FnZVNvdXJjZSAtIGNhbGxlZCBieSBNaXhpbiBzdXBlcmNsYXNzXG4gKiAtIFtzZXRNZXNzZW5nZXJdKCNzZXRNZXNzZW5nZXIpIC0gY29ubmVjdHMgTWVzc2VuZ2VyIHRvIE1lc3NhZ2VTb3VyY2UsIGlzIGNhbGxlZCBmcm9tIGBpbml0YCBvciBgX3NldE1lc3NhZ2VTb3VyY2VgIG1ldGhvZHMgb2YgW01lc3Nlbmdlcl0oLi9pbmRleC5qcy5odG1sKS5cbiAqIC0gW29uU3Vic2NyaWJlckFkZGVkXSgjb25TdWJzY3JpYmVyQWRkZWQpIC0gY2FsbGVkIGJ5IE1lc3NlbmdlciB0byBub3RpZnkgd2hlbiB0aGUgZmlyc3Qgc3Vic2NyaWJlciBmb3IgYW4gaW50ZXJuYWwgbWVzc2FnZSB3YXMgYWRkZWQsIHNvIE1lc3NhZ2VTb3VyY2UgY2FuIHN1YnNjcmliZSB0byBzb3VyY2VcbiAqIC0gW29uU3Vic2NyaWJlclJlbW92ZWRdKCNvblN1YnNjcmliZXJSZW1vdmVkKSAtIGNhbGxlZCBieSBNZXNzZW5nZXIgdG8gbm90aWZ5IHdoZW4gdGhlIGxhc3Qgc3Vic2NyaWJlciBmb3IgYW4gaW50ZXJuYWwgbWVzc2FnZSB3YXMgcmVtb3ZlZCwgc28gTWVzc2FnZVNvdXJjZSBjYW4gdW5zdWJzY3JpYmUgZnJvbSBzb3VyY2VcbiAqIC0gW2Rpc3BhdGNoTWVzc2FnZV0oI2Rpc3BhdGNoTWVzc2FnZSkgLSBkaXNwYXRjaGVzIHNvdXJjZSBtZXNzYWdlLiBNZXNzYWdlU291cmNlIHN1YmNsYXNzIHNob3VsZCBpbXBsZW1lbnQgbWVjaGFuaXNtIHdoZW4gb24gYWN0dWFsIHNvdXJjZSBtZXNzYWdlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC5cbiAqXG4gKiBNZXRob2RzIGJlbG93IHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzczpcbiAqXG4gKiAtIFt0cmlnZ2VyXSgjdHJpZ2dlcikgLSB0cmlnZ2VycyBtZXNzYWdlcyBvbiB0aGUgc291cmNlIChhbiBvcHRpb25hbCBtZXRob2QpXG4gKiAtIFthZGRTb3VyY2VTdWJzY3JpYmVyXSgjYWRkU291cmNlU3Vic2NyaWJlcikgLSBhZGRzIGxpc3RlbmVyL3N1YnNjcmliZXIgdG8gZXh0ZXJuYWwgbWVzc2FnZVxuICogLSBbcmVtb3ZlU291cmNlU3Vic2NyaWJlcl0oI3JlbW92ZVNvdXJjZVN1YnNjcmliZXIpIC0gcmVtb3ZlcyBsaXN0ZW5lci9zdWJzY3JpYmVyIGZyb20gZXh0ZXJuYWwgbWVzc2FnZVxuICovXG5fLmV4dGVuZFByb3RvKE1lc3NhZ2VTb3VyY2UsIHtcbiAgICBpbml0OiBpbml0LFxuICAgIGRlc3Ryb3k6IE1lc3NhZ2VTb3VyY2UkZGVzdHJveSxcbiAgICBzZXRNZXNzZW5nZXI6IHNldE1lc3NlbmdlcixcbiAgICBvblN1YnNjcmliZXJBZGRlZDogb25TdWJzY3JpYmVyQWRkZWQsXG4gICAgb25TdWJzY3JpYmVyUmVtb3ZlZDogb25TdWJzY3JpYmVyUmVtb3ZlZCwgXG4gICAgZGlzcGF0Y2hNZXNzYWdlOiBkaXNwYXRjaE1lc3NhZ2UsXG4gICAgcG9zdE1lc3NhZ2U6IHBvc3RNZXNzYWdlLFxuICAgIF9wcmVwYXJlTWVzc2VuZ2VyQVBJOiBfcHJlcGFyZU1lc3NlbmdlckFQSSxcblxuICAgIC8vIE1ldGhvZHMgYmVsb3cgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzc1xuICAgIHRyaWdnZXI6IHRvQmVJbXBsZW1lbnRlZCxcbiAgICBhZGRTb3VyY2VTdWJzY3JpYmVyOiB0b0JlSW1wbGVtZW50ZWQsXG4gICAgcmVtb3ZlU291cmNlU3Vic2NyaWJlcjogdG9CZUltcGxlbWVudGVkXG59KTtcblxuXG4vKipcbiAqIE1lc3NhZ2VTb3VyY2UgaW5zdGFuY2UgbWV0aG9kLlxuICogQ2FsbGVkIGJ5IE1peGluIGNvbnN0cnVjdG9yLlxuICogTWVzc2FnZVNvdXJjZSBjb25zdHJ1Y3RvciBzaG91bGQgYmUgcGFzc2VkIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgdGhpcyBtZXRob2Qgc2lnbmF0dXJlLlxuICogSWYgYW4gaW5zdGFuY2Ugb2YgW01lc3NlbmdlckFQSV0oLi9tX2FwaS5qcy5odG1sKSBpcyBwYXNzZWQgYXMgdGhlIHRoaXJkIHBhcmFtZXRlciwgaXQgZXh0ZW5kcyBNZXNzYWdlU291cmNlIGZ1bmN0aW9uYWxpdHkgdG8gYWxsb3cgaXQgdG8gZGVmaW5lIG5ldyBtZXNzYWdlcywgdG8gZmlsdGVyIG1lc3NhZ2VzIGJhc2VkIG9uIHRoZWlyIGRhdGEgYW5kIHRvIGNoYW5nZSBtZXNzYWdlIGRhdGEuIFNlZSBbTWVzc2VuZ2VyQVBJXSguL21fYXBpLmpzLmh0bWwpLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBob3N0T2JqZWN0IE9wdGlvbmFsIG9iamVjdCB0aGF0IHN0b3JlcyB0aGUgTWVzc2FnZVNvdXJjZSBvbiBvbmUgb2YgaXRzIHByb3BlcnRpZXMuIEl0IGlzIHVzZWQgdG8gcHJveHkgbWV0aG9kcyBvZiBNZXNzYWdlU291cmNlLlxuICogQHBhcmFtIHtPYmplY3RbU3RyaW5nXX0gcHJveHlNZXRob2RzIE9wdGlvbmFsIG1hcCBvZiBtZXRob2QgbmFtZXM7IGtleSAtIHByb3h5IG1ldGhvZCBuYW1lLCB2YWx1ZSAtIE1lc3NhZ2VTb3VyY2UncyBtZXRob2QgbmFtZS5cbiAqIEBwYXJhbSB7TWVzc2VuZ2VyQVBJfSBtZXNzZW5nZXJBUEkgT3B0aW9uYWwgaW5zdGFuY2Ugb2YgTWVzc2VuZ2VyQVBJLlxuICovXG5mdW5jdGlvbiBpbml0KGhvc3RPYmplY3QsIHByb3h5TWV0aG9kcywgbWVzc2VuZ2VyQVBJKSB7XG4gICAgdGhpcy5fcHJlcGFyZU1lc3NlbmdlckFQSShtZXNzZW5nZXJBUEkpO1xufVxuXG5cbi8qKlxuICogRGVzdHJveXMgbWVzc2FnZSBzb3VyY2VcbiAqL1xuZnVuY3Rpb24gTWVzc2FnZVNvdXJjZSRkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLm1lc3NlbmdlckFQSSlcbiAgICAgICAgdGhpcy5tZXNzZW5nZXJBUEkuZGVzdHJveSgpO1xufVxuXG5cbi8qKlxuICogTWVzc2FnZVNvdXJjZSBpbnN0YW5jZSBtZXRob2QuXG4gKiBTZXRzIHJlZmVyZW5jZSB0byBNZXNzZW5nZXIgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtNZXNzZW5nZXJ9IG1lc3NlbmdlciByZWZlcmVuY2UgdG8gTWVzc2VuZ2VyIGluc3RhbmNlIGxpbmtlZCB0byB0aGlzIE1lc3NhZ2VTb3VyY2VcbiAqL1xuZnVuY3Rpb24gc2V0TWVzc2VuZ2VyKG1lc3Nlbmdlcikge1xuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgJ21lc3NlbmdlcicsIG1lc3Nlbmdlcik7XG59XG5cblxuLyoqXG4gKiBNZXNzYWdlU291cmNlIGluc3RhbmNlIG1ldGhvZC5cbiAqIFByZXBhcmVzIFtNZXNzZW5nZXJBUEldKC4vbV9hcGkuanMuaHRtbCkgcGFzc2VkIHRvIGNvbnN0cnVjdG9yIGJ5IHByb3h5aW5nIGl0cyBtZXRob2RzIHRvIGl0c2VsZiBvciBpZiBNZXNzZW5nZXJBUEkgd2Fzbid0IHBhc3NlZCBkZWZpbmVzIHR3byBtZXRob2RzIHRvIGF2b2lkIGNoZWNraW5nIHRoZWlyIGF2YWlsYWJpbGl0eSBldmVyeSB0aW1lIHRoZSBtZXNzYWdlIGlzIGRpc3BhdGNoZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7TWVzc2VuZ2VyQVBJfSBtZXNzZW5nZXJBUEkgT3B0aW9uYWwgaW5zdGFuY2Ugb2YgTWVzc2VuZ2VyQVBJXG4gKi9cbmZ1bmN0aW9uIF9wcmVwYXJlTWVzc2VuZ2VyQVBJKG1lc3NlbmdlckFQSSkge1xuICAgIGNoZWNrKG1lc3NlbmdlckFQSSwgTWF0Y2guT3B0aW9uYWwoTWVzc2VuZ2VyQVBJKSk7XG5cbiAgICBpZiAoISBtZXNzZW5nZXJBUEkpXG4gICAgICAgIG1lc3NlbmdlckFQSSA9IG5ldyBNZXNzZW5nZXJBUEk7XG5cbiAgICBfLmRlZmluZVByb3BlcnR5KHRoaXMsICdtZXNzZW5nZXJBUEknLCBtZXNzZW5nZXJBUEkpO1xufVxuXG5cbi8qKlxuICogTWVzc2FnZVNvdXJjZSBpbnN0YW5jZSBtZXRob2QuXG4gKiBTdWJzY3JpYmVzIHRvIGV4dGVybmFsIHNvdXJjZSB1c2luZyBgYWRkU291cmNlU3Vic2NyaWJlcmAgbWV0aG9kIHRoYXQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHN1YmNsYXNzLlxuICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFtNZXNzZW5nZXJdKC4vaW5kZXguanMuaHRtbCkgd2hlbiB0aGUgZmlyc3Qgc3Vic2NyaWJlciB0byB0aGUgYG1lc3NhZ2VgIGlzIGFkZGVkLlxuICogRGVsZWdhdGVzIHRvIHN1cHBsaWVkIG9yIGRlZmF1bHQgW01lc3NlbmdlckFQSV0oLi9tX2FwaS5qcy5odG1sKSBmb3IgdHJhbnNsYXRpb24gb2YgYG1lc3NhZ2VgIHRvIGBzb3VyY2VNZXNzYWdlYC4gYE1lc3NhZ2VBUEkucHJvdG90eXBlLmFkZEludGVybmFsTWVzc2FnZWAgd2lsbCByZXR1cm4gdW5kZWZpbmVkIGlmIHRoaXMgYHNvdXJjZU1lc3NhZ2VgIHdhcyBhbHJlYWR5IHN1YnNjcmliZWQgdG8gdG8gcHJldmVudCBkdXBsaWNhdGUgc3Vic2NyaXB0aW9uLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIGludGVybmFsIE1lc3NlbmdlciBtZXNzYWdlIHRoYXQgaGFzIHRvIGJlIHN1YnNjcmliZWQgdG8gYXQgdGhlIGV4dGVybmFsIHNvdXJjZSBvZiBtZXNzYWdlcy5cbiAqL1xuZnVuY3Rpb24gb25TdWJzY3JpYmVyQWRkZWQobWVzc2FnZSkge1xuICAgIHZhciBuZXdTb3VyY2VNZXNzYWdlID0gdGhpcy5tZXNzZW5nZXJBUEkuYWRkSW50ZXJuYWxNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIGlmICh0eXBlb2YgbmV3U291cmNlTWVzc2FnZSAhPSAndW5kZWZpbmVkJylcbiAgICAgICAgdGhpcy5hZGRTb3VyY2VTdWJzY3JpYmVyKG5ld1NvdXJjZU1lc3NhZ2UpO1xufVxuXG5cbi8qKlxuICogTWVzc2FnZVNvdXJjZSBpbnN0YW5jZSBtZXRob2QuXG4gKiBVbnN1YnNjcmliZXMgZnJvbSBleHRlcm5hbCBzb3VyY2UgdXNpbmcgYHJlbW92ZVNvdXJjZVN1YnNjcmliZXJgIG1ldGhvZCB0aGF0IHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzcy5cbiAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBbTWVzc2VuZ2VyXSguL2luZGV4LmpzLmh0bWwpIHdoZW4gdGhlIGxhc3Qgc3Vic2NyaWJlciB0byB0aGUgYG1lc3NhZ2VgIGlzIHJlbW92ZWQuXG4gKiBEZWxlZ2F0ZXMgdG8gc3VwcGxpZWQgb3IgZGVmYXVsdCBbTWVzc2VuZ2VyQVBJXSguL21fYXBpLmpzLmh0bWwpIGZvciB0cmFuc2xhdGlvbiBvZiBgbWVzc2FnZWAgdG8gYHNvdXJjZU1lc3NhZ2VgLiBgTWVzc2FnZUFQSS5wcm90b3R5cGUucmVtb3ZlSW50ZXJuYWxNZXNzYWdlYCB3aWxsIHJldHVybiB1bmRlZmluZWQgaWYgdGhpcyBgc291cmNlTWVzc2FnZWAgd2FzIG5vdCB5ZXQgc3Vic2NyaWJlZCB0byB0byBwcmV2ZW50IHVuc3Vic2NyaXB0aW9uIHdpdGhvdXQgcHJldmlvdXMgc3Vic2NyaXB0aW9uLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIGludGVybmFsIE1lc3NlbmdlciBtZXNzYWdlIHRoYXQgaGFzIHRvIGJlIHVuc3Vic2NyaWJlZCBmcm9tIGF0IHRoZSBleHRlcm5hbCBzb3VyY2Ugb2YgbWVzc2FnZXMuXG4gKi9cbmZ1bmN0aW9uIG9uU3Vic2NyaWJlclJlbW92ZWQobWVzc2FnZSkge1xuICAgIHZhciByZW1vdmVkU291cmNlTWVzc2FnZSA9IHRoaXMubWVzc2VuZ2VyQVBJLnJlbW92ZUludGVybmFsTWVzc2FnZShtZXNzYWdlKTtcbiAgICBpZiAodHlwZW9mIHJlbW92ZWRTb3VyY2VNZXNzYWdlICE9ICd1bmRlZmluZWQnKVxuICAgICAgICB0aGlzLnJlbW92ZVNvdXJjZVN1YnNjcmliZXIocmVtb3ZlZFNvdXJjZU1lc3NhZ2UpO1xufVxuXG5cbi8qKlxuICogTWVzc2FnZVNvdXJjZSBpbnN0YW5jZSBtZXRob2QuXG4gKiBEaXNwYXRjaGVzIHNvdXJjZU1lc3NhZ2UgdG8gTWVzc2VuZ2VyLlxuICogTWVjaGFuaXNtIHRoYXQgY2FsbHMgdGhpcyBtZXRob2Qgd2hlbiB0aGUgc291cmNlIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzIChzZWUgW0RPTUV2ZW50c1NvdXJjZV0oLi4vY29tcG9uZW50cy9tc2dfc3JjL2RvbV9ldmVudHMuanMuaHRtbCkgZm9yIGV4YW1wbGUpLlxuICogRGVsZWdhdGVzIHRvIHN1cHBsaWVkIG9yIGRlZmF1bHQgW01lc3NlbmdlckFQSV0oLi9tX2FwaS5qcy5odG1sKSB0byBjcmVhdGUgaW50ZXJuYWwgbWVzc2FnZSBkYXRhIChgY3JlYXRlSW50ZXJuYWxEYXRhYCkgYW5kIHRvIGZpbHRlciB0aGUgbWVzc2FnZSBiYXNlZCBvbiBpdHMgZGF0YSBhbmQvb3IgbWVzc2FnZSAoYGZpbHRlclNvdXJjZU1lc3NhZ2VgKS5cbiAqIEJhc2UgTWVzc2VuZ2VyQVBJIGNsYXNzIGltcGxlbWVudHMgdGhlc2UgdHdvIG1ldGhvZHMgaW4gYSB0cml2aWFsIHdheSAoYGNyZWF0ZUludGVybmFsRGF0YWAgc2ltcGx5IHJldHVybnMgZXh0ZXJuYWwgZGF0YSwgYGZpbHRlclNvdXJjZU1lc3NhZ2VgIHJldHVybnMgYHRydWVgKSwgdGhleSBhcmUgbWVhbnQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNvdXJjZU1lc3NhZ2Ugc291cmNlIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBleHRlcm5hbCBzb3VyY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2VEYXRhIGRhdGEgcmVjZWl2ZWQgZnJvbSBleHRlcm5hbCBzb3VyY2VcbiAqL1xuZnVuY3Rpb24gZGlzcGF0Y2hNZXNzYWdlKHNvdXJjZU1lc3NhZ2UsIHNvdXJjZURhdGEpIHtcbiAgICB2YXIgYXBpID0gdGhpcy5tZXNzZW5nZXJBUElcbiAgICAgICAgLCBpbnRlcm5hbE1lc3NhZ2VzID0gYXBpLmdldEludGVybmFsTWVzc2FnZXMoc291cmNlTWVzc2FnZSk7XG5cbiAgICBpZiAoaW50ZXJuYWxNZXNzYWdlcykgXG4gICAgICAgIGludGVybmFsTWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgICAgICAgICAgdmFyIGludGVybmFsRGF0YSA9IGFwaS5jcmVhdGVJbnRlcm5hbERhdGEoc291cmNlTWVzc2FnZSwgbWVzc2FnZSwgc291cmNlRGF0YSk7XG5cbiAgICAgICAgICAgIHZhciBzaG91bGREaXNwYXRjaCA9IGFwaS5maWx0ZXJTb3VyY2VNZXNzYWdlKHNvdXJjZU1lc3NhZ2UsIG1lc3NhZ2UsIGludGVybmFsRGF0YSk7XG4gICAgICAgICAgICBpZiAoc2hvdWxkRGlzcGF0Y2gpIFxuICAgICAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UobWVzc2FnZSwgaW50ZXJuYWxEYXRhKTsgICAgICBcbiAgICAgICAgICAgIFxuICAgICAgICB9LCB0aGlzKTtcbn1cblxuXG4vKipcbiAqIFBvc3RzIG1lc3NhZ2Ugb24gdGhlIG1lc3Nlbmdlci4gVGhpcyBtZXRob2QgaXMgc2VwYXJhdGVkIHNvIHNwZWNpZmljIG1lc3NhZ2Ugc291cmNlcyBjYW4gbWFrZSBtZXNzYWdlIGRpc3BhdGNoIHN5bmNocm9ub3VzIGJ5IHVzaW5nIGBwb3N0TWVzc2FnZVN5bmNgXG4gKiBcbiAqIEBwYXJhbSAge1N0cmluZ30gbWVzc2FnZVxuICogQHBhcmFtICB7T2JqZWN0fSBkYXRhXG4gKi9cbmZ1bmN0aW9uIHBvc3RNZXNzYWdlKG1lc3NhZ2UsIGRhdGEpIHtcbiAgICB0aGlzLm1lc3Nlbmdlci5wb3N0TWVzc2FnZShtZXNzYWdlLCBkYXRhKTtcbn1cblxuXG5mdW5jdGlvbiB0b0JlSW1wbGVtZW50ZWQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjYWxsaW5nIHRoZSBtZXRob2Qgb2YgYW4gYWJzY3RyYWN0IGNsYXNzJyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIE1lc3NhZ2VTb3VyY2UgPSByZXF1aXJlKCcuL21fc291cmNlJylcbiAgICAsIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKVxuICAgICwgY2hlY2sgPSByZXF1aXJlKCcuLi91dGlsL2NoZWNrJyk7XG5cblxuLyoqXG4gKiBTdWJjbGFzcyBvZiBNZXNzYWdlU291cmNlIHRoYXQgYWxsb3dzIHRvIGNvbm5lY3QgTWVzc2VuZ2VyIHRvIGFub3RoZXIgTWVzc2VuZ2VyIHVzaW5nIGl0IGFzIGV4dGVybmFsIHNvdXJjZS5cbiAqL1xudmFyIE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2UgPSBfLmNyZWF0ZVN1YmNsYXNzKE1lc3NhZ2VTb3VyY2UsICdNZXNzZW5nZXJNZXNzYWdlU291cmNlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTWVzc2VuZ2VyTWVzc2FnZVNvdXJjZTtcblxuXG4vKipcbiAqICMjIyNNZXNzZW5nZXJNZXNzYWdlU291cmNlIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKi9cbl8uZXh0ZW5kUHJvdG8oTWVzc2VuZ2VyTWVzc2FnZVNvdXJjZSwge1xuICAgIGluaXQ6IGluaXQsXG4gICAgYWRkU291cmNlU3Vic2NyaWJlcjogYWRkU291cmNlU3Vic2NyaWJlcixcbiAgICByZW1vdmVTb3VyY2VTdWJzY3JpYmVyOiByZW1vdmVTb3VyY2VTdWJzY3JpYmVyLFxuICAgIHBvc3RNZXNzYWdlOiBNZXNzZW5nZXJNZXNzYWdlU291cmNlJHBvc3RNZXNzYWdlXG59KTtcblxuLyoqXG4gKiBJbml0aWFsaXplcyBNZXNzZW5nZXJNZXNzYWdlU291cmNlXG4gKiBEZWZpbmVzIG9uZSBwYXJhbWV0ZXIgaW4gYWRkaXRpb24gdG8gW01lc3NhZ2VTb3VyY2VdKC4vbV9zb3VyY2UuanMuaHRtbCkgcGFyYW1ldGVyc1xuICpcbiAqIEBwYXJhbSB7TWVzc2VuZ2VyfSBzb3VyY2VNZXNzZW5nZXIgbWVzc2VuZ2VyIHRoaXMgbWVzc2FnZSBzb3VyY2UgY29ubmVjdHMgdG9cbiAqL1xuZnVuY3Rpb24gaW5pdChob3N0T2JqZWN0LCBwcm94eU1ldGhvZHMsIG1lc3NlbmdlckFQSSwgc291cmNlTWVzc2VuZ2VyKSB7XG4gICAgTWVzc2FnZVNvdXJjZS5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMuc291cmNlTWVzc2VuZ2VyID0gc291cmNlTWVzc2VuZ2VyO1xufVxuXG5cbi8qKlxuICogU3Vic2NyaWJlcyB0byBzb3VyY2UgbWVzc2FnZS4gU2VlIFtNZXNzYWdlU291cmNlXSguL21fc291cmNlLmpzLmh0bWwpIGRvY3MuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8UmVnZXh9IHNvdXJjZU1lc3NhZ2Ugc291cmNlIG1lc3NhZ2UgdG8gc3Vic2NyaWJlIHRvXG4gKi9cbmZ1bmN0aW9uIGFkZFNvdXJjZVN1YnNjcmliZXIoc291cmNlTWVzc2FnZSkge1xuICAgIHRoaXMuc291cmNlTWVzc2VuZ2VyLm9uU3luYyhzb3VyY2VNZXNzYWdlLCB7IGNvbnRleHQ6IHRoaXMsIHN1YnNjcmliZXI6IHRoaXMuZGlzcGF0Y2hNZXNzYWdlIH0pO1xufVxuXG5cbi8qKlxuICogVW5zdWJzY3JpYmVzIGZyb20gc291cmNlIG1lc3NhZ2UuIFNlZSBbTWVzc2FnZVNvdXJjZV0oLi9tX3NvdXJjZS5qcy5odG1sKSBkb2NzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ2V4fSBzb3VyY2VNZXNzYWdlIHNvdXJjZSBtZXNzYWdlIHRvIHVuc3Vic2NyaWJlIGZyb21cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlU291cmNlU3Vic2NyaWJlcihzb3VyY2VNZXNzYWdlKSB7XG4gICAgdGhpcy5zb3VyY2VNZXNzZW5nZXIub2ZmKHNvdXJjZU1lc3NhZ2UsIHsgY29udGV4dDogdGhpcywgc3Vic2NyaWJlcjogdGhpcy5kaXNwYXRjaE1lc3NhZ2UgfSk7XG59XG5cblxuLyoqXG4gKiBPdmVycmlkZXMgZGVmYWx1dCBtZXNzYWdlIHNvdXJjZSB0byBkaXNwYXRjaCBtZXNzYWdlcyBzeW5jaHJvbm91c2x5XG4gKiBcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICovXG5mdW5jdGlvbiBNZXNzZW5nZXJNZXNzYWdlU291cmNlJHBvc3RNZXNzYWdlKG1lc3NhZ2UsIGRhdGEpIHtcbiAgICB0aGlzLm1lc3Nlbmdlci5wb3N0TWVzc2FnZVN5bmMobWVzc2FnZSwgZGF0YSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBfID0gcmVxdWlyZSgnbW9sLXByb3RvJyk7XG5cblxuLyoqXG4gKiAjIyMjTWlsbyBwYWNrYWdlcyMjIyNcbiAqXG4gKiAtIFttaW5kZXJdKC4vbWluZGVyLmpzLmh0bWwpIC0gZGF0YSByZWFjdGl2aXR5LCBvbmUgb3IgdHdvIHdheSwgc2hhbGxvdyBvciBkZWVwLCBhcyB5b3UgbGlrZSBpdFxuICogLSBbY29uZmlnXSguL2NvbmZpZy5qcy5odG1sKSAtIG1pbG8gY29uZmlndXJhdGlvblxuICogLSBbdXRpbF0oLi91dGlsL2luZGV4LmpzLmh0bWwpIC0gbG9nZ2VyLCByZXF1ZXN0LCBkb20sIGNoZWNrLCBlcnJvciwgZXRjLlxuICogLSBbY2xhc3Nlc10oLi9jbGFzc2VzLmpzLmh0bWwpIC0gYWJzdHJhY3QgYW5kIGJhc2UgY2xhc3Nlc1xuICogLSBbTWVzc2VuZ2VyXSguL21lc3Nlbmdlci9pbmRleC5qcy5odG1sKSAtIGdlbmVyaWMgTWVzc2VuZ2VyIHVzZWQgaW4gbW9zdCBvdGhlciBtaWxvIGNsYXNzZXMsIGNhbiBiZSBtaXhlZCBpbnRvIGFwcCBjbGFzc2VzIHRvby5cbiAqIC0gW01vZGVsXSguL21vZGVsL2luZGV4LmpzLmh0bWwpIC0gTW9kZWwgY2xhc3MgdGhhdCBlbWl0cyBtZXNzYWdlcyBvbiBjaGFuZ2VzIHRvIGFueSBkZXB0aCB3aXRob3V0IHRpbWVyIGJhc2VkIHdhdGNoaW5nXG4gKi9cbnZhciBtaWxvID0ge1xuICAgIG1pbmRlcjogcmVxdWlyZSgnLi9taW5kZXInKSxcbiAgICBjb25maWc6IHJlcXVpcmUoJy4vY29uZmlnJyksXG4gICAgdXRpbDogcmVxdWlyZSgnLi91dGlsJyksXG4gICAgY2xhc3NlczogcmVxdWlyZSgnLi9jbGFzc2VzJyksXG4gICAgTWVzc2VuZ2VyOiByZXF1aXJlKCcuL21lc3NlbmdlcicpLFxuICAgIE1vZGVsOiByZXF1aXJlKCcuL21vZGVsJyksXG4gICAgZGVzdHJveTogZGVzdHJveSxcbiAgICBwcm90bzogX1xufTtcblxuXG4vLyBleHBvcnQgZm9yIG5vZGUvYnJvd3NlcmlmeVxuaWYgKHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpICAgIFxuICAgIG1vZHVsZS5leHBvcnRzID0gbWlsbztcblxuLy8gZ2xvYmFsIG1pbG8gZm9yIGJyb3dzZXJcbmlmICh0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnKVxuICAgIHdpbmRvdy5taWxvID0gbWlsbztcblxuXG5mdW5jdGlvbiBkZXN0cm95KCkge1xuICAgIG1pbG8ubWluZGVyLmRlc3Ryb3koKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIENvbm5lY3RvciA9IHJlcXVpcmUoJy4vbW9kZWwvY29ubmVjdG9yJylcbiAgICAsIE1lc3NlbmdlciA9IHJlcXVpcmUoJy4vbWVzc2VuZ2VyJylcbiAgICAsIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKVxuICAgICwgbG9nZ2VyID0gcmVxdWlyZSgnLi91dGlsL2xvZ2dlcicpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gbWluZGVyO1xuXG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIG9uZSBvciBtYW55IENvbm5lY3RvciBvYmplY3RzIHRoYXRcbiAqIGNyZWF0ZSBsaXZlIHJlYWN0aXZlIGNvbm5lY3Rpb24gYmV0d2VlbiBvYmplY3RzIGltcGxlbWVudGluZ1xuICogZGF0YVNvdXJjZSBpbnRlcmZhY2U6XG4gKiBPYmplY3RzIHNob3VsZCBlbWl0IG1lc3NhZ2VzIHdoZW4gYW55IHBhcnQgb2YgdGhlaXIgZGF0YSBjaGFuZ2VzLFxuICogbWV0aG9kcyBgb25gIGFuZCBgb2ZmYCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgdG8gc3Vic2NyaWJlL3Vuc3Vic2NyaWJlXG4gKiB0byBjaGFuZ2Ugbm90aWZpY2F0aW9uIG1lc3NhZ2VzLCBtZXRob2RzIGBzZXRgIGFuZCBgZ2V0YCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgdG8gZ2V0L3NldCBkYXRhXG4gKiBvbiBwYXRoIG9iamVjdHMsIHBvaW50aW5nIHRvIHBhcnRpY3VsYXIgcGFydHMgb2YgdGhlIG9iamVjdCwgbWV0aG9kIGBwYXRoYFxuICogc2hvdWxkIHJldHVybiBwYXRoIG9iamVjdCBmb3IgYSBnaXZlbiBwYXRoIHN0cmluZyAoc2VlIHBhdGggdXRpbHMgZm9yIHBhdGggc3RyaW5nIHN5bnRheCkuXG4gKiBCb3RoIE1vZGVsIGFuZCBEYXRhIGZhY2V0IGFyZSBzdWNoIGRhdGEgc291cmNlcywgdGhleSBjYW4gYmUgbGlua2VkIGJ5IENvbm5lY3RvciBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRzMSB0aGUgZmlyc3QgZGF0YSBzb3VyY2UuIEluc3RlYWQgb2YgdGhlIGZpcnN0IGRhdGEgc291cmNlIGFuIGFycmF5IGNhbiBiZSBwYXNzZWQgd2l0aCBhcnJheXMgb2YgQ29ubmVjdGlvbiBvYmplY3RzIHBhcmFtZXRlcnMgaW4gZWFjaCBhcnJheSBlbGVtZW50LlxuICogQHBhcmFtIHtTdHJpbmd9IG1vZGUgdGhlIGNvbm5lY3Rpb24gbW9kZSB0aGF0IGRlZmluZXMgdGhlIGRpcmVjdGlvbiBhbmQgdGhlIGRlcHRoIG9mIGNvbm5lY3Rpb24uIFBvc3NpYmxlIHZhbHVlcyBhcmUgJy0+JywgJzw8LScsICc8PDwtPj4+JywgZXRjLlxuICogQHBhcmFtIHtPYmplY3R9IGRzMiB0aGUgc2Vjb25kIGRhdGEgc291cmNlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBub3QgaW1wbGVtZW50ZWQgeWV0XG4gKi9cbmZ1bmN0aW9uIG1pbmRlcihkczEsIG1vZGUsIGRzMiwgb3B0aW9ucykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRzMSkpIHtcbiAgICAgICAgdmFyIGNvbm5EZXNjcmlwdGlvbnMgPSBkczE7XG4gICAgICAgIHZhciBjb25uZWN0b3JzID0gY29ubkRlc2NyaXB0aW9ucy5tYXAoZnVuY3Rpb24oZGVzY3IpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29ubmVjdG9yKGRlc2NyWzBdLCBkZXNjclsxXSwgZGVzY3JbMl0sIGRlc2NyWzNdKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbm5lY3RvcnMuZm9yRWFjaChfYWRkQ29ubmVjdG9yKTtcbiAgICAgICAgcmV0dXJuIGNvbm5lY3RvcnM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGNuY3QgPSBuZXcgQ29ubmVjdG9yKGRzMSwgbW9kZSwgZHMyLCBvcHRpb25zKTtcbiAgICAgICAgX2FkZENvbm5lY3RvcihjbmN0KTtcbiAgICAgICAgcmV0dXJuIGNuY3Q7XG4gICAgfVxufVxuXG5cbi8qKlxuICogbWVzc2VuZ2VyIG9mIG1pbmRlciB3aGVyZSBpdCBlbWl0cyBldmVudHMgcmVsYXRlZCB0byBhbGwgY29ubmVjdG9yc1xuICogQHR5cGUge01lc3Nlbmdlcn1cbiAqL1xudmFyIF9tZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKG1pbmRlciwgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcblxuXG52YXIgX2Nvbm5lY3RvcnMgPSBbXVxuICAgICwgX3JlY2VpdmVkTWVzc2FnZXMgPSBbXVxuICAgICwgX2lzUHJvcGFnYXRpbmcgPSBmYWxzZTtcblxuXG5fLmV4dGVuZChtaW5kZXIsIHtcbiAgICBnZXRDb25uZWN0b3JzOiBtaW5kZXJfZ2V0Q29ubmVjdG9ycyxcbiAgICBnZXRFeHBhbmRlZENvbm5lY3Rpb25zOiBtaW5kZXJfZ2V0RXhwYW5kZWRDb25uZWN0aW9ucyxcbiAgICBpc1Byb3BhZ2F0aW5nOiBtaW5kZXJfaXNQcm9wYWdhdGluZyxcbiAgICB3aGVuUHJvcGFnYXRpb25Db21wbGV0ZWQ6IG1pbmRlcl93aGVuUHJvcGFnYXRpb25Db21wbGV0ZWQsXG4gICAgZGVzdHJveUNvbm5lY3RvcjogbWluZGVyX2Rlc3Ryb3lDb25uZWN0b3IsXG4gICAgZGVzdHJveTogbWluZGVyX2Rlc3Ryb3lcbn0pO1xuXG5cbmZ1bmN0aW9uIF9hZGRDb25uZWN0b3IoY25jdCkge1xuICAgIGNuY3QuX19fbWluZGVyX2lkID0gX2Nvbm5lY3RvcnMucHVzaChjbmN0KSAtIDE7XG4gICAgY25jdC5vbigvLiovLCBvbkNvbm5lY3Rvck1lc3NhZ2UpO1xuICAgIG1pbmRlci5wb3N0TWVzc2FnZSgnYWRkZWQnLCB7IGNvbm5lY3RvcjogY25jdCB9KTtcbiAgICBtaW5kZXIucG9zdE1lc3NhZ2UoJ3R1cm5lZG9uJywgeyBjb25uZWN0b3I6IGNuY3QgfSk7XG59XG5cblxuZnVuY3Rpb24gb25Db25uZWN0b3JNZXNzYWdlKG1zZywgZGF0YSkge1xuICAgIHZhciBkYXRhID0gZGF0YSA/IF8uY2xvbmUoZGF0YSkgOiB7fTtcbiAgICBfLmV4dGVuZChkYXRhLCB7XG4gICAgICAgIGlkOiB0aGlzLl9fX21pbmRlcl9pZCxcbiAgICAgICAgY29ubmVjdG9yOiB0aGlzXG4gICAgfSk7XG4gICAgbWluZGVyLnBvc3RNZXNzYWdlKG1zZywgZGF0YSk7XG4gICAgaWYgKCEgX3JlY2VpdmVkTWVzc2FnZXMubGVuZ3RoICYmICEgX2lzUHJvcGFnYXRpbmcpIHtcbiAgICAgICAgXy5kZWZlcihfaWRsZUNoZWNrKTtcbiAgICAgICAgX2lzUHJvcGFnYXRpbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIF9yZWNlaXZlZE1lc3NhZ2VzLnB1c2goeyBtc2c6IG1zZywgZGF0YTogZGF0YSB9KTtcbn1cblxuXG5mdW5jdGlvbiBfaWRsZUNoZWNrKCkge1xuICAgIGlmIChfcmVjZWl2ZWRNZXNzYWdlcy5sZW5ndGgpIHtcbiAgICAgICAgX3JlY2VpdmVkTWVzc2FnZXMubGVuZ3RoID0gMDtcbiAgICAgICAgXy5kZWZlcihfaWRsZUNoZWNrKTtcbiAgICAgICAgbWluZGVyLnBvc3RNZXNzYWdlKCdwcm9wYWdhdGlvbnRpY2tlZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIF9pc1Byb3BhZ2F0aW5nID0gZmFsc2U7XG4gICAgICAgIG1pbmRlci5wb3N0TWVzc2FnZSgncHJvcGFnYXRpb25jb21wbGV0ZWQnKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gbWluZGVyX2lzUHJvcGFnYXRpbmcoKSB7XG4gICAgcmV0dXJuIF9pc1Byb3BhZ2F0aW5nO1xufVxuXG5cbmZ1bmN0aW9uIG1pbmRlcl93aGVuUHJvcGFnYXRpb25Db21wbGV0ZWQoY2FsbGJhY2spIHtcbiAgICBpZiAoX2lzUHJvcGFnYXRpbmcpXG4gICAgICAgIG1pbmRlci5vbmNlKCdwcm9wYWdhdGlvbmNvbXBsZXRlZCcsIGV4ZWN1dGVDYWxsYmFjayk7XG4gICAgZWxzZVxuICAgICAgICBfLmRlZmVyKGV4ZWN1dGVDYWxsYmFjayk7XG5cbiAgICBmdW5jdGlvbiBleGVjdXRlQ2FsbGJhY2soKSB7XG4gICAgICAgIGlmIChfaXNQcm9wYWdhdGluZylcbiAgICAgICAgICAgIG1pbmRlci5vbmNlKCdwcm9wYWdhdGlvbmNvbXBsZXRlZCcsIGV4ZWN1dGVDYWxsYmFjayk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIG1pbmRlcl9nZXRDb25uZWN0b3JzKG9uT2ZmKSB7XG4gICAgaWYgKHR5cGVvZiBvbk9mZiA9PSAndW5kZWZpbmVkJylcbiAgICAgICAgcmV0dXJuIF9jb25uZWN0b3JzO1xuXG4gICAgcmV0dXJuIF9jb25uZWN0b3JzLmZpbHRlcihmdW5jdGlvbihjbmN0KSB7XG4gICAgICAgIHJldHVybiBjbmN0LmlzT24gPT09IG9uT2ZmO1xuICAgIH0pO1xufVxuXG5cbmZ1bmN0aW9uIG1pbmRlcl9kZXN0cm95Q29ubmVjdG9yKGNuY3QpIHtcbiAgICBjbmN0LmRlc3Ryb3koKTtcbiAgICB2YXIgaW5kZXggPSBfY29ubmVjdG9ycy5pbmRleE9mKGNuY3QpO1xuICAgIGlmIChpbmRleCA+PSAwKVxuICAgICAgICBkZWxldGUgX2Nvbm5lY3RvcnNbaW5kZXhdO1xuICAgIGVsc2VcbiAgICAgICAgbG9nZ2VyLndhcm4oJ21pbmRlcjogY29ubmVjdG9yIGRlc3Ryb3llZCB0aGF0IGlzIG5vdCByZWdpc3RlcmVkIGluIG1pbmRlcicpO1xufVxuXG5cbmZ1bmN0aW9uIG1pbmRlcl9nZXRFeHBhbmRlZENvbm5lY3Rpb25zKG9uT2ZmLCBzZWFyY2hTdHIpIHtcbiAgICB2YXIgY29ubmVjdG9ycyA9IG1pbmRlci5nZXRDb25uZWN0b3JzKG9uT2ZmKTtcbiAgICB2YXIgY29ubmVjdGlvbnMgPSAgY29ubmVjdG9ycy5tYXAoZnVuY3Rpb24oY25jdCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbiA9IHtcbiAgICAgICAgICAgIGxlZnRTb3VyY2U6IF9nZXRFeHBhbmRlZFNvdXJjZShjbmN0LmRzMSksXG4gICAgICAgICAgICByaWdodFNvdXJjZTogX2dldEV4cGFuZGVkU291cmNlKGNuY3QuZHMyKSxcbiAgICAgICAgICAgIG1vZGU6IGNuY3QubW9kZSxcbiAgICAgICAgICAgIGlzT246IGNuY3QuaXNPblxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgaWYgKGNuY3Qub3B0aW9ucylcbiAgICAgICAgICAgIGNvbm5lY3Rpb24ub3B0aW9ucyA9IGNuY3Qub3B0aW9ucztcblxuICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgICB9KTtcblxuICAgIGlmIChzZWFyY2hTdHIpXG4gICAgICAgIGNvbm5lY3Rpb25zID0gY29ubmVjdGlvbnMuZmlsdGVyKGZ1bmN0aW9uKGNuY3RuKSB7XG4gICAgICAgICAgICByZXR1cm4gX3NvdXJjZU1hdGNoZXNTdHJpbmcoY25jdG4ubGVmdFNvdXJjZSwgc2VhcmNoU3RyKVxuICAgICAgICAgICAgICAgICAgICB8fCBfc291cmNlTWF0Y2hlc1N0cmluZyhjbmN0bi5yaWdodFNvdXJjZSwgc2VhcmNoU3RyKTtcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gY29ubmVjdGlvbnM7XG59XG5cblxuZnVuY3Rpb24gX2dldEV4cGFuZGVkU291cmNlKGRzKSB7XG4gICAgdmFyIHNvdXJjZSA9IFtdO1xuICAgIGlmICh0eXBlb2YgZHMgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAoZHMuX21vZGVsICYmIGRzLl9hY2Nlc3NQYXRoKSB7XG4gICAgICAgICAgICBzb3VyY2UudW5zaGlmdChkcy5fYWNjZXNzUGF0aCk7XG4gICAgICAgICAgICBkcyA9IGRzLl9tb2RlbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHNvdXJjZS51bnNoaWZ0KGRzKTtcbiAgICAgICAgZHMgPSBkcy5faG9zdE9iamVjdDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRzID09ICdvYmplY3QnKSB7XG4gICAgICAgIHNvdXJjZS51bnNoaWZ0KGRzKTtcblxuICAgICAgICBpZiAoZHMub3duZXIpXG4gICAgICAgICAgICBzb3VyY2UudW5zaGlmdChkcy5vd25lcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvdXJjZTtcbn1cblxuXG5mdW5jdGlvbiBfc291cmNlTWF0Y2hlc1N0cmluZyhzb3VyY2UsIG1hdGNoU3RyKSB7XG4gICAgcmV0dXJuIHNvdXJjZS5zb21lKGZ1bmN0aW9uKHNyY05vZGUpIHtcbiAgICAgICAgdmFyIGNsYXNzTmFtZSA9IHNyY05vZGUuY29uc3RydWN0b3IgJiYgc3JjTm9kZS5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICByZXR1cm4gX3N0cmluZ01hdGNoKGNsYXNzTmFtZSwgbWF0Y2hTdHIpXG4gICAgICAgICAgICAgICAgfHwgX3N0cmluZ01hdGNoKHNyY05vZGUubmFtZSwgbWF0Y2hTdHIpXG4gICAgICAgICAgICAgICAgfHwgX3N0cmluZ01hdGNoKHNyY05vZGUsIG1hdGNoU3RyKTtcbiAgICB9KTtcbn1cblxuXG5mdW5jdGlvbiBfc3RyaW5nTWF0Y2goc3RyLCBzdWJzdHIpIHtcbiAgICByZXR1cm4gc3RyICYmIHR5cGVvZiBzdHIgPT0gJ3N0cmluZycgJiYgc3RyLmluZGV4T2Yoc3Vic3RyKSA+PSAwO1xufVxuXG5cbmZ1bmN0aW9uIG1pbmRlcl9kZXN0cm95KCkge1xuICAgIF9jb25uZWN0b3JzLmZvckVhY2goZnVuY3Rpb24oY25jdCkge1xuICAgICAgICBkZXN0cm95RFMoY25jdC5kczEpO1xuICAgICAgICBkZXN0cm95RFMoY25jdC5kczIpO1xuICAgICAgICBjbmN0LmRlc3Ryb3koKTtcbiAgICB9KTtcbiAgICBfbWVzc2VuZ2VyLmRlc3Ryb3koKTtcbiAgICBtaW5kZXIuX2Rlc3Ryb3llZCA9IHRydWU7XG5cbiAgICBmdW5jdGlvbiBkZXN0cm95RFMoZHMpIHtcbiAgICAgICAgaWYgKGRzICYmICFkcy5fZGVzdHJveWVkKSBkcy5kZXN0cm95KCk7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBsb2dnZXIgPSByZXF1aXJlKCcuLi91dGlsL2xvZ2dlcicpXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKVxuICAgICwgcGF0aFV0aWxzID0gcmVxdWlyZSgnLi9wYXRoX3V0aWxzJylcbiAgICAsIF8gPSByZXF1aXJlKCdtb2wtcHJvdG8nKTtcblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIHByb2Nlc3MgXCJjaGFuZ2VkYXRhXCIgbWVzc2FnZXMgZW1pdHRlZCBieSBDb25uZWN0b3Igb2JqZWN0LlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGNoYW5nZURhdGFIYW5kbGVyO1xuXG5cbl8uZXh0ZW5kKGNoYW5nZURhdGFIYW5kbGVyLCB7XG4gICAgc2V0VHJhbnNhY3Rpb25GbGFnOiBzZXRUcmFuc2FjdGlvbkZsYWcsXG4gICAgZ2V0VHJhbnNhY3Rpb25GbGFnOiBnZXRUcmFuc2FjdGlvbkZsYWcsXG4gICAgcGFzc1RyYW5zYWN0aW9uRmxhZzogcGFzc1RyYW5zYWN0aW9uRmxhZyxcbiAgICBwb3N0VHJhbnNhY3Rpb25GaW5pc2hlZDogcG9zdFRyYW5zYWN0aW9uRmluaXNoZWRcbn0pO1xuXG5cbi8qKlxuICogQ2hhbmdlIGRhdGEgdXNlcyBoaWRkZW4gcHJvcGVydHkgb24gYWNjZXNzb3IgbWV0aG9kcyB0byBwYXNzIGZsYWcgdGhhdCB0aGUgYWNjZXNzb3IgaXMgZXhlY3V0ZWQgYXMgYSBwYXJ0IG9mIGNoYW5nZSB0cmFuc2FjdGlvbi5cbiAqIEFjY2Vzc29yIG1ldGhvZHMgYXJlIHN1cHBvc2VkIHRvIHN0b3JlIHRoaXMgZmxhZyBpbiBhIGxvY2FsIHZhcmlhYmxlIGFuZCB0byBjbGVhciBpdCAoYmVjYXVzZSBhbm90aGVyIGFjY2Vzc29yIGNhbiBiZSBleGVjdXRlZCBpbiBvciBvdXQgb2YgdHJhbnNhY3Rpb24pIHVzaW5nIGBnZXRUcmFuc2FjdGlvbkZsYWdgXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgYWNjZXNzb3IgbWV0aG9kIHJlZmVyZW5jZVxuICogQHBhcmFtIHtCb29sZWFufSBmbGFnIGEgZmxhZyB0byBiZSBzZXRcbiAqL1xuZnVuY3Rpb24gc2V0VHJhbnNhY3Rpb25GbGFnKGZ1bmMsIGZsYWcpIHtcbiAgICBfLmRlZmluZVByb3BlcnR5KGZ1bmMsICdfX2luQ2hhbmdlVHJhbnNhY3Rpb24nLCBmbGFnLCBfLkNPTkYgfCBfLldSSVQpO1xufVxuXG5cbi8qKlxuICogUmV0cmlldmVzIGFuZCBjbGVhcnMgdHJhbnNhY3Rpb24gZmxhZyBmcm9tIGFjY2Vzc29yIG1ldGhvZFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIGFjY2Vzc29yIG1ldGhvZCByZWZlcmVuY2VcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uRmxhZyhmdW5jKSB7XG4gICAgdmFyIGluVHJhbnNhY3Rpb24gPSBmdW5jLl9faW5DaGFuZ2VUcmFuc2FjdGlvbjtcbiAgICBkZWxldGUgZnVuYy5fX2luQ2hhbmdlVHJhbnNhY3Rpb247XG4gICAgcmV0dXJuIGluVHJhbnNhY3Rpb247XG59XG5cblxuZnVuY3Rpb24gcGFzc1RyYW5zYWN0aW9uRmxhZyhmcm9tRnVuYywgdG9GdW5jKSB7XG4gICAgdmFyIGluVHJhbnNhY3Rpb24gPSBnZXRUcmFuc2FjdGlvbkZsYWcoZnJvbUZ1bmMpO1xuICAgIHNldFRyYW5zYWN0aW9uRmxhZyh0b0Z1bmMsIGluVHJhbnNhY3Rpb24pO1xuICAgIHJldHVybiBpblRyYW5zYWN0aW9uO1xufVxuXG5cbi8qKlxuICogUG9zdHMgbWVzc2FnZSBvbiB0aGlzIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgdHJhbnNhY3Rpb24gdW5sZXNzIGBpbkNoYW5nZVRyYW5zYWN0aW9uYCBpcyBgdHJ1ZWAuXG4gKi9cbmZ1bmN0aW9uIHBvc3RUcmFuc2FjdGlvbkZpbmlzaGVkKCkge1xuICAgIHRoaXMucG9zdE1lc3NhZ2VTeW5jKCdkYXRhY2hhbmdlcycsIHsgdHJhbnNhY3Rpb246IGZhbHNlLCBjaGFuZ2VzOiBbXSB9KTtcbn1cblxuXG4vKipcbiAqIHN1YnNjcmliZXIgdG8gXCJjaGFuZ2VkYXRhXCIgZXZlbnQgZW1pdHRlZCBieSBbQ29ubmVjdG9yXSguL2Nvbm5lY3Rvci5qcy5odG1sKSBvYmplY3QgdG8gZW5hYmxlIHJlYWN0aXZlIGNvbm5lY3Rpb25zXG4gKiBVc2VkIGJ5IERhdGEgZmFjZXQsIE1vZGVsIGFuZCBNb2RlbFBhdGguIENhbiBiZSB1c2VkIGJ5IGFueSBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIGdldC9zZXQvZGVsL3NwbGljZSBhcGkgYW5kIHNldHMgZGF0YSBkZWVwbHkgdG8gdGhlIHdob2xlIHRyZWUuXG4gKiBPYmplY3Qgc2hvdWxkIGNhbGwgYGNoYW5nZURhdGFIYW5kbGVyLmluaXRpYWxpemUuY2FsbCh0aGlzKWAgaW4gaXRzIGNvbnN0cnVjdG9yLlxuICogVE9ETzogb3B0aW1pemUgbWVzc2FnZXMgbGlzdCB0byBhdm9pZCBzZXR0aW5nIGR1cGxpY2F0ZSB2YWx1ZXMgZG93biB0aGUgdHJlZVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgc2hvdWxkIGJlIFwiY2hhbmdlZGF0YVwiIGhlcmVcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIGJhdGNoIG9mIGRhdGEgY2hhbmdlIGRlc2NpcHRpb24gb2JqZWN0c1xuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgY2FsbGJhY2sgdG8gY2FsbCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBkYXRhIGlzIHByb2Nlc3NlZFxuICovXG5mdW5jdGlvbiBjaGFuZ2VEYXRhSGFuZGxlcihtZXNzYWdlLCBkYXRhLCBjYWxsYmFjaykge1xuICAgIHByb2Nlc3NDaGFuZ2VzLmNhbGwodGhpcywgZGF0YS5jaGFuZ2VzLCBjYWxsYmFjayk7XG59XG5cblxuLy8gbWFwIG9mIG1lc3NhZ2UgdHlwZXMgdG8gbWV0aG9kc1xudmFyIENIQU5HRV9UWVBFX1RPX01FVEhPRF9NQVAgPSB7XG4gICAgJ2FkZGVkJzogICAnc2V0JyxcbiAgICAnY2hhbmdlZCc6ICdzZXQnLFxuICAgICdkZWxldGVkJzogJ2RlbCcsXG4gICAgJ3JlbW92ZWQnOiAnZGVsJ1xufTtcblxuXG4vKipcbiAqIFByb2Nlc3NlcyBxdWV1ZWQgXCJjaGFuZ2VkYXRhXCIgbWVzc2FnZXMuXG4gKiBQb3N0cyBcImNoYW5nZXN0YXJ0ZWRcIiBhbmQgXCJjaGFuZ2Vjb21wbGV0ZWRcIiBtZXNzYWdlcyBhbmQgY2FsbHMgY2FsbGJhY2tcbiAqXG4gKiBAcGFyYW0ge1tGdW5jdGlvbl19IGNhbGxiYWNrIG9wdGlvbmFsIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIHdpdGggYChudWxsLCBmYWxzZSlgIHBhcmFtZXRlcnMgYmVmb3JlIGNoYW5nZSBwcm9jZXNzaW5nIHN0YXJ0cyBhbmQgYChudWxsLCB0cnVlKWAgYWZ0ZXIgaXQncyBmaW5pc2hlZC5cbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0NoYW5nZXModHJhbnNhY3Rpb24sIGNhbGxiYWNrKSB7XG4gICAgbm90aWZ5LmNhbGwodGhpcywgY2FsbGJhY2ssIGZhbHNlKTtcbiAgICBwcm9jZXNzVHJhbnNhY3Rpb24uY2FsbCh0aGlzLFxuICAgICAgICBwcmVwYXJlVHJhbnNhY3Rpb24oXG4gICAgICAgICAgICB2YWxpZGF0ZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSkpO1xuICAgIG5vdGlmeS5jYWxsKHRoaXMsIGNhbGxiYWNrLCB0cnVlKTtcbn1cblxuXG5mdW5jdGlvbiBub3RpZnkoY2FsbGJhY2ssIGNoYW5nZUZpbmlzaGVkKSB7XG4gICAgY2FsbGJhY2sgJiYgY2FsbGJhY2sobnVsbCwgY2hhbmdlRmluaXNoZWQpO1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoY2hhbmdlRmluaXNoZWQgPyAnY2hhbmdlY29tcGxldGVkJyA6ICdjaGFuZ2VzdGFydGVkJyk7XG59XG5cblxuLyoqXG4gKiBDaGVja3MgdGhhdCBhbGwgbWVzc2FnZXMgZnJvbSB0aGUgdHJhbnNhY3Rpb24gY29tZSBmcm9tIHRoZSBzYW1lIHNvdXJjZS5cbiAqIEhhY2s6IHJldmVyc2VzIHRoZSB0cmFuc2FjdGlvbiBpZiBpdCBjb21lcyBmcm9tIHRoZSBEYXRhIGZhY2V0XG4gKiBSZXR1cm5zIHRoZSByZWZlcmVuY2UgdG8gdGhlIHRyYW5zYWN0aW9uIChmb3IgY2hhaW5pbmcpXG4gKiBcbiAqIEBwYXJhbSAge0FycmF5fSB0cmFuc2FjdGlvbiB0cmFuc2FjdGlvbiBvZiBkYXRhIGNoYW5nZXNcbiAqIEByZXR1cm4ge0FycmF5fSBcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbikge1xuICAgIHZhciBzb3VyY2UgPSB0cmFuc2FjdGlvblswXS5zb3VyY2VcbiAgICAgICAgLCBzYW1lU291cmNlID0gdHJ1ZTtcblxuICAgIGlmICh0cmFuc2FjdGlvbi5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxLCBsZW4gPSB0cmFuc2FjdGlvbi5sZW5ndGg7IGkgPCBsZW47IGkrKylcbiAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvbltpXS5zb3VyY2UgIT0gc291cmNlKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdjaGFuZ2VkYXRhOiBjaGFuZ2VzIGZyb20gZGlmZmVyZW50IHNvdXJjZXMgaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24sIHNvdXJjZXM6JywgdHJhbnNhY3Rpb25baV0uc291cmNlLm5hbWUsIHNvdXJjZS5uYW1lKTtcbiAgICAgICAgICAgICAgICBzYW1lU291cmNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgc291cmNlID0gdHJhbnNhY3Rpb25baV0uc291cmNlO1xuICAgICAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cmFuc2FjdGlvbjtcbn1cblxuXG5mdW5jdGlvbiBwcmVwYXJlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pIHtcbiAgICB2YXIgdG9kbyA9IFtdXG4gICAgICAgICwgcGF0aHNUb1NwbGljZSA9IFtdXG4gICAgICAgICwgcGF0aHNUb0NoYW5nZSA9IFtdXG4gICAgICAgICwgaGFkU3BsaWNlXG4gICAgICAgICwgZXhpdExvb3AgPSB7fTtcblxuXG4gICAgdHJ5IHsgdHJhbnNhY3Rpb24uZm9yRWFjaChjaGVja0NoYW5nZSk7IH1cbiAgICBjYXRjaCAoZSkgeyBpZiAoZSAhPSBleGl0TG9vcCkgdGhyb3cgZTsgfVxuXG4gICAgcmV0dXJuIHRvZG87XG5cblxuICAgIGZ1bmN0aW9uIGNoZWNrQ2hhbmdlKGRhdGEpIHtcbiAgICAgICAgKGRhdGEudHlwZSA9PSAnc3BsaWNlJyA/IGNoZWNrU3BsaWNlIDogY2hlY2tNZXRob2QpKGRhdGEpO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gY2hlY2tTcGxpY2UoZGF0YSkge1xuICAgICAgICB2YXIgcGFyc2VkUGF0aCA9IHBhdGhVdGlscy5wYXJzZUFjY2Vzc1BhdGgoZGF0YS5wYXRoKTtcbiAgICAgICAgdmFyIHBhcmVudFBhdGhDaGFuZ2VkID0gcGF0aHNUb0NoYW5nZS5zb21lKGZ1bmN0aW9uKHBhcmVudFBhdGgpIHtcbiAgICAgICAgICAgIGlmIChwYXJzZWRQYXRoLmxlbmd0aCA8IHBhcmVudFBhdGgubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICAgICByZXR1cm4gX3BhdGhJc1BhcmVudE9mKHBhcmVudFBhdGgsIHBhcnNlZFBhdGgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocGFyZW50UGF0aENoYW5nZWQpIHJldHVybjtcblxuICAgICAgICB0b2RvLnB1c2goZGF0YSk7XG5cbiAgICAgICAgaWYgKCEgY29uZmlnLmRlYnVnKSB0aHJvdyBleGl0TG9vcDtcbiAgICAgICAgcGF0aHNUb1NwbGljZS5wdXNoKHBhcnNlZFBhdGgpO1xuICAgICAgICBoYWRTcGxpY2UgPSB0cnVlO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gY2hlY2tNZXRob2QoZGF0YSkge1xuICAgICAgICB2YXIgcGFyc2VkUGF0aCA9IHBhdGhVdGlscy5wYXJzZUFjY2Vzc1BhdGgoZGF0YS5wYXRoKTtcbiAgICAgICAgdmFyIHBhcmVudFBhdGhTcGxpY2VkID0gcGF0aHNUb1NwbGljZSAmJiBwYXRoc1RvU3BsaWNlLnNvbWUoZnVuY3Rpb24ocGFyZW50UGF0aCkge1xuICAgICAgICAgICAgaWYgKHBhcnNlZFBhdGgubGVuZ3RoIDw9IHBhcmVudFBhdGgubGVuZ3RoXG4gICAgICAgICAgICAgICAgfHwgcGFyc2VkUGF0aFtwYXJlbnRQYXRoLmxlbmd0aF0uc3ludGF4ICE9ICdhcnJheScpIHJldHVybjtcbiAgICAgICAgICAgIHJldHVybiBfcGF0aElzUGFyZW50T2YocGFyZW50UGF0aCwgcGFyc2VkUGF0aCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChwYXJlbnRQYXRoU3BsaWNlZCkgcmV0dXJuO1xuICAgICAgICBpZiAoaGFkU3BsaWNlKSBsb2dnZXIuZXJyb3IoJ2NoYW5nZWRhdGE6IGNoaWxkIGNoYW5nZSBpcyBleGVjdXRlZCBhZnRlciBzcGxpY2U7IHByb2JhYmx5IGRhdGEgc291cmNlIGRpZCBub3QgZW1pdCBtZXNzYWdlIHdpdGggZGF0YS50eXBlPT1cImZpbmlzaGVkXCInKTtcblxuICAgICAgICB2YXIgcGFyZW50UGF0aENoYW5nZWQgPSBwYXRoc1RvQ2hhbmdlLnNvbWUoZnVuY3Rpb24ocGFyZW50UGF0aCkge1xuICAgICAgICAgICAgaWYgKHBhcnNlZFBhdGgubGVuZ3RoIDw9IHBhcmVudFBhdGgubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICAgICByZXR1cm4gX3BhdGhJc1BhcmVudE9mKHBhcmVudFBhdGgsIHBhcnNlZFBhdGgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocGFyZW50UGF0aENoYW5nZWQpIHJldHVybjtcblxuICAgICAgICBwYXRoc1RvQ2hhbmdlLnB1c2gocGFyc2VkUGF0aCk7XG5cbiAgICAgICAgdG9kby5wdXNoKGRhdGEpO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gX3BhdGhJc1BhcmVudE9mKHBhcmVudFBhdGgsIGNoaWxkUGF0aCkge1xuICAgICAgICByZXR1cm4gcGFyZW50UGF0aC5ldmVyeShmdW5jdGlvbihwYXRoTm9kZSwgaW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoTm9kZS5wcm9wZXJ0eSA9PSBjaGlsZFBhdGhbaW5kZXhdLnByb3BlcnR5O1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gcHJvY2Vzc1RyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSB7XG4gICAgdHJhbnNhY3Rpb24uZm9yRWFjaChwcm9jZXNzQ2hhbmdlLCB0aGlzKTtcbiAgICBwb3N0VHJhbnNhY3Rpb25GaW5pc2hlZC5jYWxsKHRoaXMsIGZhbHNlKTtcblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NDaGFuZ2UoZGF0YSkge1xuICAgICAgICB2YXIgbW9kZWxQYXRoID0gdGhpcy5wYXRoKGRhdGEucGF0aCwgZGF0YS50eXBlICE9ICdyZW1vdmVkJyAmJiBkYXRhLnR5cGUgIT0gJ2RlbGV0ZWQnKTtcbiAgICAgICAgaWYgKCEgbW9kZWxQYXRoKSByZXR1cm47XG4gICAgICAgIChkYXRhLnR5cGUgPT0gJ3NwbGljZScgPyBleGVjdXRlU3BsaWNlIDogZXhlY3V0ZU1ldGhvZCkobW9kZWxQYXRoLCBkYXRhKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gZXhlY3V0ZVNwbGljZShtb2RlbFBhdGgsIGRhdGEpIHtcbiAgICB2YXIgaW5kZXggPSBkYXRhLmluZGV4XG4gICAgICAgICwgaG93TWFueSA9IGRhdGEucmVtb3ZlZC5sZW5ndGhcbiAgICAgICAgLCBzcGxpY2VBcmdzID0gW2luZGV4LCBob3dNYW55XTtcblxuICAgIHNwbGljZUFyZ3MgPSBzcGxpY2VBcmdzLmNvbmNhdChkYXRhLm5ld1ZhbHVlLnNsaWNlKGluZGV4LCBpbmRleCArIGRhdGEuYWRkZWRDb3VudCkpO1xuICAgIHNldFRyYW5zYWN0aW9uRmxhZyhtb2RlbFBhdGguc3BsaWNlLCB0cnVlKTtcbiAgICBtb2RlbFBhdGguc3BsaWNlLmFwcGx5KG1vZGVsUGF0aCwgc3BsaWNlQXJncyk7XG59XG5cblxuZnVuY3Rpb24gZXhlY3V0ZU1ldGhvZChtb2RlbFBhdGgsIGRhdGEpIHtcbiAgICB2YXIgbWV0aG9kTmFtZSA9IENIQU5HRV9UWVBFX1RPX01FVEhPRF9NQVBbZGF0YS50eXBlXTtcbiAgICBpZiAobWV0aG9kTmFtZSkge1xuICAgICAgICBzZXRUcmFuc2FjdGlvbkZsYWcobW9kZWxQYXRoW21ldGhvZE5hbWVdLCB0cnVlKTtcbiAgICAgICAgbW9kZWxQYXRoW21ldGhvZE5hbWVdKGRhdGEubmV3VmFsdWUpO1xuICAgIH0gZWxzZVxuICAgICAgICBsb2dnZXIuZXJyb3IoJ3Vua25vd24gZGF0YSBjaGFuZ2UgdHlwZScpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgTWVzc2VuZ2VyID0gcmVxdWlyZSgnLi4vbWVzc2VuZ2VyJylcbiAgICAsIHBhdGhVdGlscyA9IHJlcXVpcmUoJy4vcGF0aF91dGlscycpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJylcbiAgICAsIGxvZ2dlciA9IHJlcXVpcmUoJy4uL3V0aWwvbG9nZ2VyJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBDb25uZWN0b3I7XG5cblxudmFyIG1vZGVQYXR0ZXJuID0gL14oXFw8KilcXC0rKFxcPiopJC87XG5cblxuLyoqXG4gKiBDb25uZWN0b3JcbiAqIENsYXNzIHRoYXQgY3JlYXRlcyBjb25uZWN0b3Igb2JqZWN0IGZvciBkYXRhIGNvbm5lY3Rpb24gYmV0d2VlblxuICogdHdvIGRhdGEtc291cmNlc1xuICogRGF0YS1zb3VyY2VzIHNob3VsZCBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBBUEk6XG4gKiBnZXQoKSAtIGdldCB2YWx1ZSBmcm9tIGRhdGFzb3VyY2Ugb3IgaXRzIHBhdGhcbiAqIHNldCh2YWx1ZSkgLSBzZXQgdmFsdWUgdG8gZGF0YXNvdXJjZSBvciB0byBpdHMgcGF0aFxuICogb24ocGF0aCwgc3Vic2NyaWJlcikgLSBzdWJzY3JpcHRpb24gdG8gZGF0YSBjaGFuZ2VzIHdpdGggXCIqXCIgc3VwcG9ydFxuICogb2ZmKHBhdGgsIHN1YnNjcmliZXIpXG4gKiBwYXRoKGFjY2Vzc1BhdGgpIC0gdG8gcmV0dXJuIHRoZSBvYmplY3QgdGhhdCBnaXZlcyByZWZlcmVuY2UgdG8gc29tZSBwYXJ0IG9mIGRhdGFzb3VyY2VcbiAqIGFuZCBjb21wbGllcyB3aXRoIHRoYXQgYXBpIHRvby5cbiAqXG4gKiAjIyMjRXZlbnRzIyMjI1xuICpcbiAqIC0gJ3R1cm5lZG9uJyAtIGNvbm5lY3RvciB3YXMgdHVybmVkIG9uXG4gKiAtICd0dXJuZWRvZmYnIC0gY29ubmVjdG9yIHdhcyB0dXJuZWQgb2ZmXG4gKiAtICdjaGFuZ2VzdGFydGVkJyAtIGNoYW5nZSBvbiBjb25uZWN0ZWQgZGF0YXNvdXJjZSBpcyBzdGFydGVkXG4gKiAtICdjaGFuZ2Vjb21wbGV0ZWQnIC0gY2hhbmdlIG9uIGNvbm5lY3RlZCBkYXRhc291cmNlIGlzIGNvbXBsZXRlZFxuICogLSAnZGVzdHJveWVkJyAtIGNvbm5lY3RvciB3YXMgZGVzdHJveWVkXG4gKiBcbiAqIEBwYXJhbSB7T2JqZWN0fSBkczEgdGhlIGZpcnN0IGRhdGEgc291cmNlLlxuICogQHBhcmFtIHtTdHJpbmd9IG1vZGUgdGhlIGNvbm5lY3Rpb24gbW9kZSB0aGF0IGRlZmluZXMgdGhlIGRpcmVjdGlvbiBhbmQgdGhlIGRlcHRoIG9mIGNvbm5lY3Rpb24uIFBvc3NpYmxlIHZhbHVlcyBhcmUgJy0+JywgJzw8LScsICc8PDwtPj4+JywgZXRjLlxuICogQHBhcmFtIHtPYmplY3R9IGRzMiB0aGUgc2Vjb25kIGRhdGEgc291cmNlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBub3QgaW1wbGVtZW50ZWQgeWV0XG4gKiBAcmV0dXJuIHtDb25uZWN0b3J9IHdoZW4gY2FsbGVkIHdpdGggYG5ld2AsIGNyZWF0ZXMgYSBDb25uZWN0b3Igb2JqZWN0LlxuICovXG5mdW5jdGlvbiBDb25uZWN0b3IoZHMxLCBtb2RlLCBkczIsIG9wdGlvbnMpIHtcbiAgICBzZXR1cE1vZGUuY2FsbCh0aGlzLCBtb2RlKTtcblxuICAgIF8uZXh0ZW5kKHRoaXMsIHtcbiAgICAgICAgZHMxOiBkczEsXG4gICAgICAgIGRzMjogZHMyLFxuICAgICAgICBpc09uOiBmYWxzZSxcbiAgICAgICAgX2NoYW5nZXNRdWV1ZTE6IFtdLFxuICAgICAgICBfY2hhbmdlc1F1ZXVlMjogW10sXG4gICAgICAgIF9tZXNzZW5nZXI6IG5ldyBNZXNzZW5nZXIodGhpcywgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKVxuICAgIH0pO1xuXG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgICB2YXIgcGF0aFRyYW5zbGF0aW9uID0gb3B0aW9ucy5wYXRoVHJhbnNsYXRpb247XG4gICAgICAgIGlmIChwYXRoVHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgIHBhdGhUcmFuc2xhdGlvbiA9IF8uY2xvbmUocGF0aFRyYW5zbGF0aW9uKTtcbiAgICAgICAgICAgIHZhciBwYXR0ZXJuVHJhbnNsYXRpb24gPSBnZXRQYXR0ZXJuVHJhbnNsYXRpb25zKHBhdGhUcmFuc2xhdGlvbik7XG4gICAgICAgICAgICBfLmV4dGVuZCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcGF0aFRyYW5zbGF0aW9uMTogcmV2ZXJzZVRyYW5zbGF0aW9uUnVsZXMocGF0aFRyYW5zbGF0aW9uKSxcbiAgICAgICAgICAgICAgICBwYXRoVHJhbnNsYXRpb24yOiBwYXRoVHJhbnNsYXRpb24sXG4gICAgICAgICAgICAgICAgcGF0dGVyblRyYW5zbGF0aW9uMTogcmV2ZXJzZVBhdHRlcm5UcmFuc2xhdGlvblJ1bGVzKHBhdHRlcm5UcmFuc2xhdGlvbiksXG4gICAgICAgICAgICAgICAgcGF0dGVyblRyYW5zbGF0aW9uMjogcGF0dGVyblRyYW5zbGF0aW9uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkYXRhVHJhbnNsYXRpb24gPSBvcHRpb25zLmRhdGFUcmFuc2xhdGlvbjtcbiAgICAgICAgaWYgKGRhdGFUcmFuc2xhdGlvbikge1xuICAgICAgICAgICAgXy5leHRlbmQodGhpcywge1xuICAgICAgICAgICAgICAgIGRhdGFUcmFuc2xhdGlvbjE6IGRhdGFUcmFuc2xhdGlvblsnPC0nXSxcbiAgICAgICAgICAgICAgICBkYXRhVHJhbnNsYXRpb24yOiBkYXRhVHJhbnNsYXRpb25bJy0+J11cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRhdGFWYWxpZGF0aW9uID0gb3B0aW9ucy5kYXRhVmFsaWRhdGlvbjtcbiAgICAgICAgaWYgKGRhdGFWYWxpZGF0aW9uKSB7XG4gICAgICAgICAgICBfLmV4dGVuZCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgZGF0YVZhbGlkYXRpb24xOiBkYXRhVmFsaWRhdGlvblsnPC0nXSxcbiAgICAgICAgICAgICAgICBkYXRhVmFsaWRhdGlvbjI6IGRhdGFWYWxpZGF0aW9uWyctPiddXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudHVybk9uKCk7XG59XG5cblxuZnVuY3Rpb24gc2V0dXBNb2RlKG1vZGUpe1xuICAgIHZhciBwYXJzZWRNb2RlID0gbW9kZS5tYXRjaChtb2RlUGF0dGVybik7XG5cbiAgICBpZiAoISBwYXJzZWRNb2RlKVxuICAgICAgICBtb2RlUGFyc2VFcnJvcigpO1xuXG4gICAgdmFyIGRlcHRoMSA9IHBhcnNlZE1vZGVbMV0ubGVuZ3RoXG4gICAgICAgICwgZGVwdGgyID0gcGFyc2VkTW9kZVsyXS5sZW5ndGg7XG5cbiAgICBpZiAoZGVwdGgxICYmIGRlcHRoMiAmJiBkZXB0aDEgIT0gZGVwdGgyKVxuICAgICAgICBtb2RlUGFyc2VFcnJvcigpO1xuXG4gICAgaWYgKCEgZGVwdGgxICYmICEgZGVwdGgyKVxuICAgICAgICBtb2RlUGFyc2VFcnJvcigpO1xuXG4gICAgXy5leHRlbmQodGhpcywge1xuICAgICAgICBtb2RlOiBtb2RlLFxuICAgICAgICBkZXB0aDE6IGRlcHRoMSxcbiAgICAgICAgZGVwdGgyOiBkZXB0aDIsXG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBtb2RlUGFyc2VFcnJvcigpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIENvbm5lY3RvciBtb2RlOiAnICsgbW9kZSk7XG4gICAgfVxufVxuXG5cbl8uZXh0ZW5kUHJvdG8oQ29ubmVjdG9yLCB7XG4gICAgdHVybk9uOiBDb25uZWN0b3IkdHVybk9uLFxuICAgIHR1cm5PZmY6IENvbm5lY3RvciR0dXJuT2ZmLFxuICAgIGRlc3Ryb3k6IENvbm5lY3RvciRkZXN0cm95LFxuICAgIGNoYW5nZU1vZGU6IENvbm5lY3RvciRjaGFuZ2VNb2RlLFxuICAgIGRlZmVyQ2hhbmdlTW9kZTogQ29ubmVjdG9yJGRlZmVyQ2hhbmdlTW9kZVxufSk7XG5cbi8qKlxuICogRnVuY3Rpb24gY2hhbmdlIHRoZSBtb2RlIG9mIHRoZSBjb25uZWN0aW9uXG4gKlxuICogQHBhcmFtIEBwYXJhbSB7U3RyaW5nfSBtb2RlIHRoZSBjb25uZWN0aW9uIG1vZGUgdGhhdCBkZWZpbmVzIHRoZSBkaXJlY3Rpb24gYW5kIHRoZSBkZXB0aCBvZiBjb25uZWN0aW9uLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICctPicsICc8PC0nLCAnPDw8LT4+PicsIGV0Yy5cbiAqIEByZXR1cm4ge09iamVjdFtTdHJpbmddfVxuICovXG5mdW5jdGlvbiBDb25uZWN0b3IkY2hhbmdlTW9kZShtb2RlKSB7XG4gICAgdGhpcy50dXJuT2ZmKCk7XG4gICAgc2V0dXBNb2RlLmNhbGwodGhpcywgbW9kZSk7XG4gICAgdGhpcy50dXJuT24oKTtcbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIEZ1bmN0aW9uIGNoYW5nZSB0aGUgbW9kZSBvZiB0aGUgY29ubmVjdGlvblxuICpcbiAqIEBwYXJhbSBAcGFyYW0ge1N0cmluZ30gbW9kZSB0aGUgY29ubmVjdGlvbiBtb2RlIHRoYXQgZGVmaW5lcyB0aGUgZGlyZWN0aW9uIGFuZCB0aGUgZGVwdGggb2YgY29ubmVjdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZSAnLT4nLCAnPDwtJywgJzw8PC0+Pj4nLCBldGMuXG4gKiBAcmV0dXJuIHtPYmplY3RbU3RyaW5nXX1cbiAqL1xuZnVuY3Rpb24gQ29ubmVjdG9yJGRlZmVyQ2hhbmdlTW9kZShtb2RlKSB7XG4gICAgXy5kZWZlck1ldGhvZCh0aGlzLCAnY2hhbmdlTW9kZScsIG1vZGUpO1xuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogRnVuY3Rpb24gdGhhdCByZXZlcnNlcyB0cmFuc2xhdGlvbiBydWxlcyBmb3IgcGF0aHMgb2YgY29ubmVjdGVkIG9kYXRhIHNvdXJjZXNcbiAqXG4gKiBAcGFyYW0ge09iamVjdFtTdHJpbmddfSBydWxlcyBtYXAgb2YgcGF0aHMgZGVmaW5pbmcgdGhlIHRyYW5zbGF0aW9uIHJ1bGVzXG4gKiBAcmV0dXJuIHtPYmplY3RbU3RyaW5nXX1cbiAqL1xuZnVuY3Rpb24gcmV2ZXJzZVRyYW5zbGF0aW9uUnVsZXMocnVsZXMpIHtcbiAgICB2YXIgcmV2ZXJzZVJ1bGVzID0ge307XG4gICAgXy5lYWNoS2V5KHJ1bGVzLCBmdW5jdGlvbihwYXRoMl92YWx1ZSwgcGF0aDFfa2V5KSB7XG4gICAgICAgIHJldmVyc2VSdWxlc1twYXRoMl92YWx1ZV0gPSBwYXRoMV9rZXk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJldmVyc2VSdWxlcztcbn1cblxuXG5mdW5jdGlvbiBnZXRQYXR0ZXJuVHJhbnNsYXRpb25zKHBhdGhUcmFuc2xhdGlvbikge1xuICAgIHZhciBwYXR0ZXJuVHJhbnNsYXRpb24gPSBbXTtcbiAgICBfLmVhY2hLZXkocGF0aFRyYW5zbGF0aW9uLCBmdW5jdGlvbihwYXRoMl92YWx1ZSwgcGF0aDFfa2V5KSB7XG4gICAgICAgIHZhciBzdGFySW5kZXgxID0gcGF0aDFfa2V5LmluZGV4T2YoJyonKVxuICAgICAgICAgICAgLCBzdGFySW5kZXgyID0gcGF0aDJfdmFsdWUuaW5kZXhPZignKicpO1xuICAgICAgICBpZiAoc3RhckluZGV4MSA+PSAwICYmIHN0YXJJbmRleDIgPj0gMCkgeyAvLyBwYXR0ZXJuIHRyYW5zbGF0aW9uXG4gICAgICAgICAgICBpZiAocGF0aDFfa2V5LnNsaWNlKHN0YXJJbmRleDEpICE9IHBhdGgyX3ZhbHVlLnNsaWNlKHN0YXJJbmRleDIpKVxuICAgICAgICAgICAgICAgIF90aHJvd0ludmFsaWRUcmFuc2xhdGlvbihwYXRoMV9rZXksIHBhdGgyX3ZhbHVlKTtcbiAgICAgICAgICAgIGRlbGV0ZSBwYXRoVHJhbnNsYXRpb25bcGF0aDFfa2V5XTsgICAgICAgICAgICBcblxuICAgICAgICAgICAgcGF0dGVyblRyYW5zbGF0aW9uLnB1c2goe1xuICAgICAgICAgICAgICAgIGZyb21QYXR0ZXJuOiBwYXRoVXRpbHMuY3JlYXRlUmVnZXhQYXRoKHBhdGgxX2tleSksXG4gICAgICAgICAgICAgICAgZnJvbVN0YXRpY1BhdGg6IF9nZXRTdGF0aWNQYXRoKHBhdGgxX2tleSwgc3RhckluZGV4MSksXG4gICAgICAgICAgICAgICAgdG9QYXR0ZXJuOiBwYXRoVXRpbHMuY3JlYXRlUmVnZXhQYXRoKHBhdGgyX3ZhbHVlKSxcbiAgICAgICAgICAgICAgICB0b1N0YXRpY1BhdGg6IF9nZXRTdGF0aWNQYXRoKHBhdGgyX3ZhbHVlLCBzdGFySW5kZXgyKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhckluZGV4MSA+PSAwIHx8IHN0YXJJbmRleDIgPj0gMCkgLy8gcGF0dGVybiBvbmx5IG9uIG9uZSBzaWRlIG9mIHRyYW5zbGF0aW9uXG4gICAgICAgICAgICBfdGhyb3dJbnZhbGlkVHJhbnNsYXRpb24ocGF0aDFfa2V5LCBwYXRoMl92YWx1ZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcGF0dGVyblRyYW5zbGF0aW9uO1xuXG5cbiAgICBmdW5jdGlvbiBfdGhyb3dJbnZhbGlkVHJhbnNsYXRpb24ocGF0aDEsIHBhdGgyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYXR0ZXJuIHRyYW5zbGF0aW9uOiAnICsgcGF0aDEgKyAnLCAnICsgcGF0aDIpO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gX2dldFN0YXRpY1BhdGgocGF0aCwgc3RhckluZGV4KSB7XG4gICAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoL1tcXC5cXFtdP1xcKi4qJC8sICcnKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gcmV2ZXJzZVBhdHRlcm5UcmFuc2xhdGlvblJ1bGVzKHBhdHRlcm5UcmFuc2xhdGlvbikge1xuICAgIHJldHVybiBwYXR0ZXJuVHJhbnNsYXRpb24ubWFwKGZ1bmN0aW9uKHB0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmcm9tUGF0dGVybjogcHQudG9QYXR0ZXJuLFxuICAgICAgICAgICAgZnJvbVN0YXRpY1BhdGg6IHB0LnRvU3RhdGljUGF0aCxcbiAgICAgICAgICAgIHRvUGF0dGVybjogcHQuZnJvbVBhdHRlcm4sXG4gICAgICAgICAgICB0b1N0YXRpY1BhdGg6IHB0LmZyb21TdGF0aWNQYXRoXG4gICAgICAgIH07XG4gICAgfSk7XG59XG5cblxuLyoqXG4gKiB0dXJuT25cbiAqIE1ldGhvZCBvZiBDb25uZWN0b3IgdGhhdCBlbmFibGVzIGNvbm5lY3Rpb24gKGlmIGl0IHdhcyBwcmV2aW91c2x5IGRpc2FibGVkKVxuICovXG5mdW5jdGlvbiBDb25uZWN0b3IkdHVybk9uKCkge1xuICAgIGlmICh0aGlzLmlzT24pXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignZGF0YSBzb3VyY2VzIGFyZSBhbHJlYWR5IGNvbm5lY3RlZCcpO1xuXG4gICAgdmFyIHN1YnNjcmlwdGlvblBhdGggPSB0aGlzLl9zdWJzY3JpcHRpb25QYXRoID1cbiAgICAgICAgbmV3IEFycmF5KHRoaXMuZGVwdGgxIHx8IHRoaXMuZGVwdGgyKS5qb2luKCcqJyk7XG5cbiAgICB2YXIgc3Vic2NyaXB0aW9uUGF0dGVybiA9IHBhdGhVdGlscy5jcmVhdGVSZWdleFBhdGgoc3Vic2NyaXB0aW9uUGF0aCk7XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHRoaXMuZGVwdGgxKVxuICAgICAgICB0aGlzLl9saW5rMSA9IGxpbmtEYXRhU291cmNlKCdfbGluazInLCB0aGlzLmRzMiwgdGhpcy5kczEsIHRoaXMuX2NoYW5nZXNRdWV1ZTEsIHRoaXMucGF0aFRyYW5zbGF0aW9uMSwgdGhpcy5wYXR0ZXJuVHJhbnNsYXRpb24xLCB0aGlzLmRhdGFUcmFuc2xhdGlvbjEsIHRoaXMuZGF0YVZhbGlkYXRpb24xKTtcbiAgICBpZiAodGhpcy5kZXB0aDIpXG4gICAgICAgIHRoaXMuX2xpbmsyID0gbGlua0RhdGFTb3VyY2UoJ19saW5rMScsIHRoaXMuZHMxLCB0aGlzLmRzMiwgdGhpcy5fY2hhbmdlc1F1ZXVlMiwgdGhpcy5wYXRoVHJhbnNsYXRpb24yLCB0aGlzLnBhdHRlcm5UcmFuc2xhdGlvbjIsIHRoaXMuZGF0YVRyYW5zbGF0aW9uMiwgdGhpcy5kYXRhVmFsaWRhdGlvbjIpO1xuXG4gICAgdGhpcy5pc09uID0gdHJ1ZTtcbiAgICB0aGlzLnBvc3RNZXNzYWdlKCd0dXJuZWRvbicpO1xuXG5cbiAgICBmdW5jdGlvbiBsaW5rRGF0YVNvdXJjZShyZXZlcnNlTGluaywgZnJvbURTLCB0b0RTLCBjaGFuZ2VzUXVldWUsIHBhdGhUcmFuc2xhdGlvbiwgcGF0dGVyblRyYW5zbGF0aW9uLCBkYXRhVHJhbnNsYXRpb24sIGRhdGFWYWxpZGF0aW9uKSB7XG4gICAgICAgIGZyb21EUy5vblN5bmMoJ2RhdGFjaGFuZ2VzJywgb25EYXRhKTtcbiAgICAgICAgcmV0dXJuIG9uRGF0YTtcblxuICAgICAgICBmdW5jdGlvbiBvbkRhdGEobWVzc2FnZSwgYmF0Y2gpIHtcbiAgICAgICAgICAgIHZhciBzZW5kRGF0YSA9IHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VzOiBbXSxcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbjogYmF0Y2gudHJhbnNhY3Rpb25cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYmF0Y2guY2hhbmdlcy5mb3JFYWNoKGZ1bmN0aW9uKGNoYW5nZSkge1xuICAgICAgICAgICAgICAgIHZhciBzb3VyY2VQYXRoID0gY2hhbmdlLnBhdGhcbiAgICAgICAgICAgICAgICAgICAgLCB0YXJnZXRQYXRoID0gdHJhbnNsYXRlUGF0aChzb3VyY2VQYXRoKTtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0UGF0aCA9PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgdmFyIGNoYW5nZSA9IF8uY2xvbmUoY2hhbmdlKTtcbiAgICAgICAgICAgICAgICBfLmV4dGVuZChjaGFuZ2UsIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmcm9tRFMsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IHRhcmdldFBhdGhcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZURhdGEoc291cmNlUGF0aCwgY2hhbmdlKTtcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZURhdGEoc291cmNlUGF0aCwgY2hhbmdlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoISBjaGFuZ2VzUXVldWUubGVuZ3RoKVxuICAgICAgICAgICAgICAgIF8uZGVmZXIocG9zdENoYW5nZURhdGEpO1xuXG4gICAgICAgICAgICBjaGFuZ2VzUXVldWUucHVzaChzZW5kRGF0YSk7XG5cblxuICAgICAgICAgICAgZnVuY3Rpb24gdHJhbnNsYXRlUGF0aChzb3VyY2VQYXRoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhdGhUcmFuc2xhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdHJhbnNsYXRlZFBhdGggPSBwYXRoVHJhbnNsYXRpb25bc291cmNlUGF0aF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2xhdGVkUGF0aCkgcmV0dXJuIHRyYW5zbGF0ZWRQYXRoO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhdHRlcm5UcmFuc2xhdGlvbi5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHB0ID0gXy5maW5kKHBhdHRlcm5UcmFuc2xhdGlvbiwgZnVuY3Rpb24ocFRyYW5zbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcFRyYW5zbGF0aW9uLmZyb21QYXR0ZXJuLnRlc3Qoc291cmNlUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXB0KSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIHZhciB0cmFuc2xhdGVkUGF0aCA9IHNvdXJjZVBhdGgucmVwbGFjZShwdC5mcm9tU3RhdGljUGF0aCwgcHQudG9TdGF0aWNQYXRoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEgKChzdWJzY3JpcHRpb25QYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBzdWJzY3JpcHRpb25QYXR0ZXJuLnRlc3Qoc291cmNlUGF0aCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdWJzY3JpcHRpb25QYXR0ZXJuID09IHNvdXJjZVBhdGgpKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlZFBhdGggfHwgc291cmNlUGF0aDtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBmdW5jdGlvbiB0cmFuc2xhdGVEYXRhKHNvdXJjZVBhdGgsIGNoYW5nZSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhVHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRyYW5zbGF0ZSA9IGRhdGFUcmFuc2xhdGlvbltzb3VyY2VQYXRoXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zbGF0ZSAmJiB0eXBlb2YgdHJhbnNsYXRlID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZS5vbGRWYWx1ZSA9IHRyYW5zbGF0ZShjaGFuZ2Uub2xkVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlLm5ld1ZhbHVlID0gdHJhbnNsYXRlKGNoYW5nZS5uZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICBcbiAgICAgICAgICAgIGZ1bmN0aW9uIHZhbGlkYXRlRGF0YShzb3VyY2VQYXRoLCBjaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICBwcm9wYWdhdGVEYXRhKGNoYW5nZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZGF0YVZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbGlkYXRvcnMgPSBkYXRhVmFsaWRhdGlvbltzb3VyY2VQYXRoXVxuICAgICAgICAgICAgICAgICAgICAgICAgLCBwYXNzZWRDb3VudCA9IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICwgYWxyZWFkeUZhaWxlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0b3JzKVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5mb3JFYWNoKGNhbGxWYWxpZGF0b3IpOyAgIFxuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY2FsbFZhbGlkYXRvcih2YWxpZGF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yKGNoYW5nZS5uZXdWYWx1ZSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucGF0aCA9IHNvdXJjZVBhdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBhbHJlYWR5RmFpbGVkICYmIChlcnIgfHwgcmVzcG9uc2UudmFsaWQpICYmICsrcGFzc2VkQ291bnQgPT0gdmFsaWRhdG9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tRFMucG9zdE1lc3NhZ2UoJ3ZhbGlkYXRlZCcsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoISByZXNwb25zZS52YWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHlGYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21EUy5wb3N0TWVzc2FnZSgndmFsaWRhdGVkJywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgZnVuY3Rpb24gcHJvcGFnYXRlRGF0YShjaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICBzZW5kRGF0YS5jaGFuZ2VzLnB1c2goY2hhbmdlKTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBmdW5jdGlvbiBwb3N0Q2hhbmdlRGF0YSgpIHtcbiAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGVuZGxlc3MgbG9vcCBvZiB1cGRhdGVzIGZvciAyLXdheSBjb25uZWN0aW9uXG4gICAgICAgICAgICAgICAgaWYgKHNlbGZbcmV2ZXJzZUxpbmtdKSB2YXIgY2FsbGJhY2sgPSBzdWJzY3JpcHRpb25Td2l0Y2g7XG5cbiAgICAgICAgICAgICAgICB2YXIgdHJhbnNhY3Rpb25zID0gbWVyZ2VUcmFuc2FjdGlvbnMoY2hhbmdlc1F1ZXVlKTtcbiAgICAgICAgICAgICAgICBjaGFuZ2VzUXVldWUubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMuZm9yRWFjaChmdW5jdGlvbih0cmFuc2FjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIGRhdGEgY2hhbmdlIGluc3RydWN0aW9uIGFzIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgdG9EUy5wb3N0TWVzc2FnZVN5bmMoJ2NoYW5nZWRhdGEnLCB7IGNoYW5nZXM6IHRyYW5zYWN0aW9uIH0sIGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBmdW5jdGlvbiBzdWJzY3JpcHRpb25Td2l0Y2goZXJyLCBjaGFuZ2VGaW5pc2hlZCkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHJldHVybjtcbiAgICAgICAgICAgICAgICB2YXIgb25PZmYgPSBjaGFuZ2VGaW5pc2hlZCA/ICdvblN5bmMnIDogJ29mZic7XG4gICAgICAgICAgICAgICAgdG9EU1tvbk9mZl0oJ2RhdGFjaGFuZ2VzJywgc2VsZltyZXZlcnNlTGlua10pO1xuXG4gICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBjaGFuZ2VGaW5pc2hlZCA/ICdjaGFuZ2Vjb21wbGV0ZWQnIDogJ2NoYW5nZXN0YXJ0ZWQnO1xuICAgICAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UobWVzc2FnZSwgeyBzb3VyY2U6IGZyb21EUywgdGFyZ2V0OiB0b0RTIH0pO1xuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIG1lcmdlVHJhbnNhY3Rpb25zKGJhdGNoZXMpIHtcbiAgICAgICAgICAgICAgICB2YXIgdHJhbnNhY3Rpb25zID0gW11cbiAgICAgICAgICAgICAgICAgICAgLCBjdXJyZW50VHJhbnNhY3Rpb247XG5cbiAgICAgICAgICAgICAgICBiYXRjaGVzLmZvckVhY2goZnVuY3Rpb24oYmF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEgYmF0Y2gudHJhbnNhY3Rpb24pIGN1cnJlbnRUcmFuc2FjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEgYmF0Y2guY2hhbmdlcy5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYmF0Y2gudHJhbnNhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VHJhbnNhY3Rpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5hcHBlbmRBcnJheShjdXJyZW50VHJhbnNhY3Rpb24sIGJhdGNoLmNoYW5nZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRyYW5zYWN0aW9uID0gXy5jbG9uZShiYXRjaC5jaGFuZ2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMucHVzaChjdXJyZW50VHJhbnNhY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9ucy5wdXNoKGJhdGNoLmNoYW5nZXMpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zYWN0aW9ucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG4vKipcbiAqIHR1cm5PZmZcbiAqIE1ldGhvZCBvZiBDb25uZWN0b3IgdGhhdCBkaXNhYmxlcyBjb25uZWN0aW9uIChpZiBpdCB3YXMgcHJldmlvdXNseSBlbmFibGVkKVxuICovXG5mdW5jdGlvbiBDb25uZWN0b3IkdHVybk9mZigpIHtcbiAgICBpZiAoISB0aGlzLmlzT24pXG4gICAgICAgIHJldHVybiBsb2dnZXIud2FybignZGF0YSBzb3VyY2VzIGFyZSBhbHJlYWR5IGRpc2Nvbm5lY3RlZCcpO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHVubGlua0RhdGFTb3VyY2UodGhpcy5kczEsICdfbGluazInLCB0aGlzLnBhdGhUcmFuc2xhdGlvbjIpO1xuICAgIHVubGlua0RhdGFTb3VyY2UodGhpcy5kczIsICdfbGluazEnLCB0aGlzLnBhdGhUcmFuc2xhdGlvbjEpO1xuXG4gICAgdGhpcy5pc09uID0gZmFsc2U7XG4gICAgdGhpcy5wb3N0TWVzc2FnZSgndHVybmVkb2ZmJyk7XG5cblxuICAgIGZ1bmN0aW9uIHVubGlua0RhdGFTb3VyY2UoZnJvbURTLCBsaW5rTmFtZSwgcGF0aFRyYW5zbGF0aW9uKSB7XG4gICAgICAgIGlmIChzZWxmW2xpbmtOYW1lXSkge1xuICAgICAgICAgICAgZnJvbURTLm9mZignZGF0YWNoYW5nZXMnLCBzZWxmW2xpbmtOYW1lXSk7XG4gICAgICAgICAgICBkZWxldGUgc2VsZltsaW5rTmFtZV07XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLyoqXG4gKiBEZXN0cm95cyBjb25uZWN0b3Igb2JqZWN0IGJ5IHR1cm5pbmcgaXQgb2ZmIGFuZCByZW1vdmluZyByZWZlcmVuY2VzIHRvIGNvbm5lY3RlZCBzb3VyY2VzXG4gKi9cbmZ1bmN0aW9uIENvbm5lY3RvciRkZXN0cm95KCkge1xuICAgIHRoaXMudHVybk9mZigpO1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoJ2Rlc3Ryb3llZCcpO1xuICAgIHRoaXMuX21lc3Nlbmdlci5kZXN0cm95KCk7XG4gICAgZGVsZXRlIHRoaXMuZHMxO1xuICAgIGRlbGV0ZSB0aGlzLmRzMjtcbiAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgTW9kZWxQYXRoID0gcmVxdWlyZSgnLi9tX3BhdGgnKVxuICAgICwgc3ludGhlc2l6ZSA9IHJlcXVpcmUoJy4vc3ludGhlc2l6ZScpXG4gICAgLCBwYXRoVXRpbHMgPSByZXF1aXJlKCcuL3BhdGhfdXRpbHMnKVxuICAgICwgbW9kZWxVdGlscyA9IHJlcXVpcmUoJy4vbW9kZWxfdXRpbHMnKVxuICAgICwgY2hhbmdlRGF0YUhhbmRsZXIgPSByZXF1aXJlKCcuL2NoYW5nZV9kYXRhJylcbiAgICAsIE1lc3NlbmdlciA9IHJlcXVpcmUoJy4uL21lc3NlbmdlcicpXG4gICAgLCBNZXNzZW5nZXJNZXNzYWdlU291cmNlID0gcmVxdWlyZSgnLi4vbWVzc2VuZ2VyL21zbmdyX3NvdXJjZScpXG4gICAgLCBNb2RlbE1zZ0FQSSA9IHJlcXVpcmUoJy4vbV9tc2dfYXBpJylcbiAgICAsIE1peGluID0gcmVxdWlyZSgnLi4vYWJzdHJhY3QvbWl4aW4nKVxuICAgICwgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpXG4gICAgLCBjaGVjayA9IHJlcXVpcmUoJy4uL3V0aWwvY2hlY2snKVxuICAgICwgTWF0Y2ggPSBjaGVjay5NYXRjaFxuICAgICwgbG9nZ2VyID0gcmVxdWlyZSgnLi4vdXRpbC9sb2dnZXInKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IE1vZGVsO1xuXG5cbi8qKlxuICogYG1pbG8uTW9kZWxgXG4gKiBNb2RlbCBjbGFzcyBpbnN0YW50aWF0ZXMgb2JqZWN0cyB0aGF0IGFsbG93IGRlZXAgZGF0YSBhY2Nlc3Mgd2l0aCBfX3NhZmUgZ2V0dGVyc19fIHRoYXQgcmV0dXJuIHVuZGVmaW5lZCAocmF0aGVyIHRoYW4gdGhyb3dpbmcgZXhjZXB0aW9uKSB3aGVuIHByb3BlcnRpZXMvaXRlbXMgb2YgdW5leGlzdGluZyBvYmplY3RzL2FycmF5cyBhcmUgcmVxdWVzdGVkIGFuZCBfX3NhZmUgc2V0dGVyc19fIHRoYXQgY3JlYXRlIG9iamVjdCB0cmVlcyB3aGVuIHByb3BlcnRpZXMvaXRlbXMgb2YgdW5leGlzdGluZyBvYmplY3RzL2FycmF5cyBhcmUgc2V0IGFuZCBhbHNvIHBvc3QgbWVzc2FnZXMgdG8gYWxsb3cgc3Vic2NyaXB0aW9uIG9uIGNoYW5nZXMgYW5kIGVuYWJsZSBkYXRhIHJlYWN0aXZpdHkuXG4gKiBSZWFjdGl2aXR5IGlzIGltcGxlbWVtbnRlZCB2aWEgW0Nvbm5lY3Rvcl0oLi9jb25uZWN0b3IuanMuaHRtbCkgdGhhdCBjYW4gYmUgaW5zdGFudGlhdGVkIGVpdGhlciBkaXJlY3RseSBvciB3aXRoIG1vcmUgY29udmVuaWVudCBpbnRlcmZhY2Ugb2YgW21pbG8ubWluZGVyXSguLi9taW5kZXIuanMuaHRtbCkuIEF0IHRoZSBtb21lbnQgbW9kZWwgY2FuIGJlIGNvbm5lY3RlZCB0byBbRGF0YSBmYWNldF0oLi4vY29tcG9uZW50cy9jX2ZhY2V0cy9EYXRhLmpzLmh0bWwpIG9yIHRvIGFub3RoZXIgbW9kZWwgb3IgW01vZGVsUGF0aF0oLi9tX3BhdGguanMuaHRtbCkuXG4gKiBNb2RlbCBjb25zdHJ1Y3RvciByZXR1cm5zIG9iamVjdHMgdGhhdCBhcmUgZnVuY3Rpb25zIGF0IHRoZSBzYW1lIHRpbWU7IHdoZW4gY2FsbGVkIHRoZXkgcmV0dXJuIE1vZGVsUGF0aCBvYmplY3RzIHRoYXQgYWxsb3cgZ2V0L3NldCBhY2Nlc3MgdG8gYW55IHBvaW50IGluIG1vZGVsIGRhdGEuIFNlZSBbTW9kZWxEYXRhXSgjTW9kZWxEYXRhKSBiZWxvdy5cbiAqXG4gKiBZb3UgY2FuIHN1YnNjcmliZSB0byBtb2RlbCBjaGFuZ2VzIHdpdGggYG9uYCBtZXRob2QgYnkgcGFzc2luZyBtb2RlbCBhY2Nlc3MgcGF0aCBpbiBwbGFjZSBvZiBtZXNzYWdlLCBwYXR0ZXJuIG9yIHN0cmluZyB3aXRoIGFueSBudW1iZXIgb2Ygc3RhcnMgdG8gc3Vic2NyaWJlIHRvIGEgY2VydGFpbiBkZXB0aCBpbiBtb2RlbCAoZS5nLiwgYCcqKionYCB0byBzdWJzY3JpYmUgdG8gdGhyZWUgbGV2ZWxzKS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBkYXRhIG9wdGlvbmFsIGluaXRpYWwgYXJyYXkgZGF0YS4gSWYgaXQgaXMgcGxhbm5lZCB0byBjb25uZWN0IG1vZGVsIHRvIHZpZXcgaXQgaXMgdXN1YWxseSBiZXR0ZXIgdG8gaW5zdGFudGlhdGUgYW4gZW1wdHkgTW9kZWwgKGB2YXIgbSA9IG5ldyBNb2RlbGApLCBjb25uZWN0IGl0IHRvIFtDb21wb25lbnRdKC4uL2NvbXBvbmVudHMvY19jbGFzcy5qcy5odG1sKSdzIFtEYXRhIGZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXRzL0RhdGEuanMuaHRtbCkgKGUuZy4sIGBtaWxvLm1pbmRlcihtLCAnPDwtPj4nLCBjLmRhdGEpO2ApIGFuZCB0aGVuIHNldCB0aGUgbW9kZWwgd2l0aCBgbS5zZXQoZGF0YSlgIC0gdGhlIHZpZXcgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gaG9zdE9iamVjdCBvcHRpb25hbCBvYmplY3QgdGhhdCBob3N0cyBtb2RlbCBvbiBvbmUgb2YgaXRzIHByb3BlcnRpZXMuIENhbiBiZSB1c2VkIHdoZW4gbW9kZWwgaXRzZWxmIGlzIHRoZSBjb250ZXh0IG9mIHRoZSBtZXNzYWdlIHN1YnNjcmliZXIgYW5kIHlvdSBuZWVkIHRvIHRyYXZlcnMgdG8gdGhpcyBvYmplY3QgKGFsdGhvdWdoIGl0IGlzIHBvc3NpYmxlIHRvIHNldCBhbnkgY29udGV4dCkuIENhbiBhbHNvIGJlIHVzZWQgdG8gcHJveHkgbW9kZWwncyBtZXRob2RzIHRvIHRoZSBob3N0IGxpa2UgW01vZGVsIGZhY2V0XSguLi9jb21wb25lbnRzL2NfZmFjZXRzL01vZGVsRmFjZXQuanMuaHRtbCkgaXMgZG9pbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBwYXNzIHsgcmVhY3RpdmU6IGZhbHNlIH0gdG8gdXNlIG1vZGVsIHdpdGhvdXQgbWVzc2FnaW5nIHdoZW4gaXQgaXMgbm90IG5lZWRlZCAtIGl0IG1ha2VzIGl0IG11Y2ggZmFzdGVyXG4gKiBAcmV0dXJuIHtNb2RlbH1cbiAqL1xuZnVuY3Rpb24gTW9kZWwoZGF0YSwgaG9zdE9iamVjdCwgb3B0aW9ucykge1xuICAgIC8vIGBtb2RlbGAgd2lsbCBiZSByZXR1cm5lZCBieSBjb25zdHJ1Y3RvciBpbnN0ZWFkIG9mIGB0aGlzYC4gYG1vZGVsYFxuICAgIC8vIChgbW9kZWxQYXRoYCBmdW5jdGlvbikgc2hvdWxkIHJldHVybiBhIE1vZGVsUGF0aCBvYmplY3Qgd2l0aCBcInN5bnRoZXNpemVkXCIgbWV0aG9kc1xuICAgIC8vIHRvIGdldC9zZXQgbW9kZWwgcHJvcGVydGllcywgdG8gc3Vic2NyaWJlIHRvIHByb3BlcnR5IGNoYW5nZXMsIGV0Yy5cbiAgICAvLyBBZGRpdGlvbmFsIGFyZ3VtZW50cyBvZiBtb2RlbFBhdGggY2FuIGJlIHVzZWQgaW4gdGhlIHBhdGggdXNpbmcgaW50ZXJwb2xhdGlvbiAtIHNlZSBNb2RlbFBhdGggYmVsb3cuXG4gICAgdmFyIG1vZGVsID0gZnVuY3Rpb24gbW9kZWxQYXRoKGFjY2Vzc1BhdGgpIHsgLy8gLCAuLi4gYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBpbnRlcnBvbGF0ZWRcbiAgICAgICAgcmV0dXJuIE1vZGVsJHBhdGguYXBwbHkobW9kZWwsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICBtb2RlbC5fX3Byb3RvX18gPSBNb2RlbC5wcm90b3R5cGU7XG5cbiAgICBtb2RlbC5faG9zdE9iamVjdCA9IGhvc3RPYmplY3Q7XG4gICAgbW9kZWwuX29wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgaWYgKG1vZGVsLl9vcHRpb25zLnJlYWN0aXZlICE9PSBmYWxzZSkge1xuICAgICAgICBtb2RlbC5fcHJlcGFyZU1lc3NlbmdlcnMoKTtcbiAgICAgICAgLy8gc3Vic2NyaWJlIHRvIFwiY2hhbmdlZGF0YVwiIG1lc3NhZ2UgdG8gZW5hYmxlIHJlYWN0aXZlIGNvbm5lY3Rpb25zXG4gICAgICAgIG1vZGVsLm9uU3luYygnY2hhbmdlZGF0YScsIGNoYW5nZURhdGFIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSkgbW9kZWwuX2RhdGEgPSBkYXRhO1xuXG4gICAgcmV0dXJuIG1vZGVsO1xufVxuXG5Nb2RlbC5wcm90b3R5cGUuX19wcm90b19fID0gTW9kZWwuX19wcm90b19fO1xuXG5cbi8qKlxuICogIyMjI01vZGVsIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbcGF0aF0oI3BhdGgpIC0gcmV0dXJucyBNb2RlbFBhdGggb2JqZWN0IHRoYXQgYWxsb3dzIGFjY2VzcyB0byBhbnkgcG9pbnQgaW4gTW9kZWxcbiAqIC0gW2dldF0oI01vZGVsJGdldCkgLSBnZXQgbW9kZWwgZGF0YVxuICogLSBzZXQgLSBzZXQgbW9kZWwgZGF0YSwgc3ludGhlc2l6ZWRcbiAqIC0gc3BsaWNlIC0gc3BsaWNlIG1vZGVsIGRhdGEgKGFzIGFycmF5IG9yIHBzZXVkby1hcnJheSksIHN5bnRoZXNpemVkXG4gKiAtIFtsZW5dKC4vbV9wYXRoLmpzLmh0bWwjTW9kZWxQYXRoJGxlbikgLSByZXR1cm5zIGxlbmd0aCBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KSBpbiBtb2RlbCBpbiBzYWZlIHdheSwgMCBpZiBubyBsZW5ndGggaXMgc2V0XG4gKiAtIFtwdXNoXSguL21fcGF0aC5qcy5odG1sI01vZGVsUGF0aCRwdXNoKSAtIGFkZCBpdGVtcyB0byB0aGUgZW5kIG9mIGFycmF5IChvciBwc2V1ZG8tYXJyYXkpIGluIG1vZGVsXG4gKiAtIFtwb3BdKC4vbV9wYXRoLmpzLmh0bWwjTW9kZWxQYXRoJHBvcCkgLSByZW1vdmUgaXRlbSBmcm9tIHRoZSBlbmQgb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkgaW4gbW9kZWxcbiAqIC0gW3Vuc2hpZnRdKC4vbV9wYXRoLmpzLmh0bWwjTW9kZWxQYXRoJHVuc2hpZnQpIC0gYWRkIGl0ZW1zIHRvIHRoZSBiZWdpbm5pbmcgb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkgaW4gbW9kZWxcbiAqIC0gW3NoaWZ0XSguL21fcGF0aC5qcy5odG1sI01vZGVsUGF0aCRzaGlmdCkgLSByZW1vdmUgaXRlbSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkgaW4gbW9kZWxcbiAqIC0gW3Byb3h5TWVzc2VuZ2VyXSgjcHJveHlNZXNzZW5nZXIpIC0gcHJveHkgbW9kZWwncyBNZXNzZW5nZXIgbWV0aG9kcyB0byBob3N0IG9iamVjdFxuICogLSBbcHJveHlNZXRob2RzXSgjcHJveHlNZXRob2RzKSAtIHByb3h5IG1vZGVsIG1ldGhvZHMgdG8gaG9zdCBvYmplY3RcbiAqL1xuXy5leHRlbmRQcm90byhNb2RlbCwge1xuICAgIHBhdGg6IE1vZGVsJHBhdGgsXG4gICAgZ2V0OiBNb2RlbCRnZXQsXG4gICAgcHJveHlNZXNzZW5nZXI6IHByb3h5TWVzc2VuZ2VyLCAvLyBkZXByZWNhdGVkLCBzaG91bGQgbm90IGJlIHVzZWRcbiAgICBwcm94eU1ldGhvZHM6IHByb3h5TWV0aG9kcyxcbiAgICBfcHJlcGFyZU1lc3NlbmdlcnM6IF9wcmVwYXJlTWVzc2VuZ2VycyxcbiAgICBfZ2V0SG9zdE9iamVjdDogX2dldEhvc3RPYmplY3QsXG4gICAgZGVzdHJveTogTW9kZWwkZGVzdHJveVxufSk7XG5cbi8vIHNldCwgZGVsLCBzcGxpY2UgYXJlIGFkZGVkIHRvIG1vZGVsXG5fLmV4dGVuZFByb3RvKE1vZGVsLCBzeW50aGVzaXplLm1vZGVsTWV0aG9kcyk7XG5cblxuLyoqXG4gKiAtIFBhdGg6IE1vZGVsUGF0aCBjbGFzcyBhcyBgbWlsby5Nb2RlbC5QYXRoYFxuICovXG5fLmV4dGVuZChNb2RlbCwge1xuICAgIFBhdGg6IE1vZGVsUGF0aCxcbiAgICB1c2VXaXRoOiBNb2RlbCQkdXNlV2l0aCxcbiAgICBfdXRpbHM6IHtcbiAgICAgICAgcGF0aDogcGF0aFV0aWxzLFxuICAgICAgICBtb2RlbDogbW9kZWxVdGlscyxcbiAgICAgICAgY2hhbmdlRGF0YUhhbmRsZXI6IGNoYW5nZURhdGFIYW5kbGVyXG4gICAgfVxufSk7XG5cblxuLyoqXG4gKiBFeHBvc2UgTWVzc2VuZ2VyIG1ldGhvZHMgb24gRmFjZXQgcHJvdG90eXBlXG4gKi9cbnZhciBNRVNTRU5HRVJfUFJPUEVSVFkgPSAnX21lc3Nlbmdlcic7XG5NZXNzZW5nZXIudXNlV2l0aChNb2RlbCwgTUVTU0VOR0VSX1BST1BFUlRZLCBNZXNzZW5nZXIuZGVmYXVsdE1ldGhvZHMpO1xuXG5cbi8qKlxuICogTW9kZWxQYXRoIG1ldGhvZHMgYWRkZWQgdG8gTW9kZWwgcHJvdG90eXBlXG4gKi9cblsnbGVuJywgJ3B1c2gnLCAncG9wJywgJ3Vuc2hpZnQnLCAnc2hpZnQnXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICB2YXIgbWV0aG9kID0gTW9kZWxQYXRoLnByb3RvdHlwZVttZXRob2ROYW1lXTtcbiAgICBfLmRlZmluZVByb3BlcnR5KE1vZGVsLnByb3RvdHlwZSwgbWV0aG9kTmFtZSwgbWV0aG9kKTtcbn0pO1xuXG5cbi8qKlxuICogTW9kZWwgaW5zdGFuY2UgbWV0aG9kLlxuICogR2V0IG1vZGVsIGRhdGEuXG4gKlxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiBNb2RlbCRnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG59XG5cblxuLyoqXG4gKiBNb2RlbCBpbnN0YW5jZSBtZXRob2QuXG4gKiBSZXR1cm5zIE1vZGVsUGF0aCBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSBzYW1lIEFQSSBhcyBtb2RlbCBidXQgYWxsb3dzIGFjY2VzcyB0byBhbnkgcG9pbnQgaW5zaWRlIG1vZGVsIGFzIGRlZmluZWQgYnkgYGFjY2Vzc1BhdGhgLlxuICogU2VlIFtNb2RlbFBhdGhdKC4vbV9wYXRoLmpzLmh0bWwpIGNsYXNzIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY2Nlc3NQYXRoIHN0cmluZyB0aGF0IGRlZmluZXMgcGF0aCB0byBhY2Nlc3MgbW9kZWwuXG4gKiAgUGF0aCBzdHJpbmcgY29uc2lzdHMgb2YgcGFydHMgdG8gZGVmaW5lIGVpdGhlciBwcm9wZXJ0eSBhY2Nlc3MgKGBcIi5uYW1lXCJgIHRvIGFjY2VzcyBwcm9wZXJ0eSBuYW1lKSBvciBhcnJheSBpdGVtIGFjY2VzcyAoYFwiWzFdXCJgIHRvIGFjY2VzcyBpdGVtIHdpdGggaW5kZXggMSkuXG4gKiAgQWNjZXNzIHBhdGggY2FuIGNvbnRhaW4gYXMgbWFueSBwYXJ0cyBhcyBuZWNlc3NhcnkgKGUuZy4gYFwiLmxpc3RbMF0ubmFtZVwiYCB0byBhY2Nlc3MgcHJvcGVydHkgYG5hbWVgIGluIHRoZSBmaXJzdCBlbGVtZW50IG9mIGFycmF5IHN0b3JlZCBpbiBwcm9wZXJ0eSBgbGlzdGAuXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBvZiB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgaW50ZXJwb2xhdGVkIHBhdGhzLlxuICogIEUuZy4gYG0ucGF0aChcIlskMV0uJDJcIiwgaWQsIHByb3ApYCByZXR1cm5zIE1vZGVsUGF0aCB0byBhY2Nlc3MgcHJvcGVydHkgd2l0aCBuYW1lIGBwcm9wYCBpbiBhcnJheSBpdGVtIHdpdGggaW5kZXggYGlkYC4gQWx0aG91Z2ggdGhpcyBNb2RlbFBhdGggb2JqZWN0IHdpbGwgd29yayBleGFjdGx5IGFzIGBtKFwiW1wiICsgaWQgKyBcIl0uXCIgKyBwcm9wKWAsIHRoZSBpbnRlcnBvbGF0ZWQgaXMgbXVjaCBtb3JlIGVmZmljaWVudCBhcyBNb2RlbFBhdGggd2l0aCBpbnRlcnBvbGF0aW9uIHdpbGwgbm90IHN5bnRoZXNpemUgbmV3IGdldHRlcnMgYW5kIHNldHRlcnMsIHdoaWxlIE1vZGVsUGF0aCB3aXRoIGNvbXB1dGVkIGFjY2VzcyBwYXRoIHdpbGwgc3ludGhlc2l6ZSBuZXcgZ2V0dGVycyBhbmQgc2V0dGVycyBmb3IgZWFjaCBwYWlyIG9mIHZhbHVlcyBvZiBgaWRgIGFuZCBgcHJvcGAuXG4gKiBAcmV0dXJuIHtNb2RlbFBhdGh9XG4gKi9cbmZ1bmN0aW9uIE1vZGVsJHBhdGgoYWNjZXNzUGF0aCkgeyAgLy8gLCAuLi4gYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBpbnRlcnBvbGF0ZWRcbiAgICBpZiAoISBhY2Nlc3NQYXRoKSByZXR1cm4gdGhpcztcblxuICAgIC8vIFwibnVsbFwiIGlzIGNvbnRleHQgdG8gcGFzcyB0byBNb2RlbFBhdGgsIGZpcnN0IHBhcmFtZXRlciBvZiBiaW5kXG4gICAgLy8gXCJ0aGlzXCIgKG1vZGVsKSBpcyBhZGRlZCBpbiBmcm9udCBvZiBhbGwgYXJndW1lbnRzXG4gICAgXy5zcGxpY2UoYXJndW1lbnRzLCAwLCAwLCBudWxsLCB0aGlzKTtcblxuICAgIC8vIGNhbGxpbmcgTW9kZWxQYXRoIGNvbnN0cnVjdG9yIHdpdGggbmV3IGFuZCB0aGUgbGlzdCBvZiBhcmd1bWVudHM6IHRoaXMgKG1vZGVsKSwgYWNjZXNzUGF0aCwgLi4uXG4gICAgcmV0dXJuIG5ldyAoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuYXBwbHkoTW9kZWxQYXRoLCBhcmd1bWVudHMpKTtcbn1cblxuXG4vKipcbiAqIE1vZGVsIGluc3RhbmNlIG1ldGhvZC5cbiAqIFByb3h5IG1vZGVsJ3MgTWVzc2VuZ2VyIG1ldGhvZHMgdG8gaG9zdCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG1vZGVsSG9zdE9iamVjdCBvcHRpb25hbCBob3N0IG9iamVjdC4gSWYgbm90IHBhc3NlZCwgaG9zdE9iamVjdCBwYXNzZWQgdG8gTW9kZWwgY29uc3RydWN0b3Igd2lsbCBiZSB1c2VkLlxuICovXG5mdW5jdGlvbiBwcm94eU1lc3Nlbmdlcihtb2RlbEhvc3RPYmplY3QpIHtcbiAgICBtb2RlbEhvc3RPYmplY3QgPSBtb2RlbEhvc3RPYmplY3QgfHwgdGhpcy5faG9zdE9iamVjdDtcbiAgICBNaXhpbi5wcm90b3R5cGUuX2NyZWF0ZVByb3h5TWV0aG9kcy5jYWxsKHRoaXNbTUVTU0VOR0VSX1BST1BFUlRZXSwgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzLCBtb2RlbEhvc3RPYmplY3QpO1xufVxuXG5cbnZhciBtb2RlbE1ldGhvZHNUb1Byb3h5ID0gWydwYXRoJywgJ2dldCcsICdzZXQnLCAnZGVsJywgJ3NwbGljZScsICdsZW4nLCAncHVzaCcsICdwb3AnLCAndW5zaGlmdCcsICdzaGlmdCddO1xuXG5cbi8qKlxuICogRXhwb3NlIG1vZGVsIG1ldGhvZHMgb25cbiAqIFNlZSBzYW1lIG1ldGhvZCBpbiBNaXhpbiBjbGFzcyBmb3IgcGFyYW1ldGVycyBtZWFuaW5nXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaG9zdENsYXNzXG4gKiBAcGFyYW0ge1t0eXBlXX0gaW5zdGFuY2VLZXlcbiAqIEBwYXJhbSB7W3R5cGVdfSBtaXhpbk1ldGhvZHMgb3B0aW9uYWxcbiAqL1xuZnVuY3Rpb24gTW9kZWwkJHVzZVdpdGgoaG9zdENsYXNzLCBpbnN0YW5jZUtleSwgbWl4aW5NZXRob2RzKSB7XG4gICAgbWl4aW5NZXRob2RzID0gbWl4aW5NZXRob2RzIHx8IG1vZGVsTWV0aG9kc1RvUHJveHk7XG4gICAgTWl4aW4udXNlV2l0aC5jYWxsKE1vZGVsLCBob3N0Q2xhc3MsIGluc3RhbmNlS2V5LCBtaXhpbk1ldGhvZHMpO1xufVxuXG5cbi8qKlxuICogTW9kZWwgaW5zdGFuY2UgbWV0aG9kLlxuICogUHJveHkgbW9kZWwgbWV0aG9kcyB0byBob3N0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbW9kZWxIb3N0T2JqZWN0IG9wdGlvbmFsIGhvc3Qgb2JqZWN0LiBJZiBub3QgcGFzc2VkLCBob3N0T2JqZWN0IHBhc3NlZCB0byBNb2RlbCBjb25zdHJ1Y3RvciB3aWxsIGJlIHVzZWQuXG4gKi9cbmZ1bmN0aW9uIHByb3h5TWV0aG9kcyhtb2RlbEhvc3RPYmplY3QpIHtcbiAgICBtb2RlbEhvc3RPYmplY3QgPSBtb2RlbEhvc3RPYmplY3QgfHwgdGhpcy5faG9zdE9iamVjdDtcbiAgICBNaXhpbi5wcm90b3R5cGUuX2NyZWF0ZVByb3h5TWV0aG9kcy5jYWxsKHRoaXMsIG1vZGVsTWV0aG9kc1RvUHJveHksIG1vZGVsSG9zdE9iamVjdCk7XG59XG5cblxuLyoqXG4gKiBNb2RlbCBpbnN0YW5jZSBtZXRob2QuXG4gKiBDcmVhdGUgYW5kIGNvbm5lY3QgaW50ZXJuYWwgYW5kIGV4dGVybmFsIG1vZGVsJ3MgbWVzc2VuZ2Vycy5cbiAqIEV4dGVybmFsIG1lc3NlbmdlcidzIG1ldGhvZHMgYXJlIHByb3hpZWQgb24gdGhlIG1vZGVsIGFuZCB0aGV5IGFsbG93cyBcIipcIiBzdWJzY3JpcHRpb25zLlxuICovXG5mdW5jdGlvbiBfcHJlcGFyZU1lc3NlbmdlcnMoKSB7XG4gICAgLy8gbW9kZWwgd2lsbCBwb3N0IGFsbCBpdHMgY2hhbmdlcyBvbiBpbnRlcm5hbCBtZXNzZW5nZXJcbiAgICB2YXIgaW50ZXJuYWxNZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKHRoaXMsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcblxuICAgIC8vIG1lc3NhZ2Ugc291cmNlIHRvIGNvbm5lY3QgaW50ZXJuYWwgbWVzc2VuZ2VyIHRvIGV4dGVybmFsXG4gICAgdmFyIGludGVybmFsTWVzc2VuZ2VyU291cmNlID0gbmV3IE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2UodGhpcywgdW5kZWZpbmVkLCBuZXcgTW9kZWxNc2dBUEksIGludGVybmFsTWVzc2VuZ2VyKTtcblxuICAgIC8vIGV4dGVybmFsIG1lc3NlbmdlciB0byB3aGljaCBhbGwgbW9kZWwgdXNlcnMgd2lsbCBzdWJzY3JpYmUsXG4gICAgLy8gdGhhdCB3aWxsIGFsbG93IFwiKlwiIHN1YnNjcmlwdGlvbnMgYW5kIHN1cHBvcnQgXCJjaGFuZ2VkYXRhXCIgbWVzc2FnZSBhcGkuXG4gICAgdmFyIGV4dGVybmFsTWVzc2VuZ2VyID0gbmV3IE1lc3Nlbmdlcih0aGlzLCB1bmRlZmluZWQsIGludGVybmFsTWVzc2VuZ2VyU291cmNlKTtcblxuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgTUVTU0VOR0VSX1BST1BFUlRZLCBleHRlcm5hbE1lc3Nlbmdlcik7XG4gICAgXy5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX2ludGVybmFsTWVzc2VuZ2VyJywgaW50ZXJuYWxNZXNzZW5nZXIpO1xufVxuXG5cbmZ1bmN0aW9uIF9nZXRIb3N0T2JqZWN0KCkge1xuICAgIHJldHVybiB0aGlzLl9ob3N0T2JqZWN0O1xufVxuXG5cbmZ1bmN0aW9uIE1vZGVsJGRlc3Ryb3koKSB7XG4gICAgdGhpc1tNRVNTRU5HRVJfUFJPUEVSVFldLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9pbnRlcm5hbE1lc3Nlbmdlci5kZXN0cm95KCk7XG4gICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIE1lc3NlbmdlclJlZ2V4cEFQSSA9IHJlcXVpcmUoJy4uL21lc3Nlbmdlci9tX2FwaV9yeCcpXG4gICAgLCBwYXRoVXRpbHMgPSByZXF1aXJlKCcuL3BhdGhfdXRpbHMnKVxuICAgICwgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpO1xuXG5cbi8qKlxuICogU3ViY2xhc3Mgb2YgTWVzc2VuZ2VyUmVnZXhwQVBJIHRoYXQgaXMgdXNlZCB0byB0cmFuc2xhdGUgbWVzc2FnZXMgb2YgZXh0ZXJuYWwgbWVzc2VuZ2VyIG9mIE1vZGVsIHRvIGludGVybmFsIG1lc3NlbmdlciBvZiBNb2RlbC5cbiAqL1xudmFyIE1vZGVsTXNnQVBJID0gXy5jcmVhdGVTdWJjbGFzcyhNZXNzZW5nZXJSZWdleHBBUEksICdNb2RlbE1zZ0FQSScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1vZGVsTXNnQVBJO1xuXG5cbi8qKlxuICogIyMjI01vZGVsTXNnQVBJIGluc3RhbmNlIG1ldGhvZHMjIyMjXG4gKlxuICogLSBbdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlXSgjdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKSAtIHRyYW5zbGF0ZXMgc3Vic2NyaXB0aW9uIHBhdGhzIHdpdGggXCIqXCJzIHRvIHJlZ2V4LCBsZWF2aW5nIG90aGVyIHN0cmluZ3MgdW50b3VjaGVkXG4gKi9cbl8uZXh0ZW5kUHJvdG8oTW9kZWxNc2dBUEksIHtcbiAgICB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2U6IHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZSxcbn0pO1xuXG5cbi8qKlxuICogTW9kZWxNc2dBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBUcmFuc2xhdGVzIHN1YnNjcmlwdGlvbiBwYXRocyB3aXRoIFwiKlwicyB0byByZWdleCwgbGVhdmluZyBvdGhlciBzdHJpbmdzIHVudG91Y2hlZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYWNjZXNzUGF0aCByZWxhdGl2ZSBhY2Nlc3MgcGF0aCB0byBiZSB0cmFuc2xhdGVkXG4gKiBAcmV0dXJuIHtSZWdFeHB8U3RyaW5nfVxuICovXG5mdW5jdGlvbiB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2UoYWNjZXNzUGF0aCkge1xuICAgIGlmIChhY2Nlc3NQYXRoIGluc3RhbmNlb2YgUmVnRXhwKSByZXR1cm4gYWNjZXNzUGF0aDtcblxuICAgIHJldHVybiBwYXRoVXRpbHMuY3JlYXRlUmVnZXhQYXRoKGFjY2Vzc1BhdGgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc3ludGhlc2l6ZSA9IHJlcXVpcmUoJy4vc3ludGhlc2l6ZScpXG4gICAgLCBwYXRoVXRpbHMgPSByZXF1aXJlKCcuL3BhdGhfdXRpbHMnKVxuICAgICwgY2hhbmdlRGF0YUhhbmRsZXIgPSByZXF1aXJlKCcuL2NoYW5nZV9kYXRhJylcbiAgICAsIE1lc3NlbmdlciA9IHJlcXVpcmUoJy4uL21lc3NlbmdlcicpXG4gICAgLCBNb2RlbFBhdGhNc2dBUEkgPSByZXF1aXJlKCcuL3BhdGhfbXNnX2FwaScpXG4gICAgLCBNZXNzZW5nZXJNZXNzYWdlU291cmNlID0gcmVxdWlyZSgnLi4vbWVzc2VuZ2VyL21zbmdyX3NvdXJjZScpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJylcbiAgICAsIGNoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9jaGVjaycpXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gTW9kZWxQYXRoO1xuXG5cbi8qKlxuICogYG1pbG8uTW9kZWwuUGF0aGBcbiAqIE1vZGVsUGF0aCBvYmplY3QgdGhhdCBhbGxvd3MgYWNjZXNzIHRvIGFueSBwb2ludCBpbnNpZGUgW01vZGVsXSguL2luZGV4LmpzLmh0bWwpIGFzIGRlZmluZWQgYnkgYGFjY2Vzc1BhdGhgXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge01vZGVsfSBtb2RlbCBNb2RlbCBpbnN0YW5jZSB0aGF0IE1vZGVsUGF0aCBnaXZlcyBhY2Nlc3MgdG8uXG4gKiBAcGFyYW0ge1N0cmluZ30gYWNjZXNzUGF0aCBzdHJpbmcgdGhhdCBkZWZpbmVzIHBhdGggdG8gYWNjZXNzIG1vZGVsLlxuICogIFBhdGggc3RyaW5nIGNvbnNpc3RzIG9mIHBhcnRzIHRvIGRlZmluZSBlaXRoZXIgcHJvcGVydHkgYWNjZXNzIChgXCIubmFtZVwiYCB0byBhY2Nlc3MgcHJvcGVydHkgbmFtZSkgb3IgYXJyYXkgaXRlbSBhY2Nlc3MgKGBcIlsxXVwiYCB0byBhY2Nlc3MgaXRlbSB3aXRoIGluZGV4IDEpLlxuICogIEFjY2VzcyBwYXRoIGNhbiBjb250YWluIGFzIG1hbnkgcGFydHMgYXMgbmVjZXNzYXJ5IChlLmcuIGBcIi5saXN0WzBdLm5hbWVcImAgdG8gYWNjZXNzIHByb3BlcnR5IGBuYW1lYCBpbiB0aGUgZmlyc3QgZWxlbWVudCBvZiBhcnJheSBzdG9yZWQgaW4gcHJvcGVydHkgYGxpc3RgLlxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgYWRkaXRpb25hbCBhcmd1bWVudHMgb2YgdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGludGVycG9sYXRlZCBwYXRocy5cbiAqICBFLmcuIGBtLnBhdGgoXCJbJDFdLiQyXCIsIGlkLCBwcm9wKWAgcmV0dXJucyBNb2RlbFBhdGggdG8gYWNjZXNzIHByb3BlcnR5IHdpdGggbmFtZSBgcHJvcGAgaW4gYXJyYXkgaXRlbSB3aXRoIGluZGV4IGBpZGAuIEFsdGhvdWdoIHRoaXMgTW9kZWxQYXRoIG9iamVjdCB3aWxsIHdvcmsgZXhhY3RseSBhcyBgbShcIltcIiArIGlkICsgXCJdLlwiICsgcHJvcClgLCB0aGUgaW50ZXJwb2xhdGVkIGlzIG11Y2ggbW9yZSBlZmZpY2llbnQgYXMgTW9kZWxQYXRoIHdpdGggaW50ZXJwb2xhdGlvbiB3aWxsIG5vdCBzeW50aGVzaXplIG5ldyBnZXR0ZXJzIGFuZCBzZXR0ZXJzLCB3aGlsZSBNb2RlbFBhdGggd2l0aCBjb21wdXRlZCBhY2Nlc3MgcGF0aCB3aWxsIHN5bnRoZXNpemUgbmV3IGdldHRlcnMgYW5kIHNldHRlcnMgZm9yIGVhY2ggcGFpciBvZiB2YWx1ZXMgb2YgYGlkYCBhbmQgYHByb3BgLlxuICogQHJldHVybiB7TW9kZWxQYXRofVxuICovXG5mdW5jdGlvbiBNb2RlbFBhdGgobW9kZWwsIHBhdGgpIHsgLy8gLC4uLiAtIGFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciBpbnRlcnBvbGF0aW9uXG4gICAgLy8gY2hlY2sobW9kZWwsIE1vZGVsKTtcbiAgICBjaGVjayhwYXRoLCBTdHJpbmcpO1xuXG4gICAgLy8gYG1vZGVsUGF0aGAgd2lsbCBiZSByZXR1cm5lZCBieSBjb25zdHJ1Y3RvciBpbnN0ZWFkIG9mIGB0aGlzYC4gYG1vZGVsUGF0aGBcbiAgICAvLyAoYG1vZGVsUGF0aF9wYXRoYCBmdW5jdGlvbikgc2hvdWxkIGFsc28gcmV0dXJuIGEgTW9kZWxQYXRoIG9iamVjdCB3aXRoIFwic3ludGhlc2l6ZWRcIiBtZXRob2RzXG4gICAgLy8gdG8gZ2V0L3NldCBtb2RlbCBwcm9wZXJ0aWVzLCB0byBzdWJzY3JpYmUgdG8gcHJvcGVydHkgY2hhbmdlcywgZXRjLlxuICAgIC8vIEFkZGl0aW9uYWwgYXJndW1lbnRzIG9mIG1vZGVsUGF0aCBjYW4gYmUgdXNlZCBpbiB0aGUgcGF0aCB1c2luZyBpbnRlcnBvbGF0aW9uIC0gc2VlIE1vZGVsUGF0aCBiZWxvdy5cbiAgICB2YXIgbW9kZWxQYXRoID0gZnVuY3Rpb24gbW9kZWxQYXRoX3BhdGgoYWNjZXNzUGF0aCkgeyAvLyAsIC4uLiBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIGludGVycG9sYXRlZFxuICAgICAgICByZXR1cm4gTW9kZWxQYXRoJHBhdGguYXBwbHkobW9kZWxQYXRoLCBhcmd1bWVudHMpO1xuICAgIH07XG4gICAgbW9kZWxQYXRoLl9fcHJvdG9fXyA9IE1vZGVsUGF0aC5wcm90b3R5cGU7XG5cblxuICAgIF8uZGVmaW5lUHJvcGVydGllcyhtb2RlbFBhdGgsIHtcbiAgICAgICAgX21vZGVsOiBtb2RlbCxcbiAgICAgICAgX3BhdGg6IHBhdGgsXG4gICAgICAgIF9hcmdzOiBfLnNsaWNlKGFyZ3VtZW50cywgMSksIC8vIHBhdGggd2lsbCBiZSB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGlzIGFycmF5XG4gICAgICAgIF9vcHRpb25zOiBtb2RlbC5fb3B0aW9uc1xuICAgIH0pO1xuXG4gICAgLy8gcGFyc2UgYWNjZXNzIHBhdGhcbiAgICB2YXIgcGFyc2VkUGF0aCA9IHBhdGhVdGlscy5wYXJzZUFjY2Vzc1BhdGgocGF0aCk7XG5cbiAgICAvLyBjb21wdXRlIGFjY2VzcyBwYXRoIHN0cmluZ1xuICAgIF8uZGVmaW5lUHJvcGVydHkobW9kZWxQYXRoLCAnX2FjY2Vzc1BhdGgnLCBpbnRlcnBvbGF0ZUFjY2Vzc1BhdGgocGFyc2VkUGF0aCwgbW9kZWxQYXRoLl9hcmdzKSk7XG5cbiAgICBpZiAobW9kZWxQYXRoLl9vcHRpb25zLnJlYWN0aXZlICE9PSBmYWxzZSkge1xuICAgICAgICAvLyBtZXNzZW5nZXIgZmFpbHMgb24gXCIqXCIgc3Vic2NyaXB0aW9uc1xuICAgICAgICBtb2RlbFBhdGguX3ByZXBhcmVNZXNzZW5nZXIoKTtcbiAgICAgICAgLy8gc3Vic2NyaWJlIHRvIFwiY2hhbmdlZGF0YVwiIG1lc3NhZ2UgdG8gZW5hYmxlIHJlYWN0aXZlIGNvbm5lY3Rpb25zXG4gICAgICAgIG1vZGVsUGF0aC5vblN5bmMoJ2NoYW5nZWRhdGEnLCBjaGFuZ2VEYXRhSGFuZGxlcik7XG4gICAgfVxuXG4gICAgLy8gY29tcGlsaW5nIGdldHRlciBhbmQgc2V0dGVyXG4gICAgdmFyIG1ldGhvZHMgPSBzeW50aGVzaXplKHBhdGgsIHBhcnNlZFBhdGgpO1xuXG4gICAgLy8gYWRkaW5nIG1ldGhvZHMgdG8gbW9kZWwgcGF0aFxuICAgIF8uZGVmaW5lUHJvcGVydGllcyhtb2RlbFBhdGgsIG1ldGhvZHMpO1xuXG4gICAgT2JqZWN0LmZyZWV6ZShtb2RlbFBhdGgpO1xuXG4gICAgcmV0dXJuIG1vZGVsUGF0aDtcbn1cblxuTW9kZWxQYXRoLnByb3RvdHlwZS5fX3Byb3RvX18gPSBNb2RlbFBhdGguX19wcm90b19fO1xuXG5cbi8qKlxuICogSW50ZXJwb2xhdGVzIHBhdGggZWxlbWVudHMgdG8gY29tcHV0ZSByZWFsIHBhdGhcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBwYXJzZWRQYXRoIHBhcnNlZCBwYXRoIC0gYXJyYXkgb2YgcGF0aCBub2Rlc1xuICogQHBhcmFtIHtBcnJheX0gYXJncyBwYXRoIGludGVycG9sYXRpb24gYXJndW1lbnRzLCBhcmdzWzBdIGlzIHBhdGggaXRzZWxmXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGludGVycG9sYXRlQWNjZXNzUGF0aChwYXJzZWRQYXRoLCBhcmdzKSB7XG4gICAgcmV0dXJuIHBhcnNlZFBhdGgucmVkdWNlKGZ1bmN0aW9uKGFjY2Vzc1BhdGhTdHIsIGN1cnJOb2RlLCBpbmRleCkge1xuICAgICAgICB2YXIgaW50ZXJwb2xhdGUgPSBjdXJyTm9kZS5pbnRlcnBvbGF0ZTtcbiAgICAgICAgcmV0dXJuIGFjY2Vzc1BhdGhTdHIgK1xuICAgICAgICAgICAgICAgIChpbnRlcnBvbGF0ZVxuICAgICAgICAgICAgICAgICAgICA/IChjdXJyTm9kZS5zeW50YXggPT0gJ2FycmF5J1xuICAgICAgICAgICAgICAgICAgICAgICAgPyAnWycgKyBhcmdzW2ludGVycG9sYXRlXSArICddJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnLicgKyBhcmdzW2ludGVycG9sYXRlXSlcbiAgICAgICAgICAgICAgICAgICAgOiBjdXJyTm9kZS5wcm9wZXJ0eSk7XG4gICAgfSwgJycpO1xufVxuXG5cbi8qKlxuICogIyMjI01vZGVsUGF0aCBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW3BhdGhdKCNNb2RlbFBhdGgkcGF0aCkgLSBnaXZlcyBhY2Nlc3MgdG8gcGF0aCBpbnNpZGUgTW9kZWxQYXRoXG4gKiAtIGdldCAtIHN5bnRoZXNpemVkXG4gKiAtIHNldCAtIHN5bnRoZXNpemVkXG4gKiAtIHNwbGljZSAtIHNwbGljZSBtb2RlbCBkYXRhIChhcyBhcnJheSBvciBwc2V1ZG8tYXJyYXkpLCBzeW50aGVzaXplZFxuICogLSBbbGVuXSgjTW9kZWxQYXRoJGxlbikgLSByZXR1cm5zIGxlbmd0aCBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KSBpbiBzYWZlIHdheSwgMCBpZiBubyBsZW5ndGggaXMgc2V0XG4gKiAtIFtwdXNoXSgjTW9kZWxQYXRoJHB1c2gpIC0gYWRkIGl0ZW1zIHRvIHRoZSBlbmQgb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkgaW4gTW9kZWxQYXRoXG4gKiAtIFtwb3BdKCNNb2RlbFBhdGgkcG9wKSAtIHJlbW92ZSBpdGVtIGZyb20gdGhlIGVuZCBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KSBpbiBNb2RlbFBhdGhcbiAqIC0gW3Vuc2hpZnRdKCNNb2RlbFBhdGgkdW5zaGlmdCkgLSBhZGQgaXRlbXMgdG8gdGhlIGJlZ2lubmluZyBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KSBpbiBNb2RlbFBhdGhcbiAqIC0gW3NoaWZ0XSgjTW9kZWxQYXRoJHNoaWZ0KSAtIHJlbW92ZSBpdGVtIGZyb20gdGhlIGJlZ2lubmluZyBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KSBpbiBNb2RlbFBhdGhcbiAqL1xuXy5leHRlbmRQcm90byhNb2RlbFBhdGgsIHtcbiAgICBwYXRoOiBNb2RlbFBhdGgkcGF0aCxcbiAgICBsZW46IE1vZGVsUGF0aCRsZW4sXG4gICAgcHVzaDogTW9kZWxQYXRoJHB1c2gsXG4gICAgcG9wOiBNb2RlbFBhdGgkcG9wLFxuICAgIHVuc2hpZnQ6IE1vZGVsUGF0aCR1bnNoaWZ0LFxuICAgIHNoaWZ0OiBNb2RlbFBhdGgkc2hpZnQsXG4gICAgX3ByZXBhcmVNZXNzZW5nZXI6IF9wcmVwYXJlTWVzc2VuZ2VyLFxuICAgIF9nZXREZWZpbml0aW9uOiBfZ2V0RGVmaW5pdGlvbixcbiAgICBkZXN0cm95OiBNb2RlbFBhdGgkZGVzdHJveVxufSk7XG5cblxuXy5leHRlbmQoTW9kZWxQYXRoLCB7XG4gICAgX2NyZWF0ZUZyb21EZWZpbml0aW9uOiBfY3JlYXRlRnJvbURlZmluaXRpb25cbn0pXG5cblxuLyoqXG4gKiBFeHBvc2UgTWVzc2VuZ2VyIG1ldGhvZHMgb24gRmFjZXQgcHJvdG90eXBlXG4gKi9cbnZhciBNRVNTRU5HRVJfUFJPUEVSVFkgPSAnX21lc3Nlbmdlcic7XG5NZXNzZW5nZXIudXNlV2l0aChNb2RlbFBhdGgsIE1FU1NFTkdFUl9QUk9QRVJUWSwgTWVzc2VuZ2VyLmRlZmF1bHRNZXRob2RzKTtcblxuXG4vKipcbiAqIE1vZGVsUGF0aCBpbnN0YW5jZSBtZXRob2RcbiAqIEdpdmVzIGFjY2VzcyB0byBwYXRoIGluc2lkZSBNb2RlbFBhdGguIE1ldGhvZCB3b3JrcyBzaW1pbGFybHkgdG8gW3BhdGggbWV0aG9kXSgjTW9kZWwkcGF0aCkgb2YgbW9kZWwsIHVzaW5nIHJlbGF0aXZlIHBhdGhzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY2Nlc3NQYXRoIHN0cmluZyB0aGF0IGRlZmluZXMgcGF0aCB0byBhY2Nlc3MgbW9kZWwuXG4gKiAgUGF0aCBzdHJpbmcgY29uc2lzdHMgb2YgcGFydHMgdG8gZGVmaW5lIGVpdGhlciBwcm9wZXJ0eSBhY2Nlc3MgKGBcIi5uYW1lXCJgIHRvIGFjY2VzcyBwcm9wZXJ0eSBuYW1lKSBvciBhcnJheSBpdGVtIGFjY2VzcyAoYFwiWzFdXCJgIHRvIGFjY2VzcyBpdGVtIHdpdGggaW5kZXggMSkuXG4gKiAgQWNjZXNzIHBhdGggY2FuIGNvbnRhaW4gYXMgbWFueSBwYXJ0cyBhcyBuZWNlc3NhcnkgKGUuZy4gYFwiLmxpc3RbMF0ubmFtZVwiYCB0byBhY2Nlc3MgcHJvcGVydHkgYG5hbWVgIGluIHRoZSBmaXJzdCBlbGVtZW50IG9mIGFycmF5IHN0b3JlZCBpbiBwcm9wZXJ0eSBgbGlzdGAuXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBvZiB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgaW50ZXJwb2xhdGVkIHBhdGhzLlxuICogIEUuZy4gYG0ucGF0aChcIlskMV0uJDJcIiwgaWQsIHByb3ApYCByZXR1cm5zIE1vZGVsUGF0aCB0byBhY2Nlc3MgcHJvcGVydHkgd2l0aCBuYW1lIGBwcm9wYCBpbiBhcnJheSBpdGVtIHdpdGggaW5kZXggYGlkYC4gQWx0aG91Z2ggdGhpcyBNb2RlbFBhdGggb2JqZWN0IHdpbGwgd29yayBleGFjdGx5IGFzIGBtKFwiW1wiICsgaWQgKyBcIl0uXCIgKyBwcm9wKWAsIHRoZSBpbnRlcnBvbGF0ZWQgaXMgbXVjaCBtb3JlIGVmZmljaWVudCBhcyBNb2RlbFBhdGggd2l0aCBpbnRlcnBvbGF0aW9uIHdpbGwgbm90IHN5bnRoZXNpemUgbmV3IGdldHRlcnMgYW5kIHNldHRlcnMsIHdoaWxlIE1vZGVsUGF0aCB3aXRoIGNvbXB1dGVkIGFjY2VzcyBwYXRoIHdpbGwgc3ludGhlc2l6ZSBuZXcgZ2V0dGVycyBhbmQgc2V0dGVycyBmb3IgZWFjaCBwYWlyIG9mIHZhbHVlcyBvZiBgaWRgIGFuZCBgcHJvcGAuXG4gKiBAcmV0dXJuIHtNb2RlbFBhdGh9XG4gKi9cbmZ1bmN0aW9uIE1vZGVsUGF0aCRwYXRoKGFjY2Vzc1BhdGgpIHsgIC8vICwgLi4uIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgaW50ZXJwb2xhdGVkXG4gICAgaWYgKCEgYWNjZXNzUGF0aCkgcmV0dXJuIHRoaXM7XG5cbiAgICB2YXIgdGhpc1BhdGhBcmdzQ291bnQgPSB0aGlzLl9hcmdzLmxlbmd0aCAtIDE7XG5cbiAgICBpZiAodGhpc1BhdGhBcmdzQ291bnQgPiAwKSB7Ly8gdGhpcyBwYXRoIGhhcyBpbnRlcnBvbGF0ZWQgYXJndW1lbnRzIHRvb1xuICAgICAgICBhY2Nlc3NQYXRoID0gYWNjZXNzUGF0aC5yZXBsYWNlKC9cXCRbMS05XVswLTldKi9nLCBmdW5jdGlvbihzdHIpIHtcbiAgICAgICAgICAgIHJldHVybiAnJCcgKyAoK3N0ci5zbGljZSgxKSArIHRoaXNQYXRoQXJnc0NvdW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFyIG5ld1BhdGggPSB0aGlzLl9wYXRoICsgYWNjZXNzUGF0aDtcblxuICAgIC8vIHRoaXMuX21vZGVsIGlzIGFkZGVkIGluIGZyb250IG9mIGFsbCBhcmd1bWVudHMgYXMgdGhlIGZpcnN0IHBhcmFtZXRlclxuICAgIC8vIG9mIE1vZGVsUGF0aCBjb25zdHJ1Y3RvclxuICAgIHZhciBhcmdzID0gW3RoaXMuX21vZGVsLCBuZXdQYXRoXVxuICAgICAgICAgICAgICAgIC5jb25jYXQodGhpcy5fYXJncy5zbGljZSgxKSkgLy8gcmVtb3ZlIG9sZCBwYXRoIGZyb20gX2FyZ3MsIGFzIGl0IGlzIDEgYmFzZWRcbiAgICAgICAgICAgICAgICAuY29uY2F0KF8uc2xpY2UoYXJndW1lbnRzLCAxKSk7IC8vIGFkZCBuZXcgaW50ZXJwb2xhdGlvbiBhcmd1bWVudHNcblxuICAgIC8vIGNhbGxpbmcgTW9kZWxQYXRoIGNvbnN0cnVjdG9yIHdpdGggbmV3IGFuZCB0aGUgbGlzdCBvZiBhcmd1bWVudHM6IHRoaXMgKG1vZGVsKSwgYWNjZXNzUGF0aCwgLi4uXG4gICAgcmV0dXJuIF8ubmV3QXBwbHkoTW9kZWxQYXRoLCBhcmdzKTtcbn1cblxuXG4vKipcbiAqIE1vZGVsUGF0aCBhbmQgTW9kZWwgaW5zdGFuY2UgbWV0aG9kXG4gKiBSZXR1cm5zIGxlbmd0aCBwcm9wZXJ0eSBhbmQgc2V0cyBpdCB0byAwIGlmIGl0IHdhc24ndCBzZXQuXG4gKlxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiBNb2RlbFBhdGgkbGVuKCkge1xuICAgIHJldHVybiB0aGlzLnBhdGgoJy5sZW5ndGgnKS5nZXQoKSB8fCAwO1xufVxuXG5cbi8qKlxuICogTW9kZWxQYXRoIGFuZCBNb2RlbCBpbnN0YW5jZSBtZXRob2RcbiAqIEFkZHMgaXRlbXMgdG8gdGhlIGVuZCBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KS4gUmV0dXJucyBuZXcgbGVuZ3RoLlxuICpcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIGxpc3Qgb2YgaXRlbXMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIGFycmF5IChwc2V1ZG8gYXJyYXkpXG4gKiBAcmV0dXJuIHtJbnRlZ2VyfVxuICovXG5mdW5jdGlvbiBNb2RlbFBhdGgkcHVzaCgpIHsgLy8gYXJndW1lbnRzXG4gICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuKCk7XG4gICAgdmFyIG5ld0xlbmd0aCA9IGxlbmd0aCArIGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICBfLnNwbGljZShhcmd1bWVudHMsIDAsIDAsIGxlbmd0aCwgMCk7XG4gICAgdGhpcy5zcGxpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIHJldHVybiBuZXdMZW5ndGg7XG59XG5cblxuLyoqXG4gKiBNb2RlbFBhdGggYW5kIE1vZGVsIGluc3RhbmNlIG1ldGhvZFxuICogUmVtb3ZlcyBpdGVtIGZyb20gdGhlIGVuZCBvZiBhcnJheSAob3IgcHNldWRvLWFycmF5KS4gUmV0dXJucyB0aGlzIGl0ZW0uXG4gKlxuICogQHJldHVybiB7QW55fVxuICovXG5mdW5jdGlvbiBNb2RlbFBhdGgkcG9wKCkge1xuICAgIHJldHVybiB0aGlzLnNwbGljZSh0aGlzLmxlbigpIC0gMSwgMSlbMF07XG59XG5cblxuLyoqXG4gKiBNb2RlbFBhdGggYW5kIE1vZGVsIGluc3RhbmNlIG1ldGhvZFxuICogSW5zZXJ0cyBpdGVtcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS4gUmV0dXJucyBuZXcgbGVuZ3RoLlxuICpcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIGl0ZW1zIHRvIGJlIGluc2VydGVkIGluIHRoZSBiZWdpbm5pbmcgb2YgYXJyYXlcbiAqIEByZXR1cm4ge0ludGVnZXJ9XG4gKi9cbmZ1bmN0aW9uIE1vZGVsUGF0aCR1bnNoaWZ0KCkgeyAvLyBhcmd1bWVudHNcbiAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW4oKTtcbiAgICBsZW5ndGggKz0gYXJndW1lbnRzLmxlbmd0aDtcblxuICAgIF8uc3BsaWNlKGFyZ3VtZW50cywgMCwgMCwgMCwgMCk7XG4gICAgdGhpcy5zcGxpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIHJldHVybiBsZW5ndGg7XG59XG5cblxuLyoqXG4gKiBNb2RlbFBhdGggYW5kIE1vZGVsIGluc3RhbmNlIG1ldGhvZFxuICogUmVtb3ZlcyB0aGUgaXRlbSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgYXJyYXkgKG9yIHBzZXVkby1hcnJheSkuIFJldHVybnMgdGhpcyBpdGVtLlxuICpcbiAqIEByZXR1cm4ge0FueX1cbiAqL1xuZnVuY3Rpb24gTW9kZWxQYXRoJHNoaWZ0KCkgeyAvLyBhcmd1bWVudHNcbiAgICByZXR1cm4gdGhpcy5zcGxpY2UoMCwgMSlbMF07XG59XG5cblxuLyoqXG4gKiBNb2RlbFBhdGggaW5zdGFuY2UgbWV0aG9kXG4gKiBJbml0aWFsaXplcyBNb2RlbFBhdGggbWVzZW5nZXIgd2l0aCBNb2RlbCdzIG1lc3NlbmdlciBhcyBpdHMgc291cmNlIChbTWVzc2VuZ2VyTWVzc2FnZVNvdXJjZV0oLi4vbWVzc2VuZ2VyL21zbmdyX3NvdXJjZS5qcy5odG1sKSkgYW5kIFtNb2RlbFBhdGhNc2dBUEldKC4vcGF0aF9tc2dfYXBpLmpzLmh0bWwpIGFzIFtNZXNzZW5nZXJBUEldKC4uL21lc3Nlbmdlci9tX2FwaS5qcy5odG1sKVxuICovXG5mdW5jdGlvbiBfcHJlcGFyZU1lc3NlbmdlcigpIHtcbiAgICB2YXIgbVBhdGhBUEkgPSBuZXcgTW9kZWxQYXRoTXNnQVBJKHRoaXMuX2FjY2Vzc1BhdGgpO1xuXG4gICAgLy8gY3JlYXRlIE1lc3Nlbmdlck1lc3NhZ2VTb3VyY2UgY29ubmVjdGVkIHRvIE1vZGVsJ3MgbWVzc2VuZ2VyXG4gICAgdmFyIG1vZGVsTWVzc2FnZVNvdXJjZSA9IG5ldyBNZXNzZW5nZXJNZXNzYWdlU291cmNlKHRoaXMsIHVuZGVmaW5lZCwgbVBhdGhBUEksIHRoaXMuX21vZGVsKTtcblxuICAgIC8vIGNyZWF0ZSBtZXNzZW5nZXIgd2l0aCBtb2RlbCBwYXNzZWQgYXMgaG9zdE9iamVjdCAoZGVmYXVsdCBtZXNzYWdlIGRpc3BhdGNoIGNvbnRleHQpXG4gICAgLy8gYW5kIHdpdGhvdXQgcHJveHlpbmcgbWV0aG9kcyAod2UgZG9uJ3Qgd2FudCB0byBwcm94eSB0aGVtIHRvIE1vZGVsKVxuICAgIHZhciBtUGF0aE1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIodGhpcywgdW5kZWZpbmVkLCBtb2RlbE1lc3NhZ2VTb3VyY2UpO1xuXG4gICAgLy8gc3RvcmUgbWVzc2VuZ2VyIG9uIE1vZGVsUGF0aCBpbnN0YW5jZVxuICAgIF8uZGVmaW5lUHJvcGVydHkodGhpcywgTUVTU0VOR0VSX1BST1BFUlRZLCBtUGF0aE1lc3Nlbmdlcik7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvYmplY3QgYWxsb3dpbmcgdG8gcmVjcmVhdGUgbW9kZWwgcGF0aFxuICpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gX2dldERlZmluaXRpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbW9kZWw6IHRoaXMuX21vZGVsLFxuICAgICAgICBwYXRoOiB0aGlzLl9wYXRoLFxuICAgICAgICBhcmdzOiB0aGlzLl9hcmdzXG4gICAgfTtcbn1cblxuXG4vKipcbiAqIENsYXNzIG1ldGhvZFxuICogQ3JlYXRlcyBtb2RlbFBhdGggb2JqZWN0IGZyb20gZGVmaW5pdGlvbiBjcmVhdGVkIGJ5IF9nZXREZWZpbml0aW9uXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBkZWZpbml0aW9uXG4gKiBAcmV0dXJuIHtNb2RlbFBhdGh9XG4gKi9cbmZ1bmN0aW9uIF9jcmVhdGVGcm9tRGVmaW5pdGlvbihkZWZpbml0aW9uKSB7XG4gICAgY2hlY2soZGVmaW5pdGlvbiwge1xuICAgICAgICBtb2RlbDogRnVuY3Rpb24sIC8vIE1vZGVsXG4gICAgICAgIHBhdGg6IFN0cmluZyxcbiAgICAgICAgYXJnczogQXJyYXlcbiAgICB9KTtcblxuICAgIHZhciBtID0gZGVmaW5pdGlvbi5tb2RlbDtcblxuICAgIHJldHVybiBtLmFwcGx5KG0sIGRlZmluaXRpb24uYXJncyk7XG59XG5cblxuZnVuY3Rpb24gTW9kZWxQYXRoJGRlc3Ryb3koKSB7XG4gICAgdGhpc1tNRVNTRU5HRVJfUFJPUEVSVFldLmRlc3Ryb3koKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgbW9kZWxVdGlscyA9IHtcbiAgICBub3JtYWxpemVTcGxpY2VJbmRleDogbm9ybWFsaXplU3BsaWNlSW5kZXhcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gbW9kZWxVdGlscztcblxuXG5mdW5jdGlvbiBub3JtYWxpemVTcGxpY2VJbmRleChzcGxpY2VJbmRleCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIHNwbGljZUluZGV4ID4gbGVuZ3RoXG4gICAgICAgICAgICA/IGxlbmd0aFxuICAgICAgICAgICAgOiBzcGxpY2VJbmRleCA+PSAwXG4gICAgICAgICAgICAgICAgPyBzcGxpY2VJbmRleFxuICAgICAgICAgICAgICAgIDogc3BsaWNlSW5kZXggKyBsZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgID8gc3BsaWNlSW5kZXggKyBsZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgOiAwO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgTWVzc2VuZ2VyQVBJID0gcmVxdWlyZSgnLi4vbWVzc2VuZ2VyL21fYXBpJylcbiAgICAsIHBhdGhVdGlscyA9IHJlcXVpcmUoJy4vcGF0aF91dGlscycpXG4gICAgLCBsb2dnZXIgPSByZXF1aXJlKCcuLi91dGlsL2xvZ2dlcicpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJyk7XG5cblxuLyoqXG4gKiBTdWJjbGFzcyBvZiBNZXNzZW5nZXJBUEkgdGhhdCBpcyB1c2VkIHRvIHRyYW5zbGF0ZSBtZXNzYWdlcyBvZiBNZXNzZW5nZXIgb24gTW9kZWxQYXRoIHRvIE1lc3NlbmdlciBvbiBNb2RlbC5cbiAqL1xudmFyIE1vZGVsUGF0aE1zZ0FQSSA9IF8uY3JlYXRlU3ViY2xhc3MoTWVzc2VuZ2VyQVBJLCAnTW9kZWxQYXRoTXNnQVBJJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gTW9kZWxQYXRoTXNnQVBJO1xuXG5cbi8qKlxuICogIyMjI01vZGVsUGF0aE1zZ0FQSSBpbnN0YW5jZSBtZXRob2RzIyMjI1xuICpcbiAqIC0gW2luaXRdKCNpbml0KSAtIGluaXRpYWxpemVzIE1vZGVsUGF0aE1zZ0FQSVxuICogLSBbdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlXSgjdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKSAtIHRyYW5zbGF0ZXMgcmVsYXRpdmUgYWNjZXNzIHBhdGhzIG9mIE1vZGVsUGF0aCB0byBmdWxsIHBhdGggb2YgTW9kZWxcbiAqIC0gW2NyZWF0ZUludGVybmFsRGF0YV0oI2NyZWF0ZUludGVybmFsRGF0YSkgLSBjaGFuZ2VzIHBhdGggaW4gbWVzc2FnZSBvbiBtb2RlbCB0byByZWxhdGl2ZSBwYXRoIGFuZCBhZGRzIGBmdWxsUGF0aGAgcHJvcGVydHkgdG8gbWVzc2FnZSBkYXRhXG4gKi9cbl8uZXh0ZW5kUHJvdG8oTW9kZWxQYXRoTXNnQVBJLCB7XG4gICAgaW5pdDogaW5pdCxcbiAgICB0cmFuc2xhdGVUb1NvdXJjZU1lc3NhZ2U6IHRyYW5zbGF0ZVRvU291cmNlTWVzc2FnZSxcbiAgICBjcmVhdGVJbnRlcm5hbERhdGE6IGNyZWF0ZUludGVybmFsRGF0YSxcbn0pO1xuXG5cbi8qKlxuICogTW9kZWxQYXRoTXNnQVBJIGluc3RhbmNlIG1ldGhvZFxuICogQ2FsbGVkIGJ5IE1lc3NlbmdlckFQSSBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcm9vdFBhdGggcm9vdCBwYXRoIG9mIG1vZGVsIHBhdGhcbiAqL1xuZnVuY3Rpb24gaW5pdChyb290UGF0aCkge1xuICAgIE1lc3NlbmdlckFQSS5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMucm9vdFBhdGggPSByb290UGF0aDtcbn1cblxuLyoqXG4gKiBNb2RlbFBhdGhNc2dBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBUcmFuc2xhdGVzIHJlbGF0aXZlIGFjY2VzcyBwYXRocyBvZiBNb2RlbFBhdGggdG8gZnVsbCBwYXRoIG9mIE1vZGVsLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY2Nlc3NQYXRoIHJlbGF0aXZlIGFjY2VzcyBwYXRoIHRvIGJlIHRyYW5zbGF0ZWRcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gdHJhbnNsYXRlVG9Tb3VyY2VNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICAvLyBUT0RPIHNob3VsZCBwcmVwZW5kIFJlZ0V4ZXNcbiAgICAvLyBUT0RPIHNob3VsZCBub3QgcHJlcGVuZCBjaGFuZ2VkYXRhIHRvbz8/P1xuICAgIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgUmVnRXhwKVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICBpZiAobWVzc2FnZSA9PSAnZGF0YWNoYW5nZXMnKVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICBcbiAgICByZXR1cm4gdGhpcy5yb290UGF0aCArIG1lc3NhZ2U7XG59XG5cblxuLyoqXG4gKiBNb2RlbFBhdGhNc2dBUEkgaW5zdGFuY2UgbWV0aG9kXG4gKiBDaGFuZ2VzIHBhdGggaW4gbWVzc2FnZSBvbiBtb2RlbCB0byByZWxhdGl2ZSBwYXRoIGFuZCBhZGRzIGBmdWxsUGF0aGAgcHJvcGVydHkgdG8gbWVzc2FnZSBkYXRhLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzb3VyY2VNZXNzYWdlIGZ1bGwgYWNjZXNzIHBhdGggb24gTW9kZWxcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIHJlbGF0aXZlIGFjY2VzcyBwYXRoIG9uIE1vZGVsUGF0aFxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZURhdGEgZGF0YSByZWNlaXZlZCBmcm9tIE1vZGVsLCB3aWxsIGJlIHRyYW5zbGF0ZWQgYXMgZGVzY3JpYmVkIHRvIGJlIGRpc3BhdGNoZWQgdG8gTW9kZWxQYXRoXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUludGVybmFsRGF0YShzb3VyY2VNZXNzYWdlLCBtZXNzYWdlLCBzb3VyY2VEYXRhKSB7XG4gICAgLy8gVE9ETyByZXR1cm4gb24gY2hhbmdlZGF0YSB0b28/Pz9cbiAgICBpZiAobWVzc2FnZSA9PSAnZGF0YWNoYW5nZXMnKSB7XG4gICAgICAgIHZhciBpbnRlcm5hbENoYW5nZXMgPSBzb3VyY2VEYXRhLmNoYW5nZXNcbiAgICAgICAgICAgIC5tYXAodHJ1bmNhdGVDaGFuZ2VQYXRoLCB0aGlzKVxuICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbihjaGFuZ2UpIHsgcmV0dXJuIGNoYW5nZTsgfSk7XG4gICAgICAgIHZhciBpbnRlcm5hbERhdGEgPSB7XG4gICAgICAgICAgICBjaGFuZ2VzOiBpbnRlcm5hbENoYW5nZXMsXG4gICAgICAgICAgICB0cmFuc2FjdGlvbjogc291cmNlRGF0YS50cmFuc2FjdGlvblxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBpbnRlcm5hbERhdGFcbiAgICB9XG5cbiAgICB2YXIgaW50ZXJuYWxEYXRhID0gdHJ1bmNhdGVDaGFuZ2VQYXRoLmNhbGwodGhpcywgc291cmNlRGF0YSk7XG4gICAgcmV0dXJuIGludGVybmFsRGF0YTtcbn1cblxuXG5mdW5jdGlvbiB0cnVuY2F0ZUNoYW5nZVBhdGgoY2hhbmdlKSB7XG4gICAgdmFyIGZ1bGxQYXRoID0gY2hhbmdlLnBhdGhcbiAgICAgICAgLCBwYXRoID0gXy51blByZWZpeChmdWxsUGF0aCwgdGhpcy5yb290UGF0aCk7XG5cbiAgICBpZiAodHlwZW9mIHBhdGggPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIGNoYW5nZSA9IF8uY2xvbmUoY2hhbmdlKTtcbiAgICAgICAgY2hhbmdlLmZ1bGxQYXRoID0gZnVsbFBhdGg7XG4gICAgICAgIGNoYW5nZS5wYXRoID0gcGF0aDtcbiAgICAgICAgcmV0dXJuIGNoYW5nZTtcbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIDxhIG5hbWU9XCJtb2RlbC1wYXRoXCI+PC9hPlxuLy8gIyMjIG1vZGVsIHBhdGggdXRpbHNcblxudmFyIGNoZWNrID0gcmVxdWlyZSgnLi4vdXRpbC9jaGVjaycpXG4gICAgLCBNYXRjaCA9IGNoZWNrLk1hdGNoXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJyk7XG5cbnZhciBwYXRoVXRpbHMgPSB7XG4gICAgcGFyc2VBY2Nlc3NQYXRoOiBwYXJzZUFjY2Vzc1BhdGgsXG4gICAgY3JlYXRlUmVnZXhQYXRoOiBjcmVhdGVSZWdleFBhdGgsXG4gICAgZ2V0UGF0aE5vZGVLZXk6IGdldFBhdGhOb2RlS2V5LFxuICAgIHdyYXBNZXNzZW5nZXJNZXRob2RzOiB3cmFwTWVzc2VuZ2VyTWV0aG9kc1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXRoVXRpbHM7XG5cblxudmFyIHByb3BlcnR5UGF0aFN5bnRheCA9ICdcXFxcLltBLVphLXpfLV1bQS1aYS16MC05Xy1dKidcbiAgICAsIGFycmF5UGF0aFN5bnRheCA9ICdcXFxcW1swLTldK1xcXFxdJ1xuICAgICwgaW50ZXJwb2xhdGlvblN5bnRheCA9ICdcXFxcJFsxLTldWzAtOV0qJ1xuICAgICwgcHJvcGVydHlJbnRlcnBvbGF0ZVN5bnRheCA9ICdcXFxcLicgKyBpbnRlcnBvbGF0aW9uU3ludGF4XG4gICAgLCBhcnJheUludGVycG9sYXRlU3ludGF4ID0gJ1xcXFxbJyArIGludGVycG9sYXRpb25TeW50YXggKyAnXFxcXF0nXG5cbiAgICAsIHByb3BlcnR5U3RhclN5bnRheCA9ICdcXFxcLlxcXFwqJ1xuICAgICwgYXJyYXlTdGFyU3ludGF4ID0gJ1xcXFxbXFxcXCpcXFxcXSdcbiAgICAsIHN0YXJTeW50YXggPSAnXFxcXConXG5cbiAgICAsIHBhdGhQYXJzZVN5bnRheCA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVBhdGhTeW50YXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlQYXRoU3ludGF4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5SW50ZXJwb2xhdGVTeW50YXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlJbnRlcnBvbGF0ZVN5bnRheFxuICAgICAgICAgICAgICAgICAgICAgICAgXS5qb2luKCd8JylcbiAgICAsIHBhdGhQYXJzZVBhdHRlcm4gPSBuZXcgUmVnRXhwKHBhdGhQYXJzZVN5bnRheCwgJ2cnKVxuXG4gICAgLCBwYXR0ZXJuUGF0aFBhcnNlU3ludGF4ID0gIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhQYXJzZVN5bnRheCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5U3RhclN5bnRheCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5U3RhclN5bnRheCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJTeW50YXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5qb2luKCd8JylcbiAgICAsIHBhdHRlcm5QYXRoUGFyc2VQYXR0ZXJuID0gbmV3IFJlZ0V4cChwYXR0ZXJuUGF0aFBhcnNlU3ludGF4LCAnZycpXG5cbiAgICAvLywgdGFyZ2V0UGF0aFBhcnNlUGF0dGVybiA9IC9cXC5bQS1aYS16XVtBLVphLXowLTlfXSp8XFxbWzAtOV0rXFxdfFxcLlxcJFsxLTldWzAtOV0qfFxcW1xcJFsxLTldWzAtOV0qXFxdfFxcJFsxLTldWzAtOV0vZ1xuICAgICwgcGF0aE5vZGVUeXBlcyA9IHtcbiAgICAgICAgJy4nOiB7IHN5bnRheDogJ29iamVjdCcsIGVtcHR5OiAne30nIH0sXG4gICAgICAgICdbJzogeyBzeW50YXg6ICdhcnJheScsIGVtcHR5OiAnW10nfSxcbiAgICAgICAgJyonOiB7IHN5bnRheDogJ21hdGNoJywgZW1wdHk6ICd7fSd9LFxuICAgIH07XG5cbmZ1bmN0aW9uIHBhcnNlQWNjZXNzUGF0aChwYXRoLCBub2RlUGFyc2VQYXR0ZXJuKSB7XG4gICAgbm9kZVBhcnNlUGF0dGVybiA9IG5vZGVQYXJzZVBhdHRlcm4gfHwgcGF0aFBhcnNlUGF0dGVybjtcblxuICAgIHZhciBwYXJzZWRQYXRoID0gW107XG5cbiAgICBpZiAoISBwYXRoKVxuICAgICAgICByZXR1cm4gcGFyc2VkUGF0aDtcblxuICAgIHZhciB1bnBhcnNlZCA9IHBhdGgucmVwbGFjZShub2RlUGFyc2VQYXR0ZXJuLCBmdW5jdGlvbihub2RlU3RyKSB7XG4gICAgICAgIHZhciBwYXRoTm9kZSA9IHsgcHJvcGVydHk6IG5vZGVTdHIgfTtcbiAgICAgICAgXy5leHRlbmQocGF0aE5vZGUsIHBhdGhOb2RlVHlwZXNbbm9kZVN0clswXV0pO1xuICAgICAgICBpZiAobm9kZVN0clsxXSA9PSAnJCcpXG4gICAgICAgICAgICBwYXRoTm9kZS5pbnRlcnBvbGF0ZSA9IGdldFBhdGhOb2RlS2V5KHBhdGhOb2RlLCB0cnVlKTtcblxuICAgICAgICBwYXJzZWRQYXRoLnB1c2gocGF0aE5vZGUpO1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfSk7XG4gICAgaWYgKHVucGFyc2VkKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2luY29ycmVjdCBtb2RlbCBwYXRoOiAnICsgcGF0aCk7XG5cbiAgICByZXR1cm4gcGFyc2VkUGF0aDtcbn1cblxuXG52YXIgbm9kZVJlZ2V4ID0ge1xuICAgICcuKic6IHByb3BlcnR5UGF0aFN5bnRheCxcbiAgICAnWypdJzogYXJyYXlQYXRoU3ludGF4XG59O1xubm9kZVJlZ2V4WycqJ10gPSBub2RlUmVnZXhbJy4qJ10gKyAnfCcgKyBub2RlUmVnZXhbJ1sqXSddO1xuXG5mdW5jdGlvbiBjcmVhdGVSZWdleFBhdGgocGF0aCkge1xuICAgIGNoZWNrKHBhdGgsIE1hdGNoLk9uZU9mKFN0cmluZywgUmVnRXhwKSk7XG5cbiAgICBpZiAocGF0aCBpbnN0YW5jZW9mIFJlZ0V4cCB8fCBwYXRoLmluZGV4T2YoJyonKSA9PSAtMSlcbiAgICAgICAgcmV0dXJuIHBhdGg7XG5cbiAgICB2YXIgcGFyc2VkUGF0aCA9IHBhdGhVdGlscy5wYXJzZUFjY2Vzc1BhdGgocGF0aCwgcGF0dGVyblBhdGhQYXJzZVBhdHRlcm4pXG4gICAgICAgICwgcmVnZXhTdHIgPSAnXidcbiAgICAgICAgLy8gLCByZWdleFN0ckVuZCA9ICcnXG4gICAgICAgICwgcGF0dGVybnNTdGFydGVkID0gZmFsc2U7XG5cbiAgICBwYXJzZWRQYXRoLmZvckVhY2goZnVuY3Rpb24ocGF0aE5vZGUpIHtcbiAgICAgICAgdmFyIHByb3AgPSBwYXRoTm9kZS5wcm9wZXJ0eVxuICAgICAgICAgICAgLCByZWdleCA9IG5vZGVSZWdleFtwcm9wXTtcbiAgICAgICAgXG4gICAgICAgIGlmIChyZWdleCkge1xuICAgICAgICAgICAgLy8gcmVnZXhTdHIgKz0gJygnICsgcmVnZXg7XG4gICAgICAgICAgICAvLyByZWdleFN0ckVuZCArPSAnfCknO1xuICAgICAgICAgICAgcmVnZXhTdHIgKz0gJygnICsgcmVnZXggKyAnfCknO1xuICAgICAgICAgICAgLy8gcmVnZXhTdHJFbmQgKz0gJ3wpJztcbiAgICAgICAgICAgIHBhdHRlcm5zU3RhcnRlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpZiAocGF0dGVybnNTdGFydGVkKVxuICAgICAgICAgICAgLy8gIHRocm93IG5ldyBFcnJvcignXCIqXCIgcGF0aCBzZWdtZW50IGNhbm5vdCBiZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBwYXRoOiAnICsgcGF0aCk7XG4gICAgICAgICAgICByZWdleFN0ciArPSBwcm9wLnJlcGxhY2UoLyhcXC58XFxbfFxcXSkvZywgJ1xcXFwkMScpOyAvLyBhZGQgc2xhc2ggaW4gZnJvbnQgb2Ygc3ltYm9scyB0aGF0IGhhdmUgc3BlY2lhbCBtZWFuaW5nIGluIHJlZ2V4XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlZ2V4U3RyICs9IC8qIHJlZ2V4U3RyRW5kICsgKi8gJyQnO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAocmVnZXhTdHIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5cXCd0IGNvbnN0cnVjdCByZWdleCBmb3IgcGF0aCBwYXR0ZXJuOiAnICsgcGF0aCk7XG4gICAgfVxufVxuXG5cbmZ1bmN0aW9uIGdldFBhdGhOb2RlS2V5KHBhdGhOb2RlLCBpbnRlcnBvbGF0ZWQpIHtcbiAgICB2YXIgcHJvcCA9IHBhdGhOb2RlLnByb3BlcnR5XG4gICAgICAgICwgc3RhcnRJbmRleCA9IGludGVycG9sYXRlZCA/IDIgOiAxO1xuICAgIHJldHVybiBwYXRoTm9kZS5zeW50YXggPT0gJ2FycmF5J1xuICAgICAgICA/IHByb3Auc2xpY2Uoc3RhcnRJbmRleCwgcHJvcC5sZW5ndGggLSAxKVxuICAgICAgICA6IHByb3Auc2xpY2Uoc3RhcnRJbmRleCk7XG59XG5cblxuLy8gVE9ETyBhbGxvdyBmb3IgbXVsdGlwbGUgbWVzc2FnZXMgaW4gYSBzdHJpbmdcbmZ1bmN0aW9uIHdyYXBNZXNzZW5nZXJNZXRob2RzKG1ldGhvZHNOYW1lcykge1xuICAgIG1ldGhvZHNOYW1lcyA9IG1ldGhvZHNOYW1lcyB8fCBbJ29uJywgJ29mZiddO1xuICAgIHZhciB3cmFwcGVkTWV0aG9kcyA9IF8ubWFwVG9PYmplY3QobWV0aG9kc05hbWVzLCBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgICAgIHZhciBvcmlnTWV0aG9kID0gdGhpc1ttZXRob2ROYW1lXTtcbiAgICAgICAgLy8gcmVwbGFjaW5nIG1lc3NhZ2Ugc3Vic3JpYmUvdW5zdWJzY3JpYmUvZXRjLiB0byBjb252ZXJ0IFwiKlwiIG1lc3NhZ2UgcGF0dGVybnMgdG8gcmVnZXhwc1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24ocGF0aCwgc3Vic2NyaWJlcikge1xuICAgICAgICAgICAgdmFyIHJlZ2V4UGF0aCA9IGNyZWF0ZVJlZ2V4UGF0aChwYXRoKTtcbiAgICAgICAgICAgIG9yaWdNZXRob2QuY2FsbCh0aGlzLCByZWdleFBhdGgsIHN1YnNjcmliZXIpO1xuICAgICAgICB9O1xuICAgIH0sIHRoaXMpO1xuICAgIF8uZGVmaW5lUHJvcGVydGllcyh0aGlzLCB3cmFwcGVkTWV0aG9kcyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBwYXRoVXRpbHMgPSByZXF1aXJlKCcuLi9wYXRoX3V0aWxzJylcbiAgICAsIG1vZGVsVXRpbHMgPSByZXF1aXJlKCcuLi9tb2RlbF91dGlscycpXG4gICAgLCBsb2dnZXIgPSByZXF1aXJlKCcuLi8uLi91dGlsL2xvZ2dlcicpXG4gICAgLCBmcyA9IHJlcXVpcmUoJ2ZzJylcbiAgICAsIGRvVCA9IHJlcXVpcmUoJ2RvdCcpXG4gICAgLCBfID0gcmVxdWlyZSgnbW9sLXByb3RvJylcbiAgICAsIGNoYW5nZURhdGFIYW5kbGVyID0gcmVxdWlyZSgnLi4vY2hhbmdlX2RhdGEnKVxuICAgICwgZ2V0VHJhbnNhY3Rpb25GbGFnID0gY2hhbmdlRGF0YUhhbmRsZXIuZ2V0VHJhbnNhY3Rpb25GbGFnXG4gICAgLCBwb3N0VHJhbnNhY3Rpb25GaW5pc2hlZCA9IGNoYW5nZURhdGFIYW5kbGVyLnBvc3RUcmFuc2FjdGlvbkZpbmlzaGVkO1xuXG5cbi8qKlxuICogVGVtcGxhdGVzIHRvIHN5bnRoZXNpemUgbW9kZWwgZ2V0dGVycyBhbmQgc2V0dGVyc1xuICovXG52YXIgdGVtcGxhdGVzID0ge1xuICAgIGdldDogXCIndXNlIHN0cmljdCc7XFxuLyogT25seSB1c2UgdGhpcyBzdHlsZSBvZiBjb21tZW50cywgbm90IFxcXCIvL1xcXCIgKi9cXG5cXG5tZXRob2QgPSBmdW5jdGlvbiBnZXQoKSB7XFxuICAgIHZhciBtID0ge3sjIGRlZi5tb2RlbEFjY2Vzc1ByZWZpeCB9fTtcXG4gICAgcmV0dXJuIG0ge3t+IGl0LnBhcnNlZFBhdGggOnBhdGhOb2RlIH19XFxuICAgICAgICB7ez8gcGF0aE5vZGUuaW50ZXJwb2xhdGV9fVxcbiAgICAgICAgICAgICYmIChtID0gbVt0aGlzLl9hcmdzWyB7ez0gcGF0aE5vZGUuaW50ZXJwb2xhdGUgfX0gXV0pXFxuICAgICAgICB7ez8/fX1cXG4gICAgICAgICAgICAmJiAobSA9IG17ez0gcGF0aE5vZGUucHJvcGVydHkgfX0pXFxuICAgICAgICB7ez99fSB7e359fTtcXG59O1xcblwiLFxuICAgIHNldDogXCIndXNlIHN0cmljdCc7XFxuLyogT25seSB1c2UgdGhpcyBzdHlsZSBvZiBjb21tZW50cywgbm90IFxcXCIvL1xcXCIgKi9cXG5cXG57eyMgZGVmLmluY2x1ZGVfZGVmaW5lcyB9fVxcbnt7IyBkZWYuaW5jbHVkZV9jcmVhdGVfdHJlZSB9fVxcblxcblxcbi8qKlxcbiAqIFRlbXBsYXRlIHRoYXQgc3ludGhlc2l6ZXMgc2V0dGVyIGZvciBNb2RlbCBhbmQgZm9yIE1vZGVsUGF0aFxcbiAqL1xcbm1ldGhvZCA9IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xcbiAgICB7eyMgZGVmLmluaXRWYXJzOidzZXQnIH19XFxuXFxuICAgIHt7IyBkZWYuY3JlYXRlVHJlZTonc2V0JyB9fVxcblxcbiAgICB7e1xcbiAgICAgICAgY3Vyck5vZGUgPSBuZXh0Tm9kZTtcXG4gICAgICAgIGN1cnJQcm9wID0gY3Vyck5vZGUgJiYgY3Vyck5vZGUucHJvcGVydHk7XFxuICAgIH19XFxuXFxuICAgIHt7IC8qIGFzc2lnbiB2YWx1ZSB0byB0aGUgbGFzdCBwcm9wZXJ0eSAqLyB9fVxcbiAgICB7ez8gY3VyclByb3AgfX1cXG4gICAgICAgIHdhc0RlZiA9IHt7IyBkZWYud2FzRGVmaW5lZH19O1xcbiAgICAgICAge3sjIGRlZi5jaGFuZ2VBY2Nlc3NQYXRoIH19XFxuXFxuICAgICAgICB2YXIgb2xkID0gbXt7IyBkZWYuY3VyclByb3AgfX07XFxuXFxuICAgICAgICB7eyAvKiBjbG9uZSB2YWx1ZSB0byBwcmV2ZW50IHNhbWUgcmVmZXJlbmNlIGluIGxpbmtlZCBtb2RlbHMgKi8gfX1cXG4gICAgICAgIG17eyMgZGVmLmN1cnJQcm9wIH19ID0gY2xvbmVUcmVlKHZhbHVlKTtcXG4gICAge3s/fX1cXG5cXG4gICAge3sgLyogYWRkIG1lc3NhZ2UgcmVsYXRlZCB0byB0aGUgbGFzdCBwcm9wZXJ0eSBjaGFuZ2UgKi8gfX1cXG4gICAgaWYgKHRoaXMuX29wdGlvbnMucmVhY3RpdmUgIT09IGZhbHNlKSB7XFxuICAgICAgICBpZiAoISB3YXNEZWYpXFxuICAgICAgICAgICAge3sjIGRlZi5hZGRNc2cgfX0gYWNjZXNzUGF0aCwgdHlwZTogJ2FkZGVkJyxcXG4gICAgICAgICAgICAgICAgbmV3VmFsdWU6IHZhbHVlIH0pO1xcbiAgICAgICAgZWxzZSBpZiAob2xkICE9IHZhbHVlKVxcbiAgICAgICAgICAgIHt7IyBkZWYuYWRkTXNnIH19IGFjY2Vzc1BhdGgsIHR5cGU6ICdjaGFuZ2VkJyxcXG4gICAgICAgICAgICAgICAgb2xkVmFsdWU6IG9sZCwgbmV3VmFsdWU6IHZhbHVlIH0pO1xcblxcbiAgICAgICAge3sgLyogYWRkIG1lc3NhZ2UgcmVsYXRlZCB0byBjaGFuZ2VzIGluIChzdWIpcHJvcGVydGllcyBpbnNpZGUgcmVtb3ZlZCBhbmQgYXNzaWduZWQgdmFsdWUgKi8gfX1cXG4gICAgICAgIGlmICghIHdhc0RlZiB8fCBvbGQgIT0gdmFsdWUpXFxuICAgICAgICAgICAgYWRkVHJlZUNoYW5nZXNNZXNzYWdlcyhtZXNzYWdlcywgbWVzc2FnZXNIYXNoLFxcbiAgICAgICAgICAgICAgICBhY2Nlc3NQYXRoLCBvbGQsIHZhbHVlKTsgLyogZGVmaW5lZCBpbiB0aGUgZnVuY3Rpb24gdGhhdCBzeW50aGVzaXplcyBNb2RlbFBhdGggc2V0dGVyICovXFxuXFxuICAgICAgICB7eyAvKiBwb3N0IGFsbCBzdG9yZWQgbWVzc2FnZXMgKi8gfX1cXG4gICAgICAgIHt7IyBkZWYucG9zdE1lc3NhZ2VzIH19XFxuICAgIH1cXG59O1xcblwiLFxuICAgIGRlbDogXCIndXNlIHN0cmljdCc7XFxuLyogT25seSB1c2UgdGhpcyBzdHlsZSBvZiBjb21tZW50cywgbm90IFxcXCIvL1xcXCIgKi9cXG5cXG57eyMgZGVmLmluY2x1ZGVfZGVmaW5lcyB9fVxcbnt7IyBkZWYuaW5jbHVkZV90cmF2ZXJzZV90cmVlIH19XFxuXFxubWV0aG9kID0gZnVuY3Rpb24gZGVsKCkge1xcbiAgICB7eyMgZGVmLmluaXRWYXJzOidkZWwnIH19XFxuXFxuICAgIHt7PyBpdC5wYXJzZWRQYXRoLmxlbmd0aCB9fVxcbiAgICAgICAge3sjIGRlZi50cmF2ZXJzZVRyZWUgfX1cXG5cXG4gICAgICAgIHt7XFxuICAgICAgICAgICAgdmFyIGN1cnJOb2RlID0gaXQucGFyc2VkUGF0aFtjb3VudF07XFxuICAgICAgICAgICAgdmFyIGN1cnJQcm9wID0gY3Vyck5vZGUucHJvcGVydHk7ICAgICAgIFxcbiAgICAgICAgfX1cXG5cXG4gICAgICAgIGlmICghIHRyZWVEb2VzTm90RXhpc3QgJiYgbSAmJiBtLmhhc093blByb3BlcnR5ICYmIHt7IyBkZWYud2FzRGVmaW5lZH19KSB7XFxuICAgICAgICAgICAgdmFyIG9sZCA9IG17eyMgZGVmLmN1cnJQcm9wIH19O1xcbiAgICAgICAgICAgIGRlbGV0ZSBte3sjIGRlZi5jdXJyUHJvcCB9fTtcXG4gICAgICAgICAgICB7eyMgZGVmLmNoYW5nZUFjY2Vzc1BhdGggfX1cXG4gICAgICAgICAgICB2YXIgZGlkRGVsZXRlID0gdHJ1ZTtcXG4gICAgICAgIH1cXG4gICAge3s/P319XFxuICAgICAgICBpZiAodHlwZW9mIG0gIT0gJ3VuZGVmaW5lZCcpIHtcXG4gICAgICAgICAgICB2YXIgb2xkID0gbTtcXG4gICAgICAgICAgICB7eyMgZGVmLm1vZGVsQWNjZXNzUHJlZml4IH19ID0gdW5kZWZpbmVkO1xcbiAgICAgICAgICAgIHZhciBkaWREZWxldGUgPSB0cnVlO1xcbiAgICAgICAgfVxcbiAgICB7ez99fVxcblxcbiAgICBpZiAoZGlkRGVsZXRlICYmIHRoaXMuX29wdGlvbnMucmVhY3RpdmUgIT09IGZhbHNlKSB7XFxuICAgICAgICB7eyMgZGVmLmFkZE1zZyB9fSBhY2Nlc3NQYXRoLCB0eXBlOiAnZGVsZXRlZCcsIG9sZFZhbHVlOiBvbGQgfSk7XFxuXFxuICAgICAgICBhZGRUcmVlQ2hhbmdlc01lc3NhZ2VzKG1lc3NhZ2VzLCBtZXNzYWdlc0hhc2gsXFxuICAgICAgICAgICAgYWNjZXNzUGF0aCwgb2xkLCB1bmRlZmluZWQpOyAvKiBkZWZpbmVkIGluIHRoZSBmdW5jdGlvbiB0aGF0IHN5bnRoZXNpemVzIE1vZGVsUGF0aCBzZXR0ZXIgKi9cXG5cXG4gICAgICAgIHt7IC8qIHBvc3QgYWxsIHN0b3JlZCBtZXNzYWdlcyAqLyB9fVxcbiAgICAgICAge3sjIGRlZi5wb3N0TWVzc2FnZXMgfX1cXG4gICAgfVxcbn07XFxuXCIsXG4gICAgc3BsaWNlOiBcIid1c2Ugc3RyaWN0JztcXG4vKiBPbmx5IHVzZSB0aGlzIHN0eWxlIG9mIGNvbW1lbnRzLCBub3QgXFxcIi8vXFxcIiAqL1xcblxcbnt7IyBkZWYuaW5jbHVkZV9kZWZpbmVzIH19XFxue3sjIGRlZi5pbmNsdWRlX2NyZWF0ZV90cmVlIH19XFxue3sjIGRlZi5pbmNsdWRlX3RyYXZlcnNlX3RyZWUgfX1cXG5cXG5tZXRob2QgPSBmdW5jdGlvbiBzcGxpY2Uoc3BsaWNlSW5kZXgsIHNwbGljZUhvd01hbnkpIHsgLyogLC4uLiAtIGV4dHJhIGFyZ3VtZW50cyB0byBzcGxpY2UgaW50byBhcnJheSAqL1xcbiAgICB7eyMgZGVmLmluaXRWYXJzOidzcGxpY2UnIH19XFxuXFxuICAgIHZhciBhcmdzTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcXG4gICAgdmFyIGFkZEl0ZW1zID0gYXJnc0xlbiA+IDI7XFxuXFxuICAgIGlmIChhZGRJdGVtcykge1xcbiAgICAgICAge3sgLyogb25seSBjcmVhdGUgbW9kZWwgdHJlZSBpZiBpdGVtcyBhcmUgaW5zZXJ0ZWQgaW4gYXJyYXkgKi8gfX1cXG5cXG4gICAgICAgIHt7IC8qIGlmIG1vZGVsIGlzIHVuZGVmaW5lZCBpdCB3aWxsIGJlIHNldCB0byBhbiBlbXB0eSBhcnJheSAqLyB9fSAgXFxuICAgICAgICB2YXIgdmFsdWUgPSBbXTtcXG4gICAgICAgIHt7IyBkZWYuY3JlYXRlVHJlZTonc3BsaWNlJyB9fVxcblxcbiAgICAgICAge3s/IG5leHROb2RlIH19XFxuICAgICAgICAgICAge3tcXG4gICAgICAgICAgICAgICAgdmFyIGN1cnJOb2RlID0gbmV4dE5vZGU7XFxuICAgICAgICAgICAgICAgIHZhciBjdXJyUHJvcCA9IGN1cnJOb2RlLnByb3BlcnR5O1xcbiAgICAgICAgICAgICAgICB2YXIgZW1wdHlQcm9wID0gJ1tdJztcXG4gICAgICAgICAgICB9fVxcblxcbiAgICAgICAgICAgIHt7IyBkZWYuY3JlYXRlVHJlZVN0ZXAgfX1cXG4gICAgICAgIHt7P319XFxuXFxuICAgIH0gZWxzZSBpZiAoc3BsaWNlSG93TWFueSA+IDApIHtcXG4gICAgICAgIHt7IC8qIGlmIGl0ZW1zIGFyZSBub3QgaW5zZXJ0ZWQsIG9ubHkgdHJhdmVyc2UgbW9kZWwgdHJlZSBpZiBpdGVtcyBhcmUgZGVsZXRlZCBmcm9tIGFycmF5ICovIH19XFxuICAgICAgICB7ez8gaXQucGFyc2VkUGF0aC5sZW5ndGggfX1cXG4gICAgICAgICAgICB7eyMgZGVmLnRyYXZlcnNlVHJlZSB9fVxcblxcbiAgICAgICAgICAgIHt7XFxuICAgICAgICAgICAgICAgIHZhciBjdXJyTm9kZSA9IGl0LnBhcnNlZFBhdGhbY291bnRdO1xcbiAgICAgICAgICAgICAgICB2YXIgY3VyclByb3AgPSBjdXJyTm9kZS5wcm9wZXJ0eTsgICAgICAgXFxuICAgICAgICAgICAgfX1cXG5cXG4gICAgICAgICAgICB7eyAvKiBleHRyYSBicmFjZSBjbG9zZXMgJ2Vsc2UnIGluIGRlZi50cmF2ZXJzZVRyZWVTdGVwICovIH19XFxuICAgICAgICAgICAge3sjIGRlZi50cmF2ZXJzZVRyZWVTdGVwIH19IH1cXG4gICAgICAgIHt7P319XFxuICAgIH1cXG5cXG4gICAge3sgLyogc3BsaWNlIGl0ZW1zICovIH19XFxuICAgIGlmIChhZGRJdGVtcyB8fCAoISB0cmVlRG9lc05vdEV4aXN0ICYmIG1cXG4gICAgICAgICAgICAmJiBtLmxlbmd0aCA+IHNwbGljZUluZGV4ICkgKSB7XFxuICAgICAgICB2YXIgb2xkTGVuZ3RoID0gbS5sZW5ndGggPSBtLmxlbmd0aCB8fCAwO1xcblxcbiAgICAgICAgYXJndW1lbnRzWzBdID0gc3BsaWNlSW5kZXggPSBub3JtYWxpemVTcGxpY2VJbmRleChzcGxpY2VJbmRleCwgbS5sZW5ndGgpO1xcblxcbiAgICAgICAge3sgLyogY2xvbmUgYWRkZWQgYXJndW1lbnRzIHRvIHByZXZlbnQgc2FtZSByZWZlcmVuY2VzIGluIGxpbmtlZCBtb2RlbHMgKi8gfX1cXG4gICAgICAgIGlmIChhZGRJdGVtcylcXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3NMZW47IGkrKylcXG4gICAgICAgICAgICAgICAgYXJndW1lbnRzW2ldID0gY2xvbmVUcmVlKGFyZ3VtZW50c1tpXSk7XFxuXFxuICAgICAgICB7eyAvKiBhY3R1YWwgc3BsaWNlIGNhbGwgKi8gfX1cXG4gICAgICAgIHZhciByZW1vdmVkID0gQXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShtLCBhcmd1bWVudHMpO1xcblxcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMucmVhY3RpdmUgIT09IGZhbHNlKSB7XFxuICAgICAgICAgICAge3sjIGRlZi5hZGRNc2cgfX0gYWNjZXNzUGF0aCwgdHlwZTogJ3NwbGljZScsXFxuICAgICAgICAgICAgICAgICAgICBpbmRleDogc3BsaWNlSW5kZXgsIHJlbW92ZWQ6IHJlbW92ZWQsIGFkZGVkQ291bnQ6IGFkZEl0ZW1zID8gYXJnc0xlbiAtIDIgOiAwLFxcbiAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWU6IG0gfSk7XFxuXFxuICAgICAgICAgICAgaWYgKHJlbW92ZWQgJiYgcmVtb3ZlZC5sZW5ndGgpXFxuICAgICAgICAgICAgICAgIHJlbW92ZWQuZm9yRWFjaChmdW5jdGlvbihpdGVtLCBpbmRleCkge1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW1QYXRoID0gYWNjZXNzUGF0aCArICdbJyArIChzcGxpY2VJbmRleCArIGluZGV4KSArICddJztcXG4gICAgICAgICAgICAgICAgICAgIHt7IyBkZWYuYWRkTXNnIH19IGl0ZW1QYXRoLCB0eXBlOiAncmVtb3ZlZCcsIG9sZFZhbHVlOiBpdGVtIH0pO1xcblxcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlSXNUcmVlKGl0ZW0pKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1lc3NhZ2VzKG1lc3NhZ2VzLCBtZXNzYWdlc0hhc2gsIGl0ZW1QYXRoLCBpdGVtLCAncmVtb3ZlZCcsICdvbGRWYWx1ZScpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICBpZiAoYWRkSXRlbXMpXFxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJnc0xlbjsgaSsrKSB7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGFyZ3VtZW50c1tpXTtcXG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtUGF0aCA9IGFjY2Vzc1BhdGggKyAnWycgKyAoc3BsaWNlSW5kZXggKyBpIC0gMikgKyAnXSc7XFxuICAgICAgICAgICAgICAgICAgICB7eyMgZGVmLmFkZE1zZyB9fSBpdGVtUGF0aCwgdHlwZTogJ2FkZGVkJywgbmV3VmFsdWU6IGl0ZW0gfSk7XFxuXFxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVJc1RyZWUoaXRlbSkpXFxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWVzc2FnZXMobWVzc2FnZXMsIG1lc3NhZ2VzSGFzaCwgaXRlbVBhdGgsIGl0ZW0sICdhZGRlZCcsICduZXdWYWx1ZScpO1xcbiAgICAgICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAge3sgLyogcG9zdCBhbGwgc3RvcmVkIG1lc3NhZ2VzICovIH19XFxuICAgICAgICAgICAge3sjIGRlZi5wb3N0TWVzc2FnZXMgfX1cXG4gICAgICAgIH1cXG4gICAgfVxcblxcbiAgICByZXR1cm4gcmVtb3ZlZCB8fCBbXTtcXG59XFxuXCJcbn07XG5cbnZhciBpbmNsdWRlX2RlZmluZXMgPSBcIid1c2Ugc3RyaWN0JztcXG4vKiBPbmx5IHVzZSB0aGlzIHN0eWxlIG9mIGNvbW1lbnRzLCBub3QgXFxcIi8vXFxcIiAqL1xcblxcbi8qKlxcbiAqIEluc2VydHMgaW5pdGlhbGl6YXRpb24gY29kZVxcbiAqL1xcbiB7eyMjIGRlZi5pbml0VmFyczptZXRob2Q6XFxuICAgIHZhciBtID0ge3sjIGRlZi5tb2RlbEFjY2Vzc1ByZWZpeCB9fTtcXG4gICAgdmFyIG1lc3NhZ2VzID0gW10sIG1lc3NhZ2VzSGFzaCA9IHt9O1xcbiAgICB2YXIgYWNjZXNzUGF0aCA9ICcnO1xcbiAgICB2YXIgdHJlZURvZXNOb3RFeGlzdDtcXG4gICAgLyogaGFjayB0byBwcmV2ZW50IHNlbmRpbmcgZmluaXNoZWQgZXZlbnRzIHRvIGFsbG93IGZvciBwcm9wYWdhdGlvbiBvZiBiYXRjaGVzIHdpdGhvdXQgc3BsaXR0aW5nIHRoZW0gKi9cXG4gICAgdmFyIGluQ2hhbmdlVHJhbnNhY3Rpb24gPSBnZXRUcmFuc2FjdGlvbkZsYWcoIHt7PSBtZXRob2QgfX0gKTtcXG4gI319XFxuXFxuLyoqXFxuICogSW5zZXJ0cyB0aGUgYmVnaW5uaW5nIG9mIGZ1bmN0aW9uIGNhbGwgdG8gYWRkIG1lc3NhZ2UgdG8gbGlzdFxcbiAqL1xcbnt7IyMgZGVmLmFkZE1zZzogYWRkQ2hhbmdlTWVzc2FnZShtZXNzYWdlcywgbWVzc2FnZXNIYXNoLCB7IHBhdGg6ICN9fVxcblxcbi8qKlxcbiAqIEluc2VydHMgY3VycmVudCBwcm9wZXJ0eS9pbmRleCBmb3IgYm90aCBub3JtYWwgYW5kIGludGVycG9sYXRlZCBwcm9wZXJ0aWVzL2luZGV4ZXNcXG4gKi9cXG57eyMjIGRlZi5jdXJyUHJvcDp7ez8gY3Vyck5vZGUuaW50ZXJwb2xhdGUgfX1bdGhpcy5fYXJnc1sge3s9IGN1cnJOb2RlLmludGVycG9sYXRlIH19IF1de3s/P319e3s9IGN1cnJQcm9wIH19e3s/fX0gI319XFxuXFxuLyoqXFxuICogSW5zZXJ0cyBjb25kaXRpb24gdG8gdGVzdCB3aGV0aGVyIG5vcm1hbC9pbnRlcnBvbGF0ZWQgcHJvcGVydHkvaW5kZXggZXhpc3RzXFxuICovXFxue3sjIyBkZWYud2FzRGVmaW5lZDogbS5oYXNPd25Qcm9wZXJ0eShcXG4gICAge3s/IGN1cnJOb2RlLmludGVycG9sYXRlIH19XFxuICAgICAgICB0aGlzLl9hcmdzWyB7ez0gY3Vyck5vZGUuaW50ZXJwb2xhdGUgfX0gXVxcbiAgICB7ez8/fX1cXG4gICAgICAgICd7ez0gaXQuZ2V0UGF0aE5vZGVLZXkoY3Vyck5vZGUpIH19J1xcbiAgICB7ez99fVxcbikgI319XFxuXFxuXFxuLyoqXFxuICogSW5zZXJ0cyBjb2RlIHRvIHVwZGF0ZSBhY2Nlc3MgcGF0aCBmb3IgY3VycmVudCBwcm9wZXJ0eVxcbiAqIEJlY2F1c2Ugb2YgdGhlIHBvc3NpYmlsaXR5IG9mIGludGVycG9sYXRlZCBwcm9wZXJ0aWVzLCBpdCBjYW4ndCBiZSBjYWxjdWxhdGVkIGluIHRlbXBsYXRlLCBpdCBjYW4gb25seSBiZSBjYWxjdWxhdGVkIGR1cmluZyBhY2Nlc3NvciBjYWxsLlxcbiAqL1xcbnt7IyMgZGVmLmNoYW5nZUFjY2Vzc1BhdGg6XFxuICAgIGFjY2Vzc1BhdGggKz0ge3s/IGN1cnJOb2RlLmludGVycG9sYXRlIH19XFxuICAgICAgICB7ez8gY3Vyck5vZGUuc3ludGF4ID09ICdhcnJheScgfX1cXG4gICAgICAgICAgICAnWycgKyB0aGlzLl9hcmdzWyB7ez0gY3Vyck5vZGUuaW50ZXJwb2xhdGUgfX0gXSArICddJztcXG4gICAgICAgIHt7Pz99fVxcbiAgICAgICAgICAgICcuJyArIHRoaXMuX2FyZ3NbIHt7PSBjdXJyTm9kZS5pbnRlcnBvbGF0ZSB9fSBdO1xcbiAgICAgICAge3s/fX1cXG4gICAge3s/P319XFxuICAgICAgICAne3s9IGN1cnJQcm9wIH19JztcXG4gICAge3s/fX1cXG4jfX1cXG5cXG5cXG4vKipcXG4gKiBJbnNlcnRzIGNvZGUgdG8gcG9zdCBzdG9yZWQgbWVzc2FnZXNcXG4gKi9cXG57eyMjIGRlZi5wb3N0TWVzc2FnZXM6XFxuICAgIGlmIChtZXNzYWdlcy5sZW5ndGgpIHtcXG4gICAgICAgIHt7IyBkZWYubW9kZWxQb3N0QmF0Y2hDb2RlIH19KCdkYXRhY2hhbmdlcycsIHtcXG4gICAgICAgICAgICBjaGFuZ2VzOiBtZXNzYWdlcyxcXG4gICAgICAgICAgICB0cmFuc2FjdGlvbjogaW5DaGFuZ2VUcmFuc2FjdGlvblxcbiAgICAgICAgfSk7XFxuXFxuICAgICAgICBtZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uKG1zZykge1xcbiAgICAgICAgICAgIHt7IyBkZWYubW9kZWxQb3N0TWVzc2FnZUNvZGUgfX0obXNnLnBhdGgsIG1zZyk7XFxuICAgICAgICB9LCB0aGlzKTtcXG4gICAgfVxcbiN9fVxcblwiXG4gICAgLCBpbmNsdWRlX2NyZWF0ZV90cmVlID0gXCIndXNlIHN0cmljdCc7XFxuLyogT25seSB1c2UgdGhpcyBzdHlsZSBvZiBjb21tZW50cywgbm90IFxcXCIvL1xcXCIgKi9cXG5cXG4vKipcXG4gKiBJbnNlcnRzIGNvZGUgdG8gY3JlYXRlIG1vZGVsIHRyZWUgYXMgbmVjY2Vzc2FyeSBmb3IgYHNldGAgYW5kIGBzcGxpY2VgIGFjY2Vzc29ycyBhbmQgdG8gYWRkIG1lc3NhZ2VzIHRvIHNlbmQgbGlzdCBpZiB0aGUgdHJlZSBjaGFuZ2VzLlxcbiAqL1xcbnt7IyMgZGVmLmNyZWF0ZVRyZWU6bWV0aG9kOlxcbiAgICB2YXIgd2FzRGVmID0gdHJ1ZTtcXG4gICAgdmFyIG9sZCA9IG07XFxuXFxuICAgIHt7IHZhciBlbXB0eVByb3AgPSBpdC5wYXJzZWRQYXRoWzBdICYmIGl0LnBhcnNlZFBhdGhbMF0uZW1wdHk7IH19XFxuICAgIHt7PyBlbXB0eVByb3AgfX1cXG4gICAgICAgIHt7IC8qIGNyZWF0ZSB0b3AgbGV2ZWwgbW9kZWwgaWYgaXQgd2FzIG5vdCBwcmV2aW91c2x5IGRlZmluZWQgKi8gfX1cXG4gICAgICAgIGlmICghIG0pIHtcXG4gICAgICAgICAgICBtID0ge3sjIGRlZi5tb2RlbEFjY2Vzc1ByZWZpeCB9fSA9IHt7PSBlbXB0eVByb3AgfX07XFxuICAgICAgICAgICAgd2FzRGVmID0gZmFsc2U7XFxuXFxuICAgICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMucmVhY3RpdmUgIT09IGZhbHNlKSB7XFxuICAgICAgICAgICAgICAgIHt7IyBkZWYuYWRkTXNnIH19ICcnLCB0eXBlOiAnYWRkZWQnLFxcbiAgICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZTogbSB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIHt7Pz99fVxcbiAgICAgICAge3s/IG1ldGhvZCA9PSAnc3BsaWNlJyB9fVxcbiAgICAgICAgICAgIGlmICghIG0pIHtcXG4gICAgICAgIHt7P319XFxuICAgICAgICAgICAgICAgIG0gPSB7eyMgZGVmLm1vZGVsQWNjZXNzUHJlZml4IH19ID0gY2xvbmVUcmVlKHZhbHVlKTtcXG4gICAgICAgICAgICAgICAgd2FzRGVmID0gdHlwZW9mIG9sZCAhPSAndW5kZWZpbmVkJztcXG4gICAgICAgIHt7PyBtZXRob2QgPT0gJ3NwbGljZScgfX1cXG4gICAgICAgICAgICB9XFxuICAgICAgICB7ez99fSAgICAgICBcXG4gICAge3s/fX1cXG5cXG5cXG4gICAge3sgLyogY3JlYXRlIG1vZGVsIHRyZWUgaWYgaXQgZG9lc24ndCBleGlzdCAqLyB9fVxcbiAgICB7eyAgdmFyIG1vZGVsRGF0YVByb3BlcnR5ID0gJyc7XFxuICAgICAgICB2YXIgbmV4dE5vZGUgPSBpdC5wYXJzZWRQYXRoWzBdO1xcbiAgICAgICAgdmFyIGNvdW50ID0gaXQucGFyc2VkUGF0aC5sZW5ndGggLSAxO1xcblxcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XFxuICAgICAgICAgICAgdmFyIGN1cnJOb2RlID0gbmV4dE5vZGU7XFxuICAgICAgICAgICAgdmFyIGN1cnJQcm9wID0gY3Vyck5vZGUucHJvcGVydHk7XFxuICAgICAgICAgICAgbmV4dE5vZGUgPSBpdC5wYXJzZWRQYXRoW2kgKyAxXTtcXG4gICAgICAgICAgICB2YXIgZW1wdHlQcm9wID0gbmV4dE5vZGUgJiYgbmV4dE5vZGUuZW1wdHk7XFxuICAgIH19XFxuXFxuICAgICAgICB7eyMgZGVmLmNyZWF0ZVRyZWVTdGVwIH19XFxuXFxuICAgIHt7ICB9IC8qIGZvciBsb29wICovIH19XFxuI319XFxuXFxuXFxuLyoqXFxuICogSW5zZXJ0cyBjb2RlIHRvIGNyZWF0ZSBvbmUgc3RlcCBpbiB0aGUgbW9kZWwgdHJlZVxcbiAqL1xcbnt7IyMgZGVmLmNyZWF0ZVRyZWVTdGVwOlxcbiAgICB7eyMgZGVmLmNoYW5nZUFjY2Vzc1BhdGggfX1cXG5cXG4gICAgaWYgKCEge3sjIGRlZi53YXNEZWZpbmVkIH19KSB7IFxcbiAgICAgICAge3sgLyogcHJvcGVydHkgZG9lcyBub3QgZXhpc3QgKi8gfX1cXG4gICAgICAgIG0gPSBte3sjIGRlZi5jdXJyUHJvcCB9fSA9IHt7PSBlbXB0eVByb3AgfX07XFxuXFxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5yZWFjdGl2ZSAhPT0gZmFsc2UpIHtcXG4gICAgICAgICAgICB7eyMgZGVmLmFkZE1zZyB9fSBhY2Nlc3NQYXRoLCB0eXBlOiAnYWRkZWQnLCBcXG4gICAgICAgICAgICAgICAgICBuZXdWYWx1ZTogbSB9KTtcXG4gICAgICAgIH1cXG5cXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbXt7IyBkZWYuY3VyclByb3AgfX0gIT0gJ29iamVjdCcpIHtcXG4gICAgICAgIHt7IC8qIHByb3BlcnR5IGlzIG5vdCBvYmplY3QgKi8gfX1cXG4gICAgICAgIHZhciBvbGQgPSBte3sjIGRlZi5jdXJyUHJvcCB9fTtcXG4gICAgICAgIG0gPSBte3sjIGRlZi5jdXJyUHJvcCB9fSA9IHt7PSBlbXB0eVByb3AgfX07XFxuXFxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5yZWFjdGl2ZSAhPT0gZmFsc2UpIHtcXG4gICAgICAgICAgICB7eyMgZGVmLmFkZE1zZyB9fSBhY2Nlc3NQYXRoLCB0eXBlOiAnY2hhbmdlZCcsIFxcbiAgICAgICAgICAgICAgICAgIG9sZFZhbHVlOiBvbGQsIG5ld1ZhbHVlOiBtIH0pO1xcbiAgICAgICAgfVxcblxcbiAgICB9IGVsc2Uge1xcbiAgICAgICAge3sgLyogcHJvcGVydHkgZXhpc3RzLCBqdXN0IHRyYXZlcnNlIGRvd24gdGhlIG1vZGVsIHRyZWUgKi8gfX1cXG4gICAgICAgIG0gPSBte3sjIGRlZi5jdXJyUHJvcCB9fTtcXG4gICAgfVxcbiN9fVxcblwiXG4gICAgLCBpbmNsdWRlX3RyYXZlcnNlX3RyZWUgPSBcIid1c2Ugc3RyaWN0JztcXG4vKiBPbmx5IHVzZSB0aGlzIHN0eWxlIG9mIGNvbW1lbnRzLCBub3QgXFxcIi8vXFxcIiAqL1xcblxcbi8qKlxcbiAqIEluc2VydHMgY29kZSB0byB0cmF2ZXJzZSBtb2RlbCB0cmVlIGZvciBgZGVsZXRlYCBhbmQgYHNwbGljZWAgYWNjZXNzb3JzLlxcbiAqL1xcbnt7IyMgZGVmLnRyYXZlcnNlVHJlZTpcXG4gICAge3sgXFxuICAgICAgICB2YXIgY291bnQgPSBpdC5wYXJzZWRQYXRoLmxlbmd0aC0xO1xcblxcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7IFxcbiAgICAgICAgICAgIHZhciBjdXJyTm9kZSA9IGl0LnBhcnNlZFBhdGhbaV07XFxuICAgICAgICAgICAgdmFyIGN1cnJQcm9wID0gY3Vyck5vZGUucHJvcGVydHk7XFxuICAgIH19XFxuICAgICAgICAgICAge3sjIGRlZi50cmF2ZXJzZVRyZWVTdGVwIH19XFxuXFxuICAgIHt7IH0gLyogZm9yIGxvb3AgKi9cXG5cXG4gICAgICAgIHZhciBpID0gY291bnQ7XFxuICAgICAgICB3aGlsZSAoaS0tKSB7IC8qIGNsb3NpbmcgYnJhY2VzIGZvciBlbHNlJ3MgYWJvdmUgKi9cXG4gICAgfX1cXG4gICAgICAgICAgICB9XFxuICAgIHt7IH0gLyogd2hpbGUgbG9vcCAqLyB9fVxcbiN9fVxcblxcblxcbi8qKlxcbiAqIEluc2VydHMgY29kZSB0byB0cmF2ZXJzZSBvbmUgc3RlcCBpbiB0aGUgbW9kZWwgdHJlZVxcbiAqL1xcbnt7IyMgZGVmLnRyYXZlcnNlVHJlZVN0ZXA6XFxuICAgIGlmICghIChtICYmIG0uaGFzT3duUHJvcGVydHkgJiYge3sjIGRlZi53YXNEZWZpbmVkfX0gKSApXFxuICAgICAgICB0cmVlRG9lc05vdEV4aXN0ID0gdHJ1ZTtcXG4gICAgZWxzZSB7XFxuICAgICAgICBtID0gbXt7IyBkZWYuY3VyclByb3AgfX07XFxuICAgICAgICB7eyMgZGVmLmNoYW5nZUFjY2Vzc1BhdGggfX1cXG4gICAge3sgLyogYnJhY2UgZnJvbSBlbHNlIGlzIG5vdCBjbG9zZWQgb24gcHVycG9zZSAtIGFsbCBicmFjZXMgYXJlIGNsb3NlZCBpbiB3aGlsZSBsb29wICovIH19XFxuI319XFxuXCI7XG5cbnZhciBkb3REZWYgPSB7XG4gICAgaW5jbHVkZV9kZWZpbmVzOiBpbmNsdWRlX2RlZmluZXMsXG4gICAgaW5jbHVkZV9jcmVhdGVfdHJlZTogaW5jbHVkZV9jcmVhdGVfdHJlZSxcbiAgICBpbmNsdWRlX3RyYXZlcnNlX3RyZWU6IGluY2x1ZGVfdHJhdmVyc2VfdHJlZSxcbiAgICBnZXRQYXRoTm9kZUtleTogcGF0aFV0aWxzLmdldFBhdGhOb2RlS2V5LFxuICAgIG1vZGVsQWNjZXNzUHJlZml4OiAndGhpcy5fbW9kZWwuX2RhdGEnLFxuICAgIG1vZGVsUG9zdE1lc3NhZ2VDb2RlOiAndGhpcy5fbW9kZWwuX2ludGVybmFsTWVzc2VuZ2VyLnBvc3RNZXNzYWdlJyxcbiAgICBtb2RlbFBvc3RCYXRjaENvZGU6ICd0aGlzLl9tb2RlbC5wb3N0TWVzc2FnZVN5bmMnLFxuICAgIGludGVybmFsTWVzc2VuZ2VyOiAndGhpcy5fbW9kZWwuX2ludGVybmFsTWVzc2VuZ2VyJ1xufTtcblxudmFyIG1vZGVsRG90RGVmID0gXyhkb3REZWYpLmNsb25lKCkuZXh0ZW5kKHtcbiAgICBtb2RlbEFjY2Vzc1ByZWZpeDogJ3RoaXMuX2RhdGEnLFxuICAgIG1vZGVsUG9zdE1lc3NhZ2VDb2RlOiAndGhpcy5faW50ZXJuYWxNZXNzZW5nZXIucG9zdE1lc3NhZ2UnLFxuICAgIG1vZGVsUG9zdEJhdGNoQ29kZTogJ3RoaXMucG9zdE1lc3NhZ2VTeW5jJyxcbiAgICBpbnRlcm5hbE1lc3NlbmdlcjogJ3RoaXMuX2ludGVybmFsTWVzc2VuZ2VyJ1xufSkuXygpO1xuXG5cbnZhciBkb3RTZXR0aW5ncyA9IF8uY2xvbmUoZG9ULnRlbXBsYXRlU2V0dGluZ3MpO1xuZG90U2V0dGluZ3Muc3RyaXAgPSBmYWxzZTtcblxudmFyIHN5bnRoZXNpemVycyA9IF8ubWFwS2V5cyh0ZW1wbGF0ZXMsIGZ1bmN0aW9uKHRtcGwpIHtcbiAgICByZXR1cm4gZG9ULnRlbXBsYXRlKHRtcGwsIGRvdFNldHRpbmdzLCBkb3REZWYpOyBcbn0pO1xuXG5cbnZhciBtb2RlbFN5bnRoZXNpemVycyA9IF8ubWFwVG9PYmplY3QoWydzZXQnLCAnZGVsJywgJ3NwbGljZSddLCBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgcmV0dXJuIGRvVC50ZW1wbGF0ZSh0ZW1wbGF0ZXNbbWV0aG9kTmFtZV0sIGRvdFNldHRpbmdzLCBtb2RlbERvdERlZik7XG59KTtcblxuXG4vKipcbiAqIEZ1bmN0aW9uIHRoYXQgc3ludGhlc2l6ZXMgYWNjZXNzb3IgbWV0aG9kcy5cbiAqIEZ1bmN0aW9uIGlzIG1lbW9pemVkIHNvIGFjY2Vzc29ycyBhcmUgY2FjaGVkICh1cCB0byAxMDAwKS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aCBNb2RlbC9Nb2RlbFBhdGggYWNjZXNzIHBhdGhcbiAqIEBwYXJhbSB7QXJyYXl9IHBhcnNlZFBhdGggYXJyYXkgb2YgcGF0aCBub2Rlc1xuICogQHJldHVybiB7T2JqZWN0W0Z1bmN0aW9uXX1cbiAqL1xudmFyIHN5bnRoZXNpemVQYXRoTWV0aG9kcyA9IF8ubWVtb2l6ZShfc3ludGhlc2l6ZVBhdGhNZXRob2RzLCB1bmRlZmluZWQsIDEwMDApO1xuXG5mdW5jdGlvbiBfc3ludGhlc2l6ZVBhdGhNZXRob2RzKHBhdGgsIHBhcnNlZFBhdGgpIHtcbiAgICB2YXIgbWV0aG9kcyA9IF8ubWFwS2V5cyhzeW50aGVzaXplcnMsIGZ1bmN0aW9uKHN5bnRoc3pyKSB7XG4gICAgICAgIHJldHVybiBfc3ludGhlc2l6ZShzeW50aHN6ciwgcGF0aCwgcGFyc2VkUGF0aCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG1ldGhvZHM7XG59XG5cblxudmFyIG5vcm1hbGl6ZVNwbGljZUluZGV4ID0gbW9kZWxVdGlscy5ub3JtYWxpemVTcGxpY2VJbmRleDsgLy8gdXNlZCBpbiBzcGxpY2UuZG90LmpzXG5cblxuZnVuY3Rpb24gX3N5bnRoZXNpemUoc3ludGhlc2l6ZXIsIHBhdGgsIHBhcnNlZFBhdGgpIHtcbiAgICB2YXIgbWV0aG9kXG4gICAgICAgICwgbWV0aG9kQ29kZSA9IHN5bnRoZXNpemVyKHtcbiAgICAgICAgICAgIHBhcnNlZFBhdGg6IHBhcnNlZFBhdGgsXG4gICAgICAgICAgICBnZXRQYXRoTm9kZUtleTogcGF0aFV0aWxzLmdldFBhdGhOb2RlS2V5XG4gICAgICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgZXZhbChtZXRob2RDb2RlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IE1vZGVsRXJyb3IoJ01vZGVsUGF0aCBtZXRob2QgY29tcGlsYXRpb24gZXJyb3I7IHBhdGg6ICcgKyBwYXRoICsgJywgY29kZTogJyArIG1ldGhvZENvZGUpO1xuICAgIH1cblxuICAgIHJldHVybiBtZXRob2Q7XG5cblxuICAgIC8vIGZ1bmN0aW9ucyB1c2VkIGJ5IG1ldGhvZHMgYHNldGAsIGBkZWxldGVgIGFuZCBgc3BsaWNlYCAoc3ludGhlc2l6ZWQgYnkgdGVtcGxhdGUpXG4gICAgZnVuY3Rpb24gYWRkQ2hhbmdlTWVzc2FnZShtZXNzYWdlcywgbWVzc2FnZXNIYXNoLCBtc2cpIHtcbiAgICAgICAgbWVzc2FnZXMucHVzaChtc2cpO1xuICAgICAgICBtZXNzYWdlc0hhc2hbbXNnLnBhdGhdID0gbXNnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFRyZWVDaGFuZ2VzTWVzc2FnZXMobWVzc2FnZXMsIG1lc3NhZ2VzSGFzaCwgcm9vdFBhdGgsIG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgICAgICB2YXIgb2xkSXNUcmVlID0gdmFsdWVJc1RyZWUob2xkVmFsdWUpXG4gICAgICAgICAgICAsIG5ld0lzVHJlZSA9IHZhbHVlSXNUcmVlKG5ld1ZhbHVlKTtcblxuICAgICAgICBpZiAobmV3SXNUcmVlKVxuICAgICAgICAgICAgYWRkTWVzc2FnZXMobWVzc2FnZXMsIG1lc3NhZ2VzSGFzaCwgcm9vdFBhdGgsIG5ld1ZhbHVlLCAnYWRkZWQnLCAnbmV3VmFsdWUnKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChvbGRJc1RyZWUpXG4gICAgICAgICAgICBhZGRNZXNzYWdlcyhtZXNzYWdlcywgbWVzc2FnZXNIYXNoLCByb290UGF0aCwgb2xkVmFsdWUsICdyZW1vdmVkJywgJ29sZFZhbHVlJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkTWVzc2FnZXMobWVzc2FnZXMsIG1lc3NhZ2VzSGFzaCwgcm9vdFBhdGgsIG9iaiwgbXNnVHlwZSwgdmFsdWVQcm9wKSB7XG4gICAgICAgIF9hZGRNZXNzYWdlcyhyb290UGF0aCwgb2JqKTtcblxuXG4gICAgICAgIGZ1bmN0aW9uIF9hZGRNZXNzYWdlcyhyb290UGF0aCwgb2JqKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhdGhTeW50YXggPSByb290UGF0aCArICdbJCRdJztcbiAgICAgICAgICAgICAgICBvYmouZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkTWVzc2FnZSh2YWx1ZSwgaW5kZXgsIHBhdGhTeW50YXgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgcGF0aFN5bnRheCA9IHJvb3RQYXRoICsgJy4kJCc7XG4gICAgICAgICAgICAgICAgXy5lYWNoS2V5KG9iaiwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICAgICAgICAgICAgICBhZGRNZXNzYWdlKHZhbHVlLCBrZXksIHBhdGhTeW50YXgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gYWRkTWVzc2FnZSh2YWx1ZSwga2V5LCBwYXRoU3ludGF4KSB7XG4gICAgICAgICAgICB2YXIgcGF0aCA9IHBhdGhTeW50YXgucmVwbGFjZSgnJCQnLCBrZXkpXG4gICAgICAgICAgICAgICAgLCBleGlzdGluZ01zZyA9IG1lc3NhZ2VzSGFzaFtwYXRoXTtcblxuICAgICAgICAgICAgaWYgKGV4aXN0aW5nTXNnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nTXNnLnR5cGUgPT0gbXNnVHlwZSlcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdzZXR0ZXIgZXJyb3I6IHNhbWUgbWVzc2FnZSB0eXBlIHBvc3RlZCBvbiB0aGUgc2FtZSBwYXRoJyk7XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nTXNnLnR5cGUgPSAnY2hhbmdlZCc7XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nTXNnW3ZhbHVlUHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBtc2cgPSB7IHBhdGg6IHBhdGgsIHR5cGU6IG1zZ1R5cGUgfTtcbiAgICAgICAgICAgICAgICBtc2dbdmFsdWVQcm9wXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGFkZENoYW5nZU1lc3NhZ2UobWVzc2FnZXMsIG1lc3NhZ2VzSGFzaCwgbXNnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbHVlSXNUcmVlKHZhbHVlKSlcbiAgICAgICAgICAgICAgICBfYWRkTWVzc2FnZXMocGF0aCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xvbmVUcmVlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZUlzTm9ybWFsT2JqZWN0KHZhbHVlKVxuICAgICAgICAgICAgICAgID8gXy5kZWVwQ2xvbmUodmFsdWUpXG4gICAgICAgICAgICAgICAgOiB2YWx1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm90ZWN0VmFsdWUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuICEgdmFsdWVJc05vcm1hbE9iamVjdCh2YWx1ZSlcbiAgICAgICAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgICAgICAgOiBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA/IHZhbHVlLnNsaWNlKClcbiAgICAgICAgICAgICAgICAgICAgOiBPYmplY3QuY3JlYXRlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWx1ZUlzVHJlZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWVJc05vcm1hbE9iamVjdCh2YWx1ZSlcbiAgICAgICAgICAgICAgICAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbHVlSXNOb3JtYWxPYmplY3QodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGxcbiAgICAgICAgICAgICAgICAmJiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgICAgICYmICEgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSlcbiAgICAgICAgICAgICAgICAmJiAhICh2YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkQmF0Y2hJZHNUb01lc3NhZ2UobXNnLCBiYXRjaElkLCBtc2dJZCkge1xuICAgICAgICBfLmRlZmluZVByb3BlcnRpZXMobXNnLCB7XG4gICAgICAgICAgICBfX2JhdGNoX2lkOiBiYXRjaElkLFxuICAgICAgICAgICAgX19tc2dfaWQ6IG1zZ0lkXG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIEV4cG9ydHMgYHN5bnRoZXNpemVgIGZ1bmN0aW9uIHdpdGggdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAtIC5tb2RlbE1ldGhvZHMuc2V0IC0gYHNldGAgbWV0aG9kIGZvciBNb2RlbFxuICogLSAubW9kZWxNZXRob2RzLmRlbCAtIGBkZWxgIG1ldGhvZCBmb3IgTW9kZWxcbiAqIC0gLm1vZGVsTWV0aG9kcy5zcGxpY2UgLSBgc3BsaWNlYCBtZXRob2QgZm9yIE1vZGVsXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gc3ludGhlc2l6ZVBhdGhNZXRob2RzO1xuXG52YXIgbW9kZWxNZXRob2RzID0gXy5tYXBLZXlzKG1vZGVsU3ludGhlc2l6ZXJzLCBmdW5jdGlvbihzeW50aGVzaXplcikge1xuICAgIHJldHVybiBfc3ludGhlc2l6ZShzeW50aGVzaXplciwgJycsIFtdKTtcbn0pO1xuXG5zeW50aGVzaXplUGF0aE1ldGhvZHMubW9kZWxNZXRob2RzID0gbW9kZWxNZXRob2RzO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIGBtaWxvLnV0aWxzLmNoZWNrYFxuICpcbiAqIENoZWNrIGlzIGEgbW9kdWxlIGZvciBwYXJhbWV0ZXJzIGNoZWNraW5nIGV4dHJhY3RlZCBmcm9tIFtNZXRlb3JdKGh0dHA6Ly9kb2NzLm1ldGVvci5jb20vKSBmcmFtZXdvcmsuXG4gKlxuICogSXQgYWxsb3dzIHRvIGJvdGggZG9jdW1lbnQgYW5kIHRvIGNoZWNrIHBhcmFtZXRlciB0eXBlcyBpbiB5b3VyIGZ1bmN0aW9uXG4gKiBtYWtpbmcgY29kZSBib3RoIHJlYWRhYmxlIGFuZCBzdGFibGUuXG4gKlxuICpcbiAqICMjIyBVc2FnZVxuICpgYGBcbiAqIHZhciBjaGVjayA9IG1pbG8uY2hlY2tcbiAqICAgICAsIE1hdGNoID0gY2hlY2suTWF0Y2g7XG4gKlxuICogZnVuY3Rpb24gTXkobmFtZSwgb2JqLCBjYikge1xuICogICAgIC8vIGlmIGFueSBvZiBjaGVja3MgZmFpbCBhbiBlcnJvciB3aWxsIGJlIHRocm93blxuICogICAgIGNoZWNrKG5hbWUsIFN0cmluZyk7XG4gKiAgICAgY2hlY2sob2JqLCBNYXRjaC5PYmplY3RJbmNsdWRpbmcoeyBvcHRpb25zOiBPYmplY3QgfSkpO1xuICogICAgIGNoZWNrKGNiLCBGdW5jdGlvbik7XG4gKlxuICogICAgIC8vIC4uLiB5b3VyIGNvZGVcbiAqIH1cbiAqYGBgXG4gKiBTZWUgW01ldGVvciBkb2NzXShodHRwOi8vZG9jcy5tZXRlb3IuY29tLyNtYXRjaCkgdG8gc2VlIGhvdyBpdCB3b3Jrc1xuICpcbiAqXG4gKiAjIyMgUGF0dGVybnNcbiAqXG4gKiBBbGwgcGF0dGVybnMgYW5kIGZ1bmN0aW9ucyBkZXNjcmliZWQgaW4gTWV0ZW9yIGRvY3Mgd29yay5cbiAqXG4gKiBVbmxpa2UgaW4gTWV0ZW9yLCBPYmplY3QgcGF0dGVybiBtYXRjaGVzIGluc3RhbmNlIG9mIGFueSBjbGFzcyxcbiAqIG5vdCBvbmx5IHBsYWluIG9iamVjdC5cbiAqXG4gKiBJbiBhZGRpdGlvbiB0byBwYXR0ZXJucyBkZXNjcmliZWQgaW4gTWV0ZW9yIGRvY3MgdGhlIGZvbGxvd2luZyBwYXR0ZXJucyBhcmUgaW1wbGVtZW50ZWRcbiAqXG4gKiAqIE1hdGNoLl9fT2JqZWN0SGFzaF9fKF9wYXR0ZXJuXylcbiAqXG4gKiAgIE1hdGNoZXMgYW4gb2JqZWN0IHdoZXJlIGFsbCBwcm9wZXJ0aWVzIG1hdGNoIGEgZ2l2ZW4gcGF0dGVyblxuICpcbiAqICogTWF0Y2guX19TdWJjbGFzc19fKF9jb25zdHJ1Y3Rvcl8gWywgX21hdGNoVGhpc0NsYXNzVG9vX10pXG4gKlxuICogICBNYXRjaGVzIGEgY2xhc3MgdGhhdCBpcyBhIHN1YmNsYXNzIG9mIGEgZ2l2ZW4gY2xhc3MuIElmIHRoZSBzZWNvbmQgcGFyYW1ldGVyXG4gKiAgIGlzIHRydWUsIGl0IHdpbGwgYWxzbyBtYXRjaCB0aGUgY2xhc3MgaXRzZWxmLlxuICpcbiAqICAgV2l0aG91dCB0aGlzIHBhdHRlcm4gdG8gY2hlY2sgaWYgX015U3ViY2xhc3NfIGlzIGEgc3ViY2xhc3Mgb2YgX015Q2xhc3NfXG4gKiAgIHlvdSB3b3VsZCBoYXZlIHRvIHVzZVxuICpcbiAqICAgICAgIGNoZWNrKE15U3ViY2xhc3MsIE1hdGNoLldoZXJlKGZ1bmN0aW9uKCkge1xuICogICAgICAgICAgIHJldHVybiBNeVN1YmNsYXNzLnByb3RvdHlwZSBpbnN0YW5jZW9mIE15Q2xhc3M7XG4gKiAgICAgICB9KTtcbiAqXG4gKlxuICogVGhpbmdzIHdlIGV4cGxpY2l0bHkgZG8gTk9UIHN1cHBvcnQ6XG4gKiAgICAtIGhldGVyb2dlbm91cyBhcnJheXNcbioqL1xuXG52YXIgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpXG4gICAgLCBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKTtcblxudmFyIGNoZWNrID0gZnVuY3Rpb24gKHZhbHVlLCBwYXR0ZXJuKSB7XG4gICAgaWYgKGNvbmZpZy5jaGVjayA9PT0gZmFsc2UpXG4gICAgICAgIHJldHVybjtcblxuICAgIC8vIFJlY29yZCB0aGF0IGNoZWNrIGdvdCBjYWxsZWQsIGlmIHNvbWVib2R5IGNhcmVkLlxuICAgIHRyeSB7XG4gICAgICAgIGNoZWNrU3VidHJlZSh2YWx1ZSwgcGF0dGVybik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICgoZXJyIGluc3RhbmNlb2YgTWF0Y2guRXJyb3IpICYmIGVyci5wYXRoKVxuICAgICAgICAgICAgZXJyLm1lc3NhZ2UgKz0gXCIgaW4gZmllbGQgXCIgKyBlcnIucGF0aDtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY2hlY2s7XG5cbnZhciBNYXRjaCA9IGNoZWNrLk1hdGNoID0ge1xuICAgIE9wdGlvbmFsOiBmdW5jdGlvbiAocGF0dGVybikge1xuICAgICAgICByZXR1cm4gbmV3IE9wdGlvbmFsKHBhdHRlcm4pO1xuICAgIH0sXG4gICAgT25lT2Y6IGZ1bmN0aW9uICgvKiBhcmd1bWVudHMgKi8pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPbmVPZihhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgQW55OiBbJ19fYW55X18nXSxcbiAgICBXaGVyZTogZnVuY3Rpb24gKGNvbmRpdGlvbikge1xuICAgICAgICByZXR1cm4gbmV3IFdoZXJlKGNvbmRpdGlvbik7XG4gICAgfSxcbiAgICBPYmplY3RJbmNsdWRpbmc6IGZ1bmN0aW9uIChwYXR0ZXJuKSB7XG4gICAgICAgIHJldHVybiBuZXcgT2JqZWN0SW5jbHVkaW5nKHBhdHRlcm4pO1xuICAgIH0sXG4gICAgLy8gTWF0Y2hlcyBvbmx5IHNpZ25lZCAzMi1iaXQgaW50ZWdlcnNcbiAgICBJbnRlZ2VyOiBbJ19faW50ZWdlcl9fJ10sXG5cbiAgICAvLyBNYXRjaGVzIHN0cmluZyB0aGF0IGlzIGEgdmFsaWQgaWRlbnRpZmllciwgd2lsbCBub3QgYWxsb3cgamF2YXNjcmlwdCByZXNlcnZlZCB3b3Jkc1xuICAgIElkZW50aWZpZXJTdHJpbmc6IC9eW2Etel8kXVswLTlhLXpfJF0qJC9pLFxuXG4gICAgLy8gTWF0Y2hlcyBoYXNoIChvYmplY3QpIHdpdGggdmFsdWVzIG1hdGNoaW5nIHBhdHRlcm5cbiAgICBPYmplY3RIYXNoOiBmdW5jdGlvbihwYXR0ZXJuKSB7XG4gICAgICAgIHJldHVybiBuZXcgT2JqZWN0SGFzaChwYXR0ZXJuKTtcbiAgICB9LFxuXG4gICAgU3ViY2xhc3M6IGZ1bmN0aW9uKFN1cGVyY2xhc3MsIG1hdGNoU3VwZXJjbGFzc1Rvbykge1xuICAgICAgICByZXR1cm4gbmV3IFN1YmNsYXNzKFN1cGVyY2xhc3MsIG1hdGNoU3VwZXJjbGFzc1Rvbyk7XG4gICAgfSxcblxuICAgIC8vIFhYWCBtYXRjaGVycyBzaG91bGQga25vdyBob3cgdG8gZGVzY3JpYmUgdGhlbXNlbHZlcyBmb3IgZXJyb3JzXG4gICAgRXJyb3I6IFR5cGVFcnJvcixcblxuICAgIC8vIE1ldGVvci5tYWtlRXJyb3JUeXBlKFwiTWF0Y2guRXJyb3JcIiwgZnVuY3Rpb24gKG1zZykge1xuICAgICAgICAvLyB0aGlzLm1lc3NhZ2UgPSBcIk1hdGNoIGVycm9yOiBcIiArIG1zZztcbiAgICAgICAgLy8gVGhlIHBhdGggb2YgdGhlIHZhbHVlIHRoYXQgZmFpbGVkIHRvIG1hdGNoLiBJbml0aWFsbHkgZW1wdHksIHRoaXMgZ2V0c1xuICAgICAgICAvLyBwb3B1bGF0ZWQgYnkgY2F0Y2hpbmcgYW5kIHJldGhyb3dpbmcgdGhlIGV4Y2VwdGlvbiBhcyBpdCBnb2VzIGJhY2sgdXAgdGhlXG4gICAgICAgIC8vIHN0YWNrLlxuICAgICAgICAvLyBFLmcuOiBcInZhbHNbM10uZW50aXR5LmNyZWF0ZWRcIlxuICAgICAgICAvLyB0aGlzLnBhdGggPSBcIlwiO1xuICAgICAgICAvLyBJZiB0aGlzIGdldHMgc2VudCBvdmVyIEREUCwgZG9uJ3QgZ2l2ZSBmdWxsIGludGVybmFsIGRldGFpbHMgYnV0IGF0IGxlYXN0XG4gICAgICAgIC8vIHByb3ZpZGUgc29tZXRoaW5nIGJldHRlciB0aGFuIDUwMCBJbnRlcm5hbCBzZXJ2ZXIgZXJyb3IuXG4gICAgLy8gICAgIHRoaXMuc2FuaXRpemVkRXJyb3IgPSBuZXcgTWV0ZW9yLkVycm9yKDQwMCwgXCJNYXRjaCBmYWlsZWRcIik7XG4gICAgLy8gfSksXG5cbiAgICAvLyBUZXN0cyB0byBzZWUgaWYgdmFsdWUgbWF0Y2hlcyBwYXR0ZXJuLiBVbmxpa2UgY2hlY2ssIGl0IG1lcmVseSByZXR1cm5zIHRydWVcbiAgICAvLyBvciBmYWxzZSAodW5sZXNzIGFuIGVycm9yIG90aGVyIHRoYW4gTWF0Y2guRXJyb3Igd2FzIHRocm93bikuXG4gICAgdGVzdDogZnVuY3Rpb24gKHZhbHVlLCBwYXR0ZXJuKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjaGVja1N1YnRyZWUodmFsdWUsIHBhdHRlcm4pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgTWF0Y2guRXJyb3IpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgLy8gUmV0aHJvdyBvdGhlciBlcnJvcnMuXG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuZnVuY3Rpb24gT3B0aW9uYWwocGF0dGVybikge1xuICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm47XG59O1xuXG5mdW5jdGlvbiBPbmVPZihjaG9pY2VzKSB7XG4gICAgaWYgKGNob2ljZXMubGVuZ3RoID09IDApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk11c3QgcHJvdmlkZSBhdCBsZWFzdCBvbmUgY2hvaWNlIHRvIE1hdGNoLk9uZU9mXCIpO1xuICAgIHRoaXMuY2hvaWNlcyA9IGNob2ljZXM7XG59O1xuXG5mdW5jdGlvbiBXaGVyZShjb25kaXRpb24pIHtcbiAgICB0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbjtcbn07XG5cbmZ1bmN0aW9uIE9iamVjdEluY2x1ZGluZyhwYXR0ZXJuKSB7XG4gICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjtcbn07XG5cbmZ1bmN0aW9uIE9iamVjdEhhc2gocGF0dGVybikge1xuICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm47XG59O1xuXG5mdW5jdGlvbiBTdWJjbGFzcyhTdXBlcmNsYXNzLCBtYXRjaFN1cGVyY2xhc3NUb28pIHtcbiAgICB0aGlzLlN1cGVyY2xhc3MgPSBTdXBlcmNsYXNzO1xuICAgIHRoaXMubWF0Y2hTdXBlcmNsYXNzID0gbWF0Y2hTdXBlcmNsYXNzVG9vO1xufTtcblxudmFyIHR5cGVvZkNoZWNrcyA9IFtcbiAgICBbU3RyaW5nLCBcInN0cmluZ1wiXSxcbiAgICBbTnVtYmVyLCBcIm51bWJlclwiXSxcbiAgICBbQm9vbGVhbiwgXCJib29sZWFuXCJdLFxuICAgIFtGdW5jdGlvbiwgXCJmdW5jdGlvblwiXSxcbiAgICAvLyBXaGlsZSB3ZSBkb24ndCBhbGxvdyB1bmRlZmluZWQgaW4gSlNPTiwgdGhpcyBpcyBnb29kIGZvciBvcHRpb25hbFxuICAgIC8vIGFyZ3VtZW50cyB3aXRoIE9uZU9mLlxuICAgIFt1bmRlZmluZWQsIFwidW5kZWZpbmVkXCJdXG5dO1xuXG5mdW5jdGlvbiBjaGVja1N1YnRyZWUodmFsdWUsIHBhdHRlcm4pIHtcbiAgICAvLyBNYXRjaCBhbnl0aGluZyFcbiAgICBpZiAocGF0dGVybiA9PT0gTWF0Y2guQW55KVxuICAgICAgICByZXR1cm47XG5cbiAgICAvLyBCYXNpYyBhdG9taWMgdHlwZXMuXG4gICAgLy8gRG8gbm90IG1hdGNoIGJveGVkIG9iamVjdHMgKGUuZy4gU3RyaW5nLCBCb29sZWFuKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHlwZW9mQ2hlY2tzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChwYXR0ZXJuID09PSB0eXBlb2ZDaGVja3NbaV1bMF0pIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IHR5cGVvZkNoZWNrc1tpXVsxXSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJFeHBlY3RlZCBcIiArIHR5cGVvZkNoZWNrc1tpXVsxXSArIFwiLCBnb3QgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwYXR0ZXJuID09PSBudWxsKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiRXhwZWN0ZWQgbnVsbCwgZ290IFwiICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvLyBNYXRjaC5JbnRlZ2VyIGlzIHNwZWNpYWwgdHlwZSBlbmNvZGVkIHdpdGggYXJyYXlcbiAgICBpZiAocGF0dGVybiA9PT0gTWF0Y2guSW50ZWdlcikge1xuICAgICAgICAvLyBUaGVyZSBpcyBubyBjb25zaXN0ZW50IGFuZCByZWxpYWJsZSB3YXkgdG8gY2hlY2sgaWYgdmFyaWFibGUgaXMgYSA2NC1iaXRcbiAgICAgICAgLy8gaW50ZWdlci4gT25lIG9mIHRoZSBwb3B1bGFyIHNvbHV0aW9ucyBpcyB0byBnZXQgcmVtaW5kZXIgb2YgZGl2aXNpb24gYnkgMVxuICAgICAgICAvLyBidXQgdGhpcyBtZXRob2QgZmFpbHMgb24gcmVhbGx5IGxhcmdlIGZsb2F0cyB3aXRoIGJpZyBwcmVjaXNpb24uXG4gICAgICAgIC8vIEUuZy46IDEuMzQ4MTkyMzA4NDkxODI0ZSsyMyAlIDEgPT09IDAgaW4gVjhcbiAgICAgICAgLy8gQml0d2lzZSBvcGVyYXRvcnMgd29yayBjb25zaXN0YW50bHkgYnV0IGFsd2F5cyBjYXN0IHZhcmlhYmxlIHRvIDMyLWJpdFxuICAgICAgICAvLyBzaWduZWQgaW50ZWdlciBhY2NvcmRpbmcgdG8gSmF2YVNjcmlwdCBzcGVjcy5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgKHZhbHVlIHwgMCkgPT09IHZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIHRocm93IG5ldyBNYXRjaC5FcnJvcignRXhwZWN0ZWQgSW50ZWdlciwgZ290ICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgPyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgOiB2YWx1ZSkpO1xuICAgIH1cblxuICAgIGlmIChwYXR0ZXJuID09PSBNYXRjaC5JZGVudGlmaWVyU3RyaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIE1hdGNoLklkZW50aWZpZXJTdHJpbmcudGVzdCh2YWx1ZSlcbiAgICAgICAgICAgICAgICAmJiBfanNLZXl3b3Jkcy5pbmRleE9mKGtleSkgPT0gLTEpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRocm93IG5ldyBNYXRjaC5FcnJvcignRXhwZWN0ZWQgaWRlbnRpZmllciBzdHJpbmcsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0ID8gSlNPTi5zdHJpbmdpZnkodmFsdWUpIDogdmFsdWUpKTtcbiAgICB9XG5cbiAgICAvLyBcIk9iamVjdFwiIGlzIHNob3J0aGFuZCBmb3IgTWF0Y2guT2JqZWN0SW5jbHVkaW5nKHt9KTtcbiAgICBpZiAocGF0dGVybiA9PT0gT2JqZWN0KVxuICAgICAgICBwYXR0ZXJuID0gTWF0Y2guT2JqZWN0SW5jbHVkaW5nKHt9KTtcblxuICAgIC8vIEFycmF5IChjaGVja2VkIEFGVEVSIEFueSwgd2hpY2ggaXMgaW1wbGVtZW50ZWQgYXMgYW4gQXJyYXkpLlxuICAgIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgaWYgKHBhdHRlcm4ubGVuZ3RoICE9PSAxKVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJCYWQgcGF0dGVybjogYXJyYXlzIG11c3QgaGF2ZSBvbmUgdHlwZSBlbGVtZW50XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkocGF0dGVybikpO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJFeHBlY3RlZCBhcnJheSwgZ290IFwiICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlRWxlbWVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY2hlY2tTdWJ0cmVlKHZhbHVlRWxlbWVudCwgcGF0dGVyblswXSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTWF0Y2guRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyLnBhdGggPSBfcHJlcGVuZFBhdGgoaW5kZXgsIGVyci5wYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFyYml0cmFyeSB2YWxpZGF0aW9uIGNoZWNrcy4gVGhlIGNvbmRpdGlvbiBjYW4gcmV0dXJuIGZhbHNlIG9yIHRocm93IGFcbiAgICAvLyBNYXRjaC5FcnJvciAoaWUsIGl0IGNhbiBpbnRlcm5hbGx5IHVzZSBjaGVjaygpKSB0byBmYWlsLlxuICAgIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgV2hlcmUpIHtcbiAgICAgICAgaWYgKHBhdHRlcm4uY29uZGl0aW9uKHZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gWFhYIHRoaXMgZXJyb3IgaXMgdGVycmlibGVcbiAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiRmFpbGVkIE1hdGNoLldoZXJlIHZhbGlkYXRpb25cIik7XG4gICAgfVxuXG5cbiAgICBpZiAocGF0dGVybiBpbnN0YW5jZW9mIE9wdGlvbmFsKVxuICAgICAgICBwYXR0ZXJuID0gTWF0Y2guT25lT2YodW5kZWZpbmVkLCBwYXR0ZXJuLnBhdHRlcm4pO1xuXG4gICAgaWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBPbmVPZikge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdHRlcm4uY2hvaWNlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjaGVja1N1YnRyZWUodmFsdWUsIHBhdHRlcm4uY2hvaWNlc1tpXSk7XG4gICAgICAgICAgICAgICAgLy8gTm8gZXJyb3I/IFlheSwgcmV0dXJuLlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIC8vIE90aGVyIGVycm9ycyBzaG91bGQgYmUgdGhyb3duLiBNYXRjaCBlcnJvcnMganVzdCBtZWFuIHRyeSBhbm90aGVyXG4gICAgICAgICAgICAgICAgLy8gY2hvaWNlLlxuICAgICAgICAgICAgICAgIGlmICghKGVyciBpbnN0YW5jZW9mIE1hdGNoLkVycm9yKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFhYWCB0aGlzIGVycm9yIGlzIHRlcnJpYmxlXG4gICAgICAgIHRocm93IG5ldyBNYXRjaC5FcnJvcihcIkZhaWxlZCBNYXRjaC5PbmVPZiBvciBNYXRjaC5PcHRpb25hbCB2YWxpZGF0aW9uXCIpO1xuICAgIH1cblxuICAgIC8vIEEgZnVuY3Rpb24gdGhhdCBpc24ndCBzb21ldGhpbmcgd2Ugc3BlY2lhbC1jYXNlIGlzIGFzc3VtZWQgdG8gYmUgYVxuICAgIC8vIGNvbnN0cnVjdG9yLlxuICAgIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgcGF0dGVybilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gWFhYIHdoYXQgaWYgLm5hbWUgaXNuJ3QgZGVmaW5lZFxuICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJFeHBlY3RlZCBcIiArIHBhdHRlcm4uY29uc3RydWN0b3IubmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIHVua25vd25LZXlzQWxsb3dlZCA9IGZhbHNlO1xuICAgIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgT2JqZWN0SW5jbHVkaW5nKSB7XG4gICAgICAgIHVua25vd25LZXlzQWxsb3dlZCA9IHRydWU7XG4gICAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnBhdHRlcm47XG4gICAgfVxuXG4gICAgaWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBPYmplY3RIYXNoKSB7XG4gICAgICAgIHZhciBrZXlQYXR0ZXJuID0gcGF0dGVybi5wYXR0ZXJuO1xuICAgICAgICB2YXIgZW1wdHlIYXNoID0gdHJ1ZTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgICAgICBlbXB0eUhhc2ggPSBmYWxzZTtcbiAgICAgICAgICAgIGNoZWNrKHZhbHVlW2tleV0sIGtleVBhdHRlcm4pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbXB0eUhhc2gpXG4gICAgICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJFeHBlY3RlZCBcIiArIHBhdHRlcm4uY29uc3RydWN0b3IubmFtZSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocGF0dGVybiBpbnN0YW5jZW9mIFN1YmNsYXNzKSB7XG4gICAgICAgIHZhciBTdXBlcmNsYXNzID0gcGF0dGVybi5TdXBlcmNsYXNzO1xuICAgICAgICBpZiAocGF0dGVybi5tYXRjaFN1cGVyY2xhc3MgJiYgdmFsdWUgPT0gU3VwZXJjbGFzcylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKCEgKHZhbHVlLnByb3RvdHlwZSBpbnN0YW5jZW9mIFN1cGVyY2xhc3MpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiRXhwZWN0ZWQgXCIgKyBwYXR0ZXJuLmNvbnN0cnVjdG9yLm5hbWUgKyBcIiBvZiBcIiArIFN1cGVyY2xhc3MubmFtZSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHBhdHRlcm4gIT09IFwib2JqZWN0XCIpXG4gICAgICAgIHRocm93IEVycm9yKFwiQmFkIHBhdHRlcm46IHVua25vd24gcGF0dGVybiB0eXBlXCIpO1xuXG4gICAgLy8gQW4gb2JqZWN0LCB3aXRoIHJlcXVpcmVkIGFuZCBvcHRpb25hbCBrZXlzLiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBkb1xuICAgIC8vIHN0cnVjdHVyYWwgbWF0Y2hlcyBhZ2FpbnN0IG9iamVjdHMgb2Ygc3BlY2lhbCB0eXBlcyB0aGF0IGhhcHBlbiB0byBtYXRjaFxuICAgIC8vIHRoZSBwYXR0ZXJuOiB0aGlzIHJlYWxseSBuZWVkcyB0byBiZSBhIHBsYWluIG9sZCB7T2JqZWN0fSFcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JylcbiAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiRXhwZWN0ZWQgb2JqZWN0LCBnb3QgXCIgKyB0eXBlb2YgdmFsdWUpO1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbClcbiAgICAgICAgdGhyb3cgbmV3IE1hdGNoLkVycm9yKFwiRXhwZWN0ZWQgb2JqZWN0LCBnb3QgbnVsbFwiKTtcblxuICAgIHZhciByZXF1aXJlZFBhdHRlcm5zID0ge307XG4gICAgdmFyIG9wdGlvbmFsUGF0dGVybnMgPSB7fTtcblxuICAgIF8uZWFjaEtleShwYXR0ZXJuLCBmdW5jdGlvbihzdWJQYXR0ZXJuLCBrZXkpIHtcbiAgICAgICAgaWYgKHBhdHRlcm5ba2V5XSBpbnN0YW5jZW9mIE9wdGlvbmFsKVxuICAgICAgICAgICAgb3B0aW9uYWxQYXR0ZXJuc1trZXldID0gcGF0dGVybltrZXldLnBhdHRlcm47XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJlcXVpcmVkUGF0dGVybnNba2V5XSA9IHBhdHRlcm5ba2V5XTtcbiAgICB9LCB0aGlzLCB0cnVlKTtcblxuICAgIF8uZWFjaEtleSh2YWx1ZSwgZnVuY3Rpb24oc3ViVmFsdWUsIGtleSkge1xuICAgICAgICB2YXIgc3ViVmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHJlcXVpcmVkUGF0dGVybnMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIGNoZWNrU3VidHJlZShzdWJWYWx1ZSwgcmVxdWlyZWRQYXR0ZXJuc1trZXldKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgcmVxdWlyZWRQYXR0ZXJuc1trZXldO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25hbFBhdHRlcm5zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjaGVja1N1YnRyZWUoc3ViVmFsdWUsIG9wdGlvbmFsUGF0dGVybnNba2V5XSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghdW5rbm93bktleXNBbGxvd2VkKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWF0Y2guRXJyb3IoXCJVbmtub3duIGtleVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTWF0Y2guRXJyb3IpXG4gICAgICAgICAgICAgICAgZXJyLnBhdGggPSBfcHJlcGVuZFBhdGgoa2V5LCBlcnIucGF0aCk7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICB9LCB0aGlzLCB0cnVlKTtcblxuICAgIF8uZWFjaEtleShyZXF1aXJlZFBhdHRlcm5zLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBNYXRjaC5FcnJvcihcIk1pc3Npbmcga2V5ICdcIiArIGtleSArIFwiJ1wiKTtcbiAgICB9LCB0aGlzLCB0cnVlKTtcbn07XG5cblxudmFyIF9qc0tleXdvcmRzID0gW1wiZG9cIiwgXCJpZlwiLCBcImluXCIsIFwiZm9yXCIsIFwibGV0XCIsIFwibmV3XCIsIFwidHJ5XCIsIFwidmFyXCIsIFwiY2FzZVwiLFxuICAgIFwiZWxzZVwiLCBcImVudW1cIiwgXCJldmFsXCIsIFwiZmFsc2VcIiwgXCJudWxsXCIsIFwidGhpc1wiLCBcInRydWVcIiwgXCJ2b2lkXCIsIFwid2l0aFwiLFxuICAgIFwiYnJlYWtcIiwgXCJjYXRjaFwiLCBcImNsYXNzXCIsIFwiY29uc3RcIiwgXCJzdXBlclwiLCBcInRocm93XCIsIFwid2hpbGVcIiwgXCJ5aWVsZFwiLFxuICAgIFwiZGVsZXRlXCIsIFwiZXhwb3J0XCIsIFwiaW1wb3J0XCIsIFwicHVibGljXCIsIFwicmV0dXJuXCIsIFwic3RhdGljXCIsIFwic3dpdGNoXCIsXG4gICAgXCJ0eXBlb2ZcIiwgXCJkZWZhdWx0XCIsIFwiZXh0ZW5kc1wiLCBcImZpbmFsbHlcIiwgXCJwYWNrYWdlXCIsIFwicHJpdmF0ZVwiLCBcImNvbnRpbnVlXCIsXG4gICAgXCJkZWJ1Z2dlclwiLCBcImZ1bmN0aW9uXCIsIFwiYXJndW1lbnRzXCIsIFwiaW50ZXJmYWNlXCIsIFwicHJvdGVjdGVkXCIsIFwiaW1wbGVtZW50c1wiLFxuICAgIFwiaW5zdGFuY2VvZlwiXTtcblxuLy8gQXNzdW1lcyB0aGUgYmFzZSBvZiBwYXRoIGlzIGFscmVhZHkgZXNjYXBlZCBwcm9wZXJseVxuLy8gcmV0dXJucyBrZXkgKyBiYXNlXG5mdW5jdGlvbiBfcHJlcGVuZFBhdGgoa2V5LCBiYXNlKSB7XG4gICAgaWYgKCh0eXBlb2Yga2V5KSA9PT0gXCJudW1iZXJcIiB8fCBrZXkubWF0Y2goL15bMC05XSskLykpXG4gICAgICAgIGtleSA9IFwiW1wiICsga2V5ICsgXCJdXCI7XG4gICAgZWxzZSBpZiAoIWtleS5tYXRjaChNYXRjaC5JZGVudGlmaWVyU3RyaW5nKSB8fCBfanNLZXl3b3Jkcy5pbmRleE9mKGtleSkgIT0gLTEpXG4gICAgICAgIGtleSA9IEpTT04uc3RyaW5naWZ5KFtrZXldKTtcblxuICAgIGlmIChiYXNlICYmIGJhc2VbMF0gIT09IFwiW1wiKVxuICAgICAgICByZXR1cm4ga2V5ICsgJy4nICsgYmFzZTtcbiAgICByZXR1cm4ga2V5ICsgYmFzZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogYG1pbG8udXRpbGBcbiAqL1xudmFyIHV0aWwgPSB7XG4gICAgbG9nZ2VyOiByZXF1aXJlKCcuL2xvZ2dlcicpLFxuICAgIGNoZWNrOiByZXF1aXJlKCcuL2NoZWNrJyksXG4gICAgZG9UOiByZXF1aXJlKCdkb3QnKVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB1dGlsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyA8YSBuYW1lPVwidXRpbHMtbG9nZ2VyXCI+PC9hPlxuLy8gbWlsby51dGlscy5sb2dnZXJcbi8vIC0tLS0tLS0tLS0tXG5cbi8vIEFwcGxpY2F0aW9uIGxvZ2dlciB0aGF0IGhhcyBlcnJvciwgd2FybiwgaW5mbyBhbmQgZGVidWdcbi8vIG1ldGhvZHMsIHRoYXQgY2FuIGJlIHN1cHByZXNzZWQgYnkgc2V0dGluZyBsb2cgbGV2ZWwuXG5cbi8vIFByb3BlcnRpZXM6XG5cbi8vIC0gbGV2ZWxcblxuLy8gICAtIDAgLSBlcnJvclxuLy8gICAtIDEgLSB3YXJuXG4vLyAgIC0gMiAtIGluZm9cbi8vICAgLSAzIC0gZGVidWcgKGRlZmF1bHQpXG5cbi8vIC0gZW5hYmxlZFxuXG4vLyAgIHRydWUgYnkgZGVmYXVsdC4gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgYWxsIGxvZ2dpbmcgaW4gYnJvd3NlciBjb25zb2xlLlxuXG5cbnZhciBMb2dnZXIgPSByZXF1aXJlKCcuL2xvZ2dlcl9jbGFzcycpO1xuXG52YXIgbG9nZ2VyID0gbmV3IExvZ2dlcih7IGxldmVsOiAzIH0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxvZ2dlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gIyMjIExvZ2dlciBDbGFzc1xuXG4vLyBQcm9wZXJ0aWVzOlxuXG4vLyAtIGxldmVsXG5cbi8vICAgLSAwIC0gZXJyb3Jcbi8vICAgLSAxIC0gd2FyblxuLy8gICAtIDIgLSBpbmZvXG4vLyAgIC0gMyAtIGRlYnVnIChkZWZhdWx0KVxuXG4vLyAtIGVuYWJsZWRcblxuLy8gICB0cnVlIGJ5IGRlZmF1bHQuIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIGFsbCBsb2dnaW5nIGluIGJyb3dzZXIgY29uc29sZS5cblxuXG52YXIgXyA9IHJlcXVpcmUoJ21vbC1wcm90bycpO1xuXG5cbi8qKlxuICogTG9nIGxldmVscy5cbiAqL1xuXG52YXIgbGV2ZWxzID0gW1xuICAgICdlcnJvcicsXG4gICAgJ3dhcm4nLFxuICAgICdpbmZvJyxcbiAgICAnZGVidWcnXG5dO1xuXG52YXIgbWF4TGV2ZWxMZW5ndGggPSBNYXRoLm1heC5hcHBseShNYXRoLCBsZXZlbHMubWFwKGZ1bmN0aW9uKGxldmVsKSB7IHJldHVybiBsZXZlbC5sZW5ndGg7IH0pKTtcblxuLyoqXG4gKiBDb2xvcnMgZm9yIGxvZyBsZXZlbHMuXG4gKi9cblxudmFyIGNvbG9ycyA9IFtcbiAgICAzMSxcbiAgICAzMyxcbiAgICAzNixcbiAgICA5MFxuXTtcblxuLyoqXG4gKiBQYWRzIHRoZSBuaWNlIG91dHB1dCB0byB0aGUgbG9uZ2VzdCBsb2cgbGV2ZWwuXG4gKi9cbmZ1bmN0aW9uIHBhZChzdHIpIHtcbiAgICBpZiAoc3RyLmxlbmd0aCA8IG1heExldmVsTGVuZ3RoKVxuICAgICAgICByZXR1cm4gc3RyICsgbmV3IEFycmF5KG1heExldmVsTGVuZ3RoIC0gc3RyLmxlbmd0aCArIDEpLmpvaW4oJyAnKTtcblxuICAgIHJldHVybiBzdHI7XG59O1xuXG5cbmZ1bmN0aW9uIGNvbG9yZWQoc3RyLCBjb2xvcikge1xuICAgIHJldHVybiAnXFx4MUJbJyArIGNvbG9yICsgJ20nICsgc3RyICsgJyAtXFx4MUJbMzltJztcbn1cblxuXG52YXIgREVGQVVMVF9PUFRJT05TID0ge1xuICAgIGxldmVsOiAzLFxuICAgIHRocm93TGV2ZWw6IC0xLCAvLyBuZXZlciB0aHJvd1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgbG9nUHJlZml4OiAnJ1xufVxuXG5cbi8qKlxuICogTG9nZ2VyIChjb25zb2xlKS5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG52YXIgTG9nZ2VyID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgICBfLmV4dGVuZCh0aGlzLCBERUZBVUxUX09QVElPTlMpO1xuICAgIF8uZXh0ZW5kKHRoaXMsIG9wdHMgfHwge30pO1xufTtcblxuXG4vKipcbiAqIExvZyBtZXRob2QuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Mb2dnZXIucHJvdG90eXBlLmxvZyA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgdmFyIGluZGV4ID0gbGV2ZWxzLmluZGV4T2YodHlwZSk7XG5cbiAgICBpZiAoISB0aGlzLmVuYWJsZWQgfHwgaW5kZXggPiB0aGlzLmxldmVsKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgIHZhciBhcmdzID0gXy5zbGljZShhcmd1bWVudHMsIDEpO1xuXG4gICAgaWYgKGluZGV4IDw9IHRoaXMudGhyb3dMZXZlbClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFt0aGlzLmxvZ1ByZWZpeCwgdHlwZSArICc6J10uY29uY2F0KGFyZ3MpLmpvaW4oJyAnKSk7XG5cbiAgICBjb25zb2xlLmxvZy5hcHBseShcbiAgICAgICAgICBjb25zb2xlXG4gICAgICAgICwgWyB0aGlzLmxvZ1ByZWZpeENvbG9yXG4gICAgICAgICAgICAgID8gJyAgICcgKyBjb2xvcmVkKHRoaXMubG9nUHJlZml4LCB0aGlzLmxvZ1ByZWZpeENvbG9yKVxuICAgICAgICAgICAgICA6IHRoaXMubG9nUHJlZml4LFxuICAgICAgICAgICAgKHRoaXMuY29sb3JzXG4gICAgICAgICAgICAgID8gJyAnICsgY29sb3JlZChwYWQodHlwZSksIGNvbG9yc1tpbmRleF0pXG4gICAgICAgICAgICAgIDogdHlwZSkgKyAnOidcbiAgICAgICAgICBdLmNvbmNhdChhcmdzKVxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogR2VuZXJhdGUgbWV0aG9kcy5cbiAqL1xuXG5sZXZlbHMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgIExvZ2dlci5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubG9nLmFwcGx5KHRoaXMsIFtuYW1lXS5jb25jYXQoXy50b0FycmF5KGFyZ3VtZW50cykpKTtcbiAgICB9O1xufSk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBMb2dnZXI7XG4iLCIvLyBkb1QuanNcbi8vIDIwMTEtMjAxNCwgTGF1cmEgRG9rdG9yb3ZhLCBodHRwczovL2dpdGh1Yi5jb20vb2xhZG8vZG9UXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5cbihmdW5jdGlvbigpIHtcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0dmFyIGRvVCA9IHtcblx0XHR2ZXJzaW9uOiBcIjEuMC4zXCIsXG5cdFx0dGVtcGxhdGVTZXR0aW5nczoge1xuXHRcdFx0ZXZhbHVhdGU6ICAgIC9cXHtcXHsoW1xcc1xcU10rPyhcXH0/KSspXFx9XFx9L2csXG5cdFx0XHRpbnRlcnBvbGF0ZTogL1xce1xcez0oW1xcc1xcU10rPylcXH1cXH0vZyxcblx0XHRcdGVuY29kZTogICAgICAvXFx7XFx7IShbXFxzXFxTXSs/KVxcfVxcfS9nLFxuXHRcdFx0dXNlOiAgICAgICAgIC9cXHtcXHsjKFtcXHNcXFNdKz8pXFx9XFx9L2csXG5cdFx0XHR1c2VQYXJhbXM6ICAgLyhefFteXFx3JF0pZGVmKD86XFwufFxcW1tcXCdcXFwiXSkoW1xcdyRcXC5dKykoPzpbXFwnXFxcIl1cXF0pP1xccypcXDpcXHMqKFtcXHckXFwuXSt8XFxcIlteXFxcIl0rXFxcInxcXCdbXlxcJ10rXFwnfFxce1teXFx9XStcXH0pL2csXG5cdFx0XHRkZWZpbmU6ICAgICAgL1xce1xceyMjXFxzKihbXFx3XFwuJF0rKVxccyooXFw6fD0pKFtcXHNcXFNdKz8pI1xcfVxcfS9nLFxuXHRcdFx0ZGVmaW5lUGFyYW1zOi9eXFxzKihbXFx3JF0rKTooW1xcc1xcU10rKS8sXG5cdFx0XHRjb25kaXRpb25hbDogL1xce1xce1xcPyhcXD8pP1xccyooW1xcc1xcU10qPylcXHMqXFx9XFx9L2csXG5cdFx0XHRpdGVyYXRlOiAgICAgL1xce1xce35cXHMqKD86XFx9XFx9fChbXFxzXFxTXSs/KVxccypcXDpcXHMqKFtcXHckXSspXFxzKig/OlxcOlxccyooW1xcdyRdKykpP1xccypcXH1cXH0pL2csXG5cdFx0XHR2YXJuYW1lOlx0XCJpdFwiLFxuXHRcdFx0c3RyaXA6XHRcdHRydWUsXG5cdFx0XHRhcHBlbmQ6XHRcdHRydWUsXG5cdFx0XHRzZWxmY29udGFpbmVkOiBmYWxzZSxcblx0XHRcdGRvTm90U2tpcEVuY29kZWQ6IGZhbHNlXG5cdFx0fSxcblx0XHR0ZW1wbGF0ZTogdW5kZWZpbmVkLCAvL2ZuLCBjb21waWxlIHRlbXBsYXRlXG5cdFx0Y29tcGlsZTogIHVuZGVmaW5lZCAgLy9mbiwgZm9yIGV4cHJlc3Ncblx0fSwgX2dsb2JhbHM7XG5cblx0ZG9ULmVuY29kZUhUTUxTb3VyY2UgPSBmdW5jdGlvbihkb05vdFNraXBFbmNvZGVkKSB7XG5cdFx0dmFyIGVuY29kZUhUTUxSdWxlcyA9IHsgXCImXCI6IFwiJiMzODtcIiwgXCI8XCI6IFwiJiM2MDtcIiwgXCI+XCI6IFwiJiM2MjtcIiwgJ1wiJzogXCImIzM0O1wiLCBcIidcIjogXCImIzM5O1wiLCBcIi9cIjogXCImIzQ3O1wiIH0sXG5cdFx0XHRtYXRjaEhUTUwgPSBkb05vdFNraXBFbmNvZGVkID8gL1smPD5cIidcXC9dL2cgOiAvJig/ISM/XFx3KzspfDx8PnxcInwnfFxcLy9nO1xuXHRcdHJldHVybiBmdW5jdGlvbihjb2RlKSB7XG5cdFx0XHRyZXR1cm4gY29kZSA/IGNvZGUudG9TdHJpbmcoKS5yZXBsYWNlKG1hdGNoSFRNTCwgZnVuY3Rpb24obSkge3JldHVybiBlbmNvZGVIVE1MUnVsZXNbbV0gfHwgbTt9KSA6IFwiXCI7XG5cdFx0fTtcblx0fTtcblxuXHRfZ2xvYmFscyA9IChmdW5jdGlvbigpeyByZXR1cm4gdGhpcyB8fCAoMCxldmFsKShcInRoaXNcIik7IH0oKSk7XG5cblx0aWYgKHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlLmV4cG9ydHMpIHtcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGRvVDtcblx0fSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuXHRcdGRlZmluZShmdW5jdGlvbigpe3JldHVybiBkb1Q7fSk7XG5cdH0gZWxzZSB7XG5cdFx0X2dsb2JhbHMuZG9UID0gZG9UO1xuXHR9XG5cblx0dmFyIHN0YXJ0ZW5kID0ge1xuXHRcdGFwcGVuZDogeyBzdGFydDogXCInKyhcIiwgICAgICBlbmQ6IFwiKSsnXCIsICAgICAgc3RhcnRlbmNvZGU6IFwiJytlbmNvZGVIVE1MKFwiIH0sXG5cdFx0c3BsaXQ6ICB7IHN0YXJ0OiBcIic7b3V0Kz0oXCIsIGVuZDogXCIpO291dCs9J1wiLCBzdGFydGVuY29kZTogXCInO291dCs9ZW5jb2RlSFRNTChcIiB9XG5cdH0sIHNraXAgPSAvJF4vO1xuXG5cdGZ1bmN0aW9uIHJlc29sdmVEZWZzKGMsIGJsb2NrLCBkZWYpIHtcblx0XHRyZXR1cm4gKCh0eXBlb2YgYmxvY2sgPT09IFwic3RyaW5nXCIpID8gYmxvY2sgOiBibG9jay50b1N0cmluZygpKVxuXHRcdC5yZXBsYWNlKGMuZGVmaW5lIHx8IHNraXAsIGZ1bmN0aW9uKG0sIGNvZGUsIGFzc2lnbiwgdmFsdWUpIHtcblx0XHRcdGlmIChjb2RlLmluZGV4T2YoXCJkZWYuXCIpID09PSAwKSB7XG5cdFx0XHRcdGNvZGUgPSBjb2RlLnN1YnN0cmluZyg0KTtcblx0XHRcdH1cblx0XHRcdGlmICghKGNvZGUgaW4gZGVmKSkge1xuXHRcdFx0XHRpZiAoYXNzaWduID09PSBcIjpcIikge1xuXHRcdFx0XHRcdGlmIChjLmRlZmluZVBhcmFtcykgdmFsdWUucmVwbGFjZShjLmRlZmluZVBhcmFtcywgZnVuY3Rpb24obSwgcGFyYW0sIHYpIHtcblx0XHRcdFx0XHRcdGRlZltjb2RlXSA9IHthcmc6IHBhcmFtLCB0ZXh0OiB2fTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRpZiAoIShjb2RlIGluIGRlZikpIGRlZltjb2RlXT0gdmFsdWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bmV3IEZ1bmN0aW9uKFwiZGVmXCIsIFwiZGVmWydcIitjb2RlK1wiJ109XCIgKyB2YWx1ZSkoZGVmKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0fSlcblx0XHQucmVwbGFjZShjLnVzZSB8fCBza2lwLCBmdW5jdGlvbihtLCBjb2RlKSB7XG5cdFx0XHRpZiAoYy51c2VQYXJhbXMpIGNvZGUgPSBjb2RlLnJlcGxhY2UoYy51c2VQYXJhbXMsIGZ1bmN0aW9uKG0sIHMsIGQsIHBhcmFtKSB7XG5cdFx0XHRcdGlmIChkZWZbZF0gJiYgZGVmW2RdLmFyZyAmJiBwYXJhbSkge1xuXHRcdFx0XHRcdHZhciBydyA9IChkK1wiOlwiK3BhcmFtKS5yZXBsYWNlKC8nfFxcXFwvZywgXCJfXCIpO1xuXHRcdFx0XHRcdGRlZi5fX2V4cCA9IGRlZi5fX2V4cCB8fCB7fTtcblx0XHRcdFx0XHRkZWYuX19leHBbcnddID0gZGVmW2RdLnRleHQucmVwbGFjZShuZXcgUmVnRXhwKFwiKF58W15cXFxcdyRdKVwiICsgZGVmW2RdLmFyZyArIFwiKFteXFxcXHckXSlcIiwgXCJnXCIpLCBcIiQxXCIgKyBwYXJhbSArIFwiJDJcIik7XG5cdFx0XHRcdFx0cmV0dXJuIHMgKyBcImRlZi5fX2V4cFsnXCIrcncrXCInXVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHZhciB2ID0gbmV3IEZ1bmN0aW9uKFwiZGVmXCIsIFwicmV0dXJuIFwiICsgY29kZSkoZGVmKTtcblx0XHRcdHJldHVybiB2ID8gcmVzb2x2ZURlZnMoYywgdiwgZGVmKSA6IHY7XG5cdFx0fSk7XG5cdH1cblxuXHRmdW5jdGlvbiB1bmVzY2FwZShjb2RlKSB7XG5cdFx0cmV0dXJuIGNvZGUucmVwbGFjZSgvXFxcXCgnfFxcXFwpL2csIFwiJDFcIikucmVwbGFjZSgvW1xcclxcdFxcbl0vZywgXCIgXCIpO1xuXHR9XG5cblx0ZG9ULnRlbXBsYXRlID0gZnVuY3Rpb24odG1wbCwgYywgZGVmKSB7XG5cdFx0YyA9IGMgfHwgZG9ULnRlbXBsYXRlU2V0dGluZ3M7XG5cdFx0dmFyIGNzZSA9IGMuYXBwZW5kID8gc3RhcnRlbmQuYXBwZW5kIDogc3RhcnRlbmQuc3BsaXQsIG5lZWRodG1sZW5jb2RlLCBzaWQgPSAwLCBpbmR2LFxuXHRcdFx0c3RyICA9IChjLnVzZSB8fCBjLmRlZmluZSkgPyByZXNvbHZlRGVmcyhjLCB0bXBsLCBkZWYgfHwge30pIDogdG1wbDtcblxuXHRcdHN0ciA9IChcInZhciBvdXQ9J1wiICsgKGMuc3RyaXAgPyBzdHIucmVwbGFjZSgvKF58XFxyfFxcbilcXHQqICt8ICtcXHQqKFxccnxcXG58JCkvZyxcIiBcIilcblx0XHRcdFx0XHQucmVwbGFjZSgvXFxyfFxcbnxcXHR8XFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLFwiXCIpOiBzdHIpXG5cdFx0XHQucmVwbGFjZSgvJ3xcXFxcL2csIFwiXFxcXCQmXCIpXG5cdFx0XHQucmVwbGFjZShjLmludGVycG9sYXRlIHx8IHNraXAsIGZ1bmN0aW9uKG0sIGNvZGUpIHtcblx0XHRcdFx0cmV0dXJuIGNzZS5zdGFydCArIHVuZXNjYXBlKGNvZGUpICsgY3NlLmVuZDtcblx0XHRcdH0pXG5cdFx0XHQucmVwbGFjZShjLmVuY29kZSB8fCBza2lwLCBmdW5jdGlvbihtLCBjb2RlKSB7XG5cdFx0XHRcdG5lZWRodG1sZW5jb2RlID0gdHJ1ZTtcblx0XHRcdFx0cmV0dXJuIGNzZS5zdGFydGVuY29kZSArIHVuZXNjYXBlKGNvZGUpICsgY3NlLmVuZDtcblx0XHRcdH0pXG5cdFx0XHQucmVwbGFjZShjLmNvbmRpdGlvbmFsIHx8IHNraXAsIGZ1bmN0aW9uKG0sIGVsc2VjYXNlLCBjb2RlKSB7XG5cdFx0XHRcdHJldHVybiBlbHNlY2FzZSA/XG5cdFx0XHRcdFx0KGNvZGUgPyBcIic7fWVsc2UgaWYoXCIgKyB1bmVzY2FwZShjb2RlKSArIFwiKXtvdXQrPSdcIiA6IFwiJzt9ZWxzZXtvdXQrPSdcIikgOlxuXHRcdFx0XHRcdChjb2RlID8gXCInO2lmKFwiICsgdW5lc2NhcGUoY29kZSkgKyBcIil7b3V0Kz0nXCIgOiBcIic7fW91dCs9J1wiKTtcblx0XHRcdH0pXG5cdFx0XHQucmVwbGFjZShjLml0ZXJhdGUgfHwgc2tpcCwgZnVuY3Rpb24obSwgaXRlcmF0ZSwgdm5hbWUsIGluYW1lKSB7XG5cdFx0XHRcdGlmICghaXRlcmF0ZSkgcmV0dXJuIFwiJzt9IH0gb3V0Kz0nXCI7XG5cdFx0XHRcdHNpZCs9MTsgaW5kdj1pbmFtZSB8fCBcImlcIitzaWQ7IGl0ZXJhdGU9dW5lc2NhcGUoaXRlcmF0ZSk7XG5cdFx0XHRcdHJldHVybiBcIic7dmFyIGFyclwiK3NpZCtcIj1cIitpdGVyYXRlK1wiO2lmKGFyclwiK3NpZCtcIil7dmFyIFwiK3ZuYW1lK1wiLFwiK2luZHYrXCI9LTEsbFwiK3NpZCtcIj1hcnJcIitzaWQrXCIubGVuZ3RoLTE7d2hpbGUoXCIraW5kditcIjxsXCIrc2lkK1wiKXtcIlxuXHRcdFx0XHRcdCt2bmFtZStcIj1hcnJcIitzaWQrXCJbXCIraW5kditcIis9MV07b3V0Kz0nXCI7XG5cdFx0XHR9KVxuXHRcdFx0LnJlcGxhY2UoYy5ldmFsdWF0ZSB8fCBza2lwLCBmdW5jdGlvbihtLCBjb2RlKSB7XG5cdFx0XHRcdHJldHVybiBcIic7XCIgKyB1bmVzY2FwZShjb2RlKSArIFwib3V0Kz0nXCI7XG5cdFx0XHR9KVxuXHRcdFx0KyBcIic7cmV0dXJuIG91dDtcIilcblx0XHRcdC5yZXBsYWNlKC9cXG4vZywgXCJcXFxcblwiKS5yZXBsYWNlKC9cXHQvZywgJ1xcXFx0JykucmVwbGFjZSgvXFxyL2csIFwiXFxcXHJcIilcblx0XHRcdC5yZXBsYWNlKC8oXFxzfDt8XFx9fF58XFx7KW91dFxcKz0nJzsvZywgJyQxJykucmVwbGFjZSgvXFwrJycvZywgXCJcIik7XG5cdFx0XHQvLy5yZXBsYWNlKC8oXFxzfDt8XFx9fF58XFx7KW91dFxcKz0nJ1xcKy9nLCckMW91dCs9Jyk7XG5cblx0XHRpZiAobmVlZGh0bWxlbmNvZGUpIHtcblx0XHRcdGlmICghYy5zZWxmY29udGFpbmVkICYmIF9nbG9iYWxzICYmICFfZ2xvYmFscy5fZW5jb2RlSFRNTCkgX2dsb2JhbHMuX2VuY29kZUhUTUwgPSBkb1QuZW5jb2RlSFRNTFNvdXJjZShjLmRvTm90U2tpcEVuY29kZWQpO1xuXHRcdFx0c3RyID0gXCJ2YXIgZW5jb2RlSFRNTCA9IHR5cGVvZiBfZW5jb2RlSFRNTCAhPT0gJ3VuZGVmaW5lZCcgPyBfZW5jb2RlSFRNTCA6IChcIlxuXHRcdFx0XHQrIGRvVC5lbmNvZGVIVE1MU291cmNlLnRvU3RyaW5nKCkgKyBcIihcIiArIChjLmRvTm90U2tpcEVuY29kZWQgfHwgJycpICsgXCIpKTtcIlxuXHRcdFx0XHQrIHN0cjtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBuZXcgRnVuY3Rpb24oYy52YXJuYW1lLCBzdHIpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdGlmICh0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIikgY29uc29sZS5sb2coXCJDb3VsZCBub3QgY3JlYXRlIGEgdGVtcGxhdGUgZnVuY3Rpb246IFwiICsgc3RyKTtcblx0XHRcdHRocm93IGU7XG5cdFx0fVxuXHR9O1xuXG5cdGRvVC5jb21waWxlID0gZnVuY3Rpb24odG1wbCwgZGVmKSB7XG5cdFx0cmV0dXJuIGRvVC50ZW1wbGF0ZSh0bXBsLCBudWxsLCBkZWYpO1xuXHR9O1xufSgpKTtcbiIsIi8qIGRvVCArIGF1dG8tY29tcGlsYXRpb24gb2YgZG9UIHRlbXBsYXRlc1xuICpcbiAqIDIwMTIsIExhdXJhIERva3Rvcm92YSwgaHR0cHM6Ly9naXRodWIuY29tL29sYWRvL2RvVFxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKlxuICogQ29tcGlsZXMgLmRlZiwgLmRvdCwgLmpzdCBmaWxlcyBmb3VuZCB1bmRlciB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKiBJdCBpZ25vcmVzIHN1Yi1kaXJlY3Rvcmllcy5cbiAqIFRlbXBsYXRlIGZpbGVzIGNhbiBoYXZlIG11bHRpcGxlIGV4dGVuc2lvbnMgYXQgdGhlIHNhbWUgdGltZS5cbiAqIEZpbGVzIHdpdGggLmRlZiBleHRlbnNpb24gY2FuIGJlIGluY2x1ZGVkIGluIG90aGVyIGZpbGVzIHZpYSB7eyNkZWYubmFtZX19XG4gKiBGaWxlcyB3aXRoIC5kb3QgZXh0ZW5zaW9uIGFyZSBjb21waWxlZCBpbnRvIGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kXG4gKiBjYW4gYmUgYWNjZXNzZWQgYXMgcmVuZGVyZXIuZmlsZW5hbWVcbiAqIEZpbGVzIHdpdGggLmpzdCBleHRlbnNpb24gYXJlIGNvbXBpbGVkIGludG8gLmpzIGZpbGVzLiBQcm9kdWNlZCAuanMgZmlsZSBjYW4gYmVcbiAqIGxvYWRlZCBhcyBhIGNvbW1vbkpTLCBBTUQgbW9kdWxlLCBvciBqdXN0IGluc3RhbGxlZCBpbnRvIGEgZ2xvYmFsIHZhcmlhYmxlXG4gKiAoZGVmYXVsdCBpcyBzZXQgdG8gd2luZG93LnJlbmRlcikuXG4gKiBBbGwgaW5saW5lIGRlZmluZXMgZGVmaW5lZCBpbiB0aGUgLmpzdCBmaWxlIGFyZVxuICogY29tcGlsZWQgaW50byBzZXBhcmF0ZSBmdW5jdGlvbnMgYW5kIGFyZSBhdmFpbGFibGUgdmlhIF9yZW5kZXIuZmlsZW5hbWUuZGVmaW5lbmFtZVxuICpcbiAqIEJhc2ljIHVzYWdlOlxuICogdmFyIGRvdHMgPSByZXF1aXJlKFwiZG90XCIpLnByb2Nlc3Moe3BhdGg6IFwiLi92aWV3c1wifSk7XG4gKiBkb3RzLm15dGVtcGxhdGUoe2ZvbzpcImhlbGxvIHdvcmxkXCJ9KTtcbiAqXG4gKiBUaGUgYWJvdmUgc25pcHBldCB3aWxsOlxuICogMS4gQ29tcGlsZSBhbGwgdGVtcGxhdGVzIGluIHZpZXdzIGZvbGRlciAoLmRvdCwgLmRlZiwgLmpzdClcbiAqIDIuIFBsYWNlIC5qcyBmaWxlcyBjb21waWxlZCBmcm9tIC5qc3QgdGVtcGxhdGVzIGludG8gdGhlIHNhbWUgZm9sZGVyLlxuICogICAgVGhlc2UgZmlsZXMgY2FuIGJlIHVzZWQgd2l0aCByZXF1aXJlLCBpLmUuIHJlcXVpcmUoXCIuL3ZpZXdzL215dGVtcGxhdGVcIikuXG4gKiAzLiBSZXR1cm4gYW4gb2JqZWN0IHdpdGggZnVuY3Rpb25zIGNvbXBpbGVkIGZyb20gLmRvdCB0ZW1wbGF0ZXMgYXMgaXRzIHByb3BlcnRpZXMuXG4gKiA0LiBSZW5kZXIgbXl0ZW1wbGF0ZSB0ZW1wbGF0ZS5cbiAqL1xuXG52YXIgZnMgPSByZXF1aXJlKFwiZnNcIiksXG5cdGRvVCA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4vZG9UXCIpO1xuXG5kb1QucHJvY2VzcyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0Ly9wYXRoLCBkZXN0aW5hdGlvbiwgZ2xvYmFsLCByZW5kZXJtb2R1bGUsIHRlbXBsYXRlU2V0dGluZ3Ncblx0cmV0dXJuIG5ldyBJbnN0YWxsRG90cyhvcHRpb25zKS5jb21waWxlQWxsKCk7XG59O1xuXG5mdW5jdGlvbiBJbnN0YWxsRG90cyhvKSB7XG5cdHRoaXMuX19wYXRoIFx0XHQ9IG8ucGF0aCB8fCBcIi4vXCI7XG5cdGlmICh0aGlzLl9fcGF0aFt0aGlzLl9fcGF0aC5sZW5ndGgtMV0gIT09ICcvJykgdGhpcy5fX3BhdGggKz0gJy8nO1xuXHR0aGlzLl9fZGVzdGluYXRpb25cdD0gby5kZXN0aW5hdGlvbiB8fCB0aGlzLl9fcGF0aDtcblx0aWYgKHRoaXMuX19kZXN0aW5hdGlvblt0aGlzLl9fZGVzdGluYXRpb24ubGVuZ3RoLTFdICE9PSAnLycpIHRoaXMuX19kZXN0aW5hdGlvbiArPSAnLyc7XG5cdHRoaXMuX19nbG9iYWxcdFx0PSBvLmdsb2JhbCB8fCBcIndpbmRvdy5yZW5kZXJcIjtcblx0dGhpcy5fX3JlbmRlcm1vZHVsZVx0PSBvLnJlbmRlcm1vZHVsZSB8fCB7fTtcblx0dGhpcy5fX3NldHRpbmdzIFx0PSBvLnRlbXBsYXRlU2V0dGluZ3MgPyBjb3B5KG8udGVtcGxhdGVTZXR0aW5ncywgY29weShkb1QudGVtcGxhdGVTZXR0aW5ncykpIDogdW5kZWZpbmVkO1xuXHR0aGlzLl9faW5jbHVkZXNcdFx0PSB7fTtcbn1cblxuSW5zdGFsbERvdHMucHJvdG90eXBlLmNvbXBpbGVUb0ZpbGUgPSBmdW5jdGlvbihwYXRoLCB0ZW1wbGF0ZSwgZGVmKSB7XG5cdGRlZiA9IGRlZiB8fCB7fTtcblx0dmFyIG1vZHVsZW5hbWUgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmxhc3RJbmRleE9mKFwiL1wiKSsxLCBwYXRoLmxhc3RJbmRleE9mKFwiLlwiKSlcblx0XHQsIGRlZnMgPSBjb3B5KHRoaXMuX19pbmNsdWRlcywgY29weShkZWYpKVxuXHRcdCwgc2V0dGluZ3MgPSB0aGlzLl9fc2V0dGluZ3MgfHwgZG9ULnRlbXBsYXRlU2V0dGluZ3Ncblx0XHQsIGNvbXBpbGVvcHRpb25zID0gY29weShzZXR0aW5ncylcblx0XHQsIGRlZmF1bHRjb21waWxlZCA9IGRvVC50ZW1wbGF0ZSh0ZW1wbGF0ZSwgc2V0dGluZ3MsIGRlZnMpXG5cdFx0LCBleHBvcnRzID0gW11cblx0XHQsIGNvbXBpbGVkID0gXCJcIlxuXHRcdCwgZm47XG5cblx0Zm9yICh2YXIgcHJvcGVydHkgaW4gZGVmcykge1xuXHRcdGlmIChkZWZzW3Byb3BlcnR5XSAhPT0gZGVmW3Byb3BlcnR5XSAmJiBkZWZzW3Byb3BlcnR5XSAhPT0gdGhpcy5fX2luY2x1ZGVzW3Byb3BlcnR5XSkge1xuXHRcdFx0Zm4gPSB1bmRlZmluZWQ7XG5cdFx0XHRpZiAodHlwZW9mIGRlZnNbcHJvcGVydHldID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRmbiA9IGRvVC50ZW1wbGF0ZShkZWZzW3Byb3BlcnR5XSwgc2V0dGluZ3MsIGRlZnMpO1xuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgZGVmc1twcm9wZXJ0eV0gPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0Zm4gPSBkZWZzW3Byb3BlcnR5XTtcblx0XHRcdH0gZWxzZSBpZiAoZGVmc1twcm9wZXJ0eV0uYXJnKSB7XG5cdFx0XHRcdGNvbXBpbGVvcHRpb25zLnZhcm5hbWUgPSBkZWZzW3Byb3BlcnR5XS5hcmc7XG5cdFx0XHRcdGZuID0gZG9ULnRlbXBsYXRlKGRlZnNbcHJvcGVydHldLnRleHQsIGNvbXBpbGVvcHRpb25zLCBkZWZzKTtcblx0XHRcdH1cblx0XHRcdGlmIChmbikge1xuXHRcdFx0XHRjb21waWxlZCArPSBmbi50b1N0cmluZygpLnJlcGxhY2UoJ2Fub255bW91cycsIHByb3BlcnR5KTtcblx0XHRcdFx0ZXhwb3J0cy5wdXNoKHByb3BlcnR5KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Y29tcGlsZWQgKz0gZGVmYXVsdGNvbXBpbGVkLnRvU3RyaW5nKCkucmVwbGFjZSgnYW5vbnltb3VzJywgbW9kdWxlbmFtZSk7XG5cdGZzLndyaXRlRmlsZVN5bmMocGF0aCwgXCIoZnVuY3Rpb24oKXtcIiArIGNvbXBpbGVkXG5cdFx0KyBcInZhciBpdHNlbGY9XCIgKyBtb2R1bGVuYW1lICsgXCIsIF9lbmNvZGVIVE1MPShcIiArIGRvVC5lbmNvZGVIVE1MU291cmNlLnRvU3RyaW5nKCkgKyBcIihcIiArIChzZXR0aW5ncy5kb05vdFNraXBFbmNvZGVkIHx8ICcnKSArIFwiKSk7XCJcblx0XHQrIGFkZGV4cG9ydHMoZXhwb3J0cylcblx0XHQrIFwiaWYodHlwZW9mIG1vZHVsZSE9PSd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSBtb2R1bGUuZXhwb3J0cz1pdHNlbGY7ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT09J2Z1bmN0aW9uJylkZWZpbmUoZnVuY3Rpb24oKXtyZXR1cm4gaXRzZWxmO30pO2Vsc2Uge1wiXG5cdFx0KyB0aGlzLl9fZ2xvYmFsICsgXCI9XCIgKyB0aGlzLl9fZ2xvYmFsICsgXCJ8fHt9O1wiICsgdGhpcy5fX2dsb2JhbCArIFwiWydcIiArIG1vZHVsZW5hbWUgKyBcIiddPWl0c2VsZjt9fSgpKTtcIik7XG59O1xuXG5mdW5jdGlvbiBhZGRleHBvcnRzKGV4cG9ydHMpIHtcblx0Zm9yICh2YXIgcmV0ID0nJywgaT0wOyBpPCBleHBvcnRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0cmV0ICs9IFwiaXRzZWxmLlwiICsgZXhwb3J0c1tpXSsgXCI9XCIgKyBleHBvcnRzW2ldK1wiO1wiO1xuXHR9XG5cdHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGNvcHkobywgdG8pIHtcblx0dG8gPSB0byB8fCB7fTtcblx0Zm9yICh2YXIgcHJvcGVydHkgaW4gbykge1xuXHRcdHRvW3Byb3BlcnR5XSA9IG9bcHJvcGVydHldO1xuXHR9XG5cdHJldHVybiB0bztcbn1cblxuZnVuY3Rpb24gcmVhZGRhdGEocGF0aCkge1xuXHR2YXIgZGF0YSA9IGZzLnJlYWRGaWxlU3luYyhwYXRoKTtcblx0aWYgKGRhdGEpIHJldHVybiBkYXRhLnRvU3RyaW5nKCk7XG5cdGNvbnNvbGUubG9nKFwicHJvYmxlbXMgd2l0aCBcIiArIHBhdGgpO1xufVxuXG5JbnN0YWxsRG90cy5wcm90b3R5cGUuY29tcGlsZVBhdGggPSBmdW5jdGlvbihwYXRoKSB7XG5cdHZhciBkYXRhID0gcmVhZGRhdGEocGF0aCk7XG5cdGlmIChkYXRhKSB7XG5cdFx0cmV0dXJuIGRvVC50ZW1wbGF0ZShkYXRhLFxuXHRcdFx0XHRcdHRoaXMuX19zZXR0aW5ncyB8fCBkb1QudGVtcGxhdGVTZXR0aW5ncyxcblx0XHRcdFx0XHRjb3B5KHRoaXMuX19pbmNsdWRlcykpO1xuXHR9XG59O1xuXG5JbnN0YWxsRG90cy5wcm90b3R5cGUuY29tcGlsZUFsbCA9IGZ1bmN0aW9uKCkge1xuXHRjb25zb2xlLmxvZyhcIkNvbXBpbGluZyBhbGwgZG9UIHRlbXBsYXRlcy4uLlwiKTtcblxuXHR2YXIgZGVmRm9sZGVyID0gdGhpcy5fX3BhdGgsXG5cdFx0c291cmNlcyA9IGZzLnJlYWRkaXJTeW5jKGRlZkZvbGRlciksXG5cdFx0aywgbCwgbmFtZTtcblxuXHRmb3IoIGsgPSAwLCBsID0gc291cmNlcy5sZW5ndGg7IGsgPCBsOyBrKyspIHtcblx0XHRuYW1lID0gc291cmNlc1trXTtcblx0XHRpZiAoL1xcLmRlZihcXC5kb3R8XFwuanN0KT8kLy50ZXN0KG5hbWUpKSB7XG5cdFx0XHRjb25zb2xlLmxvZyhcIkxvYWRlZCBkZWYgXCIgKyBuYW1lKTtcblx0XHRcdHRoaXMuX19pbmNsdWRlc1tuYW1lLnN1YnN0cmluZygwLCBuYW1lLmluZGV4T2YoJy4nKSldID0gcmVhZGRhdGEoZGVmRm9sZGVyICsgbmFtZSk7XG5cdFx0fVxuXHR9XG5cblx0Zm9yKCBrID0gMCwgbCA9IHNvdXJjZXMubGVuZ3RoOyBrIDwgbDsgaysrKSB7XG5cdFx0bmFtZSA9IHNvdXJjZXNba107XG5cdFx0aWYgKC9cXC5kb3QoXFwuZGVmfFxcLmpzdCk/JC8udGVzdChuYW1lKSkge1xuXHRcdFx0Y29uc29sZS5sb2coXCJDb21waWxpbmcgXCIgKyBuYW1lICsgXCIgdG8gZnVuY3Rpb25cIik7XG5cdFx0XHR0aGlzLl9fcmVuZGVybW9kdWxlW25hbWUuc3Vic3RyaW5nKDAsIG5hbWUuaW5kZXhPZignLicpKV0gPSB0aGlzLmNvbXBpbGVQYXRoKGRlZkZvbGRlciArIG5hbWUpO1xuXHRcdH1cblx0XHRpZiAoL1xcLmpzdChcXC5kb3R8XFwuZGVmKT8kLy50ZXN0KG5hbWUpKSB7XG5cdFx0XHRjb25zb2xlLmxvZyhcIkNvbXBpbGluZyBcIiArIG5hbWUgKyBcIiB0byBmaWxlXCIpO1xuXHRcdFx0dGhpcy5jb21waWxlVG9GaWxlKHRoaXMuX19kZXN0aW5hdGlvbiArIG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUuaW5kZXhPZignLicpKSArICcuanMnLFxuXHRcdFx0XHRcdHJlYWRkYXRhKGRlZkZvbGRlciArIG5hbWUpKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHRoaXMuX19yZW5kZXJtb2R1bGU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cblxuLyoqXG4gKiBbX19Qcm90b3R5cGUgZnVuY3Rpb25zX19dKHByb3RvX3Byb3RvdHlwZS5qcy5odG1sKVxuICpcbiAqIC0gW2V4dGVuZFByb3RvXShwcm90b19wcm90b3R5cGUuanMuaHRtbCNleHRlbmRQcm90bylcbiAqIC0gW2NyZWF0ZVN1YmNsYXNzXShwcm90b19wcm90b3R5cGUuanMuaHRtbCNjcmVhdGVTdWJjbGFzcylcbiAqIC0gW21ha2VTdWJjbGFzc10ocHJvdG9fcHJvdG90eXBlLmpzLmh0bWwjbWFrZVN1YmNsYXNzKVxuICogLSBbbmV3QXBwbHldKHByb3RvX3Byb3RvdHlwZS5qcy5odG1sI25ld0FwcGx5KVxuICovXG52YXIgcHJvdG90eXBlTWV0aG9kcyA9IHJlcXVpcmUoJy4vcHJvdG9fcHJvdG90eXBlJyk7XG5cblxuLyoqXG4gKiBbX19PYmplY3QgZnVuY3Rpb25zX19dKHByb3RvX29iamVjdC5qcy5odG1sKVxuICpcbiAqIC0gW2V4dGVuZF0ocHJvdG9fb2JqZWN0LmpzLmh0bWwjZXh0ZW5kKVxuICogLSBbY2xvbmVdKHByb3RvX29iamVjdC5qcy5odG1sI2Nsb25lKVxuICogLSBbZGVmaW5lUHJvcGVydHldKHByb3RvX29iamVjdC5qcy5odG1sI2RlZmluZVByb3BlcnR5KVxuICogLSBbZGVmaW5lUHJvcGVydGllc10ocHJvdG9fb2JqZWN0LmpzLmh0bWwjZGVmaW5lUHJvcGVydGllcylcbiAqIC0gW2RlZXBFeHRlbmRdKHByb3RvX29iamVjdC5qcy5odG1sI2RlZXBFeHRlbmQpXG4gKiAtIFtkZWVwQ2xvbmVdKHByb3RvX29iamVjdC5qcy5odG1sI2RlZXBDbG9uZSlcbiAqIC0gW2tleXNdKHByb3RvX29iamVjdC5qcy5odG1sI2tleXMpXG4gKiAtIFthbGxLZXlzXShwcm90b19vYmplY3QuanMuaHRtbCNhbGxLZXlzKVxuICogLSBbdmFsdWVzXShwcm90b19vYmplY3QuanMuaHRtbCN2YWx1ZXMpXG4gKiAtIFtrZXlPZl0ocHJvdG9fb2JqZWN0LmpzLmh0bWwja2V5T2YpXG4gKiAtIFthbGxLZXlzT2ZdKHByb3RvX29iamVjdC5qcy5odG1sI2FsbEtleXNPZilcbiAqIC0gW2VhY2hLZXldKHByb3RvX29iamVjdC5qcy5odG1sI2VhY2hLZXkpXG4gKiAtIFttYXBLZXlzXShwcm90b19vYmplY3QuanMuaHRtbCNtYXBLZXlzKVxuICogLSBbcmVkdWNlS2V5c10ocHJvdG9fb2JqZWN0LmpzLmh0bWwjcmVkdWNlS2V5cylcbiAqIC0gW2ZpbHRlcktleXNdKHByb3RvX29iamVjdC5qcy5odG1sI2ZpbHRlcktleXMpXG4gKiAtIFtzb21lS2V5XShwcm90b19vYmplY3QuanMuaHRtbCNzb21lS2V5KVxuICogLSBbZXZlcnlLZXldKHByb3RvX29iamVjdC5qcy5odG1sI2V2ZXJ5S2V5KVxuICogLSBbZmluZFZhbHVlXShwcm90b19vYmplY3QuanMuaHRtbCNmaW5kVmFsdWUpXG4gKiAtIFtmaW5kS2V5XShwcm90b19vYmplY3QuanMuaHRtbCNmaW5kS2V5KVxuICogLSBbcGlja0tleXNdKHByb3RvX29iamVjdC5qcy5odG1sI3BpY2tLZXlzKVxuICogLSBbb21pdEtleXNdKHByb3RvX29iamVjdC5qcy5odG1sI29taXRLZXlzKVxuICogLSBbaXNFcXVhbF0ocHJvdG9fb2JqZWN0LmpzLmh0bWwjaXNFcXVhbClcbiAqIC0gW2lzTm90XShwcm90b19vYmplY3QuanMuaHRtbCNpc05vdClcbiAqL1xudmFyIG9iamVjdE1ldGhvZHMgPSByZXF1aXJlKCcuL3Byb3RvX29iamVjdCcpO1xuXG5cbi8qKlxuICogW19fQXJyYXkgZnVuY3Rpb25zX19dKHByb3RvX2FycmF5LmpzLmh0bWwpXG4gKlxuICogLSBbZmluZF0ocHJvdG9fYXJyYXkuanMuaHRtbCNmaW5kKVxuICogLSBbZmluZEluZGV4XShwcm90b19hcnJheS5qcy5odG1sI2ZpbmRJbmRleClcbiAqIC0gW2FwcGVuZEFycmF5XShwcm90b19hcnJheS5qcy5odG1sI2FwcGVuZEFycmF5KVxuICogLSBbcHJlcGVuZEFycmF5XShwcm90b19hcnJheS5qcy5odG1sI3ByZXBlbmRBcnJheSlcbiAqIC0gW3NwbGljZUl0ZW1dKHByb3RvX2FycmF5LmpzLmh0bWwjc3BsaWNlSXRlbSlcbiAqIC0gW3RvQXJyYXldKHByb3RvX2FycmF5LmpzLmh0bWwjdG9BcnJheSlcbiAqIC0gW29iamVjdF0ocHJvdG9fYXJyYXkuanMuaHRtbCNvYmplY3QpXG4gKiAtIFttYXBUb09iamVjdF0ocHJvdG9fYXJyYXkuanMuaHRtbCNtYXBUb09iamVjdClcbiAqIC0gW3VuaXF1ZV0ocHJvdG9fYXJyYXkuanMuaHRtbCN1bmlxdWUpXG4gKiAtIFtkZWVwRm9yRWFjaF0ocHJvdG9fYXJyYXkuanMuaHRtbCNkZWVwRm9yRWFjaClcbiAqXG4gKiBGdW5jdGlvbnMgdGhhdCBBcnJheSBbaW1wbGVtZW50cyBuYXRpdmVseV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvcHJvdG90eXBlI01ldGhvZHMpIGFyZSBhbHNvIGFkZGVkIC0gdGhleSBjYW4gYmUgdXNlZCB3aXRoIGFycmF5LWxpa2Ugb2JqZWN0cyBhbmQgZm9yIGNoYWluaW5nIChuYXRpdmUgZnVuY3Rpb25zIGFyZSBhbHdheXMgY2FsbGVkKS5cbiAqL1xudmFyIGFycmF5TWV0aG9kcyA9IHJlcXVpcmUoJy4vcHJvdG9fYXJyYXknKTtcblxuXG4vKipcbiAqIFtfX0Z1bmN0aW9uIGZ1bmN0aW9uc19fXShwcm90b19mdW5jdGlvbi5qcy5odG1sKVxuICpcbiAqIC0gW21ha2VGdW5jdGlvbl0ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNtYWtlRnVuY3Rpb24pXG4gKiAtIFtwYXJ0aWFsXShwcm90b19mdW5jdGlvbi5qcy5odG1sI3BhcnRpYWwpXG4gKiAtIFtwYXJ0aWFsUmlnaHRdKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjcGFydGlhbFJpZ2h0KVxuICogLSBbbWVtb2l6ZV0ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNtZW1vaXplKVxuICogLSBbZGVsYXldKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjZGVsYXkpXG4gKiAtIFtkZWZlcl0ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNkZWZlcilcbiAqIC0gW2RlbGF5ZWRdKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjZGVsYXllZClcbiAqIC0gW2RlZmVycmVkXShwcm90b19mdW5jdGlvbi5qcy5odG1sI2RlZmVycmVkKVxuICogLSBbZGVmZXJUaWNrc10ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNkZWZlclRpY2tzKVxuICogLSBbZGVsYXlNZXRob2RdKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjZGVsYXlNZXRob2QpXG4gKiAtIFtkZWZlck1ldGhvZF0ocHJvdG9fZnVuY3Rpb24uanMuaHRtbCNkZWZlck1ldGhvZClcbiAqIC0gW2RlYm91bmNlXShwcm90b19mdW5jdGlvbi5qcy5odG1sI2RlYm91bmNlKVxuICogLSBbdGhyb3R0bGVdKHByb3RvX2Z1bmN0aW9uLmpzLmh0bWwjdGhyb3R0bGUpXG4gKiAtIFtvbmNlXShwcm90b19mdW5jdGlvbi5qcy5odG1sI29uY2UpXG4gKiAtIFt3YWl0Rm9yXShwcm90b19mdW5jdGlvbi5qcy5odG1sI3dhaXRGb3IpXG4qL1xudmFyIGZ1bmN0aW9uTWV0aG9kcyA9IHJlcXVpcmUoJy4vcHJvdG9fZnVuY3Rpb24nKTtcblxuXG4vKipcbiAqIFtfX1N0cmluZyBmdW5jdGlvbnNfX10ocHJvdG9fc3RyaW5nLmpzLmh0bWwpXG4gKlxuICogLSBbZmlyc3RVcHBlckNhc2VdKHByb3RvX3N0cmluZy5qcy5odG1sI2ZpcnN0VXBwZXJDYXNlKVxuICogLSBbZmlyc3RMb3dlckNhc2VdKHByb3RvX3N0cmluZy5qcy5odG1sI2ZpcnN0TG93ZXJDYXNlKVxuICogLSBbdG9SZWdFeHBdKHByb3RvX3N0cmluZy5qcy5odG1sI3RvUmVnRXhwKVxuICogLSBbdG9GdW5jdGlvbl0ocHJvdG9fc3RyaW5nLmpzLmh0bWwjdG9GdW5jdGlvbilcbiAqIC0gW3RvRGF0ZV0ocHJvdG9fc3RyaW5nLmpzLmh0bWwjdG9EYXRlKVxuICogLSBbdG9RdWVyeVN0cmluZ10ocHJvdG9fc3RyaW5nLmpzLmh0bWwjdG9RdWVyeVN0cmluZylcbiAqIC0gW2Zyb21RdWVyeVN0cmluZ10ocHJvdG9fc3RyaW5nLmpzLmh0bWwjZnJvbVF1ZXJ5U3RyaW5nKVxuICogLSBbanNvblBhcnNlXShwcm90b19zdHJpbmcuanMuaHRtbCNqc29uUGFyc2UpXG4gKiAtIFtoYXNoQ29kZV0ocHJvdG9fc3RyaW5nLmpzLmh0bWwjaGFzaENvZGUpXG4gKiAtIFt1blByZWZpeF0ocHJvdG9fc3RyaW5nLmpzLmh0bWwjdW5QcmVmaXgpXG4gKi9cbnZhciBzdHJpbmdNZXRob2RzID0gcmVxdWlyZSgnLi9wcm90b19zdHJpbmcnKTtcblxuXG4vKipcbiAqIFtfX051bWJlciBmdW5jdGlvbnNfX10ocHJvdG9fbnVtYmVyLmpzLmh0bWwpXG4gKlxuICogLSBbaXNOdW1lcmljXShwcm90b19udW1iZXIuanMuaHRtbCNpc051bWVyaWMpXG4gKi9cbnZhciBudW1iZXJNZXRob2RzID0gcmVxdWlyZSgnLi9wcm90b19udW1iZXInKTtcblxuXG4vKipcbiAqIFtfX1V0aWxpdHkgZnVuY3Rpb25zX19dKHByb3RvX3V0aWwuanMuaHRtbClcbiAqXG4gKiAtIFt0aW1lc10ocHJvdG9fdXRpbC5qcy5odG1sI3RpbWVzKVxuICogLSBbcmVwZWF0XShwcm90b191dGlsLmpzLmh0bWwjcmVwZWF0KVxuICogLSBbdGFwXShwcm90b191dGlsLmpzLmh0bWwjdGFwKVxuICogLSBbcmVzdWx0XShwcm90b191dGlsLmpzLmh0bWwjcmVzdWx0KVxuICogLSBbaWRlbnRpdHldKHByb3RvX3V0aWwuanMuaHRtbCNpZGVudGl0eSlcbiAqIC0gW3Byb3BlcnR5XShwcm90b191dGlsLmpzLmh0bWwjcHJvcGVydHkpXG4gKiAtIFtjb21wYXJlUHJvcGVydHldKHByb3RvX3V0aWwuanMuaHRtbCNjb21wYXJlUHJvcGVydHkpXG4gKiAtIFtub29wXShwcm90b191dGlsLmpzLmh0bWwjbm9vcClcbiAqL1xudmFyIHV0aWxNZXRob2RzID0gcmVxdWlyZSgnLi9wcm90b191dGlsJyk7XG5cblxuLyoqXG4gKiBDaGFpbmluZ1xuICogPT09PT09PT1cbiAqXG4gKiBgX2AgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgd3JhcHBlZCB2YWx1ZSAob2JqZWN0LCBmdW5jdGlvbiwgYXJyYXksIGV0Yy4pIHRvIGFsbG93IGNoYWluaW5nIG9mIFByb3RvIGZ1bmN0aW9ucy5cbiAqIFRvIHVud3JhcCwgYF9gIG1ldGhvZCBvZiBhIHdyYXBwZWQgdmFsdWUgc2hvdWxkIGJlIHVzZWQuXG4gKiBVc2FnZTpcbiAqIGBgYFxuICogdmFyIGFyciA9IF8oeyAwOiAzLCAxOiA0LCAyOiA1LCBsZW5ndGg6IDN9KVxuICogICAgICAgICAgICAgIC50b0FycmF5KClcbiAqICAgICAgICAgICAgICAucHJlcGVuZEFycmF5KFsxLCAyXSlcbiAqICAgICAgICAgICAgICAuYXBwZW5kQXJyYXkoWzYsIDcsIDhdKVxuICogICAgICAgICAgICAgIC5fKCk7XG4gKiBgYGBcbiAqIEEgd3JhcHBlZCBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgYF9gIChgUHJvdG9gIGNsYXNzKS5cbiAqXG4gKiBDaGFpbmluZyBpcyBpbXBsZW1lbnRlZCBmb3IgZGV2ZWxvcG1lbnQgY29udmVuaWVuY2UsIGJ1dCBpdCBoYXMgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQsIG5vdCBvbmx5IHRvIHdyYXAgYW5kIHVud3JhcCB2YWx1ZXMgYnV0IGluIGVhY2ggZnVuY3Rpb24gY2FsbC5cbiAqIEFsdGhvdWdoIGFsbCBQcm90byBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIGFzIG1ldGhvZHMgb3BlcmF0aW5nIG9uIHRoaXMgYW5kIHRoZSBvdmVyaGVhZCB0byByZWRlZmluZSB0aGVtIGFzIGZ1bmN0aW9ucyBpcyB2ZXJ5IHNtYWxsLCB0aGUgb3ZlcmhlYWQgdG8gcmVkZWZpbmUgdGhlbSBhcyBtZXRob2RzIG9mIHdyYXBwZWQgdmFsdWUgaXMgc2xpZ2h0bHkgaGlnaGVyIC0gY2hhaW5pbmcgaXMgMTUtMjUlIHNsb3dlciB0aGFuIHVzaW5nIGZ1bmN0aW9ucyAocHJvcGVydGllcyBvZiBfIHRoYXQgdGFrZSB0aGUgZmlyc3QgcGFyYW1ldGVyKS5cbiAqIEluIGNhc2VzIHdoZW4gcGVyZm9ybWFuY2UgaXMgY3JpdGljYWwsIHlvdSBtYXkgd2FudCB0byBhdm9pZCB1c2luZyBjaGFpbmluZy5cbiAqXG4gKiBAcGFyYW0ge0FueX0gc2VsZiBBIHZhbHVlIHRvIGJlIHdyYXBwZWRcbiAqIEByZXR1cm4ge1Byb3RvfVxuICovXG5mdW5jdGlvbiBQcm90byhzZWxmKSB7XG4gICAgLy8gd3JhcCBwYXNzZWQgcGFyYW1ldGVyIGluIF8gb2JqZWN0XG4gICAgdmFyIHdyYXBwZWQgPSBPYmplY3QuY3JlYXRlKFByb3RvLnByb3RvdHlwZSk7XG4gICAgd3JhcHBlZC5zZWxmID0gc2VsZjtcbiAgICByZXR1cm4gd3JhcHBlZDtcbn07XG5cbnZhciBfID0gUHJvdG87XG5cblxuLy8gc3RvcmUgcmF3IG1ldGhvZHMgZnJvbSBkaWZmZXJlbnQgbW9kdWxlcyBpbiBfXyBvYmplY3QgKGRvdWJsZSBcIl9cIilcbnZhciBfXyA9IHt9O1xuXG5vYmplY3RNZXRob2RzLmV4dGVuZC5jYWxsKF9fLCBvYmplY3RNZXRob2RzKTtcbl9fLmV4dGVuZC5jYWxsKF9fLCBwcm90b3R5cGVNZXRob2RzKTtcbl9fLmV4dGVuZC5jYWxsKF9fLCBhcnJheU1ldGhvZHMpO1xuX18uZXh0ZW5kLmNhbGwoX18sIHN0cmluZ01ldGhvZHMpO1xuX18uZXh0ZW5kLmNhbGwoX18sIG51bWJlck1ldGhvZHMpO1xuX18uZXh0ZW5kLmNhbGwoX18sIGZ1bmN0aW9uTWV0aG9kcyk7XG5fXy5leHRlbmQuY2FsbChfXywgdXRpbE1ldGhvZHMpO1xuXG5cbi8vIGFkZCBfXyBhcyBwcm9wZXJ0eSBvZiBQcm90bywgc28gdGhleSBjYW4gYmUgdXNlZCBhcyBtaXhpbnMgaW4gb3RoZXIgY2xhc3Nlc1xuX18uZGVmaW5lUHJvcGVydHkoUHJvdG8sICdfXycsIF9fKTtcblxuXG4vLyBhZGQgXyBtZXRob2QgdG8gdW53cmFwIHdyYXBwZWQgdmFsdWUgKFByb3RvIGluc3RhbmNlKVxuZnVuY3Rpb24gdW53cmFwUHJvdG8oKSB7IHJldHVybiB0aGlzLnNlbGY7IH1cbl9fLmV4dGVuZFByb3RvLmNhbGwoUHJvdG8sIHsgXzogdW53cmFwUHJvdG8gfSk7XG5cbi8vIGFkZCBjb25zdGFudHMgKGZ1bmN0aW9ucyB3aWxsIGJlIG92ZXJ3cml0dGVuKVxuX18uZXh0ZW5kLmNhbGwoUHJvdG8sIG9iamVjdE1ldGhvZHMuX2NvbnN0YW50cyk7XG5cbi8vIGFkZCBmdW5jdGlvbnMgdGhhdCB0YWtlIGZpcnN0IHBhcmFtZXRlciBpbnN0ZWFkIG9mIFwidGhpc1wiIHRvIFByb3RvXG52YXIgcHJvdG9GdW5jcyA9IF9fLm1hcEtleXMuY2FsbChfXywgdXRpbHMubWFrZVByb3RvRnVuY3Rpb24sIHRydWUpO1xuX18uZXh0ZW5kLmNhbGwoUHJvdG8sIHByb3RvRnVuY3MpO1xuXG4vLyBhZGQgUHJvdG8gd3JhcHBlZCB2YWx1ZSBpbnN0YW5jZSBtZXRob2RzIHRvIFByb3RvIHByb3RvdHlwZVxudmFyIHByb3RvSW5zdGFuY2VNZXRob2RzID0gX18ubWFwS2V5cy5jYWxsKF9fLCB1dGlscy5tYWtlUHJvdG9JbnN0YW5jZU1ldGhvZCwgdHJ1ZSk7XG5fXy5leHRlbmRQcm90by5jYWxsKFByb3RvLCBwcm90b0luc3RhbmNlTWV0aG9kcyk7XG5cblxuLyoqXG4gKiBJbiB3aW5kb3dzIGVudmlyb25tZW50LCBhIGdsb2JhbCBgX2AgdmFsdWUgaXMgcHJlc2VydmVkIGluIGBfLnVuZGVyc2NvcmVgXG4gKi9cbmlmICh0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnKSB7XG4gICAgLy8gcHJlc2VydmUgZXhpc3RpbmcgXyBvYmplY3RcbiAgICBpZiAod2luZG93Ll8pXG4gICAgICAgIFByb3RvLnVuZGVyc2NvcmUgPSB3aW5kb3cuX1xuXG4gICAgLy8gZXhwb3NlIGdsb2JhbCBfIGFuZCBQcm90b1xuICAgIHdpbmRvdy5fID0gUHJvdG87XG59XG5cbmlmICh0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKVxuICAgIC8vIGV4cG9ydCBmb3Igbm9kZS9icm93c2VyaWZ5XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBQcm90bztcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9fID0gcmVxdWlyZSgnLi9wcm90b19vYmplY3QnKVxuICAgICwgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cblxuLyoqXG4gKiAtIFtmaW5kXSgjZmluZClcbiAqIC0gW2ZpbmRJbmRleF0oI2ZpbmRJbmRleClcbiAqIC0gW2FwcGVuZEFycmF5XSgjYXBwZW5kQXJyYXkpXG4gKiAtIFtwcmVwZW5kQXJyYXldKCNwcmVwZW5kQXJyYXkpXG4gKiAtIFtzcGxpY2VJdGVtXSgjc3BsaWNlSXRlbSlcbiAqIC0gW3RvQXJyYXldKCN0b0FycmF5KVxuICogLSBbb2JqZWN0XSgjb2JqZWN0KVxuICogLSBbbWFwVG9PYmplY3RdKCNtYXBUb09iamVjdClcbiAqIC0gW3VuaXF1ZV0oI3VuaXF1ZSlcbiAqIC0gW2RlZXBGb3JFYWNoXSgjZGVlcEZvckVhY2gpXG4gKlxuICogVGhlc2UgbWV0aG9kcyBjYW4gYmUgW2NoYWluZWRdKHByb3RvLmpzLmh0bWwjUHJvdG8pLlxuICovXG52YXIgYXJyYXlNZXRob2RzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgLy8gZmluZDogc2VlIGJlbG93XG4gICAgLy8gZmluZEluZGV4OiBzZWUgYmVsb3dcbiAgICBhcHBlbmRBcnJheTogYXBwZW5kQXJyYXksXG4gICAgcHJlcGVuZEFycmF5OiBwcmVwZW5kQXJyYXksXG4gICAgdG9BcnJheTogdG9BcnJheSxcbiAgICBvYmplY3Q6IG9iamVjdCxcbiAgICBtYXBUb09iamVjdDogbWFwVG9PYmplY3QsXG4gICAgdW5pcXVlOiB1bmlxdWUsXG4gICAgZGVlcEZvckVhY2g6IGRlZXBGb3JFYWNoLFxuICAgIHNwbGljZUl0ZW06IHNwbGljZUl0ZW1cbn07XG5cblxuLyoqXG4gKiBGdW5jdGlvbnMgdGhhdCBBcnJheSBbaW1wbGVtZW50cyBuYXRpdmVseV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvcHJvdG90eXBlI01ldGhvZHMpIGFyZSBhbHNvIGluY2x1ZGVkIGZvciBjb252ZW5pZW5jZSAtIHRoZXkgY2FuIGJlIHVzZWQgd2l0aCBhcnJheS1saWtlIG9iamVjdHMgYW5kIGZvciBjaGFpbmluZyAobmF0aXZlIGZ1bmN0aW9ucyBhcmUgYWx3YXlzIGNhbGxlZCkuXG4gKiBUaGVzZSBtZXRob2RzIGNhbiBiZSBbY2hhaW5lZF0ocHJvdG8uanMuaHRtbCNQcm90bykgdG9vLlxuICovXG52YXIgbmF0aXZlQXJyYXlNZXRob2RzTmFtZXMgPSBbICdqb2luJywgJ3BvcCcsICdwdXNoJywgJ2NvbmNhdCcsXG4gICAgJ3JldmVyc2UnLCAnc2hpZnQnLCAndW5zaGlmdCcsICdzbGljZScsICdzcGxpY2UnLFxuICAgICdzb3J0JywgJ2ZpbHRlcicsICdmb3JFYWNoJywgJ3NvbWUnLCAnZXZlcnknLFxuICAgICdtYXAnLCAnaW5kZXhPZicsICdsYXN0SW5kZXhPZicsICdyZWR1Y2UnLCAncmVkdWNlUmlnaHQnXTtcblxudmFyIG5hdGl2ZUFycmF5TWV0aG9kcyA9IG1hcFRvT2JqZWN0LmNhbGwobmF0aXZlQXJyYXlNZXRob2RzTmFtZXMsXG4gICAgICAgIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGVbbWV0aG9kTmFtZV07XG4gICAgICAgIH0pO1xuXG5fXy5leHRlbmQuY2FsbChhcnJheU1ldGhvZHMsIG5hdGl2ZUFycmF5TWV0aG9kcyk7XG5cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBFUzYgW0FycmF5IF9fZmluZF9fIG1ldGhvZF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZmluZCkgKG5hdGl2ZSBtZXRob2QgaXMgdXNlZCBpZiBhdmFpbGFibGUpLlxuICogUmV0dXJucyBhcnJheSBlbGVtZW50IHRoYXQgcGFzc2VzIGNhbGxiYWNrIHRlc3QuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gc2VsZiBhcnJheSB0byBzZWFyY2ggaW5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHNob3VsZCByZXR1cm4gYHRydWVgIGZvciBpdGVtIHRvIHBhc3MgdGhlIHRlc3QsIHBhc3NlZCBgdmFsdWVgLCBgaW5kZXhgIGFuZCBgc2VsZmAgYXMgcGFyYW1ldGVyc1xuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgb3B0aW9uYWwgY29udGV4dCAoYHRoaXNgKSBvZiBjYWxsYmFjayBjYWxsXG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmFycmF5TWV0aG9kcy5maW5kID0gQXJyYXkucHJvdG90eXBlLmZpbmRcbiAgICB8fCB1dGlscy5tYWtlRmluZE1ldGhvZChhcnJheU1ldGhvZHMuZm9yRWFjaCwgJ3ZhbHVlJyk7XG5cblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBFUzYgW0FycmF5IF9fZmluZEluZGV4X18gbWV0aG9kXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9maW5kSW5kZXgpIChuYXRpdmUgbWV0aG9kIGlzIHVzZWQgaWYgYXZhaWxhYmxlKS5cbiAqIFJldHVybnMgdGhlIGluZGV4IG9mIGFycmF5IGVsZW1lbnQgdGhhdCBwYXNzZXMgY2FsbGJhY2sgdGVzdC4gUmV0dXJucyBgLTFgIGlmIG5vdCBmb3VuZC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBzZWxmIGFycmF5IHRvIHNlYXJjaCBpblxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgc2hvdWxkIHJldHVybiBgdHJ1ZWAgZm9yIGl0ZW0gdG8gcGFzcyB0aGUgdGVzdCwgcGFzc2VkIGB2YWx1ZWAsIGBpbmRleGAgYW5kIGBzZWxmYCBhcyBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBvcHRpb25hbCBjb250ZXh0IChgdGhpc2ApIG9mIGNhbGxiYWNrIGNhbGxcbiAqIEByZXR1cm4ge0ludGVnZXJ9XG4gKi9cbmFycmF5TWV0aG9kcy5maW5kSW5kZXggPSBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4XG4gICAgfHwgdXRpbHMubWFrZUZpbmRNZXRob2QoYXJyYXlNZXRob2RzLmZvckVhY2gsICdpbmRleCcpO1xuXG5cbi8qKlxuICogQXBwZW5kcyBgYXJyYXlUb0FwcGVuZGAgdG8gdGhlIGVuZCBvZiBhcnJheSBgc2VsZmAgaW4gcGxhY2UgKGNhbiBiZSBhbiBpbnN0YW5jZSBvZiBBcnJheSBvciBhcnJheS1saWtlIG9iamVjdCkuXG4gKiBDaGFuZ2VzIHRoZSB2YWx1ZSBvZiBgc2VsZmAgKGl0IHVzZXMgYEFycmF5LnByb3RvdHlwZS5zcGxpY2VgKSBhbmQgcmV0dXJucyBgc2VsZmAuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gc2VsZiBBbiBhcnJheSB0aGF0IHdpbGwgYmUgbW9kaWZpZWRcbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXktbGlrZX0gYXJyYXlUb0FwcGVuZCBBbiBhcnJheSB0aGF0IHdpbGwgYmUgYXBwZW5kZWRcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBhcHBlbmRBcnJheShhcnJheVRvQXBwZW5kKSB7XG4gICAgaWYgKCEgYXJyYXlUb0FwcGVuZC5sZW5ndGgpIHJldHVybiB0aGlzO1xuICAgIGlmICghIEFycmF5LmlzQXJyYXkoYXJyYXlUb0FwcGVuZCkpXG4gICAgICAgIGFycmF5VG9BcHBlbmQgPSB0b0FycmF5LmNhbGwoYXJyYXlUb0FwcGVuZCk7XG4gICAgXG4gICAgdmFyIGFyZ3MgPSBbdGhpcy5sZW5ndGgsIDBdLmNvbmNhdChhcnJheVRvQXBwZW5kKTtcbiAgICBhcnJheU1ldGhvZHMuc3BsaWNlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBQcmVwZW5kcyBgYXJyYXlUb1ByZXBlbmRgIHRvIHRoZSBiZWdpbm5pZyBvZiBhcnJheSBgc2VsZmAgaW4gcGxhY2UgKGNhbiBiZSBhbiBpbnN0YW5jZSBvZiBBcnJheSBvciBhcnJheS1saWtlIG9iamVjdCkuXG4gKiBDaGFuZ2VzIHRoZSB2YWx1ZSBvZiBgc2VsZmAgKGl0IHVzZXMgYEFycmF5LnByb3RvdHlwZS5zcGxpY2VgKSBhbmQgcmV0dXJucyBgc2VsZmAuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gc2VsZiBBbiBhcnJheSB0aGF0IHdpbGwgYmUgbW9kaWZpZWRcbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXktbGlrZX0gYXJyYXlUb0FwcGVuZCBBbiBhcnJheSB0aGF0IHdpbGwgYmUgcHJlcGVuZGVkXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gcHJlcGVuZEFycmF5KGFycmF5VG9QcmVwZW5kKSB7XG4gICAgaWYgKCEgYXJyYXlUb1ByZXBlbmQubGVuZ3RoKSByZXR1cm4gdGhpcztcbiAgICBpZiAoISBBcnJheS5pc0FycmF5KGFycmF5VG9QcmVwZW5kKSlcbiAgICAgICAgYXJyYXlUb1ByZXBlbmQgPSB0b0FycmF5LmNhbGwoYXJyYXlUb1ByZXBlbmQpO1xuXG4gICAgdmFyIGFyZ3MgPSBbMCwgMF0uY29uY2F0KGFycmF5VG9QcmVwZW5kKTtcbiAgICBhcnJheU1ldGhvZHMuc3BsaWNlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIGl0ZW0gZnJvbSBhcnJheSB0aGF0IGlzIGZvdW5kIHVzaW5nIGluZGV4T2YgKGkuZS4gJz09PScpXG4gKiBNb2RpZmllcyBvcmlnaW5hbCBhcnJheSBhbmQgcmV0dXJucyB0aGUgcmVmZXJlbmNlIHRvIGl0LlxuICogXG4gKiBAcGFyYW0ge0FycmF5fSBzZWxmIEFuIGFycmF5IHRoYXQgd2lsbCBiZSBtb2RpZmllZFxuICogQHBhcmFtICB7QW55fSBpdGVtIGl0ZW0gdG8gYmUgcmVtb3ZlZFxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHNwbGljZUl0ZW0oaXRlbSkge1xuICAgIHZhciBpbmRleCA9IHRoaXMuaW5kZXhPZihpdGVtKTtcbiAgICBpZiAoaW5kZXggPj0gMCkgdGhpcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBuZXcgYXJyYXkgY3JlYXRlZCBmcm9tIGFycmF5LWxpa2Ugb2JqZWN0IChlLmcuLCBgYXJndW1lbnRzYCBwc2V1ZG8tYXJyYXkpLlxuICpcbiAqIEBwYXJhbSB7QXJyYXktbGlrZX0gc2VsZiBPYmplY3Qgd2l0aCBudW1lcmljIHByb3BlcnR5IGxlbmd0aFxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHRvQXJyYXkoKSB7XG4gICAgcmV0dXJuIGFycmF5TWV0aG9kcy5zbGljZS5jYWxsKHRoaXMpO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBhbiBvYmplY3QgY3JlYXRlZCBmcm9tIHRoZSBhcnJheSBvZiBga2V5c2AgYW5kIG9wdGlvbmFsIGFycmF5IG9mIGB2YWx1ZXNgLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHNlbGYgQXJyYXkgb2Yga2V5c1xuICogQHBhcmFtIHtBcnJheXxhbnl9IHZhbHVlcyBPcHRpb25hbCBhcnJheSBvZiB2YWx1ZXMgb3IgdGhlIHZhbHVlIHRvIGJlIGFzc2lnbmVkIHRvIGVhY2ggcHJvcGVydHkuXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIG9iamVjdCh2YWx1ZXMpIHtcbiAgICB2YXIgb2JqID0ge31cbiAgICAgICAgLCB2YWx1ZXNJc0FycmF5ID0gQXJyYXkuaXNBcnJheSh2YWx1ZXMpO1xuICAgIGFycmF5TWV0aG9kcy5mb3JFYWNoLmNhbGwodGhpcywgZnVuY3Rpb24oa2V5LCBpbmRleCkge1xuICAgICAgICBvYmpba2V5XSA9IHZhbHVlc0lzQXJyYXkgPyB2YWx1ZXNbaW5kZXhdIDogdmFsdWVzO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG9iajtcbn1cblxuXG4vKipcbiAqIE1hcHMgYXJyYXkgdG8gb2JqZWN0LlxuICogQXJyYXkgZWxlbWVudHMgYmVjb21lIGtleXMsIHZhbHVlIGFyZSB0YWtlbiBmcm9tIGBjYWxsYmFja2AuXG4gKiBcbiAqIEBwYXJhbSB7QXJyYXl9IHNlbGYgQW4gYXJyYXkgd2hpY2ggdmFsdWVzIHdpbGwgYmVjb21lIGtleXMgb2YgdGhlIHJlc3VsdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgaXMgcGFzc2VkIGB2YWx1ZWAsIGBpbmRleGAgYW5kIGBzZWxmYCBhbmQgc2hvdWxkIHJldHVybiB2YWx1ZSB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIEFuIG9wdGlvbmFsIGNvbnRleHQgb2YgaXRlcmF0aW9uICh0aGUgdmFsdWVvZiBgdGhpc2ApLCB3aWxsIGJlIHVuZGVmaW5lZCBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgcGFzc2VkLlxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBtYXBUb09iamVjdChjYWxsYmFjaywgdGhpc0FyZykge1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHRoaXMsIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkge1xuICAgICAgICByZXN1bHRbdmFsdWVdID0gY2FsbGJhY2suY2FsbCh0aGlzQXJnLCB2YWx1ZSwgaW5kZXgsIHRoaXMpO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFycmF5IHdpdGhvdXQgZHVwbGljYXRlcy4gRG9lcyBub3QgbW9kaWZ5IG9yaWdpbmFsIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHNlbGYgb3JpZ2luYWwgYXJyYXlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGNvbXBhcmlzb24gZnVuY3Rpb24sIHNob3VsZCByZXR1cm4gdHJ1ZSBmb3IgZXF1YWwgaXRlbXMsIFwiPT09XCIgaXMgdXNlZCBpZiBub3QgcGFzc2VkLlxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHVuaXF1ZShjYWxsYmFjaykge1xuICAgIHZhciBmaWx0ZXJlZCA9IFtdO1xuICAgIGlmICghIGNhbGxiYWNrKVxuICAgICAgICBpdGVtSW5kZXggPSBpdGVtSW5kZXhPZjtcblxuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGl0ZW1JbmRleChpdGVtKTtcbiAgICAgICAgaWYgKGluZGV4ID09IC0xKVxuICAgICAgICAgICAgZmlsdGVyZWQucHVzaChpdGVtKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmaWx0ZXJlZDtcblxuXG4gICAgZnVuY3Rpb24gaXRlbUluZGV4KGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TWV0aG9kcy5maW5kSW5kZXguY2FsbChmaWx0ZXJlZCwgZnVuY3Rpb24oaXQpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhpdGVtLCBpdCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGl0ZW1JbmRleE9mKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkLmluZGV4T2YoaXRlbSk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogSXRlcmF0ZXMgYXJyYXkgYW5kIGVsZW1lbnRzIHRoYXQgYXJlIGFycmF5cyBjYWxsaW5nIGNhbGxiYWNrIHdpdGggZWFjaCBlbGVtZW50IHRoYXQgaXMgbm90IGFuIGFycmF5LiBDYW4gYmUgdXNlZCB0byBpdGVyYXRlIG92ZXIgYXJndW1lbnRzIGxpc3QgdG8gYXZvaWQgY2hlY2tpbmcgd2hldGhlciBhcnJheSBvciBsaXN0IG9mIHBhcmFtZXRlcnMgaXMgcGFzc2VkLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXktbGlrZX0gc2VsZiBhcnJheSBvZiBlbGVtZW50cyBhbmQgYXJyYXlzdG8gaXRlcmF0ZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGNhbGxlZCBmb3IgZWFjaCBpdGVtIHRoYXQgaXMgbm90IGFuIGFycmF5LiBDYWxsYmFjayBpcyBwYXNzZWQgaXRlbSwgaW5kZXggYW5kIG9yaWdpbmFsIGFycmF5IGFzIHBhcmFtZXRlcnMuXG4gKiBAcGFyYW0ge0FueX0gdGhpc0FyZyBvcHRpb25hbCBjYWxsYmFjayBlbnZvY2F0aW9uIGNvbnRleHRcbiAqL1xuZnVuY3Rpb24gZGVlcEZvckVhY2goY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICB2YXIgaW5kZXggPSAwLCBhcnIgPSB0aGlzO1xuICAgIF9kZWVwRm9yRWFjaC5jYWxsKHRoaXMpO1xuXG4gICAgZnVuY3Rpb24gX2RlZXBGb3JFYWNoKCkge1xuICAgICAgICBhcnJheU1ldGhvZHMuZm9yRWFjaC5jYWxsKHRoaXMsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgICAgICAgICAgX2RlZXBGb3JFYWNoLmNhbGwodmFsdWUpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWUsIGluZGV4KyssIGFycik7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgbWFrZVByb3RvRnVuY3Rpb24gPSByZXF1aXJlKCcuL3V0aWxzJykubWFrZVByb3RvRnVuY3Rpb25cbiAgICAsIHJlcGVhdCA9IHJlcXVpcmUoJy4vcHJvdG9fdXRpbCcpLnJlcGVhdDtcblxuXG4vKipcbiAqIC0gW21ha2VGdW5jdGlvbl0oI21ha2VGdW5jdGlvbilcbiAqIC0gW3BhcnRpYWxdKCNwYXJ0aWFsKVxuICogLSBbcGFydGlhbFJpZ2h0XSgjcGFydGlhbFJpZ2h0KVxuICogLSBbbWVtb2l6ZV0oI21lbW9pemUpXG4gKiAtIFtkZWxheV0oI2RlbGF5KVxuICogLSBbZGVmZXJdKCNkZWZlcilcbiAqIC0gW2RlbGF5ZWRdKCNkZWxheWVkKVxuICogLSBbZGVmZXJyZWRdKCNkZWZlcnJlZClcbiAqIC0gW2RlZmVyVGlja3NdKCNkZWZlclRpY2tzKVxuICogLSBbZGVsYXlNZXRob2RdKCNkZWxheU1ldGhvZClcbiAqIC0gW2RlZmVyTWV0aG9kXSgjZGVmZXJNZXRob2QpXG4gKiAtIFtkZWJvdW5jZV0oI2RlYm91bmNlKVxuICogLSBbdGhyb3R0bGVdKCN0aHJvdHRsZSlcbiAqIC0gW29uY2VdKCNvbmNlKVxuICogLSBbd2FpdEZvcl0oI3dhaXRGb3IpXG4gKiAtIFtub3RdKCNub3QpXG4gKlxuICogVGhlc2UgbWV0aG9kcyBjYW4gYmUgW2NoYWluZWRdKHByb3RvLmpzLmh0bWwjUHJvdG8pXG4gKi9cbnZhciBmdW5jdGlvbk1ldGhvZHMgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBtYWtlRnVuY3Rpb246IG1ha2VGdW5jdGlvbixcbiAgICBwYXJ0aWFsOiBwYXJ0aWFsLFxuICAgIHBhcnRpYWxSaWdodDogcGFydGlhbFJpZ2h0LFxuICAgIG1lbW9pemU6IG1lbW9pemUsXG4gICAgZGVsYXk6IGRlbGF5LFxuICAgIGRlZmVyOiBkZWZlcixcbiAgICBkZWxheWVkOiBkZWxheWVkLFxuICAgIGRlZmVycmVkOiBkZWZlcnJlZCxcbiAgICBkZWZlclRpY2tzOiBkZWZlclRpY2tzLFxuICAgIGRlbGF5TWV0aG9kOiBkZWxheU1ldGhvZCxcbiAgICBkZWZlck1ldGhvZDogZGVmZXJNZXRob2QsXG4gICAgZGVib3VuY2U6IGRlYm91bmNlLFxuICAgIHRocm90dGxlOiB0aHJvdHRsZSxcbiAgICBvbmNlOiBvbmNlLFxuICAgIHdhaXRGb3I6IHdhaXRGb3IsXG4gICAgbm90OiBub3Rcbn07XG5cblxudmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuXG5cbi8qKlxuICogU2ltaWxhcmx5IHRvIEZ1bmN0aW9uIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBmdW5jdGlvbiBmcm9tIGNvZGUuXG4gKiBVbmxpa2UgRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIGZ1bmN0aW9uIG5hbWVcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBuZXcgZnVuY3Rpb24gbmFtZVxuICogQHBhcmFtIHtTdHJpbmd9IGFyZzEsIGFyZzIsIC4uLiB0aGUgbmFtZXMgb2YgZnVuY3Rpb24gcGFyYW1ldGVyc1xuICogQHBhcmFtIHtTdHJpbmd9IGZ1bmNCb2R5IGZ1bmN0aW9uIGJvZHlcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBtYWtlRnVuY3Rpb24oYXJnMSwgYXJnMiwgZnVuY0JvZHkpIHtcbiAgICB2YXIgbmFtZSA9IHRoaXNcbiAgICAgICAgLCBjb3VudCA9IGFyZ3VtZW50cy5sZW5ndGggLSAxXG4gICAgICAgICwgZnVuY0JvZHkgPSBhcmd1bWVudHNbY291bnRdXG4gICAgICAgICwgZnVuY1xuICAgICAgICAsIGNvZGUgPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspXG4gICAgICAgIGNvZGUgKz0gJywgJyArIGFyZ3VtZW50c1tpXTtcbiAgICBjb2RlID0gWydmdW5jID0gZnVuY3Rpb24gJywgbmFtZSwgJygnLCBjb2RlLnNsaWNlKDIpLCAnKSB7XFxuJ1xuICAgICAgICAgICAgICAgICwgZnVuY0JvZHksICdcXG59J10uam9pbignJyk7XG4gICAgZXZhbChjb2RlKTtcbiAgICByZXR1cm4gZnVuYztcbn1cblxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiBhcyBhIHJlc3VsdCBvZiBwYXJ0aWFsIGZ1bmN0aW9uIGFwcGxpY2F0aW9uIHdpdGggdGhlIHBhc3NlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgRnVuY3Rpb24gdG8gYmUgYXBwbGllZFxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgQXJndW1lbnRzIGFmdGVyIHNlbGYgd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIGNhbGwgd2hlbiB0aGUgcGFydGlhbCBmdW5jdGlvbiBpcyBjYWxsZWQuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gcGFydGlhbCgpIHsgLy8gLCAuLi4gYXJndW1lbnRzXG4gICAgdmFyIGZ1bmMgPSB0aGlzO1xuICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XG4gICAgfTtcbn1cblxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiBhcyBhIHJlc3VsdCBvZiBwYXJ0aWFsIGZ1bmN0aW9uIGFwcGxpY2F0aW9uIHdpdGggdGhlIHBhc3NlZCBwYXJhbWV0ZXJzLCBidXQgcGFyYW1ldGVycyBhcmUgYXBwZW5kZWQgb24gdGhlIHJpZ2h0LlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgRnVuY3Rpb24gdG8gYmUgYXBwbGllZFxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgQXJndW1lbnRzIGFmdGVyIHNlbGYgd2lsbCBiZSBhcHBlbmRlZCBvbiB0aGUgcmlnaHQgdG8gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIGNhbGwgd2hlbiB0aGUgcGFydGlhbCBmdW5jdGlvbiBpcyBjYWxsZWQuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gcGFydGlhbFJpZ2h0KCkgeyAvLyAsIC4uLiBhcmd1bWVudHNcbiAgICB2YXIgZnVuYyA9IHRoaXM7XG4gICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBzbGljZS5jYWxsKGFyZ3VtZW50cykuY29uY2F0KGFyZ3MpKTtcbiAgICB9O1xufVxuXG5cbi8qKlxuICogQ3JlYXRlcyBhIG1lbW9pemVkIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uIHVzaW5nIHN1cHBsaWVkIGhhc2ggZnVuY3Rpb24gYXMga2V5LiBJZiB0aGUgaGFzaCBpcyBub3Qgc3VwcGxpZWQsIHVzZXMgaXRzIGZpcnN0IHBhcmFtZXRlciBhcyB0aGUgaGFzaC5cbiAqIFxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2VsZiBmdW5jdGlvbiB0byBiZSBtZW1vaXplZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFzaEZ1bmMgb3B0aW9uYWwgaGFzaCBmdW5jdGlvbiB0aGF0IGlzIHBhc3NlZCBhbGwgZnVuY3Rpb24gYXJndW1lbnRzIGFuZCBzaG91bGQgcmV0dXJuIGNhY2hlIGtleS5cbiAqIEBwYXJhbSB7SW50ZWdlcn0gbGltaXQgb3B0aW9uYWwgbWF4aW11bSBudW1iZXIgb2YgcmVzdWx0cyB0byBiZSBzdG9yZWQgaW4gdGhlIGNhY2hlLiAxMDAwIGJ5IGRlZmF1bHQuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gbWVtb2l6ZWQgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZShoYXNoRnVuYywgbGltaXQpIHtcbiAgICB2YXIgZnVuYyA9IHRoaXM7XG4gICAgdmFyIGNhY2hlID0ge30sIGtleXNMaXN0ID0gW107XG4gICAgbGltaXQgPSBsaW1pdCB8fCAxMDAwO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIga2V5ID0gaGFzaEZ1bmMgPyBoYXNoRnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogYXJndW1lbnRzWzBdO1xuICAgICAgICBpZiAoY2FjaGUuaGFzT3duUHJvcGVydHkoa2V5KSlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZVtrZXldO1xuXG4gICAgICAgIHZhciByZXN1bHQgPSBjYWNoZVtrZXldID0gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICBrZXlzTGlzdC5wdXNoKGtleSk7XG5cbiAgICAgICAgaWYgKGtleXNMaXN0Lmxlbmd0aCA+IGxpbWl0KVxuICAgICAgICAgICAgZGVsZXRlIGNhY2hlW2tleXNMaXN0LnNoaWZ0KCldO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbn1cblxuXG4vKipcbiAqIERlbGF5cyBmdW5jdGlvbiBleGVjdXRpb24gYnkgYSBnaXZlbiB0aW1lIGluIG1pbGxpc2Vjb25kcy5cbiAqIFRoZSBjb250ZXh0IGluIGZ1bmN0aW9uIHdoZW4gaXQgaXMgZXhlY3V0ZWQgaXMgc2V0IHRvIGBudWxsYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxmIGZ1bmN0aW9uIHRoYXQgZXhlY3V0aW9uIGhhcyB0byBiZSBkZWxheWVkXG4gKiBAcGFyYW0ge051bWJlcn0gd2FpdCBhcHByb3hpbWF0ZSBkYWxheSB0aW1lIGluIG1pbGxpc2Vjb25kc1xuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgb3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGRlbGF5KHdhaXQpIHsgLy8gLCBhcmd1bWVudHNcbiAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICByZXR1cm4gX2RlbGF5KHRoaXMsIHdhaXQsIGFyZ3MpO1xufVxuIFxuXG4vKipcbiAqIERlZmVycyBmdW5jdGlvbiBleGVjdXRpb24gKGV4ZWN1dGVzIGFzIHNvb24gYXMgZXhlY3V0aW9uIGxvb3AgYmVjb21lcyBmcmVlKVxuICogVGhlIGNvbnRleHQgaW4gZnVuY3Rpb24gd2hlbiBpdCBpcyBleGVjdXRlZCBpcyBzZXQgdG8gYG51bGxgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgZnVuY3Rpb24gdGhhdCBleGVjdXRpb24gaGFzIHRvIGJlIGRlbGF5ZWRcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIG9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBkZWZlcigpIHsgLy8gLCBhcmd1bWVudHNcbiAgICByZXR1cm4gX2RlbGF5KHRoaXMsIDEsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9kZWxheShmdW5jLCB3YWl0LCBhcmdzLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuYy5hcHBseS5iaW5kKGZ1bmMsIGNvbnRleHQgfHwgbnVsbCwgYXJncyksIHdhaXQpO1xufVxuXG4vKipcbiAqIFNhbWUgYXMgXy5kZWZlciwgdGFrZXMgZmlyc3QgYXJndW1lbnQgYXMgdGhlIGZ1bmN0aW9uIHRvIGJlIGRlZmVycmVkXG4gKi9cbnZhciBkZWZlckZ1bmMgPSBtYWtlUHJvdG9GdW5jdGlvbihkZWZlcik7XG5cbi8qKlxuICogRGVmZXJzIGZ1bmN0aW9uIGV4ZWN1dGlvbiBmb3IgYHRpbWVzYCB0aWNrcyAoZXhlY3V0ZXMgYWZ0ZXIgZXhlY3V0aW9uIGxvb3AgYmVjb21lcyBmcmVlIGB0aW1lc2AgdGltZXMpXG4gKiBUaGUgY29udGV4dCBpbiBmdW5jdGlvbiB3aGVuIGl0IGlzIGV4ZWN1dGVkIGlzIHNldCB0byBgbnVsbGAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2VsZiBmdW5jdGlvbiB0aGF0IGV4ZWN1dGlvbiBoYXMgdG8gYmUgZGVsYXllZFxuICogQHBhcmFtIHtJbnRlZ2VyfSB0aWNrcyBudW1iZXIgb2YgdGltZXMgdG8gZGVmZXIgZXhlY3V0aW9uXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBvcHRpb25hbCBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gZGVmZXJUaWNrcyh0aWNrcykgeyAvLyAsIGFyZ3VtZW50c1xuICAgIGlmICh0aWNrcyA8IDIpIHJldHVybiBkZWZlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHZhciBhcmdzID0gcmVwZWF0LmNhbGwoZGVmZXJGdW5jLCB0aWNrcyAtIDEpO1xuICAgIGFyZ3MgPSBhcmdzLmNvbmNhdCh0aGlzLCBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOyBcbiAgICByZXR1cm4gZGVmZXJGdW5jLmFwcGx5KG51bGwsIGFyZ3MpO1xufVxuXG5cbi8qKlxuICogV29ya3MgbGlrZSBfLmRlbGF5IGJ1dCBhbGxvd3MgdG8gZGVmZXIgbWV0aG9kIGNhbGwgb2YgYHNlbGZgIHdoaWNoIHdpbGwgYmUgdGhlIGZpcnN0IF8uZGVsYXlNZXRob2QgcGFyYW1ldGVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgb2JqZWN0IHRvIGRlbGF5IG1ldGhvZCBjYWxsIG9mXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gZnVuY09yTWV0aG9kTmFtZSBmdW5jdGlvbiBvciBuYW1lIG9mIG1ldGhvZFxuICogQHBhcmFtIHtOdW1iZXJ9IHdhaXQgYXBwcm94aW1hdGUgZGFsYXkgdGltZSBpbiBtaWxsaXNlY29uZHNcbiAqIEBwYXJhbSB7TGlzdH0gYXJndW1lbnRzIGFyZ3VtZW50cyB0byBwYXNzIHRvIG1ldGhvZFxuICovXG5mdW5jdGlvbiBkZWxheU1ldGhvZChmdW5jT3JNZXRob2ROYW1lLCB3YWl0KSB7IC8vICwgLi4uIGFyZ3VtZW50c1xuICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgIHJldHVybiBfZGVsYXlNZXRob2QodGhpcywgZnVuY09yTWV0aG9kTmFtZSwgd2FpdCwgYXJncyk7XG59XG5cblxuLyoqXG4gKiBXb3JrcyBsaWtlIF8uZGVmZXIgYnV0IGFsbG93cyB0byBkZWZlciBtZXRob2QgY2FsbCBvZiBgc2VsZmAgd2hpY2ggd2lsbCBiZSB0aGUgZmlyc3QgXy5kZWZlck1ldGhvZCBwYXJhbWV0ZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBvYmplY3QgdG8gZGVmZXIgbWV0aG9kIGNhbGwgb2ZcbiAqIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBmdW5jT3JNZXRob2ROYW1lIGZ1bmN0aW9uIG9yIG5hbWUgb2YgbWV0aG9kXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBhcmd1bWVudHMgdG8gcGFzcyB0byBtZXRob2RcbiAqL1xuZnVuY3Rpb24gZGVmZXJNZXRob2QoZnVuY09yTWV0aG9kTmFtZSkgeyAvLyAsIC4uLiBhcmd1bWVudHNcbiAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICByZXR1cm4gX2RlbGF5TWV0aG9kKHRoaXMsIGZ1bmNPck1ldGhvZE5hbWUsIDEsIGFyZ3MpO1xufVxuXG5mdW5jdGlvbiBfZGVsYXlNZXRob2Qob2JqZWN0LCBmdW5jT3JNZXRob2ROYW1lLCB3YWl0LCBhcmdzKSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBmdW5jID0gdHlwZW9mIGZ1bmNPck1ldGhvZE5hbWUgPT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgPyBvYmplY3RbZnVuY09yTWV0aG9kTmFtZV1cbiAgICAgICAgICAgICAgICAgICAgOiBmdW5jT3JNZXRob2ROYW1lO1xuICAgICAgICBmdW5jLmFwcGx5KG9iamVjdCwgYXJncyk7XG4gICAgfSwgd2FpdCk7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGZ1bmN0aW9uIHRoYXQgd2lsbCBleGVjdXRlIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBgd2FpdGAgbXMgYWZ0ZXIgaXQgaGFzIGJlZW4gY2FsbGVkXG4gKiBUaGUgY29udGV4dCBpbiBmdW5jdGlvbiB3aGVuIGl0IGlzIGV4ZWN1dGVkIGlzIHNldCB0byBgbnVsbGAuXG4gKiBBcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBhcmUgYXBwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gZGVsYXllZC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxmIGZ1bmN0aW9uIHdoaWNoIGV4ZWN1dGlvbiBoYXMgdG8gYmUgZGVmZXJyZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3YWl0IGFwcHJveGltYXRlIGRhbGF5IHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gKiBAcGFyYW0ge0xpc3R9IGFyZ3VtZW50cyBvcHRpb25hbCBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBkZWxheWVkKHdhaXQpIHsgLy8sIC4uLiBhcmd1bWVudHNcbiAgICB2YXIgZnVuYyA9IHRoaXNcbiAgICAgICAgLCBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHsgLy8gLi4uIGFyZ3VtZW50c1xuICAgICAgICB2YXIgcGFzc0FyZ3MgPSBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgICAgICByZXR1cm4gX2RlbGF5KGZ1bmMsIHdhaXQsIHBhc3NBcmdzLCB0aGlzKTtcbiAgICB9O1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBmdW5jdGlvbiB0aGF0IHdpbGwgZXhlY3V0ZSB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gb24gdGhlIG5leHQgdGljayBvbmNlIGl0IGhhcyBiZWVuIGNhbGxlZFxuICogVGhlIGNvbnRleHQgaW4gZnVuY3Rpb24gd2hlbiBpdCBpcyBleGVjdXRlZCBpcyBzZXQgdG8gYG51bGxgLlxuICogQXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gYXJlIGFwcGVuZGVkIHRvIHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIGRlZmVycmVkLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgZnVuY3Rpb24gd2hpY2ggZXhlY3V0aW9uIGhhcyB0byBiZSBkZWZlcnJlZFxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgb3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gZGVmZXJyZWQoKSB7IC8vLCAuLi4gYXJndW1lbnRzXG4gICAgdmFyIGZ1bmMgPSB0aGlzXG4gICAgICAgICwgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7IC8vIC4uLiBhcmd1bWVudHNcbiAgICAgICAgdmFyIHBhc3NBcmdzID0gYXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICAgICAgcmV0dXJuIF9kZWxheShmdW5jLCAxLCBwYXNzQXJncywgdGhpcyk7XG4gICAgfTtcbn1cblxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgY2FsbCBvcmlnaW5hbCBmdW5jdGlvbiBvbmNlIGl0IGhhcyBub3QgYmVlbiBjYWxsZWQgZm9yIGEgc3BlY2lmaWVkIHRpbWVcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxmIGZ1bmN0aW9uIHRoYXQgZXhlY3V0aW9uIGhhcyB0byBiZSBkZWxheWVkXG4gKiBAcGFyYW0ge051bWJlcn0gd2FpdCBhcHByb3hpbWF0ZSBkYWxheSB0aW1lIGluIG1pbGxpc2Vjb25kc1xuICogQHBhcmFtIHtCb29sZWFufSBpbW1lZGlhdGUgdHJ1ZSB0byBpbnZva2UgZnVuY2l0b24gaW1tZWRpYXRlbHkgYW5kIHRoZW4gaWdub3JlIGZvbGxvd2luZyBjYWxscyBmb3Igd2FpdCBtaWxsaXNlY29uZHNcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBkZWJvdW5jZSh3YWl0LCBpbW1lZGlhdGUpIHtcbiAgICB2YXIgZnVuYyA9IHRoaXM7IC8vIGZpcnN0IHBhcmFtZXRlciBvZiBfLmRlYm91bmNlXG4gICAgdmFyIHRpbWVvdXQsIGFyZ3MsIGNvbnRleHQsIHRpbWVzdGFtcCwgcmVzdWx0O1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgY29udGV4dCA9IHRoaXM7IC8vIHN0b3JlIG9yaWdpbmFsIGNvbnRleHRcbiAgICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdmFyIGNhbGxOb3cgPSBpbW1lZGlhdGUgJiYgISB0aW1lb3V0O1xuICAgICAgICBpZiAoISB0aW1lb3V0KVxuICAgICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQpO1xuICAgICAgICBpZiAoY2FsbE5vdylcbiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgZnVuY3Rpb24gbGF0ZXIoKSB7XG4gICAgICAgICAgICB2YXIgbGFzdCA9IERhdGUubm93KCkgLSB0aW1lc3RhbXA7XG4gICAgICAgICAgICBpZiAobGFzdCA8IHdhaXQpXG4gICAgICAgICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQgLSBsYXN0KTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmICghIGltbWVkaWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24sIHRoYXQsIHdoZW4gaW52b2tlZCwgd2lsbCBvbmx5IGJlIHRyaWdnZXJlZCBhdCBtb3N0IG9uY2UgZHVyaW5nIGEgZ2l2ZW4gd2luZG93IG9mIHRpbWUuIFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgZnVuY3Rpb24gdGhhdCBleGVjdXRpb24gaGFzIHRvIGJlIGRlbGF5ZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3YWl0IGFwcHJveGltYXRlIGRlbGF5IHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBge2xlYWRpbmc6IGZhbHNlfWAgdG8gZGlzYWJsZSB0aGUgZXhlY3V0aW9uIG9uIHRoZSBsZWFkaW5nIGVkZ2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiB0aHJvdHRsZSh3YWl0LCBvcHRpb25zKSB7XG4gICAgdmFyIGZ1bmMgPSB0aGlzOyAvLyBmaXJzdCBwYXJhbWV0ZXIgb2YgXy50aHJvdHRsZVxuICAgIHZhciBjb250ZXh0LCBhcmdzLCByZXN1bHQ7XG4gICAgdmFyIHRpbWVvdXQgPSBudWxsO1xuICAgIHZhciBwcmV2aW91cyA9IDA7XG4gICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcblxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGlmICghcHJldmlvdXMgJiYgb3B0aW9ucy5sZWFkaW5nID09PSBmYWxzZSkgcHJldmlvdXMgPSBub3c7XG4gICAgICAgIHZhciByZW1haW5pbmcgPSB3YWl0IC0gKG5vdyAtIHByZXZpb3VzKTtcbiAgICAgICAgY29udGV4dCA9IHRoaXM7XG4gICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIGlmIChyZW1haW5pbmcgPD0gMCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICAgICAgICBwcmV2aW91cyA9IG5vdztcbiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRpbWVvdXQgJiYgb3B0aW9ucy50cmFpbGluZyAhPT0gZmFsc2UpXG4gICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgcmVtYWluaW5nKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBsYXRlcigpIHtcbiAgICAgICAgcHJldmlvdXMgPSBvcHRpb25zLmxlYWRpbmcgPT09IGZhbHNlID8gMCA6IERhdGUubm93KCk7XG4gICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIENhbGwgcGFzc2VkIGZ1bmN0aW9uIG9ubHkgb25jZVxuICogQHJldHVybiB7RnVuY3Rpb259IHNlbGZcbiAqL1xuZnVuY3Rpb24gb25jZSgpIHtcbiAgICB2YXIgZnVuYyA9IHRoaXNcbiAgICAgICAgLCByYW4gPSBmYWxzZVxuICAgICAgICAsIG1lbW87XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAocmFuKSByZXR1cm4gbWVtbztcbiAgICAgICAgcmFuID0gdHJ1ZTtcbiAgICAgICAgbWVtbyA9IGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgZnVuYyA9IG51bGw7XG4gICAgICAgIHJldHVybiBtZW1vO1xuICAgIH07XG59XG5cblxuLyoqXG4gKiBFeGVjdXRlIGEgZnVuY3Rpb24gd2hlbiB0aGUgY29uZGl0aW9uIGZ1bmN0aW9uIHJldHVybnMgYSB0cnV0aHkgdmFsdWVcbiAqIGl0IHJ1bnMgdGhlIGNvbmRpdGlvbiBmdW5jdGlvbiBldmVyeSBgY2hlY2tJbnRlcnZhbGAgbWlsbGlzZWNvbmRzIChkZWZhdWx0IDUwKVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNlbGYgZnVuY3Rpb246IGlmIGl0IHJldHVybnMgdHJ1ZSB0aGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHJ1bnMgd2hlbiB0aGUgY29uZGl0aW9uIGlzIHRydWVcbiAqIEBwYXJhbSB7TnVtYmVyfSBtYXhUaW1lb3V0IHRpbWVvdXQgYmVmb3JlIGdpdmluZyB1cCAodGltZSBpbiBtaWxsaXNlY29uZHMpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aW1lZE91dEZ1bmMgYSBmdW5jdGlvbiBjYWxsZWQgaWYgdGltZW91dCBpcyByZWFjaGVkXG4gKiBAcGFyYW0ge051bWJlcn0gY2hlY2tJbnRlcnZhbCB0aW1lIGludGVydmFsIHdoZW4geW91IHJ1biB0aGUgY29uZGl0aW9uIGZ1bmN0aW9uICh0aW1lIGluIG1pbGxpc2Vjb25kcyksIGRlZmF1bHQgNTAgbXNcbiAqL1xuZnVuY3Rpb24gd2FpdEZvcihjYWxsYmFjaywgbWF4VGltZW91dCwgdGltZWRPdXRGdW5jLCBjaGVja0ludGVydmFsKXtcbiAgICB2YXIgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIHZhciBjb25kaXRpb24gPSB0aGlzO1xuICAgIGNoZWNrSW50ZXJ2YWwgPSBjaGVja0ludGVydmFsIHx8IDUwO1xuICAgIHZhciBpbnRlcnZhbCA9IHNldEludGVydmFsKHRlc3RDb25kaXRpb24sIGNoZWNrSW50ZXJ2YWwpO1xuXG4gICAgZnVuY3Rpb24gdGVzdENvbmRpdGlvbigpIHtcbiAgICAgICAgaWYgKGNvbmRpdGlvbigpKSBjYWxsYmFjaygpO1xuICAgICAgICBlbHNlIGlmIChEYXRlLm5vdygpIC0gc3RhcnQgPj0gbWF4VGltZW91dClcbiAgICAgICAgICAgIHRpbWVkT3V0RnVuYyAmJiB0aW1lZE91dEZ1bmMoKTtcbiAgICAgICAgZWxzZSByZXR1cm47XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgIH07XG59XG5cblxuLyoqXG4gKiByZXR1cm5zIHRoZSBmdW5jdGlvbiB0aGF0IG5lZ2F0ZXMgKCEgb3BlcmF0b3IpIHRoZSByZXN1bHQgb2YgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZWxmIGZ1bmN0aW9uIHRvIG5lZ2F0ZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIG5vdCgpIHtcbiAgICB2YXIgZnVuYyA9IHRoaXM7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gIWZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIC0gW2lzTnVtZXJpY10oI2lzTnVtZXJpYylcbiAqL1xudmFyIG51bWJlck1ldGhvZHMgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBpc051bWVyaWM6IGlzTnVtZXJpY1xufTtcblxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIHRlc3QgaWYgYSB2YWx1ZSBpcyBudW1lcmljXG4gKlxuICogQHBhcmFtIHtBbnl9IHNlbGYgdmFsdWUgdG8gYmUgdGVzdGVkXG4gKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIGl0IGlzIGEgbnVtZXJpYyB2YWx1ZVxuICovXG5mdW5jdGlvbiBpc051bWVyaWMoKSB7XG4gICAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KHRoaXMpKSAmJiBpc0Zpbml0ZSh0aGlzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG5cbi8qKlxuICogLSBbZXh0ZW5kXSgjZXh0ZW5kKVxuICogLSBbY2xvbmVdKCNjbG9uZSlcbiAqIC0gW2RlZmluZVByb3BlcnR5XSgjZGVmaW5lUHJvcGVydHkpXG4gKiAtIFtkZWZpbmVQcm9wZXJ0aWVzXSgjZGVmaW5lUHJvcGVydGllcylcbiAqIC0gW2RlZXBFeHRlbmRdKCNkZWVwRXh0ZW5kKVxuICogLSBbZGVlcENsb25lXSgjZGVlcENsb25lKVxuICogLSBba2V5c10oI2tleXMpXG4gKiAtIFthbGxLZXlzXSgjYWxsS2V5cylcbiAqIC0gW3ZhbHVlc10oI3ZhbHVlcylcbiAqIC0gW2tleU9mXSgja2V5T2YpXG4gKiAtIFthbGxLZXlzT2ZdKCNhbGxLZXlzT2YpXG4gKiAtIFtlYWNoS2V5XSgjZWFjaEtleSlcbiAqIC0gW21hcEtleXNdKCNtYXBLZXlzKVxuICogLSBbcmVkdWNlS2V5c10oI3JlZHVjZUtleXMpXG4gKiAtIFtmaWx0ZXJLZXlzXSgjZmlsdGVyS2V5cylcbiAqIC0gW3NvbWVLZXldKCNzb21lS2V5KVxuICogLSBbZXZlcnlLZXldKCNldmVyeUtleSlcbiAqIC0gW2ZpbmRWYWx1ZV0oI2ZpbmRWYWx1ZSlcbiAqIC0gW2ZpbmRLZXldKCNmaW5kS2V5KVxuICogLSBbcGlja0tleXNdKCNwaWNrS2V5cylcbiAqIC0gW29taXRLZXlzXSgjb21pdEtleXMpXG4gKiAtIFtpc0VxdWFsXSgjaXNFcXVhbClcbiAqIC0gW2lzTm90XSgjaXNOb3QpXG4gKlxuICogQWxsIHRoZXNlIG1ldGhvZHMgY2FuIGJlIFtjaGFpbmVkXShwcm90by5qcy5odG1sI1Byb3RvKVxuICovXG52YXIgb2JqZWN0TWV0aG9kcyA9IG1vZHVsZS5leHBvcnRzID0ge1xuICAgIGV4dGVuZDogZXh0ZW5kLFxuICAgIGNsb25lOiBjbG9uZSxcbiAgICBkZWZpbmVQcm9wZXJ0eTogZGVmaW5lUHJvcGVydHksXG4gICAgZGVmaW5lUHJvcGVydGllczogZGVmaW5lUHJvcGVydGllcyxcbiAgICBkZWVwRXh0ZW5kOiBkZWVwRXh0ZW5kLFxuICAgIGRlZXBDbG9uZTogZGVlcENsb25lLFxuICAgIGtleXM6IGtleXMsXG4gICAgYWxsS2V5czogYWxsS2V5cyxcbiAgICB2YWx1ZXM6IHZhbHVlcyxcbiAgICBrZXlPZjoga2V5T2YsXG4gICAgYWxsS2V5c09mOiBhbGxLZXlzT2YsXG4gICAgZWFjaEtleTogZWFjaEtleSxcbiAgICBtYXBLZXlzOiBtYXBLZXlzLFxuICAgIHJlZHVjZUtleXM6IHJlZHVjZUtleXMsXG4gICAgZmlsdGVyS2V5czogZmlsdGVyS2V5cyxcbiAgICBzb21lS2V5OiBzb21lS2V5LFxuICAgIGV2ZXJ5S2V5OiBldmVyeUtleSxcbiAgICBwaWNrS2V5czogcGlja0tleXMsXG4gICAgb21pdEtleXM6IG9taXRLZXlzLFxuICAgIGlzRXF1YWw6IGlzRXF1YWwsXG4gICAgaXNOb3Q6IGlzTm90XG59O1xuXG5cbi8qKlxuICogIyMjI1Byb3BlcnR5IGRlc2NyaXB0b3IgY29uc3RhbnRzIyMjI1xuICogVGhlIHN1bSBvZiB0aGVzZSBjb25zdGFudHMgY2FuIGJlIHVzZWQgYXMgbGFzdCBwYXJhbWV0ZXIgb2YgZGVmaW5lUHJvcGVydHkgYW5kIGRlZmluZVByb3BlcnRpZXMgdG8gZGV0ZXJtaW5lIHR5cGVzIG9mIHByb3BlcnRpZXMuXG4gKi9cbnZhciBjb25zdGFudHMgPSB7XG4gICAgRU5VTUVSQUJMRTogMSxcbiAgICBFTlVNOiAxLFxuICAgIENPTkZJR1VSQUJMRTogMixcbiAgICBDT05GOiAyLFxuICAgIFdSSVRBQkxFOiA0LFxuICAgIFdSSVQ6IDRcbn07XG5cbmRlZmluZVByb3BlcnR5LmNhbGwob2JqZWN0TWV0aG9kcywgJ19jb25zdGFudHMnLCBjb25zdGFudHMpO1xuXG5cbi8qKlxuICogQW5hbG9ndWUgb2YgRVM2IFtBcnJheSBfX2ZpbmRfXyBtZXRob2RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZpbmQpLlxuICogUmV0dXJucyB0aGUgdmFsdWUgb2Ygb2JqZWN0IHByb3BlcnR5IHRoYXQgcGFzc2VzIGNhbGxiYWNrIHRlc3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgb2JqZWN0IHRvIHNlYXJjaCBpblxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgc2hvdWxkIHJldHVybiBgdHJ1ZWAgZm9yIGl0ZW0gdG8gcGFzcyB0aGUgdGVzdCwgcGFzc2VkIGB2YWx1ZWAsIGBrZXlgIGFuZCBgc2VsZmAgYXMgcGFyYW1ldGVyc1xuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgb3B0aW9uYWwgY29udGV4dCAoYHRoaXNgKSBvZiBjYWxsYmFjayBjYWxsXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIEFuIG9wdGlvbmFsIGB0cnVlYCB0byBpdGVyYXRlIGVudW1lcmFibGUgcHJvcGVydGllcyBvbmx5LlxuICogQHJldHVybiB7QW55fVxuICovXG5vYmplY3RNZXRob2RzLmZpbmRWYWx1ZSA9IHV0aWxzLm1ha2VGaW5kTWV0aG9kKGVhY2hLZXksICd2YWx1ZScpO1xuXG5cbi8qKlxuICogQW5hbG9ndWUgb2YgRVM2IFtBcnJheSBfX2ZpbmRJbmRleF9fIG1ldGhvZF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZmluZEluZGV4KS5cbiAqIFJldHVybnMgdGhlIGtleSBvZiBvYmplY3QgcHJvcGVydHkgdGhhdCBwYXNzZXMgY2FsbGJhY2sgdGVzdC4gUmV0dXJucyBgdW5kZWZpbmVkYCBpZiBub3QgZm91bmQgKHVubGlrZSBgZmluZEluZGV4YCwgdGhhdCByZXR1cm5zIC0xIGluIHRoaXMgY2FzZSkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgb2JqZWN0IHRvIHNlYXJjaCBpblxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgc2hvdWxkIHJldHVybiBgdHJ1ZWAgZm9yIGl0ZW0gdG8gcGFzcyB0aGUgdGVzdCwgcGFzc2VkIGB2YWx1ZWAsIGBrZXlgIGFuZCBgc2VsZmAgYXMgcGFyYW1ldGVyc1xuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgb3B0aW9uYWwgY29udGV4dCAoYHRoaXNgKSBvZiBjYWxsYmFjayBjYWxsXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIEFuIG9wdGlvbmFsIGB0cnVlYCB0byBpdGVyYXRlIGVudW1lcmFibGUgcHJvcGVydGllcyBvbmx5LlxuICogQHJldHVybiB7SW50ZWdlcn1cbiAqL1xub2JqZWN0TWV0aG9kcy5maW5kS2V5ID0gdXRpbHMubWFrZUZpbmRNZXRob2QoZWFjaEtleSwgJ2tleScpO1xuXG5cbi8qKlxuICogRXh0ZW5kcyBvYmplY3QgYHNlbGZgIHdpdGggdGhlIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdCBgb2JqYCBjb3B5aW5nIGFsbCBvd24gcHJvcGVydGllcyAobm90IHRob3NlIGluaGVyaXRlZCB2aWEgcHJvdG90eXBlIGNoYWluKSwgaW5jbHVkaW5nIG5vbi1lbnVtZXJhYmxlIHByb3BlcnRpZXMgKHVubGVzcyBgb25seUVudW1lcmFibGVgIGlzIHRydXRoeSkuXG4gKiBDcmVhdGVkIHByb3BlcnRpZXMgd2lsbCBoYXZlIHRoZSBzYW1lIGRlc2NyaXB0b3JzIGFzIHRoZSBwcm9wZXJ0aXMgb2YgYG9iamAuXG4gKiBSZXR1cm5zIGBzZWxmYCB0byBhbGxvdyBjaGFpbmluZyB3aXRoIG90aGVyIGZ1bmN0aW9ucy5cbiAqIENhbiBiZSB1c2VkIHdpdGggZnVuY3Rpb25zLCB0byBjb3B5IGNsYXNzIG1ldGhvZHMsIGUuZy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3QgdG8gYmUgZXh0ZW5kZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogQW4gb2JqZWN0IHdoaWNoIHByb3BlcnRpZXMgd2lsbCBiZSBjb3BpZWQgdG8gc2VsZlxuICogQHBhcmFtIHtCb29sZWFufSBvbmx5RW51bWVyYWJsZSBPcHRpb25hbCBmbGFnIHRvIHByZXZlbnQgY29weWluZyBub24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzLCBgZmFsc2VgIGJ5IGRlZmF1bHRcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZXh0ZW5kKG9iaiwgb25seUVudW1lcmFibGUpIHtcbiAgICB2YXIgZGVzY3JpcHRvcnMgPSB7fTtcblxuICAgIGVhY2hLZXkuY2FsbChvYmosIGZ1bmN0aW9uKHZhbHVlLCBwcm9wKSB7XG4gICAgICAgIGRlc2NyaXB0b3JzW3Byb3BdID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApO1xuICAgIH0sIHRoaXMsIG9ubHlFbnVtZXJhYmxlKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIGRlc2NyaXB0b3JzKTtcblxuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogTWFrZXMgYSBzaGFsbG93IGNsb25lIG9mIG9iamVjdCBgb2JqYCBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiB0aGUgc2FtZSBjbGFzczsgdGhlIHByb3BlcnRpZXMgd2lsbCBoYXZlIHRoZSBzYW1lIGRlc2NyaXB0b3JzLlxuICogVG8gY2xvbmUgYW4gYXJyYXkgdXNlXG4gKiBgYGBcbiAqIHZhciBjbG9uZWRBcnJheSA9IFtdLmNvbmNhdChhcnIpO1xuICogYGBgXG4gKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgdXNlZCB0byBjbG9uZSBhbiBhcnJheSwgYmVjYXVzZSBpdCBpcyBpbmVmZmljaWVudC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3QgdG8gYmUgY2xvbmVkXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGNsb25lKCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMpKSByZXR1cm4gdGhpcy5zbGljZSgpO1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIG5ldyBEYXRlKHRoaXMpO1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgUmVnRXhwKSByZXR1cm4gbmV3IFJlZ0V4cCh0aGlzKTtcbiAgICB2YXIgY2xvbmVkT2JqZWN0ID0gT2JqZWN0LmNyZWF0ZSh0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSk7XG4gICAgZXh0ZW5kLmNhbGwoY2xvbmVkT2JqZWN0LCB0aGlzKTtcbiAgICByZXR1cm4gY2xvbmVkT2JqZWN0O1xufVxuXG5cbi8qKlxuICogU3ludGF4IHN1Z2FyIHRvIHNob3J0ZW4gdXNhZ2Ugb2YgYE9iamVjdC5kZWZpbmVQcm9wZXJ0eWAuXG4gKiBUaGUgc2ltcGxlc3QgdXNhZ2UgKHRvIGFkZCBub24tZW51bWVyYWJsZSwgbm9uLWNvbmZpZ3VyYWJsZSwgbm9uLXdyaXRhYmxlIHByb3BlcnR5KTpcbiAqIGBgYFxuICogXy5kZWZpbmVQcm9wZXJ0eShvYmosICdrZXknLCB2YWx1ZSk7XG4gKiBgYGBcbiAqXG4gKiBUbyBkZWZpbmUgc29tZSBvdGhlciBwcm9wZXJ0aWVzIHVzZSBzdW0gb2YgdGhlIGZsYWdzIGBfLkVOVU1FUkFCTEVgIChvciBgXy5FTlVNYCksIGBfLkNPTkZJR1VSQUJMRWAgKG9yIGBfLkNPTkZgKSBhbmQgYF8uV1JJVEFCTEVgIChvciBgXy5XUklUYCk6XG4gKiBgYGBcbiAqIF8uZGVmaW5lUHJvcGVydHkob2JqLCAna2V5JywgdmFsdWUsIF8uRU5VTSArIF8uV1JJVCk7XG4gKiBgYGBcbiAqIFJldHVybnMgYHNlbGZgLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB0byBhZGQgYSBwcm9wZXJ0eSB0b1xuICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5TmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3aWxsIGJlIGFkZGVkXG4gKiBAcGFyYW0ge0FueX0gdmFsdWUgdGhlIHZhbHVlIG9mIGFkZGVkIHByb3BlcnR5XG4gKiBAcGFyYW0ge0ludGVnZXJ9IGRlY3JpcHRvckZsYWdzIGJpdCBtYXNrIG9mIHByb3BlcnR5IGRlc2NyaXB0b3IgcHJvcGVydGllcyBjb21wb3NlZCBmcm9tIGBfLkVOVU1FUkFCTEVgIChvciBgXy5FTlVNYCksIGBfLkNPTkZJR1VSQUJMRWAgKG9yIGBfLkNPTkZgKSBhbmQgYF8uV1JJVEFCTEVgIChvciBgXy5XUklUYClcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSwgZGVjcmlwdG9yRmxhZ3MpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlOYW1lLFxuICAgICAgICBfZ2V0RGVzY3JpcHRvcih2YWx1ZSwgZGVjcmlwdG9yRmxhZ3MpKTtcbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG5mdW5jdGlvbiBfZ2V0RGVzY3JpcHRvcih2YWx1ZSwgZGVjcmlwdG9yRmxhZ3MpIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHsgdmFsdWU6IHZhbHVlIH07XG4gICAgaWYgKGRlY3JpcHRvckZsYWdzKVxuICAgICAgICBleHRlbmQuY2FsbChkZXNjcmlwdG9yLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiAhISAoZGVjcmlwdG9yRmxhZ3MgJiBjb25zdGFudHMuRU5VTUVSQUJMRSksXG4gICAgICAgICAgICBjb25maWd1cmFibGU6ICEhIChkZWNyaXB0b3JGbGFncyAmIGNvbnN0YW50cy5DT05GSUdVUkFCTEUpLFxuICAgICAgICAgICAgd3JpdGFibGU6ICEhIChkZWNyaXB0b3JGbGFncyAmIGNvbnN0YW50cy5XUklUQUJMRSlcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbn1cblxuXG4vKipcbiAqIFN5bnRheCBzdWdhciB0byBzaG9ydGVuIHVzYWdlIG9mIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AuXG4gKiBUaGUgc2ltcGxlc3QgdXNhZ2UgKHRvIGFkZCBub24tZW51bWVyYWJsZSwgbm9uLWNvbmZpZ3VyYWJsZSwgbm9uLXdyaXRhYmxlIHByb3BlcnRpZXMpOlxuICogYGBgXG4gKiBfLmRlZmluZVByb3BlcnRpZXMob2JqLCB7XG4gKiAgICAga2V5MTogdmFsdWUxLFxuICogICAgIGtleTI6IHZhbHVlMlxuICogfSk7XG4gKiBgYGBcbiAqIFRvIGRlZmluZSBzb21lIG90aGVyIHByb3BlcnRpZXMgdXNlIHN1bSBvZiB0aGUgZmxhZ3MgYF8uRU5VTUVSQUJMRWAgKG9yIGBfLkVOVU1gKSwgYF8uQ09ORklHVVJBQkxFYCAob3IgYF8uQ09ORmApIGFuZCBgXy5XUklUQUJMRWAgKG9yIGBfLldSSVRgKTpcbiAqIGBgYFxuICogXy5kZWZpbmVQcm9wZXJ0aWVzKG9iaiwge1xuICogICAgIGtleTE6IHZhbHVlMSxcbiAqICAgICBrZXkyOiB2YWx1ZTJcbiAqIH0sIF8uRU5VTSArIF8uV1JJVCk7XG4gKiBgYGBcbiAqIFJldHVybnMgYHNlbGZgLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB0byBhZGQgYSBwcm9wZXJ0eSB0b1xuICogQHBhcmFtIHtPYmplY3R9IHByb3BlcnR5VmFsdWVzIEEgbWFwIG9mIGtleXMgYW5kIHZhbHVlcyBvZiBwcm9wZXJ0aWVzIHRoYXR3aWxsIGJlIGFkZGVkLiBUaGUgZGVzY3JpcHRvcnMgb2YgcHJvcGVydGllcyB3aWxsIGJlIGRlZmluZWQgYnkgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzLlxuICogQHBhcmFtIHtJbnRlZ2VyfSBkZWNyaXB0b3JGbGFncyBiaXQgbWFzayBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9yIHByb3BlcnRpZXMgY29tcG9zZWQgZnJvbSBgXy5FTlVNRVJBQkxFYCAob3IgYF8uRU5VTWApLCBgXy5DT05GSUdVUkFCTEVgIChvciBgXy5DT05GYCkgYW5kIGBfLldSSVRBQkxFYCAob3IgYF8uV1JJVGApXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMocHJvcGVydHlWYWx1ZXMsIGRlY3JpcHRvckZsYWdzKSB7XG4gICAgdmFyIGRlc2NyaXB0b3JzID0gbWFwS2V5cy5jYWxsKHByb3BlcnR5VmFsdWVzLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gX2dldERlc2NyaXB0b3IodmFsdWUsIGRlY3JpcHRvckZsYWdzKTtcbiAgICB9LCB0cnVlKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCBkZXNjcmlwdG9ycyk7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBFeHRlbmRzIG9iamVjdCBgc2VsZmAgd2l0aCBwcm9wZXJ0aWVzIG9mIGBvYmpgIHRvIGFueSBkZXB0aCwgd2l0aG91dCBvdmVyd3J0aXRpbmcgZXhpc3Rpbmcgb2JqZWN0IHByb3BlcnRpZXMgb2YgYHNlbGZgIHdpdGggb2JqZWN0IHByb3BlcnRpZXMgb2YgYG9iamAuXG4gKiBTY2FsYXIgcHJvcGVydGllcyBvZiBgb2JqYCB3aWxsIG92ZXJ3cml0ZSBwcm9wZXJ0aWVzIG9mIGBzZWxmYC4gU2NhbGFyIHBvcnBlcnRpZXMgb2YgYHNlbGZgIHdpbGwgYWxzbyBiZSBvdmVyd3JpdHRlbi5cbiAqIENvcnJlY3RseSB3b3JrcyB3aXRoIHJlY3Vyc2l2ZSBvYmplY3RzLlxuICogVXNhZ2U6XG4gKiBgYGBcbiAqIHZhciBvYmogPSB7XG4gKiAgICAgaW5uZXI6IHtcbiAqICAgICAgICAgYTogMVxuICogICAgIH1cbiAqIH07XG4gKlxuICogXy5kZWVwRXh0ZW5kKG9iaiwge1xuICogICAgIGlubmVyOiB7XG4gKiAgICAgICAgIGI6IDJcbiAqICAgICB9XG4gKiB9KTtcbiAqXG4gKiBhc3NlcnQuZGVlcEVxdWFsKG9iaiwge1xuICogICAgIGlubmVyOiB7XG4gKiAgICAgICAgIGE6IDEsXG4gKiAgICAgICAgIGI6IDJcbiAqICAgICB9XG4gKiB9KTsgLy8gYXNzZXJ0IHBhc3Nlc1xuICogYGBgXG4gKiBSZXR1cm5zIGBzZWxmYC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3QgdG8gYmUgZXh0ZW5kZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogQW4gb2JqZWN0IHdpdGggcHJvcGVydGllcyB0byBjb3B5IHRvXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIE9wdGlvbmFsIGB0cnVlYCB0byB1c2Ugb25seSBlbnVtZXJhYmxlIHByb3BlcnRpZXNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZGVlcEV4dGVuZChvYmosIG9ubHlFbnVtZXJhYmxlKSB7XG4gICAgcmV0dXJuIF9leHRlbmRUcmVlKHRoaXMsIG9iaiwgb25seUVudW1lcmFibGUsIFtdKTtcbn1cblxuXG5mdW5jdGlvbiBfZXh0ZW5kVHJlZShzZWxmTm9kZSwgb2JqTm9kZSwgb25seUVudW1lcmFibGUsIG9ialRyYXZlcnNlZCkge1xuICAgIGlmIChvYmpUcmF2ZXJzZWQuaW5kZXhPZihvYmpOb2RlKSA+PSAwKSByZXR1cm47IC8vIG5vZGUgYWxyZWFkeSB0cmF2ZXJzZWQsIG9iaiBoYXMgcmVjdXJzaW9uXG5cbiAgICAvLyBzdG9yZSBub2RlIHRvIHJlY29nbmlzZSByZWN1cnNpb25cbiAgICBvYmpUcmF2ZXJzZWQucHVzaChvYmpOb2RlKTtcblxuICAgIHZhciBsb29wID0gQXJyYXkuaXNBcnJheShvYmpOb2RlKSA/IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoIDogZWFjaEtleTtcblxuICAgIGxvb3AuY2FsbChvYmpOb2RlLCBmdW5jdGlvbih2YWx1ZSwgcHJvcCkge1xuICAgICAgICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqTm9kZSwgcHJvcCk7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcgJiYgdmFsdWUgIT0gbnVsbFxuICAgICAgICAgICAgICAgICYmICEgKHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSAmJiAhICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgICBpZiAoISAoc2VsZk5vZGUuaGFzT3duUHJvcGVydHkocHJvcClcbiAgICAgICAgICAgICAgICAgICAgJiYgdHlwZW9mIHNlbGZOb2RlW3Byb3BdID09ICdvYmplY3QnICYmIHNlbGZOb2RlW3Byb3BdICE9IG51bGwpKVxuICAgICAgICAgICAgICAgIHNlbGZOb2RlW3Byb3BdID0gKEFycmF5LmlzQXJyYXkodmFsdWUpKSA/IFtdIDoge307XG4gICAgICAgICAgICBfZXh0ZW5kVHJlZShzZWxmTm9kZVtwcm9wXSwgdmFsdWUsIG9ubHlFbnVtZXJhYmxlLCBvYmpUcmF2ZXJzZWQpO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxmTm9kZSwgcHJvcCwgZGVzY3JpcHRvcik7XG4gICAgfSwgdGhpcywgb25seUVudW1lcmFibGUpO1xuXG4gICAgcmV0dXJuIHNlbGZOb2RlO1xufVxuXG5cbi8qKlxuICogQ2xvbmVzIGFsbCBvYmplY3QgdHJlZS4gQ2xhc3Mgb2Ygb3JpZ2luYWwgb2JqZWN0IGlzIG5vdCBwcmVzZXJ2ZWQuIFJldHVybnMgYHNlbGZgXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgQW4gb2JqZWN0IHRvIGJlIGV4dGVuZGVkXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIE9wdGlvbmFsIGB0cnVlYCB0byB1c2Ugb25seSBlbnVtZXJhYmxlIHByb3BlcnRpZXNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZGVlcENsb25lKG9ubHlFbnVtZXJhYmxlKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gbmV3IERhdGUodGhpcyk7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBSZWdFeHApIHJldHVybiBuZXcgUmVnRXhwKHRoaXMpO1xuICAgIHZhciBjbG9uZWRPYmplY3QgPSBBcnJheS5pc0FycmF5KHRoaXMpID8gW10gOiB7fTtcbiAgICBkZWVwRXh0ZW5kLmNhbGwoY2xvbmVkT2JqZWN0LCB0aGlzLCBvbmx5RW51bWVyYWJsZSk7XG4gICAgcmV0dXJuIGNsb25lZE9iamVjdDtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgYXJyYXkgb2YgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBvYmplY3QgdG8gcmV0dXJuIGtleXMgb2ZcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBrZXlzKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzKTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgYXJyYXkgb2YgdmFsdWVzIG9mIHRoZSBvYmplY3QncyBrZXlzXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgb2JqZWN0IHRvIHJldHVybiB2YWx1ZXMgZnJvbVxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHZhbHVlcyhvbmx5RW51bWVyYWJsZSkge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gb25seUVudW1lcmFibGVcbiAgICAgICAgICAgICAgICA/IE9iamVjdC5rZXlzKHRoaXMpXG4gICAgICAgICAgICAgICAgOiBhbGxLZXlzLmNhbGwodGhpcyk7XG5cbiAgICByZXR1cm4gcHJvcGVydGllcy5tYXAoZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICByZXR1cm4gdGhpc1twcm9wXTtcbiAgICB9LCB0aGlzKTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgYXJyYXkgb2YgYWxsIHByb3BlcnR5IG5hbWVzIG9mIGFuIG9iamVjdCBgc2VsZmAgKGluY2x1ZGluZyBub24tZW51bWVyYmFsZSkuXG4gKiBUbyBnZXQgb25seSBlbnVtZXJhYmxlIHByb3BlcnRpZXMsIHVzZSBgT2JqZWN0LmtleXMoKWAuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgQW4gb2JqZWN0IHRvIGdldCBhbGwgcHJvcGVydGllcyBvZi5cbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG4gZnVuY3Rpb24gYWxsS2V5cygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcyk7XG4gfVxuXG5cbi8qKlxuICogQW4gYW5hbG9ndWUgb2YgYGluZGV4T2ZgIG1ldGhvZCBvZiBBcnJheSBwcm90b3R5cGUuXG4gKiBSZXR1cm5zIHRoZSBga2V5YCBvZiBgc2VhcmNoRWxlbWVudGAgaW4gdGhlIG9iamVjdCBgc2VsZmAuXG4gKiBBcyBvYmplY3Qga2V5cyBhcmUgdW5zb3J0ZWQsIGlmIHRoZXJlIGFyZSBzZXZlcmFsIGtleXMgdGhhdCBob2xkIGBzZWFyY2hFbGVtZW50YCBhbnkgb2YgdGhlbSBjYW4gYmUgcmV0dXJuZWQuIFVzZSBgYWxsS2V5c09mYCB0byByZXR1cm4gYWxsIGtleXMuXG4gKiBBbGwgb3duIHByb3BlcnRpZXMgYXJlIHNlYXJjaGVkIChub3QgdGhvc2UgaW5oZXJpdGVkIHZpYSBwcm90b3R5cGUgY2hhaW4pLCBpbmNsdWRpbmcgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcyAodW5sZXNzIGBvbmx5RW51bWVyYWJsZWAgaXMgdHJ1dGh5KS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3QgdG8gc2VhcmNoIGEgdmFsdWUgaW5cbiAqIEBwYXJhbSB7QW55fSBzZWFyY2hFbGVtZW50IEFuIGVsZW1lbnQgdGhhdCB3aWxsIGJlIHNlYXJjaGVkLiBBbiBleGFjdCBlcXVhbGl0eSBpcyB0ZXN0ZWQsIHNvIGAwYCBpcyBub3QgdGhlIHNhbWUgYXMgYCcwJ2AuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIEFuIG9wdGlvbmFsIHRydWUgdG8gc2VhcmNoIGFtb25nIGVudW1lcmFibGUgcHJvcGVydGllcyBvbmx5LlxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBrZXlPZihzZWFyY2hFbGVtZW50LCBvbmx5RW51bWVyYWJsZSkge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gb25seUVudW1lcmFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gT2JqZWN0LmtleXModGhpcylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYWxsS2V5cy5jYWxsKHRoaXMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAoc2VhcmNoRWxlbWVudCA9PT0gdGhpc1twcm9wZXJ0aWVzW2ldXSlcbiAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzW2ldO1xuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuXG4vKipcbiAqIFdvcmtzIHNpbWlsYXJseSB0byB0aGUgcHJldmlvdXMgZnVuY3Rpb24sIGJ1dCByZXR1cm5zIHRoZSBhcnJheSBvZiBrZXlzIGhvbGRpbmcgYHNlYXJjaEVsZW1lbnRgIGFzIHRoZWlyIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB0byBzZWFyY2ggYSB2YWx1ZSBpblxuICogQHBhcmFtIHtBbnl9IHNlYXJjaEVsZW1lbnQgQW4gZWxlbWVudCB0aGF0IHdpbGwgYmUgc2VhcmNoZWQuIEFuIGV4YWN0IGVxdWFsaXR5IGlzIHRlc3RlZCwgc28gYDBgIGlzIG5vdCB0aGUgc2FtZSBhcyBgJzAnYC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25seUVudW1lcmFibGUgQW4gb3B0aW9uYWwgdHJ1ZSB0byBzZWFyY2ggYW1vbmcgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9ubHkuXG4gKiBAcmV0dXJuIHtBcnJheVtTdHJpbmddfVxuICovXG5mdW5jdGlvbiBhbGxLZXlzT2Yoc2VhcmNoRWxlbWVudCwgb25seUVudW1lcmFibGUpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IG9ubHlFbnVtZXJhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IE9iamVjdC5rZXlzKHRoaXMpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGFsbEtleXMuY2FsbCh0aGlzKTtcblxuICAgIHZhciBrZXlzID0gcHJvcGVydGllcy5maWx0ZXIoZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICByZXR1cm4gc2VhcmNoRWxlbWVudCA9PT0gdGhpc1twcm9wXTtcbiAgICB9LCB0aGlzKTtcblxuICAgIHJldHVybiBrZXlzO1xufVxuXG5cbi8qKlxuICogQW4gYW5hbG9ndWUgb2YgW2ZvckVhY2hdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZvckVhY2gpIG1ldGhvZCBvZiBBcnJheSBwcm90b3R5cGUuXG4gKiBJdGVyYXRlcyBhbGwgb3duIHByb3BlcnRpZXMgb2YgYHNlbGZgIChvciBvbmx5IGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgaWYgYG9ubHlFbnVtZXJhYmxlYCBpcyB0cnV0aHkpIGNhbGxpbmcgY2FsbGJhY2sgZm9yIGVhY2gga2V5LlxuICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggYXJyYXlzLCBpdCB3aWxsIGluY2x1ZGUgYGxlbmd0aGAgcHJvcGVydHkgaW4gaXRlcmF0aW9uLlxuICogVG8gaXRlcmF0ZSBhcnJheS1saWtlIG9iamVjdHMgKGUuZy4sIGBhcmd1bWVudHNgIHBzZXVkby1hcnJheSkgdXNlOlxuICogYGBgXG4gKiBfLmZvckVhY2goYXJndW1lbnRzLCBjYWxsYmFjaywgdGhpc0FyZyk7XG4gKiBgYGBcbiAqIEZ1bmN0aW9uIHJldHVybnMgYHNlbGZgIHRvIGFsbG93IFtjaGFpbmluZ10ocHJvdG8uanMuaHRtbClcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3Qgd2hpY2ggcHJvcGVydGllcyB3aWxsIGJlIGl0ZXJhdGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBpcyBwYXNzZWQgYHZhbHVlYCwgYGtleWAgYW5kIGBzZWxmYCwgaXRzIHJldHVybiB2YWx1ZSBpcyBub3QgdXNlZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIEFuIG9wdGlvbmFsIGNvbnRleHQgb2YgaXRlcmF0aW9uICh0aGUgdmFsdWVvZiBgdGhpc2ApLCB3aWxsIGJlIHVuZGVmaW5lZCBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgcGFzc2VkLlxuICogQHBhcmFtIHtCb29sZWFufSBvbmx5RW51bWVyYWJsZSBBbiBvcHRpb25hbCBgdHJ1ZWAgdG8gaXRlcmF0ZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb25seS5cbiAqL1xuZnVuY3Rpb24gZWFjaEtleShjYWxsYmFjaywgdGhpc0FyZywgb25seUVudW1lcmFibGUpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IG9ubHlFbnVtZXJhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IE9iamVjdC5rZXlzKHRoaXMpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGFsbEtleXMuY2FsbCh0aGlzKTtcblxuICAgIHByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbihwcm9wKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdGhpc1twcm9wXSwgcHJvcCwgdGhpcyk7XG4gICAgfSwgdGhpcyk7XG5cbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG4vKipcbiAqIEFuIGFuYWxvZ3VlIG9mIFttYXBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L21hcCkgbWV0aG9kIG9mIEFycmF5IHByb3RvdHlwZS5cbiAqIFJldHVybnMgdGhlIG9iamVjdCB0aGF0IGlzIHRoZSByZXN1bHQgb2YgdGhlIGFwcGxpY2F0aW9uIG9mIGNhbGxiYWNrIHRvIHZhbHVlcyBpbiBhbGwgb3duIHByb3BlcnRpZXMgb2YgYHNlbGZgIChvciBvbmx5IGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgaWYgYG9ubHlFbnVtZXJhYmxlYCBpcyB0cnV0aHkpLlxuICogVGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlIHRoZSBpbnN0YW5jZSBvZiB0aGUgc2FtZSBjbGFzcyBhcyBgc2VsZmAuXG4gKiBQcm9wZXJ0eSBkZXNjcmlwdG9ycyBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgaGF2ZSB0aGUgc2FtZSBgZW51bWVyYWJsZWAsIGBjb25maWd1cmFibGVgIGFuZCBgd3JpdGFibGVgIHNldHRpbmdzIGFzIHRoZSBwcm9wZXJ0aWVzIG9mIGBzZWxmYC5cbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGFycmF5cywgaXQgd2lsbCBpbmNsdWRlIGBsZW5ndGhgIHByb3BlcnR5IGluIGl0ZXJhdGlvbi5cbiAqIFRvIG1hcCBhcnJheS1saWtlIG9iamVjdHMgdXNlOlxuICogYGBgXG4gKiB2YXIgcmVzdWx0ID0gXy5tYXAoYXJndW1lbnRzLCBjYWxsYmFjaywgdGhpc0FyZyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3Qgd2hpY2ggcHJvcGVydGllcyB3aWxsIGJlIGl0ZXJhdGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBpcyBwYXNzZWQgYHZhbHVlYCwgYGtleWAgYW5kIGBzZWxmYCBhbmQgc2hvdWxkIHJldHVybiB2YWx1ZSB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG1hcC5cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIEFuIG9wdGlvbmFsIGNvbnRleHQgb2YgaXRlcmF0aW9uICh0aGUgdmFsdWVvZiBgdGhpc2ApLCB3aWxsIGJlIHVuZGVmaW5lZCBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgcGFzc2VkLlxuICogQHBhcmFtIHtCb29sZWFufSBvbmx5RW51bWVyYWJsZSBBbiBvcHRpb25hbCBgdHJ1ZWAgdG8gaXRlcmF0ZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb25seS5cbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gbWFwS2V5cyhjYWxsYmFjaywgdGhpc0FyZywgb25seUVudW1lcmFibGUpIHtcbiAgICB2YXIgZGVzY3JpcHRvcnMgPSB7fTtcbiAgICBlYWNoS2V5LmNhbGwodGhpcywgbWFwUHJvcGVydHksIHRoaXNBcmcsIG9ubHlFbnVtZXJhYmxlKTtcbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgZGVzY3JpcHRvcnMpO1xuXG4gICAgZnVuY3Rpb24gbWFwUHJvcGVydHkodmFsdWUsIGtleSwgc2VsZikge1xuICAgICAgICBkZXNjcmlwdG9yc1trZXldID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzZWxmLCBrZXkpO1xuICAgICAgICBkZXNjcmlwdG9yc1trZXldLnZhbHVlID0gY2FsbGJhY2suY2FsbCh0aGlzLCB2YWx1ZSwga2V5LCBzZWxmKTtcbiAgICB9XG59XG5cblxuLyoqXG4gKiBBbiBhbmFsb2d1ZSBvZiBbcmVkdWNlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9SZWR1Y2UpIG1ldGhvZCBvZiBBcnJheSBwcm90b3R5cGUuXG4gKiBUaGlzIG1ldGhvZCByZWR1Y2VzIHRoZSBvYmplY3QgdG8gYSBzaW5nbGUgdmFsdWUuIEl0ZXJhdGlvbiBvcmRlciBpcyBpbXBvc3NpYmxlIHRvIGNvbnRyb2wgd2l0aCBvYmplY3QuXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBhcnJheXMsIGl0IHdpbGwgaW5jbHVkZSBgbGVuZ3RoYCBwcm9wZXJ0eSBpbiBpdGVyYXRpb24uXG4gKiBUbyByZWR1Y2UgYXJyYXktbGlrZSBvYmplY3RzIHVzZTpcbiAqIGBgYFxuICogdmFyIHJlc3VsdCA9IF8ucmVkdWNlKGFyZ3VtZW50cywgY2FsbGJhY2ssIGluaXRpYWxWYWx1ZSwgdGhpc0FyZyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3Qgd2hpY2ggcHJvcGVydGllcyB3aWxsIGJlIGl0ZXJhdGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBpcyBwYXNzZWQgYHByZXZpb3VzVmFsdWVgLCBgdmFsdWVgLCBga2V5YCBhbmQgYHNlbGZgIGFuZCBzaG91bGQgcmV0dXJuIHZhbHVlIHRoYXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBgcHJldmlvdXNWYWx1ZWAgZm9yIHRoZSBuZXh0IGBjYWxsYmFja2AgY2FsbC5cbiAqIEBwYXJhbSB7QW55fSBpbml0aWFsVmFsdWUgVGhlIGluaXRpYWwgdmFsdWUgcGFzc2VkIHRvIGNhbGxiYWNrIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgb24gdGhlIGZpcnN0IGNhbGwuXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBBbiBvcHRpb25hbCBjb250ZXh0IG9mIGl0ZXJhdGlvbiAodGhlIHZhbHVlb2YgYHRoaXNgKSwgd2lsbCBiZSB1bmRlZmluZWQgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHBhc3NlZC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25seUVudW1lcmFibGUgQW4gb3B0aW9uYWwgYHRydWVgIHRvIGl0ZXJhdGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9ubHkuXG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmZ1bmN0aW9uIHJlZHVjZUtleXMoY2FsbGJhY2ssIGluaXRpYWxWYWx1ZSwgdGhpc0FyZywgb25seUVudW1lcmFibGUpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IG9ubHlFbnVtZXJhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IE9iamVjdC5rZXlzKHRoaXMpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGFsbEtleXMuY2FsbCh0aGlzKTtcblxuICAgIHZhciBtZW1vID0gaW5pdGlhbFZhbHVlO1xuXG4gICAgcHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgICAgbWVtbyA9IGNhbGxiYWNrLmNhbGwodGhpc0FyZywgbWVtbywgdGhpc1twcm9wXSwgcHJvcCwgdGhpcyk7XG4gICAgfSwgdGhpcyk7XG5cbiAgICByZXR1cm4gbWVtbztcbn1cblxuXG4vKipcbiAqIEFuIGFuYWxvZ3VlIG9mIFtmaWx0ZXJdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZpbHRlcikgbWV0aG9kIG9mIEFycmF5IHByb3RvdHlwZS5cbiAqIFJldHVybnMgdGhlIG5ldyBvYmplY3Qgd2l0aCBrZXlzIGZvciB3aGljaCBjYWxsYmFjayByZXR1cm5zIHRydWUuXG4gKiBQcm9wZXJ0eSBkZXNjcmlwdG9ycyBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgaGF2ZSB0aGUgc2FtZSBgZW51bWVyYWJsZWAsIGBjb25maWd1cmFibGVgIGFuZCBgd3JpdGFibGVgIHNldHRpbmdzIGFzIHRoZSBwcm9wZXJ0aWVzIG9mIGBzZWxmYC5cbiAqIFRvIGZpbHRlciBhcnJheS1saWtlIG9iamVjdHMgdXNlOlxuICogYGBgXG4gKiB2YXIgcmVzdWx0ID0gXy5maWx0ZXIoYXJndW1lbnRzLCBjYWxsYmFjaywgdGhpc0FyZyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBBbiBvYmplY3Qgd2hpY2ggcHJvcGVydGllcyB3aWxsIGJlIGl0ZXJhdGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBpcyBwYXNzZWQgYHZhbHVlYCwgYGtleWAgYW5kIGBzZWxmYC4gSWYgaXQgcmV0dXJucyB0cnV0aHkgdmFsdWUsIHRoZSBrZXkvdmFsdWUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIEFuIG9wdGlvbmFsIGNvbnRleHQgb2YgaXRlcmF0aW9uICh0aGUgdmFsdWVvZiBgdGhpc2ApLCB3aWxsIGJlIHVuZGVmaW5lZCBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgcGFzc2VkLlxuICogQHBhcmFtIHtCb29sZWFufSBvbmx5RW51bWVyYWJsZSBBbiBvcHRpb25hbCBgdHJ1ZWAgdG8gaXRlcmF0ZSBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb25seS5cbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gZmlsdGVyS2V5cyhjYWxsYmFjaywgdGhpc0FyZywgb25seUVudW1lcmFibGUpIHtcbiAgICB2YXIgZGVzY3JpcHRvcnMgPSB7fTtcbiAgICBlYWNoS2V5LmNhbGwodGhpcywgZmlsdGVyUHJvcGVydHksIHRoaXNBcmcsIG9ubHlFbnVtZXJhYmxlKTtcbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgZGVzY3JpcHRvcnMpOztcblxuICAgIGZ1bmN0aW9uIGZpbHRlclByb3BlcnR5KHZhbHVlLCBrZXksIHNlbGYpIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrLmNhbGwodGhpcywgdmFsdWUsIGtleSwgc2VsZikpXG4gICAgICAgICAgICBkZXNjcmlwdG9yc1trZXldID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzZWxmLCBrZXkpO1xuICAgIH1cbn1cblxuXG52YXIgX3Bhc3NlZCA9IHt9XG4gICAgLCBfZGlkTm90UGFzcyA9IHt9O1xuXG4vKipcbiAqIEFuIGFuYWxvZ3VlIG9mIFtzb21lXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9zb21lKSBtZXRob2Qgb2YgQXJyYXkgcHJvdG90eXBlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIEFuIG9iamVjdCB3aGljaCBwcm9wZXJ0aWVzIHdpbGwgYmUgaXRlcmF0ZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIGlzIHBhc3NlZCBgdmFsdWVgLCBga2V5YCBhbmQgYHNlbGZgLiBJZiBpdCByZXR1cm5zIHRydXRoeSB2YWx1ZSwgdGhlIGZ1bmN0aW9uIGltbWVhZGl0ZWx5IHJldHVybnMgYHRydWVgLlxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgQW4gb3B0aW9uYWwgY29udGV4dCBvZiBpdGVyYXRpb24gKHRoZSB2YWx1ZW9mIGB0aGlzYCksIHdpbGwgYmUgdW5kZWZpbmVkIGlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBwYXNzZWQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9ubHlFbnVtZXJhYmxlIEFuIG9wdGlvbmFsIGB0cnVlYCB0byBpdGVyYXRlIGVudW1lcmFibGUgcHJvcGVydGllcyBvbmx5LlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gc29tZUtleShjYWxsYmFjaywgdGhpc0FyZywgb25seUVudW1lcmFibGUpIHtcbiAgICB0cnkge1xuICAgICAgICBlYWNoS2V5LmNhbGwodGhpcywgdGVzdFByb3BlcnR5LCB0aGlzQXJnLCBvbmx5RW51bWVyYWJsZSk7XG4gICAgfSBjYXRjaCAodGVzdCkge1xuICAgICAgICBpZiAodGVzdCA9PT0gX3Bhc3NlZCkgcmV0dXJuIHRydWU7XG4gICAgICAgIGVsc2UgdGhyb3cgdGVzdDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgZnVuY3Rpb24gdGVzdFByb3BlcnR5KHZhbHVlLCBrZXksIHNlbGYpIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrLmNhbGwodGhpcywgdmFsdWUsIGtleSwgc2VsZikpXG4gICAgICAgICAgICB0aHJvdyBfcGFzc2VkO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIEFuIGFuYWxvZ3VlIG9mIFtldmVyeV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZXZlcnkpIG1ldGhvZCBvZiBBcnJheSBwcm90b3R5cGUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHNlbGYgQW4gb2JqZWN0IHdoaWNoIHByb3BlcnRpZXMgd2lsbCBiZSBpdGVyYXRlZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgaXMgcGFzc2VkIGB2YWx1ZWAsIGBrZXlgIGFuZCBgc2VsZmAuIElmIGl0IHJldHVybnMgZmFsc3kgdmFsdWUsIHRoZSBmdW5jdGlvbiBpbW1lYWRpdGVseSByZXR1cm5zIGBmYWxzZWAuXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBBbiBvcHRpb25hbCBjb250ZXh0IG9mIGl0ZXJhdGlvbiAodGhlIHZhbHVlb2YgYHRoaXNgKSwgd2lsbCBiZSB1bmRlZmluZWQgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHBhc3NlZC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25seUVudW1lcmFibGUgQW4gb3B0aW9uYWwgYHRydWVgIHRvIGl0ZXJhdGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9ubHkuXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBldmVyeUtleShjYWxsYmFjaywgdGhpc0FyZywgb25seUVudW1lcmFibGUpIHtcbiAgICB0cnkge1xuICAgICAgICBlYWNoS2V5LmNhbGwodGhpcywgdGVzdFByb3BlcnR5LCB0aGlzQXJnLCBvbmx5RW51bWVyYWJsZSk7XG4gICAgfSBjYXRjaCAodGVzdCkge1xuICAgICAgICBpZiAodGVzdCA9PT0gX2RpZE5vdFBhc3MpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZWxzZSB0aHJvdyB0ZXN0O1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGZ1bmN0aW9uIHRlc3RQcm9wZXJ0eSh2YWx1ZSwga2V5LCBzZWxmKSB7XG4gICAgICAgIGlmICghIGNhbGxiYWNrLmNhbGwodGhpcywgdmFsdWUsIGtleSwgc2VsZikpXG4gICAgICAgICAgICB0aHJvdyBfZGlkTm90UGFzcztcbiAgICB9XG59XG5cblxudmFyIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGVcbiAgICAsIGNvbmNhdCA9IEFycmF5UHJvdG8uY29uY2F0O1xuLyoqXG4gKiBSZXR1cm5zIG9iamVjdCBvZiB0aGUgc2FtZSBjbGFzcyB3aXRoIG9ubHkgc3BlY2lmaWVkIGtleXMsIHRoYXQgYXJlIHBhc3NlZCBhcyBzdHJpbmcgcGFyYW1ldGVycyBvciBhcnJheShzKSBvZiBrZXlzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZWxmIGFuIG9iamVjdCB0byBwaWNrIGtleXMgZnJvbVxuICogQHBhcmFtIHtMaXN0W1N0cmluZ3xBcnJheV19IGFyZ3VtZW50cyBsaXN0IG9mIGtleXMgKG9yIGFycmF5KHMpIG9mIGtleXMpXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIHBpY2tLZXlzKCkgeyAvLyAsIC4uLiBrZXlzXG4gICAgdmFyIGtleXMgPSBjb25jYXQuYXBwbHkoQXJyYXlQcm90bywgYXJndW1lbnRzKVxuICAgICAgICAsIG9iaiA9IE9iamVjdC5jcmVhdGUodGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpO1xuICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSlcbiAgICAgICAgICAgIG9ialtrZXldID0gdGhpc1trZXldO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiBvYmo7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIG9iamVjdCBvZiB0aGUgc2FtZSBjbGFzcyB3aXRob3V0IHNwZWNpZmllZCBrZXlzLCB0aGF0IGFyZSBwYXNzZWQgYXMgc3RyaW5nIHBhcmFtZXRlcnMgb3IgYXJyYXkocykgb2Yga2V5cy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBhbiBvYmplY3QgdG8gb21pdCBrZXlzIGluXG4gKiBAcGFyYW0ge0xpc3RbU3RyaW5nfEFycmF5XX0gYXJndW1lbnRzIGxpc3Qgb2Yga2V5cyAob3IgYXJyYXkocykgb2Yga2V5cylcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gb21pdEtleXMoKSB7IC8vICwgLi4uIGtleXNcbiAgICB2YXIga2V5cyA9IGNvbmNhdC5hcHBseShBcnJheVByb3RvLCBhcmd1bWVudHMpXG4gICAgICAgICwgb2JqID0gY2xvbmUuY2FsbCh0aGlzKTtcbiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KXtcbiAgICAgICAgZGVsZXRlIG9ialtrZXldO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiBvYmo7XG59XG5cblxuLyoqXG4gKiBQZXJmb3JtcyBkZWVwIGVxdWFsaXR5IHRlc3Qgb2YgdGhlIG9iamVjdC4gRG9lcyBub3Qgd29yayB3aXRoIHJlY3Vyc2l2ZSBvYmplY3RzXG4gKiBAcGFyYW0gIHtBbnl9IHNlbGYgb2JqZWN0IHRvIGNvbXBhcmVcbiAqIEBwYXJhbSAge0FueX0gb2JqIG9iamVjdCB0byBjb21wYXJlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc0VxdWFsKG9iaikge1xuICAgIGlmICh0aGlzID09PSBvYmopIHJldHVybiB0aGlzICE9PSAwIHx8IDEvdGhpcyA9PSAxL29iajsgLy8gMCBhbmQgLTAgYXJlIGNvbnNpZGVyZWQgbm90IGVxdWFsLCBhbHRob3VnaCAwID09PSAtMCBpcyB0cnVlXG4gICAgaWYgKHRoaXMgPT0gbnVsbCB8fCBvYmogPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBjbGFzc05hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgaWYgKGNsYXNzTmFtZSAhPSBvYmouY29uc3RydWN0b3IubmFtZSkgcmV0dXJuIGZhbHNlO1xuICAgIHN3aXRjaCAoY2xhc3NOYW1lKSB7XG4gICAgICAgIGNhc2UgJ1N0cmluZyc6XG4gICAgICAgICAgICByZXR1cm4gdGhpcyA9PSBTdHJpbmcob2JqKTtcbiAgICAgICAgY2FzZSAnTnVtYmVyJzpcbiAgICAgICAgICAgIHJldHVybiB0aGlzICE9ICt0aGlzID8gb2JqICE9ICtvYmogOiAodGhpcyA9PSAwID8gMS90aGlzID09IDEvb2JqIDogdGhpcyA9PSArb2JqKTtcbiAgICAgICAgY2FzZSAnRGF0ZSc6XG4gICAgICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgICAgICAgICAgcmV0dXJuICt0aGlzID09ICtvYmo7XG4gICAgICAgIGNhc2UgJ1JlZ0V4cCc6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2UgPT0gb2JqLnNvdXJjZVxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLmdsb2JhbCA9PSBvYmouZ2xvYmFsXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMubXVsdGlsaW5lID09IG9iai5tdWx0aWxpbmVcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5pZ25vcmVDYXNlID09IG9iai5pZ25vcmVDYXNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMgIT0gJ29iamVjdCcgfHwgdHlwZW9mIG9iaiAhPSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcykpXG4gICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PSBvYmoubGVuZ3RoXG4gICAgICAgICAgICAgICAgJiYgdGhpcy5ldmVyeShmdW5jdGlvbihpdGVtLCBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNFcXVhbC5jYWxsKGl0ZW0sIG9ialtpbmRleF0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gYWxsS2V5cy5jYWxsKHRoaXMpLmxlbmd0aCA9PSBhbGxLZXlzLmNhbGwob2JqKS5sZW5ndGhcbiAgICAgICAgICAgICAgICAmJiBldmVyeUtleS5jYWxsKHRoaXMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzRXF1YWwuY2FsbCh2YWx1ZSwgb2JqW2tleV0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vKipcbiAqIFRoZSBvcHBvc2l0ZSBvZiBpc0VxdWFsXG4gKiBAcGFyYW0gIHtBbnl9IHNlbGYgb2JqZWN0IHRvIGNvbXBhcmVcbiAqIEBwYXJhbSAge0FueX0gb2JqIG9iamVjdCB0byBjb21wYXJlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc05vdChvYmopIHtcbiAgICByZXR1cm4gIWlzRXF1YWwuY2FsbCh0aGlzLCBvYmopO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIC0gW2V4dGVuZFByb3RvXSgjZXh0ZW5kUHJvdG8pXG4gKiAtIFtjcmVhdGVTdWJjbGFzc10oI2NyZWF0ZVN1YmNsYXNzKVxuICogLSBbbWFrZVN1YmNsYXNzXSgjbWFrZVN1YmNsYXNzKVxuICogLSBbbmV3QXBwbHldKCNuZXdBcHBseSlcbiAqXG4gKiBUaGVzZSBtZXRob2RzIGNhbiBiZSBbY2hhaW5lZF0ocHJvdG8uanMuaHRtbCNQcm90bylcbiAqL1xudmFyIHByb3RvdHlwZU1ldGhvZHMgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBleHRlbmRQcm90bzogZXh0ZW5kUHJvdG8sXG4gICAgY3JlYXRlU3ViY2xhc3M6IGNyZWF0ZVN1YmNsYXNzLFxuICAgIG1ha2VTdWJjbGFzczogbWFrZVN1YmNsYXNzLFxuICAgIG5ld0FwcGx5OiBuZXdBcHBseVxufTtcblxuXG52YXIgX18gPSByZXF1aXJlKCcuL3Byb3RvX29iamVjdCcpO1xuXG5fXy5leHRlbmQuY2FsbChfXywgcmVxdWlyZSgnLi9wcm90b19mdW5jdGlvbicpKTtcblxuXG4vKipcbiAqIEFkZHMgbm9uLWVudW1lcmFibGUsIG5vbi1jb25maWd1cmFibGUgYW5kIG5vbi13cml0YWJsZSBwcm9wZXJ0aWVzIHRvIHRoZSBwcm90b3R5cGUgb2YgY29uc3RydWN0b3IgZnVuY3Rpb24uXG4gKiBVc2FnZTpcbiAqIGBgYFxuICogZnVuY3Rpb24gTXlDbGFzcygpIHt9XG4gKiBfLmV4dGVuZFByb3RvKE15Q2xhc3MsIHtcbiAqICAgICBtZXRob2QxOiBmdW5jdGlvbigpIHt9LFxuICogICAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkge31cbiAqIH0pO1xuICogYGBgXG4gKiBUbyBleHRlbmQgY2xhc3MgdmlhIG9iamVjdDpcbiAqIGBgYFxuICogXy5leHRlbmRQcm90byhvYmouY29uc3RydWN0b3IsIG1ldGhvZHMpO1xuICogYGBgXG4gKiBSZXR1cm5zIHBhc3NlZCBjb25zdHJ1Y3Rvciwgc28gZnVuY3Rpb25zIF8uZXh0ZW5kUHJvdG8sIFtfLmV4dGVuZF0ob2JqZWN0LmpzLmh0bWwjZXh0ZW5kKSBhbmQgXy5tYWtlU3ViY2xhc3MgY2FuIGJlIFtjaGFpbmVkXShwcm90by5qcy5odG1sKS4gXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2VsZiBjb25zdHJ1Y3RvciBmdW5jdGlvblxuICogQHBhcmFtIHtPYmplY3R9IG1ldGhvZHMgYSBtYXAgb2YgZnVuY3Rpb25zLCBrZXlzIHdpbGwgYmUgaW5zdGFuY2UgbWV0aG9kcyAocHJvcGVydGllcyBvZiB0aGUgY29uc3RydWN0b3IgcHJvdG90eXBlKVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGV4dGVuZFByb3RvKG1ldGhvZHMpIHtcbiAgICB2YXIgcHJvcERlc2NyaXB0b3JzID0ge307XG5cbiAgICBfXy5lYWNoS2V5LmNhbGwobWV0aG9kcywgZnVuY3Rpb24obWV0aG9kLCBuYW1lKSB7XG4gICAgICAgIHByb3BEZXNjcmlwdG9yc1tuYW1lXSA9IHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiBtZXRob2RcbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMucHJvdG90eXBlLCBwcm9wRGVzY3JpcHRvcnMpO1xuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogTWFrZXMgYSBzdWJjbGFzcyBvZiBjbGFzcyBgdGhpc0NsYXNzYC5cbiAqIFRoZSByZXR1cm5lZCBmdW5jdGlvbiB3aWxsIGhhdmUgc3BlY2lmaWVkIGBuYW1lYCBpZiBzdXBwbGllZC5cbiAqIFRoZSBjb25zdHJ1Y3RvciBvZiBzdXBlcmNsYXNzIHdpbGwgYmUgY2FsbGVkIGluIHN1YmNsYXNzIGNvbnN0cnVjdG9yIGJ5IGRlZmF1bHQgdW5sZXNzIGBhcHBseUNvbnN0cnVjdG9yID09PSBmYWxzZWAgKG5vdCBqdXN0IGZhbHN5KS5cbiAqIENvcGllcyBgdGhpc0NsYXNzYCBjbGFzcyBtZXRob2RzIHRvIGNyZWF0ZWQgc3ViY2xhc3MuIEZvciB0aGVtIHRvIHdvcmsgY29ycmVjdGx5IHRoZXkgc2hvdWxkIHVzZSBgdGhpc2AgdG8gcmVmZXIgdG8gdGhlIGNsYXNzIHJhdGhlciB0aGFuIGV4cGxpY2l0IHN1cGVyY2xhc3MgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aGlzQ2xhc3MgQSBjbGFzcyB0byBtYWtlIHN1YmNsYXNzIG9mXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBPcHRpb25hbCBuYW1lIG9mIHN1YmNsYXNzIGNvbnN0cnVjdG9yIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGFwcGx5Q29uc3RydWN0b3IgT3B0aW9uYWwgZmFsc2UgdmFsdWUgKG5vdCBmYWxzeSkgdG8gcHJldmVudCBjYWxsIG9mIGluaGVyaXRlZCBjb25zdHJ1Y3RvciBpbiB0aGUgY29uc3RydWN0b3Igb2Ygc3ViY2xhc3NcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBjcmVhdGVTdWJjbGFzcyhuYW1lLCBhcHBseUNvbnN0cnVjdG9yKSB7XG4gICAgdmFyIHRoaXNDbGFzcyA9IHRoaXM7XG4gICAgdmFyIHN1YmNsYXNzO1xuXG4gICAgLy8gbmFtZSBpcyBvcHRpb25hbFxuICAgIG5hbWUgPSBuYW1lIHx8ICcnO1xuXG4gICAgLy8gYXBwbHkgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvclxuICAgIHZhciBjb25zdHJ1Y3RvckNvZGUgPSBhcHBseUNvbnN0cnVjdG9yID09PSBmYWxzZVxuICAgICAgICAgICAgPyAnJ1xuICAgICAgICAgICAgOiAndGhpc0NsYXNzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7JztcblxuICAgIGV2YWwoJ3N1YmNsYXNzID0gZnVuY3Rpb24gJyArIG5hbWUgKyAnKCl7ICcgKyBjb25zdHJ1Y3RvckNvZGUgKyAnIH0nKTtcblxuICAgIG1ha2VTdWJjbGFzcy5jYWxsKHN1YmNsYXNzLCB0aGlzQ2xhc3MpO1xuXG4gICAgLy8gY29weSBjbGFzcyBtZXRob2RzXG4gICAgLy8gLSBmb3IgdGhlbSB0byB3b3JrIGNvcnJlY3RseSB0aGV5IHNob3VsZCBub3QgZXhwbGljdGx5IHVzZSBzdXBlcmNsYXNzIG5hbWVcbiAgICAvLyBhbmQgdXNlIFwidGhpc1wiIGluc3RlYWRcbiAgICBfXy5kZWVwRXh0ZW5kLmNhbGwoc3ViY2xhc3MsIHRoaXNDbGFzcywgdHJ1ZSk7XG5cbiAgICByZXR1cm4gc3ViY2xhc3M7XG59XG5cblxuLyoqXG4gKiBTZXRzIHVwIHByb3RvdHlwZSBjaGFpbiB0byBjaGFuZ2UgYHRoaXNDbGFzc2AgKGEgY29uc3RydWN0b3IgZnVuY3Rpb24pIHNvIHRoYXQgaXQgYmVjb21lcyBhIHN1YmNsYXNzIG9mIGBTdXBlcmNsYXNzYC5cbiAqIFJldHVybnMgYHRoaXNDbGFzc2Agc28gaXQgY2FuIGJlIFtjaGFpbmVkXShwcm90by5qcy5odG1sKSB3aXRoIF8uZXh0ZW5kUHJvdG8gYW5kIFtfLmV4dGVuZF0ob2JqZWN0LmpzLmh0bWwjZXh0ZW5kKS5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aGlzQ2xhc3MgQSBjbGFzcyB0aGF0IHdpbGwgYmVjb21lIGEgc3ViY2xhc3Mgb2YgU3VwZXJjbGFzc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gU3VwZXJjbGFzcyBBIGNsYXNzIHRoYXQgd2lsbCBiZWNvbWUgYSBzdXBlcmNsYXNzIG9mIHRoaXNDbGFzc1xuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIG1ha2VTdWJjbGFzcyhTdXBlcmNsYXNzKSB7XG4gICAgLy8gcHJvdG90eXBlIGNoYWluXG4gICAgdGhpcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN1cGVyY2xhc3MucHJvdG90eXBlKTtcbiAgICBcbiAgICAvLyBzdWJjbGFzcyBpZGVudGl0eVxuICAgIGV4dGVuZFByb3RvLmNhbGwodGhpcywge1xuICAgICAgICBjb25zdHJ1Y3RvcjogdGhpc1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8qKlxuICogQ2FsbHMgY29uc3RydWN0b3IgYHRoaXNgIHdpdGggYXJndW1lbnRzIHBhc3NlZCBhcyBhcnJheVxuICogXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aGlzQ2xhc3MgQSBjbGFzcyBjb25zdHJ1Y3RvciB0aGF0IHdpbGwgYmUgY2FsbGVkXG4gKiBAcmV0dXJuIHtBcnJheXxBcnJheS1saWtlfSBhcmdzIEFycmF5IG9mIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIG5ld0FwcGx5KGFyZ3MpIHtcbiAgICBpZiAoISBBcnJheS5pc0FycmF5KGFyZ3MpKVxuICAgICAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncyk7XG4gICAgLy8gXCJudWxsXCIgaXMgY29udGV4dCB0byBwYXNzIHRvIGNsYXNzIGNvbnN0cnVjdG9yLCBmaXJzdCBwYXJhbWV0ZXIgb2YgYmluZFxuICAgIHZhciBhcmdzID0gW251bGxdLmNvbmNhdChhcmdzKTtcbiAgICByZXR1cm4gbmV3IChGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseSh0aGlzLCBhcmdzKSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIF9fID0gcmVxdWlyZSgnLi9wcm90b19vYmplY3QnKTtcblxuXG4vKipcbiAqIC0gW2ZpcnN0VXBwZXJDYXNlXSgjZmlyc3RVcHBlckNhc2UpXG4gKiAtIFtmaXJzdExvd2VyQ2FzZV0oI2ZpcnN0TG93ZXJDYXNlKVxuICogLSBbdG9SZWdFeHBdKCN0b1JlZ0V4cClcbiAqIC0gW3RvRnVuY3Rpb25dKCN0b0Z1bmN0aW9uKVxuICogLSBbdG9EYXRlXSgjdG9EYXRlKVxuICogLSBbdG9RdWVyeVN0cmluZ10oI3RvUXVlcnlTdHJpbmcpXG4gKiAtIFtmcm9tUXVlcnlTdHJpbmddKCNmcm9tUXVlcnlTdHJpbmcpXG4gKiAtIFtqc29uUGFyc2VdKCNqc29uUGFyc2UpXG4gKiAtIFtoYXNoQ29kZV0oI2hhc2hDb2RlKVxuICogLSBbdW5QcmVmaXhdKCN1blByZWZpeClcbiAqL1xuIHZhciBzdHJpbmdNZXRob2RzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZmlyc3RVcHBlckNhc2U6IGZpcnN0VXBwZXJDYXNlLFxuICAgIGZpcnN0TG93ZXJDYXNlOiBmaXJzdExvd2VyQ2FzZSxcbiAgICB0b1JlZ0V4cDogdG9SZWdFeHAsXG4gICAgdG9GdW5jdGlvbjogdG9GdW5jdGlvbixcbiAgICB0b0RhdGU6IHRvRGF0ZSxcbiAgICB0b1F1ZXJ5U3RyaW5nOiB0b1F1ZXJ5U3RyaW5nLFxuICAgIGZyb21RdWVyeVN0cmluZzogZnJvbVF1ZXJ5U3RyaW5nLFxuICAgIGpzb25QYXJzZToganNvblBhcnNlLFxuICAgIGhhc2hDb2RlOiBoYXNoQ29kZSxcbiAgICB1blByZWZpeDogdW5QcmVmaXhcbn07XG5cblxuLyoqXG4gKiBSZXR1cm5zIHN0cmluZyB3aXRoIHRoZSBmaXJzdCBjaGFyYWN0ZXIgY2hhbmdlZCB0byB1cHBlciBjYXNlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxmIEEgc3RyaW5nIHRoYXQgd2lsbCBoYXZlIGl0cyBmaXJzdCBjaGFyYWN0ZXIgcmVwbGFjZWRcbiAqL1xuZnVuY3Rpb24gZmlyc3RVcHBlckNhc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMgPyB0aGlzWzBdLnRvVXBwZXJDYXNlKCkgKyB0aGlzLnNsaWNlKDEpIDogdGhpcztcbn1cblxuXG4vKipcbiAqIFJldHVybnMgc3RyaW5nIHdpdGggdGhlIGZpcnN0IGNoYXJhY3RlciBjaGFuZ2VkIHRvIGxvd2VyIGNhc2UuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGYgQSBzdHJpbmcgdGhhdCB3aWxsIGhhdmUgaXRzIGZpcnN0IGNoYXJhY3RlciByZXBsYWNlZFxuICovXG5mdW5jdGlvbiBmaXJzdExvd2VyQ2FzZSgpIHtcbiAgICByZXR1cm4gdGhpcyA/IHRoaXNbMF0udG9Mb3dlckNhc2UoKSArIHRoaXMuc2xpY2UoMSkgOiB0aGlzO1xufVxuXG5cbi8qKlxuICogQ29udmVydHMgc3RyaW5nIGNyZWF0ZWQgYnkgYHRvU3RyaW5nYCBtZXRob2Qgb2YgUmVnRXhwIGJhY2sgdG8gUmVnRXhwXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGYgc3RyaW5nIGNvbnRhaW5pbmcgcmVndWxhciBleHByZXNzaW9uIGluY2x1ZGluZyBlbmNsb3NpbmcgXCIvXCIgc3ltYm9scyBhbmQgZmxhZ3NcbiAqIEByZXR1cm4ge1JlZ0V4cH1cbiAqL1xuZnVuY3Rpb24gdG9SZWdFeHAoKSB7XG4gICAgdmFyIHJ4ID0gdGhpcy5tYXRjaChyZWdleHBTdHJpbmdQYXR0ZXJuKTtcbiAgICBpZiAocngpIHJldHVybiBuZXcgUmVnRXhwKHJ4WzFdLCByeFsyXSk7XG59XG52YXIgcmVnZXhwU3RyaW5nUGF0dGVybiA9IC9eXFwvKC4qKVxcLyhbZ2lteV0qKSQvO1xuXG5cbi8qKlxuICogQ29udmVydHMgc3RyaW5nIGNyZWF0ZWQgYnkgYHRvU3RyaW5nYCBtZXRob2Qgb2YgZnVuY3Rpb24gYmFjayB0byBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxmIHN0cmluZyBjb250YWluaW5nIGZ1bGwgZnVuY3Rpb24gY29kZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIHRvRnVuY3Rpb24oKSB7XG4gICAgdmFyIGZ1bmM7XG4gICAgdmFyIGNvZGUgPSAnZnVuYyA9ICcgKyB0aGlzICsgJzsnO1xuICAgIHRyeSB7XG4gICAgICAgIGV2YWwoY29kZSk7XG4gICAgICAgIHJldHVybiBmdW5jO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxufVxuXG5cbi8qKlxuICogQ29udmVydHMgc3RyaW5nIHRvIGRhdGUgaW4gYSBzYWZlIHdheSBzbyB0aGF0IHRoZSByZXNpdWx0IGlzIHVuZGVmaW5lZCBpZiBkYXRlIGlzIGludmFsaWRcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xEYXRlfSBzZWxmIHN0cmluZyBvciBkYXRlIG9iamVjdCB0byBjb252ZXJ0IHRvIFZBTElEIGRhdGVcbiAqIEByZXR1cm4ge1t0eXBlXX0gW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiB0b0RhdGUoKSB7XG4gICAgaWYgKCEgdGhpcykgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICAgIHZhciBkYXRlID0gbmV3IERhdGUodGhpcyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICBpZiAoZGF0ZSAmJiBkYXRlLmdldFRpbWUgJiYgIWlzTmFOKGRhdGUuZ2V0VGltZSgpKSlcbiAgICAgICAgcmV0dXJuIGRhdGU7XG59XG5cblxuLyoqXG4gKiBDb252ZXJ0IHBhcmFtcyBvYmplY3QgdG8gYSB1cmwgc3R5bGUgcXVlcnkgc3RyaW5nICh3aXRob3V0IFwiP1wiKVxuICogXG4gKiBAcGFyYW0ge09iamVjdH0gc2VsZiBUaGUgb2JqZWN0IGhhc2ggdG8gYmUgY29udmVydGVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlbmNvZGUgb3B0aW9uYWwgZnVuY3Rpb24gdXNlZCB0byBlbmNvZGUgZGF0YSwgZW5jb2RlVVJJQ29tcG9uZW50IGlzIHVzZWQgaWYgbm90IHNwZWNpZmllZFxuICogQHJldHVybiB7U3RyaW5nfSB0aGUgcmVzdWx0aW5nIHF1ZXJ5IHN0cmluZ1xuICovXG5mdW5jdGlvbiB0b1F1ZXJ5U3RyaW5nKGVuY29kZSkge1xuICAgIHZhciBxcyA9ICcnXG4gICAgICAgICwgcGFyYW1zID0gdGhpcyB8fCB7fVxuICAgICAgICAsIGVuY29kZSA9IGVuY29kZSB8fCBlbmNvZGVVUklDb21wb25lbnQ7XG5cbiAgICBfXy5lYWNoS2V5LmNhbGwocGFyYW1zLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgIHFzICs9IGtleSArICc9JyArIGVuY29kZSh2YWx1ZSkgKyAnJic7XG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIHFzLnNsaWNlKDAsIC0xKTtcbn1cblxuXG4vKipcbiAqIENvbnZlcnQgdXJsIHN0eWxlIHF1ZXJ5IHN0cmluZyAod2l0aG91dCBcIj9cIikgaW50byBvYmplY3QgaGFzaFxuICogXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZiBUaGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZGVjb2RlIG9wdGlvbmFsIGRlY29kZSBmdW5jdGlvbiwgZGVjb2RlVVJJQ29tcG9uZW50IHdpbGwgYmUgdXNlZCBpZiBub3Qgc3VwcGxpZWRcbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIHJlc3VsdGluZyBvYmplY3QgaGFzaFxuICovXG5mdW5jdGlvbiBmcm9tUXVlcnlTdHJpbmcoZGVjb2RlKSB7XG4gICAgdmFyIHBhaXJzID0gdGhpcy5zcGxpdCgnJicpXG4gICAgICAgICwgcmVzdWx0cyA9IHt9XG4gICAgICAgICwgZGVjb2RlID0gZGVjb2RlIHx8IGRlY29kZVVSSUNvbXBvbmVudDtcblxuICAgIHBhaXJzLmZvckVhY2goZnVuY3Rpb24ocGFpcikge1xuICAgICAgICB2YXIgc3BsaXRQYWlyID0gcGFpci5zcGxpdCgnPScpO1xuICAgICAgICBpZiAoc3BsaXRQYWlyLmxlbmd0aCA8IDIpIHJldHVybjtcbiAgICAgICAgdmFyIGtleSA9IHNwbGl0UGFpclswXVxuICAgICAgICAgICAgLCB2YWx1ZSA9IGRlY29kZShzcGxpdFBhaXJbMV0gfHwgJycpO1xuICAgICAgICBpZiAoIWtleSkgcmV0dXJuO1xuICAgICAgICByZXN1bHRzW2tleV0gPSB2YWx1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xufVxuXG5cbi8qKlxuICogU2FmZSBKU09OLnBhcnNlLCByZXR1cm5zIHVuZGVmaW5lZCBpZiBKU09OLnBhcnNlIHRocm93cyBhbiBleGNlcHRpb25cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZiBKU09OIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvYmplY3RcbiAqIEByZXR1cm4ge09iamVjdHx1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIGpzb25QYXJzZSgpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzKTtcbiAgICB9IGNhdGNoIChlKSB7fVxufVxuXG5cbi8qKlxuICogRGFuIEJlcm5zdGVpbidzIGFsZ29yeXRobSB0byBjcmVhdGUgaGFzaCBmcm9tIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxmIHN0cmluZyB0byBjb252ZXJ0IHRvIGhhc2hcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqL1xuZnVuY3Rpb24gaGFzaENvZGUoKSB7XG4gICAgdmFyIGhhc2ggPSA1MzgxXG4gICAgICAgICwgc3RyID0gdGhpc1xuICAgICAgICAsIGxlbiA9IHN0ci5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgY2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBoYXNoID0gKChoYXNoIDw8IDUpICsgaGFzaCkgKyBjaGFyOyAvKiBoYXNoICogMzMgKyBjICovXG4gICAgfVxuICAgIHJldHVybiBoYXNoO1xufVxuXG5cbi8qKlxuICogUmVtb3ZlcyBnaXZlbiBwcmVmaXggZnJvbSB0aGUgc3RyaW5nLiBJZiBzdHJpbmcgZG9lcyBub3QgYmVnaW4gZnJvbSB0aGUgcHJlZml4LCByZXR1cm5zIHVuZGVmaW5lZFxuICogXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VsZlxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiB1blByZWZpeChzdHIpIHtcbiAgICBpZiAodGhpcy5pbmRleE9mKHN0cikgPT0gMClcbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZShzdHIsICcnKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiAtIFt0aW1lc10oI3RpbWVzKVxuICogLSBbcmVwZWF0XSgjcmVwZWF0KVxuICogLSBbdGFwXSgjdGFwKVxuICogLSBbcmVzdWx0XSgjcmVzdWx0KVxuICogLSBbaWRlbnRpdHldKCNpZGVudGl0eSlcbiAqIC0gW3Byb3BlcnR5XSgjcHJvcGVydHkpXG4gKiAtIFtjb21wYXJlUHJvcGVydHldKCNjb21wYXJlUHJvcGVydHkpXG4gKiAtIFtub29wXSgjbm9vcClcbiAqL1xudmFyIHV0aWxNZXRob2RzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgdGltZXM6IHRpbWVzLFxuICAgIHJlcGVhdDogcmVwZWF0LFxuICAgIHRhcDogdGFwLFxuICAgIHJlc3VsdDogcmVzdWx0LFxuICAgIGlkZW50aXR5OiBpZGVudGl0eSxcbiAgICBwcm9wZXJ0eTogcHJvcGVydHksXG4gICAgY29tcGFyZVByb3BlcnR5OiBjb21wYXJlUHJvcGVydHksXG4gICAgbm9vcDogbm9vcFxufTtcblxuXG4vKipcbiAqIENhbGxzIGBjYWxsYmFja2AgYHNlbGZgIHRpbWVzIHdpdGggYHRoaXNBcmdgIGFzIGNvbnRleHQuIENhbGxiYWNrIGlzIHBhc3NlZCBpdGVyYXRpb24gaW5kZXggZnJvbSAwIHRvIGBzZWxmLTFgXG4gKiBcbiAqIEBwYXJhbSB7SW50ZWdlcn0gc2VsZlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7QW55fSB0aGlzQXJnXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gdGltZXMoY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICB2YXIgYXJyID0gQXJyYXkoTWF0aC5tYXgoMCwgdGhpcykpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpczsgaSsrKVxuICAgICAgICBhcnJbaV0gPSBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIGkpO1xuICAgIHJldHVybiBhcnI7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFycmF5IHdpdGggdGhlIGZpcnN0IGFyZ3VtZW50IHJlcGVhdGVkIGB0aW1lc2AgdGltZXNcbiAqIEBwYXJhbSAge0FueX0gc2VsZlxuICogQHBhcmFtICB7SW50ZWdlcn0gdGltZXNcbiAqIEByZXR1cm4ge0FycmF5W0FueV19XG4gKi9cbmZ1bmN0aW9uIHJlcGVhdCh0aW1lcykge1xuICAgIHZhciBhcnIgPSBBcnJheShNYXRoLm1heCgwLCB0aW1lcykpOztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRpbWVzOyBpKyspXG4gICAgICAgIGFycltpXSA9IHRoaXM7XG4gICAgcmV0dXJuIGFycjtcbn1cblxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIHRhcCBpbnRvIGNoYWluZWQgbWV0aG9kcyBhbmQgdG8gaW5zcGVjdCBpbnRlcm1lZGlhcnkgcmVzdWx0XG4gKlxuICogQHBhcmFtIHtBbnl9IHNlbGYgdmFsdWUgdGhhdCdzIHBhc3NlZCBiZXR3ZWVuIGNoYWluZWQgbWV0aG9kc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHZhbHVlIChib3RoIGFzIGNvbnRleHQgYW5kIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIpXG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmZ1bmN0aW9uIHRhcChmdW5jKSB7XG4gICAgZnVuYy5jYWxsKHRoaXMsIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xufTtcblxuXG4vKipcbiAqIENhbGxzIGZ1bmN0aW9uIGBzZWxmYCAoZmlyc3QgcGFyYW1ldGVyIG9mIF8ucmVzdWx0KSB3aXRoIGdpdmVuIGNvbnRleHQgYW5kIGFyZ3VtZW50c1xuICogXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufEFueX0gc2VsZlxuICogQHBhcmFtIHtBbnl9IHRoaXNBcmcgY29udGV4dFxuICogQHBhcmFtIHtMaXN0fSBhcmd1bWVudHMgZXh0cmEgYXJndW1lbnRzXG4gKiBAcmV0dXJuIHtBbnl9XG4gKi9cbmZ1bmN0aW9uIHJlc3VsdCh0aGlzQXJnKSB7IC8vLCBhcmd1bWVudHNcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gdGhpcy5hcHBseSh0aGlzQXJnLCBhcmdzKVxuICAgICAgICAgICAgOiB0aGlzO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBzZWxmLiBVc2VmdWwgZm9yIHVzaW5nIGFzIGFuIGl0ZXJhdG9yIGlmIHRoZSBhY3R1YWwgdmFsdWUgbmVlZHMgdG8gYmUgcmV0dXJuZWQuIFVubGlrZSBpbiB1bmRlcnNjb3JlIGFuZCBsb2Rhc2gsIHRoaXMgZnVuY3Rpb24gaXMgTk9UIHVzZWQgYXMgZGVmYXVsdCBpdGVyYXRvci5cbiAqXG4gKiBAcGFyYW0ge0FueX0gc2VsZiBcbiAqIEByZXR1cm4ge0FueX1cbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGZ1bmN0aW9uIHRoYXQgcGlja3MgdGhlIHByb3BlcnR5IGZyb20gdGhlIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxmXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gcHJvcGVydHkoKSB7XG4gICAgdmFyIGtleSA9IHRoaXM7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqW2tleV07XG4gICAgfTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCBpbiBhcnJheSBzb3J0IHRvIHNvcnQgYnkgYSBnaXZlbiBwcm9wZXJ0eVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxmXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gY29tcGFyZVByb3BlcnR5KCkge1xuICAgIHZhciBrZXkgPSB0aGlzO1xuICAgIHJldHVybiBmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgIHJldHVybiBhW2tleV0gPCBiW2tleV1cbiAgICAgICAgICAgID8gLTFcbiAgICAgICAgICAgIDogYVtrZXldID4gYltrZXldXG4gICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgOiAwO1xuICAgIH07XG59XG5cblxuLyoqXG4gKiBGdW5jdGlvbiB0aGF0IGRvZXMgbm90aGluZ1xuICovXG5mdW5jdGlvbiBub29wKCkge31cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbWFrZVByb3RvSW5zdGFuY2VNZXRob2Q6IG1ha2VQcm90b0luc3RhbmNlTWV0aG9kLFxuICAgIG1ha2VQcm90b0Z1bmN0aW9uOiBtYWtlUHJvdG9GdW5jdGlvbixcbiAgICBtYWtlRmluZE1ldGhvZDogbWFrZUZpbmRNZXRob2Rcbn1cblxuXG5mdW5jdGlvbiBtYWtlUHJvdG9JbnN0YW5jZU1ldGhvZChtZXRob2QpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuc2VsZiA9IG1ldGhvZC5hcHBseSh0aGlzLnNlbGYsIGFyZ3VtZW50cyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG59XG5cblxuZnVuY3Rpb24gbWFrZVByb3RvRnVuY3Rpb24obWV0aG9kKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyB3aGVuIHRoZSBtZXRob2QgaXMgZXhlY3V0ZWQsIHRoZSB2YWx1ZSBvZiBcInRoaXNcIiB3aWxsIGJlIGFyZ3VtZW50c1swXSxcbiAgICAgICAgLy8gb3RoZXIgYXJndW1lbnRzIHN0YXJ0aW5nIGZyb20gIzEgd2lsbCBwYXNzZWQgdG8gbWV0aG9kIGFzIHBhcmFtZXRlcnMuXG4gICAgICAgIHJldHVybiBtZXRob2QuY2FsbC5hcHBseShtZXRob2QsIGFyZ3VtZW50cyk7XG4gICAgfTtcbn1cblxuXG52YXIgX2Vycm9yID0gbmV3IEVycm9yO1xuXG4vKipcbiAqIFJldHVybnMgYGZpbmRgIG9yIGBmaW5kSW5kZXhgIG1ldGhvZCwgZGVwZW5kaW5nIG9uIHBhcmFtZXRlclxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hNZXRob2QgLSBtZXRob2QgdG8gdXNlIGZvciBpdGVyYXRpb24gKGZvckVhY2ggZm9yIGFycmF5IG9yIGVhY2hLZXkgZm9yIG9iamVjdClcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaW5kV2hhdCAndmFsdWUnIC0gcmV0dXJucyBmaW5kIG1ldGhvZCBvZiBBcnJheSAoaW1wbGVtZW50ZWQgaW4gRVM2KSBvciBmaW5kVmFsdWUgbWV0aG9kIG9mIE9iamVjdCwgYW55dGhpbmcgZWxzZSA9IHJldHVybnMgZmluZEluZGV4L2ZpbmRLZXkgbWV0aG9kcy5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBtYWtlRmluZE1ldGhvZChlYWNoTWV0aG9kLCBmaW5kV2hhdCkge1xuICAgIHZhciBhcmdJbmRleCA9IGZpbmRXaGF0ID09ICd2YWx1ZScgPyAwIDogMTtcblxuICAgIHJldHVybiBmdW5jdGlvbiBmaW5kVmFsdWVPckluZGV4KGNhbGxiYWNrLCB0aGlzQXJnLCBvbmx5RW51bWVyYWJsZSkge1xuICAgICAgICB2YXIgY2F1Z2h0RXJyb3I7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlYWNoTWV0aG9kLmNhbGwodGhpcywgdGVzdEl0ZW0sIHRoaXNBcmcsIG9ubHlFbnVtZXJhYmxlKTtcbiAgICAgICAgfSBjYXRjaCAoZm91bmQpIHtcbiAgICAgICAgICAgIGlmIChmb3VuZCA9PT0gX2Vycm9yKSB0aHJvdyBjYXVnaHRFcnJvcjtcbiAgICAgICAgICAgIGVsc2UgcmV0dXJuIGZvdW5kO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGxvb2tpbmcgZm9yIGluZGV4IGFuZCBub3QgZm91bmQsIHJldHVybiAtMVxuICAgICAgICBpZiAoYXJnSW5kZXggJiYgZWFjaE1ldGhvZCA9PSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaClcbiAgICAgICAgICAgIHJldHVybiAtMTsgXG5cbiAgICAgICAgZnVuY3Rpb24gdGVzdEl0ZW0odmFsdWUsIGluZGV4LCBzZWxmKSB7XG4gICAgICAgICAgICB2YXIgdGVzdDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGVzdCA9IGNhbGxiYWNrLmNhbGwodGhpcywgdmFsdWUsIGluZGV4LCBzZWxmKTtcbiAgICAgICAgICAgIH0gY2F0Y2goZXJyKSB7XG4gICAgICAgICAgICAgICAgY2F1Z2h0RXJyb3IgPSBlcnI7XG4gICAgICAgICAgICAgICAgdGhyb3cgX2Vycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRlc3QpXG4gICAgICAgICAgICAgICAgdGhyb3cgYXJndW1lbnRzW2FyZ0luZGV4XTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ== ; \ No newline at end of file diff --git a/package.json b/package.json index 838d5ca..53cf033 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "milojs", - "version": "0.2.5", + "version": "0.2.6", "description": "Browser/nodejs reactive programming and data driven DOM manipulation with modular components.", "keywords": [ "framework",