@k8slens/window-layouts 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/README.md +5 -0
- package/assets/banner.svg +37 -4
- package/assets/hotbar-preview.png +0 -0
- package/assets/icon.svg +4 -2
- package/assets/window-layouts-dialog.png +0 -0
- package/dist/index.js +41 -21
- package/dist/test/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -3100,14 +3100,20 @@ var ClusterSearch = (0, import_mobx_react.observer)(() => {
|
|
|
3100
3100
|
}
|
|
3101
3101
|
);
|
|
3102
3102
|
});
|
|
3103
|
+
var KeepPanelHeightContext = (0, import_react2.createContext)(() => {
|
|
3104
|
+
});
|
|
3103
3105
|
var PageSearch = (0, import_mobx_react.observer)(() => {
|
|
3104
3106
|
const model = (0, import_use_inject.useInject)(windowLayoutsModelInjectable)();
|
|
3107
|
+
const keepPanelHeight = (0, import_react2.useContext)(KeepPanelHeightContext);
|
|
3105
3108
|
(0, import_react2.useEffect)(() => model.setPageSearch(""), []);
|
|
3106
3109
|
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
3107
3110
|
MenuSearch,
|
|
3108
3111
|
{
|
|
3109
3112
|
value: model.pageSearch.get(),
|
|
3110
|
-
onChange: (text) =>
|
|
3113
|
+
onChange: (text) => {
|
|
3114
|
+
keepPanelHeight();
|
|
3115
|
+
model.setPageSearch(text);
|
|
3116
|
+
},
|
|
3111
3117
|
placeholder: "Search pages",
|
|
3112
3118
|
width: 280
|
|
3113
3119
|
}
|
|
@@ -3373,19 +3379,33 @@ var ResourceListMenuContainer = ({
|
|
|
3373
3379
|
children,
|
|
3374
3380
|
items: _items,
|
|
3375
3381
|
...menuProps
|
|
3376
|
-
}) =>
|
|
3377
|
-
|
|
3378
|
-
|
|
3379
|
-
|
|
3380
|
-
|
|
3381
|
-
|
|
3382
|
-
|
|
3383
|
-
|
|
3384
|
-
|
|
3385
|
-
|
|
3386
|
-
|
|
3387
|
-
|
|
3388
|
-
|
|
3382
|
+
}) => {
|
|
3383
|
+
const [height, setHeight] = (0, import_react2.useState)();
|
|
3384
|
+
const mark = (0, import_react2.useRef)(null);
|
|
3385
|
+
const keepHeight = (0, import_react2.useCallback)(() => {
|
|
3386
|
+
var _a;
|
|
3387
|
+
const panel = (_a = mark.current) == null ? void 0 : _a.parentElement;
|
|
3388
|
+
if (panel) {
|
|
3389
|
+
setHeight((kept) => kept ?? panel.getBoundingClientRect().height);
|
|
3390
|
+
}
|
|
3391
|
+
}, []);
|
|
3392
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
3393
|
+
import_drop_down_menu_contracts.DefaultDropDownMenuContainer,
|
|
3394
|
+
{
|
|
3395
|
+
...menuProps,
|
|
3396
|
+
$style: {
|
|
3397
|
+
...height === void 0 ? { maxHeight: "50vh" } : { height },
|
|
3398
|
+
boxSizing: "border-box",
|
|
3399
|
+
overflowY: "auto",
|
|
3400
|
+
overflowX: "hidden"
|
|
3401
|
+
},
|
|
3402
|
+
children: [
|
|
3403
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { ref: mark, hidden: true }),
|
|
3404
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(KeepPanelHeightContext.Provider, { value: keepHeight, children })
|
|
3405
|
+
]
|
|
3406
|
+
}
|
|
3407
|
+
);
|
|
3408
|
+
};
|
|
3389
3409
|
var resourceListMenuContainerInjectable = (0, import_injectable13.getInjectable2)({
|
|
3390
3410
|
id: "window-manager-resource-list-menu-container",
|
|
3391
3411
|
instantiate: () => () => ResourceListMenuContainer,
|
|
@@ -4973,21 +4993,21 @@ var windowLayoutsStatusBarItemInjectable = (0, import_injectable20.getInjectable
|
|
|
4973
4993
|
injectionToken: import_status_bar_contracts.statusBarItemInjectionToken
|
|
4974
4994
|
});
|
|
4975
4995
|
|
|
4976
|
-
// import-glob:./**/*.injectable.(ts|tsx)/proof-of-uniqueness/
|
|
4996
|
+
// import-glob:./**/*.injectable.(ts|tsx)/proof-of-uniqueness/26b7c417-f838-4f27-be92-f8082c7e86cd
|
|
4977
4997
|
var modules = [delete_window_layout_injectable_exports, duplicate_window_layout_injectable_exports, layout_in_hotbar_injectable_exports, layout_tiling_injectable_exports, places_sub_window_kind_injectable_exports, recall_window_layout_injectable_exports, rename_window_layout_injectable_exports, reopening_of_closed_window_injectable_exports, save_window_layout_injectable_exports, saved_window_layouts_injectable_exports, tile_windows_injectable_exports, tiling_plan_injectable_exports, window_layout_list_injectable_exports, window_lineage_injectable_exports, window_reopenings_injectable_exports, delete_layout_modal_injectable_exports, layout_hotbar_item_injectable_exports, layout_hotbar_menu_injectable_exports, new_window_menu_injectable_exports, open_window_layouts_injectable_exports, recall_from_hotbar_injectable_exports, save_from_hotbar_injectable_exports, show_window_from_hotbar_injectable_exports, tile_windows_command_injectable_exports, window_layouts_command_injectable_exports, window_layouts_modal_injectable_exports, window_layouts_model_injectable_exports, window_layouts_model_purge_injectable_exports, window_layouts_status_bar_item_injectable_exports];
|
|
4978
|
-
var
|
|
4998
|
+
var b7c417_f838_4f27_be92_f8082c7e86cd_default = modules;
|
|
4979
4999
|
|
|
4980
|
-
// import-glob:./**/!(_*).(scss|css)/proof-of-uniqueness/
|
|
5000
|
+
// import-glob:./**/!(_*).(scss|css)/proof-of-uniqueness/151d350a-47d4-42c7-a66c-8ab94871bb3b
|
|
4981
5001
|
var modules2 = [icon_button_exports, layout_list_module_exports, tiling_editor_module_exports];
|
|
4982
|
-
var
|
|
5002
|
+
var d350a_47d4_42c7_a66c_8ab94871bb3b_default = modules2;
|
|
4983
5003
|
|
|
4984
5004
|
// src/index.ts
|
|
4985
5005
|
var k8SlensWindowLayoutsFeature = (0, import_feature_core.getFeature)({
|
|
4986
5006
|
id: "@k8slens/window-layouts",
|
|
4987
5007
|
register: (di) => {
|
|
4988
5008
|
(0, import_feature_core.registerInjectablesFromModules)(di, [
|
|
4989
|
-
...
|
|
4990
|
-
...
|
|
5009
|
+
...b7c417_f838_4f27_be92_f8082c7e86cd_default,
|
|
5010
|
+
...d350a_47d4_42c7_a66c_8ab94871bb3b_default
|
|
4991
5011
|
]);
|
|
4992
5012
|
}
|
|
4993
5013
|
});
|
|
@@ -4995,4 +5015,4 @@ var k8SlensWindowLayoutsFeature = (0, import_feature_core.getFeature)({
|
|
|
4995
5015
|
0 && (module.exports = {
|
|
4996
5016
|
k8SlensWindowLayoutsFeature
|
|
4997
5017
|
});
|
|
4998
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9sYXlvdXRzL2RlbGV0ZS13aW5kb3ctbGF5b3V0LmluamVjdGFibGUudHMiLCAiLi4vc3JjL2xheW91dHMvc2F2ZWQtd2luZG93LWxheW91dHMuaW5qZWN0YWJsZS50cyIsICIuLi9zcmMvbGF5b3V0cy9kdXBsaWNhdGUtd2luZG93LWxheW91dC5pbmplY3RhYmxlLnRzIiwgIi4uL3NyYy9sYXlvdXRzL2xheW91dC1pbi1ob3RiYXIuaW5qZWN0YWJsZS50cyIsICIuLi9zcmMvbGF5b3V0cy9sYXlvdXQtdGlsaW5nLmluamVjdGFibGUudHMiLCAiLi4vc3JjL2xheW91dHMvbGF5b3V0LXRpbGluZy50cyIsICIuLi9zcmMvbGF5b3V0cy90aWxpbmctcGxhbi50cyIsICIuLi9zcmMvbGF5b3V0cy9ncmlkLnRzIiwgIi4uL3NyYy9sYXlvdXRzL3RpbGluZy1wbGFuLmluamVjdGFibGUudHMiLCAiLi4vc3JjL2xheW91dHMvd2luZG93LWxpbmVhZ2UuaW5qZWN0YWJsZS50cyIsICIuLi9zcmMvbGF5b3V0cy9wbGFjZXMtc3ViLXdpbmRvdy1raW5kLmluamVjdGFibGUudHMiLCAiLi4vc3JjL2xheW91dHMvcmVjYWxsLXdpbmRvdy1sYXlvdXQuaW5qZWN0YWJsZS50cyIsICIuLi9zcmMvbGF5b3V0cy9zY3JlZW5zLnRzIiwgIi4uL3NyYy9sYXlvdXRzL3JlbmFtZS13aW5kb3ctbGF5b3V0LmluamVjdGFibGUudHMiLCAiLi4vc3JjL2xheW91dHMvcmVvcGVuaW5nLW9mLWNsb3NlZC13aW5kb3cuaW5qZWN0YWJsZS50cyIsICIuLi9zcmMvbGF5b3V0cy93aW5kb3ctcmVvcGVuaW5ncy5pbmplY3RhYmxlLnRzIiwgIi4uL3NyYy9sYXlvdXRzL3NhdmUtd2luZG93LWxheW91dC5pbmplY3RhYmxlLnRzIiwgIi4uL3NyYy9sYXlvdXRzL3RpbGUtd2luZG93cy5pbmplY3RhYmxlLnRzIiwgIi4uL3NyYy9sYXlvdXRzL3dpbmRvdy1sYXlvdXQtbGlzdC5pbmplY3RhYmxlLnRzIiwgIi4uL3NyYy91aS9kZWxldGUtbGF5b3V0LW1vZGFsLmluamVjdGFibGUudHN4IiwgIi4uL3NyYy91aS9tb2RhbC1lcnJvci1ib3VuZGFyeS50c3giLCAiLi4vc3JjL3VpL2xheW91dC1ob3RiYXItaXRlbS5pbmplY3RhYmxlLnRzeCIsICIuLi9zcmMvdWkvbGF5b3V0LWhvdGJhci1tZW51LmluamVjdGFibGUudHN4IiwgIi4uL3NyYy9sYXlvdXRzL2xheW91dC1wcmV2aWV3LnRzIiwgIi4uL3NyYy91aS9sYXlvdXQtcHJldmlldy50c3giLCAiLi4vc3JjL3VpL29wZW4td2luZG93LWxheW91dHMuaW5qZWN0YWJsZS50cyIsICIuLi9zcmMvdWkvd2luZG93LWxheW91dHMtbW9kYWwuaW5qZWN0YWJsZS50c3giLCAibGVucy1zdHlsZXNoZWV0Oi9Vc2Vycy9tYXNwaWFsYS8uazhzbGVucy9leHRlbnNpb25zL3dpbmRvdy1tYW5hZ2VyL3NyYy91aS9pY29uLWJ1dHRvbi5zY3NzIiwgImxlbnMtc3R5bGVzaGVldDovVXNlcnMvbWFzcGlhbGEvLms4c2xlbnMvZXh0ZW5zaW9ucy93aW5kb3ctbWFuYWdlci9zcmMvdWkvbGF5b3V0LWxpc3QubW9kdWxlLnNjc3MiLCAiLi4vc3JjL3VpL3RpbGluZy1lZGl0b3IudHN4IiwgImxlbnMtc3R5bGVzaGVldDovVXNlcnMvbWFzcGlhbGEvLms4c2xlbnMvZXh0ZW5zaW9ucy93aW5kb3ctbWFuYWdlci9zcmMvdWkvdGlsaW5nLWVkaXRvci5tb2R1bGUuc2NzcyIsICIuLi9zcmMvdWkvbmV3LXdpbmRvdy1tZW51LmluamVjdGFibGUudHN4IiwgIi4uL3NyYy9sYXlvdXRzL3Jlc291cmNlLWxpc3RzLnRzIiwgIi4uL3NyYy91aS93aW5kb3ctbGF5b3V0cy1tb2RlbC5pbmplY3RhYmxlLnRzIiwgIi4uL3NyYy91aS9yZWNhbGwtZnJvbS1ob3RiYXIuaW5qZWN0YWJsZS50cyIsICIuLi9zcmMvdWkvc2F2ZS1mcm9tLWhvdGJhci5pbmplY3RhYmxlLnRzIiwgIi4uL3NyYy91aS9zaG93LXdpbmRvdy1mcm9tLWhvdGJhci5pbmplY3RhYmxlLnRzIiwgIi4uL3NyYy91aS90aWxlLXdpbmRvd3MtY29tbWFuZC5pbmplY3RhYmxlLnRzIiwgIi4uL3NyYy91aS93aW5kb3ctbGF5b3V0cy1jb21tYW5kLmluamVjdGFibGUudHMiLCAiLi4vc3JjL3VpL3dpbmRvdy1sYXlvdXRzLW1vZGVsLnB1cmdlLmluamVjdGFibGUudHMiLCAiLi4vc3JjL3VpL3dpbmRvdy1sYXlvdXRzLXN0YXR1cy1iYXItaXRlbS5pbmplY3RhYmxlLnRzeCIsICJpbXBvcnQtZ2xvYjouLyoqLyouaW5qZWN0YWJsZS4odHN8dHN4KS9wcm9vZi1vZi11bmlxdWVuZXNzL2I4MzE3YjE4LTdlZDgtNGRmZC04MTJmLWQ1ZGZkYjNiNWZlMCIsICJpbXBvcnQtZ2xvYjouLyoqLyEoXyopLihzY3NzfGNzcykvcHJvb2Ytb2YtdW5pcXVlbmVzcy9kOWU1MWU1NS0xMTAyLTQxODgtYWRlYi02ZjkwZWU3YjI3M2EiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7XG4gIGdldEZlYXR1cmUsXG4gIHJlZ2lzdGVySW5qZWN0YWJsZXNGcm9tTW9kdWxlcyxcbn0gZnJvbSBcIkBrOHNsZW5zL2ZlYXR1cmUtY29yZVwiO1xuaW1wb3J0IG1vZHVsZXNXaXRoSW5qZWN0YWJsZXMgZnJvbSBcIi4vKiovKi5pbmplY3RhYmxlLih0c3x0c3gpXCI7XG5pbXBvcnQgc3R5bGVzaGVldHMgZnJvbSBcIi4vKiovIShfKikuKHNjc3N8Y3NzKVwiO1xuXG5leHBvcnQgY29uc3QgazhTbGVuc1dpbmRvd0xheW91dHNGZWF0dXJlID0gZ2V0RmVhdHVyZSh7XG4gIGlkOiBcIkBrOHNsZW5zL3dpbmRvdy1sYXlvdXRzXCIsXG4gIHJlZ2lzdGVyOiAoZGkpID0+IHtcbiAgICAvLyBBdXRvLWRpc2NvdmVycyBldmVyeSBgKi5pbmplY3RhYmxlLih0c3x0c3gpYCBmaWxlIHVuZGVyIHRoaXMgZGlyZWN0b3J5IGFuZCByZWdpc3RlcnNcbiAgICAvLyBpdC4gUHJlZmVycmVkIG92ZXIgcmVnaXN0ZXJpbmcgaW5qZWN0YWJsZXMgb25lIGJ5IG9uZSBcdTIwMTQgYWRkaW5nIGEgbmV3IGluamVjdGFibGUgZmlsZVxuICAgIC8vIGF1dG9tYXRpY2FsbHkgd2lyZXMgaXQgdXA7IHlvdSBjYW4ndCBmb3JnZXQgdG8gcmVnaXN0ZXIgaXQuXG4gICAgLy8gRXZlcnkgYC5zY3NzYCwgYC5jc3NgLCBgLm1vZHVsZS5zY3NzYCBhbmQgYC5tb2R1bGUuY3NzYCB5b3UgaW1wb3J0IGJlY29tZXMgYSBzdHlsZXNoZWV0XG4gICAgLy8gaW5qZWN0YWJsZSB3aGVuIHRoZSBleHRlbnNpb24gYnVpbGRzLCBhbmQgcmlkZXMgYWxvbmcgaGVyZSB0aGUgc2FtZSB3YXk7IGEgYF9wYXJ0aWFsLnNjc3NgXG4gICAgLy8gc3RheXMgb3V0IG9mIHRoZSBnbG9iLlxuICAgIHJlZ2lzdGVySW5qZWN0YWJsZXNGcm9tTW9kdWxlcyhkaSwgW1xuICAgICAgLi4ubW9kdWxlc1dpdGhJbmplY3RhYmxlcyxcbiAgICAgIC4uLnN0eWxlc2hlZXRzLFxuICAgIF0pO1xuICB9LFxufSk7XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0YWJsZTIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgcnVuSW5BY3Rpb24gfSBmcm9tIFwibW9ieFwiO1xuaW1wb3J0IHsgc2F2ZWRXaW5kb3dMYXlvdXRzQnVuY2ggfSBmcm9tIFwiLi9zYXZlZC13aW5kb3ctbGF5b3V0cy5pbmplY3RhYmxlXCI7XG5cbmV4cG9ydCBjb25zdCBkZWxldGVXaW5kb3dMYXlvdXRJbmplY3RhYmxlID0gZ2V0SW5qZWN0YWJsZTIoe1xuICBpZDogXCJ3aW5kb3ctbWFuYWdlci5kZWxldGUtd2luZG93LWxheW91dFwiLFxuXG4gIGluc3RhbnRpYXRlOiAoZGkpID0+IHtcbiAgICBjb25zdCBnZXRTYXZlZExheW91dHMgPSBkaS5pbmplY3Qoc2F2ZWRXaW5kb3dMYXlvdXRzQnVuY2gucGVyc2lzdGFibGUpO1xuXG4gICAgcmV0dXJuICgpID0+IGFzeW5jIChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHNhdmVkTGF5b3V0cyA9IGF3YWl0IGdldFNhdmVkTGF5b3V0cygpO1xuXG4gICAgICBydW5JbkFjdGlvbigoKSA9PiBzYXZlZExheW91dHMuZGVsZXRlKG5hbWUpKTtcbiAgICB9O1xuICB9LFxufSk7XG4iLCAiaW1wb3J0IHsgZ2V0UGVyc2lzdGFibGVNYXBJbmplY3RhYmxlQnVuY2ggfSBmcm9tIFwiQGs4c2xlbnMvcGVyc2lzdGFibGUtY29udHJhY3RzXCI7XG5pbXBvcnQgdHlwZSB7IFdpbmRvd0lkIH0gZnJvbSBcIkBrOHNsZW5zL21lc3NhZ2luZy1jb250cmFjdHNcIjtcbmltcG9ydCB0eXBlIHtcbiAgV2luZG93Qm91bmRzLFxuICBXaW5kb3dSZW9wZW5pbmcsXG4gIFdpbmRvd1N0YXRlLFxufSBmcm9tIFwiQGs4c2xlbnMvd2luZG93LWxheW91dC1jb250cmFjdHNcIjtcbmltcG9ydCB0eXBlIHsgU3RvcmVkUGxhblNjcmVlbiB9IGZyb20gXCIuL3RpbGluZy1wbGFuXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2F2ZWRXaW5kb3cge1xuICByZWFkb25seSB3aW5kb3c6IFdpbmRvd0lkO1xuICByZWFkb25seSB0aXRsZTogc3RyaW5nO1xuICAvLyBXaGF0IExlbnMga2VlcHMgb2YgdGhlIHdpbmRvdyB0byBvcGVuIGl0IGFnYWluIG9uY2UgY2xvc2VkOyBtaXNzaW5nIGZvciBhIHdpbmRvdyB0aGF0IGNhbm5vdFxuICAvLyBiZSwgYXMgdGhlIGFwcGxpY2F0aW9uIHdpbmRvdywgYW5kIGZyb20gbGF5b3V0cyBzYXZlZCBiZWZvcmUgd2luZG93cyB3ZXJlIGtlcHQuXG4gIHJlYWRvbmx5IHJlb3BlbmluZz86IFdpbmRvd1Jlb3BlbmluZztcbiAgLy8gV2hlcmUgdGhlIHdpbmRvdyBzaG93cyBub3JtYWxseSwgc28gYSBtYXhpbWl6ZWQgd2luZG93IGNvbWVzIGJhY2sgdG8gdGhlIHJpZ2h0IHBsYWNlIHdoZW4gcmVzdG9yZWQuXG4gIHJlYWRvbmx5IG5vcm1hbEJvdW5kczogV2luZG93Qm91bmRzO1xuICByZWFkb25seSBzdGF0ZTogV2luZG93U3RhdGU7XG4gIHJlYWRvbmx5IGlzRm9jdXNlZDogYm9vbGVhbjtcbiAgLy8gVGhlIHNjcmVlbiB0aGUgd2luZG93IHdhcyBvbjsgbWlzc2luZyBmcm9tIGxheW91dHMgc2F2ZWQgYmVmb3JlIHNjcmVlbnMgd2VyZSBrZXB0IGJ5IHdpbmRvdy5cbiAgcmVhZG9ubHkgZGlzcGxheUlkPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNhdmVkRGlzcGxheSB7XG4gIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGlzUHJpbWFyeTogYm9vbGVhbjtcbiAgcmVhZG9ubHkgYm91bmRzOiBXaW5kb3dCb3VuZHM7XG59XG5cbi8vIEhvdyBhIHdpbmRvdyBvZiB0aGUgbGF5b3V0IGlzIHRpbGVkIGluIHRoZSBsYXlvdXQncyB0aWxpbmcgc2V0dXAsIHRoZSB3aW5kb3cgbmFtZWQgYnkgaXRzIHBsYWNlXG4vLyBpbiB0aGUgbGF5b3V0J3Mgd2luZG93cywgYXMgaXRzIGlkIGRvZXMgbm90IG91dGxpdmUgdGhlIHdpbmRvdy5cbmV4cG9ydCBpbnRlcmZhY2UgU2F2ZWRUaWxpbmdXaW5kb3cge1xuICByZWFkb25seSBpbmRleDogbnVtYmVyO1xuICByZWFkb25seSBkaXNwbGF5SWQ6IG51bWJlciB8IG51bGw7XG4gIHJlYWRvbmx5IGNvbHVtbj86IG51bWJlcjtcbiAgcmVhZG9ubHkgcm93PzogbnVtYmVyO1xuICByZWFkb25seSBjb2x1bW5zOiBudW1iZXI7XG4gIHJlYWRvbmx5IHJvd3M6IG51bWJlcjtcbn1cblxuLy8gVGhlIHRpbGluZyBzZXR1cCBzYXZlZCB3aXRoIGEgbGF5b3V0OiBpdHMgd2luZG93cyBpbiB0aGUgc2V0dXAncyBvcmRlciwgYW5kIHRoZSBzY3JlZW5zJyBncmlkcy5cbmV4cG9ydCBpbnRlcmZhY2UgU2F2ZWRUaWxpbmcge1xuICByZWFkb25seSB3aW5kb3dzOiByZWFkb25seSBTYXZlZFRpbGluZ1dpbmRvd1tdO1xuICByZWFkb25seSBjb2x1bW5zOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PjtcbiAgcmVhZG9ubHkgcm93czogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgbnVtYmVyPj47XG4gIC8vIFRoZSBzY3JlZW5zIG9mIHRoZSBzZXR1cCwgYnkgaWQsIHRvIHNob3cgb25lIG5vdCBjb25uZWN0ZWQ7IG1pc3NpbmcgZnJvbSBzZXR1cHMgc2F2ZWQgYmVmb3JlLlxuICByZWFkb25seSBzY3JlZW5zPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgU3RvcmVkUGxhblNjcmVlbj4+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNhdmVkV2luZG93TGF5b3V0IHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBzYXZlZEF0OiBudW1iZXI7XG4gIHJlYWRvbmx5IHdpbmRvd3M6IHJlYWRvbmx5IFNhdmVkV2luZG93W107XG4gIC8vIFRoZSBzY3JlZW5zIHRoZSBsYXlvdXQgd2FzIHNhdmVkIG9uOyBtaXNzaW5nIGZyb20gbGF5b3V0cyBzYXZlZCBiZWZvcmUgc2NyZWVucyB3ZXJlIGtlcHQuXG4gIHJlYWRvbmx5IGRpc3BsYXlzPzogcmVhZG9ubHkgU2F2ZWREaXNwbGF5W107XG4gIC8vIFRoZSB0aWxpbmcgc2V0dXAgY3VycmVudCB3aGVuIHRoZSBsYXlvdXQgd2FzIHNhdmVkOyBtaXNzaW5nIGZyb20gbGF5b3V0cyBzYXZlZCBiZWZvcmUuXG4gIHJlYWRvbmx5IHRpbGluZz86IFNhdmVkVGlsaW5nO1xufVxuXG5leHBvcnQgY29uc3Qgc2F2ZWRXaW5kb3dMYXlvdXRzQnVuY2ggPSBnZXRQZXJzaXN0YWJsZU1hcEluamVjdGFibGVCdW5jaDxcbiAgc3RyaW5nLFxuICBTYXZlZFdpbmRvd0xheW91dFxuPigpKHtcbiAgLy8gT2YgaXRzIHNlY29uZCB2ZXJzaW9uOiB0aGUgbGF5b3V0cyBzYXZlZCBiZWZvcmUgTGVucyBkZXNjcmliZWQgZXZlcnkgd2luZG93IGl0IGNhbiBvcGVuXG4gIC8vIGFnYWluLCBhcyBQcmVmZXJlbmNlcywgYXJlIGxlZnQgYmVoaW5kIHJhdGhlciB0aGFuIHJlYWQuXG4gIGlkOiBcInNhdmVkLXdpbmRvdy1sYXlvdXRzLTJcIixcbn0pO1xuIiwgImltcG9ydCB7IGdldEluamVjdGFibGUyIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcbmltcG9ydCB7IHJ1bkluQWN0aW9uIH0gZnJvbSBcIm1vYnhcIjtcbmltcG9ydCB7IHNhdmVkV2luZG93TGF5b3V0c0J1bmNoIH0gZnJvbSBcIi4vc2F2ZWQtd2luZG93LWxheW91dHMuaW5qZWN0YWJsZVwiO1xuXG4vLyBUaGUgbmFtZSBhIGNvcHkgb2YgYSBsYXlvdXQgZ2V0czogXCI8bmFtZT4gY29weVwiLCBudW1iZXJlZCBhZnRlciB0aGUgZmlyc3QsIGFzIFwiPG5hbWU+IGNvcHkgMlwiLlxuY29uc3QgY29weU5hbWUgPSAobmFtZTogc3RyaW5nLCB0YWtlbjogKG5hbWU6IHN0cmluZykgPT4gYm9vbGVhbikgPT4ge1xuICBjb25zdCBiYXNlID0gYCR7bmFtZX0gY29weWA7XG4gIGxldCBudW1iZXIgPSAxO1xuXG4gIHdoaWxlICh0YWtlbihudW1iZXIgPT09IDEgPyBiYXNlIDogYCR7YmFzZX0gJHtudW1iZXJ9YCkpIHtcbiAgICBudW1iZXIrKztcbiAgfVxuXG4gIHJldHVybiBudW1iZXIgPT09IDEgPyBiYXNlIDogYCR7YmFzZX0gJHtudW1iZXJ9YDtcbn07XG5cbi8vIENvcGllcyBhIGxheW91dCwgaXRzIHdpbmRvd3MgYW5kIGl0cyB0aWxpbmcsIHVuZGVyIGEgbmFtZSBvZiBpdHMgb3duOyB0aGUgbmFtZSBpdCBnb3QsIG9yXG4vLyB1bmRlZmluZWQgd2hlbiB0aGVyZSBpcyBubyBzdWNoIGxheW91dC5cbmV4cG9ydCBjb25zdCBkdXBsaWNhdGVXaW5kb3dMYXlvdXRJbmplY3RhYmxlID0gZ2V0SW5qZWN0YWJsZTIoe1xuICBpZDogXCJ3aW5kb3ctbWFuYWdlci5kdXBsaWNhdGUtd2luZG93LWxheW91dFwiLFxuXG4gIGluc3RhbnRpYXRlOiAoZGkpID0+IHtcbiAgICBjb25zdCBnZXRTYXZlZExheW91dHMgPSBkaS5pbmplY3Qoc2F2ZWRXaW5kb3dMYXlvdXRzQnVuY2gucGVyc2lzdGFibGUpO1xuXG4gICAgcmV0dXJuICgpID0+XG4gICAgICBhc3luYyAoZnJvbTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+ID0+IHtcbiAgICAgICAgY29uc3Qgc2F2ZWRMYXlvdXRzID0gYXdhaXQgZ2V0U2F2ZWRMYXlvdXRzKCk7XG4gICAgICAgIGNvbnN0IGxheW91dCA9IHNhdmVkTGF5b3V0cy5nZXQoZnJvbSk7XG5cbiAgICAgICAgaWYgKCFsYXlvdXQpIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmFtZSA9IGNvcHlOYW1lKGZyb20sIChpdCkgPT4gc2F2ZWRMYXlvdXRzLmhhcyhpdCkpO1xuXG4gICAgICAgIHJ1bkluQWN0aW9uKCgpID0+XG4gICAgICAgICAgc2F2ZWRMYXlvdXRzLnNldChuYW1lLCB7IC4uLmxheW91dCwgbmFtZSwgc2F2ZWRBdDogRGF0ZS5ub3coKSB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgIH07XG4gIH0sXG59KTtcbiIsICJpbXBvcnQge1xuICBhZGRUb0hvdGJhckluamVjdGlvblRva2VuLFxuICBnZXRIb3RiYXJJdGVtS2luZCxcbiAgaXNJbkhvdGJhckluamVjdGlvblRva2VuLFxuICBpc0luSG90YmFyUmVhY3RpdmVJbmplY3Rpb25Ub2tlbixcbiAgcmVtb3ZlRnJvbUhvdGJhckluamVjdGlvblRva2VuLFxufSBmcm9tIFwiQGs4c2xlbnMvaG90YmFyLWNvbnRyYWN0c1wiO1xuaW1wb3J0IHsgZ2V0SW5qZWN0YWJsZTIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuXG4vLyBBbiBpdGVtIG9mIHRoZSBob3RiYXIgcmVjYWxsaW5nIGEgbGF5b3V0LCBieSB0aGUgbGF5b3V0J3MgbmFtZSwgd2hpY2ggaXMgYWxzbyBpdHMgaWQuXG5leHBvcnQgY29uc3QgbGF5b3V0SG90YmFySXRlbUtpbmQgPSBnZXRIb3RiYXJJdGVtS2luZDx7IG5hbWU6IHN0cmluZyB9PigpKFxuICBcIndpbmRvdy1sYXlvdXRcIixcbik7XG5cbi8vIFBpbnMgbGF5b3V0cyB0byB0aGUgaG90YmFyIGFuZCB0YWtlcyB0aGVtIG9mZiwgYW5kIGtlZXBzIGFuIGl0ZW0gZ29pbmcgYnkgaXRzIGxheW91dCBhcyB0aGVcbi8vIGxheW91dCBpcyByZW5hbWVkIG9yIGRlbGV0ZWQuIFRoZSBob3RiYXIgYW5zd2VycyBmb3IgaXRzIGN1cnJlbnQgcGFnZSBvbmx5LlxuZXhwb3J0IGNvbnN0IGxheW91dEluSG90YmFySW5qZWN0YWJsZSA9IGdldEluamVjdGFibGUyKHtcbiAgaWQ6IFwid2luZG93LW1hbmFnZXIubGF5b3V0LWluLWhvdGJhclwiLFxuICBjb25zdW1wdGlvbnM6IFtcbiAgICBhZGRUb0hvdGJhckluamVjdGlvblRva2VuLFxuICAgIGlzSW5Ib3RiYXJJbmplY3Rpb25Ub2tlbixcbiAgICBpc0luSG90YmFyUmVhY3RpdmVJbmplY3Rpb25Ub2tlbixcbiAgICByZW1vdmVGcm9tSG90YmFySW5qZWN0aW9uVG9rZW4sXG4gIF0sXG5cbiAgaW5zdGFudGlhdGU6IChkaSkgPT4ge1xuICAgIGNvbnN0IGFkZCA9IGRpLmluamVjdChcbiAgICAgIGFkZFRvSG90YmFySW5qZWN0aW9uVG9rZW4uZm9yKGxheW91dEhvdGJhckl0ZW1LaW5kKS5mb3IoZGkuc2NvcGVJZHMpLFxuICAgICkoKTtcbiAgICBjb25zdCBpc0luID0gZGkuaW5qZWN0KFxuICAgICAgaXNJbkhvdGJhckluamVjdGlvblRva2VuLmZvcihsYXlvdXRIb3RiYXJJdGVtS2luZCkuZm9yKGRpLnNjb3BlSWRzKSxcbiAgICApKCk7XG4gICAgY29uc3QgaXNJblJlYWN0aXZlID0gZGkuaW5qZWN0KFxuICAgICAgaXNJbkhvdGJhclJlYWN0aXZlSW5qZWN0aW9uVG9rZW5cbiAgICAgICAgLmZvcihsYXlvdXRIb3RiYXJJdGVtS2luZClcbiAgICAgICAgLmZvcihkaS5zY29wZUlkcyksXG4gICAgKTtcbiAgICBjb25zdCByZW1vdmUgPSBkaS5pbmplY3QoXG4gICAgICByZW1vdmVGcm9tSG90YmFySW5qZWN0aW9uVG9rZW4uZm9yKGxheW91dEhvdGJhckl0ZW1LaW5kKS5mb3IoZGkuc2NvcGVJZHMpLFxuICAgICkoKTtcblxuICAgIGNvbnN0IHBpbiA9IChuYW1lOiBzdHJpbmcpID0+IGFkZCh7IGlkOiBuYW1lLCBwZXJzaXN0ZWREYXRhOiB7IG5hbWUgfSB9KTtcblxuICAgIHJldHVybiAoKSA9PiAoe1xuICAgICAgaXNQaW5uZWQ6IChuYW1lOiBzdHJpbmcpID0+IGlzSW5SZWFjdGl2ZShuYW1lKSxcblxuICAgICAgdG9nZ2xlOiBhc3luYyAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChhd2FpdCBpc0luKG5hbWUpKSB7XG4gICAgICAgICAgYXdhaXQgcmVtb3ZlKG5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHBpbihuYW1lKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLy8gVGhlIGl0ZW0gb2YgdGhlIGxheW91dCB1bmRlciBpdHMgb2xkIG5hbWUgZ29lcyBieSB0aGUgbmV3IG9uZSwgaW4gdGhlIGZpcnN0IGZyZWUgc2xvdC5cbiAgICAgIHJlbmFtZWQ6IGFzeW5jIChmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKGF3YWl0IGlzSW4oZnJvbSkpIHtcbiAgICAgICAgICBhd2FpdCByZW1vdmUoZnJvbSk7XG4gICAgICAgICAgYXdhaXQgcGluKHRvKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgZGVsZXRlZDogYXN5bmMgKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoYXdhaXQgaXNJbihuYW1lKSkge1xuICAgICAgICAgIGF3YWl0IHJlbW92ZShuYW1lKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfSxcbn0pO1xuIiwgImltcG9ydCB7IGdldEluamVjdGFibGUyIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcbmltcG9ydCB0eXBlIHsgV2luZG93SWQgfSBmcm9tIFwiQGs4c2xlbnMvbWVzc2FnaW5nLWNvbnRyYWN0c1wiO1xuaW1wb3J0IHtcbiAgZGlzcGxheVJlY29yZHNJbmplY3Rpb25Ub2tlbixcbiAgd2luZG93UmVjb3Jkc0luamVjdGlvblRva2VuLFxufSBmcm9tIFwiQGs4c2xlbnMvd2luZG93LWxheW91dC1jb250cmFjdHNcIjtcbmltcG9ydCB7IHJ1bkluQWN0aW9uIH0gZnJvbSBcIm1vYnhcIjtcbmltcG9ydCB7IG1hdGNoT3BlbldpbmRvd3MsIHRvU2F2ZWRUaWxpbmcsIHRvVGlsaW5nUGxhbiB9IGZyb20gXCIuL2xheW91dC10aWxpbmdcIjtcbmltcG9ydCB7XG4gIHNhdmVkV2luZG93TGF5b3V0c0J1bmNoLFxuICB0eXBlIFNhdmVkV2luZG93LFxufSBmcm9tIFwiLi9zYXZlZC13aW5kb3ctbGF5b3V0cy5pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyBrZXlPZldpbmRvdywgcmVzb2x2ZVRpbGluZ1BsYW4gfSBmcm9tIFwiLi90aWxpbmctcGxhblwiO1xuaW1wb3J0IHsgc3RvcmVkVGlsaW5nUGxhbkJ1bmNoIH0gZnJvbSBcIi4vdGlsaW5nLXBsYW4uaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHtcbiAgY29udGludWVkV2luZG93c09mLFxuICBsaW5lYWdlS2V5LFxuICB3aW5kb3dDb250aW51ZXNCdW5jaCxcbiAgd2luZG93TGluZWFnZUJ1bmNoLFxufSBmcm9tIFwiLi93aW5kb3ctbGluZWFnZS5pbmplY3RhYmxlXCI7XG5cbi8vIEEgbGF5b3V0J3MgdGlsaW5nIHNldHVwLCBiZXR3ZWVuIHRoZSBsYXlvdXQgYW5kIHRoZSBjdXJyZW50IHNldHVwIHRoZSBlZGl0b3Igc2hvd3MsIHRoZSBvcGVuXG4vLyB3aW5kb3dzIHN0YW5kaW5nIGZvciB0aGUgbGF5b3V0J3Mgd2luZG93cyBhcyB3aGVuIGl0IGlzIHJlY2FsbGVkLlxuZXhwb3J0IGNvbnN0IGxheW91dFRpbGluZ0luamVjdGFibGUgPSBnZXRJbmplY3RhYmxlMih7XG4gIGlkOiBcIndpbmRvdy1tYW5hZ2VyLmxheW91dC10aWxpbmdcIixcbiAgY29uc3VtcHRpb25zOiBbd2luZG93UmVjb3Jkc0luamVjdGlvblRva2VuLCBkaXNwbGF5UmVjb3Jkc0luamVjdGlvblRva2VuXSxcblxuICBpbnN0YW50aWF0ZTogKGRpKSA9PiB7XG4gICAgY29uc3QgZ2V0V2luZG93UmVjb3JkcyA9IGRpLmluamVjdCh3aW5kb3dSZWNvcmRzSW5qZWN0aW9uVG9rZW4pKCk7XG4gICAgY29uc3QgZ2V0RGlzcGxheVJlY29yZHMgPSBkaS5pbmplY3QoZGlzcGxheVJlY29yZHNJbmplY3Rpb25Ub2tlbikoKTtcbiAgICBjb25zdCBnZXRTYXZlZExheW91dHMgPSBkaS5pbmplY3Qoc2F2ZWRXaW5kb3dMYXlvdXRzQnVuY2gucGVyc2lzdGFibGUpO1xuICAgIGNvbnN0IGdldFN0b3JlZFRpbGluZ1BsYW4gPSBkaS5pbmplY3Qoc3RvcmVkVGlsaW5nUGxhbkJ1bmNoLnBlcnNpc3RhYmxlKTtcbiAgICBjb25zdCBnZXRXaW5kb3dMaW5lYWdlID0gZGkuaW5qZWN0KHdpbmRvd0xpbmVhZ2VCdW5jaC5wZXJzaXN0YWJsZSk7XG4gICAgY29uc3QgZ2V0V2luZG93Q29udGludWVzID0gZGkuaW5qZWN0KHdpbmRvd0NvbnRpbnVlc0J1bmNoLnBlcnNpc3RhYmxlKTtcblxuICAgIC8vIFRoZSBvcGVuIHdpbmRvd3Mgc3RhbmRpbmcgZm9yIHRoZSBsYXlvdXQnczogdGhlIHNhbWUgd2luZG93LCB0aGUgb25lIG9wZW5lZCBhZ2FpbiBhcyBpdCwgYXMgdGhlXG4gICAgLy8gbGF5b3V0IGZvdW5kIG9yIG9wZW5lZCBpdCBiZWZvcmUsIG9yIG9uZSBkb2luZyB0aGUgc2FtZS5cbiAgICBjb25zdCBtYXRjaExheW91dCA9IGFzeW5jIChcbiAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgIHdpbmRvd3M6IHJlYWRvbmx5IFNhdmVkV2luZG93W10sXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgZ2V0V2luZG93UmVjb3JkcygpO1xuICAgICAgY29uc3QgbGluZWFnZSA9IGF3YWl0IGdldFdpbmRvd0xpbmVhZ2UoKTtcbiAgICAgIGNvbnN0IGNvbnRpbnVlcyA9IGF3YWl0IGdldFdpbmRvd0NvbnRpbnVlcygpO1xuICAgICAgY29uc3Qgb3BlbiA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICByZWNvcmRzLm1hcChhc3luYyAocmVjb3JkKSA9PiAoe1xuICAgICAgICAgIHJlY29yZCxcbiAgICAgICAgICByZW9wZW5pbmc6IGF3YWl0IHJlY29yZC5kZXNjcmliZVJlb3BlbmluZygpLFxuICAgICAgICAgIHN0YW5kc0ZvcjogbGluZWFnZS5nZXQobGluZWFnZUtleShuYW1lLCBrZXlPZldpbmRvdyhyZWNvcmQud2luZG93KSkpLFxuICAgICAgICAgIGNvbnRpbnVlczogY29udGludWVkV2luZG93c09mKFxuICAgICAgICAgICAga2V5T2ZXaW5kb3cocmVjb3JkLndpbmRvdyksXG4gICAgICAgICAgICBjb250aW51ZXMsXG4gICAgICAgICAgICBsaW5lYWdlLFxuICAgICAgICAgICksXG4gICAgICAgIH0pKSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB7IHJlY29yZHMsIG1hdGNoZXM6IG1hdGNoT3BlbldpbmRvd3Mod2luZG93cywgb3BlbikgfTtcbiAgICB9O1xuXG4gICAgcmV0dXJuICgpID0+ICh7XG4gICAgICAvLyBNYWtlcyB0aGUgbGF5b3V0J3MgdGlsaW5nIHNldHVwIHRoZSBjdXJyZW50IG9uZSwgdGhlIHdpbmRvd3Mgc3RheWluZyB3aGVyZSB0aGV5IGFyZTsgZXZlcnlcbiAgICAgIC8vIHdpbmRvdyBvZiB0aGUgbGF5b3V0IGlzIGluIGl0LCBvbmUgbm90IG9wZW4gYXMgbWlzc2luZy4gUmVzb2x2ZXMgd2hldGhlciB0aGVyZSBpcyBzdWNoIGEgbGF5b3V0LlxuICAgICAgbG9hZDogYXN5bmMgKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBsYXlvdXQgPSAoYXdhaXQgZ2V0U2F2ZWRMYXlvdXRzKCkpLmdldChuYW1lKTtcblxuICAgICAgICBpZiAoIWxheW91dCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgbWF0Y2hlcyB9ID0gYXdhaXQgbWF0Y2hMYXlvdXQobmFtZSwgbGF5b3V0LndpbmRvd3MpO1xuICAgICAgICBjb25zdCBsaW5lYWdlID0gYXdhaXQgZ2V0V2luZG93TGluZWFnZSgpO1xuXG4gICAgICAgIC8vIEVhY2ggb3BlbiB3aW5kb3cgZm91bmQgYXMgb25lIG9mIHRoZSBsYXlvdXQncyB1bmRlciBhbm90aGVyIGtleSBpcyBrZXB0IHNvLCBmb3IgdGhlXG4gICAgICAgIC8vIGxheW91dDogb25jZSBjbG9zZWQsIGl0cyB0aWxlIGtub3dzIHdoaWNoIG9mIHRoZSBsYXlvdXQncyB3aW5kb3dzIGl0IGlzLCBhbmQgb3BlbmVkIGFnYWluXG4gICAgICAgIC8vIGl0IGlzIHRoYXQgb25lIHN0aWxsLlxuICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCBbc2F2ZWQsIHJlY29yZF0gb2YgbWF0Y2hlcykge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0ga2V5T2ZXaW5kb3cocmVjb3JkLndpbmRvdyk7XG4gICAgICAgICAgICBjb25zdCBzYXZlZEtleSA9IGtleU9mV2luZG93KHNhdmVkLndpbmRvdyk7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAga2V5ICE9PSBzYXZlZEtleSAmJlxuICAgICAgICAgICAgICBsaW5lYWdlLmdldChsaW5lYWdlS2V5KG5hbWUsIGtleSkpICE9PSBzYXZlZEtleVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGxpbmVhZ2Uuc2V0KGxpbmVhZ2VLZXkobmFtZSwga2V5KSwgc2F2ZWRLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgd2luZG93T2YgPSBuZXcgTWFwPFNhdmVkV2luZG93LCBXaW5kb3dJZD4oXG4gICAgICAgICAgWy4uLm1hdGNoZXNdLm1hcCgoW3NhdmVkLCByZWNvcmRdKSA9PiBbc2F2ZWQsIHJlY29yZC53aW5kb3ddKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc3RvcmVkID0gYXdhaXQgZ2V0U3RvcmVkVGlsaW5nUGxhbigpO1xuXG4gICAgICAgIGNvbnN0IHBsYW4gPSB0b1RpbGluZ1BsYW4oXG4gICAgICAgICAgbGF5b3V0LnRpbGluZyxcbiAgICAgICAgICBsYXlvdXQud2luZG93cyxcbiAgICAgICAgICB3aW5kb3dPZixcbiAgICAgICAgICBhd2FpdCBnZXREaXNwbGF5UmVjb3JkcygpLFxuICAgICAgICApO1xuXG4gICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHN0b3JlZC5zZXQocGxhbikpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfSxcbn0pO1xuIiwgImltcG9ydCB7XG4gIGlzQXBwbGljYXRpb25XaW5kb3csXG4gIHR5cGUgV2luZG93SWQsXG59IGZyb20gXCJAazhzbGVucy9tZXNzYWdpbmctY29udHJhY3RzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIERpc3BsYXlSZWNvcmQsXG4gIFdpbmRvd1JlY29yZCxcbiAgV2luZG93UmVvcGVuaW5nLFxufSBmcm9tIFwiQGs4c2xlbnMvd2luZG93LWxheW91dC1jb250cmFjdHNcIjtcbmltcG9ydCB0eXBlIHtcbiAgU2F2ZWRUaWxpbmcsXG4gIFNhdmVkV2luZG93LFxufSBmcm9tIFwiLi9zYXZlZC13aW5kb3ctbGF5b3V0cy5pbmplY3RhYmxlXCI7XG5pbXBvcnQge1xuICBrZXlPZldpbmRvdyxcbiAgdG9TdG9yZWRTY3JlZW4sXG4gIHdpbmRvd3NPZlBsYW4sXG4gIHR5cGUgUmVzb2x2ZWRUaWxpbmdQbGFuLFxuICB0eXBlIFN0b3JlZFRpbGluZ1BsYW4sXG59IGZyb20gXCIuL3RpbGluZy1wbGFuXCI7XG5cbi8vIFRoZSBzY3JlZW4gY29ubmVjdGVkIG5vdyB0aGF0IG1vc3Qgb2YgdGhlIHdpbmRvdydzIHNhdmVkIHBsYWNlIGlzIG9uLCBieSBpdHMgbWlkZGxlLlxuY29uc3Qgc2NyZWVuT2YgPSAoc2F2ZWQ6IFNhdmVkV2luZG93LCBkaXNwbGF5czogcmVhZG9ubHkgRGlzcGxheVJlY29yZFtdKSA9PiB7XG4gIGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9ID0gc2F2ZWQubm9ybWFsQm91bmRzO1xuICBjb25zdCBtaWRkbGUgPSB7IHg6IHggKyB3aWR0aCAvIDIsIHk6IHkgKyBoZWlnaHQgLyAyIH07XG5cbiAgcmV0dXJuIChcbiAgICBkaXNwbGF5cy5maW5kKChkaXNwbGF5KSA9PiB7XG4gICAgICBjb25zdCBib3VuZHMgPSBkaXNwbGF5LmJvdW5kcy5nZXQoKTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgbWlkZGxlLnggPj0gYm91bmRzLnggJiZcbiAgICAgICAgbWlkZGxlLnggPCBib3VuZHMueCArIGJvdW5kcy53aWR0aCAmJlxuICAgICAgICBtaWRkbGUueSA+PSBib3VuZHMueSAmJlxuICAgICAgICBtaWRkbGUueSA8IGJvdW5kcy55ICsgYm91bmRzLmhlaWdodFxuICAgICAgKTtcbiAgICB9KT8uaWQgPz8gbnVsbFxuICApO1xufTtcblxuLy8gVGhlIGxheW91dCdzIHRpbGluZyBzZXR1cCBmb3IgdGhlIHdpbmRvd3MgdGhhdCBzdGFuZCBmb3IgaXRzIHdpbmRvd3Mgbm93LCBlYWNoIG5hbWVkIGJ5IHRoZVxuLy8gd2luZG93IGl0IHdlbnQgdG8uIEEgd2luZG93IG5vIG9wZW4gd2luZG93IHN0YW5kcyBmb3IgaXMga2VwdCBieSB0aGUgaWQgaXQgaGFkLCBhcyBtaXNzaW5nLiBPbmVcbi8vIHRoZSBzZXR1cCBkb2VzIG5vdCBoYXZlLCBhcyBpbiBhIGxheW91dCBzYXZlZCBiZWZvcmUgc2V0dXBzIGhhZCBldmVyeSB3aW5kb3csIG9yIGJlZm9yZSB0aGVyZVxuLy8gd2VyZSBzZXR1cHMsIGdvZXMgb24gdGhlIHNjcmVlbiBpdCB3YXMgc2F2ZWQgb24sIGluIHRoZSBmaXJzdCBmcmVlIGNlbGw7IG9uZSBvZiB0aG9zZSBub3Qgb3BlblxuLy8gZ29lcyB0aGVyZSBhcyBtaXNzaW5nLCBvciBpcyBsZWZ0IGFzIGl0IGlzIHdoZW4gdGhhdCBzY3JlZW4gaXMgbm90IGNvbm5lY3RlZC5cbmV4cG9ydCBjb25zdCB0b1RpbGluZ1BsYW4gPSAoXG4gIHRpbGluZzogU2F2ZWRUaWxpbmcgfCB1bmRlZmluZWQsXG4gIHNhdmVkOiByZWFkb25seSBTYXZlZFdpbmRvd1tdLFxuICB3aW5kb3dPZjogTWFwPFNhdmVkV2luZG93LCBXaW5kb3dJZD4sXG4gIGRpc3BsYXlzOiByZWFkb25seSBEaXNwbGF5UmVjb3JkW10sXG4pOiBTdG9yZWRUaWxpbmdQbGFuID0+IHtcbiAgY29uc3Qga2V5T2YgPSAoaW5kZXg6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IHdpbmRvdyA9IHdpbmRvd09mLmdldChzYXZlZFtpbmRleF0pO1xuXG4gICAgLy8gV2l0aCB0aGUgd2luZG93J3MgaWQsIHRvIGFzayBMZW5zIGhvdyB0byBvcGVuIGl0IGFnYWluIG9uY2UgY2xvc2VkLlxuICAgIGNvbnN0IGlkID0gd2luZG93ID8/IHNhdmVkW2luZGV4XS53aW5kb3c7XG4gICAgY29uc3Qgd2l0aElkID0gaXNBcHBsaWNhdGlvbldpbmRvdyhpZCkgPyB7fSA6IHsgd2luZG93OiBpZCB9O1xuXG4gICAgcmV0dXJuIHdpbmRvd1xuICAgICAgPyB7IGtleToga2V5T2ZXaW5kb3cod2luZG93KSwgdGl0bGU6IHNhdmVkW2luZGV4XS50aXRsZSwgLi4ud2l0aElkIH1cbiAgICAgIDoge1xuICAgICAgICAgIGtleTogYG1pc3Npbmc6JHtpbmRleH06JHtrZXlPZldpbmRvdyhzYXZlZFtpbmRleF0ud2luZG93KX1gLFxuICAgICAgICAgIHRpdGxlOiBzYXZlZFtpbmRleF0udGl0bGUsXG4gICAgICAgICAgLi4ud2l0aElkLFxuICAgICAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGluU2V0dXAgPSBuZXcgU2V0KHRpbGluZz8ud2luZG93cy5tYXAoKGl0KSA9PiBpdC5pbmRleCkpO1xuXG4gIC8vIEEgd2luZG93IHNhdmVkIHR3aWNlLCBhcyBhIGxheW91dCBzYXZlZCBiZWZvcmUgdGhhdCB3YXMga2VwdCBmcm9tLCBpcyB0aGUgb25lIHdpbmRvdzogaXRzIGZpcnN0LlxuICBjb25zdCBmaXJzdE9mID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICBzYXZlZC5mb3JFYWNoKCh3aW5kb3csIGluZGV4KSA9PiB7XG4gICAgaWYgKCFmaXJzdE9mLmhhcyhrZXlPZldpbmRvdyh3aW5kb3cud2luZG93KSkpIHtcbiAgICAgIGZpcnN0T2Yuc2V0KGtleU9mV2luZG93KHdpbmRvdy53aW5kb3cpLCBpbmRleCk7XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBpc0ZpcnN0ID0gKGluZGV4OiBudW1iZXIpID0+XG4gICAgZmlyc3RPZi5nZXQoa2V5T2ZXaW5kb3coc2F2ZWRbaW5kZXhdLndpbmRvdykpID09PSBpbmRleDtcblxuICByZXR1cm4ge1xuICAgIHdpbmRvd3M6IFtcbiAgICAgIC4uLih0aWxpbmc/LndpbmRvd3MgPz8gW10pLmZsYXRNYXAoKHsgaW5kZXgsIC4uLnBsYWNlbWVudCB9KSA9PlxuICAgICAgICBzYXZlZFtpbmRleF0gJiYgaXNGaXJzdChpbmRleClcbiAgICAgICAgICA/IFt7IC4uLmtleU9mKGluZGV4KSwgLi4ucGxhY2VtZW50IH1dXG4gICAgICAgICAgOiBbXSxcbiAgICAgICksXG4gICAgICAuLi5zYXZlZC5mbGF0TWFwKCh3aW5kb3csIGluZGV4KSA9PlxuICAgICAgICBpblNldHVwLmhhcyhpbmRleCkgfHwgd2luZG93T2YuaGFzKHdpbmRvdykgfHwgIWlzRmlyc3QoaW5kZXgpXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4ua2V5T2YoaW5kZXgpLFxuICAgICAgICAgICAgICAgIGRpc3BsYXlJZDogc2NyZWVuT2Yod2luZG93LCBkaXNwbGF5cyksXG4gICAgICAgICAgICAgICAgY29sdW1uczogMSxcbiAgICAgICAgICAgICAgICByb3dzOiAxLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICksXG4gICAgXSxcbiAgICBjb2x1bW5zOiB0aWxpbmc/LmNvbHVtbnMgPz8ge30sXG4gICAgcm93czogdGlsaW5nPy5yb3dzID8/IHt9LFxuICAgIHNjcmVlbnM6IHRpbGluZz8uc2NyZWVucyxcbiAgfTtcbn07XG5cbi8vIFRoZSBsYXlvdXQncyB3aW5kb3cgYSB0aWxlJ3Mga2V5IG5hbWVzLCBieSB0aGUgd2luZG93J3Mgb3duIGtleTogYSB3aW5kb3cgbWlzc2luZyBmcm9tIHRoZSBzdGFydFxuLy8gZ29lcyBieSBpdHMgcGxhY2UgaW4gdGhlIGxheW91dCB0b28sIGJ1dCB0aGF0IHBsYWNlIGlzIHRoZSBvbmUgaXQgaGFkIHdoZW4gdGhlIGxheW91dCB3YXMgc2hvd24sXG4vLyBhbmQgc2F2aW5nIHB1dHMgdGhlIHdpbmRvd3MgaW4gYW5vdGhlciBvcmRlci5cbmV4cG9ydCBjb25zdCBzYXZlZFdpbmRvd09mS2V5ID0gKFxuICB3aW5kb3dzOiByZWFkb25seSBTYXZlZFdpbmRvd1tdLFxuICBrZXk6IHN0cmluZyxcbikgPT4ge1xuICBjb25zdCBvd24gPSAvXm1pc3Npbmc6XFxkKzooLiopJC9zLmV4ZWMoa2V5KT8uWzFdID8/IGtleTtcblxuICByZXR1cm4gd2luZG93cy5maW5kKCh3aW5kb3cpID0+IGtleU9mV2luZG93KHdpbmRvdy53aW5kb3cpID09PSBvd24pO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBPcGVuV2luZG93IHtcbiAgcmVhZG9ubHkgcmVjb3JkOiBXaW5kb3dSZWNvcmQ7XG4gIHJlYWRvbmx5IHJlb3BlbmluZzogV2luZG93UmVvcGVuaW5nIHwgdW5kZWZpbmVkO1xuICAvLyBUaGUga2V5IG9mIHRoZSB3aW5kb3cgb2YgYSBsYXlvdXQgaXQgd2FzIG9wZW5lZCBhZ2FpbiBhcywgd2hlbiBpdCB3YXMuXG4gIHJlYWRvbmx5IHN0YW5kc0Zvcj86IHN0cmluZztcbiAgLy8gVGhlIHdpbmRvd3MgaXQgY29udGludWVzLCBvcGVuZWQgYWdhaW4gZnJvbSwgbmVhcmVzdCBmaXJzdC5cbiAgcmVhZG9ubHkgY29udGludWVzPzogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbnR5cGUgSXNNYXRjaCA9IChvcGVuOiBPcGVuV2luZG93LCBzYXZlZDogU2F2ZWRXaW5kb3cpID0+IGJvb2xlYW47XG5cbmV4cG9ydCBjb25zdCBpc1NhbWVXaW5kb3c6IElzTWF0Y2ggPSAoXG4gIHsgcmVjb3JkOiB7IHdpbmRvdzogYSB9IH0sXG4gIHsgd2luZG93OiBiIH0sXG4pID0+XG4gIGlzQXBwbGljYXRpb25XaW5kb3coYSkgfHwgaXNBcHBsaWNhdGlvbldpbmRvdyhiKVxuICAgID8gYSA9PT0gYlxuICAgIDogYS5raW5kID09PSBiLmtpbmQgJiYgYS5pZCA9PT0gYi5pZDtcblxuLy8gVGhlIHdpbmRvdyB3YXMgb3BlbmVkIGFnYWluIGFzIHRoZSBzYXZlZCBvbmUsIGhvd2V2ZXIgbWFueSB0aW1lcyBzaW5jZS5cbmV4cG9ydCBjb25zdCBpc1NhbWVMaW5lYWdlOiBJc01hdGNoID0gKG9wZW4sIHNhdmVkKSA9PlxuICAob3Blbi5zdGFuZHNGb3IgIT09IHVuZGVmaW5lZCAmJlxuICAgIG9wZW4uc3RhbmRzRm9yID09PSBrZXlPZldpbmRvdyhzYXZlZC53aW5kb3cpKSB8fFxuICAhIW9wZW4uY29udGludWVzPy5pbmNsdWRlcyhrZXlPZldpbmRvdyhzYXZlZC53aW5kb3cpKTtcblxuLy8gTGVucyBkZXNjcmliZXMgYSB3aW5kb3cgZG9pbmcgdGhlIHNhbWUgdGhpbmcgdGhlIHNhbWUgd2F5LCBhcyBhIGNsb3NlZCB3aW5kb3cgb3BlbmVkIGFnYWluIGJ5IGhhbmQuXG5leHBvcnQgY29uc3QgaXNTYW1lUmVvcGVuaW5nOiBJc01hdGNoID0gKG9wZW4sIHNhdmVkKSA9PlxuICAhIW9wZW4ucmVvcGVuaW5nICYmXG4gICEhc2F2ZWQucmVvcGVuaW5nICYmXG4gIEpTT04uc3RyaW5naWZ5KG9wZW4ucmVvcGVuaW5nKSA9PT0gSlNPTi5zdHJpbmdpZnkoc2F2ZWQucmVvcGVuaW5nKTtcblxuLy8gUGFpcnMgZWFjaCBzYXZlZCB3aW5kb3cgbm90IHBhaXJlZCB5ZXQgd2l0aCBhbiBvcGVuIHdpbmRvdyBub3QgdGFrZW4geWV0LCBieSB0aGUgZmlyc3QgbWF0Y2hcbi8vIHRoYXQgZmluZHMgb25lLlxuZXhwb3J0IGNvbnN0IG1hdGNoV2luZG93cyA9IChcbiAgc2F2ZWQ6IHJlYWRvbmx5IFNhdmVkV2luZG93W10sXG4gIG9wZW46IHJlYWRvbmx5IE9wZW5XaW5kb3dbXSxcbiAgbWF0Y2hlczogTWFwPFNhdmVkV2luZG93LCBXaW5kb3dSZWNvcmQ+LFxuICBpc01hdGNoZXM6IHJlYWRvbmx5IElzTWF0Y2hbXSxcbikgPT4ge1xuICBmb3IgKGNvbnN0IGlzTWF0Y2ggb2YgaXNNYXRjaGVzKSB7XG4gICAgZm9yIChjb25zdCBzYXZlZFdpbmRvdyBvZiBzYXZlZCkge1xuICAgICAgaWYgKG1hdGNoZXMuaGFzKHNhdmVkV2luZG93KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFrZW4gPSBuZXcgU2V0KG1hdGNoZXMudmFsdWVzKCkpO1xuICAgICAgY29uc3QgZm91bmQgPSBvcGVuLmZpbmQoXG4gICAgICAgIChpdCkgPT4gIXRha2VuLmhhcyhpdC5yZWNvcmQpICYmIGlzTWF0Y2goaXQsIHNhdmVkV2luZG93KSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICBtYXRjaGVzLnNldChzYXZlZFdpbmRvdywgZm91bmQucmVjb3JkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbi8vIFRoZSB0aWxpbmcgc2V0dXAgb2YgdGhlIHBsYW4gdG8gc2F2ZSB3aXRoIGEgbGF5b3V0LCBlYWNoIHdpbmRvdyBuYW1lZCBieSBpdHMgcGxhY2UgaW4gdGhlXG4vLyBsYXlvdXQncyB3aW5kb3dzOyBhIHdpbmRvdyBvZiB0aGUgcGxhbiB0aGUgbGF5b3V0IGRvZXMgbm90IGhhdmUgaXMgbGVmdCBvdXQuXG5leHBvcnQgY29uc3QgdG9TYXZlZFRpbGluZyA9IChcbiAgcGxhbjogUmVzb2x2ZWRUaWxpbmdQbGFuLFxuICBpbmRleEJ5S2V5OiBSZWFkb25seU1hcDxzdHJpbmcsIG51bWJlcj4sXG4pOiBTYXZlZFRpbGluZyA9PiAoe1xuICB3aW5kb3dzOiB3aW5kb3dzT2ZQbGFuKHBsYW4pLmZsYXRNYXAoXG4gICAgKHsga2V5LCB0aXRsZTogX3RpdGxlLCAuLi5wbGFjZW1lbnQgfSkgPT4ge1xuICAgICAgY29uc3QgaW5kZXggPSBpbmRleEJ5S2V5LmdldChrZXkpO1xuXG4gICAgICByZXR1cm4gaW5kZXggPT09IHVuZGVmaW5lZCA/IFtdIDogW3sgaW5kZXgsIC4uLnBsYWNlbWVudCB9XTtcbiAgICB9LFxuICApLFxuICBjb2x1bW5zOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgcGxhbi5zY3JlZW5zLm1hcCgoc2NyZWVuKSA9PiBbU3RyaW5nKHNjcmVlbi5kaXNwbGF5LmlkKSwgc2NyZWVuLmNvbHVtbnNdKSxcbiAgKSxcbiAgcm93czogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIHBsYW4uc2NyZWVucy5tYXAoKHNjcmVlbikgPT4gW1N0cmluZyhzY3JlZW4uZGlzcGxheS5pZCksIHNjcmVlbi5yb3dzXSksXG4gICksXG4gIHNjcmVlbnM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBwbGFuLnNjcmVlbnMubWFwKChzY3JlZW4pID0+IFtcbiAgICAgIFN0cmluZyhzY3JlZW4uZGlzcGxheS5pZCksXG4gICAgICB0b1N0b3JlZFNjcmVlbihzY3JlZW4uZGlzcGxheSksXG4gICAgXSksXG4gICksXG59KTtcblxuLy8gVGhlIG9wZW4gd2luZG93cyBzdGFuZGluZyBmb3IgdGhlIGxheW91dCdzIHdpbmRvd3M6IHRoZSBzYW1lIHdpbmRvdywgb3Igb25lIGRvaW5nIHRoZSBzYW1lLiBOb3Rcbi8vIG9uZSBtZXJlbHkgb2YgdGhlIHNhbWUga2luZDogbW9zdCB3aW5kb3dzIGFyZSB0YWJzIGluIHdpbmRvd3Mgb2YgdGhlaXIgb3duLCB3aGF0ZXZlciB0aGV5IHNob3cuXG5leHBvcnQgY29uc3QgbWF0Y2hPcGVuV2luZG93cyA9IChcbiAgc2F2ZWQ6IHJlYWRvbmx5IFNhdmVkV2luZG93W10sXG4gIG9wZW46IHJlYWRvbmx5IE9wZW5XaW5kb3dbXSxcbikgPT4ge1xuICBjb25zdCBtYXRjaGVzID0gbmV3IE1hcDxTYXZlZFdpbmRvdywgV2luZG93UmVjb3JkPigpO1xuXG4gIG1hdGNoV2luZG93cyhzYXZlZCwgb3BlbiwgbWF0Y2hlcywgW1xuICAgIGlzU2FtZVdpbmRvdyxcbiAgICBpc1NhbWVMaW5lYWdlLFxuICAgIGlzU2FtZVJlb3BlbmluZyxcbiAgXSk7XG5cbiAgcmV0dXJuIG1hdGNoZXM7XG59O1xuIiwgImltcG9ydCB7XG4gIGFwcGxpY2F0aW9uV2luZG93SWQsXG4gIGlzQXBwbGljYXRpb25XaW5kb3csXG4gIHR5cGUgV2luZG93SWQsXG59IGZyb20gXCJAazhzbGVucy9tZXNzYWdpbmctY29udHJhY3RzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIERpc3BsYXlSZWNvcmQsXG4gIFdpbmRvd0JvdW5kcyxcbiAgV2luZG93UmVjb3JkLFxufSBmcm9tIFwiQGs4c2xlbnMvd2luZG93LWxheW91dC1jb250cmFjdHNcIjtcbmltcG9ydCB7IGNvbHVtbnNGb3IgfSBmcm9tIFwiLi9ncmlkXCI7XG5cbi8vIEhvdyBhIHdpbmRvdyBpcyB0aWxlZCwgYXMgdGhlIHVzZXIgYXJyYW5nZWQgaXQ6IG9uIHdoaWNoIHNjcmVlbiwgb3Igb24gbm9uZSB0byBsZWF2ZSBpdCBhcyBpdCBpcyxcbi8vIGZyb20gd2hpY2ggY2VsbCBvZiB0aGUgc2NyZWVuJ3MgZ3JpZCwgYW5kIGhvdyBtYW55IGNlbGxzIGl0IHNwYW5zLlxuZXhwb3J0IGludGVyZmFjZSBTdG9yZWRQbGFuV2luZG93IHtcbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRpc3BsYXlJZDogbnVtYmVyIHwgbnVsbDtcbiAgLy8gVGhlIHRpdGxlIG9mIHRoZSB3aW5kb3csIHRvIHNob3cgaXQgYXMgbWlzc2luZyBvbmNlIGl0IGlzIG5vdCBvcGVuOyBtaXNzaW5nIGZyb20gcGxhbnMga2VwdFxuICAvLyBiZWZvcmUgd2luZG93cyB3ZXJlIGtlcHQgd2l0aCB0aGVpciB0aXRsZXMuXG4gIHJlYWRvbmx5IHRpdGxlPzogc3RyaW5nO1xuICAvLyBUaGUgd2luZG93J3MgaWQgd2hpbGUgaXQgd2FzIG9wZW4sIHRvIGFzayBMZW5zIGhvdyB0byBvcGVuIGl0IGFnYWluIG9uY2UgY2xvc2VkOyBtaXNzaW5nIGZyb21cbiAgLy8gcGxhbnMga2VwdCBiZWZvcmUsIGFuZCBmb3IgYSB3aW5kb3cgYmVpbmcgb3BlbmVkIGluIGEgY2VsbCwgd2hpY2ggaGFzIG5vbmUgeWV0LlxuICByZWFkb25seSB3aW5kb3c/OiBXaW5kb3dJZDtcbiAgLy8gTWlzc2luZyBmcm9tIHBsYW5zIGtlcHQgYmVmb3JlIHdpbmRvd3MgaGFkIGNlbGxzIG9mIHRoZWlyIG93bi5cbiAgcmVhZG9ubHkgY29sdW1uPzogbnVtYmVyO1xuICByZWFkb25seSByb3c/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGNvbHVtbnM6IG51bWJlcjtcbiAgcmVhZG9ubHkgcm93czogbnVtYmVyO1xufVxuXG4vLyBXaGF0IGEgcGxhbiBrZWVwcyBvZiBhIHNjcmVlbiwgdG8gc2hvdyBpdCB3aGVuIGl0IGlzIG5vdCBjb25uZWN0ZWQuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JlZFBsYW5TY3JlZW4ge1xuICByZWFkb25seSBsYWJlbDogc3RyaW5nO1xuICByZWFkb25seSBpc1ByaW1hcnk6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGJvdW5kczogV2luZG93Qm91bmRzO1xuICByZWFkb25seSB3b3JrQXJlYTogV2luZG93Qm91bmRzO1xufVxuXG4vLyBUaGUgdGlsaW5nIHRoZSB1c2VyIGFycmFuZ2VkOiB0aGUgd2luZG93cywgdGhlIGVhcmxpZXIgb25lcyBnZXR0aW5nIHRoZWlyIGNlbGxzIGZpcnN0IHdoZXJlIHR3b1xuLy8gd2FudCB0aGUgc2FtZSwgYW5kIHRoZSBjb2x1bW5zIGFuZCByb3dzIG9mIHRoZSBzY3JlZW5zJyBncmlkcy4gS2VwdCBieSB3aW5kb3cgYW5kIHNjcmVlbiwgc28gd2hhdCBpcyBub3Qgb3BlbiBvciBub3QgY29ubmVjdGVkIG5vdyB3YWl0c1xuLy8gZm9yIHdoZW4gaXQgaXMuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JlZFRpbGluZ1BsYW4ge1xuICByZWFkb25seSB3aW5kb3dzOiByZWFkb25seSBTdG9yZWRQbGFuV2luZG93W107XG4gIHJlYWRvbmx5IGNvbHVtbnM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIG51bWJlcj4+O1xuICAvLyBNaXNzaW5nIGZyb20gcGxhbnMga2VwdCBiZWZvcmUgcm93cyBjb3VsZCBiZSBjaG9zZW4uXG4gIHJlYWRvbmx5IHJvd3M/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PjtcbiAgLy8gVGhlIHNjcmVlbnMgdGhlIHBsYW4gd2FzIG1hZGUgd2l0aCwgYnkgaWQ7IG1pc3NpbmcgZnJvbSBwbGFucyBrZXB0IGJlZm9yZSBzY3JlZW5zIHdlcmUuXG4gIHJlYWRvbmx5IHNjcmVlbnM/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBTdG9yZWRQbGFuU2NyZWVuPj47XG59XG5cbi8vIFRoZSBtb3N0IGNvbHVtbnMgYSBzY3JlZW4gaXMgZ2l2ZW4gYnkgaXRzZWxmLCBiZWZvcmUgb25lIGlzIGNob3NlbiBmb3IgaXQ7IG1vcmUgY2FuIGJlIGFkZGVkLlxuZXhwb3J0IGNvbnN0IG1heENvbHVtbnMgPSA4O1xuLy8gVGhlIG1vc3Qgcm93cyBhIHdpbmRvdyBpcyBtYWRlIHRhbGwgYnkgZHJhZ2dpbmcgaXRzIGNvcm5lciwgYmV5b25kIHRob3NlIG9mIGl0cyBzY3JlZW4uXG5leHBvcnQgY29uc3QgbWF4Um93cyA9IDg7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxhbm5lZFdpbmRvdyB7XG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICByZWFkb25seSByZWNvcmQ6IFdpbmRvd1JlY29yZDtcbiAgLy8gV2hldGhlciB0aGUgd2luZG93IGlzIG5vdCBvcGVuIG5vdzogaXQgaXMgc2hvd24gd2hlcmUgdGhlIHBsYW4gaGFzIGl0LCBhbmQgbm90IHRpbGVkLlxuICByZWFkb25seSBtaXNzaW5nPzogYm9vbGVhbjtcbiAgLy8gVGhlIGlkIGEgd2luZG93IG5vdCBvcGVuIGhhZCB3aGlsZSBpdCB3YXMgb3Blbiwgd2hlbiBrbm93bjogTGVucyBkZXNjcmliZXMgaXQgYnkgdGhhdCBvbmNlXG4gIC8vIGNsb3NlZCwgdG8gb3BlbiBpdCBhZ2Fpbi5cbiAgcmVhZG9ubHkgY2xvc2VkPzogV2luZG93SWQ7XG4gIC8vIFRoZSBjZWxsIHRoZSB3aW5kb3cgaXMgcHV0IGluLCB3aGVuIGl0IGlzIHB1dCBpbiBvbmU7IG90aGVyd2lzZSBpdCB0YWtlcyB0aGUgZmlyc3QgdGhhdCBpcyBmcmVlLlxuICByZWFkb25seSBjb2x1bW4/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHJvdz86IG51bWJlcjtcbiAgcmVhZG9ubHkgY29sdW1uczogbnVtYmVyO1xuICByZWFkb25seSByb3dzOiBudW1iZXI7XG59XG5cbi8vIEEgd2luZG93IHBsYWNlZCBpbiBpdHMgc2NyZWVuJ3MgZ3JpZDogZnJvbSB3aGljaCBjZWxsLCBhbmQgb3ZlciBob3cgbWFueS5cbmV4cG9ydCBpbnRlcmZhY2UgUGxhY2VkV2luZG93IGV4dGVuZHMgUGxhbm5lZFdpbmRvdyB7XG4gIHJlYWRvbmx5IGNvbHVtbjogbnVtYmVyO1xuICByZWFkb25seSByb3c6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGFubmVkU2NyZWVuIHtcbiAgcmVhZG9ubHkgZGlzcGxheTogRGlzcGxheVJlY29yZDtcbiAgLy8gV2hldGhlciB0aGUgc2NyZWVuIGlzIG5vdCBjb25uZWN0ZWQgbm93OiBpdCBpcyBzaG93biBhcyB0aGUgcGxhbiBoYXMgaXQsIGFuZCBub3QgdGlsZWQuXG4gIHJlYWRvbmx5IG1pc3Npbmc6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGNvbHVtbnM6IG51bWJlcjtcbiAgLy8gVGhlIHJvd3Mgb2YgdGhlIGdyaWQ6IGFzIG1hbnkgYXMgY2hvc2VuLCBidXQgbmV2ZXIgZmV3ZXIgdGhhbiB0aGUgd2luZG93cyBuZWVkLlxuICByZWFkb25seSByb3dzOiBudW1iZXI7XG4gIHJlYWRvbmx5IG5lZWRlZFJvd3M6IG51bWJlcjtcbiAgcmVhZG9ubHkgd2luZG93czogcmVhZG9ubHkgUGxhY2VkV2luZG93W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRUaWxpbmdQbGFuIHtcbiAgcmVhZG9ubHkgc2NyZWVuczogcmVhZG9ubHkgUGxhbm5lZFNjcmVlbltdO1xuICByZWFkb25seSB1bnRpbGVkOiByZWFkb25seSBQbGFubmVkV2luZG93W107XG59XG5cbi8vIFdoYXQgbmFtZXMgYSB3aW5kb3cgYWNyb3NzIHJlYWRzIG9mIHRoZSB3aW5kb3dzLCBhcyBpdHMgV2luZG93SWQgZG9lcy5cbi8vIFRoZSBhbGlhcyBvZiBhIHdpbmRvdyB0aGF0IGhhcyBubyBwbGFjZSBpbiB0aGUgcGxhbiBmb3Igbm93LCBhcyBvbmUgc2hvd2luZyB3aGlsZSB3aW5kb3dzIGFyZVxuLy8gb3BlbmVkIGFnYWluIHRoYXQgaXMgbm9uZSBvZiB0aGVtLlxuZXhwb3J0IGNvbnN0IGxlZnRPdXRPZlBsYW4gPSBcIlwiO1xuXG4vLyBXaGF0IHRoZSBrZXkgb2YgYSB3aW5kb3cgYmVpbmcgb3BlbmVkIGluIGEgY2VsbCBzdGFydHMgd2l0aCwgdGhlIGlkIGl0IGlzIG9wZW5lZCB1bmRlciBhZnRlciBpdC5cbmV4cG9ydCBjb25zdCBvcGVuaW5nUHJlZml4ID0gXCJvcGVuaW5nOlwiO1xuXG5leHBvcnQgY29uc3Qga2V5T2ZXaW5kb3cgPSAod2luZG93OiBXaW5kb3dJZCkgPT5cbiAgaXNBcHBsaWNhdGlvbldpbmRvdyh3aW5kb3cpXG4gICAgPyBcImFwcGxpY2F0aW9uXCJcbiAgICA6IEpTT04uc3RyaW5naWZ5KFt3aW5kb3cua2luZCwgd2luZG93LmlkXSk7XG5cbi8vIFRoZSBpZCBhIHdpbmRvdyBub3Qgb3BlbiBoYWQgd2hpbGUgb3BlbiwgYnkgaXRzIHBsYW4gZW50cnk6IGFzIGtlcHQgd2l0aCBpdCwgb3IgZm9yIGEgcGxhbiBrZXB0XG4vLyBiZWZvcmUgaWRzIHdlcmUsIGFzIGl0cyBrZXkgdGVsbHMsIGl0cyBvd24gb3IsIG1pc3Npbmcgc2luY2UgYSBsYXlvdXQgd2FzIHNob3duLCB0aGUgbGF5b3V0J3MuXG5leHBvcnQgY29uc3QgY2xvc2VkV2luZG93T2YgPSAoZW50cnk6IHtcbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHdpbmRvdz86IFdpbmRvd0lkO1xufSkgPT4ge1xuICBpZiAoZW50cnkud2luZG93KSB7XG4gICAgcmV0dXJuIGVudHJ5LndpbmRvdztcbiAgfVxuXG4gIGNvbnN0IG93biA9IC9ebWlzc2luZzpcXGQrOiguKikkL3MuZXhlYyhlbnRyeS5rZXkpPy5bMV0gPz8gZW50cnkua2V5O1xuXG4gIHJldHVybiBvd24uc3RhcnRzV2l0aChcIltcIikgPyB3aW5kb3dPZktleShvd24pIDogdW5kZWZpbmVkO1xufTtcblxuLy8gVGhlIHdpbmRvdyBhIGtleSBvZiBga2V5T2ZXaW5kb3dgIG5hbWVzLCBhcyBhIHdpbmRvdyBub3Qgb3BlbiBpcyBrbm93biBieSBpdHMga2V5IGFsb25lLlxuZXhwb3J0IGNvbnN0IHdpbmRvd09mS2V5ID0gKGtleTogc3RyaW5nKTogV2luZG93SWQgPT4ge1xuICBpZiAoa2V5ID09PSBcImFwcGxpY2F0aW9uXCIpIHtcbiAgICByZXR1cm4gYXBwbGljYXRpb25XaW5kb3dJZDtcbiAgfVxuXG4gIGNvbnN0IFtraW5kLCBpZF0gPSBKU09OLnBhcnNlKGtleSkgYXMgW3N0cmluZywgc3RyaW5nXTtcblxuICByZXR1cm4geyBraW5kLCBpZCB9IGFzIFdpbmRvd0lkO1xufTtcblxuY29uc3QgY2xhbXAgPSAodmFsdWU6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKSA9PlxuICBNYXRoLm1heChtaW4sIE1hdGgubWluKG1heCwgTWF0aC5yb3VuZCh2YWx1ZSkpKTtcblxuLy8gUGxhY2VzIHRoZSB3aW5kb3dzIGluIGEgZ3JpZCBvZiB0aGUgY29sdW1uczogZmlyc3QgZWFjaCB3aW5kb3cgcHV0IGluIGEgY2VsbCwgaW4gdGhlaXIgb3JkZXIsXG4vLyB3aGVyZSBpdCBmaXRzIGFuZCBub3RoaW5nIGlzIHlldDsgdGhlbiBldmVyeSBvdGhlciB3aW5kb3csIGFzIG9uZSB3aG9zZSBjZWxsIGFub3RoZXIgdG9vaywgaW4gdGhlXG4vLyBmaXJzdCBjZWxsIGZyb20gdGhlIHRvcCBsZWZ0IHdoZXJlIGl0IGZpdHMuIEEgd2luZG93IHdpZGVyIHRoYW4gdGhlIGdyaWQgaXMgbmFycm93ZWQgdG8gaXQsIGFuZFxuLy8gb25lIHB1dCB0b28gZmFyIHJpZ2h0IG1vdmVkIGxlZnQgdG8gZml0LlxuLy8gUGxhY2VkIGJ5IHRoZWlyIGNlbGxzIGFsb25lLCBzbyB0aGF0IHdpbmRvd3Mgb2YgYSBzYXZlZCBsYXlvdXQgYXJlIHBsYWNlZCBhcyBvcGVuIG9uZXMgYXJlLlxudHlwZSBJbkdyaWQgPSBQaWNrPFBsYW5uZWRXaW5kb3csIFwiY29sdW1uXCIgfCBcInJvd1wiIHwgXCJjb2x1bW5zXCIgfCBcInJvd3NcIj47XG5cbmV4cG9ydCBjb25zdCBwbGFjZUluR3JpZCA9IDxXIGV4dGVuZHMgSW5HcmlkPihcbiAgd2luZG93czogcmVhZG9ubHkgV1tdLFxuICBjb2x1bW5zOiBudW1iZXIsXG4pID0+IHtcbiAgY29uc3QgdGFrZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgcGxhY2VkID0gbmV3IE1hcDxXLCBXICYgeyBjb2x1bW46IG51bWJlcjsgcm93OiBudW1iZXIgfT4oKTtcbiAgbGV0IHJvd3MgPSAwO1xuXG4gIGNvbnN0IGlzRnJlZSA9IChcbiAgICByb3c6IG51bWJlcixcbiAgICBjb2x1bW46IG51bWJlcixcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICApID0+IHtcbiAgICBmb3IgKGxldCByID0gcm93OyByIDwgcm93ICsgaGVpZ2h0OyByKyspIHtcbiAgICAgIGZvciAobGV0IGMgPSBjb2x1bW47IGMgPCBjb2x1bW4gKyB3aWR0aDsgYysrKSB7XG4gICAgICAgIGlmICh0YWtlbi5oYXMoYCR7cn0sJHtjfWApKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgY29uc3QgcGxhY2UgPSAoXG4gICAgd2luZG93OiBXLFxuICAgIHJvdzogbnVtYmVyLFxuICAgIGNvbHVtbjogbnVtYmVyLFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICkgPT4ge1xuICAgIGZvciAobGV0IHIgPSByb3c7IHIgPCByb3cgKyB3aW5kb3cucm93czsgcisrKSB7XG4gICAgICBmb3IgKGxldCBjID0gY29sdW1uOyBjIDwgY29sdW1uICsgd2lkdGg7IGMrKykge1xuICAgICAgICB0YWtlbi5hZGQoYCR7cn0sJHtjfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJvd3MgPSBNYXRoLm1heChyb3dzLCByb3cgKyB3aW5kb3cucm93cyk7XG4gICAgcGxhY2VkLnNldCh3aW5kb3csIHsgLi4ud2luZG93LCBjb2x1bW5zOiB3aWR0aCwgY29sdW1uLCByb3cgfSk7XG4gIH07XG5cbiAgZm9yIChjb25zdCB3aW5kb3cgb2Ygd2luZG93cykge1xuICAgIGlmICh3aW5kb3cuY29sdW1uID09PSB1bmRlZmluZWQgfHwgd2luZG93LnJvdyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCB3aWR0aCA9IE1hdGgubWluKHdpbmRvdy5jb2x1bW5zLCBjb2x1bW5zKTtcbiAgICBjb25zdCBjb2x1bW4gPSBNYXRoLm1heCgwLCBNYXRoLm1pbih3aW5kb3cuY29sdW1uLCBjb2x1bW5zIC0gd2lkdGgpKTtcbiAgICBjb25zdCByb3cgPSBNYXRoLm1heCgwLCB3aW5kb3cucm93KTtcblxuICAgIGlmIChpc0ZyZWUocm93LCBjb2x1bW4sIHdpZHRoLCB3aW5kb3cucm93cykpIHtcbiAgICAgIHBsYWNlKHdpbmRvdywgcm93LCBjb2x1bW4sIHdpZHRoKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHdpbmRvdyBvZiB3aW5kb3dzKSB7XG4gICAgaWYgKHBsYWNlZC5oYXMod2luZG93KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgd2lkdGggPSBNYXRoLm1pbih3aW5kb3cuY29sdW1ucywgY29sdW1ucyk7XG4gICAgbGV0IGF0ID0gMDtcblxuICAgIHdoaWxlIChcbiAgICAgIChhdCAlIGNvbHVtbnMpICsgd2lkdGggPiBjb2x1bW5zIHx8XG4gICAgICAhaXNGcmVlKE1hdGguZmxvb3IoYXQgLyBjb2x1bW5zKSwgYXQgJSBjb2x1bW5zLCB3aWR0aCwgd2luZG93LnJvd3MpXG4gICAgKSB7XG4gICAgICBhdCsrO1xuICAgIH1cblxuICAgIHBsYWNlKHdpbmRvdywgTWF0aC5mbG9vcihhdCAvIGNvbHVtbnMpLCBhdCAlIGNvbHVtbnMsIHdpZHRoKTtcbiAgfVxuXG4gIHJldHVybiB7IHBsYWNlZDogd2luZG93cy5tYXAoKHdpbmRvdykgPT4gcGxhY2VkLmdldCh3aW5kb3cpISksIHJvd3MgfTtcbn07XG5cbi8vIFdoZXJlIGEgd2luZG93IHBsYWNlZCBpbiB0aGUgZ3JpZCBnb2VzIG92ZXIgdGhlIGFyZWEsIHRoZSBjZWxscyBzcGxpdCBldmVubHksIHRvIHRoZSBwaXhlbC5cbmV4cG9ydCBjb25zdCBib3VuZHNJbkdyaWQgPSAoXG4gIGFyZWE6IFdpbmRvd0JvdW5kcyxcbiAgY29sdW1uczogbnVtYmVyLFxuICByb3dzOiBudW1iZXIsXG4gIHdpbmRvdzogUGljazxQbGFjZWRXaW5kb3csIFwiY29sdW1uXCIgfCBcInJvd1wiIHwgXCJjb2x1bW5zXCIgfCBcInJvd3NcIj4sXG4pOiBXaW5kb3dCb3VuZHMgPT4ge1xuICBjb25zdCB4QXQgPSAoY29sdW1uOiBudW1iZXIpID0+XG4gICAgYXJlYS54ICsgTWF0aC5yb3VuZCgoY29sdW1uICogYXJlYS53aWR0aCkgLyBjb2x1bW5zKTtcbiAgY29uc3QgeUF0ID0gKHJvdzogbnVtYmVyKSA9PlxuICAgIGFyZWEueSArIE1hdGgucm91bmQoKHJvdyAqIGFyZWEuaGVpZ2h0KSAvIE1hdGgubWF4KHJvd3MsIDEpKTtcblxuICByZXR1cm4ge1xuICAgIHg6IHhBdCh3aW5kb3cuY29sdW1uKSxcbiAgICB5OiB5QXQod2luZG93LnJvdyksXG4gICAgd2lkdGg6IHhBdCh3aW5kb3cuY29sdW1uICsgd2luZG93LmNvbHVtbnMpIC0geEF0KHdpbmRvdy5jb2x1bW4pLFxuICAgIGhlaWdodDogeUF0KHdpbmRvdy5yb3cgKyB3aW5kb3cucm93cykgLSB5QXQod2luZG93LnJvdyksXG4gIH07XG59O1xuXG5jb25zdCBjZWxsc09mID0gKHdpbmRvdzogeyBjb2x1bW5zOiBudW1iZXI7IHJvd3M6IG51bWJlciB9KSA9PlxuICB3aW5kb3cuY29sdW1ucyAqIHdpbmRvdy5yb3dzO1xuXG4vLyBXaXRoIG5vdGhpbmcgYXJyYW5nZWQ6IGV2ZXJ5IHdpbmRvdyBub3QgbWluaW1pemVkIHNwcmVhZCBvdmVyIHRoZSBzY3JlZW5zIGFzIGV2ZW5seSBhcyB0aGUgY2VsbHNcbi8vIGdvLCB0aGUgbWFpbiB3aW5kb3cgZmlyc3QsIHR3byBjZWxscyB3aWRlLCBvbiB0aGUgcHJpbWFyeSBzY3JlZW47IG9uIGEgdGllIGFueSBvdGhlciB3aW5kb3cgc3RheXNcbi8vIG9uIHRoZSBzY3JlZW4gaXQgaXMgb24uIE1pbmltaXplZCB3aW5kb3dzIGFyZSBsZWZ0IGFzIHRoZXkgYXJlLlxuY29uc3Qgc3ByZWFkQnlEZWZhdWx0ID0gKFxuICB3aW5kb3dzOiByZWFkb25seSBXaW5kb3dSZWNvcmRbXSxcbiAgZGlzcGxheXM6IHJlYWRvbmx5IERpc3BsYXlSZWNvcmRbXSxcbiAgdGlsZU1pbmltaXplZDogYm9vbGVhbixcbikgPT4ge1xuICBjb25zdCBieVNjcmVlbiA9IG5ldyBNYXA8RGlzcGxheVJlY29yZCwgUGxhbm5lZFdpbmRvd1tdPihcbiAgICBkaXNwbGF5cy5tYXAoKGRpc3BsYXkpID0+IFtkaXNwbGF5LCBbXV0pLFxuICApO1xuICBjb25zdCBjZWxsc1Rha2VuID0gKGRpc3BsYXk6IERpc3BsYXlSZWNvcmQpID0+XG4gICAgYnlTY3JlZW4uZ2V0KGRpc3BsYXkpIS5yZWR1Y2UoKHN1bSwgaXQpID0+IHN1bSArIGNlbGxzT2YoaXQpLCAwKTtcbiAgY29uc3QgdW50aWxlZDogUGxhbm5lZFdpbmRvd1tdID0gW107XG4gIGNvbnN0IHRvVGlsZSA9IHdpbmRvd3MuZmlsdGVyKFxuICAgICh3aW5kb3cpID0+IHRpbGVNaW5pbWl6ZWQgfHwgd2luZG93LnN0YXRlLmdldCgpICE9PSBcIm1pbmltaXplZFwiLFxuICApO1xuICBjb25zdCBtYWluRmlyc3QgPSBbLi4udG9UaWxlXS5zb3J0KFxuICAgIChhLCBiKSA9PlxuICAgICAgTnVtYmVyKGlzQXBwbGljYXRpb25XaW5kb3coYi53aW5kb3cpKSAtXG4gICAgICBOdW1iZXIoaXNBcHBsaWNhdGlvbldpbmRvdyhhLndpbmRvdykpLFxuICApO1xuXG4gIGZvciAoY29uc3QgcmVjb3JkIG9mIG1haW5GaXJzdCkge1xuICAgIGNvbnN0IGlzTWFpbiA9IGlzQXBwbGljYXRpb25XaW5kb3cocmVjb3JkLndpbmRvdyk7XG4gICAgY29uc3QgZmV3ZXN0ID0gTWF0aC5taW4oLi4uZGlzcGxheXMubWFwKGNlbGxzVGFrZW4pKTtcbiAgICBjb25zdCBjYW5kaWRhdGVzID0gZGlzcGxheXMuZmlsdGVyKFxuICAgICAgKGRpc3BsYXkpID0+IGNlbGxzVGFrZW4oZGlzcGxheSkgPT09IGZld2VzdCxcbiAgICApO1xuXG4gICAgY29uc3QgZGlzcGxheSA9XG4gICAgICAoaXNNYWluID8gY2FuZGlkYXRlcy5maW5kKChpdCkgPT4gaXQuaXNQcmltYXJ5LmdldCgpKSA6IHVuZGVmaW5lZCkgPz9cbiAgICAgIGNhbmRpZGF0ZXMuZmluZCgoaXQpID0+IGl0LmlkID09PSByZWNvcmQuZGlzcGxheUlkLmdldCgpKSA/P1xuICAgICAgY2FuZGlkYXRlc1swXTtcblxuICAgIGJ5U2NyZWVuLmdldChkaXNwbGF5KSEucHVzaCh7XG4gICAgICBrZXk6IGtleU9mV2luZG93KHJlY29yZC53aW5kb3cpLFxuICAgICAgcmVjb3JkLFxuICAgICAgY29sdW1uczogaXNNYWluID8gMiA6IDEsXG4gICAgICByb3dzOiAxLFxuICAgIH0pO1xuICB9XG5cbiAgZm9yIChjb25zdCByZWNvcmQgb2Ygd2luZG93cykge1xuICAgIGlmICghdG9UaWxlLmluY2x1ZGVzKHJlY29yZCkpIHtcbiAgICAgIHVudGlsZWQucHVzaCh7XG4gICAgICAgIGtleToga2V5T2ZXaW5kb3cocmVjb3JkLndpbmRvdyksXG4gICAgICAgIHJlY29yZCxcbiAgICAgICAgY29sdW1uczogMSxcbiAgICAgICAgcm93czogMSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIEVhY2ggc2NyZWVuIGluIHRoZSBvcmRlciB0aGUgd2luZG93cyBvcGVuZWQsIHRoZSBtYWluIHdpbmRvdyBmaXJzdCwgYXMgaXQgd2FzIGFsd2F5cyB0aWxlZC5cbiAgZm9yIChjb25zdCBbZGlzcGxheSwgb25TY3JlZW5dIG9mIGJ5U2NyZWVuKSB7XG4gICAgYnlTY3JlZW4uc2V0KFxuICAgICAgZGlzcGxheSxcbiAgICAgIHRvVGlsZS5mbGF0TWFwKChyZWNvcmQpID0+IG9uU2NyZWVuLmZpbHRlcigoaXQpID0+IGl0LnJlY29yZCA9PT0gcmVjb3JkKSksXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB7IGJ5U2NyZWVuLCB1bnRpbGVkIH07XG59O1xuXG4vLyBUaGUgaWQgYSBzY3JlZW4gdGhlIHBsYW4gaGFzIHVuZGVyIGFuIGlkIG5vdCBjb25uZWN0ZWQgbm93IGlzIGNvbm5lY3RlZCB1bmRlcjogdGhlIHNjcmVlbiBvZiB0aGVcbi8vIHNhbWUgbmFtZSwgb2YgdGhlIHNhbWUgc2l6ZSB0b28gd2hlcmUgdHdvIHNoYXJlIHRoZSBuYW1lLCBhcyBtYWNPUyBnaXZlcyBhIHNjcmVlbiBhIG5ldyBpZCB3aGVuXG4vLyBpdCBpcyBjb25uZWN0ZWQgYWdhaW4uIE5vbmUgd2hlbiB0aGUgc2NyZWVuIGlzIGNvbm5lY3RlZCB1bmRlciBpdHMgaWQsIG9yIG5vdCBhdCBhbGwuXG5leHBvcnQgY29uc3QgcmVjb25uZWN0ZWRJZE9mID0gKFxuICBpZDogc3RyaW5nLFxuICBzY3JlZW46IFN0b3JlZFBsYW5TY3JlZW4sXG4gIGRpc3BsYXlzOiByZWFkb25seSBEaXNwbGF5UmVjb3JkW10sXG4pOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIXNjcmVlbi5sYWJlbCB8fCBkaXNwbGF5cy5zb21lKChkaXNwbGF5KSA9PiBTdHJpbmcoZGlzcGxheS5pZCkgPT09IGlkKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBuYW1lZCA9IGRpc3BsYXlzLmZpbHRlcihcbiAgICAoZGlzcGxheSkgPT4gZGlzcGxheS5sYWJlbC5nZXQoKSA9PT0gc2NyZWVuLmxhYmVsLFxuICApO1xuXG4gIGNvbnN0IHNhbWUgPVxuICAgIG5hbWVkLmxlbmd0aCA+IDFcbiAgICAgID8gbmFtZWQuZmlsdGVyKFxuICAgICAgICAgIChkaXNwbGF5KSA9PlxuICAgICAgICAgICAgZGlzcGxheS5ib3VuZHMuZ2V0KCkud2lkdGggPT09IHNjcmVlbi5ib3VuZHMud2lkdGggJiZcbiAgICAgICAgICAgIGRpc3BsYXkuYm91bmRzLmdldCgpLmhlaWdodCA9PT0gc2NyZWVuLmJvdW5kcy5oZWlnaHQsXG4gICAgICAgIClcbiAgICAgIDogbmFtZWQ7XG5cbiAgcmV0dXJuIHNhbWUubGVuZ3RoID09PSAxID8gc2FtZVswXS5pZCA6IHVuZGVmaW5lZDtcbn07XG5cbi8vIFRoZSBwbGFuIHdpdGggdGhlIHNjcmVlbnMgaXQgaGFzIHVuZGVyIGlkcyBjb25uZWN0ZWQgbm8gbW9yZSBtb3ZlZCB0byB0aGUgaWRzIHRoZXkgYXJlIGNvbm5lY3RlZFxuLy8gdW5kZXIgbm93LCB0aGVpciB3aW5kb3dzIHdpdGggdGhlbTsgdGhlaXIgZ3JpZHMgdG9vLCB1bmxlc3MgdGhlIHBsYW4gaGFzIHdpbmRvd3MgdW5kZXIgdGhlIG5ldyBpZC5cbmNvbnN0IHdpdGhTY3JlZW5zUmVjb25uZWN0ZWQgPSAoXG4gIHN0b3JlZDogU3RvcmVkVGlsaW5nUGxhbiB8IHVuZGVmaW5lZCxcbiAgZGlzcGxheXM6IHJlYWRvbmx5IERpc3BsYXlSZWNvcmRbXSxcbik6IFN0b3JlZFRpbGluZ1BsYW4gfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBtb3ZlZCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgZm9yIChjb25zdCBbaWQsIHNjcmVlbl0gb2YgT2JqZWN0LmVudHJpZXMoc3RvcmVkPy5zY3JlZW5zID8/IHt9KSkge1xuICAgIGNvbnN0IHRvID0gcmVjb25uZWN0ZWRJZE9mKGlkLCBzY3JlZW4sIGRpc3BsYXlzKTtcblxuICAgIGlmICh0byAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb3ZlZC5zZXQoaWQsIHRvKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXN0b3JlZCB8fCBtb3ZlZC5zaXplID09PSAwKSB7XG4gICAgcmV0dXJuIHN0b3JlZDtcbiAgfVxuXG4gIGNvbnN0IGhhc1dpbmRvd3MgPSBuZXcgU2V0KFxuICAgIHN0b3JlZC53aW5kb3dzLm1hcCgod2luZG93KSA9PiBTdHJpbmcod2luZG93LmRpc3BsYXlJZCkpLFxuICApO1xuXG4gIGNvbnN0IGdyaWRzTW92ZWQgPSAoZ3JpZHM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIG51bWJlcj4+KSA9PiB7XG4gICAgY29uc3Qga2VwdCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKGdyaWRzKS5maWx0ZXIoKFtpZF0pID0+ICFtb3ZlZC5oYXMoaWQpKSxcbiAgICApO1xuXG4gICAgZm9yIChjb25zdCBbaWQsIGNvdW50XSBvZiBPYmplY3QuZW50cmllcyhncmlkcykpIHtcbiAgICAgIGNvbnN0IHRvID0gbW92ZWQuZ2V0KGlkKTtcblxuICAgICAgaWYgKFxuICAgICAgICB0byAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIChrZXB0W3RvXSA9PT0gdW5kZWZpbmVkIHx8ICFoYXNXaW5kb3dzLmhhcyhTdHJpbmcodG8pKSlcbiAgICAgICkge1xuICAgICAgICBrZXB0W3RvXSA9IGNvdW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBrZXB0O1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RvcmVkLFxuICAgIHdpbmRvd3M6IHN0b3JlZC53aW5kb3dzLm1hcCgod2luZG93KSA9PiB7XG4gICAgICBjb25zdCB0byA9XG4gICAgICAgIHdpbmRvdy5kaXNwbGF5SWQgPT09IG51bGxcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogbW92ZWQuZ2V0KFN0cmluZyh3aW5kb3cuZGlzcGxheUlkKSk7XG5cbiAgICAgIHJldHVybiB0byA9PT0gdW5kZWZpbmVkID8gd2luZG93IDogeyAuLi53aW5kb3csIGRpc3BsYXlJZDogdG8gfTtcbiAgICB9KSxcbiAgICBjb2x1bW5zOiBncmlkc01vdmVkKHN0b3JlZC5jb2x1bW5zKSxcbiAgICByb3dzOiBzdG9yZWQucm93cyAmJiBncmlkc01vdmVkKHN0b3JlZC5yb3dzKSxcbiAgICBzY3JlZW5zOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhzdG9yZWQuc2NyZWVucyA/PyB7fSkuZmlsdGVyKChbaWRdKSA9PiAhbW92ZWQuaGFzKGlkKSksXG4gICAgKSxcbiAgfTtcbn07XG5cbi8vIFRoZSBwbGFuIHdpdGggYSB0aWxlIG9mIGEgbGF5b3V0J3Mgd2luZG93IG5vdCBvcGVuIHdoZW4gdGhlIGxheW91dCB3YXMgc2hvd24gZ29pbmcgYnkgdGhlIHdpbmRvdydzXG4vLyBvd24ga2V5IG9uY2UgdGhlIHdpbmRvdyBpcyBvcGVuIHVuZGVyIGl0IGFnYWluLCBhcyBMZW5zIG9wZW5zIHdpbmRvd3MgYWdhaW4gYWZ0ZXIgYSByZXN0YXJ0OiB0aGVcbi8vIHRpbGUgaXMgdGhhdCB3aW5kb3csIG5ldmVyIG9uZSBiZXNpZGUgYSB3aW5kb3cgc2hvd24gYXMgbmV3LlxuY29uc3Qgd2l0aFdpbmRvd3NPcGVuQWdhaW4gPSAoXG4gIHN0b3JlZDogU3RvcmVkVGlsaW5nUGxhbiB8IHVuZGVmaW5lZCxcbiAgd2luZG93czogcmVhZG9ubHkgV2luZG93UmVjb3JkW10sXG4gIGtleU9mOiAocmVjb3JkOiBXaW5kb3dSZWNvcmQpID0+IHN0cmluZyxcbik6IFN0b3JlZFRpbGluZ1BsYW4gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIXN0b3JlZCkge1xuICAgIHJldHVybiBzdG9yZWQ7XG4gIH1cblxuICBjb25zdCBvcGVuID0gbmV3IFNldCh3aW5kb3dzLm1hcChrZXlPZikpO1xuICBjb25zdCBuYW1lZCA9IG5ldyBTZXQoc3RvcmVkLndpbmRvd3MubWFwKChpdCkgPT4gaXQua2V5KSk7XG4gIGNvbnN0IHRha2VuID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdG9yZWQsXG4gICAgd2luZG93czogc3RvcmVkLndpbmRvd3MubWFwKCh3aW5kb3cpID0+IHtcbiAgICAgIGNvbnN0IG93biA9IC9ebWlzc2luZzpcXGQrOiguKikkL3MuZXhlYyh3aW5kb3cua2V5KT8uWzFdO1xuXG4gICAgICBpZiAoXG4gICAgICAgIG93biA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICFvcGVuLmhhcyhvd24pIHx8XG4gICAgICAgIG5hbWVkLmhhcyhvd24pIHx8XG4gICAgICAgIHRha2VuLmhhcyhvd24pXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICAgIH1cblxuICAgICAgdGFrZW4uYWRkKG93bik7XG5cbiAgICAgIHJldHVybiB7IC4uLndpbmRvdywga2V5OiBvd24gfTtcbiAgICB9KSxcbiAgfTtcbn07XG5cbi8vIFRoZSBwbGFuIGZvciB0aGUgd2luZG93cyBvcGVuIGFuZCB0aGUgc2NyZWVucyBjb25uZWN0ZWQgbm93OiB3aGF0IHRoZSB1c2VyIGFycmFuZ2VkLCBmb3IgdGhlXG4vLyB3aW5kb3dzIGFuZCBzY3JlZW5zIGl0IG5hbWVzOyBhIHdpbmRvdyBpdCBkb2VzIG5vdCBuYW1lLCBhcyBvbmUgb3BlbmVkIHNpbmNlLCBpcyBub3QgdGlsZWQuIEFcbi8vIHdpbmRvdyBpdCBuYW1lcyBvbiBhIHNjcmVlbiBpdCBrbm93cyBub3RoaW5nIG9mIGdvZXMgb24gdGhlIHNjcmVlbiBpdCBpcyBvbiBpZiB3aW5kb3dzIGFyZSB0aWxlZFxuLy8gdGhlcmUsIGFuZCBvdGhlcndpc2Ugb24gdGhlIHNjcmVlbiB3aXRoIHRoZSBmZXdlc3QgY2VsbHMgdGFrZW4sIGxlZnQgYXMgaXQgaXMgd2hlbiBtaW5pbWl6ZWQuXG5leHBvcnQgY29uc3QgcmVzb2x2ZVRpbGluZ1BsYW4gPSAoXG4gIHdpbmRvd3M6IHJlYWRvbmx5IFdpbmRvd1JlY29yZFtdLFxuICBkaXNwbGF5czogcmVhZG9ubHkgRGlzcGxheVJlY29yZFtdLFxuICBzdG9yZWQ6IFN0b3JlZFRpbGluZ1BsYW4gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IHtcbiAgICAvLyBXaGV0aGVyLCB3aXRoIG5vdGhpbmcgYXJyYW5nZWQsIG1pbmltaXplZCB3aW5kb3dzIGFyZSB0aWxlZCB0b28gcmF0aGVyIHRoYW4gbGVmdCBhcyB0aGV5IGFyZS5cbiAgICByZWFkb25seSB0aWxlTWluaW1pemVkPzogYm9vbGVhbjtcbiAgICAvLyBUaGUga2V5IGVhY2ggd2luZG93IGdvZXMgYnkgaW4gdGhlIHBsYW4sIGJ5IGl0cyBvd246IGEgd2luZG93IGJlaW5nIG9wZW5lZCBhZ2FpbiBnb2VzIGJ5IHRoZVxuICAgIC8vIGtleSBvZiB0aGUgd2luZG93IG5vdCBvcGVuIGl0IGlzLCBhcyBzb29uIGFzIGl0IHNob3dzOyBvbmUgYWxpYXNlZCBhcyBgbGVmdE91dE9mUGxhbmAgaGFzIG5vXG4gICAgLy8gcGxhY2UgaW4gdGhlIHBsYW4gZm9yIG5vdy5cbiAgICByZWFkb25seSBhbGlhc2VzPzogUmVhZG9ubHlNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICB9ID0ge30sXG4pOiBSZXNvbHZlZFRpbGluZ1BsYW4gPT4ge1xuICBjb25zdCBrZXlPZiA9IChyZWNvcmQ6IFdpbmRvd1JlY29yZCkgPT4ge1xuICAgIGNvbnN0IGtleSA9IGtleU9mV2luZG93KHJlY29yZC53aW5kb3cpO1xuXG4gICAgcmV0dXJuIG9wdGlvbnMuYWxpYXNlcz8uZ2V0KGtleSkgPz8ga2V5O1xuICB9O1xuXG4gIHdpbmRvd3MgPSB3aW5kb3dzLmZpbHRlcigocmVjb3JkKSA9PiBrZXlPZihyZWNvcmQpICE9PSBsZWZ0T3V0T2ZQbGFuKTtcblxuICAvLyBUaGUgc2NyZWVucyBtYXkgbm90IGJlIGtub3duIHlldCwgYXMgYmVmb3JlIExlbnMgaGFzIHRvbGQgdGhlbTsgbm90aGluZyBjYW4gYmUgcGxhbm5lZCB3aXRob3V0LlxuICBpZiAoZGlzcGxheXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHsgc2NyZWVuczogW10sIHVudGlsZWQ6IFtdIH07XG4gIH1cblxuICBjb25zdCBjb25uZWN0ZWQgPSBkaXNwbGF5cztcblxuICBzdG9yZWQgPSB3aXRoV2luZG93c09wZW5BZ2FpbihcbiAgICB3aXRoU2NyZWVuc1JlY29ubmVjdGVkKHN0b3JlZCwgZGlzcGxheXMpLFxuICAgIHdpbmRvd3MsXG4gICAga2V5T2YsXG4gICk7XG5cbiAgLy8gQSBzY3JlZW4gdGhlIHBsYW4gaGFzIHdpbmRvd3Mgb24gdGhhdCBpcyBub3QgY29ubmVjdGVkIG5vdywga2VwdCB3aXRoIGl0cyB3aW5kb3dzIGFzIG1pc3NpbmcuXG4gIGNvbnN0IG1pc3NpbmcgPSBPYmplY3QuZW50cmllcyhzdG9yZWQ/LnNjcmVlbnMgPz8ge30pXG4gICAgLmZpbHRlcihcbiAgICAgIChbaWRdKSA9PlxuICAgICAgICAhY29ubmVjdGVkLnNvbWUoKGRpc3BsYXkpID0+IFN0cmluZyhkaXNwbGF5LmlkKSA9PT0gaWQpICYmXG4gICAgICAgIHN0b3JlZCEud2luZG93cy5zb21lKCh3aW5kb3cpID0+IFN0cmluZyh3aW5kb3cuZGlzcGxheUlkKSA9PT0gaWQpLFxuICAgIClcbiAgICAubWFwKChbaWQsIHNjcmVlbl0pID0+IHRvTWlzc2luZ0Rpc3BsYXkoTnVtYmVyKGlkKSwgc2NyZWVuKSk7XG5cbiAgY29uc3QgYWxsID0gWy4uLmNvbm5lY3RlZCwgLi4ubWlzc2luZ107XG5cbiAgY29uc3QgcmVjb3Jkc0J5S2V5ID0gbmV3IE1hcChcbiAgICB3aW5kb3dzLm1hcCgocmVjb3JkKSA9PiBba2V5T2YocmVjb3JkKSwgcmVjb3JkXSksXG4gICk7XG5cbiAgLy8gQSB3aW5kb3cgdGhlIHBsYW4gaGFzIHRoYXQgaXMgbm90IG9wZW4gbm93LCBrZXB0IGFzIG1pc3Npbmcgd2hlcmUgdGhlIHBsYW4ga25vd3Mgd2hhdCBpdCB3YXMuXG4gIGNvbnN0IG1pc3NpbmdXaW5kb3dzID0gbmV3IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgeyBtaXNzaW5nOiB0cnVlOyBjbG9zZWQ/OiBXaW5kb3dJZCB9XG4gID4oKTtcblxuICBmb3IgKGNvbnN0IHdpbmRvdyBvZiBzdG9yZWQ/LndpbmRvd3MgPz8gW10pIHtcbiAgICBpZiAod2luZG93LnRpdGxlICE9PSB1bmRlZmluZWQgJiYgIXJlY29yZHNCeUtleS5oYXMod2luZG93LmtleSkpIHtcbiAgICAgIGNvbnN0IGNsb3NlZCA9IGNsb3NlZFdpbmRvd09mKHdpbmRvdyk7XG5cbiAgICAgIHJlY29yZHNCeUtleS5zZXQod2luZG93LmtleSwgdG9NaXNzaW5nV2luZG93KHdpbmRvdy5rZXksIHdpbmRvdy50aXRsZSkpO1xuICAgICAgbWlzc2luZ1dpbmRvd3Muc2V0KHdpbmRvdy5rZXksIHtcbiAgICAgICAgbWlzc2luZzogdHJ1ZSxcbiAgICAgICAgLi4uKGNsb3NlZCA/IHsgY2xvc2VkIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBuYW1lZCA9IHN0b3JlZD8ud2luZG93cy5maWx0ZXIoKGl0KSA9PiByZWNvcmRzQnlLZXkuaGFzKGl0LmtleSkpID8/IFtdO1xuXG4gIGxldCBieVNjcmVlbjogTWFwPERpc3BsYXlSZWNvcmQsIFBsYW5uZWRXaW5kb3dbXT47XG4gIGxldCB1bnRpbGVkOiBQbGFubmVkV2luZG93W107XG5cbiAgaWYgKG5hbWVkLmxlbmd0aCA9PT0gMCkge1xuICAgICh7IGJ5U2NyZWVuLCB1bnRpbGVkIH0gPSBzcHJlYWRCeURlZmF1bHQoXG4gICAgICB3aW5kb3dzLFxuICAgICAgZGlzcGxheXMsXG4gICAgICBvcHRpb25zLnRpbGVNaW5pbWl6ZWQgPz8gZmFsc2UsXG4gICAgKSk7XG4gIH0gZWxzZSB7XG4gICAgYnlTY3JlZW4gPSBuZXcgTWFwKGFsbC5tYXAoKGRpc3BsYXkpID0+IFtkaXNwbGF5LCBbXV0pKTtcbiAgICB1bnRpbGVkID0gW107XG5cbiAgICAvLyBXaW5kb3dzIHRoZSBwbGFuIGhhcyBubyBwbGFjZSBmb3Igbm93LCBieSB0aGUga2V5IHRoZSBwbGFuIGtub3dzIHRoZW0gYnkuXG4gICAgY29uc3QgdW5wbGFjZWQ6IHsgcmVhZG9ubHkga2V5OiBzdHJpbmc7IHJlYWRvbmx5IHJlY29yZDogV2luZG93UmVjb3JkIH1bXSA9XG4gICAgICBbXTtcblxuICAgIGZvciAoY29uc3Qgd2luZG93IG9mIG5hbWVkKSB7XG4gICAgICBjb25zdCByZWNvcmQgPSByZWNvcmRzQnlLZXkuZ2V0KHdpbmRvdy5rZXkpITtcbiAgICAgIGNvbnN0IHBsYW5uZWQgPSB7XG4gICAgICAgIGtleTogd2luZG93LmtleSxcbiAgICAgICAgcmVjb3JkLFxuICAgICAgICAuLi5taXNzaW5nV2luZG93cy5nZXQod2luZG93LmtleSksXG4gICAgICAgIGNvbHVtbjogd2luZG93LmNvbHVtbixcbiAgICAgICAgcm93OiB3aW5kb3cucm93LFxuICAgICAgICBjb2x1bW5zOiB3aW5kb3cuY29sdW1ucyxcbiAgICAgICAgcm93czogd2luZG93LnJvd3MsXG4gICAgICB9O1xuICAgICAgY29uc3QgZGlzcGxheSA9IGFsbC5maW5kKChpdCkgPT4gaXQuaWQgPT09IHdpbmRvdy5kaXNwbGF5SWQpO1xuXG4gICAgICBpZiAod2luZG93LmRpc3BsYXlJZCA9PT0gbnVsbCkge1xuICAgICAgICB1bnRpbGVkLnB1c2gocGxhbm5lZCk7XG4gICAgICB9IGVsc2UgaWYgKGRpc3BsYXkpIHtcbiAgICAgICAgYnlTY3JlZW4uZ2V0KGRpc3BsYXkpIS5wdXNoKHBsYW5uZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdW5wbGFjZWQucHVzaCh7IGtleTogd2luZG93LmtleSwgcmVjb3JkIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG5hbWVkS2V5cyA9IG5ldyBTZXQobmFtZWQubWFwKChpdCkgPT4gaXQua2V5KSk7XG5cbiAgICAvLyBBIHdpbmRvdyB0aGUgcGxhbiBkb2VzIG5vdCBuYW1lLCBhcyBvbmUgb3BlbmVkIHNpbmNlLCBpcyBub3QgdGlsZWQgdW50aWwgcHV0IG9uIGEgc2NyZWVuLlxuICAgIHVudGlsZWQucHVzaChcbiAgICAgIC4uLndpbmRvd3NcbiAgICAgICAgLmZpbHRlcigocmVjb3JkKSA9PiAhbmFtZWRLZXlzLmhhcyhrZXlPZihyZWNvcmQpKSlcbiAgICAgICAgLm1hcCgocmVjb3JkKSA9PiAoeyBrZXk6IGtleU9mKHJlY29yZCksIHJlY29yZCwgY29sdW1uczogMSwgcm93czogMSB9KSksXG4gICAgKTtcblxuICAgIGZvciAoY29uc3QgeyBrZXksIHJlY29yZCB9IG9mIHVucGxhY2VkKSB7XG4gICAgICBjb25zdCBtaXNzaW5nID0gbWlzc2luZ1dpbmRvd3MuaGFzKGtleSk7XG4gICAgICBjb25zdCBwbGFubmVkID0ge1xuICAgICAgICBrZXksXG4gICAgICAgIHJlY29yZCxcbiAgICAgICAgLi4ubWlzc2luZ1dpbmRvd3MuZ2V0KGtleSksXG4gICAgICAgIGNvbHVtbnM6IDEsXG4gICAgICAgIHJvd3M6IDEsXG4gICAgICB9O1xuXG4gICAgICAvLyBBIHdpbmRvdyBub3Qgb3BlbiwgaXRzIHNjcmVlbiBnb25lIHRvbywgaXMgbm90IHRpbGVkOyBub3IgaXMgb25lIG1pbmltaXplZC5cbiAgICAgIGlmIChtaXNzaW5nIHx8IHJlY29yZC5zdGF0ZS5nZXQoKSA9PT0gXCJtaW5pbWl6ZWRcIikge1xuICAgICAgICB1bnRpbGVkLnB1c2gocGxhbm5lZCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB1c2VkID0gZGlzcGxheXMuZmlsdGVyKFxuICAgICAgICAoZGlzcGxheSkgPT4gYnlTY3JlZW4uZ2V0KGRpc3BsYXkpIS5sZW5ndGggPiAwLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGNob2ljZXMgPSB1c2VkLmxlbmd0aCA+IDAgPyB1c2VkIDogZGlzcGxheXM7XG4gICAgICBjb25zdCBvd24gPSBjaG9pY2VzLmZpbmQoXG4gICAgICAgIChkaXNwbGF5KSA9PiBkaXNwbGF5LmlkID09PSByZWNvcmQuZGlzcGxheUlkLmdldCgpLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgZmV3ZXN0ID1cbiAgICAgICAgb3duID8/XG4gICAgICAgIFsuLi5jaG9pY2VzXS5zb3J0KFxuICAgICAgICAgIChhLCBiKSA9PlxuICAgICAgICAgICAgYnlTY3JlZW4uZ2V0KGEpIS5yZWR1Y2UoKHN1bSwgaXQpID0+IHN1bSArIGNlbGxzT2YoaXQpLCAwKSAtXG4gICAgICAgICAgICBieVNjcmVlbi5nZXQoYikhLnJlZHVjZSgoc3VtLCBpdCkgPT4gc3VtICsgY2VsbHNPZihpdCksIDApLFxuICAgICAgICApWzBdO1xuXG4gICAgICBpZiAoZmV3ZXN0KSB7XG4gICAgICAgIGJ5U2NyZWVuLmdldChmZXdlc3QpIS5wdXNoKHBsYW5uZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNjcmVlbnMgPSBhbGwubWFwKChkaXNwbGF5KTogUGxhbm5lZFNjcmVlbiA9PiB7XG4gICAgY29uc3Qgb25TY3JlZW4gPSBieVNjcmVlbi5nZXQoZGlzcGxheSkgPz8gW107XG4gICAgY29uc3Qgd2lkZXN0ID0gTWF0aC5tYXgoMSwgLi4ub25TY3JlZW4ubWFwKChpdCkgPT4gaXQuY29sdW1ucykpO1xuICAgIGNvbnN0IHN0b3JlZENvbHVtbnMgPSBzdG9yZWQ/LmNvbHVtbnNbU3RyaW5nKGRpc3BsYXkuaWQpXTtcblxuICAgIGNvbnN0IGNvbHVtbnMgPVxuICAgICAgc3RvcmVkQ29sdW1ucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gTWF0aC5tYXgoc3RvcmVkQ29sdW1ucywgMSlcbiAgICAgICAgOiBjbGFtcChcbiAgICAgICAgICAgIE1hdGgubWF4KFxuICAgICAgICAgICAgICBjb2x1bW5zRm9yKFxuICAgICAgICAgICAgICAgIG9uU2NyZWVuLnJlZHVjZSgoc3VtLCBpdCkgPT4gc3VtICsgY2VsbHNPZihpdCksIDApIHx8IDEsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHdpZGVzdCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICAxLFxuICAgICAgICAgICAgbWF4Q29sdW1ucyxcbiAgICAgICAgICApO1xuXG4gICAgY29uc3QgeyBwbGFjZWQsIHJvd3M6IG5lZWRlZFJvd3MgfSA9IHBsYWNlSW5HcmlkKG9uU2NyZWVuLCBjb2x1bW5zKTtcbiAgICBjb25zdCBzdG9yZWRSb3dzID0gc3RvcmVkPy5yb3dzPy5bU3RyaW5nKGRpc3BsYXkuaWQpXSA/PyAwO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3BsYXksXG4gICAgICBtaXNzaW5nOiBtaXNzaW5nLmluY2x1ZGVzKGRpc3BsYXkpLFxuICAgICAgY29sdW1ucyxcbiAgICAgIHJvd3M6IE1hdGgubWF4KG5lZWRlZFJvd3MsIHN0b3JlZFJvd3MsIDEpLFxuICAgICAgbmVlZGVkUm93cyxcbiAgICAgIHdpbmRvd3M6IHBsYWNlZCxcbiAgICB9O1xuICB9KTtcblxuICByZXR1cm4geyBzY3JlZW5zLCB1bnRpbGVkIH07XG59O1xuXG4vLyBUaGUgdGl0bGUgYSBtaXNzaW5nIHdpbmRvdyBpcyBrZXB0IHdpdGgsIHNvIHRoYXQgaXQgaXMgc2hvd24gYWdhaW4uXG4vLyBFdmVyeSB3aW5kb3cgaXMga2VwdCB3aXRoIGl0cyB0aXRsZSwgc28gdGhhdCBvbmUgY2xvc2VkIHNpbmNlIGlzIHNob3duIGFnYWluLCBhcyBtaXNzaW5nLlxuLy8gVGhlIHRpdGxlIG9mIHRoZSB3aW5kb3csIGFuZCBpdHMgaWQgd2hpbGUgb3BlbiwgYXMgYSBwbGFuIGVudHJ5IGtlZXBzIHRoZW07IGEgd2luZG93IGJlaW5nIG9wZW5lZFxuLy8gaW4gYSBjZWxsLCBzdGFuZGluZyBpbiBieSBhIGtleSBvZiBpdHMgb3duLCBoYXMgbm8gaWQgeWV0LlxuY29uc3QgdGl0bGVPZiA9ICh3aW5kb3c6IFBsYW5uZWRXaW5kb3cpID0+IHtcbiAgY29uc3QgaWQgPSB3aW5kb3cubWlzc2luZyA/IHdpbmRvdy5jbG9zZWQgOiB3aW5kb3cucmVjb3JkLndpbmRvdztcblxuICByZXR1cm4ge1xuICAgIHRpdGxlOiB3aW5kb3cucmVjb3JkLnRpdGxlLmdldCgpLFxuICAgIC4uLihpZCAmJiAhaXNBcHBsaWNhdGlvbldpbmRvdyhpZCkgPyB7IHdpbmRvdzogaWQgfSA6IHt9KSxcbiAgfTtcbn07XG5cbi8vIFRoZSBwbGFuJ3Mgd2luZG93cyBpbiBpdHMgb3JkZXIsIHRob3NlIHRpbGVkIGFuZCB0aGVuIHRob3NlIGxlZnQgYXMgdGhleSBhcmUsIGVhY2ggd2hlcmUgaXQgaXMuXG5leHBvcnQgY29uc3Qgd2luZG93c09mUGxhbiA9IChyZXNvbHZlZDogUmVzb2x2ZWRUaWxpbmdQbGFuKSA9PiBbXG4gIC4uLnJlc29sdmVkLnNjcmVlbnMuZmxhdE1hcCgoc2NyZWVuKSA9PlxuICAgIHNjcmVlbi53aW5kb3dzLm1hcCgoaXQpID0+ICh7XG4gICAgICBrZXk6IGl0LmtleSxcbiAgICAgIGRpc3BsYXlJZDogc2NyZWVuLmRpc3BsYXkuaWQgYXMgbnVtYmVyIHwgbnVsbCxcbiAgICAgIGNvbHVtbjogaXQuY29sdW1uIGFzIG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICAgIHJvdzogaXQucm93IGFzIG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICAgIGNvbHVtbnM6IGl0LmNvbHVtbnMsXG4gICAgICByb3dzOiBpdC5yb3dzLFxuICAgICAgLi4udGl0bGVPZihpdCksXG4gICAgfSkpLFxuICApLFxuICAuLi5yZXNvbHZlZC51bnRpbGVkLm1hcCgoaXQpID0+ICh7XG4gICAga2V5OiBpdC5rZXksXG4gICAgZGlzcGxheUlkOiBudWxsLFxuICAgIGNvbHVtbjogdW5kZWZpbmVkLFxuICAgIHJvdzogdW5kZWZpbmVkLFxuICAgIGNvbHVtbnM6IGl0LmNvbHVtbnMsXG4gICAgcm93czogaXQucm93cyxcbiAgICAuLi50aXRsZU9mKGl0KSxcbiAgfSkpLFxuXTtcblxuLy8gVGhlIHBsYW4gYXMgaXQgaXMgcmVzb2x2ZWQgbm93LCB0byBrZWVwOiBldmVyeSB3aW5kb3cgb3BlbiB3aGVyZSBpdCBzaG93cywgaW4gb3JkZXIsIGFuZCBldmVyeVxuLy8gc2NyZWVuJ3MgY29sdW1ucywgdGhlIHdpbmRvd3MgYW5kIHNjcmVlbnMgbm90IGhlcmUgbm93IGtlcHQgYXMgdGhleSB3ZXJlLlxuZXhwb3J0IGNvbnN0IHRvU3RvcmVkUGxhbiA9IChcbiAgcmVzb2x2ZWQ6IFJlc29sdmVkVGlsaW5nUGxhbixcbiAgcHJldmlvdXM6IFN0b3JlZFRpbGluZ1BsYW4gfCB1bmRlZmluZWQsXG4pOiBTdG9yZWRUaWxpbmdQbGFuID0+IHtcbiAgY29uc3Qgb3BlbiA9IHdpbmRvd3NPZlBsYW4ocmVzb2x2ZWQpO1xuXG4gIGNvbnN0IG9wZW5LZXlzID0gbmV3IFNldChvcGVuLm1hcCgoaXQpID0+IGl0LmtleSkpO1xuXG4gIHJldHVybiB7XG4gICAgd2luZG93czogW1xuICAgICAgLi4ub3BlbixcbiAgICAgIC4uLihwcmV2aW91cz8ud2luZG93cy5maWx0ZXIoKGl0KSA9PiAhb3BlbktleXMuaGFzKGl0LmtleSkpID8/IFtdKSxcbiAgICBdLFxuICAgIGNvbHVtbnM6IHtcbiAgICAgIC4uLnByZXZpb3VzPy5jb2x1bW5zLFxuICAgICAgLi4uT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICByZXNvbHZlZC5zY3JlZW5zLm1hcCgoc2NyZWVuKSA9PiBbXG4gICAgICAgICAgU3RyaW5nKHNjcmVlbi5kaXNwbGF5LmlkKSxcbiAgICAgICAgICBzY3JlZW4uY29sdW1ucyxcbiAgICAgICAgXSksXG4gICAgICApLFxuICAgIH0sXG4gICAgcm93czoge1xuICAgICAgLi4ucHJldmlvdXM/LnJvd3MsXG4gICAgICAuLi5PYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIHJlc29sdmVkLnNjcmVlbnMubWFwKChzY3JlZW4pID0+IFtcbiAgICAgICAgICBTdHJpbmcoc2NyZWVuLmRpc3BsYXkuaWQpLFxuICAgICAgICAgIHNjcmVlbi5yb3dzLFxuICAgICAgICBdKSxcbiAgICAgICksXG4gICAgfSxcbiAgICBzY3JlZW5zOiB7XG4gICAgICAuLi5wcmV2aW91cz8uc2NyZWVucyxcbiAgICAgIC4uLk9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgcmVzb2x2ZWQuc2NyZWVucy5tYXAoKHNjcmVlbikgPT4gW1xuICAgICAgICAgIFN0cmluZyhzY3JlZW4uZGlzcGxheS5pZCksXG4gICAgICAgICAgdG9TdG9yZWRTY3JlZW4oc2NyZWVuLmRpc3BsYXkpLFxuICAgICAgICBdKSxcbiAgICAgICksXG4gICAgfSxcbiAgfTtcbn07XG5cbi8vIFRoZSBwbGFuIHdpdGggZXZlcnkgc2NyZWVuJ3Mgd2luZG93cyBwbGFjZWQgYWdhaW4gaW4gaXRzIGdyaWQgYWZ0ZXIgYW4gZWRpdCwgdGhlIGdyaWQga2VlcGluZ1xuLy8gdGhlIHJvd3MgaXQgaGFkIHVubGVzcyB0aGUgd2luZG93cyBuZWVkIG1vcmUuXG5jb25zdCBwbGFjZWRBZ2FpbiA9IChyZXNvbHZlZDogUmVzb2x2ZWRUaWxpbmdQbGFuKTogUmVzb2x2ZWRUaWxpbmdQbGFuID0+ICh7XG4gIC4uLnJlc29sdmVkLFxuICBzY3JlZW5zOiByZXNvbHZlZC5zY3JlZW5zLm1hcCgoc2NyZWVuKSA9PiB7XG4gICAgY29uc3QgeyBwbGFjZWQsIHJvd3M6IG5lZWRlZFJvd3MgfSA9IHBsYWNlSW5HcmlkKFxuICAgICAgc2NyZWVuLndpbmRvd3MsXG4gICAgICBzY3JlZW4uY29sdW1ucyxcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnNjcmVlbixcbiAgICAgIHdpbmRvd3M6IHBsYWNlZCxcbiAgICAgIG5lZWRlZFJvd3MsXG4gICAgICByb3dzOiBNYXRoLm1heChuZWVkZWRSb3dzLCBzY3JlZW4ucm93cywgMSksXG4gICAgfTtcbiAgfSksXG59KTtcblxuLy8gV2hlcmUgb24gdGhlIHNjcmVlbnMgdGhlIHdpbmRvdyBnb2VzOiBvbiBhIHNjcmVlbiwgZnJvbSBhIGNlbGwsIG9yIHRoZSBmaXJzdCBmcmVlIG9uZSB3aGVuIG5vbmVcbi8vIGlzIGdpdmVuOyBvciBudWxsIHRvIGxlYXZlIGl0IGFzIGl0IGlzLlxuZXhwb3J0IHR5cGUgUGxhblRhcmdldCA9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgZGlzcGxheUlkOiBudW1iZXI7XG4gICAgICByZWFkb25seSBjb2x1bW4/OiBudW1iZXI7XG4gICAgICByZWFkb25seSByb3c/OiBudW1iZXI7XG4gICAgfVxuICB8IHsgcmVhZG9ubHkgZGlzcGxheUlkOiBudWxsIH07XG5cbi8vIEV2ZXJ5IHdpbmRvdyBvZiB0aGUgc2NyZWVuIGxlZnQgb3V0IG9mIHRpbGluZzsgdGhlIG90aGVyIHNjcmVlbnMnIHdpbmRvd3Mgc3RheSB3aGVyZSB0aGV5IGFyZS5cbmV4cG9ydCBjb25zdCB1bnRpbGVTY3JlZW5JblBsYW4gPSAoXG4gIHJlc29sdmVkOiBSZXNvbHZlZFRpbGluZ1BsYW4sXG4gIGRpc3BsYXlJZDogbnVtYmVyLFxuKTogUmVzb2x2ZWRUaWxpbmdQbGFuID0+XG4gIChcbiAgICByZXNvbHZlZC5zY3JlZW5zLmZpbmQoKHNjcmVlbikgPT4gc2NyZWVuLmRpc3BsYXkuaWQgPT09IGRpc3BsYXlJZClcbiAgICAgID8ud2luZG93cyA/PyBbXVxuICApLnJlZHVjZShcbiAgICAocGxhbiwgd2luZG93KSA9PiBtb3ZlSW5QbGFuKHBsYW4sIHdpbmRvdy5rZXksIHsgZGlzcGxheUlkOiBudWxsIH0pLFxuICAgIHJlc29sdmVkLFxuICApO1xuXG4vLyBNb3ZlcyB0aGUgd2luZG93IHdoZXJlIGFza2VkLCB0YWtpbmcgdGhlIGNlbGwgZnJvbSB0aGUgd2luZG93cyB0aGVyZSwgd2hpY2ggZ28gdG8gdGhlIGZpcnN0IGZyZWVcbi8vIGNlbGxzOyB0aGUgb3RoZXIgd2luZG93cyBzdGF5IHdoZXJlIHRoZXkgYXJlLlxuZXhwb3J0IGNvbnN0IG1vdmVJblBsYW4gPSAoXG4gIHJlc29sdmVkOiBSZXNvbHZlZFRpbGluZ1BsYW4sXG4gIGtleTogc3RyaW5nLFxuICB0YXJnZXQ6IFBsYW5UYXJnZXQsXG4pOiBSZXNvbHZlZFRpbGluZ1BsYW4gPT4ge1xuICBjb25zdCBtb3ZpbmcgPSBbXG4gICAgLi4ucmVzb2x2ZWQuc2NyZWVucy5mbGF0TWFwKChpdCkgPT4gaXQud2luZG93cyksXG4gICAgLi4ucmVzb2x2ZWQudW50aWxlZCxcbiAgXS5maW5kKChpdCkgPT4gaXQua2V5ID09PSBrZXkpO1xuXG4gIGlmICghbW92aW5nKSB7XG4gICAgcmV0dXJuIHJlc29sdmVkO1xuICB9XG5cbiAgY29uc3Qgd2l0aG91dCA9IDxUIGV4dGVuZHMgUGxhbm5lZFdpbmRvdz4od2luZG93czogcmVhZG9ubHkgVFtdKSA9PlxuICAgIHdpbmRvd3MuZmlsdGVyKChpdCkgPT4gaXQua2V5ICE9PSBrZXkpO1xuICBjb25zdCB7IGNvbHVtbjogX2NvbHVtbiwgcm93OiBfcm93LCAuLi51bnBsYWNlZCB9ID0gbW92aW5nIGFzIFBsYWNlZFdpbmRvdztcblxuICByZXR1cm4gcGxhY2VkQWdhaW4oe1xuICAgIHNjcmVlbnM6IHJlc29sdmVkLnNjcmVlbnMubWFwKChzY3JlZW4pID0+IHtcbiAgICAgIGNvbnN0IG90aGVycyA9IHdpdGhvdXQoc2NyZWVuLndpbmRvd3MpO1xuXG4gICAgICBpZiAodGFyZ2V0LmRpc3BsYXlJZCAhPT0gc2NyZWVuLmRpc3BsYXkuaWQpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uc2NyZWVuLCB3aW5kb3dzOiBvdGhlcnMgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhcmdldC5jb2x1bW4gPT09IHVuZGVmaW5lZCB8fCB0YXJnZXQucm93ID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB7IC4uLnNjcmVlbiwgd2luZG93czogWy4uLm90aGVycywgdW5wbGFjZWQgYXMgUGxhY2VkV2luZG93XSB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgLi4uc2NyZWVuLFxuICAgICAgICAgICAgd2luZG93czogW1xuICAgICAgICAgICAgICB7IC4uLnVucGxhY2VkLCBjb2x1bW46IHRhcmdldC5jb2x1bW4sIHJvdzogdGFyZ2V0LnJvdyB9LFxuICAgICAgICAgICAgICAuLi5vdGhlcnMsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH07XG4gICAgfSksXG4gICAgdW50aWxlZDpcbiAgICAgIHRhcmdldC5kaXNwbGF5SWQgPT09IG51bGxcbiAgICAgICAgPyBbLi4ud2l0aG91dChyZXNvbHZlZC51bnRpbGVkKSwgdW5wbGFjZWRdXG4gICAgICAgIDogd2l0aG91dChyZXNvbHZlZC51bnRpbGVkKSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVzaXplSW5QbGFuID0gKFxuICByZXNvbHZlZDogUmVzb2x2ZWRUaWxpbmdQbGFuLFxuICBrZXk6IHN0cmluZyxcbiAgY29sdW1uczogbnVtYmVyLFxuICByb3dzOiBudW1iZXIsXG4pOiBSZXNvbHZlZFRpbGluZ1BsYW4gPT5cbiAgcGxhY2VkQWdhaW4oe1xuICAgIC4uLnJlc29sdmVkLFxuICAgIHNjcmVlbnM6IHJlc29sdmVkLnNjcmVlbnMubWFwKChzY3JlZW4pID0+IHtcbiAgICAgIGNvbnN0IHJlc2l6ZWQgPSBzY3JlZW4ud2luZG93cy5maW5kKChpdCkgPT4gaXQua2V5ID09PSBrZXkpO1xuXG4gICAgICAvLyBGaXJzdCwgc28gaXQga2VlcHMgaXRzIGNlbGwgYW5kIHRha2VzIHRoZSBjZWxscyBpdCBncm93cyBvdmVyIGZyb20gdGhlIHdpbmRvd3MgdGhlcmUuXG4gICAgICByZXR1cm4gcmVzaXplZFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLnNjcmVlbixcbiAgICAgICAgICAgIHdpbmRvd3M6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC4uLnJlc2l6ZWQsXG4gICAgICAgICAgICAgICAgY29sdW1uczogY2xhbXAoY29sdW1ucywgMSwgc2NyZWVuLmNvbHVtbnMpLFxuICAgICAgICAgICAgICAgIHJvd3M6IGNsYW1wKHJvd3MsIDEsIE1hdGgubWF4KG1heFJvd3MsIHNjcmVlbi5yb3dzKSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIC4uLnNjcmVlbi53aW5kb3dzLmZpbHRlcigoaXQpID0+IGl0ICE9PSByZXNpemVkKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfVxuICAgICAgICA6IHNjcmVlbjtcbiAgICB9KSxcbiAgfSk7XG5cbmV4cG9ydCBjb25zdCBzZXRDb2x1bW5zSW5QbGFuID0gKFxuICByZXNvbHZlZDogUmVzb2x2ZWRUaWxpbmdQbGFuLFxuICBkaXNwbGF5SWQ6IG51bWJlcixcbiAgY29sdW1uczogbnVtYmVyLFxuKTogUmVzb2x2ZWRUaWxpbmdQbGFuID0+XG4gIHBsYWNlZEFnYWluKHtcbiAgICAuLi5yZXNvbHZlZCxcbiAgICBzY3JlZW5zOiByZXNvbHZlZC5zY3JlZW5zLm1hcCgoc2NyZWVuKSA9PlxuICAgICAgc2NyZWVuLmRpc3BsYXkuaWQgPT09IGRpc3BsYXlJZFxuICAgICAgICA/IHsgLi4uc2NyZWVuLCBjb2x1bW5zOiBNYXRoLm1heChjb2x1bW5zLCAxKSB9XG4gICAgICAgIDogc2NyZWVuLFxuICAgICksXG4gIH0pO1xuXG5leHBvcnQgY29uc3Qgc2V0Um93c0luUGxhbiA9IChcbiAgcmVzb2x2ZWQ6IFJlc29sdmVkVGlsaW5nUGxhbixcbiAgZGlzcGxheUlkOiBudW1iZXIsXG4gIHJvd3M6IG51bWJlcixcbik6IFJlc29sdmVkVGlsaW5nUGxhbiA9PlxuICBwbGFjZWRBZ2Fpbih7XG4gICAgLi4ucmVzb2x2ZWQsXG4gICAgc2NyZWVuczogcmVzb2x2ZWQuc2NyZWVucy5tYXAoKHNjcmVlbikgPT5cbiAgICAgIHNjcmVlbi5kaXNwbGF5LmlkID09PSBkaXNwbGF5SWRcbiAgICAgICAgPyB7IC4uLnNjcmVlbiwgcm93czogTWF0aC5tYXgocm93cywgMSkgfVxuICAgICAgICA6IHNjcmVlbixcbiAgICApLFxuICB9KTtcblxuLy8gV2hlcmUgaW4gYSBzY3JlZW4ncyBncmlkLCBhdCBpdHMgcGxhY2Ugb24gdGhlIHBhZ2UsIGEgd2luZG93IGRyYWdnZWQgdG8gdGhlIHBvaW50IGdvZXM6IHRoZSBjZWxsXG4vLyB1bmRlciB0aGUgcG9pbnQgaXMgdGhlIG9uZSBvZiB0aGUgd2luZG93IHRoYXQgd2FzIGdyYWJiZWQsIHNvIHRoZSB3aW5kb3cga2VlcHMgdW5kZXIgdGhlIHBvaW50ZXJcbi8vIHdoZXJlIGl0IHdhcyBncmFiYmVkLlxuZXhwb3J0IGNvbnN0IHRhcmdldEluR3JpZCA9IChcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4gIGdyaWQ6IHsgbGVmdDogbnVtYmVyOyB0b3A6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSxcbiAgc2NyZWVuOiBQbGFubmVkU2NyZWVuLFxuICBncmFiYmVkOiB7IHJlYWRvbmx5IGNvbHVtbjogbnVtYmVyOyByZWFkb25seSByb3c6IG51bWJlciB9LFxuKTogUGxhblRhcmdldCA9PiB7XG4gIGNvbnN0IHJvd3MgPSBNYXRoLm1heChzY3JlZW4ucm93cywgMSk7XG4gIGNvbnN0IGNvbHVtbiA9XG4gICAgTWF0aC5mbG9vcigoKHggLSBncmlkLmxlZnQpIC8gZ3JpZC53aWR0aCkgKiBzY3JlZW4uY29sdW1ucykgLVxuICAgIGdyYWJiZWQuY29sdW1uO1xuICBjb25zdCByb3cgPSBNYXRoLmZsb29yKCgoeSAtIGdyaWQudG9wKSAvIGdyaWQuaGVpZ2h0KSAqIHJvd3MpIC0gZ3JhYmJlZC5yb3c7XG5cbiAgcmV0dXJuIHtcbiAgICBkaXNwbGF5SWQ6IHNjcmVlbi5kaXNwbGF5LmlkLFxuICAgIGNvbHVtbjogTWF0aC5tYXgoMCwgTWF0aC5taW4oY29sdW1uLCBzY3JlZW4uY29sdW1ucyAtIDEpKSxcbiAgICByb3c6IE1hdGgubWF4KDAsIE1hdGgubWluKHJvdywgcm93cyAtIDEpKSxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCB0b1N0b3JlZFNjcmVlbiA9IChkaXNwbGF5OiBEaXNwbGF5UmVjb3JkKTogU3RvcmVkUGxhblNjcmVlbiA9PiAoe1xuICBsYWJlbDogZGlzcGxheS5sYWJlbC5nZXQoKSxcbiAgaXNQcmltYXJ5OiBkaXNwbGF5LmlzUHJpbWFyeS5nZXQoKSxcbiAgYm91bmRzOiB7IC4uLmRpc3BsYXkuYm91bmRzLmdldCgpIH0sXG4gIHdvcmtBcmVhOiB7IC4uLmRpc3BsYXkud29ya0FyZWEuZ2V0KCkgfSxcbn0pO1xuXG4vLyBBIHdpbmRvdyBub3Qgb3BlbiwgYXMgdGhlIHBsYW4gaGFzIGl0LCBzdGFuZGluZyBpbiBmb3Igb25lIGluIHRoZSBwbGFuLlxuY29uc3QgdG9NaXNzaW5nV2luZG93ID0gKGtleTogc3RyaW5nLCB0aXRsZTogc3RyaW5nKSA9PlxuICAoe1xuICAgIHdpbmRvdzogeyBraW5kOiBcIm1pc3NpbmdcIiwgaWQ6IGtleSB9LFxuICAgIHRpdGxlOiB7IGdldDogKCkgPT4gdGl0bGUgfSxcbiAgICBzdGF0ZTogeyBnZXQ6ICgpID0+IFwibm9ybWFsXCIgfSxcbiAgICBkaXNwbGF5SWQ6IHsgZ2V0OiAoKSA9PiAtMSB9LFxuICAgIGlzRm9jdXNlZDogeyBnZXQ6ICgpID0+IGZhbHNlIH0sXG4gICAgZGVzY3JpYmVSZW9wZW5pbmc6IGFzeW5jICgpID0+IHVuZGVmaW5lZCxcbiAgfSkgYXMgdW5rbm93biBhcyBXaW5kb3dSZWNvcmQ7XG5cbi8vIEEgc2NyZWVuIG5vdCBjb25uZWN0ZWQsIGFzIHRoZSBwbGFuIGhhcyBpdCwgc3RhbmRpbmcgaW4gZm9yIG9uZSBpbiB0aGUgcGxhbjsgbmV2ZXIgcHJpbWFyeSwgYXNcbi8vIGFub3RoZXIgc2NyZWVuIGlzIHByaW1hcnkgbm93LlxuY29uc3QgdG9NaXNzaW5nRGlzcGxheSA9IChpZDogbnVtYmVyLCBzY3JlZW46IFN0b3JlZFBsYW5TY3JlZW4pID0+XG4gICh7XG4gICAgaWQsXG4gICAgbGFiZWw6IHsgZ2V0OiAoKSA9PiBzY3JlZW4ubGFiZWwgfSxcbiAgICBpc1ByaW1hcnk6IHsgZ2V0OiAoKSA9PiBmYWxzZSB9LFxuICAgIGJvdW5kczogeyBnZXQ6ICgpID0+IHNjcmVlbi5ib3VuZHMgfSxcbiAgICB3b3JrQXJlYTogeyBnZXQ6ICgpID0+IHNjcmVlbi53b3JrQXJlYSB9LFxuICAgIHNjYWxlRmFjdG9yOiB7IGdldDogKCkgPT4gMSB9LFxuICAgIHJvdGF0aW9uOiB7IGdldDogKCkgPT4gMCB9LFxuICB9KSBhcyB1bmtub3duIGFzIERpc3BsYXlSZWNvcmQ7XG5cbi8vIEV2ZXJ5IHdpbmRvdyBsZWZ0IGFzIGl0IGlzLCBhcyBhIG5ldyBsYXlvdXQgc3RhcnRzIG91dC5cbmV4cG9ydCBjb25zdCBhbGxMZWZ0QXNUaGV5QXJlID0gKFxuICB3aW5kb3dzOiByZWFkb25seSBXaW5kb3dSZWNvcmRbXSxcbik6IFN0b3JlZFRpbGluZ1BsYW4gPT4gKHtcbiAgd2luZG93czogd2luZG93cy5tYXAoKHJlY29yZCkgPT4gKHtcbiAgICBrZXk6IGtleU9mV2luZG93KHJlY29yZC53aW5kb3cpLFxuICAgIHRpdGxlOiByZWNvcmQudGl0bGUuZ2V0KCksXG4gICAgLi4uKGlzQXBwbGljYXRpb25XaW5kb3cocmVjb3JkLndpbmRvdykgPyB7fSA6IHsgd2luZG93OiByZWNvcmQud2luZG93IH0pLFxuICAgIGRpc3BsYXlJZDogbnVsbCxcbiAgICBjb2x1bW5zOiAxLFxuICAgIHJvd3M6IDEsXG4gIH0pKSxcbiAgY29sdW1uczoge30sXG4gIHJvd3M6IHt9LFxuICBzY3JlZW5zOiB7fSxcbn0pO1xuXG4vLyBUaGUgd2luZG93cyBub3QgdGlsZWQsIHRob3NlIG9wZW4sIGVhY2ggcGxhY2VkIG9uIHRoZSBjb25uZWN0ZWQgc2NyZWVuIHdpdGggdGhlIGZld2VzdCBjZWxsc1xuLy8gdGFrZW4sIGluIHRoZSBmaXJzdCBmcmVlIGNlbGw7IHRoZSB3aW5kb3dzIHRpbGVkIHN0YXkgd2hlcmUgdGhleSBhcmUuXG5leHBvcnQgY29uc3QgdGlsZVVudGlsZWQgPSAoXG4gIHJlc29sdmVkOiBSZXNvbHZlZFRpbGluZ1BsYW4sXG4pOiBSZXNvbHZlZFRpbGluZ1BsYW4gPT4ge1xuICBsZXQgcGxhbiA9IHJlc29sdmVkO1xuXG4gIGZvciAoY29uc3Qgd2luZG93IG9mIHJlc29sdmVkLnVudGlsZWQuZmlsdGVyKChpdCkgPT4gIWl0Lm1pc3NpbmcpKSB7XG4gICAgY29uc3QgY2VsbHNUYWtlbiA9IChzY3JlZW46IFBsYW5uZWRTY3JlZW4pID0+XG4gICAgICBzY3JlZW4ud2luZG93cy5yZWR1Y2UoKHN1bSwgaXQpID0+IHN1bSArIGNlbGxzT2YoaXQpLCAwKTtcbiAgICBjb25zdCBmZXdlc3QgPSBwbGFuLnNjcmVlbnNcbiAgICAgIC5maWx0ZXIoKHNjcmVlbikgPT4gIXNjcmVlbi5taXNzaW5nKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGNlbGxzVGFrZW4oYSkgLSBjZWxsc1Rha2VuKGIpKVswXTtcblxuICAgIGlmIChmZXdlc3QpIHtcbiAgICAgIHBsYW4gPSBtb3ZlSW5QbGFuKHBsYW4sIHdpbmRvdy5rZXksIHsgZGlzcGxheUlkOiBmZXdlc3QuZGlzcGxheS5pZCB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGxhbjtcbn07XG4iLCAiLy8gQXMgbmVhciBzcXVhcmUgYSBncmlkIGFzIGZpdHMgdGhlIGNvdW50LCBidXQgYSBjb2x1bW4gbW9yZSBhbmQgYSByb3cgZmV3ZXIgd2hlbiB0aGF0IHN0aWxsIGZpdHMsXG4vLyB3aGljaCBsZWF2ZXMgZmV3ZXIgY2VsbHMgZW1wdHkgb24gYSBzY3JlZW4gd2lkZXIgdGhhbiB0YWxsLlxuZXhwb3J0IGNvbnN0IGNvbHVtbnNGb3IgPSAoY291bnQ6IG51bWJlcikgPT4ge1xuICBjb25zdCBjb2x1bW5zID0gTWF0aC5jZWlsKE1hdGguc3FydChjb3VudCkpO1xuICBjb25zdCByb3dzID0gTWF0aC5jZWlsKGNvdW50IC8gY29sdW1ucyk7XG5cbiAgcmV0dXJuIHJvd3MgPiAxICYmIChjb2x1bW5zICsgMSkgKiAocm93cyAtIDEpID49IGNvdW50XG4gICAgPyBjb2x1bW5zICsgMVxuICAgIDogY29sdW1ucztcbn07XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0YWJsZTIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgZ2V0UGVyc2lzdGFibGVWYWx1ZUluamVjdGFibGVCdW5jaCB9IGZyb20gXCJAazhzbGVucy9wZXJzaXN0YWJsZS1jb250cmFjdHNcIjtcbmltcG9ydCB7XG4gIGRpc3BsYXlSZWNvcmRzUmVhY3RpdmVJbmplY3Rpb25Ub2tlbixcbiAgd2luZG93UmVjb3Jkc1JlYWN0aXZlSW5qZWN0aW9uVG9rZW4sXG59IGZyb20gXCJAazhzbGVucy93aW5kb3ctbGF5b3V0LWNvbnRyYWN0c1wiO1xuaW1wb3J0IHtcbiAgY29tcHV0ZWQsXG4gIG9ic2VydmFibGUsXG4gIHJ1bkluQWN0aW9uLFxuICB0eXBlIElDb21wdXRlZFZhbHVlLFxuICB0eXBlIElPYnNlcnZhYmxlVmFsdWUsXG59IGZyb20gXCJtb2J4XCI7XG5pbXBvcnQgdHlwZSB7IFdpbmRvd0lkIH0gZnJvbSBcIkBrOHNsZW5zL21lc3NhZ2luZy1jb250cmFjdHNcIjtcbmltcG9ydCB7XG4gIGFsbExlZnRBc1RoZXlBcmUsXG4gIGtleU9mV2luZG93LFxuICBvcGVuaW5nUHJlZml4LFxuICByZXNvbHZlVGlsaW5nUGxhbixcbiAgdGlsZVVudGlsZWQsXG4gIHRvU3RvcmVkUGxhbixcbiAgdHlwZSBSZXNvbHZlZFRpbGluZ1BsYW4sXG4gIHR5cGUgU3RvcmVkVGlsaW5nUGxhbixcbn0gZnJvbSBcIi4vdGlsaW5nLXBsYW5cIjtcblxuLy8gVGhlIHRpbGluZyB0aGUgdXNlciBhcnJhbmdlZCwgb3IgbnVsbCBmb3Igbm9uZSwgd2hpY2ggdGlsZXMgYXMgaXQgYWx3YXlzIGRpZC5cbmV4cG9ydCBjb25zdCBzdG9yZWRUaWxpbmdQbGFuQnVuY2ggPVxuICBnZXRQZXJzaXN0YWJsZVZhbHVlSW5qZWN0YWJsZUJ1bmNoPFN0b3JlZFRpbGluZ1BsYW4gfCBudWxsPigpKHtcbiAgICAvLyBPZiBpdHMgc2Vjb25kIHZlcnNpb24sIGFzIHRoZSBsYXlvdXRzIGFyZTogdGhlIHBsYW4ga2VwdCBiZWZvcmUgaXMgbGVmdCBiZWhpbmQuXG4gICAgaWQ6IFwidGlsaW5nLXBsYW4tMlwiLFxuICAgIGRlZmF1bHRWYWx1ZTogeyBpbnN0YW50aWF0ZTogKCkgPT4gYXN5bmMgKCkgPT4gbnVsbCB9LFxuICB9KTtcblxuLy8gVGhlIHRpbGluZyBwbGFuIGZvciB0aGUgd2luZG93cyBvcGVuIGFuZCB0aGUgc2NyZWVucyBjb25uZWN0ZWQsIGtlcHQgY3VycmVudCBhcyB0aGV5IGNoYW5nZSwgYW5kXG4vLyBrZWVwaW5nIHRoZSBlZGl0cyB0aGUgdGlsaW5nIGVkaXRvciBtYWtlcyB0byBpdC5cbmV4cG9ydCBjb25zdCB0aWxpbmdQbGFuSW5qZWN0YWJsZSA9IGdldEluamVjdGFibGUyKHtcbiAgaWQ6IFwid2luZG93LW1hbmFnZXIudGlsaW5nLXBsYW5cIixcbiAgY29uc3VtcHRpb25zOiBbXG4gICAgd2luZG93UmVjb3Jkc1JlYWN0aXZlSW5qZWN0aW9uVG9rZW4sXG4gICAgZGlzcGxheVJlY29yZHNSZWFjdGl2ZUluamVjdGlvblRva2VuLFxuICBdLFxuXG4gIGluc3RhbnRpYXRlOiAoZGkpID0+IHtcbiAgICBjb25zdCB3aW5kb3dzID0gZGkuaW5qZWN0KHdpbmRvd1JlY29yZHNSZWFjdGl2ZUluamVjdGlvblRva2VuKSgpO1xuICAgIGNvbnN0IGRpc3BsYXlzID0gZGkuaW5qZWN0KGRpc3BsYXlSZWNvcmRzUmVhY3RpdmVJbmplY3Rpb25Ub2tlbikoKTtcbiAgICBjb25zdCBnZXRTdG9yZWQgPSBkaS5pbmplY3Qoc3RvcmVkVGlsaW5nUGxhbkJ1bmNoLnBlcnNpc3RhYmxlKTtcbiAgICBjb25zdCBzdG9yZWQgPSBvYnNlcnZhYmxlLmJveDxcbiAgICAgIElPYnNlcnZhYmxlVmFsdWU8U3RvcmVkVGlsaW5nUGxhbiB8IG51bGw+IHwgdW5kZWZpbmVkXG4gICAgPih1bmRlZmluZWQsIHsgZGVlcDogZmFsc2UgfSk7XG5cbiAgICB2b2lkIGdldFN0b3JlZCgpLnRoZW4oKHBsYW4pID0+IHtcbiAgICAgIC8vIEEgd2luZG93IGJlaW5nIG9wZW5lZCBpbiBhIGNlbGwgd2hlbiB0aGUgZXh0ZW5zaW9uIHdhcyBsYXN0IGxvYWRlZCBpcyBubyBsb25nZXIgYXdhaXRlZDpcbiAgICAgIC8vIGl0cyB0aWxlLCB3aGljaCB3b3VsZCBzdGF5IG5vdCBvcGVuIHdpdGggbm8gd2F5IHRvIG9wZW4gaXQsIGdvZXMuXG4gICAgICBjb25zdCBrZXB0ID0gcGxhbi5nZXQoKTtcblxuICAgICAgaWYgKGtlcHQ/LndpbmRvd3Muc29tZSgoaXQpID0+IGl0LmtleS5zdGFydHNXaXRoKG9wZW5pbmdQcmVmaXgpKSkge1xuICAgICAgICBydW5JbkFjdGlvbigoKSA9PlxuICAgICAgICAgIHBsYW4uc2V0KHtcbiAgICAgICAgICAgIC4uLmtlcHQsXG4gICAgICAgICAgICB3aW5kb3dzOiBrZXB0LndpbmRvd3MuZmlsdGVyKFxuICAgICAgICAgICAgICAoaXQpID0+ICFpdC5rZXkuc3RhcnRzV2l0aChvcGVuaW5nUHJlZml4KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHN0b3JlZC5zZXQocGxhbikpO1xuICAgIH0pO1xuXG4gICAgLy8gV2luZG93cyBnb2luZyBieSBhbm90aGVyIHdpbmRvdydzIGtleSBpbiB0aGUgcGxhbiwgYnkgdGhlaXIgb3duIGtleSwgYXMgd29ya2VkIG91dCBlbHNld2hlcmU6XG4gICAgLy8gb25lIGJlaW5nIG9wZW5lZCBhZ2FpbiBnb2VzIGJ5IHRoZSBrZXkgb2YgdGhlIHdpbmRvdyBub3Qgb3BlbiBpdCBpcy5cbiAgICBjb25zdCBhbGlhc2VzT2YgPSBvYnNlcnZhYmxlLmJveDxcbiAgICAgIElDb21wdXRlZFZhbHVlPFJlYWRvbmx5TWFwPHN0cmluZywgc3RyaW5nPj4gfCB1bmRlZmluZWRcbiAgICA+KHVuZGVmaW5lZCwge1xuICAgICAgZGVlcDogZmFsc2UsXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXNvbHZlZCA9IGNvbXB1dGVkKCgpID0+XG4gICAgICByZXNvbHZlVGlsaW5nUGxhbihcbiAgICAgICAgd2luZG93cy5nZXQoKSxcbiAgICAgICAgZGlzcGxheXMuZ2V0KCksXG4gICAgICAgIHN0b3JlZC5nZXQoKT8uZ2V0KCkgPz8gdW5kZWZpbmVkLFxuICAgICAgICB7XG4gICAgICAgICAgYWxpYXNlczogYWxpYXNlc09mLmdldCgpPy5nZXQoKSxcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIGNvbnN0IGtlZXAgPSAocGxhbjogU3RvcmVkVGlsaW5nUGxhbikgPT4ge1xuICAgICAgY29uc3Qga2VwdCA9IHN0b3JlZC5nZXQoKTtcblxuICAgICAgaWYgKGtlcHQpIHtcbiAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ga2VwdC5zZXQocGxhbikpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gKCkgPT4gKHtcbiAgICAgIHJlc29sdmVkLFxuICAgICAgLy8gS2VlcHMgYSBwbGFuIG1hZGUgZnJvbSB0aGUgcmVzb2x2ZWQgb25lIGJ5IGFuIGVkaXQsIGFzIHRoZSBlZGl0b3IncyBwcmV2aWV3IG9mIGEgZHJhZy5cbiAgICAgIGNvbW1pdDogKHBsYW46IFJlc29sdmVkVGlsaW5nUGxhbikgPT4ge1xuICAgICAgICBjb25zdCBrZXB0ID0gc3RvcmVkLmdldCgpO1xuXG4gICAgICAgIGlmIChrZXB0KSB7XG4gICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT5cbiAgICAgICAgICAgIGtlcHQuc2V0KHRvU3RvcmVkUGxhbihwbGFuLCBrZXB0LmdldCgpID8/IHVuZGVmaW5lZCkpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBQbGFjZXMgdGhlIHdpbmRvd3Mgbm90IHRpbGVkLCB0aG9zZSBvcGVuLCBvbiB0aGUgc2NyZWVucywgaW4gdGhlIGZpcnN0IGZyZWUgY2VsbHM7IHRoZVxuICAgICAgLy8gd2luZG93cyB0aWxlZCBzdGF5IHdoZXJlIHRoZXkgYXJlLlxuICAgICAgYXV0b1RpbGU6ICgpID0+XG4gICAgICAgIGtlZXAoXG4gICAgICAgICAgdG9TdG9yZWRQbGFuKFxuICAgICAgICAgICAgdGlsZVVudGlsZWQocmVzb2x2ZWQuZ2V0KCkpLFxuICAgICAgICAgICAgc3RvcmVkLmdldCgpPy5nZXQoKSA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgIC8vIExlYXZlcyBldmVyeSB3aW5kb3cgYXMgaXQgaXMsIGFzIGEgbmV3IGxheW91dCBzdGFydHMgb3V0LlxuICAgICAgbGVhdmVBbGxBc1RoZXlBcmU6ICgpID0+IGtlZXAoYWxsTGVmdEFzVGhleUFyZSh3aW5kb3dzLmdldCgpKSksXG4gICAgICAvLyBIYXMgd2luZG93cyBnbyBieSBvdGhlciB3aW5kb3dzJyBrZXlzIGluIHRoZSBwbGFuLCBhcyB0aGUgYWxpYXNlcyBnaXZlbiBoYXZlIHRoZW0uXG4gICAgICBmb2xsb3dBbGlhc2VzOiAoYWxpYXNlczogSUNvbXB1dGVkVmFsdWU8UmVhZG9ubHlNYXA8c3RyaW5nLCBzdHJpbmc+PikgPT5cbiAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4gYWxpYXNlc09mLnNldChhbGlhc2VzKSksXG4gICAgICAvLyBIYXMgdGhlIHBsYW4ncyB3aW5kb3cgZ28gYnkgdGhlIGtleSBvZiB0aGUgd2luZG93IGdpdmVuLCBhbmQga2VlcCBpdHMgaWQsIGFzIGEgd2luZG93IG5vdFxuICAgICAgLy8gb3BlbiBkb2VzIG9uY2Ugb3BlbmVkIGFnYWluLCBhcyB0aGUgd2luZG93IExlbnMgYW5zd2VyZWQgd2l0aDsgYSB3aW5kb3cgdW5kZXIgdGhhdCBrZXlcbiAgICAgIC8vIGFscmVhZHkgZ2l2ZXMgaXRzIHBsYWNlIHVwLlxuICAgICAgcmVrZXk6IChmcm9tOiBzdHJpbmcsIHdpbmRvdzogV2luZG93SWQpID0+IHtcbiAgICAgICAgY29uc3QgcGxhbiA9IHN0b3JlZC5nZXQoKT8uZ2V0KCk7XG4gICAgICAgIGNvbnN0IHRvID0ga2V5T2ZXaW5kb3cod2luZG93KTtcblxuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIG9uY2UgdGhlIHBsYW4gaGFzIHRoZSB3aW5kb3cgYnkgaXRzIG93biBrZXkgYWxyZWFkeSwgYXMgYWZ0ZXIgYSByZWNhbGwuXG4gICAgICAgIGlmIChwbGFuICYmIGZyb20gIT09IHRvICYmIHBsYW4ud2luZG93cy5zb21lKChpdCkgPT4gaXQua2V5ID09PSBmcm9tKSkge1xuICAgICAgICAgIGtlZXAoe1xuICAgICAgICAgICAgLi4ucGxhbixcbiAgICAgICAgICAgIHdpbmRvd3M6IHBsYW4ud2luZG93c1xuICAgICAgICAgICAgICAuZmlsdGVyKChpdCkgPT4gaXQua2V5ICE9PSB0bylcbiAgICAgICAgICAgICAgLm1hcCgoaXQpID0+IChpdC5rZXkgPT09IGZyb20gPyB7IC4uLml0LCBrZXk6IHRvLCB3aW5kb3cgfSA6IGl0KSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBQdXRzIGEgd2luZG93IGJlaW5nIG9wZW5lZCwgbm90IHNob3duIHlldCwgaW4gdGhlIGNlbGwsIGJ5IGEga2V5IG9mIGl0cyBvd24gdW50aWwgaXQgc2hvd3MsXG4gICAgICAvLyBhcyBhIHdpbmRvdyBub3Qgb3BlbiBpczogaXRzIHRpbGUgaXMgdGhlcmUgZnJvbSB0aGUgc3RhcnQuXG4gICAgICBwbGFjZU9wZW5pbmc6IChcbiAgICAgICAga2V5OiBzdHJpbmcsXG4gICAgICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgICAgIGNlbGw6IHsgZGlzcGxheUlkOiBudW1iZXI7IGNvbHVtbjogbnVtYmVyOyByb3c6IG51bWJlciB9LFxuICAgICAgKSA9PiB7XG4gICAgICAgIGNvbnN0IHBsYW4gPVxuICAgICAgICAgIHN0b3JlZC5nZXQoKT8uZ2V0KCkgPz8gdG9TdG9yZWRQbGFuKHJlc29sdmVkLmdldCgpLCB1bmRlZmluZWQpO1xuXG4gICAgICAgIGtlZXAoe1xuICAgICAgICAgIC4uLnBsYW4sXG4gICAgICAgICAgd2luZG93czogW1xuICAgICAgICAgICAgLi4ucGxhbi53aW5kb3dzLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgICBkaXNwbGF5SWQ6IGNlbGwuZGlzcGxheUlkLFxuICAgICAgICAgICAgICBjb2x1bW46IGNlbGwuY29sdW1uLFxuICAgICAgICAgICAgICByb3c6IGNlbGwucm93LFxuICAgICAgICAgICAgICBjb2x1bW5zOiAxLFxuICAgICAgICAgICAgICByb3dzOiAxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICAvLyBUYWtlcyB0aGUgd2luZG93IG91dCBvZiB0aGUgcGxhbiBhbHRvZ2V0aGVyLCBhcyB3aGVuIGl0IGlzIGNsb3NlZCBmb3IgZ29vZC5cbiAgICAgIGZvcmdldDogKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHBsYW4gPSBzdG9yZWQuZ2V0KCk/LmdldCgpO1xuXG4gICAgICAgIGlmIChwbGFuKSB7XG4gICAgICAgICAga2VlcCh7XG4gICAgICAgICAgICAuLi5wbGFuLFxuICAgICAgICAgICAgd2luZG93czogcGxhbi53aW5kb3dzLmZpbHRlcigoaXQpID0+IGl0LmtleSAhPT0ga2V5KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfSxcbn0pO1xuIiwgImltcG9ydCB7IGdldFBlcnNpc3RhYmxlTWFwSW5qZWN0YWJsZUJ1bmNoIH0gZnJvbSBcIkBrOHNsZW5zL3BlcnNpc3RhYmxlLWNvbnRyYWN0c1wiO1xuXG4vLyBXaGljaCB3aW5kb3cgb2YgYSBsYXlvdXQgZWFjaCB3aW5kb3cgaXMsIGJ5IGxheW91dCBhbmQgdGhlIHdpbmRvdydzIG93biBrZXksIHRvIHRoZSBrZXkgdGhlXG4vLyBsYXlvdXQgc2F2ZWQgdGhlIHdpbmRvdyB1bmRlcjogYXMgbGFzdCBmb3VuZCwgb3IgYXMgdGhlIHdpbmRvdyB3YXMgb3BlbmVkIGFnYWluIGFzLiBBIHdpbmRvd1xuLy8gb3BlbmVkIGFnYWluIGdvZXMgYnkgYW5vdGhlciBpZCB0aGFuIHRoZSBvbmUgaXQgd2FzIHNhdmVkIGJ5LCBhbmQgd2hhdCBMZW5zIGRlc2NyaWJlcyBvZiBpdCBjYW5cbi8vIGNoYW5nZSwgYXMgaXRzIHRpdGxlLCBzbyB0aGlzIGlzIHdoYXQgdGVsbHMgaXQgaXMgdGhhdCB3aW5kb3cgc3RpbGwsIGhvd2V2ZXIgbWFueSB0aW1lcyBpdCB3YXNcbi8vIG9wZW5lZCBhZ2FpbiwgYW5kIG9uY2UgaXQgaXMgY2xvc2VkIHdoaWNoIHdpbmRvdyBvZiB0aGUgbGF5b3V0IGl0cyB0aWxlIGlzLlxuZXhwb3J0IGNvbnN0IHdpbmRvd0xpbmVhZ2VCdW5jaCA9IGdldFBlcnNpc3RhYmxlTWFwSW5qZWN0YWJsZUJ1bmNoPFxuICBzdHJpbmcsXG4gIHN0cmluZ1xuPigpKHtcbiAgLy8gT2YgaXRzIHNlY29uZCB2ZXJzaW9uLCBrZXB0IGJ5IGxheW91dDogdGhlIG9uZSBrZXB0IGZvciBhbGwgbGF5b3V0cyBhdCBvbmNlIGlzIGxlZnQgYmVoaW5kLlxuICBpZDogXCJ3aW5kb3ctbGluZWFnZS0yXCIsXG59KTtcblxuLy8gVGhlIGtleSBhIHdpbmRvdydzIGxpbmVhZ2UgaW4gYSBsYXlvdXQgaXMga2VwdCB1bmRlci5cbmV4cG9ydCBjb25zdCBsaW5lYWdlS2V5ID0gKGxheW91dDogc3RyaW5nLCB3aW5kb3c6IHN0cmluZykgPT5cbiAgSlNPTi5zdHJpbmdpZnkoW2xheW91dCwgd2luZG93XSk7XG5cbi8vIFRoZSB3aW5kb3cgZWFjaCB3aW5kb3cgb3BlbmVkIGFnYWluIGNvbnRpbnVlcywgYnkga2V5LCB3aGljaGV2ZXIgbGF5b3V0IG9wZW5lZCBpdCBhZ2FpbjogYSBjaGFpblxuLy8gYmFjayB0byB0aGUgd2luZG93IGZpcnN0IG9wZW5lZCwgYnkgd2hpY2ggYW55IGxheW91dCB0aGF0IHNhdmVkIG9uZSBvZiB0aGVtIGZpbmRzIGl0LlxuZXhwb3J0IGNvbnN0IHdpbmRvd0NvbnRpbnVlc0J1bmNoID0gZ2V0UGVyc2lzdGFibGVNYXBJbmplY3RhYmxlQnVuY2g8XG4gIHN0cmluZyxcbiAgc3RyaW5nXG4+KCkoe1xuICBpZDogXCJ3aW5kb3ctY29udGludWVzXCIsXG59KTtcblxuLy8gVGhlIHdpbmRvd3MgdGhlIHdpbmRvdyBjb250aW51ZXMsIG5lYXJlc3QgZmlyc3QsIGJhY2sgdG8gdGhlIG9uZSBmaXJzdCBvcGVuZWQuXG5leHBvcnQgY29uc3QgcHJlZGVjZXNzb3JzT2YgPSAoXG4gIGtleTogc3RyaW5nLFxuICBjb250aW51ZXM6IFJlYWRvbmx5TWFwPHN0cmluZywgc3RyaW5nPixcbik6IHJlYWRvbmx5IHN0cmluZ1tdID0+IHtcbiAgY29uc3QgcHJlZGVjZXNzb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoXG4gICAgbGV0IGF0ID0gY29udGludWVzLmdldChrZXkpO1xuICAgIGF0ICE9PSB1bmRlZmluZWQgJiYgIXByZWRlY2Vzc29ycy5pbmNsdWRlcyhhdCkgJiYgYXQgIT09IGtleTtcbiAgICBhdCA9IGNvbnRpbnVlcy5nZXQoYXQpXG4gICkge1xuICAgIHByZWRlY2Vzc29ycy5wdXNoKGF0KTtcbiAgfVxuXG4gIHJldHVybiBwcmVkZWNlc3NvcnM7XG59O1xuXG4vLyBUaGUgd2luZG93cyBhIHdpbmRvdyBjb250aW51ZXMsIG5lYXJlc3QgZmlyc3QsIGFuZCB0aGVuIHRoZSB3aW5kb3dzIGFueSBsYXlvdXQgZm91bmQgaXQgb3Igb3BlbmVkXG4vLyBpdCBhZ2FpbiBhcywgd2hpY2ggdGVsbCB0aGUgc2FtZSBvZiBhIHdpbmRvdyBvcGVuZWQgYWdhaW4gYmVmb3JlIHRoZSBjaGFpbiB3YXMga2VwdC5cbmV4cG9ydCBjb25zdCBjb250aW51ZWRXaW5kb3dzT2YgPSAoXG4gIGtleTogc3RyaW5nLFxuICBjb250aW51ZXM6IFJlYWRvbmx5TWFwPHN0cmluZywgc3RyaW5nPixcbiAgbGluZWFnZTogUmVhZG9ubHlNYXA8c3RyaW5nLCBzdHJpbmc+LFxuKTogcmVhZG9ubHkgc3RyaW5nW10gPT4ge1xuICBjb25zdCBhc0ZvdW5kID0gWy4uLmxpbmVhZ2VdXG4gICAgLmZpbHRlcigoW2F0XSkgPT4gKEpTT04ucGFyc2UoYXQpIGFzIFtzdHJpbmcsIHN0cmluZ10pWzFdID09PSBrZXkpXG4gICAgLm1hcCgoWywgc2F2ZWRdKSA9PiBzYXZlZCk7XG5cbiAgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5wcmVkZWNlc3NvcnNPZihrZXksIGNvbnRpbnVlcyksIC4uLmFzRm91bmRdKV07XG59O1xuIiwgImltcG9ydCB7IHR5cGUgUGxhY2UgfSBmcm9tIFwiQGs4c2xlbnMvbmF2aWdhdGlvbi1jb250cmFjdHNcIjtcbmltcG9ydCB7IGdldFBsYWNlU3ViV2luZG93S2luZEluamVjdGFibGVCdW5jaCB9IGZyb20gXCJAazhzbGVucy9wbGFjZS1zdWItd2luZG93LWNvbnRyYWN0c1wiO1xuaW1wb3J0IHsgZ2V0U3ViV2luZG93S2luZCB9IGZyb20gXCJAazhzbGVucy9zdWItd2luZG93LWNvbnRyYWN0c1wiO1xuXG4vLyBXaW5kb3dzIG9mIHRoZWlyIG93biBzaG93aW5nIGEgcGxhY2Ugb2YgTGVucywgYXMgYSBjbHVzdGVyJ3MgbGlzdCBvZiBwb2RzLCBvcGVuZWQgaW50byBhIGNlbGwgb2Zcbi8vIHRoZSB0aWxpbmcuXG5leHBvcnQgY29uc3QgcGxhY2VzU3ViV2luZG93S2luZCA9IGdldFN1YldpbmRvd0tpbmQ8UGxhY2U+KCkoXCJwbGFjZXNcIik7XG5cbmV4cG9ydCBjb25zdCBwbGFjZXNTdWJXaW5kb3dLaW5kQnVuY2ggPSBnZXRQbGFjZVN1YldpbmRvd0tpbmRJbmplY3RhYmxlQnVuY2goe1xuICBraW5kOiBwbGFjZXNTdWJXaW5kb3dLaW5kLFxufSk7XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0YWJsZTIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgcnVuSW5BY3Rpb24gfSBmcm9tIFwibW9ieFwiO1xuaW1wb3J0IHR5cGUgeyBXaW5kb3dJZCB9IGZyb20gXCJAazhzbGVucy9tZXNzYWdpbmctY29udHJhY3RzXCI7XG5pbXBvcnQge1xuICBjYW5SZW9wZW5XaW5kb3dJbmplY3Rpb25Ub2tlbixcbiAgZGlzcGxheVJlY29yZHNJbmplY3Rpb25Ub2tlbixcbiAgZm9jdXNXaW5kb3dJbmplY3Rpb25Ub2tlbixcbiAgcmVvcGVuV2luZG93SW5qZWN0aW9uVG9rZW4sXG4gIHNldFdpbmRvd0JvdW5kc0luamVjdGlvblRva2VuLFxuICBzZXRXaW5kb3dTdGF0ZUluamVjdGlvblRva2VuLFxuICB3aW5kb3dSZWNvcmRzSW5qZWN0aW9uVG9rZW4sXG4gIHR5cGUgV2luZG93Qm91bmRzLFxuICB0eXBlIFdpbmRvd1JlY29yZCxcbn0gZnJvbSBcIkBrOHNsZW5zL3dpbmRvdy1sYXlvdXQtY29udHJhY3RzXCI7XG5pbXBvcnQge1xuICBpc1NhbWVMaW5lYWdlLFxuICBpc1NhbWVSZW9wZW5pbmcsXG4gIGlzU2FtZVdpbmRvdyxcbiAgbWF0Y2hXaW5kb3dzLFxuICB0b1RpbGluZ1BsYW4sXG59IGZyb20gXCIuL2xheW91dC10aWxpbmdcIjtcbmltcG9ydCB7XG4gIGNvbnRpbnVlZFdpbmRvd3NPZixcbiAgbGluZWFnZUtleSxcbiAgd2luZG93Q29udGludWVzQnVuY2gsXG4gIHdpbmRvd0xpbmVhZ2VCdW5jaCxcbn0gZnJvbSBcIi4vd2luZG93LWxpbmVhZ2UuaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHtcbiAgc2F2ZWRXaW5kb3dMYXlvdXRzQnVuY2gsXG4gIHR5cGUgU2F2ZWRXaW5kb3csXG59IGZyb20gXCIuL3NhdmVkLXdpbmRvdy1sYXlvdXRzLmluamVjdGFibGVcIjtcbmltcG9ydCB7IGJvdW5kc0luR3JpZCwga2V5T2ZXaW5kb3csIHJlc29sdmVUaWxpbmdQbGFuIH0gZnJvbSBcIi4vdGlsaW5nLXBsYW5cIjtcbmltcG9ydCB7IGZpdEludG8sIGlzUmVhY2hhYmxlT25Tb21lU2NyZWVuLCBpc1NhbWVTY3JlZW5zIH0gZnJvbSBcIi4vc2NyZWVuc1wiO1xuaW1wb3J0IHsgc3RvcmVkVGlsaW5nUGxhbkJ1bmNoIH0gZnJvbSBcIi4vdGlsaW5nLXBsYW4uaW5qZWN0YWJsZVwiO1xuXG4vLyBUb2xkIGFzIGVhY2ggd2luZG93IGNsb3NlZCBzaW5jZSBpcyBvcGVuZWQgYWdhaW4sIG9uZSBhZnRlciB0aGUgb3RoZXI6IGJlZm9yZSwgYW5kIHdpdGggdGhlXG4vLyB3aW5kb3cgTGVucyBhbnN3ZXJlZCB3aXRoLCBvciBub25lIHdoZW4gaXQgY291bGQgbm90IG9wZW4gaXQuXG5leHBvcnQgaW50ZXJmYWNlIFJlY2FsbFByb2dyZXNzIHtcbiAgcmVhZG9ubHkgcmVvcGVuaW5nPzogKHNhdmVkOiBTYXZlZFdpbmRvdywgaW5kZXg6IG51bWJlcikgPT4gdm9pZDtcbiAgcmVhZG9ubHkgcmVvcGVuZWQ/OiAoXG4gICAgc2F2ZWQ6IFNhdmVkV2luZG93LFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgd2luZG93OiBXaW5kb3dJZCB8IHVuZGVmaW5lZCxcbiAgKSA9PiB2b2lkO1xuICAvLyBUb2xkIGluIHRoZSBvbmUgc3RlcCB0aGF0IG1ha2VzIHRoZSBsYXlvdXQncyB0aWxpbmcgdGhlIGN1cnJlbnQgb25lLCBldmVyeSB3aW5kb3cgaW4gaXQgYnlcbiAgLy8gaXRzIG93biBrZXkuXG4gIHJlYWRvbmx5IHBsYWNlZD86ICgpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjYWxsUmVzdWx0IHtcbiAgcmVhZG9ubHkgcGxhY2VkOiBudW1iZXI7XG4gIC8vIFRoZSB3aW5kb3dzIGNsb3NlZCBzaW5jZSB0aGUgbGF5b3V0IHdhcyBzYXZlZCwgb3BlbmVkIGFnYWluLlxuICByZWFkb25seSByZW9wZW5lZDogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8vIFRoZSB3aW5kb3dzIGNsb3NlZCBzaW5jZSB0aGF0IGNvdWxkIG5vdCBiZSBvcGVuZWQgYWdhaW4sIGFzIHdoZW4gdGhlIGV4dGVuc2lvbiB0aGF0IG9wZW5lZFxuICAvLyB0aGVtIGlzIGdvbmUsIG9yIHRoZSBsYXlvdXQgd2FzIHNhdmVkIGJlZm9yZSB3aW5kb3dzIHdlcmUga2VwdC5cbiAgcmVhZG9ubHkgbm90T3BlbjogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8vIFRoZSB3aW5kb3dzIHdob3NlIHNhdmVkIHBsYWNlIGlzIG9uIG5vIHNjcmVlbiBjb25uZWN0ZWQgbm93LCBtb3ZlZCBvbnRvIHRoZSBwcmltYXJ5IHNjcmVlbi5cbiAgcmVhZG9ubHkgbW92ZWRUb1ByaW1hcnk6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvLyBXaGV0aGVyIHRoZSBzY3JlZW5zIGFyZSBub3QgdGhvc2UgdGhlIGxheW91dCB3YXMgc2F2ZWQgb247IHVua25vd24gZm9yIGFuIG9sZGVyIGxheW91dC5cbiAgcmVhZG9ubHkgc2NyZWVuc0NoYW5nZWQ6IGJvb2xlYW47XG59XG5cbi8vIFB1dHMgZXZlcnkgd2luZG93IG9mIHRoZSBsYXlvdXQgYmFjayB3aGVyZSBpdCB3YXMgYW5kIGhvdyBpdCBzaG93ZWQuIEEgd2luZG93IG9wZW4gc3RpbGwsIG9yXG4vLyBvcGVuIGFnYWluIGRvaW5nIHRoZSBzYW1lLCBpcyBtb3ZlZDsgYSB3aW5kb3cgY2xvc2VkIHNpbmNlIGlzIG9wZW5lZCBhZ2Fpbjsgb25lIHRoYXQgY2Fubm90IGJlXG4vLyBzdGF5cyBjbG9zZWQsIHNob3duIGFzIG1pc3NpbmcgaW4gdGhlIHRpbGluZy4gQW5vdGhlciB3aW5kb3cgaXMgbmV2ZXIgbW92ZWQgaW4gaXRzIHBsYWNlLCBhcyBtb3N0XG4vLyB3aW5kb3dzIGFyZSBvZiBvbmUga2luZCwgYSB0YWIgaW4gYSB3aW5kb3cgb2YgaXRzIG93biwgd2hhdGV2ZXIgdGhleSBzaG93LiBBIHdpbmRvdyB3aG9zZSBwbGFjZVxuLy8gaXMgb24gbm8gc2NyZWVuIGNvbm5lY3RlZCBub3csIGFzIHdoZW4gYSBzY3JlZW4gd2FzIHVucGx1Z2dlZCBzaW5jZSwgZ29lcyBvbnRvIHRoZSBwcmltYXJ5IHNjcmVlblxuLy8gaW5zdGVhZC4gVGhlIGxheW91dCdzIHRpbGluZyBzZXR1cCBiZWNvbWVzIHRoZSBjdXJyZW50IG9uZS5cbmV4cG9ydCBjb25zdCByZWNhbGxXaW5kb3dMYXlvdXRJbmplY3RhYmxlID0gZ2V0SW5qZWN0YWJsZTIoe1xuICBpZDogXCJ3aW5kb3ctbWFuYWdlci5yZWNhbGwtd2luZG93LWxheW91dFwiLFxuICBjb25zdW1wdGlvbnM6IFtcbiAgICB3aW5kb3dSZWNvcmRzSW5qZWN0aW9uVG9rZW4sXG4gICAgZGlzcGxheVJlY29yZHNJbmplY3Rpb25Ub2tlbixcbiAgICBzZXRXaW5kb3dCb3VuZHNJbmplY3Rpb25Ub2tlbixcbiAgICBzZXRXaW5kb3dTdGF0ZUluamVjdGlvblRva2VuLFxuICAgIGZvY3VzV2luZG93SW5qZWN0aW9uVG9rZW4sXG4gICAgY2FuUmVvcGVuV2luZG93SW5qZWN0aW9uVG9rZW4sXG4gICAgcmVvcGVuV2luZG93SW5qZWN0aW9uVG9rZW4sXG4gIF0sXG5cbiAgaW5zdGFudGlhdGU6IChkaSkgPT4ge1xuICAgIGNvbnN0IGdldFdpbmRvd1JlY29yZHMgPSBkaS5pbmplY3Qod2luZG93UmVjb3Jkc0luamVjdGlvblRva2VuKSgpO1xuICAgIGNvbnN0IGdldERpc3BsYXlSZWNvcmRzID0gZGkuaW5qZWN0KGRpc3BsYXlSZWNvcmRzSW5qZWN0aW9uVG9rZW4pKCk7XG4gICAgY29uc3Qgc2V0V2luZG93Qm91bmRzID0gZGkuaW5qZWN0KHNldFdpbmRvd0JvdW5kc0luamVjdGlvblRva2VuKSgpO1xuICAgIGNvbnN0IHNldFdpbmRvd1N0YXRlID0gZGkuaW5qZWN0KHNldFdpbmRvd1N0YXRlSW5qZWN0aW9uVG9rZW4pKCk7XG4gICAgY29uc3QgZm9jdXNXaW5kb3cgPSBkaS5pbmplY3QoZm9jdXNXaW5kb3dJbmplY3Rpb25Ub2tlbikoKTtcbiAgICBjb25zdCBjYW5SZW9wZW5XaW5kb3cgPSBkaS5pbmplY3QoY2FuUmVvcGVuV2luZG93SW5qZWN0aW9uVG9rZW4pKCk7XG4gICAgY29uc3QgcmVvcGVuV2luZG93ID0gZGkuaW5qZWN0KHJlb3BlbldpbmRvd0luamVjdGlvblRva2VuKSgpO1xuICAgIGNvbnN0IGdldFNhdmVkTGF5b3V0cyA9IGRpLmluamVjdChzYXZlZFdpbmRvd0xheW91dHNCdW5jaC5wZXJzaXN0YWJsZSk7XG4gICAgY29uc3QgZ2V0V2luZG93TGluZWFnZSA9IGRpLmluamVjdCh3aW5kb3dMaW5lYWdlQnVuY2gucGVyc2lzdGFibGUpO1xuICAgIGNvbnN0IGdldFdpbmRvd0NvbnRpbnVlcyA9IGRpLmluamVjdCh3aW5kb3dDb250aW51ZXNCdW5jaC5wZXJzaXN0YWJsZSk7XG4gICAgY29uc3QgZ2V0U3RvcmVkVGlsaW5nUGxhbiA9IGRpLmluamVjdChzdG9yZWRUaWxpbmdQbGFuQnVuY2gucGVyc2lzdGFibGUpO1xuXG4gICAgcmV0dXJuICgpID0+XG4gICAgICBhc3luYyAoXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgcHJvZ3Jlc3M6IFJlY2FsbFByb2dyZXNzID0ge30sXG4gICAgICApOiBQcm9taXNlPFJlY2FsbFJlc3VsdCB8IHVuZGVmaW5lZD4gPT4ge1xuICAgICAgICBjb25zdCBsYXlvdXQgPSAoYXdhaXQgZ2V0U2F2ZWRMYXlvdXRzKCkpLmdldChuYW1lKTtcblxuICAgICAgICBpZiAoIWxheW91dCkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaW5lYWdlID0gYXdhaXQgZ2V0V2luZG93TGluZWFnZSgpO1xuICAgICAgICBjb25zdCBjb250aW51ZXMgPSBhd2FpdCBnZXRXaW5kb3dDb250aW51ZXMoKTtcblxuICAgICAgICBjb25zdCBvcGVuID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgKGF3YWl0IGdldFdpbmRvd1JlY29yZHMoKSkubWFwKGFzeW5jIChyZWNvcmQpID0+ICh7XG4gICAgICAgICAgICByZWNvcmQsXG4gICAgICAgICAgICByZW9wZW5pbmc6IGF3YWl0IHJlY29yZC5kZXNjcmliZVJlb3BlbmluZygpLFxuICAgICAgICAgICAgc3RhbmRzRm9yOiBsaW5lYWdlLmdldChcbiAgICAgICAgICAgICAgbGluZWFnZUtleShuYW1lLCBrZXlPZldpbmRvdyhyZWNvcmQud2luZG93KSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgY29udGludWVzOiBjb250aW51ZWRXaW5kb3dzT2YoXG4gICAgICAgICAgICAgIGtleU9mV2luZG93KHJlY29yZC53aW5kb3cpLFxuICAgICAgICAgICAgICBjb250aW51ZXMsXG4gICAgICAgICAgICAgIGxpbmVhZ2UsXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBjb25uZWN0ZWQgPSBhd2FpdCBnZXREaXNwbGF5UmVjb3JkcygpO1xuICAgICAgICBjb25zdCB3b3JrQXJlYXMgPSBjb25uZWN0ZWQubWFwKChkaXNwbGF5KSA9PiBkaXNwbGF5LndvcmtBcmVhLmdldCgpKTtcbiAgICAgICAgY29uc3QgcHJpbWFyeVdvcmtBcmVhID0gKFxuICAgICAgICAgIGNvbm5lY3RlZC5maW5kKChkaXNwbGF5KSA9PiBkaXNwbGF5LmlzUHJpbWFyeS5nZXQoKSkgPz8gY29ubmVjdGVkWzBdXG4gICAgICAgICk/LndvcmtBcmVhLmdldCgpO1xuICAgICAgICBjb25zdCBtb3ZlZFRvUHJpbWFyeTogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBjb25zdCBib3VuZHNGb3IgPSAoc2F2ZWQ6IFNhdmVkV2luZG93KTogV2luZG93Qm91bmRzID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhcHJpbWFyeVdvcmtBcmVhIHx8XG4gICAgICAgICAgICBpc1JlYWNoYWJsZU9uU29tZVNjcmVlbihzYXZlZC5ub3JtYWxCb3VuZHMsIHdvcmtBcmVhcylcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBzYXZlZC5ub3JtYWxCb3VuZHM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbW92ZWRUb1ByaW1hcnkucHVzaChzYXZlZC50aXRsZSk7XG5cbiAgICAgICAgICByZXR1cm4gZml0SW50byhcbiAgICAgICAgICAgIHByaW1hcnlXb3JrQXJlYSxcbiAgICAgICAgICAgIHNhdmVkLm5vcm1hbEJvdW5kcyxcbiAgICAgICAgICAgIG1vdmVkVG9QcmltYXJ5Lmxlbmd0aCAtIDEsXG4gICAgICAgICAgKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBtYXRjaGVzID0gbmV3IE1hcDxTYXZlZFdpbmRvdywgV2luZG93UmVjb3JkPigpO1xuXG4gICAgICAgIG1hdGNoV2luZG93cyhsYXlvdXQud2luZG93cywgb3BlbiwgbWF0Y2hlcywgW1xuICAgICAgICAgIGlzU2FtZVdpbmRvdyxcbiAgICAgICAgICBpc1NhbWVMaW5lYWdlLFxuICAgICAgICAgIGlzU2FtZVJlb3BlbmluZyxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgLy8gT3BlbmVkIGFnYWluIGJlZm9yZSBmYWxsaW5nIGJhY2sgb24gdGhlIGtpbmQsIHNvIGEgd2luZG93IGNvbWVzIGJhY2sgZG9pbmcgd2hhdCBpdCBkaWRcbiAgICAgICAgLy8gcmF0aGVyIHRoYW4gYW5vdGhlciBvZiBpdHMga2luZCB0YWtpbmcgaXRzIHBsYWNlLlxuICAgICAgICBjb25zdCByZW9wZW5lZCA9IG5ldyBNYXA8U2F2ZWRXaW5kb3csIFdpbmRvd0lkPigpO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc2F2ZWQgb2YgbGF5b3V0LndpbmRvd3MpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBtYXRjaGVzLmhhcyhzYXZlZCkgfHxcbiAgICAgICAgICAgICFzYXZlZC5yZW9wZW5pbmcgfHxcbiAgICAgICAgICAgICEoYXdhaXQgY2FuUmVvcGVuV2luZG93KHNhdmVkLnJlb3BlbmluZykpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpbmRleCA9IGxheW91dC53aW5kb3dzLmluZGV4T2Yoc2F2ZWQpO1xuXG4gICAgICAgICAgcHJvZ3Jlc3MucmVvcGVuaW5nPy4oc2F2ZWQsIGluZGV4KTtcblxuICAgICAgICAgIC8vIENyZWF0ZWQgd2hlcmUgYW5kIGFzIHRoZSBsYXlvdXQgaGFzIGl0LCBuZXZlciBtb3ZlZCB0aGVyZSBvbmNlIHNob3duLiBMZW5zIGFuc3dlcnMgb25jZVxuICAgICAgICAgIC8vIHRoZSB3aW5kb3cgaXMgbGlzdGVkLCB3aXRoIHRoZSBpZCBpdCBpcyBsaXN0ZWQgYnkuXG4gICAgICAgICAgY29uc3Qgd2luZG93ID0gYXdhaXQgcmVvcGVuV2luZG93KHNhdmVkLnJlb3BlbmluZywge1xuICAgICAgICAgICAgYm91bmRzOiBib3VuZHNGb3Ioc2F2ZWQpLFxuICAgICAgICAgICAgc3RhdGU6IHNhdmVkLnN0YXRlLFxuICAgICAgICAgICAgLi4uKHNhdmVkLmRpc3BsYXlJZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgICAgOiB7IGRpc3BsYXlJZDogc2F2ZWQuZGlzcGxheUlkIH0pLFxuICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG5cbiAgICAgICAgICBwcm9ncmVzcy5yZW9wZW5lZD8uKHNhdmVkLCBpbmRleCwgd2luZG93KTtcblxuICAgICAgICAgIGlmICh3aW5kb3cpIHtcbiAgICAgICAgICAgIHJlb3BlbmVkLnNldChzYXZlZCwgd2luZG93KTtcbiAgICAgICAgICAgIC8vIFRoZSB3aW5kb3cgb3BlbmVkIGFnYWluIGlzIHRoZSBsYXlvdXQncyB3aW5kb3cgc3RpbGwsIHdoYXRldmVyIExlbnMgZGVzY3JpYmVzIG9mIGl0LlxuICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICBsaW5lYWdlLnNldChcbiAgICAgICAgICAgICAgICBsaW5lYWdlS2V5KG5hbWUsIGtleU9mV2luZG93KHdpbmRvdykpLFxuICAgICAgICAgICAgICAgIGtleU9mV2luZG93KHNhdmVkLndpbmRvdyksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlcy5zZXQoa2V5T2ZXaW5kb3cod2luZG93KSwga2V5T2ZXaW5kb3coc2F2ZWQud2luZG93KSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB3aW5kb3dPZiA9IG5ldyBNYXA8U2F2ZWRXaW5kb3csIFdpbmRvd0lkPihbXG4gICAgICAgICAgLi4uWy4uLm1hdGNoZXNdLm1hcChcbiAgICAgICAgICAgIChbc2F2ZWQsIHJlY29yZF0pID0+IFtzYXZlZCwgcmVjb3JkLndpbmRvd10gYXMgY29uc3QsXG4gICAgICAgICAgKSxcbiAgICAgICAgICAuLi5yZW9wZW5lZCxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgY29uc3QgcGxhbiA9IHRvVGlsaW5nUGxhbihcbiAgICAgICAgICBsYXlvdXQudGlsaW5nLFxuICAgICAgICAgIGxheW91dC53aW5kb3dzLFxuICAgICAgICAgIHdpbmRvd09mLFxuICAgICAgICAgIGNvbm5lY3RlZCxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBXaGVyZSB0aGUgdGlsaW5nIHB1dHMgZWFjaCB3aW5kb3cgaXQgcHV0cyBpbiBhIHRpbGUsIGJ5IGtleTogb24gYSBzY3JlZW4gY29ubmVjdGVkIG5vdyxcbiAgICAgICAgLy8gYXMgdGhlIHRpbGluZyBzaG93cyB0aGVtLiBPbmUgb24gYSBzY3JlZW4gbm90IGNvbm5lY3RlZCBpcyBub3QgdGlsZWQsIGFzIHRoZSB0aWxpbmcgc2F5cy5cbiAgICAgICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IGdldFdpbmRvd1JlY29yZHMoKTtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlVGlsaW5nUGxhbihyZWNvcmRzLCBjb25uZWN0ZWQsIHBsYW4pO1xuICAgICAgICBjb25zdCB0aWxlQm91bmRzID0gbmV3IE1hcChcbiAgICAgICAgICByZXNvbHZlZC5zY3JlZW5zXG4gICAgICAgICAgICAuZmlsdGVyKChzY3JlZW4pID0+ICFzY3JlZW4ubWlzc2luZylcbiAgICAgICAgICAgIC5mbGF0TWFwKChzY3JlZW4pID0+XG4gICAgICAgICAgICAgIHNjcmVlbi53aW5kb3dzXG4gICAgICAgICAgICAgICAgLmZpbHRlcigod2luZG93KSA9PiAhd2luZG93Lm1pc3NpbmcpXG4gICAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAgICh3aW5kb3cpID0+XG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICBrZXlPZldpbmRvdyh3aW5kb3cucmVjb3JkLndpbmRvdyksXG4gICAgICAgICAgICAgICAgICAgICAgYm91bmRzSW5HcmlkKFxuICAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuLmRpc3BsYXkud29ya0FyZWEuZ2V0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW4uY29sdW1ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbi5yb3dzLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LFxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIF0gYXMgY29uc3QsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHRpbGVkS2V5cyA9IG5ldyBTZXQodGlsZUJvdW5kcy5rZXlzKCkpO1xuICAgICAgICBjb25zdCBpc1RpbGVkID0gKHdpbmRvdzogV2luZG93SWQpID0+XG4gICAgICAgICAgdGlsZWRLZXlzLmhhcyhrZXlPZldpbmRvdyh3aW5kb3cpKTtcbiAgICAgICAgY29uc3Qgc3RhdGVPZiA9ICh3aW5kb3c6IFdpbmRvd0lkKSA9PlxuICAgICAgICAgIHJlY29yZHNcbiAgICAgICAgICAgIC5maW5kKChpdCkgPT4ga2V5T2ZXaW5kb3coaXQud2luZG93KSA9PT0ga2V5T2ZXaW5kb3cod2luZG93KSlcbiAgICAgICAgICAgID8uc3RhdGUuZ2V0KCk7XG5cbiAgICAgICAgLy8gQSB0aWxlZCB3aW5kb3cgc2hvd3Mgbm9ybWFsbHkgdG8gYmUgcHV0IGluIGl0cyB0aWxlLCBhcyB0aWxpbmcgZG9lcywgdW5sZXNzIHRoZSBsYXlvdXRcbiAgICAgICAgLy8gaGFzIGl0IG1pbmltaXplZC5cbiAgICAgICAgZm9yIChjb25zdCBbc2F2ZWQsIHdpbmRvd10gb2Ygd2luZG93T2YpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpc1RpbGVkKHdpbmRvdykgJiZcbiAgICAgICAgICAgIHNhdmVkLnN0YXRlICE9PSBcIm1pbmltaXplZFwiICYmXG4gICAgICAgICAgICBzdGF0ZU9mKHdpbmRvdykgIT09IFwibm9ybWFsXCJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGF3YWl0IHNldFdpbmRvd1N0YXRlKHdpbmRvdywgXCJub3JtYWxcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQSB0aWxlZCB3aW5kb3cgZ29lcyBpbiBpdHMgdGlsZTsgYW55IG90aGVyIHdoZXJlIHRoZSBsYXlvdXQgc2F2ZWQgaXQsIGFzIG9uZSBvcGVuZWQgYWdhaW5cbiAgICAgICAgLy8gd2FzIGNyZWF0ZWQgYWxyZWFkeS5cbiAgICAgICAgYXdhaXQgc2V0V2luZG93Qm91bmRzKFtcbiAgICAgICAgICAuLi5bLi4ud2luZG93T2ZdLmZsYXRNYXAoKFssIHdpbmRvd10pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJvdW5kcyA9IHRpbGVCb3VuZHMuZ2V0KGtleU9mV2luZG93KHdpbmRvdykpO1xuXG4gICAgICAgICAgICByZXR1cm4gYm91bmRzID8gW3sgd2luZG93LCBib3VuZHMgfV0gOiBbXTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAuLi5bLi4ubWF0Y2hlc11cbiAgICAgICAgICAgIC5maWx0ZXIoKFssIHJlY29yZF0pID0+ICFpc1RpbGVkKHJlY29yZC53aW5kb3cpKVxuICAgICAgICAgICAgLm1hcCgoW3NhdmVkLCByZWNvcmRdKSA9PiAoe1xuICAgICAgICAgICAgICB3aW5kb3c6IHJlY29yZC53aW5kb3csXG4gICAgICAgICAgICAgIGJvdW5kczogYm91bmRzRm9yKHNhdmVkKSxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBbc2F2ZWQsIHdpbmRvd10gb2Ygd2luZG93T2YpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBzYXZlZC5zdGF0ZSA9PT0gXCJtaW5pbWl6ZWRcIiB8fFxuICAgICAgICAgICAgKCFpc1RpbGVkKHdpbmRvdykgJiYgbWF0Y2hlcy5oYXMoc2F2ZWQpICYmIHNhdmVkLnN0YXRlICE9PSBcIm5vcm1hbFwiKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgYXdhaXQgc2V0V2luZG93U3RhdGUod2luZG93LCBzYXZlZC5zdGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQnJpbmdzIHRoZSB0aWxlZCB3aW5kb3dzIGZvcndhcmQsIHNvIHRoYXQgdGhleSBlbmQgYWJvdmUgZXZlcnkgb3RoZXIgd2luZG93LCBidXQgdGhlXG4gICAgICAgIC8vIG1pbmltaXplZCBvbmVzLCB3aGljaCBmb2N1c2luZyB3b3VsZCBzaG93IGFnYWluOyB0aGUgb25lIHRoYXQgaGFkIGZvY3VzIGxhc3QgZW5kcyBvbiB0b3BcbiAgICAgICAgLy8gd2l0aCBmb2N1cy4gQSB3aW5kb3cgbm90IHRpbGVkIGlzIGxlZnQgd2hlcmUgaXQgaXMgYW1vbmcgdGhlIG90aGVycy4gQSBsYXlvdXQgc2F2ZWRcbiAgICAgICAgLy8gYmVmb3JlIGxheW91dHMga2VwdCBhIHRpbGluZyB0aWxlcyBub25lOiBldmVyeSB3aW5kb3cgb2YgaXQgaXMgYnJvdWdodCBmb3J3YXJkLlxuICAgICAgICBjb25zdCB0b0Zyb250ID0gWy4uLndpbmRvd09mXVxuICAgICAgICAgIC5maWx0ZXIoKFtzYXZlZF0pID0+IHNhdmVkLnN0YXRlICE9PSBcIm1pbmltaXplZFwiKVxuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAoWywgd2luZG93XSkgPT5cbiAgICAgICAgICAgICAgIWxheW91dC50aWxpbmcgfHwgdGlsZWRLZXlzLmhhcyhrZXlPZldpbmRvdyh3aW5kb3cpKSxcbiAgICAgICAgICApXG4gICAgICAgICAgLnNvcnQoKFthXSwgW2JdKSA9PiBOdW1iZXIoYS5pc0ZvY3VzZWQpIC0gTnVtYmVyKGIuaXNGb2N1c2VkKSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBbLCB3aW5kb3ddIG9mIHRvRnJvbnQpIHtcbiAgICAgICAgICBhd2FpdCBmb2N1c1dpbmRvdyh3aW5kb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RvcmVkID0gYXdhaXQgZ2V0U3RvcmVkVGlsaW5nUGxhbigpO1xuXG4gICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICBzdG9yZWQuc2V0KHBsYW4pO1xuICAgICAgICAgIHByb2dyZXNzLnBsYWNlZD8uKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcGxhY2VkOiBtYXRjaGVzLnNpemUgKyByZW9wZW5lZC5zaXplLFxuICAgICAgICAgIHJlb3BlbmVkOiBbLi4ucmVvcGVuZWQua2V5cygpXS5tYXAoKGl0KSA9PiBpdC50aXRsZSksXG4gICAgICAgICAgbm90T3BlbjogbGF5b3V0LndpbmRvd3NcbiAgICAgICAgICAgIC5maWx0ZXIoKHNhdmVkKSA9PiAhbWF0Y2hlcy5oYXMoc2F2ZWQpICYmICFyZW9wZW5lZC5oYXMoc2F2ZWQpKVxuICAgICAgICAgICAgLm1hcCgoaXQpID0+IGl0LnRpdGxlKSxcbiAgICAgICAgICBtb3ZlZFRvUHJpbWFyeSxcbiAgICAgICAgICBzY3JlZW5zQ2hhbmdlZDpcbiAgICAgICAgICAgICEhbGF5b3V0LmRpc3BsYXlzICYmICFpc1NhbWVTY3JlZW5zKGxheW91dC5kaXNwbGF5cywgY29ubmVjdGVkKSxcbiAgICAgICAgfTtcbiAgICAgIH07XG4gIH0sXG59KTtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIERpc3BsYXlSZWNvcmQsXG4gIFdpbmRvd0JvdW5kcyxcbn0gZnJvbSBcIkBrOHNsZW5zL3dpbmRvdy1sYXlvdXQtY29udHJhY3RzXCI7XG5pbXBvcnQgdHlwZSB7IFNhdmVkRGlzcGxheSB9IGZyb20gXCIuL3NhdmVkLXdpbmRvdy1sYXlvdXRzLmluamVjdGFibGVcIjtcblxuLy8gSG93IG11Y2ggb2YgYSB3aW5kb3cgbXVzdCBzaG93IG9uIGEgc2NyZWVuIGZvciB0aGUgdXNlciB0byByZWFjaCBpdDogYWJvdXQgaXRzIHRpdGxlIGJhci5cbmNvbnN0IHJlYWNoYWJsZVdpZHRoID0gMTAwO1xuY29uc3QgcmVhY2hhYmxlSGVpZ2h0ID0gNDA7XG5cbi8vIEVhY2ggd2luZG93IG1vdmVkIG9udG8gYW5vdGhlciBzY3JlZW4gbGllcyB0aGlzIG11Y2ggZnVydGhlciBkb3duIGFuZCByaWdodCB0aGFuIHRoZSBvbmUgYmVmb3JlLFxuLy8gc28gdGhhdCBzZXZlcmFsIGRvIG5vdCBoaWRlIGVhY2ggb3RoZXIuXG5jb25zdCBjYXNjYWRlU3RlcCA9IDMyO1xuXG5jb25zdCBvdmVybGFwID0gKGE6IFdpbmRvd0JvdW5kcywgYjogV2luZG93Qm91bmRzKSA9PiAoe1xuICB3aWR0aDogTWF0aC5taW4oYS54ICsgYS53aWR0aCwgYi54ICsgYi53aWR0aCkgLSBNYXRoLm1heChhLngsIGIueCksXG4gIGhlaWdodDogTWF0aC5taW4oYS55ICsgYS5oZWlnaHQsIGIueSArIGIuaGVpZ2h0KSAtIE1hdGgubWF4KGEueSwgYi55KSxcbn0pO1xuXG5leHBvcnQgY29uc3QgaXNSZWFjaGFibGVPblNvbWVTY3JlZW4gPSAoXG4gIGJvdW5kczogV2luZG93Qm91bmRzLFxuICB3b3JrQXJlYXM6IHJlYWRvbmx5IFdpbmRvd0JvdW5kc1tdLFxuKSA9PlxuICB3b3JrQXJlYXMuc29tZSgoYXJlYSkgPT4ge1xuICAgIGNvbnN0IHNob3duID0gb3ZlcmxhcChib3VuZHMsIGFyZWEpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHNob3duLndpZHRoID49IE1hdGgubWluKHJlYWNoYWJsZVdpZHRoLCBib3VuZHMud2lkdGgpICYmXG4gICAgICBzaG93bi5oZWlnaHQgPj0gTWF0aC5taW4ocmVhY2hhYmxlSGVpZ2h0LCBib3VuZHMuaGVpZ2h0KVxuICAgICk7XG4gIH0pO1xuXG4vLyBUaGUgYm91bmRzIHNocnVuayB0byBmaXQgdGhlIGFyZWEgaWYgdGhleSBtdXN0LCBjZW50cmVkIGluIGl0LCB0aGUgbnRoIG9uZSBhIGNhc2NhZGUgc3RlcCBmdXJ0aGVyIG9uLlxuZXhwb3J0IGNvbnN0IGZpdEludG8gPSAoXG4gIGFyZWE6IFdpbmRvd0JvdW5kcyxcbiAgYm91bmRzOiBXaW5kb3dCb3VuZHMsXG4gIG50aDogbnVtYmVyLFxuKTogV2luZG93Qm91bmRzID0+IHtcbiAgY29uc3Qgd2lkdGggPSBNYXRoLm1pbihib3VuZHMud2lkdGgsIGFyZWEud2lkdGgpO1xuICBjb25zdCBoZWlnaHQgPSBNYXRoLm1pbihib3VuZHMuaGVpZ2h0LCBhcmVhLmhlaWdodCk7XG4gIGNvbnN0IG9mZnNldCA9IG50aCAqIGNhc2NhZGVTdGVwO1xuXG4gIHJldHVybiB7XG4gICAgeDpcbiAgICAgIGFyZWEueCArXG4gICAgICBNYXRoLm1pbihcbiAgICAgICAgTWF0aC5mbG9vcigoYXJlYS53aWR0aCAtIHdpZHRoKSAvIDIpICsgb2Zmc2V0LFxuICAgICAgICBhcmVhLndpZHRoIC0gd2lkdGgsXG4gICAgICApLFxuICAgIHk6XG4gICAgICBhcmVhLnkgK1xuICAgICAgTWF0aC5taW4oXG4gICAgICAgIE1hdGguZmxvb3IoKGFyZWEuaGVpZ2h0IC0gaGVpZ2h0KSAvIDIpICsgb2Zmc2V0LFxuICAgICAgICBhcmVhLmhlaWdodCAtIGhlaWdodCxcbiAgICAgICksXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHRvU2F2ZWREaXNwbGF5ID0gKGRpc3BsYXk6IERpc3BsYXlSZWNvcmQpOiBTYXZlZERpc3BsYXkgPT4gKHtcbiAgbGFiZWw6IGRpc3BsYXkubGFiZWwuZ2V0KCksXG4gIGlzUHJpbWFyeTogZGlzcGxheS5pc1ByaW1hcnkuZ2V0KCksXG4gIGJvdW5kczogeyAuLi5kaXNwbGF5LmJvdW5kcy5nZXQoKSB9LFxufSk7XG5cbmNvbnN0IGlzU2FtZUJvdW5kcyA9IChhOiBXaW5kb3dCb3VuZHMsIGI6IFdpbmRvd0JvdW5kcykgPT5cbiAgYS54ID09PSBiLnggJiYgYS55ID09PSBiLnkgJiYgYS53aWR0aCA9PT0gYi53aWR0aCAmJiBhLmhlaWdodCA9PT0gYi5oZWlnaHQ7XG5cbi8vIFdoZXRoZXIgdGhlIHNjcmVlbnMgYXJlIGFycmFuZ2VkIGFzIHRoZXkgd2VyZSBzYXZlZDogYXMgbWFueSwgZWFjaCB3aGVyZSBpdCB3YXMuXG5leHBvcnQgY29uc3QgaXNTYW1lU2NyZWVucyA9IChcbiAgc2F2ZWQ6IHJlYWRvbmx5IFNhdmVkRGlzcGxheVtdLFxuICBjdXJyZW50OiByZWFkb25seSBEaXNwbGF5UmVjb3JkW10sXG4pID0+XG4gIHNhdmVkLmxlbmd0aCA9PT0gY3VycmVudC5sZW5ndGggJiZcbiAgc2F2ZWQuZXZlcnkoKGRpc3BsYXkpID0+XG4gICAgY3VycmVudC5zb21lKChpdCkgPT4gaXNTYW1lQm91bmRzKGl0LmJvdW5kcy5nZXQoKSwgZGlzcGxheS5ib3VuZHMpKSxcbiAgKTtcblxuLy8gV2hhdCB0byBjYWxsIGEgc2NyZWVuIHRvIHRoZSB1c2VyOiBpdHMgb3duIG5hbWUsIG9yIGl0cyBwbGFjZSBhbW9uZyB0aGUgc2NyZWVucy5cbmV4cG9ydCBjb25zdCBuYW1lT2ZTY3JlZW4gPSAobGFiZWw6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT5cbiAgbGFiZWwgfHwgYFNjcmVlbiAke2luZGV4ICsgMX1gO1xuIiwgImltcG9ydCB7IGdldEluamVjdGFibGUyIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcbmltcG9ydCB7IHJ1bkluQWN0aW9uIH0gZnJvbSBcIm1vYnhcIjtcbmltcG9ydCB7IHNhdmVkV2luZG93TGF5b3V0c0J1bmNoIH0gZnJvbSBcIi4vc2F2ZWQtd2luZG93LWxheW91dHMuaW5qZWN0YWJsZVwiO1xuXG5leHBvcnQgdHlwZSBSZW5hbWVSZXN1bHQgPSBcInJlbmFtZWRcIiB8IFwibmFtZS10YWtlblwiIHwgXCJub3QtZm91bmRcIjtcblxuLy8gUmVuYW1lcyBhIGxheW91dCwga2VlcGluZyB3aGF0IGl0IGhvbGRzIGFuZCB3aGVuIGl0IHdhcyBzYXZlZC4gTmV2ZXIgcmVwbGFjZXMgYW5vdGhlciBsYXlvdXQuXG5leHBvcnQgY29uc3QgcmVuYW1lV2luZG93TGF5b3V0SW5qZWN0YWJsZSA9IGdldEluamVjdGFibGUyKHtcbiAgaWQ6IFwid2luZG93LW1hbmFnZXIucmVuYW1lLXdpbmRvdy1sYXlvdXRcIixcblxuICBpbnN0YW50aWF0ZTogKGRpKSA9PiB7XG4gICAgY29uc3QgZ2V0U2F2ZWRMYXlvdXRzID0gZGkuaW5qZWN0KHNhdmVkV2luZG93TGF5b3V0c0J1bmNoLnBlcnNpc3RhYmxlKTtcblxuICAgIHJldHVybiAoKSA9PlxuICAgICAgYXN5bmMgKGZyb206IHN0cmluZywgdG86IHN0cmluZyk6IFByb21pc2U8UmVuYW1lUmVzdWx0PiA9PiB7XG4gICAgICAgIGNvbnN0IHNhdmVkTGF5b3V0cyA9IGF3YWl0IGdldFNhdmVkTGF5b3V0cygpO1xuICAgICAgICBjb25zdCBsYXlvdXQgPSBzYXZlZExheW91dHMuZ2V0KGZyb20pO1xuXG4gICAgICAgIGlmICghbGF5b3V0KSB7XG4gICAgICAgICAgcmV0dXJuIFwibm90LWZvdW5kXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodG8gIT09IGZyb20gJiYgc2F2ZWRMYXlvdXRzLmhhcyh0bykpIHtcbiAgICAgICAgICByZXR1cm4gXCJuYW1lLXRha2VuXCI7XG4gICAgICAgIH1cblxuICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgc2F2ZWRMYXlvdXRzLmRlbGV0ZShmcm9tKTtcbiAgICAgICAgICBzYXZlZExheW91dHMuc2V0KHRvLCB7IC4uLmxheW91dCwgbmFtZTogdG8gfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBcInJlbmFtZWRcIjtcbiAgICAgIH07XG4gIH0sXG59KTtcbiIsICJpbXBvcnQgeyBnZXRJbmplY3RhYmxlMiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQge1xuICBkZXNjcmliZUNsb3NlZFdpbmRvd0luamVjdGlvblRva2VuLFxuICB0eXBlIFdpbmRvd1Jlb3BlbmluZyxcbn0gZnJvbSBcIkBrOHNsZW5zL3dpbmRvdy1sYXlvdXQtY29udHJhY3RzXCI7XG5pbXBvcnQgdHlwZSB7IFBsYW5uZWRXaW5kb3cgfSBmcm9tIFwiLi90aWxpbmctcGxhblwiO1xuaW1wb3J0IHsgd2luZG93UmVvcGVuaW5nc0J1bmNoIH0gZnJvbSBcIi4vd2luZG93LXJlb3BlbmluZ3MuaW5qZWN0YWJsZVwiO1xuXG4vLyBIb3cgdG8gb3BlbiBhIHdpbmRvdyBub3Qgb3BlbiBhZ2FpbiwgYXNrZWQgYXQgdGhlIG1vbWVudCBpdCBpcyBuZWVkZWQ6IGFzIExlbnMgZGVzY3JpYmVkIGl0IGFzIGl0XG4vLyBjbG9zZWQsIGJ5IHRoZSBpZCBpdCBoYWQgd2hpbGUgb3BlbjsgZm9yIGEgd2luZG93IGNsb3NlZCBiZWZvcmUgTGVucyBkaWQgc28sIGFzIHRoaXMgZXh0ZW5zaW9uXG4vLyBsYXN0IGRlc2NyaWJlZCBpdCB3aGlsZSBpdCB3YXMgb3Blbi5cbmV4cG9ydCBjb25zdCByZW9wZW5pbmdPZkNsb3NlZFdpbmRvd0luamVjdGFibGUgPSBnZXRJbmplY3RhYmxlMih7XG4gIGlkOiBcIndpbmRvdy1tYW5hZ2VyLnJlb3BlbmluZy1vZi1jbG9zZWQtd2luZG93XCIsXG4gIGNvbnN1bXB0aW9uczogW2Rlc2NyaWJlQ2xvc2VkV2luZG93SW5qZWN0aW9uVG9rZW5dLFxuXG4gIGluc3RhbnRpYXRlOiAoZGkpID0+IHtcbiAgICBjb25zdCBkZXNjcmliZUNsb3NlZFdpbmRvdyA9IGRpLmluamVjdChcbiAgICAgIGRlc2NyaWJlQ2xvc2VkV2luZG93SW5qZWN0aW9uVG9rZW4sXG4gICAgKSgpO1xuICAgIC8vIFJlYWQgb25seSwgbmV2ZXIgd3JpdHRlbiBhbnkgbW9yZTsgc2VlIHRoZSBidW5jaC5cbiAgICBjb25zdCBnZXRMZWdhY3lSZW9wZW5pbmdzID0gZGkuaW5qZWN0KHdpbmRvd1Jlb3BlbmluZ3NCdW5jaC5wZXJzaXN0YWJsZSk7XG5cbiAgICByZXR1cm4gKCkgPT5cbiAgICAgIGFzeW5jIChcbiAgICAgICAgd2luZG93OiBQaWNrPFBsYW5uZWRXaW5kb3csIFwia2V5XCIgfCBcImNsb3NlZFwiPixcbiAgICAgICk6IFByb21pc2U8V2luZG93UmVvcGVuaW5nIHwgdW5kZWZpbmVkPiA9PlxuICAgICAgICAod2luZG93LmNsb3NlZCAmJiAoYXdhaXQgZGVzY3JpYmVDbG9zZWRXaW5kb3cod2luZG93LmNsb3NlZCkpKSA/P1xuICAgICAgICAoYXdhaXQgZ2V0TGVnYWN5UmVvcGVuaW5ncygpKS5nZXQod2luZG93LmtleSk7XG4gIH0sXG59KTtcbiIsICJpbXBvcnQgeyBnZXRQZXJzaXN0YWJsZU1hcEluamVjdGFibGVCdW5jaCB9IGZyb20gXCJAazhzbGVucy9wZXJzaXN0YWJsZS1jb250cmFjdHNcIjtcbmltcG9ydCB0eXBlIHsgV2luZG93UmVvcGVuaW5nIH0gZnJvbSBcIkBrOHNsZW5zL3dpbmRvdy1sYXlvdXQtY29udHJhY3RzXCI7XG5cbi8vIEhvdyB0byBvcGVuIGV2ZXJ5IHdpbmRvdyBvZiBMZW5zIGFnYWluLCBieSBpdHMga2V5IGluIHRoZSB0aWxpbmcsIGFzIHRoaXMgZXh0ZW5zaW9uIGxhc3QgZGVzY3JpYmVkXG4vLyBpdCB3aGlsZSBpdCB3YXMgb3BlbiwgYmVmb3JlIExlbnMgZGVzY3JpYmVkIGVhY2ggd2luZG93IGFzIGl0IGNsb3Nlcy4gUmVhZCBvbmx5LCBmb3IgYSB3aW5kb3dcbi8vIGNsb3NlZCBiZWZvcmUgdGhlbjsgbmV2ZXIgd3JpdHRlbiBhbnkgbW9yZS4gVE9ETzogZHJvcCB0aGlzIGJ1bmNoIGluIGEgbGF0ZXIgcmVsZWFzZSwgb25jZSB3aW5kb3dzXG4vLyBjbG9zZWQgYmVmb3JlIExlbnMgZGVzY3JpYmVkIGNsb3NlZCB3aW5kb3dzIGFyZSBwYXN0IHRoZSAxODAgZGF5cyBMZW5zIGtlZXBzIHRoZW0gZm9yLlxuZXhwb3J0IGNvbnN0IHdpbmRvd1Jlb3BlbmluZ3NCdW5jaCA9IGdldFBlcnNpc3RhYmxlTWFwSW5qZWN0YWJsZUJ1bmNoPFxuICBzdHJpbmcsXG4gIFdpbmRvd1Jlb3BlbmluZ1xuPigpKHtcbiAgaWQ6IFwid2luZG93LXJlb3BlbmluZ3NcIixcbn0pO1xuIiwgImltcG9ydCB7IGdldEluamVjdGFibGUyIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcbmltcG9ydCB7XG4gIGRpc3BsYXlSZWNvcmRzSW5qZWN0aW9uVG9rZW4sXG4gIHdpbmRvd1JlY29yZHNJbmplY3Rpb25Ub2tlbixcbn0gZnJvbSBcIkBrOHNsZW5zL3dpbmRvdy1sYXlvdXQtY29udHJhY3RzXCI7XG5pbXBvcnQgeyBpc0FwcGxpY2F0aW9uV2luZG93IH0gZnJvbSBcIkBrOHNsZW5zL21lc3NhZ2luZy1jb250cmFjdHNcIjtcbmltcG9ydCB7IHJ1bkluQWN0aW9uIH0gZnJvbSBcIm1vYnhcIjtcbmltcG9ydCB7IHNhdmVkV2luZG93T2ZLZXksIHRvU2F2ZWRUaWxpbmcgfSBmcm9tIFwiLi9sYXlvdXQtdGlsaW5nXCI7XG5pbXBvcnQge1xuICBzYXZlZFdpbmRvd0xheW91dHNCdW5jaCxcbiAgdHlwZSBTYXZlZFdpbmRvdyxcbn0gZnJvbSBcIi4vc2F2ZWQtd2luZG93LWxheW91dHMuaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgdG9TYXZlZERpc3BsYXkgfSBmcm9tIFwiLi9zY3JlZW5zXCI7XG5pbXBvcnQge1xuICBib3VuZHNJbkdyaWQsXG4gIGtleU9mV2luZG93LFxuICByZXNvbHZlVGlsaW5nUGxhbixcbiAgd2luZG93T2ZLZXksXG4gIHR5cGUgUGxhY2VkV2luZG93LFxuICB0eXBlIFBsYW5uZWRTY3JlZW4sXG4gIHR5cGUgUGxhbm5lZFdpbmRvdyxcbn0gZnJvbSBcIi4vdGlsaW5nLXBsYW5cIjtcbmltcG9ydCB7IHJlb3BlbmluZ09mQ2xvc2VkV2luZG93SW5qZWN0YWJsZSB9IGZyb20gXCIuL3Jlb3BlbmluZy1vZi1jbG9zZWQtd2luZG93LmluamVjdGFibGVcIjtcbmltcG9ydCB7IHN0b3JlZFRpbGluZ1BsYW5CdW5jaCB9IGZyb20gXCIuL3RpbGluZy1wbGFuLmluamVjdGFibGVcIjtcblxuLy8gU2F2ZXMgd2hlcmUgZXZlcnkgb3BlbiB3aW5kb3cgaXMgYW5kIGhvdyBpdCBzaG93cywgd2hhdCBpdCBkb2VzIHNvIGl0IGNhbiBiZSBvcGVuZWQgYWdhaW4gb25jZVxuLy8gY2xvc2VkLCB0aGUgc2NyZWVucyB0aGV5IGFyZSBvbiwgYW5kIHRoZSB0aWxpbmcgc2V0dXAgYXMgaXQgaXMgbm93LCB1bmRlciB0aGUgbmFtZSwgcmVwbGFjaW5nIGFcbi8vIGxheW91dCBvZiB0aGUgc2FtZSBuYW1lLiBBIHdpbmRvdyBvZiB0aGF0IGxheW91dCBub3Qgb3BlbiBub3cgc3RheXMgaW4gaXQgYXMgaXQgd2FzIGtlcHQsIGl0c1xuLy8gdGlsZSB3aXRoIGl0OiBvbmx5IHRha2luZyBpdCBvdXQgb2YgdGhlIGxheW91dCBkcm9wcyBpdC5cbmV4cG9ydCBjb25zdCBzYXZlV2luZG93TGF5b3V0SW5qZWN0YWJsZSA9IGdldEluamVjdGFibGUyKHtcbiAgaWQ6IFwid2luZG93LW1hbmFnZXIuc2F2ZS13aW5kb3ctbGF5b3V0XCIsXG4gIGNvbnN1bXB0aW9uczogW3dpbmRvd1JlY29yZHNJbmplY3Rpb25Ub2tlbiwgZGlzcGxheVJlY29yZHNJbmplY3Rpb25Ub2tlbl0sXG5cbiAgaW5zdGFudGlhdGU6IChkaSkgPT4ge1xuICAgIGNvbnN0IGdldFdpbmRvd1JlY29yZHMgPSBkaS5pbmplY3Qod2luZG93UmVjb3Jkc0luamVjdGlvblRva2VuKSgpO1xuICAgIGNvbnN0IGdldERpc3BsYXlSZWNvcmRzID0gZGkuaW5qZWN0KGRpc3BsYXlSZWNvcmRzSW5qZWN0aW9uVG9rZW4pKCk7XG4gICAgY29uc3QgZ2V0U2F2ZWRMYXlvdXRzID0gZGkuaW5qZWN0KHNhdmVkV2luZG93TGF5b3V0c0J1bmNoLnBlcnNpc3RhYmxlKTtcbiAgICBjb25zdCBnZXRTdG9yZWRUaWxpbmdQbGFuID0gZGkuaW5qZWN0KHN0b3JlZFRpbGluZ1BsYW5CdW5jaC5wZXJzaXN0YWJsZSk7XG4gICAgY29uc3QgcmVvcGVuaW5nT2ZDbG9zZWRXaW5kb3cgPSBkaS5pbmplY3QoXG4gICAgICByZW9wZW5pbmdPZkNsb3NlZFdpbmRvd0luamVjdGFibGUsXG4gICAgKSgpO1xuXG4gICAgcmV0dXJuICgpID0+IGFzeW5jIChcbiAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgIHtcbiAgICAgICAgLy8gV2hldGhlciB0byBzYXZlIG9ubHkgdGhlIHdpbmRvd3MgaW4gYSB0aWxlLCBvbiBhbnkgc2NyZWVuIG9mIHRoZSB0aWxpbmcsIGxlYXZpbmcgdGhlXG4gICAgICAgIC8vIHdpbmRvd3Mgbm90IHRpbGVkIG91dCBvZiB0aGUgbGF5b3V0LlxuICAgICAgICB0aWxlZE9ubHkgPSBmYWxzZSxcbiAgICAgIH06IHsgcmVhZG9ubHkgdGlsZWRPbmx5PzogYm9vbGVhbiB9ID0ge30sXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBzYXZlZExheW91dHMgPSBhd2FpdCBnZXRTYXZlZExheW91dHMoKTtcbiAgICAgIGNvbnN0IGRpc3BsYXlzID0gYXdhaXQgZ2V0RGlzcGxheVJlY29yZHMoKTtcbiAgICAgIGNvbnN0IGFsbFJlY29yZHMgPSBhd2FpdCBnZXRXaW5kb3dSZWNvcmRzKCk7XG4gICAgICBjb25zdCBwbGFuID0gcmVzb2x2ZVRpbGluZ1BsYW4oXG4gICAgICAgIGFsbFJlY29yZHMsXG4gICAgICAgIGRpc3BsYXlzLFxuICAgICAgICAoYXdhaXQgZ2V0U3RvcmVkVGlsaW5nUGxhbigpKS5nZXQoKSA/PyB1bmRlZmluZWQsXG4gICAgICApO1xuICAgICAgY29uc3QgdGlsZWRLZXlzID0gbmV3IFNldChcbiAgICAgICAgcGxhbi5zY3JlZW5zLmZsYXRNYXAoKHNjcmVlbikgPT4gc2NyZWVuLndpbmRvd3MubWFwKChpdCkgPT4gaXQua2V5KSksXG4gICAgICApO1xuICAgICAgY29uc3QgcmVjb3JkcyA9IGFsbFJlY29yZHMuZmlsdGVyKFxuICAgICAgICAocmVjb3JkKSA9PiAhdGlsZWRPbmx5IHx8IHRpbGVkS2V5cy5oYXMoa2V5T2ZXaW5kb3cocmVjb3JkLndpbmRvdykpLFxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc2F2ZWRXaW5kb3dzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHJlY29yZHMubWFwKGFzeW5jIChyZWNvcmQpOiBQcm9taXNlPFNhdmVkV2luZG93PiA9PiB7XG4gICAgICAgICAgY29uc3QgcmVvcGVuaW5nID0gYXdhaXQgcmVjb3JkLmRlc2NyaWJlUmVvcGVuaW5nKCk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd2luZG93OiBpc0FwcGxpY2F0aW9uV2luZG93KHJlY29yZC53aW5kb3cpXG4gICAgICAgICAgICAgID8gcmVjb3JkLndpbmRvd1xuICAgICAgICAgICAgICA6IHsga2luZDogcmVjb3JkLndpbmRvdy5raW5kLCBpZDogcmVjb3JkLndpbmRvdy5pZCB9LFxuICAgICAgICAgICAgdGl0bGU6IHJlY29yZC50aXRsZS5nZXQoKSxcbiAgICAgICAgICAgIC4uLihyZW9wZW5pbmcgPyB7IHJlb3BlbmluZyB9IDoge30pLFxuICAgICAgICAgICAgbm9ybWFsQm91bmRzOiB7IC4uLnJlY29yZC5ub3JtYWxCb3VuZHMuZ2V0KCkgfSxcbiAgICAgICAgICAgIHN0YXRlOiByZWNvcmQuc3RhdGUuZ2V0KCksXG4gICAgICAgICAgICBpc0ZvY3VzZWQ6IHJlY29yZC5pc0ZvY3VzZWQuZ2V0KCksXG4gICAgICAgICAgICBkaXNwbGF5SWQ6IHJlY29yZC5kaXNwbGF5SWQuZ2V0KCksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICBjb25zdCBwcmV2aW91cyA9IHNhdmVkTGF5b3V0cy5nZXQobmFtZSk7XG4gICAgICBjb25zdCBvcGVuS2V5cyA9IG5ldyBTZXQoXG4gICAgICAgIGFsbFJlY29yZHMubWFwKChyZWNvcmQpID0+IGtleU9mV2luZG93KHJlY29yZC53aW5kb3cpKSxcbiAgICAgICk7XG5cbiAgICAgIC8vIFRoZSB3aW5kb3dzIG5vdCBvcGVuIG5vdywgYnkgdGhlIGtleSB0aGVpciB0aWxlcyBnbyBieTogb25lIG9mIHRoZSBsYXlvdXQncyBhcyBpdCBrZXB0IGl0LFxuICAgICAgLy8gb25lIG1pc3Npbmcgc2luY2UgdGhlIGxheW91dCB3YXMgc2hvd24gZ29pbmcgYnkgaXRzIHBsYWNlIGluIHRoZSBsYXlvdXQsIG9uZSBjbG9zZWQgc2luY2UgYnlcbiAgICAgIC8vIGl0cyBvd24ga2V5OyBvbmUgdGhlIGxheW91dCBoYXMgbm90LCBvcGVuZWQgc2luY2UgYW5kIGNsb3NlZCBhZ2FpbiwgYXMgTGVucyBkZXNjcmliZWQgaXQgYXNcbiAgICAgIC8vIGl0IGNsb3NlZCwgcGxhY2VkIHdoZXJlIGl0cyB0aWxlIGlzLCBzbyB0aGF0IGl0IGlzIHNhdmVkIHRvby5cbiAgICAgIGNvbnN0IG5vdE9wZW5Gb3VuZCA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBbXG4gICAgICAgICAgLi4ucGxhbi5zY3JlZW5zLmZsYXRNYXAoKHNjcmVlbikgPT5cbiAgICAgICAgICAgIHNjcmVlbi53aW5kb3dzLm1hcChcbiAgICAgICAgICAgICAgKHdpbmRvdyk6IHsgd2luZG93OiBQbGFubmVkV2luZG93OyBzY3JlZW4/OiBQbGFubmVkU2NyZWVuIH0gPT4gKHtcbiAgICAgICAgICAgICAgICB3aW5kb3csXG4gICAgICAgICAgICAgICAgc2NyZWVuLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgICAuLi5wbGFuLnVudGlsZWQubWFwKFxuICAgICAgICAgICAgKHdpbmRvdyk6IHsgd2luZG93OiBQbGFubmVkV2luZG93OyBzY3JlZW4/OiBQbGFubmVkU2NyZWVuIH0gPT4gKHtcbiAgICAgICAgICAgICAgd2luZG93LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKSxcbiAgICAgICAgXVxuICAgICAgICAgIC5maWx0ZXIoKHsgd2luZG93IH0pID0+IHdpbmRvdy5taXNzaW5nKVxuICAgICAgICAgIC5maWx0ZXIoKHsgc2NyZWVuIH0pID0+ICF0aWxlZE9ubHkgfHwgISFzY3JlZW4pXG4gICAgICAgICAgLm1hcChcbiAgICAgICAgICAgIGFzeW5jICh7XG4gICAgICAgICAgICAgIHdpbmRvdyxcbiAgICAgICAgICAgICAgc2NyZWVuLFxuICAgICAgICAgICAgfSk6IFByb21pc2U8eyBrZXk6IHN0cmluZzsga2VwdDogU2F2ZWRXaW5kb3cgfVtdPiA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHsga2V5LCByZWNvcmQsIGNsb3NlZCwgLi4ucGxhY2VkIH0gPSB3aW5kb3c7XG4gICAgICAgICAgICAgIGNvbnN0IGtlcHQgPSBzYXZlZFdpbmRvd09mS2V5KHByZXZpb3VzPy53aW5kb3dzID8/IFtdLCBrZXkpO1xuXG4gICAgICAgICAgICAgIC8vIEEgd2luZG93IG9wZW4gaXMgc2F2ZWQgYXMgaXQgaXMsIG9uY2UuXG4gICAgICAgICAgICAgIGlmIChrZXB0ICYmIG9wZW5LZXlzLmhhcyhrZXlPZldpbmRvdyhrZXB0LndpbmRvdykpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGtlcHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3sga2V5LCBrZXB0IH1dO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKCFzY3JlZW4gfHwgc2NyZWVuLm1pc3NpbmcgfHwgIShcImNvbHVtblwiIGluIHBsYWNlZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCByZW9wZW5pbmcgPSBhd2FpdCByZW9wZW5pbmdPZkNsb3NlZFdpbmRvdyh3aW5kb3cpO1xuXG4gICAgICAgICAgICAgIGlmICghcmVvcGVuaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICBrZXB0OiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSB3aW5kb3cgaXRzZWxmLCBub3Qgd2hhdCBzdGFuZHMgaW4gZm9yIGl0IHdoaWxlIGl0IGlzIG5vdCBvcGVuLlxuICAgICAgICAgICAgICAgICAgICB3aW5kb3c6IGNsb3NlZCA/PyB3aW5kb3dPZktleShrZXkpLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogcmVjb3JkLnRpdGxlLmdldCgpLFxuICAgICAgICAgICAgICAgICAgICByZW9wZW5pbmcsXG4gICAgICAgICAgICAgICAgICAgIG5vcm1hbEJvdW5kczogYm91bmRzSW5HcmlkKFxuICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbi5kaXNwbGF5LndvcmtBcmVhLmdldCgpLFxuICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbi5jb2x1bW5zLFxuICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbi5yb3dzLFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnBsYWNlZCxcbiAgICAgICAgICAgICAgICAgICAgICB9IGFzIFBsYWNlZFdpbmRvdyxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IFwibm9ybWFsXCIsXG4gICAgICAgICAgICAgICAgICAgIGlzRm9jdXNlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlJZDogc2NyZWVuLmRpc3BsYXkuaWQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICksXG4gICAgICApO1xuXG4gICAgICBjb25zdCBub3RPcGVuID0gbm90T3BlbkZvdW5kLmZsYXQoKTtcblxuICAgICAgY29uc3Qgd2luZG93cyA9IFsuLi5zYXZlZFdpbmRvd3MsIC4uLm5vdE9wZW4ubWFwKCh7IGtlcHQgfSkgPT4ga2VwdCldO1xuXG4gICAgICBjb25zdCBpbmRleEJ5S2V5ID0gbmV3IE1hcChbXG4gICAgICAgIC4uLnJlY29yZHMubWFwKFxuICAgICAgICAgIChyZWNvcmQsIGluZGV4KSA9PiBba2V5T2ZXaW5kb3cocmVjb3JkLndpbmRvdyksIGluZGV4XSBhcyBjb25zdCxcbiAgICAgICAgKSxcbiAgICAgICAgLi4ubm90T3Blbi5tYXAoXG4gICAgICAgICAgKHsga2V5IH0sIGluZGV4KSA9PiBba2V5LCBzYXZlZFdpbmRvd3MubGVuZ3RoICsgaW5kZXhdIGFzIGNvbnN0LFxuICAgICAgICApLFxuICAgICAgXSk7XG5cbiAgICAgIGNvbnN0IHRpbGluZyA9IHRvU2F2ZWRUaWxpbmcocGxhbiwgaW5kZXhCeUtleSk7XG5cbiAgICAgIHJ1bkluQWN0aW9uKCgpID0+XG4gICAgICAgIHNhdmVkTGF5b3V0cy5zZXQobmFtZSwge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgc2F2ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgICB3aW5kb3dzLFxuICAgICAgICAgIGRpc3BsYXlzOiBkaXNwbGF5cy5tYXAodG9TYXZlZERpc3BsYXkpLFxuICAgICAgICAgIHRpbGluZyxcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gd2luZG93cy5sZW5ndGg7XG4gICAgfTtcbiAgfSxcbn0pO1xuIiwgImltcG9ydCB7IGdldEluamVjdGFibGUyIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcbmltcG9ydCB7XG4gIGRpc3BsYXlSZWNvcmRzSW5qZWN0aW9uVG9rZW4sXG4gIGZvY3VzV2luZG93SW5qZWN0aW9uVG9rZW4sXG4gIHNldFdpbmRvd0JvdW5kc0luamVjdGlvblRva2VuLFxuICBzZXRXaW5kb3dTdGF0ZUluamVjdGlvblRva2VuLFxuICB3aW5kb3dSZWNvcmRzSW5qZWN0aW9uVG9rZW4sXG4gIHR5cGUgV2luZG93UGxhY2VtZW50LFxufSBmcm9tIFwiQGs4c2xlbnMvd2luZG93LWxheW91dC1jb250cmFjdHNcIjtcbmltcG9ydCB7IGJvdW5kc0luR3JpZCwgcmVzb2x2ZVRpbGluZ1BsYW4gfSBmcm9tIFwiLi90aWxpbmctcGxhblwiO1xuaW1wb3J0IHsgc3RvcmVkVGlsaW5nUGxhbkJ1bmNoIH0gZnJvbSBcIi4vdGlsaW5nLXBsYW4uaW5qZWN0YWJsZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpbGVSZXN1bHQge1xuICByZWFkb25seSB3aW5kb3dzOiBudW1iZXI7XG4gIHJlYWRvbmx5IGRpc3BsYXlzOiBudW1iZXI7XG4gIC8vIFRoZSBzY3JlZW5zIHdpbmRvd3Mgd2VyZSB0aWxlZCBvbi5cbiAgcmVhZG9ubHkgZGlzcGxheXNUaWxlZDogbnVtYmVyO1xuICByZWFkb25seSBwbGFjZWQ6IG51bWJlcjtcbn1cblxuLy8gVGlsZXMgdGhlIHdpbmRvd3MgYXMgdGhlIHRpbGluZyBwbGFuIHNheXM6IGVhY2ggb3ZlciB0aGUgY2VsbHMgaXQgc3BhbnMgaW4gaXRzIHNjcmVlbidzIGdyaWQsIGluXG4vLyB0aGUgcGxhbidzIG9yZGVyLiBBIHdpbmRvdyBtYXhpbWl6ZWQsIG1pbmltaXplZCBvciBmdWxsIHNjcmVlbiBzaG93cyBub3JtYWxseSBhZ2FpbiBmaXJzdCwgc28gaXRcbi8vIGNhbiBiZSBwbGFjZWQuIFdpbmRvd3MgdGhlIHBsYW4gbGVhdmVzIGFzIHRoZXkgYXJlIHN0YXkgc28uIEJyaW5ncyB0aGUgdGlsZWQgd2luZG93cyB0byB0aGVcbi8vIGZyb250LCB0aGUgb25lIHRoYXQgaGFkIGZvY3VzIGxhc3Qgc28gaXQga2VlcHMgaXQuXG5leHBvcnQgY29uc3QgdGlsZVdpbmRvd3NJbmplY3RhYmxlID0gZ2V0SW5qZWN0YWJsZTIoe1xuICBpZDogXCJ3aW5kb3ctbWFuYWdlci50aWxlLXdpbmRvd3NcIixcbiAgY29uc3VtcHRpb25zOiBbXG4gICAgd2luZG93UmVjb3Jkc0luamVjdGlvblRva2VuLFxuICAgIGRpc3BsYXlSZWNvcmRzSW5qZWN0aW9uVG9rZW4sXG4gICAgc2V0V2luZG93Qm91bmRzSW5qZWN0aW9uVG9rZW4sXG4gICAgc2V0V2luZG93U3RhdGVJbmplY3Rpb25Ub2tlbixcbiAgICBmb2N1c1dpbmRvd0luamVjdGlvblRva2VuLFxuICBdLFxuXG4gIGluc3RhbnRpYXRlOiAoZGkpID0+IHtcbiAgICBjb25zdCBnZXRXaW5kb3dSZWNvcmRzID0gZGkuaW5qZWN0KHdpbmRvd1JlY29yZHNJbmplY3Rpb25Ub2tlbikoKTtcbiAgICBjb25zdCBnZXREaXNwbGF5UmVjb3JkcyA9IGRpLmluamVjdChkaXNwbGF5UmVjb3Jkc0luamVjdGlvblRva2VuKSgpO1xuICAgIGNvbnN0IHNldFdpbmRvd0JvdW5kcyA9IGRpLmluamVjdChzZXRXaW5kb3dCb3VuZHNJbmplY3Rpb25Ub2tlbikoKTtcbiAgICBjb25zdCBzZXRXaW5kb3dTdGF0ZSA9IGRpLmluamVjdChzZXRXaW5kb3dTdGF0ZUluamVjdGlvblRva2VuKSgpO1xuICAgIGNvbnN0IGZvY3VzV2luZG93ID0gZGkuaW5qZWN0KGZvY3VzV2luZG93SW5qZWN0aW9uVG9rZW4pKCk7XG4gICAgY29uc3QgZ2V0U3RvcmVkUGxhbiA9IGRpLmluamVjdChzdG9yZWRUaWxpbmdQbGFuQnVuY2gucGVyc2lzdGFibGUpO1xuXG4gICAgY29uc3QgdGlsZVdpbmRvd3MgPSBhc3luYyAoKTogUHJvbWlzZTxUaWxlUmVzdWx0PiA9PiB7XG4gICAgICBjb25zdCBhbGxEaXNwbGF5cyA9IGF3YWl0IGdldERpc3BsYXlSZWNvcmRzKCk7XG4gICAgICBjb25zdCBhbGxXaW5kb3dzID0gYXdhaXQgZ2V0V2luZG93UmVjb3JkcygpO1xuICAgICAgY29uc3QgcGxhbiA9IHJlc29sdmVUaWxpbmdQbGFuKFxuICAgICAgICBhbGxXaW5kb3dzLFxuICAgICAgICBhbGxEaXNwbGF5cyxcbiAgICAgICAgKGF3YWl0IGdldFN0b3JlZFBsYW4oKSkuZ2V0KCkgPz8gdW5kZWZpbmVkLFxuICAgICAgKTtcbiAgICAgIC8vIEEgc2NyZWVuIG5vdCBjb25uZWN0ZWQgaXMgbm90IHRpbGVkOyBpdHMgd2luZG93cyBzdGF5IHdoZXJlIHRoZXkgYXJlLlxuICAgICAgLy8gTm9yIGlzIGEgd2luZG93IG5vdCBvcGVuLlxuICAgICAgY29uc3Qgc2NyZWVucyA9IHBsYW4uc2NyZWVuc1xuICAgICAgICAuZmlsdGVyKChzY3JlZW4pID0+ICFzY3JlZW4ubWlzc2luZylcbiAgICAgICAgLm1hcCgoc2NyZWVuKSA9PiAoe1xuICAgICAgICAgIC4uLnNjcmVlbixcbiAgICAgICAgICB3aW5kb3dzOiBzY3JlZW4ud2luZG93cy5maWx0ZXIoKGl0KSA9PiAhaXQubWlzc2luZyksXG4gICAgICAgIH0pKVxuICAgICAgICAuZmlsdGVyKChzY3JlZW4pID0+IHNjcmVlbi53aW5kb3dzLmxlbmd0aCA+IDApO1xuICAgICAgY29uc3QgdGlsZWQgPSBzY3JlZW5zLmZsYXRNYXAoKHNjcmVlbikgPT5cbiAgICAgICAgc2NyZWVuLndpbmRvd3MubWFwKChpdCkgPT4gaXQucmVjb3JkKSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHBsYWNlbWVudHM6IFdpbmRvd1BsYWNlbWVudFtdID0gc2NyZWVucy5mbGF0TWFwKChzY3JlZW4pID0+XG4gICAgICAgIHNjcmVlbi53aW5kb3dzLm1hcCgoaXQpID0+ICh7XG4gICAgICAgICAgd2luZG93OiBpdC5yZWNvcmQud2luZG93LFxuICAgICAgICAgIGJvdW5kczogYm91bmRzSW5HcmlkKFxuICAgICAgICAgICAgc2NyZWVuLmRpc3BsYXkud29ya0FyZWEuZ2V0KCksXG4gICAgICAgICAgICBzY3JlZW4uY29sdW1ucyxcbiAgICAgICAgICAgIHNjcmVlbi5yb3dzLFxuICAgICAgICAgICAgaXQsXG4gICAgICAgICAgKSxcbiAgICAgICAgfSkpLFxuICAgICAgKTtcblxuICAgICAgLy8gUmVhZCBiZWZvcmUgcGxhY2luZywgd2hpY2ggbWF5IG1vdmUgdGhlIGZvY3VzLlxuICAgICAgY29uc3QgdG9Gcm9udCA9IFsuLi50aWxlZF0uc29ydChcbiAgICAgICAgKGEsIGIpID0+IE51bWJlcihhLmlzRm9jdXNlZC5nZXQoKSkgLSBOdW1iZXIoYi5pc0ZvY3VzZWQuZ2V0KCkpLFxuICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCB3aW5kb3cgb2YgdGlsZWQpIHtcbiAgICAgICAgaWYgKHdpbmRvdy5zdGF0ZS5nZXQoKSAhPT0gXCJub3JtYWxcIikge1xuICAgICAgICAgIGF3YWl0IHNldFdpbmRvd1N0YXRlKHdpbmRvdy53aW5kb3csIFwibm9ybWFsXCIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHNldFdpbmRvd0JvdW5kcyhwbGFjZW1lbnRzKTtcblxuICAgICAgZm9yIChjb25zdCB3aW5kb3cgb2YgdG9Gcm9udCkge1xuICAgICAgICBhd2FpdCBmb2N1c1dpbmRvdyh3aW5kb3cud2luZG93KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd2luZG93czogYWxsV2luZG93cy5sZW5ndGgsXG4gICAgICAgIGRpc3BsYXlzOiBhbGxEaXNwbGF5cy5sZW5ndGgsXG4gICAgICAgIGRpc3BsYXlzVGlsZWQ6IHNjcmVlbnMubGVuZ3RoLFxuICAgICAgICBwbGFjZWQ6IHBsYWNlbWVudHMubGVuZ3RoLFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgcmV0dXJuICgpID0+IHRpbGVXaW5kb3dzO1xuICB9LFxufSk7XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0YWJsZTIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgY29tcHV0ZWQsIG9ic2VydmFibGUsIHJ1bkluQWN0aW9uLCB0eXBlIE9ic2VydmFibGVNYXAgfSBmcm9tIFwibW9ieFwiO1xuaW1wb3J0IHtcbiAgc2F2ZWRXaW5kb3dMYXlvdXRzQnVuY2gsXG4gIHR5cGUgU2F2ZWRXaW5kb3dMYXlvdXQsXG59IGZyb20gXCIuL3NhdmVkLXdpbmRvdy1sYXlvdXRzLmluamVjdGFibGVcIjtcblxuLy8gVGhlIHNhdmVkIGxheW91dHMsIG5ld2VzdCBmaXJzdCwgb3IgdW5kZWZpbmVkIHVudGlsIHRoZSBwZXJzaXN0ZWQgbWFwIGlzIHJlYWQuXG5leHBvcnQgY29uc3Qgd2luZG93TGF5b3V0TGlzdEluamVjdGFibGUgPSBnZXRJbmplY3RhYmxlMih7XG4gIGlkOiBcIndpbmRvdy1tYW5hZ2VyLndpbmRvdy1sYXlvdXQtbGlzdFwiLFxuXG4gIGluc3RhbnRpYXRlOiAoZGkpID0+IHtcbiAgICBjb25zdCBnZXRTYXZlZExheW91dHMgPSBkaS5pbmplY3Qoc2F2ZWRXaW5kb3dMYXlvdXRzQnVuY2gucGVyc2lzdGFibGUpO1xuICAgIGNvbnN0IHNhdmVkTGF5b3V0cyA9IG9ic2VydmFibGUuYm94PFxuICAgICAgT2JzZXJ2YWJsZU1hcDxzdHJpbmcsIFNhdmVkV2luZG93TGF5b3V0PiB8IHVuZGVmaW5lZFxuICAgID4odW5kZWZpbmVkLCB7XG4gICAgICBkZWVwOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIHZvaWQgZ2V0U2F2ZWRMYXlvdXRzKCkudGhlbigobGF5b3V0cykgPT5cbiAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHNhdmVkTGF5b3V0cy5zZXQobGF5b3V0cykpLFxuICAgICk7XG5cbiAgICBjb25zdCBsaXN0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgY29uc3QgbGF5b3V0cyA9IHNhdmVkTGF5b3V0cy5nZXQoKTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgbGF5b3V0cyAmJiBbLi4ubGF5b3V0cy52YWx1ZXMoKV0uc29ydCgoYSwgYikgPT4gYi5zYXZlZEF0IC0gYS5zYXZlZEF0KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiAoKSA9PiBsaXN0O1xuICB9LFxufSk7XG4iLCAiaW1wb3J0IHsgU3BhbiB9IGZyb20gXCJAazhzbGVucy9lbGVtZW50LWNvbXBvbmVudHNcIjtcbmltcG9ydCB7IERhbmdlckJ1dHRvbiwgUGxhaW5CdXR0b24gfSBmcm9tIFwiQGs4c2xlbnMvaW5wdXQtY29tcG9uZW50c1wiO1xuaW1wb3J0IHtcbiAgTW9kYWxDb250YWluZXIsXG4gIE1vZGFsQ29udGVudCxcbiAgTW9kYWxGb290ZXIsXG4gIE1vZGFsSGVhZGVyLFxufSBmcm9tIFwiQGs4c2xlbnMvbW9kYWwtY29tcG9uZW50c1wiO1xuaW1wb3J0IHtcbiAgZ2V0TW9kYWxJbmplY3RhYmxlQnVuY2gsXG4gIGdldE1vZGFsS2luZCxcbiAgdHlwZSBNb2RhbFByb3BzLFxuICB1c2VSZXNwb25kRnJvbU1vZGFsLFxufSBmcm9tIFwiQGs4c2xlbnMvbW9kYWwtY29udHJhY3RzXCI7XG5pbXBvcnQgeyBNb2RhbEVycm9yQm91bmRhcnkgfSBmcm9tIFwiLi9tb2RhbC1lcnJvci1ib3VuZGFyeVwiO1xuXG4vLyBBc2tzIHdoZXRoZXIgdG8gZGVsZXRlIHRoZSBsYXlvdXQgb2YgdGhlIG5hbWUsIGFuc3dlcmluZyB0cnVlIHRvIGRlbGV0ZSBpdC5cbmV4cG9ydCBjb25zdCBkZWxldGVMYXlvdXRNb2RhbEtpbmQgPSBnZXRNb2RhbEtpbmQ8W25hbWU6IHN0cmluZ10sIGJvb2xlYW4+KCkoXG4gIFwiZGVsZXRlLWxheW91dFwiLFxuKTtcblxuY29uc3QgRGVsZXRlTGF5b3V0TW9kYWwgPSAoe1xuICBpbnB1dDogW25hbWVdLFxufTogTW9kYWxQcm9wczx0eXBlb2YgZGVsZXRlTGF5b3V0TW9kYWxLaW5kPikgPT4ge1xuICBjb25zdCByZXNwb25kID0gdXNlUmVzcG9uZEZyb21Nb2RhbChkZWxldGVMYXlvdXRNb2RhbEtpbmQpO1xuXG4gIHJldHVybiAoXG4gICAgPE1vZGFsQ29udGFpbmVyXG4gICAgICAkc3R5bGU9e3sgd2lkdGg6IFwiY2FsYyh2YXIoLS11bml0KSAqIDkwKVwiLCBtYXhXaWR0aDogXCI5MHZ3XCIgfX1cbiAgICA+XG4gICAgICA8TW9kYWxIZWFkZXIgb25DbG9zZT17KCkgPT4gcmVzcG9uZChmYWxzZSl9PkRlbGV0ZSBsYXlvdXQ8L01vZGFsSGVhZGVyPlxuXG4gICAgICA8TW9kYWxDb250ZW50PlxuICAgICAgICA8U3Bhbj5cbiAgICAgICAgICBEZWxldGUgPFNwYW4gJGZvbnQ9e3sgYm9sZDogdHJ1ZSB9fT57bmFtZX08L1NwYW4+PyBXaGVyZSBpdHMgd2luZG93c1xuICAgICAgICAgIGdvIGFuZCBpdHMgdGlsaW5nIGFyZSBsb3N0LlxuICAgICAgICA8L1NwYW4+XG4gICAgICA8L01vZGFsQ29udGVudD5cblxuICAgICAgPE1vZGFsRm9vdGVyPlxuICAgICAgICA8UGxhaW5CdXR0b24gb25DbGljaz17KCkgPT4gcmVzcG9uZChmYWxzZSl9PkNhbmNlbDwvUGxhaW5CdXR0b24+XG4gICAgICAgIDxEYW5nZXJCdXR0b24gYXV0b0ZvY3VzIG9uQ2xpY2s9eygpID0+IHJlc3BvbmQodHJ1ZSl9PlxuICAgICAgICAgIERlbGV0ZVxuICAgICAgICA8L0RhbmdlckJ1dHRvbj5cbiAgICAgIDwvTW9kYWxGb290ZXI+XG4gICAgPC9Nb2RhbENvbnRhaW5lcj5cbiAgKTtcbn07XG5cbi8vIEFuc3dlcnMgbm8gd2hlbiB0aGUgZXh0ZW5zaW9uIHdhcyB1cGRhdGVkIHdoaWxlIGl0IHdhcyBvcGVuLCBzbyBub3RoaW5nIGlzIGRlbGV0ZWQgdW5hc2tlZC5cbmNvbnN0IE91dE9mRGF0ZU1vZGFsID0gKCkgPT4ge1xuICBjb25zdCByZXNwb25kID0gdXNlUmVzcG9uZEZyb21Nb2RhbChkZWxldGVMYXlvdXRNb2RhbEtpbmQpO1xuXG4gIHJldHVybiAoXG4gICAgPE1vZGFsQ29udGFpbmVyXG4gICAgICAkc3R5bGU9e3sgd2lkdGg6IFwiY2FsYyh2YXIoLS11bml0KSAqIDkwKVwiLCBtYXhXaWR0aDogXCI5MHZ3XCIgfX1cbiAgICA+XG4gICAgICA8TW9kYWxIZWFkZXIgb25DbG9zZT17KCkgPT4gcmVzcG9uZChmYWxzZSl9PkRlbGV0ZSBsYXlvdXQ8L01vZGFsSGVhZGVyPlxuICAgICAgPE1vZGFsQ29udGVudD5cbiAgICAgICAgPFNwYW4+XG4gICAgICAgICAgVGhpcyBkaWFsb2cgc3RvcHBlZCB3b3JraW5nLCBtb3N0IGxpa2VseSBiZWNhdXNlIHRoZSBleHRlbnNpb24gd2FzXG4gICAgICAgICAgdXBkYXRlZCB3aGlsZSBpdCB3YXMgb3Blbi5cbiAgICAgICAgPC9TcGFuPlxuICAgICAgPC9Nb2RhbENvbnRlbnQ+XG4gICAgICA8TW9kYWxGb290ZXI+XG4gICAgICAgIDxQbGFpbkJ1dHRvbiBvbkNsaWNrPXsoKSA9PiByZXNwb25kKGZhbHNlKX0+Q2xvc2U8L1BsYWluQnV0dG9uPlxuICAgICAgPC9Nb2RhbEZvb3Rlcj5cbiAgICA8L01vZGFsQ29udGFpbmVyPlxuICApO1xufTtcblxuY29uc3QgR3VhcmRlZERlbGV0ZUxheW91dE1vZGFsID0gKFxuICBwcm9wczogTW9kYWxQcm9wczx0eXBlb2YgZGVsZXRlTGF5b3V0TW9kYWxLaW5kPixcbikgPT4gKFxuICA8TW9kYWxFcnJvckJvdW5kYXJ5IGZhbGxiYWNrPXsoKSA9PiA8T3V0T2ZEYXRlTW9kYWwgLz59PlxuICAgIDxEZWxldGVMYXlvdXRNb2RhbCB7Li4ucHJvcHN9IC8+XG4gIDwvTW9kYWxFcnJvckJvdW5kYXJ5PlxuKTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZUxheW91dE1vZGFsQnVuY2ggPSBnZXRNb2RhbEluamVjdGFibGVCdW5jaCh7XG4gIGtpbmQ6IGRlbGV0ZUxheW91dE1vZGFsS2luZCxcbiAgQ29tcG9uZW50OiBHdWFyZGVkRGVsZXRlTGF5b3V0TW9kYWwsXG4gIG9uQ2xvc2U6ICgpID0+IGZhbHNlLFxufSk7XG4iLCAiaW1wb3J0IHsgQ29tcG9uZW50LCB0eXBlIFJlYWN0Tm9kZSB9IGZyb20gXCJyZWFjdFwiO1xuXG5pbnRlcmZhY2UgTW9kYWxFcnJvckJvdW5kYXJ5UHJvcHMge1xuICByZWFkb25seSBmYWxsYmFjazogKGVycm9yOiB1bmtub3duKSA9PiBSZWFjdE5vZGU7XG4gIHJlYWRvbmx5IGNoaWxkcmVuOiBSZWFjdE5vZGU7XG59XG5cbi8qKlxuICogS2VlcHMgYSBmYWlsdXJlIGluc2lkZSB0aGUgbW9kYWwgZnJvbSB0YWtpbmcgZG93biB0aGUgd2luZG93IGl0IGlzIHNob3duIGluLiBBIG1vZGFsIHN0YXlzIG9wZW5cbiAqIHdoaWxlIHRoZSBleHRlbnNpb24gaXMgcmVsb2FkZWQgdW5kZXIgaXQsIGFzIHdoZW4gaXQgaXMgcmVidWlsdCBkdXJpbmcgZGV2ZWxvcG1lbnQsIGFuZCB0aGVuXG4gKiByZW5kZXJzIHdpdGggaW5qZWN0YWJsZXMgbm8gbG9uZ2VyIHJlZ2lzdGVyZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2RhbEVycm9yQm91bmRhcnkgZXh0ZW5kcyBDb21wb25lbnQ8XG4gIE1vZGFsRXJyb3JCb3VuZGFyeVByb3BzLFxuICB7IGVycm9yPzogdW5rbm93bjsgZmFpbGVkOiBib29sZWFuIH1cbj4ge1xuICBzdGF0ZTogeyBlcnJvcj86IHVua25vd247IGZhaWxlZDogYm9vbGVhbiB9ID0geyBmYWlsZWQ6IGZhbHNlIH07XG5cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvcjogdW5rbm93bikge1xuICAgIHJldHVybiB7IGVycm9yLCBmYWlsZWQ6IHRydWUgfTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5mYWlsZWRcbiAgICAgID8gdGhpcy5wcm9wcy5mYWxsYmFjayh0aGlzLnN0YXRlLmVycm9yKVxuICAgICAgOiB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgQnV0dG9uLCBTcGFuIH0gZnJvbSBcIkBrOHNsZW5zL2VsZW1lbnQtY29tcG9uZW50c1wiO1xuaW1wb3J0IHtcbiAgZ2V0SG90YmFySXRlbUtpbmRJbmplY3RhYmxlQnVuY2gsXG4gIHR5cGUgSG90YmFySXRlbVByb3BzLFxufSBmcm9tIFwiQGs4c2xlbnMvaG90YmFyLWNvbnRyYWN0c1wiO1xuaW1wb3J0IHsgRGFzaGJvYXJkSWNvbiB9IGZyb20gXCJAazhzbGVucy9pY29uXCI7XG5pbXBvcnQgeyBkcm9wRG93bk1lbnUgfSBmcm9tIFwiQGs4c2xlbnMvZHJvcC1kb3duLW1lbnUtY29udHJhY3RzXCI7XG5pbXBvcnQgeyBnZXRJbmplY3RhYmxlMiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyB1c2VJbmplY3QgfSBmcm9tIFwiQGs4c2xlbnMvdXNlLWluamVjdFwiO1xuaW1wb3J0IHsgb2JzZXJ2ZXIgfSBmcm9tIFwibW9ieC1yZWFjdFwiO1xuaW1wb3J0IHsgbGF5b3V0SG90YmFySXRlbUtpbmQgfSBmcm9tIFwiLi4vbGF5b3V0cy9sYXlvdXQtaW4taG90YmFyLmluamVjdGFibGVcIjtcbmltcG9ydCB7IGxheW91dEhvdGJhck1lbnVLaW5kIH0gZnJvbSBcIi4vbGF5b3V0LWhvdGJhci1tZW51LmluamVjdGFibGVcIjtcbmltcG9ydCB7IHJlY2FsbEZyb21Ib3RiYXJJbmplY3RhYmxlIH0gZnJvbSBcIi4vcmVjYWxsLWZyb20taG90YmFyLmluamVjdGFibGVcIjtcbmltcG9ydCB7IHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUgfSBmcm9tIFwiLi93aW5kb3ctbGF5b3V0cy1tb2RlbC5pbmplY3RhYmxlXCI7XG5cbi8vIE9uZSBtZW51IHBlciBsYXlvdXQgcmF0aGVyIHRoYW4gb25lIHBlciByZW5kZXIsIHNvIHRoYXQgdGhlIGl0ZW0gaXMgbm90IGhhbmRlZCBhIG5ldyBtZW51IHRvXG4vLyBvcGVuIHdoZW5ldmVyIGl0IHJlbmRlcnMuIEJlc2lkZSB0aGUgaXRlbSwgY2VudHJlZCBvbiBpdCwgd2l0aCBhIGdhcCBzbWFsbCBlbm91Z2ggdGhhdCB0aGVcbi8vIHBvaW50ZXIgb24gaXRzIHdheSBpbnRvIHRoZSBtZW51IGRvZXMgbm90IGxlYXZlIGJvdGguXG5leHBvcnQgY29uc3QgbGF5b3V0TWVudU9mSXRlbUluamVjdGFibGUgPSBnZXRJbmplY3RhYmxlMih7XG4gIGlkOiBcIndpbmRvdy1tYW5hZ2VyLmxheW91dC1tZW51LW9mLWl0ZW1cIixcblxuICBpbnN0YW50aWF0ZTogKCkgPT4ge1xuICAgIGNvbnN0IG1lbnVzID0gbmV3IE1hcDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIG1lbnVPZj4+KCk7XG4gICAgY29uc3QgbWVudU9mID0gKG5hbWU6IHN0cmluZykgPT5cbiAgICAgIGRyb3BEb3duTWVudShsYXlvdXRIb3RiYXJNZW51S2luZCwge1xuICAgICAgICBkYXRhOiB7IG5hbWUgfSxcbiAgICAgICAgb3Blbk9uOiBcImhvdmVyXCIsXG4gICAgICAgIHBvc2l0aW9uOiBcInJpZ2h0XCIsXG4gICAgICAgIGdhcDogXCJ4eHNcIixcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IG1lbnUgPSBtZW51cy5nZXQobmFtZSkgPz8gbWVudU9mKG5hbWUpO1xuXG4gICAgICBtZW51cy5zZXQobmFtZSwgbWVudSk7XG5cbiAgICAgIHJldHVybiBtZW51O1xuICAgIH07XG4gIH0sXG59KTtcblxuLy8gXCJMYXlvdXQgMlwiIGFzIFwiTDJcIiwgXCJXb3JrXCIgYXMgXCJXT1wiOiB3aGF0IHRlbGxzIHBpbm5lZCBsYXlvdXRzIGFwYXJ0IGF0IGEgZ2xhbmNlLlxuY29uc3QgaW5pdGlhbHNPZiA9IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgY29uc3Qgd29yZHMgPSBuYW1lLnRyaW0oKS5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKTtcblxuICByZXR1cm4gKFxuICAgIHdvcmRzLmxlbmd0aCA+IDEgPyB3b3Jkc1swXVswXSArIHdvcmRzWzFdWzBdIDogbmFtZS50cmltKCkuc2xpY2UoMCwgMilcbiAgKS50b1VwcGVyQ2FzZSgpO1xufTtcblxuY29uc3QgTGF5b3V0SG90YmFySXRlbSA9IG9ic2VydmVyKFxuICAoe1xuICAgIHBlcnNpc3RlZERhdGE6IHsgbmFtZSB9LFxuICB9OiBIb3RiYXJJdGVtUHJvcHM8dHlwZW9mIGxheW91dEhvdGJhckl0ZW1LaW5kPikgPT4ge1xuICAgIGNvbnN0IG1vZGVsID0gdXNlSW5qZWN0KHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUpKCk7XG4gICAgY29uc3QgcmVjYWxsID0gdXNlSW5qZWN0KHJlY2FsbEZyb21Ib3RiYXJJbmplY3RhYmxlKSgpO1xuICAgIGNvbnN0IG1lbnUgPSB1c2VJbmplY3QobGF5b3V0TWVudU9mSXRlbUluamVjdGFibGUpKCkobmFtZSk7XG4gICAgY29uc3QgbGF5b3V0cyA9IG1vZGVsLmxheW91dHMuZ2V0KCk7XG4gICAgLy8gVGFrZW4gZm9yIHRoZXJlIHVudGlsIHRoZSBsYXlvdXRzIGFyZSByZWFkLlxuICAgIGNvbnN0IGV4aXN0cyA9ICFsYXlvdXRzIHx8IGxheW91dHMuc29tZSgoaXQpID0+IGl0Lm5hbWUgPT09IG5hbWUpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxCdXR0b25cbiAgICAgICAgJGludGVyYWN0aXZlXG4gICAgICAgIC8vIFRoZSB3aG9sZSBzbG90LCBzbyB0aGUgbWVudSBvcGVucyBiZXNpZGUgdGhlIHNsb3QgcmF0aGVyIHRoYW4gb3ZlciBpdC5cbiAgICAgICAgJHdpZHRoPVwiZnVsbFwiXG4gICAgICAgICRoZWlnaHQ9XCJmdWxsXCJcbiAgICAgICAgJGVuYWJsZWQ9e2V4aXN0cyAmJiBtb2RlbC5jYW5BcnJhbmdlLmdldCgpfVxuICAgICAgICAkZmxleD17e1xuICAgICAgICAgIGRpcmVjdGlvbjogXCJ2ZXJ0aWNhbFwiLFxuICAgICAgICAgIHZlcnRpY2FsQWxpZ246IFwiY2VudGVyXCIsXG4gICAgICAgICAgaG9yaXpvbnRhbEFsaWduOiBcImNlbnRlclwiLFxuICAgICAgICB9fVxuICAgICAgICBhcmlhLWxhYmVsPXtgUmVjYWxsICR7bmFtZX1gfVxuICAgICAgICAvLyBUaGUgbGF5b3V0J3MgdGlsaW5nLCBhbmQgcmVjYWxsaW5nIG9yIGVkaXRpbmcgaXQsIGFzIHRoZSBwb2ludGVyIGlzIG9uIHRoZSBpdGVtLlxuICAgICAgICAkYW5jaG9yXG4gICAgICAgICRkcm9wRG93bk1lbnU9e21lbnV9XG4gICAgICAgICRvbkNsaWNrPXsoKSA9PiB2b2lkIHJlY2FsbChuYW1lKX1cbiAgICAgID5cbiAgICAgICAgPERhc2hib2FyZEljb24gJHNpemU9XCJsXCIgJGNvbG9yPXtleGlzdHMgPyBcInByaW1hcnlcIiA6IFwidGV4dE11dGVkXCJ9IC8+XG4gICAgICAgIDxTcGFuICRmb250PXt7IHNpemU6IFwieHNcIiwgYm9sZDogdHJ1ZSB9fSAkY29sb3I9XCJ0ZXh0TXV0ZWRcIj5cbiAgICAgICAgICB7aW5pdGlhbHNPZihuYW1lKX1cbiAgICAgICAgPC9TcGFuPlxuICAgICAgPC9CdXR0b24+XG4gICAgKTtcbiAgfSxcbik7XG5cbmV4cG9ydCBkZWZhdWx0IGdldEhvdGJhckl0ZW1LaW5kSW5qZWN0YWJsZUJ1bmNoKHtcbiAga2luZDogbGF5b3V0SG90YmFySXRlbUtpbmQsXG4gIENvbXBvbmVudDogTGF5b3V0SG90YmFySXRlbSxcbn0pO1xuIiwgImltcG9ydCB7XG4gIGdldERyb3BEb3duTWVudUl0ZW1JbmplY3RhYmxlQnVuY2gsXG4gIGdldERyb3BEb3duTWVudUtpbmQsXG59IGZyb20gXCJAazhzbGVucy9kcm9wLWRvd24tbWVudS1jb250cmFjdHNcIjtcbmltcG9ydCB7XG4gIERyb3BEb3duTWVudUl0ZW1Sb3csXG4gIERyb3BEb3duTWVudVNlcGFyYXRvcixcbn0gZnJvbSBcIkBrOHNsZW5zL2Ryb3AtZG93bi1tZW51LWl0ZW1zXCI7XG5pbXBvcnQgeyBMaSwgU3BhbiB9IGZyb20gXCJAazhzbGVucy9lbGVtZW50LWNvbXBvbmVudHNcIjtcbmltcG9ydCB7IEVkaXRJY29uLCBIaXN0b3J5SWNvbiwgU2F2ZUljb24gfSBmcm9tIFwiQGs4c2xlbnMvaWNvblwiO1xuaW1wb3J0IHsgdXNlSW5qZWN0IH0gZnJvbSBcIkBrOHNsZW5zL3VzZS1pbmplY3RcIjtcbmltcG9ydCB7IG9ic2VydmVyIH0gZnJvbSBcIm1vYngtcmVhY3RcIjtcbmltcG9ydCB7IHByZXZpZXdPZiB9IGZyb20gXCIuLi9sYXlvdXRzL2xheW91dC1wcmV2aWV3XCI7XG5pbXBvcnQgeyBMYXlvdXRQcmV2aWV3IH0gZnJvbSBcIi4vbGF5b3V0LXByZXZpZXdcIjtcbmltcG9ydCB7IG9wZW5XaW5kb3dMYXlvdXRzSW5qZWN0YWJsZSB9IGZyb20gXCIuL29wZW4td2luZG93LWxheW91dHMuaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgcmVjYWxsRnJvbUhvdGJhckluamVjdGFibGUgfSBmcm9tIFwiLi9yZWNhbGwtZnJvbS1ob3RiYXIuaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgc2F2ZUZyb21Ib3RiYXJJbmplY3RhYmxlIH0gZnJvbSBcIi4vc2F2ZS1mcm9tLWhvdGJhci5pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyBzaG93V2luZG93RnJvbUhvdGJhckluamVjdGFibGUgfSBmcm9tIFwiLi9zaG93LXdpbmRvdy1mcm9tLWhvdGJhci5pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyB3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlIH0gZnJvbSBcIi4vd2luZG93LWxheW91dHMtbW9kZWwuaW5qZWN0YWJsZVwiO1xuXG4vLyBUaGUgbWVudSBhIGxheW91dCdzIGhvdGJhciBpdGVtIG9wZW5zIGFzIHRoZSBwb2ludGVyIGlzIG9uIGl0OiB0aGUgbGF5b3V0J3MgdGlsaW5nLCBhbmQgd2hhdCBjYW5cbi8vIGJlIGRvbmUgd2l0aCB0aGUgbGF5b3V0LlxuZXhwb3J0IGNvbnN0IGxheW91dEhvdGJhck1lbnVLaW5kID0gZ2V0RHJvcERvd25NZW51S2luZDx7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn0+KCkoXCJ3aW5kb3ctbWFuYWdlci1sYXlvdXQtaG90YmFyLW1lbnVcIik7XG5cbmNvbnN0IFByZXZpZXcgPSBvYnNlcnZlcigoeyBkYXRhOiB7IG5hbWUgfSB9OiB7IGRhdGE6IHsgbmFtZTogc3RyaW5nIH0gfSkgPT4ge1xuICBjb25zdCBtb2RlbCA9IHVzZUluamVjdCh3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlKSgpO1xuICBjb25zdCBzaG93V2luZG93ID0gdXNlSW5qZWN0KHNob3dXaW5kb3dGcm9tSG90YmFySW5qZWN0YWJsZSkoKTtcbiAgY29uc3QgbGF5b3V0ID0gbW9kZWwubGF5b3V0cy5nZXQoKT8uZmluZCgoaXQpID0+IGl0Lm5hbWUgPT09IG5hbWUpO1xuXG4gIHJldHVybiAoXG4gICAgPExpXG4gICAgICAkcGFkZGluZz17eyB2ZXJ0aWNhbDogXCJzXCIsIGhvcml6b250YWw6IFwibVwiIH19XG4gICAgICAkZmxleD17eyBkaXJlY3Rpb246IFwidmVydGljYWxcIiwgZ2FwOiBcInNcIiB9fVxuICAgID5cbiAgICAgIDxTcGFuICRmb250PXt7IGJvbGQ6IHRydWUgfX0+e25hbWV9PC9TcGFuPlxuICAgICAge2xheW91dCA/IChcbiAgICAgICAgPExheW91dFByZXZpZXdcbiAgICAgICAgICBwcmV2aWV3PXtwcmV2aWV3T2YoXG4gICAgICAgICAgICBsYXlvdXQsXG4gICAgICAgICAgICBtb2RlbC5ub3RPcGVuT2YobGF5b3V0KSxcbiAgICAgICAgICAgIG1vZGVsLm1pc3NpbmdTY3JlZW5JZHNPZihsYXlvdXQpLFxuICAgICAgICAgICAgbW9kZWwubm90U2F2ZWRPZihsYXlvdXQpLFxuICAgICAgICAgICl9XG4gICAgICAgICAgb25XaW5kb3dDbGljaz17KGluZGV4LCB0aXRsZSkgPT4gdm9pZCBzaG93V2luZG93KG5hbWUsIGluZGV4LCB0aXRsZSl9XG4gICAgICAgIC8+XG4gICAgICApIDogKFxuICAgICAgICA8U3BhbiAkY29sb3I9XCJ0ZXh0TXV0ZWRcIiAkZm9udD17eyBzaXplOiBcInNcIiB9fT5cbiAgICAgICAgICBUaGVyZSBpcyBubyBsYXlvdXQgY2FsbGVkIFwie25hbWV9XCIgYW55IG1vcmUuXG4gICAgICAgIDwvU3Bhbj5cbiAgICAgICl9XG4gICAgPC9MaT5cbiAgKTtcbn0pO1xuXG5jb25zdCBSZWNhbGwgPSBvYnNlcnZlcigoeyBkYXRhOiB7IG5hbWUgfSB9OiB7IGRhdGE6IHsgbmFtZTogc3RyaW5nIH0gfSkgPT4ge1xuICBjb25zdCBtb2RlbCA9IHVzZUluamVjdCh3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlKSgpO1xuICBjb25zdCByZWNhbGwgPSB1c2VJbmplY3QocmVjYWxsRnJvbUhvdGJhckluamVjdGFibGUpKCk7XG4gIGNvbnN0IGV4aXN0cyA9ICEhbW9kZWwubGF5b3V0cy5nZXQoKT8uc29tZSgoaXQpID0+IGl0Lm5hbWUgPT09IG5hbWUpO1xuXG4gIHJldHVybiAoXG4gICAgPERyb3BEb3duTWVudUl0ZW1Sb3dcbiAgICAgIEljb249e0hpc3RvcnlJY29ufVxuICAgICAgJGVuYWJsZWQ9e2V4aXN0cyAmJiBtb2RlbC5jYW5BcnJhbmdlLmdldCgpfVxuICAgICAgJG9uQ2xpY2s9eygpID0+IHZvaWQgcmVjYWxsKG5hbWUpfVxuICAgID5cbiAgICAgIFJlY2FsbFxuICAgIDwvRHJvcERvd25NZW51SXRlbVJvdz5cbiAgKTtcbn0pO1xuXG5jb25zdCBTYXZlID0gb2JzZXJ2ZXIoKHsgZGF0YTogeyBuYW1lIH0gfTogeyBkYXRhOiB7IG5hbWU6IHN0cmluZyB9IH0pID0+IHtcbiAgY29uc3QgbW9kZWwgPSB1c2VJbmplY3Qod2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSkoKTtcbiAgY29uc3Qgc2F2ZSA9IHVzZUluamVjdChzYXZlRnJvbUhvdGJhckluamVjdGFibGUpKCk7XG4gIGNvbnN0IGV4aXN0cyA9ICEhbW9kZWwubGF5b3V0cy5nZXQoKT8uc29tZSgoaXQpID0+IGl0Lm5hbWUgPT09IG5hbWUpO1xuXG4gIHJldHVybiAoXG4gICAgPERyb3BEb3duTWVudUl0ZW1Sb3dcbiAgICAgIEljb249e1NhdmVJY29ufVxuICAgICAgJGVuYWJsZWQ9e2V4aXN0cyAmJiBtb2RlbC5jYW5BcnJhbmdlLmdldCgpfVxuICAgICAgJHRvb2x0aXA9XCJQdXQgdGhlIHdpbmRvd3MgaW4gdGhlaXIgdGlsZXMsIHRoZW4gc2F2ZSB0aGVtIGludG8gdGhpcyBsYXlvdXQ7IHdpbmRvd3MgaXQgaGFzIG5vIHRpbGUgZm9yIGFyZSBzYXZlZCBhcyBub3QgdGlsZWRcIlxuICAgICAgJG9uQ2xpY2s9eygpID0+IHZvaWQgc2F2ZShuYW1lKX1cbiAgICA+XG4gICAgICBUaWxlIGFuZCBzYXZlXG4gICAgPC9Ecm9wRG93bk1lbnVJdGVtUm93PlxuICApO1xufSk7XG5cbmNvbnN0IEVkaXQgPSBvYnNlcnZlcigoeyBkYXRhOiB7IG5hbWUgfSB9OiB7IGRhdGE6IHsgbmFtZTogc3RyaW5nIH0gfSkgPT4ge1xuICBjb25zdCBtb2RlbCA9IHVzZUluamVjdCh3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlKSgpO1xuICBjb25zdCBvcGVuV2luZG93TGF5b3V0cyA9IHVzZUluamVjdChvcGVuV2luZG93TGF5b3V0c0luamVjdGFibGUpKCk7XG4gIGNvbnN0IGV4aXN0cyA9ICEhbW9kZWwubGF5b3V0cy5nZXQoKT8uc29tZSgoaXQpID0+IGl0Lm5hbWUgPT09IG5hbWUpO1xuXG4gIHJldHVybiAoXG4gICAgPERyb3BEb3duTWVudUl0ZW1Sb3dcbiAgICAgIEljb249e0VkaXRJY29ufVxuICAgICAgJGVuYWJsZWQ9e2V4aXN0c31cbiAgICAgICRvbkNsaWNrPXsoKSA9PiB2b2lkIG9wZW5XaW5kb3dMYXlvdXRzKG5hbWUpfVxuICAgID5cbiAgICAgIEVkaXQgaW4gV2luZG93IGxheW91dHNcbiAgICA8L0Ryb3BEb3duTWVudUl0ZW1Sb3c+XG4gICk7XG59KTtcblxuY29uc3QgU2VwYXJhdG9yID0gKCkgPT4gPERyb3BEb3duTWVudVNlcGFyYXRvciAvPjtcblxuZXhwb3J0IGNvbnN0IGxheW91dEhvdGJhck1lbnVQcmV2aWV3QnVuY2ggPSBnZXREcm9wRG93bk1lbnVJdGVtSW5qZWN0YWJsZUJ1bmNoKHtcbiAgaWQ6IFwid2luZG93LW1hbmFnZXItbGF5b3V0LWhvdGJhci1tZW51LXByZXZpZXdcIixcbiAga2luZDogbGF5b3V0SG90YmFyTWVudUtpbmQsXG4gIG9yZGVyTnVtYmVyOiAxMCxcbiAgQ29tcG9uZW50OiBQcmV2aWV3LFxufSk7XG5cbmV4cG9ydCBjb25zdCBsYXlvdXRIb3RiYXJNZW51U2VwYXJhdG9yQnVuY2ggPVxuICBnZXREcm9wRG93bk1lbnVJdGVtSW5qZWN0YWJsZUJ1bmNoKHtcbiAgICBpZDogXCJ3aW5kb3ctbWFuYWdlci1sYXlvdXQtaG90YmFyLW1lbnUtc2VwYXJhdG9yXCIsXG4gICAga2luZDogbGF5b3V0SG90YmFyTWVudUtpbmQsXG4gICAgb3JkZXJOdW1iZXI6IDIwLFxuICAgIENvbXBvbmVudDogU2VwYXJhdG9yLFxuICB9KTtcblxuZXhwb3J0IGNvbnN0IGxheW91dEhvdGJhck1lbnVSZWNhbGxCdW5jaCA9IGdldERyb3BEb3duTWVudUl0ZW1JbmplY3RhYmxlQnVuY2goe1xuICBpZDogXCJ3aW5kb3ctbWFuYWdlci1sYXlvdXQtaG90YmFyLW1lbnUtcmVjYWxsXCIsXG4gIGtpbmQ6IGxheW91dEhvdGJhck1lbnVLaW5kLFxuICBvcmRlck51bWJlcjogMzAsXG4gIENvbXBvbmVudDogUmVjYWxsLFxufSk7XG5cbmV4cG9ydCBjb25zdCBsYXlvdXRIb3RiYXJNZW51U2F2ZUJ1bmNoID0gZ2V0RHJvcERvd25NZW51SXRlbUluamVjdGFibGVCdW5jaCh7XG4gIGlkOiBcIndpbmRvdy1tYW5hZ2VyLWxheW91dC1ob3RiYXItbWVudS1zYXZlXCIsXG4gIGtpbmQ6IGxheW91dEhvdGJhck1lbnVLaW5kLFxuICBvcmRlck51bWJlcjogMzUsXG4gIENvbXBvbmVudDogU2F2ZSxcbn0pO1xuXG5leHBvcnQgY29uc3QgbGF5b3V0SG90YmFyTWVudUVkaXRCdW5jaCA9IGdldERyb3BEb3duTWVudUl0ZW1JbmplY3RhYmxlQnVuY2goe1xuICBpZDogXCJ3aW5kb3ctbWFuYWdlci1sYXlvdXQtaG90YmFyLW1lbnUtZWRpdFwiLFxuICBraW5kOiBsYXlvdXRIb3RiYXJNZW51S2luZCxcbiAgb3JkZXJOdW1iZXI6IDQwLFxuICBDb21wb25lbnQ6IEVkaXQsXG59KTtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIERpc3BsYXlSZWNvcmQsXG4gIFdpbmRvd0JvdW5kcyxcbn0gZnJvbSBcIkBrOHNsZW5zL3dpbmRvdy1sYXlvdXQtY29udHJhY3RzXCI7XG5pbXBvcnQgeyBpc0FwcGxpY2F0aW9uV2luZG93IH0gZnJvbSBcIkBrOHNsZW5zL21lc3NhZ2luZy1jb250cmFjdHNcIjtcbmltcG9ydCB7IGNvbHVtbnNGb3IgfSBmcm9tIFwiLi9ncmlkXCI7XG5pbXBvcnQgdHlwZSB7IFNhdmVkV2luZG93TGF5b3V0IH0gZnJvbSBcIi4vc2F2ZWQtd2luZG93LWxheW91dHMuaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgYm91bmRzSW5HcmlkLCBwbGFjZUluR3JpZCwgcmVjb25uZWN0ZWRJZE9mIH0gZnJvbSBcIi4vdGlsaW5nLXBsYW5cIjtcblxuZXhwb3J0IGludGVyZmFjZSBQcmV2aWV3V2luZG93IHtcbiAgLy8gSXRzIHBsYWNlIGluIHRoZSBsYXlvdXQncyB3aW5kb3dzLlxuICByZWFkb25seSBpbmRleDogbnVtYmVyO1xuICByZWFkb25seSB0aXRsZTogc3RyaW5nO1xuICByZWFkb25seSBpc09wZW46IGJvb2xlYW47XG4gIC8vIFdoZXRoZXIgdGhlIHdpbmRvdyBpcyBvcGVuIGJ1dCBub3Qgd2hlcmUgb3IgYXMgdGhlIGxheW91dCBzYXZlZCBpdC5cbiAgcmVhZG9ubHkgaXNTYXZlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgaXNBcHBsaWNhdGlvbldpbmRvdzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgY29sdW1uOiBudW1iZXI7XG4gIHJlYWRvbmx5IHJvdzogbnVtYmVyO1xuICByZWFkb25seSBjb2x1bW5zOiBudW1iZXI7XG4gIHJlYWRvbmx5IHJvd3M6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmV2aWV3U2NyZWVuIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgbGFiZWw/OiBzdHJpbmc7XG4gIC8vIFdoZXRoZXIgdGhlIHNjcmVlbiBpcyBub3QgY29ubmVjdGVkIG5vdy5cbiAgcmVhZG9ubHkgbWlzc2luZzogYm9vbGVhbjtcbiAgLy8gV2hlcmUgdGhlIHNjcmVlbidzIHdpbmRvd3MgZ28sIGFtb25nIHRoZSBvdGhlciBzY3JlZW5zLCB0byBkcmF3IHRoZSBzY3JlZW5zIGFzIHRoZXkgbGllLlxuICByZWFkb25seSBhcmVhOiBXaW5kb3dCb3VuZHM7XG4gIHJlYWRvbmx5IGNvbHVtbnM6IG51bWJlcjtcbiAgcmVhZG9ubHkgcm93czogbnVtYmVyO1xuICByZWFkb25seSB3aW5kb3dzOiByZWFkb25seSBQcmV2aWV3V2luZG93W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0UHJldmlldyB7XG4gIHJlYWRvbmx5IHNjcmVlbnM6IHJlYWRvbmx5IFByZXZpZXdTY3JlZW5bXTtcbiAgLy8gVGhlIHRpdGxlcyBvZiB0aGUgd2luZG93cyB0aGUgbGF5b3V0IGxlYXZlcyB1bnRpbGVkLlxuICByZWFkb25seSB1bnRpbGVkOiByZWFkb25seSBzdHJpbmdbXTtcbiAgLy8gSG93IG1hbnkgb2YgdGhlIGxheW91dCdzIHdpbmRvd3MgYXJlIG5vdCBvcGVuIG5vdy5cbiAgcmVhZG9ubHkgbm90T3BlbjogbnVtYmVyO1xuICAvLyBIb3cgbWFueSBvZiB0aGVtIGFyZSBvcGVuIGJ1dCBub3Qgd2hlcmUgb3IgYXMgdGhlIGxheW91dCBzYXZlZCB0aGVtLlxuICByZWFkb25seSBub3RTYXZlZDogbnVtYmVyO1xufVxuXG4vLyBUaGUgdGlsaW5nIGEgbGF5b3V0IHNhdmVkLCBzY3JlZW4gYnkgc2NyZWVuLCBpdHMgd2luZG93cyBwbGFjZWQgaW4gdGhlIGdyaWRzIGFzIHRoZSBlZGl0b3Jcbi8vIHBsYWNlcyB0aGVtOyBubyBzY3JlZW5zIGZvciBhIGxheW91dCBzYXZlZCB3aXRob3V0IGEgdGlsaW5nLlxudHlwZSBTYXZlZFRpbGluZyA9IE5vbk51bGxhYmxlPFNhdmVkV2luZG93TGF5b3V0W1widGlsaW5nXCJdPjtcblxuLy8gVGhlIGdyaWQgb2YgYSBzY3JlZW4gb2YgdGhlIHRpbGluZywgaXRzIHdpbmRvd3MgcGxhY2VkIGluIGl0IGFzIHRoZSBlZGl0b3IgcGxhY2VzIHRoZW0uXG5jb25zdCBncmlkT2YgPSAodGlsaW5nOiBTYXZlZFRpbGluZywgaWQ6IHN0cmluZykgPT4ge1xuICBjb25zdCBvblNjcmVlbiA9IHRpbGluZy53aW5kb3dzLmZpbHRlcigoaXQpID0+IFN0cmluZyhpdC5kaXNwbGF5SWQpID09PSBpZCk7XG4gIGNvbnN0IGNvbHVtbnMgPSBNYXRoLm1heChcbiAgICB0aWxpbmcuY29sdW1uc1tpZF0gPz9cbiAgICAgIGNvbHVtbnNGb3IoXG4gICAgICAgIG9uU2NyZWVuLnJlZHVjZSgoc3VtLCBpdCkgPT4gc3VtICsgaXQuY29sdW1ucyAqIGl0LnJvd3MsIDApIHx8IDEsXG4gICAgICApLFxuICAgIDEsXG4gICk7XG4gIGNvbnN0IHsgcGxhY2VkLCByb3dzIH0gPSBwbGFjZUluR3JpZChvblNjcmVlbiwgY29sdW1ucyk7XG5cbiAgcmV0dXJuIHtcbiAgICBwbGFjZWQsXG4gICAgY29sdW1ucyxcbiAgICByb3dzOiBNYXRoLm1heChyb3dzLCB0aWxpbmcucm93c1tpZF0gPz8gMCwgMSksXG4gIH07XG59O1xuXG4vLyBXaGVyZSB0aGUgbGF5b3V0J3MgdGlsaW5nIHB1dHMgZWFjaCB3aW5kb3cgaXQgdGlsZXMgb24gYSBzY3JlZW4gY29ubmVjdGVkIG5vdywgYnkgaXRzIHBsYWNlIGluXG4vLyB0aGUgbGF5b3V0OiBhIHNjcmVlbiBjb25uZWN0ZWQgYWdhaW4gdW5kZXIgYW5vdGhlciBpZCBpcyB0aGUgb25lIHNhdmVkIHN0aWxsLlxuZXhwb3J0IGNvbnN0IHRpbGVCb3VuZHNPZiA9IChcbiAgbGF5b3V0OiBTYXZlZFdpbmRvd0xheW91dCxcbiAgZGlzcGxheXM6IHJlYWRvbmx5IERpc3BsYXlSZWNvcmRbXSxcbik6IFJlYWRvbmx5TWFwPG51bWJlciwgV2luZG93Qm91bmRzPiA9PiB7XG4gIGNvbnN0IHRpbGluZyA9IGxheW91dC50aWxpbmc7XG5cbiAgaWYgKCF0aWxpbmcpIHtcbiAgICByZXR1cm4gbmV3IE1hcCgpO1xuICB9XG5cbiAgY29uc3QgaWRzID0gbmV3IFNldChcbiAgICB0aWxpbmcud2luZG93cy5mbGF0TWFwKChpdCkgPT5cbiAgICAgIGl0LmRpc3BsYXlJZCA9PT0gbnVsbCA/IFtdIDogW1N0cmluZyhpdC5kaXNwbGF5SWQpXSxcbiAgICApLFxuICApO1xuXG4gIHJldHVybiBuZXcgTWFwKFxuICAgIFsuLi5pZHNdLmZsYXRNYXAoKGlkKSA9PiB7XG4gICAgICBjb25zdCBzYXZlZCA9IHRpbGluZy5zY3JlZW5zPy5baWRdO1xuICAgICAgY29uc3QgZGlzcGxheUlkID0gZGlzcGxheXMuc29tZSgoZGlzcGxheSkgPT4gU3RyaW5nKGRpc3BsYXkuaWQpID09PSBpZClcbiAgICAgICAgPyBOdW1iZXIoaWQpXG4gICAgICAgIDogc2F2ZWQgJiYgcmVjb25uZWN0ZWRJZE9mKGlkLCBzYXZlZCwgZGlzcGxheXMpO1xuICAgICAgY29uc3QgZGlzcGxheSA9IGRpc3BsYXlzLmZpbmQoKGl0KSA9PiBpdC5pZCA9PT0gZGlzcGxheUlkKTtcblxuICAgICAgaWYgKCFkaXNwbGF5KSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBwbGFjZWQsIGNvbHVtbnMsIHJvd3MgfSA9IGdyaWRPZih0aWxpbmcsIGlkKTtcblxuICAgICAgcmV0dXJuIHBsYWNlZC5tYXAoXG4gICAgICAgIChpdCkgPT5cbiAgICAgICAgICBbXG4gICAgICAgICAgICBpdC5pbmRleCxcbiAgICAgICAgICAgIGJvdW5kc0luR3JpZChkaXNwbGF5LndvcmtBcmVhLmdldCgpLCBjb2x1bW5zLCByb3dzLCBpdCksXG4gICAgICAgICAgXSBhcyBjb25zdCxcbiAgICAgICk7XG4gICAgfSksXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgcHJldmlld09mID0gKFxuICBsYXlvdXQ6IFNhdmVkV2luZG93TGF5b3V0LFxuICAvLyBUaGUgcGxhY2VzIGluIHRoZSBsYXlvdXQgb2YgaXRzIHdpbmRvd3Mgbm90IG9wZW4gbm93LlxuICBub3RPcGVuOiBSZWFkb25seVNldDxudW1iZXI+ID0gbmV3IFNldCgpLFxuICAvLyBUaGUgaWRzIG9mIHRoZSBzY3JlZW5zIG9mIGl0cyB0aWxpbmcgbm90IGNvbm5lY3RlZCBub3cuXG4gIG1pc3NpbmdTY3JlZW5zOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldCgpLFxuICAvLyBUaGUgcGxhY2VzIGluIHRoZSBsYXlvdXQgb2YgaXRzIHdpbmRvd3Mgb3BlbiBidXQgbm90IHdoZXJlIG9yIGFzIGl0IHNhdmVkIHRoZW0uXG4gIG5vdFNhdmVkOiBSZWFkb25seVNldDxudW1iZXI+ID0gbmV3IFNldCgpLFxuKTogTGF5b3V0UHJldmlldyA9PiB7XG4gIGNvbnN0IHRpbGluZyA9IGxheW91dC50aWxpbmc7XG4gIGNvbnN0IG5vdE9wZW5Db3VudCA9IGxheW91dC53aW5kb3dzLmZpbHRlcigoXywgaW5kZXgpID0+XG4gICAgbm90T3Blbi5oYXMoaW5kZXgpLFxuICApLmxlbmd0aDtcbiAgY29uc3Qgbm90U2F2ZWRDb3VudCA9IGxheW91dC53aW5kb3dzLmZpbHRlcihcbiAgICAoXywgaW5kZXgpID0+ICFub3RPcGVuLmhhcyhpbmRleCkgJiYgbm90U2F2ZWQuaGFzKGluZGV4KSxcbiAgKS5sZW5ndGg7XG5cbiAgaWYgKCF0aWxpbmcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2NyZWVuczogW10sXG4gICAgICB1bnRpbGVkOiBsYXlvdXQud2luZG93cy5tYXAoKGl0KSA9PiBpdC50aXRsZSksXG4gICAgICBub3RPcGVuOiBub3RPcGVuQ291bnQsXG4gICAgICBub3RTYXZlZDogbm90U2F2ZWRDb3VudCxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgdGl0bGVPZiA9IChpbmRleDogbnVtYmVyKSA9PiBsYXlvdXQud2luZG93c1tpbmRleF0/LnRpdGxlID8/IFwiXCI7XG4gIGNvbnN0IHRpbGVkID0gdGlsaW5nLndpbmRvd3MuZmlsdGVyKChpdCkgPT4gaXQuZGlzcGxheUlkICE9PSBudWxsKTtcbiAgY29uc3QgdGlsZWRJbmRleGVzID0gbmV3IFNldCh0aWxlZC5tYXAoKGl0KSA9PiBpdC5pbmRleCkpO1xuXG4gIGNvbnN0IGlkcyA9IFtcbiAgICAuLi5uZXcgU2V0KFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKHRpbGluZy5jb2x1bW5zKSxcbiAgICAgIC4uLnRpbGVkLm1hcCgoaXQpID0+IFN0cmluZyhpdC5kaXNwbGF5SWQpKSxcbiAgICBdKSxcbiAgXTtcblxuICAvLyBBIHNjcmVlbiBrZXB0IHdpdGhvdXQgd2hlcmUgaXQgbGllcywgZnJvbSBiZWZvcmUgc2NyZWVucyB3ZXJlIGtlcHQsIGdvZXMgcmlnaHQgb2YgdGhlIG90aGVycy5cbiAgbGV0IG5leHRYID0gTWF0aC5tYXgoXG4gICAgMCxcbiAgICAuLi5pZHMubWFwKChpZCkgPT4ge1xuICAgICAgY29uc3QgYXJlYSA9IHRpbGluZy5zY3JlZW5zPy5baWRdPy53b3JrQXJlYTtcblxuICAgICAgcmV0dXJuIGFyZWEgPyBhcmVhLnggKyBhcmVhLndpZHRoIDogMDtcbiAgICB9KSxcbiAgKTtcblxuICBjb25zdCBzY3JlZW5zID0gaWRzXG4gICAgLm1hcCgoaWQpOiBQcmV2aWV3U2NyZWVuID0+IHtcbiAgICAgIGNvbnN0IHsgcGxhY2VkLCBjb2x1bW5zLCByb3dzIH0gPSBncmlkT2YodGlsaW5nLCBpZCk7XG4gICAgICBjb25zdCBzY3JlZW4gPSB0aWxpbmcuc2NyZWVucz8uW2lkXTtcbiAgICAgIGNvbnN0IGtlcHQgPSBzY3JlZW4/LndvcmtBcmVhO1xuICAgICAgY29uc3QgYXJlYSA9XG4gICAgICAgIGtlcHQgJiYga2VwdC53aWR0aCA+IDAgJiYga2VwdC5oZWlnaHQgPiAwXG4gICAgICAgICAgPyBrZXB0XG4gICAgICAgICAgOiB7IHg6IG5leHRYLCB5OiAwLCB3aWR0aDogMTYwMCwgaGVpZ2h0OiAxMDAwIH07XG5cbiAgICAgIGlmIChhcmVhICE9PSBrZXB0KSB7XG4gICAgICAgIG5leHRYICs9IGFyZWEud2lkdGg7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkLFxuICAgICAgICAuLi4oc2NyZWVuID8geyBsYWJlbDogc2NyZWVuLmxhYmVsIH0gOiB7fSksXG4gICAgICAgIG1pc3Npbmc6IG1pc3NpbmdTY3JlZW5zLmhhcyhpZCksXG4gICAgICAgIGFyZWEsXG4gICAgICAgIGNvbHVtbnMsXG4gICAgICAgIHJvd3MsXG4gICAgICAgIHdpbmRvd3M6IHBsYWNlZC5tYXAoKGl0KSA9PiAoe1xuICAgICAgICAgIGluZGV4OiBpdC5pbmRleCxcbiAgICAgICAgICB0aXRsZTogdGl0bGVPZihpdC5pbmRleCksXG4gICAgICAgICAgaXNPcGVuOiAhbm90T3Blbi5oYXMoaXQuaW5kZXgpLFxuICAgICAgICAgIGlzU2F2ZWQ6IG5vdE9wZW4uaGFzKGl0LmluZGV4KSB8fCAhbm90U2F2ZWQuaGFzKGl0LmluZGV4KSxcbiAgICAgICAgICBpc0FwcGxpY2F0aW9uV2luZG93OiBpc0FwcGxpY2F0aW9uV2luZG93KFxuICAgICAgICAgICAgbGF5b3V0LndpbmRvd3NbaXQuaW5kZXhdPy53aW5kb3cgPz8geyBraW5kOiBcIlwiLCBpZDogXCJcIiB9LFxuICAgICAgICAgICksXG4gICAgICAgICAgY29sdW1uOiBpdC5jb2x1bW4sXG4gICAgICAgICAgcm93OiBpdC5yb3csXG4gICAgICAgICAgY29sdW1uczogaXQuY29sdW1ucyxcbiAgICAgICAgICByb3dzOiBpdC5yb3dzLFxuICAgICAgICB9KSksXG4gICAgICB9O1xuICAgIH0pXG4gICAgLy8gVGhlIHNjcmVlbnMgd2l0aCB3aW5kb3dzIG9uIHRoZW07IHdpdGggbm9uZSBhbnl3aGVyZSwgZXZlcnkgc2NyZWVuLCB0byBzaG93IHRoZSBncmlkLlxuICAgIC5maWx0ZXIoKHNjcmVlbiwgXywgYWxsKSA9PlxuICAgICAgYWxsLnNvbWUoKGl0KSA9PiBpdC53aW5kb3dzLmxlbmd0aCA+IDApXG4gICAgICAgID8gc2NyZWVuLndpbmRvd3MubGVuZ3RoID4gMFxuICAgICAgICA6IHRydWUsXG4gICAgKTtcblxuICByZXR1cm4ge1xuICAgIHNjcmVlbnMsXG4gICAgdW50aWxlZDogbGF5b3V0LndpbmRvd3NcbiAgICAgIC5maWx0ZXIoKF8sIGluZGV4KSA9PiAhdGlsZWRJbmRleGVzLmhhcyhpbmRleCkpXG4gICAgICAubWFwKChpdCkgPT4gaXQudGl0bGUpLFxuICAgIG5vdE9wZW46IG5vdE9wZW5Db3VudCxcbiAgICBub3RTYXZlZDogbm90U2F2ZWRDb3VudCxcbiAgfTtcbn07XG4iLCAiaW1wb3J0IHsgQ2xpY2thYmxlRGl2LCBEaXYsIFNwYW4gfSBmcm9tIFwiQGs4c2xlbnMvZWxlbWVudC1jb21wb25lbnRzXCI7XG5pbXBvcnQgdHlwZSB7IExheW91dFByZXZpZXcgYXMgUHJldmlldyB9IGZyb20gXCIuLi9sYXlvdXRzL2xheW91dC1wcmV2aWV3XCI7XG5cbi8vIFRoZSBtb3N0IHJvb20gdGhlIHNjcmVlbnMgYXJlIGRyYXduIGluLCB0b2dldGhlcjsgdGhlIHNwYWNlIGJldHdlZW4gdGhlbSwgYW5kIGFib3ZlIHRoZW0gZm9yXG4vLyB0aGVpciBuYW1lcy5cbmNvbnN0IG1heFdpZHRoID0gNTIwO1xuY29uc3QgbWF4SGVpZ2h0ID0gMjYwO1xuY29uc3QgZ2FwID0gNjtcbmNvbnN0IGxhYmVsSGVpZ2h0ID0gMTg7XG4vLyBUaGUgbGVhc3QgaGVpZ2h0IG9mIGEgd2luZG93J3MgYm94IHRoYXQgc2hvd3MgaXRzIHRpdGxlLlxuY29uc3QgbWluVGl0bGVIZWlnaHQgPSAxNjtcblxuLy8gV2hhdCB0aGUgZGlhbG9nIHRlbGxzIG9mIGEgc2NyZWVuIG5vdCBjb25uZWN0ZWQuXG5jb25zdCBtaXNzaW5nTm90ZSA9IFwibm90IGNvbm5lY3RlZDsgaXRzIHdpbmRvd3MgYXJlIG5vdCB0aWxlZFwiO1xuXG5jb25zdCBwbHVyYWwgPSAoY291bnQ6IG51bWJlciwgd29yZDogc3RyaW5nKSA9PlxuICBgJHtjb3VudH0gJHt3b3JkfSR7Y291bnQgPT09IDEgPyBcIlwiIDogXCJzXCJ9YDtcblxuLy8gVGhlIHRpbGluZyBhIGxheW91dCBzYXZlZCwgZHJhd24gc21hbGw6IHRoZSBzY3JlZW5zIHNpZGUgYnkgc2lkZSBhcyB0aGV5IGxpZSwgZWFjaCBpbiBpdHMgc2hhcGUsXG4vLyBpdHMgd2luZG93cyBpbiB0aGVpciBjZWxscy5cbmV4cG9ydCBjb25zdCBMYXlvdXRQcmV2aWV3ID0gKHtcbiAgcHJldmlldyxcbiAgb25XaW5kb3dDbGljayxcbn06IHtcbiAgcHJldmlldzogUHJldmlldztcbiAgLy8gVG9sZCBvZiBhIHdpbmRvdyBjbGlja2VkLCBieSBpdHMgcGxhY2UgaW4gdGhlIGxheW91dCdzIHdpbmRvd3MuXG4gIG9uV2luZG93Q2xpY2s/OiAoaW5kZXg6IG51bWJlciwgdGl0bGU6IHN0cmluZykgPT4gdm9pZDtcbn0pID0+IHtcbiAgY29uc3QgeyBzY3JlZW5zIH0gPSBwcmV2aWV3O1xuICAvLyBOYW1lZCB3aGVuIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUsIG9yIG9uZSBpcyBub3QgY29ubmVjdGVkLCB0byB0ZWxsIHNvLlxuICBjb25zdCB3aXRoTGFiZWxzID1cbiAgICBzY3JlZW5zLmxlbmd0aCA+IDEgfHwgc2NyZWVucy5zb21lKChzY3JlZW4pID0+IHNjcmVlbi5taXNzaW5nKTtcbiAgY29uc3QgbGVmdCA9IE1hdGgubWluKC4uLnNjcmVlbnMubWFwKChpdCkgPT4gaXQuYXJlYS54KSk7XG4gIGNvbnN0IHRvcCA9IE1hdGgubWluKC4uLnNjcmVlbnMubWFwKChpdCkgPT4gaXQuYXJlYS55KSk7XG4gIGNvbnN0IHJpZ2h0ID0gTWF0aC5tYXgoLi4uc2NyZWVucy5tYXAoKGl0KSA9PiBpdC5hcmVhLnggKyBpdC5hcmVhLndpZHRoKSk7XG4gIGNvbnN0IGJvdHRvbSA9IE1hdGgubWF4KC4uLnNjcmVlbnMubWFwKChpdCkgPT4gaXQuYXJlYS55ICsgaXQuYXJlYS5oZWlnaHQpKTtcbiAgY29uc3Qgc2NhbGUgPSBNYXRoLm1pbihtYXhXaWR0aCAvIChyaWdodCAtIGxlZnQpLCBtYXhIZWlnaHQgLyAoYm90dG9tIC0gdG9wKSk7XG5cbiAgcmV0dXJuIChcbiAgICA8RGl2ICRmbGV4PXt7IGRpcmVjdGlvbjogXCJ2ZXJ0aWNhbFwiLCBnYXA6IFwic1wiIH19PlxuICAgICAge3NjcmVlbnMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgIDxEaXZcbiAgICAgICAgICAkc3R5bGU9e3tcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gICAgICAgICAgICB3aWR0aDogKHJpZ2h0IC0gbGVmdCkgKiBzY2FsZSxcbiAgICAgICAgICAgIGhlaWdodDogKGJvdHRvbSAtIHRvcCkgKiBzY2FsZSArICh3aXRoTGFiZWxzID8gbGFiZWxIZWlnaHQgOiAwKSxcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAge3NjcmVlbnMubWFwKChzY3JlZW4pID0+IChcbiAgICAgICAgICAgIDxEaXZcbiAgICAgICAgICAgICAga2V5PXtzY3JlZW4uaWR9XG4gICAgICAgICAgICAgICRzdHlsZT17e1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgICAgICAgbGVmdDogKHNjcmVlbi5hcmVhLnggLSBsZWZ0KSAqIHNjYWxlICsgZ2FwIC8gMixcbiAgICAgICAgICAgICAgICB0b3A6IChzY3JlZW4uYXJlYS55IC0gdG9wKSAqIHNjYWxlICsgZ2FwIC8gMixcbiAgICAgICAgICAgICAgICB3aWR0aDogc2NyZWVuLmFyZWEud2lkdGggKiBzY2FsZSAtIGdhcCxcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3dpdGhMYWJlbHMgJiYgKFxuICAgICAgICAgICAgICAgIDxTcGFuXG4gICAgICAgICAgICAgICAgICAkY29sb3I9XCJ0ZXh0TXV0ZWRcIlxuICAgICAgICAgICAgICAgICAgJGZvbnQ9e3sgc2l6ZTogXCJ4c1wiIH19XG4gICAgICAgICAgICAgICAgICAkdG9vbHRpcD17XG4gICAgICAgICAgICAgICAgICAgIHNjcmVlbi5taXNzaW5nXG4gICAgICAgICAgICAgICAgICAgICAgPyBgJHtzY3JlZW4ubGFiZWwgPz8gXCJBIHNjcmVlblwifSBcdTAwQjcgJHttaXNzaW5nTm90ZX1gXG4gICAgICAgICAgICAgICAgICAgICAgOiBzY3JlZW4ubGFiZWxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICRzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImJsb2NrXCIsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogbGFiZWxIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIGxpbmVIZWlnaHQ6IGAke2xhYmVsSGVpZ2h0fXB4YCxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG4gICAgICAgICAgICAgICAgICAgIHdoaXRlU3BhY2U6IFwibm93cmFwXCIsXG4gICAgICAgICAgICAgICAgICAgIHRleHRPdmVyZmxvdzogXCJlbGxpcHNpc1wiLFxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7LyogQXMgdGhlIGRpYWxvZyBuYW1lcyBhIHNjcmVlbjogdGhlIG5hbWUgaW4gdGhlIHRleHQncyBvd24gY29sb3VyLCBhIHNjcmVlblxuICAgICAgICAgICAgICAgICAgICAgIG5vdCBjb25uZWN0ZWQgdG9sZCBzbyBhZnRlciBpdCBpbiB0aGUgY3JpdGljYWwgb25lLiAqL31cbiAgICAgICAgICAgICAgICAgIDxTcGFuICRjb2xvcj1cInRleHREZWZhdWx0XCI+e3NjcmVlbi5sYWJlbCA/PyBcIkEgc2NyZWVuXCJ9PC9TcGFuPlxuICAgICAgICAgICAgICAgICAge3NjcmVlbi5taXNzaW5nICYmIChcbiAgICAgICAgICAgICAgICAgICAgPFNwYW4gJGNvbG9yPVwiY3JpdGljYWxcIj4gXHUwMEI3IHttaXNzaW5nTm90ZX08L1NwYW4+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvU3Bhbj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPERpdlxuICAgICAgICAgICAgICAgICRiYWNrZ3JvdW5kQ29sb3I9XCJiYWNrZ3JvdW5kUHJpbWFyeURpbW1lZFwiXG4gICAgICAgICAgICAgICAgLy8gRnJhbWVkIGFzIHRoZSBkaWFsb2cgZnJhbWVzIGEgc2NyZWVuOiBvbmUgbm90IGNvbm5lY3RlZCBkYXNoZWQgaW4gdGhlIGNyaXRpY2FsXG4gICAgICAgICAgICAgICAgLy8gY29sb3VyLlxuICAgICAgICAgICAgICAgICRib3JkZXI9e3tcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiBzY3JlZW4ubWlzc2luZyA/IFwiY3JpdGljYWxcIiA6IFwiYm9yZGVyUHJpbWFyeVwiLFxuICAgICAgICAgICAgICAgICAgd2lkdGg6IFwieHhzXCIsXG4gICAgICAgICAgICAgICAgICByYWRpdXM6IFwic1wiLFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgJHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiLFxuICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBzY3JlZW4uYXJlYS5oZWlnaHQgKiBzY2FsZSAtIGdhcCxcbiAgICAgICAgICAgICAgICAgIC4uLihzY3JlZW4ubWlzc2luZyA/IHsgYm9yZGVyU3R5bGU6IFwiZGFzaGVkXCIgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3NjcmVlbi53aW5kb3dzLm1hcCgod2luZG93KSA9PiAoXG4gICAgICAgICAgICAgICAgICA8Q2xpY2thYmxlRGl2XG4gICAgICAgICAgICAgICAgICAgIGtleT17d2luZG93LmluZGV4fVxuICAgICAgICAgICAgICAgICAgICAvLyBCcm91Z2h0IHRvIHRoZSBmcm9udCwgb3BlbmVkIGFnYWluIGZpcnN0IHdoZW4gbm90IG9wZW4uXG4gICAgICAgICAgICAgICAgICAgICRvbkNsaWNrPXtcbiAgICAgICAgICAgICAgICAgICAgICBvbldpbmRvd0NsaWNrICYmXG4gICAgICAgICAgICAgICAgICAgICAgKCgpID0+IG9uV2luZG93Q2xpY2sod2luZG93LmluZGV4LCB3aW5kb3cudGl0bGUpKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXtcbiAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaXNPcGVuXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBCcmluZyAke3dpbmRvdy50aXRsZX0gdG8gdGhlIGZyb250YFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgT3BlbiAke3dpbmRvdy50aXRsZX0gYWdhaW5gXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgJGJhY2tncm91bmRDb2xvcj1cImJhY2tncm91bmRTZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgICAvLyBPdXRsaW5lZCBhcyB0aGUgZGlhbG9nIG91dGxpbmVzIGl0cyB0aWxlOiB0aGUgbWFpbiB3aW5kb3cgaW4gdGhlIHByaW1hcnlcbiAgICAgICAgICAgICAgICAgICAgLy8gY29sb3VyLCBhIHdpbmRvdyBub3Qgb3BlbiBkYXNoZWQgaW4gdGhlIGNyaXRpY2FsIG9uZSwgYSB3aW5kb3cgbm90IHdoZXJlIG9yXG4gICAgICAgICAgICAgICAgICAgIC8vIGFzIHNhdmVkIGluIHRoZSB3YXJuaW5nIG9uZS5cbiAgICAgICAgICAgICAgICAgICAgJGJvcmRlcj17e1xuICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAhd2luZG93LmlzT3BlblxuICAgICAgICAgICAgICAgICAgICAgICAgPyBcImNyaXRpY2FsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogIXdpbmRvdy5pc1NhdmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJ3YXJuaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiB3aW5kb3cuaXNBcHBsaWNhdGlvbldpbmRvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiYm9yZGVyUHJpbWFyeVwiLFxuICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBcInh4c1wiLFxuICAgICAgICAgICAgICAgICAgICAgIHJhZGl1czogXCJzXCIsXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICRmb250PXt7IHNpemU6IFwieHNcIiB9fVxuICAgICAgICAgICAgICAgICAgICAkdG9vbHRpcD17XG4gICAgICAgICAgICAgICAgICAgICAgIXdpbmRvdy5pc09wZW5cbiAgICAgICAgICAgICAgICAgICAgICAgID8gYCR7d2luZG93LnRpdGxlfTogbm90IG9wZW47IGNsaWNrIHRvIG9wZW4gaXQgYWdhaW5gXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGAke3dpbmRvdy50aXRsZX06IGNsaWNrIHRvIGJyaW5nIGl0IHRvIHRoZSBmcm9udGBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAkc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCIsXG4gICAgICAgICAgICAgICAgICAgICAgbGVmdDogYGNhbGMoJHsod2luZG93LmNvbHVtbiAvIHNjcmVlbi5jb2x1bW5zKSAqIDEwMH0lICsgM3B4KWAsXG4gICAgICAgICAgICAgICAgICAgICAgdG9wOiBgY2FsYygkeyh3aW5kb3cucm93IC8gc2NyZWVuLnJvd3MpICogMTAwfSUgKyAzcHgpYCxcbiAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogYGNhbGMoJHsod2luZG93LmNvbHVtbnMgLyBzY3JlZW4uY29sdW1ucykgKiAxMDB9JSAtIDZweClgLFxuICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogYGNhbGMoJHsod2luZG93LnJvd3MgLyBzY3JlZW4ucm93cykgKiAxMDB9JSAtIDZweClgLFxuICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiMCA2cHhcIixcbiAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IG9uV2luZG93Q2xpY2sgPyBcInBvaW50ZXJcIiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAuLi4od2luZG93LmlzT3BlbiA/IHt9IDogeyBib3JkZXJTdHlsZTogXCJkYXNoZWRcIiB9KSxcbiAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgICAgICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxuICAgICAgICAgICAgICAgICAgICAgIHdoaXRlU3BhY2U6IFwibm93cmFwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgdGV4dE92ZXJmbG93OiBcImVsbGlwc2lzXCIsXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHsvKiBJdHMgdGl0bGUgd2hlcmUgdGhlcmUgaXMgcm9vbSBmb3IgYSBsaW5lIG9mIGl0OyBpdHMgdG9vbHRpcCB0ZWxscyBpdCBhbnl3YXkuICovfVxuICAgICAgICAgICAgICAgICAgICB7KChzY3JlZW4uYXJlYS5oZWlnaHQgKiBzY2FsZSAtIGdhcCkgKiB3aW5kb3cucm93cykgL1xuICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbi5yb3dzIC1cbiAgICAgICAgICAgICAgICAgICAgICA2ID49XG4gICAgICAgICAgICAgICAgICAgICAgbWluVGl0bGVIZWlnaHQgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAkc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0T3ZlcmZsb3c6IFwiZWxsaXBzaXNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3dpbmRvdy50aXRsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHsvKiBUb2xkIGFzIHRoZSBkaWFsb2cgdGVsbHMgaXQsIGFmdGVyIHRoZSBuYW1lLiAqL31cbiAgICAgICAgICAgICAgICAgICAgICAgIHshd2luZG93LmlzT3BlbiAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbG9yPVwiY3JpdGljYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzdHlsZT17eyBmbGV4U2hyaW5rOiAwLCBtYXJnaW5MZWZ0OiA2IH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3Qgb3BlblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgPC9DbGlja2FibGVEaXY+XG4gICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgIDwvRGl2PlxuICAgICAgICAgICAgPC9EaXY+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvRGl2PlxuICAgICAgKX1cblxuICAgICAge3ByZXZpZXcuc2NyZWVucy5sZW5ndGggPT09IDAgJiYgKFxuICAgICAgICA8U3BhbiAkY29sb3I9XCJ0ZXh0TXV0ZWRcIiAkZm9udD17eyBzaXplOiBcInNcIiB9fT5cbiAgICAgICAgICBObyB0aWxpbmcgc2F2ZWQgd2l0aCB0aGlzIGxheW91dC5cbiAgICAgICAgPC9TcGFuPlxuICAgICAgKX1cblxuICAgICAgeyhwcmV2aWV3Lm5vdE9wZW4gPiAwIHx8IHByZXZpZXcudW50aWxlZC5sZW5ndGggPiAwKSAmJiAoXG4gICAgICAgIDxTcGFuICRjb2xvcj1cInRleHRNdXRlZFwiICRmb250PXt7IHNpemU6IFwieHNcIiB9fT5cbiAgICAgICAgICB7W1xuICAgICAgICAgICAgLy8gSW4gdGhlIGNvbG91ciB0aGUgZGlhbG9nIHRlbGxzIGEgd2luZG93IG5vdCBvcGVuIGluLlxuICAgICAgICAgICAgLi4uKHByZXZpZXcubm90T3BlbiA+IDBcbiAgICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgICA8U3BhbiBrZXk9XCJub3Qtb3BlblwiICRjb2xvcj1cImNyaXRpY2FsXCI+XG4gICAgICAgICAgICAgICAgICAgIHtwbHVyYWwocHJldmlldy5ub3RPcGVuLCBcIndpbmRvd1wiKX0gbm90IG9wZW5cbiAgICAgICAgICAgICAgICAgIDwvU3Bhbj4sXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICAgIC4uLihwcmV2aWV3LnVudGlsZWQubGVuZ3RoID4gMFxuICAgICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICAgIDxTcGFuIGtleT1cIm5vdC10aWxlZFwiPlxuICAgICAgICAgICAgICAgICAgICB7cGx1cmFsKHByZXZpZXcudW50aWxlZC5sZW5ndGgsIFwid2luZG93XCIpfSBub3QgdGlsZWRcbiAgICAgICAgICAgICAgICAgIDwvU3Bhbj4sXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICBdLmZsYXRNYXAoKGl0LCBpbmRleCkgPT4gKGluZGV4ID09PSAwID8gW2l0XSA6IFtcIiBcdTAwQjcgXCIsIGl0XSkpfVxuICAgICAgICA8L1NwYW4+XG4gICAgICApfVxuICAgIDwvRGl2PlxuICApO1xufTtcbiIsICJpbXBvcnQgeyBnZXRJbmplY3RhYmxlMiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyBvcGVuTW9kYWxJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCJAazhzbGVucy9tb2RhbC1jb250cmFjdHNcIjtcbmltcG9ydCB7IHdpbmRvd0xheW91dHNNb2RhbEtpbmQgfSBmcm9tIFwiLi93aW5kb3ctbGF5b3V0cy1tb2RhbC5pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyB3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlIH0gZnJvbSBcIi4vd2luZG93LWxheW91dHMtbW9kZWwuaW5qZWN0YWJsZVwiO1xuXG5leHBvcnQgY29uc3Qgb3BlbldpbmRvd0xheW91dHNJbmplY3RhYmxlID0gZ2V0SW5qZWN0YWJsZTIoe1xuICBpZDogXCJ3aW5kb3ctbWFuYWdlci5vcGVuLXdpbmRvdy1sYXlvdXRzXCIsXG4gIGNvbnN1bXB0aW9uczogW29wZW5Nb2RhbEluamVjdGlvblRva2VuXSxcblxuICBpbnN0YW50aWF0ZTogKGRpKSA9PiB7XG4gICAgY29uc3Qgb3BlbldpbmRvd0xheW91dHNNb2RhbCA9IGRpLmluamVjdChcbiAgICAgIG9wZW5Nb2RhbEluamVjdGlvblRva2VuLmZvcih3aW5kb3dMYXlvdXRzTW9kYWxLaW5kKS5mb3IoZGkuc2NvcGVJZHMpLFxuICAgICkoKTtcblxuICAgIC8vIE9wZW5zIHRoZSBkaWFsb2csIHdpdGggdGhlIGxheW91dCBvZiB0aGUgbmFtZSBnaXZlbiBzZWxlY3RlZCBpbiBpdCwgdG8gZWRpdC5cbiAgICByZXR1cm4gKCkgPT4gYXN5bmMgKG5hbWU/OiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIFRoZSBtb2RlbCBpcyBtYWRlIGFzIHRoZSBkaWFsb2cgZmlyc3Qgb3BlbnMsIG5vdCBhcyB0aGUgc3RhdHVzIGJhciBzaG93cyBpdHMgYnV0dG9uOiB3aGF0IHRoZVxuICAgICAgLy8gbW9kZWwgbmVlZHMgZmFpbGluZyB0aGVuIGZhaWxzIHRoZSBkaWFsb2cgYWxvbmUsIG5vdCB0aGUgd2luZG93J3MgZnJhbWUgd2l0aCB0aGUgYnV0dG9uIGluIGl0LlxuICAgICAgY29uc3QgbW9kZWwgPSBkaS5pbmplY3Qod2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSkoKTtcblxuICAgICAgbW9kZWwucmVzZXQoKTtcblxuICAgICAgaWYgKG5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2b2lkIG1vZGVsLnNlbGVjdChuYW1lKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgb3BlbldpbmRvd0xheW91dHNNb2RhbCgpO1xuICAgIH07XG4gIH0sXG59KTtcbiIsICJpbXBvcnQgeyBCdXR0b24sIERpdiwgRm9ybSwgU3BhbiB9IGZyb20gXCJAazhzbGVucy9lbGVtZW50LWNvbXBvbmVudHNcIjtcbmltcG9ydCB7XG4gIFBsYWluQnV0dG9uLFxuICBQcmltYXJ5QnV0dG9uLFxuICBUZXh0SW5wdXQsXG59IGZyb20gXCJAazhzbGVucy9pbnB1dC1jb21wb25lbnRzXCI7XG5pbXBvcnQge1xuICBNb2RhbENvbnRhaW5lcixcbiAgTW9kYWxDb250ZW50LFxuICBNb2RhbEZvb3RlcixcbiAgTW9kYWxIZWFkZXIsXG59IGZyb20gXCJAazhzbGVucy9tb2RhbC1jb21wb25lbnRzXCI7XG5pbXBvcnQge1xuICBnZXRNb2RhbEluamVjdGFibGVCdW5jaCxcbiAgZ2V0TW9kYWxLaW5kLFxuICB1c2VSZXNwb25kRnJvbU1vZGFsLFxufSBmcm9tIFwiQGs4c2xlbnMvbW9kYWwtY29udHJhY3RzXCI7XG5pbXBvcnQge1xuICBBZGRJY29uLFxuICBDb250ZW50Q29weUljb24sXG4gIERlbGV0ZU91dGxpbmVJY29uLFxuICBJY29uQnV0dG9uLFxuICBFZGl0SWNvbixcbiAgSGlzdG9yeUljb24sXG4gIEhvdGJhckljb24sXG4gIFNhdmVJY29uLFxuICBTcGxpdFZpZXdJY29uLFxufSBmcm9tIFwiQGs4c2xlbnMvaWNvblwiO1xuaW1wb3J0IFwiLi9pY29uLWJ1dHRvbi5zY3NzXCI7XG5pbXBvcnQgc3R5bGVzIGZyb20gXCIuL2xheW91dC1saXN0Lm1vZHVsZS5zY3NzXCI7XG5pbXBvcnQgeyB1c2VJbmplY3QgfSBmcm9tIFwiQGs4c2xlbnMvdXNlLWluamVjdFwiO1xuaW1wb3J0IHsgb2JzZXJ2ZXIgfSBmcm9tIFwibW9ieC1yZWFjdFwiO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHsgU2F2ZWRXaW5kb3dMYXlvdXQgfSBmcm9tIFwiLi4vbGF5b3V0cy9zYXZlZC13aW5kb3ctbGF5b3V0cy5pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyBNb2RhbEVycm9yQm91bmRhcnkgfSBmcm9tIFwiLi9tb2RhbC1lcnJvci1ib3VuZGFyeVwiO1xuaW1wb3J0IHsgVGlsZVdpbmRvd3MgfSBmcm9tIFwiLi90aWxpbmctZWRpdG9yXCI7XG5pbXBvcnQgeyB3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlIH0gZnJvbSBcIi4vd2luZG93LWxheW91dHMtbW9kZWwuaW5qZWN0YWJsZVwiO1xuXG5leHBvcnQgY29uc3Qgd2luZG93TGF5b3V0c01vZGFsS2luZCA9IGdldE1vZGFsS2luZDxbXSwgdm9pZD4oKShcbiAgXCJ3aW5kb3ctbGF5b3V0c1wiLFxuKTtcblxuY29uc3QgcGx1cmFsID0gKGNvdW50OiBudW1iZXIsIHdvcmQ6IHN0cmluZykgPT5cbiAgYCR7Y291bnR9ICR7d29yZH0ke2NvdW50ID09PSAxID8gXCJcIiA6IFwic1wifWA7XG5cbi8vIFRoZSBsYXlvdXQncyB3aW5kb3dzIGFuZCBzY3JlZW5zLCBhbmQgdGhlIHNjcmVlbnMgb2YgaXRzIHRpbGluZyB0aGF0IGFyZSBub3QgY29ubmVjdGVkIG5vdy5cbmNvbnN0IExheW91dERlc2NyaXB0aW9uID0gb2JzZXJ2ZXIoXG4gICh7IGxheW91dCwgc3RhY2tlZCB9OiB7IGxheW91dDogU2F2ZWRXaW5kb3dMYXlvdXQ7IHN0YWNrZWQ/OiBib29sZWFuIH0pID0+IHtcbiAgICBjb25zdCBtb2RlbCA9IHVzZUluamVjdCh3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlKSgpO1xuICAgIGNvbnN0IG1pc3NpbmcgPSBtb2RlbC5taXNzaW5nU2NyZWVuc09mKGxheW91dCk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFNwYW5cbiAgICAgICAgJGNvbG9yPVwidGV4dE11dGVkXCJcbiAgICAgICAgJGZvbnQ9e3sgc2l6ZTogXCJzXCIgfX1cbiAgICAgICAgJHRvb2x0aXA9e2xheW91dC53aW5kb3dzLm1hcCgoaXQpID0+IGl0LnRpdGxlKS5qb2luKFwiXFxuXCIpfVxuICAgICAgPlxuICAgICAgICB7W1xuICAgICAgICAgIHBsdXJhbChsYXlvdXQud2luZG93cy5sZW5ndGgsIFwid2luZG93XCIpLFxuICAgICAgICAgIC4uLihsYXlvdXQuZGlzcGxheXNcbiAgICAgICAgICAgID8gW3BsdXJhbChsYXlvdXQuZGlzcGxheXMubGVuZ3RoLCBcInNjcmVlblwiKV1cbiAgICAgICAgICAgIDogW10pLFxuICAgICAgICBdLmpvaW4oXCIgXHUwMEI3IFwiKX1cbiAgICAgICAge21pc3NpbmcgPiAwICYmXG4gICAgICAgICAgKHN0YWNrZWQgPyAoXG4gICAgICAgICAgICAvLyBPbiBhIGxpbmUgb2YgaXRzIG93biwgaW4gdGhlIG5hcnJvdyBsaXN0LlxuICAgICAgICAgICAgPFNwYW4gJGNvbG9yPVwiY3JpdGljYWxcIiAkc3R5bGU9e3sgZGlzcGxheTogXCJibG9ja1wiIH19PlxuICAgICAgICAgICAgICB7cGx1cmFsKG1pc3NpbmcsIFwic2NyZWVuXCIpfSBtaXNzaW5nXG4gICAgICAgICAgICA8L1NwYW4+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxTcGFuICRjb2xvcj1cImNyaXRpY2FsXCI+XG4gICAgICAgICAgICAgIHtcIiBcIn1cbiAgICAgICAgICAgICAgXHUwMEI3IHtwbHVyYWwobWlzc2luZywgXCJzY3JlZW5cIil9IG1pc3NpbmdcbiAgICAgICAgICAgIDwvU3Bhbj5cbiAgICAgICAgICApKX1cbiAgICAgIDwvU3Bhbj5cbiAgICApO1xuICB9LFxuKTtcblxuLy8gVGhlIG5hbWUgb2YgdGhlIGxheW91dCBzZWxlY3RlZCwgcmVuYW1lZCBieSBjbGlja2luZyBpdDogRW50ZXIgb3IgbGVhdmluZyBpdCBrZWVwcyB0aGUgbmFtZVxuLy8gdHlwZWQsIEVzY2FwZSB0aGUgbmFtZSBpdCBoYWQuXG5jb25zdCBMYXlvdXROYW1lID0gb2JzZXJ2ZXIoKHsgbmFtZSB9OiB7IG5hbWU6IHN0cmluZyB9KSA9PiB7XG4gIGNvbnN0IG1vZGVsID0gdXNlSW5qZWN0KHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUpKCk7XG5cbiAgLy8gU2VsZWN0cyB0aGUgbmFtZSBvbmNlIGl0cyBpbnB1dCBzaG93cywgc28gdGhhdCB0eXBpbmcgcmVwbGFjZXMgaXQuXG4gIGNvbnN0IHNlbGVjdFdoZW5TaG93biA9IHVzZUNhbGxiYWNrKChpbnB1dDogSFRNTElucHV0RWxlbWVudCB8IG51bGwpID0+IHtcbiAgICBpZiAoaW5wdXQpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgICBpbnB1dC5zZWxlY3QoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW10pO1xuXG4gIGlmIChtb2RlbC5yZW5hbWluZy5nZXQoKSAhPT0gbmFtZSkge1xuICAgIHJldHVybiAoXG4gICAgICA8U3BhblxuICAgICAgICAkZm9udD17eyBib2xkOiB0cnVlLCBzaXplOiBcImxcIiB9fVxuICAgICAgICAkZmxleD17eyBkaXJlY3Rpb246IFwiaG9yaXpvbnRhbFwiLCBnYXA6IFwieHNcIiwgdmVydGljYWxBbGlnbjogXCJjZW50ZXJcIiB9fVxuICAgICAgICAkc3R5bGU9e3sgY3Vyc29yOiBcInBvaW50ZXJcIiwgYWxpZ25TZWxmOiBcImZsZXgtc3RhcnRcIiB9fVxuICAgICAgICAkdG9vbHRpcD1cIkNsaWNrIHRvIHJlbmFtZVwiXG4gICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICB0YWJJbmRleD17MH1cbiAgICAgICAgb25DbGljaz17KCkgPT4gbW9kZWwuc3RhcnRSZW5hbWluZyhuYW1lKX1cbiAgICAgICAgb25LZXlEb3duPXsoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBcIkVudGVyXCIpIHtcbiAgICAgICAgICAgIG1vZGVsLnN0YXJ0UmVuYW1pbmcobmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICB7bmFtZX1cbiAgICAgICAgPEVkaXRJY29uICRzaXplPVwibFwiICRjb2xvcj1cInRleHRNdXRlZFwiIC8+XG4gICAgICA8L1NwYW4+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPEZvcm1cbiAgICAgIG9uU3VibWl0PXsoZXZlbnQpID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdm9pZCBtb2RlbC5yZW5hbWUoKTtcbiAgICAgIH19XG4gICAgPlxuICAgICAgPFRleHRJbnB1dFxuICAgICAgICBhdXRvRm9jdXNcbiAgICAgICAgYXJpYS1sYWJlbD1cIk5hbWUgb2YgdGhlIGxheW91dFwiXG4gICAgICAgIHZhbHVlPXttb2RlbC5yZW5hbWVEcmFmdC5nZXQoKX1cbiAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT4gbW9kZWwuc2V0UmVuYW1lRHJhZnQoZXZlbnQudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgJHJlZj17c2VsZWN0V2hlblNob3dufVxuICAgICAgICBvbkJsdXI9eygpID0+IHZvaWQgbW9kZWwucmVuYW1lKCl9XG4gICAgICAgIG9uS2V5RG93bj17KGV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgbW9kZWwuY2FuY2VsUmVuYW1pbmcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH19XG4gICAgICAvPlxuICAgIDwvRm9ybT5cbiAgKTtcbn0pO1xuXG4vLyBPbmUgbGF5b3V0IGluIHRoZSBsaXN0IG9uIHRoZSBsZWZ0LCBhIHJvdyBvZiBpdCwgc2VsZWN0ZWQgYnkgY2xpY2tpbmcgaXQuXG5jb25zdCBMYXlvdXRJdGVtID0gb2JzZXJ2ZXIoKHsgbGF5b3V0IH06IHsgbGF5b3V0OiBTYXZlZFdpbmRvd0xheW91dCB9KSA9PiB7XG4gIGNvbnN0IG1vZGVsID0gdXNlSW5qZWN0KHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUpKCk7XG4gIGNvbnN0IGlzU2VsZWN0ZWQgPSBtb2RlbC5zZWxlY3RlZC5nZXQoKSA9PT0gbGF5b3V0Lm5hbWU7XG5cbiAgcmV0dXJuIChcbiAgICA8RGl2XG4gICAgICBjbGFzc05hbWU9e1tzdHlsZXMucm93LCBpc1NlbGVjdGVkID8gc3R5bGVzLnNlbGVjdGVkIDogXCJcIl0uam9pbihcIiBcIil9XG4gICAgICAkZmxleD17eyBkaXJlY3Rpb246IFwidmVydGljYWxcIiwgZ2FwOiBcInh4c1wiIH19XG4gICAgICAkcGFkZGluZz17eyB2ZXJ0aWNhbDogXCJtXCIsIGhvcml6b250YWw6IFwibVwiIH19XG4gICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgIHRhYkluZGV4PXswfVxuICAgICAgYXJpYS1wcmVzc2VkPXtpc1NlbGVjdGVkfVxuICAgICAgb25DbGljaz17KCkgPT4gdm9pZCBtb2RlbC5zZWxlY3QobGF5b3V0Lm5hbWUpfVxuICAgICAgb25LZXlEb3duPXsoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJFbnRlclwiIHx8IGV2ZW50LmtleSA9PT0gXCIgXCIpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHZvaWQgbW9kZWwuc2VsZWN0KGxheW91dC5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICA+XG4gICAgICB7aXNTZWxlY3RlZCAmJiAoXG4gICAgICAgIDxTcGFuXG4gICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMubWFya2VyfVxuICAgICAgICAgICRiYWNrZ3JvdW5kQ29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICAgIDxTcGFuIGNsYXNzTmFtZT17c3R5bGVzLm5hbWVMaW5lfT5cbiAgICAgICAgPFNwYW4gY2xhc3NOYW1lPXtzdHlsZXMubmFtZX0gJHRvb2x0aXA9e2xheW91dC5uYW1lfT5cbiAgICAgICAgICB7bGF5b3V0Lm5hbWV9XG4gICAgICAgIDwvU3Bhbj5cblxuICAgICAgICB7LyogQXQgdGhlIHJvdydzIHJpZ2h0IGVuZCwgc2hvd24gd2hpbGUgdGhlIHBvaW50ZXIgaXMgb24gdGhlIHJvdy4gKi99XG4gICAgICAgIDxCdXR0b25cbiAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlcy5yZWNhbGx9XG4gICAgICAgICAgJGludGVyYWN0aXZlXG4gICAgICAgICAgYXJpYS1sYWJlbD17YFJlY2FsbCAke2xheW91dC5uYW1lfWB9XG4gICAgICAgICAgJHRvb2x0aXA9XCJSZWNhbGw6IHB1dCB0aGUgd2luZG93cyBiYWNrIHdoZXJlIHRoaXMgbGF5b3V0IGhhcyB0aGVtXCJcbiAgICAgICAgICAkZW5hYmxlZD17bW9kZWwuY2FuQXJyYW5nZS5nZXQoKX1cbiAgICAgICAgICAvLyBOb3Qgc2VsZWN0aW5nIHRoZSBsYXlvdXQgYnkgdGhlIHJvdzogcmVjYWxsaW5nIHNlbGVjdHMgaXQgaXRzZWxmLlxuICAgICAgICAgIG9uQ2xpY2s9eyhldmVudCkgPT4ge1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB2b2lkIG1vZGVsLnJlY2FsbChsYXlvdXQubmFtZSk7XG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxIaXN0b3J5SWNvbiAkc2l6ZT1cImxcIiAkY29sb3I9XCJwcmltYXJ5XCIgLz5cbiAgICAgICAgPC9CdXR0b24+XG4gICAgICA8L1NwYW4+XG4gICAgICA8TGF5b3V0RGVzY3JpcHRpb24gbGF5b3V0PXtsYXlvdXR9IHN0YWNrZWQgLz5cbiAgICA8L0Rpdj5cbiAgKTtcbn0pO1xuXG4vLyBUaGUgbGVmdCBwYW5lbDogdGhlIGxheW91dHMsIGFuZCB0aGUgYnV0dG9uIHNhdmluZyB0aGUgd2luZG93cyBhcyB0aGV5IGFyZSBub3cgYXMgYSBuZXcgb25lLlxuY29uc3QgTGF5b3V0TGlzdCA9IG9ic2VydmVyKCgpID0+IHtcbiAgY29uc3QgbW9kZWwgPSB1c2VJbmplY3Qod2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSkoKTtcbiAgY29uc3QgbGF5b3V0cyA9IG1vZGVsLmxheW91dHMuZ2V0KCk7XG5cbiAgcmV0dXJuIChcbiAgICA8RGl2XG4gICAgICAkZmxleD17eyBkaXJlY3Rpb246IFwidmVydGljYWxcIiwgZ2FwOiBcInNcIiB9fVxuICAgICAgJHN0eWxlPXt7IHdpZHRoOiBcIjE3JVwiLCBtaW5XaWR0aDogMjAwLCBmbGV4U2hyaW5rOiAwIH19XG4gICAgPlxuICAgICAgPERpdlxuICAgICAgICAkZmxleD17eyBkaXJlY3Rpb246IFwiaG9yaXpvbnRhbFwiLCBnYXA6IFwic1wiLCB2ZXJ0aWNhbEFsaWduOiBcImNlbnRlclwiIH19XG4gICAgICA+XG4gICAgICAgIDxTcGFuICRmb250PXt7IGJvbGQ6IHRydWUgfX0gJGZsZXhDaGlsZD5cbiAgICAgICAgICBMYXlvdXRzXG4gICAgICAgIDwvU3Bhbj5cblxuICAgICAgICB7LyogU2lkZSBieSBzaWRlLCBjbG9zZXIgdG8gZWFjaCBvdGhlciB0aGFuIHRvIHRoZSBoZWFkaW5nLiAqL31cbiAgICAgICAgPERpdlxuICAgICAgICAgICRmbGV4PXt7XG4gICAgICAgICAgICBkaXJlY3Rpb246IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgICAgICAgZ2FwOiBcInhzXCIsXG4gICAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiBcImNlbnRlclwiLFxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAkaW50ZXJhY3RpdmVcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJEdXBsaWNhdGUgbGF5b3V0XCJcbiAgICAgICAgICAgICR0b29sdGlwPXtcbiAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0ZWRMYXlvdXQuZ2V0KClcbiAgICAgICAgICAgICAgICA/IGBDb3B5IFwiJHttb2RlbC5zZWxlY3RlZExheW91dC5nZXQoKSEubmFtZX1cIiwgd2l0aCBpdHMgdGlsaW5nLCBhcyBhIG5ldyBsYXlvdXRgXG4gICAgICAgICAgICAgICAgOiBcIlNlbGVjdCBhIGxheW91dCB0byBjb3B5IGl0XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICRlbmFibGVkPXshIW1vZGVsLnNlbGVjdGVkTGF5b3V0LmdldCgpfVxuICAgICAgICAgICAgJG9uQ2xpY2s9eygpID0+IG1vZGVsLmR1cGxpY2F0ZSgpfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHsvKiBTbWFsbGVyIHRoYW4gdGhlIHBsdXMgYmVzaWRlIGl0OiB0aGUgY29weSBnbHlwaCBmaWxscyBpdHMgYm94IHdoZXJlIHRoZSBwbHVzIGRvZXMgbm90LiAqL31cbiAgICAgICAgICAgIDxDb250ZW50Q29weUljb24gJHNpemU9XCJzXCIgLz5cbiAgICAgICAgICA8L0J1dHRvbj5cblxuICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICRpbnRlcmFjdGl2ZVxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIk5ldyBsYXlvdXRcIlxuICAgICAgICAgICAgJHRvb2x0aXA9XCJTYXZlIHRoZSB3aW5kb3dzIGFzIHRoZXkgYXJlIG5vdywgYW5kIHRoZSB0aWxpbmcsIGFzIGEgbmV3IGxheW91dFwiXG4gICAgICAgICAgICAkZW5hYmxlZD17bW9kZWwuY2FuQXJyYW5nZS5nZXQoKX1cbiAgICAgICAgICAgICRvbkNsaWNrPXsoKSA9PiBtb2RlbC5jcmVhdGUoKX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8QWRkSWNvbiAvPlxuICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICA8L0Rpdj5cbiAgICAgIDwvRGl2PlxuXG4gICAgICB7bGF5b3V0cz8ubGVuZ3RoID09PSAwICYmIChcbiAgICAgICAgPFNwYW4gJGNvbG9yPVwidGV4dE11dGVkXCI+XG4gICAgICAgICAgTm8gbGF5b3V0cyB5ZXQuIEFycmFuZ2UgdGhlIHdpbmRvd3Mgb2YgTGVucyB0aGUgd2F5IHlvdSBsaWtlLCB0aGVuXG4gICAgICAgICAgY2xpY2sgKyB0byBzYXZlIHRoZW0gYXMgYSBsYXlvdXQuXG4gICAgICAgIDwvU3Bhbj5cbiAgICAgICl9XG5cbiAgICAgIHsvKiBUaGUgaGVpZ2h0IHRoZSBwYW5lbCBoYXMsIHdpdGhvdXQgdGhlIGxheW91dHMgbWFraW5nIGl0IHRhbGxlcjogdGhlIGJveCBvZiB0aGVtIGZpdHMgdGhlbSxcbiAgICAgICAgICBzY3JvbGxpbmcgd2hlbiB0aGV5IGFyZSBtb3JlIHRoYW4gZml0LiAqL31cbiAgICAgIDxEaXYgJGZsZXhDaGlsZCAkc3R5bGU9e3sgbWluSGVpZ2h0OiAwIH19PlxuICAgICAgICB7ISFsYXlvdXRzPy5sZW5ndGggJiYgKFxuICAgICAgICAgIDxEaXZcbiAgICAgICAgICAgIGNsYXNzTmFtZT17c3R5bGVzLmxpc3R9XG4gICAgICAgICAgICAkZmxleD17eyBkaXJlY3Rpb246IFwidmVydGljYWxcIiB9fVxuICAgICAgICAgICAgJGJhY2tncm91bmRDb2xvcj1cImJhY2tncm91bmRTZWNvbmRhcnlcIlxuICAgICAgICAgICAgJGJvcmRlcj17eyBjb2xvcjogXCJib3JkZXJQcmltYXJ5XCIsIHdpZHRoOiBcInh4c1wiLCByYWRpdXM6IFwibVwiIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAge2xheW91dHMubWFwKChsYXlvdXQpID0+IChcbiAgICAgICAgICAgICAgPExheW91dEl0ZW0ga2V5PXtsYXlvdXQubmFtZX0gbGF5b3V0PXtsYXlvdXR9IC8+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICA8L0Rpdj5cbiAgICAgICAgKX1cbiAgICAgIDwvRGl2PlxuICAgIDwvRGl2PlxuICApO1xufSk7XG5cbi8vIFBpbnMgdGhlIGxheW91dCB0byB0aGUgaG90YmFyLCB0byByZWNhbGwgaXQgZnJvbSB0aGVyZSwgb3IgdGFrZXMgaXQgb2ZmLlxuY29uc3QgUGluVG9Ib3RiYXIgPSBvYnNlcnZlcigoeyBuYW1lIH06IHsgbmFtZTogc3RyaW5nIH0pID0+IHtcbiAgY29uc3QgbW9kZWwgPSB1c2VJbmplY3Qod2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSkoKTtcbiAgY29uc3QgaXNQaW5uZWQgPSBtb2RlbC5pc1Bpbm5lZChuYW1lKS5nZXQoKTtcblxuICByZXR1cm4gKFxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3NOYW1lPVwid2luZG93LW1hbmFnZXItaWNvbi1idXR0b25cIlxuICAgICAgYXJpYS1sYWJlbD17aXNQaW5uZWQgPyBgVW5waW4gJHtuYW1lfSBmcm9tIHRoZSBob3RiYXJgIDogYFBpbiAke25hbWV9IHRvIHRoZSBob3RiYXJgfVxuICAgICAgYXJpYS1wcmVzc2VkPXtpc1Bpbm5lZH1cbiAgICAgIHRpdGxlPXtcbiAgICAgICAgaXNQaW5uZWRcbiAgICAgICAgICA/IFwiVW5waW4gZnJvbSB0aGUgaG90YmFyXCJcbiAgICAgICAgICA6IFwiUGluIHRvIHRoZSBob3RiYXIsIHRvIHJlY2FsbCB0aGlzIGxheW91dCBmcm9tIHRoZXJlXCJcbiAgICAgIH1cbiAgICAgIG9uQ2xpY2s9eygpID0+IHZvaWQgbW9kZWwudG9nZ2xlUGlubmVkKG5hbWUpfVxuICAgID5cbiAgICAgIDxIb3RiYXJJY29uICRzaXplPVwibFwiICRjb2xvcj17aXNQaW5uZWQgPyBcInByaW1hcnlcIiA6IFwidGV4dE11dGVkXCJ9IC8+XG4gICAgPC9idXR0b24+XG4gICk7XG59KTtcblxuLy8gVGhlIHRvcCBvZiB0aGUgcmlnaHQgcGFuZWw6IHRoZSBsYXlvdXQgc2VsZWN0ZWQsIGFuZCB3aGF0IGNhbiBiZSBkb25lIHdpdGggaXQuXG5jb25zdCBTZWxlY3RlZExheW91dCA9IG9ic2VydmVyKCgpID0+IHtcbiAgY29uc3QgbW9kZWwgPSB1c2VJbmplY3Qod2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSkoKTtcbiAgY29uc3QgbGF5b3V0ID0gbW9kZWwuc2VsZWN0ZWRMYXlvdXQuZ2V0KCk7XG5cbiAgaWYgKCFsYXlvdXQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPERpdiAkZmxleD17eyBkaXJlY3Rpb246IFwiaG9yaXpvbnRhbFwiLCBnYXA6IFwibVwiLCB2ZXJ0aWNhbEFsaWduOiBcImNlbnRlclwiIH19PlxuICAgICAgPERpdiAkZmxleD17eyBkaXJlY3Rpb246IFwidmVydGljYWxcIiwgZ2FwOiBcInh4c1wiIH19ICRmbGV4Q2hpbGQ+XG4gICAgICAgIDxEaXZcbiAgICAgICAgICAkZmxleD17e1xuICAgICAgICAgICAgZGlyZWN0aW9uOiBcImhvcml6b250YWxcIixcbiAgICAgICAgICAgIGdhcDogXCJ4eHNcIixcbiAgICAgICAgICAgIHZlcnRpY2FsQWxpZ246IFwiY2VudGVyXCIsXG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxMYXlvdXROYW1lIG5hbWU9e2xheW91dC5uYW1lfSAvPlxuXG4gICAgICAgICAge21vZGVsLnJlbmFtaW5nLmdldCgpICE9PSBsYXlvdXQubmFtZSAmJiAoXG4gICAgICAgICAgICA8UGluVG9Ib3RiYXIgbmFtZT17bGF5b3V0Lm5hbWV9IC8+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIHttb2RlbC5yZW5hbWluZy5nZXQoKSAhPT0gbGF5b3V0Lm5hbWUgJiYgKFxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwid2luZG93LW1hbmFnZXItaWNvbi1idXR0b25cIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPXtgRGVsZXRlICR7bGF5b3V0Lm5hbWV9YH1cbiAgICAgICAgICAgICAgdGl0bGU9XCJEZWxldGUgdGhpcyBsYXlvdXRcIlxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB2b2lkIG1vZGVsLnJlbW92ZShsYXlvdXQubmFtZSl9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxEZWxldGVPdXRsaW5lSWNvbiAkc2l6ZT1cImxcIiAkY29sb3I9XCJjcml0aWNhbFwiIC8+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICApfVxuICAgICAgICA8L0Rpdj5cbiAgICAgICAgPExheW91dERlc2NyaXB0aW9uIGxheW91dD17bGF5b3V0fSAvPlxuICAgICAgPC9EaXY+XG5cbiAgICAgIDxQbGFpbkJ1dHRvblxuICAgICAgICAkZGlzYWJsZWQ9eyFtb2RlbC5jYW5BcnJhbmdlLmdldCgpfVxuICAgICAgICAkdG9vbHRpcD1cIlB1dCB0aGUgd2luZG93cyBiYWNrIHdoZXJlIHRoZSBsYXlvdXQgaGFzIHRoZW1cIlxuICAgICAgICBvbkNsaWNrPXsoKSA9PiB2b2lkIG1vZGVsLnJlY2FsbChsYXlvdXQubmFtZSl9XG4gICAgICA+XG4gICAgICAgIFJlY2FsbFxuICAgICAgPC9QbGFpbkJ1dHRvbj5cblxuICAgICAge21vZGVsLnNhdmVkTm90ZS5nZXQoKSAmJiAoXG4gICAgICAgIDxTcGFuICRjb2xvcj1cInN1Y2Nlc3NcIiByb2xlPVwic3RhdHVzXCI+XG4gICAgICAgICAge21vZGVsLnNhdmVkTm90ZS5nZXQoKX1cbiAgICAgICAgPC9TcGFuPlxuICAgICAgKX1cblxuICAgICAgPFBsYWluQnV0dG9uXG4gICAgICAgICRkaXNhYmxlZD17XG4gICAgICAgICAgIW1vZGVsLmNhbkFycmFuZ2UuZ2V0KCkgfHxcbiAgICAgICAgICAobW9kZWwuaXNTZWxlY3RlZFNhdmVkLmdldCgpICYmICFtb2RlbC5oYXNVbnRpbGVkVG9MZWF2ZU91dC5nZXQoKSlcbiAgICAgICAgfVxuICAgICAgICAkdG9vbHRpcD1cIlNhdmUgdGhlIHdpbmRvd3MgYXMgdGhleSBhcmUgbm93LCBhbmQgdGhlIHRpbGluZyBiZWxvdywgaW50byB0aGlzIGxheW91dCwgbGVhdmluZyBvdXQgdGhlIHdpbmRvd3Mgbm90IHRpbGVkXCJcbiAgICAgICAgb25DbGljaz17KCkgPT4gbW9kZWwuc2F2ZU92ZXIobGF5b3V0Lm5hbWUsIHsgdGlsZWRPbmx5OiB0cnVlIH0pfVxuICAgICAgPlxuICAgICAgICBTYXZlIHRpbGVkIG9ubHlcbiAgICAgIDwvUGxhaW5CdXR0b24+XG5cbiAgICAgIDxQcmltYXJ5QnV0dG9uXG4gICAgICAgIEljb249e1NhdmVJY29ufVxuICAgICAgICAkZGlzYWJsZWQ9eyFtb2RlbC5jYW5BcnJhbmdlLmdldCgpIHx8IG1vZGVsLmlzU2VsZWN0ZWRTYXZlZC5nZXQoKX1cbiAgICAgICAgJHRvb2x0aXA9e1xuICAgICAgICAgIG1vZGVsLmlzU2VsZWN0ZWRTYXZlZC5nZXQoKVxuICAgICAgICAgICAgPyBcIk5vdGhpbmcgdG8gc2F2ZTogdGhlIHdpbmRvd3MgYW5kIHRoZSB0aWxpbmcgYmVsb3cgYXJlIGFzIHRoaXMgbGF5b3V0IGhhcyB0aGVtXCJcbiAgICAgICAgICAgIDogXCJTYXZlIHRoZSB3aW5kb3dzIGFzIHRoZXkgYXJlIG5vdywgYW5kIHRoZSB0aWxpbmcgYmVsb3csIGludG8gdGhpcyBsYXlvdXRcIlxuICAgICAgICB9XG4gICAgICAgIG9uQ2xpY2s9eygpID0+IG1vZGVsLnNhdmVPdmVyKGxheW91dC5uYW1lKX1cbiAgICAgID5cbiAgICAgICAgU2F2ZVxuICAgICAgPC9QcmltYXJ5QnV0dG9uPlxuICAgIDwvRGl2PlxuICApO1xufSk7XG5cbmNvbnN0IFdpbmRvd0xheW91dHNNb2RhbCA9IG9ic2VydmVyKCgpID0+IHtcbiAgY29uc3QgbW9kZWwgPSB1c2VJbmplY3Qod2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSkoKTtcbiAgY29uc3QgcmVzcG9uZCA9IHVzZVJlc3BvbmRGcm9tTW9kYWwod2luZG93TGF5b3V0c01vZGFsS2luZCk7XG4gIGNvbnN0IHN0YXR1cyA9IG1vZGVsLnN0YXR1cy5nZXQoKTtcblxuICByZXR1cm4gKFxuICAgIDxNb2RhbENvbnRhaW5lclxuICAgICAgJHN0eWxlPXt7XG4gICAgICAgIHdpZHRoOiBcImNhbGModmFyKC0tdW5pdCkgKiAyNjApXCIsXG4gICAgICAgIG1heFdpZHRoOiBcIjk1dndcIixcbiAgICAgICAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgICAgIH19XG4gICAgPlxuICAgICAgPE1vZGFsSGVhZGVyIGljb249ezxTcGxpdFZpZXdJY29uIC8+fT5XaW5kb3cgbGF5b3V0czwvTW9kYWxIZWFkZXI+XG5cbiAgICAgIDxNb2RhbENvbnRlbnRcbiAgICAgICAgJGZsZXg9e3sgZGlyZWN0aW9uOiBcInZlcnRpY2FsXCIsIGdhcDogXCJtXCIgfX1cbiAgICAgICAgJHN0eWxlPXt7IGZsZXhHcm93OiAxIH19XG4gICAgICA+XG4gICAgICAgIHshbW9kZWwuY2FuQXJyYW5nZS5nZXQoKSAmJiAoXG4gICAgICAgICAgPFNwYW4gJGNvbG9yPVwid2FybmluZ1wiPlxuICAgICAgICAgICAgVGhpcyBMZW5zIGRvZXMgbm90IGxldCB3aW5kb3dzIGJlIGFycmFuZ2VkLiBXaW5kb3cgbGF5b3V0cyBuZWVkIExlbnNcbiAgICAgICAgICAgIFN0dWRpby5cbiAgICAgICAgICA8L1NwYW4+XG4gICAgICAgICl9XG5cbiAgICAgICAge3N0YXR1cyAmJiA8U3BhbiAkY29sb3I9XCJ0ZXh0TXV0ZWRcIj57c3RhdHVzfTwvU3Bhbj59XG5cbiAgICAgICAgPERpdlxuICAgICAgICAgICRmbGV4PXt7IGRpcmVjdGlvbjogXCJob3Jpem9udGFsXCIsIGdhcDogXCJsXCIgfX1cbiAgICAgICAgICAkZmxleENoaWxkXG4gICAgICAgICAgJHN0eWxlPXt7IGFsaWduSXRlbXM6IFwic3RyZXRjaFwiIH19XG4gICAgICAgID5cbiAgICAgICAgICA8TGF5b3V0TGlzdCAvPlxuXG4gICAgICAgICAgey8qIEVtcHR5IHVudGlsIGEgbGF5b3V0IGlzIHNlbGVjdGVkLiAqL31cbiAgICAgICAgICA8RGl2XG4gICAgICAgICAgICAkZmxleD17eyBkaXJlY3Rpb246IFwidmVydGljYWxcIiwgZ2FwOiBcIm1cIiB9fVxuICAgICAgICAgICAgJGZsZXhDaGlsZFxuICAgICAgICAgICAgJHN0eWxlPXt7IG1pbldpZHRoOiAwIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAge21vZGVsLnNlbGVjdGVkTGF5b3V0LmdldCgpICYmIChcbiAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICA8U2VsZWN0ZWRMYXlvdXQgLz5cbiAgICAgICAgICAgICAgICA8VGlsZVdpbmRvd3MgLz5cbiAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvRGl2PlxuICAgICAgICA8L0Rpdj5cbiAgICAgIDwvTW9kYWxDb250ZW50PlxuXG4gICAgICA8TW9kYWxGb290ZXI+XG4gICAgICAgIDxQbGFpbkJ1dHRvbiBvbkNsaWNrPXsoKSA9PiByZXNwb25kKCl9PkNsb3NlPC9QbGFpbkJ1dHRvbj5cbiAgICAgIDwvTW9kYWxGb290ZXI+XG4gICAgPC9Nb2RhbENvbnRhaW5lcj5cbiAgKTtcbn0pO1xuXG4vLyBVc2VzIG5vdGhpbmcgb2YgdGhlIGV4dGVuc2lvbiBidXQgdGhlIG1vZGFsJ3Mgb3duIGFuc3dlcmluZywgd2hpY2ggTGVucyBwcm92aWRlcy5cbmNvbnN0IE91dE9mRGF0ZU1vZGFsID0gKHsgZXJyb3IgfTogeyBlcnJvcjogdW5rbm93biB9KSA9PiB7XG4gIGNvbnN0IHJlc3BvbmQgPSB1c2VSZXNwb25kRnJvbU1vZGFsKHdpbmRvd0xheW91dHNNb2RhbEtpbmQpO1xuXG4gIHJldHVybiAoXG4gICAgPE1vZGFsQ29udGFpbmVyXG4gICAgICAkc3R5bGU9e3sgd2lkdGg6IFwiY2FsYyh2YXIoLS11bml0KSAqIDE0MClcIiwgbWF4V2lkdGg6IFwiOTB2d1wiIH19XG4gICAgPlxuICAgICAgPE1vZGFsSGVhZGVyIGljb249ezxTcGxpdFZpZXdJY29uIC8+fT5XaW5kb3cgbGF5b3V0czwvTW9kYWxIZWFkZXI+XG5cbiAgICAgIDxNb2RhbENvbnRlbnQgJGZsZXg9e3sgZGlyZWN0aW9uOiBcInZlcnRpY2FsXCIsIGdhcDogXCJtXCIgfX0+XG4gICAgICAgIDxTcGFuPlxuICAgICAgICAgIFRoaXMgZGlhbG9nIHN0b3BwZWQgd29ya2luZywgbW9zdCBsaWtlbHkgYmVjYXVzZSB0aGUgZXh0ZW5zaW9uIHdhc1xuICAgICAgICAgIHVwZGF0ZWQgd2hpbGUgaXQgd2FzIG9wZW4uXG4gICAgICAgIDwvU3Bhbj5cbiAgICAgICAgPFNwYW4gJGNvbG9yPVwidGV4dE11dGVkXCI+XG4gICAgICAgICAgQ2xvc2UgaXQgYW5kIG9wZW4gaXQgYWdhaW4uICh7U3RyaW5nKGVycm9yKX0pXG4gICAgICAgIDwvU3Bhbj5cbiAgICAgICAgey8qIFdoZXJlIGl0IGZhaWxlZCwgZm9yIHdob2V2ZXIgbG9va3MgaW50byBpdC4gKi99XG4gICAgICAgIDxwcmUgaGlkZGVuIGRhdGEtZXJyb3Itc3RhY2s+XG4gICAgICAgICAge2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IHVuZGVmaW5lZH1cbiAgICAgICAgPC9wcmU+XG4gICAgICA8L01vZGFsQ29udGVudD5cblxuICAgICAgPE1vZGFsRm9vdGVyPlxuICAgICAgICA8UGxhaW5CdXR0b24gb25DbGljaz17KCkgPT4gcmVzcG9uZCgpfT5DbG9zZTwvUGxhaW5CdXR0b24+XG4gICAgICA8L01vZGFsRm9vdGVyPlxuICAgIDwvTW9kYWxDb250YWluZXI+XG4gICk7XG59O1xuXG5jb25zdCBHdWFyZGVkV2luZG93TGF5b3V0c01vZGFsID0gKCkgPT4gKFxuICA8TW9kYWxFcnJvckJvdW5kYXJ5IGZhbGxiYWNrPXsoZXJyb3IpID0+IDxPdXRPZkRhdGVNb2RhbCBlcnJvcj17ZXJyb3J9IC8+fT5cbiAgICA8V2luZG93TGF5b3V0c01vZGFsIC8+XG4gIDwvTW9kYWxFcnJvckJvdW5kYXJ5PlxuKTtcblxuZXhwb3J0IGNvbnN0IHdpbmRvd0xheW91dHNNb2RhbEJ1bmNoID0gZ2V0TW9kYWxJbmplY3RhYmxlQnVuY2goe1xuICBraW5kOiB3aW5kb3dMYXlvdXRzTW9kYWxLaW5kLFxuICBDb21wb25lbnQ6IEd1YXJkZWRXaW5kb3dMYXlvdXRzTW9kYWwsXG4gIG9uQ2xvc2U6ICgpID0+IHVuZGVmaW5lZCxcbn0pO1xuIiwgImltcG9ydCB7IGFzU3R5bGVzaGVldCB9IGZyb20gXCJAazhzbGVucy9zdHlsZXNoZWV0LWNvbnRyYWN0c1wiO1xuZXhwb3J0IGNvbnN0IHN0eWxlc2hlZXQgPSBhc1N0eWxlc2hlZXQoeyBpZDogXCJAazhzbGVucy93aW5kb3ctbGF5b3V0cy9zcmMvdWkvaWNvbi1idXR0b24uc2Nzc1wiLCBjc3M6IFwiLndpbmRvdy1tYW5hZ2VyLWljb24tYnV0dG9uIHtcXG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgcGFkZGluZzogMnB4O1xcbiAgYm9yZGVyOiBub25lO1xcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgYmFja2dyb3VuZDogbm9uZTtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLndpbmRvdy1tYW5hZ2VyLWljb24tYnV0dG9uOmhvdmVyIHtcXG4gIGJhY2tncm91bmQ6IHJnYmEoMTI3LCAxMjcsIDEyNywgMC4yKTtcXG59XCIgfSk7IiwgImltcG9ydCB7IGFzU3R5bGVzaGVldCB9IGZyb20gXCJAazhzbGVucy9zdHlsZXNoZWV0LWNvbnRyYWN0c1wiO1xuZXhwb3J0IGNvbnN0IHN0eWxlc2hlZXQgPSBhc1N0eWxlc2hlZXQoeyBpZDogXCJAazhzbGVucy93aW5kb3ctbGF5b3V0cy9zcmMvdWkvbGF5b3V0LWxpc3QubW9kdWxlLnNjc3NcIiwgY3NzOiBcIi5sYXlvdXQtbGlzdC1tb2R1bGVfX2xpc3RfX19hSm9WTyB7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgbWF4LWhlaWdodDogMTAwJTtcXG4gIG92ZXJmbG93OiBhdXRvO1xcbn1cXG5cXG4ubGF5b3V0LWxpc3QtbW9kdWxlX19yb3dfX19CYnZIZSB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBmbGV4LXNocmluazogMDtcXG4gIG91dGxpbmU6IG5vbmU7XFxufVxcbi5sYXlvdXQtbGlzdC1tb2R1bGVfX3Jvd19fX0JidkhlICsgLmxheW91dC1saXN0LW1vZHVsZV9fcm93X19fQmJ2SGUge1xcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkO1xcbiAgYm9yZGVyLXRvcC1jb2xvcjogaW5oZXJpdDtcXG59XFxuLmxheW91dC1saXN0LW1vZHVsZV9fcm93X19fQmJ2SGU6aG92ZXIsIC5sYXlvdXQtbGlzdC1tb2R1bGVfX3Jvd19fX0JidkhlOmZvY3VzLXZpc2libGUge1xcbiAgYmFja2dyb3VuZDogcmdiYSgxMjcsIDEyNywgMTI3LCAwLjA4KTtcXG59XFxuXFxuLmxheW91dC1saXN0LW1vZHVsZV9fc2VsZWN0ZWRfX19Iby0teSxcXG4ubGF5b3V0LWxpc3QtbW9kdWxlX19zZWxlY3RlZF9fX0hvLS15OmhvdmVyIHtcXG4gIGJhY2tncm91bmQ6IHJnYmEoMTI3LCAxMjcsIDEyNywgMC4xNCk7XFxufVxcblxcbi5sYXlvdXQtbGlzdC1tb2R1bGVfX21hcmtlcl9fX0J0VWlDIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGxlZnQ6IDA7XFxuICB0b3A6IDA7XFxuICBib3R0b206IDA7XFxuICB3aWR0aDogM3B4O1xcbn1cXG5cXG4ubGF5b3V0LWxpc3QtbW9kdWxlX19uYW1lTGluZV9fX1R4clRlIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgZ2FwOiA4cHg7XFxuICBtaW4td2lkdGg6IDA7XFxufVxcblxcbi5sYXlvdXQtbGlzdC1tb2R1bGVfX25hbWVfX19OLWIzcyB7XFxuICBmbGV4OiAxIDEgYXV0bztcXG4gIG1pbi13aWR0aDogMDtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxufVxcblxcbi5sYXlvdXQtbGlzdC1tb2R1bGVfX3JlY2FsbF9fX25yTmJEIHtcXG4gIGZsZXgtc2hyaW5rOiAwO1xcbiAgb3BhY2l0eTogMDtcXG59XFxuLmxheW91dC1saXN0LW1vZHVsZV9fcmVjYWxsX19fbnJOYkQ6Zm9jdXMtdmlzaWJsZSB7XFxuICBvcGFjaXR5OiAxO1xcbn1cXG5cXG4ubGF5b3V0LWxpc3QtbW9kdWxlX19yb3dfX19CYnZIZTpob3ZlciAubGF5b3V0LWxpc3QtbW9kdWxlX19yZWNhbGxfX19uck5iRCB7XFxuICBvcGFjaXR5OiAxO1xcbn1cIiB9KTtcbmV4cG9ydCBkZWZhdWx0IHtcImxpc3RcIjpcImxheW91dC1saXN0LW1vZHVsZV9fbGlzdF9fX2FKb1ZPXCIsXCJyb3dcIjpcImxheW91dC1saXN0LW1vZHVsZV9fcm93X19fQmJ2SGVcIixcInNlbGVjdGVkXCI6XCJsYXlvdXQtbGlzdC1tb2R1bGVfX3NlbGVjdGVkX19fSG8tLXlcIixcIm1hcmtlclwiOlwibGF5b3V0LWxpc3QtbW9kdWxlX19tYXJrZXJfX19CdFVpQ1wiLFwibmFtZUxpbmVcIjpcImxheW91dC1saXN0LW1vZHVsZV9fbmFtZUxpbmVfX19UeHJUZVwiLFwibmFtZVwiOlwibGF5b3V0LWxpc3QtbW9kdWxlX19uYW1lX19fTi1iM3NcIixcInJlY2FsbFwiOlwibGF5b3V0LWxpc3QtbW9kdWxlX19yZWNhbGxfX19uck5iRFwifTsiLCAiaW1wb3J0IHsgQnV0dG9uLCBEaXYsIEZvcm0sIFNwYW4gfSBmcm9tIFwiQGs4c2xlbnMvZWxlbWVudC1jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBkcm9wRG93bk1lbnUgfSBmcm9tIFwiQGs4c2xlbnMvZHJvcC1kb3duLW1lbnUtY29udHJhY3RzXCI7XG5pbXBvcnQge1xuICBBZGRDaXJjbGVPdXRsaW5lSWNvbixcbiAgQ2xvc2VJY29uLFxuICBEYXNoYm9hcmRJY29uLFxuICBFZGl0SWNvbixcbiAgTW92ZVVwSWNvbixcbiAgUmVwbGF5SWNvbixcbiAgUmVtb3ZlQ2lyY2xlT3V0bGluZUljb24sXG4gIFNwaW5uZXJJY29uLFxufSBmcm9tIFwiQGs4c2xlbnMvaWNvblwiO1xuaW1wb3J0IHtcbiAgUGxhaW5CdXR0b24sXG4gIFByaW1hcnlCdXR0b24sXG4gIFRleHRJbnB1dCxcbn0gZnJvbSBcIkBrOHNsZW5zL2lucHV0LWNvbXBvbmVudHNcIjtcbmltcG9ydCB7IGlzQXBwbGljYXRpb25XaW5kb3cgfSBmcm9tIFwiQGs4c2xlbnMvbWVzc2FnaW5nLWNvbnRyYWN0c1wiO1xuaW1wb3J0IHsgdXNlSW5qZWN0IH0gZnJvbSBcIkBrOHNsZW5zL3VzZS1pbmplY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgRGlzcGxheVJlY29yZCxcbiAgV2luZG93Qm91bmRzLFxufSBmcm9tIFwiQGs4c2xlbnMvd2luZG93LWxheW91dC1jb250cmFjdHNcIjtcbmltcG9ydCB7IG9ic2VydmVyIH0gZnJvbSBcIm1vYngtcmVhY3RcIjtcbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IG5hbWVPZlNjcmVlbiB9IGZyb20gXCIuLi9sYXlvdXRzL3NjcmVlbnNcIjtcbmltcG9ydCB7XG4gIG1vdmVJblBsYW4sXG4gIHJlc2l6ZUluUGxhbixcbiAgc2V0Q29sdW1uc0luUGxhbixcbiAgc2V0Um93c0luUGxhbixcbiAgdGFyZ2V0SW5HcmlkLFxuICB1bnRpbGVTY3JlZW5JblBsYW4sXG4gIHR5cGUgUGxhbm5lZFNjcmVlbixcbiAgdHlwZSBQbGFubmVkV2luZG93LFxuICB0eXBlIFBsYW5UYXJnZXQsXG4gIHR5cGUgUmVzb2x2ZWRUaWxpbmdQbGFuLFxufSBmcm9tIFwiLi4vbGF5b3V0cy90aWxpbmctcGxhblwiO1xuaW1wb3J0IHN0eWxlcyBmcm9tIFwiLi90aWxpbmctZWRpdG9yLm1vZHVsZS5zY3NzXCI7XG5pbXBvcnQgeyBuZXdXaW5kb3dNZW51S2luZCB9IGZyb20gXCIuL25ldy13aW5kb3ctbWVudS5pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyB3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlIH0gZnJvbSBcIi4vd2luZG93LWxheW91dHMtbW9kZWwuaW5qZWN0YWJsZVwiO1xuXG4vLyBUaGUgaGVpZ2h0IG9mIHRoZSBiYW5kIG92ZXIgZWFjaCBzY3JlZW4gbmFtaW5nIGl0LCBhYm92ZSB0aGUgZ3JpZC5cbmNvbnN0IGJhbmQgPSA0MDtcbi8vIFRoZSByb29tIGxlZnQgYmV0d2VlbiBzY3JlZW5zIGRyYXduIHNpZGUgYnkgc2lkZS5cbmNvbnN0IGdhcCA9IDMyO1xuLy8gVGhlIGxlYXN0IHdpZHRoIGEgc2NyZWVuIGlzIGRyYXduIGF0IGFzIHRoZSBzY3JlZW5zIGxpZTogbmFycm93ZXIsIHRoZXkgYXJlIGRyYXduIGluIHJvd3MgaW5zdGVhZC5cbmNvbnN0IG1pblNjcmVlbldpZHRoID0gMzYwO1xuXG5pbnRlcmZhY2UgUmVjdCB7XG4gIHJlYWRvbmx5IGxlZnQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgdG9wOiBudW1iZXI7XG4gIHJlYWRvbmx5IHdpZHRoOiBudW1iZXI7XG4gIHJlYWRvbmx5IGhlaWdodDogbnVtYmVyO1xufVxuXG5jb25zdCBvdmVybGFwcyA9IChhOiBXaW5kb3dCb3VuZHMsIGI6IFdpbmRvd0JvdW5kcykgPT5cbiAgYS54IDwgYi54ICsgYi53aWR0aCAmJlxuICBiLnggPCBhLnggKyBhLndpZHRoICYmXG4gIGEueSA8IGIueSArIGIuaGVpZ2h0ICYmXG4gIGIueSA8IGEueSArIGEuaGVpZ2h0O1xuXG4vLyBXaGVyZSBlYWNoIHNjcmVlbiBpcyBkcmF3biwgaW4gcGVyY2VudCBvZiB0aGUgZHJhd2luZywgYXMgdGhlIHNjcmVlbnMgbGllIHRvIGVhY2ggb3RoZXIuIEEgc2NyZWVuXG4vLyBub3QgY29ubmVjdGVkIGlzIGRyYXduIHdoZXJlIGl0IHdhcywgdW5sZXNzIGEgc2NyZWVuIGlzIHRoZXJlIG5vdzogdGhlbiByaWdodCBvZiB0aGVtIGFsbC4gV2hlblxuLy8gdGhlIHdpZHRoIHRoZSBkcmF3aW5nIGhhcyB3b3VsZCBkcmF3IGEgc2NyZWVuIG5hcnJvd2VyIHRoYW4gaXQgY2FuIGJlIHVzZWQgYXQsIHRoZSBzY3JlZW5zIHdyYXBcbi8vIG9udG8gcm93cyBpbnN0ZWFkLCB0YWtpbmcgdGhlIGhlaWdodCB0aGV5IG5lZWQuXG5jb25zdCBkcmF3U2NyZWVucyA9IChcbiAgc2NyZWVuczogcmVhZG9ubHkgUGxhbm5lZFNjcmVlbltdLFxuICByb29tOiBudW1iZXIgfCB1bmRlZmluZWQsXG4pID0+IHtcbiAgaWYgKHNjcmVlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHsgcmVjdHM6IG5ldyBNYXA8bnVtYmVyLCBSZWN0PigpLCBhc3BlY3RSYXRpbzogMSwgd3JhcHM6IGZhbHNlIH07XG4gIH1cblxuICBjb25zdCBwbGFjZWQ6IFdpbmRvd0JvdW5kc1tdID0gW107XG5cbiAgZm9yIChjb25zdCBzY3JlZW4gb2YgWy4uLnNjcmVlbnNdLnNvcnQoXG4gICAgKGEsIGIpID0+IE51bWJlcihhLm1pc3NpbmcpIC0gTnVtYmVyKGIubWlzc2luZyksXG4gICkpIHtcbiAgICBjb25zdCBib3VuZHMgPSBzY3JlZW4uZGlzcGxheS5ib3VuZHMuZ2V0KCk7XG5cbiAgICBwbGFjZWRbc2NyZWVucy5pbmRleE9mKHNjcmVlbildID1cbiAgICAgIHNjcmVlbi5taXNzaW5nICYmIHBsYWNlZC5zb21lKChpdCkgPT4gaXQgJiYgb3ZlcmxhcHMoaXQsIGJvdW5kcykpXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uYm91bmRzLFxuICAgICAgICAgICAgeDogTWF0aC5tYXgoLi4ucGxhY2VkLmZpbHRlcihCb29sZWFuKS5tYXAoKGl0KSA9PiBpdC54ICsgaXQud2lkdGgpKSxcbiAgICAgICAgICAgIHk6IE1hdGgubWluKC4uLnBsYWNlZC5maWx0ZXIoQm9vbGVhbikubWFwKChpdCkgPT4gaXQueSkpLFxuICAgICAgICAgIH1cbiAgICAgICAgOiBib3VuZHM7XG4gIH1cblxuICBjb25zdCBtaW5YID0gTWF0aC5taW4oLi4ucGxhY2VkLm1hcCgoaXQpID0+IGl0LngpKTtcbiAgY29uc3QgbWluWSA9IE1hdGgubWluKC4uLnBsYWNlZC5tYXAoKGl0KSA9PiBpdC55KSk7XG4gIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoLi4ucGxhY2VkLm1hcCgoaXQpID0+IGl0LnggKyBpdC53aWR0aCkpIC0gbWluWDtcbiAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoLi4ucGxhY2VkLm1hcCgoaXQpID0+IGl0LnkgKyBpdC5oZWlnaHQpKSAtIG1pblk7XG5cbiAgY29uc3QgcmVjdHMgPSBuZXcgTWFwPG51bWJlciwgUmVjdD4oXG4gICAgc2NyZWVucy5tYXAoKHNjcmVlbiwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGJvdW5kcyA9IHBsYWNlZFtpbmRleF07XG5cbiAgICAgIHJldHVybiBbXG4gICAgICAgIHNjcmVlbi5kaXNwbGF5LmlkLFxuICAgICAgICB7XG4gICAgICAgICAgbGVmdDogKChib3VuZHMueCAtIG1pblgpIC8gd2lkdGgpICogMTAwLFxuICAgICAgICAgIHRvcDogKChib3VuZHMueSAtIG1pblkpIC8gaGVpZ2h0KSAqIDEwMCxcbiAgICAgICAgICB3aWR0aDogKGJvdW5kcy53aWR0aCAvIHdpZHRoKSAqIDEwMCxcbiAgICAgICAgICBoZWlnaHQ6IChib3VuZHMuaGVpZ2h0IC8gaGVpZ2h0KSAqIDEwMCxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfSksXG4gICk7XG5cbiAgY29uc3QgZml0cyA9XG4gICAgIXJvb20gfHxcbiAgICBwbGFjZWQuZXZlcnkoKGl0KSA9PiAoaXQud2lkdGggLyB3aWR0aCkgKiByb29tIC0gZ2FwID49IG1pblNjcmVlbldpZHRoKTtcblxuICByZXR1cm4gZml0c1xuICAgID8geyByZWN0cywgYXNwZWN0UmF0aW86IHdpZHRoIC8gaGVpZ2h0LCB3cmFwczogZmFsc2UgfVxuICAgIDoge1xuICAgICAgICAuLi53cmFwU2NyZWVucyhcbiAgICAgICAgICBzY3JlZW5zLm1hcCgoc2NyZWVuLCBpbmRleCkgPT4gKHtcbiAgICAgICAgICAgIGlkOiBzY3JlZW4uZGlzcGxheS5pZCxcbiAgICAgICAgICAgIGJvdW5kczogcGxhY2VkW2luZGV4XSxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAgcm9vbSxcbiAgICAgICAgKSxcbiAgICAgICAgd3JhcHM6IHRydWUsXG4gICAgICB9O1xufTtcblxuLy8gVGhlIHNjcmVlbnMgaW4gcm93cywgbGVmdCB0byByaWdodCBhcyB0aGV5IGxpZSwgYXQgb25lIHNjYWxlIHNvIHRoYXQgdGhleSBrZWVwIHRoZWlyIHNpemVzIHRvXG4vLyBlYWNoIG90aGVyOiBhcyBtYW55IGluIGEgcm93IGFzIGZpdCBhdCBhIHVzYWJsZSB3aWR0aCwgZXZlcnkgcm93IGNlbnRyZWQuXG5jb25zdCB3cmFwU2NyZWVucyA9IChcbiAgc2NyZWVuczogcmVhZG9ubHkgeyBpZDogbnVtYmVyOyBib3VuZHM6IFdpbmRvd0JvdW5kcyB9W10sXG4gIHJvb206IG51bWJlcixcbikgPT4ge1xuICBjb25zdCBvcmRlcmVkID0gWy4uLnNjcmVlbnNdLnNvcnQoXG4gICAgKGEsIGIpID0+IGEuYm91bmRzLnggLSBiLmJvdW5kcy54IHx8IGEuYm91bmRzLnkgLSBiLmJvdW5kcy55LFxuICApO1xuICBjb25zdCB3aWRlc3QgPSBvcmRlcmVkLm1hcCgoaXQpID0+IGl0LmJvdW5kcy53aWR0aCkuc29ydCgoYSwgYikgPT4gYiAtIGEpO1xuICBjb25zdCBuYXJyb3dlc3QgPSB3aWRlc3Rbd2lkZXN0Lmxlbmd0aCAtIDFdO1xuXG4gIC8vIFRoZSBsYXJnZXN0IHNjYWxlIGF0IHdoaWNoIHRoZSB3aWRlc3Qgb2YgYXMgbWFueSBzY3JlZW5zIGFzIGNhbiBzaGFyZSBhIHJvdyBmaWxsIGl0LCB0aGVcbiAgLy8gbmFycm93ZXN0IG9mIHRoZW0gc3RpbGwgdXNhYmxlOyBvbmUgc2NyZWVuIHRvIGEgcm93IGF0IHRoZSBsZWFzdC5cbiAgY29uc3Qgc2NhbGUgPVxuICAgIEFycmF5LmZyb20oXG4gICAgICB7IGxlbmd0aDogb3JkZXJlZC5sZW5ndGggLSAxIH0sXG4gICAgICAoXywgaW5kZXgpID0+IG9yZGVyZWQubGVuZ3RoIC0gMSAtIGluZGV4LFxuICAgIClcbiAgICAgIC5tYXAoXG4gICAgICAgIChjb3VudCkgPT5cbiAgICAgICAgICByb29tIC8gd2lkZXN0LnNsaWNlKDAsIGNvdW50KS5yZWR1Y2UoKHN1bSwgaXQpID0+IHN1bSArIGl0LCAwKSxcbiAgICAgIClcbiAgICAgIC5maW5kKChpdCkgPT4gbmFycm93ZXN0ICogaXQgLSBnYXAgPj0gbWluU2NyZWVuV2lkdGgpID8/IHJvb20gLyB3aWRlc3RbMF07XG5cbiAgY29uc3Qgcm93czogeyBpZDogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9W11bXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgeyBpZCwgYm91bmRzIH0gb2Ygb3JkZXJlZCkge1xuICAgIGNvbnN0IHNsb3QgPSB7XG4gICAgICBpZCxcbiAgICAgIHdpZHRoOiBib3VuZHMud2lkdGggKiBzY2FsZSxcbiAgICAgIGhlaWdodDogYm91bmRzLmhlaWdodCAqIHNjYWxlLFxuICAgIH07XG4gICAgY29uc3Qgcm93ID0gcm93c1tyb3dzLmxlbmd0aCAtIDFdO1xuXG4gICAgaWYgKFxuICAgICAgcm93ICYmXG4gICAgICByb3cucmVkdWNlKChzdW0sIGl0KSA9PiBzdW0gKyBpdC53aWR0aCwgMCkgKyBzbG90LndpZHRoIDw9IHJvb20gKyAwLjVcbiAgICApIHtcbiAgICAgIHJvdy5wdXNoKHNsb3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICByb3dzLnB1c2goW3Nsb3RdKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBoZWlnaHQgPSByb3dzLnJlZHVjZShcbiAgICAoc3VtLCByb3cpID0+IHN1bSArIE1hdGgubWF4KC4uLnJvdy5tYXAoKGl0KSA9PiBpdC5oZWlnaHQpKSxcbiAgICAwLFxuICApO1xuICBjb25zdCByZWN0cyA9IG5ldyBNYXA8bnVtYmVyLCBSZWN0PigpO1xuICBsZXQgdG9wID0gMDtcblxuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgbGV0IGxlZnQgPSAocm9vbSAtIHJvdy5yZWR1Y2UoKHN1bSwgaXQpID0+IHN1bSArIGl0LndpZHRoLCAwKSkgLyAyO1xuXG4gICAgZm9yIChjb25zdCBzbG90IG9mIHJvdykge1xuICAgICAgcmVjdHMuc2V0KHNsb3QuaWQsIHtcbiAgICAgICAgbGVmdDogKGxlZnQgLyByb29tKSAqIDEwMCxcbiAgICAgICAgdG9wOiAodG9wIC8gaGVpZ2h0KSAqIDEwMCxcbiAgICAgICAgd2lkdGg6IChzbG90LndpZHRoIC8gcm9vbSkgKiAxMDAsXG4gICAgICAgIGhlaWdodDogKHNsb3QuaGVpZ2h0IC8gaGVpZ2h0KSAqIDEwMCxcbiAgICAgIH0pO1xuXG4gICAgICBsZWZ0ICs9IHNsb3Qud2lkdGg7XG4gICAgfVxuXG4gICAgdG9wICs9IE1hdGgubWF4KC4uLnJvdy5tYXAoKGl0KSA9PiBpdC5oZWlnaHQpKTtcbiAgfVxuXG4gIHJldHVybiB7IHJlY3RzLCBhc3BlY3RSYXRpbzogcm9vbSAvIGhlaWdodCB9O1xufTtcblxuLy8gVGhlIGdyaWQgb2YgYSBzY3JlZW4gaW4gcGl4ZWxzIG9uIHRoZSBwYWdlLCBmcm9tIHRoZSBkcmF3aW5nJ3MgcGxhY2Ugb24gdGhlIHBhZ2UuXG5jb25zdCBncmlkT25QYWdlID0gKGRyYXdpbmc6IERPTVJlY3QsIHJlY3Q6IFJlY3QpID0+IHtcbiAgY29uc3QgbGVmdCA9IGRyYXdpbmcubGVmdCArIChyZWN0LmxlZnQgLyAxMDApICogZHJhd2luZy53aWR0aCArIGdhcCAvIDI7XG4gIGNvbnN0IHRvcCA9IGRyYXdpbmcudG9wICsgKHJlY3QudG9wIC8gMTAwKSAqIGRyYXdpbmcuaGVpZ2h0ICsgZ2FwIC8gMiArIGJhbmQ7XG5cbiAgcmV0dXJuIHtcbiAgICBsZWZ0LFxuICAgIHRvcCxcbiAgICB3aWR0aDogKHJlY3Qud2lkdGggLyAxMDApICogZHJhd2luZy53aWR0aCAtIGdhcCxcbiAgICBoZWlnaHQ6IChyZWN0LmhlaWdodCAvIDEwMCkgKiBkcmF3aW5nLmhlaWdodCAtIGdhcCAtIGJhbmQsXG4gIH07XG59O1xuXG4vLyBXaGVyZSBldmVyeSB3aW5kb3cgb2YgdGhlIHBsYW4gaXM6IG9uIHdoaWNoIHNjcmVlbiwgaW4gd2hpY2ggY2VsbHM7IGFuZCBldmVyeSBzY3JlZW4ncyBncmlkLlxuY29uc3QgcGxhY2VzT2YgPSAocGxhbjogUmVzb2x2ZWRUaWxpbmdQbGFuKSA9PlxuICBKU09OLnN0cmluZ2lmeShbXG4gICAgcGxhbi5zY3JlZW5zLm1hcCgoc2NyZWVuKSA9PiBbXG4gICAgICBzY3JlZW4uZGlzcGxheS5pZCxcbiAgICAgIHNjcmVlbi5jb2x1bW5zLFxuICAgICAgc2NyZWVuLnJvd3MsXG4gICAgICBzY3JlZW4ud2luZG93c1xuICAgICAgICAubWFwKChpdCkgPT4gW2l0LmtleSwgaXQuY29sdW1uLCBpdC5yb3csIGl0LmNvbHVtbnMsIGl0LnJvd3NdKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gU3RyaW5nKGFbMF0pLmxvY2FsZUNvbXBhcmUoU3RyaW5nKGJbMF0pKSksXG4gICAgXSksXG4gICAgcGxhbi51bnRpbGVkLm1hcCgoaXQpID0+IGl0LmtleSkuc29ydCgpLFxuICBdKTtcblxudHlwZSBEcmFnID1cbiAgfCB7XG4gICAgICByZWFkb25seSBraW5kOiBcIm1vdmVcIjtcbiAgICAgIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICAgICAgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcbiAgICAgIC8vIFRoZSBjZWxsIG9mIHRoZSB3aW5kb3cgdGhhdCB3YXMgZ3JhYmJlZCwgY291bnRlZCBmcm9tIGl0cyB0b3AgbGVmdC5cbiAgICAgIHJlYWRvbmx5IGdyYWJiZWQ6IHsgcmVhZG9ubHkgY29sdW1uOiBudW1iZXI7IHJlYWRvbmx5IHJvdzogbnVtYmVyIH07XG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IGtpbmQ6IFwicmVzaXplXCI7XG4gICAgICByZWFkb25seSBrZXk6IHN0cmluZztcbiAgICAgIHJlYWRvbmx5IGRpc3BsYXlJZDogbnVtYmVyO1xuICAgIH07XG5cbmNvbnN0IGRyYXdpbmdTZWxlY3RvciA9IFwiW2RhdGEtdGlsaW5nLXNjcmVlbnNdXCI7XG5jb25zdCB0cmF5U2VsZWN0b3IgPSBcIltkYXRhLXRpbGluZy10cmF5XVwiO1xuXG4vLyBXaGVyZSBhIHdpbmRvdyBkcmFnZ2VkIHRvIHRoZSBwb2ludCBnb2VzOiBvbiBhIHNjcmVlbiwgd2l0aCB0aGUgY2VsbCBpdCB3YXMgZ3JhYmJlZCBieSBpbiB0aGUgY2VsbFxuLy8gdW5kZXIgdGhlIHBvaW50LCBvciBpbiB0aGUgZmlyc3QgZnJlZSBjZWxsIG92ZXIgdGhlIHNjcmVlbidzIG5hbWU7IGluIHRoZSB0cmF5LCBsZWZ0IGFzIGl0IGlzLiBUaGVcbi8vIGNlbGxzIGFyZSB0aG9zZSBvZiB0aGUgcGxhbiBiZWZvcmUgdGhlIGRyYWcsIHNvIHRoYXQgdGhlIHByZXZpZXcgZ3Jvd2luZyBhIHNjcmVlbidzIGdyaWQgZG9lcyBub3Rcbi8vIG1vdmUgdGhlbSB1bmRlciB0aGUgcG9pbnRlci5cbmNvbnN0IHRhcmdldEF0ID0gKFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgcGxhbjogUmVzb2x2ZWRUaWxpbmdQbGFuLFxuICByZWN0czogTWFwPG51bWJlciwgUmVjdD4sXG4gIGdyYWJiZWQ6IHsgcmVhZG9ubHkgY29sdW1uOiBudW1iZXI7IHJlYWRvbmx5IHJvdzogbnVtYmVyIH0sXG4pOiBQbGFuVGFyZ2V0IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSk/LmNsb3Nlc3QodHJheVNlbGVjdG9yKSkge1xuICAgIHJldHVybiB7IGRpc3BsYXlJZDogbnVsbCB9O1xuICB9XG5cbiAgY29uc3QgZHJhd2luZyA9IGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoZHJhd2luZ1NlbGVjdG9yKVxuICAgID8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgaWYgKCFkcmF3aW5nKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZvciAoY29uc3Qgc2NyZWVuIG9mIHBsYW4uc2NyZWVucykge1xuICAgIGNvbnN0IGdyaWQgPSBncmlkT25QYWdlKGRyYXdpbmcsIHJlY3RzLmdldChzY3JlZW4uZGlzcGxheS5pZCkhKTtcblxuICAgIGlmIChcbiAgICAgIHggPCBncmlkLmxlZnQgfHxcbiAgICAgIHggPiBncmlkLmxlZnQgKyBncmlkLndpZHRoIHx8XG4gICAgICB5IDwgZ3JpZC50b3AgLSBiYW5kIHx8XG4gICAgICB5ID4gZ3JpZC50b3AgKyBncmlkLmhlaWdodFxuICAgICkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHkgPCBncmlkLnRvcFxuICAgICAgPyB7IGRpc3BsYXlJZDogc2NyZWVuLmRpc3BsYXkuaWQgfVxuICAgICAgOiB0YXJnZXRJbkdyaWQoeCwgeSwgZ3JpZCwgc2NyZWVuLCBncmFiYmVkKTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vLyBDbG9zZXMgYSBzdWItd2luZG93IGFuZCB0YWtlcyBpdCBvdXQgb2YgdGhlIGxheW91dDsgb25lIG5vdCBvcGVuIGlzIG9ubHkgdGFrZW4gb3V0IG9mIGl0LlxuY29uc3QgQ2xvc2VXaW5kb3dCdXR0b24gPSBvYnNlcnZlcihcbiAgKHsgd2luZG93LCBpbmxpbmUgfTogeyB3aW5kb3c6IFBsYW5uZWRXaW5kb3c7IGlubGluZT86IGJvb2xlYW4gfSkgPT4ge1xuICAgIGNvbnN0IG1vZGVsID0gdXNlSW5qZWN0KHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUpKCk7XG5cbiAgICBpZiAoaXNBcHBsaWNhdGlvbldpbmRvdyh3aW5kb3cucmVjb3JkLndpbmRvdykpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzc05hbWU9e1tcbiAgICAgICAgICBzdHlsZXMuY2xvc2VXaW5kb3csXG4gICAgICAgICAgaW5saW5lID8gc3R5bGVzLmNsb3NlV2luZG93SW5saW5lIDogXCJcIixcbiAgICAgICAgXS5qb2luKFwiIFwiKX1cbiAgICAgICAgYXJpYS1sYWJlbD17XG4gICAgICAgICAgd2luZG93Lm1pc3NpbmdcbiAgICAgICAgICAgID8gXCJSZW1vdmUgZnJvbSB0aGUgbGF5b3V0XCJcbiAgICAgICAgICAgIDogXCJDbG9zZSB0aGUgd2luZG93IGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgbGF5b3V0XCJcbiAgICAgICAgfVxuICAgICAgICB0aXRsZT17XG4gICAgICAgICAgd2luZG93Lm1pc3NpbmdcbiAgICAgICAgICAgID8gXCJSZW1vdmUgZnJvbSB0aGUgbGF5b3V0XCJcbiAgICAgICAgICAgIDogXCJDbG9zZSB0aGUgd2luZG93IGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgbGF5b3V0XCJcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3QgdGhlIHN0YXJ0IG9mIGRyYWdnaW5nIHRoZSB3aW5kb3cuXG4gICAgICAgIG9uUG9pbnRlckRvd249eyhldmVudCkgPT4gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCl9XG4gICAgICAgIG9uQ2xpY2s9eygpID0+IHZvaWQgbW9kZWwuY2xvc2VXaW5kb3cod2luZG93KX1cbiAgICAgID5cbiAgICAgICAgey8qIExhcmdlciBvbiBhIHRpbGUgdGhhbiBvbiBhIGNoaXAgb2YgdGhlIHdpbmRvd3Mgbm90IHRpbGVkLiAqL31cbiAgICAgICAgPENsb3NlSWNvbiAkc2l6ZT17aW5saW5lID8gXCJzXCIgOiBcIm1cIn0gLz5cbiAgICAgIDwvYnV0dG9uPlxuICAgICk7XG4gIH0sXG4pO1xuXG4vLyBUaGUgd2luZG93J3MgbmFtZSwgcmVuYW1lZCBpbiBwbGFjZSBhcyBhIGxheW91dCdzIGlzOiBFbnRlciBvciBsZWF2aW5nIGl0IGtlZXBzIHRoZSBuYW1lIHR5cGVkLFxuLy8gRXNjYXBlIHRoZSBuYW1lIGl0IGhhZC5cbmNvbnN0IFdpbmRvd1RpdGxlID0gb2JzZXJ2ZXIoKHsgd2luZG93IH06IHsgd2luZG93OiBQbGFubmVkV2luZG93IH0pID0+IHtcbiAgY29uc3QgbW9kZWwgPSB1c2VJbmplY3Qod2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSkoKTtcblxuICAvLyBTZWxlY3RzIHRoZSBuYW1lIG9uY2UgaXRzIGlucHV0IHNob3dzLCBzbyB0aGF0IHR5cGluZyByZXBsYWNlcyBpdC5cbiAgY29uc3Qgc2VsZWN0V2hlblNob3duID0gdXNlQ2FsbGJhY2soKGlucHV0OiBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbCkgPT4ge1xuICAgIGlmIChpbnB1dCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlucHV0LmZvY3VzKCk7XG4gICAgICAgIGlucHV0LnNlbGVjdCgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCBbXSk7XG5cbiAgaWYgKG1vZGVsLnJlbmFtaW5nV2luZG93LmdldCgpICE9PSB3aW5kb3cua2V5KSB7XG4gICAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT17c3R5bGVzLnRpbGVUaXRsZX0+e3RpdGxlT2Yod2luZG93KX08L3NwYW4+O1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8Rm9ybVxuICAgICAgY2xhc3NOYW1lPXtzdHlsZXMudGlsZVRpdGxlRm9ybX1cbiAgICAgICR0b29sdGlwPVwiRW50ZXIgb3IgY2xpY2tpbmcgZWxzZXdoZXJlIGtlZXBzIHRoZSBuYW1lOyBFc2NhcGUga2VlcHMgdGhlIG9sZCBvbmVcIlxuICAgICAgLy8gTm90IHRoZSBzdGFydCBvZiBkcmFnZ2luZyB0aGUgd2luZG93LCBub3Igb2Ygc2VsZWN0aW5nIHRleHQgYnkgZHJhZ2dpbmcgb3ZlciBpdC5cbiAgICAgIG9uUG9pbnRlckRvd249eyhldmVudCkgPT4gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCl9XG4gICAgICBvblN1Ym1pdD17KGV2ZW50KSA9PiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHZvaWQgbW9kZWwucmVuYW1lV2luZG93KHdpbmRvdyk7XG4gICAgICB9fVxuICAgID5cbiAgICAgIDxUZXh0SW5wdXRcbiAgICAgICAgYXJpYS1sYWJlbD1cIk5hbWUgb2YgdGhlIHdpbmRvd1wiXG4gICAgICAgIHZhbHVlPXttb2RlbC53aW5kb3dOYW1lRHJhZnQuZ2V0KCl9XG4gICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+IG1vZGVsLnNldFdpbmRvd05hbWVEcmFmdChldmVudC50YXJnZXQudmFsdWUpfVxuICAgICAgICAkcmVmPXtzZWxlY3RXaGVuU2hvd259XG4gICAgICAgIG9uQmx1cj17KCkgPT4gdm9pZCBtb2RlbC5yZW5hbWVXaW5kb3cod2luZG93KX1cbiAgICAgICAgb25LZXlEb3duPXsoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBcIkVzY2FwZVwiKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBtb2RlbC5jYW5jZWxSZW5hbWluZ1dpbmRvdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfX1cbiAgICAgIC8+XG4gICAgPC9Gb3JtPlxuICApO1xufSk7XG5cbi8vIFJlbmFtZXMgdGhlIHdpbmRvdywgcmlnaHQgYWZ0ZXIgaXRzIG5hbWUsIGFzIGEgbGF5b3V0J3MgcGVuIGlzOiBvbmx5IGEgc3ViLXdpbmRvdyBvcGVuIGNhbiBiZS5cbmNvbnN0IFJlbmFtZVdpbmRvd0J1dHRvbiA9IG9ic2VydmVyKFxuICAoeyB3aW5kb3csIG9uVGlsZSB9OiB7IHdpbmRvdzogUGxhbm5lZFdpbmRvdzsgb25UaWxlPzogYm9vbGVhbiB9KSA9PiB7XG4gICAgY29uc3QgbW9kZWwgPSB1c2VJbmplY3Qod2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSkoKTtcblxuICAgIGlmIChcbiAgICAgICFtb2RlbC5jYW5SZW5hbWVXaW5kb3cod2luZG93KSB8fFxuICAgICAgbW9kZWwucmVuYW1pbmdXaW5kb3cuZ2V0KCkgPT09IHdpbmRvdy5rZXlcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFRoZSB0b29sdGlwIGlzIHRoZSB3cmFwcGVyJ3MsIGFzIExlbnMgc2hvd3MgaXQsIHJhdGhlciB0aGFuIHRoZSBzbG93IG9uZSBvZiB0aGUgYnJvd3Nlci5cbiAgICByZXR1cm4gKFxuICAgICAgPFNwYW4gJHRvb2x0aXA9XCJSZW5hbWUgdGhlIHdpbmRvdzogaXRzIHRpdGxlIGluIExlbnMsIGtlcHQgd2hhdGV2ZXIgaXQgc2hvd3NcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzTmFtZT17c3R5bGVzLnJlbmFtZVdpbmRvd31cbiAgICAgICAgICBhcmlhLWxhYmVsPVwiUmVuYW1lIHRoZSB3aW5kb3dcIlxuICAgICAgICAgIC8vIE5vdCB0aGUgc3RhcnQgb2YgZHJhZ2dpbmcgdGhlIHdpbmRvdy5cbiAgICAgICAgICBvblBvaW50ZXJEb3duPXsoZXZlbnQpID0+IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpfVxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG1vZGVsLnN0YXJ0UmVuYW1pbmdXaW5kb3cod2luZG93KX1cbiAgICAgICAgPlxuICAgICAgICAgIHsvKiBMYXJnZXIgb24gYSB0aWxlIHRoYW4gb24gYSBjaGlwIG9mIHRoZSB3aW5kb3dzIG5vdCB0aWxlZC4gKi99XG4gICAgICAgICAgPEVkaXRJY29uICRzaXplPXtvblRpbGUgPyBcIm1cIiA6IFwic1wifSAvPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvU3Bhbj5cbiAgICApO1xuICB9LFxuKTtcblxuLy8gT3BlbnMgdGhlIHdpbmRvdyBub3Qgb3BlbiBhZ2FpbiwgYXMgaXQgd2FzLCB3aGVyZSBpdHMgdGlsZSBpczogc2hvd24gb25seSB3aGVuIExlbnMga2VwdCBob3cuXG5jb25zdCBSZW9wZW5XaW5kb3dCdXR0b24gPSBvYnNlcnZlcigoeyB3aW5kb3cgfTogeyB3aW5kb3c6IFBsYW5uZWRXaW5kb3cgfSkgPT4ge1xuICBjb25zdCBtb2RlbCA9IHVzZUluamVjdCh3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlKSgpO1xuXG4gIGlmICghbW9kZWwuY2FuUmVvcGVuKHdpbmRvdykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPEJ1dHRvblxuICAgICAgY2xhc3NOYW1lPXtzdHlsZXMucmVvcGVuV2luZG93fVxuICAgICAgJGludGVyYWN0aXZlXG4gICAgICBhcmlhLWxhYmVsPVwiT3BlbiB0aGUgd2luZG93IGFnYWluXCJcbiAgICAgICR0b29sdGlwPVwiT3BlbiB0aGUgd2luZG93IGFnYWluLCB3aGVyZSBpdHMgdGlsZSBpc1wiXG4gICAgICAvLyBOb3QgdGhlIHN0YXJ0IG9mIGRyYWdnaW5nIHRoZSB3aW5kb3cuXG4gICAgICBvblBvaW50ZXJEb3duPXsoZXZlbnQpID0+IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpfVxuICAgICAgJG9uQ2xpY2s9eygpID0+IHZvaWQgbW9kZWwucmVvcGVuV2luZG93KHdpbmRvdyl9XG4gICAgPlxuICAgICAgPFJlcGxheUljb24gJHNpemU9XCJtXCIgJGNvbG9yPVwicHJpbWFyeVwiIC8+XG4gICAgPC9CdXR0b24+XG4gICk7XG59KTtcblxuY29uc3QgdGl0bGVPZiA9ICh3aW5kb3c6IFBsYW5uZWRXaW5kb3cpID0+XG4gIGlzQXBwbGljYXRpb25XaW5kb3cod2luZG93LnJlY29yZC53aW5kb3cpXG4gICAgPyBgJHt3aW5kb3cucmVjb3JkLnRpdGxlLmdldCgpfSAobWFpbiB3aW5kb3cpYFxuICAgIDogd2luZG93LnJlY29yZC50aXRsZS5nZXQoKTtcblxuY29uc3QgcGx1cmFsID0gKGNvdW50OiBudW1iZXIsIHdvcmQ6IHN0cmluZykgPT5cbiAgYCR7Y291bnR9ICR7d29yZH0ke2NvdW50ID09PSAxID8gXCJcIiA6IFwic1wifWA7XG5cbi8vIFN0ZXBzIGEgY291bnQgZG93biBhbmQgdXAsIGl0cyBidXR0b25zIHRlbGxpbmcgdGhlIGNvdW50OiBhY3Jvc3MgZm9yIGNvbHVtbnMsIGFsb25nIHRoZSB0b3Agb2Zcbi8vIHRoZSBzY3JlZW4sIGFuZCB1cCBhbmQgZG93biBmb3Igcm93cywgYWxvbmcgaXRzIHNpZGUsIG1vcmUgYWJvdmUgZmV3ZXIuXG5jb25zdCBTdGVwcGVyID0gKHtcbiAgdmFsdWUsXG4gIHdvcmQsXG4gIG1pbixcbiAgd2hlcmUsXG4gIHZlcnRpY2FsID0gZmFsc2UsXG4gIG9uQ2hhbmdlLFxufToge1xuICB2YWx1ZTogbnVtYmVyO1xuICB3b3JkOiBzdHJpbmc7XG4gIG1pbjogbnVtYmVyO1xuICB3aGVyZTogc3RyaW5nO1xuICB2ZXJ0aWNhbD86IGJvb2xlYW47XG4gIG9uQ2hhbmdlOiAodmFsdWU6IG51bWJlcikgPT4gdm9pZDtcbn0pID0+IHtcbiAgY29uc3QgZmV3ZXIgPSAoXG4gICAgPFN0ZXBwZXJCdXR0b25cbiAgICAgIGxhYmVsPXtgRmV3ZXIgJHt3b3JkfXMgb24gJHt3aGVyZX1gfVxuICAgICAgdG9vbHRpcD17XG4gICAgICAgIHZhbHVlID4gbWluXG4gICAgICAgICAgPyBgUmVtb3ZlIGEgJHt3b3JkfTogJHtwbHVyYWwodmFsdWUgLSAxLCB3b3JkKX1gXG4gICAgICAgICAgOiB2YWx1ZSA+IDFcbiAgICAgICAgICAgID8gYCR7cGx1cmFsKHZhbHVlLCB3b3JkKX06IHRoZSB3aW5kb3dzIGhlcmUgbmVlZCBubyBmZXdlcmBcbiAgICAgICAgICAgIDogYCR7cGx1cmFsKHZhbHVlLCB3b3JkKX06IHRoZSBmZXdlc3RgXG4gICAgICB9XG4gICAgICBlbmFibGVkPXt2YWx1ZSA+IG1pbn1cbiAgICAgIG9uQ2xpY2s9eygpID0+IG9uQ2hhbmdlKHZhbHVlIC0gMSl9XG4gICAgPlxuICAgICAgPFJlbW92ZUNpcmNsZU91dGxpbmVJY29uICRzaXplPVwibVwiICRjb2xvcj1cInByaW1hcnlcIiAvPlxuICAgIDwvU3RlcHBlckJ1dHRvbj5cbiAgKTtcblxuICBjb25zdCBtb3JlID0gKFxuICAgIDxTdGVwcGVyQnV0dG9uXG4gICAgICBsYWJlbD17YE1vcmUgJHt3b3JkfXMgb24gJHt3aGVyZX1gfVxuICAgICAgdG9vbHRpcD17YEFkZCBhICR7d29yZH06ICR7cGx1cmFsKHZhbHVlICsgMSwgd29yZCl9YH1cbiAgICAgIGVuYWJsZWRcbiAgICAgIG9uQ2xpY2s9eygpID0+IG9uQ2hhbmdlKHZhbHVlICsgMSl9XG4gICAgPlxuICAgICAgPEFkZENpcmNsZU91dGxpbmVJY29uICRzaXplPVwibVwiICRjb2xvcj1cInByaW1hcnlcIiAvPlxuICAgIDwvU3RlcHBlckJ1dHRvbj5cbiAgKTtcblxuICBjb25zdCBuYW1lID0gYCR7d29yZFswXS50b1VwcGVyQ2FzZSgpfSR7d29yZC5zbGljZSgxKX1zYDtcblxuICByZXR1cm4gdmVydGljYWwgPyAoXG4gICAgPHNwYW4gY2xhc3NOYW1lPXtzdHlsZXMudmVydGljYWxTdGVwcGVyR3JvdXB9PlxuICAgICAge21vcmV9XG4gICAgICA8c3BhbiBjbGFzc05hbWU9e1tzdHlsZXMubGFiZWwsIHN0eWxlcy52ZXJ0aWNhbExhYmVsXS5qb2luKFwiIFwiKX0+XG4gICAgICAgIHtuYW1lfVxuICAgICAgPC9zcGFuPlxuICAgICAge2Zld2VyfVxuICAgIDwvc3Bhbj5cbiAgKSA6IChcbiAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5zdGVwcGVyR3JvdXB9PlxuICAgICAge2Zld2VyfVxuICAgICAgPHNwYW4gY2xhc3NOYW1lPXtzdHlsZXMubGFiZWx9PntuYW1lfTwvc3Bhbj5cbiAgICAgIHttb3JlfVxuICAgIDwvc3Bhbj5cbiAgKTtcbn07XG5cbi8vIFRoZSB0b29sdGlwIGlzIHRoZSB3cmFwcGVyJ3MsIHNvIHRoYXQgaXQgc2hvd3Mgb24gYSBkaXNhYmxlZCBidXR0b24gdG9vLCB0ZWxsaW5nIHdoeS5cbmNvbnN0IFN0ZXBwZXJCdXR0b24gPSAoe1xuICBsYWJlbCxcbiAgdG9vbHRpcCxcbiAgZW5hYmxlZCxcbiAgb25DbGljayxcbiAgY2hpbGRyZW4sXG59OiB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHRvb2x0aXA6IHN0cmluZztcbiAgZW5hYmxlZDogYm9vbGVhbjtcbiAgb25DbGljazogKCkgPT4gdm9pZDtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbn0pID0+IChcbiAgPFNwYW4gY2xhc3NOYW1lPXtzdHlsZXMuc3RlcHBlclRpcH0gJHRvb2x0aXA9e3Rvb2x0aXB9PlxuICAgIDxCdXR0b25cbiAgICAgIGNsYXNzTmFtZT17c3R5bGVzLnN0ZXBwZXJ9XG4gICAgICBhcmlhLWxhYmVsPXtsYWJlbH1cbiAgICAgICRlbmFibGVkPXtlbmFibGVkfVxuICAgICAgJG9uQ2xpY2s9e29uQ2xpY2t9XG4gICAgPlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvQnV0dG9uPlxuICA8L1NwYW4+XG4pO1xuXG5jb25zdCBTY3JlZW5CYW5kID0gb2JzZXJ2ZXIoXG4gICh7XG4gICAgc2NyZWVuLFxuICAgIGluZGV4LFxuICAgIGlzSG92ZXJlZCxcbiAgfToge1xuICAgIHNjcmVlbjogUGxhbm5lZFNjcmVlbjtcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIGlzSG92ZXJlZDogYm9vbGVhbjtcbiAgfSkgPT4ge1xuICAgIGNvbnN0IG1vZGVsID0gdXNlSW5qZWN0KHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUpKCk7XG4gICAgY29uc3QgbmFtZSA9IG5hbWVPZlNjcmVlbihzY3JlZW4uZGlzcGxheS5sYWJlbC5nZXQoKSwgaW5kZXgpO1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gc2NyZWVuLmRpc3BsYXkud29ya0FyZWEuZ2V0KCk7XG4gICAgY29uc3QgaGFzV2luZG93cyA9IHNjcmVlbi53aW5kb3dzLmxlbmd0aCA+IDA7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPERpdiBjbGFzc05hbWU9e3N0eWxlcy5iYW5kfSAkY29sb3I9XCJ0ZXh0TXV0ZWRcIiAkZm9udD17eyBzaXplOiBcInNcIiB9fT5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtzdHlsZXMuc2NyZWVuTmFtZX0+XG4gICAgICAgICAgey8qIFRoZSBuYW1lIGluIHRoZSB0ZXh0J3Mgb3duIGNvbG91ciwgdG8gc3RhbmQgb3V0IGZyb20gdGhlIGRldGFpbHMgYWZ0ZXIgaXQuICovfVxuICAgICAgICAgIDxTcGFuICRjb2xvcj1cInRleHREZWZhdWx0XCI+e25hbWV9PC9TcGFuPlxuICAgICAgICAgIHtzY3JlZW4uZGlzcGxheS5pc1ByaW1hcnkuZ2V0KCkgPyBcIiBcdTAwQjcgcHJpbWFyeVwiIDogXCJcIn0gXHUwMEI3IHt3aWR0aH0gXHUwMEQ3e1wiIFwifVxuICAgICAgICAgIHtoZWlnaHR9XG4gICAgICAgICAge3NjcmVlbi5taXNzaW5nICYmIChcbiAgICAgICAgICAgIDxTcGFuICRjb2xvcj1cImNyaXRpY2FsXCI+XG4gICAgICAgICAgICAgIHtcIiBcIn1cbiAgICAgICAgICAgICAgXHUwMEI3IG5vdCBjb25uZWN0ZWQ7IGl0cyB3aW5kb3dzIGFyZSBub3QgdGlsZWRcbiAgICAgICAgICAgIDwvU3Bhbj5cbiAgICAgICAgICApfVxuICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgey8qIFVudGlsZTogZXZlcnkgd2luZG93IG9mIHRoZSBzY3JlZW4gYmFjayB0byB0aG9zZSBub3QgdGlsZWQsIGFib3ZlIHRoZSBzY3JlZW5zLiAqL31cbiAgICAgICAgPEJ1dHRvblxuICAgICAgICAgIC8vIFNob3duIHdoaWxlIHRoZSBwb2ludGVyIGlzIG92ZXIgdGhlIHNjcmVlbiwgb3IgdGhlIGJ1dHRvbiBoYXMgdGhlIGtleWJvYXJkJ3MgZm9jdXMuXG4gICAgICAgICAgY2xhc3NOYW1lPXtbc3R5bGVzLnVudGlsZSwgaXNIb3ZlcmVkID8gc3R5bGVzLnNob3duIDogXCJcIl0uam9pbihcIiBcIil9XG4gICAgICAgICAgJGludGVyYWN0aXZlXG4gICAgICAgICAgYXJpYS1sYWJlbD17YFVudGlsZSAke25hbWV9YH1cbiAgICAgICAgICAkdG9vbHRpcD17XG4gICAgICAgICAgICBoYXNXaW5kb3dzXG4gICAgICAgICAgICAgID8gYFVudGlsZTogbW92ZSB0aGUgd2luZG93cyBvZiAke25hbWV9IHRvIE5vdCB0aWxlZGBcbiAgICAgICAgICAgICAgOiBgTm8gd2luZG93cyB0aWxlZCBvbiAke25hbWV9YFxuICAgICAgICAgIH1cbiAgICAgICAgICAkZW5hYmxlZD17aGFzV2luZG93c31cbiAgICAgICAgICAkb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgIG1vZGVsLnRpbGluZ1BsYW4uY29tbWl0KFxuICAgICAgICAgICAgICB1bnRpbGVTY3JlZW5JblBsYW4oXG4gICAgICAgICAgICAgICAgbW9kZWwudGlsaW5nUGxhbi5yZXNvbHZlZC5nZXQoKSxcbiAgICAgICAgICAgICAgICBzY3JlZW4uZGlzcGxheS5pZCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgID5cbiAgICAgICAgICA8TW92ZVVwSWNvbiAkc2l6ZT1cIm1cIiAvPlxuICAgICAgICA8L0J1dHRvbj5cbiAgICAgIDwvRGl2PlxuICAgICk7XG4gIH0sXG4pO1xuXG4vLyBQaWxscyBvdmVyIHRoZSBzY3JlZW4ncyBncmlkIHNpemluZyBpdDogaXRzIGNvbHVtbnMgb24gdGhlIG1pZGRsZSBvZiBpdHMgdG9wIGVkZ2UsIGl0cyByb3dzIG9uXG4vLyB0aGUgbWlkZGxlIG9mIGl0cyBsZWZ0IGVkZ2UuIExhaWQgb3ZlciB0aGUgc2NyZWVuJ3MgdGlsZXMsIHNvIHRoYXQgYSB0aWxlIG5ldmVyIGhpZGVzIHRoZW0uXG5jb25zdCBTY3JlZW5TdGVwcGVycyA9IG9ic2VydmVyKFxuICAoeyBzY3JlZW4sIGluZGV4IH06IHsgc2NyZWVuOiBQbGFubmVkU2NyZWVuOyBpbmRleDogbnVtYmVyIH0pID0+IHtcbiAgICBjb25zdCBtb2RlbCA9IHVzZUluamVjdCh3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlKSgpO1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lT2ZTY3JlZW4oc2NyZWVuLmRpc3BsYXkubGFiZWwuZ2V0KCksIGluZGV4KTtcbiAgICBjb25zdCBwbGFuID0gKCkgPT4gbW9kZWwudGlsaW5nUGxhbi5yZXNvbHZlZC5nZXQoKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8PlxuICAgICAgICA8RGl2XG4gICAgICAgICAgY2xhc3NOYW1lPXtbc3R5bGVzLnBpbGwsIHN0eWxlcy5jb2x1bW5zUGlsbF0uam9pbihcIiBcIil9XG4gICAgICAgICAgJGJhY2tncm91bmRDb2xvcj1cImJhY2tncm91bmRTZWNvbmRhcnlcIlxuICAgICAgICAgICRib3JkZXI9e3sgY29sb3I6IFwiYm9yZGVyUHJpbWFyeVwiLCB3aWR0aDogXCJ4eHNcIiwgcmFkaXVzOiBcImZ1bGxcIiB9fVxuICAgICAgICAgICRjb2xvcj1cInRleHRNdXRlZFwiXG4gICAgICAgICAgJGZvbnQ9e3sgc2l6ZTogXCJzXCIgfX1cbiAgICAgICAgICAvLyBPbiB0aGUgbWlkZGxlIG9mIHRoZSBncmlkJ3MgdG9wIGxpbmUsIGEgcGl4ZWwgdGhpY2suXG4gICAgICAgICAgJHN0eWxlPXt7IHRvcDogYGNhbGMoJHtiYW5kfXB4ICsgMC41cHgpYCB9fVxuICAgICAgICA+XG4gICAgICAgICAgPFN0ZXBwZXJcbiAgICAgICAgICAgIHZhbHVlPXtzY3JlZW4uY29sdW1uc31cbiAgICAgICAgICAgIHdvcmQ9XCJjb2x1bW5cIlxuICAgICAgICAgICAgbWluPXsxfVxuICAgICAgICAgICAgd2hlcmU9e25hbWV9XG4gICAgICAgICAgICBvbkNoYW5nZT17KGNvbHVtbnMpID0+XG4gICAgICAgICAgICAgIG1vZGVsLnRpbGluZ1BsYW4uY29tbWl0KFxuICAgICAgICAgICAgICAgIHNldENvbHVtbnNJblBsYW4ocGxhbigpLCBzY3JlZW4uZGlzcGxheS5pZCwgY29sdW1ucyksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAvPlxuICAgICAgICA8L0Rpdj5cblxuICAgICAgICA8RGl2XG4gICAgICAgICAgY2xhc3NOYW1lPXtbc3R5bGVzLnBpbGwsIHN0eWxlcy5yb3dzUGlsbF0uam9pbihcIiBcIil9XG4gICAgICAgICAgJGJhY2tncm91bmRDb2xvcj1cImJhY2tncm91bmRTZWNvbmRhcnlcIlxuICAgICAgICAgICRib3JkZXI9e3sgY29sb3I6IFwiYm9yZGVyUHJpbWFyeVwiLCB3aWR0aDogXCJ4eHNcIiwgcmFkaXVzOiBcImZ1bGxcIiB9fVxuICAgICAgICAgICRjb2xvcj1cInRleHRNdXRlZFwiXG4gICAgICAgICAgJGZvbnQ9e3sgc2l6ZTogXCJzXCIgfX1cbiAgICAgICAgICAkc3R5bGU9e3sgdG9wOiBgY2FsYygke2JhbmR9cHggKyAoMTAwJSAtICR7YmFuZH1weCkgLyAyKWAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxTdGVwcGVyXG4gICAgICAgICAgICB2YWx1ZT17TWF0aC5tYXgoc2NyZWVuLnJvd3MsIDEpfVxuICAgICAgICAgICAgd29yZD1cInJvd1wiXG4gICAgICAgICAgICBtaW49e01hdGgubWF4KHNjcmVlbi5uZWVkZWRSb3dzLCAxKX1cbiAgICAgICAgICAgIHdoZXJlPXtuYW1lfVxuICAgICAgICAgICAgdmVydGljYWxcbiAgICAgICAgICAgIG9uQ2hhbmdlPXsocm93cykgPT5cbiAgICAgICAgICAgICAgbW9kZWwudGlsaW5nUGxhbi5jb21taXQoXG4gICAgICAgICAgICAgICAgc2V0Um93c0luUGxhbihwbGFuKCksIHNjcmVlbi5kaXNwbGF5LmlkLCByb3dzKSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvRGl2PlxuICAgICAgPC8+XG4gICAgKTtcbiAgfSxcbik7XG5cbi8vIEFycmFuZ2UgaG93IHRoZSB3aW5kb3dzIGFyZSB0aWxlZDogZHJhZyBhIHdpbmRvdyBvbnRvIGEgc2NyZWVuIGFuZCBpbnRvIGl0cyBwbGFjZSBpbiB0aGUgb3JkZXIsXG4vLyBvciBpbnRvIHRoZSB0cmF5IHRvIGxlYXZlIGl0IGFzIGl0IGlzOyBkcmFnIGl0cyBjb3JuZXIgdG8gaGF2ZSBpdCBzcGFuIG1vcmUgY2VsbHMuXG5leHBvcnQgY29uc3QgVGlsaW5nRWRpdG9yID0gb2JzZXJ2ZXIoKCkgPT4ge1xuICBjb25zdCBtb2RlbCA9IHVzZUluamVjdCh3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlKSgpO1xuICBjb25zdCBwbGFuID0gbW9kZWwudGlsaW5nUGxhbi5yZXNvbHZlZC5nZXQoKTtcbiAgLy8gQSB3aW5kb3cgbm90IG9wZW4sIGFzIG9wcG9zZWQgdG8gb25lIGJlaW5nIG9wZW5lZCwgd2hpY2ggc2hvd3MgYXMgc3VjaCBhbHJlYWR5LlxuICBjb25zdCBpc05vdE9wZW4gPSAod2luZG93OiBQbGFubmVkV2luZG93KSA9PlxuICAgIHdpbmRvdy5taXNzaW5nICYmICFtb2RlbC5pc1Jlb3BlbmluZ1dpbmRvdyh3aW5kb3cpO1xuICBjb25zdCBbZHJhZywgc2V0RHJhZ10gPSB1c2VTdGF0ZTxEcmFnIHwgdW5kZWZpbmVkPigpO1xuICBjb25zdCBbcHJldmlldywgc2V0UHJldmlld10gPSB1c2VTdGF0ZTxSZXNvbHZlZFRpbGluZ1BsYW4gfCB1bmRlZmluZWQ+KCk7XG4gIGNvbnN0IFtwb2ludGVyLCBzZXRQb2ludGVyXSA9IHVzZVN0YXRlPFxuICAgIHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IHVuZGVmaW5lZFxuICA+KCk7XG4gIC8vIFRoZSBzY3JlZW4gdGhlIHBvaW50ZXIgaXMgb3ZlciwgaXRzIHRpbGVzIGFuZCBwaWxscyBjb3VudGluZyBhcyBpdDogaXRzIFVudGlsZSBzaG93cyB0aGVuLlxuICBjb25zdCBbaG92ZXJlZFNjcmVlbiwgc2V0SG92ZXJlZFNjcmVlbl0gPSB1c2VTdGF0ZTxudW1iZXIgfCB1bmRlZmluZWQ+KCk7XG4gIGNvbnN0IHByZXZpZXdSZWYgPSB1c2VSZWYocHJldmlldyk7XG4gIGNvbnN0IGRyYXdpbmdSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCBkaXNwbGF5cyA9IHBsYW4uc2NyZWVucy5tYXAoKGl0KSA9PiBpdC5kaXNwbGF5KTtcbiAgY29uc3QgW3Jvb20sIHNldFJvb21dID0gdXNlU3RhdGU8XG4gICAgeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgdW5kZWZpbmVkXG4gID4oKTtcbiAgY29uc3QgeyByZWN0cywgYXNwZWN0UmF0aW8sIHdyYXBzIH0gPSBkcmF3U2NyZWVucyhwbGFuLnNjcmVlbnMsIHJvb20/LndpZHRoKTtcbiAgY29uc3Qgc2hvd24gPSBwcmV2aWV3ID8/IHBsYW47XG4gIC8vIFRpbGUgYWxsIHBsYWNlcyB0aGUgd2luZG93cyBub3QgdGlsZWQsIHRob3NlIG9wZW4uXG4gIGNvbnN0IGNhbkF1dG9UaWxlID0gc2hvd24udW50aWxlZC5zb21lKCh3aW5kb3cpID0+ICF3aW5kb3cubWlzc2luZyk7XG5cbiAgcHJldmlld1JlZi5jdXJyZW50ID0gcHJldmlldztcblxuICAvLyBUaGUgcm9vbSB0aGUgZHJhd2luZyBoYXMsIGZvbGxvd2VkIGFzIHRoZSBkaWFsb2cgcmVzaXplcywgdG8gZHJhdyB0aGUgc2NyZWVucyBhcyBsYXJnZSBhcyBmaXRzXG4gIC8vIHdpdGhvdXQgY2hhbmdpbmcgdGhlaXIgcHJvcG9ydGlvbnMuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgZHJhd2luZyA9IGRyYXdpbmdSZWYuY3VycmVudDtcblxuICAgIGlmICghZHJhd2luZykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoW2VudHJ5XSkgPT5cbiAgICAgIHNldFJvb20oe1xuICAgICAgICB3aWR0aDogZW50cnkuY29udGVudFJlY3Qud2lkdGgsXG4gICAgICAgIGhlaWdodDogZW50cnkuY29udGVudFJlY3QuaGVpZ2h0LFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIG9ic2VydmVyLm9ic2VydmUoZHJhd2luZyk7XG5cbiAgICByZXR1cm4gKCkgPT4gb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICB9LCBbXSk7XG5cbiAgLy8gSW4gcm93cywgYXMgd2lkZSBhcyB0aGVyZSBpcyByb29tIGZvciwgYXMgdGFsbCBhcyB0aGF0IG1ha2VzIHRoZW06IHRoZSBkaWFsb2cgc2Nyb2xscy5cbiAgY29uc3QgZHJhd25XaWR0aCA9IHJvb21cbiAgICA/IHdyYXBzXG4gICAgICA/IHJvb20ud2lkdGhcbiAgICAgIDogTWF0aC5taW4ocm9vbS53aWR0aCwgcm9vbS5oZWlnaHQgKiBhc3BlY3RSYXRpbylcbiAgICA6IDA7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWRyYWcpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgYmFzZSA9IG1vZGVsLnRpbGluZ1BsYW4ucmVzb2x2ZWQuZ2V0KCk7XG5cbiAgICBjb25zdCBvbk1vdmUgPSAoZXZlbnQ6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgICAgLy8gVGhlIGJ1dHRvbiBsZXQgZ28gd2hlcmUgdGhpcyB3aW5kb3cgZGlkIG5vdCBoZWFyIGl0LCBhcyBvdXRzaWRlIHRoZSB3aW5kb3c6IHRoZSBkcmFnIGlzIG92ZXIuXG4gICAgICBpZiAoZXZlbnQuYnV0dG9ucyA9PT0gMCkge1xuICAgICAgICBlbmQodHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZHJhZy5raW5kID09PSBcIm1vdmVcIikge1xuICAgICAgICBzZXRQb2ludGVyKHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9KTtcblxuICAgICAgICBjb25zdCB0YXJnZXQgPSB0YXJnZXRBdChcbiAgICAgICAgICBldmVudC5jbGllbnRYLFxuICAgICAgICAgIGV2ZW50LmNsaWVudFksXG4gICAgICAgICAgYmFzZSxcbiAgICAgICAgICByZWN0cyxcbiAgICAgICAgICBkcmFnLmdyYWJiZWQsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG5leHQgPSB0YXJnZXQgPyBtb3ZlSW5QbGFuKGJhc2UsIGRyYWcua2V5LCB0YXJnZXQpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIHByZXZpZXdSZWYuY3VycmVudCA9IG5leHQ7XG4gICAgICAgIHNldFByZXZpZXcobmV4dCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzY3JlZW4gPSBiYXNlLnNjcmVlbnMuZmluZChcbiAgICAgICAgKGl0KSA9PiBpdC5kaXNwbGF5LmlkID09PSBkcmFnLmRpc3BsYXlJZCxcbiAgICAgICk7XG4gICAgICBjb25zdCB3aW5kb3cgPSBzY3JlZW4/LndpbmRvd3MuZmluZCgoaXQpID0+IGl0LmtleSA9PT0gZHJhZy5rZXkpO1xuICAgICAgY29uc3QgZHJhd2luZyA9IGRvY3VtZW50XG4gICAgICAgIC5xdWVyeVNlbGVjdG9yKGRyYXdpbmdTZWxlY3RvcilcbiAgICAgICAgPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgaWYgKCFzY3JlZW4gfHwgIXdpbmRvdyB8fCAhZHJhd2luZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGdyaWQgPSBncmlkT25QYWdlKGRyYXdpbmcsIHJlY3RzLmdldChzY3JlZW4uZGlzcGxheS5pZCkhKTtcbiAgICAgIGNvbnN0IGNlbGxXaWR0aCA9IGdyaWQud2lkdGggLyBzY3JlZW4uY29sdW1ucztcbiAgICAgIGNvbnN0IGNlbGxIZWlnaHQgPSBncmlkLmhlaWdodCAvIE1hdGgubWF4KHNjcmVlbi5yb3dzLCAxKTtcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBNYXRoLmNlaWwoXG4gICAgICAgIChldmVudC5jbGllbnRYIC0gZ3JpZC5sZWZ0IC0gd2luZG93LmNvbHVtbiAqIGNlbGxXaWR0aCkgLyBjZWxsV2lkdGgsXG4gICAgICApO1xuICAgICAgY29uc3Qgcm93cyA9IE1hdGguY2VpbChcbiAgICAgICAgKGV2ZW50LmNsaWVudFkgLSBncmlkLnRvcCAtIHdpbmRvdy5yb3cgKiBjZWxsSGVpZ2h0KSAvIGNlbGxIZWlnaHQsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBuZXh0ID0gcmVzaXplSW5QbGFuKGJhc2UsIGRyYWcua2V5LCBjb2x1bW5zLCByb3dzKTtcblxuICAgICAgcHJldmlld1JlZi5jdXJyZW50ID0gbmV4dDtcbiAgICAgIHNldFByZXZpZXcobmV4dCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGVuZCA9IChrZWVwOiBib29sZWFuKSA9PiB7XG4gICAgICAvLyBBIGRyYWcgdGhhdCBsZWF2ZXMgZXZlcnkgd2luZG93IHdoZXJlIGl0IHdhcywgYXMgYSBjbGljayBvciBhIGRyb3AgYmFjayBpbiBwbGFjZSwgY2hhbmdlc1xuICAgICAgLy8gbm90aGluZywgYW5kIHRpbGVzIG5vdGhpbmcgYWdhaW4uXG4gICAgICBpZiAoXG4gICAgICAgIGtlZXAgJiZcbiAgICAgICAgcHJldmlld1JlZi5jdXJyZW50ICYmXG4gICAgICAgIHBsYWNlc09mKHByZXZpZXdSZWYuY3VycmVudCkgIT09IHBsYWNlc09mKGJhc2UpXG4gICAgICApIHtcbiAgICAgICAgbW9kZWwudGlsaW5nUGxhbi5jb21taXQocHJldmlld1JlZi5jdXJyZW50KTtcbiAgICAgIH1cblxuICAgICAgc2V0RHJhZyh1bmRlZmluZWQpO1xuICAgICAgc2V0UHJldmlldyh1bmRlZmluZWQpO1xuICAgICAgc2V0UG9pbnRlcih1bmRlZmluZWQpO1xuICAgIH07XG5cbiAgICBjb25zdCBvblVwID0gKCkgPT4gZW5kKHRydWUpO1xuICAgIGNvbnN0IG9uQ2FuY2VsID0gKCkgPT4gZW5kKGZhbHNlKTtcbiAgICBjb25zdCBvbktleSA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZW5kKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCBvbk1vdmUpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIG9uVXApO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmNhbmNlbFwiLCBvbkNhbmNlbCk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIG9uQ2FuY2VsKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgb25LZXksIHRydWUpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgb25Nb3ZlKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIG9uVXApO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyY2FuY2VsXCIsIG9uQ2FuY2VsKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmx1clwiLCBvbkNhbmNlbCk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgb25LZXksIHRydWUpO1xuICAgIH07XG4gIH0sIFtkcmFnXSk7XG5cbiAgY29uc3Qgc3RhcnRNb3ZlID1cbiAgICAod2luZG93OiBQbGFubmVkV2luZG93KSA9PiAoZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MRWxlbWVudD4pID0+IHtcbiAgICAgIGlmIChldmVudC5idXR0b24gIT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBXaGljaCBvZiB0aGUgd2luZG93J3MgY2VsbHMgaXMgdW5kZXIgdGhlIHBvaW50ZXI7IGEgd2luZG93IGluIHRoZSB0cmF5IGlzIGhlbGQgYnkgaXRzIGZpcnN0LlxuICAgICAgY29uc3QgdGlsZSA9IGV2ZW50LmN1cnJlbnRUYXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIGNvbnN0IGdyYWJiZWQgPSB7XG4gICAgICAgIGNvbHVtbjogTWF0aC5taW4oXG4gICAgICAgICAgTWF0aC5mbG9vcihcbiAgICAgICAgICAgICgoZXZlbnQuY2xpZW50WCAtIHRpbGUubGVmdCkgLyB0aWxlLndpZHRoKSAqIHdpbmRvdy5jb2x1bW5zLFxuICAgICAgICAgICksXG4gICAgICAgICAgd2luZG93LmNvbHVtbnMgLSAxLFxuICAgICAgICApLFxuICAgICAgICByb3c6IE1hdGgubWluKFxuICAgICAgICAgIE1hdGguZmxvb3IoKChldmVudC5jbGllbnRZIC0gdGlsZS50b3ApIC8gdGlsZS5oZWlnaHQpICogd2luZG93LnJvd3MpLFxuICAgICAgICAgIHdpbmRvdy5yb3dzIC0gMSxcbiAgICAgICAgKSxcbiAgICAgIH07XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzZXRQb2ludGVyKHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9KTtcbiAgICAgIHNldERyYWcoe1xuICAgICAgICBraW5kOiBcIm1vdmVcIixcbiAgICAgICAga2V5OiB3aW5kb3cua2V5LFxuICAgICAgICB0aXRsZTogdGl0bGVPZih3aW5kb3cpLFxuICAgICAgICBncmFiYmVkOiBldmVudC5jdXJyZW50VGFyZ2V0LmNsb3Nlc3QodHJheVNlbGVjdG9yKVxuICAgICAgICAgID8geyBjb2x1bW46IDAsIHJvdzogMCB9XG4gICAgICAgICAgOiBncmFiYmVkLFxuICAgICAgfSk7XG4gICAgfTtcblxuICBjb25zdCBzdGFydFJlc2l6ZSA9XG4gICAgKHdpbmRvdzogUGxhbm5lZFdpbmRvdywgZGlzcGxheUlkOiBudW1iZXIpID0+XG4gICAgKGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC5idXR0b24gIT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBzZXREcmFnKHsga2luZDogXCJyZXNpemVcIiwga2V5OiB3aW5kb3cua2V5LCBkaXNwbGF5SWQgfSk7XG4gICAgfTtcblxuICByZXR1cm4gKFxuICAgIDxEaXYgJGZsZXg9e3sgZGlyZWN0aW9uOiBcInZlcnRpY2FsXCIsIGdhcDogXCJzXCIgfX0gJGZsZXhDaGlsZD5cbiAgICAgIHtkaXNwbGF5cy5sZW5ndGggPT09IDAgJiYgKFxuICAgICAgICA8U3BhbiAkY29sb3I9XCJ0ZXh0TXV0ZWRcIj5GaW5kaW5nIHRoZSBzY3JlZW5zXHUyMDI2PC9TcGFuPlxuICAgICAgKX1cblxuICAgICAgPERpdlxuICAgICAgICBkYXRhLXRpbGluZy10cmF5XG4gICAgICAgIGNsYXNzTmFtZT17c3R5bGVzLnRyYXl9XG4gICAgICAgICRwYWRkaW5nPXt7IHZlcnRpY2FsOiBcInhzXCIsIGhvcml6b250YWw6IFwic1wiIH19XG4gICAgICAgICRib3JkZXI9e3sgY29sb3I6IFwiYm9yZGVyUHJpbWFyeVwiLCB3aWR0aDogXCJ4eHNcIiwgcmFkaXVzOiBcIm1cIiB9fVxuICAgICAgPlxuICAgICAgICA8U3BhbiAkY29sb3I9XCJ0ZXh0TXV0ZWRcIiAkZm9udD17eyBzaXplOiBcInNcIiB9fT5cbiAgICAgICAgICBOb3QgdGlsZWQ6XG4gICAgICAgIDwvU3Bhbj5cblxuICAgICAgICB7c2hvd24udW50aWxlZC5sZW5ndGggPT09IDAgJiYgKFxuICAgICAgICAgIDxTcGFuICRjb2xvcj1cInRleHRNdXRlZFwiICRmb250PXt7IHNpemU6IFwic1wiIH19PlxuICAgICAgICAgICAgZHJvcCBhIHdpbmRvdyBoZXJlIHRvIGxlYXZlIGl0IG91dCBvZiB0aWxpbmcuXG4gICAgICAgICAgPC9TcGFuPlxuICAgICAgICApfVxuXG4gICAgICAgIHtzaG93bi51bnRpbGVkLm1hcCgod2luZG93KSA9PiAoXG4gICAgICAgICAgPERpdlxuICAgICAgICAgICAga2V5PXt3aW5kb3cua2V5fVxuICAgICAgICAgICAgY2xhc3NOYW1lPXtbXG4gICAgICAgICAgICAgIHN0eWxlcy5jaGlwLFxuICAgICAgICAgICAgICBkcmFnPy5rZXkgPT09IHdpbmRvdy5rZXkgPyBzdHlsZXMuZHJhZ2dpbmcgOiBcIlwiLFxuICAgICAgICAgICAgXS5qb2luKFwiIFwiKX1cbiAgICAgICAgICAgICRiYWNrZ3JvdW5kQ29sb3I9XCJiYWNrZ3JvdW5kU2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICRib3JkZXI9e3tcbiAgICAgICAgICAgICAgLy8gQXMgaXRzIHRpbGUgd291bGQgYmU6IGEgd2luZG93IG5vdCBvcGVuIGRhc2hlZCBpbiB0aGUgY3JpdGljYWwgY29sb3VyLCBvbmVcbiAgICAgICAgICAgICAgLy8gbm90IHNhdmVkIGluIHRoZSB3YXJuaW5nIG9uZS5cbiAgICAgICAgICAgICAgY29sb3I6IGlzTm90T3Blbih3aW5kb3cpXG4gICAgICAgICAgICAgICAgPyBcImNyaXRpY2FsXCJcbiAgICAgICAgICAgICAgICA6IG1vZGVsLmlzT3V0T2ZQbGFjZSh3aW5kb3cpXG4gICAgICAgICAgICAgICAgICA/IFwid2FybmluZ1wiXG4gICAgICAgICAgICAgICAgICA6IFwiYm9yZGVyUHJpbWFyeVwiLFxuICAgICAgICAgICAgICB3aWR0aDogXCJ4eHNcIixcbiAgICAgICAgICAgICAgcmFkaXVzOiBcInNcIixcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICAkc3R5bGU9e2lzTm90T3Blbih3aW5kb3cpID8geyBib3JkZXJTdHlsZTogXCJkYXNoZWRcIiB9IDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgJGZvbnQ9e3sgc2l6ZTogXCJzXCIgfX1cbiAgICAgICAgICAgIG9uUG9pbnRlckRvd249e3N0YXJ0TW92ZSh3aW5kb3cpfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxXaW5kb3dUaXRsZSB3aW5kb3c9e3dpbmRvd30gLz5cbiAgICAgICAgICAgIDxSZW5hbWVXaW5kb3dCdXR0b24gd2luZG93PXt3aW5kb3d9IC8+XG4gICAgICAgICAgICB7LyogQSB3aW5kb3cgbm90IG9wZW4gdG9sZCBhcyBpdHMgdGlsZSB0ZWxscyBpdCwgaW4gdGhlIGNyaXRpY2FsIGNvbG91ci4gKi99XG4gICAgICAgICAgICB7d2luZG93Lm1pc3NpbmcgPyAoXG4gICAgICAgICAgICAgIDxTcGFuICRjb2xvcj1cImNyaXRpY2FsXCI+IG5vdCBvcGVuPC9TcGFuPlxuICAgICAgICAgICAgKSA6IHdpbmRvdy5yZWNvcmQuc3RhdGUuZ2V0KCkgPT09IFwibWluaW1pemVkXCIgPyAoXG4gICAgICAgICAgICAgIFwiIChtaW5pbWl6ZWQpXCJcbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIFwiXCJcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7d2luZG93Lm1pc3NpbmcgJiZcbiAgICAgICAgICAgICAgKG1vZGVsLmlzUmVvcGVuaW5nV2luZG93KHdpbmRvdykgPyAoXG4gICAgICAgICAgICAgICAgPFNwaW5uZXJJY29uXG4gICAgICAgICAgICAgICAgICAkc2l6ZT1cInNcIlxuICAgICAgICAgICAgICAgICAgJGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiT3BlbmluZyBpdCBhZ2FpblwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICA8UmVvcGVuV2luZG93QnV0dG9uIHdpbmRvdz17d2luZG93fSAvPlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDxDbG9zZVdpbmRvd0J1dHRvbiB3aW5kb3c9e3dpbmRvd30gaW5saW5lIC8+XG4gICAgICAgICAgPC9EaXY+XG4gICAgICAgICkpfVxuXG4gICAgICAgIDxQcmltYXJ5QnV0dG9uXG4gICAgICAgICAgSWNvbj17RGFzaGJvYXJkSWNvbn1cbiAgICAgICAgICAkc3R5bGU9e3sgbWFyZ2luTGVmdDogXCJhdXRvXCIgfX1cbiAgICAgICAgICAkZGlzYWJsZWQ9eyFjYW5BdXRvVGlsZX1cbiAgICAgICAgICAkdG9vbHRpcD17XG4gICAgICAgICAgICBjYW5BdXRvVGlsZVxuICAgICAgICAgICAgICA/IFwiVGlsZSB0aGUgd2luZG93cyBub3QgdGlsZWQgdG9vOiBlYWNoIGdvZXMgdG8gdGhlIHNjcmVlbiB3aXRoIHRoZSBtb3N0IHJvb20sIGluIGl0cyBmaXJzdCBmcmVlIGNlbGwsIGFuZCBpcyBtb3ZlZCB0aGVyZS5cIlxuICAgICAgICAgICAgICA6IFwiTm90aGluZyB0byB0aWxlOiBldmVyeSBvcGVuIHdpbmRvdyBpcyB0aWxlZCBhbHJlYWR5LiBEcmFnIGEgd2luZG93IGhlcmUgdG8gdGFrZSBpdCBvdXQgb2YgdGhlIHRpbGluZy5cIlxuICAgICAgICAgIH1cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBtb2RlbC50aWxpbmdQbGFuLmF1dG9UaWxlKCl9XG4gICAgICAgID5cbiAgICAgICAgICBUaWxlIGFsbFxuICAgICAgICA8L1ByaW1hcnlCdXR0b24+XG4gICAgICA8L0Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICByZWY9e2RyYXdpbmdSZWZ9XG4gICAgICAgIGNsYXNzTmFtZT17c3R5bGVzLmRyYXdpbmd9XG4gICAgICAgIHN0eWxlPXt3cmFwcyA/IHsgbWluSGVpZ2h0OiBkcmF3bldpZHRoIC8gYXNwZWN0UmF0aW8gfSA6IHVuZGVmaW5lZH1cbiAgICAgICAgaGlkZGVuPXtkaXNwbGF5cy5sZW5ndGggPT09IDB9XG4gICAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBkYXRhLXRpbGluZy1zY3JlZW5zXG4gICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMuc2NyZWVuc31cbiAgICAgICAgICBvblBvaW50ZXJPdmVyPXsoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KVxuICAgICAgICAgICAgICAuY2xvc2VzdChcIltkYXRhLXNjcmVlbi1pZF1cIilcbiAgICAgICAgICAgICAgPy5nZXRBdHRyaWJ1dGUoXCJkYXRhLXNjcmVlbi1pZFwiKTtcblxuICAgICAgICAgICAgc2V0SG92ZXJlZFNjcmVlbihpZCA/IE51bWJlcihpZCkgOiB1bmRlZmluZWQpO1xuICAgICAgICAgIH19XG4gICAgICAgICAgb25Qb2ludGVyTGVhdmU9eygpID0+IHNldEhvdmVyZWRTY3JlZW4odW5kZWZpbmVkKX1cbiAgICAgICAgICBzdHlsZT17eyB3aWR0aDogZHJhd25XaWR0aCwgaGVpZ2h0OiBkcmF3bldpZHRoIC8gYXNwZWN0UmF0aW8gfX1cbiAgICAgICAgPlxuICAgICAgICAgIHtzaG93bi5zY3JlZW5zLm1hcCgoc2NyZWVuLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVjdCA9IHJlY3RzLmdldChzY3JlZW4uZGlzcGxheS5pZCkhO1xuXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICA8RGl2XG4gICAgICAgICAgICAgICAga2V5PXtzY3JlZW4uZGlzcGxheS5pZH1cbiAgICAgICAgICAgICAgICBkYXRhLXNjcmVlbi1pZD17c2NyZWVuLmRpc3BsYXkuaWR9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMuc2NyZWVufVxuICAgICAgICAgICAgICAgICRiYWNrZ3JvdW5kQ29sb3I9XCJiYWNrZ3JvdW5kUHJpbWFyeURpbW1lZFwiXG4gICAgICAgICAgICAgICAgJGJvcmRlcj17e1xuICAgICAgICAgICAgICAgICAgY29sb3I6IHNjcmVlbi5taXNzaW5nID8gXCJjcml0aWNhbFwiIDogXCJib3JkZXJQcmltYXJ5XCIsXG4gICAgICAgICAgICAgICAgICB3aWR0aDogXCJ4eHNcIixcbiAgICAgICAgICAgICAgICAgIHJhZGl1czogXCJtXCIsXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAkc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgIGJvcmRlclN0eWxlOiBzY3JlZW4ubWlzc2luZyA/IFwiZGFzaGVkXCIgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICBsZWZ0OiBgY2FsYygke3JlY3QubGVmdH0lICsgJHtnYXAgLyAyfXB4KWAsXG4gICAgICAgICAgICAgICAgICB0b3A6IGBjYWxjKCR7cmVjdC50b3B9JSArICR7Z2FwIC8gMn1weClgLFxuICAgICAgICAgICAgICAgICAgd2lkdGg6IGBjYWxjKCR7cmVjdC53aWR0aH0lIC0gJHtnYXB9cHgpYCxcbiAgICAgICAgICAgICAgICAgIGhlaWdodDogYGNhbGMoJHtyZWN0LmhlaWdodH0lIC0gJHtnYXB9cHgpYCxcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPFNjcmVlbkJhbmRcbiAgICAgICAgICAgICAgICAgIHNjcmVlbj17c2NyZWVufVxuICAgICAgICAgICAgICAgICAgaW5kZXg9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgaXNIb3ZlcmVkPXtob3ZlcmVkU2NyZWVuID09PSBzY3JlZW4uZGlzcGxheS5pZH1cbiAgICAgICAgICAgICAgICAvPlxuXG4gICAgICAgICAgICAgICAge0FycmF5LmZyb20oXG4gICAgICAgICAgICAgICAgICB7IGxlbmd0aDogc2NyZWVuLmNvbHVtbnMgKiBzY3JlZW4ucm93cyB9LFxuICAgICAgICAgICAgICAgICAgKF8sIGNlbGwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sdW1uID0gY2VsbCAlIHNjcmVlbi5jb2x1bW5zO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBNYXRoLmZsb29yKGNlbGwgLyBzY3JlZW4uY29sdW1ucyk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgbGVmdDogYCR7KGNvbHVtbiAvIHNjcmVlbi5jb2x1bW5zKSAqIDEwMH0lYCxcbiAgICAgICAgICAgICAgICAgICAgICB0b3A6IGBjYWxjKCR7YmFuZH1weCArICgxMDAlIC0gJHtiYW5kfXB4KSAqICR7cm93IC8gc2NyZWVuLnJvd3N9KWAsXG4gICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGAkezEwMCAvIHNjcmVlbi5jb2x1bW5zfSVgLFxuICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogYGNhbGMoKDEwMCUgLSAke2JhbmR9cHgpIC8gJHtzY3JlZW4ucm93c30pYCxcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBBbiBlbXB0eSBjZWxsIG9wZW5zIGEgbmV3IHdpbmRvdyBpbiBpdCwgd2l0aCBhIHBsdXMgc2hvd2luZyBvbiBob3Zlci5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNFbXB0eSA9ICFzY3JlZW4ud2luZG93cy5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgIChpdCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiA+PSBpdC5jb2x1bW4gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiA8IGl0LmNvbHVtbiArIGl0LmNvbHVtbnMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA+PSBpdC5yb3cgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA8IGl0LnJvdyArIGl0LnJvd3MsXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzRW1wdHkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhc2NyZWVuLm1pc3NpbmcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhZHJhZyAmJlxuICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmNhbk9wZW5QbGFjZXMuZ2V0KCkgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtjZWxsfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtbc3R5bGVzLmNlbGwsIHN0eWxlcy5lbXB0eUNlbGxdLmpvaW4oXCIgXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIk9wZW4gYSBuZXcgd2luZG93IGluIHRoaXMgY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAkZHJvcERvd25NZW51PXtkcm9wRG93bk1lbnUobmV3V2luZG93TWVudUtpbmQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogeyBkaXNwbGF5SWQ6IHNjcmVlbi5kaXNwbGF5LmlkLCBjb2x1bW4sIHJvdyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogXCJib3R0b21cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17c3R5bGVzLnBsdXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNvbGlkLCBzbyB0aGF0IHdoYXQgaXMgYmVoaW5kIGl0LCBhcyB0aGUgZW1wdHkgc2NyZWVuJ3MgdGV4dCwgZG9lcyBub3Qgc2hvdyB0aHJvdWdoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAkYmFja2dyb3VuZENvbG9yPVwiYmFja2dyb3VuZFNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICR0b29sdGlwPVwiT3BlbiBhIGNsdXN0ZXIncyBwYWdlIGluIGEgbmV3IHdpbmRvdyBoZXJlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEFkZENpcmNsZU91dGxpbmVJY29uICRzaXplPVwibFwiICRjb2xvcj1cInByaW1hcnlcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYga2V5PXtjZWxsfSBjbGFzc05hbWU9e3N0eWxlcy5jZWxsfSBzdHlsZT17c3R5bGV9IC8+XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgICAgICB7c2NyZWVuLndpbmRvd3MubGVuZ3RoID09PSAwICYmIChcbiAgICAgICAgICAgICAgICAgIDxEaXZcbiAgICAgICAgICAgICAgICAgICAgJGNvbG9yPVwidGV4dE11dGVkXCJcbiAgICAgICAgICAgICAgICAgICAgJGZvbnQ9e3sgc2l6ZTogXCJzXCIgfX1cbiAgICAgICAgICAgICAgICAgICAgJHRleHRBbGlnbj1cImNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICRzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgcG9pbnRlckV2ZW50czogXCJub25lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgICAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGUgbWlkZGxlIG9mIHRoZSBzY3JlZW4ncyBncmlkLCBiZWxvdyBpdHMgYmFuZC5cbiAgICAgICAgICAgICAgICAgICAgICB0b3A6IGBjYWxjKCR7YmFuZH1weCArICgxMDAlIC0gJHtiYW5kfXB4KSAvIDIpYCxcbiAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRlWSgtNTAlKVwiLFxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBObyB3aW5kb3dzIHRpbGVkIHlldFxuICAgICAgICAgICAgICAgICAgPC9EaXY+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC9EaXY+XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pfVxuXG4gICAgICAgICAge3Nob3duLnNjcmVlbnMuZmxhdE1hcCgoc2NyZWVuKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gcmVjdHMuZ2V0KHNjcmVlbi5kaXNwbGF5LmlkKSE7XG4gICAgICAgICAgICBjb25zdCBncmlkVG9wID0gYCR7cmVjdC50b3B9JSArICR7Z2FwIC8gMiArIGJhbmR9cHhgO1xuICAgICAgICAgICAgY29uc3QgZ3JpZEhlaWdodCA9IGAoJHtyZWN0LmhlaWdodH0lIC0gJHtnYXAgKyBiYW5kfXB4KWA7XG4gICAgICAgICAgICBjb25zdCBncmlkTGVmdCA9IGAke3JlY3QubGVmdH0lICsgJHtnYXAgLyAyfXB4YDtcbiAgICAgICAgICAgIGNvbnN0IGdyaWRXaWR0aCA9IGAoJHtyZWN0LndpZHRofSUgLSAke2dhcH1weClgO1xuXG4gICAgICAgICAgICByZXR1cm4gc2NyZWVuLndpbmRvd3MubWFwKCh3aW5kb3cpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBrZXk9e3dpbmRvdy5rZXl9XG4gICAgICAgICAgICAgICAgICBkYXRhLXNjcmVlbi1pZD17c2NyZWVuLmRpc3BsYXkuaWR9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e1tcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnRpbGUsXG4gICAgICAgICAgICAgICAgICAgIGRyYWc/LmtleSA9PT0gd2luZG93LmtleSA/IHN0eWxlcy5kcmFnZ2luZyA6IFwiXCIsXG4gICAgICAgICAgICAgICAgICBdLmpvaW4oXCIgXCIpfVxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogYGNhbGMoJHtncmlkTGVmdH0gKyAke2dyaWRXaWR0aH0gKiAke3dpbmRvdy5jb2x1bW4gLyBzY3JlZW4uY29sdW1uc30pYCxcbiAgICAgICAgICAgICAgICAgICAgdG9wOiBgY2FsYygke2dyaWRUb3B9ICsgJHtncmlkSGVpZ2h0fSAqICR7d2luZG93LnJvdyAvIHNjcmVlbi5yb3dzfSlgLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogYGNhbGMoJHtncmlkV2lkdGh9ICogJHt3aW5kb3cuY29sdW1ucyAvIHNjcmVlbi5jb2x1bW5zfSlgLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGBjYWxjKCR7Z3JpZEhlaWdodH0gKiAke3dpbmRvdy5yb3dzIC8gc2NyZWVuLnJvd3N9KWAsXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgb25Qb2ludGVyRG93bj17c3RhcnRNb3ZlKHdpbmRvdyl9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPERpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlcy50aWxlQm9keX1cbiAgICAgICAgICAgICAgICAgICAgJGJhY2tncm91bmRDb2xvcj1cImJhY2tncm91bmRTZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgICAkYm9yZGVyPXt7XG4gICAgICAgICAgICAgICAgICAgICAgY29sb3I6IGlzTm90T3Blbih3aW5kb3cpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFwiY3JpdGljYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBtb2RlbC5pc091dE9mUGxhY2Uod2luZG93LCBzY3JlZW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJ3YXJuaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpc0FwcGxpY2F0aW9uV2luZG93KHdpbmRvdy5yZWNvcmQud2luZG93KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiYm9yZGVyUHJpbWFyeVwiLFxuICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBcInh4c1wiLFxuICAgICAgICAgICAgICAgICAgICAgIHJhZGl1czogXCJzXCIsXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICRzdHlsZT17XG4gICAgICAgICAgICAgICAgICAgICAgaXNOb3RPcGVuKHdpbmRvdykgPyB7IGJvcmRlclN0eWxlOiBcImRhc2hlZFwiIH0gOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAkZm9udD17eyBzaXplOiBcInNcIiB9fVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7LyogVGhlIG5hbWUgZmlyc3Q7IHdoYXQgaXMgdG9sZCBvZiB0aGUgd2luZG93IGFmdGVyIGl0LCBvbiB0aGUgbmV4dCBsaW5lIHdoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGRvZXMgbm90IGZpdCBiZXNpZGUgaXQuICovfVxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy50aWxlVGl0bGVMaW5lfT5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy50aWxlTmFtZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8V2luZG93VGl0bGUgd2luZG93PXt3aW5kb3d9IC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8UmVuYW1lV2luZG93QnV0dG9uIHdpbmRvdz17d2luZG93fSBvblRpbGUgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAge3dpbmRvdy5taXNzaW5nICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAobW9kZWwucmVvcGVuaW5nLmdldCgpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5pc1Jlb3BlbmluZ1dpbmRvdyh3aW5kb3cpID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U3Bpbm5lckljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2l6ZT1cInNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJPcGVuaW5nIGl0IGFnYWluXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17c3R5bGVzLnRpbGVMYWJlbH0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNwYW4gJGNvbG9yPVwiY3JpdGljYWxcIj5ub3Qgb3BlbjwvU3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UmVvcGVuV2luZG93QnV0dG9uIHdpbmRvdz17d2luZG93fSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgIDxDbG9zZVdpbmRvd0J1dHRvbiB3aW5kb3c9e3dpbmRvd30gLz5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMuaGFuZGxlfVxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJEcmFnIHRvIHNwYW4gbW9yZSBvciBmZXdlciBjZWxsc1wiXG4gICAgICAgICAgICAgICAgICAgICAgb25Qb2ludGVyRG93bj17c3RhcnRSZXNpemUod2luZG93LCBzY3JlZW4uZGlzcGxheS5pZCl9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L0Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pfVxuXG4gICAgICAgICAge3Nob3duLnNjcmVlbnMubWFwKChzY3JlZW4sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gcmVjdHMuZ2V0KHNjcmVlbi5kaXNwbGF5LmlkKSE7XG5cbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBrZXk9e3NjcmVlbi5kaXNwbGF5LmlkfVxuICAgICAgICAgICAgICAgIGRhdGEtc2NyZWVuLWlkPXtzY3JlZW4uZGlzcGxheS5pZH1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlcy5zY3JlZW5Db250cm9sc31cbiAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgbGVmdDogYGNhbGMoJHtyZWN0LmxlZnR9JSArICR7Z2FwIC8gMn1weClgLFxuICAgICAgICAgICAgICAgICAgdG9wOiBgY2FsYygke3JlY3QudG9wfSUgKyAke2dhcCAvIDJ9cHgpYCxcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiBgY2FsYygke3JlY3Qud2lkdGh9JSAtICR7Z2FwfXB4KWAsXG4gICAgICAgICAgICAgICAgICBoZWlnaHQ6IGBjYWxjKCR7cmVjdC5oZWlnaHR9JSAtICR7Z2FwfXB4KWAsXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxTY3JlZW5TdGVwcGVycyBzY3JlZW49e3NjcmVlbn0gaW5kZXg9e2luZGV4fSAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHtkcmFnPy5raW5kID09PSBcIm1vdmVcIiAmJiBwb2ludGVyICYmIChcbiAgICAgICAgPERpdlxuICAgICAgICAgIGNsYXNzTmFtZT17c3R5bGVzLmdob3N0fVxuICAgICAgICAgICRiYWNrZ3JvdW5kQ29sb3I9XCJiYWNrZ3JvdW5kU2Vjb25kYXJ5XCJcbiAgICAgICAgICAkYm9yZGVyPXt7IGNvbG9yOiBcInByaW1hcnlcIiwgd2lkdGg6IFwieHhzXCIsIHJhZGl1czogXCJzXCIgfX1cbiAgICAgICAgICAkZm9udD17eyBzaXplOiBcInNcIiB9fVxuICAgICAgICAgICRzdHlsZT17eyBsZWZ0OiBwb2ludGVyLngsIHRvcDogcG9pbnRlci55IH19XG4gICAgICAgID5cbiAgICAgICAgICB7ZHJhZy50aXRsZX1cbiAgICAgICAgPC9EaXY+XG4gICAgICApfVxuICAgIDwvRGl2PlxuICApO1xufSk7XG5cbi8vIFRoZSB0aWxpbmcgcm93IG9mIHRoZSBkaWFsb2c6IHRoZSBlZGl0b3IsIGFuZCB0aGUgYnV0dG9ucyB0byB0aWxlIGFzIGl0IHNob3dzLCBzdGFydCBvdmVyLCBvclxuLy8ga2VlcCBpdCB3aXRoIHRoZSBsYXlvdXQgc2hvd24uXG5leHBvcnQgY29uc3QgVGlsZVdpbmRvd3MgPSBvYnNlcnZlcigoKSA9PiB7XG4gIGNvbnN0IG1vZGVsID0gdXNlSW5qZWN0KHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUpKCk7XG4gIGNvbnN0IGxheW91dCA9IG1vZGVsLnNlbGVjdGVkTGF5b3V0LmdldCgpO1xuXG4gIHJldHVybiAoXG4gICAgPERpdlxuICAgICAgJGZsZXg9e3sgZGlyZWN0aW9uOiBcInZlcnRpY2FsXCIsIGdhcDogXCJzXCIgfX1cbiAgICAgIC8vIFRha2luZyB0aGUgaGVpZ2h0IHRoZSBkaWFsb2cgaGFzIGxlZnQsIGZvciB0aGUgc2NyZWVucyB0byBiZSBkcmF3biBhcyBsYXJnZSBhcyBpdCBsZXRzIHRoZW0uXG4gICAgICAkZmxleENoaWxkXG4gICAgICAkcGFkZGluZz17eyB2ZXJ0aWNhbDogXCJzXCIsIGhvcml6b250YWw6IFwibVwiIH19XG4gICAgICAkYm9yZGVyPXt7IGNvbG9yOiBcImJvcmRlclByaW1hcnlcIiwgd2lkdGg6IFwieHhzXCIsIHJhZGl1czogXCJtXCIgfX1cbiAgICA+XG4gICAgICA8RGl2XG4gICAgICAgICRmbGV4PXt7IGRpcmVjdGlvbjogXCJob3Jpem9udGFsXCIsIGdhcDogXCJtXCIsIHZlcnRpY2FsQWxpZ246IFwiY2VudGVyXCIgfX1cbiAgICAgID5cbiAgICAgICAgPERpdiAkZmxleD17eyBkaXJlY3Rpb246IFwidmVydGljYWxcIiwgZ2FwOiBcInh4c1wiIH19ICRmbGV4Q2hpbGQ+XG4gICAgICAgICAgPFNwYW4gJGZvbnQ9e3sgYm9sZDogdHJ1ZSB9fT5UaWxpbmc8L1NwYW4+XG4gICAgICAgICAgPFNwYW4gJGNvbG9yPVwidGV4dE11dGVkXCIgJGZvbnQ9e3sgc2l6ZTogXCJzXCIgfX0+XG4gICAgICAgICAgICBEcmFnIHdpbmRvd3MgdG8gYW55IGNlbGwgb2YgdGhlIHNjcmVlbnM7IGRyYWcgYSB3aW5kb3cncyBjb3JuZXIgdG9cbiAgICAgICAgICAgIG1ha2UgaXQgd2lkZXIgb3IgdGFsbGVyLiBUaGUgd2luZG93cyBmb2xsb3cgYXMgeW91IGNoYW5nZSBpdC5cbiAgICAgICAgICA8L1NwYW4+XG4gICAgICAgIDwvRGl2PlxuICAgICAgPC9EaXY+XG5cbiAgICAgIHttb2RlbC5jYW5BcnJhbmdlLmdldCgpICYmIDxUaWxpbmdFZGl0b3IgLz59XG4gICAgPC9EaXY+XG4gICk7XG59KTtcbiIsICJpbXBvcnQgeyBhc1N0eWxlc2hlZXQgfSBmcm9tIFwiQGs4c2xlbnMvc3R5bGVzaGVldC1jb250cmFjdHNcIjtcbmV4cG9ydCBjb25zdCBzdHlsZXNoZWV0ID0gYXNTdHlsZXNoZWV0KHsgaWQ6IFwiQGs4c2xlbnMvd2luZG93LWxheW91dHMvc3JjL3VpL3RpbGluZy1lZGl0b3IubW9kdWxlLnNjc3NcIiwgY3NzOiBcIi50aWxpbmctZWRpdG9yLW1vZHVsZV9fZHJhd2luZ19fX25sVjZaIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBmbGV4OiAxIDEgMDtcXG4gIG1pbi1oZWlnaHQ6IDMwMHB4O1xcbn1cXG5cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX3NjcmVlbnNfX196MlVDbyB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICB1c2VyLXNlbGVjdDogbm9uZTtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19jZWxsX19fS0JMQUwge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIGJvcmRlcjogMXB4IGRhc2hlZCByZ2JhKDEyNywgMTI3LCAxMjcsIDAuMyk7XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19lbXB0eUNlbGxfX18ycGFodiB7XFxuICBwb2ludGVyLWV2ZW50czogYXV0bztcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICBwYWRkaW5nOiAwO1xcbiAgYmFja2dyb3VuZDogbm9uZTtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19lbXB0eUNlbGxfX18ycGFodiAudGlsaW5nLWVkaXRvci1tb2R1bGVfX3BsdXNfX19yYnhzZyB7XFxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHotaW5kZXg6IDE7XFxuICBwYWRkaW5nOiA0cHg7XFxuICBib3JkZXItcmFkaXVzOiA1MCU7XFxuICBvcGFjaXR5OiAwO1xcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlO1xcbn1cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX2VtcHR5Q2VsbF9fXzJwYWh2OmhvdmVyLCAudGlsaW5nLWVkaXRvci1tb2R1bGVfX2VtcHR5Q2VsbF9fXzJwYWh2OmZvY3VzLXZpc2libGUge1xcbiAgYmFja2dyb3VuZDogcmdiYSgxMjcsIDEyNywgMTI3LCAwLjEyKTtcXG59XFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19lbXB0eUNlbGxfX18ycGFodjpob3ZlciAudGlsaW5nLWVkaXRvci1tb2R1bGVfX3BsdXNfX19yYnhzZywgLnRpbGluZy1lZGl0b3ItbW9kdWxlX19lbXB0eUNlbGxfX18ycGFodjpmb2N1cy12aXNpYmxlIC50aWxpbmctZWRpdG9yLW1vZHVsZV9fcGx1c19fX3JieHNnIHtcXG4gIG9wYWNpdHk6IDE7XFxufVxcblxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fc3RlcHBlckdyb3VwX19fTWE1Wjgge1xcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgZ2FwOiAycHg7XFxufVxcblxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fc2NyZWVuQ29udHJvbHNfX18wRC1ERSB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XFxuICB6LWluZGV4OiAxO1xcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcblxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fcGlsbF9fX1NZWHd0IHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgcG9pbnRlci1ldmVudHM6IGF1dG87XFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcXG4gIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMyk7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbn1cXG5cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX2NvbHVtbnNQaWxsX19famQ0eHgge1xcbiAgbGVmdDogNTAlO1xcbiAgcGFkZGluZzogMnB4IDhweDtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19yb3dzUGlsbF9fX1pWNzA4IHtcXG4gIGxlZnQ6IDA7XFxuICBwYWRkaW5nOiA4cHggMnB4O1xcbn1cXG5cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX3NjcmVlbl9fX01aYTZYIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxufVxcblxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fYmFuZF9fX2t6N1RFIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGxlZnQ6IDA7XFxuICByaWdodDogMDtcXG4gIHRvcDogMDtcXG4gIGhlaWdodDogNDBweDtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XFxuICBwYWRkaW5nOiA2cHggMTJweDtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19zY3JlZW5OYW1lX19fRjhGVlMge1xcbiAgZmxleDogMCAxIGF1dG87XFxuICBtaW4td2lkdGg6IDA7XFxuICBtYXgtd2lkdGg6IDEwMCU7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxufVxcblxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fdW50aWxlX19faC10QnAge1xcbiAgZmxleC1zaHJpbms6IDA7XFxuICBtYXJnaW4tbGVmdDogYXV0bztcXG4gIG9wYWNpdHk6IDA7XFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDEyMG1zIGVhc2U7XFxufVxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fdW50aWxlX19faC10QnAudGlsaW5nLWVkaXRvci1tb2R1bGVfX3Nob3duX19fSkVuRHcsIC50aWxpbmctZWRpdG9yLW1vZHVsZV9fdW50aWxlX19faC10QnA6Zm9jdXMtdmlzaWJsZSB7XFxuICBvcGFjaXR5OiAxO1xcbn1cXG5cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX3ZlcnRpY2FsU3RlcHBlckdyb3VwX19fOGRPUEIge1xcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIGdhcDogMnB4O1xcbn1cXG5cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX3N0ZXBwZXJfX19oMUhOayB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gIHdpZHRoOiAyMnB4O1xcbiAgaGVpZ2h0OiAyMnB4O1xcbiAgcGFkZGluZzogMDtcXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gIGJhY2tncm91bmQ6IG5vbmU7XFxuICBib3JkZXI6IG5vbmU7XFxuICBjb2xvcjogaW5oZXJpdDtcXG4gIGZvbnQ6IGluaGVyaXQ7XFxufVxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fc3RlcHBlcl9fX2gxSE5rOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcXG4gIGJhY2tncm91bmQ6IHJnYmEoMTI3LCAxMjcsIDEyNywgMC4yNSk7XFxufVxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fc3RlcHBlcl9fX2gxSE5rOmRpc2FibGVkIHtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG4gIG9wYWNpdHk6IDAuNDtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbn1cXG5cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX3N0ZXBwZXJUaXBfX19OT0I0TCB7XFxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19sYWJlbF9fX1J0N1EzIHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgbGluZS1oZWlnaHQ6IDE7XFxuICB0ZXh0LWJveDogdHJpbS1ib3RoIGNhcCBhbHBoYWJldGljO1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX192ZXJ0aWNhbExhYmVsX19fNVd1T0Qge1xcbiAgd3JpdGluZy1tb2RlOiB2ZXJ0aWNhbC1ybDtcXG4gIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxufVxcblxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fdGlsZV9fX1lNVUUzIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICBwYWRkaW5nOiAycHg7XFxuICBjdXJzb3I6IGdyYWI7XFxuICB0b3VjaC1hY3Rpb246IG5vbmU7XFxuICB0cmFuc2l0aW9uOiBsZWZ0IDEyMG1zIGVhc2UsIHRvcCAxMjBtcyBlYXNlLCB3aWR0aCAxMjBtcyBlYXNlLCBoZWlnaHQgMTIwbXMgZWFzZTtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX190aWxlQm9keV9fX3Y2Q3ZnIHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICBwYWRkaW5nOiAxOHB4IDZweCA0cHggMThweDtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX190aWxlVGl0bGVMaW5lX19fcXVvam4ge1xcbiAgcGFkZGluZy1yaWdodDogMjRweDtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBmbGV4LXdyYXA6IHdyYXA7XFxuICBhbGlnbi1pdGVtczogYmFzZWxpbmU7XFxuICBnYXA6IDJweCA2cHg7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbn1cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX3RpbGVUaXRsZUxpbmVfX19xdW9qbiA+IDpub3QoOmZpcnN0LWNoaWxkKSB7XFxuICBmbGV4LXNocmluazogMDtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX190aWxlTmFtZV9fX1pWZU5pIHtcXG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIGZsZXg6IDAgMSBhdXRvO1xcbiAgbWluLXdpZHRoOiAwO1xcbiAgbWF4LXdpZHRoOiAxMDAlO1xcbn1cXG5cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX3RpbGVMYWJlbF9fXzNuRXZnIHtcXG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIGdhcDogNnB4O1xcbn1cXG5cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX3RpbGVUaXRsZV9fX3UydFp4IHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgbWluLXdpZHRoOiAwO1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19kcmFnZ2luZ19fX3JtVUdXIHtcXG4gIGN1cnNvcjogZ3JhYmJpbmc7XFxuICBvcGFjaXR5OiAwLjY7XFxufVxcblxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9faGFuZGxlX19fN3QwTUkge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgcmlnaHQ6IDJweDtcXG4gIGJvdHRvbTogMnB4O1xcbiAgd2lkdGg6IDE0cHg7XFxuICBoZWlnaHQ6IDE0cHg7XFxuICBjdXJzb3I6IG53c2UtcmVzaXplO1xcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgdHJhbnNwYXJlbnQgNTAlLCBjdXJyZW50Q29sb3IgNTAlLCBjdXJyZW50Q29sb3IgNjAlLCB0cmFuc3BhcmVudCA2MCUsIHRyYW5zcGFyZW50IDcwJSwgY3VycmVudENvbG9yIDcwJSwgY3VycmVudENvbG9yIDgwJSwgdHJhbnNwYXJlbnQgODAlKTtcXG4gIG9wYWNpdHk6IDAuNztcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX190cmF5X19fNmM0ZGUge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGZsZXgtd3JhcDogd3JhcDtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBnYXA6IDZweDtcXG4gIG1pbi1oZWlnaHQ6IDM2cHg7XFxuICB1c2VyLXNlbGVjdDogbm9uZTtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19jaGlwX19fdWRDcEUge1xcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgY3Vyc29yOiBncmFiO1xcbiAgdG91Y2gtYWN0aW9uOiBub25lO1xcbiAgcGFkZGluZzogMnB4IDhweDtcXG4gIG1heC13aWR0aDogMjIwcHg7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19jaGlwX19fdWRDcEUgLnRpbGluZy1lZGl0b3ItbW9kdWxlX190aWxlVGl0bGVfX191MnRaeCB7XFxuICBmbGV4OiAwIDEgYXV0bztcXG59XFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19jaGlwX19fdWRDcEUgLnRpbGluZy1lZGl0b3ItbW9kdWxlX19jbG9zZVdpbmRvd0lubGluZV9fX1VKSjNBIHtcXG4gIGZsZXgtc2hyaW5rOiAwO1xcbiAgbWFyZ2luLWxlZnQ6IDJweDtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19naG9zdF9fX0VMdWhFIHtcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbiAgei1pbmRleDogMTAwMDA7XFxuICBwYWRkaW5nOiAycHggOHB4O1xcbiAgbWF4LXdpZHRoOiAyNDBweDtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSg4cHgsIDhweCk7XFxufVxcblxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fY2xvc2VXaW5kb3dfX19ONmRlTyB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB0b3A6IDJweDtcXG4gIHJpZ2h0OiAycHg7XFxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gIHBhZGRpbmc6IDJweDtcXG4gIGJvcmRlcjogbm9uZTtcXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gIGJhY2tncm91bmQ6IG5vbmU7XFxuICBjb2xvcjogaW5oZXJpdDtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIG9wYWNpdHk6IDA7XFxufVxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fY2xvc2VXaW5kb3dfX19ONmRlTzpob3ZlciB7XFxuICBiYWNrZ3JvdW5kOiByZ2JhKDEyNywgMTI3LCAxMjcsIDAuMjUpO1xcbn1cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX2Nsb3NlV2luZG93X19fTjZkZU86Zm9jdXMtdmlzaWJsZSB7XFxuICBvcGFjaXR5OiAxO1xcbn1cXG5cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX3RpbGVfX19ZTVVFMzpob3ZlciAudGlsaW5nLWVkaXRvci1tb2R1bGVfX2Nsb3NlV2luZG93X19fTjZkZU8sXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19jaGlwX19fdWRDcEU6aG92ZXIgLnRpbGluZy1lZGl0b3ItbW9kdWxlX19jbG9zZVdpbmRvd19fX042ZGVPIHtcXG4gIG9wYWNpdHk6IDE7XFxufVxcblxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fcmVuYW1lV2luZG93X19fQjkyaW4ge1xcbiAgZmxleC1zaHJpbms6IDA7XFxuICBhbGlnbi1zZWxmOiBjZW50ZXI7XFxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gIG1hcmdpbi1sZWZ0OiAycHg7XFxuICBwYWRkaW5nOiAxcHg7XFxuICBib3JkZXI6IG5vbmU7XFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICBiYWNrZ3JvdW5kOiBub25lO1xcbiAgY29sb3I6IGluaGVyaXQ7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBvcGFjaXR5OiAwO1xcbn1cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX3JlbmFtZVdpbmRvd19fX0I5MmluOmhvdmVyIHtcXG4gIGJhY2tncm91bmQ6IHJnYmEoMTI3LCAxMjcsIDEyNywgMC4yNSk7XFxufVxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fcmVuYW1lV2luZG93X19fQjkyaW46Zm9jdXMtdmlzaWJsZSB7XFxuICBvcGFjaXR5OiAxO1xcbn1cXG5cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX3RpbGVfX19ZTVVFMzpob3ZlciAudGlsaW5nLWVkaXRvci1tb2R1bGVfX3JlbmFtZVdpbmRvd19fX0I5MmluLFxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fY2hpcF9fX3VkQ3BFOmhvdmVyIC50aWxpbmctZWRpdG9yLW1vZHVsZV9fcmVuYW1lV2luZG93X19fQjkyaW4ge1xcbiAgb3BhY2l0eTogMTtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19yZW9wZW5XaW5kb3dfX19UWHhGTSB7XFxuICBmbGV4LXNocmluazogMDtcXG4gIGFsaWduLXNlbGY6IGNlbnRlcjtcXG4gIG9wYWNpdHk6IDA7XFxufVxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fcmVvcGVuV2luZG93X19fVFh4Rk06Zm9jdXMtdmlzaWJsZSB7XFxuICBvcGFjaXR5OiAxO1xcbn1cXG5cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX3RpbGVfX19ZTVVFMzpob3ZlciAudGlsaW5nLWVkaXRvci1tb2R1bGVfX3Jlb3BlbldpbmRvd19fX1RYeEZNLFxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fY2hpcF9fX3VkQ3BFOmhvdmVyIC50aWxpbmctZWRpdG9yLW1vZHVsZV9fcmVvcGVuV2luZG93X19fVFh4Rk0ge1xcbiAgb3BhY2l0eTogMTtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX190aWxlVGl0bGVGb3JtX19fSzM3M0Uge1xcbiAgZmxleDogMSAxIGF1dG87XFxuICBtaW4td2lkdGg6IDA7XFxufVxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fdGlsZVRpdGxlRm9ybV9fX0szNzNFIGlucHV0IHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19jbG9zZVdpbmRvd0lubGluZV9fX1VKSjNBIHtcXG4gIHBvc2l0aW9uOiBzdGF0aWM7XFxuICBtYXJnaW4tbGVmdDogNHB4O1xcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG59XCIgfSk7XG5leHBvcnQgZGVmYXVsdCB7XCJkcmF3aW5nXCI6XCJ0aWxpbmctZWRpdG9yLW1vZHVsZV9fZHJhd2luZ19fX25sVjZaXCIsXCJzY3JlZW5zXCI6XCJ0aWxpbmctZWRpdG9yLW1vZHVsZV9fc2NyZWVuc19fX3oyVUNvXCIsXCJjZWxsXCI6XCJ0aWxpbmctZWRpdG9yLW1vZHVsZV9fY2VsbF9fX0tCTEFMXCIsXCJlbXB0eUNlbGxcIjpcInRpbGluZy1lZGl0b3ItbW9kdWxlX19lbXB0eUNlbGxfX18ycGFodlwiLFwicGx1c1wiOlwidGlsaW5nLWVkaXRvci1tb2R1bGVfX3BsdXNfX19yYnhzZ1wiLFwic3RlcHBlckdyb3VwXCI6XCJ0aWxpbmctZWRpdG9yLW1vZHVsZV9fc3RlcHBlckdyb3VwX19fTWE1WjhcIixcInNjcmVlbkNvbnRyb2xzXCI6XCJ0aWxpbmctZWRpdG9yLW1vZHVsZV9fc2NyZWVuQ29udHJvbHNfX18wRC1ERVwiLFwicGlsbFwiOlwidGlsaW5nLWVkaXRvci1tb2R1bGVfX3BpbGxfX19TWVh3dFwiLFwiY29sdW1uc1BpbGxcIjpcInRpbGluZy1lZGl0b3ItbW9kdWxlX19jb2x1bW5zUGlsbF9fX2pkNHh4XCIsXCJyb3dzUGlsbFwiOlwidGlsaW5nLWVkaXRvci1tb2R1bGVfX3Jvd3NQaWxsX19fWlY3MDhcIixcInNjcmVlblwiOlwidGlsaW5nLWVkaXRvci1tb2R1bGVfX3NjcmVlbl9fX01aYTZYXCIsXCJiYW5kXCI6XCJ0aWxpbmctZWRpdG9yLW1vZHVsZV9fYmFuZF9fX2t6N1RFXCIsXCJzY3JlZW5OYW1lXCI6XCJ0aWxpbmctZWRpdG9yLW1vZHVsZV9fc2NyZWVuTmFtZV9fX0Y4RlZTXCIsXCJ1bnRpbGVcIjpcInRpbGluZy1lZGl0b3ItbW9kdWxlX191bnRpbGVfX19oLXRCcFwiLFwic2hvd25cIjpcInRpbGluZy1lZGl0b3ItbW9kdWxlX19zaG93bl9fX0pFbkR3XCIsXCJ2ZXJ0aWNhbFN0ZXBwZXJHcm91cFwiOlwidGlsaW5nLWVkaXRvci1tb2R1bGVfX3ZlcnRpY2FsU3RlcHBlckdyb3VwX19fOGRPUEJcIixcInN0ZXBwZXJcIjpcInRpbGluZy1lZGl0b3ItbW9kdWxlX19zdGVwcGVyX19faDFITmtcIixcInN0ZXBwZXJUaXBcIjpcInRpbGluZy1lZGl0b3ItbW9kdWxlX19zdGVwcGVyVGlwX19fTk9CNExcIixcImxhYmVsXCI6XCJ0aWxpbmctZWRpdG9yLW1vZHVsZV9fbGFiZWxfX19SdDdRM1wiLFwidmVydGljYWxMYWJlbFwiOlwidGlsaW5nLWVkaXRvci1tb2R1bGVfX3ZlcnRpY2FsTGFiZWxfX181V3VPRFwiLFwidGlsZVwiOlwidGlsaW5nLWVkaXRvci1tb2R1bGVfX3RpbGVfX19ZTVVFM1wiLFwidGlsZUJvZHlcIjpcInRpbGluZy1lZGl0b3ItbW9kdWxlX190aWxlQm9keV9fX3Y2Q3ZnXCIsXCJ0aWxlVGl0bGVMaW5lXCI6XCJ0aWxpbmctZWRpdG9yLW1vZHVsZV9fdGlsZVRpdGxlTGluZV9fX3F1b2puXCIsXCJ0aWxlTmFtZVwiOlwidGlsaW5nLWVkaXRvci1tb2R1bGVfX3RpbGVOYW1lX19fWlZlTmlcIixcInRpbGVMYWJlbFwiOlwidGlsaW5nLWVkaXRvci1tb2R1bGVfX3RpbGVMYWJlbF9fXzNuRXZnXCIsXCJ0aWxlVGl0bGVcIjpcInRpbGluZy1lZGl0b3ItbW9kdWxlX190aWxlVGl0bGVfX191MnRaeFwiLFwiZHJhZ2dpbmdcIjpcInRpbGluZy1lZGl0b3ItbW9kdWxlX19kcmFnZ2luZ19fX3JtVUdXXCIsXCJoYW5kbGVcIjpcInRpbGluZy1lZGl0b3ItbW9kdWxlX19oYW5kbGVfX183dDBNSVwiLFwidHJheVwiOlwidGlsaW5nLWVkaXRvci1tb2R1bGVfX3RyYXlfX182YzRkZVwiLFwiY2hpcFwiOlwidGlsaW5nLWVkaXRvci1tb2R1bGVfX2NoaXBfX191ZENwRVwiLFwiY2xvc2VXaW5kb3dJbmxpbmVcIjpcInRpbGluZy1lZGl0b3ItbW9kdWxlX19jbG9zZVdpbmRvd0lubGluZV9fX1VKSjNBXCIsXCJnaG9zdFwiOlwidGlsaW5nLWVkaXRvci1tb2R1bGVfX2dob3N0X19fRUx1aEVcIixcImNsb3NlV2luZG93XCI6XCJ0aWxpbmctZWRpdG9yLW1vZHVsZV9fY2xvc2VXaW5kb3dfX19ONmRlT1wiLFwicmVuYW1lV2luZG93XCI6XCJ0aWxpbmctZWRpdG9yLW1vZHVsZV9fcmVuYW1lV2luZG93X19fQjkyaW5cIixcInJlb3BlbldpbmRvd1wiOlwidGlsaW5nLWVkaXRvci1tb2R1bGVfX3Jlb3BlbldpbmRvd19fX1RYeEZNXCIsXCJ0aWxlVGl0bGVGb3JtXCI6XCJ0aWxpbmctZWRpdG9yLW1vZHVsZV9fdGlsZVRpdGxlRm9ybV9fX0szNzNFXCJ9OyIsICJpbXBvcnQgeyBEaXYsIEltZywgU3BhbiwgdXNlRm9jdXNhYmxlSXRlbSB9IGZyb20gXCJAazhzbGVucy9lbGVtZW50LWNvbXBvbmVudHNcIjtcbmltcG9ydCB7XG4gIHR5cGUgSWNvblByb3BzLFxuICBLdWJlUmVzb3VyY2VLaW5kSWNvbixcbiAgS3ViZXJuZXRlc1RpbGxlckNyZXN0SWNvbixcbn0gZnJvbSBcIkBrOHNsZW5zL2ljb25cIjtcbmltcG9ydCB7XG4gIERlZmF1bHREcm9wRG93bk1lbnVDb250YWluZXIsXG4gIGRyb3BEb3duTWVudSxcbiAgZHJvcERvd25NZW51Q29udGFpbmVyQ29tcG9uZW50SW5qZWN0aW9uVG9rZW4sXG4gIHR5cGUgRHJvcERvd25NZW51Q29udGFpbmVyUHJvcHMsXG4gIGdldERyb3BEb3duTWVudUl0ZW1JbmplY3RhYmxlQnVuY2gsXG4gIGdldERyb3BEb3duTWVudUl0ZW1zSW5qZWN0YWJsZUJ1bmNoLFxuICBnZXREcm9wRG93bk1lbnVLaW5kLFxuICB1c2VDbG9zZURyb3BEb3duTWVudSxcbn0gZnJvbSBcIkBrOHNsZW5zL2Ryb3AtZG93bi1tZW51LWNvbnRyYWN0c1wiO1xuaW1wb3J0IHtcbiAgRHJvcERvd25NZW51SXRlbVJvdyxcbiAgRHJvcERvd25NZW51U3ViTWVudSxcbn0gZnJvbSBcIkBrOHNsZW5zL2Ryb3AtZG93bi1tZW51LWl0ZW1zXCI7XG5pbXBvcnQgeyBTZWFyY2hJbnB1dCB9IGZyb20gXCJAazhzbGVucy9pbnB1dC1jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBnZXRJbmplY3RhYmxlMiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyB1c2VJbmplY3QgfSBmcm9tIFwiQGs4c2xlbnMvdXNlLWluamVjdFwiO1xuaW1wb3J0IHsgY29tcHV0ZWQgfSBmcm9tIFwibW9ieFwiO1xuaW1wb3J0IHsgcGxhY2VPZiB9IGZyb20gXCJAazhzbGVucy9uYXZpZ2F0aW9uLWNvbnRyYWN0c1wiO1xuaW1wb3J0IHsgcHJlZmVyZW5jZXNOYXZpZ2F0aW9uVGFyZ2V0S2luZCB9IGZyb20gXCJAazhzbGVucy9wcmVmZXJlbmNlcy1jb250cmFjdHNcIjtcbmltcG9ydCB7IG9ic2VydmVyIH0gZnJvbSBcIm1vYngtcmVhY3RcIjtcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgcmVzb3VyY2VMaXN0cywgdHlwZSBSZXNvdXJjZUxpc3QgfSBmcm9tIFwiLi4vbGF5b3V0cy9yZXNvdXJjZS1saXN0c1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBDZWxsLFxuICB3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlLFxufSBmcm9tIFwiLi93aW5kb3ctbGF5b3V0cy1tb2RlbC5pbmplY3RhYmxlXCI7XG5cbi8vIE9wZW5lZCBmcm9tIGFuIGVtcHR5IGNlbGw6IHRoZSBjbHVzdGVycywgZWFjaCBvcGVuaW5nIGl0cyBsaXN0cywgdG8gb3BlbiBvbmUgaW4gYSBuZXcgd2luZG93IHRoZXJlLlxuZXhwb3J0IGNvbnN0IG5ld1dpbmRvd01lbnVLaW5kID0gZ2V0RHJvcERvd25NZW51S2luZDxDZWxsPigpKFxuICBcIndpbmRvdy1tYW5hZ2VyLW5ldy13aW5kb3ctbWVudVwiLFxuKTtcblxudHlwZSBDbHVzdGVyQ2VsbCA9IENlbGwgJiB7XG4gIHJlYWRvbmx5IGNsdXN0ZXJJZDogc3RyaW5nO1xuICByZWFkb25seSBjbHVzdGVyTmFtZTogc3RyaW5nO1xufTtcblxuLy8gQSBjbHVzdGVyJ3MgbGlzdHMgb2Yga3ViZSByZXNvdXJjZXMsIG9wZW5lZCBiZXNpZGUgdGhlIGNsdXN0ZXIgaW4gdGhlIG1lbnUgYWJvdmUuXG5leHBvcnQgY29uc3QgcmVzb3VyY2VMaXN0TWVudUtpbmQgPSBnZXREcm9wRG93bk1lbnVLaW5kPENsdXN0ZXJDZWxsPigpKFxuICBcIndpbmRvdy1tYW5hZ2VyLXJlc291cmNlLWxpc3QtbWVudVwiLFxuKTtcblxuLy8gV2hhdCBhIG1lbnUgaXMgZm9yLCBhcyBhIGhlYWRpbmcgbm8gcm93IG9mIHdoaWNoIGNhbiBiZSBwaWNrZWQuXG4vLyBJdHMgd2lkdGggaXMgdGhlIG1lbnUncyBsZWFzdCwgc28gdGhhdCB0aGUgbmFtZXMgaW4gaXQgZml0IG9uIGEgbGluZS5cbmNvbnN0IEhlYWRpbmcgPSAoeyB0ZXh0IH06IHsgdGV4dDogc3RyaW5nIH0pID0+IChcbiAgPERyb3BEb3duTWVudUl0ZW1Sb3dcbiAgICAkY29sb3I9XCJ0ZXh0TXV0ZWRcIlxuICAgICRlbmFibGVkPXtmYWxzZX1cbiAgICAkZm9udD17eyBzaXplOiBcInNcIiB9fVxuICAgICRzdHlsZT17eyBtaW5XaWR0aDogMzAwIH19XG4gID5cbiAgICB7dGV4dH1cbiAgPC9Ecm9wRG93bk1lbnVJdGVtUm93PlxuKTtcblxuY29uc3QgTmV3V2luZG93SGVhZGluZyA9ICgpID0+IChcbiAgPEhlYWRpbmcgdGV4dD1cIk9wZW4gYSBwYWdlIGluIGEgbmV3IHdpbmRvdyBoZXJlXCIgLz5cbik7XG5cbi8vIEEgc2VhcmNoIG9mIGEgbWVudSwgYW4gaXRlbSBvZiB0aGUgbWVudSBvZiBpdHMgb3duLCBzbyB0aGF0IGVhY2ggcm93IGl0IG5hcnJvd3MgaXMgcG9pbnRlZCBhdCBhbmRcbi8vIGFycm93ZWQgdG8gYXMgYW55IHJvdyBvZiBhIG1lbnUgaXMuXG5jb25zdCBNZW51U2VhcmNoID0gKHtcbiAgdmFsdWUsXG4gIG9uQ2hhbmdlLFxuICBwbGFjZWhvbGRlcixcbiAgd2lkdGgsXG4gIGF1dG9Gb2N1cyA9IGZhbHNlLFxufToge1xuICB2YWx1ZTogc3RyaW5nO1xuICBvbkNoYW5nZTogKHRleHQ6IHN0cmluZykgPT4gdm9pZDtcbiAgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgd2lkdGg6IG51bWJlcjtcbiAgLy8gVGFraW5nIHRoZSBmb2N1cyBhcyBpdCBzaG93cywgZm9yIGEgbWVudSBvcGVuZWQgYnkgY2xpY2tpbmc7IG9uZSBvcGVuZWQgYnkgaG92ZXJpbmcgbGVhdmVzIHRoZVxuICAvLyBmb2N1cyB3aGVyZSBpdCBpcywgdGFraW5nIGl0IHdoZW4gYXJyb3dlZCBpbnRvLlxuICBhdXRvRm9jdXM/OiBib29sZWFuO1xufSkgPT4ge1xuICBjb25zdCBmb2N1c2FibGUgPSB1c2VGb2N1c2FibGVJdGVtKCk7XG5cbiAgcmV0dXJuIChcbiAgICA8RGl2XG4gICAgICAvLyBUaGUgc2VhcmNoIGlzIHRoZSBtZW51J3MgZmlyc3QgaXRlbSB0aGF0IGNhbiBiZSB1c2VkOiB0aGUgbWVudSBmb2N1c2VzIGl0IGFzIGl0IG9wZW5zLCBhbmRcbiAgICAgIC8vIGxlYXZlcyB0aGUgZm9jdXMgdGhlcmUgYXMgdGhlIHJvd3MgYmVsb3cgaXQgY29tZSBhbmQgZ28uXG4gICAgICAkZm9jdXNhYmxlPXtmb2N1c2FibGV9XG4gICAgICAvLyBGb2N1c2VkIGFzIHRoZSBtZW51J3MgaXRlbSwgaXQgaGFuZHMgdGhlIGZvY3VzIHRvIGl0cyBzZWFyY2ggYm94LlxuICAgICAgb25Gb2N1cz17KGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC50YXJnZXQgPT09IGV2ZW50LmN1cnJlbnRUYXJnZXQpIHtcbiAgICAgICAgICBldmVudC5jdXJyZW50VGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dFwiKT8uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgICRwYWRkaW5nPXt7IGhvcml6b250YWw6IFwieHNcIiwgdmVydGljYWw6IFwieHhzXCIgfX1cbiAgICAgICRzdHlsZT17eyB3aWR0aCB9fVxuICAgICAgLy8gVHlwaW5nIGlzIHRoZSBzZWFyY2gncyBhbG9uZTogdGhlIG1lbnUgd291bGQgdGFrZSBrZXlzIHRvIG1vdmUgYmV0d2VlbiBpdHMgcm93cywgYW5kIHRoZVxuICAgICAgLy8gZm9jdXMgd2l0aCB0aGVtLCBhZnRlciBldmVyeSBjaGFyYWN0ZXIuIEVzY2FwZSBhbmQgdGhlIGFycm93cyB1cCBhbmQgZG93biBzdGlsbCByZWFjaCBpdC5cbiAgICAgIG9uS2V5RG93bj17KGV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghW1wiRXNjYXBlXCIsIFwiQXJyb3dVcFwiLCBcIkFycm93RG93blwiLCBcIlRhYlwiXS5pbmNsdWRlcyhldmVudC5rZXkpKSB7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgPlxuICAgICAgPFNlYXJjaElucHV0XG4gICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfVxuICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgIGF1dG9Gb2N1cz17YXV0b0ZvY3VzfVxuICAgICAgLz5cbiAgICA8L0Rpdj5cbiAgKTtcbn07XG5cbi8vIEZpbmRzIGNsdXN0ZXJzLCBhbmQgTGVucydzIG93biBwYWdlcywgYnkgbmFtZS5cbmNvbnN0IENsdXN0ZXJTZWFyY2ggPSBvYnNlcnZlcigoKSA9PiB7XG4gIGNvbnN0IG1vZGVsID0gdXNlSW5qZWN0KHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUpKCk7XG5cbiAgLy8gQSBtZW51IG9wZW5lZCBhbmV3IHNlYXJjaGVzIGFuZXcuXG4gIHVzZUVmZmVjdCgoKSA9PiBtb2RlbC5zZXRDbHVzdGVyU2VhcmNoKFwiXCIpLCBbXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8TWVudVNlYXJjaFxuICAgICAgdmFsdWU9e21vZGVsLmNsdXN0ZXJTZWFyY2guZ2V0KCl9XG4gICAgICBvbkNoYW5nZT17KHRleHQpID0+IG1vZGVsLnNldENsdXN0ZXJTZWFyY2godGV4dCl9XG4gICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBjbHVzdGVycyBhbmQgcGFnZXNcIlxuICAgICAgd2lkdGg9ezQyMH1cbiAgICAgIGF1dG9Gb2N1c1xuICAgIC8+XG4gICk7XG59KTtcblxuLy8gRmluZHMgYSBjbHVzdGVyJ3MgcGFnZXMgYnkgbmFtZS5cbmNvbnN0IFBhZ2VTZWFyY2ggPSBvYnNlcnZlcigoKSA9PiB7XG4gIGNvbnN0IG1vZGVsID0gdXNlSW5qZWN0KHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUpKCk7XG5cbiAgLy8gQSBjbHVzdGVyJ3MgcGFnZXMgb3BlbmVkIGFuZXcgYXJlIHNlYXJjaGVkIGFuZXcuXG4gIHVzZUVmZmVjdCgoKSA9PiBtb2RlbC5zZXRQYWdlU2VhcmNoKFwiXCIpLCBbXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8TWVudVNlYXJjaFxuICAgICAgdmFsdWU9e21vZGVsLnBhZ2VTZWFyY2guZ2V0KCl9XG4gICAgICBvbkNoYW5nZT17KHRleHQpID0+IG1vZGVsLnNldFBhZ2VTZWFyY2godGV4dCl9XG4gICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBwYWdlc1wiXG4gICAgICB3aWR0aD17MjgwfVxuICAgIC8+XG4gICk7XG59KTtcblxuLy8gU2hvd24gb25seSB3aGlsZSBubyBwYWdlIG1hdGNoZXMgdGhlIHNlYXJjaC5cbmNvbnN0IE5vUGFnZXMgPSBvYnNlcnZlcigoKSA9PiB7XG4gIGNvbnN0IG1vZGVsID0gdXNlSW5qZWN0KHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUpKCk7XG5cbiAgcmV0dXJuIHJlc291cmNlTGlzdHMuc29tZSgobGlzdCkgPT5cbiAgICBpc01hdGNoKGxpc3QubGFiZWwsIG1vZGVsLnBhZ2VTZWFyY2guZ2V0KCkpLFxuICApID8gbnVsbCA6IChcbiAgICA8RHJvcERvd25NZW51SXRlbVJvdyAkY29sb3I9XCJ0ZXh0TXV0ZWRcIiAkZW5hYmxlZD17ZmFsc2V9PlxuICAgICAgTm8gcGFnZSBtYXRjaGVzXG4gICAgPC9Ecm9wRG93bk1lbnVJdGVtUm93PlxuICApO1xufSk7XG5cbi8vIFdoZXRoZXIgdGhlIGNsdXN0ZXIncyBuYW1lIGhhcyB3aGF0IGlzIHNlYXJjaGVkIGZvciBpbiBpdC5cbmNvbnN0IGlzTWF0Y2ggPSAobmFtZTogc3RyaW5nLCBzZWFyY2g6IHN0cmluZykgPT5cbiAgbmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaC50cmltKCkudG9Mb3dlckNhc2UoKSk7XG5cbi8vIFNob3duIG9ubHkgd2hpbGUgbm8gY2x1c3RlciBpcy5cbmNvbnN0IE5vQ2x1c3RlcnMgPSBvYnNlcnZlcigoKSA9PiB7XG4gIGNvbnN0IG1vZGVsID0gdXNlSW5qZWN0KHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUpKCk7XG4gIGNvbnN0IGNsdXN0ZXJzID0gbW9kZWwuY2x1c3RlcnMuZ2V0KCk7XG4gIGNvbnN0IHNlYXJjaCA9IG1vZGVsLmNsdXN0ZXJTZWFyY2guZ2V0KCk7XG5cbiAgaWYgKGNsdXN0ZXJzLnNvbWUoKGNsdXN0ZXIpID0+IGlzTWF0Y2goY2x1c3Rlci5uYW1lLmdldCgpLCBzZWFyY2gpKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8RHJvcERvd25NZW51SXRlbVJvdyAkY29sb3I9XCJ0ZXh0TXV0ZWRcIiAkZW5hYmxlZD17ZmFsc2V9PlxuICAgICAge2NsdXN0ZXJzLmxlbmd0aCA9PT0gMCA/IFwiTm8gY2x1c3RlcnNcIiA6IFwiTm8gY2x1c3RlciBtYXRjaGVzXCJ9XG4gICAgPC9Ecm9wRG93bk1lbnVJdGVtUm93PlxuICApO1xufSk7XG5cbmludGVyZmFjZSBDbHVzdGVyTG9va3Mge1xuICByZWFkb25seSBpc0Nvbm5lY3RlZDogYm9vbGVhbjtcbiAgLy8gVGhlIGNvbG91ciB0aGUgdXNlciB0ZWxscyB0aGUgY2x1c3RlciBhcGFydCBieTsgZW1wdHkgd2hlbiB0aGV5IHR1cm5lZCBjb2xvdXJzIG9mZi5cbiAgcmVhZG9ubHkgY29sb3I6IHN0cmluZztcbiAgLy8gVGhlIGltYWdlIHRoZSB1c2VyIGdhdmUgdGhlIGNsdXN0ZXIsIGlmIGFueS5cbiAgcmVhZG9ubHkgaWNvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vLyBUaGUgY2x1c3RlciBhcyBMZW5zIHNob3dzIGl0OiBpdHMgaW1hZ2UsIG9yIGVsc2UgdGhlIEt1YmVybmV0ZXMgY3Jlc3QgaW4gaXRzIGNvbG91ci5cbmNvbnN0IENsdXN0ZXJBdmF0YXIgPSAoe1xuICBjb2xvcixcbiAgaWNvbixcbn06IFBpY2s8Q2x1c3Rlckxvb2tzLCBcImNvbG9yXCIgfCBcImljb25cIj4pID0+XG4gIGljb24gPyAoXG4gICAgPEltZ1xuICAgICAgc3JjPXtpY29ufVxuICAgICAgYWx0PVwiXCJcbiAgICAgICRzdHlsZT17e1xuICAgICAgICB3aWR0aDogMjAsXG4gICAgICAgIGhlaWdodDogMjAsXG4gICAgICAgIGJvcmRlclJhZGl1czogNCxcbiAgICAgICAgb2JqZWN0Rml0OiBcImNvdmVyXCIsXG4gICAgICAgIGZsZXhTaHJpbms6IDAsXG4gICAgICB9fVxuICAgIC8+XG4gICkgOiAoXG4gICAgPEt1YmVybmV0ZXNUaWxsZXJDcmVzdEljb25cbiAgICAgICRzaXplPVwibVwiXG4gICAgICAkc3R5bGU9e2NvbG9yID8geyBjb2xvciB9IDogdW5kZWZpbmVkfVxuICAgIC8+XG4gICk7XG5cbi8vIExlbnMgaXMgY29ubmVjdGVkIHRvIHRoZSBjbHVzdGVyLlxuY29uc3QgQ29ubmVjdGVkRG90ID0gKCkgPT4gKFxuICA8U3BhblxuICAgIHJvbGU9XCJpbWdcIlxuICAgIGFyaWEtbGFiZWw9XCJDb25uZWN0ZWRcIlxuICAgICRiYWNrZ3JvdW5kQ29sb3I9XCJzdWNjZXNzXCJcbiAgICAvLyBBdCB0aGUgZmFyIGVuZCBvZiB0aGUgcm93LCBieSBpdHMgY2hldnJvbi5cbiAgICAkc3R5bGU9e3tcbiAgICAgIHdpZHRoOiA4LFxuICAgICAgaGVpZ2h0OiA4LFxuICAgICAgYm9yZGVyUmFkaXVzOiBcIjUwJVwiLFxuICAgICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcbiAgICAgIGZsZXhTaHJpbms6IDAsXG4gICAgICBtYXJnaW5MZWZ0OiBcImF1dG9cIixcbiAgICB9fVxuICAvPlxuKTtcblxuLy8gQSBjbHVzdGVyLCBzaG93biB3aGlsZSBpdHMgbmFtZSBtYXRjaGVzIHRoZSBzZWFyY2g6IGhpZGRlbiByYXRoZXIgdGhhbiB0YWtlbiBvdXQgb2YgdGhlIG1lbnUsIGFzXG4vLyB0aGUgbWVudSBmb2N1c2VzIGl0cyBmaXJzdCByb3cgd2hlbmV2ZXIgaXRzIHJvd3MgY2hhbmdlLCB3aGljaCB3b3VsZCB0YWtlIHRoZSBmb2N1cyBmcm9tIHRoZSBzZWFyY2guXG5jb25zdCBDbHVzdGVyUm93ID0gb2JzZXJ2ZXIoXG4gICh7XG4gICAgZGF0YSxcbiAgICBjbHVzdGVySWQsXG4gICAgY2x1c3Rlck5hbWUsXG4gICAgbG9va3MsXG4gIH06IHtcbiAgICBkYXRhOiBDZWxsO1xuICAgIGNsdXN0ZXJJZDogc3RyaW5nO1xuICAgIGNsdXN0ZXJOYW1lOiBzdHJpbmc7XG4gICAgbG9va3M6IENsdXN0ZXJMb29rcztcbiAgfSkgPT4ge1xuICAgIGNvbnN0IG1vZGVsID0gdXNlSW5qZWN0KHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUpKCk7XG5cbiAgICBpZiAoIWlzTWF0Y2goY2x1c3Rlck5hbWUsIG1vZGVsLmNsdXN0ZXJTZWFyY2guZ2V0KCkpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPERyb3BEb3duTWVudVN1Yk1lbnVcbiAgICAgICAgLy8gSXRzIHBhZ2VzIG9wZW4gYmVzaWRlIHRoZSB3aG9sZSByb3csIGF0IHRoZSBtZW51J3MgZWRnZSwgbGV2ZWwgd2l0aCB0aGUgcm93LlxuICAgICAgICAkc3R5bGU9e3sgYWxpZ25TZWxmOiBcInN0cmV0Y2hcIiwgYm94U2l6aW5nOiBcImJvcmRlci1ib3hcIiB9fVxuICAgICAgICBtZW51PXtkcm9wRG93bk1lbnUocmVzb3VyY2VMaXN0TWVudUtpbmQsIHtcbiAgICAgICAgICBkYXRhOiB7IC4uLmRhdGEsIGNsdXN0ZXJJZCwgY2x1c3Rlck5hbWUgfSxcbiAgICAgICAgICBwb3NpdGlvbjogXCJyaWdodCBzcGFuLWJvdHRvbVwiLFxuICAgICAgICB9KX1cbiAgICAgICAgdHJhaWxpbmc9e2xvb2tzLmlzQ29ubmVjdGVkID8gPENvbm5lY3RlZERvdCAvPiA6IHVuZGVmaW5lZH1cbiAgICAgID5cbiAgICAgICAgPENsdXN0ZXJBdmF0YXIgY29sb3I9e2xvb2tzLmNvbG9yfSBpY29uPXtsb29rcy5pY29ufSAvPlxuICAgICAgICB7Y2x1c3Rlck5hbWV9XG4gICAgICA8L0Ryb3BEb3duTWVudVN1Yk1lbnU+XG4gICAgKTtcbiAgfSxcbik7XG5cbi8vIFBhZ2VzIG9mIExlbnMgbm90IG9mIGEgY2x1c3RlciwgYWZ0ZXIgdGhlIGNsdXN0ZXJzOiB0aGUgc2VhcmNoIHN0YXlzIHRoZSBmaXJzdCBpdGVtLCBmb2N1c2VkIGFzXG4vLyB0aGUgbWVudSBvcGVucywgYW5kIG5hcnJvd3MgdGhlc2UgdG9vLlxuY29uc3QgbGVuc1BhZ2VzID0gW1xuICB7XG4gICAgbGFiZWw6IFwiUHJlZmVyZW5jZXNcIixcbiAgICBwbGFjZTogKCkgPT4gcGxhY2VPZihwcmVmZXJlbmNlc05hdmlnYXRpb25UYXJnZXRLaW5kLCB7fSksXG4gIH0sXG5dIGFzIGNvbnN0O1xuXG5jb25zdCBMZW5zUGFnZXNIZWFkaW5nID0gb2JzZXJ2ZXIoKCkgPT4ge1xuICBjb25zdCBtb2RlbCA9IHVzZUluamVjdCh3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlKSgpO1xuXG4gIHJldHVybiBsZW5zUGFnZXMuc29tZSgocGFnZSkgPT5cbiAgICBpc01hdGNoKHBhZ2UubGFiZWwsIG1vZGVsLmNsdXN0ZXJTZWFyY2guZ2V0KCkpLFxuICApID8gKFxuICAgIDxIZWFkaW5nIHRleHQ9XCJMZW5zXCIgLz5cbiAgKSA6IG51bGw7XG59KTtcblxuY29uc3QgTGVuc1BhZ2VSb3cgPSBvYnNlcnZlcihcbiAgKHsgZGF0YSwgcGFnZSB9OiB7IGRhdGE6IENlbGw7IHBhZ2U6ICh0eXBlb2YgbGVuc1BhZ2VzKVtudW1iZXJdIH0pID0+IHtcbiAgICBjb25zdCBtb2RlbCA9IHVzZUluamVjdCh3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlKSgpO1xuICAgIGNvbnN0IGNsb3NlRHJvcERvd25NZW51ID0gdXNlQ2xvc2VEcm9wRG93bk1lbnUoKTtcblxuICAgIGlmICghaXNNYXRjaChwYWdlLmxhYmVsLCBtb2RlbC5jbHVzdGVyU2VhcmNoLmdldCgpKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxEcm9wRG93bk1lbnVJdGVtUm93XG4gICAgICAgICRvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgY2xvc2VEcm9wRG93bk1lbnUoKTtcbiAgICAgICAgICB2b2lkIG1vZGVsLm9wZW5JbkNlbGwocGFnZS5wbGFjZSgpLCBkYXRhLCBwYWdlLmxhYmVsKTtcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAge3BhZ2UubGFiZWx9XG4gICAgICA8L0Ryb3BEb3duTWVudUl0ZW1Sb3c+XG4gICAgKTtcbiAgfSxcbik7XG5cbmV4cG9ydCBjb25zdCBsZW5zUGFnZXNJdGVtc0J1bmNoID0gZ2V0RHJvcERvd25NZW51SXRlbXNJbmplY3RhYmxlQnVuY2goe1xuICBpZDogXCJ3aW5kb3ctbWFuYWdlci1uZXctd2luZG93LWxlbnMtcGFnZXNcIixcbiAga2luZDogbmV3V2luZG93TWVudUtpbmQsXG5cbiAgaW5zdGFudGlhdGU6ICgpID0+ICgpID0+IFtcbiAgICB7XG4gICAgICBpZDogXCJ3aW5kb3ctbWFuYWdlci1uZXctd2luZG93LWxlbnMtcGFnZXMtaGVhZGluZ1wiLFxuICAgICAgb3JkZXJOdW1iZXI6IDEwXzAwMCxcbiAgICAgIENvbXBvbmVudDogTGVuc1BhZ2VzSGVhZGluZyxcbiAgICB9LFxuICAgIC4uLmxlbnNQYWdlcy5tYXAoKHBhZ2UsIGluZGV4KSA9PiAoe1xuICAgICAgaWQ6IGB3aW5kb3ctbWFuYWdlci1uZXctd2luZG93LWxlbnMtcGFnZS0ke2luZGV4fWAsXG4gICAgICBvcmRlck51bWJlcjogMTBfMDAxICsgaW5kZXgsXG4gICAgICBDb21wb25lbnQ6IExlbnNQYWdlUm93LFxuICAgICAgY29tcG9uZW50UHJvcHM6IHsgcGFnZSB9LFxuICAgIH0pKSxcbiAgXSxcbn0pO1xuXG5leHBvcnQgY29uc3QgY2x1c3Rlckl0ZW1zQnVuY2ggPSBnZXREcm9wRG93bk1lbnVJdGVtc0luamVjdGFibGVCdW5jaCh7XG4gIGlkOiBcIndpbmRvdy1tYW5hZ2VyLW5ldy13aW5kb3ctY2x1c3RlcnNcIixcbiAga2luZDogbmV3V2luZG93TWVudUtpbmQsXG5cbiAgaW5zdGFudGlhdGU6IChkaSkgPT4ge1xuICAgIGNvbnN0IG1vZGVsID0gZGkuaW5qZWN0KHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUpKCk7XG5cbiAgICByZXR1cm4gKCkgPT5cbiAgICAgIGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgLy8gRXZlcnkgY2x1c3Rlciwgd2hhdGV2ZXIgaXMgc2VhcmNoZWQgZm9yOiB0aGUgcm93cyBoaWRlIHRoZW1zZWx2ZXMuXG4gICAgICAgIGNvbnN0IGNsdXN0ZXJzID0gbW9kZWwuY2x1c3RlcnNcbiAgICAgICAgICAuZ2V0KClcbiAgICAgICAgICAubWFwKChjbHVzdGVyKSA9PiAoe1xuICAgICAgICAgICAgaWQ6IGNsdXN0ZXIuaWQsXG4gICAgICAgICAgICBuYW1lOiBjbHVzdGVyLm5hbWUuZ2V0KCksXG4gICAgICAgICAgICBsb29rczoge1xuICAgICAgICAgICAgICBpc0Nvbm5lY3RlZDogY2x1c3Rlci5pc0Nvbm5lY3RlZC5nZXQoKSxcbiAgICAgICAgICAgICAgY29sb3I6IGNsdXN0ZXIuY29sb3IuZ2V0KCksXG4gICAgICAgICAgICAgIGljb246IGNsdXN0ZXIuaWNvbi5nZXQoKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSkpXG4gICAgICAgICAgLy8gVGhvc2UgY29ubmVjdGVkIGZpcnN0LCBhcyB0aGUgbGlrZWxpZXN0IHRvIGJlIG9wZW5lZC5cbiAgICAgICAgICAuc29ydChcbiAgICAgICAgICAgIChhLCBiKSA9PlxuICAgICAgICAgICAgICBOdW1iZXIoYi5sb29rcy5pc0Nvbm5lY3RlZCkgLSBOdW1iZXIoYS5sb29rcy5pc0Nvbm5lY3RlZCkgfHxcbiAgICAgICAgICAgICAgYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6IFwid2luZG93LW1hbmFnZXItbmV3LXdpbmRvdy1uby1jbHVzdGVyc1wiLFxuICAgICAgICAgICAgb3JkZXJOdW1iZXI6IDIsXG4gICAgICAgICAgICBDb21wb25lbnQ6IE5vQ2x1c3RlcnMsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5jbHVzdGVycy5tYXAoKGNsdXN0ZXIsIGluZGV4KSA9PiAoe1xuICAgICAgICAgICAgaWQ6IGB3aW5kb3ctbWFuYWdlci1uZXctd2luZG93LWNsdXN0ZXItJHtjbHVzdGVyLmlkfWAsXG4gICAgICAgICAgICBvcmRlck51bWJlcjogMTAgKyBpbmRleCxcbiAgICAgICAgICAgIENvbXBvbmVudDogQ2x1c3RlclJvdyxcbiAgICAgICAgICAgIGNvbXBvbmVudFByb3BzOiB7XG4gICAgICAgICAgICAgIGNsdXN0ZXJJZDogY2x1c3Rlci5pZCxcbiAgICAgICAgICAgICAgY2x1c3Rlck5hbWU6IGNsdXN0ZXIubmFtZSxcbiAgICAgICAgICAgICAgbG9va3M6IGNsdXN0ZXIubG9va3MsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgXTtcbiAgICAgIH0pO1xuICB9LFxufSk7XG5cbi8vIFRoZSBoZWFkaW5nIGFuZCB0aGUgc2VhcmNoLCBpdGVtcyBvZiB0aGVpciBvd24gdGhhdCBzdGF5IGFzIHRoZXkgYXJlIHdoaWxlIHRoZSBjbHVzdGVycyBiZWxvd1xuLy8gdGhlbSBmb2xsb3cgd2hhdCBpcyB0eXBlZDogcmVidWlsdCB3aXRoIHRoZW0sIHRoZSBzZWFyY2ggd291bGQgbG9zZSB0aGUgZm9jdXMgYXQgZWFjaCBrZXkuXG5leHBvcnQgY29uc3QgbmV3V2luZG93SGVhZGluZ0J1bmNoID0gZ2V0RHJvcERvd25NZW51SXRlbUluamVjdGFibGVCdW5jaCh7XG4gIGlkOiBcIndpbmRvdy1tYW5hZ2VyLW5ldy13aW5kb3ctaGVhZGluZ1wiLFxuICBraW5kOiBuZXdXaW5kb3dNZW51S2luZCxcbiAgb3JkZXJOdW1iZXI6IDAsXG4gIENvbXBvbmVudDogTmV3V2luZG93SGVhZGluZyxcbn0pO1xuXG5leHBvcnQgY29uc3QgY2x1c3RlclNlYXJjaEJ1bmNoID0gZ2V0RHJvcERvd25NZW51SXRlbUluamVjdGFibGVCdW5jaCh7XG4gIGlkOiBcIndpbmRvdy1tYW5hZ2VyLW5ldy13aW5kb3ctc2VhcmNoXCIsXG4gIGtpbmQ6IG5ld1dpbmRvd01lbnVLaW5kLFxuICBvcmRlck51bWJlcjogMSxcbiAgQ29tcG9uZW50OiBDbHVzdGVyU2VhcmNoLFxufSk7XG5cbmNvbnN0IFJlc291cmNlTGlzdHNIZWFkaW5nID0gKHsgZGF0YSB9OiB7IGRhdGE6IENsdXN0ZXJDZWxsIH0pID0+IChcbiAgPEhlYWRpbmcgdGV4dD17YFBhZ2VzIG9mICR7ZGF0YS5jbHVzdGVyTmFtZX1gfSAvPlxuKTtcblxuLy8gRWFjaCBsaXN0IHdpdGggaXRzIGtpbmQncyBpY29uLCBtYWRlIG9uY2Ugc28gdGhhdCB0aGUgcm93cyBrZWVwIHRoZSBzYW1lIGNvbXBvbmVudC5cbmNvbnN0IGljb25zT2ZMaXN0cyA9IG5ldyBNYXAoXG4gIHJlc291cmNlTGlzdHMubWFwKChsaXN0KSA9PiBbXG4gICAgbGlzdCxcbiAgICBsaXN0LmtpbmRcbiAgICAgID8gLy8gVGhlIHJvdyBuYW1lcyB0aGUga2luZCBhbHJlYWR5OiBubyB0b29sdGlwIHRvIHNheSBpdCBhZ2Fpbi5cbiAgICAgICAgKHByb3BzOiBJY29uUHJvcHMpID0+IChcbiAgICAgICAgICA8S3ViZVJlc291cmNlS2luZEljb25cbiAgICAgICAgICAgIGtpbmQ9e2xpc3Qua2luZCF9XG4gICAgICAgICAgICB7Li4ucHJvcHN9XG4gICAgICAgICAgICAkdG9vbHRpcD17dW5kZWZpbmVkfVxuICAgICAgICAgIC8+XG4gICAgICAgIClcbiAgICAgIDogdW5kZWZpbmVkLFxuICBdKSxcbik7XG5cbmNvbnN0IFJlc291cmNlTGlzdFJvdyA9IG9ic2VydmVyKFxuICAoeyBkYXRhLCBsaXN0IH06IHsgZGF0YTogQ2x1c3RlckNlbGw7IGxpc3Q6IFJlc291cmNlTGlzdCB9KSA9PiB7XG4gICAgY29uc3QgbW9kZWwgPSB1c2VJbmplY3Qod2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSkoKTtcbiAgICBjb25zdCBjbG9zZURyb3BEb3duTWVudSA9IHVzZUNsb3NlRHJvcERvd25NZW51KCk7XG4gICAgY29uc3QgY2x1c3RlciA9IG1vZGVsLmNsdXN0ZXJzLmdldCgpLmZpbmQoKGl0KSA9PiBpdC5pZCA9PT0gZGF0YS5jbHVzdGVySWQpO1xuICAgIGNvbnN0IGNvbG9yID0gY2x1c3Rlcj8uY29sb3IuZ2V0KCkgPz8gXCJcIjtcbiAgICBjb25zdCBpY29uID0gY2x1c3Rlcj8uaWNvbi5nZXQoKTtcblxuICAgIC8vIEhpZGRlbiByYXRoZXIgdGhhbiB0YWtlbiBvdXQgb2YgdGhlIG1lbnUgd2hpbGUgaXQgZG9lcyBub3QgbWF0Y2ggdGhlIHNlYXJjaCwgd2hpY2ggd291bGQgdGFrZVxuICAgIC8vIHRoZSBmb2N1cyBmcm9tIHRoZSBzZWFyY2guXG4gICAgY29uc3QgbWF0Y2hlcyA9IGlzTWF0Y2gobGlzdC5sYWJlbCwgbW9kZWwucGFnZVNlYXJjaC5nZXQoKSk7XG5cbiAgICAvLyBUaGUgb3ZlcnZpZXcsIG9mIG5vIGtpbmQsIHNob3dzIHRoZSBjbHVzdGVyIGFzIHRoZSBtZW51IGJlZm9yZSBzaG93ZWQgaXQuXG4gICAgY29uc3QgQ2x1c3Rlckljb24gPSB1c2VNZW1vKFxuICAgICAgKCkgPT4gKCkgPT4gPENsdXN0ZXJBdmF0YXIgY29sb3I9e2NvbG9yfSBpY29uPXtpY29ufSAvPixcbiAgICAgIFtjb2xvciwgaWNvbl0sXG4gICAgKTtcblxuICAgIGlmICghbWF0Y2hlcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxEcm9wRG93bk1lbnVJdGVtUm93XG4gICAgICAgIEljb249e2ljb25zT2ZMaXN0cy5nZXQobGlzdCkgPz8gQ2x1c3Rlckljb259XG4gICAgICAgICRvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgY2xvc2VEcm9wRG93bk1lbnUoKTtcbiAgICAgICAgICAvLyBOYW1lZCBhcyBMZW5zIG5hbWVzIHN1Y2ggYSB3aW5kb3csIHVudGlsIGl0IHNob3dzIGFuZCBuYW1lcyBpdHNlbGYuXG4gICAgICAgICAgdm9pZCBtb2RlbC5vcGVuSW5DZWxsKFxuICAgICAgICAgICAgbGlzdC5wbGFjZUZvcihkYXRhLmNsdXN0ZXJJZCksXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgYCR7bGlzdC5sYWJlbH0gLSAke2RhdGEuY2x1c3Rlck5hbWV9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICB7bGlzdC5sYWJlbH1cbiAgICAgIDwvRHJvcERvd25NZW51SXRlbVJvdz5cbiAgICApO1xuICB9LFxuKTtcblxuZXhwb3J0IGNvbnN0IHJlc291cmNlTGlzdEl0ZW1zQnVuY2ggPSBnZXREcm9wRG93bk1lbnVJdGVtc0luamVjdGFibGVCdW5jaCh7XG4gIGlkOiBcIndpbmRvdy1tYW5hZ2VyLW5ldy13aW5kb3ctcmVzb3VyY2UtbGlzdHNcIixcbiAga2luZDogcmVzb3VyY2VMaXN0TWVudUtpbmQsXG5cbiAgaW5zdGFudGlhdGU6ICgpID0+ICgpID0+IFtcbiAgICB7XG4gICAgICBpZDogXCJ3aW5kb3ctbWFuYWdlci1uZXctd2luZG93LXJlc291cmNlLWxpc3RzLWhlYWRpbmdcIixcbiAgICAgIG9yZGVyTnVtYmVyOiAwLFxuICAgICAgQ29tcG9uZW50OiBSZXNvdXJjZUxpc3RzSGVhZGluZyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiBcIndpbmRvdy1tYW5hZ2VyLW5ldy13aW5kb3ctcmVzb3VyY2UtbGlzdHMtc2VhcmNoXCIsXG4gICAgICBvcmRlck51bWJlcjogMSxcbiAgICAgIENvbXBvbmVudDogUGFnZVNlYXJjaCxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiBcIndpbmRvdy1tYW5hZ2VyLW5ldy13aW5kb3ctcmVzb3VyY2UtbGlzdHMtbm9uZVwiLFxuICAgICAgb3JkZXJOdW1iZXI6IDIsXG4gICAgICBDb21wb25lbnQ6IE5vUGFnZXMsXG4gICAgfSxcbiAgICAuLi5yZXNvdXJjZUxpc3RzLm1hcCgobGlzdCwgaW5kZXgpID0+ICh7XG4gICAgICBpZDogYHdpbmRvdy1tYW5hZ2VyLW5ldy13aW5kb3ctcmVzb3VyY2UtbGlzdC0ke2luZGV4fWAsXG4gICAgICBvcmRlck51bWJlcjogMTAgKyBpbmRleCxcbiAgICAgIENvbXBvbmVudDogUmVzb3VyY2VMaXN0Um93LFxuICAgICAgY29tcG9uZW50UHJvcHM6IHsgbGlzdCB9LFxuICAgIH0pKSxcbiAgXSxcbn0pO1xuXG4vLyBBIGNsdXN0ZXIncyBwYWdlcyBhcmUgbW9yZSB0aGFuIGEgd2luZG93IGNhbiBiZSB0YWxsLCBhbmQgYSBtZW51IHRhbGxlciB0aGFuIHRoZSByb29tIGJlc2lkZSBpdHNcbi8vIHJvdyBpcyBwbGFjZWQgd2hlcmV2ZXIgaXQgZml0cyBpbnN0ZWFkLiBMZW5zJ3Mgb3duIHBhbmVsLCBoYWxmIHRoZSB3aW5kb3cgdGFsbCBhbmQgc2Nyb2xsaW5nLFxuLy8gYWx3YXlzIGZpdHMgYmVzaWRlIHRoZSByb3csIGJlbG93IGl0IG9yIGFib3ZlLlxuY29uc3QgUmVzb3VyY2VMaXN0TWVudUNvbnRhaW5lciA9ICh7XG4gIGNoaWxkcmVuLFxuICBpdGVtczogX2l0ZW1zLFxuICAuLi5tZW51UHJvcHNcbn06IERyb3BEb3duTWVudUNvbnRhaW5lclByb3BzKSA9PiAoXG4gIDxEZWZhdWx0RHJvcERvd25NZW51Q29udGFpbmVyXG4gICAgey4uLm1lbnVQcm9wc31cbiAgICAvLyBPZiB0aGUgb25lIGhlaWdodCBhcyBpdHMgc2VhcmNoIGhpZGVzIHBhZ2VzOiBvcGVuZWQgdXB3YXJkcywgZnJvbSBpdHMgcm93J3MgYm90dG9tLCBhIHBhbmVsXG4gICAgLy8gZ3Jvd2luZyBzaG9ydGVyIHdvdWxkIG1vdmUgaXRzIHNlYXJjaCBvdXQgZnJvbSB1bmRlciB0aGUgcG9pbnRlciwgYW5kIGNsb3NlLiBTY3JvbGxpbmcgdXAgYW5kXG4gICAgLy8gZG93biBvbmx5OiB3aGF0IHJlYWNoZXMgcGFzdCB0aGUgcGFuZWwncyBzaWRlcywgYXMgdGhlIHN0cmlwIHRoYXQga2VlcHMgYSBwb2ludGVyIGNyb3NzaW5nIHRoZVxuICAgIC8vIGdhcCB0byBpdCBvbiBpdCwgaXMgbm8gcmVhc29uIHRvIHNjcm9sbCBzaWRld2F5cy5cbiAgICAkc3R5bGU9e3tcbiAgICAgIGhlaWdodDogXCI1MHZoXCIsXG4gICAgICBib3hTaXppbmc6IFwiYm9yZGVyLWJveFwiLFxuICAgICAgb3ZlcmZsb3dZOiBcImF1dG9cIixcbiAgICAgIG92ZXJmbG93WDogXCJoaWRkZW5cIixcbiAgICB9fVxuICA+XG4gICAge2NoaWxkcmVufVxuICA8L0RlZmF1bHREcm9wRG93bk1lbnVDb250YWluZXI+XG4pO1xuXG5leHBvcnQgY29uc3QgcmVzb3VyY2VMaXN0TWVudUNvbnRhaW5lckluamVjdGFibGUgPSBnZXRJbmplY3RhYmxlMih7XG4gIGlkOiBcIndpbmRvdy1tYW5hZ2VyLXJlc291cmNlLWxpc3QtbWVudS1jb250YWluZXJcIixcbiAgaW5zdGFudGlhdGU6ICgpID0+ICgpID0+IFJlc291cmNlTGlzdE1lbnVDb250YWluZXIsXG4gIGluamVjdGlvblRva2VuOlxuICAgIGRyb3BEb3duTWVudUNvbnRhaW5lckNvbXBvbmVudEluamVjdGlvblRva2VuLmZvcihyZXNvdXJjZUxpc3RNZW51S2luZCksXG59KTtcbiIsICJpbXBvcnQge1xuICBjbHVzdGVyUm9sZXNOYXZpZ2F0aW9uVGFyZ2V0S2luZCxcbiAgY29uZmlnTWFwc05hdmlnYXRpb25UYXJnZXRLaW5kLFxuICBjcm9uSm9ic05hdmlnYXRpb25UYXJnZXRLaW5kLFxuICBjdXN0b21SZXNvdXJjZURlZmluaXRpb25zTmF2aWdhdGlvblRhcmdldEtpbmQsXG4gIGRhZW1vblNldHNOYXZpZ2F0aW9uVGFyZ2V0S2luZCxcbiAgZGVwbG95bWVudHNOYXZpZ2F0aW9uVGFyZ2V0S2luZCxcbiAgaG9yaXpvbnRhbFBvZEF1dG9zY2FsZXJzTmF2aWdhdGlvblRhcmdldEtpbmQsXG4gIGluZ3Jlc3Nlc05hdmlnYXRpb25UYXJnZXRLaW5kLFxuICBqb2JzTmF2aWdhdGlvblRhcmdldEtpbmQsXG4gIG5hbWVzcGFjZXNOYXZpZ2F0aW9uVGFyZ2V0S2luZCxcbiAgbmV0d29ya1BvbGljaWVzTmF2aWdhdGlvblRhcmdldEtpbmQsXG4gIG5vZGVzTmF2aWdhdGlvblRhcmdldEtpbmQsXG4gIHBlcnNpc3RlbnRWb2x1bWVDbGFpbXNOYXZpZ2F0aW9uVGFyZ2V0S2luZCxcbiAgcGVyc2lzdGVudFZvbHVtZXNOYXZpZ2F0aW9uVGFyZ2V0S2luZCxcbiAgcG9kc05hdmlnYXRpb25UYXJnZXRLaW5kLFxuICByZXBsaWNhU2V0c05hdmlnYXRpb25UYXJnZXRLaW5kLFxuICByb2xlQmluZGluZ3NOYXZpZ2F0aW9uVGFyZ2V0S2luZCxcbiAgcm9sZXNOYXZpZ2F0aW9uVGFyZ2V0S2luZCxcbiAgc2VjcmV0c05hdmlnYXRpb25UYXJnZXRLaW5kLFxuICBzZXJ2aWNlQWNjb3VudHNOYXZpZ2F0aW9uVGFyZ2V0S2luZCxcbiAgc2VydmljZXNOYXZpZ2F0aW9uVGFyZ2V0S2luZCxcbiAgc3RhdGVmdWxTZXRzTmF2aWdhdGlvblRhcmdldEtpbmQsXG4gIHN0b3JhZ2VDbGFzc2VzTmF2aWdhdGlvblRhcmdldEtpbmQsXG59IGZyb20gXCJAazhzbGVucy9rdWJlcm5ldGVzLXJlc291cmNlcy1jb250cmFjdHNcIjtcbmltcG9ydCB7IGNsdXN0ZXJPdmVydmlld05hdmlnYXRpb25UYXJnZXRLaW5kIH0gZnJvbSBcIkBrOHNsZW5zL2NsdXN0ZXItY29udHJhY3RzXCI7XG5pbXBvcnQgeyBwbGFjZU9mIH0gZnJvbSBcIkBrOHNsZW5zL25hdmlnYXRpb24tY29udHJhY3RzXCI7XG5cbi8vIFRoZSBwYWdlcyBvZiBhIGNsdXN0ZXIgYSB3aW5kb3cgY2FuIGJlIG9wZW5lZCBvbjogaXRzIG92ZXJ2aWV3LCBhbmQgdGhlIGxpc3RzIG9mIGl0cyBrdWJlXG4vLyByZXNvdXJjZXMsIGluIHRoZSBvcmRlciBMZW5zJ3MgbmF2aWdhdG9yIGhhcyB0aGVtLCB3aXRoIHRoZSBraW5kIGVhY2ggbGlzdHMsIHRoZSBvdmVydmlldyBub25lLlxuLy8gRWFjaCB0YWtlcyB0aGUgY2x1c3RlciBhbG9uZS5cbmNvbnN0IGxpc3RzID0gW1xuICBbXCJPdmVydmlld1wiLCBjbHVzdGVyT3ZlcnZpZXdOYXZpZ2F0aW9uVGFyZ2V0S2luZCwgdW5kZWZpbmVkXSxcbiAgW1wiUG9kc1wiLCBwb2RzTmF2aWdhdGlvblRhcmdldEtpbmQsIFwiUG9kXCJdLFxuICBbXCJEZXBsb3ltZW50c1wiLCBkZXBsb3ltZW50c05hdmlnYXRpb25UYXJnZXRLaW5kLCBcIkRlcGxveW1lbnRcIl0sXG4gIFtcIkRhZW1vbiBTZXRzXCIsIGRhZW1vblNldHNOYXZpZ2F0aW9uVGFyZ2V0S2luZCwgXCJEYWVtb25TZXRcIl0sXG4gIFtcIlN0YXRlZnVsIFNldHNcIiwgc3RhdGVmdWxTZXRzTmF2aWdhdGlvblRhcmdldEtpbmQsIFwiU3RhdGVmdWxTZXRcIl0sXG4gIFtcIlJlcGxpY2EgU2V0c1wiLCByZXBsaWNhU2V0c05hdmlnYXRpb25UYXJnZXRLaW5kLCBcIlJlcGxpY2FTZXRcIl0sXG4gIFtcIkpvYnNcIiwgam9ic05hdmlnYXRpb25UYXJnZXRLaW5kLCBcIkpvYlwiXSxcbiAgW1wiQ3JvbiBKb2JzXCIsIGNyb25Kb2JzTmF2aWdhdGlvblRhcmdldEtpbmQsIFwiQ3JvbkpvYlwiXSxcbiAgW1wiQ29uZmlnIE1hcHNcIiwgY29uZmlnTWFwc05hdmlnYXRpb25UYXJnZXRLaW5kLCBcIkNvbmZpZ01hcFwiXSxcbiAgW1wiU2VjcmV0c1wiLCBzZWNyZXRzTmF2aWdhdGlvblRhcmdldEtpbmQsIFwiU2VjcmV0XCJdLFxuICBbXG4gICAgXCJIb3Jpem9udGFsIFBvZCBBdXRvc2NhbGVyc1wiLFxuICAgIGhvcml6b250YWxQb2RBdXRvc2NhbGVyc05hdmlnYXRpb25UYXJnZXRLaW5kLFxuICAgIFwiSG9yaXpvbnRhbFBvZEF1dG9zY2FsZXJcIixcbiAgXSxcbiAgW1wiU2VydmljZXNcIiwgc2VydmljZXNOYXZpZ2F0aW9uVGFyZ2V0S2luZCwgXCJTZXJ2aWNlXCJdLFxuICBbXCJJbmdyZXNzZXNcIiwgaW5ncmVzc2VzTmF2aWdhdGlvblRhcmdldEtpbmQsIFwiSW5ncmVzc1wiXSxcbiAgW1wiTmV0d29yayBQb2xpY2llc1wiLCBuZXR3b3JrUG9saWNpZXNOYXZpZ2F0aW9uVGFyZ2V0S2luZCwgXCJOZXR3b3JrUG9saWN5XCJdLFxuICBbXG4gICAgXCJQZXJzaXN0ZW50IFZvbHVtZSBDbGFpbXNcIixcbiAgICBwZXJzaXN0ZW50Vm9sdW1lQ2xhaW1zTmF2aWdhdGlvblRhcmdldEtpbmQsXG4gICAgXCJQZXJzaXN0ZW50Vm9sdW1lQ2xhaW1cIixcbiAgXSxcbiAgW1xuICAgIFwiUGVyc2lzdGVudCBWb2x1bWVzXCIsXG4gICAgcGVyc2lzdGVudFZvbHVtZXNOYXZpZ2F0aW9uVGFyZ2V0S2luZCxcbiAgICBcIlBlcnNpc3RlbnRWb2x1bWVcIixcbiAgXSxcbiAgW1wiU3RvcmFnZSBDbGFzc2VzXCIsIHN0b3JhZ2VDbGFzc2VzTmF2aWdhdGlvblRhcmdldEtpbmQsIFwiU3RvcmFnZUNsYXNzXCJdLFxuICBbXCJOb2Rlc1wiLCBub2Rlc05hdmlnYXRpb25UYXJnZXRLaW5kLCBcIk5vZGVcIl0sXG4gIFtcIk5hbWVzcGFjZXNcIiwgbmFtZXNwYWNlc05hdmlnYXRpb25UYXJnZXRLaW5kLCBcIk5hbWVzcGFjZVwiXSxcbiAgW1wiU2VydmljZSBBY2NvdW50c1wiLCBzZXJ2aWNlQWNjb3VudHNOYXZpZ2F0aW9uVGFyZ2V0S2luZCwgXCJTZXJ2aWNlQWNjb3VudFwiXSxcbiAgW1wiUm9sZXNcIiwgcm9sZXNOYXZpZ2F0aW9uVGFyZ2V0S2luZCwgXCJSb2xlXCJdLFxuICBbXCJSb2xlIEJpbmRpbmdzXCIsIHJvbGVCaW5kaW5nc05hdmlnYXRpb25UYXJnZXRLaW5kLCBcIlJvbGVCaW5kaW5nXCJdLFxuICBbXCJDbHVzdGVyIFJvbGVzXCIsIGNsdXN0ZXJSb2xlc05hdmlnYXRpb25UYXJnZXRLaW5kLCBcIkNsdXN0ZXJSb2xlXCJdLFxuICBbXG4gICAgXCJDdXN0b20gUmVzb3VyY2UgRGVmaW5pdGlvbnNcIixcbiAgICBjdXN0b21SZXNvdXJjZURlZmluaXRpb25zTmF2aWdhdGlvblRhcmdldEtpbmQsXG4gICAgXCJDdXN0b21SZXNvdXJjZURlZmluaXRpb25cIixcbiAgXSxcbl0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VMaXN0IHtcbiAgcmVhZG9ubHkgbGFiZWw6IHN0cmluZztcbiAgLy8gVGhlIGtpbmQgYXMgS3ViZXJuZXRlcyBuYW1lcyBpdCwgXCJQb2RcIiBzYXk7IG5vbmUgZm9yIHRoZSBvdmVydmlldy5cbiAgcmVhZG9ubHkga2luZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBwbGFjZUZvcjogKGNsdXN0ZXJJZDogc3RyaW5nKSA9PiBSZXR1cm5UeXBlPHR5cGVvZiBwbGFjZU9mPjtcbn1cblxuZXhwb3J0IGNvbnN0IHJlc291cmNlTGlzdHM6IHJlYWRvbmx5IFJlc291cmNlTGlzdFtdID0gbGlzdHMubWFwKFxuICAoW2xhYmVsLCB0YXJnZXQsIGtpbmRdKSA9PiAoe1xuICAgIGxhYmVsLFxuICAgIGtpbmQsXG4gICAgcGxhY2VGb3I6IChjbHVzdGVySWQ6IHN0cmluZykgPT5cbiAgICAgIHBsYWNlT2YodGFyZ2V0IGFzIHR5cGVvZiBwb2RzTmF2aWdhdGlvblRhcmdldEtpbmQsIHsgY2x1c3RlcklkIH0pLFxuICB9KSxcbik7XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0YWJsZTIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHtcbiAgaXNBcHBsaWNhdGlvbldpbmRvdyxcbiAgdHlwZSBXaW5kb3dJZCxcbn0gZnJvbSBcIkBrOHNsZW5zL21lc3NhZ2luZy1jb250cmFjdHNcIjtcbmltcG9ydCB7IG9wZW5Nb2RhbEluamVjdGlvblRva2VuIH0gZnJvbSBcIkBrOHNsZW5zL21vZGFsLWNvbnRyYWN0c1wiO1xuaW1wb3J0IHtcbiAgY2FuUmVvcGVuV2luZG93UmVhY3RpdmVJbmplY3Rpb25Ub2tlbixcbiAgZGlzcGxheVJlY29yZHNSZWFjdGl2ZUluamVjdGlvblRva2VuLFxuICBmb2N1c1dpbmRvd0luamVjdGlvblRva2VuLFxuICByZW9wZW5XaW5kb3dJbmplY3Rpb25Ub2tlbixcbiAgd2luZG93UmVjb3Jkc1JlYWN0aXZlSW5qZWN0aW9uVG9rZW4sXG4gIHdpbmRvd1JlY29yZE9mSW5qZWN0aW9uVG9rZW4sXG4gIHNldFdpbmRvd0JvdW5kc0luamVjdGlvblRva2VuLFxuICB0eXBlIFdpbmRvd0JvdW5kcyxcbiAgdHlwZSBXaW5kb3dSZWNvcmQsXG4gIHR5cGUgV2luZG93UmVvcGVuaW5nLFxuICB0eXBlIFdpbmRvd1Jlb3BlbmluZ1BsYWNlbWVudCxcbn0gZnJvbSBcIkBrOHNsZW5zL3dpbmRvdy1sYXlvdXQtY29udHJhY3RzXCI7XG5pbXBvcnQge1xuICBhbGxDbHVzdGVyUmVjb3Jkc1JlYWN0aXZlSW5qZWN0aW9uVG9rZW4sXG4gIHR5cGUgQ2x1c3RlclJlY29yZCxcbn0gZnJvbSBcIkBrOHNsZW5zL2NsdXN0ZXItY29udHJhY3RzXCI7XG5pbXBvcnQgdHlwZSB7IFBsYWNlIH0gZnJvbSBcIkBrOHNsZW5zL25hdmlnYXRpb24tY29udHJhY3RzXCI7XG5pbXBvcnQge1xuICBjbG9zZUFueVN1YldpbmRvd0luamVjdGlvblRva2VuLFxuICBnZXRTdWJXaW5kb3dLaW5kSWQsXG4gIHR5cGUgTGlzdGVkU3ViV2luZG93LFxuICBvcGVuU3ViV2luZG93SW5qZWN0aW9uVG9rZW4sXG4gIHJlbmFtZUFueVN1YldpbmRvd0luamVjdGlvblRva2VuLFxuICBzdWJXaW5kb3dzSW5qZWN0aW9uVG9rZW4sXG4gIHN1YldpbmRvd3NSZWFjdGl2ZUluamVjdGlvblRva2VuLFxufSBmcm9tIFwiQGs4c2xlbnMvc3ViLXdpbmRvdy1jb250cmFjdHNcIjtcbmltcG9ydCB7XG4gIGFjdGlvbixcbiAgY29tcHV0ZWQsXG4gIHR5cGUgSUNvbXB1dGVkVmFsdWUsXG4gIHR5cGUgT2JzZXJ2YWJsZU1hcCxcbiAgb2JzZXJ2YWJsZSxcbiAgcnVuSW5BY3Rpb24sXG59IGZyb20gXCJtb2J4XCI7XG5pbXBvcnQgeyByZW9wZW5pbmdPZkNsb3NlZFdpbmRvd0luamVjdGFibGUgfSBmcm9tIFwiLi4vbGF5b3V0cy9yZW9wZW5pbmctb2YtY2xvc2VkLXdpbmRvdy5pbmplY3RhYmxlXCI7XG5pbXBvcnQge1xuICBsaW5lYWdlS2V5LFxuICBjb250aW51ZWRXaW5kb3dzT2YsXG4gIHdpbmRvd0NvbnRpbnVlc0J1bmNoLFxuICB3aW5kb3dMaW5lYWdlQnVuY2gsXG59IGZyb20gXCIuLi9sYXlvdXRzL3dpbmRvdy1saW5lYWdlLmluamVjdGFibGVcIjtcbmltcG9ydCB7IGNhbk9wZW5QbGFjZXNJblN1YldpbmRvd3NSZWFjdGl2ZUluamVjdGlvblRva2VuIH0gZnJvbSBcIkBrOHNsZW5zL3BsYWNlLXN1Yi13aW5kb3ctY29udHJhY3RzXCI7XG5pbXBvcnQgeyBwbGFjZXNTdWJXaW5kb3dLaW5kIH0gZnJvbSBcIi4uL2xheW91dHMvcGxhY2VzLXN1Yi13aW5kb3cta2luZC5pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyBkZWxldGVXaW5kb3dMYXlvdXRJbmplY3RhYmxlIH0gZnJvbSBcIi4uL2xheW91dHMvZGVsZXRlLXdpbmRvdy1sYXlvdXQuaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgbGF5b3V0SW5Ib3RiYXJJbmplY3RhYmxlIH0gZnJvbSBcIi4uL2xheW91dHMvbGF5b3V0LWluLWhvdGJhci5pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyBsYXlvdXRUaWxpbmdJbmplY3RhYmxlIH0gZnJvbSBcIi4uL2xheW91dHMvbGF5b3V0LXRpbGluZy5pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyByZWNhbGxXaW5kb3dMYXlvdXRJbmplY3RhYmxlIH0gZnJvbSBcIi4uL2xheW91dHMvcmVjYWxsLXdpbmRvdy1sYXlvdXQuaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgcmVuYW1lV2luZG93TGF5b3V0SW5qZWN0YWJsZSB9IGZyb20gXCIuLi9sYXlvdXRzL3JlbmFtZS13aW5kb3ctbGF5b3V0LmluamVjdGFibGVcIjtcbmltcG9ydCB7IGR1cGxpY2F0ZVdpbmRvd0xheW91dEluamVjdGFibGUgfSBmcm9tIFwiLi4vbGF5b3V0cy9kdXBsaWNhdGUtd2luZG93LWxheW91dC5pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyBzYXZlV2luZG93TGF5b3V0SW5qZWN0YWJsZSB9IGZyb20gXCIuLi9sYXlvdXRzL3NhdmUtd2luZG93LWxheW91dC5pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyBtYXRjaE9wZW5XaW5kb3dzLCBzYXZlZFdpbmRvd09mS2V5IH0gZnJvbSBcIi4uL2xheW91dHMvbGF5b3V0LXRpbGluZ1wiO1xuaW1wb3J0IHsgdGlsZUJvdW5kc09mIH0gZnJvbSBcIi4uL2xheW91dHMvbGF5b3V0LXByZXZpZXdcIjtcbmltcG9ydCB7XG4gIGJvdW5kc0luR3JpZCxcbiAga2V5T2ZXaW5kb3csXG4gIGxlZnRPdXRPZlBsYW4sXG4gIG9wZW5pbmdQcmVmaXgsXG4gIG1vdmVJblBsYW4sXG4gIHNldFJvd3NJblBsYW4sXG4gIHR5cGUgUGxhY2VkV2luZG93LFxuICB0eXBlIFBsYW5uZWRTY3JlZW4sXG4gIHR5cGUgUGxhbm5lZFdpbmRvdyxcbiAgdHlwZSBSZXNvbHZlZFRpbGluZ1BsYW4sXG4gIHJlY29ubmVjdGVkSWRPZixcbn0gZnJvbSBcIi4uL2xheW91dHMvdGlsaW5nLXBsYW5cIjtcbmltcG9ydCB7IHRpbGluZ1BsYW5JbmplY3RhYmxlIH0gZnJvbSBcIi4uL2xheW91dHMvdGlsaW5nLXBsYW4uaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgdGlsZVdpbmRvd3NJbmplY3RhYmxlIH0gZnJvbSBcIi4uL2xheW91dHMvdGlsZS13aW5kb3dzLmluamVjdGFibGVcIjtcbmltcG9ydCB0eXBlIHtcbiAgU2F2ZWRXaW5kb3csXG4gIFNhdmVkV2luZG93TGF5b3V0LFxufSBmcm9tIFwiLi4vbGF5b3V0cy9zYXZlZC13aW5kb3ctbGF5b3V0cy5pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyB3aW5kb3dMYXlvdXRMaXN0SW5qZWN0YWJsZSB9IGZyb20gXCIuLi9sYXlvdXRzL3dpbmRvdy1sYXlvdXQtbGlzdC5pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyBkZWxldGVMYXlvdXRNb2RhbEtpbmQgfSBmcm9tIFwiLi9kZWxldGUtbGF5b3V0LW1vZGFsLmluamVjdGFibGVcIjtcblxuY29uc3QgcGx1cmFsID0gKGNvdW50OiBudW1iZXIsIHdvcmQ6IHN0cmluZykgPT5cbiAgYCR7Y291bnR9ICR7d29yZH0ke2NvdW50ID09PSAxID8gXCJcIiA6IFwic1wifWA7XG5cbi8vIFRoZSBuYW1lIGEgbmV3IGxheW91dCBnZXRzOiBcIkxheW91dFwiIGFuZCB0aGUgbnVtYmVyIGFmdGVyIHRoZSBoaWdoZXN0IG9mIHRoZSBsYXlvdXRzIHNvIG5hbWVkLlxuY29uc3QgbmV4dExheW91dE5hbWUgPSAobmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdKSA9PiB7XG4gIGNvbnN0IG51bWJlcnMgPSBuYW1lc1xuICAgIC5tYXAoKG5hbWUpID0+IC9eTGF5b3V0IChcXGQrKSQvLmV4ZWMobmFtZSk/LlsxXSlcbiAgICAuZmlsdGVyKChpdCkgPT4gaXQgIT09IHVuZGVmaW5lZCk7XG5cbiAgcmV0dXJuIGBMYXlvdXQgJHtNYXRoLm1heCgwLCAuLi5udW1iZXJzLm1hcChOdW1iZXIpKSArIDF9YDtcbn07XG5cbi8vIFRoZSB3aW5kb3dzIGEgcGxhbiB0aWxlczogdGhvc2Ugb3Blbiwgb24gc2NyZWVucyBjb25uZWN0ZWQuXG5jb25zdCB0aWxlZFdpbmRvd3NPZiA9IChwbGFuOiBSZXNvbHZlZFRpbGluZ1BsYW4pID0+XG4gIHBsYW4uc2NyZWVuc1xuICAgIC5maWx0ZXIoKHNjcmVlbikgPT4gIXNjcmVlbi5taXNzaW5nKVxuICAgIC5mbGF0TWFwKChzY3JlZW4pID0+XG4gICAgICBzY3JlZW4ud2luZG93c1xuICAgICAgICAuZmlsdGVyKCh3aW5kb3cpID0+ICF3aW5kb3cubWlzc2luZylcbiAgICAgICAgLm1hcCgod2luZG93KSA9PiAoeyB3aW5kb3csIHNjcmVlbiB9KSksXG4gICAgKTtcblxuLy8gV2hlcmUgdGhlIHdpbmRvdyBpcyBwbGFubmVkIHRvIGdvLCB0byB0ZWxsIHdoZXJlIGl0IHNldHRsZWQgd2hlbiB0aWxlZCBzbyBiZWZvcmUuXG5jb25zdCBwbGFjZW1lbnRPZiA9ICh3aW5kb3c6IFBsYWNlZFdpbmRvdywgc2NyZWVuOiBQbGFubmVkU2NyZWVuKSA9PlxuICBKU09OLnN0cmluZ2lmeShbXG4gICAgd2luZG93LmtleSxcbiAgICBzY3JlZW4uZGlzcGxheS5pZCxcbiAgICBzY3JlZW4uZGlzcGxheS53b3JrQXJlYS5nZXQoKSxcbiAgICBzY3JlZW4uY29sdW1ucyxcbiAgICBzY3JlZW4ucm93cyxcbiAgICB3aW5kb3cuY29sdW1uLFxuICAgIHdpbmRvdy5yb3csXG4gICAgd2luZG93LmNvbHVtbnMsXG4gICAgd2luZG93LnJvd3MsXG4gIF0pO1xuXG5jb25zdCBpc05lYXIgPSAoYTogV2luZG93Qm91bmRzLCBiOiBXaW5kb3dCb3VuZHMsIGJ5OiBudW1iZXIpID0+XG4gIE1hdGguYWJzKGEueCAtIGIueCkgPD0gYnkgJiZcbiAgTWF0aC5hYnMoYS55IC0gYi55KSA8PSBieSAmJlxuICBNYXRoLmFicyhhLndpZHRoIC0gYi53aWR0aCkgPD0gYnkgJiZcbiAgTWF0aC5hYnMoYS5oZWlnaHQgLSBiLmhlaWdodCkgPD0gYnk7XG5cbi8vIEhvdyBsb25nIHRpbGVkIHdpbmRvd3MgdGFrZSB0byBzZXR0bGUgd2hlcmUgdGhleSB3ZXJlIHBsYWNlZCwgYmVmb3JlIHRoZXkgYXJlIGxvb2tlZCBhdC5cbmNvbnN0IHNldHRsZU1zID0gNjAwO1xuXG4vLyBBIGNlbGwgb2YgYSBzY3JlZW4ncyBncmlkLlxuZXhwb3J0IGludGVyZmFjZSBDZWxsIHtcbiAgcmVhZG9ubHkgZGlzcGxheUlkOiBudW1iZXI7XG4gIHJlYWRvbmx5IGNvbHVtbjogbnVtYmVyO1xuICByZWFkb25seSByb3c6IG51bWJlcjtcbn1cblxuLy8gV2hhdCB0aGUgd2luZG93IGxheW91dHMgbW9kYWwgc2hvd3MsIGFuZCB3aGF0IGl0cyBidXR0b25zIGRvLlxuZXhwb3J0IGNvbnN0IHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUgPSBnZXRJbmplY3RhYmxlMih7XG4gIGlkOiBcIndpbmRvdy1tYW5hZ2VyLndpbmRvdy1sYXlvdXRzLW1vZGVsXCIsXG4gIGNvbnN1bXB0aW9uczogW1xuICAgIHdpbmRvd1JlY29yZHNSZWFjdGl2ZUluamVjdGlvblRva2VuLFxuICAgIGRpc3BsYXlSZWNvcmRzUmVhY3RpdmVJbmplY3Rpb25Ub2tlbixcbiAgICBvcGVuTW9kYWxJbmplY3Rpb25Ub2tlbixcbiAgICBvcGVuU3ViV2luZG93SW5qZWN0aW9uVG9rZW4sXG4gICAgc2V0V2luZG93Qm91bmRzSW5qZWN0aW9uVG9rZW4sXG4gICAgYWxsQ2x1c3RlclJlY29yZHNSZWFjdGl2ZUluamVjdGlvblRva2VuLFxuICAgIGNhbk9wZW5QbGFjZXNJblN1YldpbmRvd3NSZWFjdGl2ZUluamVjdGlvblRva2VuLFxuICAgIHN1YldpbmRvd3NSZWFjdGl2ZUluamVjdGlvblRva2VuLFxuICAgIHN1YldpbmRvd3NJbmplY3Rpb25Ub2tlbixcbiAgICBjbG9zZUFueVN1YldpbmRvd0luamVjdGlvblRva2VuLFxuICAgIHJlbmFtZUFueVN1YldpbmRvd0luamVjdGlvblRva2VuLFxuICAgIHJlb3BlbldpbmRvd0luamVjdGlvblRva2VuLFxuICAgIGNhblJlb3BlbldpbmRvd1JlYWN0aXZlSW5qZWN0aW9uVG9rZW4sXG4gICAgZm9jdXNXaW5kb3dJbmplY3Rpb25Ub2tlbixcbiAgICB3aW5kb3dSZWNvcmRPZkluamVjdGlvblRva2VuLFxuICBdLFxuXG4gIGluc3RhbnRpYXRlOiAoZGkpID0+IHtcbiAgICAvLyBXaGF0IHRoZSBtb2RlbCBoYXMgc3RhcnRlZCBhbmQgc3RvcHMgd2hlbiBpdCBpcyB0aHJvd24gYXdheSwgYXMgd2hlbiB0aGUgZXh0ZW5zaW9uIGlzXG4gICAgLy8gcmVidWlsdCwgZGlzYWJsZWQgb3IgdW5pbnN0YWxsZWQ6IGl0cyB0aW1lcnMgbm90IHJ1biB5ZXQuIEl0IHN0YXJ0cyBubyByZWFjdGlvbnMuXG4gICAgY29uc3QgdGltZXJzID0gbmV3IFNldDxSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0Pj4oKTtcblxuICAgIGNvbnN0IGxhdGVyID0gKHJ1bjogKCkgPT4gdm9pZCwgbXM6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGltZXJzLmRlbGV0ZSh0aW1lcik7XG4gICAgICAgIHJ1bigpO1xuICAgICAgfSwgbXMpO1xuXG4gICAgICB0aW1lcnMuYWRkKHRpbWVyKTtcblxuICAgICAgcmV0dXJuIHRpbWVyO1xuICAgIH07XG5cbiAgICBjb25zdCBjYW5jZWwgPSAodGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAodGltZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICB0aW1lcnMuZGVsZXRlKHRpbWVyKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgd2luZG93cyA9IGRpLmluamVjdCh3aW5kb3dSZWNvcmRzUmVhY3RpdmVJbmplY3Rpb25Ub2tlbikoKTtcbiAgICBjb25zdCBkaXNwbGF5cyA9IGRpLmluamVjdChkaXNwbGF5UmVjb3Jkc1JlYWN0aXZlSW5qZWN0aW9uVG9rZW4pKCk7XG4gICAgY29uc3QgY29uZmlybURlbGV0ZSA9IGRpLmluamVjdChcbiAgICAgIG9wZW5Nb2RhbEluamVjdGlvblRva2VuLmZvcihkZWxldGVMYXlvdXRNb2RhbEtpbmQpLmZvcihkaS5zY29wZUlkcyksXG4gICAgKSgpO1xuICAgIGNvbnN0IG9wZW5QbGFjZSA9IGRpLmluamVjdChcbiAgICAgIG9wZW5TdWJXaW5kb3dJbmplY3Rpb25Ub2tlbi5mb3IocGxhY2VzU3ViV2luZG93S2luZCkuZm9yKGRpLnNjb3BlSWRzKSxcbiAgICApKCk7XG4gICAgY29uc3Qgc2V0V2luZG93Qm91bmRzID0gZGkuaW5qZWN0KHNldFdpbmRvd0JvdW5kc0luamVjdGlvblRva2VuKSgpO1xuICAgIC8vIE5vdCB0aGVyZSBpbiBhIExlbnMgdGhhdCBuZXZlciBjYW4sIGFzIG9uZSB3aXRob3V0IExlbnMgU3R1ZGlvOiB0YWtlbiBhcyBmYWxzZS5cbiAgICBjb25zdCBjYW5PcGVuUGxhY2VzT3JOb3QgPSBkaS5pbmplY3RNYXliZShcbiAgICAgIGNhbk9wZW5QbGFjZXNJblN1YldpbmRvd3NSZWFjdGl2ZUluamVjdGlvblRva2VuLFxuICAgICk/LigpO1xuICAgIGNvbnN0IGNhbk9wZW5QbGFjZXMgPSBjb21wdXRlZCgoKSA9PiBjYW5PcGVuUGxhY2VzT3JOb3Q/LmdldCgpID8/IGZhbHNlKTtcbiAgICAvLyBUaGUgc3ViLXdpbmRvd3MgTGVucyBsaXN0czogZm9sbG93ZWQgd2hpbGUgdGhlIGVkaXRvciBzaG93cyB3aGV0aGVyIGEgd2luZG93IGNhbiBiZSByZW5hbWVkLFxuICAgIC8vIGFuZCByZWFkIG9uY2Ugd2hlbiBjbG9zaW5nIG9yIHJlbmFtaW5nIG9uZS5cbiAgICBjb25zdCBzdWJXaW5kb3dzT2ZMZW5zID0gZGkuaW5qZWN0KHN1YldpbmRvd3NSZWFjdGl2ZUluamVjdGlvblRva2VuKSgpO1xuICAgIGNvbnN0IGdldFN1YldpbmRvd3MgPSBkaS5pbmplY3Qoc3ViV2luZG93c0luamVjdGlvblRva2VuKSgpO1xuICAgIGNvbnN0IGNsb3NlQW55U3ViV2luZG93ID0gZGkuaW5qZWN0KGNsb3NlQW55U3ViV2luZG93SW5qZWN0aW9uVG9rZW4pKCk7XG4gICAgY29uc3QgcmVuYW1lQW55U3ViV2luZG93ID0gZGkuaW5qZWN0KHJlbmFtZUFueVN1YldpbmRvd0luamVjdGlvblRva2VuKSgpO1xuICAgIGNvbnN0IHJlb3BlbldpbmRvdyA9IGRpLmluamVjdChyZW9wZW5XaW5kb3dJbmplY3Rpb25Ub2tlbikoKTtcbiAgICBjb25zdCBmb2N1c1dpbmRvdyA9IGRpLmluamVjdChmb2N1c1dpbmRvd0luamVjdGlvblRva2VuKSgpO1xuICAgIGNvbnN0IHdpbmRvd1JlY29yZE9mID0gZGkuaW5qZWN0KHdpbmRvd1JlY29yZE9mSW5qZWN0aW9uVG9rZW4pKCk7XG4gICAgY29uc3QgY2FuUmVvcGVuV2luZG93UmVhY3RpdmUgPSBkaS5pbmplY3QoXG4gICAgICBjYW5SZW9wZW5XaW5kb3dSZWFjdGl2ZUluamVjdGlvblRva2VuLFxuICAgICkoKTtcblxuICAgIC8vIEhvdyB0byBvcGVuIGEgd2luZG93IG5vdCBvcGVuIGFnYWluLCBhc2tlZCBmb3Igd2hlbiBpdCBpcyB0byBiZSBvcGVuZWQuXG4gICAgY29uc3QgcmVvcGVuaW5nT2ZDbG9zZWRXaW5kb3cgPSBkaS5pbmplY3QoXG4gICAgICByZW9wZW5pbmdPZkNsb3NlZFdpbmRvd0luamVjdGFibGUsXG4gICAgKSgpO1xuXG4gICAgLy8gVGhlIHdpbmRvdyBvZiBhIGxheW91dCBlYWNoIHdpbmRvdyBvcGVuZWQgYWdhaW4gc3RhbmRzIGZvciwgYnkga2V5OyB1bmRlZmluZWQgdW50aWwgcmVhZC5cbiAgICBjb25zdCBsaW5lYWdlID0gb2JzZXJ2YWJsZS5ib3g8T2JzZXJ2YWJsZU1hcDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQ+KFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgeyBkZWVwOiBmYWxzZSB9LFxuICAgICk7XG5cbiAgICB2b2lkIGRpXG4gICAgICAuaW5qZWN0KHdpbmRvd0xpbmVhZ2VCdW5jaC5wZXJzaXN0YWJsZSkoKVxuICAgICAgLnRoZW4oKGtlcHQpID0+IHJ1bkluQWN0aW9uKCgpID0+IGxpbmVhZ2Uuc2V0KGtlcHQpKSk7XG5cbiAgICAvLyBUaGUgd2luZG93IGVhY2ggd2luZG93IG9wZW5lZCBhZ2FpbiBjb250aW51ZXMsIGJ5IGtleSwgd2hpY2hldmVyIGxheW91dCBvcGVuZWQgaXQgYWdhaW4uXG4gICAgY29uc3QgY29udGludWVzID0gb2JzZXJ2YWJsZS5ib3g8T2JzZXJ2YWJsZU1hcDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQ+KFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgeyBkZWVwOiBmYWxzZSB9LFxuICAgICk7XG5cbiAgICB2b2lkIGRpXG4gICAgICAuaW5qZWN0KHdpbmRvd0NvbnRpbnVlc0J1bmNoLnBlcnNpc3RhYmxlKSgpXG4gICAgICAudGhlbigoa2VwdCkgPT4gcnVuSW5BY3Rpb24oKCkgPT4gY29udGludWVzLnNldChrZXB0KSkpO1xuXG4gICAgLy8gVGhlIHdpbmRvd3MgYSB3aW5kb3cgY29udGludWVzLCBuZWFyZXN0IGZpcnN0OyB0aGVuIHRoZSB3aW5kb3dzIGFueSBsYXlvdXQgZm91bmQgb3Igb3BlbmVkIGl0XG4gICAgLy8gYWdhaW4gYXMsIHdoaWNoIHRlbGwgdGhlIHNhbWUgb2YgYSB3aW5kb3cgb3BlbmVkIGFnYWluIGJlZm9yZSB0aGlzIHdhcyBrZXB0LlxuICAgIGNvbnN0IHByZWRlY2Vzc29yc09mS2V5ID0gKGtleTogc3RyaW5nKSA9PlxuICAgICAgY29udGludWVkV2luZG93c09mKFxuICAgICAgICBrZXksXG4gICAgICAgIGNvbnRpbnVlcy5nZXQoKSA/PyBuZXcgTWFwKCksXG4gICAgICAgIGxpbmVhZ2UuZ2V0KCkgPz8gbmV3IE1hcCgpLFxuICAgICAgKTtcblxuICAgIC8vIFRoZSBjbHVzdGVycywgdG8gb3BlbiBhIHdpbmRvdyBvbiBvbmUgb2YgdGhlaXIgbGlzdHM7IHVuZGVmaW5lZCB1bnRpbCBMZW5zIGhhcyB0b2xkIHRoZW0uXG4gICAgY29uc3QgY2x1c3RlcnMgPSBvYnNlcnZhYmxlLmJveDxcbiAgICAgIElDb21wdXRlZFZhbHVlPENsdXN0ZXJSZWNvcmRbXT4gfCB1bmRlZmluZWRcbiAgICA+KHVuZGVmaW5lZCwgeyBkZWVwOiBmYWxzZSB9KTtcblxuICAgIHZvaWQgZGlcbiAgICAgIC5pbmplY3QoYWxsQ2x1c3RlclJlY29yZHNSZWFjdGl2ZUluamVjdGlvblRva2VuKSgpXG4gICAgICAudGhlbigocmVjb3JkcykgPT4gcnVuSW5BY3Rpb24oKCkgPT4gY2x1c3RlcnMuc2V0KHJlY29yZHMpKSk7XG4gICAgY29uc3QgbGF5b3V0cyA9IGRpLmluamVjdCh3aW5kb3dMYXlvdXRMaXN0SW5qZWN0YWJsZSkoKTtcbiAgICBjb25zdCBzYXZlV2luZG93TGF5b3V0ID0gZGkuaW5qZWN0KHNhdmVXaW5kb3dMYXlvdXRJbmplY3RhYmxlKSgpO1xuICAgIGNvbnN0IHJlY2FsbFdpbmRvd0xheW91dCA9IGRpLmluamVjdChyZWNhbGxXaW5kb3dMYXlvdXRJbmplY3RhYmxlKSgpO1xuICAgIGNvbnN0IGRlbGV0ZVdpbmRvd0xheW91dCA9IGRpLmluamVjdChkZWxldGVXaW5kb3dMYXlvdXRJbmplY3RhYmxlKSgpO1xuICAgIGNvbnN0IGxheW91dEluSG90YmFyID0gZGkuaW5qZWN0KGxheW91dEluSG90YmFySW5qZWN0YWJsZSkoKTtcbiAgICBjb25zdCB0aWxlV2luZG93cyA9IGRpLmluamVjdCh0aWxlV2luZG93c0luamVjdGFibGUpKCk7XG4gICAgY29uc3QgdGlsaW5nUGxhbiA9IGRpLmluamVjdCh0aWxpbmdQbGFuSW5qZWN0YWJsZSkoKTtcbiAgICBjb25zdCBsYXlvdXRUaWxpbmcgPSBkaS5pbmplY3QobGF5b3V0VGlsaW5nSW5qZWN0YWJsZSkoKTtcbiAgICBjb25zdCByZW5hbWVXaW5kb3dMYXlvdXQgPSBkaS5pbmplY3QocmVuYW1lV2luZG93TGF5b3V0SW5qZWN0YWJsZSkoKTtcbiAgICBjb25zdCBkdXBsaWNhdGVXaW5kb3dMYXlvdXQgPSBkaS5pbmplY3QoZHVwbGljYXRlV2luZG93TGF5b3V0SW5qZWN0YWJsZSkoKTtcblxuICAgIGNvbnN0IHN0YXR1cyA9IG9ic2VydmFibGUuYm94PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgICAvLyBUaGUgbmFtZSBvZiB0aGUgbGF5b3V0IGJlaW5nIHJlbmFtZWQsIGFuZCB0aGUgbmFtZSBpdCBpcyBnZXR0aW5nLlxuICAgIGNvbnN0IHJlbmFtaW5nID0gb2JzZXJ2YWJsZS5ib3g8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAgIGNvbnN0IHJlbmFtZURyYWZ0ID0gb2JzZXJ2YWJsZS5ib3goXCJcIik7XG4gICAgLy8gVGhlIGxheW91dCB3aG9zZSB0aWxpbmcgc2V0dXAgdGhlIGVkaXRvciBzaG93cywgYW5kIHdoZXRoZXIgdGhlIHNldHVwIHdhcyBjaGFuZ2VkIHNpbmNlLlxuICAgIGNvbnN0IHNlbGVjdGVkID0gb2JzZXJ2YWJsZS5ib3g8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAgIGNvbnN0IHRpbGluZ0NoYW5nZWQgPSBvYnNlcnZhYmxlLmJveChmYWxzZSk7XG4gICAgLy8gV2hlcmUgd2luZG93cyBzZXR0bGVkIHdoZW4gdGlsZWQsIGJ5IHdoZXJlIHRoZXkgd2VyZSBwbGFubmVkIHRvIGdvOiBhIHdpbmRvdyB0b28gbGFyZ2UgZm9yXG4gICAgLy8gaXRzIGNlbGwsIGFzIG9uZSB0aGF0IGNhbm5vdCBiZSBtYWRlIHNvIHNtYWxsLCBzZXR0bGVzIG90aGVyd2lzZSwgYW5kIGlzIGluIHBsYWNlIHRoZXJlLlxuICAgIGNvbnN0IHNldHRsZWQgPSBvYnNlcnZhYmxlLm1hcDxzdHJpbmcsIFdpbmRvd0JvdW5kcz4oe30sIHsgZGVlcDogZmFsc2UgfSk7XG5cbiAgICAvLyBUYWtlcyBldmVyeSB0aWxlZCB3aW5kb3cgd2hlcmUgaXQgaXMgbm93IGFzIHdoZXJlIGl0cyB0aWxlIGhhcyBpdCwgYXMgd2hlbiBpdCBzZXR0bGVkIHRoZXJlLlxuICAgIGNvbnN0IGFjY2VwdFdoZXJlV2luZG93c0FyZSA9ICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgeyB3aW5kb3csIHNjcmVlbiB9IG9mIHRpbGVkV2luZG93c09mKFxuICAgICAgICB0aWxpbmdQbGFuLnJlc29sdmVkLmdldCgpLFxuICAgICAgKSkge1xuICAgICAgICBzZXR0bGVkLnNldChwbGFjZW1lbnRPZih3aW5kb3csIHNjcmVlbiksIHtcbiAgICAgICAgICAuLi53aW5kb3cucmVjb3JkLmJvdW5kcy5nZXQoKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFdoYXQgd2FzIGp1c3Qgc2F2ZWQsIHNob3duIGJlc2lkZSBTYXZlIGZvciBhIG1vbWVudDogYSBub3RpZmljYXRpb24gb2YgTGVucyB3b3VsZCBzaG93IHVuZGVyXG4gICAgLy8gdGhlIGRhcmtlbmVkIGJhY2tkcm9wIG9mIHRoZSBkaWFsb2csIG91dCBvZiBzaWdodC5cbiAgICBjb25zdCBzYXZlZE5vdGUgPSBvYnNlcnZhYmxlLmJveDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gICAgbGV0IGhpZGVTYXZlZE5vdGU6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgc2hvd1NhdmVkID0gYWN0aW9uKChub3RlOiBzdHJpbmcpID0+IHtcbiAgICAgIHNhdmVkTm90ZS5zZXQobm90ZSk7XG4gICAgICBjYW5jZWwoaGlkZVNhdmVkTm90ZSk7XG4gICAgICBoaWRlU2F2ZWROb3RlID0gbGF0ZXIoXG4gICAgICAgICgpID0+IHJ1bkluQWN0aW9uKCgpID0+IHNhdmVkTm90ZS5zZXQodW5kZWZpbmVkKSksXG4gICAgICAgIDQwMDAsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8gU2VsZWN0cyB0aGUgbGF5b3V0OiB0aGUgZWRpdG9yIHNob3dzIGl0cyB0aWxpbmcsIGFuZCBpdHMgcm93IGl0cyBidXR0b25zLlxuICAgIGxldCBuZXh0UGxhY2VXaW5kb3cgPSAwO1xuICAgIC8vIFdoZXRoZXIgdGhlIHdpbmRvd3Mgb2YgYSBsYXlvdXQgYmVpbmcgcmVjYWxsZWQgYXJlIGJlaW5nIG9wZW5lZCBhZ2Fpbi5cbiAgICBjb25zdCByZW9wZW5pbmcgPSBvYnNlcnZhYmxlLmJveChmYWxzZSk7XG4gICAgLy8gVGhlIHdpbmRvd3MgYSByZWNhbGwgb3BlbmVkIGFnYWluIHdpdGggbm8gdGlsZSBvZiB0aGVpciBvd24gdG8gZ28gdG8sIGJ5IHRoZWlyIG93biBrZXlzOiBvdXRcbiAgICAvLyBvZiB0aGUgcGxhbiB1bnRpbCB0aGUgcmVjYWxsIHBsYWNlcyB0aGVtLCBzbyB0aGF0IG5vbmUgbWFrZXMgcm9vbSBmb3IgaXRzZWxmIG1lYW53aGlsZS5cbiAgICBjb25zdCByZWNhbGxlZCA9IG9ic2VydmFibGUuc2V0PHN0cmluZz4oW10sIHsgZGVlcDogZmFsc2UgfSk7XG4gICAgLy8gV2hhdCB0aGUgY2x1c3RlcnMgb2YgdGhlIG1lbnUgb3BlbmluZyBhIHdpbmRvdyBpbiBhIGNlbGwgYXJlIG5hcnJvd2VkIHRvLlxuICAgIGNvbnN0IGNsdXN0ZXJTZWFyY2ggPSBvYnNlcnZhYmxlLmJveChcIlwiKTtcbiAgICBjb25zdCBwYWdlU2VhcmNoID0gb2JzZXJ2YWJsZS5ib3goXCJcIik7XG4gICAgLy8gVGhlIHRpbGVzIHdob3NlIHdpbmRvd3MgYXJlIGJlaW5nIG9wZW5lZCwgYnkga2V5OiBhZ2FpbiwgZnJvbSB0aGUgdGlsZSBvciBieSBhIHJlY2FsbCwgb3IgaW4gYVxuICAgIC8vIGNlbGwsIHVudGlsIExlbnMgYW5zd2Vycy5cbiAgICBjb25zdCBvcGVuaW5nID0gb2JzZXJ2YWJsZS5zZXQ8c3RyaW5nPihbXSwgeyBkZWVwOiBmYWxzZSB9KTtcbiAgICAvLyBUaGUgd2luZG93cyBiZWluZyBjbG9zZWQsIGJ5IHRoZWlyIG93biBrZXlzOiBvdXQgb2YgdGhlIHBsYW4gd2hpbGUgTGVucyBsaXN0cyB0aGVtIHN0aWxsLlxuICAgIGNvbnN0IGNsb3NpbmcgPSBvYnNlcnZhYmxlLnNldDxzdHJpbmc+KFtdLCB7IGRlZXA6IGZhbHNlIH0pO1xuXG4gICAgLy8gT25jZSBMZW5zIGhhcyBhbnN3ZXJlZCB3aXRoIHRoZSB3aW5kb3cgb3BlbmVkIGFnYWluIGZyb20gYSB0aWxlLCB0aGUgdGlsZSBpcyB0aGF0IHdpbmRvdydzOlxuICAgIC8vIGl0IGdvZXMgYnkgdGhlIHdpbmRvdydzIG93biBrZXksIHRoZSB3aW5kb3cgY29udGludWVzIHRoZSBvbmUgaXQgd2FzIG9wZW5lZCBhZ2FpbiBmcm9tLCBhbmRcbiAgICAvLyBpcyB0aGUgbGF5b3V0J3Mgd2luZG93IHRoZSB0aWxlIHN0b29kIGZvciwgZm9yIGdvb2QuXG4gICAgY29uc3QgdGlsZVJlb3BlbmVkID0gYWN0aW9uKFxuICAgICAgKFxuICAgICAgICBrZXk6IHN0cmluZyxcbiAgICAgICAgd2luZG93OiBXaW5kb3dJZCxcbiAgICAgICAgeyBzdGFuZHNGb3IsIHByZXZpb3VzIH06IHsgc3RhbmRzRm9yOiBzdHJpbmc7IHByZXZpb3VzOiBzdHJpbmcgfSxcbiAgICAgICkgPT4ge1xuICAgICAgICBjb25zdCBvd24gPSBrZXlPZldpbmRvdyh3aW5kb3cpO1xuXG4gICAgICAgIGlmIChwcmV2aW91cyAhPT0gb3duKSB7XG4gICAgICAgICAgY29udGludWVzLmdldCgpPy5zZXQob3duLCBwcmV2aW91cyk7XG4gICAgICAgIH1cblxuICAgICAgICBsaW5lYWdlLmdldCgpPy5zZXQobGluZWFnZUtleShzZWxlY3RlZC5nZXQoKSA/PyBcIlwiLCBvd24pLCBzdGFuZHNGb3IpO1xuICAgICAgICB0aWxpbmdQbGFuLnJla2V5KGtleSwgd2luZG93KTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIFRoZSBvcGVuIHdpbmRvd3Mgb2YgYSBsYXlvdXQsIGJ5IHRoZSB3aW5kb3dzIGl0IHNhdmVkOiB0aGUgd2luZG93IGl0c2VsZiwgb3Igb25lIG9wZW5lZCBhZ2FpbiBhc1xuICAgIC8vIGl0LiBGb3VuZCBieSBsaW5lYWdlIGFsb25lLCBhcyBmb3IgdGhlIGxheW91dCBzaG93bi5cbiAgICBjb25zdCBvcGVuV2luZG93c09mID0gKGxheW91dDogU2F2ZWRXaW5kb3dMYXlvdXQpID0+XG4gICAgICBtYXRjaE9wZW5XaW5kb3dzKFxuICAgICAgICBsYXlvdXQud2luZG93cyxcbiAgICAgICAgd2luZG93cy5nZXQoKS5tYXAoKHJlY29yZCkgPT4gKHtcbiAgICAgICAgICByZWNvcmQsXG4gICAgICAgICAgcmVvcGVuaW5nOiB1bmRlZmluZWQsXG4gICAgICAgICAgc3RhbmRzRm9yOiBsaW5lYWdlXG4gICAgICAgICAgICAuZ2V0KClcbiAgICAgICAgICAgID8uZ2V0KGxpbmVhZ2VLZXkobGF5b3V0Lm5hbWUsIGtleU9mV2luZG93KHJlY29yZC53aW5kb3cpKSksXG4gICAgICAgICAgY29udGludWVzOiBwcmVkZWNlc3NvcnNPZktleShrZXlPZldpbmRvdyhyZWNvcmQud2luZG93KSksXG4gICAgICAgIH0pKSxcbiAgICAgICk7XG5cbiAgICAvLyBXaGF0IHRoZSBzZWxlY3RlZCBsYXlvdXQgc2F2ZWQgb2YgZWFjaCBvcGVuIHdpbmRvdzogdGhlIHdpbmRvdyBpdHNlbGYsIG9yIGZhaWxpbmcgdGhhdCB0aGVcbiAgICAvLyB3aW5kb3cgc2hvd2luZyB3aGF0IHRoZSBzYXZlZCBvbmUgZGlkLCBhcyBvbmUgb3BlbmVkIGFnYWluIHVuZGVyIGFub3RoZXIgaWQ7IGVhY2ggc2F2ZWRcbiAgICAvLyB3aW5kb3cgdG8gb25lIG9wZW4gd2luZG93IG9ubHkuXG4gICAgY29uc3Qgc2F2ZWRXaW5kb3dzT2YgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBjb25zdCBsYXlvdXQgPSBtb2RlbC5zZWxlY3RlZExheW91dC5nZXQoKTtcblxuICAgICAgaWYgKCFsYXlvdXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXA8V2luZG93UmVjb3JkLCBTYXZlZFdpbmRvdz4oKTtcbiAgICAgIH1cblxuICAgICAgLy8gRm91bmQgYnkgbGluZWFnZSBhbG9uZTogd2hhdCBhbiBvcGVuIHdpbmRvdyBkb2VzIGlzIGFza2VkIG9mIExlbnMgb25seSB3aGVuIGEgbGF5b3V0IGlzXG4gICAgICAvLyBzaG93biBvciByZWNhbGxlZCwgd2hpY2gga2VlcHMgd2hhdCBpdCBmb3VuZCBhcyBsaW5lYWdlIHRvby5cbiAgICAgIHJldHVybiBuZXcgTWFwKFxuICAgICAgICBbLi4ub3BlbldpbmRvd3NPZihsYXlvdXQpXS5tYXAoXG4gICAgICAgICAgKFtzYXZlZCwgcmVjb3JkXSkgPT4gW3JlY29yZCwgc2F2ZWRdIGFzIGNvbnN0LFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8vIFdoZXRoZXIgdGhlIHdpbmRvdydzIHRpbGUgaXMgd2hlcmUgdGhlIGxheW91dCdzIHRpbGluZyBoYXMgdGhlIGxheW91dCdzIHdpbmRvdyBvZiB0aGF0IHBsYWNlOlxuICAgIC8vIG9uIHRoZSBzYW1lIHNjcmVlbiwgaW4gdGhlIHNhbWUgY2VsbHMsIG9yIG5vdCB0aWxlZCBhcyB0aGVuLlxuICAgIGNvbnN0IGlzVGlsZWRBc1NhdmVkID0gKFxuICAgICAgd2luZG93OiBQbGFubmVkV2luZG93LFxuICAgICAgbGF5b3V0OiBTYXZlZFdpbmRvd0xheW91dCxcbiAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBzYXZlZCA9IGxheW91dC50aWxpbmc/LndpbmRvd3MuZmluZCgoaXQpID0+IGl0LmluZGV4ID09PSBpbmRleCk7XG4gICAgICBjb25zdCBzY3JlZW4gPSB0aWxpbmdQbGFuLnJlc29sdmVkXG4gICAgICAgIC5nZXQoKVxuICAgICAgICAuc2NyZWVucy5maW5kKChpdCkgPT5cbiAgICAgICAgICBpdC53aW5kb3dzLnNvbWUoKHBsYW5uZWQpID0+IHBsYW5uZWQua2V5ID09PSB3aW5kb3cua2V5KSxcbiAgICAgICAgKTtcbiAgICAgIGNvbnN0IHBsYWNlZCA9IHNjcmVlbj8ud2luZG93cy5maW5kKChpdCkgPT4gaXQua2V5ID09PSB3aW5kb3cua2V5KTtcblxuICAgICAgaWYgKCFzYXZlZCB8fCBzYXZlZC5kaXNwbGF5SWQgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICFzY3JlZW47XG4gICAgICB9XG5cbiAgICAgIGlmICghc2NyZWVuIHx8ICFwbGFjZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBBIHNjcmVlbiBjb25uZWN0ZWQgYWdhaW4gdW5kZXIgYW5vdGhlciBpZCBpcyB0aGUgb25lIHNhdmVkIHN0aWxsLlxuICAgICAgY29uc3Qgc2F2ZWRTY3JlZW4gPSBsYXlvdXQudGlsaW5nPy5zY3JlZW5zPy5bU3RyaW5nKHNhdmVkLmRpc3BsYXlJZCldO1xuICAgICAgY29uc3QgZGlzcGxheUlkID1cbiAgICAgICAgKHNhdmVkU2NyZWVuICYmXG4gICAgICAgICAgcmVjb25uZWN0ZWRJZE9mKFxuICAgICAgICAgICAgU3RyaW5nKHNhdmVkLmRpc3BsYXlJZCksXG4gICAgICAgICAgICBzYXZlZFNjcmVlbixcbiAgICAgICAgICAgIGRpc3BsYXlzLmdldCgpLFxuICAgICAgICAgICkpID8/XG4gICAgICAgIHNhdmVkLmRpc3BsYXlJZDtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgc2NyZWVuLmRpc3BsYXkuaWQgPT09IGRpc3BsYXlJZCAmJlxuICAgICAgICAoc2F2ZWQuY29sdW1uID09PSB1bmRlZmluZWQgfHwgcGxhY2VkLmNvbHVtbiA9PT0gc2F2ZWQuY29sdW1uKSAmJlxuICAgICAgICAoc2F2ZWQucm93ID09PSB1bmRlZmluZWQgfHwgcGxhY2VkLnJvdyA9PT0gc2F2ZWQucm93KSAmJlxuICAgICAgICBwbGFjZWQuY29sdW1ucyA9PT0gc2F2ZWQuY29sdW1ucyAmJlxuICAgICAgICBwbGFjZWQucm93cyA9PT0gc2F2ZWQucm93c1xuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLy8gV2hlcmUgdGhlIHNlbGVjdGVkIGxheW91dCdzIHRpbGluZyBwdXRzIGVhY2ggd2luZG93IGl0IHRpbGVzIG9uIGEgc2NyZWVuIGNvbm5lY3RlZCBub3cuXG4gICAgY29uc3Qgc2VsZWN0ZWRUaWxlQm91bmRzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgY29uc3QgbGF5b3V0ID0gbW9kZWwuc2VsZWN0ZWRMYXlvdXQuZ2V0KCk7XG5cbiAgICAgIHJldHVybiBsYXlvdXQgPyB0aWxlQm91bmRzT2YobGF5b3V0LCBkaXNwbGF5cy5nZXQoKSkgOiBuZXcgTWFwKCk7XG4gICAgfSk7XG5cbiAgICAvLyBXaGV0aGVyIHRoZSBvcGVuIHdpbmRvdyBkaWZmZXJzIGZyb20gd2hhdCB0aGUgc2VsZWN0ZWQgbGF5b3V0IHNhdmVkIG9mIGl0LCBvciBpcyBub3QgaW4gaXQuXG4gICAgY29uc3QgaXNVbnNhdmVkID0gKHJlY29yZDogV2luZG93UmVjb3JkKSA9PiB7XG4gICAgICBjb25zdCBzYXZlZCA9IHNhdmVkV2luZG93c09mLmdldCgpLmdldChyZWNvcmQpO1xuICAgICAgY29uc3QgbGF5b3V0ID0gbW9kZWwuc2VsZWN0ZWRMYXlvdXQuZ2V0KCk7XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgICFzYXZlZCB8fFxuICAgICAgICAhaXNTaG93bkFzU2F2ZWQoXG4gICAgICAgICAgcmVjb3JkLFxuICAgICAgICAgIHNhdmVkLFxuICAgICAgICAgIGxheW91dCAmJiBzZWxlY3RlZFRpbGVCb3VuZHMuZ2V0KCkuZ2V0KGxheW91dC53aW5kb3dzLmluZGV4T2Yoc2F2ZWQpKSxcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLy8gV2hlcmUgYW5kIGFzIHRoZSBsYXlvdXQgc2F2ZWQgaXQ6IGEgd2luZG93IGl0IHRpbGVzLCBvbiBhIHNjcmVlbiBjb25uZWN0ZWQgbm93LCBpbiBpdHMgdGlsZSxcbiAgICAvLyBzaG93biBub3JtYWxseSBvciBmaWxsaW5nIGp1c3QgaXRzIHRpbGUsIGFzIFJlY2FsbCBhbmQgVGlsZSBwdXQgaXQsIHVubGVzcyBzYXZlZCBtaW5pbWl6ZWQ7XG4gICAgLy8gYW55IG90aGVyIGluIHRoZSBzYW1lIHN0YXRlIGFuZCBwbGFjZSwgb3Igb25lIG5vcm1hbCBhbmQgdGhlIG90aGVyIG1heGltaXplZCB3aGVyZSB0aGVcbiAgICAvLyB3aW5kb3cgZmlsbHMganVzdCB3aGVyZSB0aGUgc2F2ZWQgb25lIHdhcywgYXMgYSB3aW5kb3cgdGlsZWQgYWxvbmUgb24gYSBzY3JlZW4gZmlsbHMgaXRzIHdvcmtcbiAgICAvLyBhcmVhIGFuZCBpcyB0b2xkIG1heGltaXplZCBmb3IgaXQuXG4gICAgY29uc3QgaXNTaG93bkFzU2F2ZWQgPSAoXG4gICAgICByZWNvcmQ6IFdpbmRvd1JlY29yZCxcbiAgICAgIHNhdmVkOiBTYXZlZFdpbmRvdyxcbiAgICAgIGluVGlsZT86IFdpbmRvd0JvdW5kcyxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHN0YXRlID0gcmVjb3JkLnN0YXRlLmdldCgpO1xuXG4gICAgICBpZiAoaW5UaWxlICYmIHNhdmVkLnN0YXRlICE9PSBcIm1pbmltaXplZFwiKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgKHN0YXRlID09PSBcIm5vcm1hbFwiICYmXG4gICAgICAgICAgICBpc05lYXIocmVjb3JkLm5vcm1hbEJvdW5kcy5nZXQoKSwgaW5UaWxlLCAyKSkgfHxcbiAgICAgICAgICAoc3RhdGUgPT09IFwibWF4aW1pemVkXCIgJiYgaXNOZWFyKHJlY29yZC5ib3VuZHMuZ2V0KCksIGluVGlsZSwgMikpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gc2F2ZWQuc3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIGlzTmVhcihyZWNvcmQubm9ybWFsQm91bmRzLmdldCgpLCBzYXZlZC5ub3JtYWxCb3VuZHMsIDIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlaXRoZXIgPSBuZXcgU2V0KFtzdGF0ZSwgc2F2ZWQuc3RhdGVdKTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgZWl0aGVyLmhhcyhcIm5vcm1hbFwiKSAmJlxuICAgICAgICBlaXRoZXIuaGFzKFwibWF4aW1pemVkXCIpICYmXG4gICAgICAgIGlzTmVhcihyZWNvcmQuYm91bmRzLmdldCgpLCBzYXZlZC5ub3JtYWxCb3VuZHMsIDIpXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvLyBBIHdpbmRvdyBiZWluZyBjbG9zZWQgaGFzIG5vIHBsYWNlIGluIHRoZSBwbGFuIHdoaWxlIExlbnMgbGlzdHMgaXQgc3RpbGwsIG5vciBvbmUgYSByZWNhbGxcbiAgICAvLyBvcGVuZWQgYWdhaW4gd2l0aCBubyB0aWxlIHRvIGdvIHRvLCB1bnRpbCB0aGUgcmVjYWxsIGhhcyBwbGFjZWQgaXQuIEFueSBvdGhlciB3aW5kb3cgaGFzXG4gICAgLy8gaXRzIHBsYWNlIGF0IG9uY2U6IExlbnMgYW5zd2VycyB3aGljaCB3aW5kb3cgaXQgb3BlbmVkIGFzIHNvb24gYXMgaXQgbGlzdHMgaXQuXG4gICAgdGlsaW5nUGxhbi5mb2xsb3dBbGlhc2VzKFxuICAgICAgY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBhbGlhc2VzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiB3aW5kb3dzLmdldCgpKSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0ga2V5T2ZXaW5kb3cocmVjb3JkLndpbmRvdyk7XG5cbiAgICAgICAgICBpZiAoY2xvc2luZy5oYXMoa2V5KSB8fCByZWNhbGxlZC5oYXMoa2V5KSkge1xuICAgICAgICAgICAgYWxpYXNlcy5zZXQoa2V5LCBsZWZ0T3V0T2ZQbGFuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYWxpYXNlcztcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBUaGUgd2luZG93IGJlaW5nIHJlbmFtZWQsIGJ5IGtleSwgYW5kIHRoZSBuYW1lIGl0IGlzIGdldHRpbmcuXG4gICAgY29uc3QgcmVuYW1pbmdXaW5kb3cgPSBvYnNlcnZhYmxlLmJveDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gICAgY29uc3Qgd2luZG93TmFtZURyYWZ0ID0gb2JzZXJ2YWJsZS5ib3goXCJcIik7XG5cbiAgICAvLyBUaGUgd2luZG93IGFzIExlbnMgbGlzdHMgaXQgYW1vbmcgaXRzIHN1Yi13aW5kb3dzLCBieSBpdHMga2V5LCBvciBieSBpdHMgdGl0bGUgd2hlcmUgb25seSBvbmVcbiAgICAvLyB3aW5kb3cgaGFzIGl0OiB0aGUgbGlzdGVkIGlkIGlzIExlbnMncyBvd24uXG4gICAgY29uc3QgbGlzdGVkU3ViV2luZG93T2YgPSAoXG4gICAgICB3aW5kb3c6IFBsYW5uZWRXaW5kb3csXG4gICAgICBsaXN0ZWQ6IHJlYWRvbmx5IExpc3RlZFN1YldpbmRvd1tdLFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgdGl0bGUgPSB3aW5kb3cucmVjb3JkLnRpdGxlLmdldCgpO1xuICAgICAgY29uc3QgYnlUaXRsZSA9IGxpc3RlZC5maWx0ZXIoKGl0KSA9PiBpdC50aXRsZSA9PT0gdGl0bGUpO1xuXG4gICAgICByZXR1cm4gKFxuICAgICAgICBsaXN0ZWQuZmluZCgoaXQpID0+IGl0LmlkID09PSB3aW5kb3cua2V5KSA/P1xuICAgICAgICAoYnlUaXRsZS5sZW5ndGggPT09IDEgPyBieVRpdGxlWzBdIDogdW5kZWZpbmVkKVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLy8gSG93IHRvIG9wZW4gdGhlIHdpbmRvdyBub3Qgb3BlbiBhZ2FpbjogYXMgdGhlIGxheW91dCBrZXB0IGl0LCBmb3IgYSB3aW5kb3cgb2YgdGhlIGxheW91dCdzXG4gICAgLy8gbWlzc2luZyBmcm9tIHRoZSBzdGFydCwgb3IgYXMgTGVucyBkZXNjcmliZWQgaXQgYXMgaXQgY2xvc2VkLlxuICAgIGNvbnN0IHJlb3BlbmluZ09mID0gYXN5bmMgKFxuICAgICAgd2luZG93OiBQbGFubmVkV2luZG93LFxuICAgICk6IFByb21pc2U8V2luZG93UmVvcGVuaW5nIHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgICBjb25zdCBvZkxheW91dCA9IHNhdmVkV2luZG93T2Yod2luZG93KTtcblxuICAgICAgcmV0dXJuIG9mTGF5b3V0XG4gICAgICAgID8gKG9mTGF5b3V0LnJlb3BlbmluZyA/PyB1bmRlZmluZWQpXG4gICAgICAgIDogcmVvcGVuaW5nT2ZDbG9zZWRXaW5kb3cod2luZG93KTtcbiAgICB9O1xuXG4gICAgLy8gV2hlcmUgYW5kIGFzIHRoZSBsYXlvdXQgc2F2ZWQgdGhlIHdpbmRvdy5cbiAgICBjb25zdCBzYXZlZFBsYWNlbWVudE9mID0gKFxuICAgICAgc2F2ZWQ6IFNhdmVkV2luZG93LFxuICAgICk6IFdpbmRvd1Jlb3BlbmluZ1BsYWNlbWVudCA9PiAoe1xuICAgICAgYm91bmRzOiBzYXZlZC5ub3JtYWxCb3VuZHMsXG4gICAgICBzdGF0ZTogc2F2ZWQuc3RhdGUsXG4gICAgICAuLi4oc2F2ZWQuZGlzcGxheUlkID09PSB1bmRlZmluZWQgPyB7fSA6IHsgZGlzcGxheUlkOiBzYXZlZC5kaXNwbGF5SWQgfSksXG4gICAgfSk7XG5cbiAgICAvLyBXaGVyZSBhIHdpbmRvdyBub3Qgb3BlbiBpcyBjcmVhdGVkIHdoZW4gb3BlbmVkIGFnYWluIGZyb20gaXRzIHRpbGUsIHNvIHRoYXQgaXQgc2hvd3MgdGhlcmVcbiAgICAvLyBmcm9tIGl0cyBmaXJzdCBmcmFtZSBvbjogb3ZlciBpdHMgdGlsZSBvbiBhIHNjcmVlbiBjb25uZWN0ZWQsIHdoaWNoIGlzIGFzIHNhdmVkIHdoZW4gaXRzIHRpbGVcbiAgICAvLyBpcyB3aGVyZSB0aGUgbGF5b3V0IHRpbGVkIGl0LCBtaW5pbWl6ZWQgdG9vIHdoZW4gdGhlIGxheW91dCBoYXMgaXQgc287IG9yIGVsc2Ugd2hlcmUgaXRzXG4gICAgLy8gbGF5b3V0IGhhcyBpdC5cbiAgICBjb25zdCByZW9wZW5pbmdQbGFjZW1lbnRPZiA9IChcbiAgICAgIHdpbmRvdzogUGxhbm5lZFdpbmRvdyxcbiAgICApOiBXaW5kb3dSZW9wZW5pbmdQbGFjZW1lbnQgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgY29uc3QgbGF5b3V0ID0gbW9kZWwuc2VsZWN0ZWRMYXlvdXQuZ2V0KCk7XG4gICAgICBjb25zdCBzdGFuZHNGb3IgPSBzdGFuZHNGb3JPZih3aW5kb3cpO1xuICAgICAgY29uc3QgaW5kZXggPVxuICAgICAgICBsYXlvdXQ/LndpbmRvd3MuZmluZEluZGV4KFxuICAgICAgICAgIChpdCkgPT4ga2V5T2ZXaW5kb3coaXQud2luZG93KSA9PT0gc3RhbmRzRm9yLFxuICAgICAgICApID8/IC0xO1xuXG4gICAgICAvLyBNaW5pbWl6ZWQsIHdoZW4gdGhlIGxheW91dCBoYXMgaXQgc28gd2hlcmUgaXRzIHRpbGUgaXMuXG4gICAgICBjb25zdCBtaW5pbWl6ZWQgPVxuICAgICAgICAhIWxheW91dCAmJlxuICAgICAgICBpbmRleCAhPT0gLTEgJiZcbiAgICAgICAgaXNUaWxlZEFzU2F2ZWQod2luZG93LCBsYXlvdXQsIGluZGV4KSAmJlxuICAgICAgICBsYXlvdXQud2luZG93c1tpbmRleF0uc3RhdGUgPT09IFwibWluaW1pemVkXCI7XG5cbiAgICAgIGNvbnN0IHNjcmVlbiA9IHRpbGluZ1BsYW4ucmVzb2x2ZWRcbiAgICAgICAgLmdldCgpXG4gICAgICAgIC5zY3JlZW5zLmZpbmQoXG4gICAgICAgICAgKGl0KSA9PlxuICAgICAgICAgICAgIWl0Lm1pc3NpbmcgJiZcbiAgICAgICAgICAgIGl0LndpbmRvd3Muc29tZSgocGxhbm5lZCkgPT4gcGxhbm5lZC5rZXkgPT09IHdpbmRvdy5rZXkpLFxuICAgICAgICApO1xuICAgICAgY29uc3QgcGxhY2VkID0gc2NyZWVuPy53aW5kb3dzLmZpbmQoKGl0KSA9PiBpdC5rZXkgPT09IHdpbmRvdy5rZXkpO1xuXG4gICAgICBpZiAoc2NyZWVuICYmIHBsYWNlZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGJvdW5kczogYm91bmRzSW5HcmlkKFxuICAgICAgICAgICAgc2NyZWVuLmRpc3BsYXkud29ya0FyZWEuZ2V0KCksXG4gICAgICAgICAgICBzY3JlZW4uY29sdW1ucyxcbiAgICAgICAgICAgIHNjcmVlbi5yb3dzLFxuICAgICAgICAgICAgcGxhY2VkLFxuICAgICAgICAgICksXG4gICAgICAgICAgc3RhdGU6IG1pbmltaXplZCA/IFwibWluaW1pemVkXCIgOiBcIm5vcm1hbFwiLFxuICAgICAgICAgIGRpc3BsYXlJZDogc2NyZWVuLmRpc3BsYXkuaWQsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChsYXlvdXQgJiYgaW5kZXggIT09IC0xICYmIGlzVGlsZWRBc1NhdmVkKHdpbmRvdywgbGF5b3V0LCBpbmRleCkpIHtcbiAgICAgICAgcmV0dXJuIHNhdmVkUGxhY2VtZW50T2YobGF5b3V0LndpbmRvd3NbaW5kZXhdKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2F2ZWQgPSBzYXZlZFdpbmRvd09mKHdpbmRvdyk7XG5cbiAgICAgIHJldHVybiBzYXZlZCA/IHNhdmVkUGxhY2VtZW50T2Yoc2F2ZWQpIDogdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICAvLyBUaGUga2V5IG9mIHRoZSBzZWxlY3RlZCBsYXlvdXQncyB3aW5kb3cgYSB3aW5kb3cgbm90IG9wZW4gaXM6IGl0cyBvd24sIHdoZW4gdGhlIGxheW91dCBoYXMgaXQsXG4gICAgLy8gb3IgdGhlIG9uZSBpdCB3YXMgb3BlbmVkIGFnYWluIGFzIGJlZm9yZS5cbiAgICBjb25zdCBzdGFuZHNGb3JPZiA9ICh3aW5kb3c6IFBsYW5uZWRXaW5kb3cpID0+IHtcbiAgICAgIGNvbnN0IHNhdmVkID0gc2F2ZWRXaW5kb3dPZih3aW5kb3cpO1xuXG4gICAgICBpZiAoc2F2ZWQpIHtcbiAgICAgICAgcmV0dXJuIGtleU9mV2luZG93KHNhdmVkLndpbmRvdyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhcyA9IChrZXk6IHN0cmluZykgPT5cbiAgICAgICAgbW9kZWwuc2VsZWN0ZWRMYXlvdXRcbiAgICAgICAgICAuZ2V0KClcbiAgICAgICAgICA/LndpbmRvd3Muc29tZSgoaXQpID0+IGtleU9mV2luZG93KGl0LndpbmRvdykgPT09IGtleSk7XG5cbiAgICAgIHJldHVybiBoYXMod2luZG93LmtleSlcbiAgICAgICAgPyB3aW5kb3cua2V5XG4gICAgICAgIDogKGxpbmVhZ2UuZ2V0KCk/LmdldChsaW5lYWdlS2V5KHNlbGVjdGVkLmdldCgpID8/IFwiXCIsIHdpbmRvdy5rZXkpKSA/P1xuICAgICAgICAgICAgcHJlZGVjZXNzb3JzT2ZLZXkod2luZG93LmtleSkuZmluZChoYXMpID8/XG4gICAgICAgICAgICB3aW5kb3cua2V5KTtcbiAgICB9O1xuXG4gICAgLy8gVGhlIGxheW91dCdzIHdpbmRvdyBhIHdpbmRvdyBub3Qgb3BlbiBzdGFuZHMgZm9yLCB3aGVuIGl0IHdhcyBtaXNzaW5nIGZyb20gdGhlIHN0YXJ0LlxuICAgIGNvbnN0IHNhdmVkV2luZG93T2YgPSAod2luZG93OiBQbGFubmVkV2luZG93KSA9PlxuICAgICAgd2luZG93LmtleS5zdGFydHNXaXRoKFwibWlzc2luZzpcIilcbiAgICAgICAgPyBzYXZlZFdpbmRvd09mS2V5KFxuICAgICAgICAgICAgbW9kZWwuc2VsZWN0ZWRMYXlvdXQuZ2V0KCk/LndpbmRvd3MgPz8gW10sXG4gICAgICAgICAgICB3aW5kb3cua2V5LFxuICAgICAgICAgIClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBPcGVucyB0aGUgcGxhY2UgaW4gYSB3aW5kb3cgb2YgaXRzIG93biBpbiB0aGUgY2VsbDogaXRzIHRpbGUgaXMgdGhlcmUgZnJvbSB0aGUgc3RhcnQsIHNob3dpbmdcbiAgICAvLyBpdCBiZWluZyBvcGVuZWQsIGFuZCB0aGUgd2luZG93IGlzIGNyZWF0ZWQgb3ZlciB0aGUgY2VsbCwgbmV2ZXIgbW92ZWQgdGhlcmUgb25jZSBzaG93bi4gVGhlXG4gICAgLy8gdGlsZSBpcyB0aGUgd2luZG93IGFzIHNvb24gYXMgTGVucyBsaXN0cyBpdCwgYnkgdGhlIHdpbmRvdydzIG93biBrZXksIGJlZm9yZSBpdCBzaG93cy5cbiAgICBjb25zdCBvcGVuUGxhY2VJbkNlbGwgPSBhc3luYyAocGxhY2U6IFBsYWNlLCBjZWxsOiBDZWxsLCB0aXRsZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBpZCA9IGAke0RhdGUubm93KCl9LSR7bmV4dFBsYWNlV2luZG93Kyt9YDtcbiAgICAgIGNvbnN0IGtleSA9IGAke29wZW5pbmdQcmVmaXh9JHtpZH1gO1xuICAgICAgY29uc3Qgc2NyZWVuID0gdGlsaW5nUGxhbi5yZXNvbHZlZFxuICAgICAgICAuZ2V0KClcbiAgICAgICAgLnNjcmVlbnMuZmluZCgoaXQpID0+IGl0LmRpc3BsYXkuaWQgPT09IGNlbGwuZGlzcGxheUlkKTtcblxuICAgICAgY29uc3QgYm91bmRzID1cbiAgICAgICAgc2NyZWVuICYmXG4gICAgICAgIGJvdW5kc0luR3JpZChcbiAgICAgICAgICBzY3JlZW4uZGlzcGxheS53b3JrQXJlYS5nZXQoKSxcbiAgICAgICAgICBzY3JlZW4uY29sdW1ucyxcbiAgICAgICAgICBzY3JlZW4ucm93cyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2x1bW46IGNlbGwuY29sdW1uLFxuICAgICAgICAgICAgcm93OiBjZWxsLnJvdyxcbiAgICAgICAgICAgIGNvbHVtbnM6IDEsXG4gICAgICAgICAgICByb3dzOiAxLFxuICAgICAgICAgIH0gYXMgUGxhY2VkV2luZG93LFxuICAgICAgICApO1xuXG4gICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgIHRpbGluZ1BsYW4ucGxhY2VPcGVuaW5nKGtleSwgdGl0bGUsIGNlbGwpO1xuICAgICAgICB0aWxpbmdDaGFuZ2VkLnNldCh0cnVlKTtcbiAgICAgICAgb3BlbmluZy5hZGQoa2V5KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBUaGUgdGlsZSdzIGtleSB1bnRpbCBMZW5zIHRlbGxzIHdoaWNoIHdpbmRvdyBpdCBpcywgdGhlbiB0aGUgd2luZG93J3Mgb3duLlxuICAgICAgbGV0IHRpbGUgPSBrZXk7XG5cbiAgICAgIC8vIEZhaWxpbmcgdGVsbHMgd2h5LCBvbmNlIGFza2VkIGJlbG93OiB3aGF0IGl0IHNldHRsZXMgdG8sIG5vdCBhIHJlamVjdGlvbiBsZWZ0IHVuaGFuZGxlZFxuICAgICAgLy8gd2hpbGUgTGVucyBpcyBhc2tlZCBmb3IgdGhlIHdpbmRvdy5cbiAgICAgIGNvbnN0IGZhaWx1cmUgPSBvcGVuUGxhY2Uoe1xuICAgICAgICBpZCxcbiAgICAgICAgcGFyYW1zOiBwbGFjZSxcbiAgICAgICAgLi4uKGJvdW5kc1xuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBwbGFjZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICBib3VuZHMsXG4gICAgICAgICAgICAgICAgc3RhdGU6IFwibm9ybWFsXCIsXG4gICAgICAgICAgICAgICAgZGlzcGxheUlkOiBjZWxsLmRpc3BsYXlJZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0pLnRoZW4oXG4gICAgICAgICgpID0+IHVuZGVmaW5lZCxcbiAgICAgICAgKGVycm9yOiB1bmtub3duKSA9PiAoeyBlcnJvciB9KSxcbiAgICAgICk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoZSB3aW5kb3cgTGVucyBzaG93cyB0aGUgcGxhY2UgaW4sIGxpc3RlZCB1bmRlciBhbiBpZCBvZiBMZW5zJ3Mgb3duOiBhbnN3ZXJlZCBhcyBzb29uIGFzXG4gICAgICAgIC8vIGl0IGlzIGxpc3RlZCwgYmVmb3JlIGl0IHNob3dzOyBub25lIHdoZW4gdGhlIG9wZW5pbmcgZmFpbGVkIGJlZm9yZSBjaG9vc2luZyBvbmUuXG4gICAgICAgIGNvbnN0IHNob3duID0gYXdhaXQgd2luZG93UmVjb3JkT2Yoe1xuICAgICAgICAgIGtpbmQ6IGdldFN1YldpbmRvd0tpbmRJZChwbGFjZXNTdWJXaW5kb3dLaW5kLCBkaS5zY29wZUlkcyksXG4gICAgICAgICAgaWQsXG4gICAgICAgIH0gYXMgV2luZG93SWQpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG5cbiAgICAgICAgaWYgKHNob3duKSB7XG4gICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgdGlsaW5nUGxhbi5yZWtleShrZXksIHNob3duLndpbmRvdyk7XG4gICAgICAgICAgICBvcGVuaW5nLmRlbGV0ZShrZXkpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGlsZSA9IGtleU9mV2luZG93KHNob3duLndpbmRvdyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmYWlsZWQgPSBhd2FpdCBmYWlsdXJlO1xuXG4gICAgICAgIC8vIFRvbGQgd2h5IGluIHRoZSBkaWFsb2csIGFzIG5vdGhpbmcgZWxzZSB0ZWxsczogYSB3aW5kb3cgdGhhdCBuZXZlciBzaG93cywgYXMgb25lIG9mIGFcbiAgICAgICAgLy8gY2x1c3RlciBMZW5zIGNhbm5vdCBjb25uZWN0IHRvLCBpcyBub3QgdG9sZCBvZiBvdGhlcndpc2UuIFRoZSBjZWxsIGlzIGxlZnQgZW1wdHkuXG4gICAgICAgIGlmIChmYWlsZWQpIHtcbiAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICB0aWxpbmdQbGFuLmZvcmdldCh0aWxlKTtcbiAgICAgICAgICAgIHN0YXR1cy5zZXQoXG4gICAgICAgICAgICAgIGBDb3VsZCBub3Qgb3BlbiBcIiR7dGl0bGV9XCI6ICR7ZmFpbGVkLmVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBmYWlsZWQuZXJyb3IubWVzc2FnZSA6IFN0cmluZyhmYWlsZWQuZXJyb3IpfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCFzaG93bikge1xuICAgICAgICAgIC8vIE9wZW5lZCwgYnV0IGludG8gbm8gd2luZG93IExlbnMgdGVsbHMgb2YsIGFzIHdoaWxlIHdpbmRvd3MgbWF5IG5vdCBiZSBhcnJhbmdlZC5cbiAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB0aWxpbmdQbGFuLmZvcmdldChrZXkpKTtcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4gb3BlbmluZy5kZWxldGUoa2V5KSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFRpbGVzIHRoZSB3aW5kb3dzIGFzIHRoZSBwbGFuIGhhcyB0aGVtIG9uY2UgdGhlIGVkaXRzIHRvIGl0IHBhdXNlLCBhcyBhIGZldyBjbGlja3MgaW4gYSByb3cuXG4gICAgbGV0IHRpbGVUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCB0aWxlU29vbiA9ICgpID0+IHtcbiAgICAgIGNhbmNlbCh0aWxlVGltZXIpO1xuICAgICAgdGlsZVRpbWVyID0gbGF0ZXIoKCkgPT4gdm9pZCBtb2RlbC50aWxlKCksIDMwMCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHNob3dUaWxpbmdPZiA9IGFjdGlvbigobmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBzZWxlY3RlZC5zZXQobmFtZSk7XG4gICAgICB0aWxpbmdDaGFuZ2VkLnNldChmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBDaGFuZ2VzIHRoZSBob3RiYXIsIHRlbGxpbmcgd2hlbiBpdCBjb3VsZCBub3QgYmU6IHRoZSBsYXlvdXQgaXMgcmVuYW1lZCBvciBkZWxldGVkIGFueXdheS5cbiAgICBjb25zdCBmb2xsb3dJbkhvdGJhciA9IGFzeW5jIChmb2xsb3c6ICgpID0+IFByb21pc2U8dm9pZD4pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZvbGxvdygpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT5cbiAgICAgICAgICBzdGF0dXMuc2V0KFxuICAgICAgICAgICAgYENvdWxkIG5vdCBjaGFuZ2UgdGhlIGhvdGJhcjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBtb2RlbCA9IHtcbiAgICAgIGxheW91dHMsXG4gICAgICBzdGF0dXMsXG5cbiAgICAgIC8vIFRoZSBwbGFjZXMgaW4gdGhlIGxheW91dCBvZiBpdHMgd2luZG93cyBvcGVuIG5vdyBidXQgbm90IHdoZXJlIG9yIGFzIGl0IHNhdmVkIHRoZW0uXG4gICAgICBub3RTYXZlZE9mOiAobGF5b3V0OiBTYXZlZFdpbmRvd0xheW91dCk6IFJlYWRvbmx5U2V0PG51bWJlcj4gPT4ge1xuICAgICAgICBjb25zdCBvcGVuID0gb3BlbldpbmRvd3NPZihsYXlvdXQpO1xuICAgICAgICBjb25zdCBpblRpbGVzID0gdGlsZUJvdW5kc09mKGxheW91dCwgZGlzcGxheXMuZ2V0KCkpO1xuXG4gICAgICAgIHJldHVybiBuZXcgU2V0KFxuICAgICAgICAgIGxheW91dC53aW5kb3dzLmZsYXRNYXAoKHNhdmVkLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVjb3JkID0gb3Blbi5nZXQoc2F2ZWQpO1xuXG4gICAgICAgICAgICByZXR1cm4gcmVjb3JkICYmICFpc1Nob3duQXNTYXZlZChyZWNvcmQsIHNhdmVkLCBpblRpbGVzLmdldChpbmRleCkpXG4gICAgICAgICAgICAgID8gW2luZGV4XVxuICAgICAgICAgICAgICA6IFtdO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSxcblxuICAgICAgLy8gVGhlIHBsYWNlcyBpbiB0aGUgbGF5b3V0IG9mIGl0cyB3aW5kb3dzIG5vdCBvcGVuIG5vdy5cbiAgICAgIG5vdE9wZW5PZjogKGxheW91dDogU2F2ZWRXaW5kb3dMYXlvdXQpOiBSZWFkb25seVNldDxudW1iZXI+ID0+IHtcbiAgICAgICAgY29uc3Qgb3BlbiA9IG9wZW5XaW5kb3dzT2YobGF5b3V0KTtcblxuICAgICAgICByZXR1cm4gbmV3IFNldChcbiAgICAgICAgICBsYXlvdXQud2luZG93cy5mbGF0TWFwKChzYXZlZCwgaW5kZXgpID0+XG4gICAgICAgICAgICBvcGVuLmhhcyhzYXZlZCkgPyBbXSA6IFtpbmRleF0sXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIFdoZXRoZXIgdGhlIGxheW91dCBpcyBwaW5uZWQgdG8gdGhlIGhvdGJhcidzIGN1cnJlbnQgcGFnZSwgYW5kIHBpbm5pbmcgb3IgdW5waW5uaW5nIGl0LlxuICAgICAgaXNQaW5uZWQ6IGxheW91dEluSG90YmFyLmlzUGlubmVkLFxuICAgICAgdG9nZ2xlUGlubmVkOiAobmFtZTogc3RyaW5nKSA9PlxuICAgICAgICBmb2xsb3dJbkhvdGJhcigoKSA9PiBsYXlvdXRJbkhvdGJhci50b2dnbGUobmFtZSkpLFxuXG4gICAgICAvLyBXaXRob3V0IExlbnMgU3R1ZGlvIExlbnMgbGlzdHMgbm8gd2luZG93cywgYW5kIG5vdGhpbmcgY2FuIGJlIGFycmFuZ2VkLlxuICAgICAgY2FuQXJyYW5nZTogY29tcHV0ZWQoKCkgPT4gd2luZG93cy5nZXQoKS5sZW5ndGggPiAwKSxcblxuICAgICAgLy8gSG93IG1hbnkgc2NyZWVucyB0aGUgbGF5b3V0J3MgdGlsaW5nIGhhcyB3aW5kb3dzIG9uIHRoYXQgYXJlIG5vdCBjb25uZWN0ZWQgbm93LlxuICAgICAgbWlzc2luZ1NjcmVlbnNPZjogKGxheW91dDogU2F2ZWRXaW5kb3dMYXlvdXQpID0+XG4gICAgICAgIG1vZGVsLm1pc3NpbmdTY3JlZW5JZHNPZihsYXlvdXQpLnNpemUsXG5cbiAgICAgIC8vIFRoZSBpZHMgb2YgdGhlIHNjcmVlbnMgdGhlIGxheW91dCdzIHRpbGluZyBoYXMgd2luZG93cyBvbiB0aGF0IGFyZSBub3QgY29ubmVjdGVkIG5vdy5cbiAgICAgIG1pc3NpbmdTY3JlZW5JZHNPZjogKGxheW91dDogU2F2ZWRXaW5kb3dMYXlvdXQpOiBSZWFkb25seVNldDxzdHJpbmc+ID0+IHtcbiAgICAgICAgY29uc3QgY29ubmVjdGVkID0gbmV3IFNldChkaXNwbGF5cy5nZXQoKS5tYXAoKGRpc3BsYXkpID0+IGRpc3BsYXkuaWQpKTtcbiAgICAgICAgY29uc3QgdXNlZCA9IG5ldyBTZXQoXG4gICAgICAgICAgbGF5b3V0LnRpbGluZz8ud2luZG93cy5tYXAoKGl0KSA9PiBpdC5kaXNwbGF5SWQpID8/IFtdLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEEgc2NyZWVuIGNvbm5lY3RlZCBhZ2FpbiB1bmRlciBhbm90aGVyIGlkIGlzIG5vdCBtaXNzaW5nLlxuICAgICAgICByZXR1cm4gbmV3IFNldChcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhsYXlvdXQudGlsaW5nPy5zY3JlZW5zID8/IHt9KVxuICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgKFtpZCwgc2NyZWVuXSkgPT5cbiAgICAgICAgICAgICAgICB1c2VkLmhhcyhOdW1iZXIoaWQpKSAmJlxuICAgICAgICAgICAgICAgICFjb25uZWN0ZWQuaGFzKE51bWJlcihpZCkpICYmXG4gICAgICAgICAgICAgICAgcmVjb25uZWN0ZWRJZE9mKGlkLCBzY3JlZW4sIGRpc3BsYXlzLmdldCgpKSA9PT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm1hcCgoW2lkXSkgPT4gaWQpLFxuICAgICAgICApO1xuICAgICAgfSxcblxuICAgICAgcmVzZXQ6IGFjdGlvbigoKSA9PiB7XG4gICAgICAgIHJlbmFtaW5nLnNldCh1bmRlZmluZWQpO1xuICAgICAgICBzdGF0dXMuc2V0KHVuZGVmaW5lZCk7XG4gICAgICB9KSxcblxuICAgICAgLy8gU2F2ZXMgdGhlIHdpbmRvd3MgYXMgdGhleSBhcmUgbm93IGFzIGEgbmV3IGxheW91dCBvZiBhIG5hbWUgb2YgaXRzIG93biwgZXZlcnkgd2luZG93IGxlZnRcbiAgICAgIC8vIG91dCBvZiB0aWxpbmcsIGFuZCBzZWxlY3RzIGl0LlxuICAgICAgY3JlYXRlOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICghbW9kZWwuY2FuQXJyYW5nZS5nZXQoKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5hbWUgPSBuZXh0TGF5b3V0TmFtZShsYXlvdXRzLmdldCgpPy5tYXAoKGl0KSA9PiBpdC5uYW1lKSA/PyBbXSk7XG5cbiAgICAgICAgLy8gQSBuZXcgbGF5b3V0IHN0YXJ0cyB3aXRoIGV2ZXJ5IHdpbmRvdyBsZWZ0IGFzIGl0IGlzLCBmb3IgVGlsZSBhbGwgb3IgZHJhZ2dpbmcgdG8gcGxhY2UuXG4gICAgICAgIHRpbGluZ1BsYW4ubGVhdmVBbGxBc1RoZXlBcmUoKTtcbiAgICAgICAgYXdhaXQgc2F2ZVdpbmRvd0xheW91dChuYW1lKTtcblxuICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgc2hvd1RpbGluZ09mKG5hbWUpO1xuICAgICAgICAgIHN0YXR1cy5zZXQodW5kZWZpbmVkKTtcbiAgICAgICAgICAvLyBJdHMgbmFtZSByZWFkeSB0byBiZSB0eXBlZCBvdmVyLCBhcyBhIG5ldyBsYXlvdXQgaXMgdG8gYmUgbmFtZWQuXG4gICAgICAgICAgcmVuYW1pbmcuc2V0KG5hbWUpO1xuICAgICAgICAgIHJlbmFtZURyYWZ0LnNldChuYW1lKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICAvLyBDb3BpZXMgdGhlIHNlbGVjdGVkIGxheW91dCBhcyBzYXZlZCwgaXRzIHRpbGluZyB3aXRoIGl0LCBhbmQgc2VsZWN0cyB0aGUgY29weSwgaXRzIG5hbWUgcmVhZHlcbiAgICAgIC8vIHRvIGJlIHR5cGVkIG92ZXIgYXMgYSBuZXcgbGF5b3V0J3MgaXMuXG4gICAgICBkdXBsaWNhdGU6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZnJvbSA9IHNlbGVjdGVkLmdldCgpO1xuICAgICAgICBjb25zdCBuYW1lID0gZnJvbSAmJiAoYXdhaXQgZHVwbGljYXRlV2luZG93TGF5b3V0KGZyb20pKTtcblxuICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBtb2RlbC5zZWxlY3QobmFtZSk7XG5cbiAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgIHJlbmFtaW5nLnNldChuYW1lKTtcbiAgICAgICAgICByZW5hbWVEcmFmdC5zZXQobmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcblxuICAgICAgLy8gU2F2ZXMgdGhlIHdpbmRvd3MgYXMgdGhleSBhcmUgbm93LCBhbmQgdGhlIHRpbGluZyBiZWxvdywgb3ZlciB0aGUgc2VsZWN0ZWQgbGF5b3V0LlxuICAgICAgc2F2ZU92ZXI6IGFzeW5jIChcbiAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICBvcHRpb25zOiB7IHJlYWRvbmx5IHRpbGVkT25seT86IGJvb2xlYW4gfSA9IHt9LFxuICAgICAgKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gYXdhaXQgc2F2ZVdpbmRvd0xheW91dChuYW1lLCBvcHRpb25zKTtcblxuICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgc2hvd1RpbGluZ09mKG5hbWUpO1xuICAgICAgICAgIC8vIFNhdmVkIHdoZXJlIHRoZXkgYXJlLCB0aGUgd2luZG93cyBhcmUgaW4gcGxhY2U6IHRoZWlyIHRpbGVzIHN0YW5kIGZvciB0aGVtIGFzIHRoZXkgYXJlLlxuICAgICAgICAgIGFjY2VwdFdoZXJlV2luZG93c0FyZSgpO1xuICAgICAgICAgIHN0YXR1cy5zZXQodW5kZWZpbmVkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2hvd1NhdmVkKFxuICAgICAgICAgIG9wdGlvbnMudGlsZWRPbmx5XG4gICAgICAgICAgICA/IGBTYXZlZCB0aGUgJHtwbHVyYWwoY291bnQsIFwidGlsZWQgd2luZG93XCIpfSBhbmQgdGhlIHRpbGluZy5gXG4gICAgICAgICAgICA6IGBTYXZlZCAke3BsdXJhbChjb3VudCwgXCJ3aW5kb3dcIil9IGFuZCB0aGUgdGlsaW5nLmAsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgICAgfSxcblxuICAgICAgLy8gVGlsZXMgdGhlIHdpbmRvd3MgYXMgdGhlIGxheW91dCdzIHRpbGluZyBoYXMgdGhlbSBhbmQgc2F2ZXMgdGhlbSBzbyBpbnRvIGl0LCBmcm9tIG91dHNpZGVcbiAgICAgIC8vIHRoZSBkaWFsb2csIGFzIGZyb20gdGhlIGhvdGJhcjogd2l0aCBpdHMgb3duIHRpbGluZywgbG9hZGVkIGZpcnN0IHVubGVzcyBpdCBpcyB0aGUgb25lIHNob3duLFxuICAgICAgLy8gZWRpdHMgYW5kIGFsbC4gQSB3aW5kb3cgdGhlIHRpbGluZyBoYXMgbm90LCBhcyBvbmUgb3BlbmVkIHNpbmNlLCBpcyBzYXZlZCBhcyBub3QgdGlsZWQuXG4gICAgICAvLyBOb3RoaW5nIGlzIHNhdmVkIHdoZW4gdGhlcmUgaXMgbm8gc3VjaCBsYXlvdXQsIG9yIHRoZSB3aW5kb3dzIGNvdWxkIG5vdCBiZSB0aWxlZC5cbiAgICAgIHRpbGVBbmRTYXZlSW50bzogYXN5bmMgKFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICApOiBQcm9taXNlPG51bWJlciB8IFwibm8tbGF5b3V0XCIgfCBcIm5vdC10aWxlZFwiPiA9PiB7XG4gICAgICAgIGlmIChzZWxlY3RlZC5nZXQoKSAhPT0gbmFtZSkge1xuICAgICAgICAgIGF3YWl0IG1vZGVsLnNlbGVjdChuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxlY3RlZC5nZXQoKSAhPT0gbmFtZSkge1xuICAgICAgICAgIHJldHVybiBcIm5vLWxheW91dFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCEoYXdhaXQgbW9kZWwudGlsZSgpKSkge1xuICAgICAgICAgIHJldHVybiBcIm5vdC10aWxlZFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1vZGVsLnNhdmVPdmVyKG5hbWUpO1xuICAgICAgfSxcblxuICAgICAgLy8gUHV0cyB0aGUgd2luZG93cyBiYWNrIHdoZXJlIHRoZSBsYXlvdXQgaGFzIHRoZW0sIGFuZCB0ZWxscyB3aGF0IHdlbnQgb3RoZXJ3aXNlLCBpZiBhbnl0aGluZy5cbiAgICAgIHJlY2FsbDogYXN5bmMgKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBydW5JbkFjdGlvbigoKSA9PiByZW9wZW5pbmcuc2V0KHRydWUpKTtcblxuICAgICAgICAvLyBUaGUgdGlsZSBvZiBhIHdpbmRvdyBvZiB0aGUgbGF5b3V0IG5vdCBvcGVuLCBtaXNzaW5nIGZyb20gdGhlIHN0YXJ0IG9yIGNsb3NlZCBzaW5jZS5cbiAgICAgICAgLy8gQnkgdGhlIHdpbmRvdydzIG93biBrZXksIHdoYXRldmVyIHBsYWNlIGluIHRoZSBsYXlvdXQgaXRzIHRpbGUncyBrZXkgd2FzIG1hZGUgd2l0aC5cbiAgICAgICAgY29uc3QgbWlzc2luZ1RpbGVPZiA9IChzYXZlZDogU2F2ZWRXaW5kb3cpID0+IHtcbiAgICAgICAgICBjb25zdCBwbGFuID0gdGlsaW5nUGxhbi5yZXNvbHZlZC5nZXQoKTtcblxuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAuLi5wbGFuLnNjcmVlbnMuZmxhdE1hcCgoc2NyZWVuKSA9PiBzY3JlZW4ud2luZG93cyksXG4gICAgICAgICAgICAuLi5wbGFuLnVudGlsZWQsXG4gICAgICAgICAgXS5maW5kKFxuICAgICAgICAgICAgKGl0KSA9PlxuICAgICAgICAgICAgICBpdC5taXNzaW5nICYmXG4gICAgICAgICAgICAgIChzYXZlZFdpbmRvd09mS2V5KFtzYXZlZF0sIGl0LmtleSkgPT09IHNhdmVkIHx8XG4gICAgICAgICAgICAgICAgLy8gQSB0aWxlIGdvaW5nIGJ5IGEgd2luZG93IG9wZW5lZCBhZ2FpbiBhcyB0aGUgbGF5b3V0J3MsIGNsb3NlZCBzaW5jZS5cbiAgICAgICAgICAgICAgICAoc2VsZWN0ZWQuZ2V0KCkgPT09IG5hbWUgJiZcbiAgICAgICAgICAgICAgICAgIHN0YW5kc0Zvck9mKGl0KSA9PT0ga2V5T2ZXaW5kb3coc2F2ZWQud2luZG93KSkpLFxuICAgICAgICAgICk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVGhlIHRpbGUgb2YgZWFjaCB3aW5kb3cgYmVpbmcgb3BlbmVkIGFnYWluLCBieSB0aGUgbGF5b3V0J3Mgd2luZG93LlxuICAgICAgICBjb25zdCB0aWxlcyA9IG5ldyBNYXA8U2F2ZWRXaW5kb3csIHN0cmluZz4oKTtcblxuICAgICAgICAvLyBFYWNoIHdpbmRvdyBvcGVuZWQgYWdhaW4gaXMgaXRzIHRpbGUgYXMgc29vbiBhcyBMZW5zIGFuc3dlcnMgd2l0aCBpdDsgb25lIExlbnMgYW5zd2Vyc1xuICAgICAgICAvLyBub25lIGZvciBzdGF5cyBub3Qgb3BlbiBpbiBpdC5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVjYWxsV2luZG93TGF5b3V0KG5hbWUsIHtcbiAgICAgICAgICByZW9wZW5pbmc6IChzYXZlZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGlsZSA9IG1pc3NpbmdUaWxlT2Yoc2F2ZWQpO1xuXG4gICAgICAgICAgICBpZiAodGlsZSkge1xuICAgICAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGlsZXMuc2V0KHNhdmVkLCB0aWxlLmtleSk7XG4gICAgICAgICAgICAgICAgb3BlbmluZy5hZGQodGlsZS5rZXkpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlb3BlbmVkOiAoc2F2ZWQsIF9pbmRleCwgd2luZG93KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSB0aWxlcy5nZXQoc2F2ZWQpO1xuXG4gICAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICBvcGVuaW5nLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKHdpbmRvdyAmJiBrZXkpIHtcbiAgICAgICAgICAgICAgICB0aWxpbmdQbGFuLnJla2V5KGtleSwgd2luZG93KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aW5kb3cpIHtcbiAgICAgICAgICAgICAgICByZWNhbGxlZC5hZGQoa2V5T2ZXaW5kb3cod2luZG93KSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgLy8gVGhlIHJlY2FsbCdzIHBsYW4gaGFzIGV2ZXJ5IHdpbmRvdyBieSBpdHMgb3duIGtleSwgaW4gdGhlIG9uZSBzdGVwLlxuICAgICAgICAgIHBsYWNlZDogKCkgPT5cbiAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgcmVjYWxsZWQuY2xlYXIoKTtcbiAgICAgICAgICAgICAgcmVvcGVuaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSkuZmluYWxseSgoKSA9PlxuICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRpbGVzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAgIG9wZW5pbmcuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlY2FsbGVkLmNsZWFyKCk7XG4gICAgICAgICAgICByZW9wZW5pbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBzaG93VGlsaW5nT2YobmFtZSk7XG5cbiAgICAgICAgY29uc3Qgbm90ZXMgPSBbXG4gICAgICAgICAgLi4uKHJlc3VsdC5zY3JlZW5zQ2hhbmdlZFxuICAgICAgICAgICAgPyBbXCJ0aGUgc2NyZWVucyBhcmUgbm90IHRoZSBvbmVzIGl0IHdhcyBzYXZlZCBvblwiXVxuICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAgLi4uKHJlc3VsdC5tb3ZlZFRvUHJpbWFyeS5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICBgbW92ZWQgb250byB0aGUgcHJpbWFyeSBzY3JlZW4sIGFzIHRoZWlyIHBsYWNlIGlzIG9uIG5vIHNjcmVlbiBub3c6ICR7cmVzdWx0Lm1vdmVkVG9QcmltYXJ5LmpvaW4oXCIsIFwiKX1gLFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICAuLi4ocmVzdWx0Lm5vdE9wZW4ubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgYGNsb3NlZCwgYW5kIGNvdWxkIG5vdCBiZSBvcGVuZWQgYWdhaW46ICR7cmVzdWx0Lm5vdE9wZW4uam9pbihcIiwgXCIpfWAsXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIDogW10pLFxuICAgICAgICBdO1xuXG4gICAgICAgIGNvbnN0IG5vdGUgPVxuICAgICAgICAgIG5vdGVzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgID8gYFJlY2FsbGVkIFwiJHtuYW1lfVwiLCBwbGFjaW5nICR7cGx1cmFsKHJlc3VsdC5wbGFjZWQsIFwid2luZG93XCIpfS4gTm90ZTogJHtub3Rlcy5qb2luKFwiOyBcIil9LmBcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHN0YXR1cy5zZXQobm90ZSkpO1xuXG4gICAgICAgIC8vIFdoYXQgd2VudCBvdGhlcndpc2UsIGZvciB3aG9ldmVyIHJlY2FsbGVkIGl0IGZyb20gb3V0c2lkZSB0aGUgZGlhbG9nIHRvIHRlbGwuXG4gICAgICAgIHJldHVybiBub3RlO1xuICAgICAgfSxcblxuICAgICAgcmVuYW1pbmcsXG4gICAgICByZW5hbWVEcmFmdCxcbiAgICAgIGNhblJlbmFtZTogY29tcHV0ZWQoKCkgPT4gcmVuYW1lRHJhZnQuZ2V0KCkudHJpbSgpICE9PSBcIlwiKSxcblxuICAgICAgc3RhcnRSZW5hbWluZzogYWN0aW9uKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmVuYW1pbmcuc2V0KG5hbWUpO1xuICAgICAgICByZW5hbWVEcmFmdC5zZXQobmFtZSk7XG4gICAgICB9KSxcblxuICAgICAgc2V0UmVuYW1lRHJhZnQ6IGFjdGlvbigobmFtZTogc3RyaW5nKSA9PiByZW5hbWVEcmFmdC5zZXQobmFtZSkpLFxuICAgICAgY2FuY2VsUmVuYW1pbmc6IGFjdGlvbigoKSA9PiByZW5hbWluZy5zZXQodW5kZWZpbmVkKSksXG5cbiAgICAgIC8vIFJlbmFtZXMgdGhlIGxheW91dCB0byB0aGUgbmFtZSB0eXBlZDsgYW4gZW1wdHkgb3IgdW5jaGFuZ2VkIG5hbWUgbGVhdmVzIGl0IGFzIGl0IHdhcy5cbiAgICAgIHJlbmFtZTogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBmcm9tID0gcmVuYW1pbmcuZ2V0KCk7XG4gICAgICAgIGNvbnN0IHRvID0gcmVuYW1lRHJhZnQuZ2V0KCkudHJpbSgpO1xuXG4gICAgICAgIGlmIChmcm9tID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodG8gPT09IFwiXCIgfHwgdG8gPT09IGZyb20pIHtcbiAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiByZW5hbWluZy5zZXQodW5kZWZpbmVkKSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZW5hbWVXaW5kb3dMYXlvdXQoZnJvbSwgdG8pO1xuXG4gICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBcIm5hbWUtdGFrZW5cIikge1xuICAgICAgICAgICAgc3RhdHVzLnNldChcbiAgICAgICAgICAgICAgYFRoZXJlIGlzIGEgbGF5b3V0IGNhbGxlZCBcIiR7dG99XCIgYWxyZWFkeS4gUGljayBhbm90aGVyIG5hbWUuYCxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZW5hbWluZy5zZXQodW5kZWZpbmVkKTtcblxuICAgICAgICAgIGlmIChyZXN1bHQgPT09IFwicmVuYW1lZFwiICYmIHNlbGVjdGVkLmdldCgpID09PSBmcm9tKSB7XG4gICAgICAgICAgICBzZWxlY3RlZC5zZXQodG8pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHN0YXR1cy5zZXQodW5kZWZpbmVkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gXCJyZW5hbWVkXCIpIHtcbiAgICAgICAgICBhd2FpdCBmb2xsb3dJbkhvdGJhcigoKSA9PiBsYXlvdXRJbkhvdGJhci5yZW5hbWVkKGZyb20sIHRvKSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8vIFRoZSBlZGl0b3IncyBlZGl0cyBtYXJrIHRoZSBzZXR1cCBvZiB0aGUgbGF5b3V0IGl0IHNob3dzIGFzIGNoYW5nZWQsIGFuZCB0aWxlIHRoZSB3aW5kb3dzIHNvLlxuICAgICAgdGlsaW5nUGxhbjoge1xuICAgICAgICAuLi50aWxpbmdQbGFuLFxuICAgICAgICBjb21taXQ6IGFjdGlvbigocGxhbjogUGFyYW1ldGVyczx0eXBlb2YgdGlsaW5nUGxhbi5jb21taXQ+WzBdKSA9PiB7XG4gICAgICAgICAgdGlsaW5nUGxhbi5jb21taXQocGxhbik7XG4gICAgICAgICAgdGlsaW5nQ2hhbmdlZC5zZXQodHJ1ZSk7XG4gICAgICAgICAgdGlsZVNvb24oKTtcbiAgICAgICAgfSksXG4gICAgICAgIGF1dG9UaWxlOiBhY3Rpb24oKCkgPT4ge1xuICAgICAgICAgIHRpbGluZ1BsYW4uYXV0b1RpbGUoKTtcbiAgICAgICAgICB0aWxpbmdDaGFuZ2VkLnNldCh0cnVlKTtcbiAgICAgICAgICB0aWxlU29vbigpO1xuICAgICAgICB9KSxcbiAgICAgIH0sXG5cbiAgICAgIHNlbGVjdGVkLFxuICAgICAgdGlsaW5nQ2hhbmdlZCxcbiAgICAgIHNhdmVkTm90ZSxcbiAgICAgIHNlbGVjdGVkTGF5b3V0OiBjb21wdXRlZCgoKSA9PlxuICAgICAgICBsYXlvdXRzLmdldCgpPy5maW5kKChpdCkgPT4gaXQubmFtZSA9PT0gc2VsZWN0ZWQuZ2V0KCkpLFxuICAgICAgKSxcblxuICAgICAgLy8gV2hldGhlciBzYXZpbmcgdGhlIHNlbGVjdGVkIGxheW91dCB3b3VsZCBjaGFuZ2Ugbm90aGluZzogaXRzIHRpbGluZyBub3QgY2hhbmdlZCBzaW5jZSBpdFxuICAgICAgLy8gd2FzIHNlbGVjdGVkLCBhbmQgdGhlIHdpbmRvd3Mgb3BlbiB0aGUgbGF5b3V0J3MsIGVhY2ggd2hlcmUgYW5kIGFzIGl0IHdhcyBzYXZlZC5cbiAgICAgIC8vIFdoZXRoZXIgc2F2aW5nIHdvdWxkIGNoYW5nZSBub3RoaW5nOiBubyB3aW5kb3cgb3V0IG9mIHBsYWNlLCBvcGVuIG9yIG5vdCwgYW5kIHRoZSB0aWxpbmcgYXNcbiAgICAgIC8vIHNhdmVkLiBBIHdpbmRvdyBvZiB0aGUgbGF5b3V0IG5vdCBvcGVuIGlzIG5vIHJlYXNvbiB0byBzYXZlLCBhcyBzYXZpbmcga2VlcHMgaXQgYXMgaXQgd2FzLlxuICAgICAgLy8gV2hldGhlciB0aGUgbGF5b3V0IHNob3duIGhhcyB3aW5kb3dzIG5vdCB0aWxlZCB0aGF0IHNhdmluZyBvbmx5IHRoZSB0aWxlZCBvbmVzIHdvdWxkIGxlYXZlXG4gICAgICAvLyBvdXQgb2YgaXQ6IG9wZW4gb25lcyBpdCBzYXZlZCwgb3Igb25lcyBub3Qgb3BlbiBpdCBoYXMgc3RpbGwuXG4gICAgICBoYXNVbnRpbGVkVG9MZWF2ZU91dDogY29tcHV0ZWQoKCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCBsYXlvdXQgPSBtb2RlbC5zZWxlY3RlZExheW91dC5nZXQoKTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICEhbGF5b3V0ICYmXG4gICAgICAgICAgdGlsaW5nUGxhbi5yZXNvbHZlZFxuICAgICAgICAgICAgLmdldCgpXG4gICAgICAgICAgICAudW50aWxlZC5zb21lKCh3aW5kb3cpID0+XG4gICAgICAgICAgICAgIHdpbmRvdy5taXNzaW5nXG4gICAgICAgICAgICAgICAgPyBsYXlvdXQud2luZG93cy5zb21lKFxuICAgICAgICAgICAgICAgICAgICAoaXQpID0+IGtleU9mV2luZG93KGl0LndpbmRvdykgPT09IHN0YW5kc0Zvck9mKHdpbmRvdyksXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBzYXZlZFdpbmRvd3NPZi5nZXQoKS5oYXMod2luZG93LnJlY29yZCksXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9KSxcblxuICAgICAgaXNTZWxlY3RlZFNhdmVkOiBjb21wdXRlZCgoKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IGxheW91dCA9IG1vZGVsLnNlbGVjdGVkTGF5b3V0LmdldCgpO1xuXG4gICAgICAgIGNvbnN0IHBsYW4gPSB0aWxpbmdQbGFuLnJlc29sdmVkLmdldCgpO1xuICAgICAgICBjb25zdCBub3RPcGVuID0gW1xuICAgICAgICAgIC4uLnBsYW4uc2NyZWVucy5mbGF0TWFwKChzY3JlZW4pID0+IHNjcmVlbi53aW5kb3dzKSxcbiAgICAgICAgICAuLi5wbGFuLnVudGlsZWQsXG4gICAgICAgIF0uZmlsdGVyKCh3aW5kb3cpID0+IHdpbmRvdy5taXNzaW5nKTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICEhbGF5b3V0Py50aWxpbmcgJiZcbiAgICAgICAgICAhdGlsaW5nQ2hhbmdlZC5nZXQoKSAmJlxuICAgICAgICAgICF3aW5kb3dzLmdldCgpLnNvbWUoaXNVbnNhdmVkKSAmJlxuICAgICAgICAgICFub3RPcGVuLnNvbWUoKHdpbmRvdykgPT4gbW9kZWwuaXNPdXRPZlBsYWNlKHdpbmRvdykpXG4gICAgICAgICk7XG4gICAgICB9KSxcblxuICAgICAgLy8gU2hvd3MgdGhlIGxheW91dCdzIHRpbGluZyBzZXR1cCBpbiB0aGUgZWRpdG9yLCB0aGUgd2luZG93cyBzdGF5aW5nIHdoZXJlIHRoZXkgYXJlLlxuICAgICAgc2VsZWN0OiBhc3luYyAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChzZWxlY3RlZC5nZXQoKSA9PT0gbmFtZSAmJiAhdGlsaW5nQ2hhbmdlZC5nZXQoKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNob3dUaWxpbmdPZihuYW1lKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBsYXlvdXRUaWxpbmcubG9hZChuYW1lKTtcblxuICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkLnNldCh1bmRlZmluZWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aWxpbmdDaGFuZ2VkLnNldChmYWxzZSk7XG4gICAgICAgICAgICBzdGF0dXMuc2V0KHVuZGVmaW5lZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIFRpbGluZyBuZWVkcyBhIHdpbmRvdyBvbiBzb21lIHNjcmVlbi5cbiAgICAgIC8vIFdoZXRoZXIgdGhlIHdpbmRvdyBpcyBub3Qgd2hlcmUgdGhlIHBsYW4gaGFzIGl0OiBlbHNld2hlcmUsIG9yIG5vdCBzaG93biBub3JtYWxseS4gQSB3aW5kb3dcbiAgICAgIC8vIG5vdCBvcGVuLCBvciBvbiBhIHNjcmVlbiBub3QgY29ubmVjdGVkLCBpcyBub3QgdGlsZWQsIGFuZCBpcyBuZXZlciBvZmYgaXRzIHRpbGluZy5cbiAgICAgIGlzT2ZmVGlsaW5nOiAod2luZG93OiBQbGFjZWRXaW5kb3csIHNjcmVlbjogUGxhbm5lZFNjcmVlbik6IGJvb2xlYW4gPT4ge1xuICAgICAgICBpZiAod2luZG93Lm1pc3NpbmcgfHwgc2NyZWVuLm1pc3NpbmcpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBib3VuZHMgPSB3aW5kb3cucmVjb3JkLmJvdW5kcy5nZXQoKTtcbiAgICAgICAgY29uc3QgcGxhbm5lZCA9IGJvdW5kc0luR3JpZChcbiAgICAgICAgICBzY3JlZW4uZGlzcGxheS53b3JrQXJlYS5nZXQoKSxcbiAgICAgICAgICBzY3JlZW4uY29sdW1ucyxcbiAgICAgICAgICBzY3JlZW4ucm93cyxcbiAgICAgICAgICB3aW5kb3csXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHNldHRsZWRBdCA9IHNldHRsZWQuZ2V0KHBsYWNlbWVudE9mKHdpbmRvdywgc2NyZWVuKSk7XG5cbiAgICAgICAgLy8gV2hlcmUgaXQgc2V0dGxlZCwgb3Igd2FzIHNhdmVkLCBpcyBpbiBwbGFjZSBob3dldmVyIGl0IHNob3dzLlxuICAgICAgICBpZiAoc2V0dGxlZEF0ICYmIGlzTmVhcihib3VuZHMsIHNldHRsZWRBdCwgMikpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHdpbmRvdy5yZWNvcmQuc3RhdGUuZ2V0KCkgIT09IFwibm9ybWFsXCIgfHwgIWlzTmVhcihib3VuZHMsIHBsYW5uZWQsIDQpXG4gICAgICAgICk7XG4gICAgICB9LFxuXG4gICAgICAvLyBXaGV0aGVyIHRoZSB3aW5kb3cgZGlmZmVycyBmcm9tIHdoYXQgdGhlIHNlbGVjdGVkIGxheW91dCBzYXZlZCBvZiBpdDogbm90IHdoZXJlIGl0IHdhcywgbm90XG4gICAgICAvLyBzaG93biBhcyBpdCB3YXMsIG9yIG5vdCBzYXZlZCBpbiBpdCBhdCBhbGwsIGFzIG9uZSBvcGVuZWQgc2luY2UsIG9wZW4gb3IgY2xvc2VkIGFnYWluLlxuICAgICAgaXNPdXRPZlBsYWNlOiAoXG4gICAgICAgIHdpbmRvdzogUGxhbm5lZFdpbmRvdyxcbiAgICAgICAgX3NjcmVlbj86IFBsYW5uZWRTY3JlZW4sXG4gICAgICApOiBib29sZWFuID0+IHtcbiAgICAgICAgY29uc3QgbGF5b3V0ID0gbW9kZWwuc2VsZWN0ZWRMYXlvdXQuZ2V0KCk7XG5cbiAgICAgICAgaWYgKCFsYXlvdXQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3Qgb3BlbiwgaXQgZGlmZmVycyBmcm9tIHdoYXQgd2FzIHNhdmVkIHdoZW4gdGhlIGxheW91dCBoYXMgaXQgbm90IGF0IGFsbCwgYXMgb25lIG9wZW5lZFxuICAgICAgICAvLyBhZnRlciBzYXZpbmcgYW5kIGNsb3NlZCBzaW5jZSwgb3Igd2hlbiBpdHMgdGlsZSBpcyBub3Qgd2hlcmUgdGhlIGxheW91dCdzIHRpbGluZyBoYXMgaXQ6XG4gICAgICAgIC8vIG1vdmVkLCByZXNpemVkLCBvciB0aWxlZCBvciBub3QgdW5saWtlIHRoZW4uIFdoZXJlIHRoZSB3aW5kb3cgaXRzZWxmIGlzIGNhbm5vdCBkaWZmZXIuXG4gICAgICAgIGlmICh3aW5kb3cubWlzc2luZykge1xuICAgICAgICAgIGNvbnN0IGtleSA9IHN0YW5kc0Zvck9mKHdpbmRvdyk7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBsYXlvdXQud2luZG93cy5maW5kSW5kZXgoXG4gICAgICAgICAgICAoaXQpID0+IGtleU9mV2luZG93KGl0LndpbmRvdykgPT09IGtleSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmV0dXJuIGluZGV4ID09PSAtMSB8fCAhaXNUaWxlZEFzU2F2ZWQod2luZG93LCBsYXlvdXQsIGluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpc1Vuc2F2ZWQod2luZG93LnJlY29yZCk7XG4gICAgICB9LFxuXG4gICAgICAvLyBXaGV0aGVyIGV2ZXJ5IHdpbmRvdyBpcyB3aGVyZSB0aGUgcGxhbiBoYXMgaXQgYWxyZWFkeS5cbiAgICAgIGlzVGlsZWRBc1Nob3duOiBjb21wdXRlZCgoKTogYm9vbGVhbiA9PlxuICAgICAgICB0aWxlZFdpbmRvd3NPZih0aWxpbmdQbGFuLnJlc29sdmVkLmdldCgpKS5ldmVyeShcbiAgICAgICAgICAoeyB3aW5kb3csIHNjcmVlbiB9KSA9PiAhbW9kZWwuaXNPZmZUaWxpbmcod2luZG93LCBzY3JlZW4pLFxuICAgICAgICApLFxuICAgICAgKSxcblxuICAgICAgLy8gVGlsaW5nIG5lZWRzIGEgd2luZG93IHRvIHRpbGUsIGFuZCBzb21ldGhpbmcgdG8gY2hhbmdlLlxuICAgICAgY2FuVGlsZTogY29tcHV0ZWQoXG4gICAgICAgICgpOiBib29sZWFuID0+XG4gICAgICAgICAgbW9kZWwuY2FuQXJyYW5nZS5nZXQoKSAmJlxuICAgICAgICAgIHRpbGluZ1BsYW4ucmVzb2x2ZWRcbiAgICAgICAgICAgIC5nZXQoKVxuICAgICAgICAgICAgLnNjcmVlbnMuc29tZShcbiAgICAgICAgICAgICAgKGl0KSA9PlxuICAgICAgICAgICAgICAgICFpdC5taXNzaW5nICYmIGl0LndpbmRvd3Muc29tZSgod2luZG93KSA9PiAhd2luZG93Lm1pc3NpbmcpLFxuICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICFtb2RlbC5pc1RpbGVkQXNTaG93bi5nZXQoKSxcbiAgICAgICksXG5cbiAgICAgIHRpbGU6IGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aWxlV2luZG93cygpO1xuICAgICAgICAgIC8vIE5ldmVyIGVuZHMgb25jZSB0aGUgbW9kZWwgaXMgdGhyb3duIGF3YXksIHNvIG5vdGhpbmcgaXMgdGFrZW4gZnJvbSB3aW5kb3dzIHRoZW4uXG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+XG4gICAgICAgICAgICBsYXRlcigoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCksIHNldHRsZU1zKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgYWNjZXB0V2hlcmVXaW5kb3dzQXJlKCk7XG4gICAgICAgICAgICBzdGF0dXMuc2V0KHVuZGVmaW5lZCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PlxuICAgICAgICAgICAgc3RhdHVzLnNldChgQ291bGQgbm90IHRpbGUgdGhlIHdpbmRvd3M6ICR7U3RyaW5nKGVycm9yKX1gKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvLyBDbG9zZXMgdGhlIHdpbmRvdywgd2hlbiBpdCBpcyBvcGVuLCBhbmQgdGFrZXMgaXQgb3V0IG9mIHRoZSB0aWxpbmcsIHNvIHRoYXQgc2F2aW5nIHRha2VzIGl0XG4gICAgICAvLyBvdXQgb2YgdGhlIGxheW91dC4gVGhlIGFwcGxpY2F0aW9uIHdpbmRvdyBpcyBub3QgY2xvc2VkLlxuICAgICAgY2xvc2VXaW5kb3c6IGFzeW5jICh3aW5kb3c6IFBsYW5uZWRXaW5kb3cpID0+IHtcbiAgICAgICAgaWYgKGlzQXBwbGljYXRpb25XaW5kb3cod2luZG93LnJlY29yZC53aW5kb3cpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHdpbmRvdy5taXNzaW5nKSB7XG4gICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgdGlsaW5nUGxhbi5mb3JnZXQod2luZG93LmtleSk7XG4gICAgICAgICAgICB0aWxpbmdDaGFuZ2VkLnNldCh0cnVlKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpdGxlID0gd2luZG93LnJlY29yZC50aXRsZS5nZXQoKTtcbiAgICAgICAgY29uc3Qgb3duID0ga2V5T2ZXaW5kb3cod2luZG93LnJlY29yZC53aW5kb3cpO1xuICAgICAgICBjb25zdCBzdWIgPSBsaXN0ZWRTdWJXaW5kb3dPZih3aW5kb3csIGF3YWl0IGdldFN1YldpbmRvd3MoKSk7XG5cbiAgICAgICAgaWYgKCFzdWIpIHtcbiAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PlxuICAgICAgICAgICAgc3RhdHVzLnNldChcbiAgICAgICAgICAgICAgYENvdWxkIG5vdCBjbG9zZSBcIiR7dGl0bGV9XCI6IExlbnMgZG9lcyBub3QgbGlzdCBpdCBhcyBhIHdpbmRvdyBvZiBpdHMgb3duLmAsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJdHMgdGlsZSBnb2VzIGF0IG9uY2UsIGFuZCB0aGUgd2luZG93IGhhcyBubyBwbGFjZSBpbiB0aGUgcGxhbiB3aGlsZSBMZW5zIGxpc3RzIGl0IHN0aWxsLFxuICAgICAgICAvLyBzbyB0aGF0IGl0IHNob3dzIG5laXRoZXIgYXMgbm90IG9wZW4gbm9yIGFzIGEgd2luZG93IG9mIGl0cyBvd24gbWVhbndoaWxlLiBUaGUgd2luZG93c1xuICAgICAgICAvLyBjbG9zZWQgYmVmb3JlLCBnb25lIGJ5IG5vdywgYXJlIGZvcmdvdHRlbi5cbiAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIFsuLi5jbG9zaW5nXSkge1xuICAgICAgICAgICAgaWYgKCF3aW5kb3dzLmdldCgpLnNvbWUoKGl0KSA9PiBrZXlPZldpbmRvdyhpdC53aW5kb3cpID09PSBrZXkpKSB7XG4gICAgICAgICAgICAgIGNsb3NpbmcuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2xvc2luZy5hZGQob3duKTtcbiAgICAgICAgICB0aWxpbmdQbGFuLmZvcmdldCh3aW5kb3cua2V5KTtcbiAgICAgICAgICB0aWxpbmdDaGFuZ2VkLnNldCh0cnVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBjbG9zZUFueVN1YldpbmRvdyhzdWIuaWQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIE5vdCBjbG9zZWQ6IGl0IHNob3dzIGFnYWluLCBhcyBub3QgdGlsZWQuXG4gICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgY2xvc2luZy5kZWxldGUob3duKTtcbiAgICAgICAgICAgIHN0YXR1cy5zZXQoYENvdWxkIG5vdCBjbG9zZSBcIiR7dGl0bGV9XCI6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLy8gV2hldGhlciBhIHdpbmRvdyBvZiBpdHMgb3duIGNhbiBiZSBvcGVuZWQgb24gYSBwbGFjZSwgYXMgd2l0aCBMZW5zIFN0dWRpby5cbiAgICAgIGNhbk9wZW5QbGFjZXMsXG4gICAgICBjbHVzdGVyczogY29tcHV0ZWQoKCkgPT4gY2x1c3RlcnMuZ2V0KCk/LmdldCgpID8/IFtdKSxcblxuICAgICAgLy8gT3BlbnMgdGhlIHBsYWNlLCBhIGNsdXN0ZXIncyBsaXN0IG9mIHBvZHMgc2F5LCBpbiBhIHdpbmRvdyBvZiBpdHMgb3duLCBpbiB0aGUgY2VsbCwgaXRzIHRpbGVcbiAgICAgIC8vIG5hbWVkIGFzIGdpdmVuIHVudGlsIHRoZSB3aW5kb3cgc2hvd3MuXG4gICAgICBvcGVuSW5DZWxsOiAocGxhY2U6IFBsYWNlLCBjZWxsOiBDZWxsLCB0aXRsZTogc3RyaW5nKSA9PlxuICAgICAgICBvcGVuUGxhY2VJbkNlbGwocGxhY2UsIGNlbGwsIHRpdGxlKSxcblxuICAgICAgcmVvcGVuaW5nLFxuICAgICAgLy8gV2hldGhlciB0aGUgd2luZG93IG5vdCBvcGVuIGNhbiBiZSBvcGVuZWQgYWdhaW46IGFzIHRoZSBsYXlvdXQga2VwdCBpdCwgd2hlbiBMZW5zIGNhbiBvcGVuXG4gICAgICAvLyB0aGF0IG5vdywgb3IgYXMgTGVucyBkZXNjcmliZWQgaXQgYXMgaXQgY2xvc2VkLCB3aGljaCBpdCBpcyBhc2tlZCBmb3Igd2hlbiBvcGVuaW5nIGl0LlxuICAgICAgY2FuUmVvcGVuOiAod2luZG93OiBQbGFubmVkV2luZG93KSA9PiB7XG4gICAgICAgIGlmICghd2luZG93Lm1pc3NpbmcgfHwgd2luZG93LmtleS5zdGFydHNXaXRoKG9wZW5pbmdQcmVmaXgpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb2ZMYXlvdXQgPSBzYXZlZFdpbmRvd09mKHdpbmRvdyk7XG5cbiAgICAgICAgaWYgKG9mTGF5b3V0KSB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICEhb2ZMYXlvdXQucmVvcGVuaW5nICYmXG4gICAgICAgICAgICBjYW5SZW9wZW5XaW5kb3dSZWFjdGl2ZShvZkxheW91dC5yZW9wZW5pbmcpLmdldCgpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhIXdpbmRvdy5jbG9zZWQ7XG4gICAgICB9LFxuXG4gICAgICBpc1Jlb3BlbmluZ1dpbmRvdzogKHdpbmRvdzogUGxhbm5lZFdpbmRvdykgPT4gb3BlbmluZy5oYXMod2luZG93LmtleSksXG5cbiAgICAgIC8vIE9wZW5zIHRoZSB3aW5kb3cgbm90IG9wZW4gYWdhaW4sIGFzIGl0IHdhcywgd2hlcmUgaXRzIHRpbGUgaXMsIGFuZCBmb2N1c2VzIGl0OiB0aGUgd2luZG93XG4gICAgICAvLyBMZW5zIGFuc3dlcnMgd2l0aCBpcyB0aGUgdGlsZSdzIGZyb20gdGhlbiBvbi4gTGVucyBhbnN3ZXJpbmcgbm9uZSBsZWF2ZXMgaXQgbm90IG9wZW4uXG4gICAgICByZW9wZW5XaW5kb3c6IGFzeW5jICh3aW5kb3c6IFBsYW5uZWRXaW5kb3cpID0+IHtcbiAgICAgICAgY29uc3QgeyBrZXkgfSA9IHdpbmRvdztcblxuICAgICAgICBpZiAob3BlbmluZy5oYXMoa2V5KSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpdGxlID0gd2luZG93LnJlY29yZC50aXRsZS5nZXQoKTtcbiAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gcmVvcGVuaW5nUGxhY2VtZW50T2Yod2luZG93KTtcbiAgICAgICAgY29uc3QgdGlsZSA9IHtcbiAgICAgICAgICBzdGFuZHNGb3I6IHN0YW5kc0Zvck9mKHdpbmRvdyksXG4gICAgICAgICAgLy8gVGhlIHdpbmRvdyBpdHNlbGYsIG5vdCB0aGUgcGxhY2UgaW4gdGhlIGxheW91dCBpdHMgdGlsZSdzIGtleSBtYXkgZ28gYnkgdG9vLlxuICAgICAgICAgIHByZXZpb3VzOiAvXm1pc3Npbmc6XFxkKzooLiopJC9zLmV4ZWMoa2V5KT8uWzFdID8/IGtleSxcbiAgICAgICAgfTtcblxuICAgICAgICBydW5JbkFjdGlvbigoKSA9PiBvcGVuaW5nLmFkZChrZXkpKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGtlcHQgPSBhd2FpdCByZW9wZW5pbmdPZih3aW5kb3cpO1xuICAgICAgICAgIGNvbnN0IHJlb3BlbmVkID1cbiAgICAgICAgICAgIGtlcHQgJiZcbiAgICAgICAgICAgIChhd2FpdCByZW9wZW5XaW5kb3coa2VwdCwgcGxhY2VtZW50KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpKTtcblxuICAgICAgICAgIGlmICghcmVvcGVuZWQpIHtcbiAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHN0YXR1cy5zZXQoYENvdWxkIG5vdCBvcGVuIFwiJHt0aXRsZX1cIiBhZ2Fpbi5gKSk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDcmVhdGVkIG92ZXIgaXRzIHRpbGUgYWxyZWFkeTogbm8gb3RoZXIgd2luZG93IGlzIG1vdmVkIGZvciBpdC5cbiAgICAgICAgICB0aWxlUmVvcGVuZWQoa2V5LCByZW9wZW5lZCwgdGlsZSk7XG4gICAgICAgICAgYXdhaXQgZm9jdXNXaW5kb3cocmVvcGVuZWQpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IG9wZW5pbmcuZGVsZXRlKGtleSkpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvLyBCcmluZ3MgdGhlIGxheW91dCdzIHdpbmRvdyBvZiB0aGUgcGxhY2UgaW4gaXQgdG8gdGhlIGZyb250LCBvcGVuaW5nIGl0IGFnYWluIGZpcnN0IHdoZW4gaXRcbiAgICAgIC8vIGlzIG5vdCBvcGVuOiBmcm9tIGl0cyB0aWxlIHdoZW4gdGhlIGxheW91dCBpcyB0aGUgb25lIHNob3duLCBzbyBpdHMgdGlsZSBpcyBpdHM7IG90aGVyd2lzZVxuICAgICAgLy8gYXMgdGhlIGxheW91dCBrZXB0IGl0LCB3aGVyZSBpdCBzYXZlZCBpdCwgYW5kIHRoZSB3aW5kb3cgb3BlbmVkIGlzIHRoZSBsYXlvdXQncyBmcm9tIHRoZW4uXG4gICAgICBzaG93V2luZG93T2Y6IGFzeW5jIChcbiAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgKTogUHJvbWlzZTxcImZvY3VzZWRcIiB8IFwib3BlbmVkXCIgfCBcIm5vdC1vcGVuZWRcIj4gPT4ge1xuICAgICAgICBjb25zdCBsYXlvdXQgPSBsYXlvdXRzLmdldCgpPy5maW5kKChpdCkgPT4gaXQubmFtZSA9PT0gbmFtZSk7XG4gICAgICAgIGNvbnN0IHNhdmVkID0gbGF5b3V0Py53aW5kb3dzW2luZGV4XTtcblxuICAgICAgICBpZiAoIWxheW91dCB8fCAhc2F2ZWQpIHtcbiAgICAgICAgICByZXR1cm4gXCJub3Qtb3BlbmVkXCI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvcGVuID0gb3BlbldpbmRvd3NPZihsYXlvdXQpLmdldChzYXZlZCk7XG5cbiAgICAgICAgaWYgKG9wZW4pIHtcbiAgICAgICAgICBhd2FpdCBmb2N1c1dpbmRvdyhvcGVuLndpbmRvdyk7XG5cbiAgICAgICAgICByZXR1cm4gXCJmb2N1c2VkXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZWN0ZWQuZ2V0KCkgPT09IG5hbWUpIHtcbiAgICAgICAgICBjb25zdCBwbGFuID0gdGlsaW5nUGxhbi5yZXNvbHZlZC5nZXQoKTtcbiAgICAgICAgICBjb25zdCB0aWxlID0gW1xuICAgICAgICAgICAgLi4ucGxhbi5zY3JlZW5zLmZsYXRNYXAoKHNjcmVlbikgPT4gc2NyZWVuLndpbmRvd3MpLFxuICAgICAgICAgICAgLi4ucGxhbi51bnRpbGVkLFxuICAgICAgICAgIF0uZmluZChcbiAgICAgICAgICAgIChpdCkgPT5cbiAgICAgICAgICAgICAgaXQubWlzc2luZyAmJlxuICAgICAgICAgICAgICAoc2F2ZWRXaW5kb3dPZktleShsYXlvdXQud2luZG93cywgaXQua2V5KSA9PT0gc2F2ZWQgfHxcbiAgICAgICAgICAgICAgICBzdGFuZHNGb3JPZihpdCkgPT09IGtleU9mV2luZG93KHNhdmVkLndpbmRvdykpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAodGlsZSkge1xuICAgICAgICAgICAgYXdhaXQgbW9kZWwucmVvcGVuV2luZG93KHRpbGUpO1xuXG4gICAgICAgICAgICByZXR1cm4gb3BlbldpbmRvd3NPZihsYXlvdXQpLmhhcyhzYXZlZCkgPyBcIm9wZW5lZFwiIDogXCJub3Qtb3BlbmVkXCI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVvcGVuZWQgPVxuICAgICAgICAgIHNhdmVkLnJlb3BlbmluZyAmJlxuICAgICAgICAgIGNhblJlb3BlbldpbmRvd1JlYWN0aXZlKHNhdmVkLnJlb3BlbmluZykuZ2V0KCkgJiZcbiAgICAgICAgICAoYXdhaXQgcmVvcGVuV2luZG93KHNhdmVkLnJlb3BlbmluZywge1xuICAgICAgICAgICAgLy8gSW4gaXRzIHRpbGUsIHdoZW4gdGhlIGxheW91dCB0aWxlcyBpdCBvbiBhIHNjcmVlbiBjb25uZWN0ZWQgbm93LCBhcyBSZWNhbGwgcHV0cyBpdC5cbiAgICAgICAgICAgIGJvdW5kczpcbiAgICAgICAgICAgICAgdGlsZUJvdW5kc09mKGxheW91dCwgZGlzcGxheXMuZ2V0KCkpLmdldChpbmRleCkgPz9cbiAgICAgICAgICAgICAgc2F2ZWQubm9ybWFsQm91bmRzLFxuICAgICAgICAgICAgc3RhdGU6XG4gICAgICAgICAgICAgIHRpbGVCb3VuZHNPZihsYXlvdXQsIGRpc3BsYXlzLmdldCgpKS5oYXMoaW5kZXgpICYmXG4gICAgICAgICAgICAgIHNhdmVkLnN0YXRlICE9PSBcIm1pbmltaXplZFwiXG4gICAgICAgICAgICAgICAgPyBcIm5vcm1hbFwiXG4gICAgICAgICAgICAgICAgOiBzYXZlZC5zdGF0ZSxcbiAgICAgICAgICAgIC4uLihzYXZlZC5kaXNwbGF5SWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgIDogeyBkaXNwbGF5SWQ6IHNhdmVkLmRpc3BsYXlJZCB9KSxcbiAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpKTtcblxuICAgICAgICBpZiAoIXJlb3BlbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIFwibm90LW9wZW5lZFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIGxheW91dCdzIHdpbmRvdywgZnJvbSBub3cgb24sIGFzIHdoZW4gYSByZWNhbGwgb3BlbnMgaXQgYWdhaW4uXG4gICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBvd24gPSBrZXlPZldpbmRvdyhyZW9wZW5lZCk7XG4gICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBrZXlPZldpbmRvdyhzYXZlZC53aW5kb3cpO1xuXG4gICAgICAgICAgaWYgKG93biAhPT0gcHJldmlvdXMpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlcy5nZXQoKT8uc2V0KG93biwgcHJldmlvdXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxpbmVhZ2UuZ2V0KCk/LnNldChsaW5lYWdlS2V5KG5hbWUsIG93biksIHByZXZpb3VzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgZm9jdXNXaW5kb3cocmVvcGVuZWQpO1xuXG4gICAgICAgIHJldHVybiBcIm9wZW5lZFwiO1xuICAgICAgfSxcblxuICAgICAgLy8gUmVuYW1pbmcgYSB3aW5kb3csIGFzIGEgbGF5b3V0IGlzOiBFbnRlciBvciBsZWF2aW5nIHRoZSBuYW1lIGtlZXBzIGl0LCBFc2NhcGUgdGhlIG9sZCBvbmUuXG4gICAgICAvLyBPbmx5IGEgc3ViLXdpbmRvdyBvcGVuIGNhbiBiZSByZW5hbWVkOyB0aGUgd2luZG93IGtlZXBzIHRoZSBuYW1lLCB3aGF0ZXZlciBpdCBzaG93cy5cbiAgICAgIGNhblJlbmFtZVdpbmRvdzogKHdpbmRvdzogUGxhbm5lZFdpbmRvdykgPT5cbiAgICAgICAgIXdpbmRvdy5taXNzaW5nICYmXG4gICAgICAgICFpc0FwcGxpY2F0aW9uV2luZG93KHdpbmRvdy5yZWNvcmQud2luZG93KSAmJlxuICAgICAgICAhIWxpc3RlZFN1YldpbmRvd09mKHdpbmRvdywgc3ViV2luZG93c09mTGVucy5nZXQoKSksXG4gICAgICByZW5hbWluZ1dpbmRvdyxcbiAgICAgIHdpbmRvd05hbWVEcmFmdCxcbiAgICAgIHN0YXJ0UmVuYW1pbmdXaW5kb3c6IGFjdGlvbigod2luZG93OiBQbGFubmVkV2luZG93KSA9PiB7XG4gICAgICAgIHJlbmFtaW5nV2luZG93LnNldCh3aW5kb3cua2V5KTtcbiAgICAgICAgd2luZG93TmFtZURyYWZ0LnNldCh3aW5kb3cucmVjb3JkLnRpdGxlLmdldCgpKTtcbiAgICAgIH0pLFxuICAgICAgc2V0V2luZG93TmFtZURyYWZ0OiBhY3Rpb24oKHRleHQ6IHN0cmluZykgPT4gd2luZG93TmFtZURyYWZ0LnNldCh0ZXh0KSksXG4gICAgICBjYW5jZWxSZW5hbWluZ1dpbmRvdzogYWN0aW9uKCgpID0+IHJlbmFtaW5nV2luZG93LnNldCh1bmRlZmluZWQpKSxcbiAgICAgIHJlbmFtZVdpbmRvdzogYXN5bmMgKHdpbmRvdzogUGxhbm5lZFdpbmRvdykgPT4ge1xuICAgICAgICBpZiAocmVuYW1pbmdXaW5kb3cuZ2V0KCkgIT09IHdpbmRvdy5rZXkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuYW1lID0gd2luZG93TmFtZURyYWZ0LmdldCgpLnRyaW0oKTtcblxuICAgICAgICBydW5JbkFjdGlvbigoKSA9PiByZW5hbWluZ1dpbmRvdy5zZXQodW5kZWZpbmVkKSk7XG5cbiAgICAgICAgaWYgKCFuYW1lIHx8IG5hbWUgPT09IHdpbmRvdy5yZWNvcmQudGl0bGUuZ2V0KCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdWIgPSBsaXN0ZWRTdWJXaW5kb3dPZih3aW5kb3csIGF3YWl0IGdldFN1YldpbmRvd3MoKSk7XG5cbiAgICAgICAgaWYgKHN1Yikge1xuICAgICAgICAgIGF3YWl0IHJlbmFtZUFueVN1YldpbmRvdyhzdWIuaWQsIG5hbWUpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBjbHVzdGVyU2VhcmNoLFxuICAgICAgc2V0Q2x1c3RlclNlYXJjaDogYWN0aW9uKCh0ZXh0OiBzdHJpbmcpID0+IGNsdXN0ZXJTZWFyY2guc2V0KHRleHQpKSxcbiAgICAgIHBhZ2VTZWFyY2gsXG4gICAgICBzZXRQYWdlU2VhcmNoOiBhY3Rpb24oKHRleHQ6IHN0cmluZykgPT4gcGFnZVNlYXJjaC5zZXQodGV4dCkpLFxuXG4gICAgICAvLyBEZWxldGVzIHRoZSBsYXlvdXQgb25jZSB0aGUgdXNlciBjb25maXJtcyBpdC5cbiAgICAgIHJlbW92ZTogYXN5bmMgKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoIShhd2FpdCBjb25maXJtRGVsZXRlKG5hbWUpKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IGRlbGV0ZVdpbmRvd0xheW91dChuYW1lKTtcbiAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgIGlmIChzZWxlY3RlZC5nZXQoKSA9PT0gbmFtZSkge1xuICAgICAgICAgICAgc2hvd1RpbGluZ09mKHVuZGVmaW5lZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3RhdHVzLnNldCh1bmRlZmluZWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCBmb2xsb3dJbkhvdGJhcigoKSA9PiBsYXlvdXRJbkhvdGJhci5kZWxldGVkKG5hbWUpKTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIFN0b3BzIHdoYXQgdGhlIG1vZGVsIHN0YXJ0ZWQsIGNhbGxlZCBhcyBpdCBpcyB0aHJvd24gYXdheS5cbiAgICBjb25zdCBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCB0aW1lciBvZiB0aW1lcnMpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIH1cblxuICAgICAgdGltZXJzLmNsZWFyKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGRpc3Bvc2FibGUgPSBPYmplY3QuYXNzaWduKG1vZGVsLCB7IGRpc3Bvc2UgfSk7XG5cbiAgICByZXR1cm4gKCkgPT4gZGlzcG9zYWJsZTtcbiAgfSxcbn0pO1xuIiwgImltcG9ydCB7IGdldEluamVjdGFibGUyIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcbmltcG9ydCB7IHNob3dJbmZvTm90aWZpY2F0aW9uSW5qZWN0aW9uVG9rZW4gfSBmcm9tIFwiQGs4c2xlbnMvbm90aWZpY2F0aW9ucy1jb250cmFjdHNcIjtcbmltcG9ydCB7IHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUgfSBmcm9tIFwiLi93aW5kb3ctbGF5b3V0cy1tb2RlbC5pbmplY3RhYmxlXCI7XG5cbi8vIFJlY2FsbHMgYSBsYXlvdXQsIHRlbGxpbmcgaW4gYSBub3RpZmljYXRpb24gd2hhdCB3ZW50IG90aGVyd2lzZSwgYXMgdGhlIGRpYWxvZyBpcyBub3Qgb3BlbiB0by5cbmV4cG9ydCBjb25zdCByZWNhbGxGcm9tSG90YmFySW5qZWN0YWJsZSA9IGdldEluamVjdGFibGUyKHtcbiAgaWQ6IFwid2luZG93LW1hbmFnZXIucmVjYWxsLWZyb20taG90YmFyXCIsXG4gIGNvbnN1bXB0aW9uczogW3Nob3dJbmZvTm90aWZpY2F0aW9uSW5qZWN0aW9uVG9rZW5dLFxuXG4gIGluc3RhbnRpYXRlOiAoZGkpID0+IHtcbiAgICBjb25zdCBtb2RlbCA9IGRpLmluamVjdCh3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlKSgpO1xuICAgIGNvbnN0IHNob3dJbmZvTm90aWZpY2F0aW9uID0gZGkuaW5qZWN0KHNob3dJbmZvTm90aWZpY2F0aW9uSW5qZWN0aW9uVG9rZW4pKCk7XG5cbiAgICByZXR1cm4gKCkgPT4gYXN5bmMgKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3Qgbm90ZSA9IGF3YWl0IG1vZGVsLnJlY2FsbChuYW1lKTtcblxuICAgICAgaWYgKG5vdGUpIHtcbiAgICAgICAgc2hvd0luZm9Ob3RpZmljYXRpb24obm90ZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfSxcbn0pO1xuIiwgImltcG9ydCB7IGdldEluamVjdGFibGUyIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcbmltcG9ydCB7XG4gIHNob3dFcnJvck5vdGlmaWNhdGlvbkluamVjdGlvblRva2VuLFxuICBzaG93U3VjY2Vzc05vdGlmaWNhdGlvbkluamVjdGlvblRva2VuLFxufSBmcm9tIFwiQGs4c2xlbnMvbm90aWZpY2F0aW9ucy1jb250cmFjdHNcIjtcbmltcG9ydCB7IHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUgfSBmcm9tIFwiLi93aW5kb3ctbGF5b3V0cy1tb2RlbC5pbmplY3RhYmxlXCI7XG5cbi8vIFRpbGVzIHRoZSB3aW5kb3dzIGFzIGEgbGF5b3V0J3MgdGlsaW5nIGhhcyB0aGVtIGFuZCBzYXZlcyB0aGVtIGludG8gaXQsIHRlbGxpbmcgaW4gYSBub3RpZmljYXRpb25cbi8vIGhvdyBpdCB3ZW50LCBhcyB0aGUgZGlhbG9nIGlzIG5vdCBvcGVuIHRvLlxuZXhwb3J0IGNvbnN0IHNhdmVGcm9tSG90YmFySW5qZWN0YWJsZSA9IGdldEluamVjdGFibGUyKHtcbiAgaWQ6IFwid2luZG93LW1hbmFnZXIuc2F2ZS1mcm9tLWhvdGJhclwiLFxuICBjb25zdW1wdGlvbnM6IFtcbiAgICBzaG93U3VjY2Vzc05vdGlmaWNhdGlvbkluamVjdGlvblRva2VuLFxuICAgIHNob3dFcnJvck5vdGlmaWNhdGlvbkluamVjdGlvblRva2VuLFxuICBdLFxuXG4gIGluc3RhbnRpYXRlOiAoZGkpID0+IHtcbiAgICBjb25zdCBtb2RlbCA9IGRpLmluamVjdCh3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlKSgpO1xuICAgIGNvbnN0IHNob3dTdWNjZXNzTm90aWZpY2F0aW9uID0gZGkuaW5qZWN0KFxuICAgICAgc2hvd1N1Y2Nlc3NOb3RpZmljYXRpb25JbmplY3Rpb25Ub2tlbixcbiAgICApKCk7XG4gICAgY29uc3Qgc2hvd0Vycm9yTm90aWZpY2F0aW9uID0gZGkuaW5qZWN0KFxuICAgICAgc2hvd0Vycm9yTm90aWZpY2F0aW9uSW5qZWN0aW9uVG9rZW4sXG4gICAgKSgpO1xuXG4gICAgcmV0dXJuICgpID0+IGFzeW5jIChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1vZGVsLnRpbGVBbmRTYXZlSW50byhuYW1lKTtcblxuICAgICAgaWYgKHJlc3VsdCA9PT0gXCJuby1sYXlvdXRcIikge1xuICAgICAgICBzaG93RXJyb3JOb3RpZmljYXRpb24oYFRoZXJlIGlzIG5vIGxheW91dCBjYWxsZWQgXCIke25hbWV9XCIgdG8gc2F2ZS5gKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSBcIm5vdC10aWxlZFwiKSB7XG4gICAgICAgIHNob3dFcnJvck5vdGlmaWNhdGlvbihcbiAgICAgICAgICBgQ291bGQgbm90IHRpbGUgdGhlIHdpbmRvd3MsIHNvIG5vdGhpbmcgd2FzIHNhdmVkIGludG8gXCIke25hbWV9XCIuICR7bW9kZWwuc3RhdHVzLmdldCgpID8/IFwiXCJ9YC50cmltKCksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93U3VjY2Vzc05vdGlmaWNhdGlvbihcbiAgICAgICAgICBgVGlsZWQgYW5kIHNhdmVkICR7cmVzdWx0fSB3aW5kb3cke3Jlc3VsdCA9PT0gMSA/IFwiXCIgOiBcInNcIn0gaW50byBcIiR7bmFtZX1cIi5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG4gIH0sXG59KTtcbiIsICJpbXBvcnQgeyBnZXRJbmplY3RhYmxlMiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyBzaG93RXJyb3JOb3RpZmljYXRpb25JbmplY3Rpb25Ub2tlbiB9IGZyb20gXCJAazhzbGVucy9ub3RpZmljYXRpb25zLWNvbnRyYWN0c1wiO1xuaW1wb3J0IHsgd2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSB9IGZyb20gXCIuL3dpbmRvdy1sYXlvdXRzLW1vZGVsLmluamVjdGFibGVcIjtcblxuLy8gQnJpbmdzIGEgbGF5b3V0J3Mgd2luZG93IHRvIHRoZSBmcm9udCwgb3BlbmluZyBpdCBhZ2FpbiB3aGVuIG5vdCBvcGVuLCB0ZWxsaW5nIGluIGEgbm90aWZpY2F0aW9uXG4vLyB3aGVuIGl0IGNvdWxkIG5vdCBiZSwgYXMgdGhlIGRpYWxvZyBpcyBub3Qgb3BlbiB0by5cbmV4cG9ydCBjb25zdCBzaG93V2luZG93RnJvbUhvdGJhckluamVjdGFibGUgPSBnZXRJbmplY3RhYmxlMih7XG4gIGlkOiBcIndpbmRvdy1tYW5hZ2VyLnNob3ctd2luZG93LWZyb20taG90YmFyXCIsXG4gIGNvbnN1bXB0aW9uczogW3Nob3dFcnJvck5vdGlmaWNhdGlvbkluamVjdGlvblRva2VuXSxcblxuICBpbnN0YW50aWF0ZTogKGRpKSA9PiB7XG4gICAgY29uc3QgbW9kZWwgPSBkaS5pbmplY3Qod2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSkoKTtcbiAgICBjb25zdCBzaG93RXJyb3JOb3RpZmljYXRpb24gPSBkaS5pbmplY3QoXG4gICAgICBzaG93RXJyb3JOb3RpZmljYXRpb25JbmplY3Rpb25Ub2tlbixcbiAgICApKCk7XG5cbiAgICByZXR1cm4gKCkgPT4gYXN5bmMgKG5hbWU6IHN0cmluZywgaW5kZXg6IG51bWJlciwgdGl0bGU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKChhd2FpdCBtb2RlbC5zaG93V2luZG93T2YobmFtZSwgaW5kZXgpKSA9PT0gXCJub3Qtb3BlbmVkXCIpIHtcbiAgICAgICAgc2hvd0Vycm9yTm90aWZpY2F0aW9uKGBDb3VsZCBub3Qgb3BlbiBcIiR7dGl0bGV9XCIgYWdhaW4uYCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSxcbn0pO1xuIiwgImltcG9ydCB7IGdldENvbW1hbmRJbmplY3RhYmxlQnVuY2ggfSBmcm9tIFwiQGs4c2xlbnMvY29tbWFuZC1wYWxldHRlLWNvbnRyYWN0c1wiO1xuaW1wb3J0IHsgdGlsZVdpbmRvd3NJbmplY3RhYmxlIH0gZnJvbSBcIi4uL2xheW91dHMvdGlsZS13aW5kb3dzLmluamVjdGFibGVcIjtcblxuZXhwb3J0IGNvbnN0IHRpbGVXaW5kb3dzQ29tbWFuZEJ1bmNoID0gZ2V0Q29tbWFuZEluamVjdGFibGVCdW5jaCh7XG4gIGlkOiBcIndpbmRvdy1tYW5hZ2VyLnRpbGUtd2luZG93cy1jb21tYW5kXCIsXG4gIHRpdGxlOiBcIldpbmRvdyBMYXlvdXRzOiBUaWxlIHdpbmRvd3NcIixcbiAgYWN0aW9uOiB7XG4gICAgaW5zdGFudGlhdGU6IChkaSkgPT4ge1xuICAgICAgY29uc3QgdGlsZVdpbmRvd3MgPSBkaS5pbmplY3QodGlsZVdpbmRvd3NJbmplY3RhYmxlKSgpO1xuXG4gICAgICByZXR1cm4gKCkgPT4gYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aWxlV2luZG93cygpO1xuICAgICAgfTtcbiAgICB9LFxuICB9LFxufSk7XG4iLCAiaW1wb3J0IHsgZ2V0Q29tbWFuZEluamVjdGFibGVCdW5jaCB9IGZyb20gXCJAazhzbGVucy9jb21tYW5kLXBhbGV0dGUtY29udHJhY3RzXCI7XG5pbXBvcnQgeyBvcGVuV2luZG93TGF5b3V0c0luamVjdGFibGUgfSBmcm9tIFwiLi9vcGVuLXdpbmRvdy1sYXlvdXRzLmluamVjdGFibGVcIjtcblxuZXhwb3J0IGNvbnN0IHdpbmRvd0xheW91dHNDb21tYW5kQnVuY2ggPSBnZXRDb21tYW5kSW5qZWN0YWJsZUJ1bmNoKHtcbiAgaWQ6IFwid2luZG93LW1hbmFnZXIud2luZG93LWxheW91dHNcIixcbiAgdGl0bGU6IFwiV2luZG93IExheW91dHM6IFNhdmUgb3IgcmVjYWxsIGEgbGF5b3V0XCIsXG4gIGFjdGlvbjoge1xuICAgIGluc3RhbnRpYXRlOiAoZGkpID0+ICgpID0+IGRpLmluamVjdChvcGVuV2luZG93TGF5b3V0c0luamVjdGFibGUpKCksXG4gIH0sXG59KTtcbiIsICJpbXBvcnQge1xuICBnZXRJbmplY3RhYmxlMixcbiAgaW5zdGFuY2VQdXJnZUNhbGxiYWNrVG9rZW4sXG59IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyB3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlIH0gZnJvbSBcIi4vd2luZG93LWxheW91dHMtbW9kZWwuaW5qZWN0YWJsZVwiO1xuXG4vLyBTdG9wcyB0aGUgcmVhY3Rpb25zIGFuZCB0aW1lcnMgb2YgdGhlIG1vZGVsIGFzIGl0IGlzIHRocm93biBhd2F5LCBhcyB3aGVuIHRoZSBleHRlbnNpb24gaXNcbi8vIHJlYnVpbHQsIGRpc2FibGVkIG9yIHVuaW5zdGFsbGVkLCBzbyB0aGF0IG5vbmUgb2YgdGhlbSBvdXRsaXZlcyBpdC4gSXRzIGZpbGUgc29ydHMgYWZ0ZXIgdGhlXG4vLyBtb2RlbCdzLCBzbyB0aGF0IGl0IGlzIHJlZ2lzdGVyZWQgYWZ0ZXIgdGhlIG1vZGVsIGFuZCBzdGlsbCBpcyB3aGVuIHRoZSBtb2RlbCBsZWF2ZXMuXG5leHBvcnQgY29uc3QgZGlzcG9zZVdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUgPSBnZXRJbmplY3RhYmxlMih7XG4gIGlkOiBcIndpbmRvdy1tYW5hZ2VyLmRpc3Bvc2Utd2luZG93LWxheW91dHMtbW9kZWxcIixcbiAgaW5qZWN0aW9uVG9rZW46IGluc3RhbmNlUHVyZ2VDYWxsYmFja1Rva2VuLmZvcih3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlKSxcblxuICBpbnN0YW50aWF0ZTpcbiAgICAoKSA9PlxuICAgICgpID0+XG4gICAgKHsgaW5zdGFuY2UgfSkgPT4ge1xuICAgICAgaW5zdGFuY2UuZGlzcG9zZSgpO1xuXG4gICAgICAvLyBSZXF1aXJlZCBieSB0aGUgdHlwZSBvbmx5OiB3aGF0IHRoZSBjYWxsYmFjayByZXR1cm5zIGlzIG5vdCB1c2VkLlxuICAgICAgcmV0dXJuICgpID0+IGluc3RhbmNlO1xuICAgIH0sXG59KTtcbiIsICJpbXBvcnQgeyBCdXR0b24gfSBmcm9tIFwiQGs4c2xlbnMvZWxlbWVudC1jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBEYXNoYm9hcmRJY29uIH0gZnJvbSBcIkBrOHNsZW5zL2ljb25cIjtcbmltcG9ydCB7IGdldEluamVjdGFibGUyIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcbmltcG9ydCB7IHN0YXR1c0Jhckl0ZW1JbmplY3Rpb25Ub2tlbiB9IGZyb20gXCJAazhzbGVucy9zdGF0dXMtYmFyLWNvbnRyYWN0c1wiO1xuaW1wb3J0IHsgdXNlSW5qZWN0IH0gZnJvbSBcIkBrOHNsZW5zL3VzZS1pbmplY3RcIjtcbmltcG9ydCB7IG9wZW5XaW5kb3dMYXlvdXRzSW5qZWN0YWJsZSB9IGZyb20gXCIuL29wZW4td2luZG93LWxheW91dHMuaW5qZWN0YWJsZVwiO1xuXG5jb25zdCBXaW5kb3dMYXlvdXRzU3RhdHVzQmFyQnV0dG9uID0gKCkgPT4ge1xuICBjb25zdCBvcGVuV2luZG93TGF5b3V0cyA9IHVzZUluamVjdChvcGVuV2luZG93TGF5b3V0c0luamVjdGFibGUpKCk7XG5cbiAgcmV0dXJuIChcbiAgICA8QnV0dG9uXG4gICAgICAkZmxleD17eyBkaXJlY3Rpb246IFwiaG9yaXpvbnRhbFwiLCBnYXA6IFwieHNcIiwgdmVydGljYWxBbGlnbjogXCJjZW50ZXJcIiB9fVxuICAgICAgJHRvb2x0aXA9XCJTYXZlIG9yIHJlY2FsbCBhIHdpbmRvdyBsYXlvdXRcIlxuICAgICAgJG9uQ2xpY2s9eygpID0+IHZvaWQgb3BlbldpbmRvd0xheW91dHMoKX1cbiAgICA+XG4gICAgICA8RGFzaGJvYXJkSWNvbiAkc2l6ZT1cInNcIiAvPlxuICAgICAgTGF5b3V0c1xuICAgIDwvQnV0dG9uPlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IHdpbmRvd0xheW91dHNTdGF0dXNCYXJJdGVtSW5qZWN0YWJsZSA9IGdldEluamVjdGFibGUyKHtcbiAgaWQ6IFwid2luZG93LW1hbmFnZXIud2luZG93LWxheW91dHMtc3RhdHVzLWJhci1pdGVtXCIsXG4gIGluc3RhbnRpYXRlOiAoKSA9PiAoKSA9PiAoe1xuICAgIENvbXBvbmVudDogV2luZG93TGF5b3V0c1N0YXR1c0JhckJ1dHRvbixcbiAgICBwb3NpdGlvbjogXCJyaWdodFwiIGFzIGNvbnN0LFxuICAgIG9yZGVyTnVtYmVyOiA5MCxcbiAgfSksXG4gIGluamVjdGlvblRva2VuOiBzdGF0dXNCYXJJdGVtSW5qZWN0aW9uVG9rZW4sXG59KTtcbiIsICJpbXBvcnQgKiBhcyBtb2R1bGUwIGZyb20gJy4vbGF5b3V0cy9kZWxldGUtd2luZG93LWxheW91dC5pbmplY3RhYmxlLnRzJztpbXBvcnQgKiBhcyBtb2R1bGUxIGZyb20gJy4vbGF5b3V0cy9kdXBsaWNhdGUtd2luZG93LWxheW91dC5pbmplY3RhYmxlLnRzJztpbXBvcnQgKiBhcyBtb2R1bGUyIGZyb20gJy4vbGF5b3V0cy9sYXlvdXQtaW4taG90YmFyLmluamVjdGFibGUudHMnO2ltcG9ydCAqIGFzIG1vZHVsZTMgZnJvbSAnLi9sYXlvdXRzL2xheW91dC10aWxpbmcuaW5qZWN0YWJsZS50cyc7aW1wb3J0ICogYXMgbW9kdWxlNCBmcm9tICcuL2xheW91dHMvcGxhY2VzLXN1Yi13aW5kb3cta2luZC5pbmplY3RhYmxlLnRzJztpbXBvcnQgKiBhcyBtb2R1bGU1IGZyb20gJy4vbGF5b3V0cy9yZWNhbGwtd2luZG93LWxheW91dC5pbmplY3RhYmxlLnRzJztpbXBvcnQgKiBhcyBtb2R1bGU2IGZyb20gJy4vbGF5b3V0cy9yZW5hbWUtd2luZG93LWxheW91dC5pbmplY3RhYmxlLnRzJztpbXBvcnQgKiBhcyBtb2R1bGU3IGZyb20gJy4vbGF5b3V0cy9yZW9wZW5pbmctb2YtY2xvc2VkLXdpbmRvdy5pbmplY3RhYmxlLnRzJztpbXBvcnQgKiBhcyBtb2R1bGU4IGZyb20gJy4vbGF5b3V0cy9zYXZlLXdpbmRvdy1sYXlvdXQuaW5qZWN0YWJsZS50cyc7aW1wb3J0ICogYXMgbW9kdWxlOSBmcm9tICcuL2xheW91dHMvc2F2ZWQtd2luZG93LWxheW91dHMuaW5qZWN0YWJsZS50cyc7aW1wb3J0ICogYXMgbW9kdWxlMTAgZnJvbSAnLi9sYXlvdXRzL3RpbGUtd2luZG93cy5pbmplY3RhYmxlLnRzJztpbXBvcnQgKiBhcyBtb2R1bGUxMSBmcm9tICcuL2xheW91dHMvdGlsaW5nLXBsYW4uaW5qZWN0YWJsZS50cyc7aW1wb3J0ICogYXMgbW9kdWxlMTIgZnJvbSAnLi9sYXlvdXRzL3dpbmRvdy1sYXlvdXQtbGlzdC5pbmplY3RhYmxlLnRzJztpbXBvcnQgKiBhcyBtb2R1bGUxMyBmcm9tICcuL2xheW91dHMvd2luZG93LWxpbmVhZ2UuaW5qZWN0YWJsZS50cyc7aW1wb3J0ICogYXMgbW9kdWxlMTQgZnJvbSAnLi9sYXlvdXRzL3dpbmRvdy1yZW9wZW5pbmdzLmluamVjdGFibGUudHMnO2ltcG9ydCAqIGFzIG1vZHVsZTE1IGZyb20gJy4vdWkvZGVsZXRlLWxheW91dC1tb2RhbC5pbmplY3RhYmxlLnRzeCc7aW1wb3J0ICogYXMgbW9kdWxlMTYgZnJvbSAnLi91aS9sYXlvdXQtaG90YmFyLWl0ZW0uaW5qZWN0YWJsZS50c3gnO2ltcG9ydCAqIGFzIG1vZHVsZTE3IGZyb20gJy4vdWkvbGF5b3V0LWhvdGJhci1tZW51LmluamVjdGFibGUudHN4JztpbXBvcnQgKiBhcyBtb2R1bGUxOCBmcm9tICcuL3VpL25ldy13aW5kb3ctbWVudS5pbmplY3RhYmxlLnRzeCc7aW1wb3J0ICogYXMgbW9kdWxlMTkgZnJvbSAnLi91aS9vcGVuLXdpbmRvdy1sYXlvdXRzLmluamVjdGFibGUudHMnO2ltcG9ydCAqIGFzIG1vZHVsZTIwIGZyb20gJy4vdWkvcmVjYWxsLWZyb20taG90YmFyLmluamVjdGFibGUudHMnO2ltcG9ydCAqIGFzIG1vZHVsZTIxIGZyb20gJy4vdWkvc2F2ZS1mcm9tLWhvdGJhci5pbmplY3RhYmxlLnRzJztpbXBvcnQgKiBhcyBtb2R1bGUyMiBmcm9tICcuL3VpL3Nob3ctd2luZG93LWZyb20taG90YmFyLmluamVjdGFibGUudHMnO2ltcG9ydCAqIGFzIG1vZHVsZTIzIGZyb20gJy4vdWkvdGlsZS13aW5kb3dzLWNvbW1hbmQuaW5qZWN0YWJsZS50cyc7aW1wb3J0ICogYXMgbW9kdWxlMjQgZnJvbSAnLi91aS93aW5kb3ctbGF5b3V0cy1jb21tYW5kLmluamVjdGFibGUudHMnO2ltcG9ydCAqIGFzIG1vZHVsZTI1IGZyb20gJy4vdWkvd2luZG93LWxheW91dHMtbW9kYWwuaW5qZWN0YWJsZS50c3gnO2ltcG9ydCAqIGFzIG1vZHVsZTI2IGZyb20gJy4vdWkvd2luZG93LWxheW91dHMtbW9kZWwuaW5qZWN0YWJsZS50cyc7aW1wb3J0ICogYXMgbW9kdWxlMjcgZnJvbSAnLi91aS93aW5kb3ctbGF5b3V0cy1tb2RlbC5wdXJnZS5pbmplY3RhYmxlLnRzJztpbXBvcnQgKiBhcyBtb2R1bGUyOCBmcm9tICcuL3VpL3dpbmRvdy1sYXlvdXRzLXN0YXR1cy1iYXItaXRlbS5pbmplY3RhYmxlLnRzeCdcblxuY29uc3QgbW9kdWxlcyA9IFttb2R1bGUwLG1vZHVsZTEsbW9kdWxlMixtb2R1bGUzLG1vZHVsZTQsbW9kdWxlNSxtb2R1bGU2LG1vZHVsZTcsbW9kdWxlOCxtb2R1bGU5LG1vZHVsZTEwLG1vZHVsZTExLG1vZHVsZTEyLG1vZHVsZTEzLG1vZHVsZTE0LG1vZHVsZTE1LG1vZHVsZTE2LG1vZHVsZTE3LG1vZHVsZTE4LG1vZHVsZTE5LG1vZHVsZTIwLG1vZHVsZTIxLG1vZHVsZTIyLG1vZHVsZTIzLG1vZHVsZTI0LG1vZHVsZTI1LG1vZHVsZTI2LG1vZHVsZTI3LG1vZHVsZTI4XTtcblxuZXhwb3J0IGRlZmF1bHQgbW9kdWxlcztcbmV4cG9ydCBjb25zdCBmaWxlbmFtZXMgPSBbJ2xheW91dHMvZGVsZXRlLXdpbmRvdy1sYXlvdXQuaW5qZWN0YWJsZS50cycsJ2xheW91dHMvZHVwbGljYXRlLXdpbmRvdy1sYXlvdXQuaW5qZWN0YWJsZS50cycsJ2xheW91dHMvbGF5b3V0LWluLWhvdGJhci5pbmplY3RhYmxlLnRzJywnbGF5b3V0cy9sYXlvdXQtdGlsaW5nLmluamVjdGFibGUudHMnLCdsYXlvdXRzL3BsYWNlcy1zdWItd2luZG93LWtpbmQuaW5qZWN0YWJsZS50cycsJ2xheW91dHMvcmVjYWxsLXdpbmRvdy1sYXlvdXQuaW5qZWN0YWJsZS50cycsJ2xheW91dHMvcmVuYW1lLXdpbmRvdy1sYXlvdXQuaW5qZWN0YWJsZS50cycsJ2xheW91dHMvcmVvcGVuaW5nLW9mLWNsb3NlZC13aW5kb3cuaW5qZWN0YWJsZS50cycsJ2xheW91dHMvc2F2ZS13aW5kb3ctbGF5b3V0LmluamVjdGFibGUudHMnLCdsYXlvdXRzL3NhdmVkLXdpbmRvdy1sYXlvdXRzLmluamVjdGFibGUudHMnLCdsYXlvdXRzL3RpbGUtd2luZG93cy5pbmplY3RhYmxlLnRzJywnbGF5b3V0cy90aWxpbmctcGxhbi5pbmplY3RhYmxlLnRzJywnbGF5b3V0cy93aW5kb3ctbGF5b3V0LWxpc3QuaW5qZWN0YWJsZS50cycsJ2xheW91dHMvd2luZG93LWxpbmVhZ2UuaW5qZWN0YWJsZS50cycsJ2xheW91dHMvd2luZG93LXJlb3BlbmluZ3MuaW5qZWN0YWJsZS50cycsJ3VpL2RlbGV0ZS1sYXlvdXQtbW9kYWwuaW5qZWN0YWJsZS50c3gnLCd1aS9sYXlvdXQtaG90YmFyLWl0ZW0uaW5qZWN0YWJsZS50c3gnLCd1aS9sYXlvdXQtaG90YmFyLW1lbnUuaW5qZWN0YWJsZS50c3gnLCd1aS9uZXctd2luZG93LW1lbnUuaW5qZWN0YWJsZS50c3gnLCd1aS9vcGVuLXdpbmRvdy1sYXlvdXRzLmluamVjdGFibGUudHMnLCd1aS9yZWNhbGwtZnJvbS1ob3RiYXIuaW5qZWN0YWJsZS50cycsJ3VpL3NhdmUtZnJvbS1ob3RiYXIuaW5qZWN0YWJsZS50cycsJ3VpL3Nob3ctd2luZG93LWZyb20taG90YmFyLmluamVjdGFibGUudHMnLCd1aS90aWxlLXdpbmRvd3MtY29tbWFuZC5pbmplY3RhYmxlLnRzJywndWkvd2luZG93LWxheW91dHMtY29tbWFuZC5pbmplY3RhYmxlLnRzJywndWkvd2luZG93LWxheW91dHMtbW9kYWwuaW5qZWN0YWJsZS50c3gnLCd1aS93aW5kb3ctbGF5b3V0cy1tb2RlbC5pbmplY3RhYmxlLnRzJywndWkvd2luZG93LWxheW91dHMtbW9kZWwucHVyZ2UuaW5qZWN0YWJsZS50cycsJ3VpL3dpbmRvdy1sYXlvdXRzLXN0YXR1cy1iYXItaXRlbS5pbmplY3RhYmxlLnRzeCddXG4iLCAiaW1wb3J0ICogYXMgbW9kdWxlMCBmcm9tICcuL3VpL2ljb24tYnV0dG9uLnNjc3MnO2ltcG9ydCAqIGFzIG1vZHVsZTEgZnJvbSAnLi91aS9sYXlvdXQtbGlzdC5tb2R1bGUuc2Nzcyc7aW1wb3J0ICogYXMgbW9kdWxlMiBmcm9tICcuL3VpL3RpbGluZy1lZGl0b3IubW9kdWxlLnNjc3MnXG5cbmNvbnN0IG1vZHVsZXMgPSBbbW9kdWxlMCxtb2R1bGUxLG1vZHVsZTJdO1xuXG5leHBvcnQgZGVmYXVsdCBtb2R1bGVzO1xuZXhwb3J0IGNvbnN0IGZpbGVuYW1lcyA9IFsndWkvaWNvbi1idXR0b24uc2NzcycsJ3VpL2xheW91dC1saXN0Lm1vZHVsZS5zY3NzJywndWkvdGlsaW5nLWVk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QUV2QztBQUFBLHFEQUFDLDhCQUFjLE9BQU0sS0FBSTtBQUFBLFFBQUU7QUFBQTtBQUFBO0FBQUEsRUFFN0I7QUFFSjtBQUVPLElBQU0sMkNBQXVDLG9DQUFlO0FBQUEsRUFDakUsSUFBSTtBQUFBLEVBQ0osYUFBYSxNQUFNLE9BQU87QUFBQSxJQUN4QixXQUFXO0FBQUEsSUFDWCxVQUFVO0FBQUEsSUFDVixhQUFhO0FBQUEsRUFDZjtBQUFBLEVBQ0EsZ0JBQWdCO0FBQ2xCLENBQUM7OztBQzVCRCxJQUFNLFVBQVUsQ0FBQyx5Q0FBUSw0Q0FBUSxxQ0FBUSxrQ0FBUSwyQ0FBUSx5Q0FBUSx5Q0FBUSwrQ0FBUSx1Q0FBUSx5Q0FBUSxpQ0FBUyxnQ0FBUyx1Q0FBUyxtQ0FBUyxzQ0FBUyx3Q0FBUyx1Q0FBUyx1Q0FBUyxvQ0FBUyx3Q0FBUyx1Q0FBUyxxQ0FBUyw0Q0FBUyx5Q0FBUywyQ0FBUyx5Q0FBUyx5Q0FBUywrQ0FBUyxpREFBUTtBQUUzUSxJQUFPLCtDQUFROzs7QUNGZixJQUFNQyxXQUFVLENBQUMscUJBQVEsNEJBQVEsNEJBQU87QUFFeEMsSUFBTywrQ0FBUUE7OztBM0NHUixJQUFNLGtDQUE4QixnQ0FBVztBQUFBLEVBQ3BELElBQUk7QUFBQSxFQUNKLFVBQVUsQ0FBQyxPQUFPO0FBT2hCLDREQUErQixJQUFJO0FBQUEsTUFDakMsR0FBRztBQUFBLE1BQ0gsR0FBRztBQUFBLElBQ0wsQ0FBQztBQUFBLEVBQ0g7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfaW5qZWN0YWJsZSIsICJpbXBvcnRfbW9ieCIsICJpbXBvcnRfaW5qZWN0YWJsZSIsICJpbXBvcnRfaW5qZWN0YWJsZSIsICJpbXBvcnRfd2luZG93X2xheW91dF9jb250cmFjdHMiLCAiaW1wb3J0X21vYngiLCAiaW1wb3J0X21lc3NhZ2luZ19jb250cmFjdHMiLCAid2luZG93IiwgImRpc3BsYXkiLCAibWlzc2luZyIsICJ3aW5kb3ciLCAiaXNNYXRjaCIsICJpbXBvcnRfaW5qZWN0YWJsZSIsICJpbXBvcnRfcGVyc2lzdGFibGVfY29udHJhY3RzIiwgImltcG9ydF9tb2J4IiwgIndpbmRvdyIsICJpbXBvcnRfcGVyc2lzdGFibGVfY29udHJhY3RzIiwgIndpbmRvdyIsICJpbXBvcnRfaW5qZWN0YWJsZSIsICJpbXBvcnRfbW9ieCIsICJpbXBvcnRfd2luZG93X2xheW91dF9jb250cmFjdHMiLCAid2luZG93IiwgIl9hIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9tb2J4IiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF93aW5kb3dfbGF5b3V0X2NvbnRyYWN0cyIsICJpbXBvcnRfcGVyc2lzdGFibGVfY29udHJhY3RzIiwgIndpbmRvdyIsICJpbXBvcnRfaW5qZWN0YWJsZSIsICJpbXBvcnRfd2luZG93X2xheW91dF9jb250cmFjdHMiLCAiaW1wb3J0X21lc3NhZ2luZ19jb250cmFjdHMiLCAiaW1wb3J0X21vYngiLCAid2luZG93IiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF93aW5kb3dfbGF5b3V0X2NvbnRyYWN0cyIsICJ3aW5kb3ciLCAiaW1wb3J0X2luamVjdGFibGUiLCAiaW1wb3J0X21vYngiLCAiaW1wb3J0X2VsZW1lbnRfY29tcG9uZW50cyIsICJpbXBvcnRfaG90YmFyX2NvbnRyYWN0cyIsICJpbXBvcnRfaWNvbiIsICJpbXBvcnRfZHJvcF9kb3duX21lbnVfY29udHJhY3RzIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF91c2VfaW5qZWN0IiwgImltcG9ydF9tb2J4X3JlYWN0IiwgImltcG9ydF9kcm9wX2Rvd25fbWVudV9jb250cmFjdHMiLCAiaW1wb3J0X2Ryb3BfZG93bl9tZW51X2l0ZW1zIiwgImltcG9ydF9lbGVtZW50X2NvbXBvbmVudHMiLCAiaW1wb3J0X2ljb24iLCAiaW1wb3J0X3VzZV9pbmplY3QiLCAiaW1wb3J0X21vYnhfcmVhY3QiLCAiaW1wb3J0X21lc3NhZ2luZ19jb250cmFjdHMiLCAiZGlzcGxheSIsICJ0aXRsZU9mIiwgIl9hIiwgImltcG9ydF9lbGVtZW50X2NvbXBvbmVudHMiLCAiaW1wb3J0X2pzeF9ydW50aW1lIiwgIndpbmRvdyIsICJpbXBvcnRfaW5qZWN0YWJsZSIsICJpbXBvcnRfbW9kYWxfY29udHJhY3RzIiwgImltcG9ydF9lbGVtZW50X2NvbXBvbmVudHMiLCAiaW1wb3J0X2lucHV0X2NvbXBvbmVudHMiLCAiaW1wb3J0X21vZGFsX2NvbXBvbmVudHMiLCAiaW1wb3J0X21vZGFsX2NvbnRyYWN0cyIsICJpbXBvcnRfaWNvbiIsICJzdHlsZXNoZWV0IiwgImltcG9ydF9zdHlsZXNoZWV0X2NvbnRyYWN0cyIsICJpbXBvcnRfdXNlX2luamVjdCIsICJpbXBvcnRfbW9ieF9yZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAiaW1wb3J0X2VsZW1lbnRfY29tcG9uZW50cyIsICJpbXBvcnRfZHJvcF9kb3duX21lbnVfY29udHJhY3RzIiwgImltcG9ydF9pY29uIiwgImltcG9ydF9pbnB1dF9jb21wb25lbnRzIiwgImltcG9ydF9tZXNzYWdpbmdfY29udHJhY3RzIiwgImltcG9ydF91c2VfaW5qZWN0IiwgImltcG9ydF9tb2J4X3JlYWN0IiwgImltcG9ydF9yZWFjdCIsICJzdHlsZXNoZWV0IiwgImltcG9ydF9zdHlsZXNoZWV0X2NvbnRyYWN0cyIsICJpbXBvcnRfZWxlbWVudF9jb21wb25lbnRzIiwgImltcG9ydF9pbnB1dF9jb21wb25lbnRzIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9tb2J4IiwgImltcG9ydF9uYXZpZ2F0aW9uX2NvbnRyYWN0cyIsICJpbXBvcnRfcmVhY3QiLCAiaW1wb3J0X2luamVjdGFibGUiLCAiaW1wb3J0X21lc3NhZ2luZ19jb250cmFjdHMiLCAiaW1wb3J0X21vZGFsX2NvbnRyYWN0cyIsICJpbXBvcnRfd2luZG93X2xheW91dF9jb250cmFjdHMiLCAiaW1wb3J0X2NsdXN0ZXJfY29udHJhY3RzIiwgImltcG9ydF9zdWJfd2luZG93X2NvbnRyYWN0cyIsICJpbXBvcnRfbW9ieCIsICJpbXBvcnRfcGxhY2Vfc3ViX3dpbmRvd19jb250cmFjdHMiLCAicGx1cmFsIiwgIndpbmRvdyIsICJfYSIsICJpbXBvcnRfanN4X3J1bnRpbWUiLCAiaW1wb3J0X2pzeF9ydW50aW1lIiwgImdhcCIsICJ3aW5kb3ciLCAidGl0bGVPZiIsICJwbHVyYWwiLCAib2JzZXJ2ZXIiLCAibmV4dCIsICJpbXBvcnRfanN4X3J1bnRpbWUiLCAicGx1cmFsIiwgIk91dE9mRGF0ZU1vZGFsIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9ub3RpZmljYXRpb25zX2NvbnRyYWN0cyIsICJpbXBvcnRfaW5qZWN0YWJsZSIsICJpbXBvcnRfbm90aWZpY2F0aW9uc19jb250cmFjdHMiLCAiaW1wb3J0X2pzeF9ydW50aW1lIiwgImltcG9ydF9qc3hfcnVudGltZSIsICJpbXBvcnRfY29tbWFuZF9wYWxldHRlX2NvbnRyYWN0cyIsICJpbXBvcnRfaW5qZWN0YWJsZSIsICJpbXBvcnRfZWxlbWVudF9jb21wb25lbnRzIiwgImltcG9ydF9pY29uIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF91c2VfaW5qZWN0IiwgImltcG9ydF9qc3hfcnVudGltZSIsICJtb2R1bGVzIl0KfQo=
|
|
5018
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9sYXlvdXRzL2RlbGV0ZS13aW5kb3ctbGF5b3V0LmluamVjdGFibGUudHMiLCAiLi4vc3JjL2xheW91dHMvc2F2ZWQtd2luZG93LWxheW91dHMuaW5qZWN0YWJsZS50cyIsICIuLi9zcmMvbGF5b3V0cy9kdXBsaWNhdGUtd2luZG93LWxheW91dC5pbmplY3RhYmxlLnRzIiwgIi4uL3NyYy9sYXlvdXRzL2xheW91dC1pbi1ob3RiYXIuaW5qZWN0YWJsZS50cyIsICIuLi9zcmMvbGF5b3V0cy9sYXlvdXQtdGlsaW5nLmluamVjdGFibGUudHMiLCAiLi4vc3JjL2xheW91dHMvbGF5b3V0LXRpbGluZy50cyIsICIuLi9zcmMvbGF5b3V0cy90aWxpbmctcGxhbi50cyIsICIuLi9zcmMvbGF5b3V0cy9ncmlkLnRzIiwgIi4uL3NyYy9sYXlvdXRzL3RpbGluZy1wbGFuLmluamVjdGFibGUudHMiLCAiLi4vc3JjL2xheW91dHMvd2luZG93LWxpbmVhZ2UuaW5qZWN0YWJsZS50cyIsICIuLi9zcmMvbGF5b3V0cy9wbGFjZXMtc3ViLXdpbmRvdy1raW5kLmluamVjdGFibGUudHMiLCAiLi4vc3JjL2xheW91dHMvcmVjYWxsLXdpbmRvdy1sYXlvdXQuaW5qZWN0YWJsZS50cyIsICIuLi9zcmMvbGF5b3V0cy9zY3JlZW5zLnRzIiwgIi4uL3NyYy9sYXlvdXRzL3JlbmFtZS13aW5kb3ctbGF5b3V0LmluamVjdGFibGUudHMiLCAiLi4vc3JjL2xheW91dHMvcmVvcGVuaW5nLW9mLWNsb3NlZC13aW5kb3cuaW5qZWN0YWJsZS50cyIsICIuLi9zcmMvbGF5b3V0cy93aW5kb3ctcmVvcGVuaW5ncy5pbmplY3RhYmxlLnRzIiwgIi4uL3NyYy9sYXlvdXRzL3NhdmUtd2luZG93LWxheW91dC5pbmplY3RhYmxlLnRzIiwgIi4uL3NyYy9sYXlvdXRzL3RpbGUtd2luZG93cy5pbmplY3RhYmxlLnRzIiwgIi4uL3NyYy9sYXlvdXRzL3dpbmRvdy1sYXlvdXQtbGlzdC5pbmplY3RhYmxlLnRzIiwgIi4uL3NyYy91aS9kZWxldGUtbGF5b3V0LW1vZGFsLmluamVjdGFibGUudHN4IiwgIi4uL3NyYy91aS9tb2RhbC1lcnJvci1ib3VuZGFyeS50c3giLCAiLi4vc3JjL3VpL2xheW91dC1ob3RiYXItaXRlbS5pbmplY3RhYmxlLnRzeCIsICIuLi9zcmMvdWkvbGF5b3V0LWhvdGJhci1tZW51LmluamVjdGFibGUudHN4IiwgIi4uL3NyYy9sYXlvdXRzL2xheW91dC1wcmV2aWV3LnRzIiwgIi4uL3NyYy91aS9sYXlvdXQtcHJldmlldy50c3giLCAiLi4vc3JjL3VpL29wZW4td2luZG93LWxheW91dHMuaW5qZWN0YWJsZS50cyIsICIuLi9zcmMvdWkvd2luZG93LWxheW91dHMtbW9kYWwuaW5qZWN0YWJsZS50c3giLCAibGVucy1zdHlsZXNoZWV0Oi9Vc2Vycy9tYXNwaWFsYS8uazhzbGVucy9leHRlbnNpb25zL3dpbmRvdy1tYW5hZ2VyL3NyYy91aS9pY29uLWJ1dHRvbi5zY3NzIiwgImxlbnMtc3R5bGVzaGVldDovVXNlcnMvbWFzcGlhbGEvLms4c2xlbnMvZXh0ZW5zaW9ucy93aW5kb3ctbWFuYWdlci9zcmMvdWkvbGF5b3V0LWxpc3QubW9kdWxlLnNjc3MiLCAiLi4vc3JjL3VpL3RpbGluZy1lZGl0b3IudHN4IiwgImxlbnMtc3R5bGVzaGVldDovVXNlcnMvbWFzcGlhbGEvLms4c2xlbnMvZXh0ZW5zaW9ucy93aW5kb3ctbWFuYWdlci9zcmMvdWkvdGlsaW5nLWVkaXRvci5tb2R1bGUuc2NzcyIsICIuLi9zcmMvdWkvbmV3LXdpbmRvdy1tZW51LmluamVjdGFibGUudHN4IiwgIi4uL3NyYy9sYXlvdXRzL3Jlc291cmNlLWxpc3RzLnRzIiwgIi4uL3NyYy91aS93aW5kb3ctbGF5b3V0cy1tb2RlbC5pbmplY3RhYmxlLnRzIiwgIi4uL3NyYy91aS9yZWNhbGwtZnJvbS1ob3RiYXIuaW5qZWN0YWJsZS50cyIsICIuLi9zcmMvdWkvc2F2ZS1mcm9tLWhvdGJhci5pbmplY3RhYmxlLnRzIiwgIi4uL3NyYy91aS9zaG93LXdpbmRvdy1mcm9tLWhvdGJhci5pbmplY3RhYmxlLnRzIiwgIi4uL3NyYy91aS90aWxlLXdpbmRvd3MtY29tbWFuZC5pbmplY3RhYmxlLnRzIiwgIi4uL3NyYy91aS93aW5kb3ctbGF5b3V0cy1jb21tYW5kLmluamVjdGFibGUudHMiLCAiLi4vc3JjL3VpL3dpbmRvdy1sYXlvdXRzLW1vZGVsLnB1cmdlLmluamVjdGFibGUudHMiLCAiLi4vc3JjL3VpL3dpbmRvdy1sYXlvdXRzLXN0YXR1cy1iYXItaXRlbS5pbmplY3RhYmxlLnRzeCIsICJpbXBvcnQtZ2xvYjouLyoqLyouaW5qZWN0YWJsZS4odHN8dHN4KS9wcm9vZi1vZi11bmlxdWVuZXNzLzI2YjdjNDE3LWY4MzgtNGYyNy1iZTkyLWY4MDgyYzdlODZjZCIsICJpbXBvcnQtZ2xvYjouLyoqLyEoXyopLihzY3NzfGNzcykvcHJvb2Ytb2YtdW5pcXVlbmVzcy8xNTFkMzUwYS00N2Q0LTQyYzctYTY2Yy04YWI5NDg3MWJiM2IiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7XG4gIGdldEZlYXR1cmUsXG4gIHJlZ2lzdGVySW5qZWN0YWJsZXNGcm9tTW9kdWxlcyxcbn0gZnJvbSBcIkBrOHNsZW5zL2ZlYXR1cmUtY29yZVwiO1xuaW1wb3J0IG1vZHVsZXNXaXRoSW5qZWN0YWJsZXMgZnJvbSBcIi4vKiovKi5pbmplY3RhYmxlLih0c3x0c3gpXCI7XG5pbXBvcnQgc3R5bGVzaGVldHMgZnJvbSBcIi4vKiovIShfKikuKHNjc3N8Y3NzKVwiO1xuXG5leHBvcnQgY29uc3QgazhTbGVuc1dpbmRvd0xheW91dHNGZWF0dXJlID0gZ2V0RmVhdHVyZSh7XG4gIGlkOiBcIkBrOHNsZW5zL3dpbmRvdy1sYXlvdXRzXCIsXG4gIHJlZ2lzdGVyOiAoZGkpID0+IHtcbiAgICAvLyBBdXRvLWRpc2NvdmVycyBldmVyeSBgKi5pbmplY3RhYmxlLih0c3x0c3gpYCBmaWxlIHVuZGVyIHRoaXMgZGlyZWN0b3J5IGFuZCByZWdpc3RlcnNcbiAgICAvLyBpdC4gUHJlZmVycmVkIG92ZXIgcmVnaXN0ZXJpbmcgaW5qZWN0YWJsZXMgb25lIGJ5IG9uZSBcdTIwMTQgYWRkaW5nIGEgbmV3IGluamVjdGFibGUgZmlsZVxuICAgIC8vIGF1dG9tYXRpY2FsbHkgd2lyZXMgaXQgdXA7IHlvdSBjYW4ndCBmb3JnZXQgdG8gcmVnaXN0ZXIgaXQuXG4gICAgLy8gRXZlcnkgYC5zY3NzYCwgYC5jc3NgLCBgLm1vZHVsZS5zY3NzYCBhbmQgYC5tb2R1bGUuY3NzYCB5b3UgaW1wb3J0IGJlY29tZXMgYSBzdHlsZXNoZWV0XG4gICAgLy8gaW5qZWN0YWJsZSB3aGVuIHRoZSBleHRlbnNpb24gYnVpbGRzLCBhbmQgcmlkZXMgYWxvbmcgaGVyZSB0aGUgc2FtZSB3YXk7IGEgYF9wYXJ0aWFsLnNjc3NgXG4gICAgLy8gc3RheXMgb3V0IG9mIHRoZSBnbG9iLlxuICAgIHJlZ2lzdGVySW5qZWN0YWJsZXNGcm9tTW9kdWxlcyhkaSwgW1xuICAgICAgLi4ubW9kdWxlc1dpdGhJbmplY3RhYmxlcyxcbiAgICAgIC4uLnN0eWxlc2hlZXRzLFxuICAgIF0pO1xuICB9LFxufSk7XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0YWJsZTIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgcnVuSW5BY3Rpb24gfSBmcm9tIFwibW9ieFwiO1xuaW1wb3J0IHsgc2F2ZWRXaW5kb3dMYXlvdXRzQnVuY2ggfSBmcm9tIFwiLi9zYXZlZC13aW5kb3ctbGF5b3V0cy5pbmplY3RhYmxlXCI7XG5cbmV4cG9ydCBjb25zdCBkZWxldGVXaW5kb3dMYXlvdXRJbmplY3RhYmxlID0gZ2V0SW5qZWN0YWJsZTIoe1xuICBpZDogXCJ3aW5kb3ctbWFuYWdlci5kZWxldGUtd2luZG93LWxheW91dFwiLFxuXG4gIGluc3RhbnRpYXRlOiAoZGkpID0+IHtcbiAgICBjb25zdCBnZXRTYXZlZExheW91dHMgPSBkaS5pbmplY3Qoc2F2ZWRXaW5kb3dMYXlvdXRzQnVuY2gucGVyc2lzdGFibGUpO1xuXG4gICAgcmV0dXJuICgpID0+IGFzeW5jIChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHNhdmVkTGF5b3V0cyA9IGF3YWl0IGdldFNhdmVkTGF5b3V0cygpO1xuXG4gICAgICBydW5JbkFjdGlvbigoKSA9PiBzYXZlZExheW91dHMuZGVsZXRlKG5hbWUpKTtcbiAgICB9O1xuICB9LFxufSk7XG4iLCAiaW1wb3J0IHsgZ2V0UGVyc2lzdGFibGVNYXBJbmplY3RhYmxlQnVuY2ggfSBmcm9tIFwiQGs4c2xlbnMvcGVyc2lzdGFibGUtY29udHJhY3RzXCI7XG5pbXBvcnQgdHlwZSB7IFdpbmRvd0lkIH0gZnJvbSBcIkBrOHNsZW5zL21lc3NhZ2luZy1jb250cmFjdHNcIjtcbmltcG9ydCB0eXBlIHtcbiAgV2luZG93Qm91bmRzLFxuICBXaW5kb3dSZW9wZW5pbmcsXG4gIFdpbmRvd1N0YXRlLFxufSBmcm9tIFwiQGs4c2xlbnMvd2luZG93LWxheW91dC1jb250cmFjdHNcIjtcbmltcG9ydCB0eXBlIHsgU3RvcmVkUGxhblNjcmVlbiB9IGZyb20gXCIuL3RpbGluZy1wbGFuXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2F2ZWRXaW5kb3cge1xuICByZWFkb25seSB3aW5kb3c6IFdpbmRvd0lkO1xuICByZWFkb25seSB0aXRsZTogc3RyaW5nO1xuICAvLyBXaGF0IExlbnMga2VlcHMgb2YgdGhlIHdpbmRvdyB0byBvcGVuIGl0IGFnYWluIG9uY2UgY2xvc2VkOyBtaXNzaW5nIGZvciBhIHdpbmRvdyB0aGF0IGNhbm5vdFxuICAvLyBiZSwgYXMgdGhlIGFwcGxpY2F0aW9uIHdpbmRvdywgYW5kIGZyb20gbGF5b3V0cyBzYXZlZCBiZWZvcmUgd2luZG93cyB3ZXJlIGtlcHQuXG4gIHJlYWRvbmx5IHJlb3BlbmluZz86IFdpbmRvd1Jlb3BlbmluZztcbiAgLy8gV2hlcmUgdGhlIHdpbmRvdyBzaG93cyBub3JtYWxseSwgc28gYSBtYXhpbWl6ZWQgd2luZG93IGNvbWVzIGJhY2sgdG8gdGhlIHJpZ2h0IHBsYWNlIHdoZW4gcmVzdG9yZWQuXG4gIHJlYWRvbmx5IG5vcm1hbEJvdW5kczogV2luZG93Qm91bmRzO1xuICByZWFkb25seSBzdGF0ZTogV2luZG93U3RhdGU7XG4gIHJlYWRvbmx5IGlzRm9jdXNlZDogYm9vbGVhbjtcbiAgLy8gVGhlIHNjcmVlbiB0aGUgd2luZG93IHdhcyBvbjsgbWlzc2luZyBmcm9tIGxheW91dHMgc2F2ZWQgYmVmb3JlIHNjcmVlbnMgd2VyZSBrZXB0IGJ5IHdpbmRvdy5cbiAgcmVhZG9ubHkgZGlzcGxheUlkPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNhdmVkRGlzcGxheSB7XG4gIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGlzUHJpbWFyeTogYm9vbGVhbjtcbiAgcmVhZG9ubHkgYm91bmRzOiBXaW5kb3dCb3VuZHM7XG59XG5cbi8vIEhvdyBhIHdpbmRvdyBvZiB0aGUgbGF5b3V0IGlzIHRpbGVkIGluIHRoZSBsYXlvdXQncyB0aWxpbmcgc2V0dXAsIHRoZSB3aW5kb3cgbmFtZWQgYnkgaXRzIHBsYWNlXG4vLyBpbiB0aGUgbGF5b3V0J3Mgd2luZG93cywgYXMgaXRzIGlkIGRvZXMgbm90IG91dGxpdmUgdGhlIHdpbmRvdy5cbmV4cG9ydCBpbnRlcmZhY2UgU2F2ZWRUaWxpbmdXaW5kb3cge1xuICByZWFkb25seSBpbmRleDogbnVtYmVyO1xuICByZWFkb25seSBkaXNwbGF5SWQ6IG51bWJlciB8IG51bGw7XG4gIHJlYWRvbmx5IGNvbHVtbj86IG51bWJlcjtcbiAgcmVhZG9ubHkgcm93PzogbnVtYmVyO1xuICByZWFkb25seSBjb2x1bW5zOiBudW1iZXI7XG4gIHJlYWRvbmx5IHJvd3M6IG51bWJlcjtcbn1cblxuLy8gVGhlIHRpbGluZyBzZXR1cCBzYXZlZCB3aXRoIGEgbGF5b3V0OiBpdHMgd2luZG93cyBpbiB0aGUgc2V0dXAncyBvcmRlciwgYW5kIHRoZSBzY3JlZW5zJyBncmlkcy5cbmV4cG9ydCBpbnRlcmZhY2UgU2F2ZWRUaWxpbmcge1xuICByZWFkb25seSB3aW5kb3dzOiByZWFkb25seSBTYXZlZFRpbGluZ1dpbmRvd1tdO1xuICByZWFkb25seSBjb2x1bW5zOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PjtcbiAgcmVhZG9ubHkgcm93czogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgbnVtYmVyPj47XG4gIC8vIFRoZSBzY3JlZW5zIG9mIHRoZSBzZXR1cCwgYnkgaWQsIHRvIHNob3cgb25lIG5vdCBjb25uZWN0ZWQ7IG1pc3NpbmcgZnJvbSBzZXR1cHMgc2F2ZWQgYmVmb3JlLlxuICByZWFkb25seSBzY3JlZW5zPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgU3RvcmVkUGxhblNjcmVlbj4+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNhdmVkV2luZG93TGF5b3V0IHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBzYXZlZEF0OiBudW1iZXI7XG4gIHJlYWRvbmx5IHdpbmRvd3M6IHJlYWRvbmx5IFNhdmVkV2luZG93W107XG4gIC8vIFRoZSBzY3JlZW5zIHRoZSBsYXlvdXQgd2FzIHNhdmVkIG9uOyBtaXNzaW5nIGZyb20gbGF5b3V0cyBzYXZlZCBiZWZvcmUgc2NyZWVucyB3ZXJlIGtlcHQuXG4gIHJlYWRvbmx5IGRpc3BsYXlzPzogcmVhZG9ubHkgU2F2ZWREaXNwbGF5W107XG4gIC8vIFRoZSB0aWxpbmcgc2V0dXAgY3VycmVudCB3aGVuIHRoZSBsYXlvdXQgd2FzIHNhdmVkOyBtaXNzaW5nIGZyb20gbGF5b3V0cyBzYXZlZCBiZWZvcmUuXG4gIHJlYWRvbmx5IHRpbGluZz86IFNhdmVkVGlsaW5nO1xufVxuXG5leHBvcnQgY29uc3Qgc2F2ZWRXaW5kb3dMYXlvdXRzQnVuY2ggPSBnZXRQZXJzaXN0YWJsZU1hcEluamVjdGFibGVCdW5jaDxcbiAgc3RyaW5nLFxuICBTYXZlZFdpbmRvd0xheW91dFxuPigpKHtcbiAgLy8gT2YgaXRzIHNlY29uZCB2ZXJzaW9uOiB0aGUgbGF5b3V0cyBzYXZlZCBiZWZvcmUgTGVucyBkZXNjcmliZWQgZXZlcnkgd2luZG93IGl0IGNhbiBvcGVuXG4gIC8vIGFnYWluLCBhcyBQcmVmZXJlbmNlcywgYXJlIGxlZnQgYmVoaW5kIHJhdGhlciB0aGFuIHJlYWQuXG4gIGlkOiBcInNhdmVkLXdpbmRvdy1sYXlvdXRzLTJcIixcbn0pO1xuIiwgImltcG9ydCB7IGdldEluamVjdGFibGUyIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcbmltcG9ydCB7IHJ1bkluQWN0aW9uIH0gZnJvbSBcIm1vYnhcIjtcbmltcG9ydCB7IHNhdmVkV2luZG93TGF5b3V0c0J1bmNoIH0gZnJvbSBcIi4vc2F2ZWQtd2luZG93LWxheW91dHMuaW5qZWN0YWJsZVwiO1xuXG4vLyBUaGUgbmFtZSBhIGNvcHkgb2YgYSBsYXlvdXQgZ2V0czogXCI8bmFtZT4gY29weVwiLCBudW1iZXJlZCBhZnRlciB0aGUgZmlyc3QsIGFzIFwiPG5hbWU+IGNvcHkgMlwiLlxuY29uc3QgY29weU5hbWUgPSAobmFtZTogc3RyaW5nLCB0YWtlbjogKG5hbWU6IHN0cmluZykgPT4gYm9vbGVhbikgPT4ge1xuICBjb25zdCBiYXNlID0gYCR7bmFtZX0gY29weWA7XG4gIGxldCBudW1iZXIgPSAxO1xuXG4gIHdoaWxlICh0YWtlbihudW1iZXIgPT09IDEgPyBiYXNlIDogYCR7YmFzZX0gJHtudW1iZXJ9YCkpIHtcbiAgICBudW1iZXIrKztcbiAgfVxuXG4gIHJldHVybiBudW1iZXIgPT09IDEgPyBiYXNlIDogYCR7YmFzZX0gJHtudW1iZXJ9YDtcbn07XG5cbi8vIENvcGllcyBhIGxheW91dCwgaXRzIHdpbmRvd3MgYW5kIGl0cyB0aWxpbmcsIHVuZGVyIGEgbmFtZSBvZiBpdHMgb3duOyB0aGUgbmFtZSBpdCBnb3QsIG9yXG4vLyB1bmRlZmluZWQgd2hlbiB0aGVyZSBpcyBubyBzdWNoIGxheW91dC5cbmV4cG9ydCBjb25zdCBkdXBsaWNhdGVXaW5kb3dMYXlvdXRJbmplY3RhYmxlID0gZ2V0SW5qZWN0YWJsZTIoe1xuICBpZDogXCJ3aW5kb3ctbWFuYWdlci5kdXBsaWNhdGUtd2luZG93LWxheW91dFwiLFxuXG4gIGluc3RhbnRpYXRlOiAoZGkpID0+IHtcbiAgICBjb25zdCBnZXRTYXZlZExheW91dHMgPSBkaS5pbmplY3Qoc2F2ZWRXaW5kb3dMYXlvdXRzQnVuY2gucGVyc2lzdGFibGUpO1xuXG4gICAgcmV0dXJuICgpID0+XG4gICAgICBhc3luYyAoZnJvbTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+ID0+IHtcbiAgICAgICAgY29uc3Qgc2F2ZWRMYXlvdXRzID0gYXdhaXQgZ2V0U2F2ZWRMYXlvdXRzKCk7XG4gICAgICAgIGNvbnN0IGxheW91dCA9IHNhdmVkTGF5b3V0cy5nZXQoZnJvbSk7XG5cbiAgICAgICAgaWYgKCFsYXlvdXQpIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmFtZSA9IGNvcHlOYW1lKGZyb20sIChpdCkgPT4gc2F2ZWRMYXlvdXRzLmhhcyhpdCkpO1xuXG4gICAgICAgIHJ1bkluQWN0aW9uKCgpID0+XG4gICAgICAgICAgc2F2ZWRMYXlvdXRzLnNldChuYW1lLCB7IC4uLmxheW91dCwgbmFtZSwgc2F2ZWRBdDogRGF0ZS5ub3coKSB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgIH07XG4gIH0sXG59KTtcbiIsICJpbXBvcnQge1xuICBhZGRUb0hvdGJhckluamVjdGlvblRva2VuLFxuICBnZXRIb3RiYXJJdGVtS2luZCxcbiAgaXNJbkhvdGJhckluamVjdGlvblRva2VuLFxuICBpc0luSG90YmFyUmVhY3RpdmVJbmplY3Rpb25Ub2tlbixcbiAgcmVtb3ZlRnJvbUhvdGJhckluamVjdGlvblRva2VuLFxufSBmcm9tIFwiQGs4c2xlbnMvaG90YmFyLWNvbnRyYWN0c1wiO1xuaW1wb3J0IHsgZ2V0SW5qZWN0YWJsZTIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuXG4vLyBBbiBpdGVtIG9mIHRoZSBob3RiYXIgcmVjYWxsaW5nIGEgbGF5b3V0LCBieSB0aGUgbGF5b3V0J3MgbmFtZSwgd2hpY2ggaXMgYWxzbyBpdHMgaWQuXG5leHBvcnQgY29uc3QgbGF5b3V0SG90YmFySXRlbUtpbmQgPSBnZXRIb3RiYXJJdGVtS2luZDx7IG5hbWU6IHN0cmluZyB9PigpKFxuICBcIndpbmRvdy1sYXlvdXRcIixcbik7XG5cbi8vIFBpbnMgbGF5b3V0cyB0byB0aGUgaG90YmFyIGFuZCB0YWtlcyB0aGVtIG9mZiwgYW5kIGtlZXBzIGFuIGl0ZW0gZ29pbmcgYnkgaXRzIGxheW91dCBhcyB0aGVcbi8vIGxheW91dCBpcyByZW5hbWVkIG9yIGRlbGV0ZWQuIFRoZSBob3RiYXIgYW5zd2VycyBmb3IgaXRzIGN1cnJlbnQgcGFnZSBvbmx5LlxuZXhwb3J0IGNvbnN0IGxheW91dEluSG90YmFySW5qZWN0YWJsZSA9IGdldEluamVjdGFibGUyKHtcbiAgaWQ6IFwid2luZG93LW1hbmFnZXIubGF5b3V0LWluLWhvdGJhclwiLFxuICBjb25zdW1wdGlvbnM6IFtcbiAgICBhZGRUb0hvdGJhckluamVjdGlvblRva2VuLFxuICAgIGlzSW5Ib3RiYXJJbmplY3Rpb25Ub2tlbixcbiAgICBpc0luSG90YmFyUmVhY3RpdmVJbmplY3Rpb25Ub2tlbixcbiAgICByZW1vdmVGcm9tSG90YmFySW5qZWN0aW9uVG9rZW4sXG4gIF0sXG5cbiAgaW5zdGFudGlhdGU6IChkaSkgPT4ge1xuICAgIGNvbnN0IGFkZCA9IGRpLmluamVjdChcbiAgICAgIGFkZFRvSG90YmFySW5qZWN0aW9uVG9rZW4uZm9yKGxheW91dEhvdGJhckl0ZW1LaW5kKS5mb3IoZGkuc2NvcGVJZHMpLFxuICAgICkoKTtcbiAgICBjb25zdCBpc0luID0gZGkuaW5qZWN0KFxuICAgICAgaXNJbkhvdGJhckluamVjdGlvblRva2VuLmZvcihsYXlvdXRIb3RiYXJJdGVtS2luZCkuZm9yKGRpLnNjb3BlSWRzKSxcbiAgICApKCk7XG4gICAgY29uc3QgaXNJblJlYWN0aXZlID0gZGkuaW5qZWN0KFxuICAgICAgaXNJbkhvdGJhclJlYWN0aXZlSW5qZWN0aW9uVG9rZW5cbiAgICAgICAgLmZvcihsYXlvdXRIb3RiYXJJdGVtS2luZClcbiAgICAgICAgLmZvcihkaS5zY29wZUlkcyksXG4gICAgKTtcbiAgICBjb25zdCByZW1vdmUgPSBkaS5pbmplY3QoXG4gICAgICByZW1vdmVGcm9tSG90YmFySW5qZWN0aW9uVG9rZW4uZm9yKGxheW91dEhvdGJhckl0ZW1LaW5kKS5mb3IoZGkuc2NvcGVJZHMpLFxuICAgICkoKTtcblxuICAgIGNvbnN0IHBpbiA9IChuYW1lOiBzdHJpbmcpID0+IGFkZCh7IGlkOiBuYW1lLCBwZXJzaXN0ZWREYXRhOiB7IG5hbWUgfSB9KTtcblxuICAgIHJldHVybiAoKSA9PiAoe1xuICAgICAgaXNQaW5uZWQ6IChuYW1lOiBzdHJpbmcpID0+IGlzSW5SZWFjdGl2ZShuYW1lKSxcblxuICAgICAgdG9nZ2xlOiBhc3luYyAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChhd2FpdCBpc0luKG5hbWUpKSB7XG4gICAgICAgICAgYXdhaXQgcmVtb3ZlKG5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHBpbihuYW1lKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLy8gVGhlIGl0ZW0gb2YgdGhlIGxheW91dCB1bmRlciBpdHMgb2xkIG5hbWUgZ29lcyBieSB0aGUgbmV3IG9uZSwgaW4gdGhlIGZpcnN0IGZyZWUgc2xvdC5cbiAgICAgIHJlbmFtZWQ6IGFzeW5jIChmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKGF3YWl0IGlzSW4oZnJvbSkpIHtcbiAgICAgICAgICBhd2FpdCByZW1vdmUoZnJvbSk7XG4gICAgICAgICAgYXdhaXQgcGluKHRvKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgZGVsZXRlZDogYXN5bmMgKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoYXdhaXQgaXNJbihuYW1lKSkge1xuICAgICAgICAgIGF3YWl0IHJlbW92ZShuYW1lKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfSxcbn0pO1xuIiwgImltcG9ydCB7IGdldEluamVjdGFibGUyIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcbmltcG9ydCB0eXBlIHsgV2luZG93SWQgfSBmcm9tIFwiQGs4c2xlbnMvbWVzc2FnaW5nLWNvbnRyYWN0c1wiO1xuaW1wb3J0IHtcbiAgZGlzcGxheVJlY29yZHNJbmplY3Rpb25Ub2tlbixcbiAgd2luZG93UmVjb3Jkc0luamVjdGlvblRva2VuLFxufSBmcm9tIFwiQGs4c2xlbnMvd2luZG93LWxheW91dC1jb250cmFjdHNcIjtcbmltcG9ydCB7IHJ1bkluQWN0aW9uIH0gZnJvbSBcIm1vYnhcIjtcbmltcG9ydCB7IG1hdGNoT3BlbldpbmRvd3MsIHRvU2F2ZWRUaWxpbmcsIHRvVGlsaW5nUGxhbiB9IGZyb20gXCIuL2xheW91dC10aWxpbmdcIjtcbmltcG9ydCB7XG4gIHNhdmVkV2luZG93TGF5b3V0c0J1bmNoLFxuICB0eXBlIFNhdmVkV2luZG93LFxufSBmcm9tIFwiLi9zYXZlZC13aW5kb3ctbGF5b3V0cy5pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyBrZXlPZldpbmRvdywgcmVzb2x2ZVRpbGluZ1BsYW4gfSBmcm9tIFwiLi90aWxpbmctcGxhblwiO1xuaW1wb3J0IHsgc3RvcmVkVGlsaW5nUGxhbkJ1bmNoIH0gZnJvbSBcIi4vdGlsaW5nLXBsYW4uaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHtcbiAgY29udGludWVkV2luZG93c09mLFxuICBsaW5lYWdlS2V5LFxuICB3aW5kb3dDb250aW51ZXNCdW5jaCxcbiAgd2luZG93TGluZWFnZUJ1bmNoLFxufSBmcm9tIFwiLi93aW5kb3ctbGluZWFnZS5pbmplY3RhYmxlXCI7XG5cbi8vIEEgbGF5b3V0J3MgdGlsaW5nIHNldHVwLCBiZXR3ZWVuIHRoZSBsYXlvdXQgYW5kIHRoZSBjdXJyZW50IHNldHVwIHRoZSBlZGl0b3Igc2hvd3MsIHRoZSBvcGVuXG4vLyB3aW5kb3dzIHN0YW5kaW5nIGZvciB0aGUgbGF5b3V0J3Mgd2luZG93cyBhcyB3aGVuIGl0IGlzIHJlY2FsbGVkLlxuZXhwb3J0IGNvbnN0IGxheW91dFRpbGluZ0luamVjdGFibGUgPSBnZXRJbmplY3RhYmxlMih7XG4gIGlkOiBcIndpbmRvdy1tYW5hZ2VyLmxheW91dC10aWxpbmdcIixcbiAgY29uc3VtcHRpb25zOiBbd2luZG93UmVjb3Jkc0luamVjdGlvblRva2VuLCBkaXNwbGF5UmVjb3Jkc0luamVjdGlvblRva2VuXSxcblxuICBpbnN0YW50aWF0ZTogKGRpKSA9PiB7XG4gICAgY29uc3QgZ2V0V2luZG93UmVjb3JkcyA9IGRpLmluamVjdCh3aW5kb3dSZWNvcmRzSW5qZWN0aW9uVG9rZW4pKCk7XG4gICAgY29uc3QgZ2V0RGlzcGxheVJlY29yZHMgPSBkaS5pbmplY3QoZGlzcGxheVJlY29yZHNJbmplY3Rpb25Ub2tlbikoKTtcbiAgICBjb25zdCBnZXRTYXZlZExheW91dHMgPSBkaS5pbmplY3Qoc2F2ZWRXaW5kb3dMYXlvdXRzQnVuY2gucGVyc2lzdGFibGUpO1xuICAgIGNvbnN0IGdldFN0b3JlZFRpbGluZ1BsYW4gPSBkaS5pbmplY3Qoc3RvcmVkVGlsaW5nUGxhbkJ1bmNoLnBlcnNpc3RhYmxlKTtcbiAgICBjb25zdCBnZXRXaW5kb3dMaW5lYWdlID0gZGkuaW5qZWN0KHdpbmRvd0xpbmVhZ2VCdW5jaC5wZXJzaXN0YWJsZSk7XG4gICAgY29uc3QgZ2V0V2luZG93Q29udGludWVzID0gZGkuaW5qZWN0KHdpbmRvd0NvbnRpbnVlc0J1bmNoLnBlcnNpc3RhYmxlKTtcblxuICAgIC8vIFRoZSBvcGVuIHdpbmRvd3Mgc3RhbmRpbmcgZm9yIHRoZSBsYXlvdXQnczogdGhlIHNhbWUgd2luZG93LCB0aGUgb25lIG9wZW5lZCBhZ2FpbiBhcyBpdCwgYXMgdGhlXG4gICAgLy8gbGF5b3V0IGZvdW5kIG9yIG9wZW5lZCBpdCBiZWZvcmUsIG9yIG9uZSBkb2luZyB0aGUgc2FtZS5cbiAgICBjb25zdCBtYXRjaExheW91dCA9IGFzeW5jIChcbiAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgIHdpbmRvd3M6IHJlYWRvbmx5IFNhdmVkV2luZG93W10sXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgZ2V0V2luZG93UmVjb3JkcygpO1xuICAgICAgY29uc3QgbGluZWFnZSA9IGF3YWl0IGdldFdpbmRvd0xpbmVhZ2UoKTtcbiAgICAgIGNvbnN0IGNvbnRpbnVlcyA9IGF3YWl0IGdldFdpbmRvd0NvbnRpbnVlcygpO1xuICAgICAgY29uc3Qgb3BlbiA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICByZWNvcmRzLm1hcChhc3luYyAocmVjb3JkKSA9PiAoe1xuICAgICAgICAgIHJlY29yZCxcbiAgICAgICAgICByZW9wZW5pbmc6IGF3YWl0IHJlY29yZC5kZXNjcmliZVJlb3BlbmluZygpLFxuICAgICAgICAgIHN0YW5kc0ZvcjogbGluZWFnZS5nZXQobGluZWFnZUtleShuYW1lLCBrZXlPZldpbmRvdyhyZWNvcmQud2luZG93KSkpLFxuICAgICAgICAgIGNvbnRpbnVlczogY29udGludWVkV2luZG93c09mKFxuICAgICAgICAgICAga2V5T2ZXaW5kb3cocmVjb3JkLndpbmRvdyksXG4gICAgICAgICAgICBjb250aW51ZXMsXG4gICAgICAgICAgICBsaW5lYWdlLFxuICAgICAgICAgICksXG4gICAgICAgIH0pKSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB7IHJlY29yZHMsIG1hdGNoZXM6IG1hdGNoT3BlbldpbmRvd3Mod2luZG93cywgb3BlbikgfTtcbiAgICB9O1xuXG4gICAgcmV0dXJuICgpID0+ICh7XG4gICAgICAvLyBNYWtlcyB0aGUgbGF5b3V0J3MgdGlsaW5nIHNldHVwIHRoZSBjdXJyZW50IG9uZSwgdGhlIHdpbmRvd3Mgc3RheWluZyB3aGVyZSB0aGV5IGFyZTsgZXZlcnlcbiAgICAgIC8vIHdpbmRvdyBvZiB0aGUgbGF5b3V0IGlzIGluIGl0LCBvbmUgbm90IG9wZW4gYXMgbWlzc2luZy4gUmVzb2x2ZXMgd2hldGhlciB0aGVyZSBpcyBzdWNoIGEgbGF5b3V0LlxuICAgICAgbG9hZDogYXN5bmMgKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBsYXlvdXQgPSAoYXdhaXQgZ2V0U2F2ZWRMYXlvdXRzKCkpLmdldChuYW1lKTtcblxuICAgICAgICBpZiAoIWxheW91dCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgbWF0Y2hlcyB9ID0gYXdhaXQgbWF0Y2hMYXlvdXQobmFtZSwgbGF5b3V0LndpbmRvd3MpO1xuICAgICAgICBjb25zdCBsaW5lYWdlID0gYXdhaXQgZ2V0V2luZG93TGluZWFnZSgpO1xuXG4gICAgICAgIC8vIEVhY2ggb3BlbiB3aW5kb3cgZm91bmQgYXMgb25lIG9mIHRoZSBsYXlvdXQncyB1bmRlciBhbm90aGVyIGtleSBpcyBrZXB0IHNvLCBmb3IgdGhlXG4gICAgICAgIC8vIGxheW91dDogb25jZSBjbG9zZWQsIGl0cyB0aWxlIGtub3dzIHdoaWNoIG9mIHRoZSBsYXlvdXQncyB3aW5kb3dzIGl0IGlzLCBhbmQgb3BlbmVkIGFnYWluXG4gICAgICAgIC8vIGl0IGlzIHRoYXQgb25lIHN0aWxsLlxuICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCBbc2F2ZWQsIHJlY29yZF0gb2YgbWF0Y2hlcykge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0ga2V5T2ZXaW5kb3cocmVjb3JkLndpbmRvdyk7XG4gICAgICAgICAgICBjb25zdCBzYXZlZEtleSA9IGtleU9mV2luZG93KHNhdmVkLndpbmRvdyk7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAga2V5ICE9PSBzYXZlZEtleSAmJlxuICAgICAgICAgICAgICBsaW5lYWdlLmdldChsaW5lYWdlS2V5KG5hbWUsIGtleSkpICE9PSBzYXZlZEtleVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGxpbmVhZ2Uuc2V0KGxpbmVhZ2VLZXkobmFtZSwga2V5KSwgc2F2ZWRLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgd2luZG93T2YgPSBuZXcgTWFwPFNhdmVkV2luZG93LCBXaW5kb3dJZD4oXG4gICAgICAgICAgWy4uLm1hdGNoZXNdLm1hcCgoW3NhdmVkLCByZWNvcmRdKSA9PiBbc2F2ZWQsIHJlY29yZC53aW5kb3ddKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc3RvcmVkID0gYXdhaXQgZ2V0U3RvcmVkVGlsaW5nUGxhbigpO1xuXG4gICAgICAgIGNvbnN0IHBsYW4gPSB0b1RpbGluZ1BsYW4oXG4gICAgICAgICAgbGF5b3V0LnRpbGluZyxcbiAgICAgICAgICBsYXlvdXQud2luZG93cyxcbiAgICAgICAgICB3aW5kb3dPZixcbiAgICAgICAgICBhd2FpdCBnZXREaXNwbGF5UmVjb3JkcygpLFxuICAgICAgICApO1xuXG4gICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHN0b3JlZC5zZXQocGxhbikpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfSxcbn0pO1xuIiwgImltcG9ydCB7XG4gIGlzQXBwbGljYXRpb25XaW5kb3csXG4gIHR5cGUgV2luZG93SWQsXG59IGZyb20gXCJAazhzbGVucy9tZXNzYWdpbmctY29udHJhY3RzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIERpc3BsYXlSZWNvcmQsXG4gIFdpbmRvd1JlY29yZCxcbiAgV2luZG93UmVvcGVuaW5nLFxufSBmcm9tIFwiQGs4c2xlbnMvd2luZG93LWxheW91dC1jb250cmFjdHNcIjtcbmltcG9ydCB0eXBlIHtcbiAgU2F2ZWRUaWxpbmcsXG4gIFNhdmVkV2luZG93LFxufSBmcm9tIFwiLi9zYXZlZC13aW5kb3ctbGF5b3V0cy5pbmplY3RhYmxlXCI7XG5pbXBvcnQge1xuICBrZXlPZldpbmRvdyxcbiAgdG9TdG9yZWRTY3JlZW4sXG4gIHdpbmRvd3NPZlBsYW4sXG4gIHR5cGUgUmVzb2x2ZWRUaWxpbmdQbGFuLFxuICB0eXBlIFN0b3JlZFRpbGluZ1BsYW4sXG59IGZyb20gXCIuL3RpbGluZy1wbGFuXCI7XG5cbi8vIFRoZSBzY3JlZW4gY29ubmVjdGVkIG5vdyB0aGF0IG1vc3Qgb2YgdGhlIHdpbmRvdydzIHNhdmVkIHBsYWNlIGlzIG9uLCBieSBpdHMgbWlkZGxlLlxuY29uc3Qgc2NyZWVuT2YgPSAoc2F2ZWQ6IFNhdmVkV2luZG93LCBkaXNwbGF5czogcmVhZG9ubHkgRGlzcGxheVJlY29yZFtdKSA9PiB7XG4gIGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9ID0gc2F2ZWQubm9ybWFsQm91bmRzO1xuICBjb25zdCBtaWRkbGUgPSB7IHg6IHggKyB3aWR0aCAvIDIsIHk6IHkgKyBoZWlnaHQgLyAyIH07XG5cbiAgcmV0dXJuIChcbiAgICBkaXNwbGF5cy5maW5kKChkaXNwbGF5KSA9PiB7XG4gICAgICBjb25zdCBib3VuZHMgPSBkaXNwbGF5LmJvdW5kcy5nZXQoKTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgbWlkZGxlLnggPj0gYm91bmRzLnggJiZcbiAgICAgICAgbWlkZGxlLnggPCBib3VuZHMueCArIGJvdW5kcy53aWR0aCAmJlxuICAgICAgICBtaWRkbGUueSA+PSBib3VuZHMueSAmJlxuICAgICAgICBtaWRkbGUueSA8IGJvdW5kcy55ICsgYm91bmRzLmhlaWdodFxuICAgICAgKTtcbiAgICB9KT8uaWQgPz8gbnVsbFxuICApO1xufTtcblxuLy8gVGhlIGxheW91dCdzIHRpbGluZyBzZXR1cCBmb3IgdGhlIHdpbmRvd3MgdGhhdCBzdGFuZCBmb3IgaXRzIHdpbmRvd3Mgbm93LCBlYWNoIG5hbWVkIGJ5IHRoZVxuLy8gd2luZG93IGl0IHdlbnQgdG8uIEEgd2luZG93IG5vIG9wZW4gd2luZG93IHN0YW5kcyBmb3IgaXMga2VwdCBieSB0aGUgaWQgaXQgaGFkLCBhcyBtaXNzaW5nLiBPbmVcbi8vIHRoZSBzZXR1cCBkb2VzIG5vdCBoYXZlLCBhcyBpbiBhIGxheW91dCBzYXZlZCBiZWZvcmUgc2V0dXBzIGhhZCBldmVyeSB3aW5kb3csIG9yIGJlZm9yZSB0aGVyZVxuLy8gd2VyZSBzZXR1cHMsIGdvZXMgb24gdGhlIHNjcmVlbiBpdCB3YXMgc2F2ZWQgb24sIGluIHRoZSBmaXJzdCBmcmVlIGNlbGw7IG9uZSBvZiB0aG9zZSBub3Qgb3BlblxuLy8gZ29lcyB0aGVyZSBhcyBtaXNzaW5nLCBvciBpcyBsZWZ0IGFzIGl0IGlzIHdoZW4gdGhhdCBzY3JlZW4gaXMgbm90IGNvbm5lY3RlZC5cbmV4cG9ydCBjb25zdCB0b1RpbGluZ1BsYW4gPSAoXG4gIHRpbGluZzogU2F2ZWRUaWxpbmcgfCB1bmRlZmluZWQsXG4gIHNhdmVkOiByZWFkb25seSBTYXZlZFdpbmRvd1tdLFxuICB3aW5kb3dPZjogTWFwPFNhdmVkV2luZG93LCBXaW5kb3dJZD4sXG4gIGRpc3BsYXlzOiByZWFkb25seSBEaXNwbGF5UmVjb3JkW10sXG4pOiBTdG9yZWRUaWxpbmdQbGFuID0+IHtcbiAgY29uc3Qga2V5T2YgPSAoaW5kZXg6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IHdpbmRvdyA9IHdpbmRvd09mLmdldChzYXZlZFtpbmRleF0pO1xuXG4gICAgLy8gV2l0aCB0aGUgd2luZG93J3MgaWQsIHRvIGFzayBMZW5zIGhvdyB0byBvcGVuIGl0IGFnYWluIG9uY2UgY2xvc2VkLlxuICAgIGNvbnN0IGlkID0gd2luZG93ID8/IHNhdmVkW2luZGV4XS53aW5kb3c7XG4gICAgY29uc3Qgd2l0aElkID0gaXNBcHBsaWNhdGlvbldpbmRvdyhpZCkgPyB7fSA6IHsgd2luZG93OiBpZCB9O1xuXG4gICAgcmV0dXJuIHdpbmRvd1xuICAgICAgPyB7IGtleToga2V5T2ZXaW5kb3cod2luZG93KSwgdGl0bGU6IHNhdmVkW2luZGV4XS50aXRsZSwgLi4ud2l0aElkIH1cbiAgICAgIDoge1xuICAgICAgICAgIGtleTogYG1pc3Npbmc6JHtpbmRleH06JHtrZXlPZldpbmRvdyhzYXZlZFtpbmRleF0ud2luZG93KX1gLFxuICAgICAgICAgIHRpdGxlOiBzYXZlZFtpbmRleF0udGl0bGUsXG4gICAgICAgICAgLi4ud2l0aElkLFxuICAgICAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGluU2V0dXAgPSBuZXcgU2V0KHRpbGluZz8ud2luZG93cy5tYXAoKGl0KSA9PiBpdC5pbmRleCkpO1xuXG4gIC8vIEEgd2luZG93IHNhdmVkIHR3aWNlLCBhcyBhIGxheW91dCBzYXZlZCBiZWZvcmUgdGhhdCB3YXMga2VwdCBmcm9tLCBpcyB0aGUgb25lIHdpbmRvdzogaXRzIGZpcnN0LlxuICBjb25zdCBmaXJzdE9mID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICBzYXZlZC5mb3JFYWNoKCh3aW5kb3csIGluZGV4KSA9PiB7XG4gICAgaWYgKCFmaXJzdE9mLmhhcyhrZXlPZldpbmRvdyh3aW5kb3cud2luZG93KSkpIHtcbiAgICAgIGZpcnN0T2Yuc2V0KGtleU9mV2luZG93KHdpbmRvdy53aW5kb3cpLCBpbmRleCk7XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBpc0ZpcnN0ID0gKGluZGV4OiBudW1iZXIpID0+XG4gICAgZmlyc3RPZi5nZXQoa2V5T2ZXaW5kb3coc2F2ZWRbaW5kZXhdLndpbmRvdykpID09PSBpbmRleDtcblxuICByZXR1cm4ge1xuICAgIHdpbmRvd3M6IFtcbiAgICAgIC4uLih0aWxpbmc/LndpbmRvd3MgPz8gW10pLmZsYXRNYXAoKHsgaW5kZXgsIC4uLnBsYWNlbWVudCB9KSA9PlxuICAgICAgICBzYXZlZFtpbmRleF0gJiYgaXNGaXJzdChpbmRleClcbiAgICAgICAgICA/IFt7IC4uLmtleU9mKGluZGV4KSwgLi4ucGxhY2VtZW50IH1dXG4gICAgICAgICAgOiBbXSxcbiAgICAgICksXG4gICAgICAuLi5zYXZlZC5mbGF0TWFwKCh3aW5kb3csIGluZGV4KSA9PlxuICAgICAgICBpblNldHVwLmhhcyhpbmRleCkgfHwgd2luZG93T2YuaGFzKHdpbmRvdykgfHwgIWlzRmlyc3QoaW5kZXgpXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4ua2V5T2YoaW5kZXgpLFxuICAgICAgICAgICAgICAgIGRpc3BsYXlJZDogc2NyZWVuT2Yod2luZG93LCBkaXNwbGF5cyksXG4gICAgICAgICAgICAgICAgY29sdW1uczogMSxcbiAgICAgICAgICAgICAgICByb3dzOiAxLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICksXG4gICAgXSxcbiAgICBjb2x1bW5zOiB0aWxpbmc/LmNvbHVtbnMgPz8ge30sXG4gICAgcm93czogdGlsaW5nPy5yb3dzID8/IHt9LFxuICAgIHNjcmVlbnM6IHRpbGluZz8uc2NyZWVucyxcbiAgfTtcbn07XG5cbi8vIFRoZSBsYXlvdXQncyB3aW5kb3cgYSB0aWxlJ3Mga2V5IG5hbWVzLCBieSB0aGUgd2luZG93J3Mgb3duIGtleTogYSB3aW5kb3cgbWlzc2luZyBmcm9tIHRoZSBzdGFydFxuLy8gZ29lcyBieSBpdHMgcGxhY2UgaW4gdGhlIGxheW91dCB0b28sIGJ1dCB0aGF0IHBsYWNlIGlzIHRoZSBvbmUgaXQgaGFkIHdoZW4gdGhlIGxheW91dCB3YXMgc2hvd24sXG4vLyBhbmQgc2F2aW5nIHB1dHMgdGhlIHdpbmRvd3MgaW4gYW5vdGhlciBvcmRlci5cbmV4cG9ydCBjb25zdCBzYXZlZFdpbmRvd09mS2V5ID0gKFxuICB3aW5kb3dzOiByZWFkb25seSBTYXZlZFdpbmRvd1tdLFxuICBrZXk6IHN0cmluZyxcbikgPT4ge1xuICBjb25zdCBvd24gPSAvXm1pc3Npbmc6XFxkKzooLiopJC9zLmV4ZWMoa2V5KT8uWzFdID8/IGtleTtcblxuICByZXR1cm4gd2luZG93cy5maW5kKCh3aW5kb3cpID0+IGtleU9mV2luZG93KHdpbmRvdy53aW5kb3cpID09PSBvd24pO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBPcGVuV2luZG93IHtcbiAgcmVhZG9ubHkgcmVjb3JkOiBXaW5kb3dSZWNvcmQ7XG4gIHJlYWRvbmx5IHJlb3BlbmluZzogV2luZG93UmVvcGVuaW5nIHwgdW5kZWZpbmVkO1xuICAvLyBUaGUga2V5IG9mIHRoZSB3aW5kb3cgb2YgYSBsYXlvdXQgaXQgd2FzIG9wZW5lZCBhZ2FpbiBhcywgd2hlbiBpdCB3YXMuXG4gIHJlYWRvbmx5IHN0YW5kc0Zvcj86IHN0cmluZztcbiAgLy8gVGhlIHdpbmRvd3MgaXQgY29udGludWVzLCBvcGVuZWQgYWdhaW4gZnJvbSwgbmVhcmVzdCBmaXJzdC5cbiAgcmVhZG9ubHkgY29udGludWVzPzogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbnR5cGUgSXNNYXRjaCA9IChvcGVuOiBPcGVuV2luZG93LCBzYXZlZDogU2F2ZWRXaW5kb3cpID0+IGJvb2xlYW47XG5cbmV4cG9ydCBjb25zdCBpc1NhbWVXaW5kb3c6IElzTWF0Y2ggPSAoXG4gIHsgcmVjb3JkOiB7IHdpbmRvdzogYSB9IH0sXG4gIHsgd2luZG93OiBiIH0sXG4pID0+XG4gIGlzQXBwbGljYXRpb25XaW5kb3coYSkgfHwgaXNBcHBsaWNhdGlvbldpbmRvdyhiKVxuICAgID8gYSA9PT0gYlxuICAgIDogYS5raW5kID09PSBiLmtpbmQgJiYgYS5pZCA9PT0gYi5pZDtcblxuLy8gVGhlIHdpbmRvdyB3YXMgb3BlbmVkIGFnYWluIGFzIHRoZSBzYXZlZCBvbmUsIGhvd2V2ZXIgbWFueSB0aW1lcyBzaW5jZS5cbmV4cG9ydCBjb25zdCBpc1NhbWVMaW5lYWdlOiBJc01hdGNoID0gKG9wZW4sIHNhdmVkKSA9PlxuICAob3Blbi5zdGFuZHNGb3IgIT09IHVuZGVmaW5lZCAmJlxuICAgIG9wZW4uc3RhbmRzRm9yID09PSBrZXlPZldpbmRvdyhzYXZlZC53aW5kb3cpKSB8fFxuICAhIW9wZW4uY29udGludWVzPy5pbmNsdWRlcyhrZXlPZldpbmRvdyhzYXZlZC53aW5kb3cpKTtcblxuLy8gTGVucyBkZXNjcmliZXMgYSB3aW5kb3cgZG9pbmcgdGhlIHNhbWUgdGhpbmcgdGhlIHNhbWUgd2F5LCBhcyBhIGNsb3NlZCB3aW5kb3cgb3BlbmVkIGFnYWluIGJ5IGhhbmQuXG5leHBvcnQgY29uc3QgaXNTYW1lUmVvcGVuaW5nOiBJc01hdGNoID0gKG9wZW4sIHNhdmVkKSA9PlxuICAhIW9wZW4ucmVvcGVuaW5nICYmXG4gICEhc2F2ZWQucmVvcGVuaW5nICYmXG4gIEpTT04uc3RyaW5naWZ5KG9wZW4ucmVvcGVuaW5nKSA9PT0gSlNPTi5zdHJpbmdpZnkoc2F2ZWQucmVvcGVuaW5nKTtcblxuLy8gUGFpcnMgZWFjaCBzYXZlZCB3aW5kb3cgbm90IHBhaXJlZCB5ZXQgd2l0aCBhbiBvcGVuIHdpbmRvdyBub3QgdGFrZW4geWV0LCBieSB0aGUgZmlyc3QgbWF0Y2hcbi8vIHRoYXQgZmluZHMgb25lLlxuZXhwb3J0IGNvbnN0IG1hdGNoV2luZG93cyA9IChcbiAgc2F2ZWQ6IHJlYWRvbmx5IFNhdmVkV2luZG93W10sXG4gIG9wZW46IHJlYWRvbmx5IE9wZW5XaW5kb3dbXSxcbiAgbWF0Y2hlczogTWFwPFNhdmVkV2luZG93LCBXaW5kb3dSZWNvcmQ+LFxuICBpc01hdGNoZXM6IHJlYWRvbmx5IElzTWF0Y2hbXSxcbikgPT4ge1xuICBmb3IgKGNvbnN0IGlzTWF0Y2ggb2YgaXNNYXRjaGVzKSB7XG4gICAgZm9yIChjb25zdCBzYXZlZFdpbmRvdyBvZiBzYXZlZCkge1xuICAgICAgaWYgKG1hdGNoZXMuaGFzKHNhdmVkV2luZG93KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFrZW4gPSBuZXcgU2V0KG1hdGNoZXMudmFsdWVzKCkpO1xuICAgICAgY29uc3QgZm91bmQgPSBvcGVuLmZpbmQoXG4gICAgICAgIChpdCkgPT4gIXRha2VuLmhhcyhpdC5yZWNvcmQpICYmIGlzTWF0Y2goaXQsIHNhdmVkV2luZG93KSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICBtYXRjaGVzLnNldChzYXZlZFdpbmRvdywgZm91bmQucmVjb3JkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbi8vIFRoZSB0aWxpbmcgc2V0dXAgb2YgdGhlIHBsYW4gdG8gc2F2ZSB3aXRoIGEgbGF5b3V0LCBlYWNoIHdpbmRvdyBuYW1lZCBieSBpdHMgcGxhY2UgaW4gdGhlXG4vLyBsYXlvdXQncyB3aW5kb3dzOyBhIHdpbmRvdyBvZiB0aGUgcGxhbiB0aGUgbGF5b3V0IGRvZXMgbm90IGhhdmUgaXMgbGVmdCBvdXQuXG5leHBvcnQgY29uc3QgdG9TYXZlZFRpbGluZyA9IChcbiAgcGxhbjogUmVzb2x2ZWRUaWxpbmdQbGFuLFxuICBpbmRleEJ5S2V5OiBSZWFkb25seU1hcDxzdHJpbmcsIG51bWJlcj4sXG4pOiBTYXZlZFRpbGluZyA9PiAoe1xuICB3aW5kb3dzOiB3aW5kb3dzT2ZQbGFuKHBsYW4pLmZsYXRNYXAoXG4gICAgKHsga2V5LCB0aXRsZTogX3RpdGxlLCAuLi5wbGFjZW1lbnQgfSkgPT4ge1xuICAgICAgY29uc3QgaW5kZXggPSBpbmRleEJ5S2V5LmdldChrZXkpO1xuXG4gICAgICByZXR1cm4gaW5kZXggPT09IHVuZGVmaW5lZCA/IFtdIDogW3sgaW5kZXgsIC4uLnBsYWNlbWVudCB9XTtcbiAgICB9LFxuICApLFxuICBjb2x1bW5zOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgcGxhbi5zY3JlZW5zLm1hcCgoc2NyZWVuKSA9PiBbU3RyaW5nKHNjcmVlbi5kaXNwbGF5LmlkKSwgc2NyZWVuLmNvbHVtbnNdKSxcbiAgKSxcbiAgcm93czogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIHBsYW4uc2NyZWVucy5tYXAoKHNjcmVlbikgPT4gW1N0cmluZyhzY3JlZW4uZGlzcGxheS5pZCksIHNjcmVlbi5yb3dzXSksXG4gICksXG4gIHNjcmVlbnM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBwbGFuLnNjcmVlbnMubWFwKChzY3JlZW4pID0+IFtcbiAgICAgIFN0cmluZyhzY3JlZW4uZGlzcGxheS5pZCksXG4gICAgICB0b1N0b3JlZFNjcmVlbihzY3JlZW4uZGlzcGxheSksXG4gICAgXSksXG4gICksXG59KTtcblxuLy8gVGhlIG9wZW4gd2luZG93cyBzdGFuZGluZyBmb3IgdGhlIGxheW91dCdzIHdpbmRvd3M6IHRoZSBzYW1lIHdpbmRvdywgb3Igb25lIGRvaW5nIHRoZSBzYW1lLiBOb3Rcbi8vIG9uZSBtZXJlbHkgb2YgdGhlIHNhbWUga2luZDogbW9zdCB3aW5kb3dzIGFyZSB0YWJzIGluIHdpbmRvd3Mgb2YgdGhlaXIgb3duLCB3aGF0ZXZlciB0aGV5IHNob3cuXG5leHBvcnQgY29uc3QgbWF0Y2hPcGVuV2luZG93cyA9IChcbiAgc2F2ZWQ6IHJlYWRvbmx5IFNhdmVkV2luZG93W10sXG4gIG9wZW46IHJlYWRvbmx5IE9wZW5XaW5kb3dbXSxcbikgPT4ge1xuICBjb25zdCBtYXRjaGVzID0gbmV3IE1hcDxTYXZlZFdpbmRvdywgV2luZG93UmVjb3JkPigpO1xuXG4gIG1hdGNoV2luZG93cyhzYXZlZCwgb3BlbiwgbWF0Y2hlcywgW1xuICAgIGlzU2FtZVdpbmRvdyxcbiAgICBpc1NhbWVMaW5lYWdlLFxuICAgIGlzU2FtZVJlb3BlbmluZyxcbiAgXSk7XG5cbiAgcmV0dXJuIG1hdGNoZXM7XG59O1xuIiwgImltcG9ydCB7XG4gIGFwcGxpY2F0aW9uV2luZG93SWQsXG4gIGlzQXBwbGljYXRpb25XaW5kb3csXG4gIHR5cGUgV2luZG93SWQsXG59IGZyb20gXCJAazhzbGVucy9tZXNzYWdpbmctY29udHJhY3RzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIERpc3BsYXlSZWNvcmQsXG4gIFdpbmRvd0JvdW5kcyxcbiAgV2luZG93UmVjb3JkLFxufSBmcm9tIFwiQGs4c2xlbnMvd2luZG93LWxheW91dC1jb250cmFjdHNcIjtcbmltcG9ydCB7IGNvbHVtbnNGb3IgfSBmcm9tIFwiLi9ncmlkXCI7XG5cbi8vIEhvdyBhIHdpbmRvdyBpcyB0aWxlZCwgYXMgdGhlIHVzZXIgYXJyYW5nZWQgaXQ6IG9uIHdoaWNoIHNjcmVlbiwgb3Igb24gbm9uZSB0byBsZWF2ZSBpdCBhcyBpdCBpcyxcbi8vIGZyb20gd2hpY2ggY2VsbCBvZiB0aGUgc2NyZWVuJ3MgZ3JpZCwgYW5kIGhvdyBtYW55IGNlbGxzIGl0IHNwYW5zLlxuZXhwb3J0IGludGVyZmFjZSBTdG9yZWRQbGFuV2luZG93IHtcbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRpc3BsYXlJZDogbnVtYmVyIHwgbnVsbDtcbiAgLy8gVGhlIHRpdGxlIG9mIHRoZSB3aW5kb3csIHRvIHNob3cgaXQgYXMgbWlzc2luZyBvbmNlIGl0IGlzIG5vdCBvcGVuOyBtaXNzaW5nIGZyb20gcGxhbnMga2VwdFxuICAvLyBiZWZvcmUgd2luZG93cyB3ZXJlIGtlcHQgd2l0aCB0aGVpciB0aXRsZXMuXG4gIHJlYWRvbmx5IHRpdGxlPzogc3RyaW5nO1xuICAvLyBUaGUgd2luZG93J3MgaWQgd2hpbGUgaXQgd2FzIG9wZW4sIHRvIGFzayBMZW5zIGhvdyB0byBvcGVuIGl0IGFnYWluIG9uY2UgY2xvc2VkOyBtaXNzaW5nIGZyb21cbiAgLy8gcGxhbnMga2VwdCBiZWZvcmUsIGFuZCBmb3IgYSB3aW5kb3cgYmVpbmcgb3BlbmVkIGluIGEgY2VsbCwgd2hpY2ggaGFzIG5vbmUgeWV0LlxuICByZWFkb25seSB3aW5kb3c/OiBXaW5kb3dJZDtcbiAgLy8gTWlzc2luZyBmcm9tIHBsYW5zIGtlcHQgYmVmb3JlIHdpbmRvd3MgaGFkIGNlbGxzIG9mIHRoZWlyIG93bi5cbiAgcmVhZG9ubHkgY29sdW1uPzogbnVtYmVyO1xuICByZWFkb25seSByb3c/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGNvbHVtbnM6IG51bWJlcjtcbiAgcmVhZG9ubHkgcm93czogbnVtYmVyO1xufVxuXG4vLyBXaGF0IGEgcGxhbiBrZWVwcyBvZiBhIHNjcmVlbiwgdG8gc2hvdyBpdCB3aGVuIGl0IGlzIG5vdCBjb25uZWN0ZWQuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JlZFBsYW5TY3JlZW4ge1xuICByZWFkb25seSBsYWJlbDogc3RyaW5nO1xuICByZWFkb25seSBpc1ByaW1hcnk6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGJvdW5kczogV2luZG93Qm91bmRzO1xuICByZWFkb25seSB3b3JrQXJlYTogV2luZG93Qm91bmRzO1xufVxuXG4vLyBUaGUgdGlsaW5nIHRoZSB1c2VyIGFycmFuZ2VkOiB0aGUgd2luZG93cywgdGhlIGVhcmxpZXIgb25lcyBnZXR0aW5nIHRoZWlyIGNlbGxzIGZpcnN0IHdoZXJlIHR3b1xuLy8gd2FudCB0aGUgc2FtZSwgYW5kIHRoZSBjb2x1bW5zIGFuZCByb3dzIG9mIHRoZSBzY3JlZW5zJyBncmlkcy4gS2VwdCBieSB3aW5kb3cgYW5kIHNjcmVlbiwgc28gd2hhdCBpcyBub3Qgb3BlbiBvciBub3QgY29ubmVjdGVkIG5vdyB3YWl0c1xuLy8gZm9yIHdoZW4gaXQgaXMuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JlZFRpbGluZ1BsYW4ge1xuICByZWFkb25seSB3aW5kb3dzOiByZWFkb25seSBTdG9yZWRQbGFuV2luZG93W107XG4gIHJlYWRvbmx5IGNvbHVtbnM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIG51bWJlcj4+O1xuICAvLyBNaXNzaW5nIGZyb20gcGxhbnMga2VwdCBiZWZvcmUgcm93cyBjb3VsZCBiZSBjaG9zZW4uXG4gIHJlYWRvbmx5IHJvd3M/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PjtcbiAgLy8gVGhlIHNjcmVlbnMgdGhlIHBsYW4gd2FzIG1hZGUgd2l0aCwgYnkgaWQ7IG1pc3NpbmcgZnJvbSBwbGFucyBrZXB0IGJlZm9yZSBzY3JlZW5zIHdlcmUuXG4gIHJlYWRvbmx5IHNjcmVlbnM/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBTdG9yZWRQbGFuU2NyZWVuPj47XG59XG5cbi8vIFRoZSBtb3N0IGNvbHVtbnMgYSBzY3JlZW4gaXMgZ2l2ZW4gYnkgaXRzZWxmLCBiZWZvcmUgb25lIGlzIGNob3NlbiBmb3IgaXQ7IG1vcmUgY2FuIGJlIGFkZGVkLlxuZXhwb3J0IGNvbnN0IG1heENvbHVtbnMgPSA4O1xuLy8gVGhlIG1vc3Qgcm93cyBhIHdpbmRvdyBpcyBtYWRlIHRhbGwgYnkgZHJhZ2dpbmcgaXRzIGNvcm5lciwgYmV5b25kIHRob3NlIG9mIGl0cyBzY3JlZW4uXG5leHBvcnQgY29uc3QgbWF4Um93cyA9IDg7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxhbm5lZFdpbmRvdyB7XG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICByZWFkb25seSByZWNvcmQ6IFdpbmRvd1JlY29yZDtcbiAgLy8gV2hldGhlciB0aGUgd2luZG93IGlzIG5vdCBvcGVuIG5vdzogaXQgaXMgc2hvd24gd2hlcmUgdGhlIHBsYW4gaGFzIGl0LCBhbmQgbm90IHRpbGVkLlxuICByZWFkb25seSBtaXNzaW5nPzogYm9vbGVhbjtcbiAgLy8gVGhlIGlkIGEgd2luZG93IG5vdCBvcGVuIGhhZCB3aGlsZSBpdCB3YXMgb3Blbiwgd2hlbiBrbm93bjogTGVucyBkZXNjcmliZXMgaXQgYnkgdGhhdCBvbmNlXG4gIC8vIGNsb3NlZCwgdG8gb3BlbiBpdCBhZ2Fpbi5cbiAgcmVhZG9ubHkgY2xvc2VkPzogV2luZG93SWQ7XG4gIC8vIFRoZSBjZWxsIHRoZSB3aW5kb3cgaXMgcHV0IGluLCB3aGVuIGl0IGlzIHB1dCBpbiBvbmU7IG90aGVyd2lzZSBpdCB0YWtlcyB0aGUgZmlyc3QgdGhhdCBpcyBmcmVlLlxuICByZWFkb25seSBjb2x1bW4/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHJvdz86IG51bWJlcjtcbiAgcmVhZG9ubHkgY29sdW1uczogbnVtYmVyO1xuICByZWFkb25seSByb3dzOiBudW1iZXI7XG59XG5cbi8vIEEgd2luZG93IHBsYWNlZCBpbiBpdHMgc2NyZWVuJ3MgZ3JpZDogZnJvbSB3aGljaCBjZWxsLCBhbmQgb3ZlciBob3cgbWFueS5cbmV4cG9ydCBpbnRlcmZhY2UgUGxhY2VkV2luZG93IGV4dGVuZHMgUGxhbm5lZFdpbmRvdyB7XG4gIHJlYWRvbmx5IGNvbHVtbjogbnVtYmVyO1xuICByZWFkb25seSByb3c6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGFubmVkU2NyZWVuIHtcbiAgcmVhZG9ubHkgZGlzcGxheTogRGlzcGxheVJlY29yZDtcbiAgLy8gV2hldGhlciB0aGUgc2NyZWVuIGlzIG5vdCBjb25uZWN0ZWQgbm93OiBpdCBpcyBzaG93biBhcyB0aGUgcGxhbiBoYXMgaXQsIGFuZCBub3QgdGlsZWQuXG4gIHJlYWRvbmx5IG1pc3Npbmc6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGNvbHVtbnM6IG51bWJlcjtcbiAgLy8gVGhlIHJvd3Mgb2YgdGhlIGdyaWQ6IGFzIG1hbnkgYXMgY2hvc2VuLCBidXQgbmV2ZXIgZmV3ZXIgdGhhbiB0aGUgd2luZG93cyBuZWVkLlxuICByZWFkb25seSByb3dzOiBudW1iZXI7XG4gIHJlYWRvbmx5IG5lZWRlZFJvd3M6IG51bWJlcjtcbiAgcmVhZG9ubHkgd2luZG93czogcmVhZG9ubHkgUGxhY2VkV2luZG93W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRUaWxpbmdQbGFuIHtcbiAgcmVhZG9ubHkgc2NyZWVuczogcmVhZG9ubHkgUGxhbm5lZFNjcmVlbltdO1xuICByZWFkb25seSB1bnRpbGVkOiByZWFkb25seSBQbGFubmVkV2luZG93W107XG59XG5cbi8vIFdoYXQgbmFtZXMgYSB3aW5kb3cgYWNyb3NzIHJlYWRzIG9mIHRoZSB3aW5kb3dzLCBhcyBpdHMgV2luZG93SWQgZG9lcy5cbi8vIFRoZSBhbGlhcyBvZiBhIHdpbmRvdyB0aGF0IGhhcyBubyBwbGFjZSBpbiB0aGUgcGxhbiBmb3Igbm93LCBhcyBvbmUgc2hvd2luZyB3aGlsZSB3aW5kb3dzIGFyZVxuLy8gb3BlbmVkIGFnYWluIHRoYXQgaXMgbm9uZSBvZiB0aGVtLlxuZXhwb3J0IGNvbnN0IGxlZnRPdXRPZlBsYW4gPSBcIlwiO1xuXG4vLyBXaGF0IHRoZSBrZXkgb2YgYSB3aW5kb3cgYmVpbmcgb3BlbmVkIGluIGEgY2VsbCBzdGFydHMgd2l0aCwgdGhlIGlkIGl0IGlzIG9wZW5lZCB1bmRlciBhZnRlciBpdC5cbmV4cG9ydCBjb25zdCBvcGVuaW5nUHJlZml4ID0gXCJvcGVuaW5nOlwiO1xuXG5leHBvcnQgY29uc3Qga2V5T2ZXaW5kb3cgPSAod2luZG93OiBXaW5kb3dJZCkgPT5cbiAgaXNBcHBsaWNhdGlvbldpbmRvdyh3aW5kb3cpXG4gICAgPyBcImFwcGxpY2F0aW9uXCJcbiAgICA6IEpTT04uc3RyaW5naWZ5KFt3aW5kb3cua2luZCwgd2luZG93LmlkXSk7XG5cbi8vIFRoZSBpZCBhIHdpbmRvdyBub3Qgb3BlbiBoYWQgd2hpbGUgb3BlbiwgYnkgaXRzIHBsYW4gZW50cnk6IGFzIGtlcHQgd2l0aCBpdCwgb3IgZm9yIGEgcGxhbiBrZXB0XG4vLyBiZWZvcmUgaWRzIHdlcmUsIGFzIGl0cyBrZXkgdGVsbHMsIGl0cyBvd24gb3IsIG1pc3Npbmcgc2luY2UgYSBsYXlvdXQgd2FzIHNob3duLCB0aGUgbGF5b3V0J3MuXG5leHBvcnQgY29uc3QgY2xvc2VkV2luZG93T2YgPSAoZW50cnk6IHtcbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHdpbmRvdz86IFdpbmRvd0lkO1xufSkgPT4ge1xuICBpZiAoZW50cnkud2luZG93KSB7XG4gICAgcmV0dXJuIGVudHJ5LndpbmRvdztcbiAgfVxuXG4gIGNvbnN0IG93biA9IC9ebWlzc2luZzpcXGQrOiguKikkL3MuZXhlYyhlbnRyeS5rZXkpPy5bMV0gPz8gZW50cnkua2V5O1xuXG4gIHJldHVybiBvd24uc3RhcnRzV2l0aChcIltcIikgPyB3aW5kb3dPZktleShvd24pIDogdW5kZWZpbmVkO1xufTtcblxuLy8gVGhlIHdpbmRvdyBhIGtleSBvZiBga2V5T2ZXaW5kb3dgIG5hbWVzLCBhcyBhIHdpbmRvdyBub3Qgb3BlbiBpcyBrbm93biBieSBpdHMga2V5IGFsb25lLlxuZXhwb3J0IGNvbnN0IHdpbmRvd09mS2V5ID0gKGtleTogc3RyaW5nKTogV2luZG93SWQgPT4ge1xuICBpZiAoa2V5ID09PSBcImFwcGxpY2F0aW9uXCIpIHtcbiAgICByZXR1cm4gYXBwbGljYXRpb25XaW5kb3dJZDtcbiAgfVxuXG4gIGNvbnN0IFtraW5kLCBpZF0gPSBKU09OLnBhcnNlKGtleSkgYXMgW3N0cmluZywgc3RyaW5nXTtcblxuICByZXR1cm4geyBraW5kLCBpZCB9IGFzIFdpbmRvd0lkO1xufTtcblxuY29uc3QgY2xhbXAgPSAodmFsdWU6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKSA9PlxuICBNYXRoLm1heChtaW4sIE1hdGgubWluKG1heCwgTWF0aC5yb3VuZCh2YWx1ZSkpKTtcblxuLy8gUGxhY2VzIHRoZSB3aW5kb3dzIGluIGEgZ3JpZCBvZiB0aGUgY29sdW1uczogZmlyc3QgZWFjaCB3aW5kb3cgcHV0IGluIGEgY2VsbCwgaW4gdGhlaXIgb3JkZXIsXG4vLyB3aGVyZSBpdCBmaXRzIGFuZCBub3RoaW5nIGlzIHlldDsgdGhlbiBldmVyeSBvdGhlciB3aW5kb3csIGFzIG9uZSB3aG9zZSBjZWxsIGFub3RoZXIgdG9vaywgaW4gdGhlXG4vLyBmaXJzdCBjZWxsIGZyb20gdGhlIHRvcCBsZWZ0IHdoZXJlIGl0IGZpdHMuIEEgd2luZG93IHdpZGVyIHRoYW4gdGhlIGdyaWQgaXMgbmFycm93ZWQgdG8gaXQsIGFuZFxuLy8gb25lIHB1dCB0b28gZmFyIHJpZ2h0IG1vdmVkIGxlZnQgdG8gZml0LlxuLy8gUGxhY2VkIGJ5IHRoZWlyIGNlbGxzIGFsb25lLCBzbyB0aGF0IHdpbmRvd3Mgb2YgYSBzYXZlZCBsYXlvdXQgYXJlIHBsYWNlZCBhcyBvcGVuIG9uZXMgYXJlLlxudHlwZSBJbkdyaWQgPSBQaWNrPFBsYW5uZWRXaW5kb3csIFwiY29sdW1uXCIgfCBcInJvd1wiIHwgXCJjb2x1bW5zXCIgfCBcInJvd3NcIj47XG5cbmV4cG9ydCBjb25zdCBwbGFjZUluR3JpZCA9IDxXIGV4dGVuZHMgSW5HcmlkPihcbiAgd2luZG93czogcmVhZG9ubHkgV1tdLFxuICBjb2x1bW5zOiBudW1iZXIsXG4pID0+IHtcbiAgY29uc3QgdGFrZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgcGxhY2VkID0gbmV3IE1hcDxXLCBXICYgeyBjb2x1bW46IG51bWJlcjsgcm93OiBudW1iZXIgfT4oKTtcbiAgbGV0IHJvd3MgPSAwO1xuXG4gIGNvbnN0IGlzRnJlZSA9IChcbiAgICByb3c6IG51bWJlcixcbiAgICBjb2x1bW46IG51bWJlcixcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICApID0+IHtcbiAgICBmb3IgKGxldCByID0gcm93OyByIDwgcm93ICsgaGVpZ2h0OyByKyspIHtcbiAgICAgIGZvciAobGV0IGMgPSBjb2x1bW47IGMgPCBjb2x1bW4gKyB3aWR0aDsgYysrKSB7XG4gICAgICAgIGlmICh0YWtlbi5oYXMoYCR7cn0sJHtjfWApKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgY29uc3QgcGxhY2UgPSAoXG4gICAgd2luZG93OiBXLFxuICAgIHJvdzogbnVtYmVyLFxuICAgIGNvbHVtbjogbnVtYmVyLFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICkgPT4ge1xuICAgIGZvciAobGV0IHIgPSByb3c7IHIgPCByb3cgKyB3aW5kb3cucm93czsgcisrKSB7XG4gICAgICBmb3IgKGxldCBjID0gY29sdW1uOyBjIDwgY29sdW1uICsgd2lkdGg7IGMrKykge1xuICAgICAgICB0YWtlbi5hZGQoYCR7cn0sJHtjfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJvd3MgPSBNYXRoLm1heChyb3dzLCByb3cgKyB3aW5kb3cucm93cyk7XG4gICAgcGxhY2VkLnNldCh3aW5kb3csIHsgLi4ud2luZG93LCBjb2x1bW5zOiB3aWR0aCwgY29sdW1uLCByb3cgfSk7XG4gIH07XG5cbiAgZm9yIChjb25zdCB3aW5kb3cgb2Ygd2luZG93cykge1xuICAgIGlmICh3aW5kb3cuY29sdW1uID09PSB1bmRlZmluZWQgfHwgd2luZG93LnJvdyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCB3aWR0aCA9IE1hdGgubWluKHdpbmRvdy5jb2x1bW5zLCBjb2x1bW5zKTtcbiAgICBjb25zdCBjb2x1bW4gPSBNYXRoLm1heCgwLCBNYXRoLm1pbih3aW5kb3cuY29sdW1uLCBjb2x1bW5zIC0gd2lkdGgpKTtcbiAgICBjb25zdCByb3cgPSBNYXRoLm1heCgwLCB3aW5kb3cucm93KTtcblxuICAgIGlmIChpc0ZyZWUocm93LCBjb2x1bW4sIHdpZHRoLCB3aW5kb3cucm93cykpIHtcbiAgICAgIHBsYWNlKHdpbmRvdywgcm93LCBjb2x1bW4sIHdpZHRoKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHdpbmRvdyBvZiB3aW5kb3dzKSB7XG4gICAgaWYgKHBsYWNlZC5oYXMod2luZG93KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgd2lkdGggPSBNYXRoLm1pbih3aW5kb3cuY29sdW1ucywgY29sdW1ucyk7XG4gICAgbGV0IGF0ID0gMDtcblxuICAgIHdoaWxlIChcbiAgICAgIChhdCAlIGNvbHVtbnMpICsgd2lkdGggPiBjb2x1bW5zIHx8XG4gICAgICAhaXNGcmVlKE1hdGguZmxvb3IoYXQgLyBjb2x1bW5zKSwgYXQgJSBjb2x1bW5zLCB3aWR0aCwgd2luZG93LnJvd3MpXG4gICAgKSB7XG4gICAgICBhdCsrO1xuICAgIH1cblxuICAgIHBsYWNlKHdpbmRvdywgTWF0aC5mbG9vcihhdCAvIGNvbHVtbnMpLCBhdCAlIGNvbHVtbnMsIHdpZHRoKTtcbiAgfVxuXG4gIHJldHVybiB7IHBsYWNlZDogd2luZG93cy5tYXAoKHdpbmRvdykgPT4gcGxhY2VkLmdldCh3aW5kb3cpISksIHJvd3MgfTtcbn07XG5cbi8vIFdoZXJlIGEgd2luZG93IHBsYWNlZCBpbiB0aGUgZ3JpZCBnb2VzIG92ZXIgdGhlIGFyZWEsIHRoZSBjZWxscyBzcGxpdCBldmVubHksIHRvIHRoZSBwaXhlbC5cbmV4cG9ydCBjb25zdCBib3VuZHNJbkdyaWQgPSAoXG4gIGFyZWE6IFdpbmRvd0JvdW5kcyxcbiAgY29sdW1uczogbnVtYmVyLFxuICByb3dzOiBudW1iZXIsXG4gIHdpbmRvdzogUGljazxQbGFjZWRXaW5kb3csIFwiY29sdW1uXCIgfCBcInJvd1wiIHwgXCJjb2x1bW5zXCIgfCBcInJvd3NcIj4sXG4pOiBXaW5kb3dCb3VuZHMgPT4ge1xuICBjb25zdCB4QXQgPSAoY29sdW1uOiBudW1iZXIpID0+XG4gICAgYXJlYS54ICsgTWF0aC5yb3VuZCgoY29sdW1uICogYXJlYS53aWR0aCkgLyBjb2x1bW5zKTtcbiAgY29uc3QgeUF0ID0gKHJvdzogbnVtYmVyKSA9PlxuICAgIGFyZWEueSArIE1hdGgucm91bmQoKHJvdyAqIGFyZWEuaGVpZ2h0KSAvIE1hdGgubWF4KHJvd3MsIDEpKTtcblxuICByZXR1cm4ge1xuICAgIHg6IHhBdCh3aW5kb3cuY29sdW1uKSxcbiAgICB5OiB5QXQod2luZG93LnJvdyksXG4gICAgd2lkdGg6IHhBdCh3aW5kb3cuY29sdW1uICsgd2luZG93LmNvbHVtbnMpIC0geEF0KHdpbmRvdy5jb2x1bW4pLFxuICAgIGhlaWdodDogeUF0KHdpbmRvdy5yb3cgKyB3aW5kb3cucm93cykgLSB5QXQod2luZG93LnJvdyksXG4gIH07XG59O1xuXG5jb25zdCBjZWxsc09mID0gKHdpbmRvdzogeyBjb2x1bW5zOiBudW1iZXI7IHJvd3M6IG51bWJlciB9KSA9PlxuICB3aW5kb3cuY29sdW1ucyAqIHdpbmRvdy5yb3dzO1xuXG4vLyBXaXRoIG5vdGhpbmcgYXJyYW5nZWQ6IGV2ZXJ5IHdpbmRvdyBub3QgbWluaW1pemVkIHNwcmVhZCBvdmVyIHRoZSBzY3JlZW5zIGFzIGV2ZW5seSBhcyB0aGUgY2VsbHNcbi8vIGdvLCB0aGUgbWFpbiB3aW5kb3cgZmlyc3QsIHR3byBjZWxscyB3aWRlLCBvbiB0aGUgcHJpbWFyeSBzY3JlZW47IG9uIGEgdGllIGFueSBvdGhlciB3aW5kb3cgc3RheXNcbi8vIG9uIHRoZSBzY3JlZW4gaXQgaXMgb24uIE1pbmltaXplZCB3aW5kb3dzIGFyZSBsZWZ0IGFzIHRoZXkgYXJlLlxuY29uc3Qgc3ByZWFkQnlEZWZhdWx0ID0gKFxuICB3aW5kb3dzOiByZWFkb25seSBXaW5kb3dSZWNvcmRbXSxcbiAgZGlzcGxheXM6IHJlYWRvbmx5IERpc3BsYXlSZWNvcmRbXSxcbiAgdGlsZU1pbmltaXplZDogYm9vbGVhbixcbikgPT4ge1xuICBjb25zdCBieVNjcmVlbiA9IG5ldyBNYXA8RGlzcGxheVJlY29yZCwgUGxhbm5lZFdpbmRvd1tdPihcbiAgICBkaXNwbGF5cy5tYXAoKGRpc3BsYXkpID0+IFtkaXNwbGF5LCBbXV0pLFxuICApO1xuICBjb25zdCBjZWxsc1Rha2VuID0gKGRpc3BsYXk6IERpc3BsYXlSZWNvcmQpID0+XG4gICAgYnlTY3JlZW4uZ2V0KGRpc3BsYXkpIS5yZWR1Y2UoKHN1bSwgaXQpID0+IHN1bSArIGNlbGxzT2YoaXQpLCAwKTtcbiAgY29uc3QgdW50aWxlZDogUGxhbm5lZFdpbmRvd1tdID0gW107XG4gIGNvbnN0IHRvVGlsZSA9IHdpbmRvd3MuZmlsdGVyKFxuICAgICh3aW5kb3cpID0+IHRpbGVNaW5pbWl6ZWQgfHwgd2luZG93LnN0YXRlLmdldCgpICE9PSBcIm1pbmltaXplZFwiLFxuICApO1xuICBjb25zdCBtYWluRmlyc3QgPSBbLi4udG9UaWxlXS5zb3J0KFxuICAgIChhLCBiKSA9PlxuICAgICAgTnVtYmVyKGlzQXBwbGljYXRpb25XaW5kb3coYi53aW5kb3cpKSAtXG4gICAgICBOdW1iZXIoaXNBcHBsaWNhdGlvbldpbmRvdyhhLndpbmRvdykpLFxuICApO1xuXG4gIGZvciAoY29uc3QgcmVjb3JkIG9mIG1haW5GaXJzdCkge1xuICAgIGNvbnN0IGlzTWFpbiA9IGlzQXBwbGljYXRpb25XaW5kb3cocmVjb3JkLndpbmRvdyk7XG4gICAgY29uc3QgZmV3ZXN0ID0gTWF0aC5taW4oLi4uZGlzcGxheXMubWFwKGNlbGxzVGFrZW4pKTtcbiAgICBjb25zdCBjYW5kaWRhdGVzID0gZGlzcGxheXMuZmlsdGVyKFxuICAgICAgKGRpc3BsYXkpID0+IGNlbGxzVGFrZW4oZGlzcGxheSkgPT09IGZld2VzdCxcbiAgICApO1xuXG4gICAgY29uc3QgZGlzcGxheSA9XG4gICAgICAoaXNNYWluID8gY2FuZGlkYXRlcy5maW5kKChpdCkgPT4gaXQuaXNQcmltYXJ5LmdldCgpKSA6IHVuZGVmaW5lZCkgPz9cbiAgICAgIGNhbmRpZGF0ZXMuZmluZCgoaXQpID0+IGl0LmlkID09PSByZWNvcmQuZGlzcGxheUlkLmdldCgpKSA/P1xuICAgICAgY2FuZGlkYXRlc1swXTtcblxuICAgIGJ5U2NyZWVuLmdldChkaXNwbGF5KSEucHVzaCh7XG4gICAgICBrZXk6IGtleU9mV2luZG93KHJlY29yZC53aW5kb3cpLFxuICAgICAgcmVjb3JkLFxuICAgICAgY29sdW1uczogaXNNYWluID8gMiA6IDEsXG4gICAgICByb3dzOiAxLFxuICAgIH0pO1xuICB9XG5cbiAgZm9yIChjb25zdCByZWNvcmQgb2Ygd2luZG93cykge1xuICAgIGlmICghdG9UaWxlLmluY2x1ZGVzKHJlY29yZCkpIHtcbiAgICAgIHVudGlsZWQucHVzaCh7XG4gICAgICAgIGtleToga2V5T2ZXaW5kb3cocmVjb3JkLndpbmRvdyksXG4gICAgICAgIHJlY29yZCxcbiAgICAgICAgY29sdW1uczogMSxcbiAgICAgICAgcm93czogMSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIEVhY2ggc2NyZWVuIGluIHRoZSBvcmRlciB0aGUgd2luZG93cyBvcGVuZWQsIHRoZSBtYWluIHdpbmRvdyBmaXJzdCwgYXMgaXQgd2FzIGFsd2F5cyB0aWxlZC5cbiAgZm9yIChjb25zdCBbZGlzcGxheSwgb25TY3JlZW5dIG9mIGJ5U2NyZWVuKSB7XG4gICAgYnlTY3JlZW4uc2V0KFxuICAgICAgZGlzcGxheSxcbiAgICAgIHRvVGlsZS5mbGF0TWFwKChyZWNvcmQpID0+IG9uU2NyZWVuLmZpbHRlcigoaXQpID0+IGl0LnJlY29yZCA9PT0gcmVjb3JkKSksXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB7IGJ5U2NyZWVuLCB1bnRpbGVkIH07XG59O1xuXG4vLyBUaGUgaWQgYSBzY3JlZW4gdGhlIHBsYW4gaGFzIHVuZGVyIGFuIGlkIG5vdCBjb25uZWN0ZWQgbm93IGlzIGNvbm5lY3RlZCB1bmRlcjogdGhlIHNjcmVlbiBvZiB0aGVcbi8vIHNhbWUgbmFtZSwgb2YgdGhlIHNhbWUgc2l6ZSB0b28gd2hlcmUgdHdvIHNoYXJlIHRoZSBuYW1lLCBhcyBtYWNPUyBnaXZlcyBhIHNjcmVlbiBhIG5ldyBpZCB3aGVuXG4vLyBpdCBpcyBjb25uZWN0ZWQgYWdhaW4uIE5vbmUgd2hlbiB0aGUgc2NyZWVuIGlzIGNvbm5lY3RlZCB1bmRlciBpdHMgaWQsIG9yIG5vdCBhdCBhbGwuXG5leHBvcnQgY29uc3QgcmVjb25uZWN0ZWRJZE9mID0gKFxuICBpZDogc3RyaW5nLFxuICBzY3JlZW46IFN0b3JlZFBsYW5TY3JlZW4sXG4gIGRpc3BsYXlzOiByZWFkb25seSBEaXNwbGF5UmVjb3JkW10sXG4pOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIXNjcmVlbi5sYWJlbCB8fCBkaXNwbGF5cy5zb21lKChkaXNwbGF5KSA9PiBTdHJpbmcoZGlzcGxheS5pZCkgPT09IGlkKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBuYW1lZCA9IGRpc3BsYXlzLmZpbHRlcihcbiAgICAoZGlzcGxheSkgPT4gZGlzcGxheS5sYWJlbC5nZXQoKSA9PT0gc2NyZWVuLmxhYmVsLFxuICApO1xuXG4gIGNvbnN0IHNhbWUgPVxuICAgIG5hbWVkLmxlbmd0aCA+IDFcbiAgICAgID8gbmFtZWQuZmlsdGVyKFxuICAgICAgICAgIChkaXNwbGF5KSA9PlxuICAgICAgICAgICAgZGlzcGxheS5ib3VuZHMuZ2V0KCkud2lkdGggPT09IHNjcmVlbi5ib3VuZHMud2lkdGggJiZcbiAgICAgICAgICAgIGRpc3BsYXkuYm91bmRzLmdldCgpLmhlaWdodCA9PT0gc2NyZWVuLmJvdW5kcy5oZWlnaHQsXG4gICAgICAgIClcbiAgICAgIDogbmFtZWQ7XG5cbiAgcmV0dXJuIHNhbWUubGVuZ3RoID09PSAxID8gc2FtZVswXS5pZCA6IHVuZGVmaW5lZDtcbn07XG5cbi8vIFRoZSBwbGFuIHdpdGggdGhlIHNjcmVlbnMgaXQgaGFzIHVuZGVyIGlkcyBjb25uZWN0ZWQgbm8gbW9yZSBtb3ZlZCB0byB0aGUgaWRzIHRoZXkgYXJlIGNvbm5lY3RlZFxuLy8gdW5kZXIgbm93LCB0aGVpciB3aW5kb3dzIHdpdGggdGhlbTsgdGhlaXIgZ3JpZHMgdG9vLCB1bmxlc3MgdGhlIHBsYW4gaGFzIHdpbmRvd3MgdW5kZXIgdGhlIG5ldyBpZC5cbmNvbnN0IHdpdGhTY3JlZW5zUmVjb25uZWN0ZWQgPSAoXG4gIHN0b3JlZDogU3RvcmVkVGlsaW5nUGxhbiB8IHVuZGVmaW5lZCxcbiAgZGlzcGxheXM6IHJlYWRvbmx5IERpc3BsYXlSZWNvcmRbXSxcbik6IFN0b3JlZFRpbGluZ1BsYW4gfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBtb3ZlZCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgZm9yIChjb25zdCBbaWQsIHNjcmVlbl0gb2YgT2JqZWN0LmVudHJpZXMoc3RvcmVkPy5zY3JlZW5zID8/IHt9KSkge1xuICAgIGNvbnN0IHRvID0gcmVjb25uZWN0ZWRJZE9mKGlkLCBzY3JlZW4sIGRpc3BsYXlzKTtcblxuICAgIGlmICh0byAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb3ZlZC5zZXQoaWQsIHRvKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXN0b3JlZCB8fCBtb3ZlZC5zaXplID09PSAwKSB7XG4gICAgcmV0dXJuIHN0b3JlZDtcbiAgfVxuXG4gIGNvbnN0IGhhc1dpbmRvd3MgPSBuZXcgU2V0KFxuICAgIHN0b3JlZC53aW5kb3dzLm1hcCgod2luZG93KSA9PiBTdHJpbmcod2luZG93LmRpc3BsYXlJZCkpLFxuICApO1xuXG4gIGNvbnN0IGdyaWRzTW92ZWQgPSAoZ3JpZHM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIG51bWJlcj4+KSA9PiB7XG4gICAgY29uc3Qga2VwdCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKGdyaWRzKS5maWx0ZXIoKFtpZF0pID0+ICFtb3ZlZC5oYXMoaWQpKSxcbiAgICApO1xuXG4gICAgZm9yIChjb25zdCBbaWQsIGNvdW50XSBvZiBPYmplY3QuZW50cmllcyhncmlkcykpIHtcbiAgICAgIGNvbnN0IHRvID0gbW92ZWQuZ2V0KGlkKTtcblxuICAgICAgaWYgKFxuICAgICAgICB0byAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIChrZXB0W3RvXSA9PT0gdW5kZWZpbmVkIHx8ICFoYXNXaW5kb3dzLmhhcyhTdHJpbmcodG8pKSlcbiAgICAgICkge1xuICAgICAgICBrZXB0W3RvXSA9IGNvdW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBrZXB0O1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RvcmVkLFxuICAgIHdpbmRvd3M6IHN0b3JlZC53aW5kb3dzLm1hcCgod2luZG93KSA9PiB7XG4gICAgICBjb25zdCB0byA9XG4gICAgICAgIHdpbmRvdy5kaXNwbGF5SWQgPT09IG51bGxcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogbW92ZWQuZ2V0KFN0cmluZyh3aW5kb3cuZGlzcGxheUlkKSk7XG5cbiAgICAgIHJldHVybiB0byA9PT0gdW5kZWZpbmVkID8gd2luZG93IDogeyAuLi53aW5kb3csIGRpc3BsYXlJZDogdG8gfTtcbiAgICB9KSxcbiAgICBjb2x1bW5zOiBncmlkc01vdmVkKHN0b3JlZC5jb2x1bW5zKSxcbiAgICByb3dzOiBzdG9yZWQucm93cyAmJiBncmlkc01vdmVkKHN0b3JlZC5yb3dzKSxcbiAgICBzY3JlZW5zOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhzdG9yZWQuc2NyZWVucyA/PyB7fSkuZmlsdGVyKChbaWRdKSA9PiAhbW92ZWQuaGFzKGlkKSksXG4gICAgKSxcbiAgfTtcbn07XG5cbi8vIFRoZSBwbGFuIHdpdGggYSB0aWxlIG9mIGEgbGF5b3V0J3Mgd2luZG93IG5vdCBvcGVuIHdoZW4gdGhlIGxheW91dCB3YXMgc2hvd24gZ29pbmcgYnkgdGhlIHdpbmRvdydzXG4vLyBvd24ga2V5IG9uY2UgdGhlIHdpbmRvdyBpcyBvcGVuIHVuZGVyIGl0IGFnYWluLCBhcyBMZW5zIG9wZW5zIHdpbmRvd3MgYWdhaW4gYWZ0ZXIgYSByZXN0YXJ0OiB0aGVcbi8vIHRpbGUgaXMgdGhhdCB3aW5kb3csIG5ldmVyIG9uZSBiZXNpZGUgYSB3aW5kb3cgc2hvd24gYXMgbmV3LlxuY29uc3Qgd2l0aFdpbmRvd3NPcGVuQWdhaW4gPSAoXG4gIHN0b3JlZDogU3RvcmVkVGlsaW5nUGxhbiB8IHVuZGVmaW5lZCxcbiAgd2luZG93czogcmVhZG9ubHkgV2luZG93UmVjb3JkW10sXG4gIGtleU9mOiAocmVjb3JkOiBXaW5kb3dSZWNvcmQpID0+IHN0cmluZyxcbik6IFN0b3JlZFRpbGluZ1BsYW4gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIXN0b3JlZCkge1xuICAgIHJldHVybiBzdG9yZWQ7XG4gIH1cblxuICBjb25zdCBvcGVuID0gbmV3IFNldCh3aW5kb3dzLm1hcChrZXlPZikpO1xuICBjb25zdCBuYW1lZCA9IG5ldyBTZXQoc3RvcmVkLndpbmRvd3MubWFwKChpdCkgPT4gaXQua2V5KSk7XG4gIGNvbnN0IHRha2VuID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdG9yZWQsXG4gICAgd2luZG93czogc3RvcmVkLndpbmRvd3MubWFwKCh3aW5kb3cpID0+IHtcbiAgICAgIGNvbnN0IG93biA9IC9ebWlzc2luZzpcXGQrOiguKikkL3MuZXhlYyh3aW5kb3cua2V5KT8uWzFdO1xuXG4gICAgICBpZiAoXG4gICAgICAgIG93biA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICFvcGVuLmhhcyhvd24pIHx8XG4gICAgICAgIG5hbWVkLmhhcyhvd24pIHx8XG4gICAgICAgIHRha2VuLmhhcyhvd24pXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICAgIH1cblxuICAgICAgdGFrZW4uYWRkKG93bik7XG5cbiAgICAgIHJldHVybiB7IC4uLndpbmRvdywga2V5OiBvd24gfTtcbiAgICB9KSxcbiAgfTtcbn07XG5cbi8vIFRoZSBwbGFuIGZvciB0aGUgd2luZG93cyBvcGVuIGFuZCB0aGUgc2NyZWVucyBjb25uZWN0ZWQgbm93OiB3aGF0IHRoZSB1c2VyIGFycmFuZ2VkLCBmb3IgdGhlXG4vLyB3aW5kb3dzIGFuZCBzY3JlZW5zIGl0IG5hbWVzOyBhIHdpbmRvdyBpdCBkb2VzIG5vdCBuYW1lLCBhcyBvbmUgb3BlbmVkIHNpbmNlLCBpcyBub3QgdGlsZWQuIEFcbi8vIHdpbmRvdyBpdCBuYW1lcyBvbiBhIHNjcmVlbiBpdCBrbm93cyBub3RoaW5nIG9mIGdvZXMgb24gdGhlIHNjcmVlbiBpdCBpcyBvbiBpZiB3aW5kb3dzIGFyZSB0aWxlZFxuLy8gdGhlcmUsIGFuZCBvdGhlcndpc2Ugb24gdGhlIHNjcmVlbiB3aXRoIHRoZSBmZXdlc3QgY2VsbHMgdGFrZW4sIGxlZnQgYXMgaXQgaXMgd2hlbiBtaW5pbWl6ZWQuXG5leHBvcnQgY29uc3QgcmVzb2x2ZVRpbGluZ1BsYW4gPSAoXG4gIHdpbmRvd3M6IHJlYWRvbmx5IFdpbmRvd1JlY29yZFtdLFxuICBkaXNwbGF5czogcmVhZG9ubHkgRGlzcGxheVJlY29yZFtdLFxuICBzdG9yZWQ6IFN0b3JlZFRpbGluZ1BsYW4gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IHtcbiAgICAvLyBXaGV0aGVyLCB3aXRoIG5vdGhpbmcgYXJyYW5nZWQsIG1pbmltaXplZCB3aW5kb3dzIGFyZSB0aWxlZCB0b28gcmF0aGVyIHRoYW4gbGVmdCBhcyB0aGV5IGFyZS5cbiAgICByZWFkb25seSB0aWxlTWluaW1pemVkPzogYm9vbGVhbjtcbiAgICAvLyBUaGUga2V5IGVhY2ggd2luZG93IGdvZXMgYnkgaW4gdGhlIHBsYW4sIGJ5IGl0cyBvd246IGEgd2luZG93IGJlaW5nIG9wZW5lZCBhZ2FpbiBnb2VzIGJ5IHRoZVxuICAgIC8vIGtleSBvZiB0aGUgd2luZG93IG5vdCBvcGVuIGl0IGlzLCBhcyBzb29uIGFzIGl0IHNob3dzOyBvbmUgYWxpYXNlZCBhcyBgbGVmdE91dE9mUGxhbmAgaGFzIG5vXG4gICAgLy8gcGxhY2UgaW4gdGhlIHBsYW4gZm9yIG5vdy5cbiAgICByZWFkb25seSBhbGlhc2VzPzogUmVhZG9ubHlNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICB9ID0ge30sXG4pOiBSZXNvbHZlZFRpbGluZ1BsYW4gPT4ge1xuICBjb25zdCBrZXlPZiA9IChyZWNvcmQ6IFdpbmRvd1JlY29yZCkgPT4ge1xuICAgIGNvbnN0IGtleSA9IGtleU9mV2luZG93KHJlY29yZC53aW5kb3cpO1xuXG4gICAgcmV0dXJuIG9wdGlvbnMuYWxpYXNlcz8uZ2V0KGtleSkgPz8ga2V5O1xuICB9O1xuXG4gIHdpbmRvd3MgPSB3aW5kb3dzLmZpbHRlcigocmVjb3JkKSA9PiBrZXlPZihyZWNvcmQpICE9PSBsZWZ0T3V0T2ZQbGFuKTtcblxuICAvLyBUaGUgc2NyZWVucyBtYXkgbm90IGJlIGtub3duIHlldCwgYXMgYmVmb3JlIExlbnMgaGFzIHRvbGQgdGhlbTsgbm90aGluZyBjYW4gYmUgcGxhbm5lZCB3aXRob3V0LlxuICBpZiAoZGlzcGxheXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHsgc2NyZWVuczogW10sIHVudGlsZWQ6IFtdIH07XG4gIH1cblxuICBjb25zdCBjb25uZWN0ZWQgPSBkaXNwbGF5cztcblxuICBzdG9yZWQgPSB3aXRoV2luZG93c09wZW5BZ2FpbihcbiAgICB3aXRoU2NyZWVuc1JlY29ubmVjdGVkKHN0b3JlZCwgZGlzcGxheXMpLFxuICAgIHdpbmRvd3MsXG4gICAga2V5T2YsXG4gICk7XG5cbiAgLy8gQSBzY3JlZW4gdGhlIHBsYW4gaGFzIHdpbmRvd3Mgb24gdGhhdCBpcyBub3QgY29ubmVjdGVkIG5vdywga2VwdCB3aXRoIGl0cyB3aW5kb3dzIGFzIG1pc3NpbmcuXG4gIGNvbnN0IG1pc3NpbmcgPSBPYmplY3QuZW50cmllcyhzdG9yZWQ/LnNjcmVlbnMgPz8ge30pXG4gICAgLmZpbHRlcihcbiAgICAgIChbaWRdKSA9PlxuICAgICAgICAhY29ubmVjdGVkLnNvbWUoKGRpc3BsYXkpID0+IFN0cmluZyhkaXNwbGF5LmlkKSA9PT0gaWQpICYmXG4gICAgICAgIHN0b3JlZCEud2luZG93cy5zb21lKCh3aW5kb3cpID0+IFN0cmluZyh3aW5kb3cuZGlzcGxheUlkKSA9PT0gaWQpLFxuICAgIClcbiAgICAubWFwKChbaWQsIHNjcmVlbl0pID0+IHRvTWlzc2luZ0Rpc3BsYXkoTnVtYmVyKGlkKSwgc2NyZWVuKSk7XG5cbiAgY29uc3QgYWxsID0gWy4uLmNvbm5lY3RlZCwgLi4ubWlzc2luZ107XG5cbiAgY29uc3QgcmVjb3Jkc0J5S2V5ID0gbmV3IE1hcChcbiAgICB3aW5kb3dzLm1hcCgocmVjb3JkKSA9PiBba2V5T2YocmVjb3JkKSwgcmVjb3JkXSksXG4gICk7XG5cbiAgLy8gQSB3aW5kb3cgdGhlIHBsYW4gaGFzIHRoYXQgaXMgbm90IG9wZW4gbm93LCBrZXB0IGFzIG1pc3Npbmcgd2hlcmUgdGhlIHBsYW4ga25vd3Mgd2hhdCBpdCB3YXMuXG4gIGNvbnN0IG1pc3NpbmdXaW5kb3dzID0gbmV3IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgeyBtaXNzaW5nOiB0cnVlOyBjbG9zZWQ/OiBXaW5kb3dJZCB9XG4gID4oKTtcblxuICBmb3IgKGNvbnN0IHdpbmRvdyBvZiBzdG9yZWQ/LndpbmRvd3MgPz8gW10pIHtcbiAgICBpZiAod2luZG93LnRpdGxlICE9PSB1bmRlZmluZWQgJiYgIXJlY29yZHNCeUtleS5oYXMod2luZG93LmtleSkpIHtcbiAgICAgIGNvbnN0IGNsb3NlZCA9IGNsb3NlZFdpbmRvd09mKHdpbmRvdyk7XG5cbiAgICAgIHJlY29yZHNCeUtleS5zZXQod2luZG93LmtleSwgdG9NaXNzaW5nV2luZG93KHdpbmRvdy5rZXksIHdpbmRvdy50aXRsZSkpO1xuICAgICAgbWlzc2luZ1dpbmRvd3Muc2V0KHdpbmRvdy5rZXksIHtcbiAgICAgICAgbWlzc2luZzogdHJ1ZSxcbiAgICAgICAgLi4uKGNsb3NlZCA/IHsgY2xvc2VkIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBuYW1lZCA9IHN0b3JlZD8ud2luZG93cy5maWx0ZXIoKGl0KSA9PiByZWNvcmRzQnlLZXkuaGFzKGl0LmtleSkpID8/IFtdO1xuXG4gIGxldCBieVNjcmVlbjogTWFwPERpc3BsYXlSZWNvcmQsIFBsYW5uZWRXaW5kb3dbXT47XG4gIGxldCB1bnRpbGVkOiBQbGFubmVkV2luZG93W107XG5cbiAgaWYgKG5hbWVkLmxlbmd0aCA9PT0gMCkge1xuICAgICh7IGJ5U2NyZWVuLCB1bnRpbGVkIH0gPSBzcHJlYWRCeURlZmF1bHQoXG4gICAgICB3aW5kb3dzLFxuICAgICAgZGlzcGxheXMsXG4gICAgICBvcHRpb25zLnRpbGVNaW5pbWl6ZWQgPz8gZmFsc2UsXG4gICAgKSk7XG4gIH0gZWxzZSB7XG4gICAgYnlTY3JlZW4gPSBuZXcgTWFwKGFsbC5tYXAoKGRpc3BsYXkpID0+IFtkaXNwbGF5LCBbXV0pKTtcbiAgICB1bnRpbGVkID0gW107XG5cbiAgICAvLyBXaW5kb3dzIHRoZSBwbGFuIGhhcyBubyBwbGFjZSBmb3Igbm93LCBieSB0aGUga2V5IHRoZSBwbGFuIGtub3dzIHRoZW0gYnkuXG4gICAgY29uc3QgdW5wbGFjZWQ6IHsgcmVhZG9ubHkga2V5OiBzdHJpbmc7IHJlYWRvbmx5IHJlY29yZDogV2luZG93UmVjb3JkIH1bXSA9XG4gICAgICBbXTtcblxuICAgIGZvciAoY29uc3Qgd2luZG93IG9mIG5hbWVkKSB7XG4gICAgICBjb25zdCByZWNvcmQgPSByZWNvcmRzQnlLZXkuZ2V0KHdpbmRvdy5rZXkpITtcbiAgICAgIGNvbnN0IHBsYW5uZWQgPSB7XG4gICAgICAgIGtleTogd2luZG93LmtleSxcbiAgICAgICAgcmVjb3JkLFxuICAgICAgICAuLi5taXNzaW5nV2luZG93cy5nZXQod2luZG93LmtleSksXG4gICAgICAgIGNvbHVtbjogd2luZG93LmNvbHVtbixcbiAgICAgICAgcm93OiB3aW5kb3cucm93LFxuICAgICAgICBjb2x1bW5zOiB3aW5kb3cuY29sdW1ucyxcbiAgICAgICAgcm93czogd2luZG93LnJvd3MsXG4gICAgICB9O1xuICAgICAgY29uc3QgZGlzcGxheSA9IGFsbC5maW5kKChpdCkgPT4gaXQuaWQgPT09IHdpbmRvdy5kaXNwbGF5SWQpO1xuXG4gICAgICBpZiAod2luZG93LmRpc3BsYXlJZCA9PT0gbnVsbCkge1xuICAgICAgICB1bnRpbGVkLnB1c2gocGxhbm5lZCk7XG4gICAgICB9IGVsc2UgaWYgKGRpc3BsYXkpIHtcbiAgICAgICAgYnlTY3JlZW4uZ2V0KGRpc3BsYXkpIS5wdXNoKHBsYW5uZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdW5wbGFjZWQucHVzaCh7IGtleTogd2luZG93LmtleSwgcmVjb3JkIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG5hbWVkS2V5cyA9IG5ldyBTZXQobmFtZWQubWFwKChpdCkgPT4gaXQua2V5KSk7XG5cbiAgICAvLyBBIHdpbmRvdyB0aGUgcGxhbiBkb2VzIG5vdCBuYW1lLCBhcyBvbmUgb3BlbmVkIHNpbmNlLCBpcyBub3QgdGlsZWQgdW50aWwgcHV0IG9uIGEgc2NyZWVuLlxuICAgIHVudGlsZWQucHVzaChcbiAgICAgIC4uLndpbmRvd3NcbiAgICAgICAgLmZpbHRlcigocmVjb3JkKSA9PiAhbmFtZWRLZXlzLmhhcyhrZXlPZihyZWNvcmQpKSlcbiAgICAgICAgLm1hcCgocmVjb3JkKSA9PiAoeyBrZXk6IGtleU9mKHJlY29yZCksIHJlY29yZCwgY29sdW1uczogMSwgcm93czogMSB9KSksXG4gICAgKTtcblxuICAgIGZvciAoY29uc3QgeyBrZXksIHJlY29yZCB9IG9mIHVucGxhY2VkKSB7XG4gICAgICBjb25zdCBtaXNzaW5nID0gbWlzc2luZ1dpbmRvd3MuaGFzKGtleSk7XG4gICAgICBjb25zdCBwbGFubmVkID0ge1xuICAgICAgICBrZXksXG4gICAgICAgIHJlY29yZCxcbiAgICAgICAgLi4ubWlzc2luZ1dpbmRvd3MuZ2V0KGtleSksXG4gICAgICAgIGNvbHVtbnM6IDEsXG4gICAgICAgIHJvd3M6IDEsXG4gICAgICB9O1xuXG4gICAgICAvLyBBIHdpbmRvdyBub3Qgb3BlbiwgaXRzIHNjcmVlbiBnb25lIHRvbywgaXMgbm90IHRpbGVkOyBub3IgaXMgb25lIG1pbmltaXplZC5cbiAgICAgIGlmIChtaXNzaW5nIHx8IHJlY29yZC5zdGF0ZS5nZXQoKSA9PT0gXCJtaW5pbWl6ZWRcIikge1xuICAgICAgICB1bnRpbGVkLnB1c2gocGxhbm5lZCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB1c2VkID0gZGlzcGxheXMuZmlsdGVyKFxuICAgICAgICAoZGlzcGxheSkgPT4gYnlTY3JlZW4uZ2V0KGRpc3BsYXkpIS5sZW5ndGggPiAwLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGNob2ljZXMgPSB1c2VkLmxlbmd0aCA+IDAgPyB1c2VkIDogZGlzcGxheXM7XG4gICAgICBjb25zdCBvd24gPSBjaG9pY2VzLmZpbmQoXG4gICAgICAgIChkaXNwbGF5KSA9PiBkaXNwbGF5LmlkID09PSByZWNvcmQuZGlzcGxheUlkLmdldCgpLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgZmV3ZXN0ID1cbiAgICAgICAgb3duID8/XG4gICAgICAgIFsuLi5jaG9pY2VzXS5zb3J0KFxuICAgICAgICAgIChhLCBiKSA9PlxuICAgICAgICAgICAgYnlTY3JlZW4uZ2V0KGEpIS5yZWR1Y2UoKHN1bSwgaXQpID0+IHN1bSArIGNlbGxzT2YoaXQpLCAwKSAtXG4gICAgICAgICAgICBieVNjcmVlbi5nZXQoYikhLnJlZHVjZSgoc3VtLCBpdCkgPT4gc3VtICsgY2VsbHNPZihpdCksIDApLFxuICAgICAgICApWzBdO1xuXG4gICAgICBpZiAoZmV3ZXN0KSB7XG4gICAgICAgIGJ5U2NyZWVuLmdldChmZXdlc3QpIS5wdXNoKHBsYW5uZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNjcmVlbnMgPSBhbGwubWFwKChkaXNwbGF5KTogUGxhbm5lZFNjcmVlbiA9PiB7XG4gICAgY29uc3Qgb25TY3JlZW4gPSBieVNjcmVlbi5nZXQoZGlzcGxheSkgPz8gW107XG4gICAgY29uc3Qgd2lkZXN0ID0gTWF0aC5tYXgoMSwgLi4ub25TY3JlZW4ubWFwKChpdCkgPT4gaXQuY29sdW1ucykpO1xuICAgIGNvbnN0IHN0b3JlZENvbHVtbnMgPSBzdG9yZWQ/LmNvbHVtbnNbU3RyaW5nKGRpc3BsYXkuaWQpXTtcblxuICAgIGNvbnN0IGNvbHVtbnMgPVxuICAgICAgc3RvcmVkQ29sdW1ucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gTWF0aC5tYXgoc3RvcmVkQ29sdW1ucywgMSlcbiAgICAgICAgOiBjbGFtcChcbiAgICAgICAgICAgIE1hdGgubWF4KFxuICAgICAgICAgICAgICBjb2x1bW5zRm9yKFxuICAgICAgICAgICAgICAgIG9uU2NyZWVuLnJlZHVjZSgoc3VtLCBpdCkgPT4gc3VtICsgY2VsbHNPZihpdCksIDApIHx8IDEsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHdpZGVzdCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICAxLFxuICAgICAgICAgICAgbWF4Q29sdW1ucyxcbiAgICAgICAgICApO1xuXG4gICAgY29uc3QgeyBwbGFjZWQsIHJvd3M6IG5lZWRlZFJvd3MgfSA9IHBsYWNlSW5HcmlkKG9uU2NyZWVuLCBjb2x1bW5zKTtcbiAgICBjb25zdCBzdG9yZWRSb3dzID0gc3RvcmVkPy5yb3dzPy5bU3RyaW5nKGRpc3BsYXkuaWQpXSA/PyAwO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3BsYXksXG4gICAgICBtaXNzaW5nOiBtaXNzaW5nLmluY2x1ZGVzKGRpc3BsYXkpLFxuICAgICAgY29sdW1ucyxcbiAgICAgIHJvd3M6IE1hdGgubWF4KG5lZWRlZFJvd3MsIHN0b3JlZFJvd3MsIDEpLFxuICAgICAgbmVlZGVkUm93cyxcbiAgICAgIHdpbmRvd3M6IHBsYWNlZCxcbiAgICB9O1xuICB9KTtcblxuICByZXR1cm4geyBzY3JlZW5zLCB1bnRpbGVkIH07XG59O1xuXG4vLyBUaGUgdGl0bGUgYSBtaXNzaW5nIHdpbmRvdyBpcyBrZXB0IHdpdGgsIHNvIHRoYXQgaXQgaXMgc2hvd24gYWdhaW4uXG4vLyBFdmVyeSB3aW5kb3cgaXMga2VwdCB3aXRoIGl0cyB0aXRsZSwgc28gdGhhdCBvbmUgY2xvc2VkIHNpbmNlIGlzIHNob3duIGFnYWluLCBhcyBtaXNzaW5nLlxuLy8gVGhlIHRpdGxlIG9mIHRoZSB3aW5kb3csIGFuZCBpdHMgaWQgd2hpbGUgb3BlbiwgYXMgYSBwbGFuIGVudHJ5IGtlZXBzIHRoZW07IGEgd2luZG93IGJlaW5nIG9wZW5lZFxuLy8gaW4gYSBjZWxsLCBzdGFuZGluZyBpbiBieSBhIGtleSBvZiBpdHMgb3duLCBoYXMgbm8gaWQgeWV0LlxuY29uc3QgdGl0bGVPZiA9ICh3aW5kb3c6IFBsYW5uZWRXaW5kb3cpID0+IHtcbiAgY29uc3QgaWQgPSB3aW5kb3cubWlzc2luZyA/IHdpbmRvdy5jbG9zZWQgOiB3aW5kb3cucmVjb3JkLndpbmRvdztcblxuICByZXR1cm4ge1xuICAgIHRpdGxlOiB3aW5kb3cucmVjb3JkLnRpdGxlLmdldCgpLFxuICAgIC4uLihpZCAmJiAhaXNBcHBsaWNhdGlvbldpbmRvdyhpZCkgPyB7IHdpbmRvdzogaWQgfSA6IHt9KSxcbiAgfTtcbn07XG5cbi8vIFRoZSBwbGFuJ3Mgd2luZG93cyBpbiBpdHMgb3JkZXIsIHRob3NlIHRpbGVkIGFuZCB0aGVuIHRob3NlIGxlZnQgYXMgdGhleSBhcmUsIGVhY2ggd2hlcmUgaXQgaXMuXG5leHBvcnQgY29uc3Qgd2luZG93c09mUGxhbiA9IChyZXNvbHZlZDogUmVzb2x2ZWRUaWxpbmdQbGFuKSA9PiBbXG4gIC4uLnJlc29sdmVkLnNjcmVlbnMuZmxhdE1hcCgoc2NyZWVuKSA9PlxuICAgIHNjcmVlbi53aW5kb3dzLm1hcCgoaXQpID0+ICh7XG4gICAgICBrZXk6IGl0LmtleSxcbiAgICAgIGRpc3BsYXlJZDogc2NyZWVuLmRpc3BsYXkuaWQgYXMgbnVtYmVyIHwgbnVsbCxcbiAgICAgIGNvbHVtbjogaXQuY29sdW1uIGFzIG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICAgIHJvdzogaXQucm93IGFzIG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICAgIGNvbHVtbnM6IGl0LmNvbHVtbnMsXG4gICAgICByb3dzOiBpdC5yb3dzLFxuICAgICAgLi4udGl0bGVPZihpdCksXG4gICAgfSkpLFxuICApLFxuICAuLi5yZXNvbHZlZC51bnRpbGVkLm1hcCgoaXQpID0+ICh7XG4gICAga2V5OiBpdC5rZXksXG4gICAgZGlzcGxheUlkOiBudWxsLFxuICAgIGNvbHVtbjogdW5kZWZpbmVkLFxuICAgIHJvdzogdW5kZWZpbmVkLFxuICAgIGNvbHVtbnM6IGl0LmNvbHVtbnMsXG4gICAgcm93czogaXQucm93cyxcbiAgICAuLi50aXRsZU9mKGl0KSxcbiAgfSkpLFxuXTtcblxuLy8gVGhlIHBsYW4gYXMgaXQgaXMgcmVzb2x2ZWQgbm93LCB0byBrZWVwOiBldmVyeSB3aW5kb3cgb3BlbiB3aGVyZSBpdCBzaG93cywgaW4gb3JkZXIsIGFuZCBldmVyeVxuLy8gc2NyZWVuJ3MgY29sdW1ucywgdGhlIHdpbmRvd3MgYW5kIHNjcmVlbnMgbm90IGhlcmUgbm93IGtlcHQgYXMgdGhleSB3ZXJlLlxuZXhwb3J0IGNvbnN0IHRvU3RvcmVkUGxhbiA9IChcbiAgcmVzb2x2ZWQ6IFJlc29sdmVkVGlsaW5nUGxhbixcbiAgcHJldmlvdXM6IFN0b3JlZFRpbGluZ1BsYW4gfCB1bmRlZmluZWQsXG4pOiBTdG9yZWRUaWxpbmdQbGFuID0+IHtcbiAgY29uc3Qgb3BlbiA9IHdpbmRvd3NPZlBsYW4ocmVzb2x2ZWQpO1xuXG4gIGNvbnN0IG9wZW5LZXlzID0gbmV3IFNldChvcGVuLm1hcCgoaXQpID0+IGl0LmtleSkpO1xuXG4gIHJldHVybiB7XG4gICAgd2luZG93czogW1xuICAgICAgLi4ub3BlbixcbiAgICAgIC4uLihwcmV2aW91cz8ud2luZG93cy5maWx0ZXIoKGl0KSA9PiAhb3BlbktleXMuaGFzKGl0LmtleSkpID8/IFtdKSxcbiAgICBdLFxuICAgIGNvbHVtbnM6IHtcbiAgICAgIC4uLnByZXZpb3VzPy5jb2x1bW5zLFxuICAgICAgLi4uT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICByZXNvbHZlZC5zY3JlZW5zLm1hcCgoc2NyZWVuKSA9PiBbXG4gICAgICAgICAgU3RyaW5nKHNjcmVlbi5kaXNwbGF5LmlkKSxcbiAgICAgICAgICBzY3JlZW4uY29sdW1ucyxcbiAgICAgICAgXSksXG4gICAgICApLFxuICAgIH0sXG4gICAgcm93czoge1xuICAgICAgLi4ucHJldmlvdXM/LnJvd3MsXG4gICAgICAuLi5PYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIHJlc29sdmVkLnNjcmVlbnMubWFwKChzY3JlZW4pID0+IFtcbiAgICAgICAgICBTdHJpbmcoc2NyZWVuLmRpc3BsYXkuaWQpLFxuICAgICAgICAgIHNjcmVlbi5yb3dzLFxuICAgICAgICBdKSxcbiAgICAgICksXG4gICAgfSxcbiAgICBzY3JlZW5zOiB7XG4gICAgICAuLi5wcmV2aW91cz8uc2NyZWVucyxcbiAgICAgIC4uLk9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgcmVzb2x2ZWQuc2NyZWVucy5tYXAoKHNjcmVlbikgPT4gW1xuICAgICAgICAgIFN0cmluZyhzY3JlZW4uZGlzcGxheS5pZCksXG4gICAgICAgICAgdG9TdG9yZWRTY3JlZW4oc2NyZWVuLmRpc3BsYXkpLFxuICAgICAgICBdKSxcbiAgICAgICksXG4gICAgfSxcbiAgfTtcbn07XG5cbi8vIFRoZSBwbGFuIHdpdGggZXZlcnkgc2NyZWVuJ3Mgd2luZG93cyBwbGFjZWQgYWdhaW4gaW4gaXRzIGdyaWQgYWZ0ZXIgYW4gZWRpdCwgdGhlIGdyaWQga2VlcGluZ1xuLy8gdGhlIHJvd3MgaXQgaGFkIHVubGVzcyB0aGUgd2luZG93cyBuZWVkIG1vcmUuXG5jb25zdCBwbGFjZWRBZ2FpbiA9IChyZXNvbHZlZDogUmVzb2x2ZWRUaWxpbmdQbGFuKTogUmVzb2x2ZWRUaWxpbmdQbGFuID0+ICh7XG4gIC4uLnJlc29sdmVkLFxuICBzY3JlZW5zOiByZXNvbHZlZC5zY3JlZW5zLm1hcCgoc2NyZWVuKSA9PiB7XG4gICAgY29uc3QgeyBwbGFjZWQsIHJvd3M6IG5lZWRlZFJvd3MgfSA9IHBsYWNlSW5HcmlkKFxuICAgICAgc2NyZWVuLndpbmRvd3MsXG4gICAgICBzY3JlZW4uY29sdW1ucyxcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnNjcmVlbixcbiAgICAgIHdpbmRvd3M6IHBsYWNlZCxcbiAgICAgIG5lZWRlZFJvd3MsXG4gICAgICByb3dzOiBNYXRoLm1heChuZWVkZWRSb3dzLCBzY3JlZW4ucm93cywgMSksXG4gICAgfTtcbiAgfSksXG59KTtcblxuLy8gV2hlcmUgb24gdGhlIHNjcmVlbnMgdGhlIHdpbmRvdyBnb2VzOiBvbiBhIHNjcmVlbiwgZnJvbSBhIGNlbGwsIG9yIHRoZSBmaXJzdCBmcmVlIG9uZSB3aGVuIG5vbmVcbi8vIGlzIGdpdmVuOyBvciBudWxsIHRvIGxlYXZlIGl0IGFzIGl0IGlzLlxuZXhwb3J0IHR5cGUgUGxhblRhcmdldCA9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgZGlzcGxheUlkOiBudW1iZXI7XG4gICAgICByZWFkb25seSBjb2x1bW4/OiBudW1iZXI7XG4gICAgICByZWFkb25seSByb3c/OiBudW1iZXI7XG4gICAgfVxuICB8IHsgcmVhZG9ubHkgZGlzcGxheUlkOiBudWxsIH07XG5cbi8vIEV2ZXJ5IHdpbmRvdyBvZiB0aGUgc2NyZWVuIGxlZnQgb3V0IG9mIHRpbGluZzsgdGhlIG90aGVyIHNjcmVlbnMnIHdpbmRvd3Mgc3RheSB3aGVyZSB0aGV5IGFyZS5cbmV4cG9ydCBjb25zdCB1bnRpbGVTY3JlZW5JblBsYW4gPSAoXG4gIHJlc29sdmVkOiBSZXNvbHZlZFRpbGluZ1BsYW4sXG4gIGRpc3BsYXlJZDogbnVtYmVyLFxuKTogUmVzb2x2ZWRUaWxpbmdQbGFuID0+XG4gIChcbiAgICByZXNvbHZlZC5zY3JlZW5zLmZpbmQoKHNjcmVlbikgPT4gc2NyZWVuLmRpc3BsYXkuaWQgPT09IGRpc3BsYXlJZClcbiAgICAgID8ud2luZG93cyA/PyBbXVxuICApLnJlZHVjZShcbiAgICAocGxhbiwgd2luZG93KSA9PiBtb3ZlSW5QbGFuKHBsYW4sIHdpbmRvdy5rZXksIHsgZGlzcGxheUlkOiBudWxsIH0pLFxuICAgIHJlc29sdmVkLFxuICApO1xuXG4vLyBNb3ZlcyB0aGUgd2luZG93IHdoZXJlIGFza2VkLCB0YWtpbmcgdGhlIGNlbGwgZnJvbSB0aGUgd2luZG93cyB0aGVyZSwgd2hpY2ggZ28gdG8gdGhlIGZpcnN0IGZyZWVcbi8vIGNlbGxzOyB0aGUgb3RoZXIgd2luZG93cyBzdGF5IHdoZXJlIHRoZXkgYXJlLlxuZXhwb3J0IGNvbnN0IG1vdmVJblBsYW4gPSAoXG4gIHJlc29sdmVkOiBSZXNvbHZlZFRpbGluZ1BsYW4sXG4gIGtleTogc3RyaW5nLFxuICB0YXJnZXQ6IFBsYW5UYXJnZXQsXG4pOiBSZXNvbHZlZFRpbGluZ1BsYW4gPT4ge1xuICBjb25zdCBtb3ZpbmcgPSBbXG4gICAgLi4ucmVzb2x2ZWQuc2NyZWVucy5mbGF0TWFwKChpdCkgPT4gaXQud2luZG93cyksXG4gICAgLi4ucmVzb2x2ZWQudW50aWxlZCxcbiAgXS5maW5kKChpdCkgPT4gaXQua2V5ID09PSBrZXkpO1xuXG4gIGlmICghbW92aW5nKSB7XG4gICAgcmV0dXJuIHJlc29sdmVkO1xuICB9XG5cbiAgY29uc3Qgd2l0aG91dCA9IDxUIGV4dGVuZHMgUGxhbm5lZFdpbmRvdz4od2luZG93czogcmVhZG9ubHkgVFtdKSA9PlxuICAgIHdpbmRvd3MuZmlsdGVyKChpdCkgPT4gaXQua2V5ICE9PSBrZXkpO1xuICBjb25zdCB7IGNvbHVtbjogX2NvbHVtbiwgcm93OiBfcm93LCAuLi51bnBsYWNlZCB9ID0gbW92aW5nIGFzIFBsYWNlZFdpbmRvdztcblxuICByZXR1cm4gcGxhY2VkQWdhaW4oe1xuICAgIHNjcmVlbnM6IHJlc29sdmVkLnNjcmVlbnMubWFwKChzY3JlZW4pID0+IHtcbiAgICAgIGNvbnN0IG90aGVycyA9IHdpdGhvdXQoc2NyZWVuLndpbmRvd3MpO1xuXG4gICAgICBpZiAodGFyZ2V0LmRpc3BsYXlJZCAhPT0gc2NyZWVuLmRpc3BsYXkuaWQpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uc2NyZWVuLCB3aW5kb3dzOiBvdGhlcnMgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhcmdldC5jb2x1bW4gPT09IHVuZGVmaW5lZCB8fCB0YXJnZXQucm93ID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB7IC4uLnNjcmVlbiwgd2luZG93czogWy4uLm90aGVycywgdW5wbGFjZWQgYXMgUGxhY2VkV2luZG93XSB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgLi4uc2NyZWVuLFxuICAgICAgICAgICAgd2luZG93czogW1xuICAgICAgICAgICAgICB7IC4uLnVucGxhY2VkLCBjb2x1bW46IHRhcmdldC5jb2x1bW4sIHJvdzogdGFyZ2V0LnJvdyB9LFxuICAgICAgICAgICAgICAuLi5vdGhlcnMsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH07XG4gICAgfSksXG4gICAgdW50aWxlZDpcbiAgICAgIHRhcmdldC5kaXNwbGF5SWQgPT09IG51bGxcbiAgICAgICAgPyBbLi4ud2l0aG91dChyZXNvbHZlZC51bnRpbGVkKSwgdW5wbGFjZWRdXG4gICAgICAgIDogd2l0aG91dChyZXNvbHZlZC51bnRpbGVkKSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVzaXplSW5QbGFuID0gKFxuICByZXNvbHZlZDogUmVzb2x2ZWRUaWxpbmdQbGFuLFxuICBrZXk6IHN0cmluZyxcbiAgY29sdW1uczogbnVtYmVyLFxuICByb3dzOiBudW1iZXIsXG4pOiBSZXNvbHZlZFRpbGluZ1BsYW4gPT5cbiAgcGxhY2VkQWdhaW4oe1xuICAgIC4uLnJlc29sdmVkLFxuICAgIHNjcmVlbnM6IHJlc29sdmVkLnNjcmVlbnMubWFwKChzY3JlZW4pID0+IHtcbiAgICAgIGNvbnN0IHJlc2l6ZWQgPSBzY3JlZW4ud2luZG93cy5maW5kKChpdCkgPT4gaXQua2V5ID09PSBrZXkpO1xuXG4gICAgICAvLyBGaXJzdCwgc28gaXQga2VlcHMgaXRzIGNlbGwgYW5kIHRha2VzIHRoZSBjZWxscyBpdCBncm93cyBvdmVyIGZyb20gdGhlIHdpbmRvd3MgdGhlcmUuXG4gICAgICByZXR1cm4gcmVzaXplZFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLnNjcmVlbixcbiAgICAgICAgICAgIHdpbmRvd3M6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC4uLnJlc2l6ZWQsXG4gICAgICAgICAgICAgICAgY29sdW1uczogY2xhbXAoY29sdW1ucywgMSwgc2NyZWVuLmNvbHVtbnMpLFxuICAgICAgICAgICAgICAgIHJvd3M6IGNsYW1wKHJvd3MsIDEsIE1hdGgubWF4KG1heFJvd3MsIHNjcmVlbi5yb3dzKSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIC4uLnNjcmVlbi53aW5kb3dzLmZpbHRlcigoaXQpID0+IGl0ICE9PSByZXNpemVkKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfVxuICAgICAgICA6IHNjcmVlbjtcbiAgICB9KSxcbiAgfSk7XG5cbmV4cG9ydCBjb25zdCBzZXRDb2x1bW5zSW5QbGFuID0gKFxuICByZXNvbHZlZDogUmVzb2x2ZWRUaWxpbmdQbGFuLFxuICBkaXNwbGF5SWQ6IG51bWJlcixcbiAgY29sdW1uczogbnVtYmVyLFxuKTogUmVzb2x2ZWRUaWxpbmdQbGFuID0+XG4gIHBsYWNlZEFnYWluKHtcbiAgICAuLi5yZXNvbHZlZCxcbiAgICBzY3JlZW5zOiByZXNvbHZlZC5zY3JlZW5zLm1hcCgoc2NyZWVuKSA9PlxuICAgICAgc2NyZWVuLmRpc3BsYXkuaWQgPT09IGRpc3BsYXlJZFxuICAgICAgICA/IHsgLi4uc2NyZWVuLCBjb2x1bW5zOiBNYXRoLm1heChjb2x1bW5zLCAxKSB9XG4gICAgICAgIDogc2NyZWVuLFxuICAgICksXG4gIH0pO1xuXG5leHBvcnQgY29uc3Qgc2V0Um93c0luUGxhbiA9IChcbiAgcmVzb2x2ZWQ6IFJlc29sdmVkVGlsaW5nUGxhbixcbiAgZGlzcGxheUlkOiBudW1iZXIsXG4gIHJvd3M6IG51bWJlcixcbik6IFJlc29sdmVkVGlsaW5nUGxhbiA9PlxuICBwbGFjZWRBZ2Fpbih7XG4gICAgLi4ucmVzb2x2ZWQsXG4gICAgc2NyZWVuczogcmVzb2x2ZWQuc2NyZWVucy5tYXAoKHNjcmVlbikgPT5cbiAgICAgIHNjcmVlbi5kaXNwbGF5LmlkID09PSBkaXNwbGF5SWRcbiAgICAgICAgPyB7IC4uLnNjcmVlbiwgcm93czogTWF0aC5tYXgocm93cywgMSkgfVxuICAgICAgICA6IHNjcmVlbixcbiAgICApLFxuICB9KTtcblxuLy8gV2hlcmUgaW4gYSBzY3JlZW4ncyBncmlkLCBhdCBpdHMgcGxhY2Ugb24gdGhlIHBhZ2UsIGEgd2luZG93IGRyYWdnZWQgdG8gdGhlIHBvaW50IGdvZXM6IHRoZSBjZWxsXG4vLyB1bmRlciB0aGUgcG9pbnQgaXMgdGhlIG9uZSBvZiB0aGUgd2luZG93IHRoYXQgd2FzIGdyYWJiZWQsIHNvIHRoZSB3aW5kb3cga2VlcHMgdW5kZXIgdGhlIHBvaW50ZXJcbi8vIHdoZXJlIGl0IHdhcyBncmFiYmVkLlxuZXhwb3J0IGNvbnN0IHRhcmdldEluR3JpZCA9IChcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4gIGdyaWQ6IHsgbGVmdDogbnVtYmVyOyB0b3A6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSxcbiAgc2NyZWVuOiBQbGFubmVkU2NyZWVuLFxuICBncmFiYmVkOiB7IHJlYWRvbmx5IGNvbHVtbjogbnVtYmVyOyByZWFkb25seSByb3c6IG51bWJlciB9LFxuKTogUGxhblRhcmdldCA9PiB7XG4gIGNvbnN0IHJvd3MgPSBNYXRoLm1heChzY3JlZW4ucm93cywgMSk7XG4gIGNvbnN0IGNvbHVtbiA9XG4gICAgTWF0aC5mbG9vcigoKHggLSBncmlkLmxlZnQpIC8gZ3JpZC53aWR0aCkgKiBzY3JlZW4uY29sdW1ucykgLVxuICAgIGdyYWJiZWQuY29sdW1uO1xuICBjb25zdCByb3cgPSBNYXRoLmZsb29yKCgoeSAtIGdyaWQudG9wKSAvIGdyaWQuaGVpZ2h0KSAqIHJvd3MpIC0gZ3JhYmJlZC5yb3c7XG5cbiAgcmV0dXJuIHtcbiAgICBkaXNwbGF5SWQ6IHNjcmVlbi5kaXNwbGF5LmlkLFxuICAgIGNvbHVtbjogTWF0aC5tYXgoMCwgTWF0aC5taW4oY29sdW1uLCBzY3JlZW4uY29sdW1ucyAtIDEpKSxcbiAgICByb3c6IE1hdGgubWF4KDAsIE1hdGgubWluKHJvdywgcm93cyAtIDEpKSxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCB0b1N0b3JlZFNjcmVlbiA9IChkaXNwbGF5OiBEaXNwbGF5UmVjb3JkKTogU3RvcmVkUGxhblNjcmVlbiA9PiAoe1xuICBsYWJlbDogZGlzcGxheS5sYWJlbC5nZXQoKSxcbiAgaXNQcmltYXJ5OiBkaXNwbGF5LmlzUHJpbWFyeS5nZXQoKSxcbiAgYm91bmRzOiB7IC4uLmRpc3BsYXkuYm91bmRzLmdldCgpIH0sXG4gIHdvcmtBcmVhOiB7IC4uLmRpc3BsYXkud29ya0FyZWEuZ2V0KCkgfSxcbn0pO1xuXG4vLyBBIHdpbmRvdyBub3Qgb3BlbiwgYXMgdGhlIHBsYW4gaGFzIGl0LCBzdGFuZGluZyBpbiBmb3Igb25lIGluIHRoZSBwbGFuLlxuY29uc3QgdG9NaXNzaW5nV2luZG93ID0gKGtleTogc3RyaW5nLCB0aXRsZTogc3RyaW5nKSA9PlxuICAoe1xuICAgIHdpbmRvdzogeyBraW5kOiBcIm1pc3NpbmdcIiwgaWQ6IGtleSB9LFxuICAgIHRpdGxlOiB7IGdldDogKCkgPT4gdGl0bGUgfSxcbiAgICBzdGF0ZTogeyBnZXQ6ICgpID0+IFwibm9ybWFsXCIgfSxcbiAgICBkaXNwbGF5SWQ6IHsgZ2V0OiAoKSA9PiAtMSB9LFxuICAgIGlzRm9jdXNlZDogeyBnZXQ6ICgpID0+IGZhbHNlIH0sXG4gICAgZGVzY3JpYmVSZW9wZW5pbmc6IGFzeW5jICgpID0+IHVuZGVmaW5lZCxcbiAgfSkgYXMgdW5rbm93biBhcyBXaW5kb3dSZWNvcmQ7XG5cbi8vIEEgc2NyZWVuIG5vdCBjb25uZWN0ZWQsIGFzIHRoZSBwbGFuIGhhcyBpdCwgc3RhbmRpbmcgaW4gZm9yIG9uZSBpbiB0aGUgcGxhbjsgbmV2ZXIgcHJpbWFyeSwgYXNcbi8vIGFub3RoZXIgc2NyZWVuIGlzIHByaW1hcnkgbm93LlxuY29uc3QgdG9NaXNzaW5nRGlzcGxheSA9IChpZDogbnVtYmVyLCBzY3JlZW46IFN0b3JlZFBsYW5TY3JlZW4pID0+XG4gICh7XG4gICAgaWQsXG4gICAgbGFiZWw6IHsgZ2V0OiAoKSA9PiBzY3JlZW4ubGFiZWwgfSxcbiAgICBpc1ByaW1hcnk6IHsgZ2V0OiAoKSA9PiBmYWxzZSB9LFxuICAgIGJvdW5kczogeyBnZXQ6ICgpID0+IHNjcmVlbi5ib3VuZHMgfSxcbiAgICB3b3JrQXJlYTogeyBnZXQ6ICgpID0+IHNjcmVlbi53b3JrQXJlYSB9LFxuICAgIHNjYWxlRmFjdG9yOiB7IGdldDogKCkgPT4gMSB9LFxuICAgIHJvdGF0aW9uOiB7IGdldDogKCkgPT4gMCB9LFxuICB9KSBhcyB1bmtub3duIGFzIERpc3BsYXlSZWNvcmQ7XG5cbi8vIEV2ZXJ5IHdpbmRvdyBsZWZ0IGFzIGl0IGlzLCBhcyBhIG5ldyBsYXlvdXQgc3RhcnRzIG91dC5cbmV4cG9ydCBjb25zdCBhbGxMZWZ0QXNUaGV5QXJlID0gKFxuICB3aW5kb3dzOiByZWFkb25seSBXaW5kb3dSZWNvcmRbXSxcbik6IFN0b3JlZFRpbGluZ1BsYW4gPT4gKHtcbiAgd2luZG93czogd2luZG93cy5tYXAoKHJlY29yZCkgPT4gKHtcbiAgICBrZXk6IGtleU9mV2luZG93KHJlY29yZC53aW5kb3cpLFxuICAgIHRpdGxlOiByZWNvcmQudGl0bGUuZ2V0KCksXG4gICAgLi4uKGlzQXBwbGljYXRpb25XaW5kb3cocmVjb3JkLndpbmRvdykgPyB7fSA6IHsgd2luZG93OiByZWNvcmQud2luZG93IH0pLFxuICAgIGRpc3BsYXlJZDogbnVsbCxcbiAgICBjb2x1bW5zOiAxLFxuICAgIHJvd3M6IDEsXG4gIH0pKSxcbiAgY29sdW1uczoge30sXG4gIHJvd3M6IHt9LFxuICBzY3JlZW5zOiB7fSxcbn0pO1xuXG4vLyBUaGUgd2luZG93cyBub3QgdGlsZWQsIHRob3NlIG9wZW4sIGVhY2ggcGxhY2VkIG9uIHRoZSBjb25uZWN0ZWQgc2NyZWVuIHdpdGggdGhlIGZld2VzdCBjZWxsc1xuLy8gdGFrZW4sIGluIHRoZSBmaXJzdCBmcmVlIGNlbGw7IHRoZSB3aW5kb3dzIHRpbGVkIHN0YXkgd2hlcmUgdGhleSBhcmUuXG5leHBvcnQgY29uc3QgdGlsZVVudGlsZWQgPSAoXG4gIHJlc29sdmVkOiBSZXNvbHZlZFRpbGluZ1BsYW4sXG4pOiBSZXNvbHZlZFRpbGluZ1BsYW4gPT4ge1xuICBsZXQgcGxhbiA9IHJlc29sdmVkO1xuXG4gIGZvciAoY29uc3Qgd2luZG93IG9mIHJlc29sdmVkLnVudGlsZWQuZmlsdGVyKChpdCkgPT4gIWl0Lm1pc3NpbmcpKSB7XG4gICAgY29uc3QgY2VsbHNUYWtlbiA9IChzY3JlZW46IFBsYW5uZWRTY3JlZW4pID0+XG4gICAgICBzY3JlZW4ud2luZG93cy5yZWR1Y2UoKHN1bSwgaXQpID0+IHN1bSArIGNlbGxzT2YoaXQpLCAwKTtcbiAgICBjb25zdCBmZXdlc3QgPSBwbGFuLnNjcmVlbnNcbiAgICAgIC5maWx0ZXIoKHNjcmVlbikgPT4gIXNjcmVlbi5taXNzaW5nKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGNlbGxzVGFrZW4oYSkgLSBjZWxsc1Rha2VuKGIpKVswXTtcblxuICAgIGlmIChmZXdlc3QpIHtcbiAgICAgIHBsYW4gPSBtb3ZlSW5QbGFuKHBsYW4sIHdpbmRvdy5rZXksIHsgZGlzcGxheUlkOiBmZXdlc3QuZGlzcGxheS5pZCB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGxhbjtcbn07XG4iLCAiLy8gQXMgbmVhciBzcXVhcmUgYSBncmlkIGFzIGZpdHMgdGhlIGNvdW50LCBidXQgYSBjb2x1bW4gbW9yZSBhbmQgYSByb3cgZmV3ZXIgd2hlbiB0aGF0IHN0aWxsIGZpdHMsXG4vLyB3aGljaCBsZWF2ZXMgZmV3ZXIgY2VsbHMgZW1wdHkgb24gYSBzY3JlZW4gd2lkZXIgdGhhbiB0YWxsLlxuZXhwb3J0IGNvbnN0IGNvbHVtbnNGb3IgPSAoY291bnQ6IG51bWJlcikgPT4ge1xuICBjb25zdCBjb2x1bW5zID0gTWF0aC5jZWlsKE1hdGguc3FydChjb3VudCkpO1xuICBjb25zdCByb3dzID0gTWF0aC5jZWlsKGNvdW50IC8gY29sdW1ucyk7XG5cbiAgcmV0dXJuIHJvd3MgPiAxICYmIChjb2x1bW5zICsgMSkgKiAocm93cyAtIDEpID49IGNvdW50XG4gICAgPyBjb2x1bW5zICsgMVxuICAgIDogY29sdW1ucztcbn07XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0YWJsZTIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgZ2V0UGVyc2lzdGFibGVWYWx1ZUluamVjdGFibGVCdW5jaCB9IGZyb20gXCJAazhzbGVucy9wZXJzaXN0YWJsZS1jb250cmFjdHNcIjtcbmltcG9ydCB7XG4gIGRpc3BsYXlSZWNvcmRzUmVhY3RpdmVJbmplY3Rpb25Ub2tlbixcbiAgd2luZG93UmVjb3Jkc1JlYWN0aXZlSW5qZWN0aW9uVG9rZW4sXG59IGZyb20gXCJAazhzbGVucy93aW5kb3ctbGF5b3V0LWNvbnRyYWN0c1wiO1xuaW1wb3J0IHtcbiAgY29tcHV0ZWQsXG4gIG9ic2VydmFibGUsXG4gIHJ1bkluQWN0aW9uLFxuICB0eXBlIElDb21wdXRlZFZhbHVlLFxuICB0eXBlIElPYnNlcnZhYmxlVmFsdWUsXG59IGZyb20gXCJtb2J4XCI7XG5pbXBvcnQgdHlwZSB7IFdpbmRvd0lkIH0gZnJvbSBcIkBrOHNsZW5zL21lc3NhZ2luZy1jb250cmFjdHNcIjtcbmltcG9ydCB7XG4gIGFsbExlZnRBc1RoZXlBcmUsXG4gIGtleU9mV2luZG93LFxuICBvcGVuaW5nUHJlZml4LFxuICByZXNvbHZlVGlsaW5nUGxhbixcbiAgdGlsZVVudGlsZWQsXG4gIHRvU3RvcmVkUGxhbixcbiAgdHlwZSBSZXNvbHZlZFRpbGluZ1BsYW4sXG4gIHR5cGUgU3RvcmVkVGlsaW5nUGxhbixcbn0gZnJvbSBcIi4vdGlsaW5nLXBsYW5cIjtcblxuLy8gVGhlIHRpbGluZyB0aGUgdXNlciBhcnJhbmdlZCwgb3IgbnVsbCBmb3Igbm9uZSwgd2hpY2ggdGlsZXMgYXMgaXQgYWx3YXlzIGRpZC5cbmV4cG9ydCBjb25zdCBzdG9yZWRUaWxpbmdQbGFuQnVuY2ggPVxuICBnZXRQZXJzaXN0YWJsZVZhbHVlSW5qZWN0YWJsZUJ1bmNoPFN0b3JlZFRpbGluZ1BsYW4gfCBudWxsPigpKHtcbiAgICAvLyBPZiBpdHMgc2Vjb25kIHZlcnNpb24sIGFzIHRoZSBsYXlvdXRzIGFyZTogdGhlIHBsYW4ga2VwdCBiZWZvcmUgaXMgbGVmdCBiZWhpbmQuXG4gICAgaWQ6IFwidGlsaW5nLXBsYW4tMlwiLFxuICAgIGRlZmF1bHRWYWx1ZTogeyBpbnN0YW50aWF0ZTogKCkgPT4gYXN5bmMgKCkgPT4gbnVsbCB9LFxuICB9KTtcblxuLy8gVGhlIHRpbGluZyBwbGFuIGZvciB0aGUgd2luZG93cyBvcGVuIGFuZCB0aGUgc2NyZWVucyBjb25uZWN0ZWQsIGtlcHQgY3VycmVudCBhcyB0aGV5IGNoYW5nZSwgYW5kXG4vLyBrZWVwaW5nIHRoZSBlZGl0cyB0aGUgdGlsaW5nIGVkaXRvciBtYWtlcyB0byBpdC5cbmV4cG9ydCBjb25zdCB0aWxpbmdQbGFuSW5qZWN0YWJsZSA9IGdldEluamVjdGFibGUyKHtcbiAgaWQ6IFwid2luZG93LW1hbmFnZXIudGlsaW5nLXBsYW5cIixcbiAgY29uc3VtcHRpb25zOiBbXG4gICAgd2luZG93UmVjb3Jkc1JlYWN0aXZlSW5qZWN0aW9uVG9rZW4sXG4gICAgZGlzcGxheVJlY29yZHNSZWFjdGl2ZUluamVjdGlvblRva2VuLFxuICBdLFxuXG4gIGluc3RhbnRpYXRlOiAoZGkpID0+IHtcbiAgICBjb25zdCB3aW5kb3dzID0gZGkuaW5qZWN0KHdpbmRvd1JlY29yZHNSZWFjdGl2ZUluamVjdGlvblRva2VuKSgpO1xuICAgIGNvbnN0IGRpc3BsYXlzID0gZGkuaW5qZWN0KGRpc3BsYXlSZWNvcmRzUmVhY3RpdmVJbmplY3Rpb25Ub2tlbikoKTtcbiAgICBjb25zdCBnZXRTdG9yZWQgPSBkaS5pbmplY3Qoc3RvcmVkVGlsaW5nUGxhbkJ1bmNoLnBlcnNpc3RhYmxlKTtcbiAgICBjb25zdCBzdG9yZWQgPSBvYnNlcnZhYmxlLmJveDxcbiAgICAgIElPYnNlcnZhYmxlVmFsdWU8U3RvcmVkVGlsaW5nUGxhbiB8IG51bGw+IHwgdW5kZWZpbmVkXG4gICAgPih1bmRlZmluZWQsIHsgZGVlcDogZmFsc2UgfSk7XG5cbiAgICB2b2lkIGdldFN0b3JlZCgpLnRoZW4oKHBsYW4pID0+IHtcbiAgICAgIC8vIEEgd2luZG93IGJlaW5nIG9wZW5lZCBpbiBhIGNlbGwgd2hlbiB0aGUgZXh0ZW5zaW9uIHdhcyBsYXN0IGxvYWRlZCBpcyBubyBsb25nZXIgYXdhaXRlZDpcbiAgICAgIC8vIGl0cyB0aWxlLCB3aGljaCB3b3VsZCBzdGF5IG5vdCBvcGVuIHdpdGggbm8gd2F5IHRvIG9wZW4gaXQsIGdvZXMuXG4gICAgICBjb25zdCBrZXB0ID0gcGxhbi5nZXQoKTtcblxuICAgICAgaWYgKGtlcHQ/LndpbmRvd3Muc29tZSgoaXQpID0+IGl0LmtleS5zdGFydHNXaXRoKG9wZW5pbmdQcmVmaXgpKSkge1xuICAgICAgICBydW5JbkFjdGlvbigoKSA9PlxuICAgICAgICAgIHBsYW4uc2V0KHtcbiAgICAgICAgICAgIC4uLmtlcHQsXG4gICAgICAgICAgICB3aW5kb3dzOiBrZXB0LndpbmRvd3MuZmlsdGVyKFxuICAgICAgICAgICAgICAoaXQpID0+ICFpdC5rZXkuc3RhcnRzV2l0aChvcGVuaW5nUHJlZml4KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHN0b3JlZC5zZXQocGxhbikpO1xuICAgIH0pO1xuXG4gICAgLy8gV2luZG93cyBnb2luZyBieSBhbm90aGVyIHdpbmRvdydzIGtleSBpbiB0aGUgcGxhbiwgYnkgdGhlaXIgb3duIGtleSwgYXMgd29ya2VkIG91dCBlbHNld2hlcmU6XG4gICAgLy8gb25lIGJlaW5nIG9wZW5lZCBhZ2FpbiBnb2VzIGJ5IHRoZSBrZXkgb2YgdGhlIHdpbmRvdyBub3Qgb3BlbiBpdCBpcy5cbiAgICBjb25zdCBhbGlhc2VzT2YgPSBvYnNlcnZhYmxlLmJveDxcbiAgICAgIElDb21wdXRlZFZhbHVlPFJlYWRvbmx5TWFwPHN0cmluZywgc3RyaW5nPj4gfCB1bmRlZmluZWRcbiAgICA+KHVuZGVmaW5lZCwge1xuICAgICAgZGVlcDogZmFsc2UsXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXNvbHZlZCA9IGNvbXB1dGVkKCgpID0+XG4gICAgICByZXNvbHZlVGlsaW5nUGxhbihcbiAgICAgICAgd2luZG93cy5nZXQoKSxcbiAgICAgICAgZGlzcGxheXMuZ2V0KCksXG4gICAgICAgIHN0b3JlZC5nZXQoKT8uZ2V0KCkgPz8gdW5kZWZpbmVkLFxuICAgICAgICB7XG4gICAgICAgICAgYWxpYXNlczogYWxpYXNlc09mLmdldCgpPy5nZXQoKSxcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIGNvbnN0IGtlZXAgPSAocGxhbjogU3RvcmVkVGlsaW5nUGxhbikgPT4ge1xuICAgICAgY29uc3Qga2VwdCA9IHN0b3JlZC5nZXQoKTtcblxuICAgICAgaWYgKGtlcHQpIHtcbiAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ga2VwdC5zZXQocGxhbikpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gKCkgPT4gKHtcbiAgICAgIHJlc29sdmVkLFxuICAgICAgLy8gS2VlcHMgYSBwbGFuIG1hZGUgZnJvbSB0aGUgcmVzb2x2ZWQgb25lIGJ5IGFuIGVkaXQsIGFzIHRoZSBlZGl0b3IncyBwcmV2aWV3IG9mIGEgZHJhZy5cbiAgICAgIGNvbW1pdDogKHBsYW46IFJlc29sdmVkVGlsaW5nUGxhbikgPT4ge1xuICAgICAgICBjb25zdCBrZXB0ID0gc3RvcmVkLmdldCgpO1xuXG4gICAgICAgIGlmIChrZXB0KSB7XG4gICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT5cbiAgICAgICAgICAgIGtlcHQuc2V0KHRvU3RvcmVkUGxhbihwbGFuLCBrZXB0LmdldCgpID8/IHVuZGVmaW5lZCkpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBQbGFjZXMgdGhlIHdpbmRvd3Mgbm90IHRpbGVkLCB0aG9zZSBvcGVuLCBvbiB0aGUgc2NyZWVucywgaW4gdGhlIGZpcnN0IGZyZWUgY2VsbHM7IHRoZVxuICAgICAgLy8gd2luZG93cyB0aWxlZCBzdGF5IHdoZXJlIHRoZXkgYXJlLlxuICAgICAgYXV0b1RpbGU6ICgpID0+XG4gICAgICAgIGtlZXAoXG4gICAgICAgICAgdG9TdG9yZWRQbGFuKFxuICAgICAgICAgICAgdGlsZVVudGlsZWQocmVzb2x2ZWQuZ2V0KCkpLFxuICAgICAgICAgICAgc3RvcmVkLmdldCgpPy5nZXQoKSA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgIC8vIExlYXZlcyBldmVyeSB3aW5kb3cgYXMgaXQgaXMsIGFzIGEgbmV3IGxheW91dCBzdGFydHMgb3V0LlxuICAgICAgbGVhdmVBbGxBc1RoZXlBcmU6ICgpID0+IGtlZXAoYWxsTGVmdEFzVGhleUFyZSh3aW5kb3dzLmdldCgpKSksXG4gICAgICAvLyBIYXMgd2luZG93cyBnbyBieSBvdGhlciB3aW5kb3dzJyBrZXlzIGluIHRoZSBwbGFuLCBhcyB0aGUgYWxpYXNlcyBnaXZlbiBoYXZlIHRoZW0uXG4gICAgICBmb2xsb3dBbGlhc2VzOiAoYWxpYXNlczogSUNvbXB1dGVkVmFsdWU8UmVhZG9ubHlNYXA8c3RyaW5nLCBzdHJpbmc+PikgPT5cbiAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4gYWxpYXNlc09mLnNldChhbGlhc2VzKSksXG4gICAgICAvLyBIYXMgdGhlIHBsYW4ncyB3aW5kb3cgZ28gYnkgdGhlIGtleSBvZiB0aGUgd2luZG93IGdpdmVuLCBhbmQga2VlcCBpdHMgaWQsIGFzIGEgd2luZG93IG5vdFxuICAgICAgLy8gb3BlbiBkb2VzIG9uY2Ugb3BlbmVkIGFnYWluLCBhcyB0aGUgd2luZG93IExlbnMgYW5zd2VyZWQgd2l0aDsgYSB3aW5kb3cgdW5kZXIgdGhhdCBrZXlcbiAgICAgIC8vIGFscmVhZHkgZ2l2ZXMgaXRzIHBsYWNlIHVwLlxuICAgICAgcmVrZXk6IChmcm9tOiBzdHJpbmcsIHdpbmRvdzogV2luZG93SWQpID0+IHtcbiAgICAgICAgY29uc3QgcGxhbiA9IHN0b3JlZC5nZXQoKT8uZ2V0KCk7XG4gICAgICAgIGNvbnN0IHRvID0ga2V5T2ZXaW5kb3cod2luZG93KTtcblxuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIG9uY2UgdGhlIHBsYW4gaGFzIHRoZSB3aW5kb3cgYnkgaXRzIG93biBrZXkgYWxyZWFkeSwgYXMgYWZ0ZXIgYSByZWNhbGwuXG4gICAgICAgIGlmIChwbGFuICYmIGZyb20gIT09IHRvICYmIHBsYW4ud2luZG93cy5zb21lKChpdCkgPT4gaXQua2V5ID09PSBmcm9tKSkge1xuICAgICAgICAgIGtlZXAoe1xuICAgICAgICAgICAgLi4ucGxhbixcbiAgICAgICAgICAgIHdpbmRvd3M6IHBsYW4ud2luZG93c1xuICAgICAgICAgICAgICAuZmlsdGVyKChpdCkgPT4gaXQua2V5ICE9PSB0bylcbiAgICAgICAgICAgICAgLm1hcCgoaXQpID0+IChpdC5rZXkgPT09IGZyb20gPyB7IC4uLml0LCBrZXk6IHRvLCB3aW5kb3cgfSA6IGl0KSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBQdXRzIGEgd2luZG93IGJlaW5nIG9wZW5lZCwgbm90IHNob3duIHlldCwgaW4gdGhlIGNlbGwsIGJ5IGEga2V5IG9mIGl0cyBvd24gdW50aWwgaXQgc2hvd3MsXG4gICAgICAvLyBhcyBhIHdpbmRvdyBub3Qgb3BlbiBpczogaXRzIHRpbGUgaXMgdGhlcmUgZnJvbSB0aGUgc3RhcnQuXG4gICAgICBwbGFjZU9wZW5pbmc6IChcbiAgICAgICAga2V5OiBzdHJpbmcsXG4gICAgICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgICAgIGNlbGw6IHsgZGlzcGxheUlkOiBudW1iZXI7IGNvbHVtbjogbnVtYmVyOyByb3c6IG51bWJlciB9LFxuICAgICAgKSA9PiB7XG4gICAgICAgIGNvbnN0IHBsYW4gPVxuICAgICAgICAgIHN0b3JlZC5nZXQoKT8uZ2V0KCkgPz8gdG9TdG9yZWRQbGFuKHJlc29sdmVkLmdldCgpLCB1bmRlZmluZWQpO1xuXG4gICAgICAgIGtlZXAoe1xuICAgICAgICAgIC4uLnBsYW4sXG4gICAgICAgICAgd2luZG93czogW1xuICAgICAgICAgICAgLi4ucGxhbi53aW5kb3dzLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgICBkaXNwbGF5SWQ6IGNlbGwuZGlzcGxheUlkLFxuICAgICAgICAgICAgICBjb2x1bW46IGNlbGwuY29sdW1uLFxuICAgICAgICAgICAgICByb3c6IGNlbGwucm93LFxuICAgICAgICAgICAgICBjb2x1bW5zOiAxLFxuICAgICAgICAgICAgICByb3dzOiAxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICAvLyBUYWtlcyB0aGUgd2luZG93IG91dCBvZiB0aGUgcGxhbiBhbHRvZ2V0aGVyLCBhcyB3aGVuIGl0IGlzIGNsb3NlZCBmb3IgZ29vZC5cbiAgICAgIGZvcmdldDogKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHBsYW4gPSBzdG9yZWQuZ2V0KCk/LmdldCgpO1xuXG4gICAgICAgIGlmIChwbGFuKSB7XG4gICAgICAgICAga2VlcCh7XG4gICAgICAgICAgICAuLi5wbGFuLFxuICAgICAgICAgICAgd2luZG93czogcGxhbi53aW5kb3dzLmZpbHRlcigoaXQpID0+IGl0LmtleSAhPT0ga2V5KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfSxcbn0pO1xuIiwgImltcG9ydCB7IGdldFBlcnNpc3RhYmxlTWFwSW5qZWN0YWJsZUJ1bmNoIH0gZnJvbSBcIkBrOHNsZW5zL3BlcnNpc3RhYmxlLWNvbnRyYWN0c1wiO1xuXG4vLyBXaGljaCB3aW5kb3cgb2YgYSBsYXlvdXQgZWFjaCB3aW5kb3cgaXMsIGJ5IGxheW91dCBhbmQgdGhlIHdpbmRvdydzIG93biBrZXksIHRvIHRoZSBrZXkgdGhlXG4vLyBsYXlvdXQgc2F2ZWQgdGhlIHdpbmRvdyB1bmRlcjogYXMgbGFzdCBmb3VuZCwgb3IgYXMgdGhlIHdpbmRvdyB3YXMgb3BlbmVkIGFnYWluIGFzLiBBIHdpbmRvd1xuLy8gb3BlbmVkIGFnYWluIGdvZXMgYnkgYW5vdGhlciBpZCB0aGFuIHRoZSBvbmUgaXQgd2FzIHNhdmVkIGJ5LCBhbmQgd2hhdCBMZW5zIGRlc2NyaWJlcyBvZiBpdCBjYW5cbi8vIGNoYW5nZSwgYXMgaXRzIHRpdGxlLCBzbyB0aGlzIGlzIHdoYXQgdGVsbHMgaXQgaXMgdGhhdCB3aW5kb3cgc3RpbGwsIGhvd2V2ZXIgbWFueSB0aW1lcyBpdCB3YXNcbi8vIG9wZW5lZCBhZ2FpbiwgYW5kIG9uY2UgaXQgaXMgY2xvc2VkIHdoaWNoIHdpbmRvdyBvZiB0aGUgbGF5b3V0IGl0cyB0aWxlIGlzLlxuZXhwb3J0IGNvbnN0IHdpbmRvd0xpbmVhZ2VCdW5jaCA9IGdldFBlcnNpc3RhYmxlTWFwSW5qZWN0YWJsZUJ1bmNoPFxuICBzdHJpbmcsXG4gIHN0cmluZ1xuPigpKHtcbiAgLy8gT2YgaXRzIHNlY29uZCB2ZXJzaW9uLCBrZXB0IGJ5IGxheW91dDogdGhlIG9uZSBrZXB0IGZvciBhbGwgbGF5b3V0cyBhdCBvbmNlIGlzIGxlZnQgYmVoaW5kLlxuICBpZDogXCJ3aW5kb3ctbGluZWFnZS0yXCIsXG59KTtcblxuLy8gVGhlIGtleSBhIHdpbmRvdydzIGxpbmVhZ2UgaW4gYSBsYXlvdXQgaXMga2VwdCB1bmRlci5cbmV4cG9ydCBjb25zdCBsaW5lYWdlS2V5ID0gKGxheW91dDogc3RyaW5nLCB3aW5kb3c6IHN0cmluZykgPT5cbiAgSlNPTi5zdHJpbmdpZnkoW2xheW91dCwgd2luZG93XSk7XG5cbi8vIFRoZSB3aW5kb3cgZWFjaCB3aW5kb3cgb3BlbmVkIGFnYWluIGNvbnRpbnVlcywgYnkga2V5LCB3aGljaGV2ZXIgbGF5b3V0IG9wZW5lZCBpdCBhZ2FpbjogYSBjaGFpblxuLy8gYmFjayB0byB0aGUgd2luZG93IGZpcnN0IG9wZW5lZCwgYnkgd2hpY2ggYW55IGxheW91dCB0aGF0IHNhdmVkIG9uZSBvZiB0aGVtIGZpbmRzIGl0LlxuZXhwb3J0IGNvbnN0IHdpbmRvd0NvbnRpbnVlc0J1bmNoID0gZ2V0UGVyc2lzdGFibGVNYXBJbmplY3RhYmxlQnVuY2g8XG4gIHN0cmluZyxcbiAgc3RyaW5nXG4+KCkoe1xuICBpZDogXCJ3aW5kb3ctY29udGludWVzXCIsXG59KTtcblxuLy8gVGhlIHdpbmRvd3MgdGhlIHdpbmRvdyBjb250aW51ZXMsIG5lYXJlc3QgZmlyc3QsIGJhY2sgdG8gdGhlIG9uZSBmaXJzdCBvcGVuZWQuXG5leHBvcnQgY29uc3QgcHJlZGVjZXNzb3JzT2YgPSAoXG4gIGtleTogc3RyaW5nLFxuICBjb250aW51ZXM6IFJlYWRvbmx5TWFwPHN0cmluZywgc3RyaW5nPixcbik6IHJlYWRvbmx5IHN0cmluZ1tdID0+IHtcbiAgY29uc3QgcHJlZGVjZXNzb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoXG4gICAgbGV0IGF0ID0gY29udGludWVzLmdldChrZXkpO1xuICAgIGF0ICE9PSB1bmRlZmluZWQgJiYgIXByZWRlY2Vzc29ycy5pbmNsdWRlcyhhdCkgJiYgYXQgIT09IGtleTtcbiAgICBhdCA9IGNvbnRpbnVlcy5nZXQoYXQpXG4gICkge1xuICAgIHByZWRlY2Vzc29ycy5wdXNoKGF0KTtcbiAgfVxuXG4gIHJldHVybiBwcmVkZWNlc3NvcnM7XG59O1xuXG4vLyBUaGUgd2luZG93cyBhIHdpbmRvdyBjb250aW51ZXMsIG5lYXJlc3QgZmlyc3QsIGFuZCB0aGVuIHRoZSB3aW5kb3dzIGFueSBsYXlvdXQgZm91bmQgaXQgb3Igb3BlbmVkXG4vLyBpdCBhZ2FpbiBhcywgd2hpY2ggdGVsbCB0aGUgc2FtZSBvZiBhIHdpbmRvdyBvcGVuZWQgYWdhaW4gYmVmb3JlIHRoZSBjaGFpbiB3YXMga2VwdC5cbmV4cG9ydCBjb25zdCBjb250aW51ZWRXaW5kb3dzT2YgPSAoXG4gIGtleTogc3RyaW5nLFxuICBjb250aW51ZXM6IFJlYWRvbmx5TWFwPHN0cmluZywgc3RyaW5nPixcbiAgbGluZWFnZTogUmVhZG9ubHlNYXA8c3RyaW5nLCBzdHJpbmc+LFxuKTogcmVhZG9ubHkgc3RyaW5nW10gPT4ge1xuICBjb25zdCBhc0ZvdW5kID0gWy4uLmxpbmVhZ2VdXG4gICAgLmZpbHRlcigoW2F0XSkgPT4gKEpTT04ucGFyc2UoYXQpIGFzIFtzdHJpbmcsIHN0cmluZ10pWzFdID09PSBrZXkpXG4gICAgLm1hcCgoWywgc2F2ZWRdKSA9PiBzYXZlZCk7XG5cbiAgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5wcmVkZWNlc3NvcnNPZihrZXksIGNvbnRpbnVlcyksIC4uLmFzRm91bmRdKV07XG59O1xuIiwgImltcG9ydCB7IHR5cGUgUGxhY2UgfSBmcm9tIFwiQGs4c2xlbnMvbmF2aWdhdGlvbi1jb250cmFjdHNcIjtcbmltcG9ydCB7IGdldFBsYWNlU3ViV2luZG93S2luZEluamVjdGFibGVCdW5jaCB9IGZyb20gXCJAazhzbGVucy9wbGFjZS1zdWItd2luZG93LWNvbnRyYWN0c1wiO1xuaW1wb3J0IHsgZ2V0U3ViV2luZG93S2luZCB9IGZyb20gXCJAazhzbGVucy9zdWItd2luZG93LWNvbnRyYWN0c1wiO1xuXG4vLyBXaW5kb3dzIG9mIHRoZWlyIG93biBzaG93aW5nIGEgcGxhY2Ugb2YgTGVucywgYXMgYSBjbHVzdGVyJ3MgbGlzdCBvZiBwb2RzLCBvcGVuZWQgaW50byBhIGNlbGwgb2Zcbi8vIHRoZSB0aWxpbmcuXG5leHBvcnQgY29uc3QgcGxhY2VzU3ViV2luZG93S2luZCA9IGdldFN1YldpbmRvd0tpbmQ8UGxhY2U+KCkoXCJwbGFjZXNcIik7XG5cbmV4cG9ydCBjb25zdCBwbGFjZXNTdWJXaW5kb3dLaW5kQnVuY2ggPSBnZXRQbGFjZVN1YldpbmRvd0tpbmRJbmplY3RhYmxlQnVuY2goe1xuICBraW5kOiBwbGFjZXNTdWJXaW5kb3dLaW5kLFxufSk7XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0YWJsZTIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgcnVuSW5BY3Rpb24gfSBmcm9tIFwibW9ieFwiO1xuaW1wb3J0IHR5cGUgeyBXaW5kb3dJZCB9IGZyb20gXCJAazhzbGVucy9tZXNzYWdpbmctY29udHJhY3RzXCI7XG5pbXBvcnQge1xuICBjYW5SZW9wZW5XaW5kb3dJbmplY3Rpb25Ub2tlbixcbiAgZGlzcGxheVJlY29yZHNJbmplY3Rpb25Ub2tlbixcbiAgZm9jdXNXaW5kb3dJbmplY3Rpb25Ub2tlbixcbiAgcmVvcGVuV2luZG93SW5qZWN0aW9uVG9rZW4sXG4gIHNldFdpbmRvd0JvdW5kc0luamVjdGlvblRva2VuLFxuICBzZXRXaW5kb3dTdGF0ZUluamVjdGlvblRva2VuLFxuICB3aW5kb3dSZWNvcmRzSW5qZWN0aW9uVG9rZW4sXG4gIHR5cGUgV2luZG93Qm91bmRzLFxuICB0eXBlIFdpbmRvd1JlY29yZCxcbn0gZnJvbSBcIkBrOHNsZW5zL3dpbmRvdy1sYXlvdXQtY29udHJhY3RzXCI7XG5pbXBvcnQge1xuICBpc1NhbWVMaW5lYWdlLFxuICBpc1NhbWVSZW9wZW5pbmcsXG4gIGlzU2FtZVdpbmRvdyxcbiAgbWF0Y2hXaW5kb3dzLFxuICB0b1RpbGluZ1BsYW4sXG59IGZyb20gXCIuL2xheW91dC10aWxpbmdcIjtcbmltcG9ydCB7XG4gIGNvbnRpbnVlZFdpbmRvd3NPZixcbiAgbGluZWFnZUtleSxcbiAgd2luZG93Q29udGludWVzQnVuY2gsXG4gIHdpbmRvd0xpbmVhZ2VCdW5jaCxcbn0gZnJvbSBcIi4vd2luZG93LWxpbmVhZ2UuaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHtcbiAgc2F2ZWRXaW5kb3dMYXlvdXRzQnVuY2gsXG4gIHR5cGUgU2F2ZWRXaW5kb3csXG59IGZyb20gXCIuL3NhdmVkLXdpbmRvdy1sYXlvdXRzLmluamVjdGFibGVcIjtcbmltcG9ydCB7IGJvdW5kc0luR3JpZCwga2V5T2ZXaW5kb3csIHJlc29sdmVUaWxpbmdQbGFuIH0gZnJvbSBcIi4vdGlsaW5nLXBsYW5cIjtcbmltcG9ydCB7IGZpdEludG8sIGlzUmVhY2hhYmxlT25Tb21lU2NyZWVuLCBpc1NhbWVTY3JlZW5zIH0gZnJvbSBcIi4vc2NyZWVuc1wiO1xuaW1wb3J0IHsgc3RvcmVkVGlsaW5nUGxhbkJ1bmNoIH0gZnJvbSBcIi4vdGlsaW5nLXBsYW4uaW5qZWN0YWJsZVwiO1xuXG4vLyBUb2xkIGFzIGVhY2ggd2luZG93IGNsb3NlZCBzaW5jZSBpcyBvcGVuZWQgYWdhaW4sIG9uZSBhZnRlciB0aGUgb3RoZXI6IGJlZm9yZSwgYW5kIHdpdGggdGhlXG4vLyB3aW5kb3cgTGVucyBhbnN3ZXJlZCB3aXRoLCBvciBub25lIHdoZW4gaXQgY291bGQgbm90IG9wZW4gaXQuXG5leHBvcnQgaW50ZXJmYWNlIFJlY2FsbFByb2dyZXNzIHtcbiAgcmVhZG9ubHkgcmVvcGVuaW5nPzogKHNhdmVkOiBTYXZlZFdpbmRvdywgaW5kZXg6IG51bWJlcikgPT4gdm9pZDtcbiAgcmVhZG9ubHkgcmVvcGVuZWQ/OiAoXG4gICAgc2F2ZWQ6IFNhdmVkV2luZG93LFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgd2luZG93OiBXaW5kb3dJZCB8IHVuZGVmaW5lZCxcbiAgKSA9PiB2b2lkO1xuICAvLyBUb2xkIGluIHRoZSBvbmUgc3RlcCB0aGF0IG1ha2VzIHRoZSBsYXlvdXQncyB0aWxpbmcgdGhlIGN1cnJlbnQgb25lLCBldmVyeSB3aW5kb3cgaW4gaXQgYnlcbiAgLy8gaXRzIG93biBrZXkuXG4gIHJlYWRvbmx5IHBsYWNlZD86ICgpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjYWxsUmVzdWx0IHtcbiAgcmVhZG9ubHkgcGxhY2VkOiBudW1iZXI7XG4gIC8vIFRoZSB3aW5kb3dzIGNsb3NlZCBzaW5jZSB0aGUgbGF5b3V0IHdhcyBzYXZlZCwgb3BlbmVkIGFnYWluLlxuICByZWFkb25seSByZW9wZW5lZDogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8vIFRoZSB3aW5kb3dzIGNsb3NlZCBzaW5jZSB0aGF0IGNvdWxkIG5vdCBiZSBvcGVuZWQgYWdhaW4sIGFzIHdoZW4gdGhlIGV4dGVuc2lvbiB0aGF0IG9wZW5lZFxuICAvLyB0aGVtIGlzIGdvbmUsIG9yIHRoZSBsYXlvdXQgd2FzIHNhdmVkIGJlZm9yZSB3aW5kb3dzIHdlcmUga2VwdC5cbiAgcmVhZG9ubHkgbm90T3BlbjogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8vIFRoZSB3aW5kb3dzIHdob3NlIHNhdmVkIHBsYWNlIGlzIG9uIG5vIHNjcmVlbiBjb25uZWN0ZWQgbm93LCBtb3ZlZCBvbnRvIHRoZSBwcmltYXJ5IHNjcmVlbi5cbiAgcmVhZG9ubHkgbW92ZWRUb1ByaW1hcnk6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvLyBXaGV0aGVyIHRoZSBzY3JlZW5zIGFyZSBub3QgdGhvc2UgdGhlIGxheW91dCB3YXMgc2F2ZWQgb247IHVua25vd24gZm9yIGFuIG9sZGVyIGxheW91dC5cbiAgcmVhZG9ubHkgc2NyZWVuc0NoYW5nZWQ6IGJvb2xlYW47XG59XG5cbi8vIFB1dHMgZXZlcnkgd2luZG93IG9mIHRoZSBsYXlvdXQgYmFjayB3aGVyZSBpdCB3YXMgYW5kIGhvdyBpdCBzaG93ZWQuIEEgd2luZG93IG9wZW4gc3RpbGwsIG9yXG4vLyBvcGVuIGFnYWluIGRvaW5nIHRoZSBzYW1lLCBpcyBtb3ZlZDsgYSB3aW5kb3cgY2xvc2VkIHNpbmNlIGlzIG9wZW5lZCBhZ2Fpbjsgb25lIHRoYXQgY2Fubm90IGJlXG4vLyBzdGF5cyBjbG9zZWQsIHNob3duIGFzIG1pc3NpbmcgaW4gdGhlIHRpbGluZy4gQW5vdGhlciB3aW5kb3cgaXMgbmV2ZXIgbW92ZWQgaW4gaXRzIHBsYWNlLCBhcyBtb3N0XG4vLyB3aW5kb3dzIGFyZSBvZiBvbmUga2luZCwgYSB0YWIgaW4gYSB3aW5kb3cgb2YgaXRzIG93biwgd2hhdGV2ZXIgdGhleSBzaG93LiBBIHdpbmRvdyB3aG9zZSBwbGFjZVxuLy8gaXMgb24gbm8gc2NyZWVuIGNvbm5lY3RlZCBub3csIGFzIHdoZW4gYSBzY3JlZW4gd2FzIHVucGx1Z2dlZCBzaW5jZSwgZ29lcyBvbnRvIHRoZSBwcmltYXJ5IHNjcmVlblxuLy8gaW5zdGVhZC4gVGhlIGxheW91dCdzIHRpbGluZyBzZXR1cCBiZWNvbWVzIHRoZSBjdXJyZW50IG9uZS5cbmV4cG9ydCBjb25zdCByZWNhbGxXaW5kb3dMYXlvdXRJbmplY3RhYmxlID0gZ2V0SW5qZWN0YWJsZTIoe1xuICBpZDogXCJ3aW5kb3ctbWFuYWdlci5yZWNhbGwtd2luZG93LWxheW91dFwiLFxuICBjb25zdW1wdGlvbnM6IFtcbiAgICB3aW5kb3dSZWNvcmRzSW5qZWN0aW9uVG9rZW4sXG4gICAgZGlzcGxheVJlY29yZHNJbmplY3Rpb25Ub2tlbixcbiAgICBzZXRXaW5kb3dCb3VuZHNJbmplY3Rpb25Ub2tlbixcbiAgICBzZXRXaW5kb3dTdGF0ZUluamVjdGlvblRva2VuLFxuICAgIGZvY3VzV2luZG93SW5qZWN0aW9uVG9rZW4sXG4gICAgY2FuUmVvcGVuV2luZG93SW5qZWN0aW9uVG9rZW4sXG4gICAgcmVvcGVuV2luZG93SW5qZWN0aW9uVG9rZW4sXG4gIF0sXG5cbiAgaW5zdGFudGlhdGU6IChkaSkgPT4ge1xuICAgIGNvbnN0IGdldFdpbmRvd1JlY29yZHMgPSBkaS5pbmplY3Qod2luZG93UmVjb3Jkc0luamVjdGlvblRva2VuKSgpO1xuICAgIGNvbnN0IGdldERpc3BsYXlSZWNvcmRzID0gZGkuaW5qZWN0KGRpc3BsYXlSZWNvcmRzSW5qZWN0aW9uVG9rZW4pKCk7XG4gICAgY29uc3Qgc2V0V2luZG93Qm91bmRzID0gZGkuaW5qZWN0KHNldFdpbmRvd0JvdW5kc0luamVjdGlvblRva2VuKSgpO1xuICAgIGNvbnN0IHNldFdpbmRvd1N0YXRlID0gZGkuaW5qZWN0KHNldFdpbmRvd1N0YXRlSW5qZWN0aW9uVG9rZW4pKCk7XG4gICAgY29uc3QgZm9jdXNXaW5kb3cgPSBkaS5pbmplY3QoZm9jdXNXaW5kb3dJbmplY3Rpb25Ub2tlbikoKTtcbiAgICBjb25zdCBjYW5SZW9wZW5XaW5kb3cgPSBkaS5pbmplY3QoY2FuUmVvcGVuV2luZG93SW5qZWN0aW9uVG9rZW4pKCk7XG4gICAgY29uc3QgcmVvcGVuV2luZG93ID0gZGkuaW5qZWN0KHJlb3BlbldpbmRvd0luamVjdGlvblRva2VuKSgpO1xuICAgIGNvbnN0IGdldFNhdmVkTGF5b3V0cyA9IGRpLmluamVjdChzYXZlZFdpbmRvd0xheW91dHNCdW5jaC5wZXJzaXN0YWJsZSk7XG4gICAgY29uc3QgZ2V0V2luZG93TGluZWFnZSA9IGRpLmluamVjdCh3aW5kb3dMaW5lYWdlQnVuY2gucGVyc2lzdGFibGUpO1xuICAgIGNvbnN0IGdldFdpbmRvd0NvbnRpbnVlcyA9IGRpLmluamVjdCh3aW5kb3dDb250aW51ZXNCdW5jaC5wZXJzaXN0YWJsZSk7XG4gICAgY29uc3QgZ2V0U3RvcmVkVGlsaW5nUGxhbiA9IGRpLmluamVjdChzdG9yZWRUaWxpbmdQbGFuQnVuY2gucGVyc2lzdGFibGUpO1xuXG4gICAgcmV0dXJuICgpID0+XG4gICAgICBhc3luYyAoXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgcHJvZ3Jlc3M6IFJlY2FsbFByb2dyZXNzID0ge30sXG4gICAgICApOiBQcm9taXNlPFJlY2FsbFJlc3VsdCB8IHVuZGVmaW5lZD4gPT4ge1xuICAgICAgICBjb25zdCBsYXlvdXQgPSAoYXdhaXQgZ2V0U2F2ZWRMYXlvdXRzKCkpLmdldChuYW1lKTtcblxuICAgICAgICBpZiAoIWxheW91dCkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaW5lYWdlID0gYXdhaXQgZ2V0V2luZG93TGluZWFnZSgpO1xuICAgICAgICBjb25zdCBjb250aW51ZXMgPSBhd2FpdCBnZXRXaW5kb3dDb250aW51ZXMoKTtcblxuICAgICAgICBjb25zdCBvcGVuID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgKGF3YWl0IGdldFdpbmRvd1JlY29yZHMoKSkubWFwKGFzeW5jIChyZWNvcmQpID0+ICh7XG4gICAgICAgICAgICByZWNvcmQsXG4gICAgICAgICAgICByZW9wZW5pbmc6IGF3YWl0IHJlY29yZC5kZXNjcmliZVJlb3BlbmluZygpLFxuICAgICAgICAgICAgc3RhbmRzRm9yOiBsaW5lYWdlLmdldChcbiAgICAgICAgICAgICAgbGluZWFnZUtleShuYW1lLCBrZXlPZldpbmRvdyhyZWNvcmQud2luZG93KSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgY29udGludWVzOiBjb250aW51ZWRXaW5kb3dzT2YoXG4gICAgICAgICAgICAgIGtleU9mV2luZG93KHJlY29yZC53aW5kb3cpLFxuICAgICAgICAgICAgICBjb250aW51ZXMsXG4gICAgICAgICAgICAgIGxpbmVhZ2UsXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBjb25uZWN0ZWQgPSBhd2FpdCBnZXREaXNwbGF5UmVjb3JkcygpO1xuICAgICAgICBjb25zdCB3b3JrQXJlYXMgPSBjb25uZWN0ZWQubWFwKChkaXNwbGF5KSA9PiBkaXNwbGF5LndvcmtBcmVhLmdldCgpKTtcbiAgICAgICAgY29uc3QgcHJpbWFyeVdvcmtBcmVhID0gKFxuICAgICAgICAgIGNvbm5lY3RlZC5maW5kKChkaXNwbGF5KSA9PiBkaXNwbGF5LmlzUHJpbWFyeS5nZXQoKSkgPz8gY29ubmVjdGVkWzBdXG4gICAgICAgICk/LndvcmtBcmVhLmdldCgpO1xuICAgICAgICBjb25zdCBtb3ZlZFRvUHJpbWFyeTogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBjb25zdCBib3VuZHNGb3IgPSAoc2F2ZWQ6IFNhdmVkV2luZG93KTogV2luZG93Qm91bmRzID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhcHJpbWFyeVdvcmtBcmVhIHx8XG4gICAgICAgICAgICBpc1JlYWNoYWJsZU9uU29tZVNjcmVlbihzYXZlZC5ub3JtYWxCb3VuZHMsIHdvcmtBcmVhcylcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBzYXZlZC5ub3JtYWxCb3VuZHM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbW92ZWRUb1ByaW1hcnkucHVzaChzYXZlZC50aXRsZSk7XG5cbiAgICAgICAgICByZXR1cm4gZml0SW50byhcbiAgICAgICAgICAgIHByaW1hcnlXb3JrQXJlYSxcbiAgICAgICAgICAgIHNhdmVkLm5vcm1hbEJvdW5kcyxcbiAgICAgICAgICAgIG1vdmVkVG9QcmltYXJ5Lmxlbmd0aCAtIDEsXG4gICAgICAgICAgKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBtYXRjaGVzID0gbmV3IE1hcDxTYXZlZFdpbmRvdywgV2luZG93UmVjb3JkPigpO1xuXG4gICAgICAgIG1hdGNoV2luZG93cyhsYXlvdXQud2luZG93cywgb3BlbiwgbWF0Y2hlcywgW1xuICAgICAgICAgIGlzU2FtZVdpbmRvdyxcbiAgICAgICAgICBpc1NhbWVMaW5lYWdlLFxuICAgICAgICAgIGlzU2FtZVJlb3BlbmluZyxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgLy8gT3BlbmVkIGFnYWluIGJlZm9yZSBmYWxsaW5nIGJhY2sgb24gdGhlIGtpbmQsIHNvIGEgd2luZG93IGNvbWVzIGJhY2sgZG9pbmcgd2hhdCBpdCBkaWRcbiAgICAgICAgLy8gcmF0aGVyIHRoYW4gYW5vdGhlciBvZiBpdHMga2luZCB0YWtpbmcgaXRzIHBsYWNlLlxuICAgICAgICBjb25zdCByZW9wZW5lZCA9IG5ldyBNYXA8U2F2ZWRXaW5kb3csIFdpbmRvd0lkPigpO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc2F2ZWQgb2YgbGF5b3V0LndpbmRvd3MpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBtYXRjaGVzLmhhcyhzYXZlZCkgfHxcbiAgICAgICAgICAgICFzYXZlZC5yZW9wZW5pbmcgfHxcbiAgICAgICAgICAgICEoYXdhaXQgY2FuUmVvcGVuV2luZG93KHNhdmVkLnJlb3BlbmluZykpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpbmRleCA9IGxheW91dC53aW5kb3dzLmluZGV4T2Yoc2F2ZWQpO1xuXG4gICAgICAgICAgcHJvZ3Jlc3MucmVvcGVuaW5nPy4oc2F2ZWQsIGluZGV4KTtcblxuICAgICAgICAgIC8vIENyZWF0ZWQgd2hlcmUgYW5kIGFzIHRoZSBsYXlvdXQgaGFzIGl0LCBuZXZlciBtb3ZlZCB0aGVyZSBvbmNlIHNob3duLiBMZW5zIGFuc3dlcnMgb25jZVxuICAgICAgICAgIC8vIHRoZSB3aW5kb3cgaXMgbGlzdGVkLCB3aXRoIHRoZSBpZCBpdCBpcyBsaXN0ZWQgYnkuXG4gICAgICAgICAgY29uc3Qgd2luZG93ID0gYXdhaXQgcmVvcGVuV2luZG93KHNhdmVkLnJlb3BlbmluZywge1xuICAgICAgICAgICAgYm91bmRzOiBib3VuZHNGb3Ioc2F2ZWQpLFxuICAgICAgICAgICAgc3RhdGU6IHNhdmVkLnN0YXRlLFxuICAgICAgICAgICAgLi4uKHNhdmVkLmRpc3BsYXlJZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgICAgOiB7IGRpc3BsYXlJZDogc2F2ZWQuZGlzcGxheUlkIH0pLFxuICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG5cbiAgICAgICAgICBwcm9ncmVzcy5yZW9wZW5lZD8uKHNhdmVkLCBpbmRleCwgd2luZG93KTtcblxuICAgICAgICAgIGlmICh3aW5kb3cpIHtcbiAgICAgICAgICAgIHJlb3BlbmVkLnNldChzYXZlZCwgd2luZG93KTtcbiAgICAgICAgICAgIC8vIFRoZSB3aW5kb3cgb3BlbmVkIGFnYWluIGlzIHRoZSBsYXlvdXQncyB3aW5kb3cgc3RpbGwsIHdoYXRldmVyIExlbnMgZGVzY3JpYmVzIG9mIGl0LlxuICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICBsaW5lYWdlLnNldChcbiAgICAgICAgICAgICAgICBsaW5lYWdlS2V5KG5hbWUsIGtleU9mV2luZG93KHdpbmRvdykpLFxuICAgICAgICAgICAgICAgIGtleU9mV2luZG93KHNhdmVkLndpbmRvdyksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlcy5zZXQoa2V5T2ZXaW5kb3cod2luZG93KSwga2V5T2ZXaW5kb3coc2F2ZWQud2luZG93KSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB3aW5kb3dPZiA9IG5ldyBNYXA8U2F2ZWRXaW5kb3csIFdpbmRvd0lkPihbXG4gICAgICAgICAgLi4uWy4uLm1hdGNoZXNdLm1hcChcbiAgICAgICAgICAgIChbc2F2ZWQsIHJlY29yZF0pID0+IFtzYXZlZCwgcmVjb3JkLndpbmRvd10gYXMgY29uc3QsXG4gICAgICAgICAgKSxcbiAgICAgICAgICAuLi5yZW9wZW5lZCxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgY29uc3QgcGxhbiA9IHRvVGlsaW5nUGxhbihcbiAgICAgICAgICBsYXlvdXQudGlsaW5nLFxuICAgICAgICAgIGxheW91dC53aW5kb3dzLFxuICAgICAgICAgIHdpbmRvd09mLFxuICAgICAgICAgIGNvbm5lY3RlZCxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBXaGVyZSB0aGUgdGlsaW5nIHB1dHMgZWFjaCB3aW5kb3cgaXQgcHV0cyBpbiBhIHRpbGUsIGJ5IGtleTogb24gYSBzY3JlZW4gY29ubmVjdGVkIG5vdyxcbiAgICAgICAgLy8gYXMgdGhlIHRpbGluZyBzaG93cyB0aGVtLiBPbmUgb24gYSBzY3JlZW4gbm90IGNvbm5lY3RlZCBpcyBub3QgdGlsZWQsIGFzIHRoZSB0aWxpbmcgc2F5cy5cbiAgICAgICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IGdldFdpbmRvd1JlY29yZHMoKTtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlVGlsaW5nUGxhbihyZWNvcmRzLCBjb25uZWN0ZWQsIHBsYW4pO1xuICAgICAgICBjb25zdCB0aWxlQm91bmRzID0gbmV3IE1hcChcbiAgICAgICAgICByZXNvbHZlZC5zY3JlZW5zXG4gICAgICAgICAgICAuZmlsdGVyKChzY3JlZW4pID0+ICFzY3JlZW4ubWlzc2luZylcbiAgICAgICAgICAgIC5mbGF0TWFwKChzY3JlZW4pID0+XG4gICAgICAgICAgICAgIHNjcmVlbi53aW5kb3dzXG4gICAgICAgICAgICAgICAgLmZpbHRlcigod2luZG93KSA9PiAhd2luZG93Lm1pc3NpbmcpXG4gICAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAgICh3aW5kb3cpID0+XG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICBrZXlPZldpbmRvdyh3aW5kb3cucmVjb3JkLndpbmRvdyksXG4gICAgICAgICAgICAgICAgICAgICAgYm91bmRzSW5HcmlkKFxuICAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuLmRpc3BsYXkud29ya0FyZWEuZ2V0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW4uY29sdW1ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbi5yb3dzLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LFxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIF0gYXMgY29uc3QsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHRpbGVkS2V5cyA9IG5ldyBTZXQodGlsZUJvdW5kcy5rZXlzKCkpO1xuICAgICAgICBjb25zdCBpc1RpbGVkID0gKHdpbmRvdzogV2luZG93SWQpID0+XG4gICAgICAgICAgdGlsZWRLZXlzLmhhcyhrZXlPZldpbmRvdyh3aW5kb3cpKTtcbiAgICAgICAgY29uc3Qgc3RhdGVPZiA9ICh3aW5kb3c6IFdpbmRvd0lkKSA9PlxuICAgICAgICAgIHJlY29yZHNcbiAgICAgICAgICAgIC5maW5kKChpdCkgPT4ga2V5T2ZXaW5kb3coaXQud2luZG93KSA9PT0ga2V5T2ZXaW5kb3cod2luZG93KSlcbiAgICAgICAgICAgID8uc3RhdGUuZ2V0KCk7XG5cbiAgICAgICAgLy8gQSB0aWxlZCB3aW5kb3cgc2hvd3Mgbm9ybWFsbHkgdG8gYmUgcHV0IGluIGl0cyB0aWxlLCBhcyB0aWxpbmcgZG9lcywgdW5sZXNzIHRoZSBsYXlvdXRcbiAgICAgICAgLy8gaGFzIGl0IG1pbmltaXplZC5cbiAgICAgICAgZm9yIChjb25zdCBbc2F2ZWQsIHdpbmRvd10gb2Ygd2luZG93T2YpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpc1RpbGVkKHdpbmRvdykgJiZcbiAgICAgICAgICAgIHNhdmVkLnN0YXRlICE9PSBcIm1pbmltaXplZFwiICYmXG4gICAgICAgICAgICBzdGF0ZU9mKHdpbmRvdykgIT09IFwibm9ybWFsXCJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGF3YWl0IHNldFdpbmRvd1N0YXRlKHdpbmRvdywgXCJub3JtYWxcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQSB0aWxlZCB3aW5kb3cgZ29lcyBpbiBpdHMgdGlsZTsgYW55IG90aGVyIHdoZXJlIHRoZSBsYXlvdXQgc2F2ZWQgaXQsIGFzIG9uZSBvcGVuZWQgYWdhaW5cbiAgICAgICAgLy8gd2FzIGNyZWF0ZWQgYWxyZWFkeS5cbiAgICAgICAgYXdhaXQgc2V0V2luZG93Qm91bmRzKFtcbiAgICAgICAgICAuLi5bLi4ud2luZG93T2ZdLmZsYXRNYXAoKFssIHdpbmRvd10pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJvdW5kcyA9IHRpbGVCb3VuZHMuZ2V0KGtleU9mV2luZG93KHdpbmRvdykpO1xuXG4gICAgICAgICAgICByZXR1cm4gYm91bmRzID8gW3sgd2luZG93LCBib3VuZHMgfV0gOiBbXTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAuLi5bLi4ubWF0Y2hlc11cbiAgICAgICAgICAgIC5maWx0ZXIoKFssIHJlY29yZF0pID0+ICFpc1RpbGVkKHJlY29yZC53aW5kb3cpKVxuICAgICAgICAgICAgLm1hcCgoW3NhdmVkLCByZWNvcmRdKSA9PiAoe1xuICAgICAgICAgICAgICB3aW5kb3c6IHJlY29yZC53aW5kb3csXG4gICAgICAgICAgICAgIGJvdW5kczogYm91bmRzRm9yKHNhdmVkKSxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBbc2F2ZWQsIHdpbmRvd10gb2Ygd2luZG93T2YpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBzYXZlZC5zdGF0ZSA9PT0gXCJtaW5pbWl6ZWRcIiB8fFxuICAgICAgICAgICAgKCFpc1RpbGVkKHdpbmRvdykgJiYgbWF0Y2hlcy5oYXMoc2F2ZWQpICYmIHNhdmVkLnN0YXRlICE9PSBcIm5vcm1hbFwiKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgYXdhaXQgc2V0V2luZG93U3RhdGUod2luZG93LCBzYXZlZC5zdGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQnJpbmdzIHRoZSB0aWxlZCB3aW5kb3dzIGZvcndhcmQsIHNvIHRoYXQgdGhleSBlbmQgYWJvdmUgZXZlcnkgb3RoZXIgd2luZG93LCBidXQgdGhlXG4gICAgICAgIC8vIG1pbmltaXplZCBvbmVzLCB3aGljaCBmb2N1c2luZyB3b3VsZCBzaG93IGFnYWluOyB0aGUgb25lIHRoYXQgaGFkIGZvY3VzIGxhc3QgZW5kcyBvbiB0b3BcbiAgICAgICAgLy8gd2l0aCBmb2N1cy4gQSB3aW5kb3cgbm90IHRpbGVkIGlzIGxlZnQgd2hlcmUgaXQgaXMgYW1vbmcgdGhlIG90aGVycy4gQSBsYXlvdXQgc2F2ZWRcbiAgICAgICAgLy8gYmVmb3JlIGxheW91dHMga2VwdCBhIHRpbGluZyB0aWxlcyBub25lOiBldmVyeSB3aW5kb3cgb2YgaXQgaXMgYnJvdWdodCBmb3J3YXJkLlxuICAgICAgICBjb25zdCB0b0Zyb250ID0gWy4uLndpbmRvd09mXVxuICAgICAgICAgIC5maWx0ZXIoKFtzYXZlZF0pID0+IHNhdmVkLnN0YXRlICE9PSBcIm1pbmltaXplZFwiKVxuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAoWywgd2luZG93XSkgPT5cbiAgICAgICAgICAgICAgIWxheW91dC50aWxpbmcgfHwgdGlsZWRLZXlzLmhhcyhrZXlPZldpbmRvdyh3aW5kb3cpKSxcbiAgICAgICAgICApXG4gICAgICAgICAgLnNvcnQoKFthXSwgW2JdKSA9PiBOdW1iZXIoYS5pc0ZvY3VzZWQpIC0gTnVtYmVyKGIuaXNGb2N1c2VkKSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBbLCB3aW5kb3ddIG9mIHRvRnJvbnQpIHtcbiAgICAgICAgICBhd2FpdCBmb2N1c1dpbmRvdyh3aW5kb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RvcmVkID0gYXdhaXQgZ2V0U3RvcmVkVGlsaW5nUGxhbigpO1xuXG4gICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICBzdG9yZWQuc2V0KHBsYW4pO1xuICAgICAgICAgIHByb2dyZXNzLnBsYWNlZD8uKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcGxhY2VkOiBtYXRjaGVzLnNpemUgKyByZW9wZW5lZC5zaXplLFxuICAgICAgICAgIHJlb3BlbmVkOiBbLi4ucmVvcGVuZWQua2V5cygpXS5tYXAoKGl0KSA9PiBpdC50aXRsZSksXG4gICAgICAgICAgbm90T3BlbjogbGF5b3V0LndpbmRvd3NcbiAgICAgICAgICAgIC5maWx0ZXIoKHNhdmVkKSA9PiAhbWF0Y2hlcy5oYXMoc2F2ZWQpICYmICFyZW9wZW5lZC5oYXMoc2F2ZWQpKVxuICAgICAgICAgICAgLm1hcCgoaXQpID0+IGl0LnRpdGxlKSxcbiAgICAgICAgICBtb3ZlZFRvUHJpbWFyeSxcbiAgICAgICAgICBzY3JlZW5zQ2hhbmdlZDpcbiAgICAgICAgICAgICEhbGF5b3V0LmRpc3BsYXlzICYmICFpc1NhbWVTY3JlZW5zKGxheW91dC5kaXNwbGF5cywgY29ubmVjdGVkKSxcbiAgICAgICAgfTtcbiAgICAgIH07XG4gIH0sXG59KTtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIERpc3BsYXlSZWNvcmQsXG4gIFdpbmRvd0JvdW5kcyxcbn0gZnJvbSBcIkBrOHNsZW5zL3dpbmRvdy1sYXlvdXQtY29udHJhY3RzXCI7XG5pbXBvcnQgdHlwZSB7IFNhdmVkRGlzcGxheSB9IGZyb20gXCIuL3NhdmVkLXdpbmRvdy1sYXlvdXRzLmluamVjdGFibGVcIjtcblxuLy8gSG93IG11Y2ggb2YgYSB3aW5kb3cgbXVzdCBzaG93IG9uIGEgc2NyZWVuIGZvciB0aGUgdXNlciB0byByZWFjaCBpdDogYWJvdXQgaXRzIHRpdGxlIGJhci5cbmNvbnN0IHJlYWNoYWJsZVdpZHRoID0gMTAwO1xuY29uc3QgcmVhY2hhYmxlSGVpZ2h0ID0gNDA7XG5cbi8vIEVhY2ggd2luZG93IG1vdmVkIG9udG8gYW5vdGhlciBzY3JlZW4gbGllcyB0aGlzIG11Y2ggZnVydGhlciBkb3duIGFuZCByaWdodCB0aGFuIHRoZSBvbmUgYmVmb3JlLFxuLy8gc28gdGhhdCBzZXZlcmFsIGRvIG5vdCBoaWRlIGVhY2ggb3RoZXIuXG5jb25zdCBjYXNjYWRlU3RlcCA9IDMyO1xuXG5jb25zdCBvdmVybGFwID0gKGE6IFdpbmRvd0JvdW5kcywgYjogV2luZG93Qm91bmRzKSA9PiAoe1xuICB3aWR0aDogTWF0aC5taW4oYS54ICsgYS53aWR0aCwgYi54ICsgYi53aWR0aCkgLSBNYXRoLm1heChhLngsIGIueCksXG4gIGhlaWdodDogTWF0aC5taW4oYS55ICsgYS5oZWlnaHQsIGIueSArIGIuaGVpZ2h0KSAtIE1hdGgubWF4KGEueSwgYi55KSxcbn0pO1xuXG5leHBvcnQgY29uc3QgaXNSZWFjaGFibGVPblNvbWVTY3JlZW4gPSAoXG4gIGJvdW5kczogV2luZG93Qm91bmRzLFxuICB3b3JrQXJlYXM6IHJlYWRvbmx5IFdpbmRvd0JvdW5kc1tdLFxuKSA9PlxuICB3b3JrQXJlYXMuc29tZSgoYXJlYSkgPT4ge1xuICAgIGNvbnN0IHNob3duID0gb3ZlcmxhcChib3VuZHMsIGFyZWEpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHNob3duLndpZHRoID49IE1hdGgubWluKHJlYWNoYWJsZVdpZHRoLCBib3VuZHMud2lkdGgpICYmXG4gICAgICBzaG93bi5oZWlnaHQgPj0gTWF0aC5taW4ocmVhY2hhYmxlSGVpZ2h0LCBib3VuZHMuaGVpZ2h0KVxuICAgICk7XG4gIH0pO1xuXG4vLyBUaGUgYm91bmRzIHNocnVuayB0byBmaXQgdGhlIGFyZWEgaWYgdGhleSBtdXN0LCBjZW50cmVkIGluIGl0LCB0aGUgbnRoIG9uZSBhIGNhc2NhZGUgc3RlcCBmdXJ0aGVyIG9uLlxuZXhwb3J0IGNvbnN0IGZpdEludG8gPSAoXG4gIGFyZWE6IFdpbmRvd0JvdW5kcyxcbiAgYm91bmRzOiBXaW5kb3dCb3VuZHMsXG4gIG50aDogbnVtYmVyLFxuKTogV2luZG93Qm91bmRzID0+IHtcbiAgY29uc3Qgd2lkdGggPSBNYXRoLm1pbihib3VuZHMud2lkdGgsIGFyZWEud2lkdGgpO1xuICBjb25zdCBoZWlnaHQgPSBNYXRoLm1pbihib3VuZHMuaGVpZ2h0LCBhcmVhLmhlaWdodCk7XG4gIGNvbnN0IG9mZnNldCA9IG50aCAqIGNhc2NhZGVTdGVwO1xuXG4gIHJldHVybiB7XG4gICAgeDpcbiAgICAgIGFyZWEueCArXG4gICAgICBNYXRoLm1pbihcbiAgICAgICAgTWF0aC5mbG9vcigoYXJlYS53aWR0aCAtIHdpZHRoKSAvIDIpICsgb2Zmc2V0LFxuICAgICAgICBhcmVhLndpZHRoIC0gd2lkdGgsXG4gICAgICApLFxuICAgIHk6XG4gICAgICBhcmVhLnkgK1xuICAgICAgTWF0aC5taW4oXG4gICAgICAgIE1hdGguZmxvb3IoKGFyZWEuaGVpZ2h0IC0gaGVpZ2h0KSAvIDIpICsgb2Zmc2V0LFxuICAgICAgICBhcmVhLmhlaWdodCAtIGhlaWdodCxcbiAgICAgICksXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHRvU2F2ZWREaXNwbGF5ID0gKGRpc3BsYXk6IERpc3BsYXlSZWNvcmQpOiBTYXZlZERpc3BsYXkgPT4gKHtcbiAgbGFiZWw6IGRpc3BsYXkubGFiZWwuZ2V0KCksXG4gIGlzUHJpbWFyeTogZGlzcGxheS5pc1ByaW1hcnkuZ2V0KCksXG4gIGJvdW5kczogeyAuLi5kaXNwbGF5LmJvdW5kcy5nZXQoKSB9LFxufSk7XG5cbmNvbnN0IGlzU2FtZUJvdW5kcyA9IChhOiBXaW5kb3dCb3VuZHMsIGI6IFdpbmRvd0JvdW5kcykgPT5cbiAgYS54ID09PSBiLnggJiYgYS55ID09PSBiLnkgJiYgYS53aWR0aCA9PT0gYi53aWR0aCAmJiBhLmhlaWdodCA9PT0gYi5oZWlnaHQ7XG5cbi8vIFdoZXRoZXIgdGhlIHNjcmVlbnMgYXJlIGFycmFuZ2VkIGFzIHRoZXkgd2VyZSBzYXZlZDogYXMgbWFueSwgZWFjaCB3aGVyZSBpdCB3YXMuXG5leHBvcnQgY29uc3QgaXNTYW1lU2NyZWVucyA9IChcbiAgc2F2ZWQ6IHJlYWRvbmx5IFNhdmVkRGlzcGxheVtdLFxuICBjdXJyZW50OiByZWFkb25seSBEaXNwbGF5UmVjb3JkW10sXG4pID0+XG4gIHNhdmVkLmxlbmd0aCA9PT0gY3VycmVudC5sZW5ndGggJiZcbiAgc2F2ZWQuZXZlcnkoKGRpc3BsYXkpID0+XG4gICAgY3VycmVudC5zb21lKChpdCkgPT4gaXNTYW1lQm91bmRzKGl0LmJvdW5kcy5nZXQoKSwgZGlzcGxheS5ib3VuZHMpKSxcbiAgKTtcblxuLy8gV2hhdCB0byBjYWxsIGEgc2NyZWVuIHRvIHRoZSB1c2VyOiBpdHMgb3duIG5hbWUsIG9yIGl0cyBwbGFjZSBhbW9uZyB0aGUgc2NyZWVucy5cbmV4cG9ydCBjb25zdCBuYW1lT2ZTY3JlZW4gPSAobGFiZWw6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT5cbiAgbGFiZWwgfHwgYFNjcmVlbiAke2luZGV4ICsgMX1gO1xuIiwgImltcG9ydCB7IGdldEluamVjdGFibGUyIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcbmltcG9ydCB7IHJ1bkluQWN0aW9uIH0gZnJvbSBcIm1vYnhcIjtcbmltcG9ydCB7IHNhdmVkV2luZG93TGF5b3V0c0J1bmNoIH0gZnJvbSBcIi4vc2F2ZWQtd2luZG93LWxheW91dHMuaW5qZWN0YWJsZVwiO1xuXG5leHBvcnQgdHlwZSBSZW5hbWVSZXN1bHQgPSBcInJlbmFtZWRcIiB8IFwibmFtZS10YWtlblwiIHwgXCJub3QtZm91bmRcIjtcblxuLy8gUmVuYW1lcyBhIGxheW91dCwga2VlcGluZyB3aGF0IGl0IGhvbGRzIGFuZCB3aGVuIGl0IHdhcyBzYXZlZC4gTmV2ZXIgcmVwbGFjZXMgYW5vdGhlciBsYXlvdXQuXG5leHBvcnQgY29uc3QgcmVuYW1lV2luZG93TGF5b3V0SW5qZWN0YWJsZSA9IGdldEluamVjdGFibGUyKHtcbiAgaWQ6IFwid2luZG93LW1hbmFnZXIucmVuYW1lLXdpbmRvdy1sYXlvdXRcIixcblxuICBpbnN0YW50aWF0ZTogKGRpKSA9PiB7XG4gICAgY29uc3QgZ2V0U2F2ZWRMYXlvdXRzID0gZGkuaW5qZWN0KHNhdmVkV2luZG93TGF5b3V0c0J1bmNoLnBlcnNpc3RhYmxlKTtcblxuICAgIHJldHVybiAoKSA9PlxuICAgICAgYXN5bmMgKGZyb206IHN0cmluZywgdG86IHN0cmluZyk6IFByb21pc2U8UmVuYW1lUmVzdWx0PiA9PiB7XG4gICAgICAgIGNvbnN0IHNhdmVkTGF5b3V0cyA9IGF3YWl0IGdldFNhdmVkTGF5b3V0cygpO1xuICAgICAgICBjb25zdCBsYXlvdXQgPSBzYXZlZExheW91dHMuZ2V0KGZyb20pO1xuXG4gICAgICAgIGlmICghbGF5b3V0KSB7XG4gICAgICAgICAgcmV0dXJuIFwibm90LWZvdW5kXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodG8gIT09IGZyb20gJiYgc2F2ZWRMYXlvdXRzLmhhcyh0bykpIHtcbiAgICAgICAgICByZXR1cm4gXCJuYW1lLXRha2VuXCI7XG4gICAgICAgIH1cblxuICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgc2F2ZWRMYXlvdXRzLmRlbGV0ZShmcm9tKTtcbiAgICAgICAgICBzYXZlZExheW91dHMuc2V0KHRvLCB7IC4uLmxheW91dCwgbmFtZTogdG8gfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBcInJlbmFtZWRcIjtcbiAgICAgIH07XG4gIH0sXG59KTtcbiIsICJpbXBvcnQgeyBnZXRJbmplY3RhYmxlMiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQge1xuICBkZXNjcmliZUNsb3NlZFdpbmRvd0luamVjdGlvblRva2VuLFxuICB0eXBlIFdpbmRvd1Jlb3BlbmluZyxcbn0gZnJvbSBcIkBrOHNsZW5zL3dpbmRvdy1sYXlvdXQtY29udHJhY3RzXCI7XG5pbXBvcnQgdHlwZSB7IFBsYW5uZWRXaW5kb3cgfSBmcm9tIFwiLi90aWxpbmctcGxhblwiO1xuaW1wb3J0IHsgd2luZG93UmVvcGVuaW5nc0J1bmNoIH0gZnJvbSBcIi4vd2luZG93LXJlb3BlbmluZ3MuaW5qZWN0YWJsZVwiO1xuXG4vLyBIb3cgdG8gb3BlbiBhIHdpbmRvdyBub3Qgb3BlbiBhZ2FpbiwgYXNrZWQgYXQgdGhlIG1vbWVudCBpdCBpcyBuZWVkZWQ6IGFzIExlbnMgZGVzY3JpYmVkIGl0IGFzIGl0XG4vLyBjbG9zZWQsIGJ5IHRoZSBpZCBpdCBoYWQgd2hpbGUgb3BlbjsgZm9yIGEgd2luZG93IGNsb3NlZCBiZWZvcmUgTGVucyBkaWQgc28sIGFzIHRoaXMgZXh0ZW5zaW9uXG4vLyBsYXN0IGRlc2NyaWJlZCBpdCB3aGlsZSBpdCB3YXMgb3Blbi5cbmV4cG9ydCBjb25zdCByZW9wZW5pbmdPZkNsb3NlZFdpbmRvd0luamVjdGFibGUgPSBnZXRJbmplY3RhYmxlMih7XG4gIGlkOiBcIndpbmRvdy1tYW5hZ2VyLnJlb3BlbmluZy1vZi1jbG9zZWQtd2luZG93XCIsXG4gIGNvbnN1bXB0aW9uczogW2Rlc2NyaWJlQ2xvc2VkV2luZG93SW5qZWN0aW9uVG9rZW5dLFxuXG4gIGluc3RhbnRpYXRlOiAoZGkpID0+IHtcbiAgICBjb25zdCBkZXNjcmliZUNsb3NlZFdpbmRvdyA9IGRpLmluamVjdChcbiAgICAgIGRlc2NyaWJlQ2xvc2VkV2luZG93SW5qZWN0aW9uVG9rZW4sXG4gICAgKSgpO1xuICAgIC8vIFJlYWQgb25seSwgbmV2ZXIgd3JpdHRlbiBhbnkgbW9yZTsgc2VlIHRoZSBidW5jaC5cbiAgICBjb25zdCBnZXRMZWdhY3lSZW9wZW5pbmdzID0gZGkuaW5qZWN0KHdpbmRvd1Jlb3BlbmluZ3NCdW5jaC5wZXJzaXN0YWJsZSk7XG5cbiAgICByZXR1cm4gKCkgPT5cbiAgICAgIGFzeW5jIChcbiAgICAgICAgd2luZG93OiBQaWNrPFBsYW5uZWRXaW5kb3csIFwia2V5XCIgfCBcImNsb3NlZFwiPixcbiAgICAgICk6IFByb21pc2U8V2luZG93UmVvcGVuaW5nIHwgdW5kZWZpbmVkPiA9PlxuICAgICAgICAod2luZG93LmNsb3NlZCAmJiAoYXdhaXQgZGVzY3JpYmVDbG9zZWRXaW5kb3cod2luZG93LmNsb3NlZCkpKSA/P1xuICAgICAgICAoYXdhaXQgZ2V0TGVnYWN5UmVvcGVuaW5ncygpKS5nZXQod2luZG93LmtleSk7XG4gIH0sXG59KTtcbiIsICJpbXBvcnQgeyBnZXRQZXJzaXN0YWJsZU1hcEluamVjdGFibGVCdW5jaCB9IGZyb20gXCJAazhzbGVucy9wZXJzaXN0YWJsZS1jb250cmFjdHNcIjtcbmltcG9ydCB0eXBlIHsgV2luZG93UmVvcGVuaW5nIH0gZnJvbSBcIkBrOHNsZW5zL3dpbmRvdy1sYXlvdXQtY29udHJhY3RzXCI7XG5cbi8vIEhvdyB0byBvcGVuIGV2ZXJ5IHdpbmRvdyBvZiBMZW5zIGFnYWluLCBieSBpdHMga2V5IGluIHRoZSB0aWxpbmcsIGFzIHRoaXMgZXh0ZW5zaW9uIGxhc3QgZGVzY3JpYmVkXG4vLyBpdCB3aGlsZSBpdCB3YXMgb3BlbiwgYmVmb3JlIExlbnMgZGVzY3JpYmVkIGVhY2ggd2luZG93IGFzIGl0IGNsb3Nlcy4gUmVhZCBvbmx5LCBmb3IgYSB3aW5kb3dcbi8vIGNsb3NlZCBiZWZvcmUgdGhlbjsgbmV2ZXIgd3JpdHRlbiBhbnkgbW9yZS4gVE9ETzogZHJvcCB0aGlzIGJ1bmNoIGluIGEgbGF0ZXIgcmVsZWFzZSwgb25jZSB3aW5kb3dzXG4vLyBjbG9zZWQgYmVmb3JlIExlbnMgZGVzY3JpYmVkIGNsb3NlZCB3aW5kb3dzIGFyZSBwYXN0IHRoZSAxODAgZGF5cyBMZW5zIGtlZXBzIHRoZW0gZm9yLlxuZXhwb3J0IGNvbnN0IHdpbmRvd1Jlb3BlbmluZ3NCdW5jaCA9IGdldFBlcnNpc3RhYmxlTWFwSW5qZWN0YWJsZUJ1bmNoPFxuICBzdHJpbmcsXG4gIFdpbmRvd1Jlb3BlbmluZ1xuPigpKHtcbiAgaWQ6IFwid2luZG93LXJlb3BlbmluZ3NcIixcbn0pO1xuIiwgImltcG9ydCB7IGdldEluamVjdGFibGUyIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcbmltcG9ydCB7XG4gIGRpc3BsYXlSZWNvcmRzSW5qZWN0aW9uVG9rZW4sXG4gIHdpbmRvd1JlY29yZHNJbmplY3Rpb25Ub2tlbixcbn0gZnJvbSBcIkBrOHNsZW5zL3dpbmRvdy1sYXlvdXQtY29udHJhY3RzXCI7XG5pbXBvcnQgeyBpc0FwcGxpY2F0aW9uV2luZG93IH0gZnJvbSBcIkBrOHNsZW5zL21lc3NhZ2luZy1jb250cmFjdHNcIjtcbmltcG9ydCB7IHJ1bkluQWN0aW9uIH0gZnJvbSBcIm1vYnhcIjtcbmltcG9ydCB7IHNhdmVkV2luZG93T2ZLZXksIHRvU2F2ZWRUaWxpbmcgfSBmcm9tIFwiLi9sYXlvdXQtdGlsaW5nXCI7XG5pbXBvcnQge1xuICBzYXZlZFdpbmRvd0xheW91dHNCdW5jaCxcbiAgdHlwZSBTYXZlZFdpbmRvdyxcbn0gZnJvbSBcIi4vc2F2ZWQtd2luZG93LWxheW91dHMuaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgdG9TYXZlZERpc3BsYXkgfSBmcm9tIFwiLi9zY3JlZW5zXCI7XG5pbXBvcnQge1xuICBib3VuZHNJbkdyaWQsXG4gIGtleU9mV2luZG93LFxuICByZXNvbHZlVGlsaW5nUGxhbixcbiAgd2luZG93T2ZLZXksXG4gIHR5cGUgUGxhY2VkV2luZG93LFxuICB0eXBlIFBsYW5uZWRTY3JlZW4sXG4gIHR5cGUgUGxhbm5lZFdpbmRvdyxcbn0gZnJvbSBcIi4vdGlsaW5nLXBsYW5cIjtcbmltcG9ydCB7IHJlb3BlbmluZ09mQ2xvc2VkV2luZG93SW5qZWN0YWJsZSB9IGZyb20gXCIuL3Jlb3BlbmluZy1vZi1jbG9zZWQtd2luZG93LmluamVjdGFibGVcIjtcbmltcG9ydCB7IHN0b3JlZFRpbGluZ1BsYW5CdW5jaCB9IGZyb20gXCIuL3RpbGluZy1wbGFuLmluamVjdGFibGVcIjtcblxuLy8gU2F2ZXMgd2hlcmUgZXZlcnkgb3BlbiB3aW5kb3cgaXMgYW5kIGhvdyBpdCBzaG93cywgd2hhdCBpdCBkb2VzIHNvIGl0IGNhbiBiZSBvcGVuZWQgYWdhaW4gb25jZVxuLy8gY2xvc2VkLCB0aGUgc2NyZWVucyB0aGV5IGFyZSBvbiwgYW5kIHRoZSB0aWxpbmcgc2V0dXAgYXMgaXQgaXMgbm93LCB1bmRlciB0aGUgbmFtZSwgcmVwbGFjaW5nIGFcbi8vIGxheW91dCBvZiB0aGUgc2FtZSBuYW1lLiBBIHdpbmRvdyBvZiB0aGF0IGxheW91dCBub3Qgb3BlbiBub3cgc3RheXMgaW4gaXQgYXMgaXQgd2FzIGtlcHQsIGl0c1xuLy8gdGlsZSB3aXRoIGl0OiBvbmx5IHRha2luZyBpdCBvdXQgb2YgdGhlIGxheW91dCBkcm9wcyBpdC5cbmV4cG9ydCBjb25zdCBzYXZlV2luZG93TGF5b3V0SW5qZWN0YWJsZSA9IGdldEluamVjdGFibGUyKHtcbiAgaWQ6IFwid2luZG93LW1hbmFnZXIuc2F2ZS13aW5kb3ctbGF5b3V0XCIsXG4gIGNvbnN1bXB0aW9uczogW3dpbmRvd1JlY29yZHNJbmplY3Rpb25Ub2tlbiwgZGlzcGxheVJlY29yZHNJbmplY3Rpb25Ub2tlbl0sXG5cbiAgaW5zdGFudGlhdGU6IChkaSkgPT4ge1xuICAgIGNvbnN0IGdldFdpbmRvd1JlY29yZHMgPSBkaS5pbmplY3Qod2luZG93UmVjb3Jkc0luamVjdGlvblRva2VuKSgpO1xuICAgIGNvbnN0IGdldERpc3BsYXlSZWNvcmRzID0gZGkuaW5qZWN0KGRpc3BsYXlSZWNvcmRzSW5qZWN0aW9uVG9rZW4pKCk7XG4gICAgY29uc3QgZ2V0U2F2ZWRMYXlvdXRzID0gZGkuaW5qZWN0KHNhdmVkV2luZG93TGF5b3V0c0J1bmNoLnBlcnNpc3RhYmxlKTtcbiAgICBjb25zdCBnZXRTdG9yZWRUaWxpbmdQbGFuID0gZGkuaW5qZWN0KHN0b3JlZFRpbGluZ1BsYW5CdW5jaC5wZXJzaXN0YWJsZSk7XG4gICAgY29uc3QgcmVvcGVuaW5nT2ZDbG9zZWRXaW5kb3cgPSBkaS5pbmplY3QoXG4gICAgICByZW9wZW5pbmdPZkNsb3NlZFdpbmRvd0luamVjdGFibGUsXG4gICAgKSgpO1xuXG4gICAgcmV0dXJuICgpID0+IGFzeW5jIChcbiAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgIHtcbiAgICAgICAgLy8gV2hldGhlciB0byBzYXZlIG9ubHkgdGhlIHdpbmRvd3MgaW4gYSB0aWxlLCBvbiBhbnkgc2NyZWVuIG9mIHRoZSB0aWxpbmcsIGxlYXZpbmcgdGhlXG4gICAgICAgIC8vIHdpbmRvd3Mgbm90IHRpbGVkIG91dCBvZiB0aGUgbGF5b3V0LlxuICAgICAgICB0aWxlZE9ubHkgPSBmYWxzZSxcbiAgICAgIH06IHsgcmVhZG9ubHkgdGlsZWRPbmx5PzogYm9vbGVhbiB9ID0ge30sXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBzYXZlZExheW91dHMgPSBhd2FpdCBnZXRTYXZlZExheW91dHMoKTtcbiAgICAgIGNvbnN0IGRpc3BsYXlzID0gYXdhaXQgZ2V0RGlzcGxheVJlY29yZHMoKTtcbiAgICAgIGNvbnN0IGFsbFJlY29yZHMgPSBhd2FpdCBnZXRXaW5kb3dSZWNvcmRzKCk7XG4gICAgICBjb25zdCBwbGFuID0gcmVzb2x2ZVRpbGluZ1BsYW4oXG4gICAgICAgIGFsbFJlY29yZHMsXG4gICAgICAgIGRpc3BsYXlzLFxuICAgICAgICAoYXdhaXQgZ2V0U3RvcmVkVGlsaW5nUGxhbigpKS5nZXQoKSA/PyB1bmRlZmluZWQsXG4gICAgICApO1xuICAgICAgY29uc3QgdGlsZWRLZXlzID0gbmV3IFNldChcbiAgICAgICAgcGxhbi5zY3JlZW5zLmZsYXRNYXAoKHNjcmVlbikgPT4gc2NyZWVuLndpbmRvd3MubWFwKChpdCkgPT4gaXQua2V5KSksXG4gICAgICApO1xuICAgICAgY29uc3QgcmVjb3JkcyA9IGFsbFJlY29yZHMuZmlsdGVyKFxuICAgICAgICAocmVjb3JkKSA9PiAhdGlsZWRPbmx5IHx8IHRpbGVkS2V5cy5oYXMoa2V5T2ZXaW5kb3cocmVjb3JkLndpbmRvdykpLFxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc2F2ZWRXaW5kb3dzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHJlY29yZHMubWFwKGFzeW5jIChyZWNvcmQpOiBQcm9taXNlPFNhdmVkV2luZG93PiA9PiB7XG4gICAgICAgICAgY29uc3QgcmVvcGVuaW5nID0gYXdhaXQgcmVjb3JkLmRlc2NyaWJlUmVvcGVuaW5nKCk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd2luZG93OiBpc0FwcGxpY2F0aW9uV2luZG93KHJlY29yZC53aW5kb3cpXG4gICAgICAgICAgICAgID8gcmVjb3JkLndpbmRvd1xuICAgICAgICAgICAgICA6IHsga2luZDogcmVjb3JkLndpbmRvdy5raW5kLCBpZDogcmVjb3JkLndpbmRvdy5pZCB9LFxuICAgICAgICAgICAgdGl0bGU6IHJlY29yZC50aXRsZS5nZXQoKSxcbiAgICAgICAgICAgIC4uLihyZW9wZW5pbmcgPyB7IHJlb3BlbmluZyB9IDoge30pLFxuICAgICAgICAgICAgbm9ybWFsQm91bmRzOiB7IC4uLnJlY29yZC5ub3JtYWxCb3VuZHMuZ2V0KCkgfSxcbiAgICAgICAgICAgIHN0YXRlOiByZWNvcmQuc3RhdGUuZ2V0KCksXG4gICAgICAgICAgICBpc0ZvY3VzZWQ6IHJlY29yZC5pc0ZvY3VzZWQuZ2V0KCksXG4gICAgICAgICAgICBkaXNwbGF5SWQ6IHJlY29yZC5kaXNwbGF5SWQuZ2V0KCksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICBjb25zdCBwcmV2aW91cyA9IHNhdmVkTGF5b3V0cy5nZXQobmFtZSk7XG4gICAgICBjb25zdCBvcGVuS2V5cyA9IG5ldyBTZXQoXG4gICAgICAgIGFsbFJlY29yZHMubWFwKChyZWNvcmQpID0+IGtleU9mV2luZG93KHJlY29yZC53aW5kb3cpKSxcbiAgICAgICk7XG5cbiAgICAgIC8vIFRoZSB3aW5kb3dzIG5vdCBvcGVuIG5vdywgYnkgdGhlIGtleSB0aGVpciB0aWxlcyBnbyBieTogb25lIG9mIHRoZSBsYXlvdXQncyBhcyBpdCBrZXB0IGl0LFxuICAgICAgLy8gb25lIG1pc3Npbmcgc2luY2UgdGhlIGxheW91dCB3YXMgc2hvd24gZ29pbmcgYnkgaXRzIHBsYWNlIGluIHRoZSBsYXlvdXQsIG9uZSBjbG9zZWQgc2luY2UgYnlcbiAgICAgIC8vIGl0cyBvd24ga2V5OyBvbmUgdGhlIGxheW91dCBoYXMgbm90LCBvcGVuZWQgc2luY2UgYW5kIGNsb3NlZCBhZ2FpbiwgYXMgTGVucyBkZXNjcmliZWQgaXQgYXNcbiAgICAgIC8vIGl0IGNsb3NlZCwgcGxhY2VkIHdoZXJlIGl0cyB0aWxlIGlzLCBzbyB0aGF0IGl0IGlzIHNhdmVkIHRvby5cbiAgICAgIGNvbnN0IG5vdE9wZW5Gb3VuZCA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBbXG4gICAgICAgICAgLi4ucGxhbi5zY3JlZW5zLmZsYXRNYXAoKHNjcmVlbikgPT5cbiAgICAgICAgICAgIHNjcmVlbi53aW5kb3dzLm1hcChcbiAgICAgICAgICAgICAgKHdpbmRvdyk6IHsgd2luZG93OiBQbGFubmVkV2luZG93OyBzY3JlZW4/OiBQbGFubmVkU2NyZWVuIH0gPT4gKHtcbiAgICAgICAgICAgICAgICB3aW5kb3csXG4gICAgICAgICAgICAgICAgc2NyZWVuLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgICAuLi5wbGFuLnVudGlsZWQubWFwKFxuICAgICAgICAgICAgKHdpbmRvdyk6IHsgd2luZG93OiBQbGFubmVkV2luZG93OyBzY3JlZW4/OiBQbGFubmVkU2NyZWVuIH0gPT4gKHtcbiAgICAgICAgICAgICAgd2luZG93LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKSxcbiAgICAgICAgXVxuICAgICAgICAgIC5maWx0ZXIoKHsgd2luZG93IH0pID0+IHdpbmRvdy5taXNzaW5nKVxuICAgICAgICAgIC5maWx0ZXIoKHsgc2NyZWVuIH0pID0+ICF0aWxlZE9ubHkgfHwgISFzY3JlZW4pXG4gICAgICAgICAgLm1hcChcbiAgICAgICAgICAgIGFzeW5jICh7XG4gICAgICAgICAgICAgIHdpbmRvdyxcbiAgICAgICAgICAgICAgc2NyZWVuLFxuICAgICAgICAgICAgfSk6IFByb21pc2U8eyBrZXk6IHN0cmluZzsga2VwdDogU2F2ZWRXaW5kb3cgfVtdPiA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHsga2V5LCByZWNvcmQsIGNsb3NlZCwgLi4ucGxhY2VkIH0gPSB3aW5kb3c7XG4gICAgICAgICAgICAgIGNvbnN0IGtlcHQgPSBzYXZlZFdpbmRvd09mS2V5KHByZXZpb3VzPy53aW5kb3dzID8/IFtdLCBrZXkpO1xuXG4gICAgICAgICAgICAgIC8vIEEgd2luZG93IG9wZW4gaXMgc2F2ZWQgYXMgaXQgaXMsIG9uY2UuXG4gICAgICAgICAgICAgIGlmIChrZXB0ICYmIG9wZW5LZXlzLmhhcyhrZXlPZldpbmRvdyhrZXB0LndpbmRvdykpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGtlcHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3sga2V5LCBrZXB0IH1dO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKCFzY3JlZW4gfHwgc2NyZWVuLm1pc3NpbmcgfHwgIShcImNvbHVtblwiIGluIHBsYWNlZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCByZW9wZW5pbmcgPSBhd2FpdCByZW9wZW5pbmdPZkNsb3NlZFdpbmRvdyh3aW5kb3cpO1xuXG4gICAgICAgICAgICAgIGlmICghcmVvcGVuaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICBrZXB0OiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSB3aW5kb3cgaXRzZWxmLCBub3Qgd2hhdCBzdGFuZHMgaW4gZm9yIGl0IHdoaWxlIGl0IGlzIG5vdCBvcGVuLlxuICAgICAgICAgICAgICAgICAgICB3aW5kb3c6IGNsb3NlZCA/PyB3aW5kb3dPZktleShrZXkpLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogcmVjb3JkLnRpdGxlLmdldCgpLFxuICAgICAgICAgICAgICAgICAgICByZW9wZW5pbmcsXG4gICAgICAgICAgICAgICAgICAgIG5vcm1hbEJvdW5kczogYm91bmRzSW5HcmlkKFxuICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbi5kaXNwbGF5LndvcmtBcmVhLmdldCgpLFxuICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbi5jb2x1bW5zLFxuICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbi5yb3dzLFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnBsYWNlZCxcbiAgICAgICAgICAgICAgICAgICAgICB9IGFzIFBsYWNlZFdpbmRvdyxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IFwibm9ybWFsXCIsXG4gICAgICAgICAgICAgICAgICAgIGlzRm9jdXNlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlJZDogc2NyZWVuLmRpc3BsYXkuaWQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICksXG4gICAgICApO1xuXG4gICAgICBjb25zdCBub3RPcGVuID0gbm90T3BlbkZvdW5kLmZsYXQoKTtcblxuICAgICAgY29uc3Qgd2luZG93cyA9IFsuLi5zYXZlZFdpbmRvd3MsIC4uLm5vdE9wZW4ubWFwKCh7IGtlcHQgfSkgPT4ga2VwdCldO1xuXG4gICAgICBjb25zdCBpbmRleEJ5S2V5ID0gbmV3IE1hcChbXG4gICAgICAgIC4uLnJlY29yZHMubWFwKFxuICAgICAgICAgIChyZWNvcmQsIGluZGV4KSA9PiBba2V5T2ZXaW5kb3cocmVjb3JkLndpbmRvdyksIGluZGV4XSBhcyBjb25zdCxcbiAgICAgICAgKSxcbiAgICAgICAgLi4ubm90T3Blbi5tYXAoXG4gICAgICAgICAgKHsga2V5IH0sIGluZGV4KSA9PiBba2V5LCBzYXZlZFdpbmRvd3MubGVuZ3RoICsgaW5kZXhdIGFzIGNvbnN0LFxuICAgICAgICApLFxuICAgICAgXSk7XG5cbiAgICAgIGNvbnN0IHRpbGluZyA9IHRvU2F2ZWRUaWxpbmcocGxhbiwgaW5kZXhCeUtleSk7XG5cbiAgICAgIHJ1bkluQWN0aW9uKCgpID0+XG4gICAgICAgIHNhdmVkTGF5b3V0cy5zZXQobmFtZSwge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgc2F2ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgICB3aW5kb3dzLFxuICAgICAgICAgIGRpc3BsYXlzOiBkaXNwbGF5cy5tYXAodG9TYXZlZERpc3BsYXkpLFxuICAgICAgICAgIHRpbGluZyxcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gd2luZG93cy5sZW5ndGg7XG4gICAgfTtcbiAgfSxcbn0pO1xuIiwgImltcG9ydCB7IGdldEluamVjdGFibGUyIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcbmltcG9ydCB7XG4gIGRpc3BsYXlSZWNvcmRzSW5qZWN0aW9uVG9rZW4sXG4gIGZvY3VzV2luZG93SW5qZWN0aW9uVG9rZW4sXG4gIHNldFdpbmRvd0JvdW5kc0luamVjdGlvblRva2VuLFxuICBzZXRXaW5kb3dTdGF0ZUluamVjdGlvblRva2VuLFxuICB3aW5kb3dSZWNvcmRzSW5qZWN0aW9uVG9rZW4sXG4gIHR5cGUgV2luZG93UGxhY2VtZW50LFxufSBmcm9tIFwiQGs4c2xlbnMvd2luZG93LWxheW91dC1jb250cmFjdHNcIjtcbmltcG9ydCB7IGJvdW5kc0luR3JpZCwgcmVzb2x2ZVRpbGluZ1BsYW4gfSBmcm9tIFwiLi90aWxpbmctcGxhblwiO1xuaW1wb3J0IHsgc3RvcmVkVGlsaW5nUGxhbkJ1bmNoIH0gZnJvbSBcIi4vdGlsaW5nLXBsYW4uaW5qZWN0YWJsZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpbGVSZXN1bHQge1xuICByZWFkb25seSB3aW5kb3dzOiBudW1iZXI7XG4gIHJlYWRvbmx5IGRpc3BsYXlzOiBudW1iZXI7XG4gIC8vIFRoZSBzY3JlZW5zIHdpbmRvd3Mgd2VyZSB0aWxlZCBvbi5cbiAgcmVhZG9ubHkgZGlzcGxheXNUaWxlZDogbnVtYmVyO1xuICByZWFkb25seSBwbGFjZWQ6IG51bWJlcjtcbn1cblxuLy8gVGlsZXMgdGhlIHdpbmRvd3MgYXMgdGhlIHRpbGluZyBwbGFuIHNheXM6IGVhY2ggb3ZlciB0aGUgY2VsbHMgaXQgc3BhbnMgaW4gaXRzIHNjcmVlbidzIGdyaWQsIGluXG4vLyB0aGUgcGxhbidzIG9yZGVyLiBBIHdpbmRvdyBtYXhpbWl6ZWQsIG1pbmltaXplZCBvciBmdWxsIHNjcmVlbiBzaG93cyBub3JtYWxseSBhZ2FpbiBmaXJzdCwgc28gaXRcbi8vIGNhbiBiZSBwbGFjZWQuIFdpbmRvd3MgdGhlIHBsYW4gbGVhdmVzIGFzIHRoZXkgYXJlIHN0YXkgc28uIEJyaW5ncyB0aGUgdGlsZWQgd2luZG93cyB0byB0aGVcbi8vIGZyb250LCB0aGUgb25lIHRoYXQgaGFkIGZvY3VzIGxhc3Qgc28gaXQga2VlcHMgaXQuXG5leHBvcnQgY29uc3QgdGlsZVdpbmRvd3NJbmplY3RhYmxlID0gZ2V0SW5qZWN0YWJsZTIoe1xuICBpZDogXCJ3aW5kb3ctbWFuYWdlci50aWxlLXdpbmRvd3NcIixcbiAgY29uc3VtcHRpb25zOiBbXG4gICAgd2luZG93UmVjb3Jkc0luamVjdGlvblRva2VuLFxuICAgIGRpc3BsYXlSZWNvcmRzSW5qZWN0aW9uVG9rZW4sXG4gICAgc2V0V2luZG93Qm91bmRzSW5qZWN0aW9uVG9rZW4sXG4gICAgc2V0V2luZG93U3RhdGVJbmplY3Rpb25Ub2tlbixcbiAgICBmb2N1c1dpbmRvd0luamVjdGlvblRva2VuLFxuICBdLFxuXG4gIGluc3RhbnRpYXRlOiAoZGkpID0+IHtcbiAgICBjb25zdCBnZXRXaW5kb3dSZWNvcmRzID0gZGkuaW5qZWN0KHdpbmRvd1JlY29yZHNJbmplY3Rpb25Ub2tlbikoKTtcbiAgICBjb25zdCBnZXREaXNwbGF5UmVjb3JkcyA9IGRpLmluamVjdChkaXNwbGF5UmVjb3Jkc0luamVjdGlvblRva2VuKSgpO1xuICAgIGNvbnN0IHNldFdpbmRvd0JvdW5kcyA9IGRpLmluamVjdChzZXRXaW5kb3dCb3VuZHNJbmplY3Rpb25Ub2tlbikoKTtcbiAgICBjb25zdCBzZXRXaW5kb3dTdGF0ZSA9IGRpLmluamVjdChzZXRXaW5kb3dTdGF0ZUluamVjdGlvblRva2VuKSgpO1xuICAgIGNvbnN0IGZvY3VzV2luZG93ID0gZGkuaW5qZWN0KGZvY3VzV2luZG93SW5qZWN0aW9uVG9rZW4pKCk7XG4gICAgY29uc3QgZ2V0U3RvcmVkUGxhbiA9IGRpLmluamVjdChzdG9yZWRUaWxpbmdQbGFuQnVuY2gucGVyc2lzdGFibGUpO1xuXG4gICAgY29uc3QgdGlsZVdpbmRvd3MgPSBhc3luYyAoKTogUHJvbWlzZTxUaWxlUmVzdWx0PiA9PiB7XG4gICAgICBjb25zdCBhbGxEaXNwbGF5cyA9IGF3YWl0IGdldERpc3BsYXlSZWNvcmRzKCk7XG4gICAgICBjb25zdCBhbGxXaW5kb3dzID0gYXdhaXQgZ2V0V2luZG93UmVjb3JkcygpO1xuICAgICAgY29uc3QgcGxhbiA9IHJlc29sdmVUaWxpbmdQbGFuKFxuICAgICAgICBhbGxXaW5kb3dzLFxuICAgICAgICBhbGxEaXNwbGF5cyxcbiAgICAgICAgKGF3YWl0IGdldFN0b3JlZFBsYW4oKSkuZ2V0KCkgPz8gdW5kZWZpbmVkLFxuICAgICAgKTtcbiAgICAgIC8vIEEgc2NyZWVuIG5vdCBjb25uZWN0ZWQgaXMgbm90IHRpbGVkOyBpdHMgd2luZG93cyBzdGF5IHdoZXJlIHRoZXkgYXJlLlxuICAgICAgLy8gTm9yIGlzIGEgd2luZG93IG5vdCBvcGVuLlxuICAgICAgY29uc3Qgc2NyZWVucyA9IHBsYW4uc2NyZWVuc1xuICAgICAgICAuZmlsdGVyKChzY3JlZW4pID0+ICFzY3JlZW4ubWlzc2luZylcbiAgICAgICAgLm1hcCgoc2NyZWVuKSA9PiAoe1xuICAgICAgICAgIC4uLnNjcmVlbixcbiAgICAgICAgICB3aW5kb3dzOiBzY3JlZW4ud2luZG93cy5maWx0ZXIoKGl0KSA9PiAhaXQubWlzc2luZyksXG4gICAgICAgIH0pKVxuICAgICAgICAuZmlsdGVyKChzY3JlZW4pID0+IHNjcmVlbi53aW5kb3dzLmxlbmd0aCA+IDApO1xuICAgICAgY29uc3QgdGlsZWQgPSBzY3JlZW5zLmZsYXRNYXAoKHNjcmVlbikgPT5cbiAgICAgICAgc2NyZWVuLndpbmRvd3MubWFwKChpdCkgPT4gaXQucmVjb3JkKSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHBsYWNlbWVudHM6IFdpbmRvd1BsYWNlbWVudFtdID0gc2NyZWVucy5mbGF0TWFwKChzY3JlZW4pID0+XG4gICAgICAgIHNjcmVlbi53aW5kb3dzLm1hcCgoaXQpID0+ICh7XG4gICAgICAgICAgd2luZG93OiBpdC5yZWNvcmQud2luZG93LFxuICAgICAgICAgIGJvdW5kczogYm91bmRzSW5HcmlkKFxuICAgICAgICAgICAgc2NyZWVuLmRpc3BsYXkud29ya0FyZWEuZ2V0KCksXG4gICAgICAgICAgICBzY3JlZW4uY29sdW1ucyxcbiAgICAgICAgICAgIHNjcmVlbi5yb3dzLFxuICAgICAgICAgICAgaXQsXG4gICAgICAgICAgKSxcbiAgICAgICAgfSkpLFxuICAgICAgKTtcblxuICAgICAgLy8gUmVhZCBiZWZvcmUgcGxhY2luZywgd2hpY2ggbWF5IG1vdmUgdGhlIGZvY3VzLlxuICAgICAgY29uc3QgdG9Gcm9udCA9IFsuLi50aWxlZF0uc29ydChcbiAgICAgICAgKGEsIGIpID0+IE51bWJlcihhLmlzRm9jdXNlZC5nZXQoKSkgLSBOdW1iZXIoYi5pc0ZvY3VzZWQuZ2V0KCkpLFxuICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCB3aW5kb3cgb2YgdGlsZWQpIHtcbiAgICAgICAgaWYgKHdpbmRvdy5zdGF0ZS5nZXQoKSAhPT0gXCJub3JtYWxcIikge1xuICAgICAgICAgIGF3YWl0IHNldFdpbmRvd1N0YXRlKHdpbmRvdy53aW5kb3csIFwibm9ybWFsXCIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHNldFdpbmRvd0JvdW5kcyhwbGFjZW1lbnRzKTtcblxuICAgICAgZm9yIChjb25zdCB3aW5kb3cgb2YgdG9Gcm9udCkge1xuICAgICAgICBhd2FpdCBmb2N1c1dpbmRvdyh3aW5kb3cud2luZG93KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd2luZG93czogYWxsV2luZG93cy5sZW5ndGgsXG4gICAgICAgIGRpc3BsYXlzOiBhbGxEaXNwbGF5cy5sZW5ndGgsXG4gICAgICAgIGRpc3BsYXlzVGlsZWQ6IHNjcmVlbnMubGVuZ3RoLFxuICAgICAgICBwbGFjZWQ6IHBsYWNlbWVudHMubGVuZ3RoLFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgcmV0dXJuICgpID0+IHRpbGVXaW5kb3dzO1xuICB9LFxufSk7XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0YWJsZTIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgY29tcHV0ZWQsIG9ic2VydmFibGUsIHJ1bkluQWN0aW9uLCB0eXBlIE9ic2VydmFibGVNYXAgfSBmcm9tIFwibW9ieFwiO1xuaW1wb3J0IHtcbiAgc2F2ZWRXaW5kb3dMYXlvdXRzQnVuY2gsXG4gIHR5cGUgU2F2ZWRXaW5kb3dMYXlvdXQsXG59IGZyb20gXCIuL3NhdmVkLXdpbmRvdy1sYXlvdXRzLmluamVjdGFibGVcIjtcblxuLy8gVGhlIHNhdmVkIGxheW91dHMsIG5ld2VzdCBmaXJzdCwgb3IgdW5kZWZpbmVkIHVudGlsIHRoZSBwZXJzaXN0ZWQgbWFwIGlzIHJlYWQuXG5leHBvcnQgY29uc3Qgd2luZG93TGF5b3V0TGlzdEluamVjdGFibGUgPSBnZXRJbmplY3RhYmxlMih7XG4gIGlkOiBcIndpbmRvdy1tYW5hZ2VyLndpbmRvdy1sYXlvdXQtbGlzdFwiLFxuXG4gIGluc3RhbnRpYXRlOiAoZGkpID0+IHtcbiAgICBjb25zdCBnZXRTYXZlZExheW91dHMgPSBkaS5pbmplY3Qoc2F2ZWRXaW5kb3dMYXlvdXRzQnVuY2gucGVyc2lzdGFibGUpO1xuICAgIGNvbnN0IHNhdmVkTGF5b3V0cyA9IG9ic2VydmFibGUuYm94PFxuICAgICAgT2JzZXJ2YWJsZU1hcDxzdHJpbmcsIFNhdmVkV2luZG93TGF5b3V0PiB8IHVuZGVmaW5lZFxuICAgID4odW5kZWZpbmVkLCB7XG4gICAgICBkZWVwOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIHZvaWQgZ2V0U2F2ZWRMYXlvdXRzKCkudGhlbigobGF5b3V0cykgPT5cbiAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHNhdmVkTGF5b3V0cy5zZXQobGF5b3V0cykpLFxuICAgICk7XG5cbiAgICBjb25zdCBsaXN0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgY29uc3QgbGF5b3V0cyA9IHNhdmVkTGF5b3V0cy5nZXQoKTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgbGF5b3V0cyAmJiBbLi4ubGF5b3V0cy52YWx1ZXMoKV0uc29ydCgoYSwgYikgPT4gYi5zYXZlZEF0IC0gYS5zYXZlZEF0KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiAoKSA9PiBsaXN0O1xuICB9LFxufSk7XG4iLCAiaW1wb3J0IHsgU3BhbiB9IGZyb20gXCJAazhzbGVucy9lbGVtZW50LWNvbXBvbmVudHNcIjtcbmltcG9ydCB7IERhbmdlckJ1dHRvbiwgUGxhaW5CdXR0b24gfSBmcm9tIFwiQGs4c2xlbnMvaW5wdXQtY29tcG9uZW50c1wiO1xuaW1wb3J0IHtcbiAgTW9kYWxDb250YWluZXIsXG4gIE1vZGFsQ29udGVudCxcbiAgTW9kYWxGb290ZXIsXG4gIE1vZGFsSGVhZGVyLFxufSBmcm9tIFwiQGs4c2xlbnMvbW9kYWwtY29tcG9uZW50c1wiO1xuaW1wb3J0IHtcbiAgZ2V0TW9kYWxJbmplY3RhYmxlQnVuY2gsXG4gIGdldE1vZGFsS2luZCxcbiAgdHlwZSBNb2RhbFByb3BzLFxuICB1c2VSZXNwb25kRnJvbU1vZGFsLFxufSBmcm9tIFwiQGs4c2xlbnMvbW9kYWwtY29udHJhY3RzXCI7XG5pbXBvcnQgeyBNb2RhbEVycm9yQm91bmRhcnkgfSBmcm9tIFwiLi9tb2RhbC1lcnJvci1ib3VuZGFyeVwiO1xuXG4vLyBBc2tzIHdoZXRoZXIgdG8gZGVsZXRlIHRoZSBsYXlvdXQgb2YgdGhlIG5hbWUsIGFuc3dlcmluZyB0cnVlIHRvIGRlbGV0ZSBpdC5cbmV4cG9ydCBjb25zdCBkZWxldGVMYXlvdXRNb2RhbEtpbmQgPSBnZXRNb2RhbEtpbmQ8W25hbWU6IHN0cmluZ10sIGJvb2xlYW4+KCkoXG4gIFwiZGVsZXRlLWxheW91dFwiLFxuKTtcblxuY29uc3QgRGVsZXRlTGF5b3V0TW9kYWwgPSAoe1xuICBpbnB1dDogW25hbWVdLFxufTogTW9kYWxQcm9wczx0eXBlb2YgZGVsZXRlTGF5b3V0TW9kYWxLaW5kPikgPT4ge1xuICBjb25zdCByZXNwb25kID0gdXNlUmVzcG9uZEZyb21Nb2RhbChkZWxldGVMYXlvdXRNb2RhbEtpbmQpO1xuXG4gIHJldHVybiAoXG4gICAgPE1vZGFsQ29udGFpbmVyXG4gICAgICAkc3R5bGU9e3sgd2lkdGg6IFwiY2FsYyh2YXIoLS11bml0KSAqIDkwKVwiLCBtYXhXaWR0aDogXCI5MHZ3XCIgfX1cbiAgICA+XG4gICAgICA8TW9kYWxIZWFkZXIgb25DbG9zZT17KCkgPT4gcmVzcG9uZChmYWxzZSl9PkRlbGV0ZSBsYXlvdXQ8L01vZGFsSGVhZGVyPlxuXG4gICAgICA8TW9kYWxDb250ZW50PlxuICAgICAgICA8U3Bhbj5cbiAgICAgICAgICBEZWxldGUgPFNwYW4gJGZvbnQ9e3sgYm9sZDogdHJ1ZSB9fT57bmFtZX08L1NwYW4+PyBXaGVyZSBpdHMgd2luZG93c1xuICAgICAgICAgIGdvIGFuZCBpdHMgdGlsaW5nIGFyZSBsb3N0LlxuICAgICAgICA8L1NwYW4+XG4gICAgICA8L01vZGFsQ29udGVudD5cblxuICAgICAgPE1vZGFsRm9vdGVyPlxuICAgICAgICA8UGxhaW5CdXR0b24gb25DbGljaz17KCkgPT4gcmVzcG9uZChmYWxzZSl9PkNhbmNlbDwvUGxhaW5CdXR0b24+XG4gICAgICAgIDxEYW5nZXJCdXR0b24gYXV0b0ZvY3VzIG9uQ2xpY2s9eygpID0+IHJlc3BvbmQodHJ1ZSl9PlxuICAgICAgICAgIERlbGV0ZVxuICAgICAgICA8L0RhbmdlckJ1dHRvbj5cbiAgICAgIDwvTW9kYWxGb290ZXI+XG4gICAgPC9Nb2RhbENvbnRhaW5lcj5cbiAgKTtcbn07XG5cbi8vIEFuc3dlcnMgbm8gd2hlbiB0aGUgZXh0ZW5zaW9uIHdhcyB1cGRhdGVkIHdoaWxlIGl0IHdhcyBvcGVuLCBzbyBub3RoaW5nIGlzIGRlbGV0ZWQgdW5hc2tlZC5cbmNvbnN0IE91dE9mRGF0ZU1vZGFsID0gKCkgPT4ge1xuICBjb25zdCByZXNwb25kID0gdXNlUmVzcG9uZEZyb21Nb2RhbChkZWxldGVMYXlvdXRNb2RhbEtpbmQpO1xuXG4gIHJldHVybiAoXG4gICAgPE1vZGFsQ29udGFpbmVyXG4gICAgICAkc3R5bGU9e3sgd2lkdGg6IFwiY2FsYyh2YXIoLS11bml0KSAqIDkwKVwiLCBtYXhXaWR0aDogXCI5MHZ3XCIgfX1cbiAgICA+XG4gICAgICA8TW9kYWxIZWFkZXIgb25DbG9zZT17KCkgPT4gcmVzcG9uZChmYWxzZSl9PkRlbGV0ZSBsYXlvdXQ8L01vZGFsSGVhZGVyPlxuICAgICAgPE1vZGFsQ29udGVudD5cbiAgICAgICAgPFNwYW4+XG4gICAgICAgICAgVGhpcyBkaWFsb2cgc3RvcHBlZCB3b3JraW5nLCBtb3N0IGxpa2VseSBiZWNhdXNlIHRoZSBleHRlbnNpb24gd2FzXG4gICAgICAgICAgdXBkYXRlZCB3aGlsZSBpdCB3YXMgb3Blbi5cbiAgICAgICAgPC9TcGFuPlxuICAgICAgPC9Nb2RhbENvbnRlbnQ+XG4gICAgICA8TW9kYWxGb290ZXI+XG4gICAgICAgIDxQbGFpbkJ1dHRvbiBvbkNsaWNrPXsoKSA9PiByZXNwb25kKGZhbHNlKX0+Q2xvc2U8L1BsYWluQnV0dG9uPlxuICAgICAgPC9Nb2RhbEZvb3Rlcj5cbiAgICA8L01vZGFsQ29udGFpbmVyPlxuICApO1xufTtcblxuY29uc3QgR3VhcmRlZERlbGV0ZUxheW91dE1vZGFsID0gKFxuICBwcm9wczogTW9kYWxQcm9wczx0eXBlb2YgZGVsZXRlTGF5b3V0TW9kYWxLaW5kPixcbikgPT4gKFxuICA8TW9kYWxFcnJvckJvdW5kYXJ5IGZhbGxiYWNrPXsoKSA9PiA8T3V0T2ZEYXRlTW9kYWwgLz59PlxuICAgIDxEZWxldGVMYXlvdXRNb2RhbCB7Li4ucHJvcHN9IC8+XG4gIDwvTW9kYWxFcnJvckJvdW5kYXJ5PlxuKTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZUxheW91dE1vZGFsQnVuY2ggPSBnZXRNb2RhbEluamVjdGFibGVCdW5jaCh7XG4gIGtpbmQ6IGRlbGV0ZUxheW91dE1vZGFsS2luZCxcbiAgQ29tcG9uZW50OiBHdWFyZGVkRGVsZXRlTGF5b3V0TW9kYWwsXG4gIG9uQ2xvc2U6ICgpID0+IGZhbHNlLFxufSk7XG4iLCAiaW1wb3J0IHsgQ29tcG9uZW50LCB0eXBlIFJlYWN0Tm9kZSB9IGZyb20gXCJyZWFjdFwiO1xuXG5pbnRlcmZhY2UgTW9kYWxFcnJvckJvdW5kYXJ5UHJvcHMge1xuICByZWFkb25seSBmYWxsYmFjazogKGVycm9yOiB1bmtub3duKSA9PiBSZWFjdE5vZGU7XG4gIHJlYWRvbmx5IGNoaWxkcmVuOiBSZWFjdE5vZGU7XG59XG5cbi8qKlxuICogS2VlcHMgYSBmYWlsdXJlIGluc2lkZSB0aGUgbW9kYWwgZnJvbSB0YWtpbmcgZG93biB0aGUgd2luZG93IGl0IGlzIHNob3duIGluLiBBIG1vZGFsIHN0YXlzIG9wZW5cbiAqIHdoaWxlIHRoZSBleHRlbnNpb24gaXMgcmVsb2FkZWQgdW5kZXIgaXQsIGFzIHdoZW4gaXQgaXMgcmVidWlsdCBkdXJpbmcgZGV2ZWxvcG1lbnQsIGFuZCB0aGVuXG4gKiByZW5kZXJzIHdpdGggaW5qZWN0YWJsZXMgbm8gbG9uZ2VyIHJlZ2lzdGVyZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2RhbEVycm9yQm91bmRhcnkgZXh0ZW5kcyBDb21wb25lbnQ8XG4gIE1vZGFsRXJyb3JCb3VuZGFyeVByb3BzLFxuICB7IGVycm9yPzogdW5rbm93bjsgZmFpbGVkOiBib29sZWFuIH1cbj4ge1xuICBzdGF0ZTogeyBlcnJvcj86IHVua25vd247IGZhaWxlZDogYm9vbGVhbiB9ID0geyBmYWlsZWQ6IGZhbHNlIH07XG5cbiAgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvcjogdW5rbm93bikge1xuICAgIHJldHVybiB7IGVycm9yLCBmYWlsZWQ6IHRydWUgfTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5mYWlsZWRcbiAgICAgID8gdGhpcy5wcm9wcy5mYWxsYmFjayh0aGlzLnN0YXRlLmVycm9yKVxuICAgICAgOiB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgQnV0dG9uLCBTcGFuIH0gZnJvbSBcIkBrOHNsZW5zL2VsZW1lbnQtY29tcG9uZW50c1wiO1xuaW1wb3J0IHtcbiAgZ2V0SG90YmFySXRlbUtpbmRJbmplY3RhYmxlQnVuY2gsXG4gIHR5cGUgSG90YmFySXRlbVByb3BzLFxufSBmcm9tIFwiQGs4c2xlbnMvaG90YmFyLWNvbnRyYWN0c1wiO1xuaW1wb3J0IHsgRGFzaGJvYXJkSWNvbiB9IGZyb20gXCJAazhzbGVucy9pY29uXCI7XG5pbXBvcnQgeyBkcm9wRG93bk1lbnUgfSBmcm9tIFwiQGs4c2xlbnMvZHJvcC1kb3duLW1lbnUtY29udHJhY3RzXCI7XG5pbXBvcnQgeyBnZXRJbmplY3RhYmxlMiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyB1c2VJbmplY3QgfSBmcm9tIFwiQGs4c2xlbnMvdXNlLWluamVjdFwiO1xuaW1wb3J0IHsgb2JzZXJ2ZXIgfSBmcm9tIFwibW9ieC1yZWFjdFwiO1xuaW1wb3J0IHsgbGF5b3V0SG90YmFySXRlbUtpbmQgfSBmcm9tIFwiLi4vbGF5b3V0cy9sYXlvdXQtaW4taG90YmFyLmluamVjdGFibGVcIjtcbmltcG9ydCB7IGxheW91dEhvdGJhck1lbnVLaW5kIH0gZnJvbSBcIi4vbGF5b3V0LWhvdGJhci1tZW51LmluamVjdGFibGVcIjtcbmltcG9ydCB7IHJlY2FsbEZyb21Ib3RiYXJJbmplY3RhYmxlIH0gZnJvbSBcIi4vcmVjYWxsLWZyb20taG90YmFyLmluamVjdGFibGVcIjtcbmltcG9ydCB7IHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUgfSBmcm9tIFwiLi93aW5kb3ctbGF5b3V0cy1tb2RlbC5pbmplY3RhYmxlXCI7XG5cbi8vIE9uZSBtZW51IHBlciBsYXlvdXQgcmF0aGVyIHRoYW4gb25lIHBlciByZW5kZXIsIHNvIHRoYXQgdGhlIGl0ZW0gaXMgbm90IGhhbmRlZCBhIG5ldyBtZW51IHRvXG4vLyBvcGVuIHdoZW5ldmVyIGl0IHJlbmRlcnMuIEJlc2lkZSB0aGUgaXRlbSwgY2VudHJlZCBvbiBpdCwgd2l0aCBhIGdhcCBzbWFsbCBlbm91Z2ggdGhhdCB0aGVcbi8vIHBvaW50ZXIgb24gaXRzIHdheSBpbnRvIHRoZSBtZW51IGRvZXMgbm90IGxlYXZlIGJvdGguXG5leHBvcnQgY29uc3QgbGF5b3V0TWVudU9mSXRlbUluamVjdGFibGUgPSBnZXRJbmplY3RhYmxlMih7XG4gIGlkOiBcIndpbmRvdy1tYW5hZ2VyLmxheW91dC1tZW51LW9mLWl0ZW1cIixcblxuICBpbnN0YW50aWF0ZTogKCkgPT4ge1xuICAgIGNvbnN0IG1lbnVzID0gbmV3IE1hcDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIG1lbnVPZj4+KCk7XG4gICAgY29uc3QgbWVudU9mID0gKG5hbWU6IHN0cmluZykgPT5cbiAgICAgIGRyb3BEb3duTWVudShsYXlvdXRIb3RiYXJNZW51S2luZCwge1xuICAgICAgICBkYXRhOiB7IG5hbWUgfSxcbiAgICAgICAgb3Blbk9uOiBcImhvdmVyXCIsXG4gICAgICAgIHBvc2l0aW9uOiBcInJpZ2h0XCIsXG4gICAgICAgIGdhcDogXCJ4eHNcIixcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IG1lbnUgPSBtZW51cy5nZXQobmFtZSkgPz8gbWVudU9mKG5hbWUpO1xuXG4gICAgICBtZW51cy5zZXQobmFtZSwgbWVudSk7XG5cbiAgICAgIHJldHVybiBtZW51O1xuICAgIH07XG4gIH0sXG59KTtcblxuLy8gXCJMYXlvdXQgMlwiIGFzIFwiTDJcIiwgXCJXb3JrXCIgYXMgXCJXT1wiOiB3aGF0IHRlbGxzIHBpbm5lZCBsYXlvdXRzIGFwYXJ0IGF0IGEgZ2xhbmNlLlxuY29uc3QgaW5pdGlhbHNPZiA9IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgY29uc3Qgd29yZHMgPSBuYW1lLnRyaW0oKS5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKTtcblxuICByZXR1cm4gKFxuICAgIHdvcmRzLmxlbmd0aCA+IDEgPyB3b3Jkc1swXVswXSArIHdvcmRzWzFdWzBdIDogbmFtZS50cmltKCkuc2xpY2UoMCwgMilcbiAgKS50b1VwcGVyQ2FzZSgpO1xufTtcblxuY29uc3QgTGF5b3V0SG90YmFySXRlbSA9IG9ic2VydmVyKFxuICAoe1xuICAgIHBlcnNpc3RlZERhdGE6IHsgbmFtZSB9LFxuICB9OiBIb3RiYXJJdGVtUHJvcHM8dHlwZW9mIGxheW91dEhvdGJhckl0ZW1LaW5kPikgPT4ge1xuICAgIGNvbnN0IG1vZGVsID0gdXNlSW5qZWN0KHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUpKCk7XG4gICAgY29uc3QgcmVjYWxsID0gdXNlSW5qZWN0KHJlY2FsbEZyb21Ib3RiYXJJbmplY3RhYmxlKSgpO1xuICAgIGNvbnN0IG1lbnUgPSB1c2VJbmplY3QobGF5b3V0TWVudU9mSXRlbUluamVjdGFibGUpKCkobmFtZSk7XG4gICAgY29uc3QgbGF5b3V0cyA9IG1vZGVsLmxheW91dHMuZ2V0KCk7XG4gICAgLy8gVGFrZW4gZm9yIHRoZXJlIHVudGlsIHRoZSBsYXlvdXRzIGFyZSByZWFkLlxuICAgIGNvbnN0IGV4aXN0cyA9ICFsYXlvdXRzIHx8IGxheW91dHMuc29tZSgoaXQpID0+IGl0Lm5hbWUgPT09IG5hbWUpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxCdXR0b25cbiAgICAgICAgJGludGVyYWN0aXZlXG4gICAgICAgIC8vIFRoZSB3aG9sZSBzbG90LCBzbyB0aGUgbWVudSBvcGVucyBiZXNpZGUgdGhlIHNsb3QgcmF0aGVyIHRoYW4gb3ZlciBpdC5cbiAgICAgICAgJHdpZHRoPVwiZnVsbFwiXG4gICAgICAgICRoZWlnaHQ9XCJmdWxsXCJcbiAgICAgICAgJGVuYWJsZWQ9e2V4aXN0cyAmJiBtb2RlbC5jYW5BcnJhbmdlLmdldCgpfVxuICAgICAgICAkZmxleD17e1xuICAgICAgICAgIGRpcmVjdGlvbjogXCJ2ZXJ0aWNhbFwiLFxuICAgICAgICAgIHZlcnRpY2FsQWxpZ246IFwiY2VudGVyXCIsXG4gICAgICAgICAgaG9yaXpvbnRhbEFsaWduOiBcImNlbnRlclwiLFxuICAgICAgICB9fVxuICAgICAgICBhcmlhLWxhYmVsPXtgUmVjYWxsICR7bmFtZX1gfVxuICAgICAgICAvLyBUaGUgbGF5b3V0J3MgdGlsaW5nLCBhbmQgcmVjYWxsaW5nIG9yIGVkaXRpbmcgaXQsIGFzIHRoZSBwb2ludGVyIGlzIG9uIHRoZSBpdGVtLlxuICAgICAgICAkYW5jaG9yXG4gICAgICAgICRkcm9wRG93bk1lbnU9e21lbnV9XG4gICAgICAgICRvbkNsaWNrPXsoKSA9PiB2b2lkIHJlY2FsbChuYW1lKX1cbiAgICAgID5cbiAgICAgICAgPERhc2hib2FyZEljb24gJHNpemU9XCJsXCIgJGNvbG9yPXtleGlzdHMgPyBcInByaW1hcnlcIiA6IFwidGV4dE11dGVkXCJ9IC8+XG4gICAgICAgIDxTcGFuICRmb250PXt7IHNpemU6IFwieHNcIiwgYm9sZDogdHJ1ZSB9fSAkY29sb3I9XCJ0ZXh0TXV0ZWRcIj5cbiAgICAgICAgICB7aW5pdGlhbHNPZihuYW1lKX1cbiAgICAgICAgPC9TcGFuPlxuICAgICAgPC9CdXR0b24+XG4gICAgKTtcbiAgfSxcbik7XG5cbmV4cG9ydCBkZWZhdWx0IGdldEhvdGJhckl0ZW1LaW5kSW5qZWN0YWJsZUJ1bmNoKHtcbiAga2luZDogbGF5b3V0SG90YmFySXRlbUtpbmQsXG4gIENvbXBvbmVudDogTGF5b3V0SG90YmFySXRlbSxcbn0pO1xuIiwgImltcG9ydCB7XG4gIGdldERyb3BEb3duTWVudUl0ZW1JbmplY3RhYmxlQnVuY2gsXG4gIGdldERyb3BEb3duTWVudUtpbmQsXG59IGZyb20gXCJAazhzbGVucy9kcm9wLWRvd24tbWVudS1jb250cmFjdHNcIjtcbmltcG9ydCB7XG4gIERyb3BEb3duTWVudUl0ZW1Sb3csXG4gIERyb3BEb3duTWVudVNlcGFyYXRvcixcbn0gZnJvbSBcIkBrOHNsZW5zL2Ryb3AtZG93bi1tZW51LWl0ZW1zXCI7XG5pbXBvcnQgeyBMaSwgU3BhbiB9IGZyb20gXCJAazhzbGVucy9lbGVtZW50LWNvbXBvbmVudHNcIjtcbmltcG9ydCB7IEVkaXRJY29uLCBIaXN0b3J5SWNvbiwgU2F2ZUljb24gfSBmcm9tIFwiQGs4c2xlbnMvaWNvblwiO1xuaW1wb3J0IHsgdXNlSW5qZWN0IH0gZnJvbSBcIkBrOHNsZW5zL3VzZS1pbmplY3RcIjtcbmltcG9ydCB7IG9ic2VydmVyIH0gZnJvbSBcIm1vYngtcmVhY3RcIjtcbmltcG9ydCB7IHByZXZpZXdPZiB9IGZyb20gXCIuLi9sYXlvdXRzL2xheW91dC1wcmV2aWV3XCI7XG5pbXBvcnQgeyBMYXlvdXRQcmV2aWV3IH0gZnJvbSBcIi4vbGF5b3V0LXByZXZpZXdcIjtcbmltcG9ydCB7IG9wZW5XaW5kb3dMYXlvdXRzSW5qZWN0YWJsZSB9IGZyb20gXCIuL29wZW4td2luZG93LWxheW91dHMuaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgcmVjYWxsRnJvbUhvdGJhckluamVjdGFibGUgfSBmcm9tIFwiLi9yZWNhbGwtZnJvbS1ob3RiYXIuaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgc2F2ZUZyb21Ib3RiYXJJbmplY3RhYmxlIH0gZnJvbSBcIi4vc2F2ZS1mcm9tLWhvdGJhci5pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyBzaG93V2luZG93RnJvbUhvdGJhckluamVjdGFibGUgfSBmcm9tIFwiLi9zaG93LXdpbmRvdy1mcm9tLWhvdGJhci5pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyB3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlIH0gZnJvbSBcIi4vd2luZG93LWxheW91dHMtbW9kZWwuaW5qZWN0YWJsZVwiO1xuXG4vLyBUaGUgbWVudSBhIGxheW91dCdzIGhvdGJhciBpdGVtIG9wZW5zIGFzIHRoZSBwb2ludGVyIGlzIG9uIGl0OiB0aGUgbGF5b3V0J3MgdGlsaW5nLCBhbmQgd2hhdCBjYW5cbi8vIGJlIGRvbmUgd2l0aCB0aGUgbGF5b3V0LlxuZXhwb3J0IGNvbnN0IGxheW91dEhvdGJhck1lbnVLaW5kID0gZ2V0RHJvcERvd25NZW51S2luZDx7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn0+KCkoXCJ3aW5kb3ctbWFuYWdlci1sYXlvdXQtaG90YmFyLW1lbnVcIik7XG5cbmNvbnN0IFByZXZpZXcgPSBvYnNlcnZlcigoeyBkYXRhOiB7IG5hbWUgfSB9OiB7IGRhdGE6IHsgbmFtZTogc3RyaW5nIH0gfSkgPT4ge1xuICBjb25zdCBtb2RlbCA9IHVzZUluamVjdCh3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlKSgpO1xuICBjb25zdCBzaG93V2luZG93ID0gdXNlSW5qZWN0KHNob3dXaW5kb3dGcm9tSG90YmFySW5qZWN0YWJsZSkoKTtcbiAgY29uc3QgbGF5b3V0ID0gbW9kZWwubGF5b3V0cy5nZXQoKT8uZmluZCgoaXQpID0+IGl0Lm5hbWUgPT09IG5hbWUpO1xuXG4gIHJldHVybiAoXG4gICAgPExpXG4gICAgICAkcGFkZGluZz17eyB2ZXJ0aWNhbDogXCJzXCIsIGhvcml6b250YWw6IFwibVwiIH19XG4gICAgICAkZmxleD17eyBkaXJlY3Rpb246IFwidmVydGljYWxcIiwgZ2FwOiBcInNcIiB9fVxuICAgID5cbiAgICAgIDxTcGFuICRmb250PXt7IGJvbGQ6IHRydWUgfX0+e25hbWV9PC9TcGFuPlxuICAgICAge2xheW91dCA/IChcbiAgICAgICAgPExheW91dFByZXZpZXdcbiAgICAgICAgICBwcmV2aWV3PXtwcmV2aWV3T2YoXG4gICAgICAgICAgICBsYXlvdXQsXG4gICAgICAgICAgICBtb2RlbC5ub3RPcGVuT2YobGF5b3V0KSxcbiAgICAgICAgICAgIG1vZGVsLm1pc3NpbmdTY3JlZW5JZHNPZihsYXlvdXQpLFxuICAgICAgICAgICAgbW9kZWwubm90U2F2ZWRPZihsYXlvdXQpLFxuICAgICAgICAgICl9XG4gICAgICAgICAgb25XaW5kb3dDbGljaz17KGluZGV4LCB0aXRsZSkgPT4gdm9pZCBzaG93V2luZG93KG5hbWUsIGluZGV4LCB0aXRsZSl9XG4gICAgICAgIC8+XG4gICAgICApIDogKFxuICAgICAgICA8U3BhbiAkY29sb3I9XCJ0ZXh0TXV0ZWRcIiAkZm9udD17eyBzaXplOiBcInNcIiB9fT5cbiAgICAgICAgICBUaGVyZSBpcyBubyBsYXlvdXQgY2FsbGVkIFwie25hbWV9XCIgYW55IG1vcmUuXG4gICAgICAgIDwvU3Bhbj5cbiAgICAgICl9XG4gICAgPC9MaT5cbiAgKTtcbn0pO1xuXG5jb25zdCBSZWNhbGwgPSBvYnNlcnZlcigoeyBkYXRhOiB7IG5hbWUgfSB9OiB7IGRhdGE6IHsgbmFtZTogc3RyaW5nIH0gfSkgPT4ge1xuICBjb25zdCBtb2RlbCA9IHVzZUluamVjdCh3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlKSgpO1xuICBjb25zdCByZWNhbGwgPSB1c2VJbmplY3QocmVjYWxsRnJvbUhvdGJhckluamVjdGFibGUpKCk7XG4gIGNvbnN0IGV4aXN0cyA9ICEhbW9kZWwubGF5b3V0cy5nZXQoKT8uc29tZSgoaXQpID0+IGl0Lm5hbWUgPT09IG5hbWUpO1xuXG4gIHJldHVybiAoXG4gICAgPERyb3BEb3duTWVudUl0ZW1Sb3dcbiAgICAgIEljb249e0hpc3RvcnlJY29ufVxuICAgICAgJGVuYWJsZWQ9e2V4aXN0cyAmJiBtb2RlbC5jYW5BcnJhbmdlLmdldCgpfVxuICAgICAgJG9uQ2xpY2s9eygpID0+IHZvaWQgcmVjYWxsKG5hbWUpfVxuICAgID5cbiAgICAgIFJlY2FsbFxuICAgIDwvRHJvcERvd25NZW51SXRlbVJvdz5cbiAgKTtcbn0pO1xuXG5jb25zdCBTYXZlID0gb2JzZXJ2ZXIoKHsgZGF0YTogeyBuYW1lIH0gfTogeyBkYXRhOiB7IG5hbWU6IHN0cmluZyB9IH0pID0+IHtcbiAgY29uc3QgbW9kZWwgPSB1c2VJbmplY3Qod2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSkoKTtcbiAgY29uc3Qgc2F2ZSA9IHVzZUluamVjdChzYXZlRnJvbUhvdGJhckluamVjdGFibGUpKCk7XG4gIGNvbnN0IGV4aXN0cyA9ICEhbW9kZWwubGF5b3V0cy5nZXQoKT8uc29tZSgoaXQpID0+IGl0Lm5hbWUgPT09IG5hbWUpO1xuXG4gIHJldHVybiAoXG4gICAgPERyb3BEb3duTWVudUl0ZW1Sb3dcbiAgICAgIEljb249e1NhdmVJY29ufVxuICAgICAgJGVuYWJsZWQ9e2V4aXN0cyAmJiBtb2RlbC5jYW5BcnJhbmdlLmdldCgpfVxuICAgICAgJHRvb2x0aXA9XCJQdXQgdGhlIHdpbmRvd3MgaW4gdGhlaXIgdGlsZXMsIHRoZW4gc2F2ZSB0aGVtIGludG8gdGhpcyBsYXlvdXQ7IHdpbmRvd3MgaXQgaGFzIG5vIHRpbGUgZm9yIGFyZSBzYXZlZCBhcyBub3QgdGlsZWRcIlxuICAgICAgJG9uQ2xpY2s9eygpID0+IHZvaWQgc2F2ZShuYW1lKX1cbiAgICA+XG4gICAgICBUaWxlIGFuZCBzYXZlXG4gICAgPC9Ecm9wRG93bk1lbnVJdGVtUm93PlxuICApO1xufSk7XG5cbmNvbnN0IEVkaXQgPSBvYnNlcnZlcigoeyBkYXRhOiB7IG5hbWUgfSB9OiB7IGRhdGE6IHsgbmFtZTogc3RyaW5nIH0gfSkgPT4ge1xuICBjb25zdCBtb2RlbCA9IHVzZUluamVjdCh3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlKSgpO1xuICBjb25zdCBvcGVuV2luZG93TGF5b3V0cyA9IHVzZUluamVjdChvcGVuV2luZG93TGF5b3V0c0luamVjdGFibGUpKCk7XG4gIGNvbnN0IGV4aXN0cyA9ICEhbW9kZWwubGF5b3V0cy5nZXQoKT8uc29tZSgoaXQpID0+IGl0Lm5hbWUgPT09IG5hbWUpO1xuXG4gIHJldHVybiAoXG4gICAgPERyb3BEb3duTWVudUl0ZW1Sb3dcbiAgICAgIEljb249e0VkaXRJY29ufVxuICAgICAgJGVuYWJsZWQ9e2V4aXN0c31cbiAgICAgICRvbkNsaWNrPXsoKSA9PiB2b2lkIG9wZW5XaW5kb3dMYXlvdXRzKG5hbWUpfVxuICAgID5cbiAgICAgIEVkaXQgaW4gV2luZG93IGxheW91dHNcbiAgICA8L0Ryb3BEb3duTWVudUl0ZW1Sb3c+XG4gICk7XG59KTtcblxuY29uc3QgU2VwYXJhdG9yID0gKCkgPT4gPERyb3BEb3duTWVudVNlcGFyYXRvciAvPjtcblxuZXhwb3J0IGNvbnN0IGxheW91dEhvdGJhck1lbnVQcmV2aWV3QnVuY2ggPSBnZXREcm9wRG93bk1lbnVJdGVtSW5qZWN0YWJsZUJ1bmNoKHtcbiAgaWQ6IFwid2luZG93LW1hbmFnZXItbGF5b3V0LWhvdGJhci1tZW51LXByZXZpZXdcIixcbiAga2luZDogbGF5b3V0SG90YmFyTWVudUtpbmQsXG4gIG9yZGVyTnVtYmVyOiAxMCxcbiAgQ29tcG9uZW50OiBQcmV2aWV3LFxufSk7XG5cbmV4cG9ydCBjb25zdCBsYXlvdXRIb3RiYXJNZW51U2VwYXJhdG9yQnVuY2ggPVxuICBnZXREcm9wRG93bk1lbnVJdGVtSW5qZWN0YWJsZUJ1bmNoKHtcbiAgICBpZDogXCJ3aW5kb3ctbWFuYWdlci1sYXlvdXQtaG90YmFyLW1lbnUtc2VwYXJhdG9yXCIsXG4gICAga2luZDogbGF5b3V0SG90YmFyTWVudUtpbmQsXG4gICAgb3JkZXJOdW1iZXI6IDIwLFxuICAgIENvbXBvbmVudDogU2VwYXJhdG9yLFxuICB9KTtcblxuZXhwb3J0IGNvbnN0IGxheW91dEhvdGJhck1lbnVSZWNhbGxCdW5jaCA9IGdldERyb3BEb3duTWVudUl0ZW1JbmplY3RhYmxlQnVuY2goe1xuICBpZDogXCJ3aW5kb3ctbWFuYWdlci1sYXlvdXQtaG90YmFyLW1lbnUtcmVjYWxsXCIsXG4gIGtpbmQ6IGxheW91dEhvdGJhck1lbnVLaW5kLFxuICBvcmRlck51bWJlcjogMzAsXG4gIENvbXBvbmVudDogUmVjYWxsLFxufSk7XG5cbmV4cG9ydCBjb25zdCBsYXlvdXRIb3RiYXJNZW51U2F2ZUJ1bmNoID0gZ2V0RHJvcERvd25NZW51SXRlbUluamVjdGFibGVCdW5jaCh7XG4gIGlkOiBcIndpbmRvdy1tYW5hZ2VyLWxheW91dC1ob3RiYXItbWVudS1zYXZlXCIsXG4gIGtpbmQ6IGxheW91dEhvdGJhck1lbnVLaW5kLFxuICBvcmRlck51bWJlcjogMzUsXG4gIENvbXBvbmVudDogU2F2ZSxcbn0pO1xuXG5leHBvcnQgY29uc3QgbGF5b3V0SG90YmFyTWVudUVkaXRCdW5jaCA9IGdldERyb3BEb3duTWVudUl0ZW1JbmplY3RhYmxlQnVuY2goe1xuICBpZDogXCJ3aW5kb3ctbWFuYWdlci1sYXlvdXQtaG90YmFyLW1lbnUtZWRpdFwiLFxuICBraW5kOiBsYXlvdXRIb3RiYXJNZW51S2luZCxcbiAgb3JkZXJOdW1iZXI6IDQwLFxuICBDb21wb25lbnQ6IEVkaXQsXG59KTtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIERpc3BsYXlSZWNvcmQsXG4gIFdpbmRvd0JvdW5kcyxcbn0gZnJvbSBcIkBrOHNsZW5zL3dpbmRvdy1sYXlvdXQtY29udHJhY3RzXCI7XG5pbXBvcnQgeyBpc0FwcGxpY2F0aW9uV2luZG93IH0gZnJvbSBcIkBrOHNsZW5zL21lc3NhZ2luZy1jb250cmFjdHNcIjtcbmltcG9ydCB7IGNvbHVtbnNGb3IgfSBmcm9tIFwiLi9ncmlkXCI7XG5pbXBvcnQgdHlwZSB7IFNhdmVkV2luZG93TGF5b3V0IH0gZnJvbSBcIi4vc2F2ZWQtd2luZG93LWxheW91dHMuaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgYm91bmRzSW5HcmlkLCBwbGFjZUluR3JpZCwgcmVjb25uZWN0ZWRJZE9mIH0gZnJvbSBcIi4vdGlsaW5nLXBsYW5cIjtcblxuZXhwb3J0IGludGVyZmFjZSBQcmV2aWV3V2luZG93IHtcbiAgLy8gSXRzIHBsYWNlIGluIHRoZSBsYXlvdXQncyB3aW5kb3dzLlxuICByZWFkb25seSBpbmRleDogbnVtYmVyO1xuICByZWFkb25seSB0aXRsZTogc3RyaW5nO1xuICByZWFkb25seSBpc09wZW46IGJvb2xlYW47XG4gIC8vIFdoZXRoZXIgdGhlIHdpbmRvdyBpcyBvcGVuIGJ1dCBub3Qgd2hlcmUgb3IgYXMgdGhlIGxheW91dCBzYXZlZCBpdC5cbiAgcmVhZG9ubHkgaXNTYXZlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgaXNBcHBsaWNhdGlvbldpbmRvdzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgY29sdW1uOiBudW1iZXI7XG4gIHJlYWRvbmx5IHJvdzogbnVtYmVyO1xuICByZWFkb25seSBjb2x1bW5zOiBudW1iZXI7XG4gIHJlYWRvbmx5IHJvd3M6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmV2aWV3U2NyZWVuIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgbGFiZWw/OiBzdHJpbmc7XG4gIC8vIFdoZXRoZXIgdGhlIHNjcmVlbiBpcyBub3QgY29ubmVjdGVkIG5vdy5cbiAgcmVhZG9ubHkgbWlzc2luZzogYm9vbGVhbjtcbiAgLy8gV2hlcmUgdGhlIHNjcmVlbidzIHdpbmRvd3MgZ28sIGFtb25nIHRoZSBvdGhlciBzY3JlZW5zLCB0byBkcmF3IHRoZSBzY3JlZW5zIGFzIHRoZXkgbGllLlxuICByZWFkb25seSBhcmVhOiBXaW5kb3dCb3VuZHM7XG4gIHJlYWRvbmx5IGNvbHVtbnM6IG51bWJlcjtcbiAgcmVhZG9ubHkgcm93czogbnVtYmVyO1xuICByZWFkb25seSB3aW5kb3dzOiByZWFkb25seSBQcmV2aWV3V2luZG93W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0UHJldmlldyB7XG4gIHJlYWRvbmx5IHNjcmVlbnM6IHJlYWRvbmx5IFByZXZpZXdTY3JlZW5bXTtcbiAgLy8gVGhlIHRpdGxlcyBvZiB0aGUgd2luZG93cyB0aGUgbGF5b3V0IGxlYXZlcyB1bnRpbGVkLlxuICByZWFkb25seSB1bnRpbGVkOiByZWFkb25seSBzdHJpbmdbXTtcbiAgLy8gSG93IG1hbnkgb2YgdGhlIGxheW91dCdzIHdpbmRvd3MgYXJlIG5vdCBvcGVuIG5vdy5cbiAgcmVhZG9ubHkgbm90T3BlbjogbnVtYmVyO1xuICAvLyBIb3cgbWFueSBvZiB0aGVtIGFyZSBvcGVuIGJ1dCBub3Qgd2hlcmUgb3IgYXMgdGhlIGxheW91dCBzYXZlZCB0aGVtLlxuICByZWFkb25seSBub3RTYXZlZDogbnVtYmVyO1xufVxuXG4vLyBUaGUgdGlsaW5nIGEgbGF5b3V0IHNhdmVkLCBzY3JlZW4gYnkgc2NyZWVuLCBpdHMgd2luZG93cyBwbGFjZWQgaW4gdGhlIGdyaWRzIGFzIHRoZSBlZGl0b3Jcbi8vIHBsYWNlcyB0aGVtOyBubyBzY3JlZW5zIGZvciBhIGxheW91dCBzYXZlZCB3aXRob3V0IGEgdGlsaW5nLlxudHlwZSBTYXZlZFRpbGluZyA9IE5vbk51bGxhYmxlPFNhdmVkV2luZG93TGF5b3V0W1widGlsaW5nXCJdPjtcblxuLy8gVGhlIGdyaWQgb2YgYSBzY3JlZW4gb2YgdGhlIHRpbGluZywgaXRzIHdpbmRvd3MgcGxhY2VkIGluIGl0IGFzIHRoZSBlZGl0b3IgcGxhY2VzIHRoZW0uXG5jb25zdCBncmlkT2YgPSAodGlsaW5nOiBTYXZlZFRpbGluZywgaWQ6IHN0cmluZykgPT4ge1xuICBjb25zdCBvblNjcmVlbiA9IHRpbGluZy53aW5kb3dzLmZpbHRlcigoaXQpID0+IFN0cmluZyhpdC5kaXNwbGF5SWQpID09PSBpZCk7XG4gIGNvbnN0IGNvbHVtbnMgPSBNYXRoLm1heChcbiAgICB0aWxpbmcuY29sdW1uc1tpZF0gPz9cbiAgICAgIGNvbHVtbnNGb3IoXG4gICAgICAgIG9uU2NyZWVuLnJlZHVjZSgoc3VtLCBpdCkgPT4gc3VtICsgaXQuY29sdW1ucyAqIGl0LnJvd3MsIDApIHx8IDEsXG4gICAgICApLFxuICAgIDEsXG4gICk7XG4gIGNvbnN0IHsgcGxhY2VkLCByb3dzIH0gPSBwbGFjZUluR3JpZChvblNjcmVlbiwgY29sdW1ucyk7XG5cbiAgcmV0dXJuIHtcbiAgICBwbGFjZWQsXG4gICAgY29sdW1ucyxcbiAgICByb3dzOiBNYXRoLm1heChyb3dzLCB0aWxpbmcucm93c1tpZF0gPz8gMCwgMSksXG4gIH07XG59O1xuXG4vLyBXaGVyZSB0aGUgbGF5b3V0J3MgdGlsaW5nIHB1dHMgZWFjaCB3aW5kb3cgaXQgdGlsZXMgb24gYSBzY3JlZW4gY29ubmVjdGVkIG5vdywgYnkgaXRzIHBsYWNlIGluXG4vLyB0aGUgbGF5b3V0OiBhIHNjcmVlbiBjb25uZWN0ZWQgYWdhaW4gdW5kZXIgYW5vdGhlciBpZCBpcyB0aGUgb25lIHNhdmVkIHN0aWxsLlxuZXhwb3J0IGNvbnN0IHRpbGVCb3VuZHNPZiA9IChcbiAgbGF5b3V0OiBTYXZlZFdpbmRvd0xheW91dCxcbiAgZGlzcGxheXM6IHJlYWRvbmx5IERpc3BsYXlSZWNvcmRbXSxcbik6IFJlYWRvbmx5TWFwPG51bWJlciwgV2luZG93Qm91bmRzPiA9PiB7XG4gIGNvbnN0IHRpbGluZyA9IGxheW91dC50aWxpbmc7XG5cbiAgaWYgKCF0aWxpbmcpIHtcbiAgICByZXR1cm4gbmV3IE1hcCgpO1xuICB9XG5cbiAgY29uc3QgaWRzID0gbmV3IFNldChcbiAgICB0aWxpbmcud2luZG93cy5mbGF0TWFwKChpdCkgPT5cbiAgICAgIGl0LmRpc3BsYXlJZCA9PT0gbnVsbCA/IFtdIDogW1N0cmluZyhpdC5kaXNwbGF5SWQpXSxcbiAgICApLFxuICApO1xuXG4gIHJldHVybiBuZXcgTWFwKFxuICAgIFsuLi5pZHNdLmZsYXRNYXAoKGlkKSA9PiB7XG4gICAgICBjb25zdCBzYXZlZCA9IHRpbGluZy5zY3JlZW5zPy5baWRdO1xuICAgICAgY29uc3QgZGlzcGxheUlkID0gZGlzcGxheXMuc29tZSgoZGlzcGxheSkgPT4gU3RyaW5nKGRpc3BsYXkuaWQpID09PSBpZClcbiAgICAgICAgPyBOdW1iZXIoaWQpXG4gICAgICAgIDogc2F2ZWQgJiYgcmVjb25uZWN0ZWRJZE9mKGlkLCBzYXZlZCwgZGlzcGxheXMpO1xuICAgICAgY29uc3QgZGlzcGxheSA9IGRpc3BsYXlzLmZpbmQoKGl0KSA9PiBpdC5pZCA9PT0gZGlzcGxheUlkKTtcblxuICAgICAgaWYgKCFkaXNwbGF5KSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBwbGFjZWQsIGNvbHVtbnMsIHJvd3MgfSA9IGdyaWRPZih0aWxpbmcsIGlkKTtcblxuICAgICAgcmV0dXJuIHBsYWNlZC5tYXAoXG4gICAgICAgIChpdCkgPT5cbiAgICAgICAgICBbXG4gICAgICAgICAgICBpdC5pbmRleCxcbiAgICAgICAgICAgIGJvdW5kc0luR3JpZChkaXNwbGF5LndvcmtBcmVhLmdldCgpLCBjb2x1bW5zLCByb3dzLCBpdCksXG4gICAgICAgICAgXSBhcyBjb25zdCxcbiAgICAgICk7XG4gICAgfSksXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgcHJldmlld09mID0gKFxuICBsYXlvdXQ6IFNhdmVkV2luZG93TGF5b3V0LFxuICAvLyBUaGUgcGxhY2VzIGluIHRoZSBsYXlvdXQgb2YgaXRzIHdpbmRvd3Mgbm90IG9wZW4gbm93LlxuICBub3RPcGVuOiBSZWFkb25seVNldDxudW1iZXI+ID0gbmV3IFNldCgpLFxuICAvLyBUaGUgaWRzIG9mIHRoZSBzY3JlZW5zIG9mIGl0cyB0aWxpbmcgbm90IGNvbm5lY3RlZCBub3cuXG4gIG1pc3NpbmdTY3JlZW5zOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldCgpLFxuICAvLyBUaGUgcGxhY2VzIGluIHRoZSBsYXlvdXQgb2YgaXRzIHdpbmRvd3Mgb3BlbiBidXQgbm90IHdoZXJlIG9yIGFzIGl0IHNhdmVkIHRoZW0uXG4gIG5vdFNhdmVkOiBSZWFkb25seVNldDxudW1iZXI+ID0gbmV3IFNldCgpLFxuKTogTGF5b3V0UHJldmlldyA9PiB7XG4gIGNvbnN0IHRpbGluZyA9IGxheW91dC50aWxpbmc7XG4gIGNvbnN0IG5vdE9wZW5Db3VudCA9IGxheW91dC53aW5kb3dzLmZpbHRlcigoXywgaW5kZXgpID0+XG4gICAgbm90T3Blbi5oYXMoaW5kZXgpLFxuICApLmxlbmd0aDtcbiAgY29uc3Qgbm90U2F2ZWRDb3VudCA9IGxheW91dC53aW5kb3dzLmZpbHRlcihcbiAgICAoXywgaW5kZXgpID0+ICFub3RPcGVuLmhhcyhpbmRleCkgJiYgbm90U2F2ZWQuaGFzKGluZGV4KSxcbiAgKS5sZW5ndGg7XG5cbiAgaWYgKCF0aWxpbmcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2NyZWVuczogW10sXG4gICAgICB1bnRpbGVkOiBsYXlvdXQud2luZG93cy5tYXAoKGl0KSA9PiBpdC50aXRsZSksXG4gICAgICBub3RPcGVuOiBub3RPcGVuQ291bnQsXG4gICAgICBub3RTYXZlZDogbm90U2F2ZWRDb3VudCxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgdGl0bGVPZiA9IChpbmRleDogbnVtYmVyKSA9PiBsYXlvdXQud2luZG93c1tpbmRleF0/LnRpdGxlID8/IFwiXCI7XG4gIGNvbnN0IHRpbGVkID0gdGlsaW5nLndpbmRvd3MuZmlsdGVyKChpdCkgPT4gaXQuZGlzcGxheUlkICE9PSBudWxsKTtcbiAgY29uc3QgdGlsZWRJbmRleGVzID0gbmV3IFNldCh0aWxlZC5tYXAoKGl0KSA9PiBpdC5pbmRleCkpO1xuXG4gIGNvbnN0IGlkcyA9IFtcbiAgICAuLi5uZXcgU2V0KFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKHRpbGluZy5jb2x1bW5zKSxcbiAgICAgIC4uLnRpbGVkLm1hcCgoaXQpID0+IFN0cmluZyhpdC5kaXNwbGF5SWQpKSxcbiAgICBdKSxcbiAgXTtcblxuICAvLyBBIHNjcmVlbiBrZXB0IHdpdGhvdXQgd2hlcmUgaXQgbGllcywgZnJvbSBiZWZvcmUgc2NyZWVucyB3ZXJlIGtlcHQsIGdvZXMgcmlnaHQgb2YgdGhlIG90aGVycy5cbiAgbGV0IG5leHRYID0gTWF0aC5tYXgoXG4gICAgMCxcbiAgICAuLi5pZHMubWFwKChpZCkgPT4ge1xuICAgICAgY29uc3QgYXJlYSA9IHRpbGluZy5zY3JlZW5zPy5baWRdPy53b3JrQXJlYTtcblxuICAgICAgcmV0dXJuIGFyZWEgPyBhcmVhLnggKyBhcmVhLndpZHRoIDogMDtcbiAgICB9KSxcbiAgKTtcblxuICBjb25zdCBzY3JlZW5zID0gaWRzXG4gICAgLm1hcCgoaWQpOiBQcmV2aWV3U2NyZWVuID0+IHtcbiAgICAgIGNvbnN0IHsgcGxhY2VkLCBjb2x1bW5zLCByb3dzIH0gPSBncmlkT2YodGlsaW5nLCBpZCk7XG4gICAgICBjb25zdCBzY3JlZW4gPSB0aWxpbmcuc2NyZWVucz8uW2lkXTtcbiAgICAgIGNvbnN0IGtlcHQgPSBzY3JlZW4/LndvcmtBcmVhO1xuICAgICAgY29uc3QgYXJlYSA9XG4gICAgICAgIGtlcHQgJiYga2VwdC53aWR0aCA+IDAgJiYga2VwdC5oZWlnaHQgPiAwXG4gICAgICAgICAgPyBrZXB0XG4gICAgICAgICAgOiB7IHg6IG5leHRYLCB5OiAwLCB3aWR0aDogMTYwMCwgaGVpZ2h0OiAxMDAwIH07XG5cbiAgICAgIGlmIChhcmVhICE9PSBrZXB0KSB7XG4gICAgICAgIG5leHRYICs9IGFyZWEud2lkdGg7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkLFxuICAgICAgICAuLi4oc2NyZWVuID8geyBsYWJlbDogc2NyZWVuLmxhYmVsIH0gOiB7fSksXG4gICAgICAgIG1pc3Npbmc6IG1pc3NpbmdTY3JlZW5zLmhhcyhpZCksXG4gICAgICAgIGFyZWEsXG4gICAgICAgIGNvbHVtbnMsXG4gICAgICAgIHJvd3MsXG4gICAgICAgIHdpbmRvd3M6IHBsYWNlZC5tYXAoKGl0KSA9PiAoe1xuICAgICAgICAgIGluZGV4OiBpdC5pbmRleCxcbiAgICAgICAgICB0aXRsZTogdGl0bGVPZihpdC5pbmRleCksXG4gICAgICAgICAgaXNPcGVuOiAhbm90T3Blbi5oYXMoaXQuaW5kZXgpLFxuICAgICAgICAgIGlzU2F2ZWQ6IG5vdE9wZW4uaGFzKGl0LmluZGV4KSB8fCAhbm90U2F2ZWQuaGFzKGl0LmluZGV4KSxcbiAgICAgICAgICBpc0FwcGxpY2F0aW9uV2luZG93OiBpc0FwcGxpY2F0aW9uV2luZG93KFxuICAgICAgICAgICAgbGF5b3V0LndpbmRvd3NbaXQuaW5kZXhdPy53aW5kb3cgPz8geyBraW5kOiBcIlwiLCBpZDogXCJcIiB9LFxuICAgICAgICAgICksXG4gICAgICAgICAgY29sdW1uOiBpdC5jb2x1bW4sXG4gICAgICAgICAgcm93OiBpdC5yb3csXG4gICAgICAgICAgY29sdW1uczogaXQuY29sdW1ucyxcbiAgICAgICAgICByb3dzOiBpdC5yb3dzLFxuICAgICAgICB9KSksXG4gICAgICB9O1xuICAgIH0pXG4gICAgLy8gVGhlIHNjcmVlbnMgd2l0aCB3aW5kb3dzIG9uIHRoZW07IHdpdGggbm9uZSBhbnl3aGVyZSwgZXZlcnkgc2NyZWVuLCB0byBzaG93IHRoZSBncmlkLlxuICAgIC5maWx0ZXIoKHNjcmVlbiwgXywgYWxsKSA9PlxuICAgICAgYWxsLnNvbWUoKGl0KSA9PiBpdC53aW5kb3dzLmxlbmd0aCA+IDApXG4gICAgICAgID8gc2NyZWVuLndpbmRvd3MubGVuZ3RoID4gMFxuICAgICAgICA6IHRydWUsXG4gICAgKTtcblxuICByZXR1cm4ge1xuICAgIHNjcmVlbnMsXG4gICAgdW50aWxlZDogbGF5b3V0LndpbmRvd3NcbiAgICAgIC5maWx0ZXIoKF8sIGluZGV4KSA9PiAhdGlsZWRJbmRleGVzLmhhcyhpbmRleCkpXG4gICAgICAubWFwKChpdCkgPT4gaXQudGl0bGUpLFxuICAgIG5vdE9wZW46IG5vdE9wZW5Db3VudCxcbiAgICBub3RTYXZlZDogbm90U2F2ZWRDb3VudCxcbiAgfTtcbn07XG4iLCAiaW1wb3J0IHsgQ2xpY2thYmxlRGl2LCBEaXYsIFNwYW4gfSBmcm9tIFwiQGs4c2xlbnMvZWxlbWVudC1jb21wb25lbnRzXCI7XG5pbXBvcnQgdHlwZSB7IExheW91dFByZXZpZXcgYXMgUHJldmlldyB9IGZyb20gXCIuLi9sYXlvdXRzL2xheW91dC1wcmV2aWV3XCI7XG5cbi8vIFRoZSBtb3N0IHJvb20gdGhlIHNjcmVlbnMgYXJlIGRyYXduIGluLCB0b2dldGhlcjsgdGhlIHNwYWNlIGJldHdlZW4gdGhlbSwgYW5kIGFib3ZlIHRoZW0gZm9yXG4vLyB0aGVpciBuYW1lcy5cbmNvbnN0IG1heFdpZHRoID0gNTIwO1xuY29uc3QgbWF4SGVpZ2h0ID0gMjYwO1xuY29uc3QgZ2FwID0gNjtcbmNvbnN0IGxhYmVsSGVpZ2h0ID0gMTg7XG4vLyBUaGUgbGVhc3QgaGVpZ2h0IG9mIGEgd2luZG93J3MgYm94IHRoYXQgc2hvd3MgaXRzIHRpdGxlLlxuY29uc3QgbWluVGl0bGVIZWlnaHQgPSAxNjtcblxuLy8gV2hhdCB0aGUgZGlhbG9nIHRlbGxzIG9mIGEgc2NyZWVuIG5vdCBjb25uZWN0ZWQuXG5jb25zdCBtaXNzaW5nTm90ZSA9IFwibm90IGNvbm5lY3RlZDsgaXRzIHdpbmRvd3MgYXJlIG5vdCB0aWxlZFwiO1xuXG5jb25zdCBwbHVyYWwgPSAoY291bnQ6IG51bWJlciwgd29yZDogc3RyaW5nKSA9PlxuICBgJHtjb3VudH0gJHt3b3JkfSR7Y291bnQgPT09IDEgPyBcIlwiIDogXCJzXCJ9YDtcblxuLy8gVGhlIHRpbGluZyBhIGxheW91dCBzYXZlZCwgZHJhd24gc21hbGw6IHRoZSBzY3JlZW5zIHNpZGUgYnkgc2lkZSBhcyB0aGV5IGxpZSwgZWFjaCBpbiBpdHMgc2hhcGUsXG4vLyBpdHMgd2luZG93cyBpbiB0aGVpciBjZWxscy5cbmV4cG9ydCBjb25zdCBMYXlvdXRQcmV2aWV3ID0gKHtcbiAgcHJldmlldyxcbiAgb25XaW5kb3dDbGljayxcbn06IHtcbiAgcHJldmlldzogUHJldmlldztcbiAgLy8gVG9sZCBvZiBhIHdpbmRvdyBjbGlja2VkLCBieSBpdHMgcGxhY2UgaW4gdGhlIGxheW91dCdzIHdpbmRvd3MuXG4gIG9uV2luZG93Q2xpY2s/OiAoaW5kZXg6IG51bWJlciwgdGl0bGU6IHN0cmluZykgPT4gdm9pZDtcbn0pID0+IHtcbiAgY29uc3QgeyBzY3JlZW5zIH0gPSBwcmV2aWV3O1xuICAvLyBOYW1lZCB3aGVuIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUsIG9yIG9uZSBpcyBub3QgY29ubmVjdGVkLCB0byB0ZWxsIHNvLlxuICBjb25zdCB3aXRoTGFiZWxzID1cbiAgICBzY3JlZW5zLmxlbmd0aCA+IDEgfHwgc2NyZWVucy5zb21lKChzY3JlZW4pID0+IHNjcmVlbi5taXNzaW5nKTtcbiAgY29uc3QgbGVmdCA9IE1hdGgubWluKC4uLnNjcmVlbnMubWFwKChpdCkgPT4gaXQuYXJlYS54KSk7XG4gIGNvbnN0IHRvcCA9IE1hdGgubWluKC4uLnNjcmVlbnMubWFwKChpdCkgPT4gaXQuYXJlYS55KSk7XG4gIGNvbnN0IHJpZ2h0ID0gTWF0aC5tYXgoLi4uc2NyZWVucy5tYXAoKGl0KSA9PiBpdC5hcmVhLnggKyBpdC5hcmVhLndpZHRoKSk7XG4gIGNvbnN0IGJvdHRvbSA9IE1hdGgubWF4KC4uLnNjcmVlbnMubWFwKChpdCkgPT4gaXQuYXJlYS55ICsgaXQuYXJlYS5oZWlnaHQpKTtcbiAgY29uc3Qgc2NhbGUgPSBNYXRoLm1pbihtYXhXaWR0aCAvIChyaWdodCAtIGxlZnQpLCBtYXhIZWlnaHQgLyAoYm90dG9tIC0gdG9wKSk7XG5cbiAgcmV0dXJuIChcbiAgICA8RGl2ICRmbGV4PXt7IGRpcmVjdGlvbjogXCJ2ZXJ0aWNhbFwiLCBnYXA6IFwic1wiIH19PlxuICAgICAge3NjcmVlbnMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgIDxEaXZcbiAgICAgICAgICAkc3R5bGU9e3tcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gICAgICAgICAgICB3aWR0aDogKHJpZ2h0IC0gbGVmdCkgKiBzY2FsZSxcbiAgICAgICAgICAgIGhlaWdodDogKGJvdHRvbSAtIHRvcCkgKiBzY2FsZSArICh3aXRoTGFiZWxzID8gbGFiZWxIZWlnaHQgOiAwKSxcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAge3NjcmVlbnMubWFwKChzY3JlZW4pID0+IChcbiAgICAgICAgICAgIDxEaXZcbiAgICAgICAgICAgICAga2V5PXtzY3JlZW4uaWR9XG4gICAgICAgICAgICAgICRzdHlsZT17e1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgICAgICAgbGVmdDogKHNjcmVlbi5hcmVhLnggLSBsZWZ0KSAqIHNjYWxlICsgZ2FwIC8gMixcbiAgICAgICAgICAgICAgICB0b3A6IChzY3JlZW4uYXJlYS55IC0gdG9wKSAqIHNjYWxlICsgZ2FwIC8gMixcbiAgICAgICAgICAgICAgICB3aWR0aDogc2NyZWVuLmFyZWEud2lkdGggKiBzY2FsZSAtIGdhcCxcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3dpdGhMYWJlbHMgJiYgKFxuICAgICAgICAgICAgICAgIDxTcGFuXG4gICAgICAgICAgICAgICAgICAkY29sb3I9XCJ0ZXh0TXV0ZWRcIlxuICAgICAgICAgICAgICAgICAgJGZvbnQ9e3sgc2l6ZTogXCJ4c1wiIH19XG4gICAgICAgICAgICAgICAgICAkdG9vbHRpcD17XG4gICAgICAgICAgICAgICAgICAgIHNjcmVlbi5taXNzaW5nXG4gICAgICAgICAgICAgICAgICAgICAgPyBgJHtzY3JlZW4ubGFiZWwgPz8gXCJBIHNjcmVlblwifSBcdTAwQjcgJHttaXNzaW5nTm90ZX1gXG4gICAgICAgICAgICAgICAgICAgICAgOiBzY3JlZW4ubGFiZWxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICRzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImJsb2NrXCIsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogbGFiZWxIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIGxpbmVIZWlnaHQ6IGAke2xhYmVsSGVpZ2h0fXB4YCxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG4gICAgICAgICAgICAgICAgICAgIHdoaXRlU3BhY2U6IFwibm93cmFwXCIsXG4gICAgICAgICAgICAgICAgICAgIHRleHRPdmVyZmxvdzogXCJlbGxpcHNpc1wiLFxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7LyogQXMgdGhlIGRpYWxvZyBuYW1lcyBhIHNjcmVlbjogdGhlIG5hbWUgaW4gdGhlIHRleHQncyBvd24gY29sb3VyLCBhIHNjcmVlblxuICAgICAgICAgICAgICAgICAgICAgIG5vdCBjb25uZWN0ZWQgdG9sZCBzbyBhZnRlciBpdCBpbiB0aGUgY3JpdGljYWwgb25lLiAqL31cbiAgICAgICAgICAgICAgICAgIDxTcGFuICRjb2xvcj1cInRleHREZWZhdWx0XCI+e3NjcmVlbi5sYWJlbCA/PyBcIkEgc2NyZWVuXCJ9PC9TcGFuPlxuICAgICAgICAgICAgICAgICAge3NjcmVlbi5taXNzaW5nICYmIChcbiAgICAgICAgICAgICAgICAgICAgPFNwYW4gJGNvbG9yPVwiY3JpdGljYWxcIj4gXHUwMEI3IHttaXNzaW5nTm90ZX08L1NwYW4+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvU3Bhbj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPERpdlxuICAgICAgICAgICAgICAgICRiYWNrZ3JvdW5kQ29sb3I9XCJiYWNrZ3JvdW5kUHJpbWFyeURpbW1lZFwiXG4gICAgICAgICAgICAgICAgLy8gRnJhbWVkIGFzIHRoZSBkaWFsb2cgZnJhbWVzIGEgc2NyZWVuOiBvbmUgbm90IGNvbm5lY3RlZCBkYXNoZWQgaW4gdGhlIGNyaXRpY2FsXG4gICAgICAgICAgICAgICAgLy8gY29sb3VyLlxuICAgICAgICAgICAgICAgICRib3JkZXI9e3tcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiBzY3JlZW4ubWlzc2luZyA/IFwiY3JpdGljYWxcIiA6IFwiYm9yZGVyUHJpbWFyeVwiLFxuICAgICAgICAgICAgICAgICAgd2lkdGg6IFwieHhzXCIsXG4gICAgICAgICAgICAgICAgICByYWRpdXM6IFwic1wiLFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgJHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiLFxuICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBzY3JlZW4uYXJlYS5oZWlnaHQgKiBzY2FsZSAtIGdhcCxcbiAgICAgICAgICAgICAgICAgIC4uLihzY3JlZW4ubWlzc2luZyA/IHsgYm9yZGVyU3R5bGU6IFwiZGFzaGVkXCIgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3NjcmVlbi53aW5kb3dzLm1hcCgod2luZG93KSA9PiAoXG4gICAgICAgICAgICAgICAgICA8Q2xpY2thYmxlRGl2XG4gICAgICAgICAgICAgICAgICAgIGtleT17d2luZG93LmluZGV4fVxuICAgICAgICAgICAgICAgICAgICAvLyBCcm91Z2h0IHRvIHRoZSBmcm9udCwgb3BlbmVkIGFnYWluIGZpcnN0IHdoZW4gbm90IG9wZW4uXG4gICAgICAgICAgICAgICAgICAgICRvbkNsaWNrPXtcbiAgICAgICAgICAgICAgICAgICAgICBvbldpbmRvd0NsaWNrICYmXG4gICAgICAgICAgICAgICAgICAgICAgKCgpID0+IG9uV2luZG93Q2xpY2sod2luZG93LmluZGV4LCB3aW5kb3cudGl0bGUpKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXtcbiAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaXNPcGVuXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBCcmluZyAke3dpbmRvdy50aXRsZX0gdG8gdGhlIGZyb250YFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgT3BlbiAke3dpbmRvdy50aXRsZX0gYWdhaW5gXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgJGJhY2tncm91bmRDb2xvcj1cImJhY2tncm91bmRTZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgICAvLyBPdXRsaW5lZCBhcyB0aGUgZGlhbG9nIG91dGxpbmVzIGl0cyB0aWxlOiB0aGUgbWFpbiB3aW5kb3cgaW4gdGhlIHByaW1hcnlcbiAgICAgICAgICAgICAgICAgICAgLy8gY29sb3VyLCBhIHdpbmRvdyBub3Qgb3BlbiBkYXNoZWQgaW4gdGhlIGNyaXRpY2FsIG9uZSwgYSB3aW5kb3cgbm90IHdoZXJlIG9yXG4gICAgICAgICAgICAgICAgICAgIC8vIGFzIHNhdmVkIGluIHRoZSB3YXJuaW5nIG9uZS5cbiAgICAgICAgICAgICAgICAgICAgJGJvcmRlcj17e1xuICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAhd2luZG93LmlzT3BlblxuICAgICAgICAgICAgICAgICAgICAgICAgPyBcImNyaXRpY2FsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogIXdpbmRvdy5pc1NhdmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJ3YXJuaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiB3aW5kb3cuaXNBcHBsaWNhdGlvbldpbmRvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiYm9yZGVyUHJpbWFyeVwiLFxuICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBcInh4c1wiLFxuICAgICAgICAgICAgICAgICAgICAgIHJhZGl1czogXCJzXCIsXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICRmb250PXt7IHNpemU6IFwieHNcIiB9fVxuICAgICAgICAgICAgICAgICAgICAkdG9vbHRpcD17XG4gICAgICAgICAgICAgICAgICAgICAgIXdpbmRvdy5pc09wZW5cbiAgICAgICAgICAgICAgICAgICAgICAgID8gYCR7d2luZG93LnRpdGxlfTogbm90IG9wZW47IGNsaWNrIHRvIG9wZW4gaXQgYWdhaW5gXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGAke3dpbmRvdy50aXRsZX06IGNsaWNrIHRvIGJyaW5nIGl0IHRvIHRoZSBmcm9udGBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAkc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCIsXG4gICAgICAgICAgICAgICAgICAgICAgbGVmdDogYGNhbGMoJHsod2luZG93LmNvbHVtbiAvIHNjcmVlbi5jb2x1bW5zKSAqIDEwMH0lICsgM3B4KWAsXG4gICAgICAgICAgICAgICAgICAgICAgdG9wOiBgY2FsYygkeyh3aW5kb3cucm93IC8gc2NyZWVuLnJvd3MpICogMTAwfSUgKyAzcHgpYCxcbiAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogYGNhbGMoJHsod2luZG93LmNvbHVtbnMgLyBzY3JlZW4uY29sdW1ucykgKiAxMDB9JSAtIDZweClgLFxuICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogYGNhbGMoJHsod2luZG93LnJvd3MgLyBzY3JlZW4ucm93cykgKiAxMDB9JSAtIDZweClgLFxuICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiMCA2cHhcIixcbiAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IG9uV2luZG93Q2xpY2sgPyBcInBvaW50ZXJcIiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAuLi4od2luZG93LmlzT3BlbiA/IHt9IDogeyBib3JkZXJTdHlsZTogXCJkYXNoZWRcIiB9KSxcbiAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgICAgICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxuICAgICAgICAgICAgICAgICAgICAgIHdoaXRlU3BhY2U6IFwibm93cmFwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgdGV4dE92ZXJmbG93OiBcImVsbGlwc2lzXCIsXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHsvKiBJdHMgdGl0bGUgd2hlcmUgdGhlcmUgaXMgcm9vbSBmb3IgYSBsaW5lIG9mIGl0OyBpdHMgdG9vbHRpcCB0ZWxscyBpdCBhbnl3YXkuICovfVxuICAgICAgICAgICAgICAgICAgICB7KChzY3JlZW4uYXJlYS5oZWlnaHQgKiBzY2FsZSAtIGdhcCkgKiB3aW5kb3cucm93cykgL1xuICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbi5yb3dzIC1cbiAgICAgICAgICAgICAgICAgICAgICA2ID49XG4gICAgICAgICAgICAgICAgICAgICAgbWluVGl0bGVIZWlnaHQgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAkc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0T3ZlcmZsb3c6IFwiZWxsaXBzaXNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3dpbmRvdy50aXRsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHsvKiBUb2xkIGFzIHRoZSBkaWFsb2cgdGVsbHMgaXQsIGFmdGVyIHRoZSBuYW1lLiAqL31cbiAgICAgICAgICAgICAgICAgICAgICAgIHshd2luZG93LmlzT3BlbiAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbG9yPVwiY3JpdGljYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzdHlsZT17eyBmbGV4U2hyaW5rOiAwLCBtYXJnaW5MZWZ0OiA2IH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3Qgb3BlblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgPC9DbGlja2FibGVEaXY+XG4gICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgIDwvRGl2PlxuICAgICAgICAgICAgPC9EaXY+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvRGl2PlxuICAgICAgKX1cblxuICAgICAge3ByZXZpZXcuc2NyZWVucy5sZW5ndGggPT09IDAgJiYgKFxuICAgICAgICA8U3BhbiAkY29sb3I9XCJ0ZXh0TXV0ZWRcIiAkZm9udD17eyBzaXplOiBcInNcIiB9fT5cbiAgICAgICAgICBObyB0aWxpbmcgc2F2ZWQgd2l0aCB0aGlzIGxheW91dC5cbiAgICAgICAgPC9TcGFuPlxuICAgICAgKX1cblxuICAgICAgeyhwcmV2aWV3Lm5vdE9wZW4gPiAwIHx8IHByZXZpZXcudW50aWxlZC5sZW5ndGggPiAwKSAmJiAoXG4gICAgICAgIDxTcGFuICRjb2xvcj1cInRleHRNdXRlZFwiICRmb250PXt7IHNpemU6IFwieHNcIiB9fT5cbiAgICAgICAgICB7W1xuICAgICAgICAgICAgLy8gSW4gdGhlIGNvbG91ciB0aGUgZGlhbG9nIHRlbGxzIGEgd2luZG93IG5vdCBvcGVuIGluLlxuICAgICAgICAgICAgLi4uKHByZXZpZXcubm90T3BlbiA+IDBcbiAgICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgICA8U3BhbiBrZXk9XCJub3Qtb3BlblwiICRjb2xvcj1cImNyaXRpY2FsXCI+XG4gICAgICAgICAgICAgICAgICAgIHtwbHVyYWwocHJldmlldy5ub3RPcGVuLCBcIndpbmRvd1wiKX0gbm90IG9wZW5cbiAgICAgICAgICAgICAgICAgIDwvU3Bhbj4sXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICAgIC4uLihwcmV2aWV3LnVudGlsZWQubGVuZ3RoID4gMFxuICAgICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICAgIDxTcGFuIGtleT1cIm5vdC10aWxlZFwiPlxuICAgICAgICAgICAgICAgICAgICB7cGx1cmFsKHByZXZpZXcudW50aWxlZC5sZW5ndGgsIFwid2luZG93XCIpfSBub3QgdGlsZWRcbiAgICAgICAgICAgICAgICAgIDwvU3Bhbj4sXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICBdLmZsYXRNYXAoKGl0LCBpbmRleCkgPT4gKGluZGV4ID09PSAwID8gW2l0XSA6IFtcIiBcdTAwQjcgXCIsIGl0XSkpfVxuICAgICAgICA8L1NwYW4+XG4gICAgICApfVxuICAgIDwvRGl2PlxuICApO1xufTtcbiIsICJpbXBvcnQgeyBnZXRJbmplY3RhYmxlMiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyBvcGVuTW9kYWxJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCJAazhzbGVucy9tb2RhbC1jb250cmFjdHNcIjtcbmltcG9ydCB7IHdpbmRvd0xheW91dHNNb2RhbEtpbmQgfSBmcm9tIFwiLi93aW5kb3ctbGF5b3V0cy1tb2RhbC5pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyB3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlIH0gZnJvbSBcIi4vd2luZG93LWxheW91dHMtbW9kZWwuaW5qZWN0YWJsZVwiO1xuXG5leHBvcnQgY29uc3Qgb3BlbldpbmRvd0xheW91dHNJbmplY3RhYmxlID0gZ2V0SW5qZWN0YWJsZTIoe1xuICBpZDogXCJ3aW5kb3ctbWFuYWdlci5vcGVuLXdpbmRvdy1sYXlvdXRzXCIsXG4gIGNvbnN1bXB0aW9uczogW29wZW5Nb2RhbEluamVjdGlvblRva2VuXSxcblxuICBpbnN0YW50aWF0ZTogKGRpKSA9PiB7XG4gICAgY29uc3Qgb3BlbldpbmRvd0xheW91dHNNb2RhbCA9IGRpLmluamVjdChcbiAgICAgIG9wZW5Nb2RhbEluamVjdGlvblRva2VuLmZvcih3aW5kb3dMYXlvdXRzTW9kYWxLaW5kKS5mb3IoZGkuc2NvcGVJZHMpLFxuICAgICkoKTtcblxuICAgIC8vIE9wZW5zIHRoZSBkaWFsb2csIHdpdGggdGhlIGxheW91dCBvZiB0aGUgbmFtZSBnaXZlbiBzZWxlY3RlZCBpbiBpdCwgdG8gZWRpdC5cbiAgICByZXR1cm4gKCkgPT4gYXN5bmMgKG5hbWU/OiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIFRoZSBtb2RlbCBpcyBtYWRlIGFzIHRoZSBkaWFsb2cgZmlyc3Qgb3BlbnMsIG5vdCBhcyB0aGUgc3RhdHVzIGJhciBzaG93cyBpdHMgYnV0dG9uOiB3aGF0IHRoZVxuICAgICAgLy8gbW9kZWwgbmVlZHMgZmFpbGluZyB0aGVuIGZhaWxzIHRoZSBkaWFsb2cgYWxvbmUsIG5vdCB0aGUgd2luZG93J3MgZnJhbWUgd2l0aCB0aGUgYnV0dG9uIGluIGl0LlxuICAgICAgY29uc3QgbW9kZWwgPSBkaS5pbmplY3Qod2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSkoKTtcblxuICAgICAgbW9kZWwucmVzZXQoKTtcblxuICAgICAgaWYgKG5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2b2lkIG1vZGVsLnNlbGVjdChuYW1lKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgb3BlbldpbmRvd0xheW91dHNNb2RhbCgpO1xuICAgIH07XG4gIH0sXG59KTtcbiIsICJpbXBvcnQgeyBCdXR0b24sIERpdiwgRm9ybSwgU3BhbiB9IGZyb20gXCJAazhzbGVucy9lbGVtZW50LWNvbXBvbmVudHNcIjtcbmltcG9ydCB7XG4gIFBsYWluQnV0dG9uLFxuICBQcmltYXJ5QnV0dG9uLFxuICBUZXh0SW5wdXQsXG59IGZyb20gXCJAazhzbGVucy9pbnB1dC1jb21wb25lbnRzXCI7XG5pbXBvcnQge1xuICBNb2RhbENvbnRhaW5lcixcbiAgTW9kYWxDb250ZW50LFxuICBNb2RhbEZvb3RlcixcbiAgTW9kYWxIZWFkZXIsXG59IGZyb20gXCJAazhzbGVucy9tb2RhbC1jb21wb25lbnRzXCI7XG5pbXBvcnQge1xuICBnZXRNb2RhbEluamVjdGFibGVCdW5jaCxcbiAgZ2V0TW9kYWxLaW5kLFxuICB1c2VSZXNwb25kRnJvbU1vZGFsLFxufSBmcm9tIFwiQGs4c2xlbnMvbW9kYWwtY29udHJhY3RzXCI7XG5pbXBvcnQge1xuICBBZGRJY29uLFxuICBDb250ZW50Q29weUljb24sXG4gIERlbGV0ZU91dGxpbmVJY29uLFxuICBJY29uQnV0dG9uLFxuICBFZGl0SWNvbixcbiAgSGlzdG9yeUljb24sXG4gIEhvdGJhckljb24sXG4gIFNhdmVJY29uLFxuICBTcGxpdFZpZXdJY29uLFxufSBmcm9tIFwiQGs4c2xlbnMvaWNvblwiO1xuaW1wb3J0IFwiLi9pY29uLWJ1dHRvbi5zY3NzXCI7XG5pbXBvcnQgc3R5bGVzIGZyb20gXCIuL2xheW91dC1saXN0Lm1vZHVsZS5zY3NzXCI7XG5pbXBvcnQgeyB1c2VJbmplY3QgfSBmcm9tIFwiQGs4c2xlbnMvdXNlLWluamVjdFwiO1xuaW1wb3J0IHsgb2JzZXJ2ZXIgfSBmcm9tIFwibW9ieC1yZWFjdFwiO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHsgU2F2ZWRXaW5kb3dMYXlvdXQgfSBmcm9tIFwiLi4vbGF5b3V0cy9zYXZlZC13aW5kb3ctbGF5b3V0cy5pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyBNb2RhbEVycm9yQm91bmRhcnkgfSBmcm9tIFwiLi9tb2RhbC1lcnJvci1ib3VuZGFyeVwiO1xuaW1wb3J0IHsgVGlsZVdpbmRvd3MgfSBmcm9tIFwiLi90aWxpbmctZWRpdG9yXCI7XG5pbXBvcnQgeyB3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlIH0gZnJvbSBcIi4vd2luZG93LWxheW91dHMtbW9kZWwuaW5qZWN0YWJsZVwiO1xuXG5leHBvcnQgY29uc3Qgd2luZG93TGF5b3V0c01vZGFsS2luZCA9IGdldE1vZGFsS2luZDxbXSwgdm9pZD4oKShcbiAgXCJ3aW5kb3ctbGF5b3V0c1wiLFxuKTtcblxuY29uc3QgcGx1cmFsID0gKGNvdW50OiBudW1iZXIsIHdvcmQ6IHN0cmluZykgPT5cbiAgYCR7Y291bnR9ICR7d29yZH0ke2NvdW50ID09PSAxID8gXCJcIiA6IFwic1wifWA7XG5cbi8vIFRoZSBsYXlvdXQncyB3aW5kb3dzIGFuZCBzY3JlZW5zLCBhbmQgdGhlIHNjcmVlbnMgb2YgaXRzIHRpbGluZyB0aGF0IGFyZSBub3QgY29ubmVjdGVkIG5vdy5cbmNvbnN0IExheW91dERlc2NyaXB0aW9uID0gb2JzZXJ2ZXIoXG4gICh7IGxheW91dCwgc3RhY2tlZCB9OiB7IGxheW91dDogU2F2ZWRXaW5kb3dMYXlvdXQ7IHN0YWNrZWQ/OiBib29sZWFuIH0pID0+IHtcbiAgICBjb25zdCBtb2RlbCA9IHVzZUluamVjdCh3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlKSgpO1xuICAgIGNvbnN0IG1pc3NpbmcgPSBtb2RlbC5taXNzaW5nU2NyZWVuc09mKGxheW91dCk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFNwYW5cbiAgICAgICAgJGNvbG9yPVwidGV4dE11dGVkXCJcbiAgICAgICAgJGZvbnQ9e3sgc2l6ZTogXCJzXCIgfX1cbiAgICAgICAgJHRvb2x0aXA9e2xheW91dC53aW5kb3dzLm1hcCgoaXQpID0+IGl0LnRpdGxlKS5qb2luKFwiXFxuXCIpfVxuICAgICAgPlxuICAgICAgICB7W1xuICAgICAgICAgIHBsdXJhbChsYXlvdXQud2luZG93cy5sZW5ndGgsIFwid2luZG93XCIpLFxuICAgICAgICAgIC4uLihsYXlvdXQuZGlzcGxheXNcbiAgICAgICAgICAgID8gW3BsdXJhbChsYXlvdXQuZGlzcGxheXMubGVuZ3RoLCBcInNjcmVlblwiKV1cbiAgICAgICAgICAgIDogW10pLFxuICAgICAgICBdLmpvaW4oXCIgXHUwMEI3IFwiKX1cbiAgICAgICAge21pc3NpbmcgPiAwICYmXG4gICAgICAgICAgKHN0YWNrZWQgPyAoXG4gICAgICAgICAgICAvLyBPbiBhIGxpbmUgb2YgaXRzIG93biwgaW4gdGhlIG5hcnJvdyBsaXN0LlxuICAgICAgICAgICAgPFNwYW4gJGNvbG9yPVwiY3JpdGljYWxcIiAkc3R5bGU9e3sgZGlzcGxheTogXCJibG9ja1wiIH19PlxuICAgICAgICAgICAgICB7cGx1cmFsKG1pc3NpbmcsIFwic2NyZWVuXCIpfSBtaXNzaW5nXG4gICAgICAgICAgICA8L1NwYW4+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxTcGFuICRjb2xvcj1cImNyaXRpY2FsXCI+XG4gICAgICAgICAgICAgIHtcIiBcIn1cbiAgICAgICAgICAgICAgXHUwMEI3IHtwbHVyYWwobWlzc2luZywgXCJzY3JlZW5cIil9IG1pc3NpbmdcbiAgICAgICAgICAgIDwvU3Bhbj5cbiAgICAgICAgICApKX1cbiAgICAgIDwvU3Bhbj5cbiAgICApO1xuICB9LFxuKTtcblxuLy8gVGhlIG5hbWUgb2YgdGhlIGxheW91dCBzZWxlY3RlZCwgcmVuYW1lZCBieSBjbGlja2luZyBpdDogRW50ZXIgb3IgbGVhdmluZyBpdCBrZWVwcyB0aGUgbmFtZVxuLy8gdHlwZWQsIEVzY2FwZSB0aGUgbmFtZSBpdCBoYWQuXG5jb25zdCBMYXlvdXROYW1lID0gb2JzZXJ2ZXIoKHsgbmFtZSB9OiB7IG5hbWU6IHN0cmluZyB9KSA9PiB7XG4gIGNvbnN0IG1vZGVsID0gdXNlSW5qZWN0KHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUpKCk7XG5cbiAgLy8gU2VsZWN0cyB0aGUgbmFtZSBvbmNlIGl0cyBpbnB1dCBzaG93cywgc28gdGhhdCB0eXBpbmcgcmVwbGFjZXMgaXQuXG4gIGNvbnN0IHNlbGVjdFdoZW5TaG93biA9IHVzZUNhbGxiYWNrKChpbnB1dDogSFRNTElucHV0RWxlbWVudCB8IG51bGwpID0+IHtcbiAgICBpZiAoaW5wdXQpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgICBpbnB1dC5zZWxlY3QoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW10pO1xuXG4gIGlmIChtb2RlbC5yZW5hbWluZy5nZXQoKSAhPT0gbmFtZSkge1xuICAgIHJldHVybiAoXG4gICAgICA8U3BhblxuICAgICAgICAkZm9udD17eyBib2xkOiB0cnVlLCBzaXplOiBcImxcIiB9fVxuICAgICAgICAkZmxleD17eyBkaXJlY3Rpb246IFwiaG9yaXpvbnRhbFwiLCBnYXA6IFwieHNcIiwgdmVydGljYWxBbGlnbjogXCJjZW50ZXJcIiB9fVxuICAgICAgICAkc3R5bGU9e3sgY3Vyc29yOiBcInBvaW50ZXJcIiwgYWxpZ25TZWxmOiBcImZsZXgtc3RhcnRcIiB9fVxuICAgICAgICAkdG9vbHRpcD1cIkNsaWNrIHRvIHJlbmFtZVwiXG4gICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICB0YWJJbmRleD17MH1cbiAgICAgICAgb25DbGljaz17KCkgPT4gbW9kZWwuc3RhcnRSZW5hbWluZyhuYW1lKX1cbiAgICAgICAgb25LZXlEb3duPXsoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBcIkVudGVyXCIpIHtcbiAgICAgICAgICAgIG1vZGVsLnN0YXJ0UmVuYW1pbmcobmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICB7bmFtZX1cbiAgICAgICAgPEVkaXRJY29uICRzaXplPVwibFwiICRjb2xvcj1cInRleHRNdXRlZFwiIC8+XG4gICAgICA8L1NwYW4+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPEZvcm1cbiAgICAgIG9uU3VibWl0PXsoZXZlbnQpID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdm9pZCBtb2RlbC5yZW5hbWUoKTtcbiAgICAgIH19XG4gICAgPlxuICAgICAgPFRleHRJbnB1dFxuICAgICAgICBhdXRvRm9jdXNcbiAgICAgICAgYXJpYS1sYWJlbD1cIk5hbWUgb2YgdGhlIGxheW91dFwiXG4gICAgICAgIHZhbHVlPXttb2RlbC5yZW5hbWVEcmFmdC5nZXQoKX1cbiAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT4gbW9kZWwuc2V0UmVuYW1lRHJhZnQoZXZlbnQudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgJHJlZj17c2VsZWN0V2hlblNob3dufVxuICAgICAgICBvbkJsdXI9eygpID0+IHZvaWQgbW9kZWwucmVuYW1lKCl9XG4gICAgICAgIG9uS2V5RG93bj17KGV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgbW9kZWwuY2FuY2VsUmVuYW1pbmcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH19XG4gICAgICAvPlxuICAgIDwvRm9ybT5cbiAgKTtcbn0pO1xuXG4vLyBPbmUgbGF5b3V0IGluIHRoZSBsaXN0IG9uIHRoZSBsZWZ0LCBhIHJvdyBvZiBpdCwgc2VsZWN0ZWQgYnkgY2xpY2tpbmcgaXQuXG5jb25zdCBMYXlvdXRJdGVtID0gb2JzZXJ2ZXIoKHsgbGF5b3V0IH06IHsgbGF5b3V0OiBTYXZlZFdpbmRvd0xheW91dCB9KSA9PiB7XG4gIGNvbnN0IG1vZGVsID0gdXNlSW5qZWN0KHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUpKCk7XG4gIGNvbnN0IGlzU2VsZWN0ZWQgPSBtb2RlbC5zZWxlY3RlZC5nZXQoKSA9PT0gbGF5b3V0Lm5hbWU7XG5cbiAgcmV0dXJuIChcbiAgICA8RGl2XG4gICAgICBjbGFzc05hbWU9e1tzdHlsZXMucm93LCBpc1NlbGVjdGVkID8gc3R5bGVzLnNlbGVjdGVkIDogXCJcIl0uam9pbihcIiBcIil9XG4gICAgICAkZmxleD17eyBkaXJlY3Rpb246IFwidmVydGljYWxcIiwgZ2FwOiBcInh4c1wiIH19XG4gICAgICAkcGFkZGluZz17eyB2ZXJ0aWNhbDogXCJtXCIsIGhvcml6b250YWw6IFwibVwiIH19XG4gICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgIHRhYkluZGV4PXswfVxuICAgICAgYXJpYS1wcmVzc2VkPXtpc1NlbGVjdGVkfVxuICAgICAgb25DbGljaz17KCkgPT4gdm9pZCBtb2RlbC5zZWxlY3QobGF5b3V0Lm5hbWUpfVxuICAgICAgb25LZXlEb3duPXsoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJFbnRlclwiIHx8IGV2ZW50LmtleSA9PT0gXCIgXCIpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHZvaWQgbW9kZWwuc2VsZWN0KGxheW91dC5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICA+XG4gICAgICB7aXNTZWxlY3RlZCAmJiAoXG4gICAgICAgIDxTcGFuXG4gICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMubWFya2VyfVxuICAgICAgICAgICRiYWNrZ3JvdW5kQ29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICAgIDxTcGFuIGNsYXNzTmFtZT17c3R5bGVzLm5hbWVMaW5lfT5cbiAgICAgICAgPFNwYW4gY2xhc3NOYW1lPXtzdHlsZXMubmFtZX0gJHRvb2x0aXA9e2xheW91dC5uYW1lfT5cbiAgICAgICAgICB7bGF5b3V0Lm5hbWV9XG4gICAgICAgIDwvU3Bhbj5cblxuICAgICAgICB7LyogQXQgdGhlIHJvdydzIHJpZ2h0IGVuZCwgc2hvd24gd2hpbGUgdGhlIHBvaW50ZXIgaXMgb24gdGhlIHJvdy4gKi99XG4gICAgICAgIDxCdXR0b25cbiAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlcy5yZWNhbGx9XG4gICAgICAgICAgJGludGVyYWN0aXZlXG4gICAgICAgICAgYXJpYS1sYWJlbD17YFJlY2FsbCAke2xheW91dC5uYW1lfWB9XG4gICAgICAgICAgJHRvb2x0aXA9XCJSZWNhbGw6IHB1dCB0aGUgd2luZG93cyBiYWNrIHdoZXJlIHRoaXMgbGF5b3V0IGhhcyB0aGVtXCJcbiAgICAgICAgICAkZW5hYmxlZD17bW9kZWwuY2FuQXJyYW5nZS5nZXQoKX1cbiAgICAgICAgICAvLyBOb3Qgc2VsZWN0aW5nIHRoZSBsYXlvdXQgYnkgdGhlIHJvdzogcmVjYWxsaW5nIHNlbGVjdHMgaXQgaXRzZWxmLlxuICAgICAgICAgIG9uQ2xpY2s9eyhldmVudCkgPT4ge1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB2b2lkIG1vZGVsLnJlY2FsbChsYXlvdXQubmFtZSk7XG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxIaXN0b3J5SWNvbiAkc2l6ZT1cImxcIiAkY29sb3I9XCJwcmltYXJ5XCIgLz5cbiAgICAgICAgPC9CdXR0b24+XG4gICAgICA8L1NwYW4+XG4gICAgICA8TGF5b3V0RGVzY3JpcHRpb24gbGF5b3V0PXtsYXlvdXR9IHN0YWNrZWQgLz5cbiAgICA8L0Rpdj5cbiAgKTtcbn0pO1xuXG4vLyBUaGUgbGVmdCBwYW5lbDogdGhlIGxheW91dHMsIGFuZCB0aGUgYnV0dG9uIHNhdmluZyB0aGUgd2luZG93cyBhcyB0aGV5IGFyZSBub3cgYXMgYSBuZXcgb25lLlxuY29uc3QgTGF5b3V0TGlzdCA9IG9ic2VydmVyKCgpID0+IHtcbiAgY29uc3QgbW9kZWwgPSB1c2VJbmplY3Qod2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSkoKTtcbiAgY29uc3QgbGF5b3V0cyA9IG1vZGVsLmxheW91dHMuZ2V0KCk7XG5cbiAgcmV0dXJuIChcbiAgICA8RGl2XG4gICAgICAkZmxleD17eyBkaXJlY3Rpb246IFwidmVydGljYWxcIiwgZ2FwOiBcInNcIiB9fVxuICAgICAgJHN0eWxlPXt7IHdpZHRoOiBcIjE3JVwiLCBtaW5XaWR0aDogMjAwLCBmbGV4U2hyaW5rOiAwIH19XG4gICAgPlxuICAgICAgPERpdlxuICAgICAgICAkZmxleD17eyBkaXJlY3Rpb246IFwiaG9yaXpvbnRhbFwiLCBnYXA6IFwic1wiLCB2ZXJ0aWNhbEFsaWduOiBcImNlbnRlclwiIH19XG4gICAgICA+XG4gICAgICAgIDxTcGFuICRmb250PXt7IGJvbGQ6IHRydWUgfX0gJGZsZXhDaGlsZD5cbiAgICAgICAgICBMYXlvdXRzXG4gICAgICAgIDwvU3Bhbj5cblxuICAgICAgICB7LyogU2lkZSBieSBzaWRlLCBjbG9zZXIgdG8gZWFjaCBvdGhlciB0aGFuIHRvIHRoZSBoZWFkaW5nLiAqL31cbiAgICAgICAgPERpdlxuICAgICAgICAgICRmbGV4PXt7XG4gICAgICAgICAgICBkaXJlY3Rpb246IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgICAgICAgZ2FwOiBcInhzXCIsXG4gICAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiBcImNlbnRlclwiLFxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAkaW50ZXJhY3RpdmVcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJEdXBsaWNhdGUgbGF5b3V0XCJcbiAgICAgICAgICAgICR0b29sdGlwPXtcbiAgICAgICAgICAgICAgbW9kZWwuc2VsZWN0ZWRMYXlvdXQuZ2V0KClcbiAgICAgICAgICAgICAgICA/IGBDb3B5IFwiJHttb2RlbC5zZWxlY3RlZExheW91dC5nZXQoKSEubmFtZX1cIiwgd2l0aCBpdHMgdGlsaW5nLCBhcyBhIG5ldyBsYXlvdXRgXG4gICAgICAgICAgICAgICAgOiBcIlNlbGVjdCBhIGxheW91dCB0byBjb3B5IGl0XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICRlbmFibGVkPXshIW1vZGVsLnNlbGVjdGVkTGF5b3V0LmdldCgpfVxuICAgICAgICAgICAgJG9uQ2xpY2s9eygpID0+IG1vZGVsLmR1cGxpY2F0ZSgpfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHsvKiBTbWFsbGVyIHRoYW4gdGhlIHBsdXMgYmVzaWRlIGl0OiB0aGUgY29weSBnbHlwaCBmaWxscyBpdHMgYm94IHdoZXJlIHRoZSBwbHVzIGRvZXMgbm90LiAqL31cbiAgICAgICAgICAgIDxDb250ZW50Q29weUljb24gJHNpemU9XCJzXCIgLz5cbiAgICAgICAgICA8L0J1dHRvbj5cblxuICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICRpbnRlcmFjdGl2ZVxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIk5ldyBsYXlvdXRcIlxuICAgICAgICAgICAgJHRvb2x0aXA9XCJTYXZlIHRoZSB3aW5kb3dzIGFzIHRoZXkgYXJlIG5vdywgYW5kIHRoZSB0aWxpbmcsIGFzIGEgbmV3IGxheW91dFwiXG4gICAgICAgICAgICAkZW5hYmxlZD17bW9kZWwuY2FuQXJyYW5nZS5nZXQoKX1cbiAgICAgICAgICAgICRvbkNsaWNrPXsoKSA9PiBtb2RlbC5jcmVhdGUoKX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8QWRkSWNvbiAvPlxuICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICA8L0Rpdj5cbiAgICAgIDwvRGl2PlxuXG4gICAgICB7bGF5b3V0cz8ubGVuZ3RoID09PSAwICYmIChcbiAgICAgICAgPFNwYW4gJGNvbG9yPVwidGV4dE11dGVkXCI+XG4gICAgICAgICAgTm8gbGF5b3V0cyB5ZXQuIEFycmFuZ2UgdGhlIHdpbmRvd3Mgb2YgTGVucyB0aGUgd2F5IHlvdSBsaWtlLCB0aGVuXG4gICAgICAgICAgY2xpY2sgKyB0byBzYXZlIHRoZW0gYXMgYSBsYXlvdXQuXG4gICAgICAgIDwvU3Bhbj5cbiAgICAgICl9XG5cbiAgICAgIHsvKiBUaGUgaGVpZ2h0IHRoZSBwYW5lbCBoYXMsIHdpdGhvdXQgdGhlIGxheW91dHMgbWFraW5nIGl0IHRhbGxlcjogdGhlIGJveCBvZiB0aGVtIGZpdHMgdGhlbSxcbiAgICAgICAgICBzY3JvbGxpbmcgd2hlbiB0aGV5IGFyZSBtb3JlIHRoYW4gZml0LiAqL31cbiAgICAgIDxEaXYgJGZsZXhDaGlsZCAkc3R5bGU9e3sgbWluSGVpZ2h0OiAwIH19PlxuICAgICAgICB7ISFsYXlvdXRzPy5sZW5ndGggJiYgKFxuICAgICAgICAgIDxEaXZcbiAgICAgICAgICAgIGNsYXNzTmFtZT17c3R5bGVzLmxpc3R9XG4gICAgICAgICAgICAkZmxleD17eyBkaXJlY3Rpb246IFwidmVydGljYWxcIiB9fVxuICAgICAgICAgICAgJGJhY2tncm91bmRDb2xvcj1cImJhY2tncm91bmRTZWNvbmRhcnlcIlxuICAgICAgICAgICAgJGJvcmRlcj17eyBjb2xvcjogXCJib3JkZXJQcmltYXJ5XCIsIHdpZHRoOiBcInh4c1wiLCByYWRpdXM6IFwibVwiIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAge2xheW91dHMubWFwKChsYXlvdXQpID0+IChcbiAgICAgICAgICAgICAgPExheW91dEl0ZW0ga2V5PXtsYXlvdXQubmFtZX0gbGF5b3V0PXtsYXlvdXR9IC8+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICA8L0Rpdj5cbiAgICAgICAgKX1cbiAgICAgIDwvRGl2PlxuICAgIDwvRGl2PlxuICApO1xufSk7XG5cbi8vIFBpbnMgdGhlIGxheW91dCB0byB0aGUgaG90YmFyLCB0byByZWNhbGwgaXQgZnJvbSB0aGVyZSwgb3IgdGFrZXMgaXQgb2ZmLlxuY29uc3QgUGluVG9Ib3RiYXIgPSBvYnNlcnZlcigoeyBuYW1lIH06IHsgbmFtZTogc3RyaW5nIH0pID0+IHtcbiAgY29uc3QgbW9kZWwgPSB1c2VJbmplY3Qod2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSkoKTtcbiAgY29uc3QgaXNQaW5uZWQgPSBtb2RlbC5pc1Bpbm5lZChuYW1lKS5nZXQoKTtcblxuICByZXR1cm4gKFxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3NOYW1lPVwid2luZG93LW1hbmFnZXItaWNvbi1idXR0b25cIlxuICAgICAgYXJpYS1sYWJlbD17aXNQaW5uZWQgPyBgVW5waW4gJHtuYW1lfSBmcm9tIHRoZSBob3RiYXJgIDogYFBpbiAke25hbWV9IHRvIHRoZSBob3RiYXJgfVxuICAgICAgYXJpYS1wcmVzc2VkPXtpc1Bpbm5lZH1cbiAgICAgIHRpdGxlPXtcbiAgICAgICAgaXNQaW5uZWRcbiAgICAgICAgICA/IFwiVW5waW4gZnJvbSB0aGUgaG90YmFyXCJcbiAgICAgICAgICA6IFwiUGluIHRvIHRoZSBob3RiYXIsIHRvIHJlY2FsbCB0aGlzIGxheW91dCBmcm9tIHRoZXJlXCJcbiAgICAgIH1cbiAgICAgIG9uQ2xpY2s9eygpID0+IHZvaWQgbW9kZWwudG9nZ2xlUGlubmVkKG5hbWUpfVxuICAgID5cbiAgICAgIDxIb3RiYXJJY29uICRzaXplPVwibFwiICRjb2xvcj17aXNQaW5uZWQgPyBcInByaW1hcnlcIiA6IFwidGV4dE11dGVkXCJ9IC8+XG4gICAgPC9idXR0b24+XG4gICk7XG59KTtcblxuLy8gVGhlIHRvcCBvZiB0aGUgcmlnaHQgcGFuZWw6IHRoZSBsYXlvdXQgc2VsZWN0ZWQsIGFuZCB3aGF0IGNhbiBiZSBkb25lIHdpdGggaXQuXG5jb25zdCBTZWxlY3RlZExheW91dCA9IG9ic2VydmVyKCgpID0+IHtcbiAgY29uc3QgbW9kZWwgPSB1c2VJbmplY3Qod2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSkoKTtcbiAgY29uc3QgbGF5b3V0ID0gbW9kZWwuc2VsZWN0ZWRMYXlvdXQuZ2V0KCk7XG5cbiAgaWYgKCFsYXlvdXQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPERpdiAkZmxleD17eyBkaXJlY3Rpb246IFwiaG9yaXpvbnRhbFwiLCBnYXA6IFwibVwiLCB2ZXJ0aWNhbEFsaWduOiBcImNlbnRlclwiIH19PlxuICAgICAgPERpdiAkZmxleD17eyBkaXJlY3Rpb246IFwidmVydGljYWxcIiwgZ2FwOiBcInh4c1wiIH19ICRmbGV4Q2hpbGQ+XG4gICAgICAgIDxEaXZcbiAgICAgICAgICAkZmxleD17e1xuICAgICAgICAgICAgZGlyZWN0aW9uOiBcImhvcml6b250YWxcIixcbiAgICAgICAgICAgIGdhcDogXCJ4eHNcIixcbiAgICAgICAgICAgIHZlcnRpY2FsQWxpZ246IFwiY2VudGVyXCIsXG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxMYXlvdXROYW1lIG5hbWU9e2xheW91dC5uYW1lfSAvPlxuXG4gICAgICAgICAge21vZGVsLnJlbmFtaW5nLmdldCgpICE9PSBsYXlvdXQubmFtZSAmJiAoXG4gICAgICAgICAgICA8UGluVG9Ib3RiYXIgbmFtZT17bGF5b3V0Lm5hbWV9IC8+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIHttb2RlbC5yZW5hbWluZy5nZXQoKSAhPT0gbGF5b3V0Lm5hbWUgJiYgKFxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwid2luZG93LW1hbmFnZXItaWNvbi1idXR0b25cIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPXtgRGVsZXRlICR7bGF5b3V0Lm5hbWV9YH1cbiAgICAgICAgICAgICAgdGl0bGU9XCJEZWxldGUgdGhpcyBsYXlvdXRcIlxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB2b2lkIG1vZGVsLnJlbW92ZShsYXlvdXQubmFtZSl9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxEZWxldGVPdXRsaW5lSWNvbiAkc2l6ZT1cImxcIiAkY29sb3I9XCJjcml0aWNhbFwiIC8+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICApfVxuICAgICAgICA8L0Rpdj5cbiAgICAgICAgPExheW91dERlc2NyaXB0aW9uIGxheW91dD17bGF5b3V0fSAvPlxuICAgICAgPC9EaXY+XG5cbiAgICAgIDxQbGFpbkJ1dHRvblxuICAgICAgICAkZGlzYWJsZWQ9eyFtb2RlbC5jYW5BcnJhbmdlLmdldCgpfVxuICAgICAgICAkdG9vbHRpcD1cIlB1dCB0aGUgd2luZG93cyBiYWNrIHdoZXJlIHRoZSBsYXlvdXQgaGFzIHRoZW1cIlxuICAgICAgICBvbkNsaWNrPXsoKSA9PiB2b2lkIG1vZGVsLnJlY2FsbChsYXlvdXQubmFtZSl9XG4gICAgICA+XG4gICAgICAgIFJlY2FsbFxuICAgICAgPC9QbGFpbkJ1dHRvbj5cblxuICAgICAge21vZGVsLnNhdmVkTm90ZS5nZXQoKSAmJiAoXG4gICAgICAgIDxTcGFuICRjb2xvcj1cInN1Y2Nlc3NcIiByb2xlPVwic3RhdHVzXCI+XG4gICAgICAgICAge21vZGVsLnNhdmVkTm90ZS5nZXQoKX1cbiAgICAgICAgPC9TcGFuPlxuICAgICAgKX1cblxuICAgICAgPFBsYWluQnV0dG9uXG4gICAgICAgICRkaXNhYmxlZD17XG4gICAgICAgICAgIW1vZGVsLmNhbkFycmFuZ2UuZ2V0KCkgfHxcbiAgICAgICAgICAobW9kZWwuaXNTZWxlY3RlZFNhdmVkLmdldCgpICYmICFtb2RlbC5oYXNVbnRpbGVkVG9MZWF2ZU91dC5nZXQoKSlcbiAgICAgICAgfVxuICAgICAgICAkdG9vbHRpcD1cIlNhdmUgdGhlIHdpbmRvd3MgYXMgdGhleSBhcmUgbm93LCBhbmQgdGhlIHRpbGluZyBiZWxvdywgaW50byB0aGlzIGxheW91dCwgbGVhdmluZyBvdXQgdGhlIHdpbmRvd3Mgbm90IHRpbGVkXCJcbiAgICAgICAgb25DbGljaz17KCkgPT4gbW9kZWwuc2F2ZU92ZXIobGF5b3V0Lm5hbWUsIHsgdGlsZWRPbmx5OiB0cnVlIH0pfVxuICAgICAgPlxuICAgICAgICBTYXZlIHRpbGVkIG9ubHlcbiAgICAgIDwvUGxhaW5CdXR0b24+XG5cbiAgICAgIDxQcmltYXJ5QnV0dG9uXG4gICAgICAgIEljb249e1NhdmVJY29ufVxuICAgICAgICAkZGlzYWJsZWQ9eyFtb2RlbC5jYW5BcnJhbmdlLmdldCgpIHx8IG1vZGVsLmlzU2VsZWN0ZWRTYXZlZC5nZXQoKX1cbiAgICAgICAgJHRvb2x0aXA9e1xuICAgICAgICAgIG1vZGVsLmlzU2VsZWN0ZWRTYXZlZC5nZXQoKVxuICAgICAgICAgICAgPyBcIk5vdGhpbmcgdG8gc2F2ZTogdGhlIHdpbmRvd3MgYW5kIHRoZSB0aWxpbmcgYmVsb3cgYXJlIGFzIHRoaXMgbGF5b3V0IGhhcyB0aGVtXCJcbiAgICAgICAgICAgIDogXCJTYXZlIHRoZSB3aW5kb3dzIGFzIHRoZXkgYXJlIG5vdywgYW5kIHRoZSB0aWxpbmcgYmVsb3csIGludG8gdGhpcyBsYXlvdXRcIlxuICAgICAgICB9XG4gICAgICAgIG9uQ2xpY2s9eygpID0+IG1vZGVsLnNhdmVPdmVyKGxheW91dC5uYW1lKX1cbiAgICAgID5cbiAgICAgICAgU2F2ZVxuICAgICAgPC9QcmltYXJ5QnV0dG9uPlxuICAgIDwvRGl2PlxuICApO1xufSk7XG5cbmNvbnN0IFdpbmRvd0xheW91dHNNb2RhbCA9IG9ic2VydmVyKCgpID0+IHtcbiAgY29uc3QgbW9kZWwgPSB1c2VJbmplY3Qod2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSkoKTtcbiAgY29uc3QgcmVzcG9uZCA9IHVzZVJlc3BvbmRGcm9tTW9kYWwod2luZG93TGF5b3V0c01vZGFsS2luZCk7XG4gIGNvbnN0IHN0YXR1cyA9IG1vZGVsLnN0YXR1cy5nZXQoKTtcblxuICByZXR1cm4gKFxuICAgIDxNb2RhbENvbnRhaW5lclxuICAgICAgJHN0eWxlPXt7XG4gICAgICAgIHdpZHRoOiBcImNhbGModmFyKC0tdW5pdCkgKiAyNjApXCIsXG4gICAgICAgIG1heFdpZHRoOiBcIjk1dndcIixcbiAgICAgICAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgICAgIH19XG4gICAgPlxuICAgICAgPE1vZGFsSGVhZGVyIGljb249ezxTcGxpdFZpZXdJY29uIC8+fT5XaW5kb3cgbGF5b3V0czwvTW9kYWxIZWFkZXI+XG5cbiAgICAgIDxNb2RhbENvbnRlbnRcbiAgICAgICAgJGZsZXg9e3sgZGlyZWN0aW9uOiBcInZlcnRpY2FsXCIsIGdhcDogXCJtXCIgfX1cbiAgICAgICAgJHN0eWxlPXt7IGZsZXhHcm93OiAxIH19XG4gICAgICA+XG4gICAgICAgIHshbW9kZWwuY2FuQXJyYW5nZS5nZXQoKSAmJiAoXG4gICAgICAgICAgPFNwYW4gJGNvbG9yPVwid2FybmluZ1wiPlxuICAgICAgICAgICAgVGhpcyBMZW5zIGRvZXMgbm90IGxldCB3aW5kb3dzIGJlIGFycmFuZ2VkLiBXaW5kb3cgbGF5b3V0cyBuZWVkIExlbnNcbiAgICAgICAgICAgIFN0dWRpby5cbiAgICAgICAgICA8L1NwYW4+XG4gICAgICAgICl9XG5cbiAgICAgICAge3N0YXR1cyAmJiA8U3BhbiAkY29sb3I9XCJ0ZXh0TXV0ZWRcIj57c3RhdHVzfTwvU3Bhbj59XG5cbiAgICAgICAgPERpdlxuICAgICAgICAgICRmbGV4PXt7IGRpcmVjdGlvbjogXCJob3Jpem9udGFsXCIsIGdhcDogXCJsXCIgfX1cbiAgICAgICAgICAkZmxleENoaWxkXG4gICAgICAgICAgJHN0eWxlPXt7IGFsaWduSXRlbXM6IFwic3RyZXRjaFwiIH19XG4gICAgICAgID5cbiAgICAgICAgICA8TGF5b3V0TGlzdCAvPlxuXG4gICAgICAgICAgey8qIEVtcHR5IHVudGlsIGEgbGF5b3V0IGlzIHNlbGVjdGVkLiAqL31cbiAgICAgICAgICA8RGl2XG4gICAgICAgICAgICAkZmxleD17eyBkaXJlY3Rpb246IFwidmVydGljYWxcIiwgZ2FwOiBcIm1cIiB9fVxuICAgICAgICAgICAgJGZsZXhDaGlsZFxuICAgICAgICAgICAgJHN0eWxlPXt7IG1pbldpZHRoOiAwIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAge21vZGVsLnNlbGVjdGVkTGF5b3V0LmdldCgpICYmIChcbiAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICA8U2VsZWN0ZWRMYXlvdXQgLz5cbiAgICAgICAgICAgICAgICA8VGlsZVdpbmRvd3MgLz5cbiAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvRGl2PlxuICAgICAgICA8L0Rpdj5cbiAgICAgIDwvTW9kYWxDb250ZW50PlxuXG4gICAgICA8TW9kYWxGb290ZXI+XG4gICAgICAgIDxQbGFpbkJ1dHRvbiBvbkNsaWNrPXsoKSA9PiByZXNwb25kKCl9PkNsb3NlPC9QbGFpbkJ1dHRvbj5cbiAgICAgIDwvTW9kYWxGb290ZXI+XG4gICAgPC9Nb2RhbENvbnRhaW5lcj5cbiAgKTtcbn0pO1xuXG4vLyBVc2VzIG5vdGhpbmcgb2YgdGhlIGV4dGVuc2lvbiBidXQgdGhlIG1vZGFsJ3Mgb3duIGFuc3dlcmluZywgd2hpY2ggTGVucyBwcm92aWRlcy5cbmNvbnN0IE91dE9mRGF0ZU1vZGFsID0gKHsgZXJyb3IgfTogeyBlcnJvcjogdW5rbm93biB9KSA9PiB7XG4gIGNvbnN0IHJlc3BvbmQgPSB1c2VSZXNwb25kRnJvbU1vZGFsKHdpbmRvd0xheW91dHNNb2RhbEtpbmQpO1xuXG4gIHJldHVybiAoXG4gICAgPE1vZGFsQ29udGFpbmVyXG4gICAgICAkc3R5bGU9e3sgd2lkdGg6IFwiY2FsYyh2YXIoLS11bml0KSAqIDE0MClcIiwgbWF4V2lkdGg6IFwiOTB2d1wiIH19XG4gICAgPlxuICAgICAgPE1vZGFsSGVhZGVyIGljb249ezxTcGxpdFZpZXdJY29uIC8+fT5XaW5kb3cgbGF5b3V0czwvTW9kYWxIZWFkZXI+XG5cbiAgICAgIDxNb2RhbENvbnRlbnQgJGZsZXg9e3sgZGlyZWN0aW9uOiBcInZlcnRpY2FsXCIsIGdhcDogXCJtXCIgfX0+XG4gICAgICAgIDxTcGFuPlxuICAgICAgICAgIFRoaXMgZGlhbG9nIHN0b3BwZWQgd29ya2luZywgbW9zdCBsaWtlbHkgYmVjYXVzZSB0aGUgZXh0ZW5zaW9uIHdhc1xuICAgICAgICAgIHVwZGF0ZWQgd2hpbGUgaXQgd2FzIG9wZW4uXG4gICAgICAgIDwvU3Bhbj5cbiAgICAgICAgPFNwYW4gJGNvbG9yPVwidGV4dE11dGVkXCI+XG4gICAgICAgICAgQ2xvc2UgaXQgYW5kIG9wZW4gaXQgYWdhaW4uICh7U3RyaW5nKGVycm9yKX0pXG4gICAgICAgIDwvU3Bhbj5cbiAgICAgICAgey8qIFdoZXJlIGl0IGZhaWxlZCwgZm9yIHdob2V2ZXIgbG9va3MgaW50byBpdC4gKi99XG4gICAgICAgIDxwcmUgaGlkZGVuIGRhdGEtZXJyb3Itc3RhY2s+XG4gICAgICAgICAge2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IHVuZGVmaW5lZH1cbiAgICAgICAgPC9wcmU+XG4gICAgICA8L01vZGFsQ29udGVudD5cblxuICAgICAgPE1vZGFsRm9vdGVyPlxuICAgICAgICA8UGxhaW5CdXR0b24gb25DbGljaz17KCkgPT4gcmVzcG9uZCgpfT5DbG9zZTwvUGxhaW5CdXR0b24+XG4gICAgICA8L01vZGFsRm9vdGVyPlxuICAgIDwvTW9kYWxDb250YWluZXI+XG4gICk7XG59O1xuXG5jb25zdCBHdWFyZGVkV2luZG93TGF5b3V0c01vZGFsID0gKCkgPT4gKFxuICA8TW9kYWxFcnJvckJvdW5kYXJ5IGZhbGxiYWNrPXsoZXJyb3IpID0+IDxPdXRPZkRhdGVNb2RhbCBlcnJvcj17ZXJyb3J9IC8+fT5cbiAgICA8V2luZG93TGF5b3V0c01vZGFsIC8+XG4gIDwvTW9kYWxFcnJvckJvdW5kYXJ5PlxuKTtcblxuZXhwb3J0IGNvbnN0IHdpbmRvd0xheW91dHNNb2RhbEJ1bmNoID0gZ2V0TW9kYWxJbmplY3RhYmxlQnVuY2goe1xuICBraW5kOiB3aW5kb3dMYXlvdXRzTW9kYWxLaW5kLFxuICBDb21wb25lbnQ6IEd1YXJkZWRXaW5kb3dMYXlvdXRzTW9kYWwsXG4gIG9uQ2xvc2U6ICgpID0+IHVuZGVmaW5lZCxcbn0pO1xuIiwgImltcG9ydCB7IGFzU3R5bGVzaGVldCB9IGZyb20gXCJAazhzbGVucy9zdHlsZXNoZWV0LWNvbnRyYWN0c1wiO1xuZXhwb3J0IGNvbnN0IHN0eWxlc2hlZXQgPSBhc1N0eWxlc2hlZXQoeyBpZDogXCJAazhzbGVucy93aW5kb3ctbGF5b3V0cy9zcmMvdWkvaWNvbi1idXR0b24uc2Nzc1wiLCBjc3M6IFwiLndpbmRvdy1tYW5hZ2VyLWljb24tYnV0dG9uIHtcXG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgcGFkZGluZzogMnB4O1xcbiAgYm9yZGVyOiBub25lO1xcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgYmFja2dyb3VuZDogbm9uZTtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLndpbmRvdy1tYW5hZ2VyLWljb24tYnV0dG9uOmhvdmVyIHtcXG4gIGJhY2tncm91bmQ6IHJnYmEoMTI3LCAxMjcsIDEyNywgMC4yKTtcXG59XCIgfSk7IiwgImltcG9ydCB7IGFzU3R5bGVzaGVldCB9IGZyb20gXCJAazhzbGVucy9zdHlsZXNoZWV0LWNvbnRyYWN0c1wiO1xuZXhwb3J0IGNvbnN0IHN0eWxlc2hlZXQgPSBhc1N0eWxlc2hlZXQoeyBpZDogXCJAazhzbGVucy93aW5kb3ctbGF5b3V0cy9zcmMvdWkvbGF5b3V0LWxpc3QubW9kdWxlLnNjc3NcIiwgY3NzOiBcIi5sYXlvdXQtbGlzdC1tb2R1bGVfX2xpc3RfX19hSm9WTyB7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgbWF4LWhlaWdodDogMTAwJTtcXG4gIG92ZXJmbG93OiBhdXRvO1xcbn1cXG5cXG4ubGF5b3V0LWxpc3QtbW9kdWxlX19yb3dfX19CYnZIZSB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBmbGV4LXNocmluazogMDtcXG4gIG91dGxpbmU6IG5vbmU7XFxufVxcbi5sYXlvdXQtbGlzdC1tb2R1bGVfX3Jvd19fX0JidkhlICsgLmxheW91dC1saXN0LW1vZHVsZV9fcm93X19fQmJ2SGUge1xcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkO1xcbiAgYm9yZGVyLXRvcC1jb2xvcjogaW5oZXJpdDtcXG59XFxuLmxheW91dC1saXN0LW1vZHVsZV9fcm93X19fQmJ2SGU6aG92ZXIsIC5sYXlvdXQtbGlzdC1tb2R1bGVfX3Jvd19fX0JidkhlOmZvY3VzLXZpc2libGUge1xcbiAgYmFja2dyb3VuZDogcmdiYSgxMjcsIDEyNywgMTI3LCAwLjA4KTtcXG59XFxuXFxuLmxheW91dC1saXN0LW1vZHVsZV9fc2VsZWN0ZWRfX19Iby0teSxcXG4ubGF5b3V0LWxpc3QtbW9kdWxlX19zZWxlY3RlZF9fX0hvLS15OmhvdmVyIHtcXG4gIGJhY2tncm91bmQ6IHJnYmEoMTI3LCAxMjcsIDEyNywgMC4xNCk7XFxufVxcblxcbi5sYXlvdXQtbGlzdC1tb2R1bGVfX21hcmtlcl9fX0J0VWlDIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGxlZnQ6IDA7XFxuICB0b3A6IDA7XFxuICBib3R0b206IDA7XFxuICB3aWR0aDogM3B4O1xcbn1cXG5cXG4ubGF5b3V0LWxpc3QtbW9kdWxlX19uYW1lTGluZV9fX1R4clRlIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgZ2FwOiA4cHg7XFxuICBtaW4td2lkdGg6IDA7XFxufVxcblxcbi5sYXlvdXQtbGlzdC1tb2R1bGVfX25hbWVfX19OLWIzcyB7XFxuICBmbGV4OiAxIDEgYXV0bztcXG4gIG1pbi13aWR0aDogMDtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxufVxcblxcbi5sYXlvdXQtbGlzdC1tb2R1bGVfX3JlY2FsbF9fX25yTmJEIHtcXG4gIGZsZXgtc2hyaW5rOiAwO1xcbiAgb3BhY2l0eTogMDtcXG59XFxuLmxheW91dC1saXN0LW1vZHVsZV9fcmVjYWxsX19fbnJOYkQ6Zm9jdXMtdmlzaWJsZSB7XFxuICBvcGFjaXR5OiAxO1xcbn1cXG5cXG4ubGF5b3V0LWxpc3QtbW9kdWxlX19yb3dfX19CYnZIZTpob3ZlciAubGF5b3V0LWxpc3QtbW9kdWxlX19yZWNhbGxfX19uck5iRCB7XFxuICBvcGFjaXR5OiAxO1xcbn1cIiB9KTtcbmV4cG9ydCBkZWZhdWx0IHtcImxpc3RcIjpcImxheW91dC1saXN0LW1vZHVsZV9fbGlzdF9fX2FKb1ZPXCIsXCJyb3dcIjpcImxheW91dC1saXN0LW1vZHVsZV9fcm93X19fQmJ2SGVcIixcInNlbGVjdGVkXCI6XCJsYXlvdXQtbGlzdC1tb2R1bGVfX3NlbGVjdGVkX19fSG8tLXlcIixcIm1hcmtlclwiOlwibGF5b3V0LWxpc3QtbW9kdWxlX19tYXJrZXJfX19CdFVpQ1wiLFwibmFtZUxpbmVcIjpcImxheW91dC1saXN0LW1vZHVsZV9fbmFtZUxpbmVfX19UeHJUZVwiLFwibmFtZVwiOlwibGF5b3V0LWxpc3QtbW9kdWxlX19uYW1lX19fTi1iM3NcIixcInJlY2FsbFwiOlwibGF5b3V0LWxpc3QtbW9kdWxlX19yZWNhbGxfX19uck5iRFwifTsiLCAiaW1wb3J0IHsgQnV0dG9uLCBEaXYsIEZvcm0sIFNwYW4gfSBmcm9tIFwiQGs4c2xlbnMvZWxlbWVudC1jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBkcm9wRG93bk1lbnUgfSBmcm9tIFwiQGs4c2xlbnMvZHJvcC1kb3duLW1lbnUtY29udHJhY3RzXCI7XG5pbXBvcnQge1xuICBBZGRDaXJjbGVPdXRsaW5lSWNvbixcbiAgQ2xvc2VJY29uLFxuICBEYXNoYm9hcmRJY29uLFxuICBFZGl0SWNvbixcbiAgTW92ZVVwSWNvbixcbiAgUmVwbGF5SWNvbixcbiAgUmVtb3ZlQ2lyY2xlT3V0bGluZUljb24sXG4gIFNwaW5uZXJJY29uLFxufSBmcm9tIFwiQGs4c2xlbnMvaWNvblwiO1xuaW1wb3J0IHtcbiAgUGxhaW5CdXR0b24sXG4gIFByaW1hcnlCdXR0b24sXG4gIFRleHRJbnB1dCxcbn0gZnJvbSBcIkBrOHNsZW5zL2lucHV0LWNvbXBvbmVudHNcIjtcbmltcG9ydCB7IGlzQXBwbGljYXRpb25XaW5kb3cgfSBmcm9tIFwiQGs4c2xlbnMvbWVzc2FnaW5nLWNvbnRyYWN0c1wiO1xuaW1wb3J0IHsgdXNlSW5qZWN0IH0gZnJvbSBcIkBrOHNsZW5zL3VzZS1pbmplY3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgRGlzcGxheVJlY29yZCxcbiAgV2luZG93Qm91bmRzLFxufSBmcm9tIFwiQGs4c2xlbnMvd2luZG93LWxheW91dC1jb250cmFjdHNcIjtcbmltcG9ydCB7IG9ic2VydmVyIH0gZnJvbSBcIm1vYngtcmVhY3RcIjtcbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IG5hbWVPZlNjcmVlbiB9IGZyb20gXCIuLi9sYXlvdXRzL3NjcmVlbnNcIjtcbmltcG9ydCB7XG4gIG1vdmVJblBsYW4sXG4gIHJlc2l6ZUluUGxhbixcbiAgc2V0Q29sdW1uc0luUGxhbixcbiAgc2V0Um93c0luUGxhbixcbiAgdGFyZ2V0SW5HcmlkLFxuICB1bnRpbGVTY3JlZW5JblBsYW4sXG4gIHR5cGUgUGxhbm5lZFNjcmVlbixcbiAgdHlwZSBQbGFubmVkV2luZG93LFxuICB0eXBlIFBsYW5UYXJnZXQsXG4gIHR5cGUgUmVzb2x2ZWRUaWxpbmdQbGFuLFxufSBmcm9tIFwiLi4vbGF5b3V0cy90aWxpbmctcGxhblwiO1xuaW1wb3J0IHN0eWxlcyBmcm9tIFwiLi90aWxpbmctZWRpdG9yLm1vZHVsZS5zY3NzXCI7XG5pbXBvcnQgeyBuZXdXaW5kb3dNZW51S2luZCB9IGZyb20gXCIuL25ldy13aW5kb3ctbWVudS5pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyB3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlIH0gZnJvbSBcIi4vd2luZG93LWxheW91dHMtbW9kZWwuaW5qZWN0YWJsZVwiO1xuXG4vLyBUaGUgaGVpZ2h0IG9mIHRoZSBiYW5kIG92ZXIgZWFjaCBzY3JlZW4gbmFtaW5nIGl0LCBhYm92ZSB0aGUgZ3JpZC5cbmNvbnN0IGJhbmQgPSA0MDtcbi8vIFRoZSByb29tIGxlZnQgYmV0d2VlbiBzY3JlZW5zIGRyYXduIHNpZGUgYnkgc2lkZS5cbmNvbnN0IGdhcCA9IDMyO1xuLy8gVGhlIGxlYXN0IHdpZHRoIGEgc2NyZWVuIGlzIGRyYXduIGF0IGFzIHRoZSBzY3JlZW5zIGxpZTogbmFycm93ZXIsIHRoZXkgYXJlIGRyYXduIGluIHJvd3MgaW5zdGVhZC5cbmNvbnN0IG1pblNjcmVlbldpZHRoID0gMzYwO1xuXG5pbnRlcmZhY2UgUmVjdCB7XG4gIHJlYWRvbmx5IGxlZnQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgdG9wOiBudW1iZXI7XG4gIHJlYWRvbmx5IHdpZHRoOiBudW1iZXI7XG4gIHJlYWRvbmx5IGhlaWdodDogbnVtYmVyO1xufVxuXG5jb25zdCBvdmVybGFwcyA9IChhOiBXaW5kb3dCb3VuZHMsIGI6IFdpbmRvd0JvdW5kcykgPT5cbiAgYS54IDwgYi54ICsgYi53aWR0aCAmJlxuICBiLnggPCBhLnggKyBhLndpZHRoICYmXG4gIGEueSA8IGIueSArIGIuaGVpZ2h0ICYmXG4gIGIueSA8IGEueSArIGEuaGVpZ2h0O1xuXG4vLyBXaGVyZSBlYWNoIHNjcmVlbiBpcyBkcmF3biwgaW4gcGVyY2VudCBvZiB0aGUgZHJhd2luZywgYXMgdGhlIHNjcmVlbnMgbGllIHRvIGVhY2ggb3RoZXIuIEEgc2NyZWVuXG4vLyBub3QgY29ubmVjdGVkIGlzIGRyYXduIHdoZXJlIGl0IHdhcywgdW5sZXNzIGEgc2NyZWVuIGlzIHRoZXJlIG5vdzogdGhlbiByaWdodCBvZiB0aGVtIGFsbC4gV2hlblxuLy8gdGhlIHdpZHRoIHRoZSBkcmF3aW5nIGhhcyB3b3VsZCBkcmF3IGEgc2NyZWVuIG5hcnJvd2VyIHRoYW4gaXQgY2FuIGJlIHVzZWQgYXQsIHRoZSBzY3JlZW5zIHdyYXBcbi8vIG9udG8gcm93cyBpbnN0ZWFkLCB0YWtpbmcgdGhlIGhlaWdodCB0aGV5IG5lZWQuXG5jb25zdCBkcmF3U2NyZWVucyA9IChcbiAgc2NyZWVuczogcmVhZG9ubHkgUGxhbm5lZFNjcmVlbltdLFxuICByb29tOiBudW1iZXIgfCB1bmRlZmluZWQsXG4pID0+IHtcbiAgaWYgKHNjcmVlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHsgcmVjdHM6IG5ldyBNYXA8bnVtYmVyLCBSZWN0PigpLCBhc3BlY3RSYXRpbzogMSwgd3JhcHM6IGZhbHNlIH07XG4gIH1cblxuICBjb25zdCBwbGFjZWQ6IFdpbmRvd0JvdW5kc1tdID0gW107XG5cbiAgZm9yIChjb25zdCBzY3JlZW4gb2YgWy4uLnNjcmVlbnNdLnNvcnQoXG4gICAgKGEsIGIpID0+IE51bWJlcihhLm1pc3NpbmcpIC0gTnVtYmVyKGIubWlzc2luZyksXG4gICkpIHtcbiAgICBjb25zdCBib3VuZHMgPSBzY3JlZW4uZGlzcGxheS5ib3VuZHMuZ2V0KCk7XG5cbiAgICBwbGFjZWRbc2NyZWVucy5pbmRleE9mKHNjcmVlbildID1cbiAgICAgIHNjcmVlbi5taXNzaW5nICYmIHBsYWNlZC5zb21lKChpdCkgPT4gaXQgJiYgb3ZlcmxhcHMoaXQsIGJvdW5kcykpXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uYm91bmRzLFxuICAgICAgICAgICAgeDogTWF0aC5tYXgoLi4ucGxhY2VkLmZpbHRlcihCb29sZWFuKS5tYXAoKGl0KSA9PiBpdC54ICsgaXQud2lkdGgpKSxcbiAgICAgICAgICAgIHk6IE1hdGgubWluKC4uLnBsYWNlZC5maWx0ZXIoQm9vbGVhbikubWFwKChpdCkgPT4gaXQueSkpLFxuICAgICAgICAgIH1cbiAgICAgICAgOiBib3VuZHM7XG4gIH1cblxuICBjb25zdCBtaW5YID0gTWF0aC5taW4oLi4ucGxhY2VkLm1hcCgoaXQpID0+IGl0LngpKTtcbiAgY29uc3QgbWluWSA9IE1hdGgubWluKC4uLnBsYWNlZC5tYXAoKGl0KSA9PiBpdC55KSk7XG4gIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoLi4ucGxhY2VkLm1hcCgoaXQpID0+IGl0LnggKyBpdC53aWR0aCkpIC0gbWluWDtcbiAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoLi4ucGxhY2VkLm1hcCgoaXQpID0+IGl0LnkgKyBpdC5oZWlnaHQpKSAtIG1pblk7XG5cbiAgY29uc3QgcmVjdHMgPSBuZXcgTWFwPG51bWJlciwgUmVjdD4oXG4gICAgc2NyZWVucy5tYXAoKHNjcmVlbiwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGJvdW5kcyA9IHBsYWNlZFtpbmRleF07XG5cbiAgICAgIHJldHVybiBbXG4gICAgICAgIHNjcmVlbi5kaXNwbGF5LmlkLFxuICAgICAgICB7XG4gICAgICAgICAgbGVmdDogKChib3VuZHMueCAtIG1pblgpIC8gd2lkdGgpICogMTAwLFxuICAgICAgICAgIHRvcDogKChib3VuZHMueSAtIG1pblkpIC8gaGVpZ2h0KSAqIDEwMCxcbiAgICAgICAgICB3aWR0aDogKGJvdW5kcy53aWR0aCAvIHdpZHRoKSAqIDEwMCxcbiAgICAgICAgICBoZWlnaHQ6IChib3VuZHMuaGVpZ2h0IC8gaGVpZ2h0KSAqIDEwMCxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfSksXG4gICk7XG5cbiAgY29uc3QgZml0cyA9XG4gICAgIXJvb20gfHxcbiAgICBwbGFjZWQuZXZlcnkoKGl0KSA9PiAoaXQud2lkdGggLyB3aWR0aCkgKiByb29tIC0gZ2FwID49IG1pblNjcmVlbldpZHRoKTtcblxuICByZXR1cm4gZml0c1xuICAgID8geyByZWN0cywgYXNwZWN0UmF0aW86IHdpZHRoIC8gaGVpZ2h0LCB3cmFwczogZmFsc2UgfVxuICAgIDoge1xuICAgICAgICAuLi53cmFwU2NyZWVucyhcbiAgICAgICAgICBzY3JlZW5zLm1hcCgoc2NyZWVuLCBpbmRleCkgPT4gKHtcbiAgICAgICAgICAgIGlkOiBzY3JlZW4uZGlzcGxheS5pZCxcbiAgICAgICAgICAgIGJvdW5kczogcGxhY2VkW2luZGV4XSxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAgcm9vbSxcbiAgICAgICAgKSxcbiAgICAgICAgd3JhcHM6IHRydWUsXG4gICAgICB9O1xufTtcblxuLy8gVGhlIHNjcmVlbnMgaW4gcm93cywgbGVmdCB0byByaWdodCBhcyB0aGV5IGxpZSwgYXQgb25lIHNjYWxlIHNvIHRoYXQgdGhleSBrZWVwIHRoZWlyIHNpemVzIHRvXG4vLyBlYWNoIG90aGVyOiBhcyBtYW55IGluIGEgcm93IGFzIGZpdCBhdCBhIHVzYWJsZSB3aWR0aCwgZXZlcnkgcm93IGNlbnRyZWQuXG5jb25zdCB3cmFwU2NyZWVucyA9IChcbiAgc2NyZWVuczogcmVhZG9ubHkgeyBpZDogbnVtYmVyOyBib3VuZHM6IFdpbmRvd0JvdW5kcyB9W10sXG4gIHJvb206IG51bWJlcixcbikgPT4ge1xuICBjb25zdCBvcmRlcmVkID0gWy4uLnNjcmVlbnNdLnNvcnQoXG4gICAgKGEsIGIpID0+IGEuYm91bmRzLnggLSBiLmJvdW5kcy54IHx8IGEuYm91bmRzLnkgLSBiLmJvdW5kcy55LFxuICApO1xuICBjb25zdCB3aWRlc3QgPSBvcmRlcmVkLm1hcCgoaXQpID0+IGl0LmJvdW5kcy53aWR0aCkuc29ydCgoYSwgYikgPT4gYiAtIGEpO1xuICBjb25zdCBuYXJyb3dlc3QgPSB3aWRlc3Rbd2lkZXN0Lmxlbmd0aCAtIDFdO1xuXG4gIC8vIFRoZSBsYXJnZXN0IHNjYWxlIGF0IHdoaWNoIHRoZSB3aWRlc3Qgb2YgYXMgbWFueSBzY3JlZW5zIGFzIGNhbiBzaGFyZSBhIHJvdyBmaWxsIGl0LCB0aGVcbiAgLy8gbmFycm93ZXN0IG9mIHRoZW0gc3RpbGwgdXNhYmxlOyBvbmUgc2NyZWVuIHRvIGEgcm93IGF0IHRoZSBsZWFzdC5cbiAgY29uc3Qgc2NhbGUgPVxuICAgIEFycmF5LmZyb20oXG4gICAgICB7IGxlbmd0aDogb3JkZXJlZC5sZW5ndGggLSAxIH0sXG4gICAgICAoXywgaW5kZXgpID0+IG9yZGVyZWQubGVuZ3RoIC0gMSAtIGluZGV4LFxuICAgIClcbiAgICAgIC5tYXAoXG4gICAgICAgIChjb3VudCkgPT5cbiAgICAgICAgICByb29tIC8gd2lkZXN0LnNsaWNlKDAsIGNvdW50KS5yZWR1Y2UoKHN1bSwgaXQpID0+IHN1bSArIGl0LCAwKSxcbiAgICAgIClcbiAgICAgIC5maW5kKChpdCkgPT4gbmFycm93ZXN0ICogaXQgLSBnYXAgPj0gbWluU2NyZWVuV2lkdGgpID8/IHJvb20gLyB3aWRlc3RbMF07XG5cbiAgY29uc3Qgcm93czogeyBpZDogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9W11bXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgeyBpZCwgYm91bmRzIH0gb2Ygb3JkZXJlZCkge1xuICAgIGNvbnN0IHNsb3QgPSB7XG4gICAgICBpZCxcbiAgICAgIHdpZHRoOiBib3VuZHMud2lkdGggKiBzY2FsZSxcbiAgICAgIGhlaWdodDogYm91bmRzLmhlaWdodCAqIHNjYWxlLFxuICAgIH07XG4gICAgY29uc3Qgcm93ID0gcm93c1tyb3dzLmxlbmd0aCAtIDFdO1xuXG4gICAgaWYgKFxuICAgICAgcm93ICYmXG4gICAgICByb3cucmVkdWNlKChzdW0sIGl0KSA9PiBzdW0gKyBpdC53aWR0aCwgMCkgKyBzbG90LndpZHRoIDw9IHJvb20gKyAwLjVcbiAgICApIHtcbiAgICAgIHJvdy5wdXNoKHNsb3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICByb3dzLnB1c2goW3Nsb3RdKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBoZWlnaHQgPSByb3dzLnJlZHVjZShcbiAgICAoc3VtLCByb3cpID0+IHN1bSArIE1hdGgubWF4KC4uLnJvdy5tYXAoKGl0KSA9PiBpdC5oZWlnaHQpKSxcbiAgICAwLFxuICApO1xuICBjb25zdCByZWN0cyA9IG5ldyBNYXA8bnVtYmVyLCBSZWN0PigpO1xuICBsZXQgdG9wID0gMDtcblxuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgbGV0IGxlZnQgPSAocm9vbSAtIHJvdy5yZWR1Y2UoKHN1bSwgaXQpID0+IHN1bSArIGl0LndpZHRoLCAwKSkgLyAyO1xuXG4gICAgZm9yIChjb25zdCBzbG90IG9mIHJvdykge1xuICAgICAgcmVjdHMuc2V0KHNsb3QuaWQsIHtcbiAgICAgICAgbGVmdDogKGxlZnQgLyByb29tKSAqIDEwMCxcbiAgICAgICAgdG9wOiAodG9wIC8gaGVpZ2h0KSAqIDEwMCxcbiAgICAgICAgd2lkdGg6IChzbG90LndpZHRoIC8gcm9vbSkgKiAxMDAsXG4gICAgICAgIGhlaWdodDogKHNsb3QuaGVpZ2h0IC8gaGVpZ2h0KSAqIDEwMCxcbiAgICAgIH0pO1xuXG4gICAgICBsZWZ0ICs9IHNsb3Qud2lkdGg7XG4gICAgfVxuXG4gICAgdG9wICs9IE1hdGgubWF4KC4uLnJvdy5tYXAoKGl0KSA9PiBpdC5oZWlnaHQpKTtcbiAgfVxuXG4gIHJldHVybiB7IHJlY3RzLCBhc3BlY3RSYXRpbzogcm9vbSAvIGhlaWdodCB9O1xufTtcblxuLy8gVGhlIGdyaWQgb2YgYSBzY3JlZW4gaW4gcGl4ZWxzIG9uIHRoZSBwYWdlLCBmcm9tIHRoZSBkcmF3aW5nJ3MgcGxhY2Ugb24gdGhlIHBhZ2UuXG5jb25zdCBncmlkT25QYWdlID0gKGRyYXdpbmc6IERPTVJlY3QsIHJlY3Q6IFJlY3QpID0+IHtcbiAgY29uc3QgbGVmdCA9IGRyYXdpbmcubGVmdCArIChyZWN0LmxlZnQgLyAxMDApICogZHJhd2luZy53aWR0aCArIGdhcCAvIDI7XG4gIGNvbnN0IHRvcCA9IGRyYXdpbmcudG9wICsgKHJlY3QudG9wIC8gMTAwKSAqIGRyYXdpbmcuaGVpZ2h0ICsgZ2FwIC8gMiArIGJhbmQ7XG5cbiAgcmV0dXJuIHtcbiAgICBsZWZ0LFxuICAgIHRvcCxcbiAgICB3aWR0aDogKHJlY3Qud2lkdGggLyAxMDApICogZHJhd2luZy53aWR0aCAtIGdhcCxcbiAgICBoZWlnaHQ6IChyZWN0LmhlaWdodCAvIDEwMCkgKiBkcmF3aW5nLmhlaWdodCAtIGdhcCAtIGJhbmQsXG4gIH07XG59O1xuXG4vLyBXaGVyZSBldmVyeSB3aW5kb3cgb2YgdGhlIHBsYW4gaXM6IG9uIHdoaWNoIHNjcmVlbiwgaW4gd2hpY2ggY2VsbHM7IGFuZCBldmVyeSBzY3JlZW4ncyBncmlkLlxuY29uc3QgcGxhY2VzT2YgPSAocGxhbjogUmVzb2x2ZWRUaWxpbmdQbGFuKSA9PlxuICBKU09OLnN0cmluZ2lmeShbXG4gICAgcGxhbi5zY3JlZW5zLm1hcCgoc2NyZWVuKSA9PiBbXG4gICAgICBzY3JlZW4uZGlzcGxheS5pZCxcbiAgICAgIHNjcmVlbi5jb2x1bW5zLFxuICAgICAgc2NyZWVuLnJvd3MsXG4gICAgICBzY3JlZW4ud2luZG93c1xuICAgICAgICAubWFwKChpdCkgPT4gW2l0LmtleSwgaXQuY29sdW1uLCBpdC5yb3csIGl0LmNvbHVtbnMsIGl0LnJvd3NdKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gU3RyaW5nKGFbMF0pLmxvY2FsZUNvbXBhcmUoU3RyaW5nKGJbMF0pKSksXG4gICAgXSksXG4gICAgcGxhbi51bnRpbGVkLm1hcCgoaXQpID0+IGl0LmtleSkuc29ydCgpLFxuICBdKTtcblxudHlwZSBEcmFnID1cbiAgfCB7XG4gICAgICByZWFkb25seSBraW5kOiBcIm1vdmVcIjtcbiAgICAgIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICAgICAgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcbiAgICAgIC8vIFRoZSBjZWxsIG9mIHRoZSB3aW5kb3cgdGhhdCB3YXMgZ3JhYmJlZCwgY291bnRlZCBmcm9tIGl0cyB0b3AgbGVmdC5cbiAgICAgIHJlYWRvbmx5IGdyYWJiZWQ6IHsgcmVhZG9ubHkgY29sdW1uOiBudW1iZXI7IHJlYWRvbmx5IHJvdzogbnVtYmVyIH07XG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IGtpbmQ6IFwicmVzaXplXCI7XG4gICAgICByZWFkb25seSBrZXk6IHN0cmluZztcbiAgICAgIHJlYWRvbmx5IGRpc3BsYXlJZDogbnVtYmVyO1xuICAgIH07XG5cbmNvbnN0IGRyYXdpbmdTZWxlY3RvciA9IFwiW2RhdGEtdGlsaW5nLXNjcmVlbnNdXCI7XG5jb25zdCB0cmF5U2VsZWN0b3IgPSBcIltkYXRhLXRpbGluZy10cmF5XVwiO1xuXG4vLyBXaGVyZSBhIHdpbmRvdyBkcmFnZ2VkIHRvIHRoZSBwb2ludCBnb2VzOiBvbiBhIHNjcmVlbiwgd2l0aCB0aGUgY2VsbCBpdCB3YXMgZ3JhYmJlZCBieSBpbiB0aGUgY2VsbFxuLy8gdW5kZXIgdGhlIHBvaW50LCBvciBpbiB0aGUgZmlyc3QgZnJlZSBjZWxsIG92ZXIgdGhlIHNjcmVlbidzIG5hbWU7IGluIHRoZSB0cmF5LCBsZWZ0IGFzIGl0IGlzLiBUaGVcbi8vIGNlbGxzIGFyZSB0aG9zZSBvZiB0aGUgcGxhbiBiZWZvcmUgdGhlIGRyYWcsIHNvIHRoYXQgdGhlIHByZXZpZXcgZ3Jvd2luZyBhIHNjcmVlbidzIGdyaWQgZG9lcyBub3Rcbi8vIG1vdmUgdGhlbSB1bmRlciB0aGUgcG9pbnRlci5cbmNvbnN0IHRhcmdldEF0ID0gKFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgcGxhbjogUmVzb2x2ZWRUaWxpbmdQbGFuLFxuICByZWN0czogTWFwPG51bWJlciwgUmVjdD4sXG4gIGdyYWJiZWQ6IHsgcmVhZG9ubHkgY29sdW1uOiBudW1iZXI7IHJlYWRvbmx5IHJvdzogbnVtYmVyIH0sXG4pOiBQbGFuVGFyZ2V0IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSk/LmNsb3Nlc3QodHJheVNlbGVjdG9yKSkge1xuICAgIHJldHVybiB7IGRpc3BsYXlJZDogbnVsbCB9O1xuICB9XG5cbiAgY29uc3QgZHJhd2luZyA9IGRvY3VtZW50XG4gICAgLnF1ZXJ5U2VsZWN0b3IoZHJhd2luZ1NlbGVjdG9yKVxuICAgID8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgaWYgKCFkcmF3aW5nKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZvciAoY29uc3Qgc2NyZWVuIG9mIHBsYW4uc2NyZWVucykge1xuICAgIGNvbnN0IGdyaWQgPSBncmlkT25QYWdlKGRyYXdpbmcsIHJlY3RzLmdldChzY3JlZW4uZGlzcGxheS5pZCkhKTtcblxuICAgIGlmIChcbiAgICAgIHggPCBncmlkLmxlZnQgfHxcbiAgICAgIHggPiBncmlkLmxlZnQgKyBncmlkLndpZHRoIHx8XG4gICAgICB5IDwgZ3JpZC50b3AgLSBiYW5kIHx8XG4gICAgICB5ID4gZ3JpZC50b3AgKyBncmlkLmhlaWdodFxuICAgICkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHkgPCBncmlkLnRvcFxuICAgICAgPyB7IGRpc3BsYXlJZDogc2NyZWVuLmRpc3BsYXkuaWQgfVxuICAgICAgOiB0YXJnZXRJbkdyaWQoeCwgeSwgZ3JpZCwgc2NyZWVuLCBncmFiYmVkKTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vLyBDbG9zZXMgYSBzdWItd2luZG93IGFuZCB0YWtlcyBpdCBvdXQgb2YgdGhlIGxheW91dDsgb25lIG5vdCBvcGVuIGlzIG9ubHkgdGFrZW4gb3V0IG9mIGl0LlxuY29uc3QgQ2xvc2VXaW5kb3dCdXR0b24gPSBvYnNlcnZlcihcbiAgKHsgd2luZG93LCBpbmxpbmUgfTogeyB3aW5kb3c6IFBsYW5uZWRXaW5kb3c7IGlubGluZT86IGJvb2xlYW4gfSkgPT4ge1xuICAgIGNvbnN0IG1vZGVsID0gdXNlSW5qZWN0KHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUpKCk7XG5cbiAgICBpZiAoaXNBcHBsaWNhdGlvbldpbmRvdyh3aW5kb3cucmVjb3JkLndpbmRvdykpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzc05hbWU9e1tcbiAgICAgICAgICBzdHlsZXMuY2xvc2VXaW5kb3csXG4gICAgICAgICAgaW5saW5lID8gc3R5bGVzLmNsb3NlV2luZG93SW5saW5lIDogXCJcIixcbiAgICAgICAgXS5qb2luKFwiIFwiKX1cbiAgICAgICAgYXJpYS1sYWJlbD17XG4gICAgICAgICAgd2luZG93Lm1pc3NpbmdcbiAgICAgICAgICAgID8gXCJSZW1vdmUgZnJvbSB0aGUgbGF5b3V0XCJcbiAgICAgICAgICAgIDogXCJDbG9zZSB0aGUgd2luZG93IGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgbGF5b3V0XCJcbiAgICAgICAgfVxuICAgICAgICB0aXRsZT17XG4gICAgICAgICAgd2luZG93Lm1pc3NpbmdcbiAgICAgICAgICAgID8gXCJSZW1vdmUgZnJvbSB0aGUgbGF5b3V0XCJcbiAgICAgICAgICAgIDogXCJDbG9zZSB0aGUgd2luZG93IGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgbGF5b3V0XCJcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3QgdGhlIHN0YXJ0IG9mIGRyYWdnaW5nIHRoZSB3aW5kb3cuXG4gICAgICAgIG9uUG9pbnRlckRvd249eyhldmVudCkgPT4gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCl9XG4gICAgICAgIG9uQ2xpY2s9eygpID0+IHZvaWQgbW9kZWwuY2xvc2VXaW5kb3cod2luZG93KX1cbiAgICAgID5cbiAgICAgICAgey8qIExhcmdlciBvbiBhIHRpbGUgdGhhbiBvbiBhIGNoaXAgb2YgdGhlIHdpbmRvd3Mgbm90IHRpbGVkLiAqL31cbiAgICAgICAgPENsb3NlSWNvbiAkc2l6ZT17aW5saW5lID8gXCJzXCIgOiBcIm1cIn0gLz5cbiAgICAgIDwvYnV0dG9uPlxuICAgICk7XG4gIH0sXG4pO1xuXG4vLyBUaGUgd2luZG93J3MgbmFtZSwgcmVuYW1lZCBpbiBwbGFjZSBhcyBhIGxheW91dCdzIGlzOiBFbnRlciBvciBsZWF2aW5nIGl0IGtlZXBzIHRoZSBuYW1lIHR5cGVkLFxuLy8gRXNjYXBlIHRoZSBuYW1lIGl0IGhhZC5cbmNvbnN0IFdpbmRvd1RpdGxlID0gb2JzZXJ2ZXIoKHsgd2luZG93IH06IHsgd2luZG93OiBQbGFubmVkV2luZG93IH0pID0+IHtcbiAgY29uc3QgbW9kZWwgPSB1c2VJbmplY3Qod2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSkoKTtcblxuICAvLyBTZWxlY3RzIHRoZSBuYW1lIG9uY2UgaXRzIGlucHV0IHNob3dzLCBzbyB0aGF0IHR5cGluZyByZXBsYWNlcyBpdC5cbiAgY29uc3Qgc2VsZWN0V2hlblNob3duID0gdXNlQ2FsbGJhY2soKGlucHV0OiBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbCkgPT4ge1xuICAgIGlmIChpbnB1dCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlucHV0LmZvY3VzKCk7XG4gICAgICAgIGlucHV0LnNlbGVjdCgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCBbXSk7XG5cbiAgaWYgKG1vZGVsLnJlbmFtaW5nV2luZG93LmdldCgpICE9PSB3aW5kb3cua2V5KSB7XG4gICAgcmV0dXJuIDxzcGFuIGNsYXNzTmFtZT17c3R5bGVzLnRpbGVUaXRsZX0+e3RpdGxlT2Yod2luZG93KX08L3NwYW4+O1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8Rm9ybVxuICAgICAgY2xhc3NOYW1lPXtzdHlsZXMudGlsZVRpdGxlRm9ybX1cbiAgICAgICR0b29sdGlwPVwiRW50ZXIgb3IgY2xpY2tpbmcgZWxzZXdoZXJlIGtlZXBzIHRoZSBuYW1lOyBFc2NhcGUga2VlcHMgdGhlIG9sZCBvbmVcIlxuICAgICAgLy8gTm90IHRoZSBzdGFydCBvZiBkcmFnZ2luZyB0aGUgd2luZG93LCBub3Igb2Ygc2VsZWN0aW5nIHRleHQgYnkgZHJhZ2dpbmcgb3ZlciBpdC5cbiAgICAgIG9uUG9pbnRlckRvd249eyhldmVudCkgPT4gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCl9XG4gICAgICBvblN1Ym1pdD17KGV2ZW50KSA9PiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHZvaWQgbW9kZWwucmVuYW1lV2luZG93KHdpbmRvdyk7XG4gICAgICB9fVxuICAgID5cbiAgICAgIDxUZXh0SW5wdXRcbiAgICAgICAgYXJpYS1sYWJlbD1cIk5hbWUgb2YgdGhlIHdpbmRvd1wiXG4gICAgICAgIHZhbHVlPXttb2RlbC53aW5kb3dOYW1lRHJhZnQuZ2V0KCl9XG4gICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+IG1vZGVsLnNldFdpbmRvd05hbWVEcmFmdChldmVudC50YXJnZXQudmFsdWUpfVxuICAgICAgICAkcmVmPXtzZWxlY3RXaGVuU2hvd259XG4gICAgICAgIG9uQmx1cj17KCkgPT4gdm9pZCBtb2RlbC5yZW5hbWVXaW5kb3cod2luZG93KX1cbiAgICAgICAgb25LZXlEb3duPXsoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBcIkVzY2FwZVwiKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBtb2RlbC5jYW5jZWxSZW5hbWluZ1dpbmRvdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfX1cbiAgICAgIC8+XG4gICAgPC9Gb3JtPlxuICApO1xufSk7XG5cbi8vIFJlbmFtZXMgdGhlIHdpbmRvdywgcmlnaHQgYWZ0ZXIgaXRzIG5hbWUsIGFzIGEgbGF5b3V0J3MgcGVuIGlzOiBvbmx5IGEgc3ViLXdpbmRvdyBvcGVuIGNhbiBiZS5cbmNvbnN0IFJlbmFtZVdpbmRvd0J1dHRvbiA9IG9ic2VydmVyKFxuICAoeyB3aW5kb3csIG9uVGlsZSB9OiB7IHdpbmRvdzogUGxhbm5lZFdpbmRvdzsgb25UaWxlPzogYm9vbGVhbiB9KSA9PiB7XG4gICAgY29uc3QgbW9kZWwgPSB1c2VJbmplY3Qod2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSkoKTtcblxuICAgIGlmIChcbiAgICAgICFtb2RlbC5jYW5SZW5hbWVXaW5kb3cod2luZG93KSB8fFxuICAgICAgbW9kZWwucmVuYW1pbmdXaW5kb3cuZ2V0KCkgPT09IHdpbmRvdy5rZXlcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFRoZSB0b29sdGlwIGlzIHRoZSB3cmFwcGVyJ3MsIGFzIExlbnMgc2hvd3MgaXQsIHJhdGhlciB0aGFuIHRoZSBzbG93IG9uZSBvZiB0aGUgYnJvd3Nlci5cbiAgICByZXR1cm4gKFxuICAgICAgPFNwYW4gJHRvb2x0aXA9XCJSZW5hbWUgdGhlIHdpbmRvdzogaXRzIHRpdGxlIGluIExlbnMsIGtlcHQgd2hhdGV2ZXIgaXQgc2hvd3NcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzTmFtZT17c3R5bGVzLnJlbmFtZVdpbmRvd31cbiAgICAgICAgICBhcmlhLWxhYmVsPVwiUmVuYW1lIHRoZSB3aW5kb3dcIlxuICAgICAgICAgIC8vIE5vdCB0aGUgc3RhcnQgb2YgZHJhZ2dpbmcgdGhlIHdpbmRvdy5cbiAgICAgICAgICBvblBvaW50ZXJEb3duPXsoZXZlbnQpID0+IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpfVxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG1vZGVsLnN0YXJ0UmVuYW1pbmdXaW5kb3cod2luZG93KX1cbiAgICAgICAgPlxuICAgICAgICAgIHsvKiBMYXJnZXIgb24gYSB0aWxlIHRoYW4gb24gYSBjaGlwIG9mIHRoZSB3aW5kb3dzIG5vdCB0aWxlZC4gKi99XG4gICAgICAgICAgPEVkaXRJY29uICRzaXplPXtvblRpbGUgPyBcIm1cIiA6IFwic1wifSAvPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvU3Bhbj5cbiAgICApO1xuICB9LFxuKTtcblxuLy8gT3BlbnMgdGhlIHdpbmRvdyBub3Qgb3BlbiBhZ2FpbiwgYXMgaXQgd2FzLCB3aGVyZSBpdHMgdGlsZSBpczogc2hvd24gb25seSB3aGVuIExlbnMga2VwdCBob3cuXG5jb25zdCBSZW9wZW5XaW5kb3dCdXR0b24gPSBvYnNlcnZlcigoeyB3aW5kb3cgfTogeyB3aW5kb3c6IFBsYW5uZWRXaW5kb3cgfSkgPT4ge1xuICBjb25zdCBtb2RlbCA9IHVzZUluamVjdCh3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlKSgpO1xuXG4gIGlmICghbW9kZWwuY2FuUmVvcGVuKHdpbmRvdykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPEJ1dHRvblxuICAgICAgY2xhc3NOYW1lPXtzdHlsZXMucmVvcGVuV2luZG93fVxuICAgICAgJGludGVyYWN0aXZlXG4gICAgICBhcmlhLWxhYmVsPVwiT3BlbiB0aGUgd2luZG93IGFnYWluXCJcbiAgICAgICR0b29sdGlwPVwiT3BlbiB0aGUgd2luZG93IGFnYWluLCB3aGVyZSBpdHMgdGlsZSBpc1wiXG4gICAgICAvLyBOb3QgdGhlIHN0YXJ0IG9mIGRyYWdnaW5nIHRoZSB3aW5kb3cuXG4gICAgICBvblBvaW50ZXJEb3duPXsoZXZlbnQpID0+IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpfVxuICAgICAgJG9uQ2xpY2s9eygpID0+IHZvaWQgbW9kZWwucmVvcGVuV2luZG93KHdpbmRvdyl9XG4gICAgPlxuICAgICAgPFJlcGxheUljb24gJHNpemU9XCJtXCIgJGNvbG9yPVwicHJpbWFyeVwiIC8+XG4gICAgPC9CdXR0b24+XG4gICk7XG59KTtcblxuY29uc3QgdGl0bGVPZiA9ICh3aW5kb3c6IFBsYW5uZWRXaW5kb3cpID0+XG4gIGlzQXBwbGljYXRpb25XaW5kb3cod2luZG93LnJlY29yZC53aW5kb3cpXG4gICAgPyBgJHt3aW5kb3cucmVjb3JkLnRpdGxlLmdldCgpfSAobWFpbiB3aW5kb3cpYFxuICAgIDogd2luZG93LnJlY29yZC50aXRsZS5nZXQoKTtcblxuY29uc3QgcGx1cmFsID0gKGNvdW50OiBudW1iZXIsIHdvcmQ6IHN0cmluZykgPT5cbiAgYCR7Y291bnR9ICR7d29yZH0ke2NvdW50ID09PSAxID8gXCJcIiA6IFwic1wifWA7XG5cbi8vIFN0ZXBzIGEgY291bnQgZG93biBhbmQgdXAsIGl0cyBidXR0b25zIHRlbGxpbmcgdGhlIGNvdW50OiBhY3Jvc3MgZm9yIGNvbHVtbnMsIGFsb25nIHRoZSB0b3Agb2Zcbi8vIHRoZSBzY3JlZW4sIGFuZCB1cCBhbmQgZG93biBmb3Igcm93cywgYWxvbmcgaXRzIHNpZGUsIG1vcmUgYWJvdmUgZmV3ZXIuXG5jb25zdCBTdGVwcGVyID0gKHtcbiAgdmFsdWUsXG4gIHdvcmQsXG4gIG1pbixcbiAgd2hlcmUsXG4gIHZlcnRpY2FsID0gZmFsc2UsXG4gIG9uQ2hhbmdlLFxufToge1xuICB2YWx1ZTogbnVtYmVyO1xuICB3b3JkOiBzdHJpbmc7XG4gIG1pbjogbnVtYmVyO1xuICB3aGVyZTogc3RyaW5nO1xuICB2ZXJ0aWNhbD86IGJvb2xlYW47XG4gIG9uQ2hhbmdlOiAodmFsdWU6IG51bWJlcikgPT4gdm9pZDtcbn0pID0+IHtcbiAgY29uc3QgZmV3ZXIgPSAoXG4gICAgPFN0ZXBwZXJCdXR0b25cbiAgICAgIGxhYmVsPXtgRmV3ZXIgJHt3b3JkfXMgb24gJHt3aGVyZX1gfVxuICAgICAgdG9vbHRpcD17XG4gICAgICAgIHZhbHVlID4gbWluXG4gICAgICAgICAgPyBgUmVtb3ZlIGEgJHt3b3JkfTogJHtwbHVyYWwodmFsdWUgLSAxLCB3b3JkKX1gXG4gICAgICAgICAgOiB2YWx1ZSA+IDFcbiAgICAgICAgICAgID8gYCR7cGx1cmFsKHZhbHVlLCB3b3JkKX06IHRoZSB3aW5kb3dzIGhlcmUgbmVlZCBubyBmZXdlcmBcbiAgICAgICAgICAgIDogYCR7cGx1cmFsKHZhbHVlLCB3b3JkKX06IHRoZSBmZXdlc3RgXG4gICAgICB9XG4gICAgICBlbmFibGVkPXt2YWx1ZSA+IG1pbn1cbiAgICAgIG9uQ2xpY2s9eygpID0+IG9uQ2hhbmdlKHZhbHVlIC0gMSl9XG4gICAgPlxuICAgICAgPFJlbW92ZUNpcmNsZU91dGxpbmVJY29uICRzaXplPVwibVwiICRjb2xvcj1cInByaW1hcnlcIiAvPlxuICAgIDwvU3RlcHBlckJ1dHRvbj5cbiAgKTtcblxuICBjb25zdCBtb3JlID0gKFxuICAgIDxTdGVwcGVyQnV0dG9uXG4gICAgICBsYWJlbD17YE1vcmUgJHt3b3JkfXMgb24gJHt3aGVyZX1gfVxuICAgICAgdG9vbHRpcD17YEFkZCBhICR7d29yZH06ICR7cGx1cmFsKHZhbHVlICsgMSwgd29yZCl9YH1cbiAgICAgIGVuYWJsZWRcbiAgICAgIG9uQ2xpY2s9eygpID0+IG9uQ2hhbmdlKHZhbHVlICsgMSl9XG4gICAgPlxuICAgICAgPEFkZENpcmNsZU91dGxpbmVJY29uICRzaXplPVwibVwiICRjb2xvcj1cInByaW1hcnlcIiAvPlxuICAgIDwvU3RlcHBlckJ1dHRvbj5cbiAgKTtcblxuICBjb25zdCBuYW1lID0gYCR7d29yZFswXS50b1VwcGVyQ2FzZSgpfSR7d29yZC5zbGljZSgxKX1zYDtcblxuICByZXR1cm4gdmVydGljYWwgPyAoXG4gICAgPHNwYW4gY2xhc3NOYW1lPXtzdHlsZXMudmVydGljYWxTdGVwcGVyR3JvdXB9PlxuICAgICAge21vcmV9XG4gICAgICA8c3BhbiBjbGFzc05hbWU9e1tzdHlsZXMubGFiZWwsIHN0eWxlcy52ZXJ0aWNhbExhYmVsXS5qb2luKFwiIFwiKX0+XG4gICAgICAgIHtuYW1lfVxuICAgICAgPC9zcGFuPlxuICAgICAge2Zld2VyfVxuICAgIDwvc3Bhbj5cbiAgKSA6IChcbiAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5zdGVwcGVyR3JvdXB9PlxuICAgICAge2Zld2VyfVxuICAgICAgPHNwYW4gY2xhc3NOYW1lPXtzdHlsZXMubGFiZWx9PntuYW1lfTwvc3Bhbj5cbiAgICAgIHttb3JlfVxuICAgIDwvc3Bhbj5cbiAgKTtcbn07XG5cbi8vIFRoZSB0b29sdGlwIGlzIHRoZSB3cmFwcGVyJ3MsIHNvIHRoYXQgaXQgc2hvd3Mgb24gYSBkaXNhYmxlZCBidXR0b24gdG9vLCB0ZWxsaW5nIHdoeS5cbmNvbnN0IFN0ZXBwZXJCdXR0b24gPSAoe1xuICBsYWJlbCxcbiAgdG9vbHRpcCxcbiAgZW5hYmxlZCxcbiAgb25DbGljayxcbiAgY2hpbGRyZW4sXG59OiB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHRvb2x0aXA6IHN0cmluZztcbiAgZW5hYmxlZDogYm9vbGVhbjtcbiAgb25DbGljazogKCkgPT4gdm9pZDtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbn0pID0+IChcbiAgPFNwYW4gY2xhc3NOYW1lPXtzdHlsZXMuc3RlcHBlclRpcH0gJHRvb2x0aXA9e3Rvb2x0aXB9PlxuICAgIDxCdXR0b25cbiAgICAgIGNsYXNzTmFtZT17c3R5bGVzLnN0ZXBwZXJ9XG4gICAgICBhcmlhLWxhYmVsPXtsYWJlbH1cbiAgICAgICRlbmFibGVkPXtlbmFibGVkfVxuICAgICAgJG9uQ2xpY2s9e29uQ2xpY2t9XG4gICAgPlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvQnV0dG9uPlxuICA8L1NwYW4+XG4pO1xuXG5jb25zdCBTY3JlZW5CYW5kID0gb2JzZXJ2ZXIoXG4gICh7XG4gICAgc2NyZWVuLFxuICAgIGluZGV4LFxuICAgIGlzSG92ZXJlZCxcbiAgfToge1xuICAgIHNjcmVlbjogUGxhbm5lZFNjcmVlbjtcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIGlzSG92ZXJlZDogYm9vbGVhbjtcbiAgfSkgPT4ge1xuICAgIGNvbnN0IG1vZGVsID0gdXNlSW5qZWN0KHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUpKCk7XG4gICAgY29uc3QgbmFtZSA9IG5hbWVPZlNjcmVlbihzY3JlZW4uZGlzcGxheS5sYWJlbC5nZXQoKSwgaW5kZXgpO1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gc2NyZWVuLmRpc3BsYXkud29ya0FyZWEuZ2V0KCk7XG4gICAgY29uc3QgaGFzV2luZG93cyA9IHNjcmVlbi53aW5kb3dzLmxlbmd0aCA+IDA7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPERpdiBjbGFzc05hbWU9e3N0eWxlcy5iYW5kfSAkY29sb3I9XCJ0ZXh0TXV0ZWRcIiAkZm9udD17eyBzaXplOiBcInNcIiB9fT5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtzdHlsZXMuc2NyZWVuTmFtZX0+XG4gICAgICAgICAgey8qIFRoZSBuYW1lIGluIHRoZSB0ZXh0J3Mgb3duIGNvbG91ciwgdG8gc3RhbmQgb3V0IGZyb20gdGhlIGRldGFpbHMgYWZ0ZXIgaXQuICovfVxuICAgICAgICAgIDxTcGFuICRjb2xvcj1cInRleHREZWZhdWx0XCI+e25hbWV9PC9TcGFuPlxuICAgICAgICAgIHtzY3JlZW4uZGlzcGxheS5pc1ByaW1hcnkuZ2V0KCkgPyBcIiBcdTAwQjcgcHJpbWFyeVwiIDogXCJcIn0gXHUwMEI3IHt3aWR0aH0gXHUwMEQ3e1wiIFwifVxuICAgICAgICAgIHtoZWlnaHR9XG4gICAgICAgICAge3NjcmVlbi5taXNzaW5nICYmIChcbiAgICAgICAgICAgIDxTcGFuICRjb2xvcj1cImNyaXRpY2FsXCI+XG4gICAgICAgICAgICAgIHtcIiBcIn1cbiAgICAgICAgICAgICAgXHUwMEI3IG5vdCBjb25uZWN0ZWQ7IGl0cyB3aW5kb3dzIGFyZSBub3QgdGlsZWRcbiAgICAgICAgICAgIDwvU3Bhbj5cbiAgICAgICAgICApfVxuICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgey8qIFVudGlsZTogZXZlcnkgd2luZG93IG9mIHRoZSBzY3JlZW4gYmFjayB0byB0aG9zZSBub3QgdGlsZWQsIGFib3ZlIHRoZSBzY3JlZW5zLiAqL31cbiAgICAgICAgPEJ1dHRvblxuICAgICAgICAgIC8vIFNob3duIHdoaWxlIHRoZSBwb2ludGVyIGlzIG92ZXIgdGhlIHNjcmVlbiwgb3IgdGhlIGJ1dHRvbiBoYXMgdGhlIGtleWJvYXJkJ3MgZm9jdXMuXG4gICAgICAgICAgY2xhc3NOYW1lPXtbc3R5bGVzLnVudGlsZSwgaXNIb3ZlcmVkID8gc3R5bGVzLnNob3duIDogXCJcIl0uam9pbihcIiBcIil9XG4gICAgICAgICAgJGludGVyYWN0aXZlXG4gICAgICAgICAgYXJpYS1sYWJlbD17YFVudGlsZSAke25hbWV9YH1cbiAgICAgICAgICAkdG9vbHRpcD17XG4gICAgICAgICAgICBoYXNXaW5kb3dzXG4gICAgICAgICAgICAgID8gYFVudGlsZTogbW92ZSB0aGUgd2luZG93cyBvZiAke25hbWV9IHRvIE5vdCB0aWxlZGBcbiAgICAgICAgICAgICAgOiBgTm8gd2luZG93cyB0aWxlZCBvbiAke25hbWV9YFxuICAgICAgICAgIH1cbiAgICAgICAgICAkZW5hYmxlZD17aGFzV2luZG93c31cbiAgICAgICAgICAkb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgIG1vZGVsLnRpbGluZ1BsYW4uY29tbWl0KFxuICAgICAgICAgICAgICB1bnRpbGVTY3JlZW5JblBsYW4oXG4gICAgICAgICAgICAgICAgbW9kZWwudGlsaW5nUGxhbi5yZXNvbHZlZC5nZXQoKSxcbiAgICAgICAgICAgICAgICBzY3JlZW4uZGlzcGxheS5pZCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgID5cbiAgICAgICAgICA8TW92ZVVwSWNvbiAkc2l6ZT1cIm1cIiAvPlxuICAgICAgICA8L0J1dHRvbj5cbiAgICAgIDwvRGl2PlxuICAgICk7XG4gIH0sXG4pO1xuXG4vLyBQaWxscyBvdmVyIHRoZSBzY3JlZW4ncyBncmlkIHNpemluZyBpdDogaXRzIGNvbHVtbnMgb24gdGhlIG1pZGRsZSBvZiBpdHMgdG9wIGVkZ2UsIGl0cyByb3dzIG9uXG4vLyB0aGUgbWlkZGxlIG9mIGl0cyBsZWZ0IGVkZ2UuIExhaWQgb3ZlciB0aGUgc2NyZWVuJ3MgdGlsZXMsIHNvIHRoYXQgYSB0aWxlIG5ldmVyIGhpZGVzIHRoZW0uXG5jb25zdCBTY3JlZW5TdGVwcGVycyA9IG9ic2VydmVyKFxuICAoeyBzY3JlZW4sIGluZGV4IH06IHsgc2NyZWVuOiBQbGFubmVkU2NyZWVuOyBpbmRleDogbnVtYmVyIH0pID0+IHtcbiAgICBjb25zdCBtb2RlbCA9IHVzZUluamVjdCh3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlKSgpO1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lT2ZTY3JlZW4oc2NyZWVuLmRpc3BsYXkubGFiZWwuZ2V0KCksIGluZGV4KTtcbiAgICBjb25zdCBwbGFuID0gKCkgPT4gbW9kZWwudGlsaW5nUGxhbi5yZXNvbHZlZC5nZXQoKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8PlxuICAgICAgICA8RGl2XG4gICAgICAgICAgY2xhc3NOYW1lPXtbc3R5bGVzLnBpbGwsIHN0eWxlcy5jb2x1bW5zUGlsbF0uam9pbihcIiBcIil9XG4gICAgICAgICAgJGJhY2tncm91bmRDb2xvcj1cImJhY2tncm91bmRTZWNvbmRhcnlcIlxuICAgICAgICAgICRib3JkZXI9e3sgY29sb3I6IFwiYm9yZGVyUHJpbWFyeVwiLCB3aWR0aDogXCJ4eHNcIiwgcmFkaXVzOiBcImZ1bGxcIiB9fVxuICAgICAgICAgICRjb2xvcj1cInRleHRNdXRlZFwiXG4gICAgICAgICAgJGZvbnQ9e3sgc2l6ZTogXCJzXCIgfX1cbiAgICAgICAgICAvLyBPbiB0aGUgbWlkZGxlIG9mIHRoZSBncmlkJ3MgdG9wIGxpbmUsIGEgcGl4ZWwgdGhpY2suXG4gICAgICAgICAgJHN0eWxlPXt7IHRvcDogYGNhbGMoJHtiYW5kfXB4ICsgMC41cHgpYCB9fVxuICAgICAgICA+XG4gICAgICAgICAgPFN0ZXBwZXJcbiAgICAgICAgICAgIHZhbHVlPXtzY3JlZW4uY29sdW1uc31cbiAgICAgICAgICAgIHdvcmQ9XCJjb2x1bW5cIlxuICAgICAgICAgICAgbWluPXsxfVxuICAgICAgICAgICAgd2hlcmU9e25hbWV9XG4gICAgICAgICAgICBvbkNoYW5nZT17KGNvbHVtbnMpID0+XG4gICAgICAgICAgICAgIG1vZGVsLnRpbGluZ1BsYW4uY29tbWl0KFxuICAgICAgICAgICAgICAgIHNldENvbHVtbnNJblBsYW4ocGxhbigpLCBzY3JlZW4uZGlzcGxheS5pZCwgY29sdW1ucyksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAvPlxuICAgICAgICA8L0Rpdj5cblxuICAgICAgICA8RGl2XG4gICAgICAgICAgY2xhc3NOYW1lPXtbc3R5bGVzLnBpbGwsIHN0eWxlcy5yb3dzUGlsbF0uam9pbihcIiBcIil9XG4gICAgICAgICAgJGJhY2tncm91bmRDb2xvcj1cImJhY2tncm91bmRTZWNvbmRhcnlcIlxuICAgICAgICAgICRib3JkZXI9e3sgY29sb3I6IFwiYm9yZGVyUHJpbWFyeVwiLCB3aWR0aDogXCJ4eHNcIiwgcmFkaXVzOiBcImZ1bGxcIiB9fVxuICAgICAgICAgICRjb2xvcj1cInRleHRNdXRlZFwiXG4gICAgICAgICAgJGZvbnQ9e3sgc2l6ZTogXCJzXCIgfX1cbiAgICAgICAgICAkc3R5bGU9e3sgdG9wOiBgY2FsYygke2JhbmR9cHggKyAoMTAwJSAtICR7YmFuZH1weCkgLyAyKWAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxTdGVwcGVyXG4gICAgICAgICAgICB2YWx1ZT17TWF0aC5tYXgoc2NyZWVuLnJvd3MsIDEpfVxuICAgICAgICAgICAgd29yZD1cInJvd1wiXG4gICAgICAgICAgICBtaW49e01hdGgubWF4KHNjcmVlbi5uZWVkZWRSb3dzLCAxKX1cbiAgICAgICAgICAgIHdoZXJlPXtuYW1lfVxuICAgICAgICAgICAgdmVydGljYWxcbiAgICAgICAgICAgIG9uQ2hhbmdlPXsocm93cykgPT5cbiAgICAgICAgICAgICAgbW9kZWwudGlsaW5nUGxhbi5jb21taXQoXG4gICAgICAgICAgICAgICAgc2V0Um93c0luUGxhbihwbGFuKCksIHNjcmVlbi5kaXNwbGF5LmlkLCByb3dzKSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvRGl2PlxuICAgICAgPC8+XG4gICAgKTtcbiAgfSxcbik7XG5cbi8vIEFycmFuZ2UgaG93IHRoZSB3aW5kb3dzIGFyZSB0aWxlZDogZHJhZyBhIHdpbmRvdyBvbnRvIGEgc2NyZWVuIGFuZCBpbnRvIGl0cyBwbGFjZSBpbiB0aGUgb3JkZXIsXG4vLyBvciBpbnRvIHRoZSB0cmF5IHRvIGxlYXZlIGl0IGFzIGl0IGlzOyBkcmFnIGl0cyBjb3JuZXIgdG8gaGF2ZSBpdCBzcGFuIG1vcmUgY2VsbHMuXG5leHBvcnQgY29uc3QgVGlsaW5nRWRpdG9yID0gb2JzZXJ2ZXIoKCkgPT4ge1xuICBjb25zdCBtb2RlbCA9IHVzZUluamVjdCh3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlKSgpO1xuICBjb25zdCBwbGFuID0gbW9kZWwudGlsaW5nUGxhbi5yZXNvbHZlZC5nZXQoKTtcbiAgLy8gQSB3aW5kb3cgbm90IG9wZW4sIGFzIG9wcG9zZWQgdG8gb25lIGJlaW5nIG9wZW5lZCwgd2hpY2ggc2hvd3MgYXMgc3VjaCBhbHJlYWR5LlxuICBjb25zdCBpc05vdE9wZW4gPSAod2luZG93OiBQbGFubmVkV2luZG93KSA9PlxuICAgIHdpbmRvdy5taXNzaW5nICYmICFtb2RlbC5pc1Jlb3BlbmluZ1dpbmRvdyh3aW5kb3cpO1xuICBjb25zdCBbZHJhZywgc2V0RHJhZ10gPSB1c2VTdGF0ZTxEcmFnIHwgdW5kZWZpbmVkPigpO1xuICBjb25zdCBbcHJldmlldywgc2V0UHJldmlld10gPSB1c2VTdGF0ZTxSZXNvbHZlZFRpbGluZ1BsYW4gfCB1bmRlZmluZWQ+KCk7XG4gIGNvbnN0IFtwb2ludGVyLCBzZXRQb2ludGVyXSA9IHVzZVN0YXRlPFxuICAgIHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IHVuZGVmaW5lZFxuICA+KCk7XG4gIC8vIFRoZSBzY3JlZW4gdGhlIHBvaW50ZXIgaXMgb3ZlciwgaXRzIHRpbGVzIGFuZCBwaWxscyBjb3VudGluZyBhcyBpdDogaXRzIFVudGlsZSBzaG93cyB0aGVuLlxuICBjb25zdCBbaG92ZXJlZFNjcmVlbiwgc2V0SG92ZXJlZFNjcmVlbl0gPSB1c2VTdGF0ZTxudW1iZXIgfCB1bmRlZmluZWQ+KCk7XG4gIGNvbnN0IHByZXZpZXdSZWYgPSB1c2VSZWYocHJldmlldyk7XG4gIGNvbnN0IGRyYXdpbmdSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCBkaXNwbGF5cyA9IHBsYW4uc2NyZWVucy5tYXAoKGl0KSA9PiBpdC5kaXNwbGF5KTtcbiAgY29uc3QgW3Jvb20sIHNldFJvb21dID0gdXNlU3RhdGU8XG4gICAgeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgdW5kZWZpbmVkXG4gID4oKTtcbiAgY29uc3QgeyByZWN0cywgYXNwZWN0UmF0aW8sIHdyYXBzIH0gPSBkcmF3U2NyZWVucyhwbGFuLnNjcmVlbnMsIHJvb20/LndpZHRoKTtcbiAgY29uc3Qgc2hvd24gPSBwcmV2aWV3ID8/IHBsYW47XG4gIC8vIFRpbGUgYWxsIHBsYWNlcyB0aGUgd2luZG93cyBub3QgdGlsZWQsIHRob3NlIG9wZW4uXG4gIGNvbnN0IGNhbkF1dG9UaWxlID0gc2hvd24udW50aWxlZC5zb21lKCh3aW5kb3cpID0+ICF3aW5kb3cubWlzc2luZyk7XG5cbiAgcHJldmlld1JlZi5jdXJyZW50ID0gcHJldmlldztcblxuICAvLyBUaGUgcm9vbSB0aGUgZHJhd2luZyBoYXMsIGZvbGxvd2VkIGFzIHRoZSBkaWFsb2cgcmVzaXplcywgdG8gZHJhdyB0aGUgc2NyZWVucyBhcyBsYXJnZSBhcyBmaXRzXG4gIC8vIHdpdGhvdXQgY2hhbmdpbmcgdGhlaXIgcHJvcG9ydGlvbnMuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgZHJhd2luZyA9IGRyYXdpbmdSZWYuY3VycmVudDtcblxuICAgIGlmICghZHJhd2luZykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoW2VudHJ5XSkgPT5cbiAgICAgIHNldFJvb20oe1xuICAgICAgICB3aWR0aDogZW50cnkuY29udGVudFJlY3Qud2lkdGgsXG4gICAgICAgIGhlaWdodDogZW50cnkuY29udGVudFJlY3QuaGVpZ2h0LFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIG9ic2VydmVyLm9ic2VydmUoZHJhd2luZyk7XG5cbiAgICByZXR1cm4gKCkgPT4gb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICB9LCBbXSk7XG5cbiAgLy8gSW4gcm93cywgYXMgd2lkZSBhcyB0aGVyZSBpcyByb29tIGZvciwgYXMgdGFsbCBhcyB0aGF0IG1ha2VzIHRoZW06IHRoZSBkaWFsb2cgc2Nyb2xscy5cbiAgY29uc3QgZHJhd25XaWR0aCA9IHJvb21cbiAgICA/IHdyYXBzXG4gICAgICA/IHJvb20ud2lkdGhcbiAgICAgIDogTWF0aC5taW4ocm9vbS53aWR0aCwgcm9vbS5oZWlnaHQgKiBhc3BlY3RSYXRpbylcbiAgICA6IDA7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWRyYWcpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgYmFzZSA9IG1vZGVsLnRpbGluZ1BsYW4ucmVzb2x2ZWQuZ2V0KCk7XG5cbiAgICBjb25zdCBvbk1vdmUgPSAoZXZlbnQ6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgICAgLy8gVGhlIGJ1dHRvbiBsZXQgZ28gd2hlcmUgdGhpcyB3aW5kb3cgZGlkIG5vdCBoZWFyIGl0LCBhcyBvdXRzaWRlIHRoZSB3aW5kb3c6IHRoZSBkcmFnIGlzIG92ZXIuXG4gICAgICBpZiAoZXZlbnQuYnV0dG9ucyA9PT0gMCkge1xuICAgICAgICBlbmQodHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZHJhZy5raW5kID09PSBcIm1vdmVcIikge1xuICAgICAgICBzZXRQb2ludGVyKHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9KTtcblxuICAgICAgICBjb25zdCB0YXJnZXQgPSB0YXJnZXRBdChcbiAgICAgICAgICBldmVudC5jbGllbnRYLFxuICAgICAgICAgIGV2ZW50LmNsaWVudFksXG4gICAgICAgICAgYmFzZSxcbiAgICAgICAgICByZWN0cyxcbiAgICAgICAgICBkcmFnLmdyYWJiZWQsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG5leHQgPSB0YXJnZXQgPyBtb3ZlSW5QbGFuKGJhc2UsIGRyYWcua2V5LCB0YXJnZXQpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIHByZXZpZXdSZWYuY3VycmVudCA9IG5leHQ7XG4gICAgICAgIHNldFByZXZpZXcobmV4dCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzY3JlZW4gPSBiYXNlLnNjcmVlbnMuZmluZChcbiAgICAgICAgKGl0KSA9PiBpdC5kaXNwbGF5LmlkID09PSBkcmFnLmRpc3BsYXlJZCxcbiAgICAgICk7XG4gICAgICBjb25zdCB3aW5kb3cgPSBzY3JlZW4/LndpbmRvd3MuZmluZCgoaXQpID0+IGl0LmtleSA9PT0gZHJhZy5rZXkpO1xuICAgICAgY29uc3QgZHJhd2luZyA9IGRvY3VtZW50XG4gICAgICAgIC5xdWVyeVNlbGVjdG9yKGRyYXdpbmdTZWxlY3RvcilcbiAgICAgICAgPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgaWYgKCFzY3JlZW4gfHwgIXdpbmRvdyB8fCAhZHJhd2luZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGdyaWQgPSBncmlkT25QYWdlKGRyYXdpbmcsIHJlY3RzLmdldChzY3JlZW4uZGlzcGxheS5pZCkhKTtcbiAgICAgIGNvbnN0IGNlbGxXaWR0aCA9IGdyaWQud2lkdGggLyBzY3JlZW4uY29sdW1ucztcbiAgICAgIGNvbnN0IGNlbGxIZWlnaHQgPSBncmlkLmhlaWdodCAvIE1hdGgubWF4KHNjcmVlbi5yb3dzLCAxKTtcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBNYXRoLmNlaWwoXG4gICAgICAgIChldmVudC5jbGllbnRYIC0gZ3JpZC5sZWZ0IC0gd2luZG93LmNvbHVtbiAqIGNlbGxXaWR0aCkgLyBjZWxsV2lkdGgsXG4gICAgICApO1xuICAgICAgY29uc3Qgcm93cyA9IE1hdGguY2VpbChcbiAgICAgICAgKGV2ZW50LmNsaWVudFkgLSBncmlkLnRvcCAtIHdpbmRvdy5yb3cgKiBjZWxsSGVpZ2h0KSAvIGNlbGxIZWlnaHQsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBuZXh0ID0gcmVzaXplSW5QbGFuKGJhc2UsIGRyYWcua2V5LCBjb2x1bW5zLCByb3dzKTtcblxuICAgICAgcHJldmlld1JlZi5jdXJyZW50ID0gbmV4dDtcbiAgICAgIHNldFByZXZpZXcobmV4dCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGVuZCA9IChrZWVwOiBib29sZWFuKSA9PiB7XG4gICAgICAvLyBBIGRyYWcgdGhhdCBsZWF2ZXMgZXZlcnkgd2luZG93IHdoZXJlIGl0IHdhcywgYXMgYSBjbGljayBvciBhIGRyb3AgYmFjayBpbiBwbGFjZSwgY2hhbmdlc1xuICAgICAgLy8gbm90aGluZywgYW5kIHRpbGVzIG5vdGhpbmcgYWdhaW4uXG4gICAgICBpZiAoXG4gICAgICAgIGtlZXAgJiZcbiAgICAgICAgcHJldmlld1JlZi5jdXJyZW50ICYmXG4gICAgICAgIHBsYWNlc09mKHByZXZpZXdSZWYuY3VycmVudCkgIT09IHBsYWNlc09mKGJhc2UpXG4gICAgICApIHtcbiAgICAgICAgbW9kZWwudGlsaW5nUGxhbi5jb21taXQocHJldmlld1JlZi5jdXJyZW50KTtcbiAgICAgIH1cblxuICAgICAgc2V0RHJhZyh1bmRlZmluZWQpO1xuICAgICAgc2V0UHJldmlldyh1bmRlZmluZWQpO1xuICAgICAgc2V0UG9pbnRlcih1bmRlZmluZWQpO1xuICAgIH07XG5cbiAgICBjb25zdCBvblVwID0gKCkgPT4gZW5kKHRydWUpO1xuICAgIGNvbnN0IG9uQ2FuY2VsID0gKCkgPT4gZW5kKGZhbHNlKTtcbiAgICBjb25zdCBvbktleSA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZW5kKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCBvbk1vdmUpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIG9uVXApO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmNhbmNlbFwiLCBvbkNhbmNlbCk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIG9uQ2FuY2VsKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgb25LZXksIHRydWUpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgb25Nb3ZlKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIG9uVXApO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyY2FuY2VsXCIsIG9uQ2FuY2VsKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmx1clwiLCBvbkNhbmNlbCk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgb25LZXksIHRydWUpO1xuICAgIH07XG4gIH0sIFtkcmFnXSk7XG5cbiAgY29uc3Qgc3RhcnRNb3ZlID1cbiAgICAod2luZG93OiBQbGFubmVkV2luZG93KSA9PiAoZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MRWxlbWVudD4pID0+IHtcbiAgICAgIGlmIChldmVudC5idXR0b24gIT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBXaGljaCBvZiB0aGUgd2luZG93J3MgY2VsbHMgaXMgdW5kZXIgdGhlIHBvaW50ZXI7IGEgd2luZG93IGluIHRoZSB0cmF5IGlzIGhlbGQgYnkgaXRzIGZpcnN0LlxuICAgICAgY29uc3QgdGlsZSA9IGV2ZW50LmN1cnJlbnRUYXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIGNvbnN0IGdyYWJiZWQgPSB7XG4gICAgICAgIGNvbHVtbjogTWF0aC5taW4oXG4gICAgICAgICAgTWF0aC5mbG9vcihcbiAgICAgICAgICAgICgoZXZlbnQuY2xpZW50WCAtIHRpbGUubGVmdCkgLyB0aWxlLndpZHRoKSAqIHdpbmRvdy5jb2x1bW5zLFxuICAgICAgICAgICksXG4gICAgICAgICAgd2luZG93LmNvbHVtbnMgLSAxLFxuICAgICAgICApLFxuICAgICAgICByb3c6IE1hdGgubWluKFxuICAgICAgICAgIE1hdGguZmxvb3IoKChldmVudC5jbGllbnRZIC0gdGlsZS50b3ApIC8gdGlsZS5oZWlnaHQpICogd2luZG93LnJvd3MpLFxuICAgICAgICAgIHdpbmRvdy5yb3dzIC0gMSxcbiAgICAgICAgKSxcbiAgICAgIH07XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzZXRQb2ludGVyKHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9KTtcbiAgICAgIHNldERyYWcoe1xuICAgICAgICBraW5kOiBcIm1vdmVcIixcbiAgICAgICAga2V5OiB3aW5kb3cua2V5LFxuICAgICAgICB0aXRsZTogdGl0bGVPZih3aW5kb3cpLFxuICAgICAgICBncmFiYmVkOiBldmVudC5jdXJyZW50VGFyZ2V0LmNsb3Nlc3QodHJheVNlbGVjdG9yKVxuICAgICAgICAgID8geyBjb2x1bW46IDAsIHJvdzogMCB9XG4gICAgICAgICAgOiBncmFiYmVkLFxuICAgICAgfSk7XG4gICAgfTtcblxuICBjb25zdCBzdGFydFJlc2l6ZSA9XG4gICAgKHdpbmRvdzogUGxhbm5lZFdpbmRvdywgZGlzcGxheUlkOiBudW1iZXIpID0+XG4gICAgKGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC5idXR0b24gIT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBzZXREcmFnKHsga2luZDogXCJyZXNpemVcIiwga2V5OiB3aW5kb3cua2V5LCBkaXNwbGF5SWQgfSk7XG4gICAgfTtcblxuICByZXR1cm4gKFxuICAgIDxEaXYgJGZsZXg9e3sgZGlyZWN0aW9uOiBcInZlcnRpY2FsXCIsIGdhcDogXCJzXCIgfX0gJGZsZXhDaGlsZD5cbiAgICAgIHtkaXNwbGF5cy5sZW5ndGggPT09IDAgJiYgKFxuICAgICAgICA8U3BhbiAkY29sb3I9XCJ0ZXh0TXV0ZWRcIj5GaW5kaW5nIHRoZSBzY3JlZW5zXHUyMDI2PC9TcGFuPlxuICAgICAgKX1cblxuICAgICAgPERpdlxuICAgICAgICBkYXRhLXRpbGluZy10cmF5XG4gICAgICAgIGNsYXNzTmFtZT17c3R5bGVzLnRyYXl9XG4gICAgICAgICRwYWRkaW5nPXt7IHZlcnRpY2FsOiBcInhzXCIsIGhvcml6b250YWw6IFwic1wiIH19XG4gICAgICAgICRib3JkZXI9e3sgY29sb3I6IFwiYm9yZGVyUHJpbWFyeVwiLCB3aWR0aDogXCJ4eHNcIiwgcmFkaXVzOiBcIm1cIiB9fVxuICAgICAgPlxuICAgICAgICA8U3BhbiAkY29sb3I9XCJ0ZXh0TXV0ZWRcIiAkZm9udD17eyBzaXplOiBcInNcIiB9fT5cbiAgICAgICAgICBOb3QgdGlsZWQ6XG4gICAgICAgIDwvU3Bhbj5cblxuICAgICAgICB7c2hvd24udW50aWxlZC5sZW5ndGggPT09IDAgJiYgKFxuICAgICAgICAgIDxTcGFuICRjb2xvcj1cInRleHRNdXRlZFwiICRmb250PXt7IHNpemU6IFwic1wiIH19PlxuICAgICAgICAgICAgZHJvcCBhIHdpbmRvdyBoZXJlIHRvIGxlYXZlIGl0IG91dCBvZiB0aWxpbmcuXG4gICAgICAgICAgPC9TcGFuPlxuICAgICAgICApfVxuXG4gICAgICAgIHtzaG93bi51bnRpbGVkLm1hcCgod2luZG93KSA9PiAoXG4gICAgICAgICAgPERpdlxuICAgICAgICAgICAga2V5PXt3aW5kb3cua2V5fVxuICAgICAgICAgICAgY2xhc3NOYW1lPXtbXG4gICAgICAgICAgICAgIHN0eWxlcy5jaGlwLFxuICAgICAgICAgICAgICBkcmFnPy5rZXkgPT09IHdpbmRvdy5rZXkgPyBzdHlsZXMuZHJhZ2dpbmcgOiBcIlwiLFxuICAgICAgICAgICAgXS5qb2luKFwiIFwiKX1cbiAgICAgICAgICAgICRiYWNrZ3JvdW5kQ29sb3I9XCJiYWNrZ3JvdW5kU2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICRib3JkZXI9e3tcbiAgICAgICAgICAgICAgLy8gQXMgaXRzIHRpbGUgd291bGQgYmU6IGEgd2luZG93IG5vdCBvcGVuIGRhc2hlZCBpbiB0aGUgY3JpdGljYWwgY29sb3VyLCBvbmVcbiAgICAgICAgICAgICAgLy8gbm90IHNhdmVkIGluIHRoZSB3YXJuaW5nIG9uZS5cbiAgICAgICAgICAgICAgY29sb3I6IGlzTm90T3Blbih3aW5kb3cpXG4gICAgICAgICAgICAgICAgPyBcImNyaXRpY2FsXCJcbiAgICAgICAgICAgICAgICA6IG1vZGVsLmlzT3V0T2ZQbGFjZSh3aW5kb3cpXG4gICAgICAgICAgICAgICAgICA/IFwid2FybmluZ1wiXG4gICAgICAgICAgICAgICAgICA6IFwiYm9yZGVyUHJpbWFyeVwiLFxuICAgICAgICAgICAgICB3aWR0aDogXCJ4eHNcIixcbiAgICAgICAgICAgICAgcmFkaXVzOiBcInNcIixcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICAkc3R5bGU9e2lzTm90T3Blbih3aW5kb3cpID8geyBib3JkZXJTdHlsZTogXCJkYXNoZWRcIiB9IDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgJGZvbnQ9e3sgc2l6ZTogXCJzXCIgfX1cbiAgICAgICAgICAgIG9uUG9pbnRlckRvd249e3N0YXJ0TW92ZSh3aW5kb3cpfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxXaW5kb3dUaXRsZSB3aW5kb3c9e3dpbmRvd30gLz5cbiAgICAgICAgICAgIDxSZW5hbWVXaW5kb3dCdXR0b24gd2luZG93PXt3aW5kb3d9IC8+XG4gICAgICAgICAgICB7LyogQSB3aW5kb3cgbm90IG9wZW4gdG9sZCBhcyBpdHMgdGlsZSB0ZWxscyBpdCwgaW4gdGhlIGNyaXRpY2FsIGNvbG91ci4gKi99XG4gICAgICAgICAgICB7d2luZG93Lm1pc3NpbmcgPyAoXG4gICAgICAgICAgICAgIDxTcGFuICRjb2xvcj1cImNyaXRpY2FsXCI+IG5vdCBvcGVuPC9TcGFuPlxuICAgICAgICAgICAgKSA6IHdpbmRvdy5yZWNvcmQuc3RhdGUuZ2V0KCkgPT09IFwibWluaW1pemVkXCIgPyAoXG4gICAgICAgICAgICAgIFwiIChtaW5pbWl6ZWQpXCJcbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIFwiXCJcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7d2luZG93Lm1pc3NpbmcgJiZcbiAgICAgICAgICAgICAgKG1vZGVsLmlzUmVvcGVuaW5nV2luZG93KHdpbmRvdykgPyAoXG4gICAgICAgICAgICAgICAgPFNwaW5uZXJJY29uXG4gICAgICAgICAgICAgICAgICAkc2l6ZT1cInNcIlxuICAgICAgICAgICAgICAgICAgJGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiT3BlbmluZyBpdCBhZ2FpblwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICA8UmVvcGVuV2luZG93QnV0dG9uIHdpbmRvdz17d2luZG93fSAvPlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDxDbG9zZVdpbmRvd0J1dHRvbiB3aW5kb3c9e3dpbmRvd30gaW5saW5lIC8+XG4gICAgICAgICAgPC9EaXY+XG4gICAgICAgICkpfVxuXG4gICAgICAgIDxQcmltYXJ5QnV0dG9uXG4gICAgICAgICAgSWNvbj17RGFzaGJvYXJkSWNvbn1cbiAgICAgICAgICAkc3R5bGU9e3sgbWFyZ2luTGVmdDogXCJhdXRvXCIgfX1cbiAgICAgICAgICAkZGlzYWJsZWQ9eyFjYW5BdXRvVGlsZX1cbiAgICAgICAgICAkdG9vbHRpcD17XG4gICAgICAgICAgICBjYW5BdXRvVGlsZVxuICAgICAgICAgICAgICA/IFwiVGlsZSB0aGUgd2luZG93cyBub3QgdGlsZWQgdG9vOiBlYWNoIGdvZXMgdG8gdGhlIHNjcmVlbiB3aXRoIHRoZSBtb3N0IHJvb20sIGluIGl0cyBmaXJzdCBmcmVlIGNlbGwsIGFuZCBpcyBtb3ZlZCB0aGVyZS5cIlxuICAgICAgICAgICAgICA6IFwiTm90aGluZyB0byB0aWxlOiBldmVyeSBvcGVuIHdpbmRvdyBpcyB0aWxlZCBhbHJlYWR5LiBEcmFnIGEgd2luZG93IGhlcmUgdG8gdGFrZSBpdCBvdXQgb2YgdGhlIHRpbGluZy5cIlxuICAgICAgICAgIH1cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBtb2RlbC50aWxpbmdQbGFuLmF1dG9UaWxlKCl9XG4gICAgICAgID5cbiAgICAgICAgICBUaWxlIGFsbFxuICAgICAgICA8L1ByaW1hcnlCdXR0b24+XG4gICAgICA8L0Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICByZWY9e2RyYXdpbmdSZWZ9XG4gICAgICAgIGNsYXNzTmFtZT17c3R5bGVzLmRyYXdpbmd9XG4gICAgICAgIHN0eWxlPXt3cmFwcyA/IHsgbWluSGVpZ2h0OiBkcmF3bldpZHRoIC8gYXNwZWN0UmF0aW8gfSA6IHVuZGVmaW5lZH1cbiAgICAgICAgaGlkZGVuPXtkaXNwbGF5cy5sZW5ndGggPT09IDB9XG4gICAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBkYXRhLXRpbGluZy1zY3JlZW5zXG4gICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMuc2NyZWVuc31cbiAgICAgICAgICBvblBvaW50ZXJPdmVyPXsoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KVxuICAgICAgICAgICAgICAuY2xvc2VzdChcIltkYXRhLXNjcmVlbi1pZF1cIilcbiAgICAgICAgICAgICAgPy5nZXRBdHRyaWJ1dGUoXCJkYXRhLXNjcmVlbi1pZFwiKTtcblxuICAgICAgICAgICAgc2V0SG92ZXJlZFNjcmVlbihpZCA/IE51bWJlcihpZCkgOiB1bmRlZmluZWQpO1xuICAgICAgICAgIH19XG4gICAgICAgICAgb25Qb2ludGVyTGVhdmU9eygpID0+IHNldEhvdmVyZWRTY3JlZW4odW5kZWZpbmVkKX1cbiAgICAgICAgICBzdHlsZT17eyB3aWR0aDogZHJhd25XaWR0aCwgaGVpZ2h0OiBkcmF3bldpZHRoIC8gYXNwZWN0UmF0aW8gfX1cbiAgICAgICAgPlxuICAgICAgICAgIHtzaG93bi5zY3JlZW5zLm1hcCgoc2NyZWVuLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVjdCA9IHJlY3RzLmdldChzY3JlZW4uZGlzcGxheS5pZCkhO1xuXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICA8RGl2XG4gICAgICAgICAgICAgICAga2V5PXtzY3JlZW4uZGlzcGxheS5pZH1cbiAgICAgICAgICAgICAgICBkYXRhLXNjcmVlbi1pZD17c2NyZWVuLmRpc3BsYXkuaWR9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMuc2NyZWVufVxuICAgICAgICAgICAgICAgICRiYWNrZ3JvdW5kQ29sb3I9XCJiYWNrZ3JvdW5kUHJpbWFyeURpbW1lZFwiXG4gICAgICAgICAgICAgICAgJGJvcmRlcj17e1xuICAgICAgICAgICAgICAgICAgY29sb3I6IHNjcmVlbi5taXNzaW5nID8gXCJjcml0aWNhbFwiIDogXCJib3JkZXJQcmltYXJ5XCIsXG4gICAgICAgICAgICAgICAgICB3aWR0aDogXCJ4eHNcIixcbiAgICAgICAgICAgICAgICAgIHJhZGl1czogXCJtXCIsXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAkc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgIGJvcmRlclN0eWxlOiBzY3JlZW4ubWlzc2luZyA/IFwiZGFzaGVkXCIgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICBsZWZ0OiBgY2FsYygke3JlY3QubGVmdH0lICsgJHtnYXAgLyAyfXB4KWAsXG4gICAgICAgICAgICAgICAgICB0b3A6IGBjYWxjKCR7cmVjdC50b3B9JSArICR7Z2FwIC8gMn1weClgLFxuICAgICAgICAgICAgICAgICAgd2lkdGg6IGBjYWxjKCR7cmVjdC53aWR0aH0lIC0gJHtnYXB9cHgpYCxcbiAgICAgICAgICAgICAgICAgIGhlaWdodDogYGNhbGMoJHtyZWN0LmhlaWdodH0lIC0gJHtnYXB9cHgpYCxcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPFNjcmVlbkJhbmRcbiAgICAgICAgICAgICAgICAgIHNjcmVlbj17c2NyZWVufVxuICAgICAgICAgICAgICAgICAgaW5kZXg9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgaXNIb3ZlcmVkPXtob3ZlcmVkU2NyZWVuID09PSBzY3JlZW4uZGlzcGxheS5pZH1cbiAgICAgICAgICAgICAgICAvPlxuXG4gICAgICAgICAgICAgICAge0FycmF5LmZyb20oXG4gICAgICAgICAgICAgICAgICB7IGxlbmd0aDogc2NyZWVuLmNvbHVtbnMgKiBzY3JlZW4ucm93cyB9LFxuICAgICAgICAgICAgICAgICAgKF8sIGNlbGwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sdW1uID0gY2VsbCAlIHNjcmVlbi5jb2x1bW5zO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBNYXRoLmZsb29yKGNlbGwgLyBzY3JlZW4uY29sdW1ucyk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgbGVmdDogYCR7KGNvbHVtbiAvIHNjcmVlbi5jb2x1bW5zKSAqIDEwMH0lYCxcbiAgICAgICAgICAgICAgICAgICAgICB0b3A6IGBjYWxjKCR7YmFuZH1weCArICgxMDAlIC0gJHtiYW5kfXB4KSAqICR7cm93IC8gc2NyZWVuLnJvd3N9KWAsXG4gICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGAkezEwMCAvIHNjcmVlbi5jb2x1bW5zfSVgLFxuICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogYGNhbGMoKDEwMCUgLSAke2JhbmR9cHgpIC8gJHtzY3JlZW4ucm93c30pYCxcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBBbiBlbXB0eSBjZWxsIG9wZW5zIGEgbmV3IHdpbmRvdyBpbiBpdCwgd2l0aCBhIHBsdXMgc2hvd2luZyBvbiBob3Zlci5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNFbXB0eSA9ICFzY3JlZW4ud2luZG93cy5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgIChpdCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiA+PSBpdC5jb2x1bW4gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiA8IGl0LmNvbHVtbiArIGl0LmNvbHVtbnMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA+PSBpdC5yb3cgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA8IGl0LnJvdyArIGl0LnJvd3MsXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzRW1wdHkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhc2NyZWVuLm1pc3NpbmcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhZHJhZyAmJlxuICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmNhbk9wZW5QbGFjZXMuZ2V0KCkgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtjZWxsfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtbc3R5bGVzLmNlbGwsIHN0eWxlcy5lbXB0eUNlbGxdLmpvaW4oXCIgXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIk9wZW4gYSBuZXcgd2luZG93IGluIHRoaXMgY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAkZHJvcERvd25NZW51PXtkcm9wRG93bk1lbnUobmV3V2luZG93TWVudUtpbmQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogeyBkaXNwbGF5SWQ6IHNjcmVlbi5kaXNwbGF5LmlkLCBjb2x1bW4sIHJvdyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogXCJib3R0b21cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17c3R5bGVzLnBsdXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNvbGlkLCBzbyB0aGF0IHdoYXQgaXMgYmVoaW5kIGl0LCBhcyB0aGUgZW1wdHkgc2NyZWVuJ3MgdGV4dCwgZG9lcyBub3Qgc2hvdyB0aHJvdWdoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAkYmFja2dyb3VuZENvbG9yPVwiYmFja2dyb3VuZFNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICR0b29sdGlwPVwiT3BlbiBhIGNsdXN0ZXIncyBwYWdlIGluIGEgbmV3IHdpbmRvdyBoZXJlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEFkZENpcmNsZU91dGxpbmVJY29uICRzaXplPVwibFwiICRjb2xvcj1cInByaW1hcnlcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYga2V5PXtjZWxsfSBjbGFzc05hbWU9e3N0eWxlcy5jZWxsfSBzdHlsZT17c3R5bGV9IC8+XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgICAgICB7c2NyZWVuLndpbmRvd3MubGVuZ3RoID09PSAwICYmIChcbiAgICAgICAgICAgICAgICAgIDxEaXZcbiAgICAgICAgICAgICAgICAgICAgJGNvbG9yPVwidGV4dE11dGVkXCJcbiAgICAgICAgICAgICAgICAgICAgJGZvbnQ9e3sgc2l6ZTogXCJzXCIgfX1cbiAgICAgICAgICAgICAgICAgICAgJHRleHRBbGlnbj1cImNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICRzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgcG9pbnRlckV2ZW50czogXCJub25lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgICAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGUgbWlkZGxlIG9mIHRoZSBzY3JlZW4ncyBncmlkLCBiZWxvdyBpdHMgYmFuZC5cbiAgICAgICAgICAgICAgICAgICAgICB0b3A6IGBjYWxjKCR7YmFuZH1weCArICgxMDAlIC0gJHtiYW5kfXB4KSAvIDIpYCxcbiAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRlWSgtNTAlKVwiLFxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBObyB3aW5kb3dzIHRpbGVkIHlldFxuICAgICAgICAgICAgICAgICAgPC9EaXY+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC9EaXY+XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pfVxuXG4gICAgICAgICAge3Nob3duLnNjcmVlbnMuZmxhdE1hcCgoc2NyZWVuKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gcmVjdHMuZ2V0KHNjcmVlbi5kaXNwbGF5LmlkKSE7XG4gICAgICAgICAgICBjb25zdCBncmlkVG9wID0gYCR7cmVjdC50b3B9JSArICR7Z2FwIC8gMiArIGJhbmR9cHhgO1xuICAgICAgICAgICAgY29uc3QgZ3JpZEhlaWdodCA9IGAoJHtyZWN0LmhlaWdodH0lIC0gJHtnYXAgKyBiYW5kfXB4KWA7XG4gICAgICAgICAgICBjb25zdCBncmlkTGVmdCA9IGAke3JlY3QubGVmdH0lICsgJHtnYXAgLyAyfXB4YDtcbiAgICAgICAgICAgIGNvbnN0IGdyaWRXaWR0aCA9IGAoJHtyZWN0LndpZHRofSUgLSAke2dhcH1weClgO1xuXG4gICAgICAgICAgICByZXR1cm4gc2NyZWVuLndpbmRvd3MubWFwKCh3aW5kb3cpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBrZXk9e3dpbmRvdy5rZXl9XG4gICAgICAgICAgICAgICAgICBkYXRhLXNjcmVlbi1pZD17c2NyZWVuLmRpc3BsYXkuaWR9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e1tcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnRpbGUsXG4gICAgICAgICAgICAgICAgICAgIGRyYWc/LmtleSA9PT0gd2luZG93LmtleSA/IHN0eWxlcy5kcmFnZ2luZyA6IFwiXCIsXG4gICAgICAgICAgICAgICAgICBdLmpvaW4oXCIgXCIpfVxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogYGNhbGMoJHtncmlkTGVmdH0gKyAke2dyaWRXaWR0aH0gKiAke3dpbmRvdy5jb2x1bW4gLyBzY3JlZW4uY29sdW1uc30pYCxcbiAgICAgICAgICAgICAgICAgICAgdG9wOiBgY2FsYygke2dyaWRUb3B9ICsgJHtncmlkSGVpZ2h0fSAqICR7d2luZG93LnJvdyAvIHNjcmVlbi5yb3dzfSlgLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogYGNhbGMoJHtncmlkV2lkdGh9ICogJHt3aW5kb3cuY29sdW1ucyAvIHNjcmVlbi5jb2x1bW5zfSlgLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGBjYWxjKCR7Z3JpZEhlaWdodH0gKiAke3dpbmRvdy5yb3dzIC8gc2NyZWVuLnJvd3N9KWAsXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgb25Qb2ludGVyRG93bj17c3RhcnRNb3ZlKHdpbmRvdyl9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPERpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlcy50aWxlQm9keX1cbiAgICAgICAgICAgICAgICAgICAgJGJhY2tncm91bmRDb2xvcj1cImJhY2tncm91bmRTZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgICAkYm9yZGVyPXt7XG4gICAgICAgICAgICAgICAgICAgICAgY29sb3I6IGlzTm90T3Blbih3aW5kb3cpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFwiY3JpdGljYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBtb2RlbC5pc091dE9mUGxhY2Uod2luZG93LCBzY3JlZW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJ3YXJuaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpc0FwcGxpY2F0aW9uV2luZG93KHdpbmRvdy5yZWNvcmQud2luZG93KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiYm9yZGVyUHJpbWFyeVwiLFxuICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBcInh4c1wiLFxuICAgICAgICAgICAgICAgICAgICAgIHJhZGl1czogXCJzXCIsXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICRzdHlsZT17XG4gICAgICAgICAgICAgICAgICAgICAgaXNOb3RPcGVuKHdpbmRvdykgPyB7IGJvcmRlclN0eWxlOiBcImRhc2hlZFwiIH0gOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAkZm9udD17eyBzaXplOiBcInNcIiB9fVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7LyogVGhlIG5hbWUgZmlyc3Q7IHdoYXQgaXMgdG9sZCBvZiB0aGUgd2luZG93IGFmdGVyIGl0LCBvbiB0aGUgbmV4dCBsaW5lIHdoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGRvZXMgbm90IGZpdCBiZXNpZGUgaXQuICovfVxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy50aWxlVGl0bGVMaW5lfT5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy50aWxlTmFtZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8V2luZG93VGl0bGUgd2luZG93PXt3aW5kb3d9IC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8UmVuYW1lV2luZG93QnV0dG9uIHdpbmRvdz17d2luZG93fSBvblRpbGUgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAge3dpbmRvdy5taXNzaW5nICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAobW9kZWwucmVvcGVuaW5nLmdldCgpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5pc1Jlb3BlbmluZ1dpbmRvdyh3aW5kb3cpID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U3Bpbm5lckljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2l6ZT1cInNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJPcGVuaW5nIGl0IGFnYWluXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17c3R5bGVzLnRpbGVMYWJlbH0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNwYW4gJGNvbG9yPVwiY3JpdGljYWxcIj5ub3Qgb3BlbjwvU3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UmVvcGVuV2luZG93QnV0dG9uIHdpbmRvdz17d2luZG93fSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgIDxDbG9zZVdpbmRvd0J1dHRvbiB3aW5kb3c9e3dpbmRvd30gLz5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMuaGFuZGxlfVxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJEcmFnIHRvIHNwYW4gbW9yZSBvciBmZXdlciBjZWxsc1wiXG4gICAgICAgICAgICAgICAgICAgICAgb25Qb2ludGVyRG93bj17c3RhcnRSZXNpemUod2luZG93LCBzY3JlZW4uZGlzcGxheS5pZCl9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L0Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pfVxuXG4gICAgICAgICAge3Nob3duLnNjcmVlbnMubWFwKChzY3JlZW4sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gcmVjdHMuZ2V0KHNjcmVlbi5kaXNwbGF5LmlkKSE7XG5cbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBrZXk9e3NjcmVlbi5kaXNwbGF5LmlkfVxuICAgICAgICAgICAgICAgIGRhdGEtc2NyZWVuLWlkPXtzY3JlZW4uZGlzcGxheS5pZH1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlcy5zY3JlZW5Db250cm9sc31cbiAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgbGVmdDogYGNhbGMoJHtyZWN0LmxlZnR9JSArICR7Z2FwIC8gMn1weClgLFxuICAgICAgICAgICAgICAgICAgdG9wOiBgY2FsYygke3JlY3QudG9wfSUgKyAke2dhcCAvIDJ9cHgpYCxcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiBgY2FsYygke3JlY3Qud2lkdGh9JSAtICR7Z2FwfXB4KWAsXG4gICAgICAgICAgICAgICAgICBoZWlnaHQ6IGBjYWxjKCR7cmVjdC5oZWlnaHR9JSAtICR7Z2FwfXB4KWAsXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxTY3JlZW5TdGVwcGVycyBzY3JlZW49e3NjcmVlbn0gaW5kZXg9e2luZGV4fSAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHtkcmFnPy5raW5kID09PSBcIm1vdmVcIiAmJiBwb2ludGVyICYmIChcbiAgICAgICAgPERpdlxuICAgICAgICAgIGNsYXNzTmFtZT17c3R5bGVzLmdob3N0fVxuICAgICAgICAgICRiYWNrZ3JvdW5kQ29sb3I9XCJiYWNrZ3JvdW5kU2Vjb25kYXJ5XCJcbiAgICAgICAgICAkYm9yZGVyPXt7IGNvbG9yOiBcInByaW1hcnlcIiwgd2lkdGg6IFwieHhzXCIsIHJhZGl1czogXCJzXCIgfX1cbiAgICAgICAgICAkZm9udD17eyBzaXplOiBcInNcIiB9fVxuICAgICAgICAgICRzdHlsZT17eyBsZWZ0OiBwb2ludGVyLngsIHRvcDogcG9pbnRlci55IH19XG4gICAgICAgID5cbiAgICAgICAgICB7ZHJhZy50aXRsZX1cbiAgICAgICAgPC9EaXY+XG4gICAgICApfVxuICAgIDwvRGl2PlxuICApO1xufSk7XG5cbi8vIFRoZSB0aWxpbmcgcm93IG9mIHRoZSBkaWFsb2c6IHRoZSBlZGl0b3IsIGFuZCB0aGUgYnV0dG9ucyB0byB0aWxlIGFzIGl0IHNob3dzLCBzdGFydCBvdmVyLCBvclxuLy8ga2VlcCBpdCB3aXRoIHRoZSBsYXlvdXQgc2hvd24uXG5leHBvcnQgY29uc3QgVGlsZVdpbmRvd3MgPSBvYnNlcnZlcigoKSA9PiB7XG4gIGNvbnN0IG1vZGVsID0gdXNlSW5qZWN0KHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUpKCk7XG4gIGNvbnN0IGxheW91dCA9IG1vZGVsLnNlbGVjdGVkTGF5b3V0LmdldCgpO1xuXG4gIHJldHVybiAoXG4gICAgPERpdlxuICAgICAgJGZsZXg9e3sgZGlyZWN0aW9uOiBcInZlcnRpY2FsXCIsIGdhcDogXCJzXCIgfX1cbiAgICAgIC8vIFRha2luZyB0aGUgaGVpZ2h0IHRoZSBkaWFsb2cgaGFzIGxlZnQsIGZvciB0aGUgc2NyZWVucyB0byBiZSBkcmF3biBhcyBsYXJnZSBhcyBpdCBsZXRzIHRoZW0uXG4gICAgICAkZmxleENoaWxkXG4gICAgICAkcGFkZGluZz17eyB2ZXJ0aWNhbDogXCJzXCIsIGhvcml6b250YWw6IFwibVwiIH19XG4gICAgICAkYm9yZGVyPXt7IGNvbG9yOiBcImJvcmRlclByaW1hcnlcIiwgd2lkdGg6IFwieHhzXCIsIHJhZGl1czogXCJtXCIgfX1cbiAgICA+XG4gICAgICA8RGl2XG4gICAgICAgICRmbGV4PXt7IGRpcmVjdGlvbjogXCJob3Jpem9udGFsXCIsIGdhcDogXCJtXCIsIHZlcnRpY2FsQWxpZ246IFwiY2VudGVyXCIgfX1cbiAgICAgID5cbiAgICAgICAgPERpdiAkZmxleD17eyBkaXJlY3Rpb246IFwidmVydGljYWxcIiwgZ2FwOiBcInh4c1wiIH19ICRmbGV4Q2hpbGQ+XG4gICAgICAgICAgPFNwYW4gJGZvbnQ9e3sgYm9sZDogdHJ1ZSB9fT5UaWxpbmc8L1NwYW4+XG4gICAgICAgICAgPFNwYW4gJGNvbG9yPVwidGV4dE11dGVkXCIgJGZvbnQ9e3sgc2l6ZTogXCJzXCIgfX0+XG4gICAgICAgICAgICBEcmFnIHdpbmRvd3MgdG8gYW55IGNlbGwgb2YgdGhlIHNjcmVlbnM7IGRyYWcgYSB3aW5kb3cncyBjb3JuZXIgdG9cbiAgICAgICAgICAgIG1ha2UgaXQgd2lkZXIgb3IgdGFsbGVyLiBUaGUgd2luZG93cyBmb2xsb3cgYXMgeW91IGNoYW5nZSBpdC5cbiAgICAgICAgICA8L1NwYW4+XG4gICAgICAgIDwvRGl2PlxuICAgICAgPC9EaXY+XG5cbiAgICAgIHttb2RlbC5jYW5BcnJhbmdlLmdldCgpICYmIDxUaWxpbmdFZGl0b3IgLz59XG4gICAgPC9EaXY+XG4gICk7XG59KTtcbiIsICJpbXBvcnQgeyBhc1N0eWxlc2hlZXQgfSBmcm9tIFwiQGs4c2xlbnMvc3R5bGVzaGVldC1jb250cmFjdHNcIjtcbmV4cG9ydCBjb25zdCBzdHlsZXNoZWV0ID0gYXNTdHlsZXNoZWV0KHsgaWQ6IFwiQGs4c2xlbnMvd2luZG93LWxheW91dHMvc3JjL3VpL3RpbGluZy1lZGl0b3IubW9kdWxlLnNjc3NcIiwgY3NzOiBcIi50aWxpbmctZWRpdG9yLW1vZHVsZV9fZHJhd2luZ19fX25sVjZaIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBmbGV4OiAxIDEgMDtcXG4gIG1pbi1oZWlnaHQ6IDMwMHB4O1xcbn1cXG5cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX3NjcmVlbnNfX196MlVDbyB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICB1c2VyLXNlbGVjdDogbm9uZTtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19jZWxsX19fS0JMQUwge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIGJvcmRlcjogMXB4IGRhc2hlZCByZ2JhKDEyNywgMTI3LCAxMjcsIDAuMyk7XFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19lbXB0eUNlbGxfX18ycGFodiB7XFxuICBwb2ludGVyLWV2ZW50czogYXV0bztcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICBwYWRkaW5nOiAwO1xcbiAgYmFja2dyb3VuZDogbm9uZTtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19lbXB0eUNlbGxfX18ycGFodiAudGlsaW5nLWVkaXRvci1tb2R1bGVfX3BsdXNfX19yYnhzZyB7XFxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHotaW5kZXg6IDE7XFxuICBwYWRkaW5nOiA0cHg7XFxuICBib3JkZXItcmFkaXVzOiA1MCU7XFxuICBvcGFjaXR5OiAwO1xcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlO1xcbn1cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX2VtcHR5Q2VsbF9fXzJwYWh2OmhvdmVyLCAudGlsaW5nLWVkaXRvci1tb2R1bGVfX2VtcHR5Q2VsbF9fXzJwYWh2OmZvY3VzLXZpc2libGUge1xcbiAgYmFja2dyb3VuZDogcmdiYSgxMjcsIDEyNywgMTI3LCAwLjEyKTtcXG59XFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19lbXB0eUNlbGxfX18ycGFodjpob3ZlciAudGlsaW5nLWVkaXRvci1tb2R1bGVfX3BsdXNfX19yYnhzZywgLnRpbGluZy1lZGl0b3ItbW9kdWxlX19lbXB0eUNlbGxfX18ycGFodjpmb2N1cy12aXNpYmxlIC50aWxpbmctZWRpdG9yLW1vZHVsZV9fcGx1c19fX3JieHNnIHtcXG4gIG9wYWNpdHk6IDE7XFxufVxcblxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fc3RlcHBlckdyb3VwX19fTWE1Wjgge1xcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgZ2FwOiAycHg7XFxufVxcblxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fc2NyZWVuQ29udHJvbHNfX18wRC1ERSB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XFxuICB6LWluZGV4OiAxO1xcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxufVxcblxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fcGlsbF9fX1NZWHd0IHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgcG9pbnRlci1ldmVudHM6IGF1dG87XFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcXG4gIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMyk7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbn1cXG5cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX2NvbHVtbnNQaWxsX19famQ0eHgge1xcbiAgbGVmdDogNTAlO1xcbiAgcGFkZGluZzogMnB4IDhweDtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19yb3dzUGlsbF9fX1pWNzA4IHtcXG4gIGxlZnQ6IDA7XFxuICBwYWRkaW5nOiA4cHggMnB4O1xcbn1cXG5cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX3NjcmVlbl9fX01aYTZYIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxufVxcblxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fYmFuZF9fX2t6N1RFIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGxlZnQ6IDA7XFxuICByaWdodDogMDtcXG4gIHRvcDogMDtcXG4gIGhlaWdodDogNDBweDtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XFxuICBwYWRkaW5nOiA2cHggMTJweDtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19zY3JlZW5OYW1lX19fRjhGVlMge1xcbiAgZmxleDogMCAxIGF1dG87XFxuICBtaW4td2lkdGg6IDA7XFxuICBtYXgtd2lkdGg6IDEwMCU7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxufVxcblxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fdW50aWxlX19faC10QnAge1xcbiAgZmxleC1zaHJpbms6IDA7XFxuICBtYXJnaW4tbGVmdDogYXV0bztcXG4gIG9wYWNpdHk6IDA7XFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDEyMG1zIGVhc2U7XFxufVxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fdW50aWxlX19faC10QnAudGlsaW5nLWVkaXRvci1tb2R1bGVfX3Nob3duX19fSkVuRHcsIC50aWxpbmctZWRpdG9yLW1vZHVsZV9fdW50aWxlX19faC10QnA6Zm9jdXMtdmlzaWJsZSB7XFxuICBvcGFjaXR5OiAxO1xcbn1cXG5cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX3ZlcnRpY2FsU3RlcHBlckdyb3VwX19fOGRPUEIge1xcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIGdhcDogMnB4O1xcbn1cXG5cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX3N0ZXBwZXJfX19oMUhOayB7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gIHdpZHRoOiAyMnB4O1xcbiAgaGVpZ2h0OiAyMnB4O1xcbiAgcGFkZGluZzogMDtcXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gIGJhY2tncm91bmQ6IG5vbmU7XFxuICBib3JkZXI6IG5vbmU7XFxuICBjb2xvcjogaW5oZXJpdDtcXG4gIGZvbnQ6IGluaGVyaXQ7XFxufVxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fc3RlcHBlcl9fX2gxSE5rOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcXG4gIGJhY2tncm91bmQ6IHJnYmEoMTI3LCAxMjcsIDEyNywgMC4yNSk7XFxufVxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fc3RlcHBlcl9fX2gxSE5rOmRpc2FibGVkIHtcXG4gIGN1cnNvcjogZGVmYXVsdDtcXG4gIG9wYWNpdHk6IDAuNDtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbn1cXG5cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX3N0ZXBwZXJUaXBfX19OT0I0TCB7XFxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19sYWJlbF9fX1J0N1EzIHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgbGluZS1oZWlnaHQ6IDE7XFxuICB0ZXh0LWJveDogdHJpbS1ib3RoIGNhcCBhbHBoYWJldGljO1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX192ZXJ0aWNhbExhYmVsX19fNVd1T0Qge1xcbiAgd3JpdGluZy1tb2RlOiB2ZXJ0aWNhbC1ybDtcXG4gIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxufVxcblxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fdGlsZV9fX1lNVUUzIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICBwYWRkaW5nOiAycHg7XFxuICBjdXJzb3I6IGdyYWI7XFxuICB0b3VjaC1hY3Rpb246IG5vbmU7XFxuICB0cmFuc2l0aW9uOiBsZWZ0IDEyMG1zIGVhc2UsIHRvcCAxMjBtcyBlYXNlLCB3aWR0aCAxMjBtcyBlYXNlLCBoZWlnaHQgMTIwbXMgZWFzZTtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX190aWxlQm9keV9fX3Y2Q3ZnIHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICBwYWRkaW5nOiAxOHB4IDZweCA0cHggMThweDtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX190aWxlVGl0bGVMaW5lX19fcXVvam4ge1xcbiAgcGFkZGluZy1yaWdodDogMjRweDtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBmbGV4LXdyYXA6IHdyYXA7XFxuICBhbGlnbi1pdGVtczogYmFzZWxpbmU7XFxuICBnYXA6IDJweCA2cHg7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbn1cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX3RpbGVUaXRsZUxpbmVfX19xdW9qbiA+IDpub3QoOmZpcnN0LWNoaWxkKSB7XFxuICBmbGV4LXNocmluazogMDtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX190aWxlTmFtZV9fX1pWZU5pIHtcXG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIGZsZXg6IDAgMSBhdXRvO1xcbiAgbWluLXdpZHRoOiAwO1xcbiAgbWF4LXdpZHRoOiAxMDAlO1xcbn1cXG5cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX3RpbGVMYWJlbF9fXzNuRXZnIHtcXG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIGdhcDogNnB4O1xcbn1cXG5cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX3RpbGVUaXRsZV9fX3UydFp4IHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgbWluLXdpZHRoOiAwO1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19kcmFnZ2luZ19fX3JtVUdXIHtcXG4gIGN1cnNvcjogZ3JhYmJpbmc7XFxuICBvcGFjaXR5OiAwLjY7XFxufVxcblxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9faGFuZGxlX19fN3QwTUkge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgcmlnaHQ6IDJweDtcXG4gIGJvdHRvbTogMnB4O1xcbiAgd2lkdGg6IDE0cHg7XFxuICBoZWlnaHQ6IDE0cHg7XFxuICBjdXJzb3I6IG53c2UtcmVzaXplO1xcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgdHJhbnNwYXJlbnQgNTAlLCBjdXJyZW50Q29sb3IgNTAlLCBjdXJyZW50Q29sb3IgNjAlLCB0cmFuc3BhcmVudCA2MCUsIHRyYW5zcGFyZW50IDcwJSwgY3VycmVudENvbG9yIDcwJSwgY3VycmVudENvbG9yIDgwJSwgdHJhbnNwYXJlbnQgODAlKTtcXG4gIG9wYWNpdHk6IDAuNztcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX190cmF5X19fNmM0ZGUge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGZsZXgtd3JhcDogd3JhcDtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBnYXA6IDZweDtcXG4gIG1pbi1oZWlnaHQ6IDM2cHg7XFxuICB1c2VyLXNlbGVjdDogbm9uZTtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19jaGlwX19fdWRDcEUge1xcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgY3Vyc29yOiBncmFiO1xcbiAgdG91Y2gtYWN0aW9uOiBub25lO1xcbiAgcGFkZGluZzogMnB4IDhweDtcXG4gIG1heC13aWR0aDogMjIwcHg7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19jaGlwX19fdWRDcEUgLnRpbGluZy1lZGl0b3ItbW9kdWxlX190aWxlVGl0bGVfX191MnRaeCB7XFxuICBmbGV4OiAwIDEgYXV0bztcXG59XFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19jaGlwX19fdWRDcEUgLnRpbGluZy1lZGl0b3ItbW9kdWxlX19jbG9zZVdpbmRvd0lubGluZV9fX1VKSjNBIHtcXG4gIGZsZXgtc2hyaW5rOiAwO1xcbiAgbWFyZ2luLWxlZnQ6IDJweDtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19naG9zdF9fX0VMdWhFIHtcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbiAgei1pbmRleDogMTAwMDA7XFxuICBwYWRkaW5nOiAycHggOHB4O1xcbiAgbWF4LXdpZHRoOiAyNDBweDtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSg4cHgsIDhweCk7XFxufVxcblxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fY2xvc2VXaW5kb3dfX19ONmRlTyB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB0b3A6IDJweDtcXG4gIHJpZ2h0OiAycHg7XFxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gIHBhZGRpbmc6IDJweDtcXG4gIGJvcmRlcjogbm9uZTtcXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gIGJhY2tncm91bmQ6IG5vbmU7XFxuICBjb2xvcjogaW5oZXJpdDtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIG9wYWNpdHk6IDA7XFxufVxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fY2xvc2VXaW5kb3dfX19ONmRlTzpob3ZlciB7XFxuICBiYWNrZ3JvdW5kOiByZ2JhKDEyNywgMTI3LCAxMjcsIDAuMjUpO1xcbn1cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX2Nsb3NlV2luZG93X19fTjZkZU86Zm9jdXMtdmlzaWJsZSB7XFxuICBvcGFjaXR5OiAxO1xcbn1cXG5cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX3RpbGVfX19ZTVVFMzpob3ZlciAudGlsaW5nLWVkaXRvci1tb2R1bGVfX2Nsb3NlV2luZG93X19fTjZkZU8sXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19jaGlwX19fdWRDcEU6aG92ZXIgLnRpbGluZy1lZGl0b3ItbW9kdWxlX19jbG9zZVdpbmRvd19fX042ZGVPIHtcXG4gIG9wYWNpdHk6IDE7XFxufVxcblxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fcmVuYW1lV2luZG93X19fQjkyaW4ge1xcbiAgZmxleC1zaHJpbms6IDA7XFxuICBhbGlnbi1zZWxmOiBjZW50ZXI7XFxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gIG1hcmdpbi1sZWZ0OiAycHg7XFxuICBwYWRkaW5nOiAxcHg7XFxuICBib3JkZXI6IG5vbmU7XFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICBiYWNrZ3JvdW5kOiBub25lO1xcbiAgY29sb3I6IGluaGVyaXQ7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBvcGFjaXR5OiAwO1xcbn1cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX3JlbmFtZVdpbmRvd19fX0I5MmluOmhvdmVyIHtcXG4gIGJhY2tncm91bmQ6IHJnYmEoMTI3LCAxMjcsIDEyNywgMC4yNSk7XFxufVxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fcmVuYW1lV2luZG93X19fQjkyaW46Zm9jdXMtdmlzaWJsZSB7XFxuICBvcGFjaXR5OiAxO1xcbn1cXG5cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX3RpbGVfX19ZTVVFMzpob3ZlciAudGlsaW5nLWVkaXRvci1tb2R1bGVfX3JlbmFtZVdpbmRvd19fX0I5MmluLFxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fY2hpcF9fX3VkQ3BFOmhvdmVyIC50aWxpbmctZWRpdG9yLW1vZHVsZV9fcmVuYW1lV2luZG93X19fQjkyaW4ge1xcbiAgb3BhY2l0eTogMTtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19yZW9wZW5XaW5kb3dfX19UWHhGTSB7XFxuICBmbGV4LXNocmluazogMDtcXG4gIGFsaWduLXNlbGY6IGNlbnRlcjtcXG4gIG9wYWNpdHk6IDA7XFxufVxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fcmVvcGVuV2luZG93X19fVFh4Rk06Zm9jdXMtdmlzaWJsZSB7XFxuICBvcGFjaXR5OiAxO1xcbn1cXG5cXG4udGlsaW5nLWVkaXRvci1tb2R1bGVfX3RpbGVfX19ZTVVFMzpob3ZlciAudGlsaW5nLWVkaXRvci1tb2R1bGVfX3Jlb3BlbldpbmRvd19fX1RYeEZNLFxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fY2hpcF9fX3VkQ3BFOmhvdmVyIC50aWxpbmctZWRpdG9yLW1vZHVsZV9fcmVvcGVuV2luZG93X19fVFh4Rk0ge1xcbiAgb3BhY2l0eTogMTtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX190aWxlVGl0bGVGb3JtX19fSzM3M0Uge1xcbiAgZmxleDogMSAxIGF1dG87XFxuICBtaW4td2lkdGg6IDA7XFxufVxcbi50aWxpbmctZWRpdG9yLW1vZHVsZV9fdGlsZVRpdGxlRm9ybV9fX0szNzNFIGlucHV0IHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG59XFxuXFxuLnRpbGluZy1lZGl0b3ItbW9kdWxlX19jbG9zZVdpbmRvd0lubGluZV9fX1VKSjNBIHtcXG4gIHBvc2l0aW9uOiBzdGF0aWM7XFxuICBtYXJnaW4tbGVmdDogNHB4O1xcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG59XCIgfSk7XG5leHBvcnQgZGVmYXVsdCB7XCJkcmF3aW5nXCI6XCJ0aWxpbmctZWRpdG9yLW1vZHVsZV9fZHJhd2luZ19fX25sVjZaXCIsXCJzY3JlZW5zXCI6XCJ0aWxpbmctZWRpdG9yLW1vZHVsZV9fc2NyZWVuc19fX3oyVUNvXCIsXCJjZWxsXCI6XCJ0aWxpbmctZWRpdG9yLW1vZHVsZV9fY2VsbF9fX0tCTEFMXCIsXCJlbXB0eUNlbGxcIjpcInRpbGluZy1lZGl0b3ItbW9kdWxlX19lbXB0eUNlbGxfX18ycGFodlwiLFwicGx1c1wiOlwidGlsaW5nLWVkaXRvci1tb2R1bGVfX3BsdXNfX19yYnhzZ1wiLFwic3RlcHBlckdyb3VwXCI6XCJ0aWxpbmctZWRpdG9yLW1vZHVsZV9fc3RlcHBlckdyb3VwX19fTWE1WjhcIixcInNjcmVlbkNvbnRyb2xzXCI6XCJ0aWxpbmctZWRpdG9yLW1vZHVsZV9fc2NyZWVuQ29udHJvbHNfX18wRC1ERVwiLFwicGlsbFwiOlwidGlsaW5nLWVkaXRvci1tb2R1bGVfX3BpbGxfX19TWVh3dFwiLFwiY29sdW1uc1BpbGxcIjpcInRpbGluZy1lZGl0b3ItbW9kdWxlX19jb2x1bW5zUGlsbF9fX2pkNHh4XCIsXCJyb3dzUGlsbFwiOlwidGlsaW5nLWVkaXRvci1tb2R1bGVfX3Jvd3NQaWxsX19fWlY3MDhcIixcInNjcmVlblwiOlwidGlsaW5nLWVkaXRvci1tb2R1bGVfX3NjcmVlbl9fX01aYTZYXCIsXCJiYW5kXCI6XCJ0aWxpbmctZWRpdG9yLW1vZHVsZV9fYmFuZF9fX2t6N1RFXCIsXCJzY3JlZW5OYW1lXCI6XCJ0aWxpbmctZWRpdG9yLW1vZHVsZV9fc2NyZWVuTmFtZV9fX0Y4RlZTXCIsXCJ1bnRpbGVcIjpcInRpbGluZy1lZGl0b3ItbW9kdWxlX191bnRpbGVfX19oLXRCcFwiLFwic2hvd25cIjpcInRpbGluZy1lZGl0b3ItbW9kdWxlX19zaG93bl9fX0pFbkR3XCIsXCJ2ZXJ0aWNhbFN0ZXBwZXJHcm91cFwiOlwidGlsaW5nLWVkaXRvci1tb2R1bGVfX3ZlcnRpY2FsU3RlcHBlckdyb3VwX19fOGRPUEJcIixcInN0ZXBwZXJcIjpcInRpbGluZy1lZGl0b3ItbW9kdWxlX19zdGVwcGVyX19faDFITmtcIixcInN0ZXBwZXJUaXBcIjpcInRpbGluZy1lZGl0b3ItbW9kdWxlX19zdGVwcGVyVGlwX19fTk9CNExcIixcImxhYmVsXCI6XCJ0aWxpbmctZWRpdG9yLW1vZHVsZV9fbGFiZWxfX19SdDdRM1wiLFwidmVydGljYWxMYWJlbFwiOlwidGlsaW5nLWVkaXRvci1tb2R1bGVfX3ZlcnRpY2FsTGFiZWxfX181V3VPRFwiLFwidGlsZVwiOlwidGlsaW5nLWVkaXRvci1tb2R1bGVfX3RpbGVfX19ZTVVFM1wiLFwidGlsZUJvZHlcIjpcInRpbGluZy1lZGl0b3ItbW9kdWxlX190aWxlQm9keV9fX3Y2Q3ZnXCIsXCJ0aWxlVGl0bGVMaW5lXCI6XCJ0aWxpbmctZWRpdG9yLW1vZHVsZV9fdGlsZVRpdGxlTGluZV9fX3F1b2puXCIsXCJ0aWxlTmFtZVwiOlwidGlsaW5nLWVkaXRvci1tb2R1bGVfX3RpbGVOYW1lX19fWlZlTmlcIixcInRpbGVMYWJlbFwiOlwidGlsaW5nLWVkaXRvci1tb2R1bGVfX3RpbGVMYWJlbF9fXzNuRXZnXCIsXCJ0aWxlVGl0bGVcIjpcInRpbGluZy1lZGl0b3ItbW9kdWxlX190aWxlVGl0bGVfX191MnRaeFwiLFwiZHJhZ2dpbmdcIjpcInRpbGluZy1lZGl0b3ItbW9kdWxlX19kcmFnZ2luZ19fX3JtVUdXXCIsXCJoYW5kbGVcIjpcInRpbGluZy1lZGl0b3ItbW9kdWxlX19oYW5kbGVfX183dDBNSVwiLFwidHJheVwiOlwidGlsaW5nLWVkaXRvci1tb2R1bGVfX3RyYXlfX182YzRkZVwiLFwiY2hpcFwiOlwidGlsaW5nLWVkaXRvci1tb2R1bGVfX2NoaXBfX191ZENwRVwiLFwiY2xvc2VXaW5kb3dJbmxpbmVcIjpcInRpbGluZy1lZGl0b3ItbW9kdWxlX19jbG9zZVdpbmRvd0lubGluZV9fX1VKSjNBXCIsXCJnaG9zdFwiOlwidGlsaW5nLWVkaXRvci1tb2R1bGVfX2dob3N0X19fRUx1aEVcIixcImNsb3NlV2luZG93XCI6XCJ0aWxpbmctZWRpdG9yLW1vZHVsZV9fY2xvc2VXaW5kb3dfX19ONmRlT1wiLFwicmVuYW1lV2luZG93XCI6XCJ0aWxpbmctZWRpdG9yLW1vZHVsZV9fcmVuYW1lV2luZG93X19fQjkyaW5cIixcInJlb3BlbldpbmRvd1wiOlwidGlsaW5nLWVkaXRvci1tb2R1bGVfX3Jlb3BlbldpbmRvd19fX1RYeEZNXCIsXCJ0aWxlVGl0bGVGb3JtXCI6XCJ0aWxpbmctZWRpdG9yLW1vZHVsZV9fdGlsZVRpdGxlRm9ybV9fX0szNzNFXCJ9OyIsICJpbXBvcnQgeyBEaXYsIEltZywgU3BhbiwgdXNlRm9jdXNhYmxlSXRlbSB9IGZyb20gXCJAazhzbGVucy9lbGVtZW50LWNvbXBvbmVudHNcIjtcbmltcG9ydCB7XG4gIHR5cGUgSWNvblByb3BzLFxuICBLdWJlUmVzb3VyY2VLaW5kSWNvbixcbiAgS3ViZXJuZXRlc1RpbGxlckNyZXN0SWNvbixcbn0gZnJvbSBcIkBrOHNsZW5zL2ljb25cIjtcbmltcG9ydCB7XG4gIERlZmF1bHREcm9wRG93bk1lbnVDb250YWluZXIsXG4gIGRyb3BEb3duTWVudSxcbiAgZHJvcERvd25NZW51Q29udGFpbmVyQ29tcG9uZW50SW5qZWN0aW9uVG9rZW4sXG4gIHR5cGUgRHJvcERvd25NZW51Q29udGFpbmVyUHJvcHMsXG4gIGdldERyb3BEb3duTWVudUl0ZW1JbmplY3RhYmxlQnVuY2gsXG4gIGdldERyb3BEb3duTWVudUl0ZW1zSW5qZWN0YWJsZUJ1bmNoLFxuICBnZXREcm9wRG93bk1lbnVLaW5kLFxuICB1c2VDbG9zZURyb3BEb3duTWVudSxcbn0gZnJvbSBcIkBrOHNsZW5zL2Ryb3AtZG93bi1tZW51LWNvbnRyYWN0c1wiO1xuaW1wb3J0IHtcbiAgRHJvcERvd25NZW51SXRlbVJvdyxcbiAgRHJvcERvd25NZW51U3ViTWVudSxcbn0gZnJvbSBcIkBrOHNsZW5zL2Ryb3AtZG93bi1tZW51LWl0ZW1zXCI7XG5pbXBvcnQgeyBTZWFyY2hJbnB1dCB9IGZyb20gXCJAazhzbGVucy9pbnB1dC1jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBnZXRJbmplY3RhYmxlMiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyB1c2VJbmplY3QgfSBmcm9tIFwiQGs4c2xlbnMvdXNlLWluamVjdFwiO1xuaW1wb3J0IHsgY29tcHV0ZWQgfSBmcm9tIFwibW9ieFwiO1xuaW1wb3J0IHsgcGxhY2VPZiB9IGZyb20gXCJAazhzbGVucy9uYXZpZ2F0aW9uLWNvbnRyYWN0c1wiO1xuaW1wb3J0IHsgcHJlZmVyZW5jZXNOYXZpZ2F0aW9uVGFyZ2V0S2luZCB9IGZyb20gXCJAazhzbGVucy9wcmVmZXJlbmNlcy1jb250cmFjdHNcIjtcbmltcG9ydCB7IG9ic2VydmVyIH0gZnJvbSBcIm1vYngtcmVhY3RcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZUNvbnRleHQsXG4gIHVzZUNhbGxiYWNrLFxuICB1c2VDb250ZXh0LFxuICB1c2VFZmZlY3QsXG4gIHVzZU1lbW8sXG4gIHVzZVJlZixcbiAgdXNlU3RhdGUsXG59IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgcmVzb3VyY2VMaXN0cywgdHlwZSBSZXNvdXJjZUxpc3QgfSBmcm9tIFwiLi4vbGF5b3V0cy9yZXNvdXJjZS1saXN0c1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBDZWxsLFxuICB3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlLFxufSBmcm9tIFwiLi93aW5kb3ctbGF5b3V0cy1tb2RlbC5pbmplY3RhYmxlXCI7XG5cbi8vIE9wZW5lZCBmcm9tIGFuIGVtcHR5IGNlbGw6IHRoZSBjbHVzdGVycywgZWFjaCBvcGVuaW5nIGl0cyBsaXN0cywgdG8gb3BlbiBvbmUgaW4gYSBuZXcgd2luZG93IHRoZXJlLlxuZXhwb3J0IGNvbnN0IG5ld1dpbmRvd01lbnVLaW5kID0gZ2V0RHJvcERvd25NZW51S2luZDxDZWxsPigpKFxuICBcIndpbmRvdy1tYW5hZ2VyLW5ldy13aW5kb3ctbWVudVwiLFxuKTtcblxudHlwZSBDbHVzdGVyQ2VsbCA9IENlbGwgJiB7XG4gIHJlYWRvbmx5IGNsdXN0ZXJJZDogc3RyaW5nO1xuICByZWFkb25seSBjbHVzdGVyTmFtZTogc3RyaW5nO1xufTtcblxuLy8gQSBjbHVzdGVyJ3MgbGlzdHMgb2Yga3ViZSByZXNvdXJjZXMsIG9wZW5lZCBiZXNpZGUgdGhlIGNsdXN0ZXIgaW4gdGhlIG1lbnUgYWJvdmUuXG5leHBvcnQgY29uc3QgcmVzb3VyY2VMaXN0TWVudUtpbmQgPSBnZXREcm9wRG93bk1lbnVLaW5kPENsdXN0ZXJDZWxsPigpKFxuICBcIndpbmRvdy1tYW5hZ2VyLXJlc291cmNlLWxpc3QtbWVudVwiLFxuKTtcblxuLy8gV2hhdCBhIG1lbnUgaXMgZm9yLCBhcyBhIGhlYWRpbmcgbm8gcm93IG9mIHdoaWNoIGNhbiBiZSBwaWNrZWQuXG4vLyBJdHMgd2lkdGggaXMgdGhlIG1lbnUncyBsZWFzdCwgc28gdGhhdCB0aGUgbmFtZXMgaW4gaXQgZml0IG9uIGEgbGluZS5cbmNvbnN0IEhlYWRpbmcgPSAoeyB0ZXh0IH06IHsgdGV4dDogc3RyaW5nIH0pID0+IChcbiAgPERyb3BEb3duTWVudUl0ZW1Sb3dcbiAgICAkY29sb3I9XCJ0ZXh0TXV0ZWRcIlxuICAgICRlbmFibGVkPXtmYWxzZX1cbiAgICAkZm9udD17eyBzaXplOiBcInNcIiB9fVxuICAgICRzdHlsZT17eyBtaW5XaWR0aDogMzAwIH19XG4gID5cbiAgICB7dGV4dH1cbiAgPC9Ecm9wRG93bk1lbnVJdGVtUm93PlxuKTtcblxuY29uc3QgTmV3V2luZG93SGVhZGluZyA9ICgpID0+IChcbiAgPEhlYWRpbmcgdGV4dD1cIk9wZW4gYSBwYWdlIGluIGEgbmV3IHdpbmRvdyBoZXJlXCIgLz5cbik7XG5cbi8vIEEgc2VhcmNoIG9mIGEgbWVudSwgYW4gaXRlbSBvZiB0aGUgbWVudSBvZiBpdHMgb3duLCBzbyB0aGF0IGVhY2ggcm93IGl0IG5hcnJvd3MgaXMgcG9pbnRlZCBhdCBhbmRcbi8vIGFycm93ZWQgdG8gYXMgYW55IHJvdyBvZiBhIG1lbnUgaXMuXG5jb25zdCBNZW51U2VhcmNoID0gKHtcbiAgdmFsdWUsXG4gIG9uQ2hhbmdlLFxuICBwbGFjZWhvbGRlcixcbiAgd2lkdGgsXG4gIGF1dG9Gb2N1cyA9IGZhbHNlLFxufToge1xuICB2YWx1ZTogc3RyaW5nO1xuICBvbkNoYW5nZTogKHRleHQ6IHN0cmluZykgPT4gdm9pZDtcbiAgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgd2lkdGg6IG51bWJlcjtcbiAgLy8gVGFraW5nIHRoZSBmb2N1cyBhcyBpdCBzaG93cywgZm9yIGEgbWVudSBvcGVuZWQgYnkgY2xpY2tpbmc7IG9uZSBvcGVuZWQgYnkgaG92ZXJpbmcgbGVhdmVzIHRoZVxuICAvLyBmb2N1cyB3aGVyZSBpdCBpcywgdGFraW5nIGl0IHdoZW4gYXJyb3dlZCBpbnRvLlxuICBhdXRvRm9jdXM/OiBib29sZWFuO1xufSkgPT4ge1xuICBjb25zdCBmb2N1c2FibGUgPSB1c2VGb2N1c2FibGVJdGVtKCk7XG5cbiAgcmV0dXJuIChcbiAgICA8RGl2XG4gICAgICAvLyBUaGUgc2VhcmNoIGlzIHRoZSBtZW51J3MgZmlyc3QgaXRlbSB0aGF0IGNhbiBiZSB1c2VkOiB0aGUgbWVudSBmb2N1c2VzIGl0IGFzIGl0IG9wZW5zLCBhbmRcbiAgICAgIC8vIGxlYXZlcyB0aGUgZm9jdXMgdGhlcmUgYXMgdGhlIHJvd3MgYmVsb3cgaXQgY29tZSBhbmQgZ28uXG4gICAgICAkZm9jdXNhYmxlPXtmb2N1c2FibGV9XG4gICAgICAvLyBGb2N1c2VkIGFzIHRoZSBtZW51J3MgaXRlbSwgaXQgaGFuZHMgdGhlIGZvY3VzIHRvIGl0cyBzZWFyY2ggYm94LlxuICAgICAgb25Gb2N1cz17KGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC50YXJnZXQgPT09IGV2ZW50LmN1cnJlbnRUYXJnZXQpIHtcbiAgICAgICAgICBldmVudC5jdXJyZW50VGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dFwiKT8uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgICRwYWRkaW5nPXt7IGhvcml6b250YWw6IFwieHNcIiwgdmVydGljYWw6IFwieHhzXCIgfX1cbiAgICAgICRzdHlsZT17eyB3aWR0aCB9fVxuICAgICAgLy8gVHlwaW5nIGlzIHRoZSBzZWFyY2gncyBhbG9uZTogdGhlIG1lbnUgd291bGQgdGFrZSBrZXlzIHRvIG1vdmUgYmV0d2VlbiBpdHMgcm93cywgYW5kIHRoZVxuICAgICAgLy8gZm9jdXMgd2l0aCB0aGVtLCBhZnRlciBldmVyeSBjaGFyYWN0ZXIuIEVzY2FwZSBhbmQgdGhlIGFycm93cyB1cCBhbmQgZG93biBzdGlsbCByZWFjaCBpdC5cbiAgICAgIG9uS2V5RG93bj17KGV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghW1wiRXNjYXBlXCIsIFwiQXJyb3dVcFwiLCBcIkFycm93RG93blwiLCBcIlRhYlwiXS5pbmNsdWRlcyhldmVudC5rZXkpKSB7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgPlxuICAgICAgPFNlYXJjaElucHV0XG4gICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfVxuICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgIGF1dG9Gb2N1cz17YXV0b0ZvY3VzfVxuICAgICAgLz5cbiAgICA8L0Rpdj5cbiAgKTtcbn07XG5cbi8vIEZpbmRzIGNsdXN0ZXJzLCBhbmQgTGVucydzIG93biBwYWdlcywgYnkgbmFtZS5cbmNvbnN0IENsdXN0ZXJTZWFyY2ggPSBvYnNlcnZlcigoKSA9PiB7XG4gIGNvbnN0IG1vZGVsID0gdXNlSW5qZWN0KHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUpKCk7XG5cbiAgLy8gQSBtZW51IG9wZW5lZCBhbmV3IHNlYXJjaGVzIGFuZXcuXG4gIHVzZUVmZmVjdCgoKSA9PiBtb2RlbC5zZXRDbHVzdGVyU2VhcmNoKFwiXCIpLCBbXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8TWVudVNlYXJjaFxuICAgICAgdmFsdWU9e21vZGVsLmNsdXN0ZXJTZWFyY2guZ2V0KCl9XG4gICAgICBvbkNoYW5nZT17KHRleHQpID0+IG1vZGVsLnNldENsdXN0ZXJTZWFyY2godGV4dCl9XG4gICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBjbHVzdGVycyBhbmQgcGFnZXNcIlxuICAgICAgd2lkdGg9ezQyMH1cbiAgICAgIGF1dG9Gb2N1c1xuICAgIC8+XG4gICk7XG59KTtcblxuLy8gSGFzIHRoZSBwYW5lbCBvZiBhIGNsdXN0ZXIncyBwYWdlcyBrZWVwIHRoZSBoZWlnaHQgaXQgc2hvd3MgYXQsIGFzIGl0cyBzZWFyY2ggaGlkZXMgcGFnZXMuXG5jb25zdCBLZWVwUGFuZWxIZWlnaHRDb250ZXh0ID0gY3JlYXRlQ29udGV4dCgoKSA9PiB7fSk7XG5cbi8vIEZpbmRzIGEgY2x1c3RlcidzIHBhZ2VzIGJ5IG5hbWUuXG5jb25zdCBQYWdlU2VhcmNoID0gb2JzZXJ2ZXIoKCkgPT4ge1xuICBjb25zdCBtb2RlbCA9IHVzZUluamVjdCh3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlKSgpO1xuICBjb25zdCBrZWVwUGFuZWxIZWlnaHQgPSB1c2VDb250ZXh0KEtlZXBQYW5lbEhlaWdodENvbnRleHQpO1xuXG4gIC8vIEEgY2x1c3RlcidzIHBhZ2VzIG9wZW5lZCBhbmV3IGFyZSBzZWFyY2hlZCBhbmV3LlxuICB1c2VFZmZlY3QoKCkgPT4gbW9kZWwuc2V0UGFnZVNlYXJjaChcIlwiKSwgW10pO1xuXG4gIHJldHVybiAoXG4gICAgPE1lbnVTZWFyY2hcbiAgICAgIHZhbHVlPXttb2RlbC5wYWdlU2VhcmNoLmdldCgpfVxuICAgICAgb25DaGFuZ2U9eyh0ZXh0KSA9PiB7XG4gICAgICAgIGtlZXBQYW5lbEhlaWdodCgpO1xuICAgICAgICBtb2RlbC5zZXRQYWdlU2VhcmNoKHRleHQpO1xuICAgICAgfX1cbiAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIHBhZ2VzXCJcbiAgICAgIHdpZHRoPXsyODB9XG4gICAgLz5cbiAgKTtcbn0pO1xuXG4vLyBTaG93biBvbmx5IHdoaWxlIG5vIHBhZ2UgbWF0Y2hlcyB0aGUgc2VhcmNoLlxuY29uc3QgTm9QYWdlcyA9IG9ic2VydmVyKCgpID0+IHtcbiAgY29uc3QgbW9kZWwgPSB1c2VJbmplY3Qod2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSkoKTtcblxuICByZXR1cm4gcmVzb3VyY2VMaXN0cy5zb21lKChsaXN0KSA9PlxuICAgIGlzTWF0Y2gobGlzdC5sYWJlbCwgbW9kZWwucGFnZVNlYXJjaC5nZXQoKSksXG4gICkgPyBudWxsIDogKFxuICAgIDxEcm9wRG93bk1lbnVJdGVtUm93ICRjb2xvcj1cInRleHRNdXRlZFwiICRlbmFibGVkPXtmYWxzZX0+XG4gICAgICBObyBwYWdlIG1hdGNoZXNcbiAgICA8L0Ryb3BEb3duTWVudUl0ZW1Sb3c+XG4gICk7XG59KTtcblxuLy8gV2hldGhlciB0aGUgY2x1c3RlcidzIG5hbWUgaGFzIHdoYXQgaXMgc2VhcmNoZWQgZm9yIGluIGl0LlxuY29uc3QgaXNNYXRjaCA9IChuYW1lOiBzdHJpbmcsIHNlYXJjaDogc3RyaW5nKSA9PlxuICBuYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoLnRyaW0oKS50b0xvd2VyQ2FzZSgpKTtcblxuLy8gU2hvd24gb25seSB3aGlsZSBubyBjbHVzdGVyIGlzLlxuY29uc3QgTm9DbHVzdGVycyA9IG9ic2VydmVyKCgpID0+IHtcbiAgY29uc3QgbW9kZWwgPSB1c2VJbmplY3Qod2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSkoKTtcbiAgY29uc3QgY2x1c3RlcnMgPSBtb2RlbC5jbHVzdGVycy5nZXQoKTtcbiAgY29uc3Qgc2VhcmNoID0gbW9kZWwuY2x1c3RlclNlYXJjaC5nZXQoKTtcblxuICBpZiAoY2x1c3RlcnMuc29tZSgoY2x1c3RlcikgPT4gaXNNYXRjaChjbHVzdGVyLm5hbWUuZ2V0KCksIHNlYXJjaCkpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxEcm9wRG93bk1lbnVJdGVtUm93ICRjb2xvcj1cInRleHRNdXRlZFwiICRlbmFibGVkPXtmYWxzZX0+XG4gICAgICB7Y2x1c3RlcnMubGVuZ3RoID09PSAwID8gXCJObyBjbHVzdGVyc1wiIDogXCJObyBjbHVzdGVyIG1hdGNoZXNcIn1cbiAgICA8L0Ryb3BEb3duTWVudUl0ZW1Sb3c+XG4gICk7XG59KTtcblxuaW50ZXJmYWNlIENsdXN0ZXJMb29rcyB7XG4gIHJlYWRvbmx5IGlzQ29ubmVjdGVkOiBib29sZWFuO1xuICAvLyBUaGUgY29sb3VyIHRoZSB1c2VyIHRlbGxzIHRoZSBjbHVzdGVyIGFwYXJ0IGJ5OyBlbXB0eSB3aGVuIHRoZXkgdHVybmVkIGNvbG91cnMgb2ZmLlxuICByZWFkb25seSBjb2xvcjogc3RyaW5nO1xuICAvLyBUaGUgaW1hZ2UgdGhlIHVzZXIgZ2F2ZSB0aGUgY2x1c3RlciwgaWYgYW55LlxuICByZWFkb25seSBpY29uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8vIFRoZSBjbHVzdGVyIGFzIExlbnMgc2hvd3MgaXQ6IGl0cyBpbWFnZSwgb3IgZWxzZSB0aGUgS3ViZXJuZXRlcyBjcmVzdCBpbiBpdHMgY29sb3VyLlxuY29uc3QgQ2x1c3RlckF2YXRhciA9ICh7XG4gIGNvbG9yLFxuICBpY29uLFxufTogUGljazxDbHVzdGVyTG9va3MsIFwiY29sb3JcIiB8IFwiaWNvblwiPikgPT5cbiAgaWNvbiA/IChcbiAgICA8SW1nXG4gICAgICBzcmM9e2ljb259XG4gICAgICBhbHQ9XCJcIlxuICAgICAgJHN0eWxlPXt7XG4gICAgICAgIHdpZHRoOiAyMCxcbiAgICAgICAgaGVpZ2h0OiAyMCxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiA0LFxuICAgICAgICBvYmplY3RGaXQ6IFwiY292ZXJcIixcbiAgICAgICAgZmxleFNocmluazogMCxcbiAgICAgIH19XG4gICAgLz5cbiAgKSA6IChcbiAgICA8S3ViZXJuZXRlc1RpbGxlckNyZXN0SWNvblxuICAgICAgJHNpemU9XCJtXCJcbiAgICAgICRzdHlsZT17Y29sb3IgPyB7IGNvbG9yIH0gOiB1bmRlZmluZWR9XG4gICAgLz5cbiAgKTtcblxuLy8gTGVucyBpcyBjb25uZWN0ZWQgdG8gdGhlIGNsdXN0ZXIuXG5jb25zdCBDb25uZWN0ZWREb3QgPSAoKSA9PiAoXG4gIDxTcGFuXG4gICAgcm9sZT1cImltZ1wiXG4gICAgYXJpYS1sYWJlbD1cIkNvbm5lY3RlZFwiXG4gICAgJGJhY2tncm91bmRDb2xvcj1cInN1Y2Nlc3NcIlxuICAgIC8vIEF0IHRoZSBmYXIgZW5kIG9mIHRoZSByb3csIGJ5IGl0cyBjaGV2cm9uLlxuICAgICRzdHlsZT17e1xuICAgICAgd2lkdGg6IDgsXG4gICAgICBoZWlnaHQ6IDgsXG4gICAgICBib3JkZXJSYWRpdXM6IFwiNTAlXCIsXG4gICAgICBkaXNwbGF5OiBcImlubGluZS1ibG9ja1wiLFxuICAgICAgZmxleFNocmluazogMCxcbiAgICAgIG1hcmdpbkxlZnQ6IFwiYXV0b1wiLFxuICAgIH19XG4gIC8+XG4pO1xuXG4vLyBBIGNsdXN0ZXIsIHNob3duIHdoaWxlIGl0cyBuYW1lIG1hdGNoZXMgdGhlIHNlYXJjaDogaGlkZGVuIHJhdGhlciB0aGFuIHRha2VuIG91dCBvZiB0aGUgbWVudSwgYXNcbi8vIHRoZSBtZW51IGZvY3VzZXMgaXRzIGZpcnN0IHJvdyB3aGVuZXZlciBpdHMgcm93cyBjaGFuZ2UsIHdoaWNoIHdvdWxkIHRha2UgdGhlIGZvY3VzIGZyb20gdGhlIHNlYXJjaC5cbmNvbnN0IENsdXN0ZXJSb3cgPSBvYnNlcnZlcihcbiAgKHtcbiAgICBkYXRhLFxuICAgIGNsdXN0ZXJJZCxcbiAgICBjbHVzdGVyTmFtZSxcbiAgICBsb29rcyxcbiAgfToge1xuICAgIGRhdGE6IENlbGw7XG4gICAgY2x1c3RlcklkOiBzdHJpbmc7XG4gICAgY2x1c3Rlck5hbWU6IHN0cmluZztcbiAgICBsb29rczogQ2x1c3Rlckxvb2tzO1xuICB9KSA9PiB7XG4gICAgY29uc3QgbW9kZWwgPSB1c2VJbmplY3Qod2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSkoKTtcblxuICAgIGlmICghaXNNYXRjaChjbHVzdGVyTmFtZSwgbW9kZWwuY2x1c3RlclNlYXJjaC5nZXQoKSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8RHJvcERvd25NZW51U3ViTWVudVxuICAgICAgICAvLyBJdHMgcGFnZXMgb3BlbiBiZXNpZGUgdGhlIHdob2xlIHJvdywgYXQgdGhlIG1lbnUncyBlZGdlLCBsZXZlbCB3aXRoIHRoZSByb3cuXG4gICAgICAgICRzdHlsZT17eyBhbGlnblNlbGY6IFwic3RyZXRjaFwiLCBib3hTaXppbmc6IFwiYm9yZGVyLWJveFwiIH19XG4gICAgICAgIG1lbnU9e2Ryb3BEb3duTWVudShyZXNvdXJjZUxpc3RNZW51S2luZCwge1xuICAgICAgICAgIGRhdGE6IHsgLi4uZGF0YSwgY2x1c3RlcklkLCBjbHVzdGVyTmFtZSB9LFxuICAgICAgICAgIHBvc2l0aW9uOiBcInJpZ2h0IHNwYW4tYm90dG9tXCIsXG4gICAgICAgIH0pfVxuICAgICAgICB0cmFpbGluZz17bG9va3MuaXNDb25uZWN0ZWQgPyA8Q29ubmVjdGVkRG90IC8+IDogdW5kZWZpbmVkfVxuICAgICAgPlxuICAgICAgICA8Q2x1c3RlckF2YXRhciBjb2xvcj17bG9va3MuY29sb3J9IGljb249e2xvb2tzLmljb259IC8+XG4gICAgICAgIHtjbHVzdGVyTmFtZX1cbiAgICAgIDwvRHJvcERvd25NZW51U3ViTWVudT5cbiAgICApO1xuICB9LFxuKTtcblxuLy8gUGFnZXMgb2YgTGVucyBub3Qgb2YgYSBjbHVzdGVyLCBhZnRlciB0aGUgY2x1c3RlcnM6IHRoZSBzZWFyY2ggc3RheXMgdGhlIGZpcnN0IGl0ZW0sIGZvY3VzZWQgYXNcbi8vIHRoZSBtZW51IG9wZW5zLCBhbmQgbmFycm93cyB0aGVzZSB0b28uXG5jb25zdCBsZW5zUGFnZXMgPSBbXG4gIHtcbiAgICBsYWJlbDogXCJQcmVmZXJlbmNlc1wiLFxuICAgIHBsYWNlOiAoKSA9PiBwbGFjZU9mKHByZWZlcmVuY2VzTmF2aWdhdGlvblRhcmdldEtpbmQsIHt9KSxcbiAgfSxcbl0gYXMgY29uc3Q7XG5cbmNvbnN0IExlbnNQYWdlc0hlYWRpbmcgPSBvYnNlcnZlcigoKSA9PiB7XG4gIGNvbnN0IG1vZGVsID0gdXNlSW5qZWN0KHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUpKCk7XG5cbiAgcmV0dXJuIGxlbnNQYWdlcy5zb21lKChwYWdlKSA9PlxuICAgIGlzTWF0Y2gocGFnZS5sYWJlbCwgbW9kZWwuY2x1c3RlclNlYXJjaC5nZXQoKSksXG4gICkgPyAoXG4gICAgPEhlYWRpbmcgdGV4dD1cIkxlbnNcIiAvPlxuICApIDogbnVsbDtcbn0pO1xuXG5jb25zdCBMZW5zUGFnZVJvdyA9IG9ic2VydmVyKFxuICAoeyBkYXRhLCBwYWdlIH06IHsgZGF0YTogQ2VsbDsgcGFnZTogKHR5cGVvZiBsZW5zUGFnZXMpW251bWJlcl0gfSkgPT4ge1xuICAgIGNvbnN0IG1vZGVsID0gdXNlSW5qZWN0KHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUpKCk7XG4gICAgY29uc3QgY2xvc2VEcm9wRG93bk1lbnUgPSB1c2VDbG9zZURyb3BEb3duTWVudSgpO1xuXG4gICAgaWYgKCFpc01hdGNoKHBhZ2UubGFiZWwsIG1vZGVsLmNsdXN0ZXJTZWFyY2guZ2V0KCkpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPERyb3BEb3duTWVudUl0ZW1Sb3dcbiAgICAgICAgJG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICBjbG9zZURyb3BEb3duTWVudSgpO1xuICAgICAgICAgIHZvaWQgbW9kZWwub3BlbkluQ2VsbChwYWdlLnBsYWNlKCksIGRhdGEsIHBhZ2UubGFiZWwpO1xuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICB7cGFnZS5sYWJlbH1cbiAgICAgIDwvRHJvcERvd25NZW51SXRlbVJvdz5cbiAgICApO1xuICB9LFxuKTtcblxuZXhwb3J0IGNvbnN0IGxlbnNQYWdlc0l0ZW1zQnVuY2ggPSBnZXREcm9wRG93bk1lbnVJdGVtc0luamVjdGFibGVCdW5jaCh7XG4gIGlkOiBcIndpbmRvdy1tYW5hZ2VyLW5ldy13aW5kb3ctbGVucy1wYWdlc1wiLFxuICBraW5kOiBuZXdXaW5kb3dNZW51S2luZCxcblxuICBpbnN0YW50aWF0ZTogKCkgPT4gKCkgPT4gW1xuICAgIHtcbiAgICAgIGlkOiBcIndpbmRvdy1tYW5hZ2VyLW5ldy13aW5kb3ctbGVucy1wYWdlcy1oZWFkaW5nXCIsXG4gICAgICBvcmRlck51bWJlcjogMTBfMDAwLFxuICAgICAgQ29tcG9uZW50OiBMZW5zUGFnZXNIZWFkaW5nLFxuICAgIH0sXG4gICAgLi4ubGVuc1BhZ2VzLm1hcCgocGFnZSwgaW5kZXgpID0+ICh7XG4gICAgICBpZDogYHdpbmRvdy1tYW5hZ2VyLW5ldy13aW5kb3ctbGVucy1wYWdlLSR7aW5kZXh9YCxcbiAgICAgIG9yZGVyTnVtYmVyOiAxMF8wMDEgKyBpbmRleCxcbiAgICAgIENvbXBvbmVudDogTGVuc1BhZ2VSb3csXG4gICAgICBjb21wb25lbnRQcm9wczogeyBwYWdlIH0sXG4gICAgfSkpLFxuICBdLFxufSk7XG5cbmV4cG9ydCBjb25zdCBjbHVzdGVySXRlbXNCdW5jaCA9IGdldERyb3BEb3duTWVudUl0ZW1zSW5qZWN0YWJsZUJ1bmNoKHtcbiAgaWQ6IFwid2luZG93LW1hbmFnZXItbmV3LXdpbmRvdy1jbHVzdGVyc1wiLFxuICBraW5kOiBuZXdXaW5kb3dNZW51S2luZCxcblxuICBpbnN0YW50aWF0ZTogKGRpKSA9PiB7XG4gICAgY29uc3QgbW9kZWwgPSBkaS5pbmplY3Qod2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSkoKTtcblxuICAgIHJldHVybiAoKSA9PlxuICAgICAgY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICAvLyBFdmVyeSBjbHVzdGVyLCB3aGF0ZXZlciBpcyBzZWFyY2hlZCBmb3I6IHRoZSByb3dzIGhpZGUgdGhlbXNlbHZlcy5cbiAgICAgICAgY29uc3QgY2x1c3RlcnMgPSBtb2RlbC5jbHVzdGVyc1xuICAgICAgICAgIC5nZXQoKVxuICAgICAgICAgIC5tYXAoKGNsdXN0ZXIpID0+ICh7XG4gICAgICAgICAgICBpZDogY2x1c3Rlci5pZCxcbiAgICAgICAgICAgIG5hbWU6IGNsdXN0ZXIubmFtZS5nZXQoKSxcbiAgICAgICAgICAgIGxvb2tzOiB7XG4gICAgICAgICAgICAgIGlzQ29ubmVjdGVkOiBjbHVzdGVyLmlzQ29ubmVjdGVkLmdldCgpLFxuICAgICAgICAgICAgICBjb2xvcjogY2x1c3Rlci5jb2xvci5nZXQoKSxcbiAgICAgICAgICAgICAgaWNvbjogY2x1c3Rlci5pY29uLmdldCgpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSlcbiAgICAgICAgICAvLyBUaG9zZSBjb25uZWN0ZWQgZmlyc3QsIGFzIHRoZSBsaWtlbGllc3QgdG8gYmUgb3BlbmVkLlxuICAgICAgICAgIC5zb3J0KFxuICAgICAgICAgICAgKGEsIGIpID0+XG4gICAgICAgICAgICAgIE51bWJlcihiLmxvb2tzLmlzQ29ubmVjdGVkKSAtIE51bWJlcihhLmxvb2tzLmlzQ29ubmVjdGVkKSB8fFxuICAgICAgICAgICAgICBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogXCJ3aW5kb3ctbWFuYWdlci1uZXctd2luZG93LW5vLWNsdXN0ZXJzXCIsXG4gICAgICAgICAgICBvcmRlck51bWJlcjogMixcbiAgICAgICAgICAgIENvbXBvbmVudDogTm9DbHVzdGVycyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLmNsdXN0ZXJzLm1hcCgoY2x1c3RlciwgaW5kZXgpID0+ICh7XG4gICAgICAgICAgICBpZDogYHdpbmRvdy1tYW5hZ2VyLW5ldy13aW5kb3ctY2x1c3Rlci0ke2NsdXN0ZXIuaWR9YCxcbiAgICAgICAgICAgIG9yZGVyTnVtYmVyOiAxMCArIGluZGV4LFxuICAgICAgICAgICAgQ29tcG9uZW50OiBDbHVzdGVyUm93LFxuICAgICAgICAgICAgY29tcG9uZW50UHJvcHM6IHtcbiAgICAgICAgICAgICAgY2x1c3RlcklkOiBjbHVzdGVyLmlkLFxuICAgICAgICAgICAgICBjbHVzdGVyTmFtZTogY2x1c3Rlci5uYW1lLFxuICAgICAgICAgICAgICBsb29rczogY2x1c3Rlci5sb29rcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSkpLFxuICAgICAgICBdO1xuICAgICAgfSk7XG4gIH0sXG59KTtcblxuLy8gVGhlIGhlYWRpbmcgYW5kIHRoZSBzZWFyY2gsIGl0ZW1zIG9mIHRoZWlyIG93biB0aGF0IHN0YXkgYXMgdGhleSBhcmUgd2hpbGUgdGhlIGNsdXN0ZXJzIGJlbG93XG4vLyB0aGVtIGZvbGxvdyB3aGF0IGlzIHR5cGVkOiByZWJ1aWx0IHdpdGggdGhlbSwgdGhlIHNlYXJjaCB3b3VsZCBsb3NlIHRoZSBmb2N1cyBhdCBlYWNoIGtleS5cbmV4cG9ydCBjb25zdCBuZXdXaW5kb3dIZWFkaW5nQnVuY2ggPSBnZXREcm9wRG93bk1lbnVJdGVtSW5qZWN0YWJsZUJ1bmNoKHtcbiAgaWQ6IFwid2luZG93LW1hbmFnZXItbmV3LXdpbmRvdy1oZWFkaW5nXCIsXG4gIGtpbmQ6IG5ld1dpbmRvd01lbnVLaW5kLFxuICBvcmRlck51bWJlcjogMCxcbiAgQ29tcG9uZW50OiBOZXdXaW5kb3dIZWFkaW5nLFxufSk7XG5cbmV4cG9ydCBjb25zdCBjbHVzdGVyU2VhcmNoQnVuY2ggPSBnZXREcm9wRG93bk1lbnVJdGVtSW5qZWN0YWJsZUJ1bmNoKHtcbiAgaWQ6IFwid2luZG93LW1hbmFnZXItbmV3LXdpbmRvdy1zZWFyY2hcIixcbiAga2luZDogbmV3V2luZG93TWVudUtpbmQsXG4gIG9yZGVyTnVtYmVyOiAxLFxuICBDb21wb25lbnQ6IENsdXN0ZXJTZWFyY2gsXG59KTtcblxuY29uc3QgUmVzb3VyY2VMaXN0c0hlYWRpbmcgPSAoeyBkYXRhIH06IHsgZGF0YTogQ2x1c3RlckNlbGwgfSkgPT4gKFxuICA8SGVhZGluZyB0ZXh0PXtgUGFnZXMgb2YgJHtkYXRhLmNsdXN0ZXJOYW1lfWB9IC8+XG4pO1xuXG4vLyBFYWNoIGxpc3Qgd2l0aCBpdHMga2luZCdzIGljb24sIG1hZGUgb25jZSBzbyB0aGF0IHRoZSByb3dzIGtlZXAgdGhlIHNhbWUgY29tcG9uZW50LlxuY29uc3QgaWNvbnNPZkxpc3RzID0gbmV3IE1hcChcbiAgcmVzb3VyY2VMaXN0cy5tYXAoKGxpc3QpID0+IFtcbiAgICBsaXN0LFxuICAgIGxpc3Qua2luZFxuICAgICAgPyAvLyBUaGUgcm93IG5hbWVzIHRoZSBraW5kIGFscmVhZHk6IG5vIHRvb2x0aXAgdG8gc2F5IGl0IGFnYWluLlxuICAgICAgICAocHJvcHM6IEljb25Qcm9wcykgPT4gKFxuICAgICAgICAgIDxLdWJlUmVzb3VyY2VLaW5kSWNvblxuICAgICAgICAgICAga2luZD17bGlzdC5raW5kIX1cbiAgICAgICAgICAgIHsuLi5wcm9wc31cbiAgICAgICAgICAgICR0b29sdGlwPXt1bmRlZmluZWR9XG4gICAgICAgICAgLz5cbiAgICAgICAgKVxuICAgICAgOiB1bmRlZmluZWQsXG4gIF0pLFxuKTtcblxuY29uc3QgUmVzb3VyY2VMaXN0Um93ID0gb2JzZXJ2ZXIoXG4gICh7IGRhdGEsIGxpc3QgfTogeyBkYXRhOiBDbHVzdGVyQ2VsbDsgbGlzdDogUmVzb3VyY2VMaXN0IH0pID0+IHtcbiAgICBjb25zdCBtb2RlbCA9IHVzZUluamVjdCh3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlKSgpO1xuICAgIGNvbnN0IGNsb3NlRHJvcERvd25NZW51ID0gdXNlQ2xvc2VEcm9wRG93bk1lbnUoKTtcbiAgICBjb25zdCBjbHVzdGVyID0gbW9kZWwuY2x1c3RlcnMuZ2V0KCkuZmluZCgoaXQpID0+IGl0LmlkID09PSBkYXRhLmNsdXN0ZXJJZCk7XG4gICAgY29uc3QgY29sb3IgPSBjbHVzdGVyPy5jb2xvci5nZXQoKSA/PyBcIlwiO1xuICAgIGNvbnN0IGljb24gPSBjbHVzdGVyPy5pY29uLmdldCgpO1xuXG4gICAgLy8gSGlkZGVuIHJhdGhlciB0aGFuIHRha2VuIG91dCBvZiB0aGUgbWVudSB3aGlsZSBpdCBkb2VzIG5vdCBtYXRjaCB0aGUgc2VhcmNoLCB3aGljaCB3b3VsZCB0YWtlXG4gICAgLy8gdGhlIGZvY3VzIGZyb20gdGhlIHNlYXJjaC5cbiAgICBjb25zdCBtYXRjaGVzID0gaXNNYXRjaChsaXN0LmxhYmVsLCBtb2RlbC5wYWdlU2VhcmNoLmdldCgpKTtcblxuICAgIC8vIFRoZSBvdmVydmlldywgb2Ygbm8ga2luZCwgc2hvd3MgdGhlIGNsdXN0ZXIgYXMgdGhlIG1lbnUgYmVmb3JlIHNob3dlZCBpdC5cbiAgICBjb25zdCBDbHVzdGVySWNvbiA9IHVzZU1lbW8oXG4gICAgICAoKSA9PiAoKSA9PiA8Q2x1c3RlckF2YXRhciBjb2xvcj17Y29sb3J9IGljb249e2ljb259IC8+LFxuICAgICAgW2NvbG9yLCBpY29uXSxcbiAgICApO1xuXG4gICAgaWYgKCFtYXRjaGVzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPERyb3BEb3duTWVudUl0ZW1Sb3dcbiAgICAgICAgSWNvbj17aWNvbnNPZkxpc3RzLmdldChsaXN0KSA/PyBDbHVzdGVySWNvbn1cbiAgICAgICAgJG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICBjbG9zZURyb3BEb3duTWVudSgpO1xuICAgICAgICAgIC8vIE5hbWVkIGFzIExlbnMgbmFtZXMgc3VjaCBhIHdpbmRvdywgdW50aWwgaXQgc2hvd3MgYW5kIG5hbWVzIGl0c2VsZi5cbiAgICAgICAgICB2b2lkIG1vZGVsLm9wZW5JbkNlbGwoXG4gICAgICAgICAgICBsaXN0LnBsYWNlRm9yKGRhdGEuY2x1c3RlcklkKSxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBgJHtsaXN0LmxhYmVsfSAtICR7ZGF0YS5jbHVzdGVyTmFtZX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIHtsaXN0LmxhYmVsfVxuICAgICAgPC9Ecm9wRG93bk1lbnVJdGVtUm93PlxuICAgICk7XG4gIH0sXG4pO1xuXG5leHBvcnQgY29uc3QgcmVzb3VyY2VMaXN0SXRlbXNCdW5jaCA9IGdldERyb3BEb3duTWVudUl0ZW1zSW5qZWN0YWJsZUJ1bmNoKHtcbiAgaWQ6IFwid2luZG93LW1hbmFnZXItbmV3LXdpbmRvdy1yZXNvdXJjZS1saXN0c1wiLFxuICBraW5kOiByZXNvdXJjZUxpc3RNZW51S2luZCxcblxuICBpbnN0YW50aWF0ZTogKCkgPT4gKCkgPT4gW1xuICAgIHtcbiAgICAgIGlkOiBcIndpbmRvdy1tYW5hZ2VyLW5ldy13aW5kb3ctcmVzb3VyY2UtbGlzdHMtaGVhZGluZ1wiLFxuICAgICAgb3JkZXJOdW1iZXI6IDAsXG4gICAgICBDb21wb25lbnQ6IFJlc291cmNlTGlzdHNIZWFkaW5nLFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6IFwid2luZG93LW1hbmFnZXItbmV3LXdpbmRvdy1yZXNvdXJjZS1saXN0cy1zZWFyY2hcIixcbiAgICAgIG9yZGVyTnVtYmVyOiAxLFxuICAgICAgQ29tcG9uZW50OiBQYWdlU2VhcmNoLFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6IFwid2luZG93LW1hbmFnZXItbmV3LXdpbmRvdy1yZXNvdXJjZS1saXN0cy1ub25lXCIsXG4gICAgICBvcmRlck51bWJlcjogMixcbiAgICAgIENvbXBvbmVudDogTm9QYWdlcyxcbiAgICB9LFxuICAgIC4uLnJlc291cmNlTGlzdHMubWFwKChsaXN0LCBpbmRleCkgPT4gKHtcbiAgICAgIGlkOiBgd2luZG93LW1hbmFnZXItbmV3LXdpbmRvdy1yZXNvdXJjZS1saXN0LSR7aW5kZXh9YCxcbiAgICAgIG9yZGVyTnVtYmVyOiAxMCArIGluZGV4LFxuICAgICAgQ29tcG9uZW50OiBSZXNvdXJjZUxpc3RSb3csXG4gICAgICBjb21wb25lbnRQcm9wczogeyBsaXN0IH0sXG4gICAgfSkpLFxuICBdLFxufSk7XG5cbi8vIEEgY2x1c3RlcidzIHBhZ2VzIGFyZSBtb3JlIHRoYW4gYSBzaG9ydCB3aW5kb3cgY2FuIGJlIHRhbGwsIGFuZCBhIG1lbnUgdGFsbGVyIHRoYW4gdGhlIHJvb20gYmVzaWRlXG4vLyBpdHMgcm93IGlzIHBsYWNlZCB3aGVyZXZlciBpdCBmaXRzIGluc3RlYWQuIFNvIHRoZSBwYW5lbCBpcyBhcyB0YWxsIGFzIGl0cyBwYWdlcywgYnV0IG5ldmVyIHRhbGxlclxuLy8gdGhhbiBoYWxmIHRoZSB3aW5kb3csIHNjcm9sbGluZyB0aGVuOyB0aGF0IGFsd2F5cyBmaXRzIGJlc2lkZSB0aGUgcm93LCBiZWxvdyBpdCBvciBhYm92ZS5cbi8vXG4vLyBJdCBrZWVwcyB0aGF0IGhlaWdodCBhcyBpdHMgc2VhcmNoIGhpZGVzIHBhZ2VzOiBvcGVuZWQgdXB3YXJkcywgZnJvbSBpdHMgcm93J3MgYm90dG9tLCBhIHBhbmVsXG4vLyBncm93aW5nIHNob3J0ZXIgd291bGQgbW92ZSBpdHMgc2VhcmNoIG91dCBmcm9tIHVuZGVyIHRoZSBwb2ludGVyLCBhbmQgY2xvc2UuIFNvIHRoZSBzZWFyY2gsIGFib3V0XG4vLyB0byBoaWRlIHBhZ2VzLCBoYXMgdGhlIHBhbmVsIGtlZXAgdGhlIGhlaWdodCBpdCBzaG93cyBhdC5cbmNvbnN0IFJlc291cmNlTGlzdE1lbnVDb250YWluZXIgPSAoe1xuICBjaGlsZHJlbixcbiAgaXRlbXM6IF9pdGVtcyxcbiAgLi4ubWVudVByb3BzXG59OiBEcm9wRG93bk1lbnVDb250YWluZXJQcm9wcykgPT4ge1xuICBjb25zdCBbaGVpZ2h0LCBzZXRIZWlnaHRdID0gdXNlU3RhdGU8bnVtYmVyPigpO1xuICBjb25zdCBtYXJrID0gdXNlUmVmPEhUTUxTcGFuRWxlbWVudD4obnVsbCk7XG5cbiAgY29uc3Qga2VlcEhlaWdodCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBwYW5lbCA9IG1hcmsuY3VycmVudD8ucGFyZW50RWxlbWVudDtcblxuICAgIGlmIChwYW5lbCkge1xuICAgICAgc2V0SGVpZ2h0KChrZXB0KSA9PiBrZXB0ID8/IHBhbmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCk7XG4gICAgfVxuICB9LCBbXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8RGVmYXVsdERyb3BEb3duTWVudUNvbnRhaW5lclxuICAgICAgey4uLm1lbnVQcm9wc31cbiAgICAgIC8vIFNjcm9sbGluZyB1cCBhbmQgZG93biBvbmx5OiB3aGF0IHJlYWNoZXMgcGFzdCB0aGUgcGFuZWwncyBzaWRlcywgYXMgdGhlIHN0cmlwIHRoYXQga2VlcHMgYVxuICAgICAgLy8gcG9pbnRlciBjcm9zc2luZyB0aGUgZ2FwIHRvIGl0IG9uIGl0LCBpcyBubyByZWFzb24gdG8gc2Nyb2xsIHNpZGV3YXlzLlxuICAgICAgJHN0eWxlPXt7XG4gICAgICAgIC4uLihoZWlnaHQgPT09IHVuZGVmaW5lZCA/IHsgbWF4SGVpZ2h0OiBcIjUwdmhcIiB9IDogeyBoZWlnaHQgfSksXG4gICAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCIsXG4gICAgICAgIG92ZXJmbG93WTogXCJhdXRvXCIsXG4gICAgICAgIG92ZXJmbG93WDogXCJoaWRkZW5cIixcbiAgICAgIH19XG4gICAgPlxuICAgICAgPHNwYW4gcmVmPXttYXJrfSBoaWRkZW4gLz5cbiAgICAgIDxLZWVwUGFuZWxIZWlnaHRDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtrZWVwSGVpZ2h0fT5cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgPC9LZWVwUGFuZWxIZWlnaHRDb250ZXh0LlByb3ZpZGVyPlxuICAgIDwvRGVmYXVsdERyb3BEb3duTWVudUNvbnRhaW5lcj5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCByZXNvdXJjZUxpc3RNZW51Q29udGFpbmVySW5qZWN0YWJsZSA9IGdldEluamVjdGFibGUyKHtcbiAgaWQ6IFwid2luZG93LW1hbmFnZXItcmVzb3VyY2UtbGlzdC1tZW51LWNvbnRhaW5lclwiLFxuICBpbnN0YW50aWF0ZTogKCkgPT4gKCkgPT4gUmVzb3VyY2VMaXN0TWVudUNvbnRhaW5lcixcbiAgaW5qZWN0aW9uVG9rZW46XG4gICAgZHJvcERvd25NZW51Q29udGFpbmVyQ29tcG9uZW50SW5qZWN0aW9uVG9rZW4uZm9yKHJlc291cmNlTGlzdE1lbnVLaW5kKSxcbn0pO1xuIiwgImltcG9ydCB7XG4gIGNsdXN0ZXJSb2xlc05hdmlnYXRpb25UYXJnZXRLaW5kLFxuICBjb25maWdNYXBzTmF2aWdhdGlvblRhcmdldEtpbmQsXG4gIGNyb25Kb2JzTmF2aWdhdGlvblRhcmdldEtpbmQsXG4gIGN1c3RvbVJlc291cmNlRGVmaW5pdGlvbnNOYXZpZ2F0aW9uVGFyZ2V0S2luZCxcbiAgZGFlbW9uU2V0c05hdmlnYXRpb25UYXJnZXRLaW5kLFxuICBkZXBsb3ltZW50c05hdmlnYXRpb25UYXJnZXRLaW5kLFxuICBob3Jpem9udGFsUG9kQXV0b3NjYWxlcnNOYXZpZ2F0aW9uVGFyZ2V0S2luZCxcbiAgaW5ncmVzc2VzTmF2aWdhdGlvblRhcmdldEtpbmQsXG4gIGpvYnNOYXZpZ2F0aW9uVGFyZ2V0S2luZCxcbiAgbmFtZXNwYWNlc05hdmlnYXRpb25UYXJnZXRLaW5kLFxuICBuZXR3b3JrUG9saWNpZXNOYXZpZ2F0aW9uVGFyZ2V0S2luZCxcbiAgbm9kZXNOYXZpZ2F0aW9uVGFyZ2V0S2luZCxcbiAgcGVyc2lzdGVudFZvbHVtZUNsYWltc05hdmlnYXRpb25UYXJnZXRLaW5kLFxuICBwZXJzaXN0ZW50Vm9sdW1lc05hdmlnYXRpb25UYXJnZXRLaW5kLFxuICBwb2RzTmF2aWdhdGlvblRhcmdldEtpbmQsXG4gIHJlcGxpY2FTZXRzTmF2aWdhdGlvblRhcmdldEtpbmQsXG4gIHJvbGVCaW5kaW5nc05hdmlnYXRpb25UYXJnZXRLaW5kLFxuICByb2xlc05hdmlnYXRpb25UYXJnZXRLaW5kLFxuICBzZWNyZXRzTmF2aWdhdGlvblRhcmdldEtpbmQsXG4gIHNlcnZpY2VBY2NvdW50c05hdmlnYXRpb25UYXJnZXRLaW5kLFxuICBzZXJ2aWNlc05hdmlnYXRpb25UYXJnZXRLaW5kLFxuICBzdGF0ZWZ1bFNldHNOYXZpZ2F0aW9uVGFyZ2V0S2luZCxcbiAgc3RvcmFnZUNsYXNzZXNOYXZpZ2F0aW9uVGFyZ2V0S2luZCxcbn0gZnJvbSBcIkBrOHNsZW5zL2t1YmVybmV0ZXMtcmVzb3VyY2VzLWNvbnRyYWN0c1wiO1xuaW1wb3J0IHsgY2x1c3Rlck92ZXJ2aWV3TmF2aWdhdGlvblRhcmdldEtpbmQgfSBmcm9tIFwiQGs4c2xlbnMvY2x1c3Rlci1jb250cmFjdHNcIjtcbmltcG9ydCB7IHBsYWNlT2YgfSBmcm9tIFwiQGs4c2xlbnMvbmF2aWdhdGlvbi1jb250cmFjdHNcIjtcblxuLy8gVGhlIHBhZ2VzIG9mIGEgY2x1c3RlciBhIHdpbmRvdyBjYW4gYmUgb3BlbmVkIG9uOiBpdHMgb3ZlcnZpZXcsIGFuZCB0aGUgbGlzdHMgb2YgaXRzIGt1YmVcbi8vIHJlc291cmNlcywgaW4gdGhlIG9yZGVyIExlbnMncyBuYXZpZ2F0b3IgaGFzIHRoZW0sIHdpdGggdGhlIGtpbmQgZWFjaCBsaXN0cywgdGhlIG92ZXJ2aWV3IG5vbmUuXG4vLyBFYWNoIHRha2VzIHRoZSBjbHVzdGVyIGFsb25lLlxuY29uc3QgbGlzdHMgPSBbXG4gIFtcIk92ZXJ2aWV3XCIsIGNsdXN0ZXJPdmVydmlld05hdmlnYXRpb25UYXJnZXRLaW5kLCB1bmRlZmluZWRdLFxuICBbXCJQb2RzXCIsIHBvZHNOYXZpZ2F0aW9uVGFyZ2V0S2luZCwgXCJQb2RcIl0sXG4gIFtcIkRlcGxveW1lbnRzXCIsIGRlcGxveW1lbnRzTmF2aWdhdGlvblRhcmdldEtpbmQsIFwiRGVwbG95bWVudFwiXSxcbiAgW1wiRGFlbW9uIFNldHNcIiwgZGFlbW9uU2V0c05hdmlnYXRpb25UYXJnZXRLaW5kLCBcIkRhZW1vblNldFwiXSxcbiAgW1wiU3RhdGVmdWwgU2V0c1wiLCBzdGF0ZWZ1bFNldHNOYXZpZ2F0aW9uVGFyZ2V0S2luZCwgXCJTdGF0ZWZ1bFNldFwiXSxcbiAgW1wiUmVwbGljYSBTZXRzXCIsIHJlcGxpY2FTZXRzTmF2aWdhdGlvblRhcmdldEtpbmQsIFwiUmVwbGljYVNldFwiXSxcbiAgW1wiSm9ic1wiLCBqb2JzTmF2aWdhdGlvblRhcmdldEtpbmQsIFwiSm9iXCJdLFxuICBbXCJDcm9uIEpvYnNcIiwgY3JvbkpvYnNOYXZpZ2F0aW9uVGFyZ2V0S2luZCwgXCJDcm9uSm9iXCJdLFxuICBbXCJDb25maWcgTWFwc1wiLCBjb25maWdNYXBzTmF2aWdhdGlvblRhcmdldEtpbmQsIFwiQ29uZmlnTWFwXCJdLFxuICBbXCJTZWNyZXRzXCIsIHNlY3JldHNOYXZpZ2F0aW9uVGFyZ2V0S2luZCwgXCJTZWNyZXRcIl0sXG4gIFtcbiAgICBcIkhvcml6b250YWwgUG9kIEF1dG9zY2FsZXJzXCIsXG4gICAgaG9yaXpvbnRhbFBvZEF1dG9zY2FsZXJzTmF2aWdhdGlvblRhcmdldEtpbmQsXG4gICAgXCJIb3Jpem9udGFsUG9kQXV0b3NjYWxlclwiLFxuICBdLFxuICBbXCJTZXJ2aWNlc1wiLCBzZXJ2aWNlc05hdmlnYXRpb25UYXJnZXRLaW5kLCBcIlNlcnZpY2VcIl0sXG4gIFtcIkluZ3Jlc3Nlc1wiLCBpbmdyZXNzZXNOYXZpZ2F0aW9uVGFyZ2V0S2luZCwgXCJJbmdyZXNzXCJdLFxuICBbXCJOZXR3b3JrIFBvbGljaWVzXCIsIG5ldHdvcmtQb2xpY2llc05hdmlnYXRpb25UYXJnZXRLaW5kLCBcIk5ldHdvcmtQb2xpY3lcIl0sXG4gIFtcbiAgICBcIlBlcnNpc3RlbnQgVm9sdW1lIENsYWltc1wiLFxuICAgIHBlcnNpc3RlbnRWb2x1bWVDbGFpbXNOYXZpZ2F0aW9uVGFyZ2V0S2luZCxcbiAgICBcIlBlcnNpc3RlbnRWb2x1bWVDbGFpbVwiLFxuICBdLFxuICBbXG4gICAgXCJQZXJzaXN0ZW50IFZvbHVtZXNcIixcbiAgICBwZXJzaXN0ZW50Vm9sdW1lc05hdmlnYXRpb25UYXJnZXRLaW5kLFxuICAgIFwiUGVyc2lzdGVudFZvbHVtZVwiLFxuICBdLFxuICBbXCJTdG9yYWdlIENsYXNzZXNcIiwgc3RvcmFnZUNsYXNzZXNOYXZpZ2F0aW9uVGFyZ2V0S2luZCwgXCJTdG9yYWdlQ2xhc3NcIl0sXG4gIFtcIk5vZGVzXCIsIG5vZGVzTmF2aWdhdGlvblRhcmdldEtpbmQsIFwiTm9kZVwiXSxcbiAgW1wiTmFtZXNwYWNlc1wiLCBuYW1lc3BhY2VzTmF2aWdhdGlvblRhcmdldEtpbmQsIFwiTmFtZXNwYWNlXCJdLFxuICBbXCJTZXJ2aWNlIEFjY291bnRzXCIsIHNlcnZpY2VBY2NvdW50c05hdmlnYXRpb25UYXJnZXRLaW5kLCBcIlNlcnZpY2VBY2NvdW50XCJdLFxuICBbXCJSb2xlc1wiLCByb2xlc05hdmlnYXRpb25UYXJnZXRLaW5kLCBcIlJvbGVcIl0sXG4gIFtcIlJvbGUgQmluZGluZ3NcIiwgcm9sZUJpbmRpbmdzTmF2aWdhdGlvblRhcmdldEtpbmQsIFwiUm9sZUJpbmRpbmdcIl0sXG4gIFtcIkNsdXN0ZXIgUm9sZXNcIiwgY2x1c3RlclJvbGVzTmF2aWdhdGlvblRhcmdldEtpbmQsIFwiQ2x1c3RlclJvbGVcIl0sXG4gIFtcbiAgICBcIkN1c3RvbSBSZXNvdXJjZSBEZWZpbml0aW9uc1wiLFxuICAgIGN1c3RvbVJlc291cmNlRGVmaW5pdGlvbnNOYXZpZ2F0aW9uVGFyZ2V0S2luZCxcbiAgICBcIkN1c3RvbVJlc291cmNlRGVmaW5pdGlvblwiLFxuICBdLFxuXSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZUxpc3Qge1xuICByZWFkb25seSBsYWJlbDogc3RyaW5nO1xuICAvLyBUaGUga2luZCBhcyBLdWJlcm5ldGVzIG5hbWVzIGl0LCBcIlBvZFwiIHNheTsgbm9uZSBmb3IgdGhlIG92ZXJ2aWV3LlxuICByZWFkb25seSBraW5kOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IHBsYWNlRm9yOiAoY2x1c3RlcklkOiBzdHJpbmcpID0+IFJldHVyblR5cGU8dHlwZW9mIHBsYWNlT2Y+O1xufVxuXG5leHBvcnQgY29uc3QgcmVzb3VyY2VMaXN0czogcmVhZG9ubHkgUmVzb3VyY2VMaXN0W10gPSBsaXN0cy5tYXAoXG4gIChbbGFiZWwsIHRhcmdldCwga2luZF0pID0+ICh7XG4gICAgbGFiZWwsXG4gICAga2luZCxcbiAgICBwbGFjZUZvcjogKGNsdXN0ZXJJZDogc3RyaW5nKSA9PlxuICAgICAgcGxhY2VPZih0YXJnZXQgYXMgdHlwZW9mIHBvZHNOYXZpZ2F0aW9uVGFyZ2V0S2luZCwgeyBjbHVzdGVySWQgfSksXG4gIH0pLFxuKTtcbiIsICJpbXBvcnQgeyBnZXRJbmplY3RhYmxlMiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQge1xuICBpc0FwcGxpY2F0aW9uV2luZG93LFxuICB0eXBlIFdpbmRvd0lkLFxufSBmcm9tIFwiQGs4c2xlbnMvbWVzc2FnaW5nLWNvbnRyYWN0c1wiO1xuaW1wb3J0IHsgb3Blbk1vZGFsSW5qZWN0aW9uVG9rZW4gfSBmcm9tIFwiQGs4c2xlbnMvbW9kYWwtY29udHJhY3RzXCI7XG5pbXBvcnQge1xuICBjYW5SZW9wZW5XaW5kb3dSZWFjdGl2ZUluamVjdGlvblRva2VuLFxuICBkaXNwbGF5UmVjb3Jkc1JlYWN0aXZlSW5qZWN0aW9uVG9rZW4sXG4gIGZvY3VzV2luZG93SW5qZWN0aW9uVG9rZW4sXG4gIHJlb3BlbldpbmRvd0luamVjdGlvblRva2VuLFxuICB3aW5kb3dSZWNvcmRzUmVhY3RpdmVJbmplY3Rpb25Ub2tlbixcbiAgd2luZG93UmVjb3JkT2ZJbmplY3Rpb25Ub2tlbixcbiAgc2V0V2luZG93Qm91bmRzSW5qZWN0aW9uVG9rZW4sXG4gIHR5cGUgV2luZG93Qm91bmRzLFxuICB0eXBlIFdpbmRvd1JlY29yZCxcbiAgdHlwZSBXaW5kb3dSZW9wZW5pbmcsXG4gIHR5cGUgV2luZG93UmVvcGVuaW5nUGxhY2VtZW50LFxufSBmcm9tIFwiQGs4c2xlbnMvd2luZG93LWxheW91dC1jb250cmFjdHNcIjtcbmltcG9ydCB7XG4gIGFsbENsdXN0ZXJSZWNvcmRzUmVhY3RpdmVJbmplY3Rpb25Ub2tlbixcbiAgdHlwZSBDbHVzdGVyUmVjb3JkLFxufSBmcm9tIFwiQGs4c2xlbnMvY2x1c3Rlci1jb250cmFjdHNcIjtcbmltcG9ydCB0eXBlIHsgUGxhY2UgfSBmcm9tIFwiQGs4c2xlbnMvbmF2aWdhdGlvbi1jb250cmFjdHNcIjtcbmltcG9ydCB7XG4gIGNsb3NlQW55U3ViV2luZG93SW5qZWN0aW9uVG9rZW4sXG4gIGdldFN1YldpbmRvd0tpbmRJZCxcbiAgdHlwZSBMaXN0ZWRTdWJXaW5kb3csXG4gIG9wZW5TdWJXaW5kb3dJbmplY3Rpb25Ub2tlbixcbiAgcmVuYW1lQW55U3ViV2luZG93SW5qZWN0aW9uVG9rZW4sXG4gIHN1YldpbmRvd3NJbmplY3Rpb25Ub2tlbixcbiAgc3ViV2luZG93c1JlYWN0aXZlSW5qZWN0aW9uVG9rZW4sXG59IGZyb20gXCJAazhzbGVucy9zdWItd2luZG93LWNvbnRyYWN0c1wiO1xuaW1wb3J0IHtcbiAgYWN0aW9uLFxuICBjb21wdXRlZCxcbiAgdHlwZSBJQ29tcHV0ZWRWYWx1ZSxcbiAgdHlwZSBPYnNlcnZhYmxlTWFwLFxuICBvYnNlcnZhYmxlLFxuICBydW5JbkFjdGlvbixcbn0gZnJvbSBcIm1vYnhcIjtcbmltcG9ydCB7IHJlb3BlbmluZ09mQ2xvc2VkV2luZG93SW5qZWN0YWJsZSB9IGZyb20gXCIuLi9sYXlvdXRzL3Jlb3BlbmluZy1vZi1jbG9zZWQtd2luZG93LmluamVjdGFibGVcIjtcbmltcG9ydCB7XG4gIGxpbmVhZ2VLZXksXG4gIGNvbnRpbnVlZFdpbmRvd3NPZixcbiAgd2luZG93Q29udGludWVzQnVuY2gsXG4gIHdpbmRvd0xpbmVhZ2VCdW5jaCxcbn0gZnJvbSBcIi4uL2xheW91dHMvd2luZG93LWxpbmVhZ2UuaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgY2FuT3BlblBsYWNlc0luU3ViV2luZG93c1JlYWN0aXZlSW5qZWN0aW9uVG9rZW4gfSBmcm9tIFwiQGs4c2xlbnMvcGxhY2Utc3ViLXdpbmRvdy1jb250cmFjdHNcIjtcbmltcG9ydCB7IHBsYWNlc1N1YldpbmRvd0tpbmQgfSBmcm9tIFwiLi4vbGF5b3V0cy9wbGFjZXMtc3ViLXdpbmRvdy1raW5kLmluamVjdGFibGVcIjtcbmltcG9ydCB7IGRlbGV0ZVdpbmRvd0xheW91dEluamVjdGFibGUgfSBmcm9tIFwiLi4vbGF5b3V0cy9kZWxldGUtd2luZG93LWxheW91dC5pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyBsYXlvdXRJbkhvdGJhckluamVjdGFibGUgfSBmcm9tIFwiLi4vbGF5b3V0cy9sYXlvdXQtaW4taG90YmFyLmluamVjdGFibGVcIjtcbmltcG9ydCB7IGxheW91dFRpbGluZ0luamVjdGFibGUgfSBmcm9tIFwiLi4vbGF5b3V0cy9sYXlvdXQtdGlsaW5nLmluamVjdGFibGVcIjtcbmltcG9ydCB7IHJlY2FsbFdpbmRvd0xheW91dEluamVjdGFibGUgfSBmcm9tIFwiLi4vbGF5b3V0cy9yZWNhbGwtd2luZG93LWxheW91dC5pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyByZW5hbWVXaW5kb3dMYXlvdXRJbmplY3RhYmxlIH0gZnJvbSBcIi4uL2xheW91dHMvcmVuYW1lLXdpbmRvdy1sYXlvdXQuaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgZHVwbGljYXRlV2luZG93TGF5b3V0SW5qZWN0YWJsZSB9IGZyb20gXCIuLi9sYXlvdXRzL2R1cGxpY2F0ZS13aW5kb3ctbGF5b3V0LmluamVjdGFibGVcIjtcbmltcG9ydCB7IHNhdmVXaW5kb3dMYXlvdXRJbmplY3RhYmxlIH0gZnJvbSBcIi4uL2xheW91dHMvc2F2ZS13aW5kb3ctbGF5b3V0LmluamVjdGFibGVcIjtcbmltcG9ydCB7IG1hdGNoT3BlbldpbmRvd3MsIHNhdmVkV2luZG93T2ZLZXkgfSBmcm9tIFwiLi4vbGF5b3V0cy9sYXlvdXQtdGlsaW5nXCI7XG5pbXBvcnQgeyB0aWxlQm91bmRzT2YgfSBmcm9tIFwiLi4vbGF5b3V0cy9sYXlvdXQtcHJldmlld1wiO1xuaW1wb3J0IHtcbiAgYm91bmRzSW5HcmlkLFxuICBrZXlPZldpbmRvdyxcbiAgbGVmdE91dE9mUGxhbixcbiAgb3BlbmluZ1ByZWZpeCxcbiAgbW92ZUluUGxhbixcbiAgc2V0Um93c0luUGxhbixcbiAgdHlwZSBQbGFjZWRXaW5kb3csXG4gIHR5cGUgUGxhbm5lZFNjcmVlbixcbiAgdHlwZSBQbGFubmVkV2luZG93LFxuICB0eXBlIFJlc29sdmVkVGlsaW5nUGxhbixcbiAgcmVjb25uZWN0ZWRJZE9mLFxufSBmcm9tIFwiLi4vbGF5b3V0cy90aWxpbmctcGxhblwiO1xuaW1wb3J0IHsgdGlsaW5nUGxhbkluamVjdGFibGUgfSBmcm9tIFwiLi4vbGF5b3V0cy90aWxpbmctcGxhbi5pbmplY3RhYmxlXCI7XG5pbXBvcnQgeyB0aWxlV2luZG93c0luamVjdGFibGUgfSBmcm9tIFwiLi4vbGF5b3V0cy90aWxlLXdpbmRvd3MuaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHR5cGUge1xuICBTYXZlZFdpbmRvdyxcbiAgU2F2ZWRXaW5kb3dMYXlvdXQsXG59IGZyb20gXCIuLi9sYXlvdXRzL3NhdmVkLXdpbmRvdy1sYXlvdXRzLmluamVjdGFibGVcIjtcbmltcG9ydCB7IHdpbmRvd0xheW91dExpc3RJbmplY3RhYmxlIH0gZnJvbSBcIi4uL2xheW91dHMvd2luZG93LWxheW91dC1saXN0LmluamVjdGFibGVcIjtcbmltcG9ydCB7IGRlbGV0ZUxheW91dE1vZGFsS2luZCB9IGZyb20gXCIuL2RlbGV0ZS1sYXlvdXQtbW9kYWwuaW5qZWN0YWJsZVwiO1xuXG5jb25zdCBwbHVyYWwgPSAoY291bnQ6IG51bWJlciwgd29yZDogc3RyaW5nKSA9PlxuICBgJHtjb3VudH0gJHt3b3JkfSR7Y291bnQgPT09IDEgPyBcIlwiIDogXCJzXCJ9YDtcblxuLy8gVGhlIG5hbWUgYSBuZXcgbGF5b3V0IGdldHM6IFwiTGF5b3V0XCIgYW5kIHRoZSBudW1iZXIgYWZ0ZXIgdGhlIGhpZ2hlc3Qgb2YgdGhlIGxheW91dHMgc28gbmFtZWQuXG5jb25zdCBuZXh0TGF5b3V0TmFtZSA9IChuYW1lczogcmVhZG9ubHkgc3RyaW5nW10pID0+IHtcbiAgY29uc3QgbnVtYmVycyA9IG5hbWVzXG4gICAgLm1hcCgobmFtZSkgPT4gL15MYXlvdXQgKFxcZCspJC8uZXhlYyhuYW1lKT8uWzFdKVxuICAgIC5maWx0ZXIoKGl0KSA9PiBpdCAhPT0gdW5kZWZpbmVkKTtcblxuICByZXR1cm4gYExheW91dCAke01hdGgubWF4KDAsIC4uLm51bWJlcnMubWFwKE51bWJlcikpICsgMX1gO1xufTtcblxuLy8gVGhlIHdpbmRvd3MgYSBwbGFuIHRpbGVzOiB0aG9zZSBvcGVuLCBvbiBzY3JlZW5zIGNvbm5lY3RlZC5cbmNvbnN0IHRpbGVkV2luZG93c09mID0gKHBsYW46IFJlc29sdmVkVGlsaW5nUGxhbikgPT5cbiAgcGxhbi5zY3JlZW5zXG4gICAgLmZpbHRlcigoc2NyZWVuKSA9PiAhc2NyZWVuLm1pc3NpbmcpXG4gICAgLmZsYXRNYXAoKHNjcmVlbikgPT5cbiAgICAgIHNjcmVlbi53aW5kb3dzXG4gICAgICAgIC5maWx0ZXIoKHdpbmRvdykgPT4gIXdpbmRvdy5taXNzaW5nKVxuICAgICAgICAubWFwKCh3aW5kb3cpID0+ICh7IHdpbmRvdywgc2NyZWVuIH0pKSxcbiAgICApO1xuXG4vLyBXaGVyZSB0aGUgd2luZG93IGlzIHBsYW5uZWQgdG8gZ28sIHRvIHRlbGwgd2hlcmUgaXQgc2V0dGxlZCB3aGVuIHRpbGVkIHNvIGJlZm9yZS5cbmNvbnN0IHBsYWNlbWVudE9mID0gKHdpbmRvdzogUGxhY2VkV2luZG93LCBzY3JlZW46IFBsYW5uZWRTY3JlZW4pID0+XG4gIEpTT04uc3RyaW5naWZ5KFtcbiAgICB3aW5kb3cua2V5LFxuICAgIHNjcmVlbi5kaXNwbGF5LmlkLFxuICAgIHNjcmVlbi5kaXNwbGF5LndvcmtBcmVhLmdldCgpLFxuICAgIHNjcmVlbi5jb2x1bW5zLFxuICAgIHNjcmVlbi5yb3dzLFxuICAgIHdpbmRvdy5jb2x1bW4sXG4gICAgd2luZG93LnJvdyxcbiAgICB3aW5kb3cuY29sdW1ucyxcbiAgICB3aW5kb3cucm93cyxcbiAgXSk7XG5cbmNvbnN0IGlzTmVhciA9IChhOiBXaW5kb3dCb3VuZHMsIGI6IFdpbmRvd0JvdW5kcywgYnk6IG51bWJlcikgPT5cbiAgTWF0aC5hYnMoYS54IC0gYi54KSA8PSBieSAmJlxuICBNYXRoLmFicyhhLnkgLSBiLnkpIDw9IGJ5ICYmXG4gIE1hdGguYWJzKGEud2lkdGggLSBiLndpZHRoKSA8PSBieSAmJlxuICBNYXRoLmFicyhhLmhlaWdodCAtIGIuaGVpZ2h0KSA8PSBieTtcblxuLy8gSG93IGxvbmcgdGlsZWQgd2luZG93cyB0YWtlIHRvIHNldHRsZSB3aGVyZSB0aGV5IHdlcmUgcGxhY2VkLCBiZWZvcmUgdGhleSBhcmUgbG9va2VkIGF0LlxuY29uc3Qgc2V0dGxlTXMgPSA2MDA7XG5cbi8vIEEgY2VsbCBvZiBhIHNjcmVlbidzIGdyaWQuXG5leHBvcnQgaW50ZXJmYWNlIENlbGwge1xuICByZWFkb25seSBkaXNwbGF5SWQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgY29sdW1uOiBudW1iZXI7XG4gIHJlYWRvbmx5IHJvdzogbnVtYmVyO1xufVxuXG4vLyBXaGF0IHRoZSB3aW5kb3cgbGF5b3V0cyBtb2RhbCBzaG93cywgYW5kIHdoYXQgaXRzIGJ1dHRvbnMgZG8uXG5leHBvcnQgY29uc3Qgd2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSA9IGdldEluamVjdGFibGUyKHtcbiAgaWQ6IFwid2luZG93LW1hbmFnZXIud2luZG93LWxheW91dHMtbW9kZWxcIixcbiAgY29uc3VtcHRpb25zOiBbXG4gICAgd2luZG93UmVjb3Jkc1JlYWN0aXZlSW5qZWN0aW9uVG9rZW4sXG4gICAgZGlzcGxheVJlY29yZHNSZWFjdGl2ZUluamVjdGlvblRva2VuLFxuICAgIG9wZW5Nb2RhbEluamVjdGlvblRva2VuLFxuICAgIG9wZW5TdWJXaW5kb3dJbmplY3Rpb25Ub2tlbixcbiAgICBzZXRXaW5kb3dCb3VuZHNJbmplY3Rpb25Ub2tlbixcbiAgICBhbGxDbHVzdGVyUmVjb3Jkc1JlYWN0aXZlSW5qZWN0aW9uVG9rZW4sXG4gICAgY2FuT3BlblBsYWNlc0luU3ViV2luZG93c1JlYWN0aXZlSW5qZWN0aW9uVG9rZW4sXG4gICAgc3ViV2luZG93c1JlYWN0aXZlSW5qZWN0aW9uVG9rZW4sXG4gICAgc3ViV2luZG93c0luamVjdGlvblRva2VuLFxuICAgIGNsb3NlQW55U3ViV2luZG93SW5qZWN0aW9uVG9rZW4sXG4gICAgcmVuYW1lQW55U3ViV2luZG93SW5qZWN0aW9uVG9rZW4sXG4gICAgcmVvcGVuV2luZG93SW5qZWN0aW9uVG9rZW4sXG4gICAgY2FuUmVvcGVuV2luZG93UmVhY3RpdmVJbmplY3Rpb25Ub2tlbixcbiAgICBmb2N1c1dpbmRvd0luamVjdGlvblRva2VuLFxuICAgIHdpbmRvd1JlY29yZE9mSW5qZWN0aW9uVG9rZW4sXG4gIF0sXG5cbiAgaW5zdGFudGlhdGU6IChkaSkgPT4ge1xuICAgIC8vIFdoYXQgdGhlIG1vZGVsIGhhcyBzdGFydGVkIGFuZCBzdG9wcyB3aGVuIGl0IGlzIHRocm93biBhd2F5LCBhcyB3aGVuIHRoZSBleHRlbnNpb24gaXNcbiAgICAvLyByZWJ1aWx0LCBkaXNhYmxlZCBvciB1bmluc3RhbGxlZDogaXRzIHRpbWVycyBub3QgcnVuIHlldC4gSXQgc3RhcnRzIG5vIHJlYWN0aW9ucy5cbiAgICBjb25zdCB0aW1lcnMgPSBuZXcgU2V0PFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+PigpO1xuXG4gICAgY29uc3QgbGF0ZXIgPSAocnVuOiAoKSA9PiB2b2lkLCBtczogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aW1lcnMuZGVsZXRlKHRpbWVyKTtcbiAgICAgICAgcnVuKCk7XG4gICAgICB9LCBtcyk7XG5cbiAgICAgIHRpbWVycy5hZGQodGltZXIpO1xuXG4gICAgICByZXR1cm4gdGltZXI7XG4gICAgfTtcblxuICAgIGNvbnN0IGNhbmNlbCA9ICh0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmICh0aW1lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIHRpbWVycy5kZWxldGUodGltZXIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCB3aW5kb3dzID0gZGkuaW5qZWN0KHdpbmRvd1JlY29yZHNSZWFjdGl2ZUluamVjdGlvblRva2VuKSgpO1xuICAgIGNvbnN0IGRpc3BsYXlzID0gZGkuaW5qZWN0KGRpc3BsYXlSZWNvcmRzUmVhY3RpdmVJbmplY3Rpb25Ub2tlbikoKTtcbiAgICBjb25zdCBjb25maXJtRGVsZXRlID0gZGkuaW5qZWN0KFxuICAgICAgb3Blbk1vZGFsSW5qZWN0aW9uVG9rZW4uZm9yKGRlbGV0ZUxheW91dE1vZGFsS2luZCkuZm9yKGRpLnNjb3BlSWRzKSxcbiAgICApKCk7XG4gICAgY29uc3Qgb3BlblBsYWNlID0gZGkuaW5qZWN0KFxuICAgICAgb3BlblN1YldpbmRvd0luamVjdGlvblRva2VuLmZvcihwbGFjZXNTdWJXaW5kb3dLaW5kKS5mb3IoZGkuc2NvcGVJZHMpLFxuICAgICkoKTtcbiAgICBjb25zdCBzZXRXaW5kb3dCb3VuZHMgPSBkaS5pbmplY3Qoc2V0V2luZG93Qm91bmRzSW5qZWN0aW9uVG9rZW4pKCk7XG4gICAgLy8gTm90IHRoZXJlIGluIGEgTGVucyB0aGF0IG5ldmVyIGNhbiwgYXMgb25lIHdpdGhvdXQgTGVucyBTdHVkaW86IHRha2VuIGFzIGZhbHNlLlxuICAgIGNvbnN0IGNhbk9wZW5QbGFjZXNPck5vdCA9IGRpLmluamVjdE1heWJlKFxuICAgICAgY2FuT3BlblBsYWNlc0luU3ViV2luZG93c1JlYWN0aXZlSW5qZWN0aW9uVG9rZW4sXG4gICAgKT8uKCk7XG4gICAgY29uc3QgY2FuT3BlblBsYWNlcyA9IGNvbXB1dGVkKCgpID0+IGNhbk9wZW5QbGFjZXNPck5vdD8uZ2V0KCkgPz8gZmFsc2UpO1xuICAgIC8vIFRoZSBzdWItd2luZG93cyBMZW5zIGxpc3RzOiBmb2xsb3dlZCB3aGlsZSB0aGUgZWRpdG9yIHNob3dzIHdoZXRoZXIgYSB3aW5kb3cgY2FuIGJlIHJlbmFtZWQsXG4gICAgLy8gYW5kIHJlYWQgb25jZSB3aGVuIGNsb3Npbmcgb3IgcmVuYW1pbmcgb25lLlxuICAgIGNvbnN0IHN1YldpbmRvd3NPZkxlbnMgPSBkaS5pbmplY3Qoc3ViV2luZG93c1JlYWN0aXZlSW5qZWN0aW9uVG9rZW4pKCk7XG4gICAgY29uc3QgZ2V0U3ViV2luZG93cyA9IGRpLmluamVjdChzdWJXaW5kb3dzSW5qZWN0aW9uVG9rZW4pKCk7XG4gICAgY29uc3QgY2xvc2VBbnlTdWJXaW5kb3cgPSBkaS5pbmplY3QoY2xvc2VBbnlTdWJXaW5kb3dJbmplY3Rpb25Ub2tlbikoKTtcbiAgICBjb25zdCByZW5hbWVBbnlTdWJXaW5kb3cgPSBkaS5pbmplY3QocmVuYW1lQW55U3ViV2luZG93SW5qZWN0aW9uVG9rZW4pKCk7XG4gICAgY29uc3QgcmVvcGVuV2luZG93ID0gZGkuaW5qZWN0KHJlb3BlbldpbmRvd0luamVjdGlvblRva2VuKSgpO1xuICAgIGNvbnN0IGZvY3VzV2luZG93ID0gZGkuaW5qZWN0KGZvY3VzV2luZG93SW5qZWN0aW9uVG9rZW4pKCk7XG4gICAgY29uc3Qgd2luZG93UmVjb3JkT2YgPSBkaS5pbmplY3Qod2luZG93UmVjb3JkT2ZJbmplY3Rpb25Ub2tlbikoKTtcbiAgICBjb25zdCBjYW5SZW9wZW5XaW5kb3dSZWFjdGl2ZSA9IGRpLmluamVjdChcbiAgICAgIGNhblJlb3BlbldpbmRvd1JlYWN0aXZlSW5qZWN0aW9uVG9rZW4sXG4gICAgKSgpO1xuXG4gICAgLy8gSG93IHRvIG9wZW4gYSB3aW5kb3cgbm90IG9wZW4gYWdhaW4sIGFza2VkIGZvciB3aGVuIGl0IGlzIHRvIGJlIG9wZW5lZC5cbiAgICBjb25zdCByZW9wZW5pbmdPZkNsb3NlZFdpbmRvdyA9IGRpLmluamVjdChcbiAgICAgIHJlb3BlbmluZ09mQ2xvc2VkV2luZG93SW5qZWN0YWJsZSxcbiAgICApKCk7XG5cbiAgICAvLyBUaGUgd2luZG93IG9mIGEgbGF5b3V0IGVhY2ggd2luZG93IG9wZW5lZCBhZ2FpbiBzdGFuZHMgZm9yLCBieSBrZXk7IHVuZGVmaW5lZCB1bnRpbCByZWFkLlxuICAgIGNvbnN0IGxpbmVhZ2UgPSBvYnNlcnZhYmxlLmJveDxPYnNlcnZhYmxlTWFwPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZD4oXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7IGRlZXA6IGZhbHNlIH0sXG4gICAgKTtcblxuICAgIHZvaWQgZGlcbiAgICAgIC5pbmplY3Qod2luZG93TGluZWFnZUJ1bmNoLnBlcnNpc3RhYmxlKSgpXG4gICAgICAudGhlbigoa2VwdCkgPT4gcnVuSW5BY3Rpb24oKCkgPT4gbGluZWFnZS5zZXQoa2VwdCkpKTtcblxuICAgIC8vIFRoZSB3aW5kb3cgZWFjaCB3aW5kb3cgb3BlbmVkIGFnYWluIGNvbnRpbnVlcywgYnkga2V5LCB3aGljaGV2ZXIgbGF5b3V0IG9wZW5lZCBpdCBhZ2Fpbi5cbiAgICBjb25zdCBjb250aW51ZXMgPSBvYnNlcnZhYmxlLmJveDxPYnNlcnZhYmxlTWFwPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZD4oXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7IGRlZXA6IGZhbHNlIH0sXG4gICAgKTtcblxuICAgIHZvaWQgZGlcbiAgICAgIC5pbmplY3Qod2luZG93Q29udGludWVzQnVuY2gucGVyc2lzdGFibGUpKClcbiAgICAgIC50aGVuKChrZXB0KSA9PiBydW5JbkFjdGlvbigoKSA9PiBjb250aW51ZXMuc2V0KGtlcHQpKSk7XG5cbiAgICAvLyBUaGUgd2luZG93cyBhIHdpbmRvdyBjb250aW51ZXMsIG5lYXJlc3QgZmlyc3Q7IHRoZW4gdGhlIHdpbmRvd3MgYW55IGxheW91dCBmb3VuZCBvciBvcGVuZWQgaXRcbiAgICAvLyBhZ2FpbiBhcywgd2hpY2ggdGVsbCB0aGUgc2FtZSBvZiBhIHdpbmRvdyBvcGVuZWQgYWdhaW4gYmVmb3JlIHRoaXMgd2FzIGtlcHQuXG4gICAgY29uc3QgcHJlZGVjZXNzb3JzT2ZLZXkgPSAoa2V5OiBzdHJpbmcpID0+XG4gICAgICBjb250aW51ZWRXaW5kb3dzT2YoXG4gICAgICAgIGtleSxcbiAgICAgICAgY29udGludWVzLmdldCgpID8/IG5ldyBNYXAoKSxcbiAgICAgICAgbGluZWFnZS5nZXQoKSA/PyBuZXcgTWFwKCksXG4gICAgICApO1xuXG4gICAgLy8gVGhlIGNsdXN0ZXJzLCB0byBvcGVuIGEgd2luZG93IG9uIG9uZSBvZiB0aGVpciBsaXN0czsgdW5kZWZpbmVkIHVudGlsIExlbnMgaGFzIHRvbGQgdGhlbS5cbiAgICBjb25zdCBjbHVzdGVycyA9IG9ic2VydmFibGUuYm94PFxuICAgICAgSUNvbXB1dGVkVmFsdWU8Q2x1c3RlclJlY29yZFtdPiB8IHVuZGVmaW5lZFxuICAgID4odW5kZWZpbmVkLCB7IGRlZXA6IGZhbHNlIH0pO1xuXG4gICAgdm9pZCBkaVxuICAgICAgLmluamVjdChhbGxDbHVzdGVyUmVjb3Jkc1JlYWN0aXZlSW5qZWN0aW9uVG9rZW4pKClcbiAgICAgIC50aGVuKChyZWNvcmRzKSA9PiBydW5JbkFjdGlvbigoKSA9PiBjbHVzdGVycy5zZXQocmVjb3JkcykpKTtcbiAgICBjb25zdCBsYXlvdXRzID0gZGkuaW5qZWN0KHdpbmRvd0xheW91dExpc3RJbmplY3RhYmxlKSgpO1xuICAgIGNvbnN0IHNhdmVXaW5kb3dMYXlvdXQgPSBkaS5pbmplY3Qoc2F2ZVdpbmRvd0xheW91dEluamVjdGFibGUpKCk7XG4gICAgY29uc3QgcmVjYWxsV2luZG93TGF5b3V0ID0gZGkuaW5qZWN0KHJlY2FsbFdpbmRvd0xheW91dEluamVjdGFibGUpKCk7XG4gICAgY29uc3QgZGVsZXRlV2luZG93TGF5b3V0ID0gZGkuaW5qZWN0KGRlbGV0ZVdpbmRvd0xheW91dEluamVjdGFibGUpKCk7XG4gICAgY29uc3QgbGF5b3V0SW5Ib3RiYXIgPSBkaS5pbmplY3QobGF5b3V0SW5Ib3RiYXJJbmplY3RhYmxlKSgpO1xuICAgIGNvbnN0IHRpbGVXaW5kb3dzID0gZGkuaW5qZWN0KHRpbGVXaW5kb3dzSW5qZWN0YWJsZSkoKTtcbiAgICBjb25zdCB0aWxpbmdQbGFuID0gZGkuaW5qZWN0KHRpbGluZ1BsYW5JbmplY3RhYmxlKSgpO1xuICAgIGNvbnN0IGxheW91dFRpbGluZyA9IGRpLmluamVjdChsYXlvdXRUaWxpbmdJbmplY3RhYmxlKSgpO1xuICAgIGNvbnN0IHJlbmFtZVdpbmRvd0xheW91dCA9IGRpLmluamVjdChyZW5hbWVXaW5kb3dMYXlvdXRJbmplY3RhYmxlKSgpO1xuICAgIGNvbnN0IGR1cGxpY2F0ZVdpbmRvd0xheW91dCA9IGRpLmluamVjdChkdXBsaWNhdGVXaW5kb3dMYXlvdXRJbmplY3RhYmxlKSgpO1xuXG4gICAgY29uc3Qgc3RhdHVzID0gb2JzZXJ2YWJsZS5ib3g8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAgIC8vIFRoZSBuYW1lIG9mIHRoZSBsYXlvdXQgYmVpbmcgcmVuYW1lZCwgYW5kIHRoZSBuYW1lIGl0IGlzIGdldHRpbmcuXG4gICAgY29uc3QgcmVuYW1pbmcgPSBvYnNlcnZhYmxlLmJveDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gICAgY29uc3QgcmVuYW1lRHJhZnQgPSBvYnNlcnZhYmxlLmJveChcIlwiKTtcbiAgICAvLyBUaGUgbGF5b3V0IHdob3NlIHRpbGluZyBzZXR1cCB0aGUgZWRpdG9yIHNob3dzLCBhbmQgd2hldGhlciB0aGUgc2V0dXAgd2FzIGNoYW5nZWQgc2luY2UuXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBvYnNlcnZhYmxlLmJveDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gICAgY29uc3QgdGlsaW5nQ2hhbmdlZCA9IG9ic2VydmFibGUuYm94KGZhbHNlKTtcbiAgICAvLyBXaGVyZSB3aW5kb3dzIHNldHRsZWQgd2hlbiB0aWxlZCwgYnkgd2hlcmUgdGhleSB3ZXJlIHBsYW5uZWQgdG8gZ286IGEgd2luZG93IHRvbyBsYXJnZSBmb3JcbiAgICAvLyBpdHMgY2VsbCwgYXMgb25lIHRoYXQgY2Fubm90IGJlIG1hZGUgc28gc21hbGwsIHNldHRsZXMgb3RoZXJ3aXNlLCBhbmQgaXMgaW4gcGxhY2UgdGhlcmUuXG4gICAgY29uc3Qgc2V0dGxlZCA9IG9ic2VydmFibGUubWFwPHN0cmluZywgV2luZG93Qm91bmRzPih7fSwgeyBkZWVwOiBmYWxzZSB9KTtcblxuICAgIC8vIFRha2VzIGV2ZXJ5IHRpbGVkIHdpbmRvdyB3aGVyZSBpdCBpcyBub3cgYXMgd2hlcmUgaXRzIHRpbGUgaGFzIGl0LCBhcyB3aGVuIGl0IHNldHRsZWQgdGhlcmUuXG4gICAgY29uc3QgYWNjZXB0V2hlcmVXaW5kb3dzQXJlID0gKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCB7IHdpbmRvdywgc2NyZWVuIH0gb2YgdGlsZWRXaW5kb3dzT2YoXG4gICAgICAgIHRpbGluZ1BsYW4ucmVzb2x2ZWQuZ2V0KCksXG4gICAgICApKSB7XG4gICAgICAgIHNldHRsZWQuc2V0KHBsYWNlbWVudE9mKHdpbmRvdywgc2NyZWVuKSwge1xuICAgICAgICAgIC4uLndpbmRvdy5yZWNvcmQuYm91bmRzLmdldCgpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gV2hhdCB3YXMganVzdCBzYXZlZCwgc2hvd24gYmVzaWRlIFNhdmUgZm9yIGEgbW9tZW50OiBhIG5vdGlmaWNhdGlvbiBvZiBMZW5zIHdvdWxkIHNob3cgdW5kZXJcbiAgICAvLyB0aGUgZGFya2VuZWQgYmFja2Ryb3Agb2YgdGhlIGRpYWxvZywgb3V0IG9mIHNpZ2h0LlxuICAgIGNvbnN0IHNhdmVkTm90ZSA9IG9ic2VydmFibGUuYm94PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgICBsZXQgaGlkZVNhdmVkTm90ZTogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBzaG93U2F2ZWQgPSBhY3Rpb24oKG5vdGU6IHN0cmluZykgPT4ge1xuICAgICAgc2F2ZWROb3RlLnNldChub3RlKTtcbiAgICAgIGNhbmNlbChoaWRlU2F2ZWROb3RlKTtcbiAgICAgIGhpZGVTYXZlZE5vdGUgPSBsYXRlcihcbiAgICAgICAgKCkgPT4gcnVuSW5BY3Rpb24oKCkgPT4gc2F2ZWROb3RlLnNldCh1bmRlZmluZWQpKSxcbiAgICAgICAgNDAwMCxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyBTZWxlY3RzIHRoZSBsYXlvdXQ6IHRoZSBlZGl0b3Igc2hvd3MgaXRzIHRpbGluZywgYW5kIGl0cyByb3cgaXRzIGJ1dHRvbnMuXG4gICAgbGV0IG5leHRQbGFjZVdpbmRvdyA9IDA7XG4gICAgLy8gV2hldGhlciB0aGUgd2luZG93cyBvZiBhIGxheW91dCBiZWluZyByZWNhbGxlZCBhcmUgYmVpbmcgb3BlbmVkIGFnYWluLlxuICAgIGNvbnN0IHJlb3BlbmluZyA9IG9ic2VydmFibGUuYm94KGZhbHNlKTtcbiAgICAvLyBUaGUgd2luZG93cyBhIHJlY2FsbCBvcGVuZWQgYWdhaW4gd2l0aCBubyB0aWxlIG9mIHRoZWlyIG93biB0byBnbyB0bywgYnkgdGhlaXIgb3duIGtleXM6IG91dFxuICAgIC8vIG9mIHRoZSBwbGFuIHVudGlsIHRoZSByZWNhbGwgcGxhY2VzIHRoZW0sIHNvIHRoYXQgbm9uZSBtYWtlcyByb29tIGZvciBpdHNlbGYgbWVhbndoaWxlLlxuICAgIGNvbnN0IHJlY2FsbGVkID0gb2JzZXJ2YWJsZS5zZXQ8c3RyaW5nPihbXSwgeyBkZWVwOiBmYWxzZSB9KTtcbiAgICAvLyBXaGF0IHRoZSBjbHVzdGVycyBvZiB0aGUgbWVudSBvcGVuaW5nIGEgd2luZG93IGluIGEgY2VsbCBhcmUgbmFycm93ZWQgdG8uXG4gICAgY29uc3QgY2x1c3RlclNlYXJjaCA9IG9ic2VydmFibGUuYm94KFwiXCIpO1xuICAgIGNvbnN0IHBhZ2VTZWFyY2ggPSBvYnNlcnZhYmxlLmJveChcIlwiKTtcbiAgICAvLyBUaGUgdGlsZXMgd2hvc2Ugd2luZG93cyBhcmUgYmVpbmcgb3BlbmVkLCBieSBrZXk6IGFnYWluLCBmcm9tIHRoZSB0aWxlIG9yIGJ5IGEgcmVjYWxsLCBvciBpbiBhXG4gICAgLy8gY2VsbCwgdW50aWwgTGVucyBhbnN3ZXJzLlxuICAgIGNvbnN0IG9wZW5pbmcgPSBvYnNlcnZhYmxlLnNldDxzdHJpbmc+KFtdLCB7IGRlZXA6IGZhbHNlIH0pO1xuICAgIC8vIFRoZSB3aW5kb3dzIGJlaW5nIGNsb3NlZCwgYnkgdGhlaXIgb3duIGtleXM6IG91dCBvZiB0aGUgcGxhbiB3aGlsZSBMZW5zIGxpc3RzIHRoZW0gc3RpbGwuXG4gICAgY29uc3QgY2xvc2luZyA9IG9ic2VydmFibGUuc2V0PHN0cmluZz4oW10sIHsgZGVlcDogZmFsc2UgfSk7XG5cbiAgICAvLyBPbmNlIExlbnMgaGFzIGFuc3dlcmVkIHdpdGggdGhlIHdpbmRvdyBvcGVuZWQgYWdhaW4gZnJvbSBhIHRpbGUsIHRoZSB0aWxlIGlzIHRoYXQgd2luZG93J3M6XG4gICAgLy8gaXQgZ29lcyBieSB0aGUgd2luZG93J3Mgb3duIGtleSwgdGhlIHdpbmRvdyBjb250aW51ZXMgdGhlIG9uZSBpdCB3YXMgb3BlbmVkIGFnYWluIGZyb20sIGFuZFxuICAgIC8vIGlzIHRoZSBsYXlvdXQncyB3aW5kb3cgdGhlIHRpbGUgc3Rvb2QgZm9yLCBmb3IgZ29vZC5cbiAgICBjb25zdCB0aWxlUmVvcGVuZWQgPSBhY3Rpb24oXG4gICAgICAoXG4gICAgICAgIGtleTogc3RyaW5nLFxuICAgICAgICB3aW5kb3c6IFdpbmRvd0lkLFxuICAgICAgICB7IHN0YW5kc0ZvciwgcHJldmlvdXMgfTogeyBzdGFuZHNGb3I6IHN0cmluZzsgcHJldmlvdXM6IHN0cmluZyB9LFxuICAgICAgKSA9PiB7XG4gICAgICAgIGNvbnN0IG93biA9IGtleU9mV2luZG93KHdpbmRvdyk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzICE9PSBvd24pIHtcbiAgICAgICAgICBjb250aW51ZXMuZ2V0KCk/LnNldChvd24sIHByZXZpb3VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpbmVhZ2UuZ2V0KCk/LnNldChsaW5lYWdlS2V5KHNlbGVjdGVkLmdldCgpID8/IFwiXCIsIG93biksIHN0YW5kc0Zvcik7XG4gICAgICAgIHRpbGluZ1BsYW4ucmVrZXkoa2V5LCB3aW5kb3cpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gVGhlIG9wZW4gd2luZG93cyBvZiBhIGxheW91dCwgYnkgdGhlIHdpbmRvd3MgaXQgc2F2ZWQ6IHRoZSB3aW5kb3cgaXRzZWxmLCBvciBvbmUgb3BlbmVkIGFnYWluIGFzXG4gICAgLy8gaXQuIEZvdW5kIGJ5IGxpbmVhZ2UgYWxvbmUsIGFzIGZvciB0aGUgbGF5b3V0IHNob3duLlxuICAgIGNvbnN0IG9wZW5XaW5kb3dzT2YgPSAobGF5b3V0OiBTYXZlZFdpbmRvd0xheW91dCkgPT5cbiAgICAgIG1hdGNoT3BlbldpbmRvd3MoXG4gICAgICAgIGxheW91dC53aW5kb3dzLFxuICAgICAgICB3aW5kb3dzLmdldCgpLm1hcCgocmVjb3JkKSA9PiAoe1xuICAgICAgICAgIHJlY29yZCxcbiAgICAgICAgICByZW9wZW5pbmc6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzdGFuZHNGb3I6IGxpbmVhZ2VcbiAgICAgICAgICAgIC5nZXQoKVxuICAgICAgICAgICAgPy5nZXQobGluZWFnZUtleShsYXlvdXQubmFtZSwga2V5T2ZXaW5kb3cocmVjb3JkLndpbmRvdykpKSxcbiAgICAgICAgICBjb250aW51ZXM6IHByZWRlY2Vzc29yc09mS2V5KGtleU9mV2luZG93KHJlY29yZC53aW5kb3cpKSxcbiAgICAgICAgfSkpLFxuICAgICAgKTtcblxuICAgIC8vIFdoYXQgdGhlIHNlbGVjdGVkIGxheW91dCBzYXZlZCBvZiBlYWNoIG9wZW4gd2luZG93OiB0aGUgd2luZG93IGl0c2VsZiwgb3IgZmFpbGluZyB0aGF0IHRoZVxuICAgIC8vIHdpbmRvdyBzaG93aW5nIHdoYXQgdGhlIHNhdmVkIG9uZSBkaWQsIGFzIG9uZSBvcGVuZWQgYWdhaW4gdW5kZXIgYW5vdGhlciBpZDsgZWFjaCBzYXZlZFxuICAgIC8vIHdpbmRvdyB0byBvbmUgb3BlbiB3aW5kb3cgb25seS5cbiAgICBjb25zdCBzYXZlZFdpbmRvd3NPZiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGNvbnN0IGxheW91dCA9IG1vZGVsLnNlbGVjdGVkTGF5b3V0LmdldCgpO1xuXG4gICAgICBpZiAoIWxheW91dCkge1xuICAgICAgICByZXR1cm4gbmV3IE1hcDxXaW5kb3dSZWNvcmQsIFNhdmVkV2luZG93PigpO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3VuZCBieSBsaW5lYWdlIGFsb25lOiB3aGF0IGFuIG9wZW4gd2luZG93IGRvZXMgaXMgYXNrZWQgb2YgTGVucyBvbmx5IHdoZW4gYSBsYXlvdXQgaXNcbiAgICAgIC8vIHNob3duIG9yIHJlY2FsbGVkLCB3aGljaCBrZWVwcyB3aGF0IGl0IGZvdW5kIGFzIGxpbmVhZ2UgdG9vLlxuICAgICAgcmV0dXJuIG5ldyBNYXAoXG4gICAgICAgIFsuLi5vcGVuV2luZG93c09mKGxheW91dCldLm1hcChcbiAgICAgICAgICAoW3NhdmVkLCByZWNvcmRdKSA9PiBbcmVjb3JkLCBzYXZlZF0gYXMgY29uc3QsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8gV2hldGhlciB0aGUgd2luZG93J3MgdGlsZSBpcyB3aGVyZSB0aGUgbGF5b3V0J3MgdGlsaW5nIGhhcyB0aGUgbGF5b3V0J3Mgd2luZG93IG9mIHRoYXQgcGxhY2U6XG4gICAgLy8gb24gdGhlIHNhbWUgc2NyZWVuLCBpbiB0aGUgc2FtZSBjZWxscywgb3Igbm90IHRpbGVkIGFzIHRoZW4uXG4gICAgY29uc3QgaXNUaWxlZEFzU2F2ZWQgPSAoXG4gICAgICB3aW5kb3c6IFBsYW5uZWRXaW5kb3csXG4gICAgICBsYXlvdXQ6IFNhdmVkV2luZG93TGF5b3V0LFxuICAgICAgaW5kZXg6IG51bWJlcixcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHNhdmVkID0gbGF5b3V0LnRpbGluZz8ud2luZG93cy5maW5kKChpdCkgPT4gaXQuaW5kZXggPT09IGluZGV4KTtcbiAgICAgIGNvbnN0IHNjcmVlbiA9IHRpbGluZ1BsYW4ucmVzb2x2ZWRcbiAgICAgICAgLmdldCgpXG4gICAgICAgIC5zY3JlZW5zLmZpbmQoKGl0KSA9PlxuICAgICAgICAgIGl0LndpbmRvd3Muc29tZSgocGxhbm5lZCkgPT4gcGxhbm5lZC5rZXkgPT09IHdpbmRvdy5rZXkpLFxuICAgICAgICApO1xuICAgICAgY29uc3QgcGxhY2VkID0gc2NyZWVuPy53aW5kb3dzLmZpbmQoKGl0KSA9PiBpdC5rZXkgPT09IHdpbmRvdy5rZXkpO1xuXG4gICAgICBpZiAoIXNhdmVkIHx8IHNhdmVkLmRpc3BsYXlJZCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gIXNjcmVlbjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzY3JlZW4gfHwgIXBsYWNlZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIEEgc2NyZWVuIGNvbm5lY3RlZCBhZ2FpbiB1bmRlciBhbm90aGVyIGlkIGlzIHRoZSBvbmUgc2F2ZWQgc3RpbGwuXG4gICAgICBjb25zdCBzYXZlZFNjcmVlbiA9IGxheW91dC50aWxpbmc/LnNjcmVlbnM/LltTdHJpbmcoc2F2ZWQuZGlzcGxheUlkKV07XG4gICAgICBjb25zdCBkaXNwbGF5SWQgPVxuICAgICAgICAoc2F2ZWRTY3JlZW4gJiZcbiAgICAgICAgICByZWNvbm5lY3RlZElkT2YoXG4gICAgICAgICAgICBTdHJpbmcoc2F2ZWQuZGlzcGxheUlkKSxcbiAgICAgICAgICAgIHNhdmVkU2NyZWVuLFxuICAgICAgICAgICAgZGlzcGxheXMuZ2V0KCksXG4gICAgICAgICAgKSkgPz9cbiAgICAgICAgc2F2ZWQuZGlzcGxheUlkO1xuXG4gICAgICByZXR1cm4gKFxuICAgICAgICBzY3JlZW4uZGlzcGxheS5pZCA9PT0gZGlzcGxheUlkICYmXG4gICAgICAgIChzYXZlZC5jb2x1bW4gPT09IHVuZGVmaW5lZCB8fCBwbGFjZWQuY29sdW1uID09PSBzYXZlZC5jb2x1bW4pICYmXG4gICAgICAgIChzYXZlZC5yb3cgPT09IHVuZGVmaW5lZCB8fCBwbGFjZWQucm93ID09PSBzYXZlZC5yb3cpICYmXG4gICAgICAgIHBsYWNlZC5jb2x1bW5zID09PSBzYXZlZC5jb2x1bW5zICYmXG4gICAgICAgIHBsYWNlZC5yb3dzID09PSBzYXZlZC5yb3dzXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvLyBXaGVyZSB0aGUgc2VsZWN0ZWQgbGF5b3V0J3MgdGlsaW5nIHB1dHMgZWFjaCB3aW5kb3cgaXQgdGlsZXMgb24gYSBzY3JlZW4gY29ubmVjdGVkIG5vdy5cbiAgICBjb25zdCBzZWxlY3RlZFRpbGVCb3VuZHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBjb25zdCBsYXlvdXQgPSBtb2RlbC5zZWxlY3RlZExheW91dC5nZXQoKTtcblxuICAgICAgcmV0dXJuIGxheW91dCA/IHRpbGVCb3VuZHNPZihsYXlvdXQsIGRpc3BsYXlzLmdldCgpKSA6IG5ldyBNYXAoKTtcbiAgICB9KTtcblxuICAgIC8vIFdoZXRoZXIgdGhlIG9wZW4gd2luZG93IGRpZmZlcnMgZnJvbSB3aGF0IHRoZSBzZWxlY3RlZCBsYXlvdXQgc2F2ZWQgb2YgaXQsIG9yIGlzIG5vdCBpbiBpdC5cbiAgICBjb25zdCBpc1Vuc2F2ZWQgPSAocmVjb3JkOiBXaW5kb3dSZWNvcmQpID0+IHtcbiAgICAgIGNvbnN0IHNhdmVkID0gc2F2ZWRXaW5kb3dzT2YuZ2V0KCkuZ2V0KHJlY29yZCk7XG4gICAgICBjb25zdCBsYXlvdXQgPSBtb2RlbC5zZWxlY3RlZExheW91dC5nZXQoKTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgIXNhdmVkIHx8XG4gICAgICAgICFpc1Nob3duQXNTYXZlZChcbiAgICAgICAgICByZWNvcmQsXG4gICAgICAgICAgc2F2ZWQsXG4gICAgICAgICAgbGF5b3V0ICYmIHNlbGVjdGVkVGlsZUJvdW5kcy5nZXQoKS5nZXQobGF5b3V0LndpbmRvd3MuaW5kZXhPZihzYXZlZCkpLFxuICAgICAgICApXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvLyBXaGVyZSBhbmQgYXMgdGhlIGxheW91dCBzYXZlZCBpdDogYSB3aW5kb3cgaXQgdGlsZXMsIG9uIGEgc2NyZWVuIGNvbm5lY3RlZCBub3csIGluIGl0cyB0aWxlLFxuICAgIC8vIHNob3duIG5vcm1hbGx5IG9yIGZpbGxpbmcganVzdCBpdHMgdGlsZSwgYXMgUmVjYWxsIGFuZCBUaWxlIHB1dCBpdCwgdW5sZXNzIHNhdmVkIG1pbmltaXplZDtcbiAgICAvLyBhbnkgb3RoZXIgaW4gdGhlIHNhbWUgc3RhdGUgYW5kIHBsYWNlLCBvciBvbmUgbm9ybWFsIGFuZCB0aGUgb3RoZXIgbWF4aW1pemVkIHdoZXJlIHRoZVxuICAgIC8vIHdpbmRvdyBmaWxscyBqdXN0IHdoZXJlIHRoZSBzYXZlZCBvbmUgd2FzLCBhcyBhIHdpbmRvdyB0aWxlZCBhbG9uZSBvbiBhIHNjcmVlbiBmaWxscyBpdHMgd29ya1xuICAgIC8vIGFyZWEgYW5kIGlzIHRvbGQgbWF4aW1pemVkIGZvciBpdC5cbiAgICBjb25zdCBpc1Nob3duQXNTYXZlZCA9IChcbiAgICAgIHJlY29yZDogV2luZG93UmVjb3JkLFxuICAgICAgc2F2ZWQ6IFNhdmVkV2luZG93LFxuICAgICAgaW5UaWxlPzogV2luZG93Qm91bmRzLFxuICAgICkgPT4ge1xuICAgICAgY29uc3Qgc3RhdGUgPSByZWNvcmQuc3RhdGUuZ2V0KCk7XG5cbiAgICAgIGlmIChpblRpbGUgJiYgc2F2ZWQuc3RhdGUgIT09IFwibWluaW1pemVkXCIpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAoc3RhdGUgPT09IFwibm9ybWFsXCIgJiZcbiAgICAgICAgICAgIGlzTmVhcihyZWNvcmQubm9ybWFsQm91bmRzLmdldCgpLCBpblRpbGUsIDIpKSB8fFxuICAgICAgICAgIChzdGF0ZSA9PT0gXCJtYXhpbWl6ZWRcIiAmJiBpc05lYXIocmVjb3JkLmJvdW5kcy5nZXQoKSwgaW5UaWxlLCAyKSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBzYXZlZC5zdGF0ZSkge1xuICAgICAgICByZXR1cm4gaXNOZWFyKHJlY29yZC5ub3JtYWxCb3VuZHMuZ2V0KCksIHNhdmVkLm5vcm1hbEJvdW5kcywgMik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVpdGhlciA9IG5ldyBTZXQoW3N0YXRlLCBzYXZlZC5zdGF0ZV0pO1xuXG4gICAgICByZXR1cm4gKFxuICAgICAgICBlaXRoZXIuaGFzKFwibm9ybWFsXCIpICYmXG4gICAgICAgIGVpdGhlci5oYXMoXCJtYXhpbWl6ZWRcIikgJiZcbiAgICAgICAgaXNOZWFyKHJlY29yZC5ib3VuZHMuZ2V0KCksIHNhdmVkLm5vcm1hbEJvdW5kcywgMilcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIEEgd2luZG93IGJlaW5nIGNsb3NlZCBoYXMgbm8gcGxhY2UgaW4gdGhlIHBsYW4gd2hpbGUgTGVucyBsaXN0cyBpdCBzdGlsbCwgbm9yIG9uZSBhIHJlY2FsbFxuICAgIC8vIG9wZW5lZCBhZ2FpbiB3aXRoIG5vIHRpbGUgdG8gZ28gdG8sIHVudGlsIHRoZSByZWNhbGwgaGFzIHBsYWNlZCBpdC4gQW55IG90aGVyIHdpbmRvdyBoYXNcbiAgICAvLyBpdHMgcGxhY2UgYXQgb25jZTogTGVucyBhbnN3ZXJzIHdoaWNoIHdpbmRvdyBpdCBvcGVuZWQgYXMgc29vbiBhcyBpdCBsaXN0cyBpdC5cbiAgICB0aWxpbmdQbGFuLmZvbGxvd0FsaWFzZXMoXG4gICAgICBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsaWFzZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gICAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHdpbmRvd3MuZ2V0KCkpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBrZXlPZldpbmRvdyhyZWNvcmQud2luZG93KTtcblxuICAgICAgICAgIGlmIChjbG9zaW5nLmhhcyhrZXkpIHx8IHJlY2FsbGVkLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBhbGlhc2VzLnNldChrZXksIGxlZnRPdXRPZlBsYW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhbGlhc2VzO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIFRoZSB3aW5kb3cgYmVpbmcgcmVuYW1lZCwgYnkga2V5LCBhbmQgdGhlIG5hbWUgaXQgaXMgZ2V0dGluZy5cbiAgICBjb25zdCByZW5hbWluZ1dpbmRvdyA9IG9ic2VydmFibGUuYm94PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgICBjb25zdCB3aW5kb3dOYW1lRHJhZnQgPSBvYnNlcnZhYmxlLmJveChcIlwiKTtcblxuICAgIC8vIFRoZSB3aW5kb3cgYXMgTGVucyBsaXN0cyBpdCBhbW9uZyBpdHMgc3ViLXdpbmRvd3MsIGJ5IGl0cyBrZXksIG9yIGJ5IGl0cyB0aXRsZSB3aGVyZSBvbmx5IG9uZVxuICAgIC8vIHdpbmRvdyBoYXMgaXQ6IHRoZSBsaXN0ZWQgaWQgaXMgTGVucydzIG93bi5cbiAgICBjb25zdCBsaXN0ZWRTdWJXaW5kb3dPZiA9IChcbiAgICAgIHdpbmRvdzogUGxhbm5lZFdpbmRvdyxcbiAgICAgIGxpc3RlZDogcmVhZG9ubHkgTGlzdGVkU3ViV2luZG93W10sXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCB0aXRsZSA9IHdpbmRvdy5yZWNvcmQudGl0bGUuZ2V0KCk7XG4gICAgICBjb25zdCBieVRpdGxlID0gbGlzdGVkLmZpbHRlcigoaXQpID0+IGl0LnRpdGxlID09PSB0aXRsZSk7XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGxpc3RlZC5maW5kKChpdCkgPT4gaXQuaWQgPT09IHdpbmRvdy5rZXkpID8/XG4gICAgICAgIChieVRpdGxlLmxlbmd0aCA9PT0gMSA/IGJ5VGl0bGVbMF0gOiB1bmRlZmluZWQpXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvLyBIb3cgdG8gb3BlbiB0aGUgd2luZG93IG5vdCBvcGVuIGFnYWluOiBhcyB0aGUgbGF5b3V0IGtlcHQgaXQsIGZvciBhIHdpbmRvdyBvZiB0aGUgbGF5b3V0J3NcbiAgICAvLyBtaXNzaW5nIGZyb20gdGhlIHN0YXJ0LCBvciBhcyBMZW5zIGRlc2NyaWJlZCBpdCBhcyBpdCBjbG9zZWQuXG4gICAgY29uc3QgcmVvcGVuaW5nT2YgPSBhc3luYyAoXG4gICAgICB3aW5kb3c6IFBsYW5uZWRXaW5kb3csXG4gICAgKTogUHJvbWlzZTxXaW5kb3dSZW9wZW5pbmcgfCB1bmRlZmluZWQ+ID0+IHtcbiAgICAgIGNvbnN0IG9mTGF5b3V0ID0gc2F2ZWRXaW5kb3dPZih3aW5kb3cpO1xuXG4gICAgICByZXR1cm4gb2ZMYXlvdXRcbiAgICAgICAgPyAob2ZMYXlvdXQucmVvcGVuaW5nID8/IHVuZGVmaW5lZClcbiAgICAgICAgOiByZW9wZW5pbmdPZkNsb3NlZFdpbmRvdyh3aW5kb3cpO1xuICAgIH07XG5cbiAgICAvLyBXaGVyZSBhbmQgYXMgdGhlIGxheW91dCBzYXZlZCB0aGUgd2luZG93LlxuICAgIGNvbnN0IHNhdmVkUGxhY2VtZW50T2YgPSAoXG4gICAgICBzYXZlZDogU2F2ZWRXaW5kb3csXG4gICAgKTogV2luZG93UmVvcGVuaW5nUGxhY2VtZW50ID0+ICh7XG4gICAgICBib3VuZHM6IHNhdmVkLm5vcm1hbEJvdW5kcyxcbiAgICAgIHN0YXRlOiBzYXZlZC5zdGF0ZSxcbiAgICAgIC4uLihzYXZlZC5kaXNwbGF5SWQgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBkaXNwbGF5SWQ6IHNhdmVkLmRpc3BsYXlJZCB9KSxcbiAgICB9KTtcblxuICAgIC8vIFdoZXJlIGEgd2luZG93IG5vdCBvcGVuIGlzIGNyZWF0ZWQgd2hlbiBvcGVuZWQgYWdhaW4gZnJvbSBpdHMgdGlsZSwgc28gdGhhdCBpdCBzaG93cyB0aGVyZVxuICAgIC8vIGZyb20gaXRzIGZpcnN0IGZyYW1lIG9uOiBvdmVyIGl0cyB0aWxlIG9uIGEgc2NyZWVuIGNvbm5lY3RlZCwgd2hpY2ggaXMgYXMgc2F2ZWQgd2hlbiBpdHMgdGlsZVxuICAgIC8vIGlzIHdoZXJlIHRoZSBsYXlvdXQgdGlsZWQgaXQsIG1pbmltaXplZCB0b28gd2hlbiB0aGUgbGF5b3V0IGhhcyBpdCBzbzsgb3IgZWxzZSB3aGVyZSBpdHNcbiAgICAvLyBsYXlvdXQgaGFzIGl0LlxuICAgIGNvbnN0IHJlb3BlbmluZ1BsYWNlbWVudE9mID0gKFxuICAgICAgd2luZG93OiBQbGFubmVkV2luZG93LFxuICAgICk6IFdpbmRvd1Jlb3BlbmluZ1BsYWNlbWVudCB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICBjb25zdCBsYXlvdXQgPSBtb2RlbC5zZWxlY3RlZExheW91dC5nZXQoKTtcbiAgICAgIGNvbnN0IHN0YW5kc0ZvciA9IHN0YW5kc0Zvck9mKHdpbmRvdyk7XG4gICAgICBjb25zdCBpbmRleCA9XG4gICAgICAgIGxheW91dD8ud2luZG93cy5maW5kSW5kZXgoXG4gICAgICAgICAgKGl0KSA9PiBrZXlPZldpbmRvdyhpdC53aW5kb3cpID09PSBzdGFuZHNGb3IsXG4gICAgICAgICkgPz8gLTE7XG5cbiAgICAgIC8vIE1pbmltaXplZCwgd2hlbiB0aGUgbGF5b3V0IGhhcyBpdCBzbyB3aGVyZSBpdHMgdGlsZSBpcy5cbiAgICAgIGNvbnN0IG1pbmltaXplZCA9XG4gICAgICAgICEhbGF5b3V0ICYmXG4gICAgICAgIGluZGV4ICE9PSAtMSAmJlxuICAgICAgICBpc1RpbGVkQXNTYXZlZCh3aW5kb3csIGxheW91dCwgaW5kZXgpICYmXG4gICAgICAgIGxheW91dC53aW5kb3dzW2luZGV4XS5zdGF0ZSA9PT0gXCJtaW5pbWl6ZWRcIjtcblxuICAgICAgY29uc3Qgc2NyZWVuID0gdGlsaW5nUGxhbi5yZXNvbHZlZFxuICAgICAgICAuZ2V0KClcbiAgICAgICAgLnNjcmVlbnMuZmluZChcbiAgICAgICAgICAoaXQpID0+XG4gICAgICAgICAgICAhaXQubWlzc2luZyAmJlxuICAgICAgICAgICAgaXQud2luZG93cy5zb21lKChwbGFubmVkKSA9PiBwbGFubmVkLmtleSA9PT0gd2luZG93LmtleSksXG4gICAgICAgICk7XG4gICAgICBjb25zdCBwbGFjZWQgPSBzY3JlZW4/LndpbmRvd3MuZmluZCgoaXQpID0+IGl0LmtleSA9PT0gd2luZG93LmtleSk7XG5cbiAgICAgIGlmIChzY3JlZW4gJiYgcGxhY2VkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYm91bmRzOiBib3VuZHNJbkdyaWQoXG4gICAgICAgICAgICBzY3JlZW4uZGlzcGxheS53b3JrQXJlYS5nZXQoKSxcbiAgICAgICAgICAgIHNjcmVlbi5jb2x1bW5zLFxuICAgICAgICAgICAgc2NyZWVuLnJvd3MsXG4gICAgICAgICAgICBwbGFjZWQsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBzdGF0ZTogbWluaW1pemVkID8gXCJtaW5pbWl6ZWRcIiA6IFwibm9ybWFsXCIsXG4gICAgICAgICAgZGlzcGxheUlkOiBzY3JlZW4uZGlzcGxheS5pZCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxheW91dCAmJiBpbmRleCAhPT0gLTEgJiYgaXNUaWxlZEFzU2F2ZWQod2luZG93LCBsYXlvdXQsIGluZGV4KSkge1xuICAgICAgICByZXR1cm4gc2F2ZWRQbGFjZW1lbnRPZihsYXlvdXQud2luZG93c1tpbmRleF0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzYXZlZCA9IHNhdmVkV2luZG93T2Yod2luZG93KTtcblxuICAgICAgcmV0dXJuIHNhdmVkID8gc2F2ZWRQbGFjZW1lbnRPZihzYXZlZCkgOiB1bmRlZmluZWQ7XG4gICAgfTtcblxuICAgIC8vIFRoZSBrZXkgb2YgdGhlIHNlbGVjdGVkIGxheW91dCdzIHdpbmRvdyBhIHdpbmRvdyBub3Qgb3BlbiBpczogaXRzIG93biwgd2hlbiB0aGUgbGF5b3V0IGhhcyBpdCxcbiAgICAvLyBvciB0aGUgb25lIGl0IHdhcyBvcGVuZWQgYWdhaW4gYXMgYmVmb3JlLlxuICAgIGNvbnN0IHN0YW5kc0Zvck9mID0gKHdpbmRvdzogUGxhbm5lZFdpbmRvdykgPT4ge1xuICAgICAgY29uc3Qgc2F2ZWQgPSBzYXZlZFdpbmRvd09mKHdpbmRvdyk7XG5cbiAgICAgIGlmIChzYXZlZCkge1xuICAgICAgICByZXR1cm4ga2V5T2ZXaW5kb3coc2F2ZWQud2luZG93KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGFzID0gKGtleTogc3RyaW5nKSA9PlxuICAgICAgICBtb2RlbC5zZWxlY3RlZExheW91dFxuICAgICAgICAgIC5nZXQoKVxuICAgICAgICAgID8ud2luZG93cy5zb21lKChpdCkgPT4ga2V5T2ZXaW5kb3coaXQud2luZG93KSA9PT0ga2V5KTtcblxuICAgICAgcmV0dXJuIGhhcyh3aW5kb3cua2V5KVxuICAgICAgICA/IHdpbmRvdy5rZXlcbiAgICAgICAgOiAobGluZWFnZS5nZXQoKT8uZ2V0KGxpbmVhZ2VLZXkoc2VsZWN0ZWQuZ2V0KCkgPz8gXCJcIiwgd2luZG93LmtleSkpID8/XG4gICAgICAgICAgICBwcmVkZWNlc3NvcnNPZktleSh3aW5kb3cua2V5KS5maW5kKGhhcykgPz9cbiAgICAgICAgICAgIHdpbmRvdy5rZXkpO1xuICAgIH07XG5cbiAgICAvLyBUaGUgbGF5b3V0J3Mgd2luZG93IGEgd2luZG93IG5vdCBvcGVuIHN0YW5kcyBmb3IsIHdoZW4gaXQgd2FzIG1pc3NpbmcgZnJvbSB0aGUgc3RhcnQuXG4gICAgY29uc3Qgc2F2ZWRXaW5kb3dPZiA9ICh3aW5kb3c6IFBsYW5uZWRXaW5kb3cpID0+XG4gICAgICB3aW5kb3cua2V5LnN0YXJ0c1dpdGgoXCJtaXNzaW5nOlwiKVxuICAgICAgICA/IHNhdmVkV2luZG93T2ZLZXkoXG4gICAgICAgICAgICBtb2RlbC5zZWxlY3RlZExheW91dC5nZXQoKT8ud2luZG93cyA/PyBbXSxcbiAgICAgICAgICAgIHdpbmRvdy5rZXksXG4gICAgICAgICAgKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgIC8vIE9wZW5zIHRoZSBwbGFjZSBpbiBhIHdpbmRvdyBvZiBpdHMgb3duIGluIHRoZSBjZWxsOiBpdHMgdGlsZSBpcyB0aGVyZSBmcm9tIHRoZSBzdGFydCwgc2hvd2luZ1xuICAgIC8vIGl0IGJlaW5nIG9wZW5lZCwgYW5kIHRoZSB3aW5kb3cgaXMgY3JlYXRlZCBvdmVyIHRoZSBjZWxsLCBuZXZlciBtb3ZlZCB0aGVyZSBvbmNlIHNob3duLiBUaGVcbiAgICAvLyB0aWxlIGlzIHRoZSB3aW5kb3cgYXMgc29vbiBhcyBMZW5zIGxpc3RzIGl0LCBieSB0aGUgd2luZG93J3Mgb3duIGtleSwgYmVmb3JlIGl0IHNob3dzLlxuICAgIGNvbnN0IG9wZW5QbGFjZUluQ2VsbCA9IGFzeW5jIChwbGFjZTogUGxhY2UsIGNlbGw6IENlbGwsIHRpdGxlOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGlkID0gYCR7RGF0ZS5ub3coKX0tJHtuZXh0UGxhY2VXaW5kb3crK31gO1xuICAgICAgY29uc3Qga2V5ID0gYCR7b3BlbmluZ1ByZWZpeH0ke2lkfWA7XG4gICAgICBjb25zdCBzY3JlZW4gPSB0aWxpbmdQbGFuLnJlc29sdmVkXG4gICAgICAgIC5nZXQoKVxuICAgICAgICAuc2NyZWVucy5maW5kKChpdCkgPT4gaXQuZGlzcGxheS5pZCA9PT0gY2VsbC5kaXNwbGF5SWQpO1xuXG4gICAgICBjb25zdCBib3VuZHMgPVxuICAgICAgICBzY3JlZW4gJiZcbiAgICAgICAgYm91bmRzSW5HcmlkKFxuICAgICAgICAgIHNjcmVlbi5kaXNwbGF5LndvcmtBcmVhLmdldCgpLFxuICAgICAgICAgIHNjcmVlbi5jb2x1bW5zLFxuICAgICAgICAgIHNjcmVlbi5yb3dzLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbHVtbjogY2VsbC5jb2x1bW4sXG4gICAgICAgICAgICByb3c6IGNlbGwucm93LFxuICAgICAgICAgICAgY29sdW1uczogMSxcbiAgICAgICAgICAgIHJvd3M6IDEsXG4gICAgICAgICAgfSBhcyBQbGFjZWRXaW5kb3csXG4gICAgICAgICk7XG5cbiAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgdGlsaW5nUGxhbi5wbGFjZU9wZW5pbmcoa2V5LCB0aXRsZSwgY2VsbCk7XG4gICAgICAgIHRpbGluZ0NoYW5nZWQuc2V0KHRydWUpO1xuICAgICAgICBvcGVuaW5nLmFkZChrZXkpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFRoZSB0aWxlJ3Mga2V5IHVudGlsIExlbnMgdGVsbHMgd2hpY2ggd2luZG93IGl0IGlzLCB0aGVuIHRoZSB3aW5kb3cncyBvd24uXG4gICAgICBsZXQgdGlsZSA9IGtleTtcblxuICAgICAgLy8gRmFpbGluZyB0ZWxscyB3aHksIG9uY2UgYXNrZWQgYmVsb3c6IHdoYXQgaXQgc2V0dGxlcyB0bywgbm90IGEgcmVqZWN0aW9uIGxlZnQgdW5oYW5kbGVkXG4gICAgICAvLyB3aGlsZSBMZW5zIGlzIGFza2VkIGZvciB0aGUgd2luZG93LlxuICAgICAgY29uc3QgZmFpbHVyZSA9IG9wZW5QbGFjZSh7XG4gICAgICAgIGlkLFxuICAgICAgICBwYXJhbXM6IHBsYWNlLFxuICAgICAgICAuLi4oYm91bmRzXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHBsYWNlbWVudDoge1xuICAgICAgICAgICAgICAgIGJvdW5kcyxcbiAgICAgICAgICAgICAgICBzdGF0ZTogXCJub3JtYWxcIixcbiAgICAgICAgICAgICAgICBkaXNwbGF5SWQ6IGNlbGwuZGlzcGxheUlkLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSkudGhlbihcbiAgICAgICAgKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgICAoZXJyb3I6IHVua25vd24pID0+ICh7IGVycm9yIH0pLFxuICAgICAgKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhlIHdpbmRvdyBMZW5zIHNob3dzIHRoZSBwbGFjZSBpbiwgbGlzdGVkIHVuZGVyIGFuIGlkIG9mIExlbnMncyBvd246IGFuc3dlcmVkIGFzIHNvb24gYXNcbiAgICAgICAgLy8gaXQgaXMgbGlzdGVkLCBiZWZvcmUgaXQgc2hvd3M7IG5vbmUgd2hlbiB0aGUgb3BlbmluZyBmYWlsZWQgYmVmb3JlIGNob29zaW5nIG9uZS5cbiAgICAgICAgY29uc3Qgc2hvd24gPSBhd2FpdCB3aW5kb3dSZWNvcmRPZih7XG4gICAgICAgICAga2luZDogZ2V0U3ViV2luZG93S2luZElkKHBsYWNlc1N1YldpbmRvd0tpbmQsIGRpLnNjb3BlSWRzKSxcbiAgICAgICAgICBpZCxcbiAgICAgICAgfSBhcyBXaW5kb3dJZCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcblxuICAgICAgICBpZiAoc2hvd24pIHtcbiAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICB0aWxpbmdQbGFuLnJla2V5KGtleSwgc2hvd24ud2luZG93KTtcbiAgICAgICAgICAgIG9wZW5pbmcuZGVsZXRlKGtleSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aWxlID0ga2V5T2ZXaW5kb3coc2hvd24ud2luZG93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZhaWxlZCA9IGF3YWl0IGZhaWx1cmU7XG5cbiAgICAgICAgLy8gVG9sZCB3aHkgaW4gdGhlIGRpYWxvZywgYXMgbm90aGluZyBlbHNlIHRlbGxzOiBhIHdpbmRvdyB0aGF0IG5ldmVyIHNob3dzLCBhcyBvbmUgb2YgYVxuICAgICAgICAvLyBjbHVzdGVyIExlbnMgY2Fubm90IGNvbm5lY3QgdG8sIGlzIG5vdCB0b2xkIG9mIG90aGVyd2lzZS4gVGhlIGNlbGwgaXMgbGVmdCBlbXB0eS5cbiAgICAgICAgaWYgKGZhaWxlZCkge1xuICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgIHRpbGluZ1BsYW4uZm9yZ2V0KHRpbGUpO1xuICAgICAgICAgICAgc3RhdHVzLnNldChcbiAgICAgICAgICAgICAgYENvdWxkIG5vdCBvcGVuIFwiJHt0aXRsZX1cIjogJHtmYWlsZWQuZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGZhaWxlZC5lcnJvci5tZXNzYWdlIDogU3RyaW5nKGZhaWxlZC5lcnJvcil9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXNob3duKSB7XG4gICAgICAgICAgLy8gT3BlbmVkLCBidXQgaW50byBubyB3aW5kb3cgTGVucyB0ZWxscyBvZiwgYXMgd2hpbGUgd2luZG93cyBtYXkgbm90IGJlIGFycmFuZ2VkLlxuICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHRpbGluZ1BsYW4uZm9yZ2V0KGtleSkpO1xuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBydW5JbkFjdGlvbigoKSA9PiBvcGVuaW5nLmRlbGV0ZShrZXkpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gVGlsZXMgdGhlIHdpbmRvd3MgYXMgdGhlIHBsYW4gaGFzIHRoZW0gb25jZSB0aGUgZWRpdHMgdG8gaXQgcGF1c2UsIGFzIGEgZmV3IGNsaWNrcyBpbiBhIHJvdy5cbiAgICBsZXQgdGlsZVRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHRpbGVTb29uID0gKCkgPT4ge1xuICAgICAgY2FuY2VsKHRpbGVUaW1lcik7XG4gICAgICB0aWxlVGltZXIgPSBsYXRlcigoKSA9PiB2b2lkIG1vZGVsLnRpbGUoKSwgMzAwKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgc2hvd1RpbGluZ09mID0gYWN0aW9uKChuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgIHNlbGVjdGVkLnNldChuYW1lKTtcbiAgICAgIHRpbGluZ0NoYW5nZWQuc2V0KGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIENoYW5nZXMgdGhlIGhvdGJhciwgdGVsbGluZyB3aGVuIGl0IGNvdWxkIG5vdCBiZTogdGhlIGxheW91dCBpcyByZW5hbWVkIG9yIGRlbGV0ZWQgYW55d2F5LlxuICAgIGNvbnN0IGZvbGxvd0luSG90YmFyID0gYXN5bmMgKGZvbGxvdzogKCkgPT4gUHJvbWlzZTx2b2lkPikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZm9sbG93KCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBydW5JbkFjdGlvbigoKSA9PlxuICAgICAgICAgIHN0YXR1cy5zZXQoXG4gICAgICAgICAgICBgQ291bGQgbm90IGNoYW5nZSB0aGUgaG90YmFyOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG1vZGVsID0ge1xuICAgICAgbGF5b3V0cyxcbiAgICAgIHN0YXR1cyxcblxuICAgICAgLy8gVGhlIHBsYWNlcyBpbiB0aGUgbGF5b3V0IG9mIGl0cyB3aW5kb3dzIG9wZW4gbm93IGJ1dCBub3Qgd2hlcmUgb3IgYXMgaXQgc2F2ZWQgdGhlbS5cbiAgICAgIG5vdFNhdmVkT2Y6IChsYXlvdXQ6IFNhdmVkV2luZG93TGF5b3V0KTogUmVhZG9ubHlTZXQ8bnVtYmVyPiA9PiB7XG4gICAgICAgIGNvbnN0IG9wZW4gPSBvcGVuV2luZG93c09mKGxheW91dCk7XG4gICAgICAgIGNvbnN0IGluVGlsZXMgPSB0aWxlQm91bmRzT2YobGF5b3V0LCBkaXNwbGF5cy5nZXQoKSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTZXQoXG4gICAgICAgICAgbGF5b3V0LndpbmRvd3MuZmxhdE1hcCgoc2F2ZWQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWNvcmQgPSBvcGVuLmdldChzYXZlZCk7XG5cbiAgICAgICAgICAgIHJldHVybiByZWNvcmQgJiYgIWlzU2hvd25Bc1NhdmVkKHJlY29yZCwgc2F2ZWQsIGluVGlsZXMuZ2V0KGluZGV4KSlcbiAgICAgICAgICAgICAgPyBbaW5kZXhdXG4gICAgICAgICAgICAgIDogW107XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9LFxuXG4gICAgICAvLyBUaGUgcGxhY2VzIGluIHRoZSBsYXlvdXQgb2YgaXRzIHdpbmRvd3Mgbm90IG9wZW4gbm93LlxuICAgICAgbm90T3Blbk9mOiAobGF5b3V0OiBTYXZlZFdpbmRvd0xheW91dCk6IFJlYWRvbmx5U2V0PG51bWJlcj4gPT4ge1xuICAgICAgICBjb25zdCBvcGVuID0gb3BlbldpbmRvd3NPZihsYXlvdXQpO1xuXG4gICAgICAgIHJldHVybiBuZXcgU2V0KFxuICAgICAgICAgIGxheW91dC53aW5kb3dzLmZsYXRNYXAoKHNhdmVkLCBpbmRleCkgPT5cbiAgICAgICAgICAgIG9wZW4uaGFzKHNhdmVkKSA/IFtdIDogW2luZGV4XSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfSxcblxuICAgICAgLy8gV2hldGhlciB0aGUgbGF5b3V0IGlzIHBpbm5lZCB0byB0aGUgaG90YmFyJ3MgY3VycmVudCBwYWdlLCBhbmQgcGlubmluZyBvciB1bnBpbm5pbmcgaXQuXG4gICAgICBpc1Bpbm5lZDogbGF5b3V0SW5Ib3RiYXIuaXNQaW5uZWQsXG4gICAgICB0b2dnbGVQaW5uZWQ6IChuYW1lOiBzdHJpbmcpID0+XG4gICAgICAgIGZvbGxvd0luSG90YmFyKCgpID0+IGxheW91dEluSG90YmFyLnRvZ2dsZShuYW1lKSksXG5cbiAgICAgIC8vIFdpdGhvdXQgTGVucyBTdHVkaW8gTGVucyBsaXN0cyBubyB3aW5kb3dzLCBhbmQgbm90aGluZyBjYW4gYmUgYXJyYW5nZWQuXG4gICAgICBjYW5BcnJhbmdlOiBjb21wdXRlZCgoKSA9PiB3aW5kb3dzLmdldCgpLmxlbmd0aCA+IDApLFxuXG4gICAgICAvLyBIb3cgbWFueSBzY3JlZW5zIHRoZSBsYXlvdXQncyB0aWxpbmcgaGFzIHdpbmRvd3Mgb24gdGhhdCBhcmUgbm90IGNvbm5lY3RlZCBub3cuXG4gICAgICBtaXNzaW5nU2NyZWVuc09mOiAobGF5b3V0OiBTYXZlZFdpbmRvd0xheW91dCkgPT5cbiAgICAgICAgbW9kZWwubWlzc2luZ1NjcmVlbklkc09mKGxheW91dCkuc2l6ZSxcblxuICAgICAgLy8gVGhlIGlkcyBvZiB0aGUgc2NyZWVucyB0aGUgbGF5b3V0J3MgdGlsaW5nIGhhcyB3aW5kb3dzIG9uIHRoYXQgYXJlIG5vdCBjb25uZWN0ZWQgbm93LlxuICAgICAgbWlzc2luZ1NjcmVlbklkc09mOiAobGF5b3V0OiBTYXZlZFdpbmRvd0xheW91dCk6IFJlYWRvbmx5U2V0PHN0cmluZz4gPT4ge1xuICAgICAgICBjb25zdCBjb25uZWN0ZWQgPSBuZXcgU2V0KGRpc3BsYXlzLmdldCgpLm1hcCgoZGlzcGxheSkgPT4gZGlzcGxheS5pZCkpO1xuICAgICAgICBjb25zdCB1c2VkID0gbmV3IFNldChcbiAgICAgICAgICBsYXlvdXQudGlsaW5nPy53aW5kb3dzLm1hcCgoaXQpID0+IGl0LmRpc3BsYXlJZCkgPz8gW10sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQSBzY3JlZW4gY29ubmVjdGVkIGFnYWluIHVuZGVyIGFub3RoZXIgaWQgaXMgbm90IG1pc3NpbmcuXG4gICAgICAgIHJldHVybiBuZXcgU2V0KFxuICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGxheW91dC50aWxpbmc/LnNjcmVlbnMgPz8ge30pXG4gICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAoW2lkLCBzY3JlZW5dKSA9PlxuICAgICAgICAgICAgICAgIHVzZWQuaGFzKE51bWJlcihpZCkpICYmXG4gICAgICAgICAgICAgICAgIWNvbm5lY3RlZC5oYXMoTnVtYmVyKGlkKSkgJiZcbiAgICAgICAgICAgICAgICByZWNvbm5lY3RlZElkT2YoaWQsIHNjcmVlbiwgZGlzcGxheXMuZ2V0KCkpID09PSB1bmRlZmluZWQsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAubWFwKChbaWRdKSA9PiBpZCksXG4gICAgICAgICk7XG4gICAgICB9LFxuXG4gICAgICByZXNldDogYWN0aW9uKCgpID0+IHtcbiAgICAgICAgcmVuYW1pbmcuc2V0KHVuZGVmaW5lZCk7XG4gICAgICAgIHN0YXR1cy5zZXQodW5kZWZpbmVkKTtcbiAgICAgIH0pLFxuXG4gICAgICAvLyBTYXZlcyB0aGUgd2luZG93cyBhcyB0aGV5IGFyZSBub3cgYXMgYSBuZXcgbGF5b3V0IG9mIGEgbmFtZSBvZiBpdHMgb3duLCBldmVyeSB3aW5kb3cgbGVmdFxuICAgICAgLy8gb3V0IG9mIHRpbGluZywgYW5kIHNlbGVjdHMgaXQuXG4gICAgICBjcmVhdGU6IGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKCFtb2RlbC5jYW5BcnJhbmdlLmdldCgpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmFtZSA9IG5leHRMYXlvdXROYW1lKGxheW91dHMuZ2V0KCk/Lm1hcCgoaXQpID0+IGl0Lm5hbWUpID8/IFtdKTtcblxuICAgICAgICAvLyBBIG5ldyBsYXlvdXQgc3RhcnRzIHdpdGggZXZlcnkgd2luZG93IGxlZnQgYXMgaXQgaXMsIGZvciBUaWxlIGFsbCBvciBkcmFnZ2luZyB0byBwbGFjZS5cbiAgICAgICAgdGlsaW5nUGxhbi5sZWF2ZUFsbEFzVGhleUFyZSgpO1xuICAgICAgICBhd2FpdCBzYXZlV2luZG93TGF5b3V0KG5hbWUpO1xuXG4gICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICBzaG93VGlsaW5nT2YobmFtZSk7XG4gICAgICAgICAgc3RhdHVzLnNldCh1bmRlZmluZWQpO1xuICAgICAgICAgIC8vIEl0cyBuYW1lIHJlYWR5IHRvIGJlIHR5cGVkIG92ZXIsIGFzIGEgbmV3IGxheW91dCBpcyB0byBiZSBuYW1lZC5cbiAgICAgICAgICByZW5hbWluZy5zZXQobmFtZSk7XG4gICAgICAgICAgcmVuYW1lRHJhZnQuc2V0KG5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIENvcGllcyB0aGUgc2VsZWN0ZWQgbGF5b3V0IGFzIHNhdmVkLCBpdHMgdGlsaW5nIHdpdGggaXQsIGFuZCBzZWxlY3RzIHRoZSBjb3B5LCBpdHMgbmFtZSByZWFkeVxuICAgICAgLy8gdG8gYmUgdHlwZWQgb3ZlciBhcyBhIG5ldyBsYXlvdXQncyBpcy5cbiAgICAgIGR1cGxpY2F0ZTogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBmcm9tID0gc2VsZWN0ZWQuZ2V0KCk7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBmcm9tICYmIChhd2FpdCBkdXBsaWNhdGVXaW5kb3dMYXlvdXQoZnJvbSkpO1xuXG4gICAgICAgIGlmICghbmFtZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IG1vZGVsLnNlbGVjdChuYW1lKTtcblxuICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgcmVuYW1pbmcuc2V0KG5hbWUpO1xuICAgICAgICAgIHJlbmFtZURyYWZ0LnNldChuYW1lKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICAvLyBTYXZlcyB0aGUgd2luZG93cyBhcyB0aGV5IGFyZSBub3csIGFuZCB0aGUgdGlsaW5nIGJlbG93LCBvdmVyIHRoZSBzZWxlY3RlZCBsYXlvdXQuXG4gICAgICBzYXZlT3ZlcjogYXN5bmMgKFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIG9wdGlvbnM6IHsgcmVhZG9ubHkgdGlsZWRPbmx5PzogYm9vbGVhbiB9ID0ge30sXG4gICAgICApID0+IHtcbiAgICAgICAgY29uc3QgY291bnQgPSBhd2FpdCBzYXZlV2luZG93TGF5b3V0KG5hbWUsIG9wdGlvbnMpO1xuXG4gICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICBzaG93VGlsaW5nT2YobmFtZSk7XG4gICAgICAgICAgLy8gU2F2ZWQgd2hlcmUgdGhleSBhcmUsIHRoZSB3aW5kb3dzIGFyZSBpbiBwbGFjZTogdGhlaXIgdGlsZXMgc3RhbmQgZm9yIHRoZW0gYXMgdGhleSBhcmUuXG4gICAgICAgICAgYWNjZXB0V2hlcmVXaW5kb3dzQXJlKCk7XG4gICAgICAgICAgc3RhdHVzLnNldCh1bmRlZmluZWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBzaG93U2F2ZWQoXG4gICAgICAgICAgb3B0aW9ucy50aWxlZE9ubHlcbiAgICAgICAgICAgID8gYFNhdmVkIHRoZSAke3BsdXJhbChjb3VudCwgXCJ0aWxlZCB3aW5kb3dcIil9IGFuZCB0aGUgdGlsaW5nLmBcbiAgICAgICAgICAgIDogYFNhdmVkICR7cGx1cmFsKGNvdW50LCBcIndpbmRvd1wiKX0gYW5kIHRoZSB0aWxpbmcuYCxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gY291bnQ7XG4gICAgICB9LFxuXG4gICAgICAvLyBUaWxlcyB0aGUgd2luZG93cyBhcyB0aGUgbGF5b3V0J3MgdGlsaW5nIGhhcyB0aGVtIGFuZCBzYXZlcyB0aGVtIHNvIGludG8gaXQsIGZyb20gb3V0c2lkZVxuICAgICAgLy8gdGhlIGRpYWxvZywgYXMgZnJvbSB0aGUgaG90YmFyOiB3aXRoIGl0cyBvd24gdGlsaW5nLCBsb2FkZWQgZmlyc3QgdW5sZXNzIGl0IGlzIHRoZSBvbmUgc2hvd24sXG4gICAgICAvLyBlZGl0cyBhbmQgYWxsLiBBIHdpbmRvdyB0aGUgdGlsaW5nIGhhcyBub3QsIGFzIG9uZSBvcGVuZWQgc2luY2UsIGlzIHNhdmVkIGFzIG5vdCB0aWxlZC5cbiAgICAgIC8vIE5vdGhpbmcgaXMgc2F2ZWQgd2hlbiB0aGVyZSBpcyBubyBzdWNoIGxheW91dCwgb3IgdGhlIHdpbmRvd3MgY291bGQgbm90IGJlIHRpbGVkLlxuICAgICAgdGlsZUFuZFNhdmVJbnRvOiBhc3luYyAoXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICk6IFByb21pc2U8bnVtYmVyIHwgXCJuby1sYXlvdXRcIiB8IFwibm90LXRpbGVkXCI+ID0+IHtcbiAgICAgICAgaWYgKHNlbGVjdGVkLmdldCgpICE9PSBuYW1lKSB7XG4gICAgICAgICAgYXdhaXQgbW9kZWwuc2VsZWN0KG5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkLmdldCgpICE9PSBuYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIFwibm8tbGF5b3V0XCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIShhd2FpdCBtb2RlbC50aWxlKCkpKSB7XG4gICAgICAgICAgcmV0dXJuIFwibm90LXRpbGVkXCI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbW9kZWwuc2F2ZU92ZXIobmFtZSk7XG4gICAgICB9LFxuXG4gICAgICAvLyBQdXRzIHRoZSB3aW5kb3dzIGJhY2sgd2hlcmUgdGhlIGxheW91dCBoYXMgdGhlbSwgYW5kIHRlbGxzIHdoYXQgd2VudCBvdGhlcndpc2UsIGlmIGFueXRoaW5nLlxuICAgICAgcmVjYWxsOiBhc3luYyAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHJlb3BlbmluZy5zZXQodHJ1ZSkpO1xuXG4gICAgICAgIC8vIFRoZSB0aWxlIG9mIGEgd2luZG93IG9mIHRoZSBsYXlvdXQgbm90IG9wZW4sIG1pc3NpbmcgZnJvbSB0aGUgc3RhcnQgb3IgY2xvc2VkIHNpbmNlLlxuICAgICAgICAvLyBCeSB0aGUgd2luZG93J3Mgb3duIGtleSwgd2hhdGV2ZXIgcGxhY2UgaW4gdGhlIGxheW91dCBpdHMgdGlsZSdzIGtleSB3YXMgbWFkZSB3aXRoLlxuICAgICAgICBjb25zdCBtaXNzaW5nVGlsZU9mID0gKHNhdmVkOiBTYXZlZFdpbmRvdykgPT4ge1xuICAgICAgICAgIGNvbnN0IHBsYW4gPSB0aWxpbmdQbGFuLnJlc29sdmVkLmdldCgpO1xuXG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIC4uLnBsYW4uc2NyZWVucy5mbGF0TWFwKChzY3JlZW4pID0+IHNjcmVlbi53aW5kb3dzKSxcbiAgICAgICAgICAgIC4uLnBsYW4udW50aWxlZCxcbiAgICAgICAgICBdLmZpbmQoXG4gICAgICAgICAgICAoaXQpID0+XG4gICAgICAgICAgICAgIGl0Lm1pc3NpbmcgJiZcbiAgICAgICAgICAgICAgKHNhdmVkV2luZG93T2ZLZXkoW3NhdmVkXSwgaXQua2V5KSA9PT0gc2F2ZWQgfHxcbiAgICAgICAgICAgICAgICAvLyBBIHRpbGUgZ29pbmcgYnkgYSB3aW5kb3cgb3BlbmVkIGFnYWluIGFzIHRoZSBsYXlvdXQncywgY2xvc2VkIHNpbmNlLlxuICAgICAgICAgICAgICAgIChzZWxlY3RlZC5nZXQoKSA9PT0gbmFtZSAmJlxuICAgICAgICAgICAgICAgICAgc3RhbmRzRm9yT2YoaXQpID09PSBrZXlPZldpbmRvdyhzYXZlZC53aW5kb3cpKSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBUaGUgdGlsZSBvZiBlYWNoIHdpbmRvdyBiZWluZyBvcGVuZWQgYWdhaW4sIGJ5IHRoZSBsYXlvdXQncyB3aW5kb3cuXG4gICAgICAgIGNvbnN0IHRpbGVzID0gbmV3IE1hcDxTYXZlZFdpbmRvdywgc3RyaW5nPigpO1xuXG4gICAgICAgIC8vIEVhY2ggd2luZG93IG9wZW5lZCBhZ2FpbiBpcyBpdHMgdGlsZSBhcyBzb29uIGFzIExlbnMgYW5zd2VycyB3aXRoIGl0OyBvbmUgTGVucyBhbnN3ZXJzXG4gICAgICAgIC8vIG5vbmUgZm9yIHN0YXlzIG5vdCBvcGVuIGluIGl0LlxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWNhbGxXaW5kb3dMYXlvdXQobmFtZSwge1xuICAgICAgICAgIHJlb3BlbmluZzogKHNhdmVkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gbWlzc2luZ1RpbGVPZihzYXZlZCk7XG5cbiAgICAgICAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aWxlcy5zZXQoc2F2ZWQsIHRpbGUua2V5KTtcbiAgICAgICAgICAgICAgICBvcGVuaW5nLmFkZCh0aWxlLmtleSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVvcGVuZWQ6IChzYXZlZCwgX2luZGV4LCB3aW5kb3cpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHRpbGVzLmdldChzYXZlZCk7XG5cbiAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgICAgIG9wZW5pbmcuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAod2luZG93ICYmIGtleSkge1xuICAgICAgICAgICAgICAgIHRpbGluZ1BsYW4ucmVrZXkoa2V5LCB3aW5kb3cpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdykge1xuICAgICAgICAgICAgICAgIHJlY2FsbGVkLmFkZChrZXlPZldpbmRvdyh3aW5kb3cpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAvLyBUaGUgcmVjYWxsJ3MgcGxhbiBoYXMgZXZlcnkgd2luZG93IGJ5IGl0cyBvd24ga2V5LCBpbiB0aGUgb25lIHN0ZXAuXG4gICAgICAgICAgcGxhY2VkOiAoKSA9PlxuICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICByZWNhbGxlZC5jbGVhcigpO1xuICAgICAgICAgICAgICByZW9wZW5pbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KS5maW5hbGx5KCgpID0+XG4gICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdGlsZXMudmFsdWVzKCkpIHtcbiAgICAgICAgICAgICAgb3BlbmluZy5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVjYWxsZWQuY2xlYXIoKTtcbiAgICAgICAgICAgIHJlb3BlbmluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHNob3dUaWxpbmdPZihuYW1lKTtcblxuICAgICAgICBjb25zdCBub3RlcyA9IFtcbiAgICAgICAgICAuLi4ocmVzdWx0LnNjcmVlbnNDaGFuZ2VkXG4gICAgICAgICAgICA/IFtcInRoZSBzY3JlZW5zIGFyZSBub3QgdGhlIG9uZXMgaXQgd2FzIHNhdmVkIG9uXCJdXG4gICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICAuLi4ocmVzdWx0Lm1vdmVkVG9QcmltYXJ5Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgIGBtb3ZlZCBvbnRvIHRoZSBwcmltYXJ5IHNjcmVlbiwgYXMgdGhlaXIgcGxhY2UgaXMgb24gbm8gc2NyZWVuIG5vdzogJHtyZXN1bHQubW92ZWRUb1ByaW1hcnkuam9pbihcIiwgXCIpfWAsXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIDogW10pLFxuICAgICAgICAgIC4uLihyZXN1bHQubm90T3Blbi5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICBgY2xvc2VkLCBhbmQgY291bGQgbm90IGJlIG9wZW5lZCBhZ2FpbjogJHtyZXN1bHQubm90T3Blbi5qb2luKFwiLCBcIil9YCxcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgOiBbXSksXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3Qgbm90ZSA9XG4gICAgICAgICAgbm90ZXMubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyBgUmVjYWxsZWQgXCIke25hbWV9XCIsIHBsYWNpbmcgJHtwbHVyYWwocmVzdWx0LnBsYWNlZCwgXCJ3aW5kb3dcIil9LiBOb3RlOiAke25vdGVzLmpvaW4oXCI7IFwiKX0uYFxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4gc3RhdHVzLnNldChub3RlKSk7XG5cbiAgICAgICAgLy8gV2hhdCB3ZW50IG90aGVyd2lzZSwgZm9yIHdob2V2ZXIgcmVjYWxsZWQgaXQgZnJvbSBvdXRzaWRlIHRoZSBkaWFsb2cgdG8gdGVsbC5cbiAgICAgICAgcmV0dXJuIG5vdGU7XG4gICAgICB9LFxuXG4gICAgICByZW5hbWluZyxcbiAgICAgIHJlbmFtZURyYWZ0LFxuICAgICAgY2FuUmVuYW1lOiBjb21wdXRlZCgoKSA9PiByZW5hbWVEcmFmdC5nZXQoKS50cmltKCkgIT09IFwiXCIpLFxuXG4gICAgICBzdGFydFJlbmFtaW5nOiBhY3Rpb24oKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICByZW5hbWluZy5zZXQobmFtZSk7XG4gICAgICAgIHJlbmFtZURyYWZ0LnNldChuYW1lKTtcbiAgICAgIH0pLFxuXG4gICAgICBzZXRSZW5hbWVEcmFmdDogYWN0aW9uKChuYW1lOiBzdHJpbmcpID0+IHJlbmFtZURyYWZ0LnNldChuYW1lKSksXG4gICAgICBjYW5jZWxSZW5hbWluZzogYWN0aW9uKCgpID0+IHJlbmFtaW5nLnNldCh1bmRlZmluZWQpKSxcblxuICAgICAgLy8gUmVuYW1lcyB0aGUgbGF5b3V0IHRvIHRoZSBuYW1lIHR5cGVkOyBhbiBlbXB0eSBvciB1bmNoYW5nZWQgbmFtZSBsZWF2ZXMgaXQgYXMgaXQgd2FzLlxuICAgICAgcmVuYW1lOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZyb20gPSByZW5hbWluZy5nZXQoKTtcbiAgICAgICAgY29uc3QgdG8gPSByZW5hbWVEcmFmdC5nZXQoKS50cmltKCk7XG5cbiAgICAgICAgaWYgKGZyb20gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0byA9PT0gXCJcIiB8fCB0byA9PT0gZnJvbSkge1xuICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHJlbmFtaW5nLnNldCh1bmRlZmluZWQpKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlbmFtZVdpbmRvd0xheW91dChmcm9tLCB0byk7XG5cbiAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IFwibmFtZS10YWtlblwiKSB7XG4gICAgICAgICAgICBzdGF0dXMuc2V0KFxuICAgICAgICAgICAgICBgVGhlcmUgaXMgYSBsYXlvdXQgY2FsbGVkIFwiJHt0b31cIiBhbHJlYWR5LiBQaWNrIGFub3RoZXIgbmFtZS5gLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlbmFtaW5nLnNldCh1bmRlZmluZWQpO1xuXG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gXCJyZW5hbWVkXCIgJiYgc2VsZWN0ZWQuZ2V0KCkgPT09IGZyb20pIHtcbiAgICAgICAgICAgIHNlbGVjdGVkLnNldCh0byk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3RhdHVzLnNldCh1bmRlZmluZWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVzdWx0ID09PSBcInJlbmFtZWRcIikge1xuICAgICAgICAgIGF3YWl0IGZvbGxvd0luSG90YmFyKCgpID0+IGxheW91dEluSG90YmFyLnJlbmFtZWQoZnJvbSwgdG8pKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLy8gVGhlIGVkaXRvcidzIGVkaXRzIG1hcmsgdGhlIHNldHVwIG9mIHRoZSBsYXlvdXQgaXQgc2hvd3MgYXMgY2hhbmdlZCwgYW5kIHRpbGUgdGhlIHdpbmRvd3Mgc28uXG4gICAgICB0aWxpbmdQbGFuOiB7XG4gICAgICAgIC4uLnRpbGluZ1BsYW4sXG4gICAgICAgIGNvbW1pdDogYWN0aW9uKChwbGFuOiBQYXJhbWV0ZXJzPHR5cGVvZiB0aWxpbmdQbGFuLmNvbW1pdD5bMF0pID0+IHtcbiAgICAgICAgICB0aWxpbmdQbGFuLmNvbW1pdChwbGFuKTtcbiAgICAgICAgICB0aWxpbmdDaGFuZ2VkLnNldCh0cnVlKTtcbiAgICAgICAgICB0aWxlU29vbigpO1xuICAgICAgICB9KSxcbiAgICAgICAgYXV0b1RpbGU6IGFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgdGlsaW5nUGxhbi5hdXRvVGlsZSgpO1xuICAgICAgICAgIHRpbGluZ0NoYW5nZWQuc2V0KHRydWUpO1xuICAgICAgICAgIHRpbGVTb29uKCk7XG4gICAgICAgIH0pLFxuICAgICAgfSxcblxuICAgICAgc2VsZWN0ZWQsXG4gICAgICB0aWxpbmdDaGFuZ2VkLFxuICAgICAgc2F2ZWROb3RlLFxuICAgICAgc2VsZWN0ZWRMYXlvdXQ6IGNvbXB1dGVkKCgpID0+XG4gICAgICAgIGxheW91dHMuZ2V0KCk/LmZpbmQoKGl0KSA9PiBpdC5uYW1lID09PSBzZWxlY3RlZC5nZXQoKSksXG4gICAgICApLFxuXG4gICAgICAvLyBXaGV0aGVyIHNhdmluZyB0aGUgc2VsZWN0ZWQgbGF5b3V0IHdvdWxkIGNoYW5nZSBub3RoaW5nOiBpdHMgdGlsaW5nIG5vdCBjaGFuZ2VkIHNpbmNlIGl0XG4gICAgICAvLyB3YXMgc2VsZWN0ZWQsIGFuZCB0aGUgd2luZG93cyBvcGVuIHRoZSBsYXlvdXQncywgZWFjaCB3aGVyZSBhbmQgYXMgaXQgd2FzIHNhdmVkLlxuICAgICAgLy8gV2hldGhlciBzYXZpbmcgd291bGQgY2hhbmdlIG5vdGhpbmc6IG5vIHdpbmRvdyBvdXQgb2YgcGxhY2UsIG9wZW4gb3Igbm90LCBhbmQgdGhlIHRpbGluZyBhc1xuICAgICAgLy8gc2F2ZWQuIEEgd2luZG93IG9mIHRoZSBsYXlvdXQgbm90IG9wZW4gaXMgbm8gcmVhc29uIHRvIHNhdmUsIGFzIHNhdmluZyBrZWVwcyBpdCBhcyBpdCB3YXMuXG4gICAgICAvLyBXaGV0aGVyIHRoZSBsYXlvdXQgc2hvd24gaGFzIHdpbmRvd3Mgbm90IHRpbGVkIHRoYXQgc2F2aW5nIG9ubHkgdGhlIHRpbGVkIG9uZXMgd291bGQgbGVhdmVcbiAgICAgIC8vIG91dCBvZiBpdDogb3BlbiBvbmVzIGl0IHNhdmVkLCBvciBvbmVzIG5vdCBvcGVuIGl0IGhhcyBzdGlsbC5cbiAgICAgIGhhc1VudGlsZWRUb0xlYXZlT3V0OiBjb21wdXRlZCgoKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IGxheW91dCA9IG1vZGVsLnNlbGVjdGVkTGF5b3V0LmdldCgpO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgISFsYXlvdXQgJiZcbiAgICAgICAgICB0aWxpbmdQbGFuLnJlc29sdmVkXG4gICAgICAgICAgICAuZ2V0KClcbiAgICAgICAgICAgIC51bnRpbGVkLnNvbWUoKHdpbmRvdykgPT5cbiAgICAgICAgICAgICAgd2luZG93Lm1pc3NpbmdcbiAgICAgICAgICAgICAgICA/IGxheW91dC53aW5kb3dzLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgIChpdCkgPT4ga2V5T2ZXaW5kb3coaXQud2luZG93KSA9PT0gc3RhbmRzRm9yT2Yod2luZG93KSxcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IHNhdmVkV2luZG93c09mLmdldCgpLmhhcyh3aW5kb3cucmVjb3JkKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pLFxuXG4gICAgICBpc1NlbGVjdGVkU2F2ZWQ6IGNvbXB1dGVkKCgpOiBib29sZWFuID0+IHtcbiAgICAgICAgY29uc3QgbGF5b3V0ID0gbW9kZWwuc2VsZWN0ZWRMYXlvdXQuZ2V0KCk7XG5cbiAgICAgICAgY29uc3QgcGxhbiA9IHRpbGluZ1BsYW4ucmVzb2x2ZWQuZ2V0KCk7XG4gICAgICAgIGNvbnN0IG5vdE9wZW4gPSBbXG4gICAgICAgICAgLi4ucGxhbi5zY3JlZW5zLmZsYXRNYXAoKHNjcmVlbikgPT4gc2NyZWVuLndpbmRvd3MpLFxuICAgICAgICAgIC4uLnBsYW4udW50aWxlZCxcbiAgICAgICAgXS5maWx0ZXIoKHdpbmRvdykgPT4gd2luZG93Lm1pc3NpbmcpO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgISFsYXlvdXQ/LnRpbGluZyAmJlxuICAgICAgICAgICF0aWxpbmdDaGFuZ2VkLmdldCgpICYmXG4gICAgICAgICAgIXdpbmRvd3MuZ2V0KCkuc29tZShpc1Vuc2F2ZWQpICYmXG4gICAgICAgICAgIW5vdE9wZW4uc29tZSgod2luZG93KSA9PiBtb2RlbC5pc091dE9mUGxhY2Uod2luZG93KSlcbiAgICAgICAgKTtcbiAgICAgIH0pLFxuXG4gICAgICAvLyBTaG93cyB0aGUgbGF5b3V0J3MgdGlsaW5nIHNldHVwIGluIHRoZSBlZGl0b3IsIHRoZSB3aW5kb3dzIHN0YXlpbmcgd2hlcmUgdGhleSBhcmUuXG4gICAgICBzZWxlY3Q6IGFzeW5jIChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKHNlbGVjdGVkLmdldCgpID09PSBuYW1lICYmICF0aWxpbmdDaGFuZ2VkLmdldCgpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc2hvd1RpbGluZ09mKG5hbWUpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGxheW91dFRpbGluZy5sb2FkKG5hbWUpO1xuXG4gICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgc2VsZWN0ZWQuc2V0KHVuZGVmaW5lZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRpbGluZ0NoYW5nZWQuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgIHN0YXR1cy5zZXQodW5kZWZpbmVkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSxcblxuICAgICAgLy8gVGlsaW5nIG5lZWRzIGEgd2luZG93IG9uIHNvbWUgc2NyZWVuLlxuICAgICAgLy8gV2hldGhlciB0aGUgd2luZG93IGlzIG5vdCB3aGVyZSB0aGUgcGxhbiBoYXMgaXQ6IGVsc2V3aGVyZSwgb3Igbm90IHNob3duIG5vcm1hbGx5LiBBIHdpbmRvd1xuICAgICAgLy8gbm90IG9wZW4sIG9yIG9uIGEgc2NyZWVuIG5vdCBjb25uZWN0ZWQsIGlzIG5vdCB0aWxlZCwgYW5kIGlzIG5ldmVyIG9mZiBpdHMgdGlsaW5nLlxuICAgICAgaXNPZmZUaWxpbmc6ICh3aW5kb3c6IFBsYWNlZFdpbmRvdywgc2NyZWVuOiBQbGFubmVkU2NyZWVuKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGlmICh3aW5kb3cubWlzc2luZyB8fCBzY3JlZW4ubWlzc2luZykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJvdW5kcyA9IHdpbmRvdy5yZWNvcmQuYm91bmRzLmdldCgpO1xuICAgICAgICBjb25zdCBwbGFubmVkID0gYm91bmRzSW5HcmlkKFxuICAgICAgICAgIHNjcmVlbi5kaXNwbGF5LndvcmtBcmVhLmdldCgpLFxuICAgICAgICAgIHNjcmVlbi5jb2x1bW5zLFxuICAgICAgICAgIHNjcmVlbi5yb3dzLFxuICAgICAgICAgIHdpbmRvdyxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc2V0dGxlZEF0ID0gc2V0dGxlZC5nZXQocGxhY2VtZW50T2Yod2luZG93LCBzY3JlZW4pKTtcblxuICAgICAgICAvLyBXaGVyZSBpdCBzZXR0bGVkLCBvciB3YXMgc2F2ZWQsIGlzIGluIHBsYWNlIGhvd2V2ZXIgaXQgc2hvd3MuXG4gICAgICAgIGlmIChzZXR0bGVkQXQgJiYgaXNOZWFyKGJvdW5kcywgc2V0dGxlZEF0LCAyKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgd2luZG93LnJlY29yZC5zdGF0ZS5nZXQoKSAhPT0gXCJub3JtYWxcIiB8fCAhaXNOZWFyKGJvdW5kcywgcGxhbm5lZCwgNClcbiAgICAgICAgKTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIFdoZXRoZXIgdGhlIHdpbmRvdyBkaWZmZXJzIGZyb20gd2hhdCB0aGUgc2VsZWN0ZWQgbGF5b3V0IHNhdmVkIG9mIGl0OiBub3Qgd2hlcmUgaXQgd2FzLCBub3RcbiAgICAgIC8vIHNob3duIGFzIGl0IHdhcywgb3Igbm90IHNhdmVkIGluIGl0IGF0IGFsbCwgYXMgb25lIG9wZW5lZCBzaW5jZSwgb3BlbiBvciBjbG9zZWQgYWdhaW4uXG4gICAgICBpc091dE9mUGxhY2U6IChcbiAgICAgICAgd2luZG93OiBQbGFubmVkV2luZG93LFxuICAgICAgICBfc2NyZWVuPzogUGxhbm5lZFNjcmVlbixcbiAgICAgICk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCBsYXlvdXQgPSBtb2RlbC5zZWxlY3RlZExheW91dC5nZXQoKTtcblxuICAgICAgICBpZiAoIWxheW91dCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vdCBvcGVuLCBpdCBkaWZmZXJzIGZyb20gd2hhdCB3YXMgc2F2ZWQgd2hlbiB0aGUgbGF5b3V0IGhhcyBpdCBub3QgYXQgYWxsLCBhcyBvbmUgb3BlbmVkXG4gICAgICAgIC8vIGFmdGVyIHNhdmluZyBhbmQgY2xvc2VkIHNpbmNlLCBvciB3aGVuIGl0cyB0aWxlIGlzIG5vdCB3aGVyZSB0aGUgbGF5b3V0J3MgdGlsaW5nIGhhcyBpdDpcbiAgICAgICAgLy8gbW92ZWQsIHJlc2l6ZWQsIG9yIHRpbGVkIG9yIG5vdCB1bmxpa2UgdGhlbi4gV2hlcmUgdGhlIHdpbmRvdyBpdHNlbGYgaXMgY2Fubm90IGRpZmZlci5cbiAgICAgICAgaWYgKHdpbmRvdy5taXNzaW5nKSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0gc3RhbmRzRm9yT2Yod2luZG93KTtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGxheW91dC53aW5kb3dzLmZpbmRJbmRleChcbiAgICAgICAgICAgIChpdCkgPT4ga2V5T2ZXaW5kb3coaXQud2luZG93KSA9PT0ga2V5LFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4gaW5kZXggPT09IC0xIHx8ICFpc1RpbGVkQXNTYXZlZCh3aW5kb3csIGxheW91dCwgaW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGlzVW5zYXZlZCh3aW5kb3cucmVjb3JkKTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIFdoZXRoZXIgZXZlcnkgd2luZG93IGlzIHdoZXJlIHRoZSBwbGFuIGhhcyBpdCBhbHJlYWR5LlxuICAgICAgaXNUaWxlZEFzU2hvd246IGNvbXB1dGVkKCgpOiBib29sZWFuID0+XG4gICAgICAgIHRpbGVkV2luZG93c09mKHRpbGluZ1BsYW4ucmVzb2x2ZWQuZ2V0KCkpLmV2ZXJ5KFxuICAgICAgICAgICh7IHdpbmRvdywgc2NyZWVuIH0pID0+ICFtb2RlbC5pc09mZlRpbGluZyh3aW5kb3csIHNjcmVlbiksXG4gICAgICAgICksXG4gICAgICApLFxuXG4gICAgICAvLyBUaWxpbmcgbmVlZHMgYSB3aW5kb3cgdG8gdGlsZSwgYW5kIHNvbWV0aGluZyB0byBjaGFuZ2UuXG4gICAgICBjYW5UaWxlOiBjb21wdXRlZChcbiAgICAgICAgKCk6IGJvb2xlYW4gPT5cbiAgICAgICAgICBtb2RlbC5jYW5BcnJhbmdlLmdldCgpICYmXG4gICAgICAgICAgdGlsaW5nUGxhbi5yZXNvbHZlZFxuICAgICAgICAgICAgLmdldCgpXG4gICAgICAgICAgICAuc2NyZWVucy5zb21lKFxuICAgICAgICAgICAgICAoaXQpID0+XG4gICAgICAgICAgICAgICAgIWl0Lm1pc3NpbmcgJiYgaXQud2luZG93cy5zb21lKCh3aW5kb3cpID0+ICF3aW5kb3cubWlzc2luZyksXG4gICAgICAgICAgICApICYmXG4gICAgICAgICAgIW1vZGVsLmlzVGlsZWRBc1Nob3duLmdldCgpLFxuICAgICAgKSxcblxuICAgICAgdGlsZTogYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRpbGVXaW5kb3dzKCk7XG4gICAgICAgICAgLy8gTmV2ZXIgZW5kcyBvbmNlIHRoZSBtb2RlbCBpcyB0aHJvd24gYXdheSwgc28gbm90aGluZyBpcyB0YWtlbiBmcm9tIHdpbmRvd3MgdGhlbi5cbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT5cbiAgICAgICAgICAgIGxhdGVyKCgpID0+IHJlc29sdmUodW5kZWZpbmVkKSwgc2V0dGxlTXMpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICBhY2NlcHRXaGVyZVdpbmRvd3NBcmUoKTtcbiAgICAgICAgICAgIHN0YXR1cy5zZXQodW5kZWZpbmVkKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+XG4gICAgICAgICAgICBzdGF0dXMuc2V0KGBDb3VsZCBub3QgdGlsZSB0aGUgd2luZG93czogJHtTdHJpbmcoZXJyb3IpfWApLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8vIENsb3NlcyB0aGUgd2luZG93LCB3aGVuIGl0IGlzIG9wZW4sIGFuZCB0YWtlcyBpdCBvdXQgb2YgdGhlIHRpbGluZywgc28gdGhhdCBzYXZpbmcgdGFrZXMgaXRcbiAgICAgIC8vIG91dCBvZiB0aGUgbGF5b3V0LiBUaGUgYXBwbGljYXRpb24gd2luZG93IGlzIG5vdCBjbG9zZWQuXG4gICAgICBjbG9zZVdpbmRvdzogYXN5bmMgKHdpbmRvdzogUGxhbm5lZFdpbmRvdykgPT4ge1xuICAgICAgICBpZiAoaXNBcHBsaWNhdGlvbldpbmRvdyh3aW5kb3cucmVjb3JkLndpbmRvdykpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAod2luZG93Lm1pc3NpbmcpIHtcbiAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICB0aWxpbmdQbGFuLmZvcmdldCh3aW5kb3cua2V5KTtcbiAgICAgICAgICAgIHRpbGluZ0NoYW5nZWQuc2V0KHRydWUpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGl0bGUgPSB3aW5kb3cucmVjb3JkLnRpdGxlLmdldCgpO1xuICAgICAgICBjb25zdCBvd24gPSBrZXlPZldpbmRvdyh3aW5kb3cucmVjb3JkLndpbmRvdyk7XG4gICAgICAgIGNvbnN0IHN1YiA9IGxpc3RlZFN1YldpbmRvd09mKHdpbmRvdywgYXdhaXQgZ2V0U3ViV2luZG93cygpKTtcblxuICAgICAgICBpZiAoIXN1Yikge1xuICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+XG4gICAgICAgICAgICBzdGF0dXMuc2V0KFxuICAgICAgICAgICAgICBgQ291bGQgbm90IGNsb3NlIFwiJHt0aXRsZX1cIjogTGVucyBkb2VzIG5vdCBsaXN0IGl0IGFzIGEgd2luZG93IG9mIGl0cyBvd24uYCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEl0cyB0aWxlIGdvZXMgYXQgb25jZSwgYW5kIHRoZSB3aW5kb3cgaGFzIG5vIHBsYWNlIGluIHRoZSBwbGFuIHdoaWxlIExlbnMgbGlzdHMgaXQgc3RpbGwsXG4gICAgICAgIC8vIHNvIHRoYXQgaXQgc2hvd3MgbmVpdGhlciBhcyBub3Qgb3BlbiBub3IgYXMgYSB3aW5kb3cgb2YgaXRzIG93biBtZWFud2hpbGUuIFRoZSB3aW5kb3dzXG4gICAgICAgIC8vIGNsb3NlZCBiZWZvcmUsIGdvbmUgYnkgbm93LCBhcmUgZm9yZ290dGVuLlxuICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgWy4uLmNsb3NpbmddKSB7XG4gICAgICAgICAgICBpZiAoIXdpbmRvd3MuZ2V0KCkuc29tZSgoaXQpID0+IGtleU9mV2luZG93KGl0LndpbmRvdykgPT09IGtleSkpIHtcbiAgICAgICAgICAgICAgY2xvc2luZy5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjbG9zaW5nLmFkZChvd24pO1xuICAgICAgICAgIHRpbGluZ1BsYW4uZm9yZ2V0KHdpbmRvdy5rZXkpO1xuICAgICAgICAgIHRpbGluZ0NoYW5nZWQuc2V0KHRydWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGNsb3NlQW55U3ViV2luZG93KHN1Yi5pZCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gTm90IGNsb3NlZDogaXQgc2hvd3MgYWdhaW4sIGFzIG5vdCB0aWxlZC5cbiAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICBjbG9zaW5nLmRlbGV0ZShvd24pO1xuICAgICAgICAgICAgc3RhdHVzLnNldChgQ291bGQgbm90IGNsb3NlIFwiJHt0aXRsZX1cIjogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvLyBXaGV0aGVyIGEgd2luZG93IG9mIGl0cyBvd24gY2FuIGJlIG9wZW5lZCBvbiBhIHBsYWNlLCBhcyB3aXRoIExlbnMgU3R1ZGlvLlxuICAgICAgY2FuT3BlblBsYWNlcyxcbiAgICAgIGNsdXN0ZXJzOiBjb21wdXRlZCgoKSA9PiBjbHVzdGVycy5nZXQoKT8uZ2V0KCkgPz8gW10pLFxuXG4gICAgICAvLyBPcGVucyB0aGUgcGxhY2UsIGEgY2x1c3RlcidzIGxpc3Qgb2YgcG9kcyBzYXksIGluIGEgd2luZG93IG9mIGl0cyBvd24sIGluIHRoZSBjZWxsLCBpdHMgdGlsZVxuICAgICAgLy8gbmFtZWQgYXMgZ2l2ZW4gdW50aWwgdGhlIHdpbmRvdyBzaG93cy5cbiAgICAgIG9wZW5JbkNlbGw6IChwbGFjZTogUGxhY2UsIGNlbGw6IENlbGwsIHRpdGxlOiBzdHJpbmcpID0+XG4gICAgICAgIG9wZW5QbGFjZUluQ2VsbChwbGFjZSwgY2VsbCwgdGl0bGUpLFxuXG4gICAgICByZW9wZW5pbmcsXG4gICAgICAvLyBXaGV0aGVyIHRoZSB3aW5kb3cgbm90IG9wZW4gY2FuIGJlIG9wZW5lZCBhZ2FpbjogYXMgdGhlIGxheW91dCBrZXB0IGl0LCB3aGVuIExlbnMgY2FuIG9wZW5cbiAgICAgIC8vIHRoYXQgbm93LCBvciBhcyBMZW5zIGRlc2NyaWJlZCBpdCBhcyBpdCBjbG9zZWQsIHdoaWNoIGl0IGlzIGFza2VkIGZvciB3aGVuIG9wZW5pbmcgaXQuXG4gICAgICBjYW5SZW9wZW46ICh3aW5kb3c6IFBsYW5uZWRXaW5kb3cpID0+IHtcbiAgICAgICAgaWYgKCF3aW5kb3cubWlzc2luZyB8fCB3aW5kb3cua2V5LnN0YXJ0c1dpdGgob3BlbmluZ1ByZWZpeCkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvZkxheW91dCA9IHNhdmVkV2luZG93T2Yod2luZG93KTtcblxuICAgICAgICBpZiAob2ZMYXlvdXQpIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgISFvZkxheW91dC5yZW9wZW5pbmcgJiZcbiAgICAgICAgICAgIGNhblJlb3BlbldpbmRvd1JlYWN0aXZlKG9mTGF5b3V0LnJlb3BlbmluZykuZ2V0KClcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhd2luZG93LmNsb3NlZDtcbiAgICAgIH0sXG5cbiAgICAgIGlzUmVvcGVuaW5nV2luZG93OiAod2luZG93OiBQbGFubmVkV2luZG93KSA9PiBvcGVuaW5nLmhhcyh3aW5kb3cua2V5KSxcblxuICAgICAgLy8gT3BlbnMgdGhlIHdpbmRvdyBub3Qgb3BlbiBhZ2FpbiwgYXMgaXQgd2FzLCB3aGVyZSBpdHMgdGlsZSBpcywgYW5kIGZvY3VzZXMgaXQ6IHRoZSB3aW5kb3dcbiAgICAgIC8vIExlbnMgYW5zd2VycyB3aXRoIGlzIHRoZSB0aWxlJ3MgZnJvbSB0aGVuIG9uLiBMZW5zIGFuc3dlcmluZyBub25lIGxlYXZlcyBpdCBub3Qgb3Blbi5cbiAgICAgIHJlb3BlbldpbmRvdzogYXN5bmMgKHdpbmRvdzogUGxhbm5lZFdpbmRvdykgPT4ge1xuICAgICAgICBjb25zdCB7IGtleSB9ID0gd2luZG93O1xuXG4gICAgICAgIGlmIChvcGVuaW5nLmhhcyhrZXkpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGl0bGUgPSB3aW5kb3cucmVjb3JkLnRpdGxlLmdldCgpO1xuICAgICAgICBjb25zdCBwbGFjZW1lbnQgPSByZW9wZW5pbmdQbGFjZW1lbnRPZih3aW5kb3cpO1xuICAgICAgICBjb25zdCB0aWxlID0ge1xuICAgICAgICAgIHN0YW5kc0Zvcjogc3RhbmRzRm9yT2Yod2luZG93KSxcbiAgICAgICAgICAvLyBUaGUgd2luZG93IGl0c2VsZiwgbm90IHRoZSBwbGFjZSBpbiB0aGUgbGF5b3V0IGl0cyB0aWxlJ3Mga2V5IG1heSBnbyBieSB0b28uXG4gICAgICAgICAgcHJldmlvdXM6IC9ebWlzc2luZzpcXGQrOiguKikkL3MuZXhlYyhrZXkpPy5bMV0gPz8ga2V5LFxuICAgICAgICB9O1xuXG4gICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IG9wZW5pbmcuYWRkKGtleSkpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qga2VwdCA9IGF3YWl0IHJlb3BlbmluZ09mKHdpbmRvdyk7XG4gICAgICAgICAgY29uc3QgcmVvcGVuZWQgPVxuICAgICAgICAgICAga2VwdCAmJlxuICAgICAgICAgICAgKGF3YWl0IHJlb3BlbldpbmRvdyhrZXB0LCBwbGFjZW1lbnQpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCkpO1xuXG4gICAgICAgICAgaWYgKCFyZW9wZW5lZCkge1xuICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4gc3RhdHVzLnNldChgQ291bGQgbm90IG9wZW4gXCIke3RpdGxlfVwiIGFnYWluLmApKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENyZWF0ZWQgb3ZlciBpdHMgdGlsZSBhbHJlYWR5OiBubyBvdGhlciB3aW5kb3cgaXMgbW92ZWQgZm9yIGl0LlxuICAgICAgICAgIHRpbGVSZW9wZW5lZChrZXksIHJlb3BlbmVkLCB0aWxlKTtcbiAgICAgICAgICBhd2FpdCBmb2N1c1dpbmRvdyhyZW9wZW5lZCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4gb3BlbmluZy5kZWxldGUoa2V5KSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8vIEJyaW5ncyB0aGUgbGF5b3V0J3Mgd2luZG93IG9mIHRoZSBwbGFjZSBpbiBpdCB0byB0aGUgZnJvbnQsIG9wZW5pbmcgaXQgYWdhaW4gZmlyc3Qgd2hlbiBpdFxuICAgICAgLy8gaXMgbm90IG9wZW46IGZyb20gaXRzIHRpbGUgd2hlbiB0aGUgbGF5b3V0IGlzIHRoZSBvbmUgc2hvd24sIHNvIGl0cyB0aWxlIGlzIGl0czsgb3RoZXJ3aXNlXG4gICAgICAvLyBhcyB0aGUgbGF5b3V0IGtlcHQgaXQsIHdoZXJlIGl0IHNhdmVkIGl0LCBhbmQgdGhlIHdpbmRvdyBvcGVuZWQgaXMgdGhlIGxheW91dCdzIGZyb20gdGhlbi5cbiAgICAgIHNob3dXaW5kb3dPZjogYXN5bmMgKFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICApOiBQcm9taXNlPFwiZm9jdXNlZFwiIHwgXCJvcGVuZWRcIiB8IFwibm90LW9wZW5lZFwiPiA9PiB7XG4gICAgICAgIGNvbnN0IGxheW91dCA9IGxheW91dHMuZ2V0KCk/LmZpbmQoKGl0KSA9PiBpdC5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgY29uc3Qgc2F2ZWQgPSBsYXlvdXQ/LndpbmRvd3NbaW5kZXhdO1xuXG4gICAgICAgIGlmICghbGF5b3V0IHx8ICFzYXZlZCkge1xuICAgICAgICAgIHJldHVybiBcIm5vdC1vcGVuZWRcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9wZW4gPSBvcGVuV2luZG93c09mKGxheW91dCkuZ2V0KHNhdmVkKTtcblxuICAgICAgICBpZiAob3Blbikge1xuICAgICAgICAgIGF3YWl0IGZvY3VzV2luZG93KG9wZW4ud2luZG93KTtcblxuICAgICAgICAgIHJldHVybiBcImZvY3VzZWRcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxlY3RlZC5nZXQoKSA9PT0gbmFtZSkge1xuICAgICAgICAgIGNvbnN0IHBsYW4gPSB0aWxpbmdQbGFuLnJlc29sdmVkLmdldCgpO1xuICAgICAgICAgIGNvbnN0IHRpbGUgPSBbXG4gICAgICAgICAgICAuLi5wbGFuLnNjcmVlbnMuZmxhdE1hcCgoc2NyZWVuKSA9PiBzY3JlZW4ud2luZG93cyksXG4gICAgICAgICAgICAuLi5wbGFuLnVudGlsZWQsXG4gICAgICAgICAgXS5maW5kKFxuICAgICAgICAgICAgKGl0KSA9PlxuICAgICAgICAgICAgICBpdC5taXNzaW5nICYmXG4gICAgICAgICAgICAgIChzYXZlZFdpbmRvd09mS2V5KGxheW91dC53aW5kb3dzLCBpdC5rZXkpID09PSBzYXZlZCB8fFxuICAgICAgICAgICAgICAgIHN0YW5kc0Zvck9mKGl0KSA9PT0ga2V5T2ZXaW5kb3coc2F2ZWQud2luZG93KSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgICAgICBhd2FpdCBtb2RlbC5yZW9wZW5XaW5kb3codGlsZSk7XG5cbiAgICAgICAgICAgIHJldHVybiBvcGVuV2luZG93c09mKGxheW91dCkuaGFzKHNhdmVkKSA/IFwib3BlbmVkXCIgOiBcIm5vdC1vcGVuZWRcIjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZW9wZW5lZCA9XG4gICAgICAgICAgc2F2ZWQucmVvcGVuaW5nICYmXG4gICAgICAgICAgY2FuUmVvcGVuV2luZG93UmVhY3RpdmUoc2F2ZWQucmVvcGVuaW5nKS5nZXQoKSAmJlxuICAgICAgICAgIChhd2FpdCByZW9wZW5XaW5kb3coc2F2ZWQucmVvcGVuaW5nLCB7XG4gICAgICAgICAgICAvLyBJbiBpdHMgdGlsZSwgd2hlbiB0aGUgbGF5b3V0IHRpbGVzIGl0IG9uIGEgc2NyZWVuIGNvbm5lY3RlZCBub3csIGFzIFJlY2FsbCBwdXRzIGl0LlxuICAgICAgICAgICAgYm91bmRzOlxuICAgICAgICAgICAgICB0aWxlQm91bmRzT2YobGF5b3V0LCBkaXNwbGF5cy5nZXQoKSkuZ2V0KGluZGV4KSA/P1xuICAgICAgICAgICAgICBzYXZlZC5ub3JtYWxCb3VuZHMsXG4gICAgICAgICAgICBzdGF0ZTpcbiAgICAgICAgICAgICAgdGlsZUJvdW5kc09mKGxheW91dCwgZGlzcGxheXMuZ2V0KCkpLmhhcyhpbmRleCkgJiZcbiAgICAgICAgICAgICAgc2F2ZWQuc3RhdGUgIT09IFwibWluaW1pemVkXCJcbiAgICAgICAgICAgICAgICA/IFwibm9ybWFsXCJcbiAgICAgICAgICAgICAgICA6IHNhdmVkLnN0YXRlLFxuICAgICAgICAgICAgLi4uKHNhdmVkLmRpc3BsYXlJZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgICAgOiB7IGRpc3BsYXlJZDogc2F2ZWQuZGlzcGxheUlkIH0pLFxuICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCkpO1xuXG4gICAgICAgIGlmICghcmVvcGVuZWQpIHtcbiAgICAgICAgICByZXR1cm4gXCJub3Qtb3BlbmVkXCI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgbGF5b3V0J3Mgd2luZG93LCBmcm9tIG5vdyBvbiwgYXMgd2hlbiBhIHJlY2FsbCBvcGVucyBpdCBhZ2Fpbi5cbiAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG93biA9IGtleU9mV2luZG93KHJlb3BlbmVkKTtcbiAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGtleU9mV2luZG93KHNhdmVkLndpbmRvdyk7XG5cbiAgICAgICAgICBpZiAob3duICE9PSBwcmV2aW91cykge1xuICAgICAgICAgICAgY29udGludWVzLmdldCgpPy5zZXQob3duLCBwcmV2aW91cyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGluZWFnZS5nZXQoKT8uc2V0KGxpbmVhZ2VLZXkobmFtZSwgb3duKSwgcHJldmlvdXMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCBmb2N1c1dpbmRvdyhyZW9wZW5lZCk7XG5cbiAgICAgICAgcmV0dXJuIFwib3BlbmVkXCI7XG4gICAgICB9LFxuXG4gICAgICAvLyBSZW5hbWluZyBhIHdpbmRvdywgYXMgYSBsYXlvdXQgaXM6IEVudGVyIG9yIGxlYXZpbmcgdGhlIG5hbWUga2VlcHMgaXQsIEVzY2FwZSB0aGUgb2xkIG9uZS5cbiAgICAgIC8vIE9ubHkgYSBzdWItd2luZG93IG9wZW4gY2FuIGJlIHJlbmFtZWQ7IHRoZSB3aW5kb3cga2VlcHMgdGhlIG5hbWUsIHdoYXRldmVyIGl0IHNob3dzLlxuICAgICAgY2FuUmVuYW1lV2luZG93OiAod2luZG93OiBQbGFubmVkV2luZG93KSA9PlxuICAgICAgICAhd2luZG93Lm1pc3NpbmcgJiZcbiAgICAgICAgIWlzQXBwbGljYXRpb25XaW5kb3cod2luZG93LnJlY29yZC53aW5kb3cpICYmXG4gICAgICAgICEhbGlzdGVkU3ViV2luZG93T2Yod2luZG93LCBzdWJXaW5kb3dzT2ZMZW5zLmdldCgpKSxcbiAgICAgIHJlbmFtaW5nV2luZG93LFxuICAgICAgd2luZG93TmFtZURyYWZ0LFxuICAgICAgc3RhcnRSZW5hbWluZ1dpbmRvdzogYWN0aW9uKCh3aW5kb3c6IFBsYW5uZWRXaW5kb3cpID0+IHtcbiAgICAgICAgcmVuYW1pbmdXaW5kb3cuc2V0KHdpbmRvdy5rZXkpO1xuICAgICAgICB3aW5kb3dOYW1lRHJhZnQuc2V0KHdpbmRvdy5yZWNvcmQudGl0bGUuZ2V0KCkpO1xuICAgICAgfSksXG4gICAgICBzZXRXaW5kb3dOYW1lRHJhZnQ6IGFjdGlvbigodGV4dDogc3RyaW5nKSA9PiB3aW5kb3dOYW1lRHJhZnQuc2V0KHRleHQpKSxcbiAgICAgIGNhbmNlbFJlbmFtaW5nV2luZG93OiBhY3Rpb24oKCkgPT4gcmVuYW1pbmdXaW5kb3cuc2V0KHVuZGVmaW5lZCkpLFxuICAgICAgcmVuYW1lV2luZG93OiBhc3luYyAod2luZG93OiBQbGFubmVkV2luZG93KSA9PiB7XG4gICAgICAgIGlmIChyZW5hbWluZ1dpbmRvdy5nZXQoKSAhPT0gd2luZG93LmtleSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5hbWUgPSB3aW5kb3dOYW1lRHJhZnQuZ2V0KCkudHJpbSgpO1xuXG4gICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHJlbmFtaW5nV2luZG93LnNldCh1bmRlZmluZWQpKTtcblxuICAgICAgICBpZiAoIW5hbWUgfHwgbmFtZSA9PT0gd2luZG93LnJlY29yZC50aXRsZS5nZXQoKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YiA9IGxpc3RlZFN1YldpbmRvd09mKHdpbmRvdywgYXdhaXQgZ2V0U3ViV2luZG93cygpKTtcblxuICAgICAgICBpZiAoc3ViKSB7XG4gICAgICAgICAgYXdhaXQgcmVuYW1lQW55U3ViV2luZG93KHN1Yi5pZCwgbmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGNsdXN0ZXJTZWFyY2gsXG4gICAgICBzZXRDbHVzdGVyU2VhcmNoOiBhY3Rpb24oKHRleHQ6IHN0cmluZykgPT4gY2x1c3RlclNlYXJjaC5zZXQodGV4dCkpLFxuICAgICAgcGFnZVNlYXJjaCxcbiAgICAgIHNldFBhZ2VTZWFyY2g6IGFjdGlvbigodGV4dDogc3RyaW5nKSA9PiBwYWdlU2VhcmNoLnNldCh0ZXh0KSksXG5cbiAgICAgIC8vIERlbGV0ZXMgdGhlIGxheW91dCBvbmNlIHRoZSB1c2VyIGNvbmZpcm1zIGl0LlxuICAgICAgcmVtb3ZlOiBhc3luYyAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmICghKGF3YWl0IGNvbmZpcm1EZWxldGUobmFtZSkpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgZGVsZXRlV2luZG93TGF5b3V0KG5hbWUpO1xuICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgaWYgKHNlbGVjdGVkLmdldCgpID09PSBuYW1lKSB7XG4gICAgICAgICAgICBzaG93VGlsaW5nT2YodW5kZWZpbmVkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzdGF0dXMuc2V0KHVuZGVmaW5lZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IGZvbGxvd0luSG90YmFyKCgpID0+IGxheW91dEluSG90YmFyLmRlbGV0ZWQobmFtZSkpO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gU3RvcHMgd2hhdCB0aGUgbW9kZWwgc3RhcnRlZCwgY2FsbGVkIGFzIGl0IGlzIHRocm93biBhd2F5LlxuICAgIGNvbnN0IGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHRpbWVyIG9mIHRpbWVycykge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgfVxuXG4gICAgICB0aW1lcnMuY2xlYXIoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgZGlzcG9zYWJsZSA9IE9iamVjdC5hc3NpZ24obW9kZWwsIHsgZGlzcG9zZSB9KTtcblxuICAgIHJldHVybiAoKSA9PiBkaXNwb3NhYmxlO1xuICB9LFxufSk7XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0YWJsZTIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgc2hvd0luZm9Ob3RpZmljYXRpb25JbmplY3Rpb25Ub2tlbiB9IGZyb20gXCJAazhzbGVucy9ub3RpZmljYXRpb25zLWNvbnRyYWN0c1wiO1xuaW1wb3J0IHsgd2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSB9IGZyb20gXCIuL3dpbmRvdy1sYXlvdXRzLW1vZGVsLmluamVjdGFibGVcIjtcblxuLy8gUmVjYWxscyBhIGxheW91dCwgdGVsbGluZyBpbiBhIG5vdGlmaWNhdGlvbiB3aGF0IHdlbnQgb3RoZXJ3aXNlLCBhcyB0aGUgZGlhbG9nIGlzIG5vdCBvcGVuIHRvLlxuZXhwb3J0IGNvbnN0IHJlY2FsbEZyb21Ib3RiYXJJbmplY3RhYmxlID0gZ2V0SW5qZWN0YWJsZTIoe1xuICBpZDogXCJ3aW5kb3ctbWFuYWdlci5yZWNhbGwtZnJvbS1ob3RiYXJcIixcbiAgY29uc3VtcHRpb25zOiBbc2hvd0luZm9Ob3RpZmljYXRpb25JbmplY3Rpb25Ub2tlbl0sXG5cbiAgaW5zdGFudGlhdGU6IChkaSkgPT4ge1xuICAgIGNvbnN0IG1vZGVsID0gZGkuaW5qZWN0KHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUpKCk7XG4gICAgY29uc3Qgc2hvd0luZm9Ob3RpZmljYXRpb24gPSBkaS5pbmplY3Qoc2hvd0luZm9Ob3RpZmljYXRpb25JbmplY3Rpb25Ub2tlbikoKTtcblxuICAgIHJldHVybiAoKSA9PiBhc3luYyAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBub3RlID0gYXdhaXQgbW9kZWwucmVjYWxsKG5hbWUpO1xuXG4gICAgICBpZiAobm90ZSkge1xuICAgICAgICBzaG93SW5mb05vdGlmaWNhdGlvbihub3RlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxufSk7XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0YWJsZTIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHtcbiAgc2hvd0Vycm9yTm90aWZpY2F0aW9uSW5qZWN0aW9uVG9rZW4sXG4gIHNob3dTdWNjZXNzTm90aWZpY2F0aW9uSW5qZWN0aW9uVG9rZW4sXG59IGZyb20gXCJAazhzbGVucy9ub3RpZmljYXRpb25zLWNvbnRyYWN0c1wiO1xuaW1wb3J0IHsgd2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSB9IGZyb20gXCIuL3dpbmRvdy1sYXlvdXRzLW1vZGVsLmluamVjdGFibGVcIjtcblxuLy8gVGlsZXMgdGhlIHdpbmRvd3MgYXMgYSBsYXlvdXQncyB0aWxpbmcgaGFzIHRoZW0gYW5kIHNhdmVzIHRoZW0gaW50byBpdCwgdGVsbGluZyBpbiBhIG5vdGlmaWNhdGlvblxuLy8gaG93IGl0IHdlbnQsIGFzIHRoZSBkaWFsb2cgaXMgbm90IG9wZW4gdG8uXG5leHBvcnQgY29uc3Qgc2F2ZUZyb21Ib3RiYXJJbmplY3RhYmxlID0gZ2V0SW5qZWN0YWJsZTIoe1xuICBpZDogXCJ3aW5kb3ctbWFuYWdlci5zYXZlLWZyb20taG90YmFyXCIsXG4gIGNvbnN1bXB0aW9uczogW1xuICAgIHNob3dTdWNjZXNzTm90aWZpY2F0aW9uSW5qZWN0aW9uVG9rZW4sXG4gICAgc2hvd0Vycm9yTm90aWZpY2F0aW9uSW5qZWN0aW9uVG9rZW4sXG4gIF0sXG5cbiAgaW5zdGFudGlhdGU6IChkaSkgPT4ge1xuICAgIGNvbnN0IG1vZGVsID0gZGkuaW5qZWN0KHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUpKCk7XG4gICAgY29uc3Qgc2hvd1N1Y2Nlc3NOb3RpZmljYXRpb24gPSBkaS5pbmplY3QoXG4gICAgICBzaG93U3VjY2Vzc05vdGlmaWNhdGlvbkluamVjdGlvblRva2VuLFxuICAgICkoKTtcbiAgICBjb25zdCBzaG93RXJyb3JOb3RpZmljYXRpb24gPSBkaS5pbmplY3QoXG4gICAgICBzaG93RXJyb3JOb3RpZmljYXRpb25JbmplY3Rpb25Ub2tlbixcbiAgICApKCk7XG5cbiAgICByZXR1cm4gKCkgPT4gYXN5bmMgKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbW9kZWwudGlsZUFuZFNhdmVJbnRvKG5hbWUpO1xuXG4gICAgICBpZiAocmVzdWx0ID09PSBcIm5vLWxheW91dFwiKSB7XG4gICAgICAgIHNob3dFcnJvck5vdGlmaWNhdGlvbihgVGhlcmUgaXMgbm8gbGF5b3V0IGNhbGxlZCBcIiR7bmFtZX1cIiB0byBzYXZlLmApO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPT09IFwibm90LXRpbGVkXCIpIHtcbiAgICAgICAgc2hvd0Vycm9yTm90aWZpY2F0aW9uKFxuICAgICAgICAgIGBDb3VsZCBub3QgdGlsZSB0aGUgd2luZG93cywgc28gbm90aGluZyB3YXMgc2F2ZWQgaW50byBcIiR7bmFtZX1cIi4gJHttb2RlbC5zdGF0dXMuZ2V0KCkgPz8gXCJcIn1gLnRyaW0oKSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dTdWNjZXNzTm90aWZpY2F0aW9uKFxuICAgICAgICAgIGBUaWxlZCBhbmQgc2F2ZWQgJHtyZXN1bHR9IHdpbmRvdyR7cmVzdWx0ID09PSAxID8gXCJcIiA6IFwic1wifSBpbnRvIFwiJHtuYW1lfVwiLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcbiAgfSxcbn0pO1xuIiwgImltcG9ydCB7IGdldEluamVjdGFibGUyIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcbmltcG9ydCB7IHNob3dFcnJvck5vdGlmaWNhdGlvbkluamVjdGlvblRva2VuIH0gZnJvbSBcIkBrOHNsZW5zL25vdGlmaWNhdGlvbnMtY29udHJhY3RzXCI7XG5pbXBvcnQgeyB3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlIH0gZnJvbSBcIi4vd2luZG93LWxheW91dHMtbW9kZWwuaW5qZWN0YWJsZVwiO1xuXG4vLyBCcmluZ3MgYSBsYXlvdXQncyB3aW5kb3cgdG8gdGhlIGZyb250LCBvcGVuaW5nIGl0IGFnYWluIHdoZW4gbm90IG9wZW4sIHRlbGxpbmcgaW4gYSBub3RpZmljYXRpb25cbi8vIHdoZW4gaXQgY291bGQgbm90IGJlLCBhcyB0aGUgZGlhbG9nIGlzIG5vdCBvcGVuIHRvLlxuZXhwb3J0IGNvbnN0IHNob3dXaW5kb3dGcm9tSG90YmFySW5qZWN0YWJsZSA9IGdldEluamVjdGFibGUyKHtcbiAgaWQ6IFwid2luZG93LW1hbmFnZXIuc2hvdy13aW5kb3ctZnJvbS1ob3RiYXJcIixcbiAgY29uc3VtcHRpb25zOiBbc2hvd0Vycm9yTm90aWZpY2F0aW9uSW5qZWN0aW9uVG9rZW5dLFxuXG4gIGluc3RhbnRpYXRlOiAoZGkpID0+IHtcbiAgICBjb25zdCBtb2RlbCA9IGRpLmluamVjdCh3aW5kb3dMYXlvdXRzTW9kZWxJbmplY3RhYmxlKSgpO1xuICAgIGNvbnN0IHNob3dFcnJvck5vdGlmaWNhdGlvbiA9IGRpLmluamVjdChcbiAgICAgIHNob3dFcnJvck5vdGlmaWNhdGlvbkluamVjdGlvblRva2VuLFxuICAgICkoKTtcblxuICAgIHJldHVybiAoKSA9PiBhc3luYyAobmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyLCB0aXRsZTogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoKGF3YWl0IG1vZGVsLnNob3dXaW5kb3dPZihuYW1lLCBpbmRleCkpID09PSBcIm5vdC1vcGVuZWRcIikge1xuICAgICAgICBzaG93RXJyb3JOb3RpZmljYXRpb24oYENvdWxkIG5vdCBvcGVuIFwiJHt0aXRsZX1cIiBhZ2Fpbi5gKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxufSk7XG4iLCAiaW1wb3J0IHsgZ2V0Q29tbWFuZEluamVjdGFibGVCdW5jaCB9IGZyb20gXCJAazhzbGVucy9jb21tYW5kLXBhbGV0dGUtY29udHJhY3RzXCI7XG5pbXBvcnQgeyB0aWxlV2luZG93c0luamVjdGFibGUgfSBmcm9tIFwiLi4vbGF5b3V0cy90aWxlLXdpbmRvd3MuaW5qZWN0YWJsZVwiO1xuXG5leHBvcnQgY29uc3QgdGlsZVdpbmRvd3NDb21tYW5kQnVuY2ggPSBnZXRDb21tYW5kSW5qZWN0YWJsZUJ1bmNoKHtcbiAgaWQ6IFwid2luZG93LW1hbmFnZXIudGlsZS13aW5kb3dzLWNvbW1hbmRcIixcbiAgdGl0bGU6IFwiV2luZG93IExheW91dHM6IFRpbGUgd2luZG93c1wiLFxuICBhY3Rpb246IHtcbiAgICBpbnN0YW50aWF0ZTogKGRpKSA9PiB7XG4gICAgICBjb25zdCB0aWxlV2luZG93cyA9IGRpLmluamVjdCh0aWxlV2luZG93c0luamVjdGFibGUpKCk7XG5cbiAgICAgIHJldHVybiAoKSA9PiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRpbGVXaW5kb3dzKCk7XG4gICAgICB9O1xuICAgIH0sXG4gIH0sXG59KTtcbiIsICJpbXBvcnQgeyBnZXRDb21tYW5kSW5qZWN0YWJsZUJ1bmNoIH0gZnJvbSBcIkBrOHNsZW5zL2NvbW1hbmQtcGFsZXR0ZS1jb250cmFjdHNcIjtcbmltcG9ydCB7IG9wZW5XaW5kb3dMYXlvdXRzSW5qZWN0YWJsZSB9IGZyb20gXCIuL29wZW4td2luZG93LWxheW91dHMuaW5qZWN0YWJsZVwiO1xuXG5leHBvcnQgY29uc3Qgd2luZG93TGF5b3V0c0NvbW1hbmRCdW5jaCA9IGdldENvbW1hbmRJbmplY3RhYmxlQnVuY2goe1xuICBpZDogXCJ3aW5kb3ctbWFuYWdlci53aW5kb3ctbGF5b3V0c1wiLFxuICB0aXRsZTogXCJXaW5kb3cgTGF5b3V0czogU2F2ZSBvciByZWNhbGwgYSBsYXlvdXRcIixcbiAgYWN0aW9uOiB7XG4gICAgaW5zdGFudGlhdGU6IChkaSkgPT4gKCkgPT4gZGkuaW5qZWN0KG9wZW5XaW5kb3dMYXlvdXRzSW5qZWN0YWJsZSkoKSxcbiAgfSxcbn0pO1xuIiwgImltcG9ydCB7XG4gIGdldEluamVjdGFibGUyLFxuICBpbnN0YW5jZVB1cmdlQ2FsbGJhY2tUb2tlbixcbn0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcbmltcG9ydCB7IHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUgfSBmcm9tIFwiLi93aW5kb3ctbGF5b3V0cy1tb2RlbC5pbmplY3RhYmxlXCI7XG5cbi8vIFN0b3BzIHRoZSByZWFjdGlvbnMgYW5kIHRpbWVycyBvZiB0aGUgbW9kZWwgYXMgaXQgaXMgdGhyb3duIGF3YXksIGFzIHdoZW4gdGhlIGV4dGVuc2lvbiBpc1xuLy8gcmVidWlsdCwgZGlzYWJsZWQgb3IgdW5pbnN0YWxsZWQsIHNvIHRoYXQgbm9uZSBvZiB0aGVtIG91dGxpdmVzIGl0LiBJdHMgZmlsZSBzb3J0cyBhZnRlciB0aGVcbi8vIG1vZGVsJ3MsIHNvIHRoYXQgaXQgaXMgcmVnaXN0ZXJlZCBhZnRlciB0aGUgbW9kZWwgYW5kIHN0aWxsIGlzIHdoZW4gdGhlIG1vZGVsIGxlYXZlcy5cbmV4cG9ydCBjb25zdCBkaXNwb3NlV2luZG93TGF5b3V0c01vZGVsSW5qZWN0YWJsZSA9IGdldEluamVjdGFibGUyKHtcbiAgaWQ6IFwid2luZG93LW1hbmFnZXIuZGlzcG9zZS13aW5kb3ctbGF5b3V0cy1tb2RlbFwiLFxuICBpbmplY3Rpb25Ub2tlbjogaW5zdGFuY2VQdXJnZUNhbGxiYWNrVG9rZW4uZm9yKHdpbmRvd0xheW91dHNNb2RlbEluamVjdGFibGUpLFxuXG4gIGluc3RhbnRpYXRlOlxuICAgICgpID0+XG4gICAgKCkgPT5cbiAgICAoeyBpbnN0YW5jZSB9KSA9PiB7XG4gICAgICBpbnN0YW5jZS5kaXNwb3NlKCk7XG5cbiAgICAgIC8vIFJlcXVpcmVkIGJ5IHRoZSB0eXBlIG9ubHk6IHdoYXQgdGhlIGNhbGxiYWNrIHJldHVybnMgaXMgbm90IHVzZWQuXG4gICAgICByZXR1cm4gKCkgPT4gaW5zdGFuY2U7XG4gICAgfSxcbn0pO1xuIiwgImltcG9ydCB7IEJ1dHRvbiB9IGZyb20gXCJAazhzbGVucy9lbGVtZW50LWNvbXBvbmVudHNcIjtcbmltcG9ydCB7IERhc2hib2FyZEljb24gfSBmcm9tIFwiQGs4c2xlbnMvaWNvblwiO1xuaW1wb3J0IHsgZ2V0SW5qZWN0YWJsZTIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgc3RhdHVzQmFySXRlbUluamVjdGlvblRva2VuIH0gZnJvbSBcIkBrOHNsZW5zL3N0YXR1cy1iYXItY29udHJhY3RzXCI7XG5pbXBvcnQgeyB1c2VJbmplY3QgfSBmcm9tIFwiQGs4c2xlbnMvdXNlLWluamVjdFwiO1xuaW1wb3J0IHsgb3BlbldpbmRvd0xheW91dHNJbmplY3RhYmxlIH0gZnJvbSBcIi4vb3Blbi13aW5kb3ctbGF5b3V0cy5pbmplY3RhYmxlXCI7XG5cbmNvbnN0IFdpbmRvd0xheW91dHNTdGF0dXNCYXJCdXR0b24gPSAoKSA9PiB7XG4gIGNvbnN0IG9wZW5XaW5kb3dMYXlvdXRzID0gdXNlSW5qZWN0KG9wZW5XaW5kb3dMYXlvdXRzSW5qZWN0YWJsZSkoKTtcblxuICByZXR1cm4gKFxuICAgIDxCdXR0b25cbiAgICAgICRmbGV4PXt7IGRpcmVjdGlvbjogXCJob3Jpem9udGFsXCIsIGdhcDogXCJ4c1wiLCB2ZXJ0aWNhbEFsaWduOiBcImNlbnRlclwiIH19XG4gICAgICAkdG9vbHRpcD1cIlNhdmUgb3IgcmVjYWxsIGEgd2luZG93IGxheW91dFwiXG4gICAgICAkb25DbGljaz17KCkgPT4gdm9pZCBvcGVuV2luZG93TGF5b3V0cygpfVxuICAgID5cbiAgICAgIDxEYXNoYm9hcmRJY29uICRzaXplPVwic1wiIC8+XG4gICAgICBMYXlvdXRzXG4gICAgPC9CdXR0b24+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3Qgd2luZG93TGF5b3V0c1N0YXR1c0Jhckl0ZW1JbmplY3RhYmxlID0gZ2V0SW5qZWN0YWJsZTIoe1xuICBpZDogXCJ3aW5kb3ctbWFuYWdlci53aW5kb3ctbGF5b3V0cy1zdGF0dXMtYmFyLWl0ZW1cIixcbiAgaW5zdGFudGlhdGU6ICgpID0+ICgpID0+ICh7XG4gICAgQ29tcG9uZW50OiBXaW5kb3dMYXlvdXRzU3RhdHVzQmFyQnV0dG9uLFxuICAgIHBvc2l0aW9uOiBcInJpZ2h0XCIgYXMgY29uc3QsXG4gICAgb3JkZXJOdW1iZXI6IDkwLFxuICB9KSxcbiAgaW5qZWN0aW9uVG9rZW46IHN0YXR1c0Jhckl0ZW1JbmplY3Rpb25Ub2tlbixcbn0pO1xuIiwgImltcG9ydCAqIGFzIG1vZHVsZTAgZnJvbSAnLi9sYXlvdXRzL2RlbGV0ZS13aW5kb3ctbGF5b3V0LmluamVjdGFibGUudHMnO2ltcG9ydCAqIGFzIG1vZHVsZTEgZnJvbSAnLi9sYXlvdXRzL2R1cGxpY2F0ZS13aW5kb3ctbGF5b3V0LmluamVjdGFibGUudHMnO2ltcG9ydCAqIGFzIG1vZHVsZTIgZnJvbSAnLi9sYXlvdXRzL2xheW91dC1pbi1ob3RiYXIuaW5qZWN0YWJsZS50cyc7aW1wb3J0ICogYXMgbW9kdWxlMyBmcm9tICcuL2xheW91dHMvbGF5b3V0LXRpbGluZy5pbmplY3RhYmxlLnRzJztpbXBvcnQgKiBhcyBtb2R1bGU0IGZyb20gJy4vbGF5b3V0cy9wbGFjZXMtc3ViLXdpbmRvdy1raW5kLmluamVjdGFibGUudHMnO2ltcG9ydCAqIGFzIG1vZHVsZTUgZnJvbSAnLi9sYXlvdXRzL3JlY2FsbC13aW5kb3ctbGF5b3V0LmluamVjdGFibGUudHMnO2ltcG9ydCAqIGFzIG1vZHVsZTYgZnJvbSAnLi9sYXlvdXRzL3JlbmFtZS13aW5kb3ctbGF5b3V0LmluamVjdGFibGUudHMnO2ltcG9ydCAqIGFzIG1vZHVsZTcgZnJvbSAnLi9sYXlvdXRzL3Jlb3BlbmluZy1vZi1jbG9zZWQtd2luZG93LmluamVjdGFibGUudHMnO2ltcG9ydCAqIGFzIG1vZHVsZTggZnJvbSAnLi9sYXlvdXRzL3NhdmUtd2luZG93LWxheW91dC5pbmplY3RhYmxlLnRzJztpbXBvcnQgKiBhcyBtb2R1bGU5IGZyb20gJy4vbGF5b3V0cy9zYXZlZC13aW5kb3ctbGF5b3V0cy5pbmplY3RhYmxlLnRzJztpbXBvcnQgKiBhcyBtb2R1bGUxMCBmcm9tICcuL2xheW91dHMvdGlsZS13aW5kb3dzLmluamVjdGFibGUudHMnO2ltcG9ydCAqIGFzIG1vZHVsZTExIGZyb20gJy4vbGF5b3V0cy90aWxpbmctcGxhbi5pbmplY3RhYmxlLnRzJztpbXBvcnQgKiBhcyBtb2R1bGUxMiBmcm9tICcuL2xheW91dHMvd2luZG93LWxheW91dC1saXN0LmluamVjdGFibGUudHMnO2ltcG9ydCAqIGFzIG1vZHVsZTEzIGZyb20gJy4vbGF5b3V0cy93aW5kb3ctbGluZWFnZS5pbmplY3RhYmxlLnRzJztpbXBvcnQgKiBhcyBtb2R1bGUxNCBmcm9tICcuL2xheW91dHMvd2luZG93LXJlb3BlbmluZ3MuaW5qZWN0YWJsZS50cyc7aW1wb3J0ICogYXMgbW9kdWxlMTUgZnJvbSAnLi91aS9kZWxldGUtbGF5b3V0LW1vZGFsLmluamVjdGFibGUudHN4JztpbXBvcnQgKiBhcyBtb2R1bGUxNiBmcm9tICcuL3VpL2xheW91dC1ob3RiYXItaXRlbS5pbmplY3RhYmxlLnRzeCc7aW1wb3J0ICogYXMgbW9kdWxlMTcgZnJvbSAnLi91aS9sYXlvdXQtaG90YmFyLW1lbnUuaW5qZWN0YWJsZS50c3gnO2ltcG9ydCAqIGFzIG1vZHVsZTE4IGZyb20gJy4vdWkvbmV3LXdpbmRvdy1tZW51LmluamVjdGFibGUudHN4JztpbXBvcnQgKiBhcyBtb2R1bGUxOSBmcm9tICcuL3VpL29wZW4td2luZG93LWxheW91dHMuaW5qZWN0YWJsZS50cyc7aW1wb3J0ICogYXMgbW9kdWxlMjAgZnJvbSAnLi91aS9yZWNhbGwtZnJvbS1ob3RiYXIuaW5qZWN0YWJsZS50cyc7aW1wb3J0ICogYXMgbW9kdWxlMjEgZnJvbSAnLi91aS9zYXZlLWZyb20taG90YmFyLmluamVjdGFibGUudHMnO2ltcG9ydCAqIGFzIG1vZHVsZTIyIGZyb20gJy4vdWkvc2hvdy13aW5kb3ctZnJvbS1ob3RiYXIuaW5qZWN0YWJsZS50cyc7aW1wb3J0ICogYXMgbW9kdWxlMjMgZnJvbSAnLi91aS90aWxlLXdpbmRvd3MtY29tbWFuZC5pbmplY3RhYmxlLnRzJztpbXBvcnQgKiBhcyBtb2R1bGUyNCBmcm9tICcuL3VpL3dpbmRvdy1sYXlvdXRzLWNvbW1hbmQuaW5qZWN0YWJsZS50cyc7aW1wb3J0ICogYXMgbW9kdWxlMjUgZnJvbSAnLi91aS93aW5kb3ctbGF5b3V0cy1tb2RhbC5pbmplY3RhYmxlLnRzeCc7aW1wb3J0ICogYXMgbW9kdWxlMjYgZnJvbSAnLi91aS93aW5kb3ctbGF5b3V0cy1tb2RlbC5pbmplY3RhYmxlLnRzJztpbXBvcnQgKiBhcyBtb2R1bGUyNyBmcm9tICcuL3VpL3dpbmRvdy1sYXlvdXRzLW1vZGVsLnB1cmdlLmluamVjdGFibGUudHMnO2ltcG9ydCAqIGFzIG1vZHVsZTI4IGZyb20gJy4vdWkvd2luZG93LWxheW91dHMtc3RhdHVzLWJhci1pdGVtLmluamVjdGFibGUudHN4J1xuXG5jb25zdCBtb2R1bGVzID0gW21vZHVsZTAsbW9kdWxlMSxtb2R1bGUyLG1vZHVsZTMsbW9kdWxlNCxtb2R1bGU1LG1vZHVsZTYsbW9kdWxlNyxtb2R1bGU4LG1vZHVsZTksbW9kdWxlMTAsbW9kdWxlMTEsbW9kdWxlMTIsbW9kdWxlMTMsbW9kdWxlMTQsbW9kdWxlMTUsbW9kdWxlMTYsbW9kdWxlMTcsbW9kdWxlMTgsbW9kdWxlMTksbW9kdWxlMjAsbW9kdWxlMjEsbW9kdWxlMjIsbW9kdWxlMjMsbW9kdWxlMjQsbW9kdWxlMjUsbW9kdWxlMjYsbW9kdWxlMjcsbW9kdWxlMjhdO1xuXG5leHBvcnQgZGVmYXVsdCBtb2R1bGVzO1xuZXhwb3J0IGNvbnN0IGZpbGVuYW1lcyA9IFsnbGF5b3V0cy9kZWxldGUtd2luZG93LWxheW91dC5pbmplY3RhYmxlLnRzJywnbGF5b3V0cy9kdXBsaWNhdGUtd2luZG93LWxheW91dC5pbmplY3RhYmxlLnRzJywnbGF5b3V0cy9sYXlvdXQtaW4taG90YmFyLmluamVjdGFibGUudHMnLCdsYXlvdXRzL2xheW91dC10aWxpbmcuaW5qZWN0YWJsZS50cycsJ2xheW91dHMvcGxhY2VzLXN1Yi13aW5kb3cta2luZC5pbmplY3RhYmxlLnRzJywnbGF5b3V0cy9yZWNhbGwtd2luZG93LWxheW91dC5pbmplY3RhYmxlLnRzJywnbGF5b3V0cy9yZW5hbWUtd2luZG93LWxheW91dC5pbmplY3RhYmxlLnRzJywnbGF5b3V0cy9yZW9wZW5pbmctb2YtY2xvc2VkLXdpbmRvdy5pbmplY3RhYmxlLnRzJywnbGF5b3V0cy9zYXZlLXdpbmRvdy1sYXlvdXQuaW5qZWN0YWJsZS50cycsJ2xheW91dHMvc2F2ZWQtd2luZG93LWxheW91dHMuaW5qZWN0YWJsZS50cycsJ2xheW91dHMvdGlsZS13aW5kb3dzLmluamVjdGFibGUudHMnLCdsYXlvdXRzL3RpbGluZy1wbGFuLmluamVjdGFibGUudHMnLCdsYXlvdXRzL3dpbmRvdy1sYXlvdXQtbGlzdC5pbmplY3RhYmxlLnRzJywnbGF5b3V0cy93aW5kb3ctbGluZWFnZS5pbmplY3RhYmxlLnRzJywnbGF5b3V0cy93aW5kb3ctcmVvcGVuaW5ncy5pbmplY3RhYmxlLnRzJywndWkvZGVsZXRlLWxheW91dC1tb2RhbC5pbmplY3RhYmxlLnRzeCcsJ3VpL2xheW91dC1ob3RiYXItaXRlbS5pbmplY3RhYmxlLnRzeCcsJ3VpL2xheW91dC1ob3RiYXItbWVudS5pbmplY3RhYmxlLnRzeCcsJ3VpL25ldy13aW5kb3ctbWVudS5pbmplY3RhYmxlLnRzeCcsJ3VpL29wZW4td2luZG93LWxheW91dHMuaW5qZWN0YWJsZS50cycsJ3VpL3JlY2FsbC1mcm9tLWhvdGJhci5pbmplY3RhYmxlLnRzJywndWkvc2F2ZS1mcm9tLWhvdGJhci5pbmplY3RhYmxlLnRzJywndWkvc2hvdy13aW5kb3ctZnJvbS1ob3RiYXIuaW5qZWN0YWJsZS50cycsJ3VpL3RpbGUtd2luZG93cy1jb21tYW5kLmluamVjdGFibGUudHMnLCd1aS93aW5kb3ctbGF5b3V0cy1jb21tYW5kLmluamVjdGFibGUudHMnLCd1aS93aW5kb3ctbGF5b3V0cy1tb2RhbC5pbmplY3RhYmxlLnRzeCcsJ3VpL3dpbmRvdy1sYXlvdXRzLW1vZGVsLmluamVjdGFibGUudHMnLCd1aS93aW5kb3ctbGF5b3V0cy1tb2RlbC5wdXJnZS5pbmplY3RhYmxlLnRzJywndWkvd2luZG93LWxheW91dHMtc3RhdHVzLWJhci1pdGVtLmluamVjdGFibGUudHN4J11cbiIsICJpbXBvcnQgKiBhcyBtb2R1bGUwIGZyb20gJy4vdWkvaWNvbi1idXR0b24uc2Nzcyc7aW1wb3J0ICogYXMgbW9kdWxlMSBmcm9tICcuL3VpL2xheW91dC1saXN0Lm1vZHVsZS5zY3NzJztpbXBvcnQgKiBhcyBtb2R1bGUyIGZyb20gJy4vdWkvdGlsaW5nLWVkaXRvci5tb2R1bGUuc2NzcydcblxuY29uc3QgbW9kdWxlcyA9IFttb2R1bGUwLG1vZHVsZTEsbW9kdWxlMl07XG5cbmV4cG9ydCBkZWZhdWx0IG1vZHVsZXM7XG5leHBvcnQgY29uc3QgZmlsZW5hbWVzID0gWyd1aS9pY29uLWJ1dHRvbi5zY3NzJywndWkvbGF5b3V0LWxpc3QubW9kdWxlLnNjc3MnLCd1aS90aWxpbmctZWRpdG9yLm1vZHVsZS5zY3NzJ11cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLDBCQUdPOzs7QUNIUDtBQUFBO0FBQUE7QUFBQTtBQUFBLHdCQUErQjtBQUMvQixrQkFBNEI7OztBQ0Q1QjtBQUFBO0FBQUE7QUFBQTtBQUFBLG1DQUFpRDtBQTJEMUMsSUFBTSw4QkFBMEIsK0RBR3JDLEVBQUU7QUFBQTtBQUFBO0FBQUEsRUFHRixJQUFJO0FBQ04sQ0FBQzs7O0FEOURNLElBQU0sbUNBQStCLGtDQUFlO0FBQUEsRUFDekQsSUFBSTtBQUFBLEVBRUosYUFBYSxDQUFDLE9BQU87QUFDbkIsVUFBTSxrQkFBa0IsR0FBRyxPQUFPLHdCQUF3QixXQUFXO0FBRXJFLFdBQU8sTUFBTSxPQUFPLFNBQWlCO0FBQ25DLFlBQU0sZUFBZSxNQUFNLGdCQUFnQjtBQUUzQyxtQ0FBWSxNQUFNLGFBQWEsT0FBTyxJQUFJLENBQUM7QUFBQSxJQUM3QztBQUFBLEVBQ0Y7QUFDRixDQUFDOzs7QUVoQkQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUFBQSxxQkFBK0I7QUFDL0IsSUFBQUMsZUFBNEI7QUFJNUIsSUFBTSxXQUFXLENBQUMsTUFBYyxVQUFxQztBQUNuRSxRQUFNLE9BQU8sR0FBRyxJQUFJO0FBQ3BCLE1BQUksU0FBUztBQUViLFNBQU8sTUFBTSxXQUFXLElBQUksT0FBTyxHQUFHLElBQUksSUFBSSxNQUFNLEVBQUUsR0FBRztBQUN2RDtBQUFBLEVBQ0Y7QUFFQSxTQUFPLFdBQVcsSUFBSSxPQUFPLEdBQUcsSUFBSSxJQUFJLE1BQU07QUFDaEQ7QUFJTyxJQUFNLHNDQUFrQyxtQ0FBZTtBQUFBLEVBQzVELElBQUk7QUFBQSxFQUVKLGFBQWEs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Q0FBUyxnQ0FBUyx1Q0FBUyxtQ0FBUyxzQ0FBUyx3Q0FBUyx1Q0FBUyx1Q0FBUyxvQ0FBUyx3Q0FBUyx1Q0FBUyxxQ0FBUyw0Q0FBUyx5Q0FBUywyQ0FBUyx5Q0FBUyx5Q0FBUywrQ0FBUyxpREFBUTtBQUUzUSxJQUFPLDZDQUFROzs7QUNGZixJQUFNQyxXQUFVLENBQUMscUJBQVEsNEJBQVEsNEJBQU87QUFFeEMsSUFBTyw0Q0FBUUE7OztBM0NHUixJQUFNLGtDQUE4QixnQ0FBVztBQUFBLEVBQ3BELElBQUk7QUFBQSxFQUNKLFVBQVUsQ0FBQyxPQUFPO0FBT2hCLDREQUErQixJQUFJO0FBQUEsTUFDakMsR0FBRztBQUFBLE1BQ0gsR0FBRztBQUFBLElBQ0wsQ0FBQztBQUFBLEVBQ0g7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfaW5qZWN0YWJsZSIsICJpbXBvcnRfbW9ieCIsICJpbXBvcnRfaW5qZWN0YWJsZSIsICJpbXBvcnRfaW5qZWN0YWJsZSIsICJpbXBvcnRfd2luZG93X2xheW91dF9jb250cmFjdHMiLCAiaW1wb3J0X21vYngiLCAiaW1wb3J0X21lc3NhZ2luZ19jb250cmFjdHMiLCAid2luZG93IiwgImRpc3BsYXkiLCAibWlzc2luZyIsICJ3aW5kb3ciLCAiaXNNYXRjaCIsICJpbXBvcnRfaW5qZWN0YWJsZSIsICJpbXBvcnRfcGVyc2lzdGFibGVfY29udHJhY3RzIiwgImltcG9ydF9tb2J4IiwgIndpbmRvdyIsICJpbXBvcnRfcGVyc2lzdGFibGVfY29udHJhY3RzIiwgIndpbmRvdyIsICJpbXBvcnRfaW5qZWN0YWJsZSIsICJpbXBvcnRfbW9ieCIsICJpbXBvcnRfd2luZG93X2xheW91dF9jb250cmFjdHMiLCAid2luZG93IiwgIl9hIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9tb2J4IiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF93aW5kb3dfbGF5b3V0X2NvbnRyYWN0cyIsICJpbXBvcnRfcGVyc2lzdGFibGVfY29udHJhY3RzIiwgIndpbmRvdyIsICJpbXBvcnRfaW5qZWN0YWJsZSIsICJpbXBvcnRfd2luZG93X2xheW91dF9jb250cmFjdHMiLCAiaW1wb3J0X21lc3NhZ2luZ19jb250cmFjdHMiLCAiaW1wb3J0X21vYngiLCAid2luZG93IiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF93aW5kb3dfbGF5b3V0X2NvbnRyYWN0cyIsICJ3aW5kb3ciLCAiaW1wb3J0X2luamVjdGFibGUiLCAiaW1wb3J0X21vYngiLCAiaW1wb3J0X2VsZW1lbnRfY29tcG9uZW50cyIsICJpbXBvcnRfaG90YmFyX2NvbnRyYWN0cyIsICJpbXBvcnRfaWNvbiIsICJpbXBvcnRfZHJvcF9kb3duX21lbnVfY29udHJhY3RzIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF91c2VfaW5qZWN0IiwgImltcG9ydF9tb2J4X3JlYWN0IiwgImltcG9ydF9kcm9wX2Rvd25fbWVudV9jb250cmFjdHMiLCAiaW1wb3J0X2Ryb3BfZG93bl9tZW51X2l0ZW1zIiwgImltcG9ydF9lbGVtZW50X2NvbXBvbmVudHMiLCAiaW1wb3J0X2ljb24iLCAiaW1wb3J0X3VzZV9pbmplY3QiLCAiaW1wb3J0X21vYnhfcmVhY3QiLCAiaW1wb3J0X21lc3NhZ2luZ19jb250cmFjdHMiLCAiZGlzcGxheSIsICJ0aXRsZU9mIiwgIl9hIiwgImltcG9ydF9lbGVtZW50X2NvbXBvbmVudHMiLCAiaW1wb3J0X2pzeF9ydW50aW1lIiwgIndpbmRvdyIsICJpbXBvcnRfaW5qZWN0YWJsZSIsICJpbXBvcnRfbW9kYWxfY29udHJhY3RzIiwgImltcG9ydF9lbGVtZW50X2NvbXBvbmVudHMiLCAiaW1wb3J0X2lucHV0X2NvbXBvbmVudHMiLCAiaW1wb3J0X21vZGFsX2NvbXBvbmVudHMiLCAiaW1wb3J0X21vZGFsX2NvbnRyYWN0cyIsICJpbXBvcnRfaWNvbiIsICJzdHlsZXNoZWV0IiwgImltcG9ydF9zdHlsZXNoZWV0X2NvbnRyYWN0cyIsICJpbXBvcnRfdXNlX2luamVjdCIsICJpbXBvcnRfbW9ieF9yZWFjdCIsICJpbXBvcnRfcmVhY3QiLCAiaW1wb3J0X2VsZW1lbnRfY29tcG9uZW50cyIsICJpbXBvcnRfZHJvcF9kb3duX21lbnVfY29udHJhY3RzIiwgImltcG9ydF9pY29uIiwgImltcG9ydF9pbnB1dF9jb21wb25lbnRzIiwgImltcG9ydF9tZXNzYWdpbmdfY29udHJhY3RzIiwgImltcG9ydF91c2VfaW5qZWN0IiwgImltcG9ydF9tb2J4X3JlYWN0IiwgImltcG9ydF9yZWFjdCIsICJzdHlsZXNoZWV0IiwgImltcG9ydF9zdHlsZXNoZWV0X2NvbnRyYWN0cyIsICJpbXBvcnRfZWxlbWVudF9jb21wb25lbnRzIiwgImltcG9ydF9pbnB1dF9jb21wb25lbnRzIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9tb2J4IiwgImltcG9ydF9uYXZpZ2F0aW9uX2NvbnRyYWN0cyIsICJpbXBvcnRfcmVhY3QiLCAiaW1wb3J0X2luamVjdGFibGUiLCAiaW1wb3J0X21lc3NhZ2luZ19jb250cmFjdHMiLCAiaW1wb3J0X21vZGFsX2NvbnRyYWN0cyIsICJpbXBvcnRfd2luZG93X2xheW91dF9jb250cmFjdHMiLCAiaW1wb3J0X2NsdXN0ZXJfY29udHJhY3RzIiwgImltcG9ydF9zdWJfd2luZG93X2NvbnRyYWN0cyIsICJpbXBvcnRfbW9ieCIsICJpbXBvcnRfcGxhY2Vfc3ViX3dpbmRvd19jb250cmFjdHMiLCAicGx1cmFsIiwgIndpbmRvdyIsICJfYSIsICJpbXBvcnRfanN4X3J1bnRpbWUiLCAiaW1wb3J0X2pzeF9ydW50aW1lIiwgImdhcCIsICJ3aW5kb3ciLCAidGl0bGVPZiIsICJwbHVyYWwiLCAib2JzZXJ2ZXIiLCAibmV4dCIsICJpbXBvcnRfanN4X3J1bnRpbWUiLCAicGx1cmFsIiwgIk91dE9mRGF0ZU1vZGFsIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9ub3RpZmljYXRpb25zX2NvbnRyYWN0cyIsICJpbXBvcnRfaW5qZWN0YWJsZSIsICJpbXBvcnRfbm90aWZpY2F0aW9uc19jb250cmFjdHMiLCAiaW1wb3J0X2pzeF9ydW50aW1lIiwgImltcG9ydF9qc3hfcnVudGltZSIsICJpbXBvcnRfY29tbWFuZF9wYWxldHRlX2NvbnRyYWN0cyIsICJpbXBvcnRfaW5qZWN0YWJsZSIsICJpbXBvcnRfZWxlbWVudF9jb21wb25lbnRzIiwgImltcG9ydF9pY29uIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF91c2VfaW5qZWN0IiwgImltcG9ydF9qc3hfcnVudGltZSIsICJtb2R1bGVzIl0KfQo=
|