From 381ecd4ac24ed8f9affb429a175ac8ec8c992a1f Mon Sep 17 00:00:00 2001 From: Brett McStotts Date: Fri, 22 Sep 2023 12:51:08 -0400 Subject: [PATCH] added support for RequestStorageAccess page. --- .eslintrc.json | 19 + README.md | 1 + package-lock.json | 6 +- package.json | 4 +- release/connect-streams-dr-min.js | 2 +- release/connect-streams-dr.js | 2 +- release/connect-streams-min.js | 2 +- release/connect-streams.js | 736 +++++++++++++++++------ src/core.js | 372 ++++++------ src/index.d.ts | 66 +- src/request-storage-access.js | 354 +++++++++++ test/unit/core.spec.js | 7 + test/unit/request-storage-access.spec.js | 344 +++++++++++ test/unit/test-setup.js | 73 +-- webpack/connect-streams.config.js | 49 +- 15 files changed, 1616 insertions(+), 421 deletions(-) create mode 100644 .eslintrc.json create mode 100644 src/request-storage-access.js create mode 100644 test/unit/request-storage-access.spec.js diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 00000000..f53077c4 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,19 @@ +{ + "root": true, + "parserOptions": { + "project": "tsconfig.json" + }, + "extends": ["@amzn/lilax-style/lint-ts"], + "globals": { + "globalThis": "readonly", + "globalConnect": "writable" + }, + "rules": { + "wrap-iife": ["error", "inside"], + "consistent-return": "off", + "func-names": "off", + "max-len": "off", + "no-console": "off", + "no-underscore-dangle": "off" + } +} diff --git a/README.md b/README.md index 7c237ea4..6195dba5 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ Run `npm run release` to generate new release files. Full instructions for build In version 1.x, we also support `make` for legacy builds. This option was removed in version 2.x. # Important Announcements +1. September 2023 - Amazon Connect CCP uses cookies for authentication. As part of Google's [Privacy Sandbox](https://privacysandbox.com/open-web/#the-privacy-sandbox-timeline) initiative, Google Chrome has announced plans to block third-party cookies (that is, cookies passed between two top level domains). Version 2.6.2 comes with request storage access API implementation which allows CCP to continue using third party cookies. [Learn more](https://docs.aws.amazon.com/connect/latest/adminguide/what-is-amazon-connect.html). 1. December 2022 - In addition to the CCP, customers can now embed an application that provides guided experiences to your agents using the connect.agentApp. See the [updated documentation](https://github.com/amazon-connect/amazon-connect-streams/blob/master/Documentation.md#initialization-for-ccp-customer-profiles-wisdom-and-customviews) for details on usage. * ### Guided experiences for agents + With Amazon Connect you can now create guided step-by-step experiences that walk agents through tailored views that focus on what must be seen or done by the agent at a given moment during an interaction. You can design workflows for various types of customer interactions and present agents with different step-by-step guides based on context, such as call queue, customer information, and interactive voice response (IVR). This feature is available in the Connect agent workspace as well as an embeddable application that can be embedded into another website via the Streams API. For more information, visit the AWS website: https://aws.amazon.com/connect/agent-workspace/ diff --git a/package-lock.json b/package-lock.json index 11722175..46b93db3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "amazon-connect-streams", - "version": "2.6.1", + "version": "2.6.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "amazon-connect-streams", - "version": "2.6.1", + "version": "2.6.2", "license": "Apache-2.0", "devDependencies": { "chai": "^4.3.7", @@ -7896,4 +7896,4 @@ "dev": true } } -} +} \ No newline at end of file diff --git a/package.json b/package.json index 381e3ccf..4c5bd5eb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "amazon-connect-streams", - "version": "2.6.1", + "version": "2.6.2", "description": "Amazon Connect Streams Library", "engines": { "node": ">=12.0.0" @@ -52,4 +52,4 @@ "webpack-cli": "^4.9.1", "webpack-plugin-replace": "^1.2.0" } -} +} \ No newline at end of file diff --git a/release/connect-streams-dr-min.js b/release/connect-streams-dr-min.js index 9303a92c..e29c9bd3 100644 --- a/release/connect-streams-dr-min.js +++ b/release/connect-streams-dr-min.js @@ -1 +1 @@ -(()=>{var l;(l={772:()=>{!function(){var l=this||globalThis,Z=l.connect||{};l.connect=Z,l.globalConnect={},l.lily=Z,globalConnect.Container=null;var b=window.atob("KCgpPT57dmFyIGU9ezgyMTooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10LHQuYWdlbnRBcHA9e307dmFyIG49ImNjcCI7dC5hZ2VudEFwcC5pbml0Q0NQPXQuY29yZS5pbml0Q0NQLHQuYWdlbnRBcHAuaXNJbml0aWFsaXplZD1mdW5jdGlvbihlKXt9LHQuYWdlbnRBcHAuaW5pdEFwcENvbW11bmljYXRpb249ZnVuY3Rpb24oZSxuKXt2YXIgcj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKSxvPW5ldyB0LklGcmFtZUNvbmR1aXQobix3aW5kb3csciksaT1bdC5BZ2VudEV2ZW50cy5VUERBVEUsdC5Db250YWN0RXZlbnRzLlZJRVcsdC5FdmVudFR5cGUuQUNLTk9XTEVER0UsdC5FdmVudFR5cGUuVEVSTUlOQVRFRCx0LlRhc2tFdmVudHMuQ1JFQVRFRF07ci5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oZSl7aS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKGUsKGZ1bmN0aW9uKHQpe28uc2VuZFVwc3RyZWFtKGUsdCl9KSl9KSl9KSl9O3ZhciByPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaW5kZXhPZigiY2NwLXYyIik7cmV0dXJuIGUuc2xpY2UoMCx0LTEpfTt0LmFnZW50QXBwLmluaXRBcHA9ZnVuY3Rpb24oZSxvLGkscyl7cz1zfHx7fTt2YXIgYT1pLmVuZHNXaXRoKCIvIik/aTppKyIvIixjPXMub25Mb2FkP3Mub25Mb2FkOm51bGwsdT17ZW5kcG9pbnQ6YSxzdHlsZTpzLnN0eWxlLG9uTG9hZDpjfTt0LmFnZW50QXBwLkFwcFJlZ2lzdHJ5LnJlZ2lzdGVyKGUsdSxkb2N1bWVudC5nZXRFbGVtZW50QnlJZChvKSksdC5hZ2VudEFwcC5BcHBSZWdpc3RyeS5zdGFydChlLChmdW5jdGlvbihvKXt2YXIgaT1vLmVuZHBvaW50LGE9by5jb250YWluZXJET007cmV0dXJue2luaXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZT09PW4/KHMuY2NwUGFyYW1zPXMuY2NwUGFyYW1zP3MuY2NwUGFyYW1zOnt9LHMuc3R5bGUmJihzLmNjcFBhcmFtcy5zdHlsZT1zLnN0eWxlKSxmdW5jdGlvbihlLG4sbyl7dmFyIGk9e2NjcFVybDplLGNjcExvYWRUaW1lb3V0OjFlNCxsb2dpblBvcHVwOiEwLGxvZ2luVXJsOnIoZSkrIi9sb2dpbiIsc29mdHBob25lOnthbGxvd0ZyYW1lZFNvZnRwaG9uZTohMCxkaXNhYmxlUmluZ3RvbmU6ITF9fSxzPXQubWVyZ2UoaSxvLmNjcFBhcmFtcyk7dC5jb3JlLmluaXRDQ1AobixzKX0oaSxhLHMpKTp0LmFnZW50QXBwLmluaXRBcHBDb21tdW5pY2F0aW9uKGUsaSl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXtyZXR1cm4gZT09PW4/KG89cihpKSsiL2xvZ291dCIsdC5mZXRjaChvLHtjcmVkZW50aWFsczoiaW5jbHVkZSJ9KS50aGVuKChmdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuRXZlbnRUeXBlLlRFUk1JTkFURSksITB9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3JldHVybiB0LmdldExvZygpLmVycm9yKCJBbiBlcnJvciBvY2N1cmVkIG9uIGxvZ291dC4iK2UpLndpdGhFeGNlcHRpb24oZSksd2luZG93LmxvY2F0aW9uLmhyZWY9bywhMX0pKSk6bnVsbDt2YXIgb319fSkpfSx0LmFnZW50QXBwLnN0b3BBcHA9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuYWdlbnRBcHAuQXBwUmVnaXN0cnkuc3RvcChlKX19KCl9LDUwMDooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10O3ZhciBuLHI9ImNjcCI7ZS5jb25uZWN0LmFnZW50QXBwLkFwcFJlZ2lzdHJ5PShuPXt9LHtyZWdpc3RlcjpmdW5jdGlvbihlLHQscil7bltlXT17Y29udGFpbmVyRE9NOnIsZW5kcG9pbnQ6dC5lbmRwb2ludCxzdHlsZTp0LnN0eWxlLGluc3RhbmNlOnZvaWQgMCxvbkxvYWQ6dC5vbkxvYWR9fSxzdGFydDpmdW5jdGlvbihlLHQpe2lmKG5bZV0pe3ZhciBvPW5bZV0uY29udGFpbmVyRE9NLGk9bltlXS5lbmRwb2ludCxzPW5bZV0uc3R5bGUsYT1uW2VdLm9uTG9hZDtpZihlIT09cil7dmFyIGM9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7cmV0dXJuIG8uc3JjPXQsby5zdHlsZT1ufHwid2lkdGg6IDEwMCU7IGhlaWdodDoxMDAlOyIsby5pZD1lLG9bImFyaWEtbGFiZWwiXT1lLG8ub25sb2FkPXIsby5zZXRBdHRyaWJ1dGUoInNhbmRib3giLCJhbGxvdy1mb3JtcyBhbGxvdy1wb3B1cHMgYWxsb3ctcG9wdXBzLXRvLWVzY2FwZS1zYW5kYm94IGFsbG93LXNhbWUtb3JpZ2luIGFsbG93LXNjcmlwdHMiKSxvfShlLGkscyxhKTtvLmFwcGVuZENoaWxkKGMpfXJldHVybiBuW2VdLmluc3RhbmNlPXQobltlXSksbltlXS5pbnN0YW5jZS5pbml0KCl9fSxzdG9wOmZ1bmN0aW9uKGUpe2lmKG5bZV0pe3ZhciB0LHI9bltlXSxvPXIuY29udGFpbmVyRE9NLnF1ZXJ5U2VsZWN0b3IoImlmcmFtZSIpO3JldHVybiByLmNvbnRhaW5lckRPTS5yZW1vdmVDaGlsZChvKSxyLmluc3RhbmNlJiYodD1yLmluc3RhbmNlLmRlc3Ryb3koKSxkZWxldGUgci5pbnN0YW5jZSksdH19fSl9KCl9LDk2NTooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10LHQuQWdlbnRTdGF0ZVR5cGU9dC5tYWtlRW51bShbImluaXQiLCJyb3V0YWJsZSIsIm5vdF9yb3V0YWJsZSIsIm9mZmxpbmUiXSksdC5BZ2VudFN0YXR1c1R5cGU9dC5BZ2VudFN0YXRlVHlwZSx0LkFnZW50QXZhaWxTdGF0ZXM9dC5tYWtlRW51bShbIkluaXQiLCJCdXN5IiwiQWZ0ZXJDYWxsV29yayIsIkNhbGxpbmdDdXN0b21lciIsIkRpYWxpbmciLCJKb2luaW5nIiwiUGVuZGluZ0F2YWlsYWJsZSIsIlBlbmRpbmdCdXN5Il0pLHQuQWdlbnRFcnJvclN0YXRlcz10Lm1ha2VFbnVtKFsiRXJyb3IiLCJBZ2VudEh1bmdVcCIsIkJhZEFkZHJlc3NBZ2VudCIsIkJhZEFkZHJlc3NDdXN0b21lciIsIkRlZmF1bHQiLCJGYWlsZWRDb25uZWN0QWdlbnQiLCJGYWlsZWRDb25uZWN0Q3VzdG9tZXIiLCJJbnZhbGlkTG9jYWxlIiwiTGluZUVuZ2FnZWRBZ2VudCIsIkxpbmVFbmdhZ2VkQ3VzdG9tZXIiLCJNaXNzZWRDYWxsQWdlbnQiLCJNaXNzZWRDYWxsQ3VzdG9tZXIiLCJNdWx0aXBsZUNjcFdpbmRvd3MiLCJSZWFsdGltZUNvbW11bmljYXRpb25FcnJvciJdKSx0LkVuZHBvaW50VHlwZT10Lm1ha2VFbnVtKFsicGhvbmVfbnVtYmVyIiwiYWdlbnQiLCJxdWV1ZSJdKSx0LkFkZHJlc3NUeXBlPXQuRW5kcG9pbnRUeXBlLHQuQ29ubmVjdGlvblR5cGU9dC5tYWtlRW51bShbImFnZW50IiwiaW5ib3VuZCIsIm91dGJvdW5kIiwibW9uaXRvcmluZyJdKSx0LkNvbm5lY3Rpb25TdGF0ZVR5cGU9dC5tYWtlRW51bShbImluaXQiLCJjb25uZWN0aW5nIiwiY29ubmVjdGVkIiwiaG9sZCIsImRpc2Nvbm5lY3RlZCIsInNpbGVudF9tb25pdG9yIiwiYmFyZ2UiXSksdC5Db25uZWN0aW9uU3RhdHVzVHlwZT10LkNvbm5lY3Rpb25TdGF0ZVR5cGUsdC5DT05ORUNUSU9OX0FDVElWRV9TVEFURVM9dC5zZXQoW3QuQ29ubmVjdGlvblN0YXRlVHlwZS5DT05ORUNUSU5HLHQuQ29ubmVjdGlvblN0YXRlVHlwZS5DT05ORUNURUQsdC5Db25uZWN0aW9uU3RhdGVUeXBlLkhPTEQsdC5Db25uZWN0aW9uU3RhdGVUeXBlLlNJTEVOVF9NT05JVE9SLHQuQ29ubmVjdGlvblN0YXRlVHlwZS5CQVJHRV0pLHQuQ09OTkVDVElPTl9DT05ORUNURURfU1RBVEVTPXQuc2V0KFt0LkNvbm5lY3Rpb25TdGF0ZVR5cGUuQ09OTkVDVEVELHQuQ29ubmVjdGlvblN0YXRlVHlwZS5TSUxFTlRfTU9OSVRPUix0LkNvbm5lY3Rpb25TdGF0ZVR5cGUuQkFSR0VdKSx0LkNvbnRhY3RTdGF0ZVR5cGU9dC5tYWtlRW51bShbImluaXQiLCJpbmNvbWluZyIsInBlbmRpbmciLCJjb25uZWN0aW5nIiwiY29ubmVjdGVkIiwibWlzc2VkIiwiZXJyb3IiLCJlbmRlZCJdKSx0LkNvbnRhY3RTdGF0dXNUeXBlPXQuQ29udGFjdFN0YXRlVHlwZSx0LkNPTlRBQ1RfQUNUSVZFX1NUQVRFUz10Lm1ha2VFbnVtKFsiaW5jb21pbmciLCJwZW5kaW5nIiwiY29ubmVjdGluZyIsImNvbm5lY3RlZCJdKSx0LkNvbnRhY3RUeXBlPXQubWFrZUVudW0oWyJ2b2ljZSIsInF1ZXVlX2NhbGxiYWNrIiwiY2hhdCIsInRhc2siXSksdC5Db250YWN0SW5pdGlhdGlvbk1ldGhvZD10Lm1ha2VFbnVtKFsiaW5ib3VuZCIsIm91dGJvdW5kIiwidHJhbnNmZXIiLCJxdWV1ZV90cmFuc2ZlciIsImNhbGxiYWNrIiwiYXBpIiwiZGlzY29ubmVjdCJdKSx0Lk1vbml0b3JpbmdNb2RlPXQubWFrZUVudW0oWyJTSUxFTlRfTU9OSVRPUiIsIkJBUkdFIl0pLHQuTW9uaXRvcmluZ0Vycm9yVHlwZXM9dC5tYWtlRW51bShbImludmFsaWRfdGFyZ2V0X3N0YXRlIl0pLHQuQ2hhbm5lbFR5cGU9dC5tYWtlRW51bShbIlZPSUNFIiwiQ0hBVCIsIlRBU0siXSksdC5NZWRpYVR5cGU9dC5tYWtlRW51bShbInNvZnRwaG9uZSIsImNoYXQiLCJ0YXNrIl0pLHQuU29mdHBob25lQ2FsbFR5cGU9dC5tYWtlRW51bShbImF1ZGlvX3ZpZGVvIiwidmlkZW9fb25seSIsImF1ZGlvX29ubHkiLCJub25lIl0pLHQuU29mdHBob25lRXJyb3JUeXBlcz10Lm1ha2VFbnVtKFsidW5zdXBwb3J0ZWRfYnJvd3NlciIsIm1pY3JvcGhvbmVfbm90X3NoYXJlZCIsInNpZ25hbGxpbmdfaGFuZHNoYWtlX2ZhaWx1cmUiLCJzaWduYWxsaW5nX2Nvbm5lY3Rpb25fZmFpbHVyZSIsImljZV9jb2xsZWN0aW9uX3RpbWVvdXQiLCJ1c2VyX2J1c3lfZXJyb3IiLCJ3ZWJydGNfZXJyb3IiLCJyZWFsdGltZV9jb21tdW5pY2F0aW9uX2Vycm9yIiwib3RoZXIiXSksdC5DbGlja1R5cGU9dC5tYWtlRW51bShbIkFjY2VwdCIsIlJlamVjdCIsIkhhbmd1cCJdKSx0LlZvaWNlSWRFcnJvclR5cGVzPXQubWFrZUVudW0oWyJub19zcGVha2VyX2lkX2ZvdW5kIiwic3BlYWtlcl9pZF9ub3RfZW5yb2xsZWQiLCJnZXRfc3BlYWtlcl9pZF9mYWlsZWQiLCJnZXRfc3BlYWtlcl9zdGF0dXNfZmFpbGVkIiwib3B0X291dF9zcGVha2VyX2ZhaWxlZCIsIm9wdF9vdXRfc3BlYWtlcl9pbl9sY21zX2ZhaWxlZCIsImRlbGV0ZV9zcGVha2VyX2ZhaWxlZCIsInN0YXJ0X3Nlc3Npb25fZmFpbGVkIiwiZXZhbHVhdGVfc3BlYWtlcl9mYWlsZWQiLCJzZXNzaW9uX25vdF9leGlzdHMiLCJkZXNjcmliZV9zZXNzaW9uX2ZhaWxlZCIsImVucm9sbF9zcGVha2VyX2ZhaWxlZCIsInVwZGF0ZV9zcGVha2VyX2lkX2ZhaWxlZCIsInVwZGF0ZV9zcGVha2VyX2lkX2luX2xjbXNfZmFpbGVkIiwibm90X3N1cHBvcnRlZF9vbl9jb25mZXJlbmNlX2NhbGxzIiwiZW5yb2xsX3NwZWFrZXJfdGltZW91dCIsImV2YWx1YXRlX3NwZWFrZXJfdGltZW91dCIsImdldF9kb21haW5faWRfZmFpbGVkIiwibm9fZG9tYWluX2lkX2ZvdW5kIl0pLHQuQ1RJRXhjZXB0aW9ucz10Lm1ha2VFbnVtKFsiQWNjZXNzRGVuaWVkRXhjZXB0aW9uIiwiSW52YWxpZFN0YXRlRXhjZXB0aW9uIiwiQmFkRW5kcG9pbnRFeGNlcHRpb24iLCJJbnZhbGlkQWdlbnRBUk5FeGNlcHRpb24iLCJJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiIsIkludmFsaWRDb250YWN0VHlwZUV4Y2VwdGlvbiIsIlBhZ2luYXRpb25FeGNlcHRpb24iLCJSZWZyZXNoVG9rZW5FeHBpcmVkRXhjZXB0aW9uIiwiU2VuZERhdGFGYWlsZWRFeGNlcHRpb24iLCJVbmF1dGhvcml6ZWRFeGNlcHRpb24iLCJRdW90YUV4Y2VlZGVkRXhjZXB0aW9uIl0pLHQuVm9pY2VJZFN0cmVhbWluZ1N0YXR1cz10Lm1ha2VFbnVtKFsiT05HT0lORyIsIkVOREVEIiwiUEVORElOR19DT05GSUdVUkFUSU9OIl0pLHQuVm9pY2VJZEF1dGhlbnRpY2F0aW9uRGVjaXNpb249dC5tYWtlRW51bShbIkFDQ0VQVCIsIlJFSkVDVCIsIk5PVF9FTk9VR0hfU1BFRUNIIiwiU1BFQUtFUl9OT1RfRU5ST0xMRUQiLCJTUEVBS0VSX09QVEVEX09VVCIsIlNQRUFLRVJfSURfTk9UX1BST1ZJREVEIiwiU1BFQUtFUl9FWFBJUkVEIl0pLHQuVm9pY2VJZEZyYXVkRGV0ZWN0aW9uRGVjaXNpb249dC5tYWtlRW51bShbIk5PVF9FTk9VR0hfU1BFRUNIIiwiSElHSF9SSVNLIiwiTE9XX1JJU0siXSksdC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb249dC5tYWtlRW51bShbIkF1dGhlbnRpY2F0ZWQiLCJOb3RBdXRoZW50aWNhdGVkIiwiSW5jb25jbHVzaXZlIiwiTm90RW5yb2xsZWQiLCJPcHRlZE91dCIsIk5vdEVuYWJsZWQiLCJFcnJvciJdKSx0LkNvbnRhY3RGbG93RnJhdWREZXRlY3Rpb25EZWNpc2lvbj10Lm1ha2VFbnVtKFsiSGlnaFJpc2siLCJMb3dSaXNrIiwiSW5jb25jbHVzaXZlIiwiTm90RW5hYmxlZCIsIkVycm9yIl0pLHQuVm9pY2VJZEVucm9sbG1lbnRSZXF1ZXN0U3RhdHVzPXQubWFrZUVudW0oWyJOT1RfRU5PVUdIX1NQRUVDSCIsIklOX1BST0dSRVNTIiwiQ09NUExFVEVEIiwiRkFJTEVEIl0pLHQuVm9pY2VJZFNwZWFrZXJTdGF0dXM9dC5tYWtlRW51bShbIk9QVEVEX09VVCIsIkVOUk9MTEVEIiwiUEVORElORyJdKSx0LlZvaWNlSWRDb25zdGFudHM9e0VWQUxVQVRFX1NFU1NJT05fREVMQVk6MWU0LEVWQUxVQVRJT05fTUFYX1BPTExfVElNRVM6MjQsRVZBTFVBVElPTl9QT0xMSU5HX0lOVEVSVkFMOjVlMyxFTlJPTExNRU5UX01BWF9QT0xMX1RJTUVTOjEyMCxFTlJPTExNRU5UX1BPTExJTkdfSU5URVJWQUw6NWUzLFNUQVJUX1NFU1NJT05fREVMQVk6OGUzfSx0LkFnZW50UGVybWlzc2lvbnM9e09VVEJPVU5EX0NBTEw6Im91dGJvdW5kQ2FsbCIsVk9JQ0VfSUQ6InZvaWNlSWQifTt2YXIgbj1mdW5jdGlvbigpe2lmKCF0LmFnZW50LmluaXRpYWxpemVkKXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIlRoZSBhZ2VudCBpcyBub3QgeWV0IGluaXRpYWxpemVkISIpfTtuLnByb3RvdHlwZS5fZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRBZ2VudERhdGEoKX0sbi5wcm90b3R5cGUuX2NyZWF0ZUNvbnRhY3RBUEk9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyB0LkNvbnRhY3QoZS5jb250YWN0SWQpfSxuLnByb3RvdHlwZS5vblJlZnJlc2g9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuUkVGUkVTSCxlKX0sbi5wcm90b3R5cGUub25Sb3V0YWJsZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5ST1VUQUJMRSxlKX0sbi5wcm90b3R5cGUub25Ob3RSb3V0YWJsZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5OT1RfUk9VVEFCTEUsZSl9LG4ucHJvdG90eXBlLm9uT2ZmbGluZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5PRkZMSU5FLGUpfSxuLnByb3RvdHlwZS5vbkVycm9yPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLkVSUk9SLGUpfSxuLnByb3RvdHlwZS5vblNvZnRwaG9uZUVycm9yPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLlNPRlRQSE9ORV9FUlJPUixlKX0sbi5wcm90b3R5cGUub25XZWJTb2NrZXRDb25uZWN0aW9uTG9zdD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5XRUJTT0NLRVRfQ09OTkVDVElPTl9MT1NULGUpfSxuLnByb3RvdHlwZS5vbldlYlNvY2tldENvbm5lY3Rpb25HYWluZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuV0VCU09DS0VUX0NPTk5FQ1RJT05fR0FJTkVELGUpfSxuLnByb3RvdHlwZS5vbkFmdGVyQ2FsbFdvcms9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuQUNXLGUpfSxuLnByb3RvdHlwZS5vblN0YXRlQ2hhbmdlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLlNUQVRFX0NIQU5HRSxlKX0sbi5wcm90b3R5cGUub25NdXRlVG9nZ2xlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5BZ2VudEV2ZW50cy5NVVRFX1RPR0dMRSxlKX0sbi5wcm90b3R5cGUub25Mb2NhbE1lZGlhU3RyZWFtQ3JlYXRlZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuQWdlbnRFdmVudHMuTE9DQUxfTUVESUFfU1RSRUFNX0NSRUFURUQsZSl9LG4ucHJvdG90eXBlLm9uU3BlYWtlckRldmljZUNoYW5nZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkNvbmZpZ3VyYXRpb25FdmVudHMuU1BFQUtFUl9ERVZJQ0VfQ0hBTkdFRCxlKX0sbi5wcm90b3R5cGUub25NaWNyb3Bob25lRGV2aWNlQ2hhbmdlZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuQ29uZmlndXJhdGlvbkV2ZW50cy5NSUNST1BIT05FX0RFVklDRV9DSEFOR0VELGUpfSxuLnByb3RvdHlwZS5vblJpbmdlckRldmljZUNoYW5nZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkNvbmZpZ3VyYXRpb25FdmVudHMuUklOR0VSX0RFVklDRV9DSEFOR0VELGUpfSxuLnByb3RvdHlwZS5tdXRlPWZ1bmN0aW9uKCl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5FdmVudFR5cGUuTVVURSxkYXRhOnttdXRlOiEwfX0pfSxuLnByb3RvdHlwZS51bm11dGU9ZnVuY3Rpb24oKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkV2ZW50VHlwZS5NVVRFLGRhdGE6e211dGU6ITF9fSl9LG4ucHJvdG90eXBlLnNldFNwZWFrZXJEZXZpY2U9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db25maWd1cmF0aW9uRXZlbnRzLlNFVF9TUEVBS0VSX0RFVklDRSxkYXRhOntkZXZpY2VJZDplfX0pfSxuLnByb3RvdHlwZS5zZXRNaWNyb3Bob25lRGV2aWNlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29uZmlndXJhdGlvbkV2ZW50cy5TRVRfTUlDUk9QSE9ORV9ERVZJQ0UsZGF0YTp7ZGV2aWNlSWQ6ZX19KX0sbi5wcm90b3R5cGUuc2V0UmluZ2VyRGV2aWNlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29uZmlndXJhdGlvbkV2ZW50cy5TRVRfUklOR0VSX0RFVklDRSxkYXRhOntkZXZpY2VJZDplfX0pfSxuLnByb3RvdHlwZS5nZXRTdGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuc25hcHNob3Quc3RhdGV9LG4ucHJvdG90eXBlLmdldE5leHRTdGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuc25hcHNob3QubmV4dFN0YXRlfSxuLnByb3RvdHlwZS5nZXRBdmFpbGFiaWxpdHlTdGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuc25hcHNob3QuYWdlbnRBdmFpbGFiaWxpdHlTdGF0ZX0sbi5wcm90b3R5cGUuZ2V0U3RhdHVzPW4ucHJvdG90eXBlLmdldFN0YXRlLG4ucHJvdG90eXBlLmdldFN0YXRlRHVyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdC5ub3coKS10aGlzLl9nZXREYXRhKCkuc25hcHNob3Quc3RhdGUuc3RhcnRUaW1lc3RhbXAuZ2V0VGltZSgpK3QuY29yZS5nZXRTa2V3KCl9LG4ucHJvdG90eXBlLmdldFN0YXR1c0R1cmF0aW9uPW4ucHJvdG90eXBlLmdldFN0YXRlRHVyYXRpb24sbi5wcm90b3R5cGUuZ2V0UGVybWlzc2lvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkucGVybWlzc2lvbnN9LG4ucHJvdG90eXBlLmdldENvbnRhY3RzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zbmFwc2hvdC5jb250YWN0cy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiB0Ll9jcmVhdGVDb250YWN0QVBJKGUpfSkpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIWV8fHQuZ2V0VHlwZSgpPT09ZX0pKX0sbi5wcm90b3R5cGUuZ2V0Q29uZmlndXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuY29uZmlndXJhdGlvbn0sbi5wcm90b3R5cGUuZ2V0QWdlbnRTdGF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuYWdlbnRTdGF0ZXN9LG4ucHJvdG90eXBlLmdldFJvdXRpbmdQcm9maWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLnJvdXRpbmdQcm9maWxlfSxuLnByb3RvdHlwZS5nZXRDaGFubmVsQ29uY3VycmVuY3k9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcy5nZXRSb3V0aW5nUHJvZmlsZSgpLmNoYW5uZWxDb25jdXJyZW5jeU1hcDtyZXR1cm4gbnx8KG49T2JqZWN0LmtleXModC5DaGFubmVsVHlwZSkucmVkdWNlKChmdW5jdGlvbihlLG4pe3JldHVybiJUQVNLIiE9PW4mJihlW3QuQ2hhbm5lbFR5cGVbbl1dPTEpLGV9KSx7fSkpLGU/bltlXXx8MDpufSxuLnByb3RvdHlwZS5nZXROYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLm5hbWV9LG4ucHJvdG90eXBlLmdldEV4dGVuc2lvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5leHRlbnNpb259LG4ucHJvdG90eXBlLmdldERpYWxhYmxlQ291bnRyaWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmRpYWxhYmxlQ291bnRyaWVzfSxuLnByb3RvdHlwZS5pc1NvZnRwaG9uZUVuYWJsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuc29mdHBob25lRW5hYmxlZH0sbi5wcm90b3R5cGUuc2V0Q29uZmlndXJhdGlvbj1mdW5jdGlvbihlLG4pe3ZhciByPXQuY29yZS5nZXRDbGllbnQoKTtlJiZlLmFnZW50UHJlZmVyZW5jZXMmJmUuYWdlbnRQcmVmZXJlbmNlcy5MQU5HVUFHRSYmIWUuYWdlbnRQcmVmZXJlbmNlcy5sb2NhbGUmJihlLmFnZW50UHJlZmVyZW5jZXMubG9jYWxlPWUuYWdlbnRQcmVmZXJlbmNlcy5MQU5HVUFHRSksZSYmZS5hZ2VudFByZWZlcmVuY2VzJiYhdC5pc1ZhbGlkTG9jYWxlKGUuYWdlbnRQcmVmZXJlbmNlcy5sb2NhbGUpP24mJm4uZmFpbHVyZSYmbi5mYWlsdXJlKHQuQWdlbnRFcnJvclN0YXRlcy5JTlZBTElEX0xPQ0FMRSk6ci5jYWxsKHQuQ2xpZW50TWV0aG9kcy5VUERBVEVfQUdFTlRfQ09ORklHVVJBVElPTix7Y29uZmlndXJhdGlvbjp0LmFzc2VydE5vdE51bGwoZSwiY29uZmlndXJhdGlvbiIpfSx7c3VjY2VzczpmdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuUkVMT0FEX0FHRU5UX0NPTkZJR1VSQVRJT04pLG4uc3VjY2VzcyYmbi5zdWNjZXNzKGUpfSxmYWlsdXJlOm4mJm4uZmFpbHVyZX0pfSxuLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihlLG4scil7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLlBVVF9BR0VOVF9TVEFURSx7c3RhdGU6dC5hc3NlcnROb3ROdWxsKGUsInN0YXRlIiksZW5xdWV1ZU5leHRTdGF0ZTpyJiYhIXIuZW5xdWV1ZU5leHRTdGF0ZX0sbil9LG4ucHJvdG90eXBlLm9uRW5xdWV1ZWROZXh0U3RhdGU9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuRU5RVUVVRURfTkVYVF9TVEFURSxlKX0sbi5wcm90b3R5cGUuc2V0U3RhdHVzPW4ucHJvdG90eXBlLnNldFN0YXRlLG4ucHJvdG90eXBlLmNvbm5lY3Q9ZnVuY3Rpb24oZSxuKXt2YXIgcj10LmNvcmUuZ2V0Q2xpZW50KCksbz1uZXcgdC5FbmRwb2ludChlKTtkZWxldGUgby5lbmRwb2ludElkLHIuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ1JFQVRFX09VVEJPVU5EX0NPTlRBQ1Qse2VuZHBvaW50OnQuYXNzZXJ0Tm90TnVsbChvLCJlbmRwb2ludCIpLHF1ZXVlQVJOOm4mJihuLnF1ZXVlQVJOfHxuLnF1ZXVlSWQpfHx0aGlzLmdldFJvdXRpbmdQcm9maWxlKCkuZGVmYXVsdE91dGJvdW5kUXVldWUucXVldWVBUk59LG4mJntzdWNjZXNzOm4uc3VjY2VzcyxmYWlsdXJlOm4uZmFpbHVyZX0pfSxuLnByb3RvdHlwZS5nZXRBbGxRdWV1ZUFSTnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkucm91dGluZ1Byb2ZpbGUucXVldWVzLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUucXVldWVBUk59KSl9LG4ucHJvdG90eXBlLmdldEVuZHBvaW50cz1mdW5jdGlvbihlLG4scil7dmFyIG89dGhpcyxpPXQuY29yZS5nZXRDbGllbnQoKTt0LmFzc2VydE5vdE51bGwobiwiY2FsbGJhY2tzIiksdC5hc3NlcnROb3ROdWxsKG4uc3VjY2VzcywiY2FsbGJhY2tzLnN1Y2Nlc3MiKTt2YXIgcz1yfHx7fTtzLmVuZHBvaW50cz1zLmVuZHBvaW50c3x8W10scy5tYXhSZXN1bHRzPXMubWF4UmVzdWx0c3x8dC5ERUZBVUxUX0JBVENIX1NJWkUsdC5pc0FycmF5KGUpfHwoZT1bZV0pLGkuY2FsbCh0LkNsaWVudE1ldGhvZHMuR0VUX0VORFBPSU5UUyx7cXVldWVBUk5zOmUsbmV4dFRva2VuOnMubmV4dFRva2VufHxudWxsLG1heFJlc3VsdHM6cy5tYXhSZXN1bHRzfSx7c3VjY2VzczpmdW5jdGlvbihyKXtpZihyLm5leHRUb2tlbilvLmdldEVuZHBvaW50cyhlLG4se25leHRUb2tlbjpyLm5leHRUb2tlbixtYXhSZXN1bHRzOnMubWF4UmVzdWx0cyxlbmRwb2ludHM6cy5lbmRwb2ludHMuY29uY2F0KHIuZW5kcG9pbnRzKX0pO2Vsc2V7cy5lbmRwb2ludHM9cy5lbmRwb2ludHMuY29uY2F0KHIuZW5kcG9pbnRzKTt2YXIgaT1zLmVuZHBvaW50cy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdC5FbmRwb2ludChlKX0pKTtuLnN1Y2Nlc3Moe2VuZHBvaW50czppLGFkZHJlc3NlczppfSl9fSxmYWlsdXJlOm4uZmFpbHVyZX0pfSxuLnByb3RvdHlwZS5nZXRBZGRyZXNzZXM9bi5wcm90b3R5cGUuZ2V0RW5kcG9pbnRzLG4ucHJvdG90eXBlLl9nZXRSZXNvdXJjZUlkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRBbGxRdWV1ZUFSTnMoKTtmb3IobGV0IHQgb2YgZSl7Y29uc3QgZT10Lm1hdGNoKC9cL2FnZW50XC8oW14vXSspLyk7aWYoZSlyZXR1cm4gZVsxXX1yZXR1cm4gbmV3IEVycm9yKCJBZ2VudC5wcm90b3R5cGUuX2dldFJlc291cmNlSWQ6IHF1ZXVlQXJucyBkaWQgbm90IGNvbnRhaW4gYWdlbnRSZXNvdXJjZUlkOiAiLGUpfSxuLnByb3RvdHlwZS50b1NuYXBzaG90PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0LkFnZW50U25hcHNob3QodGhpcy5fZ2V0RGF0YSgpKX07dmFyIHI9ZnVuY3Rpb24oZSl7dC5BZ2VudC5jYWxsKHRoaXMpLHRoaXMuYWdlbnREYXRhPWV9OyhyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9cixyLnByb3RvdHlwZS5fZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFnZW50RGF0YX0sci5wcm90b3R5cGUuX2NyZWF0ZUNvbnRhY3RBUEk9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyB0LkNvbnRhY3RTbmFwc2hvdChlKX07dmFyIG89ZnVuY3Rpb24oZSl7dGhpcy5jb250YWN0SWQ9ZX07by5wcm90b3R5cGUuX2dldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29udGFjdERhdGEodGhpcy5nZXRDb250YWN0SWQoKSl9LG8ucHJvdG90eXBlLl9jcmVhdGVDb25uZWN0aW9uQVBJPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmdldFR5cGUoKT09PXQuQ29udGFjdFR5cGUuQ0hBVD9uZXcgdC5DaGF0Q29ubmVjdGlvbih0aGlzLmNvbnRhY3RJZCxlLmNvbm5lY3Rpb25JZCk6dGhpcy5nZXRUeXBlKCk9PT10LkNvbnRhY3RUeXBlLlRBU0s/bmV3IHQuVGFza0Nvbm5lY3Rpb24odGhpcy5jb250YWN0SWQsZS5jb25uZWN0aW9uSWQpOm5ldyB0LlZvaWNlQ29ubmVjdGlvbih0aGlzLmNvbnRhY3RJZCxlLmNvbm5lY3Rpb25JZCl9LG8ucHJvdG90eXBlLmdldEV2ZW50TmFtZT1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldENvbnRhY3RFdmVudE5hbWUoZSx0aGlzLmdldENvbnRhY3RJZCgpKX0sby5wcm90b3R5cGUub25SZWZyZXNoPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuUkVGUkVTSCksZSl9LG8ucHJvdG90eXBlLm9uSW5jb21pbmc9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5JTkNPTUlORyksZSl9LG8ucHJvdG90eXBlLm9uQ29ubmVjdGluZz1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodGhpcy5nZXRFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLkNPTk5FQ1RJTkcpLGUpfSxvLnByb3RvdHlwZS5vblBlbmRpbmc9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5QRU5ESU5HKSxlKX0sby5wcm90b3R5cGUub25BY2NlcHRlZD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodGhpcy5nZXRFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLkFDQ0VQVEVEKSxlKX0sby5wcm90b3R5cGUub25NaXNzZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5NSVNTRUQpLGUpfSxvLnByb3RvdHlwZS5vbkVuZGVkPWZ1bmN0aW9uKGUpe3ZhciBuPXQuY29yZS5nZXRFdmVudEJ1cygpO24uc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5FTkRFRCksZSksbi5zdWJzY3JpYmUodGhpcy5nZXRFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLkRFU1RST1lFRCksZSl9LG8ucHJvdG90eXBlLm9uRGVzdHJveT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodGhpcy5nZXRFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLkRFU1RST1lFRCksZSl9LG8ucHJvdG90eXBlLm9uQUNXPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuQUNXKSxlKX0sby5wcm90b3R5cGUub25Db25uZWN0ZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5DT05ORUNURUQpLGUpfSxvLnByb3RvdHlwZS5vbkVycm9yPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuRVJST1IpLGUpfSxvLnByb3RvdHlwZS5nZXRDb250YWN0SWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250YWN0SWR9LG8ucHJvdG90eXBlLmdldE9yaWdpbmFsQ29udGFjdElkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5pbml0aWFsQ29udGFjdElkfSxvLnByb3RvdHlwZS5nZXRJbml0aWFsQ29udGFjdElkPW8ucHJvdG90eXBlLmdldE9yaWdpbmFsQ29udGFjdElkLG8ucHJvdG90eXBlLmdldFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnR5cGV9LG8ucHJvdG90eXBlLmdldENvbnRhY3REdXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuY29udGFjdER1cmF0aW9ufSxvLnByb3RvdHlwZS5nZXRTdGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuc3RhdGV9LG8ucHJvdG90eXBlLmdldFN0YXR1cz1vLnByb3RvdHlwZS5nZXRTdGF0ZSxvLnByb3RvdHlwZS5nZXRTdGF0ZUR1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHQubm93KCktdGhpcy5fZ2V0RGF0YSgpLnN0YXRlLnRpbWVzdGFtcC5nZXRUaW1lKCkrdC5jb3JlLmdldFNrZXcoKX0sby5wcm90b3R5cGUuZ2V0U3RhdHVzRHVyYXRpb249by5wcm90b3R5cGUuZ2V0U3RhdGVEdXJhdGlvbixvLnByb3RvdHlwZS5nZXRRdWV1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkucXVldWV9LG8ucHJvdG90eXBlLmdldFF1ZXVlVGltZXN0YW1wPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5xdWV1ZVRpbWVzdGFtcH0sby5wcm90b3R5cGUuZ2V0Q29ubmVjdGlvbnM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiB0aGlzLl9nZXREYXRhKCkuY29ubmVjdGlvbnMubWFwKChmdW5jdGlvbihuKXtyZXR1cm4gZS5nZXRUeXBlKCk9PT10LkNvbnRhY3RUeXBlLkNIQVQ/bmV3IHQuQ2hhdENvbm5lY3Rpb24oZS5jb250YWN0SWQsbi5jb25uZWN0aW9uSWQpOmUuZ2V0VHlwZSgpPT09dC5Db250YWN0VHlwZS5UQVNLP25ldyB0LlRhc2tDb25uZWN0aW9uKGUuY29udGFjdElkLG4uY29ubmVjdGlvbklkKTpuZXcgdC5Wb2ljZUNvbm5lY3Rpb24oZS5jb250YWN0SWQsbi5jb25uZWN0aW9uSWQpfSkpfSxvLnByb3RvdHlwZS5nZXRJbml0aWFsQ29ubmVjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0LmZpbmQodGhpcy5nZXRDb25uZWN0aW9ucygpLChmdW5jdGlvbihlKXtyZXR1cm4gZS5pc0luaXRpYWxDb25uZWN0aW9uKCl9KSl8fG51bGx9LG8ucHJvdG90eXBlLmdldEFjdGl2ZUluaXRpYWxDb25uZWN0aW9uPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRJbml0aWFsQ29ubmVjdGlvbigpO3JldHVybiBudWxsIT1lJiZlLmlzQWN0aXZlKCk/ZTpudWxsfSxvLnByb3RvdHlwZS5nZXRUaGlyZFBhcnR5Q29ubmVjdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRDb25uZWN0aW9ucygpLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIWUuaXNJbml0aWFsQ29ubmVjdGlvbigpJiZlLmdldFR5cGUoKSE9PXQuQ29ubmVjdGlvblR5cGUuQUdFTlR9KSl9LG8ucHJvdG90eXBlLmdldFNpbmdsZUFjdGl2ZVRoaXJkUGFydHlDb25uZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0VGhpcmRQYXJ0eUNvbm5lY3Rpb25zKCkuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZS5pc0FjdGl2ZSgpfSkpWzBdfHxudWxsfSxvLnByb3RvdHlwZS5nZXRBZ2VudENvbm5lY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdC5maW5kKHRoaXMuZ2V0Q29ubmVjdGlvbnMoKSwoZnVuY3Rpb24oZSl7dmFyIG49ZS5nZXRUeXBlKCk7cmV0dXJuIG49PT10LkNvbm5lY3Rpb25UeXBlLkFHRU5UfHxuPT09dC5Db25uZWN0aW9uVHlwZS5NT05JVE9SSU5HfSkpfSxvLnByb3RvdHlwZS5nZXROYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5uYW1lfSxvLnByb3RvdHlwZS5nZXRDb250YWN0TWV0YWRhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmNvbnRhY3RNZXRhZGF0YX0sby5wcm90b3R5cGUuZ2V0RGVzY3JpcHRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmRlc2NyaXB0aW9ufSxvLnByb3RvdHlwZS5nZXRSZWZlcmVuY2VzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5yZWZlcmVuY2VzfSxvLnByb3RvdHlwZS5nZXRBdHRyaWJ1dGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5hdHRyaWJ1dGVzfSxvLnByb3RvdHlwZS5nZXRDb250YWN0RmVhdHVyZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmNvbnRhY3RGZWF0dXJlc30sby5wcm90b3R5cGUuZ2V0Q2hhbm5lbENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmNoYW5uZWxDb250ZXh0fSxvLnByb3RvdHlwZS5pc1NvZnRwaG9uZUNhbGw9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9dC5maW5kKHRoaXMuZ2V0Q29ubmVjdGlvbnMoKSwoZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUuZ2V0U29mdHBob25lTWVkaWFJbmZvKCl9KSl9LG8ucHJvdG90eXBlLl9pc0luYm91bmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmluaXRpYXRpb25NZXRob2QhPT10LkNvbnRhY3RJbml0aWF0aW9uTWV0aG9kLk9VVEJPVU5EfSxvLnByb3RvdHlwZS5pc0luYm91bmQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldEluaXRpYWxDb25uZWN0aW9uKCk7cmV0dXJuIGUuZ2V0TWVkaWFUeXBlKCk9PT10Lk1lZGlhVHlwZS5UQVNLP3RoaXMuX2lzSW5ib3VuZCgpOiEhZSYmZS5nZXRUeXBlKCk9PT10LkNvbm5lY3Rpb25UeXBlLklOQk9VTkR9LG8ucHJvdG90eXBlLmlzQ29ubmVjdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0U3RhdHVzKCkudHlwZT09PXQuQ29udGFjdFN0YXRlVHlwZS5DT05ORUNURUR9LG8ucHJvdG90eXBlLmFjY2VwdD1mdW5jdGlvbihlKXt2YXIgbj10LmNvcmUuZ2V0Q2xpZW50KCkscj10aGlzLG89dGhpcy5nZXRDb250YWN0SWQoKTt0LnB1Ymxpc2hDbGlja1N0cmVhbURhdGEoe2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNsaWNrVHlwZTp0LkNsaWNrVHlwZS5BQ0NFUFQsY2xpY2tUaW1lOihuZXcgRGF0ZSkudG9JU09TdHJpbmcoKX0pLG4uY2FsbCh0LkNsaWVudE1ldGhvZHMuQUNDRVBUX0NPTlRBQ1Qse2NvbnRhY3RJZDpvfSx7c3VjY2VzczpmdW5jdGlvbihuKXt2YXIgaT10LmNvcmUuZ2V0VXBzdHJlYW0oKTtpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29udGFjdEV2ZW50cy5BQ0NFUFRFRCxkYXRhOm5ldyB0LkNvbnRhY3Qobyl9KSxpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuY29yZS5nZXRDb250YWN0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5BQ0NFUFRFRCxyLmdldENvbnRhY3RJZCgpKSxkYXRhOm5ldyB0LkNvbnRhY3Qobyl9KTt2YXIgcz1uZXcgdC5Db250YWN0KG8pO3QuaXNGaXJlZm94QnJvd3NlcigpJiZzLmlzU29mdHBob25lQ2FsbCgpJiZ0LmNvcmUudHJpZ2dlclJlYWR5VG9TdGFydFNlc3Npb25FdmVudCgpLGUmJmUuc3VjY2VzcyYmZS5zdWNjZXNzKG4pfSxmYWlsdXJlOmZ1bmN0aW9uKG4scil7dC5nZXRMb2coKS5lcnJvcigiQWNjZXB0IENvbnRhY3QgZmFpbGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKS53aXRoRXhjZXB0aW9uKG4pLndpdGhPYmplY3Qoe2RhdGE6cn0pLHQucHVibGlzaE1ldHJpYyh7bmFtZToiQ29udGFjdEFjY2VwdEZhaWx1cmUiLGRhdGE6e2NvdW50OjF9fSksZSYmZS5mYWlsdXJlJiZlLmZhaWx1cmUodC5Db250YWN0U3RhdGVUeXBlLkVSUk9SKX19KX0sby5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3QuZ2V0TG9nKCkud2FybigiY29udGFjdC5kZXN0cm95KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4iKX0sby5wcm90b3R5cGUucmVqZWN0PWZ1bmN0aW9uKGUpe3ZhciBuPXQuY29yZS5nZXRDbGllbnQoKTt0LnB1Ymxpc2hDbGlja1N0cmVhbURhdGEoe2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNsaWNrVHlwZTp0LkNsaWNrVHlwZS5SRUpFQ1QsY2xpY2tUaW1lOihuZXcgRGF0ZSkudG9JU09TdHJpbmcoKX0pLG4uY2FsbCh0LkNsaWVudE1ldGhvZHMuUkVKRUNUX0NPTlRBQ1Qse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpfSxlKX0sby5wcm90b3R5cGUuY29tcGxldGU9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLkNPTVBMRVRFX0NPTlRBQ1Qse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpfSxlKX0sby5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLkNMRUFSX0NPTlRBQ1Qse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpfSxlKX0sby5wcm90b3R5cGUubm90aWZ5SXNzdWU9ZnVuY3Rpb24oZSxuLHIpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5OT1RJRllfQ09OVEFDVF9JU1NVRSx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksaXNzdWVDb2RlOmUsZGVzY3JpcHRpb246bn0scil9LG8ucHJvdG90eXBlLmFkZENvbm5lY3Rpb249ZnVuY3Rpb24oZSxuKXt2YXIgcj10LmNvcmUuZ2V0Q2xpZW50KCksbz1uZXcgdC5FbmRwb2ludChlKTtkZWxldGUgby5lbmRwb2ludElkLHIuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ1JFQVRFX0FERElUSU9OQUxfQ09OTkVDVElPTix7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksZW5kcG9pbnQ6b30sbil9LG8ucHJvdG90eXBlLnRvZ2dsZUFjdGl2ZUNvbm5lY3Rpb25zPWZ1bmN0aW9uKGUpe3ZhciBuPXQuY29yZS5nZXRDbGllbnQoKSxyPW51bGwsbz10LmZpbmQodGhpcy5nZXRDb25uZWN0aW9ucygpLChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRTdGF0dXMoKS50eXBlPT09dC5Db25uZWN0aW9uU3RhdGVUeXBlLkhPTER9KSk7aWYobnVsbCE9bylyPW8uZ2V0Q29ubmVjdGlvbklkKCk7ZWxzZXt2YXIgaT10aGlzLmdldENvbm5lY3Rpb25zKCkuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZS5pc0FjdGl2ZSgpfSkpO2kubGVuZ3RoPjAmJihyPWlbMF0uZ2V0Q29ubmVjdGlvbklkKCkpfW4uY2FsbCh0LkNsaWVudE1ldGhvZHMuVE9HR0xFX0FDVElWRV9DT05ORUNUSU9OUyx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY29ubmVjdGlvbklkOnJ9LGUpfSxvLnByb3RvdHlwZS5zZW5kU29mdHBob25lTWV0cmljcz1mdW5jdGlvbihuLHIpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5TRU5EX1NPRlRQSE9ORV9DQUxMX01FVFJJQ1Mse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNjcFZlcnNpb246ZS5jY3BWZXJzaW9uLHNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3M6bn0sciksdC5wdWJsaXNoU29mdHBob25lU3RhdHMoe2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNjcFZlcnNpb246ZS5jY3BWZXJzaW9uLHN0YXRzOm59KX0sby5wcm90b3R5cGUuc2VuZFNvZnRwaG9uZVJlcG9ydD1mdW5jdGlvbihuLHIpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5TRU5EX1NPRlRQSE9ORV9DQUxMX1JFUE9SVCx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY2NwVmVyc2lvbjplLmNjcFZlcnNpb24scmVwb3J0Om59LHIpfSxvLnByb3RvdHlwZS5jb25mZXJlbmNlQ29ubmVjdGlvbnM9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLkNPTkZFUkVOQ0VfQ09OTkVDVElPTlMse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpfSxlKX0sby5wcm90b3R5cGUudG9TbmFwc2hvdD1mdW5jdGlvbigpe3JldHVybiBuZXcgdC5Db250YWN0U25hcHNob3QodGhpcy5fZ2V0RGF0YSgpKX0sby5wcm90b3R5cGUuaXNNdWx0aVBhcnR5Q29uZmVyZW5jZUVuYWJsZWQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldENvbnRhY3RGZWF0dXJlcygpO3JldHVybiEoIWV8fCFlLm11bHRpUGFydHlDb25mZXJlbmNlRW5hYmxlZCl9LG8ucHJvdG90eXBlLnVwZGF0ZU1vbml0b3JQYXJ0aWNpcGFudFN0YXRlPWZ1bmN0aW9uKGUsbil7ZSYmT2JqZWN0LnZhbHVlcyh0Lk1vbml0b3JpbmdNb2RlKS5pbmNsdWRlcyhlLnRvVXBwZXJDYXNlKCkpP3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5VUERBVEVfTU9OSVRPUl9QQVJUSUNJUEFOVF9TVEFURSx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksdGFyZ2V0TW9uaXRvck1vZGU6ZS50b1VwcGVyQ2FzZSgpfSxuKToodC5nZXRMb2coKS5lcnJvcihgSW52YWxpZCB0YXJnZXQgc3RhdGUgd2FzIHByb3ZpZGVkOiAke2V9YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuJiZuLmZhaWx1cmUmJm4uZmFpbHVyZSh0Lk1vbml0b3JpbmdFcnJvclR5cGVzLklOVkFMSURfVEFSR0VUX1NUQVRFKSl9LG8ucHJvdG90eXBlLmlzVW5kZXJTdXBlcnZpc2lvbj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0Q29ubmVjdGlvbnMoKS5maWx0ZXIoKGU9PmUuZ2V0VHlwZSgpIT09dC5Db25uZWN0aW9uVHlwZS5BR0VOVCkpO3JldHVybiB2b2lkIDAhPT0oZSYmZS5maW5kKChlPT5lLmlzQmFyZ2UoKSYmZS5pc0FjdGl2ZSgpKSkpfTt2YXIgaT1mdW5jdGlvbihlKXt0LkNvbnRhY3QuY2FsbCh0aGlzLGUuY29udGFjdElkKSx0aGlzLmNvbnRhY3REYXRhPWV9OyhpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG8ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9aSxpLnByb3RvdHlwZS5fZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRhY3REYXRhfSxpLnByb3RvdHlwZS5fY3JlYXRlQ29ubmVjdGlvbkFQST1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQuQ29ubmVjdGlvblNuYXBzaG90KGUpfTt2YXIgcz1mdW5jdGlvbihlLHQpe3RoaXMuY29udGFjdElkPWUsdGhpcy5jb25uZWN0aW9uSWQ9dCx0aGlzLl9pbml0TWVkaWFDb250cm9sbGVyKCl9O3MucHJvdG90eXBlLl9nZXREYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbm5lY3Rpb25EYXRhKHRoaXMuZ2V0Q29udGFjdElkKCksdGhpcy5nZXRDb25uZWN0aW9uSWQoKSl9LHMucHJvdG90eXBlLmdldENvbnRhY3RJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRhY3RJZH0scy5wcm90b3R5cGUuZ2V0Q29ubmVjdGlvbklkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29ubmVjdGlvbklkfSxzLnByb3RvdHlwZS5nZXRFbmRwb2ludD1mdW5jdGlvbigpe3JldHVybiBuZXcgdC5FbmRwb2ludCh0aGlzLl9nZXREYXRhKCkuZW5kcG9pbnQpfSxzLnByb3RvdHlwZS5nZXRBZGRyZXNzPXMucHJvdG90eXBlLmdldEVuZHBvaW50LHMucHJvdG90eXBlLmdldFN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zdGF0ZX0scy5wcm90b3R5cGUuZ2V0U3RhdHVzPXMucHJvdG90eXBlLmdldFN0YXRlLHMucHJvdG90eXBlLmdldFN0YXRlRHVyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdC5ub3coKS10aGlzLl9nZXREYXRhKCkuc3RhdGUudGltZXN0YW1wLmdldFRpbWUoKSt0LmNvcmUuZ2V0U2tldygpfSxzLnByb3RvdHlwZS5nZXRTdGF0dXNEdXJhdGlvbj1zLnByb3RvdHlwZS5nZXRTdGF0ZUR1cmF0aW9uLHMucHJvdG90eXBlLmdldFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnR5cGV9LHMucHJvdG90eXBlLmlzSW5pdGlhbENvbm5lY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmluaXRpYWx9LHMucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29udGFpbnModC5DT05ORUNUSU9OX0FDVElWRV9TVEFURVMsdGhpcy5nZXRTdGF0dXMoKS50eXBlKX0scy5wcm90b3R5cGUuaXNDb25uZWN0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb250YWlucyh0LkNPTk5FQ1RJT05fQ09OTkVDVEVEX1NUQVRFUyx0aGlzLmdldFN0YXR1cygpLnR5cGUpfSxzLnByb3RvdHlwZS5pc0Nvbm5lY3Rpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRTdGF0dXMoKS50eXBlPT09dC5Db25uZWN0aW9uU3RhdGVUeXBlLkNPTk5FQ1RJTkd9LHMucHJvdG90eXBlLmlzT25Ib2xkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0U3RhdHVzKCkudHlwZT09PXQuQ29ubmVjdGlvblN0YXRlVHlwZS5IT0xEfSxzLnByb3RvdHlwZS5nZXRTb2Z0cGhvbmVNZWRpYUluZm89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnNvZnRwaG9uZU1lZGlhSW5mb30scy5wcm90b3R5cGUuZ2V0TW9uaXRvckluZm89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLm1vbml0b3JpbmdJbmZvfSxzLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKGUpe3QucHVibGlzaENsaWNrU3RyZWFtRGF0YSh7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY2xpY2tUeXBlOnQuQ2xpY2tUeXBlLkhBTkdVUCxjbGlja1RpbWU6KG5ldyBEYXRlKS50b0lTT1N0cmluZygpfSksdC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLkRFU1RST1lfQ09OTkVDVElPTix7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY29ubmVjdGlvbklkOnRoaXMuZ2V0Q29ubmVjdGlvbklkKCl9LGUpfSxzLnByb3RvdHlwZS5zZW5kRGlnaXRzPWZ1bmN0aW9uKGUsbil7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLlNFTkRfRElHSVRTLHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjb25uZWN0aW9uSWQ6dGhpcy5nZXRDb25uZWN0aW9uSWQoKSxkaWdpdHM6ZX0sbil9LHMucHJvdG90eXBlLmhvbGQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLkhPTERfQ09OTkVDVElPTix7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY29ubmVjdGlvbklkOnRoaXMuZ2V0Q29ubmVjdGlvbklkKCl9LGUpfSxzLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLlJFU1VNRV9DT05ORUNUSU9OLHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjb25uZWN0aW9uSWQ6dGhpcy5nZXRDb25uZWN0aW9uSWQoKX0sZSl9LHMucHJvdG90eXBlLnRvU25hcHNob3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQuQ29ubmVjdGlvblNuYXBzaG90KHRoaXMuX2dldERhdGEoKSl9LHMucHJvdG90eXBlLl9pbml0TWVkaWFDb250cm9sbGVyPWZ1bmN0aW9uKCl7dGhpcy5nZXRNZWRpYUluZm8oKSYmdC5jb3JlLm1lZGlhRmFjdG9yeS5nZXQodGhpcykuY2F0Y2goKGZ1bmN0aW9uKCl7fSkpfSxzLnByb3RvdHlwZS5faXNBZ2VudENvbm5lY3Rpb25UeXBlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRUeXBlKCk7cmV0dXJuIGU9PT10LkNvbm5lY3Rpb25UeXBlLkFHRU5UfHxlPT09dC5Db25uZWN0aW9uVHlwZS5NT05JVE9SSU5HfSxzLnByb3RvdHlwZS5faXNBZ2VudENvbm5lY3Rpb25UeXBlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRUeXBlKCk7cmV0dXJuIGU9PT10LkNvbm5lY3Rpb25UeXBlLkFHRU5UfHxlPT09dC5Db25uZWN0aW9uVHlwZS5NT05JVE9SSU5HfTt2YXIgYT1mdW5jdGlvbihlKXt0aGlzLmNvbnRhY3RJZD1lfTthLnByb3RvdHlwZS5nZXRTcGVha2VySWQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UuY2hlY2tDb25mZXJlbmNlQ2FsbCgpO3ZhciBuPXQuY29yZS5nZXRDbGllbnQoKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsbyl7Y29uc3QgaT17Y29udGFjdElkOmUuY29udGFjdElkLGluc3RhbmNlSWQ6dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0SW5zdGFuY2VJZCgpLGF3c0FjY291bnRJZDp0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRBV1NBY2NvdW50SWQoKX07dC5nZXRMb2coKS5pbmZvKCJnZXRTcGVha2VySWQgY2FsbGVkIikud2l0aE9iamVjdChpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4uY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5HRVRfQ09OVEFDVCxpLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe2lmKGUuY29udGFjdERhdGEuY3VzdG9tZXJJZCl7dmFyIG49e3NwZWFrZXJJZDplLmNvbnRhY3REYXRhLmN1c3RvbWVySWR9O3QuZ2V0TG9nKCkuaW5mbygiZ2V0U3BlYWtlcklkIHN1Y2NlZWRlZCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyKG4pfWVsc2V7dmFyIGk9dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5OT19TUEVBS0VSX0lEX0ZPVU5ELCJObyBzcGVha2VySWQgYXNzb3RpYXRlZCB3aXRoIHRoaXMgY2FsbCIpO28oaSl9fSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIkdldCBTcGVha2VySWQgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuR0VUX1NQRUFLRVJfSURfRkFJTEVELCJHZXQgU3BlYWtlcklkIGZhaWxlZCIsZSk7byhuKX19KX0pKX0sYS5wcm90b3R5cGUuZ2V0U3BlYWtlclN0YXR1cz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5jaGVja0NvbmZlcmVuY2VDYWxsKCk7dmFyIG49dC5jb3JlLmdldENsaWVudCgpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocixvKXtlLmdldFNwZWFrZXJJZCgpLnRoZW4oKGZ1bmN0aW9uKGkpe2UuZ2V0RG9tYWluSWQoKS50aGVuKChmdW5jdGlvbihlKXtjb25zdCBzPXtTcGVha2VySWQ6dC5hc3NlcnROb3ROdWxsKGkuc3BlYWtlcklkLCJzcGVha2VySWQiKSxEb21haW5JZDplfTt0LmdldExvZygpLmluZm8oImdldFNwZWFrZXJTdGF0dXMgY2FsbGVkIikud2l0aE9iamVjdChzKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4uY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5ERVNDUklCRV9TUEVBS0VSLHMse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJnZXRTcGVha2VyU3RhdHVzIHN1Y2NlZWRlZCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyKGUpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3ZhciBuPUpTT04ucGFyc2UoZSk7c3dpdGNoKG4uc3RhdHVzKXtjYXNlIDQwMDpjYXNlIDQwNDp2YXIgaT1uO2kudHlwZT1pLnR5cGU/aS50eXBlOnQuVm9pY2VJZEVycm9yVHlwZXMuU1BFQUtFUl9JRF9OT1RfRU5ST0xMRUQsdC5nZXRMb2coKS5pbmZvKCJTcGVha2VyIGlzIG5vdCBlbnJvbGxlZC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIoaSk7YnJlYWs7ZGVmYXVsdDp0LmdldExvZygpLmVycm9yKCJnZXRTcGVha2VyU3RhdHVzIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgcz10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkdFVF9TUEVBS0VSX1NUQVRVU19GQUlMRUQsIkdldCBTcGVha2VyU3RhdHVzIGZhaWxlZCIsZSk7byhzKX19fSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe28oZSl9KSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe28oZSl9KSl9KSl9LGEucHJvdG90eXBlLl9vcHRPdXRTcGVha2VySW5MY21zPWZ1bmN0aW9uKGUsbil7dmFyIHI9dGhpcyxvPXQuY29yZS5nZXRDbGllbnQoKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGkscyl7Y29uc3QgYT17Q29udGFjdElkOnIuY29udGFjdElkLEluc3RhbmNlSWQ6dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0SW5zdGFuY2VJZCgpLEFXU0FjY291bnRJZDp0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRBV1NBY2NvdW50SWQoKSxDdXN0b21lcklkOnQuYXNzZXJ0Tm90TnVsbChlLCJzcGVha2VySWQiKSxWb2ljZUlkUmVzdWx0OntTcGVha2VyT3B0ZWRPdXQ6ITAsZ2VuZXJhdGVkU3BlYWtlcklkOm59fTt0LmdldExvZygpLmluZm8oIl9vcHRPdXRTcGVha2VySW5MY21zIGNhbGxlZCIpLndpdGhPYmplY3QoYSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxvLmNhbGwodC5BZ2VudEFwcENsaWVudE1ldGhvZHMuVVBEQVRFX1ZPSUNFX0lEX0RBVEEsYSx7c3VjY2VzczpmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oIm9wdE91dFNwZWFrZXJJbkxjbXMgc3VjY2VlZGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkoZSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigib3B0T3V0U3BlYWtlckluTGNtcyBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5PUFRfT1VUX1NQRUFLRVJfSU5fTENNU19GQUlMRUQsIm9wdE91dFNwZWFrZXJJbkxjbXMgZmFpbGVkIixlKTtzKG4pfX0pfSkpfSxhLnByb3RvdHlwZS5vcHRPdXRTcGVha2VyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLmNoZWNrQ29uZmVyZW5jZUNhbGwoKTt2YXIgbj10LmNvcmUuZ2V0Q2xpZW50KCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe2UuZ2V0U3BlYWtlcklkKCkudGhlbigoZnVuY3Rpb24oaSl7ZS5nZXREb21haW5JZCgpLnRoZW4oKGZ1bmN0aW9uKHMpe3ZhciBhPWkuc3BlYWtlcklkO2NvbnN0IGM9e1NwZWFrZXJJZDp0LmFzc2VydE5vdE51bGwoYSwic3BlYWtlcklkIiksRG9tYWluSWQ6c307dC5nZXRMb2coKS5pbmZvKCJvcHRPdXRTcGVha2VyIGNhbGxlZCIpLndpdGhPYmplY3QoYykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLmNhbGwodC5BZ2VudEFwcENsaWVudE1ldGhvZHMuT1BUX09VVF9TUEVBS0VSLGMse3N1Y2Nlc3M6ZnVuY3Rpb24obil7ZS5fb3B0T3V0U3BlYWtlckluTGNtcyhhLG4uZ2VuZXJhdGVkU3BlYWtlcklkKS5jYXRjaCgoZnVuY3Rpb24oKXt9KSksdC5nZXRMb2coKS5pbmZvKCJvcHRPdXRTcGVha2VyIHN1Y2NlZWRlZCIpLndpdGhPYmplY3Qobikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyKG4pfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIm9wdE91dFNwZWFrZXIgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuT1BUX09VVF9TUEVBS0VSX0ZBSUxFRCwib3B0T3V0U3BlYWtlciBmYWlsZWQuIixlKTtvKG4pfX0pfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpfSkpfSxhLnByb3RvdHlwZS5kZWxldGVTcGVha2VyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLmNoZWNrQ29uZmVyZW5jZUNhbGwoKTt2YXIgbj10LmNvcmUuZ2V0Q2xpZW50KCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe2UuZ2V0U3BlYWtlcklkKCkudGhlbigoZnVuY3Rpb24oaSl7ZS5nZXREb21haW5JZCgpLnRoZW4oKGZ1bmN0aW9uKGUpe2NvbnN0IHM9e1NwZWFrZXJJZDp0LmFzc2VydE5vdE51bGwoaS5zcGVha2VySWQsInNwZWFrZXJJZCIpLERvbWFpbklkOmV9O3QuZ2V0TG9nKCkuaW5mbygiZGVsZXRlU3BlYWtlciBjYWxsZWQiKS53aXRoT2JqZWN0KHMpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLkRFTEVURV9TUEVBS0VSLHMse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJkZWxldGVTcGVha2VyIHN1Y2NlZWRlZCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyKGUpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoImRlbGV0ZVNwZWFrZXIgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuREVMRVRFX1NQRUFLRVJfRkFJTEVELCJkZWxldGVTcGVha2VyIGZhaWxlZC4iLGUpO28obil9fSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe28oZSl9KSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe28oZSl9KSl9KSl9LGEucHJvdG90eXBlLnN0YXJ0U2Vzc2lvbj1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5jaGVja0NvbmZlcmVuY2VDYWxsKCk7dmFyIG49dC5jb3JlLmdldENsaWVudCgpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocixvKXtlLmdldERvbWFpbklkKCkudGhlbigoZnVuY3Rpb24oaSl7Y29uc3Qgcz17Y29udGFjdElkOmUuY29udGFjdElkLGluc3RhbmNlSWQ6dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0SW5zdGFuY2VJZCgpLGN1c3RvbWVyQWNjb3VudElkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEFXU0FjY291bnRJZCgpLGNsaWVudFRva2VuOkFXUy51dGlsLnV1aWQudjQoKSxkb21haW5JZDppfTt0LmdldExvZygpLmluZm8oInN0YXJ0U2Vzc2lvbiBjYWxsZWQiKS53aXRoT2JqZWN0KHMpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLlNUQVJUX1ZPSUNFX0lEX1NFU1NJT04scyx7c3VjY2VzczpmdW5jdGlvbihlKXtpZihlLnNlc3Npb25JZClyKGUpO2Vsc2V7dC5nZXRMb2coKS5lcnJvcigic3RhcnRWb2ljZUlkU2Vzc2lvbiBmYWlsZWQsIG5vIHNlc3Npb24gaWQgcmV0dXJuZWQiKS53aXRoT2JqZWN0KHtkYXRhOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuU1RBUlRfU0VTU0lPTl9GQUlMRUQsIk5vIHNlc3Npb24gaWQgcmV0dXJuZWQgZnJvbSBzdGFydCBzZXNzaW9uIGFwaSIpO28obil9fSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoInN0YXJ0Vm9pY2VJZFNlc3Npb24gZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuU1RBUlRfU0VTU0lPTl9GQUlMRUQsInN0YXJ0Vm9pY2VJZFNlc3Npb24gZmFpbGVkIixlKTtvKG4pfX0pfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpfSkpfSxhLnByb3RvdHlwZS5ldmFsdWF0ZVNwZWFrZXI9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcztuLmNoZWNrQ29uZmVyZW5jZUNhbGwoKTt2YXIgcj10LmNvcmUuZ2V0Q2xpZW50KCksbz10LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRDb250YWN0RGF0YSh0aGlzLmNvbnRhY3RJZCksaT0wO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocyxhKXtmdW5jdGlvbiBjKCl7bi5nZXREb21haW5JZCgpLnRoZW4oKGZ1bmN0aW9uKGUpe2NvbnN0IHU9e1Nlc3Npb25OYW1lT3JJZDpvLmluaXRpYWxDb250YWN0SWR8fHRoaXMuY29udGFjdElkLERvbWFpbklkOmV9O3QuZ2V0TG9nKCkuaW5mbygiZXZhbHVhdGVTcGVha2VyIGNhbGxlZCIpLndpdGhPYmplY3QodSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyLmNhbGwodC5BZ2VudEFwcENsaWVudE1ldGhvZHMuRVZBTFVBVEVfU0VTU0lPTix1LHtzdWNjZXNzOmZ1bmN0aW9uKGUpe2lmKCsraTx0LlZvaWNlSWRDb25zdGFudHMuRVZBTFVBVElPTl9NQVhfUE9MTF9USU1FUylpZihlLlN0cmVhbWluZ1N0YXR1cz09PXQuVm9pY2VJZFN0cmVhbWluZ1N0YXR1cy5QRU5ESU5HX0NPTkZJR1VSQVRJT04pc2V0VGltZW91dChjLHQuVm9pY2VJZENvbnN0YW50cy5FVkFMVUFUSU9OX1BPTExJTkdfSU5URVJWQUwpO2Vsc2V7aWYoZS5BdXRoZW50aWNhdGlvblJlc3VsdHx8KGUuQXV0aGVudGljYXRpb25SZXN1bHQ9e30sZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbj10LkNvbnRhY3RGbG93QXV0aGVudGljYXRpb25EZWNpc2lvbi5OT1RfRU5BQkxFRCksZS5GcmF1ZERldGVjdGlvblJlc3VsdHx8KGUuRnJhdWREZXRlY3Rpb25SZXN1bHQ9e30sZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbj10LkNvbnRhY3RGbG93RnJhdWREZXRlY3Rpb25EZWNpc2lvbi5OT1RfRU5BQkxFRCksIW4uaXNBdXRoRW5hYmxlZChlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uKSYmIW4uaXNGcmF1ZEVuYWJsZWQoZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbikpcmV0dXJuIHQuZ2V0TG9nKCkuaW5mbygiZXZhbHVhdGVTcGVha2VyIHN1Y2NlZWRlZCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx2b2lkIHMoZSk7aWYoZS5TdHJlYW1pbmdTdGF0dXM9PT10LlZvaWNlSWRTdHJlYW1pbmdTdGF0dXMuRU5ERUQmJihuLmlzQXV0aFJlc3VsdE5vdEVub3VnaFNwZWVjaChlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uKSYmKGUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uSU5DT05DTFVTSVZFKSxuLmlzRnJhdWRSZXN1bHROb3RFbm91Z2hTcGVlY2goZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbikmJihlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dGcmF1ZERldGVjdGlvbkRlY2lzaW9uLklOQ09OQ0xVU0lWRSkpLG4uaXNBdXRoUmVzdWx0SW5jb25jbHVzaXZlKGUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb24pJiZuLmlzRnJhdWRSZXN1bHRJbmNvbmNsdXNpdmUoZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbikpcmV0dXJuIHQuZ2V0TG9nKCkuaW5mbygiZXZhbHVhdGVTcGVha2VyIHN1Y2NlZWRlZCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx2b2lkIHMoZSk7aWYoIW4uaXNBdXRoUmVzdWx0Tm90RW5vdWdoU3BlZWNoKGUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb24pJiZuLmlzQXV0aEVuYWJsZWQoZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbikpc3dpdGNoKGUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb24pe2Nhc2UgdC5Wb2ljZUlkQXV0aGVudGljYXRpb25EZWNpc2lvbi5BQ0NFUFQ6ZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbj10LkNvbnRhY3RGbG93QXV0aGVudGljYXRpb25EZWNpc2lvbi5BVVRIRU5USUNBVEVEO2JyZWFrO2Nhc2UgdC5Wb2ljZUlkQXV0aGVudGljYXRpb25EZWNpc2lvbi5SRUpFQ1Q6ZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbj10LkNvbnRhY3RGbG93QXV0aGVudGljYXRpb25EZWNpc2lvbi5OT1RfQVVUSEVOVElDQVRFRDticmVhaztjYXNlIHQuVm9pY2VJZEF1dGhlbnRpY2F0aW9uRGVjaXNpb24uU1BFQUtFUl9PUFRFRF9PVVQ6ZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbj10LkNvbnRhY3RGbG93QXV0aGVudGljYXRpb25EZWNpc2lvbi5PUFRFRF9PVVQ7YnJlYWs7Y2FzZSB0LlZvaWNlSWRBdXRoZW50aWNhdGlvbkRlY2lzaW9uLlNQRUFLRVJfTk9UX0VOUk9MTEVEOmUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uTk9UX0VOUk9MTEVEO2JyZWFrO2RlZmF1bHQ6ZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbj10LkNvbnRhY3RGbG93QXV0aGVudGljYXRpb25EZWNpc2lvbi5FUlJPUn1pZighbi5pc0ZyYXVkUmVzdWx0Tm90RW5vdWdoU3BlZWNoKGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb24pJiZuLmlzRnJhdWRFbmFibGVkKGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb24pKXN3aXRjaChlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uKXtjYXNlIHQuVm9pY2VJZEZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uSElHSF9SSVNLOmUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0ZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uSElHSF9SSVNLO2JyZWFrO2Nhc2UgdC5Wb2ljZUlkRnJhdWREZXRlY3Rpb25EZWNpc2lvbi5MT1dfUklTSzplLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dGcmF1ZERldGVjdGlvbkRlY2lzaW9uLkxPV19SSVNLO2JyZWFrO2RlZmF1bHQ6ZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbj10LkNvbnRhY3RGbG93RnJhdWREZXRlY3Rpb25EZWNpc2lvbi5FUlJPUn1pZighbi5pc0F1dGhSZXN1bHROb3RFbm91Z2hTcGVlY2goZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbikmJiFuLmlzRnJhdWRSZXN1bHROb3RFbm91Z2hTcGVlY2goZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbikpcmV0dXJuIHQuZ2V0TG9nKCkuaW5mbygiZXZhbHVhdGVTcGVha2VyIHN1Y2NlZWRlZCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx2b2lkIHMoZSk7c2V0VGltZW91dChjLHQuVm9pY2VJZENvbnN0YW50cy5FVkFMVUFUSU9OX1BPTExJTkdfSU5URVJWQUwpfWVsc2V7dC5nZXRMb2coKS5lcnJvcigiZXZhbHVhdGVTcGVha2VyIHRpbWVvdXQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciByPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuRVZBTFVBVEVfU1BFQUtFUl9USU1FT1VULCJldmFsdWF0ZVNwZWFrZXIgdGltZW91dCIpO2Eocil9fSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3ZhciBuO3N3aXRjaChKU09OLnBhcnNlKGUpLnN0YXR1cyl7Y2FzZSA0MDA6Y2FzZSA0MDQ6bj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLlNFU1NJT05fTk9UX0VYSVNUUywiZXZhbHVhdGVTcGVha2VyIGZhaWxlZCwgc2Vzc2lvbiBub3QgZXhpc3RzIixlKSx0LmdldExvZygpLmVycm9yKCJldmFsdWF0ZVNwZWFrZXIgZmFpbGVkLCBzZXNzaW9uIG5vdCBleGlzdHMiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7YnJlYWs7ZGVmYXVsdDpuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuRVZBTFVBVEVfU1BFQUtFUl9GQUlMRUQsImV2YWx1YXRlU3BlYWtlciBmYWlsZWQiLGUpLHQuZ2V0TG9nKCkuZXJyb3IoImV2YWx1YXRlU3BlYWtlciBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9YShuKX19KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7YShlKX0pKX1lP24uc3RhcnRTZXNzaW9uKCkudGhlbigoZnVuY3Rpb24oZSl7bi5zeW5jU3BlYWtlcklkKCkudGhlbigoZnVuY3Rpb24oZSl7c2V0VGltZW91dChjLHQuVm9pY2VJZENvbnN0YW50cy5FVkFMVUFURV9TRVNTSU9OX0RFTEFZKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigic3luY1NwZWFrZXJJZCBmYWlsZWQgd2hlbiBzZXNzaW9uIHN0YXJ0TmV3PXRydWUiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksYShlKX0pKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigic3RhcnRTZXNzaW9uIGZhaWxlZCB3aGVuIHNlc3Npb24gc3RhcnROZXc9dHJ1ZSIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxhKGUpfSkpOm4uc3luY1NwZWFrZXJJZCgpLnRoZW4oKGZ1bmN0aW9uKCl7YygpfSkpLmNhdGNoKChmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJzeW5jU3BlYWtlcklkIGZhaWxlZCB3aGVuIHNlc3Npb24gc3RhcnROZXc9ZmFsc2UiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksYShlKX0pKX0pKX0sYS5wcm90b3R5cGUuZGVzY3JpYmVTZXNzaW9uPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPXQuY29yZS5nZXRDbGllbnQoKSxyPXQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuY29udGFjdElkKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG8saSl7ZS5nZXREb21haW5JZCgpLnRoZW4oKGZ1bmN0aW9uKGUpe2NvbnN0IHM9e1Nlc3Npb25OYW1lT3JJZDpyLmluaXRpYWxDb250YWN0SWR8fHRoaXMuY29udGFjdElkLERvbWFpbklkOmV9O3QuZ2V0TG9nKCkuaW5mbygiZGVzY3JpYmVTZXNzaW9uIGNhbGxlZCIpLndpdGhPYmplY3Qocykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLmNhbGwodC5BZ2VudEFwcENsaWVudE1ldGhvZHMuREVTQ1JJQkVfU0VTU0lPTixzLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe28oZSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigiZGVzY3JpYmVTZXNzaW9uIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkRFU0NSSUJFX1NFU1NJT05fRkFJTEVELCJkZXNjcmliZVNlc3Npb24gZmFpbGVkIixlKTtpKG4pfX0pfSkpLmNhdGNoKChmdW5jdGlvbihlKXtpKGUpfSkpfSkpfSxhLnByb3RvdHlwZS5jaGVja0Vucm9sbG1lbnRTdGF0dXM9ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJjaGVja0Vucm9sbG1lbnRTdGF0dXMgY2FsbGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbj10aGlzLHI9MCxvPSExO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oaSxzKXshZnVuY3Rpb24gYSgpe2lmKCsrcjx0LlZvaWNlSWRDb25zdGFudHMuRU5ST0xMTUVOVF9NQVhfUE9MTF9USU1FUyluLmRlc2NyaWJlU2Vzc2lvbigpLnRoZW4oKGZ1bmN0aW9uKHIpe3N3aXRjaChyLlNlc3Npb24uRW5yb2xsbWVudFJlcXVlc3REZXRhaWxzLlN0YXR1cyl7Y2FzZSB0LlZvaWNlSWRFbnJvbGxtZW50UmVxdWVzdFN0YXR1cy5DT01QTEVURUQ6aShyKTticmVhaztjYXNlIHQuVm9pY2VJZEVucm9sbG1lbnRSZXF1ZXN0U3RhdHVzLklOX1BST0dSRVNTOm98fCJmdW5jdGlvbiIhPXR5cGVvZiBlfHwoZShyKSxvPSEwKSxzZXRUaW1lb3V0KGEsdC5Wb2ljZUlkQ29uc3RhbnRzLkVOUk9MTE1FTlRfUE9MTElOR19JTlRFUlZBTCk7YnJlYWs7Y2FzZSB0LlZvaWNlSWRFbnJvbGxtZW50UmVxdWVzdFN0YXR1cy5OT1RfRU5PVUdIX1NQRUVDSDpyLlNlc3Npb24uU3RyZWFtaW5nU3RhdHVzIT09dC5Wb2ljZUlkU3RyZWFtaW5nU3RhdHVzLkVOREVEP3NldFRpbWVvdXQoYSx0LlZvaWNlSWRDb25zdGFudHMuRU5ST0xMTUVOVF9QT0xMSU5HX0lOVEVSVkFMKTpzZXRUaW1lb3V0KChmdW5jdGlvbigpe24uc3RhcnRTZXNzaW9uKCkudGhlbigoZnVuY3Rpb24oZSl7YSgpfSkpLmNhdGNoKChmdW5jdGlvbihlLHQpe3MoZSl9KSl9KSx0LlZvaWNlSWRDb25zdGFudHMuU1RBUlRfU0VTU0lPTl9ERUxBWSk7YnJlYWs7ZGVmYXVsdDp2YXIgYz1yLlNlc3Npb24uRW5yb2xsbWVudFJlcXVlc3REZXRhaWxzLk1lc3NhZ2U/ci5TZXNzaW9uLkVucm9sbG1lbnRSZXF1ZXN0RGV0YWlscy5NZXNzYWdlOiJlbnJvbGxTcGVha2VyIGZhaWxlZC4gVW5rbm93biBlbnJvbGxtZW50IHN0YXR1cyBoYXMgYmVlbiByZWNlaXZlZCI7dC5nZXRMb2coKS5lcnJvcihjKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciB1PXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuRU5ST0xMX1NQRUFLRVJfRkFJTEVELGMsci5TZXNzaW9uLkVucm9sbG1lbnRSZXF1ZXN0RGV0YWlscy5TdGF0dXMpO3ModSl9fSkpO2Vsc2V7dC5nZXRMb2coKS5lcnJvcigiZW5yb2xsU3BlYWtlciB0aW1lb3V0Iikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgYz10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkVOUk9MTF9TUEVBS0VSX1RJTUVPVVQsImVucm9sbFNwZWFrZXIgdGltZW91dCIpO3MoYyl9fSgpfSkpfSxhLnByb3RvdHlwZS5lbnJvbGxTcGVha2VyPWZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiZW5yb2xsU3BlYWtlciBjYWxsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBuPXRoaXM7cmV0dXJuIG4uY2hlY2tDb25mZXJlbmNlQ2FsbCgpLG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe24uc3luY1NwZWFrZXJJZCgpLnRoZW4oKGZ1bmN0aW9uKCl7bi5nZXRTcGVha2VyU3RhdHVzKCkudGhlbigoZnVuY3Rpb24oaSl7aS5TcGVha2VyJiZpLlNwZWFrZXIuU3RhdHVzPT10LlZvaWNlSWRTcGVha2VyU3RhdHVzLk9QVEVEX09VVD9uLmRlbGV0ZVNwZWFrZXIoKS50aGVuKChmdW5jdGlvbigpe24uZW5yb2xsU3BlYWtlckhlbHBlcihyLG8sZSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe28oZSl9KSk6bi5lbnJvbGxTcGVha2VySGVscGVyKHIsbyxlKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKX0sYS5wcm90b3R5cGUuZW5yb2xsU3BlYWtlckhlbHBlcj1mdW5jdGlvbihlLG4scil7dmFyIG89dGhpcyxpPXQuY29yZS5nZXRDbGllbnQoKSxzPXQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuY29udGFjdElkKTtvLmdldERvbWFpbklkKCkudGhlbigoZnVuY3Rpb24oYSl7Y29uc3QgYz17U2Vzc2lvbk5hbWVPcklkOnMuaW5pdGlhbENvbnRhY3RJZHx8dGhpcy5jb250YWN0SWQsRG9tYWluSWQ6YX07dC5nZXRMb2coKS5pbmZvKCJlbnJvbGxTcGVha2VySGVscGVyIGNhbGxlZCIpLndpdGhPYmplY3QoYykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpLmNhbGwodC5BZ2VudEFwcENsaWVudE1ldGhvZHMuRU5ST0xMX0JZX1NFU1NJT04sYyx7c3VjY2VzczpmdW5jdGlvbihpKXtpLlN0YXR1cz09PXQuVm9pY2VJZEVucm9sbG1lbnRSZXF1ZXN0U3RhdHVzLkNPTVBMRVRFRD8odC5nZXRMb2coKS5pbmZvKCJlbnJvbGxTcGVha2VyIHN1Y2NlZWRlZCIpLndpdGhPYmplY3QoaSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxlKGkpKTpvLmNoZWNrRW5yb2xsbWVudFN0YXR1cyhyKS50aGVuKChmdW5jdGlvbihuKXt0LmdldExvZygpLmluZm8oImVucm9sbFNwZWFrZXIgc3VjY2VlZGVkIikud2l0aE9iamVjdChuKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGUobil9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe24oZSl9KSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigiZW5yb2xsU3BlYWtlciBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIHI9dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5FTlJPTExfU1BFQUtFUl9GQUlMRUQsImVucm9sbFNwZWFrZXIgZmFpbGVkIixlKTtuKHIpfX0pfSkpLmNhdGNoKChmdW5jdGlvbihlKXtuKGUpfSkpfSxhLnByb3RvdHlwZS5fdXBkYXRlU3BlYWtlcklkSW5MY21zPWZ1bmN0aW9uKGUsbil7dmFyIHI9dGhpcyxvPXQuY29yZS5nZXRDbGllbnQoKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGkscyl7Y29uc3QgYT17Q29udGFjdElkOnIuY29udGFjdElkLEluc3RhbmNlSWQ6dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0SW5zdGFuY2VJZCgpLEFXU0FjY291bnRJZDp0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRBV1NBY2NvdW50SWQoKSxDdXN0b21lcklkOnQuYXNzZXJ0Tm90TnVsbChlLCJzcGVha2VySWQiKSxWb2ljZUlkUmVzdWx0OntnZW5lcmF0ZWRTcGVha2VySWQ6bn19O3QuZ2V0TG9nKCkuaW5mbygiX3VwZGF0ZVNwZWFrZXJJZEluTGNtcyBjYWxsZWQiKS53aXRoT2JqZWN0KGEpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksby5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLlVQREFURV9WT0lDRV9JRF9EQVRBLGEse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJ1cGRhdGVTcGVha2VySWRJbkxjbXMgc3VjY2VlZGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkoZSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigidXBkYXRlU3BlYWtlcklkSW5MY21zIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLlVQREFURV9TUEVBS0VSX0lEX0lOX0xDTVNfRkFJTEVELCJ1cGRhdGVTcGVha2VySWRJbkxjbXMgZmFpbGVkIixlKTtzKG4pfX0pfSkpfSxhLnByb3RvdHlwZS51cGRhdGVTcGVha2VySWRJblZvaWNlSWQ9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcztuLmNoZWNrQ29uZmVyZW5jZUNhbGwoKTt2YXIgcj10LmNvcmUuZ2V0Q2xpZW50KCksbz10LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRDb250YWN0RGF0YSh0aGlzLmNvbnRhY3RJZCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihpLHMpe24uZ2V0RG9tYWluSWQoKS50aGVuKChmdW5jdGlvbihhKXtjb25zdCBjPXtTZXNzaW9uTmFtZU9ySWQ6by5pbml0aWFsQ29udGFjdElkfHx0aGlzLmNvbnRhY3RJZCxTcGVha2VySWQ6dC5hc3NlcnROb3ROdWxsKGUsInNwZWFrZXJJZCIpLERvbWFpbklkOmF9O3QuZ2V0TG9nKCkuaW5mbygidXBkYXRlU3BlYWtlcklkSW5Wb2ljZUlkIGNhbGxlZCIpLndpdGhPYmplY3QoYykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyLmNhbGwodC5BZ2VudEFwcENsaWVudE1ldGhvZHMuVVBEQVRFX1NFU1NJT04sYyx7c3VjY2VzczpmdW5jdGlvbihyKXt0LmdldExvZygpLmluZm8oInVwZGF0ZVNwZWFrZXJJZEluVm9pY2VJZCBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KHIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG89ciYmci5TZXNzaW9uJiZyLlNlc3Npb24uR2VuZXJhdGVkU3BlYWtlcklkO24uX3VwZGF0ZVNwZWFrZXJJZEluTGNtcyhlLG8pLnRoZW4oKGZ1bmN0aW9uKCl7aShyKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7cyhlKX0pKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt2YXIgbjtzd2l0Y2goSlNPTi5wYXJzZShlKS5zdGF0dXMpe2Nhc2UgNDAwOmNhc2UgNDA0Om49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5TRVNTSU9OX05PVF9FWElTVFMsInVwZGF0ZVNwZWFrZXJJZEluVm9pY2VJZCBmYWlsZWQsIHNlc3Npb24gbm90IGV4aXN0cyIsZSksdC5nZXRMb2coKS5lcnJvcigidXBkYXRlU3BlYWtlcklkSW5Wb2ljZUlkIGZhaWxlZCwgc2Vzc2lvbiBub3QgZXhpc3RzIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO2JyZWFrO2RlZmF1bHQ6bj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLlVQREFURV9TUEVBS0VSX0lEX0ZBSUxFRCwidXBkYXRlU3BlYWtlcklkSW5Wb2ljZUlkIGZhaWxlZCIsZSksdC5nZXRMb2coKS5lcnJvcigidXBkYXRlU3BlYWtlcklkSW5Wb2ljZUlkIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX1zKG4pfX0pfSkpLmNhdGNoKChmdW5jdGlvbihlKXtzKGUpfSkpfSkpfSxhLnByb3RvdHlwZS5zeW5jU3BlYWtlcklkPWZ1bmN0aW9uKCl7dC5nZXRMb2coKS5pbmZvKCJzeW5jU3BlYWtlcklkIGNhbGxlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIGU9dGhpcztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQsbil7ZS5nZXRTcGVha2VySWQoKS50aGVuKChmdW5jdGlvbihyKXtlLnVwZGF0ZVNwZWFrZXJJZEluVm9pY2VJZChyLnNwZWFrZXJJZCkudGhlbigoZnVuY3Rpb24oZSl7dChlKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7bihlKX0pKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7bihlKX0pKX0pKX0sYS5wcm90b3R5cGUuZ2V0RG9tYWluSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGUsbil7aWYoKG5ldyB0LkFnZW50KS5nZXRQZXJtaXNzaW9ucygpLmluY2x1ZGVzKHQuQWdlbnRQZXJtaXNzaW9ucy5WT0lDRV9JRCkpaWYodC5jb3JlLnZvaWNlSWREb21haW5JZCllKHQuY29yZS52b2ljZUlkRG9tYWluSWQpO2Vsc2V7dmFyIHI9dC5jb3JlLmdldENsaWVudCgpO2NvbnN0IG89e0luc3RhbmNlSWQ6dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0SW5zdGFuY2VJZCgpLEludGVncmF0aW9uVHlwZToiVk9JQ0VfSUQifTt0LmdldExvZygpLmluZm8oImdldERvbWFpbklkIGNhbGxlZCIpLndpdGhPYmplY3Qobykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyLmNhbGwodC5BZ2VudEFwcENsaWVudE1ldGhvZHMuTElTVF9JTlRFR1JBVElPTl9BU1NPQ0lBVElPTlMsbyx7c3VjY2VzczpmdW5jdGlvbihyKXt0cnl7dmFyIG87aWYoci5JbnRlZ3JhdGlvbkFzc29jaWF0aW9uU3VtbWFyeUxpc3QubGVuZ3RoPj0xJiYobz1yLkludGVncmF0aW9uQXNzb2NpYXRpb25TdW1tYXJ5TGlzdFswXS5JbnRlZ3JhdGlvbkFybi5yZXBsYWNlKC9eLipkb21haW5cLy9pLCIiKSksIW8pe3QuZ2V0TG9nKCkuaW5mbygiZ2V0RG9tYWluSWQ6IG5vIGRvbWFpbklkIGZvdW5kIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgaT10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLk5PX0RPTUFJTl9JRF9GT1VORCk7cmV0dXJuIHZvaWQgbihpKX10LmdldExvZygpLmluZm8oImdldERvbWFpbklkIHN1Y2NlZWRlZCIpLndpdGhPYmplY3Qocikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LlZvaWNlSWRFdmVudHMuVVBEQVRFX0RPTUFJTl9JRCxkYXRhOntkb21haW5JZDpvfX0pLGUobyl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiZ2V0RG9tYWluSWQgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGk9dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5HRVRfRE9NQUlOX0lEX0ZBSUxFRCwiZ2V0RG9tYWluSWQgZmFpbGVkIixlKSxuKGkpfX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJnZXREb21haW5JZCBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIHI9dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5HRVRfRE9NQUlOX0lEX0ZBSUxFRCwiZ2V0RG9tYWluSWQgZmFpbGVkIixlKTtuKHIpfX0pfWVsc2UgbihuZXcgRXJyb3IoIkFnZW50IGRvZXNuJ3QgaGF2ZSB0aGUgcGVybWlzc2lvbiBmb3IgVm9pY2UgSUQiKSl9KSl9LGEucHJvdG90eXBlLmNoZWNrQ29uZmVyZW5jZUNhbGw9ZnVuY3Rpb24oKXtpZih0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRDb250YWN0RGF0YSh0aGlzLmNvbnRhY3RJZCkuY29ubmVjdGlvbnMuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gdC5jb250YWlucyh0LkNPTk5FQ1RJT05fQUNUSVZFX1NUQVRFUyxlLnN0YXRlLnR5cGUpfSkpLmxlbmd0aD4yKXRocm93IG5ldyB0Lk5vdEltcGxlbWVudGVkRXJyb3IoIlZvaWNlSWQgaXMgbm90IHN1cHBvcnRlZCBmb3IgY29uZmVyZW5jZSBjYWxscyIpfSxhLnByb3RvdHlwZS5pc0F1dGhFbmFibGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIT09dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uTk9UX0VOQUJMRUR9LGEucHJvdG90eXBlLmlzQXV0aFJlc3VsdE5vdEVub3VnaFNwZWVjaD1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXQuVm9pY2VJZEF1dGhlbnRpY2F0aW9uRGVjaXNpb24uTk9UX0VOT1VHSF9TUEVFQ0h9LGEucHJvdG90eXBlLmlzQXV0aFJlc3VsdEluY29uY2x1c2l2ZT1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLklOQ09OQ0xVU0lWRX0sYS5wcm90b3R5cGUuaXNGcmF1ZEVuYWJsZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT10LkNvbnRhY3RGbG93RnJhdWREZXRlY3Rpb25EZWNpc2lvbi5OT1RfRU5BQkxFRH0sYS5wcm90b3R5cGUuaXNGcmF1ZFJlc3VsdE5vdEVub3VnaFNwZWVjaD1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXQuVm9pY2VJZEZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uTk9UX0VOT1VHSF9TUEVFQ0h9LGEucHJvdG90eXBlLmlzRnJhdWRSZXN1bHRJbmNvbmNsdXNpdmU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10LkNvbnRhY3RGbG93RnJhdWREZXRlY3Rpb25EZWNpc2lvbi5JTkNPTkNMVVNJVkV9O3ZhciBjPWZ1bmN0aW9uKGUsdCl7dGhpcy5fc3BlYWtlckF1dGhlbnRpY2F0b3I9bmV3IGEoZSkscy5jYWxsKHRoaXMsZSx0KX07KGMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUocy5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1jLGMucHJvdG90eXBlLmdldFNvZnRwaG9uZU1lZGlhSW5mbz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuc29mdHBob25lTWVkaWFJbmZvfSxjLnByb3RvdHlwZS5nZXRNZWRpYUluZm89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnNvZnRwaG9uZU1lZGlhSW5mb30sYy5wcm90b3R5cGUuZ2V0TWVkaWFUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuTWVkaWFUeXBlLlNPRlRQSE9ORX0sYy5wcm90b3R5cGUuZ2V0TWVkaWFDb250cm9sbGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5tZWRpYUZhY3RvcnkuZ2V0KHRoaXMpfSxjLnByb3RvdHlwZS5nZXRWb2ljZUlkU3BlYWtlcklkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NwZWFrZXJBdXRoZW50aWNhdG9yLmdldFNwZWFrZXJJZCgpfSxjLnByb3RvdHlwZS5nZXRWb2ljZUlkU3BlYWtlclN0YXR1cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zcGVha2VyQXV0aGVudGljYXRvci5nZXRTcGVha2VyU3RhdHVzKCl9LGMucHJvdG90eXBlLm9wdE91dFZvaWNlSWRTcGVha2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NwZWFrZXJBdXRoZW50aWNhdG9yLm9wdE91dFNwZWFrZXIoKX0sYy5wcm90b3R5cGUuZGVsZXRlVm9pY2VJZFNwZWFrZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3BlYWtlckF1dGhlbnRpY2F0b3IuZGVsZXRlU3BlYWtlcigpfSxjLnByb3RvdHlwZS5ldmFsdWF0ZVNwZWFrZXJXaXRoVm9pY2VJZD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fc3BlYWtlckF1dGhlbnRpY2F0b3IuZXZhbHVhdGVTcGVha2VyKGUpfSxjLnByb3RvdHlwZS5lbnJvbGxTcGVha2VySW5Wb2ljZUlkPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9zcGVha2VyQXV0aGVudGljYXRvci5lbnJvbGxTcGVha2VyKGUpfSxjLnByb3RvdHlwZS51cGRhdGVWb2ljZUlkU3BlYWtlcklkPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9zcGVha2VyQXV0aGVudGljYXRvci51cGRhdGVTcGVha2VySWRJblZvaWNlSWQoZSl9LGMucHJvdG90eXBlLmdldFF1aWNrQ29ubmVjdE5hbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnF1aWNrQ29ubmVjdE5hbWV9LGMucHJvdG90eXBlLmlzU2lsZW50TW9uaXRvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE1vbml0b3JTdGF0dXMoKT09PXQuTW9uaXRvcmluZ01vZGUuU0lMRU5UX01PTklUT1J9LGMucHJvdG90eXBlLmlzQmFyZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRNb25pdG9yU3RhdHVzKCk9PT10Lk1vbml0b3JpbmdNb2RlLkJBUkdFfSxjLnByb3RvdHlwZS5pc0JhcmdlRW5hYmxlZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0TW9uaXRvckNhcGFiaWxpdGllcygpO3JldHVybiBlJiZlLmluY2x1ZGVzKHQuTW9uaXRvcmluZ01vZGUuQkFSR0UpfSxjLnByb3RvdHlwZS5pc1NpbGVudE1vbml0b3JFbmFibGVkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRNb25pdG9yQ2FwYWJpbGl0aWVzKCk7cmV0dXJuIGUmJmUuaW5jbHVkZXModC5Nb25pdG9yaW5nTW9kZS5TSUxFTlRfTU9OSVRPUil9LGMucHJvdG90eXBlLmdldE1vbml0b3JDYXBhYmlsaXRpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLm1vbml0b3JDYXBhYmlsaXRpZXN9LGMucHJvdG90eXBlLmdldE1vbml0b3JTdGF0dXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLm1vbml0b3JTdGF0dXN9LGMucHJvdG90eXBlLmlzTXV0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkubXV0ZX0sYy5wcm90b3R5cGUuaXNGb3JjZWRNdXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5mb3JjZWRNdXRlfSxjLnByb3RvdHlwZS5tdXRlUGFydGljaXBhbnQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLk1VVEVfUEFSVElDSVBBTlQse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNvbm5lY3Rpb25JZDp0aGlzLmdldENvbm5lY3Rpb25JZCgpfSxlKX0sYy5wcm90b3R5cGUudW5tdXRlUGFydGljaXBhbnQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLlVOTVVURV9QQVJUSUNJUEFOVCx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY29ubmVjdGlvbklkOnRoaXMuZ2V0Q29ubmVjdGlvbklkKCl9LGUpfTt2YXIgdT1mdW5jdGlvbihlLHQpe3MuY2FsbCh0aGlzLGUsdCl9Oyh1LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHMucHJvdG90eXBlKSkuY29uc3RydWN0b3I9dSx1LnByb3RvdHlwZS5nZXRNZWRpYUluZm89ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9nZXREYXRhKCkuY2hhdE1lZGlhSW5mbztpZihlKXt2YXIgbj10LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRDb250YWN0RGF0YSh0aGlzLmNvbnRhY3RJZCkscj17Y29udGFjdElkOnRoaXMuY29udGFjdElkLGluaXRpYWxDb250YWN0SWQ6bi5pbml0aWFsQ29udGFjdElkfHx0aGlzLmNvbnRhY3RJZCxwYXJ0aWNpcGFudElkOnRoaXMuY29ubmVjdGlvbklkLGdldENvbm5lY3Rpb25Ub2tlbjp0LmhpdGNoKHRoaXMsdGhpcy5nZXRDb25uZWN0aW9uVG9rZW4pfTtpZihlLmNvbm5lY3Rpb25EYXRhKXRyeXtyLnBhcnRpY2lwYW50VG9rZW49SlNPTi5wYXJzZShlLmNvbm5lY3Rpb25EYXRhKS5Db25uZWN0aW9uQXV0aGVudGljYXRpb25Ub2tlbn1jYXRjaChuKXt0LmdldExvZygpLmVycm9yKHQuTG9nQ29tcG9uZW50LkNIQVQsIkNvbm5lY3Rpb24gZGF0YSBpcyBpbnZhbGlkIikud2l0aE9iamVjdChlKS53aXRoRXhjZXB0aW9uKG4pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksci5wYXJ0aWNpcGFudFRva2VuPW51bGx9cmV0dXJuIHIucGFydGljaXBhbnRUb2tlbj1yLnBhcnRpY2lwYW50VG9rZW58fG51bGwsci5vcmlnaW5hbEluZm89dGhpcy5fZ2V0RGF0YSgpLmNoYXRNZWRpYUluZm8scn1yZXR1cm4gbnVsbH0sdS5wcm90b3R5cGUuZ2V0Q29ubmVjdGlvblRva2VuPWZ1bmN0aW9uKCl7dmFyIGU9dC5jb3JlLmdldENsaWVudCgpLG49KHQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuY29udGFjdElkKSx7dHJhbnNwb3J0VHlwZTp0LlRSQU5TUE9SVF9UWVBFUy5DSEFUX1RPS0VOLHBhcnRpY2lwYW50SWQ6dGhpcy5jb25uZWN0aW9uSWQsY29udGFjdElkOnRoaXMuY29udGFjdElkfSk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe2UuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ1JFQVRFX1RSQU5TUE9SVCxuLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiZ2V0Q29ubmVjdGlvblRva2VuIHN1Y2NlZWRlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihlKX0sZmFpbHVyZTpmdW5jdGlvbihlLG4pe3QuZ2V0TG9nKCkuZXJyb3IoImdldENvbm5lY3Rpb25Ub2tlbiBmYWlsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe2VycjplLGRhdGE6bn0pLG8oRXJyb3IoImdldENvbm5lY3Rpb25Ub2tlbiBmYWlsZWQiKSl9fSl9KSl9LHUucHJvdG90eXBlLmdldE1lZGlhVHlwZT1mdW5jdGlvbigpe3JldHVybiB0Lk1lZGlhVHlwZS5DSEFUfSx1LnByb3RvdHlwZS5nZXRNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLm1lZGlhRmFjdG9yeS5nZXQodGhpcyl9LHUucHJvdG90eXBlLl9pbml0TWVkaWFDb250cm9sbGVyPWZ1bmN0aW9uKCl7dGhpcy5faXNBZ2VudENvbm5lY3Rpb25UeXBlKCkmJnQuY29yZS5tZWRpYUZhY3RvcnkuZ2V0KHRoaXMpLmNhdGNoKChmdW5jdGlvbigpe30pKX07dmFyIGw9ZnVuY3Rpb24oZSx0KXtzLmNhbGwodGhpcyxlLHQpfTsobC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWwsbC5wcm90b3R5cGUuZ2V0TWVkaWFUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuTWVkaWFUeXBlLlRBU0t9LGwucHJvdG90eXBlLmdldE1lZGlhSW5mbz1mdW5jdGlvbigpe3ZhciBlPXQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuY29udGFjdElkKTtyZXR1cm57Y29udGFjdElkOnRoaXMuY29udGFjdElkLGluaXRpYWxDb250YWN0SWQ6ZS5pbml0aWFsQ29udGFjdElkfHx0aGlzLmNvbnRhY3RJZH19LGwucHJvdG90eXBlLmdldE1lZGlhQ29udHJvbGxlcj1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUubWVkaWFGYWN0b3J5LmdldCh0aGlzKX07dmFyIHA9ZnVuY3Rpb24oZSl7dC5Db25uZWN0aW9uLmNhbGwodGhpcyxlLmNvbnRhY3RJZCxlLmNvbm5lY3Rpb25JZCksdGhpcy5jb25uZWN0aW9uRGF0YT1lfTsocC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXAscC5wcm90b3R5cGUuX2dldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25uZWN0aW9uRGF0YX0scC5wcm90b3R5cGUuX2luaXRNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oKXt9O3ZhciBkPWZ1bmN0aW9uKGUpe3ZhciB0PWV8fHt9O3RoaXMuZW5kcG9pbnRBUk49dC5lbmRwb2ludElkfHx0LmVuZHBvaW50QVJOfHxudWxsLHRoaXMuZW5kcG9pbnRJZD10aGlzLmVuZHBvaW50QVJOLHRoaXMudHlwZT10LnR5cGV8fG51bGwsdGhpcy5uYW1lPXQubmFtZXx8bnVsbCx0aGlzLnBob25lTnVtYmVyPXQucGhvbmVOdW1iZXJ8fG51bGwsdGhpcy5hZ2VudExvZ2luPXQuYWdlbnRMb2dpbnx8bnVsbCx0aGlzLnF1ZXVlPXQucXVldWV8fG51bGx9O2QucHJvdG90eXBlLnN0cmlwUGhvbmVOdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5waG9uZU51bWJlcj90aGlzLnBob25lTnVtYmVyLnJlcGxhY2UoL3NpcDooW15AXSopQC4qLywiJDEiKToiIn0sZC5ieVBob25lTnVtYmVyPWZ1bmN0aW9uKGUsbil7cmV0dXJuIG5ldyBkKHt0eXBlOnQuRW5kcG9pbnRUeXBlLlBIT05FX05VTUJFUixwaG9uZU51bWJlcjplLG5hbWU6bnx8bnVsbH0pfTt2YXIgaD1mdW5jdGlvbihlLHQsbil7dGhpcy5lcnJvclR5cGU9ZSx0aGlzLmVycm9yTWVzc2FnZT10LHRoaXMuZW5kUG9pbnRVcmw9bn07aC5wcm90b3R5cGUuZ2V0RXJyb3JUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JUeXBlfSxoLnByb3RvdHlwZS5nZXRFcnJvck1lc3NhZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvck1lc3NhZ2V9LGgucHJvdG90eXBlLmdldEVuZFBvaW50VXJsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW5kUG9pbnRVcmx9LHQuYWdlbnQ9ZnVuY3Rpb24oZSl7dmFyIG49dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuSU5JVCxlKTtyZXR1cm4gdC5hZ2VudC5pbml0aWFsaXplZCYmZShuZXcgdC5BZ2VudCksbn0sdC5hZ2VudC5pbml0aWFsaXplZD0hMSx0LmNvbnRhY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkNvbnRhY3RFdmVudHMuSU5JVCxlKX0sdC5vbldlYnNvY2tldEluaXRGYWlsdXJlPWZ1bmN0aW9uKGUpe3ZhciBuPXQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LldlYlNvY2tldEV2ZW50cy5JTklUX0ZBSUxVUkUsZSk7cmV0dXJuIHQud2ViU29ja2V0SW5pdEZhaWxlZCYmZSgpLG59LHQuaWZNYXN0ZXI9ZnVuY3Rpb24oZSxuLHIsbyl7aWYodC5hc3NlcnROb3ROdWxsKGUsIkEgdG9waWMgbXVzdCBiZSBwcm92aWRlZC4iKSx0LmFzc2VydE5vdE51bGwobiwiQSB0cnVlIGNhbGxiYWNrIG11c3QgYmUgcHJvdmlkZWQuIiksIXQuY29yZS5tYXN0ZXJDbGllbnQpcmV0dXJuIHQuZ2V0TG9nKCkud2FybigiV2UgY2FuJ3QgYmUgdGhlIG1hc3RlciBmb3IgdG9waWMgJyVzJyBiZWNhdXNlIHRoZXJlIGlzIG5vIG1hc3RlciBjbGllbnQhIixlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHZvaWQociYmcigpKTt0LmNvcmUuZ2V0TWFzdGVyQ2xpZW50KCkuY2FsbCh0Lk1hc3Rlck1ldGhvZHMuQ0hFQ0tfTUFTVEVSLHt0b3BpYzplLHNob3VsZE5vdEJlY29tZU1hc3RlcklmTm9uZTpvfSx7c3VjY2VzczpmdW5jdGlvbihlKXtlLmlzTWFzdGVyP24oKTpyJiZyKCl9fSl9LHQuYmVjb21lTWFzdGVyPWZ1bmN0aW9uKGUsbixyKXt0LmFzc2VydE5vdE51bGwoZSwiQSB0b3BpYyBtdXN0IGJlIHByb3ZpZGVkLiIpLHQuY29yZS5tYXN0ZXJDbGllbnQ/dC5jb3JlLmdldE1hc3RlckNsaWVudCgpLmNhbGwodC5NYXN0ZXJNZXRob2RzLkJFQ09NRV9NQVNURVIse3RvcGljOmV9LHtzdWNjZXNzOmZ1bmN0aW9uKCl7biYmbigpfX0pOih0LmdldExvZygpLndhcm4oIldlIGNhbid0IGJlIHRoZSBtYXN0ZXIgZm9yIHRvcGljICclcycgYmVjYXVzZSB0aGVyZSBpcyBubyBtYXN0ZXIgY2xpZW50ISIsZSksciYmcigpKX0sdC5BZ2VudD1uLHQuQWdlbnRTbmFwc2hvdD1yLHQuQ29udGFjdD1vLHQuQ29udGFjdFNuYXBzaG90PWksdC5Db25uZWN0aW9uPWMsdC5CYXNlQ29ubmVjdGlvbj1zLHQuVm9pY2VDb25uZWN0aW9uPWMsdC5DaGF0Q29ubmVjdGlvbj11LHQuVGFza0Nvbm5lY3Rpb249bCx0LkNvbm5lY3Rpb25TbmFwc2hvdD1wLHQuRW5kcG9pbnQ9ZCx0LkFkZHJlc3M9ZCx0LlNvZnRwaG9uZUVycm9yPWgsdC5Wb2ljZUlkPWF9KCl9LDgyNzooZSx0LG4pPT57dmFyIHI7IWZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIG8ocyxhKXtpZighbltzXSl7aWYoIXRbc10pe2lmKGkpcmV0dXJuIGkocywhMCk7dmFyIGM9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrcysiJyIpO3Rocm93IGMuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsY312YXIgdT1uW3NdPXtleHBvcnRzOnt9fTt0W3NdWzBdLmNhbGwodS5leHBvcnRzLChmdW5jdGlvbihlKXtyZXR1cm4gbyh0W3NdWzFdW2VdfHxlKX0pLHUsdS5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW3NdLmV4cG9ydHN9Zm9yKHZhciBpPXZvaWQgMCxzPTA7czxyLmxlbmd0aDtzKyspbyhyW3NdKTtyZXR1cm4gb30oezE6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e3ZlcnNpb246IjIuMCIsbWV0YWRhdGE6e2FwaVZlcnNpb246IjIwMTQtMDYtMzAiLGVuZHBvaW50UHJlZml4OiJjb2duaXRvLWlkZW50aXR5Iixqc29uVmVyc2lvbjoiMS4xIixwcm90b2NvbDoianNvbiIsc2VydmljZUZ1bGxOYW1lOiJBbWF6b24gQ29nbml0byBJZGVudGl0eSIsc2VydmljZUlkOiJDb2duaXRvIElkZW50aXR5IixzaWduYXR1cmVWZXJzaW9uOiJ2NCIsdGFyZ2V0UHJlZml4OiJBV1NDb2duaXRvSWRlbnRpdHlTZXJ2aWNlIix1aWQ6ImNvZ25pdG8taWRlbnRpdHktMjAxNC0wNi0zMCJ9LG9wZXJhdGlvbnM6e0NyZWF0ZUlkZW50aXR5UG9vbDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xOYW1lIiwiQWxsb3dVbmF1dGhlbnRpY2F0ZWRJZGVudGl0aWVzIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sTmFtZTp7fSxBbGxvd1VuYXV0aGVudGljYXRlZElkZW50aXRpZXM6e3R5cGU6ImJvb2xlYW4ifSxBbGxvd0NsYXNzaWNGbG93Ont0eXBlOiJib29sZWFuIn0sU3VwcG9ydGVkTG9naW5Qcm92aWRlcnM6e3NoYXBlOiJTNSJ9LERldmVsb3BlclByb3ZpZGVyTmFtZTp7fSxPcGVuSWRDb25uZWN0UHJvdmlkZXJBUk5zOntzaGFwZToiUzkifSxDb2duaXRvSWRlbnRpdHlQcm92aWRlcnM6e3NoYXBlOiJTYiJ9LFNhbWxQcm92aWRlckFSTnM6e3NoYXBlOiJTZyJ9LElkZW50aXR5UG9vbFRhZ3M6e3NoYXBlOiJTaCJ9fX0sb3V0cHV0OntzaGFwZToiU2sifX0sRGVsZXRlSWRlbnRpdGllczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eUlkc1RvRGVsZXRlIl0sbWVtYmVyczp7SWRlbnRpdHlJZHNUb0RlbGV0ZTp7dHlwZToibGlzdCIsbWVtYmVyOnt9fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntVbnByb2Nlc3NlZElkZW50aXR5SWRzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxFcnJvckNvZGU6e319fX19fX0sRGVsZXRlSWRlbnRpdHlQb29sOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e319fX0sRGVzY3JpYmVJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eUlkIl0sbWVtYmVyczp7SWRlbnRpdHlJZDp7fX19LG91dHB1dDp7c2hhcGU6IlN2In19LERlc2NyaWJlSWRlbnRpdHlQb29sOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e319fSxvdXRwdXQ6e3NoYXBlOiJTayJ9fSxHZXRDcmVkZW50aWFsc0ZvcklkZW50aXR5OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5SWQiXSxtZW1iZXJzOntJZGVudGl0eUlkOnt9LExvZ2luczp7c2hhcGU6IlMxMCJ9LEN1c3RvbVJvbGVBcm46e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxDcmVkZW50aWFsczp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntBY2Nlc3NLZXlJZDp7fSxTZWNyZXRLZXk6e30sU2Vzc2lvblRva2VuOnt9LEV4cGlyYXRpb246e3R5cGU6InRpbWVzdGFtcCJ9fX19fSxhdXRodHlwZToibm9uZSJ9LEdldElkOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIl0sbWVtYmVyczp7QWNjb3VudElkOnt9LElkZW50aXR5UG9vbElkOnt9LExvZ2luczp7c2hhcGU6IlMxMCJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5SWQ6e319fSxhdXRodHlwZToibm9uZSJ9LEdldElkZW50aXR5UG9vbFJvbGVzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sUm9sZXM6e3NoYXBlOiJTMWMifSxSb2xlTWFwcGluZ3M6e3NoYXBlOiJTMWUifX19fSxHZXRPcGVuSWRUb2tlbjp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eUlkIl0sbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxMb2dpbnM6e3NoYXBlOiJTMTAifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eUlkOnt9LFRva2VuOnt9fX0sYXV0aHR5cGU6Im5vbmUifSxHZXRPcGVuSWRUb2tlbkZvckRldmVsb3BlcklkZW50aXR5OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIiwiTG9naW5zIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlJZDp7fSxMb2dpbnM6e3NoYXBlOiJTMTAifSxQcmluY2lwYWxUYWdzOntzaGFwZToiUzFzIn0sVG9rZW5EdXJhdGlvbjp7dHlwZToibG9uZyJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sVG9rZW46e319fX0sR2V0UHJpbmNpcGFsVGFnQXR0cmlidXRlTWFwOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIiwiSWRlbnRpdHlQcm92aWRlck5hbWUiXSxtZW1iZXJzOntJZGVudGl0eVBvb2xJZDp7fSxJZGVudGl0eVByb3ZpZGVyTmFtZTp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eVBvb2xJZDp7fSxJZGVudGl0eVByb3ZpZGVyTmFtZTp7fSxVc2VEZWZhdWx0czp7dHlwZToiYm9vbGVhbiJ9LFByaW5jaXBhbFRhZ3M6e3NoYXBlOiJTMXMifX19fSxMaXN0SWRlbnRpdGllczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCIsIk1heFJlc3VsdHMiXSxtZW1iZXJzOntJZGVudGl0eVBvb2xJZDp7fSxNYXhSZXN1bHRzOnt0eXBlOiJpbnRlZ2VyIn0sTmV4dFRva2VuOnt9LEhpZGVEaXNhYmxlZDp7dHlwZToiYm9vbGVhbiJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LElkZW50aXRpZXM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7c2hhcGU6IlN2In19LE5leHRUb2tlbjp7fX19fSxMaXN0SWRlbnRpdHlQb29sczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJNYXhSZXN1bHRzIl0sbWVtYmVyczp7TWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9LE5leHRUb2tlbjp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eVBvb2xzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlQb29sTmFtZTp7fX19fSxOZXh0VG9rZW46e319fX0sTGlzdFRhZ3NGb3JSZXNvdXJjZTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJSZXNvdXJjZUFybiJdLG1lbWJlcnM6e1Jlc291cmNlQXJuOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e1RhZ3M6e3NoYXBlOiJTaCJ9fX19LExvb2t1cERldmVsb3BlcklkZW50aXR5OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlJZDp7fSxEZXZlbG9wZXJVc2VySWRlbnRpZmllcjp7fSxNYXhSZXN1bHRzOnt0eXBlOiJpbnRlZ2VyIn0sTmV4dFRva2VuOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sRGV2ZWxvcGVyVXNlcklkZW50aWZpZXJMaXN0Ont0eXBlOiJsaXN0IixtZW1iZXI6e319LE5leHRUb2tlbjp7fX19fSxNZXJnZURldmVsb3BlcklkZW50aXRpZXM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiU291cmNlVXNlcklkZW50aWZpZXIiLCJEZXN0aW5hdGlvblVzZXJJZGVudGlmaWVyIiwiRGV2ZWxvcGVyUHJvdmlkZXJOYW1lIiwiSWRlbnRpdHlQb29sSWQiXSxtZW1iZXJzOntTb3VyY2VVc2VySWRlbnRpZmllcjp7fSxEZXN0aW5hdGlvblVzZXJJZGVudGlmaWVyOnt9LERldmVsb3BlclByb3ZpZGVyTmFtZTp7fSxJZGVudGl0eVBvb2xJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eUlkOnt9fX19LFNldElkZW50aXR5UG9vbFJvbGVzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIiwiUm9sZXMiXSxtZW1iZXJzOntJZGVudGl0eVBvb2xJZDp7fSxSb2xlczp7c2hhcGU6IlMxYyJ9LFJvbGVNYXBwaW5nczp7c2hhcGU6IlMxZSJ9fX19LFNldFByaW5jaXBhbFRhZ0F0dHJpYnV0ZU1hcDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCIsIklkZW50aXR5UHJvdmlkZXJOYW1lIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlQcm92aWRlck5hbWU6e30sVXNlRGVmYXVsdHM6e3R5cGU6ImJvb2xlYW4ifSxQcmluY2lwYWxUYWdzOntzaGFwZToiUzFzIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlQcm92aWRlck5hbWU6e30sVXNlRGVmYXVsdHM6e3R5cGU6ImJvb2xlYW4ifSxQcmluY2lwYWxUYWdzOntzaGFwZToiUzFzIn19fX0sVGFnUmVzb3VyY2U6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiUmVzb3VyY2VBcm4iLCJUYWdzIl0sbWVtYmVyczp7UmVzb3VyY2VBcm46e30sVGFnczp7c2hhcGU6IlNoIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFVubGlua0RldmVsb3BlcklkZW50aXR5OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5SWQiLCJJZGVudGl0eVBvb2xJZCIsIkRldmVsb3BlclByb3ZpZGVyTmFtZSIsIkRldmVsb3BlclVzZXJJZGVudGlmaWVyIl0sbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxJZGVudGl0eVBvb2xJZDp7fSxEZXZlbG9wZXJQcm92aWRlck5hbWU6e30sRGV2ZWxvcGVyVXNlcklkZW50aWZpZXI6e319fX0sVW5saW5rSWRlbnRpdHk6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlJZCIsIkxvZ2lucyIsIkxvZ2luc1RvUmVtb3ZlIl0sbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxMb2dpbnM6e3NoYXBlOiJTMTAifSxMb2dpbnNUb1JlbW92ZTp7c2hhcGU6IlN3In19fSxhdXRodHlwZToibm9uZSJ9LFVudGFnUmVzb3VyY2U6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiUmVzb3VyY2VBcm4iLCJUYWdLZXlzIl0sbWVtYmVyczp7UmVzb3VyY2VBcm46e30sVGFnS2V5czp7dHlwZToibGlzdCIsbWVtYmVyOnt9fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sVXBkYXRlSWRlbnRpdHlQb29sOntpbnB1dDp7c2hhcGU6IlNrIn0sb3V0cHV0OntzaGFwZToiU2sifX19LHNoYXBlczp7UzU6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt9fSxTOTp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxTYjp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e1Byb3ZpZGVyTmFtZTp7fSxDbGllbnRJZDp7fSxTZXJ2ZXJTaWRlVG9rZW5DaGVjazp7dHlwZToiYm9vbGVhbiJ9fX19LFNnOnt0eXBlOiJsaXN0IixtZW1iZXI6e319LFNoOnt0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7fX0sU2s6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCIsIklkZW50aXR5UG9vbE5hbWUiLCJBbGxvd1VuYXV0aGVudGljYXRlZElkZW50aXRpZXMiXSxtZW1iZXJzOntJZGVudGl0eVBvb2xJZDp7fSxJZGVudGl0eVBvb2xOYW1lOnt9LEFsbG93VW5hdXRoZW50aWNhdGVkSWRlbnRpdGllczp7dHlwZToiYm9vbGVhbiJ9LEFsbG93Q2xhc3NpY0Zsb3c6e3R5cGU6ImJvb2xlYW4ifSxTdXBwb3J0ZWRMb2dpblByb3ZpZGVyczp7c2hhcGU6IlM1In0sRGV2ZWxvcGVyUHJvdmlkZXJOYW1lOnt9LE9wZW5JZENvbm5lY3RQcm92aWRlckFSTnM6e3NoYXBlOiJTOSJ9LENvZ25pdG9JZGVudGl0eVByb3ZpZGVyczp7c2hhcGU6IlNiIn0sU2FtbFByb3ZpZGVyQVJOczp7c2hhcGU6IlNnIn0sSWRlbnRpdHlQb29sVGFnczp7c2hhcGU6IlNoIn19fSxTdjp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eUlkOnt9LExvZ2luczp7c2hhcGU6IlN3In0sQ3JlYXRpb25EYXRlOnt0eXBlOiJ0aW1lc3RhbXAifSxMYXN0TW9kaWZpZWREYXRlOnt0eXBlOiJ0aW1lc3RhbXAifX19LFN3Ont0eXBlOiJsaXN0IixtZW1iZXI6e319LFMxMDp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e319LFMxYzp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e319LFMxZTp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJUeXBlIl0sbWVtYmVyczp7VHlwZTp7fSxBbWJpZ3VvdXNSb2xlUmVzb2x1dGlvbjp7fSxSdWxlc0NvbmZpZ3VyYXRpb246e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJSdWxlcyJdLG1lbWJlcnM6e1J1bGVzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJDbGFpbSIsIk1hdGNoVHlwZSIsIlZhbHVlIiwiUm9sZUFSTiJdLG1lbWJlcnM6e0NsYWltOnt9LE1hdGNoVHlwZTp7fSxWYWx1ZTp7fSxSb2xlQVJOOnt9fX19fX19fX0sUzFzOnt0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7fX19fX0se31dLDI6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e3BhZ2luYXRpb246e0xpc3RJZGVudGl0eVBvb2xzOntpbnB1dF90b2tlbjoiTmV4dFRva2VuIixsaW1pdF9rZXk6Ik1heFJlc3VsdHMiLG91dHB1dF90b2tlbjoiTmV4dFRva2VuIixyZXN1bHRfa2V5OiJJZGVudGl0eVBvb2xzIn19fX0se31dLDM6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e3ZlcnNpb246IjIuMCIsbWV0YWRhdGE6e2FwaVZlcnNpb246IjIwMTctMDItMTUiLGVuZHBvaW50UHJlZml4OiJjb25uZWN0Iixqc29uVmVyc2lvbjoiMS4wIixwcm90b2NvbDoianNvbiIsc2VydmljZUFiYnJldmlhdGlvbjoiQ29ubmVjdCIsc2VydmljZUZ1bGxOYW1lOiJBbWF6b25Db25uZWN0Q1RJU2VydmljZSIsc2lnbmF0dXJlVmVyc2lvbjoiIix0YXJnZXRQcmVmaXg6IkFtYXpvbkNvbm5lY3RDVElTZXJ2aWNlIix1aWQ6ImNvbm5lY3QtMjAxNy0wMi0xNSJ9LG9wZXJhdGlvbnM6e0FjY2VwdENvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxDbGVhckNvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29udGFjdElkIl0sbWVtYmVyczp7Y29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxDb21wbGV0ZUNvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29udGFjdElkIl0sbWVtYmVyczp7Y29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxDb25mZXJlbmNlQ29ubmVjdGlvbnM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxDcmVhdGVBZGRpdGlvbmFsQ29ubmVjdGlvbjp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbnRhY3RJZCIsImVuZHBvaW50Il0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxlbmRwb2ludDp7c2hhcGU6IlNlIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LENyZWF0ZU91dGJvdW5kQ29udGFjdDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImVuZHBvaW50Il0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGVuZHBvaW50OntzaGFwZToiU2UifSxxdWV1ZUFSTjp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sQ3JlYXRlVGFza0NvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiZW5kcG9pbnQiLCJuYW1lIl0sbWVtYmVyczp7ZW5kcG9pbnQ6e3NoYXBlOiJTZSJ9LHByZXZpb3VzQ29udGFjdElkOnt9LG5hbWU6e30sZGVzY3JpcHRpb246e30scmVmZXJlbmNlczp7c2hhcGU6IlNyIn0saWRlbXBvdGVuY3lUb2tlbjp7fSxzY2hlZHVsZWRUaW1lOnt0eXBlOiJsb25nIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7Y29udGFjdElkOnt9fX19LENyZWF0ZVRyYW5zcG9ydDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJ0cmFuc3BvcnRUeXBlIiwiYXV0aGVudGljYXRpb24iXSxtZW1iZXJzOnt0cmFuc3BvcnRUeXBlOnt9LHBhcnRpY2lwYW50SWQ6e30sY29udGFjdElkOnt9LHNvZnRwaG9uZUNsaWVudElkOnt9LGF1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt3ZWJTb2NrZXRUcmFuc3BvcnQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJ1cmwiLCJ0cmFuc3BvcnRMaWZlVGltZUluU2Vjb25kcyJdLG1lbWJlcnM6e3VybDp7fSx0cmFuc3BvcnRMaWZlVGltZUluU2Vjb25kczp7dHlwZToibG9uZyJ9LGV4cGlyeTp7fX19LGNoYXRUb2tlblRyYW5zcG9ydDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInBhcnRpY2lwYW50VG9rZW4iLCJleHBpcnkiXSxtZW1iZXJzOntwYXJ0aWNpcGFudFRva2VuOnt9LGV4cGlyeTp7fX19LHNvZnRwaG9uZVRyYW5zcG9ydDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInNvZnRwaG9uZU1lZGlhQ29ubmVjdGlvbnMiXSxtZW1iZXJzOntzb2Z0cGhvbmVNZWRpYUNvbm5lY3Rpb25zOnt0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJ1c2VybmFtZSIsImNyZWRlbnRpYWwiLCJ1cmxzIl0sbWVtYmVyczp7dXNlcm5hbWU6e30sY3JlZGVudGlhbDp7fSx1cmxzOnt0eXBlOiJsaXN0IixtZW1iZXI6e319fX19fX0sYWdlbnREaXNjb3ZlcnlUcmFuc3BvcnQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJwcmVzaWduZWRVcmwiXSxtZW1iZXJzOntwcmVzaWduZWRVcmw6e319fX19fSxEZXN0cm95Q29ubmVjdGlvbjp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbnRhY3RJZCIsImNvbm5lY3Rpb25JZCJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxjb250YWN0SWQ6e30sY29ubmVjdGlvbklkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxHZXRBZ2VudENvbmZpZ3VyYXRpb246e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJjb25maWd1cmF0aW9uIl0sbWVtYmVyczp7Y29uZmlndXJhdGlvbjp7c2hhcGU6IlMxaSJ9fX19LEdldEFnZW50UGVybWlzc2lvbnM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sbmV4dFRva2VuOnt9LG1heFJlc3VsdHM6e3R5cGU6ImludGVnZXIifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInBlcm1pc3Npb25zIl0sbWVtYmVyczp7cGVybWlzc2lvbnM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX0sbmV4dFRva2VuOnt9fX19LEdldEFnZW50U25hcHNob3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sbmV4dFRva2VuOnt9LHRpbWVvdXQ6e3R5cGU6ImxvbmcifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInNuYXBzaG90IiwibmV4dFRva2VuIl0sbWVtYmVyczp7c25hcHNob3Q6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJzdGF0ZSIsImNvbnRhY3RzIiwic25hcHNob3RUaW1lc3RhbXAiXSxtZW1iZXJzOntzdGF0ZTp7c2hhcGU6IlMyMSJ9LG5leHRTdGF0ZTp7c2hhcGU6IlMyMSJ9LGFnZW50QXZhaWxhYmlsaXR5U3RhdGU6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7c3RhdGU6e30sdGltZVN0YW1wOnt0eXBlOiJ0aW1lc3RhbXAifX19LGNvbnRhY3RzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJjb250YWN0SWQiLCJ0eXBlIiwic3RhdGUiLCJjb25uZWN0aW9ucyIsImF0dHJpYnV0ZXMiXSxtZW1iZXJzOntjb250YWN0SWQ6e30saW5pdGlhbENvbnRhY3RJZDp7fSx0eXBlOnt9LHN0YXRlOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsidHlwZSIsInRpbWVzdGFtcCJdLG1lbWJlcnM6e3R5cGU6e30sdGltZXN0YW1wOnt0eXBlOiJ0aW1lc3RhbXAifX19LHF1ZXVlOntzaGFwZToiU2sifSxxdWV1ZVRpbWVzdGFtcDp7dHlwZToidGltZXN0YW1wIn0sY29ubmVjdGlvbnM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImNvbm5lY3Rpb25JZCIsInN0YXRlIiwidHlwZSIsImluaXRpYWwiXSxtZW1iZXJzOntjb25uZWN0aW9uSWQ6e30sZW5kcG9pbnQ6e3NoYXBlOiJTZSJ9LHN0YXRlOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsidHlwZSIsInRpbWVzdGFtcCJdLG1lbWJlcnM6e3R5cGU6e30sdGltZXN0YW1wOnt0eXBlOiJ0aW1lc3RhbXAifX19LHR5cGU6e30saW5pdGlhbDp7dHlwZToiYm9vbGVhbiJ9LHNvZnRwaG9uZU1lZGlhSW5mbzp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntjYWxsVHlwZTp7fSxhdXRvQWNjZXB0Ont0eXBlOiJib29sZWFuIn0sbWVkaWFMZWdDb250ZXh0VG9rZW46e30sY2FsbENvbnRleHRUb2tlbjp7fSxjYWxsQ29uZmlnSnNvbjp7fX19LGNoYXRNZWRpYUluZm86e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7Y2hhdEF1dG9BY2NlcHQ6e3R5cGU6ImJvb2xlYW4ifSxjb25uZWN0aW9uRGF0YTp7fSxjdXN0b21lck5hbWU6e319fSxtb25pdG9yaW5nSW5mbzp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnthZ2VudDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnthZ2VudE5hbWU6e319fSxqb2luVGltZVN0YW1wOnt0eXBlOiJ0aW1lc3RhbXAifX19LG11dGU6e3R5cGU6ImJvb2xlYW4ifSxmb3JjZWRNdXRlOnt0eXBlOiJib29sZWFuIn0scXVpY2tDb25uZWN0TmFtZTp7fSxtb25pdG9yQ2FwYWJpbGl0aWVzOnt0eXBlOiJsaXN0IixtZW1iZXI6e319LG1vbml0b3JTdGF0dXM6e319fX0sYXR0cmlidXRlczp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJuYW1lIl0sbWVtYmVyczp7bmFtZTp7fSx2YWx1ZTp7fX19fSxjb250YWN0RHVyYXRpb246e30sbmFtZTp7fSxkZXNjcmlwdGlvbjp7fSxyZWZlcmVuY2VzOntzaGFwZToiU3IifSxpbml0aWF0aW9uTWV0aG9kOnt9LGNvbnRhY3RGZWF0dXJlczp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnthdHRhY2htZW50c0VuYWJsZWQ6e3R5cGU6ImJvb2xlYW4ifSxtZXNzYWdpbmdNYXJrZG93bkVuYWJsZWQ6e3R5cGU6ImJvb2xlYW4ifSxtdWx0aVBhcnR5Q29uZmVyZW5jZUVuYWJsZWQ6e3R5cGU6ImJvb2xlYW4ifSxzY3JlZW5SZWNvcmRpbmdFbmFibGVkOnt0eXBlOiJib29sZWFuIn0sc2NyZWVuUmVjb3JkaW5nU3RhdGU6e30sc2NyZWVuUmVjb3JkaW5nQ29uZmlnOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e3NjcmVlblJlY29yZGluZ0VuYWJsZWQ6e3R5cGU6ImJvb2xlYW4ifSxzY3JlZW5SZWNvcmRpbmdTdGF0ZTp7fX19fX0sY2hhbm5lbENvbnRleHQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7c2NoZWR1bGVkVGltZTp7dHlwZToibG9uZyJ9LHRhc2tUZW1wbGF0ZUlkOnt9LHRhc2tUZW1wbGF0ZVZlcnNpb246e3R5cGU6ImludGVnZXIifX19LHNlZ21lbnRBdHRyaWJ1dGVzOnt0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntWYWx1ZVN0cmluZzp7fX19fX19fSxzbmFwc2hvdFRpbWVzdGFtcDp7dHlwZToidGltZXN0YW1wIn19fSxuZXh0VG9rZW46e319fX0sR2V0QWdlbnRTdGF0ZXM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sbmV4dFRva2VuOnt9LG1heFJlc3VsdHM6e3R5cGU6ImludGVnZXIifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInN0YXRlcyJdLG1lbWJlcnM6e3N0YXRlczp7dHlwZToibGlzdCIsbWVtYmVyOntzaGFwZToiUzIxIn19LG5leHRUb2tlbjp7fX19fSxHZXREaWFsYWJsZUNvdW50cnlDb2Rlczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxuZXh0VG9rZW46e30sbWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY291bnRyeUNvZGVzIl0sbWVtYmVyczp7Y291bnRyeUNvZGVzOnt0eXBlOiJsaXN0IixtZW1iZXI6e319LG5leHRUb2tlbjp7fX19fSxHZXRFbmRwb2ludHM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJxdWV1ZUFSTnMiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0scXVldWVBUk5zOnt0eXBlOiJsaXN0IixtZW1iZXI6e319LG5leHRUb2tlbjp7fSxtYXhSZXN1bHRzOnt0eXBlOiJpbnRlZ2VyIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7ZW5kcG9pbnRzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3NoYXBlOiJTZSJ9fSxuZXh0VG9rZW46e319fX0sR2V0TmV3QXV0aFRva2VuOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwicmVmcmVzaFRva2VuIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LHJlZnJlc2hUb2tlbjp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntuZXdBdXRoVG9rZW46e30sZXhwaXJhdGlvbkRhdGVUaW1lOnt0eXBlOiJ0aW1lc3RhbXAifX19fSxHZXRSb3V0aW5nUHJvZmlsZVF1ZXVlczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsInJvdXRpbmdQcm9maWxlQVJOIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LHJvdXRpbmdQcm9maWxlQVJOOnt9LG5leHRUb2tlbjp7fSxtYXhSZXN1bHRzOnt0eXBlOiJpbnRlZ2VyIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJxdWV1ZXMiXSxtZW1iZXJzOntxdWV1ZXM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7c2hhcGU6IlNrIn19LG5leHRUb2tlbjp7fX19fSxIb2xkQ29ubmVjdGlvbjp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbnRhY3RJZCIsImNvbm5lY3Rpb25JZCJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxjb250YWN0SWQ6e30sY29ubmVjdGlvbklkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxNdXRlUGFydGljaXBhbnQ6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJjb25uZWN0aW9uSWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNvbm5lY3Rpb25JZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sTm90aWZ5Q29udGFjdElzc3VlOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxpc3N1ZUNvZGU6e30sZGVzY3JpcHRpb246e30sY2xpZW50TG9nczp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sUHV0QWdlbnRTdGF0ZTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsInN0YXRlIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LHN0YXRlOntzaGFwZToiUzIxIn0sZW5xdWV1ZU5leHRTdGF0ZTp7dHlwZToiYm9vbGVhbiJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxSZWplY3RDb250YWN0OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImNvbnRhY3RJZCJdLG1lbWJlcnM6e2NvbnRhY3RJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sUmVzdW1lQ29ubmVjdGlvbjp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbnRhY3RJZCIsImNvbm5lY3Rpb25JZCJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxjb250YWN0SWQ6e30sY29ubmVjdGlvbklkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxTZW5kQ2xpZW50TG9nczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImxvZ0V2ZW50cyJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxsb2dFdmVudHM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt0aW1lc3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9LGNvbXBvbmVudDp7fSxtZXNzYWdlOnt9fX19fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxTZW5kRGlnaXRzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwiY29ubmVjdGlvbklkIiwiZGlnaXRzIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjb25uZWN0aW9uSWQ6e30sZGlnaXRzOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxTZW5kU29mdHBob25lQ2FsbE1ldHJpY3M6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJzb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjY3BWZXJzaW9uOnt9LHNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3M6e3NoYXBlOiJTNDEifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sU2VuZFNvZnRwaG9uZUNhbGxSZXBvcnQ6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJyZXBvcnQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNjcFZlcnNpb246e30scmVwb3J0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2NhbGxTdGFydFRpbWU6e3R5cGU6InRpbWVzdGFtcCJ9LGNhbGxFbmRUaW1lOnt0eXBlOiJ0aW1lc3RhbXAifSxzb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzOntzaGFwZToiUzQxIn0sZ3VtVGltZU1pbGxpczp7dHlwZToibG9uZyJ9LGluaXRpYWxpemF0aW9uVGltZU1pbGxpczp7dHlwZToibG9uZyJ9LGljZUNvbGxlY3Rpb25UaW1lTWlsbGlzOnt0eXBlOiJsb25nIn0sc2lnbmFsbGluZ0Nvbm5lY3RUaW1lTWlsbGlzOnt0eXBlOiJsb25nIn0saGFuZHNoYWtlVGltZU1pbGxpczp7dHlwZToibG9uZyJ9LHByZVRhbGtUaW1lTWlsbGlzOnt0eXBlOiJsb25nIn0sdGFsa1RpbWVNaWxsaXM6e3R5cGU6ImxvbmcifSxjbGVhbnVwVGltZU1pbGxpczp7dHlwZToibG9uZyJ9LGljZUNvbGxlY3Rpb25GYWlsdXJlOnt0eXBlOiJib29sZWFuIn0sc2lnbmFsbGluZ0Nvbm5lY3Rpb25GYWlsdXJlOnt0eXBlOiJib29sZWFuIn0saGFuZHNoYWtlRmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9LGd1bU90aGVyRmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9LGd1bVRpbWVvdXRGYWlsdXJlOnt0eXBlOiJib29sZWFuIn0sY3JlYXRlT2ZmZXJGYWlsdXJlOnt0eXBlOiJib29sZWFuIn0sc2V0TG9jYWxEZXNjcmlwdGlvbkZhaWx1cmU6e3R5cGU6ImJvb2xlYW4ifSx1c2VyQnVzeUZhaWx1cmU6e3R5cGU6ImJvb2xlYW4ifSxpbnZhbGlkUmVtb3RlU0RQRmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9LG5vUmVtb3RlSWNlQ2FuZGlkYXRlRmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9LHNldFJlbW90ZURlc2NyaXB0aW9uRmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9fX19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFRvZ2dsZUFjdGl2ZUNvbm5lY3Rpb25zOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwiY29ubmVjdGlvbklkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjb25uZWN0aW9uSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFVubXV0ZVBhcnRpY2lwYW50OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwiY29ubmVjdGlvbklkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjb25uZWN0aW9uSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFVwZGF0ZUFnZW50Q29uZmlndXJhdGlvbjp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbmZpZ3VyYXRpb24iXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29uZmlndXJhdGlvbjp7c2hhcGU6IlMxaSJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxVcGRhdGVNb25pdG9yUGFydGljaXBhbnRTdGF0ZTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJjb250YWN0SWQiLCJ0YXJnZXRNb25pdG9yTW9kZSJdLG1lbWJlcnM6e2NvbnRhY3RJZDp7fSx0YXJnZXRNb25pdG9yTW9kZTp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX19LHNoYXBlczp7UzI6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7YWdlbnRBUk46e30sYXV0aFRva2VuOnt9fX0sU2U6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJ0eXBlIl0sbWVtYmVyczp7ZW5kcG9pbnRBUk46e30sdHlwZTp7fSxuYW1lOnt9LHBob25lTnVtYmVyOnt9LGFnZW50TG9naW46e30scXVldWU6e3NoYXBlOiJTayJ9fX0sU2s6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7cXVldWVBUk46e30sbmFtZTp7fX19LFNyOnt0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInZhbHVlIiwidHlwZSJdLG1lbWJlcnM6e3ZhbHVlOnt9LHR5cGU6e319fX0sUzFpOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsibmFtZSIsInNvZnRwaG9uZUVuYWJsZWQiLCJzb2Z0cGhvbmVBdXRvQWNjZXB0IiwiZXh0ZW5zaW9uIiwicm91dGluZ1Byb2ZpbGUiXSxtZW1iZXJzOntuYW1lOnt9LHVzZXJuYW1lOnt9LHNvZnRwaG9uZUVuYWJsZWQ6e3R5cGU6ImJvb2xlYW4ifSxzb2Z0cGhvbmVBdXRvQWNjZXB0Ont0eXBlOiJib29sZWFuIn0sZXh0ZW5zaW9uOnt9LHJvdXRpbmdQcm9maWxlOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e25hbWU6e30scm91dGluZ1Byb2ZpbGVBUk46e30sZGVmYXVsdE91dGJvdW5kUXVldWU6e3NoYXBlOiJTayJ9LGNoYW5uZWxDb25jdXJyZW5jeU1hcDp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e3R5cGU6ImxvbmcifX19fSxhZ2VudFByZWZlcmVuY2VzOnt0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7fX0sYWdlbnRBUk46e319fSxTMjE6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJ0eXBlIiwibmFtZSJdLG1lbWJlcnM6e2FnZW50U3RhdGVBUk46e30sdHlwZTp7fSxuYW1lOnt9LHN0YXJ0VGltZXN0YW1wOnt0eXBlOiJ0aW1lc3RhbXAifX19LFM0MTp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e3RpbWVzdGFtcDp7dHlwZToidGltZXN0YW1wIn0sc29mdHBob25lU3RyZWFtVHlwZTp7fSxwYWNrZXRDb3VudDp7dHlwZToibG9uZyJ9LHBhY2tldHNMb3N0Ont0eXBlOiJsb25nIn0sYXVkaW9MZXZlbDp7dHlwZToiZG91YmxlIn0saml0dGVyQnVmZmVyTWlsbGlzOnt0eXBlOiJsb25nIn0scm91bmRUcmlwVGltZU1pbGxpczp7dHlwZToibG9uZyJ9fX19fX19LHt9XSw0OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXthY206e25hbWU6IkFDTSIsY29yczohMH0sYXBpZ2F0ZXdheTp7bmFtZToiQVBJR2F0ZXdheSIsY29yczohMH0sYXBwbGljYXRpb25hdXRvc2NhbGluZzp7cHJlZml4OiJhcHBsaWNhdGlvbi1hdXRvc2NhbGluZyIsbmFtZToiQXBwbGljYXRpb25BdXRvU2NhbGluZyIsY29yczohMH0sYXBwc3RyZWFtOntuYW1lOiJBcHBTdHJlYW0ifSxhdXRvc2NhbGluZzp7bmFtZToiQXV0b1NjYWxpbmciLGNvcnM6ITB9LGJhdGNoOntuYW1lOiJCYXRjaCJ9LGJ1ZGdldHM6e25hbWU6IkJ1ZGdldHMifSxjbG91ZGRpcmVjdG9yeTp7bmFtZToiQ2xvdWREaXJlY3RvcnkiLHZlcnNpb25zOlsiMjAxNi0wNS0xMCoiXX0sY2xvdWRmb3JtYXRpb246e25hbWU6IkNsb3VkRm9ybWF0aW9uIixjb3JzOiEwfSxjbG91ZGZyb250OntuYW1lOiJDbG91ZEZyb250Iix2ZXJzaW9uczpbIjIwMTMtMDUtMTIqIiwiMjAxMy0xMS0xMSoiLCIyMDE0LTA1LTMxKiIsIjIwMTQtMTAtMjEqIiwiMjAxNC0xMS0wNioiLCIyMDE1LTA0LTE3KiIsIjIwMTUtMDctMjcqIiwiMjAxNS0wOS0xNyoiLCIyMDE2LTAxLTEzKiIsIjIwMTYtMDEtMjgqIiwiMjAxNi0wOC0wMSoiLCIyMDE2LTA4LTIwKiIsIjIwMTYtMDktMDcqIiwiMjAxNi0wOS0yOSoiLCIyMDE2LTExLTI1KiIsIjIwMTctMDMtMjUqIiwiMjAxNy0xMC0zMCoiLCIyMDE4LTA2LTE4KiIsIjIwMTgtMTEtMDUqIiwiMjAxOS0wMy0yNioiXSxjb3JzOiEwfSxjbG91ZGhzbTp7bmFtZToiQ2xvdWRIU00iLGNvcnM6ITB9LGNsb3Vkc2VhcmNoOntuYW1lOiJDbG91ZFNlYXJjaCJ9LGNsb3Vkc2VhcmNoZG9tYWluOntuYW1lOiJDbG91ZFNlYXJjaERvbWFpbiJ9LGNsb3VkdHJhaWw6e25hbWU6IkNsb3VkVHJhaWwiLGNvcnM6ITB9LGNsb3Vkd2F0Y2g6e3ByZWZpeDoibW9uaXRvcmluZyIsbmFtZToiQ2xvdWRXYXRjaCIsY29yczohMH0sY2xvdWR3YXRjaGV2ZW50czp7cHJlZml4OiJldmVudHMiLG5hbWU6IkNsb3VkV2F0Y2hFdmVudHMiLHZlcnNpb25zOlsiMjAxNC0wMi0wMyoiXSxjb3JzOiEwfSxjbG91ZHdhdGNobG9nczp7cHJlZml4OiJsb2dzIixuYW1lOiJDbG91ZFdhdGNoTG9ncyIsY29yczohMH0sY29kZWJ1aWxkOntuYW1lOiJDb2RlQnVpbGQiLGNvcnM6ITB9LGNvZGVjb21taXQ6e25hbWU6IkNvZGVDb21taXQiLGNvcnM6ITB9LGNvZGVkZXBsb3k6e25hbWU6IkNvZGVEZXBsb3kiLGNvcnM6ITB9LGNvZGVwaXBlbGluZTp7bmFtZToiQ29kZVBpcGVsaW5lIixjb3JzOiEwfSxjb2duaXRvaWRlbnRpdHk6e3ByZWZpeDoiY29nbml0by1pZGVudGl0eSIsbmFtZToiQ29nbml0b0lkZW50aXR5Iixjb3JzOiEwfSxjb2duaXRvaWRlbnRpdHlzZXJ2aWNlcHJvdmlkZXI6e3ByZWZpeDoiY29nbml0by1pZHAiLG5hbWU6IkNvZ25pdG9JZGVudGl0eVNlcnZpY2VQcm92aWRlciIsY29yczohMH0sY29nbml0b3N5bmM6e3ByZWZpeDoiY29nbml0by1zeW5jIixuYW1lOiJDb2duaXRvU3luYyIsY29yczohMH0sY29uZmlnc2VydmljZTp7cHJlZml4OiJjb25maWciLG5hbWU6IkNvbmZpZ1NlcnZpY2UiLGNvcnM6ITB9LGNvbm5lY3Q6e25hbWU6IkNvbm5lY3QiLGNvcnM6ITB9LGN1cjp7bmFtZToiQ1VSIixjb3JzOiEwfSxkYXRhcGlwZWxpbmU6e25hbWU6IkRhdGFQaXBlbGluZSJ9LGRldmljZWZhcm06e25hbWU6IkRldmljZUZhcm0iLGNvcnM6ITB9LGRpcmVjdGNvbm5lY3Q6e25hbWU6IkRpcmVjdENvbm5lY3QiLGNvcnM6ITB9LGRpcmVjdG9yeXNlcnZpY2U6e3ByZWZpeDoiZHMiLG5hbWU6IkRpcmVjdG9yeVNlcnZpY2UifSxkaXNjb3Zlcnk6e25hbWU6IkRpc2NvdmVyeSJ9LGRtczp7bmFtZToiRE1TIn0sZHluYW1vZGI6e25hbWU6IkR5bmFtb0RCIixjb3JzOiEwfSxkeW5hbW9kYnN0cmVhbXM6e3ByZWZpeDoic3RyZWFtcy5keW5hbW9kYiIsbmFtZToiRHluYW1vREJTdHJlYW1zIixjb3JzOiEwfSxlYzI6e25hbWU6IkVDMiIsdmVyc2lvbnM6WyIyMDEzLTA2LTE1KiIsIjIwMTMtMTAtMTUqIiwiMjAxNC0wMi0wMSoiLCIyMDE0LTA1LTAxKiIsIjIwMTQtMDYtMTUqIiwiMjAxNC0wOS0wMSoiLCIyMDE0LTEwLTAxKiIsIjIwMTUtMDMtMDEqIiwiMjAxNS0wNC0xNSoiLCIyMDE1LTEwLTAxKiIsIjIwMTYtMDQtMDEqIiwiMjAxNi0wOS0xNSoiXSxjb3JzOiEwfSxlY3I6e25hbWU6IkVDUiIsY29yczohMH0sZWNzOntuYW1lOiJFQ1MiLGNvcnM6ITB9LGVmczp7cHJlZml4OiJlbGFzdGljZmlsZXN5c3RlbSIsbmFtZToiRUZTIixjb3JzOiEwfSxlbGFzdGljYWNoZTp7bmFtZToiRWxhc3RpQ2FjaGUiLHZlcnNpb25zOlsiMjAxMi0xMS0xNSoiLCIyMDE0LTAzLTI0KiIsIjIwMTQtMDctMTUqIiwiMjAxNC0wOS0zMCoiXSxjb3JzOiEwfSxlbGFzdGljYmVhbnN0YWxrOntuYW1lOiJFbGFzdGljQmVhbnN0YWxrIixjb3JzOiEwfSxlbGI6e3ByZWZpeDoiZWxhc3RpY2xvYWRiYWxhbmNpbmciLG5hbWU6IkVMQiIsY29yczohMH0sZWxidjI6e3ByZWZpeDoiZWxhc3RpY2xvYWRiYWxhbmNpbmd2MiIsbmFtZToiRUxCdjIiLGNvcnM6ITB9LGVtcjp7cHJlZml4OiJlbGFzdGljbWFwcmVkdWNlIixuYW1lOiJFTVIiLGNvcnM6ITB9LGVzOntuYW1lOiJFUyJ9LGVsYXN0aWN0cmFuc2NvZGVyOntuYW1lOiJFbGFzdGljVHJhbnNjb2RlciIsY29yczohMH0sZmlyZWhvc2U6e25hbWU6IkZpcmVob3NlIixjb3JzOiEwfSxnYW1lbGlmdDp7bmFtZToiR2FtZUxpZnQiLGNvcnM6ITB9LGdsYWNpZXI6e25hbWU6IkdsYWNpZXIifSxoZWFsdGg6e25hbWU6IkhlYWx0aCJ9LGlhbTp7bmFtZToiSUFNIixjb3JzOiEwfSxpbXBvcnRleHBvcnQ6e25hbWU6IkltcG9ydEV4cG9ydCJ9LGluc3BlY3Rvcjp7bmFtZToiSW5zcGVjdG9yIix2ZXJzaW9uczpbIjIwMTUtMDgtMTgqIl0sY29yczohMH0saW90OntuYW1lOiJJb3QiLGNvcnM6ITB9LGlvdGRhdGE6e3ByZWZpeDoiaW90LWRhdGEiLG5hbWU6IklvdERhdGEiLGNvcnM6ITB9LGtpbmVzaXM6e25hbWU6IktpbmVzaXMiLGNvcnM6ITB9LGtpbmVzaXNhbmFseXRpY3M6e25hbWU6IktpbmVzaXNBbmFseXRpY3MifSxrbXM6e25hbWU6IktNUyIsY29yczohMH0sbGFtYmRhOntuYW1lOiJMYW1iZGEiLGNvcnM6ITB9LGxleHJ1bnRpbWU6e3ByZWZpeDoicnVudGltZS5sZXgiLG5hbWU6IkxleFJ1bnRpbWUiLGNvcnM6ITB9LGxpZ2h0c2FpbDp7bmFtZToiTGlnaHRzYWlsIn0sbWFjaGluZWxlYXJuaW5nOntuYW1lOiJNYWNoaW5lTGVhcm5pbmciLGNvcnM6ITB9LG1hcmtldHBsYWNlY29tbWVyY2VhbmFseXRpY3M6e25hbWU6Ik1hcmtldHBsYWNlQ29tbWVyY2VBbmFseXRpY3MiLGNvcnM6ITB9LG1hcmtldHBsYWNlbWV0ZXJpbmc6e3ByZWZpeDoibWV0ZXJpbmdtYXJrZXRwbGFjZSIsbmFtZToiTWFya2V0cGxhY2VNZXRlcmluZyJ9LG10dXJrOntwcmVmaXg6Im10dXJrLXJlcXVlc3RlciIsbmFtZToiTVR1cmsiLGNvcnM6ITB9LG1vYmlsZWFuYWx5dGljczp7bmFtZToiTW9iaWxlQW5hbHl0aWNzIixjb3JzOiEwfSxvcHN3b3Jrczp7bmFtZToiT3BzV29ya3MiLGNvcnM6ITB9LG9wc3dvcmtzY206e25hbWU6Ik9wc1dvcmtzQ00ifSxvcmdhbml6YXRpb25zOntuYW1lOiJPcmdhbml6YXRpb25zIn0scGlucG9pbnQ6e25hbWU6IlBpbnBvaW50In0scG9sbHk6e25hbWU6IlBvbGx5Iixjb3JzOiEwfSxyZHM6e25hbWU6IlJEUyIsdmVyc2lvbnM6WyIyMDE0LTA5LTAxKiJdLGNvcnM6ITB9LHJlZHNoaWZ0OntuYW1lOiJSZWRzaGlmdCIsY29yczohMH0scmVrb2duaXRpb246e25hbWU6IlJla29nbml0aW9uIixjb3JzOiEwfSxyZXNvdXJjZWdyb3Vwc3RhZ2dpbmdhcGk6e25hbWU6IlJlc291cmNlR3JvdXBzVGFnZ2luZ0FQSSJ9LHJvdXRlNTM6e25hbWU6IlJvdXRlNTMiLGNvcnM6ITB9LHJvdXRlNTNkb21haW5zOntuYW1lOiJSb3V0ZTUzRG9tYWlucyIsY29yczohMH0sczM6e25hbWU6IlMzIixkdWFsc3RhY2tBdmFpbGFibGU6ITAsY29yczohMH0sczNjb250cm9sOntuYW1lOiJTM0NvbnRyb2wiLGR1YWxzdGFja0F2YWlsYWJsZTohMCx4bWxOb0RlZmF1bHRMaXN0czohMH0sc2VydmljZWNhdGFsb2c6e25hbWU6IlNlcnZpY2VDYXRhbG9nIixjb3JzOiEwfSxzZXM6e3ByZWZpeDoiZW1haWwiLG5hbWU6IlNFUyIsY29yczohMH0sc2hpZWxkOntuYW1lOiJTaGllbGQifSxzaW1wbGVkYjp7cHJlZml4OiJzZGIiLG5hbWU6IlNpbXBsZURCIn0sc21zOntuYW1lOiJTTVMifSxzbm93YmFsbDp7bmFtZToiU25vd2JhbGwifSxzbnM6e25hbWU6IlNOUyIsY29yczohMH0sc3FzOntuYW1lOiJTUVMiLGNvcnM6ITB9LHNzbTp7bmFtZToiU1NNIixjb3JzOiEwfSxzdG9yYWdlZ2F0ZXdheTp7bmFtZToiU3RvcmFnZUdhdGV3YXkiLGNvcnM6ITB9LHN0ZXBmdW5jdGlvbnM6e3ByZWZpeDoic3RhdGVzIixuYW1lOiJTdGVwRnVuY3Rpb25zIn0sc3RzOntuYW1lOiJTVFMiLGNvcnM6ITB9LHN1cHBvcnQ6e25hbWU6IlN1cHBvcnQifSxzd2Y6e25hbWU6IlNXRiJ9LHhyYXk6e25hbWU6IlhSYXkiLGNvcnM6ITB9LHdhZjp7bmFtZToiV0FGIixjb3JzOiEwfSx3YWZyZWdpb25hbDp7cHJlZml4OiJ3YWYtcmVnaW9uYWwiLG5hbWU6IldBRlJlZ2lvbmFsIn0sd29ya2RvY3M6e25hbWU6IldvcmtEb2NzIixjb3JzOiEwfSx3b3Jrc3BhY2VzOntuYW1lOiJXb3JrU3BhY2VzIn0sY29kZXN0YXI6e25hbWU6IkNvZGVTdGFyIn0sbGV4bW9kZWxidWlsZGluZ3NlcnZpY2U6e3ByZWZpeDoibGV4LW1vZGVscyIsbmFtZToiTGV4TW9kZWxCdWlsZGluZ1NlcnZpY2UiLGNvcnM6ITB9LG1hcmtldHBsYWNlZW50aXRsZW1lbnRzZXJ2aWNlOntwcmVmaXg6ImVudGl0bGVtZW50Lm1hcmtldHBsYWNlIixuYW1lOiJNYXJrZXRwbGFjZUVudGl0bGVtZW50U2VydmljZSJ9LGF0aGVuYTp7bmFtZToiQXRoZW5hIixjb3JzOiEwfSxncmVlbmdyYXNzOntuYW1lOiJHcmVlbmdyYXNzIn0sZGF4OntuYW1lOiJEQVgifSxtaWdyYXRpb25odWI6e3ByZWZpeDoiQVdTTWlncmF0aW9uSHViIixuYW1lOiJNaWdyYXRpb25IdWIifSxjbG91ZGhzbXYyOntuYW1lOiJDbG91ZEhTTVYyIixjb3JzOiEwfSxnbHVlOntuYW1lOiJHbHVlIn0sbW9iaWxlOntuYW1lOiJNb2JpbGUifSxwcmljaW5nOntuYW1lOiJQcmljaW5nIixjb3JzOiEwfSxjb3N0ZXhwbG9yZXI6e3ByZWZpeDoiY2UiLG5hbWU6IkNvc3RFeHBsb3JlciIsY29yczohMH0sbWVkaWFjb252ZXJ0OntuYW1lOiJNZWRpYUNvbnZlcnQifSxtZWRpYWxpdmU6e25hbWU6Ik1lZGlhTGl2ZSJ9LG1lZGlhcGFja2FnZTp7bmFtZToiTWVkaWFQYWNrYWdlIn0sbWVkaWFzdG9yZTp7bmFtZToiTWVkaWFTdG9yZSJ9LG1lZGlhc3RvcmVkYXRhOntwcmVmaXg6Im1lZGlhc3RvcmUtZGF0YSIsbmFtZToiTWVkaWFTdG9yZURhdGEiLGNvcnM6ITB9LGFwcHN5bmM6e25hbWU6IkFwcFN5bmMifSxndWFyZGR1dHk6e25hbWU6Ikd1YXJkRHV0eSJ9LG1xOntuYW1lOiJNUSJ9LGNvbXByZWhlbmQ6e25hbWU6IkNvbXByZWhlbmQiLGNvcnM6ITB9LGlvdGpvYnNkYXRhcGxhbmU6e3ByZWZpeDoiaW90LWpvYnMtZGF0YSIsbmFtZToiSW9USm9ic0RhdGFQbGFuZSJ9LGtpbmVzaXN2aWRlb2FyY2hpdmVkbWVkaWE6e3ByZWZpeDoia2luZXNpcy12aWRlby1hcmNoaXZlZC1tZWRpYSIsbmFtZToiS2luZXNpc1ZpZGVvQXJjaGl2ZWRNZWRpYSIsY29yczohMH0sa2luZXNpc3ZpZGVvbWVkaWE6e3ByZWZpeDoia2luZXNpcy12aWRlby1tZWRpYSIsbmFtZToiS2luZXNpc1ZpZGVvTWVkaWEiLGNvcnM6ITB9LGtpbmVzaXN2aWRlbzp7bmFtZToiS2luZXNpc1ZpZGVvIixjb3JzOiEwfSxzYWdlbWFrZXJydW50aW1lOntwcmVmaXg6InJ1bnRpbWUuc2FnZW1ha2VyIixuYW1lOiJTYWdlTWFrZXJSdW50aW1lIn0sc2FnZW1ha2VyOntuYW1lOiJTYWdlTWFrZXIifSx0cmFuc2xhdGU6e25hbWU6IlRyYW5zbGF0ZSIsY29yczohMH0scmVzb3VyY2Vncm91cHM6e3ByZWZpeDoicmVzb3VyY2UtZ3JvdXBzIixuYW1lOiJSZXNvdXJjZUdyb3VwcyIsY29yczohMH0sYWxleGFmb3JidXNpbmVzczp7bmFtZToiQWxleGFGb3JCdXNpbmVzcyJ9LGNsb3VkOTp7bmFtZToiQ2xvdWQ5In0sc2VydmVybGVzc2FwcGxpY2F0aW9ucmVwb3NpdG9yeTp7cHJlZml4OiJzZXJ2ZXJsZXNzcmVwbyIsbmFtZToiU2VydmVybGVzc0FwcGxpY2F0aW9uUmVwb3NpdG9yeSJ9LHNlcnZpY2VkaXNjb3Zlcnk6e25hbWU6IlNlcnZpY2VEaXNjb3ZlcnkifSx3b3JrbWFpbDp7bmFtZToiV29ya01haWwifSxhdXRvc2NhbGluZ3BsYW5zOntwcmVmaXg6ImF1dG9zY2FsaW5nLXBsYW5zIixuYW1lOiJBdXRvU2NhbGluZ1BsYW5zIn0sdHJhbnNjcmliZXNlcnZpY2U6e3ByZWZpeDoidHJhbnNjcmliZSIsbmFtZToiVHJhbnNjcmliZVNlcnZpY2UifSxjb25uZWN0OntuYW1lOiJDb25uZWN0Iixjb3JzOiEwfSxhY21wY2E6e3ByZWZpeDoiYWNtLXBjYSIsbmFtZToiQUNNUENBIn0sZm1zOntuYW1lOiJGTVMifSxzZWNyZXRzbWFuYWdlcjp7bmFtZToiU2VjcmV0c01hbmFnZXIiLGNvcnM6ITB9LGlvdGFuYWx5dGljczp7bmFtZToiSW9UQW5hbHl0aWNzIixjb3JzOiEwfSxpb3QxY2xpY2tkZXZpY2Vzc2VydmljZTp7cHJlZml4OiJpb3QxY2xpY2stZGV2aWNlcyIsbmFtZToiSW9UMUNsaWNrRGV2aWNlc1NlcnZpY2UifSxpb3QxY2xpY2twcm9qZWN0czp7cHJlZml4OiJpb3QxY2xpY2stcHJvamVjdHMiLG5hbWU6IklvVDFDbGlja1Byb2plY3RzIn0scGk6e25hbWU6IlBJIn0sbmVwdHVuZTp7bmFtZToiTmVwdHVuZSJ9LG1lZGlhdGFpbG9yOntuYW1lOiJNZWRpYVRhaWxvciJ9LGVrczp7bmFtZToiRUtTIn0sbWFjaWU6e25hbWU6Ik1hY2llIn0sZGxtOntuYW1lOiJETE0ifSxzaWduZXI6e25hbWU6IlNpZ25lciJ9LGNoaW1lOntuYW1lOiJDaGltZSJ9LHBpbnBvaW50ZW1haWw6e3ByZWZpeDoicGlucG9pbnQtZW1haWwiLG5hbWU6IlBpbnBvaW50RW1haWwifSxyYW06e25hbWU6IlJBTSJ9LHJvdXRlNTNyZXNvbHZlcjp7bmFtZToiUm91dGU1M1Jlc29sdmVyIn0scGlucG9pbnRzbXN2b2ljZTp7cHJlZml4OiJzbXMtdm9pY2UiLG5hbWU6IlBpbnBvaW50U01TVm9pY2UifSxxdWlja3NpZ2h0OntuYW1lOiJRdWlja1NpZ2h0In0scmRzZGF0YXNlcnZpY2U6e3ByZWZpeDoicmRzLWRhdGEiLG5hbWU6IlJEU0RhdGFTZXJ2aWNlIn0sYW1wbGlmeTp7bmFtZToiQW1wbGlmeSJ9LGRhdGFzeW5jOntuYW1lOiJEYXRhU3luYyJ9LHJvYm9tYWtlcjp7bmFtZToiUm9ib01ha2VyIn0sdHJhbnNmZXI6e25hbWU6IlRyYW5zZmVyIn0sZ2xvYmFsYWNjZWxlcmF0b3I6e25hbWU6Ikdsb2JhbEFjY2VsZXJhdG9yIn0sY29tcHJlaGVuZG1lZGljYWw6e25hbWU6IkNvbXByZWhlbmRNZWRpY2FsIixjb3JzOiEwfSxraW5lc2lzYW5hbHl0aWNzdjI6e25hbWU6IktpbmVzaXNBbmFseXRpY3NWMiJ9LG1lZGlhY29ubmVjdDp7bmFtZToiTWVkaWFDb25uZWN0In0sZnN4OntuYW1lOiJGU3gifSxzZWN1cml0eWh1Yjp7bmFtZToiU2VjdXJpdHlIdWIifSxhcHBtZXNoOntuYW1lOiJBcHBNZXNoIix2ZXJzaW9uczpbIjIwMTgtMTAtMDEqIl19LGxpY2Vuc2VtYW5hZ2VyOntwcmVmaXg6ImxpY2Vuc2UtbWFuYWdlciIsbmFtZToiTGljZW5zZU1hbmFnZXIifSxrYWZrYTp7bmFtZToiS2Fma2EifSxhcGlnYXRld2F5bWFuYWdlbWVudGFwaTp7bmFtZToiQXBpR2F0ZXdheU1hbmFnZW1lbnRBcGkifSxhcGlnYXRld2F5djI6e25hbWU6IkFwaUdhdGV3YXlWMiJ9LGRvY2RiOntuYW1lOiJEb2NEQiJ9LGJhY2t1cDp7bmFtZToiQmFja3VwIn0sd29ya2xpbms6e25hbWU6IldvcmtMaW5rIn0sdGV4dHJhY3Q6e25hbWU6IlRleHRyYWN0In0sbWFuYWdlZGJsb2NrY2hhaW46e25hbWU6Ik1hbmFnZWRCbG9ja2NoYWluIn0sbWVkaWFwYWNrYWdldm9kOntwcmVmaXg6Im1lZGlhcGFja2FnZS12b2QiLG5hbWU6Ik1lZGlhUGFja2FnZVZvZCJ9LGdyb3VuZHN0YXRpb246e25hbWU6Ikdyb3VuZFN0YXRpb24ifSxpb3R0aGluZ3NncmFwaDp7bmFtZToiSW9UVGhpbmdzR3JhcGgifSxpb3RldmVudHM6e25hbWU6IklvVEV2ZW50cyJ9LGlvdGV2ZW50c2RhdGE6e3ByZWZpeDoiaW90ZXZlbnRzLWRhdGEiLG5hbWU6IklvVEV2ZW50c0RhdGEifSxwZXJzb25hbGl6ZTp7bmFtZToiUGVyc29uYWxpemUiLGNvcnM6ITB9LHBlcnNvbmFsaXplZXZlbnRzOntwcmVmaXg6InBlcnNvbmFsaXplLWV2ZW50cyIsbmFtZToiUGVyc29uYWxpemVFdmVudHMiLGNvcnM6ITB9LHBlcnNvbmFsaXplcnVudGltZTp7cHJlZml4OiJwZXJzb25hbGl6ZS1ydW50aW1lIixuYW1lOiJQZXJzb25hbGl6ZVJ1bnRpbWUiLGNvcnM6ITB9LGFwcGxpY2F0aW9uaW5zaWdodHM6e3ByZWZpeDoiYXBwbGljYXRpb24taW5zaWdodHMiLG5hbWU6IkFwcGxpY2F0aW9uSW5zaWdodHMifSxzZXJ2aWNlcXVvdGFzOntwcmVmaXg6InNlcnZpY2UtcXVvdGFzIixuYW1lOiJTZXJ2aWNlUXVvdGFzIn0sZWMyaW5zdGFuY2Vjb25uZWN0OntwcmVmaXg6ImVjMi1pbnN0YW5jZS1jb25uZWN0IixuYW1lOiJFQzJJbnN0YW5jZUNvbm5lY3QifSxldmVudGJyaWRnZTp7bmFtZToiRXZlbnRCcmlkZ2UifSxsYWtlZm9ybWF0aW9uOntuYW1lOiJMYWtlRm9ybWF0aW9uIn0sZm9yZWNhc3RzZXJ2aWNlOntwcmVmaXg6ImZvcmVjYXN0IixuYW1lOiJGb3JlY2FzdFNlcnZpY2UiLGNvcnM6ITB9LGZvcmVjYXN0cXVlcnlzZXJ2aWNlOntwcmVmaXg6ImZvcmVjYXN0cXVlcnkiLG5hbWU6IkZvcmVjYXN0UXVlcnlTZXJ2aWNlIixjb3JzOiEwfSxxbGRiOntuYW1lOiJRTERCIn0scWxkYnNlc3Npb246e3ByZWZpeDoicWxkYi1zZXNzaW9uIixuYW1lOiJRTERCU2Vzc2lvbiJ9LHdvcmttYWlsbWVzc2FnZWZsb3c6e25hbWU6IldvcmtNYWlsTWVzc2FnZUZsb3cifSxjb2Rlc3Rhcm5vdGlmaWNhdGlvbnM6e3ByZWZpeDoiY29kZXN0YXItbm90aWZpY2F0aW9ucyIsbmFtZToiQ29kZVN0YXJOb3RpZmljYXRpb25zIn0sc2F2aW5nc3BsYW5zOntuYW1lOiJTYXZpbmdzUGxhbnMifSxzc286e25hbWU6IlNTTyJ9LHNzb29pZGM6e3ByZWZpeDoic3NvLW9pZGMiLG5hbWU6IlNTT09JREMifSxtYXJrZXRwbGFjZWNhdGFsb2c6e3ByZWZpeDoibWFya2V0cGxhY2UtY2F0YWxvZyIsbmFtZToiTWFya2V0cGxhY2VDYXRhbG9nIixjb3JzOiEwfSxkYXRhZXhjaGFuZ2U6e25hbWU6IkRhdGFFeGNoYW5nZSJ9LHNlc3YyOntuYW1lOiJTRVNWMiJ9LG1pZ3JhdGlvbmh1YmNvbmZpZzp7cHJlZml4OiJtaWdyYXRpb25odWItY29uZmlnIixuYW1lOiJNaWdyYXRpb25IdWJDb25maWcifSxjb25uZWN0cGFydGljaXBhbnQ6e25hbWU6IkNvbm5lY3RQYXJ0aWNpcGFudCJ9LGFwcGNvbmZpZzp7bmFtZToiQXBwQ29uZmlnIn0saW90c2VjdXJldHVubmVsaW5nOntuYW1lOiJJb1RTZWN1cmVUdW5uZWxpbmcifSx3YWZ2Mjp7bmFtZToiV0FGVjIifSxlbGFzdGljaW5mZXJlbmNlOntwcmVmaXg6ImVsYXN0aWMtaW5mZXJlbmNlIixuYW1lOiJFbGFzdGljSW5mZXJlbmNlIn0saW1hZ2VidWlsZGVyOntuYW1lOiJJbWFnZWJ1aWxkZXIifSxzY2hlbWFzOntuYW1lOiJTY2hlbWFzIn0sYWNjZXNzYW5hbHl6ZXI6e25hbWU6IkFjY2Vzc0FuYWx5emVyIn0sY29kZWd1cnVyZXZpZXdlcjp7cHJlZml4OiJjb2RlZ3VydS1yZXZpZXdlciIsbmFtZToiQ29kZUd1cnVSZXZpZXdlciJ9LGNvZGVndXJ1cHJvZmlsZXI6e25hbWU6IkNvZGVHdXJ1UHJvZmlsZXIifSxjb21wdXRlb3B0aW1pemVyOntwcmVmaXg6ImNvbXB1dGUtb3B0aW1pemVyIixuYW1lOiJDb21wdXRlT3B0aW1pemVyIn0sZnJhdWRkZXRlY3Rvcjp7bmFtZToiRnJhdWREZXRlY3RvciJ9LGtlbmRyYTp7bmFtZToiS2VuZHJhIn0sbmV0d29ya21hbmFnZXI6e25hbWU6Ik5ldHdvcmtNYW5hZ2VyIn0sb3V0cG9zdHM6e25hbWU6Ik91dHBvc3RzIn0sYXVnbWVudGVkYWlydW50aW1lOntwcmVmaXg6InNhZ2VtYWtlci1hMmktcnVudGltZSIsbmFtZToiQXVnbWVudGVkQUlSdW50aW1lIn0sZWJzOntuYW1lOiJFQlMifSxraW5lc2lzdmlkZW9zaWduYWxpbmdjaGFubmVsczp7cHJlZml4OiJraW5lc2lzLXZpZGVvLXNpZ25hbGluZyIsbmFtZToiS2luZXNpc1ZpZGVvU2lnbmFsaW5nQ2hhbm5lbHMiLGNvcnM6ITB9LGRldGVjdGl2ZTp7bmFtZToiRGV0ZWN0aXZlIn0sY29kZXN0YXJjb25uZWN0aW9uczp7cHJlZml4OiJjb2Rlc3Rhci1jb25uZWN0aW9ucyIsbmFtZToiQ29kZVN0YXJjb25uZWN0aW9ucyJ9LHN5bnRoZXRpY3M6e25hbWU6IlN5bnRoZXRpY3MifSxpb3RzaXRld2lzZTp7bmFtZToiSW9UU2l0ZVdpc2UifSxtYWNpZTI6e25hbWU6Ik1hY2llMiJ9LGNvZGVhcnRpZmFjdDp7bmFtZToiQ29kZUFydGlmYWN0In0saG9uZXljb2RlOntuYW1lOiJIb25leWNvZGUifSxpdnM6e25hbWU6IklWUyJ9LGJyYWtldDp7bmFtZToiQnJha2V0In0saWRlbnRpdHlzdG9yZTp7bmFtZToiSWRlbnRpdHlTdG9yZSJ9LGFwcGZsb3c6e25hbWU6IkFwcGZsb3cifSxyZWRzaGlmdGRhdGE6e3ByZWZpeDoicmVkc2hpZnQtZGF0YSIsbmFtZToiUmVkc2hpZnREYXRhIn0sc3NvYWRtaW46e3ByZWZpeDoic3NvLWFkbWluIixuYW1lOiJTU09BZG1pbiJ9LHRpbWVzdHJlYW1xdWVyeTp7cHJlZml4OiJ0aW1lc3RyZWFtLXF1ZXJ5IixuYW1lOiJUaW1lc3RyZWFtUXVlcnkifSx0aW1lc3RyZWFtd3JpdGU6e3ByZWZpeDoidGltZXN0cmVhbS13cml0ZSIsbmFtZToiVGltZXN0cmVhbVdyaXRlIn0sczNvdXRwb3N0czp7bmFtZToiUzNPdXRwb3N0cyJ9LGRhdGFicmV3OntuYW1lOiJEYXRhQnJldyJ9LHNlcnZpY2VjYXRhbG9nYXBwcmVnaXN0cnk6e3ByZWZpeDoic2VydmljZWNhdGFsb2ctYXBwcmVnaXN0cnkiLG5hbWU6IlNlcnZpY2VDYXRhbG9nQXBwUmVnaXN0cnkifSxuZXR3b3JrZmlyZXdhbGw6e3ByZWZpeDoibmV0d29yay1maXJld2FsbCIsbmFtZToiTmV0d29ya0ZpcmV3YWxsIn0sbXdhYTp7bmFtZToiTVdBQSJ9LGFtcGxpZnliYWNrZW5kOntuYW1lOiJBbXBsaWZ5QmFja2VuZCJ9LGFwcGludGVncmF0aW9uczp7bmFtZToiQXBwSW50ZWdyYXRpb25zIn0sY29ubmVjdGNvbnRhY3RsZW5zOntwcmVmaXg6ImNvbm5lY3QtY29udGFjdC1sZW5zIixuYW1lOiJDb25uZWN0Q29udGFjdExlbnMifSxkZXZvcHNndXJ1OntwcmVmaXg6ImRldm9wcy1ndXJ1IixuYW1lOiJEZXZPcHNHdXJ1In0sZWNycHVibGljOntwcmVmaXg6ImVjci1wdWJsaWMiLG5hbWU6IkVDUlBVQkxJQyJ9LGxvb2tvdXR2aXNpb246e25hbWU6Ikxvb2tvdXRWaXNpb24ifSxzYWdlbWFrZXJmZWF0dXJlc3RvcmVydW50aW1lOntwcmVmaXg6InNhZ2VtYWtlci1mZWF0dXJlc3RvcmUtcnVudGltZSIsbmFtZToiU2FnZU1ha2VyRmVhdHVyZVN0b3JlUnVudGltZSJ9LGN1c3RvbWVycHJvZmlsZXM6e3ByZWZpeDoiY3VzdG9tZXItcHJvZmlsZXMiLG5hbWU6IkN1c3RvbWVyUHJvZmlsZXMifSxhdWRpdG1hbmFnZXI6e25hbWU6IkF1ZGl0TWFuYWdlciJ9LGVtcmNvbnRhaW5lcnM6e3ByZWZpeDoiZW1yLWNvbnRhaW5lcnMiLG5hbWU6IkVNUmNvbnRhaW5lcnMifSxoZWFsdGhsYWtlOntuYW1lOiJIZWFsdGhMYWtlIn0sc2FnZW1ha2VyZWRnZTp7cHJlZml4OiJzYWdlbWFrZXItZWRnZSIsbmFtZToiU2FnZW1ha2VyRWRnZSJ9LGFtcDp7bmFtZToiQW1wIn0sZ3JlZW5ncmFzc3YyOntuYW1lOiJHcmVlbmdyYXNzVjIifSxpb3RkZXZpY2VhZHZpc29yOntuYW1lOiJJb3REZXZpY2VBZHZpc29yIn0saW90ZmxlZXRodWI6e25hbWU6IklvVEZsZWV0SHViIn0saW90d2lyZWxlc3M6e25hbWU6IklvVFdpcmVsZXNzIn0sbG9jYXRpb246e25hbWU6IkxvY2F0aW9uIixjb3JzOiEwfSx3ZWxsYXJjaGl0ZWN0ZWQ6e25hbWU6IldlbGxBcmNoaXRlY3RlZCJ9LGxleG1vZGVsc3YyOntwcmVmaXg6Im1vZGVscy5sZXgudjIiLG5hbWU6IkxleE1vZGVsc1YyIn0sbGV4cnVudGltZXYyOntwcmVmaXg6InJ1bnRpbWUubGV4LnYyIixuYW1lOiJMZXhSdW50aW1lVjIiLGNvcnM6ITB9LGZpczp7bmFtZToiRmlzIn0sbG9va291dG1ldHJpY3M6e25hbWU6Ikxvb2tvdXRNZXRyaWNzIn0sbWduOntuYW1lOiJNZ24ifSxsb29rb3V0ZXF1aXBtZW50OntuYW1lOiJMb29rb3V0RXF1aXBtZW50In0sbmltYmxlOntuYW1lOiJOaW1ibGUifSxmaW5zcGFjZTp7bmFtZToiRmluc3BhY2UifSxmaW5zcGFjZWRhdGE6e3ByZWZpeDoiZmluc3BhY2UtZGF0YSIsbmFtZToiRmluc3BhY2VkYXRhIn0sc3NtY29udGFjdHM6e3ByZWZpeDoic3NtLWNvbnRhY3RzIixuYW1lOiJTU01Db250YWN0cyJ9LHNzbWluY2lkZW50czp7cHJlZml4OiJzc20taW5jaWRlbnRzIixuYW1lOiJTU01JbmNpZGVudHMifSxhcHBsaWNhdGlvbmNvc3Rwcm9maWxlcjp7bmFtZToiQXBwbGljYXRpb25Db3N0UHJvZmlsZXIifSxhcHBydW5uZXI6e25hbWU6IkFwcFJ1bm5lciJ9LHByb3Rvbjp7bmFtZToiUHJvdG9uIn0scm91dGU1M3JlY292ZXJ5Y2x1c3Rlcjp7cHJlZml4OiJyb3V0ZTUzLXJlY292ZXJ5LWNsdXN0ZXIiLG5hbWU6IlJvdXRlNTNSZWNvdmVyeUNsdXN0ZXIifSxyb3V0ZTUzcmVjb3Zlcnljb250cm9sY29uZmlnOntwcmVmaXg6InJvdXRlNTMtcmVjb3ZlcnktY29udHJvbC1jb25maWciLG5hbWU6IlJvdXRlNTNSZWNvdmVyeUNvbnRyb2xDb25maWcifSxyb3V0ZTUzcmVjb3ZlcnlyZWFkaW5lc3M6e3ByZWZpeDoicm91dGU1My1yZWNvdmVyeS1yZWFkaW5lc3MiLG5hbWU6IlJvdXRlNTNSZWNvdmVyeVJlYWRpbmVzcyJ9LGNoaW1lc2RraWRlbnRpdHk6e3ByZWZpeDoiY2hpbWUtc2RrLWlkZW50aXR5IixuYW1lOiJDaGltZVNES0lkZW50aXR5In0sY2hpbWVzZGttZXNzYWdpbmc6e3ByZWZpeDoiY2hpbWUtc2RrLW1lc3NhZ2luZyIsbmFtZToiQ2hpbWVTREtNZXNzYWdpbmcifSxzbm93ZGV2aWNlbWFuYWdlbWVudDp7cHJlZml4OiJzbm93LWRldmljZS1tYW5hZ2VtZW50IixuYW1lOiJTbm93RGV2aWNlTWFuYWdlbWVudCJ9LG1lbW9yeWRiOntuYW1lOiJNZW1vcnlEQiJ9LG9wZW5zZWFyY2g6e25hbWU6Ik9wZW5TZWFyY2gifSxrYWZrYWNvbm5lY3Q6e25hbWU6IkthZmthQ29ubmVjdCJ9LHZvaWNlaWQ6e3ByZWZpeDoidm9pY2UtaWQiLG5hbWU6IlZvaWNlSUQifSx3aXNkb206e25hbWU6Ildpc2RvbSJ9LGFjY291bnQ6e25hbWU6IkFjY291bnQifSxjbG91ZGNvbnRyb2w6e25hbWU6IkNsb3VkQ29udHJvbCJ9LGdyYWZhbmE6e25hbWU6IkdyYWZhbmEifSxwYW5vcmFtYTp7bmFtZToiUGFub3JhbWEifSxjaGltZXNka21lZXRpbmdzOntwcmVmaXg6ImNoaW1lLXNkay1tZWV0aW5ncyIsbmFtZToiQ2hpbWVTREtNZWV0aW5ncyJ9LHJlc2lsaWVuY2VodWI6e25hbWU6IlJlc2lsaWVuY2VodWIifSxtaWdyYXRpb25odWJzdHJhdGVneTp7bmFtZToiTWlncmF0aW9uSHViU3RyYXRlZ3kifSxhcHBjb25maWdkYXRhOntuYW1lOiJBcHBDb25maWdEYXRhIn0sZHJzOntuYW1lOiJEcnMifSxtaWdyYXRpb25odWJyZWZhY3RvcnNwYWNlczp7cHJlZml4OiJtaWdyYXRpb24taHViLXJlZmFjdG9yLXNwYWNlcyIsbmFtZToiTWlncmF0aW9uSHViUmVmYWN0b3JTcGFjZXMifSxldmlkZW50bHk6e25hbWU6IkV2aWRlbnRseSJ9LGluc3BlY3RvcjI6e25hbWU6Ikluc3BlY3RvcjIifSxyYmluOntuYW1lOiJSYmluIn0scnVtOntuYW1lOiJSVU0ifSxiYWNrdXBnYXRld2F5OntwcmVmaXg6ImJhY2t1cC1nYXRld2F5IixuYW1lOiJCYWNrdXBHYXRld2F5In0saW90dHdpbm1ha2VyOntuYW1lOiJJb1RUd2luTWFrZXIifSx3b3Jrc3BhY2Vzd2ViOntwcmVmaXg6IndvcmtzcGFjZXMtd2ViIixuYW1lOiJXb3JrU3BhY2VzV2ViIn0sYW1wbGlmeXVpYnVpbGRlcjp7bmFtZToiQW1wbGlmeVVJQnVpbGRlciJ9LGtleXNwYWNlczp7bmFtZToiS2V5c3BhY2VzIn0sYmlsbGluZ2NvbmR1Y3Rvcjp7bmFtZToiQmlsbGluZ2NvbmR1Y3RvciJ9LGdhbWVzcGFya3M6e25hbWU6IkdhbWVTcGFya3MifSxwaW5wb2ludHNtc3ZvaWNldjI6e3ByZWZpeDoicGlucG9pbnQtc21zLXZvaWNlLXYyIixuYW1lOiJQaW5wb2ludFNNU1ZvaWNlVjIifSxpdnNjaGF0OntuYW1lOiJJdnNjaGF0In0sY2hpbWVzZGttZWRpYXBpcGVsaW5lczp7cHJlZml4OiJjaGltZS1zZGstbWVkaWEtcGlwZWxpbmVzIixuYW1lOiJDaGltZVNES01lZGlhUGlwZWxpbmVzIn0sZW1yc2VydmVybGVzczp7cHJlZml4OiJlbXItc2VydmVybGVzcyIsbmFtZToiRU1SU2VydmVybGVzcyJ9LG0yOntuYW1lOiJNMiJ9LGNvbm5lY3RjYW1wYWlnbnM6e25hbWU6IkNvbm5lY3RDYW1wYWlnbnMifSxyZWRzaGlmdHNlcnZlcmxlc3M6e3ByZWZpeDoicmVkc2hpZnQtc2VydmVybGVzcyIsbmFtZToiUmVkc2hpZnRTZXJ2ZXJsZXNzIn0scm9sZXNhbnl3aGVyZTp7bmFtZToiUm9sZXNBbnl3aGVyZSJ9LGxpY2Vuc2VtYW5hZ2VydXNlcnN1YnNjcmlwdGlvbnM6e3ByZWZpeDoibGljZW5zZS1tYW5hZ2VyLXVzZXItc3Vic2NyaXB0aW9ucyIsbmFtZToiTGljZW5zZU1hbmFnZXJVc2VyU3Vic2NyaXB0aW9ucyJ9LGJhY2t1cHN0b3JhZ2U6e25hbWU6IkJhY2t1cFN0b3JhZ2UifSxwcml2YXRlbmV0d29ya3M6e25hbWU6IlByaXZhdGVOZXR3b3JrcyJ9LHN1cHBvcnRhcHA6e3ByZWZpeDoic3VwcG9ydC1hcHAiLG5hbWU6IlN1cHBvcnRBcHAifSxjb250cm9sdG93ZXI6e25hbWU6IkNvbnRyb2xUb3dlciJ9LGlvdGZsZWV0d2lzZTp7bmFtZToiSW9URmxlZXRXaXNlIn0sbWlncmF0aW9uaHVib3JjaGVzdHJhdG9yOntuYW1lOiJNaWdyYXRpb25IdWJPcmNoZXN0cmF0b3IifSxjb25uZWN0Y2FzZXM6e25hbWU6IkNvbm5lY3RDYXNlcyJ9LHJlc291cmNlZXhwbG9yZXIyOntwcmVmaXg6InJlc291cmNlLWV4cGxvcmVyLTIiLG5hbWU6IlJlc291cmNlRXhwbG9yZXIyIn0sc2NoZWR1bGVyOntuYW1lOiJTY2hlZHVsZXIifSxjaGltZXNka3ZvaWNlOntwcmVmaXg6ImNoaW1lLXNkay12b2ljZSIsbmFtZToiQ2hpbWVTREtWb2ljZSJ9LGlvdHJvYm9ydW5uZXI6e3ByZWZpeDoiaW90LXJvYm9ydW5uZXIiLG5hbWU6IklvVFJvYm9SdW5uZXIifSxzc21zYXA6e3ByZWZpeDoic3NtLXNhcCIsbmFtZToiU3NtU2FwIn0sb2FtOntuYW1lOiJPQU0ifSxhcmN6b25hbHNoaWZ0OntwcmVmaXg6ImFyYy16b25hbC1zaGlmdCIsbmFtZToiQVJDWm9uYWxTaGlmdCJ9LG9taWNzOntuYW1lOiJPbWljcyJ9LG9wZW5zZWFyY2hzZXJ2ZXJsZXNzOntuYW1lOiJPcGVuU2VhcmNoU2VydmVybGVzcyJ9LHNlY3VyaXR5bGFrZTp7bmFtZToiU2VjdXJpdHlMYWtlIn0sc2ltc3BhY2V3ZWF2ZXI6e25hbWU6IlNpbVNwYWNlV2VhdmVyIn0sZG9jZGJlbGFzdGljOntwcmVmaXg6ImRvY2RiLWVsYXN0aWMiLG5hbWU6IkRvY0RCRWxhc3RpYyJ9LHNhZ2VtYWtlcmdlb3NwYXRpYWw6e3ByZWZpeDoic2FnZW1ha2VyLWdlb3NwYXRpYWwiLG5hbWU6IlNhZ2VNYWtlckdlb3NwYXRpYWwifSxjb2RlY2F0YWx5c3Q6e25hbWU6IkNvZGVDYXRhbHlzdCJ9LHBpcGVzOntuYW1lOiJQaXBlcyJ9LHNhZ2VtYWtlcm1ldHJpY3M6e3ByZWZpeDoic2FnZW1ha2VyLW1ldHJpY3MiLG5hbWU6IlNhZ2VNYWtlck1ldHJpY3MifSxraW5lc2lzdmlkZW93ZWJydGNzdG9yYWdlOntwcmVmaXg6ImtpbmVzaXMtdmlkZW8td2VicnRjLXN0b3JhZ2UiLG5hbWU6IktpbmVzaXNWaWRlb1dlYlJUQ1N0b3JhZ2UifSxsaWNlbnNlbWFuYWdlcmxpbnV4c3Vic2NyaXB0aW9uczp7cHJlZml4OiJsaWNlbnNlLW1hbmFnZXItbGludXgtc3Vic2NyaXB0aW9ucyIsbmFtZToiTGljZW5zZU1hbmFnZXJMaW51eFN1YnNjcmlwdGlvbnMifSxrZW5kcmFyYW5raW5nOntwcmVmaXg6ImtlbmRyYS1yYW5raW5nIixuYW1lOiJLZW5kcmFSYW5raW5nIn0sY2xlYW5yb29tczp7bmFtZToiQ2xlYW5Sb29tcyJ9LGNsb3VkdHJhaWxkYXRhOntwcmVmaXg6ImNsb3VkdHJhaWwtZGF0YSIsbmFtZToiQ2xvdWRUcmFpbERhdGEifSx0bmI6e25hbWU6IlRuYiJ9LGludGVybmV0bW9uaXRvcjp7bmFtZToiSW50ZXJuZXRNb25pdG9yIn0saXZzcmVhbHRpbWU6e3ByZWZpeDoiaXZzLXJlYWx0aW1lIixuYW1lOiJJVlNSZWFsVGltZSJ9LHZwY2xhdHRpY2U6e3ByZWZpeDoidnBjLWxhdHRpY2UiLG5hbWU6IlZQQ0xhdHRpY2UifSxvc2lzOntuYW1lOiJPU0lTIn19fSx7fV0sNTpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17dmVyc2lvbjoiMi4wIixtZXRhZGF0YTp7YXBpVmVyc2lvbjoiMjAxMS0wNi0xNSIsZW5kcG9pbnRQcmVmaXg6InN0cyIsZ2xvYmFsRW5kcG9pbnQ6InN0cy5hbWF6b25hd3MuY29tIixwcm90b2NvbDoicXVlcnkiLHNlcnZpY2VBYmJyZXZpYXRpb246IkFXUyBTVFMiLHNlcnZpY2VGdWxsTmFtZToiQVdTIFNlY3VyaXR5IFRva2VuIFNlcnZpY2UiLHNlcnZpY2VJZDoiU1RTIixzaWduYXR1cmVWZXJzaW9uOiJ2NCIsdWlkOiJzdHMtMjAxMS0wNi0xNSIseG1sTmFtZXNwYWNlOiJodHRwczovL3N0cy5hbWF6b25hd3MuY29tL2RvYy8yMDExLTA2LTE1LyJ9LG9wZXJhdGlvbnM6e0Fzc3VtZVJvbGU6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiUm9sZUFybiIsIlJvbGVTZXNzaW9uTmFtZSJdLG1lbWJlcnM6e1JvbGVBcm46e30sUm9sZVNlc3Npb25OYW1lOnt9LFBvbGljeUFybnM6e3NoYXBlOiJTNCJ9LFBvbGljeTp7fSxEdXJhdGlvblNlY29uZHM6e3R5cGU6ImludGVnZXIifSxUYWdzOntzaGFwZToiUzgifSxUcmFuc2l0aXZlVGFnS2V5czp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxFeHRlcm5hbElkOnt9LFNlcmlhbE51bWJlcjp7fSxUb2tlbkNvZGU6e30sU291cmNlSWRlbnRpdHk6e319fSxvdXRwdXQ6e3Jlc3VsdFdyYXBwZXI6IkFzc3VtZVJvbGVSZXN1bHQiLHR5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7Q3JlZGVudGlhbHM6e3NoYXBlOiJTaSJ9LEFzc3VtZWRSb2xlVXNlcjp7c2hhcGU6IlNuIn0sUGFja2VkUG9saWN5U2l6ZTp7dHlwZToiaW50ZWdlciJ9LFNvdXJjZUlkZW50aXR5Ont9fX19LEFzc3VtZVJvbGVXaXRoU0FNTDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJSb2xlQXJuIiwiUHJpbmNpcGFsQXJuIiwiU0FNTEFzc2VydGlvbiJdLG1lbWJlcnM6e1JvbGVBcm46e30sUHJpbmNpcGFsQXJuOnt9LFNBTUxBc3NlcnRpb246e30sUG9saWN5QXJuczp7c2hhcGU6IlM0In0sUG9saWN5Ont9LER1cmF0aW9uU2Vjb25kczp7dHlwZToiaW50ZWdlciJ9fX0sb3V0cHV0OntyZXN1bHRXcmFwcGVyOiJBc3N1bWVSb2xlV2l0aFNBTUxSZXN1bHQiLHR5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7Q3JlZGVudGlhbHM6e3NoYXBlOiJTaSJ9LEFzc3VtZWRSb2xlVXNlcjp7c2hhcGU6IlNuIn0sUGFja2VkUG9saWN5U2l6ZTp7dHlwZToiaW50ZWdlciJ9LFN1YmplY3Q6e30sU3ViamVjdFR5cGU6e30sSXNzdWVyOnt9LEF1ZGllbmNlOnt9LE5hbWVRdWFsaWZpZXI6e30sU291cmNlSWRlbnRpdHk6e319fX0sQXNzdW1lUm9sZVdpdGhXZWJJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJSb2xlQXJuIiwiUm9sZVNlc3Npb25OYW1lIiwiV2ViSWRlbnRpdHlUb2tlbiJdLG1lbWJlcnM6e1JvbGVBcm46e30sUm9sZVNlc3Npb25OYW1lOnt9LFdlYklkZW50aXR5VG9rZW46e30sUHJvdmlkZXJJZDp7fSxQb2xpY3lBcm5zOntzaGFwZToiUzQifSxQb2xpY3k6e30sRHVyYXRpb25TZWNvbmRzOnt0eXBlOiJpbnRlZ2VyIn19fSxvdXRwdXQ6e3Jlc3VsdFdyYXBwZXI6IkFzc3VtZVJvbGVXaXRoV2ViSWRlbnRpdHlSZXN1bHQiLHR5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7Q3JlZGVudGlhbHM6e3NoYXBlOiJTaSJ9LFN1YmplY3RGcm9tV2ViSWRlbnRpdHlUb2tlbjp7fSxBc3N1bWVkUm9sZVVzZXI6e3NoYXBlOiJTbiJ9LFBhY2tlZFBvbGljeVNpemU6e3R5cGU6ImludGVnZXIifSxQcm92aWRlcjp7fSxBdWRpZW5jZTp7fSxTb3VyY2VJZGVudGl0eTp7fX19fSxEZWNvZGVBdXRob3JpemF0aW9uTWVzc2FnZTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJFbmNvZGVkTWVzc2FnZSJdLG1lbWJlcnM6e0VuY29kZWRNZXNzYWdlOnt9fX0sb3V0cHV0OntyZXN1bHRXcmFwcGVyOiJEZWNvZGVBdXRob3JpemF0aW9uTWVzc2FnZVJlc3VsdCIsdHlwZToic3RydWN0dXJlIixtZW1iZXJzOntEZWNvZGVkTWVzc2FnZTp7fX19fSxHZXRBY2Nlc3NLZXlJbmZvOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIkFjY2Vzc0tleUlkIl0sbWVtYmVyczp7QWNjZXNzS2V5SWQ6e319fSxvdXRwdXQ6e3Jlc3VsdFdyYXBwZXI6IkdldEFjY2Vzc0tleUluZm9SZXN1bHQiLHR5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7QWNjb3VudDp7fX19fSxHZXRDYWxsZXJJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX0sb3V0cHV0OntyZXN1bHRXcmFwcGVyOiJHZXRDYWxsZXJJZGVudGl0eVJlc3VsdCIsdHlwZToic3RydWN0dXJlIixtZW1iZXJzOntVc2VySWQ6e30sQWNjb3VudDp7fSxBcm46e319fX0sR2V0RmVkZXJhdGlvblRva2VuOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIk5hbWUiXSxtZW1iZXJzOntOYW1lOnt9LFBvbGljeTp7fSxQb2xpY3lBcm5zOntzaGFwZToiUzQifSxEdXJhdGlvblNlY29uZHM6e3R5cGU6ImludGVnZXIifSxUYWdzOntzaGFwZToiUzgifX19LG91dHB1dDp7cmVzdWx0V3JhcHBlcjoiR2V0RmVkZXJhdGlvblRva2VuUmVzdWx0Iix0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0NyZWRlbnRpYWxzOntzaGFwZToiU2kifSxGZWRlcmF0ZWRVc2VyOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiRmVkZXJhdGVkVXNlcklkIiwiQXJuIl0sbWVtYmVyczp7RmVkZXJhdGVkVXNlcklkOnt9LEFybjp7fX19LFBhY2tlZFBvbGljeVNpemU6e3R5cGU6ImludGVnZXIifX19fSxHZXRTZXNzaW9uVG9rZW46e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0R1cmF0aW9uU2Vjb25kczp7dHlwZToiaW50ZWdlciJ9LFNlcmlhbE51bWJlcjp7fSxUb2tlbkNvZGU6e319fSxvdXRwdXQ6e3Jlc3VsdFdyYXBwZXI6IkdldFNlc3Npb25Ub2tlblJlc3VsdCIsdHlwZToic3RydWN0dXJlIixtZW1iZXJzOntDcmVkZW50aWFsczp7c2hhcGU6IlNpIn19fX19LHNoYXBlczp7UzQ6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnthcm46e319fX0sUzg6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIktleSIsIlZhbHVlIl0sbWVtYmVyczp7S2V5Ont9LFZhbHVlOnt9fX19LFNpOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiQWNjZXNzS2V5SWQiLCJTZWNyZXRBY2Nlc3NLZXkiLCJTZXNzaW9uVG9rZW4iLCJFeHBpcmF0aW9uIl0sbWVtYmVyczp7QWNjZXNzS2V5SWQ6e30sU2VjcmV0QWNjZXNzS2V5Ont9LFNlc3Npb25Ub2tlbjp7fSxFeHBpcmF0aW9uOnt0eXBlOiJ0aW1lc3RhbXAifX19LFNuOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiQXNzdW1lZFJvbGVJZCIsIkFybiJdLG1lbWJlcnM6e0Fzc3VtZWRSb2xlSWQ6e30sQXJuOnt9fX19fX0se31dLDY6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e3BhZ2luYXRpb246e319fSx7fV0sNzpbZnVuY3Rpb24oZSx0LG4pe2UoIi4uL2xpYi9ub2RlX2xvYWRlciIpO3ZhciByPWUoIi4uL2xpYi9jb3JlIiksbz1yLlNlcnZpY2UsaT1yLmFwaUxvYWRlcjtpLnNlcnZpY2VzLmNvZ25pdG9pZGVudGl0eT17fSxyLkNvZ25pdG9JZGVudGl0eT1vLmRlZmluZVNlcnZpY2UoImNvZ25pdG9pZGVudGl0eSIsWyIyMDE0LTA2LTMwIl0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLnNlcnZpY2VzLmNvZ25pdG9pZGVudGl0eSwiMjAxNC0wNi0zMCIse2dldDpmdW5jdGlvbigpe3ZhciB0PWUoIi4uL2FwaXMvY29nbml0by1pZGVudGl0eS0yMDE0LTA2LTMwLm1pbi5qc29uIik7cmV0dXJuIHQucGFnaW5hdG9ycz1lKCIuLi9hcGlzL2NvZ25pdG8taWRlbnRpdHktMjAxNC0wNi0zMC5wYWdpbmF0b3JzLmpzb24iKS5wYWdpbmF0aW9uLHR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5leHBvcnRzPXIuQ29nbml0b0lkZW50aXR5fSx7Ii4uL2FwaXMvY29nbml0by1pZGVudGl0eS0yMDE0LTA2LTMwLm1pbi5qc29uIjoxLCIuLi9hcGlzL2NvZ25pdG8taWRlbnRpdHktMjAxNC0wNi0zMC5wYWdpbmF0b3JzLmpzb24iOjIsIi4uL2xpYi9jb3JlIjoxOSwiLi4vbGliL25vZGVfbG9hZGVyIjoxNn1dLDg6W2Z1bmN0aW9uKGUsdCxuKXtlKCIuLi9saWIvbm9kZV9sb2FkZXIiKTt2YXIgcj1lKCIuLi9saWIvY29yZSIpLG89ci5TZXJ2aWNlLGk9ci5hcGlMb2FkZXI7aS5zZXJ2aWNlcy5zdHM9e30sci5TVFM9by5kZWZpbmVTZXJ2aWNlKCJzdHMiLFsiMjAxMS0wNi0xNSJdKSxlKCIuLi9saWIvc2VydmljZXMvc3RzIiksT2JqZWN0LmRlZmluZVByb3BlcnR5KGkuc2VydmljZXMuc3RzLCIyMDExLTA2LTE1Iix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9ZSgiLi4vYXBpcy9zdHMtMjAxMS0wNi0xNS5taW4uanNvbiIpO3JldHVybiB0LnBhZ2luYXRvcnM9ZSgiLi4vYXBpcy9zdHMtMjAxMS0wNi0xNS5wYWdpbmF0b3JzLmpzb24iKS5wYWdpbmF0aW9uLHR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdC5leHBvcnRzPXIuU1RTfSx7Ii4uL2FwaXMvc3RzLTIwMTEtMDYtMTUubWluLmpzb24iOjUsIi4uL2FwaXMvc3RzLTIwMTEtMDYtMTUucGFnaW5hdG9ycy5qc29uIjo2LCIuLi9saWIvY29yZSI6MTksIi4uL2xpYi9ub2RlX2xvYWRlciI6MTYsIi4uL2xpYi9zZXJ2aWNlcy9zdHMiOjYzfV0sOTpbZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHIoZSx0KXtpZighci5zZXJ2aWNlcy5oYXNPd25Qcm9wZXJ0eShlKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWRTZXJ2aWNlOiBGYWlsZWQgdG8gbG9hZCBhcGkgZm9yICIrZSk7cmV0dXJuIHIuc2VydmljZXNbZV1bdF19ci5zZXJ2aWNlcz17fSx0LmV4cG9ydHM9cn0se31dLDEwOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9icm93c2VySG1hYyIpLG89ZSgiLi9icm93c2VyTWQ1IiksaT1lKCIuL2Jyb3dzZXJTaGExIikscz1lKCIuL2Jyb3dzZXJTaGEyNTYiKTt0LmV4cG9ydHM9e2NyZWF0ZUhhc2g6ZnVuY3Rpb24oZSl7aWYoIm1kNSI9PT0oZT1lLnRvTG93ZXJDYXNlKCkpKXJldHVybiBuZXcgbztpZigic2hhMjU2Ij09PWUpcmV0dXJuIG5ldyBzO2lmKCJzaGExIj09PWUpcmV0dXJuIG5ldyBpO3Rocm93IG5ldyBFcnJvcigiSGFzaCBhbGdvcml0aG0gIitlKyIgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgYnJvd3NlciBTREsiKX0sY3JlYXRlSG1hYzpmdW5jdGlvbihlLHQpe2lmKCJtZDUiPT09KGU9ZS50b0xvd2VyQ2FzZSgpKSlyZXR1cm4gbmV3IHIobyx0KTtpZigic2hhMjU2Ij09PWUpcmV0dXJuIG5ldyByKHMsdCk7aWYoInNoYTEiPT09ZSlyZXR1cm4gbmV3IHIoaSx0KTt0aHJvdyBuZXcgRXJyb3IoIkhNQUMgYWxnb3JpdGhtICIrZSsiIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXIgU0RLIil9LGNyZWF0ZVNpZ246ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoImNyZWF0ZVNpZ24gaXMgbm90IGltcGxlbWVudGVkIGluIHRoZSBicm93c2VyIil9fX0seyIuL2Jyb3dzZXJIbWFjIjoxMiwiLi9icm93c2VyTWQ1IjoxMywiLi9icm93c2VyU2hhMSI6MTQsIi4vYnJvd3NlclNoYTI1NiI6MTV9XSwxMTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoImJ1ZmZlci8iKS5CdWZmZXI7InVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmdm9pZCAwPT09QXJyYXlCdWZmZXIuaXNWaWV3JiYoQXJyYXlCdWZmZXIuaXNWaWV3PWZ1bmN0aW9uKGUpe3JldHVybiBvLmluZGV4T2YoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKT4tMX0pO3ZhciBvPVsiW29iamVjdCBJbnQ4QXJyYXldIiwiW29iamVjdCBVaW50OEFycmF5XSIsIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIiwiW29iamVjdCBJbnQxNkFycmF5XSIsIltvYmplY3QgVWludDE2QXJyYXldIiwiW29iamVjdCBJbnQzMkFycmF5XSIsIltvYmplY3QgVWludDMyQXJyYXldIiwiW29iamVjdCBGbG9hdDMyQXJyYXldIiwiW29iamVjdCBGbG9hdDY0QXJyYXldIiwiW29iamVjdCBEYXRhVmlld10iXTt0LmV4cG9ydHM9e2lzRW1wdHlEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZT8wPT09ZS5sZW5ndGg6MD09PWUuYnl0ZUxlbmd0aH0sY29udmVydFRvQnVmZmVyOmZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmKGU9bmV3IHIoZSwidXRmOCIpKSxBcnJheUJ1ZmZlci5pc1ZpZXcoZSk/bmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aC9VaW50OEFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKTpuZXcgVWludDhBcnJheShlKX19fSx7ImJ1ZmZlci8iOjg3fV0sMTI6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2Jyb3dzZXJIYXNoVXRpbHMiKTtmdW5jdGlvbiBvKGUsdCl7dGhpcy5oYXNoPW5ldyBlLHRoaXMub3V0ZXI9bmV3IGU7dmFyIG49ZnVuY3Rpb24oZSx0KXt2YXIgbj1yLmNvbnZlcnRUb0J1ZmZlcih0KTtpZihuLmJ5dGVMZW5ndGg+ZS5CTE9DS19TSVpFKXt2YXIgbz1uZXcgZTtvLnVwZGF0ZShuKSxuPW8uZGlnZXN0KCl9dmFyIGk9bmV3IFVpbnQ4QXJyYXkoZS5CTE9DS19TSVpFKTtyZXR1cm4gaS5zZXQobiksaX0oZSx0KSxvPW5ldyBVaW50OEFycmF5KGUuQkxPQ0tfU0laRSk7by5zZXQobik7Zm9yKHZhciBpPTA7aTxlLkJMT0NLX1NJWkU7aSsrKW5baV1ePTU0LG9baV1ePTkyO2Zvcih0aGlzLmhhc2gudXBkYXRlKG4pLHRoaXMub3V0ZXIudXBkYXRlKG8pLGk9MDtpPG4uYnl0ZUxlbmd0aDtpKyspbltpXT0wfXQuZXhwb3J0cz1vLG8ucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlKXtpZihyLmlzRW1wdHlEYXRhKGUpfHx0aGlzLmVycm9yKXJldHVybiB0aGlzO3RyeXt0aGlzLmhhc2gudXBkYXRlKHIuY29udmVydFRvQnVmZmVyKGUpKX1jYXRjaChlKXt0aGlzLmVycm9yPWV9cmV0dXJuIHRoaXN9LG8ucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vdXRlci5maW5pc2hlZHx8dGhpcy5vdXRlci51cGRhdGUodGhpcy5oYXNoLmRpZ2VzdCgpKSx0aGlzLm91dGVyLmRpZ2VzdChlKX19LHsiLi9icm93c2VySGFzaFV0aWxzIjoxMX1dLDEzOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9icm93c2VySGFzaFV0aWxzIiksbz1lKCJidWZmZXIvIikuQnVmZmVyLGk9NjQ7ZnVuY3Rpb24gcygpe3RoaXMuc3RhdGU9WzE3MzI1ODQxOTMsNDAyMzIzMzQxNywyNTYyMzgzMTAyLDI3MTczMzg3OF0sdGhpcy5idWZmZXI9bmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcihpKSksdGhpcy5idWZmZXJMZW5ndGg9MCx0aGlzLmJ5dGVzSGFzaGVkPTAsdGhpcy5maW5pc2hlZD0hMX1mdW5jdGlvbiBhKGUsdCxuLHIsbyxpKXtyZXR1cm4oKHQ9KHQrZSY0Mjk0OTY3Mjk1KSsocitpJjQyOTQ5NjcyOTUpJjQyOTQ5NjcyOTUpPDxvfHQ+Pj4zMi1vKStuJjQyOTQ5NjcyOTV9ZnVuY3Rpb24gYyhlLHQsbixyLG8saSxzKXtyZXR1cm4gYSh0Jm58fnQmcixlLHQsbyxpLHMpfWZ1bmN0aW9uIHUoZSx0LG4scixvLGkscyl7cmV0dXJuIGEodCZyfG4mfnIsZSx0LG8saSxzKX1mdW5jdGlvbiBsKGUsdCxuLHIsbyxpLHMpe3JldHVybiBhKHRebl5yLGUsdCxvLGkscyl9ZnVuY3Rpb24gcChlLHQsbixyLG8saSxzKXtyZXR1cm4gYShuXih0fH5yKSxlLHQsbyxpLHMpfXQuZXhwb3J0cz1zLHMuQkxPQ0tfU0laRT1pLHMucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlKXtpZihyLmlzRW1wdHlEYXRhKGUpKXJldHVybiB0aGlzO2lmKHRoaXMuZmluaXNoZWQpdGhyb3cgbmV3IEVycm9yKCJBdHRlbXB0ZWQgdG8gdXBkYXRlIGFuIGFscmVhZHkgZmluaXNoZWQgaGFzaC4iKTt2YXIgdD1yLmNvbnZlcnRUb0J1ZmZlcihlKSxuPTAsbz10LmJ5dGVMZW5ndGg7Zm9yKHRoaXMuYnl0ZXNIYXNoZWQrPW87bz4wOyl0aGlzLmJ1ZmZlci5zZXRVaW50OCh0aGlzLmJ1ZmZlckxlbmd0aCsrLHRbbisrXSksby0tLHRoaXMuYnVmZmVyTGVuZ3RoPT09aSYmKHRoaXMuaGFzaEJ1ZmZlcigpLHRoaXMuYnVmZmVyTGVuZ3RoPTApO3JldHVybiB0aGlzfSxzLnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuZmluaXNoZWQpe3ZhciB0PXRoaXMsbj10LmJ1ZmZlcixyPXQuYnVmZmVyTGVuZ3RoLHM9OCp0LmJ5dGVzSGFzaGVkO2lmKG4uc2V0VWludDgodGhpcy5idWZmZXJMZW5ndGgrKywxMjgpLHIlaT49NTYpe2Zvcih2YXIgYT10aGlzLmJ1ZmZlckxlbmd0aDthPGk7YSsrKW4uc2V0VWludDgoYSwwKTt0aGlzLmhhc2hCdWZmZXIoKSx0aGlzLmJ1ZmZlckxlbmd0aD0wfWZvcihhPXRoaXMuYnVmZmVyTGVuZ3RoO2E8NTY7YSsrKW4uc2V0VWludDgoYSwwKTtuLnNldFVpbnQzMig1NixzPj4+MCwhMCksbi5zZXRVaW50MzIoNjAsTWF0aC5mbG9vcihzLzQyOTQ5NjcyOTYpLCEwKSx0aGlzLmhhc2hCdWZmZXIoKSx0aGlzLmZpbmlzaGVkPSEwfXZhciBjPW5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMTYpKTtmb3IoYT0wO2E8NDthKyspYy5zZXRVaW50MzIoNCphLHRoaXMuc3RhdGVbYV0sITApO3ZhciB1PW5ldyBvKGMuYnVmZmVyLGMuYnl0ZU9mZnNldCxjLmJ5dGVMZW5ndGgpO3JldHVybiBlP3UudG9TdHJpbmcoZSk6dX0scy5wcm90b3R5cGUuaGFzaEJ1ZmZlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuYnVmZmVyLHQ9dGhpcy5zdGF0ZSxuPXRbMF0scj10WzFdLG89dFsyXSxpPXRbM107bj1jKG4scixvLGksZS5nZXRVaW50MzIoMCwhMCksNywzNjE0MDkwMzYwKSxpPWMoaSxuLHIsbyxlLmdldFVpbnQzMig0LCEwKSwxMiwzOTA1NDAyNzEwKSxvPWMobyxpLG4scixlLmdldFVpbnQzMig4LCEwKSwxNyw2MDYxMDU4MTkpLHI9YyhyLG8saSxuLGUuZ2V0VWludDMyKDEyLCEwKSwyMiwzMjUwNDQxOTY2KSxuPWMobixyLG8saSxlLmdldFVpbnQzMigxNiwhMCksNyw0MTE4NTQ4Mzk5KSxpPWMoaSxuLHIsbyxlLmdldFVpbnQzMigyMCwhMCksMTIsMTIwMDA4MDQyNiksbz1jKG8saSxuLHIsZS5nZXRVaW50MzIoMjQsITApLDE3LDI4MjE3MzU5NTUpLHI9YyhyLG8saSxuLGUuZ2V0VWludDMyKDI4LCEwKSwyMiw0MjQ5MjYxMzEzKSxuPWMobixyLG8saSxlLmdldFVpbnQzMigzMiwhMCksNywxNzcwMDM1NDE2KSxpPWMoaSxuLHIsbyxlLmdldFVpbnQzMigzNiwhMCksMTIsMjMzNjU1Mjg3OSksbz1jKG8saSxuLHIsZS5nZXRVaW50MzIoNDAsITApLDE3LDQyOTQ5MjUyMzMpLHI9YyhyLG8saSxuLGUuZ2V0VWludDMyKDQ0LCEwKSwyMiwyMzA0NTYzMTM0KSxuPWMobixyLG8saSxlLmdldFVpbnQzMig0OCwhMCksNywxODA0NjAzNjgyKSxpPWMoaSxuLHIsbyxlLmdldFVpbnQzMig1MiwhMCksMTIsNDI1NDYyNjE5NSksbz1jKG8saSxuLHIsZS5nZXRVaW50MzIoNTYsITApLDE3LDI3OTI5NjUwMDYpLG49dShuLHI9YyhyLG8saSxuLGUuZ2V0VWludDMyKDYwLCEwKSwyMiwxMjM2NTM1MzI5KSxvLGksZS5nZXRVaW50MzIoNCwhMCksNSw0MTI5MTcwNzg2KSxpPXUoaSxuLHIsbyxlLmdldFVpbnQzMigyNCwhMCksOSwzMjI1NDY1NjY0KSxvPXUobyxpLG4scixlLmdldFVpbnQzMig0NCwhMCksMTQsNjQzNzE3NzEzKSxyPXUocixvLGksbixlLmdldFVpbnQzMigwLCEwKSwyMCwzOTIxMDY5OTk0KSxuPXUobixyLG8saSxlLmdldFVpbnQzMigyMCwhMCksNSwzNTkzNDA4NjA1KSxpPXUoaSxuLHIsbyxlLmdldFVpbnQzMig0MCwhMCksOSwzODAxNjA4Myksbz11KG8saSxuLHIsZS5nZXRVaW50MzIoNjAsITApLDE0LDM2MzQ0ODg5NjEpLHI9dShyLG8saSxuLGUuZ2V0VWludDMyKDE2LCEwKSwyMCwzODg5NDI5NDQ4KSxuPXUobixyLG8saSxlLmdldFVpbnQzMigzNiwhMCksNSw1Njg0NDY0MzgpLGk9dShpLG4scixvLGUuZ2V0VWludDMyKDU2LCEwKSw5LDMyNzUxNjM2MDYpLG89dShvLGksbixyLGUuZ2V0VWludDMyKDEyLCEwKSwxNCw0MTA3NjAzMzM1KSxyPXUocixvLGksbixlLmdldFVpbnQzMigzMiwhMCksMjAsMTE2MzUzMTUwMSksbj11KG4scixvLGksZS5nZXRVaW50MzIoNTIsITApLDUsMjg1MDI4NTgyOSksaT11KGksbixyLG8sZS5nZXRVaW50MzIoOCwhMCksOSw0MjQzNTYzNTEyKSxvPXUobyxpLG4scixlLmdldFVpbnQzMigyOCwhMCksMTQsMTczNTMyODQ3Myksbj1sKG4scj11KHIsbyxpLG4sZS5nZXRVaW50MzIoNDgsITApLDIwLDIzNjgzNTk1NjIpLG8saSxlLmdldFVpbnQzMigyMCwhMCksNCw0Mjk0NTg4NzM4KSxpPWwoaSxuLHIsbyxlLmdldFVpbnQzMigzMiwhMCksMTEsMjI3MjM5MjgzMyksbz1sKG8saSxuLHIsZS5nZXRVaW50MzIoNDQsITApLDE2LDE4MzkwMzA1NjIpLHI9bChyLG8saSxuLGUuZ2V0VWludDMyKDU2LCEwKSwyMyw0MjU5NjU3NzQwKSxuPWwobixyLG8saSxlLmdldFVpbnQzMig0LCEwKSw0LDI3NjM5NzUyMzYpLGk9bChpLG4scixvLGUuZ2V0VWludDMyKDE2LCEwKSwxMSwxMjcyODkzMzUzKSxvPWwobyxpLG4scixlLmdldFVpbnQzMigyOCwhMCksMTYsNDEzOTQ2OTY2NCkscj1sKHIsbyxpLG4sZS5nZXRVaW50MzIoNDAsITApLDIzLDMyMDAyMzY2NTYpLG49bChuLHIsbyxpLGUuZ2V0VWludDMyKDUyLCEwKSw0LDY4MTI3OTE3NCksaT1sKGksbixyLG8sZS5nZXRVaW50MzIoMCwhMCksMTEsMzkzNjQzMDA3NCksbz1sKG8saSxuLHIsZS5nZXRVaW50MzIoMTIsITApLDE2LDM1NzI0NDUzMTcpLHI9bChyLG8saSxuLGUuZ2V0VWludDMyKDI0LCEwKSwyMyw3NjAyOTE4OSksbj1sKG4scixvLGksZS5nZXRVaW50MzIoMzYsITApLDQsMzY1NDYwMjgwOSksaT1sKGksbixyLG8sZS5nZXRVaW50MzIoNDgsITApLDExLDM4NzMxNTE0NjEpLG89bChvLGksbixyLGUuZ2V0VWludDMyKDYwLCEwKSwxNiw1MzA3NDI1MjApLG49cChuLHI9bChyLG8saSxuLGUuZ2V0VWludDMyKDgsITApLDIzLDMyOTk2Mjg2NDUpLG8saSxlLmdldFVpbnQzMigwLCEwKSw2LDQwOTYzMzY0NTIpLGk9cChpLG4scixvLGUuZ2V0VWludDMyKDI4LCEwKSwxMCwxMTI2ODkxNDE1KSxvPXAobyxpLG4scixlLmdldFVpbnQzMig1NiwhMCksMTUsMjg3ODYxMjM5MSkscj1wKHIsbyxpLG4sZS5nZXRVaW50MzIoMjAsITApLDIxLDQyMzc1MzMyNDEpLG49cChuLHIsbyxpLGUuZ2V0VWludDMyKDQ4LCEwKSw2LDE3MDA0ODU1NzEpLGk9cChpLG4scixvLGUuZ2V0VWludDMyKDEyLCEwKSwxMCwyMzk5OTgwNjkwKSxvPXAobyxpLG4scixlLmdldFVpbnQzMig0MCwhMCksMTUsNDI5MzkxNTc3Mykscj1wKHIsbyxpLG4sZS5nZXRVaW50MzIoNCwhMCksMjEsMjI0MDA0NDQ5Nyksbj1wKG4scixvLGksZS5nZXRVaW50MzIoMzIsITApLDYsMTg3MzMxMzM1OSksaT1wKGksbixyLG8sZS5nZXRVaW50MzIoNjAsITApLDEwLDQyNjQzNTU1NTIpLG89cChvLGksbixyLGUuZ2V0VWludDMyKDI0LCEwKSwxNSwyNzM0NzY4OTE2KSxyPXAocixvLGksbixlLmdldFVpbnQzMig1MiwhMCksMjEsMTMwOTE1MTY0OSksbj1wKG4scixvLGksZS5nZXRVaW50MzIoMTYsITApLDYsNDE0OTQ0NDIyNiksaT1wKGksbixyLG8sZS5nZXRVaW50MzIoNDQsITApLDEwLDMxNzQ3NTY5MTcpLG89cChvLGksbixyLGUuZ2V0VWludDMyKDgsITApLDE1LDcxODc4NzI1OSkscj1wKHIsbyxpLG4sZS5nZXRVaW50MzIoMzYsITApLDIxLDM5NTE0ODE3NDUpLHRbMF09bit0WzBdJjQyOTQ5NjcyOTUsdFsxXT1yK3RbMV0mNDI5NDk2NzI5NSx0WzJdPW8rdFsyXSY0Mjk0OTY3Mjk1LHRbM109aSt0WzNdJjQyOTQ5NjcyOTV9fSx7Ii4vYnJvd3Nlckhhc2hVdGlscyI6MTEsImJ1ZmZlci8iOjg3fV0sMTQ6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCJidWZmZXIvIikuQnVmZmVyLG89ZSgiLi9icm93c2VySGFzaFV0aWxzIik7ZnVuY3Rpb24gaSgpe3RoaXMuaDA9MTczMjU4NDE5Myx0aGlzLmgxPTQwMjMyMzM0MTcsdGhpcy5oMj0yNTYyMzgzMTAyLHRoaXMuaDM9MjcxNzMzODc4LHRoaXMuaDQ9MzI4NTM3NzUyMCx0aGlzLmJsb2NrPW5ldyBVaW50MzJBcnJheSg4MCksdGhpcy5vZmZzZXQ9MCx0aGlzLnNoaWZ0PTI0LHRoaXMudG90YWxMZW5ndGg9MH1uZXcgVWludDMyQXJyYXkoWzE1MTg1MDAyNDksMTg1OTc3NTM5MywtMTg5NDAwNzU4OCwtODk5NDk3NTE0XSksTWF0aC5wb3coMiw1MyksdC5leHBvcnRzPWksaS5CTE9DS19TSVpFPTY0LGkucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlKXtpZih0aGlzLmZpbmlzaGVkKXRocm93IG5ldyBFcnJvcigiQXR0ZW1wdGVkIHRvIHVwZGF0ZSBhbiBhbHJlYWR5IGZpbmlzaGVkIGhhc2guIik7aWYoby5pc0VtcHR5RGF0YShlKSlyZXR1cm4gdGhpczt2YXIgdD0oZT1vLmNvbnZlcnRUb0J1ZmZlcihlKSkubGVuZ3RoO3RoaXMudG90YWxMZW5ndGgrPTgqdDtmb3IodmFyIG49MDtuPHQ7bisrKXRoaXMud3JpdGUoZVtuXSk7cmV0dXJuIHRoaXN9LGkucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKGUpe3RoaXMuYmxvY2tbdGhpcy5vZmZzZXRdfD0oMjU1JmUpPDx0aGlzLnNoaWZ0LHRoaXMuc2hpZnQ/dGhpcy5zaGlmdC09ODoodGhpcy5vZmZzZXQrKyx0aGlzLnNoaWZ0PTI0KSwxNj09PXRoaXMub2Zmc2V0JiZ0aGlzLnByb2Nlc3NCbG9jaygpfSxpLnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24oZSl7dGhpcy53cml0ZSgxMjgpLCh0aGlzLm9mZnNldD4xNHx8MTQ9PT10aGlzLm9mZnNldCYmdGhpcy5zaGlmdDwyNCkmJnRoaXMucHJvY2Vzc0Jsb2NrKCksdGhpcy5vZmZzZXQ9MTQsdGhpcy5zaGlmdD0yNCx0aGlzLndyaXRlKDApLHRoaXMud3JpdGUoMCksdGhpcy53cml0ZSh0aGlzLnRvdGFsTGVuZ3RoPjB4ZmZmZmZmZmZmZj90aGlzLnRvdGFsTGVuZ3RoLzEwOTk1MTE2Mjc3NzY6MCksdGhpcy53cml0ZSh0aGlzLnRvdGFsTGVuZ3RoPjQyOTQ5NjcyOTU/dGhpcy50b3RhbExlbmd0aC80Mjk0OTY3Mjk2OjApO2Zvcih2YXIgdD0yNDt0Pj0wO3QtPTgpdGhpcy53cml0ZSh0aGlzLnRvdGFsTGVuZ3RoPj50KTt2YXIgbj1uZXcgcigyMCksbz1uZXcgRGF0YVZpZXcobi5idWZmZXIpO3JldHVybiBvLnNldFVpbnQzMigwLHRoaXMuaDAsITEpLG8uc2V0VWludDMyKDQsdGhpcy5oMSwhMSksby5zZXRVaW50MzIoOCx0aGlzLmgyLCExKSxvLnNldFVpbnQzMigxMix0aGlzLmgzLCExKSxvLnNldFVpbnQzMigxNix0aGlzLmg0LCExKSxlP24udG9TdHJpbmcoZSk6bn0saS5wcm90b3R5cGUucHJvY2Vzc0Jsb2NrPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTE2O2U8ODA7ZSsrKXt2YXIgdD10aGlzLmJsb2NrW2UtM11edGhpcy5ibG9ja1tlLThdXnRoaXMuYmxvY2tbZS0xNF1edGhpcy5ibG9ja1tlLTE2XTt0aGlzLmJsb2NrW2VdPXQ8PDF8dD4+PjMxfXZhciBuLHIsbz10aGlzLmgwLGk9dGhpcy5oMSxzPXRoaXMuaDIsYT10aGlzLmgzLGM9dGhpcy5oNDtmb3IoZT0wO2U8ODA7ZSsrKXtlPDIwPyhuPWFeaSYoc15hKSxyPTE1MTg1MDAyNDkpOmU8NDA/KG49aV5zXmEscj0xODU5Nzc1MzkzKTplPDYwPyhuPWkmc3xhJihpfHMpLHI9MjQwMDk1OTcwOCk6KG49aV5zXmEscj0zMzk1NDY5NzgyKTt2YXIgdT0obzw8NXxvPj4+MjcpK24rYytyKygwfHRoaXMuYmxvY2tbZV0pO2M9YSxhPXMscz1pPDwzMHxpPj4+MixpPW8sbz11fWZvcih0aGlzLmgwPXRoaXMuaDArb3wwLHRoaXMuaDE9dGhpcy5oMStpfDAsdGhpcy5oMj10aGlzLmgyK3N8MCx0aGlzLmgzPXRoaXMuaDMrYXwwLHRoaXMuaDQ9dGhpcy5oNCtjfDAsdGhpcy5vZmZzZXQ9MCxlPTA7ZTwxNjtlKyspdGhpcy5ibG9ja1tlXT0wfX0seyIuL2Jyb3dzZXJIYXNoVXRpbHMiOjExLCJidWZmZXIvIjo4N31dLDE1OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiYnVmZmVyLyIpLkJ1ZmZlcixvPWUoIi4vYnJvd3Nlckhhc2hVdGlscyIpLGk9NjQscz1uZXcgVWludDMyQXJyYXkoWzExMTYzNTI0MDgsMTg5OTQ0NzQ0MSwzMDQ5MzIzNDcxLDM5MjEwMDk1NzMsOTYxOTg3MTYzLDE1MDg5NzA5OTMsMjQ1MzYzNTc0OCwyODcwNzYzMjIxLDM2MjQzODEwODAsMzEwNTk4NDAxLDYwNzIyNTI3OCwxNDI2ODgxOTg3LDE5MjUwNzgzODgsMjE2MjA3ODIwNiwyNjE0ODg4MTAzLDMyNDgyMjI1ODAsMzgzNTM5MDQwMSw0MDIyMjI0Nzc0LDI2NDM0NzA3OCw2MDQ4MDc2MjgsNzcwMjU1OTgzLDEyNDkxNTAxMjIsMTU1NTA4MTY5MiwxOTk2MDY0OTg2LDI1NTQyMjA4ODIsMjgyMTgzNDM0OSwyOTUyOTk2ODA4LDMyMTAzMTM2NzEsMzMzNjU3MTg5MSwzNTg0NTI4NzExLDExMzkyNjk5MywzMzgyNDE4OTUsNjY2MzA3MjA1LDc3MzUyOTkxMiwxMjk0NzU3MzcyLDEzOTYxODIyOTEsMTY5NTE4MzcwMCwxOTg2NjYxMDUxLDIxNzcwMjYzNTAsMjQ1Njk1NjAzNywyNzMwNDg1OTIxLDI4MjAzMDI0MTEsMzI1OTczMDgwMCwzMzQ1NzY0NzcxLDM1MTYwNjU4MTcsMzYwMDM1MjgwNCw0MDk0NTcxOTA5LDI3NTQyMzM0NCw0MzAyMjc3MzQsNTA2OTQ4NjE2LDY1OTA2MDU1Niw4ODM5OTc4NzcsOTU4MTM5NTcxLDEzMjI4MjIyMTgsMTUzNzAwMjA2MywxNzQ3ODczNzc5LDE5NTU1NjIyMjIsMjAyNDEwNDgxNSwyMjI3NzMwNDUyLDIzNjE4NTI0MjQsMjQyODQzNjQ3NCwyNzU2NzM0MTg3LDMyMDQwMzE0NzksMzMyOTMyNTI5OF0pLGE9TWF0aC5wb3coMiw1MyktMTtmdW5jdGlvbiBjKCl7dGhpcy5zdGF0ZT1bMTc3OTAzMzcwMywzMTQ0MTM0Mjc3LDEwMTM5MDQyNDIsMjc3MzQ4MDc2MiwxMzU5ODkzMTE5LDI2MDA4MjI5MjQsNTI4NzM0NjM1LDE1NDE0NTkyMjVdLHRoaXMudGVtcD1uZXcgSW50MzJBcnJheSg2NCksdGhpcy5idWZmZXI9bmV3IFVpbnQ4QXJyYXkoNjQpLHRoaXMuYnVmZmVyTGVuZ3RoPTAsdGhpcy5ieXRlc0hhc2hlZD0wLHRoaXMuZmluaXNoZWQ9ITF9dC5leHBvcnRzPWMsYy5CTE9DS19TSVpFPWksYy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUpe2lmKHRoaXMuZmluaXNoZWQpdGhyb3cgbmV3IEVycm9yKCJBdHRlbXB0ZWQgdG8gdXBkYXRlIGFuIGFscmVhZHkgZmluaXNoZWQgaGFzaC4iKTtpZihvLmlzRW1wdHlEYXRhKGUpKXJldHVybiB0aGlzO3ZhciB0PTAsbj0oZT1vLmNvbnZlcnRUb0J1ZmZlcihlKSkuYnl0ZUxlbmd0aDtpZih0aGlzLmJ5dGVzSGFzaGVkKz1uLDgqdGhpcy5ieXRlc0hhc2hlZD5hKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGhhc2ggbW9yZSB0aGFuIDJeNTMgLSAxIGJpdHMiKTtmb3IoO24+MDspdGhpcy5idWZmZXJbdGhpcy5idWZmZXJMZW5ndGgrK109ZVt0KytdLG4tLSx0aGlzLmJ1ZmZlckxlbmd0aD09PWkmJih0aGlzLmhhc2hCdWZmZXIoKSx0aGlzLmJ1ZmZlckxlbmd0aD0wKTtyZXR1cm4gdGhpc30sYy5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKGUpe2lmKCF0aGlzLmZpbmlzaGVkKXt2YXIgdD04KnRoaXMuYnl0ZXNIYXNoZWQsbj1uZXcgRGF0YVZpZXcodGhpcy5idWZmZXIuYnVmZmVyLHRoaXMuYnVmZmVyLmJ5dGVPZmZzZXQsdGhpcy5idWZmZXIuYnl0ZUxlbmd0aCksbz10aGlzLmJ1ZmZlckxlbmd0aDtpZihuLnNldFVpbnQ4KHRoaXMuYnVmZmVyTGVuZ3RoKyssMTI4KSxvJWk+PTU2KXtmb3IodmFyIHM9dGhpcy5idWZmZXJMZW5ndGg7czxpO3MrKyluLnNldFVpbnQ4KHMsMCk7dGhpcy5oYXNoQnVmZmVyKCksdGhpcy5idWZmZXJMZW5ndGg9MH1mb3Iocz10aGlzLmJ1ZmZlckxlbmd0aDtzPDU2O3MrKyluLnNldFVpbnQ4KHMsMCk7bi5zZXRVaW50MzIoNTYsTWF0aC5mbG9vcih0LzQyOTQ5NjcyOTYpLCEwKSxuLnNldFVpbnQzMig2MCx0KSx0aGlzLmhhc2hCdWZmZXIoKSx0aGlzLmZpbmlzaGVkPSEwfXZhciBhPW5ldyByKDMyKTtmb3Iocz0wO3M8ODtzKyspYVs0KnNdPXRoaXMuc3RhdGVbc10+Pj4yNCYyNTUsYVs0KnMrMV09dGhpcy5zdGF0ZVtzXT4+PjE2JjI1NSxhWzQqcysyXT10aGlzLnN0YXRlW3NdPj4+OCYyNTUsYVs0KnMrM109dGhpcy5zdGF0ZVtzXT4+PjAmMjU1O3JldHVybiBlP2EudG9TdHJpbmcoZSk6YX0sYy5wcm90b3R5cGUuaGFzaEJ1ZmZlcj1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLmJ1ZmZlcix0PXRoaXMuc3RhdGUsbj10WzBdLHI9dFsxXSxvPXRbMl0sYT10WzNdLGM9dFs0XSx1PXRbNV0sbD10WzZdLHA9dFs3XSxkPTA7ZDxpO2QrKyl7aWYoZDwxNil0aGlzLnRlbXBbZF09KDI1NSZlWzQqZF0pPDwyNHwoMjU1JmVbNCpkKzFdKTw8MTZ8KDI1NSZlWzQqZCsyXSk8PDh8MjU1JmVbNCpkKzNdO2Vsc2V7dmFyIGg9dGhpcy50ZW1wW2QtMl0sZj0oaD4+PjE3fGg8PDE1KV4oaD4+PjE5fGg8PDEzKV5oPj4+MTAsZz0oKGg9dGhpcy50ZW1wW2QtMTVdKT4+Pjd8aDw8MjUpXihoPj4+MTh8aDw8MTQpXmg+Pj4zO3RoaXMudGVtcFtkXT0oZit0aGlzLnRlbXBbZC03XXwwKSsoZyt0aGlzLnRlbXBbZC0xNl18MCl9dmFyIG09KCgoYz4+PjZ8Yzw8MjYpXihjPj4+MTF8Yzw8MjEpXihjPj4+MjV8Yzw8NykpKyhjJnVefmMmbCl8MCkrKHArKHNbZF0rdGhpcy50ZW1wW2RdfDApfDApfDAsdj0oKG4+Pj4yfG48PDMwKV4obj4+PjEzfG48PDE5KV4obj4+PjIyfG48PDEwKSkrKG4mcl5uJm9eciZvKXwwO3A9bCxsPXUsdT1jLGM9YSttfDAsYT1vLG89cixyPW4sbj1tK3Z8MH10WzBdKz1uLHRbMV0rPXIsdFsyXSs9byx0WzNdKz1hLHRbNF0rPWMsdFs1XSs9dSx0WzZdKz1sLHRbN10rPXB9fSx7Ii4vYnJvd3Nlckhhc2hVdGlscyI6MTEsImJ1ZmZlci8iOjg3fV0sMTY6W2Z1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24obil7KGZ1bmN0aW9uKCl7dmFyIG49ZSgiLi91dGlsIik7bi5jcnlwdG8ubGliPWUoIi4vYnJvd3NlckNyeXB0b0xpYiIpLG4uQnVmZmVyPWUoImJ1ZmZlci8iKS5CdWZmZXIsbi51cmw9ZSgidXJsLyIpLG4ucXVlcnlzdHJpbmc9ZSgicXVlcnlzdHJpbmcvIiksbi5yZWFsQ2xvY2s9ZSgiLi9yZWFsY2xvY2svYnJvd3NlckNsb2NrIiksbi5lbnZpcm9ubWVudD0ianMiLG4uY3JlYXRlRXZlbnRTdHJlYW09ZSgiLi9ldmVudC1zdHJlYW0vYnVmZmVyZWQtY3JlYXRlLWV2ZW50LXN0cmVhbSIpLmNyZWF0ZUV2ZW50U3RyZWFtLG4uaXNCcm93c2VyPWZ1bmN0aW9uKCl7cmV0dXJuITB9LG4uaXNOb2RlPWZ1bmN0aW9uKCl7cmV0dXJuITF9O3ZhciByPWUoIi4vY29yZSIpO2lmKHQuZXhwb3J0cz1yLGUoIi4vY3JlZGVudGlhbHMiKSxlKCIuL2NyZWRlbnRpYWxzL2NyZWRlbnRpYWxfcHJvdmlkZXJfY2hhaW4iKSxlKCIuL2NyZWRlbnRpYWxzL3RlbXBvcmFyeV9jcmVkZW50aWFscyIpLGUoIi4vY3JlZGVudGlhbHMvY2hhaW5hYmxlX3RlbXBvcmFyeV9jcmVkZW50aWFscyIpLGUoIi4vY3JlZGVudGlhbHMvd2ViX2lkZW50aXR5X2NyZWRlbnRpYWxzIiksZSgiLi9jcmVkZW50aWFscy9jb2duaXRvX2lkZW50aXR5X2NyZWRlbnRpYWxzIiksZSgiLi9jcmVkZW50aWFscy9zYW1sX2NyZWRlbnRpYWxzIiksci5YTUwuUGFyc2VyPWUoIi4veG1sL2Jyb3dzZXJfcGFyc2VyIiksZSgiLi9odHRwL3hociIpLHZvaWQgMD09PW8pdmFyIG89e2Jyb3dzZXI6ITB9fSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpKX0seyIuL2Jyb3dzZXJDcnlwdG9MaWIiOjEwLCIuL2NvcmUiOjE5LCIuL2NyZWRlbnRpYWxzIjoyMCwiLi9jcmVkZW50aWFscy9jaGFpbmFibGVfdGVtcG9yYXJ5X2NyZWRlbnRpYWxzIjoyMSwiLi9jcmVkZW50aWFscy9jb2duaXRvX2lkZW50aXR5X2NyZWRlbnRpYWxzIjoyMiwiLi9jcmVkZW50aWFscy9jcmVkZW50aWFsX3Byb3ZpZGVyX2NoYWluIjoyMywiLi9jcmVkZW50aWFscy9zYW1sX2NyZWRlbnRpYWxzIjoyNCwiLi9jcmVkZW50aWFscy90ZW1wb3JhcnlfY3JlZGVudGlhbHMiOjI1LCIuL2NyZWRlbnRpYWxzL3dlYl9pZGVudGl0eV9jcmVkZW50aWFscyI6MjYsIi4vZXZlbnQtc3RyZWFtL2J1ZmZlcmVkLWNyZWF0ZS1ldmVudC1zdHJlYW0iOjI4LCIuL2h0dHAveGhyIjozNiwiLi9yZWFsY2xvY2svYnJvd3NlckNsb2NrIjo1NCwiLi91dGlsIjo3NCwiLi94bWwvYnJvd3Nlcl9wYXJzZXIiOjc1LF9wcm9jZXNzOjkyLCJidWZmZXIvIjo4NywicXVlcnlzdHJpbmcvIjo5OCwidXJsLyI6MTAwfV0sMTc6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcixvPWUoIi4vY29yZSIpO2UoIi4vY3JlZGVudGlhbHMiKSxlKCIuL2NyZWRlbnRpYWxzL2NyZWRlbnRpYWxfcHJvdmlkZXJfY2hhaW4iKSxvLkNvbmZpZz1vLnV0aWwuaW5oZXJpdCh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pLGU9dGhpcy5leHRyYWN0Q3JlZGVudGlhbHMoZSksby51dGlsLmVhY2guY2FsbCh0aGlzLHRoaXMua2V5cywoZnVuY3Rpb24odCxuKXt0aGlzLnNldCh0LGVbdF0sbil9KSl9LGdldENyZWRlbnRpYWxzOmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcztmdW5jdGlvbiByKHQpe2UodCx0P251bGw6bi5jcmVkZW50aWFscyl9ZnVuY3Rpb24gaShlLHQpe3JldHVybiBuZXcgby51dGlsLmVycm9yKHR8fG5ldyBFcnJvcix7Y29kZToiQ3JlZGVudGlhbHNFcnJvciIsbWVzc2FnZTplLG5hbWU6IkNyZWRlbnRpYWxzRXJyb3IifSl9bi5jcmVkZW50aWFscz8iZnVuY3Rpb24iPT10eXBlb2Ygbi5jcmVkZW50aWFscy5nZXQ/bi5jcmVkZW50aWFscy5nZXQoKGZ1bmN0aW9uKGUpe2UmJihlPWkoIkNvdWxkIG5vdCBsb2FkIGNyZWRlbnRpYWxzIGZyb20gIituLmNyZWRlbnRpYWxzLmNvbnN0cnVjdG9yLm5hbWUsZSkpLHIoZSl9KSk6KHQ9bnVsbCxuLmNyZWRlbnRpYWxzLmFjY2Vzc0tleUlkJiZuLmNyZWRlbnRpYWxzLnNlY3JldEFjY2Vzc0tleXx8KHQ9aSgiTWlzc2luZyBjcmVkZW50aWFscyIpKSxyKHQpKTpuLmNyZWRlbnRpYWxQcm92aWRlcj9uLmNyZWRlbnRpYWxQcm92aWRlci5yZXNvbHZlKChmdW5jdGlvbihlLHQpe2UmJihlPWkoIkNvdWxkIG5vdCBsb2FkIGNyZWRlbnRpYWxzIGZyb20gYW55IHByb3ZpZGVycyIsZSkpLG4uY3JlZGVudGlhbHM9dCxyKGUpfSkpOnIoaSgiTm8gY3JlZGVudGlhbHMgdG8gbG9hZCIpKX0sZ2V0VG9rZW46ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzO2Z1bmN0aW9uIHIodCl7ZSh0LHQ/bnVsbDpuLnRva2VuKX1mdW5jdGlvbiBpKGUsdCl7cmV0dXJuIG5ldyBvLnV0aWwuZXJyb3IodHx8bmV3IEVycm9yLHtjb2RlOiJUb2tlbkVycm9yIixtZXNzYWdlOmUsbmFtZToiVG9rZW5FcnJvciJ9KX1uLnRva2VuPyJmdW5jdGlvbiI9PXR5cGVvZiBuLnRva2VuLmdldD9uLnRva2VuLmdldCgoZnVuY3Rpb24oZSl7ZSYmKGU9aSgiQ291bGQgbm90IGxvYWQgdG9rZW4gZnJvbSAiK24udG9rZW4uY29uc3RydWN0b3IubmFtZSxlKSkscihlKX0pKToodD1udWxsLG4udG9rZW4udG9rZW58fCh0PWkoIk1pc3NpbmcgdG9rZW4iKSkscih0KSk6bi50b2tlblByb3ZpZGVyP24udG9rZW5Qcm92aWRlci5yZXNvbHZlKChmdW5jdGlvbihlLHQpe2UmJihlPWkoIkNvdWxkIG5vdCBsb2FkIHRva2VuIGZyb20gYW55IHByb3ZpZGVycyIsZSkpLG4udG9rZW49dCxyKGUpfSkpOnIoaSgiTm8gdG9rZW4gdG8gbG9hZCIpKX0sdXBkYXRlOmZ1bmN0aW9uKGUsdCl7dD10fHwhMSxlPXRoaXMuZXh0cmFjdENyZWRlbnRpYWxzKGUpLG8udXRpbC5lYWNoLmNhbGwodGhpcyxlLChmdW5jdGlvbihlLG4peyh0fHxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5rZXlzLGUpfHxvLlNlcnZpY2UuaGFzU2VydmljZShlKSkmJnRoaXMuc2V0KGUsbil9KSl9LGxvYWRGcm9tUGF0aDpmdW5jdGlvbihlKXt0aGlzLmNsZWFyKCk7dmFyIHQ9SlNPTi5wYXJzZShvLnV0aWwucmVhZEZpbGVTeW5jKGUpKSxuPW5ldyBvLkZpbGVTeXN0ZW1DcmVkZW50aWFscyhlKSxyPW5ldyBvLkNyZWRlbnRpYWxQcm92aWRlckNoYWluO3JldHVybiByLnByb3ZpZGVycy51bnNoaWZ0KG4pLHIucmVzb2x2ZSgoZnVuY3Rpb24oZSxuKXtpZihlKXRocm93IGU7dC5jcmVkZW50aWFscz1ufSkpLHRoaXMuY29uc3RydWN0b3IodCksdGhpc30sY2xlYXI6ZnVuY3Rpb24oKXtvLnV0aWwuZWFjaC5jYWxsKHRoaXMsdGhpcy5rZXlzLChmdW5jdGlvbihlKXtkZWxldGUgdGhpc1tlXX0pKSx0aGlzLnNldCgiY3JlZGVudGlhbHMiLHZvaWQgMCksdGhpcy5zZXQoImNyZWRlbnRpYWxQcm92aWRlciIsdm9pZCAwKX0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2b2lkIDA9PT10Pyh2b2lkIDA9PT1uJiYobj10aGlzLmtleXNbZV0pLHRoaXNbZV09ImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5jYWxsKHRoaXMpOm4pOiJodHRwT3B0aW9ucyI9PT1lJiZ0aGlzW2VdP3RoaXNbZV09by51dGlsLm1lcmdlKHRoaXNbZV0sdCk6dGhpc1tlXT10fSxrZXlzOntjcmVkZW50aWFsczpudWxsLGNyZWRlbnRpYWxQcm92aWRlcjpudWxsLHJlZ2lvbjpudWxsLGxvZ2dlcjpudWxsLGFwaVZlcnNpb25zOnt9LGFwaVZlcnNpb246bnVsbCxlbmRwb2ludDp2b2lkIDAsaHR0cE9wdGlvbnM6e3RpbWVvdXQ6MTJlNH0sbWF4UmV0cmllczp2b2lkIDAsbWF4UmVkaXJlY3RzOjEwLHBhcmFtVmFsaWRhdGlvbjohMCxzc2xFbmFibGVkOiEwLHMzRm9yY2VQYXRoU3R5bGU6ITEsczNCdWNrZXRFbmRwb2ludDohMSxzM0Rpc2FibGVCb2R5U2lnbmluZzohMCxzM1VzRWFzdDFSZWdpb25hbEVuZHBvaW50OiJsZWdhY3kiLHMzVXNlQXJuUmVnaW9uOnZvaWQgMCxjb21wdXRlQ2hlY2tzdW1zOiEwLGNvbnZlcnRSZXNwb25zZVR5cGVzOiEwLGNvcnJlY3RDbG9ja1NrZXc6ITEsY3VzdG9tVXNlckFnZW50Om51bGwsZHluYW1vRGJDcmMzMjohMCxzeXN0ZW1DbG9ja09mZnNldDowLHNpZ25hdHVyZVZlcnNpb246bnVsbCxzaWduYXR1cmVDYWNoZTohMCxyZXRyeURlbGF5T3B0aW9uczp7fSx1c2VBY2NlbGVyYXRlRW5kcG9pbnQ6ITEsY2xpZW50U2lkZU1vbml0b3Jpbmc6ITEsZW5kcG9pbnREaXNjb3ZlcnlFbmFibGVkOnZvaWQgMCxlbmRwb2ludENhY2hlU2l6ZToxZTMsaG9zdFByZWZpeEVuYWJsZWQ6ITAsc3RzUmVnaW9uYWxFbmRwb2ludHM6ImxlZ2FjeSIsdXNlRmlwc0VuZHBvaW50OiExLHVzZUR1YWxzdGFja0VuZHBvaW50OiExLHRva2VuOm51bGx9LGV4dHJhY3RDcmVkZW50aWFsczpmdW5jdGlvbihlKXtyZXR1cm4gZS5hY2Nlc3NLZXlJZCYmZS5zZWNyZXRBY2Nlc3NLZXkmJigoZT1vLnV0aWwuY29weShlKSkuY3JlZGVudGlhbHM9bmV3IG8uQ3JlZGVudGlhbHMoZSkpLGV9LHNldFByb21pc2VzRGVwZW5kZW5jeTpmdW5jdGlvbihlKXtyPWUsbnVsbD09PWUmJiJmdW5jdGlvbiI9PXR5cGVvZiBQcm9taXNlJiYocj1Qcm9taXNlKTt2YXIgdD1bby5SZXF1ZXN0LG8uQ3JlZGVudGlhbHMsby5DcmVkZW50aWFsUHJvdmlkZXJDaGFpbl07by5TMyYmKHQucHVzaChvLlMzKSxvLlMzLk1hbmFnZWRVcGxvYWQmJnQucHVzaChvLlMzLk1hbmFnZWRVcGxvYWQpKSxvLnV0aWwuYWRkUHJvbWlzZXModCxyKX0sZ2V0UHJvbWlzZXNEZXBlbmRlbmN5OmZ1bmN0aW9uKCl7cmV0dXJuIHJ9fSksby5jb25maWc9bmV3IG8uQ29uZmlnfSx7Ii4vY29yZSI6MTksIi4vY3JlZGVudGlhbHMiOjIwLCIuL2NyZWRlbnRpYWxzL2NyZWRlbnRpYWxfcHJvdmlkZXJfY2hhaW4iOjIzfV0sMTg6W2Z1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24obil7KGZ1bmN0aW9uKCl7dmFyIHI9ZSgiLi9jb3JlIik7ZnVuY3Rpb24gbyhlLHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl7aWYoWyJsZWdhY3kiLCJyZWdpb25hbCJdLmluZGV4T2YoZS50b0xvd2VyQ2FzZSgpKT49MClyZXR1cm4gZS50b0xvd2VyQ2FzZSgpO3Rocm93IHIudXRpbC5lcnJvcihuZXcgRXJyb3IsdCl9fXQuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciBpO2lmKChlPWV8fHt9KVt0LmNsaWVudENvbmZpZ10mJihpPW8oZVt0LmNsaWVudENvbmZpZ10se2NvZGU6IkludmFsaWRDb25maWd1cmF0aW9uIixtZXNzYWdlOidpbnZhbGlkICInK3QuY2xpZW50Q29uZmlnKyciIGNvbmZpZ3VyYXRpb24uIEV4cGVjdCAibGVnYWN5IiAgb3IgInJlZ2lvbmFsIi4gR290ICInK2VbdC5jbGllbnRDb25maWddKyciLid9KSkpcmV0dXJuIGk7aWYoIXIudXRpbC5pc05vZGUoKSlyZXR1cm4gaTtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobi5lbnYsdC5lbnYpJiYoaT1vKG4uZW52W3QuZW52XSx7Y29kZToiSW52YWxpZEVudmlyb25tZW50YWxWYXJpYWJsZSIsbWVzc2FnZToiaW52YWxpZCAiK3QuZW52KycgZW52aXJvbm1lbnRhbCB2YXJpYWJsZS4gRXhwZWN0ICJsZWdhY3kiICBvciAicmVnaW9uYWwiLiBHb3QgIicrbi5lbnZbdC5lbnZdKyciLid9KSkpcmV0dXJuIGk7dmFyIHM9e307dHJ5e3M9ci51dGlsLmdldFByb2ZpbGVzRnJvbVNoYXJlZENvbmZpZyhyLnV0aWwuaW5pTG9hZGVyKVtuLmVudi5BV1NfUFJPRklMRXx8ci51dGlsLmRlZmF1bHRQcm9maWxlXX1jYXRjaChlKXt9cmV0dXJuIHMmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLHQuc2hhcmVkQ29uZmlnKSYmKGk9byhzW3Quc2hhcmVkQ29uZmlnXSx7Y29kZToiSW52YWxpZENvbmZpZ3VyYXRpb24iLG1lc3NhZ2U6ImludmFsaWQgIit0LnNoYXJlZENvbmZpZysnIHByb2ZpbGUgY29uZmlnLiBFeHBlY3QgImxlZ2FjeSIgIG9yICJyZWdpb25hbCIuIEdvdCAiJytzW3Quc2hhcmVkQ29uZmlnXSsnIi4nfSkpLGl9fSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpKX0seyIuL2NvcmUiOjE5LF9wcm9jZXNzOjkyfV0sMTk6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj17dXRpbDplKCIuL3V0aWwiKX07KHt9KS50b1N0cmluZygpLHQuZXhwb3J0cz1yLHIudXRpbC51cGRhdGUocix7VkVSU0lPTjoiMi4xMzc3LjAiLFNpZ25lcnM6e30sUHJvdG9jb2w6e0pzb246ZSgiLi9wcm90b2NvbC9qc29uIiksUXVlcnk6ZSgiLi9wcm90b2NvbC9xdWVyeSIpLFJlc3Q6ZSgiLi9wcm90b2NvbC9yZXN0IiksUmVzdEpzb246ZSgiLi9wcm90b2NvbC9yZXN0X2pzb24iKSxSZXN0WG1sOmUoIi4vcHJvdG9jb2wvcmVzdF94bWwiKX0sWE1MOntCdWlsZGVyOmUoIi4veG1sL2J1aWxkZXIiKSxQYXJzZXI6bnVsbH0sSlNPTjp7QnVpbGRlcjplKCIuL2pzb24vYnVpbGRlciIpLFBhcnNlcjplKCIuL2pzb24vcGFyc2VyIil9LE1vZGVsOntBcGk6ZSgiLi9tb2RlbC9hcGkiKSxPcGVyYXRpb246ZSgiLi9tb2RlbC9vcGVyYXRpb24iKSxTaGFwZTplKCIuL21vZGVsL3NoYXBlIiksUGFnaW5hdG9yOmUoIi4vbW9kZWwvcGFnaW5hdG9yIiksUmVzb3VyY2VXYWl0ZXI6ZSgiLi9tb2RlbC9yZXNvdXJjZV93YWl0ZXIiKX0sYXBpTG9hZGVyOmUoIi4vYXBpX2xvYWRlciIpLEVuZHBvaW50Q2FjaGU6ZSgiLi4vdmVuZG9yL2VuZHBvaW50LWNhY2hlIikuRW5kcG9pbnRDYWNoZX0pLGUoIi4vc2VxdWVudGlhbF9leGVjdXRvciIpLGUoIi4vc2VydmljZSIpLGUoIi4vY29uZmlnIiksZSgiLi9odHRwIiksZSgiLi9ldmVudF9saXN0ZW5lcnMiKSxlKCIuL3JlcXVlc3QiKSxlKCIuL3Jlc3BvbnNlIiksZSgiLi9yZXNvdXJjZV93YWl0ZXIiKSxlKCIuL3NpZ25lcnMvcmVxdWVzdF9zaWduZXIiKSxlKCIuL3BhcmFtX3ZhbGlkYXRvciIpLGUoIi4vbWFpbnRlbmFuY2VfbW9kZV9tZXNzYWdlIiksci5ldmVudHM9bmV3IHIuU2VxdWVudGlhbEV4ZWN1dG9yLHIudXRpbC5tZW1vaXplZFByb3BlcnR5KHIsImVuZHBvaW50Q2FjaGUiLChmdW5jdGlvbigpe3JldHVybiBuZXcgci5FbmRwb2ludENhY2hlKHIuY29uZmlnLmVuZHBvaW50Q2FjaGVTaXplKX0pLCEwKX0seyIuLi92ZW5kb3IvZW5kcG9pbnQtY2FjaGUiOjExMSwiLi9hcGlfbG9hZGVyIjo5LCIuL2NvbmZpZyI6MTcsIi4vZXZlbnRfbGlzdGVuZXJzIjozNCwiLi9odHRwIjozNSwiLi9qc29uL2J1aWxkZXIiOjM3LCIuL2pzb24vcGFyc2VyIjozOCwiLi9tYWludGVuYW5jZV9tb2RlX21lc3NhZ2UiOjM5LCIuL21vZGVsL2FwaSI6NDAsIi4vbW9kZWwvb3BlcmF0aW9uIjo0MiwiLi9tb2RlbC9wYWdpbmF0b3IiOjQzLCIuL21vZGVsL3Jlc291cmNlX3dhaXRlciI6NDQsIi4vbW9kZWwvc2hhcGUiOjQ1LCIuL3BhcmFtX3ZhbGlkYXRvciI6NDYsIi4vcHJvdG9jb2wvanNvbiI6NDgsIi4vcHJvdG9jb2wvcXVlcnkiOjQ5LCIuL3Byb3RvY29sL3Jlc3QiOjUwLCIuL3Byb3RvY29sL3Jlc3RfanNvbiI6NTEsIi4vcHJvdG9jb2wvcmVzdF94bWwiOjUyLCIuL3JlcXVlc3QiOjU4LCIuL3Jlc291cmNlX3dhaXRlciI6NTksIi4vcmVzcG9uc2UiOjYwLCIuL3NlcXVlbnRpYWxfZXhlY3V0b3IiOjYxLCIuL3NlcnZpY2UiOjYyLCIuL3NpZ25lcnMvcmVxdWVzdF9zaWduZXIiOjY2LCIuL3V0aWwiOjc0LCIuL3htbC9idWlsZGVyIjo3Nn1dLDIwOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9jb3JlIik7ci5DcmVkZW50aWFscz1yLnV0aWwuaW5oZXJpdCh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oKXtpZihyLnV0aWwuaGlkZVByb3BlcnRpZXModGhpcyxbInNlY3JldEFjY2Vzc0tleSJdKSx0aGlzLmV4cGlyZWQ9ITEsdGhpcy5leHBpcmVUaW1lPW51bGwsdGhpcy5yZWZyZXNoQ2FsbGJhY2tzPVtdLDE9PT1hcmd1bWVudHMubGVuZ3RoJiYib2JqZWN0Ij09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdLmNyZWRlbnRpYWxzfHxhcmd1bWVudHNbMF07dGhpcy5hY2Nlc3NLZXlJZD1lLmFjY2Vzc0tleUlkLHRoaXMuc2VjcmV0QWNjZXNzS2V5PWUuc2VjcmV0QWNjZXNzS2V5LHRoaXMuc2Vzc2lvblRva2VuPWUuc2Vzc2lvblRva2VufWVsc2UgdGhpcy5hY2Nlc3NLZXlJZD1hcmd1bWVudHNbMF0sdGhpcy5zZWNyZXRBY2Nlc3NLZXk9YXJndW1lbnRzWzFdLHRoaXMuc2Vzc2lvblRva2VuPWFyZ3VtZW50c1syXX0sZXhwaXJ5V2luZG93OjE1LG5lZWRzUmVmcmVzaDpmdW5jdGlvbigpe3ZhciBlPXIudXRpbC5kYXRlLmdldERhdGUoKS5nZXRUaW1lKCksdD1uZXcgRGF0ZShlKzFlMyp0aGlzLmV4cGlyeVdpbmRvdyk7cmV0dXJuISEodGhpcy5leHBpcmVUaW1lJiZ0PnRoaXMuZXhwaXJlVGltZSl8fHRoaXMuZXhwaXJlZHx8IXRoaXMuYWNjZXNzS2V5SWR8fCF0aGlzLnNlY3JldEFjY2Vzc0tleX0sZ2V0OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGhpcy5uZWVkc1JlZnJlc2goKT90aGlzLnJlZnJlc2goKGZ1bmN0aW9uKG4pe258fCh0LmV4cGlyZWQ9ITEpLGUmJmUobil9KSk6ZSYmZSgpfSxyZWZyZXNoOmZ1bmN0aW9uKGUpe3RoaXMuZXhwaXJlZD0hMSxlKCl9LGNvYWxlc2NlUmVmcmVzaDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7MT09PW4ucmVmcmVzaENhbGxiYWNrcy5wdXNoKGUpJiZuLmxvYWQoKGZ1bmN0aW9uKGUpe3IudXRpbC5hcnJheUVhY2gobi5yZWZyZXNoQ2FsbGJhY2tzLChmdW5jdGlvbihuKXt0P24oZSk6ci51dGlsLmRlZmVyKChmdW5jdGlvbigpe24oZSl9KSl9KSksbi5yZWZyZXNoQ2FsbGJhY2tzLmxlbmd0aD0wfSkpfSxsb2FkOmZ1bmN0aW9uKGUpe2UoKX19KSxyLkNyZWRlbnRpYWxzLmFkZFByb21pc2VzVG9DbGFzcz1mdW5jdGlvbihlKXt0aGlzLnByb3RvdHlwZS5nZXRQcm9taXNlPXIudXRpbC5wcm9taXNpZnlNZXRob2QoImdldCIsZSksdGhpcy5wcm90b3R5cGUucmVmcmVzaFByb21pc2U9ci51dGlsLnByb21pc2lmeU1ldGhvZCgicmVmcmVzaCIsZSl9LHIuQ3JlZGVudGlhbHMuZGVsZXRlUHJvbWlzZXNGcm9tQ2xhc3M9ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5wcm90b3R5cGUuZ2V0UHJvbWlzZSxkZWxldGUgdGhpcy5wcm90b3R5cGUucmVmcmVzaFByb21pc2V9LHIudXRpbC5hZGRQcm9taXNlcyhyLkNyZWRlbnRpYWxzKX0seyIuL2NvcmUiOjE5fV0sMjE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1lKCIuLi8uLi9jbGllbnRzL3N0cyIpO3IuQ2hhaW5hYmxlVGVtcG9yYXJ5Q3JlZGVudGlhbHM9ci51dGlsLmluaGVyaXQoci5DcmVkZW50aWFscyx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSl7ci5DcmVkZW50aWFscy5jYWxsKHRoaXMpLGU9ZXx8e30sdGhpcy5lcnJvckNvZGU9IkNoYWluYWJsZVRlbXBvcmFyeUNyZWRlbnRpYWxzUHJvdmlkZXJGYWlsdXJlIix0aGlzLmV4cGlyZWQ9ITAsdGhpcy50b2tlbkNvZGVGbj1udWxsO3ZhciB0PXIudXRpbC5jb3B5KGUucGFyYW1zKXx8e307aWYodC5Sb2xlQXJuJiYodC5Sb2xlU2Vzc2lvbk5hbWU9dC5Sb2xlU2Vzc2lvbk5hbWV8fCJ0ZW1wb3JhcnktY3JlZGVudGlhbHMiKSx0LlNlcmlhbE51bWJlcil7aWYoIWUudG9rZW5Db2RlRm58fCJmdW5jdGlvbiIhPXR5cGVvZiBlLnRva2VuQ29kZUZuKXRocm93IG5ldyByLnV0aWwuZXJyb3IobmV3IEVycm9yKCJ0b2tlbkNvZGVGbiBtdXN0IGJlIGEgZnVuY3Rpb24gd2hlbiBwYXJhbXMuU2VyaWFsTnVtYmVyIGlzIGdpdmVuIikse2NvZGU6dGhpcy5lcnJvckNvZGV9KTt0aGlzLnRva2VuQ29kZUZuPWUudG9rZW5Db2RlRm59dmFyIG49ci51dGlsLm1lcmdlKHtwYXJhbXM6dCxjcmVkZW50aWFsczplLm1hc3RlckNyZWRlbnRpYWxzfHxyLmNvbmZpZy5jcmVkZW50aWFsc30sZS5zdHNDb25maWd8fHt9KTt0aGlzLnNlcnZpY2U9bmV3IG8obil9LHJlZnJlc2g6ZnVuY3Rpb24oZSl7dGhpcy5jb2FsZXNjZVJlZnJlc2goZXx8ci51dGlsLmZuLmNhbGxiYWNrKX0sbG9hZDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49dC5zZXJ2aWNlLmNvbmZpZy5wYXJhbXMuUm9sZUFybj8iYXNzdW1lUm9sZSI6ImdldFNlc3Npb25Ub2tlbiI7dGhpcy5nZXRUb2tlbkNvZGUoKGZ1bmN0aW9uKHIsbyl7dmFyIGk9e307cj9lKHIpOihvJiYoaS5Ub2tlbkNvZGU9byksdC5zZXJ2aWNlW25dKGksKGZ1bmN0aW9uKG4scil7bnx8dC5zZXJ2aWNlLmNyZWRlbnRpYWxzRnJvbShyLHQpLGUobil9KSkpfSkpfSxnZXRUb2tlbkNvZGU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLnRva2VuQ29kZUZuP3RoaXMudG9rZW5Db2RlRm4odGhpcy5zZXJ2aWNlLmNvbmZpZy5wYXJhbXMuU2VyaWFsTnVtYmVyLChmdW5jdGlvbihuLG8pe2lmKG4pe3ZhciBpPW47cmV0dXJuIG4gaW5zdGFuY2VvZiBFcnJvciYmKGk9bi5tZXNzYWdlKSx2b2lkIGUoci51dGlsLmVycm9yKG5ldyBFcnJvcigiRXJyb3IgZmV0Y2hpbmcgTUZBIHRva2VuOiAiK2kpLHtjb2RlOnQuZXJyb3JDb2RlfSkpfWUobnVsbCxvKX0pKTplKG51bGwpfX0pfSx7Ii4uLy4uL2NsaWVudHMvc3RzIjo4LCIuLi9jb3JlIjoxOX1dLDIyOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ZSgiLi4vLi4vY2xpZW50cy9jb2duaXRvaWRlbnRpdHkiKSxpPWUoIi4uLy4uL2NsaWVudHMvc3RzIik7ci5Db2duaXRvSWRlbnRpdHlDcmVkZW50aWFscz1yLnV0aWwuaW5oZXJpdChyLkNyZWRlbnRpYWxzLHtsb2NhbFN0b3JhZ2VLZXk6e2lkOiJhd3MuY29nbml0by5pZGVudGl0eS1pZC4iLHByb3ZpZGVyczoiYXdzLmNvZ25pdG8uaWRlbnRpdHktcHJvdmlkZXJzLiJ9LGNvbnN0cnVjdG9yOmZ1bmN0aW9uKGUsdCl7ci5DcmVkZW50aWFscy5jYWxsKHRoaXMpLHRoaXMuZXhwaXJlZD0hMCx0aGlzLnBhcmFtcz1lLHRoaXMuZGF0YT1udWxsLHRoaXMuX2lkZW50aXR5SWQ9bnVsbCx0aGlzLl9jbGllbnRDb25maWc9ci51dGlsLmNvcHkodHx8e30pLHRoaXMubG9hZENhY2hlZElkKCk7dmFyIG49dGhpcztPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWRlbnRpdHlJZCIse2dldDpmdW5jdGlvbigpe3JldHVybiBuLmxvYWRDYWNoZWRJZCgpLG4uX2lkZW50aXR5SWR8fG4ucGFyYW1zLklkZW50aXR5SWR9LHNldDpmdW5jdGlvbihlKXtuLl9pZGVudGl0eUlkPWV9fSl9LHJlZnJlc2g6ZnVuY3Rpb24oZSl7dGhpcy5jb2FsZXNjZVJlZnJlc2goZXx8ci51dGlsLmZuLmNhbGxiYWNrKX0sbG9hZDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3QuY3JlYXRlQ2xpZW50cygpLHQuZGF0YT1udWxsLHQuX2lkZW50aXR5SWQ9bnVsbCx0LmdldElkKChmdW5jdGlvbihuKXtuPyh0LmNsZWFySWRPbk5vdEF1dGhvcml6ZWQobiksZShuKSk6dC5wYXJhbXMuUm9sZUFybj90LmdldENyZWRlbnRpYWxzRnJvbVNUUyhlKTp0LmdldENyZWRlbnRpYWxzRm9ySWRlbnRpdHkoZSl9KSl9LGNsZWFyQ2FjaGVkSWQ6ZnVuY3Rpb24oKXt0aGlzLl9pZGVudGl0eUlkPW51bGwsZGVsZXRlIHRoaXMucGFyYW1zLklkZW50aXR5SWQ7dmFyIGU9dGhpcy5wYXJhbXMuSWRlbnRpdHlQb29sSWQsdD10aGlzLnBhcmFtcy5Mb2dpbklkfHwiIjtkZWxldGUgdGhpcy5zdG9yYWdlW3RoaXMubG9jYWxTdG9yYWdlS2V5LmlkK2UrdF0sZGVsZXRlIHRoaXMuc3RvcmFnZVt0aGlzLmxvY2FsU3RvcmFnZUtleS5wcm92aWRlcnMrZSt0XX0sY2xlYXJJZE9uTm90QXV0aG9yaXplZDpmdW5jdGlvbihlKXsiTm90QXV0aG9yaXplZEV4Y2VwdGlvbiI9PWUuY29kZSYmdGhpcy5jbGVhckNhY2hlZElkKCl9LGdldElkOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYoInN0cmluZyI9PXR5cGVvZiB0LnBhcmFtcy5JZGVudGl0eUlkKXJldHVybiBlKG51bGwsdC5wYXJhbXMuSWRlbnRpdHlJZCk7dC5jb2duaXRvLmdldElkKChmdW5jdGlvbihuLHIpeyFuJiZyLklkZW50aXR5SWQ/KHQucGFyYW1zLklkZW50aXR5SWQ9ci5JZGVudGl0eUlkLGUobnVsbCxyLklkZW50aXR5SWQpKTplKG4pfSkpfSxsb2FkQ3JlZGVudGlhbHM6ZnVuY3Rpb24oZSx0KXtlJiZ0JiYodC5leHBpcmVkPSExLHQuYWNjZXNzS2V5SWQ9ZS5DcmVkZW50aWFscy5BY2Nlc3NLZXlJZCx0LnNlY3JldEFjY2Vzc0tleT1lLkNyZWRlbnRpYWxzLlNlY3JldEtleSx0LnNlc3Npb25Ub2tlbj1lLkNyZWRlbnRpYWxzLlNlc3Npb25Ub2tlbix0LmV4cGlyZVRpbWU9ZS5DcmVkZW50aWFscy5FeHBpcmF0aW9uKX0sZ2V0Q3JlZGVudGlhbHNGb3JJZGVudGl0eTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3QuY29nbml0by5nZXRDcmVkZW50aWFsc0ZvcklkZW50aXR5KChmdW5jdGlvbihuLHIpe24/dC5jbGVhcklkT25Ob3RBdXRob3JpemVkKG4pOih0LmNhY2hlSWQociksdC5kYXRhPXIsdC5sb2FkQ3JlZGVudGlhbHModC5kYXRhLHQpKSxlKG4pfSkpfSxnZXRDcmVkZW50aWFsc0Zyb21TVFM6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0LmNvZ25pdG8uZ2V0T3BlbklkVG9rZW4oKGZ1bmN0aW9uKG4scil7bj8odC5jbGVhcklkT25Ob3RBdXRob3JpemVkKG4pLGUobikpOih0LmNhY2hlSWQociksdC5wYXJhbXMuV2ViSWRlbnRpdHlUb2tlbj1yLlRva2VuLHQud2ViSWRlbnRpdHlDcmVkZW50aWFscy5yZWZyZXNoKChmdW5jdGlvbihuKXtufHwodC5kYXRhPXQud2ViSWRlbnRpdHlDcmVkZW50aWFscy5kYXRhLHQuc3RzLmNyZWRlbnRpYWxzRnJvbSh0LmRhdGEsdCkpLGUobil9KSkpfSkpfSxsb2FkQ2FjaGVkSWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKHIudXRpbC5pc0Jyb3dzZXIoKSYmIWUucGFyYW1zLklkZW50aXR5SWQpe3ZhciB0PWUuZ2V0U3RvcmFnZSgiaWQiKTtpZih0JiZlLnBhcmFtcy5Mb2dpbnMpe3ZhciBuPU9iamVjdC5rZXlzKGUucGFyYW1zLkxvZ2lucyk7MCE9PShlLmdldFN0b3JhZ2UoInByb3ZpZGVycyIpfHwiIikuc3BsaXQoIiwiKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybi0xIT09bi5pbmRleE9mKGUpfSkpLmxlbmd0aCYmKGUucGFyYW1zLklkZW50aXR5SWQ9dCl9ZWxzZSB0JiYoZS5wYXJhbXMuSWRlbnRpdHlJZD10KX19LGNyZWF0ZUNsaWVudHM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9jbGllbnRDb25maWc7aWYodGhpcy53ZWJJZGVudGl0eUNyZWRlbnRpYWxzPXRoaXMud2ViSWRlbnRpdHlDcmVkZW50aWFsc3x8bmV3IHIuV2ViSWRlbnRpdHlDcmVkZW50aWFscyh0aGlzLnBhcmFtcyxlKSwhdGhpcy5jb2duaXRvKXt2YXIgdD1yLnV0aWwubWVyZ2Uoe30sZSk7dC5wYXJhbXM9dGhpcy5wYXJhbXMsdGhpcy5jb2duaXRvPW5ldyBvKHQpfXRoaXMuc3RzPXRoaXMuc3RzfHxuZXcgaShlKX0sY2FjaGVJZDpmdW5jdGlvbihlKXt0aGlzLl9pZGVudGl0eUlkPWUuSWRlbnRpdHlJZCx0aGlzLnBhcmFtcy5JZGVudGl0eUlkPXRoaXMuX2lkZW50aXR5SWQsci51dGlsLmlzQnJvd3NlcigpJiYodGhpcy5zZXRTdG9yYWdlKCJpZCIsZS5JZGVudGl0eUlkKSx0aGlzLnBhcmFtcy5Mb2dpbnMmJnRoaXMuc2V0U3RvcmFnZSgicHJvdmlkZXJzIixPYmplY3Qua2V5cyh0aGlzLnBhcmFtcy5Mb2dpbnMpLmpvaW4oIiwiKSkpfSxnZXRTdG9yYWdlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnN0b3JhZ2VbdGhpcy5sb2NhbFN0b3JhZ2VLZXlbZV0rdGhpcy5wYXJhbXMuSWRlbnRpdHlQb29sSWQrKHRoaXMucGFyYW1zLkxvZ2luSWR8fCIiKV19LHNldFN0b3JhZ2U6ZnVuY3Rpb24oZSx0KXt0cnl7dGhpcy5zdG9yYWdlW3RoaXMubG9jYWxTdG9yYWdlS2V5W2VdK3RoaXMucGFyYW1zLklkZW50aXR5UG9vbElkKyh0aGlzLnBhcmFtcy5Mb2dpbklkfHwiIildPXR9Y2F0Y2goZSl7fX0sc3RvcmFnZTpmdW5jdGlvbigpe3RyeXt2YXIgZT1yLnV0aWwuaXNCcm93c2VyKCkmJm51bGwhPT13aW5kb3cubG9jYWxTdG9yYWdlJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy5sb2NhbFN0b3JhZ2U/d2luZG93LmxvY2FsU3RvcmFnZTp7fTtyZXR1cm4gZVsiYXdzLnRlc3Qtc3RvcmFnZSJdPSJmb29iYXIiLGRlbGV0ZSBlWyJhd3MudGVzdC1zdG9yYWdlIl0sZX1jYXRjaChlKXtyZXR1cm57fX19KCl9KX0seyIuLi8uLi9jbGllbnRzL2NvZ25pdG9pZGVudGl0eSI6NywiLi4vLi4vY2xpZW50cy9zdHMiOjgsIi4uL2NvcmUiOjE5fV0sMjM6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIik7ci5DcmVkZW50aWFsUHJvdmlkZXJDaGFpbj1yLnV0aWwuaW5oZXJpdChyLkNyZWRlbnRpYWxzLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXt0aGlzLnByb3ZpZGVycz1lfHxyLkNyZWRlbnRpYWxQcm92aWRlckNoYWluLmRlZmF1bHRQcm92aWRlcnMuc2xpY2UoMCksdGhpcy5yZXNvbHZlQ2FsbGJhY2tzPVtdfSxyZXNvbHZlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYoMD09PXQucHJvdmlkZXJzLmxlbmd0aClyZXR1cm4gZShuZXcgRXJyb3IoIk5vIHByb3ZpZGVycyIpKSx0O2lmKDE9PT10LnJlc29sdmVDYWxsYmFja3MucHVzaChlKSl7dmFyIG49MCxvPXQucHJvdmlkZXJzLnNsaWNlKDApOyFmdW5jdGlvbiBlKGkscyl7aWYoIWkmJnN8fG49PT1vLmxlbmd0aClyZXR1cm4gci51dGlsLmFycmF5RWFjaCh0LnJlc29sdmVDYWxsYmFja3MsKGZ1bmN0aW9uKGUpe2UoaSxzKX0pKSx2b2lkKHQucmVzb2x2ZUNhbGxiYWNrcy5sZW5ndGg9MCk7dmFyIGE9b1tuKytdOyhzPSJmdW5jdGlvbiI9PXR5cGVvZiBhP2EuY2FsbCgpOmEpLmdldD9zLmdldCgoZnVuY3Rpb24odCl7ZSh0LHQ/bnVsbDpzKX0pKTplKG51bGwscyl9KCl9cmV0dXJuIHR9fSksci5DcmVkZW50aWFsUHJvdmlkZXJDaGFpbi5kZWZhdWx0UHJvdmlkZXJzPVtdLHIuQ3JlZGVudGlhbFByb3ZpZGVyQ2hhaW4uYWRkUHJvbWlzZXNUb0NsYXNzPWZ1bmN0aW9uKGUpe3RoaXMucHJvdG90eXBlLnJlc29sdmVQcm9taXNlPXIudXRpbC5wcm9taXNpZnlNZXRob2QoInJlc29sdmUiLGUpfSxyLkNyZWRlbnRpYWxQcm92aWRlckNoYWluLmRlbGV0ZVByb21pc2VzRnJvbUNsYXNzPWZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXMucHJvdG90eXBlLnJlc29sdmVQcm9taXNlfSxyLnV0aWwuYWRkUHJvbWlzZXMoci5DcmVkZW50aWFsUHJvdmlkZXJDaGFpbil9LHsiLi4vY29yZSI6MTl9XSwyNDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4uLy4uL2NsaWVudHMvc3RzIik7ci5TQU1MQ3JlZGVudGlhbHM9ci51dGlsLmluaGVyaXQoci5DcmVkZW50aWFscyx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSl7ci5DcmVkZW50aWFscy5jYWxsKHRoaXMpLHRoaXMuZXhwaXJlZD0hMCx0aGlzLnBhcmFtcz1lfSxyZWZyZXNoOmZ1bmN0aW9uKGUpe3RoaXMuY29hbGVzY2VSZWZyZXNoKGV8fHIudXRpbC5mbi5jYWxsYmFjayl9LGxvYWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0LmNyZWF0ZUNsaWVudHMoKSx0LnNlcnZpY2UuYXNzdW1lUm9sZVdpdGhTQU1MKChmdW5jdGlvbihuLHIpe258fHQuc2VydmljZS5jcmVkZW50aWFsc0Zyb20ocix0KSxlKG4pfSkpfSxjcmVhdGVDbGllbnRzOmZ1bmN0aW9uKCl7dGhpcy5zZXJ2aWNlPXRoaXMuc2VydmljZXx8bmV3IG8oe3BhcmFtczp0aGlzLnBhcmFtc30pfX0pfSx7Ii4uLy4uL2NsaWVudHMvc3RzIjo4LCIuLi9jb3JlIjoxOX1dLDI1OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ZSgiLi4vLi4vY2xpZW50cy9zdHMiKTtyLlRlbXBvcmFyeUNyZWRlbnRpYWxzPXIudXRpbC5pbmhlcml0KHIuQ3JlZGVudGlhbHMse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUsdCl7ci5DcmVkZW50aWFscy5jYWxsKHRoaXMpLHRoaXMubG9hZE1hc3RlckNyZWRlbnRpYWxzKHQpLHRoaXMuZXhwaXJlZD0hMCx0aGlzLnBhcmFtcz1lfHx7fSx0aGlzLnBhcmFtcy5Sb2xlQXJuJiYodGhpcy5wYXJhbXMuUm9sZVNlc3Npb25OYW1lPXRoaXMucGFyYW1zLlJvbGVTZXNzaW9uTmFtZXx8InRlbXBvcmFyeS1jcmVkZW50aWFscyIpfSxyZWZyZXNoOmZ1bmN0aW9uKGUpe3RoaXMuY29hbGVzY2VSZWZyZXNoKGV8fHIudXRpbC5mbi5jYWxsYmFjayl9LGxvYWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0LmNyZWF0ZUNsaWVudHMoKSx0Lm1hc3RlckNyZWRlbnRpYWxzLmdldCgoZnVuY3Rpb24oKXt0LnNlcnZpY2UuY29uZmlnLmNyZWRlbnRpYWxzPXQubWFzdGVyQ3JlZGVudGlhbHMsKHQucGFyYW1zLlJvbGVBcm4/dC5zZXJ2aWNlLmFzc3VtZVJvbGU6dC5zZXJ2aWNlLmdldFNlc3Npb25Ub2tlbikuY2FsbCh0LnNlcnZpY2UsKGZ1bmN0aW9uKG4scil7bnx8dC5zZXJ2aWNlLmNyZWRlbnRpYWxzRnJvbShyLHQpLGUobil9KSl9KSl9LGxvYWRNYXN0ZXJDcmVkZW50aWFsczpmdW5jdGlvbihlKXtmb3IodGhpcy5tYXN0ZXJDcmVkZW50aWFscz1lfHxyLmNvbmZpZy5jcmVkZW50aWFsczt0aGlzLm1hc3RlckNyZWRlbnRpYWxzLm1hc3RlckNyZWRlbnRpYWxzOyl0aGlzLm1hc3RlckNyZWRlbnRpYWxzPXRoaXMubWFzdGVyQ3JlZGVudGlhbHMubWFzdGVyQ3JlZGVudGlhbHM7ImZ1bmN0aW9uIiE9dHlwZW9mIHRoaXMubWFzdGVyQ3JlZGVudGlhbHMuZ2V0JiYodGhpcy5tYXN0ZXJDcmVkZW50aWFscz1uZXcgci5DcmVkZW50aWFscyh0aGlzLm1hc3RlckNyZWRlbnRpYWxzKSl9LGNyZWF0ZUNsaWVudHM6ZnVuY3Rpb24oKXt0aGlzLnNlcnZpY2U9dGhpcy5zZXJ2aWNlfHxuZXcgbyh7cGFyYW1zOnRoaXMucGFyYW1zfSl9fSl9LHsiLi4vLi4vY2xpZW50cy9zdHMiOjgsIi4uL2NvcmUiOjE5fV0sMjY6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1lKCIuLi8uLi9jbGllbnRzL3N0cyIpO3IuV2ViSWRlbnRpdHlDcmVkZW50aWFscz1yLnV0aWwuaW5oZXJpdChyLkNyZWRlbnRpYWxzLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlLHQpe3IuQ3JlZGVudGlhbHMuY2FsbCh0aGlzKSx0aGlzLmV4cGlyZWQ9ITAsdGhpcy5wYXJhbXM9ZSx0aGlzLnBhcmFtcy5Sb2xlU2Vzc2lvbk5hbWU9dGhpcy5wYXJhbXMuUm9sZVNlc3Npb25OYW1lfHwid2ViLWlkZW50aXR5Iix0aGlzLmRhdGE9bnVsbCx0aGlzLl9jbGllbnRDb25maWc9ci51dGlsLmNvcHkodHx8e30pfSxyZWZyZXNoOmZ1bmN0aW9uKGUpe3RoaXMuY29hbGVzY2VSZWZyZXNoKGV8fHIudXRpbC5mbi5jYWxsYmFjayl9LGxvYWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0LmNyZWF0ZUNsaWVudHMoKSx0LnNlcnZpY2UuYXNzdW1lUm9sZVdpdGhXZWJJZGVudGl0eSgoZnVuY3Rpb24obixyKXt0LmRhdGE9bnVsbCxufHwodC5kYXRhPXIsdC5zZXJ2aWNlLmNyZWRlbnRpYWxzRnJvbShyLHQpKSxlKG4pfSkpfSxjcmVhdGVDbGllbnRzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2VydmljZSl7dmFyIGU9ci51dGlsLm1lcmdlKHt9LHRoaXMuX2NsaWVudENvbmZpZyk7ZS5wYXJhbXM9dGhpcy5wYXJhbXMsdGhpcy5zZXJ2aWNlPW5ldyBvKGUpfX19KX0seyIuLi8uLi9jbGllbnRzL3N0cyI6OCwiLi4vY29yZSI6MTl9XSwyNzpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbihuKXsoZnVuY3Rpb24oKXt2YXIgcj1lKCIuL2NvcmUiKSxvPWUoIi4vdXRpbCIpLGk9WyJBV1NfRU5BQkxFX0VORFBPSU5UX0RJU0NPVkVSWSIsIkFXU19FTkRQT0lOVF9ESVNDT1ZFUllfRU5BQkxFRCJdO2Z1bmN0aW9uIHMoZSl7dmFyIHQ9ZS5zZXJ2aWNlLG49dC5hcGl8fHt9LHI9KG4ub3BlcmF0aW9ucyx7fSk7cmV0dXJuIHQuY29uZmlnLnJlZ2lvbiYmKHIucmVnaW9uPXQuY29uZmlnLnJlZ2lvbiksbi5zZXJ2aWNlSWQmJihyLnNlcnZpY2VJZD1uLnNlcnZpY2VJZCksdC5jb25maWcuY3JlZGVudGlhbHMuYWNjZXNzS2V5SWQmJihyLmFjY2Vzc0tleUlkPXQuY29uZmlnLmNyZWRlbnRpYWxzLmFjY2Vzc0tleUlkKSxyfWZ1bmN0aW9uIGEoZSx0LG4pe24mJm51bGwhPXQmJiJzdHJ1Y3R1cmUiPT09bi50eXBlJiZuLnJlcXVpcmVkJiZuLnJlcXVpcmVkLmxlbmd0aD4wJiZvLmFycmF5RWFjaChuLnJlcXVpcmVkLChmdW5jdGlvbihyKXt2YXIgbz1uLm1lbWJlcnNbcl07aWYoITA9PT1vLmVuZHBvaW50RGlzY292ZXJ5SWQpe3ZhciBpPW8uaXNMb2NhdGlvbk5hbWU/by5uYW1lOnI7ZVtpXT1TdHJpbmcodFtyXSl9ZWxzZSBhKGUsdFtyXSxvKX0pKX1mdW5jdGlvbiBjKGUsdCl7dmFyIG49e307cmV0dXJuIGEobixlLnBhcmFtcyx0KSxufWZ1bmN0aW9uIHUoZSl7dmFyIHQ9ZS5zZXJ2aWNlLG49dC5hcGksaT1uLm9wZXJhdGlvbnM/bi5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXTp2b2lkIDAsYT1jKGUsaT9pLmlucHV0OnZvaWQgMCksdT1zKGUpO09iamVjdC5rZXlzKGEpLmxlbmd0aD4wJiYodT1vLnVwZGF0ZSh1LGEpLGkmJih1Lm9wZXJhdGlvbj1pLm5hbWUpKTt2YXIgbD1yLmVuZHBvaW50Q2FjaGUuZ2V0KHUpO2lmKCFsfHwxIT09bC5sZW5ndGh8fCIiIT09bFswXS5BZGRyZXNzKWlmKGwmJmwubGVuZ3RoPjApZS5odHRwUmVxdWVzdC51cGRhdGVFbmRwb2ludChsWzBdLkFkZHJlc3MpO2Vsc2V7dmFyIHA9dC5tYWtlUmVxdWVzdChuLmVuZHBvaW50T3BlcmF0aW9uLHtPcGVyYXRpb246aS5uYW1lLElkZW50aWZpZXJzOmF9KTtkKHApLHAucmVtb3ZlTGlzdGVuZXIoInZhbGlkYXRlIixyLkV2ZW50TGlzdGVuZXJzLkNvcmUuVkFMSURBVEVfUEFSQU1FVEVSUykscC5yZW1vdmVMaXN0ZW5lcigicmV0cnkiLHIuRXZlbnRMaXN0ZW5lcnMuQ29yZS5SRVRSWV9DSEVDSyksci5lbmRwb2ludENhY2hlLnB1dCh1LFt7QWRkcmVzczoiIixDYWNoZVBlcmlvZEluTWludXRlczoxfV0pLHAuc2VuZCgoZnVuY3Rpb24oZSx0KXt0JiZ0LkVuZHBvaW50cz9yLmVuZHBvaW50Q2FjaGUucHV0KHUsdC5FbmRwb2ludHMpOmUmJnIuZW5kcG9pbnRDYWNoZS5wdXQodSxbe0FkZHJlc3M6IiIsQ2FjaGVQZXJpb2RJbk1pbnV0ZXM6MX1dKX0pKX19dmFyIGw9e307ZnVuY3Rpb24gcChlLHQpe3ZhciBuPWUuc2VydmljZSxpPW4uYXBpLGE9aS5vcGVyYXRpb25zP2kub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl06dm9pZCAwLHU9YT9hLmlucHV0OnZvaWQgMCxwPWMoZSx1KSxoPXMoZSk7T2JqZWN0LmtleXMocCkubGVuZ3RoPjAmJihoPW8udXBkYXRlKGgscCksYSYmKGgub3BlcmF0aW9uPWEubmFtZSkpO3ZhciBmPXIuRW5kcG9pbnRDYWNoZS5nZXRLZXlTdHJpbmcoaCksZz1yLmVuZHBvaW50Q2FjaGUuZ2V0KGYpO2lmKGcmJjE9PT1nLmxlbmd0aCYmIiI9PT1nWzBdLkFkZHJlc3MpcmV0dXJuIGxbZl18fChsW2ZdPVtdKSx2b2lkIGxbZl0ucHVzaCh7cmVxdWVzdDplLGNhbGxiYWNrOnR9KTtpZihnJiZnLmxlbmd0aD4wKWUuaHR0cFJlcXVlc3QudXBkYXRlRW5kcG9pbnQoZ1swXS5BZGRyZXNzKSx0KCk7ZWxzZXt2YXIgbT1uLm1ha2VSZXF1ZXN0KGkuZW5kcG9pbnRPcGVyYXRpb24se09wZXJhdGlvbjphLm5hbWUsSWRlbnRpZmllcnM6cH0pO20ucmVtb3ZlTGlzdGVuZXIoInZhbGlkYXRlIixyLkV2ZW50TGlzdGVuZXJzLkNvcmUuVkFMSURBVEVfUEFSQU1FVEVSUyksZChtKSxyLmVuZHBvaW50Q2FjaGUucHV0KGYsW3tBZGRyZXNzOiIiLENhY2hlUGVyaW9kSW5NaW51dGVzOjYwfV0pLG0uc2VuZCgoZnVuY3Rpb24obixpKXtpZihuKXtpZihlLnJlc3BvbnNlLmVycm9yPW8uZXJyb3Iobix7cmV0cnlhYmxlOiExfSksci5lbmRwb2ludENhY2hlLnJlbW92ZShoKSxsW2ZdKXt2YXIgcz1sW2ZdO28uYXJyYXlFYWNoKHMsKGZ1bmN0aW9uKGUpe2UucmVxdWVzdC5yZXNwb25zZS5lcnJvcj1vLmVycm9yKG4se3JldHJ5YWJsZTohMX0pLGUuY2FsbGJhY2soKX0pKSxkZWxldGUgbFtmXX19ZWxzZSBpJiYoci5lbmRwb2ludENhY2hlLnB1dChmLGkuRW5kcG9pbnRzKSxlLmh0dHBSZXF1ZXN0LnVwZGF0ZUVuZHBvaW50KGkuRW5kcG9pbnRzWzBdLkFkZHJlc3MpLGxbZl0pJiYocz1sW2ZdLG8uYXJyYXlFYWNoKHMsKGZ1bmN0aW9uKGUpe2UucmVxdWVzdC5odHRwUmVxdWVzdC51cGRhdGVFbmRwb2ludChpLkVuZHBvaW50c1swXS5BZGRyZXNzKSxlLmNhbGxiYWNrKCl9KSksZGVsZXRlIGxbZl0pO3QoKX0pKX19ZnVuY3Rpb24gZChlKXt2YXIgdD1lLnNlcnZpY2UuYXBpLmFwaVZlcnNpb247dCYmIWUuaHR0cFJlcXVlc3QuaGVhZGVyc1sieC1hbXotYXBpLXZlcnNpb24iXSYmKGUuaHR0cFJlcXVlc3QuaGVhZGVyc1sieC1hbXotYXBpLXZlcnNpb24iXT10KX1mdW5jdGlvbiBoKGUpe3ZhciB0PWUuZXJyb3Isbj1lLmh0dHBSZXNwb25zZTtpZih0JiYoIkludmFsaWRFbmRwb2ludEV4Y2VwdGlvbiI9PT10LmNvZGV8fDQyMT09PW4uc3RhdHVzQ29kZSkpe3ZhciBpPWUucmVxdWVzdCxhPWkuc2VydmljZS5hcGkub3BlcmF0aW9uc3x8e30sdT1jKGksYVtpLm9wZXJhdGlvbl0/YVtpLm9wZXJhdGlvbl0uaW5wdXQ6dm9pZCAwKSxsPXMoaSk7T2JqZWN0LmtleXModSkubGVuZ3RoPjAmJihsPW8udXBkYXRlKGwsdSksYVtpLm9wZXJhdGlvbl0mJihsLm9wZXJhdGlvbj1hW2kub3BlcmF0aW9uXS5uYW1lKSksci5lbmRwb2ludENhY2hlLnJlbW92ZShsKX19ZnVuY3Rpb24gZihlKXtyZXR1cm5bImZhbHNlIiwiMCJdLmluZGV4T2YoZSk+PTB9dC5leHBvcnRzPXtkaXNjb3ZlckVuZHBvaW50OmZ1bmN0aW9uKGUsdCl7dmFyIHM9ZS5zZXJ2aWNlfHx7fTtpZihmdW5jdGlvbihlKXtpZihlLl9vcmlnaW5hbENvbmZpZyYmZS5fb3JpZ2luYWxDb25maWcuZW5kcG9pbnQmJiEwPT09ZS5fb3JpZ2luYWxDb25maWcuZW5kcG9pbnREaXNjb3ZlcnlFbmFibGVkKXRocm93IG8uZXJyb3IobmV3IEVycm9yLHtjb2RlOiJDb25maWd1cmF0aW9uRXhjZXB0aW9uIixtZXNzYWdlOiJDdXN0b20gZW5kcG9pbnQgaXMgc3VwcGxpZWQ7IGVuZHBvaW50RGlzY292ZXJ5RW5hYmxlZCBtdXN0IG5vdCBiZSB0cnVlLiJ9KTt2YXIgdD1yLmNvbmZpZ1tlLnNlcnZpY2VJZGVudGlmaWVyXXx8e307cmV0dXJuIEJvb2xlYW4oci5jb25maWcuZW5kcG9pbnR8fHQuZW5kcG9pbnR8fGUuX29yaWdpbmFsQ29uZmlnJiZlLl9vcmlnaW5hbENvbmZpZy5lbmRwb2ludCl9KHMpfHxlLmlzUHJlc2lnbmVkKCkpcmV0dXJuIHQoKTt2YXIgYT0ocy5hcGkub3BlcmF0aW9uc3x8e30pW2Uub3BlcmF0aW9uXSxjPWE/YS5lbmRwb2ludERpc2NvdmVyeVJlcXVpcmVkOiJOVUxMIixsPWZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmljZXx8e307aWYodm9pZCAwIT09dC5jb25maWcuZW5kcG9pbnREaXNjb3ZlcnlFbmFibGVkKXJldHVybiB0LmNvbmZpZy5lbmRwb2ludERpc2NvdmVyeUVuYWJsZWQ7aWYoIW8uaXNCcm93c2VyKCkpe2Zvcih2YXIgcz0wO3M8aS5sZW5ndGg7cysrKXt2YXIgYT1pW3NdO2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLmVudixhKSl7aWYoIiI9PT1uLmVudlthXXx8dm9pZCAwPT09bi5lbnZbYV0pdGhyb3cgby5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IkNvbmZpZ3VyYXRpb25FeGNlcHRpb24iLG1lc3NhZ2U6ImVudmlyb25tZW50YWwgdmFyaWFibGUgIithKyIgY2Fubm90IGJlIHNldCB0byBub3RoaW5nIn0pO3JldHVybiFmKG4uZW52W2FdKX19dmFyIGM9e307dHJ5e2M9ci51dGlsLmluaUxvYWRlcj9yLnV0aWwuaW5pTG9hZGVyLmxvYWRGcm9tKHtpc0NvbmZpZzohMCxmaWxlbmFtZTpuLmVudltyLnV0aWwuc2hhcmVkQ29uZmlnRmlsZUVudl19KTp7fX1jYXRjaChlKXt9dmFyIHU9Y1tuLmVudi5BV1NfUFJPRklMRXx8ci51dGlsLmRlZmF1bHRQcm9maWxlXXx8e307aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHUsImVuZHBvaW50X2Rpc2NvdmVyeV9lbmFibGVkIikpe2lmKHZvaWQgMD09PXUuZW5kcG9pbnRfZGlzY292ZXJ5X2VuYWJsZWQpdGhyb3cgby5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IkNvbmZpZ3VyYXRpb25FeGNlcHRpb24iLG1lc3NhZ2U6ImNvbmZpZyBmaWxlIGVudHJ5ICdlbmRwb2ludF9kaXNjb3ZlcnlfZW5hYmxlZCcgY2Fubm90IGJlIHNldCB0byBub3RoaW5nIn0pO3JldHVybiFmKHUuZW5kcG9pbnRfZGlzY292ZXJ5X2VuYWJsZWQpfX19KGUpLGQ9cy5hcGkuaGFzUmVxdWlyZWRFbmRwb2ludERpc2NvdmVyeTtzd2l0Y2goKGx8fGQpJiZlLmh0dHBSZXF1ZXN0LmFwcGVuZFRvVXNlckFnZW50KCJlbmRwb2ludC1kaXNjb3ZlcnkiKSxjKXtjYXNlIk9QVElPTkFMIjoobHx8ZCkmJih1KGUpLGUuYWRkTmFtZWRMaXN0ZW5lcigiSU5WQUxJREFURV9DQUNIRURfRU5EUE9JTlRTIiwiZXh0cmFjdEVycm9yIixoKSksdCgpO2JyZWFrO2Nhc2UiUkVRVUlSRUQiOmlmKCExPT09bCl7ZS5yZXNwb25zZS5lcnJvcj1vLmVycm9yKG5ldyBFcnJvcix7Y29kZToiQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiIsbWVzc2FnZToiRW5kcG9pbnQgRGlzY292ZXJ5IGlzIGRpc2FibGVkIGJ1dCAiK3MuYXBpLmNsYXNzTmFtZSsiLiIrZS5vcGVyYXRpb24rIigpIHJlcXVpcmVzIGl0LiBQbGVhc2UgY2hlY2sgeW91ciBjb25maWd1cmF0aW9ucy4ifSksdCgpO2JyZWFrfWUuYWRkTmFtZWRMaXN0ZW5lcigiSU5WQUxJREFURV9DQUNIRURfRU5EUE9JTlRTIiwiZXh0cmFjdEVycm9yIixoKSxwKGUsdCk7YnJlYWs7ZGVmYXVsdDp0KCl9fSxyZXF1aXJlZERpc2NvdmVyRW5kcG9pbnQ6cCxvcHRpb25hbERpc2NvdmVyRW5kcG9pbnQ6dSxtYXJzaGFsbEN1c3RvbUlkZW50aWZpZXJzOmMsZ2V0Q2FjaGVLZXk6cyxpbnZhbGlkYXRlQ2FjaGVkRW5kcG9pbnQ6aH19KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLGUoIl9wcm9jZXNzIikpfSx7Ii4vY29yZSI6MTksIi4vdXRpbCI6NzQsX3Byb2Nlc3M6OTJ9XSwyODpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2V2ZW50LXN0cmVhbS9ldmVudC1tZXNzYWdlLWNodW5rZXIiKS5ldmVudE1lc3NhZ2VDaHVua2VyLG89ZSgiLi9wYXJzZS1ldmVudCIpLnBhcnNlRXZlbnQ7dC5leHBvcnRzPXtjcmVhdGVFdmVudFN0cmVhbTpmdW5jdGlvbihlLHQsbil7Zm9yKHZhciBpPXIoZSkscz1bXSxhPTA7YTxpLmxlbmd0aDthKyspcy5wdXNoKG8odCxpW2FdLG4pKTtyZXR1cm4gc319fSx7Ii4uL2V2ZW50LXN0cmVhbS9ldmVudC1tZXNzYWdlLWNodW5rZXIiOjI5LCIuL3BhcnNlLWV2ZW50IjozMX1dLDI5OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXtldmVudE1lc3NhZ2VDaHVua2VyOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDspe3ZhciByPWUucmVhZEludDMyQkUobiksbz1lLnNsaWNlKG4scituKTtuKz1yLHQucHVzaChvKX1yZXR1cm4gdH19fSx7fV0sMzA6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIikudXRpbCxvPXIuYnVmZmVyLnRvQnVmZmVyO2Z1bmN0aW9uIGkoZSl7aWYoOCE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSW50NjQgYnVmZmVycyBtdXN0IGJlIGV4YWN0bHkgOCBieXRlcyIpO3IuQnVmZmVyLmlzQnVmZmVyKGUpfHwoZT1vKGUpKSx0aGlzLmJ5dGVzPWV9ZnVuY3Rpb24gcyhlKXtmb3IodmFyIHQ9MDt0PDg7dCsrKWVbdF1ePTI1NTtmb3IodD03O3Q+LTEmJihlW3RdKyssMD09PWVbdF0pO3QtLSk7fWkuZnJvbU51bWJlcj1mdW5jdGlvbihlKXtpZihlPjB4ODAwMDAwMDAwMDAwMDAwMHx8ZTwtMHg4MDAwMDAwMDAwMDAwMDAwKXRocm93IG5ldyBFcnJvcihlKyIgaXMgdG9vIGxhcmdlIChvciwgaWYgbmVnYXRpdmUsIHRvbyBzbWFsbCkgdG8gcmVwcmVzZW50IGFzIGFuIEludDY0Iik7Zm9yKHZhciB0PW5ldyBVaW50OEFycmF5KDgpLG49NyxyPU1hdGguYWJzKE1hdGgucm91bmQoZSkpO24+LTEmJnI+MDtuLS0sci89MjU2KXRbbl09cjtyZXR1cm4gZTwwJiZzKHQpLG5ldyBpKHQpfSxpLnByb3RvdHlwZS52YWx1ZU9mPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5ieXRlcy5zbGljZSgwKSx0PTEyOCZlWzBdO3JldHVybiB0JiZzKGUpLHBhcnNlSW50KGUudG9TdHJpbmcoImhleCIpLDE2KSoodD8tMToxKX0saS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gU3RyaW5nKHRoaXMudmFsdWVPZigpKX0sdC5leHBvcnRzPXtJbnQ2NDppfX0seyIuLi9jb3JlIjoxOX1dLDMxOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9wYXJzZS1tZXNzYWdlIikucGFyc2VNZXNzYWdlO3QuZXhwb3J0cz17cGFyc2VFdmVudDpmdW5jdGlvbihlLHQsbil7dmFyIG89cih0KSxpPW8uaGVhZGVyc1siOm1lc3NhZ2UtdHlwZSJdO2lmKGkpe2lmKCJlcnJvciI9PT1pLnZhbHVlKXRocm93IGZ1bmN0aW9uKGUpe3ZhciB0PWUuaGVhZGVyc1siOmVycm9yLWNvZGUiXSxuPWUuaGVhZGVyc1siOmVycm9yLW1lc3NhZ2UiXSxyPW5ldyBFcnJvcihuLnZhbHVlfHxuKTtyZXR1cm4gci5jb2RlPXIubmFtZT10LnZhbHVlfHx0LHJ9KG8pO2lmKCJldmVudCIhPT1pLnZhbHVlKXJldHVybn12YXIgcz1vLmhlYWRlcnNbIjpldmVudC10eXBlIl0sYT1uLm1lbWJlcnNbcy52YWx1ZV07aWYoYSl7dmFyIGM9e30sdT1hLmV2ZW50UGF5bG9hZE1lbWJlck5hbWU7aWYodSl7dmFyIGw9YS5tZW1iZXJzW3VdOyJiaW5hcnkiPT09bC50eXBlP2NbdV09by5ib2R5OmNbdV09ZS5wYXJzZShvLmJvZHkudG9TdHJpbmcoKSxsKX1mb3IodmFyIHA9YS5ldmVudEhlYWRlck1lbWJlck5hbWVzLGQ9MDtkPHAubGVuZ3RoO2QrKyl7dmFyIGg9cFtkXTtvLmhlYWRlcnNbaF0mJihjW2hdPWEubWVtYmVyc1toXS50b1R5cGUoby5oZWFkZXJzW2hdLnZhbHVlKSl9dmFyIGY9e307cmV0dXJuIGZbcy52YWx1ZV09YyxmfX19fSx7Ii4vcGFyc2UtbWVzc2FnZSI6MzJ9XSwzMjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vaW50NjQiKS5JbnQ2NCxvPWUoIi4vc3BsaXQtbWVzc2FnZSIpLnNwbGl0TWVzc2FnZSxpPSJib29sZWFuIixzPSJieXRlIixhPSJzaG9ydCIsYz0iaW50ZWdlciIsdT0ibG9uZyIsbD0iYmluYXJ5IixwPSJzdHJpbmciLGQ9InRpbWVzdGFtcCIsaD0idXVpZCI7ZnVuY3Rpb24gZihlKXtmb3IodmFyIHQ9e30sbj0wO248ZS5sZW5ndGg7KXt2YXIgbz1lLnJlYWRVSW50OChuKyspLGY9ZS5zbGljZShuLG4rbykudG9TdHJpbmcoKTtzd2l0Y2gobis9byxlLnJlYWRVSW50OChuKyspKXtjYXNlIDA6dFtmXT17dHlwZTppLHZhbHVlOiEwfTticmVhaztjYXNlIDE6dFtmXT17dHlwZTppLHZhbHVlOiExfTticmVhaztjYXNlIDI6dFtmXT17dHlwZTpzLHZhbHVlOmUucmVhZEludDgobisrKX07YnJlYWs7Y2FzZSAzOnRbZl09e3R5cGU6YSx2YWx1ZTplLnJlYWRJbnQxNkJFKG4pfSxuKz0yO2JyZWFrO2Nhc2UgNDp0W2ZdPXt0eXBlOmMsdmFsdWU6ZS5yZWFkSW50MzJCRShuKX0sbis9NDticmVhaztjYXNlIDU6dFtmXT17dHlwZTp1LHZhbHVlOm5ldyByKGUuc2xpY2UobixuKzgpKX0sbis9ODticmVhaztjYXNlIDY6dmFyIGc9ZS5yZWFkVUludDE2QkUobik7bis9Mix0W2ZdPXt0eXBlOmwsdmFsdWU6ZS5zbGljZShuLG4rZyl9LG4rPWc7YnJlYWs7Y2FzZSA3OnZhciBtPWUucmVhZFVJbnQxNkJFKG4pO24rPTIsdFtmXT17dHlwZTpwLHZhbHVlOmUuc2xpY2UobixuK20pLnRvU3RyaW5nKCl9LG4rPW07YnJlYWs7Y2FzZSA4OnRbZl09e3R5cGU6ZCx2YWx1ZTpuZXcgRGF0ZShuZXcgcihlLnNsaWNlKG4sbis4KSkudmFsdWVPZigpKX0sbis9ODticmVhaztjYXNlIDk6dmFyIHY9ZS5zbGljZShuLG4rMTYpLnRvU3RyaW5nKCJoZXgiKTtuKz0xNix0W2ZdPXt0eXBlOmgsdmFsdWU6di5zdWJzdHIoMCw4KSsiLSIrdi5zdWJzdHIoOCw0KSsiLSIrdi5zdWJzdHIoMTIsNCkrIi0iK3Yuc3Vic3RyKDE2LDQpKyItIit2LnN1YnN0cigyMCl9O2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbnJlY29nbml6ZWQgaGVhZGVyIHR5cGUgdGFnIil9fXJldHVybiB0fXQuZXhwb3J0cz17cGFyc2VNZXNzYWdlOmZ1bmN0aW9uKGUpe3ZhciB0PW8oZSk7cmV0dXJue2hlYWRlcnM6Zih0LmhlYWRlcnMpLGJvZHk6dC5ib2R5fX19fSx7Ii4vaW50NjQiOjMwLCIuL3NwbGl0LW1lc3NhZ2UiOjMzfV0sMzM6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIikudXRpbCxvPXIuYnVmZmVyLnRvQnVmZmVyO3QuZXhwb3J0cz17c3BsaXRNZXNzYWdlOmZ1bmN0aW9uKGUpe2lmKHIuQnVmZmVyLmlzQnVmZmVyKGUpfHwoZT1vKGUpKSxlLmxlbmd0aDwxNil0aHJvdyBuZXcgRXJyb3IoIlByb3ZpZGVkIG1lc3NhZ2UgdG9vIHNob3J0IHRvIGFjY29tbW9kYXRlIGV2ZW50IHN0cmVhbSBtZXNzYWdlIG92ZXJoZWFkIik7aWYoZS5sZW5ndGghPT1lLnJlYWRVSW50MzJCRSgwKSl0aHJvdyBuZXcgRXJyb3IoIlJlcG9ydGVkIG1lc3NhZ2UgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIHJlY2VpdmVkIG1lc3NhZ2UgbGVuZ3RoIik7dmFyIHQ9ZS5yZWFkVUludDMyQkUoOCk7aWYodCE9PXIuY3J5cHRvLmNyYzMyKGUuc2xpY2UoMCw4KSkpdGhyb3cgbmV3IEVycm9yKCJUaGUgcHJlbHVkZSBjaGVja3N1bSBzcGVjaWZpZWQgaW4gdGhlIG1lc3NhZ2UgKCIrdCsiKSBkb2VzIG5vdCBtYXRjaCB0aGUgY2FsY3VsYXRlZCBDUkMzMiBjaGVja3N1bS4iKTt2YXIgbj1lLnJlYWRVSW50MzJCRShlLmxlbmd0aC00KTtpZihuIT09ci5jcnlwdG8uY3JjMzIoZS5zbGljZSgwLGUubGVuZ3RoLTQpKSl0aHJvdyBuZXcgRXJyb3IoIlRoZSBtZXNzYWdlIGNoZWNrc3VtIGRpZCBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIHZhbHVlIG9mICIrbik7dmFyIGk9MTIrZS5yZWFkVUludDMyQkUoNCk7cmV0dXJue2hlYWRlcnM6ZS5zbGljZSgxMixpKSxib2R5OmUuc2xpY2UoaSxlLmxlbmd0aC00KX19fX0seyIuLi9jb3JlIjoxOX1dLDM0OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKHQpeyhmdW5jdGlvbigpe3ZhciBuPWUoIi4vY29yZSIpLHI9ZSgiLi9zZXF1ZW50aWFsX2V4ZWN1dG9yIiksbz1lKCIuL2Rpc2NvdmVyX2VuZHBvaW50IikuZGlzY292ZXJFbmRwb2ludDtmdW5jdGlvbiBpKGUpe2lmKCFlLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnMpcmV0dXJuIiI7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXTtyZXR1cm4gdD90LmF1dGh0eXBlOiIifWZ1bmN0aW9uIHMoZSl7dmFyIHQ9ZS5zZXJ2aWNlO3JldHVybiB0LmNvbmZpZy5zaWduYXR1cmVWZXJzaW9uP3QuY29uZmlnLnNpZ25hdHVyZVZlcnNpb246dC5hcGkuc2lnbmF0dXJlVmVyc2lvbj90LmFwaS5zaWduYXR1cmVWZXJzaW9uOmkoZSl9bi5FdmVudExpc3RlbmVycz17Q29yZTp7fX0sbi5FdmVudExpc3RlbmVycz17Q29yZToobmV3IHIpLmFkZE5hbWVkTGlzdGVuZXJzKChmdW5jdGlvbihlLHIpe3IoIlZBTElEQVRFX0NSRURFTlRJQUxTIiwidmFsaWRhdGUiLChmdW5jdGlvbihlLHQpe2lmKCFlLnNlcnZpY2UuYXBpLnNpZ25hdHVyZVZlcnNpb24mJiFlLnNlcnZpY2UuY29uZmlnLnNpZ25hdHVyZVZlcnNpb24pcmV0dXJuIHQoKTsiYmVhcmVyIiE9PXMoZSk/ZS5zZXJ2aWNlLmNvbmZpZy5nZXRDcmVkZW50aWFscygoZnVuY3Rpb24ocil7ciYmKGUucmVzcG9uc2UuZXJyb3I9bi51dGlsLmVycm9yKHIse2NvZGU6IkNyZWRlbnRpYWxzRXJyb3IiLG1lc3NhZ2U6Ik1pc3NpbmcgY3JlZGVudGlhbHMgaW4gY29uZmlnLCBpZiB1c2luZyBBV1NfQ09ORklHX0ZJTEUsIHNldCBBV1NfU0RLX0xPQURfQ09ORklHPTEifSkpLHQoKX0pKTplLnNlcnZpY2UuY29uZmlnLmdldFRva2VuKChmdW5jdGlvbihyKXtyJiYoZS5yZXNwb25zZS5lcnJvcj1uLnV0aWwuZXJyb3Iocix7Y29kZToiVG9rZW5FcnJvciJ9KSksdCgpfSkpfSkpLGUoIlZBTElEQVRFX1JFR0lPTiIsInZhbGlkYXRlIiwoZnVuY3Rpb24oZSl7aWYoIWUuc2VydmljZS5pc0dsb2JhbEVuZHBvaW50KXt2YXIgdD1uZXcgUmVnRXhwKC9eKFthLXpBLVowLTldfFthLXpBLVowLTldW2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pJC8pO2Uuc2VydmljZS5jb25maWcucmVnaW9uP3QudGVzdChlLnNlcnZpY2UuY29uZmlnLnJlZ2lvbil8fChlLnJlc3BvbnNlLmVycm9yPW4udXRpbC5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IkNvbmZpZ0Vycm9yIixtZXNzYWdlOiJJbnZhbGlkIHJlZ2lvbiBpbiBjb25maWcifSkpOmUucmVzcG9uc2UuZXJyb3I9bi51dGlsLmVycm9yKG5ldyBFcnJvcix7Y29kZToiQ29uZmlnRXJyb3IiLG1lc3NhZ2U6Ik1pc3NpbmcgcmVnaW9uIGluIGNvbmZpZyJ9KX19KSksZSgiQlVJTERfSURFTVBPVEVOQ1lfVE9LRU5TIiwidmFsaWRhdGUiLChmdW5jdGlvbihlKXtpZihlLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnMpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl07aWYodCl7dmFyIHI9dC5pZGVtcG90ZW50TWVtYmVycztpZihyLmxlbmd0aCl7Zm9yKHZhciBvPW4udXRpbC5jb3B5KGUucGFyYW1zKSxpPTAscz1yLmxlbmd0aDtpPHM7aSsrKW9bcltpXV18fChvW3JbaV1dPW4udXRpbC51dWlkLnY0KCkpO2UucGFyYW1zPW99fX19KSksZSgiVkFMSURBVEVfUEFSQU1FVEVSUyIsInZhbGlkYXRlIiwoZnVuY3Rpb24oZSl7aWYoZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zKXt2YXIgdD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLmlucHV0LHI9ZS5zZXJ2aWNlLmNvbmZpZy5wYXJhbVZhbGlkYXRpb247bmV3IG4uUGFyYW1WYWxpZGF0b3IocikudmFsaWRhdGUodCxlLnBhcmFtcyl9fSkpLGUoIkNPTVBVVEVfQ0hFQ0tTVU0iLCJhZnRlckJ1aWxkIiwoZnVuY3Rpb24oZSl7aWYoZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zKXt2YXIgdD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dO2lmKHQpe3ZhciByPWUuaHR0cFJlcXVlc3QuYm9keSxvPXImJihuLnV0aWwuQnVmZmVyLmlzQnVmZmVyKHIpfHwic3RyaW5nIj09dHlwZW9mIHIpLGk9ZS5odHRwUmVxdWVzdC5oZWFkZXJzO2lmKHQuaHR0cENoZWNrc3VtUmVxdWlyZWQmJmUuc2VydmljZS5jb25maWcuY29tcHV0ZUNoZWNrc3VtcyYmbyYmIWlbIkNvbnRlbnQtTUQ1Il0pe3ZhciBzPW4udXRpbC5jcnlwdG8ubWQ1KHIsImJhc2U2NCIpO2lbIkNvbnRlbnQtTUQ1Il09c319fX0pKSxyKCJDT01QVVRFX1NIQTI1NiIsImFmdGVyQnVpbGQiLChmdW5jdGlvbihlLHQpe2lmKGUuaGFsdEhhbmRsZXJzT25FcnJvcigpLGUuc2VydmljZS5hcGkub3BlcmF0aW9ucyl7dmFyIHI9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXSxvPXI/ci5hdXRodHlwZToiIjtpZighZS5zZXJ2aWNlLmFwaS5zaWduYXR1cmVWZXJzaW9uJiYhbyYmIWUuc2VydmljZS5jb25maWcuc2lnbmF0dXJlVmVyc2lvbilyZXR1cm4gdCgpO2lmKGUuc2VydmljZS5nZXRTaWduZXJDbGFzcyhlKT09PW4uU2lnbmVycy5WNCl7dmFyIGk9ZS5odHRwUmVxdWVzdC5ib2R5fHwiIjtpZihvLmluZGV4T2YoInVuc2lnbmVkLWJvZHkiKT49MClyZXR1cm4gZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJYLUFtei1Db250ZW50LVNoYTI1NiJdPSJVTlNJR05FRC1QQVlMT0FEIix0KCk7bi51dGlsLmNvbXB1dGVTaGEyNTYoaSwoZnVuY3Rpb24obixyKXtuP3Qobik6KGUuaHR0cFJlcXVlc3QuaGVhZGVyc1siWC1BbXotQ29udGVudC1TaGEyNTYiXT1yLHQoKSl9KSl9ZWxzZSB0KCl9fSkpLGUoIlNFVF9DT05URU5UX0xFTkdUSCIsImFmdGVyQnVpbGQiLChmdW5jdGlvbihlKXt2YXIgdD1pKGUpLHI9bi51dGlsLmdldFJlcXVlc3RQYXlsb2FkU2hhcGUoZSk7aWYodm9pZCAwPT09ZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LUxlbmd0aCJdKXRyeXt2YXIgbz1uLnV0aWwuc3RyaW5nLmJ5dGVMZW5ndGgoZS5odHRwUmVxdWVzdC5ib2R5KTtlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIkNvbnRlbnQtTGVuZ3RoIl09b31jYXRjaChuKXtpZihyJiZyLmlzU3RyZWFtaW5nKXtpZihyLnJlcXVpcmVzTGVuZ3RoKXRocm93IG47aWYodC5pbmRleE9mKCJ1bnNpZ25lZC1ib2R5Iik+PTApcmV0dXJuIHZvaWQoZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJUcmFuc2Zlci1FbmNvZGluZyJdPSJjaHVua2VkIik7dGhyb3cgbn10aHJvdyBufX0pKSxlKCJTRVRfSFRUUF9IT1NUIiwiYWZ0ZXJCdWlsZCIsKGZ1bmN0aW9uKGUpe2UuaHR0cFJlcXVlc3QuaGVhZGVycy5Ib3N0PWUuaHR0cFJlcXVlc3QuZW5kcG9pbnQuaG9zdH0pKSxlKCJTRVRfVFJBQ0VfSUQiLCJhZnRlckJ1aWxkIiwoZnVuY3Rpb24oZSl7dmFyIHI9IlgtQW16bi1UcmFjZS1JZCI7aWYobi51dGlsLmlzTm9kZSgpJiYhT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZS5odHRwUmVxdWVzdC5oZWFkZXJzLHIpKXt2YXIgbz10LmVudi5BV1NfTEFNQkRBX0ZVTkNUSU9OX05BTUUsaT10LmVudi5fWF9BTVpOX1RSQUNFX0lEOyJzdHJpbmciPT10eXBlb2YgbyYmby5sZW5ndGg+MCYmInN0cmluZyI9PXR5cGVvZiBpJiZpLmxlbmd0aD4wJiYoZS5odHRwUmVxdWVzdC5oZWFkZXJzW3JdPWkpfX0pKSxlKCJSRVNUQVJUIiwicmVzdGFydCIsKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5yZXNwb25zZS5lcnJvcjtlJiZlLnJldHJ5YWJsZSYmKHRoaXMuaHR0cFJlcXVlc3Q9bmV3IG4uSHR0cFJlcXVlc3QodGhpcy5zZXJ2aWNlLmVuZHBvaW50LHRoaXMuc2VydmljZS5yZWdpb24pLHRoaXMucmVzcG9uc2UucmV0cnlDb3VudDx0aGlzLnNlcnZpY2UuY29uZmlnLm1heFJldHJpZXM/dGhpcy5yZXNwb25zZS5yZXRyeUNvdW50Kys6dGhpcy5yZXNwb25zZS5lcnJvcj1udWxsKX0pKSxyKCJESVNDT1ZFUl9FTkRQT0lOVCIsInNpZ24iLG8sITApLHIoIlNJR04iLCJzaWduIiwoZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnNlcnZpY2Uscj1zKGUpO2lmKCFyfHwwPT09ci5sZW5ndGgpcmV0dXJuIHQoKTsiYmVhcmVyIj09PXI/bi5jb25maWcuZ2V0VG9rZW4oKGZ1bmN0aW9uKHIsbyl7aWYocilyZXR1cm4gZS5yZXNwb25zZS5lcnJvcj1yLHQoKTt0cnl7bmV3KG4uZ2V0U2lnbmVyQ2xhc3MoZSkpKGUuaHR0cFJlcXVlc3QpLmFkZEF1dGhvcml6YXRpb24obyl9Y2F0Y2godCl7ZS5yZXNwb25zZS5lcnJvcj10fXQoKX0pKTpuLmNvbmZpZy5nZXRDcmVkZW50aWFscygoZnVuY3Rpb24ocixvKXtpZihyKXJldHVybiBlLnJlc3BvbnNlLmVycm9yPXIsdCgpO3RyeXt2YXIgaT1uLmdldFNrZXdDb3JyZWN0ZWREYXRlKCkscz1uLmdldFNpZ25lckNsYXNzKGUpLGE9KGUuc2VydmljZS5hcGkub3BlcmF0aW9uc3x8e30pW2Uub3BlcmF0aW9uXSxjPW5ldyBzKGUuaHR0cFJlcXVlc3Qsbi5nZXRTaWduaW5nTmFtZShlKSx7c2lnbmF0dXJlQ2FjaGU6bi5jb25maWcuc2lnbmF0dXJlQ2FjaGUsb3BlcmF0aW9uOmEsc2lnbmF0dXJlVmVyc2lvbjpuLmFwaS5zaWduYXR1cmVWZXJzaW9ufSk7Yy5zZXRTZXJ2aWNlQ2xpZW50SWQobi5fY2xpZW50SWQpLGRlbGV0ZSBlLmh0dHBSZXF1ZXN0LmhlYWRlcnMuQXV0aG9yaXphdGlvbixkZWxldGUgZS5odHRwUmVxdWVzdC5oZWFkZXJzLkRhdGUsZGVsZXRlIGUuaHR0cFJlcXVlc3QuaGVhZGVyc1siWC1BbXotRGF0ZSJdLGMuYWRkQXV0aG9yaXphdGlvbihvLGkpLGUuc2lnbmVkQXQ9aX1jYXRjaCh0KXtlLnJlc3BvbnNlLmVycm9yPXR9dCgpfSkpfSkpLGUoIlZBTElEQVRFX1JFU1BPTlNFIiwidmFsaWRhdGVSZXNwb25zZSIsKGZ1bmN0aW9uKGUpe3RoaXMuc2VydmljZS5zdWNjZXNzZnVsUmVzcG9uc2UoZSx0aGlzKT8oZS5kYXRhPXt9LGUuZXJyb3I9bnVsbCk6KGUuZGF0YT1udWxsLGUuZXJyb3I9bi51dGlsLmVycm9yKG5ldyBFcnJvcix7Y29kZToiVW5rbm93bkVycm9yIixtZXNzYWdlOiJBbiB1bmtub3duIGVycm9yIG9jY3VycmVkLiJ9KSl9KSksZSgiRVJST1IiLCJlcnJvciIsKGZ1bmN0aW9uKGUsdCl7aWYodC5yZXF1ZXN0LnNlcnZpY2UuYXBpLmF3c1F1ZXJ5Q29tcGF0aWJsZSl7dmFyIG49dC5odHRwUmVzcG9uc2UuaGVhZGVycyxyPW4/blsieC1hbXpuLXF1ZXJ5LWVycm9yIl06dm9pZCAwO3ImJnIuaW5jbHVkZXMoIjsiKSYmKHQuZXJyb3IuY29kZT1yLnNwbGl0KCI7IilbMF0pfX0pLCEwKSxyKCJTRU5EIiwic2VuZCIsKGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gcihyKXtlLmh0dHBSZXNwb25zZS5zdHJlYW09cjt2YXIgbz1lLnJlcXVlc3QuaHR0cFJlcXVlc3Quc3RyZWFtLGk9ZS5yZXF1ZXN0LnNlcnZpY2Uscz1pLmFwaSxhPWUucmVxdWVzdC5vcGVyYXRpb24sYz1zLm9wZXJhdGlvbnNbYV18fHt9O3Iub24oImhlYWRlcnMiLChmdW5jdGlvbihvLHMsYSl7aWYoZS5yZXF1ZXN0LmVtaXQoImh0dHBIZWFkZXJzIixbbyxzLGUsYV0pLCFlLmh0dHBSZXNwb25zZS5zdHJlYW1pbmcpaWYoMj09PW4uSHR0cENsaWVudC5zdHJlYW1zQXBpVmVyc2lvbil7aWYoYy5oYXNFdmVudE91dHB1dCYmaS5zdWNjZXNzZnVsUmVzcG9uc2UoZSkpcmV0dXJuIGUucmVxdWVzdC5lbWl0KCJodHRwRG9uZSIpLHZvaWQgdCgpO3Iub24oInJlYWRhYmxlIiwoZnVuY3Rpb24oKXt2YXIgdD1yLnJlYWQoKTtudWxsIT09dCYmZS5yZXF1ZXN0LmVtaXQoImh0dHBEYXRhIixbdCxlXSl9KSl9ZWxzZSByLm9uKCJkYXRhIiwoZnVuY3Rpb24odCl7ZS5yZXF1ZXN0LmVtaXQoImh0dHBEYXRhIixbdCxlXSl9KSl9KSksci5vbigiZW5kIiwoZnVuY3Rpb24oKXtpZighb3x8IW8uZGlkQ2FsbGJhY2spe2lmKDI9PT1uLkh0dHBDbGllbnQuc3RyZWFtc0FwaVZlcnNpb24mJmMuaGFzRXZlbnRPdXRwdXQmJmkuc3VjY2Vzc2Z1bFJlc3BvbnNlKGUpKXJldHVybjtlLnJlcXVlc3QuZW1pdCgiaHR0cERvbmUiKSx0KCl9fSkpfWZ1bmN0aW9uIG8ocil7aWYoIlJlcXVlc3RBYm9ydGVkRXJyb3IiIT09ci5jb2RlKXt2YXIgbz0iVGltZW91dEVycm9yIj09PXIuY29kZT9yLmNvZGU6Ik5ldHdvcmtpbmdFcnJvciI7cj1uLnV0aWwuZXJyb3Iocix7Y29kZTpvLHJlZ2lvbjplLnJlcXVlc3QuaHR0cFJlcXVlc3QucmVnaW9uLGhvc3RuYW1lOmUucmVxdWVzdC5odHRwUmVxdWVzdC5lbmRwb2ludC5ob3N0bmFtZSxyZXRyeWFibGU6ITB9KX1lLmVycm9yPXIsZS5yZXF1ZXN0LmVtaXQoImh0dHBFcnJvciIsW2UuZXJyb3IsZV0sKGZ1bmN0aW9uKCl7dCgpfSkpfWZ1bmN0aW9uIGkoKXt2YXIgdCxpPW4uSHR0cENsaWVudC5nZXRJbnN0YW5jZSgpLHM9ZS5yZXF1ZXN0LnNlcnZpY2UuY29uZmlnLmh0dHBPcHRpb25zfHx7fTt0cnl7dmFyIGE9aS5oYW5kbGVSZXF1ZXN0KGUucmVxdWVzdC5odHRwUmVxdWVzdCxzLHIsbyk7KHQ9YSkub24oInNlbmRQcm9ncmVzcyIsKGZ1bmN0aW9uKHQpe2UucmVxdWVzdC5lbWl0KCJodHRwVXBsb2FkUHJvZ3Jlc3MiLFt0LGVdKX0pKSx0Lm9uKCJyZWNlaXZlUHJvZ3Jlc3MiLChmdW5jdGlvbih0KXtlLnJlcXVlc3QuZW1pdCgiaHR0cERvd25sb2FkUHJvZ3Jlc3MiLFt0LGVdKX0pKX1jYXRjaChlKXtvKGUpfX1lLmh0dHBSZXNwb25zZS5fYWJvcnRDYWxsYmFjaz10LGUuZXJyb3I9bnVsbCxlLmRhdGE9bnVsbCwoZS5yZXF1ZXN0LnNlcnZpY2UuZ2V0U2tld0NvcnJlY3RlZERhdGUoKS10aGlzLnNpZ25lZEF0KS8xZTM+PTYwMD90aGlzLmVtaXQoInNpZ24iLFt0aGlzXSwoZnVuY3Rpb24oZSl7ZT90KGUpOmkoKX0pKTppKCl9KSksZSgiSFRUUF9IRUFERVJTIiwiaHR0cEhlYWRlcnMiLChmdW5jdGlvbihlLHQscixvKXtyLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlPWUsci5odHRwUmVzcG9uc2Uuc3RhdHVzTWVzc2FnZT1vLHIuaHR0cFJlc3BvbnNlLmhlYWRlcnM9dCxyLmh0dHBSZXNwb25zZS5ib2R5PW4udXRpbC5idWZmZXIudG9CdWZmZXIoIiIpLHIuaHR0cFJlc3BvbnNlLmJ1ZmZlcnM9W10sci5odHRwUmVzcG9uc2UubnVtQnl0ZXM9MDt2YXIgaT10LmRhdGV8fHQuRGF0ZSxzPXIucmVxdWVzdC5zZXJ2aWNlO2lmKGkpe3ZhciBhPURhdGUucGFyc2UoaSk7cy5jb25maWcuY29ycmVjdENsb2NrU2tldyYmcy5pc0Nsb2NrU2tld2VkKGEpJiZzLmFwcGx5Q2xvY2tPZmZzZXQoYSl9fSkpLGUoIkhUVFBfREFUQSIsImh0dHBEYXRhIiwoZnVuY3Rpb24oZSx0KXtpZihlKXtpZihuLnV0aWwuaXNOb2RlKCkpe3QuaHR0cFJlc3BvbnNlLm51bUJ5dGVzKz1lLmxlbmd0aDt2YXIgcj10Lmh0dHBSZXNwb25zZS5oZWFkZXJzWyJjb250ZW50LWxlbmd0aCJdLG89e2xvYWRlZDp0Lmh0dHBSZXNwb25zZS5udW1CeXRlcyx0b3RhbDpyfTt0LnJlcXVlc3QuZW1pdCgiaHR0cERvd25sb2FkUHJvZ3Jlc3MiLFtvLHRdKX10Lmh0dHBSZXNwb25zZS5idWZmZXJzLnB1c2gobi51dGlsLmJ1ZmZlci50b0J1ZmZlcihlKSl9fSkpLGUoIkhUVFBfRE9ORSIsImh0dHBEb25lIiwoZnVuY3Rpb24oZSl7aWYoZS5odHRwUmVzcG9uc2UuYnVmZmVycyYmZS5odHRwUmVzcG9uc2UuYnVmZmVycy5sZW5ndGg+MCl7dmFyIHQ9bi51dGlsLmJ1ZmZlci5jb25jYXQoZS5odHRwUmVzcG9uc2UuYnVmZmVycyk7ZS5odHRwUmVzcG9uc2UuYm9keT10fWRlbGV0ZSBlLmh0dHBSZXNwb25zZS5udW1CeXRlcyxkZWxldGUgZS5odHRwUmVzcG9uc2UuYnVmZmVyc30pKSxlKCJGSU5BTElaRV9FUlJPUiIsInJldHJ5IiwoZnVuY3Rpb24oZSl7ZS5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSYmKGUuZXJyb3Iuc3RhdHVzQ29kZT1lLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlLHZvaWQgMD09PWUuZXJyb3IucmV0cnlhYmxlJiYoZS5lcnJvci5yZXRyeWFibGU9dGhpcy5zZXJ2aWNlLnJldHJ5YWJsZUVycm9yKGUuZXJyb3IsdGhpcykpKX0pKSxlKCJJTlZBTElEQVRFX0NSRURFTlRJQUxTIiwicmV0cnkiLChmdW5jdGlvbihlKXtpZihlLmVycm9yKXN3aXRjaChlLmVycm9yLmNvZGUpe2Nhc2UiUmVxdWVzdEV4cGlyZWQiOmNhc2UiRXhwaXJlZFRva2VuRXhjZXB0aW9uIjpjYXNlIkV4cGlyZWRUb2tlbiI6ZS5lcnJvci5yZXRyeWFibGU9ITAsZS5yZXF1ZXN0LnNlcnZpY2UuY29uZmlnLmNyZWRlbnRpYWxzLmV4cGlyZWQ9ITB9fSkpLGUoIkVYUElSRURfU0lHTkFUVVJFIiwicmV0cnkiLChmdW5jdGlvbihlKXt2YXIgdD1lLmVycm9yO3QmJiJzdHJpbmciPT10eXBlb2YgdC5jb2RlJiYic3RyaW5nIj09dHlwZW9mIHQubWVzc2FnZSYmdC5jb2RlLm1hdGNoKC9TaWduYXR1cmUvKSYmdC5tZXNzYWdlLm1hdGNoKC9leHBpcmVkLykmJihlLmVycm9yLnJldHJ5YWJsZT0hMCl9KSksZSgiQ0xPQ0tfU0tFV0VEIiwicmV0cnkiLChmdW5jdGlvbihlKXtlLmVycm9yJiZ0aGlzLnNlcnZpY2UuY2xvY2tTa2V3RXJyb3IoZS5lcnJvcikmJnRoaXMuc2VydmljZS5jb25maWcuY29ycmVjdENsb2NrU2tldyYmKGUuZXJyb3IucmV0cnlhYmxlPSEwKX0pKSxlKCJSRURJUkVDVCIsInJldHJ5IiwoZnVuY3Rpb24oZSl7ZS5lcnJvciYmZS5lcnJvci5zdGF0dXNDb2RlPj0zMDAmJmUuZXJyb3Iuc3RhdHVzQ29kZTw0MDAmJmUuaHR0cFJlc3BvbnNlLmhlYWRlcnMubG9jYXRpb24mJih0aGlzLmh0dHBSZXF1ZXN0LmVuZHBvaW50PW5ldyBuLkVuZHBvaW50KGUuaHR0cFJlc3BvbnNlLmhlYWRlcnMubG9jYXRpb24pLHRoaXMuaHR0cFJlcXVlc3QuaGVhZGVycy5Ib3N0PXRoaXMuaHR0cFJlcXVlc3QuZW5kcG9pbnQuaG9zdCxlLmVycm9yLnJlZGlyZWN0PSEwLGUuZXJyb3IucmV0cnlhYmxlPSEwKX0pKSxlKCJSRVRSWV9DSEVDSyIsInJldHJ5IiwoZnVuY3Rpb24oZSl7ZS5lcnJvciYmKGUuZXJyb3IucmVkaXJlY3QmJmUucmVkaXJlY3RDb3VudDxlLm1heFJlZGlyZWN0cz9lLmVycm9yLnJldHJ5RGVsYXk9MDplLnJldHJ5Q291bnQ8ZS5tYXhSZXRyaWVzJiYoZS5lcnJvci5yZXRyeURlbGF5PXRoaXMuc2VydmljZS5yZXRyeURlbGF5cyhlLnJldHJ5Q291bnQsZS5lcnJvcil8fDApKX0pKSxyKCJSRVNFVF9SRVRSWV9TVEFURSIsImFmdGVyUmV0cnkiLChmdW5jdGlvbihlLHQpe3ZhciBuLHI9ITE7ZS5lcnJvciYmKG49ZS5lcnJvci5yZXRyeURlbGF5fHwwLGUuZXJyb3IucmV0cnlhYmxlJiZlLnJldHJ5Q291bnQ8ZS5tYXhSZXRyaWVzPyhlLnJldHJ5Q291bnQrKyxyPSEwKTplLmVycm9yLnJlZGlyZWN0JiZlLnJlZGlyZWN0Q291bnQ8ZS5tYXhSZWRpcmVjdHMmJihlLnJlZGlyZWN0Q291bnQrKyxyPSEwKSksciYmbj49MD8oZS5lcnJvcj1udWxsLHNldFRpbWVvdXQodCxuKSk6dCgpfSkpfSkpLENvcmVQb3N0OihuZXcgcikuYWRkTmFtZWRMaXN0ZW5lcnMoKGZ1bmN0aW9uKGUpe2UoIkVYVFJBQ1RfUkVRVUVTVF9JRCIsImV4dHJhY3REYXRhIixuLnV0aWwuZXh0cmFjdFJlcXVlc3RJZCksZSgiRVhUUkFDVF9SRVFVRVNUX0lEIiwiZXh0cmFjdEVycm9yIixuLnV0aWwuZXh0cmFjdFJlcXVlc3RJZCksZSgiRU5PVEZPVU5EX0VSUk9SIiwiaHR0cEVycm9yIiwoZnVuY3Rpb24oZSl7aWYoIk5ldHdvcmtpbmdFcnJvciI9PT1lLmNvZGUmJmZ1bmN0aW9uKGUpe3JldHVybiJFTk9URk9VTkQiPT09ZS5lcnJub3x8Im51bWJlciI9PXR5cGVvZiBlLmVycm5vJiYiZnVuY3Rpb24iPT10eXBlb2Ygbi51dGlsLmdldFN5c3RlbUVycm9yTmFtZSYmWyJFQUlfTk9OQU1FIiwiRUFJX05PREFUQSJdLmluZGV4T2Yobi51dGlsLmdldFN5c3RlbUVycm9yTmFtZShlLmVycm5vKT49MCl9KGUpKXt2YXIgdD0iSW5hY2Nlc3NpYmxlIGhvc3Q6IGAiK2UuaG9zdG5hbWUrIicgYXQgcG9ydCBgIitlLnBvcnQrIicuIFRoaXMgc2VydmljZSBtYXkgbm90IGJlIGF2YWlsYWJsZSBpbiB0aGUgYCIrZS5yZWdpb24rIicgcmVnaW9uLiI7dGhpcy5yZXNwb25zZS5lcnJvcj1uLnV0aWwuZXJyb3IobmV3IEVycm9yKHQpLHtjb2RlOiJVbmtub3duRW5kcG9pbnQiLHJlZ2lvbjplLnJlZ2lvbixob3N0bmFtZTplLmhvc3RuYW1lLHJldHJ5YWJsZTohMCxvcmlnaW5hbEVycm9yOmV9KX19KSl9KSksTG9nZ2VyOihuZXcgcikuYWRkTmFtZWRMaXN0ZW5lcnMoKGZ1bmN0aW9uKHQpe3QoIkxPR19SRVFVRVNUIiwiY29tcGxldGUiLChmdW5jdGlvbih0KXt2YXIgcj10LnJlcXVlc3Qsbz1yLnNlcnZpY2UuY29uZmlnLmxvZ2dlcjtpZihvKXt2YXIgaT1mdW5jdGlvbigpe3ZhciBpPSh0LnJlcXVlc3Quc2VydmljZS5nZXRTa2V3Q29ycmVjdGVkRGF0ZSgpLmdldFRpbWUoKS1yLnN0YXJ0VGltZS5nZXRUaW1lKCkpLzFlMyxhPSEhby5pc1RUWSxjPXQuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUsdT1yLnBhcmFtcztyLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnMmJnIuc2VydmljZS5hcGkub3BlcmF0aW9uc1tyLm9wZXJhdGlvbl0mJnIuc2VydmljZS5hcGkub3BlcmF0aW9uc1tyLm9wZXJhdGlvbl0uaW5wdXQmJih1PXMoci5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW3Iub3BlcmF0aW9uXS5pbnB1dCxyLnBhcmFtcykpO3ZhciBsPWUoInV0aWwiKS5pbnNwZWN0KHUsITAsbnVsbCkscD0iIjtyZXR1cm4gYSYmKHArPSIbWzMzbSIpLHArPSJbQVdTICIrci5zZXJ2aWNlLnNlcnZpY2VJZGVudGlmaWVyKyIgIitjLHArPSIgIitpLnRvU3RyaW5nKCkrInMgIit0LnJldHJ5Q291bnQrIiByZXRyaWVzXSIsYSYmKHArPSIbWzA7MW0iKSxwKz0iICIrbi51dGlsLnN0cmluZy5sb3dlckZpcnN0KHIub3BlcmF0aW9uKSxwKz0iKCIrbCsiKSIsYSYmKHArPSIbWzBtIikscH0oKTsiZnVuY3Rpb24iPT10eXBlb2Ygby5sb2c/by5sb2coaSk6ImZ1bmN0aW9uIj09dHlwZW9mIG8ud3JpdGUmJm8ud3JpdGUoaSsiXG4iKX1mdW5jdGlvbiBzKGUsdCl7aWYoIXQpcmV0dXJuIHQ7aWYoZS5pc1NlbnNpdGl2ZSlyZXR1cm4iKioqU2Vuc2l0aXZlSW5mb3JtYXRpb24qKioiO3N3aXRjaChlLnR5cGUpe2Nhc2Uic3RydWN0dXJlIjp2YXIgcj17fTtyZXR1cm4gbi51dGlsLmVhY2godCwoZnVuY3Rpb24odCxuKXtPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZS5tZW1iZXJzLHQpP3JbdF09cyhlLm1lbWJlcnNbdF0sbik6clt0XT1ufSkpLHI7Y2FzZSJsaXN0Ijp2YXIgbz1bXTtyZXR1cm4gbi51dGlsLmFycmF5RWFjaCh0LChmdW5jdGlvbih0LG4pe28ucHVzaChzKGUubWVtYmVyLHQpKX0pKSxvO2Nhc2UibWFwIjp2YXIgaT17fTtyZXR1cm4gbi51dGlsLmVhY2godCwoZnVuY3Rpb24odCxuKXtpW3RdPXMoZS52YWx1ZSxuKX0pKSxpO2RlZmF1bHQ6cmV0dXJuIHR9fX0pKX0pKSxKc29uOihuZXcgcikuYWRkTmFtZWRMaXN0ZW5lcnMoKGZ1bmN0aW9uKHQpe3ZhciBuPWUoIi4vcHJvdG9jb2wvanNvbiIpO3QoIkJVSUxEIiwiYnVpbGQiLG4uYnVpbGRSZXF1ZXN0KSx0KCJFWFRSQUNUX0RBVEEiLCJleHRyYWN0RGF0YSIsbi5leHRyYWN0RGF0YSksdCgiRVhUUkFDVF9FUlJPUiIsImV4dHJhY3RFcnJvciIsbi5leHRyYWN0RXJyb3IpfSkpLFJlc3Q6KG5ldyByKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24odCl7dmFyIG49ZSgiLi9wcm90b2NvbC9yZXN0Iik7dCgiQlVJTEQiLCJidWlsZCIsbi5idWlsZFJlcXVlc3QpLHQoIkVYVFJBQ1RfREFUQSIsImV4dHJhY3REYXRhIixuLmV4dHJhY3REYXRhKSx0KCJFWFRSQUNUX0VSUk9SIiwiZXh0cmFjdEVycm9yIixuLmV4dHJhY3RFcnJvcil9KSksUmVzdEpzb246KG5ldyByKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24odCl7dmFyIG49ZSgiLi9wcm90b2NvbC9yZXN0X2pzb24iKTt0KCJCVUlMRCIsImJ1aWxkIixuLmJ1aWxkUmVxdWVzdCksdCgiRVhUUkFDVF9EQVRBIiwiZXh0cmFjdERhdGEiLG4uZXh0cmFjdERhdGEpLHQoIkVYVFJBQ1RfRVJST1IiLCJleHRyYWN0RXJyb3IiLG4uZXh0cmFjdEVycm9yKSx0KCJVTlNFVF9DT05URU5UX0xFTkdUSCIsImFmdGVyQnVpbGQiLG4udW5zZXRDb250ZW50TGVuZ3RoKX0pKSxSZXN0WG1sOihuZXcgcikuYWRkTmFtZWRMaXN0ZW5lcnMoKGZ1bmN0aW9uKHQpe3ZhciBuPWUoIi4vcHJvdG9jb2wvcmVzdF94bWwiKTt0KCJCVUlMRCIsImJ1aWxkIixuLmJ1aWxkUmVxdWVzdCksdCgiRVhUUkFDVF9EQVRBIiwiZXh0cmFjdERhdGEiLG4uZXh0cmFjdERhdGEpLHQoIkVYVFJBQ1RfRVJST1IiLCJleHRyYWN0RXJyb3IiLG4uZXh0cmFjdEVycm9yKX0pKSxRdWVyeToobmV3IHIpLmFkZE5hbWVkTGlzdGVuZXJzKChmdW5jdGlvbih0KXt2YXIgbj1lKCIuL3Byb3RvY29sL3F1ZXJ5Iik7dCgiQlVJTEQiLCJidWlsZCIsbi5idWlsZFJlcXVlc3QpLHQoIkVYVFJBQ1RfREFUQSIsImV4dHJhY3REYXRhIixuLmV4dHJhY3REYXRhKSx0KCJFWFRSQUNUX0VSUk9SIiwiZXh0cmFjdEVycm9yIixuLmV4dHJhY3RFcnJvcil9KSl9fSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpKX0seyIuL2NvcmUiOjE5LCIuL2Rpc2NvdmVyX2VuZHBvaW50IjoyNywiLi9wcm90b2NvbC9qc29uIjo0OCwiLi9wcm90b2NvbC9xdWVyeSI6NDksIi4vcHJvdG9jb2wvcmVzdCI6NTAsIi4vcHJvdG9jb2wvcmVzdF9qc29uIjo1MSwiLi9wcm90b2NvbC9yZXN0X3htbCI6NTIsIi4vc2VxdWVudGlhbF9leGVjdXRvciI6NjEsX3Byb2Nlc3M6OTIsdXRpbDo4Nn1dLDM1OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9jb3JlIiksbz1yLnV0aWwuaW5oZXJpdDtyLkVuZHBvaW50PW8oe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUsdCl7aWYoci51dGlsLmhpZGVQcm9wZXJ0aWVzKHRoaXMsWyJzbGFzaGVzIiwiYXV0aCIsImhhc2giLCJzZWFyY2giLCJxdWVyeSJdKSxudWxsPT1lKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBlbmRwb2ludDogIitlKTtpZigic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIHIudXRpbC5jb3B5KGUpO2UubWF0Y2goL15odHRwLyl8fChlPSgodCYmdm9pZCAwIT09dC5zc2xFbmFibGVkP3Quc3NsRW5hYmxlZDpyLmNvbmZpZy5zc2xFbmFibGVkKT8iaHR0cHMiOiJodHRwIikrIjovLyIrZSksci51dGlsLnVwZGF0ZSh0aGlzLHIudXRpbC51cmxQYXJzZShlKSksdGhpcy5wb3J0P3RoaXMucG9ydD1wYXJzZUludCh0aGlzLnBvcnQsMTApOnRoaXMucG9ydD0iaHR0cHM6Ij09PXRoaXMucHJvdG9jb2w/NDQzOjgwfX0pLHIuSHR0cFJlcXVlc3Q9byh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0KXtlPW5ldyByLkVuZHBvaW50KGUpLHRoaXMubWV0aG9kPSJQT1NUIix0aGlzLnBhdGg9ZS5wYXRofHwiLyIsdGhpcy5oZWFkZXJzPXt9LHRoaXMuYm9keT0iIix0aGlzLmVuZHBvaW50PWUsdGhpcy5yZWdpb249dCx0aGlzLl91c2VyQWdlbnQ9IiIsdGhpcy5zZXRVc2VyQWdlbnQoKX0sc2V0VXNlckFnZW50OmZ1bmN0aW9uKCl7dGhpcy5fdXNlckFnZW50PXRoaXMuaGVhZGVyc1t0aGlzLmdldFVzZXJBZ2VudEhlYWRlck5hbWUoKV09ci51dGlsLnVzZXJBZ2VudCgpfSxnZXRVc2VyQWdlbnRIZWFkZXJOYW1lOmZ1bmN0aW9uKCl7cmV0dXJuKHIudXRpbC5pc0Jyb3dzZXIoKT8iWC1BbXotIjoiIikrIlVzZXItQWdlbnQifSxhcHBlbmRUb1VzZXJBZ2VudDpmdW5jdGlvbihlKXsic3RyaW5nIj09dHlwZW9mIGUmJmUmJih0aGlzLl91c2VyQWdlbnQrPSIgIitlKSx0aGlzLmhlYWRlcnNbdGhpcy5nZXRVc2VyQWdlbnRIZWFkZXJOYW1lKCldPXRoaXMuX3VzZXJBZ2VudH0sZ2V0VXNlckFnZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VzZXJBZ2VudH0scGF0aG5hbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXRoLnNwbGl0KCI/IiwxKVswXX0sc2VhcmNoOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wYXRoLnNwbGl0KCI/IiwyKVsxXTtyZXR1cm4gZT8oZT1yLnV0aWwucXVlcnlTdHJpbmdQYXJzZShlKSxyLnV0aWwucXVlcnlQYXJhbXNUb1N0cmluZyhlKSk6IiJ9LHVwZGF0ZUVuZHBvaW50OmZ1bmN0aW9uKGUpe3ZhciB0PW5ldyByLkVuZHBvaW50KGUpO3RoaXMuZW5kcG9pbnQ9dCx0aGlzLnBhdGg9dC5wYXRofHwiLyIsdGhpcy5oZWFkZXJzLkhvc3QmJih0aGlzLmhlYWRlcnMuSG9zdD10Lmhvc3QpfX0pLHIuSHR0cFJlc3BvbnNlPW8oe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXNDb2RlPXZvaWQgMCx0aGlzLmhlYWRlcnM9e30sdGhpcy5ib2R5PXZvaWQgMCx0aGlzLnN0cmVhbWluZz0hMSx0aGlzLnN0cmVhbT1udWxsfSxjcmVhdGVVbmJ1ZmZlcmVkU3RyZWFtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RyZWFtaW5nPSEwLHRoaXMuc3RyZWFtfX0pLHIuSHR0cENsaWVudD1vKHt9KSxyLkh0dHBDbGllbnQuZ2V0SW5zdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5zaW5nbGV0b24mJih0aGlzLnNpbmdsZXRvbj1uZXcgdGhpcyksdGhpcy5zaW5nbGV0b259fSx7Ii4vY29yZSI6MTl9XSwzNjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoImV2ZW50cyIpLkV2ZW50RW1pdHRlcjtlKCIuLi9odHRwIiksci5YSFJDbGllbnQ9ci51dGlsLmluaGVyaXQoe2hhbmRsZVJlcXVlc3Q6ZnVuY3Rpb24oZSx0LG4saSl7dmFyIHM9dGhpcyxhPWUuZW5kcG9pbnQsYz1uZXcgbyx1PWEucHJvdG9jb2wrIi8vIithLmhvc3RuYW1lOzgwIT09YS5wb3J0JiY0NDMhPT1hLnBvcnQmJih1Kz0iOiIrYS5wb3J0KSx1Kz1lLnBhdGg7dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0LHA9ITE7ZS5zdHJlYW09bCxsLmFkZEV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLChmdW5jdGlvbigpe3RyeXtpZigwPT09bC5zdGF0dXMpcmV0dXJufWNhdGNoKGUpe3JldHVybn10aGlzLnJlYWR5U3RhdGU+PXRoaXMuSEVBREVSU19SRUNFSVZFRCYmIXAmJihjLnN0YXR1c0NvZGU9bC5zdGF0dXMsYy5oZWFkZXJzPXMucGFyc2VIZWFkZXJzKGwuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpLGMuZW1pdCgiaGVhZGVycyIsYy5zdGF0dXNDb2RlLGMuaGVhZGVycyxsLnN0YXR1c1RleHQpLHA9ITApLHRoaXMucmVhZHlTdGF0ZT09PXRoaXMuRE9ORSYmcy5maW5pc2hSZXF1ZXN0KGwsYyl9KSwhMSksbC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLChmdW5jdGlvbihlKXtjLmVtaXQoInNlbmRQcm9ncmVzcyIsZSl9KSksbC5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsKGZ1bmN0aW9uKGUpe2MuZW1pdCgicmVjZWl2ZVByb2dyZXNzIixlKX0pLCExKSxsLmFkZEV2ZW50TGlzdGVuZXIoInRpbWVvdXQiLChmdW5jdGlvbigpe2koci51dGlsLmVycm9yKG5ldyBFcnJvcigiVGltZW91dCIpLHtjb2RlOiJUaW1lb3V0RXJyb3IifSkpfSksITEpLGwuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLChmdW5jdGlvbigpe2koci51dGlsLmVycm9yKG5ldyBFcnJvcigiTmV0d29yayBGYWlsdXJlIikse2NvZGU6Ik5ldHdvcmtpbmdFcnJvciJ9KSl9KSwhMSksbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsKGZ1bmN0aW9uKCl7aShyLnV0aWwuZXJyb3IobmV3IEVycm9yKCJSZXF1ZXN0IGFib3J0ZWQiKSx7Y29kZToiUmVxdWVzdEFib3J0ZWRFcnJvciJ9KSl9KSwhMSksbihjKSxsLm9wZW4oZS5tZXRob2QsdSwhMSE9PXQueGhyQXN5bmMpLHIudXRpbC5lYWNoKGUuaGVhZGVycywoZnVuY3Rpb24oZSx0KXsiQ29udGVudC1MZW5ndGgiIT09ZSYmIlVzZXItQWdlbnQiIT09ZSYmIkhvc3QiIT09ZSYmbC5zZXRSZXF1ZXN0SGVhZGVyKGUsdCl9KSksdC50aW1lb3V0JiYhMSE9PXQueGhyQXN5bmMmJihsLnRpbWVvdXQ9dC50aW1lb3V0KSx0LnhocldpdGhDcmVkZW50aWFscyYmKGwud2l0aENyZWRlbnRpYWxzPSEwKTt0cnl7bC5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIn1jYXRjaChlKXt9dHJ5e2UuYm9keT9sLnNlbmQoZS5ib2R5KTpsLnNlbmQoKX1jYXRjaCh0KXtpZighZS5ib2R5fHwib2JqZWN0IiE9dHlwZW9mIGUuYm9keS5idWZmZXIpdGhyb3cgdDtsLnNlbmQoZS5ib2R5LmJ1ZmZlcil9cmV0dXJuIGN9LHBhcnNlSGVhZGVyczpmdW5jdGlvbihlKXt2YXIgdD17fTtyZXR1cm4gci51dGlsLmFycmF5RWFjaChlLnNwbGl0KC9ccj9cbi8pLChmdW5jdGlvbihlKXt2YXIgbj1lLnNwbGl0KCI6IiwxKVswXSxyPWUuc3Vic3RyaW5nKG4ubGVuZ3RoKzIpO24ubGVuZ3RoPjAmJih0W24udG9Mb3dlckNhc2UoKV09cil9KSksdH0sZmluaXNoUmVxdWVzdDpmdW5jdGlvbihlLHQpe3ZhciBuO2lmKCJhcnJheWJ1ZmZlciI9PT1lLnJlc3BvbnNlVHlwZSYmZS5yZXNwb25zZSl7dmFyIG89ZS5yZXNwb25zZTtuPW5ldyByLnV0aWwuQnVmZmVyKG8uYnl0ZUxlbmd0aCk7Zm9yKHZhciBpPW5ldyBVaW50OEFycmF5KG8pLHM9MDtzPG4ubGVuZ3RoOysrcyluW3NdPWlbc119dHJ5e258fCJzdHJpbmciIT10eXBlb2YgZS5yZXNwb25zZVRleHR8fChuPW5ldyByLnV0aWwuQnVmZmVyKGUucmVzcG9uc2VUZXh0KSl9Y2F0Y2goZSl7fW4mJnQuZW1pdCgiZGF0YSIsbiksdC5lbWl0KCJlbmQiKX19KSxyLkh0dHBDbGllbnQucHJvdG90eXBlPXIuWEhSQ2xpZW50LnByb3RvdHlwZSxyLkh0dHBDbGllbnQuc3RyZWFtc0FwaVZlcnNpb249MX0seyIuLi9jb3JlIjoxOSwiLi4vaHR0cCI6MzUsZXZlbnRzOjg4fV0sMzc6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIik7ZnVuY3Rpb24gbygpe31mdW5jdGlvbiBpKGUsdCl7aWYodCYmbnVsbCE9ZSlzd2l0Y2godC50eXBlKXtjYXNlInN0cnVjdHVyZSI6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7aWYodC5pc0RvY3VtZW50KXJldHVybiBlO3ZhciBuPXt9O3JldHVybiByLmVhY2goZSwoZnVuY3Rpb24oZSxyKXt2YXIgbz10Lm1lbWJlcnNbZV07aWYobyl7aWYoImJvZHkiIT09by5sb2NhdGlvbilyZXR1cm47dmFyIHM9by5pc0xvY2F0aW9uTmFtZT9vLm5hbWU6ZSxhPWkocixvKTt2b2lkIDAhPT1hJiYobltzXT1hKX19KSksbn0oZSx0KTtjYXNlIm1hcCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7dmFyIG49e307cmV0dXJuIHIuZWFjaChlLChmdW5jdGlvbihlLHIpe3ZhciBvPWkocix0LnZhbHVlKTt2b2lkIDAhPT1vJiYobltlXT1vKX0pKSxufShlLHQpO2Nhc2UibGlzdCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7dmFyIG49W107cmV0dXJuIHIuYXJyYXlFYWNoKGUsKGZ1bmN0aW9uKGUpe3ZhciByPWkoZSx0Lm1lbWJlcik7dm9pZCAwIT09ciYmbi5wdXNoKHIpfSkpLG59KGUsdCk7ZGVmYXVsdDpyZXR1cm4gZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC50b1dpcmVGb3JtYXQoZSl9KGUsdCl9fW8ucHJvdG90eXBlLmJ1aWxkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGkoZSx0KSl9LHQuZXhwb3J0cz1vfSx7Ii4uL3V0aWwiOjc0fV0sMzg6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIik7ZnVuY3Rpb24gbygpe31mdW5jdGlvbiBpKGUsdCl7aWYodCYmdm9pZCAwIT09ZSlzd2l0Y2godC50eXBlKXtjYXNlInN0cnVjdHVyZSI6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7aWYobnVsbCE9ZSl7aWYodC5pc0RvY3VtZW50KXJldHVybiBlO3ZhciBuPXt9LG89dC5tZW1iZXJzO3JldHVybiByLmVhY2gobywoZnVuY3Rpb24odCxyKXt2YXIgbz1yLmlzTG9jYXRpb25OYW1lP3IubmFtZTp0O2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG8pKXt2YXIgcz1pKGVbb10scik7dm9pZCAwIT09cyYmKG5bdF09cyl9fSkpLG59fShlLHQpO2Nhc2UibWFwIjpyZXR1cm4gZnVuY3Rpb24oZSx0KXtpZihudWxsIT1lKXt2YXIgbj17fTtyZXR1cm4gci5lYWNoKGUsKGZ1bmN0aW9uKGUscil7dmFyIG89aShyLHQudmFsdWUpO25bZV09dm9pZCAwPT09bz9udWxsOm99KSksbn19KGUsdCk7Y2FzZSJsaXN0IjpyZXR1cm4gZnVuY3Rpb24oZSx0KXtpZihudWxsIT1lKXt2YXIgbj1bXTtyZXR1cm4gci5hcnJheUVhY2goZSwoZnVuY3Rpb24oZSl7dmFyIHI9aShlLHQubWVtYmVyKTt2b2lkIDA9PT1yP24ucHVzaChudWxsKTpuLnB1c2gocil9KSksbn19KGUsdCk7ZGVmYXVsdDpyZXR1cm4gZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC50b1R5cGUoZSl9KGUsdCl9fW8ucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGkoSlNPTi5wYXJzZShlKSx0KX0sdC5leHBvcnRzPW99LHsiLi4vdXRpbCI6NzR9XSwzOTpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbihlKXsoZnVuY3Rpb24oKXt2YXIgbj1bIldlIGFyZSBmb3JtYWxpemluZyBvdXIgcGxhbnMgdG8gZW50ZXIgQVdTIFNESyBmb3IgSmF2YVNjcmlwdCAodjIpIGludG8gbWFpbnRlbmFuY2UgbW9kZSBpbiAyMDIzLlxuIiwiUGxlYXNlIG1pZ3JhdGUgeW91ciBjb2RlIHRvIHVzZSBBV1MgU0RLIGZvciBKYXZhU2NyaXB0ICh2MykuIiwiRm9yIG1vcmUgaW5mb3JtYXRpb24sIGNoZWNrIHRoZSBtaWdyYXRpb24gZ3VpZGUgYXQgaHR0cHM6Ly9hLmNvLzdQek1DY3kiXS5qb2luKCJcbiIpO3QuZXhwb3J0cz17c3VwcHJlc3M6ITF9LHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dC5leHBvcnRzLnN1cHByZXNzfHx2b2lkIDAhPT1lJiYoIm9iamVjdCI9PXR5cGVvZiBlLmVudiYmdm9pZCAwIT09ZS5lbnYuQVdTX0VYRUNVVElPTl9FTlYmJjA9PT1lLmVudi5BV1NfRVhFQ1VUSU9OX0VOVi5pbmRleE9mKCJBV1NfTGFtYmRhXyIpfHwib2JqZWN0Ij09dHlwZW9mIGUuZW52JiZ2b2lkIDAhPT1lLmVudi5BV1NfU0RLX0pTX1NVUFBSRVNTX01BSU5URU5BTkNFX01PREVfTUVTU0FHRXx8ImZ1bmN0aW9uIj09dHlwZW9mIGUuZW1pdFdhcm5pbmcmJmUuZW1pdFdhcm5pbmcobix7dHlwZToiTk9URSJ9KSl9KSwwKX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgiX3Byb2Nlc3MiKSl9LHtfcHJvY2Vzczo5Mn1dLDQwOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9jb2xsZWN0aW9uIiksbz1lKCIuL29wZXJhdGlvbiIpLGk9ZSgiLi9zaGFwZSIpLHM9ZSgiLi9wYWdpbmF0b3IiKSxhPWUoIi4vcmVzb3VyY2Vfd2FpdGVyIiksYz1lKCIuLi8uLi9hcGlzL21ldGFkYXRhLmpzb24iKSx1PWUoIi4uL3V0aWwiKSxsPXUucHJvcGVydHkscD11Lm1lbW9pemVkUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztlPWV8fHt9LCh0PXR8fHt9KS5hcGk9dGhpcyxlLm1ldGFkYXRhPWUubWV0YWRhdGF8fHt9O3ZhciBkPXQuc2VydmljZUlkZW50aWZpZXI7ZGVsZXRlIHQuc2VydmljZUlkZW50aWZpZXIsbCh0aGlzLCJpc0FwaSIsITAsITEpLGwodGhpcywiYXBpVmVyc2lvbiIsZS5tZXRhZGF0YS5hcGlWZXJzaW9uKSxsKHRoaXMsImVuZHBvaW50UHJlZml4IixlLm1ldGFkYXRhLmVuZHBvaW50UHJlZml4KSxsKHRoaXMsInNpZ25pbmdOYW1lIixlLm1ldGFkYXRhLnNpZ25pbmdOYW1lKSxsKHRoaXMsImdsb2JhbEVuZHBvaW50IixlLm1ldGFkYXRhLmdsb2JhbEVuZHBvaW50KSxsKHRoaXMsInNpZ25hdHVyZVZlcnNpb24iLGUubWV0YWRhdGEuc2lnbmF0dXJlVmVyc2lvbiksbCh0aGlzLCJqc29uVmVyc2lvbiIsZS5tZXRhZGF0YS5qc29uVmVyc2lvbiksbCh0aGlzLCJ0YXJnZXRQcmVmaXgiLGUubWV0YWRhdGEudGFyZ2V0UHJlZml4KSxsKHRoaXMsInByb3RvY29sIixlLm1ldGFkYXRhLnByb3RvY29sKSxsKHRoaXMsInRpbWVzdGFtcEZvcm1hdCIsZS5tZXRhZGF0YS50aW1lc3RhbXBGb3JtYXQpLGwodGhpcywieG1sTmFtZXNwYWNlVXJpIixlLm1ldGFkYXRhLnhtbE5hbWVzcGFjZSksbCh0aGlzLCJhYmJyZXZpYXRpb24iLGUubWV0YWRhdGEuc2VydmljZUFiYnJldmlhdGlvbiksbCh0aGlzLCJmdWxsTmFtZSIsZS5tZXRhZGF0YS5zZXJ2aWNlRnVsbE5hbWUpLGwodGhpcywic2VydmljZUlkIixlLm1ldGFkYXRhLnNlcnZpY2VJZCksZCYmY1tkXSYmbCh0aGlzLCJ4bWxOb0RlZmF1bHRMaXN0cyIsY1tkXS54bWxOb0RlZmF1bHRMaXN0cywhMSkscCh0aGlzLCJjbGFzc05hbWUiLChmdW5jdGlvbigpe3ZhciB0PWUubWV0YWRhdGEuc2VydmljZUFiYnJldmlhdGlvbnx8ZS5tZXRhZGF0YS5zZXJ2aWNlRnVsbE5hbWU7cmV0dXJuIHQ/KCJFbGFzdGljTG9hZEJhbGFuY2luZyI9PT0odD10LnJlcGxhY2UoL15BbWF6b258QVdTXHMqfFwoLip8XHMrfFxXKy9nLCIiKSkmJih0PSJFTEIiKSx0KTpudWxsfSkpLGwodGhpcywib3BlcmF0aW9ucyIsbmV3IHIoZS5vcGVyYXRpb25zLHQsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIG5ldyBvKGUsbix0KX0pLHUuc3RyaW5nLmxvd2VyRmlyc3QsKGZ1bmN0aW9uKGUsdCl7ITA9PT10LmVuZHBvaW50b3BlcmF0aW9uJiZsKG4sImVuZHBvaW50T3BlcmF0aW9uIix1LnN0cmluZy5sb3dlckZpcnN0KGUpKSx0LmVuZHBvaW50ZGlzY292ZXJ5JiYhbi5oYXNSZXF1aXJlZEVuZHBvaW50RGlzY292ZXJ5JiZsKG4sImhhc1JlcXVpcmVkRW5kcG9pbnREaXNjb3ZlcnkiLCEwPT09dC5lbmRwb2ludGRpc2NvdmVyeS5yZXF1aXJlZCl9KSkpLGwodGhpcywic2hhcGVzIixuZXcgcihlLnNoYXBlcyx0LChmdW5jdGlvbihlLG4pe3JldHVybiBpLmNyZWF0ZShuLHQpfSkpKSxsKHRoaXMsInBhZ2luYXRvcnMiLG5ldyByKGUucGFnaW5hdG9ycyx0LChmdW5jdGlvbihlLG4pe3JldHVybiBuZXcgcyhlLG4sdCl9KSkpLGwodGhpcywid2FpdGVycyIsbmV3IHIoZS53YWl0ZXJzLHQsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIG5ldyBhKGUsbix0KX0pLHUuc3RyaW5nLmxvd2VyRmlyc3QpKSx0LmRvY3VtZW50YXRpb24mJihsKHRoaXMsImRvY3VtZW50YXRpb24iLGUuZG9jdW1lbnRhdGlvbiksbCh0aGlzLCJkb2N1bWVudGF0aW9uVXJsIixlLmRvY3VtZW50YXRpb25VcmwpKSxsKHRoaXMsImF3c1F1ZXJ5Q29tcGF0aWJsZSIsZS5tZXRhZGF0YS5hd3NRdWVyeUNvbXBhdGlibGUpfX0seyIuLi8uLi9hcGlzL21ldGFkYXRhLmpzb24iOjQsIi4uL3V0aWwiOjc0LCIuL2NvbGxlY3Rpb24iOjQxLCIuL29wZXJhdGlvbiI6NDIsIi4vcGFnaW5hdG9yIjo0MywiLi9yZXNvdXJjZV93YWl0ZXIiOjQ0LCIuL3NoYXBlIjo0NX1dLDQxOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpLm1lbW9pemVkUHJvcGVydHk7ZnVuY3Rpb24gbyhlLHQsbixvKXtyKHRoaXMsbyhlKSwoZnVuY3Rpb24oKXtyZXR1cm4gbihlLHQpfSkpfXQuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixyLGkpe2Zvcih2YXIgcyBpbiByPXJ8fFN0cmluZyxlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHMpJiYoby5jYWxsKHRoaXMscyxlW3NdLG4sciksaSYmaShzLGVbc10pKX19LHsiLi4vdXRpbCI6NzR9XSw0MjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vc2hhcGUiKSxvPWUoIi4uL3V0aWwiKSxpPW8ucHJvcGVydHkscz1vLm1lbW9pemVkUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgbz10aGlzO249bnx8e30saSh0aGlzLCJuYW1lIix0Lm5hbWV8fGUpLGkodGhpcywiYXBpIixuLmFwaSwhMSksdC5odHRwPXQuaHR0cHx8e30saSh0aGlzLCJlbmRwb2ludCIsdC5lbmRwb2ludCksaSh0aGlzLCJodHRwTWV0aG9kIix0Lmh0dHAubWV0aG9kfHwiUE9TVCIpLGkodGhpcywiaHR0cFBhdGgiLHQuaHR0cC5yZXF1ZXN0VXJpfHwiLyIpLGkodGhpcywiYXV0aHR5cGUiLHQuYXV0aHR5cGV8fCIiKSxpKHRoaXMsImVuZHBvaW50RGlzY292ZXJ5UmVxdWlyZWQiLHQuZW5kcG9pbnRkaXNjb3Zlcnk/dC5lbmRwb2ludGRpc2NvdmVyeS5yZXF1aXJlZD8iUkVRVUlSRUQiOiJPUFRJT05BTCI6Ik5VTEwiKTt2YXIgYT10Lmh0dHBDaGVja3N1bVJlcXVpcmVkfHx0Lmh0dHBDaGVja3N1bSYmdC5odHRwQ2hlY2tzdW0ucmVxdWVzdENoZWNrc3VtUmVxdWlyZWQ7aSh0aGlzLCJodHRwQ2hlY2tzdW1SZXF1aXJlZCIsYSwhMSkscyh0aGlzLCJpbnB1dCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHQuaW5wdXQ/ci5jcmVhdGUodC5pbnB1dCxuKTpuZXcgci5jcmVhdGUoe3R5cGU6InN0cnVjdHVyZSJ9LG4pfSkpLHModGhpcywib3V0cHV0IiwoZnVuY3Rpb24oKXtyZXR1cm4gdC5vdXRwdXQ/ci5jcmVhdGUodC5vdXRwdXQsbik6bmV3IHIuY3JlYXRlKHt0eXBlOiJzdHJ1Y3R1cmUifSxuKX0pKSxzKHRoaXMsImVycm9ycyIsKGZ1bmN0aW9uKCl7dmFyIGU9W107aWYoIXQuZXJyb3JzKXJldHVybiBudWxsO2Zvcih2YXIgbz0wO288dC5lcnJvcnMubGVuZ3RoO28rKyllLnB1c2goci5jcmVhdGUodC5lcnJvcnNbb10sbikpO3JldHVybiBlfSkpLHModGhpcywicGFnaW5hdG9yIiwoZnVuY3Rpb24oKXtyZXR1cm4gbi5hcGkucGFnaW5hdG9yc1tlXX0pKSxuLmRvY3VtZW50YXRpb24mJihpKHRoaXMsImRvY3VtZW50YXRpb24iLHQuZG9jdW1lbnRhdGlvbiksaSh0aGlzLCJkb2N1bWVudGF0aW9uVXJsIix0LmRvY3VtZW50YXRpb25VcmwpKSxzKHRoaXMsImlkZW1wb3RlbnRNZW1iZXJzIiwoZnVuY3Rpb24oKXt2YXIgZT1bXSx0PW8uaW5wdXQsbj10Lm1lbWJlcnM7aWYoIXQubWVtYmVycylyZXR1cm4gZTtmb3IodmFyIHIgaW4gbiluLmhhc093blByb3BlcnR5KHIpJiYhMD09PW5bcl0uaXNJZGVtcG90ZW50JiZlLnB1c2gocik7cmV0dXJuIGV9KSkscyh0aGlzLCJoYXNFdmVudE91dHB1dCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PWUubWVtYmVycyxuPWUucGF5bG9hZDtpZighZS5tZW1iZXJzKXJldHVybiExO2lmKG4pcmV0dXJuIHRbbl0uaXNFdmVudFN0cmVhbTtmb3IodmFyIHIgaW4gdClpZighdC5oYXNPd25Qcm9wZXJ0eShyKSYmITA9PT10W3JdLmlzRXZlbnRTdHJlYW0pcmV0dXJuITA7cmV0dXJuITF9KG8ub3V0cHV0KX0pKX19LHsiLi4vdXRpbCI6NzQsIi4vc2hhcGUiOjQ1fV0sNDM6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIikucHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cih0aGlzLCJpbnB1dFRva2VuIix0LmlucHV0X3Rva2VuKSxyKHRoaXMsImxpbWl0S2V5Iix0LmxpbWl0X2tleSkscih0aGlzLCJtb3JlUmVzdWx0cyIsdC5tb3JlX3Jlc3VsdHMpLHIodGhpcywib3V0cHV0VG9rZW4iLHQub3V0cHV0X3Rva2VuKSxyKHRoaXMsInJlc3VsdEtleSIsdC5yZXN1bHRfa2V5KX19LHsiLi4vdXRpbCI6NzR9XSw0NDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKSxvPXIucHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXtuPW58fHt9LG8odGhpcywibmFtZSIsZSksbyh0aGlzLCJhcGkiLG4uYXBpLCExKSx0Lm9wZXJhdGlvbiYmbyh0aGlzLCJvcGVyYXRpb24iLHIuc3RyaW5nLmxvd2VyRmlyc3QodC5vcGVyYXRpb24pKTt2YXIgaT10aGlzO1sidHlwZSIsImRlc2NyaXB0aW9uIiwiZGVsYXkiLCJtYXhBdHRlbXB0cyIsImFjY2VwdG9ycyJdLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPXRbZV07biYmbyhpLGUsbil9KSl9fSx7Ii4uL3V0aWwiOjc0fV0sNDU6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2NvbGxlY3Rpb24iKSxvPWUoIi4uL3V0aWwiKTtmdW5jdGlvbiBpKGUsdCxuKXtudWxsIT1uJiZvLnByb3BlcnR5LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBzKGUsdCl7ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGVbdF18fG8ubWVtb2l6ZWRQcm9wZXJ0eS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gYShlLHQsbil7dD10fHx7fSxpKHRoaXMsInNoYXBlIixlLnNoYXBlKSxpKHRoaXMsImFwaSIsdC5hcGksITEpLGkodGhpcywidHlwZSIsZS50eXBlKSxpKHRoaXMsImVudW0iLGUuZW51bSksaSh0aGlzLCJtaW4iLGUubWluKSxpKHRoaXMsIm1heCIsZS5tYXgpLGkodGhpcywicGF0dGVybiIsZS5wYXR0ZXJuKSxpKHRoaXMsImxvY2F0aW9uIixlLmxvY2F0aW9ufHx0aGlzLmxvY2F0aW9ufHwiYm9keSIpLGkodGhpcywibmFtZSIsdGhpcy5uYW1lfHxlLnhtbE5hbWV8fGUucXVlcnlOYW1lfHxlLmxvY2F0aW9uTmFtZXx8biksaSh0aGlzLCJpc1N0cmVhbWluZyIsZS5zdHJlYW1pbmd8fHRoaXMuaXNTdHJlYW1pbmd8fCExKSxpKHRoaXMsInJlcXVpcmVzTGVuZ3RoIixlLnJlcXVpcmVzTGVuZ3RoLCExKSxpKHRoaXMsImlzQ29tcG9zaXRlIixlLmlzQ29tcG9zaXRlfHwhMSksaSh0aGlzLCJpc1NoYXBlIiwhMCwhMSksaSh0aGlzLCJpc1F1ZXJ5TmFtZSIsQm9vbGVhbihlLnF1ZXJ5TmFtZSksITEpLGkodGhpcywiaXNMb2NhdGlvbk5hbWUiLEJvb2xlYW4oZS5sb2NhdGlvbk5hbWUpLCExKSxpKHRoaXMsImlzSWRlbXBvdGVudCIsITA9PT1lLmlkZW1wb3RlbmN5VG9rZW4pLGkodGhpcywiaXNKc29uVmFsdWUiLCEwPT09ZS5qc29udmFsdWUpLGkodGhpcywiaXNTZW5zaXRpdmUiLCEwPT09ZS5zZW5zaXRpdmV8fGUucHJvdG90eXBlJiYhMD09PWUucHJvdG90eXBlLnNlbnNpdGl2ZSksaSh0aGlzLCJpc0V2ZW50U3RyZWFtIixCb29sZWFuKGUuZXZlbnRzdHJlYW0pLCExKSxpKHRoaXMsImlzRXZlbnQiLEJvb2xlYW4oZS5ldmVudCksITEpLGkodGhpcywiaXNFdmVudFBheWxvYWQiLEJvb2xlYW4oZS5ldmVudHBheWxvYWQpLCExKSxpKHRoaXMsImlzRXZlbnRIZWFkZXIiLEJvb2xlYW4oZS5ldmVudGhlYWRlciksITEpLGkodGhpcywiaXNUaW1lc3RhbXBGb3JtYXRTZXQiLEJvb2xlYW4oZS50aW1lc3RhbXBGb3JtYXQpfHxlLnByb3RvdHlwZSYmITA9PT1lLnByb3RvdHlwZS5pc1RpbWVzdGFtcEZvcm1hdFNldCwhMSksaSh0aGlzLCJlbmRwb2ludERpc2NvdmVyeUlkIixCb29sZWFuKGUuZW5kcG9pbnRkaXNjb3ZlcnlpZCksITEpLGkodGhpcywiaG9zdExhYmVsIixCb29sZWFuKGUuaG9zdExhYmVsKSwhMSksdC5kb2N1bWVudGF0aW9uJiYoaSh0aGlzLCJkb2N1bWVudGF0aW9uIixlLmRvY3VtZW50YXRpb24pLGkodGhpcywiZG9jdW1lbnRhdGlvblVybCIsZS5kb2N1bWVudGF0aW9uVXJsKSksZS54bWxBdHRyaWJ1dGUmJmkodGhpcywiaXNYbWxBdHRyaWJ1dGUiLGUueG1sQXR0cmlidXRlfHwhMSksaSh0aGlzLCJkZWZhdWx0VmFsdWUiLG51bGwpLHRoaXMudG9XaXJlRm9ybWF0PWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOmV9LHRoaXMudG9UeXBlPWZ1bmN0aW9uKGUpe3JldHVybiBlfX1mdW5jdGlvbiBjKGUpe2EuYXBwbHkodGhpcyxhcmd1bWVudHMpLGkodGhpcywiaXNDb21wb3NpdGUiLCEwKSxlLmZsYXR0ZW5lZCYmaSh0aGlzLCJmbGF0dGVuZWQiLGUuZmxhdHRlbmVkfHwhMSl9ZnVuY3Rpb24gdShlLHQpe3ZhciBuPXRoaXMsbz1udWxsLHU9IXRoaXMuaXNTaGFwZTtjLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx1JiYoaSh0aGlzLCJkZWZhdWx0VmFsdWUiLChmdW5jdGlvbigpe3JldHVybnt9fSkpLGkodGhpcywibWVtYmVycyIse30pLGkodGhpcywibWVtYmVyTmFtZXMiLFtdKSxpKHRoaXMsInJlcXVpcmVkIixbXSksaSh0aGlzLCJpc1JlcXVpcmVkIiwoZnVuY3Rpb24oKXtyZXR1cm4hMX0pKSxpKHRoaXMsImlzRG9jdW1lbnQiLEJvb2xlYW4oZS5kb2N1bWVudCkpKSxlLm1lbWJlcnMmJihpKHRoaXMsIm1lbWJlcnMiLG5ldyByKGUubWVtYmVycyx0LChmdW5jdGlvbihlLG4pe3JldHVybiBhLmNyZWF0ZShuLHQsZSl9KSkpLHModGhpcywibWVtYmVyTmFtZXMiLChmdW5jdGlvbigpe3JldHVybiBlLnhtbE9yZGVyfHxPYmplY3Qua2V5cyhlLm1lbWJlcnMpfSkpLGUuZXZlbnQmJihzKHRoaXMsImV2ZW50UGF5bG9hZE1lbWJlck5hbWUiLChmdW5jdGlvbigpe2Zvcih2YXIgZT1uLm1lbWJlcnMsdD1uLm1lbWJlck5hbWVzLHI9MCxvPXQubGVuZ3RoO3I8bztyKyspaWYoZVt0W3JdXS5pc0V2ZW50UGF5bG9hZClyZXR1cm4gdFtyXX0pKSxzKHRoaXMsImV2ZW50SGVhZGVyTWVtYmVyTmFtZXMiLChmdW5jdGlvbigpe2Zvcih2YXIgZT1uLm1lbWJlcnMsdD1uLm1lbWJlck5hbWVzLHI9W10sbz0wLGk9dC5sZW5ndGg7bzxpO28rKyllW3Rbb11dLmlzRXZlbnRIZWFkZXImJnIucHVzaCh0W29dKTtyZXR1cm4gcn0pKSkpLGUucmVxdWlyZWQmJihpKHRoaXMsInJlcXVpcmVkIixlLnJlcXVpcmVkKSxpKHRoaXMsImlzUmVxdWlyZWQiLChmdW5jdGlvbih0KXtpZighbyl7bz17fTtmb3IodmFyIG49MDtuPGUucmVxdWlyZWQubGVuZ3RoO24rKylvW2UucmVxdWlyZWRbbl1dPSEwfXJldHVybiBvW3RdfSksITEsITApKSxpKHRoaXMsInJlc3VsdFdyYXBwZXIiLGUucmVzdWx0V3JhcHBlcnx8bnVsbCksZS5wYXlsb2FkJiZpKHRoaXMsInBheWxvYWQiLGUucGF5bG9hZCksInN0cmluZyI9PXR5cGVvZiBlLnhtbE5hbWVzcGFjZT9pKHRoaXMsInhtbE5hbWVzcGFjZVVyaSIsZS54bWxOYW1lc3BhY2UpOiJvYmplY3QiPT10eXBlb2YgZS54bWxOYW1lc3BhY2UmJihpKHRoaXMsInhtbE5hbWVzcGFjZVByZWZpeCIsZS54bWxOYW1lc3BhY2UucHJlZml4KSxpKHRoaXMsInhtbE5hbWVzcGFjZVVyaSIsZS54bWxOYW1lc3BhY2UudXJpKSl9ZnVuY3Rpb24gbChlLHQpe3ZhciBuPXRoaXMscj0hdGhpcy5pc1NoYXBlO2lmKGMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHImJmkodGhpcywiZGVmYXVsdFZhbHVlIiwoZnVuY3Rpb24oKXtyZXR1cm5bXX0pKSxlLm1lbWJlciYmcyh0aGlzLCJtZW1iZXIiLChmdW5jdGlvbigpe3JldHVybiBhLmNyZWF0ZShlLm1lbWJlcix0KX0pKSx0aGlzLmZsYXR0ZW5lZCl7dmFyIG89dGhpcy5uYW1lO3ModGhpcywibmFtZSIsKGZ1bmN0aW9uKCl7cmV0dXJuIG4ubWVtYmVyLm5hbWV8fG99KSl9fWZ1bmN0aW9uIHAoZSx0KXt2YXIgbj0hdGhpcy5pc1NoYXBlO2MuYXBwbHkodGhpcyxhcmd1bWVudHMpLG4mJihpKHRoaXMsImRlZmF1bHRWYWx1ZSIsKGZ1bmN0aW9uKCl7cmV0dXJue319KSksaSh0aGlzLCJrZXkiLGEuY3JlYXRlKHt0eXBlOiJzdHJpbmcifSx0KSksaSh0aGlzLCJ2YWx1ZSIsYS5jcmVhdGUoe3R5cGU6InN0cmluZyJ9LHQpKSksZS5rZXkmJnModGhpcywia2V5IiwoZnVuY3Rpb24oKXtyZXR1cm4gYS5jcmVhdGUoZS5rZXksdCl9KSksZS52YWx1ZSYmcyh0aGlzLCJ2YWx1ZSIsKGZ1bmN0aW9uKCl7cmV0dXJuIGEuY3JlYXRlKGUudmFsdWUsdCl9KSl9ZnVuY3Rpb24gZCgpe2EuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBlPVsicmVzdC14bWwiLCJxdWVyeSIsImVjMiJdO3RoaXMudG9UeXBlPWZ1bmN0aW9uKHQpe3JldHVybiB0PXRoaXMuYXBpJiZlLmluZGV4T2YodGhpcy5hcGkucHJvdG9jb2wpPi0xP3R8fCIiOnQsdGhpcy5pc0pzb25WYWx1ZT9KU09OLnBhcnNlKHQpOnQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnRvU3RyaW5nP3QudG9TdHJpbmcoKTp0fSx0aGlzLnRvV2lyZUZvcm1hdD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5pc0pzb25WYWx1ZT9KU09OLnN0cmluZ2lmeShlKTplfX1mdW5jdGlvbiBoKCl7YS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy50b1R5cGU9ZnVuY3Rpb24oZSl7dmFyIHQ9by5iYXNlNjQuZGVjb2RlKGUpO2lmKHRoaXMuaXNTZW5zaXRpdmUmJm8uaXNOb2RlKCkmJiJmdW5jdGlvbiI9PXR5cGVvZiBvLkJ1ZmZlci5hbGxvYyl7dmFyIG49by5CdWZmZXIuYWxsb2ModC5sZW5ndGgsdCk7dC5maWxsKDApLHQ9bn1yZXR1cm4gdH0sdGhpcy50b1dpcmVGb3JtYXQ9by5iYXNlNjQuZW5jb2RlfWZ1bmN0aW9uIGYoKXtoLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBnKCl7YS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy50b1R5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZT9lOm51bGw9PWU/bnVsbDoidHJ1ZSI9PT1lfX1hLm5vcm1hbGl6ZWRUeXBlcz17Y2hhcmFjdGVyOiJzdHJpbmciLGRvdWJsZToiZmxvYXQiLGxvbmc6ImludGVnZXIiLHNob3J0OiJpbnRlZ2VyIixiaWdpbnRlZ2VyOiJpbnRlZ2VyIixiaWdkZWNpbWFsOiJmbG9hdCIsYmxvYjoiYmluYXJ5In0sYS50eXBlcz17c3RydWN0dXJlOnUsbGlzdDpsLG1hcDpwLGJvb2xlYW46Zyx0aW1lc3RhbXA6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZihhLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlLnRpbWVzdGFtcEZvcm1hdClpKHRoaXMsInRpbWVzdGFtcEZvcm1hdCIsZS50aW1lc3RhbXBGb3JtYXQpO2Vsc2UgaWYodC5pc1RpbWVzdGFtcEZvcm1hdFNldCYmdGhpcy50aW1lc3RhbXBGb3JtYXQpaSh0aGlzLCJ0aW1lc3RhbXBGb3JtYXQiLHRoaXMudGltZXN0YW1wRm9ybWF0KTtlbHNlIGlmKCJoZWFkZXIiPT09dGhpcy5sb2NhdGlvbilpKHRoaXMsInRpbWVzdGFtcEZvcm1hdCIsInJmYzgyMiIpO2Vsc2UgaWYoInF1ZXJ5c3RyaW5nIj09PXRoaXMubG9jYXRpb24paSh0aGlzLCJ0aW1lc3RhbXBGb3JtYXQiLCJpc284NjAxIik7ZWxzZSBpZih0aGlzLmFwaSlzd2l0Y2godGhpcy5hcGkucHJvdG9jb2wpe2Nhc2UianNvbiI6Y2FzZSJyZXN0LWpzb24iOmkodGhpcywidGltZXN0YW1wRm9ybWF0IiwidW5peFRpbWVzdGFtcCIpO2JyZWFrO2Nhc2UicmVzdC14bWwiOmNhc2UicXVlcnkiOmNhc2UiZWMyIjppKHRoaXMsInRpbWVzdGFtcEZvcm1hdCIsImlzbzg2MDEiKX10aGlzLnRvVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiBlLnRvVVRDU3RyaW5nP2U6InN0cmluZyI9PXR5cGVvZiBlfHwibnVtYmVyIj09dHlwZW9mIGU/by5kYXRlLnBhcnNlVGltZXN0YW1wKGUpOm51bGx9LHRoaXMudG9XaXJlRm9ybWF0PWZ1bmN0aW9uKGUpe3JldHVybiBvLmRhdGUuZm9ybWF0KGUsdC50aW1lc3RhbXBGb3JtYXQpfX0sZmxvYXQ6ZnVuY3Rpb24oKXthLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnRvVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT9udWxsOnBhcnNlRmxvYXQoZSl9LHRoaXMudG9XaXJlRm9ybWF0PXRoaXMudG9UeXBlfSxpbnRlZ2VyOmZ1bmN0aW9uKCl7YS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy50b1R5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/bnVsbDpwYXJzZUludChlLDEwKX0sdGhpcy50b1dpcmVGb3JtYXQ9dGhpcy50b1R5cGV9LHN0cmluZzpkLGJhc2U2NDpmLGJpbmFyeTpofSxhLnJlc29sdmU9ZnVuY3Rpb24oZSx0KXtpZihlLnNoYXBlKXt2YXIgbj10LmFwaS5zaGFwZXNbZS5zaGFwZV07aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgZmluZCBzaGFwZSByZWZlcmVuY2U6ICIrZS5zaGFwZSk7cmV0dXJuIG59cmV0dXJuIG51bGx9LGEuY3JlYXRlPWZ1bmN0aW9uKGUsdCxuKXtpZihlLmlzU2hhcGUpcmV0dXJuIGU7dmFyIHI9YS5yZXNvbHZlKGUsdCk7aWYocil7dmFyIG89T2JqZWN0LmtleXMoZSk7dC5kb2N1bWVudGF0aW9ufHwobz1vLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIWUubWF0Y2goL2RvY3VtZW50YXRpb24vKX0pKSk7dmFyIGk9ZnVuY3Rpb24oKXtyLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxlLHQsbil9O3JldHVybiBpLnByb3RvdHlwZT1yLG5ldyBpfWUudHlwZXx8KGUubWVtYmVycz9lLnR5cGU9InN0cnVjdHVyZSI6ZS5tZW1iZXI/ZS50eXBlPSJsaXN0IjplLmtleT9lLnR5cGU9Im1hcCI6ZS50eXBlPSJzdHJpbmciKTt2YXIgcz1lLnR5cGU7aWYoYS5ub3JtYWxpemVkVHlwZXNbZS50eXBlXSYmKGUudHlwZT1hLm5vcm1hbGl6ZWRUeXBlc1tlLnR5cGVdKSxhLnR5cGVzW2UudHlwZV0pcmV0dXJuIG5ldyBhLnR5cGVzW2UudHlwZV0oZSx0LG4pO3Rocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHNoYXBlIHR5cGU6ICIrcyl9LGEuc2hhcGVzPXtTdHJ1Y3R1cmVTaGFwZTp1LExpc3RTaGFwZTpsLE1hcFNoYXBlOnAsU3RyaW5nU2hhcGU6ZCxCb29sZWFuU2hhcGU6ZyxCYXNlNjRTaGFwZTpmfSx0LmV4cG9ydHM9YX0seyIuLi91dGlsIjo3NCwiLi9jb2xsZWN0aW9uIjo0MX1dLDQ2OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9jb3JlIik7ci5QYXJhbVZhbGlkYXRvcj1yLnV0aWwuaW5oZXJpdCh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSl7ITAhPT1lJiZ2b2lkIDAhPT1lfHwoZT17bWluOiEwfSksdGhpcy52YWxpZGF0aW9uPWV9LHZhbGlkYXRlOmZ1bmN0aW9uKGUsdCxuKXtpZih0aGlzLmVycm9ycz1bXSx0aGlzLnZhbGlkYXRlTWVtYmVyKGUsdHx8e30sbnx8InBhcmFtcyIpLHRoaXMuZXJyb3JzLmxlbmd0aD4xKXt2YXIgbz10aGlzLmVycm9ycy5qb2luKCJcbiogIik7dGhyb3cgbz0iVGhlcmUgd2VyZSAiK3RoaXMuZXJyb3JzLmxlbmd0aCsiIHZhbGlkYXRpb24gZXJyb3JzOlxuKiAiK28sci51dGlsLmVycm9yKG5ldyBFcnJvcihvKSx7Y29kZToiTXVsdGlwbGVWYWxpZGF0aW9uRXJyb3JzIixlcnJvcnM6dGhpcy5lcnJvcnN9KX1pZigxPT09dGhpcy5lcnJvcnMubGVuZ3RoKXRocm93IHRoaXMuZXJyb3JzWzBdO3JldHVybiEwfSxmYWlsOmZ1bmN0aW9uKGUsdCl7dGhpcy5lcnJvcnMucHVzaChyLnV0aWwuZXJyb3IobmV3IEVycm9yKHQpLHtjb2RlOmV9KSl9LHZhbGlkYXRlU3RydWN0dXJlOmZ1bmN0aW9uKGUsdCxuKXtpZihlLmlzRG9jdW1lbnQpcmV0dXJuITA7dmFyIHI7dGhpcy52YWxpZGF0ZVR5cGUodCxuLFsib2JqZWN0Il0sInN0cnVjdHVyZSIpO2Zvcih2YXIgbz0wO2UucmVxdWlyZWQmJm88ZS5yZXF1aXJlZC5sZW5ndGg7bysrKXt2YXIgaT10W3I9ZS5yZXF1aXJlZFtvXV07bnVsbD09aSYmdGhpcy5mYWlsKCJNaXNzaW5nUmVxdWlyZWRQYXJhbWV0ZXIiLCJNaXNzaW5nIHJlcXVpcmVkIGtleSAnIityKyInIGluICIrbil9Zm9yKHIgaW4gdClpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxyKSl7dmFyIHM9dFtyXSxhPWUubWVtYmVyc1tyXTtpZih2b2lkIDAhPT1hKXt2YXIgYz1bbixyXS5qb2luKCIuIik7dGhpcy52YWxpZGF0ZU1lbWJlcihhLHMsYyl9ZWxzZSBudWxsIT1zJiZ0aGlzLmZhaWwoIlVuZXhwZWN0ZWRQYXJhbWV0ZXIiLCJVbmV4cGVjdGVkIGtleSAnIityKyInIGZvdW5kIGluICIrbil9cmV0dXJuITB9LHZhbGlkYXRlTWVtYmVyOmZ1bmN0aW9uKGUsdCxuKXtzd2l0Y2goZS50eXBlKXtjYXNlInN0cnVjdHVyZSI6cmV0dXJuIHRoaXMudmFsaWRhdGVTdHJ1Y3R1cmUoZSx0LG4pO2Nhc2UibGlzdCI6cmV0dXJuIHRoaXMudmFsaWRhdGVMaXN0KGUsdCxuKTtjYXNlIm1hcCI6cmV0dXJuIHRoaXMudmFsaWRhdGVNYXAoZSx0LG4pO2RlZmF1bHQ6cmV0dXJuIHRoaXMudmFsaWRhdGVTY2FsYXIoZSx0LG4pfX0sdmFsaWRhdGVMaXN0OmZ1bmN0aW9uKGUsdCxuKXtpZih0aGlzLnZhbGlkYXRlVHlwZSh0LG4sW0FycmF5XSkpe3RoaXMudmFsaWRhdGVSYW5nZShlLHQubGVuZ3RoLG4sImxpc3QgbWVtYmVyIGNvdW50Iik7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspdGhpcy52YWxpZGF0ZU1lbWJlcihlLm1lbWJlcix0W3JdLG4rIlsiK3IrIl0iKX19LHZhbGlkYXRlTWFwOmZ1bmN0aW9uKGUsdCxuKXtpZih0aGlzLnZhbGlkYXRlVHlwZSh0LG4sWyJvYmplY3QiXSwibWFwIikpe3ZhciByPTA7Zm9yKHZhciBvIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbykmJih0aGlzLnZhbGlkYXRlTWVtYmVyKGUua2V5LG8sbisiW2tleT0nIitvKyInXSIpLHRoaXMudmFsaWRhdGVNZW1iZXIoZS52YWx1ZSx0W29dLG4rIlsnIitvKyInXSIpLHIrKyk7dGhpcy52YWxpZGF0ZVJhbmdlKGUscixuLCJtYXAgbWVtYmVyIGNvdW50Iil9fSx2YWxpZGF0ZVNjYWxhcjpmdW5jdGlvbihlLHQsbil7c3dpdGNoKGUudHlwZSl7Y2FzZSBudWxsOmNhc2Ugdm9pZCAwOmNhc2Uic3RyaW5nIjpyZXR1cm4gdGhpcy52YWxpZGF0ZVN0cmluZyhlLHQsbik7Y2FzZSJiYXNlNjQiOmNhc2UiYmluYXJ5IjpyZXR1cm4gdGhpcy52YWxpZGF0ZVBheWxvYWQodCxuKTtjYXNlImludGVnZXIiOmNhc2UiZmxvYXQiOnJldHVybiB0aGlzLnZhbGlkYXRlTnVtYmVyKGUsdCxuKTtjYXNlImJvb2xlYW4iOnJldHVybiB0aGlzLnZhbGlkYXRlVHlwZSh0LG4sWyJib29sZWFuIl0pO2Nhc2UidGltZXN0YW1wIjpyZXR1cm4gdGhpcy52YWxpZGF0ZVR5cGUodCxuLFtEYXRlLC9eXGR7NH0tXGR7Mn0tXGR7Mn1UXGR7Mn06XGR7Mn06XGR7Mn0oXC5cZCspP1okLywibnVtYmVyIl0sIkRhdGUgb2JqZWN0LCBJU08tODYwMSBzdHJpbmcsIG9yIGEgVU5JWCB0aW1lc3RhbXAiKTtkZWZhdWx0OnJldHVybiB0aGlzLmZhaWwoIlVua293blR5cGUiLCJVbmhhbmRsZWQgdHlwZSAiK2UudHlwZSsiIGZvciAiK24pfX0sdmFsaWRhdGVTdHJpbmc6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVsic3RyaW5nIl07ZS5pc0pzb25WYWx1ZSYmKHI9ci5jb25jYXQoWyJudW1iZXIiLCJvYmplY3QiLCJib29sZWFuIl0pKSxudWxsIT09dCYmdGhpcy52YWxpZGF0ZVR5cGUodCxuLHIpJiYodGhpcy52YWxpZGF0ZUVudW0oZSx0LG4pLHRoaXMudmFsaWRhdGVSYW5nZShlLHQubGVuZ3RoLG4sInN0cmluZyBsZW5ndGgiKSx0aGlzLnZhbGlkYXRlUGF0dGVybihlLHQsbiksdGhpcy52YWxpZGF0ZVVyaShlLHQsbikpfSx2YWxpZGF0ZVVyaTpmdW5jdGlvbihlLHQsbil7InVyaSI9PT1lLmxvY2F0aW9uJiYwPT09dC5sZW5ndGgmJnRoaXMuZmFpbCgiVXJpUGFyYW1ldGVyRXJyb3IiLCdFeHBlY3RlZCB1cmkgcGFyYW1ldGVyIHRvIGhhdmUgbGVuZ3RoID49IDEsIGJ1dCBmb3VuZCAiJyt0KyciIGZvciAnK24pfSx2YWxpZGF0ZVBhdHRlcm46ZnVuY3Rpb24oZSx0LG4pe3RoaXMudmFsaWRhdGlvbi5wYXR0ZXJuJiZ2b2lkIDAhPT1lLnBhdHRlcm4mJihuZXcgUmVnRXhwKGUucGF0dGVybikudGVzdCh0KXx8dGhpcy5mYWlsKCJQYXR0ZXJuTWF0Y2hFcnJvciIsJ1Byb3ZpZGVkIHZhbHVlICInK3QrJyIgZG9lcyBub3QgbWF0Y2ggcmVnZXggcGF0dGVybiAvJytlLnBhdHRlcm4rIi8gZm9yICIrbikpfSx2YWxpZGF0ZVJhbmdlOmZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMudmFsaWRhdGlvbi5taW4mJnZvaWQgMCE9PWUubWluJiZ0PGUubWluJiZ0aGlzLmZhaWwoIk1pblJhbmdlRXJyb3IiLCJFeHBlY3RlZCAiK3IrIiA+PSAiK2UubWluKyIsIGJ1dCBmb3VuZCAiK3QrIiBmb3IgIituKSx0aGlzLnZhbGlkYXRpb24ubWF4JiZ2b2lkIDAhPT1lLm1heCYmdD5lLm1heCYmdGhpcy5mYWlsKCJNYXhSYW5nZUVycm9yIiwiRXhwZWN0ZWQgIityKyIgPD0gIitlLm1heCsiLCBidXQgZm91bmQgIit0KyIgZm9yICIrbil9LHZhbGlkYXRlRW51bTpmdW5jdGlvbihlLHQsbil7dGhpcy52YWxpZGF0aW9uLmVudW0mJnZvaWQgMCE9PWUuZW51bSYmLTE9PT1lLmVudW0uaW5kZXhPZih0KSYmdGhpcy5mYWlsKCJFbnVtRXJyb3IiLCJGb3VuZCBzdHJpbmcgdmFsdWUgb2YgIit0KyIsIGJ1dCBleHBlY3RlZCAiK2UuZW51bS5qb2luKCJ8IikrIiBmb3IgIituKX0sdmFsaWRhdGVUeXBlOmZ1bmN0aW9uKGUsdCxuLG8pe2lmKG51bGw9PWUpcmV0dXJuITE7Zm9yKHZhciBpPSExLHM9MDtzPG4ubGVuZ3RoO3MrKyl7aWYoInN0cmluZyI9PXR5cGVvZiBuW3NdKXtpZih0eXBlb2YgZT09PW5bc10pcmV0dXJuITB9ZWxzZSBpZihuW3NdaW5zdGFuY2VvZiBSZWdFeHApe2lmKChlfHwiIikudG9TdHJpbmcoKS5tYXRjaChuW3NdKSlyZXR1cm4hMH1lbHNle2lmKGUgaW5zdGFuY2VvZiBuW3NdKXJldHVybiEwO2lmKHIudXRpbC5pc1R5cGUoZSxuW3NdKSlyZXR1cm4hMDtvfHxpfHwobj1uLnNsaWNlKCkpLG5bc109ci51dGlsLnR5cGVOYW1lKG5bc10pfWk9ITB9dmFyIGE9bzthfHwoYT1uLmpvaW4oIiwgIikucmVwbGFjZSgvLChbXixdKykkLywiLCBvciQxIikpO3ZhciBjPWEubWF0Y2goL15bYWVpb3VdL2kpPyJuIjoiIjtyZXR1cm4gdGhpcy5mYWlsKCJJbnZhbGlkUGFyYW1ldGVyVHlwZSIsIkV4cGVjdGVkICIrdCsiIHRvIGJlIGEiK2MrIiAiK2EpLCExfSx2YWxpZGF0ZU51bWJlcjpmdW5jdGlvbihlLHQsbil7aWYobnVsbCE9dCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXt2YXIgcj1wYXJzZUZsb2F0KHQpO3IudG9TdHJpbmcoKT09PXQmJih0PXIpfXRoaXMudmFsaWRhdGVUeXBlKHQsbixbIm51bWJlciJdKSYmdGhpcy52YWxpZGF0ZVJhbmdlKGUsdCxuLCJudW1lcmljIHZhbHVlIil9fSx2YWxpZGF0ZVBheWxvYWQ6ZnVuY3Rpb24oZSx0KXtpZihudWxsIT1lJiYic3RyaW5nIiE9dHlwZW9mIGUmJighZXx8Im51bWJlciIhPXR5cGVvZiBlLmJ5dGVMZW5ndGgpKXtpZihyLnV0aWwuaXNOb2RlKCkpe3ZhciBuPXIudXRpbC5zdHJlYW0uU3RyZWFtO2lmKHIudXRpbC5CdWZmZXIuaXNCdWZmZXIoZSl8fGUgaW5zdGFuY2VvZiBuKXJldHVybn1lbHNlIGlmKHZvaWQgMCE9PXR5cGVvZiBCbG9iJiZlIGluc3RhbmNlb2YgQmxvYilyZXR1cm47dmFyIG89WyJCdWZmZXIiLCJTdHJlYW0iLCJGaWxlIiwiQmxvYiIsIkFycmF5QnVmZmVyIiwiRGF0YVZpZXciXTtpZihlKWZvcih2YXIgaT0wO2k8by5sZW5ndGg7aSsrKXtpZihyLnV0aWwuaXNUeXBlKGUsb1tpXSkpcmV0dXJuO2lmKHIudXRpbC50eXBlTmFtZShlLmNvbnN0cnVjdG9yKT09PW9baV0pcmV0dXJufXRoaXMuZmFpbCgiSW52YWxpZFBhcmFtZXRlclR5cGUiLCJFeHBlY3RlZCAiK3QrIiB0byBiZSBhIHN0cmluZywgQnVmZmVyLCBTdHJlYW0sIEJsb2IsIG9yIHR5cGVkIGFycmF5IG9iamVjdCIpfX19KX0seyIuL2NvcmUiOjE5fV0sNDc6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIiksbz1lKCIuLi9jb3JlIik7dC5leHBvcnRzPXtwb3B1bGF0ZUhvc3RQcmVmaXg6ZnVuY3Rpb24oZSl7aWYoIWUuc2VydmljZS5jb25maWcuaG9zdFByZWZpeEVuYWJsZWQpcmV0dXJuIGU7dmFyIHQsbixpLHMsYSxjPWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl07aWYoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaSxuPXQub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0sbz10LmVuZHBvaW50T3BlcmF0aW9uJiZ0LmVuZHBvaW50T3BlcmF0aW9uPT09ci5zdHJpbmcubG93ZXJGaXJzdChuLm5hbWUpO3JldHVybiJOVUxMIiE9PW4uZW5kcG9pbnREaXNjb3ZlcnlSZXF1aXJlZHx8ITA9PT1vfShlKSlyZXR1cm4gZTtpZihjLmVuZHBvaW50JiZjLmVuZHBvaW50Lmhvc3RQcmVmaXgpe3ZhciB1PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gci5lYWNoKG4ubWVtYmVycywoZnVuY3Rpb24obixvKXtpZighMD09PW8uaG9zdExhYmVsKXtpZigic3RyaW5nIiE9dHlwZW9mIHRbbl18fCIiPT09dFtuXSl0aHJvdyByLmVycm9yKG5ldyBFcnJvcix7bWVzc2FnZToiUGFyYW1ldGVyICIrbisiIHNob3VsZCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuIixjb2RlOiJJbnZhbGlkUGFyYW1ldGVyIn0pO3ZhciBpPW5ldyBSZWdFeHAoIlxceyIrbisiXFx9IiwiZyIpO2U9ZS5yZXBsYWNlKGksdFtuXSl9fSkpLGV9KGMuZW5kcG9pbnQuaG9zdFByZWZpeCxlLnBhcmFtcyxjLmlucHV0KTtzPWUuaHR0cFJlcXVlc3QuZW5kcG9pbnQsYT11LHMuaG9zdCYmKHMuaG9zdD1hK3MuaG9zdCkscy5ob3N0bmFtZSYmKHMuaG9zdG5hbWU9YStzLmhvc3RuYW1lKSx0PWUuaHR0cFJlcXVlc3QuZW5kcG9pbnQuaG9zdG5hbWUsbj10LnNwbGl0KCIuIiksaT0vXlthLXpBLVowLTldezF9JHxeW2EtekEtWjAtOV1bYS16QS1aMC05XC1dKlthLXpBLVowLTldJC8sci5hcnJheUVhY2gobiwoZnVuY3Rpb24oZSl7aWYoIWUubGVuZ3RofHxlLmxlbmd0aDwxfHxlLmxlbmd0aD42Myl0aHJvdyByLmVycm9yKG5ldyBFcnJvcix7Y29kZToiVmFsaWRhdGlvbkVycm9yIixtZXNzYWdlOiJIb3N0bmFtZSBsYWJlbCBsZW5ndGggc2hvdWxkIGJlIGJldHdlZW4gMSB0byA2MyBjaGFyYWN0ZXJzLCBpbmNsdXNpdmUuIn0pO2lmKCFpLnRlc3QoZSkpdGhyb3cgby51dGlsLmVycm9yKG5ldyBFcnJvcix7Y29kZToiVmFsaWRhdGlvbkVycm9yIixtZXNzYWdlOmUrIiBpcyBub3QgaG9zdG5hbWUgY29tcGF0aWJsZS4ifSl9KSl9cmV0dXJuIGV9fX0seyIuLi9jb3JlIjoxOSwiLi4vdXRpbCI6NzR9XSw0ODpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKSxvPWUoIi4uL2pzb24vYnVpbGRlciIpLGk9ZSgiLi4vanNvbi9wYXJzZXIiKSxzPWUoIi4vaGVscGVycyIpLnBvcHVsYXRlSG9zdFByZWZpeDt0LmV4cG9ydHM9e2J1aWxkUmVxdWVzdDpmdW5jdGlvbihlKXt2YXIgdD1lLmh0dHBSZXF1ZXN0LG49ZS5zZXJ2aWNlLmFwaSxyPW4udGFyZ2V0UHJlZml4KyIuIituLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLm5hbWUsaT1uLmpzb25WZXJzaW9ufHwiMS4wIixhPW4ub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0uaW5wdXQsYz1uZXcgbzsxPT09aSYmKGk9IjEuMCIpLG4uYXdzUXVlcnlDb21wYXRpYmxlJiYodC5wYXJhbXN8fCh0LnBhcmFtcz17fSksT2JqZWN0LmFzc2lnbih0LnBhcmFtcyxlLnBhcmFtcykpLHQuYm9keT1jLmJ1aWxkKGUucGFyYW1zfHx7fSxhKSx0LmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdPSJhcHBsaWNhdGlvbi94LWFtei1qc29uLSIraSx0LmhlYWRlcnNbIlgtQW16LVRhcmdldCJdPXIscyhlKX0sZXh0cmFjdEVycm9yOmZ1bmN0aW9uKGUpe3ZhciB0PXt9LG49ZS5odHRwUmVzcG9uc2U7aWYodC5jb2RlPW4uaGVhZGVyc1sieC1hbXpuLWVycm9ydHlwZSJdfHwiVW5rbm93bkVycm9yIiwic3RyaW5nIj09dHlwZW9mIHQuY29kZSYmKHQuY29kZT10LmNvZGUuc3BsaXQoIjoiKVswXSksbi5ib2R5Lmxlbmd0aD4wKXRyeXt2YXIgbz1KU09OLnBhcnNlKG4uYm9keS50b1N0cmluZygpKSxpPW8uX190eXBlfHxvLmNvZGV8fG8uQ29kZTtpJiYodC5jb2RlPWkuc3BsaXQoIiMiKS5wb3AoKSksIlJlcXVlc3RFbnRpdHlUb29MYXJnZSI9PT10LmNvZGU/dC5tZXNzYWdlPSJSZXF1ZXN0IGJvZHkgbXVzdCBiZSBsZXNzIHRoYW4gMSBNQiI6dC5tZXNzYWdlPW8ubWVzc2FnZXx8by5NZXNzYWdlfHxudWxsfWNhdGNoKG8pe3Quc3RhdHVzQ29kZT1uLnN0YXR1c0NvZGUsdC5tZXNzYWdlPW4uc3RhdHVzTWVzc2FnZX1lbHNlIHQuc3RhdHVzQ29kZT1uLnN0YXR1c0NvZGUsdC5tZXNzYWdlPW4uc3RhdHVzQ29kZS50b1N0cmluZygpO2UuZXJyb3I9ci5lcnJvcihuZXcgRXJyb3IsdCl9LGV4dHJhY3REYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWUuaHR0cFJlc3BvbnNlLmJvZHkudG9TdHJpbmcoKXx8Int9IjtpZighMT09PWUucmVxdWVzdC5zZXJ2aWNlLmNvbmZpZy5jb252ZXJ0UmVzcG9uc2VUeXBlcyllLmRhdGE9SlNPTi5wYXJzZSh0KTtlbHNle3ZhciBuPWUucmVxdWVzdC5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2UucmVxdWVzdC5vcGVyYXRpb25dLm91dHB1dHx8e30scj1uZXcgaTtlLmRhdGE9ci5wYXJzZSh0LG4pfX19fSx7Ii4uL2pzb24vYnVpbGRlciI6MzcsIi4uL2pzb24vcGFyc2VyIjozOCwiLi4vdXRpbCI6NzQsIi4vaGVscGVycyI6NDd9XSw0OTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4uL3V0aWwiKSxpPWUoIi4uL3F1ZXJ5L3F1ZXJ5X3BhcmFtX3NlcmlhbGl6ZXIiKSxzPWUoIi4uL21vZGVsL3NoYXBlIiksYT1lKCIuL2hlbHBlcnMiKS5wb3B1bGF0ZUhvc3RQcmVmaXg7dC5leHBvcnRzPXtidWlsZFJlcXVlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXSxuPWUuaHR0cFJlcXVlc3Q7bi5oZWFkZXJzWyJDb250ZW50LVR5cGUiXT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PXV0Zi04IixuLnBhcmFtcz17VmVyc2lvbjplLnNlcnZpY2UuYXBpLmFwaVZlcnNpb24sQWN0aW9uOnQubmFtZX0sKG5ldyBpKS5zZXJpYWxpemUoZS5wYXJhbXMsdC5pbnB1dCwoZnVuY3Rpb24oZSx0KXtuLnBhcmFtc1tlXT10fSkpLG4uYm9keT1vLnF1ZXJ5UGFyYW1zVG9TdHJpbmcobi5wYXJhbXMpLGEoZSl9LGV4dHJhY3RFcnJvcjpmdW5jdGlvbihlKXt2YXIgdCxuPWUuaHR0cFJlc3BvbnNlLmJvZHkudG9TdHJpbmcoKTtpZihuLm1hdGNoKCI8VW5rbm93bk9wZXJhdGlvbkV4Y2VwdGlvbiIpKXQ9e0NvZGU6IlVua25vd25PcGVyYXRpb24iLE1lc3NhZ2U6IlVua25vd24gb3BlcmF0aW9uICIrZS5yZXF1ZXN0Lm9wZXJhdGlvbn07ZWxzZSB0cnl7dD0obmV3IHIuWE1MLlBhcnNlcikucGFyc2Uobil9Y2F0Y2gobil7dD17Q29kZTplLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlLE1lc3NhZ2U6ZS5odHRwUmVzcG9uc2Uuc3RhdHVzTWVzc2FnZX19dC5yZXF1ZXN0SWQmJiFlLnJlcXVlc3RJZCYmKGUucmVxdWVzdElkPXQucmVxdWVzdElkKSx0LkVycm9ycyYmKHQ9dC5FcnJvcnMpLHQuRXJyb3ImJih0PXQuRXJyb3IpLHQuQ29kZT9lLmVycm9yPW8uZXJyb3IobmV3IEVycm9yLHtjb2RlOnQuQ29kZSxtZXNzYWdlOnQuTWVzc2FnZX0pOmUuZXJyb3I9by5lcnJvcihuZXcgRXJyb3Ise2NvZGU6ZS5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSxtZXNzYWdlOm51bGx9KX0sZXh0cmFjdERhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXF1ZXN0LG49dC5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW3Qub3BlcmF0aW9uXS5vdXRwdXR8fHt9LGk9bjtpZihpLnJlc3VsdFdyYXBwZXIpe3ZhciBhPXMuY3JlYXRlKHt0eXBlOiJzdHJ1Y3R1cmUifSk7YS5tZW1iZXJzW2kucmVzdWx0V3JhcHBlcl09bixhLm1lbWJlck5hbWVzPVtpLnJlc3VsdFdyYXBwZXJdLG8ucHJvcGVydHkobiwibmFtZSIsbi5yZXN1bHRXcmFwcGVyKSxuPWF9dmFyIGM9bmV3IHIuWE1MLlBhcnNlcjtpZihuJiZuLm1lbWJlcnMmJiFuLm1lbWJlcnMuX1hBTVpSZXF1ZXN0SWQpe3ZhciB1PXMuY3JlYXRlKHt0eXBlOiJzdHJpbmcifSx7YXBpOntwcm90b2NvbDoicXVlcnkifX0sInJlcXVlc3RJZCIpO24ubWVtYmVycy5fWEFNWlJlcXVlc3RJZD11fXZhciBsPWMucGFyc2UoZS5odHRwUmVzcG9uc2UuYm9keS50b1N0cmluZygpLG4pO2UucmVxdWVzdElkPWwuX1hBTVpSZXF1ZXN0SWR8fGwucmVxdWVzdElkLGwuX1hBTVpSZXF1ZXN0SWQmJmRlbGV0ZSBsLl9YQU1aUmVxdWVzdElkLGkucmVzdWx0V3JhcHBlciYmbFtpLnJlc3VsdFdyYXBwZXJdJiYoby51cGRhdGUobCxsW2kucmVzdWx0V3JhcHBlcl0pLGRlbGV0ZSBsW2kucmVzdWx0V3JhcHBlcl0pLGUuZGF0YT1sfX19LHsiLi4vY29yZSI6MTksIi4uL21vZGVsL3NoYXBlIjo0NSwiLi4vcXVlcnkvcXVlcnlfcGFyYW1fc2VyaWFsaXplciI6NTMsIi4uL3V0aWwiOjc0LCIuL2hlbHBlcnMiOjQ3fV0sNTA6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIiksbz1lKCIuL2hlbHBlcnMiKS5wb3B1bGF0ZUhvc3RQcmVmaXg7ZnVuY3Rpb24gaShlLHQsbixvKXt2YXIgaT1bZSx0XS5qb2luKCIvIik7aT1pLnJlcGxhY2UoL1wvKy9nLCIvIik7dmFyIHM9e30sYT0hMTtpZihyLmVhY2gobi5tZW1iZXJzLChmdW5jdGlvbihlLHQpe3ZhciBuPW9bZV07aWYobnVsbCE9bilpZigidXJpIj09PXQubG9jYXRpb24pe3ZhciBjPW5ldyBSZWdFeHAoIlxceyIrdC5uYW1lKyIoXFwrKT9cXH0iKTtpPWkucmVwbGFjZShjLChmdW5jdGlvbihlLHQpe3JldHVybih0P3IudXJpRXNjYXBlUGF0aDpyLnVyaUVzY2FwZSkoU3RyaW5nKG4pKX0pKX1lbHNlInF1ZXJ5c3RyaW5nIj09PXQubG9jYXRpb24mJihhPSEwLCJsaXN0Ij09PXQudHlwZT9zW3QubmFtZV09bi5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiByLnVyaUVzY2FwZSh0Lm1lbWJlci50b1dpcmVGb3JtYXQoZSkudG9TdHJpbmcoKSl9KSk6Im1hcCI9PT10LnR5cGU/ci5lYWNoKG4sKGZ1bmN0aW9uKGUsdCl7QXJyYXkuaXNBcnJheSh0KT9zW2VdPXQubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gci51cmlFc2NhcGUoU3RyaW5nKGUpKX0pKTpzW2VdPXIudXJpRXNjYXBlKFN0cmluZyh0KSl9KSk6c1t0Lm5hbWVdPXIudXJpRXNjYXBlKHQudG9XaXJlRm9ybWF0KG4pLnRvU3RyaW5nKCkpKX0pKSxhKXtpKz1pLmluZGV4T2YoIj8iKT49MD8iJiI6Ij8iO3ZhciBjPVtdO3IuYXJyYXlFYWNoKE9iamVjdC5rZXlzKHMpLnNvcnQoKSwoZnVuY3Rpb24oZSl7QXJyYXkuaXNBcnJheShzW2VdKXx8KHNbZV09W3NbZV1dKTtmb3IodmFyIHQ9MDt0PHNbZV0ubGVuZ3RoO3QrKyljLnB1c2goci51cmlFc2NhcGUoU3RyaW5nKGUpKSsiPSIrc1tlXVt0XSl9KSksaSs9Yy5qb2luKCImIil9cmV0dXJuIGl9dC5leHBvcnRzPXtidWlsZFJlcXVlc3Q6ZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUpe2UuaHR0cFJlcXVlc3QubWV0aG9kPWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0uaHR0cE1ldGhvZH0oZSksZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXSxuPXQuaW5wdXQscj1pKGUuaHR0cFJlcXVlc3QuZW5kcG9pbnQucGF0aCx0Lmh0dHBQYXRoLG4sZS5wYXJhbXMpO2UuaHR0cFJlcXVlc3QucGF0aD1yfShlKSxmdW5jdGlvbihlKXt2YXIgdD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dO3IuZWFjaCh0LmlucHV0Lm1lbWJlcnMsKGZ1bmN0aW9uKHQsbil7dmFyIG89ZS5wYXJhbXNbdF07bnVsbCE9byYmKCJoZWFkZXJzIj09PW4ubG9jYXRpb24mJiJtYXAiPT09bi50eXBlP3IuZWFjaChvLChmdW5jdGlvbih0LHIpe2UuaHR0cFJlcXVlc3QuaGVhZGVyc1tuLm5hbWUrdF09cn0pKToiaGVhZGVyIj09PW4ubG9jYXRpb24mJihvPW4udG9XaXJlRm9ybWF0KG8pLnRvU3RyaW5nKCksbi5pc0pzb25WYWx1ZSYmKG89ci5iYXNlNjQuZW5jb2RlKG8pKSxlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbbi5uYW1lXT1vKSl9KSl9KGUpLG8oZSl9LGV4dHJhY3RFcnJvcjpmdW5jdGlvbigpe30sZXh0cmFjdERhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXF1ZXN0LG49e30sbz1lLmh0dHBSZXNwb25zZSxpPXQuc2VydmljZS5hcGkub3BlcmF0aW9uc1t0Lm9wZXJhdGlvbl0ub3V0cHV0LHM9e307ci5lYWNoKG8uaGVhZGVycywoZnVuY3Rpb24oZSx0KXtzW2UudG9Mb3dlckNhc2UoKV09dH0pKSxyLmVhY2goaS5tZW1iZXJzLChmdW5jdGlvbihlLHQpe3ZhciBpPSh0Lm5hbWV8fGUpLnRvTG93ZXJDYXNlKCk7aWYoImhlYWRlcnMiPT09dC5sb2NhdGlvbiYmIm1hcCI9PT10LnR5cGUpe25bZV09e307dmFyIGE9dC5pc0xvY2F0aW9uTmFtZT90Lm5hbWU6IiIsYz1uZXcgUmVnRXhwKCJeIithKyIoLispIiwiaSIpO3IuZWFjaChvLmhlYWRlcnMsKGZ1bmN0aW9uKHQscil7dmFyIG89dC5tYXRjaChjKTtudWxsIT09byYmKG5bZV1bb1sxXV09cil9KSl9ZWxzZSBpZigiaGVhZGVyIj09PXQubG9jYXRpb24pe2lmKHZvaWQgMCE9PXNbaV0pe3ZhciB1PXQuaXNKc29uVmFsdWU/ci5iYXNlNjQuZGVjb2RlKHNbaV0pOnNbaV07bltlXT10LnRvVHlwZSh1KX19ZWxzZSJzdGF0dXNDb2RlIj09PXQubG9jYXRpb24mJihuW2VdPXBhcnNlSW50KG8uc3RhdHVzQ29kZSwxMCkpfSkpLGUuZGF0YT1ufSxnZW5lcmF0ZVVSSTppfX0seyIuLi91dGlsIjo3NCwiLi9oZWxwZXJzIjo0N31dLDUxOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpLG89ZSgiLi9yZXN0IiksaT1lKCIuL2pzb24iKSxzPWUoIi4uL2pzb24vYnVpbGRlciIpLGE9ZSgiLi4vanNvbi9wYXJzZXIiKSxjPVsiR0VUIiwiSEVBRCIsIkRFTEVURSJdO2Z1bmN0aW9uIHUoZSx0KXtpZighZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LVR5cGUiXSl7dmFyIG49dD8iYmluYXJ5L29jdGV0LXN0cmVhbSI6ImFwcGxpY2F0aW9uL2pzb24iO2UuaHR0cFJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1UeXBlIl09bn19dC5leHBvcnRzPXtidWlsZFJlcXVlc3Q6ZnVuY3Rpb24oZSl7by5idWlsZFJlcXVlc3QoZSksYy5pbmRleE9mKGUuaHR0cFJlcXVlc3QubWV0aG9kKTwwJiZmdW5jdGlvbihlKXt2YXIgdD1uZXcgcyxuPWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0uaW5wdXQ7aWYobi5wYXlsb2FkKXt2YXIgcixvPW4ubWVtYmVyc1tuLnBheWxvYWRdO3I9ZS5wYXJhbXNbbi5wYXlsb2FkXSwic3RydWN0dXJlIj09PW8udHlwZT8oZS5odHRwUmVxdWVzdC5ib2R5PXQuYnVpbGQocnx8e30sbyksdShlKSk6dm9pZCAwIT09ciYmKGUuaHR0cFJlcXVlc3QuYm9keT1yLCgiYmluYXJ5Ij09PW8udHlwZXx8by5pc1N0cmVhbWluZykmJnUoZSwhMCkpfWVsc2UgZS5odHRwUmVxdWVzdC5ib2R5PXQuYnVpbGQoZS5wYXJhbXMsbiksdShlKX0oZSl9LGV4dHJhY3RFcnJvcjpmdW5jdGlvbihlKXtpLmV4dHJhY3RFcnJvcihlKX0sZXh0cmFjdERhdGE6ZnVuY3Rpb24oZSl7by5leHRyYWN0RGF0YShlKTt2YXIgdD1lLnJlcXVlc3Qsbj10LnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbdC5vcGVyYXRpb25dLHM9dC5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW3Qub3BlcmF0aW9uXS5vdXRwdXR8fHt9O2lmKG4uaGFzRXZlbnRPdXRwdXQscy5wYXlsb2FkKXt2YXIgYz1zLm1lbWJlcnNbcy5wYXlsb2FkXSx1PWUuaHR0cFJlc3BvbnNlLmJvZHk7aWYoYy5pc0V2ZW50U3RyZWFtKWw9bmV3IGEsZS5kYXRhW3BheWxvYWRdPXIuY3JlYXRlRXZlbnRTdHJlYW0oMj09PUFXUy5IdHRwQ2xpZW50LnN0cmVhbXNBcGlWZXJzaW9uP2UuaHR0cFJlc3BvbnNlLnN0cmVhbTp1LGwsYyk7ZWxzZSBpZigic3RydWN0dXJlIj09PWMudHlwZXx8Imxpc3QiPT09Yy50eXBlKXt2YXIgbD1uZXcgYTtlLmRhdGFbcy5wYXlsb2FkXT1sLnBhcnNlKHUsYyl9ZWxzZSJiaW5hcnkiPT09Yy50eXBlfHxjLmlzU3RyZWFtaW5nP2UuZGF0YVtzLnBheWxvYWRdPXU6ZS5kYXRhW3MucGF5bG9hZF09Yy50b1R5cGUodSl9ZWxzZXt2YXIgcD1lLmRhdGE7aS5leHRyYWN0RGF0YShlKSxlLmRhdGE9ci5tZXJnZShwLGUuZGF0YSl9fSx1bnNldENvbnRlbnRMZW5ndGg6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ci5nZXRSZXF1ZXN0UGF5bG9hZFNoYXBlKGUpJiZjLmluZGV4T2YoZS5odHRwUmVxdWVzdC5tZXRob2QpPj0wJiZkZWxldGUgZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LUxlbmd0aCJdfX19LHsiLi4vanNvbi9idWlsZGVyIjozNywiLi4vanNvbi9wYXJzZXIiOjM4LCIuLi91dGlsIjo3NCwiLi9qc29uIjo0OCwiLi9yZXN0Ijo1MH1dLDUyOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ZSgiLi4vdXRpbCIpLGk9ZSgiLi9yZXN0Iik7dC5leHBvcnRzPXtidWlsZFJlcXVlc3Q6ZnVuY3Rpb24oZSl7aS5idWlsZFJlcXVlc3QoZSksWyJHRVQiLCJIRUFEIl0uaW5kZXhPZihlLmh0dHBSZXF1ZXN0Lm1ldGhvZCk8MCYmZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXS5pbnB1dCxuPW5ldyByLlhNTC5CdWlsZGVyLGk9ZS5wYXJhbXMscz10LnBheWxvYWQ7aWYocyl7dmFyIGE9dC5tZW1iZXJzW3NdO2lmKHZvaWQgMD09PShpPWlbc10pKXJldHVybjtpZigic3RydWN0dXJlIj09PWEudHlwZSl7dmFyIGM9YS5uYW1lO2UuaHR0cFJlcXVlc3QuYm9keT1uLnRvWE1MKGksYSxjLCEwKX1lbHNlIGUuaHR0cFJlcXVlc3QuYm9keT1pfWVsc2UgZS5odHRwUmVxdWVzdC5ib2R5PW4udG9YTUwoaSx0LHQubmFtZXx8dC5zaGFwZXx8by5zdHJpbmcudXBwZXJGaXJzdChlLm9wZXJhdGlvbikrIlJlcXVlc3QiKX0oZSl9LGV4dHJhY3RFcnJvcjpmdW5jdGlvbihlKXt2YXIgdDtpLmV4dHJhY3RFcnJvcihlKTt0cnl7dD0obmV3IHIuWE1MLlBhcnNlcikucGFyc2UoZS5odHRwUmVzcG9uc2UuYm9keS50b1N0cmluZygpKX1jYXRjaChuKXt0PXtDb2RlOmUuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUsTWVzc2FnZTplLmh0dHBSZXNwb25zZS5zdGF0dXNNZXNzYWdlfX10LkVycm9ycyYmKHQ9dC5FcnJvcnMpLHQuRXJyb3ImJih0PXQuRXJyb3IpLHQuQ29kZT9lLmVycm9yPW8uZXJyb3IobmV3IEVycm9yLHtjb2RlOnQuQ29kZSxtZXNzYWdlOnQuTWVzc2FnZX0pOmUuZXJyb3I9by5lcnJvcihuZXcgRXJyb3Ise2NvZGU6ZS5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSxtZXNzYWdlOm51bGx9KX0sZXh0cmFjdERhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ7aS5leHRyYWN0RGF0YShlKTt2YXIgbj1lLnJlcXVlc3Qscz1lLmh0dHBSZXNwb25zZS5ib2R5LGE9bi5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW24ub3BlcmF0aW9uXSxjPWEub3V0cHV0LHU9KGEuaGFzRXZlbnRPdXRwdXQsYy5wYXlsb2FkKTtpZih1KXt2YXIgbD1jLm1lbWJlcnNbdV07bC5pc0V2ZW50U3RyZWFtPyh0PW5ldyByLlhNTC5QYXJzZXIsZS5kYXRhW3VdPW8uY3JlYXRlRXZlbnRTdHJlYW0oMj09PXIuSHR0cENsaWVudC5zdHJlYW1zQXBpVmVyc2lvbj9lLmh0dHBSZXNwb25zZS5zdHJlYW06ZS5odHRwUmVzcG9uc2UuYm9keSx0LGwpKToic3RydWN0dXJlIj09PWwudHlwZT8odD1uZXcgci5YTUwuUGFyc2VyLGUuZGF0YVt1XT10LnBhcnNlKHMudG9TdHJpbmcoKSxsKSk6ImJpbmFyeSI9PT1sLnR5cGV8fGwuaXNTdHJlYW1pbmc/ZS5kYXRhW3VdPXM6ZS5kYXRhW3VdPWwudG9UeXBlKHMpfWVsc2UgaWYocy5sZW5ndGg+MCl7dmFyIHA9KHQ9bmV3IHIuWE1MLlBhcnNlcikucGFyc2Uocy50b1N0cmluZygpLGMpO28udXBkYXRlKGUuZGF0YSxwKX19fX0seyIuLi9jb3JlIjoxOSwiLi4vdXRpbCI6NzQsIi4vcmVzdCI6NTB9XSw1MzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKTtmdW5jdGlvbiBvKCl7fWZ1bmN0aW9uIGkoZSl7cmV0dXJuIGUuaXNRdWVyeU5hbWV8fCJlYzIiIT09ZS5hcGkucHJvdG9jb2w/ZS5uYW1lOmUubmFtZVswXS50b1VwcGVyQ2FzZSgpK2UubmFtZS5zdWJzdHIoMSl9ZnVuY3Rpb24gcyhlLHQsbixvKXtyLmVhY2gobi5tZW1iZXJzLChmdW5jdGlvbihuLHIpe3ZhciBzPXRbbl07aWYobnVsbCE9cyl7dmFyIGM9aShyKTthKGM9ZT9lKyIuIitjOmMscyxyLG8pfX0pKX1mdW5jdGlvbiBhKGUsdCxuLG8pe251bGwhPXQmJigic3RydWN0dXJlIj09PW4udHlwZT9zKGUsdCxuLG8pOiJsaXN0Ij09PW4udHlwZT9mdW5jdGlvbihlLHQsbixvKXt2YXIgcz1uLm1lbWJlcnx8e307MCE9PXQubGVuZ3RoP3IuYXJyYXlFYWNoKHQsKGZ1bmN0aW9uKHQscil7dmFyIGM9Ii4iKyhyKzEpO2lmKCJlYzIiPT09bi5hcGkucHJvdG9jb2wpYys9IiI7ZWxzZSBpZihuLmZsYXR0ZW5lZCl7aWYocy5uYW1lKXt2YXIgdT1lLnNwbGl0KCIuIik7dS5wb3AoKSx1LnB1c2goaShzKSksZT11LmpvaW4oIi4iKX19ZWxzZSBjPSIuIisocy5uYW1lP3MubmFtZToibWVtYmVyIikrYzthKGUrYyx0LHMsbyl9KSk6by5jYWxsKHRoaXMsZSxudWxsKX0oZSx0LG4sbyk6Im1hcCI9PT1uLnR5cGU/ZnVuY3Rpb24oZSx0LG4sbyl7dmFyIGk9MTtyLmVhY2godCwoZnVuY3Rpb24odCxyKXt2YXIgcz0obi5mbGF0dGVuZWQ/Ii4iOiIuZW50cnkuIikraSsrKyIuIixjPXMrKG4ua2V5Lm5hbWV8fCJrZXkiKSx1PXMrKG4udmFsdWUubmFtZXx8InZhbHVlIik7YShlK2MsdCxuLmtleSxvKSxhKGUrdSxyLG4udmFsdWUsbyl9KSl9KGUsdCxuLG8pOm8oZSxuLnRvV2lyZUZvcm1hdCh0KS50b1N0cmluZygpKSl9by5wcm90b3R5cGUuc2VyaWFsaXplPWZ1bmN0aW9uKGUsdCxuKXtzKCIiLGUsdCxuKX0sdC5leHBvcnRzPW99LHsiLi4vdXRpbCI6NzR9XSw1NDpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17bm93OmZ1bmN0aW9uKCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBwZXJmb3JtYW5jZSYmImZ1bmN0aW9uIj09dHlwZW9mIHBlcmZvcm1hbmNlLm5vdz9wZXJmb3JtYW5jZS5ub3coKTpEYXRlLm5vdygpfX19LHt9XSw1NTpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17aXNGaXBzUmVnaW9uOmZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmKGUuc3RhcnRzV2l0aCgiZmlwcy0iKXx8ZS5lbmRzV2l0aCgiLWZpcHMiKSl9LGlzR2xvYmFsUmVnaW9uOmZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmWyJhd3MtZ2xvYmFsIiwiYXdzLXVzLWdvdi1nbG9iYWwiXS5pbmNsdWRlcyhlKX0sZ2V0UmVhbFJlZ2lvbjpmdW5jdGlvbihlKXtyZXR1cm5bImZpcHMtYXdzLWdsb2JhbCIsImF3cy1maXBzIiwiYXdzLWdsb2JhbCJdLmluY2x1ZGVzKGUpPyJ1cy1lYXN0LTEiOlsiZmlwcy1hd3MtdXMtZ292LWdsb2JhbCIsImF3cy11cy1nb3YtZ2xvYmFsIl0uaW5jbHVkZXMoZSk/InVzLWdvdi13ZXN0LTEiOmUucmVwbGFjZSgvZmlwcy0oZGtyLXxwcm9kLSk/fC1maXBzLywiIil9fX0se31dLDU2OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi91dGlsIiksbz1lKCIuL3JlZ2lvbl9jb25maWdfZGF0YS5qc29uIik7ZnVuY3Rpb24gaShlLHQpe3IuZWFjaCh0LChmdW5jdGlvbih0LG4peyJnbG9iYWxFbmRwb2ludCIhPT10JiYodm9pZCAwIT09ZS5jb25maWdbdF0mJm51bGwhPT1lLmNvbmZpZ1t0XXx8KGUuY29uZmlnW3RdPW4pKX0pKX10LmV4cG9ydHM9e2NvbmZpZ3VyZUVuZHBvaW50OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1mdW5jdGlvbihlKXt2YXIgdD1lLmNvbmZpZy5yZWdpb24sbj1mdW5jdGlvbihlKXtpZighZSlyZXR1cm4gbnVsbDt2YXIgdD1lLnNwbGl0KCItIik7cmV0dXJuIHQubGVuZ3RoPDM/bnVsbDp0LnNsaWNlKDAsdC5sZW5ndGgtMikuam9pbigiLSIpKyItKiJ9KHQpLHI9ZS5hcGkuZW5kcG9pbnRQcmVmaXg7cmV0dXJuW1t0LHJdLFtuLHJdLFt0LCIqIl0sW24sIioiXSxbIioiLHJdLFsiKiIsIioiXV0ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZVswXSYmZVsxXT9lLmpvaW4oIi8iKTpudWxsfSkpfShlKSxuPWUuY29uZmlnLnVzZUZpcHNFbmRwb2ludCxyPWUuY29uZmlnLnVzZUR1YWxzdGFja0VuZHBvaW50LHM9MDtzPHQubGVuZ3RoO3MrKyl7dmFyIGE9dFtzXTtpZihhKXt2YXIgYz1uP3I/by5kdWFsc3RhY2tGaXBzUnVsZXM6by5maXBzUnVsZXM6cj9vLmR1YWxzdGFja1J1bGVzOm8ucnVsZXM7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsYSkpe3ZhciB1PWNbYV07InN0cmluZyI9PXR5cGVvZiB1JiYodT1vLnBhdHRlcm5zW3VdKSxlLmlzR2xvYmFsRW5kcG9pbnQ9ISF1Lmdsb2JhbEVuZHBvaW50LHUuc2lnbmluZ1JlZ2lvbiYmKGUuc2lnbmluZ1JlZ2lvbj11LnNpZ25pbmdSZWdpb24pLHUuc2lnbmF0dXJlVmVyc2lvbnx8KHUuc2lnbmF0dXJlVmVyc2lvbj0idjQiKTt2YXIgbD0iYmVhcmVyIj09PShlLmFwaSYmZS5hcGkuc2lnbmF0dXJlVmVyc2lvbik7cmV0dXJuIHZvaWQgaShlLE9iamVjdC5hc3NpZ24oe30sdSx7c2lnbmF0dXJlVmVyc2lvbjpsPyJiZWFyZXIiOnUuc2lnbmF0dXJlVmVyc2lvbn0pKX19fX0sZ2V0RW5kcG9pbnRTdWZmaXg6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXsiXih1c3xldXxhcHxzYXxjYXxtZSlcXC1cXHcrXFwtXFxkKyQiOiJhbWF6b25hd3MuY29tIiwiXmNuXFwtXFx3K1xcLVxcZCskIjoiYW1hem9uYXdzLmNvbS5jbiIsIl51c1xcLWdvdlxcLVxcdytcXC1cXGQrJCI6ImFtYXpvbmF3cy5jb20iLCJedXNcXC1pc29cXC1cXHcrXFwtXFxkKyQiOiJjMnMuaWMuZ292IiwiXnVzXFwtaXNvYlxcLVxcdytcXC1cXGQrJCI6InNjMnMuc2dvdi5nb3YifSxuPU9iamVjdC5rZXlzKHQpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIG89UmVnRXhwKG5bcl0pLGk9dFtuW3JdXTtpZihvLnRlc3QoZSkpcmV0dXJuIGl9cmV0dXJuImFtYXpvbmF3cy5jb20ifX19LHsiLi9yZWdpb25fY29uZmlnX2RhdGEuanNvbiI6NTcsIi4vdXRpbCI6NzR9XSw1NzpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17cnVsZXM6eyIqLyoiOntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LmFtYXpvbmF3cy5jb20ifSwiY24tKi8qIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5hbWF6b25hd3MuY29tLmNuIn0sInVzLWlzby0qLyoiOiJ1c0lzbyIsInVzLWlzb2ItKi8qIjoidXNJc29iIiwiKi9idWRnZXRzIjoiZ2xvYmFsU1NMIiwiKi9jbG91ZGZyb250IjoiZ2xvYmFsU1NMIiwiKi9zdHMiOiJnbG9iYWxTU0wiLCIqL2ltcG9ydGV4cG9ydCI6e2VuZHBvaW50OiJ7c2VydmljZX0uYW1hem9uYXdzLmNvbSIsc2lnbmF0dXJlVmVyc2lvbjoidjIiLGdsb2JhbEVuZHBvaW50OiEwfSwiKi9yb3V0ZTUzIjoiZ2xvYmFsU1NMIiwiY24tKi9yb3V0ZTUzIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5hbWF6b25hd3MuY29tLmNuIixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJjbi1ub3J0aHdlc3QtMSJ9LCJ1cy1nb3YtKi9yb3V0ZTUzIjoiZ2xvYmFsR292Q2xvdWQiLCJ1cy1pc28tKi9yb3V0ZTUzIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5jMnMuaWMuZ292IixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJ1cy1pc28tZWFzdC0xIn0sInVzLWlzb2ItKi9yb3V0ZTUzIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5zYzJzLnNnb3YuZ292IixnbG9iYWxFbmRwb2ludDohMCxzaWduaW5nUmVnaW9uOiJ1cy1pc29iLWVhc3QtMSJ9LCIqL3dhZiI6Imdsb2JhbFNTTCIsIiovaWFtIjoiZ2xvYmFsU1NMIiwiY24tKi9pYW0iOntlbmRwb2ludDoie3NlcnZpY2V9LmNuLW5vcnRoLTEuYW1hem9uYXdzLmNvbS5jbiIsZ2xvYmFsRW5kcG9pbnQ6ITAsc2lnbmluZ1JlZ2lvbjoiY24tbm9ydGgtMSJ9LCJ1cy1nb3YtKi9pYW0iOiJnbG9iYWxHb3ZDbG91ZCIsInVzLWdvdi0qL3N0cyI6e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LCJ1cy1nb3Ytd2VzdC0xL3MzIjoiczNzaWduYXR1cmUiLCJ1cy13ZXN0LTEvczMiOiJzM3NpZ25hdHVyZSIsInVzLXdlc3QtMi9zMyI6InMzc2lnbmF0dXJlIiwiZXUtd2VzdC0xL3MzIjoiczNzaWduYXR1cmUiLCJhcC1zb3V0aGVhc3QtMS9zMyI6InMzc2lnbmF0dXJlIiwiYXAtc291dGhlYXN0LTIvczMiOiJzM3NpZ25hdHVyZSIsImFwLW5vcnRoZWFzdC0xL3MzIjoiczNzaWduYXR1cmUiLCJzYS1lYXN0LTEvczMiOiJzM3NpZ25hdHVyZSIsInVzLWVhc3QtMS9zMyI6e2VuZHBvaW50OiJ7c2VydmljZX0uYW1hem9uYXdzLmNvbSIsc2lnbmF0dXJlVmVyc2lvbjoiczMifSwidXMtZWFzdC0xL3NkYiI6e2VuZHBvaW50OiJ7c2VydmljZX0uYW1hem9uYXdzLmNvbSIsc2lnbmF0dXJlVmVyc2lvbjoidjIifSwiKi9zZGIiOntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LmFtYXpvbmF3cy5jb20iLHNpZ25hdHVyZVZlcnNpb246InYyIn0sIiovcmVzb3VyY2UtZXhwbG9yZXItMiI6ImR1YWxzdGFja0J5RGVmYXVsdCIsIiova2VuZHJhLXJhbmtpbmciOiJkdWFsc3RhY2tCeURlZmF1bHQiLCIqL2ludGVybmV0bW9uaXRvciI6ImR1YWxzdGFja0J5RGVmYXVsdCIsIiovY29kZWNhdGFseXN0IjoiZ2xvYmFsRHVhbHN0YWNrQnlEZWZhdWx0In0sZmlwc1J1bGVzOnsiKi8qIjoiZmlwc1N0YW5kYXJkIiwidXMtZ292LSovKiI6ImZpcHNTdGFuZGFyZCIsInVzLWlzby0qLyoiOntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMue3JlZ2lvbn0uYzJzLmljLmdvdiJ9LCJ1cy1pc28tKi9kbXMiOiJ1c0lzbyIsInVzLWlzb2ItKi8qIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLntyZWdpb259LnNjMnMuc2dvdi5nb3YifSwidXMtaXNvYi0qL2RtcyI6InVzSXNvYiIsImNuLSovKiI6e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy57cmVnaW9ufS5hbWF6b25hd3MuY29tLmNuIn0sIiovYXBpLmVjciI6ImZpcHMuYXBpLmVjciIsIiovYXBpLnNhZ2VtYWtlciI6ImZpcHMuYXBpLnNhZ2VtYWtlciIsIiovYmF0Y2giOiJmaXBzRG90UHJlZml4IiwiKi9la3MiOiJmaXBzRG90UHJlZml4IiwiKi9tb2RlbHMubGV4IjoiZmlwcy5tb2RlbHMubGV4IiwiKi9ydW50aW1lLmxleCI6ImZpcHMucnVudGltZS5sZXgiLCIqL3J1bnRpbWUuc2FnZW1ha2VyIjp7ZW5kcG9pbnQ6InJ1bnRpbWUtZmlwcy5zYWdlbWFrZXIue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LCIqL2lhbSI6ImZpcHNXaXRob3V0UmVnaW9uIiwiKi9yb3V0ZTUzIjoiZmlwc1dpdGhvdXRSZWdpb24iLCIqL3RyYW5zY3JpYmUiOiJmaXBzRG90UHJlZml4IiwiKi93YWYiOiJmaXBzV2l0aG91dFJlZ2lvbiIsInVzLWdvdi0qL3RyYW5zY3JpYmUiOiJmaXBzRG90UHJlZml4IiwidXMtZ292LSovYXBpLmVjciI6ImZpcHMuYXBpLmVjciIsInVzLWdvdi0qL2FwaS5zYWdlbWFrZXIiOiJmaXBzLmFwaS5zYWdlbWFrZXIiLCJ1cy1nb3YtKi9tb2RlbHMubGV4IjoiZmlwcy5tb2RlbHMubGV4IiwidXMtZ292LSovcnVudGltZS5sZXgiOiJmaXBzLnJ1bnRpbWUubGV4IiwidXMtZ292LSovYWNtLXBjYSI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9iYXRjaCI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9jbG91ZGZvcm1hdGlvbiI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9jb25maWciOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovZWtzIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL2VsYXN0aWNtYXByZWR1Y2UiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovaWRlbnRpdHlzdG9yZSI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9keW5hbW9kYiI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9lbGFzdGljbG9hZGJhbGFuY2luZyI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9ndWFyZGR1dHkiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovbW9uaXRvcmluZyI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9yZXNvdXJjZS1ncm91cHMiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovcnVudGltZS5zYWdlbWFrZXIiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovc2VydmljZWNhdGFsb2ctYXBwcmVnaXN0cnkiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovc2VydmljZXF1b3RhcyI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9zc20iOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovc3RzIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL3N1cHBvcnQiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LXdlc3QtMS9zdGF0ZXMiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtaXNvLWVhc3QtMS9lbGFzdGljZmlsZXN5c3RlbSI6e2VuZHBvaW50OiJlbGFzdGljZmlsZXN5c3RlbS1maXBzLntyZWdpb259LmMycy5pYy5nb3YifSwidXMtZ292LXdlc3QtMS9vcmdhbml6YXRpb25zIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi13ZXN0LTEvcm91dGU1MyI6e2VuZHBvaW50OiJyb3V0ZTUzLnVzLWdvdi5hbWF6b25hd3MuY29tIn0sIiovcmVzb3VyY2UtZXhwbG9yZXItMiI6ImZpcHNEdWFsc3RhY2tCeURlZmF1bHQiLCIqL2tlbmRyYS1yYW5raW5nIjoiZHVhbHN0YWNrQnlEZWZhdWx0IiwiKi9pbnRlcm5ldG1vbml0b3IiOiJkdWFsc3RhY2tCeURlZmF1bHQiLCIqL2NvZGVjYXRhbHlzdCI6ImZpcHNHbG9iYWxEdWFsc3RhY2tCeURlZmF1bHQifSxkdWFsc3RhY2tSdWxlczp7IiovKiI6e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uYXBpLmF3cyJ9LCJjbi0qLyoiOntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LmFwaS5hbWF6b253ZWJzZXJ2aWNlcy5jb20uY24ifSwiKi9zMyI6ImR1YWxzdGFja0xlZ2FjeSIsImNuLSovczMiOiJkdWFsc3RhY2tMZWdhY3lDbiIsIiovczMtY29udHJvbCI6ImR1YWxzdGFja0xlZ2FjeSIsImNuLSovczMtY29udHJvbCI6ImR1YWxzdGFja0xlZ2FjeUNuIiwiYXAtc291dGgtMS9lYzIiOiJkdWFsc3RhY2tMZWdhY3lFYzIiLCJldS13ZXN0LTEvZWMyIjoiZHVhbHN0YWNrTGVnYWN5RWMyIiwic2EtZWFzdC0xL2VjMiI6ImR1YWxzdGFja0xlZ2FjeUVjMiIsInVzLWVhc3QtMS9lYzIiOiJkdWFsc3RhY2tMZWdhY3lFYzIiLCJ1cy1lYXN0LTIvZWMyIjoiZHVhbHN0YWNrTGVnYWN5RWMyIiwidXMtd2VzdC0yL2VjMiI6ImR1YWxzdGFja0xlZ2FjeUVjMiJ9LGR1YWxzdGFja0ZpcHNSdWxlczp7IiovKiI6e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy57cmVnaW9ufS5hcGkuYXdzIn0sImNuLSovKiI6e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy57cmVnaW9ufS5hcGkuYW1hem9ud2Vic2VydmljZXMuY29tLmNuIn0sIiovczMiOiJkdWFsc3RhY2tGaXBzTGVnYWN5IiwiY24tKi9zMyI6ImR1YWxzdGFja0ZpcHNMZWdhY3lDbiIsIiovczMtY29udHJvbCI6ImR1YWxzdGFja0ZpcHNMZWdhY3kiLCJjbi0qL3MzLWNvbnRyb2wiOiJkdWFsc3RhY2tGaXBzTGVnYWN5Q24ifSxwYXR0ZXJuczp7Z2xvYmFsU1NMOntlbmRwb2ludDoiaHR0cHM6Ly97c2VydmljZX0uYW1hem9uYXdzLmNvbSIsZ2xvYmFsRW5kcG9pbnQ6ITAsc2lnbmluZ1JlZ2lvbjoidXMtZWFzdC0xIn0sZ2xvYmFsR292Q2xvdWQ6e2VuZHBvaW50OiJ7c2VydmljZX0udXMtZ292LmFtYXpvbmF3cy5jb20iLGdsb2JhbEVuZHBvaW50OiEwLHNpZ25pbmdSZWdpb246InVzLWdvdi13ZXN0LTEifSxzM3NpZ25hdHVyZTp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5hbWF6b25hd3MuY29tIixzaWduYXR1cmVWZXJzaW9uOiJzMyJ9LHVzSXNvOntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LmMycy5pYy5nb3YifSx1c0lzb2I6e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uc2Mycy5zZ292LmdvdiJ9LGZpcHNTdGFuZGFyZDp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLntyZWdpb259LmFtYXpvbmF3cy5jb20ifSxmaXBzRG90UHJlZml4OntlbmRwb2ludDoiZmlwcy57c2VydmljZX0ue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LGZpcHNXaXRob3V0UmVnaW9uOntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMuYW1hem9uYXdzLmNvbSJ9LCJmaXBzLmFwaS5lY3IiOntlbmRwb2ludDoiZWNyLWZpcHMue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LCJmaXBzLmFwaS5zYWdlbWFrZXIiOntlbmRwb2ludDoiYXBpLWZpcHMuc2FnZW1ha2VyLntyZWdpb259LmFtYXpvbmF3cy5jb20ifSwiZmlwcy5tb2RlbHMubGV4Ijp7ZW5kcG9pbnQ6Im1vZGVscy1maXBzLmxleC57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sImZpcHMucnVudGltZS5sZXgiOntlbmRwb2ludDoicnVudGltZS1maXBzLmxleC57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sZmlwc1dpdGhTZXJ2aWNlT25seTp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sZHVhbHN0YWNrTGVnYWN5OntlbmRwb2ludDoie3NlcnZpY2V9LmR1YWxzdGFjay57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sZHVhbHN0YWNrTGVnYWN5Q246e2VuZHBvaW50OiJ7c2VydmljZX0uZHVhbHN0YWNrLntyZWdpb259LmFtYXpvbmF3cy5jb20uY24ifSxkdWFsc3RhY2tGaXBzTGVnYWN5OntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMuZHVhbHN0YWNrLntyZWdpb259LmFtYXpvbmF3cy5jb20ifSxkdWFsc3RhY2tGaXBzTGVnYWN5Q246e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy5kdWFsc3RhY2sue3JlZ2lvbn0uYW1hem9uYXdzLmNvbS5jbiJ9LGR1YWxzdGFja0xlZ2FjeUVjMjp7ZW5kcG9pbnQ6ImFwaS5lYzIue3JlZ2lvbn0uYXdzIn0sZHVhbHN0YWNrQnlEZWZhdWx0OntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LmFwaS5hd3MifSxmaXBzRHVhbHN0YWNrQnlEZWZhdWx0OntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMue3JlZ2lvbn0uYXBpLmF3cyJ9LGdsb2JhbER1YWxzdGFja0J5RGVmYXVsdDp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5nbG9iYWwuYXBpLmF3cyJ9LGZpcHNHbG9iYWxEdWFsc3RhY2tCeURlZmF1bHQ6e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy5nbG9iYWwuYXBpLmF3cyJ9fX19LHt9XSw1ODpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbih0KXsoZnVuY3Rpb24oKXt2YXIgbj1lKCIuL2NvcmUiKSxyPWUoIi4vc3RhdGVfbWFjaGluZSIpLG89bi51dGlsLmluaGVyaXQsaT1uLnV0aWwuZG9tYWluLHM9ZSgiam1lc3BhdGgiKSxhPXtzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSxjPW5ldyByO2Muc2V0dXBTdGF0ZXM9ZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7bi5faGFsdEhhbmRsZXJzT25FcnJvcj0hMSxuLmVtaXQobi5fYXNtLmN1cnJlbnRTdGF0ZSwoZnVuY3Rpb24oZSl7aWYoZSlpZihyPW4sT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsci5fYXNtLmN1cnJlbnRTdGF0ZSkpe2lmKCEoaSYmbi5kb21haW4gaW5zdGFuY2VvZiBpLkRvbWFpbikpdGhyb3cgZTtlLmRvbWFpbkVtaXR0ZXI9bixlLmRvbWFpbj1uLmRvbWFpbixlLmRvbWFpblRocm93bj0hMSxuLmRvbWFpbi5lbWl0KCJlcnJvciIsZSl9ZWxzZSBuLnJlc3BvbnNlLmVycm9yPWUsdChlKTtlbHNlIHQobi5yZXNwb25zZS5lcnJvcik7dmFyIHJ9KSl9O3RoaXMuYWRkU3RhdGUoInZhbGlkYXRlIiwiYnVpbGQiLCJlcnJvciIsZSksdGhpcy5hZGRTdGF0ZSgiYnVpbGQiLCJhZnRlckJ1aWxkIiwicmVzdGFydCIsZSksdGhpcy5hZGRTdGF0ZSgiYWZ0ZXJCdWlsZCIsInNpZ24iLCJyZXN0YXJ0IixlKSx0aGlzLmFkZFN0YXRlKCJzaWduIiwic2VuZCIsInJldHJ5IixlKSx0aGlzLmFkZFN0YXRlKCJyZXRyeSIsImFmdGVyUmV0cnkiLCJhZnRlclJldHJ5IixlKSx0aGlzLmFkZFN0YXRlKCJhZnRlclJldHJ5Iiwic2lnbiIsImVycm9yIixlKSx0aGlzLmFkZFN0YXRlKCJzZW5kIiwidmFsaWRhdGVSZXNwb25zZSIsInJldHJ5IixlKSx0aGlzLmFkZFN0YXRlKCJ2YWxpZGF0ZVJlc3BvbnNlIiwiZXh0cmFjdERhdGEiLCJleHRyYWN0RXJyb3IiLGUpLHRoaXMuYWRkU3RhdGUoImV4dHJhY3RFcnJvciIsImV4dHJhY3REYXRhIiwicmV0cnkiLGUpLHRoaXMuYWRkU3RhdGUoImV4dHJhY3REYXRhIiwic3VjY2VzcyIsInJldHJ5IixlKSx0aGlzLmFkZFN0YXRlKCJyZXN0YXJ0IiwiYnVpbGQiLCJlcnJvciIsZSksdGhpcy5hZGRTdGF0ZSgic3VjY2VzcyIsImNvbXBsZXRlIiwiY29tcGxldGUiLGUpLHRoaXMuYWRkU3RhdGUoImVycm9yIiwiY29tcGxldGUiLCJjb21wbGV0ZSIsZSksdGhpcy5hZGRTdGF0ZSgiY29tcGxldGUiLG51bGwsbnVsbCxlKX0sYy5zZXR1cFN0YXRlcygpLG4uUmVxdWVzdD1vKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlLHQsbyl7dmFyIHM9ZS5lbmRwb2ludCxhPWUuY29uZmlnLnJlZ2lvbix1PWUuY29uZmlnLmN1c3RvbVVzZXJBZ2VudDtlLnNpZ25pbmdSZWdpb24/YT1lLnNpZ25pbmdSZWdpb246ZS5pc0dsb2JhbEVuZHBvaW50JiYoYT0idXMtZWFzdC0xIiksdGhpcy5kb21haW49aSYmaS5hY3RpdmUsdGhpcy5zZXJ2aWNlPWUsdGhpcy5vcGVyYXRpb249dCx0aGlzLnBhcmFtcz1vfHx7fSx0aGlzLmh0dHBSZXF1ZXN0PW5ldyBuLkh0dHBSZXF1ZXN0KHMsYSksdGhpcy5odHRwUmVxdWVzdC5hcHBlbmRUb1VzZXJBZ2VudCh1KSx0aGlzLnN0YXJ0VGltZT1lLmdldFNrZXdDb3JyZWN0ZWREYXRlKCksdGhpcy5yZXNwb25zZT1uZXcgbi5SZXNwb25zZSh0aGlzKSx0aGlzLl9hc209bmV3IHIoYy5zdGF0ZXMsInZhbGlkYXRlIiksdGhpcy5faGFsdEhhbmRsZXJzT25FcnJvcj0hMSxuLlNlcXVlbnRpYWxFeGVjdXRvci5jYWxsKHRoaXMpLHRoaXMuZW1pdD10aGlzLmVtaXRFdmVudH0sc2VuZDpmdW5jdGlvbihlKXtyZXR1cm4gZSYmKHRoaXMuaHR0cFJlcXVlc3QuYXBwZW5kVG9Vc2VyQWdlbnQoImNhbGxiYWNrIiksdGhpcy5vbigiY29tcGxldGUiLChmdW5jdGlvbih0KXtlLmNhbGwodCx0LmVycm9yLHQuZGF0YSl9KSkpLHRoaXMucnVuVG8oKSx0aGlzLnJlc3BvbnNlfSxidWlsZDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5ydW5Ubygic2VuZCIsZSl9LHJ1blRvOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX2FzbS5ydW5UbyhlLHQsdGhpcyksdGhpc30sYWJvcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoInZhbGlkYXRlUmVzcG9uc2UiKSx0aGlzLnJlbW92ZUFsbExpc3RlbmVycygiZXh0cmFjdEVycm9yIiksdGhpcy5vbigidmFsaWRhdGVSZXNwb25zZSIsKGZ1bmN0aW9uKGUpe2UuZXJyb3I9bi51dGlsLmVycm9yKG5ldyBFcnJvcigiUmVxdWVzdCBhYm9ydGVkIGJ5IHVzZXIiKSx7Y29kZToiUmVxdWVzdEFib3J0ZWRFcnJvciIscmV0cnlhYmxlOiExfSl9KSksdGhpcy5odHRwUmVxdWVzdC5zdHJlYW0mJiF0aGlzLmh0dHBSZXF1ZXN0LnN0cmVhbS5kaWRDYWxsYmFjayYmKHRoaXMuaHR0cFJlcXVlc3Quc3RyZWFtLmFib3J0KCksdGhpcy5odHRwUmVxdWVzdC5fYWJvcnRDYWxsYmFjaz90aGlzLmh0dHBSZXF1ZXN0Ll9hYm9ydENhbGxiYWNrKCk6dGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoInNlbmQiKSksdGhpc30sZWFjaFBhZ2U6ZnVuY3Rpb24oZSl7ZT1uLnV0aWwuZm4ubWFrZUFzeW5jKGUsMyksdGhpcy5vbigiY29tcGxldGUiLChmdW5jdGlvbiB0KHIpe2UuY2FsbChyLHIuZXJyb3Isci5kYXRhLChmdW5jdGlvbihvKXshMSE9PW8mJihyLmhhc05leHRQYWdlKCk/ci5uZXh0UGFnZSgpLm9uKCJjb21wbGV0ZSIsdCkuc2VuZCgpOmUuY2FsbChyLG51bGwsbnVsbCxuLnV0aWwuZm4ubm9vcCkpfSkpfSkpLnNlbmQoKX0sZWFjaEl0ZW06ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLmVhY2hQYWdlKChmdW5jdGlvbihyLG8pe2lmKHIpcmV0dXJuIGUocixudWxsKTtpZihudWxsPT09bylyZXR1cm4gZShudWxsLG51bGwpO3ZhciBpPXQuc2VydmljZS5wYWdpbmF0aW9uQ29uZmlnKHQub3BlcmF0aW9uKS5yZXN1bHRLZXk7QXJyYXkuaXNBcnJheShpKSYmKGk9aVswXSk7dmFyIGE9cy5zZWFyY2gobyxpKSxjPSEwO3JldHVybiBuLnV0aWwuYXJyYXlFYWNoKGEsKGZ1bmN0aW9uKHQpe2lmKCExPT09KGM9ZShudWxsLHQpKSlyZXR1cm4gbi51dGlsLmFib3J0fSkpLGN9KSl9LGlzUGFnZWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuc2VydmljZS5wYWdpbmF0aW9uQ29uZmlnKHRoaXMub3BlcmF0aW9uKX0sY3JlYXRlUmVhZFN0cmVhbTpmdW5jdGlvbigpe3ZhciBlPW4udXRpbC5zdHJlYW0scj10aGlzLG89bnVsbDtyZXR1cm4gMj09PW4uSHR0cENsaWVudC5zdHJlYW1zQXBpVmVyc2lvbj8obz1uZXcgZS5QYXNzVGhyb3VnaCx0Lm5leHRUaWNrKChmdW5jdGlvbigpe3Iuc2VuZCgpfSkpKTooKG89bmV3IGUuU3RyZWFtKS5yZWFkYWJsZT0hMCxvLnNlbnQ9ITEsby5vbigibmV3TGlzdGVuZXIiLChmdW5jdGlvbihlKXtvLnNlbnR8fCJkYXRhIiE9PWV8fChvLnNlbnQ9ITAsdC5uZXh0VGljaygoZnVuY3Rpb24oKXtyLnNlbmQoKX0pKSl9KSkpLHRoaXMub24oImVycm9yIiwoZnVuY3Rpb24oZSl7by5lbWl0KCJlcnJvciIsZSl9KSksdGhpcy5vbigiaHR0cEhlYWRlcnMiLChmdW5jdGlvbih0LGkscyl7aWYodDwzMDApe3IucmVtb3ZlTGlzdGVuZXIoImh0dHBEYXRhIixuLkV2ZW50TGlzdGVuZXJzLkNvcmUuSFRUUF9EQVRBKSxyLnJlbW92ZUxpc3RlbmVyKCJodHRwRXJyb3IiLG4uRXZlbnRMaXN0ZW5lcnMuQ29yZS5IVFRQX0VSUk9SKSxyLm9uKCJodHRwRXJyb3IiLChmdW5jdGlvbihlKXtzLmVycm9yPWUscy5lcnJvci5yZXRyeWFibGU9ITF9KSk7dmFyIGEsYz0hMTtpZigiSEVBRCIhPT1yLmh0dHBSZXF1ZXN0Lm1ldGhvZCYmKGE9cGFyc2VJbnQoaVsiY29udGVudC1sZW5ndGgiXSwxMCkpLHZvaWQgMCE9PWEmJiFpc05hTihhKSYmYT49MCl7Yz0hMDt2YXIgdT0wfXZhciBsPWZ1bmN0aW9uKCl7YyYmdSE9PWE/by5lbWl0KCJlcnJvciIsbi51dGlsLmVycm9yKG5ldyBFcnJvcigiU3RyZWFtIGNvbnRlbnQgbGVuZ3RoIG1pc21hdGNoLiBSZWNlaXZlZCAiK3UrIiBvZiAiK2ErIiBieXRlcy4iKSx7Y29kZToiU3RyZWFtQ29udGVudExlbmd0aE1pc21hdGNoIn0pKToyPT09bi5IdHRwQ2xpZW50LnN0cmVhbXNBcGlWZXJzaW9uP28uZW5kKCk6by5lbWl0KCJlbmQiKX0scD1zLmh0dHBSZXNwb25zZS5jcmVhdGVVbmJ1ZmZlcmVkU3RyZWFtKCk7aWYoMj09PW4uSHR0cENsaWVudC5zdHJlYW1zQXBpVmVyc2lvbilpZihjKXt2YXIgZD1uZXcgZS5QYXNzVGhyb3VnaDtkLl93cml0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5sZW5ndGgmJih1Kz10Lmxlbmd0aCksZS5QYXNzVGhyb3VnaC5wcm90b3R5cGUuX3dyaXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZC5vbigiZW5kIixsKSxvLm9uKCJlcnJvciIsKGZ1bmN0aW9uKGUpe2M9ITEscC51bnBpcGUoZCksZC5lbWl0KCJlbmQiKSxkLmVuZCgpfSkpLHAucGlwZShkKS5waXBlKG8se2VuZDohMX0pfWVsc2UgcC5waXBlKG8pO2Vsc2UgYyYmcC5vbigiZGF0YSIsKGZ1bmN0aW9uKGUpe2UmJmUubGVuZ3RoJiYodSs9ZS5sZW5ndGgpfSkpLHAub24oImRhdGEiLChmdW5jdGlvbihlKXtvLmVtaXQoImRhdGEiLGUpfSkpLHAub24oImVuZCIsbCk7cC5vbigiZXJyb3IiLChmdW5jdGlvbihlKXtjPSExLG8uZW1pdCgiZXJyb3IiLGUpfSkpfX0pKSxvfSxlbWl0RXZlbnQ6ZnVuY3Rpb24oZSx0LHIpeyJmdW5jdGlvbiI9PXR5cGVvZiB0JiYocj10LHQ9bnVsbCkscnx8KHI9ZnVuY3Rpb24oKXt9KSx0fHwodD10aGlzLmV2ZW50UGFyYW1ldGVycyhlLHRoaXMucmVzcG9uc2UpKSxuLlNlcXVlbnRpYWxFeGVjdXRvci5wcm90b3R5cGUuZW1pdC5jYWxsKHRoaXMsZSx0LChmdW5jdGlvbihlKXtlJiYodGhpcy5yZXNwb25zZS5lcnJvcj1lKSxyLmNhbGwodGhpcyxlKX0pKX0sZXZlbnRQYXJhbWV0ZXJzOmZ1bmN0aW9uKGUpe3N3aXRjaChlKXtjYXNlInJlc3RhcnQiOmNhc2UidmFsaWRhdGUiOmNhc2Uic2lnbiI6Y2FzZSJidWlsZCI6Y2FzZSJhZnRlclZhbGlkYXRlIjpjYXNlImFmdGVyQnVpbGQiOnJldHVyblt0aGlzXTtjYXNlImVycm9yIjpyZXR1cm5bdGhpcy5yZXNwb25zZS5lcnJvcix0aGlzLnJlc3BvbnNlXTtkZWZhdWx0OnJldHVyblt0aGlzLnJlc3BvbnNlXX19LHByZXNpZ246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8ImZ1bmN0aW9uIiE9dHlwZW9mIGV8fCh0PWUsZT1udWxsKSwobmV3IG4uU2lnbmVycy5QcmVzaWduKS5zaWduKHRoaXMudG9HZXQoKSxlLHQpfSxpc1ByZXNpZ25lZDpmdW5jdGlvbigpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5odHRwUmVxdWVzdC5oZWFkZXJzLCJwcmVzaWduZWQtZXhwaXJlcyIpfSx0b1VuYXV0aGVudGljYXRlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl91bkF1dGhlbnRpY2F0ZWQ9ITAsdGhpcy5yZW1vdmVMaXN0ZW5lcigidmFsaWRhdGUiLG4uRXZlbnRMaXN0ZW5lcnMuQ29yZS5WQUxJREFURV9DUkVERU5USUFMUyksdGhpcy5yZW1vdmVMaXN0ZW5lcigic2lnbiIsbi5FdmVudExpc3RlbmVycy5Db3JlLlNJR04pLHRoaXN9LHRvR2V0OmZ1bmN0aW9uKCl7cmV0dXJuInF1ZXJ5IiE9PXRoaXMuc2VydmljZS5hcGkucHJvdG9jb2wmJiJlYzIiIT09dGhpcy5zZXJ2aWNlLmFwaS5wcm90b2NvbHx8KHRoaXMucmVtb3ZlTGlzdGVuZXIoImJ1aWxkIix0aGlzLmJ1aWxkQXNHZXQpLHRoaXMuYWRkTGlzdGVuZXIoImJ1aWxkIix0aGlzLmJ1aWxkQXNHZXQpKSx0aGlzfSxidWlsZEFzR2V0OmZ1bmN0aW9uKGUpe2UuaHR0cFJlcXVlc3QubWV0aG9kPSJHRVQiLGUuaHR0cFJlcXVlc3QucGF0aD1lLnNlcnZpY2UuZW5kcG9pbnQucGF0aCsiPyIrZS5odHRwUmVxdWVzdC5ib2R5LGUuaHR0cFJlcXVlc3QuYm9keT0iIixkZWxldGUgZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LUxlbmd0aCJdLGRlbGV0ZSBlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdfSxoYWx0SGFuZGxlcnNPbkVycm9yOmZ1bmN0aW9uKCl7dGhpcy5faGFsdEhhbmRsZXJzT25FcnJvcj0hMH19KSxuLlJlcXVlc3QuYWRkUHJvbWlzZXNUb0NsYXNzPWZ1bmN0aW9uKGUpe3RoaXMucHJvdG90eXBlLnByb21pc2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiB0aGlzLmh0dHBSZXF1ZXN0LmFwcGVuZFRvVXNlckFnZW50KCJwcm9taXNlIiksbmV3IGUoKGZ1bmN0aW9uKGUsbil7dC5vbigiY29tcGxldGUiLChmdW5jdGlvbih0KXt0LmVycm9yP24odC5lcnJvcik6ZShPYmplY3QuZGVmaW5lUHJvcGVydHkodC5kYXRhfHx7fSwiJHJlc3BvbnNlIix7dmFsdWU6dH0pKX0pKSx0LnJ1blRvKCl9KSl9fSxuLlJlcXVlc3QuZGVsZXRlUHJvbWlzZXNGcm9tQ2xhc3M9ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5wcm90b3R5cGUucHJvbWlzZX0sbi51dGlsLmFkZFByb21pc2VzKG4uUmVxdWVzdCksbi51dGlsLm1peGluKG4uUmVxdWVzdCxuLlNlcXVlbnRpYWxFeGVjdXRvcil9KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLGUoIl9wcm9jZXNzIikpfSx7Ii4vY29yZSI6MTksIi4vc3RhdGVfbWFjaGluZSI6NzMsX3Byb2Nlc3M6OTIsam1lc3BhdGg6OTF9XSw1OTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vY29yZSIpLG89ci51dGlsLmluaGVyaXQsaT1lKCJqbWVzcGF0aCIpO2Z1bmN0aW9uIHMoZSl7dmFyIHQ9ZS5yZXF1ZXN0Ll93YWl0ZXIsbj10LmNvbmZpZy5hY2NlcHRvcnMscj0hMSxvPSJyZXRyeSI7bi5mb3JFYWNoKChmdW5jdGlvbihuKXtpZighcil7dmFyIGk9dC5tYXRjaGVyc1tuLm1hdGNoZXJdO2kmJmkoZSxuLmV4cGVjdGVkLG4uYXJndW1lbnQpJiYocj0hMCxvPW4uc3RhdGUpfX0pKSwhciYmZS5lcnJvciYmKG89ImZhaWx1cmUiKSwic3VjY2VzcyI9PT1vP3Quc2V0U3VjY2VzcyhlKTp0LnNldEVycm9yKGUsInJldHJ5Ij09PW8pfXIuUmVzb3VyY2VXYWl0ZXI9byh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0KXt0aGlzLnNlcnZpY2U9ZSx0aGlzLnN0YXRlPXQsdGhpcy5sb2FkV2FpdGVyQ29uZmlnKHRoaXMuc3RhdGUpfSxzZXJ2aWNlOm51bGwsc3RhdGU6bnVsbCxjb25maWc6bnVsbCxtYXRjaGVyczp7cGF0aDpmdW5jdGlvbihlLHQsbil7dHJ5e3ZhciByPWkuc2VhcmNoKGUuZGF0YSxuKX1jYXRjaChlKXtyZXR1cm4hMX1yZXR1cm4gaS5zdHJpY3REZWVwRXF1YWwocix0KX0scGF0aEFsbDpmdW5jdGlvbihlLHQsbil7dHJ5e3ZhciByPWkuc2VhcmNoKGUuZGF0YSxuKX1jYXRjaChlKXtyZXR1cm4hMX1BcnJheS5pc0FycmF5KHIpfHwocj1bcl0pO3ZhciBvPXIubGVuZ3RoO2lmKCFvKXJldHVybiExO2Zvcih2YXIgcz0wO3M8bztzKyspaWYoIWkuc3RyaWN0RGVlcEVxdWFsKHJbc10sdCkpcmV0dXJuITE7cmV0dXJuITB9LHBhdGhBbnk6ZnVuY3Rpb24oZSx0LG4pe3RyeXt2YXIgcj1pLnNlYXJjaChlLmRhdGEsbil9Y2F0Y2goZSl7cmV0dXJuITF9QXJyYXkuaXNBcnJheShyKXx8KHI9W3JdKTtmb3IodmFyIG89ci5sZW5ndGgscz0wO3M8bztzKyspaWYoaS5zdHJpY3REZWVwRXF1YWwocltzXSx0KSlyZXR1cm4hMDtyZXR1cm4hMX0sc3RhdHVzOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZTtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIG4mJm49PT10fSxlcnJvcjpmdW5jdGlvbihlLHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmZS5lcnJvcj90PT09ZS5lcnJvci5jb2RlOnQ9PT0hIWUuZXJyb3J9fSxsaXN0ZW5lcnM6KG5ldyByLlNlcXVlbnRpYWxFeGVjdXRvcikuYWRkTmFtZWRMaXN0ZW5lcnMoKGZ1bmN0aW9uKGUpe2UoIlJFVFJZX0NIRUNLIiwicmV0cnkiLChmdW5jdGlvbihlKXt2YXIgdD1lLnJlcXVlc3QuX3dhaXRlcjtlLmVycm9yJiYiUmVzb3VyY2VOb3RSZWFkeSI9PT1lLmVycm9yLmNvZGUmJihlLmVycm9yLnJldHJ5RGVsYXk9MWUzKih0LmNvbmZpZy5kZWxheXx8MCkpfSkpLGUoIkNIRUNLX09VVFBVVCIsImV4dHJhY3REYXRhIixzKSxlKCJDSEVDS19FUlJPUiIsImV4dHJhY3RFcnJvciIscyl9KSksd2FpdDpmdW5jdGlvbihlLHQpeyJmdW5jdGlvbiI9PXR5cGVvZiBlJiYodD1lLGU9dm9pZCAwKSxlJiZlLiR3YWl0ZXImJigibnVtYmVyIj09dHlwZW9mKGU9ci51dGlsLmNvcHkoZSkpLiR3YWl0ZXIuZGVsYXkmJih0aGlzLmNvbmZpZy5kZWxheT1lLiR3YWl0ZXIuZGVsYXkpLCJudW1iZXIiPT10eXBlb2YgZS4kd2FpdGVyLm1heEF0dGVtcHRzJiYodGhpcy5jb25maWcubWF4QXR0ZW1wdHM9ZS4kd2FpdGVyLm1heEF0dGVtcHRzKSxkZWxldGUgZS4kd2FpdGVyKTt2YXIgbj10aGlzLnNlcnZpY2UubWFrZVJlcXVlc3QodGhpcy5jb25maWcub3BlcmF0aW9uLGUpO3JldHVybiBuLl93YWl0ZXI9dGhpcyxuLnJlc3BvbnNlLm1heFJldHJpZXM9dGhpcy5jb25maWcubWF4QXR0ZW1wdHMsbi5hZGRMaXN0ZW5lcnModGhpcy5saXN0ZW5lcnMpLHQmJm4uc2VuZCh0KSxufSxzZXRTdWNjZXNzOmZ1bmN0aW9uKGUpe2UuZXJyb3I9bnVsbCxlLmRhdGE9ZS5kYXRhfHx7fSxlLnJlcXVlc3QucmVtb3ZlQWxsTGlzdGVuZXJzKCJleHRyYWN0RGF0YSIpfSxzZXRFcnJvcjpmdW5jdGlvbihlLHQpe2UuZGF0YT1udWxsLGUuZXJyb3I9ci51dGlsLmVycm9yKGUuZXJyb3J8fG5ldyBFcnJvcix7Y29kZToiUmVzb3VyY2VOb3RSZWFkeSIsbWVzc2FnZToiUmVzb3VyY2UgaXMgbm90IGluIHRoZSBzdGF0ZSAiK3RoaXMuc3RhdGUscmV0cnlhYmxlOnR9KX0sbG9hZFdhaXRlckNvbmZpZzpmdW5jdGlvbihlKXtpZighdGhpcy5zZXJ2aWNlLmFwaS53YWl0ZXJzW2VdKXRocm93IG5ldyByLnV0aWwuZXJyb3IobmV3IEVycm9yLHtjb2RlOiJTdGF0ZU5vdEZvdW5kRXJyb3IiLG1lc3NhZ2U6IlN0YXRlICIrZSsiIG5vdCBmb3VuZC4ifSk7dGhpcy5jb25maWc9ci51dGlsLmNvcHkodGhpcy5zZXJ2aWNlLmFwaS53YWl0ZXJzW2VdKX19KX0seyIuL2NvcmUiOjE5LGptZXNwYXRoOjkxfV0sNjA6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2NvcmUiKSxvPXIudXRpbC5pbmhlcml0LGk9ZSgiam1lc3BhdGgiKTtyLlJlc3BvbnNlPW8oe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe3RoaXMucmVxdWVzdD1lLHRoaXMuZGF0YT1udWxsLHRoaXMuZXJyb3I9bnVsbCx0aGlzLnJldHJ5Q291bnQ9MCx0aGlzLnJlZGlyZWN0Q291bnQ9MCx0aGlzLmh0dHBSZXNwb25zZT1uZXcgci5IdHRwUmVzcG9uc2UsZSYmKHRoaXMubWF4UmV0cmllcz1lLnNlcnZpY2UubnVtUmV0cmllcygpLHRoaXMubWF4UmVkaXJlY3RzPWUuc2VydmljZS5jb25maWcubWF4UmVkaXJlY3RzKX0sbmV4dFBhZ2U6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLnJlcXVlc3Quc2VydmljZSxvPXRoaXMucmVxdWVzdC5vcGVyYXRpb247dHJ5e3Q9bi5wYWdpbmF0aW9uQ29uZmlnKG8sITApfWNhdGNoKGUpe3RoaXMuZXJyb3I9ZX1pZighdGhpcy5oYXNOZXh0UGFnZSgpKXtpZihlKWUodGhpcy5lcnJvcixudWxsKTtlbHNlIGlmKHRoaXMuZXJyb3IpdGhyb3cgdGhpcy5lcnJvcjtyZXR1cm4gbnVsbH12YXIgaT1yLnV0aWwuY29weSh0aGlzLnJlcXVlc3QucGFyYW1zKTtpZih0aGlzLm5leHRQYWdlVG9rZW5zKXt2YXIgcz10LmlucHV0VG9rZW47InN0cmluZyI9PXR5cGVvZiBzJiYocz1bc10pO2Zvcih2YXIgYT0wO2E8cy5sZW5ndGg7YSsrKWlbc1thXV09dGhpcy5uZXh0UGFnZVRva2Vuc1thXTtyZXR1cm4gbi5tYWtlUmVxdWVzdCh0aGlzLnJlcXVlc3Qub3BlcmF0aW9uLGksZSl9cmV0dXJuIGU/ZShudWxsLG51bGwpOm51bGx9LGhhc05leHRQYWdlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FjaGVOZXh0UGFnZVRva2VucygpLCEhdGhpcy5uZXh0UGFnZVRva2Vuc3x8dm9pZCAwPT09dGhpcy5uZXh0UGFnZVRva2VucyYmdm9pZCAwfSxjYWNoZU5leHRQYWdlVG9rZW5zOmZ1bmN0aW9uKCl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsIm5leHRQYWdlVG9rZW5zIikpcmV0dXJuIHRoaXMubmV4dFBhZ2VUb2tlbnM7dGhpcy5uZXh0UGFnZVRva2Vucz12b2lkIDA7dmFyIGU9dGhpcy5yZXF1ZXN0LnNlcnZpY2UucGFnaW5hdGlvbkNvbmZpZyh0aGlzLnJlcXVlc3Qub3BlcmF0aW9uKTtpZighZSlyZXR1cm4gdGhpcy5uZXh0UGFnZVRva2VucztpZih0aGlzLm5leHRQYWdlVG9rZW5zPW51bGwsZS5tb3JlUmVzdWx0cyYmIWkuc2VhcmNoKHRoaXMuZGF0YSxlLm1vcmVSZXN1bHRzKSlyZXR1cm4gdGhpcy5uZXh0UGFnZVRva2Vuczt2YXIgdD1lLm91dHB1dFRva2VuO3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmKHQ9W3RdKSxyLnV0aWwuYXJyYXlFYWNoLmNhbGwodGhpcyx0LChmdW5jdGlvbihlKXt2YXIgdD1pLnNlYXJjaCh0aGlzLmRhdGEsZSk7dCYmKHRoaXMubmV4dFBhZ2VUb2tlbnM9dGhpcy5uZXh0UGFnZVRva2Vuc3x8W10sdGhpcy5uZXh0UGFnZVRva2Vucy5wdXNoKHQpKX0pKSx0aGlzLm5leHRQYWdlVG9rZW5zfX0pfSx7Ii4vY29yZSI6MTksam1lc3BhdGg6OTF9XSw2MTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vY29yZSIpO3IuU2VxdWVudGlhbEV4ZWN1dG9yPXIudXRpbC5pbmhlcml0KHtjb25zdHJ1Y3RvcjpmdW5jdGlvbigpe3RoaXMuX2V2ZW50cz17fX0sbGlzdGVuZXJzOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9ldmVudHNbZV0/dGhpcy5fZXZlbnRzW2VdLnNsaWNlKDApOltdfSxvbjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuX2V2ZW50c1tlXT9uP3RoaXMuX2V2ZW50c1tlXS51bnNoaWZ0KHQpOnRoaXMuX2V2ZW50c1tlXS5wdXNoKHQpOnRoaXMuX2V2ZW50c1tlXT1bdF0sdGhpc30sb25Bc3luYzpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHQuX2lzQXN5bmM9ITAsdGhpcy5vbihlLHQsbil9LHJlbW92ZUxpc3RlbmVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5fZXZlbnRzW2VdO2lmKG4pe2Zvcih2YXIgcj1uLmxlbmd0aCxvPS0xLGk9MDtpPHI7KytpKW5baV09PT10JiYobz1pKTtvPi0xJiZuLnNwbGljZShvLDEpfXJldHVybiB0aGlzfSxyZW1vdmVBbGxMaXN0ZW5lcnM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/ZGVsZXRlIHRoaXMuX2V2ZW50c1tlXTp0aGlzLl9ldmVudHM9e30sdGhpc30sZW1pdDpmdW5jdGlvbihlLHQsbil7bnx8KG49ZnVuY3Rpb24oKXt9KTt2YXIgcj10aGlzLmxpc3RlbmVycyhlKSxvPXIubGVuZ3RoO3JldHVybiB0aGlzLmNhbGxMaXN0ZW5lcnMocix0LG4pLG8+MH0sY2FsbExpc3RlbmVyczpmdW5jdGlvbihlLHQsbixvKXt2YXIgaT10aGlzLHM9b3x8bnVsbDtmdW5jdGlvbiBhKG8pe2lmKG8mJihzPXIudXRpbC5lcnJvcihzfHxuZXcgRXJyb3IsbyksaS5faGFsdEhhbmRsZXJzT25FcnJvcikpcmV0dXJuIG4uY2FsbChpLHMpO2kuY2FsbExpc3RlbmVycyhlLHQsbixzKX1mb3IoO2UubGVuZ3RoPjA7KXt2YXIgYz1lLnNoaWZ0KCk7aWYoYy5faXNBc3luYylyZXR1cm4gdm9pZCBjLmFwcGx5KGksdC5jb25jYXQoW2FdKSk7dHJ5e2MuYXBwbHkoaSx0KX1jYXRjaChlKXtzPXIudXRpbC5lcnJvcihzfHxuZXcgRXJyb3IsZSl9aWYocyYmaS5faGFsdEhhbmRsZXJzT25FcnJvcilyZXR1cm4gdm9pZCBuLmNhbGwoaSxzKX1uLmNhbGwoaSxzKX0sYWRkTGlzdGVuZXJzOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIGUuX2V2ZW50cyYmKGU9ZS5fZXZlbnRzKSxyLnV0aWwuZWFjaChlLChmdW5jdGlvbihlLG4peyJmdW5jdGlvbiI9PXR5cGVvZiBuJiYobj1bbl0pLHIudXRpbC5hcnJheUVhY2gobiwoZnVuY3Rpb24obil7dC5vbihlLG4pfSkpfSkpLHR9LGFkZE5hbWVkTGlzdGVuZXI6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXNbZV09bix0aGlzLmFkZExpc3RlbmVyKHQsbixyKSx0aGlzfSxhZGROYW1lZEFzeW5jTGlzdGVuZXI6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIG4uX2lzQXN5bmM9ITAsdGhpcy5hZGROYW1lZExpc3RlbmVyKGUsdCxuLHIpfSxhZGROYW1lZExpc3RlbmVyczpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3JldHVybiBlKChmdW5jdGlvbigpe3QuYWRkTmFtZWRMaXN0ZW5lci5hcHBseSh0LGFyZ3VtZW50cyl9KSwoZnVuY3Rpb24oKXt0LmFkZE5hbWVkQXN5bmNMaXN0ZW5lci5hcHBseSh0LGFyZ3VtZW50cyl9KSksdGhpc319KSxyLlNlcXVlbnRpYWxFeGVjdXRvci5wcm90b3R5cGUuYWRkTGlzdGVuZXI9ci5TZXF1ZW50aWFsRXhlY3V0b3IucHJvdG90eXBlLm9uLHQuZXhwb3J0cz1yLlNlcXVlbnRpYWxFeGVjdXRvcn0seyIuL2NvcmUiOjE5fV0sNjI6W2Z1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24obil7KGZ1bmN0aW9uKCl7dmFyIHI9ZSgiLi9jb3JlIiksbz1lKCIuL21vZGVsL2FwaSIpLGk9ZSgiLi9yZWdpb25fY29uZmlnIikscz1yLnV0aWwuaW5oZXJpdCxhPTAsYz1lKCIuL3JlZ2lvbi91dGlscyIpO3IuU2VydmljZT1zKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXtpZighdGhpcy5sb2FkU2VydmljZUNsYXNzKXRocm93IHIudXRpbC5lcnJvcihuZXcgRXJyb3IsIlNlcnZpY2UgbXVzdCBiZSBjb25zdHJ1Y3RlZCB3aXRoIGBuZXcnIG9wZXJhdG9yIik7aWYoZSl7aWYoZS5yZWdpb24pe3ZhciB0PWUucmVnaW9uO2MuaXNGaXBzUmVnaW9uKHQpJiYoZS5yZWdpb249Yy5nZXRSZWFsUmVnaW9uKHQpLGUudXNlRmlwc0VuZHBvaW50PSEwKSxjLmlzR2xvYmFsUmVnaW9uKHQpJiYoZS5yZWdpb249Yy5nZXRSZWFsUmVnaW9uKHQpKX0iYm9vbGVhbiI9PXR5cGVvZiBlLnVzZUR1YWxzdGFjayYmImJvb2xlYW4iIT10eXBlb2YgZS51c2VEdWFsc3RhY2tFbmRwb2ludCYmKGUudXNlRHVhbHN0YWNrRW5kcG9pbnQ9ZS51c2VEdWFsc3RhY2spfXZhciBuPXRoaXMubG9hZFNlcnZpY2VDbGFzcyhlfHx7fSk7aWYobil7dmFyIG89ci51dGlsLmNvcHkoZSksaT1uZXcgbihlKTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGksIl9vcmlnaW5hbENvbmZpZyIse2dldDpmdW5jdGlvbigpe3JldHVybiBvfSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLGkuX2NsaWVudElkPSsrYSxpfXRoaXMuaW5pdGlhbGl6ZShlKX0saW5pdGlhbGl6ZTpmdW5jdGlvbihlKXt2YXIgdD1yLmNvbmZpZ1t0aGlzLnNlcnZpY2VJZGVudGlmaWVyXTtpZih0aGlzLmNvbmZpZz1uZXcgci5Db25maWcoci5jb25maWcpLHQmJnRoaXMuY29uZmlnLnVwZGF0ZSh0LCEwKSxlJiZ0aGlzLmNvbmZpZy51cGRhdGUoZSwhMCksdGhpcy52YWxpZGF0ZVNlcnZpY2UoKSx0aGlzLmNvbmZpZy5lbmRwb2ludHx8aS5jb25maWd1cmVFbmRwb2ludCh0aGlzKSx0aGlzLmNvbmZpZy5lbmRwb2ludD10aGlzLmVuZHBvaW50RnJvbVRlbXBsYXRlKHRoaXMuY29uZmlnLmVuZHBvaW50KSx0aGlzLnNldEVuZHBvaW50KHRoaXMuY29uZmlnLmVuZHBvaW50KSxyLlNlcXVlbnRpYWxFeGVjdXRvci5jYWxsKHRoaXMpLHIuU2VydmljZS5hZGREZWZhdWx0TW9uaXRvcmluZ0xpc3RlbmVycyh0aGlzKSwodGhpcy5jb25maWcuY2xpZW50U2lkZU1vbml0b3Jpbmd8fHIuU2VydmljZS5fY2xpZW50U2lkZU1vbml0b3JpbmcpJiZ0aGlzLnB1Ymxpc2hlcil7dmFyIG89dGhpcy5wdWJsaXNoZXI7dGhpcy5hZGROYW1lZExpc3RlbmVyKCJQVUJMSVNIX0FQSV9DQUxMIiwiYXBpQ2FsbCIsKGZ1bmN0aW9uKGUpe24ubmV4dFRpY2soKGZ1bmN0aW9uKCl7by5ldmVudEhhbmRsZXIoZSl9KSl9KSksdGhpcy5hZGROYW1lZExpc3RlbmVyKCJQVUJMSVNIX0FQSV9BVFRFTVBUIiwiYXBpQ2FsbEF0dGVtcHQiLChmdW5jdGlvbihlKXtuLm5leHRUaWNrKChmdW5jdGlvbigpe28uZXZlbnRIYW5kbGVyKGUpfSkpfSkpfX0sdmFsaWRhdGVTZXJ2aWNlOmZ1bmN0aW9uKCl7fSxsb2FkU2VydmljZUNsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0PWU7aWYoci51dGlsLmlzRW1wdHkodGhpcy5hcGkpKXtpZih0LmFwaUNvbmZpZylyZXR1cm4gci5TZXJ2aWNlLmRlZmluZVNlcnZpY2VBcGkodGhpcy5jb25zdHJ1Y3Rvcix0LmFwaUNvbmZpZyk7aWYodGhpcy5jb25zdHJ1Y3Rvci5zZXJ2aWNlcyl7KHQ9bmV3IHIuQ29uZmlnKHIuY29uZmlnKSkudXBkYXRlKGUsITApO3ZhciBuPXQuYXBpVmVyc2lvbnNbdGhpcy5jb25zdHJ1Y3Rvci5zZXJ2aWNlSWRlbnRpZmllcl07cmV0dXJuIG49bnx8dC5hcGlWZXJzaW9uLHRoaXMuZ2V0TGF0ZXN0U2VydmljZUNsYXNzKG4pfXJldHVybiBudWxsfXJldHVybiBudWxsfSxnZXRMYXRlc3RTZXJ2aWNlQ2xhc3M6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dGhpcy5nZXRMYXRlc3RTZXJ2aWNlVmVyc2lvbihlKSxudWxsPT09dGhpcy5jb25zdHJ1Y3Rvci5zZXJ2aWNlc1tlXSYmci5TZXJ2aWNlLmRlZmluZVNlcnZpY2VBcGkodGhpcy5jb25zdHJ1Y3RvcixlKSx0aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VzW2VdfSxnZXRMYXRlc3RTZXJ2aWNlVmVyc2lvbjpmdW5jdGlvbihlKXtpZighdGhpcy5jb25zdHJ1Y3Rvci5zZXJ2aWNlc3x8MD09PXRoaXMuY29uc3RydWN0b3Iuc2VydmljZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiTm8gc2VydmljZXMgZGVmaW5lZCBvbiAiK3RoaXMuY29uc3RydWN0b3Iuc2VydmljZUlkZW50aWZpZXIpO2lmKGU/ci51dGlsLmlzVHlwZShlLERhdGUpJiYoZT1yLnV0aWwuZGF0ZS5pc284NjAxKGUpLnNwbGl0KCJUIilbMF0pOmU9ImxhdGVzdCIsT2JqZWN0Lmhhc093blByb3BlcnR5KHRoaXMuY29uc3RydWN0b3Iuc2VydmljZXMsZSkpcmV0dXJuIGU7Zm9yKHZhciB0PU9iamVjdC5rZXlzKHRoaXMuY29uc3RydWN0b3Iuc2VydmljZXMpLnNvcnQoKSxuPW51bGwsbz10Lmxlbmd0aC0xO28+PTA7by0tKWlmKCIqIiE9PXRbb11bdFtvXS5sZW5ndGgtMV0mJihuPXRbb10pLHRbb10uc3Vic3RyKDAsMTApPD1lKXJldHVybiBuO3Rocm93IG5ldyBFcnJvcigiQ291bGQgbm90IGZpbmQgIit0aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VJZGVudGlmaWVyKyIgQVBJIHRvIHNhdGlzZnkgdmVyc2lvbiBjb25zdHJhaW50IGAiK2UrIiciKX0sYXBpOnt9LGRlZmF1bHRSZXRyeUNvdW50OjMsY3VzdG9taXplUmVxdWVzdHM6ZnVuY3Rpb24oZSl7aWYoZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNhbGxiYWNrIHR5cGUgJyIrdHlwZW9mIGUrIicgcHJvdmlkZWQgaW4gY3VzdG9taXplUmVxdWVzdHMiKTt0aGlzLmN1c3RvbVJlcXVlc3RIYW5kbGVyPWV9ZWxzZSB0aGlzLmN1c3RvbVJlcXVlc3RIYW5kbGVyPW51bGx9LG1ha2VSZXF1ZXN0OmZ1bmN0aW9uKGUsdCxuKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCYmKG49dCx0PW51bGwpLHQ9dHx8e30sdGhpcy5jb25maWcucGFyYW1zKXt2YXIgbz10aGlzLmFwaS5vcGVyYXRpb25zW2VdO28mJih0PXIudXRpbC5jb3B5KHQpLHIudXRpbC5lYWNoKHRoaXMuY29uZmlnLnBhcmFtcywoZnVuY3Rpb24oZSxuKXtvLmlucHV0Lm1lbWJlcnNbZV0mJih2b2lkIDAhPT10W2VdJiZudWxsIT09dFtlXXx8KHRbZV09bikpfSkpKX12YXIgaT1uZXcgci5SZXF1ZXN0KHRoaXMsZSx0KTtyZXR1cm4gdGhpcy5hZGRBbGxSZXF1ZXN0TGlzdGVuZXJzKGkpLHRoaXMuYXR0YWNoTW9uaXRvcmluZ0VtaXR0ZXIoaSksbiYmaS5zZW5kKG4pLGl9LG1ha2VVbmF1dGhlbnRpY2F0ZWRSZXF1ZXN0OmZ1bmN0aW9uKGUsdCxuKXsiZnVuY3Rpb24iPT10eXBlb2YgdCYmKG49dCx0PXt9KTt2YXIgcj10aGlzLm1ha2VSZXF1ZXN0KGUsdCkudG9VbmF1dGhlbnRpY2F0ZWQoKTtyZXR1cm4gbj9yLnNlbmQobik6cn0sd2FpdEZvcjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIG5ldyByLlJlc291cmNlV2FpdGVyKHRoaXMsZSkud2FpdCh0LG4pfSxhZGRBbGxSZXF1ZXN0TGlzdGVuZXJzOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bci5ldmVudHMsci5FdmVudExpc3RlbmVycy5Db3JlLHRoaXMuc2VydmljZUludGVyZmFjZSgpLHIuRXZlbnRMaXN0ZW5lcnMuQ29yZVBvc3RdLG49MDtuPHQubGVuZ3RoO24rKyl0W25dJiZlLmFkZExpc3RlbmVycyh0W25dKTt0aGlzLmNvbmZpZy5wYXJhbVZhbGlkYXRpb258fGUucmVtb3ZlTGlzdGVuZXIoInZhbGlkYXRlIixyLkV2ZW50TGlzdGVuZXJzLkNvcmUuVkFMSURBVEVfUEFSQU1FVEVSUyksdGhpcy5jb25maWcubG9nZ2VyJiZlLmFkZExpc3RlbmVycyhyLkV2ZW50TGlzdGVuZXJzLkxvZ2dlciksdGhpcy5zZXR1cFJlcXVlc3RMaXN0ZW5lcnMoZSksImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmN1c3RvbVJlcXVlc3RIYW5kbGVyJiZ0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jdXN0b21SZXF1ZXN0SGFuZGxlcihlKSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcywiY3VzdG9tUmVxdWVzdEhhbmRsZXIiKSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuY3VzdG9tUmVxdWVzdEhhbmRsZXImJnRoaXMuY3VzdG9tUmVxdWVzdEhhbmRsZXIoZSl9LGFwaUNhbGxFdmVudDpmdW5jdGlvbihlKXt2YXIgdD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLG49e1R5cGU6IkFwaUNhbGwiLEFwaTp0P3QubmFtZTplLm9wZXJhdGlvbixWZXJzaW9uOjEsU2VydmljZTplLnNlcnZpY2UuYXBpLnNlcnZpY2VJZHx8ZS5zZXJ2aWNlLmFwaS5lbmRwb2ludFByZWZpeCxSZWdpb246ZS5odHRwUmVxdWVzdC5yZWdpb24sTWF4UmV0cmllc0V4Y2VlZGVkOjAsVXNlckFnZW50OmUuaHR0cFJlcXVlc3QuZ2V0VXNlckFnZW50KCl9LHI9ZS5yZXNwb25zZTtpZihyLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlJiYobi5GaW5hbEh0dHBTdGF0dXNDb2RlPXIuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUpLHIuZXJyb3Ipe3ZhciBvPXIuZXJyb3I7ci5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZT4yOTk/KG8uY29kZSYmKG4uRmluYWxBd3NFeGNlcHRpb249by5jb2RlKSxvLm1lc3NhZ2UmJihuLkZpbmFsQXdzRXhjZXB0aW9uTWVzc2FnZT1vLm1lc3NhZ2UpKTooKG8uY29kZXx8by5uYW1lKSYmKG4uRmluYWxTZGtFeGNlcHRpb249by5jb2RlfHxvLm5hbWUpLG8ubWVzc2FnZSYmKG4uRmluYWxTZGtFeGNlcHRpb25NZXNzYWdlPW8ubWVzc2FnZSkpfXJldHVybiBufSxhcGlBdHRlbXB0RXZlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXSxuPXtUeXBlOiJBcGlDYWxsQXR0ZW1wdCIsQXBpOnQ/dC5uYW1lOmUub3BlcmF0aW9uLFZlcnNpb246MSxTZXJ2aWNlOmUuc2VydmljZS5hcGkuc2VydmljZUlkfHxlLnNlcnZpY2UuYXBpLmVuZHBvaW50UHJlZml4LEZxZG46ZS5odHRwUmVxdWVzdC5lbmRwb2ludC5ob3N0bmFtZSxVc2VyQWdlbnQ6ZS5odHRwUmVxdWVzdC5nZXRVc2VyQWdlbnQoKX0scj1lLnJlc3BvbnNlO3JldHVybiByLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlJiYobi5IdHRwU3RhdHVzQ29kZT1yLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlKSwhZS5fdW5BdXRoZW50aWNhdGVkJiZlLnNlcnZpY2UuY29uZmlnLmNyZWRlbnRpYWxzJiZlLnNlcnZpY2UuY29uZmlnLmNyZWRlbnRpYWxzLmFjY2Vzc0tleUlkJiYobi5BY2Nlc3NLZXk9ZS5zZXJ2aWNlLmNvbmZpZy5jcmVkZW50aWFscy5hY2Nlc3NLZXlJZCksci5odHRwUmVzcG9uc2UuaGVhZGVycz8oZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJ4LWFtei1zZWN1cml0eS10b2tlbiJdJiYobi5TZXNzaW9uVG9rZW49ZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJ4LWFtei1zZWN1cml0eS10b2tlbiJdKSxyLmh0dHBSZXNwb25zZS5oZWFkZXJzWyJ4LWFtem4tcmVxdWVzdGlkIl0mJihuLlhBbXpuUmVxdWVzdElkPXIuaHR0cFJlc3BvbnNlLmhlYWRlcnNbIngtYW16bi1yZXF1ZXN0aWQiXSksci5odHRwUmVzcG9uc2UuaGVhZGVyc1sieC1hbXotcmVxdWVzdC1pZCJdJiYobi5YQW16UmVxdWVzdElkPXIuaHR0cFJlc3BvbnNlLmhlYWRlcnNbIngtYW16LXJlcXVlc3QtaWQiXSksci5odHRwUmVzcG9uc2UuaGVhZGVyc1sieC1hbXotaWQtMiJdJiYobi5YQW16SWQyPXIuaHR0cFJlc3BvbnNlLmhlYWRlcnNbIngtYW16LWlkLTIiXSksbik6bn0sYXR0ZW1wdEZhaWxFdmVudDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmFwaUF0dGVtcHRFdmVudChlKSxuPWUucmVzcG9uc2Uscj1uLmVycm9yO3JldHVybiBuLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlPjI5OT8oci5jb2RlJiYodC5Bd3NFeGNlcHRpb249ci5jb2RlKSxyLm1lc3NhZ2UmJih0LkF3c0V4Y2VwdGlvbk1lc3NhZ2U9ci5tZXNzYWdlKSk6KChyLmNvZGV8fHIubmFtZSkmJih0LlNka0V4Y2VwdGlvbj1yLmNvZGV8fHIubmFtZSksci5tZXNzYWdlJiYodC5TZGtFeGNlcHRpb25NZXNzYWdlPXIubWVzc2FnZSkpLHR9LGF0dGFjaE1vbml0b3JpbmdFbWl0dGVyOmZ1bmN0aW9uKGUpe3ZhciB0LG4sbyxpLHMsYSxjPTAsdT10aGlzO2Uub24oInZhbGlkYXRlIiwoZnVuY3Rpb24oKXtpPXIudXRpbC5yZWFsQ2xvY2subm93KCksYT1EYXRlLm5vdygpfSksITApLGUub24oInNpZ24iLChmdW5jdGlvbigpe249ci51dGlsLnJlYWxDbG9jay5ub3coKSx0PURhdGUubm93KCkscz1lLmh0dHBSZXF1ZXN0LnJlZ2lvbixjKyt9KSwhMCksZS5vbigidmFsaWRhdGVSZXNwb25zZSIsKGZ1bmN0aW9uKCl7bz1NYXRoLnJvdW5kKHIudXRpbC5yZWFsQ2xvY2subm93KCktbil9KSksZS5hZGROYW1lZExpc3RlbmVyKCJBUElfQ0FMTF9BVFRFTVBUIiwic3VjY2VzcyIsKGZ1bmN0aW9uKCl7dmFyIG49dS5hcGlBdHRlbXB0RXZlbnQoZSk7bi5UaW1lc3RhbXA9dCxuLkF0dGVtcHRMYXRlbmN5PW8+PTA/bzowLG4uUmVnaW9uPXMsdS5lbWl0KCJhcGlDYWxsQXR0ZW1wdCIsW25dKX0pKSxlLmFkZE5hbWVkTGlzdGVuZXIoIkFQSV9DQUxMX0FUVEVNUFRfUkVUUlkiLCJyZXRyeSIsKGZ1bmN0aW9uKCl7dmFyIGk9dS5hdHRlbXB0RmFpbEV2ZW50KGUpO2kuVGltZXN0YW1wPXQsbz1vfHxNYXRoLnJvdW5kKHIudXRpbC5yZWFsQ2xvY2subm93KCktbiksaS5BdHRlbXB0TGF0ZW5jeT1vPj0wP286MCxpLlJlZ2lvbj1zLHUuZW1pdCgiYXBpQ2FsbEF0dGVtcHQiLFtpXSl9KSksZS5hZGROYW1lZExpc3RlbmVyKCJBUElfQ0FMTCIsImNvbXBsZXRlIiwoZnVuY3Rpb24oKXt2YXIgdD11LmFwaUNhbGxFdmVudChlKTtpZih0LkF0dGVtcHRDb3VudD1jLCEodC5BdHRlbXB0Q291bnQ8PTApKXt0LlRpbWVzdGFtcD1hO3ZhciBuPU1hdGgucm91bmQoci51dGlsLnJlYWxDbG9jay5ub3coKS1pKTt0LkxhdGVuY3k9bj49MD9uOjA7dmFyIG89ZS5yZXNwb25zZTtvLmVycm9yJiZvLmVycm9yLnJldHJ5YWJsZSYmIm51bWJlciI9PXR5cGVvZiBvLnJldHJ5Q291bnQmJiJudW1iZXIiPT10eXBlb2Ygby5tYXhSZXRyaWVzJiZvLnJldHJ5Q291bnQ+PW8ubWF4UmV0cmllcyYmKHQuTWF4UmV0cmllc0V4Y2VlZGVkPTEpLHUuZW1pdCgiYXBpQ2FsbCIsW3RdKX19KSl9LHNldHVwUmVxdWVzdExpc3RlbmVyczpmdW5jdGlvbihlKXt9LGdldFNpZ25pbmdOYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBpLnNpZ25pbmdOYW1lfHx0aGlzLmFwaS5lbmRwb2ludFByZWZpeH0sZ2V0U2lnbmVyQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQsbj1udWxsLG89IiI7cmV0dXJuIGUmJihvPShuPShlLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnN8fHt9KVtlLm9wZXJhdGlvbl18fG51bGwpP24uYXV0aHR5cGU6IiIpLHQ9dGhpcy5jb25maWcuc2lnbmF0dXJlVmVyc2lvbj90aGlzLmNvbmZpZy5zaWduYXR1cmVWZXJzaW9uOiJ2NCI9PT1vfHwidjQtdW5zaWduZWQtYm9keSI9PT1vPyJ2NCI6ImJlYXJlciI9PT1vPyJiZWFyZXIiOnRoaXMuYXBpLnNpZ25hdHVyZVZlcnNpb24sci5TaWduZXJzLlJlcXVlc3RTaWduZXIuZ2V0VmVyc2lvbih0KX0sc2VydmljZUludGVyZmFjZTpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLmFwaS5wcm90b2NvbCl7Y2FzZSJlYzIiOmNhc2UicXVlcnkiOnJldHVybiByLkV2ZW50TGlzdGVuZXJzLlF1ZXJ5O2Nhc2UianNvbiI6cmV0dXJuIHIuRXZlbnRMaXN0ZW5lcnMuSnNvbjtjYXNlInJlc3QtanNvbiI6cmV0dXJuIHIuRXZlbnRMaXN0ZW5lcnMuUmVzdEpzb247Y2FzZSJyZXN0LXhtbCI6cmV0dXJuIHIuRXZlbnRMaXN0ZW5lcnMuUmVzdFhtbH1pZih0aGlzLmFwaS5wcm90b2NvbCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc2VydmljZSBgcHJvdG9jb2wnICIrdGhpcy5hcGkucHJvdG9jb2wrIiBpbiBBUEkgY29uZmlnIil9LHN1Y2Nlc3NmdWxSZXNwb25zZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZTwzMDB9LG51bVJldHJpZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5jb25maWcubWF4UmV0cmllcz90aGlzLmNvbmZpZy5tYXhSZXRyaWVzOnRoaXMuZGVmYXVsdFJldHJ5Q291bnR9LHJldHJ5RGVsYXlzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIudXRpbC5jYWxjdWxhdGVSZXRyeURlbGF5KGUsdGhpcy5jb25maWcucmV0cnlEZWxheU9wdGlvbnMsdCl9LHJldHJ5YWJsZUVycm9yOmZ1bmN0aW9uKGUpe3JldHVybiEhdGhpcy50aW1lb3V0RXJyb3IoZSl8fCEhdGhpcy5uZXR3b3JraW5nRXJyb3IoZSl8fCEhdGhpcy5leHBpcmVkQ3JlZGVudGlhbHNFcnJvcihlKXx8ISF0aGlzLnRocm90dGxlZEVycm9yKGUpfHxlLnN0YXR1c0NvZGU+PTUwMH0sbmV0d29ya2luZ0Vycm9yOmZ1bmN0aW9uKGUpe3JldHVybiJOZXR3b3JraW5nRXJyb3IiPT09ZS5jb2RlfSx0aW1lb3V0RXJyb3I6ZnVuY3Rpb24oZSl7cmV0dXJuIlRpbWVvdXRFcnJvciI9PT1lLmNvZGV9LGV4cGlyZWRDcmVkZW50aWFsc0Vycm9yOmZ1bmN0aW9uKGUpe3JldHVybiJFeHBpcmVkVG9rZW5FeGNlcHRpb24iPT09ZS5jb2RlfSxjbG9ja1NrZXdFcnJvcjpmdW5jdGlvbihlKXtzd2l0Y2goZS5jb2RlKXtjYXNlIlJlcXVlc3RUaW1lVG9vU2tld2VkIjpjYXNlIlJlcXVlc3RFeHBpcmVkIjpjYXNlIkludmFsaWRTaWduYXR1cmVFeGNlcHRpb24iOmNhc2UiU2lnbmF0dXJlRG9lc05vdE1hdGNoIjpjYXNlIkF1dGhGYWlsdXJlIjpjYXNlIlJlcXVlc3RJblRoZUZ1dHVyZSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19LGdldFNrZXdDb3JyZWN0ZWREYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBEYXRlKERhdGUubm93KCkrdGhpcy5jb25maWcuc3lzdGVtQ2xvY2tPZmZzZXQpfSxhcHBseUNsb2NrT2Zmc2V0OmZ1bmN0aW9uKGUpe2UmJih0aGlzLmNvbmZpZy5zeXN0ZW1DbG9ja09mZnNldD1lLURhdGUubm93KCkpfSxpc0Nsb2NrU2tld2VkOmZ1bmN0aW9uKGUpe2lmKGUpcmV0dXJuIE1hdGguYWJzKHRoaXMuZ2V0U2tld0NvcnJlY3RlZERhdGUoKS5nZXRUaW1lKCktZSk+PTNlNX0sdGhyb3R0bGVkRXJyb3I6ZnVuY3Rpb24oZSl7aWYoNDI5PT09ZS5zdGF0dXNDb2RlKXJldHVybiEwO3N3aXRjaChlLmNvZGUpe2Nhc2UiUHJvdmlzaW9uZWRUaHJvdWdocHV0RXhjZWVkZWRFeGNlcHRpb24iOmNhc2UiVGhyb3R0bGluZyI6Y2FzZSJUaHJvdHRsaW5nRXhjZXB0aW9uIjpjYXNlIlJlcXVlc3RMaW1pdEV4Y2VlZGVkIjpjYXNlIlJlcXVlc3RUaHJvdHRsZWQiOmNhc2UiUmVxdWVzdFRocm90dGxlZEV4Y2VwdGlvbiI6Y2FzZSJUb29NYW55UmVxdWVzdHNFeGNlcHRpb24iOmNhc2UiVHJhbnNhY3Rpb25JblByb2dyZXNzRXhjZXB0aW9uIjpjYXNlIkVDMlRocm90dGxlZEV4Y2VwdGlvbiI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19LGVuZHBvaW50RnJvbVRlbXBsYXRlOmZ1bmN0aW9uKGUpe2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gZTt2YXIgdD1lO3JldHVybiB0PSh0PSh0PXQucmVwbGFjZSgvXHtzZXJ2aWNlXH0vZyx0aGlzLmFwaS5lbmRwb2ludFByZWZpeCkpLnJlcGxhY2UoL1x7cmVnaW9uXH0vZyx0aGlzLmNvbmZpZy5yZWdpb24pKS5yZXBsYWNlKC9ce3NjaGVtZVx9L2csdGhpcy5jb25maWcuc3NsRW5hYmxlZD8iaHR0cHMiOiJodHRwIil9LHNldEVuZHBvaW50OmZ1bmN0aW9uKGUpe3RoaXMuZW5kcG9pbnQ9bmV3IHIuRW5kcG9pbnQoZSx0aGlzLmNvbmZpZyl9LHBhZ2luYXRpb25Db25maWc6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmFwaS5vcGVyYXRpb25zW2VdLnBhZ2luYXRvcjtpZighbil7aWYodCl7dmFyIG89bmV3IEVycm9yO3Rocm93IHIudXRpbC5lcnJvcihvLCJObyBwYWdpbmF0aW9uIGNvbmZpZ3VyYXRpb24gZm9yICIrZSl9cmV0dXJuIG51bGx9cmV0dXJuIG59fSksci51dGlsLnVwZGF0ZShyLlNlcnZpY2Use2RlZmluZU1ldGhvZHM6ZnVuY3Rpb24oZSl7ci51dGlsLmVhY2goZS5wcm90b3R5cGUuYXBpLm9wZXJhdGlvbnMsKGZ1bmN0aW9uKHQpe2UucHJvdG90eXBlW3RdfHwoIm5vbmUiPT09ZS5wcm90b3R5cGUuYXBpLm9wZXJhdGlvbnNbdF0uYXV0aHR5cGU/ZS5wcm90b3R5cGVbdF09ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdGhpcy5tYWtlVW5hdXRoZW50aWNhdGVkUmVxdWVzdCh0LGUsbil9OmUucHJvdG90eXBlW3RdPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHRoaXMubWFrZVJlcXVlc3QodCxlLG4pfSl9KSl9LGRlZmluZVNlcnZpY2U6ZnVuY3Rpb24oZSx0LG4pe3IuU2VydmljZS5fc2VydmljZU1hcFtlXT0hMCxBcnJheS5pc0FycmF5KHQpfHwobj10LHQ9W10pO3ZhciBvPXMoci5TZXJ2aWNlLG58fHt9KTtpZigic3RyaW5nIj09dHlwZW9mIGUpe3IuU2VydmljZS5hZGRWZXJzaW9ucyhvLHQpO3ZhciBpPW8uc2VydmljZUlkZW50aWZpZXJ8fGU7by5zZXJ2aWNlSWRlbnRpZmllcj1pfWVsc2Ugby5wcm90b3R5cGUuYXBpPWUsci5TZXJ2aWNlLmRlZmluZU1ldGhvZHMobyk7aWYoci5TZXF1ZW50aWFsRXhlY3V0b3IuY2FsbCh0aGlzLnByb3RvdHlwZSksIXRoaXMucHJvdG90eXBlLnB1Ymxpc2hlciYmci51dGlsLmNsaWVudFNpZGVNb25pdG9yaW5nKXt2YXIgYT1yLnV0aWwuY2xpZW50U2lkZU1vbml0b3JpbmcuUHVibGlzaGVyLGM9KDAsci51dGlsLmNsaWVudFNpZGVNb25pdG9yaW5nLmNvbmZpZ1Byb3ZpZGVyKSgpO3RoaXMucHJvdG90eXBlLnB1Ymxpc2hlcj1uZXcgYShjKSxjLmVuYWJsZWQmJihyLlNlcnZpY2UuX2NsaWVudFNpZGVNb25pdG9yaW5nPSEwKX1yZXR1cm4gci5TZXF1ZW50aWFsRXhlY3V0b3IuY2FsbChvLnByb3RvdHlwZSksci5TZXJ2aWNlLmFkZERlZmF1bHRNb25pdG9yaW5nTGlzdGVuZXJzKG8ucHJvdG90eXBlKSxvfSxhZGRWZXJzaW9uczpmdW5jdGlvbihlLHQpe0FycmF5LmlzQXJyYXkodCl8fCh0PVt0XSksZS5zZXJ2aWNlcz1lLnNlcnZpY2VzfHx7fTtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl2b2lkIDA9PT1lLnNlcnZpY2VzW3Rbbl1dJiYoZS5zZXJ2aWNlc1t0W25dXT1udWxsKTtlLmFwaVZlcnNpb25zPU9iamVjdC5rZXlzKGUuc2VydmljZXMpLnNvcnQoKX0sZGVmaW5lU2VydmljZUFwaTpmdW5jdGlvbihlLHQsbil7dmFyIGk9cyhlLHtzZXJ2aWNlSWRlbnRpZmllcjplLnNlcnZpY2VJZGVudGlmaWVyfSk7ZnVuY3Rpb24gYSh0KXt0LmlzQXBpP2kucHJvdG90eXBlLmFwaT10OmkucHJvdG90eXBlLmFwaT1uZXcgbyh0LHtzZXJ2aWNlSWRlbnRpZmllcjplLnNlcnZpY2VJZGVudGlmaWVyfSl9aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZihuKWEobik7ZWxzZSB0cnl7YShyLmFwaUxvYWRlcihlLnNlcnZpY2VJZGVudGlmaWVyLHQpKX1jYXRjaChuKXt0aHJvdyByLnV0aWwuZXJyb3Iobix7bWVzc2FnZToiQ291bGQgbm90IGZpbmQgQVBJIGNvbmZpZ3VyYXRpb24gIitlLnNlcnZpY2VJZGVudGlmaWVyKyItIit0fSl9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUuc2VydmljZXMsdCl8fChlLmFwaVZlcnNpb25zPWUuYXBpVmVyc2lvbnMuY29uY2F0KHQpLnNvcnQoKSksZS5zZXJ2aWNlc1t0XT1pfWVsc2UgYSh0KTtyZXR1cm4gci5TZXJ2aWNlLmRlZmluZU1ldGhvZHMoaSksaX0saGFzU2VydmljZTpmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIuU2VydmljZS5fc2VydmljZU1hcCxlKX0sYWRkRGVmYXVsdE1vbml0b3JpbmdMaXN0ZW5lcnM6ZnVuY3Rpb24oZSl7ZS5hZGROYW1lZExpc3RlbmVyKCJNT05JVE9SX0VWRU5UU19CVUJCTEUiLCJhcGlDYWxsQXR0ZW1wdCIsKGZ1bmN0aW9uKHQpe3ZhciBuPU9iamVjdC5nZXRQcm90b3R5cGVPZihlKTtuLl9ldmVudHMmJm4uZW1pdCgiYXBpQ2FsbEF0dGVtcHQiLFt0XSl9KSksZS5hZGROYW1lZExpc3RlbmVyKCJDQUxMX0VWRU5UU19CVUJCTEUiLCJhcGlDYWxsIiwoZnVuY3Rpb24odCl7dmFyIG49T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO24uX2V2ZW50cyYmbi5lbWl0KCJhcGlDYWxsIixbdF0pfSkpfSxfc2VydmljZU1hcDp7fX0pLHIudXRpbC5taXhpbihyLlNlcnZpY2Usci5TZXF1ZW50aWFsRXhlY3V0b3IpLHQuZXhwb3J0cz1yLlNlcnZpY2V9KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLGUoIl9wcm9jZXNzIikpfSx7Ii4vY29yZSI6MTksIi4vbW9kZWwvYXBpIjo0MCwiLi9yZWdpb24vdXRpbHMiOjU1LCIuL3JlZ2lvbl9jb25maWciOjU2LF9wcm9jZXNzOjkyfV0sNjM6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1lKCIuLi9jb25maWdfcmVnaW9uYWxfZW5kcG9pbnQiKTtyLnV0aWwudXBkYXRlKHIuU1RTLnByb3RvdHlwZSx7Y3JlZGVudGlhbHNGcm9tOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU/KHR8fCh0PW5ldyByLlRlbXBvcmFyeUNyZWRlbnRpYWxzKSx0LmV4cGlyZWQ9ITEsdC5hY2Nlc3NLZXlJZD1lLkNyZWRlbnRpYWxzLkFjY2Vzc0tleUlkLHQuc2VjcmV0QWNjZXNzS2V5PWUuQ3JlZGVudGlhbHMuU2VjcmV0QWNjZXNzS2V5LHQuc2Vzc2lvblRva2VuPWUuQ3JlZGVudGlhbHMuU2Vzc2lvblRva2VuLHQuZXhwaXJlVGltZT1lLkNyZWRlbnRpYWxzLkV4cGlyYXRpb24sdCk6bnVsbH0sYXNzdW1lUm9sZVdpdGhXZWJJZGVudGl0eTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm1ha2VVbmF1dGhlbnRpY2F0ZWRSZXF1ZXN0KCJhc3N1bWVSb2xlV2l0aFdlYklkZW50aXR5IixlLHQpfSxhc3N1bWVSb2xlV2l0aFNBTUw6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5tYWtlVW5hdXRoZW50aWNhdGVkUmVxdWVzdCgiYXNzdW1lUm9sZVdpdGhTQU1MIixlLHQpfSxzZXR1cFJlcXVlc3RMaXN0ZW5lcnM6ZnVuY3Rpb24oZSl7ZS5hZGRMaXN0ZW5lcigidmFsaWRhdGUiLHRoaXMub3B0SW5SZWdpb25hbEVuZHBvaW50LCEwKX0sb3B0SW5SZWdpb25hbEVuZHBvaW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmljZSxuPXQuY29uZmlnO2lmKG4uc3RzUmVnaW9uYWxFbmRwb2ludHM9byh0Ll9vcmlnaW5hbENvbmZpZyx7ZW52OiJBV1NfU1RTX1JFR0lPTkFMX0VORFBPSU5UUyIsc2hhcmVkQ29uZmlnOiJzdHNfcmVnaW9uYWxfZW5kcG9pbnRzIixjbGllbnRDb25maWc6InN0c1JlZ2lvbmFsRW5kcG9pbnRzIn0pLCJyZWdpb25hbCI9PT1uLnN0c1JlZ2lvbmFsRW5kcG9pbnRzJiZ0LmlzR2xvYmFsRW5kcG9pbnQpe2lmKCFuLnJlZ2lvbil0aHJvdyByLnV0aWwuZXJyb3IobmV3IEVycm9yLHtjb2RlOiJDb25maWdFcnJvciIsbWVzc2FnZToiTWlzc2luZyByZWdpb24gaW4gY29uZmlnIn0pO3ZhciBpPW4uZW5kcG9pbnQuaW5kZXhPZigiLmFtYXpvbmF3cy5jb20iKSxzPW4uZW5kcG9pbnQuc3Vic3RyaW5nKDAsaSkrIi4iK24ucmVnaW9uK24uZW5kcG9pbnQuc3Vic3RyaW5nKGkpO2UuaHR0cFJlcXVlc3QudXBkYXRlRW5kcG9pbnQocyksZS5odHRwUmVxdWVzdC5yZWdpb249bi5yZWdpb259fX0pfSx7Ii4uL2NvbmZpZ19yZWdpb25hbF9lbmRwb2ludCI6MTgsIi4uL2NvcmUiOjE5fV0sNjQ6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIik7ci5TaWduZXJzLkJlYXJlcj1yLnV0aWwuaW5oZXJpdChyLlNpZ25lcnMuUmVxdWVzdFNpZ25lcix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSl7ci5TaWduZXJzLlJlcXVlc3RTaWduZXIuY2FsbCh0aGlzLGUpfSxhZGRBdXRob3JpemF0aW9uOmZ1bmN0aW9uKGUpe3RoaXMucmVxdWVzdC5oZWFkZXJzLkF1dGhvcml6YXRpb249IkJlYXJlciAiK2UudG9rZW59fSl9LHsiLi4vY29yZSI6MTl9XSw2NTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPXIudXRpbC5pbmhlcml0LGk9InByZXNpZ25lZC1leHBpcmVzIjtmdW5jdGlvbiBzKGUpe3ZhciB0PWUuaHR0cFJlcXVlc3QuaGVhZGVyc1tpXSxuPWUuc2VydmljZS5nZXRTaWduZXJDbGFzcyhlKTtpZihkZWxldGUgZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJVc2VyLUFnZW50Il0sZGVsZXRlIGUuaHR0cFJlcXVlc3QuaGVhZGVyc1siWC1BbXotVXNlci1BZ2VudCJdLG49PT1yLlNpZ25lcnMuVjQpe2lmKHQ+NjA0ODAwKXRocm93IHIudXRpbC5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IkludmFsaWRFeHBpcnlUaW1lIixtZXNzYWdlOiJQcmVzaWduaW5nIGRvZXMgbm90IHN1cHBvcnQgZXhwaXJ5IHRpbWUgZ3JlYXRlciB0aGFuIGEgd2VlayB3aXRoIFNpZ1Y0IHNpZ25pbmcuIixyZXRyeWFibGU6ITF9KTtlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbaV09dH1lbHNle2lmKG4hPT1yLlNpZ25lcnMuUzMpdGhyb3cgci51dGlsLmVycm9yKG5ldyBFcnJvcix7bWVzc2FnZToiUHJlc2lnbmluZyBvbmx5IHN1cHBvcnRzIFMzIG9yIFNpZ1Y0IHNpZ25pbmcuIixjb2RlOiJVbnN1cHBvcnRlZFNpZ25lciIscmV0cnlhYmxlOiExfSk7dmFyIG89ZS5zZXJ2aWNlP2Uuc2VydmljZS5nZXRTa2V3Q29ycmVjdGVkRGF0ZSgpOnIudXRpbC5kYXRlLmdldERhdGUoKTtlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbaV09cGFyc2VJbnQoci51dGlsLmRhdGUudW5peFRpbWVzdGFtcChvKSt0LDEwKS50b1N0cmluZygpfX1mdW5jdGlvbiBhKGUpe3ZhciB0PWUuaHR0cFJlcXVlc3QuZW5kcG9pbnQsbj1yLnV0aWwudXJsUGFyc2UoZS5odHRwUmVxdWVzdC5wYXRoKSxvPXt9O24uc2VhcmNoJiYobz1yLnV0aWwucXVlcnlTdHJpbmdQYXJzZShuLnNlYXJjaC5zdWJzdHIoMSkpKTt2YXIgcz1lLmh0dHBSZXF1ZXN0LmhlYWRlcnMuQXV0aG9yaXphdGlvbi5zcGxpdCgiICIpO2lmKCJBV1MiPT09c1swXSlzPXNbMV0uc3BsaXQoIjoiKSxvLlNpZ25hdHVyZT1zLnBvcCgpLG8uQVdTQWNjZXNzS2V5SWQ9cy5qb2luKCI6Iiksci51dGlsLmVhY2goZS5odHRwUmVxdWVzdC5oZWFkZXJzLChmdW5jdGlvbihlLHQpe2U9PT1pJiYoZT0iRXhwaXJlcyIpLDA9PT1lLmluZGV4T2YoIngtYW16LW1ldGEtIikmJihkZWxldGUgb1tlXSxlPWUudG9Mb3dlckNhc2UoKSksb1tlXT10fSkpLGRlbGV0ZSBlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbaV0sZGVsZXRlIG8uQXV0aG9yaXphdGlvbixkZWxldGUgby5Ib3N0O2Vsc2UgaWYoIkFXUzQtSE1BQy1TSEEyNTYiPT09c1swXSl7cy5zaGlmdCgpO3ZhciBhPXMuam9pbigiICIpLm1hdGNoKC9TaWduYXR1cmU9KC4qPykoPzosfFxzfFxyP1xufCQpLylbMV07b1siWC1BbXotU2lnbmF0dXJlIl09YSxkZWxldGUgby5FeHBpcmVzfXQucGF0aG5hbWU9bi5wYXRobmFtZSx0LnNlYXJjaD1yLnV0aWwucXVlcnlQYXJhbXNUb1N0cmluZyhvKX1yLlNpZ25lcnMuUHJlc2lnbj1vKHtzaWduOmZ1bmN0aW9uKGUsdCxuKXtpZihlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbaV09dHx8MzYwMCxlLm9uKCJidWlsZCIscyksZS5vbigic2lnbiIsYSksZS5yZW1vdmVMaXN0ZW5lcigiYWZ0ZXJCdWlsZCIsci5FdmVudExpc3RlbmVycy5Db3JlLlNFVF9DT05URU5UX0xFTkdUSCksZS5yZW1vdmVMaXN0ZW5lcigiYWZ0ZXJCdWlsZCIsci5FdmVudExpc3RlbmVycy5Db3JlLkNPTVBVVEVfU0hBMjU2KSxlLmVtaXQoImJlZm9yZVByZXNpZ24iLFtlXSksIW4pe2lmKGUuYnVpbGQoKSxlLnJlc3BvbnNlLmVycm9yKXRocm93IGUucmVzcG9uc2UuZXJyb3I7cmV0dXJuIHIudXRpbC51cmxGb3JtYXQoZS5odHRwUmVxdWVzdC5lbmRwb2ludCl9ZS5idWlsZCgoZnVuY3Rpb24oKXt0aGlzLnJlc3BvbnNlLmVycm9yP24odGhpcy5yZXNwb25zZS5lcnJvcik6bihudWxsLHIudXRpbC51cmxGb3JtYXQoZS5odHRwUmVxdWVzdC5lbmRwb2ludCkpfSkpfX0pLHQuZXhwb3J0cz1yLlNpZ25lcnMuUHJlc2lnbn0seyIuLi9jb3JlIjoxOX1dLDY2OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ci51dGlsLmluaGVyaXQ7ci5TaWduZXJzLlJlcXVlc3RTaWduZXI9byh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSl7dGhpcy5yZXF1ZXN0PWV9LHNldFNlcnZpY2VDbGllbnRJZDpmdW5jdGlvbihlKXt0aGlzLnNlcnZpY2VDbGllbnRJZD1lfSxnZXRTZXJ2aWNlQ2xpZW50SWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXJ2aWNlQ2xpZW50SWR9fSksci5TaWduZXJzLlJlcXVlc3RTaWduZXIuZ2V0VmVyc2lvbj1mdW5jdGlvbihlKXtzd2l0Y2goZSl7Y2FzZSJ2MiI6cmV0dXJuIHIuU2lnbmVycy5WMjtjYXNlInYzIjpyZXR1cm4gci5TaWduZXJzLlYzO2Nhc2UiczN2NCI6Y2FzZSJ2NCI6cmV0dXJuIHIuU2lnbmVycy5WNDtjYXNlInMzIjpyZXR1cm4gci5TaWduZXJzLlMzO2Nhc2UidjNodHRwcyI6cmV0dXJuIHIuU2lnbmVycy5WM0h0dHBzO2Nhc2UiYmVhcmVyIjpyZXR1cm4gci5TaWduZXJzLkJlYXJlcn10aHJvdyBuZXcgRXJyb3IoIlVua25vd24gc2lnbmluZyB2ZXJzaW9uICIrZSl9LGUoIi4vdjIiKSxlKCIuL3YzIiksZSgiLi92M2h0dHBzIiksZSgiLi92NCIpLGUoIi4vczMiKSxlKCIuL3ByZXNpZ24iKSxlKCIuL2JlYXJlciIpfSx7Ii4uL2NvcmUiOjE5LCIuL2JlYXJlciI6NjQsIi4vcHJlc2lnbiI6NjUsIi4vczMiOjY3LCIuL3YyIjo2OCwiLi92MyI6NjksIi4vdjNodHRwcyI6NzAsIi4vdjQiOjcxfV0sNjc6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1yLnV0aWwuaW5oZXJpdDtyLlNpZ25lcnMuUzM9byhyLlNpZ25lcnMuUmVxdWVzdFNpZ25lcix7c3ViUmVzb3VyY2VzOnthY2w6MSxhY2NlbGVyYXRlOjEsYW5hbHl0aWNzOjEsY29yczoxLGxpZmVjeWNsZToxLGRlbGV0ZToxLGludmVudG9yeToxLGxvY2F0aW9uOjEsbG9nZ2luZzoxLG1ldHJpY3M6MSxub3RpZmljYXRpb246MSxwYXJ0TnVtYmVyOjEscG9saWN5OjEscmVxdWVzdFBheW1lbnQ6MSxyZXBsaWNhdGlvbjoxLHJlc3RvcmU6MSx0YWdnaW5nOjEsdG9ycmVudDoxLHVwbG9hZElkOjEsdXBsb2FkczoxLHZlcnNpb25JZDoxLHZlcnNpb25pbmc6MSx2ZXJzaW9uczoxLHdlYnNpdGU6MX0scmVzcG9uc2VIZWFkZXJzOnsicmVzcG9uc2UtY29udGVudC10eXBlIjoxLCJyZXNwb25zZS1jb250ZW50LWxhbmd1YWdlIjoxLCJyZXNwb25zZS1leHBpcmVzIjoxLCJyZXNwb25zZS1jYWNoZS1jb250cm9sIjoxLCJyZXNwb25zZS1jb250ZW50LWRpc3Bvc2l0aW9uIjoxLCJyZXNwb25zZS1jb250ZW50LWVuY29kaW5nIjoxfSxhZGRBdXRob3JpemF0aW9uOmZ1bmN0aW9uKGUsdCl7dGhpcy5yZXF1ZXN0LmhlYWRlcnNbInByZXNpZ25lZC1leHBpcmVzIl18fCh0aGlzLnJlcXVlc3QuaGVhZGVyc1siWC1BbXotRGF0ZSJdPXIudXRpbC5kYXRlLnJmYzgyMih0KSksZS5zZXNzaW9uVG9rZW4mJih0aGlzLnJlcXVlc3QuaGVhZGVyc1sieC1hbXotc2VjdXJpdHktdG9rZW4iXT1lLnNlc3Npb25Ub2tlbik7dmFyIG49dGhpcy5zaWduKGUuc2VjcmV0QWNjZXNzS2V5LHRoaXMuc3RyaW5nVG9TaWduKCkpLG89IkFXUyAiK2UuYWNjZXNzS2V5SWQrIjoiK247dGhpcy5yZXF1ZXN0LmhlYWRlcnMuQXV0aG9yaXphdGlvbj1vfSxzdHJpbmdUb1NpZ246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJlcXVlc3QsdD1bXTt0LnB1c2goZS5tZXRob2QpLHQucHVzaChlLmhlYWRlcnNbIkNvbnRlbnQtTUQ1Il18fCIiKSx0LnB1c2goZS5oZWFkZXJzWyJDb250ZW50LVR5cGUiXXx8IiIpLHQucHVzaChlLmhlYWRlcnNbInByZXNpZ25lZC1leHBpcmVzIl18fCIiKTt2YXIgbj10aGlzLmNhbm9uaWNhbGl6ZWRBbXpIZWFkZXJzKCk7cmV0dXJuIG4mJnQucHVzaChuKSx0LnB1c2godGhpcy5jYW5vbmljYWxpemVkUmVzb3VyY2UoKSksdC5qb2luKCJcbiIpfSxjYW5vbmljYWxpemVkQW16SGVhZGVyczpmdW5jdGlvbigpe3ZhciBlPVtdO3IudXRpbC5lYWNoKHRoaXMucmVxdWVzdC5oZWFkZXJzLChmdW5jdGlvbih0KXt0Lm1hdGNoKC9eeC1hbXotL2kpJiZlLnB1c2godCl9KSksZS5zb3J0KChmdW5jdGlvbihlLHQpe3JldHVybiBlLnRvTG93ZXJDYXNlKCk8dC50b0xvd2VyQ2FzZSgpPy0xOjF9KSk7dmFyIHQ9W107cmV0dXJuIHIudXRpbC5hcnJheUVhY2guY2FsbCh0aGlzLGUsKGZ1bmN0aW9uKGUpe3QucHVzaChlLnRvTG93ZXJDYXNlKCkrIjoiK1N0cmluZyh0aGlzLnJlcXVlc3QuaGVhZGVyc1tlXSkpfSkpLHQuam9pbigiXG4iKX0sY2Fub25pY2FsaXplZFJlc291cmNlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5yZXF1ZXN0LHQ9ZS5wYXRoLnNwbGl0KCI/Iiksbj10WzBdLG89dFsxXSxpPSIiO2lmKGUudmlydHVhbEhvc3RlZEJ1Y2tldCYmKGkrPSIvIitlLnZpcnR1YWxIb3N0ZWRCdWNrZXQpLGkrPW4sbyl7dmFyIHM9W107ci51dGlsLmFycmF5RWFjaC5jYWxsKHRoaXMsby5zcGxpdCgiJiIpLChmdW5jdGlvbihlKXt2YXIgdD1lLnNwbGl0KCI9IilbMF0sbj1lLnNwbGl0KCI9IilbMV07aWYodGhpcy5zdWJSZXNvdXJjZXNbdF18fHRoaXMucmVzcG9uc2VIZWFkZXJzW3RdKXt2YXIgcj17bmFtZTp0fTt2b2lkIDAhPT1uJiYodGhpcy5zdWJSZXNvdXJjZXNbdF0/ci52YWx1ZT1uOnIudmFsdWU9ZGVjb2RlVVJJQ29tcG9uZW50KG4pKSxzLnB1c2gocil9fSkpLHMuc29ydCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5uYW1lPHQubmFtZT8tMToxfSkpLHMubGVuZ3RoJiYobz1bXSxyLnV0aWwuYXJyYXlFYWNoKHMsKGZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUudmFsdWU/by5wdXNoKGUubmFtZSk6by5wdXNoKGUubmFtZSsiPSIrZS52YWx1ZSl9KSksaSs9Ij8iK28uam9pbigiJiIpKX1yZXR1cm4gaX0sc2lnbjpmdW5jdGlvbihlLHQpe3JldHVybiByLnV0aWwuY3J5cHRvLmhtYWMoZSx0LCJiYXNlNjQiLCJzaGExIil9fSksdC5leHBvcnRzPXIuU2lnbmVycy5TM30seyIuLi9jb3JlIjoxOX1dLDY4OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ci51dGlsLmluaGVyaXQ7ci5TaWduZXJzLlYyPW8oci5TaWduZXJzLlJlcXVlc3RTaWduZXIse2FkZEF1dGhvcml6YXRpb246ZnVuY3Rpb24oZSx0KXt0fHwodD1yLnV0aWwuZGF0ZS5nZXREYXRlKCkpO3ZhciBuPXRoaXMucmVxdWVzdDtuLnBhcmFtcy5UaW1lc3RhbXA9ci51dGlsLmRhdGUuaXNvODYwMSh0KSxuLnBhcmFtcy5TaWduYXR1cmVWZXJzaW9uPSIyIixuLnBhcmFtcy5TaWduYXR1cmVNZXRob2Q9IkhtYWNTSEEyNTYiLG4ucGFyYW1zLkFXU0FjY2Vzc0tleUlkPWUuYWNjZXNzS2V5SWQsZS5zZXNzaW9uVG9rZW4mJihuLnBhcmFtcy5TZWN1cml0eVRva2VuPWUuc2Vzc2lvblRva2VuKSxkZWxldGUgbi5wYXJhbXMuU2lnbmF0dXJlLG4ucGFyYW1zLlNpZ25hdHVyZT10aGlzLnNpZ25hdHVyZShlKSxuLmJvZHk9ci51dGlsLnF1ZXJ5UGFyYW1zVG9TdHJpbmcobi5wYXJhbXMpLG4uaGVhZGVyc1siQ29udGVudC1MZW5ndGgiXT1uLmJvZHkubGVuZ3RofSxzaWduYXR1cmU6ZnVuY3Rpb24oZSl7cmV0dXJuIHIudXRpbC5jcnlwdG8uaG1hYyhlLnNlY3JldEFjY2Vzc0tleSx0aGlzLnN0cmluZ1RvU2lnbigpLCJiYXNlNjQiKX0sc3RyaW5nVG9TaWduOmZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIGUucHVzaCh0aGlzLnJlcXVlc3QubWV0aG9kKSxlLnB1c2godGhpcy5yZXF1ZXN0LmVuZHBvaW50Lmhvc3QudG9Mb3dlckNhc2UoKSksZS5wdXNoKHRoaXMucmVxdWVzdC5wYXRobmFtZSgpKSxlLnB1c2goci51dGlsLnF1ZXJ5UGFyYW1zVG9TdHJpbmcodGhpcy5yZXF1ZXN0LnBhcmFtcykpLGUuam9pbigiXG4iKX19KSx0LmV4cG9ydHM9ci5TaWduZXJzLlYyfSx7Ii4uL2NvcmUiOjE5fV0sNjk6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1yLnV0aWwuaW5oZXJpdDtyLlNpZ25lcnMuVjM9byhyLlNpZ25lcnMuUmVxdWVzdFNpZ25lcix7YWRkQXV0aG9yaXphdGlvbjpmdW5jdGlvbihlLHQpe3ZhciBuPXIudXRpbC5kYXRlLnJmYzgyMih0KTt0aGlzLnJlcXVlc3QuaGVhZGVyc1siWC1BbXotRGF0ZSJdPW4sZS5zZXNzaW9uVG9rZW4mJih0aGlzLnJlcXVlc3QuaGVhZGVyc1sieC1hbXotc2VjdXJpdHktdG9rZW4iXT1lLnNlc3Npb25Ub2tlbiksdGhpcy5yZXF1ZXN0LmhlYWRlcnNbIlgtQW16bi1BdXRob3JpemF0aW9uIl09dGhpcy5hdXRob3JpemF0aW9uKGUsbil9LGF1dGhvcml6YXRpb246ZnVuY3Rpb24oZSl7cmV0dXJuIkFXUzMgQVdTQWNjZXNzS2V5SWQ9IitlLmFjY2Vzc0tleUlkKyIsQWxnb3JpdGhtPUhtYWNTSEEyNTYsU2lnbmVkSGVhZGVycz0iK3RoaXMuc2lnbmVkSGVhZGVycygpKyIsU2lnbmF0dXJlPSIrdGhpcy5zaWduYXR1cmUoZSl9LHNpZ25lZEhlYWRlcnM6ZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4gci51dGlsLmFycmF5RWFjaCh0aGlzLmhlYWRlcnNUb1NpZ24oKSwoZnVuY3Rpb24odCl7ZS5wdXNoKHQudG9Mb3dlckNhc2UoKSl9KSksZS5zb3J0KCkuam9pbigiOyIpfSxjYW5vbmljYWxIZWFkZXJzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5yZXF1ZXN0LmhlYWRlcnMsdD1bXTtyZXR1cm4gci51dGlsLmFycmF5RWFjaCh0aGlzLmhlYWRlcnNUb1NpZ24oKSwoZnVuY3Rpb24obil7dC5wdXNoKG4udG9Mb3dlckNhc2UoKS50cmltKCkrIjoiK1N0cmluZyhlW25dKS50cmltKCkpfSkpLHQuc29ydCgpLmpvaW4oIlxuIikrIlxuIn0saGVhZGVyc1RvU2lnbjpmdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiByLnV0aWwuZWFjaCh0aGlzLnJlcXVlc3QuaGVhZGVycywoZnVuY3Rpb24odCl7KCJIb3N0Ij09PXR8fCJDb250ZW50LUVuY29kaW5nIj09PXR8fHQubWF0Y2goL15YLUFtei9pKSkmJmUucHVzaCh0KX0pKSxlfSxzaWduYXR1cmU6ZnVuY3Rpb24oZSl7cmV0dXJuIHIudXRpbC5jcnlwdG8uaG1hYyhlLnNlY3JldEFjY2Vzc0tleSx0aGlzLnN0cmluZ1RvU2lnbigpLCJiYXNlNjQiKX0sc3RyaW5nVG9TaWduOmZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIGUucHVzaCh0aGlzLnJlcXVlc3QubWV0aG9kKSxlLnB1c2goIi8iKSxlLnB1c2goIiIpLGUucHVzaCh0aGlzLmNhbm9uaWNhbEhlYWRlcnMoKSksZS5wdXNoKHRoaXMucmVxdWVzdC5ib2R5KSxyLnV0aWwuY3J5cHRvLnNoYTI1NihlLmpvaW4oIlxuIikpfX0pLHQuZXhwb3J0cz1yLlNpZ25lcnMuVjN9LHsiLi4vY29yZSI6MTl9XSw3MDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPXIudXRpbC5pbmhlcml0O2UoIi4vdjMiKSxyLlNpZ25lcnMuVjNIdHRwcz1vKHIuU2lnbmVycy5WMyx7YXV0aG9yaXphdGlvbjpmdW5jdGlvbihlKXtyZXR1cm4iQVdTMy1IVFRQUyBBV1NBY2Nlc3NLZXlJZD0iK2UuYWNjZXNzS2V5SWQrIixBbGdvcml0aG09SG1hY1NIQTI1NixTaWduYXR1cmU9Iit0aGlzLnNpZ25hdHVyZShlKX0sc3RyaW5nVG9TaWduOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVxdWVzdC5oZWFkZXJzWyJYLUFtei1EYXRlIl19fSksdC5leHBvcnRzPXIuU2lnbmVycy5WM0h0dHBzfSx7Ii4uL2NvcmUiOjE5LCIuL3YzIjo2OX1dLDcxOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ZSgiLi92NF9jcmVkZW50aWFscyIpLGk9ci51dGlsLmluaGVyaXQscz0icHJlc2lnbmVkLWV4cGlyZXMiO3IuU2lnbmVycy5WND1pKHIuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlLHQsbil7ci5TaWduZXJzLlJlcXVlc3RTaWduZXIuY2FsbCh0aGlzLGUpLHRoaXMuc2VydmljZU5hbWU9dCxuPW58fHt9LHRoaXMuc2lnbmF0dXJlQ2FjaGU9ImJvb2xlYW4iIT10eXBlb2Ygbi5zaWduYXR1cmVDYWNoZXx8bi5zaWduYXR1cmVDYWNoZSx0aGlzLm9wZXJhdGlvbj1uLm9wZXJhdGlvbix0aGlzLnNpZ25hdHVyZVZlcnNpb249bi5zaWduYXR1cmVWZXJzaW9ufSxhbGdvcml0aG06IkFXUzQtSE1BQy1TSEEyNTYiLGFkZEF1dGhvcml6YXRpb246ZnVuY3Rpb24oZSx0KXt2YXIgbj1yLnV0aWwuZGF0ZS5pc284NjAxKHQpLnJlcGxhY2UoL1s6XC1dfFwuXGR7M30vZywiIik7dGhpcy5pc1ByZXNpZ25lZCgpP3RoaXMudXBkYXRlRm9yUHJlc2lnbmVkKGUsbik6dGhpcy5hZGRIZWFkZXJzKGUsbiksdGhpcy5yZXF1ZXN0LmhlYWRlcnMuQXV0aG9yaXphdGlvbj10aGlzLmF1dGhvcml6YXRpb24oZSxuKX0sYWRkSGVhZGVyczpmdW5jdGlvbihlLHQpe3RoaXMucmVxdWVzdC5oZWFkZXJzWyJYLUFtei1EYXRlIl09dCxlLnNlc3Npb25Ub2tlbiYmKHRoaXMucmVxdWVzdC5oZWFkZXJzWyJ4LWFtei1zZWN1cml0eS10b2tlbiJdPWUuc2Vzc2lvblRva2VuKX0sdXBkYXRlRm9yUHJlc2lnbmVkOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jcmVkZW50aWFsU3RyaW5nKHQpLG89eyJYLUFtei1EYXRlIjp0LCJYLUFtei1BbGdvcml0aG0iOnRoaXMuYWxnb3JpdGhtLCJYLUFtei1DcmVkZW50aWFsIjplLmFjY2Vzc0tleUlkKyIvIituLCJYLUFtei1FeHBpcmVzIjp0aGlzLnJlcXVlc3QuaGVhZGVyc1tzXSwiWC1BbXotU2lnbmVkSGVhZGVycyI6dGhpcy5zaWduZWRIZWFkZXJzKCl9O2Uuc2Vzc2lvblRva2VuJiYob1siWC1BbXotU2VjdXJpdHktVG9rZW4iXT1lLnNlc3Npb25Ub2tlbiksdGhpcy5yZXF1ZXN0LmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdJiYob1siQ29udGVudC1UeXBlIl09dGhpcy5yZXF1ZXN0LmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdKSx0aGlzLnJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1NRDUiXSYmKG9bIkNvbnRlbnQtTUQ1Il09dGhpcy5yZXF1ZXN0LmhlYWRlcnNbIkNvbnRlbnQtTUQ1Il0pLHRoaXMucmVxdWVzdC5oZWFkZXJzWyJDYWNoZS1Db250cm9sIl0mJihvWyJDYWNoZS1Db250cm9sIl09dGhpcy5yZXF1ZXN0LmhlYWRlcnNbIkNhY2hlLUNvbnRyb2wiXSksci51dGlsLmVhY2guY2FsbCh0aGlzLHRoaXMucmVxdWVzdC5oZWFkZXJzLChmdW5jdGlvbihlLHQpe2lmKGUhPT1zJiZ0aGlzLmlzU2lnbmFibGVIZWFkZXIoZSkpe3ZhciBuPWUudG9Mb3dlckNhc2UoKTswPT09bi5pbmRleE9mKCJ4LWFtei1tZXRhLSIpP29bbl09dDowPT09bi5pbmRleE9mKCJ4LWFtei0iKSYmKG9bZV09dCl9fSkpO3ZhciBpPXRoaXMucmVxdWVzdC5wYXRoLmluZGV4T2YoIj8iKT49MD8iJiI6Ij8iO3RoaXMucmVxdWVzdC5wYXRoKz1pK3IudXRpbC5xdWVyeVBhcmFtc1RvU3RyaW5nKG8pfSxhdXRob3JpemF0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49W10scj10aGlzLmNyZWRlbnRpYWxTdHJpbmcodCk7cmV0dXJuIG4ucHVzaCh0aGlzLmFsZ29yaXRobSsiIENyZWRlbnRpYWw9IitlLmFjY2Vzc0tleUlkKyIvIityKSxuLnB1c2goIlNpZ25lZEhlYWRlcnM9Iit0aGlzLnNpZ25lZEhlYWRlcnMoKSksbi5wdXNoKCJTaWduYXR1cmU9Iit0aGlzLnNpZ25hdHVyZShlLHQpKSxuLmpvaW4oIiwgIil9LHNpZ25hdHVyZTpmdW5jdGlvbihlLHQpe3ZhciBuPW8uZ2V0U2lnbmluZ0tleShlLHQuc3Vic3RyKDAsOCksdGhpcy5yZXF1ZXN0LnJlZ2lvbix0aGlzLnNlcnZpY2VOYW1lLHRoaXMuc2lnbmF0dXJlQ2FjaGUpO3JldHVybiByLnV0aWwuY3J5cHRvLmhtYWMobix0aGlzLnN0cmluZ1RvU2lnbih0KSwiaGV4Iil9LHN0cmluZ1RvU2lnbjpmdW5jdGlvbihlKXt2YXIgdD1bXTtyZXR1cm4gdC5wdXNoKCJBV1M0LUhNQUMtU0hBMjU2IiksdC5wdXNoKGUpLHQucHVzaCh0aGlzLmNyZWRlbnRpYWxTdHJpbmcoZSkpLHQucHVzaCh0aGlzLmhleEVuY29kZWRIYXNoKHRoaXMuY2Fub25pY2FsU3RyaW5nKCkpKSx0LmpvaW4oIlxuIil9LGNhbm9uaWNhbFN0cmluZzpmdW5jdGlvbigpe3ZhciBlPVtdLHQ9dGhpcy5yZXF1ZXN0LnBhdGhuYW1lKCk7cmV0dXJuInMzIiE9PXRoaXMuc2VydmljZU5hbWUmJiJzM3Y0IiE9PXRoaXMuc2lnbmF0dXJlVmVyc2lvbiYmKHQ9ci51dGlsLnVyaUVzY2FwZVBhdGgodCkpLGUucHVzaCh0aGlzLnJlcXVlc3QubWV0aG9kKSxlLnB1c2godCksZS5wdXNoKHRoaXMucmVxdWVzdC5zZWFyY2goKSksZS5wdXNoKHRoaXMuY2Fub25pY2FsSGVhZGVycygpKyJcbiIpLGUucHVzaCh0aGlzLnNpZ25lZEhlYWRlcnMoKSksZS5wdXNoKHRoaXMuaGV4RW5jb2RlZEJvZHlIYXNoKCkpLGUuam9pbigiXG4iKX0sY2Fub25pY2FsSGVhZGVyczpmdW5jdGlvbigpe3ZhciBlPVtdO3IudXRpbC5lYWNoLmNhbGwodGhpcyx0aGlzLnJlcXVlc3QuaGVhZGVycywoZnVuY3Rpb24odCxuKXtlLnB1c2goW3Qsbl0pfSkpLGUuc29ydCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVswXS50b0xvd2VyQ2FzZSgpPHRbMF0udG9Mb3dlckNhc2UoKT8tMToxfSkpO3ZhciB0PVtdO3JldHVybiByLnV0aWwuYXJyYXlFYWNoLmNhbGwodGhpcyxlLChmdW5jdGlvbihlKXt2YXIgbj1lWzBdLnRvTG93ZXJDYXNlKCk7aWYodGhpcy5pc1NpZ25hYmxlSGVhZGVyKG4pKXt2YXIgbz1lWzFdO2lmKG51bGw9PW98fCJmdW5jdGlvbiIhPXR5cGVvZiBvLnRvU3RyaW5nKXRocm93IHIudXRpbC5lcnJvcihuZXcgRXJyb3IoIkhlYWRlciAiK24rIiBjb250YWlucyBpbnZhbGlkIHZhbHVlIikse2NvZGU6IkludmFsaWRIZWFkZXIifSk7dC5wdXNoKG4rIjoiK3RoaXMuY2Fub25pY2FsSGVhZGVyVmFsdWVzKG8udG9TdHJpbmcoKSkpfX0pKSx0LmpvaW4oIlxuIil9LGNhbm9uaWNhbEhlYWRlclZhbHVlczpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC9ccysvZywiICIpLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0sc2lnbmVkSGVhZGVyczpmdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiByLnV0aWwuZWFjaC5jYWxsKHRoaXMsdGhpcy5yZXF1ZXN0LmhlYWRlcnMsKGZ1bmN0aW9uKHQpe3Q9dC50b0xvd2VyQ2FzZSgpLHRoaXMuaXNTaWduYWJsZUhlYWRlcih0KSYmZS5wdXNoKHQpfSkpLGUuc29ydCgpLmpvaW4oIjsiKX0sY3JlZGVudGlhbFN0cmluZzpmdW5jdGlvbihlKXtyZXR1cm4gby5jcmVhdGVTY29wZShlLnN1YnN0cigwLDgpLHRoaXMucmVxdWVzdC5yZWdpb24sdGhpcy5zZXJ2aWNlTmFtZSl9LGhleEVuY29kZWRIYXNoOmZ1bmN0aW9uKGUpe3JldHVybiByLnV0aWwuY3J5cHRvLnNoYTI1NihlLCJoZXgiKX0saGV4RW5jb2RlZEJvZHlIYXNoOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5yZXF1ZXN0O3JldHVybiB0aGlzLmlzUHJlc2lnbmVkKCkmJlsiczMiLCJzMy1vYmplY3QtbGFtYmRhIl0uaW5kZXhPZih0aGlzLnNlcnZpY2VOYW1lKT4tMSYmIWUuYm9keT8iVU5TSUdORUQtUEFZTE9BRCI6ZS5oZWFkZXJzWyJYLUFtei1Db250ZW50LVNoYTI1NiJdP2UuaGVhZGVyc1siWC1BbXotQ29udGVudC1TaGEyNTYiXTp0aGlzLmhleEVuY29kZWRIYXNoKHRoaXMucmVxdWVzdC5ib2R5fHwiIil9LHVuc2lnbmFibGVIZWFkZXJzOlsiYXV0aG9yaXphdGlvbiIsImNvbnRlbnQtdHlwZSIsImNvbnRlbnQtbGVuZ3RoIiwidXNlci1hZ2VudCIscywiZXhwZWN0IiwieC1hbXpuLXRyYWNlLWlkIl0saXNTaWduYWJsZUhlYWRlcjpmdW5jdGlvbihlKXtyZXR1cm4gMD09PWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJ4LWFtei0iKXx8dGhpcy51bnNpZ25hYmxlSGVhZGVycy5pbmRleE9mKGUpPDB9LGlzUHJlc2lnbmVkOmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLnJlcXVlc3QuaGVhZGVyc1tzXX19KSx0LmV4cG9ydHM9ci5TaWduZXJzLlY0fSx7Ii4uL2NvcmUiOjE5LCIuL3Y0X2NyZWRlbnRpYWxzIjo3Mn1dLDcyOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89e30saT1bXSxzPSJhd3M0X3JlcXVlc3QiO3QuZXhwb3J0cz17Y3JlYXRlU2NvcGU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybltlLnN1YnN0cigwLDgpLHQsbixzXS5qb2luKCIvIil9LGdldFNpZ25pbmdLZXk6ZnVuY3Rpb24oZSx0LG4sYSxjKXt2YXIgdT1bci51dGlsLmNyeXB0by5obWFjKGUuc2VjcmV0QWNjZXNzS2V5LGUuYWNjZXNzS2V5SWQsImJhc2U2NCIpLHQsbixhXS5qb2luKCJfIik7aWYoKGM9ITEhPT1jKSYmdSBpbiBvKXJldHVybiBvW3VdO3ZhciBsPXIudXRpbC5jcnlwdG8uaG1hYygiQVdTNCIrZS5zZWNyZXRBY2Nlc3NLZXksdCwiYnVmZmVyIikscD1yLnV0aWwuY3J5cHRvLmhtYWMobCxuLCJidWZmZXIiKSxkPXIudXRpbC5jcnlwdG8uaG1hYyhwLGEsImJ1ZmZlciIpLGg9ci51dGlsLmNyeXB0by5obWFjKGQscywiYnVmZmVyIik7cmV0dXJuIGMmJihvW3VdPWgsaS5wdXNoKHUpLGkubGVuZ3RoPjUwJiZkZWxldGUgb1tpLnNoaWZ0KCldKSxofSxlbXB0eUNhY2hlOmZ1bmN0aW9uKCl7bz17fSxpPVtdfX19LHsiLi4vY29yZSI6MTl9XSw3MzpbZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHIoZSx0KXt0aGlzLmN1cnJlbnRTdGF0ZT10fHxudWxsLHRoaXMuc3RhdGVzPWV8fHt9fXIucHJvdG90eXBlLnJ1blRvPWZ1bmN0aW9uKGUsdCxuLHIpeyJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1uLG49dCx0PWUsZT1udWxsKTt2YXIgbz10aGlzLGk9by5zdGF0ZXNbby5jdXJyZW50U3RhdGVdO2kuZm4uY2FsbChufHxvLHIsKGZ1bmN0aW9uKHIpe2lmKHIpe2lmKCFpLmZhaWwpcmV0dXJuIHQ/dC5jYWxsKG4scik6bnVsbDtvLmN1cnJlbnRTdGF0ZT1pLmZhaWx9ZWxzZXtpZighaS5hY2NlcHQpcmV0dXJuIHQ/dC5jYWxsKG4pOm51bGw7by5jdXJyZW50U3RhdGU9aS5hY2NlcHR9aWYoby5jdXJyZW50U3RhdGU9PT1lKXJldHVybiB0P3QuY2FsbChuLHIpOm51bGw7by5ydW5UbyhlLHQsbixyKX0pKX0sci5wcm90b3R5cGUuYWRkU3RhdGU9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/KHI9dCx0PW51bGwsbj1udWxsKToiZnVuY3Rpb24iPT10eXBlb2YgbiYmKHI9bixuPW51bGwpLHRoaXMuY3VycmVudFN0YXRlfHwodGhpcy5jdXJyZW50U3RhdGU9ZSksdGhpcy5zdGF0ZXNbZV09e2FjY2VwdDp0LGZhaWw6bixmbjpyfSx0aGlzfSx0LmV4cG9ydHM9cn0se31dLDc0OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKG4scil7KGZ1bmN0aW9uKCl7dmFyIG8saT17ZW52aXJvbm1lbnQ6Im5vZGVqcyIsZW5naW5lOmZ1bmN0aW9uKCl7aWYoaS5pc0Jyb3dzZXIoKSYmInVuZGVmaW5lZCIhPXR5cGVvZiBuYXZpZ2F0b3IpcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQ7dmFyIGU9bi5wbGF0Zm9ybSsiLyIrbi52ZXJzaW9uO3JldHVybiBuLmVudi5BV1NfRVhFQ1VUSU9OX0VOViYmKGUrPSIgZXhlYy1lbnYvIituLmVudi5BV1NfRVhFQ1VUSU9OX0VOViksZX0sdXNlckFnZW50OmZ1bmN0aW9uKCl7dmFyIHQ9aS5lbnZpcm9ubWVudCxuPSJhd3Mtc2RrLSIrdCsiLyIrZSgiLi9jb3JlIikuVkVSU0lPTjtyZXR1cm4ibm9kZWpzIj09PXQmJihuKz0iICIraS5lbmdpbmUoKSksbn0sdXJpRXNjYXBlOmZ1bmN0aW9uKGUpe3ZhciB0PWVuY29kZVVSSUNvbXBvbmVudChlKTtyZXR1cm4gdD0odD10LnJlcGxhY2UoL1teQS1aYS16MC05Xy5+XC0lXSsvZyxlc2NhcGUpKS5yZXBsYWNlKC9bKl0vZywoZnVuY3Rpb24oZSl7cmV0dXJuIiUiK2UuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX0pKX0sdXJpRXNjYXBlUGF0aDpmdW5jdGlvbihlKXt2YXIgdD1bXTtyZXR1cm4gaS5hcnJheUVhY2goZS5zcGxpdCgiLyIpLChmdW5jdGlvbihlKXt0LnB1c2goaS51cmlFc2NhcGUoZSkpfSkpLHQuam9pbigiLyIpfSx1cmxQYXJzZTpmdW5jdGlvbihlKXtyZXR1cm4gaS51cmwucGFyc2UoZSl9LHVybEZvcm1hdDpmdW5jdGlvbihlKXtyZXR1cm4gaS51cmwuZm9ybWF0KGUpfSxxdWVyeVN0cmluZ1BhcnNlOmZ1bmN0aW9uKGUpe3JldHVybiBpLnF1ZXJ5c3RyaW5nLnBhcnNlKGUpfSxxdWVyeVBhcmFtc1RvU3RyaW5nOmZ1bmN0aW9uKGUpe3ZhciB0PVtdLG49aS51cmlFc2NhcGUscj1PYmplY3Qua2V5cyhlKS5zb3J0KCk7cmV0dXJuIGkuYXJyYXlFYWNoKHIsKGZ1bmN0aW9uKHIpe3ZhciBvPWVbcl0scz1uKHIpLGE9cysiPSI7aWYoQXJyYXkuaXNBcnJheShvKSl7dmFyIGM9W107aS5hcnJheUVhY2gobywoZnVuY3Rpb24oZSl7Yy5wdXNoKG4oZSkpfSkpLGE9cysiPSIrYy5zb3J0KCkuam9pbigiJiIrcysiPSIpfWVsc2UgbnVsbCE9byYmKGE9cysiPSIrbihvKSk7dC5wdXNoKGEpfSkpLHQuam9pbigiJiIpfSxyZWFkRmlsZVN5bmM6ZnVuY3Rpb24odCl7cmV0dXJuIGkuaXNCcm93c2VyKCk/bnVsbDplKCJmcyIpLnJlYWRGaWxlU3luYyh0LCJ1dGYtOCIpfSxiYXNlNjQ6e2VuY29kZTpmdW5jdGlvbihlKXtpZigibnVtYmVyIj09dHlwZW9mIGUpdGhyb3cgaS5lcnJvcihuZXcgRXJyb3IoIkNhbm5vdCBiYXNlNjQgZW5jb2RlIG51bWJlciAiK2UpKTtyZXR1cm4gbnVsbD09ZT9lOmkuYnVmZmVyLnRvQnVmZmVyKGUpLnRvU3RyaW5nKCJiYXNlNjQiKX0sZGVjb2RlOmZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiPT10eXBlb2YgZSl0aHJvdyBpLmVycm9yKG5ldyBFcnJvcigiQ2Fubm90IGJhc2U2NCBkZWNvZGUgbnVtYmVyICIrZSkpO3JldHVybiBudWxsPT1lP2U6aS5idWZmZXIudG9CdWZmZXIoZSwiYmFzZTY0Iil9fSxidWZmZXI6e3RvQnVmZmVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGkuQnVmZmVyLmZyb20mJmkuQnVmZmVyLmZyb20hPT1VaW50OEFycmF5LmZyb20/aS5CdWZmZXIuZnJvbShlLHQpOm5ldyBpLkJ1ZmZlcihlLHQpfSxhbGxvYzpmdW5jdGlvbihlLHQsbil7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigic2l6ZSBwYXNzZWQgdG8gYWxsb2MgbXVzdCBiZSBhIG51bWJlci4iKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgaS5CdWZmZXIuYWxsb2MpcmV0dXJuIGkuQnVmZmVyLmFsbG9jKGUsdCxuKTt2YXIgcj1uZXcgaS5CdWZmZXIoZSk7cmV0dXJuIHZvaWQgMCE9PXQmJiJmdW5jdGlvbiI9PXR5cGVvZiByLmZpbGwmJnIuZmlsbCh0LHZvaWQgMCx2b2lkIDAsbikscn0sdG9TdHJlYW06ZnVuY3Rpb24oZSl7aS5CdWZmZXIuaXNCdWZmZXIoZSl8fChlPWkuYnVmZmVyLnRvQnVmZmVyKGUpKTt2YXIgdD1uZXcgaS5zdHJlYW0uUmVhZGFibGUsbj0wO3JldHVybiB0Ll9yZWFkPWZ1bmN0aW9uKHIpe2lmKG4+PWUubGVuZ3RoKXJldHVybiB0LnB1c2gobnVsbCk7dmFyIG89bityO28+ZS5sZW5ndGgmJihvPWUubGVuZ3RoKSx0LnB1c2goZS5zbGljZShuLG8pKSxuPW99LHR9LGNvbmNhdDpmdW5jdGlvbihlKXt2YXIgdCxuLHI9MCxvPTA7Zm9yKG49MDtuPGUubGVuZ3RoO24rKylyKz1lW25dLmxlbmd0aDtmb3IodD1pLmJ1ZmZlci5hbGxvYyhyKSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXS5jb3B5KHQsbyksbys9ZVtuXS5sZW5ndGg7cmV0dXJuIHR9fSxzdHJpbmc6e2J5dGVMZW5ndGg6ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gMDtpZigic3RyaW5nIj09dHlwZW9mIHQmJih0PWkuYnVmZmVyLnRvQnVmZmVyKHQpKSwibnVtYmVyIj09dHlwZW9mIHQuYnl0ZUxlbmd0aClyZXR1cm4gdC5ieXRlTGVuZ3RoO2lmKCJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGgpcmV0dXJuIHQubGVuZ3RoO2lmKCJudW1iZXIiPT10eXBlb2YgdC5zaXplKXJldHVybiB0LnNpemU7aWYoInN0cmluZyI9PXR5cGVvZiB0LnBhdGgpcmV0dXJuIGUoImZzIikubHN0YXRTeW5jKHQucGF0aCkuc2l6ZTt0aHJvdyBpLmVycm9yKG5ldyBFcnJvcigiQ2Fubm90IGRldGVybWluZSBsZW5ndGggb2YgIit0KSx7b2JqZWN0OnR9KX0sdXBwZXJGaXJzdDpmdW5jdGlvbihlKXtyZXR1cm4gZVswXS50b1VwcGVyQ2FzZSgpK2Uuc3Vic3RyKDEpfSxsb3dlckZpcnN0OmZ1bmN0aW9uKGUpe3JldHVybiBlWzBdLnRvTG93ZXJDYXNlKCkrZS5zdWJzdHIoMSl9fSxpbmk6e3BhcnNlOmZ1bmN0aW9uKGUpe3ZhciB0LG49e307cmV0dXJuIGkuYXJyYXlFYWNoKGUuc3BsaXQoL1xyP1xuLyksKGZ1bmN0aW9uKGUpe2lmKCJbIj09PShlPWUuc3BsaXQoLyhefFxzKVs7I10vKVswXS50cmltKCkpWzBdJiYiXSI9PT1lW2UubGVuZ3RoLTFdKXtpZigiX19wcm90b19fIj09PSh0PWUuc3Vic3RyaW5nKDEsZS5sZW5ndGgtMSkpfHwiX19wcm90b19fIj09PXQuc3BsaXQoL1xzLylbMV0pdGhyb3cgaS5lcnJvcihuZXcgRXJyb3IoIkNhbm5vdCBsb2FkIHByb2ZpbGUgbmFtZSAnIit0KyInIGZyb20gc2hhcmVkIGluaSBmaWxlLiIpKX1lbHNlIGlmKHQpe3ZhciByPWUuaW5kZXhPZigiPSIpLG89ZS5sZW5ndGgtMTtpZigtMSE9PXImJjAhPT1yJiZyIT09byl7dmFyIHM9ZS5zdWJzdHJpbmcoMCxyKS50cmltKCksYT1lLnN1YnN0cmluZyhyKzEpLnRyaW0oKTtuW3RdPW5bdF18fHt9LG5bdF1bc109YX19fSkpLG59fSxmbjp7bm9vcDpmdW5jdGlvbigpe30sY2FsbGJhY2s6ZnVuY3Rpb24oZSl7aWYoZSl0aHJvdyBlfSxtYWtlQXN5bmM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdCYmdDw9ZS5sZW5ndGg/ZTpmdW5jdGlvbigpe3ZhciB0PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKTt0LnBvcCgpKGUuYXBwbHkobnVsbCx0KSl9fX0sZGF0ZTp7Z2V0RGF0ZTpmdW5jdGlvbigpe3JldHVybiBvfHwobz1lKCIuL2NvcmUiKSksby5jb25maWcuc3lzdGVtQ2xvY2tPZmZzZXQ/bmV3IERhdGUoKG5ldyBEYXRlKS5nZXRUaW1lKCkrby5jb25maWcuc3lzdGVtQ2xvY2tPZmZzZXQpOm5ldyBEYXRlfSxpc284NjAxOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT1pLmRhdGUuZ2V0RGF0ZSgpKSxlLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvXC5cZHszfVokLywiWiIpfSxyZmM4MjI6ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPWkuZGF0ZS5nZXREYXRlKCkpLGUudG9VVENTdHJpbmcoKX0sdW5peFRpbWVzdGFtcDpmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9aS5kYXRlLmdldERhdGUoKSksZS5nZXRUaW1lKCkvMWUzfSxmcm9tOmZ1bmN0aW9uKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZT9uZXcgRGF0ZSgxZTMqZSk6bmV3IERhdGUoZSl9LGZvcm1hdDpmdW5jdGlvbihlLHQpe3JldHVybiB0fHwodD0iaXNvODYwMSIpLGkuZGF0ZVt0XShpLmRhdGUuZnJvbShlKSl9LHBhcnNlVGltZXN0YW1wOmZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiPT10eXBlb2YgZSlyZXR1cm4gbmV3IERhdGUoMWUzKmUpO2lmKGUubWF0Y2goL15cZCskLykpcmV0dXJuIG5ldyBEYXRlKDFlMyplKTtpZihlLm1hdGNoKC9eXGR7NH0vKSlyZXR1cm4gbmV3IERhdGUoZSk7aWYoZS5tYXRjaCgvXlx3ezN9LC8pKXJldHVybiBuZXcgRGF0ZShlKTt0aHJvdyBpLmVycm9yKG5ldyBFcnJvcigidW5oYW5kbGVkIHRpbWVzdGFtcCBmb3JtYXQ6ICIrZSkse2NvZGU6IlRpbWVzdGFtcFBhcnNlckVycm9yIn0pfX0sY3J5cHRvOntjcmMzMlRhYmxlOlswLDE5OTY5NTk4OTQsMzk5MzkxOTc4OCwyNTY3NTI0Nzk0LDEyNDYzNDEzNywxODg2MDU3NjE1LDM5MTU2MjE2ODUsMjY1NzM5MjAzNSwyNDkyNjgyNzQsMjA0NDUwODMyNCwzNzcyMTE1MjMwLDI1NDcxNzc4NjQsMTYyOTQxOTk1LDIxMjU1NjEwMjEsMzg4NzYwNzA0NywyNDI4NDQ0MDQ5LDQ5ODUzNjU0OCwxNzg5OTI3NjY2LDQwODkwMTY2NDgsMjIyNzA2MTIxNCw0NTA1NDg4NjEsMTg0MzI1ODYwMyw0MTA3NTgwNzUzLDIyMTE2Nzc2MzksMzI1ODgzOTkwLDE2ODQ3NzcxNTIsNDI1MTEyMjA0MiwyMzIxOTI2NjM2LDMzNTYzMzQ4NywxNjYxMzY1NDY1LDQxOTUzMDI3NTUsMjM2NjExNTMxNyw5OTcwNzMwOTYsMTI4MTk1Mzg4NiwzNTc5ODU1MzMyLDI3MjQ2ODgyNDIsMTAwNjg4ODE0NSwxMjU4NjA3Njg3LDM1MjQxMDE2MjksMjc2ODk0MjQ0Myw5MDEwOTc3MjIsMTExOTAwMDY4NCwzNjg2NTE3MjA2LDI4OTgwNjU3MjgsODUzMDQ0NDUxLDExNzIyNjYxMDEsMzcwNTAxNTc1OSwyODgyNjE2NjY1LDY1MTc2Nzk4MCwxMzczNTAzNTQ2LDMzNjk1NTQzMDQsMzIxODEwNDU5OCw1NjU1MDcyNTMsMTQ1NDYyMTczMSwzNDg1MTExNzA1LDMwOTk0MzYzMDMsNjcxMjY2OTc0LDE1OTQxOTgwMjQsMzMyMjczMDkzMCwyOTcwMzQ3ODEyLDc5NTgzNTUyNywxNDgzMjMwMjI1LDMyNDQzNjcyNzUsMzA2MDE0OTU2NSwxOTk0MTQ2MTkyLDMxMTU4NTM0LDI1NjM5MDc3NzIsNDAyMzcxNzkzMCwxOTA3NDU5NDY1LDExMjYzNzIxNSwyNjgwMTUzMjUzLDM5MDQ0MjcwNTksMjAxMzc3NjI5MCwyNTE3MjIwMzYsMjUxNzIxNTM3NCwzNzc1ODMwMDQwLDIxMzc2NTY3NjMsMTQxMzc2ODEzLDI0MzkyNzc3MTksMzg2NTI3MTI5NywxODAyMTk1NDQ0LDQ3Njg2NDg2NiwyMjM4MDAxMzY4LDQwNjY1MDg4NzgsMTgxMjM3MDkyNSw0NTMwOTI3MzEsMjE4MTYyNTAyNSw0MTExNDUxMjIzLDE3MDYwODg5MDIsMzE0MDQyNzA0LDIzNDQ1MzIyMDIsNDI0MDAxNzUzMiwxNjU4NjU4MjcxLDM2NjYxOTk3NywyMzYyNjcwMzIzLDQyMjQ5OTQ0MDUsMTMwMzUzNTk2MCw5ODQ5NjE0ODYsMjc0NzAwNzA5MiwzNTY5MDM3NTM4LDEyNTYxNzA4MTcsMTAzNzYwNDMxMSwyNzY1MjEwNzMzLDM1NTQwNzk5OTUsMTEzMTAxNDUwNiw4Nzk2Nzk5OTYsMjkwOTI0MzQ2MiwzNjYzNzcxODU2LDExNDExMjQ0NjcsODU1ODQyMjc3LDI4NTI4MDE2MzEsMzcwODY0ODY0OSwxMzQyNTMzOTQ4LDY1NDQ1OTMwNiwzMTg4Mzk2MDQ4LDMzNzMwMTUxNzQsMTQ2NjQ3OTkwOSw1NDQxNzk2MzUsMzExMDUyMzkxMywzNDYyNTIyMDE1LDE1OTE2NzEwNTQsNzAyMTM4Nzc2LDI5NjY0NjA0NTAsMzM1Mjc5OTQxMiwxNTA0OTE4ODA3LDc4MzU1MTg3MywzMDgyNjQwNDQzLDMyMzM0NDI5ODksMzk4ODI5MjM4NCwyNTk2MjU0NjQ2LDYyMzE3MDY4LDE5NTc4MTA4NDIsMzkzOTg0NTk0NSwyNjQ3ODE2MTExLDgxNDcwOTk3LDE5NDM4MDM1MjMsMzgxNDkxODkzMCwyNDg5NTk2ODA0LDIyNTI3NDQzMCwyMDUzNzkwMzc2LDM4MjYxNzU3NTUsMjQ2NjkwNjAxMywxNjc4MTY3NDMsMjA5NzY1MTM3Nyw0MDI3NTUyNTgwLDIyNjU0OTAzODYsNTAzNDQ0MDcyLDE3NjIwNTA4MTQsNDE1MDQxNzI0NSwyMTU0MTI5MzU1LDQyNjUyMjIyNSwxODUyNTA3ODc5LDQyNzUzMTM1MjYsMjMxMjMxNzkyMCwyODI3NTM2MjYsMTc0MjU1NTg1Miw0MTg5NzA4MTQzLDIzOTQ4Nzc5NDUsMzk3OTE3NzYzLDE2MjIxODM2MzcsMzYwNDM5MDg4OCwyNzE0ODY2NTU4LDk1MzcyOTczMiwxMzQwMDc2NjI2LDM1MTg3MTk5ODUsMjc5NzM2MDk5OSwxMDY4ODI4MzgxLDEyMTk2Mzg4NTksMzYyNDc0MTg1MCwyOTM2Njc1MTQ4LDkwNjE4NTQ2MiwxMDkwODEyNTEyLDM3NDc2NzIwMDMsMjgyNTM3OTY2OSw4MjkzMjkxMzUsMTE4MTMzNTE2MSwzNDEyMTc3ODA0LDMxNjA4MzQ4NDIsNjI4MDg1NDA4LDEzODI2MDUzNjYsMzQyMzM2OTEwOSwzMTM4MDc4NDY3LDU3MDU2MjIzMywxNDI2NDAwODE1LDMzMTczMTY1NDIsMjk5ODczMzYwOCw3MzMyMzk5NTQsMTU1NTI2MTk1NiwzMjY4OTM1NTkxLDMwNTAzNjA2MjUsNzUyNDU5NDAzLDE1NDEzMjAyMjEsMjYwNzA3MTkyMCwzOTY1OTczMDMwLDE5Njk5MjI5NzIsNDA3MzU0OTgsMjYxNzgzNzIyNSwzOTQzNTc3MTUxLDE5MTMwODc4NzcsODM5MDgzNzEsMjUxMjM0MTYzNCwzODAzNzQwNjkyLDIwNzUyMDg2MjIsMjEzMjYxMTEyLDI0NjMyNzI2MDMsMzg1NTk5MDI4NSwyMDk0ODU0MDcxLDE5ODk1ODg4MSwyMjYyMDI5MDEyLDQwNTcyNjA2MTAsMTc1OTM1OTk5Miw1MzQ0MTQxOTAsMjE3NjcxODU0MSw0MTM5MzI5MTE1LDE4NzM4MzYwMDEsNDE0NjY0NTY3LDIyODIyNDg5MzQsNDI3OTIwMDM2OCwxNzExNjg0NTU0LDI4NTI4MTExNiwyNDA1ODAxNzI3LDQxNjcyMTY3NDUsMTYzNDQ2Nzc5NSwzNzYyMjk3MDEsMjY4NTA2Nzg5NiwzNjA4MDA3NDA2LDEzMDg5MTg2MTIsOTU2NTQzOTM4LDI4MDg1NTUxMDUsMzQ5NTk1ODI2MywxMjMxNjM2MzAxLDEwNDc0MjcwMzUsMjkzMjk1OTgxOCwzNjU0NzAzODM2LDEwODgzNTkyNzAsOTM2OTE4ZTMsMjg0NzcxNDg5OSwzNzM2ODM3ODI5LDEyMDI5MDA4NjMsODE3MjMzODk3LDMxODMzNDIxMDgsMzQwMTIzNzEzMCwxNDA0Mjc3NTUyLDYxNTgxODE1MCwzMTM0MjA3NDkzLDM0NTM0MjEyMDMsMTQyMzg1NzQ0OSw2MDE0NTA0MzEsMzAwOTgzNzYxNCwzMjk0NzEwNDU2LDE1NjcxMDM3NDYsNzExOTI4NzI0LDMwMjA2Njg0NzEsMzI3MjM4MDA2NSwxNTEwMzM0MjM1LDc1NTE2NzExN10sY3JjMzI6ZnVuY3Rpb24oZSl7dmFyIHQ9aS5jcnlwdG8uY3JjMzJUYWJsZSxuPS0xOyJzdHJpbmciPT10eXBlb2YgZSYmKGU9aS5idWZmZXIudG9CdWZmZXIoZSkpO2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKW49bj4+PjhedFsyNTUmKG5eZS5yZWFkVUludDgocikpXTtyZXR1cm4oLTFebik+Pj4wfSxobWFjOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBufHwobj0iYmluYXJ5IiksImJ1ZmZlciI9PT1uJiYobj12b2lkIDApLHJ8fChyPSJzaGEyNTYiKSwic3RyaW5nIj09dHlwZW9mIHQmJih0PWkuYnVmZmVyLnRvQnVmZmVyKHQpKSxpLmNyeXB0by5saWIuY3JlYXRlSG1hYyhyLGUpLnVwZGF0ZSh0KS5kaWdlc3Qobil9LG1kNTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGkuY3J5cHRvLmhhc2goIm1kNSIsZSx0LG4pfSxzaGEyNTY6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBpLmNyeXB0by5oYXNoKCJzaGEyNTYiLGUsdCxuKX0saGFzaDpmdW5jdGlvbihlLHQsbixyKXt2YXIgbz1pLmNyeXB0by5jcmVhdGVIYXNoKGUpO258fChuPSJiaW5hcnkiKSwiYnVmZmVyIj09PW4mJihuPXZvaWQgMCksInN0cmluZyI9PXR5cGVvZiB0JiYodD1pLmJ1ZmZlci50b0J1ZmZlcih0KSk7dmFyIHM9aS5hcnJheVNsaWNlRm4odCksYT1pLkJ1ZmZlci5pc0J1ZmZlcih0KTtpZihpLmlzQnJvd3NlcigpJiYidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZ0JiZ0LmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyJiYoYT0hMCksciYmIm9iamVjdCI9PXR5cGVvZiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5vbiYmIWEpdC5vbigiZGF0YSIsKGZ1bmN0aW9uKGUpe28udXBkYXRlKGUpfSkpLHQub24oImVycm9yIiwoZnVuY3Rpb24oZSl7cihlKX0pKSx0Lm9uKCJlbmQiLChmdW5jdGlvbigpe3IobnVsbCxvLmRpZ2VzdChuKSl9KSk7ZWxzZXtpZighcnx8IXN8fGF8fCJ1bmRlZmluZWQiPT10eXBlb2YgRmlsZVJlYWRlcil7aS5pc0Jyb3dzZXIoKSYmIm9iamVjdCI9PXR5cGVvZiB0JiYhYSYmKHQ9bmV3IGkuQnVmZmVyKG5ldyBVaW50OEFycmF5KHQpKSk7dmFyIGM9by51cGRhdGUodCkuZGlnZXN0KG4pO3JldHVybiByJiZyKG51bGwsYyksY312YXIgdT0wLGw9bmV3IEZpbGVSZWFkZXI7bC5vbmVycm9yPWZ1bmN0aW9uKCl7cihuZXcgRXJyb3IoIkZhaWxlZCB0byByZWFkIGRhdGEuIikpfSxsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBlPW5ldyBpLkJ1ZmZlcihuZXcgVWludDhBcnJheShsLnJlc3VsdCkpO28udXBkYXRlKGUpLHUrPWUubGVuZ3RoLGwuX2NvbnRpbnVlUmVhZGluZygpfSxsLl9jb250aW51ZVJlYWRpbmc9ZnVuY3Rpb24oKXtpZih1Pj10LnNpemUpcihudWxsLG8uZGlnZXN0KG4pKTtlbHNle3ZhciBlPXUrNTI0Mjg4O2U+dC5zaXplJiYoZT10LnNpemUpLGwucmVhZEFzQXJyYXlCdWZmZXIocy5jYWxsKHQsdSxlKSl9fSxsLl9jb250aW51ZVJlYWRpbmcoKX19LHRvSGV4OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspdC5wdXNoKCgiMCIrZS5jaGFyQ29kZUF0KG4pLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC0yLDIpKTtyZXR1cm4gdC5qb2luKCIiKX0sY3JlYXRlSGFzaDpmdW5jdGlvbihlKXtyZXR1cm4gaS5jcnlwdG8ubGliLmNyZWF0ZUhhc2goZSl9fSxhYm9ydDp7fSxlYWNoOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIGUpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbikmJnQuY2FsbCh0aGlzLG4sZVtuXSk9PT1pLmFib3J0KWJyZWFrfSxhcnJheUVhY2g6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gZSlpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKSYmdC5jYWxsKHRoaXMsZVtuXSxwYXJzZUludChuLDEwKSk9PT1pLmFib3J0KWJyZWFrfSx1cGRhdGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaS5lYWNoKHQsKGZ1bmN0aW9uKHQsbil7ZVt0XT1ufSkpLGV9LG1lcmdlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGkudXBkYXRlKGkuY29weShlKSx0KX0sY29weTpmdW5jdGlvbihlKXtpZihudWxsPT1lKXJldHVybiBlO3ZhciB0PXt9O2Zvcih2YXIgbiBpbiBlKXRbbl09ZVtuXTtyZXR1cm4gdH0saXNFbXB0eTpmdW5jdGlvbihlKXtmb3IodmFyIHQgaW4gZSlpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KSlyZXR1cm4hMTtyZXR1cm4hMH0sYXJyYXlTbGljZUZuOmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2xpY2V8fGUud2Via2l0U2xpY2V8fGUubW96U2xpY2U7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpudWxsfSxpc1R5cGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9aS50eXBlTmFtZSh0KSksT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpPT09IltvYmplY3QgIit0KyJdIn0sdHlwZU5hbWU6ZnVuY3Rpb24oZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIm5hbWUiKSlyZXR1cm4gZS5uYW1lO3ZhciB0PWUudG9TdHJpbmcoKSxuPXQubWF0Y2goL15ccypmdW5jdGlvbiAoLispXCgvKTtyZXR1cm4gbj9uWzFdOnR9LGVycm9yOmZ1bmN0aW9uKGUsdCl7dmFyIG49bnVsbDtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUubWVzc2FnZSYmIiIhPT1lLm1lc3NhZ2UmJigic3RyaW5nIj09dHlwZW9mIHR8fHQmJnQubWVzc2FnZSkmJigobj1pLmNvcHkoZSkpLm1lc3NhZ2U9ZS5tZXNzYWdlKSxlLm1lc3NhZ2U9ZS5tZXNzYWdlfHxudWxsLCJzdHJpbmciPT10eXBlb2YgdD9lLm1lc3NhZ2U9dDoib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10JiYoaS51cGRhdGUoZSx0KSx0Lm1lc3NhZ2UmJihlLm1lc3NhZ2U9dC5tZXNzYWdlKSwodC5jb2RlfHx0Lm5hbWUpJiYoZS5jb2RlPXQuY29kZXx8dC5uYW1lKSx0LnN0YWNrJiYoZS5zdGFjaz10LnN0YWNrKSksImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSYmKE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJuYW1lIix7d3JpdGFibGU6ITAsZW51bWVyYWJsZTohMX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJtZXNzYWdlIix7ZW51bWVyYWJsZTohMH0pKSxlLm5hbWU9U3RyaW5nKHQmJnQubmFtZXx8ZS5uYW1lfHxlLmNvZGV8fCJFcnJvciIpLGUudGltZT1uZXcgRGF0ZSxuJiYoZS5vcmlnaW5hbEVycm9yPW4pLGV9LGluaGVyaXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1udWxsO2lmKHZvaWQgMD09PXQpdD1lLGU9T2JqZWN0LG49e307ZWxzZXt2YXIgcj1mdW5jdGlvbigpe307ci5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbj1uZXcgcn1yZXR1cm4gdC5jb25zdHJ1Y3Rvcj09PU9iamVjdCYmKHQuY29uc3RydWN0b3I9ZnVuY3Rpb24oKXtpZihlIT09T2JqZWN0KXJldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLHQuY29uc3RydWN0b3IucHJvdG90eXBlPW4saS51cGRhdGUodC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsdCksdC5jb25zdHJ1Y3Rvci5fX3N1cGVyX189ZSx0LmNvbnN0cnVjdG9yfSxtaXhpbjpmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHNbMF0sdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspZm9yKHZhciBuIGluIGFyZ3VtZW50c1t0XS5wcm90b3R5cGUpe3ZhciByPWFyZ3VtZW50c1t0XS5wcm90b3R5cGVbbl07ImNvbnN0cnVjdG9yIiE9PW4mJihlLnByb3RvdHlwZVtuXT1yKX1yZXR1cm4gZX0saGlkZVByb3BlcnRpZXM6ZnVuY3Rpb24oZSx0KXsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmRlZmluZVByb3BlcnR5JiZpLmFycmF5RWFjaCh0LChmdW5jdGlvbih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pfSkpfSxwcm9wZXJ0eTpmdW5jdGlvbihlLHQsbixyLG8pe3ZhciBpPXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTp2b2lkIDA9PT1yfHxyfTsiZnVuY3Rpb24iIT10eXBlb2Ygbnx8bz8oaS52YWx1ZT1uLGkud3JpdGFibGU9ITApOmkuZ2V0PW4sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCxpKX0sbWVtb2l6ZWRQcm9wZXJ0eTpmdW5jdGlvbihlLHQsbixyKXt2YXIgbz1udWxsO2kucHJvcGVydHkoZSx0LChmdW5jdGlvbigpe3JldHVybiBudWxsPT09byYmKG89bigpKSxvfSkscil9LGhvaXN0UGF5bG9hZE1lbWJlcjpmdW5jdGlvbihlKXt2YXIgdD1lLnJlcXVlc3Qsbj10Lm9wZXJhdGlvbixyPXQuc2VydmljZS5hcGkub3BlcmF0aW9uc1tuXSxvPXIub3V0cHV0O2lmKG8ucGF5bG9hZCYmIXIuaGFzRXZlbnRPdXRwdXQpe3ZhciBzPW8ubWVtYmVyc1tvLnBheWxvYWRdLGE9ZS5kYXRhW28ucGF5bG9hZF07InN0cnVjdHVyZSI9PT1zLnR5cGUmJmkuZWFjaChhLChmdW5jdGlvbih0LG4pe2kucHJvcGVydHkoZS5kYXRhLHQsbiwhMSl9KSl9fSxjb21wdXRlU2hhMjU2OmZ1bmN0aW9uKHQsbil7aWYoaS5pc05vZGUoKSl7dmFyIHI9aS5zdHJlYW0uU3RyZWFtLG89ZSgiZnMiKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgciYmdCBpbnN0YW5jZW9mIHIpe2lmKCJzdHJpbmciIT10eXBlb2YgdC5wYXRoKXJldHVybiBuKG5ldyBFcnJvcigiTm9uLWZpbGUgc3RyZWFtIG9iamVjdHMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBTaWdWNCIpKTt2YXIgcz17fTsibnVtYmVyIj09dHlwZW9mIHQuc3RhcnQmJihzLnN0YXJ0PXQuc3RhcnQpLCJudW1iZXIiPT10eXBlb2YgdC5lbmQmJihzLmVuZD10LmVuZCksdD1vLmNyZWF0ZVJlYWRTdHJlYW0odC5wYXRoLHMpfX1pLmNyeXB0by5zaGEyNTYodCwiaGV4IiwoZnVuY3Rpb24oZSx0KXtlP24oZSk6bihudWxsLHQpfSkpfSxpc0Nsb2NrU2tld2VkOmZ1bmN0aW9uKGUpe2lmKGUpcmV0dXJuIGkucHJvcGVydHkoby5jb25maWcsImlzQ2xvY2tTa2V3ZWQiLE1hdGguYWJzKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWUpPj0zZTUsITEpLG8uY29uZmlnLmlzQ2xvY2tTa2V3ZWR9LGFwcGx5Q2xvY2tPZmZzZXQ6ZnVuY3Rpb24oZSl7ZSYmKG8uY29uZmlnLnN5c3RlbUNsb2NrT2Zmc2V0PWUtKG5ldyBEYXRlKS5nZXRUaW1lKCkpfSxleHRyYWN0UmVxdWVzdElkOmZ1bmN0aW9uKGUpe3ZhciB0PWUuaHR0cFJlc3BvbnNlLmhlYWRlcnNbIngtYW16LXJlcXVlc3QtaWQiXXx8ZS5odHRwUmVzcG9uc2UuaGVhZGVyc1sieC1hbXpuLXJlcXVlc3RpZCJdOyF0JiZlLmRhdGEmJmUuZGF0YS5SZXNwb25zZU1ldGFkYXRhJiYodD1lLmRhdGEuUmVzcG9uc2VNZXRhZGF0YS5SZXF1ZXN0SWQpLHQmJihlLnJlcXVlc3RJZD10KSxlLmVycm9yJiYoZS5lcnJvci5yZXF1ZXN0SWQ9dCl9LGFkZFByb21pc2VzOmZ1bmN0aW9uKGUsdCl7dmFyIG49ITE7dm9pZCAwPT09dCYmbyYmby5jb25maWcmJih0PW8uY29uZmlnLmdldFByb21pc2VzRGVwZW5kZW5jeSgpKSx2b2lkIDA9PT10JiYidW5kZWZpbmVkIiE9dHlwZW9mIFByb21pc2UmJih0PVByb21pc2UpLCJmdW5jdGlvbiIhPXR5cGVvZiB0JiYobj0hMCksQXJyYXkuaXNBcnJheShlKXx8KGU9W2VdKTtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIGk9ZVtyXTtuP2kuZGVsZXRlUHJvbWlzZXNGcm9tQ2xhc3MmJmkuZGVsZXRlUHJvbWlzZXNGcm9tQ2xhc3MoKTppLmFkZFByb21pc2VzVG9DbGFzcyYmaS5hZGRQcm9taXNlc1RvQ2xhc3ModCl9fSxwcm9taXNpZnlNZXRob2Q6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLHI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtyZXR1cm4gbmV3IHQoKGZ1bmN0aW9uKHQsbyl7ci5wdXNoKChmdW5jdGlvbihlLG4pe2U/byhlKTp0KG4pfSkpLG5bZV0uYXBwbHkobixyKX0pKX19LGlzRHVhbHN0YWNrQXZhaWxhYmxlOmZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiExO3ZhciBuPWUoIi4uL2FwaXMvbWV0YWRhdGEuanNvbiIpO3JldHVybiJzdHJpbmciIT10eXBlb2YgdCYmKHQ9dC5zZXJ2aWNlSWRlbnRpZmllciksISgic3RyaW5nIiE9dHlwZW9mIHR8fCFuLmhhc093blByb3BlcnR5KHQpfHwhblt0XS5kdWFsc3RhY2tBdmFpbGFibGUpfSxjYWxjdWxhdGVSZXRyeURlbGF5OmZ1bmN0aW9uKGUsdCxuKXt0fHwodD17fSk7dmFyIHI9dC5jdXN0b21CYWNrb2ZmfHxudWxsO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiByKXJldHVybiByKGUsbik7dmFyIG89Im51bWJlciI9PXR5cGVvZiB0LmJhc2U/dC5iYXNlOjEwMDtyZXR1cm4gTWF0aC5yYW5kb20oKSooTWF0aC5wb3coMixlKSpvKX0saGFuZGxlUmVxdWVzdFdpdGhSZXRyaWVzOmZ1bmN0aW9uKGUsdCxuKXt0fHwodD17fSk7dmFyIHI9by5IdHRwQ2xpZW50LmdldEluc3RhbmNlKCkscz10Lmh0dHBPcHRpb25zfHx7fSxhPTAsYz1mdW5jdGlvbihlKXt2YXIgcj10Lm1heFJldHJpZXN8fDA7aWYoZSYmIlRpbWVvdXRFcnJvciI9PT1lLmNvZGUmJihlLnJldHJ5YWJsZT0hMCksZSYmZS5yZXRyeWFibGUmJmE8cil7dmFyIG89aS5jYWxjdWxhdGVSZXRyeURlbGF5KGEsdC5yZXRyeURlbGF5T3B0aW9ucyxlKTtpZihvPj0wKXJldHVybiBhKyssdm9pZCBzZXRUaW1lb3V0KHUsbysoZS5yZXRyeUFmdGVyfHwwKSl9bihlKX0sdT1mdW5jdGlvbigpe3ZhciB0PSIiO3IuaGFuZGxlUmVxdWVzdChlLHMsKGZ1bmN0aW9uKGUpe2Uub24oImRhdGEiLChmdW5jdGlvbihlKXt0Kz1lLnRvU3RyaW5nKCl9KSksZS5vbigiZW5kIiwoZnVuY3Rpb24oKXt2YXIgcj1lLnN0YXR1c0NvZGU7aWYocjwzMDApbihudWxsLHQpO2Vsc2V7dmFyIG89MWUzKnBhcnNlSW50KGUuaGVhZGVyc1sicmV0cnktYWZ0ZXIiXSwxMCl8fDAscz1pLmVycm9yKG5ldyBFcnJvcix7c3RhdHVzQ29kZTpyLHJldHJ5YWJsZTpyPj01MDB8fDQyOT09PXJ9KTtvJiZzLnJldHJ5YWJsZSYmKHMucmV0cnlBZnRlcj1vKSxjKHMpfX0pKX0pLGMpfTtvLnV0aWwuZGVmZXIodSl9LHV1aWQ6e3Y0OmZ1bmN0aW9uKCl7cmV0dXJuIGUoInV1aWQiKS52NCgpfX0sY29udmVydFBheWxvYWRUb1N0cmluZzpmdW5jdGlvbihlKXt2YXIgdD1lLnJlcXVlc3Qsbj10Lm9wZXJhdGlvbixyPXQuc2VydmljZS5hcGkub3BlcmF0aW9uc1tuXS5vdXRwdXR8fHt9O3IucGF5bG9hZCYmZS5kYXRhW3IucGF5bG9hZF0mJihlLmRhdGFbci5wYXlsb2FkXT1lLmRhdGFbci5wYXlsb2FkXS50b1N0cmluZygpKX0sZGVmZXI6ZnVuY3Rpb24oZSl7Im9iamVjdCI9PXR5cGVvZiBuJiYiZnVuY3Rpb24iPT10eXBlb2Ygbi5uZXh0VGljaz9uLm5leHRUaWNrKGUpOiJmdW5jdGlvbiI9PXR5cGVvZiByP3IoZSk6c2V0VGltZW91dChlLDApfSxnZXRSZXF1ZXN0UGF5bG9hZFNoYXBlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9ucztpZih0KXt2YXIgbj0odHx8e30pW2Uub3BlcmF0aW9uXTtpZihuJiZuLmlucHV0JiZuLmlucHV0LnBheWxvYWQpcmV0dXJuIG4uaW5wdXQubWVtYmVyc1tuLmlucHV0LnBheWxvYWRdfX0sZ2V0UHJvZmlsZXNGcm9tU2hhcmVkQ29uZmlnOmZ1bmN0aW9uKGUsdCl7dmFyIHI9e30sbz17fTtuLmVudltpLmNvbmZpZ09wdEluRW52XSYmKG89ZS5sb2FkRnJvbSh7aXNDb25maWc6ITAsZmlsZW5hbWU6bi5lbnZbaS5zaGFyZWRDb25maWdGaWxlRW52XX0pKTt2YXIgcz17fTt0cnl7cz1lLmxvYWRGcm9tKHtmaWxlbmFtZTp0fHxuLmVudltpLmNvbmZpZ09wdEluRW52XSYmbi5lbnZbaS5zaGFyZWRDcmVkZW50aWFsc0ZpbGVFbnZdfSl9Y2F0Y2goZSl7aWYoIW4uZW52W2kuY29uZmlnT3B0SW5FbnZdKXRocm93IGV9Zm9yKHZhciBhPTAsYz1PYmplY3Qua2V5cyhvKTthPGMubGVuZ3RoO2ErKylyW2NbYV1dPXUocltjW2FdXXx8e30sb1tjW2FdXSk7Zm9yKGE9MCxjPU9iamVjdC5rZXlzKHMpO2E8Yy5sZW5ndGg7YSsrKXJbY1thXV09dShyW2NbYV1dfHx7fSxzW2NbYV1dKTtyZXR1cm4gcjtmdW5jdGlvbiB1KGUsdCl7Zm9yKHZhciBuPTAscj1PYmplY3Qua2V5cyh0KTtuPHIubGVuZ3RoO24rKyllW3Jbbl1dPXRbcltuXV07cmV0dXJuIGV9fSxBUk46e3ZhbGlkYXRlOmZ1bmN0aW9uKGUpe3JldHVybiBlJiYwPT09ZS5pbmRleE9mKCJhcm46IikmJmUuc3BsaXQoIjoiKS5sZW5ndGg+PTZ9LHBhcnNlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuc3BsaXQoIjoiKTtyZXR1cm57cGFydGl0aW9uOnRbMV0sc2VydmljZTp0WzJdLHJlZ2lvbjp0WzNdLGFjY291bnRJZDp0WzRdLHJlc291cmNlOnQuc2xpY2UoNSkuam9pbigiOiIpfX0sYnVpbGQ6ZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09ZS5zZXJ2aWNlfHx2b2lkIDA9PT1lLnJlZ2lvbnx8dm9pZCAwPT09ZS5hY2NvdW50SWR8fHZvaWQgMD09PWUucmVzb3VyY2UpdGhyb3cgaS5lcnJvcihuZXcgRXJyb3IoIklucHV0IEFSTiBvYmplY3QgaXMgaW52YWxpZCIpKTtyZXR1cm4iYXJuOiIrKGUucGFydGl0aW9ufHwiYXdzIikrIjoiK2Uuc2VydmljZSsiOiIrZS5yZWdpb24rIjoiK2UuYWNjb3VudElkKyI6IitlLnJlc291cmNlfX0sZGVmYXVsdFByb2ZpbGU6ImRlZmF1bHQiLGNvbmZpZ09wdEluRW52OiJBV1NfU0RLX0xPQURfQ09ORklHIixzaGFyZWRDcmVkZW50aWFsc0ZpbGVFbnY6IkFXU19TSEFSRURfQ1JFREVOVElBTFNfRklMRSIsc2hhcmVkQ29uZmlnRmlsZUVudjoiQVdTX0NPTkZJR19GSUxFIixpbWRzRGlzYWJsZWRFbnY6IkFXU19FQzJfTUVUQURBVEFfRElTQUJMRUQifTt0LmV4cG9ydHM9aX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgiX3Byb2Nlc3MiKSxlKCJ0aW1lcnMiKS5zZXRJbW1lZGlhdGUpfSx7Ii4uL2FwaXMvbWV0YWRhdGEuanNvbiI6NCwiLi9jb3JlIjoxOSxfcHJvY2Vzczo5Mixmczo4Mix0aW1lcnM6OTksdXVpZDoxMDJ9XSw3NTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKSxvPWUoIi4uL21vZGVsL3NoYXBlIik7ZnVuY3Rpb24gaSgpe31mdW5jdGlvbiBzKGUsdCl7Zm9yKHZhciBuPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUodCkscj0wLG89bi5sZW5ndGg7cjxvO3IrKylpZihuW3JdLnBhcmVudE5vZGU9PT1lKXJldHVybiBuW3JdfWZ1bmN0aW9uIGEoZSx0KXtzd2l0Y2godHx8KHQ9e30pLHQudHlwZSl7Y2FzZSJzdHJ1Y3R1cmUiOnJldHVybiBjKGUsdCk7Y2FzZSJtYXAiOnJldHVybiBmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj17fSxyPXQua2V5Lm5hbWV8fCJrZXkiLG89dC52YWx1ZS5uYW1lfHwidmFsdWUiLGk9dC5mbGF0dGVuZWQ/dC5uYW1lOiJlbnRyeSIsYz1lLmZpcnN0RWxlbWVudENoaWxkO2M7KXtpZihjLm5vZGVOYW1lPT09aSl7dmFyIHU9cyhjLHIpLnRleHRDb250ZW50LGw9cyhjLG8pO25bdV09YShsLHQudmFsdWUpfWM9Yy5uZXh0RWxlbWVudFNpYmxpbmd9cmV0dXJuIG59KGUsdCk7Y2FzZSJsaXN0IjpyZXR1cm4gZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49W10scj10LmZsYXR0ZW5lZD90Lm5hbWU6dC5tZW1iZXIubmFtZXx8Im1lbWJlciIsbz1lLmZpcnN0RWxlbWVudENoaWxkO287KW8ubm9kZU5hbWU9PT1yJiZuLnB1c2goYShvLHQubWVtYmVyKSksbz1vLm5leHRFbGVtZW50U2libGluZztyZXR1cm4gbn0oZSx0KTtjYXNlIHZvaWQgMDpjYXNlIG51bGw6cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKG51bGw9PWUpcmV0dXJuIiI7aWYoIWUuZmlyc3RFbGVtZW50Q2hpbGQpcmV0dXJuIG51bGw9PT1lLnBhcmVudE5vZGUucGFyZW50Tm9kZT97fTowPT09ZS5jaGlsZE5vZGVzLmxlbmd0aD8iIjplLnRleHRDb250ZW50O2Zvcih2YXIgdD17dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fSxuPWUuZmlyc3RFbGVtZW50Q2hpbGQ7bjspe3ZhciByPW4ubm9kZU5hbWU7T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQubWVtYmVycyxyKT90Lm1lbWJlcnNbcl0udHlwZT0ibGlzdCI6dC5tZW1iZXJzW3JdPXtuYW1lOnJ9LG49bi5uZXh0RWxlbWVudFNpYmxpbmd9cmV0dXJuIGMoZSx0KX0oZSk7ZGVmYXVsdDpyZXR1cm4gZnVuY3Rpb24oZSx0KXtpZihlLmdldEF0dHJpYnV0ZSl7dmFyIG49ZS5nZXRBdHRyaWJ1dGUoImVuY29kaW5nIik7ImJhc2U2NCI9PT1uJiYodD1uZXcgby5jcmVhdGUoe3R5cGU6bn0pKX12YXIgcj1lLnRleHRDb250ZW50O3JldHVybiIiPT09ciYmKHI9bnVsbCksImZ1bmN0aW9uIj09dHlwZW9mIHQudG9UeXBlP3QudG9UeXBlKHIpOnJ9KGUsdCl9fWZ1bmN0aW9uIGMoZSx0KXt2YXIgbj17fTtyZXR1cm4gbnVsbD09PWV8fHIuZWFjaCh0Lm1lbWJlcnMsKGZ1bmN0aW9uKHIsbyl7aWYoby5pc1htbEF0dHJpYnV0ZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUuYXR0cmlidXRlcyxvLm5hbWUpKXt2YXIgaT1lLmF0dHJpYnV0ZXNbby5uYW1lXS52YWx1ZTtuW3JdPWEoe3RleHRDb250ZW50Oml9LG8pfX1lbHNle3ZhciBjPW8uZmxhdHRlbmVkP2U6cyhlLG8ubmFtZSk7Yz9uW3JdPWEoYyxvKTpvLmZsYXR0ZW5lZHx8Imxpc3QiIT09by50eXBlfHx0LmFwaS54bWxOb0RlZmF1bHRMaXN0c3x8KG5bcl09by5kZWZhdWx0VmFsdWUpfX0pKSxufWkucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKGUsdCl7aWYoIiI9PT1lLnJlcGxhY2UoL15ccysvLCIiKSlyZXR1cm57fTt2YXIgbixvO3RyeXtpZih3aW5kb3cuRE9NUGFyc2VyKXt0cnl7bj0obmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGUsInRleHQveG1sIil9Y2F0Y2goZSl7dGhyb3cgci5lcnJvcihuZXcgRXJyb3IoIlBhcnNlIGVycm9yIGluIGRvY3VtZW50Iikse29yaWdpbmFsRXJyb3I6ZSxjb2RlOiJYTUxQYXJzZXJFcnJvciIscmV0cnlhYmxlOiEwfSl9aWYobnVsbD09PW4uZG9jdW1lbnRFbGVtZW50KXRocm93IHIuZXJyb3IobmV3IEVycm9yKCJDYW5ub3QgcGFyc2UgZW1wdHkgZG9jdW1lbnQuIikse2NvZGU6IlhNTFBhcnNlckVycm9yIixyZXRyeWFibGU6ITB9KTt2YXIgaT1uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpWzBdO2lmKGkmJihpLnBhcmVudE5vZGU9PT1ufHwiYm9keSI9PT1pLnBhcmVudE5vZGUubm9kZU5hbWV8fGkucGFyZW50Tm9kZS5wYXJlbnROb2RlPT09bnx8ImJvZHkiPT09aS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWUpKXt2YXIgYz1pLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKVswXXx8aTt0aHJvdyByLmVycm9yKG5ldyBFcnJvcihjLnRleHRDb250ZW50fHwiUGFyc2VyIGVycm9yIGluIGRvY3VtZW50Iikse2NvZGU6IlhNTFBhcnNlckVycm9yIixyZXRyeWFibGU6ITB9KX19ZWxzZXtpZighd2luZG93LkFjdGl2ZVhPYmplY3QpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgbG9hZCBYTUwgcGFyc2VyIik7aWYoKG49bmV3IHdpbmRvdy5BY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MRE9NIikpLmFzeW5jPSExLCFuLmxvYWRYTUwoZSkpdGhyb3cgci5lcnJvcihuZXcgRXJyb3IoIlBhcnNlIGVycm9yIGluIGRvY3VtZW50Iikse2NvZGU6IlhNTFBhcnNlckVycm9yIixyZXRyeWFibGU6ITB9KX19Y2F0Y2goZSl7bz1lfWlmKG4mJm4uZG9jdW1lbnRFbGVtZW50JiYhbyl7dmFyIHU9YShuLmRvY3VtZW50RWxlbWVudCx0KSxsPXMobi5kb2N1bWVudEVsZW1lbnQsIlJlc3BvbnNlTWV0YWRhdGEiKTtyZXR1cm4gbCYmKHUuUmVzcG9uc2VNZXRhZGF0YT1hKGwse30pKSx1fWlmKG8pdGhyb3cgci5lcnJvcihvfHxuZXcgRXJyb3Ise2NvZGU6IlhNTFBhcnNlckVycm9yIixyZXRyeWFibGU6ITB9KTtyZXR1cm57fX0sdC5leHBvcnRzPWl9LHsiLi4vbW9kZWwvc2hhcGUiOjQ1LCIuLi91dGlsIjo3NH1dLDc2OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpLG89ZSgiLi94bWwtbm9kZSIpLlhtbE5vZGUsaT1lKCIuL3htbC10ZXh0IikuWG1sVGV4dDtmdW5jdGlvbiBzKCl7fWZ1bmN0aW9uIGEoZSx0LG4pe3N3aXRjaChuLnR5cGUpe2Nhc2Uic3RydWN0dXJlIjpyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe3IuYXJyYXlFYWNoKG4ubWVtYmVyTmFtZXMsKGZ1bmN0aW9uKHIpe3ZhciBpPW4ubWVtYmVyc1tyXTtpZigiYm9keSI9PT1pLmxvY2F0aW9uKXt2YXIgcz10W3JdLHU9aS5uYW1lO2lmKG51bGwhPXMpaWYoaS5pc1htbEF0dHJpYnV0ZSllLmFkZEF0dHJpYnV0ZSh1LHMpO2Vsc2UgaWYoaS5mbGF0dGVuZWQpYShlLHMsaSk7ZWxzZXt2YXIgbD1uZXcgbyh1KTtlLmFkZENoaWxkTm9kZShsKSxjKGwsaSksYShsLHMsaSl9fX0pKX0oZSx0LG4pO2Nhc2UibWFwIjpyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe3ZhciBpPW4ua2V5Lm5hbWV8fCJrZXkiLHM9bi52YWx1ZS5uYW1lfHwidmFsdWUiO3IuZWFjaCh0LChmdW5jdGlvbih0LHIpe3ZhciBjPW5ldyBvKG4uZmxhdHRlbmVkP24ubmFtZToiZW50cnkiKTtlLmFkZENoaWxkTm9kZShjKTt2YXIgdT1uZXcgbyhpKSxsPW5ldyBvKHMpO2MuYWRkQ2hpbGROb2RlKHUpLGMuYWRkQ2hpbGROb2RlKGwpLGEodSx0LG4ua2V5KSxhKGwscixuLnZhbHVlKX0pKX0oZSx0LG4pO2Nhc2UibGlzdCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXtuLmZsYXR0ZW5lZD9yLmFycmF5RWFjaCh0LChmdW5jdGlvbih0KXt2YXIgcj1uLm1lbWJlci5uYW1lfHxuLm5hbWUsaT1uZXcgbyhyKTtlLmFkZENoaWxkTm9kZShpKSxhKGksdCxuLm1lbWJlcil9KSk6ci5hcnJheUVhY2godCwoZnVuY3Rpb24odCl7dmFyIHI9bi5tZW1iZXIubmFtZXx8Im1lbWJlciIsaT1uZXcgbyhyKTtlLmFkZENoaWxkTm9kZShpKSxhKGksdCxuLm1lbWJlcil9KSl9KGUsdCxuKTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbihlLHQsbil7ZS5hZGRDaGlsZE5vZGUobmV3IGkobi50b1dpcmVGb3JtYXQodCkpKX0oZSx0LG4pfX1mdW5jdGlvbiBjKGUsdCxuKXt2YXIgcixvPSJ4bWxucyI7dC54bWxOYW1lc3BhY2VVcmk/KHI9dC54bWxOYW1lc3BhY2VVcmksdC54bWxOYW1lc3BhY2VQcmVmaXgmJihvKz0iOiIrdC54bWxOYW1lc3BhY2VQcmVmaXgpKTpuJiZ0LmFwaS54bWxOYW1lc3BhY2VVcmkmJihyPXQuYXBpLnhtbE5hbWVzcGFjZVVyaSksciYmZS5hZGRBdHRyaWJ1dGUobyxyKX1zLnByb3RvdHlwZS50b1hNTD1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT1uZXcgbyhuKTtyZXR1cm4gYyhpLHQsITApLGEoaSxlLHQpLGkuY2hpbGRyZW4ubGVuZ3RoPjB8fHI/aS50b1N0cmluZygpOiIifSx0LmV4cG9ydHM9c30seyIuLi91dGlsIjo3NCwiLi94bWwtbm9kZSI6NzksIi4veG1sLXRleHQiOjgwfV0sNzc6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e2VzY2FwZUF0dHJpYnV0ZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvJy9nLCImYXBvczsiKS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKS5yZXBsYWNlKC8iL2csIiZxdW90OyIpfX19LHt9XSw3ODpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17ZXNjYXBlRWxlbWVudDpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvXHIvZywiJiN4MEQ7IikucmVwbGFjZSgvXG4vZywiJiN4MEE7IikucmVwbGFjZSgvXHUwMDg1L2csIiYjeDg1OyIpLnJlcGxhY2UoL1x1MjAyOC8sIiYjeDIwMjg7Iil9fX0se31dLDc5OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9lc2NhcGUtYXR0cmlidXRlIikuZXNjYXBlQXR0cmlidXRlO2Z1bmN0aW9uIG8oZSx0KXt2b2lkIDA9PT10JiYodD1bXSksdGhpcy5uYW1lPWUsdGhpcy5jaGlsZHJlbj10LHRoaXMuYXR0cmlidXRlcz17fX1vLnByb3RvdHlwZS5hZGRBdHRyaWJ1dGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW2VdPXQsdGhpc30sby5wcm90b3R5cGUuYWRkQ2hpbGROb2RlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNoaWxkcmVuLnB1c2goZSksdGhpc30sby5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlPWZ1bmN0aW9uKGUpe3JldHVybiBkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW2VdLHRoaXN9LG8ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPUJvb2xlYW4odGhpcy5jaGlsZHJlbi5sZW5ndGgpLHQ9IjwiK3RoaXMubmFtZSxuPXRoaXMuYXR0cmlidXRlcyxvPTAsaT1PYmplY3Qua2V5cyhuKTtvPGkubGVuZ3RoO28rKyl7dmFyIHM9aVtvXSxhPW5bc107bnVsbCE9YSYmKHQrPSIgIitzKyc9IicrcigiIithKSsnIicpfXJldHVybiB0KyhlPyI+Iit0aGlzLmNoaWxkcmVuLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9TdHJpbmcoKX0pKS5qb2luKCIiKSsiPC8iK3RoaXMubmFtZSsiPiI6Ii8+Iil9LHQuZXhwb3J0cz17WG1sTm9kZTpvfX0seyIuL2VzY2FwZS1hdHRyaWJ1dGUiOjc3fV0sODA6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2VzY2FwZS1lbGVtZW50IikuZXNjYXBlRWxlbWVudDtmdW5jdGlvbiBvKGUpe3RoaXMudmFsdWU9ZX1vLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiByKCIiK3RoaXMudmFsdWUpfSx0LmV4cG9ydHM9e1htbFRleHQ6b319LHsiLi9lc2NhcGUtZWxlbWVudCI6Nzh9XSw4MTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLmJ5dGVMZW5ndGg9ZnVuY3Rpb24oZSl7dmFyIHQ9YyhlKSxuPXRbMF0scj10WzFdO3JldHVybiAzKihuK3IpLzQtcn0sbi50b0J5dGVBcnJheT1mdW5jdGlvbihlKXt2YXIgdCxuLHI9YyhlKSxzPXJbMF0sYT1yWzFdLHU9bmV3IGkoZnVuY3Rpb24oZSx0LG4pe3JldHVybiAzKih0K24pLzQtbn0oMCxzLGEpKSxsPTAscD1hPjA/cy00OnM7Zm9yKG49MDtuPHA7bis9NCl0PW9bZS5jaGFyQ29kZUF0KG4pXTw8MTh8b1tlLmNoYXJDb2RlQXQobisxKV08PDEyfG9bZS5jaGFyQ29kZUF0KG4rMildPDw2fG9bZS5jaGFyQ29kZUF0KG4rMyldLHVbbCsrXT10Pj4xNiYyNTUsdVtsKytdPXQ+PjgmMjU1LHVbbCsrXT0yNTUmdDtyZXR1cm4gMj09PWEmJih0PW9bZS5jaGFyQ29kZUF0KG4pXTw8MnxvW2UuY2hhckNvZGVBdChuKzEpXT4+NCx1W2wrK109MjU1JnQpLDE9PT1hJiYodD1vW2UuY2hhckNvZGVBdChuKV08PDEwfG9bZS5jaGFyQ29kZUF0KG4rMSldPDw0fG9bZS5jaGFyQ29kZUF0KG4rMildPj4yLHVbbCsrXT10Pj44JjI1NSx1W2wrK109MjU1JnQpLHV9LG4uZnJvbUJ5dGVBcnJheT1mdW5jdGlvbihlKXtmb3IodmFyIHQsbj1lLmxlbmd0aCxvPW4lMyxpPVtdLHM9MTYzODMsYT0wLGM9bi1vO2E8YzthKz1zKWkucHVzaCh1KGUsYSxhK3M+Yz9jOmErcykpO3JldHVybiAxPT09bz8odD1lW24tMV0saS5wdXNoKHJbdD4+Ml0rclt0PDw0JjYzXSsiPT0iKSk6Mj09PW8mJih0PShlW24tMl08PDgpK2Vbbi0xXSxpLnB1c2goclt0Pj4xMF0rclt0Pj40JjYzXStyW3Q8PDImNjNdKyI9IikpLGkuam9pbigiIil9O2Zvcih2YXIgcj1bXSxvPVtdLGk9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P1VpbnQ4QXJyYXk6QXJyYXkscz0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIsYT0wO2E8NjQ7KythKXJbYV09c1thXSxvW3MuY2hhckNvZGVBdChhKV09YTtmdW5jdGlvbiBjKGUpe3ZhciB0PWUubGVuZ3RoO2lmKHQlND4wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIpO3ZhciBuPWUuaW5kZXhPZigiPSIpO3JldHVybi0xPT09biYmKG49dCksW24sbj09PXQ/MDo0LW4lNF19ZnVuY3Rpb24gdShlLHQsbil7Zm9yKHZhciBvLGkscz1bXSxhPXQ7YTxuO2ErPTMpbz0oZVthXTw8MTYmMTY3MTE2ODApKyhlW2ErMV08PDgmNjUyODApKygyNTUmZVthKzJdKSxzLnB1c2goclsoaT1vKT4+MTgmNjNdK3JbaT4+MTImNjNdK3JbaT4+NiY2M10rcls2MyZpXSk7cmV0dXJuIHMuam9pbigiIil9b1siLSIuY2hhckNvZGVBdCgwKV09NjIsb1siXyIuY2hhckNvZGVBdCgwKV09NjN9LHt9XSw4MjpbZnVuY3Rpb24oZSx0LG4pe30se31dLDgzOltmdW5jdGlvbihlLHQsbil7ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7ZS5zdXBlcl89dCxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KX06dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7ZS5zdXBlcl89dDt2YXIgbj1mdW5jdGlvbigpe307bi5wcm90b3R5cGU9dC5wcm90b3R5cGUsZS5wcm90b3R5cGU9bmV3IG4sZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZX19LHt9XSw4NDpbZnVuY3Rpb24oZSx0LG8peyhmdW5jdGlvbihlKXsoZnVuY3Rpb24oKXshZnVuY3Rpb24oaSl7Im9iamVjdCI9PXR5cGVvZiBvJiZvJiZvLm5vZGVUeXBlLCJvYmplY3QiPT10eXBlb2YgdCYmdCYmdC5ub2RlVHlwZTt2YXIgcz0ib2JqZWN0Ij09dHlwZW9mIGUmJmU7cy5nbG9iYWwhPT1zJiZzLndpbmRvdyE9PXMmJnMuc2VsZjt2YXIgYSxjPTIxNDc0ODM2NDcsdT0zNixsPTEscD0yNixkPTM4LGg9NzAwLGY9NzIsZz0xMjgsbT0iLSIsdj0vXnhuLS0vLHk9L1teXHgyMC1ceDdFXS8sRT0vW1x4MkVcdTMwMDJcdUZGMEVcdUZGNjFdL2csUz17b3ZlcmZsb3c6Ik92ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzIiwibm90LWJhc2ljIjoiSWxsZWdhbCBpbnB1dCA+PSAweDgwIChub3QgYSBiYXNpYyBjb2RlIHBvaW50KSIsImludmFsaWQtaW5wdXQiOiJJbnZhbGlkIGlucHV0In0sYj11LWwsVD1NYXRoLmZsb29yLEM9U3RyaW5nLmZyb21DaGFyQ29kZTtmdW5jdGlvbiBJKGUpe3Rocm93IFJhbmdlRXJyb3IoU1tlXSl9ZnVuY3Rpb24gQShlLHQpe2Zvcih2YXIgbj1lLmxlbmd0aCxyPVtdO24tLTspcltuXT10KGVbbl0pO3JldHVybiByfWZ1bmN0aW9uIF8oZSx0KXt2YXIgbj1lLnNwbGl0KCJAIikscj0iIjtyZXR1cm4gbi5sZW5ndGg+MSYmKHI9blswXSsiQCIsZT1uWzFdKSxyK0EoKGU9ZS5yZXBsYWNlKEUsIi4iKSkuc3BsaXQoIi4iKSx0KS5qb2luKCIuIil9ZnVuY3Rpb24gdyhlKXtmb3IodmFyIHQsbixyPVtdLG89MCxpPWUubGVuZ3RoO288aTspKHQ9ZS5jaGFyQ29kZUF0KG8rKykpPj01NTI5NiYmdDw9NTYzMTkmJm88aT81NjMyMD09KDY0NTEyJihuPWUuY2hhckNvZGVBdChvKyspKSk/ci5wdXNoKCgoMTAyMyZ0KTw8MTApKygxMDIzJm4pKzY1NTM2KTooci5wdXNoKHQpLG8tLSk6ci5wdXNoKHQpO3JldHVybiByfWZ1bmN0aW9uIFIoZSl7cmV0dXJuIEEoZSwoZnVuY3Rpb24oZSl7dmFyIHQ9IiI7cmV0dXJuIGU+NjU1MzUmJih0Kz1DKChlLT02NTUzNik+Pj4xMCYxMDIzfDU1Mjk2KSxlPTU2MzIwfDEwMjMmZSksdCs9QyhlKX0pKS5qb2luKCIiKX1mdW5jdGlvbiBrKGUsdCl7cmV0dXJuIGUrMjIrNzUqKGU8MjYpLSgoMCE9dCk8PDUpfWZ1bmN0aW9uIEwoZSx0LG4pe3ZhciByPTA7Zm9yKGU9bj9UKGUvaCk6ZT4+MSxlKz1UKGUvdCk7ZT5iKnA+PjE7cis9dSllPVQoZS9iKTtyZXR1cm4gVChyKyhiKzEpKmUvKGUrZCkpfWZ1bmN0aW9uIE4oZSl7dmFyIHQsbixyLG8saSxzLGEsZCxoLHYseSxFPVtdLFM9ZS5sZW5ndGgsYj0wLEM9ZyxBPWY7Zm9yKChuPWUubGFzdEluZGV4T2YobSkpPDAmJihuPTApLHI9MDtyPG47KytyKWUuY2hhckNvZGVBdChyKT49MTI4JiZJKCJub3QtYmFzaWMiKSxFLnB1c2goZS5jaGFyQ29kZUF0KHIpKTtmb3Iobz1uPjA/bisxOjA7bzxTOyl7Zm9yKGk9YixzPTEsYT11O28+PVMmJkkoImludmFsaWQtaW5wdXQiKSwoKGQ9KHk9ZS5jaGFyQ29kZUF0KG8rKykpLTQ4PDEwP3ktMjI6eS02NTwyNj95LTY1OnktOTc8MjY/eS05Nzp1KT49dXx8ZD5UKChjLWIpL3MpKSYmSSgib3ZlcmZsb3ciKSxiKz1kKnMsIShkPChoPWE8PUE/bDphPj1BK3A/cDphLUEpKTthKz11KXM+VChjLyh2PXUtaCkpJiZJKCJvdmVyZmxvdyIpLHMqPXY7QT1MKGItaSx0PUUubGVuZ3RoKzEsMD09aSksVChiL3QpPmMtQyYmSSgib3ZlcmZsb3ciKSxDKz1UKGIvdCksYiU9dCxFLnNwbGljZShiKyssMCxDKX1yZXR1cm4gUihFKX1mdW5jdGlvbiBPKGUpe3ZhciB0LG4scixvLGkscyxhLGQsaCx2LHksRSxTLGIsQSxfPVtdO2ZvcihFPShlPXcoZSkpLmxlbmd0aCx0PWcsbj0wLGk9ZixzPTA7czxFOysrcykoeT1lW3NdKTwxMjgmJl8ucHVzaChDKHkpKTtmb3Iocj1vPV8ubGVuZ3RoLG8mJl8ucHVzaChtKTtyPEU7KXtmb3IoYT1jLHM9MDtzPEU7KytzKSh5PWVbc10pPj10JiZ5PGEmJihhPXkpO2ZvcihhLXQ+VCgoYy1uKS8oUz1yKzEpKSYmSSgib3ZlcmZsb3ciKSxuKz0oYS10KSpTLHQ9YSxzPTA7czxFOysrcylpZigoeT1lW3NdKTx0JiYrK24+YyYmSSgib3ZlcmZsb3ciKSx5PT10KXtmb3IoZD1uLGg9dTshKGQ8KHY9aDw9aT9sOmg+PWkrcD9wOmgtaSkpO2grPXUpQT1kLXYsYj11LXYsXy5wdXNoKEMoayh2K0ElYiwwKSkpLGQ9VChBL2IpO18ucHVzaChDKGsoZCwwKSkpLGk9TChuLFMscj09byksbj0wLCsrcn0rK24sKyt0fXJldHVybiBfLmpvaW4oIiIpfWE9e3ZlcnNpb246IjEuMy4yIix1Y3MyOntkZWNvZGU6dyxlbmNvZGU6Un0sZGVjb2RlOk4sZW5jb2RlOk8sdG9BU0NJSTpmdW5jdGlvbihlKXtyZXR1cm4gXyhlLChmdW5jdGlvbihlKXtyZXR1cm4geS50ZXN0KGUpPyJ4bi0tIitPKGUpOmV9KSl9LHRvVW5pY29kZTpmdW5jdGlvbihlKXtyZXR1cm4gXyhlLChmdW5jdGlvbihlKXtyZXR1cm4gdi50ZXN0KGUpP04oZS5zbGljZSg0KS50b0xvd2VyQ2FzZSgpKTplfSkpfX0sdm9pZCAwPT09KHI9ZnVuY3Rpb24oKXtyZXR1cm4gYX0uY2FsbChvLG4sbyx0KSl8fCh0LmV4cG9ydHM9cil9KCl9KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLHZvaWQgMCE9PW4uZz9uLmc6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9KX0se31dLDg1OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBlJiYib2JqZWN0Ij09dHlwZW9mIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNvcHkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmZpbGwmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnJlYWRVSW50OH19LHt9XSw4NjpbZnVuY3Rpb24oZSx0LHIpeyhmdW5jdGlvbih0LG4peyhmdW5jdGlvbigpe3ZhciBvPS8lW3NkaiVdL2c7ci5mb3JtYXQ9ZnVuY3Rpb24oZSl7aWYoIXYoZSkpe2Zvcih2YXIgdD1bXSxuPTA7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0LnB1c2goYShhcmd1bWVudHNbbl0pKTtyZXR1cm4gdC5qb2luKCIgIil9bj0xO2Zvcih2YXIgcj1hcmd1bWVudHMsaT1yLmxlbmd0aCxzPVN0cmluZyhlKS5yZXBsYWNlKG8sKGZ1bmN0aW9uKGUpe2lmKCIlJSI9PT1lKXJldHVybiIlIjtpZihuPj1pKXJldHVybiBlO3N3aXRjaChlKXtjYXNlIiVzIjpyZXR1cm4gU3RyaW5nKHJbbisrXSk7Y2FzZSIlZCI6cmV0dXJuIE51bWJlcihyW24rK10pO2Nhc2UiJWoiOnRyeXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkocltuKytdKX1jYXRjaChlKXtyZXR1cm4iW0NpcmN1bGFyXSJ9ZGVmYXVsdDpyZXR1cm4gZX19KSksYz1yW25dO248aTtjPXJbKytuXSlnKGMpfHwhUyhjKT9zKz0iICIrYzpzKz0iICIrYShjKTtyZXR1cm4gc30sci5kZXByZWNhdGU9ZnVuY3Rpb24oZSxvKXtpZih5KG4ucHJvY2VzcykpcmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHIuZGVwcmVjYXRlKGUsbykuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtpZighMD09PXQubm9EZXByZWNhdGlvbilyZXR1cm4gZTt2YXIgaT0hMTtyZXR1cm4gZnVuY3Rpb24oKXtpZighaSl7aWYodC50aHJvd0RlcHJlY2F0aW9uKXRocm93IG5ldyBFcnJvcihvKTt0LnRyYWNlRGVwcmVjYXRpb24/Y29uc29sZS50cmFjZShvKTpjb25zb2xlLmVycm9yKG8pLGk9ITB9cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX07dmFyIGkscz17fTtmdW5jdGlvbiBhKGUsdCl7dmFyIG49e3NlZW46W10sc3R5bGl6ZTp1fTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD49MyYmKG4uZGVwdGg9YXJndW1lbnRzWzJdKSxhcmd1bWVudHMubGVuZ3RoPj00JiYobi5jb2xvcnM9YXJndW1lbnRzWzNdKSxmKHQpP24uc2hvd0hpZGRlbj10OnQmJnIuX2V4dGVuZChuLHQpLHkobi5zaG93SGlkZGVuKSYmKG4uc2hvd0hpZGRlbj0hMSkseShuLmRlcHRoKSYmKG4uZGVwdGg9MikseShuLmNvbG9ycykmJihuLmNvbG9ycz0hMSkseShuLmN1c3RvbUluc3BlY3QpJiYobi5jdXN0b21JbnNwZWN0PSEwKSxuLmNvbG9ycyYmKG4uc3R5bGl6ZT1jKSxsKG4sZSxuLmRlcHRoKX1mdW5jdGlvbiBjKGUsdCl7dmFyIG49YS5zdHlsZXNbdF07cmV0dXJuIG4/IhtbIithLmNvbG9yc1tuXVswXSsibSIrZSsiG1siK2EuY29sb3JzW25dWzFdKyJtIjplfWZ1bmN0aW9uIHUoZSx0KXtyZXR1cm4gZX1mdW5jdGlvbiBsKGUsdCxuKXtpZihlLmN1c3RvbUluc3BlY3QmJnQmJkModC5pbnNwZWN0KSYmdC5pbnNwZWN0IT09ci5pbnNwZWN0JiYoIXQuY29uc3RydWN0b3J8fHQuY29uc3RydWN0b3IucHJvdG90eXBlIT09dCkpe3ZhciBvPXQuaW5zcGVjdChuLGUpO3JldHVybiB2KG8pfHwobz1sKGUsbyxuKSksb312YXIgaT1mdW5jdGlvbihlLHQpe2lmKHkodCkpcmV0dXJuIGUuc3R5bGl6ZSgidW5kZWZpbmVkIiwidW5kZWZpbmVkIik7aWYodih0KSl7dmFyIG49IiciK0pTT04uc3RyaW5naWZ5KHQpLnJlcGxhY2UoL14ifCIkL2csIiIpLnJlcGxhY2UoLycvZywiXFwnIikucmVwbGFjZSgvXFwiL2csJyInKSsiJyI7cmV0dXJuIGUuc3R5bGl6ZShuLCJzdHJpbmciKX1yZXR1cm4gbSh0KT9lLnN0eWxpemUoIiIrdCwibnVtYmVyIik6Zih0KT9lLnN0eWxpemUoIiIrdCwiYm9vbGVhbiIpOmcodCk/ZS5zdHlsaXplKCJudWxsIiwibnVsbCIpOnZvaWQgMH0oZSx0KTtpZihpKXJldHVybiBpO3ZhciBzPU9iamVjdC5rZXlzKHQpLGE9ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSxuKXt0W2VdPSEwfSkpLHR9KHMpO2lmKGUuc2hvd0hpZGRlbiYmKHM9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCkpLFQodCkmJihzLmluZGV4T2YoIm1lc3NhZ2UiKT49MHx8cy5pbmRleE9mKCJkZXNjcmlwdGlvbiIpPj0wKSlyZXR1cm4gcCh0KTtpZigwPT09cy5sZW5ndGgpe2lmKEModCkpe3ZhciBjPXQubmFtZT8iOiAiK3QubmFtZToiIjtyZXR1cm4gZS5zdHlsaXplKCJbRnVuY3Rpb24iK2MrIl0iLCJzcGVjaWFsIil9aWYoRSh0KSlyZXR1cm4gZS5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSwicmVnZXhwIik7aWYoYih0KSlyZXR1cm4gZS5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCksImRhdGUiKTtpZihUKHQpKXJldHVybiBwKHQpfXZhciB1LFM9IiIsST0hMSxBPVsieyIsIn0iXTtyZXR1cm4gaCh0KSYmKEk9ITAsQT1bIlsiLCJdIl0pLEModCkmJihTPSIgW0Z1bmN0aW9uIisodC5uYW1lPyI6ICIrdC5uYW1lOiIiKSsiXSIpLEUodCkmJihTPSIgIitSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpLGIodCkmJihTPSIgIitEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHQpKSxUKHQpJiYoUz0iICIrcCh0KSksMCE9PXMubGVuZ3RofHxJJiYwIT10Lmxlbmd0aD9uPDA/RSh0KT9lLnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLCJyZWdleHAiKTplLnN0eWxpemUoIltPYmplY3RdIiwic3BlY2lhbCIpOihlLnNlZW4ucHVzaCh0KSx1PUk/ZnVuY3Rpb24oZSx0LG4scixvKXtmb3IodmFyIGk9W10scz0wLGE9dC5sZW5ndGg7czxhOysrcyl3KHQsU3RyaW5nKHMpKT9pLnB1c2goZChlLHQsbixyLFN0cmluZyhzKSwhMCkpOmkucHVzaCgiIik7cmV0dXJuIG8uZm9yRWFjaCgoZnVuY3Rpb24obyl7by5tYXRjaCgvXlxkKyQvKXx8aS5wdXNoKGQoZSx0LG4scixvLCEwKSl9KSksaX0oZSx0LG4sYSxzKTpzLm1hcCgoZnVuY3Rpb24ocil7cmV0dXJuIGQoZSx0LG4sYSxyLEkpfSkpLGUuc2Vlbi5wb3AoKSxmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5yZWR1Y2UoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuaW5kZXhPZigiXG4iKSxlK3QucmVwbGFjZSgvXHUwMDFiXFtcZFxkP20vZywiIikubGVuZ3RoKzF9KSwwKTtyZXR1cm4gcj42MD9uWzBdKygiIj09PXQ/IiI6dCsiXG4gIikrIiAiK2Uuam9pbigiLFxuICAiKSsiICIrblsxXTpuWzBdK3QrIiAiK2Uuam9pbigiLCAiKSsiICIrblsxXX0odSxTLEEpKTpBWzBdK1MrQVsxXX1mdW5jdGlvbiBwKGUpe3JldHVybiJbIitFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSsiXSJ9ZnVuY3Rpb24gZChlLHQsbixyLG8saSl7dmFyIHMsYSxjO2lmKChjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxvKXx8e3ZhbHVlOnRbb119KS5nZXQ/YT1jLnNldD9lLnN0eWxpemUoIltHZXR0ZXIvU2V0dGVyXSIsInNwZWNpYWwiKTplLnN0eWxpemUoIltHZXR0ZXJdIiwic3BlY2lhbCIpOmMuc2V0JiYoYT1lLnN0eWxpemUoIltTZXR0ZXJdIiwic3BlY2lhbCIpKSx3KHIsbyl8fChzPSJbIitvKyJdIiksYXx8KGUuc2Vlbi5pbmRleE9mKGMudmFsdWUpPDA/KGE9ZyhuKT9sKGUsYy52YWx1ZSxudWxsKTpsKGUsYy52YWx1ZSxuLTEpKS5pbmRleE9mKCJcbiIpPi0xJiYoYT1pP2Euc3BsaXQoIlxuIikubWFwKChmdW5jdGlvbihlKXtyZXR1cm4iICAiK2V9KSkuam9pbigiXG4iKS5zdWJzdHIoMik6IlxuIithLnNwbGl0KCJcbiIpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIiAgICIrZX0pKS5qb2luKCJcbiIpKTphPWUuc3R5bGl6ZSgiW0NpcmN1bGFyXSIsInNwZWNpYWwiKSkseShzKSl7aWYoaSYmby5tYXRjaCgvXlxkKyQvKSlyZXR1cm4gYTsocz1KU09OLnN0cmluZ2lmeSgiIitvKSkubWF0Y2goL14iKFthLXpBLVpfXVthLXpBLVpfMC05XSopIiQvKT8ocz1zLnN1YnN0cigxLHMubGVuZ3RoLTIpLHM9ZS5zdHlsaXplKHMsIm5hbWUiKSk6KHM9cy5yZXBsYWNlKC8nL2csIlxcJyIpLnJlcGxhY2UoL1xcIi9nLCciJykucmVwbGFjZSgvKF4ifCIkKS9nLCInIikscz1lLnN0eWxpemUocywic3RyaW5nIikpfXJldHVybiBzKyI6ICIrYX1mdW5jdGlvbiBoKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpfWZ1bmN0aW9uIGYoZSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZX1mdW5jdGlvbiBnKGUpe3JldHVybiBudWxsPT09ZX1mdW5jdGlvbiBtKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZX1mdW5jdGlvbiB2KGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZX1mdW5jdGlvbiB5KGUpe3JldHVybiB2b2lkIDA9PT1lfWZ1bmN0aW9uIEUoZSl7cmV0dXJuIFMoZSkmJiJbb2JqZWN0IFJlZ0V4cF0iPT09SShlKX1mdW5jdGlvbiBTKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9PWV9ZnVuY3Rpb24gYihlKXtyZXR1cm4gUyhlKSYmIltvYmplY3QgRGF0ZV0iPT09SShlKX1mdW5jdGlvbiBUKGUpe3JldHVybiBTKGUpJiYoIltvYmplY3QgRXJyb3JdIj09PUkoZSl8fGUgaW5zdGFuY2VvZiBFcnJvcil9ZnVuY3Rpb24gQyhlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZX1mdW5jdGlvbiBJKGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24gQShlKXtyZXR1cm4gZTwxMD8iMCIrZS50b1N0cmluZygxMCk6ZS50b1N0cmluZygxMCl9ci5kZWJ1Z2xvZz1mdW5jdGlvbihlKXtpZih5KGkpJiYoaT10LmVudi5OT0RFX0RFQlVHfHwiIiksZT1lLnRvVXBwZXJDYXNlKCksIXNbZV0paWYobmV3IFJlZ0V4cCgiXFxiIitlKyJcXGIiLCJpIikudGVzdChpKSl7dmFyIG49dC5waWQ7c1tlXT1mdW5jdGlvbigpe3ZhciB0PXIuZm9ybWF0LmFwcGx5KHIsYXJndW1lbnRzKTtjb25zb2xlLmVycm9yKCIlcyAlZDogJXMiLGUsbix0KX19ZWxzZSBzW2VdPWZ1bmN0aW9uKCl7fTtyZXR1cm4gc1tlXX0sci5pbnNwZWN0PWEsYS5jb2xvcnM9e2JvbGQ6WzEsMjJdLGl0YWxpYzpbMywyM10sdW5kZXJsaW5lOls0LDI0XSxpbnZlcnNlOls3LDI3XSx3aGl0ZTpbMzcsMzldLGdyZXk6WzkwLDM5XSxibGFjazpbMzAsMzldLGJsdWU6WzM0LDM5XSxjeWFuOlszNiwzOV0sZ3JlZW46WzMyLDM5XSxtYWdlbnRhOlszNSwzOV0scmVkOlszMSwzOV0seWVsbG93OlszMywzOV19LGEuc3R5bGVzPXtzcGVjaWFsOiJjeWFuIixudW1iZXI6InllbGxvdyIsYm9vbGVhbjoieWVsbG93Iix1bmRlZmluZWQ6ImdyZXkiLG51bGw6ImJvbGQiLHN0cmluZzoiZ3JlZW4iLGRhdGU6Im1hZ2VudGEiLHJlZ2V4cDoicmVkIn0sci5pc0FycmF5PWgsci5pc0Jvb2xlYW49ZixyLmlzTnVsbD1nLHIuaXNOdWxsT3JVbmRlZmluZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWV9LHIuaXNOdW1iZXI9bSxyLmlzU3RyaW5nPXYsci5pc1N5bWJvbD1mdW5jdGlvbihlKXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIGV9LHIuaXNVbmRlZmluZWQ9eSxyLmlzUmVnRXhwPUUsci5pc09iamVjdD1TLHIuaXNEYXRlPWIsci5pc0Vycm9yPVQsci5pc0Z1bmN0aW9uPUMsci5pc1ByaW1pdGl2ZT1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWV8fCJib29sZWFuIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZXx8InN0cmluZyI9PXR5cGVvZiBlfHwic3ltYm9sIj09dHlwZW9mIGV8fHZvaWQgMD09PWV9LHIuaXNCdWZmZXI9ZSgiLi9zdXBwb3J0L2lzQnVmZmVyIik7dmFyIF89WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXTtmdW5jdGlvbiB3KGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfXIubG9nPWZ1bmN0aW9uKCl7dmFyIGUsdDtjb25zb2xlLmxvZygiJXMgLSAlcyIsKGU9bmV3IERhdGUsdD1bQShlLmdldEhvdXJzKCkpLEEoZS5nZXRNaW51dGVzKCkpLEEoZS5nZXRTZWNvbmRzKCkpXS5qb2luKCI6IiksW2UuZ2V0RGF0ZSgpLF9bZS5nZXRNb250aCgpXSx0XS5qb2luKCIgIikpLHIuZm9ybWF0LmFwcGx5KHIsYXJndW1lbnRzKSl9LHIuaW5oZXJpdHM9ZSgiaW5oZXJpdHMiKSxyLl9leHRlbmQ9ZnVuY3Rpb24oZSx0KXtpZighdHx8IVModCkpcmV0dXJuIGU7Zm9yKHZhciBuPU9iamVjdC5rZXlzKHQpLHI9bi5sZW5ndGg7ci0tOyllW25bcl1dPXRbbltyXV07cmV0dXJuIGV9fSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpLHZvaWQgMCE9PW4uZz9uLmc6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9KX0seyIuL3N1cHBvcnQvaXNCdWZmZXIiOjg1LF9wcm9jZXNzOjkyLGluaGVyaXRzOjgzfV0sODc6W2Z1bmN0aW9uKGUsdCxyKXsoZnVuY3Rpb24odCxuKXsoZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIG49ZSgiYmFzZTY0LWpzIiksbz1lKCJpZWVlNzU0IiksaT1lKCJpc2FycmF5Iik7ZnVuY3Rpb24gcygpe3JldHVybiBjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/MjE0NzQ4MzY0NzoxMDczNzQxODIzfWZ1bmN0aW9uIGEoZSx0KXtpZihzKCk8dCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgiKTtyZXR1cm4gYy5UWVBFRF9BUlJBWV9TVVBQT1JUPyhlPW5ldyBVaW50OEFycmF5KHQpKS5fX3Byb3RvX189Yy5wcm90b3R5cGU6KG51bGw9PT1lJiYoZT1uZXcgYyh0KSksZS5sZW5ndGg9dCksZX1mdW5jdGlvbiBjKGUsdCxuKXtpZighKGMuVFlQRURfQVJSQVlfU1VQUE9SVHx8dGhpcyBpbnN0YW5jZW9mIGMpKXJldHVybiBuZXcgYyhlLHQsbik7aWYoIm51bWJlciI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpO3JldHVybiBwKHRoaXMsZSl9cmV0dXJuIHUodGhpcyxlLHQsbil9ZnVuY3Rpb24gdShlLHQsbixyKXtpZigibnVtYmVyIj09dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9mdW5jdGlvbihlLHQsbixyKXtpZih0LmJ5dGVMZW5ndGgsbjwwfHx0LmJ5dGVMZW5ndGg8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kcyIpO2lmKHQuYnl0ZUxlbmd0aDxuKyhyfHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kcyIpO3JldHVybiB0PXZvaWQgMD09PW4mJnZvaWQgMD09PXI/bmV3IFVpbnQ4QXJyYXkodCk6dm9pZCAwPT09cj9uZXcgVWludDhBcnJheSh0LG4pOm5ldyBVaW50OEFycmF5KHQsbixyKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KGU9dCkuX19wcm90b19fPWMucHJvdG90eXBlOmU9ZChlLHQpLGV9KGUsdCxuLHIpOiJzdHJpbmciPT10eXBlb2YgdD9mdW5jdGlvbihlLHQsbil7aWYoInN0cmluZyI9PXR5cGVvZiBuJiYiIiE9PW58fChuPSJ1dGY4IiksIWMuaXNFbmNvZGluZyhuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciZW5jb2RpbmciIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgcj0wfGYodCxuKSxvPShlPWEoZSxyKSkud3JpdGUodCxuKTtyZXR1cm4gbyE9PXImJihlPWUuc2xpY2UoMCxvKSksZX0oZSx0LG4pOmZ1bmN0aW9uKGUsdCl7aWYoYy5pc0J1ZmZlcih0KSl7dmFyIG49MHxoKHQubGVuZ3RoKTtyZXR1cm4gMD09PShlPWEoZSxuKSkubGVuZ3RofHx0LmNvcHkoZSwwLDAsbiksZX1pZih0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZ0LmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwibGVuZ3RoImluIHQpcmV0dXJuIm51bWJlciIhPXR5cGVvZiB0Lmxlbmd0aHx8KHI9dC5sZW5ndGgpIT1yP2EoZSwwKTpkKGUsdCk7aWYoIkJ1ZmZlciI9PT10LnR5cGUmJmkodC5kYXRhKSlyZXR1cm4gZChlLHQuZGF0YSl9dmFyIHI7dGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LiIpfShlLHQpfWZ1bmN0aW9uIGwoZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJyk7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKX1mdW5jdGlvbiBwKGUsdCl7aWYobCh0KSxlPWEoZSx0PDA/MDowfGgodCkpLCFjLlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKHZhciBuPTA7bjx0OysrbillW25dPTA7cmV0dXJuIGV9ZnVuY3Rpb24gZChlLHQpe3ZhciBuPXQubGVuZ3RoPDA/MDowfGgodC5sZW5ndGgpO2U9YShlLG4pO2Zvcih2YXIgcj0wO3I8bjtyKz0xKWVbcl09MjU1JnRbcl07cmV0dXJuIGV9ZnVuY3Rpb24gaChlKXtpZihlPj1zKCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHgiK3MoKS50b1N0cmluZygxNikrIiBieXRlcyIpO3JldHVybiAwfGV9ZnVuY3Rpb24gZihlLHQpe2lmKGMuaXNCdWZmZXIoZSkpcmV0dXJuIGUubGVuZ3RoO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcmJihBcnJheUJ1ZmZlci5pc1ZpZXcoZSl8fGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpcmV0dXJuIGUuYnl0ZUxlbmd0aDsic3RyaW5nIiE9dHlwZW9mIGUmJihlPSIiK2UpO3ZhciBuPWUubGVuZ3RoO2lmKDA9PT1uKXJldHVybiAwO2Zvcih2YXIgcj0hMTs7KXN3aXRjaCh0KXtjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBuO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSB2b2lkIDA6cmV0dXJuIEIoZSkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipuO2Nhc2UiaGV4IjpyZXR1cm4gbj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBqKGUpLmxlbmd0aDtkZWZhdWx0OmlmKHIpcmV0dXJuIEIoZSkubGVuZ3RoO3Q9KCIiK3QpLnRvTG93ZXJDYXNlKCkscj0hMH19ZnVuY3Rpb24gZyhlLHQsbil7dmFyIHI9ITE7aWYoKHZvaWQgMD09PXR8fHQ8MCkmJih0PTApLHQ+dGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PW58fG4+dGhpcy5sZW5ndGgpJiYobj10aGlzLmxlbmd0aCksbjw9MClyZXR1cm4iIjtpZigobj4+Pj0wKTw9KHQ+Pj49MCkpcmV0dXJuIiI7Zm9yKGV8fChlPSJ1dGY4Iik7Oylzd2l0Y2goZSl7Y2FzZSJoZXgiOnJldHVybiBMKHRoaXMsdCxuKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBfKHRoaXMsdCxuKTtjYXNlImFzY2lpIjpyZXR1cm4gUih0aGlzLHQsbik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gayh0aGlzLHQsbik7Y2FzZSJiYXNlNjQiOnJldHVybiBBKHRoaXMsdCxuKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIE4odGhpcyx0LG4pO2RlZmF1bHQ6aWYocil0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK2UpO2U9KGUrIiIpLnRvTG93ZXJDYXNlKCkscj0hMH19ZnVuY3Rpb24gbShlLHQsbil7dmFyIHI9ZVt0XTtlW3RdPWVbbl0sZVtuXT1yfWZ1bmN0aW9uIHYoZSx0LG4scixvKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuLTE7aWYoInN0cmluZyI9PXR5cGVvZiBuPyhyPW4sbj0wKTpuPjIxNDc0ODM2NDc/bj0yMTQ3NDgzNjQ3Om48LTIxNDc0ODM2NDgmJihuPS0yMTQ3NDgzNjQ4KSxuPStuLGlzTmFOKG4pJiYobj1vPzA6ZS5sZW5ndGgtMSksbjwwJiYobj1lLmxlbmd0aCtuKSxuPj1lLmxlbmd0aCl7aWYobylyZXR1cm4tMTtuPWUubGVuZ3RoLTF9ZWxzZSBpZihuPDApe2lmKCFvKXJldHVybi0xO249MH1pZigic3RyaW5nIj09dHlwZW9mIHQmJih0PWMuZnJvbSh0LHIpKSxjLmlzQnVmZmVyKHQpKXJldHVybiAwPT09dC5sZW5ndGg/LTE6eShlLHQsbixyLG8pO2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdCY9MjU1LGMuVFlQRURfQVJSQVlfU1VQUE9SVCYmImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/bz9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoZSx0LG4pOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoZSx0LG4pOnkoZSxbdF0sbixyLG8pO3Rocm93IG5ldyBUeXBlRXJyb3IoInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlciIpfWZ1bmN0aW9uIHkoZSx0LG4scixvKXt2YXIgaSxzPTEsYT1lLmxlbmd0aCxjPXQubGVuZ3RoO2lmKHZvaWQgMCE9PXImJigidWNzMiI9PT0ocj1TdHJpbmcocikudG9Mb3dlckNhc2UoKSl8fCJ1Y3MtMiI9PT1yfHwidXRmMTZsZSI9PT1yfHwidXRmLTE2bGUiPT09cikpe2lmKGUubGVuZ3RoPDJ8fHQubGVuZ3RoPDIpcmV0dXJuLTE7cz0yLGEvPTIsYy89MixuLz0yfWZ1bmN0aW9uIHUoZSx0KXtyZXR1cm4gMT09PXM/ZVt0XTplLnJlYWRVSW50MTZCRSh0KnMpfWlmKG8pe3ZhciBsPS0xO2ZvcihpPW47aTxhO2krKylpZih1KGUsaSk9PT11KHQsLTE9PT1sPzA6aS1sKSl7aWYoLTE9PT1sJiYobD1pKSxpLWwrMT09PWMpcmV0dXJuIGwqc31lbHNlLTEhPT1sJiYoaS09aS1sKSxsPS0xfWVsc2UgZm9yKG4rYz5hJiYobj1hLWMpLGk9bjtpPj0wO2ktLSl7Zm9yKHZhciBwPSEwLGQ9MDtkPGM7ZCsrKWlmKHUoZSxpK2QpIT09dSh0LGQpKXtwPSExO2JyZWFrfWlmKHApcmV0dXJuIGl9cmV0dXJuLTF9ZnVuY3Rpb24gRShlLHQsbixyKXtuPU51bWJlcihuKXx8MDt2YXIgbz1lLmxlbmd0aC1uO3I/KHI9TnVtYmVyKHIpKT5vJiYocj1vKTpyPW87dmFyIGk9dC5sZW5ndGg7aWYoaSUyIT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaGV4IHN0cmluZyIpO3I+aS8yJiYocj1pLzIpO2Zvcih2YXIgcz0wO3M8cjsrK3Mpe3ZhciBhPXBhcnNlSW50KHQuc3Vic3RyKDIqcywyKSwxNik7aWYoaXNOYU4oYSkpcmV0dXJuIHM7ZVtuK3NdPWF9cmV0dXJuIHN9ZnVuY3Rpb24gUyhlLHQsbixyKXtyZXR1cm4gVihCKHQsZS5sZW5ndGgtbiksZSxuLHIpfWZ1bmN0aW9uIGIoZSx0LG4scil7cmV0dXJuIFYoZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoOysrbil0LnB1c2goMjU1JmUuY2hhckNvZGVBdChuKSk7cmV0dXJuIHR9KHQpLGUsbixyKX1mdW5jdGlvbiBUKGUsdCxuLHIpe3JldHVybiBiKGUsdCxuLHIpfWZ1bmN0aW9uIEMoZSx0LG4scil7cmV0dXJuIFYoaih0KSxlLG4scil9ZnVuY3Rpb24gSShlLHQsbixyKXtyZXR1cm4gVihmdW5jdGlvbihlLHQpe2Zvcih2YXIgbixyLG8saT1bXSxzPTA7czxlLmxlbmd0aCYmISgodC09Mik8MCk7KytzKXI9KG49ZS5jaGFyQ29kZUF0KHMpKT4+OCxvPW4lMjU2LGkucHVzaChvKSxpLnB1c2gocik7cmV0dXJuIGl9KHQsZS5sZW5ndGgtbiksZSxuLHIpfWZ1bmN0aW9uIEEoZSx0LHIpe3JldHVybiAwPT09dCYmcj09PWUubGVuZ3RoP24uZnJvbUJ5dGVBcnJheShlKTpuLmZyb21CeXRlQXJyYXkoZS5zbGljZSh0LHIpKX1mdW5jdGlvbiBfKGUsdCxuKXtuPU1hdGgubWluKGUubGVuZ3RoLG4pO2Zvcih2YXIgcj1bXSxvPXQ7bzxuOyl7dmFyIGkscyxhLGMsdT1lW29dLGw9bnVsbCxwPXU+MjM5PzQ6dT4yMjM/Mzp1PjE5MT8yOjE7aWYobytwPD1uKXN3aXRjaChwKXtjYXNlIDE6dTwxMjgmJihsPXUpO2JyZWFrO2Nhc2UgMjoxMjg9PSgxOTImKGk9ZVtvKzFdKSkmJihjPSgzMSZ1KTw8Nnw2MyZpKT4xMjcmJihsPWMpO2JyZWFrO2Nhc2UgMzppPWVbbysxXSxzPWVbbysyXSwxMjg9PSgxOTImaSkmJjEyOD09KDE5MiZzKSYmKGM9KDE1JnUpPDwxMnwoNjMmaSk8PDZ8NjMmcyk+MjA0NyYmKGM8NTUyOTZ8fGM+NTczNDMpJiYobD1jKTticmVhaztjYXNlIDQ6aT1lW28rMV0scz1lW28rMl0sYT1lW28rM10sMTI4PT0oMTkyJmkpJiYxMjg9PSgxOTImcykmJjEyOD09KDE5MiZhKSYmKGM9KDE1JnUpPDwxOHwoNjMmaSk8PDEyfCg2MyZzKTw8Nnw2MyZhKT42NTUzNSYmYzwxMTE0MTEyJiYobD1jKX1udWxsPT09bD8obD02NTUzMyxwPTEpOmw+NjU1MzUmJihsLT02NTUzNixyLnB1c2gobD4+PjEwJjEwMjN8NTUyOTYpLGw9NTYzMjB8MTAyMyZsKSxyLnB1c2gobCksbys9cH1yZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7aWYodDw9dylyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsZSk7Zm9yKHZhciBuPSIiLHI9MDtyPHQ7KW4rPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGUuc2xpY2UocixyKz13KSk7cmV0dXJuIG59KHIpfXIuQnVmZmVyPWMsci5TbG93QnVmZmVyPWZ1bmN0aW9uKGUpe3JldHVybitlIT1lJiYoZT0wKSxjLmFsbG9jKCtlKX0sci5JTlNQRUNUX01BWF9CWVRFUz01MCxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwIT09dC5UWVBFRF9BUlJBWV9TVVBQT1JUP3QuVFlQRURfQVJSQVlfU1VQUE9SVDpmdW5jdGlvbigpe3RyeXt2YXIgZT1uZXcgVWludDhBcnJheSgxKTtyZXR1cm4gZS5fX3Byb3RvX189e19fcHJvdG9fXzpVaW50OEFycmF5LnByb3RvdHlwZSxmb286ZnVuY3Rpb24oKXtyZXR1cm4gNDJ9fSw0Mj09PWUuZm9vKCkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnN1YmFycmF5JiYwPT09ZS5zdWJhcnJheSgxLDEpLmJ5dGVMZW5ndGh9Y2F0Y2goZSl7cmV0dXJuITF9fSgpLHIua01heExlbmd0aD1zKCksYy5wb29sU2l6ZT04MTkyLGMuX2F1Z21lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX19wcm90b19fPWMucHJvdG90eXBlLGV9LGMuZnJvbT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHUobnVsbCxlLHQsbil9LGMuVFlQRURfQVJSQVlfU1VQUE9SVCYmKGMucHJvdG90eXBlLl9fcHJvdG9fXz1VaW50OEFycmF5LnByb3RvdHlwZSxjLl9fcHJvdG9fXz1VaW50OEFycmF5LCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuc3BlY2llcyYmY1tTeW1ib2wuc3BlY2llc109PT1jJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxTeW1ib2wuc3BlY2llcyx7dmFsdWU6bnVsbCxjb25maWd1cmFibGU6ITB9KSksYy5hbGxvYz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBsKHQpLHQ8PTA/YShlLHQpOnZvaWQgMCE9PW4/InN0cmluZyI9PXR5cGVvZiByP2EoZSx0KS5maWxsKG4scik6YShlLHQpLmZpbGwobik6YShlLHQpfShudWxsLGUsdCxuKX0sYy5hbGxvY1Vuc2FmZT1mdW5jdGlvbihlKXtyZXR1cm4gcChudWxsLGUpfSxjLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbihlKXtyZXR1cm4gcChudWxsLGUpfSxjLmlzQnVmZmVyPWZ1bmN0aW9uKGUpe3JldHVybiEobnVsbD09ZXx8IWUuX2lzQnVmZmVyKX0sYy5jb21wYXJlPWZ1bmN0aW9uKGUsdCl7aWYoIWMuaXNCdWZmZXIoZSl8fCFjLmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMiKTtpZihlPT09dClyZXR1cm4gMDtmb3IodmFyIG49ZS5sZW5ndGgscj10Lmxlbmd0aCxvPTAsaT1NYXRoLm1pbihuLHIpO288aTsrK28paWYoZVtvXSE9PXRbb10pe249ZVtvXSxyPXRbb107YnJlYWt9cmV0dXJuIG48cj8tMTpyPG4/MTowfSxjLmlzRW5jb2Rpbmc9ZnVuY3Rpb24oZSl7c3dpdGNoKFN0cmluZyhlKS50b0xvd2VyQ2FzZSgpKXtjYXNlImhleCI6Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19LGMuY29uY2F0PWZ1bmN0aW9uKGUsdCl7aWYoIWkoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gYy5hbGxvYygwKTt2YXIgbjtpZih2b2lkIDA9PT10KWZvcih0PTAsbj0wO248ZS5sZW5ndGg7KytuKXQrPWVbbl0ubGVuZ3RoO3ZhciByPWMuYWxsb2NVbnNhZmUodCksbz0wO2ZvcihuPTA7bjxlLmxlbmd0aDsrK24pe3ZhciBzPWVbbl07aWYoIWMuaXNCdWZmZXIocykpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO3MuY29weShyLG8pLG8rPXMubGVuZ3RofXJldHVybiByfSxjLmJ5dGVMZW5ndGg9ZixjLnByb3RvdHlwZS5faXNCdWZmZXI9ITAsYy5wcm90b3R5cGUuc3dhcDE2PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZW5ndGg7aWYoZSUyIT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cyIpO2Zvcih2YXIgdD0wO3Q8ZTt0Kz0yKW0odGhpcyx0LHQrMSk7cmV0dXJuIHRoaXN9LGMucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlNCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9NCltKHRoaXMsdCx0KzMpLG0odGhpcyx0KzEsdCsyKTtyZXR1cm4gdGhpc30sYy5wcm90b3R5cGUuc3dhcDY0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZW5ndGg7aWYoZSU4IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cyIpO2Zvcih2YXIgdD0wO3Q8ZTt0Kz04KW0odGhpcyx0LHQrNyksbSh0aGlzLHQrMSx0KzYpLG0odGhpcyx0KzIsdCs1KSxtKHRoaXMsdCszLHQrNCk7cmV0dXJuIHRoaXN9LGMucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9MHx0aGlzLmxlbmd0aDtyZXR1cm4gMD09PWU/IiI6MD09PWFyZ3VtZW50cy5sZW5ndGg/Xyh0aGlzLDAsZSk6Zy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGMucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtpZighYy5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7cmV0dXJuIHRoaXM9PT1lfHwwPT09Yy5jb21wYXJlKHRoaXMsZSl9LGMucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXt2YXIgZT0iIix0PXIuSU5TUEVDVF9NQVhfQllURVM7cmV0dXJuIHRoaXMubGVuZ3RoPjAmJihlPXRoaXMudG9TdHJpbmcoImhleCIsMCx0KS5tYXRjaCgvLnsyfS9nKS5qb2luKCIgIiksdGhpcy5sZW5ndGg+dCYmKGUrPSIgLi4uICIpKSwiPEJ1ZmZlciAiK2UrIj4ifSxjLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKGUsdCxuLHIsbyl7aWYoIWMuaXNCdWZmZXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PXQmJih0PTApLHZvaWQgMD09PW4mJihuPWU/ZS5sZW5ndGg6MCksdm9pZCAwPT09ciYmKHI9MCksdm9pZCAwPT09byYmKG89dGhpcy5sZW5ndGgpLHQ8MHx8bj5lLmxlbmd0aHx8cjwwfHxvPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPj1vJiZ0Pj1uKXJldHVybiAwO2lmKHI+PW8pcmV0dXJuLTE7aWYodD49bilyZXR1cm4gMTtpZih0aGlzPT09ZSlyZXR1cm4gMDtmb3IodmFyIGk9KG8+Pj49MCktKHI+Pj49MCkscz0obj4+Pj0wKS0odD4+Pj0wKSxhPU1hdGgubWluKGkscyksdT10aGlzLnNsaWNlKHIsbyksbD1lLnNsaWNlKHQsbikscD0wO3A8YTsrK3ApaWYodVtwXSE9PWxbcF0pe2k9dVtwXSxzPWxbcF07YnJlYWt9cmV0dXJuIGk8cz8tMTpzPGk/MTowfSxjLnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbihlLHQsbil7cmV0dXJuLTEhPT10aGlzLmluZGV4T2YoZSx0LG4pfSxjLnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdih0aGlzLGUsdCxuLCEwKX0sYy5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2KHRoaXMsZSx0LG4sITEpfSxjLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlLHQsbixyKXtpZih2b2lkIDA9PT10KXI9InV0ZjgiLG49dGhpcy5sZW5ndGgsdD0wO2Vsc2UgaWYodm9pZCAwPT09biYmInN0cmluZyI9PXR5cGVvZiB0KXI9dCxuPXRoaXMubGVuZ3RoLHQ9MDtlbHNle2lmKCFpc0Zpbml0ZSh0KSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7dHw9MCxpc0Zpbml0ZShuKT8obnw9MCx2b2lkIDA9PT1yJiYocj0idXRmOCIpKToocj1uLG49dm9pZCAwKX12YXIgbz10aGlzLmxlbmd0aC10O2lmKCh2b2lkIDA9PT1ufHxuPm8pJiYobj1vKSxlLmxlbmd0aD4wJiYobjwwfHx0PDApfHx0PnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO3J8fChyPSJ1dGY4Iik7Zm9yKHZhciBpPSExOzspc3dpdGNoKHIpe2Nhc2UiaGV4IjpyZXR1cm4gRSh0aGlzLGUsdCxuKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBTKHRoaXMsZSx0LG4pO2Nhc2UiYXNjaWkiOnJldHVybiBiKHRoaXMsZSx0LG4pO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIFQodGhpcyxlLHQsbik7Y2FzZSJiYXNlNjQiOnJldHVybiBDKHRoaXMsZSx0LG4pO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gSSh0aGlzLGUsdCxuKTtkZWZhdWx0OmlmKGkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIityKTtyPSgiIityKS50b0xvd2VyQ2FzZSgpLGk9ITB9fSxjLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O3ZhciB3PTQwOTY7ZnVuY3Rpb24gUihlLHQsbil7dmFyIHI9IiI7bj1NYXRoLm1pbihlLmxlbmd0aCxuKTtmb3IodmFyIG89dDtvPG47KytvKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JmVbb10pO3JldHVybiByfWZ1bmN0aW9uIGsoZSx0LG4pe3ZhciByPSIiO249TWF0aC5taW4oZS5sZW5ndGgsbik7Zm9yKHZhciBvPXQ7bzxuOysrbylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbb10pO3JldHVybiByfWZ1bmN0aW9uIEwoZSx0LG4pe3ZhciByLG89ZS5sZW5ndGg7KCF0fHx0PDApJiYodD0wKSwoIW58fG48MHx8bj5vKSYmKG49byk7Zm9yKHZhciBpPSIiLHM9dDtzPG47KytzKWkrPShyPWVbc10pPDE2PyIwIityLnRvU3RyaW5nKDE2KTpyLnRvU3RyaW5nKDE2KTtyZXR1cm4gaX1mdW5jdGlvbiBOKGUsdCxuKXtmb3IodmFyIHI9ZS5zbGljZSh0LG4pLG89IiIsaT0wO2k8ci5sZW5ndGg7aSs9MilvKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHJbaV0rMjU2KnJbaSsxXSk7cmV0dXJuIG99ZnVuY3Rpb24gTyhlLHQsbil7aWYoZSUxIT0wfHxlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKGUrdD5uKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24gRChlLHQsbixyLG8saSl7aWYoIWMuaXNCdWZmZXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKHQ+b3x8dDxpKXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihuK3I+ZS5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIFAoZSx0LG4scil7dDwwJiYodD02NTUzNSt0KzEpO2Zvcih2YXIgbz0wLGk9TWF0aC5taW4oZS5sZW5ndGgtbiwyKTtvPGk7KytvKWVbbitvXT0odCYyNTU8PDgqKHI/bzoxLW8pKT4+PjgqKHI/bzoxLW8pfWZ1bmN0aW9uIHgoZSx0LG4scil7dDwwJiYodD00Mjk0OTY3Mjk1K3QrMSk7Zm9yKHZhciBvPTAsaT1NYXRoLm1pbihlLmxlbmd0aC1uLDQpO288aTsrK28pZVtuK29dPXQ+Pj44KihyP286My1vKSYyNTV9ZnVuY3Rpb24gTShlLHQsbixyLG8saSl7aWYobityPmUubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIFUoZSx0LG4scixpKXtyZXR1cm4gaXx8TShlLDAsbiw0KSxvLndyaXRlKGUsdCxuLHIsMjMsNCksbis0fWZ1bmN0aW9uIEYoZSx0LG4scixpKXtyZXR1cm4gaXx8TShlLDAsbiw4KSxvLndyaXRlKGUsdCxuLHIsNTIsOCksbis4fWMucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj10aGlzLmxlbmd0aDtpZigoZT1+fmUpPDA/KGUrPXIpPDAmJihlPTApOmU+ciYmKGU9ciksKHQ9dm9pZCAwPT09dD9yOn5+dCk8MD8odCs9cik8MCYmKHQ9MCk6dD5yJiYodD1yKSx0PGUmJih0PWUpLGMuVFlQRURfQVJSQVlfU1VQUE9SVCkobj10aGlzLnN1YmFycmF5KGUsdCkpLl9fcHJvdG9fXz1jLnByb3RvdHlwZTtlbHNle3ZhciBvPXQtZTtuPW5ldyBjKG8sdm9pZCAwKTtmb3IodmFyIGk9MDtpPG87KytpKW5baV09dGhpc1tpK2VdfXJldHVybiBufSxjLnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKGUsdCxuKXtlfD0wLHR8PTAsbnx8TyhlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW2VdLG89MSxpPTA7KytpPHQmJihvKj0yNTYpOylyKz10aGlzW2UraV0qbztyZXR1cm4gcn0sYy5wcm90b3R5cGUucmVhZFVJbnRCRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fE8oZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1tlKy0tdF0sbz0xO3Q+MCYmKG8qPTI1Nik7KXIrPXRoaXNbZSstLXRdKm87cmV0dXJuIHJ9LGMucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsMSx0aGlzLmxlbmd0aCksdGhpc1tlXX0sYy5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdfHRoaXNbZSsxXTw8OH0sYy5wcm90b3R5cGUucmVhZFVJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdPDw4fHRoaXNbZSsxXX0sYy5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSw0LHRoaXMubGVuZ3RoKSwodGhpc1tlXXx0aGlzW2UrMV08PDh8dGhpc1tlKzJdPDwxNikrMTY3NzcyMTYqdGhpc1tlKzNdfSxjLnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TyhlLDQsdGhpcy5sZW5ndGgpLDE2Nzc3MjE2KnRoaXNbZV0rKHRoaXNbZSsxXTw8MTZ8dGhpc1tlKzJdPDw4fHRoaXNbZSszXSl9LGMucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fE8oZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1tlXSxvPTEsaT0wOysraTx0JiYobyo9MjU2KTspcis9dGhpc1tlK2ldKm87cmV0dXJuIHI+PShvKj0xMjgpJiYoci09TWF0aC5wb3coMiw4KnQpKSxyfSxjLnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24oZSx0LG4pe2V8PTAsdHw9MCxufHxPKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXQsbz0xLGk9dGhpc1tlKy0tcl07cj4wJiYobyo9MjU2KTspaSs9dGhpc1tlKy0tcl0qbztyZXR1cm4gaT49KG8qPTEyOCkmJihpLT1NYXRoLnBvdygyLDgqdCkpLGl9LGMucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSwxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1tlXT8tMSooMjU1LXRoaXNbZV0rMSk6dGhpc1tlXX0sYy5wcm90b3R5cGUucmVhZEludDE2TEU9ZnVuY3Rpb24oZSx0KXt0fHxPKGUsMix0aGlzLmxlbmd0aCk7dmFyIG49dGhpc1tlXXx0aGlzW2UrMV08PDg7cmV0dXJuIDMyNzY4Jm4/NDI5NDkwMTc2MHxuOm59LGMucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7dHx8TyhlLDIsdGhpcy5sZW5ndGgpO3ZhciBuPXRoaXNbZSsxXXx0aGlzW2VdPDw4O3JldHVybiAzMjc2OCZuPzQyOTQ5MDE3NjB8bjpufSxjLnByb3RvdHlwZS5yZWFkSW50MzJMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXXx0aGlzW2UrMV08PDh8dGhpc1tlKzJdPDwxNnx0aGlzW2UrM108PDI0fSxjLnByb3RvdHlwZS5yZWFkSW50MzJCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXTw8MjR8dGhpc1tlKzFdPDwxNnx0aGlzW2UrMl08PDh8dGhpc1tlKzNdfSxjLnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsNCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsZSwhMCwyMyw0KX0sYy5wcm90b3R5cGUucmVhZEZsb2F0QkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TyhlLDQsdGhpcy5sZW5ndGgpLG8ucmVhZCh0aGlzLGUsITEsMjMsNCl9LGMucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxPKGUsOCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsZSwhMCw1Miw4KX0sYy5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE8oZSw4LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyxlLCExLDUyLDgpfSxjLnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbihlLHQsbixyKXtlPStlLHR8PTAsbnw9MCxyfHxEKHRoaXMsZSx0LG4sTWF0aC5wb3coMiw4Km4pLTEsMCk7dmFyIG89MSxpPTA7Zm9yKHRoaXNbdF09MjU1JmU7KytpPG4mJihvKj0yNTYpOyl0aGlzW3QraV09ZS9vJjI1NTtyZXR1cm4gdCtufSxjLnByb3RvdHlwZS53cml0ZVVJbnRCRT1mdW5jdGlvbihlLHQsbixyKXtlPStlLHR8PTAsbnw9MCxyfHxEKHRoaXMsZSx0LG4sTWF0aC5wb3coMiw4Km4pLTEsMCk7dmFyIG89bi0xLGk9MTtmb3IodGhpc1t0K29dPTI1NSZlOy0tbz49MCYmKGkqPTI1Nik7KXRoaXNbdCtvXT1lL2kmMjU1O3JldHVybiB0K259LGMucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8RCh0aGlzLGUsdCwxLDI1NSwwKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlR8fChlPU1hdGguZmxvb3IoZSkpLHRoaXNbdF09MjU1JmUsdCsxfSxjLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEQodGhpcyxlLHQsMiw2NTUzNSwwKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44KTpQKHRoaXMsZSx0LCEwKSx0KzJ9LGMucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8RCh0aGlzLGUsdCwyLDY1NTM1LDApLGMuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09MjU1JmUpOlAodGhpcyxlLHQsITEpLHQrMn0sYy5wcm90b3R5cGUud3JpdGVVSW50MzJMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxEKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdCszXT1lPj4+MjQsdGhpc1t0KzJdPWU+Pj4xNix0aGlzW3QrMV09ZT4+PjgsdGhpc1t0XT0yNTUmZSk6eCh0aGlzLGUsdCwhMCksdCs0fSxjLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEQodGhpcyxlLHQsNCw0Mjk0OTY3Mjk1LDApLGMuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+MjQsdGhpc1t0KzFdPWU+Pj4xNix0aGlzW3QrMl09ZT4+PjgsdGhpc1t0KzNdPTI1NSZlKTp4KHRoaXMsZSx0LCExKSx0KzR9LGMucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24oZSx0LG4scil7aWYoZT0rZSx0fD0wLCFyKXt2YXIgbz1NYXRoLnBvdygyLDgqbi0xKTtEKHRoaXMsZSx0LG4sby0xLC1vKX12YXIgaT0wLHM9MSxhPTA7Zm9yKHRoaXNbdF09MjU1JmU7KytpPG4mJihzKj0yNTYpOyllPDAmJjA9PT1hJiYwIT09dGhpc1t0K2ktMV0mJihhPTEpLHRoaXNbdCtpXT0oZS9zPj4wKS1hJjI1NTtyZXR1cm4gdCtufSxjLnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9K2UsdHw9MCwhcil7dmFyIG89TWF0aC5wb3coMiw4Km4tMSk7RCh0aGlzLGUsdCxuLG8tMSwtbyl9dmFyIGk9bi0xLHM9MSxhPTA7Zm9yKHRoaXNbdCtpXT0yNTUmZTstLWk+PTAmJihzKj0yNTYpOyllPDAmJjA9PT1hJiYwIT09dGhpc1t0K2krMV0mJihhPTEpLHRoaXNbdCtpXT0oZS9zPj4wKS1hJjI1NTtyZXR1cm4gdCtufSxjLnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8RCh0aGlzLGUsdCwxLDEyNywtMTI4KSxjLlRZUEVEX0FSUkFZX1NVUFBPUlR8fChlPU1hdGguZmxvb3IoZSkpLGU8MCYmKGU9MjU1K2UrMSksdGhpc1t0XT0yNTUmZSx0KzF9LGMucHJvdG90eXBlLndyaXRlSW50MTZMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxEKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44KTpQKHRoaXMsZSx0LCEwKSx0KzJ9LGMucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxEKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjgsdGhpc1t0KzFdPTI1NSZlKTpQKHRoaXMsZSx0LCExKSx0KzJ9LGMucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxEKHRoaXMsZSx0LDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksYy5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCx0aGlzW3QrMl09ZT4+PjE2LHRoaXNbdCszXT1lPj4+MjQpOngodGhpcyxlLHQsITApLHQrNH0sYy5wcm90b3R5cGUud3JpdGVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEQodGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjI0LHRoaXNbdCsxXT1lPj4+MTYsdGhpc1t0KzJdPWU+Pj44LHRoaXNbdCszXT0yNTUmZSk6eCh0aGlzLGUsdCwhMSksdCs0fSxjLnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBVKHRoaXMsZSx0LCEwLG4pfSxjLnByb3RvdHlwZS53cml0ZUZsb2F0QkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBVKHRoaXMsZSx0LCExLG4pfSxjLnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gRih0aGlzLGUsdCwhMCxuKX0sYy5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIEYodGhpcyxlLHQsITEsbil9LGMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oZSx0LG4scil7aWYobnx8KG49MCkscnx8MD09PXJ8fChyPXRoaXMubGVuZ3RoKSx0Pj1lLmxlbmd0aCYmKHQ9ZS5sZW5ndGgpLHR8fCh0PTApLHI+MCYmcjxuJiYocj1uKSxyPT09bilyZXR1cm4gMDtpZigwPT09ZS5sZW5ndGh8fDA9PT10aGlzLmxlbmd0aClyZXR1cm4gMDtpZih0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDB8fG4+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzIik7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcyIpO3I+dGhpcy5sZW5ndGgmJihyPXRoaXMubGVuZ3RoKSxlLmxlbmd0aC10PHItbiYmKHI9ZS5sZW5ndGgtdCtuKTt2YXIgbyxpPXItbjtpZih0aGlzPT09ZSYmbjx0JiZ0PHIpZm9yKG89aS0xO28+PTA7LS1vKWVbbyt0XT10aGlzW28rbl07ZWxzZSBpZihpPDFlM3x8IWMuVFlQRURfQVJSQVlfU1VQUE9SVClmb3Iobz0wO288aTsrK28pZVtvK3RdPXRoaXNbbytuXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGUsdGhpcy5zdWJhcnJheShuLG4raSksdCk7cmV0dXJuIGl9LGMucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24oZSx0LG4scil7aWYoInN0cmluZyI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQ/KHI9dCx0PTAsbj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiBuJiYocj1uLG49dGhpcy5sZW5ndGgpLDE9PT1lLmxlbmd0aCl7dmFyIG89ZS5jaGFyQ29kZUF0KDApO288MjU2JiYoZT1vKX1pZih2b2lkIDAhPT1yJiYic3RyaW5nIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKCJzdHJpbmciPT10eXBlb2YgciYmIWMuaXNFbmNvZGluZyhyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3IpfWVsc2UibnVtYmVyIj09dHlwZW9mIGUmJihlJj0yNTUpO2lmKHQ8MHx8dGhpcy5sZW5ndGg8dHx8dGhpcy5sZW5ndGg8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7aWYobjw9dClyZXR1cm4gdGhpczt2YXIgaTtpZih0Pj4+PTAsbj12b2lkIDA9PT1uP3RoaXMubGVuZ3RoOm4+Pj4wLGV8fChlPTApLCJudW1iZXIiPT10eXBlb2YgZSlmb3IoaT10O2k8bjsrK2kpdGhpc1tpXT1lO2Vsc2V7dmFyIHM9Yy5pc0J1ZmZlcihlKT9lOkIobmV3IGMoZSxyKS50b1N0cmluZygpKSxhPXMubGVuZ3RoO2ZvcihpPTA7aTxuLXQ7KytpKXRoaXNbaSt0XT1zW2klYV19cmV0dXJuIHRoaXN9O3ZhciBxPS9bXitcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIEIoZSx0KXt2YXIgbjt0PXR8fDEvMDtmb3IodmFyIHI9ZS5sZW5ndGgsbz1udWxsLGk9W10scz0wO3M8cjsrK3Mpe2lmKChuPWUuY2hhckNvZGVBdChzKSk+NTUyOTUmJm48NTczNDQpe2lmKCFvKXtpZihuPjU2MzE5KXsodC09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aWYocysxPT09cil7KHQtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfW89bjtjb250aW51ZX1pZihuPDU2MzIwKXsodC09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSksbz1uO2NvbnRpbnVlfW49NjU1MzYrKG8tNTUyOTY8PDEwfG4tNTYzMjApfWVsc2UgbyYmKHQtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpO2lmKG89bnVsbCxuPDEyOCl7aWYoKHQtPTEpPDApYnJlYWs7aS5wdXNoKG4pfWVsc2UgaWYobjwyMDQ4KXtpZigodC09Mik8MClicmVhaztpLnB1c2gobj4+NnwxOTIsNjMmbnwxMjgpfWVsc2UgaWYobjw2NTUzNil7aWYoKHQtPTMpPDApYnJlYWs7aS5wdXNoKG4+PjEyfDIyNCxuPj42JjYzfDEyOCw2MyZufDEyOCl9ZWxzZXtpZighKG48MTExNDExMikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTtpZigodC09NCk8MClicmVhaztpLnB1c2gobj4+MTh8MjQwLG4+PjEyJjYzfDEyOCxuPj42JjYzfDEyOCw2MyZufDEyOCl9fXJldHVybiBpfWZ1bmN0aW9uIGooZSl7cmV0dXJuIG4udG9CeXRlQXJyYXkoZnVuY3Rpb24oZSl7aWYoKGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbT9lLnRyaW0oKTplLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0oZSkucmVwbGFjZShxLCIiKSkubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDtlLmxlbmd0aCU0IT0wOyllKz0iPSI7cmV0dXJuIGV9KGUpKX1mdW5jdGlvbiBWKGUsdCxuLHIpe2Zvcih2YXIgbz0wO288ciYmIShvK24+PXQubGVuZ3RofHxvPj1lLmxlbmd0aCk7KytvKXRbbytuXT1lW29dO3JldHVybiBvfX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsdm9pZCAwIT09bi5nP24uZzoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30sZSgiYnVmZmVyIikuQnVmZmVyKX0seyJiYXNlNjQtanMiOjgxLGJ1ZmZlcjo4NyxpZWVlNzU0Ojg5LGlzYXJyYXk6OTB9XSw4ODpbZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHIoKXt0aGlzLl9ldmVudHM9dGhpcy5fZXZlbnRzfHx7fSx0aGlzLl9tYXhMaXN0ZW5lcnM9dGhpcy5fbWF4TGlzdGVuZXJzfHx2b2lkIDB9ZnVuY3Rpb24gbyhlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZX1mdW5jdGlvbiBpKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9PWV9ZnVuY3Rpb24gcyhlKXtyZXR1cm4gdm9pZCAwPT09ZX10LmV4cG9ydHM9cixyLkV2ZW50RW1pdHRlcj1yLHIucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwLHIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwLHIuZGVmYXVsdE1heExpc3RlbmVycz0xMCxyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlfHxlPDB8fGlzTmFOKGUpKXRocm93IFR5cGVFcnJvcigibiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIik7cmV0dXJuIHRoaXMuX21heExpc3RlbmVycz1lLHRoaXN9LHIucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGEsYyx1O2lmKHRoaXMuX2V2ZW50c3x8KHRoaXMuX2V2ZW50cz17fSksImVycm9yIj09PWUmJighdGhpcy5fZXZlbnRzLmVycm9yfHxpKHRoaXMuX2V2ZW50cy5lcnJvcikmJiF0aGlzLl9ldmVudHMuZXJyb3IubGVuZ3RoKSl7aWYoKHQ9YXJndW1lbnRzWzFdKWluc3RhbmNlb2YgRXJyb3IpdGhyb3cgdDt2YXIgbD1uZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCAiZXJyb3IiIGV2ZW50LiAoJyt0KyIpIik7dGhyb3cgbC5jb250ZXh0PXQsbH1pZihzKG49dGhpcy5fZXZlbnRzW2VdKSlyZXR1cm4hMTtpZihvKG4pKXN3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDE6bi5jYWxsKHRoaXMpO2JyZWFrO2Nhc2UgMjpuLmNhbGwodGhpcyxhcmd1bWVudHNbMV0pO2JyZWFrO2Nhc2UgMzpuLmNhbGwodGhpcyxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdKTticmVhaztkZWZhdWx0OmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLG4uYXBwbHkodGhpcyxhKX1lbHNlIGlmKGkobikpZm9yKGE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLHI9KHU9bi5zbGljZSgpKS5sZW5ndGgsYz0wO2M8cjtjKyspdVtjXS5hcHBseSh0aGlzLGEpO3JldHVybiEwfSxyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3ZhciBuO2lmKCFvKHQpKXRocm93IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIik7cmV0dXJuIHRoaXMuX2V2ZW50c3x8KHRoaXMuX2V2ZW50cz17fSksdGhpcy5fZXZlbnRzLm5ld0xpc3RlbmVyJiZ0aGlzLmVtaXQoIm5ld0xpc3RlbmVyIixlLG8odC5saXN0ZW5lcik/dC5saXN0ZW5lcjp0KSx0aGlzLl9ldmVudHNbZV0/aSh0aGlzLl9ldmVudHNbZV0pP3RoaXMuX2V2ZW50c1tlXS5wdXNoKHQpOnRoaXMuX2V2ZW50c1tlXT1bdGhpcy5fZXZlbnRzW2VdLHRdOnRoaXMuX2V2ZW50c1tlXT10LGkodGhpcy5fZXZlbnRzW2VdKSYmIXRoaXMuX2V2ZW50c1tlXS53YXJuZWQmJihuPXModGhpcy5fbWF4TGlzdGVuZXJzKT9yLmRlZmF1bHRNYXhMaXN0ZW5lcnM6dGhpcy5fbWF4TGlzdGVuZXJzKSYmbj4wJiZ0aGlzLl9ldmVudHNbZV0ubGVuZ3RoPm4mJih0aGlzLl9ldmVudHNbZV0ud2FybmVkPSEwLGNvbnNvbGUuZXJyb3IoIihub2RlKSB3YXJuaW5nOiBwb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICVkIGxpc3RlbmVycyBhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQuIix0aGlzLl9ldmVudHNbZV0ubGVuZ3RoKSwiZnVuY3Rpb24iPT10eXBlb2YgY29uc29sZS50cmFjZSYmY29uc29sZS50cmFjZSgpKSx0aGlzfSxyLnByb3RvdHlwZS5vbj1yLnByb3RvdHlwZS5hZGRMaXN0ZW5lcixyLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKGUsdCl7aWYoIW8odCkpdGhyb3cgVHlwZUVycm9yKCJsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24iKTt2YXIgbj0hMTtmdW5jdGlvbiByKCl7dGhpcy5yZW1vdmVMaXN0ZW5lcihlLHIpLG58fChuPSEwLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpKX1yZXR1cm4gci5saXN0ZW5lcj10LHRoaXMub24oZSxyKSx0aGlzfSxyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3ZhciBuLHIscyxhO2lmKCFvKHQpKXRocm93IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIik7aWYoIXRoaXMuX2V2ZW50c3x8IXRoaXMuX2V2ZW50c1tlXSlyZXR1cm4gdGhpcztpZihzPShuPXRoaXMuX2V2ZW50c1tlXSkubGVuZ3RoLHI9LTEsbj09PXR8fG8obi5saXN0ZW5lcikmJm4ubGlzdGVuZXI9PT10KWRlbGV0ZSB0aGlzLl9ldmVudHNbZV0sdGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIixlLHQpO2Vsc2UgaWYoaShuKSl7Zm9yKGE9czthLS0gPjA7KWlmKG5bYV09PT10fHxuW2FdLmxpc3RlbmVyJiZuW2FdLmxpc3RlbmVyPT09dCl7cj1hO2JyZWFrfWlmKHI8MClyZXR1cm4gdGhpczsxPT09bi5sZW5ndGg/KG4ubGVuZ3RoPTAsZGVsZXRlIHRoaXMuX2V2ZW50c1tlXSk6bi5zcGxpY2UociwxKSx0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLGUsdCl9cmV0dXJuIHRoaXN9LHIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbihlKXt2YXIgdCxuO2lmKCF0aGlzLl9ldmVudHMpcmV0dXJuIHRoaXM7aWYoIXRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5fZXZlbnRzPXt9OnRoaXMuX2V2ZW50c1tlXSYmZGVsZXRlIHRoaXMuX2V2ZW50c1tlXSx0aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodCBpbiB0aGlzLl9ldmVudHMpInJlbW92ZUxpc3RlbmVyIiE9PXQmJnRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKHQpO3JldHVybiB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygicmVtb3ZlTGlzdGVuZXIiKSx0aGlzLl9ldmVudHM9e30sdGhpc31pZihvKG49dGhpcy5fZXZlbnRzW2VdKSl0aGlzLnJlbW92ZUxpc3RlbmVyKGUsbik7ZWxzZSBpZihuKWZvcig7bi5sZW5ndGg7KXRoaXMucmVtb3ZlTGlzdGVuZXIoZSxuW24ubGVuZ3RoLTFdKTtyZXR1cm4gZGVsZXRlIHRoaXMuX2V2ZW50c1tlXSx0aGlzfSxyLnByb3RvdHlwZS5saXN0ZW5lcnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2V2ZW50cyYmdGhpcy5fZXZlbnRzW2VdP28odGhpcy5fZXZlbnRzW2VdKT9bdGhpcy5fZXZlbnRzW2VdXTp0aGlzLl9ldmVudHNbZV0uc2xpY2UoKTpbXX0sci5wcm90b3R5cGUubGlzdGVuZXJDb3VudD1mdW5jdGlvbihlKXtpZih0aGlzLl9ldmVudHMpe3ZhciB0PXRoaXMuX2V2ZW50c1tlXTtpZihvKHQpKXJldHVybiAxO2lmKHQpcmV0dXJuIHQubGVuZ3RofXJldHVybiAwfSxyLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5saXN0ZW5lckNvdW50KHQpfX0se31dLDg5OltmdW5jdGlvbihlLHQsbil7bi5yZWFkPWZ1bmN0aW9uKGUsdCxuLHIsbyl7dmFyIGkscyxhPTgqby1yLTEsYz0oMTw8YSktMSx1PWM+PjEsbD0tNyxwPW4/by0xOjAsZD1uPy0xOjEsaD1lW3QrcF07Zm9yKHArPWQsaT1oJigxPDwtbCktMSxoPj49LWwsbCs9YTtsPjA7aT0yNTYqaStlW3QrcF0scCs9ZCxsLT04KTtmb3Iocz1pJigxPDwtbCktMSxpPj49LWwsbCs9cjtsPjA7cz0yNTYqcytlW3QrcF0scCs9ZCxsLT04KTtpZigwPT09aSlpPTEtdTtlbHNle2lmKGk9PT1jKXJldHVybiBzP05hTjoxLzAqKGg/LTE6MSk7cys9TWF0aC5wb3coMixyKSxpLT11fXJldHVybihoPy0xOjEpKnMqTWF0aC5wb3coMixpLXIpfSxuLndyaXRlPWZ1bmN0aW9uKGUsdCxuLHIsbyxpKXt2YXIgcyxhLGMsdT04Kmktby0xLGw9KDE8PHUpLTEscD1sPj4xLGQ9MjM9PT1vP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxoPXI/MDppLTEsZj1yPzE6LTEsZz10PDB8fDA9PT10JiYxL3Q8MD8xOjA7Zm9yKHQ9TWF0aC5hYnModCksaXNOYU4odCl8fHQ9PT0xLzA/KGE9aXNOYU4odCk/MTowLHM9bCk6KHM9TWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMiksdCooYz1NYXRoLnBvdygyLC1zKSk8MSYmKHMtLSxjKj0yKSwodCs9cytwPj0xP2QvYzpkKk1hdGgucG93KDIsMS1wKSkqYz49MiYmKHMrKyxjLz0yKSxzK3A+PWw/KGE9MCxzPWwpOnMrcD49MT8oYT0odCpjLTEpKk1hdGgucG93KDIsbykscys9cCk6KGE9dCpNYXRoLnBvdygyLHAtMSkqTWF0aC5wb3coMixvKSxzPTApKTtvPj04O2VbbitoXT0yNTUmYSxoKz1mLGEvPTI1NixvLT04KTtmb3Iocz1zPDxvfGEsdSs9bzt1PjA7ZVtuK2hdPTI1NSZzLGgrPWYscy89MjU2LHUtPTgpO2VbbitoLWZdfD0xMjgqZ319LHt9XSw5MDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt9LnRvU3RyaW5nO3QuZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1yLmNhbGwoZSl9fSx7fV0sOTE6W2Z1bmN0aW9uKGUsdCxuKXshZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG51bGwhPT1lJiYiW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfWZ1bmN0aW9uIG4oZSl7cmV0dXJuIG51bGwhPT1lJiYiW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX1mdW5jdGlvbiByKGUsbyl7aWYoZT09PW8pcmV0dXJuITA7aWYoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pKXJldHVybiExO2lmKCEwPT09dChlKSl7aWYoZS5sZW5ndGghPT1vLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKylpZighMT09PXIoZVtpXSxvW2ldKSlyZXR1cm4hMTtyZXR1cm4hMH1pZighMD09PW4oZSkpe3ZhciBzPXt9O2Zvcih2YXIgYSBpbiBlKWlmKGhhc093blByb3BlcnR5LmNhbGwoZSxhKSl7aWYoITE9PT1yKGVbYV0sb1thXSkpcmV0dXJuITE7c1thXT0hMH1mb3IodmFyIGMgaW4gbylpZihoYXNPd25Qcm9wZXJ0eS5jYWxsKG8sYykmJiEwIT09c1tjXSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBvKGUpe2lmKCIiPT09ZXx8ITE9PT1lfHxudWxsPT09ZSlyZXR1cm4hMDtpZih0KGUpJiYwPT09ZS5sZW5ndGgpcmV0dXJuITA7aWYobihlKSl7Zm9yKHZhciByIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShyKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX12YXIgaTtpPSJmdW5jdGlvbiI9PXR5cGVvZiBTdHJpbmcucHJvdG90eXBlLnRyaW1MZWZ0P2Z1bmN0aW9uKGUpe3JldHVybiBlLnRyaW1MZWZ0KCl9OmZ1bmN0aW9uKGUpe3JldHVybiBlLm1hdGNoKC9eXHMqKC4qKS8pWzFdfTt2YXIgcz0wLGE9MSxjPTIsdT0zLGw9NCxwPTYsZD04LGg9OSxmPXswOiJudW1iZXIiLDE6ImFueSIsMjoic3RyaW5nIiwzOiJhcnJheSIsNDoib2JqZWN0Iiw1OiJib29sZWFuIiw2OiJleHByZXNzaW9uIiw3OiJudWxsIiw4OiJBcnJheTxudW1iZXI+Iiw5OiJBcnJheTxzdHJpbmc+In0sZz0iRU9GIixtPSJVbnF1b3RlZElkZW50aWZpZXIiLHY9IlF1b3RlZElkZW50aWZpZXIiLHk9IlJicmFja2V0IixFPSJScGFyZW4iLFM9IkNvbW1hIixiPSJDb2xvbiIsVD0iUmJyYWNlIixDPSJOdW1iZXIiLEk9IkN1cnJlbnQiLEE9IkV4cHJlZiIsXz0iUGlwZSIsdz0iT3IiLFI9IkFuZCIsaz0iRVEiLEw9IkdUIixOPSJMVCIsTz0iR1RFIixEPSJMVEUiLFA9Ik5FIix4PSJGbGF0dGVuIixNPSJTdGFyIixVPSJGaWx0ZXIiLEY9IkRvdCIscT0iTm90IixCPSJMYnJhY2UiLGo9IkxicmFja2V0IixWPSJMcGFyZW4iLFc9IkxpdGVyYWwiLEg9eyIuIjpGLCIqIjpNLCIsIjpTLCI6IjpiLCJ7IjpCLCJ9IjpULCJdIjp5LCIoIjpWLCIpIjpFLCJAIjpJfSx6PXsiPCI6ITAsIj4iOiEwLCI9IjohMCwiISI6ITB9LEc9eyIgIjohMCwiXHQiOiEwLCJcbiI6ITB9O2Z1bmN0aW9uIEsoZSl7cmV0dXJuIGU+PSIwIiYmZTw9IjkifHwiLSI9PT1lfWZ1bmN0aW9uIFgoKXt9WC5wcm90b3R5cGU9e3Rva2VuaXplOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixvLGk9W107Zm9yKHRoaXMuX2N1cnJlbnQ9MDt0aGlzLl9jdXJyZW50PGUubGVuZ3RoOylpZigobz1lW3RoaXMuX2N1cnJlbnRdKT49ImEiJiZvPD0ieiJ8fG8+PSJBIiYmbzw9IloifHwiXyI9PT1vKXQ9dGhpcy5fY3VycmVudCxuPXRoaXMuX2NvbnN1bWVVbnF1b3RlZElkZW50aWZpZXIoZSksaS5wdXNoKHt0eXBlOm0sdmFsdWU6bixzdGFydDp0fSk7ZWxzZSBpZih2b2lkIDAhPT1IW2VbdGhpcy5fY3VycmVudF1dKWkucHVzaCh7dHlwZTpIW2VbdGhpcy5fY3VycmVudF1dLHZhbHVlOmVbdGhpcy5fY3VycmVudF0sc3RhcnQ6dGhpcy5fY3VycmVudH0pLHRoaXMuX2N1cnJlbnQrKztlbHNlIGlmKEsoZVt0aGlzLl9jdXJyZW50XSkpcj10aGlzLl9jb25zdW1lTnVtYmVyKGUpLGkucHVzaChyKTtlbHNlIGlmKCJbIj09PWVbdGhpcy5fY3VycmVudF0pcj10aGlzLl9jb25zdW1lTEJyYWNrZXQoZSksaS5wdXNoKHIpO2Vsc2UgaWYoJyInPT09ZVt0aGlzLl9jdXJyZW50XSl0PXRoaXMuX2N1cnJlbnQsbj10aGlzLl9jb25zdW1lUXVvdGVkSWRlbnRpZmllcihlKSxpLnB1c2goe3R5cGU6dix2YWx1ZTpuLHN0YXJ0OnR9KTtlbHNlIGlmKCInIj09PWVbdGhpcy5fY3VycmVudF0pdD10aGlzLl9jdXJyZW50LG49dGhpcy5fY29uc3VtZVJhd1N0cmluZ0xpdGVyYWwoZSksaS5wdXNoKHt0eXBlOlcsdmFsdWU6bixzdGFydDp0fSk7ZWxzZSBpZigiYCI9PT1lW3RoaXMuX2N1cnJlbnRdKXt0PXRoaXMuX2N1cnJlbnQ7dmFyIHM9dGhpcy5fY29uc3VtZUxpdGVyYWwoZSk7aS5wdXNoKHt0eXBlOlcsdmFsdWU6cyxzdGFydDp0fSl9ZWxzZSBpZih2b2lkIDAhPT16W2VbdGhpcy5fY3VycmVudF1dKWkucHVzaCh0aGlzLl9jb25zdW1lT3BlcmF0b3IoZSkpO2Vsc2UgaWYodm9pZCAwIT09R1tlW3RoaXMuX2N1cnJlbnRdXSl0aGlzLl9jdXJyZW50Kys7ZWxzZSBpZigiJiI9PT1lW3RoaXMuX2N1cnJlbnRdKXQ9dGhpcy5fY3VycmVudCx0aGlzLl9jdXJyZW50KyssIiYiPT09ZVt0aGlzLl9jdXJyZW50XT8odGhpcy5fY3VycmVudCsrLGkucHVzaCh7dHlwZTpSLHZhbHVlOiImJiIsc3RhcnQ6dH0pKTppLnB1c2goe3R5cGU6QSx2YWx1ZToiJiIsc3RhcnQ6dH0pO2Vsc2V7aWYoInwiIT09ZVt0aGlzLl9jdXJyZW50XSl7dmFyIGE9bmV3IEVycm9yKCJVbmtub3duIGNoYXJhY3RlcjoiK2VbdGhpcy5fY3VycmVudF0pO3Rocm93IGEubmFtZT0iTGV4ZXJFcnJvciIsYX10PXRoaXMuX2N1cnJlbnQsdGhpcy5fY3VycmVudCsrLCJ8Ij09PWVbdGhpcy5fY3VycmVudF0/KHRoaXMuX2N1cnJlbnQrKyxpLnB1c2goe3R5cGU6dyx2YWx1ZToifHwiLHN0YXJ0OnR9KSk6aS5wdXNoKHt0eXBlOl8sdmFsdWU6InwiLHN0YXJ0OnR9KX1yZXR1cm4gaX0sX2NvbnN1bWVVbnF1b3RlZElkZW50aWZpZXI6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLl9jdXJyZW50O2Zvcih0aGlzLl9jdXJyZW50Kys7dGhpcy5fY3VycmVudDxlLmxlbmd0aCYmKCh0PWVbdGhpcy5fY3VycmVudF0pPj0iYSImJnQ8PSJ6Inx8dD49IkEiJiZ0PD0iWiJ8fHQ+PSIwIiYmdDw9IjkifHwiXyI9PT10KTspdGhpcy5fY3VycmVudCsrO3JldHVybiBlLnNsaWNlKG4sdGhpcy5fY3VycmVudCl9LF9jb25zdW1lUXVvdGVkSWRlbnRpZmllcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9jdXJyZW50O3RoaXMuX2N1cnJlbnQrKztmb3IodmFyIG49ZS5sZW5ndGg7JyInIT09ZVt0aGlzLl9jdXJyZW50XSYmdGhpcy5fY3VycmVudDxuOyl7dmFyIHI9dGhpcy5fY3VycmVudDsiXFwiIT09ZVtyXXx8IlxcIiE9PWVbcisxXSYmJyInIT09ZVtyKzFdP3IrKzpyKz0yLHRoaXMuX2N1cnJlbnQ9cn1yZXR1cm4gdGhpcy5fY3VycmVudCsrLEpTT04ucGFyc2UoZS5zbGljZSh0LHRoaXMuX2N1cnJlbnQpKX0sX2NvbnN1bWVSYXdTdHJpbmdMaXRlcmFsOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2N1cnJlbnQ7dGhpcy5fY3VycmVudCsrO2Zvcih2YXIgbj1lLmxlbmd0aDsiJyIhPT1lW3RoaXMuX2N1cnJlbnRdJiZ0aGlzLl9jdXJyZW50PG47KXt2YXIgcj10aGlzLl9jdXJyZW50OyJcXCIhPT1lW3JdfHwiXFwiIT09ZVtyKzFdJiYiJyIhPT1lW3IrMV0/cisrOnIrPTIsdGhpcy5fY3VycmVudD1yfXJldHVybiB0aGlzLl9jdXJyZW50KyssZS5zbGljZSh0KzEsdGhpcy5fY3VycmVudC0xKS5yZXBsYWNlKCJcXCciLCInIil9LF9jb25zdW1lTnVtYmVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2N1cnJlbnQ7dGhpcy5fY3VycmVudCsrO2Zvcih2YXIgbj1lLmxlbmd0aDtLKGVbdGhpcy5fY3VycmVudF0pJiZ0aGlzLl9jdXJyZW50PG47KXRoaXMuX2N1cnJlbnQrKzt2YXIgcj1wYXJzZUludChlLnNsaWNlKHQsdGhpcy5fY3VycmVudCkpO3JldHVybnt0eXBlOkMsdmFsdWU6cixzdGFydDp0fX0sX2NvbnN1bWVMQnJhY2tldDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9jdXJyZW50O3JldHVybiB0aGlzLl9jdXJyZW50KyssIj8iPT09ZVt0aGlzLl9jdXJyZW50XT8odGhpcy5fY3VycmVudCsrLHt0eXBlOlUsdmFsdWU6Ils/IixzdGFydDp0fSk6Il0iPT09ZVt0aGlzLl9jdXJyZW50XT8odGhpcy5fY3VycmVudCsrLHt0eXBlOngsdmFsdWU6IltdIixzdGFydDp0fSk6e3R5cGU6aix2YWx1ZToiWyIsc3RhcnQ6dH19LF9jb25zdW1lT3BlcmF0b3I6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fY3VycmVudCxuPWVbdF07cmV0dXJuIHRoaXMuX2N1cnJlbnQrKywiISI9PT1uPyI9Ij09PWVbdGhpcy5fY3VycmVudF0/KHRoaXMuX2N1cnJlbnQrKyx7dHlwZTpQLHZhbHVlOiIhPSIsc3RhcnQ6dH0pOnt0eXBlOnEsdmFsdWU6IiEiLHN0YXJ0OnR9OiI8Ij09PW4/Ij0iPT09ZVt0aGlzLl9jdXJyZW50XT8odGhpcy5fY3VycmVudCsrLHt0eXBlOkQsdmFsdWU6Ijw9IixzdGFydDp0fSk6e3R5cGU6Tix2YWx1ZToiPCIsc3RhcnQ6dH06Ij4iPT09bj8iPSI9PT1lW3RoaXMuX2N1cnJlbnRdPyh0aGlzLl9jdXJyZW50Kysse3R5cGU6Tyx2YWx1ZToiPj0iLHN0YXJ0OnR9KTp7dHlwZTpMLHZhbHVlOiI+IixzdGFydDp0fToiPSI9PT1uJiYiPSI9PT1lW3RoaXMuX2N1cnJlbnRdPyh0aGlzLl9jdXJyZW50Kysse3R5cGU6ayx2YWx1ZToiPT0iLHN0YXJ0OnR9KTp2b2lkIDB9LF9jb25zdW1lTGl0ZXJhbDpmdW5jdGlvbihlKXt0aGlzLl9jdXJyZW50Kys7Zm9yKHZhciB0LG49dGhpcy5fY3VycmVudCxyPWUubGVuZ3RoOyJgIiE9PWVbdGhpcy5fY3VycmVudF0mJnRoaXMuX2N1cnJlbnQ8cjspe3ZhciBvPXRoaXMuX2N1cnJlbnQ7IlxcIiE9PWVbb118fCJcXCIhPT1lW28rMV0mJiJgIiE9PWVbbysxXT9vKys6bys9Mix0aGlzLl9jdXJyZW50PW99dmFyIHM9aShlLnNsaWNlKG4sdGhpcy5fY3VycmVudCkpO3JldHVybiBzPXMucmVwbGFjZSgiXFxgIiwiYCIpLHQ9dGhpcy5fbG9va3NMaWtlSlNPTihzKT9KU09OLnBhcnNlKHMpOkpTT04ucGFyc2UoJyInK3MrJyInKSx0aGlzLl9jdXJyZW50KyssdH0sX2xvb2tzTGlrZUpTT046ZnVuY3Rpb24oZSl7aWYoIiI9PT1lKXJldHVybiExO2lmKCdbeyInLmluZGV4T2YoZVswXSk+PTApcmV0dXJuITA7aWYoWyJ0cnVlIiwiZmFsc2UiLCJudWxsIl0uaW5kZXhPZihlKT49MClyZXR1cm4hMDtpZighKCItMDEyMzQ1Njc4OSIuaW5kZXhPZihlWzBdKT49MCkpcmV0dXJuITE7dHJ5e3JldHVybiBKU09OLnBhcnNlKGUpLCEwfWNhdGNoKGUpe3JldHVybiExfX19O3ZhciBZPXt9O2Z1bmN0aW9uICQoKXt9ZnVuY3Rpb24gSihlKXt0aGlzLnJ1bnRpbWU9ZX1mdW5jdGlvbiBRKGUpe3RoaXMuX2ludGVycHJldGVyPWUsdGhpcy5mdW5jdGlvblRhYmxlPXthYnM6e19mdW5jOnRoaXMuX2Z1bmN0aW9uQWJzLF9zaWduYXR1cmU6W3t0eXBlczpbc119XX0sYXZnOntfZnVuYzp0aGlzLl9mdW5jdGlvbkF2Zyxfc2lnbmF0dXJlOlt7dHlwZXM6W2RdfV19LGNlaWw6e19mdW5jOnRoaXMuX2Z1bmN0aW9uQ2VpbCxfc2lnbmF0dXJlOlt7dHlwZXM6W3NdfV19LGNvbnRhaW5zOntfZnVuYzp0aGlzLl9mdW5jdGlvbkNvbnRhaW5zLF9zaWduYXR1cmU6W3t0eXBlczpbYyx1XX0se3R5cGVzOlthXX1dfSxlbmRzX3dpdGg6e19mdW5jOnRoaXMuX2Z1bmN0aW9uRW5kc1dpdGgsX3NpZ25hdHVyZTpbe3R5cGVzOltjXX0se3R5cGVzOltjXX1dfSxmbG9vcjp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25GbG9vcixfc2lnbmF0dXJlOlt7dHlwZXM6W3NdfV19LGxlbmd0aDp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25MZW5ndGgsX3NpZ25hdHVyZTpbe3R5cGVzOltjLHUsbF19XX0sbWFwOntfZnVuYzp0aGlzLl9mdW5jdGlvbk1hcCxfc2lnbmF0dXJlOlt7dHlwZXM6W3BdfSx7dHlwZXM6W3VdfV19LG1heDp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25NYXgsX3NpZ25hdHVyZTpbe3R5cGVzOltkLGhdfV19LG1lcmdlOntfZnVuYzp0aGlzLl9mdW5jdGlvbk1lcmdlLF9zaWduYXR1cmU6W3t0eXBlczpbbF0sdmFyaWFkaWM6ITB9XX0sbWF4X2J5OntfZnVuYzp0aGlzLl9mdW5jdGlvbk1heEJ5LF9zaWduYXR1cmU6W3t0eXBlczpbdV19LHt0eXBlczpbcF19XX0sc3VtOntfZnVuYzp0aGlzLl9mdW5jdGlvblN1bSxfc2lnbmF0dXJlOlt7dHlwZXM6W2RdfV19LHN0YXJ0c193aXRoOntfZnVuYzp0aGlzLl9mdW5jdGlvblN0YXJ0c1dpdGgsX3NpZ25hdHVyZTpbe3R5cGVzOltjXX0se3R5cGVzOltjXX1dfSxtaW46e19mdW5jOnRoaXMuX2Z1bmN0aW9uTWluLF9zaWduYXR1cmU6W3t0eXBlczpbZCxoXX1dfSxtaW5fYnk6e19mdW5jOnRoaXMuX2Z1bmN0aW9uTWluQnksX3NpZ25hdHVyZTpbe3R5cGVzOlt1XX0se3R5cGVzOltwXX1dfSx0eXBlOntfZnVuYzp0aGlzLl9mdW5jdGlvblR5cGUsX3NpZ25hdHVyZTpbe3R5cGVzOlthXX1dfSxrZXlzOntfZnVuYzp0aGlzLl9mdW5jdGlvbktleXMsX3NpZ25hdHVyZTpbe3R5cGVzOltsXX1dfSx2YWx1ZXM6e19mdW5jOnRoaXMuX2Z1bmN0aW9uVmFsdWVzLF9zaWduYXR1cmU6W3t0eXBlczpbbF19XX0sc29ydDp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25Tb3J0LF9zaWduYXR1cmU6W3t0eXBlczpbaCxkXX1dfSxzb3J0X2J5OntfZnVuYzp0aGlzLl9mdW5jdGlvblNvcnRCeSxfc2lnbmF0dXJlOlt7dHlwZXM6W3VdfSx7dHlwZXM6W3BdfV19LGpvaW46e19mdW5jOnRoaXMuX2Z1bmN0aW9uSm9pbixfc2lnbmF0dXJlOlt7dHlwZXM6W2NdfSx7dHlwZXM6W2hdfV19LHJldmVyc2U6e19mdW5jOnRoaXMuX2Z1bmN0aW9uUmV2ZXJzZSxfc2lnbmF0dXJlOlt7dHlwZXM6W2MsdV19XX0sdG9fYXJyYXk6e19mdW5jOnRoaXMuX2Z1bmN0aW9uVG9BcnJheSxfc2lnbmF0dXJlOlt7dHlwZXM6W2FdfV19LHRvX3N0cmluZzp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25Ub1N0cmluZyxfc2lnbmF0dXJlOlt7dHlwZXM6W2FdfV19LHRvX251bWJlcjp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25Ub051bWJlcixfc2lnbmF0dXJlOlt7dHlwZXM6W2FdfV19LG5vdF9udWxsOntfZnVuYzp0aGlzLl9mdW5jdGlvbk5vdE51bGwsX3NpZ25hdHVyZTpbe3R5cGVzOlthXSx2YXJpYWRpYzohMH1dfX19WVtnXT0wLFlbbV09MCxZW3ZdPTAsWVt5XT0wLFlbRV09MCxZW1NdPTAsWVtUXT0wLFlbQ109MCxZW0ldPTAsWVtBXT0wLFlbX109MSxZW3ddPTIsWVtSXT0zLFlba109NSxZW0xdPTUsWVtOXT01LFlbT109NSxZW0RdPTUsWVtQXT01LFlbeF09OSxZW01dPTIwLFlbVV09MjEsWVtGXT00MCxZW3FdPTQ1LFlbQl09NTAsWVtqXT01NSxZW1ZdPTYwLCQucHJvdG90eXBlPXtwYXJzZTpmdW5jdGlvbihlKXt0aGlzLl9sb2FkVG9rZW5zKGUpLHRoaXMuaW5kZXg9MDt2YXIgdD10aGlzLmV4cHJlc3Npb24oMCk7aWYodGhpcy5fbG9va2FoZWFkKDApIT09Zyl7dmFyIG49dGhpcy5fbG9va2FoZWFkVG9rZW4oMCkscj1uZXcgRXJyb3IoIlVuZXhwZWN0ZWQgdG9rZW4gdHlwZTogIituLnR5cGUrIiwgdmFsdWU6ICIrbi52YWx1ZSk7dGhyb3cgci5uYW1lPSJQYXJzZXJFcnJvciIscn1yZXR1cm4gdH0sX2xvYWRUb2tlbnM6ZnVuY3Rpb24oZSl7dmFyIHQ9KG5ldyBYKS50b2tlbml6ZShlKTt0LnB1c2goe3R5cGU6Zyx2YWx1ZToiIixzdGFydDplLmxlbmd0aH0pLHRoaXMudG9rZW5zPXR9LGV4cHJlc3Npb246ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fbG9va2FoZWFkVG9rZW4oMCk7dGhpcy5fYWR2YW5jZSgpO2Zvcih2YXIgbj10aGlzLm51ZCh0KSxyPXRoaXMuX2xvb2thaGVhZCgwKTtlPFlbcl07KXRoaXMuX2FkdmFuY2UoKSxuPXRoaXMubGVkKHIsbikscj10aGlzLl9sb29rYWhlYWQoMCk7cmV0dXJuIG59LF9sb29rYWhlYWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudG9rZW5zW3RoaXMuaW5kZXgrZV0udHlwZX0sX2xvb2thaGVhZFRva2VuOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRva2Vuc1t0aGlzLmluZGV4K2VdfSxfYWR2YW5jZTpmdW5jdGlvbigpe3RoaXMuaW5kZXgrK30sbnVkOmZ1bmN0aW9uKGUpe3ZhciB0LG47c3dpdGNoKGUudHlwZSl7Y2FzZSBXOnJldHVybnt0eXBlOiJMaXRlcmFsIix2YWx1ZTplLnZhbHVlfTtjYXNlIG06cmV0dXJue3R5cGU6IkZpZWxkIixuYW1lOmUudmFsdWV9O2Nhc2Ugdjp2YXIgcj17dHlwZToiRmllbGQiLG5hbWU6ZS52YWx1ZX07aWYodGhpcy5fbG9va2FoZWFkKDApPT09Vil0aHJvdyBuZXcgRXJyb3IoIlF1b3RlZCBpZGVudGlmaWVyIG5vdCBhbGxvd2VkIGZvciBmdW5jdGlvbiBuYW1lcy4iKTtyZXR1cm4gcjtjYXNlIHE6cmV0dXJue3R5cGU6Ik5vdEV4cHJlc3Npb24iLGNoaWxkcmVuOlt0PXRoaXMuZXhwcmVzc2lvbihZLk5vdCldfTtjYXNlIE06cmV0dXJuIHQ9bnVsbCx7dHlwZToiVmFsdWVQcm9qZWN0aW9uIixjaGlsZHJlbjpbe3R5cGU6IklkZW50aXR5In0sdD10aGlzLl9sb29rYWhlYWQoMCk9PT15P3t0eXBlOiJJZGVudGl0eSJ9OnRoaXMuX3BhcnNlUHJvamVjdGlvblJIUyhZLlN0YXIpXX07Y2FzZSBVOnJldHVybiB0aGlzLmxlZChlLnR5cGUse3R5cGU6IklkZW50aXR5In0pO2Nhc2UgQjpyZXR1cm4gdGhpcy5fcGFyc2VNdWx0aXNlbGVjdEhhc2goKTtjYXNlIHg6cmV0dXJue3R5cGU6IlByb2plY3Rpb24iLGNoaWxkcmVuOlt7dHlwZTp4LGNoaWxkcmVuOlt7dHlwZToiSWRlbnRpdHkifV19LHQ9dGhpcy5fcGFyc2VQcm9qZWN0aW9uUkhTKFkuRmxhdHRlbildfTtjYXNlIGo6cmV0dXJuIHRoaXMuX2xvb2thaGVhZCgwKT09PUN8fHRoaXMuX2xvb2thaGVhZCgwKT09PWI/KHQ9dGhpcy5fcGFyc2VJbmRleEV4cHJlc3Npb24oKSx0aGlzLl9wcm9qZWN0SWZTbGljZSh7dHlwZToiSWRlbnRpdHkifSx0KSk6dGhpcy5fbG9va2FoZWFkKDApPT09TSYmdGhpcy5fbG9va2FoZWFkKDEpPT09eT8odGhpcy5fYWR2YW5jZSgpLHRoaXMuX2FkdmFuY2UoKSx7dHlwZToiUHJvamVjdGlvbiIsY2hpbGRyZW46W3t0eXBlOiJJZGVudGl0eSJ9LHQ9dGhpcy5fcGFyc2VQcm9qZWN0aW9uUkhTKFkuU3RhcildfSk6dGhpcy5fcGFyc2VNdWx0aXNlbGVjdExpc3QoKTtjYXNlIEk6cmV0dXJue3R5cGU6SX07Y2FzZSBBOnJldHVybnt0eXBlOiJFeHByZXNzaW9uUmVmZXJlbmNlIixjaGlsZHJlbjpbbj10aGlzLmV4cHJlc3Npb24oWS5FeHByZWYpXX07Y2FzZSBWOmZvcih2YXIgbz1bXTt0aGlzLl9sb29rYWhlYWQoMCkhPT1FOyl0aGlzLl9sb29rYWhlYWQoMCk9PT1JPyhuPXt0eXBlOkl9LHRoaXMuX2FkdmFuY2UoKSk6bj10aGlzLmV4cHJlc3Npb24oMCksby5wdXNoKG4pO3JldHVybiB0aGlzLl9tYXRjaChFKSxvWzBdO2RlZmF1bHQ6dGhpcy5fZXJyb3JUb2tlbihlKX19LGxlZDpmdW5jdGlvbihlLHQpe3ZhciBuO3N3aXRjaChlKXtjYXNlIEY6dmFyIHI9WS5Eb3Q7cmV0dXJuIHRoaXMuX2xvb2thaGVhZCgwKSE9PU0/e3R5cGU6IlN1YmV4cHJlc3Npb24iLGNoaWxkcmVuOlt0LG49dGhpcy5fcGFyc2VEb3RSSFMocildfToodGhpcy5fYWR2YW5jZSgpLHt0eXBlOiJWYWx1ZVByb2plY3Rpb24iLGNoaWxkcmVuOlt0LG49dGhpcy5fcGFyc2VQcm9qZWN0aW9uUkhTKHIpXX0pO2Nhc2UgXzpyZXR1cm4gbj10aGlzLmV4cHJlc3Npb24oWS5QaXBlKSx7dHlwZTpfLGNoaWxkcmVuOlt0LG5dfTtjYXNlIHc6cmV0dXJue3R5cGU6Ik9yRXhwcmVzc2lvbiIsY2hpbGRyZW46W3Qsbj10aGlzLmV4cHJlc3Npb24oWS5PcildfTtjYXNlIFI6cmV0dXJue3R5cGU6IkFuZEV4cHJlc3Npb24iLGNoaWxkcmVuOlt0LG49dGhpcy5leHByZXNzaW9uKFkuQW5kKV19O2Nhc2UgVjpmb3IodmFyIG8saT10Lm5hbWUscz1bXTt0aGlzLl9sb29rYWhlYWQoMCkhPT1FOyl0aGlzLl9sb29rYWhlYWQoMCk9PT1JPyhvPXt0eXBlOkl9LHRoaXMuX2FkdmFuY2UoKSk6bz10aGlzLmV4cHJlc3Npb24oMCksdGhpcy5fbG9va2FoZWFkKDApPT09UyYmdGhpcy5fbWF0Y2goUykscy5wdXNoKG8pO3JldHVybiB0aGlzLl9tYXRjaChFKSx7dHlwZToiRnVuY3Rpb24iLG5hbWU6aSxjaGlsZHJlbjpzfTtjYXNlIFU6dmFyIGE9dGhpcy5leHByZXNzaW9uKDApO3JldHVybiB0aGlzLl9tYXRjaCh5KSx7dHlwZToiRmlsdGVyUHJvamVjdGlvbiIsY2hpbGRyZW46W3Qsbj10aGlzLl9sb29rYWhlYWQoMCk9PT14P3t0eXBlOiJJZGVudGl0eSJ9OnRoaXMuX3BhcnNlUHJvamVjdGlvblJIUyhZLkZpbHRlciksYV19O2Nhc2UgeDpyZXR1cm57dHlwZToiUHJvamVjdGlvbiIsY2hpbGRyZW46W3t0eXBlOngsY2hpbGRyZW46W3RdfSx0aGlzLl9wYXJzZVByb2plY3Rpb25SSFMoWS5GbGF0dGVuKV19O2Nhc2UgazpjYXNlIFA6Y2FzZSBMOmNhc2UgTzpjYXNlIE46Y2FzZSBEOnJldHVybiB0aGlzLl9wYXJzZUNvbXBhcmF0b3IodCxlKTtjYXNlIGo6dmFyIGM9dGhpcy5fbG9va2FoZWFkVG9rZW4oMCk7cmV0dXJuIGMudHlwZT09PUN8fGMudHlwZT09PWI/KG49dGhpcy5fcGFyc2VJbmRleEV4cHJlc3Npb24oKSx0aGlzLl9wcm9qZWN0SWZTbGljZSh0LG4pKToodGhpcy5fbWF0Y2goTSksdGhpcy5fbWF0Y2goeSkse3R5cGU6IlByb2plY3Rpb24iLGNoaWxkcmVuOlt0LG49dGhpcy5fcGFyc2VQcm9qZWN0aW9uUkhTKFkuU3RhcildfSk7ZGVmYXVsdDp0aGlzLl9lcnJvclRva2VuKHRoaXMuX2xvb2thaGVhZFRva2VuKDApKX19LF9tYXRjaDpmdW5jdGlvbihlKXtpZih0aGlzLl9sb29rYWhlYWQoMCkhPT1lKXt2YXIgdD10aGlzLl9sb29rYWhlYWRUb2tlbigwKSxuPW5ldyBFcnJvcigiRXhwZWN0ZWQgIitlKyIsIGdvdDogIit0LnR5cGUpO3Rocm93IG4ubmFtZT0iUGFyc2VyRXJyb3IiLG59dGhpcy5fYWR2YW5jZSgpfSxfZXJyb3JUb2tlbjpmdW5jdGlvbihlKXt2YXIgdD1uZXcgRXJyb3IoIkludmFsaWQgdG9rZW4gKCIrZS50eXBlKycpOiAiJytlLnZhbHVlKyciJyk7dGhyb3cgdC5uYW1lPSJQYXJzZXJFcnJvciIsdH0sX3BhcnNlSW5kZXhFeHByZXNzaW9uOmZ1bmN0aW9uKCl7aWYodGhpcy5fbG9va2FoZWFkKDApPT09Ynx8dGhpcy5fbG9va2FoZWFkKDEpPT09YilyZXR1cm4gdGhpcy5fcGFyc2VTbGljZUV4cHJlc3Npb24oKTt2YXIgZT17dHlwZToiSW5kZXgiLHZhbHVlOnRoaXMuX2xvb2thaGVhZFRva2VuKDApLnZhbHVlfTtyZXR1cm4gdGhpcy5fYWR2YW5jZSgpLHRoaXMuX21hdGNoKHkpLGV9LF9wcm9qZWN0SWZTbGljZTpmdW5jdGlvbihlLHQpe3ZhciBuPXt0eXBlOiJJbmRleEV4cHJlc3Npb24iLGNoaWxkcmVuOltlLHRdfTtyZXR1cm4iU2xpY2UiPT09dC50eXBlP3t0eXBlOiJQcm9qZWN0aW9uIixjaGlsZHJlbjpbbix0aGlzLl9wYXJzZVByb2plY3Rpb25SSFMoWS5TdGFyKV19Om59LF9wYXJzZVNsaWNlRXhwcmVzc2lvbjpmdW5jdGlvbigpe2Zvcih2YXIgZT1bbnVsbCxudWxsLG51bGxdLHQ9MCxuPXRoaXMuX2xvb2thaGVhZCgwKTtuIT09eSYmdDwzOyl7aWYobj09PWIpdCsrLHRoaXMuX2FkdmFuY2UoKTtlbHNle2lmKG4hPT1DKXt2YXIgcj10aGlzLl9sb29rYWhlYWQoMCksbz1uZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5leHBlY3RlZCB0b2tlbjogIityLnZhbHVlKyIoIityLnR5cGUrIikiKTt0aHJvdyBvLm5hbWU9IlBhcnNlcmVycm9yIixvfWVbdF09dGhpcy5fbG9va2FoZWFkVG9rZW4oMCkudmFsdWUsdGhpcy5fYWR2YW5jZSgpfW49dGhpcy5fbG9va2FoZWFkKDApfXJldHVybiB0aGlzLl9tYXRjaCh5KSx7dHlwZToiU2xpY2UiLGNoaWxkcmVuOmV9fSxfcGFyc2VDb21wYXJhdG9yOmZ1bmN0aW9uKGUsdCl7cmV0dXJue3R5cGU6IkNvbXBhcmF0b3IiLG5hbWU6dCxjaGlsZHJlbjpbZSx0aGlzLmV4cHJlc3Npb24oWVt0XSldfX0sX3BhcnNlRG90UkhTOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2xvb2thaGVhZCgwKTtyZXR1cm5bbSx2LE1dLmluZGV4T2YodCk+PTA/dGhpcy5leHByZXNzaW9uKGUpOnQ9PT1qPyh0aGlzLl9tYXRjaChqKSx0aGlzLl9wYXJzZU11bHRpc2VsZWN0TGlzdCgpKTp0PT09Qj8odGhpcy5fbWF0Y2goQiksdGhpcy5fcGFyc2VNdWx0aXNlbGVjdEhhc2goKSk6dm9pZCAwfSxfcGFyc2VQcm9qZWN0aW9uUkhTOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKFlbdGhpcy5fbG9va2FoZWFkKDApXTwxMCl0PXt0eXBlOiJJZGVudGl0eSJ9O2Vsc2UgaWYodGhpcy5fbG9va2FoZWFkKDApPT09ail0PXRoaXMuZXhwcmVzc2lvbihlKTtlbHNlIGlmKHRoaXMuX2xvb2thaGVhZCgwKT09PVUpdD10aGlzLmV4cHJlc3Npb24oZSk7ZWxzZXtpZih0aGlzLl9sb29rYWhlYWQoMCkhPT1GKXt2YXIgbj10aGlzLl9sb29rYWhlYWRUb2tlbigwKSxyPW5ldyBFcnJvcigiU3l0YW54IGVycm9yLCB1bmV4cGVjdGVkIHRva2VuOiAiK24udmFsdWUrIigiK24udHlwZSsiKSIpO3Rocm93IHIubmFtZT0iUGFyc2VyRXJyb3IiLHJ9dGhpcy5fbWF0Y2goRiksdD10aGlzLl9wYXJzZURvdFJIUyhlKX1yZXR1cm4gdH0sX3BhcnNlTXVsdGlzZWxlY3RMaXN0OmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdO3RoaXMuX2xvb2thaGVhZCgwKSE9PXk7KXt2YXIgdD10aGlzLmV4cHJlc3Npb24oMCk7aWYoZS5wdXNoKHQpLHRoaXMuX2xvb2thaGVhZCgwKT09PVMmJih0aGlzLl9tYXRjaChTKSx0aGlzLl9sb29rYWhlYWQoMCk9PT15KSl0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgdG9rZW4gUmJyYWNrZXQiKX1yZXR1cm4gdGhpcy5fbWF0Y2goeSkse3R5cGU6Ik11bHRpU2VsZWN0TGlzdCIsY2hpbGRyZW46ZX19LF9wYXJzZU11bHRpc2VsZWN0SGFzaDpmdW5jdGlvbigpe2Zvcih2YXIgZSx0LG4scj1bXSxvPVttLHZdOzspe2lmKGU9dGhpcy5fbG9va2FoZWFkVG9rZW4oMCksby5pbmRleE9mKGUudHlwZSk8MCl0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGluZyBhbiBpZGVudGlmaWVyIHRva2VuLCBnb3Q6ICIrZS50eXBlKTtpZih0PWUudmFsdWUsdGhpcy5fYWR2YW5jZSgpLHRoaXMuX21hdGNoKGIpLG49e3R5cGU6IktleVZhbHVlUGFpciIsbmFtZTp0LHZhbHVlOnRoaXMuZXhwcmVzc2lvbigwKX0sci5wdXNoKG4pLHRoaXMuX2xvb2thaGVhZCgwKT09PVMpdGhpcy5fbWF0Y2goUyk7ZWxzZSBpZih0aGlzLl9sb29rYWhlYWQoMCk9PT1UKXt0aGlzLl9tYXRjaChUKTticmVha319cmV0dXJue3R5cGU6Ik11bHRpU2VsZWN0SGFzaCIsY2hpbGRyZW46cn19fSxKLnByb3RvdHlwZT17c2VhcmNoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMudmlzaXQoZSx0KX0sdmlzaXQ6ZnVuY3Rpb24oZSxpKXt2YXIgcyxhLGMsdSxsLHAsZCxoLGY7c3dpdGNoKGUudHlwZSl7Y2FzZSJGaWVsZCI6cmV0dXJuIG51bGwhPT1pJiZuKGkpP3ZvaWQgMD09PShwPWlbZS5uYW1lXSk/bnVsbDpwOm51bGw7Y2FzZSJTdWJleHByZXNzaW9uIjpmb3IoYz10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSksZj0xO2Y8ZS5jaGlsZHJlbi5sZW5ndGg7ZisrKWlmKG51bGw9PT0oYz10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0sYykpKXJldHVybiBudWxsO3JldHVybiBjO2Nhc2UiSW5kZXhFeHByZXNzaW9uIjpyZXR1cm4gZD10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSksdGhpcy52aXNpdChlLmNoaWxkcmVuWzFdLGQpO2Nhc2UiSW5kZXgiOmlmKCF0KGkpKXJldHVybiBudWxsO3ZhciBnPWUudmFsdWU7cmV0dXJuIGc8MCYmKGc9aS5sZW5ndGgrZyksdm9pZCAwPT09KGM9aVtnXSkmJihjPW51bGwpLGM7Y2FzZSJTbGljZSI6aWYoIXQoaSkpcmV0dXJuIG51bGw7dmFyIG09ZS5jaGlsZHJlbi5zbGljZSgwKSx2PXRoaXMuY29tcHV0ZVNsaWNlUGFyYW1zKGkubGVuZ3RoLG0pLHk9dlswXSxFPXZbMV0sUz12WzJdO2lmKGM9W10sUz4wKWZvcihmPXk7ZjxFO2YrPVMpYy5wdXNoKGlbZl0pO2Vsc2UgZm9yKGY9eTtmPkU7Zis9UyljLnB1c2goaVtmXSk7cmV0dXJuIGM7Y2FzZSJQcm9qZWN0aW9uIjp2YXIgYj10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSk7aWYoIXQoYikpcmV0dXJuIG51bGw7Zm9yKGg9W10sZj0wO2Y8Yi5sZW5ndGg7ZisrKW51bGwhPT0oYT10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0sYltmXSkpJiZoLnB1c2goYSk7cmV0dXJuIGg7Y2FzZSJWYWx1ZVByb2plY3Rpb24iOmlmKCFuKGI9dGhpcy52aXNpdChlLmNoaWxkcmVuWzBdLGkpKSlyZXR1cm4gbnVsbDtoPVtdO3ZhciBUPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPVtdLHI9MDtyPHQubGVuZ3RoO3IrKyluLnB1c2goZVt0W3JdXSk7cmV0dXJuIG59KGIpO2ZvcihmPTA7ZjxULmxlbmd0aDtmKyspbnVsbCE9PShhPXRoaXMudmlzaXQoZS5jaGlsZHJlblsxXSxUW2ZdKSkmJmgucHVzaChhKTtyZXR1cm4gaDtjYXNlIkZpbHRlclByb2plY3Rpb24iOmlmKCF0KGI9dGhpcy52aXNpdChlLmNoaWxkcmVuWzBdLGkpKSlyZXR1cm4gbnVsbDt2YXIgQz1bXSx3PVtdO2ZvcihmPTA7ZjxiLmxlbmd0aDtmKyspbyhzPXRoaXMudmlzaXQoZS5jaGlsZHJlblsyXSxiW2ZdKSl8fEMucHVzaChiW2ZdKTtmb3IodmFyIFI9MDtSPEMubGVuZ3RoO1IrKyludWxsIT09KGE9dGhpcy52aXNpdChlLmNoaWxkcmVuWzFdLENbUl0pKSYmdy5wdXNoKGEpO3JldHVybiB3O2Nhc2UiQ29tcGFyYXRvciI6c3dpdGNoKHU9dGhpcy52aXNpdChlLmNoaWxkcmVuWzBdLGkpLGw9dGhpcy52aXNpdChlLmNoaWxkcmVuWzFdLGkpLGUubmFtZSl7Y2FzZSBrOmM9cih1LGwpO2JyZWFrO2Nhc2UgUDpjPSFyKHUsbCk7YnJlYWs7Y2FzZSBMOmM9dT5sO2JyZWFrO2Nhc2UgTzpjPXU+PWw7YnJlYWs7Y2FzZSBOOmM9dTxsO2JyZWFrO2Nhc2UgRDpjPXU8PWw7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gY29tcGFyYXRvcjogIitlLm5hbWUpfXJldHVybiBjO2Nhc2UgeDp2YXIgTT10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSk7aWYoIXQoTSkpcmV0dXJuIG51bGw7dmFyIFU9W107Zm9yKGY9MDtmPE0ubGVuZ3RoO2YrKyl0KGE9TVtmXSk/VS5wdXNoLmFwcGx5KFUsYSk6VS5wdXNoKGEpO3JldHVybiBVO2Nhc2UiSWRlbnRpdHkiOnJldHVybiBpO2Nhc2UiTXVsdGlTZWxlY3RMaXN0IjppZihudWxsPT09aSlyZXR1cm4gbnVsbDtmb3IoaD1bXSxmPTA7ZjxlLmNoaWxkcmVuLmxlbmd0aDtmKyspaC5wdXNoKHRoaXMudmlzaXQoZS5jaGlsZHJlbltmXSxpKSk7cmV0dXJuIGg7Y2FzZSJNdWx0aVNlbGVjdEhhc2giOmlmKG51bGw9PT1pKXJldHVybiBudWxsO3ZhciBGO2ZvcihoPXt9LGY9MDtmPGUuY2hpbGRyZW4ubGVuZ3RoO2YrKyloWyhGPWUuY2hpbGRyZW5bZl0pLm5hbWVdPXRoaXMudmlzaXQoRi52YWx1ZSxpKTtyZXR1cm4gaDtjYXNlIk9yRXhwcmVzc2lvbiI6cmV0dXJuIG8ocz10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSkpJiYocz10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0saSkpLHM7Y2FzZSJBbmRFeHByZXNzaW9uIjpyZXR1cm4hMD09PW8odT10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSkpP3U6dGhpcy52aXNpdChlLmNoaWxkcmVuWzFdLGkpO2Nhc2UiTm90RXhwcmVzc2lvbiI6cmV0dXJuIG8odT10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSkpO2Nhc2UiTGl0ZXJhbCI6cmV0dXJuIGUudmFsdWU7Y2FzZSBfOnJldHVybiBkPXRoaXMudmlzaXQoZS5jaGlsZHJlblswXSxpKSx0aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0sZCk7Y2FzZSBJOnJldHVybiBpO2Nhc2UiRnVuY3Rpb24iOnZhciBxPVtdO2ZvcihmPTA7ZjxlLmNoaWxkcmVuLmxlbmd0aDtmKyspcS5wdXNoKHRoaXMudmlzaXQoZS5jaGlsZHJlbltmXSxpKSk7cmV0dXJuIHRoaXMucnVudGltZS5jYWxsRnVuY3Rpb24oZS5uYW1lLHEpO2Nhc2UiRXhwcmVzc2lvblJlZmVyZW5jZSI6dmFyIEI9ZS5jaGlsZHJlblswXTtyZXR1cm4gQi5qbWVzcGF0aFR5cGU9QSxCO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIG5vZGUgdHlwZTogIitlLnR5cGUpfX0sY29tcHV0ZVNsaWNlUGFyYW1zOmZ1bmN0aW9uKGUsdCl7dmFyIG49dFswXSxyPXRbMV0sbz10WzJdLGk9W251bGwsbnVsbCxudWxsXTtpZihudWxsPT09bylvPTE7ZWxzZSBpZigwPT09byl7dmFyIHM9bmV3IEVycm9yKCJJbnZhbGlkIHNsaWNlLCBzdGVwIGNhbm5vdCBiZSAwIik7dGhyb3cgcy5uYW1lPSJSdW50aW1lRXJyb3IiLHN9dmFyIGE9bzwwO3JldHVybiBuPW51bGw9PT1uP2E/ZS0xOjA6dGhpcy5jYXBTbGljZVJhbmdlKGUsbixvKSxyPW51bGw9PT1yP2E/LTE6ZTp0aGlzLmNhcFNsaWNlUmFuZ2UoZSxyLG8pLGlbMF09bixpWzFdPXIsaVsyXT1vLGl9LGNhcFNsaWNlUmFuZ2U6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0PDA/KHQrPWUpPDAmJih0PW48MD8tMTowKTp0Pj1lJiYodD1uPDA/ZS0xOmUpLHR9fSxRLnByb3RvdHlwZT17Y2FsbEZ1bmN0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5mdW5jdGlvblRhYmxlW2VdO2lmKHZvaWQgMD09PW4pdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGZ1bmN0aW9uOiAiK2UrIigpIik7cmV0dXJuIHRoaXMuX3ZhbGlkYXRlQXJncyhlLHQsbi5fc2lnbmF0dXJlKSxuLl9mdW5jLmNhbGwodGhpcyx0KX0sX3ZhbGlkYXRlQXJnczpmdW5jdGlvbihlLHQsbil7dmFyIHIsbyxpLHM7aWYobltuLmxlbmd0aC0xXS52YXJpYWRpYyl7aWYodC5sZW5ndGg8bi5sZW5ndGgpdGhyb3cgcj0xPT09bi5sZW5ndGg/IiBhcmd1bWVudCI6IiBhcmd1bWVudHMiLG5ldyBFcnJvcigiQXJndW1lbnRFcnJvcjogIitlKyIoKSB0YWtlcyBhdCBsZWFzdCIrbi5sZW5ndGgrcisiIGJ1dCByZWNlaXZlZCAiK3QubGVuZ3RoKX1lbHNlIGlmKHQubGVuZ3RoIT09bi5sZW5ndGgpdGhyb3cgcj0xPT09bi5sZW5ndGg/IiBhcmd1bWVudCI6IiBhcmd1bWVudHMiLG5ldyBFcnJvcigiQXJndW1lbnRFcnJvcjogIitlKyIoKSB0YWtlcyAiK24ubGVuZ3RoK3IrIiBidXQgcmVjZWl2ZWQgIit0Lmxlbmd0aCk7Zm9yKHZhciBhPTA7YTxuLmxlbmd0aDthKyspe3M9ITEsbz1uW2FdLnR5cGVzLGk9dGhpcy5fZ2V0VHlwZU5hbWUodFthXSk7Zm9yKHZhciBjPTA7YzxvLmxlbmd0aDtjKyspaWYodGhpcy5fdHlwZU1hdGNoZXMoaSxvW2NdLHRbYV0pKXtzPSEwO2JyZWFrfWlmKCFzKXt2YXIgdT1vLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGZbZV19KSkuam9pbigiLCIpO3Rocm93IG5ldyBFcnJvcigiVHlwZUVycm9yOiAiK2UrIigpIGV4cGVjdGVkIGFyZ3VtZW50ICIrKGErMSkrIiB0byBiZSB0eXBlICIrdSsiIGJ1dCByZWNlaXZlZCB0eXBlICIrZltpXSsiIGluc3RlYWQuIil9fX0sX3R5cGVNYXRjaGVzOmZ1bmN0aW9uKGUsdCxuKXtpZih0PT09YSlyZXR1cm4hMDtpZih0IT09aCYmdCE9PWQmJnQhPT11KXJldHVybiBlPT09dDtpZih0PT09dSlyZXR1cm4gZT09PXU7aWYoZT09PXUpe3ZhciByO3Q9PT1kP3I9czp0PT09aCYmKHI9Yyk7Zm9yKHZhciBvPTA7bzxuLmxlbmd0aDtvKyspaWYoIXRoaXMuX3R5cGVNYXRjaGVzKHRoaXMuX2dldFR5cGVOYW1lKG5bb10pLHIsbltvXSkpcmV0dXJuITE7cmV0dXJuITB9fSxfZ2V0VHlwZU5hbWU6ZnVuY3Rpb24oZSl7c3dpdGNoKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSl7Y2FzZSJbb2JqZWN0IFN0cmluZ10iOnJldHVybiBjO2Nhc2UiW29iamVjdCBOdW1iZXJdIjpyZXR1cm4gcztjYXNlIltvYmplY3QgQXJyYXldIjpyZXR1cm4gdTtjYXNlIltvYmplY3QgQm9vbGVhbl0iOnJldHVybiA1O2Nhc2UiW29iamVjdCBOdWxsXSI6cmV0dXJuIDc7Y2FzZSJbb2JqZWN0IE9iamVjdF0iOnJldHVybiBlLmptZXNwYXRoVHlwZT09PUE/cDpsfX0sX2Z1bmN0aW9uU3RhcnRzV2l0aDpmdW5jdGlvbihlKXtyZXR1cm4gMD09PWVbMF0ubGFzdEluZGV4T2YoZVsxXSl9LF9mdW5jdGlvbkVuZHNXaXRoOmZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0sbj1lWzFdO3JldHVybi0xIT09dC5pbmRleE9mKG4sdC5sZW5ndGgtbi5sZW5ndGgpfSxfZnVuY3Rpb25SZXZlcnNlOmZ1bmN0aW9uKGUpe2lmKHRoaXMuX2dldFR5cGVOYW1lKGVbMF0pPT09Yyl7Zm9yKHZhciB0PWVbMF0sbj0iIixyPXQubGVuZ3RoLTE7cj49MDtyLS0pbis9dFtyXTtyZXR1cm4gbn12YXIgbz1lWzBdLnNsaWNlKDApO3JldHVybiBvLnJldmVyc2UoKSxvfSxfZnVuY3Rpb25BYnM6ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGguYWJzKGVbMF0pfSxfZnVuY3Rpb25DZWlsOmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmNlaWwoZVswXSl9LF9mdW5jdGlvbkF2ZzpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPWVbMF0scj0wO3I8bi5sZW5ndGg7cisrKXQrPW5bcl07cmV0dXJuIHQvbi5sZW5ndGh9LF9mdW5jdGlvbkNvbnRhaW5zOmZ1bmN0aW9uKGUpe3JldHVybiBlWzBdLmluZGV4T2YoZVsxXSk+PTB9LF9mdW5jdGlvbkZsb29yOmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmZsb29yKGVbMF0pfSxfZnVuY3Rpb25MZW5ndGg6ZnVuY3Rpb24oZSl7cmV0dXJuIG4oZVswXSk/T2JqZWN0LmtleXMoZVswXSkubGVuZ3RoOmVbMF0ubGVuZ3RofSxfZnVuY3Rpb25NYXA6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49dGhpcy5faW50ZXJwcmV0ZXIscj1lWzBdLG89ZVsxXSxpPTA7aTxvLmxlbmd0aDtpKyspdC5wdXNoKG4udmlzaXQocixvW2ldKSk7cmV0dXJuIHR9LF9mdW5jdGlvbk1lcmdlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD17fSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07Zm9yKHZhciBvIGluIHIpdFtvXT1yW29dfXJldHVybiB0fSxfZnVuY3Rpb25NYXg6ZnVuY3Rpb24oZSl7aWYoZVswXS5sZW5ndGg+MCl7aWYodGhpcy5fZ2V0VHlwZU5hbWUoZVswXVswXSk9PT1zKXJldHVybiBNYXRoLm1heC5hcHBseShNYXRoLGVbMF0pO2Zvcih2YXIgdD1lWzBdLG49dFswXSxyPTE7cjx0Lmxlbmd0aDtyKyspbi5sb2NhbGVDb21wYXJlKHRbcl0pPDAmJihuPXRbcl0pO3JldHVybiBufXJldHVybiBudWxsfSxfZnVuY3Rpb25NaW46ZnVuY3Rpb24oZSl7aWYoZVswXS5sZW5ndGg+MCl7aWYodGhpcy5fZ2V0VHlwZU5hbWUoZVswXVswXSk9PT1zKXJldHVybiBNYXRoLm1pbi5hcHBseShNYXRoLGVbMF0pO2Zvcih2YXIgdD1lWzBdLG49dFswXSxyPTE7cjx0Lmxlbmd0aDtyKyspdFtyXS5sb2NhbGVDb21wYXJlKG4pPDAmJihuPXRbcl0pO3JldHVybiBufXJldHVybiBudWxsfSxfZnVuY3Rpb25TdW06ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj1lWzBdLHI9MDtyPG4ubGVuZ3RoO3IrKyl0Kz1uW3JdO3JldHVybiB0fSxfZnVuY3Rpb25UeXBlOmZ1bmN0aW9uKGUpe3N3aXRjaCh0aGlzLl9nZXRUeXBlTmFtZShlWzBdKSl7Y2FzZSBzOnJldHVybiJudW1iZXIiO2Nhc2UgYzpyZXR1cm4ic3RyaW5nIjtjYXNlIHU6cmV0dXJuImFycmF5IjtjYXNlIGw6cmV0dXJuIm9iamVjdCI7Y2FzZSA1OnJldHVybiJib29sZWFuIjtjYXNlIHA6cmV0dXJuImV4cHJlZiI7Y2FzZSA3OnJldHVybiJudWxsIn19LF9mdW5jdGlvbktleXM6ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5rZXlzKGVbMF0pfSxfZnVuY3Rpb25WYWx1ZXM6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWVbMF0sbj1PYmplY3Qua2V5cyh0KSxyPVtdLG89MDtvPG4ubGVuZ3RoO28rKylyLnB1c2godFtuW29dXSk7cmV0dXJuIHJ9LF9mdW5jdGlvbkpvaW46ZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXTtyZXR1cm4gZVsxXS5qb2luKHQpfSxfZnVuY3Rpb25Ub0FycmF5OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9nZXRUeXBlTmFtZShlWzBdKT09PXU/ZVswXTpbZVswXV19LF9mdW5jdGlvblRvU3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9nZXRUeXBlTmFtZShlWzBdKT09PWM/ZVswXTpKU09OLnN0cmluZ2lmeShlWzBdKX0sX2Z1bmN0aW9uVG9OdW1iZXI6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLl9nZXRUeXBlTmFtZShlWzBdKTtyZXR1cm4gbj09PXM/ZVswXTpuIT09Y3x8KHQ9K2VbMF0saXNOYU4odCkpP251bGw6dH0sX2Z1bmN0aW9uTm90TnVsbDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKylpZig3IT09dGhpcy5fZ2V0VHlwZU5hbWUoZVt0XSkpcmV0dXJuIGVbdF07cmV0dXJuIG51bGx9LF9mdW5jdGlvblNvcnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXS5zbGljZSgwKTtyZXR1cm4gdC5zb3J0KCksdH0sX2Z1bmN0aW9uU29ydEJ5OmZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0uc2xpY2UoMCk7aWYoMD09PXQubGVuZ3RoKXJldHVybiB0O3ZhciBuPXRoaXMuX2ludGVycHJldGVyLHI9ZVsxXSxvPXRoaXMuX2dldFR5cGVOYW1lKG4udmlzaXQocix0WzBdKSk7aWYoW3MsY10uaW5kZXhPZihvKTwwKXRocm93IG5ldyBFcnJvcigiVHlwZUVycm9yIik7Zm9yKHZhciBpPXRoaXMsYT1bXSx1PTA7dTx0Lmxlbmd0aDt1KyspYS5wdXNoKFt1LHRbdV1dKTthLnNvcnQoKGZ1bmN0aW9uKGUsdCl7dmFyIHM9bi52aXNpdChyLGVbMV0pLGE9bi52aXNpdChyLHRbMV0pO2lmKGkuX2dldFR5cGVOYW1lKHMpIT09byl0aHJvdyBuZXcgRXJyb3IoIlR5cGVFcnJvcjogZXhwZWN0ZWQgIitvKyIsIHJlY2VpdmVkICIraS5fZ2V0VHlwZU5hbWUocykpO2lmKGkuX2dldFR5cGVOYW1lKGEpIT09byl0aHJvdyBuZXcgRXJyb3IoIlR5cGVFcnJvcjogZXhwZWN0ZWQgIitvKyIsIHJlY2VpdmVkICIraS5fZ2V0VHlwZU5hbWUoYSkpO3JldHVybiBzPmE/MTpzPGE/LTE6ZVswXS10WzBdfSkpO2Zvcih2YXIgbD0wO2w8YS5sZW5ndGg7bCsrKXRbbF09YVtsXVsxXTtyZXR1cm4gdH0sX2Z1bmN0aW9uTWF4Qnk6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG4scj1lWzFdLG89ZVswXSxpPXRoaXMuY3JlYXRlS2V5RnVuY3Rpb24ocixbcyxjXSksYT0tMS8wLHU9MDt1PG8ubGVuZ3RoO3UrKykobj1pKG9bdV0pKT5hJiYoYT1uLHQ9b1t1XSk7cmV0dXJuIHR9LF9mdW5jdGlvbk1pbkJ5OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLHI9ZVsxXSxvPWVbMF0saT10aGlzLmNyZWF0ZUtleUZ1bmN0aW9uKHIsW3MsY10pLGE9MS8wLHU9MDt1PG8ubGVuZ3RoO3UrKykobj1pKG9bdV0pKTxhJiYoYT1uLHQ9b1t1XSk7cmV0dXJuIHR9LGNyZWF0ZUtleUZ1bmN0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcyxyPXRoaXMuX2ludGVycHJldGVyO3JldHVybiBmdW5jdGlvbihvKXt2YXIgaT1yLnZpc2l0KGUsbyk7aWYodC5pbmRleE9mKG4uX2dldFR5cGVOYW1lKGkpKTwwKXt2YXIgcz0iVHlwZUVycm9yOiBleHBlY3RlZCBvbmUgb2YgIit0KyIsIHJlY2VpdmVkICIrbi5fZ2V0VHlwZU5hbWUoaSk7dGhyb3cgbmV3IEVycm9yKHMpfXJldHVybiBpfX19LGUudG9rZW5pemU9ZnVuY3Rpb24oZSl7cmV0dXJuKG5ldyBYKS50b2tlbml6ZShlKX0sZS5jb21waWxlPWZ1bmN0aW9uKGUpe3JldHVybihuZXcgJCkucGFyc2UoZSl9LGUuc2VhcmNoPWZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3ICQscj1uZXcgUSxvPW5ldyBKKHIpO3IuX2ludGVycHJldGVyPW87dmFyIGk9bi5wYXJzZSh0KTtyZXR1cm4gby5zZWFyY2goaSxlKX0sZS5zdHJpY3REZWVwRXF1YWw9cn0odm9pZCAwPT09bj90aGlzLmptZXNwYXRoPXt9Om4pfSx7fV0sOTI6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcixvLGk9dC5leHBvcnRzPXt9O2Z1bmN0aW9uIHMoKXt0aHJvdyBuZXcgRXJyb3IoInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX1mdW5jdGlvbiBhKCl7dGhyb3cgbmV3IEVycm9yKCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX1mdW5jdGlvbiBjKGUpe2lmKHI9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KGUsMCk7aWYoKHI9PT1zfHwhcikmJnNldFRpbWVvdXQpcmV0dXJuIHI9c2V0VGltZW91dCxzZXRUaW1lb3V0KGUsMCk7dHJ5e3JldHVybiByKGUsMCl9Y2F0Y2godCl7dHJ5e3JldHVybiByLmNhbGwobnVsbCxlLDApfWNhdGNoKHQpe3JldHVybiByLmNhbGwodGhpcyxlLDApfX19IWZ1bmN0aW9uKCl7dHJ5e3I9ImZ1bmN0aW9uIj09dHlwZW9mIHNldFRpbWVvdXQ/c2V0VGltZW91dDpzfWNhdGNoKGUpe3I9c310cnl7bz0iZnVuY3Rpb24iPT10eXBlb2YgY2xlYXJUaW1lb3V0P2NsZWFyVGltZW91dDphfWNhdGNoKGUpe289YX19KCk7dmFyIHUsbD1bXSxwPSExLGQ9LTE7ZnVuY3Rpb24gaCgpe3AmJnUmJihwPSExLHUubGVuZ3RoP2w9dS5jb25jYXQobCk6ZD0tMSxsLmxlbmd0aCYmZigpKX1mdW5jdGlvbiBmKCl7aWYoIXApe3ZhciBlPWMoaCk7cD0hMDtmb3IodmFyIHQ9bC5sZW5ndGg7dDspe2Zvcih1PWwsbD1bXTsrK2Q8dDspdSYmdVtkXS5ydW4oKTtkPS0xLHQ9bC5sZW5ndGh9dT1udWxsLHA9ITEsZnVuY3Rpb24oZSl7aWYobz09PWNsZWFyVGltZW91dClyZXR1cm4gY2xlYXJUaW1lb3V0KGUpO2lmKChvPT09YXx8IW8pJiZjbGVhclRpbWVvdXQpcmV0dXJuIG89Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dChlKTt0cnl7cmV0dXJuIG8oZSl9Y2F0Y2godCl7dHJ5e3JldHVybiBvLmNhbGwobnVsbCxlKX1jYXRjaCh0KXtyZXR1cm4gby5jYWxsKHRoaXMsZSl9fX0oZSl9fWZ1bmN0aW9uIGcoZSx0KXt0aGlzLmZ1bj1lLHRoaXMuYXJyYXk9dH1mdW5jdGlvbiBtKCl7fWkubmV4dFRpY2s9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoYXJndW1lbnRzLmxlbmd0aD4xKWZvcih2YXIgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdFtuLTFdPWFyZ3VtZW50c1tuXTtsLnB1c2gobmV3IGcoZSx0KSksMSE9PWwubGVuZ3RofHxwfHxjKGYpfSxnLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfSxpLnRpdGxlPSJicm93c2VyIixpLmJyb3dzZXI9ITAsaS5lbnY9e30saS5hcmd2PVtdLGkudmVyc2lvbj0iIixpLnZlcnNpb25zPXt9LGkub249bSxpLmFkZExpc3RlbmVyPW0saS5vbmNlPW0saS5vZmY9bSxpLnJlbW92ZUxpc3RlbmVyPW0saS5yZW1vdmVBbGxMaXN0ZW5lcnM9bSxpLmVtaXQ9bSxpLnByZXBlbmRMaXN0ZW5lcj1tLGkucHJlcGVuZE9uY2VMaXN0ZW5lcj1tLGkubGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3JldHVybltdfSxpLmJpbmRpbmc9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCIpfSxpLmN3ZD1mdW5jdGlvbigpe3JldHVybiIvIn0saS5jaGRpcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSxpLnVtYXNrPWZ1bmN0aW9uKCl7cmV0dXJuIDB9fSx7fV0sOTM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX10LmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4saSl7dD10fHwiJiIsbj1ufHwiPSI7dmFyIHM9e307aWYoInN0cmluZyIhPXR5cGVvZiBlfHwwPT09ZS5sZW5ndGgpcmV0dXJuIHM7dmFyIGE9L1wrL2c7ZT1lLnNwbGl0KHQpO3ZhciBjPTFlMztpJiYibnVtYmVyIj09dHlwZW9mIGkubWF4S2V5cyYmKGM9aS5tYXhLZXlzKTt2YXIgdT1lLmxlbmd0aDtjPjAmJnU+YyYmKHU9Yyk7Zm9yKHZhciBsPTA7bDx1OysrbCl7dmFyIHAsZCxoLGYsZz1lW2xdLnJlcGxhY2UoYSwiJTIwIiksbT1nLmluZGV4T2Yobik7bT49MD8ocD1nLnN1YnN0cigwLG0pLGQ9Zy5zdWJzdHIobSsxKSk6KHA9ZyxkPSIiKSxoPWRlY29kZVVSSUNvbXBvbmVudChwKSxmPWRlY29kZVVSSUNvbXBvbmVudChkKSxyKHMsaCk/byhzW2hdKT9zW2hdLnB1c2goZik6c1toXT1bc1toXSxmXTpzW2hdPWZ9cmV0dXJuIHN9O3ZhciBvPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9fSx7fV0sOTQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZnVuY3Rpb24oZSl7c3dpdGNoKHR5cGVvZiBlKXtjYXNlInN0cmluZyI6cmV0dXJuIGU7Y2FzZSJib29sZWFuIjpyZXR1cm4gZT8idHJ1ZSI6ImZhbHNlIjtjYXNlIm51bWJlciI6cmV0dXJuIGlzRmluaXRlKGUpP2U6IiI7ZGVmYXVsdDpyZXR1cm4iIn19O3QuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixhKXtyZXR1cm4gdD10fHwiJiIsbj1ufHwiPSIsbnVsbD09PWUmJihlPXZvaWQgMCksIm9iamVjdCI9PXR5cGVvZiBlP2kocyhlKSwoZnVuY3Rpb24ocyl7dmFyIGE9ZW5jb2RlVVJJQ29tcG9uZW50KHIocykpK247cmV0dXJuIG8oZVtzXSk/aShlW3NdLChmdW5jdGlvbihlKXtyZXR1cm4gYStlbmNvZGVVUklDb21wb25lbnQocihlKSl9KSkuam9pbih0KTphK2VuY29kZVVSSUNvbXBvbmVudChyKGVbc10pKX0pKS5qb2luKHQpOmE/ZW5jb2RlVVJJQ29tcG9uZW50KHIoYSkpK24rZW5jb2RlVVJJQ29tcG9uZW50KHIoZSkpOiIifTt2YXIgbz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfTtmdW5jdGlvbiBpKGUsdCl7aWYoZS5tYXApcmV0dXJuIGUubWFwKHQpO2Zvcih2YXIgbj1bXSxyPTA7cjxlLmxlbmd0aDtyKyspbi5wdXNoKHQoZVtyXSxyKSk7cmV0dXJuIG59dmFyIHM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKGUpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG4pJiZ0LnB1c2gobik7cmV0dXJuIHR9fSx7fV0sOTU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5kZWNvZGU9bi5wYXJzZT1lKCIuL2RlY29kZSIpLG4uZW5jb2RlPW4uc3RyaW5naWZ5PWUoIi4vZW5jb2RlIil9LHsiLi9kZWNvZGUiOjkzLCIuL2VuY29kZSI6OTR9XSw5NjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfXQuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixvKXt0PXR8fCImIixuPW58fCI9Ijt2YXIgaT17fTtpZigic3RyaW5nIiE9dHlwZW9mIGV8fDA9PT1lLmxlbmd0aClyZXR1cm4gaTt2YXIgcz0vXCsvZztlPWUuc3BsaXQodCk7dmFyIGE9MWUzO28mJiJudW1iZXIiPT10eXBlb2Ygby5tYXhLZXlzJiYoYT1vLm1heEtleXMpO3ZhciBjPWUubGVuZ3RoO2E+MCYmYz5hJiYoYz1hKTtmb3IodmFyIHU9MDt1PGM7Kyt1KXt2YXIgbCxwLGQsaCxmPWVbdV0ucmVwbGFjZShzLCIlMjAiKSxnPWYuaW5kZXhPZihuKTtnPj0wPyhsPWYuc3Vic3RyKDAsZykscD1mLnN1YnN0cihnKzEpKToobD1mLHA9IiIpLGQ9ZGVjb2RlVVJJQ29tcG9uZW50KGwpLGg9ZGVjb2RlVVJJQ29tcG9uZW50KHApLHIoaSxkKT9BcnJheS5pc0FycmF5KGlbZF0pP2lbZF0ucHVzaChoKTppW2RdPVtpW2RdLGhdOmlbZF09aH1yZXR1cm4gaX19LHt9XSw5NzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1mdW5jdGlvbihlKXtzd2l0Y2godHlwZW9mIGUpe2Nhc2Uic3RyaW5nIjpyZXR1cm4gZTtjYXNlImJvb2xlYW4iOnJldHVybiBlPyJ0cnVlIjoiZmFsc2UiO2Nhc2UibnVtYmVyIjpyZXR1cm4gaXNGaW5pdGUoZSk/ZToiIjtkZWZhdWx0OnJldHVybiIifX07dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLG8pe3JldHVybiB0PXR8fCImIixuPW58fCI9IixudWxsPT09ZSYmKGU9dm9pZCAwKSwib2JqZWN0Ij09dHlwZW9mIGU/T2JqZWN0LmtleXMoZSkubWFwKChmdW5jdGlvbihvKXt2YXIgaT1lbmNvZGVVUklDb21wb25lbnQocihvKSkrbjtyZXR1cm4gQXJyYXkuaXNBcnJheShlW29dKT9lW29dLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGkrZW5jb2RlVVJJQ29tcG9uZW50KHIoZSkpfSkpLmpvaW4odCk6aStlbmNvZGVVUklDb21wb25lbnQocihlW29dKSl9KSkuam9pbih0KTpvP2VuY29kZVVSSUNvbXBvbmVudChyKG8pKStuK2VuY29kZVVSSUNvbXBvbmVudChyKGUpKToiIn19LHt9XSw5ODpbZnVuY3Rpb24oZSx0LG4pe2FyZ3VtZW50c1s0XVs5NV1bMF0uYXBwbHkobixhcmd1bWVudHMpfSx7Ii4vZGVjb2RlIjo5NiwiLi9lbmNvZGUiOjk3LGR1cDo5NX1dLDk5OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKHQscil7KGZ1bmN0aW9uKCl7dmFyIG89ZSgicHJvY2Vzcy9icm93c2VyLmpzIikubmV4dFRpY2ssaT1GdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkscz1BcnJheS5wcm90b3R5cGUuc2xpY2UsYT17fSxjPTA7ZnVuY3Rpb24gdShlLHQpe3RoaXMuX2lkPWUsdGhpcy5fY2xlYXJGbj10fW4uc2V0VGltZW91dD1mdW5jdGlvbigpe3JldHVybiBuZXcgdShpLmNhbGwoc2V0VGltZW91dCx3aW5kb3csYXJndW1lbnRzKSxjbGVhclRpbWVvdXQpfSxuLnNldEludGVydmFsPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB1KGkuY2FsbChzZXRJbnRlcnZhbCx3aW5kb3csYXJndW1lbnRzKSxjbGVhckludGVydmFsKX0sbi5jbGVhclRpbWVvdXQ9bi5jbGVhckludGVydmFsPWZ1bmN0aW9uKGUpe2UuY2xvc2UoKX0sdS5wcm90b3R5cGUudW5yZWY9dS5wcm90b3R5cGUucmVmPWZ1bmN0aW9uKCl7fSx1LnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe3RoaXMuX2NsZWFyRm4uY2FsbCh3aW5kb3csdGhpcy5faWQpfSxuLmVucm9sbD1mdW5jdGlvbihlLHQpe2NsZWFyVGltZW91dChlLl9pZGxlVGltZW91dElkKSxlLl9pZGxlVGltZW91dD10fSxuLnVuZW5yb2xsPWZ1bmN0aW9uKGUpe2NsZWFyVGltZW91dChlLl9pZGxlVGltZW91dElkKSxlLl9pZGxlVGltZW91dD0tMX0sbi5fdW5yZWZBY3RpdmU9bi5hY3RpdmU9ZnVuY3Rpb24oZSl7Y2xlYXJUaW1lb3V0KGUuX2lkbGVUaW1lb3V0SWQpO3ZhciB0PWUuX2lkbGVUaW1lb3V0O3Q+PTAmJihlLl9pZGxlVGltZW91dElkPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZS5fb25UaW1lb3V0JiZlLl9vblRpbWVvdXQoKX0pLHQpKX0sbi5zZXRJbW1lZGlhdGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmdW5jdGlvbihlKXt2YXIgdD1jKysscj0hKGFyZ3VtZW50cy5sZW5ndGg8MikmJnMuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIGFbdF09ITAsbygoZnVuY3Rpb24oKXthW3RdJiYocj9lLmFwcGx5KG51bGwscik6ZS5jYWxsKG51bGwpLG4uY2xlYXJJbW1lZGlhdGUodCkpfSkpLHR9LG4uY2xlYXJJbW1lZGlhdGU9ImZ1bmN0aW9uIj09dHlwZW9mIHI/cjpmdW5jdGlvbihlKXtkZWxldGUgYVtlXX19KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLGUoInRpbWVycyIpLnNldEltbWVkaWF0ZSxlKCJ0aW1lcnMiKS5jbGVhckltbWVkaWF0ZSl9LHsicHJvY2Vzcy9icm93c2VyLmpzIjo5Mix0aW1lcnM6OTl9XSwxMDA6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCJwdW55Y29kZSIpO2Z1bmN0aW9uIG8oKXt0aGlzLnByb3RvY29sPW51bGwsdGhpcy5zbGFzaGVzPW51bGwsdGhpcy5hdXRoPW51bGwsdGhpcy5ob3N0PW51bGwsdGhpcy5wb3J0PW51bGwsdGhpcy5ob3N0bmFtZT1udWxsLHRoaXMuaGFzaD1udWxsLHRoaXMuc2VhcmNoPW51bGwsdGhpcy5xdWVyeT1udWxsLHRoaXMucGF0aG5hbWU9bnVsbCx0aGlzLnBhdGg9bnVsbCx0aGlzLmhyZWY9bnVsbH1uLnBhcnNlPXYsbi5yZXNvbHZlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHYoZSwhMSwhMCkucmVzb2x2ZSh0KX0sbi5yZXNvbHZlT2JqZWN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU/dihlLCExLCEwKS5yZXNvbHZlT2JqZWN0KHQpOnR9LG4uZm9ybWF0PWZ1bmN0aW9uKGUpe3JldHVybiB5KGUpJiYoZT12KGUpKSxlIGluc3RhbmNlb2Ygbz9lLmZvcm1hdCgpOm8ucHJvdG90eXBlLmZvcm1hdC5jYWxsKGUpfSxuLlVybD1vO3ZhciBpPS9eKFthLXowLTkuKy1dKzopL2kscz0vOlswLTldKiQvLGE9WyJ7IiwifSIsInwiLCJcXCIsIl4iLCJgIl0uY29uY2F0KFsiPCIsIj4iLCciJywiYCIsIiAiLCJcciIsIlxuIiwiXHQiXSksYz1bIiciXS5jb25jYXQoYSksdT1bIiUiLCIvIiwiPyIsIjsiLCIjIl0uY29uY2F0KGMpLGw9WyIvIiwiPyIsIiMiXSxwPS9eW2EtejAtOUEtWl8tXXswLDYzfSQvLGQ9L14oW2EtejAtOUEtWl8tXXswLDYzfSkoLiopJC8saD17amF2YXNjcmlwdDohMCwiamF2YXNjcmlwdDoiOiEwfSxmPXtqYXZhc2NyaXB0OiEwLCJqYXZhc2NyaXB0OiI6ITB9LGc9e2h0dHA6ITAsaHR0cHM6ITAsZnRwOiEwLGdvcGhlcjohMCxmaWxlOiEwLCJodHRwOiI6ITAsImh0dHBzOiI6ITAsImZ0cDoiOiEwLCJnb3BoZXI6IjohMCwiZmlsZToiOiEwfSxtPWUoInF1ZXJ5c3RyaW5nIik7ZnVuY3Rpb24gdihlLHQsbil7aWYoZSYmRShlKSYmZSBpbnN0YW5jZW9mIG8pcmV0dXJuIGU7dmFyIHI9bmV3IG87cmV0dXJuIHIucGFyc2UoZSx0LG4pLHJ9ZnVuY3Rpb24geShlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV9ZnVuY3Rpb24gRShlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPT1lfWZ1bmN0aW9uIFMoZSl7cmV0dXJuIG51bGw9PT1lfW8ucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKGUsdCxuKXtpZigheShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJQYXJhbWV0ZXIgJ3VybCcgbXVzdCBiZSBhIHN0cmluZywgbm90ICIrdHlwZW9mIGUpO3ZhciBvPWU7bz1vLnRyaW0oKTt2YXIgcz1pLmV4ZWMobyk7aWYocyl7dmFyIGE9KHM9c1swXSkudG9Mb3dlckNhc2UoKTt0aGlzLnByb3RvY29sPWEsbz1vLnN1YnN0cihzLmxlbmd0aCl9aWYobnx8c3x8by5tYXRjaCgvXlwvXC9bXkBcL10rQFteQFwvXSsvKSl7dmFyIHY9Ii8vIj09PW8uc3Vic3RyKDAsMik7IXZ8fHMmJmZbc118fChvPW8uc3Vic3RyKDIpLHRoaXMuc2xhc2hlcz0hMCl9aWYoIWZbc10mJih2fHxzJiYhZ1tzXSkpe2Zvcih2YXIgRSxTLGI9LTEsVD0wO1Q8bC5sZW5ndGg7VCsrKS0xIT09KEM9by5pbmRleE9mKGxbVF0pKSYmKC0xPT09Ynx8QzxiKSYmKGI9Qyk7Zm9yKC0xIT09KFM9LTE9PT1iP28ubGFzdEluZGV4T2YoIkAiKTpvLmxhc3RJbmRleE9mKCJAIixiKSkmJihFPW8uc2xpY2UoMCxTKSxvPW8uc2xpY2UoUysxKSx0aGlzLmF1dGg9ZGVjb2RlVVJJQ29tcG9uZW50KEUpKSxiPS0xLFQ9MDtUPHUubGVuZ3RoO1QrKyl7dmFyIEM7LTEhPT0oQz1vLmluZGV4T2YodVtUXSkpJiYoLTE9PT1ifHxDPGIpJiYoYj1DKX0tMT09PWImJihiPW8ubGVuZ3RoKSx0aGlzLmhvc3Q9by5zbGljZSgwLGIpLG89by5zbGljZShiKSx0aGlzLnBhcnNlSG9zdCgpLHRoaXMuaG9zdG5hbWU9dGhpcy5ob3N0bmFtZXx8IiI7dmFyIEk9IlsiPT09dGhpcy5ob3N0bmFtZVswXSYmIl0iPT09dGhpcy5ob3N0bmFtZVt0aGlzLmhvc3RuYW1lLmxlbmd0aC0xXTtpZighSSlmb3IodmFyIEE9dGhpcy5ob3N0bmFtZS5zcGxpdCgvXC4vKSxfPShUPTAsQS5sZW5ndGgpO1Q8XztUKyspe3ZhciB3PUFbVF07aWYodyYmIXcubWF0Y2gocCkpe2Zvcih2YXIgUj0iIixrPTAsTD13Lmxlbmd0aDtrPEw7aysrKXcuY2hhckNvZGVBdChrKT4xMjc/Uis9IngiOlIrPXdba107aWYoIVIubWF0Y2gocCkpe3ZhciBOPUEuc2xpY2UoMCxUKSxPPUEuc2xpY2UoVCsxKSxEPXcubWF0Y2goZCk7RCYmKE4ucHVzaChEWzFdKSxPLnVuc2hpZnQoRFsyXSkpLE8ubGVuZ3RoJiYobz0iLyIrTy5qb2luKCIuIikrbyksdGhpcy5ob3N0bmFtZT1OLmpvaW4oIi4iKTticmVha319fWlmKHRoaXMuaG9zdG5hbWUubGVuZ3RoPjI1NT90aGlzLmhvc3RuYW1lPSIiOnRoaXMuaG9zdG5hbWU9dGhpcy5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpLCFJKXt2YXIgUD10aGlzLmhvc3RuYW1lLnNwbGl0KCIuIikseD1bXTtmb3IoVD0wO1Q8UC5sZW5ndGg7KytUKXt2YXIgTT1QW1RdO3gucHVzaChNLm1hdGNoKC9bXkEtWmEtejAtOV8tXS8pPyJ4bi0tIityLmVuY29kZShNKTpNKX10aGlzLmhvc3RuYW1lPXguam9pbigiLiIpfXZhciBVPXRoaXMucG9ydD8iOiIrdGhpcy5wb3J0OiIiLEY9dGhpcy5ob3N0bmFtZXx8IiI7dGhpcy5ob3N0PUYrVSx0aGlzLmhyZWYrPXRoaXMuaG9zdCxJJiYodGhpcy5ob3N0bmFtZT10aGlzLmhvc3RuYW1lLnN1YnN0cigxLHRoaXMuaG9zdG5hbWUubGVuZ3RoLTIpLCIvIiE9PW9bMF0mJihvPSIvIitvKSl9aWYoIWhbYV0pZm9yKFQ9MCxfPWMubGVuZ3RoO1Q8XztUKyspe3ZhciBxPWNbVF0sQj1lbmNvZGVVUklDb21wb25lbnQocSk7Qj09PXEmJihCPWVzY2FwZShxKSksbz1vLnNwbGl0KHEpLmpvaW4oQil9dmFyIGo9by5pbmRleE9mKCIjIik7LTEhPT1qJiYodGhpcy5oYXNoPW8uc3Vic3RyKGopLG89by5zbGljZSgwLGopKTt2YXIgVj1vLmluZGV4T2YoIj8iKTtyZXR1cm4tMSE9PVY/KHRoaXMuc2VhcmNoPW8uc3Vic3RyKFYpLHRoaXMucXVlcnk9by5zdWJzdHIoVisxKSx0JiYodGhpcy5xdWVyeT1tLnBhcnNlKHRoaXMucXVlcnkpKSxvPW8uc2xpY2UoMCxWKSk6dCYmKHRoaXMuc2VhcmNoPSIiLHRoaXMucXVlcnk9e30pLG8mJih0aGlzLnBhdGhuYW1lPW8pLGdbYV0mJnRoaXMuaG9zdG5hbWUmJiF0aGlzLnBhdGhuYW1lJiYodGhpcy5wYXRobmFtZT0iLyIpLCh0aGlzLnBhdGhuYW1lfHx0aGlzLnNlYXJjaCkmJihVPXRoaXMucGF0aG5hbWV8fCIiLE09dGhpcy5zZWFyY2h8fCIiLHRoaXMucGF0aD1VK00pLHRoaXMuaHJlZj10aGlzLmZvcm1hdCgpLHRoaXN9LG8ucHJvdG90eXBlLmZvcm1hdD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuYXV0aHx8IiI7ZSYmKGU9KGU9ZW5jb2RlVVJJQ29tcG9uZW50KGUpKS5yZXBsYWNlKC8lM0EvaSwiOiIpLGUrPSJAIik7dmFyIHQ9dGhpcy5wcm90b2NvbHx8IiIsbj10aGlzLnBhdGhuYW1lfHwiIixyPXRoaXMuaGFzaHx8IiIsbz0hMSxpPSIiO3RoaXMuaG9zdD9vPWUrdGhpcy5ob3N0OnRoaXMuaG9zdG5hbWUmJihvPWUrKC0xPT09dGhpcy5ob3N0bmFtZS5pbmRleE9mKCI6Iik/dGhpcy5ob3N0bmFtZToiWyIrdGhpcy5ob3N0bmFtZSsiXSIpLHRoaXMucG9ydCYmKG8rPSI6Iit0aGlzLnBvcnQpKSx0aGlzLnF1ZXJ5JiZFKHRoaXMucXVlcnkpJiZPYmplY3Qua2V5cyh0aGlzLnF1ZXJ5KS5sZW5ndGgmJihpPW0uc3RyaW5naWZ5KHRoaXMucXVlcnkpKTt2YXIgcz10aGlzLnNlYXJjaHx8aSYmIj8iK2l8fCIiO3JldHVybiB0JiYiOiIhPT10LnN1YnN0cigtMSkmJih0Kz0iOiIpLHRoaXMuc2xhc2hlc3x8KCF0fHxnW3RdKSYmITEhPT1vPyhvPSIvLyIrKG98fCIiKSxuJiYiLyIhPT1uLmNoYXJBdCgwKSYmKG49Ii8iK24pKTpvfHwobz0iIiksciYmIiMiIT09ci5jaGFyQXQoMCkmJihyPSIjIityKSxzJiYiPyIhPT1zLmNoYXJBdCgwKSYmKHM9Ij8iK3MpLHQrbysobj1uLnJlcGxhY2UoL1s/I10vZywoZnVuY3Rpb24oZSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKX0pKSkrKHM9cy5yZXBsYWNlKCIjIiwiJTIzIikpK3J9LG8ucHJvdG90eXBlLnJlc29sdmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVzb2x2ZU9iamVjdCh2KGUsITEsITApKS5mb3JtYXQoKX0sby5wcm90b3R5cGUucmVzb2x2ZU9iamVjdD1mdW5jdGlvbihlKXtpZih5KGUpKXt2YXIgdD1uZXcgbzt0LnBhcnNlKGUsITEsITApLGU9dH12YXIgbj1uZXcgbztpZihPYmplY3Qua2V5cyh0aGlzKS5mb3JFYWNoKChmdW5jdGlvbihlKXtuW2VdPXRoaXNbZV19KSx0aGlzKSxuLmhhc2g9ZS5oYXNoLCIiPT09ZS5ocmVmKXJldHVybiBuLmhyZWY9bi5mb3JtYXQoKSxuO2lmKGUuc2xhc2hlcyYmIWUucHJvdG9jb2wpcmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKHQpeyJwcm90b2NvbCIhPT10JiYoblt0XT1lW3RdKX0pKSxnW24ucHJvdG9jb2xdJiZuLmhvc3RuYW1lJiYhbi5wYXRobmFtZSYmKG4ucGF0aD1uLnBhdGhuYW1lPSIvIiksbi5ocmVmPW4uZm9ybWF0KCksbjtpZihlLnByb3RvY29sJiZlLnByb3RvY29sIT09bi5wcm90b2NvbCl7aWYoIWdbZS5wcm90b2NvbF0pcmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKHQpe25bdF09ZVt0XX0pKSxuLmhyZWY9bi5mb3JtYXQoKSxuO2lmKG4ucHJvdG9jb2w9ZS5wcm90b2NvbCxlLmhvc3R8fGZbZS5wcm90b2NvbF0pbi5wYXRobmFtZT1lLnBhdGhuYW1lO2Vsc2V7Zm9yKHZhciByPShlLnBhdGhuYW1lfHwiIikuc3BsaXQoIi8iKTtyLmxlbmd0aCYmIShlLmhvc3Q9ci5zaGlmdCgpKTspO2UuaG9zdHx8KGUuaG9zdD0iIiksZS5ob3N0bmFtZXx8KGUuaG9zdG5hbWU9IiIpLCIiIT09clswXSYmci51bnNoaWZ0KCIiKSxyLmxlbmd0aDwyJiZyLnVuc2hpZnQoIiIpLG4ucGF0aG5hbWU9ci5qb2luKCIvIil9aWYobi5zZWFyY2g9ZS5zZWFyY2gsbi5xdWVyeT1lLnF1ZXJ5LG4uaG9zdD1lLmhvc3R8fCIiLG4uYXV0aD1lLmF1dGgsbi5ob3N0bmFtZT1lLmhvc3RuYW1lfHxlLmhvc3Qsbi5wb3J0PWUucG9ydCxuLnBhdGhuYW1lfHxuLnNlYXJjaCl7dmFyIGk9bi5wYXRobmFtZXx8IiIscz1uLnNlYXJjaHx8IiI7bi5wYXRoPWkrc31yZXR1cm4gbi5zbGFzaGVzPW4uc2xhc2hlc3x8ZS5zbGFzaGVzLG4uaHJlZj1uLmZvcm1hdCgpLG59dmFyIGE9bi5wYXRobmFtZSYmIi8iPT09bi5wYXRobmFtZS5jaGFyQXQoMCksYz1lLmhvc3R8fGUucGF0aG5hbWUmJiIvIj09PWUucGF0aG5hbWUuY2hhckF0KDApLHU9Y3x8YXx8bi5ob3N0JiZlLnBhdGhuYW1lLGw9dSxwPW4ucGF0aG5hbWUmJm4ucGF0aG5hbWUuc3BsaXQoIi8iKXx8W10sZD0ocj1lLnBhdGhuYW1lJiZlLnBhdGhuYW1lLnNwbGl0KCIvIil8fFtdLG4ucHJvdG9jb2wmJiFnW24ucHJvdG9jb2xdKTtpZihkJiYobi5ob3N0bmFtZT0iIixuLnBvcnQ9bnVsbCxuLmhvc3QmJigiIj09PXBbMF0/cFswXT1uLmhvc3Q6cC51bnNoaWZ0KG4uaG9zdCkpLG4uaG9zdD0iIixlLnByb3RvY29sJiYoZS5ob3N0bmFtZT1udWxsLGUucG9ydD1udWxsLGUuaG9zdCYmKCIiPT09clswXT9yWzBdPWUuaG9zdDpyLnVuc2hpZnQoZS5ob3N0KSksZS5ob3N0PW51bGwpLHU9dSYmKCIiPT09clswXXx8IiI9PT1wWzBdKSksYyluLmhvc3Q9ZS5ob3N0fHwiIj09PWUuaG9zdD9lLmhvc3Q6bi5ob3N0LG4uaG9zdG5hbWU9ZS5ob3N0bmFtZXx8IiI9PT1lLmhvc3RuYW1lP2UuaG9zdG5hbWU6bi5ob3N0bmFtZSxuLnNlYXJjaD1lLnNlYXJjaCxuLnF1ZXJ5PWUucXVlcnkscD1yO2Vsc2UgaWYoci5sZW5ndGgpcHx8KHA9W10pLHAucG9wKCkscD1wLmNvbmNhdChyKSxuLnNlYXJjaD1lLnNlYXJjaCxuLnF1ZXJ5PWUucXVlcnk7ZWxzZSBpZihudWxsIT1lLnNlYXJjaClyZXR1cm4gZCYmKG4uaG9zdG5hbWU9bi5ob3N0PXAuc2hpZnQoKSwoYj0hIShuLmhvc3QmJm4uaG9zdC5pbmRleE9mKCJAIik+MCkmJm4uaG9zdC5zcGxpdCgiQCIpKSYmKG4uYXV0aD1iLnNoaWZ0KCksbi5ob3N0PW4uaG9zdG5hbWU9Yi5zaGlmdCgpKSksbi5zZWFyY2g9ZS5zZWFyY2gsbi5xdWVyeT1lLnF1ZXJ5LFMobi5wYXRobmFtZSkmJlMobi5zZWFyY2gpfHwobi5wYXRoPShuLnBhdGhuYW1lP24ucGF0aG5hbWU6IiIpKyhuLnNlYXJjaD9uLnNlYXJjaDoiIikpLG4uaHJlZj1uLmZvcm1hdCgpLG47aWYoIXAubGVuZ3RoKXJldHVybiBuLnBhdGhuYW1lPW51bGwsbi5zZWFyY2g/bi5wYXRoPSIvIituLnNlYXJjaDpuLnBhdGg9bnVsbCxuLmhyZWY9bi5mb3JtYXQoKSxuO2Zvcih2YXIgaD1wLnNsaWNlKC0xKVswXSxtPShuLmhvc3R8fGUuaG9zdCkmJigiLiI9PT1ofHwiLi4iPT09aCl8fCIiPT09aCx2PTAsRT1wLmxlbmd0aDtFPj0wO0UtLSkiLiI9PShoPXBbRV0pP3Auc3BsaWNlKEUsMSk6Ii4uIj09PWg/KHAuc3BsaWNlKEUsMSksdisrKTp2JiYocC5zcGxpY2UoRSwxKSx2LS0pO2lmKCF1JiYhbClmb3IoO3YtLTt2KXAudW5zaGlmdCgiLi4iKTshdXx8IiI9PT1wWzBdfHxwWzBdJiYiLyI9PT1wWzBdLmNoYXJBdCgwKXx8cC51bnNoaWZ0KCIiKSxtJiYiLyIhPT1wLmpvaW4oIi8iKS5zdWJzdHIoLTEpJiZwLnB1c2goIiIpO3ZhciBiLFQ9IiI9PT1wWzBdfHxwWzBdJiYiLyI9PT1wWzBdLmNoYXJBdCgwKTtyZXR1cm4gZCYmKG4uaG9zdG5hbWU9bi5ob3N0PVQ/IiI6cC5sZW5ndGg/cC5zaGlmdCgpOiIiLChiPSEhKG4uaG9zdCYmbi5ob3N0LmluZGV4T2YoIkAiKT4wKSYmbi5ob3N0LnNwbGl0KCJAIikpJiYobi5hdXRoPWIuc2hpZnQoKSxuLmhvc3Q9bi5ob3N0bmFtZT1iLnNoaWZ0KCkpKSwodT11fHxuLmhvc3QmJnAubGVuZ3RoKSYmIVQmJnAudW5zaGlmdCgiIikscC5sZW5ndGg/bi5wYXRobmFtZT1wLmpvaW4oIi8iKToobi5wYXRobmFtZT1udWxsLG4ucGF0aD1udWxsKSxTKG4ucGF0aG5hbWUpJiZTKG4uc2VhcmNoKXx8KG4ucGF0aD0obi5wYXRobmFtZT9uLnBhdGhuYW1lOiIiKSsobi5zZWFyY2g/bi5zZWFyY2g6IiIpKSxuLmF1dGg9ZS5hdXRofHxuLmF1dGgsbi5zbGFzaGVzPW4uc2xhc2hlc3x8ZS5zbGFzaGVzLG4uaHJlZj1uLmZvcm1hdCgpLG59LG8ucHJvdG90eXBlLnBhcnNlSG9zdD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuaG9zdCx0PXMuZXhlYyhlKTt0JiYoIjoiIT09KHQ9dFswXSkmJih0aGlzLnBvcnQ9dC5zdWJzdHIoMSkpLGU9ZS5zdWJzdHIoMCxlLmxlbmd0aC10Lmxlbmd0aCkpLGUmJih0aGlzLmhvc3RuYW1lPWUpfX0se3B1bnljb2RlOjg0LHF1ZXJ5c3RyaW5nOjk1fV0sMTAxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9dm9pZCAwO2Zvcih2YXIgcj1bXSxvPTA7bzwyNTY7KytvKXJbb109KG8rMjU2KS50b1N0cmluZygxNikuc3Vic3RyKDEpO3ZhciBpPWZ1bmN0aW9uKGUsdCl7dmFyIG49dHx8MCxvPXI7cmV0dXJuW29bZVtuKytdXSxvW2VbbisrXV0sb1tlW24rK11dLG9bZVtuKytdXSwiLSIsb1tlW24rK11dLG9bZVtuKytdXSwiLSIsb1tlW24rK11dLG9bZVtuKytdXSwiLSIsb1tlW24rK11dLG9bZVtuKytdXSwiLSIsb1tlW24rK11dLG9bZVtuKytdXSxvW2VbbisrXV0sb1tlW24rK11dLG9bZVtuKytdXSxvW2VbbisrXV1dLmpvaW4oIiIpfTtuLmRlZmF1bHQ9aX0se31dLDEwMjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sInYxIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gci5kZWZhdWx0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJ2MyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG8uZGVmYXVsdH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobiwidjQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBpLmRlZmF1bHR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sInY1Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcy5kZWZhdWx0fX0pO3ZhciByPWEoZSgiLi92MS5qcyIpKSxvPWEoZSgiLi92My5qcyIpKSxpPWEoZSgiLi92NC5qcyIpKSxzPWEoZSgiLi92NS5qcyIpKTtmdW5jdGlvbiBhKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX19LHsiLi92MS5qcyI6MTA2LCIuL3YzLmpzIjoxMDcsIi4vdjQuanMiOjEwOSwiLi92NS5qcyI6MTEwfV0sMTAzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXt2YXIgbj0oNjU1MzUmZSkrKDY1NTM1JnQpO3JldHVybihlPj4xNikrKHQ+PjE2KSsobj4+MTYpPDwxNnw2NTUzNSZufWZ1bmN0aW9uIG8oZSx0LG4sbyxpLHMpe3JldHVybiByKChhPXIocih0LGUpLHIobyxzKSkpPDwoYz1pKXxhPj4+MzItYyxuKTt2YXIgYSxjfWZ1bmN0aW9uIGkoZSx0LG4scixpLHMsYSl7cmV0dXJuIG8odCZufH50JnIsZSx0LGkscyxhKX1mdW5jdGlvbiBzKGUsdCxuLHIsaSxzLGEpe3JldHVybiBvKHQmcnxuJn5yLGUsdCxpLHMsYSl9ZnVuY3Rpb24gYShlLHQsbixyLGkscyxhKXtyZXR1cm4gbyh0Xm5ecixlLHQsaSxzLGEpfWZ1bmN0aW9uIGMoZSx0LG4scixpLHMsYSl7cmV0dXJuIG8obl4odHx+ciksZSx0LGkscyxhKX1PYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PXZvaWQgMDt2YXIgdT1mdW5jdGlvbihlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpe3ZhciB0PXVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlKSk7ZT1uZXcgQXJyYXkodC5sZW5ndGgpO2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWVbbl09dC5jaGFyQ29kZUF0KG4pfXJldHVybiBmdW5jdGlvbihlKXt2YXIgdCxuLHIsbz1bXSxpPTMyKmUubGVuZ3RoLHM9IjAxMjM0NTY3ODlhYmNkZWYiO2Zvcih0PTA7dDxpO3QrPTgpbj1lW3Q+PjVdPj4+dCUzMiYyNTUscj1wYXJzZUludChzLmNoYXJBdChuPj4+NCYxNSkrcy5jaGFyQXQoMTUmbiksMTYpLG8ucHVzaChyKTtyZXR1cm4gb30oZnVuY3Rpb24oZSx0KXt2YXIgbixvLHUsbCxwO2VbdD4+NV18PTEyODw8dCUzMixlWzE0Kyh0KzY0Pj4+OTw8NCldPXQ7dmFyIGQ9MTczMjU4NDE5MyxoPS0yNzE3MzM4NzksZj0tMTczMjU4NDE5NCxnPTI3MTczMzg3ODtmb3Iobj0wO248ZS5sZW5ndGg7bis9MTYpbz1kLHU9aCxsPWYscD1nLGQ9aShkLGgsZixnLGVbbl0sNywtNjgwODc2OTM2KSxnPWkoZyxkLGgsZixlW24rMV0sMTIsLTM4OTU2NDU4NiksZj1pKGYsZyxkLGgsZVtuKzJdLDE3LDYwNjEwNTgxOSksaD1pKGgsZixnLGQsZVtuKzNdLDIyLC0xMDQ0NTI1MzMwKSxkPWkoZCxoLGYsZyxlW24rNF0sNywtMTc2NDE4ODk3KSxnPWkoZyxkLGgsZixlW24rNV0sMTIsMTIwMDA4MDQyNiksZj1pKGYsZyxkLGgsZVtuKzZdLDE3LC0xNDczMjMxMzQxKSxoPWkoaCxmLGcsZCxlW24rN10sMjIsLTQ1NzA1OTgzKSxkPWkoZCxoLGYsZyxlW24rOF0sNywxNzcwMDM1NDE2KSxnPWkoZyxkLGgsZixlW24rOV0sMTIsLTE5NTg0MTQ0MTcpLGY9aShmLGcsZCxoLGVbbisxMF0sMTcsLTQyMDYzKSxoPWkoaCxmLGcsZCxlW24rMTFdLDIyLC0xOTkwNDA0MTYyKSxkPWkoZCxoLGYsZyxlW24rMTJdLDcsMTgwNDYwMzY4MiksZz1pKGcsZCxoLGYsZVtuKzEzXSwxMiwtNDAzNDExMDEpLGY9aShmLGcsZCxoLGVbbisxNF0sMTcsLTE1MDIwMDIyOTApLGQ9cyhkLGg9aShoLGYsZyxkLGVbbisxNV0sMjIsMTIzNjUzNTMyOSksZixnLGVbbisxXSw1LC0xNjU3OTY1MTApLGc9cyhnLGQsaCxmLGVbbis2XSw5LC0xMDY5NTAxNjMyKSxmPXMoZixnLGQsaCxlW24rMTFdLDE0LDY0MzcxNzcxMyksaD1zKGgsZixnLGQsZVtuXSwyMCwtMzczODk3MzAyKSxkPXMoZCxoLGYsZyxlW24rNV0sNSwtNzAxNTU4NjkxKSxnPXMoZyxkLGgsZixlW24rMTBdLDksMzgwMTYwODMpLGY9cyhmLGcsZCxoLGVbbisxNV0sMTQsLTY2MDQ3ODMzNSksaD1zKGgsZixnLGQsZVtuKzRdLDIwLC00MDU1Mzc4NDgpLGQ9cyhkLGgsZixnLGVbbis5XSw1LDU2ODQ0NjQzOCksZz1zKGcsZCxoLGYsZVtuKzE0XSw5LC0xMDE5ODAzNjkwKSxmPXMoZixnLGQsaCxlW24rM10sMTQsLTE4NzM2Mzk2MSksaD1zKGgsZixnLGQsZVtuKzhdLDIwLDExNjM1MzE1MDEpLGQ9cyhkLGgsZixnLGVbbisxM10sNSwtMTQ0NDY4MTQ2NyksZz1zKGcsZCxoLGYsZVtuKzJdLDksLTUxNDAzNzg0KSxmPXMoZixnLGQsaCxlW24rN10sMTQsMTczNTMyODQ3MyksZD1hKGQsaD1zKGgsZixnLGQsZVtuKzEyXSwyMCwtMTkyNjYwNzczNCksZixnLGVbbis1XSw0LC0zNzg1NTgpLGc9YShnLGQsaCxmLGVbbis4XSwxMSwtMjAyMjU3NDQ2MyksZj1hKGYsZyxkLGgsZVtuKzExXSwxNiwxODM5MDMwNTYyKSxoPWEoaCxmLGcsZCxlW24rMTRdLDIzLC0zNTMwOTU1NiksZD1hKGQsaCxmLGcsZVtuKzFdLDQsLTE1MzA5OTIwNjApLGc9YShnLGQsaCxmLGVbbis0XSwxMSwxMjcyODkzMzUzKSxmPWEoZixnLGQsaCxlW24rN10sMTYsLTE1NTQ5NzYzMiksaD1hKGgsZixnLGQsZVtuKzEwXSwyMywtMTA5NDczMDY0MCksZD1hKGQsaCxmLGcsZVtuKzEzXSw0LDY4MTI3OTE3NCksZz1hKGcsZCxoLGYsZVtuXSwxMSwtMzU4NTM3MjIyKSxmPWEoZixnLGQsaCxlW24rM10sMTYsLTcyMjUyMTk3OSksaD1hKGgsZixnLGQsZVtuKzZdLDIzLDc2MDI5MTg5KSxkPWEoZCxoLGYsZyxlW24rOV0sNCwtNjQwMzY0NDg3KSxnPWEoZyxkLGgsZixlW24rMTJdLDExLC00MjE4MTU4MzUpLGY9YShmLGcsZCxoLGVbbisxNV0sMTYsNTMwNzQyNTIwKSxkPWMoZCxoPWEoaCxmLGcsZCxlW24rMl0sMjMsLTk5NTMzODY1MSksZixnLGVbbl0sNiwtMTk4NjMwODQ0KSxnPWMoZyxkLGgsZixlW24rN10sMTAsMTEyNjg5MTQxNSksZj1jKGYsZyxkLGgsZVtuKzE0XSwxNSwtMTQxNjM1NDkwNSksaD1jKGgsZixnLGQsZVtuKzVdLDIxLC01NzQzNDA1NSksZD1jKGQsaCxmLGcsZVtuKzEyXSw2LDE3MDA0ODU1NzEpLGc9YyhnLGQsaCxmLGVbbiszXSwxMCwtMTg5NDk4NjYwNiksZj1jKGYsZyxkLGgsZVtuKzEwXSwxNSwtMTA1MTUyMyksaD1jKGgsZixnLGQsZVtuKzFdLDIxLC0yMDU0OTIyNzk5KSxkPWMoZCxoLGYsZyxlW24rOF0sNiwxODczMzEzMzU5KSxnPWMoZyxkLGgsZixlW24rMTVdLDEwLC0zMDYxMTc0NCksZj1jKGYsZyxkLGgsZVtuKzZdLDE1LC0xNTYwMTk4MzgwKSxoPWMoaCxmLGcsZCxlW24rMTNdLDIxLDEzMDkxNTE2NDkpLGQ9YyhkLGgsZixnLGVbbis0XSw2LC0xNDU1MjMwNzApLGc9YyhnLGQsaCxmLGVbbisxMV0sMTAsLTExMjAyMTAzNzkpLGY9YyhmLGcsZCxoLGVbbisyXSwxNSw3MTg3ODcyNTkpLGg9YyhoLGYsZyxkLGVbbis5XSwyMSwtMzQzNDg1NTUxKSxkPXIoZCxvKSxoPXIoaCx1KSxmPXIoZixsKSxnPXIoZyxwKTtyZXR1cm5bZCxoLGYsZ119KGZ1bmN0aW9uKGUpe3ZhciB0LG49W107Zm9yKG5bKGUubGVuZ3RoPj4yKS0xXT12b2lkIDAsdD0wO3Q8bi5sZW5ndGg7dCs9MSluW3RdPTA7dmFyIHI9OCplLmxlbmd0aDtmb3IodD0wO3Q8cjt0Kz04KW5bdD4+NV18PSgyNTUmZVt0LzhdKTw8dCUzMjtyZXR1cm4gbn0oZSksOCplLmxlbmd0aCkpfTtuLmRlZmF1bHQ9dX0se31dLDEwNDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PWZ1bmN0aW9uKCl7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCIpO3JldHVybiByKG8pfTt2YXIgcj0idW5kZWZpbmVkIiE9dHlwZW9mIGNyeXB0byYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcyYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byl8fCJ1bmRlZmluZWQiIT10eXBlb2YgbXNDcnlwdG8mJiJmdW5jdGlvbiI9PXR5cGVvZiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMmJm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKG1zQ3J5cHRvKSxvPW5ldyBVaW50OEFycmF5KDE2KX0se31dLDEwNTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3N3aXRjaChlKXtjYXNlIDA6cmV0dXJuIHQmbl5+dCZyO2Nhc2UgMTpjYXNlIDM6cmV0dXJuIHRebl5yO2Nhc2UgMjpyZXR1cm4gdCZuXnQmcl5uJnJ9fWZ1bmN0aW9uIG8oZSx0KXtyZXR1cm4gZTw8dHxlPj4+MzItdH1PYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PXZvaWQgMDt2YXIgaT1mdW5jdGlvbihlKXt2YXIgdD1bMTUxODUwMDI0OSwxODU5Nzc1MzkzLDI0MDA5NTk3MDgsMzM5NTQ2OTc4Ml0sbj1bMTczMjU4NDE5Myw0MDIzMjMzNDE3LDI1NjIzODMxMDIsMjcxNzMzODc4LDMyODUzNzc1MjBdO2lmKCJzdHJpbmciPT10eXBlb2YgZSl7dmFyIGk9dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUpKTtlPW5ldyBBcnJheShpLmxlbmd0aCk7Zm9yKHZhciBzPTA7czxpLmxlbmd0aDtzKyspZVtzXT1pLmNoYXJDb2RlQXQocyl9ZS5wdXNoKDEyOCk7dmFyIGE9ZS5sZW5ndGgvNCsyLGM9TWF0aC5jZWlsKGEvMTYpLHU9bmV3IEFycmF5KGMpO2ZvcihzPTA7czxjO3MrKyl7dVtzXT1uZXcgQXJyYXkoMTYpO2Zvcih2YXIgbD0wO2w8MTY7bCsrKXVbc11bbF09ZVs2NCpzKzQqbF08PDI0fGVbNjQqcys0KmwrMV08PDE2fGVbNjQqcys0KmwrMl08PDh8ZVs2NCpzKzQqbCszXX1mb3IodVtjLTFdWzE0XT04KihlLmxlbmd0aC0xKS9NYXRoLnBvdygyLDMyKSx1W2MtMV1bMTRdPU1hdGguZmxvb3IodVtjLTFdWzE0XSksdVtjLTFdWzE1XT04KihlLmxlbmd0aC0xKSY0Mjk0OTY3Mjk1LHM9MDtzPGM7cysrKXtmb3IodmFyIHA9bmV3IEFycmF5KDgwKSxkPTA7ZDwxNjtkKyspcFtkXT11W3NdW2RdO2ZvcihkPTE2O2Q8ODA7ZCsrKXBbZF09byhwW2QtM11ecFtkLThdXnBbZC0xNF1ecFtkLTE2XSwxKTt2YXIgaD1uWzBdLGY9blsxXSxnPW5bMl0sbT1uWzNdLHY9bls0XTtmb3IoZD0wO2Q8ODA7ZCsrKXt2YXIgeT1NYXRoLmZsb29yKGQvMjApLEU9byhoLDUpK3IoeSxmLGcsbSkrdit0W3ldK3BbZF0+Pj4wO3Y9bSxtPWcsZz1vKGYsMzApPj4+MCxmPWgsaD1FfW5bMF09blswXStoPj4+MCxuWzFdPW5bMV0rZj4+PjAsblsyXT1uWzJdK2c+Pj4wLG5bM109blszXSttPj4+MCxuWzRdPW5bNF0rdj4+PjB9cmV0dXJuW25bMF0+PjI0JjI1NSxuWzBdPj4xNiYyNTUsblswXT4+OCYyNTUsMjU1Jm5bMF0sblsxXT4+MjQmMjU1LG5bMV0+PjE2JjI1NSxuWzFdPj44JjI1NSwyNTUmblsxXSxuWzJdPj4yNCYyNTUsblsyXT4+MTYmMjU1LG5bMl0+PjgmMjU1LDI1NSZuWzJdLG5bM10+PjI0JjI1NSxuWzNdPj4xNiYyNTUsblszXT4+OCYyNTUsMjU1Jm5bM10sbls0XT4+MjQmMjU1LG5bNF0+PjE2JjI1NSxuWzRdPj44JjI1NSwyNTUmbls0XV19O24uZGVmYXVsdD1pfSx7fV0sMTA2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9dm9pZCAwO3ZhciByLG8saT1hKGUoIi4vcm5nLmpzIikpLHM9YShlKCIuL2J5dGVzVG9VdWlkLmpzIikpO2Z1bmN0aW9uIGEoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fXZhciBjPTAsdT0wLGw9ZnVuY3Rpb24oZSx0LG4pe3ZhciBhPXQmJm58fDAsbD10fHxbXSxwPShlPWV8fHt9KS5ub2RlfHxyLGQ9dm9pZCAwIT09ZS5jbG9ja3NlcT9lLmNsb2Nrc2VxOm87aWYobnVsbD09cHx8bnVsbD09ZCl7dmFyIGg9ZS5yYW5kb218fChlLnJuZ3x8aS5kZWZhdWx0KSgpO251bGw9PXAmJihwPXI9WzF8aFswXSxoWzFdLGhbMl0saFszXSxoWzRdLGhbNV1dKSxudWxsPT1kJiYoZD1vPTE2MzgzJihoWzZdPDw4fGhbN10pKX12YXIgZj12b2lkIDAhPT1lLm1zZWNzP2UubXNlY3M6KG5ldyBEYXRlKS5nZXRUaW1lKCksZz12b2lkIDAhPT1lLm5zZWNzP2UubnNlY3M6dSsxLG09Zi1jKyhnLXUpLzFlNDtpZihtPDAmJnZvaWQgMD09PWUuY2xvY2tzZXEmJihkPWQrMSYxNjM4MyksKG08MHx8Zj5jKSYmdm9pZCAwPT09ZS5uc2VjcyYmKGc9MCksZz49MWU0KXRocm93IG5ldyBFcnJvcigidXVpZC52MSgpOiBDYW4ndCBjcmVhdGUgbW9yZSB0aGFuIDEwTSB1dWlkcy9zZWMiKTtjPWYsdT1nLG89ZDt2YXIgdj0oMWU0KigyNjg0MzU0NTUmKGYrPTEyMjE5MjkyOGU1KSkrZyklNDI5NDk2NzI5NjtsW2ErK109dj4+PjI0JjI1NSxsW2ErK109dj4+PjE2JjI1NSxsW2ErK109dj4+PjgmMjU1LGxbYSsrXT0yNTUmdjt2YXIgeT1mLzQyOTQ5NjcyOTYqMWU0JjI2ODQzNTQ1NTtsW2ErK109eT4+PjgmMjU1LGxbYSsrXT0yNTUmeSxsW2ErK109eT4+PjI0JjE1fDE2LGxbYSsrXT15Pj4+MTYmMjU1LGxbYSsrXT1kPj4+OHwxMjgsbFthKytdPTI1NSZkO2Zvcih2YXIgRT0wO0U8NjsrK0UpbFthK0VdPXBbRV07cmV0dXJuIHR8fCgwLHMuZGVmYXVsdCkobCl9O24uZGVmYXVsdD1sfSx7Ii4vYnl0ZXNUb1V1aWQuanMiOjEwMSwiLi9ybmcuanMiOjEwNH1dLDEwNzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PXZvaWQgMDt2YXIgcj1pKGUoIi4vdjM1LmpzIikpLG89aShlKCIuL21kNS5qcyIpKTtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX12YXIgcz0oMCxyLmRlZmF1bHQpKCJ2MyIsNDgsby5kZWZhdWx0KTtuLmRlZmF1bHQ9c30seyIuL21kNS5qcyI6MTAzLCIuL3YzNS5qcyI6MTA4fV0sMTA4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWZ1bmN0aW9uKGUscixpLHMpe3ZhciBhPWkmJnN8fDA7aWYoInN0cmluZyI9PXR5cGVvZiBlJiYoZT1mdW5jdGlvbihlKXtlPXVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlKSk7Zm9yKHZhciB0PW5ldyBBcnJheShlLmxlbmd0aCksbj0wO248ZS5sZW5ndGg7bisrKXRbbl09ZS5jaGFyQ29kZUF0KG4pO3JldHVybiB0fShlKSksInN0cmluZyI9PXR5cGVvZiByJiYocj1mdW5jdGlvbihlKXt2YXIgdD1bXTtyZXR1cm4gZS5yZXBsYWNlKC9bYS1mQS1GMC05XXsyfS9nLChmdW5jdGlvbihlKXt0LnB1c2gocGFyc2VJbnQoZSwxNikpfSkpLHR9KHIpKSwhQXJyYXkuaXNBcnJheShlKSl0aHJvdyBUeXBlRXJyb3IoInZhbHVlIG11c3QgYmUgYW4gYXJyYXkgb2YgYnl0ZXMiKTtpZighQXJyYXkuaXNBcnJheShyKXx8MTYhPT1yLmxlbmd0aCl0aHJvdyBUeXBlRXJyb3IoIm5hbWVzcGFjZSBtdXN0IGJlIHV1aWQgc3RyaW5nIG9yIGFuIEFycmF5IG9mIDE2IGJ5dGUgdmFsdWVzIik7dmFyIGM9bihyLmNvbmNhdChlKSk7aWYoY1s2XT0xNSZjWzZdfHQsY1s4XT02MyZjWzhdfDEyOCxpKWZvcih2YXIgdT0wO3U8MTY7Kyt1KWlbYSt1XT1jW3VdO3JldHVybiBpfHwoMCxvLmRlZmF1bHQpKGMpfTt0cnl7ci5uYW1lPWV9Y2F0Y2goZSl7fXJldHVybiByLkROUz1pLHIuVVJMPXMscn0sbi5VUkw9bi5ETlM9dm9pZCAwO3ZhciByLG89KHI9ZSgiLi9ieXRlc1RvVXVpZC5qcyIpKSYmci5fX2VzTW9kdWxlP3I6e2RlZmF1bHQ6cn07Y29uc3QgaT0iNmJhN2I4MTAtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4IjtuLkROUz1pO2NvbnN0IHM9IjZiYTdiODExLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCI7bi5VUkw9c30seyIuL2J5dGVzVG9VdWlkLmpzIjoxMDF9XSwxMDk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG4uZGVmYXVsdD12b2lkIDA7dmFyIHI9aShlKCIuL3JuZy5qcyIpKSxvPWkoZSgiLi9ieXRlc1RvVXVpZC5qcyIpKTtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX12YXIgcz1mdW5jdGlvbihlLHQsbil7dmFyIGk9dCYmbnx8MDsic3RyaW5nIj09dHlwZW9mIGUmJih0PSJiaW5hcnkiPT09ZT9uZXcgQXJyYXkoMTYpOm51bGwsZT1udWxsKTt2YXIgcz0oZT1lfHx7fSkucmFuZG9tfHwoZS5ybmd8fHIuZGVmYXVsdCkoKTtpZihzWzZdPTE1JnNbNl18NjQsc1s4XT02MyZzWzhdfDEyOCx0KWZvcih2YXIgYT0wO2E8MTY7KythKXRbaSthXT1zW2FdO3JldHVybiB0fHwoMCxvLmRlZmF1bHQpKHMpfTtuLmRlZmF1bHQ9c30seyIuL2J5dGVzVG9VdWlkLmpzIjoxMDEsIi4vcm5nLmpzIjoxMDR9XSwxMTA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG4uZGVmYXVsdD12b2lkIDA7dmFyIHI9aShlKCIuL3YzNS5qcyIpKSxvPWkoZSgiLi9zaGExLmpzIikpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fXZhciBzPSgwLHIuZGVmYXVsdCkoInY1Iiw4MCxvLmRlZmF1bHQpO24uZGVmYXVsdD1zfSx7Ii4vc2hhMS5qcyI6MTA1LCIuL3YzNS5qcyI6MTA4fV0sMTExOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1lKCIuL3V0aWxzL0xSVSIpLG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPTFlMyksdGhpcy5tYXhTaXplPWUsdGhpcy5jYWNoZT1uZXcgci5MUlVDYWNoZShlKX1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJzaXplIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FjaGUubGVuZ3RofSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnB1dD1mdW5jdGlvbih0LG4pe3ZhciByPSJzdHJpbmciIT10eXBlb2YgdD9lLmdldEtleVN0cmluZyh0KTp0LG89dGhpcy5wb3B1bGF0ZVZhbHVlKG4pO3RoaXMuY2FjaGUucHV0KHIsbyl9LGUucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgbj0ic3RyaW5nIiE9dHlwZW9mIHQ/ZS5nZXRLZXlTdHJpbmcodCk6dCxyPURhdGUubm93KCksbz10aGlzLmNhY2hlLmdldChuKTtpZihvKXtmb3IodmFyIGk9by5sZW5ndGgtMTtpPj0wO2ktLSlvW2ldLkV4cGlyZTxyJiZvLnNwbGljZShpLDEpO2lmKDA9PT1vLmxlbmd0aClyZXR1cm4gdm9pZCB0aGlzLmNhY2hlLnJlbW92ZShuKX1yZXR1cm4gb30sZS5nZXRLZXlTdHJpbmc9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49T2JqZWN0LmtleXMoZSkuc29ydCgpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIG89bltyXTt2b2lkIDAhPT1lW29dJiZ0LnB1c2goZVtvXSl9cmV0dXJuIHQuam9pbigiICIpfSxlLnByb3RvdHlwZS5wb3B1bGF0ZVZhbHVlPWZ1bmN0aW9uKGUpe3ZhciB0PURhdGUubm93KCk7cmV0dXJuIGUubWFwKChmdW5jdGlvbihlKXtyZXR1cm57QWRkcmVzczplLkFkZHJlc3N8fCIiLEV4cGlyZTp0KzYwKihlLkNhY2hlUGVyaW9kSW5NaW51dGVzfHwxKSoxZTN9fSkpfSxlLnByb3RvdHlwZS5lbXB0eT1mdW5jdGlvbigpe3RoaXMuY2FjaGUuZW1wdHkoKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3ZhciBuPSJzdHJpbmciIT10eXBlb2YgdD9lLmdldEtleVN0cmluZyh0KTp0O3RoaXMuY2FjaGUucmVtb3ZlKG4pfSxlfSgpO24uRW5kcG9pbnRDYWNoZT1vfSx7Ii4vdXRpbHMvTFJVIjoxMTJ9XSwxMTI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWZ1bmN0aW9uKGUsdCl7dGhpcy5rZXk9ZSx0aGlzLnZhbHVlPXR9LG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2lmKHRoaXMubm9kZU1hcD17fSx0aGlzLnNpemU9MCwibnVtYmVyIiE9dHlwZW9mIGV8fGU8MSl0aHJvdyBuZXcgRXJyb3IoIkNhY2hlIHNpemUgY2FuIG9ubHkgYmUgcG9zaXRpdmUgbnVtYmVyIik7dGhpcy5zaXplTGltaXQ9ZX1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJsZW5ndGgiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaXplfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnByZXBlbmRUb0xpc3Q9ZnVuY3Rpb24oZSl7dGhpcy5oZWFkZXJOb2RlPyh0aGlzLmhlYWRlck5vZGUucHJldj1lLGUubmV4dD10aGlzLmhlYWRlck5vZGUpOnRoaXMudGFpbE5vZGU9ZSx0aGlzLmhlYWRlck5vZGU9ZSx0aGlzLnNpemUrK30sZS5wcm90b3R5cGUucmVtb3ZlRnJvbVRhaWw9ZnVuY3Rpb24oKXtpZih0aGlzLnRhaWxOb2RlKXt2YXIgZT10aGlzLnRhaWxOb2RlLHQ9ZS5wcmV2O3JldHVybiB0JiYodC5uZXh0PXZvaWQgMCksZS5wcmV2PXZvaWQgMCx0aGlzLnRhaWxOb2RlPXQsdGhpcy5zaXplLS0sZX19LGUucHJvdG90eXBlLmRldGFjaEZyb21MaXN0PWZ1bmN0aW9uKGUpe3RoaXMuaGVhZGVyTm9kZT09PWUmJih0aGlzLmhlYWRlck5vZGU9ZS5uZXh0KSx0aGlzLnRhaWxOb2RlPT09ZSYmKHRoaXMudGFpbE5vZGU9ZS5wcmV2KSxlLnByZXYmJihlLnByZXYubmV4dD1lLm5leHQpLGUubmV4dCYmKGUubmV4dC5wcmV2PWUucHJldiksZS5uZXh0PXZvaWQgMCxlLnByZXY9dm9pZCAwLHRoaXMuc2l6ZS0tfSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oZSl7aWYodGhpcy5ub2RlTWFwW2VdKXt2YXIgdD10aGlzLm5vZGVNYXBbZV07cmV0dXJuIHRoaXMuZGV0YWNoRnJvbUxpc3QodCksdGhpcy5wcmVwZW5kVG9MaXN0KHQpLHQudmFsdWV9fSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oZSl7aWYodGhpcy5ub2RlTWFwW2VdKXt2YXIgdD10aGlzLm5vZGVNYXBbZV07dGhpcy5kZXRhY2hGcm9tTGlzdCh0KSxkZWxldGUgdGhpcy5ub2RlTWFwW2VdfX0sZS5wcm90b3R5cGUucHV0PWZ1bmN0aW9uKGUsdCl7aWYodGhpcy5ub2RlTWFwW2VdKXRoaXMucmVtb3ZlKGUpO2Vsc2UgaWYodGhpcy5zaXplPT09dGhpcy5zaXplTGltaXQpe3ZhciBuPXRoaXMucmVtb3ZlRnJvbVRhaWwoKS5rZXk7ZGVsZXRlIHRoaXMubm9kZU1hcFtuXX12YXIgbz1uZXcgcihlLHQpO3RoaXMubm9kZU1hcFtlXT1vLHRoaXMucHJlcGVuZFRvTGlzdChvKX0sZS5wcm90b3R5cGUuZW1wdHk9ZnVuY3Rpb24oKXtmb3IodmFyIGU9T2JqZWN0LmtleXModGhpcy5ub2RlTWFwKSx0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciBuPWVbdF0scj10aGlzLm5vZGVNYXBbbl07dGhpcy5kZXRhY2hGcm9tTGlzdChyKSxkZWxldGUgdGhpcy5ub2RlTWFwW25dfX0sZX0oKTtuLkxSVUNhY2hlPW99LHt9XSwxMTM6W2Z1bmN0aW9uKGUsdCxuKXtlKCIuL2Jyb3dzZXJfbG9hZGVyIik7dmFyIHI9ZSgiLi9jb3JlIik7InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJih3aW5kb3cuQVdTPXIpLHZvaWQgMCE9PXQmJih0LmV4cG9ydHM9ciksInVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiYoc2VsZi5BV1M9ciksT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsIkNvbm5lY3QiKXx8KHIuYXBpTG9hZGVyLnNlcnZpY2VzLmNvbm5lY3Q9e30sci5Db25uZWN0PXIuU2VydmljZS5kZWZpbmVTZXJ2aWNlKCJjb25uZWN0IixbIjIwMTctMDItMTUiXSkpLHIuYXBpTG9hZGVyLnNlcnZpY2VzLmNvbm5lY3RbIjIwMTctMDItMTUiXT1lKCIuLi9hcGlzL2Nvbm5lY3QtMjAxNy0wMi0xNS5taW4iKX0seyIuLi9hcGlzL2Nvbm5lY3QtMjAxNy0wMi0xNS5taW4iOjMsIi4vYnJvd3Nlcl9sb2FkZXIiOjE2LCIuL2NvcmUiOjE5fV19LHt9LFsxMTNdKX0sNzU0OigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsZS5saWx5PXQsdC5DbGllbnRNZXRob2RzPXQubWFrZUVudW0oWyJnZXRBZ2VudFNuYXBzaG90IiwicHV0QWdlbnRTdGF0ZSIsImdldEFnZW50U3RhdGVzIiwiZ2V0RGlhbGFibGVDb3VudHJ5Q29kZXMiLCJnZXRSb3V0aW5nUHJvZmlsZVF1ZXVlcyIsImdldEFnZW50UGVybWlzc2lvbnMiLCJnZXRBZ2VudENvbmZpZ3VyYXRpb24iLCJ1cGRhdGVBZ2VudENvbmZpZ3VyYXRpb24iLCJhY2NlcHRDb250YWN0IiwiY3JlYXRlT3V0Ym91bmRDb250YWN0IiwiY3JlYXRlVGFza0NvbnRhY3QiLCJjbGVhckNvbnRhY3QiLCJjb21wbGV0ZUNvbnRhY3QiLCJkZXN0cm95Q29udGFjdCIsInJlamVjdENvbnRhY3QiLCJub3RpZnlDb250YWN0SXNzdWUiLCJ1cGRhdGVDb250YWN0QXR0cmlidXRlcyIsImNyZWF0ZUFkZGl0aW9uYWxDb25uZWN0aW9uIiwiZGVzdHJveUNvbm5lY3Rpb24iLCJob2xkQ29ubmVjdGlvbiIsInJlc3VtZUNvbm5lY3Rpb24iLCJ0b2dnbGVBY3RpdmVDb25uZWN0aW9ucyIsImNvbmZlcmVuY2VDb25uZWN0aW9ucyIsInNlbmRDbGllbnRMb2dzIiwic2VuZERpZ2l0cyIsInNlbmRTb2Z0cGhvbmVDYWxsUmVwb3J0Iiwic2VuZFNvZnRwaG9uZUNhbGxNZXRyaWNzIiwiZ2V0RW5kcG9pbnRzIiwiZ2V0TmV3QXV0aFRva2VuIiwiY3JlYXRlVHJhbnNwb3J0IiwibXV0ZVBhcnRpY2lwYW50IiwidW5tdXRlUGFydGljaXBhbnQiLCJ1cGRhdGVNb25pdG9yUGFydGljaXBhbnRTdGF0ZSJdKSx0LkFnZW50QXBwQ2xpZW50TWV0aG9kcz17R0VUX0NPTlRBQ1Q6IkFnZW50QXBwU2VydmljZS5MY21zLmdldENvbnRhY3QiLERFTEVURV9TUEVBS0VSOiJBZ2VudEFwcFNlcnZpY2UuVm9pY2VJZC5kZWxldGVTcGVha2VyIixFTlJPTExfQllfU0VTU0lPTjoiQWdlbnRBcHBTZXJ2aWNlLlZvaWNlSWQuZW5yb2xsQnlTZXNzaW9uIixFVkFMVUFURV9TRVNTSU9OOiJBZ2VudEFwcFNlcnZpY2UuVm9pY2VJZC5ldmFsdWF0ZVNlc3Npb24iLERFU0NSSUJFX1NQRUFLRVI6IkFnZW50QXBwU2VydmljZS5Wb2ljZUlkLmRlc2NyaWJlU3BlYWtlciIsT1BUX09VVF9TUEVBS0VSOiJBZ2VudEFwcFNlcnZpY2UuVm9pY2VJZC5vcHRPdXRTcGVha2VyIixVUERBVEVfVk9JQ0VfSURfREFUQToiQWdlbnRBcHBTZXJ2aWNlLkxjbXMudXBkYXRlVm9pY2VJZERhdGEiLERFU0NSSUJFX1NFU1NJT046IkFnZW50QXBwU2VydmljZS5Wb2ljZUlkLmRlc2NyaWJlU2Vzc2lvbiIsVVBEQVRFX1NFU1NJT046IkFnZW50QXBwU2VydmljZS5Wb2ljZUlkLnVwZGF0ZVNlc3Npb24iLFNUQVJUX1ZPSUNFX0lEX1NFU1NJT046IkFnZW50QXBwU2VydmljZS5OYXNhLnN0YXJ0Vm9pY2VJZFNlc3Npb24iLExJU1RfSU5URUdSQVRJT05fQVNTT0NJQVRJT05TOiJBZ2VudEFwcFNlcnZpY2UuQWNzLmxpc3RJbnRlZ3JhdGlvbkFzc29jaWF0aW9ucyJ9LHQuTWFzdGVyTWV0aG9kcz10Lm1ha2VFbnVtKFsiYmVjb21lTWFzdGVyIiwiY2hlY2tNYXN0ZXIiXSksdC5UYXNrVGVtcGxhdGVzQ2xpZW50TWV0aG9kcz10Lm1ha2VFbnVtKFsibGlzdFRhc2tUZW1wbGF0ZXMiLCJnZXRUYXNrVGVtcGxhdGUiLCJjcmVhdGVUZW1wbGF0ZWRUYXNrIiwidXBkYXRlQ29udGFjdCJdKSx0LlJldHJ5YWJsZUNsaWVudE1ldGhvZHNMaXN0PVt0LkNsaWVudE1ldGhvZHMuR0VUX0FHRU5UX1NOQVBTSE9ULHQuQ2xpZW50TWV0aG9kcy5HRVRfQUdFTlRfQ09ORklHVVJBVElPTix0LkNsaWVudE1ldGhvZHMuR0VUX0FHRU5UX1BFUk1JU1NJT05TLHQuQ2xpZW50TWV0aG9kcy5HRVRfQUdFTlRfU1RBVEVTLHQuQ2xpZW50TWV0aG9kcy5HRVRfRElBTEFCTEVfQ09VTlRSWV9DT0RFUyx0LkNsaWVudE1ldGhvZHMuR0VUX1JPVVRJTkdfUFJPRklMRV9RVUVVRVNdLHQuUmV0cnlhYmxlRXJyb3JzPXQubWFrZUVudW0oWyJ1bmF1dGhvcml6ZWQiLCJhY2Nlc3NEZW5pZWQiXSksdC5SZXRyeVN0YXR1cz10Lm1ha2VFbnVtKFsicmV0cnlpbmciLCJleGhhdXN0ZWQiLCJub25lIl0pO3ZhciBuPWZ1bmN0aW9uKCl7fTtuLkVNUFRZX0NBTExCQUNLUz17c3VjY2VzczpmdW5jdGlvbigpe30sZmFpbHVyZTpmdW5jdGlvbigpe319LG4ucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24oZSxyLG8pe3QuYXNzZXJ0Tm90TnVsbChlLCJtZXRob2QiKTt2YXIgaT1yfHx7fSxzPW98fG4uRU1QVFlfQ0FMTEJBQ0tTO3RoaXMuX2NhbGxJbXBsKGUsaSxzKX0sbi5wcm90b3R5cGUuX2NhbGxJbXBsPWZ1bmN0aW9uKGUsbixyKXt0aHJvdyBuZXcgdC5Ob3RJbXBsZW1lbnRlZEVycm9yfTt2YXIgcj1mdW5jdGlvbigpe24uY2FsbCh0aGlzKX07KHIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1yLHIucHJvdG90eXBlLl9jYWxsSW1wbD1mdW5jdGlvbihlLG4scil7aWYociYmci5mYWlsdXJlKXt2YXIgbz10LnNwcmludGYoIk5vIHN1Y2ggbWV0aG9kIGV4aXN0cyBvbiBOVUxMIGNsaWVudDogJXMiLGUpO3IuZmFpbHVyZShuZXcgdC5WYWx1ZUVycm9yKG8pLHttZXNzYWdlOm99KX19O3ZhciBvPWZ1bmN0aW9uKGUscixvKXtuLmNhbGwodGhpcyksdGhpcy5jb25kdWl0PWUsdGhpcy5yZXF1ZXN0RXZlbnQ9cix0aGlzLnJlc3BvbnNlRXZlbnQ9byx0aGlzLl9yZXF1ZXN0SWRDYWxsYmFja3NNYXA9e30sdGhpcy5jb25kdWl0Lm9uVXBzdHJlYW0obyx0LmhpdGNoKHRoaXMsdGhpcy5faGFuZGxlUmVzcG9uc2UpKX07KG8ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1vLG8ucHJvdG90eXBlLl9jYWxsSW1wbD1mdW5jdGlvbihlLG4scil7dmFyIG89dC5FdmVudEZhY3RvcnkuY3JlYXRlUmVxdWVzdCh0aGlzLnJlcXVlc3RFdmVudCxlLG4pO3RoaXMuX3JlcXVlc3RJZENhbGxiYWNrc01hcFtvLnJlcXVlc3RJZF09cjtjb25zdCBpPVt0LkNsaWVudE1ldGhvZHMuU0VORF9DTElFTlRfTE9HUyx0LkNsaWVudE1ldGhvZHMuU0VORF9TT0ZUUEhPTkVfQ0FMTF9NRVRSSUNTLHQuQ2xpZW50TWV0aG9kcy5TRU5EX1NPRlRQSE9ORV9DQUxMX1JFUE9SVF07dHJ5e28uZXZlbnQhPT10LkV2ZW50VHlwZS5BUElfUkVRVUVTVHx8aS5pbmNsdWRlcyhvLm1ldGhvZCl8fHQuZ2V0TG9nKCkudHJhY2UoYFNlbmRpbmcgQVBJX1JFUVVFU1QgZXZlbnQgZm9yICR7by5tZXRob2R9IHRvIHVwc3RyZWFtYCkud2l0aE9iamVjdCh7bWV0aG9kOm8ubWV0aG9kLHBhcmFtczpvLnBhcmFtcyxzdGFjazoobmV3IEVycm9yKS5zdGFja30pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiU3RhY2sgdHJhY2UgTG9nIEZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX10aGlzLmNvbmR1aXQuc2VuZFVwc3RyZWFtKG8uZXZlbnQsbyl9LG8ucHJvdG90eXBlLl9nZXRDYWxsYmFja3NGb3JSZXF1ZXN0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX3JlcXVlc3RJZENhbGxiYWNrc01hcFtlXXx8bnVsbDtyZXR1cm4gbnVsbCE9dCYmZGVsZXRlIHRoaXMuX3JlcXVlc3RJZENhbGxiYWNrc01hcFtlXSx0fSxvLnByb3RvdHlwZS5faGFuZGxlUmVzcG9uc2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZ2V0Q2FsbGJhY2tzRm9yUmVxdWVzdChlLnJlcXVlc3RJZCk7bnVsbCE9dCYmKGUuZXJyJiZ0LmZhaWx1cmU/dC5mYWlsdXJlKGUuZXJyLGUuZGF0YSk6dC5zdWNjZXNzJiZ0LnN1Y2Nlc3MoZS5kYXRhKSl9O3ZhciBpPWZ1bmN0aW9uKGUpe28uY2FsbCh0aGlzLGUsdC5FdmVudFR5cGUuQVBJX1JFUVVFU1QsdC5FdmVudFR5cGUuQVBJX1JFU1BPTlNFKX07KGkucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1pO3ZhciBzPWZ1bmN0aW9uKGUpe28uY2FsbCh0aGlzLGUsdC5FdmVudFR5cGUuTUFTVEVSX1JFUVVFU1QsdC5FdmVudFR5cGUuTUFTVEVSX1JFU1BPTlNFKX07KHMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1zO3ZhciBhPWZ1bmN0aW9uKGUscixvKXt0LmFzc2VydE5vdE51bGwoZSwiYXV0aENvb2tpZU5hbWUiKSx0LmFzc2VydE5vdE51bGwociwiYXV0aFRva2VuIiksdC5hc3NlcnROb3ROdWxsKG8sImVuZHBvaW50Iiksbi5jYWxsKHRoaXMpLHRoaXMuZW5kcG9pbnRVcmw9dC5nZXRVcmxXaXRoUHJvdG9jb2wobyksdGhpcy5hdXRoVG9rZW49cix0aGlzLmF1dGhDb29raWVOYW1lPWV9OyhhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9YSxhLnByb3RvdHlwZS5fY2FsbEltcGw9ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXRoaXMsaT17fTtpW28uYXV0aENvb2tpZU5hbWVdPW8uYXV0aFRva2VuO3ZhciBzPXttZXRob2Q6InBvc3QiLGJvZHk6SlNPTi5zdHJpbmdpZnkobnx8e30pLGhlYWRlcnM6e0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiIsIkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24iLCJYLUFtei10YXJnZXQiOmUsIlgtQW16LUJlYXJlciI6SlNPTi5zdHJpbmdpZnkoaSl9fTt0LmZldGNoKG8uZW5kcG9pbnRVcmwscykudGhlbigoZnVuY3Rpb24oZSl7ci5zdWNjZXNzKGUpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtjb25zdCB0PWUuYm9keS5nZXRSZWFkZXIoKTtsZXQgbj0iIjtjb25zdCBvPW5ldyBUZXh0RGVjb2Rlcjt0LnJlYWQoKS50aGVuKChmdW5jdGlvbiBpKHtkb25lOnMsdmFsdWU6YX0pe2lmKHMpe3ZhciBjPUpTT04ucGFyc2Uobik7cmV0dXJuIGMuc3RhdHVzPWUuc3RhdHVzLHZvaWQgci5mYWlsdXJlKGMpfXJldHVybiBuKz1vLmRlY29kZShhKSx0LnJlYWQoKS50aGVuKGkpfSkpfSkpfTt2YXIgYz1mdW5jdGlvbihlLHIsbyl7dC5hc3NlcnROb3ROdWxsKGUsImF1dGhUb2tlbiIpLHQuYXNzZXJ0Tm90TnVsbChyLCJyZWdpb24iKSxuLmNhbGwodGhpcyksQVdTLmNvbmZpZy5jcmVkZW50aWFscz1uZXcgQVdTLkNyZWRlbnRpYWxzKHt9KSxBV1MuY29uZmlnLnJlZ2lvbj1yLHRoaXMuYXV0aFRva2VuPWU7dmFyIGk9dC5nZXRCYXNlVXJsKCkscz1vfHwoaS5pbmNsdWRlcygiLmF3c2FwcHMuY29tIik/aSsiL2Nvbm5lY3QvYXBpIjppKyIvYXBpIiksYT1uZXcgQVdTLkVuZHBvaW50KHMpO3RoaXMuY2xpZW50PW5ldyBBV1MuQ29ubmVjdCh7ZW5kcG9pbnQ6YX0pLHRoaXMudW5hdXRob3JpemVkRmFpbENvdW50ZXI9MCx0aGlzLmFjY2Vzc0RlbmllZEZhaWxDb3VudGVyPTB9OyhjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9YyxjLnByb3RvdHlwZS5fY2FsbEltcGw9ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXRoaXMsaT10LmdldExvZygpO2lmKHQuY29udGFpbnModGhpcy5jbGllbnQsZSkpbj10aGlzLl90cmFuc2xhdGVQYXJhbXMoZSxuKSxpLnRyYWNlKCJBV1NDbGllbnQ6IC0tXHgzZSBDYWxsaW5nIG9wZXJhdGlvbiAnJXMnIixlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHRoaXMuY2xpZW50W2VdKG4pLm9uKCJidWlsZCIsKGZ1bmN0aW9uKGUpe2UuaHR0cFJlcXVlc3QuaGVhZGVyc1siWC1BbXotQmVhcmVyIl09by5hdXRoVG9rZW59KSkuc2VuZCgoZnVuY3Rpb24obixzKXt0cnl7aWYobiluLmNvZGU9PT10LkNUSUV4Y2VwdGlvbnMuVU5BVVRIT1JJWkVEX0VYQ0VQVElPTnx8NDAxPT09bi5zdGF0dXNDb2RlP28uX3JldHJ5TWV0aG9kKGUscixuLHMsdC5SZXRyeWFibGVFcnJvcnMuVU5BVVRIT1JJWkVEKTpuLmNvZGU9PT10LkNUSUV4Y2VwdGlvbnMuQUNDRVNTX0RFTklFRF9FWENFUFRJT058fDQwMz09PW4uc3RhdHVzQ29kZT9vLl9yZXRyeU1ldGhvZChlLHIsbixzLHQuUmV0cnlhYmxlRXJyb3JzLkFDQ0VTU19ERU5JRUQpOihvLnVuYXV0aG9yaXplZEZhaWxDb3VudGVyPTAsby5hY2Nlc3NEZW5pZWRGYWlsQ291bnRlcj0wLHIuZmFpbHVyZShvLl9mb3JtYXRDYWxsRXJyb3Ioby5fYWRkU3RhdHVzQ29kZVRvRXJyb3IobikpLHMpKSxpLnRyYWNlKCJBV1NDbGllbnQ6IDwtLSBPcGVyYXRpb24gJyVzJyBmYWlsZWQ6ICVzIixlLEpTT04uc3RyaW5naWZ5KG4pKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO2Vsc2V7bGV0IHQ9e307aS50cmFjZSgiQVdTQ2xpZW50OiA8LS0gT3BlcmF0aW9uICclcycgc3VjY2VlZGVkLiIsZSkud2l0aE9iamVjdChzKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG8udW5hdXRob3JpemVkRmFpbENvdW50ZXI9MCxvLmFjY2Vzc0RlbmllZEZhaWxDb3VudGVyPTAsdGhpcy5odHRwUmVzcG9uc2UmJnRoaXMuaHR0cFJlc3BvbnNlLmhhc093blByb3BlcnR5KCJib2R5IikmJih0LmNvbnRlbnRMZW5ndGg9dGhpcy5odHRwUmVzcG9uc2UuYm9keS5sZW5ndGgpLHIuc3VjY2VzcyhzLHQpfX1jYXRjaChuKXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gaGFuZGxlIEFXUyBBUEkgcmVxdWVzdCBmb3IgbWV0aG9kICVzIixlKS53aXRoRXhjZXB0aW9uKG4pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fSkpO2Vsc2V7dmFyIHM9dC5zcHJpbnRmKCJObyBzdWNoIG1ldGhvZCBleGlzdHMgb24gQVdTIGNsaWVudDogJXMiLGUpO3IuZmFpbHVyZShuZXcgdC5WYWx1ZUVycm9yKHMpLHttZXNzYWdlOnN9KX19LGMucHJvdG90eXBlLl9pc1JldHJ5YWJsZU1ldGhvZD1mdW5jdGlvbihlKXtyZXR1cm4gdC5SZXRyeWFibGVDbGllbnRNZXRob2RzTGlzdC5pbmNsdWRlcyhlKX0sYy5wcm90b3R5cGUuX3JldHJ5TWV0aG9kPWZ1bmN0aW9uKGUsbixyLG8saSl7dmFyIHM9dGhpcyxhPXQuZ2V0TG9nKCk7Y29uc3QgYz1lPT5zLl9mb3JtYXRDYWxsRXJyb3Iocy5fYWRkU3RhdHVzQ29kZVRvRXJyb3IoZSkpO2xldCB1PXttYXhDb3VudDp0LmNvcmUuTUFYX1VOQVVUSE9SSVpFRF9SRVRSWV9DT1VOVCxmYWlsQ291bnRlcjpzLnVuYXV0aG9yaXplZEZhaWxDb3VudGVyLGluY3JlYXNlQ291bnRlcjooKT0+cy51bmF1dGhvcml6ZWRGYWlsQ291bnRlcis9MSxyZXNldENvdW50ZXI6KCk9PnMudW5hdXRob3JpemVkRmFpbENvdW50ZXI9MCxlcnJvck1lc3NhZ2U6InVuYXV0aG9yaXplZCIsZXhoYXVzdGVkUmV0cmllczpzLnVuYXV0aG9yaXplZEZhaWxDb3VudGVyPj10LmNvcmUuTUFYX1VOQVVUSE9SSVpFRF9SRVRSWV9DT1VOVCxyZXRyeUNhbGxiYWNrOihlLHQpPT5uLmZhaWx1cmUoYyhlKSx0KSxkZWZhdWx0Q2FsbGJhY2s6KGUsdCk9Pm4uYXV0aEZhaWx1cmUoYyhlKSx0KX07c3dpdGNoKGkpe2Nhc2UgdC5SZXRyeWFibGVFcnJvcnMuVU5BVVRIT1JJWkVEOmJyZWFrO2Nhc2UgdC5SZXRyeWFibGVFcnJvcnMuQUNDRVNTX0RFTklFRDp1PXsuLi51LG1heENvdW50OnQuY29yZS5NQVhfQUNDRVNTX0RFTklFRF9SRVRSWV9DT1VOVCxmYWlsQ291bnRlcjpzLmFjY2Vzc0RlbmllZEZhaWxDb3VudGVyLGluY3JlYXNlQ291bnRlcjooKT0+cy5hY2Nlc3NEZW5pZWRGYWlsQ291bnRlcis9MSxyZXNldENvdW50ZXI6KCk9PnMuYWNjZXNzRGVuaWVkRmFpbENvdW50ZXI9MCxlcnJvck1lc3NhZ2U6ImFjY2VzcyBkZW5pZWQiLGV4aGF1c3RlZFJldHJpZXM6cy5hY2Nlc3NEZW5pZWRGYWlsQ291bnRlcj49dC5jb3JlLk1BWF9BQ0NFU1NfREVOSUVEX1JFVFJZX0NPVU5ULGRlZmF1bHRDYWxsYmFjazooZSx0KT0+bi5hY2Nlc3NEZW5pZWQoYyhlKSx0KX19bGV0IGw9ey4uLnIscmV0cnlTdGF0dXM6dC5SZXRyeVN0YXR1cy5OT05FfTtpZihzLl9pc1JldHJ5YWJsZU1ldGhvZChlKSl7aWYoIXUuZXhoYXVzdGVkUmV0cmllcylyZXR1cm4gYS50cmFjZShgQVdTQ2xpZW50OiA8LS0gT3BlcmF0aW9uICR7ZX0gZmFpbGVkIHdpdGggJHt1LmVycm9yTWVzc2FnZX0gZXJyb3IuIFJldHJ5aW5nIGNhbGwgZm9yIGEgJHt1LmZhaWxDb3VudGVyKzF9IHRpbWVgKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHUuaW5jcmVhc2VDb3VudGVyKCksbD17Li4ubCxyZXRyeVN0YXR1czp0LlJldHJ5U3RhdHVzLlJFVFJZSU5HfSx2b2lkIHUucmV0cnlDYWxsYmFjayhsLG8pO2EudHJhY2UoYEFXU0NsaWVudDogPC0tIE9wZXJhdGlvbiAke2V9IGV4aGF1c3RlZCBtYXggJHt1Lm1heENvdW50fSBudW1iZXIgb2YgcmV0cmllcyBmb3IgJHt1LmVycm9yTWVzc2FnZX0gZXJyb3JgKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHUucmVzZXRDb3VudGVyKCksbD17Li4ubCxyZXRyeVN0YXR1czp0LlJldHJ5U3RhdHVzLkVYSEFVU1RFRH19ZWxzZSBhLnRyYWNlKGBBV1NDbGllbnQ6IDwtLSBPcGVyYXRpb24gJHtlfSBmYWlsZWQ6ICR7SlNPTi5zdHJpbmdpZnkocil9YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt1LmRlZmF1bHRDYWxsYmFjayhsLG8pfSxjLnByb3RvdHlwZS5fZm9ybWF0Q2FsbEVycm9yPWZ1bmN0aW9uKGUpe2NvbnN0IG49e3R5cGU6ZS5jb2RlLG1lc3NhZ2U6ZS5tZXNzYWdlLHN0YWNrOltdLHJldHJ5U3RhdHVzOmUucmV0cnlTdGF0dXN8fHQuUmV0cnlTdGF0dXMuTk9ORSwuLi5lLnN0YXR1c0NvZGUmJntzdGF0dXNDb2RlOmUuc3RhdHVzQ29kZX19O2lmKGUuc3RhY2spdHJ5e0FycmF5LmlzQXJyYXkoZS5zdGFjayk/bi5zdGFjaz1lLnN0YWNrOiJvYmplY3QiPT10eXBlb2YgZS5zdGFjaz9uLnN0YWNrPVtKU09OLnN0cmluZ2lmeShlLnN0YWNrKV06InN0cmluZyI9PXR5cGVvZiBlLnN0YWNrJiYobi5zdGFjaz1lLnN0YWNrLnNwbGl0KCJcbiIpKX1maW5hbGx5e31yZXR1cm4gbn0sYy5wcm90b3R5cGUuX2FkZFN0YXR1c0NvZGVUb0Vycm9yPWZ1bmN0aW9uKGUpe2lmKGUuc3RhdHVzQ29kZSlyZXR1cm4gZTtjb25zdCBuPXsuLi5lfTtpZihlLmNvZGUpc3dpdGNoKG4uY29kZSl7Y2FzZSB0LkNUSUV4Y2VwdGlvbnMuVU5BVVRIT1JJWkVEX0VYQ0VQVElPTjpuLnN0YXR1c0NvZGU9NDAxO2JyZWFrO2Nhc2UgdC5DVElFeGNlcHRpb25zLkFDQ0VTU19ERU5JRURfRVhDRVBUSU9OOm4uc3RhdHVzQ29kZT00MDN9ZWxzZSBuLnN0YXR1c0NvZGU9NDAwO3JldHVybiBufSxjLnByb3RvdHlwZS5fcmVxdWlyZXNBdXRoZW50aWNhdGlvblBhcmFtPWZ1bmN0aW9uKGUpe3JldHVybiBlIT09dC5DbGllbnRNZXRob2RzLkNPTVBMRVRFX0NPTlRBQ1QmJmUhPT10LkNsaWVudE1ldGhvZHMuQ0xFQVJfQ09OVEFDVCYmZSE9PXQuQ2xpZW50TWV0aG9kcy5SRUpFQ1RfQ09OVEFDVCYmZSE9PXQuQ2xpZW50TWV0aG9kcy5DUkVBVEVfVEFTS19DT05UQUNUJiZlIT09dC5DbGllbnRNZXRob2RzLlVQREFURV9NT05JVE9SX1BBUlRJQ0lQQU5UX1NUQVRFfSxjLnByb3RvdHlwZS5fdHJhbnNsYXRlUGFyYW1zPWZ1bmN0aW9uKGUsbil7c3dpdGNoKGUpe2Nhc2UgdC5DbGllbnRNZXRob2RzLlVQREFURV9BR0VOVF9DT05GSUdVUkFUSU9OOm4uY29uZmlndXJhdGlvbj10aGlzLl90cmFuc2xhdGVBZ2VudENvbmZpZ3VyYXRpb24obi5jb25maWd1cmF0aW9uKTticmVhaztjYXNlIHQuQ2xpZW50TWV0aG9kcy5TRU5EX1NPRlRQSE9ORV9DQUxMX01FVFJJQ1M6bi5zb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzPXRoaXMuX3RyYW5zbGF0ZVNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3Mobi5zb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzKTticmVhaztjYXNlIHQuQ2xpZW50TWV0aG9kcy5TRU5EX1NPRlRQSE9ORV9DQUxMX1JFUE9SVDpuLnJlcG9ydD10aGlzLl90cmFuc2xhdGVTb2Z0cGhvbmVDYWxsUmVwb3J0KG4ucmVwb3J0KX1yZXR1cm4gdGhpcy5fcmVxdWlyZXNBdXRoZW50aWNhdGlvblBhcmFtKGUpJiYobi5hdXRoZW50aWNhdGlvbj17YXV0aFRva2VuOnRoaXMuYXV0aFRva2VufSksbn0sYy5wcm90b3R5cGUuX3RyYW5zbGF0ZUFnZW50Q29uZmlndXJhdGlvbj1mdW5jdGlvbihlKXtyZXR1cm57bmFtZTplLm5hbWUsc29mdHBob25lRW5hYmxlZDplLnNvZnRwaG9uZUVuYWJsZWQsc29mdHBob25lQXV0b0FjY2VwdDplLnNvZnRwaG9uZUF1dG9BY2NlcHQsZXh0ZW5zaW9uOmUuZXh0ZW5zaW9uLHJvdXRpbmdQcm9maWxlOnRoaXMuX3RyYW5zbGF0ZVJvdXRpbmdQcm9maWxlKGUucm91dGluZ1Byb2ZpbGUpLGFnZW50UHJlZmVyZW5jZXM6ZS5hZ2VudFByZWZlcmVuY2VzfX0sYy5wcm90b3R5cGUuX3RyYW5zbGF0ZVJvdXRpbmdQcm9maWxlPWZ1bmN0aW9uKGUpe3JldHVybntuYW1lOmUubmFtZSxyb3V0aW5nUHJvZmlsZUFSTjplLnJvdXRpbmdQcm9maWxlQVJOLGRlZmF1bHRPdXRib3VuZFF1ZXVlOnRoaXMuX3RyYW5zbGF0ZVF1ZXVlKGUuZGVmYXVsdE91dGJvdW5kUXVldWUpfX0sYy5wcm90b3R5cGUuX3RyYW5zbGF0ZVF1ZXVlPWZ1bmN0aW9uKGUpe3JldHVybntxdWV1ZUFSTjplLnF1ZXVlQVJOLG5hbWU6ZS5uYW1lfX0sYy5wcm90b3R5cGUuX3RyYW5zbGF0ZVNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3M9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7InBhY2tldHNDb3VudCJpbiBlJiYoZS5wYWNrZXRDb3VudD1lLnBhY2tldHNDb3VudCxkZWxldGUgZS5wYWNrZXRzQ291bnQpfSkpLGV9LGMucHJvdG90eXBlLl90cmFuc2xhdGVTb2Z0cGhvbmVDYWxsUmVwb3J0PWZ1bmN0aW9uKGUpe3JldHVybiJoYW5kc2hha2luZ1RpbWVNaWxsaXMiaW4gZSYmKGUuaGFuZHNoYWtlVGltZU1pbGxpcz1lLmhhbmRzaGFraW5nVGltZU1pbGxpcyxkZWxldGUgZS5oYW5kc2hha2luZ1RpbWVNaWxsaXMpLCJwcmVUYWxraW5nVGltZU1pbGxpcyJpbiBlJiYoZS5wcmVUYWxrVGltZU1pbGxpcz1lLnByZVRhbGtpbmdUaW1lTWlsbGlzLGRlbGV0ZSBlLnByZVRhbGtpbmdUaW1lTWlsbGlzKSwiaGFuZHNoYWtpbmdGYWlsdXJlImluIGUmJihlLmhhbmRzaGFrZUZhaWx1cmU9ZS5oYW5kc2hha2luZ0ZhaWx1cmUsZGVsZXRlIGUuaGFuZHNoYWtpbmdGYWlsdXJlKSwidGFsa2luZ1RpbWVNaWxsaXMiaW4gZSYmKGUudGFsa1RpbWVNaWxsaXM9ZS50YWxraW5nVGltZU1pbGxpcyxkZWxldGUgZS50YWxraW5nVGltZU1pbGxpcyksZS5zb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzPXRoaXMuX3RyYW5zbGF0ZVNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3MoZS5zb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzKSxlfTt2YXIgdT1mdW5jdGlvbihlKXtpZih0LmFzc2VydE5vdE51bGwoZSwiZW5kcG9pbnQiKSxuLmNhbGwodGhpcyksZS5pbmNsdWRlcygiL3Rhc2stdGVtcGxhdGVzIikpdGhpcy5lbmRwb2ludFVybD10LmdldFVybFdpdGhQcm90b2NvbChlKTtlbHNle3ZhciByPW5ldyBBV1MuRW5kcG9pbnQoZSksbz1lLmluY2x1ZGVzKCIuYXdzYXBwcy5jb20iKT8iL2Nvbm5lY3QiOiIiO3RoaXMuZW5kcG9pbnRVcmw9dC5nZXRVcmxXaXRoUHJvdG9jb2woYCR7ci5ob3N0fSR7b30vdGFzay10ZW1wbGF0ZXMvYXBpL2NjcGApfX07KHUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj11LHUucHJvdG90eXBlLl9jYWxsSW1wbD1mdW5jdGlvbihlLG4scil7dC5hc3NlcnROb3ROdWxsKGUsIm1ldGhvZCIpLHQuYXNzZXJ0Tm90TnVsbChuLCJwYXJhbXMiKTt2YXIgbz17Y3JlZGVudGlhbHM6ImluY2x1ZGUiLG1ldGhvZDoiR0VUIixoZWFkZXJzOntBY2NlcHQ6ImFwcGxpY2F0aW9uL2pzb24iLCJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIiwieC1jc3JmLXRva2VuIjoiY3NyZiJ9fSxpPW4uaW5zdGFuY2VJZCxzPXRoaXMuZW5kcG9pbnRVcmwsYT10LlRhc2tUZW1wbGF0ZXNDbGllbnRNZXRob2RzO3N3aXRjaChlKXtjYXNlIGEuTElTVF9UQVNLX1RFTVBMQVRFUzppZihzKz1gL3Byb3h5L2luc3RhbmNlLyR7aX0vdGFzay90ZW1wbGF0ZWAsbi5xdWVyeVBhcmFtcyl7Y29uc3QgZT1uZXcgVVJMU2VhcmNoUGFyYW1zKG4ucXVlcnlQYXJhbXMpLnRvU3RyaW5nKCk7ZSYmKHMrPWA/JHtlfWApfWJyZWFrO2Nhc2UgYS5HRVRfVEFTS19URU1QTEFURTp0LmFzc2VydE5vdE51bGwobi50ZW1wbGF0ZVBhcmFtcywicGFyYW1zLnRlbXBsYXRlUGFyYW1zIik7Y29uc3Qgcj10LmFzc2VydE5vdE51bGwobi50ZW1wbGF0ZVBhcmFtcy5pZCwicGFyYW1zLnRlbXBsYXRlUGFyYW1zLmlkIiksYz1uLnRlbXBsYXRlUGFyYW1zLnZlcnNpb247cys9YC9wcm94eS9pbnN0YW5jZS8ke2l9L3Rhc2svdGVtcGxhdGUvJHtyfWAsYyYmKHMrPWA/c25hcHNob3RWZXJzaW9uPSR7Y31gKTticmVhaztjYXNlIGEuQ1JFQVRFX1RFTVBMQVRFRF9UQVNLOnMrPWAvJHtlfWAsby5ib2R5PUpTT04uc3RyaW5naWZ5KG4pLG8ubWV0aG9kPSJQVVQiO2JyZWFrO2Nhc2UgYS5VUERBVEVfQ09OVEFDVDpzKz1gLyR7ZX1gLG8uYm9keT1KU09OLnN0cmluZ2lmeShuKSxvLm1ldGhvZD0iUE9TVCJ9dC5mZXRjaChzLG8pLnRoZW4oKGZ1bmN0aW9uKGUpe3Iuc3VjY2VzcyhlKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7Y29uc3QgdD1lLmJvZHkuZ2V0UmVhZGVyKCk7bGV0IG49IiI7Y29uc3Qgbz1uZXcgVGV4dERlY29kZXI7dC5yZWFkKCkudGhlbigoZnVuY3Rpb24gaSh7ZG9uZTpzLHZhbHVlOmF9KXtpZihzKXt2YXIgYz1KU09OLnBhcnNlKG4pO3JldHVybiBjLnN0YXR1cz1lLnN0YXR1cyx2b2lkIHIuZmFpbHVyZShjKX1yZXR1cm4gbis9by5kZWNvZGUoYSksdC5yZWFkKCkudGhlbihpKX0pKX0pKX0sdC5DbGllbnRCYXNlPW4sdC5OdWxsQ2xpZW50PXIsdC5VcHN0cmVhbUNvbmR1aXRDbGllbnQ9aSx0LlVwc3RyZWFtQ29uZHVpdE1hc3RlckNsaWVudD1zLHQuQVdTQ2xpZW50PWMsdC5BZ2VudEFwcENsaWVudD1hLHQuVGFza1RlbXBsYXRlc0NsaWVudD11fSgpfSw4OTU6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dCx0LmNvcmU9e30sdC5jb3JlLmluaXRpYWxpemVkPSExLHQudmVyc2lvbj0iMi42LjEiLHQub3V0ZXJDb250ZXh0U3RyZWFtc1ZlcnNpb249bnVsbCx0LkRFRkFVTFRfQkFUQ0hfU0laRT01MDA7dmFyIG49IkFtYXpvbiBDb25uZWN0IENDUCIscj0iaHR0cHM6Ly97YWxpYXN9LmF3c2FwcHMuY29tL2F1dGgvP2NsaWVudF9pZD17Y2xpZW50X2lkfSZyZWRpcmVjdF91cmk9e3JlZGlyZWN0fSIsbz0iMDY5MTlmNGZkOGVkMzI0ZSIsaT0iL2F1dGgvYXV0aG9yaXplIixzPSIvY29ubmVjdC9hdXRoL2F1dGhvcml6ZSIsYT0iSWZyYW1lUmVmcmVzaEF0dGVtcHRzIixjPSJJZnJhbWVSZWZyZXNoQXR0ZW1wdHNEciIsdT0iSWZyYW1lSW5pdGlhbGl6YXRpb25TdWNjZXNzIixsPSJJZnJhbWVJbml0aWFsaXphdGlvblN1Y2Nlc3NEciI7Y29uc3QgcD17IjAtMTAwIjpbMCwxMDBdLCIxMDEtNTAwIjpbMTAxLDUwMF0sIjUwMS0xMDAwIjpbNTAxLDFlM10sIjEwMDAtMzAwMCI6WzEwMDEsM2UzXSwiMzAwMS01MDAwIjpbMzAwMSw1ZTNdLCI1MDAxLTEwMDAwIjpbNTAwMSwxZTRdLCIxMDAwMS0yMDAwMCI6WzEwMDAxLDJlNF0sIjIwMDAwKyI6WzIwMDAxLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXX07dC5udW1iZXJPZkNvbm5lY3RlZENDUHM9MCx0Lm51bWJlck9mQ29ubmVjdGVkQ0NQc0luVGhpc1RhYj0wLHQuY29yZS5NQVhfQVVUSE9SSVpFX1JFVFJZX0NPVU5UX0ZPUl9TRVNTSU9OPTMsdC5jb3JlLk1BWF9DVElfQVVUSF9SRVRSWV9DT1VOVD0xMCx0LmNvcmUuY3RpQXV0aFJldHJ5Q291bnQ9MCx0LmNvcmUuYXV0aG9yaXplVGltZW91dElkPW51bGwsdC5jb3JlLmN0aVRpbWVvdXRJZD1udWxsLHQuY29yZS5NQVhfVU5BVVRIT1JJWkVEX1JFVFJZX0NPVU5UPTIwLHQuY29yZS5NQVhfQUNDRVNTX0RFTklFRF9SRVRSWV9DT1VOVD0xMCx0LlNlc3Npb25TdG9yYWdlS2V5cz10Lm1ha2VFbnVtKFsidGFiX2lkIiwiYXV0aG9yaXplX3JldHJ5X2NvdW50Il0pO2NsYXNzIGR7Y29uc3RydWN0b3IodCl7dGhpcy5rZXk9YCR7dH1QYXJhbXNTdG9yYWdlOjoke2UubG9jYXRpb24ub3JpZ2lufWB9Z2V0KCl7dHJ5e2NvbnN0IHQ9ZS5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmtleSk7cmV0dXJuIHQmJkpTT04ucGFyc2UodCl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcihgJHt0aGlzLmtleX06OiBGYWlsZWQgdG8gZ2V0IHNvZnRwaG9uZSBwYXJhbXMgZnJvbSBsb2NhbCBzdG9yYWdlIWApLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX1yZXR1cm4gbnVsbH1zZXQobil7dHJ5e24mJmUubG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5rZXksSlNPTi5zdHJpbmdpZnkobikpfWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoYCR7dGhpcy5rZXl9OjogRmFpbGVkIHRvIHNldCBzb2Z0cGhvbmUgcGFyYW1zIHRvIGxvY2FsIHN0b3JhZ2UhYCkud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX1jbGVhbigpe2UubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5rZXkpfX1jb25zdCBoPW5ldyBjbGFzcyBleHRlbmRzIGR7Y29uc3RydWN0b3IoKXtzdXBlcigiU29mdHBob25lIil9fSxmPW5ldyBjbGFzcyBleHRlbmRzIGR7Y29uc3RydWN0b3IoKXtzdXBlcigiUmluZ3RvbmUiKX19O2Z1bmN0aW9uIGcoZSl7dmFyIHQ9ZS5tYXRjaCgvXig/Omh0dHBzPzpcL1wvKT8oPzpbXkBcbl0rQCk/KD86d3d3XC4pPyhbXjpcL1xuP10rKS9naSk7cmV0dXJuIHQubGVuZ3RoP3RbMF06IiJ9dC5jb3JlLmNoZWNrTm90SW5pdGlhbGl6ZWQ9ZnVuY3Rpb24oKXt0LmNvcmUuaW5pdGlhbGl6ZWQmJnQuZ2V0TG9nKCkud2FybigiQ29ubmVjdCBjb3JlIGFscmVhZHkgaW5pdGlhbGl6ZWQsIG9ubHkgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgb25jZS4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfTt2YXIgbT1mdW5jdGlvbihlLG4pe3ZhciByPWUuZ2V0QWdlbnRTdGF0ZXMoKS5maW5kKChmdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlPT09dC5BZ2VudFN0YXRlVHlwZS5PRkZMSU5FfSkpO2Uuc2V0U3RhdGUocixuKX0sdj1mdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oIltEaXNhc3RlciBSZWNvdmVyeV0gU2lnbmFsIHNoYXJlZHdvcmtlciB0byBzZXQgY29udGFjdHMgc3VwcHJlc3NvciB0byAlcyBmb3IgaW5zdGFuY2UgJXMuIixlLHQuY29yZS5yZWdpb24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5TVVBQUkVTUyx7c3VwcHJlc3M6ZSxzaG91bGRTZW5kRmFpbG92ZXJEb3duc3RyZWFtOiExfSl9LHk9ZnVuY3Rpb24oZSxuKXt0LmdldExvZygpLmluZm8oIltESVNBU1RFUiBSRUNPVkVSWV0gU2lnbmFsIHNoYXJlZHdvcmtlciB0byBzZXQgZm9yY2VPZmZsaW5lIHRvICVzIGZvciBpbnN0YW5jZSAlcy4iLGUsdC5jb3JlLnJlZ2lvbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZPUkNFX09GRkxJTkUse29mZmxpbmU6ZSxuZXh0QWN0aXZlQXJuOm59KX0sRT1mdW5jdGlvbihlLG4pe3ZhciByPXQuZ2V0TG9nKCk7Y29uc3Qgbz10LmFnZW50LmluaXRpYWxpemVkP3QuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEluc3RhbmNlSWQoKTp0LmNvcmUucmVnaW9uO3IuaW5mbyhgW0Rpc2FzdGVyIFJlY292ZXJ5XSBBdHRlbXB0aW5nIHRvIGZvcmNlIGluc3RhbmNlICR7b30gb2ZmbGluZSB1c2luZyAke2U/InNvZnQiOiJoYXJkIn0gZmFpbG92ZXJgKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuYWdlbnQoKGZ1bmN0aW9uKG8pe3ZhciBpPTAscz1vLmdldENvbnRhY3RzKCksYT0hMTtpZihzLmxlbmd0aClmb3IobGV0IGMgb2Ygcyl7aWYoYSlicmVhazshZXx8Yy5nZXRUeXBlKCkhPT10LkNvbnRhY3RUeXBlLlFVRVVFX0NBTExCQUNLJiZjLmdldFR5cGUoKSE9dC5Db250YWN0VHlwZS5WT0lDRT9jLmdldEFnZW50Q29ubmVjdGlvbigpLmRlc3Ryb3koe3N1Y2Nlc3M6ZnVuY3Rpb24oKXsrK2k9PT1zLmxlbmd0aCYmKHkoITEsbiksbShvKSxyLmluZm8oIltEaXNhc3RlciBSZWNvdmVyeV0gSW5zdGFuY2UgJXMgaXMgbm93IG9mZmxpbmUiLHQuY29yZS5yZWdpb24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3Iud2FybigiW0Rpc2FzdGVyIFJlY292ZXJ5XSBBbiBlcnJvciBvY2N1cmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZm9yY2UgdGhpcyBpbnN0YW5jZSB0byBvZmZsaW5lIGluIHJlZ2lvbiAlcyIsdC5jb3JlLnJlZ2lvbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyLndhcm4oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx5KCEwLG4pLGE9ITB9fSk6KHIuaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSBXaWxsIHdhaXQgdG8gY29tcGxldGUgZmFpbG92ZXIgb2YgaW5zdGFuY2UgJXMgdW50aWwgdm9pY2UgY29udGFjdCB3aXRoIElEICVzIGlzIGRlc3Ryb3llZCIsdC5jb3JlLnJlZ2lvbixjLmdldENvbnRhY3RJZCgpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmREb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5GQUlMT1ZFUl9QRU5ESU5HLHtuZXh0QWN0aXZlQXJuOm59KSxjLm9uRGVzdHJveSgoZnVuY3Rpb24oZSl7ci5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIFZvaWNlIGNvbnRhY3Qgd2l0aCBJRCAlcyBkZXN0cm95ZWQsIGNvbnRpbnVpbmcgd2l0aCBmYWlsb3ZlciBpbiBpbnN0YW5jZSAlcyIsZS5nZXRDb250YWN0SWQoKSx0LmNvcmUucmVnaW9uKSxFKCEwLG4pfSkpKX1lbHNlIHkoITEsbiksbShvKSxyLmluZm8oIltEaXNhc3RlciBSZWNvdmVyeV0gSW5zdGFuY2UgJXMgaXMgbm93IG9mZmxpbmUiLHQuY29yZS5yZWdpb24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSl9O3QuY29yZS5pbml0RGlzYXN0ZXJSZWNvdmVyeT1mdW5jdGlvbihlLG4scil7dmFyIG89dC5nZXRMb2coKTt0LmNvcmUucmVnaW9uPWUucmVnaW9uLHQuY29yZS5zdXBwcmVzc0NvbnRhY3RzPW58fHYsdC5jb3JlLmZvcmNlT2ZmbGluZT1yfHxFLHQuY29yZS5nZXRVcHN0cmVhbSgpLm9uRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuU0VUX09GRkxJTkUsKGZ1bmN0aW9uKGUpe3QuaWZNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuRkFJTE9WRVIsKGZ1bmN0aW9uKCl7dC5jb3JlLmZvcmNlT2ZmbGluZShlJiZlLnNvZnRGYWlsb3Zlcil9KSl9KSksdC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRk9SQ0VfT0ZGTElORSwoZnVuY3Rpb24oZSl7dC5pZk1hc3Rlcih0Lk1hc3RlclRvcGljcy5GQUlMT1ZFUiwoZnVuY3Rpb24oKXt0LmNvcmUuZm9yY2VPZmZsaW5lKGUmJmUuc29mdEZhaWxvdmVyLGUmJmUubmV4dEFjdGl2ZUFybil9KSl9KSksdC5pZk1hc3Rlcih0Lk1hc3RlclRvcGljcy5GQUlMT1ZFUiwoZnVuY3Rpb24oKXtvLmluZm8oIltEaXNhc3RlciBSZWNvdmVyeV0gSW5pdGlhbGl6aW5nIHJlZ2lvbiAlcyBhcyBwYXJ0IG9mIGEgRGlzYXN0ZXIgUmVjb3ZlcnkgZmxlZXQiLHQuY29yZS5yZWdpb24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSwoZnVuY3Rpb24oKXtvLmluZm8oIltEaXNhc3RlciBSZWNvdmVyeV0gJXMgYWxyZWFkeSBwYXJ0IG9mIGEgRGlzYXN0ZXIgUmVjb3ZlcnkgZmxlZXQiLHQuY29yZS5yZWdpb24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSksZS5wb2xsRm9yRmFpbG92ZXImJnQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5JTklUX0RSX1BPTExJTkc/dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5JTklUX0RSX1BPTExJTkcse2luc3RhbmNlQXJuOmUuaW5zdGFuY2VBcm4sb3RoZXJBcm46ZS5vdGhlckFybixhdXRoVG9rZW46ZS5hdXRoVG9rZW59KTplLmlzUHJpbWFyeT8odC5jb3JlLnN1cHByZXNzQ29udGFjdHMoITEpLG8uaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSAlcyBpbnN0YW5jZSBpcyBzZXQgdG8gcHJpbWFyeSIsdC5jb3JlLnJlZ2lvbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSk6KHQuY29yZS5zdXBwcmVzc0NvbnRhY3RzKCEwKSx0LmNvcmUuZm9yY2VPZmZsaW5lKCksby5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldICVzIGluc3RhbmNlIGlzIHNldCB0byBzdGFuZC1ieSIsdC5jb3JlLnJlZ2lvbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSl9LHQuY29yZS5pbml0PWZ1bmN0aW9uKGUpe3QuY29yZS5ldmVudEJ1cz1uZXcgdC5FdmVudEJ1cyx0LmNvcmUuYWdlbnREYXRhUHJvdmlkZXI9bmV3IEkodC5jb3JlLmdldEV2ZW50QnVzKCkpLHQuY29yZS5pbml0Q2xpZW50KGUpLHQuY29yZS5pbml0QWdlbnRBcHBDbGllbnQoZSksdC5jb3JlLmluaXRUYXNrVGVtcGxhdGVzQ2xpZW50KGUpLHQuY29yZS5pbml0aWFsaXplZD0hMH0sdC5jb3JlLmluaXRDbGllbnQ9ZnVuY3Rpb24oZSl7dC5hc3NlcnROb3ROdWxsKGUsInBhcmFtcyIpO3ZhciBuPXQuYXNzZXJ0Tm90TnVsbChlLmF1dGhUb2tlbiwicGFyYW1zLmF1dGhUb2tlbiIpLHI9dC5hc3NlcnROb3ROdWxsKGUucmVnaW9uLCJwYXJhbXMucmVnaW9uIiksbz1lLmVuZHBvaW50fHxudWxsO3QuY29yZS5jbGllbnQ9bmV3IHQuQVdTQ2xpZW50KG4scixvKX0sdC5jb3JlLmluaXRBZ2VudEFwcENsaWVudD1mdW5jdGlvbihlKXt0LmFzc2VydE5vdE51bGwoZSwicGFyYW1zIik7dmFyIG49dC5hc3NlcnROb3ROdWxsKGUuYXV0aFRva2VuLCJwYXJhbXMuYXV0aFRva2VuIikscj10LmFzc2VydE5vdE51bGwoZS5hdXRoQ29va2llTmFtZSwicGFyYW1zLmF1dGhDb29raWVOYW1lIiksbz10LmFzc2VydE5vdE51bGwoZS5hZ2VudEFwcEVuZHBvaW50LCJwYXJhbXMuYWdlbnRBcHBFbmRwb2ludCIpO3QuY29yZS5hZ2VudEFwcENsaWVudD1uZXcgdC5BZ2VudEFwcENsaWVudChyLG4sbyl9LHQuY29yZS5pbml0VGFza1RlbXBsYXRlc0NsaWVudD1mdW5jdGlvbihlKXt0LmFzc2VydE5vdE51bGwoZSwicGFyYW1zIik7dmFyIG49ZS50YXNrVGVtcGxhdGVzRW5kcG9pbnR8fGUuZW5kcG9pbnQ7dC5hc3NlcnROb3ROdWxsKG4sInRhc2tUZW1wbGF0ZXNFbmRwb2ludCIpLHQuY29yZS50YXNrVGVtcGxhdGVzQ2xpZW50PW5ldyB0LlRhc2tUZW1wbGF0ZXNDbGllbnQobil9LHQuY29yZS50ZXJtaW5hdGU9ZnVuY3Rpb24oKXt0LmNvcmUuY2xpZW50PW5ldyB0Lk51bGxDbGllbnQsdC5jb3JlLmFnZW50QXBwQ2xpZW50PW5ldyB0Lk51bGxDbGllbnQsdC5jb3JlLnRhc2tUZW1wbGF0ZXNDbGllbnQ9bmV3IHQuTnVsbENsaWVudCx0LmNvcmUubWFzdGVyQ2xpZW50PW5ldyB0Lk51bGxDbGllbnQ7dmFyIGU9dC5jb3JlLmdldEV2ZW50QnVzKCk7ZSYmZS51bnN1YnNjcmliZUFsbCgpLHQuY29yZS5idXM9bmV3IHQuRXZlbnRCdXMsdC5jb3JlLmFnZW50RGF0YVByb3ZpZGVyPW51bGwsdC5jb3JlLnNvZnRwaG9uZU1hbmFnZXI9bnVsbCx0LmNvcmUudXBzdHJlYW09bnVsbCx0LmNvcmUua2VlcGFsaXZlTWFuYWdlcj1udWxsLHQuYWdlbnQuaW5pdGlhbGl6ZWQ9ITEsdC5jb3JlLmluaXRpYWxpemVkPSExfSx0LmNvcmUuc29mdHBob25lVXNlck1lZGlhU3RyZWFtPW51bGwsdC5jb3JlLnNldFNvZnRwaG9uZVVzZXJNZWRpYVN0cmVhbT1mdW5jdGlvbihlKXt0LmNvcmUuc29mdHBob25lVXNlck1lZGlhU3RyZWFtPWV9LHQuY29yZS5pbml0UmluZ3RvbmVFbmdpbmVzPWZ1bmN0aW9uKG4scil7dC5nZXRMb2coKS5pbmZvKCJbUmluZ3RvbmUgRW5naW5lXSBpbml0UmluZ3RvbmVFbmdpbmUgc3RhcnRlZCIpLndpdGhPYmplY3Qoe3BhcmFtczpufSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmFzc2VydE5vdE51bGwobiwicGFyYW1zIik7Y29uc3Qgbz1yfHxiO3ZhciBpPWZ1bmN0aW9uKGUpe3QuYXNzZXJ0Tm90TnVsbChlLCJyaW5ndG9uZVNldHRpbmdzIiksdC5hc3NlcnROb3ROdWxsKGUudm9pY2UsInJpbmd0b25lU2V0dGluZ3Mudm9pY2UiKSx0LmFzc2VydFRydWUoZS52b2ljZS5yaW5ndG9uZVVybHx8ZS52b2ljZS5kaXNhYmxlZCwicmluZ3RvbmVTZXR0aW5ncy52b2ljZS5yaW5ndG9uZVVybCBtdXN0IGJlIHByb3ZpZGVkIG9yIHJpbmd0b25lU2V0dGluZ3Mudm9pY2UuZGlzYWJsZWQgbXVzdCBiZSB0cnVlIiksdC5hc3NlcnROb3ROdWxsKGUucXVldWVfY2FsbGJhY2ssInJpbmd0b25lU2V0dGluZ3MucXVldWVfY2FsbGJhY2siKSx0LmFzc2VydFRydWUoZS5xdWV1ZV9jYWxsYmFjay5yaW5ndG9uZVVybHx8ZS5xdWV1ZV9jYWxsYmFjay5kaXNhYmxlZCwicmluZ3RvbmVTZXR0aW5ncy52b2ljZS5yaW5ndG9uZVVybCBtdXN0IGJlIHByb3ZpZGVkIG9yIHJpbmd0b25lU2V0dGluZ3MucXVldWVfY2FsbGJhY2suZGlzYWJsZWQgbXVzdCBiZSB0cnVlIiksdC5jb3JlLnJpbmd0b25lRW5naW5lcz17fSx0LmFnZW50KChmdW5jdGlvbihuKXtuLm9uUmVmcmVzaCgoZnVuY3Rpb24oKXt0LmlmTWFzdGVyKHQuTWFzdGVyVG9waWNzLlJJTkdUT05FLChmdW5jdGlvbigpe2xldCBuPSExO2Uudm9pY2UuZGlzYWJsZWR8fHQuY29yZS5yaW5ndG9uZUVuZ2luZXMudm9pY2V8fCh0LmNvcmUucmluZ3RvbmVFbmdpbmVzLnZvaWNlPW5ldyB0LlZvaWNlUmluZ3RvbmVFbmdpbmUoZS52b2ljZSksbj0hMCx0LmdldExvZygpLmluZm8oIlZvaWNlUmluZ3RvbmVFbmdpbmUgaW5pdGlhbGl6ZWQuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSksZS5jaGF0LmRpc2FibGVkfHx0LmNvcmUucmluZ3RvbmVFbmdpbmVzLmNoYXR8fCh0LmNvcmUucmluZ3RvbmVFbmdpbmVzLmNoYXQ9bmV3IHQuQ2hhdFJpbmd0b25lRW5naW5lKGUuY2hhdCksbj0hMCx0LmdldExvZygpLmluZm8oIkNoYXRSaW5ndG9uZUVuZ2luZSBpbml0aWFsaXplZC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKSxlLnRhc2suZGlzYWJsZWR8fHQuY29yZS5yaW5ndG9uZUVuZ2luZXMudGFza3x8KHQuY29yZS5yaW5ndG9uZUVuZ2luZXMudGFzaz1uZXcgdC5UYXNrUmluZ3RvbmVFbmdpbmUoZS50YXNrKSxuPSEwLHQuZ2V0TG9nKCkuaW5mbygiVGFza1Jpbmd0b25lRW5naW5lIGluaXRpYWxpemVkLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpLGUucXVldWVfY2FsbGJhY2suZGlzYWJsZWR8fHQuY29yZS5yaW5ndG9uZUVuZ2luZXMucXVldWVfY2FsbGJhY2t8fCh0LmNvcmUucmluZ3RvbmVFbmdpbmVzLnF1ZXVlX2NhbGxiYWNrPW5ldyB0LlF1ZXVlQ2FsbGJhY2tSaW5ndG9uZUVuZ2luZShlLnF1ZXVlX2NhbGxiYWNrKSxuPSEwLHQuZ2V0TG9nKCkuaW5mbygiUXVldWVDYWxsYmFja1Jpbmd0b25lRW5naW5lIGluaXRpYWxpemVkLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpLG4mJnQuY29yZS5fcmluZ2VyRGV2aWNlSWQmJm8oe2RldmljZUlkOnQuY29yZS5fcmluZ2VyRGV2aWNlSWR9KX0pKX0pKX0pKSxTKCl9LHM9ZnVuY3Rpb24oZSxuKXtlLnJpbmd0b25lPWUucmluZ3RvbmV8fHt9LGUucmluZ3RvbmUudm9pY2U9ZS5yaW5ndG9uZS52b2ljZXx8e30sZS5yaW5ndG9uZS5xdWV1ZV9jYWxsYmFjaz1lLnJpbmd0b25lLnF1ZXVlX2NhbGxiYWNrfHx7fSxlLnJpbmd0b25lLmNoYXQ9ZS5yaW5ndG9uZS5jaGF0fHx7ZGlzYWJsZWQ6ITB9LGUucmluZ3RvbmUudGFzaz1lLnJpbmd0b25lLnRhc2t8fHtkaXNhYmxlZDohMH0sbi5zb2Z0cGhvbmUmJihuLnNvZnRwaG9uZS5kaXNhYmxlUmluZ3RvbmUmJihlLnJpbmd0b25lLnZvaWNlLmRpc2FibGVkPSEwLGUucmluZ3RvbmUucXVldWVfY2FsbGJhY2suZGlzYWJsZWQ9ITApLG4uc29mdHBob25lLnJpbmd0b25lVXJsJiYoZS5yaW5ndG9uZS52b2ljZS5yaW5ndG9uZVVybD1uLnNvZnRwaG9uZS5yaW5ndG9uZVVybCxlLnJpbmd0b25lLnF1ZXVlX2NhbGxiYWNrLnJpbmd0b25lVXJsPW4uc29mdHBob25lLnJpbmd0b25lVXJsKSksbi5jaGF0JiYobi5jaGF0LmRpc2FibGVSaW5ndG9uZSYmKGUucmluZ3RvbmUuY2hhdC5kaXNhYmxlZD0hMCksbi5jaGF0LnJpbmd0b25lVXJsJiYoZS5yaW5ndG9uZS5jaGF0LnJpbmd0b25lVXJsPW4uY2hhdC5yaW5ndG9uZVVybCkpLG4ucmluZ3RvbmUmJihlLnJpbmd0b25lLnZvaWNlPXQubWVyZ2UoZS5yaW5ndG9uZS52b2ljZSxuLnJpbmd0b25lLnZvaWNlfHx7fSksZS5yaW5ndG9uZS5xdWV1ZV9jYWxsYmFjaz10Lm1lcmdlKGUucmluZ3RvbmUucXVldWVfY2FsbGJhY2ssbi5yaW5ndG9uZS52b2ljZXx8e30pLGUucmluZ3RvbmUuY2hhdD10Lm1lcmdlKGUucmluZ3RvbmUuY2hhdCxuLnJpbmd0b25lLmNoYXR8fHt9KSl9O2lmKHMobixuKSx0LmlzRnJhbWVkKCkpe2xldCByO3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5DT05GSUdVUkUsKGZ1bmN0aW9uKG8pe2UuY2xlYXJUaW1lb3V0KHIpLHQuZ2V0TG9nKCkuaW5mbygiW1Jpbmd0b25lIEVuZ2luZV0gQ29uZmlndXJlIGV2ZW50IGhhbmRsZXIgZXhlY3V0ZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHRoaXMudW5zdWJzY3JpYmUoKSxzKG4sbyksZi5zZXQobi5yaW5ndG9uZSksaShuLnJpbmd0b25lKX0pKTtjb25zdCBvPWYuZ2V0KCk7byYmdC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5BQ0tOT1dMRURHRSwoZnVuY3Rpb24obil7biYmbi5pZCYmKHQuZ2V0TG9nKCkuaW5mbygiW1Jpbmd0b25lRW5naW5lXSBFbWJlZGRlZCBDQ1AgaXMgcmVmcmVzaGVkIHN1Y2Nlc3NmdWxseSBhbmQgd2FpdGluZyBmb3IgY29uZmlndXJlIE1lc3NhZ2UgaGFuZGxlciB0byBleGVjdXRlIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0aGlzLnVuc3Vic2NyaWJlKCkscj1lLnNldFRpbWVvdXQoKCgpPT57dC5nZXRMb2coKS5pbmZvKCJbUmluZ3RvbmVFbmdpbmVdIEVtYmVkZGVkIENDUCBpcyByZWZyZXNoZWQgd2l0aG91dCBjb25maWd1cmUgbWVzc2FnZSAmIEluaXRpYWxpemluZyBzZXR1cFJpbmd0b25lRW5naW5lcyAoUmluZ3RvbmUgRW5naW5lKSBmcm9tIGxvY2FsU3RvcmFnZSByaW5ndG9uZSBwYXJhbXMuICIpLndpdGhPYmplY3Qoe3Jpbmd0b25lOm99KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkobyl9KSwxMDApKX0pKX1lbHNlIGkobi5yaW5ndG9uZSl9O3ZhciBTPWZ1bmN0aW9uKCl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQ29uZmlndXJhdGlvbkV2ZW50cy5TRVRfUklOR0VSX0RFVklDRSxiKX0sYj1mdW5jdGlvbihlPXt9KXtjb25zdCBuPWUuZGV2aWNlSWR8fCIiO2lmKHQuZ2V0TG9nKCkuaW5mbyhgW0F1ZGlvIERldmljZSBTZXR0aW5nc10gQXR0ZW1wdGluZyB0byBzZXQgcmluZ2VyIGRldmljZSAke259YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSwwPT09dC5rZXlzKHQuY29yZS5yaW5ndG9uZUVuZ2luZXMpLmxlbmd0aClyZXR1cm4gdC5nZXRMb2coKS5pbmZvKCJbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBzZXRSaW5nZXJEZXZpY2UgY2FsbGVkIGJlZm9yZSByaW5ndG9uZSBlbmdpbmUgaXMgaW5pdGlhbGl6ZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHZvaWQobiYmKHQuY29yZS5fcmluZ2VyRGV2aWNlSWQ9bix0LmdldExvZygpLndhcm4oIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIHN0b3JlZCBkZXZpY2UgSWQgZm9yIGxhdGVyIHVzZSwgb25jZSByaW5ndG9uZSBlbmdpbmUgaXMgdXAuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6IlNldFJpbmdlckRldmljZUJlZm9yZUluaXRSaW5ndG9uZUVuZ2luZSIsZGF0YTp7Y291bnQ6MX19KSkpO2lmKG4pe2ZvcihsZXQgZSBpbiB0LmNvcmUucmluZ3RvbmVFbmdpbmVzKXQuY29yZS5yaW5ndG9uZUVuZ2luZXNbZV0uc2V0T3V0cHV0RGV2aWNlKG4pLnRoZW4oKGZ1bmN0aW9uKG4pe3QuZ2V0TG9nKCkuaW5mbyhgW0F1ZGlvIERldmljZSBTZXR0aW5nc10gcmluZ3RvbmVUeXBlICR7ZX0gc3VjY2Vzc2Z1bGx5IHNldCB0byBkZXZpY2VpZCAke259YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcihlKX0pKTt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbmZpZ3VyYXRpb25FdmVudHMuUklOR0VSX0RFVklDRV9DSEFOR0VELGRhdGE6e2RldmljZUlkOm59fSl9ZWxzZSB0LmdldExvZygpLndhcm4oIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIFNldHRpbmcgcmluZ2VyIGRldmljZSBjYW5jZWxsZWQgZHVlIHRvIG1pc3NpbmcgZGV2aWNlSWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfTt0LmNvcmUuaW5pdFNvZnRwaG9uZU1hbmFnZXI9ZnVuY3Rpb24obil7dmFyIHI9bnx8e307dC5nZXRMb2coKS5pbmZvKCJbU29mdHBob25lIE1hbmFnZXJdIGluaXRTb2Z0cGhvbmVNYW5hZ2VyIHN0YXJ0ZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBvPWZ1bmN0aW9uKGUpe3ZhciBuPXQubWVyZ2Uoci5zb2Z0cGhvbmV8fHt9LGUpO3QuZ2V0TG9nKCkuaW5mbygiW1NvZnRwaG9uZSBNYW5hZ2VyXSBjb21wZXRlRm9yTWFzdGVyT25BZ2VudFVwZGF0ZSBleGVjdXRlZCIpLndpdGhPYmplY3Qoe3NvZnRwaG9uZVBhcmFtczpufSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmFnZW50KChmdW5jdGlvbihlKXtlLmdldENoYW5uZWxDb25jdXJyZW5jeSh0LkNoYW5uZWxUeXBlLlZPSUNFKSYmZS5vblJlZnJlc2goKGZ1bmN0aW9uKCl7dmFyIHI9dGhpczt0LmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gYWdlbnQgcmVmcmVzaCBoYW5kbGVyIGV4ZWN1dGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmlmTWFzdGVyKHQuTWFzdGVyVG9waWNzLlNPRlRQSE9ORSwoZnVuY3Rpb24oKXt0LmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gY29uZmlybWVkIGFzIHNvZnRwaG9uZSBtYXN0ZXIgdG9waWMiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLCF0LmNvcmUuc29mdHBob25lTWFuYWdlciYmZS5pc1NvZnRwaG9uZUVuYWJsZWQoKSYmKHQuYmVjb21lTWFzdGVyKHQuTWFzdGVyVG9waWNzLlNFTkRfTE9HUyksdC5jb3JlLnNvZnRwaG9uZU1hbmFnZXI9bmV3IHQuU29mdHBob25lTWFuYWdlcihuKSxyLnVuc3Vic2NyaWJlKCkpfSkpfSkpfSkpfTtpZih0LmlzRnJhbWVkKCkmJnQuaXNDQ1AoKSl7bGV0IG47dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLkNPTkZJR1VSRSwoZnVuY3Rpb24ocil7ZS5jbGVhclRpbWVvdXQobiksdC5nZXRMb2coKS5pbmZvKCJbU29mdHBob25lIE1hbmFnZXJdIENvbmZpZ3VyZSBldmVudCBoYW5kbGVyIGV4ZWN1dGVkIikud2l0aE9iamVjdCh7ZGF0YTpyfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxoLnNldChyLnNvZnRwaG9uZSksci5zb2Z0cGhvbmUmJnIuc29mdHBob25lLmFsbG93RnJhbWVkU29mdHBob25lJiYodGhpcy51bnN1YnNjcmliZSgpLG8oci5zb2Z0cGhvbmUpKSxpKHIuc29mdHBob25lKX0pKTtsZXQgcj1oLmdldCgpO3ImJnQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuQUNLTk9XTEVER0UsKGZ1bmN0aW9uKHMpe3MmJnMuaWQmJih0LmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gRW1iZWRkZWQgQ0NQIGlzIHJlZnJlc2hlZCBzdWNjZXNzZnVsbHkgYW5kIHdhaXRpbmcgZm9yIGNvbmZpZ3VyZSBNZXNzYWdlIGhhbmRsZXIgdG8gZXhlY3V0ZSIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy51bnN1YnNjcmliZSgpLG49ZS5zZXRUaW1lb3V0KCgoKT0+e3QuZ2V0TG9nKCkuaW5mbygiW1NvZnRwaG9uZSBNYW5hZ2VyXSBFbWJlZGRlZCBDQ1AgaXMgcmVmcmVzaGVkIHdpdGhvdXQgY29uZmlndXJlIG1lc3NhZ2UgaGFuZGxlciBleGVjdXRpb24iKS53aXRoT2JqZWN0KHtzb2Z0cGhvbmVQYXJhbXNGcm9tTG9jYWxTdG9yYWdlOnJ9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQucHVibGlzaE1ldHJpYyh7bmFtZToiRW1iZWRkZWRDQ1BSZWZyZXNoZWRXaXRob3V0SW5pdENDUCIsZGF0YTp7Y291bnQ6MX19KSxpKHIpLHIuYWxsb3dGcmFtZWRTb2Z0cGhvbmUmJih0LmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gRW1iZWRkZWQgQ0NQIGlzIHJlZnJlc2hlZCAmIEluaXRpYWxpemluZyBjb21wZXRlRm9yTWFzdGVyT25BZ2VudFVwZGF0ZSAoU29mdHBob25lIG1hbmFnZXIpIGZyb20gbG9jYWxTdG9yYWdlIHNvZnRwaG9uZSBwYXJhbXMiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG8ocikpfSksMTAwKSl9KSl9ZWxzZSBvKHIpLGkocik7ZnVuY3Rpb24gaShlKXt2YXIgbj10Lm1lcmdlKHIuc29mdHBob25lfHx7fSxlKTt0LmNvcmUuc29mdHBob25lUGFyYW1zPW4sdC5pc0ZpcmVmb3hCcm93c2VyKCkmJih0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLk1BU1RFUl9SRVNQT05TRSwoZnVuY3Rpb24oZSl7ZS5kYXRhJiZlLmRhdGEudG9waWM9PT10Lk1hc3RlclRvcGljcy5TT0ZUUEhPTkUmJmUuZGF0YS50YWtlT3ZlciYmZS5kYXRhLm1hc3RlcklkIT09dC5jb3JlLnBvcnRTdHJlYW1JZCYmdC5jb3JlLnNvZnRwaG9uZU1hbmFnZXImJih0LmNvcmUuc29mdHBob25lTWFuYWdlci5vbkluaXRDb250YWN0U3ViLnVuc3Vic2NyaWJlKCksZGVsZXRlIHQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyKX0pKSx0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5Db25uZWN0aW9uRXZlbnRzLlJFQURZX1RPX1NUQVJUX1NFU1NJT04sKGZ1bmN0aW9uKCl7dC5pZk1hc3Rlcih0Lk1hc3RlclRvcGljcy5TT0ZUUEhPTkUsKGZ1bmN0aW9uKCl7dC5jb3JlLnNvZnRwaG9uZU1hbmFnZXImJnQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyLnN0YXJ0U2Vzc2lvbigpfSksKGZ1bmN0aW9uKCl7dC5iZWNvbWVNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuU09GVFBIT05FLChmdW5jdGlvbigpe3QuYWdlbnQoKGZ1bmN0aW9uKGUpeyF0LmNvcmUuc29mdHBob25lTWFuYWdlciYmZS5pc1NvZnRwaG9uZUVuYWJsZWQoKSYmKHQuYmVjb21lTWFzdGVyKHQuTWFzdGVyVG9waWNzLlNFTkRfTE9HUyksdC5jb3JlLnNvZnRwaG9uZU1hbmFnZXI9bmV3IHQuU29mdHBob25lTWFuYWdlcihuKSx0LmNvcmUuc29mdHBob25lTWFuYWdlci5zdGFydFNlc3Npb24oKSl9KSl9KSl9KSl9KSksdC5jb250YWN0KChmdW5jdGlvbihlKXt0LmFnZW50KChmdW5jdGlvbihuKXtlLm9uUmVmcmVzaCgoZnVuY3Rpb24oZSl7aWYodC5oYXNPdGhlckNvbm5lY3RlZENDUHMoKSYmInZpc2libGUiPT09ZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlJiYoZS5nZXRTdGF0dXMoKS50eXBlPT09dC5Db250YWN0U3RhdHVzVHlwZS5DT05ORUNUSU5HfHxlLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbnRhY3RTdGF0dXNUeXBlLklOQ09NSU5HKSl7dmFyIHI9ZS5pc1NvZnRwaG9uZUNhbGwoKSYmIWUuaXNJbmJvdW5kKCksbz1lLmlzU29mdHBob25lQ2FsbCgpJiZuLmdldENvbmZpZ3VyYXRpb24oKS5zb2Z0cGhvbmVBdXRvQWNjZXB0LGk9ZS5nZXRUeXBlKCk9PT10LkNvbnRhY3RUeXBlLlFVRVVFX0NBTExCQUNLOyhyfHxvfHxpKSYmdC5jb3JlLnRyaWdnZXJSZWFkeVRvU3RhcnRTZXNzaW9uRXZlbnQoKX19KSl9KSl9KSkpfXQuYWdlbnQoKGZ1bmN0aW9uKGUpe2UuaXNTb2Z0cGhvbmVFbmFibGVkKCkmJmUuZ2V0Q2hhbm5lbENvbmN1cnJlbmN5KHQuQ2hhbm5lbFR5cGUuVk9JQ0UpJiZ0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkV2ZW50VHlwZS5NVVRFfSl9KSl9LHQuY29yZS50cmlnZ2VyUmVhZHlUb1N0YXJ0U2Vzc2lvbkV2ZW50PWZ1bmN0aW9uKCl7dmFyIGU9dC5jb3JlLnNvZnRwaG9uZVBhcmFtcyYmdC5jb3JlLnNvZnRwaG9uZVBhcmFtcy5hbGxvd0ZyYW1lZFNvZnRwaG9uZTt0LmlzQ0NQKCk/ZT90LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuQ29ubmVjdGlvbkV2ZW50cy5SRUFEWV9UT19TVEFSVF9TRVNTSU9OKTp0LmlzRnJhbWVkKCk/dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZERvd25zdHJlYW0odC5Db25uZWN0aW9uRXZlbnRzLlJFQURZX1RPX1NUQVJUX1NFU1NJT04pOnQuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIodC5Db25uZWN0aW9uRXZlbnRzLlJFQURZX1RPX1NUQVJUX1NFU1NJT04pOmU/dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuQ29ubmVjdGlvbkV2ZW50cy5SRUFEWV9UT19TVEFSVF9TRVNTSU9OKTp0LmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHQuQ29ubmVjdGlvbkV2ZW50cy5SRUFEWV9UT19TVEFSVF9TRVNTSU9OKX0sdC5jb3JlLmluaXRQYWdlT3B0aW9ucz1mdW5jdGlvbihlKXtpZih0LmFzc2VydE5vdE51bGwoZSwicGFyYW1zIiksdC5pc0ZyYW1lZCgpKXt2YXIgbj10LmNvcmUuZ2V0RXZlbnRCdXMoKTtuLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5DT05GSUdVUkUsKGZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29uZmlndXJhdGlvbkV2ZW50cy5DT05GSUdVUkUsZGF0YTplfSl9KSksbi5zdWJzY3JpYmUodC5FdmVudFR5cGUuTUVESUFfREVWSUNFX1JFUVVFU1QsKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5NRURJQV9ERVZJQ0VfUkVTUE9OU0UsZSl9bmF2aWdhdG9yJiZuYXZpZ2F0b3IubWVkaWFEZXZpY2VzP25hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpLnRoZW4oKGZ1bmN0aW9uKHQpe2RldmljZXM9dHx8W10sZGV2aWNlcz1kZXZpY2VzLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9KU09OKCl9KSksZShkZXZpY2VzKX0pKS5jYXRjaCgoZnVuY3Rpb24odCl7ZSh7ZXJyb3I6dC5tZXNzYWdlfSl9KSk6ZSh7ZXJyb3I6Ik5vIG5hdmlnYXRvciBvciBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzIG9iamVjdCBmb3VuZCJ9KX0pKX19LHQuY29yZS5nZXRGcmFtZU1lZGlhRGV2aWNlcz1mdW5jdGlvbihlKXt2YXIgbj1udWxsLHI9ZXx8MWUzLG89bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUsdCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0KG5ldyBFcnJvcigiVGltZW91dCBleGNlZWRlZCIpKX0pLHIpfSkpLGk9bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUscil7aWYodC5pc0ZyYW1lZCgpfHx0LmlzQ0NQKCkpbmF2aWdhdG9yJiZuYXZpZ2F0b3IubWVkaWFEZXZpY2VzP25hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpLnRoZW4oKGZ1bmN0aW9uKHQpe2RldmljZXM9dHx8W10sZGV2aWNlcz1kZXZpY2VzLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9KU09OKCl9KSksZShkZXZpY2VzKX0pKTpyKG5ldyBFcnJvcigiTm8gbmF2aWdhdG9yIG9yIG5hdmlnYXRvci5tZWRpYURldmljZXMgb2JqZWN0IGZvdW5kIikpO2Vsc2V7dmFyIG89dC5jb3JlLmdldEV2ZW50QnVzKCk7bj1vLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5NRURJQV9ERVZJQ0VfUkVTUE9OU0UsKGZ1bmN0aW9uKHQpe3QuZXJyb3I/cihuZXcgRXJyb3IodC5lcnJvcikpOmUodCl9KSksdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLk1FRElBX0RFVklDRV9SRVFVRVNUKX19KSk7cmV0dXJuIFByb21pc2UucmFjZShbaSxvXSkuZmluYWxseSgoZnVuY3Rpb24oKXtuJiZuLnVuc3Vic2NyaWJlKCl9KSl9LHQuY29yZS5hdXRob3JpemU9ZnVuY3Rpb24oZSl7dmFyIG49ZTtyZXR1cm4gbnx8KG49dC5jb3JlLmlzTGVnYWN5RG9tYWluKCk/czppKSx0LmZldGNoKG4se2NyZWRlbnRpYWxzOiJpbmNsdWRlIn0sMmUzLDUpfSx0LmNvcmUudmVyaWZ5RG9tYWluQWNjZXNzPWZ1bmN0aW9uKGUsbil7aWYodC5nZXRMb2coKS53YXJuKCJUaGlzIEFQSSB3aWxsIGJlIGRlcHJlY2F0ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiByZWxlYXNlIiksIXQuaXNGcmFtZWQoKSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7dmFyIHI9e2hlYWRlcnM6eyJYLUFtei1CZWFyZXIiOmV9fSxvPW51bGw7cmV0dXJuIG89bnx8KHQuY29yZS5pc0xlZ2FjeURvbWFpbigpPyIvY29ubmVjdC93aGl0ZWxpc3RlZC1vcmlnaW5zIjoiL3doaXRlbGlzdGVkLW9yaWdpbnMiKSx0LmZldGNoKG8sciwyZTMsNSkudGhlbigoZnVuY3Rpb24oZSl7dmFyIHQ9Zyh3aW5kb3cuZG9jdW1lbnQucmVmZXJyZXIpO3JldHVybiBlLndoaXRlbGlzdGVkT3JpZ2lucy5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4gdD09PWcoZSl9KSk/UHJvbWlzZS5yZXNvbHZlKCk6UHJvbWlzZS5yZWplY3QoKX0pKX0sdC5jb3JlLmlzTGVnYWN5RG9tYWluPWZ1bmN0aW9uKGUpe3JldHVybihlPWV8fHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5pbmNsdWRlcygiLmF3c2FwcHMuY29tIil9LHQuY29yZS5pbml0U2hhcmVkV29ya2VyPWZ1bmN0aW9uKG4pe2lmKHQuY29yZS5jaGVja05vdEluaXRpYWxpemVkKCksIXQuY29yZS5pbml0aWFsaXplZCl7dC5hc3NlcnROb3ROdWxsKG4sInBhcmFtcyIpO3ZhciByPXQuYXNzZXJ0Tm90TnVsbChuLnNoYXJlZFdvcmtlclVybCwicGFyYW1zLnNoYXJlZFdvcmtlclVybCIpLG89dC5hc3NlcnROb3ROdWxsKG4uYXV0aFRva2VuLCJwYXJhbXMuYXV0aFRva2VuIiksYT10LmFzc2VydE5vdE51bGwobi5yZWZyZXNoVG9rZW4sInBhcmFtcy5yZWZyZXNoVG9rZW4iKSxjPXQuYXNzZXJ0Tm90TnVsbChuLmF1dGhUb2tlbkV4cGlyYXRpb24sInBhcmFtcy5hdXRoVG9rZW5FeHBpcmF0aW9uIiksdT10LmFzc2VydE5vdE51bGwobi5yZWdpb24sInBhcmFtcy5yZWdpb24iKSxsPW4uZW5kcG9pbnR8fG51bGwscD1uLmF1dGhvcml6ZUVuZHBvaW50O3B8fChwPXQuY29yZS5pc0xlZ2FjeURvbWFpbigpP3M6aSk7dmFyIGQ9bi5hZ2VudEFwcEVuZHBvaW50fHxudWxsLGg9bi50YXNrVGVtcGxhdGVzRW5kcG9pbnR8fG51bGwsZj1uLmF1dGhDb29raWVOYW1lfHxudWxsO3RyeXt0LmNvcmUuZXZlbnRCdXM9bmV3IHQuRXZlbnRCdXMoe2xvZ0V2ZW50czohMH0pLHQuY29yZS5hZ2VudERhdGFQcm92aWRlcj1uZXcgSSh0LmNvcmUuZ2V0RXZlbnRCdXMoKSksdC5jb3JlLm1lZGlhRmFjdG9yeT1uZXcgdC5NZWRpYUZhY3Rvcnkobik7dmFyIGc9bmV3IFNoYXJlZFdvcmtlcihyLCJDb25uZWN0U2hhcmVkV29ya2VyIiksbT1uZXcgdC5Db25kdWl0KCJDb25uZWN0U2hhcmVkV29ya2VyQ29uZHVpdCIsbmV3IHQuUG9ydFN0cmVhbShnLnBvcnQpLG5ldyB0LldpbmRvd0lPU3RyZWFtKHdpbmRvdyxwYXJlbnQpKTt0LmNvcmUudXBzdHJlYW09bSx0LmNvcmUud2ViU29ja2V0UHJvdmlkZXI9bmV3IEMsZS5vbnVubG9hZD1mdW5jdGlvbigpe20uc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkNMT1NFKSxnLnBvcnQuY2xvc2UoKX0sdC5nZXRMb2coKS5zY2hlZHVsZVVwc3RyZWFtTG9nUHVzaChtKSx0LmdldExvZygpLnNjaGVkdWxlRG93bnN0cmVhbUNsaWVudFNpZGVMb2dzUHVzaCgpLG0ub25BbGxVcHN0cmVhbSh0LmNvcmUuZ2V0RXZlbnRCdXMoKS5icmlkZ2UoKSksbS5vbkFsbFVwc3RyZWFtKG0ucGFzc0Rvd25zdHJlYW0oKSksdC5pc0ZyYW1lZCgpJiYobS5vbkFsbERvd25zdHJlYW0odC5jb3JlLmdldEV2ZW50QnVzKCkuYnJpZGdlKCkpLG0ub25BbGxEb3duc3RyZWFtKG0ucGFzc1Vwc3RyZWFtKCkpKSxtLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5DT05GSUdVUkUse2F1dGhUb2tlbjpvLGF1dGhUb2tlbkV4cGlyYXRpb246YyxlbmRwb2ludDpsLHJlZnJlc2hUb2tlbjphLHJlZ2lvbjp1LGF1dGhvcml6ZUVuZHBvaW50OnAsYWdlbnRBcHBFbmRwb2ludDpkLHRhc2tUZW1wbGF0ZXNFbmRwb2ludDpoLGF1dGhDb29raWVOYW1lOmYsbG9uZ1BvbGxpbmdPcHRpb25zOm4ubG9uZ1BvbGxpbmdPcHRpb25zfHx2b2lkIDB9KSxtLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuQUNLTk9XTEVER0UsKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiQWNrbm93bGVkZ2VkIGJ5IHRoZSBDb25uZWN0U2hhcmVkV29ya2VyISIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5jb3JlLmluaXRpYWxpemVkPSEwLHQuY29yZS5fc2V0VGFiSWQoKSx0LmNvcmUucG9ydFN0cmVhbUlkPWUuaWQsdGhpcy51bnN1YnNjcmliZSgpfSkpLG0ub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5MT0csKGZ1bmN0aW9uKGUpe2UubG9nZ2VySWQhPT10LmdldExvZygpLmdldExvZ2dlcklkKCkmJnQuZ2V0TG9nKCkuYWRkTG9nRW50cnkodC5Mb2dFbnRyeS5mcm9tT2JqZWN0KGUpKX0pKSxtLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuU0VSVkVSX0JPVU5EX0lOVEVSTkFMX0xPRywoZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5zZW5kSW50ZXJuYWxMb2dFbnRyeVRvU2VydmVyKHQuTG9nRW50cnkuZnJvbU9iamVjdChlKSl9KSksbS5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuU0VSVkVSX0JPVU5EX0lOVEVSTkFMX0xPRywoZnVuY3Rpb24oZSl7dC5pc0ZyYW1lZCgpJiZBcnJheS5pc0FycmF5KGUpJiZlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuc2VuZEludGVybmFsTG9nRW50cnlUb1NlcnZlcih0LkxvZ0VudHJ5LmZyb21PYmplY3QoZSkpfSkpfSkpLG0ub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLkxPRywoZnVuY3Rpb24oZSl7dC5pc0ZyYW1lZCgpJiZlLmxvZ2dlcklkIT09dC5nZXRMb2coKS5nZXRMb2dnZXJJZCgpJiZ0LmdldExvZygpLmFkZExvZ0VudHJ5KHQuTG9nRW50cnkuZnJvbU9iamVjdChlKSl9KSksdC5jb3JlLm9uQXV0aEZhaWwodC5oaXRjaCh0LmNvcmUsdC5jb3JlLl9oYW5kbGVBdXRoRmFpbCxuLmxvZ2luRW5kcG9pbnR8fG51bGwscCkpLHQuY29yZS5vbkF1dGhvcml6ZVN1Y2Nlc3ModC5oaXRjaCh0LmNvcmUsdC5jb3JlLl9oYW5kbGVBdXRob3JpemVTdWNjZXNzKSksdC5nZXRMb2coKS5pbmZvKCJVc2VyIEFnZW50OiAiK25hdmlnYXRvci51c2VyQWdlbnQpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5nZXRMb2coKS5pbmZvKCJpc0NDUHYyOiAiKyEwKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuZ2V0TG9nKCkuaW5mbygiaXNGcmFtZWQ6ICIrdC5pc0ZyYW1lZCgpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS51cHN0cmVhbS5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuT1VURVJfQ09OVEVYVF9JTkZPLChmdW5jdGlvbihlKXt2YXIgbj1lLnN0cmVhbXNWZXJzaW9ufHxudWxsO3QuZ2V0TG9nKCkuaW5mbygiU3RyZWFtc0pTIFZlcnNpb246ICIrbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0Lm91dGVyQ29udGV4dFN0cmVhbXNWZXJzaW9uPW59KSksbS5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLlVQREFURV9DT05ORUNURURfQ0NQUywoZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJOdW1iZXIgb2YgY29ubmVjdGVkIENDUHMgdXBkYXRlZDogIitlLmxlbmd0aCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0Lm51bWJlck9mQ29ubmVjdGVkQ0NQcz1lLmxlbmd0aCxlW3QuY29yZS50YWJJZF0mJiFpc05hTihlW3QuY29yZS50YWJJZF0ubGVuZ3RoKSYmdC5udW1iZXJPZkNvbm5lY3RlZENDUHNJblRoaXNUYWIhPT1lW3QuY29yZS50YWJJZF0ubGVuZ3RoJiYodC5udW1iZXJPZkNvbm5lY3RlZENDUHNJblRoaXNUYWI9ZVt0LmNvcmUudGFiSWRdLmxlbmd0aCx0Lm51bWJlck9mQ29ubmVjdGVkQ0NQc0luVGhpc1RhYj4xJiZ0LmdldExvZygpLndhcm4oIlRoZXJlIGFyZSAiK3QubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzSW5UaGlzVGFiKyIgY29ubmVjdGVkIENDUHMgaW4gdGhpcyB0YWIuIFBsZWFzZSBhZGp1c3QgeW91ciBpbXBsZW1lbnRhdGlvbiB0byBhdm9pZCBjb21wbGljYXRpb25zLiBJZiB5b3UgYXJlIGVtYmVkZGluZyBDQ1AsIHBsZWFzZSBkbyBzbyBleGNsdXNpdmVseSB3aXRoIGluaXRDQ1AuIEluaXRDQ1Agd2lsbCBub3QgbGV0IHlvdSBlbWJlZCBtb3JlIHRoYW4gb25lIENDUC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQucHVibGlzaE1ldHJpYyh7bmFtZToiQ29ubmVjdGVkQ0NQU2luZ2xlVGFiQ291bnQiLGRhdGE6e2NvdW50OnQubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzSW5UaGlzVGFifX0pKSxlLnRhYklkJiZlLnN0cmVhbXNUYWJzQWNyb3NzQnJvd3NlciYmdC5pZk1hc3Rlcih0Lk1hc3RlclRvcGljcy5NRVRSSUNTLCgoKT0+dC5hZ2VudCgoKCk9PnQucHVibGlzaE1ldHJpYyh7bmFtZToiQ0NQVGFic0Fjcm9zc0Jyb3dzZXJDb3VudCIsZGF0YTp7dGFiSWQ6ZS50YWJJZCxjb3VudDplLnN0cmVhbXNUYWJzQWNyb3NzQnJvd3Nlcn19KSkpKSl9KSksdC5jb3JlLmNsaWVudD1uZXcgdC5VcHN0cmVhbUNvbmR1aXRDbGllbnQobSksdC5jb3JlLm1hc3RlckNsaWVudD1uZXcgdC5VcHN0cmVhbUNvbmR1aXRNYXN0ZXJDbGllbnQobSksdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLlRFUk1JTkFURSxtLnBhc3NVcHN0cmVhbSgpKSx0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5FdmVudFR5cGUuVEVSTUlOQVRFRCwoZnVuY3Rpb24oKXt3aW5kb3cubG9jYXRpb24ucmVsb2FkKCEwKX0pKSxnLnBvcnQuc3RhcnQoKSxtLm9uVXBzdHJlYW0odC5Wb2ljZUlkRXZlbnRzLlVQREFURV9ET01BSU5fSUQsKGZ1bmN0aW9uKGUpe2UmJmUuZG9tYWluSWQmJih0LmNvcmUudm9pY2VJZERvbWFpbklkPWUuZG9tYWluSWQpfSkpLHQuYWdlbnQoKGZ1bmN0aW9uKCl7KG5ldyB0LlZvaWNlSWQpLmdldERvbWFpbklkKCkudGhlbigoZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJ2b2ljZUlkIGRvbWFpbklkIHN1Y2Nlc3NmdWxseSBmZXRjaGVkIGF0IGFnZW50IGluaXRpYWxpemF0aW9uOiAiK2UpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygidm9pY2VJZCBkb21haW5JZCBub3QgZmV0Y2hlZCBhdCBhZ2VudCBpbml0aWFsaXphdGlvbiIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKX0pKSx0LmNvcmUuZ2V0Tm90aWZpY2F0aW9uTWFuYWdlcigpLnJlcXVlc3RQZXJtaXNzaW9uKCksbS5vbkRvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLklOSVRfRElTQVNURVJfUkVDT1ZFUlksKGZ1bmN0aW9uKGUpe3QuY29yZS5pbml0RGlzYXN0ZXJSZWNvdmVyeShlKX0pKX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgQVBJIHNoYXJlZCB3b3JrZXIsIHdlJ3JlIGRlYWQhIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX19LHQuY29yZS5fc2V0VGFiSWQ9ZnVuY3Rpb24oKXt0cnl7dC5jb3JlLnRhYklkPXdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHQuU2Vzc2lvblN0b3JhZ2VLZXlzLlRBQl9JRCksdC5jb3JlLnRhYklkfHwodC5jb3JlLnRhYklkPXQucmFuZG9tSWQoKSx3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0LlNlc3Npb25TdG9yYWdlS2V5cy5UQUJfSUQsdC5jb3JlLnRhYklkKSksdC5jb3JlLnVwc3RyZWFtLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5UQUJfSUQse3RhYklkOnQuY29yZS50YWJJZH0pfWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIltUYWIgSWRdIFRoZXJlIHdhcyBhbiBpc3N1ZSBzZXR0aW5nIHRoZSB0YWIgSWQiKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fSx0LmNvcmUuaW5pdENDUD1mdW5jdGlvbihuLGkpe2lmKHQuY29yZS5jaGVja05vdEluaXRpYWxpemVkKCksIXQuY29yZS5pbml0aWFsaXplZCl7dC5nZXRMb2coKS5pbmZvKCJJZnJhbWUgaW5pdGlhbGl6YXRpb24gc3RhcnRlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIHM9RGF0ZS5ub3coKTt0cnl7aWYodC5jb3JlLl9nZXRDQ1BJZnJhbWUoKSlyZXR1cm4gdm9pZCB0LmdldExvZygpLmVycm9yKCJBdHRlbXB0ZWQgdG8gY2FsbCBpbml0Q0NQIHdoZW4gYW4gaWZyYW1lIGdlbmVyYXRlZCBieSBpbml0Q0NQIGFscmVhZHkgZXhpc3RzIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJFcnJvciB3aGlsZSBjaGVja2luZyBpZiBpbml0Q0NQIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfXZhciBwPXt9OyJzdHJpbmciPT10eXBlb2YgaT9wLmNjcFVybD1pOnA9aSx0LmFzc2VydE5vdE51bGwobiwiY29udGFpbmVyRGl2IiksdC5hc3NlcnROb3ROdWxsKHAuY2NwVXJsLCJwYXJhbXMuY2NwVXJsIiksaC5jbGVhbigpLGYuY2xlYW4oKTt2YXIgZD10LmNvcmUuX2NyZWF0ZUNDUElmcmFtZShuLHApO3QuY29yZS5ldmVudEJ1cz1uZXcgdC5FdmVudEJ1cyh7bG9nRXZlbnRzOiExfSksdC5jb3JlLmFnZW50RGF0YVByb3ZpZGVyPW5ldyBJKHQuY29yZS5nZXRFdmVudEJ1cygpKSx0LmNvcmUubWVkaWFGYWN0b3J5PW5ldyB0Lk1lZGlhRmFjdG9yeShwKTt2YXIgZz1uZXcgdC5JRnJhbWVDb25kdWl0KHAuY2NwVXJsLHdpbmRvdyxkKTt0LmNvcmUuX3NlbmRJZnJhbWVTdHlsZURhdGFVcHN0cmVhbUFmdGVyUmVhc29uYWJsZVdhaXRUaW1lKGQsZyksdC5jb3JlLnVwc3RyZWFtPWcsdC5jb3JlLndlYlNvY2tldFByb3ZpZGVyPW5ldyBDLGcub25BbGxVcHN0cmVhbSh0LmNvcmUuZ2V0RXZlbnRCdXMoKS5icmlkZ2UoKSksdC5jb3JlLmtlZXBhbGl2ZU1hbmFnZXI9bmV3IFQoZyx0LmNvcmUuZ2V0RXZlbnRCdXMoKSxwLmNjcFN5blRpbWVvdXR8fDFlMyxwLmNjcEFja1RpbWVvdXR8fDNlMyksdC5jb3JlLmlmcmFtZVJlZnJlc2hUaW1lb3V0PW51bGwsdC5jb3JlLmNjcExvYWRUaW1lb3V0SW5zdGFuY2U9ZS5zZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuY29yZS5jY3BMb2FkVGltZW91dEluc3RhbmNlPW51bGwsdC5jb3JlLmdldEV2ZW50QnVzKCkudHJpZ2dlcih0LkV2ZW50VHlwZS5BQ0tfVElNRU9VVCksdC5nZXRMb2coKS5pbmZvKCJDQ1AgTG9hZFRpbWVvdXQgdHJpZ2dlcmVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pLHAuY2NwTG9hZFRpbWVvdXR8fDVlMyksdC5nZXRMb2coKS5zY2hlZHVsZVVwc3RyZWFtT3V0ZXJDb250ZXh0Q0NQTG9nc1B1c2goZyksdC5nZXRMb2coKS5zY2hlZHVsZVVwc3RyZWFtT3V0ZXJDb250ZXh0Q0NQc2VydmVyQm91bmRMb2dzUHVzaChnKSxnLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuQUNLTk9XTEVER0UsKGZ1bmN0aW9uKG4pe2lmKHQuZ2V0TG9nKCkuaW5mbygiQWNrbm93bGVkZ2VkIGJ5IHRoZSBDQ1AhIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUuY2xpZW50PW5ldyB0LlVwc3RyZWFtQ29uZHVpdENsaWVudChnKSx0LmNvcmUubWFzdGVyQ2xpZW50PW5ldyB0LlVwc3RyZWFtQ29uZHVpdE1hc3RlckNsaWVudChnKSx0LmNvcmUucG9ydFN0cmVhbUlkPW4uaWQsKHAuc29mdHBob25lfHxwLmNoYXR8fHAucGFnZU9wdGlvbnN8fHAuc2hvdWxkQWRkTmFtZXNwYWNlVG9Mb2dzfHxwLmRpc2FzdGVyUmVjb3ZlcnlPbikmJmcuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkNPTkZJR1VSRSx7c29mdHBob25lOnAuc29mdHBob25lLGNoYXQ6cC5jaGF0LHBhZ2VPcHRpb25zOnAucGFnZU9wdGlvbnMsc2hvdWxkQWRkTmFtZXNwYWNlVG9Mb2dzOnAuc2hvdWxkQWRkTmFtZXNwYWNlVG9Mb2dzLGRpc2FzdGVyUmVjb3ZlcnlPbjpwLmRpc2FzdGVyUmVjb3ZlcnlPbn0pLHAuZGlzYXN0ZXJSZWNvdmVyeU9uJiYodC5jb3JlLnJlZ2lvbj1wLnJlZ2lvbix0LmNvcmUuc3VwcHJlc3NDb250YWN0cz12LHQuY29yZS5mb3JjZU9mZmxpbmU9ZnVuY3Rpb24oZSl7Zy5zZW5kVXBzdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLlNFVF9PRkZMSU5FLGUpfSxnLnNlbmRVcHN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuSU5JVF9ESVNBU1RFUl9SRUNPVkVSWSxwKSksdC5jb3JlLmNjcExvYWRUaW1lb3V0SW5zdGFuY2UmJihlLmNsZWFyVGltZW91dCh0LmNvcmUuY2NwTG9hZFRpbWVvdXRJbnN0YW5jZSksdC5jb3JlLmNjcExvYWRUaW1lb3V0SW5zdGFuY2U9bnVsbCksZy5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuT1VURVJfQ09OVEVYVF9JTkZPLHtzdHJlYW1zVmVyc2lvbjp0LnZlcnNpb259KSx0LmNvcmUua2VlcGFsaXZlTWFuYWdlci5zdGFydCgpLHRoaXMudW5zdWJzY3JpYmUoKSx0LmNvcmUuaW5pdGlhbGl6ZWQ9ITAsdC5jb3JlLmdldEV2ZW50QnVzKCkudHJpZ2dlcih0LkV2ZW50VHlwZS5JTklUKSxzKXt2YXIgcj1EYXRlLm5vdygpLXMsbz10LmNvcmUuaWZyYW1lUmVmcmVzaEF0dGVtcHR8fDA7dC5nZXRMb2coKS5pbmZvKCJJZnJhbWUgaW5pdGlhbGl6YXRpb24gc3VjY2VlZGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmdldExvZygpLmluZm8oYElmcmFtZSBpbml0aWFsaXphdGlvbiB0aW1lICR7cn1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuZ2V0TG9nKCkuaW5mbyhgSWZyYW1lIHJlZnJlc2ggYXR0ZW1wdHMgJHtvfWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksc2V0VGltZW91dCgoKCk9Pnt0LnB1Ymxpc2hNZXRyaWMoe25hbWU6YSxkYXRhOntjb3VudDpvfX0pLHQucHVibGlzaE1ldHJpYyh7bmFtZTp1LGRhdGE6e2NvdW50OjF9fSksdC5wdWJsaXNoTWV0cmljKHtuYW1lOiJJZnJhbWVJbml0aWFsaXphdGlvblRpbWUiLGRhdGE6e2NvdW50OnJ9fSkscC5kaXNhc3RlclJlY292ZXJ5T24mJih0LnB1Ymxpc2hNZXRyaWMoe25hbWU6YyxkYXRhOntjb3VudDpvfX0pLHQucHVibGlzaE1ldHJpYyh7bmFtZTpsLGRhdGE6e2NvdW50OjF9fSksdC5wdWJsaXNoTWV0cmljKHtuYW1lOiJJZnJhbWVJbml0aWFsaXphdGlvblRpbWVEciIsZGF0YTp7Y291bnQ6cn19KSkscz1udWxsfSksMWUzKX19KSksZy5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLkxPRywoZnVuY3Rpb24oZSl7ZS5sb2dnZXJJZCE9PXQuZ2V0TG9nKCkuZ2V0TG9nZ2VySWQoKSYmdC5nZXRMb2coKS5hZGRMb2dFbnRyeSh0LkxvZ0VudHJ5LmZyb21PYmplY3QoZSkpfSkpLHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5BQ0tfVElNRU9VVCwoZnVuY3Rpb24oKXtpZighMSE9PXAubG9naW5Qb3B1cCl0cnl7dmFyIGk9ZnVuY3Rpb24obil7dmFyIGk9Imh0dHBzOi8vbGlseS51cy1lYXN0LTEuYW1hem9uYXdzLmNvbS90YXcvYXV0aC9jb2RlIjtyZXR1cm4gdC5hc3NlcnROb3ROdWxsKGkpLG4ubG9naW5Vcmw/bi5sb2dpblVybDpuLmFsaWFzPyhsb2cud2FybigiVGhlIGBhbGlhc2AgcGFyYW0gaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSBleHBlY3RlZCB0byBmdW5jdGlvbiBwcm9wZXJseS4gUGxlYXNlIHVzZSBgY2NwVXJsYCBvciBgbG9naW5VcmxgLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FtYXpvbi1jb25uZWN0L2FtYXpvbi1jb25uZWN0LXN0cmVhbXMvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI2Nvbm5lY3Rjb3JlaW5pdGNjcCBmb3IgdmFsaWQgcGFyYW1ldGVycy4iKSxyLnJlcGxhY2UoInthbGlhc30iLG4uYWxpYXMpLnJlcGxhY2UoIntjbGllbnRfaWR9IixvKS5yZXBsYWNlKCJ7cmVkaXJlY3R9IixlLmVuY29kZVVSSUNvbXBvbmVudChpKSkpOm4uY2NwVXJsfShwKTt0LmdldExvZygpLndhcm4oIkFDS19USU1FT1VUIG9jY3VycmVkLCBhdHRlbXB0aW5nIHRvIHBvcCB0aGUgbG9naW4gcGFnZSBpZiBub3QgYWxyZWFkeSBvcGVuLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscC5sb2dpblVybCYmdC5jb3JlLmdldFBvcHVwTWFuYWdlcigpLmNsZWFyKHQuTWFzdGVyVG9waWNzLkxPR0lOX1BPUFVQKSx0LmNvcmUubG9naW5XaW5kb3c9dC5jb3JlLmdldFBvcHVwTWFuYWdlcigpLm9wZW4oaSx0Lk1hc3RlclRvcGljcy5MT0dJTl9QT1BVUCxwLmxvZ2luT3B0aW9ucyl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiQUNLX1RJTUVPVVQgb2NjdXJyZWQgYnV0IHdlIGFyZSB1bmFibGUgdG8gb3BlbiB0aGUgbG9naW4gcG9wdXAuIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWlmKG51bGw9PXQuY29yZS5pZnJhbWVSZWZyZXNoVGltZW91dCl0cnl7Zy5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLkFDS05PV0xFREdFLChmdW5jdGlvbigpe3RoaXMudW5zdWJzY3JpYmUoKSxlLmNsZWFyVGltZW91dCh0LmNvcmUuaWZyYW1lUmVmcmVzaFRpbWVvdXQpLHQuY29yZS5pZnJhbWVSZWZyZXNoVGltZW91dD1udWxsLHQuY29yZS5nZXRQb3B1cE1hbmFnZXIoKS5jbGVhcih0Lk1hc3RlclRvcGljcy5MT0dJTl9QT1BVUCksKHAubG9naW5Qb3B1cEF1dG9DbG9zZXx8cC5sb2dpbk9wdGlvbnMmJnAubG9naW5PcHRpb25zLmF1dG9DbG9zZSkmJnQuY29yZS5sb2dpbldpbmRvdyYmKHQuY29yZS5sb2dpbldpbmRvdy5jbG9zZSgpLHQuY29yZS5sb2dpbldpbmRvdz1udWxsKX0pKSx0LmNvcmUuX3JlZnJlc2hJZnJhbWVPblRpbWVvdXQocCxuKX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJFcnJvciBvY2N1cnJlZCB3aGlsZSByZWZyZXNoaW5nIGlmcmFtZSIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19KSkscC5vblZpZXdDb250YWN0JiZ0LmNvcmUub25WaWV3Q29udGFjdChwLm9uVmlld0NvbnRhY3QpLGcub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5VUERBVEVfQ09OTkVDVEVEX0NDUFMsKGZ1bmN0aW9uKGUpe3QubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzPWUubGVuZ3RofSkpLGcub25VcHN0cmVhbSh0LlZvaWNlSWRFdmVudHMuVVBEQVRFX0RPTUFJTl9JRCwoZnVuY3Rpb24oZSl7ZSYmZS5kb21haW5JZCYmKHQuY29yZS52b2ljZUlkRG9tYWluSWQ9ZS5kb21haW5JZCl9KSksdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLklGUkFNRV9SRVRSSUVTX0VYSEFVU1RFRCwoZnVuY3Rpb24oKXtpZihzKXt2YXIgZT10LmNvcmUuaWZyYW1lUmVmcmVzaEF0dGVtcHQtMTt0LmdldExvZygpLmluZm8oIklmcmFtZSBpbml0aWFsaXphdGlvbiBmYWlsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuZ2V0TG9nKCkuaW5mbygiVGltZSBhZnRlciBpZnJhbWUgaW5pdGlhbGl6YXRpb24gc3RhcnRlZCAiKyhEYXRlLm5vdygpLXMpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuZ2V0TG9nKCkuaW5mbyhgSWZyYW1lIHJlZnJlc2ggYXR0ZW1wdHMgJHtlfWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5wdWJsaXNoTWV0cmljKHtuYW1lOmEsZGF0YTp7Y291bnQ6ZX19KSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6dSxkYXRhOntjb3VudDowfX0pLHAuZGlzYXN0ZXJSZWNvdmVyeU9uJiYodC5wdWJsaXNoTWV0cmljKHtuYW1lOmMsZGF0YTp7Y291bnQ6ZX19KSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6bCxkYXRhOntjb3VudDowfX0pKSxzPW51bGx9fSkpLHQuY29yZS5zb2Z0cGhvbmVQYXJhbXM9cC5zb2Z0cGhvbmV9fSx0LmNvcmUub25JZnJhbWVSZXRyaWVzRXhoYXVzdGVkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5JRlJBTUVfUkVUUklFU19FWEhBVVNURUQsZSl9LHQuY29yZS5fcmVmcmVzaElmcmFtZU9uVGltZW91dD1mdW5jdGlvbihuLHIpe3QuYXNzZXJ0Tm90TnVsbChuLCJpbml0Q0NQUGFyYW1zIiksdC5hc3NlcnROb3ROdWxsKHIsImNvbnRhaW5lckRpdiIpO3ZhciBvPSgobi5kaXNhc3RlclJlY292ZXJ5T24/MWU0OjVlMykrQVdTLnV0aWwuY2FsY3VsYXRlUmV0cnlEZWxheSh0LmNvcmUuaWZyYW1lUmVmcmVzaEF0dGVtcHQtMXx8MCx7YmFzZToyZTN9KSkqTWF0aC5jZWlsKCh0LmNvcmUuaWZyYW1lUmVmcmVzaEF0dGVtcHR8fDApLzYpO2UuY2xlYXJUaW1lb3V0KHQuY29yZS5pZnJhbWVSZWZyZXNoVGltZW91dCksdC5jb3JlLmlmcmFtZVJlZnJlc2hUaW1lb3V0PWUuc2V0VGltZW91dCgoZnVuY3Rpb24oKXtpZih0LmNvcmUuaWZyYW1lUmVmcmVzaEF0dGVtcHQ9KHQuY29yZS5pZnJhbWVSZWZyZXNoQXR0ZW1wdHx8MCkrMSx0LmNvcmUuaWZyYW1lUmVmcmVzaEF0dGVtcHQ8PTYpe3RyeXt2YXIgbz10LmNvcmUuX2dldENDUElmcmFtZSgpO28mJm8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvKTt2YXIgaT10LmNvcmUuX2NyZWF0ZUNDUElmcmFtZShyLG4pO3QuY29yZS51cHN0cmVhbS51cHN0cmVhbS5vdXRwdXQ9aS5jb250ZW50V2luZG93LHQuY29yZS5fc2VuZElmcmFtZVN0eWxlRGF0YVVwc3RyZWFtQWZ0ZXJSZWFzb25hYmxlV2FpdFRpbWUoaSx0LmNvcmUudXBzdHJlYW0pfWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIkVycm9yIHdoaWxlIGNoZWNraW5nIGZvciwgYW5kIHJlY3JlYXRpbmcsIHRoZSBDQ1AgSUZyYW1lIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfXQuY29yZS5fcmVmcmVzaElmcmFtZU9uVGltZW91dChuLHIpfWVsc2UgdC5jb3JlLmdldEV2ZW50QnVzKCkudHJpZ2dlcih0LkV2ZW50VHlwZS5JRlJBTUVfUkVUUklFU19FWEhBVVNURUQpLGUuY2xlYXJUaW1lb3V0KHQuY29yZS5pZnJhbWVSZWZyZXNoVGltZW91dCl9KSxvKX0sdC5jb3JlLl9nZXRDQ1BJZnJhbWU9ZnVuY3Rpb24oKXtmb3IodmFyIGUgb2Ygd2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSlpZihlLm5hbWU9PT1uKXJldHVybiBlO3JldHVybiBudWxsfSx0LmNvcmUuX2NyZWF0ZUNDUElmcmFtZT1mdW5jdGlvbihlLHIpe3QuYXNzZXJ0Tm90TnVsbChyLCJpbml0Q0NQUGFyYW1zIiksdC5hc3NlcnROb3ROdWxsKGUsImNvbnRhaW5lckRpdiIpO3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3JldHVybiBvLnNyYz1yLmNjcFVybCxvLmFsbG93PSJtaWNyb3Bob25lOyBhdXRvcGxheTsgY2xpcGJvYXJkLXdyaXRlIixvLnN0eWxlPXIuc3R5bGV8fCJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlIixvLnRpdGxlPXIuaWZyYW1lVGl0bGV8fG4sby5uYW1lPW4sZS5hcHBlbmRDaGlsZChvKSxvfSx0LmNvcmUuX3NlbmRJZnJhbWVTdHlsZURhdGFVcHN0cmVhbUFmdGVyUmVhc29uYWJsZVdhaXRUaW1lPWZ1bmN0aW9uKGUsbil7dC5hc3NlcnROb3ROdWxsKGUsImlmcmFtZSIpLHQuYXNzZXJ0Tm90TnVsbChuLCJjb25kdWl0Iiksc2V0VGltZW91dCgoZnVuY3Rpb24oKXt2YXIgcj17ZGlzcGxheTp3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlLG51bGwpLmRpc3BsYXksb2Zmc2V0V2lkdGg6ZS5vZmZzZXRXaWR0aCxvZmZzZXRIZWlnaHQ6ZS5vZmZzZXRIZWlnaHQsY2xpZW50UmVjdHNMZW5ndGg6ZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aH07bi5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuSUZSQU1FX1NUWUxFLHIpfSksMWU0KX07dmFyIFQ9ZnVuY3Rpb24oZSx0LG4scil7dGhpcy5jb25kdWl0PWUsdGhpcy5ldmVudEJ1cz10LHRoaXMuc3luVGltZW91dD1uLHRoaXMuYWNrVGltZW91dD1yLHRoaXMuYWNrVGltZXI9bnVsbCx0aGlzLnN5blRpbWVyPW51bGwsdGhpcy5hY2tTdWI9bnVsbH07VC5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3RoaXMuY29uZHVpdC5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuU1lOQ0hST05JWkUpLHRoaXMuYWNrU3ViPXRoaXMuY29uZHVpdC5vblVwc3RyZWFtKHQuRXZlbnRUeXBlLkFDS05PV0xFREdFLChmdW5jdGlvbigpe3RoaXMudW5zdWJzY3JpYmUoKSxlLmNsZWFyVGltZW91dChuLmFja1RpbWVyKSxuLl9kZWZlclN0YXJ0KCl9KSksdGhpcy5hY2tUaW1lcj1lLnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bi5hY2tTdWIudW5zdWJzY3JpYmUoKSxuLmV2ZW50QnVzLnRyaWdnZXIodC5FdmVudFR5cGUuQUNLX1RJTUVPVVQpLG4uX2RlZmVyU3RhcnQoKX0pLHRoaXMuYWNrVGltZW91dCl9LFQucHJvdG90eXBlLl9kZWZlclN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy5zeW5UaW1lcj1lLnNldFRpbWVvdXQodC5oaXRjaCh0aGlzLHRoaXMuc3RhcnQpLHRoaXMuc3luVGltZW91dCl9LFQucHJvdG90eXBlLmRlZmVyU3RhcnQ9ZnVuY3Rpb24oKXtudWxsPT10aGlzLnN5blRpbWVyJiYodGhpcy5zeW5UaW1lcj1lLnNldFRpbWVvdXQodC5oaXRjaCh0aGlzLHRoaXMuc3RhcnQpLHRoaXMuc3luVGltZW91dCkpfTt2YXIgQz1mdW5jdGlvbigpe3ZhciBlPXtpbml0RmFpbHVyZTpuZXcgU2V0LHN1YnNjcmlwdGlvblVwZGF0ZTpuZXcgU2V0LHN1YnNjcmlwdGlvbkZhaWx1cmU6bmV3IFNldCx0b3BpYzpuZXcgTWFwLGFsbE1lc3NhZ2U6bmV3IFNldCxjb25uZWN0aW9uR2FpbjpuZXcgU2V0LGNvbm5lY3Rpb25Mb3N0Om5ldyBTZXQsY29ubmVjdGlvbk9wZW46bmV3IFNldCxjb25uZWN0aW9uQ2xvc2U6bmV3IFNldH0sbj1mdW5jdGlvbihlLHQpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZSh0KX0pKX07dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5JTklUX0ZBSUxVUkUsKGZ1bmN0aW9uKCl7bihlLmluaXRGYWlsdXJlKX0pKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLkNPTk5FQ1RJT05fT1BFTiwoZnVuY3Rpb24odCl7bihlLmNvbm5lY3Rpb25PcGVuLHQpfSkpLHQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuQ09OTkVDVElPTl9DTE9TRSwoZnVuY3Rpb24odCl7bihlLmNvbm5lY3Rpb25DbG9zZSx0KX0pKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLkNPTk5FQ1RJT05fR0FJTiwoZnVuY3Rpb24oKXtuKGUuY29ubmVjdGlvbkdhaW4pfSkpLHQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuQ09OTkVDVElPTl9MT1NULChmdW5jdGlvbih0KXtuKGUuY29ubmVjdGlvbkxvc3QsdCl9KSksdC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5TVUJTQ1JJUFRJT05fVVBEQVRFLChmdW5jdGlvbih0KXtuKGUuc3Vic2NyaXB0aW9uVXBkYXRlLHQpfSkpLHQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuU1VCU0NSSVBUSU9OX0ZBSUxVUkUsKGZ1bmN0aW9uKHQpe24oZS5zdWJzY3JpcHRpb25GYWlsdXJlLHQpfSkpLHQuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuQUxMX01FU1NBR0UsKGZ1bmN0aW9uKHQpe24oZS5hbGxNZXNzYWdlLHQpLGUudG9waWMuaGFzKHQudG9waWMpJiZuKGUudG9waWMuZ2V0KHQudG9waWMpLHQpfSkpLHRoaXMuc2VuZE1lc3NhZ2U9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLlNFTkQsZSl9LHRoaXMub25Jbml0RmFpbHVyZT1mdW5jdGlvbihuKXtyZXR1cm4gdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGUuaW5pdEZhaWx1cmUuYWRkKG4pLGZ1bmN0aW9uKCl7cmV0dXJuIGUuaW5pdEZhaWx1cmUuZGVsZXRlKG4pfX0sdGhpcy5vbkNvbm5lY3Rpb25PcGVuPWZ1bmN0aW9uKG4pe3JldHVybiB0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS5jb25uZWN0aW9uT3Blbi5hZGQobiksZnVuY3Rpb24oKXtyZXR1cm4gZS5jb25uZWN0aW9uT3Blbi5kZWxldGUobil9fSx0aGlzLm9uQ29ubmVjdGlvbkNsb3NlPWZ1bmN0aW9uKG4pe3JldHVybiB0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS5jb25uZWN0aW9uQ2xvc2UuYWRkKG4pLGZ1bmN0aW9uKCl7cmV0dXJuIGUuY29ubmVjdGlvbkNsb3NlLmRlbGV0ZShuKX19LHRoaXMub25Db25uZWN0aW9uR2Fpbj1mdW5jdGlvbihuKXtyZXR1cm4gdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGUuY29ubmVjdGlvbkdhaW4uYWRkKG4pLGZ1bmN0aW9uKCl7cmV0dXJuIGUuY29ubmVjdGlvbkdhaW4uZGVsZXRlKG4pfX0sdGhpcy5vbkNvbm5lY3Rpb25Mb3N0PWZ1bmN0aW9uKG4pe3JldHVybiB0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS5jb25uZWN0aW9uTG9zdC5hZGQobiksZnVuY3Rpb24oKXtyZXR1cm4gZS5jb25uZWN0aW9uTG9zdC5kZWxldGUobil9fSx0aGlzLm9uU3Vic2NyaXB0aW9uVXBkYXRlPWZ1bmN0aW9uKG4pe3JldHVybiB0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS5zdWJzY3JpcHRpb25VcGRhdGUuYWRkKG4pLGZ1bmN0aW9uKCl7cmV0dXJuIGUuc3Vic2NyaXB0aW9uVXBkYXRlLmRlbGV0ZShuKX19LHRoaXMub25TdWJzY3JpcHRpb25GYWlsdXJlPWZ1bmN0aW9uKG4pe3JldHVybiB0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS5zdWJzY3JpcHRpb25GYWlsdXJlLmFkZChuKSxmdW5jdGlvbigpe3JldHVybiBlLnN1YnNjcmlwdGlvbkZhaWx1cmUuZGVsZXRlKG4pfX0sdGhpcy5zdWJzY3JpYmVUb3BpY3M9ZnVuY3Rpb24oZSl7dC5hc3NlcnROb3ROdWxsKGUsInRvcGljcyIpLHQuYXNzZXJ0VHJ1ZSh0LmlzQXJyYXkoZSksInRvcGljcyBtdXN0IGJlIGEgYXJyYXkiKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuU1VCU0NSSUJFLGUpfSx0aGlzLm9uTWVzc2FnZT1mdW5jdGlvbihuLHIpe3JldHVybiB0LmFzc2VydE5vdE51bGwobiwidG9waWNOYW1lIiksdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihyKSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGUudG9waWMuaGFzKG4pP2UudG9waWMuZ2V0KG4pLmFkZChyKTplLnRvcGljLnNldChuLG5ldyBTZXQoW3JdKSksZnVuY3Rpb24oKXtyZXR1cm4gZS50b3BpYy5nZXQobikuZGVsZXRlKHIpfX0sdGhpcy5vbkFsbE1lc3NhZ2U9ZnVuY3Rpb24obil7cmV0dXJuIHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksIm1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24iKSxlLmFsbE1lc3NhZ2UuYWRkKG4pLGZ1bmN0aW9uKCl7cmV0dXJuIGUuYWxsTWVzc2FnZS5kZWxldGUobil9fX0sST1mdW5jdGlvbihlKXt0aGlzLmJ1cz1lLHRoaXMuYnVzLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLlVQREFURSx0LmhpdGNoKHRoaXMsdGhpcy51cGRhdGVBZ2VudERhdGEpKX07SS5wcm90b3R5cGUudXBkYXRlQWdlbnREYXRhPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMuYWdlbnREYXRhO3RoaXMuYWdlbnREYXRhPWU7dHJ5e2NvbnN0IHI9RGF0ZS5wYXJzZShlLnNuYXBzaG90LnNuYXBzaG90VGltZXN0YW1wKTtpZighbnx8ciE9PURhdGUucGFyc2Uobi5zbmFwc2hvdC5zbmFwc2hvdFRpbWVzdGFtcCkpe2NvbnN0IG49KG5ldyBEYXRlKS5nZXRUaW1lKCktcjtBKCJTbmFwc2hvdFJlY2VpdmVkQnlDbGllbnQiLG4se0NvbnRlbnRMZW5ndGhJbkJ5dGVzOnQuY29yZS5fY2FsY3VsYXRlU25hcHNob3RTaXppbmdCdWNrZXQoZS5zbmFwc2hvdCksSXNDQ1BMYXllcjp0LmlzQ0NQKCl9KX19Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiW01ldHJpY3NdIEZhaWxlZCB0byBzZW5kIG1ldHJpY3MuIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfW51bGw9PW4mJih0LmFnZW50LmluaXRpYWxpemVkPSEwLHRoaXMuYnVzLnRyaWdnZXIodC5BZ2VudEV2ZW50cy5JTklULG5ldyB0LkFnZW50KSksdGhpcy5idXMudHJpZ2dlcih0LkFnZW50RXZlbnRzLlJFRlJFU0gsbmV3IHQuQWdlbnQpLHRoaXMuX2ZpcmVBZ2VudFVwZGF0ZUV2ZW50cyhuKX0sSS5wcm90b3R5cGUuZ2V0QWdlbnREYXRhPWZ1bmN0aW9uKCl7aWYobnVsbD09dGhpcy5hZ2VudERhdGEpdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiTm8gYWdlbnQgZGF0YSBpcyBhdmFpbGFibGUgeWV0ISIpO3JldHVybiB0aGlzLmFnZW50RGF0YX0sSS5wcm90b3R5cGUuZ2V0Q29udGFjdERhdGE9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcy5nZXRBZ2VudERhdGEoKSxyPXQuZmluZChuLnNuYXBzaG90LmNvbnRhY3RzLChmdW5jdGlvbih0KXtyZXR1cm4gdC5jb250YWN0SWQ9PT1lfSkpO2lmKG51bGw9PXIpdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiQ29udGFjdCAlcyBubyBsb25nZXIgZXhpc3RzLiIsZSk7cmV0dXJuIHJ9LEkucHJvdG90eXBlLmdldENvbm5lY3Rpb25EYXRhPWZ1bmN0aW9uKGUsbil7dmFyIHI9dGhpcy5nZXRDb250YWN0RGF0YShlKSxvPXQuZmluZChyLmNvbm5lY3Rpb25zLChmdW5jdGlvbihlKXtyZXR1cm4gZS5jb25uZWN0aW9uSWQ9PT1ufSkpO2lmKG51bGw9PW8pdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiQ29ubmVjdGlvbiAlcyBmb3IgY29udGFjdCAlcyBubyBsb25nZXIgZXhpc3RzLiIsbixlKTtyZXR1cm4gb30sSS5wcm90b3R5cGUuZ2V0SW5zdGFuY2VJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEFnZW50RGF0YSgpLmNvbmZpZ3VyYXRpb24ucm91dGluZ1Byb2ZpbGUucm91dGluZ1Byb2ZpbGVJZC5tYXRjaCgvaW5zdGFuY2VcLyhbMC05YS1mQS1GfC1dKylcLy8pWzFdfSxJLnByb3RvdHlwZS5nZXRBV1NBY2NvdW50SWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRBZ2VudERhdGEoKS5jb25maWd1cmF0aW9uLnJvdXRpbmdQcm9maWxlLnJvdXRpbmdQcm9maWxlSWQubWF0Y2goLzooWzAtOV0rKTppbnN0YW5jZS8pWzFdfSxJLnByb3RvdHlwZS5fZGlmZkNvbnRhY3RzPWZ1bmN0aW9uKGUpe3ZhciBuPXthZGRlZDp7fSxyZW1vdmVkOnt9LGNvbW1vbjp7fSxvbGRNYXA6dC5pbmRleChudWxsPT1lP1tdOmUuc25hcHNob3QuY29udGFjdHMsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNvbnRhY3RJZH0pKSxuZXdNYXA6dC5pbmRleCh0aGlzLmFnZW50RGF0YS5zbmFwc2hvdC5jb250YWN0cywoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29udGFjdElkfSkpLGVuZFRpbWU6MH07cmV0dXJuIHQua2V5cyhuLm9sZE1hcCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5jb250YWlucyhuLm5ld01hcCxlKT9uLmNvbW1vbltlXT1uLm5ld01hcFtlXTpuLnJlbW92ZWRbZV09bi5vbGRNYXBbZV19KSksdC5rZXlzKG4ubmV3TWFwKS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmNvbnRhaW5zKG4ub2xkTWFwLGUpfHwobi5hZGRlZFtlXT1uLm5ld01hcFtlXSl9KSksbi5lbmRUaW1lPXBlcmZvcm1hbmNlLm5vdygpLG59LEkucHJvdG90eXBlLl9maXJlQWdlbnRVcGRhdGVFdmVudHM9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcyxyPW51bGwsbz1udWxsPT1lP3QuQWdlbnRBdmFpbFN0YXRlcy5JTklUOmUuc25hcHNob3Quc3RhdGUubmFtZSxpPXRoaXMuYWdlbnREYXRhLnNuYXBzaG90LnN0YXRlLm5hbWUscz1udWxsPT1lP3QuQWdlbnRTdGF0ZVR5cGUuSU5JVDplLnNuYXBzaG90LnN0YXRlLnR5cGUsYT10aGlzLmFnZW50RGF0YS5zbmFwc2hvdC5zdGF0ZS50eXBlO3MhPT1hJiZ0LmNvcmUuZ2V0QWdlbnRSb3V0aW5nRXZlbnRHcmFwaCgpLmdldEFzc29jaWF0aW9ucyh0aGlzLHMsYSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bi5idXMudHJpZ2dlcihlLG5ldyB0LkFnZW50KX0pKSxvIT09aSYmKHRoaXMuYnVzLnRyaWdnZXIodC5BZ2VudEV2ZW50cy5TVEFURV9DSEFOR0Use2FnZW50Om5ldyB0LkFnZW50LG9sZFN0YXRlOm8sbmV3U3RhdGU6aX0pLHQuY29yZS5nZXRBZ2VudFN0YXRlRXZlbnRHcmFwaCgpLmdldEFzc29jaWF0aW9ucyh0aGlzLG8saSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bi5idXMudHJpZ2dlcihlLG5ldyB0LkFnZW50KX0pKSk7dmFyIGM9ZSYmZS5zbmFwc2hvdC5uZXh0U3RhdGU/ZS5zbmFwc2hvdC5uZXh0U3RhdGUubmFtZTpudWxsLHU9dGhpcy5hZ2VudERhdGEuc25hcHNob3QubmV4dFN0YXRlP3RoaXMuYWdlbnREYXRhLnNuYXBzaG90Lm5leHRTdGF0ZS5uYW1lOm51bGw7YyE9PXUmJnUmJm4uYnVzLnRyaWdnZXIodC5BZ2VudEV2ZW50cy5FTlFVRVVFRF9ORVhUX1NUQVRFLG5ldyB0LkFnZW50KTtjb25zdCBsPXBlcmZvcm1hbmNlLm5vdygpO3I9bnVsbCE9PWU/dGhpcy5fZGlmZkNvbnRhY3RzKGUpOnthZGRlZDp0LmluZGV4KHRoaXMuYWdlbnREYXRhLnNuYXBzaG90LmNvbnRhY3RzLChmdW5jdGlvbihlKXtyZXR1cm4gZS5jb250YWN0SWR9KSkscmVtb3ZlZDp7fSxjb21tb246e30sb2xkTWFwOnt9LG5ld01hcDp0LmluZGV4KHRoaXMuYWdlbnREYXRhLnNuYXBzaG90LmNvbnRhY3RzLChmdW5jdGlvbihlKXtyZXR1cm4gZS5jb250YWN0SWR9KSksZW5kVGltZTpwZXJmb3JtYW5jZS5ub3coKX07Y29uc3QgcD1wZXJmb3JtYW5jZS5ub3coKTt0LnZhbHVlcyhyLmFkZGVkKS5mb3JFYWNoKChmdW5jdGlvbihlKXtuLmJ1cy50cmlnZ2VyKHQuQ29udGFjdEV2ZW50cy5JTklULG5ldyB0LkNvbnRhY3QoZS5jb250YWN0SWQpKSxuLl9maXJlQ29udGFjdFVwZGF0ZUV2ZW50cyhlLmNvbnRhY3RJZCx0LkNvbnRhY3RTdGF0ZVR5cGUuSU5JVCxlLnN0YXRlLnR5cGUpfSkpLHQudmFsdWVzKHIucmVtb3ZlZCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bi5idXMudHJpZ2dlcih0LkNvbnRhY3RFdmVudHMuREVTVFJPWUVELG5ldyB0LkNvbnRhY3RTbmFwc2hvdChlKSksbi5idXMudHJpZ2dlcih0LmNvcmUuZ2V0Q29udGFjdEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuREVTVFJPWUVELGUuY29udGFjdElkKSxuZXcgdC5Db250YWN0U25hcHNob3QoZSkpLG4uX3Vuc3ViQWxsQ29udGFjdEV2ZW50c0ZvckNvbnRhY3QoZS5jb250YWN0SWQpfSkpLHQua2V5cyhyLmNvbW1vbikuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bi5fZmlyZUNvbnRhY3RVcGRhdGVFdmVudHMoZSxyLm9sZE1hcFtlXS5zdGF0ZS50eXBlLHIubmV3TWFwW2VdLnN0YXRlLnR5cGUpfSkpO2NvbnN0IGQ9cGVyZm9ybWFuY2Uubm93KCksaD17Q29udGVudExlbmd0aEluQnl0ZXM6dC5jb3JlLl9jYWxjdWxhdGVTbmFwc2hvdFNpemluZ0J1Y2tldCh0aGlzLmFnZW50RGF0YS5zbmFwc2hvdCksSXNDQ1BMYXllcjp0LmlzQ0NQKCl9O3RyeXtBKCJTbmFwc2hvdENvbXBhcmlzb25TdGVwVGltZSIsci5lbmRUaW1lLWwsaCksQSgiU25hcHNob3RFdmVudFRyaWdnZXJTdGVwVGltZSIsZC1wLGgpLEEoIlNuYXBzaG90VG90YWxQcm9jZXNzaW5nVGltZSIsZC1sLGgpfWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIltNZXRyaWNzXSBGYWlsZWQgdG8gc2VuZCBtZXRyaWNzLiIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19O2xldCBBPShlLG4scik9Pnt0LnB1Ymxpc2hNZXRyaWMoe25hbWU6ZSxkYXRhOntsYXRlbmN5Om4sb3B0aW9uYWxEaW1lbnNpb25zOnJ9fSl9O3QuY29yZS5fY2FsY3VsYXRlU25hcHNob3RTaXppbmdCdWNrZXQ9ZnVuY3Rpb24oZSl7aWYoZSYmZS5oYXNPd25Qcm9wZXJ0eSgiY29udGVudExlbmd0aCIpKXtjb25zdCB0PXBhcnNlSW50KGUuY29udGVudExlbmd0aCk7Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmtleXMocCkpe2NvbnN0W24scl09cFtlXTtpZih0Pj1uJiZ0PD1yKXJldHVybiBlfX1yZXR1cm4idW5kZWZpbmVkIn0sSS5wcm90b3R5cGUuX2ZpcmVDb250YWN0VXBkYXRlRXZlbnRzPWZ1bmN0aW9uKGUsbixyKXt2YXIgbz10aGlzO24hPT1yJiZ0LmNvcmUuZ2V0Q29udGFjdEV2ZW50R3JhcGgoKS5nZXRBc3NvY2lhdGlvbnModGhpcyxuLHIpLmZvckVhY2goKGZ1bmN0aW9uKG4pe28uYnVzLnRyaWdnZXIobixuZXcgdC5Db250YWN0KGUpKSxvLmJ1cy50cmlnZ2VyKHQuY29yZS5nZXRDb250YWN0RXZlbnROYW1lKG4sZSksbmV3IHQuQ29udGFjdChlKSl9KSksby5idXMudHJpZ2dlcih0LkNvbnRhY3RFdmVudHMuUkVGUkVTSCxuZXcgdC5Db250YWN0KGUpKSxvLmJ1cy50cmlnZ2VyKHQuY29yZS5nZXRDb250YWN0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5SRUZSRVNILGUpLG5ldyB0LkNvbnRhY3QoZSkpfSxJLnByb3RvdHlwZS5fdW5zdWJBbGxDb250YWN0RXZlbnRzRm9yQ29udGFjdD1mdW5jdGlvbihlKXt2YXIgbj10aGlzO3QudmFsdWVzKHQuQ29udGFjdEV2ZW50cykuZm9yRWFjaCgoZnVuY3Rpb24ocil7bi5idXMuZ2V0U3Vic2NyaXB0aW9ucyh0LmNvcmUuZ2V0Q29udGFjdEV2ZW50TmFtZShyLGUpKS5tYXAoKGZ1bmN0aW9uKGUpe2UudW5zdWJzY3JpYmUoKX0pKX0pKX0sdC5jb3JlLm9uVmlld0NvbnRhY3Q9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkNvbnRhY3RFdmVudHMuVklFVyxlKX0sdC5jb3JlLnZpZXdDb250YWN0PWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29udGFjdEV2ZW50cy5WSUVXLGRhdGE6e2NvbnRhY3RJZDplfX0pfSx0LmNvcmUub25BY3RpdmF0ZUNoYW5uZWxXaXRoVmlld1R5cGU9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkNoYW5uZWxWaWV3RXZlbnRzLkFDVElWQVRFX0NIQU5ORUxfV0lUSF9WSUVXX1RZUEUsZSl9LHQuY29yZS5hY3RpdmF0ZUNoYW5uZWxXaXRoVmlld1R5cGU9ZnVuY3Rpb24oZSxuLHIsbyl7Y29uc3QgaT17dmlld1R5cGU6ZSxtZWRpYVR5cGU6bn07ciYmKGkuc291cmNlPXIpLG8mJihpLmNhc2VJZD1vKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNoYW5uZWxWaWV3RXZlbnRzLkFDVElWQVRFX0NIQU5ORUxfV0lUSF9WSUVXX1RZUEUsZGF0YTppfSl9LHQuY29yZS50cmlnZ2VyVGFza0NyZWF0ZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkudXBzdHJlYW1CdXMudHJpZ2dlcih0LlRhc2tFdmVudHMuQ1JFQVRFRCxlKX0sdC5jb3JlLm9uQWNjZXNzRGVuaWVkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5FdmVudFR5cGUuQUNDRVNTX0RFTklFRCxlKX0sdC5jb3JlLm9uQXV0aEZhaWw9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5BVVRIX0ZBSUwsZSl9LHQuY29yZS5vbkF1dGhvcml6ZVN1Y2Nlc3M9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbSh0LkV2ZW50VHlwZS5BVVRIT1JJWkVfU1VDQ0VTUyxlKX0sdC5jb3JlLl9oYW5kbGVBdXRob3JpemVTdWNjZXNzPWZ1bmN0aW9uKCl7d2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odC5TZXNzaW9uU3RvcmFnZUtleXMuQVVUSE9SSVpFX1JFVFJZX0NPVU5ULDApfSx0LmNvcmUuX2hhbmRsZUF1dGhGYWlsPWZ1bmN0aW9uKGUsbixyKXtyJiZyLmF1dGhvcml6ZT90LmNvcmUuX2hhbmRsZUF1dGhvcml6ZUZhaWwoZSk6dC5jb3JlLl9oYW5kbGVDVElBdXRoRmFpbChuKX0sdC5jb3JlLl9oYW5kbGVBdXRob3JpemVGYWlsPWZ1bmN0aW9uKGUpe2xldCBuPXQuY29yZS5fZ2V0QXV0aFJldHJ5Q291bnQoKTtpZighdC5jb3JlLmF1dGhvcml6ZVRpbWVvdXRJZClpZihuPHQuY29yZS5NQVhfQVVUSE9SSVpFX1JFVFJZX0NPVU5UX0ZPUl9TRVNTSU9OKXt0LmNvcmUuX2luY3JlbWVudEF1dGhSZXRyeUNvdW50KCk7bGV0IHI9QVdTLnV0aWwuY2FsY3VsYXRlUmV0cnlEZWxheShuKzF8fDAse2Jhc2U6MmUzfSk7dC5jb3JlLmF1dGhvcml6ZVRpbWVvdXRJZD1zZXRUaW1lb3V0KCgoKT0+e3QuY29yZS5fcmVkaXJlY3RUb0xvZ2luKGUpfSkscil9ZWxzZSB0LmdldExvZygpLndhcm4oIldlIGhhdmUgZXhoYXVzdGVkIG91ciBhdXRob3JpemF0aW9uIHJldHJpZXMgZHVlIHRvIDQwMXMgZnJvbSB0aGUgYXV0aG9yaXplIGFwaS4gTm8gbW9yZSByZXRyaWVzIHdpbGwgYmUgYXR0ZW1wdGVkIGluIHRoaXMgc2Vzc2lvbiB1bnRpbCB0aGUgYXV0aG9yaXplIGFwaSByZXR1cm5zIDIwMC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIodC5FdmVudFR5cGUuQVVUSE9SSVpFX1JFVFJJRVNfRVhIQVVTVEVEKX0sdC5jb3JlLl9yZWRpcmVjdFRvTG9naW49ZnVuY3Rpb24oZSl7InN0cmluZyI9PXR5cGVvZiBlP2xvY2F0aW9uLmFzc2lnbihlKTpsb2NhdGlvbi5yZWxvYWQoKX0sdC5jb3JlLl9oYW5kbGVDVElBdXRoRmFpbD1mdW5jdGlvbihlKXtpZighdC5jb3JlLmN0aVRpbWVvdXRJZClpZih0LmNvcmUuY3RpQXV0aFJldHJ5Q291bnQ8dC5jb3JlLk1BWF9DVElfQVVUSF9SRVRSWV9DT1VOVCl7dC5jb3JlLmN0aUF1dGhSZXRyeUNvdW50Kys7bGV0IG49QVdTLnV0aWwuY2FsY3VsYXRlUmV0cnlEZWxheSh0LmNvcmUuY3RpQXV0aFJldHJ5Q291bnR8fDAse2Jhc2U6NTAwfSk7dC5jb3JlLmN0aVRpbWVvdXRJZD1zZXRUaW1lb3V0KCgoKT0+e3QuY29yZS5hdXRob3JpemUoZSkudGhlbih0LmNvcmUuX3RyaWdnZXJBdXRob3JpemVTdWNjZXNzLmJpbmQodC5jb3JlKSkuY2F0Y2godC5jb3JlLl90cmlnZ2VyQXV0aEZhaWwuYmluZCh0LmNvcmUse2F1dGhvcml6ZTohMH0pKSx0LmNvcmUuY3RpVGltZW91dElkPW51bGx9KSxuKX1lbHNlIHQuZ2V0TG9nKCkud2FybigiV2UgaGF2ZSBleGhhdXN0ZWQgb3VyIGF1dGhvcml6YXRpb24gcmV0cmllcyBkdWUgdG8gNDAxcyBmcm9tIHRoZSBDVEkgc2VydmljZS4gTm8gbW9yZSByZXRyaWVzIHdpbGwgYmUgYXR0ZW1wdGVkIHVudGlsIHRoZSBwYWdlIGlzIHJlZnJlc2hlZC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIodC5FdmVudFR5cGUuQ1RJX0FVVEhPUklaRV9SRVRSSUVTX0VYSEFVU1RFRCl9LHQuY29yZS5fdHJpZ2dlckF1dGhvcml6ZVN1Y2Nlc3M9ZnVuY3Rpb24oKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS51cHN0cmVhbUJ1cy50cmlnZ2VyKHQuRXZlbnRUeXBlLkFVVEhPUklaRV9TVUNDRVNTKX0sdC5jb3JlLl90cmlnZ2VyQXV0aEZhaWw9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkudXBzdHJlYW1CdXMudHJpZ2dlcih0LkV2ZW50VHlwZS5BVVRIX0ZBSUwsZSl9LHQuY29yZS5fZ2V0QXV0aFJldHJ5Q291bnQ9ZnVuY3Rpb24oKXtsZXQgZT13aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0LlNlc3Npb25TdG9yYWdlS2V5cy5BVVRIT1JJWkVfUkVUUllfQ09VTlQpO2lmKG51bGwhPT1lKXtpZihpc05hTihwYXJzZUludChlKSkpdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiVGhlIHNlc3Npb24gc3RvcmFnZSB2YWx1ZSBmb3IgYXV0aCByZXRyeSBjb3VudCB3YXMgTmFOIik7cmV0dXJuIHBhcnNlSW50KGUpfXJldHVybiB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0LlNlc3Npb25TdG9yYWdlS2V5cy5BVVRIT1JJWkVfUkVUUllfQ09VTlQsMCksMH0sdC5jb3JlLl9pbmNyZW1lbnRBdXRoUmV0cnlDb3VudD1mdW5jdGlvbigpe3dpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHQuU2Vzc2lvblN0b3JhZ2VLZXlzLkFVVEhPUklaRV9SRVRSWV9DT1VOVCwodC5jb3JlLl9nZXRBdXRoUmV0cnlDb3VudCgpKzEpLnRvU3RyaW5nKCkpfSx0LmNvcmUub25BdXRob3JpemVSZXRyaWVzRXhoYXVzdGVkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkV2ZW50VHlwZS5BVVRIT1JJWkVfUkVUUklFU19FWEhBVVNURUQsZSl9LHQuY29yZS5vbkNUSUF1dGhvcml6ZVJldHJpZXNFeGhhdXN0ZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLkNUSV9BVVRIT1JJWkVfUkVUUklFU19FWEhBVVNURUQsZSl9LHQuY29yZS5vblNvZnRwaG9uZVNlc3Npb25Jbml0PWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5Db25uZWN0aW9uRXZlbnRzLlNFU1NJT05fSU5JVCxlKX0sdC5jb3JlLm9uQ29uZmlndXJlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0odC5Db25maWd1cmF0aW9uRXZlbnRzLkNPTkZJR1VSRSxlKX0sdC5jb3JlLm9uSW5pdGlhbGl6ZWQ9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLklOSVQsZSl9LHQuY29yZS5nZXRDb250YWN0RXZlbnROYW1lPWZ1bmN0aW9uKGUsbil7aWYodC5hc3NlcnROb3ROdWxsKGUsImV2ZW50TmFtZSIpLHQuYXNzZXJ0Tm90TnVsbChuLCJjb250YWN0SWQiKSwhdC5jb250YWlucyh0LnZhbHVlcyh0LkNvbnRhY3RFdmVudHMpLGUpKXRocm93IG5ldyB0LlZhbHVlRXJyb3IoIiVzIGlzIG5vdCBhIHZhbGlkIGNvbnRhY3QgZXZlbnQuIixlKTtyZXR1cm4gdC5zcHJpbnRmKCIlczo6JXMiLGUsbil9LHQuY29yZS5nZXRFdmVudEJ1cz1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZXZlbnRCdXN9LHQuY29yZS5nZXRXZWJTb2NrZXRNYW5hZ2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS53ZWJTb2NrZXRQcm92aWRlcn0sdC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5hZ2VudERhdGFQcm92aWRlcn0sdC5jb3JlLmdldExvY2FsVGltZXN0YW1wPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEFnZW50RGF0YSgpLnNuYXBzaG90LmxvY2FsVGltZXN0YW1wfSx0LmNvcmUuZ2V0U2tldz1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRBZ2VudERhdGEoKS5zbmFwc2hvdC5za2V3fSx0LmNvcmUuZ2V0QWdlbnRSb3V0aW5nRXZlbnRHcmFwaD1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuYWdlbnRSb3V0aW5nRXZlbnRHcmFwaH0sdC5jb3JlLmFnZW50Um91dGluZ0V2ZW50R3JhcGg9KG5ldyB0LkV2ZW50R3JhcGgpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC5BZ2VudFN0YXRlVHlwZS5ST1VUQUJMRSx0LkFnZW50RXZlbnRzLlJPVVRBQkxFKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQuQWdlbnRTdGF0ZVR5cGUuTk9UX1JPVVRBQkxFLHQuQWdlbnRFdmVudHMuTk9UX1JPVVRBQkxFKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQuQWdlbnRTdGF0ZVR5cGUuT0ZGTElORSx0LkFnZW50RXZlbnRzLk9GRkxJTkUpLHQuY29yZS5nZXRBZ2VudFN0YXRlRXZlbnRHcmFwaD1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuYWdlbnRTdGF0ZUV2ZW50R3JhcGh9LHQuY29yZS5hZ2VudFN0YXRlRXZlbnRHcmFwaD0obmV3IHQuRXZlbnRHcmFwaCkuYXNzb2ModC5FdmVudEdyYXBoLkFOWSx0LnZhbHVlcyh0LkFnZW50RXJyb3JTdGF0ZXMpLHQuQWdlbnRFdmVudHMuRVJST1IpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC5BZ2VudEF2YWlsU3RhdGVzLkFGVEVSX0NBTExfV09SSyx0LkFnZW50RXZlbnRzLkFDVyksdC5jb3JlLmdldENvbnRhY3RFdmVudEdyYXBoPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5jb250YWN0RXZlbnRHcmFwaH0sdC5jb3JlLmNvbnRhY3RFdmVudEdyYXBoPShuZXcgdC5FdmVudEdyYXBoKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQuQ29udGFjdFN0YXRlVHlwZS5JTkNPTUlORyx0LkNvbnRhY3RFdmVudHMuSU5DT01JTkcpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC5Db250YWN0U3RhdGVUeXBlLlBFTkRJTkcsdC5Db250YWN0RXZlbnRzLlBFTkRJTkcpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC5Db250YWN0U3RhdGVUeXBlLkNPTk5FQ1RJTkcsdC5Db250YWN0RXZlbnRzLkNPTk5FQ1RJTkcpLmFzc29jKHQuRXZlbnRHcmFwaC5BTlksdC5Db250YWN0U3RhdGVUeXBlLkNPTk5FQ1RFRCx0LkNvbnRhY3RFdmVudHMuQ09OTkVDVEVEKS5hc3NvYyh0LkNvbnRhY3RTdGF0ZVR5cGUuQ09OTkVDVElORyx0LkNvbnRhY3RTdGF0ZVR5cGUuRVJST1IsdC5Db250YWN0RXZlbnRzLk1JU1NFRCkuYXNzb2ModC5Db250YWN0U3RhdGVUeXBlLklOQ09NSU5HLHQuQ29udGFjdFN0YXRlVHlwZS5FUlJPUix0LkNvbnRhY3RFdmVudHMuTUlTU0VEKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQuQ29udGFjdFN0YXRlVHlwZS5FTkRFRCx0LkNvbnRhY3RFdmVudHMuQUNXKS5hc3NvYyh0LnZhbHVlcyh0LkNPTlRBQ1RfQUNUSVZFX1NUQVRFUyksdC52YWx1ZXModC5yZWxhdGl2ZUNvbXBsZW1lbnQodC5DT05UQUNUX0FDVElWRV9TVEFURVMsdC5Db250YWN0U3RhdGVUeXBlKSksdC5Db250YWN0RXZlbnRzLkVOREVEKS5hc3NvYyh0LkV2ZW50R3JhcGguQU5ZLHQuQ29udGFjdFN0YXRlVHlwZS5FUlJPUix0LkNvbnRhY3RFdmVudHMuRVJST1IpLmFzc29jKHQuQ29udGFjdFN0YXRlVHlwZS5DT05ORUNUSU5HLHQuQ29udGFjdFN0YXRlVHlwZS5NSVNTRUQsdC5Db250YWN0RXZlbnRzLk1JU1NFRCksdC5jb3JlLmdldENsaWVudD1mdW5jdGlvbigpe2lmKCF0LmNvcmUuY2xpZW50KXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIlRoZSBjb25uZWN0IGNvcmUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkISIpO3JldHVybiB0LmNvcmUuY2xpZW50fSx0LmNvcmUuY2xpZW50PW51bGwsdC5jb3JlLmdldEFnZW50QXBwQ2xpZW50PWZ1bmN0aW9uKCl7aWYoIXQuY29yZS5hZ2VudEFwcENsaWVudCl0aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJUaGUgY29ubmVjdCBBZ2VudEFwcCBDbGllbnQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkISIpO3JldHVybiB0LmNvcmUuYWdlbnRBcHBDbGllbnR9LHQuY29yZS5hZ2VudEFwcENsaWVudD1udWxsLHQuY29yZS5nZXRUYXNrVGVtcGxhdGVzQ2xpZW50PWZ1bmN0aW9uKCl7aWYoIXQuY29yZS50YXNrVGVtcGxhdGVzQ2xpZW50KXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIlRoZSBjb25uZWN0IFRhc2tUZW1wbGF0ZXMgQ2xpZW50IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCEiKTtyZXR1cm4gdC5jb3JlLnRhc2tUZW1wbGF0ZXNDbGllbnR9LHQuY29yZS50YXNrVGVtcGxhdGVzQ2xpZW50PW51bGwsdC5jb3JlLmdldE1hc3RlckNsaWVudD1mdW5jdGlvbigpe2lmKCF0LmNvcmUubWFzdGVyQ2xpZW50KXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIlRoZSBjb25uZWN0IG1hc3RlciBjbGllbnQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkISIpO3JldHVybiB0LmNvcmUubWFzdGVyQ2xpZW50fSx0LmNvcmUubWFzdGVyQ2xpZW50PW51bGwsdC5jb3JlLmdldFNvZnRwaG9uZU1hbmFnZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLnNvZnRwaG9uZU1hbmFnZXJ9LHQuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyPW51bGwsdC5jb3JlLmdldE5vdGlmaWNhdGlvbk1hbmFnZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLm5vdGlmaWNhdGlvbk1hbmFnZXJ8fCh0LmNvcmUubm90aWZpY2F0aW9uTWFuYWdlcj1uZXcgdC5Ob3RpZmljYXRpb25NYW5hZ2VyKSx0LmNvcmUubm90aWZpY2F0aW9uTWFuYWdlcn0sdC5jb3JlLm5vdGlmaWNhdGlvbk1hbmFnZXI9bnVsbCx0LmNvcmUuZ2V0UG9wdXBNYW5hZ2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5wb3B1cE1hbmFnZXJ9LHQuY29yZS5wb3B1cE1hbmFnZXI9bmV3IHQuUG9wdXBNYW5hZ2VyLHQuY29yZS5nZXRVcHN0cmVhbT1mdW5jdGlvbigpe2lmKCF0LmNvcmUudXBzdHJlYW0pdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiVGhlcmUgaXMgbm8gdXBzdHJlYW0gY29uZHVpdCEiKTtyZXR1cm4gdC5jb3JlLnVwc3RyZWFtfSx0LmNvcmUudXBzdHJlYW09bnVsbCx0LmNvcmUuQWdlbnREYXRhUHJvdmlkZXI9SX0oKX0sNTkyOigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQ7dmFyIG49Ijw8YWxsPj4iLHI9dC5tYWtlRW51bShbImFja25vd2xlZGdlIiwiYWNrX3RpbWVvdXQiLCJpbml0IiwiYXBpX3JlcXVlc3QiLCJhcGlfcmVzcG9uc2UiLCJhdXRoX2ZhaWwiLCJhY2Nlc3NfZGVuaWVkIiwiY2xvc2UiLCJjb25maWd1cmUiLCJsb2ciLCJtYXN0ZXJfcmVxdWVzdCIsIm1hc3Rlcl9yZXNwb25zZSIsInN5bmNocm9uaXplIiwidGVybWluYXRlIiwidGVybWluYXRlZCIsInNlbmRfbG9ncyIsInJlbG9hZF9hZ2VudF9jb25maWd1cmF0aW9uIiwiYnJvYWRjYXN0IiwiYXBpX21ldHJpYyIsImNsaWVudF9tZXRyaWMiLCJzb2Z0cGhvbmVfc3RhdHMiLCJzb2Z0cGhvbmVfcmVwb3J0IiwiY2xpZW50X3NpZGVfbG9ncyIsInNlcnZlcl9ib3VuZF9pbnRlcm5hbF9sb2ciLCJtdXRlIiwiaWZyYW1lX3N0eWxlIiwiaWZyYW1lX3JldHJpZXNfZXhoYXVzdGVkIiwidXBkYXRlX2Nvbm5lY3RlZF9jY3BzIiwib3V0ZXJfY29udGV4dF9pbmZvIiwibWVkaWFfZGV2aWNlX3JlcXVlc3QiLCJtZWRpYV9kZXZpY2VfcmVzcG9uc2UiLCJ0YWJfaWQiLCJhdXRob3JpemVfc3VjY2VzcyIsImF1dGhvcml6ZV9yZXRyaWVzX2V4aGF1c3RlZCIsImN0aV9hdXRob3JpemVfcmV0cmllc19leGhhdXN0ZWQiLCJjbGlja19zdHJlYW1fZGF0YSJdKSxvPXQubWFrZU5hbWVzcGFjZWRFbnVtKCJjb25uZWN0IixbImxvZ2luUG9wdXAiLCJzZW5kTG9ncyIsInNvZnRwaG9uZSIsInJpbmd0b25lIiwibWV0cmljcyIsImZhaWxvdmVyIl0pLGk9dC5tYWtlTmFtZXNwYWNlZEVudW0oImFnZW50IixbImluaXQiLCJ1cGRhdGUiLCJyZWZyZXNoIiwicm91dGFibGUiLCJub3Rfcm91dGFibGUiLCJwZW5kaW5nIiwiY29udGFjdF9wZW5kaW5nIiwib2ZmbGluZSIsImVycm9yIiwic29mdHBob25lX2Vycm9yIiwid2Vic29ja2V0X2Nvbm5lY3Rpb25fbG9zdCIsIndlYnNvY2tldF9jb25uZWN0aW9uX2dhaW5lZCIsInN0YXRlX2NoYW5nZSIsImFjdyIsIm11dGVfdG9nZ2xlIiwibG9jYWxfbWVkaWFfc3RyZWFtX2NyZWF0ZWQiLCJlbnF1ZXVlZF9uZXh0X3N0YXRlIl0pLHM9dC5tYWtlTmFtZXNwYWNlZEVudW0oIndlYlNvY2tldCIsWyJpbml0X2ZhaWx1cmUiLCJjb25uZWN0aW9uX29wZW4iLCJjb25uZWN0aW9uX2Nsb3NlIiwiY29ubmVjdGlvbl9lcnJvciIsImNvbm5lY3Rpb25fZ2FpbiIsImNvbm5lY3Rpb25fbG9zdCIsInN1YnNjcmlwdGlvbl91cGRhdGUiLCJzdWJzY3JpcHRpb25fZmFpbHVyZSIsImFsbF9tZXNzYWdlIiwic2VuZCIsInN1YnNjcmliZSJdKSxhPXQubWFrZU5hbWVzcGFjZWRFbnVtKCJjb250YWN0IixbImluaXQiLCJyZWZyZXNoIiwiZGVzdHJveWVkIiwiaW5jb21pbmciLCJwZW5kaW5nIiwiY29ubmVjdGluZyIsImNvbm5lY3RlZCIsIm1pc3NlZCIsImFjdyIsInZpZXciLCJlbmRlZCIsImVycm9yIiwiYWNjZXB0ZWQiXSksYz10Lm1ha2VOYW1lc3BhY2VkRW51bSgidGFza0xpc3QiLFsiYWN0aXZhdGVfY2hhbm5lbF93aXRoX3ZpZXdfdHlwZSJdKSx1PXQubWFrZU5hbWVzcGFjZWRFbnVtKCJ0YXNrIixbImNyZWF0ZWQiXSksbD10Lm1ha2VOYW1lc3BhY2VkRW51bSgiY29ubmVjdGlvbiIsWyJzZXNzaW9uX2luaXQiLCJyZWFkeV90b19zdGFydF9zZXNzaW9uIl0pLHA9dC5tYWtlTmFtZXNwYWNlZEVudW0oImNvbmZpZ3VyYXRpb24iLFsiY29uZmlndXJlIiwic2V0X3NwZWFrZXJfZGV2aWNlIiwic2V0X21pY3JvcGhvbmVfZGV2aWNlIiwic2V0X3Jpbmdlcl9kZXZpY2UiLCJzcGVha2VyX2RldmljZV9jaGFuZ2VkIiwibWljcm9waG9uZV9kZXZpY2VfY2hhbmdlZCIsInJpbmdlcl9kZXZpY2VfY2hhbmdlZCJdKSxkPXQubWFrZU5hbWVzcGFjZWRFbnVtKCJkaXNhc3RlclJlY292ZXJ5IixbInN1cHByZXNzIiwiZm9yY2Vfb2ZmbGluZSIsInNldF9vZmZsaW5lIiwiaW5pdF9kaXNhc3Rlcl9yZWNvdmVyeSIsImZhaWxvdmVyIiwiZmFpbG92ZXJfcGVuZGluZyIsImluaXRfZHJfcG9sbGluZyJdKSxoPXQubWFrZU5hbWVzcGFjZWRFbnVtKCJ2b2ljZUlkIixbInVwZGF0ZV9kb21haW5faWQiXSksZj1mdW5jdGlvbigpe307Zi5jcmVhdGVSZXF1ZXN0PWZ1bmN0aW9uKGUsbixyKXtyZXR1cm57ZXZlbnQ6ZSxyZXF1ZXN0SWQ6dC5yYW5kb21JZCgpLG1ldGhvZDpuLHBhcmFtczpyfX0sZi5jcmVhdGVSZXNwb25zZT1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm57ZXZlbnQ6ZSxyZXF1ZXN0SWQ6dC5yZXF1ZXN0SWQsZGF0YTpuLGVycjpyfHxudWxsfX07dmFyIGc9ZnVuY3Rpb24oZSxuLHIpe3RoaXMuc3ViTWFwPWUsdGhpcy5pZD10LnJhbmRvbUlkKCksdGhpcy5ldmVudE5hbWU9bix0aGlzLmY9cn07Zy5wcm90b3R5cGUudW5zdWJzY3JpYmU9ZnVuY3Rpb24oKXt0aGlzLnN1Yk1hcC51bnN1YnNjcmliZSh0aGlzLmV2ZW50TmFtZSx0aGlzLmlkKX07dmFyIG09ZnVuY3Rpb24oKXt0aGlzLnN1YklkTWFwPXt9LHRoaXMuc3ViRXZlbnROYW1lTWFwPXt9fTttLnByb3RvdHlwZS5zdWJzY3JpYmU9ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgZyh0aGlzLGUsdCk7dGhpcy5zdWJJZE1hcFtuLmlkXT1uO3ZhciByPXRoaXMuc3ViRXZlbnROYW1lTWFwW2VdfHxbXTtyZXR1cm4gci5wdXNoKG4pLHRoaXMuc3ViRXZlbnROYW1lTWFwW2VdPXIsbn0sbS5wcm90b3R5cGUudW5zdWJzY3JpYmU9ZnVuY3Rpb24oZSxuKXt0LmNvbnRhaW5zKHRoaXMuc3ViRXZlbnROYW1lTWFwLGUpJiYodGhpcy5zdWJFdmVudE5hbWVNYXBbZV09dGhpcy5zdWJFdmVudE5hbWVNYXBbZV0uZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZS5pZCE9PW59KSksdGhpcy5zdWJFdmVudE5hbWVNYXBbZV0ubGVuZ3RoPDEmJmRlbGV0ZSB0aGlzLnN1YkV2ZW50TmFtZU1hcFtlXSksdC5jb250YWlucyh0aGlzLnN1YklkTWFwLG4pJiZkZWxldGUgdGhpcy5zdWJJZE1hcFtuXX0sbS5wcm90b3R5cGUuZ2V0QWxsU3Vic2NyaXB0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0LnZhbHVlcyh0aGlzLnN1YkV2ZW50TmFtZU1hcCkucmVkdWNlKChmdW5jdGlvbihlLHQpe3JldHVybiBlLmNvbmNhdCh0KX0pLFtdKX0sbS5wcm90b3R5cGUuZ2V0U3Vic2NyaXB0aW9ucz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zdWJFdmVudE5hbWVNYXBbZV18fFtdfTt2YXIgdj1mdW5jdGlvbihlKXt2YXIgdD1lfHx7fTt0aGlzLnN1Yk1hcD1uZXcgbSx0aGlzLmxvZ0V2ZW50cz10LmxvZ0V2ZW50c3x8ITF9O3YucHJvdG90eXBlLnN1YnNjcmliZT1mdW5jdGlvbihlLG4pe3JldHVybiB0LmFzc2VydE5vdE51bGwoZSwiZXZlbnROYW1lIiksdC5hc3NlcnROb3ROdWxsKG4sImYiKSx0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJmIG11c3QgYmUgYSBmdW5jdGlvbiIpLHRoaXMuc3ViTWFwLnN1YnNjcmliZShlLG4pfSx2LnByb3RvdHlwZS5zdWJzY3JpYmVBbGw9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChlLCJmIiksdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihlKSwiZiBtdXN0IGJlIGEgZnVuY3Rpb24iKSx0aGlzLnN1Yk1hcC5zdWJzY3JpYmUobixlKX0sdi5wcm90b3R5cGUuZ2V0U3Vic2NyaXB0aW9ucz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zdWJNYXAuZ2V0U3Vic2NyaXB0aW9ucyhlKX0sdi5wcm90b3R5cGUudHJpZ2dlcj1mdW5jdGlvbihlLHIpe3QuYXNzZXJ0Tm90TnVsbChlLCJldmVudE5hbWUiKTt2YXIgbz10aGlzLGk9dGhpcy5zdWJNYXAuZ2V0U3Vic2NyaXB0aW9ucyhuKSxzPXRoaXMuc3ViTWFwLmdldFN1YnNjcmlwdGlvbnMoZSk7dGhpcy5sb2dFdmVudHMmJmUhPT10LkV2ZW50VHlwZS5MT0cmJmUhPT10LkV2ZW50VHlwZS5NQVNURVJfUkVTUE9OU0UmJmUhPT10LkV2ZW50VHlwZS5BUElfTUVUUklDJiZlIT09dC5FdmVudFR5cGUuU0VSVkVSX0JPVU5EX0lOVEVSTkFMX0xPRyYmdC5nZXRMb2coKS50cmFjZSgiUHVibGlzaGluZyBldmVudDogJXMiLGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksZS5zdGFydHNXaXRoKHQuQ29udGFjdEV2ZW50cy5BQ0NFUFRFRCkmJnImJnIuY29udGFjdElkJiYhKHIgaW5zdGFuY2VvZiB0LkNvbnRhY3QpJiYocj1uZXcgdC5Db250YWN0KHIuY29udGFjdElkKSksaS5jb25jYXQocykuZm9yRWFjaCgoZnVuY3Rpb24obil7dHJ5e24uZihyfHxudWxsLGUsbyl9Y2F0Y2gobil7dC5nZXRMb2coKS5lcnJvcigiJyVzJyBldmVudCBoYW5kbGVyIGZhaWxlZC4iLGUpLndpdGhFeGNlcHRpb24obikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19KSl9LHYucHJvdG90eXBlLmJyaWRnZT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIGZ1bmN0aW9uKHQsbil7ZS50cmlnZ2VyKG4sdCl9fSx2LnByb3RvdHlwZS51bnN1YnNjcmliZUFsbD1mdW5jdGlvbigpe3RoaXMuc3ViTWFwLmdldEFsbFN1YnNjcmlwdGlvbnMoKS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLnVuc3Vic2NyaWJlKCl9KSl9LHQuRXZlbnRCdXM9dix0LkV2ZW50RmFjdG9yeT1mLHQuRXZlbnRUeXBlPXIsdC5BZ2VudEV2ZW50cz1pLHQuQ29uZmlndXJhdGlvbkV2ZW50cz1wLHQuQ29ubmVjdGlvbkV2ZW50cz1sLHQuQ29ubm5lY3Rpb25FdmVudHM9bCx0LkNvbnRhY3RFdmVudHM9YSx0LkNoYW5uZWxWaWV3RXZlbnRzPWMsdC5UYXNrRXZlbnRzPXUsdC5Wb2ljZUlkRXZlbnRzPWgsdC5XZWJTb2NrZXRFdmVudHM9cyx0Lk1hc3RlclRvcGljcz1vLHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cz1kfSgpfSwyODY6KCk9PnshZnVuY3Rpb24oZSl7dmFyIHQ9e307ZnVuY3Rpb24gbihyKXtpZih0W3JdKXJldHVybiB0W3JdLmV4cG9ydHM7dmFyIG89dFtyXT17aTpyLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIGVbcl0uY2FsbChvLmV4cG9ydHMsbyxvLmV4cG9ydHMsbiksby5sPSEwLG8uZXhwb3J0c31uLm09ZSxuLmM9dCxuLmQ9ZnVuY3Rpb24oZSx0LHIpe24ubyhlLHQpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtlbnVtZXJhYmxlOiEwLGdldDpyfSl9LG4ucj1mdW5jdGlvbihlKXsidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnRvU3RyaW5nVGFnJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOiJNb2R1bGUifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSxuLnQ9ZnVuY3Rpb24oZSx0KXtpZigxJnQmJihlPW4oZSkpLDgmdClyZXR1cm4gZTtpZig0JnQmJiJvYmplY3QiPT10eXBlb2YgZSYmZSYmZS5fX2VzTW9kdWxlKXJldHVybiBlO3ZhciByPU9iamVjdC5jcmVhdGUobnVsbCk7aWYobi5yKHIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJkZWZhdWx0Iix7ZW51bWVyYWJsZTohMCx2YWx1ZTplfSksMiZ0JiYic3RyaW5nIiE9dHlwZW9mIGUpZm9yKHZhciBvIGluIGUpbi5kKHIsbyxmdW5jdGlvbih0KXtyZXR1cm4gZVt0XX0uYmluZChudWxsLG8pKTtyZXR1cm4gcn0sbi5uPWZ1bmN0aW9uKGUpe3ZhciB0PWUmJmUuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiBlLmRlZmF1bHR9OmZ1bmN0aW9uKCl7cmV0dXJuIGV9O3JldHVybiBuLmQodCwiYSIsdCksdH0sbi5vPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfSxuLnA9IiIsbihuLnM9Mil9KFtmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMSksbz0iREVCVUciLGk9IkFNWl9XRUJfU09DS0VUX01BTkFHRVI6IixzPSJOZXR3b3JrIG9mZmxpbmUiLGE9Ik5ldHdvcmsgb25saW5lLCBjb25uZWN0aW5nIHRvIFdlYlNvY2tldCBzZXJ2ZXIiLGM9Ik5ldHdvcmsgb2ZmbGluZSwgaWdub3JpbmcgdGhpcyBnZXRXZWJTb2NrZXRDb25uQ29uZmlnIHJlcXVlc3QiLHU9IkhlYXJ0YmVhdCByZXNwb25zZSBub3QgcmVjZWl2ZWQiLGw9IkZhaWxlZCB0byBzZW5kIGhlYXJ0YmVhdCBzaW5jZSBXZWJTb2NrZXQgaXMgbm90IG9wZW4iLHA9IldlYlNvY2tldCBjb25uZWN0aW9uIGVzdGFibGlzaGVkISIsZD0iV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgY2xvc2VkIixoPSJXZWJTb2NrZXRNYW5hZ2VyIEVycm9yLCBlcnJvcl9ldmVudDogIixmPSJTY2hlZHVsaW5nIFdlYlNvY2tldCByZWluaXRpYWxpemF0aW9uLCBhZnRlciBkZWxheSAiLGc9IldlYlNvY2tldCBVUkwgY2Fubm90IGJlIHVzZWQgdG8gZXN0YWJsaXNoIGNvbm5lY3Rpb24iLG09IldlYlNvY2tldCBJbml0aWFsaXphdGlvbiBmYWlsZWQgLSBUZXJtaW5hdGluZyBhbmQgY2xlYW5pbmcgc3Vic2NyaXB0aW9ucyIsdj0iRmV0Y2hpbmcgbmV3IFdlYlNvY2tldCBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24iLHk9IlN1Y2Nlc3NmdWxseSBmZXRjaGVkIHdlYlNvY2tldCBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24iLEU9IkZhaWxlZCB0byBmZXRjaCB3ZWJTb2NrZXQgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uIixTPSJSZXRyeWluZyBmZXRjaGluZyBuZXcgV2ViU29ja2V0IGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbiIsYj0iSW5pdGlhbGl6aW5nIFdlYnNvY2tldCBNYW5hZ2VyIixUPSJXZWJTb2NrZXRNYW5hZ2VyIE1lc3NhZ2UgRXJyb3IiLEM9Ik1lc3NhZ2UgcmVjZWl2ZWQgZm9yIHRvcGljICIsST0iSW52YWxpZCBpbmNvbWluZyBtZXNzYWdlIixBPSJhd3Mvc3Vic2NyaWJlIixfPSJhd3MvaGVhcnRiZWF0Iix3PSJkaXNjb25uZWN0ZWQiO2Z1bmN0aW9uIFIoZSl7cmV0dXJuKFI9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9KShlKX12YXIgaz17YXNzZXJ0VHJ1ZTpmdW5jdGlvbihlLHQpe2lmKCFlKXRocm93IG5ldyBFcnJvcih0KX0sYXNzZXJ0Tm90TnVsbDpmdW5jdGlvbihlLHQpe3JldHVybiBrLmFzc2VydFRydWUobnVsbCE9PWUmJnZvaWQgMCE9PVIoZSksT2JqZWN0KHIuc3ByaW50ZikoIiVzIG11c3QgYmUgcHJvdmlkZWQiLHR8fCJBIHZhbHVlIikpLGV9LGlzTm9uRW1wdHlTdHJpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlJiZlLmxlbmd0aD4wfSxhc3NlcnRJc0xpc3Q6ZnVuY3Rpb24oZSx0KXtpZighQXJyYXkuaXNBcnJheShlKSl0aHJvdyBuZXcgRXJyb3IodCsiIGlzIG5vdCBhbiBhcnJheSIpfSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiEhKGUmJmUuY29uc3RydWN0b3ImJmUuY2FsbCYmZS5hcHBseSl9LGlzT2JqZWN0OmZ1bmN0aW9uKGUpe3JldHVybiEoIm9iamVjdCIhPT1SKGUpfHxudWxsPT09ZSl9LGlzU3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZX0saXNOdW1iZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlfX0sTD1uZXcgUmVnRXhwKCJeKHdzczovLylcXHcqIik7ay52YWxpZFdTVXJsPWZ1bmN0aW9uKGUpe3JldHVybiBMLnRlc3QoZSl9LGsuZ2V0U3Vic2NyaXB0aW9uUmVzcG9uc2U9ZnVuY3Rpb24oZSx0LG4pe3JldHVybnt0b3BpYzplLGNvbnRlbnQ6e3N0YXR1czp0PyJzdWNjZXNzIjoiZmFpbHVyZSIsdG9waWNzOm59fX0say5hc3NlcnRJc09iamVjdD1mdW5jdGlvbihlLHQpe2lmKCFrLmlzT2JqZWN0KGUpKXRocm93IG5ldyBFcnJvcih0KyIgaXMgbm90IGFuIG9iamVjdCEiKX0say5hZGRKaXR0ZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjE7dD1NYXRoLm1pbih0LDEpO3ZhciBuPU1hdGgucmFuZG9tKCk+LjU/MTotMTtyZXR1cm4gTWF0aC5mbG9vcihlK24qZSpNYXRoLnJhbmRvbSgpKnQpfSxrLmlzTmV0d29ya09ubGluZT1mdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3Iub25MaW5lfSxrLmlzTmV0d29ya0ZhaWx1cmU9ZnVuY3Rpb24oZSl7cmV0dXJuISghZS5fZGVidWd8fCFlLl9kZWJ1Zy50eXBlKSYmIk5ldHdvcmtpbmdFcnJvciI9PT1lLl9kZWJ1Zy50eXBlfTt2YXIgTj1rO2Z1bmN0aW9uIE8oZSl7cmV0dXJuKE89T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbihlKXtyZXR1cm4gZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKX0pKGUpfWZ1bmN0aW9uIEQoZSx0KXtyZXR1cm4oRD1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuX19wcm90b19fPXQsZX0pKGUsdCl9ZnVuY3Rpb24gUChlKXtyZXR1cm4oUD0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3JldHVybiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZlLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZlIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgZX0pKGUpfWZ1bmN0aW9uIHgoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBNKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19ZnVuY3Rpb24gVShlLHQsbil7cmV0dXJuIHQmJk0oZS5wcm90b3R5cGUsdCksbiYmTShlLG4pLGV9dmFyIEY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7eCh0aGlzLGUpfXJldHVybiBVKGUsW3trZXk6ImRlYnVnIix2YWx1ZTpmdW5jdGlvbihlKXt9fSx7a2V5OiJpbmZvIix2YWx1ZTpmdW5jdGlvbihlKXt9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbihlKXt9fSx7a2V5OiJlcnJvciIsdmFsdWU6ZnVuY3Rpb24oZSl7fX0se2tleToiYWR2YW5jZWRMb2ciLHZhbHVlOmZ1bmN0aW9uKGUpe319XSksZX0oKSxxPWksQj17REVCVUc6MTAsSU5GTzoyMCxXQVJOOjMwLEVSUk9SOjQwLEFEVkFOQ0VEX0xPRzo1MH0saj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt4KHRoaXMsZSksdGhpcy51cGRhdGVMb2dnZXJDb25maWcoKSx0aGlzLmNvbnNvbGVMb2dnZXJXcmFwcGVyPUgoKX1yZXR1cm4gVShlLFt7a2V5OiJ3cml0ZVRvQ2xpZW50TG9nZ2VyIix2YWx1ZTpmdW5jdGlvbihlLHQpe2lmKHRoaXMuaGFzQ2xpZW50TG9nZ2VyKCkpc3dpdGNoKGUpe2Nhc2UgQi5ERUJVRzpyZXR1cm4gdGhpcy5fY2xpZW50TG9nZ2VyLmRlYnVnKHQpfHx0O2Nhc2UgQi5JTkZPOnJldHVybiB0aGlzLl9jbGllbnRMb2dnZXIuaW5mbyh0KXx8dDtjYXNlIEIuV0FSTjpyZXR1cm4gdGhpcy5fY2xpZW50TG9nZ2VyLndhcm4odCl8fHQ7Y2FzZSBCLkVSUk9SOnJldHVybiB0aGlzLl9jbGllbnRMb2dnZXIuZXJyb3IodCl8fHQ7Y2FzZSBCLkFEVkFOQ0VEX0xPRzpyZXR1cm4gdGhpcy5fYWR2YW5jZWRMb2dXcml0ZXI/dGhpcy5fY2xpZW50TG9nZ2VyW3RoaXMuX2FkdmFuY2VkTG9nV3JpdGVyXSh0KXx8dDoiIn19fSx7a2V5OiJpc0xldmVsRW5hYmxlZCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PXRoaXMuX2xldmVsfX0se2tleToiaGFzQ2xpZW50TG9nZ2VyIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBudWxsIT09dGhpcy5fY2xpZW50TG9nZ2VyfX0se2tleToiZ2V0TG9nZ2VyIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1lLnByZWZpeHx8cTtyZXR1cm4gdGhpcy5fbG9nc0Rlc3RpbmF0aW9uPT09bz90aGlzLmNvbnNvbGVMb2dnZXJXcmFwcGVyOm5ldyBXKHQpfX0se2tleToidXBkYXRlTG9nZ2VyQ29uZmlnIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1lfHx7fTt0aGlzLl9sZXZlbD10LmxldmVsfHxCLklORk8sdGhpcy5fYWR2YW5jZWRMb2dXcml0ZXI9Indhcm4iLHQuYWR2YW5jZWRMb2dXcml0ZXImJih0aGlzLl9hZHZhbmNlZExvZ1dyaXRlcj10LmFkdmFuY2VkTG9nV3JpdGVyKSx0LmN1c3RvbWl6ZWRMb2dnZXImJiJvYmplY3QiPT09UCh0LmN1c3RvbWl6ZWRMb2dnZXIpJiYodGhpcy51c2VDbGllbnRMb2dnZXI9ITApLHRoaXMuX2NsaWVudExvZ2dlcj10LmxvZ2dlcnx8dGhpcy5zZWxlY3RMb2dnZXIodCksdGhpcy5fbG9nc0Rlc3RpbmF0aW9uPSJOVUxMIix0LmRlYnVnJiYodGhpcy5fbG9nc0Rlc3RpbmF0aW9uPW8pLHQubG9nZ2VyJiYodGhpcy5fbG9nc0Rlc3RpbmF0aW9uPSJDTElFTlRfTE9HR0VSIil9fSx7a2V5OiJzZWxlY3RMb2dnZXIiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBlLmN1c3RvbWl6ZWRMb2dnZXImJiJvYmplY3QiPT09UChlLmN1c3RvbWl6ZWRMb2dnZXIpP2UuY3VzdG9taXplZExvZ2dlcjplLnVzZURlZmF1bHRMb2dnZXI/KHRoaXMuY29uc29sZUxvZ2dlcldyYXBwZXI9SCgpLHRoaXMuY29uc29sZUxvZ2dlcldyYXBwZXIpOm51bGx9fV0pLGV9KCksVj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt4KHRoaXMsZSl9cmV0dXJuIFUoZSxbe2tleToiZGVidWciLHZhbHVlOmZ1bmN0aW9uKCl7fX0se2tleToiaW5mbyIsdmFsdWU6ZnVuY3Rpb24oKXt9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbigpe319LHtrZXk6ImVycm9yIix2YWx1ZTpmdW5jdGlvbigpe319LHtrZXk6ImFkdmFuY2VkTG9nIix2YWx1ZTpmdW5jdGlvbigpe319XSksZX0oKSxXPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7dmFyIG47cmV0dXJuIHgodGhpcyx0KSwobj1mdW5jdGlvbihlLHQpe3JldHVybiF0fHwib2JqZWN0IiE9PVAodCkmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2Z1bmN0aW9uKGUpe2lmKHZvaWQgMD09PWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gZX0oZSk6dH0odGhpcyxPKHQpLmNhbGwodGhpcykpKS5wcmVmaXg9ZXx8cSxufXJldHVybiBmdW5jdGlvbihlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiZEKGUsdCl9KHQsViksVSh0LFt7a2V5OiJkZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdGhpcy5fbG9nKEIuREVCVUcsdCl9fSx7a2V5OiJpbmZvIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLl9sb2coQi5JTkZPLHQpfX0se2tleToid2FybiIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdGhpcy5fbG9nKEIuV0FSTix0KX19LHtrZXk6ImVycm9yIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLl9sb2coQi5FUlJPUix0KX19LHtrZXk6ImFkdmFuY2VkTG9nIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLl9sb2coQi5BRFZBTkNFRF9MT0csdCl9fSx7a2V5OiJfc2hvdWxkTG9nIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gei5oYXNDbGllbnRMb2dnZXIoKSYmei5pc0xldmVsRW5hYmxlZChlKX19LHtrZXk6Il93cml0ZVRvQ2xpZW50TG9nZ2VyIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiB6LndyaXRlVG9DbGllbnRMb2dnZXIoZSx0KX19LHtrZXk6Il9sb2ciLHZhbHVlOmZ1bmN0aW9uKGUsdCl7aWYodGhpcy5fc2hvdWxkTG9nKGUpKXt2YXIgbj16LnVzZUNsaWVudExvZ2dlcj90OnRoaXMuX2NvbnZlcnRUb1NpbmdsZVN0YXRlbWVudCh0LGUpO3JldHVybiB0aGlzLl93cml0ZVRvQ2xpZW50TG9nZ2VyKGUsbil9fX0se2tleToiX2NvbnZlcnRUb1NpbmdsZVN0YXRlbWVudCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgRGF0ZShEYXRlLm5vdygpKS50b0lTT1N0cmluZygpLHI9dGhpcy5fZ2V0TG9nTGV2ZWxCeVZhbHVlKHQpLG89IlsiLmNvbmNhdChuLCJdWyIpLmNvbmNhdChyLCJdIik7dGhpcy5wcmVmaXgmJihvKz10aGlzLnByZWZpeCsiICIpLHRoaXMub3B0aW9ucyYmKHRoaXMub3B0aW9ucy5wcmVmaXg/bys9IiAiK3RoaXMub3B0aW9ucy5wcmVmaXgrIjoiOm8rPSIiLHRoaXMub3B0aW9ucy5sb2dNZXRhRGF0YT9vKz0iIE1ldGEgZGF0YTogIitKU09OLnN0cmluZ2lmeSh0aGlzLm9wdGlvbnMubG9nTWV0YURhdGEpOm8rPSIiKTtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIHM9ZVtpXTtvKz10aGlzLl9jb252ZXJ0VG9TdHJpbmcocykrIiAifXJldHVybiBvfX0se2tleToiX2dldExvZ0xldmVsQnlWYWx1ZSIsdmFsdWU6ZnVuY3Rpb24oZSl7c3dpdGNoKGUpe2Nhc2UgMTA6cmV0dXJuIkRFQlVHIjtjYXNlIDIwOnJldHVybiJJTkZPIjtjYXNlIDMwOnJldHVybiJXQVJOIjtjYXNlIDQwOnJldHVybiJFUlJPUiI7Y2FzZSA1MDpyZXR1cm4iQURWQU5DRURfTE9HIn19fSx7a2V5OiJfY29udmVydFRvU3RyaW5nIix2YWx1ZTpmdW5jdGlvbihlKXt0cnl7aWYoIWUpcmV0dXJuIiI7aWYoTi5pc1N0cmluZyhlKSlyZXR1cm4gZTtpZihOLmlzT2JqZWN0KGUpJiZOLmlzRnVuY3Rpb24oZS50b1N0cmluZykpe3ZhciB0PWUudG9TdHJpbmcoKTtpZigiW29iamVjdCBPYmplY3RdIiE9PXQpcmV0dXJuIHR9cmV0dXJuIEpTT04uc3RyaW5naWZ5KGUpfWNhdGNoKHQpe3JldHVybiBjb25zb2xlLmVycm9yKCJFcnJvciB3aGlsZSBjb252ZXJ0aW5nIGFyZ3VtZW50IHRvIHN0cmluZyIsZSx0KSwiIn19fV0pLHR9KCksSD1mdW5jdGlvbigpe3ZhciBlPW5ldyBWO3JldHVybiBlLmRlYnVnPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIGNvbnNvbGUuZGVidWcuYXBwbHkod2luZG93LmNvbnNvbGUsW10uY29uY2F0KHQpKX0sZS5pbmZvPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIGNvbnNvbGUuaW5mby5hcHBseSh3aW5kb3cuY29uc29sZSxbXS5jb25jYXQodCkpfSxlLndhcm49ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gY29uc29sZS53YXJuLmFwcGx5KHdpbmRvdy5jb25zb2xlLFtdLmNvbmNhdCh0KSl9LGUuZXJyb3I9ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gY29uc29sZS5lcnJvci5hcHBseSh3aW5kb3cuY29uc29sZSxbXS5jb25jYXQodCkpfSxlfSx6PW5ldyBqO2Z1bmN0aW9uIEcoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX12YXIgSz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjJlMzshZnVuY3Rpb24oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyxlKSx0aGlzLm51bUF0dGVtcHRzPTAsdGhpcy5leGVjdXRvcj10LHRoaXMuaGFzQWN0aXZlUmVjb25uZWN0aW9uPSExLHRoaXMuZGVmYXVsdFJldHJ5PW59dmFyIHQsbjtyZXR1cm4gdD1lLChuPVt7a2V5OiJyZXRyeSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuaGFzQWN0aXZlUmVjb25uZWN0aW9ufHwodGhpcy5oYXNBY3RpdmVSZWNvbm5lY3Rpb249ITAsc2V0VGltZW91dCgoZnVuY3Rpb24oKXtlLl9leGVjdXRlKCl9KSx0aGlzLl9nZXREZWxheSgpKSl9fSx7a2V5OiJfZXhlY3V0ZSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmhhc0FjdGl2ZVJlY29ubmVjdGlvbj0hMSx0aGlzLmV4ZWN1dG9yKCksdGhpcy5udW1BdHRlbXB0cysrfX0se2tleToiY29ubmVjdGVkIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMubnVtQXR0ZW1wdHM9MH19LHtrZXk6Il9nZXREZWxheSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT1NYXRoLnBvdygyLHRoaXMubnVtQXR0ZW1wdHMpKnRoaXMuZGVmYXVsdFJldHJ5O3JldHVybiBlPD0zZTQ/ZTozZTR9fSx7a2V5OiJnZXRJc0Nvbm5lY3RlZCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5udW1BdHRlbXB0c319XSkmJkcodC5wcm90b3R5cGUsbiksZX0oKTtuLmQodCwiYSIsKGZ1bmN0aW9uKCl7cmV0dXJuIFl9KSk7dmFyIFg9ZnVuY3Rpb24oKXt2YXIgZT16LmdldExvZ2dlcih7cHJlZml4Oml9KSx0PU4uaXNOZXR3b3JrT25saW5lKCksbj17cHJpbWFyeTpudWxsLHNlY29uZGFyeTpudWxsfSxyPXtyZWNvbm5lY3RXZWJTb2NrZXQ6ITAsd2Vic29ja2V0SW5pdEZhaWxlZDohMSxleHBvbmVudGlhbEJhY2tPZmZUaW1lOjFlMyxleHBvbmVudGlhbFRpbWVvdXRIYW5kbGU6bnVsbCxsaWZlVGltZVRpbWVvdXRIYW5kbGU6bnVsbCx3ZWJTb2NrZXRJbml0Q2hlY2tlclRpbWVvdXRJZDpudWxsLGNvbm5TdGF0ZTpudWxsfSxvPXtjb25uZWN0V2ViU29ja2V0UmV0cnlDb3VudDowLGNvbm5lY3Rpb25BdHRlbXB0U3RhcnRUaW1lOm51bGwsbm9PcGVuQ29ubmVjdGlvbnNUaW1lc3RhbXA6bnVsbH0sUj17cGVuZGluZ1Jlc3BvbnNlOiExLGludGVydmFsSGFuZGxlOm51bGx9LGs9e2luaXRGYWlsdXJlOm5ldyBTZXQsZ2V0V2ViU29ja2V0VHJhbnNwb3J0Om51bGwsc3Vic2NyaXB0aW9uVXBkYXRlOm5ldyBTZXQsc3Vic2NyaXB0aW9uRmFpbHVyZTpuZXcgU2V0LHRvcGljOm5ldyBNYXAsYWxsTWVzc2FnZTpuZXcgU2V0LGNvbm5lY3Rpb25HYWluOm5ldyBTZXQsY29ubmVjdGlvbkxvc3Q6bmV3IFNldCxjb25uZWN0aW9uT3BlbjpuZXcgU2V0LGNvbm5lY3Rpb25DbG9zZTpuZXcgU2V0fSxMPXtjb25uQ29uZmlnOm51bGwscHJvbWlzZUhhbmRsZTpudWxsLHByb21pc2VDb21wbGV0ZWQ6ITB9LE89e3N1YnNjcmliZWQ6bmV3IFNldCxwZW5kaW5nOm5ldyBTZXQsc3Vic2NyaXB0aW9uSGlzdG9yeTpuZXcgU2V0fSxEPXtyZXNwb25zZUNoZWNrSW50ZXJ2YWxJZDpudWxsLHJlcXVlc3RDb21wbGV0ZWQ6ITAscmVTdWJzY3JpYmVJbnRlcnZhbElkOm51bGwsY29uc2VjdXRpdmVGYWlsZWRTdWJzY3JpYmVBdHRlbXB0czowLGNvbnNlY3V0aXZlTm9SZXNwb25zZVJlcXVlc3Q6MH0sUD1uZXcgSygoZnVuY3Rpb24oKXtzZSgpfSkpLHg9bmV3IFNldChbQSwiYXdzL3Vuc3Vic2NyaWJlIixfXSksTT1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXtpZih0IT09Ti5pc05ldHdvcmtPbmxpbmUoKSl7aWYoISh0PU4uaXNOZXR3b3JrT25saW5lKCkpKXJldHVybiBlLmFkdmFuY2VkTG9nKHMpLHZvaWQgdWUoZS5pbmZvKHMpKTt2YXIgbj1XKCk7dCYmKCFufHxCKG4sV2ViU29ja2V0LkNMT1NJTkcpfHxCKG4sV2ViU29ja2V0LkNMT1NFRCkpJiYoZS5hZHZhbmNlZExvZyhhKSx1ZShlLmluZm8oYSkpLHNlKCkpfX0pLDI1MCksVT1mdW5jdGlvbih0LG4pe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dHJ5e3Qobil9Y2F0Y2godCl7dWUoZS5lcnJvcigiRXJyb3IgZXhlY3V0aW5nIGNhbGxiYWNrIix0KSl9fSkpfSxGPWZ1bmN0aW9uKGUpe2lmKG51bGw9PT1lKXJldHVybiJOVUxMIjtzd2l0Y2goZS5yZWFkeVN0YXRlKXtjYXNlIFdlYlNvY2tldC5DT05ORUNUSU5HOnJldHVybiJDT05ORUNUSU5HIjtjYXNlIFdlYlNvY2tldC5PUEVOOnJldHVybiJPUEVOIjtjYXNlIFdlYlNvY2tldC5DTE9TSU5HOnJldHVybiJDTE9TSU5HIjtjYXNlIFdlYlNvY2tldC5DTE9TRUQ6cmV0dXJuIkNMT1NFRCI7ZGVmYXVsdDpyZXR1cm4iVU5ERUZJTkVEIn19LHE9ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06IiI7dWUoZS5kZWJ1ZygiWyIrdCsiXSBQcmltYXJ5IFdlYlNvY2tldDogIitGKG4ucHJpbWFyeSkrIiB8IFNlY29uZGFyeSBXZWJTb2NrZXQ6ICIrRihuLnNlY29uZGFyeSkpKX0sQj1mdW5jdGlvbihlLHQpe3JldHVybiBlJiZlLnJlYWR5U3RhdGU9PT10fSxqPWZ1bmN0aW9uKGUpe3JldHVybiBCKGUsV2ViU29ja2V0Lk9QRU4pfSxWPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZXx8dm9pZCAwPT09ZS5yZWFkeVN0YXRlfHxCKGUsV2ViU29ja2V0LkNMT1NFRCl9LFc9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PW4uc2Vjb25kYXJ5P24uc2Vjb25kYXJ5Om4ucHJpbWFyeX0sSD1mdW5jdGlvbigpe3JldHVybiBqKFcoKSl9LEc9ZnVuY3Rpb24oKXtpZihSLnBlbmRpbmdSZXNwb25zZSlyZXR1cm4gZS5hZHZhbmNlZExvZyh1KSx1ZShlLndhcm4odSkpLGNsZWFySW50ZXJ2YWwoUi5pbnRlcnZhbEhhbmRsZSksUi5wZW5kaW5nUmVzcG9uc2U9ITEsdm9pZCBzZSgpO0goKT8odWUoZS5kZWJ1ZygiU2VuZGluZyBoZWFydGJlYXQiKSksVygpLnNlbmQob2UoXykpLFIucGVuZGluZ1Jlc3BvbnNlPSEwKTooZS5hZHZhbmNlZExvZyhsKSx1ZShlLndhcm4obCkpLHEoInNlbmRIZWFydEJlYXQiKSxzZSgpKX0sWD1mdW5jdGlvbigpe2UuYWR2YW5jZWRMb2coIlJlc2V0IFdlYnNvY2tldCBzdGF0ZSIpLHIuZXhwb25lbnRpYWxCYWNrT2ZmVGltZT0xZTMsUi5wZW5kaW5nUmVzcG9uc2U9ITEsci5yZWNvbm5lY3RXZWJTb2NrZXQ9ITAsY2xlYXJUaW1lb3V0KHIubGlmZVRpbWVUaW1lb3V0SGFuZGxlKSxjbGVhckludGVydmFsKFIuaW50ZXJ2YWxIYW5kbGUpLGNsZWFyVGltZW91dChyLmV4cG9uZW50aWFsVGltZW91dEhhbmRsZSksY2xlYXJUaW1lb3V0KHIud2ViU29ja2V0SW5pdENoZWNrZXJUaW1lb3V0SWQpfSxZPWZ1bmN0aW9uKCl7RC5jb25zZWN1dGl2ZUZhaWxlZFN1YnNjcmliZUF0dGVtcHRzPTAsRC5jb25zZWN1dGl2ZU5vUmVzcG9uc2VSZXF1ZXN0PTAsY2xlYXJJbnRlcnZhbChELnJlc3BvbnNlQ2hlY2tJbnRlcnZhbElkKSxjbGVhckludGVydmFsKEQucmVTdWJzY3JpYmVJbnRlcnZhbElkKX0sJD1mdW5jdGlvbigpe28uY29ubmVjdFdlYlNvY2tldFJldHJ5Q291bnQ9MCxvLmNvbm5lY3Rpb25BdHRlbXB0U3RhcnRUaW1lPW51bGwsby5ub09wZW5Db25uZWN0aW9uc1RpbWVzdGFtcD1udWxsfSxKPWZ1bmN0aW9uKCl7UC5jb25uZWN0ZWQoKTt0cnl7ZS5hZHZhbmNlZExvZyhwKSx1ZShlLmluZm8ocCkpLHEoIndlYlNvY2tldE9uT3BlbiIpLG51bGwhPT1yLmNvbm5TdGF0ZSYmci5jb25uU3RhdGUhPT13fHxVKGsuY29ubmVjdGlvbkdhaW4pLHIuY29ublN0YXRlPSJjb25uZWN0ZWQiO3ZhciB0PURhdGUubm93KCk7VShrLmNvbm5lY3Rpb25PcGVuLHtjb25uZWN0V2ViU29ja2V0UmV0cnlDb3VudDpvLmNvbm5lY3RXZWJTb2NrZXRSZXRyeUNvdW50LGNvbm5lY3Rpb25BdHRlbXB0U3RhcnRUaW1lOm8uY29ubmVjdGlvbkF0dGVtcHRTdGFydFRpbWUsbm9PcGVuQ29ubmVjdGlvbnNUaW1lc3RhbXA6by5ub09wZW5Db25uZWN0aW9uc1RpbWVzdGFtcCxjb25uZWN0aW9uRXN0YWJsaXNoZWRUaW1lOnQsdGltZVRvQ29ubmVjdDp0LW8uY29ubmVjdGlvbkF0dGVtcHRTdGFydFRpbWUsdGltZVdpdGhvdXRDb25uZWN0aW9uOm8ubm9PcGVuQ29ubmVjdGlvbnNUaW1lc3RhbXA/dC1vLm5vT3BlbkNvbm5lY3Rpb25zVGltZXN0YW1wOm51bGx9KSwkKCksWCgpLFcoKS5vcGVuVGltZXN0YW1wPURhdGUubm93KCksMD09PU8uc3Vic2NyaWJlZC5zaXplJiZqKG4uc2Vjb25kYXJ5KSYmdGUobi5wcmltYXJ5LCJbUHJpbWFyeSBXZWJTb2NrZXRdIENsb3NpbmcgV2ViU29ja2V0IiksKE8uc3Vic2NyaWJlZC5zaXplPjB8fE8ucGVuZGluZy5zaXplPjApJiYoaihuLnNlY29uZGFyeSkmJnVlKGUuaW5mbygiU3Vic2NyaWJpbmcgc2Vjb25kYXJ5IHdlYnNvY2tldCB0byB0b3BpY3Mgb2YgcHJpbWFyeSB3ZWJzb2NrZXQiKSksTy5zdWJzY3JpYmVkLmZvckVhY2goKGZ1bmN0aW9uKGUpe08uc3Vic2NyaXB0aW9uSGlzdG9yeS5hZGQoZSksTy5wZW5kaW5nLmFkZChlKX0pKSxPLnN1YnNjcmliZWQuY2xlYXIoKSxlZSgpKSxHKCksUi5pbnRlcnZhbEhhbmRsZT1zZXRJbnRlcnZhbChHLDFlNCk7dmFyIGk9MWUzKkwuY29ubkNvbmZpZy53ZWJTb2NrZXRUcmFuc3BvcnQudHJhbnNwb3J0TGlmZVRpbWVJblNlY29uZHM7dWUoZS5kZWJ1ZygiU2NoZWR1bGluZyBXZWJTb2NrZXQgbWFuYWdlciByZWNvbm5lY3Rpb24sIGFmdGVyIGRlbGF5ICIraSsiIG1zIikpLHIubGlmZVRpbWVUaW1lb3V0SGFuZGxlPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dWUoZS5kZWJ1ZygiU3RhcnRpbmcgc2NoZWR1bGVkIFdlYlNvY2tldCBtYW5hZ2VyIHJlY29ubmVjdGlvbiIpKSxzZSgpfSksaSl9Y2F0Y2godCl7dWUoZS5lcnJvcigiRXJyb3IgYWZ0ZXIgZXN0YWJsaXNoaW5nIFdlYlNvY2tldCBjb25uZWN0aW9uIix0KSl9fSxRPWZ1bmN0aW9uKHQpe3EoIndlYlNvY2tldE9uRXJyb3IiKSxlLmFkdmFuY2VkTG9nKGgsSlNPTi5zdHJpbmdpZnkodCkpLHVlKGUuZXJyb3IoaCxKU09OLnN0cmluZ2lmeSh0KSkpLFAuZ2V0SXNDb25uZWN0ZWQoKT9zZSgpOlAucmV0cnkoKX0sWj1mdW5jdGlvbih0KXt2YXIgcj1KU09OLnBhcnNlKHQuZGF0YSk7c3dpdGNoKHIudG9waWMpe2Nhc2UgQTppZih1ZShlLmRlYnVnKCJTdWJzY3JpcHRpb24gTWVzc2FnZSByZWNlaXZlZCBmcm9tIHdlYlNvY2tldCBzZXJ2ZXIiLHQuZGF0YSkpLEQucmVxdWVzdENvbXBsZXRlZD0hMCxELmNvbnNlY3V0aXZlTm9SZXNwb25zZVJlcXVlc3Q9MCwic3VjY2VzcyI9PT1yLmNvbnRlbnQuc3RhdHVzKUQuY29uc2VjdXRpdmVGYWlsZWRTdWJzY3JpYmVBdHRlbXB0cz0wLHIuY29udGVudC50b3BpY3MuZm9yRWFjaCgoZnVuY3Rpb24oZSl7Ty5zdWJzY3JpcHRpb25IaXN0b3J5LmRlbGV0ZShlKSxPLnBlbmRpbmcuZGVsZXRlKGUpLE8uc3Vic2NyaWJlZC5hZGQoZSl9KSksMD09PU8uc3Vic2NyaXB0aW9uSGlzdG9yeS5zaXplP2oobi5zZWNvbmRhcnkpJiYodWUoZS5pbmZvKCJTdWNjZXNzZnVsbHkgc3Vic2NyaWJlZCBzZWNvbmRhcnkgd2Vic29ja2V0IHRvIGFsbCB0b3BpY3Mgb2YgcHJpbWFyeSB3ZWJzb2NrZXQiKSksdGUobi5wcmltYXJ5LCJbUHJpbWFyeSBXZWJTb2NrZXRdIENsb3NpbmcgV2ViU29ja2V0IikpOmVlKCksVShrLnN1YnNjcmlwdGlvblVwZGF0ZSxyKTtlbHNle2lmKGNsZWFySW50ZXJ2YWwoRC5yZVN1YnNjcmliZUludGVydmFsSWQpLCsrRC5jb25zZWN1dGl2ZUZhaWxlZFN1YnNjcmliZUF0dGVtcHRzLDU9PT1ELmNvbnNlY3V0aXZlRmFpbGVkU3Vic2NyaWJlQXR0ZW1wdHMpcmV0dXJuIFUoay5zdWJzY3JpcHRpb25GYWlsdXJlLHIpLHZvaWQoRC5jb25zZWN1dGl2ZUZhaWxlZFN1YnNjcmliZUF0dGVtcHRzPTApO0QucmVTdWJzY3JpYmVJbnRlcnZhbElkPXNldEludGVydmFsKChmdW5jdGlvbigpe2VlKCl9KSw1MDApfWJyZWFrO2Nhc2UgXzp1ZShlLmRlYnVnKCJIZWFydGJlYXQgcmVzcG9uc2UgcmVjZWl2ZWQiKSksUi5wZW5kaW5nUmVzcG9uc2U9ITE7YnJlYWs7ZGVmYXVsdDppZihyLnRvcGljKXtpZihlLmFkdmFuY2VkTG9nKEMsci50b3BpYyksdWUoZS5kZWJ1ZyhDK3IudG9waWMpKSxqKG4ucHJpbWFyeSkmJmoobi5zZWNvbmRhcnkpJiYwPT09Ty5zdWJzY3JpcHRpb25IaXN0b3J5LnNpemUmJnRoaXM9PT1uLnByaW1hcnkpcmV0dXJuIHZvaWQgdWUoZS53YXJuKCJJZ25vcmluZyBNZXNzYWdlIGZvciBUb3BpYyAiK3IudG9waWMrIiwgdG8gYXZvaWQgZHVwbGljYXRlcyIpKTtpZigwPT09ay5hbGxNZXNzYWdlLnNpemUmJjA9PT1rLnRvcGljLnNpemUpcmV0dXJuIHZvaWQgdWUoZS53YXJuKCJObyByZWdpc3RlcmVkIGNhbGxiYWNrIGxpc3RlbmVyIGZvciBUb3BpYyIsci50b3BpYykpO2UuYWR2YW5jZWRMb2coIldlYnNvY2tldE1hbmFnZXIgaW52b2tlIGNhbGxiYWNrcyBmb3IgdG9waWMgc3VjY2VzcyAiLHIudG9waWMpLFUoay5hbGxNZXNzYWdlLHIpLGsudG9waWMuaGFzKHIudG9waWMpJiZVKGsudG9waWMuZ2V0KHIudG9waWMpLHIpfWVsc2Ugci5tZXNzYWdlPyhlLmFkdmFuY2VkTG9nKFQsciksdWUoZS53YXJuKFQscikpKTooZS5hZHZhbmNlZExvZyhJLHIpLHVlKGUud2FybihJLHIpKSl9fSxlZT1mdW5jdGlvbiB0KCl7aWYoRC5jb25zZWN1dGl2ZU5vUmVzcG9uc2VSZXF1ZXN0PjMpcmV0dXJuIHVlKGUud2FybigiSWdub3Jpbmcgc3Vic2NyaWJlUGVuZGluZ1RvcGljcyBzaW5jZSB3ZSBoYXZlIGV4aGF1c3RlZCBtYXggc3Vic2NyaXB0aW9uIHJldHJpZXMgd2l0aCBubyByZXNwb25zZSIpKSx2b2lkIFUoay5zdWJzY3JpcHRpb25GYWlsdXJlLE4uZ2V0U3Vic2NyaXB0aW9uUmVzcG9uc2UoQSwhMSxBcnJheS5mcm9tKE8ucGVuZGluZykpKTtIKCk/MCE9PUFycmF5LmZyb20oTy5wZW5kaW5nKS5sZW5ndGgmJihjbGVhckludGVydmFsKEQucmVzcG9uc2VDaGVja0ludGVydmFsSWQpLFcoKS5zZW5kKG9lKEEse3RvcGljczpBcnJheS5mcm9tKE8ucGVuZGluZyl9KSksRC5yZXF1ZXN0Q29tcGxldGVkPSExLEQucmVzcG9uc2VDaGVja0ludGVydmFsSWQ9c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7RC5yZXF1ZXN0Q29tcGxldGVkfHwoKytELmNvbnNlY3V0aXZlTm9SZXNwb25zZVJlcXVlc3QsdCgpKX0pLDFlMykpOnVlKGUud2FybigiSWdub3Jpbmcgc3Vic2NyaWJlUGVuZGluZ1RvcGljcyBjYWxsIHNpbmNlIERlZmF1bHQgV2ViU29ja2V0IGlzIG5vdCBvcGVuIikpfSx0ZT1mdW5jdGlvbih0LG4pe0IodCxXZWJTb2NrZXQuQ09OTkVDVElORyl8fEIodCxXZWJTb2NrZXQuT1BFTik/dC5jbG9zZSgxZTMsbik6dWUoZS53YXJuKCJJZ25vcmluZyBXZWJTb2NrZXQgQ2xvc2UgcmVxdWVzdCwgV2ViU29ja2V0IFN0YXRlOiAiK0YodCkpKX0sbmU9ZnVuY3Rpb24oZSl7dGUobi5wcmltYXJ5LCJbUHJpbWFyeV0gV2ViU29ja2V0ICIrZSksdGUobi5zZWNvbmRhcnksIltTZWNvbmRhcnldIFdlYlNvY2tldCAiK2UpfSxyZT1mdW5jdGlvbih0KXtYKCksWSgpLGUuYWR2YW5jZWRMb2cobSx0KSx1ZShlLmVycm9yKG0pKSxyLndlYnNvY2tldEluaXRGYWlsZWQ9ITAsbmUoIlRlcm1pbmF0aW5nIFdlYlNvY2tldCBNYW5hZ2VyIiksY2xlYXJJbnRlcnZhbChNKSxVKGsuaW5pdEZhaWx1cmUse2Nvbm5lY3RXZWJTb2NrZXRSZXRyeUNvdW50Om8uY29ubmVjdFdlYlNvY2tldFJldHJ5Q291bnQsY29ubmVjdGlvbkF0dGVtcHRTdGFydFRpbWU6by5jb25uZWN0aW9uQXR0ZW1wdFN0YXJ0VGltZSxyZWFzb246dH0pLCQoKX0sb2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoe3RvcGljOmUsY29udGVudDp0fSl9LGllPWZ1bmN0aW9uKHQpe3JldHVybiEhKE4uaXNPYmplY3QodCkmJk4uaXNPYmplY3QodC53ZWJTb2NrZXRUcmFuc3BvcnQpJiZOLmlzTm9uRW1wdHlTdHJpbmcodC53ZWJTb2NrZXRUcmFuc3BvcnQudXJsKSYmTi52YWxpZFdTVXJsKHQud2ViU29ja2V0VHJhbnNwb3J0LnVybCkmJjFlMyp0LndlYlNvY2tldFRyYW5zcG9ydC50cmFuc3BvcnRMaWZlVGltZUluU2Vjb25kcz49M2U1KXx8KHVlKGUuZXJyb3IoIkludmFsaWQgV2ViU29ja2V0IENvbm5lY3Rpb24gQ29uZmlndXJhdGlvbiIsdCkpLCExKX0sc2U9ZnVuY3Rpb24oKXtpZighTi5pc05ldHdvcmtPbmxpbmUoKSlyZXR1cm4gZS5hZHZhbmNlZExvZyhjKSx2b2lkIHVlKGUuaW5mbyhjKSk7aWYoci53ZWJzb2NrZXRJbml0RmFpbGVkKXVlKGUuZGVidWcoIldlYlNvY2tldCBJbml0IGhhZCBmYWlsZWQsIGlnbm9yaW5nIHRoaXMgZ2V0V2ViU29ja2V0Q29ubkNvbmZpZyByZXF1ZXN0IikpO2Vsc2V7aWYoTC5wcm9taXNlQ29tcGxldGVkKXJldHVybiBYKCksZS5hZHZhbmNlZExvZyh2KSx1ZShlLmluZm8odikpLG8uY29ubmVjdGlvbkF0dGVtcHRTdGFydFRpbWU9by5jb25uZWN0aW9uQXR0ZW1wdFN0YXJ0VGltZXx8RGF0ZS5ub3coKSxMLnByb21pc2VDb21wbGV0ZWQ9ITEsTC5wcm9taXNlSGFuZGxlPWsuZ2V0V2ViU29ja2V0VHJhbnNwb3J0KCksTC5wcm9taXNlSGFuZGxlLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiBMLnByb21pc2VDb21wbGV0ZWQ9ITAsZS5hZHZhbmNlZExvZyh5KSx1ZShlLmRlYnVnKHksdCkpLGllKHQpPyhMLmNvbm5Db25maWc9dCxMLmNvbm5Db25maWcudXJsQ29ublZhbGlkVGltZT1EYXRlLm5vdygpKzg1ZTMsYWUoKSk6KHJlKCJJbnZhbGlkIFdlYlNvY2tldCBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb246ICIrdCkse3dlYlNvY2tldENvbm5lY3Rpb25GYWlsZWQ6ITB9KX0pLChmdW5jdGlvbih0KXtyZXR1cm4gTC5wcm9taXNlQ29tcGxldGVkPSEwLGUuYWR2YW5jZWRMb2coRSksdWUoZS5lcnJvcihFLHQpKSxOLmlzTmV0d29ya0ZhaWx1cmUodCk/KGUuYWR2YW5jZWRMb2coUytKU09OLnN0cmluZ2lmeSh0KSksdWUoZS5pbmZvKFMrSlNPTi5zdHJpbmdpZnkodCkpKSxQLnJldHJ5KCkpOnJlKCJGYWlsZWQgdG8gZmV0Y2ggd2ViU29ja2V0IGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbjogIitKU09OLnN0cmluZ2lmeSh0KSkse3dlYlNvY2tldENvbm5lY3Rpb25GYWlsZWQ6ITB9fSkpO3VlKGUuZGVidWcoIlRoZXJlIGlzIGFuIG9uZ29pbmcgZ2V0V2ViU29ja2V0Q29ubkNvbmZpZyByZXF1ZXN0LCB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBpZ25vcmVkIikpfX0sYWU9ZnVuY3Rpb24oKXtpZihyLndlYnNvY2tldEluaXRGYWlsZWQpcmV0dXJuIHVlKGUuaW5mbygid2ViLXNvY2tldCBpbml0aWFsaXppbmcgaGFkIGZhaWxlZCwgYWJvcnRpbmcgcmUtaW5pdCIpKSx7d2ViU29ja2V0Q29ubmVjdGlvbkZhaWxlZDohMH07aWYoIU4uaXNOZXR3b3JrT25saW5lKCkpcmV0dXJuIHVlKGUud2FybigiU3lzdGVtIGlzIG9mZmxpbmUgYWJvcnRpbmcgd2ViLXNvY2tldCBpbml0IikpLHt3ZWJTb2NrZXRDb25uZWN0aW9uRmFpbGVkOiEwfTtlLmFkdmFuY2VkTG9nKGIpLHVlKGUuaW5mbyhiKSkscSgiaW5pdFdlYlNvY2tldCIpO3RyeXtpZihpZShMLmNvbm5Db25maWcpKXt2YXIgdD1udWxsO3JldHVybiBqKG4ucHJpbWFyeSk/KHVlKGUuZGVidWcoIlByaW1hcnkgU29ja2V0IGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBvcGVuIikpLEIobi5zZWNvbmRhcnksV2ViU29ja2V0LkNPTk5FQ1RJTkcpfHwodWUoZS5kZWJ1ZygiRXN0YWJsaXNoaW5nIGEgc2Vjb25kYXJ5IHdlYi1zb2NrZXQgY29ubmVjdGlvbiIpKSxQLm51bUF0dGVtcHRzPTAsbi5zZWNvbmRhcnk9Y2UoKSksdD1uLnNlY29uZGFyeSk6KEIobi5wcmltYXJ5LFdlYlNvY2tldC5DT05ORUNUSU5HKXx8KHVlKGUuZGVidWcoIkVzdGFibGlzaGluZyBhIHByaW1hcnkgd2ViLXNvY2tldCBjb25uZWN0aW9uIikpLG4ucHJpbWFyeT1jZSgpKSx0PW4ucHJpbWFyeSksci53ZWJTb2NrZXRJbml0Q2hlY2tlclRpbWVvdXRJZD1zZXRUaW1lb3V0KChmdW5jdGlvbigpe2oodCl8fGZ1bmN0aW9uKCl7by5jb25uZWN0V2ViU29ja2V0UmV0cnlDb3VudCsrO3ZhciB0PU4uYWRkSml0dGVyKHIuZXhwb25lbnRpYWxCYWNrT2ZmVGltZSwuMyk7RGF0ZS5ub3coKSt0PD1MLmNvbm5Db25maWcudXJsQ29ublZhbGlkVGltZT8oZS5hZHZhbmNlZExvZyhmKSx1ZShlLmRlYnVnKGYrdCsiIG1zIikpLHIuZXhwb25lbnRpYWxUaW1lb3V0SGFuZGxlPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7cmV0dXJuIGFlKCl9KSx0KSxyLmV4cG9uZW50aWFsQmFja09mZlRpbWUqPTIpOihlLmFkdmFuY2VkTG9nKGcpLHVlKGUud2FybihnKSksc2UoKSl9KCl9KSwxZTMpLHt3ZWJTb2NrZXRDb25uZWN0aW9uRmFpbGVkOiExfX19Y2F0Y2godCl7cmV0dXJuIHVlKGUuZXJyb3IoIkVycm9yIEluaXRpYWxpemluZyB3ZWItc29ja2V0LW1hbmFnZXIiLHQpKSxyZSgiRmFpbGVkIHRvIGluaXRpYWxpemUgbmV3IFdlYlNvY2tldDogIit0Lm1lc3NhZ2UpLHt3ZWJTb2NrZXRDb25uZWN0aW9uRmFpbGVkOiEwfX19LGNlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IFdlYlNvY2tldChMLmNvbm5Db25maWcud2ViU29ja2V0VHJhbnNwb3J0LnVybCk7cmV0dXJuIHQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsSiksdC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixaKSx0LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixRKSx0LmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIiwoZnVuY3Rpb24oaSl7cmV0dXJuIGZ1bmN0aW9uKHQsaSl7ZS5hZHZhbmNlZExvZyhkLEpTT04uc3RyaW5naWZ5KHQpKSx1ZShlLmluZm8oZCxKU09OLnN0cmluZ2lmeSh0KSkpLHEoIndlYlNvY2tldE9uQ2xvc2UgYmVmb3JlLWNsZWFudXAiKSxVKGsuY29ubmVjdGlvbkNsb3NlLHtvcGVuVGltZXN0YW1wOmkub3BlblRpbWVzdGFtcCxjbG9zZVRpbWVzdGFtcDpEYXRlLm5vdygpLGNvbm5lY3Rpb25EdXJhdGlvbjpEYXRlLm5vdygpLWkub3BlblRpbWVzdGFtcCxjb2RlOnQuY29kZSxyZWFzb246dC5yZWFzb259KSxWKG4ucHJpbWFyeSkmJihuLnByaW1hcnk9bnVsbCksVihuLnNlY29uZGFyeSkmJihuLnNlY29uZGFyeT1udWxsKSxyLnJlY29ubmVjdFdlYlNvY2tldCYmKGoobi5wcmltYXJ5KXx8aihuLnNlY29uZGFyeSk/VihuLnByaW1hcnkpJiZqKG4uc2Vjb25kYXJ5KSYmKHVlKGUuaW5mbygiW1ByaW1hcnldIFdlYlNvY2tldCBDbGVhbmx5IENsb3NlZCIpKSxuLnByaW1hcnk9bi5zZWNvbmRhcnksbi5zZWNvbmRhcnk9bnVsbCk6KHVlKGUud2FybigiTmVpdGhlciBwcmltYXJ5IHdlYnNvY2tldCBhbmQgbm9yIHNlY29uZGFyeSB3ZWJzb2NrZXQgaGF2ZSBvcGVuIGNvbm5lY3Rpb25zLCBhdHRlbXB0aW5nIHRvIHJlLWVzdGFibGlzaCBjb25uZWN0aW9uIikpLHIuY29ublN0YXRlPT09dz91ZShlLmluZm8oIklnbm9yaW5nIGNvbm5lY3Rpb25Mb3N0IGNhbGxiYWNrIGludm9jYXRpb24iKSk6KFUoay5jb25uZWN0aW9uTG9zdCx7b3BlblRpbWVzdGFtcDppLm9wZW5UaW1lc3RhbXAsY2xvc2VUaW1lc3RhbXA6RGF0ZS5ub3coKSxjb25uZWN0aW9uRHVyYXRpb246RGF0ZS5ub3coKS1pLm9wZW5UaW1lc3RhbXAsY29kZTp0LmNvZGUscmVhc29uOnQucmVhc29ufSksby5ub09wZW5Db25uZWN0aW9uc1RpbWVzdGFtcD1EYXRlLm5vdygpKSxyLmNvbm5TdGF0ZT13LHNlKCkpLHEoIndlYlNvY2tldE9uQ2xvc2UgYWZ0ZXItY2xlYW51cCIpKX0oaSx0KX0pKSx0fSx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXImJmUuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxlfTt0aGlzLmluaXQ9ZnVuY3Rpb24odCl7aWYoTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbih0KSwidHJhbnNwb3J0SGFuZGxlIG11c3QgYmUgYSBmdW5jdGlvbiIpLG51bGw9PT1rLmdldFdlYlNvY2tldFRyYW5zcG9ydClyZXR1cm4gay5nZXRXZWJTb2NrZXRUcmFuc3BvcnQ9dCxzZSgpO3VlKGUud2FybigiV2ViIFNvY2tldCBNYW5hZ2VyIHdhcyBhbHJlYWR5IGluaXRpYWxpemVkIikpfSx0aGlzLm9uSW5pdEZhaWx1cmU9ZnVuY3Rpb24odCl7cmV0dXJuIGUuYWR2YW5jZWRMb2coIkluaXRpYWxpemluZyBXZWJzb2NrZXQgTWFuYWdlciBGYWlsZWQhIiksTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbih0KSwiY2IgbXVzdCBiZSBhIGZ1bmN0aW9uIiksay5pbml0RmFpbHVyZS5hZGQodCksci53ZWJzb2NrZXRJbml0RmFpbGVkJiZ0KCksZnVuY3Rpb24oKXtyZXR1cm4gay5pbml0RmFpbHVyZS5kZWxldGUodCl9fSx0aGlzLm9uQ29ubmVjdGlvbk9wZW49ZnVuY3Rpb24odCl7cmV0dXJuIGUuYWR2YW5jZWRMb2coIldlYnNvY2tldCBjb25uZWN0aW9uIG9wZW4iKSxOLmFzc2VydFRydWUoTi5pc0Z1bmN0aW9uKHQpLCJjYiBtdXN0IGJlIGEgZnVuY3Rpb24iKSxrLmNvbm5lY3Rpb25PcGVuLmFkZCh0KSxmdW5jdGlvbigpe3JldHVybiBrLmNvbm5lY3Rpb25PcGVuLmRlbGV0ZSh0KX19LHRoaXMub25Db25uZWN0aW9uQ2xvc2U9ZnVuY3Rpb24odCl7cmV0dXJuIGUuYWR2YW5jZWRMb2coIldlYnNvY2tldCBjb25uZWN0aW9uIGNsb3NlIiksTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbih0KSwiY2IgbXVzdCBiZSBhIGZ1bmN0aW9uIiksay5jb25uZWN0aW9uQ2xvc2UuYWRkKHQpLGZ1bmN0aW9uKCl7cmV0dXJuIGsuY29ubmVjdGlvbkNsb3NlLmRlbGV0ZSh0KX19LHRoaXMub25Db25uZWN0aW9uR2Fpbj1mdW5jdGlvbih0KXtyZXR1cm4gZS5hZHZhbmNlZExvZygiV2Vic29ja2V0IGNvbm5lY3Rpb24gZ2FpbiIpLE4uYXNzZXJ0VHJ1ZShOLmlzRnVuY3Rpb24odCksImNiIG11c3QgYmUgYSBmdW5jdGlvbiIpLGsuY29ubmVjdGlvbkdhaW4uYWRkKHQpLEgoKSYmdCgpLGZ1bmN0aW9uKCl7cmV0dXJuIGsuY29ubmVjdGlvbkdhaW4uZGVsZXRlKHQpfX0sdGhpcy5vbkNvbm5lY3Rpb25Mb3N0PWZ1bmN0aW9uKHQpe3JldHVybiBlLmFkdmFuY2VkTG9nKCJXZWJzb2NrZXQgY29ubmVjdGlvbiBsb3N0IiksTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbih0KSwiY2IgbXVzdCBiZSBhIGZ1bmN0aW9uIiksay5jb25uZWN0aW9uTG9zdC5hZGQodCksci5jb25uU3RhdGU9PT13JiZ0KCksZnVuY3Rpb24oKXtyZXR1cm4gay5jb25uZWN0aW9uTG9zdC5kZWxldGUodCl9fSx0aGlzLm9uU3Vic2NyaXB0aW9uVXBkYXRlPWZ1bmN0aW9uKGUpe3JldHVybiBOLmFzc2VydFRydWUoTi5pc0Z1bmN0aW9uKGUpLCJjYiBtdXN0IGJlIGEgZnVuY3Rpb24iKSxrLnN1YnNjcmlwdGlvblVwZGF0ZS5hZGQoZSksZnVuY3Rpb24oKXtyZXR1cm4gay5zdWJzY3JpcHRpb25VcGRhdGUuZGVsZXRlKGUpfX0sdGhpcy5vblN1YnNjcmlwdGlvbkZhaWx1cmU9ZnVuY3Rpb24odCl7cmV0dXJuIGUuYWR2YW5jZWRMb2coIldlYnNvY2tldCBzdWJzY3JpcHRpb24gZmFpbHVyZSIpLE4uYXNzZXJ0VHJ1ZShOLmlzRnVuY3Rpb24odCksImNiIG11c3QgYmUgYSBmdW5jdGlvbiIpLGsuc3Vic2NyaXB0aW9uRmFpbHVyZS5hZGQodCksZnVuY3Rpb24oKXtyZXR1cm4gay5zdWJzY3JpcHRpb25GYWlsdXJlLmRlbGV0ZSh0KX19LHRoaXMub25NZXNzYWdlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIE4uYXNzZXJ0Tm90TnVsbChlLCJ0b3BpY05hbWUiKSxOLmFzc2VydFRydWUoTi5pc0Z1bmN0aW9uKHQpLCJjYiBtdXN0IGJlIGEgZnVuY3Rpb24iKSxrLnRvcGljLmhhcyhlKT9rLnRvcGljLmdldChlKS5hZGQodCk6ay50b3BpYy5zZXQoZSxuZXcgU2V0KFt0XSkpLGZ1bmN0aW9uKCl7cmV0dXJuIGsudG9waWMuZ2V0KGUpLmRlbGV0ZSh0KX19LHRoaXMub25BbGxNZXNzYWdlPWZ1bmN0aW9uKGUpe3JldHVybiBOLmFzc2VydFRydWUoTi5pc0Z1bmN0aW9uKGUpLCJjYiBtdXN0IGJlIGEgZnVuY3Rpb24iKSxrLmFsbE1lc3NhZ2UuYWRkKGUpLGZ1bmN0aW9uKCl7cmV0dXJuIGsuYWxsTWVzc2FnZS5kZWxldGUoZSl9fSx0aGlzLnN1YnNjcmliZVRvcGljcz1mdW5jdGlvbihlKXtOLmFzc2VydE5vdE51bGwoZSwidG9waWNzIiksTi5hc3NlcnRJc0xpc3QoZSksZS5mb3JFYWNoKChmdW5jdGlvbihlKXtPLnN1YnNjcmliZWQuaGFzKGUpfHxPLnBlbmRpbmcuYWRkKGUpfSkpLEQuY29uc2VjdXRpdmVOb1Jlc3BvbnNlUmVxdWVzdD0wLGVlKCl9LHRoaXMuc2VuZE1lc3NhZ2U9ZnVuY3Rpb24odCl7aWYoTi5hc3NlcnRJc09iamVjdCh0LCJwYXlsb2FkIiksdm9pZCAwPT09dC50b3BpY3x8eC5oYXModC50b3BpYykpdWUoZS53YXJuKCJDYW5ub3Qgc2VuZCBtZXNzYWdlLCBJbnZhbGlkIHRvcGljIix0KSk7ZWxzZXt0cnl7dD1KU09OLnN0cmluZ2lmeSh0KX1jYXRjaChuKXtyZXR1cm4gdm9pZCB1ZShlLndhcm4oIkVycm9yIHN0cmluZ2lmeSBtZXNzYWdlIix0KSl9SCgpP1coKS5zZW5kKHQpOnVlKGUud2FybigiQ2Fubm90IHNlbmQgbWVzc2FnZSwgd2ViIHNvY2tldCBjb25uZWN0aW9uIGlzIG5vdCBvcGVuIikpfX0sdGhpcy5jbG9zZVdlYlNvY2tldD1mdW5jdGlvbigpe1goKSxZKCksci5yZWNvbm5lY3RXZWJTb2NrZXQ9ITEsY2xlYXJJbnRlcnZhbChNKSxuZSgiVXNlciByZXF1ZXN0IHRvIGNsb3NlIFdlYlNvY2tldCIpfSx0aGlzLnRlcm1pbmF0ZVdlYlNvY2tldE1hbmFnZXI9cmV9LFk9e2NyZWF0ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgWH0sc2V0R2xvYmFsQ29uZmlnOmZ1bmN0aW9uKGUpe3ZhciB0PWUmJmUubG9nZ2VyQ29uZmlnO3oudXBkYXRlTG9nZ2VyQ29uZmlnKHQpfSxMb2dMZXZlbDpCLExvZ2dlcjpGfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByOyFmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgbz17bm90X3N0cmluZzovW15zXS8sbm90X2Jvb2w6L1tedF0vLG5vdF90eXBlOi9bXlRdLyxub3RfcHJpbWl0aXZlOi9bXnZdLyxudW1iZXI6L1tkaWVmZ10vLG51bWVyaWNfYXJnOi9bYmNkaWVmZ3V4WF0vLGpzb246L1tqXS8sbm90X2pzb246L1teal0vLHRleHQ6L15bXlx4MjVdKy8sbW9kdWxvOi9eXHgyNXsyfS8scGxhY2Vob2xkZXI6L15ceDI1KD86KFsxLTldXGQqKVwkfFwoKFteKV0rKVwpKT8oXCspPygwfCdbXiRdKT8oLSk/KFxkKyk/KD86XC4oXGQrKSk/KFtiLWdpam9zdFR1dnhYXSkvLGtleTovXihbYS16X11bYS16X1xkXSopL2ksa2V5X2FjY2VzczovXlwuKFthLXpfXVthLXpfXGRdKikvaSxpbmRleF9hY2Nlc3M6L15cWyhcZCspXF0vLHNpZ246L15bKy1dL307ZnVuY3Rpb24gaShlKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgbixyLHMsYSxjLHUsbCxwLGQsaD0xLGY9ZS5sZW5ndGgsZz0iIjtmb3Iocj0wO3I8ZjtyKyspaWYoInN0cmluZyI9PXR5cGVvZiBlW3JdKWcrPWVbcl07ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIGVbcl0pe2lmKChhPWVbcl0pLmtleXMpZm9yKG49dFtoXSxzPTA7czxhLmtleXMubGVuZ3RoO3MrKyl7aWYobnVsbD09bil0aHJvdyBuZXcgRXJyb3IoaSgnW3NwcmludGZdIENhbm5vdCBhY2Nlc3MgcHJvcGVydHkgIiVzIiBvZiB1bmRlZmluZWQgdmFsdWUgIiVzIicsYS5rZXlzW3NdLGEua2V5c1tzLTFdKSk7bj1uW2Eua2V5c1tzXV19ZWxzZSBuPWEucGFyYW1fbm8/dFthLnBhcmFtX25vXTp0W2grK107aWYoby5ub3RfdHlwZS50ZXN0KGEudHlwZSkmJm8ubm90X3ByaW1pdGl2ZS50ZXN0KGEudHlwZSkmJm4gaW5zdGFuY2VvZiBGdW5jdGlvbiYmKG49bigpKSxvLm51bWVyaWNfYXJnLnRlc3QoYS50eXBlKSYmIm51bWJlciIhPXR5cGVvZiBuJiZpc05hTihuKSl0aHJvdyBuZXcgVHlwZUVycm9yKGkoIltzcHJpbnRmXSBleHBlY3RpbmcgbnVtYmVyIGJ1dCBmb3VuZCAlVCIsbikpO3N3aXRjaChvLm51bWJlci50ZXN0KGEudHlwZSkmJihwPW4+PTApLGEudHlwZSl7Y2FzZSJiIjpuPXBhcnNlSW50KG4sMTApLnRvU3RyaW5nKDIpO2JyZWFrO2Nhc2UiYyI6bj1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KG4sMTApKTticmVhaztjYXNlImQiOmNhc2UiaSI6bj1wYXJzZUludChuLDEwKTticmVhaztjYXNlImoiOm49SlNPTi5zdHJpbmdpZnkobixudWxsLGEud2lkdGg/cGFyc2VJbnQoYS53aWR0aCk6MCk7YnJlYWs7Y2FzZSJlIjpuPWEucHJlY2lzaW9uP3BhcnNlRmxvYXQobikudG9FeHBvbmVudGlhbChhLnByZWNpc2lvbik6cGFyc2VGbG9hdChuKS50b0V4cG9uZW50aWFsKCk7YnJlYWs7Y2FzZSJmIjpuPWEucHJlY2lzaW9uP3BhcnNlRmxvYXQobikudG9GaXhlZChhLnByZWNpc2lvbik6cGFyc2VGbG9hdChuKTticmVhaztjYXNlImciOm49YS5wcmVjaXNpb24/U3RyaW5nKE51bWJlcihuLnRvUHJlY2lzaW9uKGEucHJlY2lzaW9uKSkpOnBhcnNlRmxvYXQobik7YnJlYWs7Y2FzZSJvIjpuPShwYXJzZUludChuLDEwKT4+PjApLnRvU3RyaW5nKDgpO2JyZWFrO2Nhc2UicyI6bj1TdHJpbmcobiksbj1hLnByZWNpc2lvbj9uLnN1YnN0cmluZygwLGEucHJlY2lzaW9uKTpuO2JyZWFrO2Nhc2UidCI6bj1TdHJpbmcoISFuKSxuPWEucHJlY2lzaW9uP24uc3Vic3RyaW5nKDAsYS5wcmVjaXNpb24pOm47YnJlYWs7Y2FzZSJUIjpuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuKS5zbGljZSg4LC0xKS50b0xvd2VyQ2FzZSgpLG49YS5wcmVjaXNpb24/bi5zdWJzdHJpbmcoMCxhLnByZWNpc2lvbik6bjticmVhaztjYXNlInUiOm49cGFyc2VJbnQobiwxMCk+Pj4wO2JyZWFrO2Nhc2UidiI6bj1uLnZhbHVlT2YoKSxuPWEucHJlY2lzaW9uP24uc3Vic3RyaW5nKDAsYS5wcmVjaXNpb24pOm47YnJlYWs7Y2FzZSJ4IjpuPShwYXJzZUludChuLDEwKT4+PjApLnRvU3RyaW5nKDE2KTticmVhaztjYXNlIlgiOm49KHBhcnNlSW50KG4sMTApPj4+MCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9by5qc29uLnRlc3QoYS50eXBlKT9nKz1uOighby5udW1iZXIudGVzdChhLnR5cGUpfHxwJiYhYS5zaWduP2Q9IiI6KGQ9cD8iKyI6Ii0iLG49bi50b1N0cmluZygpLnJlcGxhY2Uoby5zaWduLCIiKSksdT1hLnBhZF9jaGFyPyIwIj09PWEucGFkX2NoYXI/IjAiOmEucGFkX2NoYXIuY2hhckF0KDEpOiIgIixsPWEud2lkdGgtKGQrbikubGVuZ3RoLGM9YS53aWR0aCYmbD4wP3UucmVwZWF0KGwpOiIiLGcrPWEuYWxpZ24/ZCtuK2M6IjAiPT09dT9kK2MrbjpjK2Qrbil9cmV0dXJuIGd9KGZ1bmN0aW9uKGUpe2lmKGFbZV0pcmV0dXJuIGFbZV07Zm9yKHZhciB0LG49ZSxyPVtdLGk9MDtuOyl7aWYobnVsbCE9PSh0PW8udGV4dC5leGVjKG4pKSlyLnB1c2godFswXSk7ZWxzZSBpZihudWxsIT09KHQ9by5tb2R1bG8uZXhlYyhuKSkpci5wdXNoKCIlIik7ZWxzZXtpZihudWxsPT09KHQ9by5wbGFjZWhvbGRlci5leGVjKG4pKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIltzcHJpbnRmXSB1bmV4cGVjdGVkIHBsYWNlaG9sZGVyIik7aWYodFsyXSl7aXw9MTt2YXIgcz1bXSxjPXRbMl0sdT1bXTtpZihudWxsPT09KHU9by5rZXkuZXhlYyhjKSkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJbc3ByaW50Zl0gZmFpbGVkIHRvIHBhcnNlIG5hbWVkIGFyZ3VtZW50IGtleSIpO2ZvcihzLnB1c2godVsxXSk7IiIhPT0oYz1jLnN1YnN0cmluZyh1WzBdLmxlbmd0aCkpOylpZihudWxsIT09KHU9by5rZXlfYWNjZXNzLmV4ZWMoYykpKXMucHVzaCh1WzFdKTtlbHNle2lmKG51bGw9PT0odT1vLmluZGV4X2FjY2Vzcy5leGVjKGMpKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIltzcHJpbnRmXSBmYWlsZWQgdG8gcGFyc2UgbmFtZWQgYXJndW1lbnQga2V5Iik7cy5wdXNoKHVbMV0pfXRbMl09c31lbHNlIGl8PTI7aWYoMz09PWkpdGhyb3cgbmV3IEVycm9yKCJbc3ByaW50Zl0gbWl4aW5nIHBvc2l0aW9uYWwgYW5kIG5hbWVkIHBsYWNlaG9sZGVycyBpcyBub3QgKHlldCkgc3VwcG9ydGVkIik7ci5wdXNoKHtwbGFjZWhvbGRlcjp0WzBdLHBhcmFtX25vOnRbMV0sa2V5czp0WzJdLHNpZ246dFszXSxwYWRfY2hhcjp0WzRdLGFsaWduOnRbNV0sd2lkdGg6dFs2XSxwcmVjaXNpb246dFs3XSx0eXBlOnRbOF19KX1uPW4uc3Vic3RyaW5nKHRbMF0ubGVuZ3RoKX1yZXR1cm4gYVtlXT1yfShlKSxhcmd1bWVudHMpfWZ1bmN0aW9uIHMoZSx0KXtyZXR1cm4gaS5hcHBseShudWxsLFtlXS5jb25jYXQodHx8W10pKX12YXIgYT1PYmplY3QuY3JlYXRlKG51bGwpO3Quc3ByaW50Zj1pLHQudnNwcmludGY9cywidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmKHdpbmRvdy5zcHJpbnRmPWksd2luZG93LnZzcHJpbnRmPXMsdm9pZCAwPT09KHI9ZnVuY3Rpb24oKXtyZXR1cm57c3ByaW50ZjppLHZzcHJpbnRmOnN9fS5jYWxsKHQsbix0LGUpKXx8KGUuZXhwb3J0cz1yKSl9KCl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpLGZ1bmN0aW9uKGUpe24uZCh0LCJXZWJTb2NrZXRNYW5hZ2VyIiwoZnVuY3Rpb24oKXtyZXR1cm4gb30pKTt2YXIgcj1uKDApO2UuY29ubmVjdD1lLmNvbm5lY3R8fHt9LGNvbm5lY3QuV2ViU29ja2V0TWFuYWdlcj1yLmE7dmFyIG89ci5hfS5jYWxsKHRoaXMsbigzKSl9LGZ1bmN0aW9uKGUsdCl7dmFyIG47bj1mdW5jdGlvbigpe3JldHVybiB0aGlzfSgpO3RyeXtuPW58fG5ldyBGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpfWNhdGNoKGUpeyJvYmplY3QiPT10eXBlb2Ygd2luZG93JiYobj13aW5kb3cpfWUuZXhwb3J0cz1ufV0pfSwxNTE6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dDt2YXIgbj17VEVTVDoiVEVTVCIsVFJBQ0U6IlRSQUNFIixERUJVRzoiREVCVUciLElORk86IklORk8iLExPRzoiTE9HIixXQVJOOiJXQVJOIixFUlJPUjoiRVJST1IiLENSSVRJQ0FMOiJDUklUSUNBTCJ9LHI9e0NDUDoiY2NwIixTT0ZUUEhPTkU6InNvZnRwaG9uZSIsQ0hBVDoiY2hhdCIsVEFTSzoidGFzayJ9LG89e1RFU1Q6MCxUUkFDRToxMCxERUJVRzoyMCxJTkZPOjMwLExPRzo0MCxXQVJOOjUwLEVSUk9SOjEwMCxDUklUSUNBTDoyMDB9LGk9IkNDUCIscz0iU2hhcmVkV29ya2VyIixhPSJDUk0iLGM9e1RSQUNFOmZ1bmN0aW9uKGUpe2NvbnNvbGUuaW5mbyhlKX0sREVCVUc6ZnVuY3Rpb24oZSl7Y29uc29sZS5pbmZvKGUpfSxJTkZPOmZ1bmN0aW9uKGUpe2NvbnNvbGUuaW5mbyhlKX0sTE9HOmZ1bmN0aW9uKGUpe2NvbnNvbGUubG9nKGUpfSxURVNUOmZ1bmN0aW9uKGUpe2NvbnNvbGUubG9nKGUpfSxXQVJOOmZ1bmN0aW9uKGUpe2NvbnNvbGUud2FybihlKX0sRVJST1I6ZnVuY3Rpb24oZSl7Y29uc29sZS5lcnJvcihlKX0sQ1JJVElDQUw6ZnVuY3Rpb24oZSl7Y29uc29sZS5lcnJvcihlKX19LHU9ZnVuY3Rpb24oZSl7dmFyIHQsbixvPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUsMCksaT1vLnNoaWZ0KCk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybi0xIT09T2JqZWN0LnZhbHVlcyhyKS5pbmRleE9mKGUpfShpKT8obj1pLHQ9by5zaGlmdCgpKToodD1pLG49ci5DQ1ApLHtmb3JtYXQ6dCxjb21wb25lbnQ6bixhcmdzOm99fSxsPWZ1bmN0aW9uKGUsbixyLG8sYyx1KXt0aGlzLmNvbXBvbmVudD1lLHRoaXMubGV2ZWw9bix0aGlzLnRleHQ9cix0aGlzLnRpbWU9bmV3IERhdGUsdGhpcy50YWJJZD1udWxsPT09Yz9udWxsOmN8fHQuY29yZS50YWJJZCx0aGlzLmV4Y2VwdGlvbj1udWxsLHRoaXMub2JqZWN0cz1bXSx0aGlzLmxpbmU9MCx0aGlzLmFnZW50UmVzb3VyY2VJZD1udWxsO3RyeXt0LmFnZW50LmluaXRpYWxpemVkJiYodGhpcy5hZ2VudFJlc291cmNlSWQ9KG5ldyB0LkFnZW50KS5fZ2V0UmVzb3VyY2VJZCgpKX1jYXRjaChlKXtjb25zb2xlLmxvZygiSXNzdWUgZmluZGluZyBhZ2VudFJlc291cmNlSWQ6ICIsZSl9dGhpcy5sb2dnZXJJZD1vLHU/dGhpcy5jb250ZXh0TGF5ZXI9dTp0LmlzU2hhcmVkV29ya2VyKCk/dGhpcy5jb250ZXh0TGF5ZXI9czp0LmlzQ1JNKCk/dGhpcy5jb250ZXh0TGF5ZXI9YTp0LmlzQ0NQKCkmJih0aGlzLmNvbnRleHRMYXllcj1pKX07bC5mcm9tT2JqZWN0PWZ1bmN0aW9uKGUpe3ZhciB0PWUudGFiSWR8fG51bGwsbj1lLmNvbnRleHRMYXllcnx8bnVsbCxvPW5ldyBsKHIuQ0NQLGUubGV2ZWwsZS50ZXh0LGUubG9nZ2VySWQsdCxuKTtyZXR1cm4iW29iamVjdCBEYXRlXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZS50aW1lKT9vLnRpbWU9bmV3IERhdGUoZS50aW1lLmdldFRpbWUoKSk6Im51bWJlciI9PXR5cGVvZiBlLnRpbWU/by50aW1lPW5ldyBEYXRlKGUudGltZSk6InN0cmluZyI9PXR5cGVvZiBlLnRpbWU/by50aW1lPURhdGUucGFyc2UoZS50aW1lKTpvLnRpbWU9bmV3IERhdGUsby5leGNlcHRpb249ZS5leGNlcHRpb24sby5vYmplY3RzPWUub2JqZWN0cyxvfTt2YXIgcD1mdW5jdGlvbihlKXt2YXIgdD0vQXV0aFRva2VuLipcPS9nO2UmJiJvYmplY3QiPT10eXBlb2YgZSYmT2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24obil7Im9iamVjdCI9PXR5cGVvZiBlW25dP3AoZVtuXSk6InN0cmluZyI9PXR5cGVvZiBlW25dJiYoInVybCI9PT1ufHwidGV4dCI9PT1uP2Vbbl09ZVtuXS5yZXBsYWNlKHQsIltyZWRhY3RlZF0iKTpbInF1aWNrQ29ubmVjdE5hbWUiXS5pbmNsdWRlcyhuKT9lW25dPSJbcmVkYWN0ZWRdIjpbImN1c3RvbWVySWQiLCJDdXN0b21lcklkIiwiU3BlYWtlcklkIiwiQ3VzdG9tZXJTcGVha2VySWQiXS5pbmNsdWRlcyhuKSYmKGVbbl09YFtvYmZ1c2NhdGVkIHZhbHVlXSAke21kNShlW25dKX1gKSl9KSl9LGQ9ZnVuY3Rpb24oZSl7aWYodGhpcy50eXBlPWUgaW5zdGFuY2VvZiBFcnJvcj9lLm5hbWU6ZS5jb2RlfHxPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSksdGhpcy5tZXNzYWdlPWUubWVzc2FnZSx0aGlzLnN0YWNrPVtdLGUuc3RhY2spdHJ5e0FycmF5LmlzQXJyYXkoZS5zdGFjayk/dGhpcy5zdGFjaz1lLnN0YWNrOiJvYmplY3QiPT10eXBlb2YgZS5zdGFjaz90aGlzLnN0YWNrPVtKU09OLnN0cmluZ2lmeShlLnN0YWNrKV06InN0cmluZyI9PXR5cGVvZiBlLnN0YWNrJiYodGhpcy5zdGFjaz1lLnN0YWNrLnNwbGl0KCJcbiIpKX1jYXRjaHt9fTtsLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0LnNwcmludGYoIlslc10gWyVzXSBbJXNdOiAlcyIsdGhpcy5nZXRUaW1lKCkmJnRoaXMuZ2V0VGltZSgpLnRvSVNPU3RyaW5nP3RoaXMuZ2V0VGltZSgpLnRvSVNPU3RyaW5nKCk6Ij8/PyIsdGhpcy5nZXRMZXZlbCgpLHRoaXMuZ2V0QWdlbnRSZXNvdXJjZUlkKCksdGhpcy5nZXRUZXh0KCkpfSxsLnByb3RvdHlwZS5nZXRUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGltZX0sbC5wcm90b3R5cGUuZ2V0QWdlbnRSZXNvdXJjZUlkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWdlbnRSZXNvdXJjZUlkfSxsLnByb3RvdHlwZS5nZXRUYWJJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRhYklkfSxsLnByb3RvdHlwZS5nZXRDb250ZXh0TGF5ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250ZXh0TGF5ZXJ9LGwucHJvdG90eXBlLmdldExldmVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGV2ZWx9LGwucHJvdG90eXBlLmdldFRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXh0fSxsLnByb3RvdHlwZS5nZXRDb21wb25lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb21wb25lbnR9LGwucHJvdG90eXBlLndpdGhFeGNlcHRpb249ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZXhjZXB0aW9uPW5ldyBkKGUpLHRoaXN9LGwucHJvdG90eXBlLndpdGhPYmplY3Q9ZnVuY3Rpb24oZSl7dmFyIG49dC5kZWVwY29weShlKTtyZXR1cm4gcChuKSx0aGlzLm9iamVjdHMucHVzaChuKSx0aGlzfSxsLnByb3RvdHlwZS53aXRoQ3Jvc3NPcmlnaW5FdmVudE9iamVjdD1mdW5jdGlvbihlKXt2YXIgbj10LmRlZXBjb3B5Q3Jvc3NPcmlnaW5FdmVudChlKTtyZXR1cm4gcChuKSx0aGlzLm9iamVjdHMucHVzaChuKSx0aGlzfSxsLnByb3RvdHlwZS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcj1mdW5jdGlvbigpe3JldHVybiB0LmdldExvZygpLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncy5wdXNoKHRoaXMpLHRoaXN9O3ZhciBoPWZ1bmN0aW9uKCl7dGhpcy5fbG9ncz1bXSx0aGlzLl9yb2xsZWRMb2dzPVtdLHRoaXMuX2xvZ3NUb1B1c2g9W10sdGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3M9W10sdGhpcy5fZWNob0xldmVsPW8uSU5GTyx0aGlzLl9sb2dMZXZlbD1vLklORk8sdGhpcy5fbGluZUNvdW50PTAsdGhpcy5fbG9nUm9sbEludGVydmFsPTAsdGhpcy5fbG9nUm9sbFRpbWVyPW51bGwsdGhpcy5fbG9nZ2VySWQ9KG5ldyBEYXRlKS5nZXRUaW1lKCkrIi0iK01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpLHRoaXMuc2V0TG9nUm9sbEludGVydmFsKDE4ZTUpLHRoaXMuX3N0YXJ0TG9nSW5kZXhUb1B1c2g9MH07aC5wcm90b3R5cGUuc2V0TG9nUm9sbEludGVydmFsPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXM7dGhpcy5fbG9nUm9sbFRpbWVyJiZ0PT09dGhpcy5fbG9nUm9sbEludGVydmFsP3RoaXMud2FybigiTG9nZ2VyIGlzIGFscmVhZHkgc2V0IHRvIHRoZSBnaXZlbiBpbnRlcnZhbDogJWQiLHRoaXMuX2xvZ1JvbGxJbnRlcnZhbCk6KHRoaXMuX2xvZ1JvbGxUaW1lciYmZS5jbGVhckludGVydmFsKHRoaXMuX2xvZ1JvbGxUaW1lciksdGhpcy5fbG9nUm9sbEludGVydmFsPXQsdGhpcy5fbG9nUm9sbFRpbWVyPWUuc2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7bi5fcm9sbGVkTG9ncz1uLl9sb2dzLG4uX2xvZ3M9W10sbi5fc3RhcnRMb2dJbmRleFRvUHVzaD0wLG4uaW5mbygiTG9nIHJvbGwgaW50ZXJ2YWwgb2NjdXJyZWQuIil9KSx0aGlzLl9sb2dSb2xsSW50ZXJ2YWwpKX0saC5wcm90b3R5cGUuc2V0TG9nTGV2ZWw9ZnVuY3Rpb24oZSl7aWYoIShlIGluIG8pKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBsb2dnaW5nIGxldmVsOiAiK2UpO3RoaXMuX2xvZ0xldmVsPW9bZV19LGgucHJvdG90eXBlLnNldEVjaG9MZXZlbD1mdW5jdGlvbihlKXtpZighKGUgaW4gbykpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGxvZ2dpbmcgbGV2ZWw6ICIrZSk7dGhpcy5fZWNob0xldmVsPW9bZV19LGgucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uZXcgbChlLHQsbix0aGlzLmdldExvZ2dlcklkKCkpO3JldHVybiBwKHIpLHRoaXMuYWRkTG9nRW50cnkocikscn0saC5wcm90b3R5cGUuYWRkTG9nRW50cnk9ZnVuY3Rpb24oZSl7cChlKSx0aGlzLl9sb2dzLnB1c2goZSksci5TT0ZUUEhPTkU9PT1lLmNvbXBvbmVudCYmdGhpcy5fbG9nc1RvUHVzaC5wdXNoKGUpLGUubGV2ZWwgaW4gbyYmb1tlLmxldmVsXT49dGhpcy5fbG9nTGV2ZWwmJihvW2UubGV2ZWxdPj10aGlzLl9lY2hvTGV2ZWwmJmNbZS5nZXRMZXZlbCgpXShlLnRvU3RyaW5nKCkpLGUubGluZT10aGlzLl9saW5lQ291bnQrKyl9LGgucHJvdG90eXBlLnNlbmRJbnRlcm5hbExvZ0VudHJ5VG9TZXJ2ZXI9ZnVuY3Rpb24oZSl7dGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MucHVzaChlKSxlLmxldmVsIGluIG8mJm9bZS5sZXZlbF0+PXRoaXMuX2xvZ0xldmVsJiYob1tlLmxldmVsXT49dGhpcy5fZWNob0xldmVsJiZjW2UuZ2V0TGV2ZWwoKV0oZS50b1N0cmluZygpKSxlLmxpbmU9dGhpcy5fbGluZUNvdW50KyspfSxoLnByb3RvdHlwZS5jbGVhck9iamVjdHM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHRoaXMuX2xvZ3MubGVuZ3RoO2UrKyl0aGlzLl9sb2dzW2VdLm9iamVjdHMmJmRlbGV0ZSB0aGlzLl9sb2dzW2VdLm9iamVjdHN9LGgucHJvdG90eXBlLmNsZWFyRXhjZXB0aW9ucz1mdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8dGhpcy5fbG9ncy5sZW5ndGg7ZSsrKXRoaXMuX2xvZ3NbZV0uZXhjZXB0aW9uJiZkZWxldGUgdGhpcy5fbG9nc1tlXS5leGNlcHRpb259LGgucHJvdG90eXBlLnRyYWNlPWZ1bmN0aW9uKCl7dmFyIGU9dShhcmd1bWVudHMpO3JldHVybiB0aGlzLndyaXRlKGUuY29tcG9uZW50LG4uVFJBQ0UsdC52c3ByaW50ZihlLmZvcm1hdCxlLmFyZ3MpKX0saC5wcm90b3R5cGUuZGVidWc9ZnVuY3Rpb24oKXt2YXIgZT11KGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMud3JpdGUoZS5jb21wb25lbnQsbi5ERUJVRyx0LnZzcHJpbnRmKGUuZm9ybWF0LGUuYXJncykpfSxoLnByb3RvdHlwZS5pbmZvPWZ1bmN0aW9uKCl7dmFyIGU9dShhcmd1bWVudHMpO3JldHVybiB0aGlzLndyaXRlKGUuY29tcG9uZW50LG4uSU5GTyx0LnZzcHJpbnRmKGUuZm9ybWF0LGUuYXJncykpfSxoLnByb3RvdHlwZS5sb2c9ZnVuY3Rpb24oKXt2YXIgZT11KGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMud3JpdGUoZS5jb21wb25lbnQsbi5MT0csdC52c3ByaW50ZihlLmZvcm1hdCxlLmFyZ3MpKX0saC5wcm90b3R5cGUudGVzdD1mdW5jdGlvbigpe3ZhciBlPXUoYXJndW1lbnRzKTtyZXR1cm4gdGhpcy53cml0ZShlLmNvbXBvbmVudCxuLlRFU1QsdC52c3ByaW50ZihlLmZvcm1hdCxlLmFyZ3MpKX0saC5wcm90b3R5cGUud2Fybj1mdW5jdGlvbigpe3ZhciBlPXUoYXJndW1lbnRzKTtyZXR1cm4gdGhpcy53cml0ZShlLmNvbXBvbmVudCxuLldBUk4sdC52c3ByaW50ZihlLmZvcm1hdCxlLmFyZ3MpKX0saC5wcm90b3R5cGUuZXJyb3I9ZnVuY3Rpb24oKXt2YXIgZT11KGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMud3JpdGUoZS5jb21wb25lbnQsbi5FUlJPUix0LnZzcHJpbnRmKGUuZm9ybWF0LGUuYXJncykpfSxoLnByb3RvdHlwZS5jcml0aWNhbD1mdW5jdGlvbigpe3ZhciBlPXUoYXJndW1lbnRzKTtyZXR1cm4gdGhpcy53cml0ZShlLmNvbXBvbmVudCxuLkVSUk9SLHQudnNwcmludGYoZS5mb3JtYXQsZS5hcmdzKSl9LGgucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9MDt0PHRoaXMuX2xvZ3MubGVuZ3RoO3QrKyllLnB1c2godGhpcy5fbG9nc1t0XS50b1N0cmluZygpKTtyZXR1cm4gZS5qb2luKCJcbiIpfSxoLnByb3RvdHlwZS5kb3dubG9hZD1mdW5jdGlvbih0KXt2YXIgbj0iYWdlbnQtbG9nIixyPSExOyJvYmplY3QiPT10eXBlb2YgdD8obj10LmxvZ05hbWV8fG4scj10LmZpbHRlckJ5TG9nTGV2ZWx8fHIpOiJzdHJpbmciPT10eXBlb2YgdCYmKG49dHx8bik7dmFyIGk9dGhpcyxzPXRoaXMuX3JvbGxlZExvZ3MuY29uY2F0KHRoaXMuX2xvZ3MpO3ImJihzPXMuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gb1tlLmxldmVsXT49aS5fbG9nTGV2ZWx9KSkpO3ZhciBhPW5ldyBlLkJsb2IoW0pTT04uc3RyaW5naWZ5KHMsdm9pZCAwLDQpXSxbInRleHQvcGxhaW4iXSksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7bj1ufHwiYWdlbnQtbG9nIixjLmhyZWY9ZS5VUkwuY3JlYXRlT2JqZWN0VVJMKGEpLGMuZG93bmxvYWQ9bisiLnR4dCIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjKSxjLmNsaWNrKCksZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChjKX0saC5wcm90b3R5cGUuc2NoZWR1bGVVcHN0cmVhbUxvZ1B1c2g9ZnVuY3Rpb24obil7dC51cHN0cmVhbUxvZ1B1c2hTY2hlZHVsZWR8fCh0LnVwc3RyZWFtTG9nUHVzaFNjaGVkdWxlZD0hMCxlLnNldEludGVydmFsKHQuaGl0Y2godGhpcyx0aGlzLnJlcG9ydE1hc3RlckxvZ3NVcFN0cmVhbSxuKSw1ZTMpKX0saC5wcm90b3R5cGUucmVwb3J0TWFzdGVyTG9nc1VwU3RyZWFtPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMuX2xvZ3NUb1B1c2guc2xpY2UoKTt0aGlzLl9sb2dzVG9QdXNoPVtdLHQuaWZNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuU0VORF9MT0dTLChmdW5jdGlvbigpe24ubGVuZ3RoPjAmJmUuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLlNFTkRfTE9HUyxuKX0pKX0saC5wcm90b3R5cGUuc2NoZWR1bGVVcHN0cmVhbU91dGVyQ29udGV4dENDUHNlcnZlckJvdW5kTG9nc1B1c2g9ZnVuY3Rpb24obil7ZS5zZXRJbnRlcnZhbCh0LmhpdGNoKHRoaXMsdGhpcy5wdXNoT3V0ZXJDb250ZXh0Q0NQc2VydmVyQm91bmRMb2dzVXBzdHJlYW0sbiksMWUzKX0saC5wcm90b3R5cGUuc2NoZWR1bGVVcHN0cmVhbU91dGVyQ29udGV4dENDUExvZ3NQdXNoPWZ1bmN0aW9uKG4pe2Uuc2V0SW50ZXJ2YWwodC5oaXRjaCh0aGlzLHRoaXMucHVzaE91dGVyQ29udGV4dENDUExvZ3NVcHN0cmVhbSxuKSwxZTMpfSxoLnByb3RvdHlwZS5wdXNoT3V0ZXJDb250ZXh0Q0NQc2VydmVyQm91bmRMb2dzVXBzdHJlYW09ZnVuY3Rpb24oZSl7aWYodGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MubGVuZ3RoPjApe2Zvcih2YXIgbj0wO248dGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MubGVuZ3RoO24rKyl0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9nc1tuXS50ZXh0PXRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzW25dLnRleHQ7ZS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuU0VSVkVSX0JPVU5EX0lOVEVSTkFMX0xPRyx0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncyksdGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3M9W119fSxoLnByb3RvdHlwZS5wdXNoT3V0ZXJDb250ZXh0Q0NQTG9nc1Vwc3RyZWFtPWZ1bmN0aW9uKGUpe2Zvcih2YXIgbj10aGlzLl9zdGFydExvZ0luZGV4VG9QdXNoO248dGhpcy5fbG9ncy5sZW5ndGg7bisrKXRoaXMuX2xvZ3Nbbl0ubG9nZ2VySWQ9PT10aGlzLl9sb2dnZXJJZCYmZS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuTE9HLHRoaXMuX2xvZ3Nbbl0pO3RoaXMuX3N0YXJ0TG9nSW5kZXhUb1B1c2g9dGhpcy5fbG9ncy5sZW5ndGh9LGgucHJvdG90eXBlLmdldExvZ2dlcklkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xvZ2dlcklkfSxoLnByb3RvdHlwZS5zY2hlZHVsZURvd25zdHJlYW1DbGllbnRTaWRlTG9nc1B1c2g9ZnVuY3Rpb24oKXtlLnNldEludGVydmFsKHQuaGl0Y2godGhpcyx0aGlzLnB1c2hDbGllbnRTaWRlTG9nc0Rvd25zdHJlYW0pLDVlMyl9LGgucHJvdG90eXBlLnB1c2hDbGllbnRTaWRlTG9nc0Rvd25zdHJlYW09ZnVuY3Rpb24oKXt2YXIgZT1bXTt0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncy5sZW5ndGg8NTB8fCh0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncy5sZW5ndGg+NTAwP2U9dGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3Muc3BsaWNlKDAsNTAwKTooZT10aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncyx0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncz1bXSksdC5wdWJsaXNoQ2xpZW50U2lkZUxvZ3MoZSkpfTt2YXIgZj1mdW5jdGlvbihuKXtoLmNhbGwodGhpcyksdGhpcy5jb25kdWl0PW4sZS5zZXRJbnRlcnZhbCh0LmhpdGNoKHRoaXMsdGhpcy5fcHVzaExvZ3NEb3duc3RyZWFtKSxmLkxPR19QVVNIX0lOVEVSVkFMKSxlLmNsZWFySW50ZXJ2YWwodGhpcy5fbG9nUm9sbFRpbWVyKSx0aGlzLl9sb2dSb2xsVGltZXI9bnVsbH07Zi5MT0dfUFVTSF9JTlRFUlZBTD0xZTMsZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShoLnByb3RvdHlwZSksZi5wcm90b3R5cGUuY29uc3RydWN0b3I9ZixmLnByb3RvdHlwZS5wdXNoTG9nc0Rvd25zdHJlYW09ZnVuY3Rpb24oZSl7dmFyIG49dGhpcztlLmZvckVhY2goKGZ1bmN0aW9uKGUpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5MT0csZSl9KSl9LGYucHJvdG90eXBlLl9wdXNoTG9nc0Rvd25zdHJlYW09ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuX2xvZ3MuZm9yRWFjaCgoZnVuY3Rpb24obil7ZS5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkxPRyxuKX0pKSx0aGlzLl9sb2dzPVtdO2Zvcih2YXIgbj0wO248dGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MubGVuZ3RoO24rKyl0aGlzLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuU0VSVkVSX0JPVU5EX0lOVEVSTkFMX0xPRyx0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9nc1tuXSk7dGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3M9W119O3ZhciBnPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe3RyeXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9Y2F0Y2goZSl7Yy5FUlJPUihlKX19fTt0LnJvb3RMb2dnZXI9bmV3IGgsZnVuY3Rpb24oZSl7Zm9yKHZhciB0IGluIGUpImZ1bmN0aW9uIj09dHlwZW9mIGVbdF0mJihlW3RdPWcoZVt0XSkpfSh0LnJvb3RMb2dnZXIpLCh0PXR8fHt9KS5nZXRMb2c9ZnVuY3Rpb24oKXtyZXR1cm4gdC5yb290TG9nZ2VyfSx0LkxvZ0VudHJ5PWwsdC5Mb2dnZXI9aCx0LkxvZ0xldmVsPW4sdC5Mb2dDb21wb25lbnQ9cix0LkRvd25zdHJlYW1Db25kdWl0TG9nZ2VyPWZ9KCl9LDE2MzpmdW5jdGlvbigpeyFmdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUsdCl7dmFyIG49KDY1NTM1JmUpKyg2NTUzNSZ0KTtyZXR1cm4oZT4+MTYpKyh0Pj4xNikrKG4+PjE2KTw8MTZ8NjU1MzUmbn1mdW5jdGlvbiBuKGUsbixyLG8saSxzKXtyZXR1cm4gdCgoYT10KHQobixlKSx0KG8scykpKTw8KGM9aSl8YT4+PjMyLWMscik7dmFyIGEsY31mdW5jdGlvbiByKGUsdCxyLG8saSxzLGEpe3JldHVybiBuKHQmcnx+dCZvLGUsdCxpLHMsYSl9ZnVuY3Rpb24gbyhlLHQscixvLGkscyxhKXtyZXR1cm4gbih0Jm98ciZ+byxlLHQsaSxzLGEpfWZ1bmN0aW9uIGkoZSx0LHIsbyxpLHMsYSl7cmV0dXJuIG4odF5yXm8sZSx0LGkscyxhKX1mdW5jdGlvbiBzKGUsdCxyLG8saSxzLGEpe3JldHVybiBuKHJeKHR8fm8pLGUsdCxpLHMsYSl9ZnVuY3Rpb24gYShlLG4pe3ZhciBhLGMsdSxsLHA7ZVtuPj41XXw9MTI4PDxuJTMyLGVbMTQrKG4rNjQ+Pj45PDw0KV09bjt2YXIgZD0xNzMyNTg0MTkzLGg9LTI3MTczMzg3OSxmPS0xNzMyNTg0MTk0LGc9MjcxNzMzODc4O2ZvcihhPTA7YTxlLmxlbmd0aDthKz0xNiljPWQsdT1oLGw9ZixwPWcsZD1yKGQsaCxmLGcsZVthXSw3LC02ODA4NzY5MzYpLGc9cihnLGQsaCxmLGVbYSsxXSwxMiwtMzg5NTY0NTg2KSxmPXIoZixnLGQsaCxlW2ErMl0sMTcsNjA2MTA1ODE5KSxoPXIoaCxmLGcsZCxlW2ErM10sMjIsLTEwNDQ1MjUzMzApLGQ9cihkLGgsZixnLGVbYSs0XSw3LC0xNzY0MTg4OTcpLGc9cihnLGQsaCxmLGVbYSs1XSwxMiwxMjAwMDgwNDI2KSxmPXIoZixnLGQsaCxlW2ErNl0sMTcsLTE0NzMyMzEzNDEpLGg9cihoLGYsZyxkLGVbYSs3XSwyMiwtNDU3MDU5ODMpLGQ9cihkLGgsZixnLGVbYSs4XSw3LDE3NzAwMzU0MTYpLGc9cihnLGQsaCxmLGVbYSs5XSwxMiwtMTk1ODQxNDQxNyksZj1yKGYsZyxkLGgsZVthKzEwXSwxNywtNDIwNjMpLGg9cihoLGYsZyxkLGVbYSsxMV0sMjIsLTE5OTA0MDQxNjIpLGQ9cihkLGgsZixnLGVbYSsxMl0sNywxODA0NjAzNjgyKSxnPXIoZyxkLGgsZixlW2ErMTNdLDEyLC00MDM0MTEwMSksZj1yKGYsZyxkLGgsZVthKzE0XSwxNywtMTUwMjAwMjI5MCksZD1vKGQsaD1yKGgsZixnLGQsZVthKzE1XSwyMiwxMjM2NTM1MzI5KSxmLGcsZVthKzFdLDUsLTE2NTc5NjUxMCksZz1vKGcsZCxoLGYsZVthKzZdLDksLTEwNjk1MDE2MzIpLGY9byhmLGcsZCxoLGVbYSsxMV0sMTQsNjQzNzE3NzEzKSxoPW8oaCxmLGcsZCxlW2FdLDIwLC0zNzM4OTczMDIpLGQ9byhkLGgsZixnLGVbYSs1XSw1LC03MDE1NTg2OTEpLGc9byhnLGQsaCxmLGVbYSsxMF0sOSwzODAxNjA4MyksZj1vKGYsZyxkLGgsZVthKzE1XSwxNCwtNjYwNDc4MzM1KSxoPW8oaCxmLGcsZCxlW2ErNF0sMjAsLTQwNTUzNzg0OCksZD1vKGQsaCxmLGcsZVthKzldLDUsNTY4NDQ2NDM4KSxnPW8oZyxkLGgsZixlW2ErMTRdLDksLTEwMTk4MDM2OTApLGY9byhmLGcsZCxoLGVbYSszXSwxNCwtMTg3MzYzOTYxKSxoPW8oaCxmLGcsZCxlW2ErOF0sMjAsMTE2MzUzMTUwMSksZD1vKGQsaCxmLGcsZVthKzEzXSw1LC0xNDQ0NjgxNDY3KSxnPW8oZyxkLGgsZixlW2ErMl0sOSwtNTE0MDM3ODQpLGY9byhmLGcsZCxoLGVbYSs3XSwxNCwxNzM1MzI4NDczKSxkPWkoZCxoPW8oaCxmLGcsZCxlW2ErMTJdLDIwLC0xOTI2NjA3NzM0KSxmLGcsZVthKzVdLDQsLTM3ODU1OCksZz1pKGcsZCxoLGYsZVthKzhdLDExLC0yMDIyNTc0NDYzKSxmPWkoZixnLGQsaCxlW2ErMTFdLDE2LDE4MzkwMzA1NjIpLGg9aShoLGYsZyxkLGVbYSsxNF0sMjMsLTM1MzA5NTU2KSxkPWkoZCxoLGYsZyxlW2ErMV0sNCwtMTUzMDk5MjA2MCksZz1pKGcsZCxoLGYsZVthKzRdLDExLDEyNzI4OTMzNTMpLGY9aShmLGcsZCxoLGVbYSs3XSwxNiwtMTU1NDk3NjMyKSxoPWkoaCxmLGcsZCxlW2ErMTBdLDIzLC0xMDk0NzMwNjQwKSxkPWkoZCxoLGYsZyxlW2ErMTNdLDQsNjgxMjc5MTc0KSxnPWkoZyxkLGgsZixlW2FdLDExLC0zNTg1MzcyMjIpLGY9aShmLGcsZCxoLGVbYSszXSwxNiwtNzIyNTIxOTc5KSxoPWkoaCxmLGcsZCxlW2ErNl0sMjMsNzYwMjkxODkpLGQ9aShkLGgsZixnLGVbYSs5XSw0LC02NDAzNjQ0ODcpLGc9aShnLGQsaCxmLGVbYSsxMl0sMTEsLTQyMTgxNTgzNSksZj1pKGYsZyxkLGgsZVthKzE1XSwxNiw1MzA3NDI1MjApLGQ9cyhkLGg9aShoLGYsZyxkLGVbYSsyXSwyMywtOTk1MzM4NjUxKSxmLGcsZVthXSw2LC0xOTg2MzA4NDQpLGc9cyhnLGQsaCxmLGVbYSs3XSwxMCwxMTI2ODkxNDE1KSxmPXMoZixnLGQsaCxlW2ErMTRdLDE1LC0xNDE2MzU0OTA1KSxoPXMoaCxmLGcsZCxlW2ErNV0sMjEsLTU3NDM0MDU1KSxkPXMoZCxoLGYsZyxlW2ErMTJdLDYsMTcwMDQ4NTU3MSksZz1zKGcsZCxoLGYsZVthKzNdLDEwLC0xODk0OTg2NjA2KSxmPXMoZixnLGQsaCxlW2ErMTBdLDE1LC0xMDUxNTIzKSxoPXMoaCxmLGcsZCxlW2ErMV0sMjEsLTIwNTQ5MjI3OTkpLGQ9cyhkLGgsZixnLGVbYSs4XSw2LDE4NzMzMTMzNTkpLGc9cyhnLGQsaCxmLGVbYSsxNV0sMTAsLTMwNjExNzQ0KSxmPXMoZixnLGQsaCxlW2ErNl0sMTUsLTE1NjAxOTgzODApLGg9cyhoLGYsZyxkLGVbYSsxM10sMjEsMTMwOTE1MTY0OSksZD1zKGQsaCxmLGcsZVthKzRdLDYsLTE0NTUyMzA3MCksZz1zKGcsZCxoLGYsZVthKzExXSwxMCwtMTEyMDIxMDM3OSksZj1zKGYsZyxkLGgsZVthKzJdLDE1LDcxODc4NzI1OSksaD1zKGgsZixnLGQsZVthKzldLDIxLC0zNDM0ODU1NTEpLGQ9dChkLGMpLGg9dChoLHUpLGY9dChmLGwpLGc9dChnLHApO3JldHVybltkLGgsZixnXX1mdW5jdGlvbiBjKGUpe3ZhciB0LG49IiIscj0zMiplLmxlbmd0aDtmb3IodD0wO3Q8cjt0Kz04KW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoZVt0Pj41XT4+PnQlMzImMjU1KTtyZXR1cm4gbn1mdW5jdGlvbiB1KGUpe3ZhciB0LG49W107Zm9yKG5bKGUubGVuZ3RoPj4yKS0xXT12b2lkIDAsdD0wO3Q8bi5sZW5ndGg7dCs9MSluW3RdPTA7dmFyIHI9OCplLmxlbmd0aDtmb3IodD0wO3Q8cjt0Kz04KW5bdD4+NV18PSgyNTUmZS5jaGFyQ29kZUF0KHQvOCkpPDx0JTMyO3JldHVybiBufWZ1bmN0aW9uIGwoZSl7dmFyIHQsbixyPSIwMTIzNDU2Nzg5YWJjZGVmIixvPSIiO2ZvcihuPTA7bjxlLmxlbmd0aDtuKz0xKXQ9ZS5jaGFyQ29kZUF0KG4pLG8rPXIuY2hhckF0KHQ+Pj40JjE1KStyLmNoYXJBdCgxNSZ0KTtyZXR1cm4gb31mdW5jdGlvbiBwKGUpe3JldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZSkpfWZ1bmN0aW9uIGQoZSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBjKGEodShlKSw4KmUubGVuZ3RoKSl9KHAoZSkpfWZ1bmN0aW9uIGgoZSx0KXtyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgbixyLG89dShlKSxpPVtdLHM9W107Zm9yKGlbMTVdPXNbMTVdPXZvaWQgMCxvLmxlbmd0aD4xNiYmKG89YShvLDgqZS5sZW5ndGgpKSxuPTA7bjwxNjtuKz0xKWlbbl09OTA5NTIyNDg2Xm9bbl0sc1tuXT0xNTQ5NTU2ODI4Xm9bbl07cmV0dXJuIHI9YShpLmNvbmNhdCh1KHQpKSw1MTIrOCp0Lmxlbmd0aCksYyhhKHMuY29uY2F0KHIpLDY0MCkpfShwKGUpLHAodCkpfSh0aGlzfHxnbG9iYWxUaGlzKS5tZDU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0P24/aCh0LGUpOmwoaCh0LGUpKTpuP2QoZSk6bChkKGUpKX19KCl9LDQzOTooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LHQuQ2hhdE1lZGlhQ29udHJvbGxlcj1mdW5jdGlvbihlLG4pe3ZhciByPXQuZ2V0TG9nKCksbz10LkxvZ0NvbXBvbmVudC5DSEFULGk9ZnVuY3Rpb24obixyKXt0LnB1Ymxpc2hNZXRyaWMoe25hbWU6bixjb250YWN0SWQ6ZS5jb250YWN0SWQsZGF0YTpyfHxlfSl9LHM9ZnVuY3Rpb24oZSl7ZS5vbkNvbm5lY3Rpb25Ccm9rZW4oKGZ1bmN0aW9uKGUpe3IuZXJyb3IobywiQ2hhdCBTZXNzaW9uIGNvbm5lY3Rpb24gYnJva2VuIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkoIkNoYXQgU2Vzc2lvbiBjb25uZWN0aW9uIGJyb2tlbiIsZSl9KSksZS5vbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCgoZnVuY3Rpb24oZSl7ci5pbmZvKG8sIkNoYXQgU2Vzc2lvbiBjb25uZWN0aW9uIGVzdGFibGlzaGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkoIkNoYXQgU2Vzc2lvbiBjb25uZWN0aW9uIGVzdGFibGlzaGVkIixlKX0pKX07cmV0dXJue2dldDpmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe2koIkNoYXQgbWVkaWEgY29udHJvbGxlciBpbml0IixlLmNvbnRhY3RJZCksci5pbmZvKG8sIkNoYXQgbWVkaWEgY29udHJvbGxlciBpbml0Iikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuQ2hhdFNlc3Npb24uc2V0R2xvYmFsQ29uZmlnKHtsb2dnZXJDb25maWc6e2xvZ2dlcjpyfSxyZWdpb246bi5yZWdpb259KTt2YXIgYT10LkNoYXRTZXNzaW9uLmNyZWF0ZSh7Y2hhdERldGFpbHM6ZSx0eXBlOiJBR0VOVCIsd2Vic29ja2V0TWFuYWdlcjp0LmNvcmUuZ2V0V2ViU29ja2V0TWFuYWdlcigpfSk7cmV0dXJuIHMoYSksYS5jb25uZWN0KCkudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIHIuaW5mbyhvLCJDaGF0IFNlc3Npb24gU3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkIGZvciBjb250YWN0SWQgJXMiLGUuY29udGFjdElkKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkoIkNoYXQgU2Vzc2lvbiBTdWNjZXNzZnVsbHkgZXN0YWJsaXNoZWQiLGUuY29udGFjdElkKSxhfSkpLmNhdGNoKChmdW5jdGlvbih0KXt0aHJvdyByLmVycm9yKG8sIkNoYXQgU2Vzc2lvbiBlc3RhYmxpc2hlbWVudCBmYWlsZWQgZm9yIGNvbnRhY3QgJXMiLGUuY29udGFjdElkKS53aXRoRXhjZXB0aW9uKHQpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaSgiQ2hhdCBTZXNzaW9uIGVzdGFibGlzaGVtZW50IGZhaWxlZCIsZS5jb250YWN0SWQsdCksdH0pKX0oKX19fX0oKX0sMjc5OigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsdC5NZWRpYUZhY3Rvcnk9ZnVuY3Rpb24oZSl7dmFyIG49e30scj1uZXcgU2V0LG89dC5nZXRMb2coKSxpPXQuTG9nQ29tcG9uZW50LkNIQVQscz10Lm1lcmdlKHt9LGUpfHx7fTtzLnJlZ2lvbj1zLnJlZ2lvbnx8InVzLXdlc3QtMiI7dmFyIGE9ZnVuY3Rpb24oZSl7bltlXSYmIXIuaGFzKGUpJiYoby5pbmZvKGksIkRlc3Ryb3lpbmcgbWVkaWFDb250cm9sbGVyIGZvciAlcyIsZSksci5hZGQoZSksbltlXS50aGVuKChmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiBjb250cm9sbGVyLmNsZWFuVXAmJmNvbnRyb2xsZXIuY2xlYW5VcCgpLGRlbGV0ZSBuW2VdLHIuZGVsZXRlKGUpfSkpLmNhdGNoKChmdW5jdGlvbigpe2RlbGV0ZSBuW2VdLHIuZGVsZXRlKGUpfSkpKX07cmV0dXJue2dldDpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXNBY3RpdmUoKX0oZSk/ZnVuY3Rpb24oZSl7dmFyIHI9ZS5nZXRDb25uZWN0aW9uSWQoKTtpZighZS5nZXRNZWRpYUluZm8oKSlyZXR1cm4gby5lcnJvcihpLCJNZWRpYSBpbmZvIGRvZXMgbm90IGV4aXN0IGZvciBhIG1lZGlhIHR5cGUgJXMiLGUuZ2V0TWVkaWFUeXBlKCkpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxQcm9taXNlLnJlamVjdCgiTWVkaWEgaW5mbyBkb2VzIG5vdCBleGlzdCBmb3IgdGhpcyBjb25uZWN0aW9uIik7aWYobltyXSlyZXR1cm4gbltyXTtzd2l0Y2goby5pbmZvKGksIm1lZGlhIGNvbnRyb2xsZXIgb2YgdHlwZSAlcyBpbml0IixlLmdldE1lZGlhVHlwZSgpKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksZS5nZXRNZWRpYVR5cGUoKSl7Y2FzZSB0Lk1lZGlhVHlwZS5DSEFUOnJldHVybiBuW3JdPW5ldyB0LkNoYXRNZWRpYUNvbnRyb2xsZXIoZS5nZXRNZWRpYUluZm8oKSxzKS5nZXQoKTtjYXNlIHQuTWVkaWFUeXBlLlNPRlRQSE9ORTpyZXR1cm4gbltyXT1uZXcgdC5Tb2Z0cGhvbmVNZWRpYUNvbnRyb2xsZXIoZS5nZXRNZWRpYUluZm8oKSkuZ2V0KCk7Y2FzZSB0Lk1lZGlhVHlwZS5UQVNLOnJldHVybiBuW3JdPW5ldyB0LlRhc2tNZWRpYUNvbnRyb2xsZXIoZS5nZXRNZWRpYUluZm8oKSkuZ2V0KCk7ZGVmYXVsdDpyZXR1cm4gby5lcnJvcihpLCJVbnJlY29nbml6ZWQgbWVkaWEgdHlwZSAlcyAiLGUuZ2V0TWVkaWFUeXBlKCkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksUHJvbWlzZS5yZWplY3QoKX19KGUpOihhKGUuZ2V0Q29ubmVjdGlvbklkKCkpLFByb21pc2UucmVqZWN0KCJNZWRpYSBDb250cm9sbGVyIGlzIG5vIGxvbmdlciBhdmFpbGFibGUgZm9yIHRoaXMgY29ubmVjdGlvbiIpKX0sZGVzdHJveTphfX19KCl9LDQxODooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LHQuU29mdHBob25lTWVkaWFDb250cm9sbGVyPWZ1bmN0aW9uKGUpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGUpfX19fSgpfSwxODc6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCx0LlRhc2tNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oZSl7dmFyIG49dC5nZXRMb2coKSxyPXQuTG9nQ29tcG9uZW50LlRBU0ssbz1mdW5jdGlvbihuLHIpe3QucHVibGlzaE1ldHJpYyh7bmFtZTpuLGNvbnRhY3RJZDplLmNvbnRhY3RJZCxkYXRhOnJ8fGV9KX0saT1mdW5jdGlvbihlKXtlLm9uQ29ubmVjdGlvbkJyb2tlbigoZnVuY3Rpb24oZSl7bi5lcnJvcihyLCJUYXNrIFNlc3Npb24gY29ubmVjdGlvbiBicm9rZW4iKS53aXRoRXhjZXB0aW9uKGUpLG8oIlRhc2sgU2Vzc2lvbiBjb25uZWN0aW9uIGJyb2tlbiIsZSl9KSksZS5vbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCgoZnVuY3Rpb24oZSl7bi5pbmZvKHIsIlRhc2sgU2Vzc2lvbiBjb25uZWN0aW9uIGVzdGFibGlzaGVkIikud2l0aE9iamVjdChlKSxvKCJUYXNrIFNlc3Npb24gY29ubmVjdGlvbiBlc3RhYmxpc2hlZCIsZSl9KSl9O3JldHVybntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oKXtvKCJUYXNrIG1lZGlhIGNvbnRyb2xsZXIgaW5pdCIsZS5jb250YWN0SWQpLG4uaW5mbyhyLCJUYXNrIG1lZGlhIGNvbnRyb2xsZXIgaW5pdCIpLndpdGhPYmplY3QoZSk7dmFyIHM9dC5UYXNrU2Vzc2lvbi5jcmVhdGUoe2NvbnRhY3RJZDplLmNvbnRhY3RJZCxpbml0aWFsQ29udGFjdElkOmUuaW5pdGlhbENvbnRhY3RJZCx3ZWJzb2NrZXRNYW5hZ2VyOnQuY29yZS5nZXRXZWJTb2NrZXRNYW5hZ2VyKCl9KTtyZXR1cm4gaShzKSxzLmNvbm5lY3QoKS50aGVuKChmdW5jdGlvbigpe3JldHVybiBuLmluZm8ociwiVGFzayBTZXNzaW9uIFN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZCBmb3IgY29udGFjdElkICVzIixlLmNvbnRhY3RJZCksbygiVGFzayBTZXNzaW9uIFN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZCIsZS5jb250YWN0SWQpLHN9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe3Rocm93IG4uZXJyb3IociwiVGFzayBTZXNzaW9uIGVzdGFibGlzaGVtZW50IGZhaWxlZCBmb3IgY29udGFjdCAlcyIsZS5jb250YWN0SWQpLndpdGhFeGNlcHRpb24odCksbygiQ2hhdCBTZXNzaW9uIGVzdGFibGlzaGVtZW50IGZhaWxlZCIsZS5jb250YWN0SWQsdCksdH0pKX0oKX19fX0oKX0sNzQzOigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsZS5saWx5PXQ7dmFyIG49ZnVuY3Rpb24obil7dmFyIHI9dGhpcztpZih0aGlzLl9wcmV2Q29udGFjdElkPW51bGwsdC5hc3NlcnROb3ROdWxsKG4sInJpbmd0b25lQ29uZmlnIiksIW4ucmluZ3RvbmVVcmwpdGhyb3cgbmV3IEVycm9yKCJyaW5ndG9uZVVybCBpcyByZXF1aXJlZCEiKTtlLkF1ZGlvJiZ2b2lkIDAhPT1lLlByb21pc2U/dGhpcy5fcGxheWFibGVBdWRpb1Byb21pc2U9bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUsbyl7ci5fYXVkaW89bmV3IEF1ZGlvKG4ucmluZ3RvbmVVcmwpLHIuX2F1ZGlvLmxvb3A9ITAsci5fYXVkaW8uYWRkRXZlbnRMaXN0ZW5lcigiY2FucGxheSIsKGZ1bmN0aW9uKCl7dC5nZXRMb2coKS5pbmZvKCJSaW5ndG9uZSBpcyByZWFkeSB0byBwbGF5OiAiLCtuLnJpbmd0b25lVXJsKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIuX2F1ZGlvUGxheWFibGU9ITAsZShyLl9hdWRpbyl9KSl9KSk6KHRoaXMuX2F1ZGlvPW51bGwsdC5nZXRMb2coKS5lcnJvcigiVW5hYmxlIHRvIHByb3ZpZGUgYSByaW5ndG9uZS4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKSxyLl9kcml2ZVJpbmd0b25lKCl9O24ucHJvdG90eXBlLl9kcml2ZVJpbmd0b25lPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQuIil9LG4ucHJvdG90eXBlLl9zdGFydFJpbmd0b25lPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXM7dGhpcy5fYXVkaW8mJih0aGlzLl9hdWRpby5wbGF5KCkudGhlbigoZnVuY3Rpb24oKXtuLl9wdWJsaXNoVGVsZW1ldHJ5RXZlbnQoIlJpbmd0b25lIFN0YXJ0IixlKSx0LmdldExvZygpLmluZm8oIlJpbmd0b25lIFN0YXJ0Iikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKS5jYXRjaCgoZnVuY3Rpb24ocil7bi5fcHVibGlzaFRlbGVtZXRyeUV2ZW50KCJSaW5ndG9uZSBQbGF5YmFjayBGYWlsdXJlIixlKSx0LmdldExvZygpLmVycm9yKCJSaW5ndG9uZSBQbGF5YmFjayBGYWlsdXJlIikud2l0aEV4Y2VwdGlvbihyKS53aXRoT2JqZWN0KHtjdXJyZW50U3JjOm4uX2F1ZGlvLmN1cnJlbnRTcmMsc2lua0lkOm4uX2F1ZGlvLnNpbmtJZCx2b2x1bWU6bi5fYXVkaW8udm9sdW1lfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKSx0LmdldExvZygpLmluZm8oYEF0dGVtcHRpbmcgdG8gc3RhcnQgcmluZ3RvbmUgdG8gZGV2aWNlICR7dGhpcy5fYXVkaW8uc2lua0lkfHwiJycifWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpfSxuLnByb3RvdHlwZS5fc3RvcFJpbmd0b25lPWZ1bmN0aW9uKGUpe3RoaXMuX2F1ZGlvJiYodGhpcy5fYXVkaW8ucGF1c2UoKSx0aGlzLl9hdWRpby5jdXJyZW50VGltZT0wLHRoaXMuX3B1Ymxpc2hUZWxlbWV0cnlFdmVudCgiUmluZ3RvbmUgU3RvcCIsZSksdC5nZXRMb2coKS5pbmZvKCJSaW5ndG9uZSBTdG9wIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSl9LG4ucHJvdG90eXBlLnN0b3BSaW5ndG9uZT1mdW5jdGlvbigpe3RoaXMuX3N0b3BSaW5ndG9uZSgpfSxuLnByb3RvdHlwZS5fcmluZ3RvbmVTZXR1cD1mdW5jdGlvbihlKXt2YXIgbj10aGlzO3QuaWZNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuUklOR1RPTkUsKGZ1bmN0aW9uKCl7bi5fc3RhcnRSaW5ndG9uZShlKSxuLl9wcmV2Q29udGFjdElkPWUuZ2V0Q29udGFjdElkKCksZS5vbkNvbm5lY3RlZChsaWx5LmhpdGNoKG4sbi5fc3RvcFJpbmd0b25lKSksZS5vbkFjY2VwdGVkKGxpbHkuaGl0Y2gobixuLl9zdG9wUmluZ3RvbmUpKSxlLm9uRW5kZWQobGlseS5oaXRjaChuLG4uX3N0b3BSaW5ndG9uZSkpLGUub25SZWZyZXNoKChmdW5jdGlvbihlKXtlLmdldFN0YXR1cygpLnR5cGUhPT10LkNvbnRhY3RTdGF0dXNUeXBlLkNPTk5FQ1RJTkcmJmUuZ2V0U3RhdHVzKCkudHlwZSE9PXQuQ29udGFjdFN0YXR1c1R5cGUuSU5DT01JTkcmJm4uX3N0b3BSaW5ndG9uZSgpfSkpfSkpfSxuLnByb3RvdHlwZS5fcHVibGlzaFRlbGVtZXRyeUV2ZW50PWZ1bmN0aW9uKGUsbil7biYmbi5nZXRDb250YWN0SWQoKSYmdC5wdWJsaXNoTWV0cmljKHtuYW1lOmUsY29udGFjdElkOm4uZ2V0Q29udGFjdElkKCl9KX0sbi5wcm90b3R5cGUuc2V0T3V0cHV0RGV2aWNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wbGF5YWJsZUF1ZGlvUHJvbWlzZT9Qcm9taXNlLnJhY2UoW3RoaXMuX3BsYXlhYmxlQXVkaW9Qcm9taXNlLG5ldyBQcm9taXNlKChmdW5jdGlvbih0LG4pe2Uuc2V0VGltZW91dCgoZnVuY3Rpb24oKXtuKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgcGxheWFibGUgYXVkaW8iKX0pLDNlMyl9KSldKS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5zZXRTaW5rSWQ/ZS5zZXRTaW5rSWQodCkudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHQpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoYFJpbmd0b25lRW5naW5lQmFzZS5zZXRPdXRwdXREZXZpY2UgZmFpbGVkOiBhdWRpby5zZXRTaW5rSWQoKSBmYWlsZWQgd2l0aCBlcnJvciAke2V9YCl9KSk6UHJvbWlzZS5yZWplY3QoYFJpbmd0b25lRW5naW5lQmFzZS5zZXRPdXRwdXREZXZpY2UgZmFpbGVkOiAke2U/ImF1ZGlvIjoiYXVkaW8uc2V0U2lua0lkIn0gbm90IGZvdW5kLmApfSkpOmUuUHJvbWlzZT9Qcm9taXNlLnJlamVjdCgiTm90IGVsaWdpYmxlIHJpbmd0b25lIG93bmVyIik6dm9pZCAwfTt2YXIgcj1mdW5jdGlvbihlKXtuLmNhbGwodGhpcyxlKX07KHIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1yLHIucHJvdG90eXBlLl9kcml2ZVJpbmd0b25lPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPWZ1bmN0aW9uKG4pe24uZ2V0VHlwZSgpPT09bGlseS5Db250YWN0VHlwZS5WT0lDRSYmbi5pc1NvZnRwaG9uZUNhbGwoKSYmbi5pc0luYm91bmQoKSYmKGUuX3Jpbmd0b25lU2V0dXAobiksZS5fcHVibGlzaFRlbGVtZXRyeUV2ZW50KCJSaW5ndG9uZSBDb25uZWN0aW5nIixuKSx0LmdldExvZygpLmluZm8oIlJpbmd0b25lIENvbm5lY3RpbmciKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKX07dC5jb250YWN0KChmdW5jdGlvbihlKXtlLm9uQ29ubmVjdGluZyhuKX0pKSwobmV3IHQuQWdlbnQpLmdldENvbnRhY3RzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5nZXRTdGF0dXMoKS50eXBlPT09dC5Db250YWN0U3RhdHVzVHlwZS5DT05ORUNUSU5HJiZuKGUpfSkpfTt2YXIgbz1mdW5jdGlvbihlKXtuLmNhbGwodGhpcyxlKX07KG8ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1vLG8ucHJvdG90eXBlLl9kcml2ZVJpbmd0b25lPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPWZ1bmN0aW9uKG4pe24uZ2V0VHlwZSgpPT09bGlseS5Db250YWN0VHlwZS5DSEFUJiZuLmlzSW5ib3VuZCgpJiYoZS5fcmluZ3RvbmVTZXR1cChuKSxlLl9wdWJsaXNoVGVsZW1ldHJ5RXZlbnQoIkNoYXQgUmluZ3RvbmUgQ29ubmVjdGluZyIsbiksdC5nZXRMb2coKS5pbmZvKCJDaGF0IFJpbmd0b25lIENvbm5lY3RpbmciKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKX07dC5jb250YWN0KChmdW5jdGlvbihlKXtlLm9uQ29ubmVjdGluZyhuKX0pKX07dmFyIGk9ZnVuY3Rpb24oZSl7bi5jYWxsKHRoaXMsZSl9OyhpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9aSxpLnByb3RvdHlwZS5fZHJpdmVSaW5ndG9uZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMsbj1mdW5jdGlvbihuKXtuLmdldFR5cGUoKT09PWxpbHkuQ29udGFjdFR5cGUuVEFTSyYmbi5pc0luYm91bmQoKSYmKGUuX3Jpbmd0b25lU2V0dXAobiksZS5fcHVibGlzaFRlbGVtZXRyeUV2ZW50KCJUYXNrIFJpbmd0b25lIENvbm5lY3RpbmciLG4pLHQuZ2V0TG9nKCkuaW5mbygiVGFzayBSaW5ndG9uZSBDb25uZWN0aW5nIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSl9O3QuY29udGFjdCgoZnVuY3Rpb24oZSl7ZS5vbkNvbm5lY3Rpbmcobil9KSl9O3ZhciBzPWZ1bmN0aW9uKGUpe24uY2FsbCh0aGlzLGUpfTsocy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXMscy5wcm90b3R5cGUuX2RyaXZlUmluZ3RvbmU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3QuY29udGFjdCgoZnVuY3Rpb24obil7bi5vbkluY29taW5nKChmdW5jdGlvbigpe24uZ2V0VHlwZSgpPT09bGlseS5Db250YWN0VHlwZS5RVUVVRV9DQUxMQkFDSyYmKGUuX3Jpbmd0b25lU2V0dXAobiksZS5fcHVibGlzaFRlbGVtZXRyeUV2ZW50KCJDYWxsYmFjayBSaW5ndG9uZSBDb25uZWN0aW5nIixuKSx0LmdldExvZygpLmluZm8oIkNhbGxiYWNrIFJpbmd0b25lIENvbm5lY3RpbmciKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKX0pKX0pKX0sdC5Wb2ljZVJpbmd0b25lRW5naW5lPXIsdC5DaGF0UmluZ3RvbmVFbmdpbmU9byx0LlRhc2tSaW5ndG9uZUVuZ2luZT1pLHQuUXVldWVDYWxsYmFja1Jpbmd0b25lRW5naW5lPXN9KCl9LDY0MjooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10LGUuY2NwVmVyc2lvbj0iVjIiO3ZhciBuPXt9O25bdC5Tb2Z0cGhvbmVDYWxsVHlwZS5BVURJT19PTkxZXT0iQXVkaW8iLG5bdC5Tb2Z0cGhvbmVDYWxsVHlwZS5WSURFT19PTkxZXT0iVmlkZW8iLG5bdC5Tb2Z0cGhvbmVDYWxsVHlwZS5BVURJT19WSURFT109IkF1ZGlvVmlkZW8iLG5bdC5Tb2Z0cGhvbmVDYWxsVHlwZS5OT05FXT0iTm9uZSI7dmFyIHI9ImF1ZGlvX2lucHV0IixvPSJhdWRpb19vdXRwdXQiOyh7fSlbdC5Db250YWN0VHlwZS5WT0lDRV09IlZvaWNlIjt2YXIgaT1bXSxzPVtdLGE9W10sYz17fSx1PXt9LGw9MCxwPTAsZD0wLGg9MCxmPTAsZz1udWxsLG09bnVsbCx2PW51bGwseT10LlNvZnRwaG9uZUVycm9yVHlwZXMsRT17fSxTPXQucmFuZG9tSWQoKSxiPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24obixyKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ1JFQVRFX1RSQU5TUE9SVCxlLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe24oZS5zb2Z0cGhvbmVUcmFuc3BvcnQuc29mdHBob25lTWVkaWFDb25uZWN0aW9ucyl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7ZS5tZXNzYWdlJiZlLm1lc3NhZ2UuaW5jbHVkZXMoIlNvZnRwaG9uZUNvbm5lY3Rpb25MaW1pdEJyZWFjaGVkRXhjZXB0aW9uIikmJngoIm11bHRpcGxlX3NvZnRwaG9uZV9hY3RpdmVfc2Vzc2lvbnMiLCJOdW1iZXIgb2YgYWN0aXZlIHNlc3Npb25zIGFyZSBtb3JlIHRoZW4gYWxsb3dlZCBsaW1pdC4iLCIiKSxyKEVycm9yKCJyZXF1ZXN0SWNlQWNjZXNzIGZhaWxlZCIpKX0sYXV0aEZhaWx1cmU6ZnVuY3Rpb24oKXtyKEVycm9yKCJBdXRoZW50aWNhdGlvbiBmYWlsZWQgd2hpbGUgcmVxdWVzdEljZUFjY2VzcyIpKX0sYWNjZXNzRGVuaWVkOmZ1bmN0aW9uKCl7cihFcnJvcigiQWNjZXNzIERlbmllZCB3aGlsZSByZXF1ZXN0SWNlQWNjZXNzIikpfX0pfSkpfSxUPWZ1bmN0aW9uKGU9e30pe3ZhciBuLHI9dGhpczsodj1uZXcgSih0LmdldExvZygpKSkuaW5mbygiW1NvZnRwaG9uZSBNYW5hZ2VyXSBzb2Z0cGhvbmUgbWFuYWdlciBpbml0aWFsaXphdGlvbiBoYXMgYmVndW4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuUnRjUGVlckNvbm5lY3Rpb25GYWN0b3J5JiYobj1uZXcgdC5SdGNQZWVyQ29ubmVjdGlvbkZhY3Rvcnkodix0LmNvcmUuZ2V0V2ViU29ja2V0TWFuYWdlcigpLFMsdC5oaXRjaChyLGIse3RyYW5zcG9ydFR5cGU6InNvZnRwaG9uZSIsc29mdHBob25lQ2xpZW50SWQ6U30pLHQuaGl0Y2gocix4KSkpLFQuaXNCcm93c2VyU29mdFBob25lU3VwcG9ydGVkKCl8fHgoeS5VTlNVUFBPUlRFRF9CUk9XU0VSLCJDb25uZWN0IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBicm93c2VyLiBTb21lIGZ1bmN0aW9uYWxpdHkgbWF5IG5vdCB3b3JrLiAiLCIiKSxQKHtzdWNjZXNzOmZ1bmN0aW9uKGUpe1UoIkNvbm5lY3Rpdml0eUNoZWNrUmVzdWx0IixudWxsLHtjb25uZWN0aXZpdHlDaGVja1R5cGU6Ik1pY3JvcGhvbmVQZXJtaXNzaW9uIixzdGF0dXM6ImdyYW50ZWQifSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7eChlLCJZb3VyIG1pY3JvcGhvbmUgaXMgbm90IGVuYWJsZWQgaW4geW91ciBicm93c2VyLiAiLCIiKSxVKCJDb25uZWN0aXZpdHlDaGVja1Jlc3VsdCIsbnVsbCx7Y29ubmVjdGl2aXR5Q2hlY2tUeXBlOiJNaWNyb3Bob25lUGVybWlzc2lvbiIsc3RhdHVzOiJkZW5pZWQifSl9fSk7Y29uc3Qgbz1JKCksaT1BKCkscz1fKCFlLmRpc2FibGVFY2hvQ2FuY2VsbGF0aW9uKTt3KCksdGhpcy5yaW5ndG9uZUVuZ2luZT1udWxsO3ZhciBhPXt9LGM9e30sdT0hMSxsPW51bGwscD1udWxsLGQ9ZnVuY3Rpb24oKXt1PSExLGw9bnVsbCxwPW51bGx9O3RoaXMuZ2V0U2Vzc2lvbj1mdW5jdGlvbihlKXtyZXR1cm4gYVtlXX0sdGhpcy5yZXBsYWNlTG9jYWxNZWRpYVRyYWNrPWZ1bmN0aW9uKGUsdCl7dmFyIG49RVtlXS5zdHJlYW07aWYobil7dmFyIHI9bi5nZXRBdWRpb1RyYWNrcygpWzBdO3QuZW5hYmxlZD1yLmVuYWJsZWQsci5lbmFibGVkPSExLG4ucmVtb3ZlVHJhY2sociksbi5hZGRUcmFjayh0KX19O3ZhciBoPWZ1bmN0aW9uKGUpe2lmKGEuaGFzT3duUHJvcGVydHkoZSkpe3ZhciB0PWFbZV07bmV3IFByb21pc2UoKGZ1bmN0aW9uKG4scil7ZGVsZXRlIGFbZV0sZGVsZXRlIGNbZV0sdC5oYW5ndXAoKX0pKS5jYXRjaCgoZnVuY3Rpb24odCl7bGlseS5nZXRMb2coKS53YXJuKCJDbGVhbiB1cCB0aGUgc2Vzc2lvbiBsb2NhbGx5ICIrZSx0Lm1lc3NhZ2UpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSl9fTt0aGlzLnN0YXJ0U2Vzc2lvbj1mdW5jdGlvbihyLG8pe3ZhciBpPXU/bDpyLHM9dT9wOm87aWYoaSYmcyl7ZCgpLGNbc109ITAsdi5pbmZvKCJTb2Z0cGhvbmUgY2FsbCBkZXRlY3RlZDoiLCJjb250YWN0SWQgIitpLmdldENvbnRhY3RJZCgpLCJhZ2VudCBjb25uZWN0aW9uSWQgIitzKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGZ1bmN0aW9uKGUpe2lmKE9iamVjdC5rZXlzKGUpLmxlbmd0aD4wKXtmb3IodmFyIHQgaW4gZSllLmhhc093blByb3BlcnR5KHQpJiYoRigiTXVsdGlTZXNzaW9uSGFuZ1VwIixlW3RdLmNhbGxJZCx0KSxoKHQpKTt0aHJvdyBuZXcgRXJyb3IoImR1cGxpY2F0ZSBzZXNzaW9uIGRldGVjdGVkLCByZWZ1c2luZyB0byBzZXR1cCBuZXcgY29ubmVjdGlvbiIpfX0oYSksaS5nZXRTdGF0dXMoKS50eXBlPT09dC5Db250YWN0U3RhdHVzVHlwZS5DT05ORUNUSU5HJiZVKCJTb2Z0cGhvbmUgQ29ubmVjdGluZyIsaS5nZXRDb250YWN0SWQoKSksVigpO3ZhciBmLGc9aS5nZXRBZ2VudENvbm5lY3Rpb24oKS5nZXRTb2Z0cGhvbmVNZWRpYUluZm8oKSxtPUQoZy5jYWxsQ29uZmlnSnNvbik7bS51c2VXZWJTb2NrZXRQcm92aWRlciYmKGY9dC5jb3JlLmdldFdlYlNvY2tldE1hbmFnZXIoKSk7dmFyIHk9bmV3IHQuUlRDU2Vzc2lvbihtLnNpZ25hbGluZ0VuZHBvaW50LG0uaWNlU2VydmVycyxnLmNhbGxDb250ZXh0VG9rZW4sdixpLmdldENvbnRhY3RJZCgpLHMsZik7eS5lY2hvQ2FuY2VsbGF0aW9uPSFlLmRpc2FibGVFY2hvQ2FuY2VsbGF0aW9uLGFbc109eSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbm5lY3Rpb25FdmVudHMuU0VTU0lPTl9JTklULGRhdGE6e2Nvbm5lY3Rpb25JZDpzfX0pLHkub25TZXNzaW9uRmFpbGVkPWZ1bmN0aW9uKGUsdCl7ZGVsZXRlIGFbc10sZGVsZXRlIGNbc10sTyhlLHQpLE0oaS5nZXRDb250YWN0SWQoKSx0KSxYKGksZS5zZXNzaW9uUmVwb3J0KX0seS5vblNlc3Npb25Db25uZWN0ZWQ9ZnVuY3Rpb24oZSl7VSgiU29mdHBob25lIFNlc3Npb24gQ29ubmVjdGVkIixpLmdldENvbnRhY3RJZCgpKSx0LmJlY29tZU1hc3Rlcih0Lk1hc3RlclRvcGljcy5TRU5EX0xPR1MpLEIoZSksaihpKSxDKGkpfSx5Lm9uU2Vzc2lvbkNvbXBsZXRlZD1mdW5jdGlvbihlKXtVKCJTb2Z0cGhvbmUgU2Vzc2lvbiBDb21wbGV0ZWQiLGkuZ2V0Q29udGFjdElkKCkpLGRlbGV0ZSBhW3NdLGRlbGV0ZSBjW3NdLFgoaSxlLnNlc3Npb25SZXBvcnQpLFIocyl9LHkub25Mb2NhbFN0cmVhbUFkZGVkPWZ1bmN0aW9uKGUsbil7RVtzXT17c3RyZWFtOm59LHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQWdlbnRFdmVudHMuTE9DQUxfTUVESUFfU1RSRUFNX0NSRUFURUQsZGF0YTp7Y29ubmVjdGlvbklkOnN9fSl9LHkucmVtb3RlQXVkaW9FbGVtZW50PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZW1vdGUtYXVkaW8iKSxuP3kuY29ubmVjdChuLmdldChtLmljZVNlcnZlcnMpKTp5LmNvbm5lY3QoKX19O3ZhciBmPWZ1bmN0aW9uKGUsbil7YVtuXSYmZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0U3RhdHVzKCkudHlwZT09PXQuQ29udGFjdFN0YXR1c1R5cGUuRU5ERUR8fGUuZ2V0U3RhdHVzKCkudHlwZT09PXQuQ29udGFjdFN0YXR1c1R5cGUuRVJST1J8fGUuZ2V0U3RhdHVzKCkudHlwZT09PXQuQ29udGFjdFN0YXR1c1R5cGUuTUlTU0VEfShlKSYmKGgobiksZCgpKSwhZS5pc1NvZnRwaG9uZUNhbGwoKXx8Y1tuXXx8ZS5nZXRTdGF0dXMoKS50eXBlIT09dC5Db250YWN0U3RhdHVzVHlwZS5DT05ORUNUSU5HJiZlLmdldFN0YXR1cygpLnR5cGUhPT10LkNvbnRhY3RTdGF0dXNUeXBlLklOQ09NSU5HfHwodC5pc0ZpcmVmb3hCcm93c2VyKCkmJnQuaGFzT3RoZXJDb25uZWN0ZWRDQ1BzKCk/ZnVuY3Rpb24oZSx0KXt1PSEwLGw9ZSxwPXR9KGUsbik6ci5zdGFydFNlc3Npb24oZSxuKSl9LGc9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRBZ2VudENvbm5lY3Rpb24oKS5jb25uZWN0aW9uSWQ7di5pbmZvKCJDb250YWN0IGRldGVjdGVkOiIsImNvbnRhY3RJZCAiK2UuZ2V0Q29udGFjdElkKCksImFnZW50IGNvbm5lY3Rpb25JZCAiK3QpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksY1t0XXx8KGUub25SZWZyZXNoKChmdW5jdGlvbigpe2YoZSx0KX0pKSxlLm9uRGVzdHJveSgoZnVuY3Rpb24oKXshZnVuY3Rpb24oZSl7YVtlXSYmaChlKX0odCl9KSkpfTtyLm9uSW5pdENvbnRhY3RTdWI9dC5jb250YWN0KGcpLChuZXcgdC5BZ2VudCkuZ2V0Q29udGFjdHMoKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgdD1lLmdldEFnZW50Q29ubmVjdGlvbigpLmNvbm5lY3Rpb25JZDt2LmluZm8oIkNvbnRhY3QgZXhpc3QgaW4gdGhlIHNuYXBzaG90LiBSZWluaXRpYXRlIHRoZSBDb250YWN0IGFuZCBSVEMgc2Vzc2lvbiBjcmVhdGlvbiBmb3IgY29udGFjdElkIitlLmdldENvbnRhY3RJZCgpLCJhZ2VudCBjb25uZWN0aW9uSWQgIit0KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGcoZSksZihlLHQpfSkpLHRoaXMudGVybWluYXRlPSgpPT57ci5vbkluaXRDb250YWN0U3ViJiZyLm9uSW5pdENvbnRhY3RTdWIudW5zdWJzY3JpYmUmJnIub25Jbml0Q29udGFjdFN1Yi51bnN1YnNjcmliZSgpLG8mJm8udW5zdWJzY3JpYmUmJm8udW5zdWJzY3JpYmUoKSxpJiZpLnVuc3Vic2NyaWJlJiZpLnVuc3Vic2NyaWJlKCkscyYmcy51bnN1YnNjcmliZSYmcy51bnN1YnNjcmliZSgpLG4uY2xlYXJJZGxlUnRjUGVlckNvbm5lY3Rpb25UaW1lcklkJiZuLmNsZWFySWRsZVJ0Y1BlZXJDb25uZWN0aW9uVGltZXJJZCgpLG49bnVsbH19LEM9ZnVuY3Rpb24oZSl7dmFyIG49dC5jb3JlLmdldFVwc3RyZWFtKCkscj1lLmdldEFnZW50Q29ubmVjdGlvbigpO2lmKHIpe3ZhciBvPXIuZ2V0U29mdHBob25lTWVkaWFJbmZvKCk7bz8hMD09PW8uYXV0b0FjY2VwdD8odi5pbmZvKCJBdXRvLWFjY2VwdCBpcyBlbmFibGVkLCBzZW5kaW5nIG91dCBBY2NlcHRlZCBldmVudCB0byBzdG9wIHJpbmd0b25lLi4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4uc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db250YWN0RXZlbnRzLkFDQ0VQVEVELGRhdGE6bmV3IHQuQ29udGFjdChlLmNvbnRhY3RJZCl9KSxuLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuY29yZS5nZXRDb250YWN0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5BQ0NFUFRFRCxlLmNvbnRhY3RJZCksZGF0YTpuZXcgdC5Db250YWN0KGUuY29udGFjdElkKX0pKTp2LmluZm8oIkF1dG8tYWNjZXB0IGlzIGRpc2FibGVkLCByaW5ndG9uZSB3aWxsIGJlIHN0b3BwZWQgYnkgdXNlciBhY3Rpb24uIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTp2LmluZm8oIk5vdCBhYmxlIHRvIHJldHJpZXZlIHRoZSBhdXRvLWFjY2VwdCBzZXR0aW5nIGZyb20gbnVsbCBTb2Z0cGhvbmVNZWRpYUluZm8sIGlnbm9yaW5nIGV2ZW50IHB1Ymxpc2guLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9ZWxzZSB2LmluZm8oIk5vdCBhYmxlIHRvIHJldHJpZXZlIHRoZSBhdXRvLWFjY2VwdCBzZXR0aW5nIGZyb20gbnVsbCBBZ2VudENvbm5lY3Rpb24sIGlnbm9yaW5nIGV2ZW50IHB1Ymxpc2guLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LEk9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuRXZlbnRUeXBlLk1VVEUsayl9LEE9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQ29uZmlndXJhdGlvbkV2ZW50cy5TRVRfU1BFQUtFUl9ERVZJQ0UsTCl9LF89ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkNvbmZpZ3VyYXRpb25FdmVudHMuU0VUX01JQ1JPUEhPTkVfREVWSUNFLCh0PT5OKHsuLi50LGVuYWJsZUVjaG9DYW5jZWxsYXRpb246ZX0pKSl9LHc9ZnVuY3Rpb24oKXt0cnl7dC5pc0Nocm9tZUJyb3dzZXIoKSYmdC5nZXRDaHJvbWVCcm93c2VyVmVyc2lvbigpPjQzJiZuYXZpZ2F0b3IucGVybWlzc2lvbnMucXVlcnkoe25hbWU6Im1pY3JvcGhvbmUifSkudGhlbigoZnVuY3Rpb24oZSl7ZS5vbmNoYW5nZT1mdW5jdGlvbigpe3YuaW5mbygiTWljcm9waG9uZSBQZXJtaXNzaW9uOiAiK2Uuc3RhdGUpLFUoIkNvbm5lY3Rpdml0eUNoZWNrUmVzdWx0IixudWxsLHtjb25uZWN0aXZpdHlDaGVja1R5cGU6Ik1pY3JvcGhvbmVQZXJtaXNzaW9uIixzdGF0dXM6ZS5zdGF0ZX0pLCJkZW5pZWQiPT09ZS5zdGF0ZSYmeCh5Lk1JQ1JPUEhPTkVfTk9UX1NIQVJFRCwiWW91ciBtaWNyb3Bob25lIGlzIG5vdCBlbmFibGVkIGluIHlvdXIgYnJvd3Nlci4gIiwiIil9fSkpfWNhdGNoKGUpe3YuZXJyb3IoIkZhaWxlZCBpbiBkZXRlY3RpbmcgbWljcm9waG9uZSBwZXJtaXNzaW9uIHN0YXR1czogIitlKX19LFI9ZnVuY3Rpb24oZSl7ZGVsZXRlIEVbZV0sdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5BZ2VudEV2ZW50cy5NVVRFX1RPR0dMRSxkYXRhOnttdXRlZDohMX19KX0saz1mdW5jdGlvbihlKXt2YXIgbjtpZigwIT09dC5rZXlzKEUpLmxlbmd0aCl7Zm9yKHZhciByIGluIGUmJnZvaWQgMCE9PWUubXV0ZSYmKG49ZS5tdXRlKSxFKWlmKEUuaGFzT3duUHJvcGVydHkocikpe3ZhciBvPUVbcl0uc3RyZWFtO2lmKG8pe3ZhciBpPW8uZ2V0QXVkaW9UcmFja3MoKVswXTt2b2lkIDAhPT1uPyhpLmVuYWJsZWQ9IW4sRVtyXS5tdXRlZD1uLG4/di5pbmZvKCJBZ2VudCBoYXMgbXV0ZWQgdGhlIGNvbnRhY3QsIGNvbm5lY3Rpb25JZCAtICAiK3IpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk6di5pbmZvKCJBZ2VudCBoYXMgdW5tdXRlZCB0aGUgY29udGFjdCwgY29ubmVjdGlvbklkIC0gIityKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKTpuPUVbcl0ubXV0ZWR8fCExfX10LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkFnZW50RXZlbnRzLk1VVEVfVE9HR0xFLGRhdGE6e211dGVkOm59fSl9fSxMPWZ1bmN0aW9uKGU9e30pe2NvbnN0IG49ZS5kZXZpY2VJZHx8IiI7aWYodC5nZXRMb2coKS5pbmZvKGBbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBBdHRlbXB0aW5nIHRvIHNldCBzcGVha2VyIGRldmljZSAke259YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuKXt2YXIgcj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVtb3RlLWF1ZGlvIik7ciYmImZ1bmN0aW9uIj09dHlwZW9mIHIuc2V0U2lua0lkP3Iuc2V0U2lua0lkKG4pLnRoZW4oKCgpPT57dC5nZXRMb2coKS5pbmZvKGBbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBTcGVha2VyIGRldmljZSAke259IHN1Y2Nlc3NmdWxseSBzZXQgdG8gc3BlYWtlciBhdWRpbyBlbGVtZW50YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbmZpZ3VyYXRpb25FdmVudHMuU1BFQUtFUl9ERVZJQ0VfQ0hBTkdFRCxkYXRhOntkZXZpY2VJZDpufX0pfSkpLmNhdGNoKChlPT57dC5nZXRMb2coKS5lcnJvcigiW0F1ZGlvIERldmljZSBTZXR0aW5nc10gRmFpbGVkIHRvIHNldCBzcGVha2VyIGRldmljZSAiK24pLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKTp0LmdldExvZygpLndhcm4oIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIFNldHRpbmcgc3BlYWtlciBkZXZpY2UgY2FuY2VsbGVkIGR1ZSB0byBtaXNzaW5nIHJlbW90ZUF1ZGlvRWxlbWVudCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9ZWxzZSB0LmdldExvZygpLndhcm4oIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIFNldHRpbmcgc3BlYWtlciBkZXZpY2UgY2FuY2VsbGVkIGR1ZSB0byBtaXNzaW5nIGRldmljZUlkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0sTj1mdW5jdGlvbihlPXt9KXtjb25zdCBuPWUuZGV2aWNlSWR8fCIiO2lmKHQuZ2V0TG9nKCkuaW5mbyhgW0F1ZGlvIERldmljZSBTZXR0aW5nc10gQXR0ZW1wdGluZyB0byBzZXQgbWljcm9waG9uZSBkZXZpY2UgJHtufWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksMCE9PXQua2V5cyhFKS5sZW5ndGgpaWYobil7dmFyIHI9dC5jb3JlLmdldFNvZnRwaG9uZU1hbmFnZXIoKSxvPXthdWRpbzp7ZGV2aWNlSWQ6e2V4YWN0Om59fX07ZS5lbmFibGVFY2hvQ2FuY2VsbGF0aW9ufHwoby5hdWRpby5lY2hvQ2FuY2VsbGF0aW9uPSExKSx0LnB1Ymxpc2hNZXRyaWMoe25hbWU6RUNIT19DQU5DRUxMQVRJT05fQ0hFQ0ssZGF0YTp7Y291bnQ6MSxkaXNhYmxlRWNob0NhbmNlbGxhdGlvbjohZS5lbmFibGVFY2hvQ2FuY2VsbGF0aW9ufX0pLG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKG8pLnRoZW4oKGU9Pnt0cnl7dmFyIG89ZS5nZXRBdWRpb1RyYWNrcygpWzBdO2Zvcih2YXIgaSBpbiBFKUUuaGFzT3duUHJvcGVydHkoaSkmJihFW2ldLnN0cmVhbSxyLmdldFNlc3Npb24oaSkuX3BjLmdldFNlbmRlcnMoKVswXS5yZXBsYWNlVHJhY2sobykudGhlbigoZnVuY3Rpb24oKXtyLnJlcGxhY2VMb2NhbE1lZGlhVHJhY2soaSxvKSx0LmdldExvZygpLmluZm8oYFtBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIE1pY3JvcGhvbmUgZGV2aWNlICR7bn0gc3VjY2Vzc2Z1bGx5IHNldCB0byBsb2NhbCBtZWRpYSBzdHJlYW0gaW4gUlRDUnRwU2VuZGVyYCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKSl9Y2F0Y2goZSl7cmV0dXJuIHZvaWQgdC5nZXRMb2coKS5lcnJvcigiW0F1ZGlvIERldmljZSBTZXR0aW5nc10gRmFpbGVkIHRvIHNldCBtaWNyb3Bob25lIGRldmljZSAiK24pLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX10LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbmZpZ3VyYXRpb25FdmVudHMuTUlDUk9QSE9ORV9ERVZJQ0VfQ0hBTkdFRCxkYXRhOntkZXZpY2VJZDpufX0pfSkpLmNhdGNoKChlPT57dC5nZXRMb2coKS5lcnJvcigiW0F1ZGlvIERldmljZSBTZXR0aW5nc10gRmFpbGVkIHRvIHNldCBtaWNyb3Bob25lIGRldmljZSAiK24pLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKX1lbHNlIHQuZ2V0TG9nKCkud2FybigiW0F1ZGlvIERldmljZSBTZXR0aW5nc10gU2V0dGluZyBtaWNyb3Bob25lIGRldmljZSBjYW5jZWxsZWQgZHVlIHRvIG1pc3NpbmcgZGV2aWNlSWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO2Vsc2UgdC5nZXRMb2coKS53YXJuKCJbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBTZXR0aW5nIG1pY3JvcGhvbmUgZGV2aWNlIGNhbmNlbGxlZCBkdWUgdG8gbWlzc2luZyBsb2NhbE1lZGlhU3RyZWFtIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0sTz1mdW5jdGlvbihlLG4pe2lmKG49PT10LlJUQ0Vycm9ycy5JQ0VfQ09MTEVDVElPTl9USU1FT1VUKXtmb3IodmFyIHI9IlxuIixvPTA7bzxlLl9pY2VTZXJ2ZXJzLmxlbmd0aDtvKyspZm9yKHZhciBpPTA7aTxlLl9pY2VTZXJ2ZXJzW29dLnVybHMubGVuZ3RoO2krKylyPXIrZS5faWNlU2VydmVyc1tvXS51cmxzW2ldKyJcbiI7eCh5LklDRV9DT0xMRUNUSU9OX1RJTUVPVVQsIkljZSBjb2xsZWN0aW9uIHRpbWVkb3V0LiAiLHIpfWVsc2Ugbj09PXQuUlRDRXJyb3JzLlVTRVJfQlVTWT94KHkuVVNFUl9CVVNZX0VSUk9SLCJTb2Z0cGhvbmUgY2FsbCBVc2VyQnVzeSBlcnJvci4gIiwiIik6bj09PXQuUlRDRXJyb3JzLlNJR05BTExJTkdfSEFORFNIQUtFX0ZBSUxVUkU/eCh5LlNJR05BTExJTkdfSEFORFNIQUtFX0ZBSUxVUkUsIkhhbmRzaGFraW5nIHdpdGggU2lnbmFsbGluZyBTZXJ2ZXIgIitlLl9zaWduYWxpbmdVcmkrIiBmYWlsZWQuICIsZS5fc2lnbmFsaW5nVXJpKTpuPT09dC5SVENFcnJvcnMuR1VNX1RJTUVPVVRfRkFJTFVSRXx8bj09PXQuUlRDRXJyb3JzLkdVTV9PVEhFUl9GQUlMVVJFP3goeS5NSUNST1BIT05FX05PVF9TSEFSRUQsIllvdXIgbWljcm9waG9uZSBpcyBub3QgZW5hYmxlZCBpbiB5b3VyIGJyb3dzZXIuICIsIiIpOm49PT10LlJUQ0Vycm9ycy5TSUdOQUxMSU5HX0NPTk5FQ1RJT05fRkFJTFVSRT94KHkuU0lHTkFMTElOR19DT05ORUNUSU9OX0ZBSUxVUkUsIlVSTCAiK2UuX3NpZ25hbGluZ1VyaSsiIGNhbm5vdCBiZSByZWFjaGVkLiAiLGUuX3NpZ25hbGluZ1VyaSk6bj09PXQuUlRDRXJyb3JzLkNBTExfTk9UX0ZPVU5EP3YuZXJyb3IoIlNvZnRwaG9uZSBjYWxsIGZhaWxlZCBkdWUgdG8gQ2FsbE5vdEZvdW5kRXhjZXB0aW9uLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk6eCh5LldFQlJUQ19FUlJPUiwid2VicnRjIHN5c3RlbSBlcnJvci4gIiwiIil9LEQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKC8mcXVvdDsvZywnIicpO3JldHVybiBKU09OLnBhcnNlKHQpfSxQPWZ1bmN0aW9uKGUpe3ZhciB0PWV8fHt9O3Quc3VjY2Vzcz10LnN1Y2Nlc3N8fGZ1bmN0aW9uKCl7fSx0LmZhaWx1cmU9dC5mYWlsdXJlfHxmdW5jdGlvbigpe307dmFyIG49e2F1ZGlvOiEwfSxyPW51bGw7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb21pc2Upe2lmKCJvYmplY3QiPT10eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcyYmImZ1bmN0aW9uIj09dHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKXI9bmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEobik7ZWxzZXtpZigiZnVuY3Rpb24iIT10eXBlb2YgbmF2aWdhdG9yLndlYmtpdEdldFVzZXJNZWRpYSlyZXR1cm4gdm9pZCB0LmZhaWx1cmUoeS5VTlNVUFBPUlRFRF9CUk9XU0VSKTtyPW5ldyBQcm9taXNlKChmdW5jdGlvbihlLHQpe25hdmlnYXRvci53ZWJraXRHZXRVc2VyTWVkaWEobixlLHQpfSkpfXJldHVybiByLnRoZW4oKGZ1bmN0aW9uKGUpe3ZhciBuPWUuZ2V0QXVkaW9UcmFja3MoKTtuJiZuLmxlbmd0aD4wP3Quc3VjY2VzcyhlKTp0LmZhaWx1cmUoeS5NSUNST1BIT05FX05PVF9TSEFSRUQpfSksKGZ1bmN0aW9uKGUpe3QuZmFpbHVyZSh5Lk1JQ1JPUEhPTkVfTk9UX1NIQVJFRCl9KSkscn10LmZhaWx1cmUoeS5VTlNVUFBPUlRFRF9CUk9XU0VSKX0seD1mdW5jdGlvbihlLG4scil7di5lcnJvcigiU29mdHBob25lIGVycm9yIG9jY3VycmVkIDogIixlLG58fCIiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQWdlbnRFdmVudHMuU09GVFBIT05FX0VSUk9SLGRhdGE6bmV3IHQuU29mdHBob25lRXJyb3IoZSxuLHIpfSl9LE09ZnVuY3Rpb24oZSx0KXtVKCJTb2Z0cGhvbmUgU2Vzc2lvbiBGYWlsZWQiLGUse2ZhaWxlZFJlYXNvbjp0fSl9LFU9ZnVuY3Rpb24oZSxuLHIpe3QucHVibGlzaE1ldHJpYyh7bmFtZTplLGNvbnRhY3RJZDpuLGRhdGE6cn0pfSxGPWZ1bmN0aW9uKGUsdCxuKXtVKGUsdCxbe25hbWU6IkFnZW50Q29ubmVjdGlvbklkIix2YWx1ZTpufV0pLHYuaW5mbygiUHVibGlzaCBtdWx0aXBsZSBzZXNzaW9uIGVycm9yIG1ldHJpY3MiLGUsImNvbnRhY3RJZCAiK3QsImFnZW50IGNvbm5lY3Rpb25JZCAiK24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9O1QuaXNCcm93c2VyU29mdFBob25lU3VwcG9ydGVkPWZ1bmN0aW9uKCl7cmV0dXJuISEodC5pc09wZXJhQnJvd3NlcigpJiZ0LmdldE9wZXJhQnJvd3NlclZlcnNpb24oKT4xNyl8fCEhKHQuaXNDaHJvbWVCcm93c2VyKCkmJnQuZ2V0Q2hyb21lQnJvd3NlclZlcnNpb24oKT4yMil8fCEhKHQuaXNGaXJlZm94QnJvd3NlcigpJiZ0LmdldEZpcmVmb3hCcm93c2VyVmVyc2lvbigpPjIxKX07dmFyIHE9ZnVuY3Rpb24oZSl7dmFyIHQ9aS5zbGljZSgpO2k9W10sdC5sZW5ndGg+MCYmZS5zZW5kU29mdHBob25lTWV0cmljcyh0LHtzdWNjZXNzOmZ1bmN0aW9uKCl7di5pbmZvKCJzZW5kU29mdHBob25lTWV0cmljcyBzdWNjZXNzIitKU09OLnN0cmluZ2lmeSh0KSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt2LmVycm9yKCJzZW5kU29mdHBob25lTWV0cmljcyBmYWlsZWQuIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0pfSxCPWZ1bmN0aW9uKGUpe2c9d2luZG93LnNldEludGVydmFsKChmdW5jdGlvbigpe2UuZ2V0VXNlckF1ZGlvU3RhdHMoKS50aGVuKChmdW5jdGlvbihlKXt2YXIgdD1jLG49VyhjPWUsdCxyKTtpLnB1c2gobiksSChuKX0pLChmdW5jdGlvbihlKXt2LmRlYnVnKCJGYWlsZWQgdG8gZ2V0IHVzZXIgYXVkaW8gc3RhdHMuIixlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpLGUuZ2V0UmVtb3RlQXVkaW9TdGF0cygpLnRoZW4oKGZ1bmN0aW9uKGUpe3ZhciB0PXUsbj1XKHU9ZSx0LG8pO2kucHVzaChuKSxIKG4pfSksKGZ1bmN0aW9uKGUpe3YuZGVidWcoIkZhaWxlZCB0byBnZXQgcmVtb3RlIGF1ZGlvIHN0YXRzLiIsZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKX0pLDFlMyl9LGo9ZnVuY3Rpb24oZSl7bT13aW5kb3cuc2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7cShlKX0pLDNlNCl9LFY9ZnVuY3Rpb24oKXtjPW51bGwsdT1udWxsLGk9W10scz1bXSxhPVtdLGc9bnVsbCxtPW51bGwsbD0wLHA9MCxkPTAsaD0wLGY9MH0sVz1mdW5jdGlvbihlLHQsbil7aWYodCYmZSl7dmFyIHI9ZS5wYWNrZXRzTG9zdD50LnBhY2tldHNMb3N0P2UucGFja2V0c0xvc3QtdC5wYWNrZXRzTG9zdDowLG89ZS5wYWNrZXRzQ291bnQ+dC5wYWNrZXRzQ291bnQ/ZS5wYWNrZXRzQ291bnQtdC5wYWNrZXRzQ291bnQ6MDtyZXR1cm4geihvLG4pLEcoZS5hdWRpb0xldmVsLG4pLG5ldyBZKGUudGltZXN0YW1wLHIsbyxuLGUuYXVkaW9MZXZlbCxlLmpiTWlsbGlzZWNvbmRzLGUucnR0TWlsbGlzZWNvbmRzKX1yZXR1cm4gbmV3IFkoZS50aW1lc3RhbXAsZS5wYWNrZXRzTG9zdCxlLnBhY2tldHNDb3VudCxuLGUuYXVkaW9MZXZlbCxlLmpiTWlsbGlzZWNvbmRzLGUucnR0TWlsbGlzZWNvbmRzKX0sSD1mdW5jdGlvbihlKXtpZihlLnNvZnRwaG9uZVN0cmVhbVR5cGU9PT1yKXtmb3IoO3MubGVuZ3RoPj0xMDgwMDspcy5zaGlmdCgpO3MucHVzaChlKX1lbHNlIGlmKGUuc29mdHBob25lU3RyZWFtVHlwZT09PW8pe2Zvcig7YS5sZW5ndGg+PTEwODAwOylhLnNoaWZ0KCk7YS5wdXNoKGUpfX0sej1mdW5jdGlvbihlLHQpe3Q9PT1yPyhmKyssZTw9MD9sKys6bD0wKTp0PT09byYmKGU8PTA/ZCsrOmQ9MCl9LEc9ZnVuY3Rpb24oZSx0KXt0PT09cj9udWxsIT09ZSYmZTw9MT9wKys6cD0wOnQ9PT1vJiYobnVsbCE9PWUmJmU8PTE/aCsrOmg9MCl9LEs9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPT1lJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbChlKSxudWxsfSxYPWZ1bmN0aW9uKG4saSl7Zz1LKGcpLG09SyhtKSxmdW5jdGlvbihuLGksYyx1KXtpLnN0cmVhbVN0YXRzPVskKGMsciksJCh1LG8pXTt2YXIgZz17Y2FsbFN0YXJ0VGltZTppLnNlc3Npb25TdGFydFRpbWUsY2FsbEVuZFRpbWU6aS5zZXNzaW9uRW5kVGltZSxndW1UaW1lTWlsbGlzOmkuZ3VtVGltZU1pbGxpcyxpbml0aWFsaXphdGlvblRpbWVNaWxsaXM6aS5pbml0aWFsaXphdGlvblRpbWVNaWxsaXMsaWNlQ29sbGVjdGlvblRpbWVNaWxsaXM6aS5pY2VDb2xsZWN0aW9uVGltZU1pbGxpcyxzaWduYWxsaW5nQ29ubmVjdFRpbWVNaWxsaXM6aS5zaWduYWxsaW5nQ29ubmVjdFRpbWVNaWxsaXMsaGFuZHNoYWtpbmdUaW1lTWlsbGlzOmkuaGFuZHNoYWtpbmdUaW1lTWlsbGlzLHByZVRhbGtpbmdUaW1lTWlsbGlzOmkucHJlVGFsa2luZ1RpbWVNaWxsaXMsdGFsa2luZ1RpbWVNaWxsaXM6aS50YWxraW5nVGltZU1pbGxpcyxjbGVhbnVwVGltZU1pbGxpczppLmNsZWFudXBUaW1lTWlsbGlzLGljZUNvbGxlY3Rpb25GYWlsdXJlOmkuaWNlQ29sbGVjdGlvbkZhaWx1cmUsc2lnbmFsbGluZ0Nvbm5lY3Rpb25GYWlsdXJlOmkuc2lnbmFsbGluZ0Nvbm5lY3Rpb25GYWlsdXJlLGhhbmRzaGFraW5nRmFpbHVyZTppLmhhbmRzaGFraW5nRmFpbHVyZSxndW1PdGhlckZhaWx1cmU6aS5ndW1PdGhlckZhaWx1cmUsZ3VtVGltZW91dEZhaWx1cmU6aS5ndW1UaW1lb3V0RmFpbHVyZSxjcmVhdGVPZmZlckZhaWx1cmU6aS5jcmVhdGVPZmZlckZhaWx1cmUsc2V0TG9jYWxEZXNjcmlwdGlvbkZhaWx1cmU6aS5zZXRMb2NhbERlc2NyaXB0aW9uRmFpbHVyZSx1c2VyQnVzeUZhaWx1cmU6aS51c2VyQnVzeUZhaWx1cmUsaW52YWxpZFJlbW90ZVNEUEZhaWx1cmU6aS5pbnZhbGlkUmVtb3RlU0RQRmFpbHVyZSxub1JlbW90ZUljZUNhbmRpZGF0ZUZhaWx1cmU6aS5ub1JlbW90ZUljZUNhbmRpZGF0ZUZhaWx1cmUsc2V0UmVtb3RlRGVzY3JpcHRpb25GYWlsdXJlOmkuc2V0UmVtb3RlRGVzY3JpcHRpb25GYWlsdXJlLHNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3M6aS5zdHJlYW1TdGF0c307bi5zZW5kU29mdHBob25lUmVwb3J0KGcse3N1Y2Nlc3M6ZnVuY3Rpb24oKXt2LmluZm8oInNlbmRTb2Z0cGhvbmVSZXBvcnQgc3VjY2VzcyIrSlNPTi5zdHJpbmdpZnkoZykpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7di5lcnJvcigic2VuZFNvZnRwaG9uZVJlcG9ydCBmYWlsZWQuIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0pO3ZhciBtPXtBVURJT19JTlBVVDp7cGFja2V0c0NvdW50OnMubWFwKChlPT5lLnBhY2tldHNDb3VudCkpLHBhY2tldHNMb3N0OnMubWFwKChlPT5lLnBhY2tldHNMb3N0KSksYXVkaW9MZXZlbDpzLm1hcCgoZT0+ZS5hdWRpb0xldmVsKSksaml0dGVyQnVmZmVyTWlsbGlzOnMubWFwKChlPT5lLmppdHRlckJ1ZmZlck1pbGxpcykpfSxBVURJT19PVVRQVVQ6e3BhY2tldHNDb3VudDphLm1hcCgoZT0+ZS5wYWNrZXRzQ291bnQpKSxwYWNrZXRzTG9zdDphLm1hcCgoZT0+ZS5wYWNrZXRzTG9zdCkpLGF1ZGlvTGV2ZWw6YS5tYXAoKGU9PmUuYXVkaW9MZXZlbCkpLGppdHRlckJ1ZmZlck1pbGxpczphLm1hcCgoZT0+ZS5qaXR0ZXJCdWZmZXJNaWxsaXMpKSxyb3VuZFRyaXBUaW1lTWlsbGlzOmEubWFwKChlPT5lLnJvdW5kVHJpcFRpbWVNaWxsaXMpKX19LHk9ey4uLmcsc29mdHBob25lU3RyZWFtUGVyU2Vjb25kU3RhdGlzdGljczptLGljZUNvbm5lY3Rpb25zTG9zdDppLmljZUNvbm5lY3Rpb25zTG9zdCxpY2VDb25uZWN0aW9uc0ZhaWxlZDppLmljZUNvbm5lY3Rpb25zRmFpbGVkfHxudWxsLHBlZXJDb25uZWN0aW9uRmFpbGVkOmkucGVlckNvbm5lY3Rpb25GYWlsZWR8fG51bGwscnRjSnNWZXJzaW9uOmkucnRjSnNWZXJzaW9ufHxudWxsLGNvbnNlY3V0aXZlTm9BdWRpb0lucHV0UGFja2V0czpsLGNvbnNlY3V0aXZlTG93SW5wdXRBdWRpb0xldmVsOnAsY29uc2VjdXRpdmVOb0F1ZGlvT3V0cHV0UGFja2V0czpkLGNvbnNlY3V0aXZlTG93T3V0cHV0QXVkaW9MZXZlbDpoLGF1ZGlvSW5wdXRDb25uZWN0ZWREdXJhdGlvblNlY29uZHM6Zn07dC5wdWJsaXNoU29mdHBob25lUmVwb3J0KHtjb250YWN0SWQ6bi5nZXRDb250YWN0SWQoKSxjY3BWZXJzaW9uOmUuY2NwVmVyc2lvbixyZXBvcnQ6eX0pLHYuaW5mbygic2VudCBUZWxlbWV0cnlDYWxsUmVwb3J0ICIrSlNPTi5zdHJpbmdpZnkoeSkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KG4saSwkKGMsciksJCh1LG8pKSxxKG4pfSxZPWZ1bmN0aW9uKGUsdCxuLHIsbyxpLHMpe3RoaXMuc29mdHBob25lU3RyZWFtVHlwZT1yLHRoaXMudGltZXN0YW1wPWUsdGhpcy5wYWNrZXRzTG9zdD10LHRoaXMucGFja2V0c0NvdW50PW4sdGhpcy5hdWRpb0xldmVsPW8sdGhpcy5qaXR0ZXJCdWZmZXJNaWxsaXM9aSx0aGlzLnJvdW5kVHJpcFRpbWVNaWxsaXM9c30sJD1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgWSgoZT1lfHx7fSkudGltZXN0YW1wLGUucGFja2V0c0xvc3QsZS5wYWNrZXRzQ291bnQsdCxlLmF1ZGlvTGV2ZWwpfSxKPWZ1bmN0aW9uKGUpe3RoaXMuX29yaWdpbmFsTG9nZ2VyPWU7dmFyIG49dGhpczt0aGlzLl90ZWU9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHNbMF0pLG89IiI7cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oKXtvKz0iICVzIn0pKSxyLmFwcGx5KG4uX29yaWdpbmFsTG9nZ2VyLFt0LkxvZ0NvbXBvbmVudC5TT0ZUUEhPTkUsb10uY29uY2F0KGUpKX19fTtKLnByb3RvdHlwZS5kZWJ1Zz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90ZWUoMSx0aGlzLl9vcmlnaW5hbExvZ2dlci5kZWJ1ZykoYXJndW1lbnRzKX0sSi5wcm90b3R5cGUuaW5mbz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90ZWUoMix0aGlzLl9vcmlnaW5hbExvZ2dlci5pbmZvKShhcmd1bWVudHMpfSxKLnByb3RvdHlwZS5sb2c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGVlKDMsdGhpcy5fb3JpZ2luYWxMb2dnZXIubG9nKShhcmd1bWVudHMpfSxKLnByb3RvdHlwZS53YXJuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RlZSg0LHRoaXMuX29yaWdpbmFsTG9nZ2VyLndhcm4pKGFyZ3VtZW50cyl9LEoucHJvdG90eXBlLmVycm9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RlZSg1LHRoaXMuX29yaWdpbmFsTG9nZ2VyLmVycm9yKShhcmd1bWVudHMpfSx0LlNvZnRwaG9uZU1hbmFnZXI9VH0oKX0sOTQ0OigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWZ1bmN0aW9uKCl7cmV0dXJuIHQuY2FjaGUuaGFzT3duUHJvcGVydHkoYXJndW1lbnRzWzBdKXx8KHQuY2FjaGVbYXJndW1lbnRzWzBdXT10LnBhcnNlKGFyZ3VtZW50c1swXSkpLHQuZm9ybWF0LmNhbGwobnVsbCx0LmNhY2hlW2FyZ3VtZW50c1swXV0sYXJndW1lbnRzKX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsLTEpLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gcihlLHQpe2Zvcih2YXIgbj1bXTt0PjA7blstLXRdPWUpO3JldHVybiBuLmpvaW4oIiIpfXQuZm9ybWF0PWZ1bmN0aW9uKGUsbyl7dmFyIGkscyxhLGMsdSxsLHAsZD0xLGg9ZS5sZW5ndGgsZj0iIixnPVtdO2ZvcihzPTA7czxoO3MrKylpZigic3RyaW5nIj09PShmPW4oZVtzXSkpKWcucHVzaChlW3NdKTtlbHNlIGlmKCJhcnJheSI9PT1mKXtpZigoYz1lW3NdKVsyXSlmb3IoaT1vW2RdLGE9MDthPGNbMl0ubGVuZ3RoO2ErKyl7aWYoIWkuaGFzT3duUHJvcGVydHkoY1syXVthXSkpdGhyb3cgdCgnW3NwcmludGZdIHByb3BlcnR5ICIlcyIgZG9lcyBub3QgZXhpc3QnLGNbMl1bYV0pO2k9aVtjWzJdW2FdXX1lbHNlIGk9Y1sxXT9vW2NbMV1dOm9bZCsrXTtpZigvW15zXS8udGVzdChjWzhdKSYmIm51bWJlciIhPW4oaSkpdGhyb3cgdCgiW3NwcmludGZdIGV4cGVjdGluZyBudW1iZXIgYnV0IGZvdW5kICVzIixuKGkpKTtzd2l0Y2goY1s4XSl7Y2FzZSJiIjppPWkudG9TdHJpbmcoMik7YnJlYWs7Y2FzZSJjIjppPVN0cmluZy5mcm9tQ2hhckNvZGUoaSk7YnJlYWs7Y2FzZSJkIjppPXBhcnNlSW50KGksMTApO2JyZWFrO2Nhc2UiZSI6aT1jWzddP2kudG9FeHBvbmVudGlhbChjWzddKTppLnRvRXhwb25lbnRpYWwoKTticmVhaztjYXNlImYiOmk9Y1s3XT9wYXJzZUZsb2F0KGkpLnRvRml4ZWQoY1s3XSk6cGFyc2VGbG9hdChpKTticmVhaztjYXNlIm8iOmk9aS50b1N0cmluZyg4KTticmVhaztjYXNlInMiOmk9KGk9U3RyaW5nKGkpKSYmY1s3XT9pLnN1YnN0cmluZygwLGNbN10pOmk7YnJlYWs7Y2FzZSJ1IjppPj4+PTA7YnJlYWs7Y2FzZSJ4IjppPWkudG9TdHJpbmcoMTYpO2JyZWFrO2Nhc2UiWCI6aT1pLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfWk9L1tkZWZdLy50ZXN0KGNbOF0pJiZjWzNdJiZpPj0wPyIrIitpOmksbD1jWzRdPyIwIj09Y1s0XT8iMCI6Y1s0XS5jaGFyQXQoMSk6IiAiLHA9Y1s2XS1TdHJpbmcoaSkubGVuZ3RoLHU9Y1s2XT9yKGwscCk6IiIsZy5wdXNoKGNbNV0/aSt1OnUraSl9cmV0dXJuIGcuam9pbigiIil9LHQuY2FjaGU9e30sdC5wYXJzZT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9ZSxuPVtdLHI9W10sbz0wO3Q7KXtpZihudWxsIT09KG49L15bXlx4MjVdKy8uZXhlYyh0KSkpci5wdXNoKG5bMF0pO2Vsc2UgaWYobnVsbCE9PShuPS9eXHgyNXsyfS8uZXhlYyh0KSkpci5wdXNoKCIlIik7ZWxzZXtpZihudWxsPT09KG49L15ceDI1KD86KFsxLTldXGQqKVwkfFwoKFteXCldKylcKSk/KFwrKT8oMHwnW14kXSk/KC0pPyhcZCspPyg/OlwuKFxkKykpPyhbYi1mb3N1eFhdKS8uZXhlYyh0KSkpdGhyb3ciW3NwcmludGZdIGh1aD8iO2lmKG5bMl0pe298PTE7dmFyIGk9W10scz1uWzJdLGE9W107aWYobnVsbD09PShhPS9eKFthLXpfXVthLXpfXGRdKikvaS5leGVjKHMpKSl0aHJvdyJbc3ByaW50Zl0gaHVoPyI7Zm9yKGkucHVzaChhWzFdKTsiIiE9PShzPXMuc3Vic3RyaW5nKGFbMF0ubGVuZ3RoKSk7KWlmKG51bGwhPT0oYT0vXlwuKFthLXpfXVthLXpfXGRdKikvaS5leGVjKHMpKSlpLnB1c2goYVsxXSk7ZWxzZXtpZihudWxsPT09KGE9L15cWyhcZCspXF0vLmV4ZWMocykpKXRocm93IltzcHJpbnRmXSBodWg/IjtpLnB1c2goYVsxXSl9blsyXT1pfWVsc2Ugb3w9MjtpZigzPT09byl0aHJvdyJbc3ByaW50Zl0gbWl4aW5nIHBvc2l0aW9uYWwgYW5kIG5hbWVkIHBsYWNlaG9sZGVycyBpcyBub3QgKHlldCkgc3VwcG9ydGVkIjtyLnB1c2gobil9dD10LnN1YnN0cmluZyhuWzBdLmxlbmd0aCl9cmV0dXJuIHJ9LGUuc3ByaW50Zj10LGUudnNwcmludGY9ZnVuY3Rpb24oZSxuLHIpe3JldHVybihyPW4uc2xpY2UoMCkpLnNwbGljZSgwLDAsZSksdC5hcHBseShudWxsLHIpfX0oKX0sODI6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dDt2YXIgbj1mdW5jdGlvbigpe307bi5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlKXt0aHJvdyBuZXcgdC5Ob3RJbXBsZW1lbnRlZEVycm9yfSxuLnByb3RvdHlwZS5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IHQuTm90SW1wbGVtZW50ZWRFcnJvcn07dmFyIHI9ZnVuY3Rpb24oKXtuLmNhbGwodGhpcyl9OyhyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9cixyLnByb3RvdHlwZS5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7fSxyLnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKGUpe307dmFyIG89ZnVuY3Rpb24oZSx0KXtuLmNhbGwodGhpcyksdGhpcy53aW5kb3c9ZSx0aGlzLmRvbWFpbj10fHwiKiJ9OyhvLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9byxvLnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKGUpe3RoaXMud2luZG93LnBvc3RNZXNzYWdlKGUsdGhpcy5kb21haW4pfSxvLnByb3RvdHlwZS5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7dGhpcy53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZSl9O3ZhciBpPWZ1bmN0aW9uKGUsdCxyKXtuLmNhbGwodGhpcyksdGhpcy5pbnB1dD1lLHRoaXMub3V0cHV0PXQsdGhpcy5kb21haW49cnx8IioifTsoaS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWksaS5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlKXt0aGlzLm91dHB1dC5wb3N0TWVzc2FnZShlLHRoaXMuZG9tYWluKX0saS5wcm90b3R5cGUub25NZXNzYWdlPWZ1bmN0aW9uKGUpe3RoaXMuaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsKHQ9Pnt0LnNvdXJjZT09PXRoaXMub3V0cHV0JiZlKHQpfSkpfTt2YXIgcz1mdW5jdGlvbihlKXtuLmNhbGwodGhpcyksdGhpcy5wb3J0PWUsdGhpcy5pZD10LnJhbmRvbUlkKCl9OyhzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9cyxzLnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKGUpe3RoaXMucG9ydC5wb3N0TWVzc2FnZShlKX0scy5wcm90b3R5cGUub25NZXNzYWdlPWZ1bmN0aW9uKGUpe3RoaXMucG9ydC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixlKX0scy5wcm90b3R5cGUuZ2V0SWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH07dmFyIGE9ZnVuY3Rpb24oZSl7bi5jYWxsKHRoaXMpLHRoaXMuc3RyZWFtTWFwPWU/dC5pbmRleChlLChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRJZCgpfSkpOnt9LHRoaXMubWVzc2FnZUxpc3RlbmVycz1bXX07KGEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1hLGEucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24oZSl7dGhpcy5nZXRTdHJlYW1zKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dHJ5e3Quc2VuZChlKX1jYXRjaChlKXt9fSkpfSxhLnByb3RvdHlwZS5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7dGhpcy5tZXNzYWdlTGlzdGVuZXJzLnB1c2goZSksdGhpcy5nZXRTdHJlYW1zKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5vbk1lc3NhZ2UoZSl9KSl9LGEucHJvdG90eXBlLmFkZFN0cmVhbT1mdW5jdGlvbihlKXt0aGlzLnN0cmVhbU1hcFtlLmdldElkKCldPWUsdGhpcy5tZXNzYWdlTGlzdGVuZXJzLmZvckVhY2goKGZ1bmN0aW9uKHQpe2Uub25NZXNzYWdlKHQpfSkpfSxhLnByb3RvdHlwZS5yZW1vdmVTdHJlYW09ZnVuY3Rpb24oZSl7ZGVsZXRlIHRoaXMuc3RyZWFtTWFwW2UuZ2V0SWQoKV19LGEucHJvdG90eXBlLmdldFN0cmVhbXM9ZnVuY3Rpb24oZSl7cmV0dXJuIHQudmFsdWVzKHRoaXMuc3RyZWFtTWFwKX0sYS5wcm90b3R5cGUuZ2V0U3RyZWFtRm9yUG9ydD1mdW5jdGlvbihlKXtyZXR1cm4gdC5maW5kKHRoaXMuZ2V0U3RyZWFtcygpLChmdW5jdGlvbih0KXtyZXR1cm4gdC5wb3J0PT09ZX0pKX07dmFyIGM9ZnVuY3Rpb24oZSxuLG8pe3RoaXMubmFtZT1lLHRoaXMudXBzdHJlYW09bnx8bmV3IHIsdGhpcy5kb3duc3RyZWFtPW98fG5ldyByLHRoaXMuZG93bnN0cmVhbUJ1cz1uZXcgdC5FdmVudEJ1cyx0aGlzLnVwc3RyZWFtQnVzPW5ldyB0LkV2ZW50QnVzLHRoaXMudXBzdHJlYW0ub25NZXNzYWdlKHQuaGl0Y2godGhpcyx0aGlzLl9kaXNwYXRjaEV2ZW50LHRoaXMudXBzdHJlYW1CdXMpKSx0aGlzLmRvd25zdHJlYW0ub25NZXNzYWdlKHQuaGl0Y2godGhpcyx0aGlzLl9kaXNwYXRjaEV2ZW50LHRoaXMuZG93bnN0cmVhbUJ1cykpfTtjLnByb3RvdHlwZS5vblVwc3RyZWFtPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChlLCJldmVudE5hbWUiKSx0LmFzc2VydE5vdE51bGwobiwiZiIpLHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksImYgbXVzdCBiZSBhIGZ1bmN0aW9uIiksdGhpcy51cHN0cmVhbUJ1cy5zdWJzY3JpYmUoZSxuKX0sYy5wcm90b3R5cGUub25BbGxVcHN0cmVhbT1mdW5jdGlvbihlKXtyZXR1cm4gdC5hc3NlcnROb3ROdWxsKGUsImYiKSx0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKGUpLCJmIG11c3QgYmUgYSBmdW5jdGlvbiIpLHRoaXMudXBzdHJlYW1CdXMuc3Vic2NyaWJlQWxsKGUpfSxjLnByb3RvdHlwZS5vbkRvd25zdHJlYW09ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5hc3NlcnROb3ROdWxsKGUsImV2ZW50TmFtZSIpLHQuYXNzZXJ0Tm90TnVsbChuLCJmIiksdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihuKSwiZiBtdXN0IGJlIGEgZnVuY3Rpb24iKSx0aGlzLmRvd25zdHJlYW1CdXMuc3Vic2NyaWJlKGUsbil9LGMucHJvdG90eXBlLm9uQWxsRG93bnN0cmVhbT1mdW5jdGlvbihlKXtyZXR1cm4gdC5hc3NlcnROb3ROdWxsKGUsImYiKSx0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKGUpLCJmIG11c3QgYmUgYSBmdW5jdGlvbiIpLHRoaXMuZG93bnN0cmVhbUJ1cy5zdWJzY3JpYmVBbGwoZSl9LGMucHJvdG90eXBlLnNlbmRVcHN0cmVhbT1mdW5jdGlvbihlLG4pe3QuYXNzZXJ0Tm90TnVsbChlLCJldmVudE5hbWUiKSx0aGlzLnVwc3RyZWFtLnNlbmQoe2V2ZW50OmUsZGF0YTpufSl9LGMucHJvdG90eXBlLnNlbmREb3duc3RyZWFtPWZ1bmN0aW9uKGUsbil7dC5hc3NlcnROb3ROdWxsKGUsImV2ZW50TmFtZSIpLHRoaXMuZG93bnN0cmVhbS5zZW5kKHtldmVudDplLGRhdGE6bn0pfSxjLnByb3RvdHlwZS5fZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihlLHQpe3ZhciBuPXQuZGF0YTtuLmV2ZW50JiZlLnRyaWdnZXIobi5ldmVudCxuLmRhdGEpfSxjLnByb3RvdHlwZS5wYXNzVXBzdHJlYW09ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiBmdW5jdGlvbih0LG4pe2UudXBzdHJlYW0uc2VuZCh7ZXZlbnQ6bixkYXRhOnR9KX19LGMucHJvdG90eXBlLnBhc3NEb3duc3RyZWFtPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4gZnVuY3Rpb24odCxuKXtlLmRvd25zdHJlYW0uc2VuZCh7ZXZlbnQ6bixkYXRhOnR9KX19LGMucHJvdG90eXBlLnNodXRkb3duPWZ1bmN0aW9uKCl7dGhpcy51cHN0cmVhbUJ1cy51bnN1YnNjcmliZUFsbCgpLHRoaXMuZG93bnN0cmVhbUJ1cy51bnN1YnNjcmliZUFsbCgpfTt2YXIgdT1mdW5jdGlvbihlLHQsbixyKXtjLmNhbGwodGhpcyxlLG5ldyBpKHQsbi5jb250ZW50V2luZG93LHJ8fCIqIiksbnVsbCl9Oyh1LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGMucHJvdG90eXBlKSkuY29uc3RydWN0b3I9dSx0LlN0cmVhbT1uLHQuTnVsbFN0cmVhbT1yLHQuV2luZG93U3RyZWFtPW8sdC5XaW5kb3dJT1N0cmVhbT1pLHQuUG9ydFN0cmVhbT1zLHQuU3RyZWFtTXVsdGlwbGV4ZXI9YSx0LkNvbmR1aXQ9Yyx0LklGcmFtZUNvbmR1aXQ9dX0oKX0sODMzOigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsZS5saWx5PXQ7dmFyIG49ZnVuY3Rpb24oZSxuKXt0LmFzc2VydE5vdE51bGwoZSwiZnJvbVN0YXRlIiksdC5hc3NlcnROb3ROdWxsKG4sInRvU3RhdGUiKSx0aGlzLmZyb21TdGF0ZT1lLHRoaXMudG9TdGF0ZT1ufTtuLnByb3RvdHlwZS5nZXRBc3NvY2lhdGlvbnM9ZnVuY3Rpb24oZSl7dGhyb3cgdC5Ob3RJbXBsZW1lbnRlZEVycm9yKCl9LG4ucHJvdG90eXBlLmdldEZyb21TdGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZyb21TdGF0ZX0sbi5wcm90b3R5cGUuZ2V0VG9TdGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRvU3RhdGV9O3ZhciByPWZ1bmN0aW9uKGUscixvKXt0LmFzc2VydE5vdE51bGwoZSwiZnJvbVN0YXRlIiksdC5hc3NlcnROb3ROdWxsKHIsInRvU3RhdGUiKSx0LmFzc2VydE5vdE51bGwobywiYXNzb2NpYXRpb25zIiksbi5jYWxsKHRoaXMsZSxyKSx0aGlzLmFzc29jaWF0aW9ucz1vfTsoci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXIsci5wcm90b3R5cGUuZ2V0QXNzb2NpYXRpb25zPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmFzc29jaWF0aW9uc307dmFyIG89ZnVuY3Rpb24oZSxyLG8pe3QuYXNzZXJ0Tm90TnVsbChlLCJmcm9tU3RhdGUiKSx0LmFzc2VydE5vdE51bGwociwidG9TdGF0ZSIpLHQuYXNzZXJ0Tm90TnVsbChvLCJjbG9zdXJlIiksdC5hc3NlcnRUcnVlKHQuaXNGdW5jdGlvbihvKSwiY2xvc3VyZSBtdXN0IGJlIGEgZnVuY3Rpb24iKSxuLmNhbGwodGhpcyxlLHIpLHRoaXMuY2xvc3VyZT1vfTsoby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPW8sby5wcm90b3R5cGUuZ2V0QXNzb2NpYXRpb25zPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNsb3N1cmUoZSx0aGlzLmdldEZyb21TdGF0ZSgpLHRoaXMuZ2V0VG9TdGF0ZSgpKX07dmFyIGk9ZnVuY3Rpb24oKXt0aGlzLmZyb21NYXA9e319O2kuQU5ZPSI8PGFueT4+IixpLnByb3RvdHlwZS5hc3NvYz1mdW5jdGlvbihlLHQsbil7dmFyIGk9dGhpcztpZighZSl0aHJvdyBuZXcgRXJyb3IoImZyb21TdGF0ZU9iaiBpcyBub3QgZGVmaW5lZC4iKTtpZighdCl0aHJvdyBuZXcgRXJyb3IoInRvU3RhdGVPYmogaXMgbm90IGRlZmluZWQuIik7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJhc3NvY09iaiBpcyBub3QgZGVmaW5lZC4iKTtyZXR1cm4gZSBpbnN0YW5jZW9mIEFycmF5P2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aS5hc3NvYyhlLHQsbil9KSk6dCBpbnN0YW5jZW9mIEFycmF5P3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7aS5hc3NvYyhlLHQsbil9KSk6ImZ1bmN0aW9uIj09dHlwZW9mIG4/dGhpcy5fYWRkQXNzb2NpYXRpb24obmV3IG8oZSx0LG4pKTpuIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5fYWRkQXNzb2NpYXRpb24obmV3IHIoZSx0LG4pKTp0aGlzLl9hZGRBc3NvY2lhdGlvbihuZXcgcihlLHQsW25dKSksdGhpc30saS5wcm90b3R5cGUuZ2V0QXNzb2NpYXRpb25zPWZ1bmN0aW9uKGUsbixyKXt0LmFzc2VydE5vdE51bGwobiwiZnJvbVN0YXRlIiksdC5hc3NlcnROb3ROdWxsKHIsInRvU3RhdGUiKTt2YXIgbz1bXSxzPXRoaXMuZnJvbU1hcFtpLkFOWV18fHt9LGE9dGhpcy5mcm9tTWFwW25dfHx7fTtyZXR1cm4gbz0obz1vLmNvbmNhdCh0aGlzLl9nZXRBc3NvY2lhdGlvbnNGcm9tTWFwKHMsZSxuLHIpKSkuY29uY2F0KHRoaXMuX2dldEFzc29jaWF0aW9uc0Zyb21NYXAoYSxlLG4scikpfSxpLnByb3RvdHlwZS5fYWRkQXNzb2NpYXRpb249ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5mcm9tTWFwW2UuZ2V0RnJvbVN0YXRlKCldO3R8fCh0PXRoaXMuZnJvbU1hcFtlLmdldEZyb21TdGF0ZSgpXT17fSk7dmFyIG49dFtlLmdldFRvU3RhdGUoKV07bnx8KG49dFtlLmdldFRvU3RhdGUoKV09W10pLG4ucHVzaChlKX0saS5wcm90b3R5cGUuX2dldEFzc29jaWF0aW9uc0Zyb21NYXA9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuKGVbaS5BTlldfHxbXSkuY29uY2F0KGVbcl18fFtdKS5yZWR1Y2UoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIGUuY29uY2F0KG4uZ2V0QXNzb2NpYXRpb25zKHQpKX0pLFtdKX0sdC5FdmVudEdyYXBoPWl9KCl9LDg5MTooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10O3ZhciBuPW5hdmlnYXRvci51c2VyQWdlbnQscj1bImJ1YmJsZXMiLCJjYW5jZWxCdWJibGUiLCJjYW5jZWxhYmxlIiwiY29tcG9zZWQiLCJkYXRhIiwiZGVmYXVsdFByZXZlbnRlZCIsImV2ZW50UGhhc2UiLCJpc1RydXN0ZWQiLCJsYXN0RXZlbnRJZCIsIm9yaWdpbiIsInJldHVyblZhbHVlIiwidGltZVN0YW1wIiwidHlwZSJdO3Quc3ByaW50Zj1lLnNwcmludGYsdC52c3ByaW50Zj1lLnZzcHJpbnRmLGRlbGV0ZSBlLnNwcmludGYsZGVsZXRlIGUudnNwcmludGYsdC5IVFRQX1NUQVRVU19DT0RFUz17U1VDQ0VTUzoyMDAsVU5BVVRIT1JJWkVEOjQwMSxBQ0NFU1NfREVOSUVEOjQwMyxUT09fTUFOWV9SRVFVRVNUUzo0MjksSU5URVJOQUxfU0VSVkVSX0VSUk9SOjUwMH0sdC5UUkFOU1BPUlRfVFlQRVM9e0NIQVRfVE9LRU46ImNoYXRfdG9rZW4iLFdFQl9TT0NLRVQ6IndlYl9zb2NrZXQiLEFHRU5UX0RJU0NPVkVSWToiYWdlbnRfZGlzY292ZXJ5In0sdC5oaXRjaD1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksbj1lLnNoaWZ0KCkscj1lLnNoaWZ0KCk7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChuLCJzY29wZSIpLHQuYXNzZXJ0Tm90TnVsbChyLCJtZXRob2QiKSx0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKHIpLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZnVuY3Rpb24oKXt2YXIgdD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3JldHVybiByLmFwcGx5KG4sZS5jb25jYXQodCkpfX0sdC5pc0Z1bmN0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiEhKGUmJmUuY29uc3RydWN0b3ImJmUuY2FsbCYmZS5hcHBseSl9LHQuaXNBcnJheT1mdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfSx0LmtleXM9ZnVuY3Rpb24oZSl7dmFyIG49W107Zm9yKHZhciByIGluIHQuYXNzZXJ0Tm90TnVsbChlLCJtYXAiKSxlKW4ucHVzaChyKTtyZXR1cm4gbn0sdC52YWx1ZXM9ZnVuY3Rpb24oZSl7dmFyIG49W107Zm9yKHZhciByIGluIHQuYXNzZXJ0Tm90TnVsbChlLCJtYXAiKSxlKW4ucHVzaChlW3JdKTtyZXR1cm4gbn0sdC5lbnRyaWVzPWZ1bmN0aW9uKGUpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiBlKXQucHVzaCh7a2V5Om4sdmFsdWU6ZVtuXX0pO3JldHVybiB0fSx0Lm1lcmdlPWZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLG49e307cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5lbnRyaWVzKGUpLmZvckVhY2goKGZ1bmN0aW9uKGUpe25bZS5rZXldPWUudmFsdWV9KSl9KSksbn0sdC5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sdC5maW5kPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspaWYodChlW25dKSlyZXR1cm4gZVtuXTtyZXR1cm4gbnVsbH0sdC5jb250YWlucz1mdW5jdGlvbihlLG4pe3JldHVybiBlIGluc3RhbmNlb2YgQXJyYXk/bnVsbCE9dC5maW5kKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09bn0pKTpuIGluIGV9LHQuY29udGFpbnNWYWx1ZT1mdW5jdGlvbihlLG4pe3JldHVybiBlIGluc3RhbmNlb2YgQXJyYXk/bnVsbCE9dC5maW5kKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09bn0pKTpudWxsIT10LmZpbmQodC52YWx1ZXMoZSksKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09bn0pKX0sdC5yYW5kb21JZD1mdW5jdGlvbigpe3JldHVybiB0LnNwcmludGYoIiVzLSVzIix0Lm5vdygpLE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpKX0sdC5tYWtlRW51bT1mdW5jdGlvbihlKXt2YXIgdD17fTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1lLnJlcGxhY2UoL1wuPyhbYS16XSspXz8vZywoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpKyJfIn0pKS5yZXBsYWNlKC9fJC8sIiIpO3Rbbl09ZX0pKSx0fSx0Lm1ha2VOYW1lc3BhY2VkRW51bT1mdW5jdGlvbihlLG4pe3ZhciByPXQubWFrZUVudW0obik7cmV0dXJuIHQua2V5cyhyKS5mb3JFYWNoKChmdW5jdGlvbihuKXtyW25dPXQuc3ByaW50ZigiJXM6OiVzIixlLHJbbl0pfSkpLHJ9LHQubWFrZUdlbmVyaWNOYW1lc3BhY2VkRW51bT1mdW5jdGlvbihlLG4scil7dmFyIG89dC5tYWtlRW51bShuKTtyZXR1cm4gdC5rZXlzKG8pLmZvckVhY2goKGZ1bmN0aW9uKG4pe29bbl09dC5zcHJpbnRmKCIlcyIrcisiJXMiLGUsb1tuXSl9KSksb30sdC5pc0Nocm9tZUJyb3dzZXI9ZnVuY3Rpb24oKXtyZXR1cm4tMSE9PW4uaW5kZXhPZigiQ2hyb21lIil9LHQuaXNGaXJlZm94QnJvd3Nlcj1mdW5jdGlvbigpe3JldHVybi0xIT09bi5pbmRleE9mKCJGaXJlZm94Iil9LHQuaXNPcGVyYUJyb3dzZXI9ZnVuY3Rpb24oKXtyZXR1cm4tMSE9PW4uaW5kZXhPZigiT3BlcmEiKX0sdC5pc0VkZ2VCcm93c2VyPWZ1bmN0aW9uKCl7cmV0dXJuLTEhPT1uLmluZGV4T2YoIkVkZyIpfSx0LmdldENocm9tZUJyb3dzZXJWZXJzaW9uPWZ1bmN0aW9uKCl7dmFyIGU9bi5zdWJzdHJpbmcobi5pbmRleE9mKCJDaHJvbWUiKSs3KTtyZXR1cm4gZT9wYXJzZUZsb2F0KGUpOi0xfSx0LmdldEZpcmVmb3hCcm93c2VyVmVyc2lvbj1mdW5jdGlvbigpe3ZhciBlPW4uc3Vic3RyaW5nKG4uaW5kZXhPZigiRmlyZWZveCIpKzgpO3JldHVybiBlP3BhcnNlRmxvYXQoZSk6LTF9LHQuaXNWYWxpZExvY2FsZT1mdW5jdGlvbihlKXtyZXR1cm5be2lkOiJlbl9VUyIsbGFiZWw6IkVuZ2xpc2gifSx7aWQ6ImRlX0RFIixsYWJlbDoiRGV1dHNjaCJ9LHtpZDoiZXNfRVMiLGxhYmVsOiJFc3Bhw7FvbCJ9LHtpZDoiZnJfRlIiLGxhYmVsOiJGcmFuw6dhaXMifSx7aWQ6ImphX0pQIixsYWJlbDoi5pel5pys6KqeIn0se2lkOiJpdF9JVCIsbGFiZWw6Ikl0YWxpYW5vIn0se2lkOiJrb19LUiIsbGFiZWw6Iu2VnOq1reyWtCJ9LHtpZDoicHRfQlIiLGxhYmVsOiJQb3J0dWd1w6pzIn0se2lkOiJ6aF9DTiIsbGFiZWw6IuS4reaWhyjnroDkvZMpIn0se2lkOiJ6aF9UVyIsbGFiZWw6IuS4reaWhyjnuYHpq5QpIn1dLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaWR9KSkuaW5jbHVkZXMoZSl9LHQuZ2V0T3BlcmFCcm93c2VyVmVyc2lvbj1mdW5jdGlvbigpe3ZhciBlPW4uaW5kZXhPZigiT3BlcmEiKSx0PS0xIT09bi5pbmRleE9mKCJWZXJzaW9uIik/bi5zdWJzdHJpbmcoZSs4KTpuLnN1YnN0cmluZyhlKzYpO3JldHVybiB0P3BhcnNlRmxvYXQodCk6LTF9LHQuaW5kZXg9ZnVuY3Rpb24oZSx0KXt2YXIgbj17fTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXtuW3QoZSldPWV9KSksbn0sdC5zZXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dFtlXT0xfSkpLHR9LHQucmVsYXRpdmVDb21wbGVtZW50PWZ1bmN0aW9uKGUsbil7dmFyIHI9e307cmV0dXJuIHQua2V5cyhuKS5mb3JFYWNoKChmdW5jdGlvbih0KXt0IGluIGV8fChyW3RdPW5bdF0pfSkpLHJ9LHQuYXNzZXJ0VHJ1ZT1mdW5jdGlvbihlLG4pe2lmKCFlKXRocm93IG5ldyB0LlZhbHVlRXJyb3Iobil9LHQuYXNzZXJ0Tm90TnVsbD1mdW5jdGlvbihlLG4pe3JldHVybiB0LmFzc2VydFRydWUobnVsbCE9ZSYmdm9pZCAwIT09dHlwZW9mIGUsdC5zcHJpbnRmKCIlcyBtdXN0IGJlIHByb3ZpZGVkIixufHwiQSB2YWx1ZSIpKSxlfSx0LmRlZXBjb3B5PWZ1bmN0aW9uKGUpe3JldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUpKX0sdC5kZWVwY29weUNyb3NzT3JpZ2luRXZlbnQ9ZnVuY3Rpb24oZSl7Y29uc3Qgbj17fTtyZXR1cm4gci5mb3JFYWNoKChyPT57dHJ5e25bcl09ZVtyXX1jYXRjaChlKXt0LmdldExvZygpLmluZm8oImRlZXBjb3B5Q3Jvc3NPcmlnaW5FdmVudCBmYWlsZWQgb24ga2V5OiAiLHIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fSkpLHQuZGVlcGNvcHkobil9LHQuZ2V0QmFzZVVybD1mdW5jdGlvbigpe3ZhciBuPWUubG9jYXRpb247cmV0dXJuIHQuc3ByaW50ZigiJXMvLyVzOiVzIixuLnByb3RvY29sLG4uaG9zdG5hbWUsbi5wb3J0KX0sdC5nZXRVcmxXaXRoUHJvdG9jb2w9ZnVuY3Rpb24obil7dmFyIHI9ZS5sb2NhdGlvbi5wcm90b2NvbDtyZXR1cm4gbi5zdWJzdHIoMCxyLmxlbmd0aCkhPT1yP3Quc3ByaW50ZigiJXMvLyVzIixyLG4pOm59LHQuaXNGcmFtZWQ9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIHdpbmRvdy5zZWxmIT09d2luZG93LnRvcH1jYXRjaChlKXtyZXR1cm4hMH19LHQuaGFzT3RoZXJDb25uZWN0ZWRDQ1BzPWZ1bmN0aW9uKCl7cmV0dXJuIHQubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzPjF9LHQuZmV0Y2g9ZnVuY3Rpb24oZSxuLHIsbyl7cmV0dXJuIG89b3x8NSxyPXJ8fDFlMyxuPW58fHt9LG5ldyBQcm9taXNlKChmdW5jdGlvbihpLHMpeyFmdW5jdGlvbiBvKGEpe2ZldGNoKGUsbikudGhlbigoZnVuY3Rpb24oZSl7ZS5zdGF0dXM9PT10LkhUVFBfU1RBVFVTX0NPREVTLlNVQ0NFU1M/ZS5qc29uKCkudGhlbigoZT0+aShlKSkpLmNhdGNoKCgoKT0+aSh7fSkpKToxIT09YSYmKGUuc3RhdHVzPj10LkhUVFBfU1RBVFVTX0NPREVTLklOVEVSTkFMX1NFUlZFUl9FUlJPUnx8ZS5zdGF0dXM9PT10LkhUVFBfU1RBVFVTX0NPREVTLlRPT19NQU5ZX1JFUVVFU1RTKT9zZXRUaW1lb3V0KChmdW5jdGlvbigpe28oLS1hKX0pLHIpOnMoZSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3MoZSl9KSl9KG8pfSkpfSx0LmZldGNoV2l0aFRpbWVvdXQ9YXN5bmMgZnVuY3Rpb24oZSxuLHIsbyxpKXtpZihyPXJ8fHt9LCFuKXJldHVybiB0LmZldGNoKGUscixvLGkpO2NvbnN0IHM9bmV3IEFib3J0Q29udHJvbGxlcixhPXNldFRpbWVvdXQoKCgpPT5zLmFib3J0KCkpLG4pLGM9YXdhaXQgdC5mZXRjaChlLHsuLi5yLHNpZ25hbDpzLnNpZ25hbH0sbyxpKTtyZXR1cm4gY2xlYXJUaW1lb3V0KGEpLGN9LHQuYmFja29mZj1mdW5jdGlvbihuLHIsbyxpKXt0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG4pLCJmdW5jIG11c3QgYmUgYSBGdW5jdGlvbiIpO3ZhciBzPXRoaXM7bih7c3VjY2VzczpmdW5jdGlvbihlKXtpJiZpLnN1Y2Nlc3MmJmkuc3VjY2VzcyhlKX0sZmFpbHVyZTpmdW5jdGlvbih0LGEpe2lmKG8+MCl7dmFyIGM9MipyKk1hdGgucmFuZG9tKCk7ZS5zZXRUaW1lb3V0KChmdW5jdGlvbigpe3MuYmFja29mZihuLDIqYywtLW8saSl9KSxjKX1lbHNlIGkmJmkuZmFpbHVyZSYmaS5mYWlsdXJlKHQsYSl9fSl9LHQucHVibGlzaE1ldHJpYz1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkV2ZW50VHlwZS5DTElFTlRfTUVUUklDLGRhdGE6ZX0pfSx0LnB1Ymxpc2hTb2Z0cGhvbmVTdGF0cz1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkV2ZW50VHlwZS5TT0ZUUEhPTkVfU1RBVFMsZGF0YTplfSl9LHQucHVibGlzaFNvZnRwaG9uZVJlcG9ydD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkV2ZW50VHlwZS5TT0ZUUEhPTkVfUkVQT1JULGRhdGE6ZX0pfSx0LnB1Ymxpc2hDbGlja1N0cmVhbURhdGE9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5FdmVudFR5cGUuQ0xJQ0tfU1RSRUFNX0RBVEEsZGF0YTplfSl9LHQucHVibGlzaENsaWVudFNpZGVMb2dzPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIodC5FdmVudFR5cGUuQ0xJRU5UX1NJREVfTE9HUyxlKX0sdC5hZGROYW1lc3BhY2VUb0xvZ3M9ZnVuY3Rpb24oZSl7WyJsb2ciLCJlcnJvciIsIndhcm4iLCJpbmZvIiwiZGVidWciXS5mb3JFYWNoKCh0PT57Y29uc3Qgbj13aW5kb3cuY29uc29sZVt0XTt3aW5kb3cuY29uc29sZVt0XT1mdW5jdGlvbigpe2NvbnN0IHQ9QXJyYXkuZnJvbShhcmd1bWVudHMpO3QudW5zaGlmdChgWyR7ZX1dYCksbi5hcHBseSh3aW5kb3cuY29uc29sZSx0KX19KSl9LHQuUG9wdXBNYW5hZ2VyPWZ1bmN0aW9uKCl7fSx0LlBvcHVwTWFuYWdlci5wcm90b3R5cGUub3Blbj1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5fZ2V0TGFzdE9wZW5lZFRpbWVzdGFtcCh0KSxvPShuZXcgRGF0ZSkuZ2V0VGltZSgpLGk9bnVsbDtpZihvLXI+ODY0ZTUpe2lmKG4pe3ZhciBzPW4uaGVpZ2h0fHw1NzgsYT1uLndpZHRofHw0MzMsYz1uLnRvcHx8MCx1PW4ubGVmdHx8MDsoaT13aW5kb3cub3BlbigiIix0LCJ3aWR0aD0iK2ErIiwgaGVpZ2h0PSIrcysiLCB0b3A9IitjKyIsIGxlZnQ9Iit1KSkubG9jYXRpb24hPT1lJiYoaT13aW5kb3cub3BlbihlLHQsIndpZHRoPSIrYSsiLCBoZWlnaHQ9IitzKyIsIHRvcD0iK2MrIiwgbGVmdD0iK3UpKX1lbHNlKGk9d2luZG93Lm9wZW4oIiIsdCkpLmxvY2F0aW9uIT09ZSYmKGk9d2luZG93Lm9wZW4oZSx0KSk7dGhpcy5fc2V0TGFzdE9wZW5lZFRpbWVzdGFtcCh0LG8pfXJldHVybiBpfSx0LlBvcHVwTWFuYWdlci5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fZ2V0TG9jYWxTdG9yYWdlS2V5KHQpO2UubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0obil9LHQuUG9wdXBNYW5hZ2VyLnByb3RvdHlwZS5fZ2V0TGFzdE9wZW5lZFRpbWVzdGFtcD1mdW5jdGlvbih0KXt2YXIgbj10aGlzLl9nZXRMb2NhbFN0b3JhZ2VLZXkodCkscj1lLmxvY2FsU3RvcmFnZS5nZXRJdGVtKG4pO3JldHVybiByP3BhcnNlSW50KHIsMTApOjB9LHQuUG9wdXBNYW5hZ2VyLnByb3RvdHlwZS5fc2V0TGFzdE9wZW5lZFRpbWVzdGFtcD1mdW5jdGlvbih0LG4pe3ZhciByPXRoaXMuX2dldExvY2FsU3RvcmFnZUtleSh0KTtlLmxvY2FsU3RvcmFnZS5zZXRJdGVtKHIsIiIrbil9LHQuUG9wdXBNYW5hZ2VyLnByb3RvdHlwZS5fZ2V0TG9jYWxTdG9yYWdlS2V5PWZ1bmN0aW9uKGUpe3JldHVybiJjb25uZWN0UG9wdXBNYW5hZ2VyOjoiK2V9O3ZhciBvPXQubWFrZUVudW0oWyJncmFudGVkIiwiZGVuaWVkIiwiZGVmYXVsdCJdKTt0Lk5vdGlmaWNhdGlvbk1hbmFnZXI9ZnVuY3Rpb24oKXt0aGlzLnF1ZXVlPVtdLHRoaXMucGVybWlzc2lvbj1vLkRFRkFVTFR9LHQuTm90aWZpY2F0aW9uTWFuYWdlci5wcm90b3R5cGUucmVxdWVzdFBlcm1pc3Npb249ZnVuY3Rpb24oKXt2YXIgbj10aGlzOyJOb3RpZmljYXRpb24iaW4gZT9lLk5vdGlmaWNhdGlvbi5wZXJtaXNzaW9uPT09by5ERU5JRUQ/KHQuZ2V0TG9nKCkud2FybigiVGhlIHVzZXIgaGFzIHJlcXVlc3RlZCB0byBub3QgcmVjZWl2ZSBub3RpZmljYXRpb25zLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy5wZXJtaXNzaW9uPW8uREVOSUVEKTp0aGlzLnBlcm1pc3Npb24hPT1vLkdSQU5URUQmJmUuTm90aWZpY2F0aW9uLnJlcXVlc3RQZXJtaXNzaW9uKCkudGhlbigoZnVuY3Rpb24oZSl7bi5wZXJtaXNzaW9uPWUsZT09PW8uR1JBTlRFRD9uLl9zaG93UXVldWVkKCk6bi5xdWV1ZT1bXX0pKToodC5nZXRMb2coKS53YXJuKCJUaGlzIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IG5vdGlmaWNhdGlvbnMuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0aGlzLnBlcm1pc3Npb249by5ERU5JRUQpfSx0Lk5vdGlmaWNhdGlvbk1hbmFnZXIucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oZSxuKXtpZih0aGlzLnBlcm1pc3Npb249PT1vLkdSQU5URUQpcmV0dXJuIHRoaXMuX3Nob3dJbXBsKHt0aXRsZTplLG9wdGlvbnM6bn0pO2lmKHRoaXMucGVybWlzc2lvbj09PW8uREVOSUVEKXQuZ2V0TG9nKCkud2FybigiVW5hYmxlIHRvIHNob3cgbm90aWZpY2F0aW9uLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7dGl0bGU6ZSxvcHRpb25zOm59KTtlbHNle3ZhciByPXt0aXRsZTplLG9wdGlvbnM6bn07dC5nZXRMb2coKS53YXJuKCJEZWZlcnJpbmcgbm90aWZpY2F0aW9uIHVudGlsIHVzZXIgZGVjaWRlcyB0byBhbGxvdyBvciBkZW55LiIpLndpdGhPYmplY3Qocikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0aGlzLnF1ZXVlLnB1c2gocil9fSx0Lk5vdGlmaWNhdGlvbk1hbmFnZXIucHJvdG90eXBlLl9zaG93UXVldWVkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMucXVldWUubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gZS5fc2hvd0ltcGwodCl9KSk7cmV0dXJuIHRoaXMucXVldWU9W10sdH0sdC5Ob3RpZmljYXRpb25NYW5hZ2VyLnByb3RvdHlwZS5fc2hvd0ltcGw9ZnVuY3Rpb24odCl7dmFyIG49bmV3IGUuTm90aWZpY2F0aW9uKHQudGl0bGUsdC5vcHRpb25zKTtyZXR1cm4gdC5vcHRpb25zLmNsaWNrZWQmJihuLm9uY2xpY2s9ZnVuY3Rpb24oKXt0Lm9wdGlvbnMuY2xpY2tlZC5jYWxsKG4pfSksbn0sdC5WYWx1ZUVycm9yPWZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLG49ZS5zaGlmdCgpLHI9bmV3IEVycm9yKHQudnNwcmludGYobixlKSk7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZihyLHQuVmFsdWVFcnJvci5wcm90b3R5cGUpLHJ9LE9iamVjdC5zZXRQcm90b3R5cGVPZih0LlZhbHVlRXJyb3IucHJvdG90eXBlLEVycm9yLnByb3RvdHlwZSksT2JqZWN0LnNldFByb3RvdHlwZU9mKHQuVmFsdWVFcnJvcixFcnJvciksdC5WYWx1ZUVycm9yLnByb3RvdHlwZS5uYW1lPSJWYWx1ZUVycm9yIix0Lk5vdEltcGxlbWVudGVkRXJyb3I9ZnVuY3Rpb24oKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCksbj1lLnNoaWZ0KCkscj1uZXcgRXJyb3IodC52c3ByaW50ZihuLGUpKTtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKHIsdC5Ob3RJbXBsZW1lbnRlZEVycm9yLnByb3RvdHlwZSkscn0sT2JqZWN0LnNldFByb3RvdHlwZU9mKHQuTm90SW1wbGVtZW50ZWRFcnJvci5wcm90b3R5cGUsRXJyb3IucHJvdG90eXBlKSxPYmplY3Quc2V0UHJvdG90eXBlT2YodC5Ob3RJbXBsZW1lbnRlZEVycm9yLEVycm9yKSx0Lk5vdEltcGxlbWVudGVkRXJyb3IucHJvdG90eXBlLm5hbWU9Ik5vdEltcGxlbWVudGVkRXJyb3IiLHQuU3RhdGVFcnJvcj1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSxuPWUuc2hpZnQoKSxyPW5ldyBFcnJvcih0LnZzcHJpbnRmKG4sZSkpO3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2Yocix0LlN0YXRlRXJyb3IucHJvdG90eXBlKSxyfSxPYmplY3Quc2V0UHJvdG90eXBlT2YodC5TdGF0ZUVycm9yLnByb3RvdHlwZSxFcnJvci5wcm90b3R5cGUpLE9iamVjdC5zZXRQcm90b3R5cGVPZih0LlN0YXRlRXJyb3IsRXJyb3IpLHQuU3RhdGVFcnJvci5wcm90b3R5cGUubmFtZT0iU3RhdGVFcnJvciIsdC5Wb2ljZUlkRXJyb3I9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt9O3JldHVybiByLnR5cGU9ZSxyLm1lc3NhZ2U9dCxyLnN0YWNrPUVycm9yKHQpLnN0YWNrLHIuZXJyPW4scn0sdC5pc0NDUD1mdW5jdGlvbigpe3JldHVybiEhdC5jb3JlLnVwc3RyZWFtJiYiQ29ubmVjdFNoYXJlZFdvcmtlckNvbmR1aXQiPT09dC5jb3JlLmdldFVwc3RyZWFtKCkubmFtZX0sdC5pc1NoYXJlZFdvcmtlcj1mdW5jdGlvbigpe3JldHVybiB0LndvcmtlciYmISF0Lndvcmtlci5jbGllbnRFbmdpbmV9LHQuaXNDUk09ZnVuY3Rpb24oKXtyZXR1cm4hIXQuY29yZS51cHN0cmVhbSYmdC5jb3JlLmdldFVwc3RyZWFtKClpbnN0YW5jZW9mIHQuSUZyYW1lQ29uZHVpdH19KCl9LDczNjooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10LHQud29ya2VyPXt9O3ZhciBuPSJMQURTLkdldEFnZW50RmFpbG92ZXJDb25maWd1cmF0aW9uIixyPWZ1bmN0aW9uKCl7dGhpcy50b3BpY01hc3Rlck1hcD17fX07ci5wcm90b3R5cGUuZ2V0TWFzdGVyPWZ1bmN0aW9uKGUpe3JldHVybiB0LmFzc2VydE5vdE51bGwoZSwidG9waWMiKSx0aGlzLnRvcGljTWFzdGVyTWFwW2VdfHxudWxsfSxyLnByb3RvdHlwZS5zZXRNYXN0ZXI9ZnVuY3Rpb24oZSxuKXt0LmFzc2VydE5vdE51bGwoZSwidG9waWMiKSx0LmFzc2VydE5vdE51bGwobiwiaWQiKSx0aGlzLnRvcGljTWFzdGVyTWFwW2VdPW59LHIucHJvdG90eXBlLnJlbW92ZU1hc3Rlcj1mdW5jdGlvbihlKXt0LmFzc2VydE5vdE51bGwoZSwiaWQiKTt2YXIgbj10aGlzO3QuZW50cmllcyh0aGlzLnRvcGljTWFzdGVyTWFwKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnZhbHVlPT09ZX0pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtkZWxldGUgbi50b3BpY01hc3Rlck1hcFtlLmtleV19KSl9O3ZhciBvPWZ1bmN0aW9uKGUpe3QuQ2xpZW50QmFzZS5jYWxsKHRoaXMpLHRoaXMuY29uZHVpdD1lfTsoby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0LkNsaWVudEJhc2UucHJvdG90eXBlKSkuY29uc3RydWN0b3I9byxvLnByb3RvdHlwZS5fY2FsbEltcGw9ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXRoaXMsaT0obmV3IERhdGUpLmdldFRpbWUoKTt0LmNvbnRhaW5zVmFsdWUodC5BZ2VudEFwcENsaWVudE1ldGhvZHMsZSk/dC5jb3JlLmdldEFnZW50QXBwQ2xpZW50KCkuX2NhbGxJbXBsKGUsbix7c3VjY2VzczpmdW5jdGlvbih0KXtvLl9yZWNvcmRBUElMYXRlbmN5KGUsaSksci5zdWNjZXNzKHQpfSxmYWlsdXJlOmZ1bmN0aW9uKHQpe28uX3JlY29yZEFQSUxhdGVuY3koZSxpLHQpLHIuZmFpbHVyZSh0KX19KTp0LmNvbnRhaW5zVmFsdWUodC5UYXNrVGVtcGxhdGVzQ2xpZW50TWV0aG9kcyxlKT90LmNvcmUuZ2V0VGFza1RlbXBsYXRlc0NsaWVudCgpLl9jYWxsSW1wbChlLG4se3N1Y2Nlc3M6ZnVuY3Rpb24odCl7by5fcmVjb3JkQVBJTGF0ZW5jeShlLGkpLHIuc3VjY2Vzcyh0KX0sZmFpbHVyZTpmdW5jdGlvbih0KXtvLl9yZWNvcmRBUElMYXRlbmN5KGUsaSx0KSxyLmZhaWx1cmUodCl9fSk6dC5jb3JlLmdldENsaWVudCgpLl9jYWxsSW1wbChlLG4se3N1Y2Nlc3M6ZnVuY3Rpb24odCxuKXtvLl9yZWNvcmRBUElMYXRlbmN5KGUsaSksci5zdWNjZXNzKHQsbil9LGZhaWx1cmU6ZnVuY3Rpb24odCxuKXtvLl9yZWNvcmRBUElMYXRlbmN5KGUsaSx0KSxyLmZhaWx1cmUodCxuKX0sYXV0aEZhaWx1cmU6ZnVuY3Rpb24odCxuKXtvLl9yZWNvcmRBUElMYXRlbmN5KGUsaSx0KSxyLmF1dGhGYWlsdXJlKCl9LGFjY2Vzc0RlbmllZDpmdW5jdGlvbih0LG4pe28uX3JlY29yZEFQSUxhdGVuY3koZSxpLHQpLHIuYWNjZXNzRGVuaWVkJiZyLmFjY2Vzc0RlbmllZCgpfX0pfSxvLnByb3RvdHlwZS5fcmVjb3JkQVBJTGF0ZW5jeT1mdW5jdGlvbihlLHQsbil7dmFyIHI9KG5ldyBEYXRlKS5nZXRUaW1lKCktdDt0aGlzLl9zZW5kQVBJTWV0cmljcyhlLHIsbil9LG8ucHJvdG90eXBlLl9zZW5kQVBJTWV0cmljcz1mdW5jdGlvbihlLG4scil7Y29uc3Qgbz17bmFtZTplLHRpbWU6bixlcnJvcjpyLGVycm9yNXh4OjB9LGk9ciYmci5zdGF0dXNDb2RlfHwyMDAscz1yJiZyLnJldHJ5U3RhdHVzfHx0LlJldHJ5U3RhdHVzLk5PTkUsYT1be25hbWU6Ikh0dHBTdGF0dXNDb2RlIix2YWx1ZTppfSx7bmFtZToiSHR0cEdlbmVyaWNTdGF0dXNDb2RlIix2YWx1ZTpgJHtpLnRvU3RyaW5nKCkuY2hhckF0KDApfVhYYH0se25hbWU6IlJldHJ5U3RhdHVzIix2YWx1ZTpzfV07IjUiPT09aS50b1N0cmluZygpLmNoYXJBdCgwKSYmKG8uZXJyb3I1eHg9MSksdGhpcy5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkFQSV9NRVRSSUMsey4uLm8sZGltZW5zaW9uczpbe25hbWU6IkNhdGVnb3J5Iix2YWx1ZToiQVBJIn1dLG9wdGlvbmFsRGltZW5zaW9uczphfSl9O3ZhciBpPWZ1bmN0aW9uKCl7dmFyIG49dGhpczt0aGlzLm11bHRpcGxleGVyPW5ldyB0LlN0cmVhbU11bHRpcGxleGVyLHRoaXMuY29uZHVpdD1uZXcgdC5Db25kdWl0KCJBbWF6b25Db25uZWN0U2hhcmVkV29ya2VyIixudWxsLHRoaXMubXVsdGlwbGV4ZXIpLHRoaXMuY2xpZW50PW5ldyBvKHRoaXMuY29uZHVpdCksdGhpcy50aW1lb3V0PW51bGwsdGhpcy5hZ2VudD1udWxsLHRoaXMubmV4dFRva2VuPW51bGwsdGhpcy5pbml0RGF0YT17fSx0aGlzLnBvcnRDb25kdWl0TWFwPXt9LHRoaXMuc3RyZWFtTWFwQnlUYWJJZD17fSx0aGlzLm1hc3RlckNvb3JkPW5ldyByLHRoaXMubG9nc0J1ZmZlcj1bXSx0aGlzLnN1cHByZXNzPSExLHRoaXMuZm9yY2VPZmZsaW5lPSExLHRoaXMubG9uZ1BvbGxpbmdPcHRpb25zPXthbGxvd0xvbmdQb2xsaW5nU2hhZG93TW9kZTohMSxhbGxvd0xvbmdQb2xsaW5nV2Vic29ja2V0T25seU1vZGU6ITF9LHRoaXMuZHJQb2xsaW5nVXJsPW51bGwsdGhpcy50aGlzQXJuPW51bGwsdGhpcy5vdGhlckFybj1udWxsLHRoaXMucGVuZGluZ0ZhaWxvdmVyPW51bGw7dmFyIGk9bnVsbDt0LnJvb3RMb2dnZXI9bmV3IHQuRG93bnN0cmVhbUNvbmR1aXRMb2dnZXIodGhpcy5jb25kdWl0KSx0aGlzLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLlNFTkRfTE9HUywoZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5wdXNoTG9nc0Rvd25zdHJlYW0oZSksbi5sb2dzQnVmZmVyPW4ubG9nc0J1ZmZlci5jb25jYXQoZSksbi5sb2dzQnVmZmVyLmxlbmd0aD40MDAmJm4uaGFuZGxlU2VuZExvZ3NSZXF1ZXN0KG4ubG9nc0J1ZmZlcil9KSksdGhpcy5jb25kdWl0Lm9uRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuU1VQUFJFU1MsKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZGVidWcoIltEaXNhc3RlciBSZWNvdmVyeV0gU2V0dGluZyBTdXBwcmVzcyB0byAlcyIsZS5zdXBwcmVzcykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLnN1cHByZXNzPWUuc3VwcHJlc3N8fCExLG4uc3VwcHJlc3N8fChuLmZvcmNlT2ZmbGluZT0hMSksKHZvaWQgMD09PWUuc2hvdWxkU2VuZEZhaWxvdmVyRG93bnN0cmVhbXx8ZS5zaG91bGRTZW5kRmFpbG92ZXJEb3duc3RyZWFtKSYmbi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5GQUlMT1ZFUix7aXNQcmltYXJ5OiFuLnN1cHByZXNzfSl9KSksdGhpcy5jb25kdWl0Lm9uRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRk9SQ0VfT0ZGTElORSwoZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5kZWJ1ZygiW0Rpc2FzdGVyIFJlY292ZXJ5XSBTZXR0aW5nIEZPUkNFX09GRkxJTkUgdG8gJXMiLGUub2ZmbGluZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLmZvcmNlT2ZmbGluZXx8KG4ucGVuZGluZ0ZhaWxvdmVyPSExLG4uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRkFJTE9WRVIse2lzUHJpbWFyeTohMSxuZXh0QWN0aXZlQXJuOmUubmV4dEFjdGl2ZUFybn0pKSxuLmZvcmNlT2ZmbGluZT1lLm9mZmxpbmV8fCExfSkpLHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5JTklUX0RSX1BPTExJTkcmJnRoaXMuY29uZHVpdC5vbkRvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLklOSVRfRFJfUE9MTElORywoZnVuY3Rpb24oZSl7dmFyIHI9dC5nZXRMb2coKTtuLmRyUG9sbGluZ1VybD8oci5kZWJ1ZyhgW0Rpc2FzdGVyIFJlY292ZXJ5XSBBZGRpbmcgbmV3IENDUCB0byBhY3RpdmUgcmVnaW9uIHBvbGxpbmcgZm9yIGluc3RhbmNlICR7ZS5pbnN0YW5jZUFybn1gKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4ucG9sbEZvckFjdGl2ZVJlZ2lvbighMCwhMSkpOihyLmluZm8oYFtEaXNhc3RlciBSZWNvdmVyeV0gSW5pdGlhbGl6aW5nIGFjdGl2ZSByZWdpb24gcG9sbGluZyBmb3IgaW5zdGFuY2UgJHtlLmluc3RhbmNlQXJufWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi50aGlzQXJuPWUuaW5zdGFuY2VBcm4sbi5vdGhlckFybj1lLm90aGVyQXJuLG4uZ2V0UHJlc2lnbmVkRGlzY292ZXJ5VXJsKCkudGhlbigoZT0+e24uZHJQb2xsaW5nVXJsPWUsbi5wb2xsRm9yQWN0aXZlUmVnaW9uKCEwLCEwKX0pLCh0PT57ci5lcnJvcihgW0Rpc2FzdGVyIFJlY292ZXJ5XSBGYWlsZWQgdG8gZ2V0IHByZXNpZ25lZCBVUkwgZm9yIGluc3RhbmNlICR7ZS5pbnN0YW5jZUFybn07IHN1cHByZXNzaW5nIGNvbnRhY3RzYCkud2l0aEV4Y2VwdGlvbih0KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4uc3VwcHJlc3M9ITB9KSkpfSkpLHRoaXMuY29uZHVpdC5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuQ09ORklHVVJFLChmdW5jdGlvbihyKXtjb25zb2xlLmxvZygiQEBAIGNvbmZpZ3VyZSBldmVudCBoYW5kbGVyIixyKTt0cnl7ci5hdXRoVG9rZW4mJnIuYXV0aFRva2VuIT09bi5pbml0RGF0YS5hdXRoVG9rZW4mJihuLmluaXREYXRhPXIsdC5jb3JlLmluaXQociksci5sb25nUG9sbGluZ09wdGlvbnMmJigiYm9vbGVhbiI9PXR5cGVvZiByLmxvbmdQb2xsaW5nT3B0aW9ucy5hbGxvd0xvbmdQb2xsaW5nU2hhZG93TW9kZSYmKG4ubG9uZ1BvbGxpbmdPcHRpb25zLmFsbG93TG9uZ1BvbGxpbmdTaGFkb3dNb2RlPXIubG9uZ1BvbGxpbmdPcHRpb25zLmFsbG93TG9uZ1BvbGxpbmdTaGFkb3dNb2RlKSwiYm9vbGVhbiI9PXR5cGVvZiByLmxvbmdQb2xsaW5nT3B0aW9ucy5hbGxvd0xvbmdQb2xsaW5nV2Vic29ja2V0T25seU1vZGUmJihuLmxvbmdQb2xsaW5nT3B0aW9ucy5hbGxvd0xvbmdQb2xsaW5nV2Vic29ja2V0T25seU1vZGU9ci5sb25nUG9sbGluZ09wdGlvbnMuYWxsb3dMb25nUG9sbGluZ1dlYnNvY2tldE9ubHlNb2RlKSksaT90LmdldExvZygpLmluZm8oIk5vdCBJbml0aWFsaXppbmcgYSBuZXcgV2Vic29ja2V0TWFuYWdlciBpbnN0YW5jZSwgc2luY2Ugb25lIGFscmVhZHkgZXhpc3RzIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKToodC5nZXRMb2coKS5pbmZvKCJDcmVhdGluZyBhIG5ldyBXZWJzb2NrZXQgY29ubmVjdGlvbiBmb3IgQ0NQIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0LldlYlNvY2tldE1hbmFnZXIuc2V0R2xvYmFsQ29uZmlnKHtsb2dnZXJDb25maWc6e2xvZ2dlcjp0LmdldExvZygpfX0pLChpPXQuV2ViU29ja2V0TWFuYWdlci5jcmVhdGUoKSkub25Jbml0RmFpbHVyZSgoZnVuY3Rpb24oKXtuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuSU5JVF9GQUlMVVJFKX0pKSxpLm9uQ29ubmVjdGlvbk9wZW4oKGZ1bmN0aW9uKGUpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5DT05ORUNUSU9OX09QRU4sZSl9KSksaS5vbkNvbm5lY3Rpb25DbG9zZSgoZnVuY3Rpb24oZSl7bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLkNPTk5FQ1RJT05fQ0xPU0UsZSl9KSksaS5vbkNvbm5lY3Rpb25HYWluKChmdW5jdGlvbigpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkFnZW50RXZlbnRzLldFQlNPQ0tFVF9DT05ORUNUSU9OX0dBSU5FRCksbi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLkNPTk5FQ1RJT05fR0FJTil9KSksaS5vbkNvbm5lY3Rpb25Mb3N0KChmdW5jdGlvbihlKXtuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5BZ2VudEV2ZW50cy5XRUJTT0NLRVRfQ09OTkVDVElPTl9MT1NULGUpLG4uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5DT05ORUNUSU9OX0xPU1QsZSl9KSksaS5vblN1YnNjcmlwdGlvblVwZGF0ZSgoZnVuY3Rpb24oZSl7bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLlNVQlNDUklQVElPTl9VUERBVEUsZSl9KSksaS5vblN1YnNjcmlwdGlvbkZhaWx1cmUoKGZ1bmN0aW9uKGUpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5TVUJTQ1JJUFRJT05fRkFJTFVSRSxlKX0pKSxpLm9uQWxsTWVzc2FnZSgoZnVuY3Rpb24oZSl7bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLkFMTF9NRVNTQUdFLGUpfSkpLG4uY29uZHVpdC5vbkRvd25zdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuU0VORCwoZnVuY3Rpb24oZSl7aS5zZW5kTWVzc2FnZShlKX0pKSxuLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLlNVQlNDUklCRSwoZnVuY3Rpb24oZSl7aS5zdWJzY3JpYmVUb3BpY3MoZSl9KSksaS5pbml0KHQuaGl0Y2gobixuLmdldFdlYlNvY2tldFVybCkpLnRoZW4oKGZ1bmN0aW9uKHIpe3RyeXtpZihyJiYhci53ZWJTb2NrZXRDb25uZWN0aW9uRmFpbGVkKXQuZ2V0TG9nKCkuaW5mbygiS2lja2luZyBvZmYgYWdlbnQgcG9sbGluZyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5wb2xsRm9yQWdlbnQoKSx0LmdldExvZygpLmluZm8oIktpY2tpbmcgb2ZmIGNvbmZpZyBwb2xsaW5nIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLnBvbGxGb3JBZ2VudENvbmZpZ3VyYXRpb24oe3JlcGVhdEZvcmV2ZXI6ITB9KSx0LmdldExvZygpLmluZm8oIktpY2tpbmcgb2ZmIGF1dGggdG9rZW4gcG9sbGluZyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksZS5zZXRJbnRlcnZhbCh0LmhpdGNoKG4sbi5jaGVja0F1dGhUb2tlbiksM2U1KTtlbHNlIGlmKCF0LndlYlNvY2tldEluaXRGYWlsZWQpe2NvbnN0IGU9dC5XZWJTb2NrZXRFdmVudHMuSU5JVF9GQUlMVVJFO3Rocm93IG4uY29uZHVpdC5zZW5kRG93bnN0cmVhbShlKSx0LndlYlNvY2tldEluaXRGYWlsZWQ9ITAsbmV3IEVycm9yKGUpfX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJXZWJTb2NrZXQgZmFpbGVkIHRvIGluaXRpYWxpemUiKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fSkpKSl9Y2F0Y2goZSl7Y29uc29sZS5lcnJvcigiQEBAIGVycm9yIixlKX19KSksdGhpcy5jb25kdWl0Lm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5URVJNSU5BVEUsKGZ1bmN0aW9uKCl7bi5oYW5kbGVTZW5kTG9nc1JlcXVlc3Qobi5sb2dzQnVmZmVyKSx0LmNvcmUudGVybWluYXRlKCksbi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLlRFUk1JTkFURUQpfSkpLHRoaXMuY29uZHVpdC5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuU1lOQ0hST05JWkUsKGZ1bmN0aW9uKCl7bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkFDS05PV0xFREdFKX0pKSx0aGlzLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCwoZnVuY3Rpb24oZSl7bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKGUuZXZlbnQsZS5kYXRhKX0pKSxlLm9uY29ubmVjdD1mdW5jdGlvbihlKXt2YXIgcj1lLnBvcnRzWzBdLG89bmV3IHQuUG9ydFN0cmVhbShyKTtuLm11bHRpcGxleGVyLmFkZFN0cmVhbShvKSxyLnN0YXJ0KCk7dmFyIGk9bmV3IHQuQ29uZHVpdChvLmdldElkKCksbnVsbCxvKTtpLnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkFDS05PV0xFREdFLHtpZDpvLmdldElkKCl9KSxuLnBvcnRDb25kdWl0TWFwW28uZ2V0SWQoKV09aSxuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuVVBEQVRFX0NPTk5FQ1RFRF9DQ1BTLHtsZW5ndGg6T2JqZWN0LmtleXMobi5wb3J0Q29uZHVpdE1hcCkubGVuZ3RofSksbnVsbCE9PW4uYWdlbnQmJm4udXBkYXRlQWdlbnQoKSxpLm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5BUElfUkVRVUVTVCx0LmhpdGNoKG4sbi5oYW5kbGVBUElSZXF1ZXN0LGkpKSxpLm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5NQVNURVJfUkVRVUVTVCx0LmhpdGNoKG4sbi5oYW5kbGVNYXN0ZXJSZXF1ZXN0LGksby5nZXRJZCgpKSksaS5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuUkVMT0FEX0FHRU5UX0NPTkZJR1VSQVRJT04sdC5oaXRjaChuLG4ucG9sbEZvckFnZW50Q29uZmlndXJhdGlvbikpLGkub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLlRBQl9JRCx0LmhpdGNoKG4sbi5oYW5kbGVUYWJJZEV2ZW50LG8pKSxpLm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5DTE9TRSx0LmhpdGNoKG4sbi5oYW5kbGVDbG9zZUV2ZW50LG8pKX19O2kucHJvdG90eXBlLnBvbGxGb3JBY3RpdmVSZWdpb249ZnVuY3Rpb24ocixvKXt2YXIgaT10aGlzLHM9dC5nZXRMb2coKTtpZighaS5kclBvbGxpbmdVcmwpdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiW0Rpc2FzdGVyIFJlY292ZXJ5XSBUcmllZCB0byBwb2xsIGZvciBhY3RpdmUgcmVnaW9uIHdpdGhvdXQgZmlyc3QgaW5pdGlhbGl6aW5nIERSIHBvbGxpbmcgaW4gdGhlIHdvcmtlci4iKTtzLmRlYnVnKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIFBvbGxpbmcgZm9yIGZhaWxvdmVyIHdpdGggcHJlc2lnbmVkIFVSTCBmb3IgaW5zdGFuY2UgJHtpLnRoaXNBcm59YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgYT0obmV3IERhdGUpLmdldFRpbWUoKTtyZXR1cm4gdC5mZXRjaFdpdGhUaW1lb3V0KGkuZHJQb2xsaW5nVXJsLDFlNCkuY2F0Y2goKGU9PntpZihlLnN0YXR1cyl7aWYoaS5jbGllbnQuX3JlY29yZEFQSUxhdGVuY3kobixhLHtzdGF0dXNDb2RlOmUuc3RhdHVzfSksW3QuSFRUUF9TVEFUVVNfQ09ERVMuQUNDRVNTX0RFTklFRCx0LkhUVFBfU1RBVFVTX0NPREVTLlVOQVVUSE9SSVpFRF0uaW5jbHVkZXMoZS5zdGF0dXMpKXJldHVybiBzLmluZm8oIltEaXNhc3RlciBSZWNvdmVyeV0gQWN0aXZlIHJlZ2lvbiBwb2xsaW5nIGZhaWxlZDsgdHJ5aW5nIHRvIGdldCBhIG5ldyBVUkwgZm9yIHBvbGxpbmcuIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkuZ2V0UHJlc2lnbmVkRGlzY292ZXJ5VXJsKCkudGhlbigoZT0+e2kuZHJQb2xsaW5nVXJsPWV9KSkudGhlbigoKCk9PihhPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHQuZmV0Y2hXaXRoVGltZW91dChpLmRyUG9sbGluZ1VybCwxZTQpKSkpO3ZhciByPWBbRGlzYXN0ZXIgUmVjb3ZlcnldIEZhaWxlZCB0byBwb2xsIGZvciBmYWlsb3ZlciBmb3IgaW5zdGFuY2UgJHtpLnRoaXNBcm59LCByZWNlaXZlZCB1bmV4cGVjdGVkIHJlc3BvbnNlIGNvZGUgJHtlLnN0YXR1c31gO3Rocm93IHMuZXJyb3Iocikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG5ldyBFcnJvcihyKX10aHJvdyByPWBbRGlzYXN0ZXIgUmVjb3ZlcnldIEZhaWxlZCB0byBwb2xsIGZvciBmYWlsb3ZlciBmb3IgaW5zdGFuY2UgJHtpLnRoaXNBcm59LCByZXF1ZXN0IHRpbWVkIG91dCBvciBhYm9ydGVkYCxpLmNsaWVudC5fcmVjb3JkQVBJTGF0ZW5jeShuLGEse3N0YXR1c0NvZGU6LTF9KSxzLmVycm9yKHIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuZXcgRXJyb3Iocil9KSkudGhlbigoZT0+e2lmKGkuY2xpZW50Ll9yZWNvcmRBUElMYXRlbmN5KG4sYSksImJvb2xlYW4iPT10eXBlb2YgZS5UZXJtaW5hdGVBY3RpdmVDb250YWN0cyl7dmFyIGM9IWUuVGVybWluYXRlQWN0aXZlQ29udGFjdHM7aWYoZS5JbnN0YW5jZUFybilpZihzLmRlYnVnKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIFN1Y2Nlc3NmdWxseSBwb2xsZWQgZm9yIGFjdGl2ZSByZWdpb24uIFByaW1hcnkgaW5zdGFuY2UgQVJOIGlzICR7ZS5JbnN0YW5jZUFybn0gYW5kIHNvZnQgZmFpbG92ZXIgaXMgYCsoYz8iZW5hYmxlZCI6ImRpc2FibGVkIikpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaS50aGlzQXJuPT09ZS5JbnN0YW5jZUFybiYmIWkuc3VwcHJlc3MmJnIpcy5kZWJ1ZyhgW0Rpc2FzdGVyIFJlY292ZXJ5XSBJbnN0YW5jZSAke2kudGhpc0Fybn0gaXMgYmVpbmcgc2V0IHRvIHByaW1hcnlgKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRkFJTE9WRVIse25leHRBY3RpdmVBcm46ZS5JbnN0YW5jZUFybn0pO2Vsc2UgaWYoaS5vdGhlckFybj09PWUuSW5zdGFuY2VBcm4pe2lmKCFjfHxvfHwhcnx8aS5zdXBwcmVzcyYmIWkucGVuZGluZ0ZhaWxvdmVyfHxpLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZBSUxPVkVSLHtuZXh0QWN0aXZlQXJuOmkudGhpc0Fybn0pLCFpLnN1cHByZXNzKXtpLnN1cHByZXNzPSEwO2NvbnN0IG49YyYmIW87bj8oaS5wZW5kaW5nRmFpbG92ZXI9ITAscy5kZWJ1ZyhgW0Rpc2FzdGVyIFJlY292ZXJ5XSBJbnN0YW5jZSAke2kudGhpc0Fybn0gd2lsbCBiZSBzZXQgdG8gc3RhbmQtYnkgdXNpbmcgc29mdCBmYWlsb3ZlcmApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpOnMuZGVidWcoYFtEaXNhc3RlciBSZWNvdmVyeV0gSW5zdGFuY2UgJHtpLnRoaXNBcm59IGlzIGJlaW5nIHNldCB0byBzdGFuZC1ieSBpbW1lZGlhdGVseWApLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaS5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5GT1JDRV9PRkZMSU5FLHtzb2Z0RmFpbG92ZXI6bixuZXh0QWN0aXZlQXJuOmUuSW5zdGFuY2VBcm59KX19ZWxzZVtpLnRoaXNBcm4saS5vdGhlckFybl0uaW5jbHVkZXMoZS5JbnN0YW5jZUFybil8fHMuZXJyb3IoYFtEaXNhc3RlciBSZWNvdmVyeV0gVGhlIGN1cnJlbnQgcHJpbWFyeSBpbnN0YW5jZSBpbiB0aGlzIGFnZW50J3MgZmFpbG92ZXIgZ3JvdXAgJHtlLkluc3RhbmNlQXJufSBkb2Vzbid0IG1hdGNoIHRoaXMgaW5zdGFuY2UgJHtpLnRoaXNBcm59IG9yIHRoZSBvdGhlciBpbnN0YW5jZSAke2kub3RoZXJBcm59YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTtlbHNlIHMuZXJyb3IoIltEaXNhc3RlciBSZWNvdmVyeV0gRFIgcG9sbGluZyByZXNwb25zZSBkaWQgbm90IGNvbnRhaW4gYSB0cnV0aHkgYWN0aXZlIGluc3RhbmNlIEFSTi4iKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9ZWxzZSBzLmVycm9yKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIERSIHBvbGxpbmcgcmVzcG9uc2UgZGlkIG5vdCBjb250YWluIGEgdmFsaWQgdmFsdWUgZm9yIFRlcm1pbmF0ZUFjdGl2ZUNvbnRhY3RzLiIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKS5jYXRjaCgoZT0+e2Uuc3RhdHVzJiZpLmNsaWVudC5fcmVjb3JkQVBJTGF0ZW5jeShuLGEsey4uLmUsc3RhdHVzQ29kZTplLnN0YXR1c30pLHMuZXJyb3IoYFtEaXNhc3RlciBSZWNvdmVyeV0gQWN0aXZlIHJlZ2lvbiBwb2xsaW5nIGZhaWxlZCBmb3IgaW5zdGFuY2UgJHtpLnRoaXNBcm59LmApLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKS5maW5hbGx5KCgoKT0+eyFvJiZyfHxlLnNldFRpbWVvdXQodC5oaXRjaChpLGkucG9sbEZvckFjdGl2ZVJlZ2lvbiksNmU0KX0pKX0saS5wcm90b3R5cGUuZ2V0UHJlc2lnbmVkRGlzY292ZXJ5VXJsPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4gbmV3IFByb21pc2UoKChuLHIpPT57dC5nZXRMb2coKS5pbmZvKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIEdldHRpbmcgcHJlc2lnbmVkIFVSTCBmb3IgaW5zdGFuY2UgJHtlLnRoaXNBcm59YCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0aGlzLmNsaWVudC5jYWxsKHQuQ2xpZW50TWV0aG9kcy5DUkVBVEVfVFJBTlNQT1JULHt0cmFuc3BvcnRUeXBlOnQuVFJBTlNQT1JUX1RZUEVTLkFHRU5UX0RJU0NPVkVSWX0se3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7ZSYmZS5hZ2VudERpc2NvdmVyeVRyYW5zcG9ydCYmZS5hZ2VudERpc2NvdmVyeVRyYW5zcG9ydC5wcmVzaWduZWRVcmw/KHQuZ2V0TG9nKCkuaW5mbygiZ2V0UHJlc2lnbmVkRGlzY292ZXJ5VXJsIHN1Y2NlZWRlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbihlLmFnZW50RGlzY292ZXJ5VHJhbnNwb3J0LnByZXNpZ25lZFVybCkpOih0LmdldExvZygpLmluZm8oImdldFByZXNpZ25lZERpc2NvdmVyeVVybCByZWNlaXZlZCBlbXB0eS9pbnZhbGlkIGRhdGEiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihFcnJvcigiZ2V0UHJlc2lnbmVkRGlzY292ZXJ5VXJsIHJlY2VpdmVkIGVtcHR5L2ludmFsaWQgZGF0YSIpKSl9LGZhaWx1cmU6ZnVuY3Rpb24obixvKXt0LmdldExvZygpLmVycm9yKGBbRGlzYXN0ZXIgUmVjb3ZlcnldIEZhaWxlZCB0byBnZXQgcHJlc2lnbmVkIFVSTCBmb3IgaW5zdGFuY2UgJHtlLnRoaXNBcm59YCkud2l0aEV4Y2VwdGlvbihuKS53aXRoT2JqZWN0KG8pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihuZXcgRXJyb3IoIkZhaWxlZCB0byBnZXQgcHJlc2lnbmVkIFVSTCIpKX0sYXV0aEZhaWx1cmU6ZnVuY3Rpb24oKXt0LmhpdGNoKGUsZS5oYW5kbGVBdXRoRmFpbCkoKSxyKG5ldyBFcnJvcigiRW5jb3VudGVyZWQgYXV0aCBmYWlsdXJlIHdoZW4gZ2V0dGluZyBwcmVzaWduZWQgVVJMIikpfSxhY2Nlc3NEZW5pZWQ6ZnVuY3Rpb24oKXt0LmhpdGNoKGUsZS5oYW5kbGVBY2Nlc3NEZW5pZWQpKCkscihuZXcgRXJyb3IoIkVuY291bnRlcmVkIGFjY2VzcyBkZW5pZWQgd2hlbiBnZXR0aW5nIHByZXNpZ25lZCBVUkwiKSl9fSl9KSl9LGkucHJvdG90eXBlLnBvbGxGb3JBZ2VudD1mdW5jdGlvbigpe3ZhciBuPXRoaXMscj10LmhpdGNoKG4sbi5oYW5kbGVQb2xsaW5nQXV0aEZhaWwpO3RoaXMuY2xpZW50LmNhbGwodC5DbGllbnRNZXRob2RzLkdFVF9BR0VOVF9TTkFQU0hPVCx7bmV4dFRva2VuOm4ubmV4dFRva2VuLHRpbWVvdXQ6M2U0fSx7c3VjY2VzczpmdW5jdGlvbihyLG8pe3RyeXtuLmFnZW50PW4uYWdlbnR8fHt9LG4uYWdlbnQuc25hcHNob3Q9ci5zbmFwc2hvdCxuLmFnZW50LnNuYXBzaG90LmxvY2FsVGltZXN0YW1wPXQubm93KCksbi5hZ2VudC5zbmFwc2hvdC5za2V3PW4uYWdlbnQuc25hcHNob3Quc25hcHNob3RUaW1lc3RhbXAtbi5hZ2VudC5zbmFwc2hvdC5sb2NhbFRpbWVzdGFtcCxuLm5leHRUb2tlbj1yLm5leHRUb2tlbixvJiZvLmhhc093blByb3BlcnR5KCJjb250ZW50TGVuZ3RoIikmJihuLmFnZW50LnNuYXBzaG90LmNvbnRlbnRMZW5ndGg9by5jb250ZW50TGVuZ3RoKSx0LmdldExvZygpLnRyYWNlKCJHRVRfQUdFTlRfU05BUFNIT1Qgc3VjY2VlZGVkLiIpLndpdGhPYmplY3Qocikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLnVwZGF0ZUFnZW50KCl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiTG9uZyBwb2xsIGZhaWxlZCB0byB1cGRhdGUgYWdlbnQuIikud2l0aE9iamVjdChyKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9ZmluYWxseXtlLnNldFRpbWVvdXQodC5oaXRjaChuLG4ucG9sbEZvckFnZW50KSwxMDApfX0sZmFpbHVyZTpmdW5jdGlvbihyLG8pe3RyeXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gZ2V0IGFnZW50IGRhdGEuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKS53aXRoT2JqZWN0KHtlcnI6cixkYXRhOm99KX1maW5hbGx5e2Uuc2V0VGltZW91dCh0LmhpdGNoKG4sbi5wb2xsRm9yQWdlbnQpLDVlMyl9fSxhdXRoRmFpbHVyZTpmdW5jdGlvbigpe3IoKX0sYWNjZXNzRGVuaWVkOnQuaGl0Y2gobixuLmhhbmRsZUFjY2Vzc0RlbmllZCl9KX0saS5wcm90b3R5cGUucG9sbEZvckFnZW50Q29uZmlndXJhdGlvbj1mdW5jdGlvbihuKXt2YXIgcj10aGlzLG89bnx8e30saT10LmhpdGNoKHIsci5oYW5kbGVQb2xsaW5nQXV0aEZhaWwpO3RoaXMuY2xpZW50LmNhbGwodC5DbGllbnRNZXRob2RzLkdFVF9BR0VOVF9DT05GSUdVUkFUSU9OLHt9LHtzdWNjZXNzOmZ1bmN0aW9uKG4pe3ZhciBpPW4uY29uZmlndXJhdGlvbjtyLnBvbGxGb3JBZ2VudFBlcm1pc3Npb25zKGkpLHIucG9sbEZvckFnZW50U3RhdGVzKGkpLHIucG9sbEZvckRpYWxhYmxlQ291bnRyeUNvZGVzKGkpLHIucG9sbEZvclJvdXRpbmdQcm9maWxlUXVldWVzKGkpLG8ucmVwZWF0Rm9yZXZlciYmZS5zZXRUaW1lb3V0KHQuaGl0Y2gocixyLnBvbGxGb3JBZ2VudENvbmZpZ3VyYXRpb24sbyksM2U0KX0sZmFpbHVyZTpmdW5jdGlvbihuLGkpe3RyeXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggYWdlbnQgY29uZmlndXJhdGlvbiBkYXRhLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7ZXJyOm4sZGF0YTppfSl9ZmluYWxseXtvLnJlcGVhdEZvcmV2ZXImJmUuc2V0VGltZW91dCh0LmhpdGNoKHIsci5wb2xsRm9yQWdlbnRDb25maWd1cmF0aW9uKSwzZTQsbyl9fSxhdXRoRmFpbHVyZTpmdW5jdGlvbigpe2koKX0sYWNjZXNzRGVuaWVkOnQuaGl0Y2gocixyLmhhbmRsZUFjY2Vzc0RlbmllZCl9KX0saS5wcm90b3R5cGUucG9sbEZvckFnZW50U3RhdGVzPWZ1bmN0aW9uKGUsbil7dmFyIHI9dGhpcyxvPW58fHt9O28ubWF4UmVzdWx0cz1vLm1heFJlc3VsdHN8fHQuREVGQVVMVF9CQVRDSF9TSVpFLHRoaXMuY2xpZW50LmNhbGwodC5DbGllbnRNZXRob2RzLkdFVF9BR0VOVF9TVEFURVMse25leHRUb2tlbjpvLm5leHRUb2tlbnx8bnVsbCxtYXhSZXN1bHRzOm8ubWF4UmVzdWx0c30se3N1Y2Nlc3M6ZnVuY3Rpb24odCl7dC5uZXh0VG9rZW4/ci5wb2xsRm9yQWdlbnRTdGF0ZXMoZSx7c3RhdGVzOihvLnN0YXRlc3x8W10pLmNvbmNhdCh0LnN0YXRlcyksbmV4dFRva2VuOnQubmV4dFRva2VuLG1heFJlc3VsdHM6by5tYXhSZXN1bHRzfSk6KGUuYWdlbnRTdGF0ZXM9KG8uc3RhdGVzfHxbXSkuY29uY2F0KHQuc3RhdGVzKSxyLnVwZGF0ZUFnZW50Q29uZmlndXJhdGlvbihlKSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSxuKXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggYWdlbnQgc3RhdGVzIGxpc3QuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKS53aXRoT2JqZWN0KHtlcnI6ZSxkYXRhOm59KX0sYXV0aEZhaWx1cmU6dC5oaXRjaChyLHIuaGFuZGxlUG9sbGluZ0F1dGhGYWlsKSxhY2Nlc3NEZW5pZWQ6dC5oaXRjaChyLHIuaGFuZGxlQWNjZXNzRGVuaWVkKX0pfSxpLnByb3RvdHlwZS5wb2xsRm9yQWdlbnRQZXJtaXNzaW9ucz1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXMsbz1ufHx7fTtvLm1heFJlc3VsdHM9by5tYXhSZXN1bHRzfHx0LkRFRkFVTFRfQkFUQ0hfU0laRSx0aGlzLmNsaWVudC5jYWxsKHQuQ2xpZW50TWV0aG9kcy5HRVRfQUdFTlRfUEVSTUlTU0lPTlMse25leHRUb2tlbjpvLm5leHRUb2tlbnx8bnVsbCxtYXhSZXN1bHRzOm8ubWF4UmVzdWx0c30se3N1Y2Nlc3M6ZnVuY3Rpb24odCl7dC5uZXh0VG9rZW4/ci5wb2xsRm9yQWdlbnRQZXJtaXNzaW9ucyhlLHtwZXJtaXNzaW9uczooby5wZXJtaXNzaW9uc3x8W10pLmNvbmNhdCh0LnBlcm1pc3Npb25zKSxuZXh0VG9rZW46dC5uZXh0VG9rZW4sbWF4UmVzdWx0czpvLm1heFJlc3VsdHN9KTooZS5wZXJtaXNzaW9ucz0oby5wZXJtaXNzaW9uc3x8W10pLmNvbmNhdCh0LnBlcm1pc3Npb25zKSxyLnVwZGF0ZUFnZW50Q29uZmlndXJhdGlvbihlKSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSxuKXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggYWdlbnQgcGVybWlzc2lvbnMgbGlzdC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe2VycjplLGRhdGE6bn0pfSxhdXRoRmFpbHVyZTp0LmhpdGNoKHIsci5oYW5kbGVQb2xsaW5nQXV0aEZhaWwpLGFjY2Vzc0RlbmllZDp0LmhpdGNoKHIsci5oYW5kbGVBY2Nlc3NEZW5pZWQpfSl9LGkucHJvdG90eXBlLnBvbGxGb3JEaWFsYWJsZUNvdW50cnlDb2Rlcz1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXMsbz1ufHx7fTtvLm1heFJlc3VsdHM9by5tYXhSZXN1bHRzfHx0LkRFRkFVTFRfQkFUQ0hfU0laRSx0aGlzLmNsaWVudC5jYWxsKHQuQ2xpZW50TWV0aG9kcy5HRVRfRElBTEFCTEVfQ09VTlRSWV9DT0RFUyx7bmV4dFRva2VuOm8ubmV4dFRva2VufHxudWxsLG1heFJlc3VsdHM6by5tYXhSZXN1bHRzfSx7c3VjY2VzczpmdW5jdGlvbih0KXt0Lm5leHRUb2tlbj9yLnBvbGxGb3JEaWFsYWJsZUNvdW50cnlDb2RlcyhlLHtjb3VudHJ5Q29kZXM6KG8uY291bnRyeUNvZGVzfHxbXSkuY29uY2F0KHQuY291bnRyeUNvZGVzKSxuZXh0VG9rZW46dC5uZXh0VG9rZW4sbWF4UmVzdWx0czpvLm1heFJlc3VsdHN9KTooZS5kaWFsYWJsZUNvdW50cmllcz0oby5jb3VudHJ5Q29kZXN8fFtdKS5jb25jYXQodC5jb3VudHJ5Q29kZXMpLHIudXBkYXRlQWdlbnRDb25maWd1cmF0aW9uKGUpKX0sZmFpbHVyZTpmdW5jdGlvbihlLG4pe3QuZ2V0TG9nKCkuZXJyb3IoIkZhaWxlZCB0byBmZXRjaCBkaWFsYWJsZSBjb3VudHJ5IGNvZGVzIGxpc3QuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKS53aXRoT2JqZWN0KHtlcnI6ZSxkYXRhOm59KX0sYXV0aEZhaWx1cmU6dC5oaXRjaChyLHIuaGFuZGxlUG9sbGluZ0F1dGhGYWlsKSxhY2Nlc3NEZW5pZWQ6dC5oaXRjaChyLHIuaGFuZGxlQWNjZXNzRGVuaWVkKX0pfSxpLnByb3RvdHlwZS5wb2xsRm9yUm91dGluZ1Byb2ZpbGVRdWV1ZXM9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzLG89bnx8e307by5tYXhSZXN1bHRzPW8ubWF4UmVzdWx0c3x8dC5ERUZBVUxUX0JBVENIX1NJWkUsdGhpcy5jbGllbnQuY2FsbCh0LkNsaWVudE1ldGhvZHMuR0VUX1JPVVRJTkdfUFJPRklMRV9RVUVVRVMse3JvdXRpbmdQcm9maWxlQVJOOmUucm91dGluZ1Byb2ZpbGUucm91dGluZ1Byb2ZpbGVBUk4sbmV4dFRva2VuOm8ubmV4dFRva2VufHxudWxsLG1heFJlc3VsdHM6by5tYXhSZXN1bHRzfSx7c3VjY2VzczpmdW5jdGlvbih0KXt0Lm5leHRUb2tlbj9yLnBvbGxGb3JSb3V0aW5nUHJvZmlsZVF1ZXVlcyhlLHtjb3VudHJ5Q29kZXM6KG8ucXVldWVzfHxbXSkuY29uY2F0KHQucXVldWVzKSxuZXh0VG9rZW46dC5uZXh0VG9rZW4sbWF4UmVzdWx0czpvLm1heFJlc3VsdHN9KTooZS5yb3V0aW5nUHJvZmlsZS5xdWV1ZXM9KG8ucXVldWVzfHxbXSkuY29uY2F0KHQucXVldWVzKSxyLnVwZGF0ZUFnZW50Q29uZmlndXJhdGlvbihlKSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSxuKXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggcm91dGluZyBwcm9maWxlIHF1ZXVlcyBsaXN0LiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7ZXJyOmUsZGF0YTpufSl9LGF1dGhGYWlsdXJlOnQuaGl0Y2gocixyLmhhbmRsZVBvbGxpbmdBdXRoRmFpbCksYWNjZXNzRGVuaWVkOnQuaGl0Y2gocixyLmhhbmRsZUFjY2Vzc0RlbmllZCl9KX0saS5wcm90b3R5cGUuaGFuZGxlQVBJUmVxdWVzdD1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXM7dGhpcy5jbGllbnQuY2FsbChuLm1ldGhvZCxuLnBhcmFtcyx7c3VjY2VzczpmdW5jdGlvbihyKXt2YXIgbz10LkV2ZW50RmFjdG9yeS5jcmVhdGVSZXNwb25zZSh0LkV2ZW50VHlwZS5BUElfUkVTUE9OU0UsbixyKTtlLnNlbmREb3duc3RyZWFtKG8uZXZlbnQsbyl9LGZhaWx1cmU6ZnVuY3Rpb24obyxpKXt2YXIgcz10LkV2ZW50RmFjdG9yeS5jcmVhdGVSZXNwb25zZSh0LkV2ZW50VHlwZS5BUElfUkVTUE9OU0UsbixpLEpTT04uc3RyaW5naWZ5KG8pKTtlLnNlbmREb3duc3RyZWFtKHMuZXZlbnQscyksdC5nZXRMb2coKS5lcnJvcigiJyVzJyBBUEkgcmVxdWVzdCBmYWlsZWQiLG4ubWV0aG9kKS53aXRoT2JqZWN0KHtyZXF1ZXN0OnIuZmlsdGVyQXV0aFRva2VuKG4pLHJlc3BvbnNlOnN9KS53aXRoRXhjZXB0aW9uKG8pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LGF1dGhGYWlsdXJlOnQuaGl0Y2gocixyLmhhbmRsZUF1dGhGYWlsLHthdXRob3JpemU6ITB9KX0pfSxpLnByb3RvdHlwZS5oYW5kbGVNYXN0ZXJSZXF1ZXN0PWZ1bmN0aW9uKGUsbixyKXt2YXIgbz10aGlzLmNvbmR1aXQsaT1udWxsO3N3aXRjaChyLm1ldGhvZCl7Y2FzZSB0Lk1hc3Rlck1ldGhvZHMuQkVDT01FX01BU1RFUjp2YXIgcz10aGlzLm1hc3RlckNvb3JkLmdldE1hc3RlcihyLnBhcmFtcy50b3BpYyksYT1Cb29sZWFuKHMpJiZzIT09bjt0aGlzLm1hc3RlckNvb3JkLnNldE1hc3RlcihyLnBhcmFtcy50b3BpYyxuKSxpPXQuRXZlbnRGYWN0b3J5LmNyZWF0ZVJlc3BvbnNlKHQuRXZlbnRUeXBlLk1BU1RFUl9SRVNQT05TRSxyLHttYXN0ZXJJZDpuLHRha2VPdmVyOmEsdG9waWM6ci5wYXJhbXMudG9waWN9KSxhJiZvLnNlbmREb3duc3RyZWFtKGkuZXZlbnQsaSk7YnJlYWs7Y2FzZSB0Lk1hc3Rlck1ldGhvZHMuQ0hFQ0tfTUFTVEVSOihzPXRoaXMubWFzdGVyQ29vcmQuZ2V0TWFzdGVyKHIucGFyYW1zLnRvcGljKSl8fHIucGFyYW1zLnNob3VsZE5vdEJlY29tZU1hc3RlcklmTm9uZXx8KHRoaXMubWFzdGVyQ29vcmQuc2V0TWFzdGVyKHIucGFyYW1zLnRvcGljLG4pLHM9biksaT10LkV2ZW50RmFjdG9yeS5jcmVhdGVSZXNwb25zZSh0LkV2ZW50VHlwZS5NQVNURVJfUkVTUE9OU0Uscix7bWFzdGVySWQ6cyxpc01hc3RlcjpuPT09cyx0b3BpYzpyLnBhcmFtcy50b3BpY30pO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIG1hc3RlciBtZXRob2Q6ICIrci5tZXRob2QpfWUuc2VuZERvd25zdHJlYW0oaS5ldmVudCxpKX0saS5wcm90b3R5cGUuaGFuZGxlVGFiSWRFdmVudD1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXM7dHJ5e2xldCBvPW4udGFiSWQsaT1yLnN0cmVhbU1hcEJ5VGFiSWRbb10scz1lLmdldElkKCksYT1PYmplY3Qua2V5cyhyLnN0cmVhbU1hcEJ5VGFiSWQpLmZpbHRlcigoZT0+ci5zdHJlYW1NYXBCeVRhYklkW2VdLmxlbmd0aD4wKSkubGVuZ3RoO2lmKGkmJmkubGVuZ3RoPjApe2lmKCFpLmluY2x1ZGVzKHMpKXtyLnN0cmVhbU1hcEJ5VGFiSWRbb10ucHVzaChzKTtsZXQgZT17bGVuZ3RoOk9iamVjdC5rZXlzKHIucG9ydENvbmR1aXRNYXApLmxlbmd0aCx0YWJJZDpvLHN0cmVhbXNUYWJzQWNyb3NzQnJvd3NlcjphfTtlW29dPXtsZW5ndGg6aS5sZW5ndGh9LHIuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5VUERBVEVfQ09OTkVDVEVEX0NDUFMsZSl9fWVsc2V7ci5zdHJlYW1NYXBCeVRhYklkW29dPVtlLmdldElkKCldO2xldCBuPXtsZW5ndGg6T2JqZWN0LmtleXMoci5wb3J0Q29uZHVpdE1hcCkubGVuZ3RoLHRhYklkOm8sc3RyZWFtc1RhYnNBY3Jvc3NCcm93c2VyOmErMX07bltvXT17bGVuZ3RoOnIuc3RyZWFtTWFwQnlUYWJJZFtvXS5sZW5ndGh9LHIuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5VUERBVEVfQ09OTkVDVEVEX0NDUFMsbil9fWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIltUYWIgSWRzXSBJc3N1ZSB1cGRhdGluZyBjb25uZWN0ZWQgQ0NQcyB3aXRoaW4gdGhlIHNhbWUgdGFiIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0saS5wcm90b3R5cGUuaGFuZGxlQ2xvc2VFdmVudD1mdW5jdGlvbihlKXt2YXIgbj10aGlzO24ubXVsdGlwbGV4ZXIucmVtb3ZlU3RyZWFtKGUpLGRlbGV0ZSBuLnBvcnRDb25kdWl0TWFwW2UuZ2V0SWQoKV0sbi5tYXN0ZXJDb29yZC5yZW1vdmVNYXN0ZXIoZS5nZXRJZCgpKTtsZXQgcj17bGVuZ3RoOk9iamVjdC5rZXlzKG4ucG9ydENvbmR1aXRNYXApLmxlbmd0aH0sbz1PYmplY3Qua2V5cyhuLnN0cmVhbU1hcEJ5VGFiSWQpO3RyeXtsZXQgdD1vLmZpbmQoKHQ9Pm4uc3RyZWFtTWFwQnlUYWJJZFt0XS5pbmNsdWRlcyhlLmdldElkKCkpKSk7aWYodCl7bGV0IG89bi5zdHJlYW1NYXBCeVRhYklkW3RdLmZpbmRJbmRleCgodD0+ZS5nZXRJZCgpPT09dCkpO24uc3RyZWFtTWFwQnlUYWJJZFt0XS5zcGxpY2UobywxKTtsZXQgaT1uLnN0cmVhbU1hcEJ5VGFiSWRbdF0/bi5zdHJlYW1NYXBCeVRhYklkW3RdLmxlbmd0aDowO3JbdF09e2xlbmd0aDppfSxyLnRhYklkPXR9bGV0IGk9by5maWx0ZXIoKGU9Pm4uc3RyZWFtTWFwQnlUYWJJZFtlXS5sZW5ndGg+MCkpLmxlbmd0aDtyLnN0cmVhbXNUYWJzQWNyb3NzQnJvd3Nlcj1pfWNhdGNoKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIltUYWIgSWRzXSBJc3N1ZSB1cGRhdGluZyB0YWJJZC1zcGVjaWZpYyBzdHJlYW0gZGF0YSIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX1uLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuVVBEQVRFX0NPTk5FQ1RFRF9DQ1BTLHIpfSxpLnByb3RvdHlwZS51cGRhdGVBZ2VudENvbmZpZ3VyYXRpb249ZnVuY3Rpb24oZSl7ZS5wZXJtaXNzaW9ucyYmZS5kaWFsYWJsZUNvdW50cmllcyYmZS5hZ2VudFN0YXRlcyYmZS5yb3V0aW5nUHJvZmlsZS5xdWV1ZXM/KHRoaXMuYWdlbnQ9dGhpcy5hZ2VudHx8e30sdGhpcy5hZ2VudC5jb25maWd1cmF0aW9uPWUsdGhpcy51cGRhdGVBZ2VudCgpKTp0LmdldExvZygpLnRyYWNlKCJXYWl0aW5nIHRvIHVwZGF0ZSBhZ2VudCBjb25maWd1cmF0aW9uIHVudGlsIGFsbCBjb25maWcgZGF0YSBoYXMgYmVlbiBmZXRjaGVkLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LGkucHJvdG90eXBlLnVwZGF0ZUFnZW50PWZ1bmN0aW9uKCl7dGhpcy5hZ2VudD90aGlzLmFnZW50LnNuYXBzaG90P3RoaXMuYWdlbnQuY29uZmlndXJhdGlvbj8odGhpcy5hZ2VudC5zbmFwc2hvdC5zdGF0dXM9dGhpcy5hZ2VudC5zdGF0ZSx0aGlzLmFnZW50LnNuYXBzaG90LmNvbnRhY3RzJiZ0aGlzLmFnZW50LnNuYXBzaG90LmNvbnRhY3RzLmxlbmd0aD4xJiZ0aGlzLmFnZW50LnNuYXBzaG90LmNvbnRhY3RzLnNvcnQoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuc3RhdGUudGltZXN0YW1wLmdldFRpbWUoKS10LnN0YXRlLnRpbWVzdGFtcC5nZXRUaW1lKCl9KSksdGhpcy5hZ2VudC5zbmFwc2hvdC5jb250YWN0cy5mb3JFYWNoKChmdW5jdGlvbihlKXtlLnN0YXR1cz1lLnN0YXRlLGUuY29ubmVjdGlvbnMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5hZGRyZXNzPWUuZW5kcG9pbnR9KSl9KSksdGhpcy5hZ2VudC5jb25maWd1cmF0aW9uLnJvdXRpbmdQcm9maWxlLmRlZmF1bHRPdXRib3VuZFF1ZXVlLnF1ZXVlSWQ9dGhpcy5hZ2VudC5jb25maWd1cmF0aW9uLnJvdXRpbmdQcm9maWxlLmRlZmF1bHRPdXRib3VuZFF1ZXVlLnF1ZXVlQVJOLHRoaXMuYWdlbnQuY29uZmlndXJhdGlvbi5yb3V0aW5nUHJvZmlsZS5xdWV1ZXMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5xdWV1ZUlkPWUucXVldWVBUk59KSksdGhpcy5hZ2VudC5zbmFwc2hvdC5jb250YWN0cy5mb3JFYWNoKChmdW5jdGlvbihlKXt2b2lkIDAhPT1lLnF1ZXVlJiYoZS5xdWV1ZS5xdWV1ZUlkPWUucXVldWUucXVldWVBUk4pfSkpLHRoaXMuYWdlbnQuY29uZmlndXJhdGlvbi5yb3V0aW5nUHJvZmlsZS5yb3V0aW5nUHJvZmlsZUlkPXRoaXMuYWdlbnQuY29uZmlndXJhdGlvbi5yb3V0aW5nUHJvZmlsZS5yb3V0aW5nUHJvZmlsZUFSTix0aGlzLnN1cHByZXNzJiYodGhpcy5hZ2VudC5zbmFwc2hvdC5jb250YWN0cz10aGlzLmFnZW50LnNuYXBzaG90LmNvbnRhY3RzLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3RhdGUudHlwZT09dC5Db250YWN0U3RhdGVUeXBlLkNPTk5FQ1RFRHx8ZS5zdGF0ZS50eXBlPT10LkNvbnRhY3RTdGF0ZVR5cGUuRU5ERUR9KSksdGhpcy5mb3JjZU9mZmxpbmUmJnRoaXMuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRk9SQ0VfT0ZGTElORSkpLHRoaXMuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkFnZW50RXZlbnRzLlVQREFURSx0aGlzLmFnZW50KSk6dC5nZXRMb2coKS50cmFjZSgiV2FpdGluZyB0byB1cGRhdGUgYWdlbnQgdW50aWwgdGhlIGFnZW50IGNvbmZpZ3VyYXRpb24gaXMgYXZhaWxhYmxlLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk6dC5nZXRMb2coKS50cmFjZSgiV2FpdGluZyB0byB1cGRhdGUgYWdlbnQgdW50aWwgdGhlIGFnZW50IHNuYXBzaG90IGlzIGF2YWlsYWJsZS4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpOnQuZ2V0TG9nKCkudHJhY2UoIldhaXRpbmcgdG8gdXBkYXRlIGFnZW50IHVudGlsIHRoZSBhZ2VudCBoYXMgYmVlbiBmdWxseSBjb25zdHJ1Y3RlZC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSxpLnByb3RvdHlwZS5nZXRXZWJTb2NrZXRVcmw9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49dC5jb3JlLmdldENsaWVudCgpLHI9dC5oaXRjaChlLGUuaGFuZGxlQXV0aEZhaWwpLG89dC5oaXRjaChlLGUuaGFuZGxlQWNjZXNzRGVuaWVkKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGUsaSl7bi5jYWxsKHQuQ2xpZW50TWV0aG9kcy5DUkVBVEVfVFJBTlNQT1JULHt0cmFuc3BvcnRUeXBlOnQuVFJBTlNQT1JUX1RZUEVTLldFQl9TT0NLRVR9LHtzdWNjZXNzOmZ1bmN0aW9uKG4pe3QuZ2V0TG9nKCkuaW5mbygiZ2V0V2ViU29ja2V0VXJsIHN1Y2NlZWRlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksZShuKX0sZmFpbHVyZTpmdW5jdGlvbihlLG4pe3QuZ2V0TG9nKCkuZXJyb3IoImdldFdlYlNvY2tldFVybCBmYWlsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe2VycjplLGRhdGE6bn0pLGkoe3JlYXNvbjoiZ2V0V2ViU29ja2V0VXJsIGZhaWxlZCIsX2RlYnVnOmV9KX0sYXV0aEZhaWx1cmU6ZnVuY3Rpb24oKXt0LmdldExvZygpLmVycm9yKCJnZXRXZWJTb2NrZXRVcmwgQXV0aCBGYWlsdXJlIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKEVycm9yKCJBdXRoZW50aWNhdGlvbiBmYWlsZWQgd2hpbGUgZ2V0dGluZyBnZXRXZWJTb2NrZXRVcmwiKSkscigpfSxhY2Nlc3NEZW5pZWQ6ZnVuY3Rpb24oKXt0LmdldExvZygpLmVycm9yKCJnZXRXZWJTb2NrZXRVcmwgQWNjZXNzIERlbmllZCBGYWlsdXJlIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKEVycm9yKCJBY2Nlc3MgRGVuaWVkIEZhaWx1cmUgd2hpbGUgZ2V0dGluZyBnZXRXZWJTb2NrZXRVcmwiKSksbygpfX0pfSkpfSxpLnByb3RvdHlwZS5oYW5kbGVTZW5kTG9nc1JlcXVlc3Q9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49W10scj1lLmxvZ3NCdWZmZXIuc2xpY2UoKTtlLmxvZ3NCdWZmZXI9W10sci5mb3JFYWNoKChmdW5jdGlvbihlKXtuLnB1c2goe3RpbWVzdGFtcDplLnRpbWUsY29tcG9uZW50OmUuY29tcG9uZW50LG1lc3NhZ2U6ZS50ZXh0fSl9KSksdGhpcy5jbGllbnQuY2FsbCh0LkNsaWVudE1ldGhvZHMuU0VORF9DTElFTlRfTE9HUyx7bG9nRXZlbnRzOm59LHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiU2VuZExvZ3MgcmVxdWVzdCBzdWNjZWVkZWQuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0sZmFpbHVyZTpmdW5jdGlvbihlLG4pe3QuZ2V0TG9nKCkuZXJyb3IoIlNlbmRMb2dzIHJlcXVlc3QgZmFpbGVkLiIpLndpdGhPYmplY3Qobikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSxhdXRoRmFpbHVyZTp0LmhpdGNoKGUsZS5oYW5kbGVBdXRoRmFpbCl9KX0saS5wcm90b3R5cGUuaGFuZGxlQXV0aEZhaWw9ZnVuY3Rpb24oZSl7ZT90aGlzLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuQVVUSF9GQUlMLGUpOnRoaXMuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5BVVRIX0ZBSUwpfSxpLnByb3RvdHlwZS5oYW5kbGVQb2xsaW5nQXV0aEZhaWw9ZnVuY3Rpb24oKXt0aGlzLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5FdmVudFR5cGUuQ1RJX0FVVEhPUklaRV9SRVRSSUVTX0VYSEFVU1RFRCl9LGkucHJvdG90eXBlLmhhbmRsZUFjY2Vzc0RlbmllZD1mdW5jdGlvbigpe3RoaXMuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5BQ0NFU1NfREVOSUVEKX0saS5wcm90b3R5cGUuY2hlY2tBdXRoVG9rZW49ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49bmV3IERhdGUoZS5pbml0RGF0YS5hdXRoVG9rZW5FeHBpcmF0aW9uKSxyPShuZXcgRGF0ZSkuZ2V0VGltZSgpO24uZ2V0VGltZSgpPHIrMThlNSYmKHQuZ2V0TG9nKCkuaW5mbygiQXV0aCB0b2tlbiBleHBpcmVzIGF0ICIrbisiIFN0YXJ0IHJlZnJlc2hpbmcgdG9rZW4gd2l0aCByZXRyeS4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuYmFja29mZih0LmhpdGNoKGUsZS5hdXRob3JpemUpLDFlNCw0KSl9LGkucHJvdG90eXBlLmF1dGhvcml6ZT1mdW5jdGlvbihlKXt2YXIgbj10aGlzO3QuY29yZS5hdXRob3JpemUodGhpcy5pbml0RGF0YS5hdXRob3JpemVFbmRwb2ludCkudGhlbigoZnVuY3Rpb24ocil7dmFyIG89bmV3IERhdGUoci5leHBpcmF0aW9uKTt0LmdldExvZygpLmluZm8oIkF1dGhvcml6YXRpb24gc3VjY2VlZGVkIGFuZCB0aGUgdG9rZW4gZXhwaXJlcyBhdCAlcyIsbykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLmluaXREYXRhLmF1dGhUb2tlbj1yLmFjY2Vzc1Rva2VuLG4uaW5pdERhdGEuYXV0aFRva2VuRXhwaXJhdGlvbj1vLHQuY29yZS5pbml0Q2xpZW50KG4uaW5pdERhdGEpLHQuY29yZS5pbml0QWdlbnRBcHBDbGllbnQobi5pbml0RGF0YSksZS5zdWNjZXNzKCl9KSkuY2F0Y2goKGZ1bmN0aW9uKHIpe3QuZ2V0TG9nKCkuZXJyb3IoIkF1dGhvcml6YXRpb24gZmFpbGVkIHdpdGggY29kZSAlcyIsci5zdGF0dXMpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksNDAxPT09ci5zdGF0dXM/bi5oYW5kbGVBdXRoRmFpbCgpOmUuZmFpbHVyZSgpfSkpfSxpLnByb3RvdHlwZS5maWx0ZXJBdXRoVG9rZW49ZnVuY3Rpb24oZSl7dmFyIHQ9e307Zm9yKHZhciBuIGluIGUpaWYoInBhcmFtcyI9PT1uKXt2YXIgcj17fTtmb3IodmFyIG8gaW4gZS5wYXJhbXMpImF1dGhlbnRpY2F0aW9uIiE9PW8mJihyW29dPWUucGFyYW1zW29dKTt0LnBhcmFtcz1yfWVsc2UgdFtuXT1lW25dO3JldHVybiB0fSx0Lndvcmtlci5tYWluPWZ1bmN0aW9uKCl7dC53b3JrZXIuY2xpZW50RW5naW5lPW5ldyBpfX0oKX19LHQ9e307ZnVuY3Rpb24gbihyKXt2YXIgbz10W3JdO2lmKHZvaWQgMCE9PW8pcmV0dXJuIG8uZXhwb3J0czt2YXIgaT10W3JdPXtleHBvcnRzOnt9fTtyZXR1cm4gZVtyXS5jYWxsKGkuZXhwb3J0cyxpLGkuZXhwb3J0cyxuKSxpLmV4cG9ydHN9bi5nPWZ1bmN0aW9uKCl7aWYoIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzKXJldHVybiBnbG9iYWxUaGlzO3RyeXtyZXR1cm4gdGhpc3x8bmV3IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9Y2F0Y2goZSl7aWYoIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cpcmV0dXJuIHdpbmRvd319KCksbig4MjcpLG4oMTYzKSxuKDk0NCksbigxNTEpLG4oODkxKSxuKDU5Miksbig4Miksbig3NTQpLG4oODMzKSxuKDk2NSksbigyODYpLG4oODk1KSxuKDc0Myksbig2NDIpLG4oNzM2KSxuKDQzOSksbigyNzkpLG4oNDE4KSxuKDE4Nyksbig4MjEpLG4oNTAwKX0pKCk7"),d=function(l){this.id=l.region,l.region=this._normalizeRegionString(l.region),this.height=l.height,this.style=l.iframe_style,this.ccp=this._createFramedCcp(l)};d.prototype._createFramedCcp=function(l){var Z=Z||"microphone; autoplay; clipboard-write",b=this.style||"margin: 0; border: 0; padding: 0px; width: 0px; height: 0px",d=document.createElement("iframe");return d.srcdoc=this.getContent(l),d.allow=Z,d.id=this.id,d.style=b,d.scrolling="no",d},d.prototype.getContent=function(l){return["","","","","