diff --git a/src/Aardvark.UI.Primitives/Golden/GoldenLayout.fs b/src/Aardvark.UI.Primitives/Golden/GoldenLayout.fs index 929c878f..7f63c5d0 100644 --- a/src/Aardvark.UI.Primitives/Golden/GoldenLayout.fs +++ b/src/Aardvark.UI.Primitives/Golden/GoldenLayout.fs @@ -27,6 +27,10 @@ module LayoutConfig = DragToNewWindow = true HeaderButtons = Buttons.All SetPopoutTitle = true + MinItemWidth = 20 + MinItemHeight = 20 + DragProxyWidth = 300 + DragProxyHeight = 200 LabelMinimize = "Minimize" LabelMaximize = "Maximize" LabelPopOut = "Open in new window" @@ -67,6 +71,7 @@ module Builders = Closable = true Header = Some Header.Top Buttons = None + MinSize = None Size = Size.Weight 1 KeepAlive = true } @@ -96,6 +101,11 @@ module Builders = member inline x.Buttons(e : Element, buttons : Buttons) = { e with Buttons = Some buttons } + /// Minimum size (in pixels) of the element in any dimension. + [] + member inline x.MinSize(e : Element, sizeInPixels : int) = + { e with MinSize = Some sizeInPixels } + /// Size of the element in case the parent is a row or column container. [] member inline x.Size(e : Element, size : Size) = @@ -297,6 +307,10 @@ module GoldenLayoutApp = o.["header"] <- ofHeader config e.Buttons e.Header o.["size"] <- JToken.op_Implicit (string e.Size) + match e.MinSize with + | Some s -> o.["minSize"] <- JToken.op_Implicit $"%d{s}px" + | _ -> () + let s = JObject() s.["keepAlive"] <- JToken.op_Implicit e.KeepAlive o.["componentState"] <- s @@ -335,10 +349,19 @@ module GoldenLayoutApp = o.["setPopoutTitle"] <- JToken.op_Implicit config.SetPopoutTitle o + let ofConfigDimensions (config : LayoutConfig) = + let o = JObject() + o.["defaultMinItemWidth"] <- JToken.op_Implicit $"{config.MinItemWidth}px" + o.["defaultMinItemHeight"] <- JToken.op_Implicit $"{config.MinItemHeight}px" + o.["dragProxyWidth"] <- JToken.op_Implicit config.DragProxyWidth + o.["dragProxyHeight"] <- JToken.op_Implicit config.DragProxyHeight + o + let ofLayoutConfig (config : LayoutConfig) (layout : Layout) = let o = JObject() o.["root"] <- JObject.ofLayout config layout o.["settings"] <- JObject.ofConfigSettings config + o.["dimensions"] <- JObject.ofConfigDimensions config o.["header"] <- JObject.ofConfigLabels config o.ToString Formatting.None diff --git a/src/Aardvark.UI.Primitives/Golden/GoldenLayoutModel.fs b/src/Aardvark.UI.Primitives/Golden/GoldenLayoutModel.fs index 2fbcf7b8..f677c655 100644 --- a/src/Aardvark.UI.Primitives/Golden/GoldenLayoutModel.fs +++ b/src/Aardvark.UI.Primitives/Golden/GoldenLayoutModel.fs @@ -45,6 +45,9 @@ type Element = /// Buttons to display in the header. Buttons : Buttons option + /// Minimum size (in pixels) of the element in any dimension. + MinSize : int option + /// Size of the element in case the parent is a row or column container. Size : Size @@ -113,6 +116,18 @@ type LayoutConfig = /// Determines whether the document.title of popouts is set and updated automatically to the document.title of the main window. SetPopoutTitle : bool + /// Default minimum width (in pixels) of any item. Default is 20. + MinItemWidth : int + + /// Default minimum height (in pixels) of any item. Default is 20. + MinItemHeight : int + + /// Width (in pixels) of drag proxy elements. Default is 300. + DragProxyWidth : int + + /// Height (in pixels) of drag proxy elements. Default is 200. + DragProxyHeight : int + /// Tooltip label of minimize button. LabelMinimize : string diff --git a/src/Aardvark.UI.Primitives/resources/golden-layout/bundle/umd/golden-layout.js b/src/Aardvark.UI.Primitives/resources/golden-layout/bundle/umd/golden-layout.js index 5477cad6..80c7daae 100644 --- a/src/Aardvark.UI.Primitives/resources/golden-layout/bundle/umd/golden-layout.js +++ b/src/Aardvark.UI.Primitives/resources/golden-layout/bundle/umd/golden-layout.js @@ -2020,6 +2020,7 @@ class BrowserPopout extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.Ev } } const newContentItem = this._layoutManager.createAndInitContentItem(copiedRoot, parentItem); + index = (index !== null) ? Math.max(0, Math.min(parentItem.contentItems.length, index)) : null; parentItem.addChild(newContentItem, index); if (this._layoutManager.layoutConfig.settings.popInOnClose) { this._onClose(); @@ -3655,7 +3656,7 @@ class TabsContainer { // this will always succeed this.tryUpdateTabSizes(dropDownActive, availableWidth, activeComponentItem); } - this._element.style.maxWidth = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_2__.numberToPixels)(availableWidth); + this._element.style.maxWidth = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_2__.numberToPixels)(Math.max(0, availableWidth)); if (dropDownActive !== this._dropdownActive) { this._dropdownActive = dropDownActive; this._dropdownActiveChangedEvent(); @@ -5857,15 +5858,22 @@ class RowOrColumn extends _content_item__WEBPACK_IMPORTED_MODULE_0__.ContentItem } } /** - * Gets the minimum dimensions for the given item configuration array + * Gets the minimum dimensions for the given item taking its children into consideration. * @internal */ - calculateContentItemsTotalMinSize(contentItems) { - let totalMinSize = 0; - for (const contentItem of contentItems) { - totalMinSize += this.calculateContentItemMinSize(contentItem); + calculateContentItemsTotalMinSize(contentItem) { + let childrenMinSize = 0; + for (const child of contentItem.contentItems) { + const minSize = this.calculateContentItemsTotalMinSize(child); + if (contentItem instanceof RowOrColumn && (contentItem.isColumn === this._isColumn)) { + childrenMinSize += minSize; // Probably not possible (Row inside row, or column inside column) + } + else { + childrenMinSize = Math.max(childrenMinSize, minSize); + } } - return totalMinSize; + const minSize = this.calculateContentItemMinSize(contentItem); + return Math.max(minSize, childrenMinSize); } /** * Invoked when a splitter's dragListener fires dragStart. Calculates the splitters @@ -5876,11 +5884,11 @@ class RowOrColumn extends _content_item__WEBPACK_IMPORTED_MODULE_0__.ContentItem const items = this.getSplitItems(splitter); const beforeWidth = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_4__.pixelsToNumber)(items.before.element.style[this._dimension]); const afterSize = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_4__.pixelsToNumber)(items.after.element.style[this._dimension]); - const beforeMinSize = this.calculateContentItemsTotalMinSize(items.before.contentItems); - const afterMinSize = this.calculateContentItemsTotalMinSize(items.after.contentItems); + const beforeMinSize = this.calculateContentItemsTotalMinSize(items.before); + const afterMinSize = this.calculateContentItemsTotalMinSize(items.after); this._splitterPosition = 0; - this._splitterMinPosition = -1 * (beforeWidth - beforeMinSize); - this._splitterMaxPosition = afterSize - afterMinSize; + this._splitterMinPosition = Math.min(0, -1 * (beforeWidth - beforeMinSize)); + this._splitterMaxPosition = Math.max(0, afterSize - afterMinSize); } /** * Invoked when a splitter's DragListener fires drag. Updates the splitter's DOM position, @@ -6591,11 +6599,11 @@ class Stack extends _component_parentable_item__WEBPACK_IMPORTED_MODULE_0__.Comp const dimension = this._header.leftRightSided ? _utils_types__WEBPACK_IMPORTED_MODULE_1__.WidthOrHeightPropertyName.width : _utils_types__WEBPACK_IMPORTED_MODULE_1__.WidthOrHeightPropertyName.height; content[dimension] -= this.layoutManager.layoutConfig.dimensions.headerHeight; } - this._childElementContainer.style.width = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_8__.numberToPixels)(content.width); - this._childElementContainer.style.height = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_8__.numberToPixels)(content.height); + (0,_utils_utils__WEBPACK_IMPORTED_MODULE_8__.setElementWidth)(this._childElementContainer, content.width); + (0,_utils_utils__WEBPACK_IMPORTED_MODULE_8__.setElementHeight)(this._childElementContainer, content.height); for (let i = 0; i < this.contentItems.length; i++) { - this.contentItems[i].element.style.width = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_8__.numberToPixels)(content.width); - this.contentItems[i].element.style.height = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_8__.numberToPixels)(content.height); + (0,_utils_utils__WEBPACK_IMPORTED_MODULE_8__.setElementWidth)(this.contentItems[i].element, content.width); + (0,_utils_utils__WEBPACK_IMPORTED_MODULE_8__.setElementHeight)(this.contentItems[i].element, content.height); } this.emit('resize'); this.emitStateChangedEvent(); @@ -9505,7 +9513,7 @@ function getElementWidth(element) { } /** @internal */ function setElementWidth(element, width) { - const widthAsPixels = numberToPixels(width); + const widthAsPixels = numberToPixels(Math.max(0, width)); element.style.width = widthAsPixels; } /** @internal */ @@ -9514,7 +9522,7 @@ function getElementHeight(element) { } /** @internal */ function setElementHeight(element, height) { - const heightAsPixels = numberToPixels(height); + const heightAsPixels = numberToPixels(Math.max(0, height)); element.style.height = heightAsPixels; } /** @internal */ @@ -10097,4 +10105,4 @@ __webpack_require__.r(__webpack_exports__); /******/ })() ; }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFHLHlCQUF5QixDQUFDO2lCQUN0QzthQUNKO1lBRUQsSUFBSSxnQkFBZ0IsS0FBSyxTQUFTLEVBQUU7Z0JBQ2hDLElBQUksb0NBQW9DLFlBQVksV0FBVyxFQUFFO29CQUM3RCxnQkFBZ0IsR0FBRyxvQ0FBb0MsQ0FBQztpQkFDM0Q7YUFDSjtTQUNKO1FBRUQsT0FBTztZQUNILGtDQUFrQyxFQUFFLE1BQU07WUFDMUMsV0FBVztZQUNYLGdCQUFnQjtTQUNuQixDQUFDO0lBQ04sQ0FBQztJQWhEZSxzREFBd0MsMkNBZ0R2RDtBQUNMLENBQUMsRUE3RWdCLGFBQWEsS0FBYixhQUFhLFFBNkU3Qjs7Ozs7OztVQ3ZVRDtVQUNBOztVQUVBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOzs7OztXQ3RCQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLHlDQUF5Qyx3Q0FBd0M7V0FDakY7V0FDQTtXQUNBOzs7OztXQ1BBOzs7OztXQ0FBO1dBQ0E7V0FDQTtXQUNBLHVEQUF1RCxpQkFBaUI7V0FDeEU7V0FDQSxnREFBZ0QsYUFBYTtXQUM3RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNObUM7QUFDUztBQUM0QjtBQUNYO0FBQ047QUFDVDtBQUNOO0FBQ0c7QUFDTztBQUNRO0FBQ0o7QUFDQztBQUNkO0FBQ1c7QUFDSTtBQUNSO0FBQ1I7QUFDb0I7QUFDM0I7QUFDbUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy8uL3NyYy90cy9jb25maWcvY29uZmlnLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb25maWcvcmVzb2x2ZWQtY29uZmlnLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb250YWluZXIvY29tcG9uZW50LWNvbnRhaW5lci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udHJvbHMvYnJvd3Nlci1wb3BvdXQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2NvbnRyb2xzL2RyYWctYWN0aW9uLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb250cm9scy9kcmFnLXByb3h5LnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb250cm9scy9kcmFnLXNvdXJjZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udHJvbHMvZHJvcC10YXJnZXQtaW5kaWNhdG9yLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb250cm9scy9oZWFkZXItYnV0dG9uLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb250cm9scy9oZWFkZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2NvbnRyb2xzL3NwbGl0dGVyLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb250cm9scy90YWIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2NvbnRyb2xzL3RhYnMtY29udGFpbmVyLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb250cm9scy90cmFuc2l0aW9uLWluZGljYXRvci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvZXJyb3JzL2V4dGVybmFsLWVycm9yLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9lcnJvcnMvaW50ZXJuYWwtZXJyb3IudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2dvbGRlbi1sYXlvdXQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2l0ZW1zL2NvbXBvbmVudC1pdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9pdGVtcy9jb21wb25lbnQtcGFyZW50YWJsZS1pdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9pdGVtcy9jb250ZW50LWl0ZW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2l0ZW1zL2dyb3VuZC1pdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9pdGVtcy9yb3ctb3ItY29sdW1uLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9pdGVtcy9zdGFjay50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvbGF5b3V0LW1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL3V0aWxzL2NvbmZpZy1taW5pZmllci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvdXRpbHMvZHJhZy1saXN0ZW5lci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvdXRpbHMvZXZlbnQtZW1pdHRlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvdXRpbHMvZXZlbnQtaHViLnRzIiwid2VicGFjazovLy8uL3NyYy90cy91dGlscy9pMThuLXN0cmluZ3MudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL3V0aWxzL3N0eWxlLWNvbnN0YW50cy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvdXRpbHMvdHlwZXMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL3V0aWxzL3V0aWxzLnRzIiwid2VicGFjazovLy8uL3NyYy90cy92aXJ0dWFsLWxheW91dC50cyIsIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly8vd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly8vd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly8vLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiZ29sZGVuTGF5b3V0XCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcImdvbGRlbkxheW91dFwiXSA9IGZhY3RvcnkoKTtcbn0pKGdsb2JhbFRoaXMsICgpID0+IHtcbnJldHVybiAiLCJpbXBvcnQgeyBDb25maWd1cmF0aW9uRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvZXh0ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBBc3NlcnRFcnJvciwgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yLCBVbnJlYWNoYWJsZUNhc2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IEkxOG5TdHJpbmdJZCwgaTE4blN0cmluZ3MgfSBmcm9tICcuLi91dGlscy9pMThuLXN0cmluZ3MnO1xyXG5pbXBvcnQgeyBJdGVtVHlwZSwgSnNvblZhbHVlLCBSZXNwb25zaXZlTW9kZSwgU2lkZSwgU2l6ZVVuaXRFbnVtIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQgeyBkZWVwRXh0ZW5kVmFsdWUsIHNwbGl0U3RyaW5nQXRGaXJzdE5vbk51bWVyaWNDaGFyIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5pbXBvcnQge1xyXG4gICAgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLFxyXG4gICAgUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcsXHJcbiAgICBSZXNvbHZlZEl0ZW1Db25maWcsXHJcbiAgICBSZXNvbHZlZExheW91dENvbmZpZyxcclxuICAgIFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLFxyXG4gICAgUmVzb2x2ZWRSb290SXRlbUNvbmZpZyxcclxuICAgIFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLFxyXG4gICAgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWdcclxufSBmcm9tIFwiLi9yZXNvbHZlZC1jb25maWdcIjtcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUNvbmZpZyB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSBpdGVtLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICdyb3cnLCAnY29sdW1uJywgJ3N0YWNrJywgJ2NvbXBvbmVudCcuXHJcbiAgICAgKi9cclxuICAgIHR5cGU6IEl0ZW1UeXBlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gYXJyYXkgb2YgY29uZmlndXJhdGlvbnMgZm9yIGl0ZW1zIHRoYXQgd2lsbCBiZSBjcmVhdGVkIGFzIGNoaWxkcmVuIG9mIHRoaXMgaXRlbS5cclxuICAgICAqL1xyXG4gICAgY29udGVudD86IEl0ZW1Db25maWdbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB3aWR0aCBvZiB0aGlzIGl0ZW0sIHJlbGF0aXZlIHRvIHRoZSBvdGhlciBjaGlsZHJlbiBvZiBpdHMgcGFyZW50IGluIHBlcmNlbnRcclxuICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKEl0ZW1Db25maWc6aW50ZXJmYWNlKS5zaXplfSBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIHdpZHRoPzogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1pbmltdW0gd2lkdGggb2YgdGhpcyBpdGVtIGluIHBpeGVsc1xyXG4gICAgICogQ0FVVElPTiAtIE5vdCB0ZXN0ZWQgLSBkbyBub3QgdXNlXHJcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChJdGVtQ29uZmlnOmludGVyZmFjZSkubWluU2l6ZX0gaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICBtaW5XaWR0aD86IG51bWJlcjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBoZWlnaHQgb2YgdGhpcyBpdGVtLCByZWxhdGl2ZSB0byB0aGUgb3RoZXIgY2hpbGRyZW4gb2YgaXRzIHBhcmVudCBpbiBwZXJjZW50XHJcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChJdGVtQ29uZmlnOmludGVyZmFjZSkuc2l6ZX0gaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICBoZWlnaHQ/OiBudW1iZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWluaW11bSBoZWlnaHQgb2YgdGhpcyBpdGVtIGluIHBpeGVsc1xyXG4gICAgICogQ0FVVElPTiAtIE5vdCB0ZXN0ZWQgLSBkbyBub3QgdXNlXHJcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChJdGVtQ29uZmlnOmludGVyZmFjZSkubWluU2l6ZX0gaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICBtaW5IZWlnaHQ/OiBudW1iZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc2l6ZSBvZiB0aGlzIGl0ZW0uXHJcbiAgICAgKiBGb3Igcm93cywgaXQgc3BlY2lmaWVzIGhlaWdodC4gRm9yIGNvbHVtbnMsIGl0IHNwZWNpZmllcyB3aWR0aC5cclxuICAgICAqIEhhcyBmb3JtYXQgXFw8bnVtYmVyXFw+XFw8e0BsaW5rIFNpemVVbml0fVxcPi4gQ3VycmVudGx5IG9ubHkgc3VwcG9ydHMgdW5pdHMgYGZyYCBhbmQgYCVgLlxyXG4gICAgICpcclxuICAgICAqIFNwYWNlIGlzIGZpcnN0IHByb3BvcnRpb25hbGx5IGFsbG9jYXRlZCB0byBpdGVtcyB3aXRoIHNpemVVbml0IGAlYC5cclxuICAgICAqIElmIHRoZXJlIGlzIGFueSBzcGFjZSBsZWZ0IG92ZXIgKGxlc3MgdGhhbiAxMDAlIGFsbG9jYXRlZCksIHRoZW4gdGhlXHJcbiAgICAgKiByZW1haW5kZXIgaXMgYWxsb2NhdGVkIHRvIHRoZSBpdGVtcyB3aXRoIHVuaXQgYGZyYCBhY2NvcmRpbmcgdG8gdGhlIGZyYWN0aW9uYWwgc2l6ZS5cclxuICAgICAqIElmIG1vcmUgdGhhbiAxMDAlIGlzIGFsbG9jYXRlZCwgdGhlbiBhbiBleHRyYSA1MCUgaXMgYWxsb2NhdGVkIHRvIGl0ZW1zIHdpdGggdW5pdCBgZnJgIGFuZFxyXG4gICAgICogaXMgYWxsb2NhdGVkIHRvIGVhY2ggaXRlbSBhY2NvcmRpbmcgdG8gaXRzIGZyYWN0aW9uYWwgc2l6ZS4gQWxsIGl0ZW0gc2l6ZXMgYXJlIHRoZW4gYWRqdXN0ZWRcclxuICAgICAqIHRvIGJyaW5nIHRoZSB0b3RhbCBiYWNrIHRvIDEwMCVcclxuICAgICAqL1xyXG4gICAgc2l6ZT86IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzaXplIG9mIHRoaXMgaXRlbS5cclxuICAgICAqIEZvciByb3dzLCBpdCBzcGVjaWZpZXMgaGVpZ2h0LiBGb3IgY29sdW1ucywgaXQgc3BlY2lmaWVzIHdpZHRoLlxyXG4gICAgICogSGFzIGZvcm1hdCA8bnVtYmVyPjxzaXplVW5pdD4uIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIHVuaXRzIGBweGBcclxuICAgICAqL1xyXG4gICAgbWluU2l6ZT86IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgYSBDb250ZW50SXRlbS5cclxuICAgICAqIERvIE5PVCBhc3NpZ24gYW4gYXJyYXkuICBUaGlzIG9ubHkgZXhpc3RzIGZvciBsZWdhY3kgcHVycG9zZXMuICBJZiBhbiBhcnJheSBpcyBhc3NpZ25lZCwgdGhlIGZpcnN0IGVsZW1lbnRcclxuICAgICAqIHdpbGwgYmVjb21lIHRoZSBpZC5cclxuICAgICAqL1xyXG4gICAgaWQ/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBpdGVtIGlzIGNsb3NhYmxlLiBJZiBmYWxzZSwgdGhlIHggb24gdGhlIGl0ZW1zIHRhYiB3aWxsIGJlIGhpZGRlbiBhbmQgY29udGFpbmVyLmNsb3NlKClcclxuICAgICAqIHdpbGwgcmV0dXJuIGZhbHNlXHJcbiAgICAgKiBEZWZhdWx0OiB0cnVlXHJcbiAgICAgKi9cclxuICAgIGlzQ2xvc2FibGU/OiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRpdGxlIG9mIHRoZSBpdGVtIGFzIGRpc3BsYXllZCBvbiBpdHMgdGFiIGFuZCBvbiBwb3BvdXQgd2luZG93c1xyXG4gICAgICogRGVmYXVsdDogY29tcG9uZW50VHlwZS50b1N0cmluZygpIG9yICcnXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBvbmx5IENvbXBvbmVudCBoYXMgYSB0aXRsZVxyXG4gICAgICovXHJcbiAgICB0aXRsZT86IHN0cmluZztcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBJdGVtQ29uZmlnIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBjb25zdCBlbnVtIFNpemVXaWR0aEhlaWdodFNwZWNpZmljYXRpb25UeXBlIHtcclxuICAgICAgICBOb25lLFxyXG4gICAgICAgIFNpemUsXHJcbiAgICAgICAgV2lkdGhPckhlaWdodCxcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShpdGVtQ29uZmlnOiBJdGVtQ29uZmlnLCByb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0OiBib29sZWFuKTogUmVzb2x2ZWRJdGVtQ29uZmlnIHtcclxuICAgICAgICBzd2l0Y2ggKGl0ZW1Db25maWcudHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmdyb3VuZDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoJ0l0ZW1Db25maWcgY2Fubm90IHNwZWNpZnkgdHlwZSBncm91bmQnLCBKU09OLnN0cmluZ2lmeShpdGVtQ29uZmlnKSk7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUucm93OlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbHVtbjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBSb3dPckNvbHVtbkl0ZW1Db25maWcucmVzb2x2ZShpdGVtQ29uZmlnIGFzIFJvd09yQ29sdW1uSXRlbUNvbmZpZywgcm93QW5kQ29sdW1uQ2hpbGRMZWdhY3lTaXplRGVmYXVsdCk7XHJcblxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnN0YWNrOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0YWNrSXRlbUNvbmZpZy5yZXNvbHZlKGl0ZW1Db25maWcgYXMgU3RhY2tJdGVtQ29uZmlnLCByb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0KTtcclxuXHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29tcG9uZW50OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIENvbXBvbmVudEl0ZW1Db25maWcucmVzb2x2ZShpdGVtQ29uZmlnIGFzIENvbXBvbmVudEl0ZW1Db25maWcsIHJvd0FuZENvbHVtbkNoaWxkTGVnYWN5U2l6ZURlZmF1bHQpO1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlYWNoYWJsZUNhc2VFcnJvcignVUNVSUNSNTU0OTknLCBpdGVtQ29uZmlnLnR5cGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNvbnRlbnQoY29udGVudDogSXRlbUNvbmZpZ1tdIHwgdW5kZWZpbmVkKTogUmVzb2x2ZWRJdGVtQ29uZmlnW10ge1xyXG4gICAgICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gY29udGVudC5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxSZXNvbHZlZEl0ZW1Db25maWc+KGNvdW50KTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBJdGVtQ29uZmlnLnJlc29sdmUoY29udGVudFtpXSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlSWQoaWQ6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcclxuICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLmlkO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGlkKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlkLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuaWQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpZFswXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVNpemUoXHJcbiAgICAgICAgc2l6ZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIHdpZHRoOiBudW1iZXIgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgaGVpZ2h0OiBudW1iZXIgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgcm93QW5kQ29sdW1uQ2hpbGRMZWdhY3lTaXplRGVmYXVsdDogYm9vbGVhbik6XHJcbiAgICBTaXplV2l0aFVuaXQge1xyXG4gICAgICAgIC8vIFJlbW92ZSBzdXBwb3J0IGZvciByb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0IGluIGEgbWFqb3IgdmVyc2lvbiByZWxlYXNlXHJcblxyXG4gICAgICAgIGlmIChzaXplICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlU2l6ZShzaXplLCBbU2l6ZVVuaXRFbnVtLlBlcmNlbnQsIFNpemVVbml0RW51bS5GcmFjdGlvbmFsXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHdpZHRoICE9PSB1bmRlZmluZWQgfHwgaGVpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmICh3aWR0aCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc2l6ZTogd2lkdGgsIHNpemVVbml0OiBTaXplVW5pdEVudW0uUGVyY2VudCB9O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaGVpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc2l6ZTogaGVpZ2h0LCBzaXplVW5pdDogU2l6ZVVuaXRFbnVtLlBlcmNlbnQgfTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdDUlMzMzM5MCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChyb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc2l6ZTogNTAsIHNpemVVbml0OiBTaXplVW5pdEVudW0uUGVyY2VudCB9O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzaXplOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuc2l6ZSwgc2l6ZVVuaXQ6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5zaXplVW5pdCB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTWluU2l6ZShtaW5TaXplOiBzdHJpbmcgfCB1bmRlZmluZWQsIG1pbldpZHRoOiBudW1iZXIgfCB1bmRlZmluZWQsIG1pbkhlaWdodDogbnVtYmVyIHwgdW5kZWZpbmVkKTogVW5kZWZpbmFibGVTaXplV2l0aFVuaXQge1xyXG4gICAgICAgIGlmIChtaW5TaXplICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlU2l6ZShtaW5TaXplLCBbU2l6ZVVuaXRFbnVtLlBpeGVsXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgbWluV2lkdGhEZWZpbmVkID0gbWluV2lkdGggIT09IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgY29uc3QgbWluSGVpZ2h0RGVmaW5lZCA9IG1pbkhlaWdodCAhPT0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBpZiAobWluV2lkdGhEZWZpbmVkIHx8IG1pbkhlaWdodERlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtaW5XaWR0aERlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzaXplOiBtaW5XaWR0aCwgc2l6ZVVuaXQ6IFNpemVVbml0RW51bS5QaXhlbCB9O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzaXplOiBtaW5IZWlnaHQsIHNpemVVbml0OiBTaXplVW5pdEVudW0uUGl4ZWwgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IHNpemU6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5taW5TaXplLCBzaXplVW5pdDogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLm1pblNpemVVbml0IH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZVNpemVXaWR0aEhlaWdodFNwZWNpZmljYXRpb25UeXBlKGNvbmZpZzogSXRlbUNvbmZpZyk6IFNpemVXaWR0aEhlaWdodFNwZWNpZmljYXRpb25UeXBlIHtcclxuICAgICAgICBpZiAoY29uZmlnLnNpemUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gU2l6ZVdpZHRoSGVpZ2h0U3BlY2lmaWNhdGlvblR5cGUuU2l6ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoY29uZmlnLndpZHRoICE9PSB1bmRlZmluZWQgfHwgY29uZmlnLmhlaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gU2l6ZVdpZHRoSGVpZ2h0U3BlY2lmaWNhdGlvblR5cGUuV2lkdGhPckhlaWdodDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBTaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZS5Ob25lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0dyb3VuZChjb25maWc6IEl0ZW1Db25maWcpOiBjb25maWcgaXMgSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZy50eXBlID09PSBJdGVtVHlwZS5ncm91bmQ7XHJcbiAgICB9XHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNSb3coY29uZmlnOiBJdGVtQ29uZmlnKTogY29uZmlnIGlzIEl0ZW1Db25maWcge1xyXG4gICAgICAgIHJldHVybiBjb25maWcudHlwZSA9PT0gSXRlbVR5cGUucm93O1xyXG4gICAgfVxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzQ29sdW1uKGNvbmZpZzogSXRlbUNvbmZpZyk6IGNvbmZpZyBpcyBJdGVtQ29uZmlnIHtcclxuICAgICAgICByZXR1cm4gY29uZmlnLnR5cGUgPT09IEl0ZW1UeXBlLmNvbHVtbjtcclxuICAgIH1cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc1N0YWNrKGNvbmZpZzogSXRlbUNvbmZpZyk6IGNvbmZpZyBpcyBJdGVtQ29uZmlnIHtcclxuICAgICAgICByZXR1cm4gY29uZmlnLnR5cGUgPT09IEl0ZW1UeXBlLnN0YWNrO1xyXG4gICAgfVxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcG9uZW50KGNvbmZpZzogSXRlbUNvbmZpZyk6IGNvbmZpZyBpcyBDb21wb25lbnRJdGVtQ29uZmlnIHtcclxuICAgICAgICByZXR1cm4gY29uZmlnLnR5cGUgPT09IEl0ZW1UeXBlLmNvbXBvbmVudDtcclxuICAgIH1cclxufVxyXG5cclxuLy8gU3RhY2sgb3IgQ29tcG9uZW50XHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSGVhZGVyZWRJdGVtQ29uZmlnIGV4dGVuZHMgSXRlbUNvbmZpZyB7XHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoSGVhZGVyZWRJdGVtQ29uZmlnOm5hbWVzcGFjZSkuKEhlYWRlcjppbnRlcmZhY2UpLnNob3d9IGluc3RlYWQgKi9cclxuICAgIGhhc0hlYWRlcnM/OiBib29sZWFuO1xyXG4gICAgaGVhZGVyPzogSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlcjtcclxuICAgIG1heGltaXNlZD86IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgSGVhZGVyZWRJdGVtQ29uZmlnIHtcclxuICAgIGNvbnN0IGxlZ2FjeU1heGltaXNlZElkID0gJ19fZ2xNYXhpbWlzZWQnO1xyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgSGVhZGVyIHtcclxuICAgICAgICBzaG93PzogZmFsc2UgfCBTaWRlO1xyXG4gICAgICAgIHBvcG91dD86IGZhbHNlIHwgc3RyaW5nO1xyXG4gICAgICAgIGRvY2s/OiBmYWxzZSB8IHN0cmluZztcclxuICAgICAgICBtYXhpbWlzZT86IGZhbHNlIHwgc3RyaW5nO1xyXG4gICAgICAgIGNsb3NlPzogZmFsc2UgfCBzdHJpbmc7XHJcbiAgICAgICAgbWluaW1pc2U/OiBzdHJpbmc7XHJcbiAgICAgICAgdGFiRHJvcGRvd24/OiBmYWxzZSB8IHN0cmluZztcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbmFtZXNwYWNlIEhlYWRlciB7XHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUoaGVhZGVyOiBIZWFkZXIgfCB1bmRlZmluZWQsIGhhc0hlYWRlcnM6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIgfCB1bmRlZmluZWQge1xyXG4gICAgICAgICAgICBpZiAoaGVhZGVyID09PSB1bmRlZmluZWQgJiYgaGFzSGVhZGVycyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdzogaGVhZGVyPy5zaG93ID8/IChoYXNIZWFkZXJzID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBoYXNIZWFkZXJzID8gUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmRlZmF1bHRzLnNob3cgOiBmYWxzZSksXHJcbiAgICAgICAgICAgICAgICAgICAgcG9wb3V0OiBoZWFkZXI/LnBvcG91dCxcclxuICAgICAgICAgICAgICAgICAgICBtYXhpbWlzZTogaGVhZGVyPy5tYXhpbWlzZSxcclxuICAgICAgICAgICAgICAgICAgICBjbG9zZTogaGVhZGVyPy5jbG9zZSxcclxuICAgICAgICAgICAgICAgICAgICBtaW5pbWlzZTogaGVhZGVyPy5taW5pbWlzZSxcclxuICAgICAgICAgICAgICAgICAgICB0YWJEcm9wZG93bjogaGVhZGVyPy50YWJEcm9wZG93bixcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJZEFuZE1heGltaXNlZChjb25maWc6IEhlYWRlcmVkSXRlbUNvbmZpZyk6IHsgaWQ6IHN0cmluZywgbWF4aW1pc2VkOiBib29sZWFufSB7XHJcbiAgICAgICAgbGV0IGlkOiBzdHJpbmc7XHJcbiAgICAgICAgLy8gVG8gc3VwcG9ydCBsZWdhY3kgY29uZmlncyB3aXRoIElkIHNhdmVkIGFzIGFuIGFycmF5IG9mIHN0cmluZywgYXNzaWduIGNvbmZpZy5pZCB0byBhIHR5cGUgd2hpY2ggaW5jbHVkZXMgc3RyaW5nIGFycmF5XHJcbiAgICAgICAgbGV0IGxlZ2FjeUlkOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCA9IGNvbmZpZy5pZDtcclxuICAgICAgICBsZXQgbGVnYWN5TWF4aW1pc2VkID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKGxlZ2FjeUlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWQgPSBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuaWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGVnYWN5SWQpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpZHggPSBsZWdhY3lJZC5maW5kSW5kZXgoKGlkKSA9PiBpZCA9PT0gbGVnYWN5TWF4aW1pc2VkSWQpXHJcbiAgICAgICAgICAgICAgICBpZiAoaWR4ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeU1heGltaXNlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5SWQgPSBsZWdhY3lJZC5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChsZWdhY3lJZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWQgPSBsZWdhY3lJZFswXTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWQgPSBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuaWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZCA9IGxlZ2FjeUlkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgbWF4aW1pc2VkOiBib29sZWFuO1xyXG4gICAgICAgIGlmIChjb25maWcubWF4aW1pc2VkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgbWF4aW1pc2VkID0gY29uZmlnLm1heGltaXNlZDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtYXhpbWlzZWQgPSBsZWdhY3lNYXhpbWlzZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4geyBpZCwgbWF4aW1pc2VkIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBTdGFja0l0ZW1Db25maWcgZXh0ZW5kcyBIZWFkZXJlZEl0ZW1Db25maWcge1xyXG4gICAgdHlwZTogJ3N0YWNrJztcclxuICAgIGNvbnRlbnQ6IENvbXBvbmVudEl0ZW1Db25maWdbXTtcclxuICAgIC8qKiBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gaW4gY29udGVudCB3aGljaCBpcyB0byBiZSBhY3RpdmUqL1xyXG4gICAgYWN0aXZlSXRlbUluZGV4PzogbnVtYmVyO1xyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFN0YWNrSXRlbUNvbmZpZyB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShpdGVtQ29uZmlnOiBTdGFja0l0ZW1Db25maWcsIHJvd0FuZENvbHVtbkNoaWxkTGVnYWN5U2l6ZURlZmF1bHQ6IGJvb2xlYW4pOiBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgeyBpZCwgbWF4aW1pc2VkIH0gPSBIZWFkZXJlZEl0ZW1Db25maWcucmVzb2x2ZUlkQW5kTWF4aW1pc2VkKGl0ZW1Db25maWcpO1xyXG4gICAgICAgIGNvbnN0IHsgc2l6ZSwgc2l6ZVVuaXQgfSA9IEl0ZW1Db25maWcucmVzb2x2ZVNpemUoaXRlbUNvbmZpZy5zaXplLCBpdGVtQ29uZmlnLndpZHRoLCBpdGVtQ29uZmlnLmhlaWdodCwgcm93QW5kQ29sdW1uQ2hpbGRMZWdhY3lTaXplRGVmYXVsdCk7XHJcbiAgICAgICAgY29uc3QgeyBzaXplOiBtaW5TaXplLCBzaXplVW5pdDogbWluU2l6ZVVuaXQgfSA9IEl0ZW1Db25maWcucmVzb2x2ZU1pblNpemUoaXRlbUNvbmZpZy5taW5TaXplLCBpdGVtQ29uZmlnLm1pbldpZHRoLCBpdGVtQ29uZmlnLm1pbkhlaWdodCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLnN0YWNrLFxyXG4gICAgICAgICAgICBjb250ZW50OiByZXNvbHZlQ29udGVudChpdGVtQ29uZmlnLmNvbnRlbnQpLFxyXG4gICAgICAgICAgICBzaXplLFxyXG4gICAgICAgICAgICBzaXplVW5pdCxcclxuICAgICAgICAgICAgbWluU2l6ZSxcclxuICAgICAgICAgICAgbWluU2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIGlkLFxyXG4gICAgICAgICAgICBtYXhpbWlzZWQsXHJcbiAgICAgICAgICAgIGlzQ2xvc2FibGU6IGl0ZW1Db25maWcuaXNDbG9zYWJsZSA/PyBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuaXNDbG9zYWJsZSxcclxuICAgICAgICAgICAgYWN0aXZlSXRlbUluZGV4OiBpdGVtQ29uZmlnLmFjdGl2ZUl0ZW1JbmRleCA/PyBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZy5kZWZhdWx0QWN0aXZlSXRlbUluZGV4LFxyXG4gICAgICAgICAgICBoZWFkZXI6IEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIucmVzb2x2ZShpdGVtQ29uZmlnLmhlYWRlciwgaXRlbUNvbmZpZy5oYXNIZWFkZXJzKSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZyb21SZXNvbHZlZChyZXNvbHZlZENvbmZpZzogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcpOiBTdGFja0l0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogU3RhY2tJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5zdGFjayxcclxuICAgICAgICAgICAgY29udGVudDogZnJvbVJlc29sdmVkQ29udGVudChyZXNvbHZlZENvbmZpZy5jb250ZW50KSxcclxuICAgICAgICAgICAgc2l6ZTogZm9ybWF0U2l6ZShyZXNvbHZlZENvbmZpZy5zaXplLCByZXNvbHZlZENvbmZpZy5zaXplVW5pdCksXHJcbiAgICAgICAgICAgIG1pblNpemU6IGZvcm1hdFVuZGVmaW5hYmxlU2l6ZShyZXNvbHZlZENvbmZpZy5taW5TaXplLCByZXNvbHZlZENvbmZpZy5taW5TaXplVW5pdCksXHJcbiAgICAgICAgICAgIGlkOiByZXNvbHZlZENvbmZpZy5pZCxcclxuICAgICAgICAgICAgbWF4aW1pc2VkOiByZXNvbHZlZENvbmZpZy5tYXhpbWlzZWQsXHJcbiAgICAgICAgICAgIGlzQ2xvc2FibGU6IHJlc29sdmVkQ29uZmlnLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgICAgIGFjdGl2ZUl0ZW1JbmRleDogcmVzb2x2ZWRDb25maWcuYWN0aXZlSXRlbUluZGV4LFxyXG4gICAgICAgICAgICBoZWFkZXI6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlci5jcmVhdGVDb3B5KHJlc29sdmVkQ29uZmlnLmhlYWRlciksXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBmdW5jdGlvbiByZXNvbHZlQ29udGVudChjb250ZW50OiBDb21wb25lbnRJdGVtQ29uZmlnW10gfCB1bmRlZmluZWQpOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWdbXSB7XHJcbiAgICAgICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgY291bnQgPSBjb250ZW50Lmxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZz4oY291bnQpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkSXRlbUNvbmZpZyA9IGNvbnRlbnRbaV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtQ29uZmlnID0gSXRlbUNvbmZpZy5yZXNvbHZlKGNoaWxkSXRlbUNvbmZpZywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFSZXNvbHZlZEl0ZW1Db25maWcuaXNDb21wb25lbnRJdGVtKGl0ZW1Db25maWcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdVQ1VTSUNSQzkxMTE0JywgSlNPTi5zdHJpbmdpZnkoaXRlbUNvbmZpZykpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBpdGVtQ29uZmlnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGZ1bmN0aW9uIGZyb21SZXNvbHZlZENvbnRlbnQocmVzb2x2ZWRDb250ZW50OiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWdbXSk6IENvbXBvbmVudEl0ZW1Db25maWdbXSB7XHJcbiAgICAgICAgY29uc3QgY291bnQgPSByZXNvbHZlZENvbnRlbnQubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxDb21wb25lbnRJdGVtQ29uZmlnPihjb3VudCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkQ29udGVudENvbmZpZyA9IHJlc29sdmVkQ29udGVudFtpXTtcclxuICAgICAgICAgICAgcmVzdWx0W2ldID0gQ29tcG9uZW50SXRlbUNvbmZpZy5mcm9tUmVzb2x2ZWQocmVzb2x2ZWRDb250ZW50Q29uZmlnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRJdGVtQ29uZmlnIGV4dGVuZHMgSGVhZGVyZWRJdGVtQ29uZmlnIHtcclxuICAgIHR5cGU6ICdjb21wb25lbnQnO1xyXG4gICAgcmVhZG9ubHkgY29udGVudD86IFtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRpdGxlIG9mIHRoZSBpdGVtIGFzIGRpc3BsYXllZCBvbiBpdHMgdGFiIGFuZCBvbiBwb3BvdXQgd2luZG93c1xyXG4gICAgICogRGVmYXVsdDogY29tcG9uZW50VHlwZS50b1N0cmluZygpIG9yICcnXHJcbiAgICAgKi9cclxuICAgIHRpdGxlPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGNvbXBvbmVudC5cclxuICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKENvbXBvbmVudEl0ZW1Db25maWc6aW50ZXJmYWNlKS5jb21wb25lbnRUeXBlfSBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIGNvbXBvbmVudE5hbWU/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgY29tcG9uZW50LlxyXG4gICAgICogYGNvbXBvbmVudFR5cGVgIG11c3QgYmUgb2YgdHlwZSBgc3RyaW5nYCBpZiBpdCBpcyByZWdpc3RlcmVkIHdpdGggYW55IG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOlxyXG4gICAgICogKiB7QGxpbmsgKEdvbGRlbkxheW91dDpjbGFzcykucmVnaXN0ZXJDb21wb25lbnR9IChkZXByZWNhdGVkKVxyXG4gICAgICogKiB7QGxpbmsgKEdvbGRlbkxheW91dDpjbGFzcykucmVnaXN0ZXJDb21wb25lbnRDb25zdHJ1Y3Rvcn1cclxuICAgICAqICoge0BsaW5rIChHb2xkZW5MYXlvdXQ6Y2xhc3MpLnJlZ2lzdGVyQ29tcG9uZW50RmFjdG9yeUZ1bmN0aW9ufVxyXG4gICAgICovXHJcbiAgICBjb21wb25lbnRUeXBlOiBKc29uVmFsdWU7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzdGF0ZSBpbmZvcm1hdGlvbiB3aXRoIHdoaWNoIGEgY29tcG9uZW50IHdpbGwgYmUgaW5pdGlhbGlzZWQgd2l0aC5cclxuICAgICAqIFdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjb21wb25lbnQgY29uc3RydWN0b3IgZnVuY3Rpb24gYW5kIHdpbGwgYmUgdGhlIHZhbHVlIHJldHVybmVkIGJ5XHJcbiAgICAgKiBjb250YWluZXIuaW5pdGlhbFN0YXRlLlxyXG4gICAgICovXHJcbiAgICBjb21wb25lbnRTdGF0ZT86IEpzb25WYWx1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlZmF1bHQ6IHRydWVcclxuICAgICAqL1xyXG4gICAgcmVvcmRlckVuYWJsZWQ/OiBib29sZWFuOyAgLy8gVGFrZXMgcHJlY2VkZW5jZSBvdmVyIExheW91dENvbmZpZy5yZW9yZGVyRW5hYmxlZC5cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBDb21wb25lbnRJdGVtQ29uZmlnIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKGl0ZW1Db25maWc6IENvbXBvbmVudEl0ZW1Db25maWcsIHJvd0FuZENvbHVtbkNoaWxkTGVnYWN5U2l6ZURlZmF1bHQ6IGJvb2xlYW4pOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcge1xyXG4gICAgICAgIGxldCBjb21wb25lbnRUeXBlOiBKc29uVmFsdWUgfCB1bmRlZmluZWQgPSBpdGVtQ29uZmlnLmNvbXBvbmVudFR5cGU7XHJcbiAgICAgICAgaWYgKGNvbXBvbmVudFR5cGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb21wb25lbnRUeXBlID0gaXRlbUNvbmZpZy5jb21wb25lbnROYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29tcG9uZW50VHlwZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29tcG9uZW50SXRlbUNvbmZpZy5jb21wb25lbnRUeXBlIGlzIHVuZGVmaW5lZCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgaWQsIG1heGltaXNlZCB9ID0gSGVhZGVyZWRJdGVtQ29uZmlnLnJlc29sdmVJZEFuZE1heGltaXNlZChpdGVtQ29uZmlnKTtcclxuICAgICAgICAgICAgbGV0IHRpdGxlOiBzdHJpbmc7XHJcbiAgICAgICAgICAgIGlmIChpdGVtQ29uZmlnLnRpdGxlID09PSB1bmRlZmluZWQgfHwgaXRlbUNvbmZpZy50aXRsZSA9PT0gJycpIHtcclxuICAgICAgICAgICAgICAgIHRpdGxlID0gQ29tcG9uZW50SXRlbUNvbmZpZy5jb21wb25lbnRUeXBlVG9UaXRsZShjb21wb25lbnRUeXBlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRpdGxlID0gaXRlbUNvbmZpZy50aXRsZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCB7IHNpemUsIHNpemVVbml0IH0gPSBJdGVtQ29uZmlnLnJlc29sdmVTaXplKGl0ZW1Db25maWcuc2l6ZSwgaXRlbUNvbmZpZy53aWR0aCwgaXRlbUNvbmZpZy5oZWlnaHQsIHJvd0FuZENvbHVtbkNoaWxkTGVnYWN5U2l6ZURlZmF1bHQpO1xyXG4gICAgICAgICAgICBjb25zdCB7IHNpemU6IG1pblNpemUsIHNpemVVbml0OiBtaW5TaXplVW5pdCB9ID0gSXRlbUNvbmZpZy5yZXNvbHZlTWluU2l6ZShpdGVtQ29uZmlnLm1pblNpemUsIGl0ZW1Db25maWcubWluV2lkdGgsIGl0ZW1Db25maWcubWluSGVpZ2h0KTtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBpdGVtQ29uZmlnLnR5cGUsXHJcbiAgICAgICAgICAgICAgICBjb250ZW50OiBbXSxcclxuICAgICAgICAgICAgICAgIHNpemUsXHJcbiAgICAgICAgICAgICAgICBzaXplVW5pdCxcclxuICAgICAgICAgICAgICAgIG1pblNpemUsXHJcbiAgICAgICAgICAgICAgICBtaW5TaXplVW5pdCxcclxuICAgICAgICAgICAgICAgIGlkLFxyXG4gICAgICAgICAgICAgICAgbWF4aW1pc2VkLFxyXG4gICAgICAgICAgICAgICAgaXNDbG9zYWJsZTogaXRlbUNvbmZpZy5pc0Nsb3NhYmxlID8/IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgICAgICAgICAgcmVvcmRlckVuYWJsZWQ6IGl0ZW1Db25maWcucmVvcmRlckVuYWJsZWQgPz8gUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLmRlZmF1bHRSZW9yZGVyRW5hYmxlZCxcclxuICAgICAgICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyOiBIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyLnJlc29sdmUoaXRlbUNvbmZpZy5oZWFkZXIsIGl0ZW1Db25maWcuaGFzSGVhZGVycyksXHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRUeXBlLFxyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50U3RhdGU6IGl0ZW1Db25maWcuY29tcG9uZW50U3RhdGUgPz8ge30sXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmcm9tUmVzb2x2ZWQocmVzb2x2ZWRDb25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyk6IENvbXBvbmVudEl0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogQ29tcG9uZW50SXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogSXRlbVR5cGUuY29tcG9uZW50LFxyXG4gICAgICAgICAgICBzaXplOiBmb3JtYXRTaXplKHJlc29sdmVkQ29uZmlnLnNpemUsIHJlc29sdmVkQ29uZmlnLnNpemVVbml0KSxcclxuICAgICAgICAgICAgbWluU2l6ZTogZm9ybWF0VW5kZWZpbmFibGVTaXplKHJlc29sdmVkQ29uZmlnLm1pblNpemUsIHJlc29sdmVkQ29uZmlnLm1pblNpemVVbml0KSxcclxuICAgICAgICAgICAgaWQ6IHJlc29sdmVkQ29uZmlnLmlkLFxyXG4gICAgICAgICAgICBtYXhpbWlzZWQ6IHJlc29sdmVkQ29uZmlnLm1heGltaXNlZCxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogcmVzb2x2ZWRDb25maWcuaXNDbG9zYWJsZSxcclxuICAgICAgICAgICAgcmVvcmRlckVuYWJsZWQ6IHJlc29sdmVkQ29uZmlnLnJlb3JkZXJFbmFibGVkLFxyXG4gICAgICAgICAgICB0aXRsZTogcmVzb2x2ZWRDb25maWcudGl0bGUsXHJcbiAgICAgICAgICAgIGhlYWRlcjogUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyLmNyZWF0ZUNvcHkocmVzb2x2ZWRDb25maWcuaGVhZGVyKSxcclxuICAgICAgICAgICAgY29tcG9uZW50VHlwZTogcmVzb2x2ZWRDb25maWcuY29tcG9uZW50VHlwZSxcclxuICAgICAgICAgICAgY29tcG9uZW50U3RhdGU6IGRlZXBFeHRlbmRWYWx1ZSh1bmRlZmluZWQsIHJlc29sdmVkQ29uZmlnLmNvbXBvbmVudFN0YXRlKSBhcyBKc29uVmFsdWUsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjb21wb25lbnRUeXBlVG9UaXRsZShjb21wb25lbnRUeXBlOiBKc29uVmFsdWUpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFR5cGVUeXBlID0gdHlwZW9mIGNvbXBvbmVudFR5cGU7XHJcbiAgICAgICAgc3dpdGNoIChjb21wb25lbnRUeXBlVHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlICdzdHJpbmcnOiByZXR1cm4gY29tcG9uZW50VHlwZSBhcyBzdHJpbmc7XHJcbiAgICAgICAgICAgIGNhc2UgJ251bWJlcic6IHJldHVybiAoY29tcG9uZW50VHlwZSBhcyBudW1iZXIpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOiByZXR1cm4gKGNvbXBvbmVudFR5cGUgYXMgYm9vbGVhbikudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLy8gUm93T3JDb2x1bW5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBSb3dPckNvbHVtbkl0ZW1Db25maWcgZXh0ZW5kcyBJdGVtQ29uZmlnIHtcclxuICAgIHR5cGU6ICdyb3cnIHwgJ2NvbHVtbic7XHJcbiAgICBjb250ZW50OiAoUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgU3RhY2tJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZylbXTtcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSb3dPckNvbHVtbkl0ZW1Db25maWcge1xyXG4gICAgZXhwb3J0IHR5cGUgQ2hpbGRJdGVtQ29uZmlnID0gUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgU3RhY2tJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZztcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNDaGlsZEl0ZW1Db25maWcoaXRlbUNvbmZpZzogSXRlbUNvbmZpZyk6IGl0ZW1Db25maWcgaXMgQ2hpbGRJdGVtQ29uZmlnIHtcclxuICAgICAgICBzd2l0Y2ggKGl0ZW1Db25maWcudHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnJvdzpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuc3RhY2s6XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29tcG9uZW50OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuZ3JvdW5kOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVucmVhY2hhYmxlQ2FzZUVycm9yKCdVUk9DT1NQQ0lDSUMxMzY4NycsIGl0ZW1Db25maWcudHlwZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKGl0ZW1Db25maWc6IFJvd09yQ29sdW1uSXRlbUNvbmZpZywgcm93QW5kQ29sdW1uQ2hpbGRMZWdhY3lTaXplRGVmYXVsdDogYm9vbGVhbik6IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnIHtcclxuICAgICAgICBjb25zdCB7IHNpemUsIHNpemVVbml0IH0gPSBJdGVtQ29uZmlnLnJlc29sdmVTaXplKGl0ZW1Db25maWcuc2l6ZSwgaXRlbUNvbmZpZy53aWR0aCwgaXRlbUNvbmZpZy5oZWlnaHQsIHJvd0FuZENvbHVtbkNoaWxkTGVnYWN5U2l6ZURlZmF1bHQpO1xyXG4gICAgICAgIGNvbnN0IHsgc2l6ZTogbWluU2l6ZSwgc2l6ZVVuaXQ6IG1pblNpemVVbml0IH0gPSBJdGVtQ29uZmlnLnJlc29sdmVNaW5TaXplKGl0ZW1Db25maWcubWluU2l6ZSwgaXRlbUNvbmZpZy5taW5XaWR0aCwgaXRlbUNvbmZpZy5taW5IZWlnaHQpO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IGl0ZW1Db25maWcudHlwZSxcclxuICAgICAgICAgICAgY29udGVudDogUm93T3JDb2x1bW5JdGVtQ29uZmlnLnJlc29sdmVDb250ZW50KGl0ZW1Db25maWcuY29udGVudCksXHJcbiAgICAgICAgICAgIHNpemUsXHJcbiAgICAgICAgICAgIHNpemVVbml0LFxyXG4gICAgICAgICAgICBtaW5TaXplLFxyXG4gICAgICAgICAgICBtaW5TaXplVW5pdCxcclxuICAgICAgICAgICAgaWQ6IEl0ZW1Db25maWcucmVzb2x2ZUlkKGl0ZW1Db25maWcuaWQpLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiBpdGVtQ29uZmlnLmlzQ2xvc2FibGUgPz8gUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZyb21SZXNvbHZlZChyZXNvbHZlZENvbmZpZzogUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcpOiBSb3dPckNvbHVtbkl0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUm93T3JDb2x1bW5JdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiByZXNvbHZlZENvbmZpZy50eXBlLFxyXG4gICAgICAgICAgICBjb250ZW50OiBmcm9tUmVzb2x2ZWRDb250ZW50KHJlc29sdmVkQ29uZmlnLmNvbnRlbnQpLFxyXG4gICAgICAgICAgICBzaXplOiBmb3JtYXRTaXplKHJlc29sdmVkQ29uZmlnLnNpemUsIHJlc29sdmVkQ29uZmlnLnNpemVVbml0KSxcclxuICAgICAgICAgICAgbWluU2l6ZTogZm9ybWF0VW5kZWZpbmFibGVTaXplKHJlc29sdmVkQ29uZmlnLm1pblNpemUsIHJlc29sdmVkQ29uZmlnLm1pblNpemVVbml0KSxcclxuICAgICAgICAgICAgaWQ6IHJlc29sdmVkQ29uZmlnLmlkLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiByZXNvbHZlZENvbmZpZy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNvbnRlbnQoY29udGVudDogQ2hpbGRJdGVtQ29uZmlnW10gfCB1bmRlZmluZWQpOiBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZy5DaGlsZEl0ZW1Db25maWdbXSB7XHJcbiAgICAgICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgY291bnQgPSBjb250ZW50Lmxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgY2hpbGRJdGVtQ29uZmlncyA9IG5ldyBBcnJheTxSb3dPckNvbHVtbkl0ZW1Db25maWcuQ2hpbGRJdGVtQ29uZmlnPihjb3VudCk7XHJcbiAgICAgICAgICAgIGxldCB3aWR0aE9ySGVpZ2h0U3BlY2lmaWVkQXRMZWFzdE9uY2UgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IHNpemVTcGVjaWZpZWRBdExlYXN0T25jZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkSXRlbUNvbmZpZyA9IGNvbnRlbnRbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoIVJvd09yQ29sdW1uSXRlbUNvbmZpZy5pc0NoaWxkSXRlbUNvbmZpZyhjaGlsZEl0ZW1Db25maWcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcignSXRlbUNvbmZpZyBpcyBub3QgUm93LCBDb2x1bW4gb3IgU3RhY2snLCBjaGlsZEl0ZW1Db25maWcpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNpemVTcGVjaWZpZWRBdExlYXN0T25jZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZSA9IEl0ZW1Db25maWcuY2FsY3VsYXRlU2l6ZVdpZHRoSGVpZ2h0U3BlY2lmaWNhdGlvblR5cGUoY2hpbGRJdGVtQ29uZmlnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtQ29uZmlnLlNpemVXaWR0aEhlaWdodFNwZWNpZmljYXRpb25UeXBlLk5vbmU6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEl0ZW1Db25maWcuU2l6ZVdpZHRoSGVpZ2h0U3BlY2lmaWNhdGlvblR5cGUuV2lkdGhPckhlaWdodDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aE9ySGVpZ2h0U3BlY2lmaWVkQXRMZWFzdE9uY2UgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtQ29uZmlnLlNpemVXaWR0aEhlaWdodFNwZWNpZmljYXRpb25UeXBlLlNpemU6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZVNwZWNpZmllZEF0TGVhc3RPbmNlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVucmVhY2hhYmxlQ2FzZUVycm9yKCdST0NJQ1JDODc1NTYnLCBzaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRJdGVtQ29uZmlnc1tpXSA9IGNoaWxkSXRlbUNvbmZpZztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGxlZ2FjeVNpemVEZWZhdWx0OiBib29sZWFuO1xyXG4gICAgICAgICAgICBpZiAoc2l6ZVNwZWNpZmllZEF0TGVhc3RPbmNlKSB7XHJcbiAgICAgICAgICAgICAgICBsZWdhY3lTaXplRGVmYXVsdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHdpZHRoT3JIZWlnaHRTcGVjaWZpZWRBdExlYXN0T25jZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVNpemVEZWZhdWx0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5U2l6ZURlZmF1bHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLkNoaWxkSXRlbUNvbmZpZz4oY291bnQpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkSXRlbUNvbmZpZyA9IGNoaWxkSXRlbUNvbmZpZ3NbaV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZENoaWxkSXRlbUNvbmZpZyA9IEl0ZW1Db25maWcucmVzb2x2ZShjaGlsZEl0ZW1Db25maWcsIGxlZ2FjeVNpemVEZWZhdWx0KTtcclxuICAgICAgICAgICAgICAgIGlmICghUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcuaXNDaGlsZEl0ZW1Db25maWcocmVzb2x2ZWRDaGlsZEl0ZW1Db25maWcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdVUk9DT1NQSUM5OTUxMicsIEpTT04uc3RyaW5naWZ5KHJlc29sdmVkQ2hpbGRJdGVtQ29uZmlnKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IHJlc29sdmVkQ2hpbGRJdGVtQ29uZmlnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGZ1bmN0aW9uIGZyb21SZXNvbHZlZENvbnRlbnQocmVzb2x2ZWRDb250ZW50OiByZWFkb25seSBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZy5DaGlsZEl0ZW1Db25maWdbXSk6IFJvd09yQ29sdW1uSXRlbUNvbmZpZy5DaGlsZEl0ZW1Db25maWdbXSB7XHJcbiAgICAgICAgY29uc3QgY291bnQgPSByZXNvbHZlZENvbnRlbnQubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxSb3dPckNvbHVtbkl0ZW1Db25maWcuQ2hpbGRJdGVtQ29uZmlnPihjb3VudCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkQ29udGVudENvbmZpZyA9IHJlc29sdmVkQ29udGVudFtpXTtcclxuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHJlc29sdmVkQ29udGVudENvbmZpZy50eXBlO1xyXG4gICAgICAgICAgICBsZXQgY29udGVudENvbmZpZzogUm93T3JDb2x1bW5JdGVtQ29uZmlnLkNoaWxkSXRlbUNvbmZpZztcclxuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnJvdzpcclxuICAgICAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29sdW1uOlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRDb25maWcgPSBSb3dPckNvbHVtbkl0ZW1Db25maWcuZnJvbVJlc29sdmVkKHJlc29sdmVkQ29udGVudENvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnN0YWNrOlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRDb25maWcgPSBTdGFja0l0ZW1Db25maWcuZnJvbVJlc29sdmVkKHJlc29sdmVkQ29udGVudENvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbXBvbmVudDpcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50Q29uZmlnID0gQ29tcG9uZW50SXRlbUNvbmZpZy5mcm9tUmVzb2x2ZWQocmVzb2x2ZWRDb250ZW50Q29uZmlnKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVucmVhY2hhYmxlQ2FzZUVycm9yKCdST0NJQ0ZSQzQ0Nzk3JywgdHlwZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzdWx0W2ldID0gY29udGVudENvbmZpZztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IHR5cGUgUm9vdEl0ZW1Db25maWcgPSBSb3dPckNvbHVtbkl0ZW1Db25maWcgfCBTdGFja0l0ZW1Db25maWcgfCBDb21wb25lbnRJdGVtQ29uZmlnO1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSb290SXRlbUNvbmZpZyB7XHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNSb290SXRlbUNvbmZpZyhpdGVtQ29uZmlnOiBJdGVtQ29uZmlnKTogaXRlbUNvbmZpZyBpcyBSb290SXRlbUNvbmZpZyB7XHJcbiAgICAgICAgc3dpdGNoIChpdGVtQ29uZmlnLnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29sdW1uOlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnN0YWNrOlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbXBvbmVudDpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmdyb3VuZDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlYWNoYWJsZUNhc2VFcnJvcignVVJJQ0lSMjM2ODcnLCBpdGVtQ29uZmlnLnR5cGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShpdGVtQ29uZmlnOiBSb290SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCk6IFJlc29sdmVkUm9vdEl0ZW1Db25maWcgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGlmIChpdGVtQ29uZmlnID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBJdGVtQ29uZmlnLnJlc29sdmUoaXRlbUNvbmZpZywgZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAoIVJlc29sdmVkUm9vdEl0ZW1Db25maWcuaXNSb290SXRlbUNvbmZpZyhyZXN1bHQpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKCdJdGVtQ29uZmlnIGlzIG5vdCBSb3csIENvbHVtbiBvciBTdGFjaycsIEpTT04uc3RyaW5naWZ5KGl0ZW1Db25maWcpKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZyb21SZXNvbHZlZE9yVW5kZWZpbmVkKHJlc29sdmVkSXRlbUNvbmZpZzogUmVzb2x2ZWRSb290SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCk6IFJvb3RJdGVtQ29uZmlnIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBpZiAocmVzb2x2ZWRJdGVtQ29uZmlnID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gcmVzb2x2ZWRJdGVtQ29uZmlnLnR5cGU7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6XHJcbiAgICAgICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbHVtbjpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUm93T3JDb2x1bW5JdGVtQ29uZmlnLmZyb21SZXNvbHZlZChyZXNvbHZlZEl0ZW1Db25maWcpO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5zdGFjazpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RhY2tJdGVtQ29uZmlnLmZyb21SZXNvbHZlZChyZXNvbHZlZEl0ZW1Db25maWcpO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb21wb25lbnQ6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbXBvbmVudEl0ZW1Db25maWcuZnJvbVJlc29sdmVkKHJlc29sdmVkSXRlbUNvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlYWNoYWJsZUNhc2VFcnJvcignUklDRlJPVTg5OTIxJywgdHlwZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0Q29uZmlnIHtcclxuICAgIHJvb3Q6IFJvb3RJdGVtQ29uZmlnIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgKExheW91dENvbmZpZzppbnRlcmZhY2UpLnJvb3R9ICovXHJcbiAgICBjb250ZW50PzogKFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFN0YWNrSXRlbUNvbmZpZyB8IENvbXBvbmVudEl0ZW1Db25maWcpW107XHJcbiAgICBvcGVuUG9wb3V0cz86IFBvcG91dExheW91dENvbmZpZ1tdO1xyXG4gICAgZGltZW5zaW9ucz86IExheW91dENvbmZpZy5EaW1lbnNpb25zO1xyXG4gICAgc2V0dGluZ3M/OiBMYXlvdXRDb25maWcuU2V0dGluZ3M7XHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOmludGVyZmFjZSkuaGVhZGVyfSBpbnN0ZWFkICovXHJcbiAgICBsYWJlbHM/OiBMYXlvdXRDb25maWcuTGFiZWxzO1xyXG4gICAgaGVhZGVyPzogTGF5b3V0Q29uZmlnLkhlYWRlcjtcclxufVxyXG5cclxuLyoqIFVzZSB0byBzcGVjaWZ5IExheW91dENvbmZpZyB3aXRoIGRlZmF1bHRzIG9yIGRlc2VyaWFsaXNlIGEgTGF5b3V0Q29uZmlnLlxyXG4gKiBEZXNlcmlhbGlzYXRpb24gd2lsbCBoYW5kbGUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXHJcbiAqIE5vdGUgdGhhdCBMYXlvdXRDb25maWcgc2hvdWxkIGJlIHVzZWQgZm9yIHNlcmlhbGlzYXRpb24gKG5vdCBMYXlvdXRDb25maWcpXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgTGF5b3V0Q29uZmlnIHtcclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgU2V0dGluZ3Mge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSAke0BsaW5rIChMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oSGVhZGVyOmludGVyZmFjZSkuc2hvd30gaW5zdGVhZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGhhc0hlYWRlcnM/OiBib29sZWFuO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0cnVlLCB0aGUgdXNlciBjYW4gZHJhZyBjb21wb25lbnRzIGZyb20gb25lIHdpbmRvdyB0byBhbm90aGVyLlxyXG4gICAgICAgICAqIERlZmF1bHQ6IHRydWVcclxuICAgICAgICAgKi9cclxuICAgICAgICBkcmFnQmV0d2VlbldpbmRvd3M/OiBib29sZWFuO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0cnVlLCB0aGUgdXNlciBjYW4gZHJhZyBhbmQgZHJvcCBjb21wb25lbnRzIG91dHNpZGUgdGhlaXIgY29udGFpbmluZyB3aW5kb3csIGNyZWF0aW5nIGEgbmV3IHBvcG91dCB3aW5kb3cuXHJcbiAgICAgICAgICogRGVmYXVsdDogdHJ1ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGRyYWdUb05ld1dpbmRvdz86IGJvb2xlYW47XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIHRydWUsIHRoZSB1c2VyIGNhbiByZS1hcnJhbmdlIHRoZSBsYXlvdXQgYnkgZHJhZ2dpbmcgaXRlbXMgYnkgdGhlaXIgdGFicyB0byB0aGUgZGVzaXJlZCBsb2NhdGlvbi5cclxuICAgICAgICAgKiBDYW4gYmUgb3ZlcnJpZGRlbiBieSBJdGVtQ29uZmlnLnJlb3JkZXJFbmFibGVkIGZvciBzcGVjaWZpYyBJdGVtQ29uZmlnc1xyXG4gICAgICAgICAqIERlZmF1bHQ6IHRydWVcclxuICAgICAgICAgKi9cclxuICAgICAgICByZW9yZGVyRW5hYmxlZD86IGJvb2xlYW47XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIERlY2lkZXMgd2hhdCB3aWxsIGJlIG9wZW5lZCBpbiBhIG5ldyB3aW5kb3cgaWYgdGhlIHVzZXIgY2xpY2tzIHRoZSBwb3BvdXQgaWNvbi4gSWYgdHJ1ZSB0aGUgZW50aXJlIHN0YWNrIHdpbGxcclxuICAgICAgICAgKiBiZSB0cmFuc2ZlcnJlZCB0byB0aGUgbmV3IHdpbmRvdywgaWYgZmFsc2Ugb25seSB0aGUgYWN0aXZlIGNvbXBvbmVudCB3aWxsIGJlIG9wZW5lZC5cclxuICAgICAgICAgKiBEZWZhdWx0OiBmYWxzZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHBvcG91dFdob2xlU3RhY2s/OiBib29sZWFuO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTcGVjaWZpZXMgaWYgYW4gZXJyb3IgaXMgdGhyb3duIHdoZW4gYSBwb3BvdXQgaXMgYmxvY2tlZCBieSB0aGUgYnJvd3NlciAoZS5nLiBieSBvcGVuaW5nIGl0IHByb2dyYW1tYXRpY2FsbHkpLlxyXG4gICAgICAgICAqIElmIGZhbHNlLCB0aGUgcG9wb3V0IGNhbGwgd2lsbCBmYWlsIHNpbGVudGx5LlxyXG4gICAgICAgICAqIERlZmF1bHQ6IHRydWVcclxuICAgICAgICAgKi9cclxuICAgICAgICBibG9ja2VkUG9wb3V0c1Rocm93RXJyb3I/OiBib29sZWFuO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTcGVjaWZpZXMgaWYgYWxsIHBvcG91dHMgc2hvdWxkIGJlIGNsb3NlZCB3aGVuIHRoZSBwYWdlIHRoYXQgY3JlYXRlZCB0aGVtIGlzIGNsb3NlZC4gUG9wb3V0cyBkb24ndCBoYXZlIGFcclxuICAgICAgICAgKiBzdHJvbmcgZGVwZW5kZW5jeSBvbiB0aGVpciBwYXJlbnQgYW5kIGNhbiBleGlzdCBvbiB0aGVpciBvd24sIGJ1dCBjYW4gYmUgcXVpdGUgYW5ub3lpbmcgdG8gY2xvc2UgYnkgaGFuZC4gSW5cclxuICAgICAgICAgKiBhZGRpdGlvbiwgYW55IGNoYW5nZXMgbWFkZSB0byBwb3BvdXRzIHdvbid0IGJlIHN0b3JlZCBhZnRlciB0aGUgcGFyZW50IGlzIGNsb3NlZC5cclxuICAgICAgICAgKiBEZWZhdWx0OiB0cnVlXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIHZlcnNpb24gMy5cclxuICAgICAgICAgKi9cclxuICAgICAgICBjbG9zZVBvcG91dHNPblVubG9hZD86IGJvb2xlYW47XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNwZWNpZmllcyBpZiB0aGUgcG9wb3V0IGljb24gc2hvdWxkIGJlIGRpc3BsYXllZCBpbiB0aGUgaGVhZGVyLWJhci5cclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oSGVhZGVyOmludGVyZmFjZSkucG9wb3V0fSBpbnN0ZWFkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2hvd1BvcG91dEljb24/OiBib29sZWFuO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTcGVjaWZpZXMgaWYgdGhlIG1heGltaXNlIGljb24gc2hvdWxkIGJlIGRpc3BsYXllZCBpbiB0aGUgaGVhZGVyLWJhci5cclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oSGVhZGVyOmludGVyZmFjZSkubWF4aW1pc2V9IGluc3RlYWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBzaG93TWF4aW1pc2VJY29uPzogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU3BlY2lmaWVzIGlmIHRoZSBjbG9zZSBpY29uIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIGhlYWRlci1iYXIuXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKEhlYWRlcjppbnRlcmZhY2UpLmNsb3NlfSBpbnN0ZWFkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2hvd0Nsb3NlSWNvbj86IGJvb2xlYW47XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNwZWNpZmllcyBSZXNwb25zaXZlIE1vZGUgKG1vcmUgaW5mbyBuZWVkZWQpLlxyXG4gICAgICAgICAqIERlZmF1bHQ6IG5vbmVcclxuICAgICAgICAgKi9cclxuICAgICAgICByZXNwb25zaXZlTW9kZT86IFJlc3BvbnNpdmVNb2RlO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTcGVjaWZpZXMgTWF4aW11bSBwaXhlbCBvdmVybGFwIHBlciB0YWIuXHJcbiAgICAgICAgICogRGVmYXVsdDogMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRhYk92ZXJsYXBBbGxvd2FuY2U/OiBudW1iZXI7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogRGVmYXVsdDogdHJ1ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHJlb3JkZXJPblRhYk1lbnVDbGljaz86IGJvb2xlYW47XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIERlZmF1bHQ6IDEwXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGFiQ29udHJvbE9mZnNldD86IG51bWJlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gcG9wIGluIGVsZW1lbnRzIHdoZW4gY2xvc2luZyBhIHBvcG91dCB3aW5kb3cuXHJcbiAgICAgICAgICogRGVmYXVsdDogZmFsc2VcclxuICAgICAgICAgKi9cclxuICAgICAgICBwb3BJbk9uQ2xvc2U/OiBib29sZWFuO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBuYW1lc3BhY2UgU2V0dGluZ3Mge1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKHNldHRpbmdzOiBTZXR0aW5ncyB8IHVuZGVmaW5lZCk6IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncyA9IHtcclxuICAgICAgICAgICAgICAgIGRyYWdCZXR3ZWVuV2luZG93czogc2V0dGluZ3M/LmRyYWdCZXR3ZWVuV2luZG93cyA/PyBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5kZWZhdWx0cy5kcmFnQmV0d2VlbldpbmRvd3MsXHJcbiAgICAgICAgICAgICAgICBkcmFnVG9OZXdXaW5kb3c6IHNldHRpbmdzPy5kcmFnVG9OZXdXaW5kb3cgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuZGVmYXVsdHMuZHJhZ1RvTmV3V2luZG93LFxyXG4gICAgICAgICAgICAgICAgcmVvcmRlckVuYWJsZWQ6IHNldHRpbmdzPy5yZW9yZGVyRW5hYmxlZCA/PyBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5kZWZhdWx0cy5yZW9yZGVyRW5hYmxlZCxcclxuICAgICAgICAgICAgICAgIHBvcG91dFdob2xlU3RhY2s6IHNldHRpbmdzPy5wb3BvdXRXaG9sZVN0YWNrID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmRlZmF1bHRzLnBvcG91dFdob2xlU3RhY2ssXHJcbiAgICAgICAgICAgICAgICBibG9ja2VkUG9wb3V0c1Rocm93RXJyb3I6IHNldHRpbmdzPy5ibG9ja2VkUG9wb3V0c1Rocm93RXJyb3IgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuZGVmYXVsdHMuYmxvY2tlZFBvcG91dHNUaHJvd0Vycm9yLFxyXG4gICAgICAgICAgICAgICAgY2xvc2VQb3BvdXRzT25VbmxvYWQ6IHNldHRpbmdzPy5jbG9zZVBvcG91dHNPblVubG9hZCA/PyBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5kZWZhdWx0cy5jbG9zZVBvcG91dHNPblVubG9hZCxcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNpdmVNb2RlOiBzZXR0aW5ncz8ucmVzcG9uc2l2ZU1vZGUgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuZGVmYXVsdHMucmVzcG9uc2l2ZU1vZGUsXHJcbiAgICAgICAgICAgICAgICB0YWJPdmVybGFwQWxsb3dhbmNlOiBzZXR0aW5ncz8udGFiT3ZlcmxhcEFsbG93YW5jZSA/PyBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5kZWZhdWx0cy50YWJPdmVybGFwQWxsb3dhbmNlLFxyXG4gICAgICAgICAgICAgICAgcmVvcmRlck9uVGFiTWVudUNsaWNrOiBzZXR0aW5ncz8ucmVvcmRlck9uVGFiTWVudUNsaWNrID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmRlZmF1bHRzLnJlb3JkZXJPblRhYk1lbnVDbGljayxcclxuICAgICAgICAgICAgICAgIHRhYkNvbnRyb2xPZmZzZXQ6IHNldHRpbmdzPy50YWJDb250cm9sT2Zmc2V0ID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmRlZmF1bHRzLnRhYkNvbnRyb2xPZmZzZXQsXHJcbiAgICAgICAgICAgICAgICBwb3BJbk9uQ2xvc2U6IHNldHRpbmdzPy5wb3BJbk9uQ2xvc2UgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuZGVmYXVsdHMucG9wSW5PbkNsb3NlLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgRGltZW5zaW9ucyB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSBib3JkZXJzIGJldHdlZW4gdGhlIGxheW91dCBpdGVtcyBpbiBwaXhlbC4gUGxlYXNlIG5vdGU6IFRoZSBhY3R1YWwgZHJhZ2dhYmxlIGFyZWEgaXMgd2lkZXJcclxuICAgICAgICAgKiB0aGFuIHRoZSB2aXNpYmxlIG9uZSwgbWFraW5nIGl0IHNhZmUgdG8gc2V0IHRoaXMgdG8gc21hbGwgdmFsdWVzIHdpdGhvdXQgYWZmZWN0aW5nIHVzYWJpbGl0eS5cclxuICAgICAgICAgKiBEZWZhdWx0OiA1XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgYm9yZGVyV2lkdGg/OiBudW1iZXI7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIERlZmF1bHQ6IDE1XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgYm9yZGVyR3JhYldpZHRoPzogbnVtYmVyLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbWluaW11bSBoZWlnaHQgYW4gaXRlbSBjYW4gYmUgcmVzaXplZCB0byAoaW4gcGl4ZWwpLlxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzpuYW1lc3BhY2UpLihEaW1lbnNpb25zOmludGVyZmFjZSkuZGVmYXVsdE1pbkl0ZW1IZWlnaHR9IGluc3RlYWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBtaW5JdGVtSGVpZ2h0PzogbnVtYmVyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbWluaW11bSBoZWlnaHQgYW4gaXRlbSBjYW4gYmUgcmVzaXplZCB0by5cclxuICAgICAgICAgKiBEZWZhdWx0OiAwXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZGVmYXVsdE1pbkl0ZW1IZWlnaHQ/OiBzdHJpbmc7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBtaW5pbXVtIHdpZHRoIGFuIGl0ZW0gY2FuIGJlIHJlc2l6ZWQgdG8gKGluIHBpeGVsKS5cclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oRGltZW5zaW9uczppbnRlcmZhY2UpLmRlZmF1bHRNaW5JdGVtV2lkdGh9IGluc3RlYWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBtaW5JdGVtV2lkdGg/OiBudW1iZXI7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBtaW5pbXVtIHdpZHRoIGFuIGl0ZW0gY2FuIGJlIHJlc2l6ZWQgdG8uXHJcbiAgICAgICAgICogRGVmYXVsdDogMTBweFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGRlZmF1bHRNaW5JdGVtV2lkdGg/OiBzdHJpbmc7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIGhlYWRlciBlbGVtZW50cyBpbiBwaXhlbC4gVGhpcyBjYW4gYmUgY2hhbmdlZCwgYnV0IHlvdXIgdGhlbWUncyBoZWFkZXIgY3NzIG5lZWRzIHRvIGJlXHJcbiAgICAgICAgICogYWRqdXN0ZWQgYWNjb3JkaW5nbHkuXHJcbiAgICAgICAgICogRGVmYXVsdDogMjBcclxuICAgICAgICAgKi9cclxuICAgICAgICBoZWFkZXJIZWlnaHQ/OiBudW1iZXI7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgZWxlbWVudCB0aGF0IGFwcGVhcnMgd2hlbiBhbiBpdGVtIGlzIGRyYWdnZWQgKGluIHBpeGVsKS5cclxuICAgICAgICAgKiBEZWZhdWx0OiAzMDBcclxuICAgICAgICAgKi9cclxuICAgICAgICBkcmFnUHJveHlXaWR0aD86IG51bWJlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGhlaWdodCBvZiB0aGUgZWxlbWVudCB0aGF0IGFwcGVhcnMgd2hlbiBhbiBpdGVtIGlzIGRyYWdnZWQgKGluIHBpeGVsKS5cclxuICAgICAgICAgKiBEZWZhdWx0OiAyMDBcclxuICAgICAgICAgKi9cclxuICAgICAgICBkcmFnUHJveHlIZWlnaHQ/OiBudW1iZXI7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBEaW1lbnNpb25zIHtcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUoZGltZW5zaW9uczogRGltZW5zaW9ucyB8IHVuZGVmaW5lZCk6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMge1xyXG4gICAgICAgICAgICBjb25zdCB7IHNpemU6IGRlZmF1bHRNaW5JdGVtSGVpZ2h0LCBzaXplVW5pdDogZGVmYXVsdE1pbkl0ZW1IZWlnaHRVbml0IH0gPSBEaW1lbnNpb25zLnJlc29sdmVEZWZhdWx0TWluSXRlbUhlaWdodChkaW1lbnNpb25zKTtcclxuICAgICAgICAgICAgY29uc3QgeyBzaXplOiBkZWZhdWx0TWluSXRlbVdpZHRoLCBzaXplVW5pdDogZGVmYXVsdE1pbkl0ZW1XaWR0aFVuaXQgfSA9IERpbWVuc2lvbnMucmVzb2x2ZURlZmF1bHRNaW5JdGVtV2lkdGgoZGltZW5zaW9ucyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucyA9IHtcclxuICAgICAgICAgICAgICAgIGJvcmRlcldpZHRoOiBkaW1lbnNpb25zPy5ib3JkZXJXaWR0aCA/PyBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmRlZmF1bHRzLmJvcmRlcldpZHRoLFxyXG4gICAgICAgICAgICAgICAgYm9yZGVyR3JhYldpZHRoOiBkaW1lbnNpb25zPy5ib3JkZXJHcmFiV2lkdGggPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5kZWZhdWx0cy5ib3JkZXJHcmFiV2lkdGgsXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0TWluSXRlbUhlaWdodCxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtSGVpZ2h0VW5pdCxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtV2lkdGgsXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0TWluSXRlbVdpZHRoVW5pdCxcclxuICAgICAgICAgICAgICAgIGhlYWRlckhlaWdodDogZGltZW5zaW9ucz8uaGVhZGVySGVpZ2h0ID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuZGVmYXVsdHMuaGVhZGVySGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgZHJhZ1Byb3h5V2lkdGg6IGRpbWVuc2lvbnM/LmRyYWdQcm94eVdpZHRoID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuZGVmYXVsdHMuZHJhZ1Byb3h5V2lkdGgsXHJcbiAgICAgICAgICAgICAgICBkcmFnUHJveHlIZWlnaHQ6IGRpbWVuc2lvbnM/LmRyYWdQcm94eUhlaWdodCA/PyBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmRlZmF1bHRzLmRyYWdQcm94eUhlaWdodCxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiBmcm9tUmVzb2x2ZWQocmVzb2x2ZWREaW1lbnNpb25zOiBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zKTogRGltZW5zaW9ucyB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogRGltZW5zaW9ucyA9IHtcclxuICAgICAgICAgICAgICAgIGJvcmRlcldpZHRoOiByZXNvbHZlZERpbWVuc2lvbnMuYm9yZGVyV2lkdGgsXHJcbiAgICAgICAgICAgICAgICBib3JkZXJHcmFiV2lkdGg6IHJlc29sdmVkRGltZW5zaW9ucy5ib3JkZXJHcmFiV2lkdGgsXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0TWluSXRlbUhlaWdodDogZm9ybWF0U2l6ZShyZXNvbHZlZERpbWVuc2lvbnMuZGVmYXVsdE1pbkl0ZW1IZWlnaHQsIHJlc29sdmVkRGltZW5zaW9ucy5kZWZhdWx0TWluSXRlbUhlaWdodFVuaXQpLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1XaWR0aDogZm9ybWF0U2l6ZShyZXNvbHZlZERpbWVuc2lvbnMuZGVmYXVsdE1pbkl0ZW1XaWR0aCwgcmVzb2x2ZWREaW1lbnNpb25zLmRlZmF1bHRNaW5JdGVtV2lkdGhVbml0KSxcclxuICAgICAgICAgICAgICAgIGhlYWRlckhlaWdodDogcmVzb2x2ZWREaW1lbnNpb25zLmhlYWRlckhlaWdodCxcclxuICAgICAgICAgICAgICAgIGRyYWdQcm94eVdpZHRoOiByZXNvbHZlZERpbWVuc2lvbnMuZHJhZ1Byb3h5V2lkdGgsXHJcbiAgICAgICAgICAgICAgICBkcmFnUHJveHlIZWlnaHQ6IHJlc29sdmVkRGltZW5zaW9ucy5kcmFnUHJveHlIZWlnaHQsXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRGVmYXVsdE1pbkl0ZW1IZWlnaHQoZGltZW5zaW9uczogRGltZW5zaW9ucyB8IHVuZGVmaW5lZCk6IFNpemVXaXRoVW5pdCB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGRpbWVuc2lvbnM/LmRlZmF1bHRNaW5JdGVtSGVpZ2h0O1xyXG4gICAgICAgICAgICBpZiAoaGVpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IHNpemU6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuZGVmYXVsdHMuZGVmYXVsdE1pbkl0ZW1IZWlnaHQsIHNpemVVbml0OiBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmRlZmF1bHRzLmRlZmF1bHRNaW5JdGVtSGVpZ2h0VW5pdCB9O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlU2l6ZShoZWlnaHQsIFtTaXplVW5pdEVudW0uUGl4ZWxdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRGVmYXVsdE1pbkl0ZW1XaWR0aChkaW1lbnNpb25zOiBEaW1lbnNpb25zIHwgdW5kZWZpbmVkKTogU2l6ZVdpdGhVbml0IHtcclxuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBkaW1lbnNpb25zPy5kZWZhdWx0TWluSXRlbVdpZHRoO1xyXG4gICAgICAgICAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc2l6ZTogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5kZWZhdWx0cy5kZWZhdWx0TWluSXRlbVdpZHRoLCBzaXplVW5pdDogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5kZWZhdWx0cy5kZWZhdWx0TWluSXRlbVdpZHRoVW5pdCB9O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlU2l6ZSh3aWR0aCwgW1NpemVVbml0RW51bS5QaXhlbF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgTGFiZWxzIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oSGVhZGVyOmludGVyZmFjZSkuY2xvc2V9IGluc3RlYWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBjbG9zZT86IHN0cmluZztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKEhlYWRlcjppbnRlcmZhY2UpLm1heGltaXNlfSBpbnN0ZWFkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbWF4aW1pc2U/OiBzdHJpbmc7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzpuYW1lc3BhY2UpLihIZWFkZXI6aW50ZXJmYWNlKS5taW5pbWlzZX0gaW5zdGVhZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG1pbmltaXNlPzogc3RyaW5nO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oSGVhZGVyOmludGVyZmFjZSkucG9waW59IGluc3RlYWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBwb3Bpbj86IHN0cmluZztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKEhlYWRlcjppbnRlcmZhY2UpLnBvcG91dH0gaW5zdGVhZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHBvcG91dD86IHN0cmluZztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKEhlYWRlcjppbnRlcmZhY2UpLnRhYkRyb3Bkb3dufSBpbnN0ZWFkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGFiRHJvcGRvd24/OiBzdHJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBIZWFkZXIge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIGhlYWRlciBzaG91bGQgYmUgZGlzcGxheWVkLCBhbmQgaWYgc28sIG9uIHdoaWNoIHNpZGUuXHJcbiAgICAgICAgICogSWYgZmFsc2UsIHRoZSBsYXlvdXQgd2lsbCBiZSBkaXNwbGF5ZWQgd2l0aCBzcGxpdHRlcnMgb25seS5cclxuICAgICAgICAgKiBEZWZhdWx0OiAndG9wJ1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHNob3c/OiBmYWxzZSB8IFNpZGU7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRvb2x0aXAgdGV4dCB0aGF0IGFwcGVhcnMgd2hlbiBob3ZlcmluZyBvdmVyIHRoZSBwb3BvdXQgaWNvbiBvciBmYWxzZSBpZiBwb3BvdXQgYnV0dG9uIG5vdCBkaXNwbGF5ZWQuXHJcbiAgICAgICAgICogRGVmYXVsdDogJ29wZW4gaW4gbmV3IHdpbmRvdydcclxuICAgICAgICAgKi9cclxuICAgICAgICBwb3BvdXQ/OiBmYWxzZSB8IHN0cmluZztcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdG9vbHRpcCB0ZXh0IHRoYXQgYXBwZWFycyB3aGVuIGhvdmVyaW5nIG92ZXIgdGhlIHBvcGluIGljb24uXHJcbiAgICAgICAgICogRGVmYXVsdDogJ3BvcCBpbidcclxuICAgICAgICAgKi9cclxuICAgICAgICBwb3Bpbj86IHN0cmluZztcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdG9vbHRpcCB0ZXh0IHRoYXQgYXBwZWFycyB3aGVuIGhvdmVyaW5nIG92ZXIgdGhlIG1heGltaXNlIGljb24gb3IgZmFsc2UgaWYgbWF4aW1pc2VkIGJ1dHRvbiBub3QgZGlzcGxheWVkLlxyXG4gICAgICAgICAqIERlZmF1bHQ6ICdtYXhpbWlzZSdcclxuICAgICAgICAgKi9cclxuICAgICAgICBtYXhpbWlzZT86IGZhbHNlIHwgc3RyaW5nO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0b29sdGlwIHRleHQgdGhhdCBhcHBlYXJzIHdoZW4gaG92ZXJpbmcgb3ZlciB0aGUgY2xvc2UgaWNvbi5cclxuICAgICAgICAgKiBEZWZhdWx0OiAnY2xvc2UnXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY2xvc2U/OiBmYWxzZSB8IHN0cmluZztcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdG9vbHRpcCB0ZXh0IHRoYXQgYXBwZWFycyB3aGVuIGhvdmVyaW5nIG92ZXIgdGhlIG1pbmltaXNlIGljb24uXHJcbiAgICAgICAgICogRGVmYXVsdDogJ21pbmltaXNlJ1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG1pbmltaXNlPzogc3RyaW5nO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogRGVmYXVsdDogJ2FkZGl0aW9uYWwgdGFicydcclxuICAgICAgICAgKi9cclxuICAgICAgICB0YWJEcm9wZG93bj86IGZhbHNlIHwgc3RyaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBuYW1lc3BhY2UgSGVhZGVyIHtcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUoaGVhZGVyOiBIZWFkZXIgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiBMYXlvdXRDb25maWcuU2V0dGluZ3MgfCB1bmRlZmluZWQsIGxhYmVsczogTGF5b3V0Q29uZmlnLkxhYmVscyB8IHVuZGVmaW5lZFxyXG4gICAgICAgICk6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlciB7XHJcbiAgICAgICAgICAgIGxldCBzaG93OiBmYWxzZSB8IFNpZGU7XHJcbiAgICAgICAgICAgIGlmIChoZWFkZXI/LnNob3cgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgc2hvdyA9IGhlYWRlci5zaG93O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzICE9PSB1bmRlZmluZWQgJiYgc2V0dGluZ3MuaGFzSGVhZGVycyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdyA9IHNldHRpbmdzLmhhc0hlYWRlcnMgPyBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuZGVmYXVsdHMuc2hvdyA6IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzaG93ID0gUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmRlZmF1bHRzLnNob3c7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIgPSB7XHJcbiAgICAgICAgICAgICAgICBzaG93LFxyXG4gICAgICAgICAgICAgICAgcG9wb3V0OiBoZWFkZXI/LnBvcG91dCA/PyBsYWJlbHM/LnBvcG91dCA/P1xyXG4gICAgICAgICAgICAgICAgICAgIChzZXR0aW5ncz8uc2hvd1BvcG91dEljb24gPT09IGZhbHNlID8gZmFsc2UgOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuZGVmYXVsdHMucG9wb3V0KSxcclxuICAgICAgICAgICAgICAgIHBvcGluOiBoZWFkZXI/LnBvcGluID8/IGxhYmVscz8ucG9waW4gPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmRlZmF1bHRzLnBvcGluLFxyXG4gICAgICAgICAgICAgICAgbWF4aW1pc2U6IGhlYWRlcj8ubWF4aW1pc2UgPz8gbGFiZWxzPy5tYXhpbWlzZSA/P1xyXG4gICAgICAgICAgICAgICAgICAgIChzZXR0aW5ncz8uc2hvd01heGltaXNlSWNvbiA9PT0gZmFsc2UgPyBmYWxzZSA6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5kZWZhdWx0cy5tYXhpbWlzZSksXHJcbiAgICAgICAgICAgICAgICBjbG9zZTogaGVhZGVyPy5jbG9zZSA/PyBsYWJlbHM/LmNsb3NlID8/XHJcbiAgICAgICAgICAgICAgICAgICAgKHNldHRpbmdzPy5zaG93Q2xvc2VJY29uID09PSBmYWxzZSA/IGZhbHNlIDogUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmRlZmF1bHRzLmNsb3NlKSxcclxuICAgICAgICAgICAgICAgIG1pbmltaXNlOiBoZWFkZXI/Lm1pbmltaXNlID8/IGxhYmVscz8ubWluaW1pc2UgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmRlZmF1bHRzLm1pbmltaXNlLFxyXG4gICAgICAgICAgICAgICAgdGFiRHJvcGRvd246IGhlYWRlcj8udGFiRHJvcGRvd24gPz8gbGFiZWxzPy50YWJEcm9wZG93biA/PyBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuZGVmYXVsdHMudGFiRHJvcGRvd24sXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzUG9wb3V0KGNvbmZpZzogTGF5b3V0Q29uZmlnKTogY29uZmlnIGlzIFBvcG91dExheW91dENvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuICdwYXJlbnRJZCcgaW4gY29uZmlnIHx8ICdpbmRleEluUGFyZW50JyBpbiBjb25maWcgfHwgJ3dpbmRvdycgaW4gY29uZmlnO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKGxheW91dENvbmZpZzogTGF5b3V0Q29uZmlnKTogUmVzb2x2ZWRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIGlmIChpc1BvcG91dChsYXlvdXRDb25maWcpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQb3BvdXRMYXlvdXRDb25maWcucmVzb2x2ZShsYXlvdXRDb25maWcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCByb290OiBSb290SXRlbUNvbmZpZyB8IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgaWYgKGxheW91dENvbmZpZy5yb290ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJvb3QgPSBsYXlvdXRDb25maWcucm9vdDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChsYXlvdXRDb25maWcuY29udGVudCAhPT0gdW5kZWZpbmVkICYmIGxheW91dENvbmZpZy5jb250ZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICByb290ID0gbGF5b3V0Q29uZmlnLmNvbnRlbnRbMF07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvb3QgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgY29uZmlnOiBSZXNvbHZlZExheW91dENvbmZpZyA9IHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgcm9vdDogUm9vdEl0ZW1Db25maWcucmVzb2x2ZShyb290KSxcclxuICAgICAgICAgICAgICAgIG9wZW5Qb3BvdXRzOiBMYXlvdXRDb25maWcucmVzb2x2ZU9wZW5Qb3BvdXRzKGxheW91dENvbmZpZy5vcGVuUG9wb3V0cyksXHJcbiAgICAgICAgICAgICAgICBkaW1lbnNpb25zOiBMYXlvdXRDb25maWcuRGltZW5zaW9ucy5yZXNvbHZlKGxheW91dENvbmZpZy5kaW1lbnNpb25zKSxcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzOiBMYXlvdXRDb25maWcuU2V0dGluZ3MucmVzb2x2ZShsYXlvdXRDb25maWcuc2V0dGluZ3MpLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyOiBMYXlvdXRDb25maWcuSGVhZGVyLnJlc29sdmUobGF5b3V0Q29uZmlnLmhlYWRlciwgbGF5b3V0Q29uZmlnLnNldHRpbmdzLCBsYXlvdXRDb25maWcubGFiZWxzKSxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY29uZmlnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZnJvbVJlc29sdmVkKGNvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWcpOiBMYXlvdXRDb25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogTGF5b3V0Q29uZmlnID0ge1xyXG4gICAgICAgICAgICByb290OiBSb290SXRlbUNvbmZpZy5mcm9tUmVzb2x2ZWRPclVuZGVmaW5lZChjb25maWcucm9vdCksXHJcbiAgICAgICAgICAgIG9wZW5Qb3BvdXRzOiBQb3BvdXRMYXlvdXRDb25maWcuZnJvbVJlc29sdmVkQXJyYXkoY29uZmlnLm9wZW5Qb3BvdXRzKSxcclxuICAgICAgICAgICAgc2V0dGluZ3M6IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmNyZWF0ZUNvcHkoY29uZmlnLnNldHRpbmdzKSxcclxuICAgICAgICAgICAgZGltZW5zaW9uczogTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuZnJvbVJlc29sdmVkKGNvbmZpZy5kaW1lbnNpb25zKSxcclxuICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuY3JlYXRlQ29weShjb25maWcuaGVhZGVyKSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzUmVzb2x2ZWQoY29uZmlnT3JSZXNvbHZlZENvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWcgfCBMYXlvdXRDb25maWcpOiBjb25maWdPclJlc29sdmVkQ29uZmlnIGlzIFJlc29sdmVkTGF5b3V0Q29uZmlnIHtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBjb25maWdPclJlc29sdmVkQ29uZmlnIGFzIFJlc29sdmVkTGF5b3V0Q29uZmlnO1xyXG4gICAgICAgIHJldHVybiBjb25maWcucmVzb2x2ZWQgIT09IHVuZGVmaW5lZCAmJiAoY29uZmlnLnJlc29sdmVkID09PSB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU9wZW5Qb3BvdXRzKHBvcG91dENvbmZpZ3M6IFBvcG91dExheW91dENvbmZpZ1tdIHwgdW5kZWZpbmVkKTogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWdbXSB7XHJcbiAgICAgICAgaWYgKHBvcG91dENvbmZpZ3MgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgY291bnQgPSBwb3BvdXRDb25maWdzLmxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnPihjb3VudCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gUG9wb3V0TGF5b3V0Q29uZmlnLnJlc29sdmUocG9wb3V0Q29uZmlnc1tpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUG9wb3V0TGF5b3V0Q29uZmlnIGV4dGVuZHMgTGF5b3V0Q29uZmlnIHtcclxuICAgIC8qKiBUaGUgaWQgb2YgdGhlIGVsZW1lbnQgdGhlIGl0ZW0gd2lsbCBiZSBhcHBlbmRlZCB0byBvbiBwb3BJblxyXG4gICAgKiBJZiBudWxsLCBhcHBlbmQgdG8gdG9wbW9zdCBsYXlvdXQgZWxlbWVudFxyXG4gICAgKi9cclxuICAgIHBhcmVudElkOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIFRoZSBwb3NpdGlvbiBvZiB0aGlzIGVsZW1lbnQgd2l0aGluIGl0cyBwYXJlbnRcclxuICAgICogSWYgbnVsbCwgcG9zaXRpb24gaXMgbGFzdFxyXG4gICAgKi9cclxuICAgIGluZGV4SW5QYXJlbnQ6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoUG9wb3V0TGF5b3V0Q29uZmlnOmludGVyZmFjZSkud2luZG93fSAqL1xyXG4gICAgZGltZW5zaW9uczogUG9wb3V0TGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMgfCB1bmRlZmluZWQ7IC8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxyXG4gICAgd2luZG93OiBQb3BvdXRMYXlvdXRDb25maWcuV2luZG93IHwgdW5kZWZpbmVkO1xyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFBvcG91dExheW91dENvbmZpZyB7XHJcbiAgICAvLyBQcmV2aW91cyB2ZXJzaW9ucyBrZXB0IHdpbmRvdyBpbmZvcm1hdGlvbiBpbiBEaW1lbnNpb25zIGtleS4gIE9ubHkgdXNlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxyXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKFBvcG91dExheW91dENvbmZpZzpuYW1lc3BhY2UpLihXaW5kb3c6aW50ZXJmYWNlKX0gKi9cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgRGltZW5zaW9ucyBleHRlbmRzIExheW91dENvbmZpZy5EaW1lbnNpb25zIHtcclxuICAgICAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoUG9wb3V0TGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKFdpbmRvdzppbnRlcmZhY2UpLndpZHRofSAqL1xyXG4gICAgICAgIHdpZHRoPzogbnVtYmVyIHwgbnVsbCxcclxuICAgICAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoUG9wb3V0TGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKFdpbmRvdzppbnRlcmZhY2UpLmhlaWdodH0gKi9cclxuICAgICAgICBoZWlnaHQ/OiBudW1iZXIgfCBudWxsLFxyXG4gICAgICAgIC8qKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChQb3BvdXRMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oV2luZG93OmludGVyZmFjZSkubGVmdH0gKi9cclxuICAgICAgICBsZWZ0PzogbnVtYmVyIHwgbnVsbCxcclxuICAgICAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoUG9wb3V0TGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKFdpbmRvdzppbnRlcmZhY2UpLnRvcH0gKi9cclxuICAgICAgICB0b3A/OiBudW1iZXIgfCBudWxsLFxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgV2luZG93IHtcclxuICAgICAgICB3aWR0aD86IG51bWJlcixcclxuICAgICAgICBoZWlnaHQ/OiBudW1iZXIsXHJcbiAgICAgICAgbGVmdD86IG51bWJlcixcclxuICAgICAgICB0b3A/OiBudW1iZXIsXHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBXaW5kb3cge1xyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZSh3aW5kb3c6IFdpbmRvdyB8IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgZGltZW5zaW9uczogRGltZW5zaW9ucyB8IHVuZGVmaW5lZCk6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvd1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdDogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcuV2luZG93O1xyXG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0cyA9IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvdy5kZWZhdWx0cztcclxuICAgICAgICAgICAgaWYgKHdpbmRvdyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpbmRvdy53aWR0aCA/PyBkZWZhdWx0cy53aWR0aCxcclxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHdpbmRvdy5oZWlnaHQgPz8gZGVmYXVsdHMuaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IHdpbmRvdy5sZWZ0ID8/IGRlZmF1bHRzLmxlZnQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9wOiB3aW5kb3cudG9wID8/IGRlZmF1bHRzLnRvcCxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogZGltZW5zaW9ucz8ud2lkdGggPz8gZGVmYXVsdHMud2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBkaW1lbnNpb25zPy5oZWlnaHQgPz8gZGVmYXVsdHMuaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IGRpbWVuc2lvbnM/LmxlZnQgPz8gZGVmYXVsdHMubGVmdCxcclxuICAgICAgICAgICAgICAgICAgICB0b3A6IGRpbWVuc2lvbnM/LnRvcCA/PyBkZWZhdWx0cy50b3AsXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gZnJvbVJlc29sdmVkKHJlc29sdmVkV2luZG93OiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3cpOiBXaW5kb3cge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IFdpbmRvdyA9IHtcclxuICAgICAgICAgICAgICAgIHdpZHRoOiByZXNvbHZlZFdpbmRvdy53aWR0aCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJlc29sdmVkV2luZG93LndpZHRoLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiByZXNvbHZlZFdpbmRvdy5oZWlnaHQgPT09IG51bGwgPyB1bmRlZmluZWQgOiByZXNvbHZlZFdpbmRvdy5oZWlnaHQsXHJcbiAgICAgICAgICAgICAgICBsZWZ0OiByZXNvbHZlZFdpbmRvdy5sZWZ0ID09PSBudWxsID8gdW5kZWZpbmVkIDogcmVzb2x2ZWRXaW5kb3cubGVmdCxcclxuICAgICAgICAgICAgICAgIHRvcDogcmVzb2x2ZWRXaW5kb3cudG9wID09PSBudWxsID8gdW5kZWZpbmVkIDogcmVzb2x2ZWRXaW5kb3cudG9wLFxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShwb3BvdXRDb25maWc6IFBvcG91dExheW91dENvbmZpZyk6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnIHtcclxuICAgICAgICBsZXQgcm9vdDogUm9vdEl0ZW1Db25maWcgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgaWYgKHBvcG91dENvbmZpZy5yb290ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcm9vdCA9IHBvcG91dENvbmZpZy5yb290O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChwb3BvdXRDb25maWcuY29udGVudCAhPT0gdW5kZWZpbmVkICYmIHBvcG91dENvbmZpZy5jb250ZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHJvb3QgPSBwb3BvdXRDb25maWcuY29udGVudFswXTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJvb3QgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbmZpZzogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcgPSB7XHJcbiAgICAgICAgICAgIHJvb3Q6IFJvb3RJdGVtQ29uZmlnLnJlc29sdmUocm9vdCksXHJcbiAgICAgICAgICAgIG9wZW5Qb3BvdXRzOiBMYXlvdXRDb25maWcucmVzb2x2ZU9wZW5Qb3BvdXRzKHBvcG91dENvbmZpZy5vcGVuUG9wb3V0cyksXHJcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IExheW91dENvbmZpZy5EaW1lbnNpb25zLnJlc29sdmUocG9wb3V0Q29uZmlnLmRpbWVuc2lvbnMpLFxyXG4gICAgICAgICAgICBzZXR0aW5nczogTGF5b3V0Q29uZmlnLlNldHRpbmdzLnJlc29sdmUocG9wb3V0Q29uZmlnLnNldHRpbmdzKSxcclxuICAgICAgICAgICAgaGVhZGVyOiBMYXlvdXRDb25maWcuSGVhZGVyLnJlc29sdmUocG9wb3V0Q29uZmlnLmhlYWRlciwgcG9wb3V0Q29uZmlnLnNldHRpbmdzLCBwb3BvdXRDb25maWcubGFiZWxzKSxcclxuICAgICAgICAgICAgcGFyZW50SWQ6IHBvcG91dENvbmZpZy5wYXJlbnRJZCA/PyBudWxsLFxyXG4gICAgICAgICAgICBpbmRleEluUGFyZW50OiBwb3BvdXRDb25maWcuaW5kZXhJblBhcmVudCA/PyBudWxsLFxyXG4gICAgICAgICAgICB3aW5kb3c6IFBvcG91dExheW91dENvbmZpZy5XaW5kb3cucmVzb2x2ZShwb3BvdXRDb25maWcud2luZG93LCBwb3BvdXRDb25maWcuZGltZW5zaW9ucyksXHJcbiAgICAgICAgICAgIHJlc29sdmVkOiB0cnVlLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29uZmlnO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmcm9tUmVzb2x2ZWQocmVzb2x2ZWRDb25maWc6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnKTogUG9wb3V0TGF5b3V0Q29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFBvcG91dExheW91dENvbmZpZyA9IHtcclxuICAgICAgICAgICAgcm9vdDogUm9vdEl0ZW1Db25maWcuZnJvbVJlc29sdmVkT3JVbmRlZmluZWQocmVzb2x2ZWRDb25maWcucm9vdCksXHJcbiAgICAgICAgICAgIG9wZW5Qb3BvdXRzOiBmcm9tUmVzb2x2ZWRBcnJheShyZXNvbHZlZENvbmZpZy5vcGVuUG9wb3V0cyksXHJcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IExheW91dENvbmZpZy5EaW1lbnNpb25zLmZyb21SZXNvbHZlZChyZXNvbHZlZENvbmZpZy5kaW1lbnNpb25zKSxcclxuICAgICAgICAgICAgc2V0dGluZ3M6IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmNyZWF0ZUNvcHkocmVzb2x2ZWRDb25maWcuc2V0dGluZ3MpLFxyXG4gICAgICAgICAgICBoZWFkZXI6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5jcmVhdGVDb3B5KHJlc29sdmVkQ29uZmlnLmhlYWRlciksXHJcbiAgICAgICAgICAgIHBhcmVudElkOiByZXNvbHZlZENvbmZpZy5wYXJlbnRJZCxcclxuICAgICAgICAgICAgaW5kZXhJblBhcmVudDogcmVzb2x2ZWRDb25maWcuaW5kZXhJblBhcmVudCxcclxuICAgICAgICAgICAgd2luZG93OiBQb3BvdXRMYXlvdXRDb25maWcuV2luZG93LmZyb21SZXNvbHZlZChyZXNvbHZlZENvbmZpZy53aW5kb3cpLFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZnJvbVJlc29sdmVkQXJyYXkocmVzb2x2ZWRBcnJheTogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWdbXSk6IFBvcG91dExheW91dENvbmZpZ1tdIHtcclxuICAgICAgICBjb25zdCByZXNvbHZlZE9wZW5Qb3BvdXRDb3VudCA9IHJlc29sdmVkQXJyYXkubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxQb3BvdXRMYXlvdXRDb25maWc+KHJlc29sdmVkT3BlblBvcG91dENvdW50KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc29sdmVkT3BlblBvcG91dENvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRPcGVuUG9wb3V0ID0gcmVzb2x2ZWRBcnJheVtpXTtcclxuICAgICAgICAgICAgcmVzdWx0W2ldID0gUG9wb3V0TGF5b3V0Q29uZmlnLmZyb21SZXNvbHZlZChyZXNvbHZlZE9wZW5Qb3BvdXQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNpemVXaXRoVW5pdCB7XHJcbiAgICBzaXplOiBudW1iZXI7XHJcbiAgICBzaXplVW5pdDogU2l6ZVVuaXRFbnVtO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVW5kZWZpbmFibGVTaXplV2l0aFVuaXQge1xyXG4gICAgc2l6ZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gICAgc2l6ZVVuaXQ6IFNpemVVbml0RW51bTtcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTaXplKHNpemVTdHJpbmc6IHN0cmluZywgYWxsb3dhYmxlU2l6ZVVuaXRzOiByZWFkb25seSBTaXplVW5pdEVudW1bXSk6IFNpemVXaXRoVW5pdCB7XHJcbiAgICBjb25zdCB7IG51bWVyaWNQYXJ0OiBkaWdpdHNQYXJ0LCBmaXJzdE5vbk51bWVyaWNDaGFyUGFydDogZmlyc3ROb25EaWdpdFBhcnQgfSA9IHNwbGl0U3RyaW5nQXRGaXJzdE5vbk51bWVyaWNDaGFyKHNpemVTdHJpbmcpO1xyXG4gICAgY29uc3Qgc2l6ZSA9IE51bWJlci5wYXJzZUludChkaWdpdHNQYXJ0LCAxMCk7XHJcbiAgICBpZiAoaXNOYU4oc2l6ZSkpIHtcclxuICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKGAke2kxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5JbnZhbGlkTnVtYmVyUGFydEluU2l6ZVN0cmluZ119OiAke3NpemVTdHJpbmd9YCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHNpemVVbml0ID0gU2l6ZVVuaXRFbnVtLnRyeVBhcnNlKGZpcnN0Tm9uRGlnaXRQYXJ0KTtcclxuICAgICAgICBpZiAoc2l6ZVVuaXQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKGAke2kxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5Vbmtub3duVW5pdEluU2l6ZVN0cmluZ119OiAke3NpemVTdHJpbmd9YClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoIWFsbG93YWJsZVNpemVVbml0cy5pbmNsdWRlcyhzaXplVW5pdCkpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoYCR7aTE4blN0cmluZ3NbSTE4blN0cmluZ0lkLlVuc3VwcG9ydGVkVW5pdEluU2l6ZVN0cmluZ119OiAke3NpemVTdHJpbmd9YClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IHNpemUsIHNpemVVbml0IH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFNpemUoc2l6ZTogbnVtYmVyLCBzaXplVW5pdDogU2l6ZVVuaXRFbnVtKSB7XHJcbiAgICByZXR1cm4gc2l6ZS50b1N0cmluZygxMCkgKyBTaXplVW5pdEVudW0uZm9ybWF0KHNpemVVbml0KTtcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0VW5kZWZpbmFibGVTaXplKHNpemU6IG51bWJlcnwgdW5kZWZpbmVkLCBzaXplVW5pdDogU2l6ZVVuaXRFbnVtKSB7XHJcbiAgICBpZiAoc2l6ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHNpemUudG9TdHJpbmcoMTApICsgU2l6ZVVuaXRFbnVtLmZvcm1hdChzaXplVW5pdCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljIEBkZXByZWNhdGVkIC0gdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOmludGVyZmFjZSl9ICovXHJcbmV4cG9ydCB0eXBlIENvbmZpZyA9IExheW91dENvbmZpZztcclxuIiwiaW1wb3J0IHsgQXNzZXJ0RXJyb3IsIFVucmVhY2hhYmxlQ2FzZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgQ29uZmlnTWluaWZpZXIgfSBmcm9tICcuLi91dGlscy9jb25maWctbWluaWZpZXInO1xyXG5pbXBvcnQgeyBJdGVtVHlwZSwgSnNvblZhbHVlLCBSZXNwb25zaXZlTW9kZSwgU2lkZSwgU2l6ZVVuaXRFbnVtIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQgeyBkZWVwRXh0ZW5kVmFsdWUgfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkSXRlbUNvbmZpZyB7XHJcbiAgICAvLyBzZWUgSXRlbUNvbmZpZyBmb3IgY29tbWVudHNcclxuICAgIHJlYWRvbmx5IHR5cGU6IEl0ZW1UeXBlO1xyXG4gICAgcmVhZG9ubHkgY29udGVudDogcmVhZG9ubHkgUmVzb2x2ZWRJdGVtQ29uZmlnW107XHJcbiAgICByZWFkb25seSBzaXplOiBudW1iZXI7XHJcbiAgICByZWFkb25seSBzaXplVW5pdDogU2l6ZVVuaXRFbnVtO1xyXG4gICAgcmVhZG9ubHkgbWluU2l6ZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gICAgcmVhZG9ubHkgbWluU2l6ZVVuaXQ6IFNpemVVbml0RW51bTtcclxuICAgIC8vIGlkIG5vIGxvbmdlciBzcGVjaWZpZXMgd2hldGhlciBhbiBJdGVtIGlzIG1heGltaXNlZC4gIFRoaXMgaXMgbm93IGRvbmUgYnkgSGVhZGVySXRlbUNvbmZpZy5tYXhpbWlzZWRcclxuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmc7XHJcbiAgICByZWFkb25seSBpc0Nsb3NhYmxlOiBib29sZWFuO1xyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFJlc29sdmVkSXRlbUNvbmZpZyB7XHJcbiAgICBleHBvcnQgY29uc3QgZGVmYXVsdHM6IFJlc29sdmVkSXRlbUNvbmZpZyA9IHtcclxuICAgICAgICB0eXBlOiBJdGVtVHlwZS5ncm91bmQsIC8vIG5vdCByZWFsbHkgZGVmYXVsdCBidXQgbmVlZCBzb21ldGhpbmdcclxuICAgICAgICBjb250ZW50OiBbXSxcclxuICAgICAgICBzaXplOiAxLFxyXG4gICAgICAgIHNpemVVbml0OiBTaXplVW5pdEVudW0uRnJhY3Rpb25hbCxcclxuICAgICAgICBtaW5TaXplOiB1bmRlZmluZWQsXHJcbiAgICAgICAgbWluU2l6ZVVuaXQ6IFNpemVVbml0RW51bS5QaXhlbCxcclxuICAgICAgICBpZDogJycsXHJcbiAgICAgICAgaXNDbG9zYWJsZTogdHJ1ZSxcclxuICAgIH0gYXMgY29uc3Q7XHJcblxyXG4gICAgLyoqIENyZWF0ZXMgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBSZXNvbHZlZEl0ZW1Db25maWcgdXNpbmcgYW4gYWx0ZXJuYXRpdmUgY29udGVudCBpZiBzcGVjaWZpZWQgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KG9yaWdpbmFsOiBSZXNvbHZlZEl0ZW1Db25maWcsIGNvbnRlbnQ/OiBSZXNvbHZlZEl0ZW1Db25maWdbXSk6IFJlc29sdmVkSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgc3dpdGNoIChvcmlnaW5hbC50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuZ3JvdW5kOlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnJvdzpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcuY3JlYXRlQ29weShvcmlnaW5hbCBhcyBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyxcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50IGFzIFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLkNoaWxkSXRlbUNvbmZpZ1tdKTtcclxuXHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuc3RhY2s6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcuY3JlYXRlQ29weShvcmlnaW5hbCBhcyBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZywgY29udGVudCBhcyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWdbXSk7XHJcblxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbXBvbmVudDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcuY3JlYXRlQ29weShvcmlnaW5hbCBhcyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpO1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlYWNoYWJsZUNhc2VFcnJvcignQ0lDQzkxMzU0Jywgb3JpZ2luYWwudHlwZSwgJ0ludmFsaWQgQ29uZmlnIEl0ZW0gdHlwZSBzcGVjaWZpZWQnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHQodHlwZTogSXRlbVR5cGUpOiBSZXNvbHZlZEl0ZW1Db25maWcge1xyXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmdyb3VuZDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignQ0lDQ0RSOTE1NjInKTsgLy8gR2V0IGRlZmF1bHQgcm9vdCBmcm9tIExheW91dENvbmZpZ1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnJvdzpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcuY3JlYXRlRGVmYXVsdCh0eXBlKTtcclxuXHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuc3RhY2s6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcuY3JlYXRlRGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb21wb25lbnQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLmNyZWF0ZURlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ0NJQ0NERDkxNTYzJywgdHlwZSwgJ0ludmFsaWQgQ29uZmlnIEl0ZW0gdHlwZSBzcGVjaWZpZWQnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcG9uZW50SXRlbShpdGVtQ29uZmlnOiBSZXNvbHZlZEl0ZW1Db25maWcpOiBpdGVtQ29uZmlnIGlzIFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW1Db25maWcudHlwZSA9PT0gSXRlbVR5cGUuY29tcG9uZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc1N0YWNrSXRlbShpdGVtQ29uZmlnOiBSZXNvbHZlZEl0ZW1Db25maWcpOiBpdGVtQ29uZmlnIGlzIFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnIHtcclxuICAgICAgICByZXR1cm4gaXRlbUNvbmZpZy50eXBlID09PSBJdGVtVHlwZS5zdGFjaztcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNHcm91bmRJdGVtKGl0ZW1Db25maWc6IFJlc29sdmVkSXRlbUNvbmZpZyk6IGl0ZW1Db25maWcgaXMgUmVzb2x2ZWRHcm91bmRJdGVtQ29uZmlnIHtcclxuICAgICAgICByZXR1cm4gaXRlbUNvbmZpZy50eXBlID09PSBJdGVtVHlwZS5ncm91bmQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8vIFN0YWNrIG9yIENvbXBvbmVudFxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnIGV4dGVuZHMgUmVzb2x2ZWRJdGVtQ29uZmlnIHtcclxuICAgIGhlYWRlcjogUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyIHwgdW5kZWZpbmVkOyAvLyB1bmRlZmluZWQgbWVhbnMgZ2V0IGhlYWRlciBzZXR0aW5ncyBmcm9tIExheW91dENvbmZpZ1xyXG4gICAgcmVhZG9ubHkgbWF4aW1pc2VkOiBib29sZWFuO1xyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnIHtcclxuICAgIGV4cG9ydCBjb25zdCBkZWZhdWx0TWF4aW1pc2VkID0gZmFsc2U7XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBIZWFkZXIge1xyXG4gICAgICAgIC8vIHVuZGVmaW5lZCBtZWFucyBnZXQgcHJvcGVydHkgdmFsdWUgZnJvbSBMYXlvdXRDb25maWdcclxuICAgICAgICByZWFkb25seSBzaG93OiBmYWxzZSB8IFNpZGUgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgcmVhZG9ubHkgcG9wb3V0OiBmYWxzZSB8IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICAgICAgICByZWFkb25seSBtYXhpbWlzZTogZmFsc2UgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgcmVhZG9ubHkgY2xvc2U6IGZhbHNlIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIHJlYWRvbmx5IG1pbmltaXNlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgcmVhZG9ubHkgdGFiRHJvcGRvd246IGZhbHNlIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBuYW1lc3BhY2UgSGVhZGVyIHtcclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29weShvcmlnaW5hbDogSGVhZGVyIHwgdW5kZWZpbmVkLCBzaG93PzogZmFsc2UgfCBTaWRlKTogSGVhZGVyIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICAgICAgaWYgKG9yaWdpbmFsID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3c6IHNob3cgPz8gb3JpZ2luYWwuc2hvdyxcclxuICAgICAgICAgICAgICAgICAgICBwb3BvdXQ6IG9yaWdpbmFsLnBvcG91dCxcclxuICAgICAgICAgICAgICAgICAgICBjbG9zZTogb3JpZ2luYWwuY2xvc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgbWF4aW1pc2U6IG9yaWdpbmFsLm1heGltaXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIG1pbmltaXNlOiBvcmlnaW5hbC5taW5pbWlzZSxcclxuICAgICAgICAgICAgICAgICAgICB0YWJEcm9wZG93bjogb3JpZ2luYWwudGFiRHJvcGRvd24sXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgZXh0ZW5kcyBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZyB7XHJcbiAgICByZWFkb25seSB0eXBlOiAnc3RhY2snO1xyXG4gICAgcmVhZG9ubHkgY29udGVudDogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnW107XHJcbiAgICAvKiogVGhlIGluZGV4IG9mIHRoZSBhY3RpdmUgaXRlbSBpbiB0aGUgU3RhY2suICBPbmx5IHVuZGVmaW5lZCBpZiB0aGUgU3RhY2sgaXMgZW1wdHkuICovXHJcbiAgICByZWFkb25seSBhY3RpdmVJdGVtSW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyB7XHJcbiAgICBleHBvcnQgY29uc3QgZGVmYXVsdEFjdGl2ZUl0ZW1JbmRleCA9IDA7XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkob3JpZ2luYWw6IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnLCBjb250ZW50PzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnW10pOiBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogb3JpZ2luYWwudHlwZSxcclxuICAgICAgICAgICAgY29udGVudDogY29udGVudCAhPT0gdW5kZWZpbmVkID8gY29weUNvbnRlbnQoY29udGVudCkgOiBjb3B5Q29udGVudChvcmlnaW5hbC5jb250ZW50KSxcclxuICAgICAgICAgICAgc2l6ZTogb3JpZ2luYWwuc2l6ZSxcclxuICAgICAgICAgICAgc2l6ZVVuaXQ6IG9yaWdpbmFsLnNpemVVbml0LFxyXG4gICAgICAgICAgICBtaW5TaXplOiBvcmlnaW5hbC5taW5TaXplLFxyXG4gICAgICAgICAgICBtaW5TaXplVW5pdDogb3JpZ2luYWwubWluU2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIGlkOiBvcmlnaW5hbC5pZCxcclxuICAgICAgICAgICAgbWF4aW1pc2VkOiBvcmlnaW5hbC5tYXhpbWlzZWQsXHJcbiAgICAgICAgICAgIGlzQ2xvc2FibGU6IG9yaWdpbmFsLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgICAgIGFjdGl2ZUl0ZW1JbmRleDogb3JpZ2luYWwuYWN0aXZlSXRlbUluZGV4LFxyXG4gICAgICAgICAgICBoZWFkZXI6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlci5jcmVhdGVDb3B5KG9yaWdpbmFsLmhlYWRlciksXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNvcHlDb250ZW50KG9yaWdpbmFsOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWdbXSk6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZ1tdIHtcclxuICAgICAgICBjb25zdCBjb3VudCA9IG9yaWdpbmFsLmxlbmd0aDtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8UmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnPihjb3VudCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdFtpXSA9IFJlc29sdmVkSXRlbUNvbmZpZy5jcmVhdGVDb3B5KG9yaWdpbmFsW2ldKSBhcyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHQoKTogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLnN0YWNrLFxyXG4gICAgICAgICAgICBjb250ZW50OiBbXSxcclxuICAgICAgICAgICAgc2l6ZTogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLnNpemUsXHJcbiAgICAgICAgICAgIHNpemVVbml0OiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuc2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIG1pblNpemU6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5taW5TaXplLFxyXG4gICAgICAgICAgICBtaW5TaXplVW5pdDogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLm1pblNpemVVbml0LFxyXG4gICAgICAgICAgICBpZDogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLmlkLFxyXG4gICAgICAgICAgICBtYXhpbWlzZWQ6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLmRlZmF1bHRNYXhpbWlzZWQsXHJcbiAgICAgICAgICAgIGlzQ2xvc2FibGU6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgICAgICBhY3RpdmVJdGVtSW5kZXg6IGRlZmF1bHRBY3RpdmVJdGVtSW5kZXgsXHJcbiAgICAgICAgICAgIGhlYWRlcjogdW5kZWZpbmVkLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyBleHRlbmRzIFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnIHtcclxuICAgIC8vIHNlZSBDb21wb25lbnRJdGVtQ29uZmlnIGZvciBjb21tZW50c1xyXG4gICAgcmVhZG9ubHkgdHlwZTogJ2NvbXBvbmVudCc7XHJcbiAgICByZWFkb25seSBjb250ZW50OiBbXTtcclxuICAgIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XHJcbiAgICByZWFkb25seSByZW9yZGVyRW5hYmxlZDogYm9vbGVhbjsgLy8gVGFrZXMgcHJlY2VkZW5jZSBvdmVyIExheW91dENvbmZpZy5yZW9yZGVyRW5hYmxlZC5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCBhcyBzcGVjaWZpZWQgaW4gbGF5b3V0LnJlZ2lzdGVyQ29tcG9uZW50LiBNYW5kYXRvcnkgaWYgdHlwZSBpcyAnY29tcG9uZW50Jy5cclxuICAgICAqL1xyXG4gICAgcmVhZG9ubHkgY29tcG9uZW50VHlwZTogSnNvblZhbHVlO1xyXG4gICAgcmVhZG9ubHkgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWU7XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnIHtcclxuICAgIGV4cG9ydCBjb25zdCBkZWZhdWx0UmVvcmRlckVuYWJsZWQgPSB0cnVlO1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQ29tcG9uZW50VHlwZU5hbWUoaXRlbUNvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBjb25zdCBjb21wb25lbnRUeXBlID0gaXRlbUNvbmZpZy5jb21wb25lbnRUeXBlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50VHlwZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFR5cGU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkob3JpZ2luYWw6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyk6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IG9yaWdpbmFsLnR5cGUsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IFtdLFxyXG4gICAgICAgICAgICBzaXplOiBvcmlnaW5hbC5zaXplLFxyXG4gICAgICAgICAgICBzaXplVW5pdDogb3JpZ2luYWwuc2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIG1pblNpemU6IG9yaWdpbmFsLm1pblNpemUsXHJcbiAgICAgICAgICAgIG1pblNpemVVbml0OiBvcmlnaW5hbC5taW5TaXplVW5pdCxcclxuICAgICAgICAgICAgaWQ6IG9yaWdpbmFsLmlkLFxyXG4gICAgICAgICAgICBtYXhpbWlzZWQ6IG9yaWdpbmFsLm1heGltaXNlZCxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogb3JpZ2luYWwuaXNDbG9zYWJsZSxcclxuICAgICAgICAgICAgcmVvcmRlckVuYWJsZWQ6IG9yaWdpbmFsLnJlb3JkZXJFbmFibGVkLFxyXG4gICAgICAgICAgICB0aXRsZTogb3JpZ2luYWwudGl0bGUsXHJcbiAgICAgICAgICAgIGhlYWRlcjogUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyLmNyZWF0ZUNvcHkob3JpZ2luYWwuaGVhZGVyKSxcclxuICAgICAgICAgICAgY29tcG9uZW50VHlwZTogb3JpZ2luYWwuY29tcG9uZW50VHlwZSxcclxuICAgICAgICAgICAgY29tcG9uZW50U3RhdGU6IGRlZXBFeHRlbmRWYWx1ZSh1bmRlZmluZWQsIG9yaWdpbmFsLmNvbXBvbmVudFN0YXRlKSBhcyBKc29uVmFsdWUsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHQoY29tcG9uZW50VHlwZTogSnNvblZhbHVlID0gJycsIGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlLCB0aXRsZSA9ICcnKTogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogSXRlbVR5cGUuY29tcG9uZW50LFxyXG4gICAgICAgICAgICBjb250ZW50OiBbXSxcclxuICAgICAgICAgICAgc2l6ZTogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLnNpemUsXHJcbiAgICAgICAgICAgIHNpemVVbml0OiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuc2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIG1pblNpemU6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5taW5TaXplLFxyXG4gICAgICAgICAgICBtaW5TaXplVW5pdDogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLm1pblNpemVVbml0LFxyXG4gICAgICAgICAgICBpZDogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLmlkLFxyXG4gICAgICAgICAgICBtYXhpbWlzZWQ6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLmRlZmF1bHRNYXhpbWlzZWQsXHJcbiAgICAgICAgICAgIGlzQ2xvc2FibGU6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgICAgICByZW9yZGVyRW5hYmxlZDogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLmRlZmF1bHRSZW9yZGVyRW5hYmxlZCxcclxuICAgICAgICAgICAgdGl0bGUsXHJcbiAgICAgICAgICAgIGhlYWRlcjogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBjb21wb25lbnRUeXBlLFxyXG4gICAgICAgICAgICBjb21wb25lbnRTdGF0ZSxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY29weUNvbXBvbmVudFR5cGUoY29tcG9uZW50VHlwZTogSnNvblZhbHVlKTogSnNvblZhbHVlIHtcclxuICAgICAgICByZXR1cm4gZGVlcEV4dGVuZFZhbHVlKHt9LCBjb21wb25lbnRUeXBlKSBhcyBKc29uVmFsdWVcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEJhc2UgZm9yIFJvb3Qgb3IgUm93T3JDb2x1bW4gSXRlbUNvbmZpZ3NcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyBleHRlbmRzIFJlc29sdmVkSXRlbUNvbmZpZyB7XHJcbiAgICByZWFkb25seSB0eXBlOiAncm93JyB8ICdjb2x1bW4nO1xyXG4gICAgLyoqIE5vdGUgdGhhdCBSb3dPckNvbHVtbiBSZXNvbHZlZEl0ZW1Db25maWcgY29udGVudHMsIGNhbiBjb250YWluIENvbXBvbmVudEl0ZW0gaXRlbUNvbmZpZ3MuICBIb3dldmVyXHJcbiAgICAgKiB3aGVuIENvbnRlbnRJdGVtcyBhcmUgY3JlYXRlZCwgdGhlc2UgQ29tcG9uZW50SXRlbSBpdGVtQ29uZmlncyB3aWxsIGNyZWF0ZSBhIFN0YWNrIHdpdGggYSBjaGlsZCBDb21wb25lbnRJdGVtLlxyXG4gICAgICovXHJcbiAgICByZWFkb25seSBjb250ZW50OiByZWFkb25seSAoUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcgfCBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyB8IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZylbXTtcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyB7XHJcbiAgICBleHBvcnQgdHlwZSBDaGlsZEl0ZW1Db25maWcgPSBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnIHwgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnO1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0NoaWxkSXRlbUNvbmZpZyhpdGVtQ29uZmlnOiBSZXNvbHZlZEl0ZW1Db25maWcpOiBpdGVtQ29uZmlnIGlzIENoaWxkSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgc3dpdGNoIChpdGVtQ29uZmlnLnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29sdW1uOlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnN0YWNrOlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbXBvbmVudDpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmdyb3VuZDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlYWNoYWJsZUNhc2VFcnJvcignQ1JPQ09TUENJQ0lDMTM2ODcnLCBpdGVtQ29uZmlnLnR5cGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29weShvcmlnaW5hbDogUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcsIGNvbnRlbnQ/OiBDaGlsZEl0ZW1Db25maWdbXSk6IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiBvcmlnaW5hbC50eXBlLFxyXG4gICAgICAgICAgICBjb250ZW50OiBjb250ZW50ICE9PSB1bmRlZmluZWQgPyBjb3B5Q29udGVudChjb250ZW50KSA6IGNvcHlDb250ZW50KG9yaWdpbmFsLmNvbnRlbnQpLFxyXG4gICAgICAgICAgICBzaXplOiBvcmlnaW5hbC5zaXplLFxyXG4gICAgICAgICAgICBzaXplVW5pdDogb3JpZ2luYWwuc2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIG1pblNpemU6IG9yaWdpbmFsLm1pblNpemUsXHJcbiAgICAgICAgICAgIG1pblNpemVVbml0OiBvcmlnaW5hbC5taW5TaXplVW5pdCxcclxuICAgICAgICAgICAgaWQ6IG9yaWdpbmFsLmlkLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiBvcmlnaW5hbC5pc0Nsb3NhYmxlLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjb3B5Q29udGVudChvcmlnaW5hbDogcmVhZG9ubHkgQ2hpbGRJdGVtQ29uZmlnW10pOiBDaGlsZEl0ZW1Db25maWdbXSB7XHJcbiAgICAgICAgY29uc3QgY291bnQgPSBvcmlnaW5hbC5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PENoaWxkSXRlbUNvbmZpZz4oY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICByZXN1bHRbaV0gPSBSZXNvbHZlZEl0ZW1Db25maWcuY3JlYXRlQ29weShvcmlnaW5hbFtpXSkgYXMgQ2hpbGRJdGVtQ29uZmlnO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0KHR5cGU6ICdyb3cnIHwgJ2NvbHVtbicpOiBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZSxcclxuICAgICAgICAgICAgY29udGVudDogW10sXHJcbiAgICAgICAgICAgIHNpemU6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5zaXplLFxyXG4gICAgICAgICAgICBzaXplVW5pdDogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLnNpemVVbml0LFxyXG4gICAgICAgICAgICBtaW5TaXplOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMubWluU2l6ZSxcclxuICAgICAgICAgICAgbWluU2l6ZVVuaXQ6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5taW5TaXplVW5pdCxcclxuICAgICAgICAgICAgaWQ6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pZCxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSb290SXRlbUNvbmZpZyBpcyB0aGUgdG9wbW9zdCBSZXNvbHZlZEl0ZW1Db25maWcgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLlxyXG4gKiBOb3RlIHRoYXQgaXQgZG9lcyBub3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgY29udGVudEl0ZW0uICBJdCBzcGVjaWZpZXMgdGhlIG9uZSBhbmQgb25seSBjaGlsZCBvZiB0aGUgR3JvdW5kIENvbnRlbnRJdGVtXHJcbiAqIE5vdGUgdGhhdCBSb290SXRlbUNvbmZpZyBjYW4gYmUgYW4gQ29tcG9uZW50SXRlbSBpdGVtQ29uZmlnLiAgSG93ZXZlciB3aGVuIHRoZSBHcm91bmQgQ29udGVudEl0ZW0ncyBjaGlsZCBpcyBjcmVhdGVkXHJcbiAqIGEgQ29tcG9uZW50SXRlbSBpdGVtQ29uZmlnIHdpbGwgY3JlYXRlIGEgU3RhY2sgd2l0aCBhIGNoaWxkIENvbXBvbmVudEl0ZW0uXHJcbiAqIEBwdWJsaWNcclxuKi9cclxuZXhwb3J0IHR5cGUgUmVzb2x2ZWRSb290SXRlbUNvbmZpZyA9IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgfCBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWc7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFJlc29sdmVkUm9vdEl0ZW1Db25maWcge1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkoY29uZmlnOiBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnKTogUmVzb2x2ZWRSb290SXRlbUNvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIFJlc29sdmVkSXRlbUNvbmZpZy5jcmVhdGVDb3B5KGNvbmZpZykgYXMgUmVzb2x2ZWRSb290SXRlbUNvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNSb290SXRlbUNvbmZpZyhpdGVtQ29uZmlnOiBSZXNvbHZlZEl0ZW1Db25maWcpOiBpdGVtQ29uZmlnIGlzIFJlc29sdmVkUm9vdEl0ZW1Db25maWcge1xyXG4gICAgICAgIHN3aXRjaCAoaXRlbUNvbmZpZy50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUucm93OlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbHVtbjpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5zdGFjazpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb21wb25lbnQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5ncm91bmQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ0NST0NPU1BDSUNJQzEzNjg3JywgaXRlbUNvbmZpZy50eXBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZEdyb3VuZEl0ZW1Db25maWcgZXh0ZW5kcyBSZXNvbHZlZEl0ZW1Db25maWcge1xyXG4gICAgcmVhZG9ubHkgdHlwZTogJ2dyb3VuZCc7XHJcbiAgICByZWFkb25seSBzaXplOiAxMDAsXHJcbiAgICByZWFkb25seSBzaXplVW5pdDogU2l6ZVVuaXRFbnVtLlBlcmNlbnQsXHJcbiAgICByZWFkb25seSBtaW5TaXplOiAwLFxyXG4gICAgcmVhZG9ubHkgbWluU2l6ZVVuaXQ6IFNpemVVbml0RW51bS5QaXhlbCxcclxuICAgIHJlYWRvbmx5IGlkOiAnJyxcclxuICAgIHJlYWRvbmx5IGlzQ2xvc2FibGU6IGZhbHNlLFxyXG4gICAgcmVhZG9ubHkgdGl0bGU6ICcnLFxyXG4gICAgcmVhZG9ubHkgcmVvcmRlckVuYWJsZWQ6IGZhbHNlLFxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUmVzb2x2ZWRHcm91bmRJdGVtQ29uZmlnIHtcclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGUocm9vdEl0ZW1Db25maWc6IFJlc29sdmVkUm9vdEl0ZW1Db25maWcgfCB1bmRlZmluZWQpOlJlc29sdmVkR3JvdW5kSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgY29udGVudCA9IHJvb3RJdGVtQ29uZmlnID09PSB1bmRlZmluZWQgPyBbXSA6IFtyb290SXRlbUNvbmZpZ107XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdHlwZTogSXRlbVR5cGUuZ3JvdW5kLFxyXG4gICAgICAgICAgICBjb250ZW50LFxyXG4gICAgICAgICAgICBzaXplOiAxMDAsXHJcbiAgICAgICAgICAgIHNpemVVbml0OiBTaXplVW5pdEVudW0uUGVyY2VudCxcclxuICAgICAgICAgICAgbWluU2l6ZTogMCxcclxuICAgICAgICAgICAgbWluU2l6ZVVuaXQ6IFNpemVVbml0RW51bS5QaXhlbCxcclxuICAgICAgICAgICAgaWQ6ICcnLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgdGl0bGU6ICcnLFxyXG4gICAgICAgICAgICByZW9yZGVyRW5hYmxlZDogZmFsc2UsXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkTGF5b3V0Q29uZmlnIHtcclxuICAgIHJlYWRvbmx5IHJvb3Q6IFJlc29sdmVkUm9vdEl0ZW1Db25maWcgfCB1bmRlZmluZWQ7XHJcbiAgICByZWFkb25seSBvcGVuUG9wb3V0czogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWdbXTtcclxuICAgIHJlYWRvbmx5IGRpbWVuc2lvbnM6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnM7XHJcbiAgICByZWFkb25seSBzZXR0aW5nczogUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3M7XHJcbiAgICByZWFkb25seSBoZWFkZXI6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlcjtcclxuICAgIHJlYWRvbmx5IHJlc29sdmVkOiB0cnVlLFxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFJlc29sdmVkTGF5b3V0Q29uZmlnIHtcclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgU2V0dGluZ3Mge1xyXG4gICAgICAgIC8vIHNlZSBDb25maWcuU2V0dGluZ3MgZm9yIGNvbW1lbnRzXHJcbiAgICAgICAgcmVhZG9ubHkgZHJhZ0JldHdlZW5XaW5kb3dzOiBib29sZWFuO1xyXG4gICAgICAgIHJlYWRvbmx5IGRyYWdUb05ld1dpbmRvdzogYm9vbGVhbjtcclxuICAgICAgICByZWFkb25seSByZW9yZGVyRW5hYmxlZDogYm9vbGVhbjsgLy8gYWxzbyBpbiBSZXNvbHZlZEl0ZW1Db25maWcgd2hpY2ggdGFrZXMgcHJlY2VkZW5jZVxyXG4gICAgICAgIHJlYWRvbmx5IHBvcG91dFdob2xlU3RhY2s6IGJvb2xlYW47XHJcbiAgICAgICAgcmVhZG9ubHkgYmxvY2tlZFBvcG91dHNUaHJvd0Vycm9yOiBib29sZWFuO1xyXG4gICAgICAgIC8qKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgaW4gdmVyc2lvbiAzLiAqL1xyXG4gICAgICAgIHJlYWRvbmx5IGNsb3NlUG9wb3V0c09uVW5sb2FkOiBib29sZWFuO1xyXG4gICAgICAgIHJlYWRvbmx5IHJlc3BvbnNpdmVNb2RlOiBSZXNwb25zaXZlTW9kZTtcclxuICAgICAgICByZWFkb25seSB0YWJPdmVybGFwQWxsb3dhbmNlOiBudW1iZXI7XHJcbiAgICAgICAgcmVhZG9ubHkgcmVvcmRlck9uVGFiTWVudUNsaWNrOiBib29sZWFuO1xyXG4gICAgICAgIHJlYWRvbmx5IHRhYkNvbnRyb2xPZmZzZXQ6IG51bWJlcjtcclxuICAgICAgICByZWFkb25seSBwb3BJbk9uQ2xvc2U6IGJvb2xlYW47XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBTZXR0aW5ncyB7XHJcbiAgICAgICAgZXhwb3J0IGNvbnN0IGRlZmF1bHRzOiBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncyA9IHtcclxuICAgICAgICAgICAgZHJhZ0JldHdlZW5XaW5kb3dzOiB0cnVlLFxyXG4gICAgICAgICAgICBkcmFnVG9OZXdXaW5kb3c6IHRydWUsXHJcbiAgICAgICAgICAgIHJlb3JkZXJFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgICAgICBwb3BvdXRXaG9sZVN0YWNrOiBmYWxzZSxcclxuICAgICAgICAgICAgYmxvY2tlZFBvcG91dHNUaHJvd0Vycm9yOiB0cnVlLFxyXG4gICAgICAgICAgICBjbG9zZVBvcG91dHNPblVubG9hZDogdHJ1ZSxcclxuICAgICAgICAgICAgcmVzcG9uc2l2ZU1vZGU6IFJlc3BvbnNpdmVNb2RlLm5vbmUsIC8vIHdhcyBvbmxvYWRcclxuICAgICAgICAgICAgdGFiT3ZlcmxhcEFsbG93YW5jZTogMCxcclxuICAgICAgICAgICAgcmVvcmRlck9uVGFiTWVudUNsaWNrOiB0cnVlLFxyXG4gICAgICAgICAgICB0YWJDb250cm9sT2Zmc2V0OiAxMCxcclxuICAgICAgICAgICAgcG9wSW5PbkNsb3NlOiBmYWxzZSxcclxuICAgICAgICB9IGFzIGNvbnN0O1xyXG5cclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29weShvcmlnaW5hbDogU2V0dGluZ3MpOiBTZXR0aW5ncyB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkcmFnQmV0d2VlbldpbmRvd3M6IG9yaWdpbmFsLmRyYWdCZXR3ZWVuV2luZG93cyxcclxuICAgICAgICAgICAgICAgIGRyYWdUb05ld1dpbmRvdzogb3JpZ2luYWwuZHJhZ1RvTmV3V2luZG93LFxyXG4gICAgICAgICAgICAgICAgcmVvcmRlckVuYWJsZWQ6IG9yaWdpbmFsLnJlb3JkZXJFbmFibGVkLFxyXG4gICAgICAgICAgICAgICAgcG9wb3V0V2hvbGVTdGFjazogb3JpZ2luYWwucG9wb3V0V2hvbGVTdGFjayxcclxuICAgICAgICAgICAgICAgIGJsb2NrZWRQb3BvdXRzVGhyb3dFcnJvcjogb3JpZ2luYWwuYmxvY2tlZFBvcG91dHNUaHJvd0Vycm9yLFxyXG4gICAgICAgICAgICAgICAgY2xvc2VQb3BvdXRzT25VbmxvYWQ6IG9yaWdpbmFsLmNsb3NlUG9wb3V0c09uVW5sb2FkLFxyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2l2ZU1vZGU6IG9yaWdpbmFsLnJlc3BvbnNpdmVNb2RlLFxyXG4gICAgICAgICAgICAgICAgdGFiT3ZlcmxhcEFsbG93YW5jZTogb3JpZ2luYWwudGFiT3ZlcmxhcEFsbG93YW5jZSxcclxuICAgICAgICAgICAgICAgIHJlb3JkZXJPblRhYk1lbnVDbGljazogb3JpZ2luYWwucmVvcmRlck9uVGFiTWVudUNsaWNrLFxyXG4gICAgICAgICAgICAgICAgdGFiQ29udHJvbE9mZnNldDogb3JpZ2luYWwudGFiQ29udHJvbE9mZnNldCxcclxuICAgICAgICAgICAgICAgIHBvcEluT25DbG9zZTogb3JpZ2luYWwucG9wSW5PbkNsb3NlLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgRGltZW5zaW9ucyB7XHJcbiAgICAgICAgLy8gc2VlIExheW91dENvbmZpZy5EaW1lbnNpb25zIGZvciBjb21tZW50c1xyXG4gICAgICAgIHJlYWRvbmx5IGJvcmRlcldpZHRoOiBudW1iZXI7XHJcbiAgICAgICAgcmVhZG9ubHkgYm9yZGVyR3JhYldpZHRoOiBudW1iZXIsXHJcbiAgICAgICAgcmVhZG9ubHkgZGVmYXVsdE1pbkl0ZW1IZWlnaHQ6IG51bWJlcjtcclxuICAgICAgICByZWFkb25seSBkZWZhdWx0TWluSXRlbUhlaWdodFVuaXQ6IFNpemVVbml0RW51bTtcclxuICAgICAgICByZWFkb25seSBkZWZhdWx0TWluSXRlbVdpZHRoOiBudW1iZXI7XHJcbiAgICAgICAgcmVhZG9ubHkgZGVmYXVsdE1pbkl0ZW1XaWR0aFVuaXQ6IFNpemVVbml0RW51bTtcclxuICAgICAgICByZWFkb25seSBoZWFkZXJIZWlnaHQ6IG51bWJlcjtcclxuICAgICAgICByZWFkb25seSBkcmFnUHJveHlXaWR0aDogbnVtYmVyO1xyXG4gICAgICAgIHJlYWRvbmx5IGRyYWdQcm94eUhlaWdodDogbnVtYmVyO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBuYW1lc3BhY2UgRGltZW5zaW9ucyB7XHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkob3JpZ2luYWw6IERpbWVuc2lvbnMpOiBEaW1lbnNpb25zIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGJvcmRlcldpZHRoOiBvcmlnaW5hbC5ib3JkZXJXaWR0aCxcclxuICAgICAgICAgICAgICAgIGJvcmRlckdyYWJXaWR0aDogb3JpZ2luYWwuYm9yZGVyR3JhYldpZHRoLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1IZWlnaHQ6IG9yaWdpbmFsLmRlZmF1bHRNaW5JdGVtSGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1IZWlnaHRVbml0OiBvcmlnaW5hbC5kZWZhdWx0TWluSXRlbUhlaWdodFVuaXQsXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0TWluSXRlbVdpZHRoOiBvcmlnaW5hbC5kZWZhdWx0TWluSXRlbVdpZHRoLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1XaWR0aFVuaXQ6IG9yaWdpbmFsLmRlZmF1bHRNaW5JdGVtV2lkdGhVbml0LFxyXG4gICAgICAgICAgICAgICAgaGVhZGVySGVpZ2h0OiBvcmlnaW5hbC5oZWFkZXJIZWlnaHQsXHJcbiAgICAgICAgICAgICAgICBkcmFnUHJveHlXaWR0aDogb3JpZ2luYWwuZHJhZ1Byb3h5V2lkdGgsXHJcbiAgICAgICAgICAgICAgICBkcmFnUHJveHlIZWlnaHQ6IG9yaWdpbmFsLmRyYWdQcm94eUhlaWdodCxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZXhwb3J0IGNvbnN0IGRlZmF1bHRzOiBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zID0ge1xyXG4gICAgICAgICAgICBib3JkZXJXaWR0aDogNSxcclxuICAgICAgICAgICAgYm9yZGVyR3JhYldpZHRoOiA1LFxyXG4gICAgICAgICAgICBkZWZhdWx0TWluSXRlbUhlaWdodDogMCxcclxuICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1IZWlnaHRVbml0OiBTaXplVW5pdEVudW0uUGl4ZWwsXHJcbiAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtV2lkdGg6IDEwLFxyXG4gICAgICAgICAgICBkZWZhdWx0TWluSXRlbVdpZHRoVW5pdDogU2l6ZVVuaXRFbnVtLlBpeGVsLFxyXG4gICAgICAgICAgICBoZWFkZXJIZWlnaHQ6IDIwLFxyXG4gICAgICAgICAgICBkcmFnUHJveHlXaWR0aDogMzAwLFxyXG4gICAgICAgICAgICBkcmFnUHJveHlIZWlnaHQ6IDIwMFxyXG4gICAgICAgIH0gYXMgY29uc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBIZWFkZXIge1xyXG4gICAgICAgIHJlYWRvbmx5IHNob3c6IGZhbHNlIHwgU2lkZTtcclxuICAgICAgICByZWFkb25seSBwb3BvdXQ6IGZhbHNlIHwgc3RyaW5nO1xyXG4gICAgICAgIHJlYWRvbmx5IHBvcGluOiBzdHJpbmc7XHJcbiAgICAgICAgcmVhZG9ubHkgbWF4aW1pc2U6IGZhbHNlIHwgc3RyaW5nO1xyXG4gICAgICAgIHJlYWRvbmx5IG1pbmltaXNlOiBzdHJpbmc7XHJcbiAgICAgICAgcmVhZG9ubHkgY2xvc2U6IGZhbHNlIHwgc3RyaW5nO1xyXG4gICAgICAgIHJlYWRvbmx5IHRhYkRyb3Bkb3duOiBmYWxzZSB8IHN0cmluZztcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbmFtZXNwYWNlIEhlYWRlciB7XHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkob3JpZ2luYWw6IEhlYWRlcik6IEhlYWRlciB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBzaG93OiBvcmlnaW5hbC5zaG93LFxyXG4gICAgICAgICAgICAgICAgcG9wb3V0OiBvcmlnaW5hbC5wb3BvdXQsXHJcbiAgICAgICAgICAgICAgICBwb3Bpbjogb3JpZ2luYWwucG9waW4sXHJcbiAgICAgICAgICAgICAgICBjbG9zZTogb3JpZ2luYWwuY2xvc2UsXHJcbiAgICAgICAgICAgICAgICBtYXhpbWlzZTogb3JpZ2luYWwubWF4aW1pc2UsXHJcbiAgICAgICAgICAgICAgICBtaW5pbWlzZTogb3JpZ2luYWwubWluaW1pc2UsXHJcbiAgICAgICAgICAgICAgICB0YWJEcm9wZG93bjogb3JpZ2luYWwudGFiRHJvcGRvd24sXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGV4cG9ydCBjb25zdCBkZWZhdWx0czogUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyID0ge1xyXG4gICAgICAgICAgICBzaG93OiBTaWRlLnRvcCxcclxuICAgICAgICAgICAgcG9wb3V0OiAnb3BlbiBpbiBuZXcgd2luZG93JyxcclxuICAgICAgICAgICAgcG9waW46ICdkb2NrJyxcclxuICAgICAgICAgICAgbWF4aW1pc2U6ICdtYXhpbWlzZScsXHJcbiAgICAgICAgICAgIG1pbmltaXNlOiAnbWluaW1pc2UnLFxyXG4gICAgICAgICAgICBjbG9zZTogJ2Nsb3NlJyxcclxuICAgICAgICAgICAgdGFiRHJvcGRvd246ICdhZGRpdGlvbmFsIHRhYnMnXHJcbiAgICAgICAgfSBhcyBjb25zdDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNQb3BvdXQoY29uZmlnOiBSZXNvbHZlZExheW91dENvbmZpZyk6IGNvbmZpZyBpcyBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuICdwYXJlbnRJZCcgaW4gY29uZmlnO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0KCk6IFJlc29sdmVkTGF5b3V0Q29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkTGF5b3V0Q29uZmlnID0ge1xyXG4gICAgICAgICAgICByb290OiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIG9wZW5Qb3BvdXRzOiBbXSxcclxuICAgICAgICAgICAgZGltZW5zaW9uczogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5kZWZhdWx0cyxcclxuICAgICAgICAgICAgc2V0dGluZ3M6IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmRlZmF1bHRzLFxyXG4gICAgICAgICAgICBoZWFkZXI6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5kZWZhdWx0cyxcclxuICAgICAgICAgICAgcmVzb2x2ZWQ6IHRydWUsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkoY29uZmlnOiBSZXNvbHZlZExheW91dENvbmZpZyk6IFJlc29sdmVkTGF5b3V0Q29uZmlnIHtcclxuICAgICAgICBpZiAoaXNQb3BvdXQoY29uZmlnKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcuY3JlYXRlQ29weShjb25maWcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRMYXlvdXRDb25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICByb290OiBjb25maWcucm9vdCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogUmVzb2x2ZWRSb290SXRlbUNvbmZpZy5jcmVhdGVDb3B5KGNvbmZpZy5yb290KSxcclxuICAgICAgICAgICAgICAgIG9wZW5Qb3BvdXRzOiBSZXNvbHZlZExheW91dENvbmZpZy5jb3B5T3BlblBvcG91dHMoY29uZmlnLm9wZW5Qb3BvdXRzKSxcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzOiBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5jcmVhdGVDb3B5KGNvbmZpZy5zZXR0aW5ncyksXHJcbiAgICAgICAgICAgICAgICBkaW1lbnNpb25zOiBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmNyZWF0ZUNvcHkoY29uZmlnLmRpbWVuc2lvbnMpLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuY3JlYXRlQ29weShjb25maWcuaGVhZGVyKSxcclxuICAgICAgICAgICAgICAgIHJlc29sdmVkOiBjb25maWcucmVzb2x2ZWQsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNvcHlPcGVuUG9wb3V0cyhvcmlnaW5hbDogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWdbXSk6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnW10ge1xyXG4gICAgICAgIGNvbnN0IGNvdW50ID0gb3JpZ2luYWwubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxSZXNvbHZlZFBvcG91dExheW91dENvbmZpZz4oY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICByZXN1bHRbaV0gPSBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5jcmVhdGVDb3B5KG9yaWdpbmFsW2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgR29sZGVuTGF5b3V0IGNvbmZpZ3VyYXRpb24gb2JqZWN0IGFuZFxyXG4gICAgICogcmVwbGFjZXMgaXRzIGtleXMgYW5kIHZhbHVlcyByZWN1cnNpdmVseSB3aXRoXHJcbiAgICAgKiBvbmUgbGV0dGVyIGNvdW50ZXJwYXJ0c1xyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gbWluaWZ5Q29uZmlnKGxheW91dENvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWcpOiBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIENvbmZpZ01pbmlmaWVyLnRyYW5zbGF0ZU9iamVjdChsYXlvdXRDb25maWcsIHRydWUpIGFzIFJlc29sdmVkTGF5b3V0Q29uZmlnO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgYSBjb25maWd1cmF0aW9uIE9iamVjdCB0aGF0IHdhcyBwcmV2aW91c2x5IG1pbmlmaWVkXHJcbiAgICAgKiB1c2luZyBtaW5pZnlDb25maWcgYW5kIHJldHVybnMgaXRzIG9yaWdpbmFsIHZlcnNpb25cclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHVubWluaWZ5Q29uZmlnKG1pbmlmaWVkQ29uZmlnOiBSZXNvbHZlZExheW91dENvbmZpZyk6IFJlc29sdmVkTGF5b3V0Q29uZmlnIHtcclxuICAgICAgICByZXR1cm4gQ29uZmlnTWluaWZpZXIudHJhbnNsYXRlT2JqZWN0KG1pbmlmaWVkQ29uZmlnLCBmYWxzZSkgYXMgUmVzb2x2ZWRMYXlvdXRDb25maWc7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcgZXh0ZW5kcyBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICByZWFkb25seSBwYXJlbnRJZDogc3RyaW5nIHwgbnVsbDtcclxuICAgIHJlYWRvbmx5IGluZGV4SW5QYXJlbnQ6IG51bWJlciB8IG51bGw7XHJcbiAgICByZWFkb25seSB3aW5kb3c6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvdztcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyB7XHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIFdpbmRvdyB7XHJcbiAgICAgICAgcmVhZG9ubHkgd2lkdGg6IG51bWJlciB8IG51bGwsXHJcbiAgICAgICAgcmVhZG9ubHkgaGVpZ2h0OiBudW1iZXIgfCBudWxsLFxyXG4gICAgICAgIHJlYWRvbmx5IGxlZnQ6IG51bWJlciB8IG51bGwsXHJcbiAgICAgICAgcmVhZG9ubHkgdG9wOiBudW1iZXIgfCBudWxsLFxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBuYW1lc3BhY2UgV2luZG93IHtcclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29weShvcmlnaW5hbDogV2luZG93KTogV2luZG93IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHdpZHRoOiBvcmlnaW5hbC53aWR0aCxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogb3JpZ2luYWwuaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgbGVmdDogb3JpZ2luYWwubGVmdCxcclxuICAgICAgICAgICAgICAgIHRvcDogb3JpZ2luYWwudG9wLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBleHBvcnQgY29uc3QgZGVmYXVsdHM6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvdyA9IHtcclxuICAgICAgICAgICAgd2lkdGg6IG51bGwsXHJcbiAgICAgICAgICAgIGhlaWdodDogbnVsbCxcclxuICAgICAgICAgICAgbGVmdDogbnVsbCxcclxuICAgICAgICAgICAgdG9wOiBudWxsLFxyXG4gICAgICAgIH0gYXMgY29uc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkob3JpZ2luYWw6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnKTogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcgPSB7XHJcbiAgICAgICAgICAgIHJvb3Q6IG9yaWdpbmFsLnJvb3QgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IFJlc29sdmVkUm9vdEl0ZW1Db25maWcuY3JlYXRlQ29weShvcmlnaW5hbC5yb290KSxcclxuICAgICAgICAgICAgb3BlblBvcG91dHM6IFJlc29sdmVkTGF5b3V0Q29uZmlnLmNvcHlPcGVuUG9wb3V0cyhvcmlnaW5hbC5vcGVuUG9wb3V0cyksXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5jcmVhdGVDb3B5KG9yaWdpbmFsLnNldHRpbmdzKSxcclxuICAgICAgICAgICAgZGltZW5zaW9uczogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5jcmVhdGVDb3B5KG9yaWdpbmFsLmRpbWVuc2lvbnMpLFxyXG4gICAgICAgICAgICBoZWFkZXI6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5jcmVhdGVDb3B5KG9yaWdpbmFsLmhlYWRlciksXHJcbiAgICAgICAgICAgIHBhcmVudElkOiBvcmlnaW5hbC5wYXJlbnRJZCxcclxuICAgICAgICAgICAgaW5kZXhJblBhcmVudDogb3JpZ2luYWwuaW5kZXhJblBhcmVudCxcclxuICAgICAgICAgICAgd2luZG93OiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3cuY3JlYXRlQ29weShvcmlnaW5hbC53aW5kb3cpLFxyXG4gICAgICAgICAgICByZXNvbHZlZDogb3JpZ2luYWwucmVzb2x2ZWQsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgQ29tcG9uZW50SXRlbUNvbmZpZywgSXRlbUNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9jb25maWcnO1xyXG5pbXBvcnQgeyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcgfSBmcm9tICcuLi9jb25maWcvcmVzb2x2ZWQtY29uZmlnJztcclxuaW1wb3J0IHsgVGFiIH0gZnJvbSAnLi4vY29udHJvbHMvdGFiJztcclxuaW1wb3J0IHsgQXNzZXJ0RXJyb3IsIFVuZXhwZWN0ZWROdWxsRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi4vaXRlbXMvY29tcG9uZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBDb250ZW50SXRlbSB9IGZyb20gJy4uL2l0ZW1zL2NvbnRlbnQtaXRlbSc7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LWVtaXR0ZXInO1xyXG5pbXBvcnQgeyBKc29uVmFsdWUsIExvZ2ljYWxaSW5kZXgsIExvZ2ljYWxaSW5kZXhUb0RlZmF1bHRNYXAgfSBmcm9tICcuLi91dGlscy90eXBlcyc7XHJcbmltcG9ydCB7IGRlZXBFeHRlbmQsIHNldEVsZW1lbnRIZWlnaHQsIHNldEVsZW1lbnRXaWR0aCB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBjbGFzcyBDb21wb25lbnRDb250YWluZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfY29tcG9uZW50VHlwZTogSnNvblZhbHVlO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfYm91bmRDb21wb25lbnQ6IENvbXBvbmVudENvbnRhaW5lci5CaW5kYWJsZUNvbXBvbmVudDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3dpZHRoOiBudW1iZXI7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9oZWlnaHQ6IG51bWJlcjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2lzQ2xvc2FibGU7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9pbml0aWFsU3RhdGU6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3N0YXRlOiBKc29uVmFsdWUgfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF92aXNpYmxlO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaXNTaG93bldpdGhaZXJvRGltZW5zaW9ucztcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3RhYjogVGFiO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfc3RhY2tNYXhpbWlzZWQgPSBmYWxzZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2xvZ2ljYWxaSW5kZXg6IExvZ2ljYWxaSW5kZXg7XHJcblxyXG4gICAgc3RhdGVSZXF1ZXN0RXZlbnQ6IENvbXBvbmVudENvbnRhaW5lci5TdGF0ZVJlcXVlc3RFdmVudEhhbmRsZXIgfCB1bmRlZmluZWQ7XHJcbiAgICB2aXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQ6IENvbXBvbmVudENvbnRhaW5lci5WaXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQgfCB1bmRlZmluZWQ7XHJcbiAgICB2aXJ0dWFsVmlzaWJpbGl0eUNoYW5nZVJlcXVpcmVkRXZlbnQ6IENvbXBvbmVudENvbnRhaW5lci5WaXJ0dWFsVmlzaWJpbGl0eUNoYW5nZVJlcXVpcmVkRXZlbnQgfCB1bmRlZmluZWQ7XHJcbiAgICB2aXJ0dWFsWkluZGV4Q2hhbmdlUmVxdWlyZWRFdmVudDogQ29tcG9uZW50Q29udGFpbmVyLlZpcnR1YWxaSW5kZXhDaGFuZ2VSZXF1aXJlZEV2ZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIGdldCB3aWR0aCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fd2lkdGg7IH1cclxuICAgIGdldCBoZWlnaHQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2hlaWdodDsgfVxyXG4gICAgZ2V0IHBhcmVudCgpOiBDb21wb25lbnRJdGVtIHsgcmV0dXJuIHRoaXMuX3BhcmVudDsgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChDb21wb25lbnRDb250YWluZXI6Y2xhc3MpLmNvbXBvbmVudFR5cGV9ICovXHJcbiAgICBnZXQgY29tcG9uZW50TmFtZSgpOiBKc29uVmFsdWUgeyByZXR1cm4gdGhpcy5fY29tcG9uZW50VHlwZTsgfVxyXG4gICAgZ2V0IGNvbXBvbmVudFR5cGUoKTogSnNvblZhbHVlIHsgcmV0dXJuIHRoaXMuX2NvbXBvbmVudFR5cGU7IH1cclxuICAgIGdldCB2aXJ0dWFsKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fYm91bmRDb21wb25lbnQudmlydHVhbDsgfVxyXG4gICAgZ2V0IGNvbXBvbmVudCgpOiBDb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50IHsgcmV0dXJuIHRoaXMuX2JvdW5kQ29tcG9uZW50LmNvbXBvbmVudDsgfVxyXG4gICAgZ2V0IHRhYigpOiBUYWIgeyByZXR1cm4gdGhpcy5fdGFiOyB9XHJcbiAgICBnZXQgdGl0bGUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX3BhcmVudC50aXRsZTsgfVxyXG4gICAgZ2V0IGxheW91dE1hbmFnZXIoKTogTGF5b3V0TWFuYWdlciB7IHJldHVybiB0aGlzLl9sYXlvdXRNYW5hZ2VyOyB9XHJcbiAgICBnZXQgaXNIaWRkZW4oKTogYm9vbGVhbiB7IHJldHVybiAhdGhpcy5fdmlzaWJsZTsgfVxyXG4gICAgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl92aXNpYmxlOyB9XHJcbiAgICBnZXQgc3RhdGUoKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX3N0YXRlOyB9XHJcbiAgICAvKiogUmV0dXJuIHRoZSBpbml0aWFsIGNvbXBvbmVudCBzdGF0ZSAqL1xyXG4gICAgZ2V0IGluaXRpYWxTdGF0ZSgpOiBKc29uVmFsdWUgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5faW5pdGlhbFN0YXRlOyB9XHJcbiAgICAvKiogVGhlIGlubmVyIERPTSBlbGVtZW50IHdoZXJlIHRoZSBjb250YWluZXIncyBjb250ZW50IGlzIGludGVuZGVkIHRvIGxpdmUgaW4gKi9cclxuICAgIGdldCBlbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7IH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfY29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX3BhcmVudDogQ29tcG9uZW50SXRlbSxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlcixcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudDogSFRNTEVsZW1lbnQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX3VwZGF0ZUl0ZW1Db25maWdFdmVudDogQ29tcG9uZW50Q29udGFpbmVyLlVwZGF0ZUl0ZW1Db25maWdFdmVudEhhbmRsZXIsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX3Nob3dFdmVudDogQ29tcG9uZW50Q29udGFpbmVyLlNob3dFdmVudEhhbmRsZXIsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2hpZGVFdmVudDogQ29tcG9uZW50Q29udGFpbmVyLkhpZGVFdmVudEhhbmRsZXIsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2ZvY3VzRXZlbnQ6IENvbXBvbmVudENvbnRhaW5lci5Gb2N1c0V2ZW50SGFuZGxlcixcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfYmx1ckV2ZW50OiBDb21wb25lbnRDb250YWluZXIuQmx1ckV2ZW50SGFuZGxlcixcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3dpZHRoID0gMDtcclxuICAgICAgICB0aGlzLl9oZWlnaHQgPSAwO1xyXG4gICAgICAgIHRoaXMuX3Zpc2libGUgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2lzU2hvd25XaXRoWmVyb0RpbWVuc2lvbnMgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLl9jb21wb25lbnRUeXBlID0gX2NvbmZpZy5jb21wb25lbnRUeXBlO1xyXG4gICAgICAgIHRoaXMuX2lzQ2xvc2FibGUgPSBfY29uZmlnLmlzQ2xvc2FibGU7XHJcbiAgICAgICAgdGhpcy5faW5pdGlhbFN0YXRlID0gX2NvbmZpZy5jb21wb25lbnRTdGF0ZTtcclxuICAgICAgICB0aGlzLl9zdGF0ZSA9IHRoaXMuX2luaXRpYWxTdGF0ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fYm91bmRDb21wb25lbnQgPSB0aGlzLmxheW91dE1hbmFnZXIuYmluZENvbXBvbmVudCh0aGlzLCBfY29uZmlnKTtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVFbGVtZW50UG9zaXRpb25Qcm9wZXJ0eUZyb21Cb3VuZENvbXBvbmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5yZWxlYXNlQ29tcG9uZW50KCk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZVJlcXVlc3RFdmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmVtaXQoJ2Rlc3Ryb3knKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoQ29tcG9uZW50Q29udGFpbmVyOmNsYXNzKS5lbGVtZW50IH0gKi9cclxuICAgIGdldEVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGlkZXMgdGhlIGNvbnRhaW5lcidzIGNvbXBvbmVudCBpdGVtIChhbmQgaGVuY2UsIHRoZSBjb250YWluZXIpIGlmIG5vdCBhbHJlYWR5IGhpZGRlbi5cclxuICAgICAqIEVtaXRzIGhpZGUgZXZlbnQgcHJpb3IgdG8gaGlkaW5nIHRoZSBjb250YWluZXIuXHJcbiAgICAgKi9cclxuICAgIGhpZGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5faGlkZUV2ZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG93cyB0aGUgY29udGFpbmVyJ3MgY29tcG9uZW50IGl0ZW0gKGFuZCBoZW5jZSwgdGhlIGNvbnRhaW5lcikgaWYgbm90IHZpc2libGUuXHJcbiAgICAgKiBFbWl0cyBzaG93IGV2ZW50IHByaW9yIHRvIGhpZGluZyB0aGUgY29udGFpbmVyLlxyXG4gICAgICovXHJcbiAgICBzaG93KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3Nob3dFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9jdXMgdGhpcyBjb21wb25lbnQgaW4gTGF5b3V0LlxyXG4gICAgICovXHJcbiAgICBmb2N1cyhzdXBwcmVzc0V2ZW50ID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9mb2N1c0V2ZW50KHN1cHByZXNzRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlIGZvY3VzIGZyb20gdGhpcyBjb21wb25lbnQgaW4gTGF5b3V0LlxyXG4gICAgICovXHJcbiAgICBibHVyKHN1cHByZXNzRXZlbnQgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2JsdXJFdmVudChzdXBwcmVzc0V2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgc2l6ZSBmcm9tIHdpdGhpbiB0aGUgY29udGFpbmVyLiBUcmF2ZXJzZXMgdXBcclxuICAgICAqIHRoZSBpdGVtIHRyZWUgdW50aWwgaXQgZmluZHMgYSByb3cgb3IgY29sdW1uIGVsZW1lbnRcclxuICAgICAqIGFuZCByZXNpemVzIGl0cyBpdGVtcyBhY2NvcmRpbmdseS5cclxuICAgICAqXHJcbiAgICAgKiBJZiB0aGlzIGNvbnRhaW5lciBpc24ndCBhIGRlc2NlbmRhbnQgb2YgYSByb3cgb3IgY29sdW1uXHJcbiAgICAgKiBpdCByZXR1cm5zIGZhbHNlXHJcbiAgICAgKiBAcGFyYW0gd2lkdGggLSBUaGUgbmV3IHdpZHRoIGluIHBpeGVsXHJcbiAgICAgKiBAcGFyYW0gaGVpZ2h0IC0gVGhlIG5ldyBoZWlnaHQgaW4gcGl4ZWxcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyByZXNpemVTdWNjZXNmdWxcclxuICAgICAqXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgc2V0U2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBhbmNlc3Rvckl0ZW06IENvbnRlbnRJdGVtIHwgbnVsbCA9IHRoaXMuX3BhcmVudDtcclxuICAgICAgICBpZiAoYW5jZXN0b3JJdGVtLmlzQ29sdW1uIHx8IGFuY2VzdG9ySXRlbS5pc1JvdyB8fCBhbmNlc3Rvckl0ZW0ucGFyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignSUNTU1BSQycsICdDb21wb25lbnRDb250YWluZXIgY2Fubm90IGhhdmUgUm93Q29sdW1uIFBhcmVudCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBhbmNlc3RvckNoaWxkSXRlbTogQ29udGVudEl0ZW07XHJcbiAgICAgICAgICAgIGRvIHtcclxuICAgICAgICAgICAgICAgIGFuY2VzdG9yQ2hpbGRJdGVtID0gYW5jZXN0b3JJdGVtO1xyXG4gICAgICAgICAgICAgICAgYW5jZXN0b3JJdGVtID0gYW5jZXN0b3JJdGVtLnBhcmVudDtcclxuICAgICAgICAgICAgfSB3aGlsZSAoYW5jZXN0b3JJdGVtICE9PSBudWxsICYmICFhbmNlc3Rvckl0ZW0uaXNDb2x1bW4gJiYgIWFuY2VzdG9ySXRlbS5pc1Jvdyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYW5jZXN0b3JJdGVtID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBubyBSb3cgb3IgQ29sdW1uIGZvdW5kXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBhbmNlc3Rvckl0ZW0gaXMgUm93IG9yIENvbHVtblxyXG4gICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gYW5jZXN0b3JJdGVtLmlzQ29sdW1uID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFNpemUgPSB0aGlzW2RpcmVjdGlvbl07XHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFNpemUgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignSUNTU0NTMTExOTQnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3U2l6ZSA9IGRpcmVjdGlvbiA9PT0gJ2hlaWdodCcgPyBoZWlnaHQgOiB3aWR0aDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG90YWxQaXhlbCA9IGN1cnJlbnRTaXplICogKDEgLyAoYW5jZXN0b3JDaGlsZEl0ZW0uc2l6ZSAvIDEwMCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSAobmV3U2l6ZSAvIHRvdGFsUGl4ZWwpICogMTAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gKGFuY2VzdG9yQ2hpbGRJdGVtLnNpemUgLSBwZXJjZW50YWdlKSAvIChhbmNlc3Rvckl0ZW0uY29udGVudEl0ZW1zLmxlbmd0aCAtIDEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFuY2VzdG9ySXRlbS5jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5jZXN0b3JJdGVtQ29udGVudEl0ZW0gPSBhbmNlc3Rvckl0ZW0uY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5jZXN0b3JJdGVtQ29udGVudEl0ZW0gPT09IGFuY2VzdG9yQ2hpbGRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNlc3Rvckl0ZW1Db250ZW50SXRlbS5zaXplID0gcGVyY2VudGFnZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9ySXRlbUNvbnRlbnRJdGVtLnNpemUgKz0gZGVsdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGFuY2VzdG9ySXRlbS51cGRhdGVTaXplKGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbG9zZXMgdGhlIGNvbnRhaW5lciBpZiBpdCBpcyBjbG9zYWJsZS4gQ2FuIGJlIGNhbGxlZCBieVxyXG4gICAgICogYm90aCB0aGUgY29tcG9uZW50IHdpdGhpbiBhdCBhcyB3ZWxsIGFzIHRoZSBjb250ZW50SXRlbSBjb250YWluaW5nXHJcbiAgICAgKiBpdC4gRW1pdHMgYSBjbG9zZSBldmVudCBiZWZvcmUgdGhlIGNvbnRhaW5lciBpdHNlbGYgaXMgY2xvc2VkLlxyXG4gICAgICovXHJcbiAgICBjbG9zZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5faXNDbG9zYWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Nsb3NlJyk7XHJcbiAgICAgICAgICAgIHRoaXMuX3BhcmVudC5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogUmVwbGFjZXMgY29tcG9uZW50IHdpdGhvdXQgYWZmZWN0aW5nIGxheW91dCAqL1xyXG4gICAgcmVwbGFjZUNvbXBvbmVudChpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5yZWxlYXNlQ29tcG9uZW50KCk7XHJcblxyXG4gICAgICAgIGlmICghSXRlbUNvbmZpZy5pc0NvbXBvbmVudChpdGVtQ29uZmlnKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcGxhY2VDb21wb25lbnQgbm90IHBhc3NlZCBhIGNvbXBvbmVudCBJdGVtQ29uZmlnJylcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBjb25maWcgPSBDb21wb25lbnRJdGVtQ29uZmlnLnJlc29sdmUoaXRlbUNvbmZpZywgZmFsc2UpO1xyXG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsU3RhdGUgPSBjb25maWcuY29tcG9uZW50U3RhdGU7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gdGhpcy5faW5pdGlhbFN0YXRlO1xyXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRUeXBlID0gY29uZmlnLmNvbXBvbmVudFR5cGU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVJdGVtQ29uZmlnRXZlbnQoY29uZmlnKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2JvdW5kQ29tcG9uZW50ID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmJpbmRDb21wb25lbnQodGhpcywgY29uZmlnKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVFbGVtZW50UG9zaXRpb25Qcm9wZXJ0eUZyb21Cb3VuZENvbXBvbmVudCgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2JvdW5kQ29tcG9uZW50LnZpcnR1YWwpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpcnR1YWxWaXNpYmlsaXR5Q2hhbmdlUmVxdWlyZWRFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aXJ0dWFsVmlzaWJpbGl0eUNoYW5nZVJlcXVpcmVkRXZlbnQodGhpcywgdGhpcy5fdmlzaWJsZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52aXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xheW91dE1hbmFnZXIuZmlyZUJlZm9yZVZpcnR1YWxSZWN0aW5nRXZlbnQoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQodGhpcywgdGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGF5b3V0TWFuYWdlci5maXJlQWZ0ZXJWaXJ0dWFsUmVjdGluZ0V2ZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRCYXNlTG9naWNhbFpJbmRleCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3N0YXRlQ2hhbmdlZCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGluaXRpYWwgY29tcG9uZW50IHN0YXRlIG9yIHRoZSBsYXRlc3QgcGFzc2VkIGluIHNldFN0YXRlKClcclxuICAgICAqIEByZXR1cm5zIHN0YXRlXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIChDb21wb25lbnRDb250YWluZXI6Y2xhc3MpLmluaXRpYWxTdGF0ZX1cclxuICAgICAqL1xyXG4gICAgZ2V0U3RhdGUoKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXJnZXMgdGhlIHByb3ZpZGVkIHN0YXRlIGludG8gdGhlIGN1cnJlbnQgb25lXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIChDb21wb25lbnRDb250YWluZXI6Y2xhc3MpLnN0YXRlUmVxdWVzdEV2ZW50fVxyXG4gICAgICovXHJcbiAgICBleHRlbmRTdGF0ZShzdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBleHRlbmRlZFN0YXRlID0gZGVlcEV4dGVuZCh0aGlzLl9zdGF0ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc3RhdGUpO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoZXh0ZW5kZWRTdGF0ZSBhcyBKc29uVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29tcG9uZW50IHN0YXRlXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIChDb21wb25lbnRDb250YWluZXI6Y2xhc3MpLnN0YXRlUmVxdWVzdEV2ZW50fVxyXG4gICAgICovXHJcbiAgICBzZXRTdGF0ZShzdGF0ZTogSnNvblZhbHVlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fc3RhdGUgPSBzdGF0ZTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuZW1pdEJhc2VCdWJibGluZ0V2ZW50KCdzdGF0ZUNoYW5nZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCdzIHRoZSBjb21wb25lbnRzIHRpdGxlXHJcbiAgICAgKi9cclxuICAgIHNldFRpdGxlKHRpdGxlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuc2V0VGl0bGUodGl0bGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHNldFRhYih0YWI6IFRhYik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3RhYiA9IHRhYjtcclxuICAgICAgICB0aGlzLmVtaXQoJ3RhYicsIHRhYilcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzZXRWaXNpYmlsaXR5KHZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2JvdW5kQ29tcG9uZW50LnZpcnR1YWwpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMudmlydHVhbFZpc2liaWxpdHlDaGFuZ2VSZXF1aXJlZEV2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudmlydHVhbFZpc2liaWxpdHlDaGFuZ2VSZXF1aXJlZEV2ZW50KHRoaXMsIHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fdmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faGVpZ2h0ID09PSAwICYmIHRoaXMuX3dpZHRoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNTaG93bldpdGhaZXJvRGltZW5zaW9ucyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzU2hvd25XaXRoWmVyb0RpbWVuc2lvbnMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFNpemVUb05vZGVTaXplKHRoaXMuX3dpZHRoLCB0aGlzLl9oZWlnaHQsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFNob3coKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc1Nob3duV2l0aFplcm9EaW1lbnNpb25zICYmICh0aGlzLl9oZWlnaHQgIT09IDAgfHwgdGhpcy5fd2lkdGggIT09IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNTaG93bldpdGhaZXJvRGltZW5zaW9ucyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U2l6ZVRvTm9kZVNpemUodGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0U2hvdygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3Zpc2libGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Zpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzU2hvd25XaXRoWmVyb0RpbWVuc2lvbnMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRCYXNlTG9naWNhbFpJbmRleCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldExvZ2ljYWxaSW5kZXgoTG9naWNhbFpJbmRleC5iYXNlKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRMb2dpY2FsWkluZGV4KGxvZ2ljYWxaSW5kZXg6IExvZ2ljYWxaSW5kZXgpOiB2b2lkIHtcclxuICAgICAgICBpZiAobG9naWNhbFpJbmRleCAhPT0gdGhpcy5fbG9naWNhbFpJbmRleCkge1xyXG4gICAgICAgICAgICB0aGlzLl9sb2dpY2FsWkluZGV4ID0gbG9naWNhbFpJbmRleDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubm90aWZ5VmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBjb250YWluZXIncyBzaXplLCBidXQgY29uc2lkZXJlZCB0ZW1wb3JhcnkgKGZvciBkcmFnZ2luZylcclxuICAgICAqIHNvIGRvbid0IGVtaXQgYW55IGV2ZW50cy5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBlbnRlckRyYWdNb2RlKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fd2lkdGggPSB3aWR0aDtcclxuICAgICAgICB0aGlzLl9oZWlnaHQgPSBoZWlnaHQ7XHJcbiAgICAgICAgc2V0RWxlbWVudFdpZHRoKHRoaXMuX2VsZW1lbnQsIHdpZHRoKTtcclxuICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHRoaXMuX2VsZW1lbnQsIGhlaWdodCk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0TG9naWNhbFpJbmRleChMb2dpY2FsWkluZGV4LmRyYWcpO1xyXG5cclxuICAgICAgICB0aGlzLmRyYWcoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleGl0RHJhZ01vZGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRCYXNlTG9naWNhbFpJbmRleCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGVudGVyU3RhY2tNYXhpbWlzZWQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fc3RhY2tNYXhpbWlzZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2V0TG9naWNhbFpJbmRleChMb2dpY2FsWkluZGV4LnN0YWNrTWF4aW1pc2VkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleGl0U3RhY2tNYXhpbWlzZWQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRCYXNlTG9naWNhbFpJbmRleCgpO1xyXG4gICAgICAgIHRoaXMuX3N0YWNrTWF4aW1pc2VkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZHJhZygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fYm91bmRDb21wb25lbnQudmlydHVhbCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy52aXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbGF5b3V0TWFuYWdlci5maXJlQmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudCgxKTtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQodGhpcywgdGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodCk7XHJcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xheW91dE1hbmFnZXIuZmlyZUFmdGVyVmlydHVhbFJlY3RpbmdFdmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29udGFpbmVyJ3Mgc2l6ZS4gQ2FsbGVkIGJ5IHRoZSBjb250YWluZXIncyBjb21wb25lbnQgaXRlbS5cclxuICAgICAqIFRvIGluc3RlYWQgc2V0IHRoZSBzaXplIHByb2dyYW1tYXRpY2FsbHkgZnJvbSB3aXRoaW4gdGhlIGNvbXBvbmVudCBpdHNlbGYsXHJcbiAgICAgKiB1c2UgdGhlIHB1YmxpYyBzZXRTaXplIG1ldGhvZFxyXG4gICAgICogQHBhcmFtIHdpZHRoIC0gaW4gcHhcclxuICAgICAqIEBwYXJhbSBoZWlnaHQgLSBpbiBweFxyXG4gICAgICogQHBhcmFtIGZvcmNlIC0gc2V0IGV2ZW4gaWYgbm8gY2hhbmdlXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgc2V0U2l6ZVRvTm9kZVNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGZvcmNlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHdpZHRoICE9PSB0aGlzLl93aWR0aCB8fCBoZWlnaHQgIT09IHRoaXMuX2hlaWdodCB8fCBmb3JjZSkge1xyXG4gICAgICAgICAgICB0aGlzLl93aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgICAgICB0aGlzLl9oZWlnaHQgPSBoZWlnaHQ7XHJcbiAgICAgICAgICAgIHNldEVsZW1lbnRXaWR0aCh0aGlzLl9lbGVtZW50LCB3aWR0aCk7XHJcbiAgICAgICAgICAgIHNldEVsZW1lbnRIZWlnaHQodGhpcy5fZWxlbWVudCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9ib3VuZENvbXBvbmVudC52aXJ0dWFsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFZpcnR1YWxTaXplZENvbnRhaW5lclRvTGF5b3V0TWFuYWdlcigpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdyZXNpemUnKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tTaG93bkZyb21aZXJvRGltZW5zaW9ucygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG5vdGlmeVZpcnR1YWxSZWN0aW5nUmVxdWlyZWQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMudmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy52aXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQodGhpcywgdGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgncmVzaXplJyk7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tTaG93bkZyb21aZXJvRGltZW5zaW9ucygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIG5vdGlmeVZpcnR1YWxaSW5kZXhDaGFuZ2VSZXF1aXJlZCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy52aXJ0dWFsWkluZGV4Q2hhbmdlUmVxdWlyZWRFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxvZ2ljYWxaSW5kZXggPSB0aGlzLl9sb2dpY2FsWkluZGV4O1xyXG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0WkluZGV4ID0gTG9naWNhbFpJbmRleFRvRGVmYXVsdE1hcFtsb2dpY2FsWkluZGV4XTtcclxuICAgICAgICAgICAgdGhpcy52aXJ0dWFsWkluZGV4Q2hhbmdlUmVxdWlyZWRFdmVudCh0aGlzLCBsb2dpY2FsWkluZGV4LCBkZWZhdWx0WkluZGV4KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVFbGVtZW50UG9zaXRpb25Qcm9wZXJ0eUZyb21Cb3VuZENvbXBvbmVudCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fYm91bmRDb21wb25lbnQudmlydHVhbCkge1xyXG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3N0YXRpYyc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICcnOyAvLyBzZXQgaXQgYmFjayB0byBhdHRyaWJ1dGUgdmFsdWVcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBhZGRWaXJ0dWFsU2l6ZWRDb250YWluZXJUb0xheW91dE1hbmFnZXIoKSB7XHJcbiAgICAgICAgdGhpcy5fbGF5b3V0TWFuYWdlci5iZWdpblZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZygpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xheW91dE1hbmFnZXIuYWRkVmlydHVhbFNpemVkQ29udGFpbmVyKHRoaXMpO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xheW91dE1hbmFnZXIuZW5kVmlydHVhbFNpemVkQ29udGFpbmVyQWRkaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgY2hlY2tTaG93bkZyb21aZXJvRGltZW5zaW9ucygpIHtcclxuICAgICAgICBpZiAodGhpcy5faXNTaG93bldpdGhaZXJvRGltZW5zaW9ucyAmJiAodGhpcy5faGVpZ2h0ICE9PSAwIHx8IHRoaXMuX3dpZHRoICE9PSAwKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9pc1Nob3duV2l0aFplcm9EaW1lbnNpb25zID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFNob3coKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBlbWl0U2hvdygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmVtaXQoJ3Nob3duJyk7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdzaG93Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBlbWl0SGlkZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmVtaXQoJ2hpZGUnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlbGVhc2VDb21wb25lbnQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3N0YWNrTWF4aW1pc2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXhpdFN0YWNrTWF4aW1pc2VkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZW1pdCgnYmVmb3JlQ29tcG9uZW50UmVsZWFzZScsIHRoaXMuX2JvdW5kQ29tcG9uZW50LmNvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLnVuYmluZENvbXBvbmVudCh0aGlzLCB0aGlzLl9ib3VuZENvbXBvbmVudC52aXJ0dWFsLCB0aGlzLl9ib3VuZENvbXBvbmVudC5jb21wb25lbnQpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIENvbXBvbmVudENvbnRhaW5lcn0gKi9cclxuZXhwb3J0IHR5cGUgSXRlbUNvbnRhaW5lciA9IENvbXBvbmVudENvbnRhaW5lcjtcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgQ29tcG9uZW50Q29udGFpbmVyIHtcclxuICAgIGV4cG9ydCB0eXBlIENvbXBvbmVudCA9IHVua25vd247XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBCaW5kYWJsZUNvbXBvbmVudCB7XHJcbiAgICAgICAgY29tcG9uZW50OiBDb21wb25lbnQ7XHJcbiAgICAgICAgdmlydHVhbDogYm9vbGVhbjtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgdHlwZSBTdGF0ZVJlcXVlc3RFdmVudEhhbmRsZXIgPSAodGhpczogdm9pZCkgPT4gSnNvblZhbHVlIHwgdW5kZWZpbmVkO1xyXG4gICAgZXhwb3J0IHR5cGUgVmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50ID0gKHRoaXM6IHZvaWQsIGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikgPT4gdm9pZDtcclxuICAgIGV4cG9ydCB0eXBlIFZpcnR1YWxWaXNpYmlsaXR5Q2hhbmdlUmVxdWlyZWRFdmVudCA9ICh0aGlzOiB2b2lkLCBjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgdmlzaWJsZTogYm9vbGVhbikgPT4gdm9pZDtcclxuICAgIGV4cG9ydCB0eXBlIFZpcnR1YWxaSW5kZXhDaGFuZ2VSZXF1aXJlZEV2ZW50ID1cclxuICAgICAgICAodGhpczogdm9pZCwgY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIGxvZ2ljYWxaSW5kZXg6IExvZ2ljYWxaSW5kZXgsIGRlZmF1bHRaSW5kZXg6IHN0cmluZykgPT4gdm9pZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIFNob3dFdmVudEhhbmRsZXIgPSAodGhpczogdm9pZCkgPT4gdm9pZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIEhpZGVFdmVudEhhbmRsZXIgPSAodGhpczogdm9pZCkgPT4gdm9pZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIEZvY3VzRXZlbnRIYW5kbGVyID0gKHRoaXM6IHZvaWQsIHN1cHByZXNzRXZlbnQ6IGJvb2xlYW4pID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBCbHVyRXZlbnRIYW5kbGVyID0gKHRoaXM6IHZvaWQsIHN1cHByZXNzRXZlbnQ6IGJvb2xlYW4pID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBVcGRhdGVJdGVtQ29uZmlnRXZlbnRIYW5kbGVyID0gKGl0ZW1Db25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZykgPT4gdm9pZDtcclxufVxyXG4iLCJpbXBvcnQgeyBSZXNvbHZlZExheW91dENvbmZpZywgUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcsIFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL3Jlc29sdmVkLWNvbmZpZyc7XHJcbmltcG9ydCB7IFBvcG91dEJsb2NrZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9leHRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IFVuZXhwZWN0ZWROdWxsRXJyb3IsIFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IENvbnRlbnRJdGVtIH0gZnJvbSAnLi4vaXRlbXMvY29udGVudC1pdGVtJztcclxuaW1wb3J0IHsgUm93T3JDb2x1bW4gfSBmcm9tICcuLi9pdGVtcy9yb3ctb3ItY29sdW1uJztcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQtZW1pdHRlcic7XHJcbmltcG9ydCB7IFJlY3QsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQgeyBkZWVwRXh0ZW5kLCBnZXRFcnJvck1lc3NhZ2UsIGdldFVuaXF1ZUlkLCBnZXRXaW5kb3dUb3BMZWZ0Qm9yZGVyIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5cclxuLyoqXHJcbiAqIFBvcHMgYSBjb250ZW50IGl0ZW0gb3V0IGludG8gYSBuZXcgYnJvd3NlciB3aW5kb3cuXHJcbiAqIFRoaXMgaXMgYWNoaWV2ZWQgYnlcclxuICpcclxuICogICAgLSBDcmVhdGluZyBhIG5ldyBjb25maWd1cmF0aW9uIHdpdGggdGhlIGNvbnRlbnQgaXRlbSBhcyByb290IGVsZW1lbnRcclxuICogICAgLSBTZXJpYWxpemluZyBhbmQgbWluaWZ5aW5nIHRoZSBjb25maWd1cmF0aW9uXHJcbiAqICAgIC0gT3BlbmluZyB0aGUgY3VycmVudCB3aW5kb3cncyBVUkwgd2l0aCB0aGUgY29uZmlndXJhdGlvbiBhcyBhIEdFVCBwYXJhbWV0ZXJcclxuICogICAgLSBHb2xkZW5MYXlvdXQgd2hlbiBvcGVuZWQgaW4gdGhlIG5ldyB3aW5kb3cgd2lsbCBsb29rIGZvciB0aGUgR0VUIHBhcmFtZXRlclxyXG4gKiAgICAgIGFuZCB1c2UgaXQgaW5zdGVhZCBvZiB0aGUgcHJvdmlkZWQgY29uZmlndXJhdGlvblxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIEJyb3dzZXJQb3BvdXQgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfcG9wb3V0V2luZG93OiBXaW5kb3cgfCBudWxsO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaXNJbml0aWFsaXNlZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2NoZWNrUmVhZHlJbnRlcnZhbDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9wcmV2ZW50UG9wSW5PbkNsb3NlOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIF9jb25maWcgLSBHb2xkZW5MYXlvdXQgaXRlbSBjb25maWdcclxuICAgICAqIEBwYXJhbSBfaW5pdGlhbFdpbmRvd1NpemUgLSBBIG1hcCB3aXRoIHdpZHRoLCBoZWlnaHQsIHRvcCBhbmQgbGVmdFxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9jb25maWc6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9pbml0aWFsV2luZG93U2l6ZTogUmVjdCxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlcixcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGlzZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9wb3BvdXRXaW5kb3cgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3ByZXZlbnRQb3BJbk9uQ2xvc2UgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNyZWF0ZVdpbmRvdygpO1xyXG4gICAgfVxyXG5cclxuICAgIHRvQ29uZmlnKCk6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnIHtcclxuICAgICAgICBpZiAodGhpcy5faXNJbml0aWFsaXNlZCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGNyZWF0ZSBjb25maWcsIGxheW91dCBub3QgeWV0IGluaXRpYWxpc2VkJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBnbEluc3RhbmNlID0gdGhpcy5nZXRHbEluc3RhbmNlKCk7XHJcbiAgICAgICAgY29uc3QgZ2xJbnN0YW5jZUNvbmZpZyA9IGdsSW5zdGFuY2Uuc2F2ZUxheW91dCgpO1xyXG5cclxuICAgICAgICBsZXQgbGVmdDogbnVtYmVyIHwgbnVsbDtcclxuICAgICAgICBsZXQgdG9wOiBudW1iZXIgfCBudWxsO1xyXG4gICAgICAgIGlmICh0aGlzLl9wb3BvdXRXaW5kb3cgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgbGVmdCA9IG51bGw7XHJcbiAgICAgICAgICAgIHRvcCA9IG51bGw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGVmdCA9IHRoaXMuX3BvcG91dFdpbmRvdy5zY3JlZW5YID8/IHRoaXMuX3BvcG91dFdpbmRvdy5zY3JlZW5MZWZ0O1xyXG4gICAgICAgICAgICB0b3AgPSB0aGlzLl9wb3BvdXRXaW5kb3cuc2NyZWVuWSA/PyB0aGlzLl9wb3BvdXRXaW5kb3cuc2NyZWVuVG9wO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgd2luZG93OiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3cgPSB7XHJcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLmdldEdsSW5zdGFuY2UoKS53aWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLmdldEdsSW5zdGFuY2UoKS5oZWlnaHQsXHJcbiAgICAgICAgICAgIGxlZnQsXHJcbiAgICAgICAgICAgIHRvcCxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBjb25maWc6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnID0ge1xyXG4gICAgICAgICAgICByb290OiBnbEluc3RhbmNlQ29uZmlnLnJvb3QsXHJcbiAgICAgICAgICAgIG9wZW5Qb3BvdXRzOiBnbEluc3RhbmNlQ29uZmlnLm9wZW5Qb3BvdXRzLFxyXG4gICAgICAgICAgICBzZXR0aW5nczogZ2xJbnN0YW5jZUNvbmZpZy5zZXR0aW5ncyxcclxuICAgICAgICAgICAgZGltZW5zaW9uczogZ2xJbnN0YW5jZUNvbmZpZy5kaW1lbnNpb25zLFxyXG4gICAgICAgICAgICBoZWFkZXI6IGdsSW5zdGFuY2VDb25maWcuaGVhZGVyLFxyXG4gICAgICAgICAgICB3aW5kb3csXHJcbiAgICAgICAgICAgIHBhcmVudElkOiB0aGlzLl9jb25maWcucGFyZW50SWQsXHJcbiAgICAgICAgICAgIGluZGV4SW5QYXJlbnQ6IHRoaXMuX2NvbmZpZy5pbmRleEluUGFyZW50LFxyXG4gICAgICAgICAgICByZXNvbHZlZDogdHJ1ZSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gY29uZmlnO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEdsSW5zdGFuY2UoKTogTGF5b3V0TWFuYWdlciB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BvcG91dFdpbmRvdyA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignQlBHR0kyNDY5MycpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fcG9wb3V0V2luZG93Ll9fZ2xJbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyB0aGUgbmF0aXZlIEJyb3dzZXJXaW5kb3cgYmFja2luZyB0aGlzIHBvcG91dC5cclxuICAgICAqIE1pZ2h0IHRocm93IGFuIFVuZXhwZWN0ZWROdWxsRXJyb3IgZXhjZXB0aW9uIHdoZW4gdGhlIHdpbmRvdyBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LlxyXG4gICAgICogQHB1YmxpY1xyXG4gICAgICovXHJcbiAgICBnZXRXaW5kb3coKTogV2luZG93IHtcclxuICAgICAgICBpZiAodGhpcy5fcG9wb3V0V2luZG93ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdCUEdXMDg3MjE1Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9wb3BvdXRXaW5kb3c7XHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2UocHJldmVudFBvcEluID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICBpZiAocHJldmVudFBvcEluKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ByZXZlbnRQb3BJbk9uQ2xvc2UgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0R2xJbnN0YW5jZSgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0R2xJbnN0YW5jZSgpLmNsb3NlV2luZG93KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0V2luZG93KCkuY2xvc2UoKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIHBvcHBlZCBvdXQgaXRlbSB0byBpdHMgb3JpZ2luYWwgcG9zaXRpb24uIElmIHRoZSBvcmlnaW5hbFxyXG4gICAgICogcGFyZW50IGlzbid0IGF2YWlsYWJsZSBhbnltb3JlIGl0IGZhbGxzIGJhY2sgdG8gdGhlIGxheW91dCdzIHRvcG1vc3QgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBwb3BJbigpOiB2b2lkIHtcclxuICAgICAgICBsZXQgcGFyZW50SXRlbTogQ29udGVudEl0ZW07XHJcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5fY29uZmlnLmluZGV4SW5QYXJlbnQ7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fY29uZmlnLnBhcmVudElkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgKiBUaGUgZGVlcEV4dGVuZCBjYWxsIHNlZW1zIGEgYml0IHBvaW50bGVzcywgYnV0IGl0J3MgY3J1Y2lhbCB0b1xyXG4gICAgICAgICogY29weSB0aGUgY29uZmlnIHJldHVybmVkIGJ5IHRoaXMuZ2V0R2xJbnN0YW5jZSgpLnRvQ29uZmlnKClcclxuICAgICAgICAqIG9udG8gYSBuZXcgb2JqZWN0LiBJbnRlcm5ldCBFeHBsb3JlciBrZWVwcyB0aGUgcmVmZXJlbmNlc1xyXG4gICAgICAgICogdG8gb2JqZWN0cyBvbiB0aGUgY2hpbGQgd2luZG93LCByZXN1bHRpbmcgaW4gdGhlIGZvbGxvd2luZyBlcnJvclxyXG4gICAgICAgICogb25jZSB0aGUgY2hpbGQgd2luZG93IGlzIGNsb3NlZDpcclxuICAgICAgICAqXHJcbiAgICAgICAgKiBUaGUgY2FsbGVlIChzZXJ2ZXIgW25vdCBzZXJ2ZXIgYXBwbGljYXRpb25dKSBpcyBub3QgYXZhaWxhYmxlIGFuZCBkaXNhcHBlYXJlZFxyXG4gICAgICAgICovXHJcbiAgICAgICAgY29uc3QgZ2xJbnN0YW5jZUxheW91dENvbmZpZyA9IHRoaXMuZ2V0R2xJbnN0YW5jZSgpLnNhdmVMYXlvdXQoKTtcclxuICAgICAgICBjb25zdCBjb3BpZWRHbEluc3RhbmNlTGF5b3V0Q29uZmlnID0gZGVlcEV4dGVuZCh7fSwgZ2xJbnN0YW5jZUxheW91dENvbmZpZykgYXMgUmVzb2x2ZWRMYXlvdXRDb25maWc7XHJcbiAgICAgICAgbGV0IGNvcGllZFJvb3QgPSBjb3BpZWRHbEluc3RhbmNlTGF5b3V0Q29uZmlnLnJvb3Q7XHJcbiAgICAgICAgaWYgKGNvcGllZFJvb3QgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGdyb3VuZEl0ZW0gPSB0aGlzLl9sYXlvdXRNYW5hZ2VyLmdyb3VuZEl0ZW07XHJcbiAgICAgICAgaWYgKGdyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdCUFBJRzM0OTcyJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBhcmVudEl0ZW0gPSBncm91bmRJdGVtLmdldEl0ZW1zQnlQb3BJblBhcmVudElkKHRoaXMuX2NvbmZpZy5wYXJlbnRJZClbMF07XHJcblxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgKiBGYWxsYmFjayBpZiBwYXJlbnRJdGVtIGlzIG5vdCBhdmFpbGFibGUuIEVpdGhlciBhZGQgaXQgdG8gdGhlIHRvcG1vc3RcclxuICAgICAgICAqIGl0ZW0gb3IgbWFrZSBpdCB0aGUgdG9wbW9zdCBpdGVtIGlmIHRoZSBsYXlvdXQgaXMgZW1wdHlcclxuICAgICAgICAqL1xyXG4gICAgICAgIGlmICghcGFyZW50SXRlbSkge1xyXG4gICAgICAgICAgICBpZiAoZ3JvdW5kSXRlbS5jb250ZW50SXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50SXRlbSA9IGdyb3VuZEl0ZW0uY29udGVudEl0ZW1zWzBdO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50SXRlbSA9IGdyb3VuZEl0ZW07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaW5kZXggPSBwYXJlbnRJdGVtLmNvbnRlbnRJdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocGFyZW50SXRlbS5pc1N0YWNrKSB7ICAgXHJcbiAgICAgICAgICAgIC8vIFN0YWNrcyBjYW4gb25seSBob2xkIGNvbXBvbmVudCBpdGVtcyAtPiB0cnkgdG8gZmluZCBvbmUgYnkgdW5yYXZlbGluZyBjb250YWluZXJzIHdpdGggYSBzaW5nbGUgY2hpbGRcclxuICAgICAgICAgICAgd2hpbGUgKGNvcGllZFJvb3QudHlwZSAhPT0gSXRlbVR5cGUuY29tcG9uZW50ICYmIGNvcGllZFJvb3QuY29udGVudC5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIGNvcGllZFJvb3QgPSBjb3BpZWRSb290LmNvbnRlbnRbMF07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEZhaWxlZCB0byBmaW5kIGEgY29tcG9uZW50IGl0ZW0sIHdyYXAgdGhlIHBhcmVudCBpdGVtIGFuZCBkb2NrZWQgaXRlbSBpbiBhIHJvdyBhcyBzaWJsaW5nc1xyXG4gICAgICAgICAgICBpZiAoY29waWVkUm9vdC50eXBlICE9PSBJdGVtVHlwZS5jb21wb25lbnQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRJdGVtLnBhcmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdCUFBJRzM0OTczJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gbmV3IFJvd09yQ29sdW1uKGZhbHNlLCB0aGlzLl9sYXlvdXRNYW5hZ2VyLCBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZy5jcmVhdGVEZWZhdWx0KCdyb3cnKSwgcGFyZW50SXRlbS5wYXJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50SXRlbS5wYXJlbnQucmVwbGFjZUNoaWxkKHBhcmVudEl0ZW0sIHJvdywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgcm93LmFkZENoaWxkKHBhcmVudEl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50SXRlbSA9IHJvdztcclxuICAgICAgICAgICAgICAgIGluZGV4ID0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbmV3Q29udGVudEl0ZW0gPSB0aGlzLl9sYXlvdXRNYW5hZ2VyLmNyZWF0ZUFuZEluaXRDb250ZW50SXRlbShjb3BpZWRSb290LCBwYXJlbnRJdGVtKTtcclxuXHJcbiAgICAgICAgcGFyZW50SXRlbS5hZGRDaGlsZChuZXdDb250ZW50SXRlbSwgaW5kZXgpO1xyXG4gICAgICAgIGlmICh0aGlzLl9sYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5zZXR0aW5ncy5wb3BJbk9uQ2xvc2UpIHtcclxuICAgICAgICAgICAgdGhpcy5fb25DbG9zZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIHRoZSBVUkwgYW5kIHdpbmRvdyBwYXJhbWV0ZXJcclxuICAgICAqIGFuZCBvcGVucyBhIG5ldyB3aW5kb3dcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVdpbmRvdygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmNyZWF0ZVVybCgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBCb2d1cyB0aXRsZSB0byBwcmV2ZW50IHJlLXVzYWdlIG9mIGV4aXN0aW5nIHdpbmRvdyB3aXRoIHRoZVxyXG4gICAgICAgICAqIHNhbWUgdGl0bGUuIFRoZSBhY3R1YWwgdGl0bGUgd2lsbCBiZSBzZXQgYnkgdGhlIG5ldyB3aW5kb3cnc1xyXG4gICAgICAgICAqIEdvbGRlbkxheW91dCBpbnN0YW5jZSBpZiBpdCBkZXRlY3RzIHRoYXQgaXQgaXMgaW4gc3ViV2luZG93TW9kZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDApLnRvU3RyaW5nKDM2KTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG9wdGlvbnMgYXMgdXNlZCBpbiB0aGUgd2luZG93Lm9wZW4gc3RyaW5nXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgZmVhdHVyZXMgPSB0aGlzLnNlcmlhbGl6ZVdpbmRvd0ZlYXR1cmVzKHtcclxuICAgICAgICAgICAgbGVmdDogdGhpcy5faW5pdGlhbFdpbmRvd1NpemUubGVmdCxcclxuICAgICAgICAgICAgdG9wOiB0aGlzLl9pbml0aWFsV2luZG93U2l6ZS50b3AsXHJcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLl9pbml0aWFsV2luZG93U2l6ZS53aWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLl9pbml0aWFsV2luZG93U2l6ZS5oZWlnaHQsXHJcbiAgICAgICAgICAgIGlubmVyV2lkdGg6IHRoaXMuX2luaXRpYWxXaW5kb3dTaXplLndpZHRoLFxyXG4gICAgICAgICAgICBpbm5lckhlaWdodDogdGhpcy5faW5pdGlhbFdpbmRvd1NpemUuaGVpZ2h0LFxyXG4gICAgICAgICAgICBtZW51YmFyOiAnbm8nLFxyXG4gICAgICAgICAgICB0b29sYmFyOiAnbm8nLFxyXG4gICAgICAgICAgICBsb2NhdGlvbjogJ25vJyxcclxuICAgICAgICAgICAgcGVyc29uYWxiYXI6ICdubycsXHJcbiAgICAgICAgICAgIHJlc2l6YWJsZTogJ3llcycsXHJcbiAgICAgICAgICAgIHNjcm9sbGJhcnM6ICdubycsXHJcbiAgICAgICAgICAgIHN0YXR1czogJ25vJ1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl9wb3BvdXRXaW5kb3cgPSBnbG9iYWxUaGlzLm9wZW4odXJsLCB0YXJnZXQsIGZlYXR1cmVzKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9wb3BvdXRXaW5kb3cpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2xheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLnNldHRpbmdzLmJsb2NrZWRQb3BvdXRzVGhyb3dFcnJvciA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgUG9wb3V0QmxvY2tlZEVycm9yKCdQb3BvdXQgYmxvY2tlZCcpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BvcG91dFdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4geyAgICBcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkFuZFJlc2l6ZVdpbmRvdygpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BvcG91dFdpbmRvdykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcG9wb3V0V2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuc2V0dGluZ3MucG9wSW5PbkNsb3NlICYmICF0aGlzLl9wcmV2ZW50UG9wSW5PbkNsb3NlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wSW4oKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBQb2xsaW5nIHRoZSBjaGlsZHdpbmRvdyB0byBmaW5kIG91dCBpZiBHb2xkZW5MYXlvdXQgaGFzIGJlZW4gaW5pdGlhbGlzZWRcclxuICAgICAgICAgKiBkb2Vzbid0IHNlZW0gb3B0aW1hbCwgYnV0IHRoZSBhbHRlcm5hdGl2ZXMgLSBhZGRpbmcgYSBjYWxsYmFjayB0byB0aGUgcGFyZW50XHJcbiAgICAgICAgICogd2luZG93IG9yIHJhaXNpbmcgYW4gZXZlbnQgb24gdGhlIHdpbmRvdyBvYmplY3QgLSBib3RoIHdvdWxkIGludHJvZHVjZSBrbm93bGVkZ2VcclxuICAgICAgICAgKiBhYm91dCB0aGUgcGFyZW50IHRvIHRoZSBjaGlsZCB3aW5kb3cgd2hpY2ggd2UnZCByYXRoZXIgYXZvaWRcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9jaGVja1JlYWR5SW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLmNoZWNrUmVhZHkoKSwgMTApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgY2hlY2tSZWFkeSgpIHtcclxuICAgICAgICBpZiAodGhpcy5fcG9wb3V0V2luZG93ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdCUENSMDE4NDQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fcG9wb3V0V2luZG93Ll9fZ2xJbnN0YW5jZSAmJiB0aGlzLl9wb3BvdXRXaW5kb3cuX19nbEluc3RhbmNlLmlzSW5pdGlhbGlzZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3BvcG91dFdpbmRvdy5fX2dsSW5zdGFuY2UucGFyZW50ID0gdGhpcy5fbGF5b3V0TWFuYWdlcjtcclxuICAgICAgICAgICAgICAgIHRoaXMub25Jbml0aWFsaXNlZCgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NoZWNrUmVhZHlJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9jaGVja1JlYWR5SW50ZXJ2YWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrUmVhZHlJbnRlcnZhbCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBvc2l0aW9uQW5kUmVzaXplV2luZG93KCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9wb3BvdXRXaW5kb3cgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0JQUEFSVzEnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEluaXRpYWwgd2luZG93IHNpemUgcGFyYW1ldGVycyBkZXNjcmliZSBjbGllbnQgKGkuZS4gaW5uZXIpIHBvc2l0aW9uIGFuZCBzaXplXHJcbiAgICAgICAgLy8gU2luY2UgdGhlIGJvcmRlciBvZiB0aGUgcG9wb3V0IG1heSBoYXZlIGRpZmZlcmVudCBib3JkZXJzIHRoYW4gdGhlIG1haW4gd2luZG93LCB3ZSBoYXZlXHJcbiAgICAgICAgLy8gdG8gYWRqdXN0IHRoZSBwb3NpdGlvbiBhbmQgc2l6ZSBvbmNlIHRoZSB3aW5kb3cgaGFzIGJlZW4gY3JlYXRlZC5cclxuICAgICAgICAvLyBPbmx5IGRvIHRoaXMgaWYgdGhlIHdpbmRvdyBwYXJhbWV0ZXJzIGFyZSBwbGF1c2libGUgKGUuZy4gb24gTGludXggaW5uZXIgZGltZW5zaW9uIGlzIHplcm8gc29tZXRpbWVzKVxyXG4gICAgICAgIGlmICh0aGlzLl9wb3BvdXRXaW5kb3cuaW5uZXJXaWR0aCA+IDAgJiYgdGhpcy5fcG9wb3V0V2luZG93LmlubmVySGVpZ2h0ID4gMCAmJlxyXG4gICAgICAgICAgICB0aGlzLl9wb3BvdXRXaW5kb3cub3V0ZXJXaWR0aCA+IDAgJiYgdGhpcy5fcG9wb3V0V2luZG93Lm91dGVySGVpZ2h0ID4gMCAmJlxyXG4gICAgICAgICAgICB0aGlzLl9wb3BvdXRXaW5kb3cuaW5uZXJXaWR0aCA8PSB0aGlzLl9wb3BvdXRXaW5kb3cub3V0ZXJXaWR0aCAmJlxyXG4gICAgICAgICAgICB0aGlzLl9wb3BvdXRXaW5kb3cuaW5uZXJIZWlnaHQgPD0gdGhpcy5fcG9wb3V0V2luZG93Lm91dGVySGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgY29uc3QgYm9yZGVyID0gZ2V0V2luZG93VG9wTGVmdEJvcmRlcih0aGlzLl9wb3BvdXRXaW5kb3cpO1xyXG4gICAgICAgICAgICB0aGlzLl9wb3BvdXRXaW5kb3cubW92ZVRvKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5faW5pdGlhbFdpbmRvd1NpemUubGVmdCAtIGJvcmRlci53aWR0aCxcclxuICAgICAgICAgICAgICAgIHRoaXMuX2luaXRpYWxXaW5kb3dTaXplLnRvcCAtIGJvcmRlci5oZWlnaHQsXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRoaXMuX3BvcG91dFdpbmRvdy5yZXNpemVUbyhcclxuICAgICAgICAgICAgICAgIHRoaXMuX2luaXRpYWxXaW5kb3dTaXplLndpZHRoICsgKHRoaXMuX3BvcG91dFdpbmRvdy5vdXRlcldpZHRoIC0gdGhpcy5fcG9wb3V0V2luZG93LmlubmVyV2lkdGgpLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5faW5pdGlhbFdpbmRvd1NpemUuaGVpZ2h0ICsgKHRoaXMuX3BvcG91dFdpbmRvdy5vdXRlckhlaWdodCAtIHRoaXMuX3BvcG91dFdpbmRvdy5pbm5lckhlaWdodClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BvcG91dFdpbmRvdy5mb2N1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VyaWFsaXNlcyBhIG1hcCBvZiBrZXk6dmFsdWVzIHRvIGEgd2luZG93IG9wdGlvbnMgc3RyaW5nXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHdpbmRvd09wdGlvbnMgLVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHNlcmlhbGlzZWQgd2luZG93IG9wdGlvbnNcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNlcmlhbGl6ZVdpbmRvd0ZlYXR1cmVzKHdpbmRvd09wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4pOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IHdpbmRvd09wdGlvbnNTdHJpbmc6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHdpbmRvd09wdGlvbnMpIHtcclxuICAgICAgICAgICAgd2luZG93T3B0aW9uc1N0cmluZy5wdXNoKGtleSArICc9JyArIHdpbmRvd09wdGlvbnNba2V5XS50b1N0cmluZygpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB3aW5kb3dPcHRpb25zU3RyaW5nLmpvaW4oJywnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgdGhlIFVSTCBmb3IgdGhlIG5ldyB3aW5kb3csIGluY2x1ZGluZyB0aGVcclxuICAgICAqIGNvbmZpZyBHRVQgcGFyYW1ldGVyXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgVVJMXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVVcmwoKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBzdG9yYWdlS2V5ID0gJ2dsLXdpbmRvdy1jb25maWctJyArIGdldFVuaXF1ZUlkKCk7XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gUmVzb2x2ZWRMYXlvdXRDb25maWcubWluaWZ5Q29uZmlnKHRoaXMuX2NvbmZpZyk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHN0b3JhZ2VLZXksIEpTT04uc3RyaW5naWZ5KGNvbmZpZykpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciB3aGlsZSB3cml0aW5nIHRvIGxvY2FsU3RvcmFnZSAnICsgZ2V0RXJyb3JNZXNzYWdlKGUpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoJy9nbC1wb3BvdXQnLCBsb2NhdGlvbi5vcmlnaW4pO1xyXG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdnbC13aW5kb3cnLCBzdG9yYWdlS2V5KTtcclxuXHJcbiAgICAgICAgY29uc3QgdGhlbWUgPSB0aGlzLl9sYXlvdXRNYW5hZ2VyLmNvbnRhaW5lci5kYXRhc2V0LnRoZW1lO1xyXG4gICAgICAgIGlmICh0aGVtZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdnbC10aGVtZScsIHRoZW1lKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB1cmwudG9TdHJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxiYWNrIHdoZW4gdGhlIG5ldyB3aW5kb3cgaXMgb3BlbmVkIGFuZCB0aGUgR29sZGVuTGF5b3V0IGluc3RhbmNlXHJcbiAgICAgKiB3aXRoaW4gaXQgaXMgaW5pdGlhbGlzZWRcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uSW5pdGlhbGlzZWQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXNlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5nZXRHbEluc3RhbmNlKCkub24oJ3BvcEluJywgKCkgPT4gdGhpcy5wb3BJbigpKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2luaXRpYWxpc2VkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZva2VkIDUwbXMgYWZ0ZXIgdGhlIHdpbmRvdyB1bmxvYWQgZXZlbnRcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9vbkNsb3NlKCkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5lbWl0KCdjbG9zZWQnKSwgNTApO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IERyYWdQcm94eSB9IGZyb20gJy4vZHJhZy1wcm94eSc7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IFVuZXhwZWN0ZWROdWxsRXJyb3IsIFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LWVtaXR0ZXInO1xyXG5pbXBvcnQgeyBDb250ZW50SXRlbSB9IGZyb20gJy4uL2l0ZW1zL2NvbnRlbnQtaXRlbSc7XHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9jb21wb25lbnQtaXRlbSc7XHJcbmltcG9ydCB7IERyYWdMaXN0ZW5lciB9IGZyb20gJy4uL3V0aWxzL2RyYWctbGlzdGVuZXInO1xyXG5pbXBvcnQgeyBnZXRXaW5kb3dJbm5lclNjcmVlblBvc2l0aW9uIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5jbGFzcyBEcmFnVGFyZ2V0IHtcclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX293bmVyOiBEcmFnQWN0aW9uLFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2FyZWE6IENvbnRlbnRJdGVtLkFyZWEsXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfcGFnZVg6IG51bWJlcixcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9wYWdlWTogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKF9vd25lci5sYXlvdXRNYW5hZ2VyICE9PSBfYXJlYS5jb250ZW50SXRlbS5sYXlvdXRNYW5hZ2VyKSB7XHJcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdMYXlvdXRNYW5hZ2VyIG9mIEFyZWEgYW5kIERyYWdQcm94eSBtdXN0IG1hdGNoJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBvd25lcigpOiBEcmFnQWN0aW9uIHsgcmV0dXJuIHRoaXMuX293bmVyOyB9XHJcbiAgICBnZXQgYXJlYSgpOiBDb250ZW50SXRlbS5BcmVhIHsgcmV0dXJuIHRoaXMuX2FyZWE7IH1cclxuXHJcbiAgICBkcm9wKGl0ZW06IENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICB0aGlzLl9hcmVhLmNvbnRlbnRJdGVtLm9uRHJvcChpdGVtLCB0aGlzLl9hcmVhKTtcclxuICAgIH1cclxuXHJcbiAgICBoaWdobGlnaHREcm9wWm9uZSgpIHtcclxuICAgICAgICB0aGlzLmFyZWEuY29udGVudEl0ZW0uaGlnaGxpZ2h0RHJvcFpvbmUodGhpcy5fcGFnZVgsIHRoaXMuX3BhZ2VZLCB0aGlzLl9hcmVhKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgY2xhc3MgRHJhZ0FjdGlvbiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBwcml2YXRlIF9kcmFnUHJveHk6IERyYWdQcm94eSB8IG51bGwgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBfY3VycmVudFRhcmdldDogRHJhZ1RhcmdldCB8IG51bGwgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBfZHJhZ0xpc3RlbmVyOiBEcmFnTGlzdGVuZXIgfCBudWxsID0gbnVsbDtcclxuICAgIHByaXZhdGUgX2JvdW5kaW5nUmVjdDogRE9NUmVjdDtcclxuICAgIHByaXZhdGUgX2FjdGlvbnM6IERyYWdBY3Rpb25bXSA9IFtdO1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RyYWdFdmVudEhhbmRsZXIgPSAoX29mZnNldFg6IG51bWJlciwgX29mZnNldFk6IG51bWJlciwgZXZlbnQ6IEV2ZW50RW1pdHRlci5EcmFnRXZlbnQpID0+IHRoaXMub25EcmFnKGV2ZW50KTtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RyYWdTdG9wRXZlbnRIYW5kbGVyID0gKCkgPT4gdGhpcy5vbkRyYWdTdG9wKCk7XHJcblxyXG4gICAgZ2V0IGxheW91dE1hbmFnZXIoKTogTGF5b3V0TWFuYWdlciB7IHJldHVybiB0aGlzLl9sYXlvdXRNYW5hZ2VyOyB9XHJcbiAgICBnZXQgcGFyZW50KCk6IERyYWdBY3Rpb24gfCBudWxsIHsgcmV0dXJuIHRoaXMuX3BhcmVudDsgfVxyXG4gICAgZ2V0IHByb3h5KCk6IERyYWdQcm94eSB8IG51bGwgeyByZXR1cm4gdGhpcy5fZHJhZ1Byb3h5OyB9XHJcbiAgICBwcml2YXRlIGdldCBwYXJlbnRPclNlbGYoKTogRHJhZ0FjdGlvbiB7IHJldHVybiB0aGlzLl9wYXJlbnQgPz8gdGhpczsgfVxyXG4gICAgZ2V0IGN1cnJlbnRUYXJnZXQoKTogRHJhZ1RhcmdldCB8IG51bGwgeyByZXR1cm4gdGhpcy5wYXJlbnRPclNlbGYuX2N1cnJlbnRUYXJnZXQ7IH1cclxuICAgIHByaXZhdGUgc2V0IGN1cnJlbnRUYXJnZXQodmFsdWUgOiBEcmFnVGFyZ2V0IHwgbnVsbCkgeyB0aGlzLnBhcmVudE9yU2VsZi5fY3VycmVudFRhcmdldCA9IHZhbHVlOyB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9sYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2FsbG93UG9wb3V0OiBib29sZWFuID0gZmFsc2UsXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfcGFyZW50OiBEcmFnQWN0aW9uIHwgbnVsbCA9IG51bGxcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5fYm91bmRpbmdSZWN0ID0gdGhpcy5jb21wdXRlQm91bmRpbmdSZWN0KCk7XHJcbiAgICAgICAgdGhpcy5wYXJlbnRPclNlbGYuX2FjdGlvbnMucHVzaCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvbXB1dGVCb3VuZGluZ1JlY3QoKTogRE9NUmVjdCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2xheW91dE1hbmFnZXIuZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0RBQ0JSMTExMjAnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5fbGF5b3V0TWFuYWdlci5ncm91bmRJdGVtLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgIHJldHVybiBET01SZWN0LmZyb21SZWN0KHtcclxuICAgICAgICAgICAgICAgIHg6IGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCArIHJlY3QubGVmdCxcclxuICAgICAgICAgICAgICAgIHk6IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wICsgcmVjdC50b3AsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogcmVjdC53aWR0aCxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogcmVjdC5oZWlnaHRcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2NyZWVuVG9QYWdlKHNjcmVlblg6IG51bWJlciwgc2NyZWVuWTogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgaW5uZXJTY3JlZW4gPSBnZXRXaW5kb3dJbm5lclNjcmVlblBvc2l0aW9uKGdsb2JhbFRoaXMpO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB4OiBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgKyBzY3JlZW5YIC0gaW5uZXJTY3JlZW4ubGVmdCxcclxuICAgICAgICAgICAgeTogZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgKyBzY3JlZW5ZIC0gaW5uZXJTY3JlZW4udG9wXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzUHJveHlWaXNpYmxlKHByb3h5OiBEcmFnUHJveHksIHBhZ2VYIDogbnVtYmVyLCBwYWdlWTogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgcGFnZVggPj0gdGhpcy5fYm91bmRpbmdSZWN0LmxlZnQgLSBwcm94eS5vdXRlcldpZHRoICYmXHJcbiAgICAgICAgICAgIHBhZ2VYIDwgdGhpcy5fYm91bmRpbmdSZWN0LnJpZ2h0ICYmXHJcbiAgICAgICAgICAgIHBhZ2VZID49IHRoaXMuX2JvdW5kaW5nUmVjdC50b3AgLSBwcm94eS5vdXRlckhlaWdodCAmJlxyXG4gICAgICAgICAgICBwYWdlWSA8IHRoaXMuX2JvdW5kaW5nUmVjdC5ib3R0b21cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlUHJveHkoaXRlbTogQ29tcG9uZW50SXRlbSwgeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9kcmFnUHJveHkgPSBuZXcgRHJhZ1Byb3h5KHRoaXMsIGl0ZW0sIHgsIHkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZHJhZ0xvY2FsKHBhZ2VYOiBudW1iZXIsIHBhZ2VZOiBudW1iZXIpOiBEcmFnVGFyZ2V0IHwgbnVsbCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RyYWdQcm94eSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCBhcmVhID0gdGhpcy5fZHJhZ1Byb3h5LmRyYWcocGFnZVgsIHBhZ2VZKTtcclxuICAgICAgICAgICAgcmV0dXJuIChhcmVhICE9PSBudWxsKSA/IG5ldyBEcmFnVGFyZ2V0KHRoaXMsIGFyZWEsIHBhZ2VYLCBwYWdlWSkgOiBudWxsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRyYWdHbG9iYWwoc2NyZWVuWDogbnVtYmVyLCBzY3JlZW5ZOiBudW1iZXIpOiBEcmFnVGFyZ2V0IHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5fcGFyZW50Py5fZHJhZ1Byb3h5O1xyXG4gICAgICAgIGlmICghc291cmNlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdEQURHMScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgeyB4OiBwYWdlWCwgeTogcGFnZVkgfSA9IHRoaXMuc2NyZWVuVG9QYWdlKHNjcmVlblgsIHNjcmVlblkpO1xyXG4gICAgICAgIGNvbnN0IHZpc2libGUgPSBkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICd2aXNpYmxlJyAmJiB0aGlzLmlzUHJveHlWaXNpYmxlKHNvdXJjZSwgcGFnZVgsIHBhZ2VZKTtcclxuXHJcbiAgICAgICAgaWYgKHZpc2libGUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RyYWdQcm94eSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmdyb3VuZEl0ZW07XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0RBREcyJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHNvdXJjZS5jb21wb25lbnRJdGVtLnRvQ29uZmlnKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkcmFnSXRlbSA9IG5ldyBDb21wb25lbnRJdGVtKHRoaXMubGF5b3V0TWFuYWdlciwgY29uZmlnLCBwYXJlbnQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVQcm94eShkcmFnSXRlbSwgcGFnZVgsIHBhZ2VZKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFByb3h5IGlzIG5vIGxvbmdlciB2aXNpYmxlIGFuZCBub3QgY3VycmVudGx5IHRoZSBkcmFnIHRhcmdldCAtPiBkZXN0cm95XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kcmFnUHJveHkgIT09IG51bGwgJiYgdGhpcy5jdXJyZW50VGFyZ2V0Py5vd25lciAhPT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbkRyYWdTdG9wKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmRyYWdMb2NhbChwYWdlWCwgcGFnZVkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25EcmFnU3RvcCgpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiB0aGlzLl9hY3Rpb25zKSB7XHJcbiAgICAgICAgICAgIGFjdGlvbi5sYXlvdXRNYW5hZ2VyLmhpZGVEcm9wVGFyZ2V0SW5kaWNhdG9yKCk7XHJcbiAgICAgICAgICAgIGFjdGlvbi5fZHJhZ1Byb3h5Py5kcm9wKCk7XHJcbiAgICAgICAgICAgIGFjdGlvbi5fZHJhZ1Byb3h5ID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lcj8ub2ZmKCdkcmFnJywgdGhpcy5fZHJhZ0V2ZW50SGFuZGxlcik7XHJcbiAgICAgICAgdGhpcy5fZHJhZ0xpc3RlbmVyPy5vZmYoJ2RyYWdTdG9wJywgdGhpcy5fZHJhZ1N0b3BFdmVudEhhbmRsZXIpO1xyXG4gICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fY3VycmVudFRhcmdldCA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkRyYWcoZXZlbnQ6IEV2ZW50RW1pdHRlci5EcmFnRXZlbnQpIHtcclxuICAgICAgICBsZXQgdGFyZ2V0OiBEcmFnVGFyZ2V0IHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgIFxyXG4gICAgICAgIC8vIFRyeSB0byBmaW5kIGEgZHJhZyB0YXJnZXQgYnkgaW52b2tpbmcgYWxsIGFjdGlvbnMuXHJcbiAgICAgICAgLy8gRm9yIHNlY29uZGFyeSBhY3Rpb25zIHRoZSBzY3JlZW4gcG9zaXRpb24gb2YgdGhlIGV2ZW50IGhhdmUgdG8gYmUgdHJhbnNsYXRlZC5cclxuICAgICAgICAvLyBUaGUgZmlyc3QgdmFsaWQgdGFyZ2V0IGlzIHNlbGVjdGVkLCBzdGlsbCB3ZSB3YW50IHRvIGludm9rZSBhbGwgYWN0aW9ucyBkdWUgdG8gdGhlIGN1bGxpbmcgbG9naWMgaW4gZHJhZ0dsb2JhbC5cclxuICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiB0aGlzLl9hY3Rpb25zKSB7XHJcbiAgICAgICAgICAgIGxldCB0OiBEcmFnVGFyZ2V0IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICBpZiAoYWN0aW9uICE9PSB0aGlzKSB7XHJcbiAgICAgICAgICAgICAgICB0ID0gYWN0aW9uLmRyYWdHbG9iYWwoZXZlbnQuc2NyZWVuWCwgZXZlbnQuc2NyZWVuWSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fZHJhZ1Byb3h5ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0ID0gdGhpcy5kcmFnTG9jYWwoZXZlbnQucGFnZVgsIGV2ZW50LnBhZ2VZKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gT25seSBzZXQgdGFyZ2V0IGlmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUsIHVubGVzcyB0aGUgcHJlbGltaW5hcnkgdGFyZ2V0XHJcbiAgICAgICAgICAgIC8vIGJlbG9uZ3MgdG8gdGhlIG1haW4gd2luZG93LiBJbiB0aGF0IGNhc2Ugd2Ugc2V0IHRoZSBuZXcgdGFyZ2V0IHRvIHByaW9yaXRpemUgcG9wb3V0IHdpbmRvd3Mgb3ZlciB0aGUgbWFpbiB3aW5kb3cuXHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQgPT09IG51bGwgfHwgKHQgIT09IG51bGwgJiYgdGFyZ2V0Lm93bmVyLmxheW91dE1hbmFnZXIucGFyZW50ID09PSBudWxsKSkge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gbnVsbCB8fCB0aGlzLl9hbGxvd1BvcG91dCkge1xyXG4gICAgICAgICAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBkcm9wIGFyZWEgYnV0IGl0IGlzIGluIGEgZGlmZmVyZW50IHdpbmRvdywgaGlkZSB0aGUgaW5kaWNhdG9yLlxyXG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50VGFyZ2V0ICE9PSBudWxsICYmIHRoaXMuY3VycmVudFRhcmdldC5vd25lciAhPT0gdGFyZ2V0Py5vd25lcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VGFyZ2V0Lm93bmVyLmxheW91dE1hbmFnZXIuaGlkZURyb3BUYXJnZXRJbmRpY2F0b3IoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRhcmdldCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gTW92ZSB0aGUgb3duZXIgb2YgdGhlIHRhcmdldCB0byB0aGUgZnJvbnQsIHNvIGl0IGhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eSBmb3IgZnV0dXJlIGRyYWcgZXZlbnRzLlxyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9hY3Rpb25zLmluZGV4T2YodGFyZ2V0Lm93bmVyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGlvbnMudW5zaGlmdCh0YXJnZXQub3duZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRhcmdldC5oaWdobGlnaHREcm9wWm9uZSgpO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0Lm93bmVyLmxheW91dE1hbmFnZXIubW92ZVdpbmRvd1RvcCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUYXJnZXQgPSB0YXJnZXQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFNwYXduIGEgc2Vjb25kYXJ5IGRyYWcgYWN0aW9uLCB0aGUgcHJveHkgZWxlbWVudCBpcyBvbmx5IGNyZWF0ZWQgd2hlbiB0aGUgcG9pbnRlciBlbnRlcnMgaXRzIHdpbmRvdy5cclxuICAgIHN0YXRpYyBzcGF3bihsYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLCBwYXJlbnQ6IERyYWdBY3Rpb24pOiBEcmFnQWN0aW9uIHtcclxuICAgICAgICBpZiAocGFyZW50Ll9wYXJlbnQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZWNvbmRhcnkgRHJhZ0FjdGlvbiBjYW5ub3Qgc3Bhd24gYW5vdGhlciBEcmFnQWN0aW9uLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBEcmFnQWN0aW9uKGxheW91dE1hbmFnZXIsIGZhbHNlLCBwYXJlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFN0YXJ0IGEgZHJhZyBhY3Rpb24sIGltbWVkaWF0ZWx5IHNob3dpbmcgYSBwcm94eSBlbGVtZW50LlxyXG4gICAgc3RhdGljIHN0YXJ0KGxheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXIsIGxpc3RlbmVyOiBEcmFnTGlzdGVuZXIsIGl0ZW06IENvbXBvbmVudEl0ZW0sIHg6IG51bWJlciwgeTogbnVtYmVyLCBhbGxvd1BvcG91dDogYm9vbGVhbik6IERyYWdBY3Rpb24geyAgICAgICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGFjdGlvbiA9IG5ldyBEcmFnQWN0aW9uKGxheW91dE1hbmFnZXIsIGFsbG93UG9wb3V0KTtcclxuICAgICAgICBhY3Rpb24uY3JlYXRlUHJveHkoaXRlbSwgeCwgeSk7XHJcbiAgICAgICAgYWN0aW9uLl9kcmFnTGlzdGVuZXIgPSBsaXN0ZW5lcjtcclxuICAgICAgICBsaXN0ZW5lci5vbignZHJhZycsIGFjdGlvbi5fZHJhZ0V2ZW50SGFuZGxlcik7XHJcbiAgICAgICAgbGlzdGVuZXIub24oJ2RyYWdTdG9wJywgYWN0aW9uLl9kcmFnU3RvcEV2ZW50SGFuZGxlcik7XHJcbiAgICAgICAgcmV0dXJuIGFjdGlvbjtcclxuICAgIH1cclxufSIsImltcG9ydCB7IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL3Jlc29sdmVkLWNvbmZpZyc7XHJcbmltcG9ydCB7IFVuZXhwZWN0ZWROdWxsRXJyb3IsIFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9jb21wb25lbnQtaXRlbSc7XHJcbmltcG9ydCB7IENvbnRlbnRJdGVtIH0gZnJvbSAnLi4vaXRlbXMvY29udGVudC1pdGVtJztcclxuaW1wb3J0IHsgU3RhY2sgfSBmcm9tICcuLi9pdGVtcy9zdGFjayc7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IERvbUNvbnN0YW50cyB9IGZyb20gJy4uL3V0aWxzL2RvbS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9ldmVudC1lbWl0dGVyJztcclxuaW1wb3J0IHsgU2lkZSwgV2lkdGhBbmRIZWlnaHQgfSBmcm9tICcuLi91dGlscy90eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgICBnZXRVbmlxdWVJZCxcclxuICAgIGdldFdpbmRvd0lubmVyU2NyZWVuUG9zaXRpb24sXHJcbiAgICBudW1iZXJUb1BpeGVsc1xyXG59IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0IHsgRHJhZ0FjdGlvbiB9IGZyb20gJy4vZHJhZy1hY3Rpb24nO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgY3JlYXRlcyBhIHRlbXBvcmFyeSBjb250YWluZXJcclxuICogZm9yIHRoZSBjb21wb25lbnQgd2hpbHN0IGl0IGlzIGJlaW5nIGRyYWdnZWRcclxuICogYW5kIGhhbmRsZXMgZHJhZyBldmVudHNcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRHJhZ1Byb3h5IGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICAgIHByaXZhdGUgX291dGVyV2lkdGg6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX291dGVySGVpZ2h0OiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9zaWRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgX2VsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgcHJpdmF0ZSBfcHJveHlDb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgX2NvbXBvbmVudEl0ZW1Gb2N1c2VkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb3JpZ2luYWxTaXplOiBXaWR0aEFuZEhlaWdodDtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RvY2tQb2ludDogQ29udGVudEl0ZW0uRG9ja1BvaW50IHwgbnVsbDtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2dyb3VuZEFyZWE6IENvbnRlbnRJdGVtLkFyZWE7XHJcbiAgICBwcml2YXRlIF9sYXN0QXJlYTogQ29udGVudEl0ZW0uQXJlYSB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIGdldCBlbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7IH1cclxuICAgIGdldCBvdXRlcldpZHRoKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9vdXRlcldpZHRoOyB9XHJcbiAgICBnZXQgb3V0ZXJIZWlnaHQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX291dGVySGVpZ2h0OyB9XHJcbiAgICBnZXQgY29tcG9uZW50SXRlbSgpOiBDb21wb25lbnRJdGVtIHsgcmV0dXJuIHRoaXMuX2NvbXBvbmVudEl0ZW07IH1cclxuICAgIGdldCBsYXlvdXRNYW5hZ2VyKCk6IExheW91dE1hbmFnZXIgeyByZXR1cm4gdGhpcy5fYWN0aW9uLmxheW91dE1hbmFnZXI7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB4IC0gVGhlIGluaXRpYWwgeCBwb3NpdGlvblxyXG4gICAgICogQHBhcmFtIHkgLSBUaGUgaW5pdGlhbCB5IHBvc2l0aW9uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfYWN0aW9uOiBEcmFnQWN0aW9uLFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0sXHJcbiAgICAgICAgeDogbnVtYmVyLCB5OiBudW1iZXJcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICAgIGxldCBzaXplZENvbXBvbmVudCA9IHRoaXMuX2NvbXBvbmVudEl0ZW07XHJcblxyXG4gICAgICAgIC8vIElmIHdlIGFyZSBkcmFnZ2luZyBhbiBpbmFjdGl2ZSBjb21wb25lbnQgb2YgYSBzdGFjaywgd2Ugd29uJ3QgYmUgYWJsZSB0byBnZXQgcmVhc29uYWJsZVxyXG4gICAgICAgIC8vIHNpemUgZm9yIGEgcG9wb3V0LiBVc2UgdGhlIHNpemUgb2YgdGhlIGFjdGl2ZSBjb21wb25lbnQgaW5zdGVhZCBpbiB0aGlzIGNhc2UuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudEl0ZW0ucGFyZW50IGluc3RhbmNlb2YgU3RhY2spIHtcclxuICAgICAgICAgICAgY29uc3QgYWN0aXZlID0gdGhpcy5fY29tcG9uZW50SXRlbS5wYXJlbnQuZ2V0QWN0aXZlQ29tcG9uZW50SXRlbSgpO1xyXG4gICAgICAgICAgICBpZiAoYWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICBzaXplZENvbXBvbmVudCA9IGFjdGl2ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fb3JpZ2luYWxTaXplID0gc2l6ZWRDb21wb25lbnQuZ2V0T3V0ZXJCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICB0aGlzLmNyZWF0ZURyYWdQcm94eUVsZW1lbnRzKHgsIHkpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fY29tcG9uZW50SXRlbS5wYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgLy8gTm90ZSB0aGF0IF9jb250ZW50SXRlbSB3aWxsIGhhdmUgZHVtbXkgR3JvdW5kSXRlbSBhcyBwYXJlbnQgaWYgaW5pdGlhdGVkIGJ5IGEgZXh0ZXJuYWwgZHJhZyBzb3VyY2VcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0RQQzEwMDk3Jyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9jb21wb25lbnRJdGVtRm9jdXNlZCA9IHRoaXMuX2NvbXBvbmVudEl0ZW0uZm9jdXNlZDtcclxuICAgICAgICBpZiAodGhpcy5fY29tcG9uZW50SXRlbUZvY3VzZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5ibHVyKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9kb2NrUG9pbnQgPSB0aGlzLl9jb21wb25lbnRJdGVtLmZpbmREb2NrUG9pbnQoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudEl0ZW0ucGFyZW50LmNvbnRlbnRJdGVtcy5pbmNsdWRlcyh0aGlzLl9jb21wb25lbnRJdGVtKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRJdGVtLnBhcmVudC5yZW1vdmVDaGlsZCh0aGlzLl9jb21wb25lbnRJdGVtLCB0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0RGltZW5zaW9ucygpO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5sYXlvdXRNYW5hZ2VyLmdyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdEUEMxMDA5OCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZ3JvdW5kQXJlYSA9IHRoaXMubGF5b3V0TWFuYWdlci5ncm91bmRJdGVtLmdldEVsZW1lbnRBcmVhKCk7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmNhbGN1bGF0ZUl0ZW1BcmVhcygpO1xyXG4gICAgICAgIHRoaXMuc2V0RHJvcFBvc2l0aW9uKHgsIHkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBDcmVhdGUgU3RhY2stbGlrZSBzdHJ1Y3R1cmUgdG8gY29udGFpbiB0aGUgZHJhZ2dlZCBjb21wb25lbnQgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlRHJhZ1Byb3h5RWxlbWVudHMoaW5pdGlhbFg6IG51bWJlciwgaW5pdGlhbFk6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5EcmFnUHJveHkpO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBoZWFkZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5IZWFkZXIpO1xyXG4gICAgICAgIGNvbnN0IHRhYnNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGFic0VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLlRhYnMpO1xyXG4gICAgICAgIGNvbnN0IHRhYkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICB0YWJFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5UYWIpO1xyXG4gICAgICAgIGNvbnN0IHRpdGxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgICAgICB0aXRsZUVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLlRpdGxlKTtcclxuICAgICAgICB0YWJFbGVtZW50LmFwcGVuZENoaWxkKHRpdGxlRWxlbWVudCk7XHJcbiAgICAgICAgdGFic0VsZW1lbnQuYXBwZW5kQ2hpbGQodGFiRWxlbWVudCk7XHJcbiAgICAgICAgaGVhZGVyRWxlbWVudC5hcHBlbmRDaGlsZCh0YWJzRWxlbWVudCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3Byb3h5Q29udGFpbmVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHRoaXMuX3Byb3h5Q29udGFpbmVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuQ29udGVudCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQoaGVhZGVyRWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9wcm94eUNvbnRhaW5lckVsZW1lbnQpO1xyXG5cclxuICAgICAgICBjb25zdCBzaWRlID0gdGhpcy5fY29tcG9uZW50SXRlbS5oZWFkZXJDb25maWc/LnNob3c7XHJcbiAgICAgICAgaWYgKHNpZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2lkZWQgPSBbU2lkZS5yaWdodCwgU2lkZS5sZWZ0XS5pbmNsdWRlcyhzaWRlKTtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsbV8nICsgc2lkZSk7XHJcbiAgICAgICAgICAgIGlmIChbU2lkZS5yaWdodCwgU2lkZS5ib3R0b21dLmluZGV4T2Yoc2lkZSkgPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcHJveHlDb250YWluZXJFbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBoZWFkZXJFbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmxlZnQgPSBudW1iZXJUb1BpeGVscyhpbml0aWFsWCk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS50b3AgPSBudW1iZXJUb1BpeGVscyhpbml0aWFsWSk7XHJcbiAgICAgICAgdGFiRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgdGhpcy5fY29tcG9uZW50SXRlbS50aXRsZSk7XHJcbiAgICAgICAgdGl0bGVFbGVtZW50Lmluc2VydEFkamFjZW50VGV4dCgnYWZ0ZXJiZWdpbicsIHRoaXMuX2NvbXBvbmVudEl0ZW0udGl0bGUpO1xyXG4gICAgICAgIHRoaXMuX3Byb3h5Q29udGFpbmVyRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9jb21wb25lbnRJdGVtLmVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgb24gZXZlcnkgbW91c2VNb3ZlIGV2ZW50IGR1cmluZyBhIGRyYWcuIERldGVybWluZXMgaWYgdGhlIGRyYWcgaXNcclxuICAgICAqIHN0aWxsIHdpdGhpbiB0aGUgdmFsaWQgZHJhZyBhcmVhIGFuZCBjYWxscyB0aGUgbGF5b3V0TWFuYWdlciB0byBoaWdobGlnaHQgdGhlXHJcbiAgICAgKiBjdXJyZW50IGRyb3AgYXJlYVxyXG4gICAgICpcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBkcmFnKHg6IG51bWJlciwgeTogbnVtYmVyKTogQ29udGVudEl0ZW0uQXJlYSB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IGFyZWEgPSB0aGlzLnNldERyb3BQb3NpdGlvbih4LCB5KTtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRJdGVtLmRyYWcoKTtcclxuICAgICAgICByZXR1cm4gYXJlYTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHRhcmdldCBwb3NpdGlvblxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB4IC0gVGhlIHggcG9zaXRpb24gaW4gcHhcclxuICAgICAqIEBwYXJhbSB5IC0gVGhlIHkgcG9zaXRpb24gaW4gcHhcclxuICAgICAqXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzZXREcm9wUG9zaXRpb24oeDogbnVtYmVyLCB5OiBudW1iZXIpOiBDb250ZW50SXRlbS5BcmVhIHwgbnVsbCB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5sZWZ0ID0gbnVtYmVyVG9QaXhlbHMoeCk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS50b3AgPSBudW1iZXJUb1BpeGVscyh5KTtcclxuXHJcbiAgICAgICAgY29uc3QgYXJlYSA9IHRoaXMubGF5b3V0TWFuYWdlci5nZXRBcmVhKHgsIHkpO1xyXG5cclxuICAgICAgICAvLyBJZiB3ZSBoYXZlIG5vIG1hdGNoaW5nIGFyZWEsIHJldHVybiB0aGUgbGFzdCBhcmVhIGluc3RlYWQgKHVubGVzcyB3ZSBhcmUgb3V0IG9mIGJvdW5kcyBvZiB0aGUgZ3JvdW5kIGl0ZW0pLlxyXG4gICAgICAgIC8vIEF2b2lkcyBpc3N1ZXMgd2l0aCBzcGxpdHRlcnMgd2hpY2ggZG9uJ3QgaGF2ZSBhbiBhcmVhIHRoZW1zZWx2ZXMuXHJcbiAgICAgICAgaWYgKGFyZWEgIT09IG51bGwgfHwgeCA8IHRoaXMuX2dyb3VuZEFyZWEueDEgfHwgeCA+PSB0aGlzLl9ncm91bmRBcmVhLngyIHx8IHkgPCB0aGlzLl9ncm91bmRBcmVhLnkxIHx8IHkgPj0gdGhpcy5fZ3JvdW5kQXJlYS55Mikge1xyXG4gICAgICAgICAgICB0aGlzLl9sYXN0QXJlYSA9IGFyZWE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdEFyZWE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayB3aGVuIHRoZSBkcmFnIGhhcyBmaW5pc2hlZC4gRGV0ZXJtaW5lcyB0aGUgZHJvcCBhcmVhXHJcbiAgICAgKiBhbmQgYWRkcyB0aGUgY2hpbGQgdG8gaXRcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBkcm9wKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudEl0ZW0uZXhpdERyYWdNb2RlKCk7XHJcblxyXG4gICAgICAgIGxldCBhcmVhOiBDb250ZW50SXRlbS5BcmVhIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgbGV0IGRyb3BwZWRDb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuX2FjdGlvbi5jdXJyZW50VGFyZ2V0O1xyXG4gICAgICAgIGlmICh0YXJnZXQ/Lm93bmVyID09PSB0aGlzLl9hY3Rpb24pIHtcclxuICAgICAgICAgICAgYXJlYSA9IHRhcmdldC5hcmVhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLypcclxuICAgICAgICAqIFZhbGlkIGRyb3AgYXJlYSBmb3VuZFxyXG4gICAgICAgICovXHJcbiAgICAgICAgaWYgKGFyZWEgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgZHJvcHBlZENvbXBvbmVudEl0ZW0gPSB0aGlzLl9jb21wb25lbnRJdGVtO1xyXG4gICAgICAgICAgICBjb25zdCBuZXdQYXJlbnRDb250ZW50SXRlbSA9IGFyZWEuY29udGVudEl0ZW07XHJcbiAgICAgICAgICAgIG5ld1BhcmVudENvbnRlbnRJdGVtLm9uRHJvcChkcm9wcGVkQ29tcG9uZW50SXRlbSwgYXJlYSk7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5mb2N1c1dpbmRvdygpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBObyB2YWxpZCBkcm9wIGFyZWEgZm91bmQgZHVyaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgZHJhZy5cclxuICAgICAgICAgKiBDcmVhdGUgYSBwb3BvdXQuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgPT09IG51bGwgJiYgdGhpcy5fYWN0aW9uLnBhcmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCBpbm5lclNjcmVlbiA9IGdldFdpbmRvd0lubmVyU2NyZWVuUG9zaXRpb24oZ2xvYmFsVGhpcyk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB3aW5kb3cgOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3cgPSB7XHJcbiAgICAgICAgICAgICAgICBsZWZ0OiBpbm5lclNjcmVlbi5sZWZ0ICsgdGhpcy5lbGVtZW50Lm9mZnNldExlZnQsXHJcbiAgICAgICAgICAgICAgICB0b3A6IGlubmVyU2NyZWVuLnRvcCArIHRoaXMuZWxlbWVudC5vZmZzZXRUb3AsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy5fb3JpZ2luYWxTaXplLndpZHRoLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLl9vcmlnaW5hbFNpemUuaGVpZ2h0XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5jcmVhdGVQb3BvdXRGcm9tQ29udGVudEl0ZW0odGhpcy5fY29tcG9uZW50SXRlbSwgd2luZG93LCBnZXRVbmlxdWVJZCgpLCB0aGlzLl9kb2NrUG9pbnQpO1xyXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRJdGVtLmRlc3Ryb3koKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRyYWcgZGlkbid0IHVsdGltYXRlbHkgZW5kIHVwIHdpdGggYWRkaW5nIHRoZSBjb250ZW50IGl0ZW0gdG9cclxuICAgICAgICAgKiBhbnkgY29udGFpbmVyLiBJbiBvcmRlciB0byBlbnN1cmUgY2xlYW4gdXAgaGFwcGVucywgZGVzdHJveSB0aGVcclxuICAgICAgICAgKiBjb250ZW50IGl0ZW0uXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5kZXN0cm95KCk7IC8vIGNvbnRlbnRJdGVtIGNoaWxkcmVuIGFyZSBub3cgZGVzdHJveWVkIGFzIHdlbGxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5lbWl0KCdpdGVtRHJvcHBlZCcsIHRoaXMuX2NvbXBvbmVudEl0ZW0pO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fY29tcG9uZW50SXRlbUZvY3VzZWQpIHtcclxuICAgICAgICAgICAgZHJvcHBlZENvbXBvbmVudEl0ZW0/LmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgRHJhZyBQcm94eSdzIGRpbWVuc2lvbnNcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNldERpbWVuc2lvbnMoKSB7XHJcbiAgICAgICAgY29uc3QgZGltZW5zaW9ucyA9IHRoaXMubGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuZGltZW5zaW9ucztcclxuICAgICAgICBpZiAoZGltZW5zaW9ucyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRHJhZ1Byb3h5LnNldERpbWVuc2lvbnM6IGRpbWVuc2lvbnMgdW5kZWZpbmVkJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgd2lkdGggPSBkaW1lbnNpb25zLmRyYWdQcm94eVdpZHRoO1xyXG4gICAgICAgIGxldCBoZWlnaHQgPSBkaW1lbnNpb25zLmRyYWdQcm94eUhlaWdodDtcclxuICAgICAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZCB8fCBoZWlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RyYWdQcm94eS5zZXREaW1lbnNpb25zOiB3aWR0aCBhbmQvb3IgaGVpZ2h0IHVuZGVmaW5lZCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fb3V0ZXJXaWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuX291dGVySGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgICAgIGNvbnN0IGhlYWRlckhlaWdodCA9IHRoaXMubGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuaGVhZGVyLnNob3cgPT09IGZhbHNlID8gMCA6IGRpbWVuc2lvbnMuaGVhZGVySGVpZ2h0O1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUud2lkdGggPSBudW1iZXJUb1BpeGVscyh3aWR0aCk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBudW1iZXJUb1BpeGVscyhoZWlnaHQpXHJcbiAgICAgICAgd2lkdGggLT0gKHRoaXMuX3NpZGVkID8gaGVhZGVySGVpZ2h0IDogMCk7XHJcbiAgICAgICAgaGVpZ2h0IC09ICghdGhpcy5fc2lkZWQgPyBoZWFkZXJIZWlnaHQgOiAwKTtcclxuICAgICAgICB0aGlzLl9wcm94eUNvbnRhaW5lckVsZW1lbnQuc3R5bGUud2lkdGggPSBudW1iZXJUb1BpeGVscyh3aWR0aCk7XHJcbiAgICAgICAgdGhpcy5fcHJveHlDb250YWluZXJFbGVtZW50LnN0eWxlLmhlaWdodCA9IG51bWJlclRvUGl4ZWxzKGhlaWdodCk7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5lbnRlckRyYWdNb2RlKHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudEl0ZW0uc2hvdygpO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudEl0ZW1Db25maWcgYXMgQ29uZmlnQ29tcG9uZW50SXRlbUNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9jb25maWcnOyAvLyByZW1vdmUgYWxpYXMgaW4gdmVyc2lvbiAzXHJcbmltcG9ydCB7IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnIH0gZnJvbSBcIi4uL2NvbmZpZy9yZXNvbHZlZC1jb25maWdcIjtcclxuaW1wb3J0IHsgVW5leHBlY3RlZE51bGxFcnJvciwgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4uL2l0ZW1zL2NvbXBvbmVudC1pdGVtJztcclxuaW1wb3J0IHsgR3JvdW5kSXRlbSB9IGZyb20gJy4uL2l0ZW1zL2dyb3VuZC1pdGVtJztcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRHJhZ0xpc3RlbmVyIH0gZnJvbSAnLi4vdXRpbHMvZHJhZy1saXN0ZW5lcic7XHJcbmltcG9ydCB7IEpzb25WYWx1ZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHsgRHJhZ0FjdGlvbiB9IGZyb20gJy4vZHJhZy1hY3Rpb24nO1xyXG5cclxuLyoqXHJcbiAqIEFsbG93cyBmb3IgYW55IERPTSBpdGVtIHRvIGNyZWF0ZSBhIGNvbXBvbmVudCBvbiBkcmFnXHJcbiAqIHN0YXJ0IHRvIGJlIGRyYWdnZWQgaW50byB0aGUgTGF5b3V0XHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBjbGFzcyBEcmFnU291cmNlIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2RyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyIHwgbnVsbDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2R1bW15R3JvdW5kQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2R1bW15R3JvdW5kQ29udGVudEl0ZW06IEdyb3VuZEl0ZW07XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2xheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXIsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxFbGVtZW50LFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9leHRyYUFsbG93YWJsZUNoaWxkVGFyZ2V0czogSFRNTEVsZW1lbnRbXSxcclxuICAgICAgICAvKiogQGludGVybmFsIEBkZXByZWNhdGVkIHJlcGxhY2Ugd2l0aCBjb21wb25lbnRJdGVtQ29uZmlnT3JGdG4gaW4gdmVyc2lvbiAzICovXHJcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50VHlwZU9yRnRuOiBKc29uVmFsdWUgfCAoKCkgPT4gKERyYWdTb3VyY2UuQ29tcG9uZW50SXRlbUNvbmZpZyB8IENvbmZpZ0NvbXBvbmVudEl0ZW1Db25maWcpKSxcclxuICAgICAgICAvKiogQGludGVybmFsIEBkZXByZWNhdGVkIHJlbW92ZSBpbiB2ZXJzaW9uIDMgKi9cclxuICAgICAgICBwcml2YXRlIF9jb21wb25lbnRTdGF0ZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgQGRlcHJlY2F0ZWQgcmVtb3ZlIGluIHZlcnNpb24gMyAqL1xyXG4gICAgICAgIHByaXZhdGUgX3RpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCByZW1vdmUgaW4gdmVyc2lvbiAzICovXHJcbiAgICAgICAgcHJpdmF0ZSBfaWQ6IHN0cmluZyB8IHVuZGVmaW5lZFxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5fZHJhZ0xpc3RlbmVyID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5fZHVtbXlHcm91bmRDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHJcbiAgICAgICAgY29uc3QgZHVtbXlSb290SXRlbUNvbmZpZyA9IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLmNyZWF0ZURlZmF1bHQoJ3JvdycpO1xyXG4gICAgICAgIHRoaXMuX2R1bW15R3JvdW5kQ29udGVudEl0ZW0gPSBuZXcgR3JvdW5kSXRlbSh0aGlzLl9sYXlvdXRNYW5hZ2VyLCBkdW1teVJvb3RJdGVtQ29uZmlnLCB0aGlzLl9kdW1teUdyb3VuZENvbnRhaW5lcik7XHJcblxyXG4gICAgICAgIHRoaXMuY3JlYXRlRHJhZ0xpc3RlbmVyKCk7XHJcbiAgICB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERpc3Bvc2VzIG9mIHRoZSBkcmFnIGxpc3RlbmVycyBzbyB0aGUgZHJhZyBzb3VyY2UgaXMgbm90IHVzYWJsZSBhbnkgbW9yZS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG5cdCAqL1xyXG5cdGRlc3Ryb3koKTogdm9pZCB7XHJcblx0XHR0aGlzLnJlbW92ZURyYWdMaXN0ZW5lcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGluaXRpYWxseSBhbmQgYWZ0ZXIgZXZlcnkgZHJhZ1xyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlRHJhZ0xpc3RlbmVyKCkge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlRHJhZ0xpc3RlbmVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lciA9IG5ldyBEcmFnTGlzdGVuZXIodGhpcy5fZWxlbWVudCwgdGhpcy5fZXh0cmFBbGxvd2FibGVDaGlsZFRhcmdldHMpO1xyXG4gICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lci5vbignZHJhZ1N0YXJ0JywgKHgsIHkpID0+IHRoaXMub25EcmFnU3RhcnQoeCwgeSkpO1xyXG4gICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lci5vbignZHJhZ1N0b3AnLCAoKSA9PiB0aGlzLm9uRHJhZ1N0b3AoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayBmb3IgdGhlIERyYWdMaXN0ZW5lcidzIGRyYWdTdGFydCBldmVudFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB4IC0gVGhlIHggcG9zaXRpb24gb2YgdGhlIG1vdXNlIG9uIGRyYWdTdGFydFxyXG4gICAgICogQHBhcmFtIHkgLSBUaGUgeCBwb3NpdGlvbiBvZiB0aGUgbW91c2Ugb24gZHJhZ1N0YXJ0XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvbkRyYWdTdGFydCh4OiBudW1iZXIsIHk6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IHR5cGUgPSAnY29tcG9uZW50JztcclxuICAgICAgICBsZXQgZHJhZ1NvdXJjZUl0ZW1Db25maWc6IENvbmZpZ0NvbXBvbmVudEl0ZW1Db25maWc7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fY29tcG9uZW50VHlwZU9yRnRuID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgY29uc3QgZnRuRHJhZ1NvdXJjZUl0ZW1Db25maWcgPSB0aGlzLl9jb21wb25lbnRUeXBlT3JGdG4oKSBhcyAoRHJhZ1NvdXJjZS5Db21wb25lbnRJdGVtQ29uZmlnIHwgQ29uZmlnQ29tcG9uZW50SXRlbUNvbmZpZyk7XHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBjb21wb25lbnRUeXBlIHByb3BlcnR5IGV4aXN0cywgdGhlbiBpdCBpcyBhbHJlYWR5IGEgQ29tcG9uZW50SXRlbUNvbmZpZyBzbyBub3RoaW5nIHRvIGRvXHJcbiAgICAgICAgICAgIGlmIChEcmFnU291cmNlLmlzRHJhZ1NvdXJjZUNvbXBvbmVudEl0ZW1Db25maWcoZnRuRHJhZ1NvdXJjZUl0ZW1Db25maWcpKSB7XHJcbiAgICAgICAgICAgICAgICBkcmFnU291cmNlSXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgICAgICAgICB0eXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlOiBmdG5EcmFnU291cmNlSXRlbUNvbmZpZy5zdGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUeXBlOiBmdG5EcmFnU291cmNlSXRlbUNvbmZpZy50eXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBmdG5EcmFnU291cmNlSXRlbUNvbmZpZy50aXRsZSA/PyB0aGlzLl90aXRsZSxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkcmFnU291cmNlSXRlbUNvbmZpZyA9IGZ0bkRyYWdTb3VyY2VJdGVtQ29uZmlnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZHJhZ1NvdXJjZUl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICB0eXBlLFxyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50U3RhdGU6IHRoaXMuX2NvbXBvbmVudFN0YXRlLFxyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50VHlwZTogdGhpcy5fY29tcG9uZW50VHlwZU9yRnRuLFxyXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuX3RpdGxlLFxyXG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuX2lkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgZHVtbXkgQ29udGVudEl0ZW0gb25seSBmb3IgZHJhZyBwdXJwb3Nlc1xyXG4gICAgICAgIC8vIEFsbCBDb250ZW50SXRlbXMgKGV4Y2VwdCBmb3IgR3JvdW5kSXRlbSkgbmVlZCBhIHBhcmVudC4gIFdoZW4gZHJhZ2dpbmcsIHRoZSBwYXJlbnQgaXMgbm90IHVzZWQuXHJcbiAgICAgICAgLy8gSW5zdGVhZCBvZiBhbGxvd2luZyBudWxsIHBhcmVudHMgKGFzIEphdmFzY3JpcHQgdmVyc2lvbiBkaWQpLCB1c2UgYSB0ZW1wb3JhcnkgZHVtbXkgR3JvdW5kSXRlbSBwYXJlbnQgYW5kIGFkZCBDb250ZW50SXRlbSB0byB0aGF0XHJcbiAgICAgICAgLy8gSWYgdGhpcyBkb2VzIG5vdCB3b3JrLCBuZWVkIHRvIGNyZWF0ZSBhbHRlcm5hdGl2ZSBHcm91bmRJdGVtIGNsYXNzXHJcblxyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkSXRlbUNvbmZpZyA9IENvbmZpZ0NvbXBvbmVudEl0ZW1Db25maWcucmVzb2x2ZShkcmFnU291cmNlSXRlbUNvbmZpZywgZmFsc2UpO1xyXG5cclxuICAgICAgICBjb25zdCBjb21wb25lbnRJdGVtID0gbmV3IENvbXBvbmVudEl0ZW0odGhpcy5fbGF5b3V0TWFuYWdlciwgcmVzb2x2ZWRJdGVtQ29uZmlnLCB0aGlzLl9kdW1teUdyb3VuZENvbnRlbnRJdGVtKVxyXG4gICAgICAgIHRoaXMuX2R1bW15R3JvdW5kQ29udGVudEl0ZW0uY29udGVudEl0ZW1zLnB1c2goY29tcG9uZW50SXRlbSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9kcmFnTGlzdGVuZXIgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0RTT0RTRDY2NzQ2Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgYWN0aW9uID0gRHJhZ0FjdGlvbi5zdGFydCh0aGlzLl9sYXlvdXRNYW5hZ2VyLCB0aGlzLl9kcmFnTGlzdGVuZXIsIGNvbXBvbmVudEl0ZW0sIHgsIHksIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zaXRpb25JbmRpY2F0b3IgPSB0aGlzLl9sYXlvdXRNYW5hZ2VyLnRyYW5zaXRpb25JbmRpY2F0b3I7XHJcbiAgICAgICAgICAgIGlmICh0cmFuc2l0aW9uSW5kaWNhdG9yID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignRFNPRFNUNjY3NDYnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByb3h5RWxlbWVudCA9IGFjdGlvbi5wcm94eT8uZWxlbWVudDtcclxuICAgICAgICAgICAgICAgIGlmIChwcm94eUVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0RTT0RTVDY2NzQ3Jyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbkluZGljYXRvci50cmFuc2l0aW9uRWxlbWVudHModGhpcy5fZWxlbWVudCwgcHJveHlFbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIG9uRHJhZ1N0b3AoKSB7XHJcbiAgICAgICAgLy8gaWYgKHRoaXMuX2R1bW15R3JvdW5kQ29udGVudEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIC8vICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdEU09EU0RSVTA4MTE2Jyk7XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgdGhpcy5fZHVtbXlHcm91bmRDb250ZW50SXRlbS5fJGRlc3Ryb3lcclxuICAgICAgICAvLyAgICAgdGhpcy5fZHVtbXlHcm91bmRDb250ZW50SXRlbSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgdGhpcy5jcmVhdGVEcmFnTGlzdGVuZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuXHQgKiBDYWxsZWQgYWZ0ZXIgZXZlcnkgZHJhZyBhbmQgd2hlbiB0aGUgZHJhZyBzb3VyY2UgaXMgYmVpbmcgZGlzcG9zZWQgb2YuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuXHQgKi9cclxuXHRwcml2YXRlIHJlbW92ZURyYWdMaXN0ZW5lcigpIHtcclxuXHRcdGlmICh0aGlzLl9kcmFnTGlzdGVuZXIgIT09IG51bGwgKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lci5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lciA9IG51bGw7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIERyYWdTb3VyY2Uge1xyXG4gICAgLyoqIEBkZXByZWNhdGVkICB1c2UgQ29uZmlnIHtAbGluayAoQ29tcG9uZW50SXRlbUNvbmZpZzppbnRlcmZhY2UpfSAqL1xyXG4gICAgZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRJdGVtQ29uZmlnIHtcclxuICAgICAgICB0eXBlOiBKc29uVmFsdWUsXHJcbiAgICAgICAgc3RhdGU/OiBKc29uVmFsdWUsXHJcbiAgICAgICAgdGl0bGU/OiBzdHJpbmcsXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBkZXByZWNhdGVkIHJlbW92ZSBpbiB2ZXJzaW9uIDMgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0RyYWdTb3VyY2VDb21wb25lbnRJdGVtQ29uZmlnKFxyXG4gICAgICAgIGNvbmZpZzogRHJhZ1NvdXJjZS5Db21wb25lbnRJdGVtQ29uZmlnIHwgQ29uZmlnQ29tcG9uZW50SXRlbUNvbmZpZ1xyXG4gICAgKTogY29uZmlnIGlzIERyYWdTb3VyY2UuQ29tcG9uZW50SXRlbUNvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuICEoXCJjb21wb25lbnRUeXBlXCIgaW4gY29uZmlnKTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuLi91dGlscy9kb20tY29uc3RhbnRzJztcclxuaW1wb3J0IHsgQXJlYUxpbmtlZFJlY3QgfSBmcm9tICcuLi91dGlscy90eXBlcyc7XHJcbmltcG9ydCB7IG51bWJlclRvUGl4ZWxzIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgY2xhc3MgRHJvcFRhcmdldEluZGljYXRvciB7XHJcbiAgICBwcml2YXRlIF9lbGVtZW50OiBIVE1MRWxlbWVudDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICAvLyBNYXliZSB1c2UgY29udGFpbmVyIGluc3RlYWQgb2YgRG9jdW1lbnQgQm9keT9cclxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuRHJvcFRhcmdldEluZGljYXRvcik7XHJcbiAgICAgICAgY29uc3QgaW5uZXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgaW5uZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Jbm5lcik7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZChpbm5lckVsZW1lbnQpO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBoaWdobGlnaHRBcmVhKGFyZWE6IEFyZWFMaW5rZWRSZWN0LCBtYXJnaW46IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUubGVmdCA9IG51bWJlclRvUGl4ZWxzKGFyZWEueDEgKyBtYXJnaW4pO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUudG9wID0gbnVtYmVyVG9QaXhlbHMoYXJlYS55MSArIG1hcmdpbik7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS53aWR0aCA9IG51bWJlclRvUGl4ZWxzKGFyZWEueDIgLSBhcmVhLngxIC0gbWFyZ2luIC0gMSk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBudW1iZXJUb1BpeGVscyhhcmVhLnkyIC0gYXJlYS55MSAtIG1hcmdpbiAtIDEpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcclxuICAgIH1cclxuXHJcbiAgICBoaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IEhlYWRlciB9IGZyb20gJy4vaGVhZGVyJztcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIEhlYWRlckJ1dHRvbiB7XHJcbiAgICBwcml2YXRlIF9lbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgX2NsaWNrRXZlbnRMaXN0ZW5lciA9IChldjogTW91c2VFdmVudCkgPT4gdGhpcy5vbkNsaWNrKGV2KTtcclxuICAgIHByaXZhdGUgX3RvdWNoU3RhcnRFdmVudExpc3RlbmVyID0gKGV2OiBUb3VjaEV2ZW50KSA9PiB0aGlzLm9uVG91Y2hTdGFydChldik7XHJcblxyXG4gICAgZ2V0IGVsZW1lbnQoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdGhpcy5fZWxlbWVudDsgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2hlYWRlcjogSGVhZGVyLCBsYWJlbDogc3RyaW5nLCBjc3NDbGFzczogc3RyaW5nLCBwcml2YXRlIF9wdXNoRXZlbnQ6IEhlYWRlckJ1dHRvbi5QdXNoRXZlbnQpIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNzc0NsYXNzKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnRpdGxlID0gbGFiZWw7XHJcbiAgICAgICAgdGhpcy5faGVhZGVyLm9uKCdkZXN0cm95JywgKCkgPT4gdGhpcy5kZXN0cm95KCkpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9jbGlja0V2ZW50TGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl90b3VjaFN0YXJ0RXZlbnRMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgIHRoaXMuX2hlYWRlci5jb250cm9sc0NvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fZWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fY2xpY2tFdmVudExpc3RlbmVyKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl90b3VjaFN0YXJ0RXZlbnRMaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZCh0aGlzLl9lbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uQ2xpY2soZXY6IE1vdXNlRXZlbnQpIHtcclxuICAgICAgICB0aGlzLl9wdXNoRXZlbnQoZXYpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Ub3VjaFN0YXJ0KGV2OiBUb3VjaEV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5fcHVzaEV2ZW50KGV2KTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIEhlYWRlckJ1dHRvbiB7XHJcbiAgICBleHBvcnQgdHlwZSBQdXNoRXZlbnQgPSAodGhpczogdm9pZCwgZXY6IEV2ZW50KSA9PiB2b2lkO1xyXG59XHJcbiIsImltcG9ydCB7IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9jb21wb25lbnQtaXRlbSc7XHJcbmltcG9ydCB7IFN0YWNrIH0gZnJvbSAnLi4vaXRlbXMvc3RhY2snO1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi4vbGF5b3V0LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuLi91dGlscy9kb20tY29uc3RhbnRzJztcclxuaW1wb3J0IHsgRHJhZ0xpc3RlbmVyIH0gZnJvbSAnLi4vdXRpbHMvZHJhZy1saXN0ZW5lcic7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LWVtaXR0ZXInO1xyXG5pbXBvcnQgeyBTaWRlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQgeyBudW1iZXJUb1BpeGVscywgc2V0RWxlbWVudERpc3BsYXlWaXNpYmlsaXR5IH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5pbXBvcnQgeyBIZWFkZXJCdXR0b24gfSBmcm9tICcuL2hlYWRlci1idXR0b24nO1xyXG5pbXBvcnQgeyBUYWIgfSBmcm9tICcuL3RhYic7XHJcbmltcG9ydCB7IFRhYnNDb250YWluZXIgfSBmcm9tICcuL3RhYnMtY29udGFpbmVyJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBoZWFkZXIgYWJvdmUgYSBTdGFjayBDb250ZW50SXRlbS5cclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEhlYWRlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90YWJzQ29udGFpbmVyOiBUYWJzQ29udGFpbmVyO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250cm9sc0NvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3Nob3c6IGJvb2xlYW47XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9wb3BvdXRMYWJlbDogc3RyaW5nO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbWF4aW1pc2VMYWJlbDogc3RyaW5nO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbWluaW1pc2VMYWJlbDogc3RyaW5nO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2xvc2VMYWJlbDogc3RyaW5nO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFiRHJvcGRvd25FbmFibGVkOiBib29sZWFuO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFiRHJvcGRvd25MYWJlbDogc3RyaW5nO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYkNvbnRyb2xPZmZzZXQ6IG51bWJlcjtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jbGlja0xpc3RlbmVyID0gKGV2OiBNb3VzZUV2ZW50KSA9PiB0aGlzLm9uQ2xpY2soZXYpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdG91Y2hTdGFydExpc3RlbmVyID0gKGV2OiBUb3VjaEV2ZW50KSA9PiB0aGlzLm9uVG91Y2hTdGFydChldik7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kb2N1bWVudE1vdXNlVXBMaXN0ZW5lcjogKHRoaXM6IHZvaWQpID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sYXlvdXRTdGF0ZUxpc3RlbmVyID0gKCkgPT4gdGhpcy5vbkxheW91dENoYW5nZWQoKTtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9zaWRlOiBTaWRlO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfbGVmdFJpZ2h0U2lkZWQ6IGJvb2xlYW47XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jbG9zZUJ1dHRvbjogSGVhZGVyQnV0dG9uO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcG9wb3V0QnV0dG9uOiBIZWFkZXJCdXR0b247XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90YWJEcm9wZG93bkJ1dHRvbjogSGVhZGVyQnV0dG9uO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbWF4aW1pc2VCdXR0b246IEhlYWRlckJ1dHRvbjtcclxuICAgIC8vIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIC8vIHByaXZhdGUgX2FjdGl2ZUNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0gfCBudWxsID0gbnVsbDsgLy8gb25seSB1c2VkIHRvIGlkZW50aWZ5IGFjdGl2ZSB0YWJcclxuXHJcbiAgICBnZXQgc2hvdygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3Nob3c7IH1cclxuICAgIGdldCBzaWRlKCk6IFNpZGUgeyByZXR1cm4gdGhpcy5fc2lkZTsgfVxyXG4gICAgZ2V0IGxlZnRSaWdodFNpZGVkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fbGVmdFJpZ2h0U2lkZWQ7IH1cclxuXHJcbiAgICBnZXQgbGF5b3V0TWFuYWdlcigpOiBMYXlvdXRNYW5hZ2VyIHsgcmV0dXJuIHRoaXMuX2xheW91dE1hbmFnZXI7IH1cclxuICAgIGdldCBwYXJlbnQoKTogU3RhY2sgeyByZXR1cm4gdGhpcy5fcGFyZW50OyB9XHJcbiAgICBnZXQgdGFicygpOiBUYWJbXSB7IHJldHVybiB0aGlzLl90YWJzQ29udGFpbmVyLnRhYnM7IH1cclxuICAgIGdldCBsYXN0VmlzaWJsZVRhYkluZGV4KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl90YWJzQ29udGFpbmVyLmxhc3RWaXNpYmxlVGFiSW5kZXg7IH1cclxuXHJcbiAgICBnZXQgZWxlbWVudCgpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLl9lbGVtZW50OyB9XHJcbiAgICBnZXQgdGFic0NvbnRhaW5lckVsZW1lbnQoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdGhpcy5fdGFic0NvbnRhaW5lci5lbGVtZW50OyB9XHJcbiAgICBnZXQgY29udHJvbHNDb250YWluZXJFbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2NvbnRyb2xzQ29udGFpbmVyRWxlbWVudDsgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9sYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9wYXJlbnQ6IFN0YWNrLFxyXG4gICAgICAgIHNldHRpbmdzOiBIZWFkZXIuU2V0dGluZ3MsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2dldEFjdGl2ZUNvbXBvbmVudEl0ZW1FdmVudDogSGVhZGVyLkdldEFjdGl2ZUNvbXBvbmVudEl0ZW1FdmVudCxcclxuICAgICAgICBjbG9zZUV2ZW50OiBIZWFkZXIuQ2xvc2VFdmVudCxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfcG9wb3V0RXZlbnQ6IEhlYWRlci5Qb3BvdXRFdmVudCB8IHVuZGVmaW5lZCxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfbWF4aW1pc2VUb2dnbGVFdmVudDogSGVhZGVyLk1heGltaXNlVG9nZ2xlRXZlbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2NsaWNrRXZlbnQ6IEhlYWRlci5DbGlja0V2ZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF90b3VjaFN0YXJ0RXZlbnQ6IEhlYWRlci5Ub3VjaFN0YXJ0RXZlbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2NvbXBvbmVudFJlbW92ZUV2ZW50OiBIZWFkZXIuQ29tcG9uZW50UmVtb3ZlRXZlbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2NvbXBvbmVudEZvY3VzRXZlbnQ6IEhlYWRlci5Db21wb25lbnRGb2N1c0V2ZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9jb21wb25lbnREcmFnU3RhcnRFdmVudDogSGVhZGVyLkNvbXBvbmVudERyYWdTdGFydEV2ZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdGFic0NvbnRhaW5lciA9IG5ldyBUYWJzQ29udGFpbmVyKHRoaXMuX2xheW91dE1hbmFnZXIsXHJcbiAgICAgICAgICAgIChpdGVtKSA9PiB0aGlzLmhhbmRsZVRhYkluaXRpYXRlZENvbXBvbmVudFJlbW92ZUV2ZW50KGl0ZW0pLFxyXG4gICAgICAgICAgICAoaXRlbSkgPT4gdGhpcy5oYW5kbGVUYWJJbml0aWF0ZWRDb21wb25lbnRGb2N1c0V2ZW50KGl0ZW0pLFxyXG4gICAgICAgICAgICAoeCwgeSwgZHJhZ0xpc3RlbmVyLCBpdGVtKSA9PiB0aGlzLmhhbmRsZVRhYkluaXRpYXRlZERyYWdTdGFydEV2ZW50KHgsIHksIGRyYWdMaXN0ZW5lciwgaXRlbSksXHJcbiAgICAgICAgICAgICgpID0+IHRoaXMucHJvY2Vzc1RhYkRyb3Bkb3duQWN0aXZlQ2hhbmdlZCgpLFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMuX3Nob3cgPSBzZXR0aW5ncy5zaG93O1xyXG4gICAgICAgIHRoaXMuX3BvcG91dExhYmVsID0gc2V0dGluZ3MucG9wb3V0TGFiZWw7XHJcbiAgICAgICAgdGhpcy5fbWF4aW1pc2VMYWJlbCA9IHNldHRpbmdzLm1heGltaXNlTGFiZWw7XHJcbiAgICAgICAgdGhpcy5fbWluaW1pc2VMYWJlbCA9IHNldHRpbmdzLm1pbmltaXNlTGFiZWw7XHJcbiAgICAgICAgdGhpcy5fY2xvc2VMYWJlbCA9IHNldHRpbmdzLmNsb3NlTGFiZWw7XHJcbiAgICAgICAgdGhpcy5fdGFiRHJvcGRvd25FbmFibGVkID0gc2V0dGluZ3MudGFiRHJvcGRvd25FbmFibGVkO1xyXG4gICAgICAgIHRoaXMuX3RhYkRyb3Bkb3duTGFiZWwgPSBzZXR0aW5ncy50YWJEcm9wZG93bkxhYmVsO1xyXG4gICAgICAgIHRoaXMuc2V0U2lkZShzZXR0aW5ncy5zaWRlKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlY3Rpb24nKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5IZWFkZXIpO1xyXG4gICAgICAgIHRoaXMuX2NvbnRyb2xzQ29udGFpbmVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlY3Rpb24nKTtcclxuICAgICAgICB0aGlzLl9jb250cm9sc0NvbnRhaW5lckVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkNvbnRyb2xzKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3RhYnNDb250YWluZXIuZWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9jb250cm9sc0NvbnRhaW5lckVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fdGFic0NvbnRhaW5lci5kcm9wZG93bkVsZW1lbnQpO1xyXG5cclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fY2xpY2tMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX3RvdWNoU3RhcnRMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl9kb2N1bWVudE1vdXNlVXBMaXN0ZW5lciA9ICgpID0+IHRoaXMuX3RhYnNDb250YWluZXIuaGlkZUFkZGl0aW9uYWxUYWJzRHJvcGRvd24oKVxyXG4gICAgICAgIGdsb2JhbFRoaXMuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2RvY3VtZW50TW91c2VVcExpc3RlbmVyLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3RhYkNvbnRyb2xPZmZzZXQgPSB0aGlzLl9sYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5zZXR0aW5ncy50YWJDb250cm9sT2Zmc2V0O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fdGFiRHJvcGRvd25FbmFibGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RhYkRyb3Bkb3duQnV0dG9uID0gbmV3IEhlYWRlckJ1dHRvbih0aGlzLCB0aGlzLl90YWJEcm9wZG93bkxhYmVsLCBEb21Db25zdGFudHMuQ2xhc3NOYW1lLlRhYkRyb3Bkb3duLFxyXG4gICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5fdGFic0NvbnRhaW5lci5zaG93QWRkaXRpb25hbFRhYnNEcm9wZG93bigpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wb3BvdXRCdXR0b24gPSBuZXcgSGVhZGVyQnV0dG9uKHRoaXMsIHRoaXMuX3BvcG91dExhYmVsLCBEb21Db25zdGFudHMuQ2xhc3NOYW1lLlBvcG91dCwgKCkgPT4gdGhpcy5oYW5kbGVCdXR0b25Qb3BvdXRFdmVudCgpKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogTWF4aW1pc2UgY29udHJvbCAtIHNldCB0aGUgY29tcG9uZW50IHRvIHRoZSBmdWxsIHNpemUgb2YgdGhlIGxheW91dFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX21heGltaXNlQnV0dG9uID0gbmV3IEhlYWRlckJ1dHRvbih0aGlzLCB0aGlzLl9tYXhpbWlzZUxhYmVsLCBEb21Db25zdGFudHMuQ2xhc3NOYW1lLk1heGltaXNlLFxyXG4gICAgICAgICAgICAoZXYpID0+IHRoaXMuaGFuZGxlQnV0dG9uTWF4aW1pc2VUb2dnbGVFdmVudChldilcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDbG9zZSBidXR0b25cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9jbG9zZUJ1dHRvbiA9IG5ldyBIZWFkZXJCdXR0b24odGhpcywgdGhpcy5fY2xvc2VMYWJlbCwgRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5DbG9zZSwgKCkgPT4gY2xvc2VFdmVudCgpKTtcclxuXHJcbiAgICAgICAgdGhpcy5wcm9jZXNzVGFiRHJvcGRvd25BY3RpdmVDaGFuZ2VkKCk7XHJcblxyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKCdzdGF0ZUNoYW5nZWQnLCB0aGlzLl9sYXlvdXRTdGF0ZUxpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoZSBlbnRpcmUgaGVhZGVyXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmVtaXQoJ2Rlc3Ryb3knKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcG9wb3V0RXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fbWF4aW1pc2VUb2dnbGVFdmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl9jbGlja0V2ZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuX3RvdWNoU3RhcnRFdmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRSZW1vdmVFdmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRGb2N1c0V2ZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudERyYWdTdGFydEV2ZW50ID0gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICB0aGlzLl90YWJzQ29udGFpbmVyLmRlc3Ryb3koKTtcclxuXHJcbiAgICAgICAgZ2xvYmFsVGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fZG9jdW1lbnRNb3VzZVVwTGlzdGVuZXIpO1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5yZW1vdmVFdmVudExpc3RlbmVyKCdzdGF0ZUNoYW5nZWQnLCB0aGlzLl9sYXlvdXRTdGF0ZUxpc3RlbmVyKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyB0YWIgYW5kIGFzc29jaWF0ZXMgaXQgd2l0aCBhIGNvbnRlbnRJdGVtXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgcG9zaXRpb24gb2YgdGhlIHRhYlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZVRhYihjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdGFic0NvbnRhaW5lci5jcmVhdGVUYWIoY29tcG9uZW50SXRlbSwgaW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZHMgYSB0YWIgYmFzZWQgb24gdGhlIGNvbnRlbnRJdGVtIGl0cyBhc3NvY2lhdGVkIHdpdGggYW5kIHJlbW92ZXMgaXQuXHJcbiAgICAgKiBDYW5ub3QgcmVtb3ZlIHRhYiBpZiBpdCBoYXMgdGhlIGFjdGl2ZSBDb21wb25lbnRJdGVtXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcmVtb3ZlVGFiKGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl90YWJzQ29udGFpbmVyLnJlbW92ZVRhYihjb21wb25lbnRJdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm9jZXNzQWN0aXZlQ29tcG9uZW50Q2hhbmdlZChuZXdBY3RpdmVDb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdGFic0NvbnRhaW5lci5wcm9jZXNzQWN0aXZlQ29tcG9uZW50Q2hhbmdlZChuZXdBY3RpdmVDb21wb25lbnRJdGVtKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVRhYlNpemVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc2V0U2lkZSh2YWx1ZTogU2lkZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3NpZGUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLl9sZWZ0UmlnaHRTaWRlZCA9IFtTaWRlLnJpZ2h0LCBTaWRlLmxlZnRdLmluY2x1ZGVzKHRoaXMuX3NpZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgaGVhZGVyIGJ1dHRvbnMuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVCdXR0b25zKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGFjdGl2ZUNvbXBvbmVudEl0ZW0gPSB0aGlzLl9nZXRBY3RpdmVDb21wb25lbnRJdGVtRXZlbnQoKTtcclxuICAgICAgICBjb25zdCBpc0xhc3QgPSB0aGlzLl9wYXJlbnQuZmluZEFuY2VzdG9yV2l0aFNpYmxpbmdzKCkgPT09IG51bGw7XHJcbiAgICAgICAgY29uc3QgaXNNYWluID0gdGhpcy5sYXlvdXRNYW5hZ2VyLnBhcmVudCA9PT0gbnVsbDtcclxuICAgICAgICBcclxuICAgICAgICAvLyBDbG9zZSBidXR0b24gaXMgb25seSB2aXNpYmxlIGlmIGFsbCBpdGVtcyBvZiB0aGUgc3RhY2sgYXJlIGNsb3NhYmxlXHJcbiAgICAgICAgLy8gYW5kIHRoZSBhY3RpdmUgY29tcG9uZW50IGhhcyBpdHMgY2xvc2UgYnV0dG9uIHNldCB0byB2aXNpYmxlLiBOb3RlIHRoYXRcclxuICAgICAgICAvLyBoaWRpbmcgdGhlIGNsb3NlIGJ1dHRvbiBpbiBhIGhlYWRlciBvZiBhbiBpdGVtIGlzIG5vdCBlcXVpdmFsZW50IHRvIG1ha2luZ1xyXG4gICAgICAgIC8vIHRoYXQgaXRlbSB1bmNsb3NhYmxlLlxyXG4gICAgICAgIGNvbnN0IGFsbENsb3NhYmxlID0gdGhpcy50YWJzLmV2ZXJ5KHRhYiA9PiB0YWIuY29tcG9uZW50SXRlbS5pc0Nsb3NhYmxlKTtcclxuICAgICAgICBjb25zdCBjbG9zZSA9IGFjdGl2ZUNvbXBvbmVudEl0ZW0/LmhlYWRlckNvbmZpZz8uY2xvc2UgIT09IGZhbHNlO1xyXG4gICAgICAgIHNldEVsZW1lbnREaXNwbGF5VmlzaWJpbGl0eSh0aGlzLl9jbG9zZUJ1dHRvbi5lbGVtZW50LCBhbGxDbG9zYWJsZSAmJiBjbG9zZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gUG9wb3V0IGJ1dHRvbiBpcyB2aXNpYmxlIGlmIHRoZSBhY3RpdmUgY29tcG9uZW50IGlzIGNsb3NhYmxlIGFuZCBoYXMgaXRzIHBvcG91dCBidXR0b24gZW5hYmxlZC5cclxuICAgICAgICAvLyBJZiBwb3BvdXRXaG9sZVN0YWNrID0gdHJ1ZSwgdGhlIGJ1dHRvbiBpcyBvbmx5IHZpc2libGUgaWYgZXZlcnkgaXRlbSBpcyBjbG9zYWJsZS5cclxuICAgICAgICAvLyBBbHNvIHdlIHdhbnQgdG8gcHJldmVudCBwb3BwaW5nIG91dCBpZiB0aGF0IHdvdWxkIGxlYXZlIHVzIHdpdGggYW4gZW1wdHkgbGF5b3V0LlxyXG4gICAgICAgIGxldCBwb3BvdXQgPSBhY3RpdmVDb21wb25lbnRJdGVtPy5oZWFkZXJDb25maWc/LnBvcG91dCAhPT0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuX2xheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLnNldHRpbmdzLnBvcG91dFdob2xlU3RhY2spIHtcclxuICAgICAgICAgICAgcG9wb3V0ICYmPSAoIWlzTGFzdCB8fCBpc01haW4pICYmIGFsbENsb3NhYmxlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsb3NhYmxlID0gYWN0aXZlQ29tcG9uZW50SXRlbT8uaXNDbG9zYWJsZSAhPT0gZmFsc2U7XHJcbiAgICAgICAgICAgIHBvcG91dCAmJj0gKCFpc0xhc3QgfHwgdGhpcy50YWJzLmxlbmd0aCA+IDEgfHwgaXNNYWluKSAmJiBjbG9zYWJsZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0RWxlbWVudERpc3BsYXlWaXNpYmlsaXR5KHRoaXMuX3BvcG91dEJ1dHRvbi5lbGVtZW50LCBwb3BvdXQpO1xyXG5cclxuICAgICAgICAvLyBNYXhpbWl6ZSBidXR0b24gaXMgdmlzaWJsZSBpZiB0aGUgYWN0aXZlIGNvbXBvbmVudCBoYXMgaXRzIG1heGltaXplIGJ1dHRvbiBlbmFibGVkIG9yIHRoZSBzdGFjayBpcyBhbHJlYWR5IG1heGltaXplZC5cclxuICAgICAgICAvLyBBbHNvIGhpZGUgaXQgaWYgc3RhY2sgaXMgdGhlIGxhc3QgaXRlbSBpbiB0aGUgbGF5b3V0LlxyXG4gICAgICAgIGNvbnN0IG1heGltaXplID0gKGFjdGl2ZUNvbXBvbmVudEl0ZW0/LmhlYWRlckNvbmZpZz8ubWF4aW1pc2UgIT09IGZhbHNlIHx8IHRoaXMuX3BhcmVudC5pc01heGltaXNlZCkgJiYgIWlzTGFzdDtcclxuICAgICAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkodGhpcy5fbWF4aW1pc2VCdXR0b24uZWxlbWVudCwgbWF4aW1pemUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGFwcGx5Rm9jdXNlZFZhbHVlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkZvY3VzZWQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShEb21Db25zdGFudHMuQ2xhc3NOYW1lLkZvY3VzZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm9jZXNzTWF4aW1pc2VkKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9tYXhpbWlzZUJ1dHRvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0hQTUFYMTY5OTcnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXhpbWlzZUJ1dHRvbi5lbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCB0aGlzLl9taW5pbWlzZUxhYmVsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJvY2Vzc01pbmltaXNlZCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fbWF4aW1pc2VCdXR0b24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdIUE1JTjE2OTk3Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fbWF4aW1pc2VCdXR0b24uZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgdGhpcy5fbWF4aW1pc2VMYWJlbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHVzaGVzIHRoZSB0YWJzIHRvIHRoZSB0YWIgZHJvcGRvd24gaWYgdGhlIGF2YWlsYWJsZSBzcGFjZSBpcyBub3Qgc3VmZmljaWVudFxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVRhYlNpemVzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl90YWJzQ29udGFpbmVyLnRhYkNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSB0aGlzLl9zaG93ID8gdGhpcy5fbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuZGltZW5zaW9ucy5oZWFkZXJIZWlnaHQgOiAwO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2xlZnRSaWdodFNpZGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmhlaWdodCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS53aWR0aCA9IG51bWJlclRvUGl4ZWxzKGhlYWRlckhlaWdodCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLndpZHRoID0gJyc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmhlaWdodCA9IG51bWJlclRvUGl4ZWxzKGhlYWRlckhlaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGF2YWlsYWJsZVdpZHRoOiBudW1iZXI7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9sZWZ0UmlnaHRTaWRlZCkge1xyXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSB0aGlzLl9lbGVtZW50Lm9mZnNldEhlaWdodCAtIHRoaXMuX2NvbnRyb2xzQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQgLSB0aGlzLl90YWJDb250cm9sT2Zmc2V0O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSB0aGlzLl9lbGVtZW50Lm9mZnNldFdpZHRoIC0gdGhpcy5fY29udHJvbHNDb250YWluZXJFbGVtZW50Lm9mZnNldFdpZHRoIC0gdGhpcy5fdGFiQ29udHJvbE9mZnNldDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fdGFic0NvbnRhaW5lci51cGRhdGVUYWJTaXplcyhhdmFpbGFibGVXaWR0aCwgdGhpcy5fZ2V0QWN0aXZlQ29tcG9uZW50SXRlbUV2ZW50KCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZVRhYkluaXRpYXRlZENvbXBvbmVudFJlbW92ZUV2ZW50KGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICBpZiAodGhpcy5fY29tcG9uZW50UmVtb3ZlRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdISFRDRTIyMjk0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50UmVtb3ZlRXZlbnQoY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlVGFiSW5pdGlhdGVkQ29tcG9uZW50Rm9jdXNFdmVudChjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudEZvY3VzRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdISFRBRTIyMjk0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50Rm9jdXNFdmVudChjb21wb25lbnRJdGVtKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVUYWJJbml0aWF0ZWREcmFnU3RhcnRFdmVudCh4OiBudW1iZXIsIHk6IG51bWJlciwgZHJhZ0xpc3RlbmVyOiBEcmFnTGlzdGVuZXIsIGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICBpZiAodGhpcy5fY29tcG9uZW50RHJhZ1N0YXJ0RXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdISFREU0UyMjI5NCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudERyYWdTdGFydEV2ZW50KHgsIHksIGRyYWdMaXN0ZW5lciwgY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcHJvY2Vzc1RhYkRyb3Bkb3duQWN0aXZlQ2hhbmdlZCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fdGFiRHJvcGRvd25CdXR0b24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkodGhpcy5fdGFiRHJvcGRvd25CdXR0b24uZWxlbWVudCwgdGhpcy5fdGFic0NvbnRhaW5lci5kcm9wZG93bkFjdGl2ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlQnV0dG9uUG9wb3V0RXZlbnQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2xheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLnNldHRpbmdzLnBvcG91dFdob2xlU3RhY2spIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BvcG91dEV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0hIQlBPRTE3ODM0Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wb3BvdXRFdmVudCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgYWN0aXZlQ29tcG9uZW50SXRlbSA9IHRoaXMuX2dldEFjdGl2ZUNvbXBvbmVudEl0ZW1FdmVudCgpO1xyXG4gICAgICAgICAgICBpZiAoYWN0aXZlQ29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgICAgICAgICAgYWN0aXZlQ29tcG9uZW50SXRlbS5wb3BvdXQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBlbHNlOiBpZiB0aGUgc3RhY2sgaXMgZW1wdHkgdGhlcmUgd29uJ3QgYmUgYW4gYWN0aXZlIGl0ZW0gKGFuZCBub3RoaW5nIHRvIHBvcG91dClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVCdXR0b25NYXhpbWlzZVRvZ2dsZUV2ZW50KGV2OiBFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9tYXhpbWlzZVRvZ2dsZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignSEhCTVRFMTY4MzQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXhpbWlzZVRvZ2dsZUV2ZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW52b2tlZCB3aGVuIHRoZSBoZWFkZXIncyBiYWNrZ3JvdW5kIGlzIGNsaWNrZWQgKG5vdCBpdCdzIHRhYnMgb3IgY29udHJvbHMpXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNsaWNrKGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZva2VkIHdoZW4gdGhlIGhlYWRlcidzIGJhY2tncm91bmQgaXMgdG91Y2hlZCAobm90IGl0J3MgdGFicyBvciBjb250cm9scylcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uVG91Y2hTdGFydChldmVudDogVG91Y2hFdmVudCkge1xyXG4gICAgICAgIGlmIChldmVudC50YXJnZXQgPT09IHRoaXMuX2VsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5ub3RpZnlUb3VjaFN0YXJ0KGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBvbkxheW91dENoYW5nZWQoKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVCdXR0b25zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBub3RpZnlDbGljayhldjogTW91c2VFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9jbGlja0V2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignSE5IQzQ2ODM0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY2xpY2tFdmVudChldik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgbm90aWZ5VG91Y2hTdGFydChldjogVG91Y2hFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLl90b3VjaFN0YXJ0RXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdITkhUUzQ2ODM0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fdG91Y2hTdGFydEV2ZW50KGV2KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgSGVhZGVyIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIEdldEFjdGl2ZUNvbXBvbmVudEl0ZW1FdmVudCA9ICh0aGlzOiB2b2lkKSA9PiBDb21wb25lbnRJdGVtIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ2xvc2VFdmVudCA9ICh0aGlzOiB2b2lkKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgUG9wb3V0RXZlbnQgPSAodGhpczogdm9pZCkgPT4gdm9pZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIE1heGltaXNlVG9nZ2xlRXZlbnQgPSAodGhpczogdm9pZCkgPT4gdm9pZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIENsaWNrRXZlbnQgPSAodGhpczogdm9pZCwgZXY6IE1vdXNlRXZlbnQpID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBUb3VjaFN0YXJ0RXZlbnQgPSAodGhpczogdm9pZCwgZXY6IFRvdWNoRXZlbnQpID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnRSZW1vdmVFdmVudCA9ICh0aGlzOiB2b2lkLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ29tcG9uZW50Rm9jdXNFdmVudCA9ICh0aGlzOiB2b2lkLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ29tcG9uZW50RHJhZ1N0YXJ0RXZlbnQgPSAodGhpczogdm9pZCwgeDogbnVtYmVyLCB5OiBudW1iZXIsIGRyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgU3RhdGVDaGFuZ2VkRXZlbnQgPSAodGhpczogdm9pZCkgPT4gdm9pZDtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzIHtcclxuICAgICAgICBzaG93OiBib29sZWFuO1xyXG4gICAgICAgIHNpZGU6IFNpZGU7XHJcbiAgICAgICAgcG9wb3V0RW5hYmxlZDogYm9vbGVhbjtcclxuICAgICAgICBwb3BvdXRMYWJlbDogc3RyaW5nO1xyXG4gICAgICAgIG1heGltaXNlRW5hYmxlZDogYm9vbGVhbjtcclxuICAgICAgICBtYXhpbWlzZUxhYmVsOiBzdHJpbmc7XHJcbiAgICAgICAgbWluaW1pc2VFbmFibGVkOiBib29sZWFuO1xyXG4gICAgICAgIG1pbmltaXNlTGFiZWw6IHN0cmluZztcclxuICAgICAgICBjbG9zZUVuYWJsZWQ6IGJvb2xlYW47XHJcbiAgICAgICAgY2xvc2VMYWJlbDogc3RyaW5nO1xyXG4gICAgICAgIHRhYkRyb3Bkb3duRW5hYmxlZDogYm9vbGVhbjtcclxuICAgICAgICB0YWJEcm9wZG93bkxhYmVsOiBzdHJpbmc7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IERyYWdMaXN0ZW5lciB9IGZyb20gJy4uL3V0aWxzL2RyYWctbGlzdGVuZXInO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9ldmVudC1lbWl0dGVyJztcclxuaW1wb3J0IHsgbnVtYmVyVG9QaXhlbHMgfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBjbGFzcyBTcGxpdHRlciB7XHJcbiAgICBwcml2YXRlIF9ncmFiU2l6ZTtcclxuICAgIHByaXZhdGUgX2RyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyO1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxEaXZFbGVtZW50O1xyXG5cclxuICAgIGdldCBlbGVtZW50KCk6IEhUTUxEaXZFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7IH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9pc1ZlcnRpY2FsOiBib29sZWFuLCBwcml2YXRlIF9zaXplOiBudW1iZXIsIGdyYWJTaXplOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9ncmFiU2l6ZSA9IGdyYWJTaXplIDwgdGhpcy5fc2l6ZSA/IHRoaXMuX3NpemUgOiBncmFiU2l6ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLlNwbGl0dGVyKTtcclxuICAgICAgICBjb25zdCBkcmFnSGFuZGxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGRyYWdIYW5kbGVFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5EcmFnSGFuZGxlKTtcclxuXHJcbiAgICAgICAgY29uc3QgaGFuZGxlRXhjZXNzU2l6ZSA9IHRoaXMuX2dyYWJTaXplIC0gdGhpcy5fc2l6ZTtcclxuICAgICAgICBjb25zdCBoYW5kbGVFeGNlc3NQb3MgPSBoYW5kbGVFeGNlc3NTaXplIC8gMjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2lzVmVydGljYWwpIHtcclxuICAgICAgICAgICAgZHJhZ0hhbmRsZUVsZW1lbnQuc3R5bGUudG9wID0gbnVtYmVyVG9QaXhlbHMoLWhhbmRsZUV4Y2Vzc1Bvcyk7XHJcbiAgICAgICAgICAgIGRyYWdIYW5kbGVFbGVtZW50LnN0eWxlLmhlaWdodCA9IG51bWJlclRvUGl4ZWxzKHRoaXMuX3NpemUgKyBoYW5kbGVFeGNlc3NTaXplKTtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuVmVydGljYWwpO1xyXG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmhlaWdodCA9IG51bWJlclRvUGl4ZWxzKHRoaXMuX3NpemUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRyYWdIYW5kbGVFbGVtZW50LnN0eWxlLmxlZnQgPSBudW1iZXJUb1BpeGVscygtaGFuZGxlRXhjZXNzUG9zKTtcclxuICAgICAgICAgICAgZHJhZ0hhbmRsZUVsZW1lbnQuc3R5bGUud2lkdGggPSBudW1iZXJUb1BpeGVscyh0aGlzLl9zaXplICsgaGFuZGxlRXhjZXNzU2l6ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkhvcml6b250YWwpO1xyXG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLndpZHRoID0gbnVtYmVyVG9QaXhlbHModGhpcy5fc2l6ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKGRyYWdIYW5kbGVFbGVtZW50KTtcclxuXHJcbiAgICAgICAgdGhpcy5fZHJhZ0xpc3RlbmVyID0gbmV3IERyYWdMaXN0ZW5lcih0aGlzLl9lbGVtZW50LCBbZHJhZ0hhbmRsZUVsZW1lbnRdKTtcclxuICAgIH1cclxuXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb248SyBleHRlbmRzIGtleW9mIEV2ZW50RW1pdHRlci5FdmVudFBhcmFtc01hcD4oZXZlbnROYW1lOiBLLCBjYWxsYmFjazogRXZlbnRFbWl0dGVyLkNhbGxiYWNrPEs+KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZHJhZ0xpc3RlbmVyLm9uPEs+KGV2ZW50TmFtZSwgY2FsbGJhY2spO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9jb21wb25lbnQtaXRlbSc7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IERvbUNvbnN0YW50cyB9IGZyb20gJy4uL3V0aWxzL2RvbS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBEcmFnTGlzdGVuZXIgfSBmcm9tICcuLi91dGlscy9kcmFnLWxpc3RlbmVyJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGFuIGluZGl2aWR1YWwgdGFiIHdpdGhpbiBhIFN0YWNrJ3MgaGVhZGVyXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBjbGFzcyBUYWIge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudDogSFRNTERpdkVsZW1lbnQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90aXRsZUVsZW1lbnQ6IEhUTUxTcGFuRWxlbWVudDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Nsb3NlRWxlbWVudDogSFRNTERpdkVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZHJhZ0xpc3RlbmVyOiBEcmFnTGlzdGVuZXIgfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9pc0FjdGl2ZSA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYkNsaWNrTGlzdGVuZXIgPSAoZXY6IE1vdXNlRXZlbnQpID0+IHRoaXMub25UYWJDbGlja0Rvd24oZXYpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFiVG91Y2hTdGFydExpc3RlbmVyID0gKGV2OiBUb3VjaEV2ZW50KSA9PiB0aGlzLm9uVGFiVG91Y2hTdGFydChldik7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jbG9zZUNsaWNrTGlzdGVuZXIgPSAoKSA9PiB0aGlzLm9uQ2xvc2VDbGljaygpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2xvc2VUb3VjaFN0YXJ0TGlzdGVuZXIgPSAoKSA9PiB0aGlzLm9uQ2xvc2VUb3VjaFN0YXJ0KCk7XHJcbiAgICAvLyAvKiogQGludGVybmFsICovXHJcbiAgICAvLyBwcml2YXRlIHJlYWRvbmx5IF9jbG9zZU1vdXNlRG93bkxpc3RlbmVyID0gKCkgPT4gdGhpcy5vbkNsb3NlTW91c2Vkb3duKCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kcmFnU3RhcnRMaXN0ZW5lciA9ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gdGhpcy5vbkRyYWdTdGFydCh4LCB5KTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRlbnRJdGVtRGVzdHJveUxpc3RlbmVyID0gKCkgPT4gdGhpcy5vbkNvbnRlbnRJdGVtRGVzdHJveSgpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFiVGl0bGVDaGFuZ2VkTGlzdGVuZXIgPSAodGl0bGU6IHN0cmluZykgPT4gdGhpcy5zZXRUaXRsZSh0aXRsZSlcclxuXHJcbiAgICBnZXQgaXNBY3RpdmUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9pc0FjdGl2ZTsgfVxyXG4gICAgLy8gZ2V0IGhlYWRlcigpOiBIZWFkZXIgeyByZXR1cm4gdGhpcy5faGVhZGVyOyB9XHJcbiAgICBnZXQgY29tcG9uZW50SXRlbSgpOiBDb21wb25lbnRJdGVtIHsgcmV0dXJuIHRoaXMuX2NvbXBvbmVudEl0ZW07IH1cclxuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChUYWI6Y2xhc3MpLmNvbXBvbmVudEl0ZW19ICovXHJcbiAgICBnZXQgY29udGVudEl0ZW0oKTogQ29tcG9uZW50SXRlbSB7IHJldHVybiB0aGlzLl9jb21wb25lbnRJdGVtOyB9XHJcbiAgICBnZXQgZWxlbWVudCgpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLl9lbGVtZW50OyB9XHJcbiAgICBnZXQgdGl0bGVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX3RpdGxlRWxlbWVudDsgfVxyXG4gICAgZ2V0IGNsb3NlRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9jbG9zZUVsZW1lbnQ7IH1cclxuICAgIGdldCByZW9yZGVyRW5hYmxlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2RyYWdMaXN0ZW5lciAhPT0gdW5kZWZpbmVkOyB9XHJcbiAgICBzZXQgcmVvcmRlckVuYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAodmFsdWUgIT09IHRoaXMucmVvcmRlckVuYWJsZWQpIHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZVJlb3JkZXIoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZVJlb3JkZXIoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlcixcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfY2xvc2VFdmVudDogVGFiLkNsb3NlRXZlbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2ZvY3VzRXZlbnQ6IFRhYi5Gb2N1c0V2ZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9kcmFnU3RhcnRFdmVudDogVGFiLkRyYWdTdGFydEV2ZW50IHwgdW5kZWZpbmVkXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuVGFiKTtcclxuICAgICAgICB0aGlzLl90aXRsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7IFxyXG4gICAgICAgIHRoaXMuX3RpdGxlRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuVGl0bGUpO1xyXG4gICAgICAgIHRoaXMuX2Nsb3NlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBcclxuICAgICAgICB0aGlzLl9jbG9zZUVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkNsb3NlVGFiKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3RpdGxlRWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9jbG9zZUVsZW1lbnQpO1xyXG5cclxuICAgICAgICBpZiAoX2NvbXBvbmVudEl0ZW0uaXNDbG9zYWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jbG9zZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkNsb3NhYmxlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9jbG9zZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0VGl0bGUoX2NvbXBvbmVudEl0ZW0udGl0bGUpO1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudEl0ZW0ub24oJ3RpdGxlQ2hhbmdlZCcsIHRoaXMuX3RhYlRpdGxlQ2hhbmdlZExpc3RlbmVyKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVvcmRlckVuYWJsZWQgPSBfY29tcG9uZW50SXRlbS5yZW9yZGVyRW5hYmxlZCA/PyB0aGlzLl9sYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5zZXR0aW5ncy5yZW9yZGVyRW5hYmxlZDtcclxuXHJcbiAgICAgICAgaWYgKHJlb3JkZXJFbmFibGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlUmVvcmRlcigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX3RhYkNsaWNrTGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl90YWJUb3VjaFN0YXJ0TGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudEl0ZW0uaXNDbG9zYWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jbG9zZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9jbG9zZUNsaWNrTGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgdGhpcy5fY2xvc2VFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl9jbG9zZVRvdWNoU3RhcnRMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAvLyB0aGlzLl9jbG9zZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fY2xvc2VNb3VzZURvd25MaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlRWxlbWVudC5yZW1vdmUoKTtcclxuICAgICAgICAgICAgdGhpcy5fY2xvc2VFbGVtZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5zZXRUYWIodGhpcyk7XHJcbiAgICAgICAgdGhpcy5fbGF5b3V0TWFuYWdlci5lbWl0KCd0YWJDcmVhdGVkJywgdGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB0YWIncyB0aXRsZSB0byB0aGUgcHJvdmlkZWQgc3RyaW5nIGFuZCBzZXRzXHJcbiAgICAgKiBpdHMgdGl0bGUgYXR0cmlidXRlIHRvIGEgcHVyZSB0ZXh0IHJlcHJlc2VudGF0aW9uICh3aXRob3V0XHJcbiAgICAgKiBodG1sIHRhZ3MpIG9mIHRoZSBzYW1lIHN0cmluZy5cclxuICAgICAqL1xyXG4gICAgc2V0VGl0bGUodGl0bGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3RpdGxlRWxlbWVudC5pbm5lclRleHQgPSB0aXRsZTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnRpdGxlID0gdGl0bGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoaXMgdGFiJ3MgYWN0aXZlIHN0YXRlLiBUbyBwcm9ncmFtbWF0aWNhbGx5XHJcbiAgICAgKiBzd2l0Y2ggdGFicywgdXNlIFN0YWNrLnNldEFjdGl2ZUNvbXBvbmVudEl0ZW0oIGl0ZW0gKSBpbnN0ZWFkLlxyXG4gICAgICovXHJcbiAgICBzZXRBY3RpdmUoaXNBY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBpZiAoaXNBY3RpdmUgPT09IHRoaXMuX2lzQWN0aXZlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faXNBY3RpdmUgPSBpc0FjdGl2ZTtcclxuXHJcbiAgICAgICAgaWYgKGlzQWN0aXZlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkFjdGl2ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKERvbUNvbnN0YW50cy5DbGFzc05hbWUuQWN0aXZlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGUgdGFiXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9jbG9zZUV2ZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuX2ZvY3VzRXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fZHJhZ1N0YXJ0RXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX3RhYkNsaWNrTGlzdGVuZXIpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX3RhYlRvdWNoU3RhcnRMaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5fY2xvc2VFbGVtZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2Nsb3NlQ2xpY2tMaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5fY2xvc2VFbGVtZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fY2xvc2VUb3VjaFN0YXJ0TGlzdGVuZXIpO1xyXG4gICAgICAgIC8vIHRoaXMuX2Nsb3NlRWxlbWVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fY2xvc2VNb3VzZURvd25MaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5vZmYoJ3RpdGxlQ2hhbmdlZCcsIHRoaXMuX3RhYlRpdGxlQ2hhbmdlZExpc3RlbmVyKTtcclxuICAgICAgICBpZiAodGhpcy5yZW9yZGVyRW5hYmxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVSZW9yZGVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc2V0Qmx1cnJlZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Gb2N1c2VkKTtcclxuICAgICAgICB0aGlzLl90aXRsZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShEb21Db25zdGFudHMuQ2xhc3NOYW1lLkZvY3VzZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHNldEZvY3VzZWQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuRm9jdXNlZCk7XHJcbiAgICAgICAgdGhpcy5fdGl0bGVFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Gb2N1c2VkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxiYWNrIGZvciB0aGUgRHJhZ0xpc3RlbmVyXHJcbiAgICAgKiBAcGFyYW0geCAtIFRoZSB0YWJzIGFic29sdXRlIHggcG9zaXRpb25cclxuICAgICAqIEBwYXJhbSB5IC0gVGhlIHRhYnMgYWJzb2x1dGUgeSBwb3NpdGlvblxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25EcmFnU3RhcnQoeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fZHJhZ0xpc3RlbmVyID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignVE9EU0RMVTEwMDkzJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RyYWdTdGFydEV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ1RPRFMyMzMwOScpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZHJhZ1N0YXJ0RXZlbnQoeCwgeSwgdGhpcy5fZHJhZ0xpc3RlbmVyLCB0aGlzLmNvbXBvbmVudEl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIG9uQ29udGVudEl0ZW1EZXN0cm95KCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kcmFnTGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgd2hlbiB0aGUgdGFiIGlzIGNsaWNrZWRcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uVGFiQ2xpY2tEb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xyXG4gICAgICAgIGlmICh0YXJnZXQgPT09IHRoaXMuX2VsZW1lbnQgfHwgdGFyZ2V0ID09PSB0aGlzLl90aXRsZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgLy8gbGVmdCBtb3VzZSBidXR0b25cclxuICAgICAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUZvY3VzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gbWlkZGxlIG1vdXNlIGJ1dHRvblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gMSAmJiB0aGlzLl9jb21wb25lbnRJdGVtLmlzQ2xvc2FibGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDbG9zZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgb25UYWJUb3VjaFN0YXJ0KGV2ZW50OiBUb3VjaEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgd2hlbiB0aGUgdGFiJ3MgY2xvc2UgYnV0dG9uIGlzIGNsaWNrZWRcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uQ2xvc2VDbGljaygpIHtcclxuICAgICAgICB0aGlzLm5vdGlmeUNsb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBvbkNsb3NlVG91Y2hTdGFydCgpIHtcclxuICAgICAgICB0aGlzLm5vdGlmeUNsb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayB0byBjYXB0dXJlIHRhYiBjbG9zZSBidXR0b24gbW91c2Vkb3duXHJcbiAgICAgKiB0byBwcmV2ZW50IHRhYiBmcm9tIGFjdGl2YXRpbmcuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgLy8gcHJpdmF0ZSBvbkNsb3NlTW91c2Vkb3duKCk6IHZvaWQge1xyXG4gICAgLy8gICAgIC8vIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgbm90aWZ5Q2xvc2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2Nsb3NlRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdUTkMxNTAwNycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlRXZlbnQodGhpcy5fY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgbm90aWZ5Rm9jdXMoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2ZvY3VzRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdUTkExNTAwNycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzRXZlbnQodGhpcy5fY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZW5hYmxlUmVvcmRlcigpIHtcclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIgPSBuZXcgRHJhZ0xpc3RlbmVyKHRoaXMuX2VsZW1lbnQsIFt0aGlzLl90aXRsZUVsZW1lbnRdKTtcclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIub24oJ2RyYWdTdGFydCcsIHRoaXMuX2RyYWdTdGFydExpc3RlbmVyKTtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRJdGVtLm9uKCdkZXN0cm95JywgdGhpcy5fY29udGVudEl0ZW1EZXN0cm95TGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZGlzYWJsZVJlb3JkZXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RyYWdMaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ1REUjg3NzQ1Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5vZmYoJ2Rlc3Ryb3knLCB0aGlzLl9jb250ZW50SXRlbURlc3Ryb3lMaXN0ZW5lcik7XHJcbiAgICAgICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lci5vZmYoJ2RyYWdTdGFydCcsIHRoaXMuX2RyYWdTdGFydExpc3RlbmVyKTtcclxuICAgICAgICAgICAgdGhpcy5fZHJhZ0xpc3RlbmVyID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBUYWIge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ2xvc2VFdmVudCA9IChjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgRm9jdXNFdmVudCA9IChjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgRHJhZ1N0YXJ0RXZlbnQgPSAoeDogbnVtYmVyLCB5OiBudW1iZXIsIGRyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG59XHJcbiIsImltcG9ydCB7IEFzc2VydEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4uL2l0ZW1zL2NvbXBvbmVudC1pdGVtJztcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IERyYWdMaXN0ZW5lciB9IGZyb20gJy4uL3V0aWxzL2RyYWctbGlzdGVuZXInO1xyXG5pbXBvcnQgeyBudW1iZXJUb1BpeGVscywgcGl4ZWxzVG9OdW1iZXIgfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcbmltcG9ydCB7IFRhYiB9IGZyb20gJy4vdGFiJztcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIFRhYnNDb250YWluZXIge1xyXG4gICAgLy8gVGhlcmUgaXMgb25lIHRhYiBwZXIgQ29tcG9uZW50SXRlbSBpbiBzdGFjay4gIEhvd2V2ZXIgdGhleSBtYXkgbm90IGJlIG9yZGVyZWQgdGhlIHNhbWVcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYnM6IFRhYltdID0gW107XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZHJvcGRvd25FbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgcHJpdmF0ZSBfbGFzdFZpc2libGVUYWJJbmRleCA9IC0xO1xyXG4gICAgcHJpdmF0ZSBfZHJvcGRvd25BY3RpdmUgPSBmYWxzZTtcclxuXHJcbiAgICBnZXQgdGFicygpOiBUYWJbXSB7IHJldHVybiB0aGlzLl90YWJzOyB9XHJcbiAgICBnZXQgdGFiQ291bnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3RhYnMubGVuZ3RoOyB9XHJcbiAgICBnZXQgbGFzdFZpc2libGVUYWJJbmRleCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fbGFzdFZpc2libGVUYWJJbmRleDsgfVxyXG5cclxuICAgIGdldCBlbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7IH1cclxuICAgIGdldCBkcm9wZG93bkVsZW1lbnQoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdGhpcy5fZHJvcGRvd25FbGVtZW50OyB9XHJcbiAgICBnZXQgZHJvcGRvd25BY3RpdmUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9kcm9wZG93bkFjdGl2ZTsgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2xheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXIsXHJcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50UmVtb3ZlRXZlbnQ6IFRhYnNDb250YWluZXIuQ29tcG9uZW50SXRlbVJlbW92ZUV2ZW50LFxyXG4gICAgICAgIHByaXZhdGUgX2NvbXBvbmVudEZvY3VzRXZlbnQ6IFRhYnNDb250YWluZXIuQ29tcG9uZW50SXRlbUZvY3VzRXZlbnQsXHJcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50RHJhZ1N0YXJ0RXZlbnQ6IFRhYnNDb250YWluZXIuQ29tcG9uZW50SXRlbURyYWdTdGFydEV2ZW50LFxyXG4gICAgICAgIHByaXZhdGUgX2Ryb3Bkb3duQWN0aXZlQ2hhbmdlZEV2ZW50OiBUYWJzQ29udGFpbmVyLkRyb3Bkb3duQWN0aXZlQ2hhbmdlZEV2ZW50LFxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlY3Rpb24nKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5UYWJzKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZHJvcGRvd25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VjdGlvbicpO1xyXG4gICAgICAgIHRoaXMuX2Ryb3Bkb3duRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuVGFiRHJvcGRvd25MaXN0KTtcclxuICAgICAgICB0aGlzLl9kcm9wZG93bkVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgIH1cclxuXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fdGFicy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLl90YWJzW2ldLmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHRhYiBhbmQgYXNzb2NpYXRlcyBpdCB3aXRoIGEgY29udGVudEl0ZW1cclxuICAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBwb3NpdGlvbiBvZiB0aGUgdGFiXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZVRhYihjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgLy9JZiB0aGVyZSdzIGFscmVhZHkgYSB0YWIgcmVsYXRpbmcgdG8gdGhlXHJcbiAgICAgICAgLy9jb250ZW50IGl0ZW0sIGRvbid0IGRvIGFueXRoaW5nXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl90YWJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl90YWJzW2ldLmNvbXBvbmVudEl0ZW0gPT09IGNvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdGFiID0gbmV3IFRhYih0aGlzLl9sYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgICAgICBjb21wb25lbnRJdGVtLFxyXG4gICAgICAgICAgICAoaXRlbSkgPT4gdGhpcy5oYW5kbGVUYWJDbG9zZUV2ZW50KGl0ZW0pLFxyXG4gICAgICAgICAgICAoaXRlbSkgPT4gdGhpcy5oYW5kbGVUYWJGb2N1c0V2ZW50KGl0ZW0pLFxyXG4gICAgICAgICAgICAoeCwgeSwgZHJhZ0xpc3RlbmVyLCBpdGVtKSA9PiB0aGlzLmhhbmRsZVRhYkRyYWdTdGFydEV2ZW50KHgsIHksIGRyYWdMaXN0ZW5lciwgaXRlbSkpO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuX3RhYnMubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fdGFicy5zcGxpY2UoaW5kZXgsIDAsIHRhYik7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA8IHRoaXMuX2VsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5pbnNlcnRCZWZvcmUodGFiLmVsZW1lbnQsIHRoaXMuX2VsZW1lbnQuY2hpbGROb2Rlc1tpbmRleF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGFiLmVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVUYWIoY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIC8vIGNvbXBvbmVudEl0ZW0gY2Fubm90IGJlIEFjdGl2ZUNvbXBvbmVudEl0ZW1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3RhYnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3RhYnNbaV0uY29tcG9uZW50SXRlbSA9PT0gY29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFiID0gdGhpcy5fdGFic1tpXTtcclxuICAgICAgICAgICAgICAgIHRhYi5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90YWJzLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb250ZW50SXRlbSBpcyBub3QgY29udHJvbGxlZCBieSB0aGlzIGhlYWRlcicpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb2Nlc3NBY3RpdmVDb21wb25lbnRDaGFuZ2VkKG5ld0FjdGl2ZUNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICBsZXQgYWN0aXZlSW5kZXggPSAtMTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3RhYnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXNBY3RpdmUgPSB0aGlzLl90YWJzW2ldLmNvbXBvbmVudEl0ZW0gPT09IG5ld0FjdGl2ZUNvbXBvbmVudEl0ZW07XHJcbiAgICAgICAgICAgIHRoaXMuX3RhYnNbaV0uc2V0QWN0aXZlKGlzQWN0aXZlKTtcclxuICAgICAgICAgICAgaWYgKGlzQWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICBhY3RpdmVJbmRleCA9IGk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhY3RpdmVJbmRleCA8IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdIU0FDSTU2NjMyJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2xheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLnNldHRpbmdzLnJlb3JkZXJPblRhYk1lbnVDbGljaykge1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBJZiB0aGUgdGFiIHNlbGVjdGVkIHdhcyBpbiB0aGUgZHJvcGRvd24sIG1vdmUgZXZlcnl0aGluZyBkb3duIG9uZSB0byBtYWtlIHdheSBmb3IgdGhpcyBvbmUgdG8gYmUgdGhlIGZpcnN0LlxyXG4gICAgICAgICAgICAgICAgICogVGhpcyB3aWxsIG1ha2Ugc3VyZSB0aGUgbW9zdCB1c2VkIHRhYnMgc3RheSB2aXNpYmxlLlxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbGFzdFZpc2libGVUYWJJbmRleCAhPT0gLTEgJiYgYWN0aXZlSW5kZXggPiB0aGlzLl9sYXN0VmlzaWJsZVRhYkluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlVGFiID0gdGhpcy5fdGFic1thY3RpdmVJbmRleF07XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IGFjdGl2ZUluZGV4OyBqID4gMDsgai0tKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RhYnNbal0gPSB0aGlzLl90YWJzW2ogLSAxXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFic1swXSA9IGFjdGl2ZVRhYjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlVGFiU2l6ZXMgd2lsbCBhbHdheXMgYmUgY2FsbGVkIGFmdGVyIHRoaXMgYW5kIGl0IHdpbGwgcmVwb3NpdGlvbiB0YWIgZWxlbWVudHNcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFB1c2hlcyB0aGUgdGFicyB0byB0aGUgdGFiIGRyb3Bkb3duIGlmIHRoZSBhdmFpbGFibGUgc3BhY2UgaXMgbm90IHN1ZmZpY2llbnRcclxuICAgICAqL1xyXG4gICAgdXBkYXRlVGFiU2l6ZXMoYXZhaWxhYmxlV2lkdGg6IG51bWJlciwgYWN0aXZlQ29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSB8IHVuZGVmaW5lZCk6IHZvaWQge1xyXG4gICAgICAgIGxldCBkcm9wRG93bkFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLnRyeVVwZGF0ZVRhYlNpemVzKGRyb3BEb3duQWN0aXZlLCBhdmFpbGFibGVXaWR0aCwgYWN0aXZlQ29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgaWYgKCFzdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIGRyb3BEb3duQWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGFsd2F5cyBzdWNjZWVkXHJcbiAgICAgICAgICAgIHRoaXMudHJ5VXBkYXRlVGFiU2l6ZXMoZHJvcERvd25BY3RpdmUsIGF2YWlsYWJsZVdpZHRoLCBhY3RpdmVDb21wb25lbnRJdGVtKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5tYXhXaWR0aCA9IG51bWJlclRvUGl4ZWxzKGF2YWlsYWJsZVdpZHRoKTtcclxuXHJcbiAgICAgICAgaWYgKGRyb3BEb3duQWN0aXZlICE9PSB0aGlzLl9kcm9wZG93bkFjdGl2ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9kcm9wZG93bkFjdGl2ZSA9IGRyb3BEb3duQWN0aXZlO1xyXG4gICAgICAgICAgICB0aGlzLl9kcm9wZG93bkFjdGl2ZUNoYW5nZWRFdmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0cnlVcGRhdGVUYWJTaXplcyhkcm9wZG93bkFjdGl2ZTogYm9vbGVhbiwgYXZhaWxhYmxlV2lkdGg6IG51bWJlciwgYWN0aXZlQ29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0aGlzLl90YWJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKGFjdGl2ZUNvbXBvbmVudEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdub24tZW1wdHkgdGFicyBtdXN0IGhhdmUgYWN0aXZlIGNvbXBvbmVudCBpdGVtJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBjdW11bGF0aXZlVGFiV2lkdGggPSAwO1xyXG4gICAgICAgICAgICBsZXQgdGFiT3ZlcmxhcEFsbG93YW5jZUV4Y2VlZGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhYk92ZXJsYXBBbGxvd2FuY2UgPSB0aGlzLl9sYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5zZXR0aW5ncy50YWJPdmVybGFwQWxsb3dhbmNlO1xyXG4gICAgICAgICAgICBjb25zdCBhY3RpdmVJbmRleCA9IHRoaXMuX3RhYnMuaW5kZXhPZihhY3RpdmVDb21wb25lbnRJdGVtLnRhYik7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZVRhYiA9IHRoaXMuX3RhYnNbYWN0aXZlSW5kZXhdO1xyXG4gICAgICAgICAgICB0aGlzLl9sYXN0VmlzaWJsZVRhYkluZGV4ID0gLTE7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3RhYnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhYkVsZW1lbnQgPSB0aGlzLl90YWJzW2ldLmVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9QdXQgdGhlIHRhYiBpbiB0aGUgdGFiQ29udGFpbmVyIHNvIGl0cyB0cnVlIHdpZHRoIGNhbiBiZSBjaGVja2VkXHJcbiAgICAgICAgICAgICAgICBpZiAodGFiRWxlbWVudC5wYXJlbnRFbGVtZW50ICE9PSB0aGlzLl9lbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0YWJFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhYk1hcmdpblJpZ2h0UGl4ZWxzID0gZ2V0Q29tcHV0ZWRTdHlsZShhY3RpdmVUYWIuZWxlbWVudCkubWFyZ2luUmlnaHQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJNYXJnaW5SaWdodCA9IHBpeGVsc1RvTnVtYmVyKHRhYk1hcmdpblJpZ2h0UGl4ZWxzKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhYldpZHRoID0gdGFiRWxlbWVudC5vZmZzZXRXaWR0aCArIHRhYk1hcmdpblJpZ2h0O1xyXG5cclxuICAgICAgICAgICAgICAgIGN1bXVsYXRpdmVUYWJXaWR0aCArPSB0YWJXaWR0aDtcclxuXHJcbiAgICAgICAgICAgICAgICAvL0luY2x1ZGUgdGhlIGFjdGl2ZSB0YWIncyB3aWR0aCBpZiBpdCBpc24ndCBhbHJlYWR5XHJcbiAgICAgICAgICAgICAgICAvL1RoaXMgaXMgdG8gZW5zdXJlIHRoZXJlIGlzIHJvb20gdG8gc2hvdyB0aGUgYWN0aXZlIHRhYlxyXG4gICAgICAgICAgICAgICAgbGV0IHZpc2libGVUYWJXaWR0aCA9IDA7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZlSW5kZXggPD0gaSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZpc2libGVUYWJXaWR0aCA9IGN1bXVsYXRpdmVUYWJXaWR0aDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlVGFiTWFyZ2luUmlnaHRQaXhlbHMgPSBnZXRDb21wdXRlZFN0eWxlKGFjdGl2ZVRhYi5lbGVtZW50KS5tYXJnaW5SaWdodDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVUYWJNYXJnaW5SaWdodCA9IHBpeGVsc1RvTnVtYmVyKGFjdGl2ZVRhYk1hcmdpblJpZ2h0UGl4ZWxzKTtcclxuICAgICAgICAgICAgICAgICAgICB2aXNpYmxlVGFiV2lkdGggPSBjdW11bGF0aXZlVGFiV2lkdGggKyBhY3RpdmVUYWIuZWxlbWVudC5vZmZzZXRXaWR0aCArIGFjdGl2ZVRhYk1hcmdpblJpZ2h0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSB0YWJzIHdvbid0IGZpdCwgY2hlY2sgdGhlIG92ZXJsYXAgYWxsb3dhbmNlLlxyXG4gICAgICAgICAgICAgICAgaWYgKHZpc2libGVUYWJXaWR0aCA+IGF2YWlsYWJsZVdpZHRoKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vT25jZSBhbGxvd2FuY2UgaXMgZXhjZWVkZWQsIGFsbCByZW1haW5pbmcgdGFicyBnbyB0byBtZW51LlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGFiT3ZlcmxhcEFsbG93YW5jZUV4Y2VlZGVkKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL05vIG92ZXJsYXAgZm9yIGZpcnN0IHRhYiBvciBhY3RpdmUgdGFiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vT3ZlcmxhcCBzcHJlYWRzIGFtb25nIG5vbi1hY3RpdmUsIG5vbi1maXJzdCB0YWJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvdmVybGFwOiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVJbmRleCA+IDAgJiYgYWN0aXZlSW5kZXggPD0gaSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcCA9ICh2aXNpYmxlVGFiV2lkdGggLSBhdmFpbGFibGVXaWR0aCkgLyAoaSAtIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcCA9ICh2aXNpYmxlVGFiV2lkdGggLSBhdmFpbGFibGVXaWR0aCkgLyBpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0NoZWNrIG92ZXJsYXAgYWdhaW5zdCBhbGxvd2FuY2UuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdmVybGFwIDwgdGFiT3ZlcmxhcEFsbG93YW5jZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPD0gaTsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFyZ2luTGVmdCA9IChqICE9PSBhY3RpdmVJbmRleCAmJiBqICE9PSAwKSA/ICctJyArIG51bWJlclRvUGl4ZWxzKG92ZXJsYXApIDogJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFic1tqXS5lbGVtZW50LnN0eWxlLnpJbmRleCA9IG51bWJlclRvUGl4ZWxzKGkgLSBqKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90YWJzW2pdLmVsZW1lbnQuc3R5bGUubWFyZ2luTGVmdCA9IG1hcmdpbkxlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXN0VmlzaWJsZVRhYkluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJFbGVtZW50LnBhcmVudEVsZW1lbnQgIT09IHRoaXMuX2VsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHRhYkVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiT3ZlcmxhcEFsbG93YW5jZUV4Y2VlZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IGFjdGl2ZUluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vQWN0aXZlIHRhYiBzaG91bGQgc2hvdyBldmVuIGlmIGFsbG93YW5jZSBleGNlZWRlZC4gKFdlIGxlZnQgcm9vbS4pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYkVsZW1lbnQuc3R5bGUuekluZGV4ID0gJ2F1dG8nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJFbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhYkVsZW1lbnQucGFyZW50RWxlbWVudCAhPT0gdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0YWJFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhYk92ZXJsYXBBbGxvd2FuY2VFeGNlZWRlZCAmJiBpICE9PSBhY3RpdmVJbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcGRvd25BY3RpdmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVGFiIG1lbnUgYWxyZWFkeSBzaG93biwgc28gd2UganVzdCBhZGQgdG8gaXQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJFbGVtZW50LnN0eWxlLnpJbmRleCA9ICdhdXRvJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYkVsZW1lbnQuc3R5bGUubWFyZ2luTGVmdCA9ICcnO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJFbGVtZW50LnBhcmVudEVsZW1lbnQgIT09IHRoaXMuX2Ryb3Bkb3duRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Ryb3Bkb3duRWxlbWVudC5hcHBlbmRDaGlsZCh0YWJFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vV2Ugbm93IGtub3cgdGhlIHRhYiBtZW51IG11c3QgYmUgc2hvd24sIHNvIHdlIGhhdmUgdG8gcmVjYWxjdWxhdGUgZXZlcnl0aGluZy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RWaXNpYmxlVGFiSW5kZXggPSBpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRhYkVsZW1lbnQuc3R5bGUuekluZGV4ID0gJ2F1dG8nO1xyXG4gICAgICAgICAgICAgICAgICAgIHRhYkVsZW1lbnQuc3R5bGUubWFyZ2luTGVmdCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWJFbGVtZW50LnBhcmVudEVsZW1lbnQgIT09IHRoaXMuX2VsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0YWJFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvd3MgZHJvcCBkb3duIGZvciBhZGRpdGlvbmFsIHRhYnMgd2hlbiB0aGVyZSBhcmUgdG9vIG1hbnkgdG8gZGlzcGxheS5cclxuICAgICAqL1xyXG4gICAgc2hvd0FkZGl0aW9uYWxUYWJzRHJvcGRvd24oKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZHJvcGRvd25FbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhpZGVzIGRyb3AgZG93biBmb3IgYWRkaXRpb25hbCB0YWJzIHdoZW4gdGhlcmUgYXJlIHRvbyBtYW55IHRvIGRpc3BsYXkuXHJcbiAgICAgKi9cclxuICAgIGhpZGVBZGRpdGlvbmFsVGFic0Ryb3Bkb3duKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2Ryb3Bkb3duRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlVGFiQ2xvc2VFdmVudChjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50UmVtb3ZlRXZlbnQoY29tcG9uZW50SXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVUYWJGb2N1c0V2ZW50KGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRGb2N1c0V2ZW50KGNvbXBvbmVudEl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlVGFiRHJhZ1N0YXJ0RXZlbnQoeDogbnVtYmVyLCB5OiBudW1iZXIsIGRyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50RHJhZ1N0YXJ0RXZlbnQoeCwgeSwgZHJhZ0xpc3RlbmVyLCBjb21wb25lbnRJdGVtKTtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBUYWJzQ29udGFpbmVyIHtcclxuICAgIGV4cG9ydCB0eXBlIENvbXBvbmVudEl0ZW1SZW1vdmVFdmVudCA9ICh0aGlzOiB2b2lkLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgZXhwb3J0IHR5cGUgQ29tcG9uZW50SXRlbUZvY3VzRXZlbnQgPSAodGhpczogdm9pZCwgY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSkgPT4gdm9pZDtcclxuICAgIGV4cG9ydCB0eXBlIENvbXBvbmVudEl0ZW1EcmFnU3RhcnRFdmVudCA9ICh0aGlzOiB2b2lkLCB4OiBudW1iZXIsIHk6IG51bWJlciwgZHJhZ0xpc3RlbmVyOiBEcmFnTGlzdGVuZXIsIGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pID0+IHZvaWQ7XHJcbiAgICBleHBvcnQgdHlwZSBEcm9wZG93bkFjdGl2ZUNoYW5nZWRFdmVudCA9ICh0aGlzOiB2b2lkKSA9PiB2b2lkO1xyXG59XHJcbiIsImltcG9ydCB7IERvbUNvbnN0YW50cyB9IGZyb20gJy4uL3V0aWxzL2RvbS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBSZWN0IH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xyXG5cclxuLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCBUbyBiZSByZW1vdmVkICovXHJcbmV4cG9ydCBjbGFzcyBUcmFuc2l0aW9uSW5kaWNhdG9yIHtcclxuICAgIHByaXZhdGUgX2VsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgcHJpdmF0ZSBfdG9FbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGw7XHJcbiAgICBwcml2YXRlIF9mcm9tRGltZW5zaW9uczogbnVsbDtcclxuICAgIHByaXZhdGUgX3RvdGFsQW5pbWF0aW9uRHVyYXRpb246IG51bWJlcjtcclxuICAgIHByaXZhdGUgX2FuaW1hdGlvblN0YXJ0VGltZTogbnVtYmVyIHwgbnVsbDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuVHJhbnNpdGlvbkluZGljYXRvcik7XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50KTtcclxuXHJcbiAgICAgICAgdGhpcy5fdG9FbGVtZW50ID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9mcm9tRGltZW5zaW9ucyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fdG90YWxBbmltYXRpb25EdXJhdGlvbiA9IDIwMDtcclxuICAgICAgICB0aGlzLl9hbmltYXRpb25TdGFydFRpbWUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICB0cmFuc2l0aW9uRWxlbWVudHMoZnJvbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0b0VsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVE9ETyAtIFRoaXMgaXMgbm90IHF1aXRlIGFzIGNvb2wgYXMgZXhwZWN0ZWQuIFJldmlldy5cclxuICAgICAgICAgKi9cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgICAgLy8gdGhpcy5fdG9FbGVtZW50ID0gdG9FbGVtZW50O1xyXG4gICAgICAgIC8vIHRoaXMuX2FuaW1hdGlvblN0YXJ0VGltZSA9IG5vdygpO1xyXG4gICAgICAgIC8vIHRoaXMuX2Zyb21EaW1lbnNpb25zID0gdGhpcy5fbWVhc3VyZShmcm9tRWxlbWVudCk7XHJcbiAgICAgICAgLy8gdGhpcy5fZnJvbURpbWVuc2lvbnMub3BhY2l0eSA9IDAuODtcclxuICAgICAgICAvLyB0aGlzLl9lbGVtZW50LnNob3coKS5jc3ModGhpcy5fZnJvbURpbWVuc2lvbnMpO1xyXG4gICAgICAgIC8vIGFuaW1GcmFtZShmbkJpbmQodGhpcy5fbmV4dEFuaW1hdGlvbkZyYW1lLCB0aGlzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBuZXh0QW5pbWF0aW9uRnJhbWUoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gaWYgKHRoaXMuX3RvRWxlbWVudCA9PT0gbnVsbCB8fCB0aGlzLl9mcm9tRGltZW5zaW9ucyA9PT0gbnVsbCB8fCB0aGlzLl9hbmltYXRpb25TdGFydFRpbWUgPT09IG51bGwpIHtcclxuICAgICAgICAvLyAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ1RJTkFGVEQ5NzExNScpO1xyXG4gICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IHRvRGltZW5zaW9ucyA9IHRoaXMubWVhc3VyZSh0aGlzLl90b0VsZW1lbnQpO1xyXG4gICAgICAgIC8vICAgICBjb25zdCBhbmltYXRpb25Qcm9ncmVzcyA9IChub3coKSAtIHRoaXMuX2FuaW1hdGlvblN0YXJ0VGltZSkgLyB0aGlzLl90b3RhbEFuaW1hdGlvbkR1cmF0aW9uO1xyXG4gICAgICAgIC8vICAgICBjb25zdCBjdXJyZW50RnJhbWVTdHlsZXMgPSB7fTtcclxuICAgICAgICAvLyAgICAgY29uc3QgY3NzUHJvcGVydHk7XHJcblxyXG4gICAgICAgIC8vICAgICBpZiAoYW5pbWF0aW9uUHJvZ3Jlc3MgPj0gMSkge1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIC8vICAgICB9XHJcblxyXG4gICAgICAgIC8vICAgICB0b0RpbWVuc2lvbnMub3BhY2l0eSA9IDA7XHJcblxyXG4gICAgICAgIC8vICAgICBmb3IgKGNvbnN0IGNzc1Byb3BlcnR5IGluIHRoaXMuX2Zyb21EaW1lbnNpb25zKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBjdXJyZW50RnJhbWVTdHlsZXNbY3NzUHJvcGVydHldID0gdGhpcy5fZnJvbURpbWVuc2lvbnNbY3NzUHJvcGVydHldICtcclxuICAgICAgICAvLyAgICAgICAgICAgICAodG9EaW1lbnNpb25zW2Nzc1Byb3BlcnR5XSAtIHRoaXMuX2Zyb21EaW1lbnNpb25zW2Nzc1Byb3BlcnR5XSkgKlxyXG4gICAgICAgIC8vICAgICAgICAgICAgIGFuaW1hdGlvblByb2dyZXNzO1xyXG4gICAgICAgIC8vICAgICB9XHJcblxyXG4gICAgICAgIC8vICAgICB0aGlzLl9lbGVtZW50LmNzcyhjdXJyZW50RnJhbWVTdHlsZXMpO1xyXG4gICAgICAgIC8vICAgICBhbmltRnJhbWUoZm5CaW5kKHRoaXMuX25leHRBbmltYXRpb25GcmFtZSwgdGhpcykpO1xyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG1lYXN1cmUoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBSZWN0IHtcclxuICAgICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbGVmdDogcmVjdC5sZWZ0LFxyXG4gICAgICAgICAgICB0b3A6IHJlY3QudG9wLFxyXG4gICAgICAgICAgICB3aWR0aDogZWxlbWVudC5vZmZzZXRXaWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiBlbGVtZW50Lm9mZnNldEhlaWdodCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbiIsIi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBFeHRlcm5hbEVycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHR5cGU6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uRXJyb3IgZXh0ZW5kcyBFeHRlcm5hbEVycm9yIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgcHVibGljIHJlYWRvbmx5IG5vZGU/OiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcignQ29uZmlndXJhdGlvbicsIG1lc3NhZ2UpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY2xhc3MgUG9wb3V0QmxvY2tlZEVycm9yIGV4dGVuZHMgRXh0ZXJuYWxFcnJvciB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcignUG9wb3V0QmxvY2tlZCcsIG1lc3NhZ2UpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY2xhc3MgQXBpRXJyb3IgZXh0ZW5kcyBFeHRlcm5hbEVycm9yIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKCdBUEknLCBtZXNzYWdlKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGNsYXNzIEJpbmRFcnJvciBleHRlbmRzIEV4dGVybmFsRXJyb3Ige1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoJ0JpbmQnLCBtZXNzYWdlKTtcclxuICAgIH1cclxufVxyXG4iLCIvKiogQGludGVybmFsICovXHJcbmFic3RyYWN0IGNsYXNzIEludGVybmFsRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBzdHJpbmcsIGNvZGU6IHN0cmluZywgbWVzc2FnZT86IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKGAke3R5cGV9OiAke2NvZGV9JHttZXNzYWdlID09PSB1bmRlZmluZWQgPyAnJyA6ICc6ICcgKyBtZXNzYWdlfWApXHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIEFzc2VydEVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3Rvcihjb2RlOiBzdHJpbmcsIG1lc3NhZ2U/OiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcignQXNzZXJ0JywgY29kZSwgbWVzc2FnZSlcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgY2xhc3MgVW5yZWFjaGFibGVDYXNlRXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKGNvZGU6IHN0cmluZywgdmFyaWFibGVWYWx1ZTogbmV2ZXIsIG1lc3NhZ2U/OiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcignVW5yZWFjaGFibGVDYXNlJywgY29kZSwgYCR7dmFyaWFibGVWYWx1ZX0ke21lc3NhZ2UgPT09IHVuZGVmaW5lZCA/ICcnIDogJzogJyArIG1lc3NhZ2V9YClcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgY2xhc3MgVW5leHBlY3RlZE51bGxFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IoY29kZTogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoJ1VuZXhwZWN0ZWROdWxsJywgY29kZSwgbWVzc2FnZSlcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgY2xhc3MgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3Rvcihjb2RlOiBzdHJpbmcsIG1lc3NhZ2U/OiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcignVW5leHBlY3RlZFVuZGVmaW5lZCcsIGNvZGUsIG1lc3NhZ2UpXHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgTGF5b3V0Q29uZmlnIH0gZnJvbSAnLi9jb25maWcvY29uZmlnJztcclxuaW1wb3J0IHsgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnIH0gZnJvbSAnLi9jb25maWcvcmVzb2x2ZWQtY29uZmlnJztcclxuaW1wb3J0IHsgQ29tcG9uZW50Q29udGFpbmVyIH0gZnJvbSAnLi9jb250YWluZXIvY29tcG9uZW50LWNvbnRhaW5lcic7XHJcbmltcG9ydCB7IEFwaUVycm9yLCBCaW5kRXJyb3IgfSBmcm9tICcuL2Vycm9ycy9leHRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IEFzc2VydEVycm9yLCBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IgfSBmcm9tICcuL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IEkxOG5TdHJpbmdJZCwgaTE4blN0cmluZ3MgfSBmcm9tICcuL3V0aWxzL2kxOG4tc3RyaW5ncyc7XHJcbmltcG9ydCB7IEpzb25WYWx1ZSwgTG9naWNhbFpJbmRleCB9IGZyb20gJy4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQgeyBkZWVwRXh0ZW5kVmFsdWUsIGVuc3VyZUVsZW1lbnRQb3NpdGlvbkFic29sdXRlLCBudW1iZXJUb1BpeGVscywgc2V0RWxlbWVudERpc3BsYXlWaXNpYmlsaXR5LCBzZXRFbGVtZW50SGVpZ2h0LCBzZXRFbGVtZW50V2lkdGggfSBmcm9tICcuL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0IHsgVmlydHVhbExheW91dCB9IGZyb20gJy4vdmlydHVhbC1sYXlvdXQnO1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGNsYXNzIEdvbGRlbkxheW91dCBleHRlbmRzIFZpcnR1YWxMYXlvdXQge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfY29tcG9uZW50VHlwZXNNYXAgPSBuZXcgTWFwPHN0cmluZywgR29sZGVuTGF5b3V0LkNvbXBvbmVudEluc3RhbnRpYXRvcj4oKTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2dldENvbXBvbmVudENvbnN0cnVjdG9yRnRuOiBHb2xkZW5MYXlvdXQuR2V0Q29tcG9uZW50Q29uc3RydWN0b3JDYWxsYmFjaztcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9yZWdpc3RlcmVkQ29tcG9uZW50TWFwID0gbmV3IE1hcDxDb21wb25lbnRDb250YWluZXIsIENvbXBvbmVudENvbnRhaW5lci5Db21wb25lbnQ+KCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF92aXJ0dWFibGVDb21wb25lbnRNYXAgPSBuZXcgTWFwPENvbXBvbmVudENvbnRhaW5lciwgR29sZGVuTGF5b3V0LlZpcnR1YWJsZUNvbXBvbmVudD4oKTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2dvbGRlbkxheW91dEJvdW5kaW5nQ2xpZW50UmVjdDogRE9NUmVjdDtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9jb250YWluZXJWaXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnRMaXN0ZW5lciA9XHJcbiAgICAgICAgKGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikgPT4gdGhpcy5oYW5kbGVDb250YWluZXJWaXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQoY29udGFpbmVyLCB3aWR0aCwgaGVpZ2h0KTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2NvbnRhaW5lclZpcnR1YWxWaXNpYmlsaXR5Q2hhbmdlUmVxdWlyZWRFdmVudExpc3RlbmVyID1cclxuICAgICAgICAoY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIHZpc2libGU6IGJvb2xlYW4pID0+IHRoaXMuaGFuZGxlQ29udGFpbmVyVmlydHVhbFZpc2liaWxpdHlDaGFuZ2VSZXF1aXJlZEV2ZW50KGNvbnRhaW5lciwgdmlzaWJsZSk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9jb250YWluZXJWaXJ0dWFsWkluZGV4Q2hhbmdlUmVxdWlyZWRFdmVudExpc3RlbmVyID1cclxuICAgICAgICAoY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIGxvZ2ljYWxaSW5kZXg6IExvZ2ljYWxaSW5kZXgsIGRlZmF1bHRaSW5kZXg6IHN0cmluZykgPT5cclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVDb250YWluZXJWaXJ0dWFsWkluZGV4Q2hhbmdlUmVxdWlyZWRFdmVudChjb250YWluZXIsIGxvZ2ljYWxaSW5kZXgsIGRlZmF1bHRaSW5kZXgpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIGNvbnRhaW5lciAtIEEgRG9tIEhUTUwgZWxlbWVudC4gRGVmYXVsdHMgdG8gYm9keVxyXG4gICAgICogQHBhcmFtIGJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIHRvIGJpbmQgY29tcG9uZW50c1xyXG4gICAgICogQHBhcmFtIGJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIHRvIHVuYmluZCBjb21wb25lbnRzXHJcbiAgICAgKiBJZiBiaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIGlzIGRlZmluZWQsIHRoZW4gY29uc3RydWN0b3Igd2lsbCBiZSBkZXRlcm1pbmF0ZS4gSXQgd2lsbCBhbHdheXMgY2FsbCB0aGUgaW5pdCgpXHJcbiAgICAgKiBmdW5jdGlvbiBhbmQgdGhlIGluaXQoKSBmdW5jdGlvbiB3aWxsIGFsd2F5cyBjb21wbGV0ZS4gVGhpcyBtZWFucyB0aGF0IHRoZSBiaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIHdpbGwgYmUgY2FsbGVkXHJcbiAgICAgKiBpZiBjb25zdHJ1Y3RvciBpcyBmb3IgYSBwb3BvdXQgd2luZG93LiBNYWtlIHN1cmUgYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciBpcyByZWFkeSBmb3IgZXZlbnRzLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBjb250YWluZXI/OiBIVE1MRWxlbWVudCxcclxuICAgICAgICBiaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyPzogVmlydHVhbExheW91dC5CaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyLFxyXG4gICAgICAgIHVuYmluZENvbXBvbmVudEV2ZW50SGFuZGxlcj86IFZpcnR1YWxMYXlvdXQuVW5iaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyLFxyXG4gICAgKTtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCBzcGVjaWZ5IGxheW91dENvbmZpZyBpbiB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpLmxvYWRMYXlvdXR9ICovXHJcbiAgICBjb25zdHJ1Y3Rvcihjb25maWc6IExheW91dENvbmZpZywgY29udGFpbmVyPzogSFRNTEVsZW1lbnQpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IoY29uZmlnT3JPcHRpb25hbENvbnRhaW5lcjogTGF5b3V0Q29uZmlnIHwgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgY29udGFpbmVyT3JCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyPzogSFRNTEVsZW1lbnQgfCBWaXJ0dWFsTGF5b3V0LkJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsXHJcbiAgICAgICAgdW5iaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyPzogVmlydHVhbExheW91dC5VbmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihjb25maWdPck9wdGlvbmFsQ29udGFpbmVyLCBjb250YWluZXJPckJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsIHVuYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciwgdHJ1ZSk7XHJcbiAgICAgICAgLy8gd2UgdG9sZCBWaXJ0dWFsTGF5b3V0IHRvIG5vdCBjYWxsIGluaXQoKSAoc2tpcEluaXQgc2V0IHRvIHRydWUpIHNvIHRoYXQgR29sZGVuIExheW91dCBjYW4gaW5pdGlhbGlzZSBpdHMgcHJvcGVydGllcyBiZWZvcmUgaW5pdCBpcyBjYWxsZWRcclxuICAgICAgICBpZiAoIXRoaXMuZGVwcmVjYXRlZENvbnN0cnVjdG9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVyIGEgbmV3IGNvbXBvbmVudCB0eXBlIHdpdGggdGhlIGxheW91dCBtYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBkZXByZWNhdGVkIFNlZSB7QGxpbmsgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDA5MjI1MzEvaG93LXRvLWNoZWNrLWlmLWEtamF2YXNjcmlwdC1mdW5jdGlvbi1pcy1hLWNvbnN0cnVjdG9yfVxyXG4gICAgICogaW5zdGVhZCB1c2Uge0BsaW5rIChHb2xkZW5MYXlvdXQ6Y2xhc3MpLnJlZ2lzdGVyQ29tcG9uZW50Q29uc3RydWN0b3J9XHJcbiAgICAgKiBvciB7QGxpbmsgKEdvbGRlbkxheW91dDpjbGFzcykucmVnaXN0ZXJDb21wb25lbnRGYWN0b3J5RnVuY3Rpb259XHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyQ29tcG9uZW50KG5hbWU6IHN0cmluZyxcclxuICAgICAgICBjb21wb25lbnRDb25zdHJ1Y3Rvck9yRmFjdG9yeUZ0bjogR29sZGVuTGF5b3V0LkNvbXBvbmVudENvbnN0cnVjdG9yIHwgR29sZGVuTGF5b3V0LkNvbXBvbmVudEZhY3RvcnlGdW5jdGlvbixcclxuICAgICAgICB2aXJ0dWFsID0gZmFsc2VcclxuICAgICk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50Q29uc3RydWN0b3JPckZhY3RvcnlGdG4gIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFwaUVycm9yKCdyZWdpc3RlckNvbXBvbmVudCgpIGNvbXBvbmVudENvbnN0cnVjdG9yT3JGYWN0b3J5RnRuIHBhcmFtZXRlciBpcyBub3QgYSBmdW5jdGlvbicpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudENvbnN0cnVjdG9yT3JGYWN0b3J5RnRuLmhhc093blByb3BlcnR5KCdwcm90b3R5cGUnKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50Q29uc3RydWN0b3IgPSBjb21wb25lbnRDb25zdHJ1Y3Rvck9yRmFjdG9yeUZ0biBhcyBHb2xkZW5MYXlvdXQuQ29tcG9uZW50Q29uc3RydWN0b3I7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyQ29tcG9uZW50Q29uc3RydWN0b3IobmFtZSwgY29tcG9uZW50Q29uc3RydWN0b3IsIHZpcnR1YWwpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50RmFjdG9yeUZ0biA9IGNvbXBvbmVudENvbnN0cnVjdG9yT3JGYWN0b3J5RnRuIGFzIEdvbGRlbkxheW91dC5Db21wb25lbnRGYWN0b3J5RnVuY3Rpb247XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyQ29tcG9uZW50RmFjdG9yeUZ1bmN0aW9uKG5hbWUsIGNvbXBvbmVudEZhY3RvcnlGdG4sIHZpcnR1YWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXIgYSBuZXcgY29tcG9uZW50IHR5cGUgd2l0aCB0aGUgbGF5b3V0IG1hbmFnZXIuXHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyQ29tcG9uZW50Q29uc3RydWN0b3IodHlwZU5hbWU6IHN0cmluZywgY29tcG9uZW50Q29uc3RydWN0b3I6IEdvbGRlbkxheW91dC5Db21wb25lbnRDb25zdHJ1Y3RvciwgdmlydHVhbCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnRDb25zdHJ1Y3RvciAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaTE4blN0cmluZ3NbSTE4blN0cmluZ0lkLlBsZWFzZVJlZ2lzdGVyQUNvbnN0cnVjdG9yRnVuY3Rpb25dKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQ29tcG9uZW50VHlwZSA9IHRoaXMuX2NvbXBvbmVudFR5cGVzTWFwLmdldCh0eXBlTmFtZSk7XHJcblxyXG4gICAgICAgIGlmIChleGlzdGluZ0NvbXBvbmVudFR5cGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQmluZEVycm9yKGAke2kxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5Db21wb25lbnRJc0FscmVhZHlSZWdpc3RlcmVkXX06ICR7dHlwZU5hbWV9YCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9jb21wb25lbnRUeXBlc01hcC5zZXQodHlwZU5hbWUsIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yOiBjb21wb25lbnRDb25zdHJ1Y3RvcixcclxuICAgICAgICAgICAgICAgIGZhY3RvcnlGdW5jdGlvbjogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgdmlydHVhbCxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWdpc3RlciBhIG5ldyBjb21wb25lbnQgd2l0aCB0aGUgbGF5b3V0IG1hbmFnZXIuXHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyQ29tcG9uZW50RmFjdG9yeUZ1bmN0aW9uKHR5cGVOYW1lOiBzdHJpbmcsIGNvbXBvbmVudEZhY3RvcnlGdW5jdGlvbjogR29sZGVuTGF5b3V0LkNvbXBvbmVudEZhY3RvcnlGdW5jdGlvbiwgdmlydHVhbCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnRGYWN0b3J5RnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEJpbmRFcnJvcignUGxlYXNlIHJlZ2lzdGVyIGEgY29uc3RydWN0b3IgZnVuY3Rpb24nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQ29tcG9uZW50VHlwZSA9IHRoaXMuX2NvbXBvbmVudFR5cGVzTWFwLmdldCh0eXBlTmFtZSk7XHJcblxyXG4gICAgICAgIGlmIChleGlzdGluZ0NvbXBvbmVudFR5cGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQmluZEVycm9yKGAke2kxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5Db21wb25lbnRJc0FscmVhZHlSZWdpc3RlcmVkXX06ICR7dHlwZU5hbWV9YCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9jb21wb25lbnRUeXBlc01hcC5zZXQodHlwZU5hbWUsIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICBmYWN0b3J5RnVuY3Rpb246IGNvbXBvbmVudEZhY3RvcnlGdW5jdGlvbixcclxuICAgICAgICAgICAgICAgIHZpcnR1YWwsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXIgYSBjb21wb25lbnQgZnVuY3Rpb24gd2l0aCB0aGUgbGF5b3V0IG1hbmFnZXIuIFRoaXMgZnVuY3Rpb24gc2hvdWxkXHJcbiAgICAgKiByZXR1cm4gYSBjb25zdHJ1Y3RvciBmb3IgYSBjb21wb25lbnQgYmFzZWQgb24gYSBjb25maWcuXHJcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGlmIGEgY29tcG9uZW50IHR5cGUgd2l0aCB0aGUgcmVxdWlyZWQgbmFtZSBpcyBub3QgYWxyZWFkeSByZWdpc3RlcmVkLlxyXG4gICAgICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBhcHBsaWNhdGlvbnMgdXNlIHRoZSB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLmdldENvbXBvbmVudEV2ZW50fSBhbmRcclxuICAgICAqIHtAbGluayAoVmlydHVhbExheW91dDpjbGFzcykucmVsZWFzZUNvbXBvbmVudEV2ZW50fSBpbnN0ZWFkIG9mIHJlZ2lzdGVyaW5nIGEgY29uc3RydWN0b3IgY2FsbGJhY2tcclxuICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKEdvbGRlbkxheW91dDpjbGFzcykucmVnaXN0ZXJHZXRDb21wb25lbnRDb25zdHJ1Y3RvckNhbGxiYWNrfVxyXG4gICAgICovXHJcbiAgICByZWdpc3RlckNvbXBvbmVudEZ1bmN0aW9uKGNhbGxiYWNrOiBHb2xkZW5MYXlvdXQuR2V0Q29tcG9uZW50Q29uc3RydWN0b3JDYWxsYmFjayk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVnaXN0ZXJHZXRDb21wb25lbnRDb25zdHJ1Y3RvckNhbGxiYWNrKGNhbGxiYWNrKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgY2xvc3VyZSB3aXRoIHRoZSBsYXlvdXQgbWFuYWdlciB3aGljaCBzdXBwbGllcyBhIENvbXBvbmVudCBDb25zdHJ1Y3Rvci5cclxuICAgICAqIFRoaXMgY2FsbGJhY2sgc2hvdWxkIHJldHVybiBhIGNvbnN0cnVjdG9yIGZvciBhIGNvbXBvbmVudCBiYXNlZCBvbiBhIGNvbmZpZy5cclxuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgaWYgYSBjb21wb25lbnQgdHlwZSB3aXRoIHRoZSByZXF1aXJlZCBuYW1lIGlzIG5vdCBhbHJlYWR5IHJlZ2lzdGVyZWQuXHJcbiAgICAgKiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IGFwcGxpY2F0aW9ucyB1c2UgdGhlIHtAbGluayAoVmlydHVhbExheW91dDpjbGFzcykuZ2V0Q29tcG9uZW50RXZlbnR9IGFuZFxyXG4gICAgICoge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS5yZWxlYXNlQ29tcG9uZW50RXZlbnR9IGluc3RlYWQgb2YgcmVnaXN0ZXJpbmcgYSBjb25zdHJ1Y3RvciBjYWxsYmFja1xyXG4gICAgICovXHJcbiAgICByZWdpc3RlckdldENvbXBvbmVudENvbnN0cnVjdG9yQ2FsbGJhY2soY2FsbGJhY2s6IEdvbGRlbkxheW91dC5HZXRDb21wb25lbnRDb25zdHJ1Y3RvckNhbGxiYWNrKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSByZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fZ2V0Q29tcG9uZW50Q29uc3RydWN0b3JGdG4gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ011bHRpcGxlIGNvbXBvbmVudCBmdW5jdGlvbnMgYXJlIGJlaW5nIHJlZ2lzdGVyZWQuICBPbmx5IHRoZSBmaW5hbCByZWdpc3RlcmVkIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZC4nKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZ2V0Q29tcG9uZW50Q29uc3RydWN0b3JGdG4gPSBjYWxsYmFjaztcclxuICAgIH1cclxuXHJcbiAgICBnZXRSZWdpc3RlcmVkQ29tcG9uZW50VHlwZU5hbWVzKCk6IHN0cmluZ1tdIHtcclxuICAgICAgICBjb25zdCB0eXBlTmFtZXNJdGVyYWJsZUl0ZXJhdG9yID0gdGhpcy5fY29tcG9uZW50VHlwZXNNYXAua2V5cygpO1xyXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHR5cGVOYW1lc0l0ZXJhYmxlSXRlcmF0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBjb21wb25lbnQgaW5zdGFudGlhdG9yLiAgQXR0ZW1wdHMgdG8gdXRpbGl6ZSByZWdpc3RlcmVkXHJcbiAgICAgKiBjb21wb25lbnQgdHlwZSBieSBmaXJzdCwgdGhlbiBmYWxscyBiYWNrIHRvIHRoZSBjb21wb25lbnQgY29uc3RydWN0b3IgY2FsbGJhY2sgZnVuY3Rpb24gKGlmIHJlZ2lzdGVyZWQpLlxyXG4gICAgICogSWYgbmVpdGhlciBnZXRzIGFuIGluc3RhbnRpYXRvciwgdGhlbiByZXR1cm5zIGB1bmRlZmluZWRgLlxyXG4gICAgICogTm90ZSB0aGF0IGB1bmRlZmluZWRgIHdpbGwgcmV0dXJuIGlmIGNvbmZpZy5jb21wb25lbnRUeXBlIGlzIG5vdCBhIHN0cmluZ1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBjb25maWcgLSBUaGUgaXRlbSBjb25maWdcclxuICAgICAqIEBwdWJsaWNcclxuICAgICAqL1xyXG4gICAgZ2V0Q29tcG9uZW50SW5zdGFudGlhdG9yKGNvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKTogR29sZGVuTGF5b3V0LkNvbXBvbmVudEluc3RhbnRpYXRvciB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgbGV0IGluc3RhbnRpYXRvcjogR29sZGVuTGF5b3V0LkNvbXBvbmVudEluc3RhbnRpYXRvciB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgY29uc3QgdHlwZU5hbWUgPSBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcucmVzb2x2ZUNvbXBvbmVudFR5cGVOYW1lKGNvbmZpZylcclxuICAgICAgICBpZiAodHlwZU5hbWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpbnN0YW50aWF0b3IgPSB0aGlzLl9jb21wb25lbnRUeXBlc01hcC5nZXQodHlwZU5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaW5zdGFudGlhdG9yID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2dldENvbXBvbmVudENvbnN0cnVjdG9yRnRuICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGluc3RhbnRpYXRvciA9IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogdGhpcy5fZ2V0Q29tcG9uZW50Q29uc3RydWN0b3JGdG4oY29uZmlnKSxcclxuICAgICAgICAgICAgICAgICAgICBmYWN0b3J5RnVuY3Rpb246IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSBiaW5kQ29tcG9uZW50KGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCBpdGVtQ29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpOiBDb21wb25lbnRDb250YWluZXIuQmluZGFibGVDb21wb25lbnQge1xyXG4gICAgICAgIGxldCBpbnN0YW50aWF0b3I6IEdvbGRlbkxheW91dC5Db21wb25lbnRJbnN0YW50aWF0b3IgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIGNvbnN0IHR5cGVOYW1lID0gUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLnJlc29sdmVDb21wb25lbnRUeXBlTmFtZShpdGVtQ29uZmlnKTtcclxuICAgICAgICBpZiAodHlwZU5hbWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpbnN0YW50aWF0b3IgPSB0aGlzLl9jb21wb25lbnRUeXBlc01hcC5nZXQodHlwZU5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaW5zdGFudGlhdG9yID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2dldENvbXBvbmVudENvbnN0cnVjdG9yRnRuICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGluc3RhbnRpYXRvciA9IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogdGhpcy5fZ2V0Q29tcG9uZW50Q29uc3RydWN0b3JGdG4oaXRlbUNvbmZpZyksXHJcbiAgICAgICAgICAgICAgICAgICAgZmFjdG9yeUZ1bmN0aW9uOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdmlydHVhbDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCByZXN1bHQ6IENvbXBvbmVudENvbnRhaW5lci5CaW5kYWJsZUNvbXBvbmVudDtcclxuICAgICAgICBpZiAoaW5zdGFudGlhdG9yICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29uc3QgdmlydHVhbCA9IGluc3RhbnRpYXRvci52aXJ0dWFsO1xyXG4gICAgICAgICAgICAvLyBoYW5kbGUgY2FzZSB3aGVyZSBjb21wb25lbnQgaXMgb2J0YWluZWQgYnkgbmFtZSBvciBjb21wb25lbnQgY29uc3RydWN0b3IgY2FsbGJhY2tcclxuICAgICAgICAgICAgbGV0IGNvbXBvbmVudFN0YXRlOiBKc29uVmFsdWUgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGlmIChpdGVtQ29uZmlnLmNvbXBvbmVudFN0YXRlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gbWFrZSBjb3B5XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRTdGF0ZSA9IGRlZXBFeHRlbmRWYWx1ZSh7fSwgaXRlbUNvbmZpZy5jb21wb25lbnRTdGF0ZSkgYXMgSnNvblZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgY29tcG9uZW50OiBDb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnRDb25zdHJ1Y3RvciA9IGluc3RhbnRpYXRvci5jb25zdHJ1Y3RvcjtcclxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudENvbnN0cnVjdG9yICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IG5ldyBjb21wb25lbnRDb25zdHJ1Y3Rvcihjb250YWluZXIsIGNvbXBvbmVudFN0YXRlLCB2aXJ0dWFsKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZhY3RvcnlGdW5jdGlvbiA9IGluc3RhbnRpYXRvci5mYWN0b3J5RnVuY3Rpb247XHJcbiAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeUZ1bmN0aW9uICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBmYWN0b3J5RnVuY3Rpb24oY29udGFpbmVyLCBjb21wb25lbnRTdGF0ZSwgdmlydHVhbCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignTE1CQ0ZGVTEwMDA4Jyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh2aXJ0dWFsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdHTEJDVkNVOTg4Nzc0Jyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpcnR1YWJsZUNvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBHb2xkZW5MYXlvdXQuVmlydHVhYmxlQ29tcG9uZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFJvb3RFbGVtZW50ID0gdmlydHVhYmxlQ29tcG9uZW50LnJvb3RIdG1sRWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Um9vdEVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmluZEVycm9yKGAke2kxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5WaXJ0dWFsQ29tcG9uZW50RG9lc05vdEhhdmVSb290SHRtbEVsZW1lbnRdfTogJHt0eXBlTmFtZX1gKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnN1cmVFbGVtZW50UG9zaXRpb25BYnNvbHV0ZShjb21wb25lbnRSb290RWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGNvbXBvbmVudFJvb3RFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmlydHVhYmxlQ29tcG9uZW50TWFwLnNldChjb250YWluZXIsIHZpcnR1YWJsZUNvbXBvbmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci52aXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQgPSB0aGlzLl9jb250YWluZXJWaXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnRMaXN0ZW5lcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLnZpcnR1YWxWaXNpYmlsaXR5Q2hhbmdlUmVxdWlyZWRFdmVudCA9IHRoaXMuX2NvbnRhaW5lclZpcnR1YWxWaXNpYmlsaXR5Q2hhbmdlUmVxdWlyZWRFdmVudExpc3RlbmVyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIudmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkRXZlbnQgPSB0aGlzLl9jb250YWluZXJWaXJ0dWFsWkluZGV4Q2hhbmdlUmVxdWlyZWRFdmVudExpc3RlbmVyO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZENvbXBvbmVudE1hcC5zZXQoY29udGFpbmVyLCBjb21wb25lbnQpO1xyXG5cclxuICAgICAgICAgICAgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgdmlydHVhbDogaW5zdGFudGlhdG9yLnZpcnR1YWwsXHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQsXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFVzZSBnZXRDb21wb25lbnRFdmVudFxyXG4gICAgICAgICAgICByZXN1bHQgPSBzdXBlci5iaW5kQ29tcG9uZW50KGNvbnRhaW5lciwgaXRlbUNvbmZpZyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG92ZXJyaWRlIHVuYmluZENvbXBvbmVudChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgdmlydHVhbDogYm9vbGVhbiwgY29tcG9uZW50OiBDb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50IHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgcmVnaXN0ZXJlZENvbXBvbmVudCA9IHRoaXMuX3JlZ2lzdGVyZWRDb21wb25lbnRNYXAuZ2V0KGNvbnRhaW5lcik7XHJcbiAgICAgICAgaWYgKHJlZ2lzdGVyZWRDb21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBzdXBlci51bmJpbmRDb21wb25lbnQoY29udGFpbmVyLCB2aXJ0dWFsLCBjb21wb25lbnQpOyAvLyB3YXMgbm90IGNyZWF0ZWQgZnJvbSByZWdpc3RyYXRpb24gc28gdXNlIHZpcnR1YWwgdW5iaW5kIGV2ZW50c1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZpcnR1YWJsZUNvbXBvbmVudCA9IHRoaXMuX3ZpcnR1YWJsZUNvbXBvbmVudE1hcC5nZXQoY29udGFpbmVyKTtcclxuICAgICAgICAgICAgaWYgKHZpcnR1YWJsZUNvbXBvbmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRSb290RWxlbWVudCA9IHZpcnR1YWJsZUNvbXBvbmVudC5yb290SHRtbEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Um9vdEVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignR0xVQzc3NzQzJywgY29udGFpbmVyLnRpdGxlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlQ2hpbGQoY29tcG9uZW50Um9vdEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZpcnR1YWJsZUNvbXBvbmVudE1hcC5kZWxldGUoY29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBmaXJlQmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudChjb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZ29sZGVuTGF5b3V0Qm91bmRpbmdDbGllbnRSZWN0ID0gdGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgc3VwZXIuZmlyZUJlZm9yZVZpcnR1YWxSZWN0aW5nRXZlbnQoY291bnQpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUNvbnRhaW5lclZpcnR1YWxSZWN0aW5nUmVxdWlyZWRFdmVudChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB2aXJ0dWFibGVDb21wb25lbnQgPSB0aGlzLl92aXJ0dWFibGVDb21wb25lbnRNYXAuZ2V0KGNvbnRhaW5lcik7XHJcbiAgICAgICAgaWYgKHZpcnR1YWJsZUNvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0dMSENTQ0U1NTkzMycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvb3RFbGVtZW50ID0gdmlydHVhYmxlQ29tcG9uZW50LnJvb3RIdG1sRWxlbWVudDtcclxuICAgICAgICAgICAgaWYgKHJvb3RFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBCaW5kRXJyb3IoaTE4blN0cmluZ3NbSTE4blN0cmluZ0lkLkNvbXBvbmVudElzTm90VmlydHVhYmxlXSArICcgJyArIGNvbnRhaW5lci50aXRsZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXJCb3VuZGluZ0NsaWVudFJlY3QgPSBjb250YWluZXIuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSBjb250YWluZXJCb3VuZGluZ0NsaWVudFJlY3QubGVmdCAtIHRoaXMuX2dvbGRlbkxheW91dEJvdW5kaW5nQ2xpZW50UmVjdC5sZWZ0O1xyXG4gICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQuc3R5bGUubGVmdCA9IG51bWJlclRvUGl4ZWxzKGxlZnQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdG9wID0gY29udGFpbmVyQm91bmRpbmdDbGllbnRSZWN0LnRvcCAtIHRoaXMuX2dvbGRlbkxheW91dEJvdW5kaW5nQ2xpZW50UmVjdC50b3A7XHJcbiAgICAgICAgICAgICAgICByb290RWxlbWVudC5zdHlsZS50b3AgPSBudW1iZXJUb1BpeGVscyh0b3ApO1xyXG4gICAgICAgICAgICAgICAgc2V0RWxlbWVudFdpZHRoKHJvb3RFbGVtZW50LCB3aWR0aCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHJvb3RFbGVtZW50LCBoZWlnaHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlQ29udGFpbmVyVmlydHVhbFZpc2liaWxpdHlDaGFuZ2VSZXF1aXJlZEV2ZW50KGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCB2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdmlydHVhYmxlQ29tcG9uZW50ID0gdGhpcy5fdmlydHVhYmxlQ29tcG9uZW50TWFwLmdldChjb250YWluZXIpO1xyXG4gICAgICAgIGlmICh2aXJ0dWFibGVDb21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdHTEhDVlZDUkU1NTkzNCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvb3RFbGVtZW50ID0gdmlydHVhYmxlQ29tcG9uZW50LnJvb3RIdG1sRWxlbWVudDtcclxuICAgICAgICAgICAgaWYgKHJvb3RFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBCaW5kRXJyb3IoaTE4blN0cmluZ3NbSTE4blN0cmluZ0lkLkNvbXBvbmVudElzTm90VmlydHVhYmxlXSArICcgJyArIGNvbnRhaW5lci50aXRsZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkocm9vdEVsZW1lbnQsIHZpc2libGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlQ29udGFpbmVyVmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkRXZlbnQoY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIGxvZ2ljYWxaSW5kZXg6IExvZ2ljYWxaSW5kZXgsIGRlZmF1bHRaSW5kZXg6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IHZpcnR1YWJsZUNvbXBvbmVudCA9IHRoaXMuX3ZpcnR1YWJsZUNvbXBvbmVudE1hcC5nZXQoY29udGFpbmVyKTtcclxuICAgICAgICBpZiAodmlydHVhYmxlQ29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignR0xIQ1ZaSUNSRTU1OTM1Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgcm9vdEVsZW1lbnQgPSB2aXJ0dWFibGVDb21wb25lbnQucm9vdEh0bWxFbGVtZW50O1xyXG4gICAgICAgICAgICBpZiAocm9vdEVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJpbmRFcnJvcihpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuQ29tcG9uZW50SXNOb3RWaXJ0dWFibGVdICsgJyAnICsgY29udGFpbmVyLnRpdGxlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50LnN0eWxlLnpJbmRleCA9IGRlZmF1bHRaSW5kZXg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgR29sZGVuTGF5b3V0IHtcclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgVmlydHVhYmxlQ29tcG9uZW50IHtcclxuICAgICAgICByb290SHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCB0eXBlIENvbXBvbmVudENvbnN0cnVjdG9yID0gbmV3KGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCBzdGF0ZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkLCB2aXJ0dWFsOiBib29sZWFuKSA9PiBDb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50O1xyXG4gICAgZXhwb3J0IHR5cGUgQ29tcG9uZW50RmFjdG9yeUZ1bmN0aW9uID0gKGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCBzdGF0ZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkLCB2aXJ0dWFsOiBib29sZWFuKSA9PiBDb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xyXG4gICAgZXhwb3J0IHR5cGUgR2V0Q29tcG9uZW50Q29uc3RydWN0b3JDYWxsYmFjayA9ICh0aGlzOiB2b2lkLCBjb25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZykgPT4gQ29tcG9uZW50Q29uc3RydWN0b3I7XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRJbnN0YW50aWF0b3Ige1xyXG4gICAgICAgIGNvbnN0cnVjdG9yOiBDb21wb25lbnRDb25zdHJ1Y3RvciB8IHVuZGVmaW5lZDtcclxuICAgICAgICBmYWN0b3J5RnVuY3Rpb246IENvbXBvbmVudEZhY3RvcnlGdW5jdGlvbiB8IHVuZGVmaW5lZDtcclxuICAgICAgICB2aXJ0dWFsOiBib29sZWFuO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZywgUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcsIFJlc29sdmVkTGF5b3V0Q29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL3Jlc29sdmVkLWNvbmZpZyc7XHJcbmltcG9ydCB7IENvbXBvbmVudENvbnRhaW5lciB9IGZyb20gJy4uL2NvbnRhaW5lci9jb21wb25lbnQtY29udGFpbmVyJztcclxuaW1wb3J0IHsgVGFiIH0gZnJvbSAnLi4vY29udHJvbHMvdGFiJztcclxuaW1wb3J0IHsgVW5leHBlY3RlZE51bGxFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IERvbUNvbnN0YW50cyB9IGZyb20gJy4uL3V0aWxzL2RvbS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBJdGVtVHlwZSwgSnNvblZhbHVlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQgeyBnZXRFbGVtZW50V2lkdGhBbmRIZWlnaHQsIHNldEVsZW1lbnRIZWlnaHQsIHNldEVsZW1lbnRXaWR0aCB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50UGFyZW50YWJsZUl0ZW0gfSBmcm9tICcuL2NvbXBvbmVudC1wYXJlbnRhYmxlLWl0ZW0nO1xyXG5pbXBvcnQgeyBDb250ZW50SXRlbSB9IGZyb20gJy4vY29udGVudC1pdGVtJztcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBjbGFzcyBDb21wb25lbnRJdGVtIGV4dGVuZHMgQ29udGVudEl0ZW0ge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfcmVvcmRlckVuYWJsZWQ6IGJvb2xlYW47XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9oZWFkZXJDb25maWc6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlciB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3RpdGxlOiBzdHJpbmc7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pbml0aWFsV2FudE1heGltaXNlOiBib29sZWFuO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXI7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF90YWI6IFRhYjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2ZvY3VzZWQgPSBmYWxzZTtcclxuXHJcbiAgICAvKiogQGludGVybmFsIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKENvbXBvbmVudEl0ZW06Y2xhc3MpLmNvbXBvbmVudFR5cGV9ICovXHJcbiAgICBnZXQgY29tcG9uZW50TmFtZSgpOiBKc29uVmFsdWUgeyByZXR1cm4gdGhpcy5fY29udGFpbmVyLmNvbXBvbmVudFR5cGU7IH1cclxuICAgIGdldCBjb21wb25lbnRUeXBlKCk6IEpzb25WYWx1ZSB7IHJldHVybiB0aGlzLl9jb250YWluZXIuY29tcG9uZW50VHlwZTsgfVxyXG4gICAgZ2V0IHJlb3JkZXJFbmFibGVkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fcmVvcmRlckVuYWJsZWQ7IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGdldCBpbml0aWFsV2FudE1heGltaXNlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5faW5pdGlhbFdhbnRNYXhpbWlzZTsgfVxyXG4gICAgZ2V0IGNvbXBvbmVudCgpOiBDb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50IHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2NvbnRhaW5lci5jb21wb25lbnQ7IH1cclxuICAgIGdldCBjb250YWluZXIoKTogQ29tcG9uZW50Q29udGFpbmVyIHsgcmV0dXJuIHRoaXMuX2NvbnRhaW5lcjsgfVxyXG4gICAgZ2V0IHBhcmVudEl0ZW0oKTogQ29tcG9uZW50UGFyZW50YWJsZUl0ZW0geyByZXR1cm4gdGhpcy5fcGFyZW50SXRlbTsgfVxyXG5cclxuICAgIGdldCBoZWFkZXJDb25maWcoKTogUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2hlYWRlckNvbmZpZzsgfVxyXG4gICAgZ2V0IHRpdGxlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl90aXRsZTsgfVxyXG4gICAgZ2V0IHRhYigpOiBUYWIgeyByZXR1cm4gdGhpcy5fdGFiOyB9XHJcbiAgICBnZXQgZm9jdXNlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2ZvY3VzZWQ7IH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBsYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgIGNvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9wYXJlbnRJdGVtOiBDb21wb25lbnRQYXJlbnRhYmxlSXRlbVxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIobGF5b3V0TWFuYWdlciwgY29uZmlnLCBfcGFyZW50SXRlbSwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpO1xyXG5cclxuICAgICAgICB0aGlzLmlzQ29tcG9uZW50ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVvcmRlckVuYWJsZWQgPSBjb25maWcucmVvcmRlckVuYWJsZWQ7XHJcblxyXG4gICAgICAgIHRoaXMuYXBwbHlVcGRhdGFibGVDb25maWcoY29uZmlnKTtcclxuXHJcbiAgICAgICAgdGhpcy5faW5pdGlhbFdhbnRNYXhpbWlzZSA9IGNvbmZpZy5tYXhpbWlzZWQ7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBjb250YWluZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Db250ZW50KTtcclxuICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoY29udGFpbmVyRWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyID0gbmV3IENvbXBvbmVudENvbnRhaW5lcihjb25maWcsIHRoaXMsIGxheW91dE1hbmFnZXIsIGNvbnRhaW5lckVsZW1lbnQsXHJcbiAgICAgICAgICAgIChpdGVtQ29uZmlnKSA9PiB0aGlzLmhhbmRsZVVwZGF0ZUl0ZW1Db25maWdFdmVudChpdGVtQ29uZmlnKSxcclxuICAgICAgICAgICAgKCkgPT4gdGhpcy5zaG93KCksXHJcbiAgICAgICAgICAgICgpID0+IHRoaXMuaGlkZSgpLFxyXG4gICAgICAgICAgICAoc3VwcHJlc3NFdmVudCkgPT4gdGhpcy5mb2N1cyhzdXBwcmVzc0V2ZW50KSxcclxuICAgICAgICAgICAgKHN1cHByZXNzRXZlbnQpID0+IHRoaXMuYmx1cihzdXBwcmVzc0V2ZW50KSxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG92ZXJyaWRlIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmRlc3Ryb3koKVxyXG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICBhcHBseVVwZGF0YWJsZUNvbmZpZyhjb25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2V0VGl0bGUoY29uZmlnLnRpdGxlKTtcclxuICAgICAgICB0aGlzLl9oZWFkZXJDb25maWcgPSBjb25maWcuaGVhZGVyO1xyXG4gICAgfVxyXG5cclxuICAgIHRvQ29uZmlnKCk6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3Qgc3RhdGVSZXF1ZXN0RXZlbnQgPSB0aGlzLl9jb250YWluZXIuc3RhdGVSZXF1ZXN0RXZlbnQ7XHJcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBzdGF0ZVJlcXVlc3RFdmVudCA9PT0gdW5kZWZpbmVkID8gdGhpcy5fY29udGFpbmVyLnN0YXRlIDogc3RhdGVSZXF1ZXN0RXZlbnQoKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLmNvbXBvbmVudCxcclxuICAgICAgICAgICAgY29udGVudDogW10sXHJcbiAgICAgICAgICAgIHNpemU6IHRoaXMuc2l6ZSxcclxuICAgICAgICAgICAgc2l6ZVVuaXQ6IHRoaXMuc2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIG1pblNpemU6IHRoaXMubWluU2l6ZSxcclxuICAgICAgICAgICAgbWluU2l6ZVVuaXQ6IHRoaXMubWluU2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxyXG4gICAgICAgICAgICBtYXhpbWlzZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiB0aGlzLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgICAgIHJlb3JkZXJFbmFibGVkOiB0aGlzLl9yZW9yZGVyRW5hYmxlZCxcclxuICAgICAgICAgICAgdGl0bGU6IHRoaXMuX3RpdGxlLFxyXG4gICAgICAgICAgICBoZWFkZXI6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlci5jcmVhdGVDb3B5KHRoaXMuX2hlYWRlckNvbmZpZyksXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFR5cGU6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZy5jb3B5Q29tcG9uZW50VHlwZSh0aGlzLmNvbXBvbmVudFR5cGUpLFxyXG4gICAgICAgICAgICBjb21wb25lbnRTdGF0ZTogc3RhdGUsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignQ0lDNjg4ODMnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5yZW1vdmVDaGlsZCh0aGlzLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFVzZWQgYnkgRHJhZyBQcm94eVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZW50ZXJEcmFnTW9kZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHNldEVsZW1lbnRXaWR0aCh0aGlzLmVsZW1lbnQsIHdpZHRoKTtcclxuICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHRoaXMuZWxlbWVudCwgaGVpZ2h0KTtcclxuICAgICAgICB0aGlzLl9jb250YWluZXIuZW50ZXJEcmFnTW9kZSh3aWR0aCwgaGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleGl0RHJhZ01vZGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmV4aXREcmFnTW9kZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGVudGVyU3RhY2tNYXhpbWlzZWQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmVudGVyU3RhY2tNYXhpbWlzZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleGl0U3RhY2tNYXhpbWlzZWQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmV4aXRTdGFja01heGltaXNlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFVzZWQgYnkgRHJhZyBQcm94eVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZHJhZygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9jb250YWluZXIuZHJhZygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGdldE91dGVyQm91bmRpbmdDbGllbnRSZWN0KCk6IERPTVJlY3QgeyBcclxuICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IHNob3cgPSB0aGlzLmhlYWRlckNvbmZpZz8uc2hvdztcclxuICAgICAgICBjb25zdCBoZWlnaHQgPSBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmRlZmF1bHRzLmhlYWRlckhlaWdodDtcclxuXHJcbiAgICAgICAgY29uc3QgaGVhZGVyV2lkdGggPSAoc2hvdyA9PT0gJ2xlZnQnIHx8IHNob3cgPT09ICdyaWdodCcpID8gaGVpZ2h0IDogMDtcclxuICAgICAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSAoc2hvdyA9PT0gJ3RvcCcgfHwgc2hvdyA9PT0gJ2JvdHRvbScgfHwgc2hvdyA9PT0gdW5kZWZpbmVkKSA/IGhlaWdodCA6IDA7XHJcblxyXG4gICAgICAgIHJldHVybiBET01SZWN0LmZyb21SZWN0KHtcclxuICAgICAgICAgICAgeDogcmVjdC5sZWZ0IC0gaGVhZGVyV2lkdGgsXHJcbiAgICAgICAgICAgIHk6IHJlY3QudG9wIC0gaGVhZGVySGVpZ2h0LFxyXG4gICAgICAgICAgICB3aWR0aDogcmVjdC53aWR0aCArIGhlYWRlcldpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0ICsgaGVhZGVySGVpZ2h0LFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG92ZXJyaWRlIHVwZGF0ZVNpemUoZm9yY2U6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZU5vZGVTaXplKGZvcmNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSBpbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXBkYXRlTm9kZVNpemUoZmFsc2UpO1xyXG5cclxuICAgICAgICBzdXBlci5pbml0KCk7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmVtaXQoJ29wZW4nKTtcclxuICAgICAgICB0aGlzLmluaXRDb250ZW50SXRlbXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGlzIGNvbXBvbmVudCdzIHRpdGxlXHJcbiAgICAgKlxyXG4gICAgICogQHB1YmxpY1xyXG4gICAgICogQHBhcmFtIHRpdGxlIC1cclxuICAgICAqL1xyXG5cclxuICAgIHNldFRpdGxlKHRpdGxlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl90aXRsZSA9IHRpdGxlO1xyXG4gICAgICAgIHRoaXMuZW1pdCgndGl0bGVDaGFuZ2VkJywgdGl0bGUpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnc3RhdGVDaGFuZ2VkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VGFiKHRhYjogVGFiKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdGFiID0gdGFiO1xyXG4gICAgICAgIHRoaXMuZW1pdCgndGFiJywgdGFiKVxyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5zZXRUYWIodGFiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSBoaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLmhpZGUoKTtcclxuICAgICAgICB0aGlzLl9jb250YWluZXIuc2V0VmlzaWJpbGl0eShmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgc2hvdygpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5zaG93KCk7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLnNldFZpc2liaWxpdHkodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGb2N1c2VzIHRoZSBpdGVtIGlmIGl0IGlzIG5vdCBhbHJlYWR5IGZvY3VzZWRcclxuICAgICAqL1xyXG4gICAgZm9jdXMoc3VwcHJlc3NFdmVudCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wYXJlbnRJdGVtLnNldEFjdGl2ZUNvbXBvbmVudEl0ZW0odGhpcywgdHJ1ZSwgc3VwcHJlc3NFdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc2V0Rm9jdXNlZChzdXBwcmVzc0V2ZW50OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZm9jdXNlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy50YWIuc2V0Rm9jdXNlZCgpO1xyXG4gICAgICAgIGlmICghc3VwcHJlc3NFdmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnZm9jdXMnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCbHVycyAoZGVmb2N1c2VzKSB0aGUgaXRlbSBpZiBpdCBpcyBmb2N1c2VkXHJcbiAgICAgKi9cclxuICAgIGJsdXIoc3VwcHJlc3NFdmVudCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2ZvY3VzZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLnNldEZvY3VzZWRDb21wb25lbnRJdGVtKHVuZGVmaW5lZCwgc3VwcHJlc3NFdmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHNldEJsdXJyZWQoc3VwcHJlc3NFdmVudDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2ZvY3VzZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnRhYi5zZXRCbHVycmVkKCk7XHJcbiAgICAgICAgaWYgKCFzdXBwcmVzc0V2ZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdEJhc2VCdWJibGluZ0V2ZW50KCdibHVyJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBzZXRQYXJlbnQocGFyZW50OiBDb250ZW50SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3BhcmVudEl0ZW0gPSBwYXJlbnQgYXMgQ29tcG9uZW50UGFyZW50YWJsZUl0ZW07XHJcbiAgICAgICAgc3VwZXIuc2V0UGFyZW50KHBhcmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVVcGRhdGVJdGVtQ29uZmlnRXZlbnQoaXRlbUNvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKSB7XHJcbiAgICAgICAgdGhpcy5hcHBseVVwZGF0YWJsZUNvbmZpZyhpdGVtQ29uZmlnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZU5vZGVTaXplKGZvcmNlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScpIHtcclxuICAgICAgICAgICAgLy8gRG8gbm90IHVwZGF0ZSBzaXplIG9mIGhpZGRlbiBjb21wb25lbnRzIHRvIHByZXZlbnQgdW53YW50ZWQgcmVmbG93c1xyXG5cclxuICAgICAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBnZXRFbGVtZW50V2lkdGhBbmRIZWlnaHQodGhpcy5lbGVtZW50KTtcclxuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLnNldFNpemVUb05vZGVTaXplKHdpZHRoLCBoZWlnaHQsIGZvcmNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKENvbXBvbmVudEl0ZW06Y2xhc3MpfSAqL1xyXG5leHBvcnQgdHlwZSBDb21wb25lbnQgPSBDb21wb25lbnRJdGVtO1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBDb21wb25lbnRJdGVtIHtcclxuICAgIGV4cG9ydCB0eXBlIENvbXBvbmVudCA9IENvbXBvbmVudENvbnRhaW5lci5Db21wb25lbnQ7XHJcbn1cclxuIiwiaW1wb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4vY29tcG9uZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBDb250ZW50SXRlbSB9IGZyb20gJy4vY29udGVudC1pdGVtJztcclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb21wb25lbnRQYXJlbnRhYmxlSXRlbSBleHRlbmRzIENvbnRlbnRJdGVtIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2ZvY3VzZWQgPSBmYWxzZTtcclxuXHJcbiAgICBnZXQgZm9jdXNlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2ZvY3VzZWQ7IH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzZXRGb2N1c2VkVmFsdWUodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9mb2N1c2VkID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgYWJzdHJhY3Qgc2V0QWN0aXZlQ29tcG9uZW50SXRlbShpdGVtOiBDb21wb25lbnRJdGVtLCBmb2N1czogYm9vbGVhbiwgc3VwcHJlc3NGb2N1c0V2ZW50OiBib29sZWFuKTogdm9pZDtcclxufVxyXG4iLCJpbXBvcnQgeyBSZXNvbHZlZEl0ZW1Db25maWcgfSBmcm9tICcuLi9jb25maWcvcmVzb2x2ZWQtY29uZmlnJ1xyXG5pbXBvcnQgeyBCcm93c2VyUG9wb3V0IH0gZnJvbSAnLi4vY29udHJvbHMvYnJvd3Nlci1wb3BvdXQnXHJcbmltcG9ydCB7IEFzc2VydEVycm9yLCBVbmV4cGVjdGVkTnVsbEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJ1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi4vbGF5b3V0LW1hbmFnZXInXHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LWVtaXR0ZXInXHJcbmltcG9ydCB7IEFyZWFMaW5rZWRSZWN0LCBJdGVtVHlwZSwgU2l6ZVVuaXRFbnVtIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnXHJcbmltcG9ydCB7IGdldFVuaXF1ZUlkLCBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkgfSBmcm9tICcuLi91dGlscy91dGlscydcclxuaW1wb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4vY29tcG9uZW50LWl0ZW0nXHJcbmltcG9ydCB7IENvbXBvbmVudFBhcmVudGFibGVJdGVtIH0gZnJvbSAnLi9jb21wb25lbnQtcGFyZW50YWJsZS1pdGVtJ1xyXG5pbXBvcnQgeyBTdGFjayB9IGZyb20gJy4vc3RhY2snXHJcblxyXG4vKipcclxuICogVGhpcyBpcyB0aGUgYmFzZWNsYXNzIHRoYXQgYWxsIGNvbnRlbnQgaXRlbXMgaW5oZXJpdCBmcm9tLlxyXG4gKiBNb3N0IG1ldGhvZHMgcHJvdmlkZSBhIHN1YnNldCBvZiB3aGF0IHRoZSBzdWItY2xhc3NlcyBkby5cclxuICpcclxuICogSXQgYWxzbyBwcm92aWRlcyBhIG51bWJlciBvZiBmdW5jdGlvbnMgZm9yIHRyZWUgdHJhdmVyc2FsXHJcbiAqIEBwdWJsaWNcclxuICovXHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29udGVudEl0ZW0gZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfdHlwZTogSXRlbVR5cGU7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9pZDogc3RyaW5nO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfcG9wSW5QYXJlbnRJZHM6IHN0cmluZ1tdID0gW107XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9jb250ZW50SXRlbXM6IENvbnRlbnRJdGVtW107XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9pc0Nsb3NhYmxlO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfcGVuZGluZ0V2ZW50UHJvcGFnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3Rocm90dGxlZEV2ZW50czogc3RyaW5nW107XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9pc0luaXRpYWxpc2VkO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHNpemU6IG51bWJlcjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHNpemVVbml0OiBTaXplVW5pdEVudW07XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBtaW5TaXplOiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBtaW5TaXplVW5pdDogU2l6ZVVuaXRFbnVtO1xyXG5cclxuICAgIGlzR3JvdW5kOiBib29sZWFuXHJcbiAgICBpc1JvdzogYm9vbGVhblxyXG4gICAgaXNDb2x1bW46IGJvb2xlYW5cclxuICAgIGlzU3RhY2s6IGJvb2xlYW5cclxuICAgIGlzQ29tcG9uZW50OiBib29sZWFuXHJcblxyXG4gICAgZ2V0IHR5cGUoKTogSXRlbVR5cGUgeyByZXR1cm4gdGhpcy5fdHlwZTsgfVxyXG4gICAgZ2V0IGlkKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9pZDsgfVxyXG4gICAgc2V0IGlkKHZhbHVlOiBzdHJpbmcpIHsgdGhpcy5faWQgPSB2YWx1ZTsgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZ2V0IHBvcEluUGFyZW50SWRzKCk6IHN0cmluZ1tdIHsgcmV0dXJuIHRoaXMuX3BvcEluUGFyZW50SWRzOyB9XHJcbiAgICBnZXQgcGFyZW50KCk6IENvbnRlbnRJdGVtIHwgbnVsbCB7IHJldHVybiB0aGlzLl9wYXJlbnQ7IH1cclxuICAgIGdldCBjb250ZW50SXRlbXMoKTogQ29udGVudEl0ZW1bXSB7IHJldHVybiB0aGlzLl9jb250ZW50SXRlbXM7IH1cclxuICAgIGdldCBpc0Nsb3NhYmxlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5faXNDbG9zYWJsZTsgfVxyXG4gICAgZ2V0IGVsZW1lbnQoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdGhpcy5fZWxlbWVudDsgfVxyXG4gICAgZ2V0IGlzSW5pdGlhbGlzZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9pc0luaXRpYWxpc2VkOyB9XHJcblxyXG4gICAgc3RhdGljIGlzU3RhY2soaXRlbTogQ29udGVudEl0ZW0pOiBpdGVtIGlzIFN0YWNrIHtcclxuICAgICAgICByZXR1cm4gaXRlbS5pc1N0YWNrO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc0NvbXBvbmVudEl0ZW0oaXRlbTogQ29udGVudEl0ZW0pOiBpdGVtIGlzIENvbXBvbmVudEl0ZW0ge1xyXG4gICAgICAgIHJldHVybiBpdGVtLmlzQ29tcG9uZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc0NvbXBvbmVudFBhcmVudGFibGVJdGVtKGl0ZW06IENvbnRlbnRJdGVtKTogaXRlbSBpcyBDb21wb25lbnRQYXJlbnRhYmxlSXRlbSB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW0uaXNTdGFjayB8fCBpdGVtLmlzR3JvdW5kO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBsYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgIGNvbmZpZzogUmVzb2x2ZWRJdGVtQ29uZmlnLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9wYXJlbnQ6IENvbnRlbnRJdGVtIHwgbnVsbCxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudDogSFRNTEVsZW1lbnRcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3R5cGUgPSBjb25maWcudHlwZTtcclxuICAgICAgICB0aGlzLl9pZCA9IGNvbmZpZy5pZDtcclxuXHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXNlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNHcm91bmQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzUm93ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc0NvbHVtbiA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNTdGFjayA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNDb21wb25lbnQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5zaXplID0gY29uZmlnLnNpemU7XHJcbiAgICAgICAgdGhpcy5zaXplVW5pdCA9IGNvbmZpZy5zaXplVW5pdDtcclxuICAgICAgICB0aGlzLm1pblNpemUgPSBjb25maWcubWluU2l6ZTtcclxuICAgICAgICB0aGlzLm1pblNpemVVbml0ID0gY29uZmlnLm1pblNpemVVbml0O1xyXG5cclxuICAgICAgICB0aGlzLl9pc0Nsb3NhYmxlID0gY29uZmlnLmlzQ2xvc2FibGU7XHJcblxyXG4gICAgICAgIHRoaXMuX3BlbmRpbmdFdmVudFByb3BhZ2F0aW9ucyA9IHt9O1xyXG4gICAgICAgIHRoaXMuX3Rocm90dGxlZEV2ZW50cyA9IFsnc3RhdGVDaGFuZ2VkJ107XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbnRlbnRJdGVtcyA9IHRoaXMuY3JlYXRlQ29udGVudEl0ZW1zKGNvbmZpZy5jb250ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXJzIHRoZSBzaXplIG9mIHRoZSBjb21wb25lbnQgYW5kIGl0cyBjaGlsZHJlbiwgY2FsbGVkIHJlY3Vyc2l2ZWx5XHJcbiAgICAgKiBAcGFyYW0gZm9yY2UgLSBJbiBzb21lIGNhc2VzIHRoZSBzaXplIGlzIG5vdCB1cGRhdGVkIGlmIGl0IGhhcyBub3QgY2hhbmdlZC4gSW4gdGhpcyBjYXNlLCBldmVudHNcclxuICAgICAqIChzdWNoIGFzIENvbXBvbmVudENvbnRhaW5lci52aXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQpIGFyZSBub3QgZmlyZWQuIFNldHRpbmcgZm9yY2UgdG8gdHJ1ZSwgZW5zdXJlcyB0aGUgc2l6ZSBpcyB1cGRhdGVkIHJlZ2FyZGxlc3MsIGFuZFxyXG4gICAgICogdGhlIHJlc3BlY3RpdmUgZXZlbnRzIGFyZSBmaXJlZC4gVGhpcyBpcyBzb21ldGltZXMgbmVjZXNzYXJ5IHdoZW4gYSBjb21wb25lbnQncyBzaXplIGhhcyBub3QgY2hhbmdlZCBidXQgaXQgaGFzIGJlY29tZSB2aXNpYmxlLCBhbmQgdGhlXHJcbiAgICAgKiByZWxldmFudCBldmVudHMgbmVlZCB0byBiZSBmaXJlZC5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBhYnN0cmFjdCB1cGRhdGVTaXplKGZvcmNlOiBib29sZWFuKTogdm9pZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYSBjaGlsZCBub2RlIChhbmQgaXRzIGNoaWxkcmVuKSBmcm9tIHRoZSB0cmVlXHJcbiAgICAgKiBAcGFyYW0gY29udGVudEl0ZW0gLSBUaGUgY2hpbGQgaXRlbSB0byByZW1vdmVcclxuICAgICAqIEBwYXJhbSBrZWVwQ2hpbGQgLSBXaGV0aGVyIHRvIGRlc3Ryb3kgdGhlIHJlbW92ZWQgaXRlbVxyXG4gICAgICovXHJcbiAgICByZW1vdmVDaGlsZChjb250ZW50SXRlbTogQ29udGVudEl0ZW0sIGtlZXBDaGlsZCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgLypcclxuICAgICAgICAgKiBHZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBpdGVtIHRoYXQncyB0byBiZSByZW1vdmVkIHdpdGhpbiBhbGwgY29udGVudCBpdGVtcyB0aGlzIG5vZGUgY29udGFpbnNcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2NvbnRlbnRJdGVtcy5pbmRleE9mKGNvbnRlbnRJdGVtKTtcclxuXHJcbiAgICAgICAgLypcclxuICAgICAgICAgKiBNYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXRlbSB0byBiZSByZW1vdmVkIGlzIGFjdHVhbGx5IGEgY2hpbGQgb2YgdGhpcyBpdGVtXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgcmVtb3ZlIGNoaWxkIGl0ZW0uIFVua25vd24gY29udGVudCBpdGVtJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuXHRcdCAqIENhbGwgZGVzdHJveSBvbiB0aGUgY29udGVudCBpdGVtLlxyXG5cdFx0ICogQWxsIGNoaWxkcmVuIGFyZSBkZXN0cm95ZWQgYXMgd2VsbFxyXG5cdFx0ICovXHJcbiAgICAgICAgaWYgKCFrZWVwQ2hpbGQpIHtcclxuXHRcdFx0dGhpcy5fY29udGVudEl0ZW1zW2luZGV4XS5kZXN0cm95KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBSZW1vdmUgdGhlIGNvbnRlbnQgaXRlbSBmcm9tIHRoaXMgbm9kZXMgYXJyYXkgb2YgY2hpbGRyZW5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9jb250ZW50SXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdGhpcyBub2RlIHN0aWxsIGNvbnRhaW5zIG90aGVyIGNvbnRlbnQgaXRlbXMsIGFkanVzdCB0aGVpciBzaXplXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbnRlbnRJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZShmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIElmIHRoaXMgd2FzIHRoZSBsYXN0IGNvbnRlbnQgaXRlbSwgcmVtb3ZlIHRoaXMgbm9kZSBhcyB3ZWxsXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAvLyBpZiAoIXRoaXMuaXNHcm91bmQgJiYgdGhpcy5faXNDbG9zYWJsZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNHcm91bmQpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignQ0lVQzAwODc0Jyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdXAgdGhlIHRyZWUgc3RydWN0dXJlIGZvciB0aGUgbmV3bHkgYWRkZWQgY2hpbGRcclxuICAgICAqIFRoZSByZXNwb25zaWJpbGl0eSBmb3IgdGhlIGFjdHVhbCBET00gbWFuaXB1bGF0aW9ucyBsaWVzXHJcbiAgICAgKiB3aXRoIHRoZSBjb25jcmV0ZSBpdGVtXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNvbnRlbnRJdGVtIC1cclxuICAgICAqIEBwYXJhbSBpbmRleCAtIElmIG9taXR0ZWQgaXRlbSB3aWxsIGJlIGFwcGVuZGVkXHJcbiAgICAgKiBAcGFyYW0gc3VzcGVuZFJlc2l6ZSAtIFVzZWQgYnkgZGVzY2VuZGVudCBpbXBsZW1lbnRhdGlvbnNcclxuICAgICAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgYWRkQ2hpbGQoY29udGVudEl0ZW06IENvbnRlbnRJdGVtLCBpbmRleD86IG51bWJlciB8IG51bGwsIHN1c3BlbmRSZXNpemU/OiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgICAgICBpbmRleCA/Pz0gdGhpcy5fY29udGVudEl0ZW1zLmxlbmd0aDtcclxuXHJcbiAgICAgICAgdGhpcy5fY29udGVudEl0ZW1zLnNwbGljZShpbmRleCwgMCwgY29udGVudEl0ZW0pO1xyXG4gICAgICAgIGNvbnRlbnRJdGVtLnNldFBhcmVudCh0aGlzKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbGlzZWQgPT09IHRydWUgJiYgY29udGVudEl0ZW0uX2lzSW5pdGlhbGlzZWQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGNvbnRlbnRJdGVtLmluaXQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBpbmRleDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlcGxhY2VzIG9sZENoaWxkIHdpdGggbmV3Q2hpbGRcclxuICAgICAqIEBwYXJhbSBvbGRDaGlsZCAtXHJcbiAgICAgKiBAcGFyYW0gbmV3Q2hpbGQgLVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHJlcGxhY2VDaGlsZChvbGRDaGlsZDogQ29udGVudEl0ZW0sIG5ld0NoaWxkOiBDb250ZW50SXRlbSwgZGVzdHJveU9sZENoaWxkID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICAvLyBEbyBub3QgdHJ5IHRvIHJlcGxhY2UgQ29tcG9uZW50SXRlbSAtIHdpbGwgbm90IHdvcmtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2NvbnRlbnRJdGVtcy5pbmRleE9mKG9sZENoaWxkKTtcclxuICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gb2xkQ2hpbGQuX2VsZW1lbnQucGFyZW50Tm9kZTtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0NJUkNJMjMyMzInLCAnQ2FuXFwndCByZXBsYWNlIGNoaWxkLiBvbGRDaGlsZCBpcyBub3QgY2hpbGQgb2YgdGhpcycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBhcmVudE5vZGUgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0NJUkNQMjMyMzInKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdDaGlsZC5fZWxlbWVudCwgb2xkQ2hpbGQuX2VsZW1lbnQpO1xyXG5cclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgKiBPcHRpb25hbGx5IGRlc3Ryb3kgdGhlIG9sZCBjb250ZW50IGl0ZW1cclxuICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgaWYgKGRlc3Ryb3lPbGRDaGlsZCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgb2xkQ2hpbGQuX3BhcmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBvbGRDaGlsZC5kZXN0cm95KCk7IC8vIHdpbGwgbm93IGFsc28gZGVzdHJveSBhbGwgY2hpbGRyZW4gb2Ygb2xkQ2hpbGRcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgKiBXaXJlIHRoZSBuZXcgY29udGVudEl0ZW0gaW50byB0aGUgdHJlZVxyXG4gICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICB0aGlzLl9jb250ZW50SXRlbXNbaW5kZXhdID0gbmV3Q2hpbGQ7XHJcbiAgICAgICAgICAgIG5ld0NoaWxkLnNldFBhcmVudCh0aGlzKTtcclxuICAgICAgICAgICAgLy8gbmV3Q2hpbGQgaW5oZXJpdHMgdGhlIHNpemVzIGZyb20gdGhlIG9sZCBjaGlsZDpcclxuICAgICAgICAgICAgbmV3Q2hpbGQuc2l6ZSA9IG9sZENoaWxkLnNpemU7XHJcbiAgICAgICAgICAgIG5ld0NoaWxkLnNpemVVbml0ID0gb2xkQ2hpbGQuc2l6ZVVuaXQ7XHJcbiAgICAgICAgICAgIG5ld0NoaWxkLm1pblNpemUgPSBvbGRDaGlsZC5taW5TaXplO1xyXG4gICAgICAgICAgICBuZXdDaGlsZC5taW5TaXplVW5pdCA9IG9sZENoaWxkLm1pblNpemVVbml0O1xyXG5cclxuICAgICAgICAgICAgLy9UT0RPIFRoaXMgZG9lc24ndCB1cGRhdGUgdGhlIGNvbmZpZy4uLiByZWZhY3RvciB0byBsZWF2ZSBpdGVtIG5vZGVzIHVudG91Y2hlZCBhZnRlciBjcmVhdGlvblxyXG4gICAgICAgICAgICBpZiAobmV3Q2hpbGQuX3BhcmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0NJUkNOQzQ1Njk5Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobmV3Q2hpbGQuX3BhcmVudC5faXNJbml0aWFsaXNlZCA9PT0gdHJ1ZSAmJiBuZXdDaGlsZC5faXNJbml0aWFsaXNlZCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXdDaGlsZC5pbml0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlbmllbmNlIG1ldGhvZC5cclxuICAgICAqIFNob3J0aGFuZCBmb3IgdGhpcy5wYXJlbnQucmVtb3ZlQ2hpbGQoIHRoaXMgKVxyXG4gICAgICovXHJcbiAgICByZW1vdmUoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BhcmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignQ0lSMTExMTAnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9wYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyB0aGUgY29tcG9uZW50IGZyb20gdGhlIGxheW91dCBhbmQgY3JlYXRlcyBhIG5ld1xyXG4gICAgICogYnJvd3NlciB3aW5kb3cgd2l0aCB0aGUgY29tcG9uZW50IGFuZCBpdHMgY2hpbGRyZW4gaW5zaWRlXHJcbiAgICAgKi9cclxuICAgIHBvcG91dCgpOiBCcm93c2VyUG9wb3V0IHtcclxuICAgICAgICBjb25zdCBwYXJlbnRJZCA9IGdldFVuaXF1ZUlkKCk7XHJcbiAgICAgICAgY29uc3QgYnJvd3NlclBvcG91dCA9IHRoaXMubGF5b3V0TWFuYWdlci5jcmVhdGVQb3BvdXRGcm9tQ29udGVudEl0ZW0odGhpcywgdW5kZWZpbmVkLCBwYXJlbnRJZCwgdW5kZWZpbmVkKTtcclxuICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnc3RhdGVDaGFuZ2VkJyk7XHJcbiAgICAgICAgcmV0dXJuIGJyb3dzZXJQb3BvdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgYWJzdHJhY3QgdG9Db25maWcoKTogUmVzb2x2ZWRJdGVtQ29uZmlnO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNhbGN1bGF0ZUNvbmZpZ0NvbnRlbnQoKTogUmVzb2x2ZWRJdGVtQ29uZmlnW10ge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtcyA9IHRoaXMuX2NvbnRlbnRJdGVtcztcclxuICAgICAgICBjb25zdCBjb3VudCA9IGNvbnRlbnRJdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PFJlc29sdmVkSXRlbUNvbmZpZz4oY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICByZXN1bHRbaV0gPSBpdGVtLnRvQ29uZmlnKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgaGlnaGxpZ2h0RHJvcFpvbmUoeDogbnVtYmVyLCB5OiBudW1iZXIsIGFyZWE6IEFyZWFMaW5rZWRSZWN0KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZHJvcFRhcmdldEluZGljYXRvciA9IHRoaXMubGF5b3V0TWFuYWdlci5kcm9wVGFyZ2V0SW5kaWNhdG9yO1xyXG4gICAgICAgIGlmIChkcm9wVGFyZ2V0SW5kaWNhdG9yID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdBQ0lIRFo1NTkzJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZHJvcFRhcmdldEluZGljYXRvci5oaWdobGlnaHRBcmVhKGFyZWEsIDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBvbkRyb3AoY29udGVudEl0ZW06IENvbnRlbnRJdGVtLCBhcmVhOiBDb250ZW50SXRlbS5BcmVhKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5hZGRDaGlsZChjb250ZW50SXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc2hvdygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuYmVnaW5TaXplSW52YWxpZGF0aW9uKCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8gTm90IHN1cmUgd2h5IHNob3dBbGxBY3RpdmVDb250ZW50SXRlbXMoKSB3YXMgY2FsbGVkLiBHb2xkZW5MYXlvdXQgc2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgaXQuICBMZWZ0IGNvbW1lbnRlZCBjb2RlXHJcbiAgICAgICAgICAgIC8vIGluIHNvdXJjZSBpbiBjYXNlIGEgcmVhc29uIGZvciBpdCBiZWNvbWVzIGFwcGFyZW50LlxyXG4gICAgICAgICAgICAvLyB0aGlzLmxheW91dE1hbmFnZXIuc2hvd0FsbEFjdGl2ZUNvbnRlbnRJdGVtcygpO1xyXG4gICAgICAgICAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkodGhpcy5fZWxlbWVudCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIC8vIHRoaXMubGF5b3V0TWFuYWdlci51cGRhdGVTaXplRnJvbUNvbnRhaW5lcigpO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRJdGVtc1tpXS5zaG93KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuZW5kU2l6ZUludmFsaWRhdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoaXMgaXRlbSBhbmRzIGl0cyBjaGlsZHJlblxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5fY29udGVudEl0ZW1zW2ldLmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY29udGVudEl0ZW1zID0gW107XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdEJhc2VCdWJibGluZ0V2ZW50KCdiZWZvcmVJdGVtRGVzdHJveWVkJyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmUoKTtcclxuICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnaXRlbURlc3Ryb3llZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgYXJlYSB0aGUgY29tcG9uZW50IGN1cnJlbnRseSBvY2N1cGllc1xyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGdldEVsZW1lbnRBcmVhKGVsZW1lbnQ/OiBIVE1MRWxlbWVudCk6IENvbnRlbnRJdGVtLkFyZWEge1xyXG4gICAgICAgIGVsZW1lbnQgPSBlbGVtZW50ID8/IHRoaXMuX2VsZW1lbnQ7XHJcblxyXG4gICAgICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IHRvcCA9IHJlY3QudG9wICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7XHJcbiAgICAgICAgY29uc3QgbGVmdCA9IHJlY3QubGVmdCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdDtcclxuXHJcbiAgICAgICAgY29uc3Qgd2lkdGggPSByZWN0LndpZHRoO1xyXG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHJlY3QuaGVpZ2h0O1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB4MTogbGVmdCxcclxuICAgICAgICAgICAgeTE6IHRvcCxcclxuICAgICAgICAgICAgeDI6IGxlZnQgKyB3aWR0aCxcclxuICAgICAgICAgICAgeTI6IHRvcCArIGhlaWdodCxcclxuICAgICAgICAgICAgc3VyZmFjZTogd2lkdGggKiBoZWlnaHQsXHJcbiAgICAgICAgICAgIGNvbnRlbnRJdGVtOiB0aGlzXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBmaW5kQW5jZXN0b3JXaXRoU2libGluZ3MoKTogQ29udGVudEl0ZW0gfCBudWxsIHtcclxuICAgICAgICBsZXQgY3VycjogQ29udGVudEl0ZW0gfCBudWxsID0gdGhpcztcclxuXHJcbiAgICAgICAgd2hpbGUgKGN1cnIgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGN1cnIucGFyZW50ICE9PSBudWxsICYmIGN1cnIucGFyZW50LmNvbnRlbnRJdGVtcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyID0gY3Vyci5wYXJlbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBGaW5kcyBhbiBhbmNlc3RvciB0aGF0IHdpbGwgZXhpc3QgZXZlbiBhZnRlciB0aGUgaXRlbSBpcyByZW1vdmVkIGFuZCByZXR1cm5zIGl0IGFzIGRvY2sgcG9pbnQuXHJcbiAgICAgKiBcclxuICAgICAqIEBpbnRlcm5hbCAqL1xyXG4gICAgZmluZERvY2tQb2ludCgpOiBDb250ZW50SXRlbS5Eb2NrUG9pbnQgfCBudWxsIHtcclxuICAgICAgICBjb25zdCBhbmNob3IgPSB0aGlzLmZpbmRBbmNlc3RvcldpdGhTaWJsaW5ncygpO1xyXG5cclxuICAgICAgICBpZiAoYW5jaG9yICE9PSBudWxsICYmIGFuY2hvci5wYXJlbnQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBhbmNob3IucGFyZW50Ll9jb250ZW50SXRlbXMuaW5kZXhPZihhbmNob3IpO1xyXG4gICAgICAgICAgICByZXR1cm4geyBwYXJlbnQ6IGFuY2hvci5wYXJlbnQsIGluZGV4IH07XHJcblxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5sYXlvdXRNYW5hZ2VyLmdyb3VuZEl0ZW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgcGFyZW50OiB0aGlzLmxheW91dE1hbmFnZXIuZ3JvdW5kSXRlbSwgaW5kZXg6IG51bGwgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRyZWUgb2YgY29udGVudCBpdGVtcyBpcyBjcmVhdGVkIGluIHR3byBzdGVwczogRmlyc3QgYWxsIGNvbnRlbnQgaXRlbXMgYXJlIGluc3RhbnRpYXRlZCxcclxuICAgICAqIHRoZW4gaW5pdCBpcyBjYWxsZWQgcmVjdXJzaXZlbHkgZnJvbSB0b3AgdG8gYm90dGVtLiBUaGlzIGlzIHRoZSBiYXNpYyBpbml0IGZ1bmN0aW9uLFxyXG4gICAgICogaXQgY2FuIGJlIHVzZWQsIGV4dGVuZGVkIG9yIG92ZXJ3cml0dGVuIGJ5IHRoZSBjb250ZW50IGl0ZW1zXHJcbiAgICAgKlxyXG4gICAgICogSXRzIGJlaGF2aW91ciBkZXBlbmRzIG9uIHRoZSBjb250ZW50IGl0ZW1cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBpbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGlzZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZW1pdEJhc2VCdWJibGluZ0V2ZW50KCdpdGVtQ3JlYXRlZCcpO1xyXG4gICAgICAgIHRoaXMuZW1pdFVua25vd25CdWJibGluZ0V2ZW50KHRoaXMudHlwZSArICdDcmVhdGVkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJvdGVjdGVkIHNldFBhcmVudChwYXJlbnQ6IENvbnRlbnRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGFkZFBvcEluUGFyZW50SWQoaWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5wb3BJblBhcmVudElkcy5pbmNsdWRlcyhpZCkpIHtcclxuICAgICAgICAgICAgdGhpcy5wb3BJblBhcmVudElkcy5wdXNoKGlkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJvdGVjdGVkIGluaXRDb250ZW50SXRlbXMoKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5fY29udGVudEl0ZW1zW2ldLmluaXQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJvdGVjdGVkIGhpZGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmJlZ2luU2l6ZUludmFsaWRhdGlvbigpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHNldEVsZW1lbnREaXNwbGF5VmlzaWJpbGl0eSh0aGlzLl9lbGVtZW50LCBmYWxzZSk7XHJcbiAgICAgICAgICAgIC8vIHRoaXMubGF5b3V0TWFuYWdlci51cGRhdGVTaXplRnJvbUNvbnRhaW5lcigpO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5lbmRTaXplSW52YWxpZGF0aW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByb3RlY3RlZCB1cGRhdGVDb250ZW50SXRlbXNTaXplKGZvcmNlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5fY29udGVudEl0ZW1zW2ldLnVwZGF0ZVNpemUoZm9yY2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGNyZWF0ZXMgYWxsIGNvbnRlbnQgaXRlbXMgZm9yIHRoaXMgbm9kZSBhdCBpbml0aWFsaXNhdGlvbiB0aW1lXHJcbiAgICAgKiBQTEVBU0UgTk9URSwgcGxlYXNlIHNlZSBhZGRDaGlsZCBmb3IgYWRkaW5nIGNvbnRlbnRJdGVtcyBhdCBydW50aW1lXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVDb250ZW50SXRlbXMoY29udGVudDogcmVhZG9ubHkgUmVzb2x2ZWRJdGVtQ29uZmlnW10pIHtcclxuICAgICAgICBjb25zdCBjb3VudCA9IGNvbnRlbnQubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxDb250ZW50SXRlbT4oY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICByZXN1bHRbaV0gPSB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlQ29udGVudEl0ZW0oY29udGVudFtpXSwgdGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgZm9yIGV2ZXJ5IGV2ZW50IG9uIHRoZSBpdGVtIHRyZWUuIERlY2lkZXMgd2hldGhlciB0aGUgZXZlbnQgaXMgYSBidWJibGluZ1xyXG4gICAgICogZXZlbnQgYW5kIHByb3BhZ2F0ZXMgaXQgdG8gaXRzIHBhcmVudFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50XHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgLVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcHJvcGFnYXRlRXZlbnQobmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duW10pIHtcclxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBhcmdzWzBdO1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBFdmVudEVtaXR0ZXIuQnViYmxpbmdFdmVudCAmJlxyXG4gICAgICAgICAgICAgICAgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQgPT09IGZhbHNlICYmXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0luaXRpYWxpc2VkID09PSB0cnVlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBJbiBzb21lIGNhc2VzIChlLmcuIGlmIGFuIGVsZW1lbnQgaXMgY3JlYXRlZCBmcm9tIGEgRHJhZ1NvdXJjZSkgaXRcclxuICAgICAgICAgICAgICAgICAqIGRvZXNuJ3QgaGF2ZSBhIHBhcmVudCBhbmQgaXMgbm90IGEgY2hpbGQgb2YgR3JvdW5kSXRlbS4gSWYgdGhhdCdzIHRoZSBjYXNlXHJcbiAgICAgICAgICAgICAgICAgKiBwcm9wYWdhdGUgdGhlIGJ1YmJsaW5nIGV2ZW50IGZyb20gdGhlIHRvcCBsZXZlbCBvZiB0aGUgc3Vic3RyZWUgZGlyZWN0bHlcclxuICAgICAgICAgICAgICAgICAqIHRvIHRoZSBsYXlvdXRNYW5hZ2VyXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzR3JvdW5kID09PSBmYWxzZSAmJiB0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYXJlbnQuZW1pdFVua25vd24obmFtZSwgZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxlRXZlbnRQcm9wYWdhdGlvblRvTGF5b3V0TWFuYWdlcihuYW1lLCBldmVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb3ZlcnJpZGUgdHJ5QnViYmxlRXZlbnQobmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duW10pOiB2b2lkIHtcclxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBhcmdzWzBdO1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBFdmVudEVtaXR0ZXIuQnViYmxpbmdFdmVudCAmJlxyXG4gICAgICAgICAgICAgICAgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQgPT09IGZhbHNlICYmXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0luaXRpYWxpc2VkID09PSB0cnVlXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBJbiBzb21lIGNhc2VzIChlLmcuIGlmIGFuIGVsZW1lbnQgaXMgY3JlYXRlZCBmcm9tIGEgRHJhZ1NvdXJjZSkgaXRcclxuICAgICAgICAgICAgICAgICAqIGRvZXNuJ3QgaGF2ZSBhIHBhcmVudCBhbmQgaXMgbm90IGEgY2hpbGQgb2YgR3JvdW5kSXRlbS4gSWYgdGhhdCdzIHRoZSBjYXNlXHJcbiAgICAgICAgICAgICAgICAgKiBwcm9wYWdhdGUgdGhlIGJ1YmJsaW5nIGV2ZW50IGZyb20gdGhlIHRvcCBsZXZlbCBvZiB0aGUgc3Vic3RyZWUgZGlyZWN0bHlcclxuICAgICAgICAgICAgICAgICAqIHRvIHRoZSBsYXlvdXRNYW5hZ2VyXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzR3JvdW5kID09PSBmYWxzZSAmJiB0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYXJlbnQuZW1pdFVua25vd24obmFtZSwgZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxlRXZlbnRQcm9wYWdhdGlvblRvTGF5b3V0TWFuYWdlcihuYW1lLCBldmVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbGwgcmF3IGV2ZW50cyBidWJibGUgdXAgdG8gdGhlIEdyb3VuZCBlbGVtZW50LiBTb21lIGV2ZW50cyB0aGF0XHJcbiAgICAgKiBhcmUgcHJvcGFnYXRlZCB0byAtIGFuZCBlbWl0dGVkIGJ5IC0gdGhlIGxheW91dE1hbmFnZXIgaG93ZXZlciBhcmVcclxuICAgICAqIG9ubHkgc3RyaW5nLWJhc2VkLCBiYXRjaGVkIGFuZCBzYW5pdGl6ZWQgdG8gbWFrZSB0aGVtIG1vcmUgdXNhYmxlXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNjaGVkdWxlRXZlbnRQcm9wYWdhdGlvblRvTGF5b3V0TWFuYWdlcihuYW1lOiBzdHJpbmcsIGV2ZW50OiBFdmVudEVtaXR0ZXIuQnViYmxpbmdFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLl90aHJvdHRsZWRFdmVudHMuaW5kZXhPZihuYW1lKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmVtaXRVbmtub3duKG5hbWUsIGV2ZW50KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fcGVuZGluZ0V2ZW50UHJvcGFnYXRpb25zW25hbWVdICE9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wZW5kaW5nRXZlbnRQcm9wYWdhdGlvbnNbbmFtZV0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsVGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5wcm9wYWdhdGVFdmVudFRvTGF5b3V0TWFuYWdlcihuYW1lLCBldmVudCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxiYWNrIGZvciBldmVudHMgc2NoZWR1bGVkIGJ5IF9zY2hlZHVsZUV2ZW50UHJvcGFnYXRpb25Ub0xheW91dE1hbmFnZXJcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudFxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcHJvcGFnYXRlRXZlbnRUb0xheW91dE1hbmFnZXIobmFtZTogc3RyaW5nLCBldmVudDogRXZlbnRFbWl0dGVyLkJ1YmJsaW5nRXZlbnQpIHtcclxuICAgICAgICB0aGlzLl9wZW5kaW5nRXZlbnRQcm9wYWdhdGlvbnNbbmFtZV0gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuZW1pdFVua25vd24obmFtZSwgZXZlbnQpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIENvbnRlbnRJdGVtIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQXJlYSBleHRlbmRzIEFyZWFMaW5rZWRSZWN0IHtcclxuICAgICAgICBzdXJmYWNlOiBudW1iZXI7XHJcbiAgICAgICAgY29udGVudEl0ZW06IENvbnRlbnRJdGVtO1xyXG4gICAgfVxyXG4gICAgLyoqIEBwdWJsaWMgKi9cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgRG9ja1BvaW50IHtcclxuICAgICAgICBwYXJlbnQ6IENvbnRlbnRJdGVtO1xyXG4gICAgICAgIGluZGV4OiBudW1iZXIgfCBudWxsO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIChDb250ZW50SXRlbTpjbGFzcyl9ICovXHJcbmV4cG9ydCB0eXBlIEFic3RyYWN0Q29udGVudEl0ZW0gPSBDb250ZW50SXRlbTtcclxuIiwiaW1wb3J0IHsgQ29tcG9uZW50SXRlbUNvbmZpZywgSXRlbUNvbmZpZywgUm93T3JDb2x1bW5JdGVtQ29uZmlnLCBTdGFja0l0ZW1Db25maWcgfSBmcm9tICcuLi9jb25maWcvY29uZmlnJztcclxuaW1wb3J0IHsgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLCBSZXNvbHZlZEdyb3VuZEl0ZW1Db25maWcsIFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLCBSZXNvbHZlZEl0ZW1Db25maWcsIFJlc29sdmVkUm9vdEl0ZW1Db25maWcsIFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL3Jlc29sdmVkLWNvbmZpZyc7XHJcbmltcG9ydCB7IEFzc2VydEVycm9yLCBVbmV4cGVjdGVkTnVsbEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IEFyZWFMaW5rZWRSZWN0LCBJdGVtVHlwZSwgU2l6ZVVuaXRFbnVtIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQgeyBnZXRFbGVtZW50V2lkdGhBbmRIZWlnaHQsIHNldEVsZW1lbnRIZWlnaHQsIHNldEVsZW1lbnRXaWR0aCB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4vY29tcG9uZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBDb21wb25lbnRQYXJlbnRhYmxlSXRlbSB9IGZyb20gJy4vY29tcG9uZW50LXBhcmVudGFibGUtaXRlbSc7XHJcbmltcG9ydCB7IENvbnRlbnRJdGVtIH0gZnJvbSAnLi9jb250ZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBSb3dPckNvbHVtbiB9IGZyb20gJy4vcm93LW9yLWNvbHVtbic7XHJcblxyXG4vKipcclxuICogR3JvdW5kSXRlbSBpcyB0aGUgQ29udGVudEl0ZW0gd2hvc2Ugb25lIGNoaWxkIGlzIHRoZSByb290IENvbnRlbnRJdGVtIChSb290IGlzIHBsYW50ZWQgaW4gR3JvdW5kKS5cclxuICogKFByZXZpb3VzbHkgaXQgd2FzIGNhbGxlZCByb290IGhvd2V2ZXIgdGhpcyB3YXMgaW5jb3JyZWN0IGFzIGl0cyBjaGlsZCBpcyB0aGUgcm9vdCBpdGVtKVxyXG4gKiBUaGVyZSBpcyBvbmx5IG9uZSBpbnN0YW5jZSBvZiBHcm91bmRJdGVtIGFuZCBpdCBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgdGhlIExheW91dCBNYW5hZ2VyXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEdyb3VuZEl0ZW0gZXh0ZW5kcyBDb21wb25lbnRQYXJlbnRhYmxlSXRlbSB7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jaGlsZEVsZW1lbnRDb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IobGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlciwgcm9vdEl0ZW1Db25maWc6IFJlc29sdmVkUm9vdEl0ZW1Db25maWcgfCB1bmRlZmluZWQsIGNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcblxyXG4gICAgICAgIHN1cGVyKGxheW91dE1hbmFnZXIsIFJlc29sdmVkR3JvdW5kSXRlbUNvbmZpZy5jcmVhdGUocm9vdEl0ZW1Db25maWcpLCBudWxsLCBHcm91bmRJdGVtLmNyZWF0ZUVsZW1lbnQoZG9jdW1lbnQpKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc0dyb3VuZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fY2hpbGRFbGVtZW50Q29udGFpbmVyID0gdGhpcy5lbGVtZW50O1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXJFbGVtZW50O1xyXG5cclxuICAgICAgICAvLyBpbnNlcnQgYmVmb3JlIGFueSBwcmUtZXhpc3RpbmcgY29udGVudCBlbGVtZW50c1xyXG4gICAgICAgIGxldCBiZWZvcmU6IENoaWxkTm9kZSB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHByZXY6IENoaWxkTm9kZSB8IG51bGwgPVxyXG4gICAgICAgICAgICAgICAgYmVmb3JlID8gYmVmb3JlLnByZXZpb3VzU2libGluZyA6IHRoaXMuX2NvbnRhaW5lckVsZW1lbnQubGFzdENoaWxkO1xyXG4gICAgICAgICAgICBpZiAocHJldiBpbnN0YW5jZW9mIEVsZW1lbnRcclxuICAgICAgICAgICAgICAgICYmIHByZXYuY2xhc3NMaXN0LmNvbnRhaW5zKERvbUNvbnN0YW50cy5DbGFzc05hbWUuQ29udGVudCkpIHtcclxuICAgICAgICAgICAgICAgIGJlZm9yZSA9IHByZXY7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jb250YWluZXJFbGVtZW50Lmluc2VydEJlZm9yZSh0aGlzLmVsZW1lbnQsIGJlZm9yZSk7XHJcbiAgICB9XHJcblxyXG4gICAgb3ZlcnJpZGUgaW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pc0luaXRpYWxpc2VkID09PSB0cnVlKSByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlTm9kZVNpemUoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50SXRlbXNbaV0uZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdXBlci5pbml0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdENvbnRlbnRJdGVtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9hZHMgYSBuZXcgTGF5b3V0XHJcbiAgICAgKiBJbnRlcm5hbCBvbmx5LiAgVG8gbG9hZCBhIG5ldyBsYXlvdXQgd2l0aCBBUEksIHVzZSB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpLmxvYWRMYXlvdXR9XHJcbiAgICAgKi9cclxuICAgIGxvYWRSb290KHJvb3RJdGVtQ29uZmlnOiBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnIHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICAgICAgLy8gUmVtb3ZlIGV4aXN0aW5nIHJvb3QgaWYgaXQgZXhpc3RzXHJcbiAgICAgICAgdGhpcy5jbGVhclJvb3QoKTtcclxuXHJcbiAgICAgICAgaWYgKHJvb3RJdGVtQ29uZmlnICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29uc3Qgcm9vdENvbnRlbnRJdGVtID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmNyZWF0ZUFuZEluaXRDb250ZW50SXRlbShyb290SXRlbUNvbmZpZywgdGhpcyk7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGQocm9vdENvbnRlbnRJdGVtLCAwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJSb290KCk6IHZvaWQge1xyXG4gICAgICAgIC8vIFJlbW92ZSBleGlzdGluZyByb290IGlmIGl0IGV4aXN0c1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtcyA9IHRoaXMuY29udGVudEl0ZW1zO1xyXG4gICAgICAgIHN3aXRjaCAoY29udGVudEl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBjYXNlIDA6IHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIDE6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nUm9vdENvbnRlbnRJdGVtID0gY29udGVudEl0ZW1zWzBdO1xyXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdSb290Q29udGVudEl0ZW0ucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGVmYXVsdDoge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdHSUxSMDc3MjEnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBDb250ZW50SXRlbSBjaGlsZCB0byByb290IENvbnRlbnRJdGVtLlxyXG4gICAgICogSW50ZXJuYWwgb25seS4gIFRvIGxvYWQgYSBhZGQgd2l0aCBBUEksIHVzZSB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpLmFkZEl0ZW19XHJcbiAgICAgKiBAcmV0dXJucyAtMSBpZiBhZGRlZCBhcyByb290IG90aGVyd2lzZSBpbmRleCBpbiByb290IENvbnRlbnRJdGVtJ3MgY29udGVudFxyXG4gICAgICovXHJcbiAgICBhZGRJdGVtKGl0ZW1Db25maWc6IFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFN0YWNrSXRlbUNvbmZpZyB8IENvbXBvbmVudEl0ZW1Db25maWcsXHJcbiAgICAgICAgaW5kZXg/OiBudW1iZXJcclxuICAgICk6IG51bWJlciB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmNoZWNrTWluaW1pc2VNYXhpbWlzZWRTdGFjaygpO1xyXG5cclxuICAgICAgICBjb25zdCByZXNvbHZlZEl0ZW1Db25maWcgPSBJdGVtQ29uZmlnLnJlc29sdmUoaXRlbUNvbmZpZywgZmFsc2UpO1xyXG4gICAgICAgIGxldCBwYXJlbnQ6IENvbnRlbnRJdGVtO1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHBhcmVudCA9IHRoaXMuY29udGVudEl0ZW1zWzBdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xyXG4gICAgICAgICAgICBwYXJlbnQgPSB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocGFyZW50LmlzQ29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFkZCBpdGVtIGFzIGNoaWxkIHRvIENvbXBvbmVudEl0ZW0nKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IHRoaXMubGF5b3V0TWFuYWdlci5jcmVhdGVBbmRJbml0Q29udGVudEl0ZW0ocmVzb2x2ZWRJdGVtQ29uZmlnLCBwYXJlbnQpO1xyXG4gICAgICAgICAgICBpbmRleCA9IHBhcmVudC5hZGRDaGlsZChjb250ZW50SXRlbSwgaW5kZXgpO1xyXG4gICAgICAgICAgICByZXR1cm4gKHBhcmVudCA9PT0gdGhpcykgPyAtMSA6IGluZGV4O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsb2FkQ29tcG9uZW50QXNSb290KGl0ZW1Db25maWc6IENvbXBvbmVudEl0ZW1Db25maWcpOiB2b2lkIHtcclxuICAgICAgICAvLyBSZW1vdmUgZXhpc3Rpbmcgcm9vdCBpZiBpdCBleGlzdHNcclxuICAgICAgICB0aGlzLmNsZWFyUm9vdCgpO1xyXG5cclxuICAgICAgICBjb25zdCByZXNvbHZlZEl0ZW1Db25maWcgPSBJdGVtQ29uZmlnLnJlc29sdmUoaXRlbUNvbmZpZywgZmFsc2UpIGFzIFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZztcclxuXHJcbiAgICAgICAgaWYgKHJlc29sdmVkSXRlbUNvbmZpZy5tYXhpbWlzZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSb290IENvbXBvbmVudCBjYW5ub3QgYmUgbWF4aW1pc2VkJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgcm9vdENvbnRlbnRJdGVtID0gbmV3IENvbXBvbmVudEl0ZW0odGhpcy5sYXlvdXRNYW5hZ2VyLCByZXNvbHZlZEl0ZW1Db25maWcsIHRoaXMpO1xyXG4gICAgICAgICAgICByb290Q29udGVudEl0ZW0uaW5pdCgpO1xyXG4gICAgICAgICAgICB0aGlzLmFkZENoaWxkKHJvb3RDb250ZW50SXRlbSwgMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIFJvb3QgQ29udGVudEl0ZW0uXHJcbiAgICAgKiBJbnRlcm5hbCBvbmx5LiAgVG8gcmVwbGFjZSBSb290IENvbnRlbnRJdGVtIHdpdGggQVBJLCB1c2Uge0BsaW5rIChMYXlvdXRNYW5hZ2VyOmNsYXNzKS5sb2FkTGF5b3V0fVxyXG4gICAgICovXHJcbiAgICBvdmVycmlkZSBhZGRDaGlsZChjb250ZW50SXRlbTogQ29udGVudEl0ZW0sIGluZGV4PzogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICBpZiAodGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dyb3VuZCBub2RlIGNhbiBvbmx5IGhhdmUgYSBzaW5nbGUgY2hpbGQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBjb250ZW50SXRlbSA9IHRoaXMubGF5b3V0TWFuYWdlci5fJG5vcm1hbGl6ZUNvbnRlbnRJdGVtKGNvbnRlbnRJdGVtLCB0aGlzKTtcclxuICAgICAgICAgICAgdGhpcy5fY2hpbGRFbGVtZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKGNvbnRlbnRJdGVtLmVsZW1lbnQpO1xyXG4gICAgICAgICAgICBpbmRleCA9IHN1cGVyLmFkZENoaWxkKGNvbnRlbnRJdGVtLCBpbmRleCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnc3RhdGVDaGFuZ2VkJyk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gaW5kZXg7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG92ZXJyaWRlIGNhbGN1bGF0ZUNvbmZpZ0NvbnRlbnQoKTogUmVzb2x2ZWRSb290SXRlbUNvbmZpZ1tdIHtcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbXMgPSB0aGlzLmNvbnRlbnRJdGVtcztcclxuICAgICAgICBjb25zdCBjb3VudCA9IGNvbnRlbnRJdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PFJlc29sdmVkUm9vdEl0ZW1Db25maWc+KGNvdW50KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgY29uc3QgaXRlbUNvbmZpZyA9IGl0ZW0udG9Db25maWcoKTtcclxuICAgICAgICAgICAgaWYgKFJlc29sdmVkUm9vdEl0ZW1Db25maWcuaXNSb290SXRlbUNvbmZpZyhpdGVtQ29uZmlnKSkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gaXRlbUNvbmZpZztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignUkNDQzY2ODMyJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzZXRTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQgfHwgaGVpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKGZhbHNlKTsgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggdjEueCBBUElcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzZXRFbGVtZW50V2lkdGgodGhpcy5lbGVtZW50LCB3aWR0aCk7XHJcbiAgICAgICAgICAgIHNldEVsZW1lbnRIZWlnaHQodGhpcy5lbGVtZW50LCBoZWlnaHQpO1xyXG5cclxuICAgICAgICAgICAgLy8gR3JvdW5kSXRlbSBjYW4gYmUgZW1wdHlcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHNldEVsZW1lbnRXaWR0aCh0aGlzLmNvbnRlbnRJdGVtc1swXS5lbGVtZW50LCB3aWR0aCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHRoaXMuY29udGVudEl0ZW1zWzBdLmVsZW1lbnQsIGhlaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29udGVudEl0ZW1zU2l6ZShmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIFJvb3QgQ29udGVudEl0ZW0uXHJcbiAgICAgKiBJbnRlcm5hbCBvbmx5LiAgVG8gcmVwbGFjZSBSb290IENvbnRlbnRJdGVtIHdpdGggQVBJLCB1c2Uge0BsaW5rIChMYXlvdXRNYW5hZ2VyOmNsYXNzKS51cGRhdGVSb290U2l6ZX1cclxuICAgICAqL1xyXG4gICAgb3ZlcnJpZGUgdXBkYXRlU2l6ZShmb3JjZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5iZWdpblZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZygpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTm9kZVNpemUoKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVDb250ZW50SXRlbXNTaXplKGZvcmNlKTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuZW5kVmlydHVhbFNpemVkQ29udGFpbmVyQWRkaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVNpZGVBcmVhcygpOiBHcm91bmRJdGVtLkFyZWFbXSB7XHJcbiAgICAgICAgY29uc3QgYXJlYVNpemUgPSA1MDtcclxuXHJcbiAgICAgICAgY29uc3Qgb3Bwb3NpdGVTaWRlcyA9IEdyb3VuZEl0ZW0uQXJlYS5vcHBvc2l0ZVNpZGVzO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxHcm91bmRJdGVtLkFyZWE+KE9iamVjdC5rZXlzKG9wcG9zaXRlU2lkZXMpLmxlbmd0aCk7XHJcbiAgICAgICAgbGV0IGlkeCA9IDA7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9wcG9zaXRlU2lkZXMpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2lkZSA9IGtleSBhcyBrZXlvZiBHcm91bmRJdGVtLkFyZWEuU2lkZXM7XHJcbiAgICAgICAgICAgIGNvbnN0IGFyZWEgPSB0aGlzLmdldEVsZW1lbnRBcmVhKCkgYXMgR3JvdW5kSXRlbS5BcmVhO1xyXG4gICAgICAgICAgICBpZiAoYXJlYSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ1JDU0E3NzU1MycpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXJlYS5zaWRlID0gc2lkZTtcclxuICAgICAgICAgICAgICAgIGlmIChvcHBvc2l0ZVNpZGVzW3NpZGVdWzFdID09PSAnMicgKVxyXG4gICAgICAgICAgICAgICAgICAgIGFyZWFbc2lkZV0gPSBhcmVhW29wcG9zaXRlU2lkZXNbc2lkZV1dIC0gYXJlYVNpemU7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgYXJlYVtzaWRlXSA9IGFyZWFbb3Bwb3NpdGVTaWRlc1tzaWRlXV0gKyBhcmVhU2l6ZTtcclxuICAgICAgICAgICAgICAgIGFyZWEuc3VyZmFjZSA9IChhcmVhLngyIC0gYXJlYS54MSkgKiAoYXJlYS55MiAtIGFyZWEueTEpO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0W2lkeCsrXSA9IGFyZWE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgb3ZlcnJpZGUgaGlnaGxpZ2h0RHJvcFpvbmUoeDogbnVtYmVyLCB5OiBudW1iZXIsIGFyZWE6IEFyZWFMaW5rZWRSZWN0KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLnRhYkRyb3BQbGFjZWhvbGRlci5yZW1vdmUoKTtcclxuICAgICAgICBzdXBlci5oaWdobGlnaHREcm9wWm9uZSh4LCB5LCBhcmVhKTtcclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBvbkRyb3AoY29udGVudEl0ZW06IENvbnRlbnRJdGVtLCBhcmVhOiBHcm91bmRJdGVtLkFyZWEpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRlbnRJdGVtLmlzQ29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1Db25maWcgPSBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZy5jcmVhdGVEZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIC8vIHNpbmNlIFJlc29sdmVkSXRlbUNvbmZpZy5jb250ZW50SXRlbXMgbm90IHNldCB1cCwgd2UgbmVlZCB0byBhZGQgaGVhZGVyIGZyb20gQ29tcG9uZW50XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGNvbnRlbnRJdGVtIGFzIENvbXBvbmVudEl0ZW07XHJcbiAgICAgICAgICAgIGl0ZW1Db25maWcuaGVhZGVyID0gUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyLmNyZWF0ZUNvcHkoY29tcG9uZW50LmhlYWRlckNvbmZpZyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmNyZWF0ZUFuZEluaXRDb250ZW50SXRlbShpdGVtQ29uZmlnLCB0aGlzKTtcclxuICAgICAgICAgICAgc3RhY2suYWRkQ2hpbGQoY29udGVudEl0ZW0pO1xyXG4gICAgICAgICAgICBjb250ZW50SXRlbSA9IHN0YWNrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZENoaWxkKGNvbnRlbnRJdGVtKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAgKiBJZiB0aGUgY29udGVudEl0ZW0gdGhhdCdzIGJlaW5nIGRyb3BwZWQgaXMgbm90IGRyb3BwZWQgb24gYSBTdGFjayAoY2FzZXMgd2hpY2gganVzdCBwYXNzZWQgYWJvdmUgYW5kXHJcbiAgICAgICAgICAgICAqIHdoaWNoIHdvdWxkIHdyYXAgdGhlIGNvbnRlbnRJdGVtIGluIGEgU3RhY2spIHdlIG5lZWQgdG8gY2hlY2sgd2hldGhlciBjb250ZW50SXRlbSBpcyBhIFJvd09yQ29sdW1uLlxyXG4gICAgICAgICAgICAgKiBJZiBpdCBpcywgd2UgbmVlZCB0byByZS13cmFwIGl0IGluIGEgU3RhY2sgbGlrZSBpdCB3YXMgd2hlbiBpdCB3YXMgZHJhZ2dlZCBieSBpdHMgVGFiIChpdCB3YXMgZHJhZ2dlZCEpLlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgaWYoY29udGVudEl0ZW0udHlwZSA9PT0gSXRlbVR5cGUucm93IHx8IGNvbnRlbnRJdGVtLnR5cGUgPT09IEl0ZW1UeXBlLmNvbHVtbil7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtQ29uZmlnID0gUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcuY3JlYXRlRGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlQ29udGVudEl0ZW0oaXRlbUNvbmZpZywgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICBzdGFjay5hZGRDaGlsZChjb250ZW50SXRlbSlcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtID0gc3RhY2tcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgdHlwZSA9IGFyZWEuc2lkZVswXSA9PSAneCcgPyBJdGVtVHlwZS5yb3cgOiBJdGVtVHlwZS5jb2x1bW47XHJcbiAgICAgICAgICAgIGNvbnN0IGluc2VydEJlZm9yZSA9IGFyZWEuc2lkZVsxXSA9PSAnMic7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29udGVudEl0ZW1zWzBdO1xyXG4gICAgICAgICAgICBpZiAoIShjb2x1bW4gaW5zdGFuY2VvZiBSb3dPckNvbHVtbikgfHwgY29sdW1uLnR5cGUgIT09IHR5cGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1Db25maWcgPSBSZXNvbHZlZEl0ZW1Db25maWcuY3JlYXRlRGVmYXVsdCh0eXBlKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJvd09yQ29sdW1uID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmNyZWF0ZUNvbnRlbnRJdGVtKGl0ZW1Db25maWcsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXBsYWNlQ2hpbGQoY29sdW1uLCByb3dPckNvbHVtbik7XHJcbiAgICAgICAgICAgICAgICByb3dPckNvbHVtbi5hZGRDaGlsZChjb250ZW50SXRlbSwgaW5zZXJ0QmVmb3JlID8gMCA6IHVuZGVmaW5lZCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICByb3dPckNvbHVtbi5hZGRDaGlsZChjb2x1bW4sIGluc2VydEJlZm9yZSA/IHVuZGVmaW5lZCA6IDAsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgY29sdW1uLnNpemUgPSA1MDtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemUgPSA1MDtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemVVbml0ID0gU2l6ZVVuaXRFbnVtLlBlcmNlbnQ7XHJcbiAgICAgICAgICAgICAgICByb3dPckNvbHVtbi51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmcgPSBjb2x1bW4uY29udGVudEl0ZW1zW2luc2VydEJlZm9yZSA/IDAgOiBjb2x1bW4uY29udGVudEl0ZW1zLmxlbmd0aCAtIDFdXHJcbiAgICAgICAgICAgICAgICBjb2x1bW4uYWRkQ2hpbGQoY29udGVudEl0ZW0sIGluc2VydEJlZm9yZSA/IDAgOiB1bmRlZmluZWQsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgc2libGluZy5zaXplICo9IDAuNTtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemUgPSBzaWJsaW5nLnNpemU7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50SXRlbS5zaXplVW5pdCA9IFNpemVVbml0RW51bS5QZXJjZW50O1xyXG4gICAgICAgICAgICAgICAgY29sdW1uLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIE5vIENvbnRlbnRJdGVtIGNhbiBkb2NrIHdpdGggZ3JvdW5kSXRlbS4gIEhvd2V2ZXIgU3RhY2sgY2FuIGhhdmUgYSBHcm91bmRJdGVtIHBhcmVudCBhbmQgU3RhY2sgcmVxdWlyZXMgdGhhdFxyXG4gICAgLy8gaXRzIHBhcmVudCBpbXBsZW1lbnQgZG9jaygpIGZ1bmN0aW9uLiAgQWNjb3JkaW5nbHkgdGhpcyBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBidXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBhcyBpdCBzaG91bGRcclxuICAgIC8vIG5ldmVyIGJlIGNhbGxlZFxyXG4gICAgZG9jaygpOiB2b2lkIHtcclxuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0dJRDg3NzMxJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTm8gQ29udGVudEl0ZW0gY2FuIGRvY2sgd2l0aCBncm91bmRJdGVtLiAgSG93ZXZlciBTdGFjayBjYW4gaGF2ZSBhIEdyb3VuZEl0ZW0gcGFyZW50IGFuZCBTdGFjayByZXF1aXJlcyB0aGF0XHJcbiAgICAvLyBpdHMgcGFyZW50IGltcGxlbWVudCB2YWxpZGF0ZURvY2tpbmcoKSBmdW5jdGlvbi4gIEFjY29yZGluZ2x5IHRoaXMgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgYnV0IHRocm93cyBhbiBleGNlcHRpb24gYXMgaXQgc2hvdWxkXHJcbiAgICAvLyBuZXZlciBiZSBjYWxsZWRcclxuICAgIHZhbGlkYXRlRG9ja2luZygpOiB2b2lkIHtcclxuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0dJVkQ4NzczMicpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEFsbENvbnRlbnRJdGVtcygpOiBDb250ZW50SXRlbVtdIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IENvbnRlbnRJdGVtW10gPSBbdGhpc107XHJcbiAgICAgICAgdGhpcy5kZWVwR2V0QWxsQ29udGVudEl0ZW1zKHRoaXMuY29udGVudEl0ZW1zLCByZXN1bHQpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QWxsQ29tcG9uZW50SXRlbXMoKTogQ29tcG9uZW50SXRlbVtdIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IENvbnRlbnRJdGVtW10gPSBbXTtcclxuICAgICAgICB0aGlzLmRlZXBGaWx0ZXJDb250ZW50SXRlbXModGhpcy5jb250ZW50SXRlbXMsIHJlc3VsdCwgKGl0ZW0pID0+IGl0ZW0uaXNDb21wb25lbnQpO1xyXG4gICAgICAgIHJldHVybiA8Q29tcG9uZW50SXRlbVtdPnJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDb25maWdNYXhpbWlzZWRJdGVtcygpOiBDb250ZW50SXRlbVtdIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IENvbnRlbnRJdGVtW10gPSBbXTtcclxuICAgICAgICB0aGlzLmRlZXBGaWx0ZXJDb250ZW50SXRlbXModGhpcy5jb250ZW50SXRlbXMsIHJlc3VsdCwgKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgaWYgKENvbnRlbnRJdGVtLmlzU3RhY2soaXRlbSkgJiYgaXRlbS5pbml0aWFsV2FudE1heGltaXNlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChDb250ZW50SXRlbS5pc0NvbXBvbmVudEl0ZW0oaXRlbSkgJiYgaXRlbS5pbml0aWFsV2FudE1heGltaXNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGdldEl0ZW1zQnlQb3BJblBhcmVudElkKHBvcEluUGFyZW50SWQ6IHN0cmluZyk6IENvbnRlbnRJdGVtW10ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogQ29udGVudEl0ZW1bXSA9IFtdO1xyXG4gICAgICAgIHRoaXMuZGVlcEZpbHRlckNvbnRlbnRJdGVtcyh0aGlzLmNvbnRlbnRJdGVtcywgcmVzdWx0LCAoaXRlbSkgPT4gaXRlbS5wb3BJblBhcmVudElkcy5pbmNsdWRlcyhwb3BJblBhcmVudElkKSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICB0b0NvbmZpZygpOiBSZXNvbHZlZEl0ZW1Db25maWcge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdlbmVyYXRlIEdyb3VuZEl0ZW0gY29uZmlnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgc2V0QWN0aXZlQ29tcG9uZW50SXRlbShpdGVtOiBDb21wb25lbnRJdGVtLCBmb2N1czogYm9vbGVhbiwgc3VwcHJlc3NGb2N1c0V2ZW50OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgLy8gb25seSBhcHBsaWNhYmxlIGlmIENvbXBvbmVudEl0ZW0gaXMgcm9vdCBhbmQgdGhlbiBpdCBhbHdheXMgaGFzIGZvY3VzXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVOb2RlU2l6ZSgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGdldEVsZW1lbnRXaWR0aEFuZEhlaWdodCh0aGlzLl9jb250YWluZXJFbGVtZW50KTtcclxuXHJcbiAgICAgICAgc2V0RWxlbWVudFdpZHRoKHRoaXMuZWxlbWVudCwgd2lkdGgpO1xyXG4gICAgICAgIHNldEVsZW1lbnRIZWlnaHQodGhpcy5lbGVtZW50LCBoZWlnaHQpO1xyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIEdyb3VuZEl0ZW0gY2FuIGJlIGVtcHR5XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgc2V0RWxlbWVudFdpZHRoKHRoaXMuY29udGVudEl0ZW1zWzBdLmVsZW1lbnQsIHdpZHRoKTtcclxuICAgICAgICAgICAgc2V0RWxlbWVudEhlaWdodCh0aGlzLmNvbnRlbnRJdGVtc1swXS5lbGVtZW50LCBoZWlnaHQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRlZXBHZXRBbGxDb250ZW50SXRlbXMoY29udGVudDogcmVhZG9ubHkgQ29udGVudEl0ZW1bXSwgcmVzdWx0OiBDb250ZW50SXRlbVtdKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gY29udGVudFtpXTtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goY29udGVudEl0ZW0pO1xyXG4gICAgICAgICAgICB0aGlzLmRlZXBHZXRBbGxDb250ZW50SXRlbXMoY29udGVudEl0ZW0uY29udGVudEl0ZW1zLCByZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRlZXBGaWx0ZXJDb250ZW50SXRlbXMoY29udGVudDogcmVhZG9ubHkgQ29udGVudEl0ZW1bXSwgcmVzdWx0OiBDb250ZW50SXRlbVtdLFxyXG4gICAgICAgIGNoZWNrQWNjZXB0RnRuOiAoKHRoaXM6IHZvaWQsIGl0ZW06IENvbnRlbnRJdGVtKSA9PiBib29sZWFuKVxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gY29udGVudFtpXTtcclxuICAgICAgICAgICAgaWYgKGNoZWNrQWNjZXB0RnRuKGNvbnRlbnRJdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY29udGVudEl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZGVlcEZpbHRlckNvbnRlbnRJdGVtcyhjb250ZW50SXRlbS5jb250ZW50SXRlbXMsIHJlc3VsdCwgY2hlY2tBY2NlcHRGdG4pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBHcm91bmRJdGVtIHtcclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQXJlYSBleHRlbmRzIENvbnRlbnRJdGVtLkFyZWEge1xyXG4gICAgICAgIHNpZGU6IGtleW9mIHR5cGVvZiBBcmVhLlNpZGU7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBBcmVhIHtcclxuICAgICAgICBleHBvcnQgY29uc3QgZW51bSBTaWRlIHtcclxuICAgICAgICAgICAgeTIsXHJcbiAgICAgICAgICAgIHgyLFxyXG4gICAgICAgICAgICB5MSxcclxuICAgICAgICAgICAgeDEsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBleHBvcnQgdHlwZSBTaWRlcyA9IHsgW3NpZGUgaW4ga2V5b2YgdHlwZW9mIFNpZGVdOiBrZXlvZiB0eXBlb2YgU2lkZTsgfVxyXG5cclxuICAgICAgICBleHBvcnQgY29uc3Qgb3Bwb3NpdGVTaWRlczogU2lkZXMgPSB7XHJcbiAgICAgICAgICAgIHkyOiAneTEnLFxyXG4gICAgICAgICAgICB4MjogJ3gxJyxcclxuICAgICAgICAgICAgeTE6ICd5MicsXHJcbiAgICAgICAgICAgIHgxOiAneDInLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoZG9jdW1lbnQ6IERvY3VtZW50KTogSFRNTERpdkVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Hb2xkZW5MYXlvdXQpO1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkl0ZW0pO1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLlJvb3QpO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudEl0ZW1Db25maWcsIEl0ZW1Db25maWcsIFJvd09yQ29sdW1uSXRlbUNvbmZpZywgU3RhY2tJdGVtQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL2NvbmZpZydcclxuaW1wb3J0IHsgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcsIFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL3Jlc29sdmVkLWNvbmZpZydcclxuaW1wb3J0IHsgU3BsaXR0ZXIgfSBmcm9tICcuLi9jb250cm9scy9zcGxpdHRlcidcclxuaW1wb3J0IHsgQXNzZXJ0RXJyb3IsIFVuZXhwZWN0ZWROdWxsRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InXHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcidcclxuaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWNvbnN0YW50cydcclxuaW1wb3J0IHsgSXRlbVR5cGUsIEpzb25WYWx1ZSwgU2l6ZVVuaXRFbnVtLCBXaWR0aE9ySGVpZ2h0UHJvcGVydHlOYW1lIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnXHJcbmltcG9ydCB7XHJcbiAgICBnZXRFbGVtZW50SGVpZ2h0LFxyXG4gICAgZ2V0RWxlbWVudFdpZHRoLFxyXG4gICAgZ2V0RWxlbWVudFdpZHRoQW5kSGVpZ2h0LFxyXG4gICAgbnVtYmVyVG9QaXhlbHMsXHJcbiAgICBwaXhlbHNUb051bWJlcixcclxuICAgIHNldEVsZW1lbnRIZWlnaHQsXHJcbiAgICBzZXRFbGVtZW50V2lkdGhcclxufSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIlxyXG5pbXBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi9jb21wb25lbnQtaXRlbSdcclxuaW1wb3J0IHsgQ29udGVudEl0ZW0gfSBmcm9tICcuL2NvbnRlbnQtaXRlbSdcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBjbGFzcyBSb3dPckNvbHVtbiBleHRlbmRzIENvbnRlbnRJdGVtIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoaWxkRWxlbWVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb25maWdUeXBlOiAncm93JyB8ICdjb2x1bW4nO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaXNDb2x1bW46IGJvb2xlYW47XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zcGxpdHRlclNpemU6IG51bWJlcjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3NwbGl0dGVyR3JhYlNpemU6IG51bWJlcjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RpbWVuc2lvbjogV2lkdGhPckhlaWdodFByb3BlcnR5TmFtZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3NwbGl0dGVyOiBTcGxpdHRlcltdID0gW107XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9zcGxpdHRlclBvc2l0aW9uOiBudW1iZXIgfCBudWxsO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfc3BsaXR0ZXJNaW5Qb3NpdGlvbjogbnVtYmVyIHwgbnVsbDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3NwbGl0dGVyTWF4UG9zaXRpb246IG51bWJlciB8IG51bGw7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IoaXNDb2x1bW46IGJvb2xlYW4sIGxheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXIsIGNvbmZpZzogUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX3Jvd09yQ29sdW1uUGFyZW50OiBDb250ZW50SXRlbVxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIobGF5b3V0TWFuYWdlciwgY29uZmlnLCBfcm93T3JDb2x1bW5QYXJlbnQsIFJvd09yQ29sdW1uLmNyZWF0ZUVsZW1lbnQoZG9jdW1lbnQsIGlzQ29sdW1uKSk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNSb3cgPSAhaXNDb2x1bW47XHJcbiAgICAgICAgdGhpcy5pc0NvbHVtbiA9IGlzQ29sdW1uO1xyXG5cclxuICAgICAgICB0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIgPSB0aGlzLmVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5fc3BsaXR0ZXJTaXplID0gbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuZGltZW5zaW9ucy5ib3JkZXJXaWR0aDtcclxuICAgICAgICB0aGlzLl9zcGxpdHRlckdyYWJTaXplID0gbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuZGltZW5zaW9ucy5ib3JkZXJHcmFiV2lkdGg7XHJcbiAgICAgICAgdGhpcy5faXNDb2x1bW4gPSBpc0NvbHVtbjtcclxuICAgICAgICB0aGlzLl9kaW1lbnNpb24gPSBpc0NvbHVtbiA/ICdoZWlnaHQnIDogJ3dpZHRoJztcclxuICAgICAgICB0aGlzLl9zcGxpdHRlclBvc2l0aW9uID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9zcGxpdHRlck1pblBvc2l0aW9uID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9zcGxpdHRlck1heFBvc2l0aW9uID0gbnVsbDtcclxuXHJcbiAgICAgICAgc3dpdGNoIChjb25maWcudHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnJvdzpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jb25maWdUeXBlID0gY29uZmlnLnR5cGU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignUk9DQ0NUMDA5MjUnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmV3Q29tcG9uZW50KGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSwgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsIHRpdGxlPzogc3RyaW5nLCBpbmRleD86IG51bWJlcik6IENvbXBvbmVudEl0ZW0ge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1Db25maWc6IENvbXBvbmVudEl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdjb21wb25lbnQnLFxyXG4gICAgICAgICAgICBjb21wb25lbnRUeXBlLFxyXG4gICAgICAgICAgICBjb21wb25lbnRTdGF0ZSxcclxuICAgICAgICAgICAgdGl0bGUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gdGhpcy5uZXdJdGVtKGl0ZW1Db25maWcsIGluZGV4KSBhcyBDb21wb25lbnRJdGVtO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZENvbXBvbmVudChjb21wb25lbnRUeXBlOiBKc29uVmFsdWUsIGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlLCB0aXRsZT86IHN0cmluZywgaW5kZXg/OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1Db25maWc6IENvbXBvbmVudEl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdjb21wb25lbnQnLFxyXG4gICAgICAgICAgICBjb21wb25lbnRUeXBlLFxyXG4gICAgICAgICAgICBjb21wb25lbnRTdGF0ZSxcclxuICAgICAgICAgICAgdGl0bGUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hZGRJdGVtKGl0ZW1Db25maWcsIGluZGV4KTtcclxuICAgIH1cclxuXHJcbiAgICBuZXdJdGVtKGl0ZW1Db25maWc6IFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFN0YWNrSXRlbUNvbmZpZyB8IENvbXBvbmVudEl0ZW1Db25maWcsICBpbmRleD86IG51bWJlcik6IENvbnRlbnRJdGVtIHtcclxuICAgICAgICBpbmRleCA9IHRoaXMuYWRkSXRlbShpdGVtQ29uZmlnLCBpbmRleCk7XHJcbiAgICAgICAgY29uc3QgY3JlYXRlZEl0ZW0gPSB0aGlzLmNvbnRlbnRJdGVtc1tpbmRleF07XHJcblxyXG4gICAgICAgIGlmIChDb250ZW50SXRlbS5pc1N0YWNrKGNyZWF0ZWRJdGVtKSAmJiAoSXRlbUNvbmZpZy5pc0NvbXBvbmVudChpdGVtQ29uZmlnKSkpIHtcclxuICAgICAgICAgICAgLy8gY3JlYXRlZEl0ZW0gaXMgYSBTdGFjayB3aGljaCB3YXMgY3JlYXRlZCB0byBob2xkIHdhbnRlZCBjb21wb25lbnQuICBSZXR1cm4gY29tcG9uZW50XHJcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVkSXRlbS5jb250ZW50SXRlbXNbMF07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZWRJdGVtO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhZGRJdGVtKGl0ZW1Db25maWc6IFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFN0YWNrSXRlbUNvbmZpZyB8IENvbXBvbmVudEl0ZW1Db25maWcsXHJcbiAgICAgICAgaW5kZXg/OiBudW1iZXJcclxuICAgICk6IG51bWJlciB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmNoZWNrTWluaW1pc2VNYXhpbWlzZWRTdGFjaygpO1xyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkSXRlbUNvbmZpZyA9IEl0ZW1Db25maWcucmVzb2x2ZShpdGVtQ29uZmlnLCBmYWxzZSk7XHJcbiAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlQW5kSW5pdENvbnRlbnRJdGVtKHJlc29sdmVkSXRlbUNvbmZpZywgdGhpcyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkQ2hpbGQoY29udGVudEl0ZW0sIGluZGV4LCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYSBuZXcgY29udGVudEl0ZW0gdG8gdGhlIFJvdyBvciBDb2x1bW5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY29udGVudEl0ZW0gLVxyXG4gICAgICogQHBhcmFtIGluZGV4IC0gVGhlIHBvc2l0aW9uIG9mIHRoZSBuZXcgaXRlbSB3aXRoaW4gdGhlIFJvdyBvciBDb2x1bW4uXHJcbiAgICAgKiAgICAgICAgICAgICAgICBJZiBubyBpbmRleCBpcyBwcm92aWRlZCB0aGUgaXRlbSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbmRcclxuICAgICAqIEBwYXJhbSBzdXNwZW5kUmVzaXplIC0gSWYgdHJ1ZSB0aGUgaXRlbXMgd29uJ3QgYmUgcmVzaXplZC4gVGhpcyB3aWxsIGxlYXZlIHRoZSBpdGVtIGluXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGFuIGluY29uc2lzdGVudCBzdGF0ZSBhbmQgaXMgb25seSBpbnRlbmRlZCB0byBiZSB1c2VkIGlmIG11bHRpcGxlXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuIG5lZWQgdG8gYmUgYWRkZWQgaW4gb25lIGdvIGFuZCByZXNpemUgaXMgY2FsbGVkIGFmdGVyd2FyZHNcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBvdmVycmlkZSBhZGRDaGlsZChjb250ZW50SXRlbTogQ29udGVudEl0ZW0sIGluZGV4PzogbnVtYmVyLCBzdXNwZW5kUmVzaXplPzogYm9vbGVhbik6IG51bWJlciB7XHJcblxyXG4gICAgICAgIC8vIGNvbnRlbnRJdGVtID0gdGhpcy5sYXlvdXRNYW5hZ2VyLl8kbm9ybWFsaXplQ29udGVudEl0ZW0oY29udGVudEl0ZW0sIHRoaXMpO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNwbGl0dGVyRWxlbWVudCA9IHRoaXMuY3JlYXRlU3BsaXR0ZXIoTWF0aC5tYXgoMCwgaW5kZXggLSAxKSkuZWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgIGlmIChpbmRleCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGVudEl0ZW1zW2luZGV4IC0gMV0uZWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgc3BsaXR0ZXJFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIHNwbGl0dGVyRWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgY29udGVudEl0ZW0uZWxlbWVudCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRJdGVtc1swXS5lbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYmVmb3JlYmVnaW4nLCBzcGxpdHRlckVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgc3BsaXR0ZXJFbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYmVmb3JlYmVnaW4nLCBjb250ZW50SXRlbS5lbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lci5hcHBlbmRDaGlsZChjb250ZW50SXRlbS5lbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyLmFkZENoaWxkKGNvbnRlbnRJdGVtLCBpbmRleCk7XHJcblxyXG4gICAgICAgIGNvbnN0IG5ld0l0ZW1TaXplID0gKDEgLyB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGgpICogMTAwO1xyXG5cclxuICAgICAgICBpZiAoc3VzcGVuZFJlc2l6ZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnc3RhdGVDaGFuZ2VkJyk7XHJcbiAgICAgICAgICAgIHJldHVybiBpbmRleDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXhlZENvbnRlbnRJdGVtID0gdGhpcy5jb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgIGlmIChpbmRleGVkQ29udGVudEl0ZW0gPT09IGNvbnRlbnRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50SXRlbS5zaXplID0gbmV3SXRlbVNpemU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtU2l6ZSA9IGluZGV4ZWRDb250ZW50SXRlbS5zaXplICo9ICgxMDAgLSBuZXdJdGVtU2l6ZSkgLyAxMDA7XHJcbiAgICAgICAgICAgICAgICBpbmRleGVkQ29udGVudEl0ZW0uc2l6ZSA9IGl0ZW1TaXplO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuZW1pdEJhc2VCdWJibGluZ0V2ZW50KCdzdGF0ZUNoYW5nZWQnKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGluZGV4O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhIGNoaWxkIG9mIHRoaXMgZWxlbWVudFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBjb250ZW50SXRlbSAtXHJcbiAgICAgKiBAcGFyYW0ga2VlcENoaWxkIC0gSWYgdHJ1ZSB0aGUgY2hpbGQgd2lsbCBiZSByZW1vdmVkLCBidXQgbm90IGRlc3Ryb3llZFxyXG4gICAgICpcclxuICAgICAqL1xyXG4gICAgb3ZlcnJpZGUgcmVtb3ZlQ2hpbGQoY29udGVudEl0ZW06IENvbnRlbnRJdGVtLCBrZWVwQ2hpbGQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuY29udGVudEl0ZW1zLmluZGV4T2YoY29udGVudEl0ZW0pO1xyXG4gICAgICAgIGNvbnN0IHNwbGl0dGVySW5kZXggPSBNYXRoLm1heChpbmRleCAtIDEsIDApO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCByZW1vdmUgY2hpbGQuIENvbnRlbnRJdGVtIGlzIG5vdCBjaGlsZCBvZiB0aGlzIFJvdyBvciBDb2x1bW4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFJlbW92ZSB0aGUgc3BsaXR0ZXIgYmVmb3JlIHRoZSBpdGVtIG9yIGFmdGVyIGlmIHRoZSBpdGVtIGhhcHBlbnNcclxuICAgICAgICAgKiB0byBiZSB0aGUgZmlyc3QgaW4gdGhlIHJvdy9jb2x1bW5cclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAodGhpcy5fc3BsaXR0ZXJbc3BsaXR0ZXJJbmRleF0pIHtcclxuICAgICAgICAgICAgdGhpcy5fc3BsaXR0ZXJbc3BsaXR0ZXJJbmRleF0uZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9zcGxpdHRlci5zcGxpY2Uoc3BsaXR0ZXJJbmRleCwgMSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdXBlci5yZW1vdmVDaGlsZChjb250ZW50SXRlbSwga2VlcENoaWxkKTtcclxuXHJcbiAgICAgICAgLy8gaWYgKHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCA9PT0gMSAmJiB0aGlzLmlzQ2xvc2FibGUgPT09IHRydWUpIHtcclxuICAgICAgICAvLyAgICAgY29uc3QgY2hpbGRJdGVtID0gdGhpcy5jb250ZW50SXRlbXNbMF07XHJcbiAgICAgICAgLy8gICAgIHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuX3Jvd09yQ29sdW1uUGFyZW50LnJlcGxhY2VDaGlsZCh0aGlzLCBjaGlsZEl0ZW0sIHRydWUpO1xyXG4gICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnc3RhdGVDaGFuZ2VkJyk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVwbGFjZXMgYSBjaGlsZCBvZiB0aGlzIFJvdyBvciBDb2x1bW4gd2l0aCBhbm90aGVyIGNvbnRlbnRJdGVtXHJcbiAgICAgKi9cclxuICAgIG92ZXJyaWRlIHJlcGxhY2VDaGlsZChvbGRDaGlsZDogQ29udGVudEl0ZW0sIG5ld0NoaWxkOiBDb250ZW50SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSBvbGRDaGlsZC5zaXplO1xyXG4gICAgICAgIHN1cGVyLnJlcGxhY2VDaGlsZChvbGRDaGlsZCwgbmV3Q2hpbGQpO1xyXG4gICAgICAgIG5ld0NoaWxkLnNpemUgPSBzaXplO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2l6ZShmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ3N0YXRlQ2hhbmdlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIHdoZW5ldmVyIHRoZSBkaW1lbnNpb25zIG9mIHRoaXMgaXRlbSBvciBvbmUgb2YgaXRzIHBhcmVudHMgY2hhbmdlXHJcbiAgICAgKi9cclxuICAgIG92ZXJyaWRlIHVwZGF0ZVNpemUoZm9yY2U6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuYmVnaW5WaXJ0dWFsU2l6ZWRDb250YWluZXJBZGRpbmcoKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU5vZGVTaXplKCk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29udGVudEl0ZW1zU2l6ZShmb3JjZSk7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmVuZFZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEludm9rZWQgcmVjdXJzaXZlbHkgYnkgdGhlIGxheW91dCBtYW5hZ2VyLiBDb250ZW50SXRlbS5pbml0IGFwcGVuZHNcclxuICAgICAqIHRoZSBjb250ZW50SXRlbSdzIERPTSBlbGVtZW50cyB0byB0aGUgY29udGFpbmVyLCBSb3dPckNvbHVtbiBpbml0IGFkZHMgc3BsaXR0ZXJzXHJcbiAgICAgKiBpbiBiZXR3ZWVuIHRoZW1cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBvdmVycmlkZSBpbml0KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGlzZWQgPT09IHRydWUpIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVOb2RlU2l6ZSgpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnRJdGVtc1tpXS5lbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyLmluaXQoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggLSAxOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5jb250ZW50SXRlbXNbaV0uZWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgdGhpcy5jcmVhdGVTcGxpdHRlcihpKS5lbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdENvbnRlbnRJdGVtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHRvQ29uZmlnKCk6IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUgYXMgJ3JvdycgfCAnY29sdW1uJyxcclxuICAgICAgICAgICAgY29udGVudDogdGhpcy5jYWxjdWxhdGVDb25maWdDb250ZW50KCkgYXMgKFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcpW10sXHJcbiAgICAgICAgICAgIHNpemU6IHRoaXMuc2l6ZSxcclxuICAgICAgICAgICAgc2l6ZVVuaXQ6IHRoaXMuc2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIG1pblNpemU6IHRoaXMubWluU2l6ZSxcclxuICAgICAgICAgICAgbWluU2l6ZVVuaXQ6IHRoaXMubWluU2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiB0aGlzLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHNldFBhcmVudChwYXJlbnQ6IENvbnRlbnRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fcm93T3JDb2x1bW5QYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICAgICAgc3VwZXIuc2V0UGFyZW50KHBhcmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVOb2RlU2l6ZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVJlbGF0aXZlU2l6ZXMoKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRBYnNvbHV0ZVNpemVzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZW1pdEJhc2VCdWJibGluZ0V2ZW50KCdzdGF0ZUNoYW5nZWQnKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3Jlc2l6ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHVybnMgdGhlIHJlbGF0aXZlIHNpemVzIGNhbGN1bGF0ZWQgYnkgY2FsY3VsYXRlUmVsYXRpdmVTaXplcyBpbnRvXHJcbiAgICAgKiBhYnNvbHV0ZSBwaXhlbCB2YWx1ZXMgYW5kIGFwcGxpZXMgdGhlbSB0byB0aGUgY2hpbGRyZW4ncyBET00gZWxlbWVudHNcclxuICAgICAqXHJcbiAgICAgKiBBc3NpZ25zIGFkZGl0aW9uYWwgcGl4ZWxzIHRvIGNvdW50ZXJhY3QgTWF0aC5mbG9vclxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2V0QWJzb2x1dGVTaXplcygpIHtcclxuICAgICAgICBjb25zdCBhYnNvbHV0ZVNpemVzID0gdGhpcy5jYWxjdWxhdGVBYnNvbHV0ZVNpemVzKCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGFic29sdXRlU2l6ZXMuYWRkaXRpb25hbFBpeGVsIC0gaSA+IDApIHtcclxuICAgICAgICAgICAgICAgIGFic29sdXRlU2l6ZXMuaXRlbVNpemVzW2ldKys7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc0NvbHVtbikge1xyXG4gICAgICAgICAgICAgICAgc2V0RWxlbWVudFdpZHRoKHRoaXMuY29udGVudEl0ZW1zW2ldLmVsZW1lbnQsIGFic29sdXRlU2l6ZXMuY3Jvc3NBeGlzU2l6ZSk7XHJcbiAgICAgICAgICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHRoaXMuY29udGVudEl0ZW1zW2ldLmVsZW1lbnQsIGFic29sdXRlU2l6ZXMuaXRlbVNpemVzW2ldKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNldEVsZW1lbnRXaWR0aCh0aGlzLmNvbnRlbnRJdGVtc1tpXS5lbGVtZW50LCBhYnNvbHV0ZVNpemVzLml0ZW1TaXplc1tpXSk7XHJcbiAgICAgICAgICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHRoaXMuY29udGVudEl0ZW1zW2ldLmVsZW1lbnQsIGFic29sdXRlU2l6ZXMuY3Jvc3NBeGlzU2l6ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBhYnNvbHV0ZSBzaXplcyBvZiBhbGwgb2YgdGhlIGNoaWxkcmVuIG9mIHRoaXMgSXRlbS5cclxuICAgICAqIEByZXR1cm5zIFNldCB3aXRoIGFic29sdXRlIHNpemVzIGFuZCBhZGRpdGlvbmFsIHBpeGVscy5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZUFic29sdXRlU2l6ZXMoKTogUm93T3JDb2x1bW4uQWJzb2x1dGVTaXplcyB7XHJcbiAgICAgICAgY29uc3QgdG90YWxTcGxpdHRlclNpemUgPSAodGhpcy5jb250ZW50SXRlbXMubGVuZ3RoIC0gMSkgKiB0aGlzLl9zcGxpdHRlclNpemU7XHJcbiAgICAgICAgY29uc3QgeyB3aWR0aDogZWxlbWVudFdpZHRoLCBoZWlnaHQ6IGVsZW1lbnRIZWlnaHQgfSA9IGdldEVsZW1lbnRXaWR0aEFuZEhlaWdodCh0aGlzLmVsZW1lbnQpO1xyXG5cclxuICAgICAgICBsZXQgdG90YWxTaXplOiBudW1iZXI7XHJcbiAgICAgICAgbGV0IGNyb3NzQXhpc1NpemU6IG51bWJlcjtcclxuICAgICAgICBpZiAodGhpcy5faXNDb2x1bW4pIHtcclxuICAgICAgICAgICAgdG90YWxTaXplID0gZWxlbWVudEhlaWdodCAtIHRvdGFsU3BsaXR0ZXJTaXplO1xyXG4gICAgICAgICAgICBjcm9zc0F4aXNTaXplID0gZWxlbWVudFdpZHRoO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRvdGFsU2l6ZSA9IGVsZW1lbnRXaWR0aCAtIHRvdGFsU3BsaXR0ZXJTaXplO1xyXG4gICAgICAgICAgICBjcm9zc0F4aXNTaXplID0gZWxlbWVudEhlaWdodDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB0b3RhbEFzc2lnbmVkID0gMDtcclxuICAgICAgICBjb25zdCBpdGVtU2l6ZXM6IG51bWJlcltdID0gW107XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSB0aGlzLmNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgbGV0IGl0ZW1TaXplOiBudW1iZXI7XHJcbiAgICAgICAgICAgIGlmIChjb250ZW50SXRlbS5zaXplVW5pdCA9PT0gU2l6ZVVuaXRFbnVtLlBlcmNlbnQpIHtcclxuICAgICAgICAgICAgICAgIGl0ZW1TaXplID0gTWF0aC5mbG9vcih0b3RhbFNpemUgKiAoY29udGVudEl0ZW0uc2l6ZSAvIDEwMCkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdST0NDQVM2NjkyJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRvdGFsQXNzaWduZWQgKz0gaXRlbVNpemU7XHJcbiAgICAgICAgICAgIGl0ZW1TaXplcy5wdXNoKGl0ZW1TaXplKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxQaXhlbCA9IE1hdGguZmxvb3IodG90YWxTaXplIC0gdG90YWxBc3NpZ25lZCk7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGl0ZW1TaXplcyxcclxuICAgICAgICAgICAgYWRkaXRpb25hbFBpeGVsLFxyXG4gICAgICAgICAgICB0b3RhbFNpemUsXHJcbiAgICAgICAgICAgIGNyb3NzQXhpc1NpemUsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgdGhlIHJlbGF0aXZlIHNpemVzIG9mIGFsbCBjaGlsZHJlbiBvZiB0aGlzIEl0ZW0uIFRoZSBsb2dpY1xyXG4gICAgICogaXMgYXMgZm9sbG93czpcclxuICAgICAqXHJcbiAgICAgKiAtIEFkZCB1cCB0aGUgdG90YWwgc2l6ZSBvZiBhbGwgaXRlbXMgdGhhdCBoYXZlIGEgY29uZmlndXJlZCBzaXplXHJcbiAgICAgKlxyXG4gICAgICogLSBJZiB0aGUgdG90YWwgPT0gMTAwIChjaGVjayBmb3IgZmxvYXRpbmcgcG9pbnQgZXJyb3JzKVxyXG4gICAgICogICAgICAgIEV4Y2VsbGVudCwgam9iIGRvbmVcclxuICAgICAqXHJcbiAgICAgKiAtIElmIHRoZSB0b3RhbCBpcyBcXD4gMTAwLFxyXG4gICAgICogICAgICAgIHNldCB0aGUgc2l6ZSBvZiBpdGVtcyB3aXRob3V0IHNldCBkaW1lbnNpb25zIHRvIDEvMyBhbmQgYWRkIHRoaXMgdG8gdGhlIHRvdGFsXHJcbiAgICAgKiAgICAgICAgc2V0IHRoZSBzaXplIG9mZiBhbGwgaXRlbXMgc28gdGhhdCB0aGUgdG90YWwgaXMgaHVuZHJlZCByZWxhdGl2ZSB0byB0aGVpciBvcmlnaW5hbCBzaXplXHJcbiAgICAgKlxyXG4gICAgICogLSBJZiB0aGUgdG90YWwgaXMgXFw8IDEwMFxyXG4gICAgICogICAgICAgIElmIHRoZXJlIGFyZSBpdGVtcyB3aXRob3V0IHNldCBkaW1lbnNpb25zLCBkaXN0cmlidXRlIHRoZSByZW1haW5kZXIgdG8gMTAwIGV2ZW5seSBiZXR3ZWVuIHRoZW1cclxuICAgICAqICAgICAgICBJZiB0aGVyZSBhcmUgbm8gaXRlbXMgd2l0aG91dCBzZXQgZGltZW5zaW9ucywgaW5jcmVhc2UgYWxsIGl0ZW1zIHNpemVzIHJlbGF0aXZlIHRvXHJcbiAgICAgKiAgICAgICAgdGhlaXIgb3JpZ2luYWwgc2l6ZSBzbyB0aGF0IHRoZXkgYWRkIHVwIHRvIDEwMFxyXG4gICAgICpcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZVJlbGF0aXZlU2l6ZXMoKSB7XHJcblxyXG4gICAgICAgIGxldCB0b3RhbCA9IDA7XHJcbiAgICAgICAgY29uc3QgaXRlbXNXaXRoRnJhY3Rpb25hbFNpemU6IENvbnRlbnRJdGVtW10gPSBbXTtcclxuICAgICAgICBsZXQgdG90YWxGcmFjdGlvbmFsU2l6ZSA9IDA7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSB0aGlzLmNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgY29uc3Qgc2l6ZVVuaXQgPSBjb250ZW50SXRlbS5zaXplVW5pdDtcclxuICAgICAgICAgICAgc3dpdGNoIChzaXplVW5pdCkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBTaXplVW5pdEVudW0uUGVyY2VudDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNvbnRlbnRJdGVtLnNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXNlIFNpemVVbml0RW51bS5GcmFjdGlvbmFsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbXNXaXRoRnJhY3Rpb25hbFNpemUucHVzaChjb250ZW50SXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWxGcmFjdGlvbmFsU2l6ZSArPSBjb250ZW50SXRlbS5zaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ1JPQ0NSUzQ5MTEwJywgSlNPTi5zdHJpbmdpZnkoY29udGVudEl0ZW0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRXZlcnl0aGluZyBhZGRzIHVwIHRvIGh1bmRyZWQsIGFsbCBnb29kIDotKVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChNYXRoLnJvdW5kKHRvdGFsKSA9PT0gMTAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzcGVjdE1pbkl0ZW1TaXplKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogQWxsb2NhdGUgdGhlIHJlbWFpbmluZyBzaXplIHRvIHRoZSBpdGVtcyB3aXRoIGEgZnJhY3Rpb25hbCBzaXplXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZiAoTWF0aC5yb3VuZCh0b3RhbCkgPCAxMDAgJiYgaXRlbXNXaXRoRnJhY3Rpb25hbFNpemUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZnJhY3Rpb25hbEFsbG9jYXRlZFNpemUgPSAxMDAgLSB0b3RhbDtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXNXaXRoRnJhY3Rpb25hbFNpemUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IGl0ZW1zV2l0aEZyYWN0aW9uYWxTaXplW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemUgPSBmcmFjdGlvbmFsQWxsb2NhdGVkU2l6ZSAqIChjb250ZW50SXRlbS5zaXplIC8gdG90YWxGcmFjdGlvbmFsU2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEl0ZW0uc2l6ZVVuaXQgPSBTaXplVW5pdEVudW0uUGVyY2VudDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMucmVzcGVjdE1pbkl0ZW1TaXplKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBJZiB0aGUgdG90YWwgaXMgPiAxMDAsIGJ1dCB0aGVyZSBhcmUgYWxzbyBpdGVtcyB3aXRoIGEgZnJhY3Rpb25hbCBzaXplLCBhc3NpZ24gYW5vdGhlciA1MCVcclxuICAgICAgICAgICAgICAgICAqIHRvIHRoZSBmcmFjdGlvbmFsIGl0ZW1zXHJcbiAgICAgICAgICAgICAgICAgKlxyXG4gICAgICAgICAgICAgICAgICogVGhpcyB3aWxsIGJlIHJlc2V0IGluIHRoZSBuZXh0IHN0ZXBcclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKE1hdGgucm91bmQodG90YWwpID4gMTAwICYmIGl0ZW1zV2l0aEZyYWN0aW9uYWxTaXplLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zV2l0aEZyYWN0aW9uYWxTaXplLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gaXRlbXNXaXRoRnJhY3Rpb25hbFNpemVbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemUgPSA1MCAqIChjb250ZW50SXRlbS5zaXplIC8gdG90YWxGcmFjdGlvbmFsU2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemVVbml0ID0gU2l6ZVVuaXRFbnVtLlBlcmNlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IDUwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogU2V0IGV2ZXJ5IGl0ZW1zIHNpemUgcmVsYXRpdmUgdG8gMTAwIHJlbGF0aXZlIHRvIGl0cyBzaXplIHRvIHRvdGFsXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IHRoaXMuY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemUgPSAoY29udGVudEl0ZW0uc2l6ZSAvIHRvdGFsKSAqIDEwMDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3BlY3RNaW5JdGVtU2l6ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRqdXN0cyB0aGUgY29sdW1uIHdpZHRocyB0byByZXNwZWN0IHRoZSBkaW1lbnNpb25zIG1pbkl0ZW1XaWR0aCBpZiBzZXQuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZXNwZWN0TWluSXRlbVNpemUoKSB7XHJcbiAgICAgICAgaW50ZXJmYWNlIEVudHJ5IHtcclxuICAgICAgICAgICAgc2l6ZTogbnVtYmVyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbWluSXRlbVNpemUgPSB0aGlzLmNhbGN1bGF0ZUNvbnRlbnRJdGVtTWluU2l6ZSh0aGlzKTtcclxuXHJcbiAgICAgICAgaWYgKG1pbkl0ZW1TaXplIDw9IDAgfHwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoIDw9IDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCB0b3RhbE92ZXJNaW4gPSAwO1xyXG4gICAgICAgICAgICBsZXQgdG90YWxVbmRlck1pbiA9IDA7XHJcbiAgICAgICAgICAgIGNvbnN0IGVudHJpZXNPdmVyTWluOiBFbnRyeVtdID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IGFsbEVudHJpZXM6IEVudHJ5W10gPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGFic29sdXRlU2l6ZXMgPSB0aGlzLmNhbGN1bGF0ZUFic29sdXRlU2l6ZXMoKTtcclxuXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBGaWd1cmUgb3V0IGhvdyBtdWNoIHdlIGFyZSB1bmRlciB0aGUgbWluIGl0ZW0gc2l6ZSB0b3RhbCBhbmQgaG93IG11Y2ggcm9vbSB3ZSBoYXZlIHRvIHVzZS5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWJzb2x1dGVTaXplcy5pdGVtU2l6ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1TaXplID0gYWJzb2x1dGVTaXplcy5pdGVtU2l6ZXNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGVudHJ5OiBFbnRyeTtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtU2l6ZSA8IG1pbkl0ZW1TaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWxVbmRlck1pbiArPSBtaW5JdGVtU2l6ZSAtIGl0ZW1TaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIGVudHJ5ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBtaW5JdGVtU2l6ZVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbE92ZXJNaW4gKz0gaXRlbVNpemUgLSBtaW5JdGVtU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogaXRlbVNpemVcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGVudHJpZXNPdmVyTWluLnB1c2goZW50cnkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGFsbEVudHJpZXMucHVzaChlbnRyeSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBJZiB0aGVyZSBpcyBub3RoaW5nIHVuZGVyIG1pbiwgb3IgdGhlcmUgaXMgbm90IGVub3VnaCBvdmVyIHRvIG1ha2UgdXAgdGhlIGRpZmZlcmVuY2UsIGRvIG5vdGhpbmcuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZiAodG90YWxVbmRlck1pbiA9PT0gMCB8fCB0b3RhbFVuZGVyTWluID4gdG90YWxPdmVyTWluKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIEV2ZW5seSByZWR1Y2UgYWxsIGNvbHVtbnMgdGhhdCBhcmUgb3ZlciB0aGUgbWluIGl0ZW0gd2lkdGggdG8gbWFrZSB1cCB0aGUgZGlmZmVyZW5jZS5cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVkdWNlUGVyY2VudCA9IHRvdGFsVW5kZXJNaW4gLyB0b3RhbE92ZXJNaW47XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVtYWluaW5nU2l6ZSA9IHRvdGFsVW5kZXJNaW47XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXNPdmVyTWluLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzT3Zlck1pbltpXTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWR1Y2VkU2l6ZSA9IE1hdGgucm91bmQoKGVudHJ5LnNpemUgLSBtaW5JdGVtU2l6ZSkgKiByZWR1Y2VQZXJjZW50KTtcclxuICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdTaXplIC09IHJlZHVjZWRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIGVudHJ5LnNpemUgLT0gcmVkdWNlZFNpemU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBUYWtlIGFueXRoaW5nIHJlbWFpbmluZyBmcm9tIHRoZSBsYXN0IGl0ZW0uXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmdTaXplICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWxsRW50cmllc1thbGxFbnRyaWVzLmxlbmd0aCAtIDFdLnNpemUgLT0gcmVtYWluaW5nU2l6ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIFNldCBldmVyeSBpdGVtcyBzaXplIHJlbGF0aXZlIHRvIDEwMCByZWxhdGl2ZSB0byBpdHMgc2l6ZSB0byB0b3RhbFxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSB0aGlzLmNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50SXRlbS5zaXplID0gKGFsbEVudHJpZXNbaV0uc2l6ZSAvIGFic29sdXRlU2l6ZXMudG90YWxTaXplKSAqIDEwMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBTcGxpdHRlciwgYmluZHMgZXZlbnRzIHRvIGl0IGFuZCBhZGRzXHJcbiAgICAgKiBpdCB0byB0aGUgYXJyYXkgb2Ygc3BsaXR0ZXJzIGF0IHRoZSBwb3NpdGlvbiBzcGVjaWZpZWQgYXMgdGhlIGluZGV4IGFyZ3VtZW50XHJcbiAgICAgKlxyXG4gICAgICogV2hhdCBpdCBkb2Vzbid0IGRvIHRob3VnaCBpcyBhcHBlbmQgdGhlIHNwbGl0dGVyIHRvIHRoZSBET01cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgcG9zaXRpb24gb2YgdGhlIHNwbGl0dGVyXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVNwbGl0dGVyKGluZGV4OiBudW1iZXIpOiBTcGxpdHRlciB7XHJcbiAgICAgICAgY29uc3Qgc3BsaXR0ZXIgPSBuZXcgU3BsaXR0ZXIodGhpcy5faXNDb2x1bW4sIHRoaXMuX3NwbGl0dGVyU2l6ZSwgdGhpcy5fc3BsaXR0ZXJHcmFiU2l6ZSk7XHJcbiAgICAgICAgc3BsaXR0ZXIub24oJ2RyYWcnLCAob2Zmc2V0WCwgb2Zmc2V0WSkgPT4gdGhpcy5vblNwbGl0dGVyRHJhZyhzcGxpdHRlciwgb2Zmc2V0WCwgb2Zmc2V0WSkpO1xyXG4gICAgICAgIHNwbGl0dGVyLm9uKCdkcmFnU3RvcCcsICgpID0+IHRoaXMub25TcGxpdHRlckRyYWdTdG9wKHNwbGl0dGVyKSk7XHJcbiAgICAgICAgc3BsaXR0ZXIub24oJ2RyYWdTdGFydCcsICgpID0+IHRoaXMub25TcGxpdHRlckRyYWdTdGFydChzcGxpdHRlcikpO1xyXG4gICAgICAgIHRoaXMuX3NwbGl0dGVyLnNwbGljZShpbmRleCwgMCwgc3BsaXR0ZXIpO1xyXG4gICAgICAgIHJldHVybiBzcGxpdHRlcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExvY2F0ZXMgdGhlIGluc3RhbmNlIG9mIFNwbGl0dGVyIGluIHRoZSBhcnJheSBvZlxyXG4gICAgICogcmVnaXN0ZXJlZCBzcGxpdHRlcnMgYW5kIHJldHVybnMgYSBtYXAgY29udGFpbmluZyB0aGUgY29udGVudEl0ZW1cclxuICAgICAqIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHNwbGl0dGVycywgYm90aCBvZiB3aGljaCBhcmUgYWZmZWN0ZWQgaWYgdGhlXHJcbiAgICAgKiBzcGxpdHRlciBpcyBtb3ZlZFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIEEgbWFwIG9mIGNvbnRlbnRJdGVtcyB0aGF0IHRoZSBzcGxpdHRlciBhZmZlY3RzXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRTcGxpdEl0ZW1zKHNwbGl0dGVyOiBTcGxpdHRlcikge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fc3BsaXR0ZXIuaW5kZXhPZihzcGxpdHRlcik7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGJlZm9yZTogdGhpcy5jb250ZW50SXRlbXNbaW5kZXhdLFxyXG4gICAgICAgICAgICBhZnRlcjogdGhpcy5jb250ZW50SXRlbXNbaW5kZXggKyAxXVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVDb250ZW50SXRlbU1pblNpemUoY29udGVudEl0ZW06IENvbnRlbnRJdGVtKSB7XHJcbiAgICAgICAgY29uc3QgbWluU2l6ZSA9IGNvbnRlbnRJdGVtLm1pblNpemU7XHJcbiAgICAgICAgaWYgKG1pblNpemUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAoY29udGVudEl0ZW0ubWluU2l6ZVVuaXQgPT09IFNpemVVbml0RW51bS5QaXhlbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1pblNpemU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ1JPQ0dNRDk4ODMxJywgSlNPTi5zdHJpbmdpZnkoY29udGVudEl0ZW0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpbWVuc2lvbnMgPSB0aGlzLmxheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLmRpbWVuc2lvbnM7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pc0NvbHVtbiA/IGRpbWVuc2lvbnMuZGVmYXVsdE1pbkl0ZW1IZWlnaHQgOiBkaW1lbnNpb25zLmRlZmF1bHRNaW5JdGVtV2lkdGg7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgbWluaW11bSBkaW1lbnNpb25zIGZvciB0aGUgZ2l2ZW4gaXRlbSBjb25maWd1cmF0aW9uIGFycmF5XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVDb250ZW50SXRlbXNUb3RhbE1pblNpemUoY29udGVudEl0ZW1zOiByZWFkb25seSBDb250ZW50SXRlbVtdKSB7XHJcbiAgICAgICAgbGV0IHRvdGFsTWluU2l6ZSA9IDA7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgY29udGVudEl0ZW0gb2YgY29udGVudEl0ZW1zKSB7XHJcbiAgICAgICAgICAgIHRvdGFsTWluU2l6ZSArPSB0aGlzLmNhbGN1bGF0ZUNvbnRlbnRJdGVtTWluU2l6ZShjb250ZW50SXRlbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdG90YWxNaW5TaXplO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW52b2tlZCB3aGVuIGEgc3BsaXR0ZXIncyBkcmFnTGlzdGVuZXIgZmlyZXMgZHJhZ1N0YXJ0LiBDYWxjdWxhdGVzIHRoZSBzcGxpdHRlcnNcclxuICAgICAqIG1vdmVtZW50IGFyZWEgb25jZSAoc28gdGhhdCBpdCBkb2Vzbid0IG5lZWQgY2FsY3VsYXRpbmcgb24gZXZlcnkgbW91c2Vtb3ZlIGV2ZW50KVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25TcGxpdHRlckRyYWdTdGFydChzcGxpdHRlcjogU3BsaXR0ZXIpIHtcclxuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0U3BsaXRJdGVtcyhzcGxpdHRlcik7XHJcblxyXG4gICAgICAgIGNvbnN0IGJlZm9yZVdpZHRoID0gcGl4ZWxzVG9OdW1iZXIoaXRlbXMuYmVmb3JlLmVsZW1lbnQuc3R5bGVbdGhpcy5fZGltZW5zaW9uXSk7XHJcbiAgICAgICAgY29uc3QgYWZ0ZXJTaXplID0gcGl4ZWxzVG9OdW1iZXIoaXRlbXMuYWZ0ZXIuZWxlbWVudC5zdHlsZVt0aGlzLl9kaW1lbnNpb25dKTtcclxuICAgICAgICBjb25zdCBiZWZvcmVNaW5TaXplID0gdGhpcy5jYWxjdWxhdGVDb250ZW50SXRlbXNUb3RhbE1pblNpemUoaXRlbXMuYmVmb3JlLmNvbnRlbnRJdGVtcyk7XHJcbiAgICAgICAgY29uc3QgYWZ0ZXJNaW5TaXplID0gdGhpcy5jYWxjdWxhdGVDb250ZW50SXRlbXNUb3RhbE1pblNpemUoaXRlbXMuYWZ0ZXIuY29udGVudEl0ZW1zKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc3BsaXR0ZXJQb3NpdGlvbiA9IDA7XHJcbiAgICAgICAgdGhpcy5fc3BsaXR0ZXJNaW5Qb3NpdGlvbiA9IC0xICogKGJlZm9yZVdpZHRoIC0gYmVmb3JlTWluU2l6ZSk7XHJcbiAgICAgICAgdGhpcy5fc3BsaXR0ZXJNYXhQb3NpdGlvbiA9IGFmdGVyU2l6ZSAtIGFmdGVyTWluU2l6ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEludm9rZWQgd2hlbiBhIHNwbGl0dGVyJ3MgRHJhZ0xpc3RlbmVyIGZpcmVzIGRyYWcuIFVwZGF0ZXMgdGhlIHNwbGl0dGVyJ3MgRE9NIHBvc2l0aW9uLFxyXG4gICAgICogYnV0IG5vdCB0aGUgc2l6ZXMgb2YgdGhlIGVsZW1lbnRzIHRoZSBzcGxpdHRlciBjb250cm9scyBpbiBvcmRlciB0byBtaW5pbWl6ZSByZXNpemUgZXZlbnRzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHNwbGl0dGVyIC1cclxuICAgICAqIEBwYXJhbSBvZmZzZXRYIC0gUmVsYXRpdmUgcGl4ZWwgdmFsdWVzIHRvIHRoZSBzcGxpdHRlcidzIG9yaWdpbmFsIHBvc2l0aW9uLiBDYW4gYmUgbmVnYXRpdmVcclxuICAgICAqIEBwYXJhbSBvZmZzZXRZIC0gUmVsYXRpdmUgcGl4ZWwgdmFsdWVzIHRvIHRoZSBzcGxpdHRlcidzIG9yaWdpbmFsIHBvc2l0aW9uLiBDYW4gYmUgbmVnYXRpdmVcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uU3BsaXR0ZXJEcmFnKHNwbGl0dGVyOiBTcGxpdHRlciwgb2Zmc2V0WDogbnVtYmVyLCBvZmZzZXRZOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgb2Zmc2V0ID0gdGhpcy5faXNDb2x1bW4gPyBvZmZzZXRZIDogb2Zmc2V0WDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3NwbGl0dGVyTWluUG9zaXRpb24gPT09IG51bGwgfHwgdGhpcy5fc3BsaXR0ZXJNYXhQb3NpdGlvbiA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignUk9DT1NENTkyMjYnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb2Zmc2V0ID0gTWF0aC5tYXgob2Zmc2V0LCB0aGlzLl9zcGxpdHRlck1pblBvc2l0aW9uKTtcclxuICAgICAgICBvZmZzZXQgPSBNYXRoLm1pbihvZmZzZXQsIHRoaXMuX3NwbGl0dGVyTWF4UG9zaXRpb24pO1xyXG5cclxuICAgICAgICB0aGlzLl9zcGxpdHRlclBvc2l0aW9uID0gb2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IG9mZnNldFBpeGVscyA9IG51bWJlclRvUGl4ZWxzKG9mZnNldCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzQ29sdW1uKSB7XHJcbiAgICAgICAgICAgIHNwbGl0dGVyLmVsZW1lbnQuc3R5bGUudG9wID0gb2Zmc2V0UGl4ZWxzO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNwbGl0dGVyLmVsZW1lbnQuc3R5bGUubGVmdCA9IG9mZnNldFBpeGVscztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZva2VkIHdoZW4gYSBzcGxpdHRlcidzIERyYWdMaXN0ZW5lciBmaXJlcyBkcmFnU3RvcC4gUmVzZXRzIHRoZSBzcGxpdHRlcnMgRE9NIHBvc2l0aW9uLFxyXG4gICAgICogYW5kIGFwcGxpZXMgdGhlIG5ldyBzaXplcyB0byB0aGUgZWxlbWVudHMgYmVmb3JlIGFuZCBhZnRlciB0aGUgc3BsaXR0ZXIgYW5kIHRoZWlyIGNoaWxkcmVuXHJcbiAgICAgKiBvbiB0aGUgbmV4dCBhbmltYXRpb24gZnJhbWVcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uU3BsaXR0ZXJEcmFnU3RvcChzcGxpdHRlcjogU3BsaXR0ZXIpIHtcclxuICAgICAgICBpZiAodGhpcy5fc3BsaXR0ZXJQb3NpdGlvbiA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignUk9DT1NEUzY2OTMyJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldFNwbGl0SXRlbXMoc3BsaXR0ZXIpO1xyXG4gICAgICAgICAgICBjb25zdCBzaXplQmVmb3JlID0gcGl4ZWxzVG9OdW1iZXIoaXRlbXMuYmVmb3JlLmVsZW1lbnQuc3R5bGVbdGhpcy5fZGltZW5zaW9uXSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNpemVBZnRlciA9IHBpeGVsc1RvTnVtYmVyKGl0ZW1zLmFmdGVyLmVsZW1lbnQuc3R5bGVbdGhpcy5fZGltZW5zaW9uXSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNwbGl0dGVyUG9zaXRpb25JblJhbmdlID0gKHRoaXMuX3NwbGl0dGVyUG9zaXRpb24gKyBzaXplQmVmb3JlKSAvIChzaXplQmVmb3JlICsgc2l6ZUFmdGVyKTtcclxuICAgICAgICAgICAgY29uc3QgdG90YWxSZWxhdGl2ZVNpemUgPSBpdGVtcy5iZWZvcmUuc2l6ZSArIGl0ZW1zLmFmdGVyLnNpemU7XHJcblxyXG4gICAgICAgICAgICBpdGVtcy5iZWZvcmUuc2l6ZSA9IHNwbGl0dGVyUG9zaXRpb25JblJhbmdlICogdG90YWxSZWxhdGl2ZVNpemU7XHJcbiAgICAgICAgICAgIGl0ZW1zLmFmdGVyLnNpemUgPSAoMSAtIHNwbGl0dGVyUG9zaXRpb25JblJhbmdlKSAqIHRvdGFsUmVsYXRpdmVTaXplO1xyXG5cclxuICAgICAgICAgICAgc3BsaXR0ZXIuZWxlbWVudC5zdHlsZS50b3AgPSBudW1iZXJUb1BpeGVscygwKTtcclxuICAgICAgICAgICAgc3BsaXR0ZXIuZWxlbWVudC5zdHlsZS5sZWZ0ID0gbnVtYmVyVG9QaXhlbHMoMCk7XHJcblxyXG4gICAgICAgICAgICBnbG9iYWxUaGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLnVwZGF0ZVNpemUoZmFsc2UpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUm93T3JDb2x1bW4ge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGludGVyZmFjZSBBYnNvbHV0ZVNpemVzIHtcclxuICAgICAgICBpdGVtU2l6ZXM6IG51bWJlcltdLFxyXG4gICAgICAgIGFkZGl0aW9uYWxQaXhlbDogbnVtYmVyLFxyXG4gICAgICAgIHRvdGFsU2l6ZTogbnVtYmVyLFxyXG4gICAgICAgIGNyb3NzQXhpc1NpemU6IG51bWJlclxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50RGltZW5zaW9uU2l6ZShlbGVtZW50OiBIVE1MRWxlbWVudCwgZGltZW5zaW9uOiBXaWR0aE9ySGVpZ2h0UHJvcGVydHlOYW1lKTogbnVtYmVyIHtcclxuICAgICAgICBpZiAoZGltZW5zaW9uID09PSAnd2lkdGgnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBnZXRFbGVtZW50V2lkdGgoZWxlbWVudCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRIZWlnaHQoZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBzZXRFbGVtZW50RGltZW5zaW9uU2l6ZShlbGVtZW50OiBIVE1MRWxlbWVudCwgZGltZW5zaW9uOiBXaWR0aE9ySGVpZ2h0UHJvcGVydHlOYW1lLCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGRpbWVuc2lvbiA9PT0gJ3dpZHRoJykge1xyXG4gICAgICAgICAgICByZXR1cm4gc2V0RWxlbWVudFdpZHRoKGVsZW1lbnQsIHZhbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gc2V0RWxlbWVudEhlaWdodChlbGVtZW50LCB2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KGRvY3VtZW50OiBEb2N1bWVudCwgaXNDb2x1bW46IGJvb2xlYW4pOiBIVE1MRGl2RWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkl0ZW0pO1xyXG4gICAgICAgIGlmIChpc0NvbHVtbikge1xyXG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Db2x1bW4pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLlJvdyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudEl0ZW1Db25maWcsIEl0ZW1Db25maWcgfSBmcm9tICcuLi9jb25maWcvY29uZmlnJztcclxuaW1wb3J0IHsgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLCBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZywgUmVzb2x2ZWRJdGVtQ29uZmlnLCBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9yZXNvbHZlZC1jb25maWcnO1xyXG5pbXBvcnQgeyBIZWFkZXIgfSBmcm9tICcuLi9jb250cm9scy9oZWFkZXInO1xyXG5pbXBvcnQgeyBBc3NlcnRFcnJvciwgVW5leHBlY3RlZE51bGxFcnJvciwgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IERyYWdMaXN0ZW5lciB9IGZyb20gJy4uL3V0aWxzL2RyYWctbGlzdGVuZXInO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9ldmVudC1lbWl0dGVyJztcclxuaW1wb3J0IHsgQXJlYUxpbmtlZFJlY3QsIEl0ZW1UeXBlLCBKc29uVmFsdWUsIFNpZGUsIFNpemVVbml0RW51bSwgV2lkdGhBbmRIZWlnaHQsIFdpZHRoT3JIZWlnaHRQcm9wZXJ0eU5hbWUgfSBmcm9tICcuLi91dGlscy90eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgICBnZXRFbGVtZW50V2lkdGhBbmRIZWlnaHQsXHJcbiAgICBudW1iZXJUb1BpeGVscyxcclxuICAgIHNldEVsZW1lbnREaXNwbGF5VmlzaWJpbGl0eVxyXG59IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4vY29tcG9uZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBDb21wb25lbnRQYXJlbnRhYmxlSXRlbSB9IGZyb20gJy4vY29tcG9uZW50LXBhcmVudGFibGUtaXRlbSc7XHJcbmltcG9ydCB7IENvbnRlbnRJdGVtIH0gZnJvbSAnLi9jb250ZW50LWl0ZW0nO1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGNsYXNzIFN0YWNrIGV4dGVuZHMgQ29tcG9uZW50UGFyZW50YWJsZUl0ZW0ge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaGVhZGVyQ29uZmlnOiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIgfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9oZWFkZXI6IEhlYWRlcjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoaWxkRWxlbWVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9tYXhpbWlzZWRFbmFibGVkOiBib29sZWFuO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfYWN0aXZlQ29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2Ryb3BTZWdtZW50OiBTdGFjay5TZWdtZW50O1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZHJvcEluZGV4OiBudW1iZXI7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9jb250ZW50QXJlYURpbWVuc2lvbnM6IFN0YWNrLkNvbnRlbnRBcmVhRGltZW5zaW9ucztcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2hlYWRlclNpZGVDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pbml0aWFsV2FudE1heGltaXNlOiBib29sZWFuO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaW5pdGlhbEFjdGl2ZUl0ZW1JbmRleDogbnVtYmVyO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3Jlc2l6ZUxpc3RlbmVyID0gKCkgPT4gdGhpcy5oYW5kbGVSZXNpemUoKTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX21heGltaXNlZExpc3RlbmVyID0gKCkgPT4gdGhpcy5oYW5kbGVNYXhpbWlzZWQoKTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX21pbmltaXNlZExpc3RlbmVyID0gKCkgPT4gdGhpcy5oYW5kbGVNaW5pbWlzZWQoKTtcclxuXHJcbiAgICBnZXQgY2hpbGRFbGVtZW50Q29udGFpbmVyKCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lcjsgfVxyXG4gICAgZ2V0IGhlYWRlcigpOiBIZWFkZXIgeyByZXR1cm4gdGhpcy5faGVhZGVyOyB9XHJcbiAgICBnZXQgaGVhZGVyU2hvdygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2hlYWRlci5zaG93OyB9XHJcbiAgICBnZXQgaGVhZGVyU2lkZSgpOiBTaWRlIHsgcmV0dXJuIHRoaXMuX2hlYWRlci5zaWRlOyB9XHJcbiAgICBnZXQgaGVhZGVyTGVmdFJpZ2h0U2lkZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9oZWFkZXIubGVmdFJpZ2h0U2lkZWQ7IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGdldCBjb250ZW50QXJlYURpbWVuc2lvbnMoKTogU3RhY2suQ29udGVudEFyZWFEaW1lbnNpb25zIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2NvbnRlbnRBcmVhRGltZW5zaW9uczsgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZ2V0IGluaXRpYWxXYW50TWF4aW1pc2UoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9pbml0aWFsV2FudE1heGltaXNlOyB9XHJcbiAgICBnZXQgaXNNYXhpbWlzZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzID09PSB0aGlzLmxheW91dE1hbmFnZXIubWF4aW1pc2VkU3RhY2s7IH1cclxuICAgIGdldCBzdGFja1BhcmVudCgpOiBDb250ZW50SXRlbSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0YWNrIHNob3VsZCBhbHdheXMgaGF2ZSBhIHBhcmVudCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IobGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlciwgY29uZmlnOiBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZywgcGFyZW50OiBDb250ZW50SXRlbSkge1xyXG4gICAgICAgIHN1cGVyKGxheW91dE1hbmFnZXIsIGNvbmZpZywgcGFyZW50LCBTdGFjay5jcmVhdGVFbGVtZW50KGRvY3VtZW50KSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2hlYWRlckNvbmZpZyA9IGNvbmZpZy5oZWFkZXI7XHJcbiAgICAgICAgY29uc3QgbGF5b3V0SGVhZGVyQ29uZmlnID0gbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuaGVhZGVyO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZ0NvbnRlbnQgPSBjb25maWcuY29udGVudDtcclxuICAgICAgICAvLyBJZiBzdGFjayBoYXMgb25seSBvbmUgY29tcG9uZW50LCB0aGVuIHdlIGNhbiBhbHNvIGNoZWNrIHRoaXMgZm9yIGhlYWRlciBzZXR0aW5nc1xyXG4gICAgICAgIGxldCBjb21wb25lbnRIZWFkZXJDb25maWc6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlciB8IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAoY29uZmlnQ29udGVudC5sZW5ndGggIT09IDEpIHtcclxuICAgICAgICAgICAgY29tcG9uZW50SGVhZGVyQ29uZmlnID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0Q2hpbGRJdGVtQ29uZmlnID0gY29uZmlnQ29udGVudFswXTtcclxuICAgICAgICAgICAgY29tcG9uZW50SGVhZGVyQ29uZmlnID0gKGZpcnN0Q2hpbGRJdGVtQ29uZmlnIGFzIFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnKS5oZWFkZXI7IC8vIHdpbGwgYmUgdW5kZWZpbmVkIGlmIG5vdCBjb21wb25lbnQgKGFuZCB3b250IGJlIHN0YWNrKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5faW5pdGlhbFdhbnRNYXhpbWlzZSA9IGNvbmZpZy5tYXhpbWlzZWQ7XHJcbiAgICAgICAgdGhpcy5faW5pdGlhbEFjdGl2ZUl0ZW1JbmRleCA9IGNvbmZpZy5hY3RpdmVJdGVtSW5kZXggPz8gMDsgLy8gbWFrZSBzdXJlIGRlZmluZWRcclxuXHJcbiAgICAgICAgLy8gY2hlY2sgZm9yIGRlZmluZWQgdmFsdWUgZm9yIGVhY2ggaXRlbSBpbiBvcmRlciBvZiBTdGFjayAodGhpcyBJdGVtKSwgQ29tcG9uZW50IChmaXJzdCBjaGlsZCksIE1hbmFnZXIuXHJcbiAgICAgICAgY29uc3Qgc2hvdyA9IHRoaXMuX2hlYWRlckNvbmZpZz8uc2hvdyA/PyBjb21wb25lbnRIZWFkZXJDb25maWc/LnNob3cgPz8gbGF5b3V0SGVhZGVyQ29uZmlnLnNob3c7XHJcbiAgICAgICAgY29uc3QgcG9wb3V0ID0gdGhpcy5faGVhZGVyQ29uZmlnPy5wb3BvdXQgPz8gY29tcG9uZW50SGVhZGVyQ29uZmlnPy5wb3BvdXQgPz8gbGF5b3V0SGVhZGVyQ29uZmlnLnBvcG91dDtcclxuICAgICAgICBjb25zdCBtYXhpbWlzZSA9IHRoaXMuX2hlYWRlckNvbmZpZz8ubWF4aW1pc2UgPz8gY29tcG9uZW50SGVhZGVyQ29uZmlnPy5tYXhpbWlzZSA/PyBsYXlvdXRIZWFkZXJDb25maWcubWF4aW1pc2U7XHJcbiAgICAgICAgY29uc3QgY2xvc2UgPSB0aGlzLl9oZWFkZXJDb25maWc/LmNsb3NlID8/IGNvbXBvbmVudEhlYWRlckNvbmZpZz8uY2xvc2UgPz8gbGF5b3V0SGVhZGVyQ29uZmlnLmNsb3NlO1xyXG4gICAgICAgIGNvbnN0IG1pbmltaXNlID0gdGhpcy5faGVhZGVyQ29uZmlnPy5taW5pbWlzZSA/PyBjb21wb25lbnRIZWFkZXJDb25maWc/Lm1pbmltaXNlID8/IGxheW91dEhlYWRlckNvbmZpZy5taW5pbWlzZTtcclxuICAgICAgICBjb25zdCB0YWJEcm9wZG93biA9IHRoaXMuX2hlYWRlckNvbmZpZz8udGFiRHJvcGRvd24gPz8gY29tcG9uZW50SGVhZGVyQ29uZmlnPy50YWJEcm9wZG93biA/PyBsYXlvdXRIZWFkZXJDb25maWcudGFiRHJvcGRvd247XHJcbiAgICAgICAgdGhpcy5fbWF4aW1pc2VkRW5hYmxlZCA9IG1heGltaXNlICE9PSBmYWxzZTtcclxuICAgICAgICBjb25zdCBoZWFkZXJTZXR0aW5nczogSGVhZGVyLlNldHRpbmdzID0ge1xyXG4gICAgICAgICAgICBzaG93OiBzaG93ICE9PSBmYWxzZSxcclxuICAgICAgICAgICAgc2lkZTogc2hvdyA9PT0gZmFsc2UgPyBTaWRlLnRvcCA6IHNob3csXHJcbiAgICAgICAgICAgIHBvcG91dEVuYWJsZWQ6IHBvcG91dCAhPT0gZmFsc2UsXHJcbiAgICAgICAgICAgIHBvcG91dExhYmVsOiBwb3BvdXQgPT09IGZhbHNlID8gJycgOiBwb3BvdXQsXHJcbiAgICAgICAgICAgIG1heGltaXNlRW5hYmxlZDogdGhpcy5fbWF4aW1pc2VkRW5hYmxlZCxcclxuICAgICAgICAgICAgbWF4aW1pc2VMYWJlbDogbWF4aW1pc2UgPT09IGZhbHNlID8gJycgOiBtYXhpbWlzZSxcclxuICAgICAgICAgICAgY2xvc2VFbmFibGVkOiBjbG9zZSAhPT0gZmFsc2UsXHJcbiAgICAgICAgICAgIGNsb3NlTGFiZWw6IGNsb3NlID09PSBmYWxzZSA/ICcnIDogY2xvc2UsXHJcbiAgICAgICAgICAgIG1pbmltaXNlRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICAgICAgbWluaW1pc2VMYWJlbDogbWluaW1pc2UsXHJcbiAgICAgICAgICAgIHRhYkRyb3Bkb3duRW5hYmxlZDogdGFiRHJvcGRvd24gIT09IGZhbHNlLFxyXG4gICAgICAgICAgICB0YWJEcm9wZG93bkxhYmVsOiB0YWJEcm9wZG93biA9PT0gZmFsc2UgPyAnJyA6IHRhYkRyb3Bkb3duLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuX2hlYWRlciA9IG5ldyBIZWFkZXIobGF5b3V0TWFuYWdlcixcclxuICAgICAgICAgICAgdGhpcywgaGVhZGVyU2V0dGluZ3MsXHJcbiAgICAgICAgICAgICgpID0+IHRoaXMuZ2V0QWN0aXZlQ29tcG9uZW50SXRlbSgpLFxyXG4gICAgICAgICAgICAoKSA9PiB0aGlzLnJlbW92ZSgpLFxyXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmhhbmRsZVBvcG91dEV2ZW50KCksXHJcbiAgICAgICAgICAgICgpID0+IHRoaXMudG9nZ2xlTWF4aW1pc2UoKSxcclxuICAgICAgICAgICAgKGV2KSA9PiB0aGlzLmhhbmRsZUhlYWRlckNsaWNrRXZlbnQoZXYpLFxyXG4gICAgICAgICAgICAoZXYpID0+IHRoaXMuaGFuZGxlSGVhZGVyVG91Y2hTdGFydEV2ZW50KGV2KSxcclxuICAgICAgICAgICAgKGl0ZW0pID0+IHRoaXMuaGFuZGxlSGVhZGVyQ29tcG9uZW50UmVtb3ZlRXZlbnQoaXRlbSksXHJcbiAgICAgICAgICAgIChpdGVtKSA9PiB0aGlzLmhhbmRsZUhlYWRlckNvbXBvbmVudEZvY3VzRXZlbnQoaXRlbSksXHJcbiAgICAgICAgICAgICh4LCB5LCBkcmFnTGlzdGVuZXIsIGl0ZW0pID0+IHRoaXMuaGFuZGxlSGVhZGVyQ29tcG9uZW50U3RhcnREcmFnRXZlbnQoeCwgeSwgZHJhZ0xpc3RlbmVyLCBpdGVtKSxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvLyB0aGlzLl9kcm9wWm9uZXMgPSB7fTtcclxuXHJcbiAgICAgICAgdGhpcy5pc1N0YWNrID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fY2hpbGRFbGVtZW50Q29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VjdGlvbicpO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuSXRlbXMpO1xyXG5cclxuICAgICAgICB0aGlzLm9uKCdyZXNpemUnLCB0aGlzLl9yZXNpemVMaXN0ZW5lcik7XHJcbiAgICAgICAgaWYgKHRoaXMuX21heGltaXNlZEVuYWJsZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5vbignbWF4aW1pc2VkJywgdGhpcy5fbWF4aW1pc2VkTGlzdGVuZXIpO1xyXG4gICAgICAgICAgICB0aGlzLm9uKCdtaW5pbWlzZWQnLCB0aGlzLl9taW5pbWlzZWRMaXN0ZW5lcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5faGVhZGVyLmVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIpO1xyXG5cclxuICAgICAgICB0aGlzLnNldHVwSGVhZGVyUG9zaXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSB1cGRhdGVTaXplKGZvcmNlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmJlZ2luVmlydHVhbFNpemVkQ29udGFpbmVyQWRkaW5nKCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVOb2RlU2l6ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnRlbnRJdGVtc1NpemUoZm9yY2UpO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5lbmRWaXJ0dWFsU2l6ZWRDb250YWluZXJBZGRpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgaW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pc0luaXRpYWxpc2VkID09PSB0cnVlKSByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlTm9kZVNpemUoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50SXRlbXNbaV0uZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdXBlci5pbml0KCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtcyA9IHRoaXMuY29udGVudEl0ZW1zO1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtQ291bnQgPSBjb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIGlmIChjb250ZW50SXRlbUNvdW50ID4gMCkgeyAvLyBjb250ZW50SXRlbUNvdW50IHdpbGwgYmUgMCBvbiBkcmFnIGRyb3BcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxBY3RpdmVJdGVtSW5kZXggPCAwIHx8IHRoaXMuX2luaXRpYWxBY3RpdmVJdGVtSW5kZXggPj0gY29udGVudEl0ZW1Db3VudCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBY3RpdmVJdGVtSW5kZXggb3V0IG9mIHJhbmdlOiAke3RoaXMuX2luaXRpYWxBY3RpdmVJdGVtSW5kZXh9IGlkOiAke3RoaXMuaWR9YCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKGNvbnRlbnRJdGVtIGluc3RhbmNlb2YgQ29tcG9uZW50SXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdGFjayBDb250ZW50IEl0ZW0gaXMgbm90IG9mIHR5cGUgQ29tcG9uZW50SXRlbTogJHtpfSBpZDogJHt0aGlzLmlkfWApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hlYWRlci5jcmVhdGVUYWIoY29udGVudEl0ZW0sIGkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50SXRlbS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLmNvbnRhaW5lci5zZXRCYXNlTG9naWNhbFpJbmRleCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZUNvbXBvbmVudEl0ZW0oY29udGVudEl0ZW1zW3RoaXMuX2luaXRpYWxBY3RpdmVJdGVtSW5kZXhdIGFzIENvbXBvbmVudEl0ZW0sIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9oZWFkZXIudXBkYXRlVGFiU2l6ZXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pbml0Q29udGVudEl0ZW1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgKFN0YWNrOmNsYXNzKS5zZXRBY3RpdmVDb21wb25lbnRJdGVtfSAqL1xyXG4gICAgc2V0QWN0aXZlQ29udGVudEl0ZW0oaXRlbTogQ29udGVudEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICBpZiAoIUNvbnRlbnRJdGVtLmlzQ29tcG9uZW50SXRlbShpdGVtKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0YWNrLnNldEFjdGl2ZUNvbnRlbnRJdGVtOiBpdGVtIGlzIG5vdCBhIENvbXBvbmVudEl0ZW0nKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZUNvbXBvbmVudEl0ZW0oaXRlbSwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRBY3RpdmVDb21wb25lbnRJdGVtKGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0sIGZvY3VzOiBib29sZWFuLCBzdXBwcmVzc0ZvY3VzRXZlbnQgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9hY3RpdmVDb21wb25lbnRJdGVtICE9PSBjb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRJdGVtcy5pbmRleE9mKGNvbXBvbmVudEl0ZW0pID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb21wb25lbnRJdGVtIGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgc3RhY2snKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5iZWdpblNpemVJbnZhbGlkYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZUNvbXBvbmVudEl0ZW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmVDb21wb25lbnRJdGVtLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlQ29tcG9uZW50SXRlbSA9IGNvbXBvbmVudEl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGVhZGVyLnByb2Nlc3NBY3RpdmVDb21wb25lbnRDaGFuZ2VkKGNvbXBvbmVudEl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEl0ZW0uc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuZW5kU2l6ZUludmFsaWRhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnYWN0aXZlQ29udGVudEl0ZW1DaGFuZ2VkJywgY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuZW1pdCgnYWN0aXZlQ29udGVudEl0ZW1DaGFuZ2VkJywgY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZWRFdmVudCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5mb2N1c2VkIHx8IGZvY3VzKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5zZXRGb2N1c2VkQ29tcG9uZW50SXRlbShjb21wb25lbnRJdGVtLCBzdXBwcmVzc0ZvY3VzRXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoU3RhY2s6Y2xhc3MpLmdldEFjdGl2ZUNvbXBvbmVudEl0ZW19ICovXHJcbiAgICBnZXRBY3RpdmVDb250ZW50SXRlbSgpOiBDb250ZW50SXRlbSB8IG51bGwge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEFjdGl2ZUNvbXBvbmVudEl0ZW0oKSA/PyBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEFjdGl2ZUNvbXBvbmVudEl0ZW0oKTogQ29tcG9uZW50SXRlbSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZUNvbXBvbmVudEl0ZW07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZm9jdXNBY3RpdmVDb250ZW50SXRlbSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9hY3RpdmVDb21wb25lbnRJdGVtPy5mb2N1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG92ZXJyaWRlIHNldEZvY3VzZWRWYWx1ZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2hlYWRlci5hcHBseUZvY3VzZWRWYWx1ZSh2YWx1ZSk7XHJcbiAgICAgICAgc3VwZXIuc2V0Rm9jdXNlZFZhbHVlKHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBuZXdDb21wb25lbnQoY29tcG9uZW50VHlwZTogSnNvblZhbHVlLCBjb21wb25lbnRTdGF0ZT86IEpzb25WYWx1ZSwgdGl0bGU/OiBzdHJpbmcsIGluZGV4PzogbnVtYmVyKTogQ29tcG9uZW50SXRlbSB7XHJcbiAgICAgICAgY29uc3QgaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogJ2NvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFR5cGUsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlLFxyXG4gICAgICAgICAgICB0aXRsZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5ld0l0ZW0oaXRlbUNvbmZpZywgaW5kZXgpIGFzIENvbXBvbmVudEl0ZW07XHJcbiAgICB9XHJcblxyXG4gICAgYWRkQ29tcG9uZW50KGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSwgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsIHRpdGxlPzogc3RyaW5nLCBpbmRleD86IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgY29uc3QgaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogJ2NvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFR5cGUsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlLFxyXG4gICAgICAgICAgICB0aXRsZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZEl0ZW0oaXRlbUNvbmZpZywgaW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIG5ld0l0ZW0oaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZywgIGluZGV4PzogbnVtYmVyKTogQ29udGVudEl0ZW0ge1xyXG4gICAgICAgIGluZGV4ID0gdGhpcy5hZGRJdGVtKGl0ZW1Db25maWcsIGluZGV4KTtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50SXRlbXNbaW5kZXhdO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZEl0ZW0oaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZywgaW5kZXg/OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5jaGVja01pbmltaXNlTWF4aW1pc2VkU3RhY2soKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRJdGVtQ29uZmlnID0gSXRlbUNvbmZpZy5yZXNvbHZlKGl0ZW1Db25maWcsIGZhbHNlKTtcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IHRoaXMubGF5b3V0TWFuYWdlci5jcmVhdGVBbmRJbml0Q29udGVudEl0ZW0ocmVzb2x2ZWRJdGVtQ29uZmlnLCB0aGlzKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hZGRDaGlsZChjb250ZW50SXRlbSwgaW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIG92ZXJyaWRlIGFkZENoaWxkKGNvbnRlbnRJdGVtOiBDb250ZW50SXRlbSwgaW5kZXg/OiBudW1iZXIsIGZvY3VzID0gZmFsc2UpOiBudW1iZXIge1xyXG4gICAgICAgIGlmKGluZGV4ICE9PSB1bmRlZmluZWQgJiYgaW5kZXggPiB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGgpe1xyXG4gICAgICAgICAgICBpbmRleCAtPSAxO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ1NBQzk5NzI4Jyk7IC8vIHVuZGlzcGxheUNoaWxkKCkgcmVtb3ZlZCBzbyB0aGlzIGNvbmRpdGlvbiBzaG91bGQgbm8gbG9uZ2VyIG9jY3VyXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIShjb250ZW50SXRlbSBpbnN0YW5jZW9mIENvbXBvbmVudEl0ZW0pKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignU0FDQzg4NTMyJyk7IC8vIFN0YWNrcyBjYW4gb25seSBoYXZlIENvbXBvbmVudCBjaGlsZHJlblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gc3VwZXIuYWRkQ2hpbGQoY29udGVudEl0ZW0sIGluZGV4KTtcclxuICAgICAgICAgICAgdGhpcy5fY2hpbGRFbGVtZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKGNvbnRlbnRJdGVtLmVsZW1lbnQpO1xyXG4gICAgICAgICAgICB0aGlzLl9oZWFkZXIuY3JlYXRlVGFiKGNvbnRlbnRJdGVtLCBpbmRleCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlQ29tcG9uZW50SXRlbShjb250ZW50SXRlbSwgZm9jdXMpO1xyXG4gICAgICAgICAgICB0aGlzLl9oZWFkZXIudXBkYXRlVGFiU2l6ZXMoKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgICAgICAgICAgY29udGVudEl0ZW0uY29udGFpbmVyLnNldEJhc2VMb2dpY2FsWkluZGV4KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlZEV2ZW50KCk7XHJcbiAgICAgICAgICAgIHJldHVybiBpbmRleDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb3ZlcnJpZGUgcmVtb3ZlQ2hpbGQoY29udGVudEl0ZW06IENvbnRlbnRJdGVtLCBrZWVwQ2hpbGQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBjb21wb25lbnRJdGVtID0gY29udGVudEl0ZW0gYXMgQ29tcG9uZW50SXRlbTtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuY29udGVudEl0ZW1zLmluZGV4T2YoY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgY29uc3Qgc3RhY2tXaWxsQmVEZWxldGVkID0gdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID09PSAxO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fYWN0aXZlQ29tcG9uZW50SXRlbSA9PT0gY29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgICAgICBpZiAoY29tcG9uZW50SXRlbS5mb2N1c2VkKSB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRJdGVtLmJsdXIoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXN0YWNrV2lsbEJlRGVsZXRlZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSdyZSBhbHJlYWR5IHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgY29udGVudCBpdGVtIGxlZnQgKmFmdGVyKlxyXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZpbmcgY29udGVudEl0ZW0sIHNvIHdlIGNhbiBzYWZlbHkgYXNzdW1lIGluZGV4IDEgaXMgYSB2YWxpZCBvbmUgaWZcclxuICAgICAgICAgICAgICAgIC8vIHRoZSBpbmRleCBvZiBjb250ZW50SXRlbSBpcyAwLCBvdGhlcndpc2Ugd2UganVzdCB1c2UgdGhlIHByZXZpb3VzIGNvbnRlbnQgaXRlbS5cclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0FjdGl2ZUNvbXBvbmVudElkeCA9IGluZGV4ID09PSAwID8gMSA6IGluZGV4IC0gMTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlQ29tcG9uZW50SXRlbSh0aGlzLmNvbnRlbnRJdGVtc1tuZXdBY3RpdmVDb21wb25lbnRJZHhdIGFzIENvbXBvbmVudEl0ZW0sIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5faGVhZGVyLnJlbW92ZVRhYihjb21wb25lbnRJdGVtKTtcclxuXHJcbiAgICAgICAgc3VwZXIucmVtb3ZlQ2hpbGQoY29tcG9uZW50SXRlbSwga2VlcENoaWxkKTtcclxuXHJcbiAgICAgICAgdGhpcy5lbWl0U3RhdGVDaGFuZ2VkRXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1heGltaXNlcyB0aGUgSXRlbSBvciBtaW5pbWlzZXMgaXQgaWYgaXQgaXMgYWxyZWFkeSBtYXhpbWlzZWRcclxuICAgICAqL1xyXG4gICAgdG9nZ2xlTWF4aW1pc2UoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNNYXhpbWlzZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5taW5pbWlzZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4aW1pc2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbWF4aW1pc2UoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzTWF4aW1pc2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5zZXRNYXhpbWlzZWRTdGFjayh0aGlzKTtcclxuICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW1zID0gdGhpcy5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtQ291bnQgPSBjb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSBjb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGVudEl0ZW0gaW5zdGFuY2VvZiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEl0ZW0uZW50ZXJTdGFja01heGltaXNlZCgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ1NNQVhJODc3NzMnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZWRFdmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBtaW5pbWlzZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pc01heGltaXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuc2V0TWF4aW1pc2VkU3RhY2sodW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW1zID0gdGhpcy5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtQ291bnQgPSBjb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSBjb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGVudEl0ZW0gaW5zdGFuY2VvZiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEl0ZW0uZXhpdFN0YWNrTWF4aW1pc2VkKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignU01JTkk4Nzc3MycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlZEV2ZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG92ZXJyaWRlIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZUNvbXBvbmVudEl0ZW0/LmZvY3VzZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fYWN0aXZlQ29tcG9uZW50SXRlbS5ibHVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcclxuICAgICAgICB0aGlzLm9mZigncmVzaXplJywgdGhpcy5fcmVzaXplTGlzdGVuZXIpO1xyXG4gICAgICAgIGlmICh0aGlzLl9tYXhpbWlzZWRFbmFibGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMub2ZmKCdtYXhpbWlzZWQnLCB0aGlzLl9tYXhpbWlzZWRMaXN0ZW5lcik7XHJcbiAgICAgICAgICAgIHRoaXMub2ZmKCdtaW5pbWlzZWQnLCB0aGlzLl9taW5pbWlzZWRMaXN0ZW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2hlYWRlci5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgdG9Db25maWcoKTogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcge1xyXG4gICAgICAgIGxldCBhY3RpdmVJdGVtSW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAodGhpcy5fYWN0aXZlQ29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgICAgICBhY3RpdmVJdGVtSW5kZXggPSB0aGlzLmNvbnRlbnRJdGVtcy5pbmRleE9mKHRoaXMuX2FjdGl2ZUNvbXBvbmVudEl0ZW0pO1xyXG4gICAgICAgICAgICBpZiAoYWN0aXZlSXRlbUluZGV4IDwgMCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhY3RpdmUgY29tcG9uZW50IGl0ZW0gbm90IGZvdW5kIGluIHN0YWNrJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCA+IDAgJiYgYWN0aXZlSXRlbUluZGV4ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBub24tZW1wdHkgc3RhY2sgdG8gaGF2ZSBhbiBhY3RpdmUgY29tcG9uZW50IGl0ZW0nKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ3N0YWNrJyxcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRoaXMuY2FsY3VsYXRlQ29uZmlnQ29udGVudCgpIGFzIFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZ1tdLFxyXG4gICAgICAgICAgICAgICAgc2l6ZTogdGhpcy5zaXplLFxyXG4gICAgICAgICAgICAgICAgc2l6ZVVuaXQ6IHRoaXMuc2l6ZVVuaXQsXHJcbiAgICAgICAgICAgICAgICBtaW5TaXplOiB0aGlzLm1pblNpemUsXHJcbiAgICAgICAgICAgICAgICBtaW5TaXplVW5pdDogdGhpcy5taW5TaXplVW5pdCxcclxuICAgICAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxyXG4gICAgICAgICAgICAgICAgaXNDbG9zYWJsZTogdGhpcy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgICAgICAgICAgbWF4aW1pc2VkOiB0aGlzLmlzTWF4aW1pc2VkLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyOiB0aGlzLmNyZWF0ZUhlYWRlckNvbmZpZygpLFxyXG4gICAgICAgICAgICAgICAgYWN0aXZlSXRlbUluZGV4LFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2ssIHRoaXMgb25lIGlzIGdvaW5nIHRvIGJlIHRoZSB0cmlja3kgb25lOiBUaGUgdXNlciBoYXMgZHJvcHBlZCBhIHtAbGluayAoQ29udGVudEl0ZW06Y2xhc3MpfSBvbnRvIHRoaXMgc3RhY2suXHJcbiAgICAgKlxyXG4gICAgICogSXQgd2FzIGRyb3BwZWQgb24gZWl0aGVyIHRoZSBzdGFja3MgaGVhZGVyIG9yIHRoZSB0b3AsIHJpZ2h0LCBib3R0b20gb3IgbGVmdCBiaXQgb2YgdGhlIGNvbnRlbnQgYXJlYVxyXG4gICAgICogKHdoaWNoIG9uZSBvZiB0aG9zZSBpcyBzdG9yZWQgaW4gdGhpcy5fZHJvcFNlZ21lbnQpLiBOb3csIGlmIHRoZSB1c2VyIGhhcyBkcm9wcGVkIG9uIHRoZSBoZWFkZXIgdGhlIGNhc2VcclxuICAgICAqIGlzIHJlbGF0aXZlbHkgY2xlYXI6IFdlIGFkZCB0aGUgaXRlbSB0byB0aGUgZXhpc3Rpbmcgc3RhY2suLi4gam9iIGRvbmUgKG1pZ2h0IGJlIGdvb2QgdG8gaGF2ZVxyXG4gICAgICogdGFiIHJlb3JkZXJpbmcgYXQgc29tZSBwb2ludCwgYnV0IGxldHMgbm90IHN3ZWF0IGl0IHJpZ2h0IG5vdylcclxuICAgICAqXHJcbiAgICAgKiBJZiB0aGUgaXRlbSB3YXMgZHJvcHBlZCBvbiB0aGUgY29udGVudCBwYXJ0IHRoaW5ncyBhcmUgYSBiaXQgbW9yZSBjb21wbGljYXRlZC4gSWYgaXQgd2FzIGRyb3BwZWQgb24gZWl0aGVyIHRoZVxyXG4gICAgICogdG9wIG9yIGJvdHRvbSByZWdpb24gd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgY29sdW1uIGFuZCBwbGFjZSB0aGUgaXRlbXMgYWNjb3JkaW5nbHkuXHJcbiAgICAgKiBVbmxlc3MsIG9mIGNvdXJzZSBpZiB0aGUgc3RhY2sgaXMgYWxyZWFkeSB3aXRoaW4gYSBjb2x1bW4uLi4gaW4gd2hpY2ggY2FzZSB3ZSB3YW50XHJcbiAgICAgKiB0byBhZGQgdGhlIG5ld2x5IGNyZWF0ZWQgaXRlbSB0byB0aGUgZXhpc3RpbmcgY29sdW1uLi4uXHJcbiAgICAgKiBlaXRoZXIgcHJlcGVuZCBvciBhcHBlbmQgaXQsIGRlcGVuZGluZyBvbiB3ZXRoZXIgaXRzIHRvcCBvciBib3R0b20uXHJcbiAgICAgKlxyXG4gICAgICogU2FtZSB0aGluZyBmb3Igcm93cyBhbmQgbGVmdCAvIHJpZ2h0IGRyb3Agc2VnbWVudHMuLi4gc28gaW4gdG90YWwgdGhlcmUgYXJlIDkgdGhpbmdzIHRoYXQgY2FuIHBvdGVudGlhbGx5IGhhcHBlblxyXG4gICAgICogKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSkgKiBpcyBjaGlsZCBvZiB0aGUgcmlnaHQgcGFyZW50IChyb3csIGNvbHVtbikgKyBoZWFkZXIgZHJvcFxyXG4gICAgICpcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBvdmVycmlkZSBvbkRyb3AoY29udGVudEl0ZW06IENvbnRlbnRJdGVtLCBhcmVhOiBDb250ZW50SXRlbS5BcmVhKTogdm9pZCB7XHJcbiAgICAgICAgLypcclxuICAgICAgICAgKiBUaGUgaXRlbSB3YXMgZHJvcHBlZCBvbiB0aGUgaGVhZGVyIGFyZWEuIEp1c3QgYWRkIGl0IGFzIGEgY2hpbGQgb2YgdGhpcyBzdGFjayBhbmRcclxuICAgICAgICAgKiBnZXQgdGhlIGhlbGwgb3V0IG9mIHRoaXMgbG9naWNcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAodGhpcy5fZHJvcFNlZ21lbnQgPT09IFN0YWNrLlNlZ21lbnQuSGVhZGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzZXRIZWFkZXJEcm9wWm9uZSgpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZHJvcEluZGV4ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ1NPRERJNjg5OTAnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGQoY29udGVudEl0ZW0sIHRoaXMuX2Ryb3BJbmRleCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICogVGhlIHN0YWNrIGlzIGVtcHR5LiBMZXQncyBqdXN0IGFkZCB0aGUgZWxlbWVudC5cclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAodGhpcy5fZHJvcFNlZ21lbnQgPT09IFN0YWNrLlNlZ21lbnQuQm9keSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZENoaWxkKGNvbnRlbnRJdGVtLCAwLCB0cnVlKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLypcclxuICAgICAgICAgKiBUaGUgaXRlbSB3YXMgZHJvcHBlZCBvbiB0aGUgdG9wLSwgbGVmdC0sIGJvdHRvbS0gb3IgcmlnaHQtIHBhcnQgb2YgdGhlIGNvbnRlbnQuIExldCdzXHJcbiAgICAgICAgICogYWdncmVnYXRlIHNvbWUgY29uZGl0aW9ucyB0byBtYWtlIHRoZSBpZiBzdGF0ZW1lbnRzIGxhdGVyIG9uIG1vcmUgcmVhZGFibGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBpc1ZlcnRpY2FsID0gdGhpcy5fZHJvcFNlZ21lbnQgPT09IFN0YWNrLlNlZ21lbnQuVG9wIHx8IHRoaXMuX2Ryb3BTZWdtZW50ID09PSBTdGFjay5TZWdtZW50LkJvdHRvbTtcclxuICAgICAgICBjb25zdCBpc0hvcml6b250YWwgPSB0aGlzLl9kcm9wU2VnbWVudCA9PT0gU3RhY2suU2VnbWVudC5MZWZ0IHx8IHRoaXMuX2Ryb3BTZWdtZW50ID09PSBTdGFjay5TZWdtZW50LlJpZ2h0O1xyXG4gICAgICAgIGNvbnN0IGluc2VydEJlZm9yZSA9IHRoaXMuX2Ryb3BTZWdtZW50ID09PSBTdGFjay5TZWdtZW50LlRvcCB8fCB0aGlzLl9kcm9wU2VnbWVudCA9PT0gU3RhY2suU2VnbWVudC5MZWZ0O1xyXG4gICAgICAgIGNvbnN0IGhhc0NvcnJlY3RQYXJlbnQgPSAoaXNWZXJ0aWNhbCAmJiB0aGlzLnN0YWNrUGFyZW50LmlzQ29sdW1uKSB8fCAoaXNIb3Jpem9udGFsICYmIHRoaXMuc3RhY2tQYXJlbnQuaXNSb3cpO1xyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIFRoZSBjb250ZW50IGl0ZW0gY2FuIGJlIGVpdGhlciBhIGNvbXBvbmVudCBvciBhIHN0YWNrLiBJZiBpdCBpcyBhIGNvbXBvbmVudCwgd3JhcCBpdCBpbnRvIGEgc3RhY2tcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoY29udGVudEl0ZW0uaXNDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbUNvbmZpZyA9IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnLmNyZWF0ZURlZmF1bHQoKTtcclxuICAgICAgICAgICAgaXRlbUNvbmZpZy5oZWFkZXIgPSAoY29udGVudEl0ZW0gYXMgQ29tcG9uZW50SXRlbSkuaGVhZGVyQ29uZmlnO1xyXG4gICAgICAgICAgICBjb25zdCBzdGFjayA9IHRoaXMubGF5b3V0TWFuYWdlci5jcmVhdGVBbmRJbml0Q29udGVudEl0ZW0oaXRlbUNvbmZpZywgdGhpcyk7XHJcbiAgICAgICAgICAgIHN0YWNrLmFkZENoaWxkKGNvbnRlbnRJdGVtKTtcclxuICAgICAgICAgICAgY29udGVudEl0ZW0gPSBzdGFjaztcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIElmIHRoZSBjb250ZW50SXRlbSB0aGF0J3MgYmVpbmcgZHJvcHBlZCBpcyBub3QgZHJvcHBlZCBvbiBhIFN0YWNrIChjYXNlcyB3aGljaCBqdXN0IHBhc3NlZCBhYm92ZSBhbmRcclxuICAgICAgICAgKiB3aGljaCB3b3VsZCB3cmFwIHRoZSBjb250ZW50SXRlbSBpbiBhIFN0YWNrKSB3ZSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgY29udGVudEl0ZW0gaXMgYSBSb3dPckNvbHVtbi5cclxuICAgICAgICAgKiBJZiBpdCBpcywgd2UgbmVlZCB0byByZS13cmFwIGl0IGluIGEgU3RhY2sgbGlrZSBpdCB3YXMgd2hlbiBpdCB3YXMgZHJhZ2dlZCBieSBpdHMgVGFiIChpdCB3YXMgZHJhZ2dlZCEpLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmKGNvbnRlbnRJdGVtLnR5cGUgPT09IEl0ZW1UeXBlLnJvdyB8fCBjb250ZW50SXRlbS50eXBlID09PSBJdGVtVHlwZS5jb2x1bW4pe1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtQ29uZmlnID0gUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcuY3JlYXRlRGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBpdGVtQ29uZmlnLmhlYWRlciA9IHRoaXMuY3JlYXRlSGVhZGVyQ29uZmlnKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmNyZWF0ZUNvbnRlbnRJdGVtKGl0ZW1Db25maWcsIHRoaXMpO1xyXG4gICAgICAgICAgICBzdGFjay5hZGRDaGlsZChjb250ZW50SXRlbSlcclxuICAgICAgICAgICAgY29udGVudEl0ZW0gPSBzdGFja1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLypcclxuICAgICAgICAgKiBJZiB0aGUgaXRlbSBpcyBkcm9wcGVkIG9uIHRvcCBvciBib3R0b20gb2YgYSBjb2x1bW4gb3IgbGVmdCBhbmQgcmlnaHQgb2YgYSByb3csIGl0J3MgYWxyZWFkeVxyXG4gICAgICAgICAqIGxheWQgb3V0IGluIHRoZSBjb3JyZWN0IHdheS4gSnVzdCBhZGQgaXQgYXMgYSBjaGlsZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChoYXNDb3JyZWN0UGFyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zdGFja1BhcmVudC5jb250ZW50SXRlbXMuaW5kZXhPZih0aGlzKTtcclxuICAgICAgICAgICAgdGhpcy5zdGFja1BhcmVudC5hZGRDaGlsZChjb250ZW50SXRlbSwgaW5zZXJ0QmVmb3JlID8gaW5kZXggOiBpbmRleCArIDEsIHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLnNpemUgKj0gMC41O1xyXG4gICAgICAgICAgICBjb250ZW50SXRlbS5zaXplID0gdGhpcy5zaXplO1xyXG4gICAgICAgICAgICBjb250ZW50SXRlbS5zaXplVW5pdCA9IHRoaXMuc2l6ZVVuaXQ7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhY2tQYXJlbnQudXBkYXRlU2l6ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAqIFRoaXMgaGFuZGxlcyBpdGVtcyB0aGF0IGFyZSBkcm9wcGVkIG9uIHRvcCBvciBib3R0b20gb2YgYSByb3cgb3IgbGVmdCAvIHJpZ2h0IG9mIGEgY29sdW1uLiBXZSBuZWVkXHJcbiAgICAgICAgICAgICAqIHRvIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgY29udGVudEl0ZW0gZm9yIHRoZW0gdG8gbGl2ZSBpblxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gaXNWZXJ0aWNhbCA/IEl0ZW1UeXBlLmNvbHVtbiA6IEl0ZW1UeXBlLnJvdztcclxuICAgICAgICAgICAgY29uc3QgaXRlbUNvbmZpZyA9IFJlc29sdmVkSXRlbUNvbmZpZy5jcmVhdGVEZWZhdWx0KHR5cGUpIGFzIFJlc29sdmVkSXRlbUNvbmZpZztcclxuICAgICAgICAgICAgY29uc3Qgcm93T3JDb2x1bW4gPSB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlQ29udGVudEl0ZW0oaXRlbUNvbmZpZywgdGhpcyk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhY2tQYXJlbnQucmVwbGFjZUNoaWxkKHRoaXMsIHJvd09yQ29sdW1uKTtcclxuXHJcbiAgICAgICAgICAgIHJvd09yQ29sdW1uLmFkZENoaWxkKGNvbnRlbnRJdGVtLCBpbnNlcnRCZWZvcmUgPyAwIDogdW5kZWZpbmVkLCB0cnVlKTtcclxuICAgICAgICAgICAgcm93T3JDb2x1bW4uYWRkQ2hpbGQodGhpcywgaW5zZXJ0QmVmb3JlID8gdW5kZWZpbmVkIDogMCwgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNpemUgPSA1MDtcclxuICAgICAgICAgICAgY29udGVudEl0ZW0uc2l6ZSA9IDUwO1xyXG4gICAgICAgICAgICBjb250ZW50SXRlbS5zaXplVW5pdCA9IFNpemVVbml0RW51bS5QZXJjZW50O1xyXG4gICAgICAgICAgICByb3dPckNvbHVtbi51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZiB0aGUgdXNlciBob3ZlcnMgYWJvdmUgdGhlIGhlYWRlciBwYXJ0IG9mIHRoZSBzdGFjaywgaW5kaWNhdGUgZHJvcCBwb3NpdGlvbnMgZm9yIHRhYnMuXHJcbiAgICAgKiBvdGhlcndpc2UgaW5kaWNhdGUgd2hpY2ggc2VnbWVudCBvZiB0aGUgYm9keSB0aGUgZHJhZ2dlZCBpdGVtIHdvdWxkIGJlIGRyb3BwZWQgb25cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geCAtIEFic29sdXRlIFNjcmVlbiBYXHJcbiAgICAgKiBAcGFyYW0geSAtIEFic29sdXRlIFNjcmVlbiBZXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgb3ZlcnJpZGUgaGlnaGxpZ2h0RHJvcFpvbmUoeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLl9jb250ZW50QXJlYURpbWVuc2lvbnMpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IGtleSBhcyBTdGFjay5TZWdtZW50O1xyXG4gICAgICAgICAgICBjb25zdCBhcmVhID0gdGhpcy5fY29udGVudEFyZWFEaW1lbnNpb25zW3NlZ21lbnRdLmhvdmVyQXJlYTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhcmVhLngxIDwgeCAmJiBhcmVhLngyID4geCAmJiBhcmVhLnkxIDwgeSAmJiBhcmVhLnkyID4geSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzZWdtZW50ID09PSBTdGFjay5TZWdtZW50LkhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Ryb3BTZWdtZW50ID0gU3RhY2suU2VnbWVudC5IZWFkZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRIZWFkZXJEcm9wWm9uZSh0aGlzLl9oZWFkZXIubGVmdFJpZ2h0U2lkZWQgPyB5IDogeCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzZXRIZWFkZXJEcm9wWm9uZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0Qm9keURyb3Bab25lKHNlZ21lbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBnZXRBcmVhKCk6IENvbnRlbnRJdGVtLkFyZWEgfCBudWxsIHtcclxuICAgICAgICBpZiAodGhpcy5lbGVtZW50LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGhlYWRlckFyZWEgPSBzdXBlci5nZXRFbGVtZW50QXJlYSh0aGlzLl9oZWFkZXIuZWxlbWVudCk7XHJcbiAgICAgICAgY29uc3QgY29udGVudEFyZWEgPSBzdXBlci5nZXRFbGVtZW50QXJlYSh0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIpO1xyXG4gICAgICAgIGlmIChoZWFkZXJBcmVhID09PSBudWxsIHx8IGNvbnRlbnRBcmVhID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdTR0FIQzEzMDg2Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRXaWR0aCA9IGNvbnRlbnRBcmVhLngyIC0gY29udGVudEFyZWEueDE7XHJcbiAgICAgICAgY29uc3QgY29udGVudEhlaWdodCA9IGNvbnRlbnRBcmVhLnkyIC0gY29udGVudEFyZWEueTE7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbnRlbnRBcmVhRGltZW5zaW9ucyA9IHtcclxuICAgICAgICAgICAgaGVhZGVyOiB7XHJcbiAgICAgICAgICAgICAgICBob3ZlckFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogaGVhZGVyQXJlYS54MSxcclxuICAgICAgICAgICAgICAgICAgICB5MTogaGVhZGVyQXJlYS55MSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogaGVhZGVyQXJlYS54MixcclxuICAgICAgICAgICAgICAgICAgICB5MjogaGVhZGVyQXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodEFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogaGVhZGVyQXJlYS54MSxcclxuICAgICAgICAgICAgICAgICAgICB5MTogaGVhZGVyQXJlYS55MSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogaGVhZGVyQXJlYS54MixcclxuICAgICAgICAgICAgICAgICAgICB5MjogaGVhZGVyQXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSGlnaGxpZ2h0IHRoZSBlbnRpcmUgYm9keSBpZiB0aGUgc3RhY2sgaXMgZW1wdHlcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAodGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID09PSAwKSB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9jb250ZW50QXJlYURpbWVuc2lvbnMuYm9keSA9IHtcclxuICAgICAgICAgICAgICAgIGhvdmVyQXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiBjb250ZW50QXJlYS54MSxcclxuICAgICAgICAgICAgICAgICAgICB5MTogY29udGVudEFyZWEueTEsXHJcbiAgICAgICAgICAgICAgICAgICAgeDI6IGNvbnRlbnRBcmVhLngyLFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodEFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IGNvbnRlbnRBcmVhLnkxLFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiBjb250ZW50QXJlYS54MixcclxuICAgICAgICAgICAgICAgICAgICB5MjogY29udGVudEFyZWEueTJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRFbGVtZW50QXJlYSh0aGlzLmVsZW1lbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRBcmVhRGltZW5zaW9ucy5sZWZ0ID0ge1xyXG4gICAgICAgICAgICAgICAgaG92ZXJBcmVhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDE6IGNvbnRlbnRBcmVhLngxLFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBjb250ZW50QXJlYS55MSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogY29udGVudEFyZWEueDEgKyBjb250ZW50V2lkdGggKiAwLjI1LFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodEFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IGNvbnRlbnRBcmVhLnkxLFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiBjb250ZW50QXJlYS54MSArIGNvbnRlbnRXaWR0aCAqIDAuNSxcclxuICAgICAgICAgICAgICAgICAgICB5MjogY29udGVudEFyZWEueTJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRBcmVhRGltZW5zaW9ucy50b3AgPSB7XHJcbiAgICAgICAgICAgICAgICBob3ZlckFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEgKyBjb250ZW50V2lkdGggKiAwLjI1LFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBjb250ZW50QXJlYS55MSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogY29udGVudEFyZWEueDEgKyBjb250ZW50V2lkdGggKiAwLjc1LFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MSArIGNvbnRlbnRIZWlnaHQgKiAwLjVcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRBcmVhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDE6IGNvbnRlbnRBcmVhLngxLFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBjb250ZW50QXJlYS55MSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogY29udGVudEFyZWEueDIsXHJcbiAgICAgICAgICAgICAgICAgICAgeTI6IGNvbnRlbnRBcmVhLnkxICsgY29udGVudEhlaWdodCAqIDAuNVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fY29udGVudEFyZWFEaW1lbnNpb25zLnJpZ2h0ID0ge1xyXG4gICAgICAgICAgICAgICAgaG92ZXJBcmVhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDE6IGNvbnRlbnRBcmVhLngxICsgY29udGVudFdpZHRoICogMC43NSxcclxuICAgICAgICAgICAgICAgICAgICB5MTogY29udGVudEFyZWEueTEsXHJcbiAgICAgICAgICAgICAgICAgICAgeDI6IGNvbnRlbnRBcmVhLngyLFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodEFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEgKyBjb250ZW50V2lkdGggKiAwLjUsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IGNvbnRlbnRBcmVhLnkxLFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiBjb250ZW50QXJlYS54MixcclxuICAgICAgICAgICAgICAgICAgICB5MjogY29udGVudEFyZWEueTJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRBcmVhRGltZW5zaW9ucy5ib3R0b20gPSB7XHJcbiAgICAgICAgICAgICAgICBob3ZlckFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEgKyBjb250ZW50V2lkdGggKiAwLjI1LFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBjb250ZW50QXJlYS55MSArIGNvbnRlbnRIZWlnaHQgKiAwLjUsXHJcbiAgICAgICAgICAgICAgICAgICAgeDI6IGNvbnRlbnRBcmVhLngxICsgY29udGVudFdpZHRoICogMC43NSxcclxuICAgICAgICAgICAgICAgICAgICB5MjogY29udGVudEFyZWEueTJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRBcmVhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDE6IGNvbnRlbnRBcmVhLngxLFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBjb250ZW50QXJlYS55MSArIGNvbnRlbnRIZWlnaHQgKiAwLjUsXHJcbiAgICAgICAgICAgICAgICAgICAgeDI6IGNvbnRlbnRBcmVhLngyLFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRBcmVhKHRoaXMuZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvZ3JhbW1hdGljYWxseSBvcGVyYXRlIHdpdGggaGVhZGVyIHBvc2l0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBwb3NpdGlvbiAtXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgcHJldmlvdXMgaGVhZGVyIHBvc2l0aW9uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcG9zaXRpb25IZWFkZXIocG9zaXRpb246IFNpZGUpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5faGVhZGVyLnNpZGUgIT09IHBvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2hlYWRlci5zZXRTaWRlKHBvc2l0aW9uKTtcclxuICAgICAgICAgICAgdGhpcy5faGVhZGVyU2lkZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnNldHVwSGVhZGVyUG9zaXRpb24oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVOb2RlU2l6ZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5lbGVtZW50LnN0eWxlLmRpc3BsYXkgIT09ICdub25lJykge1xyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50OiBXaWR0aEFuZEhlaWdodCA9IGdldEVsZW1lbnRXaWR0aEFuZEhlaWdodCh0aGlzLmVsZW1lbnQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2hlYWRlci5zaG93KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaW1lbnNpb24gPSB0aGlzLl9oZWFkZXIubGVmdFJpZ2h0U2lkZWQgPyBXaWR0aE9ySGVpZ2h0UHJvcGVydHlOYW1lLndpZHRoIDogV2lkdGhPckhlaWdodFByb3BlcnR5TmFtZS5oZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50W2RpbWVuc2lvbl0gLT0gdGhpcy5sYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5kaW1lbnNpb25zLmhlYWRlckhlaWdodDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIuc3R5bGUud2lkdGggPSBudW1iZXJUb1BpeGVscyhjb250ZW50LndpZHRoKTtcclxuICAgICAgICAgICAgdGhpcy5fY2hpbGRFbGVtZW50Q29udGFpbmVyLnN0eWxlLmhlaWdodCA9IG51bWJlclRvUGl4ZWxzKGNvbnRlbnQuaGVpZ2h0KTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50SXRlbXNbaV0uZWxlbWVudC5zdHlsZS53aWR0aCA9IG51bWJlclRvUGl4ZWxzKGNvbnRlbnQud2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50SXRlbXNbaV0uZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBudW1iZXJUb1BpeGVscyhjb250ZW50LmhlaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZXNpemUnKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0U3RhdGVDaGFuZ2VkRXZlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoaWdobGlnaHRIZWFkZXJEcm9wWm9uZSh4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB2aXNpYmxlVGFic0xlbmd0aCA9IHRoaXMuX2hlYWRlci5sYXN0VmlzaWJsZVRhYkluZGV4ICsgMTtcclxuICAgICAgICBjb25zdCB0YWJzQ29udGFpbmVyRWxlbWVudCA9IHRoaXMuX2hlYWRlci50YWJzQ29udGFpbmVyRWxlbWVudDtcclxuICAgICAgICBjb25zdCB0YWJzQ29udGFpbmVyRWxlbWVudENoaWxkTm9kZXMgPSB0YWJzQ29udGFpbmVyRWxlbWVudC5jaGlsZE5vZGVzO1xyXG5cclxuICAgICAgICAvLyBDcmVhdGUgc2hhbGxvdyBjb3B5IG9mIGNoaWxkTm9kZXMgbGlzdCwgZXhjbHVkaW5nIERyb3BQbGFjZUhvbGRlciwgYXMgd2Ugd2lsbCBiZSBtb2RpZnlpbmcgdGhlIGNoaWxkTm9kZXMgbGlzdFxyXG4gICAgICAgIGNvbnN0IHZpc2libGVUYWJFbGVtZW50cyA9IG5ldyBBcnJheTxIVE1MRWxlbWVudD4odmlzaWJsZVRhYnNMZW5ndGgpO1xyXG4gICAgICAgIGxldCB0YWJJbmRleCA9IDA7XHJcbiAgICAgICAgbGV0IHRhYkNvdW50ID0gMDtcclxuICAgICAgICB3aGlsZSAodGFiQ291bnQgPCB2aXNpYmxlVGFic0xlbmd0aCkge1xyXG4gICAgICAgICAgICBjb25zdCB2aXNpYmxlVGFiRWxlbWVudCA9IHRhYnNDb250YWluZXJFbGVtZW50Q2hpbGROb2Rlc1t0YWJJbmRleCsrXSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgaWYgKHZpc2libGVUYWJFbGVtZW50ICE9PSB0aGlzLmxheW91dE1hbmFnZXIudGFiRHJvcFBsYWNlaG9sZGVyKSB7XHJcbiAgICAgICAgICAgICAgICB2aXNpYmxlVGFiRWxlbWVudHNbdGFiQ291bnQrK10gPSB2aXNpYmxlVGFiRWxlbWVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZHJvcFRhcmdldEluZGljYXRvciA9IHRoaXMubGF5b3V0TWFuYWdlci5kcm9wVGFyZ2V0SW5kaWNhdG9yO1xyXG4gICAgICAgIGlmIChkcm9wVGFyZ2V0SW5kaWNhdG9yID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdTSEhEWkRUSTk3MTEwJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgYXJlYTogQXJlYUxpbmtlZFJlY3Q7XHJcblxyXG4gICAgICAgIC8vIEVtcHR5IHN0YWNrXHJcbiAgICAgICAgaWYgKHZpc2libGVUYWJzTGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlclJlY3QgPSB0aGlzLl9oZWFkZXIuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgY29uc3QgaGVhZGVyVG9wID0gaGVhZGVyUmVjdC50b3AgKyBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDtcclxuICAgICAgICAgICAgY29uc3QgaGVhZGVyTGVmdCA9IGhlYWRlclJlY3QubGVmdCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdDtcclxuXHJcbiAgICAgICAgICAgIGFyZWEgPSB7XHJcbiAgICAgICAgICAgICAgICB4MTogaGVhZGVyTGVmdCxcclxuICAgICAgICAgICAgICAgIHgyOiBoZWFkZXJMZWZ0ICsgMTAwLFxyXG4gICAgICAgICAgICAgICAgeTE6IGhlYWRlclRvcCArIGhlYWRlclJlY3QuaGVpZ2h0IC0gMjAsXHJcbiAgICAgICAgICAgICAgICB5MjogaGVhZGVyVG9wICsgaGVhZGVyUmVjdC5oZWlnaHQsXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9kcm9wSW5kZXggPSAwO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCB0YWJJbmRleCA9IDA7XHJcbiAgICAgICAgICAgIC8vIFRoaXMgaW5kaWNhdGVzIHdoZXRoZXIgb3VyIGN1cnNvciBpcyBleGFjdGx5IG92ZXIgYSB0YWJcclxuICAgICAgICAgICAgbGV0IGlzQWJvdmVUYWIgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IHRhYlRvcDogbnVtYmVyO1xyXG4gICAgICAgICAgICBsZXQgdGFiTGVmdDogbnVtYmVyO1xyXG4gICAgICAgICAgICBsZXQgdGFiV2lkdGg6IG51bWJlcjtcclxuICAgICAgICAgICAgbGV0IHRhYkVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgICAgICB0YWJFbGVtZW50ID0gdmlzaWJsZVRhYkVsZW1lbnRzW3RhYkluZGV4XSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhYlJlY3QgPSB0YWJFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFiUmVjdFRvcCA9IHRhYlJlY3QudG9wICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJSZWN0TGVmdCA9IHRhYlJlY3QubGVmdCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faGVhZGVyLmxlZnRSaWdodFNpZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFiTGVmdCA9IHRhYlJlY3RUb3A7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFiVG9wID0gdGFiUmVjdExlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFiV2lkdGggPSB0YWJSZWN0LmhlaWdodDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFiTGVmdCA9IHRhYlJlY3RMZWZ0O1xyXG4gICAgICAgICAgICAgICAgICAgIHRhYlRvcCA9IHRhYlJlY3RUb3A7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFiV2lkdGggPSB0YWJSZWN0LndpZHRoO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh4ID49IHRhYkxlZnQgJiYgeCA8IHRhYkxlZnQgKyB0YWJXaWR0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlzQWJvdmVUYWIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0YWJJbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IHdoaWxlICh0YWJJbmRleCA8IHZpc2libGVUYWJzTGVuZ3RoICYmICFpc0Fib3ZlVGFiKTtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIHdlJ3JlIG5vdCBhYm92ZSBhbnkgdGFicywgb3IgdG8gdGhlIHJpZ2h0IG9mIGFueSB0YWIsIHdlIGFyZSBvdXQgb2YgdGhlIGFyZWEsIHNvIGdpdmUgdXBcclxuICAgICAgICAgICAgaWYgKGlzQWJvdmVUYWIgPT09IGZhbHNlICYmIHggPCB0YWJMZWZ0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGhhbGZYID0gdGFiTGVmdCArIHRhYldpZHRoIC8gMjtcclxuXHJcbiAgICAgICAgICAgIGlmICh4IDwgaGFsZlgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Ryb3BJbmRleCA9IHRhYkluZGV4O1xyXG4gICAgICAgICAgICAgICAgdGFiRWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2JlZm9yZWJlZ2luJywgdGhpcy5sYXlvdXRNYW5hZ2VyLnRhYkRyb3BQbGFjZWhvbGRlcik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kcm9wSW5kZXggPSBNYXRoLm1pbih0YWJJbmRleCArIDEsIHZpc2libGVUYWJzTGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIHRhYkVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIHRoaXMubGF5b3V0TWFuYWdlci50YWJEcm9wUGxhY2Vob2xkZXIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0YWJEcm9wUGxhY2Vob2xkZXJSZWN0ID0gdGhpcy5sYXlvdXRNYW5hZ2VyLnRhYkRyb3BQbGFjZWhvbGRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgY29uc3QgdGFiRHJvcFBsYWNlaG9sZGVyUmVjdFRvcCA9IHRhYkRyb3BQbGFjZWhvbGRlclJlY3QudG9wICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhYkRyb3BQbGFjZWhvbGRlclJlY3RMZWZ0ID0gdGFiRHJvcFBsYWNlaG9sZGVyUmVjdC5sZWZ0ICsgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0O1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2hlYWRlci5sZWZ0UmlnaHRTaWRlZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2VIb2xkZXJUb3AgPSB0YWJEcm9wUGxhY2Vob2xkZXJSZWN0VG9wO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFiRHJvcFBsYWNlaG9sZGVyUmVjdFdpZHRoID0gdGFiRHJvcFBsYWNlaG9sZGVyUmVjdC5oZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICAgICAgYXJlYSA9IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogdGFiVG9wLFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiB0YWJUb3AgKyB0YWJFbGVtZW50LmNsaWVudEhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICB5MTogcGxhY2VIb2xkZXJUb3AsXHJcbiAgICAgICAgICAgICAgICAgICAgeTI6IHBsYWNlSG9sZGVyVG9wICsgdGFiRHJvcFBsYWNlaG9sZGVyUmVjdFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlSG9sZGVyTGVmdCA9IHRhYkRyb3BQbGFjZWhvbGRlclJlY3RMZWZ0O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFiRHJvcFBsYWNlaG9sZGVyUmVjdFdpZHRoID0gdGFiRHJvcFBsYWNlaG9sZGVyUmVjdC53aWR0aDtcclxuXHJcbiAgICAgICAgICAgICAgICBhcmVhID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiBwbGFjZUhvbGRlckxlZnQsXHJcbiAgICAgICAgICAgICAgICAgICAgeDI6IHBsYWNlSG9sZGVyTGVmdCArIHRhYkRyb3BQbGFjZWhvbGRlclJlY3RXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICB5MTogdGFiVG9wLFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiB0YWJUb3AgKyB0YWJFbGVtZW50LmNsaWVudEhlaWdodCxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRyb3BUYXJnZXRJbmRpY2F0b3IuaGlnaGxpZ2h0QXJlYShhcmVhLCAwKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZXNldEhlYWRlckRyb3Bab25lKCkge1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci50YWJEcm9wUGxhY2Vob2xkZXIucmVtb3ZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBzZXR1cEhlYWRlclBvc2l0aW9uKCkge1xyXG4gICAgICAgIHNldEVsZW1lbnREaXNwbGF5VmlzaWJpbGl0eSh0aGlzLl9oZWFkZXIuZWxlbWVudCwgdGhpcy5faGVhZGVyLnNob3cpO1xyXG4gICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKERvbUNvbnN0YW50cy5DbGFzc05hbWUuTGVmdCwgRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5SaWdodCwgRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Cb3R0b20pO1xyXG4gICAgICAgIGlmICh0aGlzLl9oZWFkZXIuc2lkZSAhPT0gU2lkZS50b3ApIHtcclxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2xtXycgKyB0aGlzLl9oZWFkZXIuc2lkZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2lmIChbU2lkZS5yaWdodCwgU2lkZS5ib3R0b21dLmluY2x1ZGVzKHRoaXMuX2hlYWRlci5zaWRlKSkge1xyXG4gICAgICAgIC8vICAgIC8vIG1vdmUgdGhlIGhlYWRlciBiZWhpbmQgdGhlIGNvbnRlbnQuXHJcbiAgICAgICAgLy8gICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2hlYWRlci5lbGVtZW50KTtcclxuICAgICAgICAvL31cclxuICAgICAgICB0aGlzLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGlnaGxpZ2h0Qm9keURyb3Bab25lKHNlZ21lbnQ6IFN0YWNrLlNlZ21lbnQpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fY29udGVudEFyZWFEaW1lbnNpb25zID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignU0hCRFpDODIyNjUnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBoaWdobGlnaHRBcmVhID0gdGhpcy5fY29udGVudEFyZWFEaW1lbnNpb25zW3NlZ21lbnRdLmhpZ2hsaWdodEFyZWE7XHJcbiAgICAgICAgICAgIGNvbnN0IGRyb3BUYXJnZXRJbmRpY2F0b3IgPSB0aGlzLmxheW91dE1hbmFnZXIuZHJvcFRhcmdldEluZGljYXRvcjtcclxuICAgICAgICAgICAgaWYgKGRyb3BUYXJnZXRJbmRpY2F0b3IgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdTSEJEWkQ5NjExMCcpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZHJvcFRhcmdldEluZGljYXRvci5oaWdobGlnaHRBcmVhKGhpZ2hsaWdodEFyZWEsIDEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZHJvcFNlZ21lbnQgPSBzZWdtZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlUmVzaXplKCkge1xyXG4gICAgICAgIHRoaXMuX2hlYWRlci51cGRhdGVUYWJTaXplcygpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVNYXhpbWlzZWQoKSB7XHJcbiAgICAgICAgdGhpcy5faGVhZGVyLnByb2Nlc3NNYXhpbWlzZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZU1pbmltaXNlZCgpIHtcclxuICAgICAgICB0aGlzLl9oZWFkZXIucHJvY2Vzc01pbmltaXNlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlUG9wb3V0RXZlbnQoKSB7XHJcbiAgICAgICAgdGhpcy5wb3BvdXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUhlYWRlckNsaWNrRXZlbnQoZXY6IE1vdXNlRXZlbnQpIHtcclxuICAgICAgICBjb25zdCBldmVudE5hbWUgPSBFdmVudEVtaXR0ZXIuaGVhZGVyQ2xpY2tFdmVudE5hbWU7XHJcbiAgICAgICAgY29uc3QgYnViYmxpbmdFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIuQ2xpY2tCdWJibGluZ0V2ZW50KGV2ZW50TmFtZSwgdGhpcywgZXYpO1xyXG4gICAgICAgIHRoaXMuZW1pdChldmVudE5hbWUsIGJ1YmJsaW5nRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlSGVhZGVyVG91Y2hTdGFydEV2ZW50KGV2OiBUb3VjaEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgZXZlbnROYW1lID0gRXZlbnRFbWl0dGVyLmhlYWRlclRvdWNoU3RhcnRFdmVudE5hbWU7XHJcbiAgICAgICAgY29uc3QgYnViYmxpbmdFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIuVG91Y2hTdGFydEJ1YmJsaW5nRXZlbnQoZXZlbnROYW1lLCB0aGlzLCBldik7XHJcbiAgICAgICAgdGhpcy5lbWl0KGV2ZW50TmFtZSwgYnViYmxpbmdFdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVIZWFkZXJDb21wb25lbnRSZW1vdmVFdmVudChpdGVtOiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVDaGlsZChpdGVtLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVIZWFkZXJDb21wb25lbnRGb2N1c0V2ZW50KGl0ZW06IENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICB0aGlzLnNldEFjdGl2ZUNvbXBvbmVudEl0ZW0oaXRlbSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVIZWFkZXJDb21wb25lbnRTdGFydERyYWdFdmVudCh4OiBudW1iZXIsIHk6IG51bWJlciwgZHJhZ0xpc3RlbmVyOiBEcmFnTGlzdGVuZXIsIGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICBpZiAodGhpcy5pc01heGltaXNlZCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnRvZ2dsZU1heGltaXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5zdGFydENvbXBvbmVudERyYWcoeCwgeSwgZHJhZ0xpc3RlbmVyLCBjb21wb25lbnRJdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZUhlYWRlckNvbmZpZygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2hlYWRlclNpZGVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIuY3JlYXRlQ29weSh0aGlzLl9oZWFkZXJDb25maWcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNob3cgPSB0aGlzLl9oZWFkZXIuc2hvdyA/IHRoaXMuX2hlYWRlci5zaWRlIDogZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyLmNyZWF0ZUNvcHkodGhpcy5faGVhZGVyQ29uZmlnLCBzaG93KTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdyxcclxuICAgICAgICAgICAgICAgICAgICBwb3BvdXQ6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICBtYXhpbWlzZTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgbWluaW1pc2U6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICB0YWJEcm9wZG93bjogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGVtaXRTdGF0ZUNoYW5nZWRFdmVudCgpIHtcclxuICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnc3RhdGVDaGFuZ2VkJyk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgU3RhY2sge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGNvbnN0IGVudW0gU2VnbWVudCB7XHJcbiAgICAgICAgSGVhZGVyID0gJ2hlYWRlcicsXHJcbiAgICAgICAgQm9keSA9ICdib2R5JyxcclxuICAgICAgICBMZWZ0ID0gJ2xlZnQnLFxyXG4gICAgICAgIFJpZ2h0ID0gJ3JpZ2h0JyxcclxuICAgICAgICBUb3AgPSAndG9wJyxcclxuICAgICAgICBCb3R0b20gPSAnYm90dG9tJyxcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIENvbnRlbnRBcmVhRGltZW5zaW9uIHtcclxuICAgICAgICBob3ZlckFyZWE6IEFyZWFMaW5rZWRSZWN0O1xyXG4gICAgICAgIGhpZ2hsaWdodEFyZWE6IEFyZWFMaW5rZWRSZWN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIENvbnRlbnRBcmVhRGltZW5zaW9ucyA9IHtcclxuICAgICAgICBbc2VnbWVudDogc3RyaW5nXTogQ29udGVudEFyZWFEaW1lbnNpb247XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KGRvY3VtZW50OiBEb2N1bWVudCk6IEhUTUxEaXZFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuSXRlbSk7XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuU3RhY2spO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudEl0ZW1Db25maWcsIEl0ZW1Db25maWcsIExheW91dENvbmZpZywgUm93T3JDb2x1bW5JdGVtQ29uZmlnLCBTdGFja0l0ZW1Db25maWcgfSBmcm9tICcuL2NvbmZpZy9jb25maWcnO1xyXG5pbXBvcnQge1xyXG4gICAgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLFxyXG4gICAgUmVzb2x2ZWRJdGVtQ29uZmlnLFxyXG4gICAgUmVzb2x2ZWRMYXlvdXRDb25maWcsXHJcbiAgICBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyxcclxuICAgIFJlc29sdmVkUm9vdEl0ZW1Db25maWcsXHJcbiAgICBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyxcclxuICAgIFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnXHJcbn0gZnJvbSBcIi4vY29uZmlnL3Jlc29sdmVkLWNvbmZpZ1wiO1xyXG5pbXBvcnQgeyBDb21wb25lbnRDb250YWluZXIgfSBmcm9tICcuL2NvbnRhaW5lci9jb21wb25lbnQtY29udGFpbmVyJztcclxuaW1wb3J0IHsgQnJvd3NlclBvcG91dCB9IGZyb20gJy4vY29udHJvbHMvYnJvd3Nlci1wb3BvdXQnO1xyXG5pbXBvcnQgeyBEcmFnQWN0aW9uIH0gZnJvbSAnLi9jb250cm9scy9kcmFnLWFjdGlvbic7XHJcbmltcG9ydCB7IERyYWdTb3VyY2UgfSBmcm9tICcuL2NvbnRyb2xzL2RyYWctc291cmNlJztcclxuaW1wb3J0IHsgRHJvcFRhcmdldEluZGljYXRvciB9IGZyb20gJy4vY29udHJvbHMvZHJvcC10YXJnZXQtaW5kaWNhdG9yJztcclxuaW1wb3J0IHsgVHJhbnNpdGlvbkluZGljYXRvciB9IGZyb20gJy4vY29udHJvbHMvdHJhbnNpdGlvbi1pbmRpY2F0b3InO1xyXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uRXJyb3IgfSBmcm9tICcuL2Vycm9ycy9leHRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IEFzc2VydEVycm9yLCBVbmV4cGVjdGVkTnVsbEVycm9yLCBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IsIFVucmVhY2hhYmxlQ2FzZUVycm9yIH0gZnJvbSAnLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi9pdGVtcy9jb21wb25lbnQtaXRlbSc7XHJcbmltcG9ydCB7IENvbXBvbmVudFBhcmVudGFibGVJdGVtIH0gZnJvbSAnLi9pdGVtcy9jb21wb25lbnQtcGFyZW50YWJsZS1pdGVtJztcclxuaW1wb3J0IHsgQ29udGVudEl0ZW0gfSBmcm9tICcuL2l0ZW1zL2NvbnRlbnQtaXRlbSc7XHJcbmltcG9ydCB7IEdyb3VuZEl0ZW0gfSBmcm9tICcuL2l0ZW1zL2dyb3VuZC1pdGVtJztcclxuaW1wb3J0IHsgUm93T3JDb2x1bW4gfSBmcm9tICcuL2l0ZW1zL3Jvdy1vci1jb2x1bW4nO1xyXG5pbXBvcnQgeyBTdGFjayB9IGZyb20gJy4vaXRlbXMvc3RhY2snO1xyXG5pbXBvcnQgeyBDb25maWdNaW5pZmllciB9IGZyb20gJy4vdXRpbHMvY29uZmlnLW1pbmlmaWVyJztcclxuaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi91dGlscy9kb20tY29uc3RhbnRzJztcclxuaW1wb3J0IHsgRHJhZ0xpc3RlbmVyIH0gZnJvbSAnLi91dGlscy9kcmFnLWxpc3RlbmVyJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi91dGlscy9ldmVudC1lbWl0dGVyJztcclxuaW1wb3J0IHsgRXZlbnRIdWIgfSBmcm9tICcuL3V0aWxzL2V2ZW50LWh1Yic7XHJcbmltcG9ydCB7IEkxOG5TdHJpbmdJZCwgSTE4blN0cmluZ3MsIGkxOG5TdHJpbmdzIH0gZnJvbSAnLi91dGlscy9pMThuLXN0cmluZ3MnO1xyXG5pbXBvcnQgeyBJdGVtVHlwZSwgSnNvblZhbHVlLCBSZWN0LCBSZXNwb25zaXZlTW9kZSwgV2lkdGhBbmRIZWlnaHQgfSBmcm9tICcuL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHtcclxuICAgIGdldEVsZW1lbnRXaWR0aEFuZEhlaWdodCxcclxuICAgIGdldFdpbmRvd0lubmVyU2NyZWVuUG9zaXRpb24sXHJcbiAgICByZW1vdmVGcm9tQXJyYXksXHJcbiAgICBzZXRFbGVtZW50SGVpZ2h0LFxyXG4gICAgc2V0RWxlbWVudFdpZHRoXHJcbn0gZnJvbSAnLi91dGlscy91dGlscyc7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmRlY2xhcmUgZ2xvYmFsIHtcclxuICAgIGludGVyZmFjZSBXaW5kb3cge1xyXG4gICAgICAgIF9fZ2xJbnN0YW5jZTogTGF5b3V0TWFuYWdlcjtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSBtYWluIGNsYXNzIHRoYXQgd2lsbCBiZSBleHBvc2VkIGFzIEdvbGRlbkxheW91dC5cclxuICovXHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTGF5b3V0TWFuYWdlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICAvKiogV2hldGhlciB0aGUgbGF5b3V0IHdpbGwgYmUgYXV0b21hdGljYWxseSBiZSByZXNpemVkIHRvIGNvbnRhaW5lciB3aGVuZXZlciB0aGUgY29udGFpbmVyJ3Mgc2l6ZSBpcyBjaGFuZ2VkXHJcbiAgICAgKiBEZWZhdWx0IGlzIHRydWUgaWYgPGJvZHk+IGlzIHRoZSBjb250YWluZXIgb3RoZXJ3aXNlIGZhbHNlXHJcbiAgICAgKiBEZWZhdWx0IHdpbGwgYmUgY2hhbmdlZCB0byB0cnVlIGZvciBhbnkgY29udGFpbmVyIGluIHRoZSBmdXR1cmVcclxuICAgICAqL1xyXG4gICAgcmVzaXplV2l0aENvbnRhaW5lckF1dG9tYXRpY2FsbHkgPSBmYWxzZTtcclxuICAgIC8qKiBUaGUgZGVib3VuY2UgaW50ZXJ2YWwgKGluIG1pbGxpc2Vjb25kcykgdXNlZCB3aGVuZXZlciBhIGxheW91dCBpcyBhdXRvbWF0aWNhbGx5IHJlc2l6ZWQuICAwIG1lYW5zIG5leHQgdGljayAqL1xyXG4gICAgcmVzaXplRGVib3VuY2VJbnRlcnZhbCA9IDEwMDtcclxuICAgIC8qKiBFeHRlbmQgdGhlIGN1cnJlbnQgZGVib3VuY2UgZGVsYXkgdGltZSBwZXJpb2QgaWYgaXQgaXMgdHJpZ2dlcmVkIGR1cmluZyB0aGUgZGVsYXkuXHJcbiAgICAgKiBJZiB0aGlzIGlzIHRydWUsIHRoZSBsYXlvdXQgd2lsbCBvbmx5IHJlc2l6ZSB3aGVuIGl0cyBjb250YWluZXIgaGFzIHN0b3BwZWQgYmVpbmcgcmVzaXplZC5cclxuICAgICAqIElmIGl0IGlzIGZhbHNlLCB0aGUgbGF5b3V0IHdpbGwgcmVzaXplIGF0IGludGVydmFscyB3aGlsZSBpdHMgY29udGFpbmVyIGlzIGJlaW5nIHJlc2l6ZWQuXHJcbiAgICAgKi9cclxuICAgIHJlc2l6ZURlYm91bmNlRXh0ZW5kZWRXaGVuUG9zc2libGUgPSB0cnVlO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2NvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaXNJbml0aWFsaXNlZCA9IGZhbHNlO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZ3JvdW5kSXRlbTogR3JvdW5kSXRlbSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX29wZW5Qb3BvdXRzOiBCcm93c2VyUG9wb3V0W10gPSBbXTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2Ryb3BUYXJnZXRJbmRpY2F0b3I6IERyb3BUYXJnZXRJbmRpY2F0b3IgfCBudWxsID0gbnVsbDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3RyYW5zaXRpb25JbmRpY2F0b3I6IFRyYW5zaXRpb25JbmRpY2F0b3IgfCBudWxsID0gbnVsbDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3Jlc2l6ZVRpbWVvdXRJZDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9pdGVtQXJlYXM6IENvbnRlbnRJdGVtLkFyZWFbXSA9IFtdO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfbWF4aW1pc2VkU3RhY2s6IFN0YWNrIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfbWF4aW1pc2VQbGFjZWhvbGRlciA9IExheW91dE1hbmFnZXIuY3JlYXRlTWF4aW1pc2VQbGFjZUVsZW1lbnQoZG9jdW1lbnQpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfdGFiRHJvcFBsYWNlaG9sZGVyID0gTGF5b3V0TWFuYWdlci5jcmVhdGVUYWJEcm9wUGxhY2Vob2xkZXJFbGVtZW50KGRvY3VtZW50KTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2RyYWdTb3VyY2VzOiBEcmFnU291cmNlW10gPSBbXTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3VwZGF0aW5nQ29sdW1uc1Jlc3BvbnNpdmUgPSBmYWxzZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2ZpcnN0TG9hZCA9IHRydWU7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9ldmVudEh1YiA9IG5ldyBFdmVudEh1Yih0aGlzKTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3dpZHRoOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2hlaWdodDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9mb2N1c2VkQ29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3ZpcnR1YWxTaXplZENvbnRhaW5lcnM6IENvbXBvbmVudENvbnRhaW5lcltdID0gW107XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF92aXJ0dWFsU2l6ZWRDb250YWluZXJBZGRpbmdCZWdpbkNvdW50ID0gMDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3NpemVJbnZhbGlkYXRpb25CZWdpbkNvdW50ID0gMDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByb3RlY3RlZCBfY29uc3RydWN0b3JPclN1YldpbmRvd0xheW91dENvbmZpZzogTGF5b3V0Q29uZmlnIHwgdW5kZWZpbmVkOyAvLyBwcm90ZWN0ZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9wYXJlbnQ6IExheW91dE1hbmFnZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB0aGlzLmhhbmRsZUNvbnRhaW5lclJlc2l6ZSgpKTtcclxuICAgIC8qKiBAaW50ZXJuYWwgQGRlcHJlY2F0ZWQgdG8gYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uIDMgKi9cclxuICAgIHByaXZhdGUgX3dpbmRvd0JlZm9yZVVubG9hZExpc3RlbmVyID0gKCkgPT4gdGhpcy5vbkJlZm9yZVVubG9hZCgpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCB0byBiZSByZW1vdmVkIGluIHZlcnNpb24gMyAqL1xyXG4gICAgcHJpdmF0ZSBfd2luZG93QmVmb3JlVW5sb2FkTGlzdGVuaW5nID0gZmFsc2U7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9tYXhpbWlzZWRTdGFja0JlZm9yZURlc3Ryb3llZExpc3RlbmVyID0gKGV2OiBFdmVudEVtaXR0ZXIuQnViYmxpbmdFdmVudCkgPT4gdGhpcy5jbGVhbnVwQmVmb3JlTWF4aW1pc2VkU3RhY2tEZXN0cm95ZWQoZXYpO1xyXG5cclxuICAgIHJlYWRvbmx5IGlzU3ViV2luZG93OiBib29sZWFuO1xyXG4gICAgbGF5b3V0Q29uZmlnOiBSZXNvbHZlZExheW91dENvbmZpZztcclxuXHJcbiAgICBiZWZvcmVWaXJ0dWFsUmVjdGluZ0V2ZW50OiBMYXlvdXRNYW5hZ2VyLkJlZm9yZVZpcnR1YWxSZWN0aW5nRXZlbnQgfCB1bmRlZmluZWQ7XHJcbiAgICBhZnRlclZpcnR1YWxSZWN0aW5nRXZlbnQ6IExheW91dE1hbmFnZXIuQWZ0ZXJWaXJ0dWFsUmVjdGluZ0V2ZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW92ZXMgdGhlIGFzc29jaWF0ZWQgd2luZG93IHRvIHRoZSBmcm9udC5cclxuICAgICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gaGFzIG5vIGVmZmVjdCAoY2FuIGJlIHNldCBieSBFbGVjdHJvbikuXHJcbiAgICAgKiBAcHVibGljIFxyXG4gICAgICovXHJcbiAgICBtb3ZlV2luZG93VG9wOiAodGhpczogdm9pZCkgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9jdXMgdGhlIGFzc29jaWF0ZWQgd2luZG93IHdpbmRvdy5cclxuICAgICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gaW52b2tlcyB3aW5kb3cuZm9jdXMoKSAoY2FuIGJlIHNldCBieSBFbGVjdHJvbikuXHJcbiAgICAgKiBAcHVibGljIFxyXG4gICAgICovXHJcbiAgICBmb2N1c1dpbmRvdzogKHRoaXM6IHZvaWQpID0+IHZvaWQgPSAoKSA9PiBnbG9iYWxUaGlzLmZvY3VzKCk7XHJcblxyXG4gICAgZ2V0IGNvbnRhaW5lcigpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLl9jb250YWluZXJFbGVtZW50OyB9XHJcbiAgICBnZXQgaXNJbml0aWFsaXNlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2lzSW5pdGlhbGlzZWQ7IH1cclxuICAgIGdldCBpc0RyYWdnaW5nKCk6IGJvb2xlYW4geyByZXR1cm4gZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5EcmFnZ2luZyk7IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGdldCBncm91bmRJdGVtKCk6IEdyb3VuZEl0ZW0gfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fZ3JvdW5kSXRlbTsgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChMYXlvdXRNYW5hZ2VyOmNsYXNzKS5ncm91bmRJdGVtfSBpbnN0ZWFkICovXHJcbiAgICBnZXQgcm9vdCgpOiBHcm91bmRJdGVtIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2dyb3VuZEl0ZW07IH1cclxuICAgIGdldCBvcGVuUG9wb3V0cygpOiBCcm93c2VyUG9wb3V0W10geyByZXR1cm4gdGhpcy5fb3BlblBvcG91dHM7IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGdldCBkcm9wVGFyZ2V0SW5kaWNhdG9yKCk6IERyb3BUYXJnZXRJbmRpY2F0b3IgfCBudWxsIHsgcmV0dXJuIHRoaXMuX2Ryb3BUYXJnZXRJbmRpY2F0b3I7IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgQGRlcHJlY2F0ZWQgVG8gYmUgcmVtb3ZlZCAqL1xyXG4gICAgZ2V0IHRyYW5zaXRpb25JbmRpY2F0b3IoKTogVHJhbnNpdGlvbkluZGljYXRvciB8IG51bGwgeyByZXR1cm4gdGhpcy5fdHJhbnNpdGlvbkluZGljYXRvcjsgfVxyXG4gICAgZ2V0IHdpZHRoKCk6IG51bWJlciB8IG51bGwgeyByZXR1cm4gdGhpcy5fd2lkdGg7IH1cclxuICAgIGdldCBoZWlnaHQoKTogbnVtYmVyIHwgbnVsbCB7IHJldHVybiB0aGlzLl9oZWlnaHQ7IH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSB7QGxpbmsgKEV2ZW50SHViOmNsYXNzKX0gaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGF5b3V0IG1hbmFnZXIuXHJcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb3BhZ2F0ZSBldmVudHMgYmV0d2VlbiB0aGUgd2luZG93c1xyXG4gICAgICogQHB1YmxpY1xyXG4gICAgICovXHJcbiAgICBnZXQgZXZlbnRIdWIoKTogRXZlbnRIdWIgeyByZXR1cm4gdGhpcy5fZXZlbnRIdWI7IH1cclxuICAgIGdldCByb290SXRlbSgpOiBDb250ZW50SXRlbSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhY2Nlc3Mgcm9vdEl0ZW0gYmVmb3JlIGluaXQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBncm91bmRDb250ZW50SXRlbXMgPSB0aGlzLl9ncm91bmRJdGVtLmNvbnRlbnRJdGVtcztcclxuICAgICAgICAgICAgaWYgKGdyb3VuZENvbnRlbnRJdGVtcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ3JvdW5kSXRlbS5jb250ZW50SXRlbXNbMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXQgZm9jdXNlZENvbXBvbmVudEl0ZW0oKTogQ29tcG9uZW50SXRlbSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9mb2N1c2VkQ29tcG9uZW50SXRlbTsgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZ2V0IHRhYkRyb3BQbGFjZWhvbGRlcigpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLl90YWJEcm9wUGxhY2Vob2xkZXI7IH1cclxuICAgIGdldCBtYXhpbWlzZWRTdGFjaygpOiBTdGFjayB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9tYXhpbWlzZWRTdGFjazsgfVxyXG5cclxuICAgIC8qKiBAZGVwcmVjYXRlZCBpbmRpY2F0ZXMgZGVwcmVjYXRlZCBjb25zdHJ1Y3RvciB1c2UgKi9cclxuICAgIGdldCBkZXByZWNhdGVkQ29uc3RydWN0b3IoKTogYm9vbGVhbiB7IHJldHVybiAhdGhpcy5pc1N1YldpbmRvdyAmJiB0aGlzLl9jb25zdHJ1Y3Rvck9yU3ViV2luZG93TGF5b3V0Q29uZmlnICE9PSB1bmRlZmluZWQ7IH1cclxuXHJcbiAgICBnZXQgcGFyZW50KCk6IExheW91dE1hbmFnZXIgfCBudWxsIHsgcmV0dXJuIHRoaXMuX3BhcmVudDsgfVxyXG4gICAgc2V0IHBhcmVudCh2YWx1ZTogTGF5b3V0TWFuYWdlciB8IG51bGwpIHsgdGhpcy5fcGFyZW50ID0gdmFsdWU7IH1cclxuXHJcbiAgICBnZXQgaW5zdGFuY2VzKCk6IExheW91dE1hbmFnZXJbXSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBMYXlvdXRNYW5hZ2VyW10gPSBbXTtcclxuXHJcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMucGFyZW50ID8/IHRoaXM7XHJcbiAgICAgICAgcmVzdWx0LnB1c2gocm9vdCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IHBvcG91dCBvZiByb290Lm9wZW5Qb3BvdXRzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gcG9wb3V0LmdldEdsSW5zdGFuY2UoKTtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpbGQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQHBhcmFtIGNvbnRhaW5lciAtIEEgRG9tIEhUTUwgZWxlbWVudC4gRGVmYXVsdHMgdG8gYm9keVxyXG4gICAgKiBAaW50ZXJuYWxcclxuICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzOiBMYXlvdXRNYW5hZ2VyLkNvbnN0cnVjdG9yUGFyYW1ldGVycykge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNTdWJXaW5kb3cgPSBwYXJhbWV0ZXJzLmlzU3ViV2luZG93O1xyXG5cclxuICAgICAgICB0aGlzLl9jb25zdHJ1Y3Rvck9yU3ViV2luZG93TGF5b3V0Q29uZmlnID0gcGFyYW1ldGVycy5jb25zdHJ1Y3Rvck9yU3ViV2luZG93TGF5b3V0Q29uZmlnO1xyXG5cclxuICAgICAgICBJMThuU3RyaW5ncy5jaGVja0luaXRpYWxpc2UoKTtcclxuICAgICAgICBDb25maWdNaW5pZmllci5jaGVja0luaXRpYWxpc2UoKTtcclxuXHJcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMuY29udGFpbmVyRWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lckVsZW1lbnQgPSBwYXJhbWV0ZXJzLmNvbnRhaW5lckVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVzdHJveXMgdGhlIExheW91dE1hbmFnZXIgaW5zdGFuY2UgaXRzZWxmIGFzIHdlbGwgYXMgZXZlcnkgQ29udGVudEl0ZW1cclxuICAgICAqIHdpdGhpbiBpdC4gQWZ0ZXIgdGhpcyBpcyBjYWxsZWQgbm90aGluZyBzaG91bGQgYmUgbGVmdCBvZiB0aGUgTGF5b3V0TWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgbmVlZHMgdG8gYmUgY2FsbGVkIGlmIGFuIGFwcGxpY2F0aW9uIHdpc2hlcyB0byBkZXN0cm95IHRoZSBHb2xkZW4gTGF5b3V0IG9iamVjdCB3aGlsZVxyXG4gICAgICogYSBwYWdlIHJlbWFpbnMgbG9hZGVkLiBXaGVuIGEgcGFnZSBpcyB1bmxvYWRlZCwgYWxsIHJlc291cmNlcyBjbGFpbWVkIGJ5IEdvbGRlbiBMYXlvdXQgd2lsbCBhdXRvbWF0aWNhbGx5XHJcbiAgICAgKiBiZSByZWxlYXNlZC5cclxuICAgICAqL1xyXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5faXNJbml0aWFsaXNlZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fd2luZG93QmVmb3JlVW5sb2FkTGlzdGVuaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIHRoaXMuX3dpbmRvd0JlZm9yZVVubG9hZExpc3RlbmVyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3dpbmRvd0JlZm9yZVVubG9hZExpc3RlbmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5sYXlvdXRDb25maWcuc2V0dGluZ3MuY2xvc2VQb3BvdXRzT25VbmxvYWQgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VBbGxPcGVuUG9wb3V0cygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tDbGVhclJlc2l6ZVRpbWVvdXQoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0uZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3RhYkRyb3BQbGFjZWhvbGRlci5yZW1vdmUoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2Ryb3BUYXJnZXRJbmRpY2F0b3IgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Ryb3BUYXJnZXRJbmRpY2F0b3IuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl90cmFuc2l0aW9uSW5kaWNhdG9yICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uSW5kaWNhdG9yLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9ldmVudEh1Yi5kZXN0cm95KCk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRyYWdTb3VyY2Ugb2YgdGhpcy5fZHJhZ1NvdXJjZXMpIHtcclxuICAgICAgICAgICAgICAgIGRyYWdTb3VyY2UuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2RyYWdTb3VyY2VzID0gW107XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9pc0luaXRpYWxpc2VkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgYSBHb2xkZW5MYXlvdXQgY29uZmlndXJhdGlvbiBvYmplY3QgYW5kXHJcbiAgICAgKiByZXBsYWNlcyBpdHMga2V5cyBhbmQgdmFsdWVzIHJlY3Vyc2l2ZWx5IHdpdGhcclxuICAgICAqIG9uZSBsZXR0ZXIgY29kZXNcclxuICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKFJlc29sdmVkTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkubWluaWZ5Q29uZmlnfSBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIG1pbmlmeUNvbmZpZyhjb25maWc6IFJlc29sdmVkTGF5b3V0Q29uZmlnKTogUmVzb2x2ZWRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIHJldHVybiBSZXNvbHZlZExheW91dENvbmZpZy5taW5pZnlDb25maWcoY29uZmlnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgY29uZmlndXJhdGlvbiBPYmplY3QgdGhhdCB3YXMgcHJldmlvdXNseSBtaW5pZmllZFxyXG4gICAgICogdXNpbmcgbWluaWZ5Q29uZmlnIGFuZCByZXR1cm5zIGl0cyBvcmlnaW5hbCB2ZXJzaW9uXHJcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChSZXNvbHZlZExheW91dENvbmZpZzpuYW1lc3BhY2UpLnVubWluaWZ5Q29uZmlnfSBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIHVubWluaWZ5Q29uZmlnKGNvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWcpOiBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIFJlc29sdmVkTGF5b3V0Q29uZmlnLnVubWluaWZ5Q29uZmlnKGNvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgYWJzdHJhY3QgYmluZENvbXBvbmVudChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgaXRlbUNvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKTogQ29tcG9uZW50Q29udGFpbmVyLkJpbmRhYmxlQ29tcG9uZW50O1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgYWJzdHJhY3QgdW5iaW5kQ29tcG9uZW50KGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCB2aXJ0dWFsOiBib29sZWFuLCBjb21wb25lbnQ6IENvbXBvbmVudENvbnRhaW5lci5Db21wb25lbnQgfCB1bmRlZmluZWQpOiB2b2lkO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGZyb20gR29sZGVuTGF5b3V0IGNsYXNzLiBGaW5pc2hlcyBvZiBpbml0XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgaW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldENvbnRhaW5lcigpO1xyXG4gICAgICAgIHRoaXMuX2Ryb3BUYXJnZXRJbmRpY2F0b3IgPSBuZXcgRHJvcFRhcmdldEluZGljYXRvcigvKnRoaXMuY29udGFpbmVyKi8pO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zaXRpb25JbmRpY2F0b3IgPSBuZXcgVHJhbnNpdGlvbkluZGljYXRvcigpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2l6ZUZyb21Db250YWluZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5sYXlvdXRDb25maWcgPSBSZXNvbHZlZExheW91dENvbmZpZy5jcmVhdGVEZWZhdWx0KCk7IC8vIHdpbGwgb3ZlcndyaXR0ZW4gYmUgbG9hZGVkIHZpYSBsb2FkTGF5b3V0XHJcbiAgICAgICAgdGhpcy5fZ3JvdW5kSXRlbSA9IG5ldyBHcm91bmRJdGVtKHRoaXMsIHRoaXMubGF5b3V0Q29uZmlnLnJvb3QsIHRoaXMuX2NvbnRhaW5lckVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0uaW5pdCgpO1xyXG5cclxuICAgICAgICB0aGlzLmNoZWNrTG9hZGVkTGF5b3V0TWF4aW1pc2VJdGVtKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3Jlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy5fY29udGFpbmVyRWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXNlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5hZGp1c3RDb2x1bW5zUmVzcG9uc2l2ZSgpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnaW5pdGlhbGlzZWQnKTtcclxuXHJcbiAgICAgICAgbGV0IGxheW91dCA9IHRoaXMuX2NvbnN0cnVjdG9yT3JTdWJXaW5kb3dMYXlvdXRDb25maWc7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzU3ViV2luZG93ICYmIGxheW91dCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vIFdyYXAgaW4gc3RhY2sgZm9yIG11bHRpd2luZG93IGRyYWctYW5kLWRyb3AgdG8gd29yayBwcm9wZXJseVxyXG4gICAgICAgICAgICBpZiAobGF5b3V0LnJvb3Q/LnR5cGUgPT0gSXRlbVR5cGUuY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgICAgICBsYXlvdXQucm9vdCA9IHtcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5zdGFjayxcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBbIGxheW91dC5yb290IF0sXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmxvYWRMYXlvdXQobGF5b3V0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkcyBhIG5ldyBsYXlvdXRcclxuICAgICAqIEBwYXJhbSBsYXlvdXRDb25maWcgLSBOZXcgbGF5b3V0IHRvIGJlIGxvYWRlZFxyXG4gICAgICovXHJcbiAgICBsb2FkTGF5b3V0KGxheW91dENvbmZpZzogTGF5b3V0Q29uZmlnKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhbGlzZWQpIHtcclxuICAgICAgICAgICAgLy8gSW4gY2FzZSBhcHBsaWNhdGlvbiBub3QgY29ycmVjdGx5IHVzaW5nIGxlZ2FjeSBjb25zdHJ1Y3RvclxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dvbGRlbkxheW91dDogTmVlZCB0byBjYWxsIGluaXQoKSBpZiBMYXlvdXRDb25maWcgd2l0aCBkZWZpbmVkIHJvb3QgcGFzc2VkIHRvIGNvbnN0cnVjdG9yJylcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUxMMTExMTknKTtcclxuICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dENvbmZpZyA9IExheW91dENvbmZpZy5yZXNvbHZlKGxheW91dENvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVN1YldpbmRvd3MoKTsgLy8gc3RpbGwgbmVlZHMgdG8gYmUgdGVzdGVkXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ncm91bmRJdGVtLmxvYWRSb290KHRoaXMubGF5b3V0Q29uZmlnLnJvb3QpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0xvYWRlZExheW91dE1heGltaXNlSXRlbSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGp1c3RDb2x1bW5zUmVzcG9uc2l2ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIGxheW91dCBjb25maWd1cmF0aW9uIG9iamVjdCBiYXNlZCBvbiB0aGUgdGhlIGN1cnJlbnQgc3RhdGVcclxuICAgICAqXHJcbiAgICAgKiBAcHVibGljXHJcbiAgICAgKiBAcmV0dXJucyBHb2xkZW5MYXlvdXQgY29uZmlndXJhdGlvblxyXG4gICAgICovXHJcbiAgICBzYXZlTGF5b3V0KCk6IFJlc29sdmVkTGF5b3V0Q29uZmlnIHtcclxuICAgICAgICBpZiAodGhpcy5faXNJbml0aWFsaXNlZCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGNyZWF0ZSBjb25maWcsIGxheW91dCBub3QgeWV0IGluaXRpYWxpc2VkJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIChyb290ICE9PSB1bmRlZmluZWQgJiYgIShyb290IGluc3RhbmNlb2YgQ29udGVudEl0ZW0pKSB7XHJcbiAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jvb3QgbXVzdCBiZSBhIENvbnRlbnRJdGVtJyk7XHJcbiAgICAgICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICogQ29udGVudFxyXG4gICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTVRDMTgyNDQnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VuZENvbnRlbnQgPSB0aGlzLl9ncm91bmRJdGVtLmNhbGN1bGF0ZUNvbmZpZ0NvbnRlbnQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgcm9vdEl0ZW1Db25maWc6IFJlc29sdmVkUm9vdEl0ZW1Db25maWcgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdW5kQ29udGVudC5sZW5ndGggIT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICByb290SXRlbUNvbmZpZyA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm9vdEl0ZW1Db25maWcgPSBncm91bmRDb250ZW50WzBdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAgICAqIFJldHJpZXZlIGNvbmZpZyBmb3Igc3Vid2luZG93c1xyXG4gICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIHRoaXMucmVjb25jaWxlUG9wb3V0V2luZG93cygpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb3BlblBvcG91dHM6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnW10gPSBbXTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fb3BlblBvcG91dHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBvcGVuUG9wb3V0cy5wdXNoKHRoaXMuX29wZW5Qb3BvdXRzW2ldLnRvQ29uZmlnKCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm9vdDogcm9vdEl0ZW1Db25maWcsXHJcbiAgICAgICAgICAgICAgICAgICAgb3BlblBvcG91dHMsXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6ICBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5jcmVhdGVDb3B5KHRoaXMubGF5b3V0Q29uZmlnLnNldHRpbmdzKSxcclxuICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25zOiBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmNyZWF0ZUNvcHkodGhpcy5sYXlvdXRDb25maWcuZGltZW5zaW9ucyksXHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuY3JlYXRlQ29weSh0aGlzLmxheW91dENvbmZpZy5oZWFkZXIpLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGFueSBleGlzdGluZyBsYXlvdXQuIEVmZmVjdGl2ZWx5LCBhbiBlbXB0eSBsYXlvdXQgd2lsbCBiZSBsb2FkZWQuXHJcbiAgICAgKi9cclxuXHJcbiAgICBjbGVhcigpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNQ0wxMTEyOScpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0uY2xlYXJSb290KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoTGF5b3V0TWFuYWdlcjpjbGFzcykuc2F2ZUxheW91dH1cclxuICAgICAqL1xyXG4gICAgdG9Db25maWcoKTogUmVzb2x2ZWRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNhdmVMYXlvdXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBuZXcgQ29tcG9uZW50SXRlbS4gIFdpbGwgdXNlIGRlZmF1bHQgbG9jYXRpb24gc2VsZWN0b3JzIHRvIGVuc3VyZSBhIGxvY2F0aW9uIGlzIGZvdW5kIGFuZFxyXG4gICAgICogY29tcG9uZW50IGlzIHN1Y2Nlc3NmdWxseSBhZGRlZFxyXG4gICAgICogQHBhcmFtIGNvbXBvbmVudFR5cGVOYW1lIC0gTmFtZSBvZiBjb21wb25lbnQgdHlwZSB0byBiZSBjcmVhdGVkLlxyXG4gICAgICogQHBhcmFtIHN0YXRlIC0gT3B0aW9uYWwgaW5pdGlhbCBzdGF0ZSB0byBiZSBhc3NpZ25lZCB0byBjb21wb25lbnRcclxuICAgICAqIEByZXR1cm5zIE5ldyBDb21wb25lbnRJdGVtIGNyZWF0ZWQuXHJcbiAgICAgKi9cclxuICAgIG5ld0NvbXBvbmVudChjb21wb25lbnRUeXBlOiBKc29uVmFsdWUsIGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlLCB0aXRsZT86IHN0cmluZyk6IENvbXBvbmVudEl0ZW0ge1xyXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudEl0ZW0gPSB0aGlzLm5ld0NvbXBvbmVudEF0TG9jYXRpb24oY29tcG9uZW50VHlwZSwgY29tcG9uZW50U3RhdGUsIHRpdGxlKTtcclxuICAgICAgICBpZiAoY29tcG9uZW50SXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignTE1OQzY1NTg4Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudEl0ZW07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIENvbXBvbmVudEl0ZW0gYXQgdGhlIGZpcnN0IHZhbGlkIHNlbGVjdG9yIGxvY2F0aW9uLlxyXG4gICAgICogQHBhcmFtIGNvbXBvbmVudFR5cGVOYW1lIC0gTmFtZSBvZiBjb21wb25lbnQgdHlwZSB0byBiZSBjcmVhdGVkLlxyXG4gICAgICogQHBhcmFtIHN0YXRlIC0gT3B0aW9uYWwgaW5pdGlhbCBzdGF0ZSB0byBiZSBhc3NpZ25lZCB0byBjb21wb25lbnRcclxuICAgICAqIEBwYXJhbSBsb2NhdGlvblNlbGVjdG9ycyAtIEFycmF5IG9mIGxvY2F0aW9uIHNlbGVjdG9ycyB1c2VkIHRvIGZpbmQgbG9jYXRpb24gaW4gbGF5b3V0IHdoZXJlIGNvbXBvbmVudFxyXG4gICAgICogd2lsbCBiZSBhZGRlZC4gRmlyc3QgbG9jYXRpb24gaW4gYXJyYXkgd2hpY2ggaXMgdmFsaWQgd2lsbCBiZSB1c2VkLiBJZiBsb2NhdGlvblNlbGVjdG9ycyBpcyB1bmRlZmluZWQsXHJcbiAgICAgKiB7QGxpbmsgKExheW91dE1hbmFnZXI6bmFtZXNwYWNlKS5kZWZhdWx0TG9jYXRpb25TZWxlY3RvcnN9IHdpbGwgYmUgdXNlZFxyXG4gICAgICogQHJldHVybnMgTmV3IENvbXBvbmVudEl0ZW0gY3JlYXRlZCBvciB1bmRlZmluZWQgaWYgbm8gdmFsaWQgbG9jYXRpb24gc2VsZWN0b3Igd2FzIGluIGFycmF5LlxyXG4gICAgICovXHJcbiAgICBuZXdDb21wb25lbnRBdExvY2F0aW9uKGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSwgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsIHRpdGxlPzogc3RyaW5nLFxyXG4gICAgICAgIGxvY2F0aW9uU2VsZWN0b3JzPzogTGF5b3V0TWFuYWdlci5Mb2NhdGlvblNlbGVjdG9yW11cclxuICAgICk6IENvbXBvbmVudEl0ZW0gfCB1bmRlZmluZWR7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgY29tcG9uZW50IGJlZm9yZSBpbml0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLmFkZENvbXBvbmVudEF0TG9jYXRpb24oY29tcG9uZW50VHlwZSwgY29tcG9uZW50U3RhdGUsIHRpdGxlLCBsb2NhdGlvblNlbGVjdG9ycyk7XHJcbiAgICAgICAgICAgIGlmIChsb2NhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZEl0ZW0gPSBsb2NhdGlvbi5wYXJlbnRJdGVtLmNvbnRlbnRJdGVtc1tsb2NhdGlvbi5pbmRleF07XHJcbiAgICAgICAgICAgICAgICBpZiAoIUNvbnRlbnRJdGVtLmlzQ29tcG9uZW50SXRlbShjcmVhdGVkSXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNTkM5OTI4Nzc1MzMnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZWRJdGVtO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIG5ldyBDb21wb25lbnRJdGVtLiAgV2lsbCB1c2UgZGVmYXVsdCBsb2NhdGlvbiBzZWxlY3RvcnMgdG8gZW5zdXJlIGEgbG9jYXRpb24gaXMgZm91bmQgYW5kXHJcbiAgICAgKiBjb21wb25lbnQgaXMgc3VjY2Vzc2Z1bGx5IGFkZGVkXHJcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50VHlwZSAtIFR5cGUgb2YgY29tcG9uZW50IHRvIGJlIGNyZWF0ZWQuXHJcbiAgICAgKiBAcGFyYW0gc3RhdGUgLSBPcHRpb25hbCBpbml0aWFsIHN0YXRlIHRvIGJlIGFzc2lnbmVkIHRvIGNvbXBvbmVudFxyXG4gICAgICogQHJldHVybnMgTG9jYXRpb24gb2YgbmV3IENvbXBvbmVudEl0ZW0gY3JlYXRlZC5cclxuICAgICAqL1xyXG4gICAgYWRkQ29tcG9uZW50KGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSwgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsIHRpdGxlPzogc3RyaW5nKTogTGF5b3V0TWFuYWdlci5Mb2NhdGlvbiB7XHJcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLmFkZENvbXBvbmVudEF0TG9jYXRpb24oY29tcG9uZW50VHlwZSwgY29tcG9uZW50U3RhdGUsIHRpdGxlKTtcclxuICAgICAgICBpZiAobG9jYXRpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNQUM5OTk0MycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgQ29tcG9uZW50SXRlbSBhdCB0aGUgZmlyc3QgdmFsaWQgc2VsZWN0b3IgbG9jYXRpb24uXHJcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50VHlwZSAtIFR5cGUgb2YgY29tcG9uZW50IHRvIGJlIGNyZWF0ZWQuXHJcbiAgICAgKiBAcGFyYW0gc3RhdGUgLSBPcHRpb25hbCBpbml0aWFsIHN0YXRlIHRvIGJlIGFzc2lnbmVkIHRvIGNvbXBvbmVudFxyXG4gICAgICogQHBhcmFtIGxvY2F0aW9uU2VsZWN0b3JzIC0gQXJyYXkgb2YgbG9jYXRpb24gc2VsZWN0b3JzIHVzZWQgdG8gZmluZCBkZXRlcm1pbmUgbG9jYXRpb24gaW4gbGF5b3V0IHdoZXJlIGNvbXBvbmVudFxyXG4gICAgICogd2lsbCBiZSBhZGRlZC4gRmlyc3QgbG9jYXRpb24gaW4gYXJyYXkgd2hpY2ggaXMgdmFsaWQgd2lsbCBiZSB1c2VkLiBJZiB1bmRlZmluZWQsXHJcbiAgICAgKiB7QGxpbmsgKExheW91dE1hbmFnZXI6bmFtZXNwYWNlKS5kZWZhdWx0TG9jYXRpb25TZWxlY3RvcnN9IHdpbGwgYmUgdXNlZC5cclxuICAgICAqIEByZXR1cm5zIExvY2F0aW9uIG9mIG5ldyBDb21wb25lbnRJdGVtIGNyZWF0ZWQgb3IgdW5kZWZpbmVkIGlmIG5vIHZhbGlkIGxvY2F0aW9uIHNlbGVjdG9yIHdhcyBpbiBhcnJheS5cclxuICAgICAqL1xyXG4gICAgYWRkQ29tcG9uZW50QXRMb2NhdGlvbihjb21wb25lbnRUeXBlOiBKc29uVmFsdWUsIGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlLCB0aXRsZT86IHN0cmluZyxcclxuICAgICAgICBsb2NhdGlvblNlbGVjdG9ycz86IHJlYWRvbmx5IExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3RvcltdXHJcbiAgICApOiBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBjb25zdCBpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiAnY29tcG9uZW50JyxcclxuICAgICAgICAgICAgY29tcG9uZW50VHlwZSxcclxuICAgICAgICAgICAgY29tcG9uZW50U3RhdGUsXHJcbiAgICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZEl0ZW1BdExvY2F0aW9uKGl0ZW1Db25maWcsIGxvY2F0aW9uU2VsZWN0b3JzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBuZXcgQ29udGVudEl0ZW0uICBXaWxsIHVzZSBkZWZhdWx0IGxvY2F0aW9uIHNlbGVjdG9ycyB0byBlbnN1cmUgYSBsb2NhdGlvbiBpcyBmb3VuZCBhbmRcclxuICAgICAqIGNvbXBvbmVudCBpcyBzdWNjZXNzZnVsbHkgYWRkZWRcclxuICAgICAqIEBwYXJhbSBpdGVtQ29uZmlnIC0gUmVzb2x2ZWRJdGVtQ29uZmlnIG9mIGNoaWxkIHRvIGJlIGFkZGVkLlxyXG4gICAgICogQHJldHVybnMgTmV3IENvbnRlbnRJdGVtIGNyZWF0ZWQuXHJcbiAgICAqL1xyXG4gICAgbmV3SXRlbShpdGVtQ29uZmlnOiBSb3dPckNvbHVtbkl0ZW1Db25maWcgfCBTdGFja0l0ZW1Db25maWcgfCBDb21wb25lbnRJdGVtQ29uZmlnKTogQ29udGVudEl0ZW0ge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gdGhpcy5uZXdJdGVtQXRMb2NhdGlvbihpdGVtQ29uZmlnKTtcclxuICAgICAgICBpZiAoY29udGVudEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNTkM2NTU4OCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb250ZW50SXRlbTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbmV3IGNoaWxkIENvbnRlbnRJdGVtIHVuZGVyIHRoZSByb290IENvbnRlbnRJdGVtLiAgSWYgYSByb290IGRvZXMgbm90IGV4aXN0LCB0aGVuIGNyZWF0ZSByb290IENvbnRlbnRJdGVtIGluc3RlYWRcclxuICAgICAqIEBwYXJhbSBpdGVtQ29uZmlnIC0gUmVzb2x2ZWRJdGVtQ29uZmlnIG9mIGNoaWxkIHRvIGJlIGFkZGVkLlxyXG4gICAgICogQHBhcmFtIGxvY2F0aW9uU2VsZWN0b3JzIC0gQXJyYXkgb2YgbG9jYXRpb24gc2VsZWN0b3JzIHVzZWQgdG8gZmluZCBkZXRlcm1pbmUgbG9jYXRpb24gaW4gbGF5b3V0IHdoZXJlIENvbnRlbnRJdGVtXHJcbiAgICAgKiB3aWxsIGJlIGFkZGVkLiBGaXJzdCBsb2NhdGlvbiBpbiBhcnJheSB3aGljaCBpcyB2YWxpZCB3aWxsIGJlIHVzZWQuIElmIHVuZGVmaW5lZCxcclxuICAgICAqIHtAbGluayAoTGF5b3V0TWFuYWdlcjpuYW1lc3BhY2UpLmRlZmF1bHRMb2NhdGlvblNlbGVjdG9yc30gd2lsbCBiZSB1c2VkLlxyXG4gICAgICogQHJldHVybnMgTmV3IENvbnRlbnRJdGVtIGNyZWF0ZWQgb3IgdW5kZWZpbmVkIGlmIG5vIHZhbGlkIGxvY2F0aW9uIHNlbGVjdG9yIHdhcyBpbiBhcnJheS4gKi9cclxuICAgIG5ld0l0ZW1BdExvY2F0aW9uKGl0ZW1Db25maWc6IFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFN0YWNrSXRlbUNvbmZpZyB8IENvbXBvbmVudEl0ZW1Db25maWcsXHJcbiAgICAgICAgbG9jYXRpb25TZWxlY3RvcnM/OiByZWFkb25seSBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uU2VsZWN0b3JbXVxyXG4gICAgKTogQ29udGVudEl0ZW0gfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWRkIGNvbXBvbmVudCBiZWZvcmUgaW5pdCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5hZGRJdGVtQXRMb2NhdGlvbihpdGVtQ29uZmlnLCBsb2NhdGlvblNlbGVjdG9ycyk7XHJcbiAgICAgICAgICAgIGlmIChsb2NhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZEl0ZW0gPSBsb2NhdGlvbi5wYXJlbnRJdGVtLmNvbnRlbnRJdGVtc1tsb2NhdGlvbi5pbmRleF07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlZEl0ZW07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbmV3IENvbnRlbnRJdGVtLiAgV2lsbCB1c2UgZGVmYXVsdCBsb2NhdGlvbiBzZWxlY3RvcnMgdG8gZW5zdXJlIGEgbG9jYXRpb24gaXMgZm91bmQgYW5kXHJcbiAgICAgKiBjb21wb25lbnQgaXMgc3VjY2Vzc2Z1bGx5IGFkZGVkLlxyXG4gICAgICogQHBhcmFtIGl0ZW1Db25maWcgLSBSZXNvbHZlZEl0ZW1Db25maWcgb2YgY2hpbGQgdG8gYmUgYWRkZWQuXHJcbiAgICAgKiBAcmV0dXJucyBMb2NhdGlvbiBvZiBuZXcgQ29udGVudEl0ZW0gY3JlYXRlZC4gKi9cclxuICAgIGFkZEl0ZW0oaXRlbUNvbmZpZzogUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgU3RhY2tJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZyk6IExheW91dE1hbmFnZXIuTG9jYXRpb24ge1xyXG4gICAgICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5hZGRJdGVtQXRMb2NhdGlvbihpdGVtQ29uZmlnKTtcclxuICAgICAgICBpZiAobG9jYXRpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNQUk5OTk0MycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgQ29udGVudEl0ZW0gYXQgdGhlIGZpcnN0IHZhbGlkIHNlbGVjdG9yIGxvY2F0aW9uLlxyXG4gICAgICogQHBhcmFtIGl0ZW1Db25maWcgLSBSZXNvbHZlZEl0ZW1Db25maWcgb2YgY2hpbGQgdG8gYmUgYWRkZWQuXHJcbiAgICAgKiBAcGFyYW0gbG9jYXRpb25TZWxlY3RvcnMgLSBBcnJheSBvZiBsb2NhdGlvbiBzZWxlY3RvcnMgdXNlZCB0byBmaW5kIGRldGVybWluZSBsb2NhdGlvbiBpbiBsYXlvdXQgd2hlcmUgQ29udGVudEl0ZW1cclxuICAgICAqIHdpbGwgYmUgYWRkZWQuIEZpcnN0IGxvY2F0aW9uIGluIGFycmF5IHdoaWNoIGlzIHZhbGlkIHdpbGwgYmUgdXNlZC4gSWYgdW5kZWZpbmVkLFxyXG4gICAgICoge0BsaW5rIChMYXlvdXRNYW5hZ2VyOm5hbWVzcGFjZSkuZGVmYXVsdExvY2F0aW9uU2VsZWN0b3JzfSB3aWxsIGJlIHVzZWQuXHJcbiAgICAgKiBAcmV0dXJucyBMb2NhdGlvbiBvZiBuZXcgQ29udGVudEl0ZW0gY3JlYXRlZCBvciB1bmRlZmluZWQgaWYgbm8gdmFsaWQgbG9jYXRpb24gc2VsZWN0b3Igd2FzIGluIGFycmF5LiAqL1xyXG4gICAgYWRkSXRlbUF0TG9jYXRpb24oaXRlbUNvbmZpZzogUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgU3RhY2tJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZyxcclxuICAgICAgICBsb2NhdGlvblNlbGVjdG9ycz86IHJlYWRvbmx5IExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3RvcltdXHJcbiAgICApOiBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFkZCBjb21wb25lbnQgYmVmb3JlIGluaXQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAobG9jYXRpb25TZWxlY3RvcnMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gZGVmYXVsdExvY2F0aW9uU2VsZWN0b3JzIHNob3VsZCBhbHdheXMgZmluZCBhIGxvY2F0aW9uXHJcbiAgICAgICAgICAgICAgICBsb2NhdGlvblNlbGVjdG9ycyA9IExheW91dE1hbmFnZXIuZGVmYXVsdExvY2F0aW9uU2VsZWN0b3JzO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMuZmluZEZpcnN0TG9jYXRpb24obG9jYXRpb25TZWxlY3RvcnMpO1xyXG4gICAgICAgICAgICBpZiAobG9jYXRpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRJdGVtID0gbG9jYXRpb24ucGFyZW50SXRlbTtcclxuICAgICAgICAgICAgICAgIGxldCBhZGRJZHg6IG51bWJlcjtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAocGFyZW50SXRlbS50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5ncm91bmQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdW5kSXRlbSA9IHBhcmVudEl0ZW0gYXMgR3JvdW5kSXRlbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkSWR4ID0gZ3JvdW5kSXRlbS5hZGRJdGVtKGl0ZW1Db25maWcsIGxvY2F0aW9uLmluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZElkeCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRJdGVtID0gdGhpcy5fZ3JvdW5kSXRlbS5jb250ZW50SXRlbXNbMF07IC8vIHdhcyBhZGRlZCB0byByb290SXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkSWR4ID0gMDsgLy8gd2FzIGFkZGVkIGFzIHJvb3RJdGVtICh3aGljaCBpcyB0aGUgZmlyc3QgYW5kIG9ubHkgQ29udGVudEl0ZW0gaW4gR3JvdW5kSXRlbSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93T3JDb2x1bW4gPSBwYXJlbnRJdGVtIGFzIFJvd09yQ29sdW1uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRJZHggPSByb3dPckNvbHVtbi5hZGRJdGVtKGl0ZW1Db25maWcsIGxvY2F0aW9uLmluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuc3RhY2s6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFJdGVtQ29uZmlnLmlzQ29tcG9uZW50KGl0ZW1Db25maWcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuSXRlbUNvbmZpZ0lzTm90VHlwZUNvbXBvbmVudF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBwYXJlbnRJdGVtIGFzIFN0YWNrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkSWR4ID0gc3RhY2suYWRkSXRlbShpdGVtQ29uZmlnLCBsb2NhdGlvbi5pbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbXBvbmVudDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNQUlBTEM4NzQ0NDYwMicpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ0xNQUlBTFU5ODg4MTczMycsIHBhcmVudEl0ZW0udHlwZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKEl0ZW1Db25maWcuaXNDb21wb25lbnQoaXRlbUNvbmZpZykpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaWYgc3RhY2sgd2FzIGluc2VydGVkXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHBhcmVudEl0ZW0uY29udGVudEl0ZW1zW2FkZElkeF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKENvbnRlbnRJdGVtLmlzU3RhY2soaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50SXRlbSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZElkeCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxvY2F0aW9uLnBhcmVudEl0ZW0gPSBwYXJlbnRJdGVtO1xyXG4gICAgICAgICAgICAgICAgbG9jYXRpb24uaW5kZXggPSBhZGRJZHg7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBMb2FkcyB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCBSZXNvbHZlZEl0ZW1Db25maWcgYXMgcm9vdC5cclxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSBhIENvbXBvbmVudCBhbGwgYnkgaXRzZWxmLiAgVGhlIGxheW91dCBjYW5ub3QgYmUgY2hhbmdlZCBvdGhlciB0aGFuIGhhdmluZyBhbm90aGVyIG5ldyBsYXlvdXQgbG9hZGVkLlxyXG4gICAgICogTm90ZSB0aGF0LCBpZiB0aGlzIGxheW91dCBpcyBzYXZlZCBhbmQgcmVsb2FkZWQsIGl0IHdpbGwgcmVsb2FkIHdpdGggdGhlIENvbXBvbmVudCBhcyBhIGNoaWxkIG9mIGEgU3RhY2suXHJcbiAgICAqL1xyXG4gICAgbG9hZENvbXBvbmVudEFzUm9vdChpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgaXRlbSBiZWZvcmUgaW5pdCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0ubG9hZENvbXBvbmVudEFzUm9vdChpdGVtQ29uZmlnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpLnNldFNpemV9ICovXHJcbiAgICB1cGRhdGVTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgbGF5b3V0IG1hbmFnZXJzIHNpemVcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gd2lkdGggLSBXaWR0aCBpbiBwaXhlbHNcclxuICAgICAqIEBwYXJhbSBoZWlnaHQgLSBIZWlnaHQgaW4gcGl4ZWxzXHJcbiAgICAgKi9cclxuICAgIHNldFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl93aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuX2hlaWdodCA9IGhlaWdodDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbGlzZWQgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1VUzE4ODgxJyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ncm91bmRJdGVtLnNldFNpemUodGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21heGltaXNlZFN0YWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBnZXRFbGVtZW50V2lkdGhBbmRIZWlnaHQodGhpcy5fY29udGFpbmVyRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0RWxlbWVudFdpZHRoKHRoaXMuX21heGltaXNlZFN0YWNrLmVsZW1lbnQsIHdpZHRoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHRoaXMuX21heGltaXNlZFN0YWNrLmVsZW1lbnQsIGhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWF4aW1pc2VkU3RhY2sudXBkYXRlU2l6ZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGp1c3RDb2x1bW5zUmVzcG9uc2l2ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGJlZ2luU2l6ZUludmFsaWRhdGlvbigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zaXplSW52YWxpZGF0aW9uQmVnaW5Db3VudCsrO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGVuZFNpemVJbnZhbGlkYXRpb24oKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKC0tdGhpcy5fc2l6ZUludmFsaWRhdGlvbkJlZ2luQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplRnJvbUNvbnRhaW5lcigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICB1cGRhdGVTaXplRnJvbUNvbnRhaW5lcigpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGdldEVsZW1lbnRXaWR0aEFuZEhlaWdodCh0aGlzLl9jb250YWluZXJFbGVtZW50KTtcclxuICAgICAgICB0aGlzLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGUgdGhlIHNpemUgb2YgdGhlIHJvb3QgQ29udGVudEl0ZW0uICBUaGlzIHdpbGwgdXBkYXRlIHRoZSBzaXplIG9mIGFsbCBjb250ZW50SXRlbXMgaW4gdGhlIHRyZWVcclxuICAgICAqIEBwYXJhbSBmb3JjZSAtIEluIHNvbWUgY2FzZXMgdGhlIHNpemUgaXMgbm90IHVwZGF0ZWQgaWYgaXQgaGFzIG5vdCBjaGFuZ2VkLiBJbiB0aGlzIGNhc2UsIGV2ZW50c1xyXG4gICAgICogKHN1Y2ggYXMgQ29tcG9uZW50Q29udGFpbmVyLnZpcnR1YWxSZWN0aW5nUmVxdWlyZWRFdmVudCkgYXJlIG5vdCBmaXJlZC4gU2V0dGluZyBmb3JjZSB0byB0cnVlLCBlbnN1cmVzIHRoZSBzaXplIGlzIHVwZGF0ZWQgcmVnYXJkbGVzcywgYW5kXHJcbiAgICAgKiB0aGUgcmVzcGVjdGl2ZSBldmVudHMgYXJlIGZpcmVkLiBUaGlzIGlzIHNvbWV0aW1lcyBuZWNlc3Nhcnkgd2hlbiBhIGNvbXBvbmVudCdzIHNpemUgaGFzIG5vdCBjaGFuZ2VkIGJ1dCBpdCBoYXMgYmVjb21lIHZpc2libGUsIGFuZCB0aGVcclxuICAgICAqIHJlbGV2YW50IGV2ZW50cyBuZWVkIHRvIGJlIGZpcmVkLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGVSb290U2l6ZShmb3JjZSA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTVVSUzI4ODgxJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZ3JvdW5kSXRlbS51cGRhdGVTaXplKGZvcmNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwdWJsaWMgKi9cclxuICAgIGNyZWF0ZUFuZEluaXRDb250ZW50SXRlbShjb25maWc6IFJlc29sdmVkSXRlbUNvbmZpZywgcGFyZW50OiBDb250ZW50SXRlbSk6IENvbnRlbnRJdGVtIHtcclxuICAgICAgICBjb25zdCBuZXdJdGVtID0gdGhpcy5jcmVhdGVDb250ZW50SXRlbShjb25maWcsIHBhcmVudCk7XHJcbiAgICAgICAgbmV3SXRlbS5pbml0KCk7XHJcbiAgICAgICAgcmV0dXJuIG5ld0l0ZW07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWN1cnNpdmVseSBjcmVhdGVzIG5ldyBpdGVtIHRyZWUgc3RydWN0dXJlcyBiYXNlZCBvbiBhIHByb3ZpZGVkXHJcbiAgICAgKiBJdGVtQ29uZmlndXJhdGlvbiBvYmplY3RcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY29uZmlnIC0gUmVzb2x2ZWRJdGVtQ29uZmlnXHJcbiAgICAgKiBAcGFyYW0gcGFyZW50IC0gVGhlIGl0ZW0gdGhlIG5ld2x5IGNyZWF0ZWQgaXRlbSBzaG91bGQgYmUgYSBjaGlsZCBvZlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUNvbnRlbnRJdGVtKGNvbmZpZzogUmVzb2x2ZWRJdGVtQ29uZmlnLCBwYXJlbnQ6IENvbnRlbnRJdGVtKTogQ29udGVudEl0ZW0ge1xyXG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLnR5cGUgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoJ01pc3NpbmcgcGFyYW1ldGVyIFxcJ3R5cGVcXCcnLCBKU09OLnN0cmluZ2lmeShjb25maWcpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdlIGFkZCBhbiBhZGRpdGlvbmFsIHN0YWNrIGFyb3VuZCBldmVyeSBjb21wb25lbnQgdGhhdCdzIG5vdCB3aXRoaW4gYSBzdGFjayBhbnl3YXlzLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGNvbXBvbmVudFxyXG4gICAgICAgICAgICBSZXNvbHZlZEl0ZW1Db25maWcuaXNDb21wb25lbnRJdGVtKGNvbmZpZykgJiZcclxuXHJcbiAgICAgICAgICAgIC8vIGFuZCBpdCdzIG5vdCBhbHJlYWR5IHdpdGhpbiBhIHN0YWNrXHJcbiAgICAgICAgICAgICEocGFyZW50IGluc3RhbmNlb2YgU3RhY2spICYmXHJcblxyXG4gICAgICAgICAgICAvLyBhbmQgd2UgaGF2ZSBhIHBhcmVudFxyXG4gICAgICAgICAgICAhIXBhcmVudCAmJlxyXG5cclxuICAgICAgICAgICAgLy8gYW5kIGl0J3Mgbm90IHRoZSB0b3Btb3N0IGl0ZW0gaW4gYSBuZXcgd2luZG93XHJcbiAgICAgICAgICAgICEodGhpcy5pc1N1YldpbmRvdyA9PT0gdHJ1ZSAmJiBwYXJlbnQgaW5zdGFuY2VvZiBHcm91bmRJdGVtKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFja0NvbmZpZzogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5zdGFjayxcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFtjb25maWddLFxyXG4gICAgICAgICAgICAgICAgc2l6ZTogY29uZmlnLnNpemUsXHJcbiAgICAgICAgICAgICAgICBzaXplVW5pdDogY29uZmlnLnNpemVVbml0LFxyXG4gICAgICAgICAgICAgICAgbWluU2l6ZTogY29uZmlnLm1pblNpemUsXHJcbiAgICAgICAgICAgICAgICBtaW5TaXplVW5pdDogY29uZmlnLm1pblNpemVVbml0LFxyXG4gICAgICAgICAgICAgICAgaWQ6IGNvbmZpZy5pZCxcclxuICAgICAgICAgICAgICAgIG1heGltaXNlZDogY29uZmlnLm1heGltaXNlZCxcclxuICAgICAgICAgICAgICAgIGlzQ2xvc2FibGU6IGNvbmZpZy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgICAgICAgICAgYWN0aXZlSXRlbUluZGV4OiAwLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25maWcgPSBzdGFja0NvbmZpZztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gdGhpcy5jcmVhdGVDb250ZW50SXRlbUZyb21Db25maWcoY29uZmlnLCBwYXJlbnQpO1xyXG4gICAgICAgIHJldHVybiBjb250ZW50SXRlbTtcclxuICAgIH1cclxuXHJcbiAgICBmaW5kRmlyc3RDb21wb25lbnRJdGVtQnlJZChpZDogc3RyaW5nKTogQ29tcG9uZW50SXRlbSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUZGQ0lCSTgyNDQ2Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlQnlJZFJlY3Vyc2l2ZShJdGVtVHlwZS5jb21wb25lbnQsIGlkLCB0aGlzLl9ncm91bmRJdGVtKSBhcyBDb21wb25lbnRJdGVtO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjcmVhdGVQb3BvdXRGcm9tQ29udGVudEl0ZW0oaXRlbTogQ29udGVudEl0ZW0sXHJcbiAgICAgICAgd2luZG93OiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3cgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgcGFyZW50SWQ6IHN0cmluZyB8IG51bGwsXHJcbiAgICAgICAgZG9ja1BvaW50OiBDb250ZW50SXRlbS5Eb2NrUG9pbnQgfCBudWxsIHwgdW5kZWZpbmVkLFxyXG4gICAgKTogQnJvd3NlclBvcG91dCB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdGhlIGl0ZW0gaXMgdGhlIG9ubHkgY29tcG9uZW50IHdpdGhpbiBhIHN0YWNrIG9yIGZvciBzb21lXHJcbiAgICAgICAgICogb3RoZXIgcmVhc29uIHRoZSBvbmx5IGNoaWxkIG9mIGl0cyBwYXJlbnQgdGhlIHBhcmVudCB3aWxsIGJlIGRlc3Ryb3llZFxyXG4gICAgICAgICAqIHdoZW4gdGhlIGNoaWxkIGlzIHJlbW92ZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBJbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgd2UgbW92ZSB1cCB0aGUgdHJlZSB1bnRpbCB3ZSBmaW5kIHNvbWV0aGluZ1xyXG4gICAgICAgICAqIHRoYXQgd2lsbCByZW1haW4gYWZ0ZXIgdGhlIGl0ZW0gaXMgYmVpbmcgcG9wcGVkIG91dFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IGRvY2sgPSBkb2NrUG9pbnQgPz8gaXRlbS5maW5kRG9ja1BvaW50KCk7XHJcblxyXG4gICAgICAgIGlmIChkb2NrID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdMTUNQRkNJMDA4MzQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocGFyZW50SWQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGRvY2sucGFyZW50LmFkZFBvcEluUGFyZW50SWQocGFyZW50SWQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAod2luZG93ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyU2NyZWVuID0gZ2V0V2luZG93SW5uZXJTY3JlZW5Qb3NpdGlvbihnbG9iYWxUaGlzKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudFJlY3QgPSAoaXRlbSBpbnN0YW5jZW9mIENvbXBvbmVudEl0ZW0pID8gaXRlbS5nZXRPdXRlckJvdW5kaW5nQ2xpZW50UmVjdCgpIDogaXRlbS5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIHdpbmRvdyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBpbm5lclNjcmVlbi5sZWZ0ICsgY2xpZW50UmVjdC5sZWZ0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRvcDogaW5uZXJTY3JlZW4udG9wICsgY2xpZW50UmVjdC50b3AsXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGNsaWVudFJlY3Qud2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBjbGllbnRSZWN0LmhlaWdodCxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1Db25maWcgPSBpdGVtLnRvQ29uZmlnKCk7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLnBhcmVudD8uY29udGVudEl0ZW1zLmluY2x1ZGVzKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIVJlc29sdmVkUm9vdEl0ZW1Db25maWcuaXNSb290SXRlbUNvbmZpZyhpdGVtQ29uZmlnKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2kxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5Qb3BvdXRDYW5ub3RCZUNyZWF0ZWRXaXRoR3JvdW5kSXRlbUNvbmZpZ119YCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVQb3BvdXRGcm9tSXRlbUNvbmZpZyhpdGVtQ29uZmlnLCB3aW5kb3csIHBhcmVudElkLCBkb2NrLmluZGV4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBiZWdpblZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZygpOiB2b2lkIHtcclxuICAgICAgICBpZiAoKyt0aGlzLl92aXJ0dWFsU2l6ZWRDb250YWluZXJBZGRpbmdCZWdpbkNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZpcnR1YWxTaXplZENvbnRhaW5lcnMubGVuZ3RoID0gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgYWRkVmlydHVhbFNpemVkQ29udGFpbmVyKGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdmlydHVhbFNpemVkQ29udGFpbmVycy5wdXNoKGNvbnRhaW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZW5kVmlydHVhbFNpemVkQ29udGFpbmVyQWRkaW5nKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICgtLXRoaXMuX3ZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZ0JlZ2luQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLl92aXJ0dWFsU2l6ZWRDb250YWluZXJzLmxlbmd0aDtcclxuICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJlQmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudChjb3VudCk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl92aXJ0dWFsU2l6ZWRDb250YWluZXJzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5ub3RpZnlWaXJ0dWFsUmVjdGluZ1JlcXVpcmVkKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVBZnRlclZpcnR1YWxSZWN0aW5nRXZlbnQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZpcnR1YWxTaXplZENvbnRhaW5lcnMubGVuZ3RoID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBmaXJlQmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudChjb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuYmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudChjb3VudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGZpcmVBZnRlclZpcnR1YWxSZWN0aW5nRXZlbnQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuYWZ0ZXJWaXJ0dWFsUmVjdGluZ0V2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5hZnRlclZpcnR1YWxSZWN0aW5nRXZlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVQb3BvdXRGcm9tSXRlbUNvbmZpZyhyb290SXRlbUNvbmZpZzogUmVzb2x2ZWRSb290SXRlbUNvbmZpZyxcclxuICAgICAgICB3aW5kb3c6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvdyxcclxuICAgICAgICBwYXJlbnRJZDogc3RyaW5nIHwgbnVsbCxcclxuICAgICAgICBpbmRleEluUGFyZW50OiBudW1iZXIgfCBudWxsXHJcbiAgICApIHtcclxuICAgICAgICBjb25zdCBsYXlvdXRDb25maWcgPSB0aGlzLnRvQ29uZmlnKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHBvcG91dExheW91dENvbmZpZzogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcgPSB7XHJcbiAgICAgICAgICAgIHJvb3Q6IHJvb3RJdGVtQ29uZmlnLFxyXG4gICAgICAgICAgICBvcGVuUG9wb3V0czogW10sXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiBsYXlvdXRDb25maWcuc2V0dGluZ3MsXHJcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IGxheW91dENvbmZpZy5kaW1lbnNpb25zLFxyXG4gICAgICAgICAgICBoZWFkZXI6IGxheW91dENvbmZpZy5oZWFkZXIsXHJcbiAgICAgICAgICAgIHdpbmRvdyxcclxuICAgICAgICAgICAgcGFyZW50SWQsXHJcbiAgICAgICAgICAgIGluZGV4SW5QYXJlbnQsXHJcbiAgICAgICAgICAgIHJlc29sdmVkOiB0cnVlLFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUG9wb3V0RnJvbVBvcG91dExheW91dENvbmZpZyhwb3BvdXRMYXlvdXRDb25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNyZWF0ZVBvcG91dEZyb21Qb3BvdXRMYXlvdXRDb25maWcoY29uZmlnOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyk6IEJyb3dzZXJQb3BvdXQge1xyXG4gICAgICAgIC8vIElmIHRoaXMgaXMgYWxyZWFkeSBhIHBvcG91dCwgbGV0IHRoZSBwYXJlbnQgbGF5b3V0IG1hbmFnZXIgaGFuZGxlIHRoZSBuZXcgb25lLlxyXG4gICAgICAgIGlmICh0aGlzLl9wYXJlbnQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudC5jcmVhdGVQb3BvdXRGcm9tUG9wb3V0TGF5b3V0Q29uZmlnKGNvbmZpZyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjb25maWdXaW5kb3cgPSBjb25maWcud2luZG93O1xyXG4gICAgICAgIGNvbnN0IGluaXRpYWxXaW5kb3c6IFJlY3QgPSB7XHJcbiAgICAgICAgICAgIGxlZnQ6IGNvbmZpZ1dpbmRvdy5sZWZ0ID8/IChnbG9iYWxUaGlzLnNjcmVlblggfHwgZ2xvYmFsVGhpcy5zY3JlZW5MZWZ0ICsgMjApLFxyXG4gICAgICAgICAgICB0b3A6IGNvbmZpZ1dpbmRvdy50b3AgPz8gKGdsb2JhbFRoaXMuc2NyZWVuWSB8fCBnbG9iYWxUaGlzLnNjcmVlblRvcCArIDIwKSxcclxuICAgICAgICAgICAgd2lkdGg6IGNvbmZpZ1dpbmRvdy53aWR0aCA/PyA1MDAsXHJcbiAgICAgICAgICAgIGhlaWdodDogY29uZmlnV2luZG93LmhlaWdodCA/PyAzMDksXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgYnJvd3NlclBvcG91dCA9IG5ldyBCcm93c2VyUG9wb3V0KGNvbmZpZywgaW5pdGlhbFdpbmRvdywgdGhpcyk7XHJcblxyXG4gICAgICAgIGJyb3dzZXJQb3BvdXQub24oJ2luaXRpYWxpc2VkJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBsbSA9IGJyb3dzZXJQb3BvdXQuZ2V0R2xJbnN0YW5jZSgpO1xyXG5cclxuICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIHBvcG91dCB3aGVuIHRoZSBsYXN0IGNvbXBvbmVudCBpdGVtIGlzIGRlc3Ryb3llZC5cclxuICAgICAgICAgICAgY29uc3QgZGVzdHJveUlmRW1wdHkgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWxtLmlzRHJhZ2dpbmcgJiYgbG0uZ3JvdW5kSXRlbT8uZ2V0QWxsQ29tcG9uZW50SXRlbXMoKT8ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJvd3NlclBvcG91dC5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgbG0ub24oJ2l0ZW1Ecm9wcGVkJywgZGVzdHJveUlmRW1wdHkpO1xyXG4gICAgICAgICAgICBsbS5vbignaXRlbURlc3Ryb3llZCcsIGRlc3Ryb3lJZkVtcHR5KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnd2luZG93T3BlbmVkJywgYnJvd3NlclBvcG91dCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGJyb3dzZXJQb3BvdXQub24oJ2Nsb3NlZCcsICgpID0+IHRoaXMucmVjb25jaWxlUG9wb3V0V2luZG93cygpKTtcclxuXHJcbiAgICAgICAgdGhpcy5fb3BlblBvcG91dHMucHVzaChicm93c2VyUG9wb3V0KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0Q29uZmlnLnNldHRpbmdzLmNsb3NlUG9wb3V0c09uVW5sb2FkICYmICF0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRMaXN0ZW5pbmcpIHtcclxuICAgICAgICAgICAgZ2xvYmFsVGhpcy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCB0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRMaXN0ZW5pbmcgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGJyb3dzZXJQb3BvdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbG9zZXMgYWxsIE9wZW4gUG9wb3V0c1xyXG4gICAgICogQXBwbGljYXRpb25zIGNhbiBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gYSBwYWdlIGlzIHVubG9hZGVkIHRvIHJlbW92ZSBpdHMgb3BlbiBwb3BvdXRzXHJcbiAgICAgKi9cclxuXHJcbiAgICBjbG9zZUFsbE9wZW5Qb3BvdXRzKHByZXZlbnRQb3BJbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9vcGVuUG9wb3V0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLl9vcGVuUG9wb3V0c1tpXS5jbG9zZShwcmV2ZW50UG9wSW4pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fb3BlblBvcG91dHMubGVuZ3RoID0gMDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3dpbmRvd0JlZm9yZVVubG9hZExpc3RlbmluZykge1xyXG4gICAgICAgICAgICBnbG9iYWxUaGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIHRoaXMuX3dpbmRvd0JlZm9yZVVubG9hZExpc3RlbmVyKTtcclxuICAgICAgICAgICAgdGhpcy5fd2luZG93QmVmb3JlVW5sb2FkTGlzdGVuaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXR0YWNoZXMgRHJhZ0xpc3RlbmVyIHRvIGFueSBnaXZlbiBET00gZWxlbWVudFxyXG4gICAgICogYW5kIHR1cm5zIGl0IGludG8gYSB3YXkgb2YgY3JlYXRpbmcgbmV3IENvbXBvbmVudEl0ZW1zXHJcbiAgICAgKiBieSAnZHJhZ2dpbmcnIHRoZSBET00gZWxlbWVudCBpbnRvIHRoZSBsYXlvdXRcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBIVE1MIGVsZW1lbnQgd2hpY2ggd2lsbCBiZSBsaXN0ZW5lZCB0byBmb3IgY29tbWVuY2VtZW50IG9mIGRyYWcuXHJcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50VHlwZU9ySXRlbUNvbmZpZ0NhbGxiYWNrIC0gVHlwZSBvZiBjb21wb25lbnQgdG8gYmUgY3JlYXRlZCwgb3IgYSBjYWxsYmFjayB3aGljaCB3aWxsIHByb3ZpZGUgdGhlIEl0ZW1Db25maWdcclxuICAgICAqIHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBjb21wb25lbnQuXHJcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50U3RhdGUgLSBPcHRpb25hbCBpbml0aWFsIHN0YXRlIG9mIGNvbXBvbmVudC4gIFRoaXMgd2lsbCBiZSBpZ25vcmVkIGlmIGNvbXBvbmVudFR5cGVPckZ0biBpcyBhIGZ1bmN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIGFuIG9wYXF1ZSBvYmplY3QgdGhhdCBpZGVudGlmaWVzIHRoZSBET00gZWxlbWVudFxyXG5cdCAqICAgICAgICAgIGFuZCB0aGUgYXR0YWNoZWQgaXRlbUNvbmZpZy4gVGhpcyBjYW4gYmUgdXNlZCBpblxyXG5cdCAqICAgICAgICAgIHJlbW92ZURyYWdTb3VyY2UoKSBsYXRlciB0byBnZXQgcmlkIG9mIHRoZSBkcmFnIGxpc3RlbmVycy5cclxuICAgICAqL1xyXG4gICAgbmV3RHJhZ1NvdXJjZShlbGVtZW50OiBIVE1MRWxlbWVudCwgaXRlbUNvbmZpZ0NhbGxiYWNrOiAoKSA9PiAoRHJhZ1NvdXJjZS5Db21wb25lbnRJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZykpOiBEcmFnU291cmNlO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIHdpbGwgYmUgcmVwbGFjZWQgaW4gdmVyc2lvbiAzIHdpdGggbmV3RHJhZ1NvdXJjZShlbGVtZW50OiBIVE1MRWxlbWVudCwgaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZykgKi9cclxuICAgIG5ld0RyYWdTb3VyY2UoZWxlbWVudDogSFRNTEVsZW1lbnQsIGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSwgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsIHRpdGxlPzogSnNvblZhbHVlLCBpZD86IHN0cmluZyk6IERyYWdTb3VyY2U7XHJcbiAgICBuZXdEcmFnU291cmNlKGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxyXG4gICAgICAgIGNvbXBvbmVudFR5cGVPckl0ZW1Db25maWdDYWxsYmFjazogSnNvblZhbHVlIHwgKCgpID0+IChEcmFnU291cmNlLkNvbXBvbmVudEl0ZW1Db25maWcgfCBDb21wb25lbnRJdGVtQ29uZmlnKSksXHJcbiAgICAgICAgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsXHJcbiAgICAgICAgdGl0bGU/OiBzdHJpbmcsXHJcbiAgICAgICAgaWQ/OiBzdHJpbmcsXHJcbiAgICApOiBEcmFnU291cmNlIHtcclxuICAgICAgICBjb25zdCBkcmFnU291cmNlID0gbmV3IERyYWdTb3VyY2UodGhpcywgZWxlbWVudCwgW10sIGNvbXBvbmVudFR5cGVPckl0ZW1Db25maWdDYWxsYmFjaywgY29tcG9uZW50U3RhdGUsIHRpdGxlLCBpZCk7XHJcbiAgICAgICAgdGhpcy5fZHJhZ1NvdXJjZXMucHVzaChkcmFnU291cmNlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRyYWdTb3VyY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcblx0ICogUmVtb3ZlcyBhIERyYWdMaXN0ZW5lciBhZGRlZCBieSBjcmVhdGVEcmFnU291cmNlKCkgc28gdGhlIGNvcnJlc3BvbmRpbmdcclxuXHQgKiBET00gZWxlbWVudCBpcyBub3QgYSBkcmFnIHNvdXJjZSBhbnkgbW9yZS5cclxuXHQgKi9cclxuXHRyZW1vdmVEcmFnU291cmNlKGRyYWdTb3VyY2U6IERyYWdTb3VyY2UpOiB2b2lkIHtcclxuXHRcdHJlbW92ZUZyb21BcnJheShkcmFnU291cmNlLCB0aGlzLl9kcmFnU291cmNlcyApO1xyXG5cdFx0ZHJhZ1NvdXJjZS5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBzdGFydEV4dGVybmFsQ29tcG9uZW50RHJhZyhwYXJlbnQ6IERyYWdBY3Rpb24pIHtcclxuICAgICAgICBEcmFnQWN0aW9uLnNwYXduKHRoaXMsIHBhcmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc3RhcnRDb21wb25lbnREcmFnKHg6IG51bWJlciwgeTogbnVtYmVyLCBkcmFnTGlzdGVuZXI6IERyYWdMaXN0ZW5lciwgY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGlzTGFzdCA9IGNvbXBvbmVudEl0ZW0uZmluZEFuY2VzdG9yV2l0aFNpYmxpbmdzKCkgPT09IG51bGw7XHJcblxyXG4gICAgICAgIGNvbnN0IGFsbG93UG9wb3V0ID1cclxuICAgICAgICAgICAgY29tcG9uZW50SXRlbS5pc0Nsb3NhYmxlICYmXHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0Q29uZmlnLnNldHRpbmdzLmRyYWdUb05ld1dpbmRvdyAmJlxyXG4gICAgICAgICAgICAodGhpcy5wYXJlbnQgPT09IG51bGwgfHwgIWlzTGFzdCk7ICAgICAgICAgICAgICAgICAgLy8gUG9wb3V0IGlzIGRlc3Ryb3llZCB3aGVuIGxhc3QgY29tcG9uZW50IGlzIHJlbW92ZWQsIGRyYWcgdG8gbmV3IHBvcG91dCBtYWtlcyBubyBzZW5zZVxyXG5cclxuICAgICAgICBjb25zdCBjYW5Nb3ZlQmV0d2VlbldpbmRvd3MgPVxyXG4gICAgICAgICAgICBjb21wb25lbnRJdGVtLmlzQ2xvc2FibGUgJiZcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRDb25maWcuc2V0dGluZ3MuZHJhZ0JldHdlZW5XaW5kb3dzICYmXHJcbiAgICAgICAgICAgICh0aGlzLl9wYXJlbnQgPz8gdGhpcykuX29wZW5Qb3BvdXRzLmxlbmd0aCA+IDA7ICAgICAvLyBBcmUgdGhlcmUgZXZlbiBtdWx0aXBsZSB3aW5kb3dzP1xyXG5cclxuICAgICAgICAvLyBDYW5jZWwgdGhlIGRyYWcgaWYgdGhpcyBpcyB0aGUgbGFzdCBjb21wb25lbnQgYW5kIHRoZXJlIGFyZSBubyB2YWxpZCBleHRlcm5hbCB0YXJnZXRzLlxyXG4gICAgICAgIC8vIEluIHRoaXMgY2FzZSwgb25seSB0aGUgY3VycmVudCBsYXlvdXQgY29uZmlndXJhdGlvbiBpcyBwb3NzaWJsZSwgc28gdGhlcmUgaXMgbm8gcG9pbnQgaW4gZHJhZ2dpbmcuXHJcbiAgICAgICAgaWYgKGlzTGFzdCAmJiAhYWxsb3dQb3BvdXQgJiYgIWNhbk1vdmVCZXR3ZWVuV2luZG93cykge1xyXG4gICAgICAgICAgICBkcmFnTGlzdGVuZXIuY2FuY2VsRHJhZygpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBhY3Rpb24gPSBEcmFnQWN0aW9uLnN0YXJ0KHRoaXMsIGRyYWdMaXN0ZW5lciwgY29tcG9uZW50SXRlbSwgeCwgeSwgYWxsb3dQb3BvdXQpO1xyXG5cclxuICAgICAgICBpZiAoY2FuTW92ZUJldHdlZW5XaW5kb3dzKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGxtIG9mIHRoaXMuaW5zdGFuY2VzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobG0gIT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBsbS5zdGFydEV4dGVybmFsQ29tcG9uZW50RHJhZyhhY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGhpZGVEcm9wVGFyZ2V0SW5kaWNhdG9yKCkge1xyXG4gICAgICAgIHRoaXMudGFiRHJvcFBsYWNlaG9sZGVyLnJlbW92ZSgpO1xyXG4gICAgICAgIHRoaXMuZHJvcFRhcmdldEluZGljYXRvcj8uaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvZ3JhbW1hdGljYWxseSBmb2N1c2VzIGFuIGl0ZW0uIFRoaXMgZm9jdXNlcyB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCBpdGVtXHJcbiAgICAgKiBhbmQgdGhlIGl0ZW0gZW1pdHMgYSBmb2N1cyBldmVudFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpdGVtIC0gVGhlIGNvbXBvbmVudCBpdGVtIHRvIGJlIGZvY3VzZWRcclxuICAgICAqIEBwYXJhbSBzdXBwcmVzc0V2ZW50IC0gV2hldGhlciB0byBlbWl0IGZvY3VzIGV2ZW50XHJcbiAgICAgKi9cclxuICAgIGZvY3VzQ29tcG9uZW50KGl0ZW06IENvbXBvbmVudEl0ZW0sIHN1cHByZXNzRXZlbnQgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIGl0ZW0uZm9jdXMoc3VwcHJlc3NFdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9ncmFtbWF0aWNhbGx5IGJsdXJzIChkZWZvY3VzZXMpIHRoZSBjdXJyZW50bHkgZm9jdXNlZCBjb21wb25lbnQuXHJcbiAgICAgKiBJZiBhIGNvbXBvbmVudCBpdGVtIGlzIGZvY3VzZWQsIHRoZW4gaXQgaXMgYmx1cnJlZCBhbmQgYW5kIHRoZSBpdGVtIGVtaXRzIGEgYmx1ciBldmVudFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpdGVtIC0gVGhlIGNvbXBvbmVudCBpdGVtIHRvIGJlIGJsdXJyZWRcclxuICAgICAqIEBwYXJhbSBzdXBwcmVzc0V2ZW50IC0gV2hldGhlciB0byBlbWl0IGJsdXIgZXZlbnRcclxuICAgICAqL1xyXG4gICAgY2xlYXJDb21wb25lbnRGb2N1cyhzdXBwcmVzc0V2ZW50ID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldEZvY3VzZWRDb21wb25lbnRJdGVtKHVuZGVmaW5lZCwgc3VwcHJlc3NFdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9ncmFtbWF0aWNhbGx5IGZvY3VzZXMgYSBjb21wb25lbnQgaXRlbSBvciByZW1vdmVzIGZvY3VzIChibHVycykgZnJvbSBhbiBleGlzdGluZyBmb2N1c2VkIGNvbXBvbmVudCBpdGVtLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpdGVtIC0gSWYgZGVmaW5lZCwgc3BlY2lmaWVzIHRoZSBjb21wb25lbnQgaXRlbSB0byBiZSBnaXZlbiBmb2N1cy4gIElmIHVuZGVmaW5lZCwgY2xlYXIgY29tcG9uZW50IGZvY3VzLlxyXG4gICAgICogQHBhcmFtIHN1cHByZXNzRXZlbnRzIC0gV2hldGhlciB0byBlbWl0IGZvY3VzIGFuZCBibHVyIGV2ZW50c1xyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHNldEZvY3VzZWRDb21wb25lbnRJdGVtKGl0ZW06IENvbXBvbmVudEl0ZW0gfCB1bmRlZmluZWQsIHN1cHByZXNzRXZlbnRzID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICBpZiAoaXRlbSAhPT0gdGhpcy5fZm9jdXNlZENvbXBvbmVudEl0ZW0pIHtcclxuXHJcbiAgICAgICAgICAgIGxldCBuZXdGb2N1c2VkUGFyZW50SXRlbTogQ29tcG9uZW50UGFyZW50YWJsZUl0ZW0gfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGlmIChpdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIG5ld0ZvY3VzZWRQYXJlbnRJdGVtID09PSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBuZXdGb2N1c2VkUGFyZW50SXRlbSA9IGl0ZW0ucGFyZW50SXRlbTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2ZvY3VzZWRDb21wb25lbnRJdGVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9sZEZvY3VzZWRJdGVtID0gdGhpcy5fZm9jdXNlZENvbXBvbmVudEl0ZW07XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c2VkQ29tcG9uZW50SXRlbSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIG9sZEZvY3VzZWRJdGVtLnNldEJsdXJyZWQoc3VwcHJlc3NFdmVudHMpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2xkRm9jdXNlZFBhcmVudEl0ZW0gPSBvbGRGb2N1c2VkSXRlbS5wYXJlbnRJdGVtO1xyXG4gICAgICAgICAgICAgICAgaWYgKG5ld0ZvY3VzZWRQYXJlbnRJdGVtID09PSBvbGRGb2N1c2VkUGFyZW50SXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld0ZvY3VzZWRQYXJlbnRJdGVtID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBvbGRGb2N1c2VkUGFyZW50SXRlbS5zZXRGb2N1c2VkVmFsdWUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoaXRlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c2VkQ29tcG9uZW50SXRlbSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICBpdGVtLnNldEZvY3VzZWQoc3VwcHJlc3NFdmVudHMpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG5ld0ZvY3VzZWRQYXJlbnRJdGVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXdGb2N1c2VkUGFyZW50SXRlbS5zZXRGb2N1c2VkVmFsdWUodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVDb250ZW50SXRlbUZyb21Db25maWcoY29uZmlnOiBSZXNvbHZlZEl0ZW1Db25maWcsIHBhcmVudDogQ29udGVudEl0ZW0pOiBDb250ZW50SXRlbSB7XHJcbiAgICAgICAgc3dpdGNoIChjb25maWcudHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmdyb3VuZDogdGhyb3cgbmV3IEFzc2VydEVycm9yKCdMTUNDSUZDNjg4NzEnKTtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6IHJldHVybiBuZXcgUm93T3JDb2x1bW4oZmFsc2UsIHRoaXMsIGNvbmZpZyBhcyBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZywgcGFyZW50KTtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46IHJldHVybiBuZXcgUm93T3JDb2x1bW4odHJ1ZSwgdGhpcywgY29uZmlnIGFzIFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLCBwYXJlbnQpO1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnN0YWNrOiByZXR1cm4gbmV3IFN0YWNrKHRoaXMsIGNvbmZpZyBhcyBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZywgcGFyZW50KTtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb21wb25lbnQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudEl0ZW0odGhpcywgY29uZmlnIGFzIFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZywgcGFyZW50IGFzIFN0YWNrKTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlYWNoYWJsZUNhc2VFcnJvcignQ0NDOTEzNTY0JywgY29uZmlnLnR5cGUsICdJbnZhbGlkIENvbmZpZyBJdGVtIHR5cGUgc3BlY2lmaWVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSBzdGFjayBjb21wb25lbnQuXHJcbiAgICAgKiBTdGFjayB3aWxsIGxvb2sgYWZ0ZXIgZG9ja2luZyBwcm9jZXNzaW5nIGFzc29jaWF0ZWQgd2l0aCBtYXhpbWlzZS9taW5pbWlzZVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKiovXHJcbiAgICBzZXRNYXhpbWlzZWRTdGFjayhzdGFjazogU3RhY2sgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICBpZiAoc3RhY2sgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fbWF4aW1pc2VkU3RhY2sgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzTWluaW1pc2VNYXhpbWlzZWRTdGFjaygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHN0YWNrICE9PSB0aGlzLl9tYXhpbWlzZWRTdGFjaykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21heGltaXNlZFN0YWNrICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NNaW5pbWlzZU1heGltaXNlZFN0YWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzTWF4aW1pc2VTdGFjayhzdGFjayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tNaW5pbWlzZU1heGltaXNlZFN0YWNrKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9tYXhpbWlzZWRTdGFjayAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21heGltaXNlZFN0YWNrLm1pbmltaXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHNob3dBbGxBY3RpdmVDb250ZW50SXRlbXMoKSB3YXMgY2FsbGVkIGZyb20gQ29udGVudEl0ZW0uc2hvdygpLiAgTm90IHN1cmUgd2hhdCBpdHMgcHVycG9zZSB3YXMgc28gaGF2ZSBjb21tZW50ZWQgb3V0XHJcbiAgICAvLyBFdmVyeXRoaW5nIHNlZW1zIHRvIHdvcmsgb2sgd2l0aG91dCB0aGlzLiAgSGF2ZSBsZWZ0IGNvbW1lbnRlZCBjb2RlIGp1c3QgaW4gY2FzZSB0aGVyZSB3YXMgYSByZWFzb24gZm9yIGl0IGJlY29tZXNcclxuICAgIC8vIGFwcGFyZW50XHJcblxyXG4gICAgLy8gLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgLy8gc2hvd0FsbEFjdGl2ZUNvbnRlbnRJdGVtcygpOiB2b2lkIHtcclxuICAgIC8vICAgICBjb25zdCBhbGxTdGFja3MgPSB0aGlzLmdldEFsbFN0YWNrcygpO1xyXG5cclxuICAgIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbFN0YWNrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgLy8gICAgICAgICBjb25zdCBzdGFjayA9IGFsbFN0YWNrc1tpXTtcclxuICAgIC8vICAgICAgICAgY29uc3QgYWN0aXZlQ29udGVudEl0ZW0gPSBzdGFjay5nZXRBY3RpdmVDb21wb25lbnRJdGVtKCk7XHJcblxyXG4gICAgLy8gICAgICAgICBpZiAoYWN0aXZlQ29udGVudEl0ZW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgLy8gICAgICAgICAgICAgaWYgKCEoYWN0aXZlQ29udGVudEl0ZW0gaW5zdGFuY2VvZiBDb21wb25lbnRJdGVtKSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignTE1TQUFDSVMyMjI5OCcpO1xyXG4gICAgLy8gICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBhY3RpdmVDb250ZW50SXRlbS5jb250YWluZXIuc2hvdygpO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIGhpZGVBbGxBY3RpdmVDb250ZW50SXRlbXMoKSB3YXMgY2FsbGVkIGZyb20gQ29udGVudEl0ZW0uaGlkZSgpLiAgTm90IHN1cmUgd2hhdCBpdHMgcHVycG9zZSB3YXMgc28gaGF2ZSBjb21tZW50ZWQgb3V0XHJcbiAgICAvLyBFdmVyeXRoaW5nIHNlZW1zIHRvIHdvcmsgb2sgd2l0aG91dCB0aGlzLiAgSGF2ZSBsZWZ0IGNvbW1lbnRlZCBjb2RlIGp1c3QgaW4gY2FzZSB0aGVyZSB3YXMgYSByZWFzb24gZm9yIGl0IGJlY29tZXNcclxuICAgIC8vIGFwcGFyZW50XHJcblxyXG4gICAgLy8gLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgLy8gaGlkZUFsbEFjdGl2ZUNvbnRlbnRJdGVtcygpOiB2b2lkIHtcclxuICAgIC8vICAgICBjb25zdCBhbGxTdGFja3MgPSB0aGlzLmdldEFsbFN0YWNrcygpO1xyXG5cclxuICAgIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbFN0YWNrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgLy8gICAgICAgICBjb25zdCBzdGFjayA9IGFsbFN0YWNrc1tpXTtcclxuICAgIC8vICAgICAgICAgY29uc3QgYWN0aXZlQ29udGVudEl0ZW0gPSBzdGFjay5nZXRBY3RpdmVDb21wb25lbnRJdGVtKCk7XHJcblxyXG4gICAgLy8gICAgICAgICBpZiAoYWN0aXZlQ29udGVudEl0ZW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgLy8gICAgICAgICAgICAgaWYgKCEoYWN0aXZlQ29udGVudEl0ZW0gaW5zdGFuY2VvZiBDb21wb25lbnRJdGVtKSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignTE1TQUFDSUgyMjI5OCcpO1xyXG4gICAgLy8gICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBhY3RpdmVDb250ZW50SXRlbS5jb250YWluZXIuaGlkZSgpO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgY2xlYW51cEJlZm9yZU1heGltaXNlZFN0YWNrRGVzdHJveWVkKGV2ZW50OiBFdmVudEVtaXR0ZXIuQnViYmxpbmdFdmVudCkge1xyXG5cdFx0aWYgKHRoaXMuX21heGltaXNlZFN0YWNrICE9PSBudWxsICYmIHRoaXMuX21heGltaXNlZFN0YWNrID09PSBldmVudC50YXJnZXQpIHtcclxuXHRcdFx0dGhpcy5fbWF4aW1pc2VkU3RhY2sub2ZmKCdiZWZvcmVJdGVtRGVzdHJveWVkJywgdGhpcy5fbWF4aW1pc2VkU3RhY2tCZWZvcmVEZXN0cm95ZWRMaXN0ZW5lcik7XHJcblx0XHRcdHRoaXMuX21heGltaXNlZFN0YWNrID0gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgYXJvdW5kIHNhbmRib3hlZCBpZnJhbWUgcmVzdHJpY3Rpb25zLlxyXG4gICAgICogSWYgJ2FsbG93LXRvcC1uYXZpZ2F0aW9uJyBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBpZnJhbWUncyAnc2FuZGJveCcgYXR0cmlidXRlXHJcbiAgICAgKiAoYXMgaXMgdGhlIGNhc2Ugd2l0aCBjb2RlcGVucykgdGhlIHBhcmVudCB3aW5kb3cgaXMgZm9yYmlkZGVuIGZyb20gY2FsbGluZyBjZXJ0YWluXHJcbiAgICAgKiBtZXRob2RzIG9uIHRoZSBjaGlsZCwgc3VjaCBhcyB3aW5kb3cuY2xvc2UoKSBvciBzZXR0aW5nIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBwcmV2ZW50ZWQgR29sZGVuTGF5b3V0IHBvcG91dHMgZnJvbSBwb3BwaW5nIGluIGluIGNvZGVwZW5zLiBUaGUgZml4IGlzIHRvIGNhbGxcclxuICAgICAqIF8kY2xvc2VXaW5kb3cgb24gdGhlIGNoaWxkIHdpbmRvdydzIGdsIGluc3RhbmNlIHdoaWNoIChhZnRlciBhIHRpbWVvdXQgdG8gZGlzY29ubmVjdFxyXG4gICAgICogdGhlIGludm9raW5nIG1ldGhvZCBmcm9tIHRoZSBjbG9zZSBjYWxsKSBjbG9zZXMgaXRzZWxmLlxyXG4gICAgICpcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBjbG9zZVdpbmRvdygpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWxUaGlzLnNldFRpbWVvdXQoKCkgPT4gZ2xvYmFsVGhpcy5jbG9zZSgpLCAxKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBnZXRBcmVhKHg6IG51bWJlciwgeTogbnVtYmVyKTogQ29udGVudEl0ZW0uQXJlYSB8IG51bGwge1xyXG4gICAgICAgIGxldCBtYXRjaGluZ0FyZWE6IENvbnRlbnRJdGVtLkFyZWEgfCBudWxsID0gbnVsbDtcclxuICAgICAgICBsZXQgc21hbGxlc3RTdXJmYWNlID0gSW5maW5pdHk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5faXRlbUFyZWFzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFyZWEgPSB0aGlzLl9pdGVtQXJlYXNbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICB4ID49IGFyZWEueDEgJiZcclxuICAgICAgICAgICAgICAgIHggPCBhcmVhLngyICYmIC8vIHgyIGlzIG5vdCBpbmNsdWRlZCBpbiBhcmVhXHJcbiAgICAgICAgICAgICAgICB5ID49IGFyZWEueTEgJiZcclxuICAgICAgICAgICAgICAgIHkgPCBhcmVhLnkyICYmIC8vIHkyIGlzIG5vdCBpbmNsdWRlZCBpbiBhcmVhXHJcbiAgICAgICAgICAgICAgICBzbWFsbGVzdFN1cmZhY2UgPiBhcmVhLnN1cmZhY2VcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICBzbWFsbGVzdFN1cmZhY2UgPSBhcmVhLnN1cmZhY2U7XHJcbiAgICAgICAgICAgICAgICBtYXRjaGluZ0FyZWEgPSBhcmVhO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbWF0Y2hpbmdBcmVhO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNhbGN1bGF0ZUl0ZW1BcmVhcygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBhbGxDb250ZW50SXRlbXMgPSB0aGlzLmdldEFsbENvbnRlbnRJdGVtcygpO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIHRoZSBsYXN0IGl0ZW0gaXMgZHJhZ2dlZCBvdXQsIGhpZ2hsaWdodCB0aGUgZW50aXJlIGNvbnRhaW5lciBzaXplIHRvXHJcbiAgICAgICAgICogYWxsb3cgdG8gcmUtZHJvcCBpdC4gdGhpcy5ncm91bmQuY29udGVudGlJdGVtcy5sZW5ndGggPT09IDAgYXQgdGhpcyBwb2ludFxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogRG9uJ3QgaW5jbHVkZSBncm91bmQgaW50byB0aGUgcG9zc2libGUgZHJvcCBhcmVhcyB0aG91Z2ggb3RoZXJ3aXNlIHNpbmNlIGl0XHJcbiAgICAgICAgICogd2lsbCB1c2VkIGZvciBldmVyeSBnYXAgaW4gdGhlIGxheW91dCwgZS5nLiBzcGxpdHRlcnNcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBncm91bmRJdGVtID0gdGhpcy5fZ3JvdW5kSXRlbTtcclxuICAgICAgICBpZiAoZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNQ0lBUjQ0MzY1Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGFsbENvbnRlbnRJdGVtcy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIC8vIE5vIHJvb3QgQ29udGVudEl0ZW0gKGp1c3QgR3JvdW5kIENvbnRlbnRJdGVtKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdW5kQXJlYSA9IGdyb3VuZEl0ZW0uZ2V0RWxlbWVudEFyZWEoKTtcclxuICAgICAgICAgICAgICAgIGlmIChncm91bmRBcmVhID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0xNQ0lBUkE0NDM2NScpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2l0ZW1BcmVhcyA9IFtncm91bmRBcmVhXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChncm91bmRJdGVtLmNvbnRlbnRJdGVtc1swXS5pc1N0YWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgcm9vdCBpcyBTdGFjaywgdGhlbiBzcGxpdCBzdGFjayBhbmQgc2lkZXMgb2YgTGF5b3V0IGFyZSBzYW1lLCBzbyBza2lwIHNpZGVzXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXRlbUFyZWFzID0gW107XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHNpZGVzIG9mIGxheW91dFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2l0ZW1BcmVhcyA9IGdyb3VuZEl0ZW0uY3JlYXRlU2lkZUFyZWFzKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxDb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IGFsbENvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoQ29udGVudEl0ZW0uaXNTdGFjayhzdGFjaykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJlYSA9IHN0YWNrLmdldEFyZWEoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmVhID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2l0ZW1BcmVhcy5wdXNoKGFyZWEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2tDb250ZW50QXJlYURpbWVuc2lvbnMgPSBzdGFjay5jb250ZW50QXJlYURpbWVuc2lvbnM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tDb250ZW50QXJlYURpbWVuc2lvbnMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNQ0lBU0M0NTU5OScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWdobGlnaHRBcmVhID0gc3RhY2tDb250ZW50QXJlYURpbWVuc2lvbnMuaGVhZGVyLmhpZ2hsaWdodEFyZWFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXJmYWNlID0gKGhpZ2hsaWdodEFyZWEueDIgLSBoaWdobGlnaHRBcmVhLngxKSAqIChoaWdobGlnaHRBcmVhLnkyIC0gaGlnaGxpZ2h0QXJlYS55MSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlcjogQ29udGVudEl0ZW0uQXJlYSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDE6IGhpZ2hsaWdodEFyZWEueDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgyOiBoaWdobGlnaHRBcmVhLngyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MTogaGlnaGxpZ2h0QXJlYS55MSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTI6IGhpZ2hsaWdodEFyZWEueTIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtOiBzdGFjayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2l0ZW1BcmVhcy5wdXNoKGhlYWRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgYXMgcGFydCBvZiBsb2FkaW5nIGEgbmV3IGxheW91dCAoaW5jbHVkaW5nIGluaXRpYWwgaW5pdCgpKS5cclxuICAgICAqIENoZWNrcyB0byBzZWUgbGF5b3V0IGhhcyBhIG1heGltaXNlZCBpdGVtLiBJZiBzbywgaXQgbWF4aW1pc2VzIHRoYXQgaXRlbS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNoZWNrTG9hZGVkTGF5b3V0TWF4aW1pc2VJdGVtKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1DTExNSTQzNDMyJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgY29uZmlnTWF4aW1pc2VkSXRlbXMgPSB0aGlzLl9ncm91bmRJdGVtLmdldENvbmZpZ01heGltaXNlZEl0ZW1zKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY29uZmlnTWF4aW1pc2VkSXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSBjb25maWdNYXhpbWlzZWRJdGVtc1swXTtcclxuICAgICAgICAgICAgICAgIGlmIChDb250ZW50SXRlbS5pc0NvbXBvbmVudEl0ZW0oaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IGl0ZW0ucGFyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFjayA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignTE1YTExNSTY5OTk5Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IHN0YWNrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghQ29udGVudEl0ZW0uaXNTdGFjayhpdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignTE1DTExNSTE5OTkzJyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ubWF4aW1pc2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHByb2Nlc3NNYXhpbWlzZVN0YWNrKHN0YWNrOiBTdGFjayk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX21heGltaXNlZFN0YWNrID0gc3RhY2s7XHJcbiAgICAgICAgc3RhY2sub24oJ2JlZm9yZUl0ZW1EZXN0cm95ZWQnLCB0aGlzLl9tYXhpbWlzZWRTdGFja0JlZm9yZURlc3Ryb3llZExpc3RlbmVyKTtcclxuICAgICAgICBzdGFjay5lbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5NYXhpbWlzZWQpO1xyXG4gICAgICAgIHN0YWNrLmVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIHRoaXMuX21heGltaXNlUGxhY2Vob2xkZXIpO1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1NWEkxOTk5MycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0uZWxlbWVudC5wcmVwZW5kKHN0YWNrLmVsZW1lbnQpO1xyXG4gICAgICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGdldEVsZW1lbnRXaWR0aEFuZEhlaWdodCh0aGlzLl9jb250YWluZXJFbGVtZW50KTtcclxuICAgICAgICAgICAgc2V0RWxlbWVudFdpZHRoKHN0YWNrLmVsZW1lbnQsIHdpZHRoKTtcclxuICAgICAgICAgICAgc2V0RWxlbWVudEhlaWdodChzdGFjay5lbGVtZW50LCBoZWlnaHQpO1xyXG4gICAgICAgICAgICBzdGFjay51cGRhdGVTaXplKHRydWUpO1xyXG4gICAgICAgICAgICBzdGFjay5mb2N1c0FjdGl2ZUNvbnRlbnRJdGVtKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX21heGltaXNlZFN0YWNrLmVtaXQoJ21heGltaXNlZCcpO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3N0YXRlQ2hhbmdlZCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHByb2Nlc3NNaW5pbWlzZU1heGltaXNlZFN0YWNrKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9tYXhpbWlzZWRTdGFjayA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignTE1NTVM3NDQyMicpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gdGhpcy5fbWF4aW1pc2VkU3RhY2s7XHJcbiAgICAgICAgICAgIGlmIChzdGFjay5wYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdMTU1JMTM2NjgnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHN0YWNrLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShEb21Db25zdGFudHMuQ2xhc3NOYW1lLk1heGltaXNlZCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhpbWlzZVBsYWNlaG9sZGVyLmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBzdGFjay5lbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21heGltaXNlUGxhY2Vob2xkZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJvb3RTaXplKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4aW1pc2VkU3RhY2sgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBzdGFjay5vZmYoJ2JlZm9yZUl0ZW1EZXN0cm95ZWQnLCB0aGlzLl9tYXhpbWlzZWRTdGFja0JlZm9yZURlc3Ryb3llZExpc3RlbmVyKTtcclxuICAgICAgICAgICAgICAgIHN0YWNrLmVtaXQoJ21pbmltaXNlZCcpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdzdGF0ZUNoYW5nZWQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0ZXJhdGVzIHRocm91Z2ggdGhlIGFycmF5IG9mIG9wZW4gcG9wb3V0IHdpbmRvd3MgYW5kIHJlbW92ZXMgdGhlIG9uZXNcclxuICAgICAqIHRoYXQgYXJlIGVmZmVjdGl2ZWx5IGNsb3NlZC4gVGhpcyBpcyBuZWNlc3NhcnkgZHVlIHRvIHRoZSBsYWNrIG9mIHJlbGlhYmx5XHJcbiAgICAgKiBsaXN0ZW5pbmcgZm9yIHdpbmRvdy5jbG9zZSAvIHVubG9hZCBldmVudHMgaW4gYSBjcm9zcyBicm93c2VyIGNvbXBhdGlibGUgZmFzaGlvbi5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHJlY29uY2lsZVBvcG91dFdpbmRvd3MoKSB7XHJcbiAgICAgICAgY29uc3Qgb3BlblBvcG91dHM6IEJyb3dzZXJQb3BvdXRbXSA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX29wZW5Qb3BvdXRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9vcGVuUG9wb3V0c1tpXS5nZXRXaW5kb3coKS5jbG9zZWQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBvcGVuUG9wb3V0cy5wdXNoKHRoaXMuX29wZW5Qb3BvdXRzW2ldKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnd2luZG93Q2xvc2VkJywgdGhpcy5fb3BlblBvcG91dHNbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fb3BlblBvcG91dHMubGVuZ3RoICE9PSBvcGVuUG9wb3V0cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5fb3BlblBvcG91dHMgPSBvcGVuUG9wb3V0cztcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdzdGF0ZUNoYW5nZWQnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIGZsYXR0ZW5lZCBhcnJheSBvZiBhbGwgY29udGVudCBpdGVtcyxcclxuICAgICAqIHJlZ2FyZGxlcyBvZiBsZXZlbCBvciB0eXBlXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRBbGxDb250ZW50SXRlbXMoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUdBQ0kxMzEzMCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ncm91bmRJdGVtLmdldEFsbENvbnRlbnRJdGVtcygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgU3Vid2luZG93cyAoaWYgdGhlcmUgYXJlIGFueSkuIFRocm93cyBhbiBlcnJvclxyXG4gICAgICogaWYgcG9wb3V0cyBhcmUgYmxvY2tlZC5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVN1YldpbmRvd3MoKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxheW91dENvbmZpZy5vcGVuUG9wb3V0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBwb3BvdXRDb25maWcgPSB0aGlzLmxheW91dENvbmZpZy5vcGVuUG9wb3V0c1tpXTtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVQb3BvdXRGcm9tUG9wb3V0TGF5b3V0Q29uZmlnKHBvcG91dENvbmZpZyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVib3VuY2VzIHJlc2l6ZSBldmVudHNcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUNvbnRhaW5lclJlc2l6ZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5yZXNpemVXaXRoQ29udGFpbmVyQXV0b21hdGljYWxseSkge1xyXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXNpemVXaXRoRGVib3VuY2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWJvdW5jZXMgcmVzaXplIGV2ZW50c1xyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcHJvY2Vzc1Jlc2l6ZVdpdGhEZWJvdW5jZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5yZXNpemVEZWJvdW5jZUV4dGVuZGVkV2hlblBvc3NpYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tDbGVhclJlc2l6ZVRpbWVvdXQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9yZXNpemVUaW1lb3V0SWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9yZXNpemVUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KFxyXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZVRpbWVvdXRJZCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luU2l6ZUludmFsaWRhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kU2l6ZUludmFsaWRhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzaXplRGVib3VuY2VJbnRlcnZhbCxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGVja0NsZWFyUmVzaXplVGltZW91dCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fcmVzaXplVGltZW91dElkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3Jlc2l6ZVRpbWVvdXRJZCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZVRpbWVvdXRJZCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXRlcm1pbmVzIHdoYXQgZWxlbWVudCB0aGUgbGF5b3V0IHdpbGwgYmUgY3JlYXRlZCBpblxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2V0Q29udGFpbmVyKCkge1xyXG4gICAgICAgIGNvbnN0IGJvZHlFbGVtZW50ID0gZG9jdW1lbnQuYm9keTtcclxuICAgICAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gdGhpcy5fY29udGFpbmVyRWxlbWVudCA/PyBib2R5RWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRhaW5lckVsZW1lbnQgPT09IGJvZHlFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzaXplV2l0aENvbnRhaW5lckF1dG9tYXRpY2FsbHkgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZG9jdW1lbnRFbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xyXG4gICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xyXG4gICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQuc3R5bGUubWFyZ2luID0gJzAnO1xyXG4gICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQuc3R5bGUucGFkZGluZyA9ICcwJztcclxuICAgICAgICAgICAgZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XHJcbiAgICAgICAgICAgIGJvZHlFbGVtZW50LnN0eWxlLmhlaWdodCA9ICcxMDAlJztcclxuICAgICAgICAgICAgYm9keUVsZW1lbnQuc3R5bGUubWFyZ2luID0gJzAnO1xyXG4gICAgICAgICAgICBib2R5RWxlbWVudC5zdHlsZS5wYWRkaW5nID0gJzAnO1xyXG4gICAgICAgICAgICBib2R5RWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyRWxlbWVudCA9IGNvbnRhaW5lckVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgd2hlbiB0aGUgd2luZG93IGlzIGNsb3NlZCBvciB0aGUgdXNlciBuYXZpZ2F0ZXMgYXdheVxyXG4gICAgICogZnJvbSB0aGUgcGFnZVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKiBAZGVwcmVjYXRlZCB0byBiZSByZW1vdmVkIGluIHZlcnNpb24gM1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uQmVmb3JlVW5sb2FkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRqdXN0cyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgdG8gYmUgbG93ZXIgdG8gZml0IHRoZSBzY3JlZW4gYW5kIHN0aWxsIG1haW50YWluIG1pbkl0ZW1XaWR0aC5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFkanVzdENvbHVtbnNSZXNwb25zaXZlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1BQ1IyMDg4MycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZpcnN0TG9hZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBtaW4gd2lkdGggc2V0LCBvciBub3QgY29udGVudCBpdGVtcywgZG8gbm90aGluZy5cclxuICAgICAgICAgICAgaWYgKHRoaXMudXNlUmVzcG9uc2l2ZUxheW91dCgpICYmXHJcbiAgICAgICAgICAgICAgICAhdGhpcy5fdXBkYXRpbmdDb2x1bW5zUmVzcG9uc2l2ZSAmJlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZ3JvdW5kSXRlbS5jb250ZW50SXRlbXMubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZ3JvdW5kSXRlbS5jb250ZW50SXRlbXNbMF0uaXNSb3cpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQgfHwgdGhpcy5fd2lkdGggPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUFDUjc3NDEyJyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG9ubHkgb25lIGNvbHVtbiwgZG8gbm90aGluZy5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5Db3VudCA9IHRoaXMuX2dyb3VuZEl0ZW0uY29udGVudEl0ZW1zWzBdLmNvbnRlbnRJdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbkNvdW50IDw9IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXkgYWxsIHN0aWxsIGZpdCwgZG8gbm90aGluZy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWluSXRlbVdpZHRoID0gdGhpcy5sYXlvdXRDb25maWcuZGltZW5zaW9ucy5kZWZhdWx0TWluSXRlbVdpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b3RhbE1pbldpZHRoID0gY29sdW1uQ291bnQgKiBtaW5JdGVtV2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbE1pbldpZHRoIDw9IHRoaXMuX3dpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IHVwZGF0ZXMgd2hpbGUgaXQgaXMgYWxyZWFkeSBoYXBwZW5pbmcuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ0NvbHVtbnNSZXNwb25zaXZlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWd1cmUgb3V0IGhvdyBtYW55IGNvbHVtbnMgdG8gc3RhY2ssIGFuZCBwdXQgdGhlbSBhbGwgaW4gdGhlIGZpcnN0IHN0YWNrIGNvbnRhaW5lci5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbmFsQ29sdW1uQ291bnQgPSBNYXRoLm1heChNYXRoLmZsb29yKHRoaXMuX3dpZHRoIC8gbWluSXRlbVdpZHRoKSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFja0NvbHVtbkNvdW50ID0gY29sdW1uQ291bnQgLSBmaW5hbENvbHVtbkNvdW50O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvb3RDb250ZW50SXRlbSA9IHRoaXMuX2dyb3VuZEl0ZW0uY29udGVudEl0ZW1zWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsU3RhY2tzID0gdGhpcy5nZXRBbGxTdGFja3MoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGxTdGFja3MubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdMTUFDUlM3NzQxMycpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0U3RhY2tDb250YWluZXIgPSBhbGxTdGFja3NbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGFja0NvbHVtbkNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RhY2sgZnJvbSByaWdodC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sdW1uID0gcm9vdENvbnRlbnRJdGVtLmNvbnRlbnRJdGVtc1tyb290Q29udGVudEl0ZW0uY29udGVudEl0ZW1zLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZENoaWxkQ29udGVudEl0ZW1zVG9Db250YWluZXIoZmlyc3RTdGFja0NvbnRhaW5lciwgY29sdW1uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nQ29sdW1uc1Jlc3BvbnNpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERldGVybWluZXMgaWYgcmVzcG9uc2l2ZSBsYXlvdXQgc2hvdWxkIGJlIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiByZXNwb25zaXZlIGxheW91dCBzaG91bGQgYmUgdXNlZDsgb3RoZXJ3aXNlIGZhbHNlLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdXNlUmVzcG9uc2l2ZUxheW91dCgpIHtcclxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMubGF5b3V0Q29uZmlnLnNldHRpbmdzO1xyXG4gICAgICAgIGNvbnN0IGFsd2F5c1Jlc3BvbnNpdmVNb2RlID0gc2V0dGluZ3MucmVzcG9uc2l2ZU1vZGUgPT09IFJlc3BvbnNpdmVNb2RlLmFsd2F5cztcclxuICAgICAgICBjb25zdCBvbkxvYWRSZXNwb25zaXZlTW9kZUFuZEZpcnN0ID0gc2V0dGluZ3MucmVzcG9uc2l2ZU1vZGUgPT09IFJlc3BvbnNpdmVNb2RlLm9ubG9hZCAmJiB0aGlzLl9maXJzdExvYWQ7XHJcbiAgICAgICAgcmV0dXJuIGFsd2F5c1Jlc3BvbnNpdmVNb2RlIHx8IG9uTG9hZFJlc3BvbnNpdmVNb2RlQW5kRmlyc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGFsbCBjaGlsZHJlbiBvZiBhIG5vZGUgdG8gYW5vdGhlciBjb250YWluZXIgcmVjdXJzaXZlbHkuXHJcbiAgICAgKiBAcGFyYW0gY29udGFpbmVyIC0gQ29udGFpbmVyIHRvIGFkZCBjaGlsZCBjb250ZW50IGl0ZW1zIHRvLlxyXG4gICAgICogQHBhcmFtIG5vZGUgLSBOb2RlIHRvIHNlYXJjaCBmb3IgY29udGVudCBpdGVtcy5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFkZENoaWxkQ29udGVudEl0ZW1zVG9Db250YWluZXIoY29udGFpbmVyOiBDb250ZW50SXRlbSwgbm9kZTogQ29udGVudEl0ZW0pIHtcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbXMgPSBub2RlLmNvbnRlbnRJdGVtcztcclxuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFN0YWNrKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVDaGlsZChpdGVtLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRDaGlsZChpdGVtKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDaGlsZENvbnRlbnRJdGVtc1RvQ29udGFpbmVyKGNvbnRhaW5lciwgaXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kcyBhbGwgdGhlIHN0YWNrcy5cclxuICAgICAqIEByZXR1cm5zIFRoZSBmb3VuZCBzdGFjayBjb250YWluZXJzLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0QWxsU3RhY2tzKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1GQVNDNTI3NzgnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFja3M6IFN0YWNrW10gPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5maW5kQWxsU3RhY2tzUmVjdXJzaXZlKHN0YWNrcywgdGhpcy5fZ3JvdW5kSXRlbSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gc3RhY2tzO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGZpbmRGaXJzdENvbnRlbnRJdGVtVHlwZSh0eXBlOiBJdGVtVHlwZSk6IENvbnRlbnRJdGVtIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNRkZDSVQ4MjQ0NicpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRGaXJzdENvbnRlbnRJdGVtVHlwZVJlY3Vyc2l2ZSh0eXBlLCB0aGlzLl9ncm91bmRJdGVtKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBmaW5kRmlyc3RDb250ZW50SXRlbVR5cGVSZWN1cnNpdmUodHlwZTogSXRlbVR5cGUsIG5vZGU6IENvbnRlbnRJdGVtKTogQ29udGVudEl0ZW0gfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtcyA9IG5vZGUuY29udGVudEl0ZW1zO1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtQ291bnQgPSBjb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIGlmIChjb250ZW50SXRlbUNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50SXRlbUNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRJdGVtLnR5cGUgPT09IHR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudEl0ZW07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudEl0ZW1Db3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IGNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kQ29udGVudEl0ZW0gPSB0aGlzLmZpbmRGaXJzdENvbnRlbnRJdGVtVHlwZVJlY3Vyc2l2ZSh0eXBlLCBjb250ZW50SXRlbSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZm91bmRDb250ZW50SXRlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kQ29udGVudEl0ZW07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlQnlJZFJlY3Vyc2l2ZSh0eXBlOiBJdGVtVHlwZSwgaWQ6IHN0cmluZywgbm9kZTogQ29udGVudEl0ZW0pOiBDb250ZW50SXRlbSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgY29uc3QgY29udGVudEl0ZW1zID0gbm9kZS5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgY29uc3QgY29udGVudEl0ZW1Db3VudCA9IGNvbnRlbnRJdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGNvbnRlbnRJdGVtQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSBjb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGVudEl0ZW0udHlwZSA9PT0gdHlwZSAmJiBjb250ZW50SXRlbS5pZCA9PT0gaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudEl0ZW07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudEl0ZW1Db3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IGNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kQ29udGVudEl0ZW0gPSB0aGlzLmZpbmRGaXJzdENvbnRlbnRJdGVtVHlwZUJ5SWRSZWN1cnNpdmUodHlwZSwgaWQsIGNvbnRlbnRJdGVtKTtcclxuICAgICAgICAgICAgICAgIGlmIChmb3VuZENvbnRlbnRJdGVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRDb250ZW50SXRlbTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kcyBhbGwgdGhlIHN0YWNrIGNvbnRhaW5lcnMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHN0YWNrcyAtIFNldCBvZiBjb250YWluZXJzIHRvIHBvcHVsYXRlLlxyXG4gICAgICogQHBhcmFtIG5vZGUgLSBDdXJyZW50IG5vZGUgdG8gcHJvY2Vzcy5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGZpbmRBbGxTdGFja3NSZWN1cnNpdmUoc3RhY2tzOiBTdGFja1tdLCBub2RlOiBDb250ZW50SXRlbSkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtcyA9IG5vZGUuY29udGVudEl0ZW1zO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgU3RhY2spIHtcclxuICAgICAgICAgICAgICAgIHN0YWNrcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpdGVtLmlzQ29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kQWxsU3RhY2tzUmVjdXJzaXZlKHN0YWNrcywgaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBmaW5kRmlyc3RMb2NhdGlvbihzZWxlY3RvcnM6IHJlYWRvbmx5IExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3RvcltdKTogTGF5b3V0TWFuYWdlci5Mb2NhdGlvbiB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgY29uc3QgY291bnQgPSBzZWxlY3RvcnMubGVuZ3RoO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IHNlbGVjdG9yc1tpXTtcclxuICAgICAgICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLmZpbmRMb2NhdGlvbihzZWxlY3Rvcik7XHJcbiAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGZpbmRMb2NhdGlvbihzZWxlY3RvcjogTGF5b3V0TWFuYWdlci5Mb2NhdGlvblNlbGVjdG9yKTogTGF5b3V0TWFuYWdlci5Mb2NhdGlvbiB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0b3JJbmRleCA9IHNlbGVjdG9yLmluZGV4O1xyXG4gICAgICAgIHN3aXRjaCAoc2VsZWN0b3IudHlwZUlkKSB7XHJcbiAgICAgICAgICAgIGNhc2UgTGF5b3V0TWFuYWdlci5Mb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5Gb2N1c2VkSXRlbToge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2ZvY3VzZWRDb21wb25lbnRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEl0ZW0gPSB0aGlzLl9mb2N1c2VkQ29tcG9uZW50SXRlbS5wYXJlbnRJdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudENvbnRlbnRJdGVtcyA9IHBhcmVudEl0ZW0uY29udGVudEl0ZW1zO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudENvbnRlbnRJdGVtQ291bnQgPSBwYXJlbnRDb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RvckluZGV4ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcGFyZW50SXRlbSwgaW5kZXg6IHBhcmVudENvbnRlbnRJdGVtQ291bnQgfTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb2N1c2VkSW5kZXggPSBwYXJlbnRDb250ZW50SXRlbXMuaW5kZXhPZih0aGlzLl9mb2N1c2VkQ29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZm9jdXNlZEluZGV4ICsgc2VsZWN0b3JJbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IHBhcmVudENvbnRlbnRJdGVtQ291bnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBwYXJlbnRJdGVtLCBpbmRleCB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgTGF5b3V0TWFuYWdlci5Mb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5Gb2N1c2VkU3RhY2s6IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9mb2N1c2VkQ29tcG9uZW50SXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJdGVtID0gdGhpcy5fZm9jdXNlZENvbXBvbmVudEl0ZW0ucGFyZW50SXRlbTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cnlDcmVhdGVMb2NhdGlvbkZyb21QYXJlbnRJdGVtKHBhcmVudEl0ZW0sIHNlbGVjdG9ySW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgTGF5b3V0TWFuYWdlci5Mb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5GaXJzdFN0YWNrOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJdGVtID0gdGhpcy5maW5kRmlyc3RDb250ZW50SXRlbVR5cGUoSXRlbVR5cGUuc3RhY2spO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyeUNyZWF0ZUxvY2F0aW9uRnJvbVBhcmVudEl0ZW0ocGFyZW50SXRlbSwgc2VsZWN0b3JJbmRleCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLkZpcnN0Um93T3JDb2x1bW46IHtcclxuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRJdGVtID0gdGhpcy5maW5kRmlyc3RDb250ZW50SXRlbVR5cGUoSXRlbVR5cGUucm93KTtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRJdGVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cnlDcmVhdGVMb2NhdGlvbkZyb21QYXJlbnRJdGVtKHBhcmVudEl0ZW0sIHNlbGVjdG9ySW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRJdGVtID0gdGhpcy5maW5kRmlyc3RDb250ZW50SXRlbVR5cGUoSXRlbVR5cGUuY29sdW1uKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50SXRlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyeUNyZWF0ZUxvY2F0aW9uRnJvbVBhcmVudEl0ZW0ocGFyZW50SXRlbSwgc2VsZWN0b3JJbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLkZpcnN0Um93OiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJdGVtID0gdGhpcy5maW5kRmlyc3RDb250ZW50SXRlbVR5cGUoSXRlbVR5cGUucm93KTtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cnlDcmVhdGVMb2NhdGlvbkZyb21QYXJlbnRJdGVtKHBhcmVudEl0ZW0sIHNlbGVjdG9ySW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgTGF5b3V0TWFuYWdlci5Mb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5GaXJzdENvbHVtbjoge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SXRlbSA9IHRoaXMuZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlKEl0ZW1UeXBlLmNvbHVtbik7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50SXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJ5Q3JlYXRlTG9jYXRpb25Gcm9tUGFyZW50SXRlbShwYXJlbnRJdGVtLCBzZWxlY3RvckluZGV4KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRW1wdHk6IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUZMUklGMTgyNDQnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucm9vdEl0ZW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RvckluZGV4ID09PSB1bmRlZmluZWQgfHwgc2VsZWN0b3JJbmRleCA9PT0gMClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHBhcmVudEl0ZW06IHRoaXMuX2dyb3VuZEl0ZW0sIGluZGV4OiAwIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuUm9vdDoge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNRkxGMTgyNDQnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdW5kQ29udGVudEl0ZW1zID0gdGhpcy5fZ3JvdW5kSXRlbS5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VuZENvbnRlbnRJdGVtcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9ySW5kZXggPT09IHVuZGVmaW5lZCB8fCBzZWxlY3RvckluZGV4ID09PSAwKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcGFyZW50SXRlbTogdGhpcy5fZ3JvdW5kSXRlbSwgaW5kZXg6IDAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SXRlbSA9IGdyb3VuZENvbnRlbnRJdGVtc1swXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJ5Q3JlYXRlTG9jYXRpb25Gcm9tUGFyZW50SXRlbShwYXJlbnRJdGVtLCBzZWxlY3RvckluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSB0cnlDcmVhdGVMb2NhdGlvbkZyb21QYXJlbnRJdGVtKHBhcmVudEl0ZW06IENvbnRlbnRJdGVtLFxyXG4gICAgICAgIHNlbGVjdG9ySW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZFxyXG4gICAgKTogTGF5b3V0TWFuYWdlci5Mb2NhdGlvbiB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50Q29udGVudEl0ZW1zID0gcGFyZW50SXRlbS5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgY29uc3QgcGFyZW50Q29udGVudEl0ZW1Db3VudCA9IHBhcmVudENvbnRlbnRJdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgaWYgKHNlbGVjdG9ySW5kZXggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4geyBwYXJlbnRJdGVtLCBpbmRleDogcGFyZW50Q29udGVudEl0ZW1Db3VudCB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RvckluZGV4IDwgMCB8fCBzZWxlY3RvckluZGV4ID4gcGFyZW50Q29udGVudEl0ZW1Db3VudCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IHBhcmVudEl0ZW0sIGluZGV4OiBzZWxlY3RvckluZGV4IH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgTGF5b3V0TWFuYWdlciB7XHJcbiAgICBleHBvcnQgdHlwZSBCZWZvcmVWaXJ0dWFsUmVjdGluZ0V2ZW50ID0gKHRoaXM6IHZvaWQsIGNvdW50OiBudW1iZXIpID0+IHZvaWQ7XHJcbiAgICBleHBvcnQgdHlwZSBBZnRlclZpcnR1YWxSZWN0aW5nRXZlbnQgPSAodGhpczogdm9pZCkgPT4gdm9pZDtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIENvbnN0cnVjdG9yUGFyYW1ldGVycyB7XHJcbiAgICAgICAgY29uc3RydWN0b3JPclN1YldpbmRvd0xheW91dENvbmZpZzogTGF5b3V0Q29uZmlnIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGlzU3ViV2luZG93OiBib29sZWFuO1xyXG4gICAgICAgIGNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNYXhpbWlzZVBsYWNlRWxlbWVudChkb2N1bWVudDogRG9jdW1lbnQpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLk1heGltaXNlUGxhY2UpO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUYWJEcm9wUGxhY2Vob2xkZXJFbGVtZW50KGRvY3VtZW50OiBEb2N1bWVudCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuRHJvcFRhYlBsYWNlaG9sZGVyKTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNwZWNpZmllcyBhIGxvY2F0aW9uIG9mIGEgQ29udGVudEl0ZW0gd2l0aG91dCByZWZlcmVuY2luZyB0aGUgY29udGVudCBpdGVtLlxyXG4gICAgICogVXNlZCB0byBzcGVjaWZ5IHdoZXJlIGEgbmV3IGl0ZW0gaXMgdG8gYmUgYWRkZWRcclxuICAgICAqIEBwdWJsaWNcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGludGVyZmFjZSBMb2NhdGlvbiB7XHJcbiAgICAgICAgcGFyZW50SXRlbTogQ29udGVudEl0ZW07XHJcbiAgICAgICAgaW5kZXg6IG51bWJlcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgc2VsZWN0b3IgdXNlZCB0byBzcGVjaWZ5IGEgdW5pcXVlIGxvY2F0aW9uIGluIHRoZSBsYXlvdXRcclxuICAgICAqIEBwdWJsaWNcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGludGVyZmFjZSBMb2NhdGlvblNlbGVjdG9yIHtcclxuICAgICAgICAvKiogU3BlY2lmaWVzIHNlbGVjdG9yIGFsZ29yaXRobSAqL1xyXG4gICAgICAgIHR5cGVJZDogTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQ7XHJcbiAgICAgICAgLyoqIFVzZWQgYnkgYWxnb3JpdGhtIHRvIGRldGVybWluZSBpbmRleCBpbiBmb3VuZCBDb250ZW50SXRlbSAqL1xyXG4gICAgICAgIGluZGV4PzogbnVtYmVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHVibGljICovXHJcbiAgICBleHBvcnQgbmFtZXNwYWNlIExvY2F0aW9uU2VsZWN0b3Ige1xyXG4gICAgICAgIGV4cG9ydCBjb25zdCBlbnVtIFR5cGVJZCB7XHJcbiAgICAgICAgICAgIC8qKiBTdGFjayB3aXRoIGZvY3VzZWQgSXRlbS4gSW5kZXggc3BlY2lmaWVzIG9mZnNldCBmcm9tIGluZGV4IG9mIGZvY3VzZWQgaXRlbSAoZWcgMSBpcyB0aGUgcG9zaXRpb24gYWZ0ZXIgZm9jdXNlZCBpdGVtKSAqL1xyXG4gICAgICAgICAgICBGb2N1c2VkSXRlbSxcclxuICAgICAgICAgICAgLyoqIFN0YWNrIHdpdGggZm9jdXNlZCBJdGVtLiBJbmRleCBzcGVjZmllcyBDb250ZW50SXRlbXMgaW5kZXggKi9cclxuICAgICAgICAgICAgRm9jdXNlZFN0YWNrLFxyXG4gICAgICAgICAgICAvKiogRmlyc3Qgc3RhY2sgZm91bmQgaW4gbGF5b3V0ICovXHJcbiAgICAgICAgICAgIEZpcnN0U3RhY2ssXHJcbiAgICAgICAgICAgIC8qKiBGaXJzdCBSb3cgb3IgQ29sdW1uIGZvdW5kIGluIGxheW91dCAocm93cyBhcmUgc2VhcmNoZWQgZmlyc3QpICovXHJcbiAgICAgICAgICAgIEZpcnN0Um93T3JDb2x1bW4sXHJcbiAgICAgICAgICAgIC8qKiBGaXJzdCBSb3cgaW4gbGF5b3V0ICovXHJcbiAgICAgICAgICAgIEZpcnN0Um93LFxyXG4gICAgICAgICAgICAvKiogRmlyc3QgQ29sdW1uIGluIGxheW91dCAqL1xyXG4gICAgICAgICAgICBGaXJzdENvbHVtbixcclxuICAgICAgICAgICAgLyoqIEZpbmRzIGEgbG9jYXRpb24gaWYgbGF5b3V0IGlzIGVtcHR5LiBUaGUgZm91bmQgbG9jYXRpb24gd2lsbCBiZSB0aGUgcm9vdCBDb250ZW50SXRlbS4gKi9cclxuICAgICAgICAgICAgRW1wdHksXHJcbiAgICAgICAgICAgIC8qKiBGaW5kcyByb290IGlmIGxheW91dCBpcyBlbXB0eSwgb3RoZXJ3aXNlIGEgY2hpbGQgdW5kZXIgcm9vdCAqL1xyXG4gICAgICAgICAgICBSb290LFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlZmF1bHQgTG9jYXRpb25TZWxlY3RvcnMgYXJyYXkgdXNlZCBpZiBub25lIGlzIHNwZWNpZmllZC4gIFdpbGwgYWx3YXlzIGZpbmQgYSBsb2NhdGlvbi5cclxuICAgICAqIEBwdWJsaWNcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGNvbnN0IGRlZmF1bHRMb2NhdGlvblNlbGVjdG9yczogcmVhZG9ubHkgTG9jYXRpb25TZWxlY3RvcltdID0gW1xyXG4gICAgICAgIHsgdHlwZUlkOiBMb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5Gb2N1c2VkU3RhY2ssIGluZGV4OiB1bmRlZmluZWQgfSxcclxuICAgICAgICB7IHR5cGVJZDogTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRmlyc3RTdGFjaywgaW5kZXg6IHVuZGVmaW5lZCB9LFxyXG4gICAgICAgIHsgdHlwZUlkOiBMb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5GaXJzdFJvd09yQ29sdW1uLCBpbmRleDogdW5kZWZpbmVkIH0sXHJcbiAgICAgICAgeyB0eXBlSWQ6IExvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLlJvb3QsIGluZGV4OiB1bmRlZmluZWQgfSxcclxuICAgIF07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2NhdGlvblNlbGVjdG9ycyB0byB0cnkgdG8gZ2V0IGxvY2F0aW9uIG5leHQgdG8gZXhpc3RpbmcgZm9jdXNlZCBpdGVtXHJcbiAgICAgKiBAcHVibGljXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBjb25zdCBhZnRlckZvY3VzZWRJdGVtSWZQb3NzaWJsZUxvY2F0aW9uU2VsZWN0b3JzOiByZWFkb25seSBMb2NhdGlvblNlbGVjdG9yW10gPSBbXHJcbiAgICAgICAgeyB0eXBlSWQ6IExvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLkZvY3VzZWRJdGVtLCBpbmRleDogMSB9LFxyXG4gICAgICAgIHsgdHlwZUlkOiBMb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5GaXJzdFN0YWNrLCBpbmRleDogdW5kZWZpbmVkIH0sXHJcbiAgICAgICAgeyB0eXBlSWQ6IExvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLkZpcnN0Um93T3JDb2x1bW4sIGluZGV4OiB1bmRlZmluZWQgfSxcclxuICAgICAgICB7IHR5cGVJZDogTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuUm9vdCwgaW5kZXg6IHVuZGVmaW5lZCB9LFxyXG4gICAgXTtcclxufVxyXG4iLCIvKipcclxuICogTWluaWZpZXMgYW5kIHVubWluaWZpZXMgY29uZmlncyBieSByZXBsYWNpbmcgZnJlcXVlbnQga2V5c1xyXG4gKiBhbmQgdmFsdWVzIHdpdGggb25lIGxldHRlciBzdWJzdGl0dXRlcy4gQ29uZmlnIG9wdGlvbnMgbXVzdFxyXG4gKiByZXRhaW4gYXJyYXkgcG9zaXRpb24vaW5kZXgsIGFkZCBuZXcgb3B0aW9ucyBhdCB0aGUgZW5kLlxyXG4gKiBAaW50ZXJuYWxcclxuKi9cclxuXHJcbmV4cG9ydCBuYW1lc3BhY2UgQ29uZmlnTWluaWZpZXIge1xyXG5cclxuICAgIGV4cG9ydCB0eXBlIFlZID0gJ2lkJyB8ICd0aXRsZSc7XHJcbiAgICBleHBvcnQgY29uc3QgZW51bSBYWCB7XHJcbiAgICAgICAgaWQgPSAnaWQnXHJcbiAgICB9XHJcbiAgICBjb25zdCBrZXlzOiByZWFkb25seSBzdHJpbmdbXSA9IFtcclxuICAgICAgICAnc2V0dGluZ3MnLFxyXG4gICAgICAgICdoYXNIZWFkZXJzJyxcclxuICAgICAgICAnZHJhZ0JldHdlZW5XaW5kb3dzJyxcclxuICAgICAgICAnZHJhZ1RvTmV3V2luZG93JyxcclxuICAgICAgICAnc2VsZWN0aW9uRW5hYmxlZCcsXHJcbiAgICAgICAgJ2RpbWVuc2lvbnMnLFxyXG4gICAgICAgICdib3JkZXJXaWR0aCcsXHJcbiAgICAgICAgJ21pbkl0ZW1IZWlnaHQnLFxyXG4gICAgICAgICdtaW5JdGVtV2lkdGgnLFxyXG4gICAgICAgICdoZWFkZXJIZWlnaHQnLFxyXG4gICAgICAgICdkcmFnUHJveHlXaWR0aCcsXHJcbiAgICAgICAgJ2RyYWdQcm94eUhlaWdodCcsXHJcbiAgICAgICAgJ2xhYmVscycsXHJcbiAgICAgICAgJ2Nsb3NlJyxcclxuICAgICAgICAnbWF4aW1pc2UnLFxyXG4gICAgICAgICdtaW5pbWlzZScsXHJcbiAgICAgICAgJ3BvcG91dCcsXHJcbiAgICAgICAgJ2NvbnRlbnQnLFxyXG4gICAgICAgICdjb21wb25lbnRUeXBlJyxcclxuICAgICAgICAnY29tcG9uZW50U3RhdGUnLFxyXG4gICAgICAgICdpZCcsXHJcbiAgICAgICAgJ3dpZHRoJyxcclxuICAgICAgICAndHlwZScsXHJcbiAgICAgICAgJ2hlaWdodCcsXHJcbiAgICAgICAgJ2lzQ2xvc2FibGUnLFxyXG4gICAgICAgICd0aXRsZScsXHJcbiAgICAgICAgJ3BvcG91dFdob2xlU3RhY2snLFxyXG4gICAgICAgICdvcGVuUG9wb3V0cycsXHJcbiAgICAgICAgJ3BhcmVudElkJyxcclxuICAgICAgICAnYWN0aXZlSXRlbUluZGV4JyxcclxuICAgICAgICAncmVvcmRlckVuYWJsZWQnLFxyXG4gICAgICAgICdib3JkZXJHcmFiV2lkdGgnLFxyXG5cclxuXHJcblxyXG4gICAgICAgIC8vTWF4aW11bSAzNiBlbnRyaWVzLCBkbyBub3QgY3Jvc3MgdGhpcyBsaW5lIVxyXG4gICAgXTtcclxuXHJcbiAgICBjb25zdCB2YWx1ZXM6IHJlYWRvbmx5IChib29sZWFuIHwgc3RyaW5nKVtdID0gW1xyXG4gICAgICAgIHRydWUsXHJcbiAgICAgICAgZmFsc2UsXHJcbiAgICAgICAgJ3JvdycsXHJcbiAgICAgICAgJ2NvbHVtbicsXHJcbiAgICAgICAgJ3N0YWNrJyxcclxuICAgICAgICAnY29tcG9uZW50JyxcclxuICAgICAgICAnY2xvc2UnLFxyXG4gICAgICAgICdtYXhpbWlzZScsXHJcbiAgICAgICAgJ21pbmltaXNlJyxcclxuICAgICAgICAnb3BlbiBpbiBuZXcgd2luZG93J1xyXG4gICAgXTtcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY2hlY2tJbml0aWFsaXNlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmIChrZXlzLmxlbmd0aCA+IDM2KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVG9vIG1hbnkga2V5cyBpbiBjb25maWcgbWluaWZpZXIgbWFwJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGVPYmplY3QoZnJvbTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG1pbmlmeTogYm9vbGVhbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcclxuICAgICAgICBjb25zdCB0bzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmcm9tKSB7XHJcbiAgICAgICAgICAgIGlmIChmcm9tLmhhc093blByb3BlcnR5KGtleSkpIHsgLy8gSW4gY2FzZSBzb21ldGhpbmcgaGFzIGV4dGVuZGVkIE9iamVjdCBwcm90b3R5cGVzXHJcbiAgICAgICAgICAgICAgICBsZXQgdHJhbnNsYXRlZEtleTogc3RyaW5nO1xyXG4gICAgICAgICAgICAgICAgaWYgKG1pbmlmeSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZWRLZXkgPSBtaW5pZnlLZXkoa2V5KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlZEtleSA9IHVubWluaWZ5S2V5KGtleSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbVZhbHVlID0gZnJvbVtrZXldO1xyXG4gICAgICAgICAgICAgICAgdG9bdHJhbnNsYXRlZEtleV0gPSB0cmFuc2xhdGVWYWx1ZShmcm9tVmFsdWUsIG1pbmlmeSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0bztcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiB0cmFuc2xhdGVBcnJheShmcm9tOiB1bmtub3duW10sIG1pbmlmeTogYm9vbGVhbikge1xyXG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGZyb20ubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHRvID0gbmV3IEFycmF5PHVua25vd24+KGxlbmd0aCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAvLyBJbiBvcmlnaW5hbCBjb2RlLCBhcnJheSBpbmRpY2VzIHdlcmUgbnVtYmVycyBhbmQgbm90IHRyYW5zbGF0ZWRcclxuICAgICAgICAgICAgY29uc3QgZnJvbVZhbHVlID0gZnJvbVtpXTtcclxuICAgICAgICAgICAgdG9baV0gPSB0cmFuc2xhdGVWYWx1ZShmcm9tVmFsdWUsIG1pbmlmeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0bztcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiB0cmFuc2xhdGVWYWx1ZShmcm9tOiB1bmtub3duLCBtaW5pZnk6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAodHlwZW9mIGZyb20gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIGlmIChmcm9tID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZyb20pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZUFycmF5KGZyb20sIG1pbmlmeSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVPYmplY3QoZnJvbSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgbWluaWZ5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChtaW5pZnkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBtaW5pZnlWYWx1ZShmcm9tKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bm1pbmlmeVZhbHVlKGZyb20pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG1pbmlmeUtleSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgYSB2YWx1ZSBhY3R1YWxseSBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIsIHByZWZpeCBpdFxyXG4gICAgICAgICAqIHdpdGggX19fIHRvIGF2b2lkIG1pc3Rha2luZyBpdCBmb3IgYSBtaW5pZmljYXRpb24gY29kZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ19fXycgKyB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICBjb25zdCBpbmRleCA9IGluZGV4T2ZLZXkodmFsdWUpO1xyXG4gICAgXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogdmFsdWUgbm90IGZvdW5kIGluIHRoZSBkaWN0aW9uYXJ5LCByZXR1cm4gaXQgdW5tb2RpZmllZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiB2YWx1ZSBmb3VuZCBpbiBkaWN0aW9uYXJ5LCByZXR1cm4gaXRzIGJhc2UzNiBjb3VudGVycGFydFxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gaW5kZXgudG9TdHJpbmcoMzYpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiB1bm1pbmlmeUtleShrZXk6IHN0cmluZykge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIHZhbHVlIGlzIGEgc2luZ2xlIGNoYXJhY3Rlci4gQXNzdW1lIHRoYXQgaXQncyBhIHRyYW5zbGF0aW9uXHJcbiAgICAgICAgICogYW5kIHJldHVybiB0aGUgb3JpZ2luYWwgdmFsdWUgZnJvbSB0aGUgZGljdGlvbmFyeVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChrZXkubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBrZXlzW3BhcnNlSW50KGtleSwgMzYpXTtcclxuICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiB2YWx1ZSBvcmlnaW5hbGx5IHdhcyBhIHNpbmdsZSBjaGFyYWN0ZXIgYW5kIHdhcyBwcmVmaXhlZCB3aXRoIF9fX1xyXG4gICAgICAgICAqIHRvIGF2b2lkIG1pc3Rha2luZyBpdCBmb3IgYSB0cmFuc2xhdGlvbi4gUmVtb3ZlIHRoZSBwcmVmaXhcclxuICAgICAgICAgKiBhbmQgcmV0dXJuIHRoZSBvcmlnaW5hbCBjaGFyYWN0ZXJcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoa2V5LnN1YnN0cigwLCAzKSA9PT0gJ19fXycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGtleVszXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogdmFsdWUgd2FzIG5vdCBtaW5pZmllZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHJldHVybiBrZXk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbWluaWZ5VmFsdWUodmFsdWU6IHVua25vd24pIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiBhIHZhbHVlIGFjdHVhbGx5IGlzIGEgc2luZ2xlIGNoYXJhY3RlciwgcHJlZml4IGl0XHJcbiAgICAgICAgICogd2l0aCBfX18gdG8gYXZvaWQgbWlzdGFraW5nIGl0IGZvciBhIG1pbmlmaWNhdGlvbiBjb2RlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnX19fJyArIHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gaW5kZXhPZlZhbHVlKHZhbHVlKTtcclxuICAgIFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIHZhbHVlIG5vdCBmb3VuZCBpbiB0aGUgZGljdGlvbmFyeSwgcmV0dXJuIGl0IHVubW9kaWZpZWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIFxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogdmFsdWUgZm91bmQgaW4gZGljdGlvbmFyeSwgcmV0dXJuIGl0cyBiYXNlMzYgY291bnRlcnBhcnRcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGluZGV4LnRvU3RyaW5nKDM2KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdW5taW5pZnlWYWx1ZSh2YWx1ZTogdW5rbm93bikge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIHZhbHVlIGlzIGEgc2luZ2xlIGNoYXJhY3Rlci4gQXNzdW1lIHRoYXQgaXQncyBhIHRyYW5zbGF0aW9uXHJcbiAgICAgICAgICogYW5kIHJldHVybiB0aGUgb3JpZ2luYWwgdmFsdWUgZnJvbSB0aGUgZGljdGlvbmFyeVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWVzW3BhcnNlSW50KHZhbHVlLCAzNildO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogdmFsdWUgb3JpZ2luYWxseSB3YXMgYSBzaW5nbGUgY2hhcmFjdGVyIGFuZCB3YXMgcHJlZml4ZWQgd2l0aCBfX19cclxuICAgICAgICAgKiB0byBhdm9pZCBtaXN0YWtpbmcgaXQgZm9yIGEgdHJhbnNsYXRpb24uIFJlbW92ZSB0aGUgcHJlZml4XHJcbiAgICAgICAgICogYW5kIHJldHVybiB0aGUgb3JpZ2luYWwgY2hhcmFjdGVyXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuc3Vic3RyKDAsIDMpID09PSAnX19fJykge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWVbM107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIHZhbHVlIHdhcyBub3QgbWluaWZpZWRcclxuICAgICAgICAgKi9cclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaW5kZXhPZktleShrZXk6IHN0cmluZykge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoa2V5c1tpXSA9PT0ga2V5KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaW5kZXhPZlZhbHVlKHZhbHVlOiB1bmtub3duKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlc1tpXSA9PT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuL2RvbS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuL2V2ZW50LWVtaXR0ZXInO1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgY2xhc3MgRHJhZ0xpc3RlbmVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICAgIHByaXZhdGUgX3RpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xyXG4gICAgcHJpdmF0ZSBfYWxsb3dhYmxlVGFyZ2V0czogSFRNTEVsZW1lbnRbXTtcclxuICAgIHByaXZhdGUgX29Eb2N1bWVudDogRG9jdW1lbnQ7XHJcbiAgICBwcml2YXRlIF9lQm9keTogSFRNTEVsZW1lbnQ7XHJcbiAgICBwcml2YXRlIF9uRGVsYXk6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX25EaXN0YW5jZTogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfb3JpZ2luYWxFdmVudDogRXZlbnRFbWl0dGVyLkRyYWdFdmVudDtcclxuICAgIHByaXZhdGUgX2RyYWdnaW5nOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBfcG9pbnRlclRyYWNraW5nID0gZmFsc2U7XHJcblxyXG4gICAgcHJpdmF0ZSBfcG9pbnRlckRvd25FdmVudExpc3RlbmVyID0gKGV2OiBQb2ludGVyRXZlbnQpID0+IHRoaXMub25Qb2ludGVyRG93bihldik7XHJcbiAgICBwcml2YXRlIF9wb2ludGVyTW92ZUV2ZW50TGlzdGVuZXIgPSAoZXY6IFBvaW50ZXJFdmVudCkgPT4gdGhpcy5vblBvaW50ZXJNb3ZlKGV2KTtcclxuICAgIHByaXZhdGUgX3BvaW50ZXJVcEV2ZW50TGlzdGVuZXIgPSAoZXY6IFBvaW50ZXJFdmVudCkgPT4gdGhpcy5vblBvaW50ZXJVcChldik7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfZUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBleHRyYUFsbG93YWJsZUNoaWxkVGFyZ2V0czogSFRNTEVsZW1lbnRbXSkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3RpbWVvdXQgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIHRoaXMuX2FsbG93YWJsZVRhcmdldHMgPSBbX2VFbGVtZW50LCAuLi5leHRyYUFsbG93YWJsZUNoaWxkVGFyZ2V0c107XHJcbiAgICAgICAgdGhpcy5fb0RvY3VtZW50ID0gZG9jdW1lbnQ7XHJcbiAgICAgICAgdGhpcy5fZUJvZHkgPSBkb2N1bWVudC5ib2R5O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZGVsYXkgYWZ0ZXIgd2hpY2ggdG8gc3RhcnQgdGhlIGRyYWcgaW4gbWlsbGlzZWNvbmRzXHJcbiAgICAgICAgICogRG8gTk9UIG1ha2UgdG9vIHNob3J0IChwcmV2aW91cyB2YWx1ZSBvZiAyMDAgd2FzIG5vdCBsb25nIGVub3VnaCBmb3IgbXkgdG91Y2hwYWQpXHJcbiAgICAgICAgICogU2hvdWxkIGdlbmVyYWxseSByZWx5IG9uIHRoZSBtb3VzZSBtb3ZlIHRvIHN0YXJ0IGRyYWcuICBOb3QgdGhpcyBkZWxheS5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9uRGVsYXkgPSAxODAwO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZGlzdGFuY2UgdGhlIG1vdXNlIG5lZWRzIHRvIGJlIG1vdmVkIHRvIHF1YWxpZnkgYXMgYSBkcmFnXHJcbiAgICAgICAgICogUHJldmlvdXMgY29tbWVudDogd29ya3MgYmV0dGVyIHdpdGggZGVsYXkgb25seVxyXG4gICAgICAgICAqID8/P1xyXG4gICAgICAgICAqIFByb2JhYmx5IHNvbWVob3cgbmVlZHMgdHVuaW5nIGZvciBkaWZmZXJlbnQgZGV2aWNlc1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX25EaXN0YW5jZSA9IDEwO1xyXG5cclxuICAgICAgICB0aGlzLl9vcmlnaW5hbEV2ZW50ID0geyBwYWdlWDogMCwgcGFnZVk6IDAsIHNjcmVlblg6IDAsIHNjcmVlblk6IDB9O1xyXG5cclxuICAgICAgICB0aGlzLl9kcmFnZ2luZyA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLl9lRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMuX3BvaW50ZXJEb3duRXZlbnRMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jaGVja1JlbW92ZVBvaW50ZXJUcmFja2luZ0V2ZW50TGlzdGVuZXJzKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2VFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5fcG9pbnRlckRvd25FdmVudExpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBjYW5jZWxEcmFnKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc0RyYWdTdG9wKHVuZGVmaW5lZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvblBvaW50ZXJEb3duKG9FdmVudDogUG9pbnRlckV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2FsbG93YWJsZVRhcmdldHMuaW5jbHVkZXMob0V2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkgJiYgb0V2ZW50LmlzUHJpbWFyeSkge1xyXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NQb2ludGVyRG93bihvRXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHByb2Nlc3NQb2ludGVyRG93bihldmVudDogUG9pbnRlckV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5fb3JpZ2luYWxFdmVudCA9IGV2ZW50O1xyXG5cclxuICAgICAgICB0aGlzLl9vRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCB0aGlzLl9wb2ludGVyTW92ZUV2ZW50TGlzdGVuZXIpO1xyXG4gICAgICAgIHRoaXMuX29Eb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB0aGlzLl9wb2ludGVyVXBFdmVudExpc3RlbmVyLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgdGhpcy5fZUJvZHkuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLlBvaW50ZXJUcmFja2luZyk7XHJcbiAgICAgICAgdGhpcy5fcG9pbnRlclRyYWNraW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQoXHJcbiAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydERyYWcoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLCB0aGlzLl9uRGVsYXkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Qb2ludGVyTW92ZShvRXZlbnQ6IFBvaW50ZXJFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9wb2ludGVyVHJhY2tpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzRHJhZ01vdmUob0V2ZW50KTtcclxuICAgICAgICAgICAgb0V2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcHJvY2Vzc0RyYWdNb3ZlKGV2ZW50OiBQb2ludGVyRXZlbnQpIHtcclxuICAgICAgICBjb25zdCBvZmZzZXRYID0gZXZlbnQucGFnZVggLSB0aGlzLl9vcmlnaW5hbEV2ZW50LnBhZ2VYO1xyXG4gICAgICAgIGNvbnN0IG9mZnNldFkgPSBldmVudC5wYWdlWSAtIHRoaXMuX29yaWdpbmFsRXZlbnQucGFnZVk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9kcmFnZ2luZyA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgTWF0aC5hYnMob2Zmc2V0WCkgPiB0aGlzLl9uRGlzdGFuY2UgfHxcclxuICAgICAgICAgICAgICAgIE1hdGguYWJzKG9mZnNldFkpID4gdGhpcy5fbkRpc3RhbmNlXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydERyYWcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2RyYWdnaW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZHJhZycsIG9mZnNldFgsIG9mZnNldFksIGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvblBvaW50ZXJVcChvRXZlbnQ6IFBvaW50ZXJFdmVudCkge1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc0RyYWdTdG9wKG9FdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwcm9jZXNzRHJhZ1N0b3AoZHJhZ0V2ZW50PzogUG9pbnRlckV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3RpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3RpbWVvdXQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNoZWNrUmVtb3ZlUG9pbnRlclRyYWNraW5nRXZlbnRMaXN0ZW5lcnMoKTtcclxuICAgIFxyXG4gICAgICAgIGlmICh0aGlzLl9kcmFnZ2luZyA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9lQm9keS5jbGFzc0xpc3QucmVtb3ZlKERvbUNvbnN0YW50cy5DbGFzc05hbWUuRHJhZ2dpbmcpO1xyXG4gICAgICAgICAgICB0aGlzLl9lRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKERvbUNvbnN0YW50cy5DbGFzc05hbWUuRHJhZ2dpbmcpO1xyXG4gICAgICAgICAgICB0aGlzLl9kcmFnZ2luZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2RyYWdTdG9wJywgZHJhZ0V2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGVja1JlbW92ZVBvaW50ZXJUcmFja2luZ0V2ZW50TGlzdGVuZXJzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9wb2ludGVyVHJhY2tpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5fb0RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgdGhpcy5fcG9pbnRlck1vdmVFdmVudExpc3RlbmVyKTtcclxuICAgICAgICAgICAgdGhpcy5fb0RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIHRoaXMuX3BvaW50ZXJVcEV2ZW50TGlzdGVuZXIpO1xyXG4gICAgICAgICAgICB0aGlzLl9lQm9keS5jbGFzc0xpc3QucmVtb3ZlKERvbUNvbnN0YW50cy5DbGFzc05hbWUuUG9pbnRlclRyYWNraW5nKTtcclxuICAgICAgICAgICAgdGhpcy5fcG9pbnRlclRyYWNraW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSAgICBcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXJ0RHJhZygpIHtcclxuICAgICAgICBpZiAodGhpcy5fdGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KTtcclxuICAgICAgICAgICAgdGhpcy5fdGltZW91dCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZHJhZ2dpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2VCb2R5LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5EcmFnZ2luZyk7XHJcbiAgICAgICAgdGhpcy5fZUVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkRyYWdnaW5nKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2RyYWdTdGFydCcsIHRoaXMuX29yaWdpbmFsRXZlbnQucGFnZVgsIHRoaXMuX29yaWdpbmFsRXZlbnQucGFnZVkpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnZHJhZycsIDAsIDAsIHRoaXMuX29yaWdpbmFsRXZlbnQpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQnJvd3NlclBvcG91dCB9IGZyb20gJy4uL2NvbnRyb2xzL2Jyb3dzZXItcG9wb3V0JztcclxuaW1wb3J0IHsgVGFiIH0gZnJvbSAnLi4vY29udHJvbHMvdGFiJztcclxuaW1wb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4uL2l0ZW1zL2NvbXBvbmVudC1pdGVtJztcclxuXHJcbi8qKlxyXG4gKiBBIGdlbmVyaWMgYW5kIHZlcnkgZmFzdCBFdmVudEVtaXR0ZXIgaW1wbGVtZW50YXRpb24uIE9uIHRvcCBvZiBlbWl0dGluZyB0aGUgYWN0dWFsIGV2ZW50IGl0IGVtaXRzIGFuXHJcbiAqIHtAbGluayAoRXZlbnRFbWl0dGVyOm5hbWVzcGFjZSkuQUxMX0VWRU5UfSBldmVudCBmb3IgZXZlcnkgZXZlbnQgdHJpZ2dlcmVkLiBUaGlzIGFsbG93cyB0byBob29rIGludG8gaXQgYW5kIHByb3h5IGV2ZW50cyBmb3J3YXJkc1xyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRXZlbnRFbWl0dGVyIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2FsbEV2ZW50U3Vic2NyaXB0aW9uczogRXZlbnRFbWl0dGVyLlVua25vd25DYWxsYmFja1tdID0gW107XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9zdWJzY3JpcHRpb25zTWFwID0gbmV3IE1hcDxzdHJpbmcsIEV2ZW50RW1pdHRlci5Vbmtub3duQ2FsbGJhY2tbXT4oKTtcclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICB0cnlCdWJibGVFdmVudChuYW1lOiBzdHJpbmcsIGFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xyXG4gICAgICAgIC8vIG92ZXJyaWRkZW4gYnkgQ29udGVudEl0ZW1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtaXQgYW4gZXZlbnQgYW5kIG5vdGlmeSBsaXN0ZW5lcnNcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50XHJcbiAgICAgKiBAcGFyYW0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGxpc3RlbmVyXHJcbiAgICAgKi9cclxuICAgIGVtaXQ8SyBleHRlbmRzIGtleW9mIEV2ZW50RW1pdHRlci5FdmVudFBhcmFtc01hcD4oZXZlbnROYW1lOiBLLCAuLi5hcmdzOiBFdmVudEVtaXR0ZXIuRXZlbnRQYXJhbXNNYXBbS10pOiB2b2lkIHtcclxuICAgICAgICBsZXQgc3ViY3JpcHRpb25zID0gdGhpcy5fc3Vic2NyaXB0aW9uc01hcC5nZXQoZXZlbnROYW1lKTtcclxuXHJcbiAgICAgICAgaWYgKHN1YmNyaXB0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHN1YmNyaXB0aW9ucyA9IHN1YmNyaXB0aW9ucy5zbGljZSgpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1YmNyaXB0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gc3ViY3JpcHRpb25zW2ldO1xyXG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uKC4uLmFyZ3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmVtaXRBbGxFdmVudChldmVudE5hbWUsIGFyZ3MpO1xyXG4gICAgICAgIHRoaXMudHJ5QnViYmxlRXZlbnQoZXZlbnROYW1lLCBhcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBlbWl0VW5rbm93bihldmVudE5hbWU6IHN0cmluZywgLi4uYXJnczogRXZlbnRFbWl0dGVyLlVua25vd25QYXJhbXMpOiB2b2lkIHtcclxuICAgICAgICBsZXQgc3VicyA9IHRoaXMuX3N1YnNjcmlwdGlvbnNNYXAuZ2V0KGV2ZW50TmFtZSk7XHJcblxyXG4gICAgICAgIGlmIChzdWJzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgc3VicyA9IHN1YnMuc2xpY2UoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBzdWJzW2ldKC4uLmFyZ3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmVtaXRBbGxFdmVudChldmVudE5hbWUsIGFyZ3MpO1xyXG4gICAgICAgIHRoaXMudHJ5QnViYmxlRXZlbnQoZXZlbnROYW1lLCBhcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiBAaW50ZXJuYWwgKiovXHJcbiAgICBlbWl0QmFzZUJ1YmJsaW5nRXZlbnQ8SyBleHRlbmRzIGtleW9mIEV2ZW50RW1pdHRlci5FdmVudFBhcmFtc01hcD4oZXZlbnROYW1lOiBLKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyLkJ1YmJsaW5nRXZlbnQoZXZlbnROYW1lLCB0aGlzKTtcclxuICAgICAgICB0aGlzLmVtaXRVbmtub3duKGV2ZW50TmFtZSwgZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGVtaXRVbmtub3duQnViYmxpbmdFdmVudChldmVudE5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlci5CdWJibGluZ0V2ZW50KGV2ZW50TmFtZSwgdGhpcyk7XHJcbiAgICAgICAgdGhpcy5lbWl0VW5rbm93bihldmVudE5hbWUsIGV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmb3IgYW4gZXZlbnQuXHJcbiAgICAgKiBAcGFyYW0gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50XHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgcHJldmlvdXNseSByZWdpc3RlcmVkIGNhbGxiYWNrIG1ldGhvZCAob3B0aW9uYWwpXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXI8SyBleHRlbmRzIGtleW9mIEV2ZW50RW1pdHRlci5FdmVudFBhcmFtc01hcD4oZXZlbnROYW1lOiBLLCBjYWxsYmFjazogRXZlbnRFbWl0dGVyLkNhbGxiYWNrPEs+KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdW5rbm93bkNhbGxiYWNrID0gY2FsbGJhY2sgYXMgRXZlbnRFbWl0dGVyLlVua25vd25DYWxsYmFjaztcclxuICAgICAgICB0aGlzLnJlbW92ZVVua25vd25FdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgdW5rbm93bkNhbGxiYWNrKTtcclxuICAgIH1cclxuXHJcbiAgICBvZmY8SyBleHRlbmRzIGtleW9mIEV2ZW50RW1pdHRlci5FdmVudFBhcmFtc01hcD4oZXZlbnROYW1lOiBLLCBjYWxsYmFjazogRXZlbnRFbWl0dGVyLkNhbGxiYWNrPEs+KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgY2FsbGJhY2spO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWxpYXMgZm9yIG9mZlxyXG4gICAgICovXHJcbiAgICB1bmJpbmQgPSB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbGlhcyBmb3IgZW1pdFxyXG4gICAgICovXHJcbiAgICB0cmlnZ2VyID0gdGhpcy5lbWl0O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGlzdGVuIGZvciBldmVudHNcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIGxpc3RlbiB0b1xyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgb2NjdXJzXHJcbiAgICAgKi9cclxuICAgIGFkZEV2ZW50TGlzdGVuZXI8SyBleHRlbmRzIGtleW9mIEV2ZW50RW1pdHRlci5FdmVudFBhcmFtc01hcD4oZXZlbnROYW1lOiBLLCBjYWxsYmFjazogRXZlbnRFbWl0dGVyLkNhbGxiYWNrPEs+KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdW5rbm93bkNhbGxiYWNrID0gY2FsbGJhY2sgYXMgRXZlbnRFbWl0dGVyLlVua25vd25DYWxsYmFjaztcclxuICAgICAgICB0aGlzLmFkZFVua25vd25FdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgdW5rbm93bkNhbGxiYWNrKTtcclxuICAgIH1cclxuXHJcbiAgICBvbjxLIGV4dGVuZHMga2V5b2YgRXZlbnRFbWl0dGVyLkV2ZW50UGFyYW1zTWFwPihldmVudE5hbWU6IEssIGNhbGxiYWNrOiBFdmVudEVtaXR0ZXIuQ2FsbGJhY2s8Sz4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBjYWxsYmFjayk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBhZGRVbmtub3duRXZlbnRMaXN0ZW5lcihldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6IEV2ZW50RW1pdHRlci5Vbmtub3duQ2FsbGJhY2spOiB2b2lkIHtcclxuICAgICAgICBpZiAoZXZlbnROYW1lID09PSBFdmVudEVtaXR0ZXIuQUxMX0VWRU5UKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2FsbEV2ZW50U3Vic2NyaXB0aW9ucy5wdXNoKGNhbGxiYWNrKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgc3Vic2NyaXB0aW9ucyA9IHRoaXMuX3N1YnNjcmlwdGlvbnNNYXAuZ2V0KGV2ZW50TmFtZSk7XHJcbiAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb25zICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbnMucHVzaChjYWxsYmFjayk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25zID0gW2NhbGxiYWNrXTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbnNNYXAuc2V0KGV2ZW50TmFtZSwgc3Vic2NyaXB0aW9ucyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZW1vdmVVbmtub3duRXZlbnRMaXN0ZW5lcihldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6IEV2ZW50RW1pdHRlci5Vbmtub3duQ2FsbGJhY2spOiB2b2lkIHtcclxuICAgICAgICBpZiAoZXZlbnROYW1lID09PSBFdmVudEVtaXR0ZXIuQUxMX0VWRU5UKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlU3Vic2NyaXB0aW9uKGV2ZW50TmFtZSwgdGhpcy5fYWxsRXZlbnRTdWJzY3JpcHRpb25zLCBjYWxsYmFjayk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IHRoaXMuX3N1YnNjcmlwdGlvbnNNYXAuZ2V0KGV2ZW50TmFtZSk7XHJcbiAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb25zID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gc3Vic2NyaWJ0aW9ucyB0byB1bnN1YnNjcmliZSBmb3IgZXZlbnQgJyArIGV2ZW50TmFtZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZVN1YnNjcmlwdGlvbihldmVudE5hbWUsIHN1YnNjcmlwdGlvbnMsIGNhbGxiYWNrKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlbW92ZVN1YnNjcmlwdGlvbihldmVudE5hbWU6IHN0cmluZywgc3Vic2NyaXB0aW9uczogRXZlbnRFbWl0dGVyLlVua25vd25DYWxsYmFja1tdLCBjYWxsYmFjazogRXZlbnRFbWl0dGVyLlVua25vd25DYWxsYmFjaykge1xyXG4gICAgICAgIGNvbnN0IGlkeCA9IHN1YnNjcmlwdGlvbnMuaW5kZXhPZihjYWxsYmFjayk7XHJcbiAgICAgICAgaWYgKGlkeCA8IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3RoaW5nIHRvIHVuYmluZCBmb3IgJyArIGV2ZW50TmFtZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc3Vic2NyaXB0aW9ucy5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBlbWl0QWxsRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGFyZ3M6IHVua25vd25bXSkge1xyXG4gICAgICAgIGNvbnN0IGFsbEV2ZW50U3Vic2NyaXB0aW9uc0NvdW50ID0gdGhpcy5fYWxsRXZlbnRTdWJzY3JpcHRpb25zLmxlbmd0aDtcclxuICAgICAgICBpZiAoYWxsRXZlbnRTdWJzY3JpcHRpb25zQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHVua25vd25BcmdzID0gYXJncy5zbGljZSgpIGFzIEV2ZW50RW1pdHRlci5Vbmtub3duUGFyYW1zO1xyXG4gICAgICAgICAgICB1bmtub3duQXJncy51bnNoaWZ0KGV2ZW50TmFtZSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBhbGxFdmVudFN1YmNyaXB0aW9ucyA9IHRoaXMuX2FsbEV2ZW50U3Vic2NyaXB0aW9ucy5zbGljZSgpO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxFdmVudFN1YnNjcmlwdGlvbnNDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBhbGxFdmVudFN1YmNyaXB0aW9uc1tpXSguLi51bmtub3duQXJncyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgRXZlbnRFbWl0dGVyIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRoYXQncyB0cmlnZ2VyZWQgZm9yIGV2ZXJ5IGV2ZW50XHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBjb25zdCBBTExfRVZFTlQgPSAnX19hbGwnO1xyXG5cclxuICAgIGV4cG9ydCBjb25zdCBoZWFkZXJDbGlja0V2ZW50TmFtZSA9ICdzdGFja0hlYWRlckNsaWNrJztcclxuICAgIGV4cG9ydCBjb25zdCBoZWFkZXJUb3VjaFN0YXJ0RXZlbnROYW1lID0gJ3N0YWNrSGVhZGVyVG91Y2hTdGFydCc7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgVW5rbm93bkNhbGxiYWNrID0gKHRoaXM6IHZvaWQsIC4uLmFyZ3M6IFVua25vd25QYXJhbXMpID0+IHZvaWQ7XHJcbiAgICBleHBvcnQgdHlwZSBDYWxsYmFjazxLIGV4dGVuZHMga2V5b2YgRXZlbnRFbWl0dGVyLkV2ZW50UGFyYW1zTWFwPiA9ICh0aGlzOiB2b2lkLCAuLi5hcmdzOiBFdmVudFBhcmFtc01hcFtLXSkgPT4gdm9pZDtcclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIEV2ZW50UGFyYW1zTWFwIHtcclxuICAgICAgICBcIl9fYWxsXCI6IFVua25vd25QYXJhbXM7XHJcbiAgICAgICAgXCJhY3RpdmVDb250ZW50SXRlbUNoYW5nZWRcIjogQ29tcG9uZW50SXRlbVBhcmFtO1xyXG4gICAgICAgIFwiY2xvc2VcIjogTm9QYXJhbXM7XHJcbiAgICAgICAgXCJjbG9zZWRcIjogTm9QYXJhbXM7XHJcbiAgICAgICAgXCJkZXN0cm95XCI6IE5vUGFyYW1zO1xyXG4gICAgICAgIFwiZHJhZ1wiOiBEcmFnUGFyYW1zO1xyXG4gICAgICAgIFwiZHJhZ1N0YXJ0XCI6IERyYWdTdGFydFBhcmFtcztcclxuICAgICAgICBcImRyYWdTdG9wXCI6IERyYWdTdG9wUGFyYW1zO1xyXG4gICAgICAgIFwiaGlkZVwiOiBOb1BhcmFtcztcclxuICAgICAgICBcImluaXRpYWxpc2VkXCI6IE5vUGFyYW1zO1xyXG4gICAgICAgIFwiaXRlbURyb3BwZWRcIjogQ29tcG9uZW50SXRlbVBhcmFtO1xyXG4gICAgICAgIFwibWF4aW1pc2VkXCI6IE5vUGFyYW1zO1xyXG4gICAgICAgIFwibWluaW1pc2VkXCI6IE5vUGFyYW1zO1xyXG4gICAgICAgIFwib3BlblwiOiBOb1BhcmFtcztcclxuICAgICAgICBcInBvcEluXCI6IE5vUGFyYW1zO1xyXG4gICAgICAgIFwicmVzaXplXCI6IE5vUGFyYW1zO1xyXG4gICAgICAgIFwic2hvd1wiOiBOb1BhcmFtcztcclxuICAgICAgICAvKiogQGRlcHJlY2F0ZWQgLSB1c2Ugc2hvdyBpbnN0ZWFkICovXHJcbiAgICAgICAgXCJzaG93blwiOiBOb1BhcmFtcztcclxuICAgICAgICBcInN0YXRlQ2hhbmdlZFwiOiBOb1BhcmFtcztcclxuICAgICAgICBcInRhYlwiOiBUYWJQYXJhbTtcclxuICAgICAgICBcInRhYkNyZWF0ZWRcIjogVGFiUGFyYW07XHJcbiAgICAgICAgXCJ0aXRsZUNoYW5nZWRcIjogU3RyaW5nUGFyYW07XHJcbiAgICAgICAgXCJ3aW5kb3dDbG9zZWRcIjogUG9wb3V0UGFyYW07XHJcbiAgICAgICAgXCJ3aW5kb3dPcGVuZWRcIjogUG9wb3V0UGFyYW07XHJcbiAgICAgICAgXCJiZWZvcmVDb21wb25lbnRSZWxlYXNlXCI6IEJlZm9yZUNvbXBvbmVudFJlbGVhc2VQYXJhbXM7XHJcbiAgICAgICAgXCJiZWZvcmVJdGVtRGVzdHJveWVkXCI6IEJ1YmJsaW5nRXZlbnRQYXJhbTtcclxuICAgICAgICBcIml0ZW1DcmVhdGVkXCI6IEJ1YmJsaW5nRXZlbnRQYXJhbTtcclxuICAgICAgICBcIml0ZW1EZXN0cm95ZWRcIjogQnViYmxpbmdFdmVudFBhcmFtO1xyXG4gICAgICAgIFwiZm9jdXNcIjogQnViYmxpbmdFdmVudFBhcmFtO1xyXG4gICAgICAgIFwiYmx1clwiOiBCdWJibGluZ0V2ZW50UGFyYW07XHJcbiAgICAgICAgXCJzdGFja0hlYWRlckNsaWNrXCI6IENsaWNrQnViYmxpbmdFdmVudFBhcmFtO1xyXG4gICAgICAgIFwic3RhY2tIZWFkZXJUb3VjaFN0YXJ0XCI6IFRvdWNoU3RhcnRCdWJibGluZ0V2ZW50UGFyYW07XHJcbiAgICAgICAgXCJ1c2VyQnJvYWRjYXN0XCI6IFVua25vd25QYXJhbXM7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IHR5cGUgVW5rbm93blBhcmFtcyA9IHVua25vd25bXTtcclxuICAgIGV4cG9ydCB0eXBlIE5vUGFyYW1zID0gW107XHJcbiAgICBleHBvcnQgdHlwZSBVbmtub3duUGFyYW0gPSBbdW5rbm93bl07XHJcbiAgICBleHBvcnQgdHlwZSBQb3BvdXRQYXJhbSA9IFtCcm93c2VyUG9wb3V0XTtcclxuICAgIGV4cG9ydCB0eXBlIENvbXBvbmVudEl0ZW1QYXJhbSA9IFtDb21wb25lbnRJdGVtXTtcclxuICAgIGV4cG9ydCB0eXBlIFRhYlBhcmFtID0gW1RhYl07XHJcbiAgICBleHBvcnQgdHlwZSBCdWJibGluZ0V2ZW50UGFyYW0gPSBbRXZlbnRFbWl0dGVyLkJ1YmJsaW5nRXZlbnRdXHJcbiAgICBleHBvcnQgdHlwZSBTdHJpbmdQYXJhbSA9IFtzdHJpbmddO1xyXG4gICAgZXhwb3J0IHR5cGUgRHJhZ1N0YXJ0UGFyYW1zID0gW29yaWdpbmFsWDogbnVtYmVyLCBvcmlnaW5hbFk6IG51bWJlcl07XHJcbiAgICBleHBvcnQgdHlwZSBEcmFnU3RvcFBhcmFtcyA9IFtldmVudDogUG9pbnRlckV2ZW50IHwgdW5kZWZpbmVkXTtcclxuICAgIGV4cG9ydCB0eXBlIERyYWdQYXJhbXMgPSBbb2Zmc2V0WDogbnVtYmVyLCBvZmZzZXRZOiBudW1iZXIsIGV2ZW50OiBFdmVudEVtaXR0ZXIuRHJhZ0V2ZW50XTtcclxuICAgIGV4cG9ydCB0eXBlIEJlZm9yZUNvbXBvbmVudFJlbGVhc2VQYXJhbXMgPSBbY29tcG9uZW50OiB1bmtub3duXTtcclxuICAgIGV4cG9ydCB0eXBlIENsaWNrQnViYmxpbmdFdmVudFBhcmFtID0gW0NsaWNrQnViYmxpbmdFdmVudF07XHJcbiAgICBleHBvcnQgdHlwZSBUb3VjaFN0YXJ0QnViYmxpbmdFdmVudFBhcmFtID0gW1RvdWNoU3RhcnRCdWJibGluZ0V2ZW50XTtcclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIERyYWdFdmVudCB7XHJcbiAgICAgICAgcmVhZG9ubHkgcGFnZVg6IG51bWJlcjtcclxuICAgICAgICByZWFkb25seSBwYWdlWTogbnVtYmVyO1xyXG4gICAgICAgIHJlYWRvbmx5IHNjcmVlblg6IG51bWJlcjtcclxuICAgICAgICByZWFkb25seSBzY3JlZW5ZOiBudW1iZXI7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGNsYXNzIEJ1YmJsaW5nRXZlbnQge1xyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBnZXQgbmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fbmFtZTsgfVxyXG4gICAgICAgIGdldCB0YXJnZXQoKTogRXZlbnRFbWl0dGVyIHsgcmV0dXJuIHRoaXMuX3RhcmdldDsgfVxyXG4gICAgICAgIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIChFdmVudEVtaXR0ZXI6bmFtZXNwYWNlKS4oQnViYmxpbmdFdmVudDpjbGFzcykudGFyZ2V0fSBpbnN0ZWFkICovXHJcbiAgICAgICAgZ2V0IG9yaWdpbigpOiBFdmVudEVtaXR0ZXIgeyByZXR1cm4gdGhpcy5fdGFyZ2V0OyB9XHJcbiAgICAgICAgZ2V0IGlzUHJvcGFnYXRpb25TdG9wcGVkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5faXNQcm9wYWdhdGlvblN0b3BwZWQ7IH1cclxuXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX25hbWU6IHN0cmluZyxcclxuICAgICAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF90YXJnZXQ6IEV2ZW50RW1pdHRlcikge1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3RvcFByb3BhZ2F0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgICAgICB0aGlzLl9pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBjbGFzcyBDbGlja0J1YmJsaW5nRXZlbnQgZXh0ZW5kcyBCdWJibGluZ0V2ZW50IHtcclxuICAgICAgICBnZXQgbW91c2VFdmVudCgpOiBNb3VzZUV2ZW50IHsgcmV0dXJuIHRoaXMuX21vdXNlRXZlbnQ7IH1cclxuXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgdGFyZ2V0OiBFdmVudEVtaXR0ZXIsXHJcbiAgICAgICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfbW91c2VFdmVudDogTW91c2VFdmVudFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBzdXBlcihuYW1lLCB0YXJnZXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgY2xhc3MgVG91Y2hTdGFydEJ1YmJsaW5nRXZlbnQgZXh0ZW5kcyBCdWJibGluZ0V2ZW50IHtcclxuICAgICAgICBnZXQgdG91Y2hFdmVudCgpOiBUb3VjaEV2ZW50IHsgcmV0dXJuIHRoaXMuX3RvdWNoRXZlbnQ7IH1cclxuXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgdGFyZ2V0OiBFdmVudEVtaXR0ZXIsXHJcbiAgICAgICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfdG91Y2hFdmVudDogVG91Y2hFdmVudFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBzdXBlcihuYW1lLCB0YXJnZXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBVbmV4cGVjdGVkTnVsbEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi9ldmVudC1lbWl0dGVyJztcclxuXHJcbi8vIEFkZCBvdXIgQ2hpbGRFdmVudCB0byBXaW5kb3dFdmVudE1hcCBmb3IgdHlwZSBzYWZldHlcclxuLyoqIEBwdWJsaWMgKi9cclxuZGVjbGFyZSBnbG9iYWwge1xyXG4gICAgaW50ZXJmYWNlIFdpbmRvd0V2ZW50TWFwIHtcclxuICAgICAgICBbRXZlbnRIdWIuQ2hpbGRFdmVudE5hbWVdOiBDdXN0b21FdmVudDxFdmVudEh1Yi5DaGlsZEV2ZW50RGV0YWlsPjtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEFuIEV2ZW50RW1pdHRlciBzaW5nbGV0b24gdGhhdCBwcm9wYWdhdGVzIGV2ZW50c1xyXG4gKiBhY3Jvc3MgbXVsdGlwbGUgd2luZG93cy4gVGhpcyBpcyBhIGxpdHRsZSBiaXQgdHJpY2tpZXIgc2luY2VcclxuICogd2luZG93cyBhcmUgYWxsb3dlZCB0byBvcGVuIGNoaWxkV2luZG93cyBpbiB0aGVpciBvd24gcmlnaHQuXHJcbiAqXHJcbiAqIFRoaXMgbWVhbnMgdGhhdCB3ZSBkZWFsIHdpdGggYSB0cmVlIG9mIHdpbmRvd3MuIFRoZXJlZm9yZSwgd2UgZG8gdGhlIGV2ZW50IHByb3BhZ2F0aW9uIGluIHR3byBwaGFzZXM6XHJcbiAqXHJcbiAqIC0gUHJvcGFnYXRlIGV2ZW50cyBmcm9tIHRoaXMgbGF5b3V0IHRvIHRoZSBwYXJlbnQgbGF5b3V0XHJcbiAqICAgLSBSZXBlYXQgdW50aWwgdGhlIGV2ZW50IGFycml2ZWQgYXQgdGhlIHJvb3QgbGF5b3V0XHJcbiAqIC0gUHJvcGFnYXRlIGV2ZW50cyB0byB0aGlzIGxheW91dCBhbmQgdG8gYWxsIGNoaWxkcmVuXHJcbiAqICAgLSBSZXBlYXQgdW50aWwgYWxsIGxheW91dHMgZ290IHRoZSBldmVudFxyXG4gKlxyXG4gKiAqKldBUk5JTkcqKjogT25seSB1c2VyQnJvYWRjYXN0IGV2ZW50cyBhcmUgcHJvcGFnYXRlZCBiZXR3ZWVuIHdpbmRvd3MuXHJcbiAqIFRoaXMgbWVhbnMgdGhlIHlvdSBoYXZlIHRvIHRha2UgY2FyZSBvZiBwcm9wYWdhdGluZyBzdGF0ZSBjaGFuZ2VzIGJldHdlZW4gd2luZG93cyB5b3Vyc2VsZi5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEV2ZW50SHViIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9jaGlsZEV2ZW50TGlzdGVuZXIgPSAoY2hpbGRFdmVudDogQ3VzdG9tRXZlbnQ8RXZlbnRIdWIuQ2hpbGRFdmVudERldGFpbD4pID0+IHRoaXMub25FdmVudEZyb21DaGlsZChjaGlsZEV2ZW50KTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgRXZlbnRIdWIgaW5zdGFuY2VcclxuICAgICAqIEBwYXJhbSBfbGF5b3V0TWFuYWdlciAtIHRoZSBsYXlvdXQgbWFuYWdlciB0byBzeW5jaHJvbml6ZSBiZXR3ZWVuIHRoZSB3aW5kb3dzXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2xheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXJcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgZ2xvYmFsVGhpcy5hZGRFdmVudExpc3RlbmVyKEV2ZW50SHViLkNoaWxkRXZlbnROYW1lLCB0aGlzLl9jaGlsZEV2ZW50TGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtaXQgYW4gZXZlbnQgYW5kIG5vdGlmeSBsaXN0ZW5lcnNcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50XHJcbiAgICAgKiBAcGFyYW0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGxpc3RlbmVyXHJcbiAgICAgKiBAcHVibGljXHJcbiAgICAgKi9cclxuICAgIG92ZXJyaWRlIGVtaXQ8SyBleHRlbmRzIGtleW9mIEV2ZW50RW1pdHRlci5FdmVudFBhcmFtc01hcD4oZXZlbnROYW1lOiBLLCAuLi5hcmdzOiBFdmVudEVtaXR0ZXIuRXZlbnRQYXJhbXNNYXBbS10pOiB2b2lkIHtcclxuICAgICAgICBpZiAoZXZlbnROYW1lID09PSAndXNlckJyb2FkY2FzdCcpIHtcclxuICAgICAgICAgICAgLy8gRXhwbGljaXRseSByZWRpcmVjdCB0aGUgdXNlciBicm9hZGNhc3QgdG8gb3VyIG92ZXJyaWRkZW4gbWV0aG9kLlxyXG4gICAgICAgICAgICB0aGlzLmVtaXRVc2VyQnJvYWRjYXN0KC4uLmFyZ3MpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHN1cGVyLmVtaXQoZXZlbnROYW1lLCAuLi5hcmdzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCcm9hZGNhc3RzIGEgbWVzc2FnZSB0byBhbGwgb3RoZXIgY3VycmVudGx5IG9wZW5lZCB3aW5kb3dzLlxyXG4gICAgICogQHB1YmxpY1xyXG4gICAgICovXHJcbiAgICBlbWl0VXNlckJyb2FkY2FzdCguLi5hcmdzOiBFdmVudEVtaXR0ZXIuVW5rbm93blBhcmFtcyk6IHZvaWQge1xyXG4gICAgICAgIC8vIFN0ZXAgMTogQnViYmxlIHVwIHRoZSBldmVudFxyXG4gICAgICAgIHRoaXMuaGFuZGxlVXNlckJyb2FkY2FzdEV2ZW50KCd1c2VyQnJvYWRjYXN0JywgYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGUgRXZlbnRIdWJcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIGdsb2JhbFRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihFdmVudEh1Yi5DaGlsZEV2ZW50TmFtZSwgdGhpcy5fY2hpbGRFdmVudExpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEludGVybmFsIHByb2Nlc3NvciB0byBwcm9jZXNzIGxvY2FsIGV2ZW50cy5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGhhbmRsZVVzZXJCcm9hZGNhc3RFdmVudChldmVudE5hbWU6IHN0cmluZywgYXJnczogdW5rbm93bltdKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2xheW91dE1hbmFnZXIuaXNTdWJXaW5kb3cpIHtcclxuICAgICAgICAgICAgLy8gV2UgYXJlIGEgc3ViIHdpbmRvdyBhbmQgcmVjZWl2ZWQgYW4gZXZlbnQgZnJvbSBvbmUgb2Ygb3VyIGNoaWxkcmVuLlxyXG4gICAgICAgICAgICAvLyBTbyBwcm9wYWdhdGUgaXQgdG8gdGhlIFJvb3QuXHJcbiAgICAgICAgICAgIHRoaXMucHJvcGFnYXRlVG9QYXJlbnQoZXZlbnROYW1lLCBhcmdzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBXZSBhcmUgdGhlIHJvb3Qgd2luZG93LCBwcm9wYWdhdGUgaXQgdG8gdGhlIHN1YnRyZWUgYmVsb3cgdXMuXHJcbiAgICAgICAgICAgIHRoaXMucHJvcGFnYXRlVG9UaGlzQW5kU3VidHJlZShldmVudE5hbWUsIGFyZ3MpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxiYWNrIGZvciBjaGlsZCBldmVudHMgcmFpc2VkIG9uIHRoZSB3aW5kb3dcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uRXZlbnRGcm9tQ2hpbGQoZXZlbnQ6IEN1c3RvbUV2ZW50PEV2ZW50SHViLkNoaWxkRXZlbnREZXRhaWw+KSB7XHJcbiAgICAgICAgY29uc3QgZGV0YWlsID0gZXZlbnQuZGV0YWlsO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlVXNlckJyb2FkY2FzdEV2ZW50KGRldGFpbC5ldmVudE5hbWUsIGRldGFpbC5hcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb3BhZ2F0ZXMgdGhlIGV2ZW50IHRvIHRoZSBwYXJlbnQgYnkgZW1pdHRpbmdcclxuICAgICAqIGl0IG9uIHRoZSBwYXJlbnQncyBET00gd2luZG93XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBwcm9wYWdhdGVUb1BhcmVudChldmVudE5hbWU6IHN0cmluZywgYXJnczogdW5rbm93bltdKSB7XHJcbiAgICAgICAgY29uc3QgZGV0YWlsOiBFdmVudEh1Yi5DaGlsZEV2ZW50RGV0YWlsID0ge1xyXG4gICAgICAgICAgICBsYXlvdXRNYW5hZ2VyOiB0aGlzLl9sYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgICAgICBldmVudE5hbWUsXHJcbiAgICAgICAgICAgIGFyZ3M6IGFyZ3MsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBldmVudEluaXQ6IEV2ZW50SHViLkNoaWxkRXZlbnRJbml0ID0ge1xyXG4gICAgICAgICAgICBidWJibGVzOiB0cnVlLFxyXG4gICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgICBkZXRhaWwsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8RXZlbnRIdWIuQ2hpbGRFdmVudERldGFpbD4oRXZlbnRIdWIuQ2hpbGRFdmVudE5hbWUsIGV2ZW50SW5pdCk7XHJcbiAgICAgICAgY29uc3Qgb3BlbmVyID0gZ2xvYmFsVGhpcy5vcGVuZXI7XHJcbiAgICAgICAgaWYgKG9wZW5lciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignRUhQVFAxNTc3OCcpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBvcGVuZXIuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9wYWdhdGUgZXZlbnRzIHRvIHRoZSB3aG9sZSBzdWJ0cmVlIHVuZGVyIHRoaXMgZXZlbnQgaHViLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcHJvcGFnYXRlVG9UaGlzQW5kU3VidHJlZShldmVudE5hbWU6IHN0cmluZywgYXJnczogdW5rbm93bltdKSB7XHJcbiAgICAgICAgdGhpcy5lbWl0VW5rbm93bihldmVudE5hbWUsIC4uLmFyZ3MpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGF5b3V0TWFuYWdlci5vcGVuUG9wb3V0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjaGlsZEdsID0gdGhpcy5fbGF5b3V0TWFuYWdlci5vcGVuUG9wb3V0c1tpXS5nZXRHbEluc3RhbmNlKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2hpbGRHbCkge1xyXG4gICAgICAgICAgICAgICAgY2hpbGRHbC5ldmVudEh1Yi5wcm9wYWdhdGVUb1RoaXNBbmRTdWJ0cmVlKGV2ZW50TmFtZSwgYXJncyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgRXZlbnRIdWIge1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBjb25zdCBDaGlsZEV2ZW50TmFtZSA9ICdnbF9jaGlsZF9ldmVudCc7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ2hpbGRFdmVudERldGFpbCA9IHtcclxuICAgICAgICBsYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyO1xyXG4gICAgICAgIGV2ZW50TmFtZTogc3RyaW5nO1xyXG4gICAgICAgIGFyZ3M6IHVua25vd25bXTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ2hpbGRFdmVudEluaXQgPSBDdXN0b21FdmVudEluaXQ8Q2hpbGRFdmVudERldGFpbD47XHJcbn1cclxuIiwiaW1wb3J0IHsgQXNzZXJ0RXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGNvbnN0IGVudW0gSTE4blN0cmluZ0lkIHtcclxuICAgIFBvcG91dENhbm5vdEJlQ3JlYXRlZFdpdGhHcm91bmRJdGVtQ29uZmlnLFxyXG4gICAgUGxlYXNlUmVnaXN0ZXJBQ29uc3RydWN0b3JGdW5jdGlvbixcclxuICAgIENvbXBvbmVudFR5cGVOb3RSZWdpc3RlcmVkQW5kQmluZENvbXBvbmVudEV2ZW50SGFuZGxlck5vdEFzc2lnbmVkLFxyXG4gICAgQ29tcG9uZW50SXNBbHJlYWR5UmVnaXN0ZXJlZCxcclxuICAgIENvbXBvbmVudElzTm90VmlydHVhYmxlLFxyXG4gICAgVmlydHVhbENvbXBvbmVudERvZXNOb3RIYXZlUm9vdEh0bWxFbGVtZW50LFxyXG4gICAgSXRlbUNvbmZpZ0lzTm90VHlwZUNvbXBvbmVudCxcclxuICAgIEludmFsaWROdW1iZXJQYXJ0SW5TaXplU3RyaW5nLFxyXG4gICAgVW5rbm93blVuaXRJblNpemVTdHJpbmcsXHJcbiAgICBVbnN1cHBvcnRlZFVuaXRJblNpemVTdHJpbmcsXHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgSTE4blN0cmluZ3Mge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgbGV0IGluaXRpYWxpc2VkID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgaW50ZXJmYWNlIEluZm8ge1xyXG4gICAgICAgIHJlYWRvbmx5IGlkOiBJMThuU3RyaW5nSWQ7XHJcbiAgICAgICAgcmVhZG9ubHkgZGVmYXVsdDogc3RyaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHR5cGUgSW5mb3NPYmplY3QgPSB7IFtpZCBpbiBrZXlvZiB0eXBlb2YgSTE4blN0cmluZ0lkXTogSW5mbyB9O1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0IGluZm9zT2JqZWN0OiBJbmZvc09iamVjdCA9IHtcclxuICAgICAgICBQb3BvdXRDYW5ub3RCZUNyZWF0ZWRXaXRoR3JvdW5kSXRlbUNvbmZpZzoge1xyXG4gICAgICAgICAgICBpZDogSTE4blN0cmluZ0lkLlBvcG91dENhbm5vdEJlQ3JlYXRlZFdpdGhHcm91bmRJdGVtQ29uZmlnLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnUG9wb3V0IGNhbm5vdCBiZSBjcmVhdGVkIHdpdGggZ3JvdW5kIEl0ZW1Db25maWcnXHJcbiAgICAgICAgfSxcclxuICAgICAgICBQbGVhc2VSZWdpc3RlckFDb25zdHJ1Y3RvckZ1bmN0aW9uOiB7XHJcbiAgICAgICAgICAgIGlkOiBJMThuU3RyaW5nSWQuUGxlYXNlUmVnaXN0ZXJBQ29uc3RydWN0b3JGdW5jdGlvbixcclxuICAgICAgICAgICAgZGVmYXVsdDogJ1BsZWFzZSByZWdpc3RlciBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgQ29tcG9uZW50VHlwZU5vdFJlZ2lzdGVyZWRBbmRCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyTm90QXNzaWduZWQ6IHtcclxuICAgICAgICAgICAgaWQ6IEkxOG5TdHJpbmdJZC5Db21wb25lbnRUeXBlTm90UmVnaXN0ZXJlZEFuZEJpbmRDb21wb25lbnRFdmVudEhhbmRsZXJOb3RBc3NpZ25lZCxcclxuICAgICAgICAgICAgZGVmYXVsdDogJ0NvbXBvbmVudCB0eXBlIG5vdCByZWdpc3RlcmVkIGFuZCBCaW5kQ29tcG9uZW50RXZlbnQgaGFuZGxlciBub3QgYXNzaWduZWQnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgQ29tcG9uZW50SXNBbHJlYWR5UmVnaXN0ZXJlZDoge1xyXG4gICAgICAgICAgICBpZDogSTE4blN0cmluZ0lkLkNvbXBvbmVudElzQWxyZWFkeVJlZ2lzdGVyZWQsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICdDb21wb25lbnQgaXMgYWxyZWFkeSByZWdpc3RlcmVkJyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIENvbXBvbmVudElzTm90VmlydHVhYmxlOiB7XHJcbiAgICAgICAgICAgIGlkOiBJMThuU3RyaW5nSWQuQ29tcG9uZW50SXNOb3RWaXJ0dWFibGUsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICdDb21wb25lbnQgaXMgbm90IHZpcnR1YWJsZS4gUmVxdWlyZXMgcm9vdEh0bWxFbGVtZW50IGZpZWxkL2dldHRlcicsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBWaXJ0dWFsQ29tcG9uZW50RG9lc05vdEhhdmVSb290SHRtbEVsZW1lbnQ6IHtcclxuICAgICAgICAgICAgaWQ6IEkxOG5TdHJpbmdJZC5WaXJ0dWFsQ29tcG9uZW50RG9lc05vdEhhdmVSb290SHRtbEVsZW1lbnQsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICdWaXJ0dWFsIGNvbXBvbmVudCBkb2VzIG5vdCBoYXZlIGdldHRlciBcInJvb3RIdG1sRWxlbWVudFwiJyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIEl0ZW1Db25maWdJc05vdFR5cGVDb21wb25lbnQ6IHtcclxuICAgICAgICAgICAgaWQ6IEkxOG5TdHJpbmdJZC5JdGVtQ29uZmlnSXNOb3RUeXBlQ29tcG9uZW50LFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnSXRlbUNvbmZpZyBpcyBub3Qgb2YgdHlwZSBjb21wb25lbnQnLFxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIEludmFsaWROdW1iZXJQYXJ0SW5TaXplU3RyaW5nOiB7XHJcbiAgICAgICAgICAgIGlkOiBJMThuU3RyaW5nSWQuSW52YWxpZE51bWJlclBhcnRJblNpemVTdHJpbmcsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICdJbnZhbGlkIG51bWJlciBwYXJ0IGluIHNpemUgc3RyaW5nJyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIFVua25vd25Vbml0SW5TaXplU3RyaW5nOiB7XHJcbiAgICAgICAgICAgIGlkOiBJMThuU3RyaW5nSWQuVW5rbm93blVuaXRJblNpemVTdHJpbmcsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICdVbmtub3duIHVuaXQgaW4gc2l6ZSBzdHJpbmcnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgVW5zdXBwb3J0ZWRVbml0SW5TaXplU3RyaW5nOiB7XHJcbiAgICAgICAgICAgIGlkOiBJMThuU3RyaW5nSWQuVW5zdXBwb3J0ZWRVbml0SW5TaXplU3RyaW5nLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnVW5zdXBwb3J0ZWQgdW5pdCBpbiBzaXplIHN0cmluZycsXHJcbiAgICAgICAgfSxcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgY29uc3QgaWRDb3VudCA9IE9iamVjdC5rZXlzKGluZm9zT2JqZWN0KS5sZW5ndGg7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdCBpbmZvcyA9IE9iamVjdC52YWx1ZXMoaW5mb3NPYmplY3QpO1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjaGVja0luaXRpYWxpc2UoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFpbml0aWFsaXNlZCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5mbyA9IGluZm9zW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZm8uaWQgIT09IGkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0lOU0kwMDExMCcsIGAke2l9OiAke2luZm8uaWR9YCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGkxOG5TdHJpbmdzW2ldID0gaW5mby5kZWZhdWx0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGluaXRpYWxpc2VkID0gdHJ1ZTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGNvbnN0IGkxOG5TdHJpbmdzID0gbmV3IEFycmF5PHN0cmluZz4oSTE4blN0cmluZ3MuaWRDb3VudCk7XHJcbiIsIi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgU3R5bGVDb25zdGFudHMge1xyXG4gICAgZXhwb3J0IGNvbnN0IGRlZmF1bHRDb21wb25lbnRCYXNlWkluZGV4ID0gJ2F1dG8nO1xyXG4gICAgZXhwb3J0IGNvbnN0IGRlZmF1bHRDb21wb25lbnREcmFnWkluZGV4ID0gJzMyJztcclxuICAgIGV4cG9ydCBjb25zdCBkZWZhdWx0Q29tcG9uZW50U3RhY2tNYXhpbWlzZWRaSW5kZXggPSAnNDEnO1xyXG59XHJcbiIsImltcG9ydCB7IFVucmVhY2hhYmxlQ2FzZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgU3R5bGVDb25zdGFudHMgfSBmcm9tICcuL3N0eWxlLWNvbnN0YW50cyc7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCB0eXBlIFdpZHRoT3JIZWlnaHRQcm9wZXJ0eU5hbWUgPSAnd2lkdGgnIHwgJ2hlaWdodCc7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgV2lkdGhPckhlaWdodFByb3BlcnR5TmFtZSB7XHJcbiAgICBleHBvcnQgY29uc3Qgd2lkdGggPSAnd2lkdGgnO1xyXG4gICAgZXhwb3J0IGNvbnN0IGhlaWdodCA9ICdoZWlnaHQnO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgV2lkdGhBbmRIZWlnaHQge1xyXG4gICAgd2lkdGg6IG51bWJlcjtcclxuICAgIGhlaWdodDogbnVtYmVyO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGVmdEFuZFRvcCB7XHJcbiAgICBsZWZ0OiBudW1iZXI7XHJcbiAgICB0b3A6IG51bWJlcjtcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IHR5cGUgU2lkZSA9ICd0b3AnIHwgJ2xlZnQnIHwgJ3JpZ2h0JyB8ICdib3R0b20nO1xyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFNpZGUge1xyXG4gICAgZXhwb3J0IGNvbnN0IHRvcCA9ICd0b3AnO1xyXG4gICAgZXhwb3J0IGNvbnN0IGxlZnQgPSAnbGVmdCc7XHJcbiAgICBleHBvcnQgY29uc3QgcmlnaHQgPSAncmlnaHQnO1xyXG4gICAgZXhwb3J0IGNvbnN0IGJvdHRvbSA9ICdib3R0b20nO1xyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgdHlwZSBMb2dpY2FsWkluZGV4ID0gJ2Jhc2UnIHwgJ2RyYWcnIHwgJ3N0YWNrTWF4aW1pc2VkJztcclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBMb2dpY2FsWkluZGV4IHtcclxuICAgIGV4cG9ydCBjb25zdCBiYXNlID0gJ2Jhc2UnO1xyXG4gICAgZXhwb3J0IGNvbnN0IGRyYWcgPSAnZHJhZyc7XHJcbiAgICBleHBvcnQgY29uc3Qgc3RhY2tNYXhpbWlzZWQgPSAnc3RhY2tNYXhpbWlzZWQnO1xyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY29uc3QgTG9naWNhbFpJbmRleFRvRGVmYXVsdE1hcCA9IHtcclxuICAgIGJhc2U6IFN0eWxlQ29uc3RhbnRzLmRlZmF1bHRDb21wb25lbnRCYXNlWkluZGV4LFxyXG4gICAgZHJhZzogU3R5bGVDb25zdGFudHMuZGVmYXVsdENvbXBvbmVudERyYWdaSW5kZXgsXHJcbiAgICBzdGFja01heGltaXNlZDogU3R5bGVDb25zdGFudHMuZGVmYXVsdENvbXBvbmVudFN0YWNrTWF4aW1pc2VkWkluZGV4LFxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVjdCB7XHJcbiAgICBsZWZ0OiBudW1iZXIsXHJcbiAgICB0b3A6IG51bWJlcixcclxuICAgIHdpZHRoOiBudW1iZXIsXHJcbiAgICBoZWlnaHQ6IG51bWJlcixcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEFyZWFMaW5rZWRSZWN0IHtcclxuICAgIHgxOiBudW1iZXIsIC8vIGxlZnRcclxuICAgIHgyOiBudW1iZXIsIC8vIG5leHRMZWZ0XHJcbiAgICB5MTogbnVtYmVyLCAvLyB0b3BcclxuICAgIHkyOiBudW1iZXIsIC8vIG5leHRUb3BcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcclxuZXhwb3J0IHR5cGUgSnNvblZhbHVlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCBKc29uIHwgb2JqZWN0IHwgSnNvblZhbHVlQXJyYXk7XHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgSnNvbiB7XHJcbiAgICBbbmFtZTogc3RyaW5nXTogSnNvblZhbHVlO1xyXG59XHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCB0eXBlIEpzb25WYWx1ZUFycmF5ID0gQXJyYXk8SnNvblZhbHVlPlxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIEpzb25WYWx1ZSB7XHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNKc29uKHZhbHVlOiBKc29uVmFsdWUpOiB2YWx1ZSBpcyBKc29uIHtcclxuICAgICAgICByZXR1cm4gaXNKc29uT2JqZWN0KHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzSnNvbk9iamVjdCh2YWx1ZTogSnNvblZhbHVlKTogdmFsdWUgaXMgSnNvbiB8IG9iamVjdCB7XHJcbiAgICAgICAgcmV0dXJuICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgdHlwZSBJdGVtVHlwZSA9ICdncm91bmQnIHwgJ3JvdycgfCAnY29sdW1uJyB8ICdzdGFjaycgfCAnY29tcG9uZW50JztcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgSXRlbVR5cGUge1xyXG4gICAgZXhwb3J0IGNvbnN0IGdyb3VuZCA9ICdncm91bmQnO1xyXG4gICAgZXhwb3J0IGNvbnN0IHJvdyA9ICdyb3cnO1xyXG4gICAgZXhwb3J0IGNvbnN0IGNvbHVtbiA9ICdjb2x1bW4nO1xyXG4gICAgZXhwb3J0IGNvbnN0IHN0YWNrID0gJ3N0YWNrJztcclxuICAgIGV4cG9ydCBjb25zdCBjb21wb25lbnQgPSAnY29tcG9uZW50JztcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IHR5cGUgUmVzcG9uc2l2ZU1vZGUgPSAnbm9uZScgfCAnYWx3YXlzJyB8ICdvbmxvYWQnO1xyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFJlc3BvbnNpdmVNb2RlIHtcclxuICAgIGV4cG9ydCBjb25zdCBub25lID0gJ25vbmUnO1xyXG4gICAgZXhwb3J0IGNvbnN0IGFsd2F5cyA9ICdhbHdheXMnO1xyXG4gICAgZXhwb3J0IGNvbnN0IG9ubG9hZCA9ICdvbmxvYWQnO1xyXG59XHJcblxyXG4vKipcclxuICogTGVuZ3RoIHVuaXRzIHdoaWNoIGNhbiBzcGVjaWZ5IHRoZSBzaXplIG9mIGEgQ29tcG9uZW50IEl0ZW1cclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IHR5cGUgU2l6ZVVuaXQgPSAncHgnIHwgJyUnIHwgJ2ZyJyB8ICdlbSc7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgZW51bSBTaXplVW5pdEVudW0ge1xyXG4gICAgUGl4ZWwgPSAncHgnLFxyXG4gICAgUGVyY2VudCA9ICclJyxcclxuICAgIEZyYWN0aW9uYWwgPSAnZnInLFxyXG4gICAgRW0gPSAnZW0nLFxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFNpemVVbml0RW51bSB7XHJcbiAgICBleHBvcnQgZnVuY3Rpb24gdHJ5UGFyc2UodmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIHN3aXRjaCAodmFsdWUpIHtcclxuICAgICAgICAgICAgY2FzZSBTaXplVW5pdEVudW0uUGl4ZWw6IHJldHVybiBTaXplVW5pdEVudW0uUGl4ZWw7XHJcbiAgICAgICAgICAgIGNhc2UgU2l6ZVVuaXRFbnVtLlBlcmNlbnQ6IHJldHVybiBTaXplVW5pdEVudW0uUGVyY2VudDtcclxuICAgICAgICAgICAgY2FzZSBTaXplVW5pdEVudW0uRnJhY3Rpb25hbDogcmV0dXJuIFNpemVVbml0RW51bS5GcmFjdGlvbmFsO1xyXG4gICAgICAgICAgICBjYXNlIFNpemVVbml0RW51bS5FbTogcmV0dXJuIFNpemVVbml0RW51bS5FbTtcclxuICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdCh2YWx1ZTogU2l6ZVVuaXRFbnVtKSB7XHJcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBjYXNlIFNpemVVbml0RW51bS5QaXhlbDogcmV0dXJuIFNpemVVbml0RW51bS5QaXhlbDtcclxuICAgICAgICAgICAgY2FzZSBTaXplVW5pdEVudW0uUGVyY2VudDogcmV0dXJuIFNpemVVbml0RW51bS5QZXJjZW50O1xyXG4gICAgICAgICAgICBjYXNlIFNpemVVbml0RW51bS5GcmFjdGlvbmFsOiByZXR1cm4gU2l6ZVVuaXRFbnVtLkZyYWN0aW9uYWw7XHJcbiAgICAgICAgICAgIGNhc2UgU2l6ZVVuaXRFbnVtLkVtOiByZXR1cm4gU2l6ZVVuaXRFbnVtLkVtO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVucmVhY2hhYmxlQ2FzZUVycm9yKCdTVUVGNDQ5OTgnLCB2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IExlZnRBbmRUb3AsIFdpZHRoQW5kSGVpZ2h0IH0gZnJvbSAnLi90eXBlcyc7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJUb1BpeGVscyh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygxMCkgKyAncHgnO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwaXhlbHNUb051bWJlcih2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IG51bWJlclN0ciA9IHZhbHVlLnJlcGxhY2UoXCJweFwiLCBcIlwiKTtcclxuICAgIHJldHVybiBwYXJzZUZsb2F0KG51bWJlclN0cik7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGludGVyZmFjZSBTcGxpdFN0cmluZ0F0Rmlyc3ROb25OdW1lcmljQ2hhclJlc3VsdCB7XHJcbiAgICBudW1lcmljUGFydDogc3RyaW5nO1xyXG4gICAgZmlyc3ROb25OdW1lcmljQ2hhclBhcnQ6IHN0cmluZztcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRTdHJpbmdBdEZpcnN0Tm9uTnVtZXJpY0NoYXIodmFsdWU6IHN0cmluZyk6IFNwbGl0U3RyaW5nQXRGaXJzdE5vbk51bWVyaWNDaGFyUmVzdWx0IHtcclxuICAgIHZhbHVlID0gdmFsdWUudHJpbVN0YXJ0KCk7XHJcblxyXG4gICAgY29uc3QgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xyXG4gICAgaWYgKGxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHJldHVybiB7IG51bWVyaWNQYXJ0OiAnJywgZmlyc3ROb25OdW1lcmljQ2hhclBhcnQ6ICcnIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IGZpcnN0Tm9uRGlnaXRQYXJ0SW5kZXggPSBsZW5ndGg7XHJcbiAgICAgICAgbGV0IGdvdERlY2ltYWxQb2ludCA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgY2hhciA9IHZhbHVlW2ldO1xyXG4gICAgICAgICAgICBpZiAoIWlzRGlnaXQoY2hhcikpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjaGFyICE9PSAnLicpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaXJzdE5vbkRpZ2l0UGFydEluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdvdERlY2ltYWxQb2ludCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdE5vbkRpZ2l0UGFydEluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ290RGVjaW1hbFBvaW50ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZGlnaXRzUGFydCA9IHZhbHVlLnN1YnN0cmluZygwLCBmaXJzdE5vbkRpZ2l0UGFydEluZGV4KTtcclxuICAgICAgICBjb25zdCBmaXJzdE5vbkRpZ2l0UGFydCA9IHZhbHVlLnN1YnN0cmluZyhmaXJzdE5vbkRpZ2l0UGFydEluZGV4KS50cmltKCk7XHJcblxyXG4gICAgICAgIHJldHVybiB7IG51bWVyaWNQYXJ0OiBkaWdpdHNQYXJ0LCBmaXJzdE5vbk51bWVyaWNDaGFyUGFydDogZmlyc3ROb25EaWdpdFBhcnQgfTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaXNEaWdpdChjaGFyOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBjaGFyID49ICcwJyAmJiBjaGFyIDw9ICc5JztcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWxlbWVudFdpZHRoKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogbnVtYmVyIHtcclxuICAgIHJldHVybiBlbGVtZW50Lm9mZnNldFdpZHRoO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRFbGVtZW50V2lkdGgoZWxlbWVudDogSFRNTEVsZW1lbnQsIHdpZHRoOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IHdpZHRoQXNQaXhlbHMgPSBudW1iZXJUb1BpeGVscyh3aWR0aCk7XHJcbiAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gd2lkdGhBc1BpeGVscztcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWxlbWVudEhlaWdodChlbGVtZW50OiBIVE1MRWxlbWVudCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNldEVsZW1lbnRIZWlnaHQoZWxlbWVudDogSFRNTEVsZW1lbnQsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCBoZWlnaHRBc1BpeGVscyA9IG51bWJlclRvUGl4ZWxzKGhlaWdodCk7XHJcbiAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IGhlaWdodEFzUGl4ZWxzO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50V2lkdGhBbmRIZWlnaHQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBXaWR0aEFuZEhlaWdodCB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHdpZHRoOiBlbGVtZW50Lm9mZnNldFdpZHRoLFxyXG4gICAgICAgIGhlaWdodDogZWxlbWVudC5vZmZzZXRIZWlnaHQsXHJcbiAgICB9O1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRXaW5kb3dUb3BMZWZ0Qm9yZGVyKHdpbmRvdzogV2luZG93IHwgdHlwZW9mIGdsb2JhbFRoaXMpOiBXaWR0aEFuZEhlaWdodCB7XHJcbiAgICBsZXQgaW5uZXJTY3JlZW5YOiBudW1iZXIgfCB1bmRlZmluZWQgPSAoPGFueT53aW5kb3cpLm1veklubmVyU2NyZWVuWDtcclxuICAgIGxldCBpbm5lclNjcmVlblk6IG51bWJlciB8IHVuZGVmaW5lZCA9ICg8YW55PndpbmRvdykubW96SW5uZXJTY3JlZW5ZO1xyXG4gICAgbGV0IGJvcmRlclg6IG51bWJlciwgYm9yZGVyWTogbnVtYmVyO1xyXG5cclxuICAgIGlmIChpbm5lclNjcmVlblggPT09IHVuZGVmaW5lZCB8fCBpbm5lclNjcmVlblkgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGJvcmRlclggPSAod2luZG93Lm91dGVyV2lkdGggLSB3aW5kb3cuaW5uZXJXaWR0aCkgLyAyOyAgICAgICAgLy8gQXNzdW1lIGxlZnQgLyByaWdodCBib3JkZXIgaXMgdGhlIHNhbWVcclxuICAgICAgICBib3JkZXJZID0gd2luZG93Lm91dGVySGVpZ2h0IC0gd2luZG93LmlubmVySGVpZ2h0IC0gYm9yZGVyWDsgIC8vIEFzc3VtZSBib3R0b20gYm9yZGVyIGlzIHRoZSBzYW1lIGFzIGxlZnQgLyByaWdodFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBib3JkZXJYID0gaW5uZXJTY3JlZW5YIC0gd2luZG93LnNjcmVlblg7XHJcbiAgICAgICAgYm9yZGVyWSA9IGlubmVyU2NyZWVuWSAtIHdpbmRvdy5zY3JlZW5ZO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IHdpZHRoOiBNYXRoLm1heCgwLCBib3JkZXJYKSwgaGVpZ2h0OiBNYXRoLm1heCgwLCBib3JkZXJZKSB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFdpbmRvd0lubmVyU2NyZWVuUG9zaXRpb24od2luZG93OiBXaW5kb3cgfCB0eXBlb2YgZ2xvYmFsVGhpcyk6IExlZnRBbmRUb3Age1xyXG4gICAgbGV0IGlubmVyU2NyZWVuWDogbnVtYmVyIHwgdW5kZWZpbmVkID0gKDxhbnk+d2luZG93KS5tb3pJbm5lclNjcmVlblg7XHJcbiAgICBsZXQgaW5uZXJTY3JlZW5ZOiBudW1iZXIgfCB1bmRlZmluZWQgPSAoPGFueT53aW5kb3cpLm1veklubmVyU2NyZWVuWTtcclxuXHJcbiAgICBpZiAoaW5uZXJTY3JlZW5YID09PSB1bmRlZmluZWQgfHwgaW5uZXJTY3JlZW5ZID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zdCBib3JkZXIgPSBnZXRXaW5kb3dUb3BMZWZ0Qm9yZGVyKHdpbmRvdyk7XHJcbiAgICAgICAgaW5uZXJTY3JlZW5YID0gd2luZG93LnNjcmVlblggKyBib3JkZXIud2lkdGg7XHJcbiAgICAgICAgaW5uZXJTY3JlZW5ZID0gd2luZG93LnNjcmVlblkgKyBib3JkZXIuaGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IGxlZnQ6IGlubmVyU2NyZWVuWCwgdG9wOiBpbm5lclNjcmVlblkgfTtcclxufVxyXG5cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNldEVsZW1lbnREaXNwbGF5VmlzaWJpbGl0eShlbGVtZW50OiBIVE1MRWxlbWVudCwgdmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHZpc2libGUpIHtcclxuICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVFbGVtZW50UG9zaXRpb25BYnNvbHV0ZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgYWJzb2x1dGVQb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICBpZiAoZWxlbWVudC5zdHlsZS5wb3NpdGlvbiAhPT0gYWJzb2x1dGVQb3NpdGlvbikge1xyXG4gICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBhYnNvbHV0ZVBvc2l0aW9uO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogUmVwbGFjZW1lbnQgZm9yIEpRdWVyeSAkLmV4dGVuZCh0YXJnZXQsIG9iailcclxuICogQGludGVybmFsXHJcbiovXHJcbmV4cG9ydCBmdW5jdGlvbiBleHRlbmQodGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xyXG4gICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgICAgICB0YXJnZXRba2V5XSA9IG9ialtrZXldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0YXJnZXQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXBsYWNlbWVudCBmb3IgSlF1ZXJ5ICQuZXh0ZW5kKHRydWUsIHRhcmdldCwgb2JqKVxyXG4gKiBAaW50ZXJuYWxcclxuKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBFeHRlbmQodGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcclxuICAgIGlmIChvYmogIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xyXG4gICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1RhcmdldCA9IHRhcmdldFtrZXldO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBkZWVwRXh0ZW5kVmFsdWUoZXhpc3RpbmdUYXJnZXQsIHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGFyZ2V0O1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWVwRXh0ZW5kVmFsdWUoZXhpc3RpbmdUYXJnZXQ6IHVua25vd24sIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0QXJyYXkgPSBuZXcgQXJyYXk8dW5rbm93bj4obGVuZ3RoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHZhbHVlW2ldO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0QXJyYXlbaV0gPSBkZWVwRXh0ZW5kVmFsdWUoe30sIGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXRBcnJheTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVPYmogPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1RhcmdldCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZXBFeHRlbmQoe30sIHZhbHVlT2JqKTsgLy8gb3ZlcndyaXRlXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXhpc3RpbmdUYXJnZXQgIT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZXBFeHRlbmQoe30sIHZhbHVlT2JqKTsgLy8gb3ZlcndyaXRlXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXhpc3RpbmdUYXJnZXQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVlcEV4dGVuZCh7fSwgdmFsdWVPYmopOyAvLyBvdmVyd3JpdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1RhcmdldCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWVwRXh0ZW5kKHt9LCB2YWx1ZU9iaik7IC8vIG92ZXJ3cml0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1RhcmdldE9iaiA9IGV4aXN0aW5nVGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWVwRXh0ZW5kKGV4aXN0aW5nVGFyZ2V0T2JqLCB2YWx1ZU9iaik7IC8vIG1lcmdlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUZyb21BcnJheTxUPihpdGVtOiBULCBhcnJheTogVFtdKTogdm9pZCB7XHJcbiAgICBjb25zdCBpbmRleCA9IGFycmF5LmluZGV4T2YoaXRlbSk7XHJcblxyXG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCByZW1vdmUgaXRlbSBmcm9tIGFycmF5LiBJdGVtIGlzIG5vdCBpbiB0aGUgYXJyYXknKTtcclxuICAgIH1cclxuXHJcbiAgICBhcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRVbmlxdWVJZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIChNYXRoLnJhbmRvbSgpICogMTAwMDAwMDAwMDAwMDAwMClcclxuICAgICAgICAudG9TdHJpbmcoMzYpXHJcbiAgICAgICAgLnJlcGxhY2UoJy4nLCAnJyk7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEVycm9yTWVzc2FnZShlOiB1bmtub3duKTogc3RyaW5nIHtcclxuICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcclxuICAgICAgICByZXR1cm4gZS5tZXNzYWdlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodHlwZW9mIGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnVW5rbm93biBFcnJvcic7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IExheW91dENvbmZpZyB9IGZyb20gJy4vY29uZmlnL2NvbmZpZyc7XHJcbmltcG9ydCB7IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZywgUmVzb2x2ZWRMYXlvdXRDb25maWcsIFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnIH0gZnJvbSAnLi9jb25maWcvcmVzb2x2ZWQtY29uZmlnJztcclxuaW1wb3J0IHsgQ29tcG9uZW50Q29udGFpbmVyIH0gZnJvbSAnLi9jb250YWluZXIvY29tcG9uZW50LWNvbnRhaW5lcic7XHJcbmltcG9ydCB7IEJpbmRFcnJvciB9IGZyb20gJy4vZXJyb3JzL2V4dGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yIH0gZnJvbSAnLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IERvbUNvbnN0YW50cyB9IGZyb20gJy4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IEkxOG5TdHJpbmdJZCwgaTE4blN0cmluZ3MgfSBmcm9tICcuL3V0aWxzL2kxOG4tc3RyaW5ncyc7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY2xhc3MgVmlydHVhbExheW91dCBleHRlbmRzIExheW91dE1hbmFnZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS5iaW5kQ29tcG9uZW50RXZlbnR9IGFuZFxyXG4gICAgICoge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS51bmJpbmRDb21wb25lbnRFdmVudH0gd2l0aCB2aXJ0dWFsIGNvbXBvbmVudHNcclxuICAgICAqL1xyXG4gICAgZ2V0Q29tcG9uZW50RXZlbnQ6IFZpcnR1YWxMYXlvdXQuR2V0Q29tcG9uZW50RXZlbnRIYW5kbGVyIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS5iaW5kQ29tcG9uZW50RXZlbnR9IGFuZFxyXG4gICAgICoge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS51bmJpbmRDb21wb25lbnRFdmVudH0gd2l0aCB2aXJ0dWFsIGNvbXBvbmVudHNcclxuICAgICAqL1xyXG4gICAgcmVsZWFzZUNvbXBvbmVudEV2ZW50OiBWaXJ0dWFsTGF5b3V0LlJlbGVhc2VDb21wb25lbnRFdmVudEhhbmRsZXIgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgYmluZENvbXBvbmVudEV2ZW50OiBWaXJ0dWFsTGF5b3V0LkJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgfCB1bmRlZmluZWQ7XHJcbiAgICB1bmJpbmRDb21wb25lbnRFdmVudDogVmlydHVhbExheW91dC5VbmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCB1c2Ugd2hpbGUgY29uc3RydWN0b3IgaXMgbm90IGRldGVybWluYXRlICovXHJcbiAgICBwcml2YXRlIF9iaW5kQ29tcG9uZW50RXZlbnRIYW5sZGVyUGFzc2VkSW5Db25zdHJ1Y3RvciA9IGZhbHNlOyAvLyByZW1vdmUgd2hlbiBjb25zdHJ1Y3RvciBpcyBkZXRlcm1pbmF0ZVxyXG4gICAgLyoqIEBpbnRlcm5hbCAgQGRlcHJlY2F0ZWQgdXNlIHdoaWxlIGNvbnN0cnVjdG9yIGlzIG5vdCBkZXRlcm1pbmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBfY3JlYXRpb25UaW1lb3V0UGFzc2VkID0gZmFsc2U7IC8vIHJlbW92ZSB3aGVuIGNvbnN0cnVjdG9yIGlzIGRldGVybWluYXRlXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0gY29udGFpbmVyIC0gQSBEb20gSFRNTCBlbGVtZW50LiBEZWZhdWx0cyB0byBib2R5XHJcbiAgICAgKiBAcGFyYW0gYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgdG8gYmluZCBjb21wb25lbnRzXHJcbiAgICAgKiBAcGFyYW0gYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgdG8gdW5iaW5kIGNvbXBvbmVudHNcclxuICAgICAqIElmIGJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgaXMgZGVmaW5lZCwgdGhlbiBjb25zdHJ1Y3RvciB3aWxsIGJlIGRldGVybWluYXRlLiBJdCB3aWxsIGFsd2F5cyBjYWxsIHRoZSBpbml0KClcclxuICAgICAqIGZ1bmN0aW9uIGFuZCB0aGUgaW5pdCgpIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIGNvbXBsZXRlLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgd2lsbCBiZSBjYWxsZWRcclxuICAgICAqIGlmIGNvbnN0cnVjdG9yIGlzIGZvciBhIHBvcG91dCB3aW5kb3cuIE1ha2Ugc3VyZSBiaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIGlzIHJlYWR5IGZvciBldmVudHMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50LFxyXG4gICAgICAgIGJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI/OiBWaXJ0dWFsTGF5b3V0LkJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsXHJcbiAgICAgICAgdW5iaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyPzogVmlydHVhbExheW91dC5VbmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsXHJcbiAgICApO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIHNwZWNpZnkgbGF5b3V0Q29uZmlnIGluIHtAbGluayAoTGF5b3V0TWFuYWdlcjpjbGFzcykubG9hZExheW91dH0gKi9cclxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogTGF5b3V0Q29uZmlnLCBjb250YWluZXI/OiBIVE1MRWxlbWVudCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3Rvcihjb25maWdPck9wdGlvbmFsQ29udGFpbmVyOiBMYXlvdXRDb25maWcgfCBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCxcclxuICAgICAgICBjb250YWluZXJPckJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI6IEhUTUxFbGVtZW50IHwgVmlydHVhbExheW91dC5CaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIHVuYmluZENvbXBvbmVudEV2ZW50SGFuZGxlcjogVmlydHVhbExheW91dC5VbmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgc2tpcEluaXQ6IHRydWUsXHJcbiAgICApO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IoY29uZmlnT3JPcHRpb25hbENvbnRhaW5lcjogTGF5b3V0Q29uZmlnIHwgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgY29udGFpbmVyT3JCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyPzogSFRNTEVsZW1lbnQgfCBWaXJ0dWFsTGF5b3V0LkJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsXHJcbiAgICAgICAgdW5iaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyPzogVmlydHVhbExheW91dC5VbmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsXHJcbiAgICAgICAgc2tpcEluaXQ/OiB0cnVlLFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoVmlydHVhbExheW91dC5jcmVhdGVMYXlvdXRNYW5hZ2VyQ29uc3RydWN0b3JQYXJhbWV0ZXJzKGNvbmZpZ09yT3B0aW9uYWxDb250YWluZXIsIGNvbnRhaW5lck9yQmluZENvbXBvbmVudEV2ZW50SGFuZGxlcikpO1xyXG5cclxuICAgICAgICBpZiAoY29udGFpbmVyT3JCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250YWluZXJPckJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmluZENvbXBvbmVudEV2ZW50ID0gY29udGFpbmVyT3JCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYmluZENvbXBvbmVudEV2ZW50SGFubGRlclBhc3NlZEluQ29uc3RydWN0b3IgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh1bmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudW5iaW5kQ29tcG9uZW50RXZlbnQgPSB1bmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fYmluZENvbXBvbmVudEV2ZW50SGFubGRlclBhc3NlZEluQ29uc3RydWN0b3IpIHtcclxuICAgICAgICAgICAgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNTdWJXaW5kb3cpIHtcclxuICAgICAgICAgICAgICAgIC8vIGRvY3VtZW50LmJvZHkuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xyXG4gICAgICAgICAgICAgICAgLy8gU2V0IHVwIGxheW91dENvbmZpZyBzaW5jZSBjb25zdHJ1Y3RvciBpcyBub3QgZGV0ZXJtaW5hdGUgYW5kIG1heSBleGl0IGVhcmx5LiBPdGhlciBmdW5jdGlvbnMgbWF5IG5lZWRcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMubGF5b3V0Q29uZmlnLiB0aGlzLmxheW91dENvbmZpZyBpcyBhZ2FpbiBjYWxjdWxhdGVkIGluIHRoZSBzYW1lIHdheSB3aGVuIGluaXQoKSBjb21wbGV0ZXMuXHJcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhpcyB3aGVuIGNvbnN0cnVjdG9yIGlzIGRldGVybWluYXRlLlxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnN0cnVjdG9yT3JTdWJXaW5kb3dMYXlvdXRDb25maWcgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ1ZMQzk4ODIzJyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkTGF5b3V0Q29uZmlnID0gTGF5b3V0Q29uZmlnLnJlc29sdmUodGhpcy5fY29uc3RydWN0b3JPclN1YldpbmRvd0xheW91dENvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHJvb3QgZnJvbSBsYXlvdXRDb25maWdcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dENvbmZpZyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmVzb2x2ZWRMYXlvdXRDb25maWcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3Q6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChza2lwSW5pdCAhPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZGVwcmVjYXRlZENvbnN0cnVjdG9yKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYmluZENvbXBvbmVudEV2ZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMudW5iaW5kQ29tcG9uZW50RXZlbnQgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIHRoZSBhY3R1YWwgbGF5b3V0LiBNdXN0IGJlIGNhbGxlZCBhZnRlciBhbGwgaW5pdGlhbCBjb21wb25lbnRzXHJcbiAgICAgKiBhcmUgcmVnaXN0ZXJlZC4gUmVjdXJzZXMgdGhyb3VnaCB0aGUgY29uZmlndXJhdGlvbiBhbmQgc2V0cyB1cFxyXG4gICAgICogdGhlIGl0ZW0gdHJlZS5cclxuICAgICAqXHJcbiAgICAgKiBJZiBjYWxsZWQgYmVmb3JlIHRoZSBkb2N1bWVudCBpcyByZWFkeSBpdCBhZGRzIGl0c2VsZiBhcyBhIGxpc3RlbmVyXHJcbiAgICAgKiB0byB0aGUgZG9jdW1lbnQucmVhZHkgZXZlbnRcclxuICAgICAqIEBkZXByZWNhdGVkIExheW91dENvbmZpZyBzaG91bGQgbm90IGJlIGxvYWRlZCBpbiB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpfSBjb25zdHJ1Y3RvciwgYnV0IHJhdGhlciBpbiBhXHJcbiAgICAgKiB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpLmxvYWRMYXlvdXR9IGNhbGwuICBJZiBMYXlvdXRDb25maWcgaXMgbm90IHNwZWNpZmllZCBpbiB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpfSBjb25zdHJ1Y3RvcixcclxuICAgICAqIHRoZW4gaW5pdCgpIHdpbGwgYmUgYXV0b21hdGljYWxseSBjYWxsZWQgaW50ZXJuYWxseSBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZXh0ZXJuYWxseS5cclxuICAgICAqL1xyXG4gICAgb3ZlcnJpZGUgaW5pdCgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdGhlIGRvY3VtZW50IGlzbid0IHJlYWR5IHlldCwgd2FpdCBmb3IgaXQuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKCF0aGlzLl9iaW5kQ29tcG9uZW50RXZlbnRIYW5sZGVyUGFzc2VkSW5Db25zdHJ1Y3RvciAmJiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnIHx8IGRvY3VtZW50LmJvZHkgPT09IG51bGwpKSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB0aGlzLmluaXQoKSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0aGlzIGlzIGEgc3Vid2luZG93LCB3YWl0IGEgZmV3IG1pbGxpc2Vjb25kcyBmb3IgdGhlIG9yaWdpbmFsXHJcbiAgICAgICAgICogcGFnZSdzIGpzIGNhbGxzIHRvIGJlIGV4ZWN1dGVkLCB0aGVuIHJlcGxhY2UgdGhlIGJvZGllcyBjb250ZW50XHJcbiAgICAgICAgICogd2l0aCBHb2xkZW5MYXlvdXRcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoIXRoaXMuX2JpbmRDb21wb25lbnRFdmVudEhhbmxkZXJQYXNzZWRJbkNvbnN0cnVjdG9yICYmIHRoaXMuaXNTdWJXaW5kb3cgPT09IHRydWUgJiYgIXRoaXMuX2NyZWF0aW9uVGltZW91dFBhc3NlZCkge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaW5pdCgpLCA3KTtcclxuICAgICAgICAgICAgdGhpcy5fY3JlYXRpb25UaW1lb3V0UGFzc2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNTdWJXaW5kb3cgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9iaW5kQ29tcG9uZW50RXZlbnRIYW5sZGVyUGFzc2VkSW5Db25zdHJ1Y3Rvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckh0bWxBbmRBZGp1c3RTdHlsZXNGb3JTdWJXaW5kb3coKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gRXhwb3NlIHRoaXMgaW5zdGFuY2Ugb24gdGhlIHdpbmRvdyBvYmplY3QgdG8gYWxsb3cgdGhlIG9wZW5pbmcgd2luZG93IHRvIGludGVyYWN0IHdpdGggaXRcclxuICAgICAgICAgICAgd2luZG93Ll9fZ2xJbnN0YW5jZSA9IHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdXBlci5pbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgZXhpc3RpbmcgSFRNTCBhbmQgYWRqdXN0cyBzdHlsZSB0byBtYWtlIHdpbmRvdyBzdWl0YWJsZSB0byBiZSBhIHBvcG91dCBzdWIgd2luZG93XHJcbiAgICAgKiBDdXJlbnRseSBpcyBhdXRvbWF0aWNhbGx5IGNhbGxlZCB3aGVuIHdpbmRvdyBpcyBhIHN1YldpbmRvdyBhbmQgYmluZENvbXBvbmVudEV2ZW50IGlzIG5vdCBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yXHJcbiAgICAgKiBJZiBiaW5kQ29tcG9uZW50RXZlbnQgaXMgbm90IHBhc3NlZCBpbiB0aGUgY29uc3RydWN0b3IsIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGVpdGhlciBjYWxsIHRoaXMgZnVuY3Rpb24gZXhwbGljaXRseSBvclxyXG4gICAgICogKHByZWZlcmFibHkpIG1ha2UgdGhlIHdpbmRvdyBzdWl0YWJsZSBhcyBhIHN1YndpbmRvdy5cclxuICAgICAqIEluIHRoZSBmdXR1cmUsIGl0IGlzIHBsYW5uZWQgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIE5PVCBhdXRvbWF0aWNhbGx5IGNhbGxlZCBpbiBhbnkgY2lyY3Vtc3RhbmNlcy4gIEFwcGxpY2F0aW9ucyB3aWxsXHJcbiAgICAgKiBuZWVkIHRvIGRldGVybWluZSB3aGV0aGVyIGEgd2luZG93IGlzIGEgR29sZGVuIExheW91dCBwb3BvdXQgd2luZG93IGFuZCBlaXRoZXIgY2FsbCB0aGlzIGZ1bmN0aW9uIGV4cGxpY2l0bHkgb3JcclxuICAgICAqIGhpZGUgSFRNTCBub3QgcmVsZXZhbnQgdG8gdGhlIHBvcG91dC5cclxuICAgICAqIFNlZSBhcGl0ZXN0IGZvciBhbiBleGFtcGxlIG9mIGhvdyBIVE1MIGlzIGhpZGRlbiB3aGVuIHBvcG91dCB3aW5kb3dzIGFyZSBkaXNwbGF5ZWRcclxuICAgICAqL1xyXG4gICAgY2xlYXJIdG1sQW5kQWRqdXN0U3R5bGVzRm9yU3ViV2luZG93KCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGhlYWRFbGVtZW50ID0gZG9jdW1lbnQuaGVhZDtcclxuXHJcbiAgICAgICAgY29uc3QgYXBwZW5kTm9kZUxpc3RzID0gbmV3IEFycmF5PE5vZGVMaXN0T2Y8RWxlbWVudD4+KDQpO1xyXG4gICAgICAgIGFwcGVuZE5vZGVMaXN0c1swXSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2JvZHkgbGluaycpO1xyXG4gICAgICAgIGFwcGVuZE5vZGVMaXN0c1sxXSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2JvZHkgc3R5bGUnKTtcclxuICAgICAgICBhcHBlbmROb2RlTGlzdHNbMl0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0ZW1wbGF0ZScpO1xyXG4gICAgICAgIGFwcGVuZE5vZGVMaXN0c1szXSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5nbF9rZWVwJyk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGxpc3RJZHggPSAwOyBsaXN0SWR4IDwgYXBwZW5kTm9kZUxpc3RzLmxlbmd0aDsgbGlzdElkeCsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFwcGVuZE5vZGVMaXN0ID0gYXBwZW5kTm9kZUxpc3RzW2xpc3RJZHhdO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBub2RlSWR4ID0gMDsgbm9kZUlkeCA8IGFwcGVuZE5vZGVMaXN0Lmxlbmd0aDsgbm9kZUlkeCsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gYXBwZW5kTm9kZUxpc3Rbbm9kZUlkeF07XHJcbiAgICAgICAgICAgICAgICBoZWFkRWxlbWVudC5hcHBlbmRDaGlsZChub2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYm9keUVsZW1lbnQgPSBkb2N1bWVudC5ib2R5O1xyXG4gICAgICAgIGJvZHlFbGVtZW50LmlubmVySFRNTCA9ICcnO1xyXG4gICAgICAgIGJvZHlFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XHJcbiAgICAgICAgdGhpcy5jaGVja0FkZERlZmF1bHRQb3BpbkJ1dHRvbigpO1xyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICogVGhpcyBzZWVtcyBhIGJpdCBwb2ludGxlc3MsIGJ1dCBhY3R1YWxseSBjYXVzZXMgYSByZWZsb3cvcmUtZXZhbHVhdGlvbiBnZXR0aW5nIGFyb3VuZFxyXG4gICAgICAgICogc2xpY2tncmlkJ3MgXCJDYW5ub3QgZmluZCBzdHlsZXNoZWV0LlwiIGJ1ZyBpbiBjaHJvbWVcclxuICAgICAgICAqL1xyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgICAgICBjb25zdCB4ID0gZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFdpbGwgYWRkIGJ1dHRvbiBpZiBub3QgcG9waW5PbkNsb3NlIHNwZWNpZmllZCBpbiBzZXR0aW5nc1xyXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBhZGRlZCBvdGhlcndpc2UgZmFsc2VcclxuICAgICAqL1xyXG4gICAgY2hlY2tBZGREZWZhdWx0UG9waW5CdXR0b24oKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0Q29uZmlnLnNldHRpbmdzLnBvcEluT25DbG9zZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgcG9wSW5CdXR0b25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIHBvcEluQnV0dG9uRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuUG9waW4pO1xyXG4gICAgICAgICAgICBwb3BJbkJ1dHRvbkVsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsIHRoaXMubGF5b3V0Q29uZmlnLmhlYWRlci5wb3Bpbik7XHJcbiAgICAgICAgICAgIGNvbnN0IGljb25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIGljb25FbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5JY29uKTtcclxuICAgICAgICAgICAgY29uc3QgYmdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIGJnRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuQmcpO1xyXG4gICAgICAgICAgICBwb3BJbkJ1dHRvbkVsZW1lbnQuYXBwZW5kQ2hpbGQoaWNvbkVsZW1lbnQpO1xyXG4gICAgICAgICAgICBwb3BJbkJ1dHRvbkVsZW1lbnQuYXBwZW5kQ2hpbGQoYmdFbGVtZW50KTtcclxuICAgICAgICAgICAgcG9wSW5CdXR0b25FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5lbWl0KCdwb3BJbicpKTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChwb3BJbkJ1dHRvbkVsZW1lbnQpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgYmluZENvbXBvbmVudChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgaXRlbUNvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKTogQ29tcG9uZW50Q29udGFpbmVyLkJpbmRhYmxlQ29tcG9uZW50IHtcclxuICAgICAgICBpZiAodGhpcy5iaW5kQ29tcG9uZW50RXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCBiaW5kYWJsZUNvbXBvbmVudCA9IHRoaXMuYmluZENvbXBvbmVudEV2ZW50KGNvbnRhaW5lciwgaXRlbUNvbmZpZyk7XHJcbiAgICAgICAgICAgIHJldHVybiBiaW5kYWJsZUNvbXBvbmVudDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5nZXRDb21wb25lbnRFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHZpcnR1YWw6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcy5nZXRDb21wb25lbnRFdmVudChjb250YWluZXIsIGl0ZW1Db25maWcpLFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gY29tcG9uZW50IHJlZ2lzdGVyZWQgZm9yIHRoaXMgdHlwZSwgYW5kIHdlIGRvbid0IGhhdmUgYSBnZXRDb21wb25lbnRFdmVudCBkZWZpbmVkLlxyXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aGUgdXNlciBwb3BzIG91dCBhIGRpYWxvZyBhbmQgdGhlIGNvbXBvbmVudCB0eXBlcyBhcmUgbm90IHJlZ2lzdGVyZWQgdXBmcm9udC5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuQ29tcG9uZW50VHlwZU5vdFJlZ2lzdGVyZWRBbmRCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyTm90QXNzaWduZWRdO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGAke3RleHR9OiAke0pTT04uc3RyaW5naWZ5KGl0ZW1Db25maWcpfWBcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBCaW5kRXJyb3IobWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgdW5iaW5kQ29tcG9uZW50KGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCB2aXJ0dWFsOiBib29sZWFuLCBjb21wb25lbnQ6IENvbXBvbmVudENvbnRhaW5lci5Db21wb25lbnQgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy51bmJpbmRDb21wb25lbnRFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudW5iaW5kQ29tcG9uZW50RXZlbnQoY29udGFpbmVyKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoIXZpcnR1YWwgJiYgdGhpcy5yZWxlYXNlQ29tcG9uZW50RXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignVkNVQ1JDVTMzMzk5OCcpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbGVhc2VDb21wb25lbnRFdmVudChjb250YWluZXIsIGNvbXBvbmVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgVmlydHVhbExheW91dCB7XHJcbiAgICAvKipcclxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB2aXJ0dWFsIGNvbXBvbmVudHMgd2l0aCB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLmJpbmRDb21wb25lbnRFdmVudH0gYW5kXHJcbiAgICAgKiB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLnVuYmluZENvbXBvbmVudEV2ZW50fSBldmVudHMuXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCB0eXBlIEdldENvbXBvbmVudEV2ZW50SGFuZGxlciA9XHJcbiAgICAgICAgKHRoaXM6IHZvaWQsIGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCBpdGVtQ29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpID0+IENvbXBvbmVudENvbnRhaW5lci5Db21wb25lbnQ7XHJcbiAgICAvKipcclxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB2aXJ0dWFsIGNvbXBvbmVudHMgd2l0aCB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLmJpbmRDb21wb25lbnRFdmVudH0gYW5kXHJcbiAgICAgKiB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLnVuYmluZENvbXBvbmVudEV2ZW50fSBldmVudHMuXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCB0eXBlIFJlbGVhc2VDb21wb25lbnRFdmVudEhhbmRsZXIgPVxyXG4gICAgICAgICh0aGlzOiB2b2lkLCBjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgY29tcG9uZW50OiBDb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50KSA9PiB2b2lkO1xyXG5cclxuICAgIGV4cG9ydCB0eXBlIEJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgPVxyXG4gICAgICAgICh0aGlzOiB2b2lkLCBjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgaXRlbUNvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKSA9PiBDb21wb25lbnRDb250YWluZXIuQmluZGFibGVDb21wb25lbnQ7XHJcbiAgICBleHBvcnQgdHlwZSBVbmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgPVxyXG4gICAgICAgICh0aGlzOiB2b2lkLCBjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lcikgPT4gdm9pZDtcclxuXHJcbiAgICBleHBvcnQgdHlwZSBCZWZvcmVWaXJ0dWFsUmVjdGluZ0V2ZW50ID0gKHRoaXM6IHZvaWQpID0+IHZvaWQ7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbFxyXG4gICAgICogVmVyaWFibGUgdG8gaG9sZCB0aGUgc3RhdGUgd2hldGhlciB3ZSBhbHJlYWR5IGNoZWNrZWQgaWYgd2UgYXJlIHJ1bm5pbmcgaW4gYSBzdWIgd2luZG93LlxyXG4gICAgICogRml4ZXMgcG9wb3V0IGFuZCBjcmVhdGlvbiBvZiBuZXN0ZWQgZ29sZGVuLWxheW91dHMuXHJcbiAgICAgKi9cclxuICAgIGxldCBzdWJXaW5kb3dDaGVja2VkID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxheW91dE1hbmFnZXJDb25zdHJ1Y3RvclBhcmFtZXRlcnMoY29uZmlnT3JPcHRpb25hbENvbnRhaW5lcjogTGF5b3V0Q29uZmlnIHwgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgY29udGFpbmVyT3JCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyPzogSFRNTEVsZW1lbnQgfCAgVmlydHVhbExheW91dC5CaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyKTpcclxuICAgICAgICBMYXlvdXRNYW5hZ2VyLkNvbnN0cnVjdG9yUGFyYW1ldGVyc1xyXG4gICAge1xyXG4gICAgICAgIGNvbnN0IHdpbmRvd0NvbmZpZ0tleSA9IHN1YldpbmRvd0NoZWNrZWQgPyBudWxsIDogbmV3IFVSTChkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KCdnbC13aW5kb3cnKTtcclxuICAgICAgICBzdWJXaW5kb3dDaGVja2VkID0gdHJ1ZTtcclxuICAgICAgICBjb25zdCBpc1N1YldpbmRvdyA9IHdpbmRvd0NvbmZpZ0tleSAhPT0gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IGNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGxldCBjb25maWc6IExheW91dENvbmZpZyB8IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAod2luZG93Q29uZmlnS2V5ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdpbmRvd0NvbmZpZ1N0ciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHdpbmRvd0NvbmZpZ0tleSk7XHJcbiAgICAgICAgICAgIGlmICh3aW5kb3dDb25maWdTdHIgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTnVsbCBnbC13aW5kb3cgQ29uZmlnJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0od2luZG93Q29uZmlnS2V5KTtcclxuICAgICAgICAgICAgY29uc3QgbWluaWZpZWRXaW5kb3dDb25maWcgPSBKU09OLnBhcnNlKHdpbmRvd0NvbmZpZ1N0cikgYXMgUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWc7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkQ29uZmlnID0gUmVzb2x2ZWRMYXlvdXRDb25maWcudW5taW5pZnlDb25maWcobWluaWZpZWRXaW5kb3dDb25maWcpO1xyXG4gICAgICAgICAgICBjb25maWcgPSBMYXlvdXRDb25maWcuZnJvbVJlc29sdmVkKHJlc29sdmVkQ29uZmlnKVxyXG5cclxuICAgICAgICAgICAgaWYgKGNvbmZpZ09yT3B0aW9uYWxDb250YWluZXIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyRWxlbWVudCA9IGNvbmZpZ09yT3B0aW9uYWxDb250YWluZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoY29uZmlnT3JPcHRpb25hbENvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25maWcgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnT3JPcHRpb25hbENvbnRhaW5lciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckVsZW1lbnQgPSBjb25maWdPck9wdGlvbmFsQ29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZ09yT3B0aW9uYWxDb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjb250YWluZXJFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJPckJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXJPckJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yT3JTdWJXaW5kb3dMYXlvdXRDb25maWc6IGNvbmZpZyxcclxuICAgICAgICAgICAgaXNTdWJXaW5kb3csXHJcbiAgICAgICAgICAgIGNvbnRhaW5lckVsZW1lbnQsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsImV4cG9ydCAqIGZyb20gJy4vdHMvY29uZmlnL2NvbmZpZyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vdHMvY29uZmlnL3Jlc29sdmVkLWNvbmZpZyc7XHJcbmV4cG9ydCB7IENvbXBvbmVudENvbnRhaW5lciB9IGZyb20gJy4vdHMvY29udGFpbmVyL2NvbXBvbmVudC1jb250YWluZXInO1xyXG5leHBvcnQgeyBCcm93c2VyUG9wb3V0IH0gZnJvbSAnLi90cy9jb250cm9scy9icm93c2VyLXBvcG91dCc7XHJcbmV4cG9ydCB7IERyYWdTb3VyY2UgfSBmcm9tICcuL3RzL2NvbnRyb2xzL2RyYWctc291cmNlJztcclxuZXhwb3J0IHsgSGVhZGVyIH0gZnJvbSAnLi90cy9jb250cm9scy9oZWFkZXInO1xyXG5leHBvcnQgeyBUYWIgfSBmcm9tICcuL3RzL2NvbnRyb2xzL3RhYic7XHJcbmV4cG9ydCAqIGZyb20gJy4vdHMvZXJyb3JzL2V4dGVybmFsLWVycm9yJztcclxuZXhwb3J0IHsgR29sZGVuTGF5b3V0IH0gZnJvbSAnLi90cy9nb2xkZW4tbGF5b3V0JztcclxuZXhwb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4vdHMvaXRlbXMvY29tcG9uZW50LWl0ZW0nO1xyXG5leHBvcnQgeyBDb250ZW50SXRlbSB9IGZyb20gJy4vdHMvaXRlbXMvY29udGVudC1pdGVtJztcclxuZXhwb3J0IHsgUm93T3JDb2x1bW4gfSBmcm9tICcuL3RzL2l0ZW1zL3Jvdy1vci1jb2x1bW4nO1xyXG5leHBvcnQgeyBTdGFjayB9IGZyb20gJy4vdHMvaXRlbXMvc3RhY2snO1xyXG5leHBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi90cy9sYXlvdXQtbWFuYWdlcic7XHJcbmV4cG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4vdHMvdXRpbHMvZXZlbnQtZW1pdHRlcic7XHJcbmV4cG9ydCB7IEV2ZW50SHViIH0gZnJvbSAnLi90cy91dGlscy9ldmVudC1odWInO1xyXG5leHBvcnQgKiBmcm9tICcuL3RzL3V0aWxzL2kxOG4tc3RyaW5ncyc7XHJcbmV4cG9ydCB7IFN0eWxlQ29uc3RhbnRzIH0gZnJvbSAnLi90cy91dGlscy9zdHlsZS1jb25zdGFudHMnO1xyXG5leHBvcnQgKiBmcm9tICcuL3RzL3V0aWxzL3R5cGVzJztcclxuZXhwb3J0IHsgVmlydHVhbExheW91dCB9IGZyb20gJy4vdHMvdmlydHVhbC1sYXlvdXQnO1xyXG5cclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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VUFDQTtVQUNBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTs7Ozs7V0N0QkE7V0FDQTtXQUNBO1dBQ0E7V0FDQSx5Q0FBeUMsd0NBQXdDO1dBQ2pGO1dBQ0E7V0FDQTs7Ozs7V0NQQTs7Ozs7V0NBQTtXQUNBO1dBQ0E7V0FDQSx1REFBdUQsaUJBQWlCO1dBQ3hFO1dBQ0EsZ0RBQWdELGFBQWE7V0FDN0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTm1DO0FBQ1M7QUFDNEI7QUFDWDtBQUNOO0FBQ1Q7QUFDTjtBQUNHO0FBQ087QUFDUTtBQUNKO0FBQ0M7QUFDZDtBQUNXO0FBQ0k7QUFDUjtBQUNSO0FBQ29CO0FBQzNCO0FBQ21CIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29uZmlnL2NvbmZpZy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29uZmlnL3Jlc29sdmVkLWNvbmZpZy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udGFpbmVyL2NvbXBvbmVudC1jb250YWluZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2NvbnRyb2xzL2Jyb3dzZXItcG9wb3V0LnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb250cm9scy9kcmFnLWFjdGlvbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udHJvbHMvZHJhZy1wcm94eS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udHJvbHMvZHJhZy1zb3VyY2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2NvbnRyb2xzL2Ryb3AtdGFyZ2V0LWluZGljYXRvci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udHJvbHMvaGVhZGVyLWJ1dHRvbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udHJvbHMvaGVhZGVyLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb250cm9scy9zcGxpdHRlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udHJvbHMvdGFiLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb250cm9scy90YWJzLWNvbnRhaW5lci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udHJvbHMvdHJhbnNpdGlvbi1pbmRpY2F0b3IudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2Vycm9ycy9leHRlcm5hbC1lcnJvci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvZXJyb3JzL2ludGVybmFsLWVycm9yLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9nb2xkZW4tbGF5b3V0LnRzIiwid2VicGFjazovLy8uL3NyYy90cy9pdGVtcy9jb21wb25lbnQtaXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvaXRlbXMvY29tcG9uZW50LXBhcmVudGFibGUtaXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvaXRlbXMvY29udGVudC1pdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9pdGVtcy9ncm91bmQtaXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvaXRlbXMvcm93LW9yLWNvbHVtbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvaXRlbXMvc3RhY2sudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2xheW91dC1tYW5hZ2VyLnRzIiwid2VicGFjazovLy8uL3NyYy90cy91dGlscy9jb25maWctbWluaWZpZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL3V0aWxzL2RyYWctbGlzdGVuZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL3V0aWxzL2V2ZW50LWVtaXR0ZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL3V0aWxzL2V2ZW50LWh1Yi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvdXRpbHMvaTE4bi1zdHJpbmdzLnRzIiwid2VicGFjazovLy8uL3NyYy90cy91dGlscy9zdHlsZS1jb25zdGFudHMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL3V0aWxzL3R5cGVzLnRzIiwid2VicGFjazovLy8uL3NyYy90cy91dGlscy91dGlscy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvdmlydHVhbC1sYXlvdXQudHMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovLy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vLy4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImdvbGRlbkxheW91dFwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJnb2xkZW5MYXlvdXRcIl0gPSBmYWN0b3J5KCk7XG59KShnbG9iYWxUaGlzLCAoKSA9PiB7XG5yZXR1cm4gIiwiaW1wb3J0IHsgQ29uZmlndXJhdGlvbkVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2V4dGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgQXNzZXJ0RXJyb3IsIFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciwgVW5yZWFjaGFibGVDYXNlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBJMThuU3RyaW5nSWQsIGkxOG5TdHJpbmdzIH0gZnJvbSAnLi4vdXRpbHMvaTE4bi1zdHJpbmdzJztcclxuaW1wb3J0IHsgSXRlbVR5cGUsIEpzb25WYWx1ZSwgUmVzcG9uc2l2ZU1vZGUsIFNpZGUsIFNpemVVbml0RW51bSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHsgZGVlcEV4dGVuZFZhbHVlLCBzcGxpdFN0cmluZ0F0Rmlyc3ROb25OdW1lcmljQ2hhciB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0IHtcclxuICAgIFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyxcclxuICAgIFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLFxyXG4gICAgUmVzb2x2ZWRJdGVtQ29uZmlnLFxyXG4gICAgUmVzb2x2ZWRMYXlvdXRDb25maWcsXHJcbiAgICBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyxcclxuICAgIFJlc29sdmVkUm9vdEl0ZW1Db25maWcsXHJcbiAgICBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyxcclxuICAgIFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnXHJcbn0gZnJvbSBcIi4vcmVzb2x2ZWQtY29uZmlnXCI7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1Db25maWcge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgaXRlbS4gUG9zc2libGUgdmFsdWVzIGFyZSAncm93JywgJ2NvbHVtbicsICdzdGFjaycsICdjb21wb25lbnQnLlxyXG4gICAgICovXHJcbiAgICB0eXBlOiBJdGVtVHlwZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIGNvbmZpZ3VyYXRpb25zIGZvciBpdGVtcyB0aGF0IHdpbGwgYmUgY3JlYXRlZCBhcyBjaGlsZHJlbiBvZiB0aGlzIGl0ZW0uXHJcbiAgICAgKi9cclxuICAgIGNvbnRlbnQ/OiBJdGVtQ29uZmlnW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgd2lkdGggb2YgdGhpcyBpdGVtLCByZWxhdGl2ZSB0byB0aGUgb3RoZXIgY2hpbGRyZW4gb2YgaXRzIHBhcmVudCBpbiBwZXJjZW50XHJcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChJdGVtQ29uZmlnOmludGVyZmFjZSkuc2l6ZX0gaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICB3aWR0aD86IG51bWJlcjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtaW5pbXVtIHdpZHRoIG9mIHRoaXMgaXRlbSBpbiBwaXhlbHNcclxuICAgICAqIENBVVRJT04gLSBOb3QgdGVzdGVkIC0gZG8gbm90IHVzZVxyXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoSXRlbUNvbmZpZzppbnRlcmZhY2UpLm1pblNpemV9IGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgbWluV2lkdGg/OiBudW1iZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoaXMgaXRlbSwgcmVsYXRpdmUgdG8gdGhlIG90aGVyIGNoaWxkcmVuIG9mIGl0cyBwYXJlbnQgaW4gcGVyY2VudFxyXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoSXRlbUNvbmZpZzppbnRlcmZhY2UpLnNpemV9IGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgaGVpZ2h0PzogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1pbmltdW0gaGVpZ2h0IG9mIHRoaXMgaXRlbSBpbiBwaXhlbHNcclxuICAgICAqIENBVVRJT04gLSBOb3QgdGVzdGVkIC0gZG8gbm90IHVzZVxyXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoSXRlbUNvbmZpZzppbnRlcmZhY2UpLm1pblNpemV9IGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgbWluSGVpZ2h0PzogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNpemUgb2YgdGhpcyBpdGVtLlxyXG4gICAgICogRm9yIHJvd3MsIGl0IHNwZWNpZmllcyBoZWlnaHQuIEZvciBjb2x1bW5zLCBpdCBzcGVjaWZpZXMgd2lkdGguXHJcbiAgICAgKiBIYXMgZm9ybWF0IFxcPG51bWJlclxcPlxcPHtAbGluayBTaXplVW5pdH1cXD4uIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIHVuaXRzIGBmcmAgYW5kIGAlYC5cclxuICAgICAqXHJcbiAgICAgKiBTcGFjZSBpcyBmaXJzdCBwcm9wb3J0aW9uYWxseSBhbGxvY2F0ZWQgdG8gaXRlbXMgd2l0aCBzaXplVW5pdCBgJWAuXHJcbiAgICAgKiBJZiB0aGVyZSBpcyBhbnkgc3BhY2UgbGVmdCBvdmVyIChsZXNzIHRoYW4gMTAwJSBhbGxvY2F0ZWQpLCB0aGVuIHRoZVxyXG4gICAgICogcmVtYWluZGVyIGlzIGFsbG9jYXRlZCB0byB0aGUgaXRlbXMgd2l0aCB1bml0IGBmcmAgYWNjb3JkaW5nIHRvIHRoZSBmcmFjdGlvbmFsIHNpemUuXHJcbiAgICAgKiBJZiBtb3JlIHRoYW4gMTAwJSBpcyBhbGxvY2F0ZWQsIHRoZW4gYW4gZXh0cmEgNTAlIGlzIGFsbG9jYXRlZCB0byBpdGVtcyB3aXRoIHVuaXQgYGZyYCBhbmRcclxuICAgICAqIGlzIGFsbG9jYXRlZCB0byBlYWNoIGl0ZW0gYWNjb3JkaW5nIHRvIGl0cyBmcmFjdGlvbmFsIHNpemUuIEFsbCBpdGVtIHNpemVzIGFyZSB0aGVuIGFkanVzdGVkXHJcbiAgICAgKiB0byBicmluZyB0aGUgdG90YWwgYmFjayB0byAxMDAlXHJcbiAgICAgKi9cclxuICAgIHNpemU/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc2l6ZSBvZiB0aGlzIGl0ZW0uXHJcbiAgICAgKiBGb3Igcm93cywgaXQgc3BlY2lmaWVzIGhlaWdodC4gRm9yIGNvbHVtbnMsIGl0IHNwZWNpZmllcyB3aWR0aC5cclxuICAgICAqIEhhcyBmb3JtYXQgPG51bWJlcj48c2l6ZVVuaXQ+LiBDdXJyZW50bHkgb25seSBzdXBwb3J0cyB1bml0cyBgcHhgXHJcbiAgICAgKi9cclxuICAgIG1pblNpemU/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IGEgQ29udGVudEl0ZW0uXHJcbiAgICAgKiBEbyBOT1QgYXNzaWduIGFuIGFycmF5LiAgVGhpcyBvbmx5IGV4aXN0cyBmb3IgbGVnYWN5IHB1cnBvc2VzLiAgSWYgYW4gYXJyYXkgaXMgYXNzaWduZWQsIHRoZSBmaXJzdCBlbGVtZW50XHJcbiAgICAgKiB3aWxsIGJlY29tZSB0aGUgaWQuXHJcbiAgICAgKi9cclxuICAgIGlkPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgaXRlbSBpcyBjbG9zYWJsZS4gSWYgZmFsc2UsIHRoZSB4IG9uIHRoZSBpdGVtcyB0YWIgd2lsbCBiZSBoaWRkZW4gYW5kIGNvbnRhaW5lci5jbG9zZSgpXHJcbiAgICAgKiB3aWxsIHJldHVybiBmYWxzZVxyXG4gICAgICogRGVmYXVsdDogdHJ1ZVxyXG4gICAgICovXHJcbiAgICBpc0Nsb3NhYmxlPzogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0aXRsZSBvZiB0aGUgaXRlbSBhcyBkaXNwbGF5ZWQgb24gaXRzIHRhYiBhbmQgb24gcG9wb3V0IHdpbmRvd3NcclxuICAgICAqIERlZmF1bHQ6IGNvbXBvbmVudFR5cGUudG9TdHJpbmcoKSBvciAnJ1xyXG4gICAgICogQGRlcHJlY2F0ZWQgb25seSBDb21wb25lbnQgaGFzIGEgdGl0bGVcclxuICAgICAqL1xyXG4gICAgdGl0bGU/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgSXRlbUNvbmZpZyB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgY29uc3QgZW51bSBTaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZSB7XHJcbiAgICAgICAgTm9uZSxcclxuICAgICAgICBTaXplLFxyXG4gICAgICAgIFdpZHRoT3JIZWlnaHQsXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUoaXRlbUNvbmZpZzogSXRlbUNvbmZpZywgcm93QW5kQ29sdW1uQ2hpbGRMZWdhY3lTaXplRGVmYXVsdDogYm9vbGVhbik6IFJlc29sdmVkSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgc3dpdGNoIChpdGVtQ29uZmlnLnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5ncm91bmQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKCdJdGVtQ29uZmlnIGNhbm5vdCBzcGVjaWZ5IHR5cGUgZ3JvdW5kJywgSlNPTi5zdHJpbmdpZnkoaXRlbUNvbmZpZykpO1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnJvdzpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUm93T3JDb2x1bW5JdGVtQ29uZmlnLnJlc29sdmUoaXRlbUNvbmZpZyBhcyBSb3dPckNvbHVtbkl0ZW1Db25maWcsIHJvd0FuZENvbHVtbkNoaWxkTGVnYWN5U2l6ZURlZmF1bHQpO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5zdGFjazpcclxuICAgICAgICAgICAgICAgIHJldHVybiBTdGFja0l0ZW1Db25maWcucmVzb2x2ZShpdGVtQ29uZmlnIGFzIFN0YWNrSXRlbUNvbmZpZywgcm93QW5kQ29sdW1uQ2hpbGRMZWdhY3lTaXplRGVmYXVsdCk7XHJcblxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbXBvbmVudDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBDb21wb25lbnRJdGVtQ29uZmlnLnJlc29sdmUoaXRlbUNvbmZpZyBhcyBDb21wb25lbnRJdGVtQ29uZmlnLCByb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0KTtcclxuXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ1VDVUlDUjU1NDk5JywgaXRlbUNvbmZpZy50eXBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDb250ZW50KGNvbnRlbnQ6IEl0ZW1Db25maWdbXSB8IHVuZGVmaW5lZCk6IFJlc29sdmVkSXRlbUNvbmZpZ1tdIHtcclxuICAgICAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBjb3VudCA9IGNvbnRlbnQubGVuZ3RoO1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8UmVzb2x2ZWRJdGVtQ29uZmlnPihjb3VudCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gSXRlbUNvbmZpZy5yZXNvbHZlKGNvbnRlbnRbaV0sIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUlkKGlkOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pZDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpZCkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpZC5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLmlkO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWRbMF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTaXplKFxyXG4gICAgICAgIHNpemU6IHN0cmluZyB8IHVuZGVmaW5lZCxcclxuICAgICAgICB3aWR0aDogbnVtYmVyIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIGhlaWdodDogbnVtYmVyIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIHJvd0FuZENvbHVtbkNoaWxkTGVnYWN5U2l6ZURlZmF1bHQ6IGJvb2xlYW4pOlxyXG4gICAgU2l6ZVdpdGhVbml0IHtcclxuICAgICAgICAvLyBSZW1vdmUgc3VwcG9ydCBmb3Igcm93QW5kQ29sdW1uQ2hpbGRMZWdhY3lTaXplRGVmYXVsdCBpbiBhIG1ham9yIHZlcnNpb24gcmVsZWFzZVxyXG5cclxuICAgICAgICBpZiAoc2l6ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVNpemUoc2l6ZSwgW1NpemVVbml0RW51bS5QZXJjZW50LCBTaXplVW5pdEVudW0uRnJhY3Rpb25hbF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh3aWR0aCAhPT0gdW5kZWZpbmVkIHx8IGhlaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAod2lkdGggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHNpemU6IHdpZHRoLCBzaXplVW5pdDogU2l6ZVVuaXRFbnVtLlBlcmNlbnQgfTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhlaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHNpemU6IGhlaWdodCwgc2l6ZVVuaXQ6IFNpemVVbml0RW51bS5QZXJjZW50IH07XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignQ1JTMzMzOTAnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocm93QW5kQ29sdW1uQ2hpbGRMZWdhY3lTaXplRGVmYXVsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHNpemU6IDUwLCBzaXplVW5pdDogU2l6ZVVuaXRFbnVtLlBlcmNlbnQgfTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc2l6ZTogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLnNpemUsIHNpemVVbml0OiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuc2l6ZVVuaXQgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU1pblNpemUobWluU2l6ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBtaW5XaWR0aDogbnVtYmVyIHwgdW5kZWZpbmVkLCBtaW5IZWlnaHQ6IG51bWJlciB8IHVuZGVmaW5lZCk6IFVuZGVmaW5hYmxlU2l6ZVdpdGhVbml0IHtcclxuICAgICAgICBpZiAobWluU2l6ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVNpemUobWluU2l6ZSwgW1NpemVVbml0RW51bS5QaXhlbF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1pbldpZHRoRGVmaW5lZCA9IG1pbldpZHRoICE9PSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IG1pbkhlaWdodERlZmluZWQgPSBtaW5IZWlnaHQgIT09IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgaWYgKG1pbldpZHRoRGVmaW5lZCB8fCBtaW5IZWlnaHREZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobWluV2lkdGhEZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc2l6ZTogbWluV2lkdGgsIHNpemVVbml0OiBTaXplVW5pdEVudW0uUGl4ZWwgfTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc2l6ZTogbWluSGVpZ2h0LCBzaXplVW5pdDogU2l6ZVVuaXRFbnVtLlBpeGVsIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBzaXplOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMubWluU2l6ZSwgc2l6ZVVuaXQ6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5taW5TaXplVW5pdCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVTaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZShjb25maWc6IEl0ZW1Db25maWcpOiBTaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZSB7XHJcbiAgICAgICAgaWYgKGNvbmZpZy5zaXplICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFNpemVXaWR0aEhlaWdodFNwZWNpZmljYXRpb25UeXBlLlNpemU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGNvbmZpZy53aWR0aCAhPT0gdW5kZWZpbmVkIHx8IGNvbmZpZy5oZWlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFNpemVXaWR0aEhlaWdodFNwZWNpZmljYXRpb25UeXBlLldpZHRoT3JIZWlnaHQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gU2l6ZVdpZHRoSGVpZ2h0U3BlY2lmaWNhdGlvblR5cGUuTm9uZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNHcm91bmQoY29uZmlnOiBJdGVtQ29uZmlnKTogY29uZmlnIGlzIEl0ZW1Db25maWcge1xyXG4gICAgICAgIHJldHVybiBjb25maWcudHlwZSA9PT0gSXRlbVR5cGUuZ3JvdW5kO1xyXG4gICAgfVxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzUm93KGNvbmZpZzogSXRlbUNvbmZpZyk6IGNvbmZpZyBpcyBJdGVtQ29uZmlnIHtcclxuICAgICAgICByZXR1cm4gY29uZmlnLnR5cGUgPT09IEl0ZW1UeXBlLnJvdztcclxuICAgIH1cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0NvbHVtbihjb25maWc6IEl0ZW1Db25maWcpOiBjb25maWcgaXMgSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZy50eXBlID09PSBJdGVtVHlwZS5jb2x1bW47XHJcbiAgICB9XHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNTdGFjayhjb25maWc6IEl0ZW1Db25maWcpOiBjb25maWcgaXMgSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZy50eXBlID09PSBJdGVtVHlwZS5zdGFjaztcclxuICAgIH1cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0NvbXBvbmVudChjb25maWc6IEl0ZW1Db25maWcpOiBjb25maWcgaXMgQ29tcG9uZW50SXRlbUNvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZy50eXBlID09PSBJdGVtVHlwZS5jb21wb25lbnQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8vIFN0YWNrIG9yIENvbXBvbmVudFxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEhlYWRlcmVkSXRlbUNvbmZpZyBleHRlbmRzIEl0ZW1Db25maWcge1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKEhlYWRlcmVkSXRlbUNvbmZpZzpuYW1lc3BhY2UpLihIZWFkZXI6aW50ZXJmYWNlKS5zaG93fSBpbnN0ZWFkICovXHJcbiAgICBoYXNIZWFkZXJzPzogYm9vbGVhbjtcclxuICAgIGhlYWRlcj86IEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXI7XHJcbiAgICBtYXhpbWlzZWQ/OiBib29sZWFuO1xyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIEhlYWRlcmVkSXRlbUNvbmZpZyB7XHJcbiAgICBjb25zdCBsZWdhY3lNYXhpbWlzZWRJZCA9ICdfX2dsTWF4aW1pc2VkJztcclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIEhlYWRlciB7XHJcbiAgICAgICAgc2hvdz86IGZhbHNlIHwgU2lkZTtcclxuICAgICAgICBwb3BvdXQ/OiBmYWxzZSB8IHN0cmluZztcclxuICAgICAgICBkb2NrPzogZmFsc2UgfCBzdHJpbmc7XHJcbiAgICAgICAgbWF4aW1pc2U/OiBmYWxzZSB8IHN0cmluZztcclxuICAgICAgICBjbG9zZT86IGZhbHNlIHwgc3RyaW5nO1xyXG4gICAgICAgIG1pbmltaXNlPzogc3RyaW5nO1xyXG4gICAgICAgIHRhYkRyb3Bkb3duPzogZmFsc2UgfCBzdHJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBIZWFkZXIge1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKGhlYWRlcjogSGVhZGVyIHwgdW5kZWZpbmVkLCBoYXNIZWFkZXJzOiBib29sZWFuIHwgdW5kZWZpbmVkKTogUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICAgICAgaWYgKGhlYWRlciA9PT0gdW5kZWZpbmVkICYmIGhhc0hlYWRlcnMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3c6IGhlYWRlcj8uc2hvdyA/PyAoaGFzSGVhZGVycyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogaGFzSGVhZGVycyA/IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5kZWZhdWx0cy5zaG93IDogZmFsc2UpLFxyXG4gICAgICAgICAgICAgICAgICAgIHBvcG91dDogaGVhZGVyPy5wb3BvdXQsXHJcbiAgICAgICAgICAgICAgICAgICAgbWF4aW1pc2U6IGhlYWRlcj8ubWF4aW1pc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgY2xvc2U6IGhlYWRlcj8uY2xvc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgbWluaW1pc2U6IGhlYWRlcj8ubWluaW1pc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgdGFiRHJvcGRvd246IGhlYWRlcj8udGFiRHJvcGRvd24sXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlSWRBbmRNYXhpbWlzZWQoY29uZmlnOiBIZWFkZXJlZEl0ZW1Db25maWcpOiB7IGlkOiBzdHJpbmcsIG1heGltaXNlZDogYm9vbGVhbn0ge1xyXG4gICAgICAgIGxldCBpZDogc3RyaW5nO1xyXG4gICAgICAgIC8vIFRvIHN1cHBvcnQgbGVnYWN5IGNvbmZpZ3Mgd2l0aCBJZCBzYXZlZCBhcyBhbiBhcnJheSBvZiBzdHJpbmcsIGFzc2lnbiBjb25maWcuaWQgdG8gYSB0eXBlIHdoaWNoIGluY2x1ZGVzIHN0cmluZyBhcnJheVxyXG4gICAgICAgIGxldCBsZWdhY3lJZDogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQgPSBjb25maWcuaWQ7XHJcbiAgICAgICAgbGV0IGxlZ2FjeU1heGltaXNlZCA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChsZWdhY3lJZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGlkID0gUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLmlkO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxlZ2FjeUlkKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaWR4ID0gbGVnYWN5SWQuZmluZEluZGV4KChpZCkgPT4gaWQgPT09IGxlZ2FjeU1heGltaXNlZElkKVxyXG4gICAgICAgICAgICAgICAgaWYgKGlkeCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBsZWdhY3lNYXhpbWlzZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeUlkID0gbGVnYWN5SWQuc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAobGVnYWN5SWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlkID0gbGVnYWN5SWRbMF07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlkID0gUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLmlkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWQgPSBsZWdhY3lJZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG1heGltaXNlZDogYm9vbGVhbjtcclxuICAgICAgICBpZiAoY29uZmlnLm1heGltaXNlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIG1heGltaXNlZCA9IGNvbmZpZy5tYXhpbWlzZWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbWF4aW1pc2VkID0gbGVnYWN5TWF4aW1pc2VkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHsgaWQsIG1heGltaXNlZCB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tJdGVtQ29uZmlnIGV4dGVuZHMgSGVhZGVyZWRJdGVtQ29uZmlnIHtcclxuICAgIHR5cGU6ICdzdGFjayc7XHJcbiAgICBjb250ZW50OiBDb21wb25lbnRJdGVtQ29uZmlnW107XHJcbiAgICAvKiogVGhlIGluZGV4IG9mIHRoZSBpdGVtIGluIGNvbnRlbnQgd2hpY2ggaXMgdG8gYmUgYWN0aXZlKi9cclxuICAgIGFjdGl2ZUl0ZW1JbmRleD86IG51bWJlcjtcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBTdGFja0l0ZW1Db25maWcge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUoaXRlbUNvbmZpZzogU3RhY2tJdGVtQ29uZmlnLCByb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0OiBib29sZWFuKTogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHsgaWQsIG1heGltaXNlZCB9ID0gSGVhZGVyZWRJdGVtQ29uZmlnLnJlc29sdmVJZEFuZE1heGltaXNlZChpdGVtQ29uZmlnKTtcclxuICAgICAgICBjb25zdCB7IHNpemUsIHNpemVVbml0IH0gPSBJdGVtQ29uZmlnLnJlc29sdmVTaXplKGl0ZW1Db25maWcuc2l6ZSwgaXRlbUNvbmZpZy53aWR0aCwgaXRlbUNvbmZpZy5oZWlnaHQsIHJvd0FuZENvbHVtbkNoaWxkTGVnYWN5U2l6ZURlZmF1bHQpO1xyXG4gICAgICAgIGNvbnN0IHsgc2l6ZTogbWluU2l6ZSwgc2l6ZVVuaXQ6IG1pblNpemVVbml0IH0gPSBJdGVtQ29uZmlnLnJlc29sdmVNaW5TaXplKGl0ZW1Db25maWcubWluU2l6ZSwgaXRlbUNvbmZpZy5taW5XaWR0aCwgaXRlbUNvbmZpZy5taW5IZWlnaHQpO1xyXG5cclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5zdGFjayxcclxuICAgICAgICAgICAgY29udGVudDogcmVzb2x2ZUNvbnRlbnQoaXRlbUNvbmZpZy5jb250ZW50KSxcclxuICAgICAgICAgICAgc2l6ZSxcclxuICAgICAgICAgICAgc2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIG1pblNpemUsXHJcbiAgICAgICAgICAgIG1pblNpemVVbml0LFxyXG4gICAgICAgICAgICBpZCxcclxuICAgICAgICAgICAgbWF4aW1pc2VkLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiBpdGVtQ29uZmlnLmlzQ2xvc2FibGUgPz8gUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgICAgIGFjdGl2ZUl0ZW1JbmRleDogaXRlbUNvbmZpZy5hY3RpdmVJdGVtSW5kZXggPz8gUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcuZGVmYXVsdEFjdGl2ZUl0ZW1JbmRleCxcclxuICAgICAgICAgICAgaGVhZGVyOiBIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyLnJlc29sdmUoaXRlbUNvbmZpZy5oZWFkZXIsIGl0ZW1Db25maWcuaGFzSGVhZGVycyksXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmcm9tUmVzb2x2ZWQocmVzb2x2ZWRDb25maWc6IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnKTogU3RhY2tJdGVtQ29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFN0YWNrSXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogSXRlbVR5cGUuc3RhY2ssXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IGZyb21SZXNvbHZlZENvbnRlbnQocmVzb2x2ZWRDb25maWcuY29udGVudCksXHJcbiAgICAgICAgICAgIHNpemU6IGZvcm1hdFNpemUocmVzb2x2ZWRDb25maWcuc2l6ZSwgcmVzb2x2ZWRDb25maWcuc2l6ZVVuaXQpLFxyXG4gICAgICAgICAgICBtaW5TaXplOiBmb3JtYXRVbmRlZmluYWJsZVNpemUocmVzb2x2ZWRDb25maWcubWluU2l6ZSwgcmVzb2x2ZWRDb25maWcubWluU2l6ZVVuaXQpLFxyXG4gICAgICAgICAgICBpZDogcmVzb2x2ZWRDb25maWcuaWQsXHJcbiAgICAgICAgICAgIG1heGltaXNlZDogcmVzb2x2ZWRDb25maWcubWF4aW1pc2VkLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiByZXNvbHZlZENvbmZpZy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgICAgICBhY3RpdmVJdGVtSW5kZXg6IHJlc29sdmVkQ29uZmlnLmFjdGl2ZUl0ZW1JbmRleCxcclxuICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIuY3JlYXRlQ29weShyZXNvbHZlZENvbmZpZy5oZWFkZXIpLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZnVuY3Rpb24gcmVzb2x2ZUNvbnRlbnQoY29udGVudDogQ29tcG9uZW50SXRlbUNvbmZpZ1tdIHwgdW5kZWZpbmVkKTogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnW10ge1xyXG4gICAgICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gY29udGVudC5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWc+KGNvdW50KTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEl0ZW1Db25maWcgPSBjb250ZW50W2ldO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUNvbmZpZyA9IEl0ZW1Db25maWcucmVzb2x2ZShjaGlsZEl0ZW1Db25maWcsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGlmICghUmVzb2x2ZWRJdGVtQ29uZmlnLmlzQ29tcG9uZW50SXRlbShpdGVtQ29uZmlnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignVUNVU0lDUkM5MTExNCcsIEpTT04uc3RyaW5naWZ5KGl0ZW1Db25maWcpKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gaXRlbUNvbmZpZztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBmdW5jdGlvbiBmcm9tUmVzb2x2ZWRDb250ZW50KHJlc29sdmVkQ29udGVudDogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnW10pOiBDb21wb25lbnRJdGVtQ29uZmlnW10ge1xyXG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVzb2x2ZWRDb250ZW50Lmxlbmd0aDtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8Q29tcG9uZW50SXRlbUNvbmZpZz4oY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZENvbnRlbnRDb25maWcgPSByZXNvbHZlZENvbnRlbnRbaV07XHJcbiAgICAgICAgICAgIHJlc3VsdFtpXSA9IENvbXBvbmVudEl0ZW1Db25maWcuZnJvbVJlc29sdmVkKHJlc29sdmVkQ29udGVudENvbmZpZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50SXRlbUNvbmZpZyBleHRlbmRzIEhlYWRlcmVkSXRlbUNvbmZpZyB7XHJcbiAgICB0eXBlOiAnY29tcG9uZW50JztcclxuICAgIHJlYWRvbmx5IGNvbnRlbnQ/OiBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0aXRsZSBvZiB0aGUgaXRlbSBhcyBkaXNwbGF5ZWQgb24gaXRzIHRhYiBhbmQgb24gcG9wb3V0IHdpbmRvd3NcclxuICAgICAqIERlZmF1bHQ6IGNvbXBvbmVudFR5cGUudG9TdHJpbmcoKSBvciAnJ1xyXG4gICAgICovXHJcbiAgICB0aXRsZT86IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSBjb21wb25lbnQuXHJcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChDb21wb25lbnRJdGVtQ29uZmlnOmludGVyZmFjZSkuY29tcG9uZW50VHlwZX0gaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICBjb21wb25lbnROYW1lPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGNvbXBvbmVudC5cclxuICAgICAqIGBjb21wb25lbnRUeXBlYCBtdXN0IGJlIG9mIHR5cGUgYHN0cmluZ2AgaWYgaXQgaXMgcmVnaXN0ZXJlZCB3aXRoIGFueSBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczpcclxuICAgICAqICoge0BsaW5rIChHb2xkZW5MYXlvdXQ6Y2xhc3MpLnJlZ2lzdGVyQ29tcG9uZW50fSAoZGVwcmVjYXRlZClcclxuICAgICAqICoge0BsaW5rIChHb2xkZW5MYXlvdXQ6Y2xhc3MpLnJlZ2lzdGVyQ29tcG9uZW50Q29uc3RydWN0b3J9XHJcbiAgICAgKiAqIHtAbGluayAoR29sZGVuTGF5b3V0OmNsYXNzKS5yZWdpc3RlckNvbXBvbmVudEZhY3RvcnlGdW5jdGlvbn1cclxuICAgICAqL1xyXG4gICAgY29tcG9uZW50VHlwZTogSnNvblZhbHVlO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc3RhdGUgaW5mb3JtYXRpb24gd2l0aCB3aGljaCBhIGNvbXBvbmVudCB3aWxsIGJlIGluaXRpYWxpc2VkIHdpdGguXHJcbiAgICAgKiBXaWxsIGJlIHBhc3NlZCB0byB0aGUgY29tcG9uZW50IGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGFuZCB3aWxsIGJlIHRoZSB2YWx1ZSByZXR1cm5lZCBieVxyXG4gICAgICogY29udGFpbmVyLmluaXRpYWxTdGF0ZS5cclxuICAgICAqL1xyXG4gICAgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZhdWx0OiB0cnVlXHJcbiAgICAgKi9cclxuICAgIHJlb3JkZXJFbmFibGVkPzogYm9vbGVhbjsgIC8vIFRha2VzIHByZWNlZGVuY2Ugb3ZlciBMYXlvdXRDb25maWcucmVvcmRlckVuYWJsZWQuXHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgQ29tcG9uZW50SXRlbUNvbmZpZyB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnLCByb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0OiBib29sZWFuKTogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnIHtcclxuICAgICAgICBsZXQgY29tcG9uZW50VHlwZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkID0gaXRlbUNvbmZpZy5jb21wb25lbnRUeXBlO1xyXG4gICAgICAgIGlmIChjb21wb25lbnRUeXBlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29tcG9uZW50VHlwZSA9IGl0ZW1Db25maWcuY29tcG9uZW50TmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbXBvbmVudFR5cGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbXBvbmVudEl0ZW1Db25maWcuY29tcG9uZW50VHlwZSBpcyB1bmRlZmluZWQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB7IGlkLCBtYXhpbWlzZWQgfSA9IEhlYWRlcmVkSXRlbUNvbmZpZy5yZXNvbHZlSWRBbmRNYXhpbWlzZWQoaXRlbUNvbmZpZyk7XHJcbiAgICAgICAgICAgIGxldCB0aXRsZTogc3RyaW5nO1xyXG4gICAgICAgICAgICBpZiAoaXRlbUNvbmZpZy50aXRsZSA9PT0gdW5kZWZpbmVkIHx8IGl0ZW1Db25maWcudGl0bGUgPT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICB0aXRsZSA9IENvbXBvbmVudEl0ZW1Db25maWcuY29tcG9uZW50VHlwZVRvVGl0bGUoY29tcG9uZW50VHlwZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aXRsZSA9IGl0ZW1Db25maWcudGl0bGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgeyBzaXplLCBzaXplVW5pdCB9ID0gSXRlbUNvbmZpZy5yZXNvbHZlU2l6ZShpdGVtQ29uZmlnLnNpemUsIGl0ZW1Db25maWcud2lkdGgsIGl0ZW1Db25maWcuaGVpZ2h0LCByb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0KTtcclxuICAgICAgICAgICAgY29uc3QgeyBzaXplOiBtaW5TaXplLCBzaXplVW5pdDogbWluU2l6ZVVuaXQgfSA9IEl0ZW1Db25maWcucmVzb2x2ZU1pblNpemUoaXRlbUNvbmZpZy5taW5TaXplLCBpdGVtQ29uZmlnLm1pbldpZHRoLCBpdGVtQ29uZmlnLm1pbkhlaWdodCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogaXRlbUNvbmZpZy50eXBlLFxyXG4gICAgICAgICAgICAgICAgY29udGVudDogW10sXHJcbiAgICAgICAgICAgICAgICBzaXplLFxyXG4gICAgICAgICAgICAgICAgc2l6ZVVuaXQsXHJcbiAgICAgICAgICAgICAgICBtaW5TaXplLFxyXG4gICAgICAgICAgICAgICAgbWluU2l6ZVVuaXQsXHJcbiAgICAgICAgICAgICAgICBpZCxcclxuICAgICAgICAgICAgICAgIG1heGltaXNlZCxcclxuICAgICAgICAgICAgICAgIGlzQ2xvc2FibGU6IGl0ZW1Db25maWcuaXNDbG9zYWJsZSA/PyBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuaXNDbG9zYWJsZSxcclxuICAgICAgICAgICAgICAgIHJlb3JkZXJFbmFibGVkOiBpdGVtQ29uZmlnLnJlb3JkZXJFbmFibGVkID8/IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZy5kZWZhdWx0UmVvcmRlckVuYWJsZWQsXHJcbiAgICAgICAgICAgICAgICB0aXRsZSxcclxuICAgICAgICAgICAgICAgIGhlYWRlcjogSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlci5yZXNvbHZlKGl0ZW1Db25maWcuaGVhZGVyLCBpdGVtQ29uZmlnLmhhc0hlYWRlcnMpLFxyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50VHlwZSxcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlOiBpdGVtQ29uZmlnLmNvbXBvbmVudFN0YXRlID8/IHt9LFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZnJvbVJlc29sdmVkKHJlc29sdmVkQ29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpOiBDb21wb25lbnRJdGVtQ29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IENvbXBvbmVudEl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLmNvbXBvbmVudCxcclxuICAgICAgICAgICAgc2l6ZTogZm9ybWF0U2l6ZShyZXNvbHZlZENvbmZpZy5zaXplLCByZXNvbHZlZENvbmZpZy5zaXplVW5pdCksXHJcbiAgICAgICAgICAgIG1pblNpemU6IGZvcm1hdFVuZGVmaW5hYmxlU2l6ZShyZXNvbHZlZENvbmZpZy5taW5TaXplLCByZXNvbHZlZENvbmZpZy5taW5TaXplVW5pdCksXHJcbiAgICAgICAgICAgIGlkOiByZXNvbHZlZENvbmZpZy5pZCxcclxuICAgICAgICAgICAgbWF4aW1pc2VkOiByZXNvbHZlZENvbmZpZy5tYXhpbWlzZWQsXHJcbiAgICAgICAgICAgIGlzQ2xvc2FibGU6IHJlc29sdmVkQ29uZmlnLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgICAgIHJlb3JkZXJFbmFibGVkOiByZXNvbHZlZENvbmZpZy5yZW9yZGVyRW5hYmxlZCxcclxuICAgICAgICAgICAgdGl0bGU6IHJlc29sdmVkQ29uZmlnLnRpdGxlLFxyXG4gICAgICAgICAgICBoZWFkZXI6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlci5jcmVhdGVDb3B5KHJlc29sdmVkQ29uZmlnLmhlYWRlciksXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFR5cGU6IHJlc29sdmVkQ29uZmlnLmNvbXBvbmVudFR5cGUsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlOiBkZWVwRXh0ZW5kVmFsdWUodW5kZWZpbmVkLCByZXNvbHZlZENvbmZpZy5jb21wb25lbnRTdGF0ZSkgYXMgSnNvblZhbHVlLFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY29tcG9uZW50VHlwZVRvVGl0bGUoY29tcG9uZW50VHlwZTogSnNvblZhbHVlKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBjb21wb25lbnRUeXBlVHlwZSA9IHR5cGVvZiBjb21wb25lbnRUeXBlO1xyXG4gICAgICAgIHN3aXRjaCAoY29tcG9uZW50VHlwZVR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzogcmV0dXJuIGNvbXBvbmVudFR5cGUgYXMgc3RyaW5nO1xyXG4gICAgICAgICAgICBjYXNlICdudW1iZXInOiByZXR1cm4gKGNvbXBvbmVudFR5cGUgYXMgbnVtYmVyKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBjYXNlICdib29sZWFuJzogcmV0dXJuIChjb21wb25lbnRUeXBlIGFzIGJvb2xlYW4pLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAnJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8vIFJvd09yQ29sdW1uXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUm93T3JDb2x1bW5JdGVtQ29uZmlnIGV4dGVuZHMgSXRlbUNvbmZpZyB7XHJcbiAgICB0eXBlOiAncm93JyB8ICdjb2x1bW4nO1xyXG4gICAgY29udGVudDogKFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFN0YWNrSXRlbUNvbmZpZyB8IENvbXBvbmVudEl0ZW1Db25maWcpW107XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUm93T3JDb2x1bW5JdGVtQ29uZmlnIHtcclxuICAgIGV4cG9ydCB0eXBlIENoaWxkSXRlbUNvbmZpZyA9IFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFN0YWNrSXRlbUNvbmZpZyB8IENvbXBvbmVudEl0ZW1Db25maWc7XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzQ2hpbGRJdGVtQ29uZmlnKGl0ZW1Db25maWc6IEl0ZW1Db25maWcpOiBpdGVtQ29uZmlnIGlzIENoaWxkSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgc3dpdGNoIChpdGVtQ29uZmlnLnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29sdW1uOlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnN0YWNrOlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbXBvbmVudDpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmdyb3VuZDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlYWNoYWJsZUNhc2VFcnJvcignVVJPQ09TUENJQ0lDMTM2ODcnLCBpdGVtQ29uZmlnLnR5cGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShpdGVtQ29uZmlnOiBSb3dPckNvbHVtbkl0ZW1Db25maWcsIHJvd0FuZENvbHVtbkNoaWxkTGVnYWN5U2l6ZURlZmF1bHQ6IGJvb2xlYW4pOiBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgeyBzaXplLCBzaXplVW5pdCB9ID0gSXRlbUNvbmZpZy5yZXNvbHZlU2l6ZShpdGVtQ29uZmlnLnNpemUsIGl0ZW1Db25maWcud2lkdGgsIGl0ZW1Db25maWcuaGVpZ2h0LCByb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0KTtcclxuICAgICAgICBjb25zdCB7IHNpemU6IG1pblNpemUsIHNpemVVbml0OiBtaW5TaXplVW5pdCB9ID0gSXRlbUNvbmZpZy5yZXNvbHZlTWluU2l6ZShpdGVtQ29uZmlnLm1pblNpemUsIGl0ZW1Db25maWcubWluV2lkdGgsIGl0ZW1Db25maWcubWluSGVpZ2h0KTtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiBpdGVtQ29uZmlnLnR5cGUsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IFJvd09yQ29sdW1uSXRlbUNvbmZpZy5yZXNvbHZlQ29udGVudChpdGVtQ29uZmlnLmNvbnRlbnQpLFxyXG4gICAgICAgICAgICBzaXplLFxyXG4gICAgICAgICAgICBzaXplVW5pdCxcclxuICAgICAgICAgICAgbWluU2l6ZSxcclxuICAgICAgICAgICAgbWluU2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIGlkOiBJdGVtQ29uZmlnLnJlc29sdmVJZChpdGVtQ29uZmlnLmlkKSxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogaXRlbUNvbmZpZy5pc0Nsb3NhYmxlID8/IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmcm9tUmVzb2x2ZWQocmVzb2x2ZWRDb25maWc6IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnKTogUm93T3JDb2x1bW5JdGVtQ29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJvd09yQ29sdW1uSXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogcmVzb2x2ZWRDb25maWcudHlwZSxcclxuICAgICAgICAgICAgY29udGVudDogZnJvbVJlc29sdmVkQ29udGVudChyZXNvbHZlZENvbmZpZy5jb250ZW50KSxcclxuICAgICAgICAgICAgc2l6ZTogZm9ybWF0U2l6ZShyZXNvbHZlZENvbmZpZy5zaXplLCByZXNvbHZlZENvbmZpZy5zaXplVW5pdCksXHJcbiAgICAgICAgICAgIG1pblNpemU6IGZvcm1hdFVuZGVmaW5hYmxlU2l6ZShyZXNvbHZlZENvbmZpZy5taW5TaXplLCByZXNvbHZlZENvbmZpZy5taW5TaXplVW5pdCksXHJcbiAgICAgICAgICAgIGlkOiByZXNvbHZlZENvbmZpZy5pZCxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogcmVzb2x2ZWRDb25maWcuaXNDbG9zYWJsZSxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDb250ZW50KGNvbnRlbnQ6IENoaWxkSXRlbUNvbmZpZ1tdIHwgdW5kZWZpbmVkKTogUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcuQ2hpbGRJdGVtQ29uZmlnW10ge1xyXG4gICAgICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gY29udGVudC5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkSXRlbUNvbmZpZ3MgPSBuZXcgQXJyYXk8Um93T3JDb2x1bW5JdGVtQ29uZmlnLkNoaWxkSXRlbUNvbmZpZz4oY291bnQpO1xyXG4gICAgICAgICAgICBsZXQgd2lkdGhPckhlaWdodFNwZWNpZmllZEF0TGVhc3RPbmNlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGxldCBzaXplU3BlY2lmaWVkQXRMZWFzdE9uY2UgPSBmYWxzZTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEl0ZW1Db25maWcgPSBjb250ZW50W2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFSb3dPckNvbHVtbkl0ZW1Db25maWcuaXNDaGlsZEl0ZW1Db25maWcoY2hpbGRJdGVtQ29uZmlnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoJ0l0ZW1Db25maWcgaXMgbm90IFJvdywgQ29sdW1uIG9yIFN0YWNrJywgY2hpbGRJdGVtQ29uZmlnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaXplU3BlY2lmaWVkQXRMZWFzdE9uY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZVdpZHRoSGVpZ2h0U3BlY2lmaWNhdGlvblR5cGUgPSBJdGVtQ29uZmlnLmNhbGN1bGF0ZVNpemVXaWR0aEhlaWdodFNwZWNpZmljYXRpb25UeXBlKGNoaWxkSXRlbUNvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc2l6ZVdpZHRoSGVpZ2h0U3BlY2lmaWNhdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbUNvbmZpZy5TaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZS5Ob25lOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtQ29uZmlnLlNpemVXaWR0aEhlaWdodFNwZWNpZmljYXRpb25UeXBlLldpZHRoT3JIZWlnaHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhPckhlaWdodFNwZWNpZmllZEF0TGVhc3RPbmNlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbUNvbmZpZy5TaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZS5TaXplOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVTcGVjaWZpZWRBdExlYXN0T25jZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlYWNoYWJsZUNhc2VFcnJvcignUk9DSUNSQzg3NTU2Jywgc2l6ZVdpZHRoSGVpZ2h0U3BlY2lmaWNhdGlvblR5cGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkSXRlbUNvbmZpZ3NbaV0gPSBjaGlsZEl0ZW1Db25maWc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBsZWdhY3lTaXplRGVmYXVsdDogYm9vbGVhbjtcclxuICAgICAgICAgICAgaWYgKHNpemVTcGVjaWZpZWRBdExlYXN0T25jZSkge1xyXG4gICAgICAgICAgICAgICAgbGVnYWN5U2l6ZURlZmF1bHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh3aWR0aE9ySGVpZ2h0U3BlY2lmaWVkQXRMZWFzdE9uY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZWdhY3lTaXplRGVmYXVsdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVNpemVEZWZhdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZy5DaGlsZEl0ZW1Db25maWc+KGNvdW50KTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEl0ZW1Db25maWcgPSBjaGlsZEl0ZW1Db25maWdzW2ldO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRDaGlsZEl0ZW1Db25maWcgPSBJdGVtQ29uZmlnLnJlc29sdmUoY2hpbGRJdGVtQ29uZmlnLCBsZWdhY3lTaXplRGVmYXVsdCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIVJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLmlzQ2hpbGRJdGVtQ29uZmlnKHJlc29sdmVkQ2hpbGRJdGVtQ29uZmlnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignVVJPQ09TUElDOTk1MTInLCBKU09OLnN0cmluZ2lmeShyZXNvbHZlZENoaWxkSXRlbUNvbmZpZykpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSByZXNvbHZlZENoaWxkSXRlbUNvbmZpZztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBmdW5jdGlvbiBmcm9tUmVzb2x2ZWRDb250ZW50KHJlc29sdmVkQ29udGVudDogcmVhZG9ubHkgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcuQ2hpbGRJdGVtQ29uZmlnW10pOiBSb3dPckNvbHVtbkl0ZW1Db25maWcuQ2hpbGRJdGVtQ29uZmlnW10ge1xyXG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVzb2x2ZWRDb250ZW50Lmxlbmd0aDtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8Um93T3JDb2x1bW5JdGVtQ29uZmlnLkNoaWxkSXRlbUNvbmZpZz4oY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZENvbnRlbnRDb25maWcgPSByZXNvbHZlZENvbnRlbnRbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSByZXNvbHZlZENvbnRlbnRDb25maWcudHlwZTtcclxuICAgICAgICAgICAgbGV0IGNvbnRlbnRDb25maWc6IFJvd09yQ29sdW1uSXRlbUNvbmZpZy5DaGlsZEl0ZW1Db25maWc7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6XHJcbiAgICAgICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbHVtbjpcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50Q29uZmlnID0gUm93T3JDb2x1bW5JdGVtQ29uZmlnLmZyb21SZXNvbHZlZChyZXNvbHZlZENvbnRlbnRDb25maWcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5zdGFjazpcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50Q29uZmlnID0gU3RhY2tJdGVtQ29uZmlnLmZyb21SZXNvbHZlZChyZXNvbHZlZENvbnRlbnRDb25maWcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb21wb25lbnQ6XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudENvbmZpZyA9IENvbXBvbmVudEl0ZW1Db25maWcuZnJvbVJlc29sdmVkKHJlc29sdmVkQ29udGVudENvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlYWNoYWJsZUNhc2VFcnJvcignUk9DSUNGUkM0NDc5NycsIHR5cGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc3VsdFtpXSA9IGNvbnRlbnRDb25maWc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCB0eXBlIFJvb3RJdGVtQ29uZmlnID0gUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgU3RhY2tJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZztcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUm9vdEl0ZW1Db25maWcge1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzUm9vdEl0ZW1Db25maWcoaXRlbUNvbmZpZzogSXRlbUNvbmZpZyk6IGl0ZW1Db25maWcgaXMgUm9vdEl0ZW1Db25maWcge1xyXG4gICAgICAgIHN3aXRjaCAoaXRlbUNvbmZpZy50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUucm93OlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbHVtbjpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5zdGFjazpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb21wb25lbnQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5ncm91bmQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ1VSSUNJUjIzNjg3JywgaXRlbUNvbmZpZy50eXBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUoaXRlbUNvbmZpZzogUm9vdEl0ZW1Db25maWcgfCB1bmRlZmluZWQpOiBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBpZiAoaXRlbUNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gSXRlbUNvbmZpZy5yZXNvbHZlKGl0ZW1Db25maWcsIGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKCFSZXNvbHZlZFJvb3RJdGVtQ29uZmlnLmlzUm9vdEl0ZW1Db25maWcocmVzdWx0KSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcignSXRlbUNvbmZpZyBpcyBub3QgUm93LCBDb2x1bW4gb3IgU3RhY2snLCBKU09OLnN0cmluZ2lmeShpdGVtQ29uZmlnKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmcm9tUmVzb2x2ZWRPclVuZGVmaW5lZChyZXNvbHZlZEl0ZW1Db25maWc6IFJlc29sdmVkUm9vdEl0ZW1Db25maWcgfCB1bmRlZmluZWQpOiBSb290SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKHJlc29sdmVkSXRlbUNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHJlc29sdmVkSXRlbUNvbmZpZy50eXBlO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUucm93OlxyXG4gICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJvd09yQ29sdW1uSXRlbUNvbmZpZy5mcm9tUmVzb2x2ZWQocmVzb2x2ZWRJdGVtQ29uZmlnKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuc3RhY2s6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0YWNrSXRlbUNvbmZpZy5mcm9tUmVzb2x2ZWQocmVzb2x2ZWRJdGVtQ29uZmlnKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29tcG9uZW50OlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBDb21wb25lbnRJdGVtQ29uZmlnLmZyb21SZXNvbHZlZChyZXNvbHZlZEl0ZW1Db25maWcpO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ1JJQ0ZST1U4OTkyMScsIHR5cGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIExheW91dENvbmZpZyB7XHJcbiAgICByb290OiBSb290SXRlbUNvbmZpZyB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIChMYXlvdXRDb25maWc6aW50ZXJmYWNlKS5yb290fSAqL1xyXG4gICAgY29udGVudD86IChSb3dPckNvbHVtbkl0ZW1Db25maWcgfCBTdGFja0l0ZW1Db25maWcgfCBDb21wb25lbnRJdGVtQ29uZmlnKVtdO1xyXG4gICAgb3BlblBvcG91dHM/OiBQb3BvdXRMYXlvdXRDb25maWdbXTtcclxuICAgIGRpbWVuc2lvbnM/OiBMYXlvdXRDb25maWcuRGltZW5zaW9ucztcclxuICAgIHNldHRpbmdzPzogTGF5b3V0Q29uZmlnLlNldHRpbmdzO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzppbnRlcmZhY2UpLmhlYWRlcn0gaW5zdGVhZCAqL1xyXG4gICAgbGFiZWxzPzogTGF5b3V0Q29uZmlnLkxhYmVscztcclxuICAgIGhlYWRlcj86IExheW91dENvbmZpZy5IZWFkZXI7XHJcbn1cclxuXHJcbi8qKiBVc2UgdG8gc3BlY2lmeSBMYXlvdXRDb25maWcgd2l0aCBkZWZhdWx0cyBvciBkZXNlcmlhbGlzZSBhIExheW91dENvbmZpZy5cclxuICogRGVzZXJpYWxpc2F0aW9uIHdpbGwgaGFuZGxlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxyXG4gKiBOb3RlIHRoYXQgTGF5b3V0Q29uZmlnIHNob3VsZCBiZSB1c2VkIGZvciBzZXJpYWxpc2F0aW9uIChub3QgTGF5b3V0Q29uZmlnKVxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIExheW91dENvbmZpZyB7XHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2UgJHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKEhlYWRlcjppbnRlcmZhY2UpLnNob3d9IGluc3RlYWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBoYXNIZWFkZXJzPzogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdHJ1ZSwgdGhlIHVzZXIgY2FuIGRyYWcgY29tcG9uZW50cyBmcm9tIG9uZSB3aW5kb3cgdG8gYW5vdGhlci5cclxuICAgICAgICAgKiBEZWZhdWx0OiB0cnVlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZHJhZ0JldHdlZW5XaW5kb3dzPzogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdHJ1ZSwgdGhlIHVzZXIgY2FuIGRyYWcgYW5kIGRyb3AgY29tcG9uZW50cyBvdXRzaWRlIHRoZWlyIGNvbnRhaW5pbmcgd2luZG93LCBjcmVhdGluZyBhIG5ldyBwb3BvdXQgd2luZG93LlxyXG4gICAgICAgICAqIERlZmF1bHQ6IHRydWVcclxuICAgICAgICAgKi9cclxuICAgICAgICBkcmFnVG9OZXdXaW5kb3c/OiBib29sZWFuO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0cnVlLCB0aGUgdXNlciBjYW4gcmUtYXJyYW5nZSB0aGUgbGF5b3V0IGJ5IGRyYWdnaW5nIGl0ZW1zIGJ5IHRoZWlyIHRhYnMgdG8gdGhlIGRlc2lyZWQgbG9jYXRpb24uXHJcbiAgICAgICAgICogQ2FuIGJlIG92ZXJyaWRkZW4gYnkgSXRlbUNvbmZpZy5yZW9yZGVyRW5hYmxlZCBmb3Igc3BlY2lmaWMgSXRlbUNvbmZpZ3NcclxuICAgICAgICAgKiBEZWZhdWx0OiB0cnVlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcmVvcmRlckVuYWJsZWQ/OiBib29sZWFuO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBEZWNpZGVzIHdoYXQgd2lsbCBiZSBvcGVuZWQgaW4gYSBuZXcgd2luZG93IGlmIHRoZSB1c2VyIGNsaWNrcyB0aGUgcG9wb3V0IGljb24uIElmIHRydWUgdGhlIGVudGlyZSBzdGFjayB3aWxsXHJcbiAgICAgICAgICogYmUgdHJhbnNmZXJyZWQgdG8gdGhlIG5ldyB3aW5kb3csIGlmIGZhbHNlIG9ubHkgdGhlIGFjdGl2ZSBjb21wb25lbnQgd2lsbCBiZSBvcGVuZWQuXHJcbiAgICAgICAgICogRGVmYXVsdDogZmFsc2VcclxuICAgICAgICAgKi9cclxuICAgICAgICBwb3BvdXRXaG9sZVN0YWNrPzogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU3BlY2lmaWVzIGlmIGFuIGVycm9yIGlzIHRocm93biB3aGVuIGEgcG9wb3V0IGlzIGJsb2NrZWQgYnkgdGhlIGJyb3dzZXIgKGUuZy4gYnkgb3BlbmluZyBpdCBwcm9ncmFtbWF0aWNhbGx5KS5cclxuICAgICAgICAgKiBJZiBmYWxzZSwgdGhlIHBvcG91dCBjYWxsIHdpbGwgZmFpbCBzaWxlbnRseS5cclxuICAgICAgICAgKiBEZWZhdWx0OiB0cnVlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgYmxvY2tlZFBvcG91dHNUaHJvd0Vycm9yPzogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU3BlY2lmaWVzIGlmIGFsbCBwb3BvdXRzIHNob3VsZCBiZSBjbG9zZWQgd2hlbiB0aGUgcGFnZSB0aGF0IGNyZWF0ZWQgdGhlbSBpcyBjbG9zZWQuIFBvcG91dHMgZG9uJ3QgaGF2ZSBhXHJcbiAgICAgICAgICogc3Ryb25nIGRlcGVuZGVuY3kgb24gdGhlaXIgcGFyZW50IGFuZCBjYW4gZXhpc3Qgb24gdGhlaXIgb3duLCBidXQgY2FuIGJlIHF1aXRlIGFubm95aW5nIHRvIGNsb3NlIGJ5IGhhbmQuIEluXHJcbiAgICAgICAgICogYWRkaXRpb24sIGFueSBjaGFuZ2VzIG1hZGUgdG8gcG9wb3V0cyB3b24ndCBiZSBzdG9yZWQgYWZ0ZXIgdGhlIHBhcmVudCBpcyBjbG9zZWQuXHJcbiAgICAgICAgICogRGVmYXVsdDogdHJ1ZVxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uIDMuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY2xvc2VQb3BvdXRzT25VbmxvYWQ/OiBib29sZWFuO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTcGVjaWZpZXMgaWYgdGhlIHBvcG91dCBpY29uIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIGhlYWRlci1iYXIuXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKEhlYWRlcjppbnRlcmZhY2UpLnBvcG91dH0gaW5zdGVhZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHNob3dQb3BvdXRJY29uPzogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU3BlY2lmaWVzIGlmIHRoZSBtYXhpbWlzZSBpY29uIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIGhlYWRlci1iYXIuXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKEhlYWRlcjppbnRlcmZhY2UpLm1heGltaXNlfSBpbnN0ZWFkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2hvd01heGltaXNlSWNvbj86IGJvb2xlYW47XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNwZWNpZmllcyBpZiB0aGUgY2xvc2UgaWNvbiBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZSBoZWFkZXItYmFyLlxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzpuYW1lc3BhY2UpLihIZWFkZXI6aW50ZXJmYWNlKS5jbG9zZX0gaW5zdGVhZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHNob3dDbG9zZUljb24/OiBib29sZWFuO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTcGVjaWZpZXMgUmVzcG9uc2l2ZSBNb2RlIChtb3JlIGluZm8gbmVlZGVkKS5cclxuICAgICAgICAgKiBEZWZhdWx0OiBub25lXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcmVzcG9uc2l2ZU1vZGU/OiBSZXNwb25zaXZlTW9kZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU3BlY2lmaWVzIE1heGltdW0gcGl4ZWwgb3ZlcmxhcCBwZXIgdGFiLlxyXG4gICAgICAgICAqIERlZmF1bHQ6IDBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0YWJPdmVybGFwQWxsb3dhbmNlPzogbnVtYmVyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIERlZmF1bHQ6IHRydWVcclxuICAgICAgICAgKi9cclxuICAgICAgICByZW9yZGVyT25UYWJNZW51Q2xpY2s/OiBib29sZWFuO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBEZWZhdWx0OiAxMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRhYkNvbnRyb2xPZmZzZXQ/OiBudW1iZXI7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIHBvcCBpbiBlbGVtZW50cyB3aGVuIGNsb3NpbmcgYSBwb3BvdXQgd2luZG93LlxyXG4gICAgICAgICAqIERlZmF1bHQ6IGZhbHNlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcG9wSW5PbkNsb3NlPzogYm9vbGVhbjtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbmFtZXNwYWNlIFNldHRpbmdzIHtcclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShzZXR0aW5nczogU2V0dGluZ3MgfCB1bmRlZmluZWQpOiBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncyB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MgPSB7XHJcbiAgICAgICAgICAgICAgICBkcmFnQmV0d2VlbldpbmRvd3M6IHNldHRpbmdzPy5kcmFnQmV0d2VlbldpbmRvd3MgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuZGVmYXVsdHMuZHJhZ0JldHdlZW5XaW5kb3dzLFxyXG4gICAgICAgICAgICAgICAgZHJhZ1RvTmV3V2luZG93OiBzZXR0aW5ncz8uZHJhZ1RvTmV3V2luZG93ID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmRlZmF1bHRzLmRyYWdUb05ld1dpbmRvdyxcclxuICAgICAgICAgICAgICAgIHJlb3JkZXJFbmFibGVkOiBzZXR0aW5ncz8ucmVvcmRlckVuYWJsZWQgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuZGVmYXVsdHMucmVvcmRlckVuYWJsZWQsXHJcbiAgICAgICAgICAgICAgICBwb3BvdXRXaG9sZVN0YWNrOiBzZXR0aW5ncz8ucG9wb3V0V2hvbGVTdGFjayA/PyBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5kZWZhdWx0cy5wb3BvdXRXaG9sZVN0YWNrLFxyXG4gICAgICAgICAgICAgICAgYmxvY2tlZFBvcG91dHNUaHJvd0Vycm9yOiBzZXR0aW5ncz8uYmxvY2tlZFBvcG91dHNUaHJvd0Vycm9yID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmRlZmF1bHRzLmJsb2NrZWRQb3BvdXRzVGhyb3dFcnJvcixcclxuICAgICAgICAgICAgICAgIGNsb3NlUG9wb3V0c09uVW5sb2FkOiBzZXR0aW5ncz8uY2xvc2VQb3BvdXRzT25VbmxvYWQgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuZGVmYXVsdHMuY2xvc2VQb3BvdXRzT25VbmxvYWQsXHJcbiAgICAgICAgICAgICAgICByZXNwb25zaXZlTW9kZTogc2V0dGluZ3M/LnJlc3BvbnNpdmVNb2RlID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmRlZmF1bHRzLnJlc3BvbnNpdmVNb2RlLFxyXG4gICAgICAgICAgICAgICAgdGFiT3ZlcmxhcEFsbG93YW5jZTogc2V0dGluZ3M/LnRhYk92ZXJsYXBBbGxvd2FuY2UgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuZGVmYXVsdHMudGFiT3ZlcmxhcEFsbG93YW5jZSxcclxuICAgICAgICAgICAgICAgIHJlb3JkZXJPblRhYk1lbnVDbGljazogc2V0dGluZ3M/LnJlb3JkZXJPblRhYk1lbnVDbGljayA/PyBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5kZWZhdWx0cy5yZW9yZGVyT25UYWJNZW51Q2xpY2ssXHJcbiAgICAgICAgICAgICAgICB0YWJDb250cm9sT2Zmc2V0OiBzZXR0aW5ncz8udGFiQ29udHJvbE9mZnNldCA/PyBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5kZWZhdWx0cy50YWJDb250cm9sT2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgcG9wSW5PbkNsb3NlOiBzZXR0aW5ncz8ucG9wSW5PbkNsb3NlID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmRlZmF1bHRzLnBvcEluT25DbG9zZSxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIERpbWVuc2lvbnMge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgYm9yZGVycyBiZXR3ZWVuIHRoZSBsYXlvdXQgaXRlbXMgaW4gcGl4ZWwuIFBsZWFzZSBub3RlOiBUaGUgYWN0dWFsIGRyYWdnYWJsZSBhcmVhIGlzIHdpZGVyXHJcbiAgICAgICAgICogdGhhbiB0aGUgdmlzaWJsZSBvbmUsIG1ha2luZyBpdCBzYWZlIHRvIHNldCB0aGlzIHRvIHNtYWxsIHZhbHVlcyB3aXRob3V0IGFmZmVjdGluZyB1c2FiaWxpdHkuXHJcbiAgICAgICAgICogRGVmYXVsdDogNVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGJvcmRlcldpZHRoPzogbnVtYmVyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBEZWZhdWx0OiAxNVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGJvcmRlckdyYWJXaWR0aD86IG51bWJlcixcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG1pbmltdW0gaGVpZ2h0IGFuIGl0ZW0gY2FuIGJlIHJlc2l6ZWQgdG8gKGluIHBpeGVsKS5cclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oRGltZW5zaW9uczppbnRlcmZhY2UpLmRlZmF1bHRNaW5JdGVtSGVpZ2h0fSBpbnN0ZWFkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbWluSXRlbUhlaWdodD86IG51bWJlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG1pbmltdW0gaGVpZ2h0IGFuIGl0ZW0gY2FuIGJlIHJlc2l6ZWQgdG8uXHJcbiAgICAgICAgICogRGVmYXVsdDogMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGRlZmF1bHRNaW5JdGVtSGVpZ2h0Pzogc3RyaW5nO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbWluaW11bSB3aWR0aCBhbiBpdGVtIGNhbiBiZSByZXNpemVkIHRvIChpbiBwaXhlbCkuXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKERpbWVuc2lvbnM6aW50ZXJmYWNlKS5kZWZhdWx0TWluSXRlbVdpZHRofSBpbnN0ZWFkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbWluSXRlbVdpZHRoPzogbnVtYmVyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbWluaW11bSB3aWR0aCBhbiBpdGVtIGNhbiBiZSByZXNpemVkIHRvLlxyXG4gICAgICAgICAqIERlZmF1bHQ6IDEwcHhcclxuICAgICAgICAgKi9cclxuICAgICAgICBkZWZhdWx0TWluSXRlbVdpZHRoPzogc3RyaW5nO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBoZWFkZXIgZWxlbWVudHMgaW4gcGl4ZWwuIFRoaXMgY2FuIGJlIGNoYW5nZWQsIGJ1dCB5b3VyIHRoZW1lJ3MgaGVhZGVyIGNzcyBuZWVkcyB0byBiZVxyXG4gICAgICAgICAqIGFkanVzdGVkIGFjY29yZGluZ2x5LlxyXG4gICAgICAgICAqIERlZmF1bHQ6IDIwXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaGVhZGVySGVpZ2h0PzogbnVtYmVyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIGVsZW1lbnQgdGhhdCBhcHBlYXJzIHdoZW4gYW4gaXRlbSBpcyBkcmFnZ2VkIChpbiBwaXhlbCkuXHJcbiAgICAgICAgICogRGVmYXVsdDogMzAwXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZHJhZ1Byb3h5V2lkdGg/OiBudW1iZXI7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIGVsZW1lbnQgdGhhdCBhcHBlYXJzIHdoZW4gYW4gaXRlbSBpcyBkcmFnZ2VkIChpbiBwaXhlbCkuXHJcbiAgICAgICAgICogRGVmYXVsdDogMjAwXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZHJhZ1Byb3h5SGVpZ2h0PzogbnVtYmVyO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBuYW1lc3BhY2UgRGltZW5zaW9ucyB7XHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKGRpbWVuc2lvbnM6IERpbWVuc2lvbnMgfCB1bmRlZmluZWQpOiBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zIHtcclxuICAgICAgICAgICAgY29uc3QgeyBzaXplOiBkZWZhdWx0TWluSXRlbUhlaWdodCwgc2l6ZVVuaXQ6IGRlZmF1bHRNaW5JdGVtSGVpZ2h0VW5pdCB9ID0gRGltZW5zaW9ucy5yZXNvbHZlRGVmYXVsdE1pbkl0ZW1IZWlnaHQoZGltZW5zaW9ucyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgc2l6ZTogZGVmYXVsdE1pbkl0ZW1XaWR0aCwgc2l6ZVVuaXQ6IGRlZmF1bHRNaW5JdGVtV2lkdGhVbml0IH0gPSBEaW1lbnNpb25zLnJlc29sdmVEZWZhdWx0TWluSXRlbVdpZHRoKGRpbWVuc2lvbnMpO1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICBib3JkZXJXaWR0aDogZGltZW5zaW9ucz8uYm9yZGVyV2lkdGggPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5kZWZhdWx0cy5ib3JkZXJXaWR0aCxcclxuICAgICAgICAgICAgICAgIGJvcmRlckdyYWJXaWR0aDogZGltZW5zaW9ucz8uYm9yZGVyR3JhYldpZHRoID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuZGVmYXVsdHMuYm9yZGVyR3JhYldpZHRoLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1IZWlnaHQsXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0TWluSXRlbUhlaWdodFVuaXQsXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0TWluSXRlbVdpZHRoLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1XaWR0aFVuaXQsXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJIZWlnaHQ6IGRpbWVuc2lvbnM/LmhlYWRlckhlaWdodCA/PyBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmRlZmF1bHRzLmhlYWRlckhlaWdodCxcclxuICAgICAgICAgICAgICAgIGRyYWdQcm94eVdpZHRoOiBkaW1lbnNpb25zPy5kcmFnUHJveHlXaWR0aCA/PyBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmRlZmF1bHRzLmRyYWdQcm94eVdpZHRoLFxyXG4gICAgICAgICAgICAgICAgZHJhZ1Byb3h5SGVpZ2h0OiBkaW1lbnNpb25zPy5kcmFnUHJveHlIZWlnaHQgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5kZWZhdWx0cy5kcmFnUHJveHlIZWlnaHQsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gZnJvbVJlc29sdmVkKHJlc29sdmVkRGltZW5zaW9uczogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucyk6IERpbWVuc2lvbnMge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IERpbWVuc2lvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICBib3JkZXJXaWR0aDogcmVzb2x2ZWREaW1lbnNpb25zLmJvcmRlcldpZHRoLFxyXG4gICAgICAgICAgICAgICAgYm9yZGVyR3JhYldpZHRoOiByZXNvbHZlZERpbWVuc2lvbnMuYm9yZGVyR3JhYldpZHRoLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1IZWlnaHQ6IGZvcm1hdFNpemUocmVzb2x2ZWREaW1lbnNpb25zLmRlZmF1bHRNaW5JdGVtSGVpZ2h0LCByZXNvbHZlZERpbWVuc2lvbnMuZGVmYXVsdE1pbkl0ZW1IZWlnaHRVbml0KSxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtV2lkdGg6IGZvcm1hdFNpemUocmVzb2x2ZWREaW1lbnNpb25zLmRlZmF1bHRNaW5JdGVtV2lkdGgsIHJlc29sdmVkRGltZW5zaW9ucy5kZWZhdWx0TWluSXRlbVdpZHRoVW5pdCksXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJIZWlnaHQ6IHJlc29sdmVkRGltZW5zaW9ucy5oZWFkZXJIZWlnaHQsXHJcbiAgICAgICAgICAgICAgICBkcmFnUHJveHlXaWR0aDogcmVzb2x2ZWREaW1lbnNpb25zLmRyYWdQcm94eVdpZHRoLFxyXG4gICAgICAgICAgICAgICAgZHJhZ1Byb3h5SGVpZ2h0OiByZXNvbHZlZERpbWVuc2lvbnMuZHJhZ1Byb3h5SGVpZ2h0LFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURlZmF1bHRNaW5JdGVtSGVpZ2h0KGRpbWVuc2lvbnM6IERpbWVuc2lvbnMgfCB1bmRlZmluZWQpOiBTaXplV2l0aFVuaXQge1xyXG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSBkaW1lbnNpb25zPy5kZWZhdWx0TWluSXRlbUhlaWdodDtcclxuICAgICAgICAgICAgaWYgKGhlaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBzaXplOiBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmRlZmF1bHRzLmRlZmF1bHRNaW5JdGVtSGVpZ2h0LCBzaXplVW5pdDogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5kZWZhdWx0cy5kZWZhdWx0TWluSXRlbUhlaWdodFVuaXQgfTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZVNpemUoaGVpZ2h0LCBbU2l6ZVVuaXRFbnVtLlBpeGVsXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURlZmF1bHRNaW5JdGVtV2lkdGgoZGltZW5zaW9uczogRGltZW5zaW9ucyB8IHVuZGVmaW5lZCk6IFNpemVXaXRoVW5pdCB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gZGltZW5zaW9ucz8uZGVmYXVsdE1pbkl0ZW1XaWR0aDtcclxuICAgICAgICAgICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IHNpemU6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuZGVmYXVsdHMuZGVmYXVsdE1pbkl0ZW1XaWR0aCwgc2l6ZVVuaXQ6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuZGVmYXVsdHMuZGVmYXVsdE1pbkl0ZW1XaWR0aFVuaXQgfTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZVNpemUod2lkdGgsIFtTaXplVW5pdEVudW0uUGl4ZWxdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIExhYmVscyB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKEhlYWRlcjppbnRlcmZhY2UpLmNsb3NlfSBpbnN0ZWFkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY2xvc2U/OiBzdHJpbmc7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzpuYW1lc3BhY2UpLihIZWFkZXI6aW50ZXJmYWNlKS5tYXhpbWlzZX0gaW5zdGVhZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG1heGltaXNlPzogc3RyaW5nO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oSGVhZGVyOmludGVyZmFjZSkubWluaW1pc2V9IGluc3RlYWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBtaW5pbWlzZT86IHN0cmluZztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKEhlYWRlcjppbnRlcmZhY2UpLnBvcGlufSBpbnN0ZWFkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcG9waW4/OiBzdHJpbmc7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzpuYW1lc3BhY2UpLihIZWFkZXI6aW50ZXJmYWNlKS5wb3BvdXR9IGluc3RlYWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBwb3BvdXQ/OiBzdHJpbmc7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzpuYW1lc3BhY2UpLihIZWFkZXI6aW50ZXJmYWNlKS50YWJEcm9wZG93bn0gaW5zdGVhZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRhYkRyb3Bkb3duPzogc3RyaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgSGVhZGVyIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTcGVjaWZpZXMgd2hldGhlciBoZWFkZXIgc2hvdWxkIGJlIGRpc3BsYXllZCwgYW5kIGlmIHNvLCBvbiB3aGljaCBzaWRlLlxyXG4gICAgICAgICAqIElmIGZhbHNlLCB0aGUgbGF5b3V0IHdpbGwgYmUgZGlzcGxheWVkIHdpdGggc3BsaXR0ZXJzIG9ubHkuXHJcbiAgICAgICAgICogRGVmYXVsdDogJ3RvcCdcclxuICAgICAgICAgKi9cclxuICAgICAgICBzaG93PzogZmFsc2UgfCBTaWRlO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0b29sdGlwIHRleHQgdGhhdCBhcHBlYXJzIHdoZW4gaG92ZXJpbmcgb3ZlciB0aGUgcG9wb3V0IGljb24gb3IgZmFsc2UgaWYgcG9wb3V0IGJ1dHRvbiBub3QgZGlzcGxheWVkLlxyXG4gICAgICAgICAqIERlZmF1bHQ6ICdvcGVuIGluIG5ldyB3aW5kb3cnXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcG9wb3V0PzogZmFsc2UgfCBzdHJpbmc7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRvb2x0aXAgdGV4dCB0aGF0IGFwcGVhcnMgd2hlbiBob3ZlcmluZyBvdmVyIHRoZSBwb3BpbiBpY29uLlxyXG4gICAgICAgICAqIERlZmF1bHQ6ICdwb3AgaW4nXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcG9waW4/OiBzdHJpbmc7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRvb2x0aXAgdGV4dCB0aGF0IGFwcGVhcnMgd2hlbiBob3ZlcmluZyBvdmVyIHRoZSBtYXhpbWlzZSBpY29uIG9yIGZhbHNlIGlmIG1heGltaXNlZCBidXR0b24gbm90IGRpc3BsYXllZC5cclxuICAgICAgICAgKiBEZWZhdWx0OiAnbWF4aW1pc2UnXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbWF4aW1pc2U/OiBmYWxzZSB8IHN0cmluZztcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdG9vbHRpcCB0ZXh0IHRoYXQgYXBwZWFycyB3aGVuIGhvdmVyaW5nIG92ZXIgdGhlIGNsb3NlIGljb24uXHJcbiAgICAgICAgICogRGVmYXVsdDogJ2Nsb3NlJ1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNsb3NlPzogZmFsc2UgfCBzdHJpbmc7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRvb2x0aXAgdGV4dCB0aGF0IGFwcGVhcnMgd2hlbiBob3ZlcmluZyBvdmVyIHRoZSBtaW5pbWlzZSBpY29uLlxyXG4gICAgICAgICAqIERlZmF1bHQ6ICdtaW5pbWlzZSdcclxuICAgICAgICAgKi9cclxuICAgICAgICBtaW5pbWlzZT86IHN0cmluZztcclxuICAgICAgICAvKipcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIERlZmF1bHQ6ICdhZGRpdGlvbmFsIHRhYnMnXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGFiRHJvcGRvd24/OiBmYWxzZSB8IHN0cmluZztcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbmFtZXNwYWNlIEhlYWRlciB7XHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKGhlYWRlcjogSGVhZGVyIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBzZXR0aW5nczogTGF5b3V0Q29uZmlnLlNldHRpbmdzIHwgdW5kZWZpbmVkLCBsYWJlbHM6IExheW91dENvbmZpZy5MYWJlbHMgfCB1bmRlZmluZWRcclxuICAgICAgICApOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIge1xyXG4gICAgICAgICAgICBsZXQgc2hvdzogZmFsc2UgfCBTaWRlO1xyXG4gICAgICAgICAgICBpZiAoaGVhZGVyPy5zaG93ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHNob3cgPSBoZWFkZXIuc2hvdztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncyAhPT0gdW5kZWZpbmVkICYmIHNldHRpbmdzLmhhc0hlYWRlcnMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3cgPSBzZXR0aW5ncy5oYXNIZWFkZXJzID8gUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmRlZmF1bHRzLnNob3cgOiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdyA9IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5kZWZhdWx0cy5zaG93O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyID0ge1xyXG4gICAgICAgICAgICAgICAgc2hvdyxcclxuICAgICAgICAgICAgICAgIHBvcG91dDogaGVhZGVyPy5wb3BvdXQgPz8gbGFiZWxzPy5wb3BvdXQgPz9cclxuICAgICAgICAgICAgICAgICAgICAoc2V0dGluZ3M/LnNob3dQb3BvdXRJY29uID09PSBmYWxzZSA/IGZhbHNlIDogUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmRlZmF1bHRzLnBvcG91dCksXHJcbiAgICAgICAgICAgICAgICBwb3BpbjogaGVhZGVyPy5wb3BpbiA/PyBsYWJlbHM/LnBvcGluID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5kZWZhdWx0cy5wb3BpbixcclxuICAgICAgICAgICAgICAgIG1heGltaXNlOiBoZWFkZXI/Lm1heGltaXNlID8/IGxhYmVscz8ubWF4aW1pc2UgPz9cclxuICAgICAgICAgICAgICAgICAgICAoc2V0dGluZ3M/LnNob3dNYXhpbWlzZUljb24gPT09IGZhbHNlID8gZmFsc2UgOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuZGVmYXVsdHMubWF4aW1pc2UpLFxyXG4gICAgICAgICAgICAgICAgY2xvc2U6IGhlYWRlcj8uY2xvc2UgPz8gbGFiZWxzPy5jbG9zZSA/P1xyXG4gICAgICAgICAgICAgICAgICAgIChzZXR0aW5ncz8uc2hvd0Nsb3NlSWNvbiA9PT0gZmFsc2UgPyBmYWxzZSA6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5kZWZhdWx0cy5jbG9zZSksXHJcbiAgICAgICAgICAgICAgICBtaW5pbWlzZTogaGVhZGVyPy5taW5pbWlzZSA/PyBsYWJlbHM/Lm1pbmltaXNlID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5kZWZhdWx0cy5taW5pbWlzZSxcclxuICAgICAgICAgICAgICAgIHRhYkRyb3Bkb3duOiBoZWFkZXI/LnRhYkRyb3Bkb3duID8/IGxhYmVscz8udGFiRHJvcGRvd24gPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmRlZmF1bHRzLnRhYkRyb3Bkb3duLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc1BvcG91dChjb25maWc6IExheW91dENvbmZpZyk6IGNvbmZpZyBpcyBQb3BvdXRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIHJldHVybiAncGFyZW50SWQnIGluIGNvbmZpZyB8fCAnaW5kZXhJblBhcmVudCcgaW4gY29uZmlnIHx8ICd3aW5kb3cnIGluIGNvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShsYXlvdXRDb25maWc6IExheW91dENvbmZpZyk6IFJlc29sdmVkTGF5b3V0Q29uZmlnIHtcclxuICAgICAgICBpZiAoaXNQb3BvdXQobGF5b3V0Q29uZmlnKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gUG9wb3V0TGF5b3V0Q29uZmlnLnJlc29sdmUobGF5b3V0Q29uZmlnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgcm9vdDogUm9vdEl0ZW1Db25maWcgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGlmIChsYXlvdXRDb25maWcucm9vdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByb290ID0gbGF5b3V0Q29uZmlnLnJvb3Q7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobGF5b3V0Q29uZmlnLmNvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiBsYXlvdXRDb25maWcuY29udGVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm9vdCA9IGxheW91dENvbmZpZy5jb250ZW50WzBdO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByb290ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHJvb3Q6IFJvb3RJdGVtQ29uZmlnLnJlc29sdmUocm9vdCksXHJcbiAgICAgICAgICAgICAgICBvcGVuUG9wb3V0czogTGF5b3V0Q29uZmlnLnJlc29sdmVPcGVuUG9wb3V0cyhsYXlvdXRDb25maWcub3BlblBvcG91dHMpLFxyXG4gICAgICAgICAgICAgICAgZGltZW5zaW9uczogTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMucmVzb2x2ZShsYXlvdXRDb25maWcuZGltZW5zaW9ucyksXHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nczogTGF5b3V0Q29uZmlnLlNldHRpbmdzLnJlc29sdmUobGF5b3V0Q29uZmlnLnNldHRpbmdzKSxcclxuICAgICAgICAgICAgICAgIGhlYWRlcjogTGF5b3V0Q29uZmlnLkhlYWRlci5yZXNvbHZlKGxheW91dENvbmZpZy5oZWFkZXIsIGxheW91dENvbmZpZy5zZXR0aW5ncywgbGF5b3V0Q29uZmlnLmxhYmVscyksXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZyb21SZXNvbHZlZChjb25maWc6IFJlc29sdmVkTGF5b3V0Q29uZmlnKTogTGF5b3V0Q29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IExheW91dENvbmZpZyA9IHtcclxuICAgICAgICAgICAgcm9vdDogUm9vdEl0ZW1Db25maWcuZnJvbVJlc29sdmVkT3JVbmRlZmluZWQoY29uZmlnLnJvb3QpLFxyXG4gICAgICAgICAgICBvcGVuUG9wb3V0czogUG9wb3V0TGF5b3V0Q29uZmlnLmZyb21SZXNvbHZlZEFycmF5KGNvbmZpZy5vcGVuUG9wb3V0cyksXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5jcmVhdGVDb3B5KGNvbmZpZy5zZXR0aW5ncyksXHJcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IExheW91dENvbmZpZy5EaW1lbnNpb25zLmZyb21SZXNvbHZlZChjb25maWcuZGltZW5zaW9ucyksXHJcbiAgICAgICAgICAgIGhlYWRlcjogUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmNyZWF0ZUNvcHkoY29uZmlnLmhlYWRlciksXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc1Jlc29sdmVkKGNvbmZpZ09yUmVzb2x2ZWRDb25maWc6IFJlc29sdmVkTGF5b3V0Q29uZmlnIHwgTGF5b3V0Q29uZmlnKTogY29uZmlnT3JSZXNvbHZlZENvbmZpZyBpcyBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gY29uZmlnT3JSZXNvbHZlZENvbmZpZyBhcyBSZXNvbHZlZExheW91dENvbmZpZztcclxuICAgICAgICByZXR1cm4gY29uZmlnLnJlc29sdmVkICE9PSB1bmRlZmluZWQgJiYgKGNvbmZpZy5yZXNvbHZlZCA9PT0gdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVPcGVuUG9wb3V0cyhwb3BvdXRDb25maWdzOiBQb3BvdXRMYXlvdXRDb25maWdbXSB8IHVuZGVmaW5lZCk6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnW10ge1xyXG4gICAgICAgIGlmIChwb3BvdXRDb25maWdzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gcG9wb3V0Q29uZmlncy5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxSZXNvbHZlZFBvcG91dExheW91dENvbmZpZz4oY291bnQpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IFBvcG91dExheW91dENvbmZpZy5yZXNvbHZlKHBvcG91dENvbmZpZ3NbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBvcG91dExheW91dENvbmZpZyBleHRlbmRzIExheW91dENvbmZpZyB7XHJcbiAgICAvKiogVGhlIGlkIG9mIHRoZSBlbGVtZW50IHRoZSBpdGVtIHdpbGwgYmUgYXBwZW5kZWQgdG8gb24gcG9wSW5cclxuICAgICogSWYgbnVsbCwgYXBwZW5kIHRvIHRvcG1vc3QgbGF5b3V0IGVsZW1lbnRcclxuICAgICovXHJcbiAgICBwYXJlbnRJZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBUaGUgcG9zaXRpb24gb2YgdGhpcyBlbGVtZW50IHdpdGhpbiBpdHMgcGFyZW50XHJcbiAgICAqIElmIG51bGwsIHBvc2l0aW9uIGlzIGxhc3RcclxuICAgICovXHJcbiAgICBpbmRleEluUGFyZW50OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKFBvcG91dExheW91dENvbmZpZzppbnRlcmZhY2UpLndpbmRvd30gKi9cclxuICAgIGRpbWVuc2lvbnM6IFBvcG91dExheW91dENvbmZpZy5EaW1lbnNpb25zIHwgdW5kZWZpbmVkOyAvLyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcclxuICAgIHdpbmRvdzogUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvdyB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBQb3BvdXRMYXlvdXRDb25maWcge1xyXG4gICAgLy8gUHJldmlvdXMgdmVyc2lvbnMga2VwdCB3aW5kb3cgaW5mb3JtYXRpb24gaW4gRGltZW5zaW9ucyBrZXkuICBPbmx5IHVzZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcclxuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChQb3BvdXRMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oV2luZG93OmludGVyZmFjZSl9ICovXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIERpbWVuc2lvbnMgZXh0ZW5kcyBMYXlvdXRDb25maWcuRGltZW5zaW9ucyB7XHJcbiAgICAgICAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKFBvcG91dExheW91dENvbmZpZzpuYW1lc3BhY2UpLihXaW5kb3c6aW50ZXJmYWNlKS53aWR0aH0gKi9cclxuICAgICAgICB3aWR0aD86IG51bWJlciB8IG51bGwsXHJcbiAgICAgICAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKFBvcG91dExheW91dENvbmZpZzpuYW1lc3BhY2UpLihXaW5kb3c6aW50ZXJmYWNlKS5oZWlnaHR9ICovXHJcbiAgICAgICAgaGVpZ2h0PzogbnVtYmVyIHwgbnVsbCxcclxuICAgICAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoUG9wb3V0TGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKFdpbmRvdzppbnRlcmZhY2UpLmxlZnR9ICovXHJcbiAgICAgICAgbGVmdD86IG51bWJlciB8IG51bGwsXHJcbiAgICAgICAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKFBvcG91dExheW91dENvbmZpZzpuYW1lc3BhY2UpLihXaW5kb3c6aW50ZXJmYWNlKS50b3B9ICovXHJcbiAgICAgICAgdG9wPzogbnVtYmVyIHwgbnVsbCxcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIFdpbmRvdyB7XHJcbiAgICAgICAgd2lkdGg/OiBudW1iZXIsXHJcbiAgICAgICAgaGVpZ2h0PzogbnVtYmVyLFxyXG4gICAgICAgIGxlZnQ/OiBudW1iZXIsXHJcbiAgICAgICAgdG9wPzogbnVtYmVyLFxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBuYW1lc3BhY2UgV2luZG93IHtcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUod2luZG93OiBXaW5kb3cgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IERpbWVuc2lvbnMgfCB1bmRlZmluZWQpOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3dcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQ6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvdztcclxuICAgICAgICAgICAgY29uc3QgZGVmYXVsdHMgPSBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3cuZGVmYXVsdHM7XHJcbiAgICAgICAgICAgIGlmICh3aW5kb3cgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiB3aW5kb3cud2lkdGggPz8gZGVmYXVsdHMud2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiB3aW5kb3cuaGVpZ2h0ID8/IGRlZmF1bHRzLmhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiB3aW5kb3cubGVmdCA/PyBkZWZhdWx0cy5sZWZ0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRvcDogd2luZG93LnRvcCA/PyBkZWZhdWx0cy50b3AsXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGRpbWVuc2lvbnM/LndpZHRoID8/IGRlZmF1bHRzLndpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogZGltZW5zaW9ucz8uaGVpZ2h0ID8/IGRlZmF1bHRzLmhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBkaW1lbnNpb25zPy5sZWZ0ID8/IGRlZmF1bHRzLmxlZnQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9wOiBkaW1lbnNpb25zPy50b3AgPz8gZGVmYXVsdHMudG9wLFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGZyb21SZXNvbHZlZChyZXNvbHZlZFdpbmRvdzogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcuV2luZG93KTogV2luZG93IHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBXaW5kb3cgPSB7XHJcbiAgICAgICAgICAgICAgICB3aWR0aDogcmVzb2x2ZWRXaW5kb3cud2lkdGggPT09IG51bGwgPyB1bmRlZmluZWQgOiByZXNvbHZlZFdpbmRvdy53aWR0aCxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogcmVzb2x2ZWRXaW5kb3cuaGVpZ2h0ID09PSBudWxsID8gdW5kZWZpbmVkIDogcmVzb2x2ZWRXaW5kb3cuaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgbGVmdDogcmVzb2x2ZWRXaW5kb3cubGVmdCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJlc29sdmVkV2luZG93LmxlZnQsXHJcbiAgICAgICAgICAgICAgICB0b3A6IHJlc29sdmVkV2luZG93LnRvcCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJlc29sdmVkV2luZG93LnRvcCxcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUocG9wb3V0Q29uZmlnOiBQb3BvdXRMYXlvdXRDb25maWcpOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyB7XHJcbiAgICAgICAgbGV0IHJvb3Q6IFJvb3RJdGVtQ29uZmlnIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmIChwb3BvdXRDb25maWcucm9vdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJvb3QgPSBwb3BvdXRDb25maWcucm9vdDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocG9wb3V0Q29uZmlnLmNvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiBwb3BvdXRDb25maWcuY29udGVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICByb290ID0gcG9wb3V0Q29uZmlnLmNvbnRlbnRbMF07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByb290ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjb25maWc6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnID0ge1xyXG4gICAgICAgICAgICByb290OiBSb290SXRlbUNvbmZpZy5yZXNvbHZlKHJvb3QpLFxyXG4gICAgICAgICAgICBvcGVuUG9wb3V0czogTGF5b3V0Q29uZmlnLnJlc29sdmVPcGVuUG9wb3V0cyhwb3BvdXRDb25maWcub3BlblBvcG91dHMpLFxyXG4gICAgICAgICAgICBkaW1lbnNpb25zOiBMYXlvdXRDb25maWcuRGltZW5zaW9ucy5yZXNvbHZlKHBvcG91dENvbmZpZy5kaW1lbnNpb25zKSxcclxuICAgICAgICAgICAgc2V0dGluZ3M6IExheW91dENvbmZpZy5TZXR0aW5ncy5yZXNvbHZlKHBvcG91dENvbmZpZy5zZXR0aW5ncyksXHJcbiAgICAgICAgICAgIGhlYWRlcjogTGF5b3V0Q29uZmlnLkhlYWRlci5yZXNvbHZlKHBvcG91dENvbmZpZy5oZWFkZXIsIHBvcG91dENvbmZpZy5zZXR0aW5ncywgcG9wb3V0Q29uZmlnLmxhYmVscyksXHJcbiAgICAgICAgICAgIHBhcmVudElkOiBwb3BvdXRDb25maWcucGFyZW50SWQgPz8gbnVsbCxcclxuICAgICAgICAgICAgaW5kZXhJblBhcmVudDogcG9wb3V0Q29uZmlnLmluZGV4SW5QYXJlbnQgPz8gbnVsbCxcclxuICAgICAgICAgICAgd2luZG93OiBQb3BvdXRMYXlvdXRDb25maWcuV2luZG93LnJlc29sdmUocG9wb3V0Q29uZmlnLndpbmRvdywgcG9wb3V0Q29uZmlnLmRpbWVuc2lvbnMpLFxyXG4gICAgICAgICAgICByZXNvbHZlZDogdHJ1ZSxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZnJvbVJlc29sdmVkKHJlc29sdmVkQ29uZmlnOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyk6IFBvcG91dExheW91dENvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBQb3BvdXRMYXlvdXRDb25maWcgPSB7XHJcbiAgICAgICAgICAgIHJvb3Q6IFJvb3RJdGVtQ29uZmlnLmZyb21SZXNvbHZlZE9yVW5kZWZpbmVkKHJlc29sdmVkQ29uZmlnLnJvb3QpLFxyXG4gICAgICAgICAgICBvcGVuUG9wb3V0czogZnJvbVJlc29sdmVkQXJyYXkocmVzb2x2ZWRDb25maWcub3BlblBvcG91dHMpLFxyXG4gICAgICAgICAgICBkaW1lbnNpb25zOiBMYXlvdXRDb25maWcuRGltZW5zaW9ucy5mcm9tUmVzb2x2ZWQocmVzb2x2ZWRDb25maWcuZGltZW5zaW9ucyksXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5jcmVhdGVDb3B5KHJlc29sdmVkQ29uZmlnLnNldHRpbmdzKSxcclxuICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuY3JlYXRlQ29weShyZXNvbHZlZENvbmZpZy5oZWFkZXIpLFxyXG4gICAgICAgICAgICBwYXJlbnRJZDogcmVzb2x2ZWRDb25maWcucGFyZW50SWQsXHJcbiAgICAgICAgICAgIGluZGV4SW5QYXJlbnQ6IHJlc29sdmVkQ29uZmlnLmluZGV4SW5QYXJlbnQsXHJcbiAgICAgICAgICAgIHdpbmRvdzogUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvdy5mcm9tUmVzb2x2ZWQocmVzb2x2ZWRDb25maWcud2luZG93KSxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZyb21SZXNvbHZlZEFycmF5KHJlc29sdmVkQXJyYXk6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnW10pOiBQb3BvdXRMYXlvdXRDb25maWdbXSB7XHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRPcGVuUG9wb3V0Q291bnQgPSByZXNvbHZlZEFycmF5Lmxlbmd0aDtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8UG9wb3V0TGF5b3V0Q29uZmlnPihyZXNvbHZlZE9wZW5Qb3BvdXRDb3VudCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNvbHZlZE9wZW5Qb3BvdXRDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkT3BlblBvcG91dCA9IHJlc29sdmVkQXJyYXlbaV07XHJcbiAgICAgICAgICAgIHJlc3VsdFtpXSA9IFBvcG91dExheW91dENvbmZpZy5mcm9tUmVzb2x2ZWQocmVzb2x2ZWRPcGVuUG9wb3V0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGludGVyZmFjZSBTaXplV2l0aFVuaXQge1xyXG4gICAgc2l6ZTogbnVtYmVyO1xyXG4gICAgc2l6ZVVuaXQ6IFNpemVVbml0RW51bTtcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFVuZGVmaW5hYmxlU2l6ZVdpdGhVbml0IHtcclxuICAgIHNpemU6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICAgIHNpemVVbml0OiBTaXplVW5pdEVudW07XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2l6ZShzaXplU3RyaW5nOiBzdHJpbmcsIGFsbG93YWJsZVNpemVVbml0czogcmVhZG9ubHkgU2l6ZVVuaXRFbnVtW10pOiBTaXplV2l0aFVuaXQge1xyXG4gICAgY29uc3QgeyBudW1lcmljUGFydDogZGlnaXRzUGFydCwgZmlyc3ROb25OdW1lcmljQ2hhclBhcnQ6IGZpcnN0Tm9uRGlnaXRQYXJ0IH0gPSBzcGxpdFN0cmluZ0F0Rmlyc3ROb25OdW1lcmljQ2hhcihzaXplU3RyaW5nKTtcclxuICAgIGNvbnN0IHNpemUgPSBOdW1iZXIucGFyc2VJbnQoZGlnaXRzUGFydCwgMTApO1xyXG4gICAgaWYgKGlzTmFOKHNpemUpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihgJHtpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuSW52YWxpZE51bWJlclBhcnRJblNpemVTdHJpbmddfTogJHtzaXplU3RyaW5nfWApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBzaXplVW5pdCA9IFNpemVVbml0RW51bS50cnlQYXJzZShmaXJzdE5vbkRpZ2l0UGFydCk7XHJcbiAgICAgICAgaWYgKHNpemVVbml0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihgJHtpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuVW5rbm93blVuaXRJblNpemVTdHJpbmddfTogJHtzaXplU3RyaW5nfWApXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCFhbGxvd2FibGVTaXplVW5pdHMuaW5jbHVkZXMoc2l6ZVVuaXQpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKGAke2kxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5VbnN1cHBvcnRlZFVuaXRJblNpemVTdHJpbmddfTogJHtzaXplU3RyaW5nfWApXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBzaXplLCBzaXplVW5pdCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRTaXplKHNpemU6IG51bWJlciwgc2l6ZVVuaXQ6IFNpemVVbml0RW51bSkge1xyXG4gICAgcmV0dXJuIHNpemUudG9TdHJpbmcoMTApICsgU2l6ZVVuaXRFbnVtLmZvcm1hdChzaXplVW5pdCk7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFVuZGVmaW5hYmxlU2l6ZShzaXplOiBudW1iZXJ8IHVuZGVmaW5lZCwgc2l6ZVVuaXQ6IFNpemVVbml0RW51bSkge1xyXG4gICAgaWYgKHNpemUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBzaXplLnRvU3RyaW5nKDEwKSArIFNpemVVbml0RW51bS5mb3JtYXQoc2l6ZVVuaXQpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyBAZGVwcmVjYXRlZCAtIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzppbnRlcmZhY2UpfSAqL1xyXG5leHBvcnQgdHlwZSBDb25maWcgPSBMYXlvdXRDb25maWc7XHJcbiIsImltcG9ydCB7IEFzc2VydEVycm9yLCBVbnJlYWNoYWJsZUNhc2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IENvbmZpZ01pbmlmaWVyIH0gZnJvbSAnLi4vdXRpbHMvY29uZmlnLW1pbmlmaWVyJztcclxuaW1wb3J0IHsgSXRlbVR5cGUsIEpzb25WYWx1ZSwgUmVzcG9uc2l2ZU1vZGUsIFNpZGUsIFNpemVVbml0RW51bSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHsgZGVlcEV4dGVuZFZhbHVlIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZEl0ZW1Db25maWcge1xyXG4gICAgLy8gc2VlIEl0ZW1Db25maWcgZm9yIGNvbW1lbnRzXHJcbiAgICByZWFkb25seSB0eXBlOiBJdGVtVHlwZTtcclxuICAgIHJlYWRvbmx5IGNvbnRlbnQ6IHJlYWRvbmx5IFJlc29sdmVkSXRlbUNvbmZpZ1tdO1xyXG4gICAgcmVhZG9ubHkgc2l6ZTogbnVtYmVyO1xyXG4gICAgcmVhZG9ubHkgc2l6ZVVuaXQ6IFNpemVVbml0RW51bTtcclxuICAgIHJlYWRvbmx5IG1pblNpemU6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICAgIHJlYWRvbmx5IG1pblNpemVVbml0OiBTaXplVW5pdEVudW07XHJcbiAgICAvLyBpZCBubyBsb25nZXIgc3BlY2lmaWVzIHdoZXRoZXIgYW4gSXRlbSBpcyBtYXhpbWlzZWQuICBUaGlzIGlzIG5vdyBkb25lIGJ5IEhlYWRlckl0ZW1Db25maWcubWF4aW1pc2VkXHJcbiAgICByZWFkb25seSBpZDogc3RyaW5nO1xyXG4gICAgcmVhZG9ubHkgaXNDbG9zYWJsZTogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSZXNvbHZlZEl0ZW1Db25maWcge1xyXG4gICAgZXhwb3J0IGNvbnN0IGRlZmF1bHRzOiBSZXNvbHZlZEl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgdHlwZTogSXRlbVR5cGUuZ3JvdW5kLCAvLyBub3QgcmVhbGx5IGRlZmF1bHQgYnV0IG5lZWQgc29tZXRoaW5nXHJcbiAgICAgICAgY29udGVudDogW10sXHJcbiAgICAgICAgc2l6ZTogMSxcclxuICAgICAgICBzaXplVW5pdDogU2l6ZVVuaXRFbnVtLkZyYWN0aW9uYWwsXHJcbiAgICAgICAgbWluU2l6ZTogdW5kZWZpbmVkLFxyXG4gICAgICAgIG1pblNpemVVbml0OiBTaXplVW5pdEVudW0uUGl4ZWwsXHJcbiAgICAgICAgaWQ6ICcnLFxyXG4gICAgICAgIGlzQ2xvc2FibGU6IHRydWUsXHJcbiAgICB9IGFzIGNvbnN0O1xyXG5cclxuICAgIC8qKiBDcmVhdGVzIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgUmVzb2x2ZWRJdGVtQ29uZmlnIHVzaW5nIGFuIGFsdGVybmF0aXZlIGNvbnRlbnQgaWYgc3BlY2lmaWVkICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29weShvcmlnaW5hbDogUmVzb2x2ZWRJdGVtQ29uZmlnLCBjb250ZW50PzogUmVzb2x2ZWRJdGVtQ29uZmlnW10pOiBSZXNvbHZlZEl0ZW1Db25maWcge1xyXG4gICAgICAgIHN3aXRjaCAob3JpZ2luYWwudHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmdyb3VuZDpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29sdW1uOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLmNyZWF0ZUNvcHkob3JpZ2luYWwgYXMgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCBhcyBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZy5DaGlsZEl0ZW1Db25maWdbXSk7XHJcblxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnN0YWNrOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnLmNyZWF0ZUNvcHkob3JpZ2luYWwgYXMgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcsIGNvbnRlbnQgYXMgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnW10pO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb21wb25lbnQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLmNyZWF0ZUNvcHkob3JpZ2luYWwgYXMgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKTtcclxuXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ0NJQ0M5MTM1NCcsIG9yaWdpbmFsLnR5cGUsICdJbnZhbGlkIENvbmZpZyBJdGVtIHR5cGUgc3BlY2lmaWVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0KHR5cGU6IEl0ZW1UeXBlKTogUmVzb2x2ZWRJdGVtQ29uZmlnIHtcclxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5ncm91bmQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0NJQ0NEUjkxNTYyJyk7IC8vIEdldCBkZWZhdWx0IHJvb3QgZnJvbSBMYXlvdXRDb25maWdcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29sdW1uOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLmNyZWF0ZURlZmF1bHQodHlwZSk7XHJcblxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnN0YWNrOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnLmNyZWF0ZURlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29tcG9uZW50OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZy5jcmVhdGVEZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVucmVhY2hhYmxlQ2FzZUVycm9yKCdDSUNDREQ5MTU2MycsIHR5cGUsICdJbnZhbGlkIENvbmZpZyBJdGVtIHR5cGUgc3BlY2lmaWVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0NvbXBvbmVudEl0ZW0oaXRlbUNvbmZpZzogUmVzb2x2ZWRJdGVtQ29uZmlnKTogaXRlbUNvbmZpZyBpcyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcge1xyXG4gICAgICAgIHJldHVybiBpdGVtQ29uZmlnLnR5cGUgPT09IEl0ZW1UeXBlLmNvbXBvbmVudDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNTdGFja0l0ZW0oaXRlbUNvbmZpZzogUmVzb2x2ZWRJdGVtQ29uZmlnKTogaXRlbUNvbmZpZyBpcyBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW1Db25maWcudHlwZSA9PT0gSXRlbVR5cGUuc3RhY2s7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzR3JvdW5kSXRlbShpdGVtQ29uZmlnOiBSZXNvbHZlZEl0ZW1Db25maWcpOiBpdGVtQ29uZmlnIGlzIFJlc29sdmVkR3JvdW5kSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW1Db25maWcudHlwZSA9PT0gSXRlbVR5cGUuZ3JvdW5kO1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyBTdGFjayBvciBDb21wb25lbnRcclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZyBleHRlbmRzIFJlc29sdmVkSXRlbUNvbmZpZyB7XHJcbiAgICBoZWFkZXI6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlciB8IHVuZGVmaW5lZDsgLy8gdW5kZWZpbmVkIG1lYW5zIGdldCBoZWFkZXIgc2V0dGluZ3MgZnJvbSBMYXlvdXRDb25maWdcclxuICAgIHJlYWRvbmx5IG1heGltaXNlZDogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZyB7XHJcbiAgICBleHBvcnQgY29uc3QgZGVmYXVsdE1heGltaXNlZCA9IGZhbHNlO1xyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgSGVhZGVyIHtcclxuICAgICAgICAvLyB1bmRlZmluZWQgbWVhbnMgZ2V0IHByb3BlcnR5IHZhbHVlIGZyb20gTGF5b3V0Q29uZmlnXHJcbiAgICAgICAgcmVhZG9ubHkgc2hvdzogZmFsc2UgfCBTaWRlIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIHJlYWRvbmx5IHBvcG91dDogZmFsc2UgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgcmVhZG9ubHkgbWF4aW1pc2U6IGZhbHNlIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIHJlYWRvbmx5IGNsb3NlOiBmYWxzZSB8IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICAgICAgICByZWFkb25seSBtaW5pbWlzZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIHJlYWRvbmx5IHRhYkRyb3Bkb3duOiBmYWxzZSB8IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbmFtZXNwYWNlIEhlYWRlciB7XHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkob3JpZ2luYWw6IEhlYWRlciB8IHVuZGVmaW5lZCwgc2hvdz86IGZhbHNlIHwgU2lkZSk6IEhlYWRlciB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBzaG93OiBzaG93ID8/IG9yaWdpbmFsLnNob3csXHJcbiAgICAgICAgICAgICAgICAgICAgcG9wb3V0OiBvcmlnaW5hbC5wb3BvdXQsXHJcbiAgICAgICAgICAgICAgICAgICAgY2xvc2U6IG9yaWdpbmFsLmNsb3NlLFxyXG4gICAgICAgICAgICAgICAgICAgIG1heGltaXNlOiBvcmlnaW5hbC5tYXhpbWlzZSxcclxuICAgICAgICAgICAgICAgICAgICBtaW5pbWlzZTogb3JpZ2luYWwubWluaW1pc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgdGFiRHJvcGRvd246IG9yaWdpbmFsLnRhYkRyb3Bkb3duLFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnIGV4dGVuZHMgUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcge1xyXG4gICAgcmVhZG9ubHkgdHlwZTogJ3N0YWNrJztcclxuICAgIHJlYWRvbmx5IGNvbnRlbnQ6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZ1tdO1xyXG4gICAgLyoqIFRoZSBpbmRleCBvZiB0aGUgYWN0aXZlIGl0ZW0gaW4gdGhlIFN0YWNrLiAgT25seSB1bmRlZmluZWQgaWYgdGhlIFN0YWNrIGlzIGVtcHR5LiAqL1xyXG4gICAgcmVhZG9ubHkgYWN0aXZlSXRlbUluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcge1xyXG4gICAgZXhwb3J0IGNvbnN0IGRlZmF1bHRBY3RpdmVJdGVtSW5kZXggPSAwO1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KG9yaWdpbmFsOiBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZywgY29udGVudD86IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZ1tdKTogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IG9yaWdpbmFsLnR5cGUsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQgIT09IHVuZGVmaW5lZCA/IGNvcHlDb250ZW50KGNvbnRlbnQpIDogY29weUNvbnRlbnQob3JpZ2luYWwuY29udGVudCksXHJcbiAgICAgICAgICAgIHNpemU6IG9yaWdpbmFsLnNpemUsXHJcbiAgICAgICAgICAgIHNpemVVbml0OiBvcmlnaW5hbC5zaXplVW5pdCxcclxuICAgICAgICAgICAgbWluU2l6ZTogb3JpZ2luYWwubWluU2l6ZSxcclxuICAgICAgICAgICAgbWluU2l6ZVVuaXQ6IG9yaWdpbmFsLm1pblNpemVVbml0LFxyXG4gICAgICAgICAgICBpZDogb3JpZ2luYWwuaWQsXHJcbiAgICAgICAgICAgIG1heGltaXNlZDogb3JpZ2luYWwubWF4aW1pc2VkLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiBvcmlnaW5hbC5pc0Nsb3NhYmxlLFxyXG4gICAgICAgICAgICBhY3RpdmVJdGVtSW5kZXg6IG9yaWdpbmFsLmFjdGl2ZUl0ZW1JbmRleCxcclxuICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIuY3JlYXRlQ29weShvcmlnaW5hbC5oZWFkZXIpLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjb3B5Q29udGVudChvcmlnaW5hbDogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnW10pOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWdbXSB7XHJcbiAgICAgICAgY29uc3QgY291bnQgPSBvcmlnaW5hbC5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZz4oY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICByZXN1bHRbaV0gPSBSZXNvbHZlZEl0ZW1Db25maWcuY3JlYXRlQ29weShvcmlnaW5hbFtpXSkgYXMgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0KCk6IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5zdGFjayxcclxuICAgICAgICAgICAgY29udGVudDogW10sXHJcbiAgICAgICAgICAgIHNpemU6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5zaXplLFxyXG4gICAgICAgICAgICBzaXplVW5pdDogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLnNpemVVbml0LFxyXG4gICAgICAgICAgICBtaW5TaXplOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMubWluU2l6ZSxcclxuICAgICAgICAgICAgbWluU2l6ZVVuaXQ6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5taW5TaXplVW5pdCxcclxuICAgICAgICAgICAgaWQ6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pZCxcclxuICAgICAgICAgICAgbWF4aW1pc2VkOiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5kZWZhdWx0TWF4aW1pc2VkLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuaXNDbG9zYWJsZSxcclxuICAgICAgICAgICAgYWN0aXZlSXRlbUluZGV4OiBkZWZhdWx0QWN0aXZlSXRlbUluZGV4LFxyXG4gICAgICAgICAgICBoZWFkZXI6IHVuZGVmaW5lZCxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcgZXh0ZW5kcyBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZyB7XHJcbiAgICAvLyBzZWUgQ29tcG9uZW50SXRlbUNvbmZpZyBmb3IgY29tbWVudHNcclxuICAgIHJlYWRvbmx5IHR5cGU6ICdjb21wb25lbnQnO1xyXG4gICAgcmVhZG9ubHkgY29udGVudDogW107XHJcbiAgICByZWFkb25seSB0aXRsZTogc3RyaW5nO1xyXG4gICAgcmVhZG9ubHkgcmVvcmRlckVuYWJsZWQ6IGJvb2xlYW47IC8vIFRha2VzIHByZWNlZGVuY2Ugb3ZlciBMYXlvdXRDb25maWcucmVvcmRlckVuYWJsZWQuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgYXMgc3BlY2lmaWVkIGluIGxheW91dC5yZWdpc3RlckNvbXBvbmVudC4gTWFuZGF0b3J5IGlmIHR5cGUgaXMgJ2NvbXBvbmVudCcuXHJcbiAgICAgKi9cclxuICAgIHJlYWRvbmx5IGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZTtcclxuICAgIHJlYWRvbmx5IGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlO1xyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyB7XHJcbiAgICBleHBvcnQgY29uc3QgZGVmYXVsdFJlb3JkZXJFbmFibGVkID0gdHJ1ZTtcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNvbXBvbmVudFR5cGVOYW1lKGl0ZW1Db25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgY29uc3QgY29tcG9uZW50VHlwZSA9IGl0ZW1Db25maWcuY29tcG9uZW50VHlwZTtcclxuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudFR5cGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRUeXBlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KG9yaWdpbmFsOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiBvcmlnaW5hbC50eXBlLFxyXG4gICAgICAgICAgICBjb250ZW50OiBbXSxcclxuICAgICAgICAgICAgc2l6ZTogb3JpZ2luYWwuc2l6ZSxcclxuICAgICAgICAgICAgc2l6ZVVuaXQ6IG9yaWdpbmFsLnNpemVVbml0LFxyXG4gICAgICAgICAgICBtaW5TaXplOiBvcmlnaW5hbC5taW5TaXplLFxyXG4gICAgICAgICAgICBtaW5TaXplVW5pdDogb3JpZ2luYWwubWluU2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIGlkOiBvcmlnaW5hbC5pZCxcclxuICAgICAgICAgICAgbWF4aW1pc2VkOiBvcmlnaW5hbC5tYXhpbWlzZWQsXHJcbiAgICAgICAgICAgIGlzQ2xvc2FibGU6IG9yaWdpbmFsLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgICAgIHJlb3JkZXJFbmFibGVkOiBvcmlnaW5hbC5yZW9yZGVyRW5hYmxlZCxcclxuICAgICAgICAgICAgdGl0bGU6IG9yaWdpbmFsLnRpdGxlLFxyXG4gICAgICAgICAgICBoZWFkZXI6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlci5jcmVhdGVDb3B5KG9yaWdpbmFsLmhlYWRlciksXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFR5cGU6IG9yaWdpbmFsLmNvbXBvbmVudFR5cGUsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlOiBkZWVwRXh0ZW5kVmFsdWUodW5kZWZpbmVkLCBvcmlnaW5hbC5jb21wb25lbnRTdGF0ZSkgYXMgSnNvblZhbHVlLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0KGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSA9ICcnLCBjb21wb25lbnRTdGF0ZT86IEpzb25WYWx1ZSwgdGl0bGUgPSAnJyk6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLmNvbXBvbmVudCxcclxuICAgICAgICAgICAgY29udGVudDogW10sXHJcbiAgICAgICAgICAgIHNpemU6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5zaXplLFxyXG4gICAgICAgICAgICBzaXplVW5pdDogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLnNpemVVbml0LFxyXG4gICAgICAgICAgICBtaW5TaXplOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMubWluU2l6ZSxcclxuICAgICAgICAgICAgbWluU2l6ZVVuaXQ6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5taW5TaXplVW5pdCxcclxuICAgICAgICAgICAgaWQ6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pZCxcclxuICAgICAgICAgICAgbWF4aW1pc2VkOiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5kZWZhdWx0TWF4aW1pc2VkLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuaXNDbG9zYWJsZSxcclxuICAgICAgICAgICAgcmVvcmRlckVuYWJsZWQ6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZy5kZWZhdWx0UmVvcmRlckVuYWJsZWQsXHJcbiAgICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgICAgICBoZWFkZXI6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgY29tcG9uZW50VHlwZSxcclxuICAgICAgICAgICAgY29tcG9uZW50U3RhdGUsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNvcHlDb21wb25lbnRUeXBlKGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSk6IEpzb25WYWx1ZSB7XHJcbiAgICAgICAgcmV0dXJuIGRlZXBFeHRlbmRWYWx1ZSh7fSwgY29tcG9uZW50VHlwZSkgYXMgSnNvblZhbHVlXHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBCYXNlIGZvciBSb290IG9yIFJvd09yQ29sdW1uIEl0ZW1Db25maWdzXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcgZXh0ZW5kcyBSZXNvbHZlZEl0ZW1Db25maWcge1xyXG4gICAgcmVhZG9ubHkgdHlwZTogJ3JvdycgfCAnY29sdW1uJztcclxuICAgIC8qKiBOb3RlIHRoYXQgUm93T3JDb2x1bW4gUmVzb2x2ZWRJdGVtQ29uZmlnIGNvbnRlbnRzLCBjYW4gY29udGFpbiBDb21wb25lbnRJdGVtIGl0ZW1Db25maWdzLiAgSG93ZXZlclxyXG4gICAgICogd2hlbiBDb250ZW50SXRlbXMgYXJlIGNyZWF0ZWQsIHRoZXNlIENvbXBvbmVudEl0ZW0gaXRlbUNvbmZpZ3Mgd2lsbCBjcmVhdGUgYSBTdGFjayB3aXRoIGEgY2hpbGQgQ29tcG9uZW50SXRlbS5cclxuICAgICAqL1xyXG4gICAgcmVhZG9ubHkgY29udGVudDogcmVhZG9ubHkgKFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgfCBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpW107XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcge1xyXG4gICAgZXhwb3J0IHR5cGUgQ2hpbGRJdGVtQ29uZmlnID0gUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcgfCBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyB8IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZztcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNDaGlsZEl0ZW1Db25maWcoaXRlbUNvbmZpZzogUmVzb2x2ZWRJdGVtQ29uZmlnKTogaXRlbUNvbmZpZyBpcyBDaGlsZEl0ZW1Db25maWcge1xyXG4gICAgICAgIHN3aXRjaCAoaXRlbUNvbmZpZy50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUucm93OlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbHVtbjpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5zdGFjazpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb21wb25lbnQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5ncm91bmQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ0NST0NPU1BDSUNJQzEzNjg3JywgaXRlbUNvbmZpZy50eXBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkob3JpZ2luYWw6IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLCBjb250ZW50PzogQ2hpbGRJdGVtQ29uZmlnW10pOiBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogb3JpZ2luYWwudHlwZSxcclxuICAgICAgICAgICAgY29udGVudDogY29udGVudCAhPT0gdW5kZWZpbmVkID8gY29weUNvbnRlbnQoY29udGVudCkgOiBjb3B5Q29udGVudChvcmlnaW5hbC5jb250ZW50KSxcclxuICAgICAgICAgICAgc2l6ZTogb3JpZ2luYWwuc2l6ZSxcclxuICAgICAgICAgICAgc2l6ZVVuaXQ6IG9yaWdpbmFsLnNpemVVbml0LFxyXG4gICAgICAgICAgICBtaW5TaXplOiBvcmlnaW5hbC5taW5TaXplLFxyXG4gICAgICAgICAgICBtaW5TaXplVW5pdDogb3JpZ2luYWwubWluU2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIGlkOiBvcmlnaW5hbC5pZCxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogb3JpZ2luYWwuaXNDbG9zYWJsZSxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY29weUNvbnRlbnQob3JpZ2luYWw6IHJlYWRvbmx5IENoaWxkSXRlbUNvbmZpZ1tdKTogQ2hpbGRJdGVtQ29uZmlnW10ge1xyXG4gICAgICAgIGNvbnN0IGNvdW50ID0gb3JpZ2luYWwubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxDaGlsZEl0ZW1Db25maWc+KGNvdW50KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgcmVzdWx0W2ldID0gUmVzb2x2ZWRJdGVtQ29uZmlnLmNyZWF0ZUNvcHkob3JpZ2luYWxbaV0pIGFzIENoaWxkSXRlbUNvbmZpZztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdCh0eXBlOiAncm93JyB8ICdjb2x1bW4nKTogUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGUsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IFtdLFxyXG4gICAgICAgICAgICBzaXplOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuc2l6ZSxcclxuICAgICAgICAgICAgc2l6ZVVuaXQ6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5zaXplVW5pdCxcclxuICAgICAgICAgICAgbWluU2l6ZTogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLm1pblNpemUsXHJcbiAgICAgICAgICAgIG1pblNpemVVbml0OiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMubWluU2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIGlkOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuaWQsXHJcbiAgICAgICAgICAgIGlzQ2xvc2FibGU6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogUm9vdEl0ZW1Db25maWcgaXMgdGhlIHRvcG1vc3QgUmVzb2x2ZWRJdGVtQ29uZmlnIHNwZWNpZmllZCBieSB0aGUgdXNlci5cclxuICogTm90ZSB0aGF0IGl0IGRvZXMgbm90IGhhdmUgYSBjb3JyZXNwb25kaW5nIGNvbnRlbnRJdGVtLiAgSXQgc3BlY2lmaWVzIHRoZSBvbmUgYW5kIG9ubHkgY2hpbGQgb2YgdGhlIEdyb3VuZCBDb250ZW50SXRlbVxyXG4gKiBOb3RlIHRoYXQgUm9vdEl0ZW1Db25maWcgY2FuIGJlIGFuIENvbXBvbmVudEl0ZW0gaXRlbUNvbmZpZy4gIEhvd2V2ZXIgd2hlbiB0aGUgR3JvdW5kIENvbnRlbnRJdGVtJ3MgY2hpbGQgaXMgY3JlYXRlZFxyXG4gKiBhIENvbXBvbmVudEl0ZW0gaXRlbUNvbmZpZyB3aWxsIGNyZWF0ZSBhIFN0YWNrIHdpdGggYSBjaGlsZCBDb21wb25lbnRJdGVtLlxyXG4gKiBAcHVibGljXHJcbiovXHJcbmV4cG9ydCB0eXBlIFJlc29sdmVkUm9vdEl0ZW1Db25maWcgPSBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnIHwgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnO1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnIHtcclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KGNvbmZpZzogUmVzb2x2ZWRSb290SXRlbUNvbmZpZyk6IFJlc29sdmVkUm9vdEl0ZW1Db25maWcge1xyXG4gICAgICAgIHJldHVybiBSZXNvbHZlZEl0ZW1Db25maWcuY3JlYXRlQ29weShjb25maWcpIGFzIFJlc29sdmVkUm9vdEl0ZW1Db25maWc7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzUm9vdEl0ZW1Db25maWcoaXRlbUNvbmZpZzogUmVzb2x2ZWRJdGVtQ29uZmlnKTogaXRlbUNvbmZpZyBpcyBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnIHtcclxuICAgICAgICBzd2l0Y2ggKGl0ZW1Db25maWcudHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnJvdzpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuc3RhY2s6XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29tcG9uZW50OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuZ3JvdW5kOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVucmVhY2hhYmxlQ2FzZUVycm9yKCdDUk9DT1NQQ0lDSUMxMzY4NycsIGl0ZW1Db25maWcudHlwZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRHcm91bmRJdGVtQ29uZmlnIGV4dGVuZHMgUmVzb2x2ZWRJdGVtQ29uZmlnIHtcclxuICAgIHJlYWRvbmx5IHR5cGU6ICdncm91bmQnO1xyXG4gICAgcmVhZG9ubHkgc2l6ZTogMTAwLFxyXG4gICAgcmVhZG9ubHkgc2l6ZVVuaXQ6IFNpemVVbml0RW51bS5QZXJjZW50LFxyXG4gICAgcmVhZG9ubHkgbWluU2l6ZTogMCxcclxuICAgIHJlYWRvbmx5IG1pblNpemVVbml0OiBTaXplVW5pdEVudW0uUGl4ZWwsXHJcbiAgICByZWFkb25seSBpZDogJycsXHJcbiAgICByZWFkb25seSBpc0Nsb3NhYmxlOiBmYWxzZSxcclxuICAgIHJlYWRvbmx5IHRpdGxlOiAnJyxcclxuICAgIHJlYWRvbmx5IHJlb3JkZXJFbmFibGVkOiBmYWxzZSxcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFJlc29sdmVkR3JvdW5kSXRlbUNvbmZpZyB7XHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlKHJvb3RJdGVtQ29uZmlnOiBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnIHwgdW5kZWZpbmVkKTpSZXNvbHZlZEdyb3VuZEl0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSByb290SXRlbUNvbmZpZyA9PT0gdW5kZWZpbmVkID8gW10gOiBbcm9vdEl0ZW1Db25maWddO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLmdyb3VuZCxcclxuICAgICAgICAgICAgY29udGVudCxcclxuICAgICAgICAgICAgc2l6ZTogMTAwLFxyXG4gICAgICAgICAgICBzaXplVW5pdDogU2l6ZVVuaXRFbnVtLlBlcmNlbnQsXHJcbiAgICAgICAgICAgIG1pblNpemU6IDAsXHJcbiAgICAgICAgICAgIG1pblNpemVVbml0OiBTaXplVW5pdEVudW0uUGl4ZWwsXHJcbiAgICAgICAgICAgIGlkOiAnJyxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIHRpdGxlOiAnJyxcclxuICAgICAgICAgICAgcmVvcmRlckVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICByZWFkb25seSByb290OiBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnIHwgdW5kZWZpbmVkO1xyXG4gICAgcmVhZG9ubHkgb3BlblBvcG91dHM6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnW107XHJcbiAgICByZWFkb25seSBkaW1lbnNpb25zOiBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zO1xyXG4gICAgcmVhZG9ubHkgc2V0dGluZ3M6IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzO1xyXG4gICAgcmVhZG9ubHkgaGVhZGVyOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXI7XHJcbiAgICByZWFkb25seSByZXNvbHZlZDogdHJ1ZSxcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzIHtcclxuICAgICAgICAvLyBzZWUgQ29uZmlnLlNldHRpbmdzIGZvciBjb21tZW50c1xyXG4gICAgICAgIHJlYWRvbmx5IGRyYWdCZXR3ZWVuV2luZG93czogYm9vbGVhbjtcclxuICAgICAgICByZWFkb25seSBkcmFnVG9OZXdXaW5kb3c6IGJvb2xlYW47XHJcbiAgICAgICAgcmVhZG9ubHkgcmVvcmRlckVuYWJsZWQ6IGJvb2xlYW47IC8vIGFsc28gaW4gUmVzb2x2ZWRJdGVtQ29uZmlnIHdoaWNoIHRha2VzIHByZWNlZGVuY2VcclxuICAgICAgICByZWFkb25seSBwb3BvdXRXaG9sZVN0YWNrOiBib29sZWFuO1xyXG4gICAgICAgIHJlYWRvbmx5IGJsb2NrZWRQb3BvdXRzVGhyb3dFcnJvcjogYm9vbGVhbjtcclxuICAgICAgICAvKiogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIHZlcnNpb24gMy4gKi9cclxuICAgICAgICByZWFkb25seSBjbG9zZVBvcG91dHNPblVubG9hZDogYm9vbGVhbjtcclxuICAgICAgICByZWFkb25seSByZXNwb25zaXZlTW9kZTogUmVzcG9uc2l2ZU1vZGU7XHJcbiAgICAgICAgcmVhZG9ubHkgdGFiT3ZlcmxhcEFsbG93YW5jZTogbnVtYmVyO1xyXG4gICAgICAgIHJlYWRvbmx5IHJlb3JkZXJPblRhYk1lbnVDbGljazogYm9vbGVhbjtcclxuICAgICAgICByZWFkb25seSB0YWJDb250cm9sT2Zmc2V0OiBudW1iZXI7XHJcbiAgICAgICAgcmVhZG9ubHkgcG9wSW5PbkNsb3NlOiBib29sZWFuO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBuYW1lc3BhY2UgU2V0dGluZ3Mge1xyXG4gICAgICAgIGV4cG9ydCBjb25zdCBkZWZhdWx0czogUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MgPSB7XHJcbiAgICAgICAgICAgIGRyYWdCZXR3ZWVuV2luZG93czogdHJ1ZSxcclxuICAgICAgICAgICAgZHJhZ1RvTmV3V2luZG93OiB0cnVlLFxyXG4gICAgICAgICAgICByZW9yZGVyRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICAgICAgcG9wb3V0V2hvbGVTdGFjazogZmFsc2UsXHJcbiAgICAgICAgICAgIGJsb2NrZWRQb3BvdXRzVGhyb3dFcnJvcjogdHJ1ZSxcclxuICAgICAgICAgICAgY2xvc2VQb3BvdXRzT25VbmxvYWQ6IHRydWUsXHJcbiAgICAgICAgICAgIHJlc3BvbnNpdmVNb2RlOiBSZXNwb25zaXZlTW9kZS5ub25lLCAvLyB3YXMgb25sb2FkXHJcbiAgICAgICAgICAgIHRhYk92ZXJsYXBBbGxvd2FuY2U6IDAsXHJcbiAgICAgICAgICAgIHJlb3JkZXJPblRhYk1lbnVDbGljazogdHJ1ZSxcclxuICAgICAgICAgICAgdGFiQ29udHJvbE9mZnNldDogMTAsXHJcbiAgICAgICAgICAgIHBvcEluT25DbG9zZTogZmFsc2UsXHJcbiAgICAgICAgfSBhcyBjb25zdDtcclxuXHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkob3JpZ2luYWw6IFNldHRpbmdzKTogU2V0dGluZ3Mge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgZHJhZ0JldHdlZW5XaW5kb3dzOiBvcmlnaW5hbC5kcmFnQmV0d2VlbldpbmRvd3MsXHJcbiAgICAgICAgICAgICAgICBkcmFnVG9OZXdXaW5kb3c6IG9yaWdpbmFsLmRyYWdUb05ld1dpbmRvdyxcclxuICAgICAgICAgICAgICAgIHJlb3JkZXJFbmFibGVkOiBvcmlnaW5hbC5yZW9yZGVyRW5hYmxlZCxcclxuICAgICAgICAgICAgICAgIHBvcG91dFdob2xlU3RhY2s6IG9yaWdpbmFsLnBvcG91dFdob2xlU3RhY2ssXHJcbiAgICAgICAgICAgICAgICBibG9ja2VkUG9wb3V0c1Rocm93RXJyb3I6IG9yaWdpbmFsLmJsb2NrZWRQb3BvdXRzVGhyb3dFcnJvcixcclxuICAgICAgICAgICAgICAgIGNsb3NlUG9wb3V0c09uVW5sb2FkOiBvcmlnaW5hbC5jbG9zZVBvcG91dHNPblVubG9hZCxcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNpdmVNb2RlOiBvcmlnaW5hbC5yZXNwb25zaXZlTW9kZSxcclxuICAgICAgICAgICAgICAgIHRhYk92ZXJsYXBBbGxvd2FuY2U6IG9yaWdpbmFsLnRhYk92ZXJsYXBBbGxvd2FuY2UsXHJcbiAgICAgICAgICAgICAgICByZW9yZGVyT25UYWJNZW51Q2xpY2s6IG9yaWdpbmFsLnJlb3JkZXJPblRhYk1lbnVDbGljayxcclxuICAgICAgICAgICAgICAgIHRhYkNvbnRyb2xPZmZzZXQ6IG9yaWdpbmFsLnRhYkNvbnRyb2xPZmZzZXQsXHJcbiAgICAgICAgICAgICAgICBwb3BJbk9uQ2xvc2U6IG9yaWdpbmFsLnBvcEluT25DbG9zZSxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIERpbWVuc2lvbnMge1xyXG4gICAgICAgIC8vIHNlZSBMYXlvdXRDb25maWcuRGltZW5zaW9ucyBmb3IgY29tbWVudHNcclxuICAgICAgICByZWFkb25seSBib3JkZXJXaWR0aDogbnVtYmVyO1xyXG4gICAgICAgIHJlYWRvbmx5IGJvcmRlckdyYWJXaWR0aDogbnVtYmVyLFxyXG4gICAgICAgIHJlYWRvbmx5IGRlZmF1bHRNaW5JdGVtSGVpZ2h0OiBudW1iZXI7XHJcbiAgICAgICAgcmVhZG9ubHkgZGVmYXVsdE1pbkl0ZW1IZWlnaHRVbml0OiBTaXplVW5pdEVudW07XHJcbiAgICAgICAgcmVhZG9ubHkgZGVmYXVsdE1pbkl0ZW1XaWR0aDogbnVtYmVyO1xyXG4gICAgICAgIHJlYWRvbmx5IGRlZmF1bHRNaW5JdGVtV2lkdGhVbml0OiBTaXplVW5pdEVudW07XHJcbiAgICAgICAgcmVhZG9ubHkgaGVhZGVySGVpZ2h0OiBudW1iZXI7XHJcbiAgICAgICAgcmVhZG9ubHkgZHJhZ1Byb3h5V2lkdGg6IG51bWJlcjtcclxuICAgICAgICByZWFkb25seSBkcmFnUHJveHlIZWlnaHQ6IG51bWJlcjtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbmFtZXNwYWNlIERpbWVuc2lvbnMge1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KG9yaWdpbmFsOiBEaW1lbnNpb25zKTogRGltZW5zaW9ucyB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBib3JkZXJXaWR0aDogb3JpZ2luYWwuYm9yZGVyV2lkdGgsXHJcbiAgICAgICAgICAgICAgICBib3JkZXJHcmFiV2lkdGg6IG9yaWdpbmFsLmJvcmRlckdyYWJXaWR0aCxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtSGVpZ2h0OiBvcmlnaW5hbC5kZWZhdWx0TWluSXRlbUhlaWdodCxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtSGVpZ2h0VW5pdDogb3JpZ2luYWwuZGVmYXVsdE1pbkl0ZW1IZWlnaHRVbml0LFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1XaWR0aDogb3JpZ2luYWwuZGVmYXVsdE1pbkl0ZW1XaWR0aCxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtV2lkdGhVbml0OiBvcmlnaW5hbC5kZWZhdWx0TWluSXRlbVdpZHRoVW5pdCxcclxuICAgICAgICAgICAgICAgIGhlYWRlckhlaWdodDogb3JpZ2luYWwuaGVhZGVySGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgZHJhZ1Byb3h5V2lkdGg6IG9yaWdpbmFsLmRyYWdQcm94eVdpZHRoLFxyXG4gICAgICAgICAgICAgICAgZHJhZ1Byb3h5SGVpZ2h0OiBvcmlnaW5hbC5kcmFnUHJveHlIZWlnaHQsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGV4cG9ydCBjb25zdCBkZWZhdWx0czogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucyA9IHtcclxuICAgICAgICAgICAgYm9yZGVyV2lkdGg6IDUsXHJcbiAgICAgICAgICAgIGJvcmRlckdyYWJXaWR0aDogNSxcclxuICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1IZWlnaHQ6IDAsXHJcbiAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtSGVpZ2h0VW5pdDogU2l6ZVVuaXRFbnVtLlBpeGVsLFxyXG4gICAgICAgICAgICBkZWZhdWx0TWluSXRlbVdpZHRoOiAxMCxcclxuICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1XaWR0aFVuaXQ6IFNpemVVbml0RW51bS5QaXhlbCxcclxuICAgICAgICAgICAgaGVhZGVySGVpZ2h0OiAyMCxcclxuICAgICAgICAgICAgZHJhZ1Byb3h5V2lkdGg6IDMwMCxcclxuICAgICAgICAgICAgZHJhZ1Byb3h5SGVpZ2h0OiAyMDBcclxuICAgICAgICB9IGFzIGNvbnN0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgSGVhZGVyIHtcclxuICAgICAgICByZWFkb25seSBzaG93OiBmYWxzZSB8IFNpZGU7XHJcbiAgICAgICAgcmVhZG9ubHkgcG9wb3V0OiBmYWxzZSB8IHN0cmluZztcclxuICAgICAgICByZWFkb25seSBwb3Bpbjogc3RyaW5nO1xyXG4gICAgICAgIHJlYWRvbmx5IG1heGltaXNlOiBmYWxzZSB8IHN0cmluZztcclxuICAgICAgICByZWFkb25seSBtaW5pbWlzZTogc3RyaW5nO1xyXG4gICAgICAgIHJlYWRvbmx5IGNsb3NlOiBmYWxzZSB8IHN0cmluZztcclxuICAgICAgICByZWFkb25seSB0YWJEcm9wZG93bjogZmFsc2UgfCBzdHJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBIZWFkZXIge1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KG9yaWdpbmFsOiBIZWFkZXIpOiBIZWFkZXIge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgc2hvdzogb3JpZ2luYWwuc2hvdyxcclxuICAgICAgICAgICAgICAgIHBvcG91dDogb3JpZ2luYWwucG9wb3V0LFxyXG4gICAgICAgICAgICAgICAgcG9waW46IG9yaWdpbmFsLnBvcGluLFxyXG4gICAgICAgICAgICAgICAgY2xvc2U6IG9yaWdpbmFsLmNsb3NlLFxyXG4gICAgICAgICAgICAgICAgbWF4aW1pc2U6IG9yaWdpbmFsLm1heGltaXNlLFxyXG4gICAgICAgICAgICAgICAgbWluaW1pc2U6IG9yaWdpbmFsLm1pbmltaXNlLFxyXG4gICAgICAgICAgICAgICAgdGFiRHJvcGRvd246IG9yaWdpbmFsLnRhYkRyb3Bkb3duLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBleHBvcnQgY29uc3QgZGVmYXVsdHM6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlciA9IHtcclxuICAgICAgICAgICAgc2hvdzogU2lkZS50b3AsXHJcbiAgICAgICAgICAgIHBvcG91dDogJ29wZW4gaW4gbmV3IHdpbmRvdycsXHJcbiAgICAgICAgICAgIHBvcGluOiAnZG9jaycsXHJcbiAgICAgICAgICAgIG1heGltaXNlOiAnbWF4aW1pc2UnLFxyXG4gICAgICAgICAgICBtaW5pbWlzZTogJ21pbmltaXNlJyxcclxuICAgICAgICAgICAgY2xvc2U6ICdjbG9zZScsXHJcbiAgICAgICAgICAgIHRhYkRyb3Bkb3duOiAnYWRkaXRpb25hbCB0YWJzJ1xyXG4gICAgICAgIH0gYXMgY29uc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzUG9wb3V0KGNvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWcpOiBjb25maWcgaXMgUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIHJldHVybiAncGFyZW50SWQnIGluIGNvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdCgpOiBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZExheW91dENvbmZpZyA9IHtcclxuICAgICAgICAgICAgcm9vdDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBvcGVuUG9wb3V0czogW10sXHJcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuZGVmYXVsdHMsXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5kZWZhdWx0cyxcclxuICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuZGVmYXVsdHMsXHJcbiAgICAgICAgICAgIHJlc29sdmVkOiB0cnVlLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KGNvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWcpOiBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICAgICAgaWYgKGlzUG9wb3V0KGNvbmZpZykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLmNyZWF0ZUNvcHkoY29uZmlnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkTGF5b3V0Q29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgcm9vdDogY29uZmlnLnJvb3QgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IFJlc29sdmVkUm9vdEl0ZW1Db25maWcuY3JlYXRlQ29weShjb25maWcucm9vdCksXHJcbiAgICAgICAgICAgICAgICBvcGVuUG9wb3V0czogUmVzb2x2ZWRMYXlvdXRDb25maWcuY29weU9wZW5Qb3BvdXRzKGNvbmZpZy5vcGVuUG9wb3V0cyksXHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nczogUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuY3JlYXRlQ29weShjb25maWcuc2V0dGluZ3MpLFxyXG4gICAgICAgICAgICAgICAgZGltZW5zaW9uczogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5jcmVhdGVDb3B5KGNvbmZpZy5kaW1lbnNpb25zKSxcclxuICAgICAgICAgICAgICAgIGhlYWRlcjogUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmNyZWF0ZUNvcHkoY29uZmlnLmhlYWRlciksXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlZDogY29uZmlnLnJlc29sdmVkLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjb3B5T3BlblBvcG91dHMob3JpZ2luYWw6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnW10pOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZ1tdIHtcclxuICAgICAgICBjb25zdCBjb3VudCA9IG9yaWdpbmFsLmxlbmd0aDtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8UmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWc+KGNvdW50KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgcmVzdWx0W2ldID0gUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcuY3JlYXRlQ29weShvcmlnaW5hbFtpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhIEdvbGRlbkxheW91dCBjb25maWd1cmF0aW9uIG9iamVjdCBhbmRcclxuICAgICAqIHJlcGxhY2VzIGl0cyBrZXlzIGFuZCB2YWx1ZXMgcmVjdXJzaXZlbHkgd2l0aFxyXG4gICAgICogb25lIGxldHRlciBjb3VudGVycGFydHNcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIG1pbmlmeUNvbmZpZyhsYXlvdXRDb25maWc6IFJlc29sdmVkTGF5b3V0Q29uZmlnKTogUmVzb2x2ZWRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIHJldHVybiBDb25maWdNaW5pZmllci50cmFuc2xhdGVPYmplY3QobGF5b3V0Q29uZmlnLCB0cnVlKSBhcyBSZXNvbHZlZExheW91dENvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgY29uZmlndXJhdGlvbiBPYmplY3QgdGhhdCB3YXMgcHJldmlvdXNseSBtaW5pZmllZFxyXG4gICAgICogdXNpbmcgbWluaWZ5Q29uZmlnIGFuZCByZXR1cm5zIGl0cyBvcmlnaW5hbCB2ZXJzaW9uXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiB1bm1pbmlmeUNvbmZpZyhtaW5pZmllZENvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWcpOiBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIENvbmZpZ01pbmlmaWVyLnRyYW5zbGF0ZU9iamVjdChtaW5pZmllZENvbmZpZywgZmFsc2UpIGFzIFJlc29sdmVkTGF5b3V0Q29uZmlnO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnIGV4dGVuZHMgUmVzb2x2ZWRMYXlvdXRDb25maWcge1xyXG4gICAgcmVhZG9ubHkgcGFyZW50SWQ6IHN0cmluZyB8IG51bGw7XHJcbiAgICByZWFkb25seSBpbmRleEluUGFyZW50OiBudW1iZXIgfCBudWxsO1xyXG4gICAgcmVhZG9ubHkgd2luZG93OiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3c7XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcge1xyXG4gICAgZXhwb3J0IGludGVyZmFjZSBXaW5kb3cge1xyXG4gICAgICAgIHJlYWRvbmx5IHdpZHRoOiBudW1iZXIgfCBudWxsLFxyXG4gICAgICAgIHJlYWRvbmx5IGhlaWdodDogbnVtYmVyIHwgbnVsbCxcclxuICAgICAgICByZWFkb25seSBsZWZ0OiBudW1iZXIgfCBudWxsLFxyXG4gICAgICAgIHJlYWRvbmx5IHRvcDogbnVtYmVyIHwgbnVsbCxcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbmFtZXNwYWNlIFdpbmRvdyB7XHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkob3JpZ2luYWw6IFdpbmRvdyk6IFdpbmRvdyB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB3aWR0aDogb3JpZ2luYWwud2lkdGgsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IG9yaWdpbmFsLmhlaWdodCxcclxuICAgICAgICAgICAgICAgIGxlZnQ6IG9yaWdpbmFsLmxlZnQsXHJcbiAgICAgICAgICAgICAgICB0b3A6IG9yaWdpbmFsLnRvcCxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZXhwb3J0IGNvbnN0IGRlZmF1bHRzOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3cgPSB7XHJcbiAgICAgICAgICAgIHdpZHRoOiBudWxsLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IG51bGwsXHJcbiAgICAgICAgICAgIGxlZnQ6IG51bGwsXHJcbiAgICAgICAgICAgIHRvcDogbnVsbCxcclxuICAgICAgICB9IGFzIGNvbnN0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KG9yaWdpbmFsOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyk6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnID0ge1xyXG4gICAgICAgICAgICByb290OiBvcmlnaW5hbC5yb290ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnLmNyZWF0ZUNvcHkob3JpZ2luYWwucm9vdCksXHJcbiAgICAgICAgICAgIG9wZW5Qb3BvdXRzOiBSZXNvbHZlZExheW91dENvbmZpZy5jb3B5T3BlblBvcG91dHMob3JpZ2luYWwub3BlblBvcG91dHMpLFxyXG4gICAgICAgICAgICBzZXR0aW5nczogUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuY3JlYXRlQ29weShvcmlnaW5hbC5zZXR0aW5ncyksXHJcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuY3JlYXRlQ29weShvcmlnaW5hbC5kaW1lbnNpb25zKSxcclxuICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuY3JlYXRlQ29weShvcmlnaW5hbC5oZWFkZXIpLFxyXG4gICAgICAgICAgICBwYXJlbnRJZDogb3JpZ2luYWwucGFyZW50SWQsXHJcbiAgICAgICAgICAgIGluZGV4SW5QYXJlbnQ6IG9yaWdpbmFsLmluZGV4SW5QYXJlbnQsXHJcbiAgICAgICAgICAgIHdpbmRvdzogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcuV2luZG93LmNyZWF0ZUNvcHkob3JpZ2luYWwud2luZG93KSxcclxuICAgICAgICAgICAgcmVzb2x2ZWQ6IG9yaWdpbmFsLnJlc29sdmVkLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudEl0ZW1Db25maWcsIEl0ZW1Db25maWcgfSBmcm9tICcuLi9jb25maWcvY29uZmlnJztcclxuaW1wb3J0IHsgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL3Jlc29sdmVkLWNvbmZpZyc7XHJcbmltcG9ydCB7IFRhYiB9IGZyb20gJy4uL2NvbnRyb2xzL3RhYic7XHJcbmltcG9ydCB7IEFzc2VydEVycm9yLCBVbmV4cGVjdGVkTnVsbEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4uL2l0ZW1zL2NvbXBvbmVudC1pdGVtJztcclxuaW1wb3J0IHsgQ29udGVudEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9jb250ZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi4vbGF5b3V0LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9ldmVudC1lbWl0dGVyJztcclxuaW1wb3J0IHsgSnNvblZhbHVlLCBMb2dpY2FsWkluZGV4LCBMb2dpY2FsWkluZGV4VG9EZWZhdWx0TWFwIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQgeyBkZWVwRXh0ZW5kLCBzZXRFbGVtZW50SGVpZ2h0LCBzZXRFbGVtZW50V2lkdGggfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50Q29udGFpbmVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2NvbXBvbmVudFR5cGU6IEpzb25WYWx1ZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2JvdW5kQ29tcG9uZW50OiBDb21wb25lbnRDb250YWluZXIuQmluZGFibGVDb21wb25lbnQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF93aWR0aDogbnVtYmVyO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaGVpZ2h0OiBudW1iZXI7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9pc0Nsb3NhYmxlO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaW5pdGlhbFN0YXRlOiBKc29uVmFsdWUgfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9zdGF0ZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfdmlzaWJsZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2lzU2hvd25XaXRoWmVyb0RpbWVuc2lvbnM7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF90YWI6IFRhYjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3N0YWNrTWF4aW1pc2VkID0gZmFsc2U7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9sb2dpY2FsWkluZGV4OiBMb2dpY2FsWkluZGV4O1xyXG5cclxuICAgIHN0YXRlUmVxdWVzdEV2ZW50OiBDb21wb25lbnRDb250YWluZXIuU3RhdGVSZXF1ZXN0RXZlbnRIYW5kbGVyIHwgdW5kZWZpbmVkO1xyXG4gICAgdmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50OiBDb21wb25lbnRDb250YWluZXIuVmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50IHwgdW5kZWZpbmVkO1xyXG4gICAgdmlydHVhbFZpc2liaWxpdHlDaGFuZ2VSZXF1aXJlZEV2ZW50OiBDb21wb25lbnRDb250YWluZXIuVmlydHVhbFZpc2liaWxpdHlDaGFuZ2VSZXF1aXJlZEV2ZW50IHwgdW5kZWZpbmVkO1xyXG4gICAgdmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkRXZlbnQ6IENvbXBvbmVudENvbnRhaW5lci5WaXJ0dWFsWkluZGV4Q2hhbmdlUmVxdWlyZWRFdmVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICBnZXQgd2lkdGgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3dpZHRoOyB9XHJcbiAgICBnZXQgaGVpZ2h0KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9oZWlnaHQ7IH1cclxuICAgIGdldCBwYXJlbnQoKTogQ29tcG9uZW50SXRlbSB7IHJldHVybiB0aGlzLl9wYXJlbnQ7IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoQ29tcG9uZW50Q29udGFpbmVyOmNsYXNzKS5jb21wb25lbnRUeXBlfSAqL1xyXG4gICAgZ2V0IGNvbXBvbmVudE5hbWUoKTogSnNvblZhbHVlIHsgcmV0dXJuIHRoaXMuX2NvbXBvbmVudFR5cGU7IH1cclxuICAgIGdldCBjb21wb25lbnRUeXBlKCk6IEpzb25WYWx1ZSB7IHJldHVybiB0aGlzLl9jb21wb25lbnRUeXBlOyB9XHJcbiAgICBnZXQgdmlydHVhbCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2JvdW5kQ29tcG9uZW50LnZpcnR1YWw7IH1cclxuICAgIGdldCBjb21wb25lbnQoKTogQ29tcG9uZW50Q29udGFpbmVyLkNvbXBvbmVudCB7IHJldHVybiB0aGlzLl9ib3VuZENvbXBvbmVudC5jb21wb25lbnQ7IH1cclxuICAgIGdldCB0YWIoKTogVGFiIHsgcmV0dXJuIHRoaXMuX3RhYjsgfVxyXG4gICAgZ2V0IHRpdGxlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9wYXJlbnQudGl0bGU7IH1cclxuICAgIGdldCBsYXlvdXRNYW5hZ2VyKCk6IExheW91dE1hbmFnZXIgeyByZXR1cm4gdGhpcy5fbGF5b3V0TWFuYWdlcjsgfVxyXG4gICAgZ2V0IGlzSGlkZGVuKCk6IGJvb2xlYW4geyByZXR1cm4gIXRoaXMuX3Zpc2libGU7IH1cclxuICAgIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fdmlzaWJsZTsgfVxyXG4gICAgZ2V0IHN0YXRlKCk6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9zdGF0ZTsgfVxyXG4gICAgLyoqIFJldHVybiB0aGUgaW5pdGlhbCBjb21wb25lbnQgc3RhdGUgKi9cclxuICAgIGdldCBpbml0aWFsU3RhdGUoKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2luaXRpYWxTdGF0ZTsgfVxyXG4gICAgLyoqIFRoZSBpbm5lciBET00gZWxlbWVudCB3aGVyZSB0aGUgY29udGFpbmVyJ3MgY29udGVudCBpcyBpbnRlbmRlZCB0byBsaXZlIGluICovXHJcbiAgICBnZXQgZWxlbWVudCgpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLl9lbGVtZW50OyB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9wYXJlbnQ6IENvbXBvbmVudEl0ZW0sXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2xheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXIsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxFbGVtZW50LFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF91cGRhdGVJdGVtQ29uZmlnRXZlbnQ6IENvbXBvbmVudENvbnRhaW5lci5VcGRhdGVJdGVtQ29uZmlnRXZlbnRIYW5kbGVyLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9zaG93RXZlbnQ6IENvbXBvbmVudENvbnRhaW5lci5TaG93RXZlbnRIYW5kbGVyLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9oaWRlRXZlbnQ6IENvbXBvbmVudENvbnRhaW5lci5IaWRlRXZlbnRIYW5kbGVyLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9mb2N1c0V2ZW50OiBDb21wb25lbnRDb250YWluZXIuRm9jdXNFdmVudEhhbmRsZXIsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2JsdXJFdmVudDogQ29tcG9uZW50Q29udGFpbmVyLkJsdXJFdmVudEhhbmRsZXIsXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLl93aWR0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5faGVpZ2h0ID0gMDtcclxuICAgICAgICB0aGlzLl92aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9pc1Nob3duV2l0aFplcm9EaW1lbnNpb25zID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50VHlwZSA9IF9jb25maWcuY29tcG9uZW50VHlwZTtcclxuICAgICAgICB0aGlzLl9pc0Nsb3NhYmxlID0gX2NvbmZpZy5pc0Nsb3NhYmxlO1xyXG4gICAgICAgIHRoaXMuX2luaXRpYWxTdGF0ZSA9IF9jb25maWcuY29tcG9uZW50U3RhdGU7XHJcbiAgICAgICAgdGhpcy5fc3RhdGUgPSB0aGlzLl9pbml0aWFsU3RhdGU7XHJcblxyXG4gICAgICAgIHRoaXMuX2JvdW5kQ29tcG9uZW50ID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmJpbmRDb21wb25lbnQodGhpcywgX2NvbmZpZyk7XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlRWxlbWVudFBvc2l0aW9uUHJvcGVydHlGcm9tQm91bmRDb21wb25lbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVsZWFzZUNvbXBvbmVudCgpO1xyXG4gICAgICAgIHRoaXMuc3RhdGVSZXF1ZXN0RXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdkZXN0cm95Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKENvbXBvbmVudENvbnRhaW5lcjpjbGFzcykuZWxlbWVudCB9ICovXHJcbiAgICBnZXRFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhpZGVzIHRoZSBjb250YWluZXIncyBjb21wb25lbnQgaXRlbSAoYW5kIGhlbmNlLCB0aGUgY29udGFpbmVyKSBpZiBub3QgYWxyZWFkeSBoaWRkZW4uXHJcbiAgICAgKiBFbWl0cyBoaWRlIGV2ZW50IHByaW9yIHRvIGhpZGluZyB0aGUgY29udGFpbmVyLlxyXG4gICAgICovXHJcbiAgICBoaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2hpZGVFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvd3MgdGhlIGNvbnRhaW5lcidzIGNvbXBvbmVudCBpdGVtIChhbmQgaGVuY2UsIHRoZSBjb250YWluZXIpIGlmIG5vdCB2aXNpYmxlLlxyXG4gICAgICogRW1pdHMgc2hvdyBldmVudCBwcmlvciB0byBoaWRpbmcgdGhlIGNvbnRhaW5lci5cclxuICAgICAqL1xyXG4gICAgc2hvdygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zaG93RXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvY3VzIHRoaXMgY29tcG9uZW50IGluIExheW91dC5cclxuICAgICAqL1xyXG4gICAgZm9jdXMoc3VwcHJlc3NFdmVudCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZm9jdXNFdmVudChzdXBwcmVzc0V2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZSBmb2N1cyBmcm9tIHRoaXMgY29tcG9uZW50IGluIExheW91dC5cclxuICAgICAqL1xyXG4gICAgYmx1cihzdXBwcmVzc0V2ZW50ID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9ibHVyRXZlbnQoc3VwcHJlc3NFdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHNpemUgZnJvbSB3aXRoaW4gdGhlIGNvbnRhaW5lci4gVHJhdmVyc2VzIHVwXHJcbiAgICAgKiB0aGUgaXRlbSB0cmVlIHVudGlsIGl0IGZpbmRzIGEgcm93IG9yIGNvbHVtbiBlbGVtZW50XHJcbiAgICAgKiBhbmQgcmVzaXplcyBpdHMgaXRlbXMgYWNjb3JkaW5nbHkuXHJcbiAgICAgKlxyXG4gICAgICogSWYgdGhpcyBjb250YWluZXIgaXNuJ3QgYSBkZXNjZW5kYW50IG9mIGEgcm93IG9yIGNvbHVtblxyXG4gICAgICogaXQgcmV0dXJucyBmYWxzZVxyXG4gICAgICogQHBhcmFtIHdpZHRoIC0gVGhlIG5ldyB3aWR0aCBpbiBwaXhlbFxyXG4gICAgICogQHBhcmFtIGhlaWdodCAtIFRoZSBuZXcgaGVpZ2h0IGluIHBpeGVsXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgcmVzaXplU3VjY2VzZnVsXHJcbiAgICAgKlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHNldFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgYW5jZXN0b3JJdGVtOiBDb250ZW50SXRlbSB8IG51bGwgPSB0aGlzLl9wYXJlbnQ7XHJcbiAgICAgICAgaWYgKGFuY2VzdG9ySXRlbS5pc0NvbHVtbiB8fCBhbmNlc3Rvckl0ZW0uaXNSb3cgfHwgYW5jZXN0b3JJdGVtLnBhcmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0lDU1NQUkMnLCAnQ29tcG9uZW50Q29udGFpbmVyIGNhbm5vdCBoYXZlIFJvd0NvbHVtbiBQYXJlbnQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgYW5jZXN0b3JDaGlsZEl0ZW06IENvbnRlbnRJdGVtO1xyXG4gICAgICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgICAgICBhbmNlc3RvckNoaWxkSXRlbSA9IGFuY2VzdG9ySXRlbTtcclxuICAgICAgICAgICAgICAgIGFuY2VzdG9ySXRlbSA9IGFuY2VzdG9ySXRlbS5wYXJlbnQ7XHJcbiAgICAgICAgICAgIH0gd2hpbGUgKGFuY2VzdG9ySXRlbSAhPT0gbnVsbCAmJiAhYW5jZXN0b3JJdGVtLmlzQ29sdW1uICYmICFhbmNlc3Rvckl0ZW0uaXNSb3cpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFuY2VzdG9ySXRlbSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gbm8gUm93IG9yIENvbHVtbiBmb3VuZFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gYW5jZXN0b3JJdGVtIGlzIFJvdyBvciBDb2x1bW5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGFuY2VzdG9ySXRlbS5pc0NvbHVtbiA/ICdoZWlnaHQnIDogJ3dpZHRoJztcclxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTaXplID0gdGhpc1tkaXJlY3Rpb25dO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTaXplID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0lDU1NDUzExMTk0Jyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1NpemUgPSBkaXJlY3Rpb24gPT09ICdoZWlnaHQnID8gaGVpZ2h0IDogd2lkdGg7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsUGl4ZWwgPSBjdXJyZW50U2l6ZSAqICgxIC8gKGFuY2VzdG9yQ2hpbGRJdGVtLnNpemUgLyAxMDApKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gKG5ld1NpemUgLyB0b3RhbFBpeGVsKSAqIDEwMDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWx0YSA9IChhbmNlc3RvckNoaWxkSXRlbS5zaXplIC0gcGVyY2VudGFnZSkgLyAoYW5jZXN0b3JJdGVtLmNvbnRlbnRJdGVtcy5sZW5ndGggLSAxKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbmNlc3Rvckl0ZW0uY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuY2VzdG9ySXRlbUNvbnRlbnRJdGVtID0gYW5jZXN0b3JJdGVtLmNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuY2VzdG9ySXRlbUNvbnRlbnRJdGVtID09PSBhbmNlc3RvckNoaWxkSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3JJdGVtQ29udGVudEl0ZW0uc2l6ZSA9IHBlcmNlbnRhZ2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNlc3Rvckl0ZW1Db250ZW50SXRlbS5zaXplICs9IGRlbHRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBhbmNlc3Rvckl0ZW0udXBkYXRlU2l6ZShmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xvc2VzIHRoZSBjb250YWluZXIgaWYgaXQgaXMgY2xvc2FibGUuIENhbiBiZSBjYWxsZWQgYnlcclxuICAgICAqIGJvdGggdGhlIGNvbXBvbmVudCB3aXRoaW4gYXQgYXMgd2VsbCBhcyB0aGUgY29udGVudEl0ZW0gY29udGFpbmluZ1xyXG4gICAgICogaXQuIEVtaXRzIGEgY2xvc2UgZXZlbnQgYmVmb3JlIHRoZSBjb250YWluZXIgaXRzZWxmIGlzIGNsb3NlZC5cclxuICAgICAqL1xyXG4gICAgY2xvc2UoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzQ2xvc2FibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdjbG9zZScpO1xyXG4gICAgICAgICAgICB0aGlzLl9wYXJlbnQuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFJlcGxhY2VzIGNvbXBvbmVudCB3aXRob3V0IGFmZmVjdGluZyBsYXlvdXQgKi9cclxuICAgIHJlcGxhY2VDb21wb25lbnQoaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVsZWFzZUNvbXBvbmVudCgpO1xyXG5cclxuICAgICAgICBpZiAoIUl0ZW1Db25maWcuaXNDb21wb25lbnQoaXRlbUNvbmZpZykpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXBsYWNlQ29tcG9uZW50IG5vdCBwYXNzZWQgYSBjb21wb25lbnQgSXRlbUNvbmZpZycpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gQ29tcG9uZW50SXRlbUNvbmZpZy5yZXNvbHZlKGl0ZW1Db25maWcsIGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5faW5pdGlhbFN0YXRlID0gY29uZmlnLmNvbXBvbmVudFN0YXRlO1xyXG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IHRoaXMuX2luaXRpYWxTdGF0ZTtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50VHlwZSA9IGNvbmZpZy5jb21wb25lbnRUeXBlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlSXRlbUNvbmZpZ0V2ZW50KGNvbmZpZyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9ib3VuZENvbXBvbmVudCA9IHRoaXMubGF5b3V0TWFuYWdlci5iaW5kQ29tcG9uZW50KHRoaXMsIGNvbmZpZyk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRWxlbWVudFBvc2l0aW9uUHJvcGVydHlGcm9tQm91bmRDb21wb25lbnQoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9ib3VuZENvbXBvbmVudC52aXJ0dWFsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52aXJ0dWFsVmlzaWJpbGl0eUNoYW5nZVJlcXVpcmVkRXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlydHVhbFZpc2liaWxpdHlDaGFuZ2VSZXF1aXJlZEV2ZW50KHRoaXMsIHRoaXMuX3Zpc2libGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXlvdXRNYW5hZ2VyLmZpcmVCZWZvcmVWaXJ0dWFsUmVjdGluZ0V2ZW50KDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50KHRoaXMsIHRoaXMuX3dpZHRoLCB0aGlzLl9oZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xheW91dE1hbmFnZXIuZmlyZUFmdGVyVmlydHVhbFJlY3RpbmdFdmVudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0QmFzZUxvZ2ljYWxaSW5kZXgoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdzdGF0ZUNoYW5nZWQnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBpbml0aWFsIGNvbXBvbmVudCBzdGF0ZSBvciB0aGUgbGF0ZXN0IHBhc3NlZCBpbiBzZXRTdGF0ZSgpXHJcbiAgICAgKiBAcmV0dXJucyBzdGF0ZVxyXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoQ29tcG9uZW50Q29udGFpbmVyOmNsYXNzKS5pbml0aWFsU3RhdGV9XHJcbiAgICAgKi9cclxuICAgIGdldFN0YXRlKCk6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWVyZ2VzIHRoZSBwcm92aWRlZCBzdGF0ZSBpbnRvIHRoZSBjdXJyZW50IG9uZVxyXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoQ29tcG9uZW50Q29udGFpbmVyOmNsYXNzKS5zdGF0ZVJlcXVlc3RFdmVudH1cclxuICAgICAqL1xyXG4gICAgZXh0ZW5kU3RhdGUoc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZXh0ZW5kZWRTdGF0ZSA9IGRlZXBFeHRlbmQodGhpcy5fc3RhdGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHN0YXRlKTtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKGV4dGVuZGVkU3RhdGUgYXMgSnNvblZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbXBvbmVudCBzdGF0ZVxyXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoQ29tcG9uZW50Q29udGFpbmVyOmNsYXNzKS5zdGF0ZVJlcXVlc3RFdmVudH1cclxuICAgICAqL1xyXG4gICAgc2V0U3RhdGUoc3RhdGU6IEpzb25WYWx1ZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3N0YXRlID0gc3RhdGU7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmVtaXRCYXNlQnViYmxpbmdFdmVudCgnc3RhdGVDaGFuZ2VkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQncyB0aGUgY29tcG9uZW50cyB0aXRsZVxyXG4gICAgICovXHJcbiAgICBzZXRUaXRsZSh0aXRsZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LnNldFRpdGxlKHRpdGxlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzZXRUYWIodGFiOiBUYWIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl90YWIgPSB0YWI7XHJcbiAgICAgICAgdGhpcy5lbWl0KCd0YWInLCB0YWIpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc2V0VmlzaWJpbGl0eSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9ib3VuZENvbXBvbmVudC52aXJ0dWFsKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZpcnR1YWxWaXNpYmlsaXR5Q2hhbmdlUmVxdWlyZWRFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZpcnR1YWxWaXNpYmlsaXR5Q2hhbmdlUmVxdWlyZWRFdmVudCh0aGlzLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3Zpc2libGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Zpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2hlaWdodCA9PT0gMCAmJiB0aGlzLl93aWR0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzU2hvd25XaXRoWmVyb0RpbWVuc2lvbnMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc1Nob3duV2l0aFplcm9EaW1lbnNpb25zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTaXplVG9Ob2RlU2l6ZSh0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0LCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRTaG93KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNTaG93bldpdGhaZXJvRGltZW5zaW9ucyAmJiAodGhpcy5faGVpZ2h0ICE9PSAwIHx8IHRoaXMuX3dpZHRoICE9PSAwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzU2hvd25XaXRoWmVyb0RpbWVuc2lvbnMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFNpemVUb05vZGVTaXplKHRoaXMuX3dpZHRoLCB0aGlzLl9oZWlnaHQsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFNob3coKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl92aXNpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc1Nob3duV2l0aFplcm9EaW1lbnNpb25zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRIaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0QmFzZUxvZ2ljYWxaSW5kZXgoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRMb2dpY2FsWkluZGV4KExvZ2ljYWxaSW5kZXguYmFzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0TG9naWNhbFpJbmRleChsb2dpY2FsWkluZGV4OiBMb2dpY2FsWkluZGV4KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGxvZ2ljYWxaSW5kZXggIT09IHRoaXMuX2xvZ2ljYWxaSW5kZXgpIHtcclxuICAgICAgICAgICAgdGhpcy5fbG9naWNhbFpJbmRleCA9IGxvZ2ljYWxaSW5kZXg7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm5vdGlmeVZpcnR1YWxaSW5kZXhDaGFuZ2VSZXF1aXJlZCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgY29udGFpbmVyJ3Mgc2l6ZSwgYnV0IGNvbnNpZGVyZWQgdGVtcG9yYXJ5IChmb3IgZHJhZ2dpbmcpXHJcbiAgICAgKiBzbyBkb24ndCBlbWl0IGFueSBldmVudHMuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgZW50ZXJEcmFnTW9kZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3dpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgdGhpcy5faGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgICAgIHNldEVsZW1lbnRXaWR0aCh0aGlzLl9lbGVtZW50LCB3aWR0aCk7XHJcbiAgICAgICAgc2V0RWxlbWVudEhlaWdodCh0aGlzLl9lbGVtZW50LCBoZWlnaHQpO1xyXG5cclxuICAgICAgICB0aGlzLnNldExvZ2ljYWxaSW5kZXgoTG9naWNhbFpJbmRleC5kcmFnKTtcclxuXHJcbiAgICAgICAgdGhpcy5kcmFnKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhpdERyYWdNb2RlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2V0QmFzZUxvZ2ljYWxaSW5kZXgoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBlbnRlclN0YWNrTWF4aW1pc2VkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3N0YWNrTWF4aW1pc2VkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNldExvZ2ljYWxaSW5kZXgoTG9naWNhbFpJbmRleC5zdGFja01heGltaXNlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhpdFN0YWNrTWF4aW1pc2VkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2V0QmFzZUxvZ2ljYWxaSW5kZXgoKTtcclxuICAgICAgICB0aGlzLl9zdGFja01heGltaXNlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGRyYWcoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2JvdW5kQ29tcG9uZW50LnZpcnR1YWwpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMudmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xheW91dE1hbmFnZXIuZmlyZUJlZm9yZVZpcnR1YWxSZWN0aW5nRXZlbnQoMSk7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50KHRoaXMsIHRoaXMuX3dpZHRoLCB0aGlzLl9oZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXlvdXRNYW5hZ2VyLmZpcmVBZnRlclZpcnR1YWxSZWN0aW5nRXZlbnQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbnRhaW5lcidzIHNpemUuIENhbGxlZCBieSB0aGUgY29udGFpbmVyJ3MgY29tcG9uZW50IGl0ZW0uXHJcbiAgICAgKiBUbyBpbnN0ZWFkIHNldCB0aGUgc2l6ZSBwcm9ncmFtbWF0aWNhbGx5IGZyb20gd2l0aGluIHRoZSBjb21wb25lbnQgaXRzZWxmLFxyXG4gICAgICogdXNlIHRoZSBwdWJsaWMgc2V0U2l6ZSBtZXRob2RcclxuICAgICAqIEBwYXJhbSB3aWR0aCAtIGluIHB4XHJcbiAgICAgKiBAcGFyYW0gaGVpZ2h0IC0gaW4gcHhcclxuICAgICAqIEBwYXJhbSBmb3JjZSAtIHNldCBldmVuIGlmIG5vIGNoYW5nZVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHNldFNpemVUb05vZGVTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBmb3JjZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmICh3aWR0aCAhPT0gdGhpcy5fd2lkdGggfHwgaGVpZ2h0ICE9PSB0aGlzLl9oZWlnaHQgfHwgZm9yY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5fd2lkdGggPSB3aWR0aDtcclxuICAgICAgICAgICAgdGhpcy5faGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgICAgICAgICBzZXRFbGVtZW50V2lkdGgodGhpcy5fZWxlbWVudCwgd2lkdGgpO1xyXG4gICAgICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHRoaXMuX2VsZW1lbnQsIGhlaWdodCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fYm91bmRDb21wb25lbnQudmlydHVhbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRWaXJ0dWFsU2l6ZWRDb250YWluZXJUb0xheW91dE1hbmFnZXIoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgncmVzaXplJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrU2hvd25Gcm9tWmVyb0RpbWVuc2lvbnMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBub3RpZnlWaXJ0dWFsUmVjdGluZ1JlcXVpcmVkKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnZpcnR1YWxSZWN0aW5nUmVxdWlyZWRFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50KHRoaXMsIHRoaXMuX3dpZHRoLCB0aGlzLl9oZWlnaHQpO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3Jlc2l6ZScpO1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrU2hvd25Gcm9tWmVyb0RpbWVuc2lvbnMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBub3RpZnlWaXJ0dWFsWkluZGV4Q2hhbmdlUmVxdWlyZWQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMudmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkRXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCBsb2dpY2FsWkluZGV4ID0gdGhpcy5fbG9naWNhbFpJbmRleDtcclxuICAgICAgICAgICAgY29uc3QgZGVmYXVsdFpJbmRleCA9IExvZ2ljYWxaSW5kZXhUb0RlZmF1bHRNYXBbbG9naWNhbFpJbmRleF07XHJcbiAgICAgICAgICAgIHRoaXMudmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkRXZlbnQodGhpcywgbG9naWNhbFpJbmRleCwgZGVmYXVsdFpJbmRleCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlRWxlbWVudFBvc2l0aW9uUHJvcGVydHlGcm9tQm91bmRDb21wb25lbnQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2JvdW5kQ29tcG9uZW50LnZpcnR1YWwpIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdzdGF0aWMnO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnJzsgLy8gc2V0IGl0IGJhY2sgdG8gYXR0cmlidXRlIHZhbHVlXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgYWRkVmlydHVhbFNpemVkQ29udGFpbmVyVG9MYXlvdXRNYW5hZ2VyKCkge1xyXG4gICAgICAgIHRoaXMuX2xheW91dE1hbmFnZXIuYmVnaW5WaXJ0dWFsU2l6ZWRDb250YWluZXJBZGRpbmcoKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLl9sYXlvdXRNYW5hZ2VyLmFkZFZpcnR1YWxTaXplZENvbnRhaW5lcih0aGlzKTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICB0aGlzLl9sYXlvdXRNYW5hZ2VyLmVuZFZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGNoZWNrU2hvd25Gcm9tWmVyb0RpbWVuc2lvbnMoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzU2hvd25XaXRoWmVyb0RpbWVuc2lvbnMgJiYgKHRoaXMuX2hlaWdodCAhPT0gMCB8fCB0aGlzLl93aWR0aCAhPT0gMCkpIHtcclxuICAgICAgICAgICAgdGhpcy5faXNTaG93bldpdGhaZXJvRGltZW5zaW9ucyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRTaG93KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZW1pdFNob3coKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdzaG93bicpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnc2hvdycpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZW1pdEhpZGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdoaWRlJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWxlYXNlQ29tcG9uZW50KCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9zdGFja01heGltaXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmV4aXRTdGFja01heGltaXNlZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVtaXQoJ2JlZm9yZUNvbXBvbmVudFJlbGVhc2UnLCB0aGlzLl9ib3VuZENvbXBvbmVudC5jb21wb25lbnQpO1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci51bmJpbmRDb21wb25lbnQodGhpcywgdGhpcy5fYm91bmRDb21wb25lbnQudmlydHVhbCwgdGhpcy5fYm91bmRDb21wb25lbnQuY29tcG9uZW50KTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBDb21wb25lbnRDb250YWluZXJ9ICovXHJcbmV4cG9ydCB0eXBlIEl0ZW1Db250YWluZXIgPSBDb21wb25lbnRDb250YWluZXI7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIENvbXBvbmVudENvbnRhaW5lciB7XHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnQgPSB1bmtub3duO1xyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQmluZGFibGVDb21wb25lbnQge1xyXG4gICAgICAgIGNvbXBvbmVudDogQ29tcG9uZW50O1xyXG4gICAgICAgIHZpcnR1YWw6IGJvb2xlYW47XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IHR5cGUgU3RhdGVSZXF1ZXN0RXZlbnRIYW5kbGVyID0gKHRoaXM6IHZvaWQpID0+IEpzb25WYWx1ZSB8IHVuZGVmaW5lZDtcclxuICAgIGV4cG9ydCB0eXBlIFZpcnR1YWxSZWN0aW5nUmVxdWlyZWRFdmVudCA9ICh0aGlzOiB2b2lkLCBjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpID0+IHZvaWQ7XHJcbiAgICBleHBvcnQgdHlwZSBWaXJ0dWFsVmlzaWJpbGl0eUNoYW5nZVJlcXVpcmVkRXZlbnQgPSAodGhpczogdm9pZCwgY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIHZpc2libGU6IGJvb2xlYW4pID0+IHZvaWQ7XHJcbiAgICBleHBvcnQgdHlwZSBWaXJ0dWFsWkluZGV4Q2hhbmdlUmVxdWlyZWRFdmVudCA9XHJcbiAgICAgICAgKHRoaXM6IHZvaWQsIGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCBsb2dpY2FsWkluZGV4OiBMb2dpY2FsWkluZGV4LCBkZWZhdWx0WkluZGV4OiBzdHJpbmcpID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBTaG93RXZlbnRIYW5kbGVyID0gKHRoaXM6IHZvaWQpID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBIaWRlRXZlbnRIYW5kbGVyID0gKHRoaXM6IHZvaWQpID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBGb2N1c0V2ZW50SGFuZGxlciA9ICh0aGlzOiB2b2lkLCBzdXBwcmVzc0V2ZW50OiBib29sZWFuKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQmx1ckV2ZW50SGFuZGxlciA9ICh0aGlzOiB2b2lkLCBzdXBwcmVzc0V2ZW50OiBib29sZWFuKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgVXBkYXRlSXRlbUNvbmZpZ0V2ZW50SGFuZGxlciA9IChpdGVtQ29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpID0+IHZvaWQ7XHJcbn1cclxuIiwiaW1wb3J0IHsgUmVzb2x2ZWRMYXlvdXRDb25maWcsIFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLCBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9yZXNvbHZlZC1jb25maWcnO1xyXG5pbXBvcnQgeyBQb3BvdXRCbG9ja2VkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvZXh0ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBVbmV4cGVjdGVkTnVsbEVycm9yLCBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBDb250ZW50SXRlbSB9IGZyb20gJy4uL2l0ZW1zL2NvbnRlbnQtaXRlbSc7XHJcbmltcG9ydCB7IFJvd09yQ29sdW1uIH0gZnJvbSAnLi4vaXRlbXMvcm93LW9yLWNvbHVtbic7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LWVtaXR0ZXInO1xyXG5pbXBvcnQgeyBSZWN0LCBJdGVtVHlwZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHsgZGVlcEV4dGVuZCwgZ2V0RXJyb3JNZXNzYWdlLCBnZXRVbmlxdWVJZCwgZ2V0V2luZG93VG9wTGVmdEJvcmRlciB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuXHJcbi8qKlxyXG4gKiBQb3BzIGEgY29udGVudCBpdGVtIG91dCBpbnRvIGEgbmV3IGJyb3dzZXIgd2luZG93LlxyXG4gKiBUaGlzIGlzIGFjaGlldmVkIGJ5XHJcbiAqXHJcbiAqICAgIC0gQ3JlYXRpbmcgYSBuZXcgY29uZmlndXJhdGlvbiB3aXRoIHRoZSBjb250ZW50IGl0ZW0gYXMgcm9vdCBlbGVtZW50XHJcbiAqICAgIC0gU2VyaWFsaXppbmcgYW5kIG1pbmlmeWluZyB0aGUgY29uZmlndXJhdGlvblxyXG4gKiAgICAtIE9wZW5pbmcgdGhlIGN1cnJlbnQgd2luZG93J3MgVVJMIHdpdGggdGhlIGNvbmZpZ3VyYXRpb24gYXMgYSBHRVQgcGFyYW1ldGVyXHJcbiAqICAgIC0gR29sZGVuTGF5b3V0IHdoZW4gb3BlbmVkIGluIHRoZSBuZXcgd2luZG93IHdpbGwgbG9vayBmb3IgdGhlIEdFVCBwYXJhbWV0ZXJcclxuICogICAgICBhbmQgdXNlIGl0IGluc3RlYWQgb2YgdGhlIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb25cclxuICogQHB1YmxpY1xyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBCcm93c2VyUG9wb3V0IGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3BvcG91dFdpbmRvdzogV2luZG93IHwgbnVsbDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2lzSW5pdGlhbGlzZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9jaGVja1JlYWR5SW50ZXJ2YWw6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfcHJldmVudFBvcEluT25DbG9zZTogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSBfY29uZmlnIC0gR29sZGVuTGF5b3V0IGl0ZW0gY29uZmlnXHJcbiAgICAgKiBAcGFyYW0gX2luaXRpYWxXaW5kb3dTaXplIC0gQSBtYXAgd2l0aCB3aWR0aCwgaGVpZ2h0LCB0b3AgYW5kIGxlZnRcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfY29uZmlnOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfaW5pdGlhbFdpbmRvd1NpemU6IFJlY3QsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2xheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXIsXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpc2VkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fcG9wb3V0V2luZG93ID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9wcmV2ZW50UG9wSW5PbkNsb3NlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVXaW5kb3coKTtcclxuICAgIH1cclxuXHJcbiAgICB0b0NvbmZpZygpOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbGlzZWQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBjcmVhdGUgY29uZmlnLCBsYXlvdXQgbm90IHlldCBpbml0aWFsaXNlZCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZ2xJbnN0YW5jZSA9IHRoaXMuZ2V0R2xJbnN0YW5jZSgpO1xyXG4gICAgICAgIGNvbnN0IGdsSW5zdGFuY2VDb25maWcgPSBnbEluc3RhbmNlLnNhdmVMYXlvdXQoKTtcclxuXHJcbiAgICAgICAgbGV0IGxlZnQ6IG51bWJlciB8IG51bGw7XHJcbiAgICAgICAgbGV0IHRvcDogbnVtYmVyIHwgbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5fcG9wb3V0V2luZG93ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGxlZnQgPSBudWxsO1xyXG4gICAgICAgICAgICB0b3AgPSBudWxsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxlZnQgPSB0aGlzLl9wb3BvdXRXaW5kb3cuc2NyZWVuWCA/PyB0aGlzLl9wb3BvdXRXaW5kb3cuc2NyZWVuTGVmdDtcclxuICAgICAgICAgICAgdG9wID0gdGhpcy5fcG9wb3V0V2luZG93LnNjcmVlblkgPz8gdGhpcy5fcG9wb3V0V2luZG93LnNjcmVlblRvcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHdpbmRvdzogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcuV2luZG93ID0ge1xyXG4gICAgICAgICAgICB3aWR0aDogdGhpcy5nZXRHbEluc3RhbmNlKCkud2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy5nZXRHbEluc3RhbmNlKCkuaGVpZ2h0LFxyXG4gICAgICAgICAgICBsZWZ0LFxyXG4gICAgICAgICAgICB0b3AsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgY29uZmlnOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyA9IHtcclxuICAgICAgICAgICAgcm9vdDogZ2xJbnN0YW5jZUNvbmZpZy5yb290LFxyXG4gICAgICAgICAgICBvcGVuUG9wb3V0czogZ2xJbnN0YW5jZUNvbmZpZy5vcGVuUG9wb3V0cyxcclxuICAgICAgICAgICAgc2V0dGluZ3M6IGdsSW5zdGFuY2VDb25maWcuc2V0dGluZ3MsXHJcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IGdsSW5zdGFuY2VDb25maWcuZGltZW5zaW9ucyxcclxuICAgICAgICAgICAgaGVhZGVyOiBnbEluc3RhbmNlQ29uZmlnLmhlYWRlcixcclxuICAgICAgICAgICAgd2luZG93LFxyXG4gICAgICAgICAgICBwYXJlbnRJZDogdGhpcy5fY29uZmlnLnBhcmVudElkLFxyXG4gICAgICAgICAgICBpbmRleEluUGFyZW50OiB0aGlzLl9jb25maWcuaW5kZXhJblBhcmVudCxcclxuICAgICAgICAgICAgcmVzb2x2ZWQ6IHRydWUsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICBnZXRHbEluc3RhbmNlKCk6IExheW91dE1hbmFnZXIge1xyXG4gICAgICAgIGlmICh0aGlzLl9wb3BvdXRXaW5kb3cgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0JQR0dJMjQ2OTMnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcG91dFdpbmRvdy5fX2dsSW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hdGl2ZSBCcm93c2VyV2luZG93IGJhY2tpbmcgdGhpcyBwb3BvdXQuXHJcbiAgICAgKiBNaWdodCB0aHJvdyBhbiBVbmV4cGVjdGVkTnVsbEVycm9yIGV4Y2VwdGlvbiB3aGVuIHRoZSB3aW5kb3cgaXMgbm90IGluaXRpYWxpemVkIHlldC5cclxuICAgICAqIEBwdWJsaWNcclxuICAgICAqL1xyXG4gICAgZ2V0V2luZG93KCk6IFdpbmRvdyB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BvcG91dFdpbmRvdyA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignQlBHVzA4NzIxNScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fcG9wb3V0V2luZG93O1xyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlKHByZXZlbnRQb3BJbiA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHByZXZlbnRQb3BJbikge1xyXG4gICAgICAgICAgICB0aGlzLl9wcmV2ZW50UG9wSW5PbkNsb3NlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmdldEdsSW5zdGFuY2UoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmdldEdsSW5zdGFuY2UoKS5jbG9zZVdpbmRvdygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFdpbmRvdygpLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBwb3BwZWQgb3V0IGl0ZW0gdG8gaXRzIG9yaWdpbmFsIHBvc2l0aW9uLiBJZiB0aGUgb3JpZ2luYWxcclxuICAgICAqIHBhcmVudCBpc24ndCBhdmFpbGFibGUgYW55bW9yZSBpdCBmYWxscyBiYWNrIHRvIHRoZSBsYXlvdXQncyB0b3Btb3N0IGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgcG9wSW4oKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHBhcmVudEl0ZW06IENvbnRlbnRJdGVtO1xyXG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMuX2NvbmZpZy5pbmRleEluUGFyZW50O1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbmZpZy5wYXJlbnRJZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICogVGhlIGRlZXBFeHRlbmQgY2FsbCBzZWVtcyBhIGJpdCBwb2ludGxlc3MsIGJ1dCBpdCdzIGNydWNpYWwgdG9cclxuICAgICAgICAqIGNvcHkgdGhlIGNvbmZpZyByZXR1cm5lZCBieSB0aGlzLmdldEdsSW5zdGFuY2UoKS50b0NvbmZpZygpXHJcbiAgICAgICAgKiBvbnRvIGEgbmV3IG9iamVjdC4gSW50ZXJuZXQgRXhwbG9yZXIga2VlcHMgdGhlIHJlZmVyZW5jZXNcclxuICAgICAgICAqIHRvIG9iamVjdHMgb24gdGhlIGNoaWxkIHdpbmRvdywgcmVzdWx0aW5nIGluIHRoZSBmb2xsb3dpbmcgZXJyb3JcclxuICAgICAgICAqIG9uY2UgdGhlIGNoaWxkIHdpbmRvdyBpcyBjbG9zZWQ6XHJcbiAgICAgICAgKlxyXG4gICAgICAgICogVGhlIGNhbGxlZSAoc2VydmVyIFtub3Qgc2VydmVyIGFwcGxpY2F0aW9uXSkgaXMgbm90IGF2YWlsYWJsZSBhbmQgZGlzYXBwZWFyZWRcclxuICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IGdsSW5zdGFuY2VMYXlvdXRDb25maWcgPSB0aGlzLmdldEdsSW5zdGFuY2UoKS5zYXZlTGF5b3V0KCk7XHJcbiAgICAgICAgY29uc3QgY29waWVkR2xJbnN0YW5jZUxheW91dENvbmZpZyA9IGRlZXBFeHRlbmQoe30sIGdsSW5zdGFuY2VMYXlvdXRDb25maWcpIGFzIFJlc29sdmVkTGF5b3V0Q29uZmlnO1xyXG4gICAgICAgIGxldCBjb3BpZWRSb290ID0gY29waWVkR2xJbnN0YW5jZUxheW91dENvbmZpZy5yb290O1xyXG4gICAgICAgIGlmIChjb3BpZWRSb290ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBncm91bmRJdGVtID0gdGhpcy5fbGF5b3V0TWFuYWdlci5ncm91bmRJdGVtO1xyXG4gICAgICAgIGlmIChncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignQlBQSUczNDk3MicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwYXJlbnRJdGVtID0gZ3JvdW5kSXRlbS5nZXRJdGVtc0J5UG9wSW5QYXJlbnRJZCh0aGlzLl9jb25maWcucGFyZW50SWQpWzBdO1xyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICogRmFsbGJhY2sgaWYgcGFyZW50SXRlbSBpcyBub3QgYXZhaWxhYmxlLiBFaXRoZXIgYWRkIGl0IHRvIHRoZSB0b3Btb3N0XHJcbiAgICAgICAgKiBpdGVtIG9yIG1ha2UgaXQgdGhlIHRvcG1vc3QgaXRlbSBpZiB0aGUgbGF5b3V0IGlzIGVtcHR5XHJcbiAgICAgICAgKi9cclxuICAgICAgICBpZiAoIXBhcmVudEl0ZW0pIHtcclxuICAgICAgICAgICAgaWYgKGdyb3VuZEl0ZW0uY29udGVudEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudEl0ZW0gPSBncm91bmRJdGVtLmNvbnRlbnRJdGVtc1swXTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudEl0ZW0gPSBncm91bmRJdGVtO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGluZGV4ID0gcGFyZW50SXRlbS5jb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBhcmVudEl0ZW0uaXNTdGFjaykgeyAgIFxyXG4gICAgICAgICAgICAvLyBTdGFja3MgY2FuIG9ubHkgaG9sZCBjb21wb25lbnQgaXRlbXMgLT4gdHJ5IHRvIGZpbmQgb25lIGJ5IHVucmF2ZWxpbmcgY29udGFpbmVycyB3aXRoIGEgc2luZ2xlIGNoaWxkXHJcbiAgICAgICAgICAgIHdoaWxlIChjb3BpZWRSb290LnR5cGUgIT09IEl0ZW1UeXBlLmNvbXBvbmVudCAmJiBjb3BpZWRSb290LmNvbnRlbnQubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICBjb3BpZWRSb290ID0gY29waWVkUm9vdC5jb250ZW50WzBdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBGYWlsZWQgdG8gZmluZCBhIGNvbXBvbmVudCBpdGVtLCB3cmFwIHRoZSBwYXJlbnQgaXRlbSBhbmQgZG9ja2VkIGl0ZW0gaW4gYSByb3cgYXMgc2libGluZ3NcclxuICAgICAgICAgICAgaWYgKGNvcGllZFJvb3QudHlwZSAhPT0gSXRlbVR5cGUuY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50SXRlbS5wYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignQlBQSUczNDk3MycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IG5ldyBSb3dPckNvbHVtbihmYWxzZSwgdGhpcy5fbGF5b3V0TWFuYWdlciwgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcuY3JlYXRlRGVmYXVsdCgncm93JyksIHBhcmVudEl0ZW0ucGFyZW50KTtcclxuICAgICAgICAgICAgICAgIHBhcmVudEl0ZW0ucGFyZW50LnJlcGxhY2VDaGlsZChwYXJlbnRJdGVtLCByb3csIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHJvdy5hZGRDaGlsZChwYXJlbnRJdGVtKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudEl0ZW0gPSByb3c7XHJcbiAgICAgICAgICAgICAgICBpbmRleCA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG5ld0NvbnRlbnRJdGVtID0gdGhpcy5fbGF5b3V0TWFuYWdlci5jcmVhdGVBbmRJbml0Q29udGVudEl0ZW0oY29waWVkUm9vdCwgcGFyZW50SXRlbSk7XHJcblxyXG4gICAgICAgIGluZGV4ID0gKGluZGV4ICE9PSBudWxsKSA/IE1hdGgubWF4KDAsIE1hdGgubWluKHBhcmVudEl0ZW0uY29udGVudEl0ZW1zLmxlbmd0aCwgaW5kZXgpKSA6IG51bGw7XHJcbiAgICAgICAgcGFyZW50SXRlbS5hZGRDaGlsZChuZXdDb250ZW50SXRlbSwgaW5kZXgpO1xyXG4gICAgICAgIGlmICh0aGlzLl9sYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5zZXR0aW5ncy5wb3BJbk9uQ2xvc2UpIHtcclxuICAgICAgICAgICAgdGhpcy5fb25DbG9zZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIHRoZSBVUkwgYW5kIHdpbmRvdyBwYXJhbWV0ZXJcclxuICAgICAqIGFuZCBvcGVucyBhIG5ldyB3aW5kb3dcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVdpbmRvdygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmNyZWF0ZVVybCgpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBCb2d1cyB0aXRsZSB0byBwcmV2ZW50IHJlLXVzYWdlIG9mIGV4aXN0aW5nIHdpbmRvdyB3aXRoIHRoZVxyXG4gICAgICAgICAqIHNhbWUgdGl0bGUuIFRoZSBhY3R1YWwgdGl0bGUgd2lsbCBiZSBzZXQgYnkgdGhlIG5ldyB3aW5kb3cnc1xyXG4gICAgICAgICAqIEdvbGRlbkxheW91dCBpbnN0YW5jZSBpZiBpdCBkZXRlY3RzIHRoYXQgaXQgaXMgaW4gc3ViV2luZG93TW9kZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDApLnRvU3RyaW5nKDM2KTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG9wdGlvbnMgYXMgdXNlZCBpbiB0aGUgd2luZG93Lm9wZW4gc3RyaW5nXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgZmVhdHVyZXMgPSB0aGlzLnNlcmlhbGl6ZVdpbmRvd0ZlYXR1cmVzKHtcclxuICAgICAgICAgICAgbGVmdDogdGhpcy5faW5pdGlhbFdpbmRvd1NpemUubGVmdCxcclxuICAgICAgICAgICAgdG9wOiB0aGlzLl9pbml0aWFsV2luZG93U2l6ZS50b3AsXHJcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLl9pbml0aWFsV2luZG93U2l6ZS53aWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLl9pbml0aWFsV2luZG93U2l6ZS5oZWlnaHQsXHJcbiAgICAgICAgICAgIGlubmVyV2lkdGg6IHRoaXMuX2luaXRpYWxXaW5kb3dTaXplLndpZHRoLFxyXG4gICAgICAgICAgICBpbm5lckhlaWdodDogdGhpcy5faW5pdGlhbFdpbmRvd1NpemUuaGVpZ2h0LFxyXG4gICAgICAgICAgICBtZW51YmFyOiAnbm8nLFxyXG4gICAgICAgICAgICB0b29sYmFyOiAnbm8nLFxyXG4gICAgICAgICAgICBsb2NhdGlvbjogJ25vJyxcclxuICAgICAgICAgICAgcGVyc29uYWxiYXI6ICdubycsXHJcbiAgICAgICAgICAgIHJlc2l6YWJsZTogJ3llcycsXHJcbiAgICAgICAgICAgIHNjcm9sbGJhcnM6ICdubycsXHJcbiAgICAgICAgICAgIHN0YXR1czogJ25vJ1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl9wb3BvdXRXaW5kb3cgPSBnbG9iYWxUaGlzLm9wZW4odXJsLCB0YXJnZXQsIGZlYXR1cmVzKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9wb3BvdXRXaW5kb3cpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2xheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLnNldHRpbmdzLmJsb2NrZWRQb3BvdXRzVGhyb3dFcnJvciA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgUG9wb3V0QmxvY2tlZEVycm9yKCdQb3BvdXQgYmxvY2tlZCcpO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BvcG91dFdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4geyAgICBcclxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkFuZFJlc2l6ZVdpbmRvdygpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BvcG91dFdpbmRvdykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcG9wb3V0V2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuc2V0dGluZ3MucG9wSW5PbkNsb3NlICYmICF0aGlzLl9wcmV2ZW50UG9wSW5PbkNsb3NlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wSW4oKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBQb2xsaW5nIHRoZSBjaGlsZHdpbmRvdyB0byBmaW5kIG91dCBpZiBHb2xkZW5MYXlvdXQgaGFzIGJlZW4gaW5pdGlhbGlzZWRcclxuICAgICAgICAgKiBkb2Vzbid0IHNlZW0gb3B0aW1hbCwgYnV0IHRoZSBhbHRlcm5hdGl2ZXMgLSBhZGRpbmcgYSBjYWxsYmFjayB0byB0aGUgcGFyZW50XHJcbiAgICAgICAgICogd2luZG93IG9yIHJhaXNpbmcgYW4gZXZlbnQgb24gdGhlIHdpbmRvdyBvYmplY3QgLSBib3RoIHdvdWxkIGludHJvZHVjZSBrbm93bGVkZ2VcclxuICAgICAgICAgKiBhYm91dCB0aGUgcGFyZW50IHRvIHRoZSBjaGlsZCB3aW5kb3cgd2hpY2ggd2UnZCByYXRoZXIgYXZvaWRcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9jaGVja1JlYWR5SW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLmNoZWNrUmVhZHkoKSwgMTApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgY2hlY2tSZWFkeSgpIHtcclxuICAgICAgICBpZiAodGhpcy5fcG9wb3V0V2luZG93ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdCUENSMDE4NDQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fcG9wb3V0V2luZG93Ll9fZ2xJbnN0YW5jZSAmJiB0aGlzLl9wb3BvdXRXaW5kb3cuX19nbEluc3RhbmNlLmlzSW5pdGlhbGlzZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3BvcG91dFdpbmRvdy5fX2dsSW5zdGFuY2UucGFyZW50ID0gdGhpcy5fbGF5b3V0TWFuYWdlcjtcclxuICAgICAgICAgICAgICAgIHRoaXMub25Jbml0aWFsaXNlZCgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NoZWNrUmVhZHlJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9jaGVja1JlYWR5SW50ZXJ2YWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrUmVhZHlJbnRlcnZhbCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBvc2l0aW9uQW5kUmVzaXplV2luZG93KCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9wb3BvdXRXaW5kb3cgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0JQUEFSVzEnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEluaXRpYWwgd2luZG93IHNpemUgcGFyYW1ldGVycyBkZXNjcmliZSBjbGllbnQgKGkuZS4gaW5uZXIpIHBvc2l0aW9uIGFuZCBzaXplXHJcbiAgICAgICAgLy8gU2luY2UgdGhlIGJvcmRlciBvZiB0aGUgcG9wb3V0IG1heSBoYXZlIGRpZmZlcmVudCBib3JkZXJzIHRoYW4gdGhlIG1haW4gd2luZG93LCB3ZSBoYXZlXHJcbiAgICAgICAgLy8gdG8gYWRqdXN0IHRoZSBwb3NpdGlvbiBhbmQgc2l6ZSBvbmNlIHRoZSB3aW5kb3cgaGFzIGJlZW4gY3JlYXRlZC5cclxuICAgICAgICAvLyBPbmx5IGRvIHRoaXMgaWYgdGhlIHdpbmRvdyBwYXJhbWV0ZXJzIGFyZSBwbGF1c2libGUgKGUuZy4gb24gTGludXggaW5uZXIgZGltZW5zaW9uIGlzIHplcm8gc29tZXRpbWVzKVxyXG4gICAgICAgIGlmICh0aGlzLl9wb3BvdXRXaW5kb3cuaW5uZXJXaWR0aCA+IDAgJiYgdGhpcy5fcG9wb3V0V2luZG93LmlubmVySGVpZ2h0ID4gMCAmJlxyXG4gICAgICAgICAgICB0aGlzLl9wb3BvdXRXaW5kb3cub3V0ZXJXaWR0aCA+IDAgJiYgdGhpcy5fcG9wb3V0V2luZG93Lm91dGVySGVpZ2h0ID4gMCAmJlxyXG4gICAgICAgICAgICB0aGlzLl9wb3BvdXRXaW5kb3cuaW5uZXJXaWR0aCA8PSB0aGlzLl9wb3BvdXRXaW5kb3cub3V0ZXJXaWR0aCAmJlxyXG4gICAgICAgICAgICB0aGlzLl9wb3BvdXRXaW5kb3cuaW5uZXJIZWlnaHQgPD0gdGhpcy5fcG9wb3V0V2luZG93Lm91dGVySGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgY29uc3QgYm9yZGVyID0gZ2V0V2luZG93VG9wTGVmdEJvcmRlcih0aGlzLl9wb3BvdXRXaW5kb3cpO1xyXG4gICAgICAgICAgICB0aGlzLl9wb3BvdXRXaW5kb3cubW92ZVRvKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5faW5pdGlhbFdpbmRvd1NpemUubGVmdCAtIGJvcmRlci53aWR0aCxcclxuICAgICAgICAgICAgICAgIHRoaXMuX2luaXRpYWxXaW5kb3dTaXplLnRvcCAtIGJvcmRlci5oZWlnaHQsXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRoaXMuX3BvcG91dFdpbmRvdy5yZXNpemVUbyhcclxuICAgICAgICAgICAgICAgIHRoaXMuX2luaXRpYWxXaW5kb3dTaXplLndpZHRoICsgKHRoaXMuX3BvcG91dFdpbmRvdy5vdXRlcldpZHRoIC0gdGhpcy5fcG9wb3V0V2luZG93LmlubmVyV2lkdGgpLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5faW5pdGlhbFdpbmRvd1NpemUuaGVpZ2h0ICsgKHRoaXMuX3BvcG91dFdpbmRvdy5vdXRlckhlaWdodCAtIHRoaXMuX3BvcG91dFdpbmRvdy5pbm5lckhlaWdodClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BvcG91dFdpbmRvdy5mb2N1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VyaWFsaXNlcyBhIG1hcCBvZiBrZXk6dmFsdWVzIHRvIGEgd2luZG93IG9wdGlvbnMgc3RyaW5nXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHdpbmRvd09wdGlvbnMgLVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHNlcmlhbGlzZWQgd2luZG93IG9wdGlvbnNcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNlcmlhbGl6ZVdpbmRvd0ZlYXR1cmVzKHdpbmRvd09wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4pOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IHdpbmRvd09wdGlvbnNTdHJpbmc6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHdpbmRvd09wdGlvbnMpIHtcclxuICAgICAgICAgICAgd2luZG93T3B0aW9uc1N0cmluZy5wdXNoKGtleSArICc9JyArIHdpbmRvd09wdGlvbnNba2V5XS50b1N0cmluZygpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB3aW5kb3dPcHRpb25zU3RyaW5nLmpvaW4oJywnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgdGhlIFVSTCBmb3IgdGhlIG5ldyB3aW5kb3csIGluY2x1ZGluZyB0aGVcclxuICAgICAqIGNvbmZpZyBHRVQgcGFyYW1ldGVyXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgVVJMXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVVcmwoKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBzdG9yYWdlS2V5ID0gJ2dsLXdpbmRvdy1jb25maWctJyArIGdldFVuaXF1ZUlkKCk7XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gUmVzb2x2ZWRMYXlvdXRDb25maWcubWluaWZ5Q29uZmlnKHRoaXMuX2NvbmZpZyk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHN0b3JhZ2VLZXksIEpTT04uc3RyaW5naWZ5KGNvbmZpZykpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciB3aGlsZSB3cml0aW5nIHRvIGxvY2FsU3RvcmFnZSAnICsgZ2V0RXJyb3JNZXNzYWdlKGUpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoJy9nbC1wb3BvdXQnLCBsb2NhdGlvbi5vcmlnaW4pO1xyXG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdnbC13aW5kb3cnLCBzdG9yYWdlS2V5KTtcclxuXHJcbiAgICAgICAgY29uc3QgdGhlbWUgPSB0aGlzLl9sYXlvdXRNYW5hZ2VyLmNvbnRhaW5lci5kYXRhc2V0LnRoZW1lO1xyXG4gICAgICAgIGlmICh0aGVtZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdnbC10aGVtZScsIHRoZW1lKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB1cmwudG9TdHJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxiYWNrIHdoZW4gdGhlIG5ldyB3aW5kb3cgaXMgb3BlbmVkIGFuZCB0aGUgR29sZGVuTGF5b3V0IGluc3RhbmNlXHJcbiAgICAgKiB3aXRoaW4gaXQgaXMgaW5pdGlhbGlzZWRcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uSW5pdGlhbGlzZWQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXNlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5nZXRHbEluc3RhbmNlKCkub24oJ3BvcEluJywgKCkgPT4gdGhpcy5wb3BJbigpKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2luaXRpYWxpc2VkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZva2VkIDUwbXMgYWZ0ZXIgdGhlIHdpbmRvdyB1bmxvYWQgZXZlbnRcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9vbkNsb3NlKCkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5lbWl0KCdjbG9zZWQnKSwgNTApO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IERyYWdQcm94eSB9IGZyb20gJy4vZHJhZy1wcm94eSc7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IFVuZXhwZWN0ZWROdWxsRXJyb3IsIFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LWVtaXR0ZXInO1xyXG5pbXBvcnQgeyBDb250ZW50SXRlbSB9IGZyb20gJy4uL2l0ZW1zL2NvbnRlbnQtaXRlbSc7XHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9jb21wb25lbnQtaXRlbSc7XHJcbmltcG9ydCB7IERyYWdMaXN0ZW5lciB9IGZyb20gJy4uL3V0aWxzL2RyYWctbGlzdGVuZXInO1xyXG5pbXBvcnQgeyBnZXRXaW5kb3dJbm5lclNjcmVlblBvc2l0aW9uIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5jbGFzcyBEcmFnVGFyZ2V0IHtcclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX293bmVyOiBEcmFnQWN0aW9uLFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2FyZWE6IENvbnRlbnRJdGVtLkFyZWEsXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfcGFnZVg6IG51bWJlcixcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9wYWdlWTogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKF9vd25lci5sYXlvdXRNYW5hZ2VyICE9PSBfYXJlYS5jb250ZW50SXRlbS5sYXlvdXRNYW5hZ2VyKSB7XHJcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdMYXlvdXRNYW5hZ2VyIG9mIEFyZWEgYW5kIERyYWdQcm94eSBtdXN0IG1hdGNoJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBvd25lcigpOiBEcmFnQWN0aW9uIHsgcmV0dXJuIHRoaXMuX293bmVyOyB9XHJcbiAgICBnZXQgYXJlYSgpOiBDb250ZW50SXRlbS5BcmVhIHsgcmV0dXJuIHRoaXMuX2FyZWE7IH1cclxuXHJcbiAgICBkcm9wKGl0ZW06IENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICB0aGlzLl9hcmVhLmNvbnRlbnRJdGVtLm9uRHJvcChpdGVtLCB0aGlzLl9hcmVhKTtcclxuICAgIH1cclxuXHJcbiAgICBoaWdobGlnaHREcm9wWm9uZSgpIHtcclxuICAgICAgICB0aGlzLmFyZWEuY29udGVudEl0ZW0uaGlnaGxpZ2h0RHJvcFpvbmUodGhpcy5fcGFnZVgsIHRoaXMuX3BhZ2VZLCB0aGlzLl9hcmVhKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgY2xhc3MgRHJhZ0FjdGlvbiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBwcml2YXRlIF9kcmFnUHJveHk6IERyYWdQcm94eSB8IG51bGwgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBfY3VycmVudFRhcmdldDogRHJhZ1RhcmdldCB8IG51bGwgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBfZHJhZ0xpc3RlbmVyOiBEcmFnTGlzdGVuZXIgfCBudWxsID0gbnVsbDtcclxuICAgIHByaXZhdGUgX2JvdW5kaW5nUmVjdDogRE9NUmVjdDtcclxuICAgIHByaXZhdGUgX2FjdGlvbnM6IERyYWdBY3Rpb25bXSA9IFtdO1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RyYWdFdmVudEhhbmRsZXIgPSAoX29mZnNldFg6IG51bWJlciwgX29mZnNldFk6IG51bWJlciwgZXZlbnQ6IEV2ZW50RW1pdHRlci5EcmFnRXZlbnQpID0+IHRoaXMub25EcmFnKGV2ZW50KTtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RyYWdTdG9wRXZlbnRIYW5kbGVyID0gKCkgPT4gdGhpcy5vbkRyYWdTdG9wKCk7XHJcblxyXG4gICAgZ2V0IGxheW91dE1hbmFnZXIoKTogTGF5b3V0TWFuYWdlciB7IHJldHVybiB0aGlzLl9sYXlvdXRNYW5hZ2VyOyB9XHJcbiAgICBnZXQgcGFyZW50KCk6IERyYWdBY3Rpb24gfCBudWxsIHsgcmV0dXJuIHRoaXMuX3BhcmVudDsgfVxyXG4gICAgZ2V0IHByb3h5KCk6IERyYWdQcm94eSB8IG51bGwgeyByZXR1cm4gdGhpcy5fZHJhZ1Byb3h5OyB9XHJcbiAgICBwcml2YXRlIGdldCBwYXJlbnRPclNlbGYoKTogRHJhZ0FjdGlvbiB7IHJldHVybiB0aGlzLl9wYXJlbnQgPz8gdGhpczsgfVxyXG4gICAgZ2V0IGN1cnJlbnRUYXJnZXQoKTogRHJhZ1RhcmdldCB8IG51bGwgeyByZXR1cm4gdGhpcy5wYXJlbnRPclNlbGYuX2N1cnJlbnRUYXJnZXQ7IH1cclxuICAgIHByaXZhdGUgc2V0IGN1cnJlbnRUYXJnZXQodmFsdWUgOiBEcmFnVGFyZ2V0IHwgbnVsbCkgeyB0aGlzLnBhcmVudE9yU2VsZi5fY3VycmVudFRhcmdldCA9IHZhbHVlOyB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9sYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2FsbG93UG9wb3V0OiBib29sZWFuID0gZmFsc2UsXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfcGFyZW50OiBEcmFnQWN0aW9uIHwgbnVsbCA9IG51bGxcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5fYm91bmRpbmdSZWN0ID0gdGhpcy5jb21wdXRlQm91bmRpbmdSZWN0KCk7XHJcbiAgICAgICAgdGhpcy5wYXJlbnRPclNlbGYuX2FjdGlvbnMucHVzaCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvbXB1dGVCb3VuZGluZ1JlY3QoKTogRE9NUmVjdCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2xheW91dE1hbmFnZXIuZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0RBQ0JSMTExMjAnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5fbGF5b3V0TWFuYWdlci5ncm91bmRJdGVtLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgIHJldHVybiBET01SZWN0LmZyb21SZWN0KHtcclxuICAgICAgICAgICAgICAgIHg6IGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCArIHJlY3QubGVmdCxcclxuICAgICAgICAgICAgICAgIHk6IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wICsgcmVjdC50b3AsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogcmVjdC53aWR0aCxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogcmVjdC5oZWlnaHRcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2NyZWVuVG9QYWdlKHNjcmVlblg6IG51bWJlciwgc2NyZWVuWTogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgaW5uZXJTY3JlZW4gPSBnZXRXaW5kb3dJbm5lclNjcmVlblBvc2l0aW9uKGdsb2JhbFRoaXMpO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB4OiBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgKyBzY3JlZW5YIC0gaW5uZXJTY3JlZW4ubGVmdCxcclxuICAgICAgICAgICAgeTogZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgKyBzY3JlZW5ZIC0gaW5uZXJTY3JlZW4udG9wXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzUHJveHlWaXNpYmxlKHByb3h5OiBEcmFnUHJveHksIHBhZ2VYIDogbnVtYmVyLCBwYWdlWTogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgcGFnZVggPj0gdGhpcy5fYm91bmRpbmdSZWN0LmxlZnQgLSBwcm94eS5vdXRlcldpZHRoICYmXHJcbiAgICAgICAgICAgIHBhZ2VYIDwgdGhpcy5fYm91bmRpbmdSZWN0LnJpZ2h0ICYmXHJcbiAgICAgICAgICAgIHBhZ2VZID49IHRoaXMuX2JvdW5kaW5nUmVjdC50b3AgLSBwcm94eS5vdXRlckhlaWdodCAmJlxyXG4gICAgICAgICAgICBwYWdlWSA8IHRoaXMuX2JvdW5kaW5nUmVjdC5ib3R0b21cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlUHJveHkoaXRlbTogQ29tcG9uZW50SXRlbSwgeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9kcmFnUHJveHkgPSBuZXcgRHJhZ1Byb3h5KHRoaXMsIGl0ZW0sIHgsIHkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZHJhZ0xvY2FsKHBhZ2VYOiBudW1iZXIsIHBhZ2VZOiBudW1iZXIpOiBEcmFnVGFyZ2V0IHwgbnVsbCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RyYWdQcm94eSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCBhcmVhID0gdGhpcy5fZHJhZ1Byb3h5LmRyYWcocGFnZVgsIHBhZ2VZKTtcclxuICAgICAgICAgICAgcmV0dXJuIChhcmVhICE9PSBudWxsKSA/IG5ldyBEcmFnVGFyZ2V0KHRoaXMsIGFyZWEsIHBhZ2VYLCBwYWdlWSkgOiBudWxsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRyYWdHbG9iYWwoc2NyZWVuWDogbnVtYmVyLCBzY3JlZW5ZOiBudW1iZXIpOiBEcmFnVGFyZ2V0IHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5fcGFyZW50Py5fZHJhZ1Byb3h5O1xyXG4gICAgICAgIGlmICghc291cmNlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdEQURHMScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgeyB4OiBwYWdlWCwgeTogcGFnZVkgfSA9IHRoaXMuc2NyZWVuVG9QYWdlKHNjcmVlblgsIHNjcmVlblkpO1xyXG4gICAgICAgIGNvbnN0IHZpc2libGUgPSBkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICd2aXNpYmxlJyAmJiB0aGlzLmlzUHJveHlWaXNpYmxlKHNvdXJjZSwgcGFnZVgsIHBhZ2VZKTtcclxuXHJcbiAgICAgICAgaWYgKHZpc2libGUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RyYWdQcm94eSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmdyb3VuZEl0ZW07XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0RBREcyJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHNvdXJjZS5jb21wb25lbnRJdGVtLnRvQ29uZmlnKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkcmFnSXRlbSA9IG5ldyBDb21wb25lbnRJdGVtKHRoaXMubGF5b3V0TWFuYWdlciwgY29uZmlnLCBwYXJlbnQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVQcm94eShkcmFnSXRlbSwgcGFnZVgsIHBhZ2VZKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFByb3h5IGlzIG5vIGxvbmdlciB2aXNpYmxlIGFuZCBub3QgY3VycmVudGx5IHRoZSBkcmFnIHRhcmdldCAtPiBkZXN0cm95XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kcmFnUHJveHkgIT09IG51bGwgJiYgdGhpcy5jdXJyZW50VGFyZ2V0Py5vd25lciAhPT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbkRyYWdTdG9wKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmRyYWdMb2NhbChwYWdlWCwgcGFnZVkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25EcmFnU3RvcCgpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiB0aGlzLl9hY3Rpb25zKSB7XHJcbiAgICAgICAgICAgIGFjdGlvbi5sYXlvdXRNYW5hZ2VyLmhpZGVEcm9wVGFyZ2V0SW5kaWNhdG9yKCk7XHJcbiAgICAgICAgICAgIGFjdGlvbi5fZHJhZ1Byb3h5Py5kcm9wKCk7XHJcbiAgICAgICAgICAgIGFjdGlvbi5fZHJhZ1Byb3h5ID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lcj8ub2ZmKCdkcmFnJywgdGhpcy5fZHJhZ0V2ZW50SGFuZGxlcik7XHJcbiAgICAgICAgdGhpcy5fZHJhZ0xpc3RlbmVyPy5vZmYoJ2RyYWdTdG9wJywgdGhpcy5fZHJhZ1N0b3BFdmVudEhhbmRsZXIpO1xyXG4gICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fY3VycmVudFRhcmdldCA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkRyYWcoZXZlbnQ6IEV2ZW50RW1pdHRlci5EcmFnRXZlbnQpIHtcclxuICAgICAgICBsZXQgdGFyZ2V0OiBEcmFnVGFyZ2V0IHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgIFxyXG4gICAgICAgIC8vIFRyeSB0byBmaW5kIGEgZHJhZyB0YXJnZXQgYnkgaW52b2tpbmcgYWxsIGFjdGlvbnMuXHJcbiAgICAgICAgLy8gRm9yIHNlY29uZGFyeSBhY3Rpb25zIHRoZSBzY3JlZW4gcG9zaXRpb24gb2YgdGhlIGV2ZW50IGhhdmUgdG8gYmUgdHJhbnNsYXRlZC5cclxuICAgICAgICAvLyBUaGUgZmlyc3QgdmFsaWQgdGFyZ2V0IGlzIHNlbGVjdGVkLCBzdGlsbCB3ZSB3YW50IHRvIGludm9rZSBhbGwgYWN0aW9ucyBkdWUgdG8gdGhlIGN1bGxpbmcgbG9naWMgaW4gZHJhZ0dsb2JhbC5cclxuICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiB0aGlzLl9hY3Rpb25zKSB7XHJcbiAgICAgICAgICAgIGxldCB0OiBEcmFnVGFyZ2V0IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICBpZiAoYWN0aW9uICE9PSB0aGlzKSB7XHJcbiAgICAgICAgICAgICAgICB0ID0gYWN0aW9uLmRyYWdHbG9iYWwoZXZlbnQuc2NyZWVuWCwgZXZlbnQuc2NyZWVuWSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fZHJhZ1Byb3h5ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0ID0gdGhpcy5kcmFnTG9jYWwoZXZlbnQucGFnZVgsIGV2ZW50LnBhZ2VZKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gT25seSBzZXQgdGFyZ2V0IGlmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUsIHVubGVzcyB0aGUgcHJlbGltaW5hcnkgdGFyZ2V0XHJcbiAgICAgICAgICAgIC8vIGJlbG9uZ3MgdG8gdGhlIG1haW4gd2luZG93LiBJbiB0aGF0IGNhc2Ugd2Ugc2V0IHRoZSBuZXcgdGFyZ2V0IHRvIHByaW9yaXRpemUgcG9wb3V0IHdpbmRvd3Mgb3ZlciB0aGUgbWFpbiB3aW5kb3cuXHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQgPT09IG51bGwgfHwgKHQgIT09IG51bGwgJiYgdGFyZ2V0Lm93bmVyLmxheW91dE1hbmFnZXIucGFyZW50ID09PSBudWxsKSkge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gbnVsbCB8fCB0aGlzLl9hbGxvd1BvcG91dCkge1xyXG4gICAgICAgICAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBkcm9wIGFyZWEgYnV0IGl0IGlzIGluIGEgZGlmZmVyZW50IHdpbmRvdywgaGlkZSB0aGUgaW5kaWNhdG9yLlxyXG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50VGFyZ2V0ICE9PSBudWxsICYmIHRoaXMuY3VycmVudFRhcmdldC5vd25lciAhPT0gdGFyZ2V0Py5vd25lcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VGFyZ2V0Lm93bmVyLmxheW91dE1hbmFnZXIuaGlkZURyb3BUYXJnZXRJbmRpY2F0b3IoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRhcmdldCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gTW92ZSB0aGUgb3duZXIgb2YgdGhlIHRhcmdldCB0byB0aGUgZnJvbnQsIHNvIGl0IGhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eSBmb3IgZnV0dXJlIGRyYWcgZXZlbnRzLlxyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9hY3Rpb25zLmluZGV4T2YodGFyZ2V0Lm93bmVyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGlvbnMudW5zaGlmdCh0YXJnZXQub3duZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRhcmdldC5oaWdobGlnaHREcm9wWm9uZSgpO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0Lm93bmVyLmxheW91dE1hbmFnZXIubW92ZVdpbmRvd1RvcCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUYXJnZXQgPSB0YXJnZXQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFNwYXduIGEgc2Vjb25kYXJ5IGRyYWcgYWN0aW9uLCB0aGUgcHJveHkgZWxlbWVudCBpcyBvbmx5IGNyZWF0ZWQgd2hlbiB0aGUgcG9pbnRlciBlbnRlcnMgaXRzIHdpbmRvdy5cclxuICAgIHN0YXRpYyBzcGF3bihsYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLCBwYXJlbnQ6IERyYWdBY3Rpb24pOiBEcmFnQWN0aW9uIHtcclxuICAgICAgICBpZiAocGFyZW50Ll9wYXJlbnQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZWNvbmRhcnkgRHJhZ0FjdGlvbiBjYW5ub3Qgc3Bhd24gYW5vdGhlciBEcmFnQWN0aW9uLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBEcmFnQWN0aW9uKGxheW91dE1hbmFnZXIsIGZhbHNlLCBwYXJlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFN0YXJ0IGEgZHJhZyBhY3Rpb24sIGltbWVkaWF0ZWx5IHNob3dpbmcgYSBwcm94eSBlbGVtZW50LlxyXG4gICAgc3RhdGljIHN0YXJ0KGxheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXIsIGxpc3RlbmVyOiBEcmFnTGlzdGVuZXIsIGl0ZW06IENvbXBvbmVudEl0ZW0sIHg6IG51bWJlciwgeTogbnVtYmVyLCBhbGxvd1BvcG91dDogYm9vbGVhbik6IERyYWdBY3Rpb24geyAgICAgICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGFjdGlvbiA9IG5ldyBEcmFnQWN0aW9uKGxheW91dE1hbmFnZXIsIGFsbG93UG9wb3V0KTtcclxuICAgICAgICBhY3Rpb24uY3JlYXRlUHJveHkoaXRlbSwgeCwgeSk7XHJcbiAgICAgICAgYWN0aW9uLl9kcmFnTGlzdGVuZXIgPSBsaXN0ZW5lcjtcclxuICAgICAgICBsaXN0ZW5lci5vbignZHJhZycsIGFjdGlvbi5fZHJhZ0V2ZW50SGFuZGxlcik7XHJcbiAgICAgICAgbGlzdGVuZXIub24oJ2RyYWdTdG9wJywgYWN0aW9uLl9kcmFnU3RvcEV2ZW50SGFuZGxlcik7XHJcbiAgICAgICAgcmV0dXJuIGFjdGlvbjtcclxuICAgIH1cclxufSIsImltcG9ydCB7IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL3Jlc29sdmVkLWNvbmZpZyc7XHJcbmltcG9ydCB7IFVuZXhwZWN0ZWROdWxsRXJyb3IsIFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9jb21wb25lbnQtaXRlbSc7XHJcbmltcG9ydCB7IENvbnRlbnRJdGVtIH0gZnJvbSAnLi4vaXRlbXMvY29udGVudC1pdGVtJztcclxuaW1wb3J0IHsgU3RhY2sgfSBmcm9tICcuLi9pdGVtcy9zdGFjayc7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IERvbUNvbnN0YW50cyB9IGZyb20gJy4uL3V0aWxzL2RvbS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9ldmVudC1lbWl0dGVyJztcclxuaW1wb3J0IHsgU2lkZSwgV2lkdGhBbmRIZWlnaHQgfSBmcm9tICcuLi91dGlscy90eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgICBnZXRVbmlxdWVJZCxcclxuICAgIGdldFdpbmRvd0lubmVyU2NyZWVuUG9zaXRpb24sXHJcbiAgICBudW1iZXJUb1BpeGVsc1xyXG59IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0IHsgRHJhZ0FjdGlvbiB9IGZyb20gJy4vZHJhZy1hY3Rpb24nO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgY3JlYXRlcyBhIHRlbXBvcmFyeSBjb250YWluZXJcclxuICogZm9yIHRoZSBjb21wb25lbnQgd2hpbHN0IGl0IGlzIGJlaW5nIGRyYWdnZWRcclxuICogYW5kIGhhbmRsZXMgZHJhZyBldmVudHNcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRHJhZ1Byb3h5IGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICAgIHByaXZhdGUgX291dGVyV2lkdGg6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX291dGVySGVpZ2h0OiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9zaWRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgX2VsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgcHJpdmF0ZSBfcHJveHlDb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgX2NvbXBvbmVudEl0ZW1Gb2N1c2VkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb3JpZ2luYWxTaXplOiBXaWR0aEFuZEhlaWdodDtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RvY2tQb2ludDogQ29udGVudEl0ZW0uRG9ja1BvaW50IHwgbnVsbDtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2dyb3VuZEFyZWE6IENvbnRlbnRJdGVtLkFyZWE7XHJcbiAgICBwcml2YXRlIF9sYXN0QXJlYTogQ29udGVudEl0ZW0uQXJlYSB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIGdldCBlbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7IH1cclxuICAgIGdldCBvdXRlcldpZHRoKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9vdXRlcldpZHRoOyB9XHJcbiAgICBnZXQgb3V0ZXJIZWlnaHQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX291dGVySGVpZ2h0OyB9XHJcbiAgICBnZXQgY29tcG9uZW50SXRlbSgpOiBDb21wb25lbnRJdGVtIHsgcmV0dXJuIHRoaXMuX2NvbXBvbmVudEl0ZW07IH1cclxuICAgIGdldCBsYXlvdXRNYW5hZ2VyKCk6IExheW91dE1hbmFnZXIgeyByZXR1cm4gdGhpcy5fYWN0aW9uLmxheW91dE1hbmFnZXI7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB4IC0gVGhlIGluaXRpYWwgeCBwb3NpdGlvblxyXG4gICAgICogQHBhcmFtIHkgLSBUaGUgaW5pdGlhbCB5IHBvc2l0aW9uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfYWN0aW9uOiBEcmFnQWN0aW9uLFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0sXHJcbiAgICAgICAgeDogbnVtYmVyLCB5OiBudW1iZXJcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICAgIGxldCBzaXplZENvbXBvbmVudCA9IHRoaXMuX2NvbXBvbmVudEl0ZW07XHJcblxyXG4gICAgICAgIC8vIElmIHdlIGFyZSBkcmFnZ2luZyBhbiBpbmFjdGl2ZSBjb21wb25lbnQgb2YgYSBzdGFjaywgd2Ugd29uJ3QgYmUgYWJsZSB0byBnZXQgcmVhc29uYWJsZVxyXG4gICAgICAgIC8vIHNpemUgZm9yIGEgcG9wb3V0LiBVc2UgdGhlIHNpemUgb2YgdGhlIGFjdGl2ZSBjb21wb25lbnQgaW5zdGVhZCBpbiB0aGlzIGNhc2UuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudEl0ZW0ucGFyZW50IGluc3RhbmNlb2YgU3RhY2spIHtcclxuICAgICAgICAgICAgY29uc3QgYWN0aXZlID0gdGhpcy5fY29tcG9uZW50SXRlbS5wYXJlbnQuZ2V0QWN0aXZlQ29tcG9uZW50SXRlbSgpO1xyXG4gICAgICAgICAgICBpZiAoYWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICBzaXplZENvbXBvbmVudCA9IGFjdGl2ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fb3JpZ2luYWxTaXplID0gc2l6ZWRDb21wb25lbnQuZ2V0T3V0ZXJCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICB0aGlzLmNyZWF0ZURyYWdQcm94eUVsZW1lbnRzKHgsIHkpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fY29tcG9uZW50SXRlbS5wYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgLy8gTm90ZSB0aGF0IF9jb250ZW50SXRlbSB3aWxsIGhhdmUgZHVtbXkgR3JvdW5kSXRlbSBhcyBwYXJlbnQgaWYgaW5pdGlhdGVkIGJ5IGEgZXh0ZXJuYWwgZHJhZyBzb3VyY2VcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0RQQzEwMDk3Jyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9jb21wb25lbnRJdGVtRm9jdXNlZCA9IHRoaXMuX2NvbXBvbmVudEl0ZW0uZm9jdXNlZDtcclxuICAgICAgICBpZiAodGhpcy5fY29tcG9uZW50SXRlbUZvY3VzZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5ibHVyKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9kb2NrUG9pbnQgPSB0aGlzLl9jb21wb25lbnRJdGVtLmZpbmREb2NrUG9pbnQoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudEl0ZW0ucGFyZW50LmNvbnRlbnRJdGVtcy5pbmNsdWRlcyh0aGlzLl9jb21wb25lbnRJdGVtKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRJdGVtLnBhcmVudC5yZW1vdmVDaGlsZCh0aGlzLl9jb21wb25lbnRJdGVtLCB0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0RGltZW5zaW9ucygpO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5sYXlvdXRNYW5hZ2VyLmdyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdEUEMxMDA5OCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZ3JvdW5kQXJlYSA9IHRoaXMubGF5b3V0TWFuYWdlci5ncm91bmRJdGVtLmdldEVsZW1lbnRBcmVhKCk7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmNhbGN1bGF0ZUl0ZW1BcmVhcygpO1xyXG4gICAgICAgIHRoaXMuc2V0RHJvcFBvc2l0aW9uKHgsIHkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBDcmVhdGUgU3RhY2stbGlrZSBzdHJ1Y3R1cmUgdG8gY29udGFpbiB0aGUgZHJhZ2dlZCBjb21wb25lbnQgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlRHJhZ1Byb3h5RWxlbWVudHMoaW5pdGlhbFg6IG51bWJlciwgaW5pdGlhbFk6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5EcmFnUHJveHkpO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBoZWFkZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5IZWFkZXIpO1xyXG4gICAgICAgIGNvbnN0IHRhYnNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGFic0VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLlRhYnMpO1xyXG4gICAgICAgIGNvbnN0IHRhYkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICB0YWJFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5UYWIpO1xyXG4gICAgICAgIGNvbnN0IHRpdGxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgICAgICB0aXRsZUVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLlRpdGxlKTtcclxuICAgICAgICB0YWJFbGVtZW50LmFwcGVuZENoaWxkKHRpdGxlRWxlbWVudCk7XHJcbiAgICAgICAgdGFic0VsZW1lbnQuYXBwZW5kQ2hpbGQodGFiRWxlbWVudCk7XHJcbiAgICAgICAgaGVhZGVyRWxlbWVudC5hcHBlbmRDaGlsZCh0YWJzRWxlbWVudCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3Byb3h5Q29udGFpbmVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHRoaXMuX3Byb3h5Q29udGFpbmVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuQ29udGVudCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQoaGVhZGVyRWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9wcm94eUNvbnRhaW5lckVsZW1lbnQpO1xyXG5cclxuICAgICAgICBjb25zdCBzaWRlID0gdGhpcy5fY29tcG9uZW50SXRlbS5oZWFkZXJDb25maWc/LnNob3c7XHJcbiAgICAgICAgaWYgKHNpZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2lkZWQgPSBbU2lkZS5yaWdodCwgU2lkZS5sZWZ0XS5pbmNsdWRlcyhzaWRlKTtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsbV8nICsgc2lkZSk7XHJcbiAgICAgICAgICAgIGlmIChbU2lkZS5yaWdodCwgU2lkZS5ib3R0b21dLmluZGV4T2Yoc2lkZSkgPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcHJveHlDb250YWluZXJFbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBoZWFkZXJFbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmxlZnQgPSBudW1iZXJUb1BpeGVscyhpbml0aWFsWCk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS50b3AgPSBudW1iZXJUb1BpeGVscyhpbml0aWFsWSk7XHJcbiAgICAgICAgdGFiRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgdGhpcy5fY29tcG9uZW50SXRlbS50aXRsZSk7XHJcbiAgICAgICAgdGl0bGVFbGVtZW50Lmluc2VydEFkamFjZW50VGV4dCgnYWZ0ZXJiZWdpbicsIHRoaXMuX2NvbXBvbmVudEl0ZW0udGl0bGUpO1xyXG4gICAgICAgIHRoaXMuX3Byb3h5Q29udGFpbmVyRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9jb21wb25lbnRJdGVtLmVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgb24gZXZlcnkgbW91c2VNb3ZlIGV2ZW50IGR1cmluZyBhIGRyYWcuIERldGVybWluZXMgaWYgdGhlIGRyYWcgaXNcclxuICAgICAqIHN0aWxsIHdpdGhpbiB0aGUgdmFsaWQgZHJhZyBhcmVhIGFuZCBjYWxscyB0aGUgbGF5b3V0TWFuYWdlciB0byBoaWdobGlnaHQgdGhlXHJcbiAgICAgKiBjdXJyZW50IGRyb3AgYXJlYVxyXG4gICAgICpcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBkcmFnKHg6IG51bWJlciwgeTogbnVtYmVyKTogQ29udGVudEl0ZW0uQXJlYSB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IGFyZWEgPSB0aGlzLnNldERyb3BQb3NpdGlvbih4LCB5KTtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRJdGVtLmRyYWcoKTtcclxuICAgICAgICByZXR1cm4gYXJlYTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHRhcmdldCBwb3NpdGlvblxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB4IC0gVGhlIHggcG9zaXRpb24gaW4gcHhcclxuICAgICAqIEBwYXJhbSB5IC0gVGhlIHkgcG9zaXRpb24gaW4gcHhcclxuICAgICAqXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzZXREcm9wUG9zaXRpb24oeDogbnVtYmVyLCB5OiBudW1iZXIpOiBDb250ZW50SXRlbS5BcmVhIHwgbnVsbCB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5sZWZ0ID0gbnVtYmVyVG9QaXhlbHMoeCk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS50b3AgPSBudW1iZXJUb1BpeGVscyh5KTtcclxuXHJcbiAgICAgICAgY29uc3QgYXJlYSA9IHRoaXMubGF5b3V0TWFuYWdlci5nZXRBcmVhKHgsIHkpO1xyXG5cclxuICAgICAgICAvLyBJZiB3ZSBoYXZlIG5vIG1hdGNoaW5nIGFyZWEsIHJldHVybiB0aGUgbGFzdCBhcmVhIGluc3RlYWQgKHVubGVzcyB3ZSBhcmUgb3V0IG9mIGJvdW5kcyBvZiB0aGUgZ3JvdW5kIGl0ZW0pLlxyXG4gICAgICAgIC8vIEF2b2lkcyBpc3N1ZXMgd2l0aCBzcGxpdHRlcnMgd2hpY2ggZG9uJ3QgaGF2ZSBhbiBhcmVhIHRoZW1zZWx2ZXMuXHJcbiAgICAgICAgaWYgKGFyZWEgIT09IG51bGwgfHwgeCA8IHRoaXMuX2dyb3VuZEFyZWEueDEgfHwgeCA+PSB0aGlzLl9ncm91bmRBcmVhLngyIHx8IHkgPCB0aGlzLl9ncm91bmRBcmVhLnkxIHx8IHkgPj0gdGhpcy5fZ3JvdW5kQXJlYS55Mikge1xyXG4gICAgICAgICAgICB0aGlzLl9sYXN0QXJlYSA9IGFyZWE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdEFyZWE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayB3aGVuIHRoZSBkcmFnIGhhcyBmaW5pc2hlZC4gRGV0ZXJtaW5lcyB0aGUgZHJvcCBhcmVhXHJcbiAgICAgKiBhbmQgYWRkcyB0aGUgY2hpbGQgdG8gaXRcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBkcm9wKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudEl0ZW0uZXhpdERyYWdNb2RlKCk7XHJcblxyXG4gICAgICAgIGxldCBhcmVhOiBDb250ZW50SXRlbS5BcmVhIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgbGV0IGRyb3BwZWRDb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuX2FjdGlvbi5jdXJyZW50VGFyZ2V0O1xyXG4gICAgICAgIGlmICh0YXJnZXQ/Lm93bmVyID09PSB0aGlzLl9hY3Rpb24pIHtcclxuICAgICAgICAgICAgYXJlYSA9IHRhcmdldC5hcmVhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLypcclxuICAgICAgICAqIFZhbGlkIGRyb3AgYXJlYSBmb3VuZFxyXG4gICAgICAgICovXHJcbiAgICAgICAgaWYgKGFyZWEgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgZHJvcHBlZENvbXBvbmVudEl0ZW0gPSB0aGlzLl9jb21wb25lbnRJdGVtO1xyXG4gICAgICAgICAgICBjb25zdCBuZXdQYXJlbnRDb250ZW50SXRlbSA9IGFyZWEuY29udGVudEl0ZW07XHJcbiAgICAgICAgICAgIG5ld1BhcmVudENvbnRlbnRJdGVtLm9uRHJvcChkcm9wcGVkQ29tcG9uZW50SXRlbSwgYXJlYSk7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5mb2N1c1dpbmRvdygpO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBObyB2YWxpZCBkcm9wIGFyZWEgZm91bmQgZHVyaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgZHJhZy5cclxuICAgICAgICAgKiBDcmVhdGUgYSBwb3BvdXQuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgPT09IG51bGwgJiYgdGhpcy5fYWN0aW9uLnBhcmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCBpbm5lclNjcmVlbiA9IGdldFdpbmRvd0lubmVyU2NyZWVuUG9zaXRpb24oZ2xvYmFsVGhpcyk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB3aW5kb3cgOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3cgPSB7XHJcbiAgICAgICAgICAgICAgICBsZWZ0OiBpbm5lclNjcmVlbi5sZWZ0ICsgdGhpcy5lbGVtZW50Lm9mZnNldExlZnQsXHJcbiAgICAgICAgICAgICAgICB0b3A6IGlubmVyU2NyZWVuLnRvcCArIHRoaXMuZWxlbWVudC5vZmZzZXRUb3AsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy5fb3JpZ2luYWxTaXplLndpZHRoLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLl9vcmlnaW5hbFNpemUuaGVpZ2h0XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5jcmVhdGVQb3BvdXRGcm9tQ29udGVudEl0ZW0odGhpcy5fY29tcG9uZW50SXRlbSwgd2luZG93LCBnZXRVbmlxdWVJZCgpLCB0aGlzLl9kb2NrUG9pbnQpO1xyXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRJdGVtLmRlc3Ryb3koKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRyYWcgZGlkbid0IHVsdGltYXRlbHkgZW5kIHVwIHdpdGggYWRkaW5nIHRoZSBjb250ZW50IGl0ZW0gdG9cclxuICAgICAgICAgKiBhbnkgY29udGFpbmVyLiBJbiBvcmRlciB0byBlbnN1cmUgY2xlYW4gdXAgaGFwcGVucywgZGVzdHJveSB0aGVcclxuICAgICAgICAgKiBjb250ZW50IGl0ZW0uXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5kZXN0cm95KCk7IC8vIGNvbnRlbnRJdGVtIGNoaWxkcmVuIGFyZSBub3cgZGVzdHJveWVkIGFzIHdlbGxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5lbWl0KCdpdGVtRHJvcHBlZCcsIHRoaXMuX2NvbXBvbmVudEl0ZW0pO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fY29tcG9uZW50SXRlbUZvY3VzZWQpIHtcclxuICAgICAgICAgICAgZHJvcHBlZENvbXBvbmVudEl0ZW0/LmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgRHJhZyBQcm94eSdzIGRpbWVuc2lvbnNcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNldERpbWVuc2lvbnMoKSB7XHJcbiAgICAgICAgY29uc3QgZGltZW5zaW9ucyA9IHRoaXMubGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuZGltZW5zaW9ucztcclxuICAgICAgICBpZiAoZGltZW5zaW9ucyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRHJhZ1Byb3h5LnNldERpbWVuc2lvbnM6IGRpbWVuc2lvbnMgdW5kZWZpbmVkJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgd2lkdGggPSBkaW1lbnNpb25zLmRyYWdQcm94eVdpZHRoO1xyXG4gICAgICAgIGxldCBoZWlnaHQgPSBkaW1lbnNpb25zLmRyYWdQcm94eUhlaWdodDtcclxuICAgICAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZCB8fCBoZWlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RyYWdQcm94eS5zZXREaW1lbnNpb25zOiB3aWR0aCBhbmQvb3IgaGVpZ2h0IHVuZGVmaW5lZCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fb3V0ZXJXaWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuX291dGVySGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgICAgIGNvbnN0IGhlYWRlckhlaWdodCA9IHRoaXMubGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuaGVhZGVyLnNob3cgPT09IGZhbHNlID8gMCA6IGRpbWVuc2lvbnMuaGVhZGVySGVpZ2h0O1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUud2lkdGggPSBudW1iZXJUb1BpeGVscyh3aWR0aCk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBudW1iZXJUb1BpeGVscyhoZWlnaHQpXHJcbiAgICAgICAgd2lkdGggLT0gKHRoaXMuX3NpZGVkID8gaGVhZGVySGVpZ2h0IDogMCk7XHJcbiAgICAgICAgaGVpZ2h0IC09ICghdGhpcy5fc2lkZWQgPyBoZWFkZXJIZWlnaHQgOiAwKTtcclxuICAgICAgICB0aGlzLl9wcm94eUNvbnRhaW5lckVsZW1lbnQuc3R5bGUud2lkdGggPSBudW1iZXJUb1BpeGVscyh3aWR0aCk7XHJcbiAgICAgICAgdGhpcy5fcHJveHlDb250YWluZXJFbGVtZW50LnN0eWxlLmhlaWdodCA9IG51bWJlclRvUGl4ZWxzKGhlaWdodCk7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5lbnRlckRyYWdNb2RlKHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudEl0ZW0uc2hvdygpO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudEl0ZW1Db25maWcgYXMgQ29uZmlnQ29tcG9uZW50SXRlbUNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9jb25maWcnOyAvLyByZW1vdmUgYWxpYXMgaW4gdmVyc2lvbiAzXHJcbmltcG9ydCB7IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnIH0gZnJvbSBcIi4uL2NvbmZpZy9yZXNvbHZlZC1jb25maWdcIjtcclxuaW1wb3J0IHsgVW5leHBlY3RlZE51bGxFcnJvciwgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4uL2l0ZW1zL2NvbXBvbmVudC1pdGVtJztcclxuaW1wb3J0IHsgR3JvdW5kSXRlbSB9IGZyb20gJy4uL2l0ZW1zL2dyb3VuZC1pdGVtJztcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRHJhZ0xpc3RlbmVyIH0gZnJvbSAnLi4vdXRpbHMvZHJhZy1saXN0ZW5lcic7XHJcbmltcG9ydCB7IEpzb25WYWx1ZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHsgRHJhZ0FjdGlvbiB9IGZyb20gJy4vZHJhZy1hY3Rpb24nO1xyXG5cclxuLyoqXHJcbiAqIEFsbG93cyBmb3IgYW55IERPTSBpdGVtIHRvIGNyZWF0ZSBhIGNvbXBvbmVudCBvbiBkcmFnXHJcbiAqIHN0YXJ0IHRvIGJlIGRyYWdnZWQgaW50byB0aGUgTGF5b3V0XHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBjbGFzcyBEcmFnU291cmNlIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2RyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyIHwgbnVsbDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2R1bW15R3JvdW5kQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2R1bW15R3JvdW5kQ29udGVudEl0ZW06IEdyb3VuZEl0ZW07XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2xheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXIsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxFbGVtZW50LFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9leHRyYUFsbG93YWJsZUNoaWxkVGFyZ2V0czogSFRNTEVsZW1lbnRbXSxcclxuICAgICAgICAvKiogQGludGVybmFsIEBkZXByZWNhdGVkIHJlcGxhY2Ugd2l0aCBjb21wb25lbnRJdGVtQ29uZmlnT3JGdG4gaW4gdmVyc2lvbiAzICovXHJcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50VHlwZU9yRnRuOiBKc29uVmFsdWUgfCAoKCkgPT4gKERyYWdTb3VyY2UuQ29tcG9uZW50SXRlbUNvbmZpZyB8IENvbmZpZ0NvbXBvbmVudEl0ZW1Db25maWcpKSxcclxuICAgICAgICAvKiogQGludGVybmFsIEBkZXByZWNhdGVkIHJlbW92ZSBpbiB2ZXJzaW9uIDMgKi9cclxuICAgICAgICBwcml2YXRlIF9jb21wb25lbnRTdGF0ZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgQGRlcHJlY2F0ZWQgcmVtb3ZlIGluIHZlcnNpb24gMyAqL1xyXG4gICAgICAgIHByaXZhdGUgX3RpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCByZW1vdmUgaW4gdmVyc2lvbiAzICovXHJcbiAgICAgICAgcHJpdmF0ZSBfaWQ6IHN0cmluZyB8IHVuZGVmaW5lZFxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5fZHJhZ0xpc3RlbmVyID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5fZHVtbXlHcm91bmRDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHJcbiAgICAgICAgY29uc3QgZHVtbXlSb290SXRlbUNvbmZpZyA9IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLmNyZWF0ZURlZmF1bHQoJ3JvdycpO1xyXG4gICAgICAgIHRoaXMuX2R1bW15R3JvdW5kQ29udGVudEl0ZW0gPSBuZXcgR3JvdW5kSXRlbSh0aGlzLl9sYXlvdXRNYW5hZ2VyLCBkdW1teVJvb3RJdGVtQ29uZmlnLCB0aGlzLl9kdW1teUdyb3VuZENvbnRhaW5lcik7XHJcblxyXG4gICAgICAgIHRoaXMuY3JlYXRlRHJhZ0xpc3RlbmVyKCk7XHJcbiAgICB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERpc3Bvc2VzIG9mIHRoZSBkcmFnIGxpc3RlbmVycyBzbyB0aGUgZHJhZyBzb3VyY2UgaXMgbm90IHVzYWJsZSBhbnkgbW9yZS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG5cdCAqL1xyXG5cdGRlc3Ryb3koKTogdm9pZCB7XHJcblx0XHR0aGlzLnJlbW92ZURyYWdMaXN0ZW5lcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGluaXRpYWxseSBhbmQgYWZ0ZXIgZXZlcnkgZHJhZ1xyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlRHJhZ0xpc3RlbmVyKCkge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlRHJhZ0xpc3RlbmVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lciA9IG5ldyBEcmFnTGlzdGVuZXIodGhpcy5fZWxlbWVudCwgdGhpcy5fZXh0cmFBbGxvd2FibGVDaGlsZFRhcmdldHMpO1xyXG4gICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lci5vbignZHJhZ1N0YXJ0JywgKHgsIHkpID0+IHRoaXMub25EcmFnU3RhcnQoeCwgeSkpO1xyXG4gICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lci5vbignZHJhZ1N0b3AnLCAoKSA9PiB0aGlzLm9uRHJhZ1N0b3AoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayBmb3IgdGhlIERyYWdMaXN0ZW5lcidzIGRyYWdTdGFydCBldmVudFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB4IC0gVGhlIHggcG9zaXRpb24gb2YgdGhlIG1vdXNlIG9uIGRyYWdTdGFydFxyXG4gICAgICogQHBhcmFtIHkgLSBUaGUgeCBwb3NpdGlvbiBvZiB0aGUgbW91c2Ugb24gZHJhZ1N0YXJ0XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvbkRyYWdTdGFydCh4OiBudW1iZXIsIHk6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IHR5cGUgPSAnY29tcG9uZW50JztcclxuICAgICAgICBsZXQgZHJhZ1NvdXJjZUl0ZW1Db25maWc6IENvbmZpZ0NvbXBvbmVudEl0ZW1Db25maWc7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fY29tcG9uZW50VHlwZU9yRnRuID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgY29uc3QgZnRuRHJhZ1NvdXJjZUl0ZW1Db25maWcgPSB0aGlzLl9jb21wb25lbnRUeXBlT3JGdG4oKSBhcyAoRHJhZ1NvdXJjZS5Db21wb25lbnRJdGVtQ29uZmlnIHwgQ29uZmlnQ29tcG9uZW50SXRlbUNvbmZpZyk7XHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBjb21wb25lbnRUeXBlIHByb3BlcnR5IGV4aXN0cywgdGhlbiBpdCBpcyBhbHJlYWR5IGEgQ29tcG9uZW50SXRlbUNvbmZpZyBzbyBub3RoaW5nIHRvIGRvXHJcbiAgICAgICAgICAgIGlmIChEcmFnU291cmNlLmlzRHJhZ1NvdXJjZUNvbXBvbmVudEl0ZW1Db25maWcoZnRuRHJhZ1NvdXJjZUl0ZW1Db25maWcpKSB7XHJcbiAgICAgICAgICAgICAgICBkcmFnU291cmNlSXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgICAgICAgICB0eXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlOiBmdG5EcmFnU291cmNlSXRlbUNvbmZpZy5zdGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUeXBlOiBmdG5EcmFnU291cmNlSXRlbUNvbmZpZy50eXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBmdG5EcmFnU291cmNlSXRlbUNvbmZpZy50aXRsZSA/PyB0aGlzLl90aXRsZSxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkcmFnU291cmNlSXRlbUNvbmZpZyA9IGZ0bkRyYWdTb3VyY2VJdGVtQ29uZmlnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZHJhZ1NvdXJjZUl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICB0eXBlLFxyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50U3RhdGU6IHRoaXMuX2NvbXBvbmVudFN0YXRlLFxyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50VHlwZTogdGhpcy5fY29tcG9uZW50VHlwZU9yRnRuLFxyXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuX3RpdGxlLFxyXG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuX2lkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgZHVtbXkgQ29udGVudEl0ZW0gb25seSBmb3IgZHJhZyBwdXJwb3Nlc1xyXG4gICAgICAgIC8vIEFsbCBDb250ZW50SXRlbXMgKGV4Y2VwdCBmb3IgR3JvdW5kSXRlbSkgbmVlZCBhIHBhcmVudC4gIFdoZW4gZHJhZ2dpbmcsIHRoZSBwYXJlbnQgaXMgbm90IHVzZWQuXHJcbiAgICAgICAgLy8gSW5zdGVhZCBvZiBhbGxvd2luZyBudWxsIHBhcmVudHMgKGFzIEphdmFzY3JpcHQgdmVyc2lvbiBkaWQpLCB1c2UgYSB0ZW1wb3JhcnkgZHVtbXkgR3JvdW5kSXRlbSBwYXJlbnQgYW5kIGFkZCBDb250ZW50SXRlbSB0byB0aGF0XHJcbiAgICAgICAgLy8gSWYgdGhpcyBkb2VzIG5vdCB3b3JrLCBuZWVkIHRvIGNyZWF0ZSBhbHRlcm5hdGl2ZSBHcm91bmRJdGVtIGNsYXNzXHJcblxyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkSXRlbUNvbmZpZyA9IENvbmZpZ0NvbXBvbmVudEl0ZW1Db25maWcucmVzb2x2ZShkcmFnU291cmNlSXRlbUNvbmZpZywgZmFsc2UpO1xyXG5cclxuICAgICAgICBjb25zdCBjb21wb25lbnRJdGVtID0gbmV3IENvbXBvbmVudEl0ZW0odGhpcy5fbGF5b3V0TWFuYWdlciwgcmVzb2x2ZWRJdGVtQ29uZmlnLCB0aGlzLl9kdW1teUdyb3VuZENvbnRlbnRJdGVtKVxyXG4gICAgICAgIHRoaXMuX2R1bW15R3JvdW5kQ29udGVudEl0ZW0uY29udGVudEl0ZW1zLnB1c2goY29tcG9uZW50SXRlbSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9kcmFnTGlzdGVuZXIgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0RTT0RTRDY2NzQ2Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgYWN0aW9uID0gRHJhZ0FjdGlvbi5zdGFydCh0aGlzLl9sYXlvdXRNYW5hZ2VyLCB0aGlzLl9kcmFnTGlzdGVuZXIsIGNvbXBvbmVudEl0ZW0sIHgsIHksIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zaXRpb25JbmRpY2F0b3IgPSB0aGlzLl9sYXlvdXRNYW5hZ2VyLnRyYW5zaXRpb25JbmRpY2F0b3I7XHJcbiAgICAgICAgICAgIGlmICh0cmFuc2l0aW9uSW5kaWNhdG9yID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignRFNPRFNUNjY3NDYnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByb3h5RWxlbWVudCA9IGFjdGlvbi5wcm94eT8uZWxlbWVudDtcclxuICAgICAgICAgICAgICAgIGlmIChwcm94eUVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0RTT0RTVDY2NzQ3Jyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbkluZGljYXRvci50cmFuc2l0aW9uRWxlbWVudHModGhpcy5fZWxlbWVudCwgcHJveHlFbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIG9uRHJhZ1N0b3AoKSB7XHJcbiAgICAgICAgLy8gaWYgKHRoaXMuX2R1bW15R3JvdW5kQ29udGVudEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIC8vICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdEU09EU0RSVTA4MTE2Jyk7XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgdGhpcy5fZHVtbXlHcm91bmRDb250ZW50SXRlbS5fJGRlc3Ryb3lcclxuICAgICAgICAvLyAgICAgdGhpcy5fZHVtbXlHcm91bmRDb250ZW50SXRlbSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgdGhpcy5jcmVhdGVEcmFnTGlzdGVuZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuXHQgKiBDYWxsZWQgYWZ0ZXIgZXZlcnkgZHJhZyBhbmQgd2hlbiB0aGUgZHJhZyBzb3VyY2UgaXMgYmVpbmcgZGlzcG9zZWQgb2YuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuXHQgKi9cclxuXHRwcml2YXRlIHJlbW92ZURyYWdMaXN0ZW5lcigpIHtcclxuXHRcdGlmICh0aGlzLl9kcmFnTGlzdGVuZXIgIT09IG51bGwgKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lci5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lciA9IG51bGw7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIERyYWdTb3VyY2Uge1xyXG4gICAgLyoqIEBkZXByZWNhdGVkICB1c2UgQ29uZmlnIHtAbGluayAoQ29tcG9uZW50SXRlbUNvbmZpZzppbnRlcmZhY2UpfSAqL1xyXG4gICAgZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRJdGVtQ29uZmlnIHtcclxuICAgICAgICB0eXBlOiBKc29uVmFsdWUsXHJcbiAgICAgICAgc3RhdGU/OiBKc29uVmFsdWUsXHJcbiAgICAgICAgdGl0bGU/OiBzdHJpbmcsXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBkZXByZWNhdGVkIHJlbW92ZSBpbiB2ZXJzaW9uIDMgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0RyYWdTb3VyY2VDb21wb25lbnRJdGVtQ29uZmlnKFxyXG4gICAgICAgIGNvbmZpZzogRHJhZ1NvdXJjZS5Db21wb25lbnRJdGVtQ29uZmlnIHwgQ29uZmlnQ29tcG9uZW50SXRlbUNvbmZpZ1xyXG4gICAgKTogY29uZmlnIGlzIERyYWdTb3VyY2UuQ29tcG9uZW50SXRlbUNvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuICEoXCJjb21wb25lbnRUeXBlXCIgaW4gY29uZmlnKTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuLi91dGlscy9kb20tY29uc3RhbnRzJztcclxuaW1wb3J0IHsgQXJlYUxpbmtlZFJlY3QgfSBmcm9tICcuLi91dGlscy90eXBlcyc7XHJcbmltcG9ydCB7IG51bWJlclRvUGl4ZWxzIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgY2xhc3MgRHJvcFRhcmdldEluZGljYXRvciB7XHJcbiAgICBwcml2YXRlIF9lbGVtZW50OiBIVE1MRWxlbWVudDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICAvLyBNYXliZSB1c2UgY29udGFpbmVyIGluc3RlYWQgb2YgRG9jdW1lbnQgQm9keT9cclxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuRHJvcFRhcmdldEluZGljYXRvcik7XHJcbiAgICAgICAgY29uc3QgaW5uZXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgaW5uZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Jbm5lcik7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZChpbm5lckVsZW1lbnQpO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBoaWdobGlnaHRBcmVhKGFyZWE6IEFyZWFMaW5rZWRSZWN0LCBtYXJnaW46IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUubGVmdCA9IG51bWJlclRvUGl4ZWxzKGFyZWEueDEgKyBtYXJnaW4pO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUudG9wID0gbnVtYmVyVG9QaXhlbHMoYXJlYS55MSArIG1hcmdpbik7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS53aWR0aCA9IG51bWJlclRvUGl4ZWxzKGFyZWEueDIgLSBhcmVhLngxIC0gbWFyZ2luIC0gMSk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBudW1iZXJUb1BpeGVscyhhcmVhLnkyIC0gYXJlYS55MSAtIG1hcmdpbiAtIDEpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcclxuICAgIH1cclxuXHJcbiAgICBoaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IEhlYWRlciB9IGZyb20gJy4vaGVhZGVyJztcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIEhlYWRlckJ1dHRvbiB7XHJcbiAgICBwcml2YXRlIF9lbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgX2NsaWNrRXZlbnRMaXN0ZW5lciA9IChldjogTW91c2VFdmVudCkgPT4gdGhpcy5vbkNsaWNrKGV2KTtcclxuICAgIHByaXZhdGUgX3RvdWNoU3RhcnRFdmVudExpc3RlbmVyID0gKGV2OiBUb3VjaEV2ZW50KSA9PiB0aGlzLm9uVG91Y2hTdGFydChldik7XHJcblxyXG4gICAgZ2V0IGVsZW1lbnQoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdGhpcy5fZWxlbWVudDsgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2hlYWRlcjogSGVhZGVyLCBsYWJlbDogc3RyaW5nLCBjc3NDbGFzczogc3RyaW5nLCBwcml2YXRlIF9wdXNoRXZlbnQ6IEhlYWRlckJ1dHRvbi5QdXNoRXZlbnQpIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNzc0NsYXNzKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnRpdGxlID0gbGFiZWw7XHJcbiAgICAgICAgdGhpcy5faGVhZGVyLm9uKCdkZXN0cm95JywgKCkgPT4gdGhpcy5kZXN0cm95KCkpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9jbGlja0V2ZW50TGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl90b3VjaFN0YXJ0RXZlbnRMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgIHRoaXMuX2hlYWRlci5jb250cm9sc0NvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fZWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fY2xpY2tFdmVudExpc3RlbmVyKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl90b3VjaFN0YXJ0RXZlbnRMaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZCh0aGlzLl9lbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uQ2xpY2soZXY6IE1vdXNlRXZlbnQpIHtcclxuICAgICAgICB0aGlzLl9wdXNoRXZlbnQoZXYpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Ub3VjaFN0YXJ0KGV2OiBUb3VjaEV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5fcHVzaEV2ZW50KGV2KTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIEhlYWRlckJ1dHRvbiB7XHJcbiAgICBleHBvcnQgdHlwZSBQdXNoRXZlbnQgPSAodGhpczogdm9pZCwgZXY6IEV2ZW50KSA9PiB2b2lkO1xyXG59XHJcbiIsImltcG9ydCB7IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9jb21wb25lbnQtaXRlbSc7XHJcbmltcG9ydCB7IFN0YWNrIH0gZnJvbSAnLi4vaXRlbXMvc3RhY2snO1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi4vbGF5b3V0LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuLi91dGlscy9kb20tY29uc3RhbnRzJztcclxuaW1wb3J0IHsgRHJhZ0xpc3RlbmVyIH0gZnJvbSAnLi4vdXRpbHMvZHJhZy1saXN0ZW5lcic7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LWVtaXR0ZXInO1xyXG5pbXBvcnQgeyBTaWRlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQgeyBudW1iZXJUb1BpeGVscywgc2V0RWxlbWVudERpc3BsYXlWaXNpYmlsaXR5IH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5pbXBvcnQgeyBIZWFkZXJCdXR0b24gfSBmcm9tICcuL2hlYWRlci1idXR0b24nO1xyXG5pbXBvcnQgeyBUYWIgfSBmcm9tICcuL3RhYic7XHJcbmltcG9ydCB7IFRhYnNDb250YWluZXIgfSBmcm9tICcuL3RhYnMtY29udGFpbmVyJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBoZWFkZXIgYWJvdmUgYSBTdGFjayBDb250ZW50SXRlbS5cclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEhlYWRlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90YWJzQ29udGFpbmVyOiBUYWJzQ29udGFpbmVyO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250cm9sc0NvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3Nob3c6IGJvb2xlYW47XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9wb3BvdXRMYWJlbDogc3RyaW5nO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbWF4aW1pc2VMYWJlbDogc3RyaW5nO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbWluaW1pc2VMYWJlbDogc3RyaW5nO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2xvc2VMYWJlbDogc3RyaW5nO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFiRHJvcGRvd25FbmFibGVkOiBib29sZWFuO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFiRHJvcGRvd25MYWJlbDogc3RyaW5nO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYkNvbnRyb2xPZmZzZXQ6IG51bWJlcjtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jbGlja0xpc3RlbmVyID0gKGV2OiBNb3VzZUV2ZW50KSA9PiB0aGlzLm9uQ2xpY2soZXYpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdG91Y2hTdGFydExpc3RlbmVyID0gKGV2OiBUb3VjaEV2ZW50KSA9PiB0aGlzLm9uVG91Y2hTdGFydChldik7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kb2N1bWVudE1vdXNlVXBMaXN0ZW5lcjogKHRoaXM6IHZvaWQpID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sYXlvdXRTdGF0ZUxpc3RlbmVyID0gKCkgPT4gdGhpcy5vbkxheW91dENoYW5nZWQoKTtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9zaWRlOiBTaWRlO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfbGVmdFJpZ2h0U2lkZWQ6IGJvb2xlYW47XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jbG9zZUJ1dHRvbjogSGVhZGVyQnV0dG9uO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcG9wb3V0QnV0dG9uOiBIZWFkZXJCdXR0b247XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90YWJEcm9wZG93bkJ1dHRvbjogSGVhZGVyQnV0dG9uO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbWF4aW1pc2VCdXR0b246IEhlYWRlckJ1dHRvbjtcclxuICAgIC8vIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIC8vIHByaXZhdGUgX2FjdGl2ZUNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0gfCBudWxsID0gbnVsbDsgLy8gb25seSB1c2VkIHRvIGlkZW50aWZ5IGFjdGl2ZSB0YWJcclxuXHJcbiAgICBnZXQgc2hvdygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3Nob3c7IH1cclxuICAgIGdldCBzaWRlKCk6IFNpZGUgeyByZXR1cm4gdGhpcy5fc2lkZTsgfVxyXG4gICAgZ2V0IGxlZnRSaWdodFNpZGVkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fbGVmdFJpZ2h0U2lkZWQ7IH1cclxuXHJcbiAgICBnZXQgbGF5b3V0TWFuYWdlcigpOiBMYXlvdXRNYW5hZ2VyIHsgcmV0dXJuIHRoaXMuX2xheW91dE1hbmFnZXI7IH1cclxuICAgIGdldCBwYXJlbnQoKTogU3RhY2sgeyByZXR1cm4gdGhpcy5fcGFyZW50OyB9XHJcbiAgICBnZXQgdGFicygpOiBUYWJbXSB7IHJldHVybiB0aGlzLl90YWJzQ29udGFpbmVyLnRhYnM7IH1cclxuICAgIGdldCBsYXN0VmlzaWJsZVRhYkluZGV4KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl90YWJzQ29udGFpbmVyLmxhc3RWaXNpYmxlVGFiSW5kZXg7IH1cclxuXHJcbiAgICBnZXQgZWxlbWVudCgpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLl9lbGVtZW50OyB9XHJcbiAgICBnZXQgdGFic0NvbnRhaW5lckVsZW1lbnQoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdGhpcy5fdGFic0NvbnRhaW5lci5lbGVtZW50OyB9XHJcbiAgICBnZXQgY29udHJvbHNDb250YWluZXJFbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2NvbnRyb2xzQ29udGFpbmVyRWxlbWVudDsgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9sYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9wYXJlbnQ6IFN0YWNrLFxyXG4gICAgICAgIHNldHRpbmdzOiBIZWFkZXIuU2V0dGluZ3MsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2dldEFjdGl2ZUNvbXBvbmVudEl0ZW1FdmVudDogSGVhZGVyLkdldEFjdGl2ZUNvbXBvbmVudEl0ZW1FdmVudCxcclxuICAgICAgICBjbG9zZUV2ZW50OiBIZWFkZXIuQ2xvc2VFdmVudCxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfcG9wb3V0RXZlbnQ6IEhlYWRlci5Qb3BvdXRFdmVudCB8IHVuZGVmaW5lZCxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfbWF4aW1pc2VUb2dnbGVFdmVudDogSGVhZGVyLk1heGltaXNlVG9nZ2xlRXZlbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2NsaWNrRXZlbnQ6IEhlYWRlci5DbGlja0V2ZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF90b3VjaFN0YXJ0RXZlbnQ6IEhlYWRlci5Ub3VjaFN0YXJ0RXZlbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2NvbXBvbmVudFJlbW92ZUV2ZW50OiBIZWFkZXIuQ29tcG9uZW50UmVtb3ZlRXZlbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2NvbXBvbmVudEZvY3VzRXZlbnQ6IEhlYWRlci5Db21wb25lbnRGb2N1c0V2ZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9jb21wb25lbnREcmFnU3RhcnRFdmVudDogSGVhZGVyLkNvbXBvbmVudERyYWdTdGFydEV2ZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdGFic0NvbnRhaW5lciA9IG5ldyBUYWJzQ29udGFpbmVyKHRoaXMuX2xheW91dE1hbmFnZXIsXHJcbiAgICAgICAgICAgIChpdGVtKSA9PiB0aGlzLmhhbmRsZVRhYkluaXRpYXRlZENvbXBvbmVudFJlbW92ZUV2ZW50KGl0ZW0pLFxyXG4gICAgICAgICAgICAoaXRlbSkgPT4gdGhpcy5oYW5kbGVUYWJJbml0aWF0ZWRDb21wb25lbnRGb2N1c0V2ZW50KGl0ZW0pLFxyXG4gICAgICAgICAgICAoeCwgeSwgZHJhZ0xpc3RlbmVyLCBpdGVtKSA9PiB0aGlzLmhhbmRsZVRhYkluaXRpYXRlZERyYWdTdGFydEV2ZW50KHgsIHksIGRyYWdMaXN0ZW5lciwgaXRlbSksXHJcbiAgICAgICAgICAgICgpID0+IHRoaXMucHJvY2Vzc1RhYkRyb3Bkb3duQWN0aXZlQ2hhbmdlZCgpLFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMuX3Nob3cgPSBzZXR0aW5ncy5zaG93O1xyXG4gICAgICAgIHRoaXMuX3BvcG91dExhYmVsID0gc2V0dGluZ3MucG9wb3V0TGFiZWw7XHJcbiAgICAgICAgdGhpcy5fbWF4aW1pc2VMYWJlbCA9IHNldHRpbmdzLm1heGltaXNlTGFiZWw7XHJcbiAgICAgICAgdGhpcy5fbWluaW1pc2VMYWJlbCA9IHNldHRpbmdzLm1pbmltaXNlTGFiZWw7XHJcbiAgICAgICAgdGhpcy5fY2xvc2VMYWJlbCA9IHNldHRpbmdzLmNsb3NlTGFiZWw7XHJcbiAgICAgICAgdGhpcy5fdGFiRHJvcGRvd25FbmFibGVkID0gc2V0dGluZ3MudGFiRHJvcGRvd25FbmFibGVkO1xyXG4gICAgICAgIHRoaXMuX3RhYkRyb3Bkb3duTGFiZWwgPSBzZXR0aW5ncy50YWJEcm9wZG93bkxhYmVsO1xyXG4gICAgICAgIHRoaXMuc2V0U2lkZShzZXR0aW5ncy5zaWRlKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlY3Rpb24nKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5IZWFkZXIpO1xyXG4gICAgICAgIHRoaXMuX2NvbnRyb2xzQ29udGFpbmVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlY3Rpb24nKTtcclxuICAgICAgICB0aGlzLl9jb250cm9sc0NvbnRhaW5lckVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkNvbnRyb2xzKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3RhYnNDb250YWluZXIuZWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9jb250cm9sc0NvbnRhaW5lckVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fdGFic0NvbnRhaW5lci5kcm9wZG93bkVsZW1lbnQpO1xyXG5cclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fY2xpY2tMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX3RvdWNoU3RhcnRMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl9kb2N1bWVudE1vdXNlVXBMaXN0ZW5lciA9ICgpID0+IHRoaXMuX3RhYnNDb250YWluZXIuaGlkZUFkZGl0aW9uYWxUYWJzRHJvcGRvd24oKVxyXG4gICAgICAgIGdsb2JhbFRoaXMuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2RvY3VtZW50TW91c2VVcExpc3RlbmVyLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3RhYkNvbnRyb2xPZmZzZXQgPSB0aGlzLl9sYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5zZXR0aW5ncy50YWJDb250cm9sT2Zmc2V0O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fdGFiRHJvcGRvd25FbmFibGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RhYkRyb3Bkb3duQnV0dG9uID0gbmV3IEhlYWRlckJ1dHRvbih0aGlzLCB0aGlzLl90YWJEcm9wZG93bkxhYmVsLCBEb21Db25zdGFudHMuQ2xhc3NOYW1lLlRhYkRyb3Bkb3duLFxyXG4gICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5fdGFic0NvbnRhaW5lci5zaG93QWRkaXRpb25hbFRhYnNEcm9wZG93bigpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wb3BvdXRCdXR0b24gPSBuZXcgSGVhZGVyQnV0dG9uKHRoaXMsIHRoaXMuX3BvcG91dExhYmVsLCBEb21Db25zdGFudHMuQ2xhc3NOYW1lLlBvcG91dCwgKCkgPT4gdGhpcy5oYW5kbGVCdXR0b25Qb3BvdXRFdmVudCgpKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogTWF4aW1pc2UgY29udHJvbCAtIHNldCB0aGUgY29tcG9uZW50IHRvIHRoZSBmdWxsIHNpemUgb2YgdGhlIGxheW91dFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX21heGltaXNlQnV0dG9uID0gbmV3IEhlYWRlckJ1dHRvbih0aGlzLCB0aGlzLl9tYXhpbWlzZUxhYmVsLCBEb21Db25zdGFudHMuQ2xhc3NOYW1lLk1heGltaXNlLFxyXG4gICAgICAgICAgICAoZXYpID0+IHRoaXMuaGFuZGxlQnV0dG9uTWF4aW1pc2VUb2dnbGVFdmVudChldilcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBDbG9zZSBidXR0b25cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9jbG9zZUJ1dHRvbiA9IG5ldyBIZWFkZXJCdXR0b24odGhpcywgdGhpcy5fY2xvc2VMYWJlbCwgRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5DbG9zZSwgKCkgPT4gY2xvc2VFdmVudCgpKTtcclxuXHJcbiAgICAgICAgdGhpcy5wcm9jZXNzVGFiRHJvcGRvd25BY3RpdmVDaGFuZ2VkKCk7XHJcblxyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKCdzdGF0ZUNoYW5nZWQnLCB0aGlzLl9sYXlvdXRTdGF0ZUxpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoZSBlbnRpcmUgaGVhZGVyXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmVtaXQoJ2Rlc3Ryb3knKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcG9wb3V0RXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fbWF4aW1pc2VUb2dnbGVFdmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl9jbGlja0V2ZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuX3RvdWNoU3RhcnRFdmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRSZW1vdmVFdmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRGb2N1c0V2ZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudERyYWdTdGFydEV2ZW50ID0gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICB0aGlzLl90YWJzQ29udGFpbmVyLmRlc3Ryb3koKTtcclxuXHJcbiAgICAgICAgZ2xvYmFsVGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fZG9jdW1lbnRNb3VzZVVwTGlzdGVuZXIpO1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5yZW1vdmVFdmVudExpc3RlbmVyKCdzdGF0ZUNoYW5nZWQnLCB0aGlzLl9sYXlvdXRTdGF0ZUxpc3RlbmVyKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyB0YWIgYW5kIGFzc29jaWF0ZXMgaXQgd2l0aCBhIGNvbnRlbnRJdGVtXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgcG9zaXRpb24gb2YgdGhlIHRhYlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZVRhYihjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdGFic0NvbnRhaW5lci5jcmVhdGVUYWIoY29tcG9uZW50SXRlbSwgaW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZHMgYSB0YWIgYmFzZWQgb24gdGhlIGNvbnRlbnRJdGVtIGl0cyBhc3NvY2lhdGVkIHdpdGggYW5kIHJlbW92ZXMgaXQuXHJcbiAgICAgKiBDYW5ub3QgcmVtb3ZlIHRhYiBpZiBpdCBoYXMgdGhlIGFjdGl2ZSBDb21wb25lbnRJdGVtXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcmVtb3ZlVGFiKGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl90YWJzQ29udGFpbmVyLnJlbW92ZVRhYihjb21wb25lbnRJdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm9jZXNzQWN0aXZlQ29tcG9uZW50Q2hhbmdlZChuZXdBY3RpdmVDb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdGFic0NvbnRhaW5lci5wcm9jZXNzQWN0aXZlQ29tcG9uZW50Q2hhbmdlZChuZXdBY3RpdmVDb21wb25lbnRJdGVtKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVRhYlNpemVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc2V0U2lkZSh2YWx1ZTogU2lkZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3NpZGUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLl9sZWZ0UmlnaHRTaWRlZCA9IFtTaWRlLnJpZ2h0LCBTaWRlLmxlZnRdLmluY2x1ZGVzKHRoaXMuX3NpZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgaGVhZGVyIGJ1dHRvbnMuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVCdXR0b25zKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGFjdGl2ZUNvbXBvbmVudEl0ZW0gPSB0aGlzLl9nZXRBY3RpdmVDb21wb25lbnRJdGVtRXZlbnQoKTtcclxuICAgICAgICBjb25zdCBpc0xhc3QgPSB0aGlzLl9wYXJlbnQuZmluZEFuY2VzdG9yV2l0aFNpYmxpbmdzKCkgPT09IG51bGw7XHJcbiAgICAgICAgY29uc3QgaXNNYWluID0gdGhpcy5sYXlvdXRNYW5hZ2VyLnBhcmVudCA9PT0gbnVsbDtcclxuICAgICAgICBcclxuICAgICAgICAvLyBDbG9zZSBidXR0b24gaXMgb25seSB2aXNpYmxlIGlmIGFsbCBpdGVtcyBvZiB0aGUgc3RhY2sgYXJlIGNsb3NhYmxlXHJcbiAgICAgICAgLy8gYW5kIHRoZSBhY3RpdmUgY29tcG9uZW50IGhhcyBpdHMgY2xvc2UgYnV0dG9uIHNldCB0byB2aXNpYmxlLiBOb3RlIHRoYXRcclxuICAgICAgICAvLyBoaWRpbmcgdGhlIGNsb3NlIGJ1dHRvbiBpbiBhIGhlYWRlciBvZiBhbiBpdGVtIGlzIG5vdCBlcXVpdmFsZW50IHRvIG1ha2luZ1xyXG4gICAgICAgIC8vIHRoYXQgaXRlbSB1bmNsb3NhYmxlLlxyXG4gICAgICAgIGNvbnN0IGFsbENsb3NhYmxlID0gdGhpcy50YWJzLmV2ZXJ5KHRhYiA9PiB0YWIuY29tcG9uZW50SXRlbS5pc0Nsb3NhYmxlKTtcclxuICAgICAgICBjb25zdCBjbG9zZSA9IGFjdGl2ZUNvbXBvbmVudEl0ZW0/LmhlYWRlckNvbmZpZz8uY2xvc2UgIT09IGZhbHNlO1xyXG4gICAgICAgIHNldEVsZW1lbnREaXNwbGF5VmlzaWJpbGl0eSh0aGlzLl9jbG9zZUJ1dHRvbi5lbGVtZW50LCBhbGxDbG9zYWJsZSAmJiBjbG9zZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gUG9wb3V0IGJ1dHRvbiBpcyB2aXNpYmxlIGlmIHRoZSBhY3RpdmUgY29tcG9uZW50IGlzIGNsb3NhYmxlIGFuZCBoYXMgaXRzIHBvcG91dCBidXR0b24gZW5hYmxlZC5cclxuICAgICAgICAvLyBJZiBwb3BvdXRXaG9sZVN0YWNrID0gdHJ1ZSwgdGhlIGJ1dHRvbiBpcyBvbmx5IHZpc2libGUgaWYgZXZlcnkgaXRlbSBpcyBjbG9zYWJsZS5cclxuICAgICAgICAvLyBBbHNvIHdlIHdhbnQgdG8gcHJldmVudCBwb3BwaW5nIG91dCBpZiB0aGF0IHdvdWxkIGxlYXZlIHVzIHdpdGggYW4gZW1wdHkgbGF5b3V0LlxyXG4gICAgICAgIGxldCBwb3BvdXQgPSBhY3RpdmVDb21wb25lbnRJdGVtPy5oZWFkZXJDb25maWc/LnBvcG91dCAhPT0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuX2xheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLnNldHRpbmdzLnBvcG91dFdob2xlU3RhY2spIHtcclxuICAgICAgICAgICAgcG9wb3V0ICYmPSAoIWlzTGFzdCB8fCBpc01haW4pICYmIGFsbENsb3NhYmxlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsb3NhYmxlID0gYWN0aXZlQ29tcG9uZW50SXRlbT8uaXNDbG9zYWJsZSAhPT0gZmFsc2U7XHJcbiAgICAgICAgICAgIHBvcG91dCAmJj0gKCFpc0xhc3QgfHwgdGhpcy50YWJzLmxlbmd0aCA+IDEgfHwgaXNNYWluKSAmJiBjbG9zYWJsZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0RWxlbWVudERpc3BsYXlWaXNpYmlsaXR5KHRoaXMuX3BvcG91dEJ1dHRvbi5lbGVtZW50LCBwb3BvdXQpO1xyXG5cclxuICAgICAgICAvLyBNYXhpbWl6ZSBidXR0b24gaXMgdmlzaWJsZSBpZiB0aGUgYWN0aXZlIGNvbXBvbmVudCBoYXMgaXRzIG1heGltaXplIGJ1dHRvbiBlbmFibGVkIG9yIHRoZSBzdGFjayBpcyBhbHJlYWR5IG1heGltaXplZC5cclxuICAgICAgICAvLyBBbHNvIGhpZGUgaXQgaWYgc3RhY2sgaXMgdGhlIGxhc3QgaXRlbSBpbiB0aGUgbGF5b3V0LlxyXG4gICAgICAgIGNvbnN0IG1heGltaXplID0gKGFjdGl2ZUNvbXBvbmVudEl0ZW0/LmhlYWRlckNvbmZpZz8ubWF4aW1pc2UgIT09IGZhbHNlIHx8IHRoaXMuX3BhcmVudC5pc01heGltaXNlZCkgJiYgIWlzTGFzdDtcclxuICAgICAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkodGhpcy5fbWF4aW1pc2VCdXR0b24uZWxlbWVudCwgbWF4aW1pemUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGFwcGx5Rm9jdXNlZFZhbHVlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkZvY3VzZWQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShEb21Db25zdGFudHMuQ2xhc3NOYW1lLkZvY3VzZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm9jZXNzTWF4aW1pc2VkKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9tYXhpbWlzZUJ1dHRvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0hQTUFYMTY5OTcnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXhpbWlzZUJ1dHRvbi5lbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCB0aGlzLl9taW5pbWlzZUxhYmVsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJvY2Vzc01pbmltaXNlZCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fbWF4aW1pc2VCdXR0b24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdIUE1JTjE2OTk3Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fbWF4aW1pc2VCdXR0b24uZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgdGhpcy5fbWF4aW1pc2VMYWJlbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHVzaGVzIHRoZSB0YWJzIHRvIHRoZSB0YWIgZHJvcGRvd24gaWYgdGhlIGF2YWlsYWJsZSBzcGFjZSBpcyBub3Qgc3VmZmljaWVudFxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVRhYlNpemVzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl90YWJzQ29udGFpbmVyLnRhYkNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSB0aGlzLl9zaG93ID8gdGhpcy5fbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuZGltZW5zaW9ucy5oZWFkZXJIZWlnaHQgOiAwO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2xlZnRSaWdodFNpZGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmhlaWdodCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS53aWR0aCA9IG51bWJlclRvUGl4ZWxzKGhlYWRlckhlaWdodCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLndpZHRoID0gJyc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmhlaWdodCA9IG51bWJlclRvUGl4ZWxzKGhlYWRlckhlaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGF2YWlsYWJsZVdpZHRoOiBudW1iZXI7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9sZWZ0UmlnaHRTaWRlZCkge1xyXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSB0aGlzLl9lbGVtZW50Lm9mZnNldEhlaWdodCAtIHRoaXMuX2NvbnRyb2xzQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQgLSB0aGlzLl90YWJDb250cm9sT2Zmc2V0O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSB0aGlzLl9lbGVtZW50Lm9mZnNldFdpZHRoIC0gdGhpcy5fY29udHJvbHNDb250YWluZXJFbGVtZW50Lm9mZnNldFdpZHRoIC0gdGhpcy5fdGFiQ29udHJvbE9mZnNldDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fdGFic0NvbnRhaW5lci51cGRhdGVUYWJTaXplcyhhdmFpbGFibGVXaWR0aCwgdGhpcy5fZ2V0QWN0aXZlQ29tcG9uZW50SXRlbUV2ZW50KCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZVRhYkluaXRpYXRlZENvbXBvbmVudFJlbW92ZUV2ZW50KGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICBpZiAodGhpcy5fY29tcG9uZW50UmVtb3ZlRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdISFRDRTIyMjk0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50UmVtb3ZlRXZlbnQoY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlVGFiSW5pdGlhdGVkQ29tcG9uZW50Rm9jdXNFdmVudChjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudEZvY3VzRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdISFRBRTIyMjk0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50Rm9jdXNFdmVudChjb21wb25lbnRJdGVtKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVUYWJJbml0aWF0ZWREcmFnU3RhcnRFdmVudCh4OiBudW1iZXIsIHk6IG51bWJlciwgZHJhZ0xpc3RlbmVyOiBEcmFnTGlzdGVuZXIsIGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICBpZiAodGhpcy5fY29tcG9uZW50RHJhZ1N0YXJ0RXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdISFREU0UyMjI5NCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudERyYWdTdGFydEV2ZW50KHgsIHksIGRyYWdMaXN0ZW5lciwgY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcHJvY2Vzc1RhYkRyb3Bkb3duQWN0aXZlQ2hhbmdlZCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fdGFiRHJvcGRvd25CdXR0b24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkodGhpcy5fdGFiRHJvcGRvd25CdXR0b24uZWxlbWVudCwgdGhpcy5fdGFic0NvbnRhaW5lci5kcm9wZG93bkFjdGl2ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlQnV0dG9uUG9wb3V0RXZlbnQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2xheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLnNldHRpbmdzLnBvcG91dFdob2xlU3RhY2spIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BvcG91dEV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0hIQlBPRTE3ODM0Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wb3BvdXRFdmVudCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgYWN0aXZlQ29tcG9uZW50SXRlbSA9IHRoaXMuX2dldEFjdGl2ZUNvbXBvbmVudEl0ZW1FdmVudCgpO1xyXG4gICAgICAgICAgICBpZiAoYWN0aXZlQ29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgICAgICAgICAgYWN0aXZlQ29tcG9uZW50SXRlbS5wb3BvdXQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBlbHNlOiBpZiB0aGUgc3RhY2sgaXMgZW1wdHkgdGhlcmUgd29uJ3QgYmUgYW4gYWN0aXZlIGl0ZW0gKGFuZCBub3RoaW5nIHRvIHBvcG91dClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVCdXR0b25NYXhpbWlzZVRvZ2dsZUV2ZW50KGV2OiBFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9tYXhpbWlzZVRvZ2dsZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignSEhCTVRFMTY4MzQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXhpbWlzZVRvZ2dsZUV2ZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW52b2tlZCB3aGVuIHRoZSBoZWFkZXIncyBiYWNrZ3JvdW5kIGlzIGNsaWNrZWQgKG5vdCBpdCdzIHRhYnMgb3IgY29udHJvbHMpXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNsaWNrKGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZva2VkIHdoZW4gdGhlIGhlYWRlcidzIGJhY2tncm91bmQgaXMgdG91Y2hlZCAobm90IGl0J3MgdGFicyBvciBjb250cm9scylcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uVG91Y2hTdGFydChldmVudDogVG91Y2hFdmVudCkge1xyXG4gICAgICAgIGlmIChldmVudC50YXJnZXQgPT09IHRoaXMuX2VsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5ub3RpZnlUb3VjaFN0YXJ0KGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBvbkxheW91dENoYW5nZWQoKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVCdXR0b25zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBub3RpZnlDbGljayhldjogTW91c2VFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9jbGlja0V2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignSE5IQzQ2ODM0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY2xpY2tFdmVudChldik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgbm90aWZ5VG91Y2hTdGFydChldjogVG91Y2hFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLl90b3VjaFN0YXJ0RXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdITkhUUzQ2ODM0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fdG91Y2hTdGFydEV2ZW50KGV2KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgSGVhZGVyIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIEdldEFjdGl2ZUNvbXBvbmVudEl0ZW1FdmVudCA9ICh0aGlzOiB2b2lkKSA9PiBDb21wb25lbnRJdGVtIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ2xvc2VFdmVudCA9ICh0aGlzOiB2b2lkKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgUG9wb3V0RXZlbnQgPSAodGhpczogdm9pZCkgPT4gdm9pZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIE1heGltaXNlVG9nZ2xlRXZlbnQgPSAodGhpczogdm9pZCkgPT4gdm9pZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIENsaWNrRXZlbnQgPSAodGhpczogdm9pZCwgZXY6IE1vdXNlRXZlbnQpID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBUb3VjaFN0YXJ0RXZlbnQgPSAodGhpczogdm9pZCwgZXY6IFRvdWNoRXZlbnQpID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnRSZW1vdmVFdmVudCA9ICh0aGlzOiB2b2lkLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ29tcG9uZW50Rm9jdXNFdmVudCA9ICh0aGlzOiB2b2lkLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ29tcG9uZW50RHJhZ1N0YXJ0RXZlbnQgPSAodGhpczogdm9pZCwgeDogbnVtYmVyLCB5OiBudW1iZXIsIGRyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgU3RhdGVDaGFuZ2VkRXZlbnQgPSAodGhpczogdm9pZCkgPT4gdm9pZDtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzIHtcclxuICAgICAgICBzaG93OiBib29sZWFuO1xyXG4gICAgICAgIHNpZGU6IFNpZGU7XHJcbiAgICAgICAgcG9wb3V0RW5hYmxlZDogYm9vbGVhbjtcclxuICAgICAgICBwb3BvdXRMYWJlbDogc3RyaW5nO1xyXG4gICAgICAgIG1heGltaXNlRW5hYmxlZDogYm9vbGVhbjtcclxuICAgICAgICBtYXhpbWlzZUxhYmVsOiBzdHJpbmc7XHJcbiAgICAgICAgbWluaW1pc2VFbmFibGVkOiBib29sZWFuO1xyXG4gICAgICAgIG1pbmltaXNlTGFiZWw6IHN0cmluZztcclxuICAgICAgICBjbG9zZUVuYWJsZWQ6IGJvb2xlYW47XHJcbiAgICAgICAgY2xvc2VMYWJlbDogc3RyaW5nO1xyXG4gICAgICAgIHRhYkRyb3Bkb3duRW5hYmxlZDogYm9vbGVhbjtcclxuICAgICAgICB0YWJEcm9wZG93bkxhYmVsOiBzdHJpbmc7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IERyYWdMaXN0ZW5lciB9IGZyb20gJy4uL3V0aWxzL2RyYWctbGlzdGVuZXInO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9ldmVudC1lbWl0dGVyJztcclxuaW1wb3J0IHsgbnVtYmVyVG9QaXhlbHMgfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBjbGFzcyBTcGxpdHRlciB7XHJcbiAgICBwcml2YXRlIF9ncmFiU2l6ZTtcclxuICAgIHByaXZhdGUgX2RyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyO1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxEaXZFbGVtZW50O1xyXG5cclxuICAgIGdldCBlbGVtZW50KCk6IEhUTUxEaXZFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7IH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9pc1ZlcnRpY2FsOiBib29sZWFuLCBwcml2YXRlIF9zaXplOiBudW1iZXIsIGdyYWJTaXplOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9ncmFiU2l6ZSA9IGdyYWJTaXplIDwgdGhpcy5fc2l6ZSA/IHRoaXMuX3NpemUgOiBncmFiU2l6ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLlNwbGl0dGVyKTtcclxuICAgICAgICBjb25zdCBkcmFnSGFuZGxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGRyYWdIYW5kbGVFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5EcmFnSGFuZGxlKTtcclxuXHJcbiAgICAgICAgY29uc3QgaGFuZGxlRXhjZXNzU2l6ZSA9IHRoaXMuX2dyYWJTaXplIC0gdGhpcy5fc2l6ZTtcclxuICAgICAgICBjb25zdCBoYW5kbGVFeGNlc3NQb3MgPSBoYW5kbGVFeGNlc3NTaXplIC8gMjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2lzVmVydGljYWwpIHtcclxuICAgICAgICAgICAgZHJhZ0hhbmRsZUVsZW1lbnQuc3R5bGUudG9wID0gbnVtYmVyVG9QaXhlbHMoLWhhbmRsZUV4Y2Vzc1Bvcyk7XHJcbiAgICAgICAgICAgIGRyYWdIYW5kbGVFbGVtZW50LnN0eWxlLmhlaWdodCA9IG51bWJlclRvUGl4ZWxzKHRoaXMuX3NpemUgKyBoYW5kbGVFeGNlc3NTaXplKTtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuVmVydGljYWwpO1xyXG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmhlaWdodCA9IG51bWJlclRvUGl4ZWxzKHRoaXMuX3NpemUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRyYWdIYW5kbGVFbGVtZW50LnN0eWxlLmxlZnQgPSBudW1iZXJUb1BpeGVscygtaGFuZGxlRXhjZXNzUG9zKTtcclxuICAgICAgICAgICAgZHJhZ0hhbmRsZUVsZW1lbnQuc3R5bGUud2lkdGggPSBudW1iZXJUb1BpeGVscyh0aGlzLl9zaXplICsgaGFuZGxlRXhjZXNzU2l6ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkhvcml6b250YWwpO1xyXG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLndpZHRoID0gbnVtYmVyVG9QaXhlbHModGhpcy5fc2l6ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKGRyYWdIYW5kbGVFbGVtZW50KTtcclxuXHJcbiAgICAgICAgdGhpcy5fZHJhZ0xpc3RlbmVyID0gbmV3IERyYWdMaXN0ZW5lcih0aGlzLl9lbGVtZW50LCBbZHJhZ0hhbmRsZUVsZW1lbnRdKTtcclxuICAgIH1cclxuXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb248SyBleHRlbmRzIGtleW9mIEV2ZW50RW1pdHRlci5FdmVudFBhcmFtc01hcD4oZXZlbnROYW1lOiBLLCBjYWxsYmFjazogRXZlbnRFbWl0dGVyLkNhbGxiYWNrPEs+KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZHJhZ0xpc3RlbmVyLm9uPEs+KGV2ZW50TmFtZSwgY2FsbGJhY2spO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9jb21wb25lbnQtaXRlbSc7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IERvbUNvbnN0YW50cyB9IGZyb20gJy4uL3V0aWxzL2RvbS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBEcmFnTGlzdGVuZXIgfSBmcm9tICcuLi91dGlscy9kcmFnLWxpc3RlbmVyJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGFuIGluZGl2aWR1YWwgdGFiIHdpdGhpbiBhIFN0YWNrJ3MgaGVhZGVyXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBjbGFzcyBUYWIge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudDogSFRNTERpdkVsZW1lbnQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90aXRsZUVsZW1lbnQ6IEhUTUxTcGFuRWxlbWVudDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Nsb3NlRWxlbWVudDogSFRNTERpdkVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZHJhZ0xpc3RlbmVyOiBEcmFnTGlzdGVuZXIgfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9pc0FjdGl2ZSA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYkNsaWNrTGlzdGVuZXIgPSAoZXY6IE1vdXNlRXZlbnQpID0+IHRoaXMub25UYWJDbGlja0Rvd24oZXYpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFiVG91Y2hTdGFydExpc3RlbmVyID0gKGV2OiBUb3VjaEV2ZW50KSA9PiB0aGlzLm9uVGFiVG91Y2hTdGFydChldik7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jbG9zZUNsaWNrTGlzdGVuZXIgPSAoKSA9PiB0aGlzLm9uQ2xvc2VDbGljaygpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2xvc2VUb3VjaFN0YXJ0TGlzdGVuZXIgPSAoKSA9PiB0aGlzLm9uQ2xvc2VUb3VjaFN0YXJ0KCk7XHJcbiAgICAvLyAvKiogQGludGVybmFsICovXHJcbiAgICAvLyBwcml2YXRlIHJlYWRvbmx5IF9jbG9zZU1vdXNlRG93bkxpc3RlbmVyID0gKCkgPT4gdGhpcy5vbkNsb3NlTW91c2Vkb3duKCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kcmFnU3RhcnRMaXN0ZW5lciA9ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gdGhpcy5vbkRyYWdTdGFydCh4LCB5KTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRlbnRJdGVtRGVzdHJveUxpc3RlbmVyID0gKCkgPT4gdGhpcy5vbkNvbnRlbnRJdGVtRGVzdHJveSgpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFiVGl0bGVDaGFuZ2VkTGlzdGVuZXIgPSAodGl0bGU6IHN0cmluZykgPT4gdGhpcy5zZXRUaXRsZSh0aXRsZSlcclxuXHJcbiAgICBnZXQgaXNBY3RpdmUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9pc0FjdGl2ZTsgfVxyXG4gICAgLy8gZ2V0IGhlYWRlcigpOiBIZWFkZXIgeyByZXR1cm4gdGhpcy5faGVhZGVyOyB9XHJcbiAgICBnZXQgY29tcG9uZW50SXRlbSgpOiBDb21wb25lbnRJdGVtIHsgcmV0dXJuIHRoaXMuX2NvbXBvbmVudEl0ZW07IH1cclxuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChUYWI6Y2xhc3MpLmNvbXBvbmVudEl0ZW19ICovXHJcbiAgICBnZXQgY29udGVudEl0ZW0oKTogQ29tcG9uZW50SXRlbSB7IHJldHVybiB0aGlzLl9jb21wb25lbnRJdGVtOyB9XHJcbiAgICBnZXQgZWxlbWVudCgpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLl9lbGVtZW50OyB9XHJcbiAgICBnZXQgdGl0bGVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX3RpdGxlRWxlbWVudDsgfVxyXG4gICAgZ2V0IGNsb3NlRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9jbG9zZUVsZW1lbnQ7IH1cclxuICAgIGdldCByZW9yZGVyRW5hYmxlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2RyYWdMaXN0ZW5lciAhPT0gdW5kZWZpbmVkOyB9XHJcbiAgICBzZXQgcmVvcmRlckVuYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAodmFsdWUgIT09IHRoaXMucmVvcmRlckVuYWJsZWQpIHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZVJlb3JkZXIoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZVJlb3JkZXIoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlcixcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfY2xvc2VFdmVudDogVGFiLkNsb3NlRXZlbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2ZvY3VzRXZlbnQ6IFRhYi5Gb2N1c0V2ZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9kcmFnU3RhcnRFdmVudDogVGFiLkRyYWdTdGFydEV2ZW50IHwgdW5kZWZpbmVkXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuVGFiKTtcclxuICAgICAgICB0aGlzLl90aXRsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7IFxyXG4gICAgICAgIHRoaXMuX3RpdGxlRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuVGl0bGUpO1xyXG4gICAgICAgIHRoaXMuX2Nsb3NlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBcclxuICAgICAgICB0aGlzLl9jbG9zZUVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkNsb3NlVGFiKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3RpdGxlRWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9jbG9zZUVsZW1lbnQpO1xyXG5cclxuICAgICAgICBpZiAoX2NvbXBvbmVudEl0ZW0uaXNDbG9zYWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jbG9zZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkNsb3NhYmxlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9jbG9zZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0VGl0bGUoX2NvbXBvbmVudEl0ZW0udGl0bGUpO1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudEl0ZW0ub24oJ3RpdGxlQ2hhbmdlZCcsIHRoaXMuX3RhYlRpdGxlQ2hhbmdlZExpc3RlbmVyKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVvcmRlckVuYWJsZWQgPSBfY29tcG9uZW50SXRlbS5yZW9yZGVyRW5hYmxlZCA/PyB0aGlzLl9sYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5zZXR0aW5ncy5yZW9yZGVyRW5hYmxlZDtcclxuXHJcbiAgICAgICAgaWYgKHJlb3JkZXJFbmFibGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlUmVvcmRlcigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX3RhYkNsaWNrTGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl90YWJUb3VjaFN0YXJ0TGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudEl0ZW0uaXNDbG9zYWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jbG9zZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9jbG9zZUNsaWNrTGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgdGhpcy5fY2xvc2VFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl9jbG9zZVRvdWNoU3RhcnRMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAvLyB0aGlzLl9jbG9zZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fY2xvc2VNb3VzZURvd25MaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlRWxlbWVudC5yZW1vdmUoKTtcclxuICAgICAgICAgICAgdGhpcy5fY2xvc2VFbGVtZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5zZXRUYWIodGhpcyk7XHJcbiAgICAgICAgdGhpcy5fbGF5b3V0TWFuYWdlci5lbWl0KCd0YWJDcmVhdGVkJywgdGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB0YWIncyB0aXRsZSB0byB0aGUgcHJvdmlkZWQgc3RyaW5nIGFuZCBzZXRzXHJcbiAgICAgKiBpdHMgdGl0bGUgYXR0cmlidXRlIHRvIGEgcHVyZSB0ZXh0IHJlcHJlc2VudGF0aW9uICh3aXRob3V0XHJcbiAgICAgKiBodG1sIHRhZ3MpIG9mIHRoZSBzYW1lIHN0cmluZy5cclxuICAgICAqL1xyXG4gICAgc2V0VGl0bGUodGl0bGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3RpdGxlRWxlbWVudC5pbm5lclRleHQgPSB0aXRsZTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnRpdGxlID0gdGl0bGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoaXMgdGFiJ3MgYWN0aXZlIHN0YXRlLiBUbyBwcm9ncmFtbWF0aWNhbGx5XHJcbiAgICAgKiBzd2l0Y2ggdGFicywgdXNlIFN0YWNrLnNldEFjdGl2ZUNvbXBvbmVudEl0ZW0oIGl0ZW0gKSBpbnN0ZWFkLlxyXG4gICAgICovXHJcbiAgICBzZXRBY3RpdmUoaXNBY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBpZiAoaXNBY3RpdmUgPT09IHRoaXMuX2lzQWN0aXZlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faXNBY3RpdmUgPSBpc0FjdGl2ZTtcclxuXHJcbiAgICAgICAgaWYgKGlzQWN0aXZlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkFjdGl2ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKERvbUNvbnN0YW50cy5DbGFzc05hbWUuQWN0aXZlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGUgdGFiXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9jbG9zZUV2ZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuX2ZvY3VzRXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fZHJhZ1N0YXJ0RXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX3RhYkNsaWNrTGlzdGVuZXIpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX3RhYlRvdWNoU3RhcnRMaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5fY2xvc2VFbGVtZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2Nsb3NlQ2xpY2tMaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5fY2xvc2VFbGVtZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fY2xvc2VUb3VjaFN0YXJ0TGlzdGVuZXIpO1xyXG4gICAgICAgIC8vIHRoaXMuX2Nsb3NlRWxlbWVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fY2xvc2VNb3VzZURvd25MaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5vZmYoJ3RpdGxlQ2hhbmdlZCcsIHRoaXMuX3RhYlRpdGxlQ2hhbmdlZExpc3RlbmVyKTtcclxuICAgICAgICBpZiAodGhpcy5yZW9yZGVyRW5hYmxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVSZW9yZGVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc2V0Qmx1cnJlZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Gb2N1c2VkKTtcclxuICAgICAgICB0aGlzLl90aXRsZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShEb21Db25zdGFudHMuQ2xhc3NOYW1lLkZvY3VzZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHNldEZvY3VzZWQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuRm9jdXNlZCk7XHJcbiAgICAgICAgdGhpcy5fdGl0bGVFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Gb2N1c2VkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxiYWNrIGZvciB0aGUgRHJhZ0xpc3RlbmVyXHJcbiAgICAgKiBAcGFyYW0geCAtIFRoZSB0YWJzIGFic29sdXRlIHggcG9zaXRpb25cclxuICAgICAqIEBwYXJhbSB5IC0gVGhlIHRhYnMgYWJzb2x1dGUgeSBwb3NpdGlvblxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25EcmFnU3RhcnQoeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fZHJhZ0xpc3RlbmVyID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignVE9EU0RMVTEwMDkzJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RyYWdTdGFydEV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ1RPRFMyMzMwOScpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZHJhZ1N0YXJ0RXZlbnQoeCwgeSwgdGhpcy5fZHJhZ0xpc3RlbmVyLCB0aGlzLmNvbXBvbmVudEl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIG9uQ29udGVudEl0ZW1EZXN0cm95KCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kcmFnTGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgd2hlbiB0aGUgdGFiIGlzIGNsaWNrZWRcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uVGFiQ2xpY2tEb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xyXG4gICAgICAgIGlmICh0YXJnZXQgPT09IHRoaXMuX2VsZW1lbnQgfHwgdGFyZ2V0ID09PSB0aGlzLl90aXRsZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgLy8gbGVmdCBtb3VzZSBidXR0b25cclxuICAgICAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUZvY3VzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gbWlkZGxlIG1vdXNlIGJ1dHRvblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gMSAmJiB0aGlzLl9jb21wb25lbnRJdGVtLmlzQ2xvc2FibGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDbG9zZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgb25UYWJUb3VjaFN0YXJ0KGV2ZW50OiBUb3VjaEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgd2hlbiB0aGUgdGFiJ3MgY2xvc2UgYnV0dG9uIGlzIGNsaWNrZWRcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uQ2xvc2VDbGljaygpIHtcclxuICAgICAgICB0aGlzLm5vdGlmeUNsb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBvbkNsb3NlVG91Y2hTdGFydCgpIHtcclxuICAgICAgICB0aGlzLm5vdGlmeUNsb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayB0byBjYXB0dXJlIHRhYiBjbG9zZSBidXR0b24gbW91c2Vkb3duXHJcbiAgICAgKiB0byBwcmV2ZW50IHRhYiBmcm9tIGFjdGl2YXRpbmcuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgLy8gcHJpdmF0ZSBvbkNsb3NlTW91c2Vkb3duKCk6IHZvaWQge1xyXG4gICAgLy8gICAgIC8vIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgbm90aWZ5Q2xvc2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2Nsb3NlRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdUTkMxNTAwNycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlRXZlbnQodGhpcy5fY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgbm90aWZ5Rm9jdXMoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2ZvY3VzRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdUTkExNTAwNycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzRXZlbnQodGhpcy5fY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZW5hYmxlUmVvcmRlcigpIHtcclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIgPSBuZXcgRHJhZ0xpc3RlbmVyKHRoaXMuX2VsZW1lbnQsIFt0aGlzLl90aXRsZUVsZW1lbnRdKTtcclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIub24oJ2RyYWdTdGFydCcsIHRoaXMuX2RyYWdTdGFydExpc3RlbmVyKTtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRJdGVtLm9uKCdkZXN0cm95JywgdGhpcy5fY29udGVudEl0ZW1EZXN0cm95TGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZGlzYWJsZVJlb3JkZXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RyYWdMaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ1REUjg3NzQ1Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5vZmYoJ2Rlc3Ryb3knLCB0aGlzLl9jb250ZW50SXRlbURlc3Ryb3lMaXN0ZW5lcik7XHJcbiAgICAgICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lci5vZmYoJ2RyYWdTdGFydCcsIHRoaXMuX2RyYWdTdGFydExpc3RlbmVyKTtcclxuICAgICAgICAgICAgdGhpcy5fZHJhZ0xpc3RlbmVyID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBUYWIge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ2xvc2VFdmVudCA9IChjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgRm9jdXNFdmVudCA9IChjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgRHJhZ1N0YXJ0RXZlbnQgPSAoeDogbnVtYmVyLCB5OiBudW1iZXIsIGRyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG59XHJcbiIsImltcG9ydCB7IEFzc2VydEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4uL2l0ZW1zL2NvbXBvbmVudC1pdGVtJztcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IERyYWdMaXN0ZW5lciB9IGZyb20gJy4uL3V0aWxzL2RyYWctbGlzdGVuZXInO1xyXG5pbXBvcnQgeyBudW1iZXJUb1BpeGVscywgcGl4ZWxzVG9OdW1iZXIgfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcbmltcG9ydCB7IFRhYiB9IGZyb20gJy4vdGFiJztcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIFRhYnNDb250YWluZXIge1xyXG4gICAgLy8gVGhlcmUgaXMgb25lIHRhYiBwZXIgQ29tcG9uZW50SXRlbSBpbiBzdGFjay4gIEhvd2V2ZXIgdGhleSBtYXkgbm90IGJlIG9yZGVyZWQgdGhlIHNhbWVcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYnM6IFRhYltdID0gW107XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZHJvcGRvd25FbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgcHJpdmF0ZSBfbGFzdFZpc2libGVUYWJJbmRleCA9IC0xO1xyXG4gICAgcHJpdmF0ZSBfZHJvcGRvd25BY3RpdmUgPSBmYWxzZTtcclxuXHJcbiAgICBnZXQgdGFicygpOiBUYWJbXSB7IHJldHVybiB0aGlzLl90YWJzOyB9XHJcbiAgICBnZXQgdGFiQ291bnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3RhYnMubGVuZ3RoOyB9XHJcbiAgICBnZXQgbGFzdFZpc2libGVUYWJJbmRleCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fbGFzdFZpc2libGVUYWJJbmRleDsgfVxyXG5cclxuICAgIGdldCBlbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7IH1cclxuICAgIGdldCBkcm9wZG93bkVsZW1lbnQoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdGhpcy5fZHJvcGRvd25FbGVtZW50OyB9XHJcbiAgICBnZXQgZHJvcGRvd25BY3RpdmUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9kcm9wZG93bkFjdGl2ZTsgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2xheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXIsXHJcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50UmVtb3ZlRXZlbnQ6IFRhYnNDb250YWluZXIuQ29tcG9uZW50SXRlbVJlbW92ZUV2ZW50LFxyXG4gICAgICAgIHByaXZhdGUgX2NvbXBvbmVudEZvY3VzRXZlbnQ6IFRhYnNDb250YWluZXIuQ29tcG9uZW50SXRlbUZvY3VzRXZlbnQsXHJcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50RHJhZ1N0YXJ0RXZlbnQ6IFRhYnNDb250YWluZXIuQ29tcG9uZW50SXRlbURyYWdTdGFydEV2ZW50LFxyXG4gICAgICAgIHByaXZhdGUgX2Ryb3Bkb3duQWN0aXZlQ2hhbmdlZEV2ZW50OiBUYWJzQ29udGFpbmVyLkRyb3Bkb3duQWN0aXZlQ2hhbmdlZEV2ZW50LFxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlY3Rpb24nKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5UYWJzKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZHJvcGRvd25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VjdGlvbicpO1xyXG4gICAgICAgIHRoaXMuX2Ryb3Bkb3duRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuVGFiRHJvcGRvd25MaXN0KTtcclxuICAgICAgICB0aGlzLl9kcm9wZG93bkVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgIH1cclxuXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fdGFicy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLl90YWJzW2ldLmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHRhYiBhbmQgYXNzb2NpYXRlcyBpdCB3aXRoIGEgY29udGVudEl0ZW1cclxuICAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBwb3NpdGlvbiBvZiB0aGUgdGFiXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZVRhYihjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgLy9JZiB0aGVyZSdzIGFscmVhZHkgYSB0YWIgcmVsYXRpbmcgdG8gdGhlXHJcbiAgICAgICAgLy9jb250ZW50IGl0ZW0sIGRvbid0IGRvIGFueXRoaW5nXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl90YWJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl90YWJzW2ldLmNvbXBvbmVudEl0ZW0gPT09IGNvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdGFiID0gbmV3IFRhYih0aGlzLl9sYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgICAgICBjb21wb25lbnRJdGVtLFxyXG4gICAgICAgICAgICAoaXRlbSkgPT4gdGhpcy5oYW5kbGVUYWJDbG9zZUV2ZW50KGl0ZW0pLFxyXG4gICAgICAgICAgICAoaXRlbSkgPT4gdGhpcy5oYW5kbGVUYWJGb2N1c0V2ZW50KGl0ZW0pLFxyXG4gICAgICAgICAgICAoeCwgeSwgZHJhZ0xpc3RlbmVyLCBpdGVtKSA9PiB0aGlzLmhhbmRsZVRhYkRyYWdTdGFydEV2ZW50KHgsIHksIGRyYWdMaXN0ZW5lciwgaXRlbSkpO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuX3RhYnMubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fdGFicy5zcGxpY2UoaW5kZXgsIDAsIHRhYik7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA8IHRoaXMuX2VsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5pbnNlcnRCZWZvcmUodGFiLmVsZW1lbnQsIHRoaXMuX2VsZW1lbnQuY2hpbGROb2Rlc1tpbmRleF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGFiLmVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVUYWIoY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIC8vIGNvbXBvbmVudEl0ZW0gY2Fubm90IGJlIEFjdGl2ZUNvbXBvbmVudEl0ZW1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3RhYnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3RhYnNbaV0uY29tcG9uZW50SXRlbSA9PT0gY29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFiID0gdGhpcy5fdGFic1tpXTtcclxuICAgICAgICAgICAgICAgIHRhYi5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90YWJzLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb250ZW50SXRlbSBpcyBub3QgY29udHJvbGxlZCBieSB0aGlzIGhlYWRlcicpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb2Nlc3NBY3RpdmVDb21wb25lbnRDaGFuZ2VkKG5ld0FjdGl2ZUNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICBsZXQgYWN0aXZlSW5kZXggPSAtMTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3RhYnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXNBY3RpdmUgPSB0aGlzLl90YWJzW2ldLmNvbXBvbmVudEl0ZW0gPT09IG5ld0FjdGl2ZUNvbXBvbmVudEl0ZW07XHJcbiAgICAgICAgICAgIHRoaXMuX3RhYnNbaV0uc2V0QWN0aXZlKGlzQWN0aXZlKTtcclxuICAgICAgICAgICAgaWYgKGlzQWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICBhY3RpdmVJbmRleCA9IGk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhY3RpdmVJbmRleCA8IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdIU0FDSTU2NjMyJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2xheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLnNldHRpbmdzLnJlb3JkZXJPblRhYk1lbnVDbGljaykge1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBJZiB0aGUgdGFiIHNlbGVjdGVkIHdhcyBpbiB0aGUgZHJvcGRvd24sIG1vdmUgZXZlcnl0aGluZyBkb3duIG9uZSB0byBtYWtlIHdheSBmb3IgdGhpcyBvbmUgdG8gYmUgdGhlIGZpcnN0LlxyXG4gICAgICAgICAgICAgICAgICogVGhpcyB3aWxsIG1ha2Ugc3VyZSB0aGUgbW9zdCB1c2VkIHRhYnMgc3RheSB2aXNpYmxlLlxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbGFzdFZpc2libGVUYWJJbmRleCAhPT0gLTEgJiYgYWN0aXZlSW5kZXggPiB0aGlzLl9sYXN0VmlzaWJsZVRhYkluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlVGFiID0gdGhpcy5fdGFic1thY3RpdmVJbmRleF07XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IGFjdGl2ZUluZGV4OyBqID4gMDsgai0tKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RhYnNbal0gPSB0aGlzLl90YWJzW2ogLSAxXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFic1swXSA9IGFjdGl2ZVRhYjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlVGFiU2l6ZXMgd2lsbCBhbHdheXMgYmUgY2FsbGVkIGFmdGVyIHRoaXMgYW5kIGl0IHdpbGwgcmVwb3NpdGlvbiB0YWIgZWxlbWVudHNcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFB1c2hlcyB0aGUgdGFicyB0byB0aGUgdGFiIGRyb3Bkb3duIGlmIHRoZSBhdmFpbGFibGUgc3BhY2UgaXMgbm90IHN1ZmZpY2llbnRcclxuICAgICAqL1xyXG4gICAgdXBkYXRlVGFiU2l6ZXMoYXZhaWxhYmxlV2lkdGg6IG51bWJlciwgYWN0aXZlQ29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSB8IHVuZGVmaW5lZCk6IHZvaWQge1xyXG4gICAgICAgIGxldCBkcm9wRG93bkFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLnRyeVVwZGF0ZVRhYlNpemVzKGRyb3BEb3duQWN0aXZlLCBhdmFpbGFibGVXaWR0aCwgYWN0aXZlQ29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgaWYgKCFzdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIGRyb3BEb3duQWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGFsd2F5cyBzdWNjZWVkXHJcbiAgICAgICAgICAgIHRoaXMudHJ5VXBkYXRlVGFiU2l6ZXMoZHJvcERvd25BY3RpdmUsIGF2YWlsYWJsZVdpZHRoLCBhY3RpdmVDb21wb25lbnRJdGVtKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5tYXhXaWR0aCA9IG51bWJlclRvUGl4ZWxzKE1hdGgubWF4KDAsIGF2YWlsYWJsZVdpZHRoKSk7XHJcblxyXG4gICAgICAgIGlmIChkcm9wRG93bkFjdGl2ZSAhPT0gdGhpcy5fZHJvcGRvd25BY3RpdmUpIHtcclxuICAgICAgICAgICAgdGhpcy5fZHJvcGRvd25BY3RpdmUgPSBkcm9wRG93bkFjdGl2ZTtcclxuICAgICAgICAgICAgdGhpcy5fZHJvcGRvd25BY3RpdmVDaGFuZ2VkRXZlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5VXBkYXRlVGFiU2l6ZXMoZHJvcGRvd25BY3RpdmU6IGJvb2xlYW4sIGF2YWlsYWJsZVdpZHRoOiBudW1iZXIsIGFjdGl2ZUNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodGhpcy5fdGFicy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGlmIChhY3RpdmVDb21wb25lbnRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm9uLWVtcHR5IHRhYnMgbXVzdCBoYXZlIGFjdGl2ZSBjb21wb25lbnQgaXRlbScpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgY3VtdWxhdGl2ZVRhYldpZHRoID0gMDtcclxuICAgICAgICAgICAgbGV0IHRhYk92ZXJsYXBBbGxvd2FuY2VFeGNlZWRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBjb25zdCB0YWJPdmVybGFwQWxsb3dhbmNlID0gdGhpcy5fbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuc2V0dGluZ3MudGFiT3ZlcmxhcEFsbG93YW5jZTtcclxuICAgICAgICAgICAgY29uc3QgYWN0aXZlSW5kZXggPSB0aGlzLl90YWJzLmluZGV4T2YoYWN0aXZlQ29tcG9uZW50SXRlbS50YWIpO1xyXG4gICAgICAgICAgICBjb25zdCBhY3RpdmVUYWIgPSB0aGlzLl90YWJzW2FjdGl2ZUluZGV4XTtcclxuICAgICAgICAgICAgdGhpcy5fbGFzdFZpc2libGVUYWJJbmRleCA9IC0xO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl90YWJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJFbGVtZW50ID0gdGhpcy5fdGFic1tpXS5lbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgICAgIC8vUHV0IHRoZSB0YWIgaW4gdGhlIHRhYkNvbnRhaW5lciBzbyBpdHMgdHJ1ZSB3aWR0aCBjYW4gYmUgY2hlY2tlZFxyXG4gICAgICAgICAgICAgICAgaWYgKHRhYkVsZW1lbnQucGFyZW50RWxlbWVudCAhPT0gdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGFiRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJNYXJnaW5SaWdodFBpeGVscyA9IGdldENvbXB1dGVkU3R5bGUoYWN0aXZlVGFiLmVsZW1lbnQpLm1hcmdpblJpZ2h0O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFiTWFyZ2luUmlnaHQgPSBwaXhlbHNUb051bWJlcih0YWJNYXJnaW5SaWdodFBpeGVscyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJXaWR0aCA9IHRhYkVsZW1lbnQub2Zmc2V0V2lkdGggKyB0YWJNYXJnaW5SaWdodDtcclxuXHJcbiAgICAgICAgICAgICAgICBjdW11bGF0aXZlVGFiV2lkdGggKz0gdGFiV2lkdGg7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9JbmNsdWRlIHRoZSBhY3RpdmUgdGFiJ3Mgd2lkdGggaWYgaXQgaXNuJ3QgYWxyZWFkeVxyXG4gICAgICAgICAgICAgICAgLy9UaGlzIGlzIHRvIGVuc3VyZSB0aGVyZSBpcyByb29tIHRvIHNob3cgdGhlIGFjdGl2ZSB0YWJcclxuICAgICAgICAgICAgICAgIGxldCB2aXNpYmxlVGFiV2lkdGggPSAwO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZUluZGV4IDw9IGkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2aXNpYmxlVGFiV2lkdGggPSBjdW11bGF0aXZlVGFiV2lkdGg7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZVRhYk1hcmdpblJpZ2h0UGl4ZWxzID0gZ2V0Q29tcHV0ZWRTdHlsZShhY3RpdmVUYWIuZWxlbWVudCkubWFyZ2luUmlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlVGFiTWFyZ2luUmlnaHQgPSBwaXhlbHNUb051bWJlcihhY3RpdmVUYWJNYXJnaW5SaWdodFBpeGVscyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZVRhYldpZHRoID0gY3VtdWxhdGl2ZVRhYldpZHRoICsgYWN0aXZlVGFiLmVsZW1lbnQub2Zmc2V0V2lkdGggKyBhY3RpdmVUYWJNYXJnaW5SaWdodDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdGFicyB3b24ndCBmaXQsIGNoZWNrIHRoZSBvdmVybGFwIGFsbG93YW5jZS5cclxuICAgICAgICAgICAgICAgIGlmICh2aXNpYmxlVGFiV2lkdGggPiBhdmFpbGFibGVXaWR0aCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL09uY2UgYWxsb3dhbmNlIGlzIGV4Y2VlZGVkLCBhbGwgcmVtYWluaW5nIHRhYnMgZ28gdG8gbWVudS5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRhYk92ZXJsYXBBbGxvd2FuY2VFeGNlZWRlZCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9ObyBvdmVybGFwIGZvciBmaXJzdCB0YWIgb3IgYWN0aXZlIHRhYlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL092ZXJsYXAgc3ByZWFkcyBhbW9uZyBub24tYWN0aXZlLCBub24tZmlyc3QgdGFic1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3ZlcmxhcDogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlSW5kZXggPiAwICYmIGFjdGl2ZUluZGV4IDw9IGkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXAgPSAodmlzaWJsZVRhYldpZHRoIC0gYXZhaWxhYmxlV2lkdGgpIC8gKGkgLSAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXAgPSAodmlzaWJsZVRhYldpZHRoIC0gYXZhaWxhYmxlV2lkdGgpIC8gaTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9DaGVjayBvdmVybGFwIGFnYWluc3QgYWxsb3dhbmNlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcmxhcCA8IHRhYk92ZXJsYXBBbGxvd2FuY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDw9IGk7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcmdpbkxlZnQgPSAoaiAhPT0gYWN0aXZlSW5kZXggJiYgaiAhPT0gMCkgPyAnLScgKyBudW1iZXJUb1BpeGVscyhvdmVybGFwKSA6ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RhYnNbal0uZWxlbWVudC5zdHlsZS56SW5kZXggPSBudW1iZXJUb1BpeGVscyhpIC0gaik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFic1tqXS5lbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQgPSBtYXJnaW5MZWZ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFzdFZpc2libGVUYWJJbmRleCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFiRWxlbWVudC5wYXJlbnRFbGVtZW50ICE9PSB0aGlzLl9lbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0YWJFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYk92ZXJsYXBBbGxvd2FuY2VFeGNlZWRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpID09PSBhY3RpdmVJbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0FjdGl2ZSB0YWIgc2hvdWxkIHNob3cgZXZlbiBpZiBhbGxvd2FuY2UgZXhjZWVkZWQuIChXZSBsZWZ0IHJvb20uKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJFbGVtZW50LnN0eWxlLnpJbmRleCA9ICdhdXRvJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFiRWxlbWVudC5zdHlsZS5tYXJnaW5MZWZ0ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJFbGVtZW50LnBhcmVudEVsZW1lbnQgIT09IHRoaXMuX2VsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGFiRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWJPdmVybGFwQWxsb3dhbmNlRXhjZWVkZWQgJiYgaSAhPT0gYWN0aXZlSW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyb3Bkb3duQWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RhYiBtZW51IGFscmVhZHkgc2hvd24sIHNvIHdlIGp1c3QgYWRkIHRvIGl0LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiRWxlbWVudC5zdHlsZS56SW5kZXggPSAnYXV0byc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJFbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQgPSAnJztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFiRWxlbWVudC5wYXJlbnRFbGVtZW50ICE9PSB0aGlzLl9kcm9wZG93bkVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kcm9wZG93bkVsZW1lbnQuYXBwZW5kQ2hpbGQodGFiRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1dlIG5vdyBrbm93IHRoZSB0YWIgbWVudSBtdXN0IGJlIHNob3duLCBzbyB3ZSBoYXZlIHRvIHJlY2FsY3VsYXRlIGV2ZXJ5dGhpbmcuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXN0VmlzaWJsZVRhYkluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICB0YWJFbGVtZW50LnN0eWxlLnpJbmRleCA9ICdhdXRvJztcclxuICAgICAgICAgICAgICAgICAgICB0YWJFbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGFiRWxlbWVudC5wYXJlbnRFbGVtZW50ICE9PSB0aGlzLl9lbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGFiRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3dzIGRyb3AgZG93biBmb3IgYWRkaXRpb25hbCB0YWJzIHdoZW4gdGhlcmUgYXJlIHRvbyBtYW55IHRvIGRpc3BsYXkuXHJcbiAgICAgKi9cclxuICAgIHNob3dBZGRpdGlvbmFsVGFic0Ryb3Bkb3duKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2Ryb3Bkb3duRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIaWRlcyBkcm9wIGRvd24gZm9yIGFkZGl0aW9uYWwgdGFicyB3aGVuIHRoZXJlIGFyZSB0b28gbWFueSB0byBkaXNwbGF5LlxyXG4gICAgICovXHJcbiAgICBoaWRlQWRkaXRpb25hbFRhYnNEcm9wZG93bigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9kcm9wZG93bkVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZVRhYkNsb3NlRXZlbnQoY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudFJlbW92ZUV2ZW50KGNvbXBvbmVudEl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlVGFiRm9jdXNFdmVudChjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50Rm9jdXNFdmVudChjb21wb25lbnRJdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZVRhYkRyYWdTdGFydEV2ZW50KHg6IG51bWJlciwgeTogbnVtYmVyLCBkcmFnTGlzdGVuZXI6IERyYWdMaXN0ZW5lciwgY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudERyYWdTdGFydEV2ZW50KHgsIHksIGRyYWdMaXN0ZW5lciwgY29tcG9uZW50SXRlbSk7XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgVGFic0NvbnRhaW5lciB7XHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnRJdGVtUmVtb3ZlRXZlbnQgPSAodGhpczogdm9pZCwgY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSkgPT4gdm9pZDtcclxuICAgIGV4cG9ydCB0eXBlIENvbXBvbmVudEl0ZW1Gb2N1c0V2ZW50ID0gKHRoaXM6IHZvaWQsIGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pID0+IHZvaWQ7XHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnRJdGVtRHJhZ1N0YXJ0RXZlbnQgPSAodGhpczogdm9pZCwgeDogbnVtYmVyLCB5OiBudW1iZXIsIGRyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgZXhwb3J0IHR5cGUgRHJvcGRvd25BY3RpdmVDaGFuZ2VkRXZlbnQgPSAodGhpczogdm9pZCkgPT4gdm9pZDtcclxufVxyXG4iLCJpbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuLi91dGlscy9kb20tY29uc3RhbnRzJztcclxuaW1wb3J0IHsgUmVjdCB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuXHJcbi8qKiBAaW50ZXJuYWwgQGRlcHJlY2F0ZWQgVG8gYmUgcmVtb3ZlZCAqL1xyXG5leHBvcnQgY2xhc3MgVHJhbnNpdGlvbkluZGljYXRvciB7XHJcbiAgICBwcml2YXRlIF9lbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgX3RvRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsO1xyXG4gICAgcHJpdmF0ZSBfZnJvbURpbWVuc2lvbnM6IG51bGw7XHJcbiAgICBwcml2YXRlIF90b3RhbEFuaW1hdGlvbkR1cmF0aW9uOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9hbmltYXRpb25TdGFydFRpbWU6IG51bWJlciB8IG51bGw7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLlRyYW5zaXRpb25JbmRpY2F0b3IpO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5fZWxlbWVudCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3RvRWxlbWVudCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZnJvbURpbWVuc2lvbnMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3RvdGFsQW5pbWF0aW9uRHVyYXRpb24gPSAyMDA7XHJcbiAgICAgICAgdGhpcy5fYW5pbWF0aW9uU3RhcnRUaW1lID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgdHJhbnNpdGlvbkVsZW1lbnRzKGZyb21FbGVtZW50OiBIVE1MRWxlbWVudCwgdG9FbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRPRE8gLSBUaGlzIGlzIG5vdCBxdWl0ZSBhcyBjb29sIGFzIGV4cGVjdGVkLiBSZXZpZXcuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIC8vIHRoaXMuX3RvRWxlbWVudCA9IHRvRWxlbWVudDtcclxuICAgICAgICAvLyB0aGlzLl9hbmltYXRpb25TdGFydFRpbWUgPSBub3coKTtcclxuICAgICAgICAvLyB0aGlzLl9mcm9tRGltZW5zaW9ucyA9IHRoaXMuX21lYXN1cmUoZnJvbUVsZW1lbnQpO1xyXG4gICAgICAgIC8vIHRoaXMuX2Zyb21EaW1lbnNpb25zLm9wYWNpdHkgPSAwLjg7XHJcbiAgICAgICAgLy8gdGhpcy5fZWxlbWVudC5zaG93KCkuY3NzKHRoaXMuX2Zyb21EaW1lbnNpb25zKTtcclxuICAgICAgICAvLyBhbmltRnJhbWUoZm5CaW5kKHRoaXMuX25leHRBbmltYXRpb25GcmFtZSwgdGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbmV4dEFuaW1hdGlvbkZyYW1lKCk6IHZvaWQge1xyXG4gICAgICAgIC8vIGlmICh0aGlzLl90b0VsZW1lbnQgPT09IG51bGwgfHwgdGhpcy5fZnJvbURpbWVuc2lvbnMgPT09IG51bGwgfHwgdGhpcy5fYW5pbWF0aW9uU3RhcnRUaW1lID09PSBudWxsKSB7XHJcbiAgICAgICAgLy8gICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdUSU5BRlREOTcxMTUnKTtcclxuICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICBjb25zdCB0b0RpbWVuc2lvbnMgPSB0aGlzLm1lYXN1cmUodGhpcy5fdG9FbGVtZW50KTtcclxuICAgICAgICAvLyAgICAgY29uc3QgYW5pbWF0aW9uUHJvZ3Jlc3MgPSAobm93KCkgLSB0aGlzLl9hbmltYXRpb25TdGFydFRpbWUpIC8gdGhpcy5fdG90YWxBbmltYXRpb25EdXJhdGlvbjtcclxuICAgICAgICAvLyAgICAgY29uc3QgY3VycmVudEZyYW1lU3R5bGVzID0ge307XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGNzc1Byb3BlcnR5O1xyXG5cclxuICAgICAgICAvLyAgICAgaWYgKGFuaW1hdGlvblByb2dyZXNzID49IDEpIHtcclxuICAgICAgICAvLyAgICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAvLyAgICAgICAgIHJldHVybjtcclxuICAgICAgICAvLyAgICAgfVxyXG5cclxuICAgICAgICAvLyAgICAgdG9EaW1lbnNpb25zLm9wYWNpdHkgPSAwO1xyXG5cclxuICAgICAgICAvLyAgICAgZm9yIChjb25zdCBjc3NQcm9wZXJ0eSBpbiB0aGlzLl9mcm9tRGltZW5zaW9ucykge1xyXG4gICAgICAgIC8vICAgICAgICAgY3VycmVudEZyYW1lU3R5bGVzW2Nzc1Byb3BlcnR5XSA9IHRoaXMuX2Zyb21EaW1lbnNpb25zW2Nzc1Byb3BlcnR5XSArXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgKHRvRGltZW5zaW9uc1tjc3NQcm9wZXJ0eV0gLSB0aGlzLl9mcm9tRGltZW5zaW9uc1tjc3NQcm9wZXJ0eV0pICpcclxuICAgICAgICAvLyAgICAgICAgICAgICBhbmltYXRpb25Qcm9ncmVzcztcclxuICAgICAgICAvLyAgICAgfVxyXG5cclxuICAgICAgICAvLyAgICAgdGhpcy5fZWxlbWVudC5jc3MoY3VycmVudEZyYW1lU3R5bGVzKTtcclxuICAgICAgICAvLyAgICAgYW5pbUZyYW1lKGZuQmluZCh0aGlzLl9uZXh0QW5pbWF0aW9uRnJhbWUsIHRoaXMpKTtcclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBtZWFzdXJlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogUmVjdCB7XHJcbiAgICAgICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGxlZnQ6IHJlY3QubGVmdCxcclxuICAgICAgICAgICAgdG9wOiByZWN0LnRvcCxcclxuICAgICAgICAgICAgd2lkdGg6IGVsZW1lbnQub2Zmc2V0V2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodDogZWxlbWVudC5vZmZzZXRIZWlnaHQsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG4iLCIvKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRXh0ZXJuYWxFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY2xhc3MgQ29uZmlndXJhdGlvbkVycm9yIGV4dGVuZHMgRXh0ZXJuYWxFcnJvciB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHB1YmxpYyByZWFkb25seSBub2RlPzogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoJ0NvbmZpZ3VyYXRpb24nLCBtZXNzYWdlKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGNsYXNzIFBvcG91dEJsb2NrZWRFcnJvciBleHRlbmRzIEV4dGVybmFsRXJyb3Ige1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoJ1BvcG91dEJsb2NrZWQnLCBtZXNzYWdlKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGNsYXNzIEFwaUVycm9yIGV4dGVuZHMgRXh0ZXJuYWxFcnJvciB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcignQVBJJywgbWVzc2FnZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBjbGFzcyBCaW5kRXJyb3IgZXh0ZW5kcyBFeHRlcm5hbEVycm9yIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKCdCaW5kJywgbWVzc2FnZSk7XHJcbiAgICB9XHJcbn1cclxuIiwiLyoqIEBpbnRlcm5hbCAqL1xyXG5hYnN0cmFjdCBjbGFzcyBJbnRlcm5hbEVycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IodHlwZTogc3RyaW5nLCBjb2RlOiBzdHJpbmcsIG1lc3NhZ2U/OiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcihgJHt0eXBlfTogJHtjb2RlfSR7bWVzc2FnZSA9PT0gdW5kZWZpbmVkID8gJycgOiAnOiAnICsgbWVzc2FnZX1gKVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBjbGFzcyBBc3NlcnRFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IoY29kZTogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoJ0Fzc2VydCcsIGNvZGUsIG1lc3NhZ2UpXHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIFVucmVhY2hhYmxlQ2FzZUVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3Rvcihjb2RlOiBzdHJpbmcsIHZhcmlhYmxlVmFsdWU6IG5ldmVyLCBtZXNzYWdlPzogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoJ1VucmVhY2hhYmxlQ2FzZScsIGNvZGUsIGAke3ZhcmlhYmxlVmFsdWV9JHttZXNzYWdlID09PSB1bmRlZmluZWQgPyAnJyA6ICc6ICcgKyBtZXNzYWdlfWApXHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIFVuZXhwZWN0ZWROdWxsRXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKGNvZGU6IHN0cmluZywgbWVzc2FnZT86IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKCdVbmV4cGVjdGVkTnVsbCcsIGNvZGUsIG1lc3NhZ2UpXHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IoY29kZTogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoJ1VuZXhwZWN0ZWRVbmRlZmluZWQnLCBjb2RlLCBtZXNzYWdlKVxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IExheW91dENvbmZpZyB9IGZyb20gJy4vY29uZmlnL2NvbmZpZyc7XHJcbmltcG9ydCB7IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyB9IGZyb20gJy4vY29uZmlnL3Jlc29sdmVkLWNvbmZpZyc7XHJcbmltcG9ydCB7IENvbXBvbmVudENvbnRhaW5lciB9IGZyb20gJy4vY29udGFpbmVyL2NvbXBvbmVudC1jb250YWluZXInO1xyXG5pbXBvcnQgeyBBcGlFcnJvciwgQmluZEVycm9yIH0gZnJvbSAnLi9lcnJvcnMvZXh0ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBBc3NlcnRFcnJvciwgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yIH0gZnJvbSAnLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBJMThuU3RyaW5nSWQsIGkxOG5TdHJpbmdzIH0gZnJvbSAnLi91dGlscy9pMThuLXN0cmluZ3MnO1xyXG5pbXBvcnQgeyBKc29uVmFsdWUsIExvZ2ljYWxaSW5kZXggfSBmcm9tICcuL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHsgZGVlcEV4dGVuZFZhbHVlLCBlbnN1cmVFbGVtZW50UG9zaXRpb25BYnNvbHV0ZSwgbnVtYmVyVG9QaXhlbHMsIHNldEVsZW1lbnREaXNwbGF5VmlzaWJpbGl0eSwgc2V0RWxlbWVudEhlaWdodCwgc2V0RWxlbWVudFdpZHRoIH0gZnJvbSAnLi91dGlscy91dGlscyc7XHJcbmltcG9ydCB7IFZpcnR1YWxMYXlvdXQgfSBmcm9tICcuL3ZpcnR1YWwtbGF5b3V0JztcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBjbGFzcyBHb2xkZW5MYXlvdXQgZXh0ZW5kcyBWaXJ0dWFsTGF5b3V0IHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2NvbXBvbmVudFR5cGVzTWFwID0gbmV3IE1hcDxzdHJpbmcsIEdvbGRlbkxheW91dC5Db21wb25lbnRJbnN0YW50aWF0b3I+KCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9nZXRDb21wb25lbnRDb25zdHJ1Y3RvckZ0bjogR29sZGVuTGF5b3V0LkdldENvbXBvbmVudENvbnN0cnVjdG9yQ2FsbGJhY2s7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfcmVnaXN0ZXJlZENvbXBvbmVudE1hcCA9IG5ldyBNYXA8Q29tcG9uZW50Q29udGFpbmVyLCBDb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50PigpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfdmlydHVhYmxlQ29tcG9uZW50TWFwID0gbmV3IE1hcDxDb21wb25lbnRDb250YWluZXIsIEdvbGRlbkxheW91dC5WaXJ0dWFibGVDb21wb25lbnQ+KCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9nb2xkZW5MYXlvdXRCb3VuZGluZ0NsaWVudFJlY3Q6IERPTVJlY3Q7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfY29udGFpbmVyVmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50TGlzdGVuZXIgPVxyXG4gICAgICAgIChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpID0+IHRoaXMuaGFuZGxlQ29udGFpbmVyVmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50KGNvbnRhaW5lciwgd2lkdGgsIGhlaWdodCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9jb250YWluZXJWaXJ0dWFsVmlzaWJpbGl0eUNoYW5nZVJlcXVpcmVkRXZlbnRMaXN0ZW5lciA9XHJcbiAgICAgICAgKGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCB2aXNpYmxlOiBib29sZWFuKSA9PiB0aGlzLmhhbmRsZUNvbnRhaW5lclZpcnR1YWxWaXNpYmlsaXR5Q2hhbmdlUmVxdWlyZWRFdmVudChjb250YWluZXIsIHZpc2libGUpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfY29udGFpbmVyVmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkRXZlbnRMaXN0ZW5lciA9XHJcbiAgICAgICAgKGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCBsb2dpY2FsWkluZGV4OiBMb2dpY2FsWkluZGV4LCBkZWZhdWx0WkluZGV4OiBzdHJpbmcpID0+XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQ29udGFpbmVyVmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkRXZlbnQoY29udGFpbmVyLCBsb2dpY2FsWkluZGV4LCBkZWZhdWx0WkluZGV4KTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSBjb250YWluZXIgLSBBIERvbSBIVE1MIGVsZW1lbnQuIERlZmF1bHRzIHRvIGJvZHlcclxuICAgICAqIEBwYXJhbSBiaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIC0gRXZlbnQgaGFuZGxlciB0byBiaW5kIGNvbXBvbmVudHNcclxuICAgICAqIEBwYXJhbSBiaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIC0gRXZlbnQgaGFuZGxlciB0byB1bmJpbmQgY29tcG9uZW50c1xyXG4gICAgICogSWYgYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciBpcyBkZWZpbmVkLCB0aGVuIGNvbnN0cnVjdG9yIHdpbGwgYmUgZGV0ZXJtaW5hdGUuIEl0IHdpbGwgYWx3YXlzIGNhbGwgdGhlIGluaXQoKVxyXG4gICAgICogZnVuY3Rpb24gYW5kIHRoZSBpbml0KCkgZnVuY3Rpb24gd2lsbCBhbHdheXMgY29tcGxldGUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciB3aWxsIGJlIGNhbGxlZFxyXG4gICAgICogaWYgY29uc3RydWN0b3IgaXMgZm9yIGEgcG9wb3V0IHdpbmRvdy4gTWFrZSBzdXJlIGJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgaXMgcmVhZHkgZm9yIGV2ZW50cy5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgY29udGFpbmVyPzogSFRNTEVsZW1lbnQsXHJcbiAgICAgICAgYmluZENvbXBvbmVudEV2ZW50SGFuZGxlcj86IFZpcnR1YWxMYXlvdXQuQmluZENvbXBvbmVudEV2ZW50SGFuZGxlcixcclxuICAgICAgICB1bmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI/OiBWaXJ0dWFsTGF5b3V0LlVuYmluZENvbXBvbmVudEV2ZW50SGFuZGxlcixcclxuICAgICk7XHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgc3BlY2lmeSBsYXlvdXRDb25maWcgaW4ge0BsaW5rIChMYXlvdXRNYW5hZ2VyOmNsYXNzKS5sb2FkTGF5b3V0fSAqL1xyXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBMYXlvdXRDb25maWcsIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50KTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZ09yT3B0aW9uYWxDb250YWluZXI6IExheW91dENvbmZpZyB8IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIGNvbnRhaW5lck9yQmluZENvbXBvbmVudEV2ZW50SGFuZGxlcj86IEhUTUxFbGVtZW50IHwgVmlydHVhbExheW91dC5CaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyLFxyXG4gICAgICAgIHVuYmluZENvbXBvbmVudEV2ZW50SGFuZGxlcj86IFZpcnR1YWxMYXlvdXQuVW5iaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyLFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoY29uZmlnT3JPcHRpb25hbENvbnRhaW5lciwgY29udGFpbmVyT3JCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyLCB1bmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsIHRydWUpO1xyXG4gICAgICAgIC8vIHdlIHRvbGQgVmlydHVhbExheW91dCB0byBub3QgY2FsbCBpbml0KCkgKHNraXBJbml0IHNldCB0byB0cnVlKSBzbyB0aGF0IEdvbGRlbiBMYXlvdXQgY2FuIGluaXRpYWxpc2UgaXRzIHByb3BlcnRpZXMgYmVmb3JlIGluaXQgaXMgY2FsbGVkXHJcbiAgICAgICAgaWYgKCF0aGlzLmRlcHJlY2F0ZWRDb25zdHJ1Y3Rvcikge1xyXG4gICAgICAgICAgICB0aGlzLmluaXQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWdpc3RlciBhIG5ldyBjb21wb25lbnQgdHlwZSB3aXRoIHRoZSBsYXlvdXQgbWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBTZWUge0BsaW5rIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQwOTIyNTMxL2hvdy10by1jaGVjay1pZi1hLWphdmFzY3JpcHQtZnVuY3Rpb24taXMtYS1jb25zdHJ1Y3Rvcn1cclxuICAgICAqIGluc3RlYWQgdXNlIHtAbGluayAoR29sZGVuTGF5b3V0OmNsYXNzKS5yZWdpc3RlckNvbXBvbmVudENvbnN0cnVjdG9yfVxyXG4gICAgICogb3Ige0BsaW5rIChHb2xkZW5MYXlvdXQ6Y2xhc3MpLnJlZ2lzdGVyQ29tcG9uZW50RmFjdG9yeUZ1bmN0aW9ufVxyXG4gICAgICovXHJcbiAgICByZWdpc3RlckNvbXBvbmVudChuYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgY29tcG9uZW50Q29uc3RydWN0b3JPckZhY3RvcnlGdG46IEdvbGRlbkxheW91dC5Db21wb25lbnRDb25zdHJ1Y3RvciB8IEdvbGRlbkxheW91dC5Db21wb25lbnRGYWN0b3J5RnVuY3Rpb24sXHJcbiAgICAgICAgdmlydHVhbCA9IGZhbHNlXHJcbiAgICApOiB2b2lkIHtcclxuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudENvbnN0cnVjdG9yT3JGYWN0b3J5RnRuICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBcGlFcnJvcigncmVnaXN0ZXJDb21wb25lbnQoKSBjb21wb25lbnRDb25zdHJ1Y3Rvck9yRmFjdG9yeUZ0biBwYXJhbWV0ZXIgaXMgbm90IGEgZnVuY3Rpb24nKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChjb21wb25lbnRDb25zdHJ1Y3Rvck9yRmFjdG9yeUZ0bi5oYXNPd25Qcm9wZXJ0eSgncHJvdG90eXBlJykpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudENvbnN0cnVjdG9yID0gY29tcG9uZW50Q29uc3RydWN0b3JPckZhY3RvcnlGdG4gYXMgR29sZGVuTGF5b3V0LkNvbXBvbmVudENvbnN0cnVjdG9yO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RlckNvbXBvbmVudENvbnN0cnVjdG9yKG5hbWUsIGNvbXBvbmVudENvbnN0cnVjdG9yLCB2aXJ0dWFsKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnlGdG4gPSBjb21wb25lbnRDb25zdHJ1Y3Rvck9yRmFjdG9yeUZ0biBhcyBHb2xkZW5MYXlvdXQuQ29tcG9uZW50RmFjdG9yeUZ1bmN0aW9uO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RlckNvbXBvbmVudEZhY3RvcnlGdW5jdGlvbihuYW1lLCBjb21wb25lbnRGYWN0b3J5RnRuLCB2aXJ0dWFsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVyIGEgbmV3IGNvbXBvbmVudCB0eXBlIHdpdGggdGhlIGxheW91dCBtYW5hZ2VyLlxyXG4gICAgICovXHJcbiAgICByZWdpc3RlckNvbXBvbmVudENvbnN0cnVjdG9yKHR5cGVOYW1lOiBzdHJpbmcsIGNvbXBvbmVudENvbnN0cnVjdG9yOiBHb2xkZW5MYXlvdXQuQ29tcG9uZW50Q29uc3RydWN0b3IsIHZpcnR1YWwgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50Q29uc3RydWN0b3IgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGkxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5QbGVhc2VSZWdpc3RlckFDb25zdHJ1Y3RvckZ1bmN0aW9uXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBleGlzdGluZ0NvbXBvbmVudFR5cGUgPSB0aGlzLl9jb21wb25lbnRUeXBlc01hcC5nZXQodHlwZU5hbWUpO1xyXG5cclxuICAgICAgICBpZiAoZXhpc3RpbmdDb21wb25lbnRUeXBlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEJpbmRFcnJvcihgJHtpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuQ29tcG9uZW50SXNBbHJlYWR5UmVnaXN0ZXJlZF19OiAke3R5cGVOYW1lfWApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50VHlwZXNNYXAuc2V0KHR5cGVOYW1lLCB7XHJcbiAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogY29tcG9uZW50Q29uc3RydWN0b3IsXHJcbiAgICAgICAgICAgICAgICBmYWN0b3J5RnVuY3Rpb246IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIHZpcnR1YWwsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXIgYSBuZXcgY29tcG9uZW50IHdpdGggdGhlIGxheW91dCBtYW5hZ2VyLlxyXG4gICAgICovXHJcbiAgICByZWdpc3RlckNvbXBvbmVudEZhY3RvcnlGdW5jdGlvbih0eXBlTmFtZTogc3RyaW5nLCBjb21wb25lbnRGYWN0b3J5RnVuY3Rpb246IEdvbGRlbkxheW91dC5Db21wb25lbnRGYWN0b3J5RnVuY3Rpb24sIHZpcnR1YWwgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50RmFjdG9yeUZ1bmN0aW9uICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBCaW5kRXJyb3IoJ1BsZWFzZSByZWdpc3RlciBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBleGlzdGluZ0NvbXBvbmVudFR5cGUgPSB0aGlzLl9jb21wb25lbnRUeXBlc01hcC5nZXQodHlwZU5hbWUpO1xyXG5cclxuICAgICAgICBpZiAoZXhpc3RpbmdDb21wb25lbnRUeXBlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEJpbmRFcnJvcihgJHtpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuQ29tcG9uZW50SXNBbHJlYWR5UmVnaXN0ZXJlZF19OiAke3R5cGVOYW1lfWApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50VHlwZXNNYXAuc2V0KHR5cGVOYW1lLCB7XHJcbiAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgZmFjdG9yeUZ1bmN0aW9uOiBjb21wb25lbnRGYWN0b3J5RnVuY3Rpb24sXHJcbiAgICAgICAgICAgICAgICB2aXJ0dWFsLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVyIGEgY29tcG9uZW50IGZ1bmN0aW9uIHdpdGggdGhlIGxheW91dCBtYW5hZ2VyLiBUaGlzIGZ1bmN0aW9uIHNob3VsZFxyXG4gICAgICogcmV0dXJuIGEgY29uc3RydWN0b3IgZm9yIGEgY29tcG9uZW50IGJhc2VkIG9uIGEgY29uZmlnLlxyXG4gICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBpZiBhIGNvbXBvbmVudCB0eXBlIHdpdGggdGhlIHJlcXVpcmVkIG5hbWUgaXMgbm90IGFscmVhZHkgcmVnaXN0ZXJlZC5cclxuICAgICAqIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgYXBwbGljYXRpb25zIHVzZSB0aGUge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS5nZXRDb21wb25lbnRFdmVudH0gYW5kXHJcbiAgICAgKiB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLnJlbGVhc2VDb21wb25lbnRFdmVudH0gaW5zdGVhZCBvZiByZWdpc3RlcmluZyBhIGNvbnN0cnVjdG9yIGNhbGxiYWNrXHJcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChHb2xkZW5MYXlvdXQ6Y2xhc3MpLnJlZ2lzdGVyR2V0Q29tcG9uZW50Q29uc3RydWN0b3JDYWxsYmFja31cclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJDb21wb25lbnRGdW5jdGlvbihjYWxsYmFjazogR29sZGVuTGF5b3V0LkdldENvbXBvbmVudENvbnN0cnVjdG9yQ2FsbGJhY2spOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJlZ2lzdGVyR2V0Q29tcG9uZW50Q29uc3RydWN0b3JDYWxsYmFjayhjYWxsYmFjayk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWdpc3RlciBhIGNhbGxiYWNrIGNsb3N1cmUgd2l0aCB0aGUgbGF5b3V0IG1hbmFnZXIgd2hpY2ggc3VwcGxpZXMgYSBDb21wb25lbnQgQ29uc3RydWN0b3IuXHJcbiAgICAgKiBUaGlzIGNhbGxiYWNrIHNob3VsZCByZXR1cm4gYSBjb25zdHJ1Y3RvciBmb3IgYSBjb21wb25lbnQgYmFzZWQgb24gYSBjb25maWcuXHJcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGlmIGEgY29tcG9uZW50IHR5cGUgd2l0aCB0aGUgcmVxdWlyZWQgbmFtZSBpcyBub3QgYWxyZWFkeSByZWdpc3RlcmVkLlxyXG4gICAgICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBhcHBsaWNhdGlvbnMgdXNlIHRoZSB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLmdldENvbXBvbmVudEV2ZW50fSBhbmRcclxuICAgICAqIHtAbGluayAoVmlydHVhbExheW91dDpjbGFzcykucmVsZWFzZUNvbXBvbmVudEV2ZW50fSBpbnN0ZWFkIG9mIHJlZ2lzdGVyaW5nIGEgY29uc3RydWN0b3IgY2FsbGJhY2tcclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJHZXRDb21wb25lbnRDb25zdHJ1Y3RvckNhbGxiYWNrKGNhbGxiYWNrOiBHb2xkZW5MYXlvdXQuR2V0Q29tcG9uZW50Q29uc3RydWN0b3JDYWxsYmFjayk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcmVnaXN0ZXIgYSBjYWxsYmFjayBmdW5jdGlvbicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2dldENvbXBvbmVudENvbnN0cnVjdG9yRnRuICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdNdWx0aXBsZSBjb21wb25lbnQgZnVuY3Rpb25zIGFyZSBiZWluZyByZWdpc3RlcmVkLiAgT25seSB0aGUgZmluYWwgcmVnaXN0ZXJlZCBmdW5jdGlvbiB3aWxsIGJlIHVzZWQuJylcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2dldENvbXBvbmVudENvbnN0cnVjdG9yRnRuID0gY2FsbGJhY2s7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UmVnaXN0ZXJlZENvbXBvbmVudFR5cGVOYW1lcygpOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgY29uc3QgdHlwZU5hbWVzSXRlcmFibGVJdGVyYXRvciA9IHRoaXMuX2NvbXBvbmVudFR5cGVzTWFwLmtleXMoKTtcclxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0eXBlTmFtZXNJdGVyYWJsZUl0ZXJhdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgY29tcG9uZW50IGluc3RhbnRpYXRvci4gIEF0dGVtcHRzIHRvIHV0aWxpemUgcmVnaXN0ZXJlZFxyXG4gICAgICogY29tcG9uZW50IHR5cGUgYnkgZmlyc3QsIHRoZW4gZmFsbHMgYmFjayB0byB0aGUgY29tcG9uZW50IGNvbnN0cnVjdG9yIGNhbGxiYWNrIGZ1bmN0aW9uIChpZiByZWdpc3RlcmVkKS5cclxuICAgICAqIElmIG5laXRoZXIgZ2V0cyBhbiBpbnN0YW50aWF0b3IsIHRoZW4gcmV0dXJucyBgdW5kZWZpbmVkYC5cclxuICAgICAqIE5vdGUgdGhhdCBgdW5kZWZpbmVkYCB3aWxsIHJldHVybiBpZiBjb25maWcuY29tcG9uZW50VHlwZSBpcyBub3QgYSBzdHJpbmdcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY29uZmlnIC0gVGhlIGl0ZW0gY29uZmlnXHJcbiAgICAgKiBAcHVibGljXHJcbiAgICAgKi9cclxuICAgIGdldENvbXBvbmVudEluc3RhbnRpYXRvcihjb25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyk6IEdvbGRlbkxheW91dC5Db21wb25lbnRJbnN0YW50aWF0b3IgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGxldCBpbnN0YW50aWF0b3I6IEdvbGRlbkxheW91dC5Db21wb25lbnRJbnN0YW50aWF0b3IgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIGNvbnN0IHR5cGVOYW1lID0gUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLnJlc29sdmVDb21wb25lbnRUeXBlTmFtZShjb25maWcpXHJcbiAgICAgICAgaWYgKHR5cGVOYW1lICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaW5zdGFudGlhdG9yID0gdGhpcy5fY29tcG9uZW50VHlwZXNNYXAuZ2V0KHR5cGVOYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGluc3RhbnRpYXRvciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9nZXRDb21wb25lbnRDb25zdHJ1Y3RvckZ0biAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpbnN0YW50aWF0b3IgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3I6IHRoaXMuX2dldENvbXBvbmVudENvbnN0cnVjdG9yRnRuKGNvbmZpZyksXHJcbiAgICAgICAgICAgICAgICAgICAgZmFjdG9yeUZ1bmN0aW9uOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdmlydHVhbDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBpbnN0YW50aWF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgYmluZENvbXBvbmVudChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgaXRlbUNvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKTogQ29tcG9uZW50Q29udGFpbmVyLkJpbmRhYmxlQ29tcG9uZW50IHtcclxuICAgICAgICBsZXQgaW5zdGFudGlhdG9yOiBHb2xkZW5MYXlvdXQuQ29tcG9uZW50SW5zdGFudGlhdG9yIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICBjb25zdCB0eXBlTmFtZSA9IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZy5yZXNvbHZlQ29tcG9uZW50VHlwZU5hbWUoaXRlbUNvbmZpZyk7XHJcbiAgICAgICAgaWYgKHR5cGVOYW1lICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaW5zdGFudGlhdG9yID0gdGhpcy5fY29tcG9uZW50VHlwZXNNYXAuZ2V0KHR5cGVOYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGluc3RhbnRpYXRvciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9nZXRDb21wb25lbnRDb25zdHJ1Y3RvckZ0biAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpbnN0YW50aWF0b3IgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3I6IHRoaXMuX2dldENvbXBvbmVudENvbnN0cnVjdG9yRnRuKGl0ZW1Db25maWcpLFxyXG4gICAgICAgICAgICAgICAgICAgIGZhY3RvcnlGdW5jdGlvbjogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIHZpcnR1YWw6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcmVzdWx0OiBDb21wb25lbnRDb250YWluZXIuQmluZGFibGVDb21wb25lbnQ7XHJcbiAgICAgICAgaWYgKGluc3RhbnRpYXRvciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZpcnR1YWwgPSBpbnN0YW50aWF0b3IudmlydHVhbDtcclxuICAgICAgICAgICAgLy8gaGFuZGxlIGNhc2Ugd2hlcmUgY29tcG9uZW50IGlzIG9idGFpbmVkIGJ5IG5hbWUgb3IgY29tcG9uZW50IGNvbnN0cnVjdG9yIGNhbGxiYWNrXHJcbiAgICAgICAgICAgIGxldCBjb21wb25lbnRTdGF0ZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBpZiAoaXRlbUNvbmZpZy5jb21wb25lbnRTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRTdGF0ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIG1ha2UgY29weVxyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50U3RhdGUgPSBkZWVwRXh0ZW5kVmFsdWUoe30sIGl0ZW1Db25maWcuY29tcG9uZW50U3RhdGUpIGFzIEpzb25WYWx1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGNvbXBvbmVudDogQ29tcG9uZW50Q29udGFpbmVyLkNvbXBvbmVudCB8IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50Q29uc3RydWN0b3IgPSBpbnN0YW50aWF0b3IuY29uc3RydWN0b3I7XHJcbiAgICAgICAgICAgIGlmIChjb21wb25lbnRDb25zdHJ1Y3RvciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBuZXcgY29tcG9uZW50Q29uc3RydWN0b3IoY29udGFpbmVyLCBjb21wb25lbnRTdGF0ZSwgdmlydHVhbCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmYWN0b3J5RnVuY3Rpb24gPSBpbnN0YW50aWF0b3IuZmFjdG9yeUZ1bmN0aW9uO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZhY3RvcnlGdW5jdGlvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50ID0gZmFjdG9yeUZ1bmN0aW9uKGNvbnRhaW5lciwgY29tcG9uZW50U3RhdGUsIHZpcnR1YWwpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNQkNGRlUxMDAwOCcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodmlydHVhbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignR0xCQ1ZDVTk4ODc3NCcpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2aXJ0dWFibGVDb21wb25lbnQgPSBjb21wb25lbnQgYXMgR29sZGVuTGF5b3V0LlZpcnR1YWJsZUNvbXBvbmVudDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRSb290RWxlbWVudCA9IHZpcnR1YWJsZUNvbXBvbmVudC5yb290SHRtbEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFJvb3RFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJpbmRFcnJvcihgJHtpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuVmlydHVhbENvbXBvbmVudERvZXNOb3RIYXZlUm9vdEh0bWxFbGVtZW50XX06ICR7dHlwZU5hbWV9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlRWxlbWVudFBvc2l0aW9uQWJzb2x1dGUoY29tcG9uZW50Um9vdEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChjb21wb25lbnRSb290RWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZpcnR1YWJsZUNvbXBvbmVudE1hcC5zZXQoY29udGFpbmVyLCB2aXJ0dWFibGVDb21wb25lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIudmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50ID0gdGhpcy5fY29udGFpbmVyVmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50TGlzdGVuZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci52aXJ0dWFsVmlzaWJpbGl0eUNoYW5nZVJlcXVpcmVkRXZlbnQgPSB0aGlzLl9jb250YWluZXJWaXJ0dWFsVmlzaWJpbGl0eUNoYW5nZVJlcXVpcmVkRXZlbnRMaXN0ZW5lcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLnZpcnR1YWxaSW5kZXhDaGFuZ2VSZXF1aXJlZEV2ZW50ID0gdGhpcy5fY29udGFpbmVyVmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkRXZlbnRMaXN0ZW5lcjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyZWRDb21wb25lbnRNYXAuc2V0KGNvbnRhaW5lciwgY29tcG9uZW50KTtcclxuXHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgICAgIHZpcnR1YWw6IGluc3RhbnRpYXRvci52aXJ0dWFsLFxyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50LFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBVc2UgZ2V0Q29tcG9uZW50RXZlbnRcclxuICAgICAgICAgICAgcmVzdWx0ID0gc3VwZXIuYmluZENvbXBvbmVudChjb250YWluZXIsIGl0ZW1Db25maWcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSB1bmJpbmRDb21wb25lbnQoY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIHZpcnR1YWw6IGJvb2xlYW4sIGNvbXBvbmVudDogQ29tcG9uZW50Q29udGFpbmVyLkNvbXBvbmVudCB8IHVuZGVmaW5lZCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHJlZ2lzdGVyZWRDb21wb25lbnQgPSB0aGlzLl9yZWdpc3RlcmVkQ29tcG9uZW50TWFwLmdldChjb250YWluZXIpO1xyXG4gICAgICAgIGlmIChyZWdpc3RlcmVkQ29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgc3VwZXIudW5iaW5kQ29tcG9uZW50KGNvbnRhaW5lciwgdmlydHVhbCwgY29tcG9uZW50KTsgLy8gd2FzIG5vdCBjcmVhdGVkIGZyb20gcmVnaXN0cmF0aW9uIHNvIHVzZSB2aXJ0dWFsIHVuYmluZCBldmVudHNcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB2aXJ0dWFibGVDb21wb25lbnQgPSB0aGlzLl92aXJ0dWFibGVDb21wb25lbnRNYXAuZ2V0KGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIGlmICh2aXJ0dWFibGVDb21wb25lbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50Um9vdEVsZW1lbnQgPSB2aXJ0dWFibGVDb21wb25lbnQucm9vdEh0bWxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFJvb3RFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0dMVUM3Nzc0MycsIGNvbnRhaW5lci50aXRsZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNoaWxkKGNvbXBvbmVudFJvb3RFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl92aXJ0dWFibGVDb21wb25lbnRNYXAuZGVsZXRlKGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb3ZlcnJpZGUgZmlyZUJlZm9yZVZpcnR1YWxSZWN0aW5nRXZlbnQoY291bnQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2dvbGRlbkxheW91dEJvdW5kaW5nQ2xpZW50UmVjdCA9IHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIHN1cGVyLmZpcmVCZWZvcmVWaXJ0dWFsUmVjdGluZ0V2ZW50KGNvdW50KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVDb250YWluZXJWaXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQoY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdmlydHVhYmxlQ29tcG9uZW50ID0gdGhpcy5fdmlydHVhYmxlQ29tcG9uZW50TWFwLmdldChjb250YWluZXIpO1xyXG4gICAgICAgIGlmICh2aXJ0dWFibGVDb21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdHTEhDU0NFNTU5MzMnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCByb290RWxlbWVudCA9IHZpcnR1YWJsZUNvbXBvbmVudC5yb290SHRtbEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmIChyb290RWxlbWVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmluZEVycm9yKGkxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5Db21wb25lbnRJc05vdFZpcnR1YWJsZV0gKyAnICcgKyBjb250YWluZXIudGl0bGUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyQm91bmRpbmdDbGllbnRSZWN0ID0gY29udGFpbmVyLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsZWZ0ID0gY29udGFpbmVyQm91bmRpbmdDbGllbnRSZWN0LmxlZnQgLSB0aGlzLl9nb2xkZW5MYXlvdXRCb3VuZGluZ0NsaWVudFJlY3QubGVmdDtcclxuICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50LnN0eWxlLmxlZnQgPSBudW1iZXJUb1BpeGVscyhsZWZ0KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRvcCA9IGNvbnRhaW5lckJvdW5kaW5nQ2xpZW50UmVjdC50b3AgLSB0aGlzLl9nb2xkZW5MYXlvdXRCb3VuZGluZ0NsaWVudFJlY3QudG9wO1xyXG4gICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQuc3R5bGUudG9wID0gbnVtYmVyVG9QaXhlbHModG9wKTtcclxuICAgICAgICAgICAgICAgIHNldEVsZW1lbnRXaWR0aChyb290RWxlbWVudCwgd2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgc2V0RWxlbWVudEhlaWdodChyb290RWxlbWVudCwgaGVpZ2h0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUNvbnRhaW5lclZpcnR1YWxWaXNpYmlsaXR5Q2hhbmdlUmVxdWlyZWRFdmVudChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgdmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHZpcnR1YWJsZUNvbXBvbmVudCA9IHRoaXMuX3ZpcnR1YWJsZUNvbXBvbmVudE1hcC5nZXQoY29udGFpbmVyKTtcclxuICAgICAgICBpZiAodmlydHVhYmxlQ29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignR0xIQ1ZWQ1JFNTU5MzQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCByb290RWxlbWVudCA9IHZpcnR1YWJsZUNvbXBvbmVudC5yb290SHRtbEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmIChyb290RWxlbWVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmluZEVycm9yKGkxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5Db21wb25lbnRJc05vdFZpcnR1YWJsZV0gKyAnICcgKyBjb250YWluZXIudGl0bGUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2V0RWxlbWVudERpc3BsYXlWaXNpYmlsaXR5KHJvb3RFbGVtZW50LCB2aXNpYmxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUNvbnRhaW5lclZpcnR1YWxaSW5kZXhDaGFuZ2VSZXF1aXJlZEV2ZW50KGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCBsb2dpY2FsWkluZGV4OiBMb2dpY2FsWkluZGV4LCBkZWZhdWx0WkluZGV4OiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCB2aXJ0dWFibGVDb21wb25lbnQgPSB0aGlzLl92aXJ0dWFibGVDb21wb25lbnRNYXAuZ2V0KGNvbnRhaW5lcik7XHJcbiAgICAgICAgaWYgKHZpcnR1YWJsZUNvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0dMSENWWklDUkU1NTkzNScpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvb3RFbGVtZW50ID0gdmlydHVhYmxlQ29tcG9uZW50LnJvb3RIdG1sRWxlbWVudDtcclxuICAgICAgICAgICAgaWYgKHJvb3RFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBCaW5kRXJyb3IoaTE4blN0cmluZ3NbSTE4blN0cmluZ0lkLkNvbXBvbmVudElzTm90VmlydHVhYmxlXSArICcgJyArIGNvbnRhaW5lci50aXRsZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByb290RWxlbWVudC5zdHlsZS56SW5kZXggPSBkZWZhdWx0WkluZGV4O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIEdvbGRlbkxheW91dCB7XHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIFZpcnR1YWJsZUNvbXBvbmVudCB7XHJcbiAgICAgICAgcm9vdEh0bWxFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnRDb25zdHJ1Y3RvciA9IG5ldyhjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgc3RhdGU6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCwgdmlydHVhbDogYm9vbGVhbikgPT4gQ29tcG9uZW50Q29udGFpbmVyLkNvbXBvbmVudDtcclxuICAgIGV4cG9ydCB0eXBlIENvbXBvbmVudEZhY3RvcnlGdW5jdGlvbiA9IChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgc3RhdGU6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCwgdmlydHVhbDogYm9vbGVhbikgPT4gQ29tcG9uZW50Q29udGFpbmVyLkNvbXBvbmVudCB8IHVuZGVmaW5lZDtcclxuICAgIGV4cG9ydCB0eXBlIEdldENvbXBvbmVudENvbnN0cnVjdG9yQ2FsbGJhY2sgPSAodGhpczogdm9pZCwgY29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpID0+IENvbXBvbmVudENvbnN0cnVjdG9yO1xyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50SW5zdGFudGlhdG9yIHtcclxuICAgICAgICBjb25zdHJ1Y3RvcjogQ29tcG9uZW50Q29uc3RydWN0b3IgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgZmFjdG9yeUZ1bmN0aW9uOiBDb21wb25lbnRGYWN0b3J5RnVuY3Rpb24gfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgdmlydHVhbDogYm9vbGVhbjtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcsIFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLCBSZXNvbHZlZExheW91dENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9yZXNvbHZlZC1jb25maWcnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRDb250YWluZXIgfSBmcm9tICcuLi9jb250YWluZXIvY29tcG9uZW50LWNvbnRhaW5lcic7XHJcbmltcG9ydCB7IFRhYiB9IGZyb20gJy4uL2NvbnRyb2xzL3RhYic7XHJcbmltcG9ydCB7IFVuZXhwZWN0ZWROdWxsRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi4vbGF5b3V0LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuLi91dGlscy9kb20tY29uc3RhbnRzJztcclxuaW1wb3J0IHsgSXRlbVR5cGUsIEpzb25WYWx1ZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHsgZ2V0RWxlbWVudFdpZHRoQW5kSGVpZ2h0LCBzZXRFbGVtZW50SGVpZ2h0LCBzZXRFbGVtZW50V2lkdGggfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcbmltcG9ydCB7IENvbXBvbmVudFBhcmVudGFibGVJdGVtIH0gZnJvbSAnLi9jb21wb25lbnQtcGFyZW50YWJsZS1pdGVtJztcclxuaW1wb3J0IHsgQ29udGVudEl0ZW0gfSBmcm9tICcuL2NvbnRlbnQtaXRlbSc7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50SXRlbSBleHRlbmRzIENvbnRlbnRJdGVtIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3Jlb3JkZXJFbmFibGVkOiBib29sZWFuO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaGVhZGVyQ29uZmlnOiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIgfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF90aXRsZTogc3RyaW5nO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaW5pdGlhbFdhbnRNYXhpbWlzZTogYm9vbGVhbjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2NvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfdGFiOiBUYWI7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9mb2N1c2VkID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChDb21wb25lbnRJdGVtOmNsYXNzKS5jb21wb25lbnRUeXBlfSAqL1xyXG4gICAgZ2V0IGNvbXBvbmVudE5hbWUoKTogSnNvblZhbHVlIHsgcmV0dXJuIHRoaXMuX2NvbnRhaW5lci5jb21wb25lbnRUeXBlOyB9XHJcbiAgICBnZXQgY29tcG9uZW50VHlwZSgpOiBKc29uVmFsdWUgeyByZXR1cm4gdGhpcy5fY29udGFpbmVyLmNvbXBvbmVudFR5cGU7IH1cclxuICAgIGdldCByZW9yZGVyRW5hYmxlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3Jlb3JkZXJFbmFibGVkOyB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBnZXQgaW5pdGlhbFdhbnRNYXhpbWlzZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2luaXRpYWxXYW50TWF4aW1pc2U7IH1cclxuICAgIGdldCBjb21wb25lbnQoKTogQ29tcG9uZW50Q29udGFpbmVyLkNvbXBvbmVudCB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9jb250YWluZXIuY29tcG9uZW50OyB9XHJcbiAgICBnZXQgY29udGFpbmVyKCk6IENvbXBvbmVudENvbnRhaW5lciB7IHJldHVybiB0aGlzLl9jb250YWluZXI7IH1cclxuICAgIGdldCBwYXJlbnRJdGVtKCk6IENvbXBvbmVudFBhcmVudGFibGVJdGVtIHsgcmV0dXJuIHRoaXMuX3BhcmVudEl0ZW07IH1cclxuXHJcbiAgICBnZXQgaGVhZGVyQ29uZmlnKCk6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlciB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9oZWFkZXJDb25maWc7IH1cclxuICAgIGdldCB0aXRsZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fdGl0bGU7IH1cclxuICAgIGdldCB0YWIoKTogVGFiIHsgcmV0dXJuIHRoaXMuX3RhYjsgfVxyXG4gICAgZ2V0IGZvY3VzZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9mb2N1c2VkOyB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlcixcclxuICAgICAgICBjb25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfcGFyZW50SXRlbTogQ29tcG9uZW50UGFyZW50YWJsZUl0ZW1cclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKGxheW91dE1hbmFnZXIsIGNvbmZpZywgX3BhcmVudEl0ZW0sIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc0NvbXBvbmVudCA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX3Jlb3JkZXJFbmFibGVkID0gY29uZmlnLnJlb3JkZXJFbmFibGVkO1xyXG5cclxuICAgICAgICB0aGlzLmFwcGx5VXBkYXRhYmxlQ29uZmlnKGNvbmZpZyk7XHJcblxyXG4gICAgICAgIHRoaXMuX2luaXRpYWxXYW50TWF4aW1pc2UgPSBjb25maWcubWF4aW1pc2VkO1xyXG5cclxuICAgICAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgY29udGFpbmVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuQ29udGVudCk7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKGNvbnRhaW5lckVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IG5ldyBDb21wb25lbnRDb250YWluZXIoY29uZmlnLCB0aGlzLCBsYXlvdXRNYW5hZ2VyLCBjb250YWluZXJFbGVtZW50LFxyXG4gICAgICAgICAgICAoaXRlbUNvbmZpZykgPT4gdGhpcy5oYW5kbGVVcGRhdGVJdGVtQ29uZmlnRXZlbnQoaXRlbUNvbmZpZyksXHJcbiAgICAgICAgICAgICgpID0+IHRoaXMuc2hvdygpLFxyXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmhpZGUoKSxcclxuICAgICAgICAgICAgKHN1cHByZXNzRXZlbnQpID0+IHRoaXMuZm9jdXMoc3VwcHJlc3NFdmVudCksXHJcbiAgICAgICAgICAgIChzdXBwcmVzc0V2ZW50KSA9PiB0aGlzLmJsdXIoc3VwcHJlc3NFdmVudCksXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5kZXN0cm95KClcclxuICAgICAgICBzdXBlci5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwbHlVcGRhdGFibGVDb25maWcoY29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldFRpdGxlKGNvbmZpZy50aXRsZSk7XHJcbiAgICAgICAgdGhpcy5faGVhZGVyQ29uZmlnID0gY29uZmlnLmhlYWRlcjtcclxuICAgIH1cclxuXHJcbiAgICB0b0NvbmZpZygpOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHN0YXRlUmVxdWVzdEV2ZW50ID0gdGhpcy5fY29udGFpbmVyLnN0YXRlUmVxdWVzdEV2ZW50O1xyXG4gICAgICAgIGNvbnN0IHN0YXRlID0gc3RhdGVSZXF1ZXN0RXZlbnQgPT09IHVuZGVmaW5lZCA/IHRoaXMuX2NvbnRhaW5lci5zdGF0ZSA6IHN0YXRlUmVxdWVzdEV2ZW50KCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5jb21wb25lbnQsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IFtdLFxyXG4gICAgICAgICAgICBzaXplOiB0aGlzLnNpemUsXHJcbiAgICAgICAgICAgIHNpemVVbml0OiB0aGlzLnNpemVVbml0LFxyXG4gICAgICAgICAgICBtaW5TaXplOiB0aGlzLm1pblNpemUsXHJcbiAgICAgICAgICAgIG1pblNpemVVbml0OiB0aGlzLm1pblNpemVVbml0LFxyXG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcclxuICAgICAgICAgICAgbWF4aW1pc2VkOiBmYWxzZSxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogdGhpcy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgICAgICByZW9yZGVyRW5hYmxlZDogdGhpcy5fcmVvcmRlckVuYWJsZWQsXHJcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLl90aXRsZSxcclxuICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIuY3JlYXRlQ29weSh0aGlzLl9oZWFkZXJDb25maWcpLFxyXG4gICAgICAgICAgICBjb21wb25lbnRUeXBlOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcuY29weUNvbXBvbmVudFR5cGUodGhpcy5jb21wb25lbnRUeXBlKSxcclxuICAgICAgICAgICAgY29tcG9uZW50U3RhdGU6IHN0YXRlLFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5wYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0NJQzY4ODgzJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnQucmVtb3ZlQ2hpbGQodGhpcywgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBVc2VkIGJ5IERyYWcgUHJveHlcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGVudGVyRHJhZ01vZGUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBzZXRFbGVtZW50V2lkdGgodGhpcy5lbGVtZW50LCB3aWR0aCk7XHJcbiAgICAgICAgc2V0RWxlbWVudEhlaWdodCh0aGlzLmVsZW1lbnQsIGhlaWdodCk7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmVudGVyRHJhZ01vZGUod2lkdGgsIGhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhpdERyYWdNb2RlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5leGl0RHJhZ01vZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBlbnRlclN0YWNrTWF4aW1pc2VkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5lbnRlclN0YWNrTWF4aW1pc2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhpdFN0YWNrTWF4aW1pc2VkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5leGl0U3RhY2tNYXhpbWlzZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBVc2VkIGJ5IERyYWcgUHJveHlcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGRyYWcoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmRyYWcoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBnZXRPdXRlckJvdW5kaW5nQ2xpZW50UmVjdCgpOiBET01SZWN0IHsgXHJcbiAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBjb25zdCBzaG93ID0gdGhpcy5oZWFkZXJDb25maWc/LnNob3c7XHJcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5kZWZhdWx0cy5oZWFkZXJIZWlnaHQ7XHJcblxyXG4gICAgICAgIGNvbnN0IGhlYWRlcldpZHRoID0gKHNob3cgPT09ICdsZWZ0JyB8fCBzaG93ID09PSAncmlnaHQnKSA/IGhlaWdodCA6IDA7XHJcbiAgICAgICAgY29uc3QgaGVhZGVySGVpZ2h0ID0gKHNob3cgPT09ICd0b3AnIHx8IHNob3cgPT09ICdib3R0b20nIHx8IHNob3cgPT09IHVuZGVmaW5lZCkgPyBoZWlnaHQgOiAwO1xyXG5cclxuICAgICAgICByZXR1cm4gRE9NUmVjdC5mcm9tUmVjdCh7XHJcbiAgICAgICAgICAgIHg6IHJlY3QubGVmdCAtIGhlYWRlcldpZHRoLFxyXG4gICAgICAgICAgICB5OiByZWN0LnRvcCAtIGhlYWRlckhlaWdodCxcclxuICAgICAgICAgICAgd2lkdGg6IHJlY3Qud2lkdGggKyBoZWFkZXJXaWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiByZWN0LmhlaWdodCArIGhlYWRlckhlaWdodCxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSB1cGRhdGVTaXplKGZvcmNlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVOb2RlU2l6ZShmb3JjZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgaW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZU5vZGVTaXplKGZhbHNlKTtcclxuXHJcbiAgICAgICAgc3VwZXIuaW5pdCgpO1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5lbWl0KCdvcGVuJyk7XHJcbiAgICAgICAgdGhpcy5pbml0Q29udGVudEl0ZW1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhpcyBjb21wb25lbnQncyB0aXRsZVxyXG4gICAgICpcclxuICAgICAqIEBwdWJsaWNcclxuICAgICAqIEBwYXJhbSB0aXRsZSAtXHJcbiAgICAgKi9cclxuXHJcbiAgICBzZXRUaXRsZSh0aXRsZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdGl0bGUgPSB0aXRsZTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3RpdGxlQ2hhbmdlZCcsIHRpdGxlKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3N0YXRlQ2hhbmdlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFRhYih0YWI6IFRhYik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3RhYiA9IHRhYjtcclxuICAgICAgICB0aGlzLmVtaXQoJ3RhYicsIHRhYilcclxuICAgICAgICB0aGlzLl9jb250YWluZXIuc2V0VGFiKHRhYik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgaGlkZSgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLnNldFZpc2liaWxpdHkoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG92ZXJyaWRlIHNob3coKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIuc2hvdygpO1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5zZXRWaXNpYmlsaXR5KHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9jdXNlcyB0aGUgaXRlbSBpZiBpdCBpcyBub3QgYWxyZWFkeSBmb2N1c2VkXHJcbiAgICAgKi9cclxuICAgIGZvY3VzKHN1cHByZXNzRXZlbnQgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGFyZW50SXRlbS5zZXRBY3RpdmVDb21wb25lbnRJdGVtKHRoaXMsIHRydWUsIHN1cHByZXNzRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHNldEZvY3VzZWQoc3VwcHJlc3NFdmVudDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2ZvY3VzZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMudGFiLnNldEZvY3VzZWQoKTtcclxuICAgICAgICBpZiAoIXN1cHByZXNzRXZlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ2ZvY3VzJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQmx1cnMgKGRlZm9jdXNlcykgdGhlIGl0ZW0gaWYgaXQgaXMgZm9jdXNlZFxyXG4gICAgICovXHJcbiAgICBibHVyKHN1cHByZXNzRXZlbnQgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9mb2N1c2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5zZXRGb2N1c2VkQ29tcG9uZW50SXRlbSh1bmRlZmluZWQsIHN1cHByZXNzRXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzZXRCbHVycmVkKHN1cHByZXNzRXZlbnQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9mb2N1c2VkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy50YWIuc2V0Qmx1cnJlZCgpO1xyXG4gICAgICAgIGlmICghc3VwcHJlc3NFdmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnYmx1cicpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc2V0UGFyZW50KHBhcmVudDogQ29udGVudEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9wYXJlbnRJdGVtID0gcGFyZW50IGFzIENvbXBvbmVudFBhcmVudGFibGVJdGVtO1xyXG4gICAgICAgIHN1cGVyLnNldFBhcmVudChwYXJlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlVXBkYXRlSXRlbUNvbmZpZ0V2ZW50KGl0ZW1Db25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZykge1xyXG4gICAgICAgIHRoaXMuYXBwbHlVcGRhdGFibGVDb25maWcoaXRlbUNvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVOb2RlU2l6ZShmb3JjZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgIC8vIERvIG5vdCB1cGRhdGUgc2l6ZSBvZiBoaWRkZW4gY29tcG9uZW50cyB0byBwcmV2ZW50IHVud2FudGVkIHJlZmxvd3NcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gZ2V0RWxlbWVudFdpZHRoQW5kSGVpZ2h0KHRoaXMuZWxlbWVudCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5zZXRTaXplVG9Ob2RlU2l6ZSh3aWR0aCwgaGVpZ2h0LCBmb3JjZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChDb21wb25lbnRJdGVtOmNsYXNzKX0gKi9cclxuZXhwb3J0IHR5cGUgQ29tcG9uZW50ID0gQ29tcG9uZW50SXRlbTtcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgQ29tcG9uZW50SXRlbSB7XHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnQgPSBDb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50O1xyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuL2NvbXBvbmVudC1pdGVtJztcclxuaW1wb3J0IHsgQ29udGVudEl0ZW0gfSBmcm9tICcuL2NvbnRlbnQtaXRlbSc7XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50UGFyZW50YWJsZUl0ZW0gZXh0ZW5kcyBDb250ZW50SXRlbSB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9mb2N1c2VkID0gZmFsc2U7XHJcblxyXG4gICAgZ2V0IGZvY3VzZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9mb2N1c2VkOyB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc2V0Rm9jdXNlZFZhbHVlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZm9jdXNlZCA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFic3RyYWN0IHNldEFjdGl2ZUNvbXBvbmVudEl0ZW0oaXRlbTogQ29tcG9uZW50SXRlbSwgZm9jdXM6IGJvb2xlYW4sIHN1cHByZXNzRm9jdXNFdmVudDogYm9vbGVhbik6IHZvaWQ7XHJcbn1cclxuIiwiaW1wb3J0IHsgUmVzb2x2ZWRJdGVtQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL3Jlc29sdmVkLWNvbmZpZydcclxuaW1wb3J0IHsgQnJvd3NlclBvcG91dCB9IGZyb20gJy4uL2NvbnRyb2xzL2Jyb3dzZXItcG9wb3V0J1xyXG5pbXBvcnQgeyBBc3NlcnRFcnJvciwgVW5leHBlY3RlZE51bGxFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcidcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJ1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9ldmVudC1lbWl0dGVyJ1xyXG5pbXBvcnQgeyBBcmVhTGlua2VkUmVjdCwgSXRlbVR5cGUsIFNpemVVbml0RW51bSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJ1xyXG5pbXBvcnQgeyBnZXRVbmlxdWVJZCwgc2V0RWxlbWVudERpc3BsYXlWaXNpYmlsaXR5IH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnXHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuL2NvbXBvbmVudC1pdGVtJ1xyXG5pbXBvcnQgeyBDb21wb25lbnRQYXJlbnRhYmxlSXRlbSB9IGZyb20gJy4vY29tcG9uZW50LXBhcmVudGFibGUtaXRlbSdcclxuaW1wb3J0IHsgU3RhY2sgfSBmcm9tICcuL3N0YWNrJ1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgaXMgdGhlIGJhc2VjbGFzcyB0aGF0IGFsbCBjb250ZW50IGl0ZW1zIGluaGVyaXQgZnJvbS5cclxuICogTW9zdCBtZXRob2RzIHByb3ZpZGUgYSBzdWJzZXQgb2Ygd2hhdCB0aGUgc3ViLWNsYXNzZXMgZG8uXHJcbiAqXHJcbiAqIEl0IGFsc28gcHJvdmlkZXMgYSBudW1iZXIgb2YgZnVuY3Rpb25zIGZvciB0cmVlIHRyYXZlcnNhbFxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbnRlbnRJdGVtIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3R5cGU6IEl0ZW1UeXBlO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaWQ6IHN0cmluZztcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3BvcEluUGFyZW50SWRzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfY29udGVudEl0ZW1zOiBDb250ZW50SXRlbVtdO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaXNDbG9zYWJsZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3BlbmRpbmdFdmVudFByb3BhZ2F0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF90aHJvdHRsZWRFdmVudHM6IHN0cmluZ1tdO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaXNJbml0aWFsaXNlZDtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzaXplOiBudW1iZXI7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzaXplVW5pdDogU2l6ZVVuaXRFbnVtO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgbWluU2l6ZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgbWluU2l6ZVVuaXQ6IFNpemVVbml0RW51bTtcclxuXHJcbiAgICBpc0dyb3VuZDogYm9vbGVhblxyXG4gICAgaXNSb3c6IGJvb2xlYW5cclxuICAgIGlzQ29sdW1uOiBib29sZWFuXHJcbiAgICBpc1N0YWNrOiBib29sZWFuXHJcbiAgICBpc0NvbXBvbmVudDogYm9vbGVhblxyXG5cclxuICAgIGdldCB0eXBlKCk6IEl0ZW1UeXBlIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH1cclxuICAgIGdldCBpZCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5faWQ7IH1cclxuICAgIHNldCBpZCh2YWx1ZTogc3RyaW5nKSB7IHRoaXMuX2lkID0gdmFsdWU7IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGdldCBwb3BJblBhcmVudElkcygpOiBzdHJpbmdbXSB7IHJldHVybiB0aGlzLl9wb3BJblBhcmVudElkczsgfVxyXG4gICAgZ2V0IHBhcmVudCgpOiBDb250ZW50SXRlbSB8IG51bGwgeyByZXR1cm4gdGhpcy5fcGFyZW50OyB9XHJcbiAgICBnZXQgY29udGVudEl0ZW1zKCk6IENvbnRlbnRJdGVtW10geyByZXR1cm4gdGhpcy5fY29udGVudEl0ZW1zOyB9XHJcbiAgICBnZXQgaXNDbG9zYWJsZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2lzQ2xvc2FibGU7IH1cclxuICAgIGdldCBlbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7IH1cclxuICAgIGdldCBpc0luaXRpYWxpc2VkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5faXNJbml0aWFsaXNlZDsgfVxyXG5cclxuICAgIHN0YXRpYyBpc1N0YWNrKGl0ZW06IENvbnRlbnRJdGVtKTogaXRlbSBpcyBTdGFjayB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW0uaXNTdGFjaztcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNDb21wb25lbnRJdGVtKGl0ZW06IENvbnRlbnRJdGVtKTogaXRlbSBpcyBDb21wb25lbnRJdGVtIHtcclxuICAgICAgICByZXR1cm4gaXRlbS5pc0NvbXBvbmVudDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNDb21wb25lbnRQYXJlbnRhYmxlSXRlbShpdGVtOiBDb250ZW50SXRlbSk6IGl0ZW0gaXMgQ29tcG9uZW50UGFyZW50YWJsZUl0ZW0ge1xyXG4gICAgICAgIHJldHVybiBpdGVtLmlzU3RhY2sgfHwgaXRlbS5pc0dyb3VuZDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlcixcclxuICAgICAgICBjb25maWc6IFJlc29sdmVkSXRlbUNvbmZpZyxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfcGFyZW50OiBDb250ZW50SXRlbSB8IG51bGwsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxFbGVtZW50XHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLl90eXBlID0gY29uZmlnLnR5cGU7XHJcbiAgICAgICAgdGhpcy5faWQgPSBjb25maWcuaWQ7XHJcblxyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGlzZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzR3JvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc1JvdyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNDb2x1bW4gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzU3RhY2sgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ29tcG9uZW50ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuc2l6ZSA9IGNvbmZpZy5zaXplO1xyXG4gICAgICAgIHRoaXMuc2l6ZVVuaXQgPSBjb25maWcuc2l6ZVVuaXQ7XHJcbiAgICAgICAgdGhpcy5taW5TaXplID0gY29uZmlnLm1pblNpemU7XHJcbiAgICAgICAgdGhpcy5taW5TaXplVW5pdCA9IGNvbmZpZy5taW5TaXplVW5pdDtcclxuXHJcbiAgICAgICAgdGhpcy5faXNDbG9zYWJsZSA9IGNvbmZpZy5pc0Nsb3NhYmxlO1xyXG5cclxuICAgICAgICB0aGlzLl9wZW5kaW5nRXZlbnRQcm9wYWdhdGlvbnMgPSB7fTtcclxuICAgICAgICB0aGlzLl90aHJvdHRsZWRFdmVudHMgPSBbJ3N0YXRlQ2hhbmdlZCddO1xyXG5cclxuICAgICAgICB0aGlzLl9jb250ZW50SXRlbXMgPSB0aGlzLmNyZWF0ZUNvbnRlbnRJdGVtcyhjb25maWcuY29udGVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVycyB0aGUgc2l6ZSBvZiB0aGUgY29tcG9uZW50IGFuZCBpdHMgY2hpbGRyZW4sIGNhbGxlZCByZWN1cnNpdmVseVxyXG4gICAgICogQHBhcmFtIGZvcmNlIC0gSW4gc29tZSBjYXNlcyB0aGUgc2l6ZSBpcyBub3QgdXBkYXRlZCBpZiBpdCBoYXMgbm90IGNoYW5nZWQuIEluIHRoaXMgY2FzZSwgZXZlbnRzXHJcbiAgICAgKiAoc3VjaCBhcyBDb21wb25lbnRDb250YWluZXIudmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50KSBhcmUgbm90IGZpcmVkLiBTZXR0aW5nIGZvcmNlIHRvIHRydWUsIGVuc3VyZXMgdGhlIHNpemUgaXMgdXBkYXRlZCByZWdhcmRsZXNzLCBhbmRcclxuICAgICAqIHRoZSByZXNwZWN0aXZlIGV2ZW50cyBhcmUgZmlyZWQuIFRoaXMgaXMgc29tZXRpbWVzIG5lY2Vzc2FyeSB3aGVuIGEgY29tcG9uZW50J3Mgc2l6ZSBoYXMgbm90IGNoYW5nZWQgYnV0IGl0IGhhcyBiZWNvbWUgdmlzaWJsZSwgYW5kIHRoZVxyXG4gICAgICogcmVsZXZhbnQgZXZlbnRzIG5lZWQgdG8gYmUgZmlyZWQuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgYWJzdHJhY3QgdXBkYXRlU2l6ZShmb3JjZTogYm9vbGVhbik6IHZvaWQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGEgY2hpbGQgbm9kZSAoYW5kIGl0cyBjaGlsZHJlbikgZnJvbSB0aGUgdHJlZVxyXG4gICAgICogQHBhcmFtIGNvbnRlbnRJdGVtIC0gVGhlIGNoaWxkIGl0ZW0gdG8gcmVtb3ZlXHJcbiAgICAgKiBAcGFyYW0ga2VlcENoaWxkIC0gV2hldGhlciB0byBkZXN0cm95IHRoZSByZW1vdmVkIGl0ZW1cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlQ2hpbGQoY29udGVudEl0ZW06IENvbnRlbnRJdGVtLCBrZWVwQ2hpbGQgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICogR2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlbSB0aGF0J3MgdG8gYmUgcmVtb3ZlZCB3aXRoaW4gYWxsIGNvbnRlbnQgaXRlbXMgdGhpcyBub2RlIGNvbnRhaW5zXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9jb250ZW50SXRlbXMuaW5kZXhPZihjb250ZW50SXRlbSk7XHJcblxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICogTWFrZSBzdXJlIHRoZSBjb250ZW50IGl0ZW0gdG8gYmUgcmVtb3ZlZCBpcyBhY3R1YWxseSBhIGNoaWxkIG9mIHRoaXMgaXRlbVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IHJlbW92ZSBjaGlsZCBpdGVtLiBVbmtub3duIGNvbnRlbnQgaXRlbScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcblx0XHQgKiBDYWxsIGRlc3Ryb3kgb24gdGhlIGNvbnRlbnQgaXRlbS5cclxuXHRcdCAqIEFsbCBjaGlsZHJlbiBhcmUgZGVzdHJveWVkIGFzIHdlbGxcclxuXHRcdCAqL1xyXG4gICAgICAgIGlmICgha2VlcENoaWxkKSB7XHJcblx0XHRcdHRoaXMuX2NvbnRlbnRJdGVtc1tpbmRleF0uZGVzdHJveSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUmVtb3ZlIHRoZSBjb250ZW50IGl0ZW0gZnJvbSB0aGlzIG5vZGVzIGFycmF5IG9mIGNoaWxkcmVuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fY29udGVudEl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIHRoaXMgbm9kZSBzdGlsbCBjb250YWlucyBvdGhlciBjb250ZW50IGl0ZW1zLCBhZGp1c3QgdGhlaXIgc2l6ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0aGlzLl9jb250ZW50SXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBJZiB0aGlzIHdhcyB0aGUgbGFzdCBjb250ZW50IGl0ZW0sIHJlbW92ZSB0aGlzIG5vZGUgYXMgd2VsbFxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgLy8gaWYgKCF0aGlzLmlzR3JvdW5kICYmIHRoaXMuX2lzQ2xvc2FibGUgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzR3JvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcGFyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0NJVUMwMDg3NCcpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHVwIHRoZSB0cmVlIHN0cnVjdHVyZSBmb3IgdGhlIG5ld2x5IGFkZGVkIGNoaWxkXHJcbiAgICAgKiBUaGUgcmVzcG9uc2liaWxpdHkgZm9yIHRoZSBhY3R1YWwgRE9NIG1hbmlwdWxhdGlvbnMgbGllc1xyXG4gICAgICogd2l0aCB0aGUgY29uY3JldGUgaXRlbVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBjb250ZW50SXRlbSAtXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggLSBJZiBvbWl0dGVkIGl0ZW0gd2lsbCBiZSBhcHBlbmRlZFxyXG4gICAgICogQHBhcmFtIHN1c3BlbmRSZXNpemUgLSBVc2VkIGJ5IGRlc2NlbmRlbnQgaW1wbGVtZW50YXRpb25zXHJcbiAgICAgKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIGFkZENoaWxkKGNvbnRlbnRJdGVtOiBDb250ZW50SXRlbSwgaW5kZXg/OiBudW1iZXIgfCBudWxsLCBzdXNwZW5kUmVzaXplPzogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICAgICAgaW5kZXggPz89IHRoaXMuX2NvbnRlbnRJdGVtcy5sZW5ndGg7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbnRlbnRJdGVtcy5zcGxpY2UoaW5kZXgsIDAsIGNvbnRlbnRJdGVtKTtcclxuICAgICAgICBjb250ZW50SXRlbS5zZXRQYXJlbnQodGhpcyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9pc0luaXRpYWxpc2VkID09PSB0cnVlICYmIGNvbnRlbnRJdGVtLl9pc0luaXRpYWxpc2VkID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBjb250ZW50SXRlbS5pbml0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXBsYWNlcyBvbGRDaGlsZCB3aXRoIG5ld0NoaWxkXHJcbiAgICAgKiBAcGFyYW0gb2xkQ2hpbGQgLVxyXG4gICAgICogQHBhcmFtIG5ld0NoaWxkIC1cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICByZXBsYWNlQ2hpbGQob2xkQ2hpbGQ6IENvbnRlbnRJdGVtLCBuZXdDaGlsZDogQ29udGVudEl0ZW0sIGRlc3Ryb3lPbGRDaGlsZCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgLy8gRG8gbm90IHRyeSB0byByZXBsYWNlIENvbXBvbmVudEl0ZW0gLSB3aWxsIG5vdCB3b3JrXHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9jb250ZW50SXRlbXMuaW5kZXhPZihvbGRDaGlsZCk7XHJcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IG9sZENoaWxkLl9lbGVtZW50LnBhcmVudE5vZGU7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdDSVJDSTIzMjMyJywgJ0NhblxcJ3QgcmVwbGFjZSBjaGlsZC4gb2xkQ2hpbGQgaXMgbm90IGNoaWxkIG9mIHRoaXMnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwYXJlbnROb2RlID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdDSVJDUDIzMjMyJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobmV3Q2hpbGQuX2VsZW1lbnQsIG9sZENoaWxkLl9lbGVtZW50KTtcclxuXHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICogT3B0aW9uYWxseSBkZXN0cm95IHRoZSBvbGQgY29udGVudCBpdGVtXHJcbiAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGlmIChkZXN0cm95T2xkQ2hpbGQgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIG9sZENoaWxkLl9wYXJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgb2xkQ2hpbGQuZGVzdHJveSgpOyAvLyB3aWxsIG5vdyBhbHNvIGRlc3Ryb3kgYWxsIGNoaWxkcmVuIG9mIG9sZENoaWxkXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICogV2lyZSB0aGUgbmV3IGNvbnRlbnRJdGVtIGludG8gdGhlIHRyZWVcclxuICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgdGhpcy5fY29udGVudEl0ZW1zW2luZGV4XSA9IG5ld0NoaWxkO1xyXG4gICAgICAgICAgICBuZXdDaGlsZC5zZXRQYXJlbnQodGhpcyk7XHJcbiAgICAgICAgICAgIC8vIG5ld0NoaWxkIGluaGVyaXRzIHRoZSBzaXplcyBmcm9tIHRoZSBvbGQgY2hpbGQ6XHJcbiAgICAgICAgICAgIG5ld0NoaWxkLnNpemUgPSBvbGRDaGlsZC5zaXplO1xyXG4gICAgICAgICAgICBuZXdDaGlsZC5zaXplVW5pdCA9IG9sZENoaWxkLnNpemVVbml0O1xyXG4gICAgICAgICAgICBuZXdDaGlsZC5taW5TaXplID0gb2xkQ2hpbGQubWluU2l6ZTtcclxuICAgICAgICAgICAgbmV3Q2hpbGQubWluU2l6ZVVuaXQgPSBvbGRDaGlsZC5taW5TaXplVW5pdDtcclxuXHJcbiAgICAgICAgICAgIC8vVE9ETyBUaGlzIGRvZXNuJ3QgdXBkYXRlIHRoZSBjb25maWcuLi4gcmVmYWN0b3IgdG8gbGVhdmUgaXRlbSBub2RlcyB1bnRvdWNoZWQgYWZ0ZXIgY3JlYXRpb25cclxuICAgICAgICAgICAgaWYgKG5ld0NoaWxkLl9wYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdDSVJDTkM0NTY5OScpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKG5ld0NoaWxkLl9wYXJlbnQuX2lzSW5pdGlhbGlzZWQgPT09IHRydWUgJiYgbmV3Q2hpbGQuX2lzSW5pdGlhbGlzZWQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3Q2hpbGQuaW5pdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QuXHJcbiAgICAgKiBTaG9ydGhhbmQgZm9yIHRoaXMucGFyZW50LnJlbW92ZUNoaWxkKCB0aGlzIClcclxuICAgICAqL1xyXG4gICAgcmVtb3ZlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9wYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0NJUjExMTEwJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgdGhlIGNvbXBvbmVudCBmcm9tIHRoZSBsYXlvdXQgYW5kIGNyZWF0ZXMgYSBuZXdcclxuICAgICAqIGJyb3dzZXIgd2luZG93IHdpdGggdGhlIGNvbXBvbmVudCBhbmQgaXRzIGNoaWxkcmVuIGluc2lkZVxyXG4gICAgICovXHJcbiAgICBwb3BvdXQoKTogQnJvd3NlclBvcG91dCB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50SWQgPSBnZXRVbmlxdWVJZCgpO1xyXG4gICAgICAgIGNvbnN0IGJyb3dzZXJQb3BvdXQgPSB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlUG9wb3V0RnJvbUNvbnRlbnRJdGVtKHRoaXMsIHVuZGVmaW5lZCwgcGFyZW50SWQsIHVuZGVmaW5lZCk7XHJcbiAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ3N0YXRlQ2hhbmdlZCcpO1xyXG4gICAgICAgIHJldHVybiBicm93c2VyUG9wb3V0O1xyXG4gICAgfVxyXG5cclxuICAgIGFic3RyYWN0IHRvQ29uZmlnKCk6IFJlc29sdmVkSXRlbUNvbmZpZztcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjYWxjdWxhdGVDb25maWdDb250ZW50KCk6IFJlc29sdmVkSXRlbUNvbmZpZ1tdIHtcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbXMgPSB0aGlzLl9jb250ZW50SXRlbXM7XHJcbiAgICAgICAgY29uc3QgY291bnQgPSBjb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxSZXNvbHZlZEl0ZW1Db25maWc+KGNvdW50KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgcmVzdWx0W2ldID0gaXRlbS50b0NvbmZpZygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGhpZ2hsaWdodERyb3Bab25lKHg6IG51bWJlciwgeTogbnVtYmVyLCBhcmVhOiBBcmVhTGlua2VkUmVjdCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGRyb3BUYXJnZXRJbmRpY2F0b3IgPSB0aGlzLmxheW91dE1hbmFnZXIuZHJvcFRhcmdldEluZGljYXRvcjtcclxuICAgICAgICBpZiAoZHJvcFRhcmdldEluZGljYXRvciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignQUNJSERaNTU5MycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRyb3BUYXJnZXRJbmRpY2F0b3IuaGlnaGxpZ2h0QXJlYShhcmVhLCAxKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgb25Ecm9wKGNvbnRlbnRJdGVtOiBDb250ZW50SXRlbSwgYXJlYTogQ29udGVudEl0ZW0uQXJlYSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYWRkQ2hpbGQoY29udGVudEl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHNob3coKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmJlZ2luU2l6ZUludmFsaWRhdGlvbigpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIE5vdCBzdXJlIHdoeSBzaG93QWxsQWN0aXZlQ29udGVudEl0ZW1zKCkgd2FzIGNhbGxlZC4gR29sZGVuTGF5b3V0IHNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IGl0LiAgTGVmdCBjb21tZW50ZWQgY29kZVxyXG4gICAgICAgICAgICAvLyBpbiBzb3VyY2UgaW4gY2FzZSBhIHJlYXNvbiBmb3IgaXQgYmVjb21lcyBhcHBhcmVudC5cclxuICAgICAgICAgICAgLy8gdGhpcy5sYXlvdXRNYW5hZ2VyLnNob3dBbGxBY3RpdmVDb250ZW50SXRlbXMoKTtcclxuICAgICAgICAgICAgc2V0RWxlbWVudERpc3BsYXlWaXNpYmlsaXR5KHRoaXMuX2VsZW1lbnQsIHRydWUpO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmxheW91dE1hbmFnZXIudXBkYXRlU2l6ZUZyb21Db250YWluZXIoKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jb250ZW50SXRlbXNbaV0uc2hvdygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmVuZFNpemVJbnZhbGlkYXRpb24oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGlzIGl0ZW0gYW5kcyBpdHMgY2hpbGRyZW5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRJdGVtc1tpXS5kZXN0cm95KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NvbnRlbnRJdGVtcyA9IFtdO1xyXG5cclxuICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnYmVmb3JlSXRlbURlc3Ryb3llZCcpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ2l0ZW1EZXN0cm95ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGFyZWEgdGhlIGNvbXBvbmVudCBjdXJyZW50bHkgb2NjdXBpZXNcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBnZXRFbGVtZW50QXJlYShlbGVtZW50PzogSFRNTEVsZW1lbnQpOiBDb250ZW50SXRlbS5BcmVhIHtcclxuICAgICAgICBlbGVtZW50ID0gZWxlbWVudCA/PyB0aGlzLl9lbGVtZW50O1xyXG5cclxuICAgICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBjb25zdCB0b3AgPSByZWN0LnRvcCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wO1xyXG4gICAgICAgIGNvbnN0IGxlZnQgPSByZWN0LmxlZnQgKyBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQ7XHJcblxyXG4gICAgICAgIGNvbnN0IHdpZHRoID0gcmVjdC53aWR0aDtcclxuICAgICAgICBjb25zdCBoZWlnaHQgPSByZWN0LmhlaWdodDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgeDE6IGxlZnQsXHJcbiAgICAgICAgICAgIHkxOiB0b3AsXHJcbiAgICAgICAgICAgIHgyOiBsZWZ0ICsgd2lkdGgsXHJcbiAgICAgICAgICAgIHkyOiB0b3AgKyBoZWlnaHQsXHJcbiAgICAgICAgICAgIHN1cmZhY2U6IHdpZHRoICogaGVpZ2h0LFxyXG4gICAgICAgICAgICBjb250ZW50SXRlbTogdGhpc1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZmluZEFuY2VzdG9yV2l0aFNpYmxpbmdzKCk6IENvbnRlbnRJdGVtIHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IGN1cnI6IENvbnRlbnRJdGVtIHwgbnVsbCA9IHRoaXM7XHJcblxyXG4gICAgICAgIHdoaWxlIChjdXJyICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyLnBhcmVudCAhPT0gbnVsbCAmJiBjdXJyLnBhcmVudC5jb250ZW50SXRlbXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3VyciA9IGN1cnIucGFyZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogRmluZHMgYW4gYW5jZXN0b3IgdGhhdCB3aWxsIGV4aXN0IGV2ZW4gYWZ0ZXIgdGhlIGl0ZW0gaXMgcmVtb3ZlZCBhbmQgcmV0dXJucyBpdCBhcyBkb2NrIHBvaW50LlxyXG4gICAgICogXHJcbiAgICAgKiBAaW50ZXJuYWwgKi9cclxuICAgIGZpbmREb2NrUG9pbnQoKTogQ29udGVudEl0ZW0uRG9ja1BvaW50IHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgYW5jaG9yID0gdGhpcy5maW5kQW5jZXN0b3JXaXRoU2libGluZ3MoKTtcclxuXHJcbiAgICAgICAgaWYgKGFuY2hvciAhPT0gbnVsbCAmJiBhbmNob3IucGFyZW50ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gYW5jaG9yLnBhcmVudC5fY29udGVudEl0ZW1zLmluZGV4T2YoYW5jaG9yKTtcclxuICAgICAgICAgICAgcmV0dXJuIHsgcGFyZW50OiBhbmNob3IucGFyZW50LCBpbmRleCB9O1xyXG5cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGF5b3V0TWFuYWdlci5ncm91bmRJdGVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHBhcmVudDogdGhpcy5sYXlvdXRNYW5hZ2VyLmdyb3VuZEl0ZW0sIGluZGV4OiBudWxsIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0cmVlIG9mIGNvbnRlbnQgaXRlbXMgaXMgY3JlYXRlZCBpbiB0d28gc3RlcHM6IEZpcnN0IGFsbCBjb250ZW50IGl0ZW1zIGFyZSBpbnN0YW50aWF0ZWQsXHJcbiAgICAgKiB0aGVuIGluaXQgaXMgY2FsbGVkIHJlY3Vyc2l2ZWx5IGZyb20gdG9wIHRvIGJvdHRlbS4gVGhpcyBpcyB0aGUgYmFzaWMgaW5pdCBmdW5jdGlvbixcclxuICAgICAqIGl0IGNhbiBiZSB1c2VkLCBleHRlbmRlZCBvciBvdmVyd3JpdHRlbiBieSB0aGUgY29udGVudCBpdGVtc1xyXG4gICAgICpcclxuICAgICAqIEl0cyBiZWhhdmlvdXIgZGVwZW5kcyBvbiB0aGUgY29udGVudCBpdGVtXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgaW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpc2VkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnaXRlbUNyZWF0ZWQnKTtcclxuICAgICAgICB0aGlzLmVtaXRVbmtub3duQnViYmxpbmdFdmVudCh0aGlzLnR5cGUgKyAnQ3JlYXRlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByb3RlY3RlZCBzZXRQYXJlbnQocGFyZW50OiBDb250ZW50SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBhZGRQb3BJblBhcmVudElkKGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMucG9wSW5QYXJlbnRJZHMuaW5jbHVkZXMoaWQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9wSW5QYXJlbnRJZHMucHVzaChpZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByb3RlY3RlZCBpbml0Q29udGVudEl0ZW1zKCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRJdGVtc1tpXS5pbml0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByb3RlY3RlZCBoaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5iZWdpblNpemVJbnZhbGlkYXRpb24oKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkodGhpcy5fZWxlbWVudCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmxheW91dE1hbmFnZXIudXBkYXRlU2l6ZUZyb21Db250YWluZXIoKTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuZW5kU2l6ZUludmFsaWRhdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm90ZWN0ZWQgdXBkYXRlQ29udGVudEl0ZW1zU2l6ZShmb3JjZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRJdGVtc1tpXS51cGRhdGVTaXplKGZvcmNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBjcmVhdGVzIGFsbCBjb250ZW50IGl0ZW1zIGZvciB0aGlzIG5vZGUgYXQgaW5pdGlhbGlzYXRpb24gdGltZVxyXG4gICAgICogUExFQVNFIE5PVEUsIHBsZWFzZSBzZWUgYWRkQ2hpbGQgZm9yIGFkZGluZyBjb250ZW50SXRlbXMgYXQgcnVudGltZVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlQ29udGVudEl0ZW1zKGNvbnRlbnQ6IHJlYWRvbmx5IFJlc29sdmVkSXRlbUNvbmZpZ1tdKSB7XHJcbiAgICAgICAgY29uc3QgY291bnQgPSBjb250ZW50Lmxlbmd0aDtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8Q29udGVudEl0ZW0+KGNvdW50KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgcmVzdWx0W2ldID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmNyZWF0ZUNvbnRlbnRJdGVtKGNvbnRlbnRbaV0sIHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGZvciBldmVyeSBldmVudCBvbiB0aGUgaXRlbSB0cmVlLiBEZWNpZGVzIHdoZXRoZXIgdGhlIGV2ZW50IGlzIGEgYnViYmxpbmdcclxuICAgICAqIGV2ZW50IGFuZCBwcm9wYWdhdGVzIGl0IHRvIGl0cyBwYXJlbnRcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudFxyXG4gICAgICogQHBhcmFtIGV2ZW50IC1cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHByb3BhZ2F0ZUV2ZW50KG5hbWU6IHN0cmluZywgYXJnczogdW5rbm93bltdKSB7XHJcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gYXJnc1swXTtcclxuICAgICAgICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyLkJ1YmJsaW5nRXZlbnQgJiZcclxuICAgICAgICAgICAgICAgIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkID09PSBmYWxzZSAmJlxyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXNlZCA9PT0gdHJ1ZSkge1xyXG5cclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogSW4gc29tZSBjYXNlcyAoZS5nLiBpZiBhbiBlbGVtZW50IGlzIGNyZWF0ZWQgZnJvbSBhIERyYWdTb3VyY2UpIGl0XHJcbiAgICAgICAgICAgICAgICAgKiBkb2Vzbid0IGhhdmUgYSBwYXJlbnQgYW5kIGlzIG5vdCBhIGNoaWxkIG9mIEdyb3VuZEl0ZW0uIElmIHRoYXQncyB0aGUgY2FzZVxyXG4gICAgICAgICAgICAgICAgICogcHJvcGFnYXRlIHRoZSBidWJibGluZyBldmVudCBmcm9tIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHN1YnN0cmVlIGRpcmVjdGx5XHJcbiAgICAgICAgICAgICAgICAgKiB0byB0aGUgbGF5b3V0TWFuYWdlclxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0dyb3VuZCA9PT0gZmFsc2UgJiYgdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyZW50LmVtaXRVbmtub3duKG5hbWUsIGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUV2ZW50UHJvcGFnYXRpb25Ub0xheW91dE1hbmFnZXIobmFtZSwgZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG92ZXJyaWRlIHRyeUJ1YmJsZUV2ZW50KG5hbWU6IHN0cmluZywgYXJnczogdW5rbm93bltdKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gYXJnc1swXTtcclxuICAgICAgICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyLkJ1YmJsaW5nRXZlbnQgJiZcclxuICAgICAgICAgICAgICAgIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkID09PSBmYWxzZSAmJlxyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXNlZCA9PT0gdHJ1ZVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogSW4gc29tZSBjYXNlcyAoZS5nLiBpZiBhbiBlbGVtZW50IGlzIGNyZWF0ZWQgZnJvbSBhIERyYWdTb3VyY2UpIGl0XHJcbiAgICAgICAgICAgICAgICAgKiBkb2Vzbid0IGhhdmUgYSBwYXJlbnQgYW5kIGlzIG5vdCBhIGNoaWxkIG9mIEdyb3VuZEl0ZW0uIElmIHRoYXQncyB0aGUgY2FzZVxyXG4gICAgICAgICAgICAgICAgICogcHJvcGFnYXRlIHRoZSBidWJibGluZyBldmVudCBmcm9tIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHN1YnN0cmVlIGRpcmVjdGx5XHJcbiAgICAgICAgICAgICAgICAgKiB0byB0aGUgbGF5b3V0TWFuYWdlclxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0dyb3VuZCA9PT0gZmFsc2UgJiYgdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyZW50LmVtaXRVbmtub3duKG5hbWUsIGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUV2ZW50UHJvcGFnYXRpb25Ub0xheW91dE1hbmFnZXIobmFtZSwgZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWxsIHJhdyBldmVudHMgYnViYmxlIHVwIHRvIHRoZSBHcm91bmQgZWxlbWVudC4gU29tZSBldmVudHMgdGhhdFxyXG4gICAgICogYXJlIHByb3BhZ2F0ZWQgdG8gLSBhbmQgZW1pdHRlZCBieSAtIHRoZSBsYXlvdXRNYW5hZ2VyIGhvd2V2ZXIgYXJlXHJcbiAgICAgKiBvbmx5IHN0cmluZy1iYXNlZCwgYmF0Y2hlZCBhbmQgc2FuaXRpemVkIHRvIG1ha2UgdGhlbSBtb3JlIHVzYWJsZVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzY2hlZHVsZUV2ZW50UHJvcGFnYXRpb25Ub0xheW91dE1hbmFnZXIobmFtZTogc3RyaW5nLCBldmVudDogRXZlbnRFbWl0dGVyLkJ1YmJsaW5nRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5fdGhyb3R0bGVkRXZlbnRzLmluZGV4T2YobmFtZSkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5lbWl0VW5rbm93bihuYW1lLCBldmVudCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdFdmVudFByb3BhZ2F0aW9uc1tuYW1lXSAhPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ0V2ZW50UHJvcGFnYXRpb25zW25hbWVdID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMucHJvcGFnYXRlRXZlbnRUb0xheW91dE1hbmFnZXIobmFtZSwgZXZlbnQpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayBmb3IgZXZlbnRzIHNjaGVkdWxlZCBieSBfc2NoZWR1bGVFdmVudFByb3BhZ2F0aW9uVG9MYXlvdXRNYW5hZ2VyXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHByb3BhZ2F0ZUV2ZW50VG9MYXlvdXRNYW5hZ2VyKG5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50RW1pdHRlci5CdWJibGluZ0V2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5fcGVuZGluZ0V2ZW50UHJvcGFnYXRpb25zW25hbWVdID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmVtaXRVbmtub3duKG5hbWUsIGV2ZW50KTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBDb250ZW50SXRlbSB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIEFyZWEgZXh0ZW5kcyBBcmVhTGlua2VkUmVjdCB7XHJcbiAgICAgICAgc3VyZmFjZTogbnVtYmVyO1xyXG4gICAgICAgIGNvbnRlbnRJdGVtOiBDb250ZW50SXRlbTtcclxuICAgIH1cclxuICAgIC8qKiBAcHVibGljICovXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIERvY2tQb2ludCB7XHJcbiAgICAgICAgcGFyZW50OiBDb250ZW50SXRlbTtcclxuICAgICAgICBpbmRleDogbnVtYmVyIHwgbnVsbDtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoQ29udGVudEl0ZW06Y2xhc3MpfSAqL1xyXG5leHBvcnQgdHlwZSBBYnN0cmFjdENvbnRlbnRJdGVtID0gQ29udGVudEl0ZW07XHJcbiIsImltcG9ydCB7IENvbXBvbmVudEl0ZW1Db25maWcsIEl0ZW1Db25maWcsIFJvd09yQ29sdW1uSXRlbUNvbmZpZywgU3RhY2tJdGVtQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL2NvbmZpZyc7XHJcbmltcG9ydCB7IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZywgUmVzb2x2ZWRHcm91bmRJdGVtQ29uZmlnLCBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZywgUmVzb2x2ZWRJdGVtQ29uZmlnLCBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnLCBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9yZXNvbHZlZC1jb25maWcnO1xyXG5pbXBvcnQgeyBBc3NlcnRFcnJvciwgVW5leHBlY3RlZE51bGxFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IERvbUNvbnN0YW50cyB9IGZyb20gJy4uL3V0aWxzL2RvbS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBBcmVhTGlua2VkUmVjdCwgSXRlbVR5cGUsIFNpemVVbml0RW51bSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHsgZ2V0RWxlbWVudFdpZHRoQW5kSGVpZ2h0LCBzZXRFbGVtZW50SGVpZ2h0LCBzZXRFbGVtZW50V2lkdGggfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuL2NvbXBvbmVudC1pdGVtJztcclxuaW1wb3J0IHsgQ29tcG9uZW50UGFyZW50YWJsZUl0ZW0gfSBmcm9tICcuL2NvbXBvbmVudC1wYXJlbnRhYmxlLWl0ZW0nO1xyXG5pbXBvcnQgeyBDb250ZW50SXRlbSB9IGZyb20gJy4vY29udGVudC1pdGVtJztcclxuaW1wb3J0IHsgUm93T3JDb2x1bW4gfSBmcm9tICcuL3Jvdy1vci1jb2x1bW4nO1xyXG5cclxuLyoqXHJcbiAqIEdyb3VuZEl0ZW0gaXMgdGhlIENvbnRlbnRJdGVtIHdob3NlIG9uZSBjaGlsZCBpcyB0aGUgcm9vdCBDb250ZW50SXRlbSAoUm9vdCBpcyBwbGFudGVkIGluIEdyb3VuZCkuXHJcbiAqIChQcmV2aW91c2x5IGl0IHdhcyBjYWxsZWQgcm9vdCBob3dldmVyIHRoaXMgd2FzIGluY29ycmVjdCBhcyBpdHMgY2hpbGQgaXMgdGhlIHJvb3QgaXRlbSlcclxuICogVGhlcmUgaXMgb25seSBvbmUgaW5zdGFuY2Ugb2YgR3JvdW5kSXRlbSBhbmQgaXQgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IHRoZSBMYXlvdXQgTWFuYWdlclxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBjbGFzcyBHcm91bmRJdGVtIGV4dGVuZHMgQ29tcG9uZW50UGFyZW50YWJsZUl0ZW0ge1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hpbGRFbGVtZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGxheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXIsIHJvb3RJdGVtQ29uZmlnOiBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnIHwgdW5kZWZpbmVkLCBjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG5cclxuICAgICAgICBzdXBlcihsYXlvdXRNYW5hZ2VyLCBSZXNvbHZlZEdyb3VuZEl0ZW1Db25maWcuY3JlYXRlKHJvb3RJdGVtQ29uZmlnKSwgbnVsbCwgR3JvdW5kSXRlbS5jcmVhdGVFbGVtZW50KGRvY3VtZW50KSk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNHcm91bmQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lciA9IHRoaXMuZWxlbWVudDtcclxuICAgICAgICB0aGlzLl9jb250YWluZXJFbGVtZW50ID0gY29udGFpbmVyRWxlbWVudDtcclxuXHJcbiAgICAgICAgLy8gaW5zZXJ0IGJlZm9yZSBhbnkgcHJlLWV4aXN0aW5nIGNvbnRlbnQgZWxlbWVudHNcclxuICAgICAgICBsZXQgYmVmb3JlOiBDaGlsZE5vZGUgfCBudWxsID0gbnVsbDtcclxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBwcmV2OiBDaGlsZE5vZGUgfCBudWxsID1cclxuICAgICAgICAgICAgICAgIGJlZm9yZSA/IGJlZm9yZS5wcmV2aW91c1NpYmxpbmcgOiB0aGlzLl9jb250YWluZXJFbGVtZW50Lmxhc3RDaGlsZDtcclxuICAgICAgICAgICAgaWYgKHByZXYgaW5zdGFuY2VvZiBFbGVtZW50XHJcbiAgICAgICAgICAgICAgICAmJiBwcmV2LmNsYXNzTGlzdC5jb250YWlucyhEb21Db25zdGFudHMuQ2xhc3NOYW1lLkNvbnRlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICBiZWZvcmUgPSBwcmV2O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyRWxlbWVudC5pbnNlcnRCZWZvcmUodGhpcy5lbGVtZW50LCBiZWZvcmUpO1xyXG4gICAgfVxyXG5cclxuICAgIG92ZXJyaWRlIGluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNJbml0aWFsaXNlZCA9PT0gdHJ1ZSkgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZU5vZGVTaXplKCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5fY2hpbGRFbGVtZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuY29udGVudEl0ZW1zW2ldLmVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3VwZXIuaW5pdCgpO1xyXG5cclxuICAgICAgICB0aGlzLmluaXRDb250ZW50SXRlbXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExvYWRzIGEgbmV3IExheW91dFxyXG4gICAgICogSW50ZXJuYWwgb25seS4gIFRvIGxvYWQgYSBuZXcgbGF5b3V0IHdpdGggQVBJLCB1c2Uge0BsaW5rIChMYXlvdXRNYW5hZ2VyOmNsYXNzKS5sb2FkTGF5b3V0fVxyXG4gICAgICovXHJcbiAgICBsb2FkUm9vdChyb290SXRlbUNvbmZpZzogUmVzb2x2ZWRSb290SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xyXG4gICAgICAgIC8vIFJlbW92ZSBleGlzdGluZyByb290IGlmIGl0IGV4aXN0c1xyXG4gICAgICAgIHRoaXMuY2xlYXJSb290KCk7XHJcblxyXG4gICAgICAgIGlmIChyb290SXRlbUNvbmZpZyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvb3RDb250ZW50SXRlbSA9IHRoaXMubGF5b3V0TWFuYWdlci5jcmVhdGVBbmRJbml0Q29udGVudEl0ZW0ocm9vdEl0ZW1Db25maWcsIHRoaXMpO1xyXG4gICAgICAgICAgICB0aGlzLmFkZENoaWxkKHJvb3RDb250ZW50SXRlbSwgMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyUm9vdCgpOiB2b2lkIHtcclxuICAgICAgICAvLyBSZW1vdmUgZXhpc3Rpbmcgcm9vdCBpZiBpdCBleGlzdHNcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbXMgPSB0aGlzLmNvbnRlbnRJdGVtcztcclxuICAgICAgICBzd2l0Y2ggKGNvbnRlbnRJdGVtcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgY2FzZSAwOiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSAxOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1Jvb3RDb250ZW50SXRlbSA9IGNvbnRlbnRJdGVtc1swXTtcclxuICAgICAgICAgICAgICAgIGV4aXN0aW5nUm9vdENvbnRlbnRJdGVtLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignR0lMUjA3NzIxJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgQ29udGVudEl0ZW0gY2hpbGQgdG8gcm9vdCBDb250ZW50SXRlbS5cclxuICAgICAqIEludGVybmFsIG9ubHkuICBUbyBsb2FkIGEgYWRkIHdpdGggQVBJLCB1c2Uge0BsaW5rIChMYXlvdXRNYW5hZ2VyOmNsYXNzKS5hZGRJdGVtfVxyXG4gICAgICogQHJldHVybnMgLTEgaWYgYWRkZWQgYXMgcm9vdCBvdGhlcndpc2UgaW5kZXggaW4gcm9vdCBDb250ZW50SXRlbSdzIGNvbnRlbnRcclxuICAgICAqL1xyXG4gICAgYWRkSXRlbShpdGVtQ29uZmlnOiBSb3dPckNvbHVtbkl0ZW1Db25maWcgfCBTdGFja0l0ZW1Db25maWcgfCBDb21wb25lbnRJdGVtQ29uZmlnLFxyXG4gICAgICAgIGluZGV4PzogbnVtYmVyXHJcbiAgICApOiBudW1iZXIge1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5jaGVja01pbmltaXNlTWF4aW1pc2VkU3RhY2soKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRJdGVtQ29uZmlnID0gSXRlbUNvbmZpZy5yZXNvbHZlKGl0ZW1Db25maWcsIGZhbHNlKTtcclxuICAgICAgICBsZXQgcGFyZW50OiBDb250ZW50SXRlbTtcclxuICAgICAgICBpZiAodGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwYXJlbnQgPSB0aGlzLmNvbnRlbnRJdGVtc1swXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcclxuICAgICAgICAgICAgcGFyZW50ID0gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHBhcmVudC5pc0NvbXBvbmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgaXRlbSBhcyBjaGlsZCB0byBDb21wb25lbnRJdGVtJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlQW5kSW5pdENvbnRlbnRJdGVtKHJlc29sdmVkSXRlbUNvbmZpZywgcGFyZW50KTtcclxuICAgICAgICAgICAgaW5kZXggPSBwYXJlbnQuYWRkQ2hpbGQoY29udGVudEl0ZW0sIGluZGV4KTtcclxuICAgICAgICAgICAgcmV0dXJuIChwYXJlbnQgPT09IHRoaXMpID8gLTEgOiBpbmRleDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZENvbXBvbmVudEFzUm9vdChpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnKTogdm9pZCB7XHJcbiAgICAgICAgLy8gUmVtb3ZlIGV4aXN0aW5nIHJvb3QgaWYgaXQgZXhpc3RzXHJcbiAgICAgICAgdGhpcy5jbGVhclJvb3QoKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRJdGVtQ29uZmlnID0gSXRlbUNvbmZpZy5yZXNvbHZlKGl0ZW1Db25maWcsIGZhbHNlKSBhcyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWc7XHJcblxyXG4gICAgICAgIGlmIChyZXNvbHZlZEl0ZW1Db25maWcubWF4aW1pc2VkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUm9vdCBDb21wb25lbnQgY2Fubm90IGJlIG1heGltaXNlZCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvb3RDb250ZW50SXRlbSA9IG5ldyBDb21wb25lbnRJdGVtKHRoaXMubGF5b3V0TWFuYWdlciwgcmVzb2x2ZWRJdGVtQ29uZmlnLCB0aGlzKTtcclxuICAgICAgICAgICAgcm9vdENvbnRlbnRJdGVtLmluaXQoKTtcclxuICAgICAgICAgICAgdGhpcy5hZGRDaGlsZChyb290Q29udGVudEl0ZW0sIDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBSb290IENvbnRlbnRJdGVtLlxyXG4gICAgICogSW50ZXJuYWwgb25seS4gIFRvIHJlcGxhY2UgUm9vdCBDb250ZW50SXRlbSB3aXRoIEFQSSwgdXNlIHtAbGluayAoTGF5b3V0TWFuYWdlcjpjbGFzcykubG9hZExheW91dH1cclxuICAgICAqL1xyXG4gICAgb3ZlcnJpZGUgYWRkQ2hpbGQoY29udGVudEl0ZW06IENvbnRlbnRJdGVtLCBpbmRleD86IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHcm91bmQgbm9kZSBjYW4gb25seSBoYXZlIGEgc2luZ2xlIGNoaWxkJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gY29udGVudEl0ZW0gPSB0aGlzLmxheW91dE1hbmFnZXIuXyRub3JtYWxpemVDb250ZW50SXRlbShjb250ZW50SXRlbSwgdGhpcyk7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lci5hcHBlbmRDaGlsZChjb250ZW50SXRlbS5lbGVtZW50KTtcclxuICAgICAgICAgICAgaW5kZXggPSBzdXBlci5hZGRDaGlsZChjb250ZW50SXRlbSwgaW5kZXgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ3N0YXRlQ2hhbmdlZCcpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGluZGV4O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSBjYWxjdWxhdGVDb25maWdDb250ZW50KCk6IFJlc29sdmVkUm9vdEl0ZW1Db25maWdbXSB7XHJcbiAgICAgICAgY29uc3QgY29udGVudEl0ZW1zID0gdGhpcy5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgY29uc3QgY291bnQgPSBjb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxSZXNvbHZlZFJvb3RJdGVtQ29uZmlnPihjb3VudCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1Db25maWcgPSBpdGVtLnRvQ29uZmlnKCk7XHJcbiAgICAgICAgICAgIGlmIChSZXNvbHZlZFJvb3RJdGVtQ29uZmlnLmlzUm9vdEl0ZW1Db25maWcoaXRlbUNvbmZpZykpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IGl0ZW1Db25maWc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ1JDQ0M2NjgzMicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc2V0U2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGlmICh3aWR0aCA9PT0gdW5kZWZpbmVkIHx8IGhlaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZShmYWxzZSk7IC8vIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIHYxLnggQVBJXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2V0RWxlbWVudFdpZHRoKHRoaXMuZWxlbWVudCwgd2lkdGgpO1xyXG4gICAgICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHRoaXMuZWxlbWVudCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIC8vIEdyb3VuZEl0ZW0gY2FuIGJlIGVtcHR5XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRFbGVtZW50V2lkdGgodGhpcy5jb250ZW50SXRlbXNbMF0uZWxlbWVudCwgd2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgc2V0RWxlbWVudEhlaWdodCh0aGlzLmNvbnRlbnRJdGVtc1swXS5lbGVtZW50LCBoZWlnaHQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnRlbnRJdGVtc1NpemUoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBSb290IENvbnRlbnRJdGVtLlxyXG4gICAgICogSW50ZXJuYWwgb25seS4gIFRvIHJlcGxhY2UgUm9vdCBDb250ZW50SXRlbSB3aXRoIEFQSSwgdXNlIHtAbGluayAoTGF5b3V0TWFuYWdlcjpjbGFzcykudXBkYXRlUm9vdFNpemV9XHJcbiAgICAgKi9cclxuICAgIG92ZXJyaWRlIHVwZGF0ZVNpemUoZm9yY2U6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuYmVnaW5WaXJ0dWFsU2l6ZWRDb250YWluZXJBZGRpbmcoKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU5vZGVTaXplKCk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29udGVudEl0ZW1zU2l6ZShmb3JjZSk7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmVuZFZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVTaWRlQXJlYXMoKTogR3JvdW5kSXRlbS5BcmVhW10ge1xyXG4gICAgICAgIGNvbnN0IGFyZWFTaXplID0gNTA7XHJcblxyXG4gICAgICAgIGNvbnN0IG9wcG9zaXRlU2lkZXMgPSBHcm91bmRJdGVtLkFyZWEub3Bwb3NpdGVTaWRlcztcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8R3JvdW5kSXRlbS5BcmVhPihPYmplY3Qua2V5cyhvcHBvc2l0ZVNpZGVzKS5sZW5ndGgpO1xyXG4gICAgICAgIGxldCBpZHggPSAwO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvcHBvc2l0ZVNpZGVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNpZGUgPSBrZXkgYXMga2V5b2YgR3JvdW5kSXRlbS5BcmVhLlNpZGVzO1xyXG4gICAgICAgICAgICBjb25zdCBhcmVhID0gdGhpcy5nZXRFbGVtZW50QXJlYSgpIGFzIEdyb3VuZEl0ZW0uQXJlYTtcclxuICAgICAgICAgICAgaWYgKGFyZWEgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdSQ1NBNzc1NTMnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFyZWEuc2lkZSA9IHNpZGU7XHJcbiAgICAgICAgICAgICAgICBpZiAob3Bwb3NpdGVTaWRlc1tzaWRlXVsxXSA9PT0gJzInIClcclxuICAgICAgICAgICAgICAgICAgICBhcmVhW3NpZGVdID0gYXJlYVtvcHBvc2l0ZVNpZGVzW3NpZGVdXSAtIGFyZWFTaXplO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIGFyZWFbc2lkZV0gPSBhcmVhW29wcG9zaXRlU2lkZXNbc2lkZV1dICsgYXJlYVNpemU7XHJcbiAgICAgICAgICAgICAgICBhcmVhLnN1cmZhY2UgPSAoYXJlYS54MiAtIGFyZWEueDEpICogKGFyZWEueTIgLSBhcmVhLnkxKTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdFtpZHgrK10gPSBhcmVhO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIG92ZXJyaWRlIGhpZ2hsaWdodERyb3Bab25lKHg6IG51bWJlciwgeTogbnVtYmVyLCBhcmVhOiBBcmVhTGlua2VkUmVjdCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci50YWJEcm9wUGxhY2Vob2xkZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgc3VwZXIuaGlnaGxpZ2h0RHJvcFpvbmUoeCwgeSwgYXJlYSk7XHJcbiAgICB9XHJcblxyXG4gICAgb3ZlcnJpZGUgb25Ecm9wKGNvbnRlbnRJdGVtOiBDb250ZW50SXRlbSwgYXJlYTogR3JvdW5kSXRlbS5BcmVhKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGlmIChjb250ZW50SXRlbS5pc0NvbXBvbmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtQ29uZmlnID0gUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcuY3JlYXRlRGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAvLyBzaW5jZSBSZXNvbHZlZEl0ZW1Db25maWcuY29udGVudEl0ZW1zIG5vdCBzZXQgdXAsIHdlIG5lZWQgdG8gYWRkIGhlYWRlciBmcm9tIENvbXBvbmVudFxyXG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBjb250ZW50SXRlbSBhcyBDb21wb25lbnRJdGVtO1xyXG4gICAgICAgICAgICBpdGVtQ29uZmlnLmhlYWRlciA9IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlci5jcmVhdGVDb3B5KGNvbXBvbmVudC5oZWFkZXJDb25maWcpO1xyXG4gICAgICAgICAgICBjb25zdCBzdGFjayA9IHRoaXMubGF5b3V0TWFuYWdlci5jcmVhdGVBbmRJbml0Q29udGVudEl0ZW0oaXRlbUNvbmZpZywgdGhpcyk7XHJcbiAgICAgICAgICAgIHN0YWNrLmFkZENoaWxkKGNvbnRlbnRJdGVtKTtcclxuICAgICAgICAgICAgY29udGVudEl0ZW0gPSBzdGFjaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRDaGlsZChjb250ZW50SXRlbSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgICogSWYgdGhlIGNvbnRlbnRJdGVtIHRoYXQncyBiZWluZyBkcm9wcGVkIGlzIG5vdCBkcm9wcGVkIG9uIGEgU3RhY2sgKGNhc2VzIHdoaWNoIGp1c3QgcGFzc2VkIGFib3ZlIGFuZFxyXG4gICAgICAgICAgICAgKiB3aGljaCB3b3VsZCB3cmFwIHRoZSBjb250ZW50SXRlbSBpbiBhIFN0YWNrKSB3ZSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgY29udGVudEl0ZW0gaXMgYSBSb3dPckNvbHVtbi5cclxuICAgICAgICAgICAgICogSWYgaXQgaXMsIHdlIG5lZWQgdG8gcmUtd3JhcCBpdCBpbiBhIFN0YWNrIGxpa2UgaXQgd2FzIHdoZW4gaXQgd2FzIGRyYWdnZWQgYnkgaXRzIFRhYiAoaXQgd2FzIGRyYWdnZWQhKS5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGlmKGNvbnRlbnRJdGVtLnR5cGUgPT09IEl0ZW1UeXBlLnJvdyB8fCBjb250ZW50SXRlbS50eXBlID09PSBJdGVtVHlwZS5jb2x1bW4pe1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUNvbmZpZyA9IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnLmNyZWF0ZURlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmNyZWF0ZUNvbnRlbnRJdGVtKGl0ZW1Db25maWcsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgc3RhY2suYWRkQ2hpbGQoY29udGVudEl0ZW0pXHJcbiAgICAgICAgICAgICAgICBjb250ZW50SXRlbSA9IHN0YWNrXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBhcmVhLnNpZGVbMF0gPT0gJ3gnID8gSXRlbVR5cGUucm93IDogSXRlbVR5cGUuY29sdW1uO1xyXG4gICAgICAgICAgICBjb25zdCBpbnNlcnRCZWZvcmUgPSBhcmVhLnNpZGVbMV0gPT0gJzInO1xyXG4gICAgICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbnRlbnRJdGVtc1swXTtcclxuICAgICAgICAgICAgaWYgKCEoY29sdW1uIGluc3RhbmNlb2YgUm93T3JDb2x1bW4pIHx8IGNvbHVtbi50eXBlICE9PSB0eXBlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtQ29uZmlnID0gUmVzb2x2ZWRJdGVtQ29uZmlnLmNyZWF0ZURlZmF1bHQodHlwZSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByb3dPckNvbHVtbiA9IHRoaXMubGF5b3V0TWFuYWdlci5jcmVhdGVDb250ZW50SXRlbShpdGVtQ29uZmlnLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVwbGFjZUNoaWxkKGNvbHVtbiwgcm93T3JDb2x1bW4pO1xyXG4gICAgICAgICAgICAgICAgcm93T3JDb2x1bW4uYWRkQ2hpbGQoY29udGVudEl0ZW0sIGluc2VydEJlZm9yZSA/IDAgOiB1bmRlZmluZWQsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgcm93T3JDb2x1bW4uYWRkQ2hpbGQoY29sdW1uLCBpbnNlcnRCZWZvcmUgPyB1bmRlZmluZWQgOiAwLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGNvbHVtbi5zaXplID0gNTA7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50SXRlbS5zaXplID0gNTA7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50SXRlbS5zaXplVW5pdCA9IFNpemVVbml0RW51bS5QZXJjZW50O1xyXG4gICAgICAgICAgICAgICAgcm93T3JDb2x1bW4udXBkYXRlU2l6ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzaWJsaW5nID0gY29sdW1uLmNvbnRlbnRJdGVtc1tpbnNlcnRCZWZvcmUgPyAwIDogY29sdW1uLmNvbnRlbnRJdGVtcy5sZW5ndGggLSAxXVxyXG4gICAgICAgICAgICAgICAgY29sdW1uLmFkZENoaWxkKGNvbnRlbnRJdGVtLCBpbnNlcnRCZWZvcmUgPyAwIDogdW5kZWZpbmVkLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIHNpYmxpbmcuc2l6ZSAqPSAwLjU7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50SXRlbS5zaXplID0gc2libGluZy5zaXplO1xyXG4gICAgICAgICAgICAgICAgY29udGVudEl0ZW0uc2l6ZVVuaXQgPSBTaXplVW5pdEVudW0uUGVyY2VudDtcclxuICAgICAgICAgICAgICAgIGNvbHVtbi51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBObyBDb250ZW50SXRlbSBjYW4gZG9jayB3aXRoIGdyb3VuZEl0ZW0uICBIb3dldmVyIFN0YWNrIGNhbiBoYXZlIGEgR3JvdW5kSXRlbSBwYXJlbnQgYW5kIFN0YWNrIHJlcXVpcmVzIHRoYXRcclxuICAgIC8vIGl0cyBwYXJlbnQgaW1wbGVtZW50IGRvY2soKSBmdW5jdGlvbi4gIEFjY29yZGluZ2x5IHRoaXMgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgYnV0IHRocm93cyBhbiBleGNlcHRpb24gYXMgaXQgc2hvdWxkXHJcbiAgICAvLyBuZXZlciBiZSBjYWxsZWRcclxuICAgIGRvY2soKTogdm9pZCB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdHSUQ4NzczMScpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE5vIENvbnRlbnRJdGVtIGNhbiBkb2NrIHdpdGggZ3JvdW5kSXRlbS4gIEhvd2V2ZXIgU3RhY2sgY2FuIGhhdmUgYSBHcm91bmRJdGVtIHBhcmVudCBhbmQgU3RhY2sgcmVxdWlyZXMgdGhhdFxyXG4gICAgLy8gaXRzIHBhcmVudCBpbXBsZW1lbnQgdmFsaWRhdGVEb2NraW5nKCkgZnVuY3Rpb24uICBBY2NvcmRpbmdseSB0aGlzIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGJ1dCB0aHJvd3MgYW4gZXhjZXB0aW9uIGFzIGl0IHNob3VsZFxyXG4gICAgLy8gbmV2ZXIgYmUgY2FsbGVkXHJcbiAgICB2YWxpZGF0ZURvY2tpbmcoKTogdm9pZCB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdHSVZEODc3MzInKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBbGxDb250ZW50SXRlbXMoKTogQ29udGVudEl0ZW1bXSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBDb250ZW50SXRlbVtdID0gW3RoaXNdO1xyXG4gICAgICAgIHRoaXMuZGVlcEdldEFsbENvbnRlbnRJdGVtcyh0aGlzLmNvbnRlbnRJdGVtcywgcmVzdWx0KTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGdldEFsbENvbXBvbmVudEl0ZW1zKCk6IENvbXBvbmVudEl0ZW1bXSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBDb250ZW50SXRlbVtdID0gW107XHJcbiAgICAgICAgdGhpcy5kZWVwRmlsdGVyQ29udGVudEl0ZW1zKHRoaXMuY29udGVudEl0ZW1zLCByZXN1bHQsIChpdGVtKSA9PiBpdGVtLmlzQ29tcG9uZW50KTtcclxuICAgICAgICByZXR1cm4gPENvbXBvbmVudEl0ZW1bXT5yZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29uZmlnTWF4aW1pc2VkSXRlbXMoKTogQ29udGVudEl0ZW1bXSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBDb250ZW50SXRlbVtdID0gW107XHJcbiAgICAgICAgdGhpcy5kZWVwRmlsdGVyQ29udGVudEl0ZW1zKHRoaXMuY29udGVudEl0ZW1zLCByZXN1bHQsIChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChDb250ZW50SXRlbS5pc1N0YWNrKGl0ZW0pICYmIGl0ZW0uaW5pdGlhbFdhbnRNYXhpbWlzZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoQ29udGVudEl0ZW0uaXNDb21wb25lbnRJdGVtKGl0ZW0pICYmIGl0ZW0uaW5pdGlhbFdhbnRNYXhpbWlzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRJdGVtc0J5UG9wSW5QYXJlbnRJZChwb3BJblBhcmVudElkOiBzdHJpbmcpOiBDb250ZW50SXRlbVtdIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IENvbnRlbnRJdGVtW10gPSBbXTtcclxuICAgICAgICB0aGlzLmRlZXBGaWx0ZXJDb250ZW50SXRlbXModGhpcy5jb250ZW50SXRlbXMsIHJlc3VsdCwgKGl0ZW0pID0+IGl0ZW0ucG9wSW5QYXJlbnRJZHMuaW5jbHVkZXMocG9wSW5QYXJlbnRJZCkpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgdG9Db25maWcoKTogUmVzb2x2ZWRJdGVtQ29uZmlnIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZW5lcmF0ZSBHcm91bmRJdGVtIGNvbmZpZycpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIHNldEFjdGl2ZUNvbXBvbmVudEl0ZW0oaXRlbTogQ29tcG9uZW50SXRlbSwgZm9jdXM6IGJvb2xlYW4sIHN1cHByZXNzRm9jdXNFdmVudDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIC8vIG9ubHkgYXBwbGljYWJsZSBpZiBDb21wb25lbnRJdGVtIGlzIHJvb3QgYW5kIHRoZW4gaXQgYWx3YXlzIGhhcyBmb2N1c1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlTm9kZVNpemUoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBnZXRFbGVtZW50V2lkdGhBbmRIZWlnaHQodGhpcy5fY29udGFpbmVyRWxlbWVudCk7XHJcblxyXG4gICAgICAgIHNldEVsZW1lbnRXaWR0aCh0aGlzLmVsZW1lbnQsIHdpZHRoKTtcclxuICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHRoaXMuZWxlbWVudCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgLypcclxuICAgICAgICAgKiBHcm91bmRJdGVtIGNhbiBiZSBlbXB0eVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHNldEVsZW1lbnRXaWR0aCh0aGlzLmNvbnRlbnRJdGVtc1swXS5lbGVtZW50LCB3aWR0aCk7XHJcbiAgICAgICAgICAgIHNldEVsZW1lbnRIZWlnaHQodGhpcy5jb250ZW50SXRlbXNbMF0uZWxlbWVudCwgaGVpZ2h0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBkZWVwR2V0QWxsQ29udGVudEl0ZW1zKGNvbnRlbnQ6IHJlYWRvbmx5IENvbnRlbnRJdGVtW10sIHJlc3VsdDogQ29udGVudEl0ZW1bXSk6IHZvaWQge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IGNvbnRlbnRbaV07XHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvbnRlbnRJdGVtKTtcclxuICAgICAgICAgICAgdGhpcy5kZWVwR2V0QWxsQ29udGVudEl0ZW1zKGNvbnRlbnRJdGVtLmNvbnRlbnRJdGVtcywgcmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBkZWVwRmlsdGVyQ29udGVudEl0ZW1zKGNvbnRlbnQ6IHJlYWRvbmx5IENvbnRlbnRJdGVtW10sIHJlc3VsdDogQ29udGVudEl0ZW1bXSxcclxuICAgICAgICBjaGVja0FjY2VwdEZ0bjogKCh0aGlzOiB2b2lkLCBpdGVtOiBDb250ZW50SXRlbSkgPT4gYm9vbGVhbilcclxuICAgICk6IHZvaWQge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IGNvbnRlbnRbaV07XHJcbiAgICAgICAgICAgIGlmIChjaGVja0FjY2VwdEZ0bihjb250ZW50SXRlbSkpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvbnRlbnRJdGVtKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmRlZXBGaWx0ZXJDb250ZW50SXRlbXMoY29udGVudEl0ZW0uY29udGVudEl0ZW1zLCByZXN1bHQsIGNoZWNrQWNjZXB0RnRuKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgR3JvdW5kSXRlbSB7XHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIEFyZWEgZXh0ZW5kcyBDb250ZW50SXRlbS5BcmVhIHtcclxuICAgICAgICBzaWRlOiBrZXlvZiB0eXBlb2YgQXJlYS5TaWRlO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBuYW1lc3BhY2UgQXJlYSB7XHJcbiAgICAgICAgZXhwb3J0IGNvbnN0IGVudW0gU2lkZSB7XHJcbiAgICAgICAgICAgIHkyLFxyXG4gICAgICAgICAgICB4MixcclxuICAgICAgICAgICAgeTEsXHJcbiAgICAgICAgICAgIHgxLFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZXhwb3J0IHR5cGUgU2lkZXMgPSB7IFtzaWRlIGluIGtleW9mIHR5cGVvZiBTaWRlXToga2V5b2YgdHlwZW9mIFNpZGU7IH1cclxuXHJcbiAgICAgICAgZXhwb3J0IGNvbnN0IG9wcG9zaXRlU2lkZXM6IFNpZGVzID0ge1xyXG4gICAgICAgICAgICB5MjogJ3kxJyxcclxuICAgICAgICAgICAgeDI6ICd4MScsXHJcbiAgICAgICAgICAgIHkxOiAneTInLFxyXG4gICAgICAgICAgICB4MTogJ3gyJyxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KGRvY3VtZW50OiBEb2N1bWVudCk6IEhUTUxEaXZFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuR29sZGVuTGF5b3V0KTtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5JdGVtKTtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Sb290KTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBDb21wb25lbnRJdGVtQ29uZmlnLCBJdGVtQ29uZmlnLCBSb3dPckNvbHVtbkl0ZW1Db25maWcsIFN0YWNrSXRlbUNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9jb25maWcnXHJcbmltcG9ydCB7IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLCBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9yZXNvbHZlZC1jb25maWcnXHJcbmltcG9ydCB7IFNwbGl0dGVyIH0gZnJvbSAnLi4vY29udHJvbHMvc3BsaXR0ZXInXHJcbmltcG9ydCB7IEFzc2VydEVycm9yLCBVbmV4cGVjdGVkTnVsbEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJ1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi4vbGF5b3V0LW1hbmFnZXInXHJcbmltcG9ydCB7IERvbUNvbnN0YW50cyB9IGZyb20gJy4uL3V0aWxzL2RvbS1jb25zdGFudHMnXHJcbmltcG9ydCB7IEl0ZW1UeXBlLCBKc29uVmFsdWUsIFNpemVVbml0RW51bSwgV2lkdGhPckhlaWdodFByb3BlcnR5TmFtZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJ1xyXG5pbXBvcnQge1xyXG4gICAgZ2V0RWxlbWVudEhlaWdodCxcclxuICAgIGdldEVsZW1lbnRXaWR0aCxcclxuICAgIGdldEVsZW1lbnRXaWR0aEFuZEhlaWdodCxcclxuICAgIG51bWJlclRvUGl4ZWxzLFxyXG4gICAgcGl4ZWxzVG9OdW1iZXIsXHJcbiAgICBzZXRFbGVtZW50SGVpZ2h0LFxyXG4gICAgc2V0RWxlbWVudFdpZHRoXHJcbn0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCJcclxuaW1wb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4vY29tcG9uZW50LWl0ZW0nXHJcbmltcG9ydCB7IENvbnRlbnRJdGVtIH0gZnJvbSAnLi9jb250ZW50LWl0ZW0nXHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY2xhc3MgUm93T3JDb2x1bW4gZXh0ZW5kcyBDb250ZW50SXRlbSB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jaGlsZEVsZW1lbnRDb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29uZmlnVHlwZTogJ3JvdycgfCAnY29sdW1uJztcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2lzQ29sdW1uOiBib29sZWFuO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfc3BsaXR0ZXJTaXplOiBudW1iZXI7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zcGxpdHRlckdyYWJTaXplOiBudW1iZXI7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kaW1lbnNpb246IFdpZHRoT3JIZWlnaHRQcm9wZXJ0eU5hbWU7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zcGxpdHRlcjogU3BsaXR0ZXJbXSA9IFtdO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfc3BsaXR0ZXJQb3NpdGlvbjogbnVtYmVyIHwgbnVsbDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3NwbGl0dGVyTWluUG9zaXRpb246IG51bWJlciB8IG51bGw7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9zcGxpdHRlck1heFBvc2l0aW9uOiBudW1iZXIgfCBudWxsO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKGlzQ29sdW1uOiBib29sZWFuLCBsYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLCBjb25maWc6IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9yb3dPckNvbHVtblBhcmVudDogQ29udGVudEl0ZW1cclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKGxheW91dE1hbmFnZXIsIGNvbmZpZywgX3Jvd09yQ29sdW1uUGFyZW50LCBSb3dPckNvbHVtbi5jcmVhdGVFbGVtZW50KGRvY3VtZW50LCBpc0NvbHVtbikpO1xyXG5cclxuICAgICAgICB0aGlzLmlzUm93ID0gIWlzQ29sdW1uO1xyXG4gICAgICAgIHRoaXMuaXNDb2x1bW4gPSBpc0NvbHVtbjtcclxuXHJcbiAgICAgICAgdGhpcy5fY2hpbGRFbGVtZW50Q29udGFpbmVyID0gdGhpcy5lbGVtZW50O1xyXG4gICAgICAgIHRoaXMuX3NwbGl0dGVyU2l6ZSA9IGxheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLmRpbWVuc2lvbnMuYm9yZGVyV2lkdGg7XHJcbiAgICAgICAgdGhpcy5fc3BsaXR0ZXJHcmFiU2l6ZSA9IGxheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLmRpbWVuc2lvbnMuYm9yZGVyR3JhYldpZHRoO1xyXG4gICAgICAgIHRoaXMuX2lzQ29sdW1uID0gaXNDb2x1bW47XHJcbiAgICAgICAgdGhpcy5fZGltZW5zaW9uID0gaXNDb2x1bW4gPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XHJcbiAgICAgICAgdGhpcy5fc3BsaXR0ZXJQb3NpdGlvbiA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fc3BsaXR0ZXJNaW5Qb3NpdGlvbiA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fc3BsaXR0ZXJNYXhQb3NpdGlvbiA9IG51bGw7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoY29uZmlnLnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29sdW1uOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fY29uZmlnVHlwZSA9IGNvbmZpZy50eXBlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ1JPQ0NDVDAwOTI1Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5ld0NvbXBvbmVudChjb21wb25lbnRUeXBlOiBKc29uVmFsdWUsIGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlLCB0aXRsZT86IHN0cmluZywgaW5kZXg/OiBudW1iZXIpOiBDb21wb25lbnRJdGVtIHtcclxuICAgICAgICBjb25zdCBpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiAnY29tcG9uZW50JyxcclxuICAgICAgICAgICAgY29tcG9uZW50VHlwZSxcclxuICAgICAgICAgICAgY29tcG9uZW50U3RhdGUsXHJcbiAgICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmV3SXRlbShpdGVtQ29uZmlnLCBpbmRleCkgYXMgQ29tcG9uZW50SXRlbTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRDb21wb25lbnQoY29tcG9uZW50VHlwZTogSnNvblZhbHVlLCBjb21wb25lbnRTdGF0ZT86IEpzb25WYWx1ZSwgdGl0bGU/OiBzdHJpbmcsIGluZGV4PzogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCBpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiAnY29tcG9uZW50JyxcclxuICAgICAgICAgICAgY29tcG9uZW50VHlwZSxcclxuICAgICAgICAgICAgY29tcG9uZW50U3RhdGUsXHJcbiAgICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkSXRlbShpdGVtQ29uZmlnLCBpbmRleCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmV3SXRlbShpdGVtQ29uZmlnOiBSb3dPckNvbHVtbkl0ZW1Db25maWcgfCBTdGFja0l0ZW1Db25maWcgfCBDb21wb25lbnRJdGVtQ29uZmlnLCAgaW5kZXg/OiBudW1iZXIpOiBDb250ZW50SXRlbSB7XHJcbiAgICAgICAgaW5kZXggPSB0aGlzLmFkZEl0ZW0oaXRlbUNvbmZpZywgaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGNyZWF0ZWRJdGVtID0gdGhpcy5jb250ZW50SXRlbXNbaW5kZXhdO1xyXG5cclxuICAgICAgICBpZiAoQ29udGVudEl0ZW0uaXNTdGFjayhjcmVhdGVkSXRlbSkgJiYgKEl0ZW1Db25maWcuaXNDb21wb25lbnQoaXRlbUNvbmZpZykpKSB7XHJcbiAgICAgICAgICAgIC8vIGNyZWF0ZWRJdGVtIGlzIGEgU3RhY2sgd2hpY2ggd2FzIGNyZWF0ZWQgdG8gaG9sZCB3YW50ZWQgY29tcG9uZW50LiAgUmV0dXJuIGNvbXBvbmVudFxyXG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlZEl0ZW0uY29udGVudEl0ZW1zWzBdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVkSXRlbTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYWRkSXRlbShpdGVtQ29uZmlnOiBSb3dPckNvbHVtbkl0ZW1Db25maWcgfCBTdGFja0l0ZW1Db25maWcgfCBDb21wb25lbnRJdGVtQ29uZmlnLFxyXG4gICAgICAgIGluZGV4PzogbnVtYmVyXHJcbiAgICApOiBudW1iZXIge1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5jaGVja01pbmltaXNlTWF4aW1pc2VkU3RhY2soKTtcclxuICAgICAgICBjb25zdCByZXNvbHZlZEl0ZW1Db25maWcgPSBJdGVtQ29uZmlnLnJlc29sdmUoaXRlbUNvbmZpZywgZmFsc2UpO1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmNyZWF0ZUFuZEluaXRDb250ZW50SXRlbShyZXNvbHZlZEl0ZW1Db25maWcsIHRoaXMpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZENoaWxkKGNvbnRlbnRJdGVtLCBpbmRleCwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkIGEgbmV3IGNvbnRlbnRJdGVtIHRvIHRoZSBSb3cgb3IgQ29sdW1uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNvbnRlbnRJdGVtIC1cclxuICAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBwb3NpdGlvbiBvZiB0aGUgbmV3IGl0ZW0gd2l0aGluIHRoZSBSb3cgb3IgQ29sdW1uLlxyXG4gICAgICogICAgICAgICAgICAgICAgSWYgbm8gaW5kZXggaXMgcHJvdmlkZWQgdGhlIGl0ZW0gd2lsbCBiZSBhZGRlZCB0byB0aGUgZW5kXHJcbiAgICAgKiBAcGFyYW0gc3VzcGVuZFJlc2l6ZSAtIElmIHRydWUgdGhlIGl0ZW1zIHdvbid0IGJlIHJlc2l6ZWQuIFRoaXMgd2lsbCBsZWF2ZSB0aGUgaXRlbSBpblxyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBhbiBpbmNvbnNpc3RlbnQgc3RhdGUgYW5kIGlzIG9ubHkgaW50ZW5kZWQgdG8gYmUgdXNlZCBpZiBtdWx0aXBsZVxyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiBuZWVkIHRvIGJlIGFkZGVkIGluIG9uZSBnbyBhbmQgcmVzaXplIGlzIGNhbGxlZCBhZnRlcndhcmRzXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgb3ZlcnJpZGUgYWRkQ2hpbGQoY29udGVudEl0ZW06IENvbnRlbnRJdGVtLCBpbmRleD86IG51bWJlciwgc3VzcGVuZFJlc2l6ZT86IGJvb2xlYW4pOiBudW1iZXIge1xyXG5cclxuICAgICAgICAvLyBjb250ZW50SXRlbSA9IHRoaXMubGF5b3V0TWFuYWdlci5fJG5vcm1hbGl6ZUNvbnRlbnRJdGVtKGNvbnRlbnRJdGVtLCB0aGlzKTtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaW5kZXggPSB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBzcGxpdHRlckVsZW1lbnQgPSB0aGlzLmNyZWF0ZVNwbGl0dGVyKE1hdGgubWF4KDAsIGluZGV4IC0gMSkpLmVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoaW5kZXggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRJdGVtc1tpbmRleCAtIDFdLmVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIHNwbGl0dGVyRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICBzcGxpdHRlckVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIGNvbnRlbnRJdGVtLmVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50SXRlbXNbMF0uZWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2JlZm9yZWJlZ2luJywgc3BsaXR0ZXJFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIHNwbGl0dGVyRWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2JlZm9yZWJlZ2luJywgY29udGVudEl0ZW0uZWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIuYXBwZW5kQ2hpbGQoY29udGVudEl0ZW0uZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdXBlci5hZGRDaGlsZChjb250ZW50SXRlbSwgaW5kZXgpO1xyXG5cclxuICAgICAgICBjb25zdCBuZXdJdGVtU2l6ZSA9ICgxIC8gdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoKSAqIDEwMDtcclxuXHJcbiAgICAgICAgaWYgKHN1c3BlbmRSZXNpemUgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ3N0YXRlQ2hhbmdlZCcpO1xyXG4gICAgICAgICAgICByZXR1cm4gaW5kZXg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ZWRDb250ZW50SXRlbSA9IHRoaXMuY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICBpZiAoaW5kZXhlZENvbnRlbnRJdGVtID09PSBjb250ZW50SXRlbSkge1xyXG4gICAgICAgICAgICAgICAgY29udGVudEl0ZW0uc2l6ZSA9IG5ld0l0ZW1TaXplO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbVNpemUgPSBpbmRleGVkQ29udGVudEl0ZW0uc2l6ZSAqPSAoMTAwIC0gbmV3SXRlbVNpemUpIC8gMTAwO1xyXG4gICAgICAgICAgICAgICAgaW5kZXhlZENvbnRlbnRJdGVtLnNpemUgPSBpdGVtU2l6ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnc3RhdGVDaGFuZ2VkJyk7XHJcblxyXG4gICAgICAgIHJldHVybiBpbmRleDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYSBjaGlsZCBvZiB0aGlzIGVsZW1lbnRcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY29udGVudEl0ZW0gLVxyXG4gICAgICogQHBhcmFtIGtlZXBDaGlsZCAtIElmIHRydWUgdGhlIGNoaWxkIHdpbGwgYmUgcmVtb3ZlZCwgYnV0IG5vdCBkZXN0cm95ZWRcclxuICAgICAqXHJcbiAgICAgKi9cclxuICAgIG92ZXJyaWRlIHJlbW92ZUNoaWxkKGNvbnRlbnRJdGVtOiBDb250ZW50SXRlbSwga2VlcENoaWxkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmNvbnRlbnRJdGVtcy5pbmRleE9mKGNvbnRlbnRJdGVtKTtcclxuICAgICAgICBjb25zdCBzcGxpdHRlckluZGV4ID0gTWF0aC5tYXgoaW5kZXggLSAxLCAwKTtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgcmVtb3ZlIGNoaWxkLiBDb250ZW50SXRlbSBpcyBub3QgY2hpbGQgb2YgdGhpcyBSb3cgb3IgQ29sdW1uJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBSZW1vdmUgdGhlIHNwbGl0dGVyIGJlZm9yZSB0aGUgaXRlbSBvciBhZnRlciBpZiB0aGUgaXRlbSBoYXBwZW5zXHJcbiAgICAgICAgICogdG8gYmUgdGhlIGZpcnN0IGluIHRoZSByb3cvY29sdW1uXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKHRoaXMuX3NwbGl0dGVyW3NwbGl0dGVySW5kZXhdKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NwbGl0dGVyW3NwbGl0dGVySW5kZXhdLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgdGhpcy5fc3BsaXR0ZXIuc3BsaWNlKHNwbGl0dGVySW5kZXgsIDEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3VwZXIucmVtb3ZlQ2hpbGQoY29udGVudEl0ZW0sIGtlZXBDaGlsZCk7XHJcblxyXG4gICAgICAgIC8vIGlmICh0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggPT09IDEgJiYgdGhpcy5pc0Nsb3NhYmxlID09PSB0cnVlKSB7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGNoaWxkSXRlbSA9IHRoaXMuY29udGVudEl0ZW1zWzBdO1xyXG4gICAgICAgIC8vICAgICB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggPSAwO1xyXG4gICAgICAgIC8vICAgICB0aGlzLl9yb3dPckNvbHVtblBhcmVudC5yZXBsYWNlQ2hpbGQodGhpcywgY2hpbGRJdGVtLCB0cnVlKTtcclxuICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2l6ZShmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ3N0YXRlQ2hhbmdlZCcpO1xyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlcGxhY2VzIGEgY2hpbGQgb2YgdGhpcyBSb3cgb3IgQ29sdW1uIHdpdGggYW5vdGhlciBjb250ZW50SXRlbVxyXG4gICAgICovXHJcbiAgICBvdmVycmlkZSByZXBsYWNlQ2hpbGQob2xkQ2hpbGQ6IENvbnRlbnRJdGVtLCBuZXdDaGlsZDogQ29udGVudEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzaXplID0gb2xkQ2hpbGQuc2l6ZTtcclxuICAgICAgICBzdXBlci5yZXBsYWNlQ2hpbGQob2xkQ2hpbGQsIG5ld0NoaWxkKTtcclxuICAgICAgICBuZXdDaGlsZC5zaXplID0gc2l6ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuZW1pdEJhc2VCdWJibGluZ0V2ZW50KCdzdGF0ZUNoYW5nZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCB3aGVuZXZlciB0aGUgZGltZW5zaW9ucyBvZiB0aGlzIGl0ZW0gb3Igb25lIG9mIGl0cyBwYXJlbnRzIGNoYW5nZVxyXG4gICAgICovXHJcbiAgICBvdmVycmlkZSB1cGRhdGVTaXplKGZvcmNlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmJlZ2luVmlydHVhbFNpemVkQ29udGFpbmVyQWRkaW5nKCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVOb2RlU2l6ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnRlbnRJdGVtc1NpemUoZm9yY2UpO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5lbmRWaXJ0dWFsU2l6ZWRDb250YWluZXJBZGRpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZva2VkIHJlY3Vyc2l2ZWx5IGJ5IHRoZSBsYXlvdXQgbWFuYWdlci4gQ29udGVudEl0ZW0uaW5pdCBhcHBlbmRzXHJcbiAgICAgKiB0aGUgY29udGVudEl0ZW0ncyBET00gZWxlbWVudHMgdG8gdGhlIGNvbnRhaW5lciwgUm93T3JDb2x1bW4gaW5pdCBhZGRzIHNwbGl0dGVyc1xyXG4gICAgICogaW4gYmV0d2VlbiB0aGVtXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgb3ZlcnJpZGUgaW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pc0luaXRpYWxpc2VkID09PSB0cnVlKSByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlTm9kZVNpemUoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50SXRlbXNbaV0uZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdXBlci5pbml0KCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoIC0gMTsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGVudEl0ZW1zW2ldLmVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIHRoaXMuY3JlYXRlU3BsaXR0ZXIoaSkuZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmluaXRDb250ZW50SXRlbXMoKTtcclxuICAgIH1cclxuXHJcbiAgICB0b0NvbmZpZygpOiBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlIGFzICdyb3cnIHwgJ2NvbHVtbicsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IHRoaXMuY2FsY3VsYXRlQ29uZmlnQ29udGVudCgpIGFzIChSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnKVtdLFxyXG4gICAgICAgICAgICBzaXplOiB0aGlzLnNpemUsXHJcbiAgICAgICAgICAgIHNpemVVbml0OiB0aGlzLnNpemVVbml0LFxyXG4gICAgICAgICAgICBtaW5TaXplOiB0aGlzLm1pblNpemUsXHJcbiAgICAgICAgICAgIG1pblNpemVVbml0OiB0aGlzLm1pblNpemVVbml0LFxyXG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogdGhpcy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBzZXRQYXJlbnQocGFyZW50OiBDb250ZW50SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3Jvd09yQ29sdW1uUGFyZW50ID0gcGFyZW50O1xyXG4gICAgICAgIHN1cGVyLnNldFBhcmVudChwYXJlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlTm9kZVNpemUoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVSZWxhdGl2ZVNpemVzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0QWJzb2x1dGVTaXplcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnc3RhdGVDaGFuZ2VkJyk7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdyZXNpemUnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFR1cm5zIHRoZSByZWxhdGl2ZSBzaXplcyBjYWxjdWxhdGVkIGJ5IGNhbGN1bGF0ZVJlbGF0aXZlU2l6ZXMgaW50b1xyXG4gICAgICogYWJzb2x1dGUgcGl4ZWwgdmFsdWVzIGFuZCBhcHBsaWVzIHRoZW0gdG8gdGhlIGNoaWxkcmVuJ3MgRE9NIGVsZW1lbnRzXHJcbiAgICAgKlxyXG4gICAgICogQXNzaWducyBhZGRpdGlvbmFsIHBpeGVscyB0byBjb3VudGVyYWN0IE1hdGguZmxvb3JcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNldEFic29sdXRlU2l6ZXMoKSB7XHJcbiAgICAgICAgY29uc3QgYWJzb2x1dGVTaXplcyA9IHRoaXMuY2FsY3VsYXRlQWJzb2x1dGVTaXplcygpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChhYnNvbHV0ZVNpemVzLmFkZGl0aW9uYWxQaXhlbCAtIGkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBhYnNvbHV0ZVNpemVzLml0ZW1TaXplc1tpXSsrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5faXNDb2x1bW4pIHtcclxuICAgICAgICAgICAgICAgIHNldEVsZW1lbnRXaWR0aCh0aGlzLmNvbnRlbnRJdGVtc1tpXS5lbGVtZW50LCBhYnNvbHV0ZVNpemVzLmNyb3NzQXhpc1NpemUpO1xyXG4gICAgICAgICAgICAgICAgc2V0RWxlbWVudEhlaWdodCh0aGlzLmNvbnRlbnRJdGVtc1tpXS5lbGVtZW50LCBhYnNvbHV0ZVNpemVzLml0ZW1TaXplc1tpXSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzZXRFbGVtZW50V2lkdGgodGhpcy5jb250ZW50SXRlbXNbaV0uZWxlbWVudCwgYWJzb2x1dGVTaXplcy5pdGVtU2l6ZXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgc2V0RWxlbWVudEhlaWdodCh0aGlzLmNvbnRlbnRJdGVtc1tpXS5lbGVtZW50LCBhYnNvbHV0ZVNpemVzLmNyb3NzQXhpc1NpemUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgYWJzb2x1dGUgc2l6ZXMgb2YgYWxsIG9mIHRoZSBjaGlsZHJlbiBvZiB0aGlzIEl0ZW0uXHJcbiAgICAgKiBAcmV0dXJucyBTZXQgd2l0aCBhYnNvbHV0ZSBzaXplcyBhbmQgYWRkaXRpb25hbCBwaXhlbHMuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVBYnNvbHV0ZVNpemVzKCk6IFJvd09yQ29sdW1uLkFic29sdXRlU2l6ZXMge1xyXG4gICAgICAgIGNvbnN0IHRvdGFsU3BsaXR0ZXJTaXplID0gKHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCAtIDEpICogdGhpcy5fc3BsaXR0ZXJTaXplO1xyXG4gICAgICAgIGNvbnN0IHsgd2lkdGg6IGVsZW1lbnRXaWR0aCwgaGVpZ2h0OiBlbGVtZW50SGVpZ2h0IH0gPSBnZXRFbGVtZW50V2lkdGhBbmRIZWlnaHQodGhpcy5lbGVtZW50KTtcclxuXHJcbiAgICAgICAgbGV0IHRvdGFsU2l6ZTogbnVtYmVyO1xyXG4gICAgICAgIGxldCBjcm9zc0F4aXNTaXplOiBudW1iZXI7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzQ29sdW1uKSB7XHJcbiAgICAgICAgICAgIHRvdGFsU2l6ZSA9IGVsZW1lbnRIZWlnaHQgLSB0b3RhbFNwbGl0dGVyU2l6ZTtcclxuICAgICAgICAgICAgY3Jvc3NBeGlzU2l6ZSA9IGVsZW1lbnRXaWR0aDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0b3RhbFNpemUgPSBlbGVtZW50V2lkdGggLSB0b3RhbFNwbGl0dGVyU2l6ZTtcclxuICAgICAgICAgICAgY3Jvc3NBeGlzU2l6ZSA9IGVsZW1lbnRIZWlnaHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdG90YWxBc3NpZ25lZCA9IDA7XHJcbiAgICAgICAgY29uc3QgaXRlbVNpemVzOiBudW1iZXJbXSA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gdGhpcy5jb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgIGxldCBpdGVtU2l6ZTogbnVtYmVyO1xyXG4gICAgICAgICAgICBpZiAoY29udGVudEl0ZW0uc2l6ZVVuaXQgPT09IFNpemVVbml0RW51bS5QZXJjZW50KSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtU2l6ZSA9IE1hdGguZmxvb3IodG90YWxTaXplICogKGNvbnRlbnRJdGVtLnNpemUgLyAxMDApKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignUk9DQ0FTNjY5MicpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0b3RhbEFzc2lnbmVkICs9IGl0ZW1TaXplO1xyXG4gICAgICAgICAgICBpdGVtU2l6ZXMucHVzaChpdGVtU2l6ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsUGl4ZWwgPSBNYXRoLmZsb29yKHRvdGFsU2l6ZSAtIHRvdGFsQXNzaWduZWQpO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBpdGVtU2l6ZXMsXHJcbiAgICAgICAgICAgIGFkZGl0aW9uYWxQaXhlbCxcclxuICAgICAgICAgICAgdG90YWxTaXplLFxyXG4gICAgICAgICAgICBjcm9zc0F4aXNTaXplLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSByZWxhdGl2ZSBzaXplcyBvZiBhbGwgY2hpbGRyZW4gb2YgdGhpcyBJdGVtLiBUaGUgbG9naWNcclxuICAgICAqIGlzIGFzIGZvbGxvd3M6XHJcbiAgICAgKlxyXG4gICAgICogLSBBZGQgdXAgdGhlIHRvdGFsIHNpemUgb2YgYWxsIGl0ZW1zIHRoYXQgaGF2ZSBhIGNvbmZpZ3VyZWQgc2l6ZVxyXG4gICAgICpcclxuICAgICAqIC0gSWYgdGhlIHRvdGFsID09IDEwMCAoY2hlY2sgZm9yIGZsb2F0aW5nIHBvaW50IGVycm9ycylcclxuICAgICAqICAgICAgICBFeGNlbGxlbnQsIGpvYiBkb25lXHJcbiAgICAgKlxyXG4gICAgICogLSBJZiB0aGUgdG90YWwgaXMgXFw+IDEwMCxcclxuICAgICAqICAgICAgICBzZXQgdGhlIHNpemUgb2YgaXRlbXMgd2l0aG91dCBzZXQgZGltZW5zaW9ucyB0byAxLzMgYW5kIGFkZCB0aGlzIHRvIHRoZSB0b3RhbFxyXG4gICAgICogICAgICAgIHNldCB0aGUgc2l6ZSBvZmYgYWxsIGl0ZW1zIHNvIHRoYXQgdGhlIHRvdGFsIGlzIGh1bmRyZWQgcmVsYXRpdmUgdG8gdGhlaXIgb3JpZ2luYWwgc2l6ZVxyXG4gICAgICpcclxuICAgICAqIC0gSWYgdGhlIHRvdGFsIGlzIFxcPCAxMDBcclxuICAgICAqICAgICAgICBJZiB0aGVyZSBhcmUgaXRlbXMgd2l0aG91dCBzZXQgZGltZW5zaW9ucywgZGlzdHJpYnV0ZSB0aGUgcmVtYWluZGVyIHRvIDEwMCBldmVubHkgYmV0d2VlbiB0aGVtXHJcbiAgICAgKiAgICAgICAgSWYgdGhlcmUgYXJlIG5vIGl0ZW1zIHdpdGhvdXQgc2V0IGRpbWVuc2lvbnMsIGluY3JlYXNlIGFsbCBpdGVtcyBzaXplcyByZWxhdGl2ZSB0b1xyXG4gICAgICogICAgICAgIHRoZWlyIG9yaWdpbmFsIHNpemUgc28gdGhhdCB0aGV5IGFkZCB1cCB0byAxMDBcclxuICAgICAqXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVSZWxhdGl2ZVNpemVzKCkge1xyXG5cclxuICAgICAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgICAgIGNvbnN0IGl0ZW1zV2l0aEZyYWN0aW9uYWxTaXplOiBDb250ZW50SXRlbVtdID0gW107XHJcbiAgICAgICAgbGV0IHRvdGFsRnJhY3Rpb25hbFNpemUgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gdGhpcy5jb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IHNpemVVbml0ID0gY29udGVudEl0ZW0uc2l6ZVVuaXQ7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoc2l6ZVVuaXQpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgU2l6ZVVuaXRFbnVtLlBlcmNlbnQ6IHtcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSBjb250ZW50SXRlbS5zaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2FzZSBTaXplVW5pdEVudW0uRnJhY3Rpb25hbDoge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zV2l0aEZyYWN0aW9uYWxTaXplLnB1c2goY29udGVudEl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsRnJhY3Rpb25hbFNpemUgKz0gY29udGVudEl0ZW0uc2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdST0NDUlM0OTExMCcsIEpTT04uc3RyaW5naWZ5KGNvbnRlbnRJdGVtKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEV2ZXJ5dGhpbmcgYWRkcyB1cCB0byBodW5kcmVkLCBhbGwgZ29vZCA6LSlcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoTWF0aC5yb3VuZCh0b3RhbCkgPT09IDEwMCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlc3BlY3RNaW5JdGVtU2l6ZSgpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIEFsbG9jYXRlIHRoZSByZW1haW5pbmcgc2l6ZSB0byB0aGUgaXRlbXMgd2l0aCBhIGZyYWN0aW9uYWwgc2l6ZVxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgaWYgKE1hdGgucm91bmQodG90YWwpIDwgMTAwICYmIGl0ZW1zV2l0aEZyYWN0aW9uYWxTaXplLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZyYWN0aW9uYWxBbGxvY2F0ZWRTaXplID0gMTAwIC0gdG90YWw7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zV2l0aEZyYWN0aW9uYWxTaXplLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSBpdGVtc1dpdGhGcmFjdGlvbmFsU2l6ZVtpXTtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50SXRlbS5zaXplID0gZnJhY3Rpb25hbEFsbG9jYXRlZFNpemUgKiAoY29udGVudEl0ZW0uc2l6ZSAvIHRvdGFsRnJhY3Rpb25hbFNpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemVVbml0ID0gU2l6ZVVuaXRFbnVtLlBlcmNlbnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3BlY3RNaW5JdGVtU2l6ZSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogSWYgdGhlIHRvdGFsIGlzID4gMTAwLCBidXQgdGhlcmUgYXJlIGFsc28gaXRlbXMgd2l0aCBhIGZyYWN0aW9uYWwgc2l6ZSwgYXNzaWduIGFub3RoZXIgNTAlXHJcbiAgICAgICAgICAgICAgICAgKiB0byB0aGUgZnJhY3Rpb25hbCBpdGVtc1xyXG4gICAgICAgICAgICAgICAgICpcclxuICAgICAgICAgICAgICAgICAqIFRoaXMgd2lsbCBiZSByZXNldCBpbiB0aGUgbmV4dCBzdGVwXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGlmIChNYXRoLnJvdW5kKHRvdGFsKSA+IDEwMCAmJiBpdGVtc1dpdGhGcmFjdGlvbmFsU2l6ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtc1dpdGhGcmFjdGlvbmFsU2l6ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IGl0ZW1zV2l0aEZyYWN0aW9uYWxTaXplW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50SXRlbS5zaXplID0gNTAgKiAoY29udGVudEl0ZW0uc2l6ZSAvIHRvdGFsRnJhY3Rpb25hbFNpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50SXRlbS5zaXplVW5pdCA9IFNpemVVbml0RW51bS5QZXJjZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSA1MDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIFNldCBldmVyeSBpdGVtcyBzaXplIHJlbGF0aXZlIHRvIDEwMCByZWxhdGl2ZSB0byBpdHMgc2l6ZSB0byB0b3RhbFxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSB0aGlzLmNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50SXRlbS5zaXplID0gKGNvbnRlbnRJdGVtLnNpemUgLyB0b3RhbCkgKiAxMDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNwZWN0TWluSXRlbVNpemUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkanVzdHMgdGhlIGNvbHVtbiB3aWR0aHMgdG8gcmVzcGVjdCB0aGUgZGltZW5zaW9ucyBtaW5JdGVtV2lkdGggaWYgc2V0LlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmVzcGVjdE1pbkl0ZW1TaXplKCkge1xyXG4gICAgICAgIGludGVyZmFjZSBFbnRyeSB7XHJcbiAgICAgICAgICAgIHNpemU6IG51bWJlcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG1pbkl0ZW1TaXplID0gdGhpcy5jYWxjdWxhdGVDb250ZW50SXRlbU1pblNpemUodGhpcyk7XHJcblxyXG4gICAgICAgIGlmIChtaW5JdGVtU2l6ZSA8PSAwIHx8IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCA8PSAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgdG90YWxPdmVyTWluID0gMDtcclxuICAgICAgICAgICAgbGV0IHRvdGFsVW5kZXJNaW4gPSAwO1xyXG4gICAgICAgICAgICBjb25zdCBlbnRyaWVzT3Zlck1pbjogRW50cnlbXSA9IFtdO1xyXG4gICAgICAgICAgICBjb25zdCBhbGxFbnRyaWVzOiBFbnRyeVtdID0gW107XHJcblxyXG4gICAgICAgICAgICBjb25zdCBhYnNvbHV0ZVNpemVzID0gdGhpcy5jYWxjdWxhdGVBYnNvbHV0ZVNpemVzKCk7XHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogRmlndXJlIG91dCBob3cgbXVjaCB3ZSBhcmUgdW5kZXIgdGhlIG1pbiBpdGVtIHNpemUgdG90YWwgYW5kIGhvdyBtdWNoIHJvb20gd2UgaGF2ZSB0byB1c2UuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFic29sdXRlU2l6ZXMuaXRlbVNpemVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtU2l6ZSA9IGFic29sdXRlU2l6ZXMuaXRlbVNpemVzW2ldO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBlbnRyeTogRW50cnk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbVNpemUgPCBtaW5JdGVtU2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsVW5kZXJNaW4gKz0gbWluSXRlbVNpemUgLSBpdGVtU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogbWluSXRlbVNpemVcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWxPdmVyTWluICs9IGl0ZW1TaXplIC0gbWluSXRlbVNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgZW50cnkgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IGl0ZW1TaXplXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICBlbnRyaWVzT3Zlck1pbi5wdXNoKGVudHJ5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBhbGxFbnRyaWVzLnB1c2goZW50cnkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogSWYgdGhlcmUgaXMgbm90aGluZyB1bmRlciBtaW4sIG9yIHRoZXJlIGlzIG5vdCBlbm91Z2ggb3ZlciB0byBtYWtlIHVwIHRoZSBkaWZmZXJlbmNlLCBkbyBub3RoaW5nLlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgaWYgKHRvdGFsVW5kZXJNaW4gPT09IDAgfHwgdG90YWxVbmRlck1pbiA+IHRvdGFsT3Zlck1pbikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBFdmVubHkgcmVkdWNlIGFsbCBjb2x1bW5zIHRoYXQgYXJlIG92ZXIgdGhlIG1pbiBpdGVtIHdpZHRoIHRvIG1ha2UgdXAgdGhlIGRpZmZlcmVuY2UuXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZHVjZVBlcmNlbnQgPSB0b3RhbFVuZGVyTWluIC8gdG90YWxPdmVyTWluO1xyXG4gICAgICAgICAgICAgICAgbGV0IHJlbWFpbmluZ1NpemUgPSB0b3RhbFVuZGVyTWluO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzT3Zlck1pbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc092ZXJNaW5baV07XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVkdWNlZFNpemUgPSBNYXRoLnJvdW5kKChlbnRyeS5zaXplIC0gbWluSXRlbVNpemUpICogcmVkdWNlUGVyY2VudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nU2l6ZSAtPSByZWR1Y2VkU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBlbnRyeS5zaXplIC09IHJlZHVjZWRTaXplO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogVGFrZSBhbnl0aGluZyByZW1haW5pbmcgZnJvbSB0aGUgbGFzdCBpdGVtLlxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nU2l6ZSAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFsbEVudHJpZXNbYWxsRW50cmllcy5sZW5ndGggLSAxXS5zaXplIC09IHJlbWFpbmluZ1NpemU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBTZXQgZXZlcnkgaXRlbXMgc2l6ZSByZWxhdGl2ZSB0byAxMDAgcmVsYXRpdmUgdG8gaXRzIHNpemUgdG8gdG90YWxcclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gdGhpcy5jb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEl0ZW0uc2l6ZSA9IChhbGxFbnRyaWVzW2ldLnNpemUgLyBhYnNvbHV0ZVNpemVzLnRvdGFsU2l6ZSkgKiAxMDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnN0YW50aWF0ZXMgYSBuZXcgU3BsaXR0ZXIsIGJpbmRzIGV2ZW50cyB0byBpdCBhbmQgYWRkc1xyXG4gICAgICogaXQgdG8gdGhlIGFycmF5IG9mIHNwbGl0dGVycyBhdCB0aGUgcG9zaXRpb24gc3BlY2lmaWVkIGFzIHRoZSBpbmRleCBhcmd1bWVudFxyXG4gICAgICpcclxuICAgICAqIFdoYXQgaXQgZG9lc24ndCBkbyB0aG91Z2ggaXMgYXBwZW5kIHRoZSBzcGxpdHRlciB0byB0aGUgRE9NXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGluZGV4IC0gVGhlIHBvc2l0aW9uIG9mIHRoZSBzcGxpdHRlclxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVTcGxpdHRlcihpbmRleDogbnVtYmVyKTogU3BsaXR0ZXIge1xyXG4gICAgICAgIGNvbnN0IHNwbGl0dGVyID0gbmV3IFNwbGl0dGVyKHRoaXMuX2lzQ29sdW1uLCB0aGlzLl9zcGxpdHRlclNpemUsIHRoaXMuX3NwbGl0dGVyR3JhYlNpemUpO1xyXG4gICAgICAgIHNwbGl0dGVyLm9uKCdkcmFnJywgKG9mZnNldFgsIG9mZnNldFkpID0+IHRoaXMub25TcGxpdHRlckRyYWcoc3BsaXR0ZXIsIG9mZnNldFgsIG9mZnNldFkpKTtcclxuICAgICAgICBzcGxpdHRlci5vbignZHJhZ1N0b3AnLCAoKSA9PiB0aGlzLm9uU3BsaXR0ZXJEcmFnU3RvcChzcGxpdHRlcikpO1xyXG4gICAgICAgIHNwbGl0dGVyLm9uKCdkcmFnU3RhcnQnLCAoKSA9PiB0aGlzLm9uU3BsaXR0ZXJEcmFnU3RhcnQoc3BsaXR0ZXIpKTtcclxuICAgICAgICB0aGlzLl9zcGxpdHRlci5zcGxpY2UoaW5kZXgsIDAsIHNwbGl0dGVyKTtcclxuICAgICAgICByZXR1cm4gc3BsaXR0ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2NhdGVzIHRoZSBpbnN0YW5jZSBvZiBTcGxpdHRlciBpbiB0aGUgYXJyYXkgb2ZcclxuICAgICAqIHJlZ2lzdGVyZWQgc3BsaXR0ZXJzIGFuZCByZXR1cm5zIGEgbWFwIGNvbnRhaW5pbmcgdGhlIGNvbnRlbnRJdGVtXHJcbiAgICAgKiBiZWZvcmUgYW5kIGFmdGVyIHRoZSBzcGxpdHRlcnMsIGJvdGggb2Ygd2hpY2ggYXJlIGFmZmVjdGVkIGlmIHRoZVxyXG4gICAgICogc3BsaXR0ZXIgaXMgbW92ZWRcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBBIG1hcCBvZiBjb250ZW50SXRlbXMgdGhhdCB0aGUgc3BsaXR0ZXIgYWZmZWN0c1xyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0U3BsaXRJdGVtcyhzcGxpdHRlcjogU3BsaXR0ZXIpIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX3NwbGl0dGVyLmluZGV4T2Yoc3BsaXR0ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBiZWZvcmU6IHRoaXMuY29udGVudEl0ZW1zW2luZGV4XSxcclxuICAgICAgICAgICAgYWZ0ZXI6IHRoaXMuY29udGVudEl0ZW1zW2luZGV4ICsgMV1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2FsY3VsYXRlQ29udGVudEl0ZW1NaW5TaXplKGNvbnRlbnRJdGVtOiBDb250ZW50SXRlbSkge1xyXG4gICAgICAgIGNvbnN0IG1pblNpemUgPSBjb250ZW50SXRlbS5taW5TaXplO1xyXG4gICAgICAgIGlmIChtaW5TaXplICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRlbnRJdGVtLm1pblNpemVVbml0ID09PSBTaXplVW5pdEVudW0uUGl4ZWwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBtaW5TaXplO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdST0NHTUQ5ODgzMScsIEpTT04uc3RyaW5naWZ5KGNvbnRlbnRJdGVtKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBkaW1lbnNpb25zID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5kaW1lbnNpb25zO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNDb2x1bW4gPyBkaW1lbnNpb25zLmRlZmF1bHRNaW5JdGVtSGVpZ2h0IDogZGltZW5zaW9ucy5kZWZhdWx0TWluSXRlbVdpZHRoO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIG1pbmltdW0gZGltZW5zaW9ucyBmb3IgdGhlIGdpdmVuIGl0ZW0gdGFraW5nIGl0cyBjaGlsZHJlbiBpbnRvIGNvbnNpZGVyYXRpb24uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVDb250ZW50SXRlbXNUb3RhbE1pblNpemUoY29udGVudEl0ZW06IENvbnRlbnRJdGVtKSB7XHJcbiAgICAgICAgbGV0IGNoaWxkcmVuTWluU2l6ZSA9IDA7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY29udGVudEl0ZW0uY29udGVudEl0ZW1zKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1pblNpemUgPSB0aGlzLmNhbGN1bGF0ZUNvbnRlbnRJdGVtc1RvdGFsTWluU2l6ZShjaGlsZCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY29udGVudEl0ZW0gaW5zdGFuY2VvZiBSb3dPckNvbHVtbiAmJiAoY29udGVudEl0ZW0uaXNDb2x1bW4gPT09IHRoaXMuX2lzQ29sdW1uKSkge1xyXG4gICAgICAgICAgICAgICAgY2hpbGRyZW5NaW5TaXplICs9IG1pblNpemU7IC8vIFByb2JhYmx5IG5vdCBwb3NzaWJsZSAoUm93IGluc2lkZSByb3csIG9yIGNvbHVtbiBpbnNpZGUgY29sdW1uKVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY2hpbGRyZW5NaW5TaXplID0gTWF0aC5tYXgoY2hpbGRyZW5NaW5TaXplLCBtaW5TaXplKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbWluU2l6ZSA9IHRoaXMuY2FsY3VsYXRlQ29udGVudEl0ZW1NaW5TaXplKGNvbnRlbnRJdGVtKTtcclxuICAgICAgICByZXR1cm4gTWF0aC5tYXgobWluU2l6ZSwgY2hpbGRyZW5NaW5TaXplKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEludm9rZWQgd2hlbiBhIHNwbGl0dGVyJ3MgZHJhZ0xpc3RlbmVyIGZpcmVzIGRyYWdTdGFydC4gQ2FsY3VsYXRlcyB0aGUgc3BsaXR0ZXJzXHJcbiAgICAgKiBtb3ZlbWVudCBhcmVhIG9uY2UgKHNvIHRoYXQgaXQgZG9lc24ndCBuZWVkIGNhbGN1bGF0aW5nIG9uIGV2ZXJ5IG1vdXNlbW92ZSBldmVudClcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uU3BsaXR0ZXJEcmFnU3RhcnQoc3BsaXR0ZXI6IFNwbGl0dGVyKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldFNwbGl0SXRlbXMoc3BsaXR0ZXIpO1xyXG5cclxuICAgICAgICBjb25zdCBiZWZvcmVXaWR0aCA9IHBpeGVsc1RvTnVtYmVyKGl0ZW1zLmJlZm9yZS5lbGVtZW50LnN0eWxlW3RoaXMuX2RpbWVuc2lvbl0pO1xyXG4gICAgICAgIGNvbnN0IGFmdGVyU2l6ZSA9IHBpeGVsc1RvTnVtYmVyKGl0ZW1zLmFmdGVyLmVsZW1lbnQuc3R5bGVbdGhpcy5fZGltZW5zaW9uXSk7XHJcbiAgICAgICAgY29uc3QgYmVmb3JlTWluU2l6ZSA9IHRoaXMuY2FsY3VsYXRlQ29udGVudEl0ZW1zVG90YWxNaW5TaXplKGl0ZW1zLmJlZm9yZSk7XHJcbiAgICAgICAgY29uc3QgYWZ0ZXJNaW5TaXplID0gdGhpcy5jYWxjdWxhdGVDb250ZW50SXRlbXNUb3RhbE1pblNpemUoaXRlbXMuYWZ0ZXIpO1xyXG5cclxuICAgICAgICB0aGlzLl9zcGxpdHRlclBvc2l0aW9uID0gMDtcclxuICAgICAgICB0aGlzLl9zcGxpdHRlck1pblBvc2l0aW9uID0gTWF0aC5taW4oMCwgLTEgKiAoYmVmb3JlV2lkdGggLSBiZWZvcmVNaW5TaXplKSk7XHJcbiAgICAgICAgdGhpcy5fc3BsaXR0ZXJNYXhQb3NpdGlvbiA9IE1hdGgubWF4KDAsIGFmdGVyU2l6ZSAtIGFmdGVyTWluU2l6ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZva2VkIHdoZW4gYSBzcGxpdHRlcidzIERyYWdMaXN0ZW5lciBmaXJlcyBkcmFnLiBVcGRhdGVzIHRoZSBzcGxpdHRlcidzIERPTSBwb3NpdGlvbixcclxuICAgICAqIGJ1dCBub3QgdGhlIHNpemVzIG9mIHRoZSBlbGVtZW50cyB0aGUgc3BsaXR0ZXIgY29udHJvbHMgaW4gb3JkZXIgdG8gbWluaW1pemUgcmVzaXplIGV2ZW50c1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBzcGxpdHRlciAtXHJcbiAgICAgKiBAcGFyYW0gb2Zmc2V0WCAtIFJlbGF0aXZlIHBpeGVsIHZhbHVlcyB0byB0aGUgc3BsaXR0ZXIncyBvcmlnaW5hbCBwb3NpdGlvbi4gQ2FuIGJlIG5lZ2F0aXZlXHJcbiAgICAgKiBAcGFyYW0gb2Zmc2V0WSAtIFJlbGF0aXZlIHBpeGVsIHZhbHVlcyB0byB0aGUgc3BsaXR0ZXIncyBvcmlnaW5hbCBwb3NpdGlvbi4gQ2FuIGJlIG5lZ2F0aXZlXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvblNwbGl0dGVyRHJhZyhzcGxpdHRlcjogU3BsaXR0ZXIsIG9mZnNldFg6IG51bWJlciwgb2Zmc2V0WTogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IG9mZnNldCA9IHRoaXMuX2lzQ29sdW1uID8gb2Zmc2V0WSA6IG9mZnNldFg7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zcGxpdHRlck1pblBvc2l0aW9uID09PSBudWxsIHx8IHRoaXMuX3NwbGl0dGVyTWF4UG9zaXRpb24gPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ1JPQ09TRDU5MjI2Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9mZnNldCA9IE1hdGgubWF4KG9mZnNldCwgdGhpcy5fc3BsaXR0ZXJNaW5Qb3NpdGlvbik7XHJcbiAgICAgICAgb2Zmc2V0ID0gTWF0aC5taW4ob2Zmc2V0LCB0aGlzLl9zcGxpdHRlck1heFBvc2l0aW9uKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc3BsaXR0ZXJQb3NpdGlvbiA9IG9mZnNldDtcclxuICAgICAgICBjb25zdCBvZmZzZXRQaXhlbHMgPSBudW1iZXJUb1BpeGVscyhvZmZzZXQpO1xyXG4gICAgICAgIGlmICh0aGlzLl9pc0NvbHVtbikge1xyXG4gICAgICAgICAgICBzcGxpdHRlci5lbGVtZW50LnN0eWxlLnRvcCA9IG9mZnNldFBpeGVscztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzcGxpdHRlci5lbGVtZW50LnN0eWxlLmxlZnQgPSBvZmZzZXRQaXhlbHM7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW52b2tlZCB3aGVuIGEgc3BsaXR0ZXIncyBEcmFnTGlzdGVuZXIgZmlyZXMgZHJhZ1N0b3AuIFJlc2V0cyB0aGUgc3BsaXR0ZXJzIERPTSBwb3NpdGlvbixcclxuICAgICAqIGFuZCBhcHBsaWVzIHRoZSBuZXcgc2l6ZXMgdG8gdGhlIGVsZW1lbnRzIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHNwbGl0dGVyIGFuZCB0aGVpciBjaGlsZHJlblxyXG4gICAgICogb24gdGhlIG5leHQgYW5pbWF0aW9uIGZyYW1lXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvblNwbGl0dGVyRHJhZ1N0b3Aoc3BsaXR0ZXI6IFNwbGl0dGVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3NwbGl0dGVyUG9zaXRpb24gPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ1JPQ09TRFM2NjkzMicpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRTcGxpdEl0ZW1zKHNwbGl0dGVyKTtcclxuICAgICAgICAgICAgY29uc3Qgc2l6ZUJlZm9yZSA9IHBpeGVsc1RvTnVtYmVyKGl0ZW1zLmJlZm9yZS5lbGVtZW50LnN0eWxlW3RoaXMuX2RpbWVuc2lvbl0pO1xyXG4gICAgICAgICAgICBjb25zdCBzaXplQWZ0ZXIgPSBwaXhlbHNUb051bWJlcihpdGVtcy5hZnRlci5lbGVtZW50LnN0eWxlW3RoaXMuX2RpbWVuc2lvbl0pO1xyXG4gICAgICAgICAgICBjb25zdCBzcGxpdHRlclBvc2l0aW9uSW5SYW5nZSA9ICh0aGlzLl9zcGxpdHRlclBvc2l0aW9uICsgc2l6ZUJlZm9yZSkgLyAoc2l6ZUJlZm9yZSArIHNpemVBZnRlcik7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsUmVsYXRpdmVTaXplID0gaXRlbXMuYmVmb3JlLnNpemUgKyBpdGVtcy5hZnRlci5zaXplO1xyXG5cclxuICAgICAgICAgICAgaXRlbXMuYmVmb3JlLnNpemUgPSBzcGxpdHRlclBvc2l0aW9uSW5SYW5nZSAqIHRvdGFsUmVsYXRpdmVTaXplO1xyXG4gICAgICAgICAgICBpdGVtcy5hZnRlci5zaXplID0gKDEgLSBzcGxpdHRlclBvc2l0aW9uSW5SYW5nZSkgKiB0b3RhbFJlbGF0aXZlU2l6ZTtcclxuXHJcbiAgICAgICAgICAgIHNwbGl0dGVyLmVsZW1lbnQuc3R5bGUudG9wID0gbnVtYmVyVG9QaXhlbHMoMCk7XHJcbiAgICAgICAgICAgIHNwbGl0dGVyLmVsZW1lbnQuc3R5bGUubGVmdCA9IG51bWJlclRvUGl4ZWxzKDApO1xyXG5cclxuICAgICAgICAgICAgZ2xvYmFsVGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy51cGRhdGVTaXplKGZhbHNlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFJvd09yQ29sdW1uIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQWJzb2x1dGVTaXplcyB7XHJcbiAgICAgICAgaXRlbVNpemVzOiBudW1iZXJbXSxcclxuICAgICAgICBhZGRpdGlvbmFsUGl4ZWw6IG51bWJlcixcclxuICAgICAgICB0b3RhbFNpemU6IG51bWJlcixcclxuICAgICAgICBjcm9zc0F4aXNTaXplOiBudW1iZXJcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0RWxlbWVudERpbWVuc2lvblNpemUoZWxlbWVudDogSFRNTEVsZW1lbnQsIGRpbWVuc2lvbjogV2lkdGhPckhlaWdodFByb3BlcnR5TmFtZSk6IG51bWJlciB7XHJcbiAgICAgICAgaWYgKGRpbWVuc2lvbiA9PT0gJ3dpZHRoJykge1xyXG4gICAgICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFdpZHRoKGVsZW1lbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBnZXRFbGVtZW50SGVpZ2h0KGVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gc2V0RWxlbWVudERpbWVuc2lvblNpemUoZWxlbWVudDogSFRNTEVsZW1lbnQsIGRpbWVuc2lvbjogV2lkdGhPckhlaWdodFByb3BlcnR5TmFtZSwgdmFsdWU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGlmIChkaW1lbnNpb24gPT09ICd3aWR0aCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNldEVsZW1lbnRXaWR0aChlbGVtZW50LCB2YWx1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNldEVsZW1lbnRIZWlnaHQoZWxlbWVudCwgdmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlRWxlbWVudChkb2N1bWVudDogRG9jdW1lbnQsIGlzQ29sdW1uOiBib29sZWFuKTogSFRNTERpdkVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5JdGVtKTtcclxuICAgICAgICBpZiAoaXNDb2x1bW4pIHtcclxuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuQ29sdW1uKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Sb3cpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBDb21wb25lbnRJdGVtQ29uZmlnLCBJdGVtQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL2NvbmZpZyc7XHJcbmltcG9ydCB7IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZywgUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcsIFJlc29sdmVkSXRlbUNvbmZpZywgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgfSBmcm9tICcuLi9jb25maWcvcmVzb2x2ZWQtY29uZmlnJztcclxuaW1wb3J0IHsgSGVhZGVyIH0gZnJvbSAnLi4vY29udHJvbHMvaGVhZGVyJztcclxuaW1wb3J0IHsgQXNzZXJ0RXJyb3IsIFVuZXhwZWN0ZWROdWxsRXJyb3IsIFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IERvbUNvbnN0YW50cyB9IGZyb20gJy4uL3V0aWxzL2RvbS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBEcmFnTGlzdGVuZXIgfSBmcm9tICcuLi91dGlscy9kcmFnLWxpc3RlbmVyJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQtZW1pdHRlcic7XHJcbmltcG9ydCB7IEFyZWFMaW5rZWRSZWN0LCBJdGVtVHlwZSwgSnNvblZhbHVlLCBTaWRlLCBTaXplVW5pdEVudW0sIFdpZHRoQW5kSGVpZ2h0LCBXaWR0aE9ySGVpZ2h0UHJvcGVydHlOYW1lIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gICAgZ2V0RWxlbWVudFdpZHRoQW5kSGVpZ2h0LFxyXG4gICAgc2V0RWxlbWVudERpc3BsYXlWaXNpYmlsaXR5LFxyXG4gICAgc2V0RWxlbWVudEhlaWdodCxcclxuICAgIHNldEVsZW1lbnRXaWR0aFxyXG59IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4vY29tcG9uZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBDb21wb25lbnRQYXJlbnRhYmxlSXRlbSB9IGZyb20gJy4vY29tcG9uZW50LXBhcmVudGFibGUtaXRlbSc7XHJcbmltcG9ydCB7IENvbnRlbnRJdGVtIH0gZnJvbSAnLi9jb250ZW50LWl0ZW0nO1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGNsYXNzIFN0YWNrIGV4dGVuZHMgQ29tcG9uZW50UGFyZW50YWJsZUl0ZW0ge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaGVhZGVyQ29uZmlnOiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIgfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9oZWFkZXI6IEhlYWRlcjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoaWxkRWxlbWVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9tYXhpbWlzZWRFbmFibGVkOiBib29sZWFuO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfYWN0aXZlQ29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2Ryb3BTZWdtZW50OiBTdGFjay5TZWdtZW50O1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZHJvcEluZGV4OiBudW1iZXI7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9jb250ZW50QXJlYURpbWVuc2lvbnM6IFN0YWNrLkNvbnRlbnRBcmVhRGltZW5zaW9ucztcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2hlYWRlclNpZGVDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pbml0aWFsV2FudE1heGltaXNlOiBib29sZWFuO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaW5pdGlhbEFjdGl2ZUl0ZW1JbmRleDogbnVtYmVyO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3Jlc2l6ZUxpc3RlbmVyID0gKCkgPT4gdGhpcy5oYW5kbGVSZXNpemUoKTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX21heGltaXNlZExpc3RlbmVyID0gKCkgPT4gdGhpcy5oYW5kbGVNYXhpbWlzZWQoKTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX21pbmltaXNlZExpc3RlbmVyID0gKCkgPT4gdGhpcy5oYW5kbGVNaW5pbWlzZWQoKTtcclxuXHJcbiAgICBnZXQgY2hpbGRFbGVtZW50Q29udGFpbmVyKCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lcjsgfVxyXG4gICAgZ2V0IGhlYWRlcigpOiBIZWFkZXIgeyByZXR1cm4gdGhpcy5faGVhZGVyOyB9XHJcbiAgICBnZXQgaGVhZGVyU2hvdygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2hlYWRlci5zaG93OyB9XHJcbiAgICBnZXQgaGVhZGVyU2lkZSgpOiBTaWRlIHsgcmV0dXJuIHRoaXMuX2hlYWRlci5zaWRlOyB9XHJcbiAgICBnZXQgaGVhZGVyTGVmdFJpZ2h0U2lkZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9oZWFkZXIubGVmdFJpZ2h0U2lkZWQ7IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGdldCBjb250ZW50QXJlYURpbWVuc2lvbnMoKTogU3RhY2suQ29udGVudEFyZWFEaW1lbnNpb25zIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2NvbnRlbnRBcmVhRGltZW5zaW9uczsgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZ2V0IGluaXRpYWxXYW50TWF4aW1pc2UoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9pbml0aWFsV2FudE1heGltaXNlOyB9XHJcbiAgICBnZXQgaXNNYXhpbWlzZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzID09PSB0aGlzLmxheW91dE1hbmFnZXIubWF4aW1pc2VkU3RhY2s7IH1cclxuICAgIGdldCBzdGFja1BhcmVudCgpOiBDb250ZW50SXRlbSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0YWNrIHNob3VsZCBhbHdheXMgaGF2ZSBhIHBhcmVudCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IobGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlciwgY29uZmlnOiBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZywgcGFyZW50OiBDb250ZW50SXRlbSkge1xyXG4gICAgICAgIHN1cGVyKGxheW91dE1hbmFnZXIsIGNvbmZpZywgcGFyZW50LCBTdGFjay5jcmVhdGVFbGVtZW50KGRvY3VtZW50KSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2hlYWRlckNvbmZpZyA9IGNvbmZpZy5oZWFkZXI7XHJcbiAgICAgICAgY29uc3QgbGF5b3V0SGVhZGVyQ29uZmlnID0gbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuaGVhZGVyO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZ0NvbnRlbnQgPSBjb25maWcuY29udGVudDtcclxuICAgICAgICAvLyBJZiBzdGFjayBoYXMgb25seSBvbmUgY29tcG9uZW50LCB0aGVuIHdlIGNhbiBhbHNvIGNoZWNrIHRoaXMgZm9yIGhlYWRlciBzZXR0aW5nc1xyXG4gICAgICAgIGxldCBjb21wb25lbnRIZWFkZXJDb25maWc6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlciB8IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAoY29uZmlnQ29udGVudC5sZW5ndGggIT09IDEpIHtcclxuICAgICAgICAgICAgY29tcG9uZW50SGVhZGVyQ29uZmlnID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0Q2hpbGRJdGVtQ29uZmlnID0gY29uZmlnQ29udGVudFswXTtcclxuICAgICAgICAgICAgY29tcG9uZW50SGVhZGVyQ29uZmlnID0gKGZpcnN0Q2hpbGRJdGVtQ29uZmlnIGFzIFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnKS5oZWFkZXI7IC8vIHdpbGwgYmUgdW5kZWZpbmVkIGlmIG5vdCBjb21wb25lbnQgKGFuZCB3b250IGJlIHN0YWNrKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5faW5pdGlhbFdhbnRNYXhpbWlzZSA9IGNvbmZpZy5tYXhpbWlzZWQ7XHJcbiAgICAgICAgdGhpcy5faW5pdGlhbEFjdGl2ZUl0ZW1JbmRleCA9IGNvbmZpZy5hY3RpdmVJdGVtSW5kZXggPz8gMDsgLy8gbWFrZSBzdXJlIGRlZmluZWRcclxuXHJcbiAgICAgICAgLy8gY2hlY2sgZm9yIGRlZmluZWQgdmFsdWUgZm9yIGVhY2ggaXRlbSBpbiBvcmRlciBvZiBTdGFjayAodGhpcyBJdGVtKSwgQ29tcG9uZW50IChmaXJzdCBjaGlsZCksIE1hbmFnZXIuXHJcbiAgICAgICAgY29uc3Qgc2hvdyA9IHRoaXMuX2hlYWRlckNvbmZpZz8uc2hvdyA/PyBjb21wb25lbnRIZWFkZXJDb25maWc/LnNob3cgPz8gbGF5b3V0SGVhZGVyQ29uZmlnLnNob3c7XHJcbiAgICAgICAgY29uc3QgcG9wb3V0ID0gdGhpcy5faGVhZGVyQ29uZmlnPy5wb3BvdXQgPz8gY29tcG9uZW50SGVhZGVyQ29uZmlnPy5wb3BvdXQgPz8gbGF5b3V0SGVhZGVyQ29uZmlnLnBvcG91dDtcclxuICAgICAgICBjb25zdCBtYXhpbWlzZSA9IHRoaXMuX2hlYWRlckNvbmZpZz8ubWF4aW1pc2UgPz8gY29tcG9uZW50SGVhZGVyQ29uZmlnPy5tYXhpbWlzZSA/PyBsYXlvdXRIZWFkZXJDb25maWcubWF4aW1pc2U7XHJcbiAgICAgICAgY29uc3QgY2xvc2UgPSB0aGlzLl9oZWFkZXJDb25maWc/LmNsb3NlID8/IGNvbXBvbmVudEhlYWRlckNvbmZpZz8uY2xvc2UgPz8gbGF5b3V0SGVhZGVyQ29uZmlnLmNsb3NlO1xyXG4gICAgICAgIGNvbnN0IG1pbmltaXNlID0gdGhpcy5faGVhZGVyQ29uZmlnPy5taW5pbWlzZSA/PyBjb21wb25lbnRIZWFkZXJDb25maWc/Lm1pbmltaXNlID8/IGxheW91dEhlYWRlckNvbmZpZy5taW5pbWlzZTtcclxuICAgICAgICBjb25zdCB0YWJEcm9wZG93biA9IHRoaXMuX2hlYWRlckNvbmZpZz8udGFiRHJvcGRvd24gPz8gY29tcG9uZW50SGVhZGVyQ29uZmlnPy50YWJEcm9wZG93biA/PyBsYXlvdXRIZWFkZXJDb25maWcudGFiRHJvcGRvd247XHJcbiAgICAgICAgdGhpcy5fbWF4aW1pc2VkRW5hYmxlZCA9IG1heGltaXNlICE9PSBmYWxzZTtcclxuICAgICAgICBjb25zdCBoZWFkZXJTZXR0aW5nczogSGVhZGVyLlNldHRpbmdzID0ge1xyXG4gICAgICAgICAgICBzaG93OiBzaG93ICE9PSBmYWxzZSxcclxuICAgICAgICAgICAgc2lkZTogc2hvdyA9PT0gZmFsc2UgPyBTaWRlLnRvcCA6IHNob3csXHJcbiAgICAgICAgICAgIHBvcG91dEVuYWJsZWQ6IHBvcG91dCAhPT0gZmFsc2UsXHJcbiAgICAgICAgICAgIHBvcG91dExhYmVsOiBwb3BvdXQgPT09IGZhbHNlID8gJycgOiBwb3BvdXQsXHJcbiAgICAgICAgICAgIG1heGltaXNlRW5hYmxlZDogdGhpcy5fbWF4aW1pc2VkRW5hYmxlZCxcclxuICAgICAgICAgICAgbWF4aW1pc2VMYWJlbDogbWF4aW1pc2UgPT09IGZhbHNlID8gJycgOiBtYXhpbWlzZSxcclxuICAgICAgICAgICAgY2xvc2VFbmFibGVkOiBjbG9zZSAhPT0gZmFsc2UsXHJcbiAgICAgICAgICAgIGNsb3NlTGFiZWw6IGNsb3NlID09PSBmYWxzZSA/ICcnIDogY2xvc2UsXHJcbiAgICAgICAgICAgIG1pbmltaXNlRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICAgICAgbWluaW1pc2VMYWJlbDogbWluaW1pc2UsXHJcbiAgICAgICAgICAgIHRhYkRyb3Bkb3duRW5hYmxlZDogdGFiRHJvcGRvd24gIT09IGZhbHNlLFxyXG4gICAgICAgICAgICB0YWJEcm9wZG93bkxhYmVsOiB0YWJEcm9wZG93biA9PT0gZmFsc2UgPyAnJyA6IHRhYkRyb3Bkb3duLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuX2hlYWRlciA9IG5ldyBIZWFkZXIobGF5b3V0TWFuYWdlcixcclxuICAgICAgICAgICAgdGhpcywgaGVhZGVyU2V0dGluZ3MsXHJcbiAgICAgICAgICAgICgpID0+IHRoaXMuZ2V0QWN0aXZlQ29tcG9uZW50SXRlbSgpLFxyXG4gICAgICAgICAgICAoKSA9PiB0aGlzLnJlbW92ZSgpLFxyXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmhhbmRsZVBvcG91dEV2ZW50KCksXHJcbiAgICAgICAgICAgICgpID0+IHRoaXMudG9nZ2xlTWF4aW1pc2UoKSxcclxuICAgICAgICAgICAgKGV2KSA9PiB0aGlzLmhhbmRsZUhlYWRlckNsaWNrRXZlbnQoZXYpLFxyXG4gICAgICAgICAgICAoZXYpID0+IHRoaXMuaGFuZGxlSGVhZGVyVG91Y2hTdGFydEV2ZW50KGV2KSxcclxuICAgICAgICAgICAgKGl0ZW0pID0+IHRoaXMuaGFuZGxlSGVhZGVyQ29tcG9uZW50UmVtb3ZlRXZlbnQoaXRlbSksXHJcbiAgICAgICAgICAgIChpdGVtKSA9PiB0aGlzLmhhbmRsZUhlYWRlckNvbXBvbmVudEZvY3VzRXZlbnQoaXRlbSksXHJcbiAgICAgICAgICAgICh4LCB5LCBkcmFnTGlzdGVuZXIsIGl0ZW0pID0+IHRoaXMuaGFuZGxlSGVhZGVyQ29tcG9uZW50U3RhcnREcmFnRXZlbnQoeCwgeSwgZHJhZ0xpc3RlbmVyLCBpdGVtKSxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvLyB0aGlzLl9kcm9wWm9uZXMgPSB7fTtcclxuXHJcbiAgICAgICAgdGhpcy5pc1N0YWNrID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fY2hpbGRFbGVtZW50Q29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VjdGlvbicpO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuSXRlbXMpO1xyXG5cclxuICAgICAgICB0aGlzLm9uKCdyZXNpemUnLCB0aGlzLl9yZXNpemVMaXN0ZW5lcik7XHJcbiAgICAgICAgaWYgKHRoaXMuX21heGltaXNlZEVuYWJsZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5vbignbWF4aW1pc2VkJywgdGhpcy5fbWF4aW1pc2VkTGlzdGVuZXIpO1xyXG4gICAgICAgICAgICB0aGlzLm9uKCdtaW5pbWlzZWQnLCB0aGlzLl9taW5pbWlzZWRMaXN0ZW5lcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5faGVhZGVyLmVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIpO1xyXG5cclxuICAgICAgICB0aGlzLnNldHVwSGVhZGVyUG9zaXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSB1cGRhdGVTaXplKGZvcmNlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmJlZ2luVmlydHVhbFNpemVkQ29udGFpbmVyQWRkaW5nKCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVOb2RlU2l6ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnRlbnRJdGVtc1NpemUoZm9yY2UpO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5lbmRWaXJ0dWFsU2l6ZWRDb250YWluZXJBZGRpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgaW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pc0luaXRpYWxpc2VkID09PSB0cnVlKSByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlTm9kZVNpemUoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50SXRlbXNbaV0uZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdXBlci5pbml0KCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtcyA9IHRoaXMuY29udGVudEl0ZW1zO1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtQ291bnQgPSBjb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIGlmIChjb250ZW50SXRlbUNvdW50ID4gMCkgeyAvLyBjb250ZW50SXRlbUNvdW50IHdpbGwgYmUgMCBvbiBkcmFnIGRyb3BcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxBY3RpdmVJdGVtSW5kZXggPCAwIHx8IHRoaXMuX2luaXRpYWxBY3RpdmVJdGVtSW5kZXggPj0gY29udGVudEl0ZW1Db3VudCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBY3RpdmVJdGVtSW5kZXggb3V0IG9mIHJhbmdlOiAke3RoaXMuX2luaXRpYWxBY3RpdmVJdGVtSW5kZXh9IGlkOiAke3RoaXMuaWR9YCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKGNvbnRlbnRJdGVtIGluc3RhbmNlb2YgQ29tcG9uZW50SXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdGFjayBDb250ZW50IEl0ZW0gaXMgbm90IG9mIHR5cGUgQ29tcG9uZW50SXRlbTogJHtpfSBpZDogJHt0aGlzLmlkfWApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hlYWRlci5jcmVhdGVUYWIoY29udGVudEl0ZW0sIGkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50SXRlbS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLmNvbnRhaW5lci5zZXRCYXNlTG9naWNhbFpJbmRleCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZUNvbXBvbmVudEl0ZW0oY29udGVudEl0ZW1zW3RoaXMuX2luaXRpYWxBY3RpdmVJdGVtSW5kZXhdIGFzIENvbXBvbmVudEl0ZW0sIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9oZWFkZXIudXBkYXRlVGFiU2l6ZXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pbml0Q29udGVudEl0ZW1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgKFN0YWNrOmNsYXNzKS5zZXRBY3RpdmVDb21wb25lbnRJdGVtfSAqL1xyXG4gICAgc2V0QWN0aXZlQ29udGVudEl0ZW0oaXRlbTogQ29udGVudEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICBpZiAoIUNvbnRlbnRJdGVtLmlzQ29tcG9uZW50SXRlbShpdGVtKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0YWNrLnNldEFjdGl2ZUNvbnRlbnRJdGVtOiBpdGVtIGlzIG5vdCBhIENvbXBvbmVudEl0ZW0nKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZUNvbXBvbmVudEl0ZW0oaXRlbSwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRBY3RpdmVDb21wb25lbnRJdGVtKGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0sIGZvY3VzOiBib29sZWFuLCBzdXBwcmVzc0ZvY3VzRXZlbnQgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9hY3RpdmVDb21wb25lbnRJdGVtICE9PSBjb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRJdGVtcy5pbmRleE9mKGNvbXBvbmVudEl0ZW0pID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb21wb25lbnRJdGVtIGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgc3RhY2snKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5iZWdpblNpemVJbnZhbGlkYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZUNvbXBvbmVudEl0ZW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmVDb21wb25lbnRJdGVtLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlQ29tcG9uZW50SXRlbSA9IGNvbXBvbmVudEl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGVhZGVyLnByb2Nlc3NBY3RpdmVDb21wb25lbnRDaGFuZ2VkKGNvbXBvbmVudEl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEl0ZW0uc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuZW5kU2l6ZUludmFsaWRhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnYWN0aXZlQ29udGVudEl0ZW1DaGFuZ2VkJywgY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuZW1pdCgnYWN0aXZlQ29udGVudEl0ZW1DaGFuZ2VkJywgY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZWRFdmVudCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5mb2N1c2VkIHx8IGZvY3VzKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5zZXRGb2N1c2VkQ29tcG9uZW50SXRlbShjb21wb25lbnRJdGVtLCBzdXBwcmVzc0ZvY3VzRXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoU3RhY2s6Y2xhc3MpLmdldEFjdGl2ZUNvbXBvbmVudEl0ZW19ICovXHJcbiAgICBnZXRBY3RpdmVDb250ZW50SXRlbSgpOiBDb250ZW50SXRlbSB8IG51bGwge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEFjdGl2ZUNvbXBvbmVudEl0ZW0oKSA/PyBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEFjdGl2ZUNvbXBvbmVudEl0ZW0oKTogQ29tcG9uZW50SXRlbSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZUNvbXBvbmVudEl0ZW07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZm9jdXNBY3RpdmVDb250ZW50SXRlbSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9hY3RpdmVDb21wb25lbnRJdGVtPy5mb2N1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG92ZXJyaWRlIHNldEZvY3VzZWRWYWx1ZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2hlYWRlci5hcHBseUZvY3VzZWRWYWx1ZSh2YWx1ZSk7XHJcbiAgICAgICAgc3VwZXIuc2V0Rm9jdXNlZFZhbHVlKHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBuZXdDb21wb25lbnQoY29tcG9uZW50VHlwZTogSnNvblZhbHVlLCBjb21wb25lbnRTdGF0ZT86IEpzb25WYWx1ZSwgdGl0bGU/OiBzdHJpbmcsIGluZGV4PzogbnVtYmVyKTogQ29tcG9uZW50SXRlbSB7XHJcbiAgICAgICAgY29uc3QgaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogJ2NvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFR5cGUsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlLFxyXG4gICAgICAgICAgICB0aXRsZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5ld0l0ZW0oaXRlbUNvbmZpZywgaW5kZXgpIGFzIENvbXBvbmVudEl0ZW07XHJcbiAgICB9XHJcblxyXG4gICAgYWRkQ29tcG9uZW50KGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSwgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsIHRpdGxlPzogc3RyaW5nLCBpbmRleD86IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgY29uc3QgaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogJ2NvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFR5cGUsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlLFxyXG4gICAgICAgICAgICB0aXRsZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZEl0ZW0oaXRlbUNvbmZpZywgaW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIG5ld0l0ZW0oaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZywgIGluZGV4PzogbnVtYmVyKTogQ29udGVudEl0ZW0ge1xyXG4gICAgICAgIGluZGV4ID0gdGhpcy5hZGRJdGVtKGl0ZW1Db25maWcsIGluZGV4KTtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50SXRlbXNbaW5kZXhdO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZEl0ZW0oaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZywgaW5kZXg/OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5jaGVja01pbmltaXNlTWF4aW1pc2VkU3RhY2soKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRJdGVtQ29uZmlnID0gSXRlbUNvbmZpZy5yZXNvbHZlKGl0ZW1Db25maWcsIGZhbHNlKTtcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IHRoaXMubGF5b3V0TWFuYWdlci5jcmVhdGVBbmRJbml0Q29udGVudEl0ZW0ocmVzb2x2ZWRJdGVtQ29uZmlnLCB0aGlzKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hZGRDaGlsZChjb250ZW50SXRlbSwgaW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIG92ZXJyaWRlIGFkZENoaWxkKGNvbnRlbnRJdGVtOiBDb250ZW50SXRlbSwgaW5kZXg/OiBudW1iZXIsIGZvY3VzID0gZmFsc2UpOiBudW1iZXIge1xyXG4gICAgICAgIGlmKGluZGV4ICE9PSB1bmRlZmluZWQgJiYgaW5kZXggPiB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGgpe1xyXG4gICAgICAgICAgICBpbmRleCAtPSAxO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ1NBQzk5NzI4Jyk7IC8vIHVuZGlzcGxheUNoaWxkKCkgcmVtb3ZlZCBzbyB0aGlzIGNvbmRpdGlvbiBzaG91bGQgbm8gbG9uZ2VyIG9jY3VyXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIShjb250ZW50SXRlbSBpbnN0YW5jZW9mIENvbXBvbmVudEl0ZW0pKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignU0FDQzg4NTMyJyk7IC8vIFN0YWNrcyBjYW4gb25seSBoYXZlIENvbXBvbmVudCBjaGlsZHJlblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gc3VwZXIuYWRkQ2hpbGQoY29udGVudEl0ZW0sIGluZGV4KTtcclxuICAgICAgICAgICAgdGhpcy5fY2hpbGRFbGVtZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKGNvbnRlbnRJdGVtLmVsZW1lbnQpO1xyXG4gICAgICAgICAgICB0aGlzLl9oZWFkZXIuY3JlYXRlVGFiKGNvbnRlbnRJdGVtLCBpbmRleCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlQ29tcG9uZW50SXRlbShjb250ZW50SXRlbSwgZm9jdXMpO1xyXG4gICAgICAgICAgICB0aGlzLl9oZWFkZXIudXBkYXRlVGFiU2l6ZXMoKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgICAgICAgICAgY29udGVudEl0ZW0uY29udGFpbmVyLnNldEJhc2VMb2dpY2FsWkluZGV4KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlZEV2ZW50KCk7XHJcbiAgICAgICAgICAgIHJldHVybiBpbmRleDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb3ZlcnJpZGUgcmVtb3ZlQ2hpbGQoY29udGVudEl0ZW06IENvbnRlbnRJdGVtLCBrZWVwQ2hpbGQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBjb21wb25lbnRJdGVtID0gY29udGVudEl0ZW0gYXMgQ29tcG9uZW50SXRlbTtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuY29udGVudEl0ZW1zLmluZGV4T2YoY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgY29uc3Qgc3RhY2tXaWxsQmVEZWxldGVkID0gdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID09PSAxO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fYWN0aXZlQ29tcG9uZW50SXRlbSA9PT0gY29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgICAgICBpZiAoY29tcG9uZW50SXRlbS5mb2N1c2VkKSB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRJdGVtLmJsdXIoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXN0YWNrV2lsbEJlRGVsZXRlZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSdyZSBhbHJlYWR5IHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgY29udGVudCBpdGVtIGxlZnQgKmFmdGVyKlxyXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZpbmcgY29udGVudEl0ZW0sIHNvIHdlIGNhbiBzYWZlbHkgYXNzdW1lIGluZGV4IDEgaXMgYSB2YWxpZCBvbmUgaWZcclxuICAgICAgICAgICAgICAgIC8vIHRoZSBpbmRleCBvZiBjb250ZW50SXRlbSBpcyAwLCBvdGhlcndpc2Ugd2UganVzdCB1c2UgdGhlIHByZXZpb3VzIGNvbnRlbnQgaXRlbS5cclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0FjdGl2ZUNvbXBvbmVudElkeCA9IGluZGV4ID09PSAwID8gMSA6IGluZGV4IC0gMTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlQ29tcG9uZW50SXRlbSh0aGlzLmNvbnRlbnRJdGVtc1tuZXdBY3RpdmVDb21wb25lbnRJZHhdIGFzIENvbXBvbmVudEl0ZW0sIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5faGVhZGVyLnJlbW92ZVRhYihjb21wb25lbnRJdGVtKTtcclxuXHJcbiAgICAgICAgc3VwZXIucmVtb3ZlQ2hpbGQoY29tcG9uZW50SXRlbSwga2VlcENoaWxkKTtcclxuXHJcbiAgICAgICAgdGhpcy5lbWl0U3RhdGVDaGFuZ2VkRXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1heGltaXNlcyB0aGUgSXRlbSBvciBtaW5pbWlzZXMgaXQgaWYgaXQgaXMgYWxyZWFkeSBtYXhpbWlzZWRcclxuICAgICAqL1xyXG4gICAgdG9nZ2xlTWF4aW1pc2UoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNNYXhpbWlzZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5taW5pbWlzZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4aW1pc2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbWF4aW1pc2UoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzTWF4aW1pc2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5zZXRNYXhpbWlzZWRTdGFjayh0aGlzKTtcclxuICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW1zID0gdGhpcy5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtQ291bnQgPSBjb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSBjb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGVudEl0ZW0gaW5zdGFuY2VvZiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEl0ZW0uZW50ZXJTdGFja01heGltaXNlZCgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ1NNQVhJODc3NzMnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZWRFdmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBtaW5pbWlzZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pc01heGltaXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuc2V0TWF4aW1pc2VkU3RhY2sodW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW1zID0gdGhpcy5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtQ291bnQgPSBjb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSBjb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGVudEl0ZW0gaW5zdGFuY2VvZiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEl0ZW0uZXhpdFN0YWNrTWF4aW1pc2VkKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignU01JTkk4Nzc3MycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlZEV2ZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG92ZXJyaWRlIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZUNvbXBvbmVudEl0ZW0/LmZvY3VzZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fYWN0aXZlQ29tcG9uZW50SXRlbS5ibHVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcclxuICAgICAgICB0aGlzLm9mZigncmVzaXplJywgdGhpcy5fcmVzaXplTGlzdGVuZXIpO1xyXG4gICAgICAgIGlmICh0aGlzLl9tYXhpbWlzZWRFbmFibGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMub2ZmKCdtYXhpbWlzZWQnLCB0aGlzLl9tYXhpbWlzZWRMaXN0ZW5lcik7XHJcbiAgICAgICAgICAgIHRoaXMub2ZmKCdtaW5pbWlzZWQnLCB0aGlzLl9taW5pbWlzZWRMaXN0ZW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2hlYWRlci5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgdG9Db25maWcoKTogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcge1xyXG4gICAgICAgIGxldCBhY3RpdmVJdGVtSW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAodGhpcy5fYWN0aXZlQ29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgICAgICBhY3RpdmVJdGVtSW5kZXggPSB0aGlzLmNvbnRlbnRJdGVtcy5pbmRleE9mKHRoaXMuX2FjdGl2ZUNvbXBvbmVudEl0ZW0pO1xyXG4gICAgICAgICAgICBpZiAoYWN0aXZlSXRlbUluZGV4IDwgMCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhY3RpdmUgY29tcG9uZW50IGl0ZW0gbm90IGZvdW5kIGluIHN0YWNrJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCA+IDAgJiYgYWN0aXZlSXRlbUluZGV4ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBub24tZW1wdHkgc3RhY2sgdG8gaGF2ZSBhbiBhY3RpdmUgY29tcG9uZW50IGl0ZW0nKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ3N0YWNrJyxcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRoaXMuY2FsY3VsYXRlQ29uZmlnQ29udGVudCgpIGFzIFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZ1tdLFxyXG4gICAgICAgICAgICAgICAgc2l6ZTogdGhpcy5zaXplLFxyXG4gICAgICAgICAgICAgICAgc2l6ZVVuaXQ6IHRoaXMuc2l6ZVVuaXQsXHJcbiAgICAgICAgICAgICAgICBtaW5TaXplOiB0aGlzLm1pblNpemUsXHJcbiAgICAgICAgICAgICAgICBtaW5TaXplVW5pdDogdGhpcy5taW5TaXplVW5pdCxcclxuICAgICAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxyXG4gICAgICAgICAgICAgICAgaXNDbG9zYWJsZTogdGhpcy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgICAgICAgICAgbWF4aW1pc2VkOiB0aGlzLmlzTWF4aW1pc2VkLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyOiB0aGlzLmNyZWF0ZUhlYWRlckNvbmZpZygpLFxyXG4gICAgICAgICAgICAgICAgYWN0aXZlSXRlbUluZGV4LFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2ssIHRoaXMgb25lIGlzIGdvaW5nIHRvIGJlIHRoZSB0cmlja3kgb25lOiBUaGUgdXNlciBoYXMgZHJvcHBlZCBhIHtAbGluayAoQ29udGVudEl0ZW06Y2xhc3MpfSBvbnRvIHRoaXMgc3RhY2suXHJcbiAgICAgKlxyXG4gICAgICogSXQgd2FzIGRyb3BwZWQgb24gZWl0aGVyIHRoZSBzdGFja3MgaGVhZGVyIG9yIHRoZSB0b3AsIHJpZ2h0LCBib3R0b20gb3IgbGVmdCBiaXQgb2YgdGhlIGNvbnRlbnQgYXJlYVxyXG4gICAgICogKHdoaWNoIG9uZSBvZiB0aG9zZSBpcyBzdG9yZWQgaW4gdGhpcy5fZHJvcFNlZ21lbnQpLiBOb3csIGlmIHRoZSB1c2VyIGhhcyBkcm9wcGVkIG9uIHRoZSBoZWFkZXIgdGhlIGNhc2VcclxuICAgICAqIGlzIHJlbGF0aXZlbHkgY2xlYXI6IFdlIGFkZCB0aGUgaXRlbSB0byB0aGUgZXhpc3Rpbmcgc3RhY2suLi4gam9iIGRvbmUgKG1pZ2h0IGJlIGdvb2QgdG8gaGF2ZVxyXG4gICAgICogdGFiIHJlb3JkZXJpbmcgYXQgc29tZSBwb2ludCwgYnV0IGxldHMgbm90IHN3ZWF0IGl0IHJpZ2h0IG5vdylcclxuICAgICAqXHJcbiAgICAgKiBJZiB0aGUgaXRlbSB3YXMgZHJvcHBlZCBvbiB0aGUgY29udGVudCBwYXJ0IHRoaW5ncyBhcmUgYSBiaXQgbW9yZSBjb21wbGljYXRlZC4gSWYgaXQgd2FzIGRyb3BwZWQgb24gZWl0aGVyIHRoZVxyXG4gICAgICogdG9wIG9yIGJvdHRvbSByZWdpb24gd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgY29sdW1uIGFuZCBwbGFjZSB0aGUgaXRlbXMgYWNjb3JkaW5nbHkuXHJcbiAgICAgKiBVbmxlc3MsIG9mIGNvdXJzZSBpZiB0aGUgc3RhY2sgaXMgYWxyZWFkeSB3aXRoaW4gYSBjb2x1bW4uLi4gaW4gd2hpY2ggY2FzZSB3ZSB3YW50XHJcbiAgICAgKiB0byBhZGQgdGhlIG5ld2x5IGNyZWF0ZWQgaXRlbSB0byB0aGUgZXhpc3RpbmcgY29sdW1uLi4uXHJcbiAgICAgKiBlaXRoZXIgcHJlcGVuZCBvciBhcHBlbmQgaXQsIGRlcGVuZGluZyBvbiB3ZXRoZXIgaXRzIHRvcCBvciBib3R0b20uXHJcbiAgICAgKlxyXG4gICAgICogU2FtZSB0aGluZyBmb3Igcm93cyBhbmQgbGVmdCAvIHJpZ2h0IGRyb3Agc2VnbWVudHMuLi4gc28gaW4gdG90YWwgdGhlcmUgYXJlIDkgdGhpbmdzIHRoYXQgY2FuIHBvdGVudGlhbGx5IGhhcHBlblxyXG4gICAgICogKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSkgKiBpcyBjaGlsZCBvZiB0aGUgcmlnaHQgcGFyZW50IChyb3csIGNvbHVtbikgKyBoZWFkZXIgZHJvcFxyXG4gICAgICpcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBvdmVycmlkZSBvbkRyb3AoY29udGVudEl0ZW06IENvbnRlbnRJdGVtLCBhcmVhOiBDb250ZW50SXRlbS5BcmVhKTogdm9pZCB7XHJcbiAgICAgICAgLypcclxuICAgICAgICAgKiBUaGUgaXRlbSB3YXMgZHJvcHBlZCBvbiB0aGUgaGVhZGVyIGFyZWEuIEp1c3QgYWRkIGl0IGFzIGEgY2hpbGQgb2YgdGhpcyBzdGFjayBhbmRcclxuICAgICAgICAgKiBnZXQgdGhlIGhlbGwgb3V0IG9mIHRoaXMgbG9naWNcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAodGhpcy5fZHJvcFNlZ21lbnQgPT09IFN0YWNrLlNlZ21lbnQuSGVhZGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzZXRIZWFkZXJEcm9wWm9uZSgpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZHJvcEluZGV4ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ1NPRERJNjg5OTAnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGQoY29udGVudEl0ZW0sIHRoaXMuX2Ryb3BJbmRleCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICogVGhlIHN0YWNrIGlzIGVtcHR5LiBMZXQncyBqdXN0IGFkZCB0aGUgZWxlbWVudC5cclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAodGhpcy5fZHJvcFNlZ21lbnQgPT09IFN0YWNrLlNlZ21lbnQuQm9keSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZENoaWxkKGNvbnRlbnRJdGVtLCAwLCB0cnVlKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLypcclxuICAgICAgICAgKiBUaGUgaXRlbSB3YXMgZHJvcHBlZCBvbiB0aGUgdG9wLSwgbGVmdC0sIGJvdHRvbS0gb3IgcmlnaHQtIHBhcnQgb2YgdGhlIGNvbnRlbnQuIExldCdzXHJcbiAgICAgICAgICogYWdncmVnYXRlIHNvbWUgY29uZGl0aW9ucyB0byBtYWtlIHRoZSBpZiBzdGF0ZW1lbnRzIGxhdGVyIG9uIG1vcmUgcmVhZGFibGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBpc1ZlcnRpY2FsID0gdGhpcy5fZHJvcFNlZ21lbnQgPT09IFN0YWNrLlNlZ21lbnQuVG9wIHx8IHRoaXMuX2Ryb3BTZWdtZW50ID09PSBTdGFjay5TZWdtZW50LkJvdHRvbTtcclxuICAgICAgICBjb25zdCBpc0hvcml6b250YWwgPSB0aGlzLl9kcm9wU2VnbWVudCA9PT0gU3RhY2suU2VnbWVudC5MZWZ0IHx8IHRoaXMuX2Ryb3BTZWdtZW50ID09PSBTdGFjay5TZWdtZW50LlJpZ2h0O1xyXG4gICAgICAgIGNvbnN0IGluc2VydEJlZm9yZSA9IHRoaXMuX2Ryb3BTZWdtZW50ID09PSBTdGFjay5TZWdtZW50LlRvcCB8fCB0aGlzLl9kcm9wU2VnbWVudCA9PT0gU3RhY2suU2VnbWVudC5MZWZ0O1xyXG4gICAgICAgIGNvbnN0IGhhc0NvcnJlY3RQYXJlbnQgPSAoaXNWZXJ0aWNhbCAmJiB0aGlzLnN0YWNrUGFyZW50LmlzQ29sdW1uKSB8fCAoaXNIb3Jpem9udGFsICYmIHRoaXMuc3RhY2tQYXJlbnQuaXNSb3cpO1xyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIFRoZSBjb250ZW50IGl0ZW0gY2FuIGJlIGVpdGhlciBhIGNvbXBvbmVudCBvciBhIHN0YWNrLiBJZiBpdCBpcyBhIGNvbXBvbmVudCwgd3JhcCBpdCBpbnRvIGEgc3RhY2tcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoY29udGVudEl0ZW0uaXNDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbUNvbmZpZyA9IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnLmNyZWF0ZURlZmF1bHQoKTtcclxuICAgICAgICAgICAgaXRlbUNvbmZpZy5oZWFkZXIgPSAoY29udGVudEl0ZW0gYXMgQ29tcG9uZW50SXRlbSkuaGVhZGVyQ29uZmlnO1xyXG4gICAgICAgICAgICBjb25zdCBzdGFjayA9IHRoaXMubGF5b3V0TWFuYWdlci5jcmVhdGVBbmRJbml0Q29udGVudEl0ZW0oaXRlbUNvbmZpZywgdGhpcyk7XHJcbiAgICAgICAgICAgIHN0YWNrLmFkZENoaWxkKGNvbnRlbnRJdGVtKTtcclxuICAgICAgICAgICAgY29udGVudEl0ZW0gPSBzdGFjaztcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIElmIHRoZSBjb250ZW50SXRlbSB0aGF0J3MgYmVpbmcgZHJvcHBlZCBpcyBub3QgZHJvcHBlZCBvbiBhIFN0YWNrIChjYXNlcyB3aGljaCBqdXN0IHBhc3NlZCBhYm92ZSBhbmRcclxuICAgICAgICAgKiB3aGljaCB3b3VsZCB3cmFwIHRoZSBjb250ZW50SXRlbSBpbiBhIFN0YWNrKSB3ZSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgY29udGVudEl0ZW0gaXMgYSBSb3dPckNvbHVtbi5cclxuICAgICAgICAgKiBJZiBpdCBpcywgd2UgbmVlZCB0byByZS13cmFwIGl0IGluIGEgU3RhY2sgbGlrZSBpdCB3YXMgd2hlbiBpdCB3YXMgZHJhZ2dlZCBieSBpdHMgVGFiIChpdCB3YXMgZHJhZ2dlZCEpLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmKGNvbnRlbnRJdGVtLnR5cGUgPT09IEl0ZW1UeXBlLnJvdyB8fCBjb250ZW50SXRlbS50eXBlID09PSBJdGVtVHlwZS5jb2x1bW4pe1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtQ29uZmlnID0gUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcuY3JlYXRlRGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBpdGVtQ29uZmlnLmhlYWRlciA9IHRoaXMuY3JlYXRlSGVhZGVyQ29uZmlnKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmNyZWF0ZUNvbnRlbnRJdGVtKGl0ZW1Db25maWcsIHRoaXMpO1xyXG4gICAgICAgICAgICBzdGFjay5hZGRDaGlsZChjb250ZW50SXRlbSlcclxuICAgICAgICAgICAgY29udGVudEl0ZW0gPSBzdGFja1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLypcclxuICAgICAgICAgKiBJZiB0aGUgaXRlbSBpcyBkcm9wcGVkIG9uIHRvcCBvciBib3R0b20gb2YgYSBjb2x1bW4gb3IgbGVmdCBhbmQgcmlnaHQgb2YgYSByb3csIGl0J3MgYWxyZWFkeVxyXG4gICAgICAgICAqIGxheWQgb3V0IGluIHRoZSBjb3JyZWN0IHdheS4gSnVzdCBhZGQgaXQgYXMgYSBjaGlsZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChoYXNDb3JyZWN0UGFyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zdGFja1BhcmVudC5jb250ZW50SXRlbXMuaW5kZXhPZih0aGlzKTtcclxuICAgICAgICAgICAgdGhpcy5zdGFja1BhcmVudC5hZGRDaGlsZChjb250ZW50SXRlbSwgaW5zZXJ0QmVmb3JlID8gaW5kZXggOiBpbmRleCArIDEsIHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLnNpemUgKj0gMC41O1xyXG4gICAgICAgICAgICBjb250ZW50SXRlbS5zaXplID0gdGhpcy5zaXplO1xyXG4gICAgICAgICAgICBjb250ZW50SXRlbS5zaXplVW5pdCA9IHRoaXMuc2l6ZVVuaXQ7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhY2tQYXJlbnQudXBkYXRlU2l6ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAqIFRoaXMgaGFuZGxlcyBpdGVtcyB0aGF0IGFyZSBkcm9wcGVkIG9uIHRvcCBvciBib3R0b20gb2YgYSByb3cgb3IgbGVmdCAvIHJpZ2h0IG9mIGEgY29sdW1uLiBXZSBuZWVkXHJcbiAgICAgICAgICAgICAqIHRvIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgY29udGVudEl0ZW0gZm9yIHRoZW0gdG8gbGl2ZSBpblxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gaXNWZXJ0aWNhbCA/IEl0ZW1UeXBlLmNvbHVtbiA6IEl0ZW1UeXBlLnJvdztcclxuICAgICAgICAgICAgY29uc3QgaXRlbUNvbmZpZyA9IFJlc29sdmVkSXRlbUNvbmZpZy5jcmVhdGVEZWZhdWx0KHR5cGUpIGFzIFJlc29sdmVkSXRlbUNvbmZpZztcclxuICAgICAgICAgICAgY29uc3Qgcm93T3JDb2x1bW4gPSB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlQ29udGVudEl0ZW0oaXRlbUNvbmZpZywgdGhpcyk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhY2tQYXJlbnQucmVwbGFjZUNoaWxkKHRoaXMsIHJvd09yQ29sdW1uKTtcclxuXHJcbiAgICAgICAgICAgIHJvd09yQ29sdW1uLmFkZENoaWxkKGNvbnRlbnRJdGVtLCBpbnNlcnRCZWZvcmUgPyAwIDogdW5kZWZpbmVkLCB0cnVlKTtcclxuICAgICAgICAgICAgcm93T3JDb2x1bW4uYWRkQ2hpbGQodGhpcywgaW5zZXJ0QmVmb3JlID8gdW5kZWZpbmVkIDogMCwgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNpemUgPSA1MDtcclxuICAgICAgICAgICAgY29udGVudEl0ZW0uc2l6ZSA9IDUwO1xyXG4gICAgICAgICAgICBjb250ZW50SXRlbS5zaXplVW5pdCA9IFNpemVVbml0RW51bS5QZXJjZW50O1xyXG4gICAgICAgICAgICByb3dPckNvbHVtbi51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZiB0aGUgdXNlciBob3ZlcnMgYWJvdmUgdGhlIGhlYWRlciBwYXJ0IG9mIHRoZSBzdGFjaywgaW5kaWNhdGUgZHJvcCBwb3NpdGlvbnMgZm9yIHRhYnMuXHJcbiAgICAgKiBvdGhlcndpc2UgaW5kaWNhdGUgd2hpY2ggc2VnbWVudCBvZiB0aGUgYm9keSB0aGUgZHJhZ2dlZCBpdGVtIHdvdWxkIGJlIGRyb3BwZWQgb25cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geCAtIEFic29sdXRlIFNjcmVlbiBYXHJcbiAgICAgKiBAcGFyYW0geSAtIEFic29sdXRlIFNjcmVlbiBZXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgb3ZlcnJpZGUgaGlnaGxpZ2h0RHJvcFpvbmUoeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLl9jb250ZW50QXJlYURpbWVuc2lvbnMpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IGtleSBhcyBTdGFjay5TZWdtZW50O1xyXG4gICAgICAgICAgICBjb25zdCBhcmVhID0gdGhpcy5fY29udGVudEFyZWFEaW1lbnNpb25zW3NlZ21lbnRdLmhvdmVyQXJlYTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhcmVhLngxIDwgeCAmJiBhcmVhLngyID4geCAmJiBhcmVhLnkxIDwgeSAmJiBhcmVhLnkyID4geSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzZWdtZW50ID09PSBTdGFjay5TZWdtZW50LkhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Ryb3BTZWdtZW50ID0gU3RhY2suU2VnbWVudC5IZWFkZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRIZWFkZXJEcm9wWm9uZSh0aGlzLl9oZWFkZXIubGVmdFJpZ2h0U2lkZWQgPyB5IDogeCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzZXRIZWFkZXJEcm9wWm9uZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0Qm9keURyb3Bab25lKHNlZ21lbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBnZXRBcmVhKCk6IENvbnRlbnRJdGVtLkFyZWEgfCBudWxsIHtcclxuICAgICAgICBpZiAodGhpcy5lbGVtZW50LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGhlYWRlckFyZWEgPSBzdXBlci5nZXRFbGVtZW50QXJlYSh0aGlzLl9oZWFkZXIuZWxlbWVudCk7XHJcbiAgICAgICAgY29uc3QgY29udGVudEFyZWEgPSBzdXBlci5nZXRFbGVtZW50QXJlYSh0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIpO1xyXG4gICAgICAgIGlmIChoZWFkZXJBcmVhID09PSBudWxsIHx8IGNvbnRlbnRBcmVhID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdTR0FIQzEzMDg2Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRXaWR0aCA9IGNvbnRlbnRBcmVhLngyIC0gY29udGVudEFyZWEueDE7XHJcbiAgICAgICAgY29uc3QgY29udGVudEhlaWdodCA9IGNvbnRlbnRBcmVhLnkyIC0gY29udGVudEFyZWEueTE7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbnRlbnRBcmVhRGltZW5zaW9ucyA9IHtcclxuICAgICAgICAgICAgaGVhZGVyOiB7XHJcbiAgICAgICAgICAgICAgICBob3ZlckFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogaGVhZGVyQXJlYS54MSxcclxuICAgICAgICAgICAgICAgICAgICB5MTogaGVhZGVyQXJlYS55MSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogaGVhZGVyQXJlYS54MixcclxuICAgICAgICAgICAgICAgICAgICB5MjogaGVhZGVyQXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodEFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogaGVhZGVyQXJlYS54MSxcclxuICAgICAgICAgICAgICAgICAgICB5MTogaGVhZGVyQXJlYS55MSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogaGVhZGVyQXJlYS54MixcclxuICAgICAgICAgICAgICAgICAgICB5MjogaGVhZGVyQXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSGlnaGxpZ2h0IHRoZSBlbnRpcmUgYm9keSBpZiB0aGUgc3RhY2sgaXMgZW1wdHlcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAodGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID09PSAwKSB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9jb250ZW50QXJlYURpbWVuc2lvbnMuYm9keSA9IHtcclxuICAgICAgICAgICAgICAgIGhvdmVyQXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiBjb250ZW50QXJlYS54MSxcclxuICAgICAgICAgICAgICAgICAgICB5MTogY29udGVudEFyZWEueTEsXHJcbiAgICAgICAgICAgICAgICAgICAgeDI6IGNvbnRlbnRBcmVhLngyLFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodEFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IGNvbnRlbnRBcmVhLnkxLFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiBjb250ZW50QXJlYS54MixcclxuICAgICAgICAgICAgICAgICAgICB5MjogY29udGVudEFyZWEueTJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRFbGVtZW50QXJlYSh0aGlzLmVsZW1lbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRBcmVhRGltZW5zaW9ucy5sZWZ0ID0ge1xyXG4gICAgICAgICAgICAgICAgaG92ZXJBcmVhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDE6IGNvbnRlbnRBcmVhLngxLFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBjb250ZW50QXJlYS55MSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogY29udGVudEFyZWEueDEgKyBjb250ZW50V2lkdGggKiAwLjI1LFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodEFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IGNvbnRlbnRBcmVhLnkxLFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiBjb250ZW50QXJlYS54MSArIGNvbnRlbnRXaWR0aCAqIDAuNSxcclxuICAgICAgICAgICAgICAgICAgICB5MjogY29udGVudEFyZWEueTJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRBcmVhRGltZW5zaW9ucy50b3AgPSB7XHJcbiAgICAgICAgICAgICAgICBob3ZlckFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEgKyBjb250ZW50V2lkdGggKiAwLjI1LFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBjb250ZW50QXJlYS55MSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogY29udGVudEFyZWEueDEgKyBjb250ZW50V2lkdGggKiAwLjc1LFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MSArIGNvbnRlbnRIZWlnaHQgKiAwLjVcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRBcmVhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDE6IGNvbnRlbnRBcmVhLngxLFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBjb250ZW50QXJlYS55MSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogY29udGVudEFyZWEueDIsXHJcbiAgICAgICAgICAgICAgICAgICAgeTI6IGNvbnRlbnRBcmVhLnkxICsgY29udGVudEhlaWdodCAqIDAuNVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fY29udGVudEFyZWFEaW1lbnNpb25zLnJpZ2h0ID0ge1xyXG4gICAgICAgICAgICAgICAgaG92ZXJBcmVhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDE6IGNvbnRlbnRBcmVhLngxICsgY29udGVudFdpZHRoICogMC43NSxcclxuICAgICAgICAgICAgICAgICAgICB5MTogY29udGVudEFyZWEueTEsXHJcbiAgICAgICAgICAgICAgICAgICAgeDI6IGNvbnRlbnRBcmVhLngyLFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodEFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEgKyBjb250ZW50V2lkdGggKiAwLjUsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IGNvbnRlbnRBcmVhLnkxLFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiBjb250ZW50QXJlYS54MixcclxuICAgICAgICAgICAgICAgICAgICB5MjogY29udGVudEFyZWEueTJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRBcmVhRGltZW5zaW9ucy5ib3R0b20gPSB7XHJcbiAgICAgICAgICAgICAgICBob3ZlckFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEgKyBjb250ZW50V2lkdGggKiAwLjI1LFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBjb250ZW50QXJlYS55MSArIGNvbnRlbnRIZWlnaHQgKiAwLjUsXHJcbiAgICAgICAgICAgICAgICAgICAgeDI6IGNvbnRlbnRBcmVhLngxICsgY29udGVudFdpZHRoICogMC43NSxcclxuICAgICAgICAgICAgICAgICAgICB5MjogY29udGVudEFyZWEueTJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRBcmVhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDE6IGNvbnRlbnRBcmVhLngxLFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBjb250ZW50QXJlYS55MSArIGNvbnRlbnRIZWlnaHQgKiAwLjUsXHJcbiAgICAgICAgICAgICAgICAgICAgeDI6IGNvbnRlbnRBcmVhLngyLFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRBcmVhKHRoaXMuZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvZ3JhbW1hdGljYWxseSBvcGVyYXRlIHdpdGggaGVhZGVyIHBvc2l0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBwb3NpdGlvbiAtXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgcHJldmlvdXMgaGVhZGVyIHBvc2l0aW9uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcG9zaXRpb25IZWFkZXIocG9zaXRpb246IFNpZGUpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5faGVhZGVyLnNpZGUgIT09IHBvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2hlYWRlci5zZXRTaWRlKHBvc2l0aW9uKTtcclxuICAgICAgICAgICAgdGhpcy5faGVhZGVyU2lkZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnNldHVwSGVhZGVyUG9zaXRpb24oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVOb2RlU2l6ZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5lbGVtZW50LnN0eWxlLmRpc3BsYXkgIT09ICdub25lJykge1xyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50OiBXaWR0aEFuZEhlaWdodCA9IGdldEVsZW1lbnRXaWR0aEFuZEhlaWdodCh0aGlzLmVsZW1lbnQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2hlYWRlci5zaG93KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaW1lbnNpb24gPSB0aGlzLl9oZWFkZXIubGVmdFJpZ2h0U2lkZWQgPyBXaWR0aE9ySGVpZ2h0UHJvcGVydHlOYW1lLndpZHRoIDogV2lkdGhPckhlaWdodFByb3BlcnR5TmFtZS5oZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50W2RpbWVuc2lvbl0gLT0gdGhpcy5sYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5kaW1lbnNpb25zLmhlYWRlckhlaWdodDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRFbGVtZW50V2lkdGgodGhpcy5fY2hpbGRFbGVtZW50Q29udGFpbmVyLCBjb250ZW50LndpZHRoKTtcclxuICAgICAgICAgICAgc2V0RWxlbWVudEhlaWdodCh0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIsIGNvbnRlbnQuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHNldEVsZW1lbnRXaWR0aCh0aGlzLmNvbnRlbnRJdGVtc1tpXS5lbGVtZW50LCBjb250ZW50LndpZHRoKTtcclxuICAgICAgICAgICAgICAgIHNldEVsZW1lbnRIZWlnaHQodGhpcy5jb250ZW50SXRlbXNbaV0uZWxlbWVudCwgY29udGVudC5oZWlnaHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgncmVzaXplJyk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlZEV2ZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGlnaGxpZ2h0SGVhZGVyRHJvcFpvbmUoeDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdmlzaWJsZVRhYnNMZW5ndGggPSB0aGlzLl9oZWFkZXIubGFzdFZpc2libGVUYWJJbmRleCArIDE7XHJcbiAgICAgICAgY29uc3QgdGFic0NvbnRhaW5lckVsZW1lbnQgPSB0aGlzLl9oZWFkZXIudGFic0NvbnRhaW5lckVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgdGFic0NvbnRhaW5lckVsZW1lbnRDaGlsZE5vZGVzID0gdGFic0NvbnRhaW5lckVsZW1lbnQuY2hpbGROb2RlcztcclxuXHJcbiAgICAgICAgLy8gQ3JlYXRlIHNoYWxsb3cgY29weSBvZiBjaGlsZE5vZGVzIGxpc3QsIGV4Y2x1ZGluZyBEcm9wUGxhY2VIb2xkZXIsIGFzIHdlIHdpbGwgYmUgbW9kaWZ5aW5nIHRoZSBjaGlsZE5vZGVzIGxpc3RcclxuICAgICAgICBjb25zdCB2aXNpYmxlVGFiRWxlbWVudHMgPSBuZXcgQXJyYXk8SFRNTEVsZW1lbnQ+KHZpc2libGVUYWJzTGVuZ3RoKTtcclxuICAgICAgICBsZXQgdGFiSW5kZXggPSAwO1xyXG4gICAgICAgIGxldCB0YWJDb3VudCA9IDA7XHJcbiAgICAgICAgd2hpbGUgKHRhYkNvdW50IDwgdmlzaWJsZVRhYnNMZW5ndGgpIHtcclxuICAgICAgICAgICAgY29uc3QgdmlzaWJsZVRhYkVsZW1lbnQgPSB0YWJzQ29udGFpbmVyRWxlbWVudENoaWxkTm9kZXNbdGFiSW5kZXgrK10gYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmICh2aXNpYmxlVGFiRWxlbWVudCAhPT0gdGhpcy5sYXlvdXRNYW5hZ2VyLnRhYkRyb3BQbGFjZWhvbGRlcikge1xyXG4gICAgICAgICAgICAgICAgdmlzaWJsZVRhYkVsZW1lbnRzW3RhYkNvdW50KytdID0gdmlzaWJsZVRhYkVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRyb3BUYXJnZXRJbmRpY2F0b3IgPSB0aGlzLmxheW91dE1hbmFnZXIuZHJvcFRhcmdldEluZGljYXRvcjtcclxuICAgICAgICBpZiAoZHJvcFRhcmdldEluZGljYXRvciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignU0hIRFpEVEk5NzExMCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGFyZWE6IEFyZWFMaW5rZWRSZWN0O1xyXG5cclxuICAgICAgICAvLyBFbXB0eSBzdGFja1xyXG4gICAgICAgIGlmICh2aXNpYmxlVGFic0xlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJSZWN0ID0gdGhpcy5faGVhZGVyLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlclRvcCA9IGhlYWRlclJlY3QudG9wICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlckxlZnQgPSBoZWFkZXJSZWN0LmxlZnQgKyBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQ7XHJcblxyXG4gICAgICAgICAgICBhcmVhID0ge1xyXG4gICAgICAgICAgICAgICAgeDE6IGhlYWRlckxlZnQsXHJcbiAgICAgICAgICAgICAgICB4MjogaGVhZGVyTGVmdCArIDEwMCxcclxuICAgICAgICAgICAgICAgIHkxOiBoZWFkZXJUb3AgKyBoZWFkZXJSZWN0LmhlaWdodCAtIDIwLFxyXG4gICAgICAgICAgICAgICAgeTI6IGhlYWRlclRvcCArIGhlYWRlclJlY3QuaGVpZ2h0LFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fZHJvcEluZGV4ID0gMDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgdGFiSW5kZXggPSAwO1xyXG4gICAgICAgICAgICAvLyBUaGlzIGluZGljYXRlcyB3aGV0aGVyIG91ciBjdXJzb3IgaXMgZXhhY3RseSBvdmVyIGEgdGFiXHJcbiAgICAgICAgICAgIGxldCBpc0Fib3ZlVGFiID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGxldCB0YWJUb3A6IG51bWJlcjtcclxuICAgICAgICAgICAgbGV0IHRhYkxlZnQ6IG51bWJlcjtcclxuICAgICAgICAgICAgbGV0IHRhYldpZHRoOiBudW1iZXI7XHJcbiAgICAgICAgICAgIGxldCB0YWJFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICAgICAgdGFiRWxlbWVudCA9IHZpc2libGVUYWJFbGVtZW50c1t0YWJJbmRleF0gYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJSZWN0ID0gdGFiRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhYlJlY3RUb3AgPSB0YWJSZWN0LnRvcCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFiUmVjdExlZnQgPSB0YWJSZWN0LmxlZnQgKyBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2hlYWRlci5sZWZ0UmlnaHRTaWRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRhYkxlZnQgPSB0YWJSZWN0VG9wO1xyXG4gICAgICAgICAgICAgICAgICAgIHRhYlRvcCA9IHRhYlJlY3RMZWZ0O1xyXG4gICAgICAgICAgICAgICAgICAgIHRhYldpZHRoID0gdGFiUmVjdC5oZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRhYkxlZnQgPSB0YWJSZWN0TGVmdDtcclxuICAgICAgICAgICAgICAgICAgICB0YWJUb3AgPSB0YWJSZWN0VG9wO1xyXG4gICAgICAgICAgICAgICAgICAgIHRhYldpZHRoID0gdGFiUmVjdC53aWR0aDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoeCA+PSB0YWJMZWZ0ICYmIHggPCB0YWJMZWZ0ICsgdGFiV2lkdGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBpc0Fib3ZlVGFiID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFiSW5kZXgrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSB3aGlsZSAodGFiSW5kZXggPCB2aXNpYmxlVGFic0xlbmd0aCAmJiAhaXNBYm92ZVRhYik7XHJcblxyXG4gICAgICAgICAgICAvLyBJZiB3ZSdyZSBub3QgYWJvdmUgYW55IHRhYnMsIG9yIHRvIHRoZSByaWdodCBvZiBhbnkgdGFiLCB3ZSBhcmUgb3V0IG9mIHRoZSBhcmVhLCBzbyBnaXZlIHVwXHJcbiAgICAgICAgICAgIGlmIChpc0Fib3ZlVGFiID09PSBmYWxzZSAmJiB4IDwgdGFiTGVmdCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBoYWxmWCA9IHRhYkxlZnQgKyB0YWJXaWR0aCAvIDI7XHJcblxyXG4gICAgICAgICAgICBpZiAoeCA8IGhhbGZYKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kcm9wSW5kZXggPSB0YWJJbmRleDtcclxuICAgICAgICAgICAgICAgIHRhYkVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdiZWZvcmViZWdpbicsIHRoaXMubGF5b3V0TWFuYWdlci50YWJEcm9wUGxhY2Vob2xkZXIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZHJvcEluZGV4ID0gTWF0aC5taW4odGFiSW5kZXggKyAxLCB2aXNpYmxlVGFic0xlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICB0YWJFbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCB0aGlzLmxheW91dE1hbmFnZXIudGFiRHJvcFBsYWNlaG9sZGVyKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgdGFiRHJvcFBsYWNlaG9sZGVyUmVjdCA9IHRoaXMubGF5b3V0TWFuYWdlci50YWJEcm9wUGxhY2Vob2xkZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhYkRyb3BQbGFjZWhvbGRlclJlY3RUb3AgPSB0YWJEcm9wUGxhY2Vob2xkZXJSZWN0LnRvcCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICBjb25zdCB0YWJEcm9wUGxhY2Vob2xkZXJSZWN0TGVmdCA9IHRhYkRyb3BQbGFjZWhvbGRlclJlY3QubGVmdCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9oZWFkZXIubGVmdFJpZ2h0U2lkZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlSG9sZGVyVG9wID0gdGFiRHJvcFBsYWNlaG9sZGVyUmVjdFRvcDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhYkRyb3BQbGFjZWhvbGRlclJlY3RXaWR0aCA9IHRhYkRyb3BQbGFjZWhvbGRlclJlY3QuaGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgICAgIGFyZWEgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDE6IHRhYlRvcCxcclxuICAgICAgICAgICAgICAgICAgICB4MjogdGFiVG9wICsgdGFiRWxlbWVudC5jbGllbnRIZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IHBsYWNlSG9sZGVyVG9wLFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBwbGFjZUhvbGRlclRvcCArIHRhYkRyb3BQbGFjZWhvbGRlclJlY3RXaWR0aCxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwbGFjZUhvbGRlckxlZnQgPSB0YWJEcm9wUGxhY2Vob2xkZXJSZWN0TGVmdDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhYkRyb3BQbGFjZWhvbGRlclJlY3RXaWR0aCA9IHRhYkRyb3BQbGFjZWhvbGRlclJlY3Qud2lkdGg7XHJcblxyXG4gICAgICAgICAgICAgICAgYXJlYSA9IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogcGxhY2VIb2xkZXJMZWZ0LFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiBwbGFjZUhvbGRlckxlZnQgKyB0YWJEcm9wUGxhY2Vob2xkZXJSZWN0V2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IHRhYlRvcCxcclxuICAgICAgICAgICAgICAgICAgICB5MjogdGFiVG9wICsgdGFiRWxlbWVudC5jbGllbnRIZWlnaHQsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkcm9wVGFyZ2V0SW5kaWNhdG9yLmhpZ2hsaWdodEFyZWEoYXJlYSwgMCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVzZXRIZWFkZXJEcm9wWm9uZSgpIHtcclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIudGFiRHJvcFBsYWNlaG9sZGVyLnJlbW92ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgc2V0dXBIZWFkZXJQb3NpdGlvbigpIHtcclxuICAgICAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkodGhpcy5faGVhZGVyLmVsZW1lbnQsIHRoaXMuX2hlYWRlci5zaG93KTtcclxuICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShEb21Db25zdGFudHMuQ2xhc3NOYW1lLkxlZnQsIERvbUNvbnN0YW50cy5DbGFzc05hbWUuUmlnaHQsIERvbUNvbnN0YW50cy5DbGFzc05hbWUuQm90dG9tKTtcclxuICAgICAgICBpZiAodGhpcy5faGVhZGVyLnNpZGUgIT09IFNpZGUudG9wKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsbV8nICsgdGhpcy5faGVhZGVyLnNpZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9pZiAoW1NpZGUucmlnaHQsIFNpZGUuYm90dG9tXS5pbmNsdWRlcyh0aGlzLl9oZWFkZXIuc2lkZSkpIHtcclxuICAgICAgICAvLyAgICAvLyBtb3ZlIHRoZSBoZWFkZXIgYmVoaW5kIHRoZSBjb250ZW50LlxyXG4gICAgICAgIC8vICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9oZWFkZXIuZWxlbWVudCk7XHJcbiAgICAgICAgLy99XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhpZ2hsaWdodEJvZHlEcm9wWm9uZShzZWdtZW50OiBTdGFjay5TZWdtZW50KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbnRlbnRBcmVhRGltZW5zaW9ucyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ1NIQkRaQzgyMjY1Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgaGlnaGxpZ2h0QXJlYSA9IHRoaXMuX2NvbnRlbnRBcmVhRGltZW5zaW9uc1tzZWdtZW50XS5oaWdobGlnaHRBcmVhO1xyXG4gICAgICAgICAgICBjb25zdCBkcm9wVGFyZ2V0SW5kaWNhdG9yID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmRyb3BUYXJnZXRJbmRpY2F0b3I7XHJcbiAgICAgICAgICAgIGlmIChkcm9wVGFyZ2V0SW5kaWNhdG9yID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignU0hCRFpEOTYxMTAnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRyb3BUYXJnZXRJbmRpY2F0b3IuaGlnaGxpZ2h0QXJlYShoaWdobGlnaHRBcmVhLCAxKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Ryb3BTZWdtZW50ID0gc2VnbWVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZVJlc2l6ZSgpIHtcclxuICAgICAgICB0aGlzLl9oZWFkZXIudXBkYXRlVGFiU2l6ZXMoKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlTWF4aW1pc2VkKCkge1xyXG4gICAgICAgIHRoaXMuX2hlYWRlci5wcm9jZXNzTWF4aW1pc2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVNaW5pbWlzZWQoKSB7XHJcbiAgICAgICAgdGhpcy5faGVhZGVyLnByb2Nlc3NNaW5pbWlzZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZVBvcG91dEV2ZW50KCkge1xyXG4gICAgICAgIHRoaXMucG9wb3V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVIZWFkZXJDbGlja0V2ZW50KGV2OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgZXZlbnROYW1lID0gRXZlbnRFbWl0dGVyLmhlYWRlckNsaWNrRXZlbnROYW1lO1xyXG4gICAgICAgIGNvbnN0IGJ1YmJsaW5nRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyLkNsaWNrQnViYmxpbmdFdmVudChldmVudE5hbWUsIHRoaXMsIGV2KTtcclxuICAgICAgICB0aGlzLmVtaXQoZXZlbnROYW1lLCBidWJibGluZ0V2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUhlYWRlclRvdWNoU3RhcnRFdmVudChldjogVG91Y2hFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IEV2ZW50RW1pdHRlci5oZWFkZXJUb3VjaFN0YXJ0RXZlbnROYW1lO1xyXG4gICAgICAgIGNvbnN0IGJ1YmJsaW5nRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyLlRvdWNoU3RhcnRCdWJibGluZ0V2ZW50KGV2ZW50TmFtZSwgdGhpcywgZXYpO1xyXG4gICAgICAgIHRoaXMuZW1pdChldmVudE5hbWUsIGJ1YmJsaW5nRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlSGVhZGVyQ29tcG9uZW50UmVtb3ZlRXZlbnQoaXRlbTogQ29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlQ2hpbGQoaXRlbSwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlSGVhZGVyQ29tcG9uZW50Rm9jdXNFdmVudChpdGVtOiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgdGhpcy5zZXRBY3RpdmVDb21wb25lbnRJdGVtKGl0ZW0sIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlSGVhZGVyQ29tcG9uZW50U3RhcnREcmFnRXZlbnQoeDogbnVtYmVyLCB5OiBudW1iZXIsIGRyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNNYXhpbWlzZWQgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy50b2dnbGVNYXhpbWlzZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuc3RhcnRDb21wb25lbnREcmFnKHgsIHksIGRyYWdMaXN0ZW5lciwgY29tcG9uZW50SXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVIZWFkZXJDb25maWcoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9oZWFkZXJTaWRlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyLmNyZWF0ZUNvcHkodGhpcy5faGVhZGVyQ29uZmlnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBzaG93ID0gdGhpcy5faGVhZGVyLnNob3cgPyB0aGlzLl9oZWFkZXIuc2lkZSA6IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlci5jcmVhdGVDb3B5KHRoaXMuX2hlYWRlckNvbmZpZywgc2hvdyk7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3csXHJcbiAgICAgICAgICAgICAgICAgICAgcG9wb3V0OiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgbWF4aW1pc2U6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICBjbG9zZTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIG1pbmltaXNlOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGFiRHJvcGRvd246IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBlbWl0U3RhdGVDaGFuZ2VkRXZlbnQoKSB7XHJcbiAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ3N0YXRlQ2hhbmdlZCcpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFN0YWNrIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBjb25zdCBlbnVtIFNlZ21lbnQge1xyXG4gICAgICAgIEhlYWRlciA9ICdoZWFkZXInLFxyXG4gICAgICAgIEJvZHkgPSAnYm9keScsXHJcbiAgICAgICAgTGVmdCA9ICdsZWZ0JyxcclxuICAgICAgICBSaWdodCA9ICdyaWdodCcsXHJcbiAgICAgICAgVG9wID0gJ3RvcCcsXHJcbiAgICAgICAgQm90dG9tID0gJ2JvdHRvbScsXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGludGVyZmFjZSBDb250ZW50QXJlYURpbWVuc2lvbiB7XHJcbiAgICAgICAgaG92ZXJBcmVhOiBBcmVhTGlua2VkUmVjdDtcclxuICAgICAgICBoaWdobGlnaHRBcmVhOiBBcmVhTGlua2VkUmVjdDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBDb250ZW50QXJlYURpbWVuc2lvbnMgPSB7XHJcbiAgICAgICAgW3NlZ21lbnQ6IHN0cmluZ106IENvbnRlbnRBcmVhRGltZW5zaW9uO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlRWxlbWVudChkb2N1bWVudDogRG9jdW1lbnQpOiBIVE1MRGl2RWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkl0ZW0pO1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLlN0YWNrKTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBDb21wb25lbnRJdGVtQ29uZmlnLCBJdGVtQ29uZmlnLCBMYXlvdXRDb25maWcsIFJvd09yQ29sdW1uSXRlbUNvbmZpZywgU3RhY2tJdGVtQ29uZmlnIH0gZnJvbSAnLi9jb25maWcvY29uZmlnJztcclxuaW1wb3J0IHtcclxuICAgIFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyxcclxuICAgIFJlc29sdmVkSXRlbUNvbmZpZyxcclxuICAgIFJlc29sdmVkTGF5b3V0Q29uZmlnLFxyXG4gICAgUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcsXHJcbiAgICBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnLFxyXG4gICAgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcsXHJcbiAgICBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZ1xyXG59IGZyb20gXCIuL2NvbmZpZy9yZXNvbHZlZC1jb25maWdcIjtcclxuaW1wb3J0IHsgQ29tcG9uZW50Q29udGFpbmVyIH0gZnJvbSAnLi9jb250YWluZXIvY29tcG9uZW50LWNvbnRhaW5lcic7XHJcbmltcG9ydCB7IEJyb3dzZXJQb3BvdXQgfSBmcm9tICcuL2NvbnRyb2xzL2Jyb3dzZXItcG9wb3V0JztcclxuaW1wb3J0IHsgRHJhZ0FjdGlvbiB9IGZyb20gJy4vY29udHJvbHMvZHJhZy1hY3Rpb24nO1xyXG5pbXBvcnQgeyBEcmFnU291cmNlIH0gZnJvbSAnLi9jb250cm9scy9kcmFnLXNvdXJjZSc7XHJcbmltcG9ydCB7IERyb3BUYXJnZXRJbmRpY2F0b3IgfSBmcm9tICcuL2NvbnRyb2xzL2Ryb3AtdGFyZ2V0LWluZGljYXRvcic7XHJcbmltcG9ydCB7IFRyYW5zaXRpb25JbmRpY2F0b3IgfSBmcm9tICcuL2NvbnRyb2xzL3RyYW5zaXRpb24taW5kaWNhdG9yJztcclxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkVycm9yIH0gZnJvbSAnLi9lcnJvcnMvZXh0ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBBc3NlcnRFcnJvciwgVW5leHBlY3RlZE51bGxFcnJvciwgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yLCBVbnJlYWNoYWJsZUNhc2VFcnJvciB9IGZyb20gJy4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4vaXRlbXMvY29tcG9uZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBDb21wb25lbnRQYXJlbnRhYmxlSXRlbSB9IGZyb20gJy4vaXRlbXMvY29tcG9uZW50LXBhcmVudGFibGUtaXRlbSc7XHJcbmltcG9ydCB7IENvbnRlbnRJdGVtIH0gZnJvbSAnLi9pdGVtcy9jb250ZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBHcm91bmRJdGVtIH0gZnJvbSAnLi9pdGVtcy9ncm91bmQtaXRlbSc7XHJcbmltcG9ydCB7IFJvd09yQ29sdW1uIH0gZnJvbSAnLi9pdGVtcy9yb3ctb3ItY29sdW1uJztcclxuaW1wb3J0IHsgU3RhY2sgfSBmcm9tICcuL2l0ZW1zL3N0YWNrJztcclxuaW1wb3J0IHsgQ29uZmlnTWluaWZpZXIgfSBmcm9tICcuL3V0aWxzL2NvbmZpZy1taW5pZmllcic7XHJcbmltcG9ydCB7IERvbUNvbnN0YW50cyB9IGZyb20gJy4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IERyYWdMaXN0ZW5lciB9IGZyb20gJy4vdXRpbHMvZHJhZy1saXN0ZW5lcic7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4vdXRpbHMvZXZlbnQtZW1pdHRlcic7XHJcbmltcG9ydCB7IEV2ZW50SHViIH0gZnJvbSAnLi91dGlscy9ldmVudC1odWInO1xyXG5pbXBvcnQgeyBJMThuU3RyaW5nSWQsIEkxOG5TdHJpbmdzLCBpMThuU3RyaW5ncyB9IGZyb20gJy4vdXRpbHMvaTE4bi1zdHJpbmdzJztcclxuaW1wb3J0IHsgSXRlbVR5cGUsIEpzb25WYWx1ZSwgUmVjdCwgUmVzcG9uc2l2ZU1vZGUsIFdpZHRoQW5kSGVpZ2h0IH0gZnJvbSAnLi91dGlscy90eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgICBnZXRFbGVtZW50V2lkdGhBbmRIZWlnaHQsXHJcbiAgICBnZXRXaW5kb3dJbm5lclNjcmVlblBvc2l0aW9uLFxyXG4gICAgcmVtb3ZlRnJvbUFycmF5LFxyXG4gICAgc2V0RWxlbWVudEhlaWdodCxcclxuICAgIHNldEVsZW1lbnRXaWR0aFxyXG59IGZyb20gJy4vdXRpbHMvdXRpbHMnO1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5kZWNsYXJlIGdsb2JhbCB7XHJcbiAgICBpbnRlcmZhY2UgV2luZG93IHtcclxuICAgICAgICBfX2dsSW5zdGFuY2U6IExheW91dE1hbmFnZXI7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgbWFpbiBjbGFzcyB0aGF0IHdpbGwgYmUgZXhwb3NlZCBhcyBHb2xkZW5MYXlvdXQuXHJcbiAqL1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIExheW91dE1hbmFnZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgLyoqIFdoZXRoZXIgdGhlIGxheW91dCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYmUgcmVzaXplZCB0byBjb250YWluZXIgd2hlbmV2ZXIgdGhlIGNvbnRhaW5lcidzIHNpemUgaXMgY2hhbmdlZFxyXG4gICAgICogRGVmYXVsdCBpcyB0cnVlIGlmIDxib2R5PiBpcyB0aGUgY29udGFpbmVyIG90aGVyd2lzZSBmYWxzZVxyXG4gICAgICogRGVmYXVsdCB3aWxsIGJlIGNoYW5nZWQgdG8gdHJ1ZSBmb3IgYW55IGNvbnRhaW5lciBpbiB0aGUgZnV0dXJlXHJcbiAgICAgKi9cclxuICAgIHJlc2l6ZVdpdGhDb250YWluZXJBdXRvbWF0aWNhbGx5ID0gZmFsc2U7XHJcbiAgICAvKiogVGhlIGRlYm91bmNlIGludGVydmFsIChpbiBtaWxsaXNlY29uZHMpIHVzZWQgd2hlbmV2ZXIgYSBsYXlvdXQgaXMgYXV0b21hdGljYWxseSByZXNpemVkLiAgMCBtZWFucyBuZXh0IHRpY2sgKi9cclxuICAgIHJlc2l6ZURlYm91bmNlSW50ZXJ2YWwgPSAxMDA7XHJcbiAgICAvKiogRXh0ZW5kIHRoZSBjdXJyZW50IGRlYm91bmNlIGRlbGF5IHRpbWUgcGVyaW9kIGlmIGl0IGlzIHRyaWdnZXJlZCBkdXJpbmcgdGhlIGRlbGF5LlxyXG4gICAgICogSWYgdGhpcyBpcyB0cnVlLCB0aGUgbGF5b3V0IHdpbGwgb25seSByZXNpemUgd2hlbiBpdHMgY29udGFpbmVyIGhhcyBzdG9wcGVkIGJlaW5nIHJlc2l6ZWQuXHJcbiAgICAgKiBJZiBpdCBpcyBmYWxzZSwgdGhlIGxheW91dCB3aWxsIHJlc2l6ZSBhdCBpbnRlcnZhbHMgd2hpbGUgaXRzIGNvbnRhaW5lciBpcyBiZWluZyByZXNpemVkLlxyXG4gICAgICovXHJcbiAgICByZXNpemVEZWJvdW5jZUV4dGVuZGVkV2hlblBvc3NpYmxlID0gdHJ1ZTtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9jb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2lzSW5pdGlhbGlzZWQgPSBmYWxzZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2dyb3VuZEl0ZW06IEdyb3VuZEl0ZW0gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9vcGVuUG9wb3V0czogQnJvd3NlclBvcG91dFtdID0gW107XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9kcm9wVGFyZ2V0SW5kaWNhdG9yOiBEcm9wVGFyZ2V0SW5kaWNhdG9yIHwgbnVsbCA9IG51bGw7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF90cmFuc2l0aW9uSW5kaWNhdG9yOiBUcmFuc2l0aW9uSW5kaWNhdG9yIHwgbnVsbCA9IG51bGw7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9yZXNpemVUaW1lb3V0SWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaXRlbUFyZWFzOiBDb250ZW50SXRlbS5BcmVhW10gPSBbXTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX21heGltaXNlZFN0YWNrOiBTdGFjayB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX21heGltaXNlUGxhY2Vob2xkZXIgPSBMYXlvdXRNYW5hZ2VyLmNyZWF0ZU1heGltaXNlUGxhY2VFbGVtZW50KGRvY3VtZW50KTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3RhYkRyb3BQbGFjZWhvbGRlciA9IExheW91dE1hbmFnZXIuY3JlYXRlVGFiRHJvcFBsYWNlaG9sZGVyRWxlbWVudChkb2N1bWVudCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9kcmFnU291cmNlczogRHJhZ1NvdXJjZVtdID0gW107XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF91cGRhdGluZ0NvbHVtbnNSZXNwb25zaXZlID0gZmFsc2U7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9maXJzdExvYWQgPSB0cnVlO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZXZlbnRIdWIgPSBuZXcgRXZlbnRIdWIodGhpcyk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF93aWR0aDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9oZWlnaHQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZm9jdXNlZENvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0gfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF92aXJ0dWFsU2l6ZWRDb250YWluZXJzOiBDb21wb25lbnRDb250YWluZXJbXSA9IFtdO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfdmlydHVhbFNpemVkQ29udGFpbmVyQWRkaW5nQmVnaW5Db3VudCA9IDA7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9zaXplSW52YWxpZGF0aW9uQmVnaW5Db3VudCA9IDA7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm90ZWN0ZWQgX2NvbnN0cnVjdG9yT3JTdWJXaW5kb3dMYXlvdXRDb25maWc6IExheW91dENvbmZpZyB8IHVuZGVmaW5lZDsgLy8gcHJvdGVjdGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfcGFyZW50OiBMYXlvdXRNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdGhpcy5oYW5kbGVDb250YWluZXJSZXNpemUoKSk7XHJcbiAgICAvKiogQGludGVybmFsIEBkZXByZWNhdGVkIHRvIGJlIHJlbW92ZWQgaW4gdmVyc2lvbiAzICovXHJcbiAgICBwcml2YXRlIF93aW5kb3dCZWZvcmVVbmxvYWRMaXN0ZW5lciA9ICgpID0+IHRoaXMub25CZWZvcmVVbmxvYWQoKTtcclxuICAgIC8qKiBAaW50ZXJuYWwgQGRlcHJlY2F0ZWQgdG8gYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uIDMgKi9cclxuICAgIHByaXZhdGUgX3dpbmRvd0JlZm9yZVVubG9hZExpc3RlbmluZyA9IGZhbHNlO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfbWF4aW1pc2VkU3RhY2tCZWZvcmVEZXN0cm95ZWRMaXN0ZW5lciA9IChldjogRXZlbnRFbWl0dGVyLkJ1YmJsaW5nRXZlbnQpID0+IHRoaXMuY2xlYW51cEJlZm9yZU1heGltaXNlZFN0YWNrRGVzdHJveWVkKGV2KTtcclxuXHJcbiAgICByZWFkb25seSBpc1N1YldpbmRvdzogYm9vbGVhbjtcclxuICAgIGxheW91dENvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWc7XHJcblxyXG4gICAgYmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudDogTGF5b3V0TWFuYWdlci5CZWZvcmVWaXJ0dWFsUmVjdGluZ0V2ZW50IHwgdW5kZWZpbmVkO1xyXG4gICAgYWZ0ZXJWaXJ0dWFsUmVjdGluZ0V2ZW50OiBMYXlvdXRNYW5hZ2VyLkFmdGVyVmlydHVhbFJlY3RpbmdFdmVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIHRoZSBhc3NvY2lhdGVkIHdpbmRvdyB0byB0aGUgZnJvbnQuXHJcbiAgICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGhhcyBubyBlZmZlY3QgKGNhbiBiZSBzZXQgYnkgRWxlY3Ryb24pLlxyXG4gICAgICogQHB1YmxpYyBcclxuICAgICAqL1xyXG4gICAgbW92ZVdpbmRvd1RvcDogKHRoaXM6IHZvaWQpID0+IHZvaWQgPSAoKSA9PiB7fTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvY3VzIHRoZSBhc3NvY2lhdGVkIHdpbmRvdyB3aW5kb3cuXHJcbiAgICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGludm9rZXMgd2luZG93LmZvY3VzKCkgKGNhbiBiZSBzZXQgYnkgRWxlY3Ryb24pLlxyXG4gICAgICogQHB1YmxpYyBcclxuICAgICAqL1xyXG4gICAgZm9jdXNXaW5kb3c6ICh0aGlzOiB2b2lkKSA9PiB2b2lkID0gKCkgPT4gZ2xvYmFsVGhpcy5mb2N1cygpO1xyXG5cclxuICAgIGdldCBjb250YWluZXIoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdGhpcy5fY29udGFpbmVyRWxlbWVudDsgfVxyXG4gICAgZ2V0IGlzSW5pdGlhbGlzZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9pc0luaXRpYWxpc2VkOyB9XHJcbiAgICBnZXQgaXNEcmFnZ2luZygpOiBib29sZWFuIHsgcmV0dXJuIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKERvbUNvbnN0YW50cy5DbGFzc05hbWUuRHJhZ2dpbmcpOyB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBnZXQgZ3JvdW5kSXRlbSgpOiBHcm91bmRJdGVtIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2dyb3VuZEl0ZW07IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0TWFuYWdlcjpjbGFzcykuZ3JvdW5kSXRlbX0gaW5zdGVhZCAqL1xyXG4gICAgZ2V0IHJvb3QoKTogR3JvdW5kSXRlbSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9ncm91bmRJdGVtOyB9XHJcbiAgICBnZXQgb3BlblBvcG91dHMoKTogQnJvd3NlclBvcG91dFtdIHsgcmV0dXJuIHRoaXMuX29wZW5Qb3BvdXRzOyB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBnZXQgZHJvcFRhcmdldEluZGljYXRvcigpOiBEcm9wVGFyZ2V0SW5kaWNhdG9yIHwgbnVsbCB7IHJldHVybiB0aGlzLl9kcm9wVGFyZ2V0SW5kaWNhdG9yOyB9XHJcbiAgICAvKiogQGludGVybmFsIEBkZXByZWNhdGVkIFRvIGJlIHJlbW92ZWQgKi9cclxuICAgIGdldCB0cmFuc2l0aW9uSW5kaWNhdG9yKCk6IFRyYW5zaXRpb25JbmRpY2F0b3IgfCBudWxsIHsgcmV0dXJuIHRoaXMuX3RyYW5zaXRpb25JbmRpY2F0b3I7IH1cclxuICAgIGdldCB3aWR0aCgpOiBudW1iZXIgfCBudWxsIHsgcmV0dXJuIHRoaXMuX3dpZHRoOyB9XHJcbiAgICBnZXQgaGVpZ2h0KCk6IG51bWJlciB8IG51bGwgeyByZXR1cm4gdGhpcy5faGVpZ2h0OyB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyB0aGUge0BsaW5rIChFdmVudEh1YjpjbGFzcyl9IGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxheW91dCBtYW5hZ2VyLlxyXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBwcm9wYWdhdGUgZXZlbnRzIGJldHdlZW4gdGhlIHdpbmRvd3NcclxuICAgICAqIEBwdWJsaWNcclxuICAgICAqL1xyXG4gICAgZ2V0IGV2ZW50SHViKCk6IEV2ZW50SHViIHsgcmV0dXJuIHRoaXMuX2V2ZW50SHViOyB9XHJcbiAgICBnZXQgcm9vdEl0ZW0oKTogQ29udGVudEl0ZW0gfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWNjZXNzIHJvb3RJdGVtIGJlZm9yZSBpbml0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZ3JvdW5kQ29udGVudEl0ZW1zID0gdGhpcy5fZ3JvdW5kSXRlbS5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgICAgIGlmIChncm91bmRDb250ZW50SXRlbXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dyb3VuZEl0ZW0uY29udGVudEl0ZW1zWzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0IGZvY3VzZWRDb21wb25lbnRJdGVtKCk6IENvbXBvbmVudEl0ZW0gfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fZm9jdXNlZENvbXBvbmVudEl0ZW07IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGdldCB0YWJEcm9wUGxhY2Vob2xkZXIoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdGhpcy5fdGFiRHJvcFBsYWNlaG9sZGVyOyB9XHJcbiAgICBnZXQgbWF4aW1pc2VkU3RhY2soKTogU3RhY2sgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fbWF4aW1pc2VkU3RhY2s7IH1cclxuXHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgaW5kaWNhdGVzIGRlcHJlY2F0ZWQgY29uc3RydWN0b3IgdXNlICovXHJcbiAgICBnZXQgZGVwcmVjYXRlZENvbnN0cnVjdG9yKCk6IGJvb2xlYW4geyByZXR1cm4gIXRoaXMuaXNTdWJXaW5kb3cgJiYgdGhpcy5fY29uc3RydWN0b3JPclN1YldpbmRvd0xheW91dENvbmZpZyAhPT0gdW5kZWZpbmVkOyB9XHJcblxyXG4gICAgZ2V0IHBhcmVudCgpOiBMYXlvdXRNYW5hZ2VyIHwgbnVsbCB7IHJldHVybiB0aGlzLl9wYXJlbnQ7IH1cclxuICAgIHNldCBwYXJlbnQodmFsdWU6IExheW91dE1hbmFnZXIgfCBudWxsKSB7IHRoaXMuX3BhcmVudCA9IHZhbHVlOyB9XHJcblxyXG4gICAgZ2V0IGluc3RhbmNlcygpOiBMYXlvdXRNYW5hZ2VyW10ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogTGF5b3V0TWFuYWdlcltdID0gW107XHJcblxyXG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLnBhcmVudCA/PyB0aGlzO1xyXG4gICAgICAgIHJlc3VsdC5wdXNoKHJvb3QpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBwb3BvdXQgb2Ygcm9vdC5vcGVuUG9wb3V0cykge1xyXG4gICAgICAgICAgICBjb25zdCBjaGlsZCA9IHBvcG91dC5nZXRHbEluc3RhbmNlKCk7XHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNoaWxkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEBwYXJhbSBjb250YWluZXIgLSBBIERvbSBIVE1MIGVsZW1lbnQuIERlZmF1bHRzIHRvIGJvZHlcclxuICAgICogQGludGVybmFsXHJcbiAgICAqL1xyXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVyczogTGF5b3V0TWFuYWdlci5Db25zdHJ1Y3RvclBhcmFtZXRlcnMpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLmlzU3ViV2luZG93ID0gcGFyYW1ldGVycy5pc1N1YldpbmRvdztcclxuXHJcbiAgICAgICAgdGhpcy5fY29uc3RydWN0b3JPclN1YldpbmRvd0xheW91dENvbmZpZyA9IHBhcmFtZXRlcnMuY29uc3RydWN0b3JPclN1YldpbmRvd0xheW91dENvbmZpZztcclxuXHJcbiAgICAgICAgSTE4blN0cmluZ3MuY2hlY2tJbml0aWFsaXNlKCk7XHJcbiAgICAgICAgQ29uZmlnTWluaWZpZXIuY2hlY2tJbml0aWFsaXNlKCk7XHJcblxyXG4gICAgICAgIGlmIChwYXJhbWV0ZXJzLmNvbnRhaW5lckVsZW1lbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXJFbGVtZW50ID0gcGFyYW1ldGVycy5jb250YWluZXJFbGVtZW50O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoZSBMYXlvdXRNYW5hZ2VyIGluc3RhbmNlIGl0c2VsZiBhcyB3ZWxsIGFzIGV2ZXJ5IENvbnRlbnRJdGVtXHJcbiAgICAgKiB3aXRoaW4gaXQuIEFmdGVyIHRoaXMgaXMgY2FsbGVkIG5vdGhpbmcgc2hvdWxkIGJlIGxlZnQgb2YgdGhlIExheW91dE1hbmFnZXIuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBmdW5jdGlvbiBvbmx5IG5lZWRzIHRvIGJlIGNhbGxlZCBpZiBhbiBhcHBsaWNhdGlvbiB3aXNoZXMgdG8gZGVzdHJveSB0aGUgR29sZGVuIExheW91dCBvYmplY3Qgd2hpbGVcclxuICAgICAqIGEgcGFnZSByZW1haW5zIGxvYWRlZC4gV2hlbiBhIHBhZ2UgaXMgdW5sb2FkZWQsIGFsbCByZXNvdXJjZXMgY2xhaW1lZCBieSBHb2xkZW4gTGF5b3V0IHdpbGwgYXV0b21hdGljYWxseVxyXG4gICAgICogYmUgcmVsZWFzZWQuXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbGlzZWQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3dpbmRvd0JlZm9yZVVubG9hZExpc3RlbmluZykge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsVGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCB0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRMaXN0ZW5lcik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRMaXN0ZW5pbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMubGF5b3V0Q29uZmlnLnNldHRpbmdzLmNsb3NlUG9wb3V0c09uVW5sb2FkID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlQWxsT3BlblBvcG91dHMoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrQ2xlYXJSZXNpemVUaW1lb3V0KCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ncm91bmRJdGVtLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl90YWJEcm9wUGxhY2Vob2xkZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kcm9wVGFyZ2V0SW5kaWNhdG9yICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kcm9wVGFyZ2V0SW5kaWNhdG9yLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5fdHJhbnNpdGlvbkluZGljYXRvciAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbkluZGljYXRvci5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fZXZlbnRIdWIuZGVzdHJveSgpO1xyXG5cclxuICAgICAgICAgICAgZm9yIChjb25zdCBkcmFnU291cmNlIG9mIHRoaXMuX2RyYWdTb3VyY2VzKSB7XHJcbiAgICAgICAgICAgICAgICBkcmFnU291cmNlLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9kcmFnU291cmNlcyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXNlZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgR29sZGVuTGF5b3V0IGNvbmZpZ3VyYXRpb24gb2JqZWN0IGFuZFxyXG4gICAgICogcmVwbGFjZXMgaXRzIGtleXMgYW5kIHZhbHVlcyByZWN1cnNpdmVseSB3aXRoXHJcbiAgICAgKiBvbmUgbGV0dGVyIGNvZGVzXHJcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChSZXNvbHZlZExheW91dENvbmZpZzpuYW1lc3BhY2UpLm1pbmlmeUNvbmZpZ30gaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICBtaW5pZnlDb25maWcoY29uZmlnOiBSZXNvbHZlZExheW91dENvbmZpZyk6IFJlc29sdmVkTGF5b3V0Q29uZmlnIHtcclxuICAgICAgICByZXR1cm4gUmVzb2x2ZWRMYXlvdXRDb25maWcubWluaWZ5Q29uZmlnKGNvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhIGNvbmZpZ3VyYXRpb24gT2JqZWN0IHRoYXQgd2FzIHByZXZpb3VzbHkgbWluaWZpZWRcclxuICAgICAqIHVzaW5nIG1pbmlmeUNvbmZpZyBhbmQgcmV0dXJucyBpdHMgb3JpZ2luYWwgdmVyc2lvblxyXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoUmVzb2x2ZWRMYXlvdXRDb25maWc6bmFtZXNwYWNlKS51bm1pbmlmeUNvbmZpZ30gaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICB1bm1pbmlmeUNvbmZpZyhjb25maWc6IFJlc29sdmVkTGF5b3V0Q29uZmlnKTogUmVzb2x2ZWRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIHJldHVybiBSZXNvbHZlZExheW91dENvbmZpZy51bm1pbmlmeUNvbmZpZyhjb25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGFic3RyYWN0IGJpbmRDb21wb25lbnQoY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIGl0ZW1Db25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyk6IENvbXBvbmVudENvbnRhaW5lci5CaW5kYWJsZUNvbXBvbmVudDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGFic3RyYWN0IHVuYmluZENvbXBvbmVudChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgdmlydHVhbDogYm9vbGVhbiwgY29tcG9uZW50OiBDb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50IHwgdW5kZWZpbmVkKTogdm9pZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBmcm9tIEdvbGRlbkxheW91dCBjbGFzcy4gRmluaXNoZXMgb2YgaW5pdFxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRDb250YWluZXIoKTtcclxuICAgICAgICB0aGlzLl9kcm9wVGFyZ2V0SW5kaWNhdG9yID0gbmV3IERyb3BUYXJnZXRJbmRpY2F0b3IoLyp0aGlzLmNvbnRhaW5lciovKTtcclxuICAgICAgICB0aGlzLl90cmFuc2l0aW9uSW5kaWNhdG9yID0gbmV3IFRyYW5zaXRpb25JbmRpY2F0b3IoKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNpemVGcm9tQ29udGFpbmVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMubGF5b3V0Q29uZmlnID0gUmVzb2x2ZWRMYXlvdXRDb25maWcuY3JlYXRlRGVmYXVsdCgpOyAvLyB3aWxsIG92ZXJ3cml0dGVuIGJlIGxvYWRlZCB2aWEgbG9hZExheW91dFxyXG4gICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0gPSBuZXcgR3JvdW5kSXRlbSh0aGlzLCB0aGlzLmxheW91dENvbmZpZy5yb290LCB0aGlzLl9jb250YWluZXJFbGVtZW50KTtcclxuICAgICAgICB0aGlzLl9ncm91bmRJdGVtLmluaXQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5jaGVja0xvYWRlZExheW91dE1heGltaXNlSXRlbSgpO1xyXG5cclxuICAgICAgICB0aGlzLl9yZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuX2NvbnRhaW5lckVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGlzZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuYWRqdXN0Q29sdW1uc1Jlc3BvbnNpdmUoKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2luaXRpYWxpc2VkJyk7XHJcblxyXG4gICAgICAgIGxldCBsYXlvdXQgPSB0aGlzLl9jb25zdHJ1Y3Rvck9yU3ViV2luZG93TGF5b3V0Q29uZmlnO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc1N1YldpbmRvdyAmJiBsYXlvdXQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLyBXcmFwIGluIHN0YWNrIGZvciBtdWx0aXdpbmRvdyBkcmFnLWFuZC1kcm9wIHRvIHdvcmsgcHJvcGVybHlcclxuICAgICAgICAgICAgaWYgKGxheW91dC5yb290Py50eXBlID09IEl0ZW1UeXBlLmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgICAgbGF5b3V0LnJvb3QgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogSXRlbVR5cGUuc3RhY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogWyBsYXlvdXQucm9vdCBdLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5sb2FkTGF5b3V0KGxheW91dCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9hZHMgYSBuZXcgbGF5b3V0XHJcbiAgICAgKiBAcGFyYW0gbGF5b3V0Q29uZmlnIC0gTmV3IGxheW91dCB0byBiZSBsb2FkZWRcclxuICAgICAqL1xyXG4gICAgbG9hZExheW91dChsYXlvdXRDb25maWc6IExheW91dENvbmZpZyk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luaXRpYWxpc2VkKSB7XHJcbiAgICAgICAgICAgIC8vIEluIGNhc2UgYXBwbGljYXRpb24gbm90IGNvcnJlY3RseSB1c2luZyBsZWdhY3kgY29uc3RydWN0b3JcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHb2xkZW5MYXlvdXQ6IE5lZWQgdG8gY2FsbCBpbml0KCkgaWYgTGF5b3V0Q29uZmlnIHdpdGggZGVmaW5lZCByb290IHBhc3NlZCB0byBjb25zdHJ1Y3RvcicpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1MTDExMTE5Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRDb25maWcgPSBMYXlvdXRDb25maWcucmVzb2x2ZShsYXlvdXRDb25maWcpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVTdWJXaW5kb3dzKCk7IC8vIHN0aWxsIG5lZWRzIHRvIGJlIHRlc3RlZFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZ3JvdW5kSXRlbS5sb2FkUm9vdCh0aGlzLmxheW91dENvbmZpZy5yb290KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tMb2FkZWRMYXlvdXRNYXhpbWlzZUl0ZW0oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRqdXN0Q29sdW1uc1Jlc3BvbnNpdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBsYXlvdXQgY29uZmlndXJhdGlvbiBvYmplY3QgYmFzZWQgb24gdGhlIHRoZSBjdXJyZW50IHN0YXRlXHJcbiAgICAgKlxyXG4gICAgICogQHB1YmxpY1xyXG4gICAgICogQHJldHVybnMgR29sZGVuTGF5b3V0IGNvbmZpZ3VyYXRpb25cclxuICAgICAqL1xyXG4gICAgc2F2ZUxheW91dCgpOiBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbGlzZWQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBjcmVhdGUgY29uZmlnLCBsYXlvdXQgbm90IHlldCBpbml0aWFsaXNlZCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgICAvLyBpZiAocm9vdCAhPT0gdW5kZWZpbmVkICYmICEocm9vdCBpbnN0YW5jZW9mIENvbnRlbnRJdGVtKSkge1xyXG4gICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdSb290IG11c3QgYmUgYSBDb250ZW50SXRlbScpO1xyXG4gICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAqIENvbnRlbnRcclxuICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1UQzE4MjQ0Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBncm91bmRDb250ZW50ID0gdGhpcy5fZ3JvdW5kSXRlbS5jYWxjdWxhdGVDb25maWdDb250ZW50KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHJvb3RJdGVtQ29uZmlnOiBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgaWYgKGdyb3VuZENvbnRlbnQubGVuZ3RoICE9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm9vdEl0ZW1Db25maWcgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvb3RJdGVtQ29uZmlnID0gZ3JvdW5kQ29udGVudFswXTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAgICAgKiBSZXRyaWV2ZSBjb25maWcgZm9yIHN1YndpbmRvd3NcclxuICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlY29uY2lsZVBvcG91dFdpbmRvd3MoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9wZW5Qb3BvdXRzOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZ1tdID0gW107XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX29wZW5Qb3BvdXRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3BlblBvcG91dHMucHVzaCh0aGlzLl9vcGVuUG9wb3V0c1tpXS50b0NvbmZpZygpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb25maWc6IFJlc29sdmVkTGF5b3V0Q29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvb3Q6IHJvb3RJdGVtQ29uZmlnLFxyXG4gICAgICAgICAgICAgICAgICAgIG9wZW5Qb3BvdXRzLFxyXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiAgUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuY3JlYXRlQ29weSh0aGlzLmxheW91dENvbmZpZy5zZXR0aW5ncyksXHJcbiAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uczogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5jcmVhdGVDb3B5KHRoaXMubGF5b3V0Q29uZmlnLmRpbWVuc2lvbnMpLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcjogUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmNyZWF0ZUNvcHkodGhpcy5sYXlvdXRDb25maWcuaGVhZGVyKSxcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhbnkgZXhpc3RpbmcgbGF5b3V0LiBFZmZlY3RpdmVseSwgYW4gZW1wdHkgbGF5b3V0IHdpbGwgYmUgbG9hZGVkLlxyXG4gICAgICovXHJcblxyXG4gICAgY2xlYXIoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUNMMTExMjknKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9ncm91bmRJdGVtLmNsZWFyUm9vdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpLnNhdmVMYXlvdXR9XHJcbiAgICAgKi9cclxuICAgIHRvQ29uZmlnKCk6IFJlc29sdmVkTGF5b3V0Q29uZmlnIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zYXZlTGF5b3V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbmV3IENvbXBvbmVudEl0ZW0uICBXaWxsIHVzZSBkZWZhdWx0IGxvY2F0aW9uIHNlbGVjdG9ycyB0byBlbnN1cmUgYSBsb2NhdGlvbiBpcyBmb3VuZCBhbmRcclxuICAgICAqIGNvbXBvbmVudCBpcyBzdWNjZXNzZnVsbHkgYWRkZWRcclxuICAgICAqIEBwYXJhbSBjb21wb25lbnRUeXBlTmFtZSAtIE5hbWUgb2YgY29tcG9uZW50IHR5cGUgdG8gYmUgY3JlYXRlZC5cclxuICAgICAqIEBwYXJhbSBzdGF0ZSAtIE9wdGlvbmFsIGluaXRpYWwgc3RhdGUgdG8gYmUgYXNzaWduZWQgdG8gY29tcG9uZW50XHJcbiAgICAgKiBAcmV0dXJucyBOZXcgQ29tcG9uZW50SXRlbSBjcmVhdGVkLlxyXG4gICAgICovXHJcbiAgICBuZXdDb21wb25lbnQoY29tcG9uZW50VHlwZTogSnNvblZhbHVlLCBjb21wb25lbnRTdGF0ZT86IEpzb25WYWx1ZSwgdGl0bGU/OiBzdHJpbmcpOiBDb21wb25lbnRJdGVtIHtcclxuICAgICAgICBjb25zdCBjb21wb25lbnRJdGVtID0gdGhpcy5uZXdDb21wb25lbnRBdExvY2F0aW9uKGNvbXBvbmVudFR5cGUsIGNvbXBvbmVudFN0YXRlLCB0aXRsZSk7XHJcbiAgICAgICAgaWYgKGNvbXBvbmVudEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNTkM2NTU4OCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRJdGVtO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBDb21wb25lbnRJdGVtIGF0IHRoZSBmaXJzdCB2YWxpZCBzZWxlY3RvciBsb2NhdGlvbi5cclxuICAgICAqIEBwYXJhbSBjb21wb25lbnRUeXBlTmFtZSAtIE5hbWUgb2YgY29tcG9uZW50IHR5cGUgdG8gYmUgY3JlYXRlZC5cclxuICAgICAqIEBwYXJhbSBzdGF0ZSAtIE9wdGlvbmFsIGluaXRpYWwgc3RhdGUgdG8gYmUgYXNzaWduZWQgdG8gY29tcG9uZW50XHJcbiAgICAgKiBAcGFyYW0gbG9jYXRpb25TZWxlY3RvcnMgLSBBcnJheSBvZiBsb2NhdGlvbiBzZWxlY3RvcnMgdXNlZCB0byBmaW5kIGxvY2F0aW9uIGluIGxheW91dCB3aGVyZSBjb21wb25lbnRcclxuICAgICAqIHdpbGwgYmUgYWRkZWQuIEZpcnN0IGxvY2F0aW9uIGluIGFycmF5IHdoaWNoIGlzIHZhbGlkIHdpbGwgYmUgdXNlZC4gSWYgbG9jYXRpb25TZWxlY3RvcnMgaXMgdW5kZWZpbmVkLFxyXG4gICAgICoge0BsaW5rIChMYXlvdXRNYW5hZ2VyOm5hbWVzcGFjZSkuZGVmYXVsdExvY2F0aW9uU2VsZWN0b3JzfSB3aWxsIGJlIHVzZWRcclxuICAgICAqIEByZXR1cm5zIE5ldyBDb21wb25lbnRJdGVtIGNyZWF0ZWQgb3IgdW5kZWZpbmVkIGlmIG5vIHZhbGlkIGxvY2F0aW9uIHNlbGVjdG9yIHdhcyBpbiBhcnJheS5cclxuICAgICAqL1xyXG4gICAgbmV3Q29tcG9uZW50QXRMb2NhdGlvbihjb21wb25lbnRUeXBlOiBKc29uVmFsdWUsIGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlLCB0aXRsZT86IHN0cmluZyxcclxuICAgICAgICBsb2NhdGlvblNlbGVjdG9ycz86IExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3RvcltdXHJcbiAgICApOiBDb21wb25lbnRJdGVtIHwgdW5kZWZpbmVke1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWRkIGNvbXBvbmVudCBiZWZvcmUgaW5pdCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5hZGRDb21wb25lbnRBdExvY2F0aW9uKGNvbXBvbmVudFR5cGUsIGNvbXBvbmVudFN0YXRlLCB0aXRsZSwgbG9jYXRpb25TZWxlY3RvcnMpO1xyXG4gICAgICAgICAgICBpZiAobG9jYXRpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRJdGVtID0gbG9jYXRpb24ucGFyZW50SXRlbS5jb250ZW50SXRlbXNbbG9jYXRpb24uaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFDb250ZW50SXRlbS5pc0NvbXBvbmVudEl0ZW0oY3JlYXRlZEl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdMTU5DOTkyODc3NTMzJyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVkSXRlbTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBuZXcgQ29tcG9uZW50SXRlbS4gIFdpbGwgdXNlIGRlZmF1bHQgbG9jYXRpb24gc2VsZWN0b3JzIHRvIGVuc3VyZSBhIGxvY2F0aW9uIGlzIGZvdW5kIGFuZFxyXG4gICAgICogY29tcG9uZW50IGlzIHN1Y2Nlc3NmdWxseSBhZGRlZFxyXG4gICAgICogQHBhcmFtIGNvbXBvbmVudFR5cGUgLSBUeXBlIG9mIGNvbXBvbmVudCB0byBiZSBjcmVhdGVkLlxyXG4gICAgICogQHBhcmFtIHN0YXRlIC0gT3B0aW9uYWwgaW5pdGlhbCBzdGF0ZSB0byBiZSBhc3NpZ25lZCB0byBjb21wb25lbnRcclxuICAgICAqIEByZXR1cm5zIExvY2F0aW9uIG9mIG5ldyBDb21wb25lbnRJdGVtIGNyZWF0ZWQuXHJcbiAgICAgKi9cclxuICAgIGFkZENvbXBvbmVudChjb21wb25lbnRUeXBlOiBKc29uVmFsdWUsIGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlLCB0aXRsZT86IHN0cmluZyk6IExheW91dE1hbmFnZXIuTG9jYXRpb24ge1xyXG4gICAgICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5hZGRDb21wb25lbnRBdExvY2F0aW9uKGNvbXBvbmVudFR5cGUsIGNvbXBvbmVudFN0YXRlLCB0aXRsZSk7XHJcbiAgICAgICAgaWYgKGxvY2F0aW9uID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdMTUFDOTk5NDMnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIENvbXBvbmVudEl0ZW0gYXQgdGhlIGZpcnN0IHZhbGlkIHNlbGVjdG9yIGxvY2F0aW9uLlxyXG4gICAgICogQHBhcmFtIGNvbXBvbmVudFR5cGUgLSBUeXBlIG9mIGNvbXBvbmVudCB0byBiZSBjcmVhdGVkLlxyXG4gICAgICogQHBhcmFtIHN0YXRlIC0gT3B0aW9uYWwgaW5pdGlhbCBzdGF0ZSB0byBiZSBhc3NpZ25lZCB0byBjb21wb25lbnRcclxuICAgICAqIEBwYXJhbSBsb2NhdGlvblNlbGVjdG9ycyAtIEFycmF5IG9mIGxvY2F0aW9uIHNlbGVjdG9ycyB1c2VkIHRvIGZpbmQgZGV0ZXJtaW5lIGxvY2F0aW9uIGluIGxheW91dCB3aGVyZSBjb21wb25lbnRcclxuICAgICAqIHdpbGwgYmUgYWRkZWQuIEZpcnN0IGxvY2F0aW9uIGluIGFycmF5IHdoaWNoIGlzIHZhbGlkIHdpbGwgYmUgdXNlZC4gSWYgdW5kZWZpbmVkLFxyXG4gICAgICoge0BsaW5rIChMYXlvdXRNYW5hZ2VyOm5hbWVzcGFjZSkuZGVmYXVsdExvY2F0aW9uU2VsZWN0b3JzfSB3aWxsIGJlIHVzZWQuXHJcbiAgICAgKiBAcmV0dXJucyBMb2NhdGlvbiBvZiBuZXcgQ29tcG9uZW50SXRlbSBjcmVhdGVkIG9yIHVuZGVmaW5lZCBpZiBubyB2YWxpZCBsb2NhdGlvbiBzZWxlY3RvciB3YXMgaW4gYXJyYXkuXHJcbiAgICAgKi9cclxuICAgIGFkZENvbXBvbmVudEF0TG9jYXRpb24oY29tcG9uZW50VHlwZTogSnNvblZhbHVlLCBjb21wb25lbnRTdGF0ZT86IEpzb25WYWx1ZSwgdGl0bGU/OiBzdHJpbmcsXHJcbiAgICAgICAgbG9jYXRpb25TZWxlY3RvcnM/OiByZWFkb25seSBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uU2VsZWN0b3JbXVxyXG4gICAgKTogTGF5b3V0TWFuYWdlci5Mb2NhdGlvbiB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgY29uc3QgaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogJ2NvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFR5cGUsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlLFxyXG4gICAgICAgICAgICB0aXRsZSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5hZGRJdGVtQXRMb2NhdGlvbihpdGVtQ29uZmlnLCBsb2NhdGlvblNlbGVjdG9ycyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbmV3IENvbnRlbnRJdGVtLiAgV2lsbCB1c2UgZGVmYXVsdCBsb2NhdGlvbiBzZWxlY3RvcnMgdG8gZW5zdXJlIGEgbG9jYXRpb24gaXMgZm91bmQgYW5kXHJcbiAgICAgKiBjb21wb25lbnQgaXMgc3VjY2Vzc2Z1bGx5IGFkZGVkXHJcbiAgICAgKiBAcGFyYW0gaXRlbUNvbmZpZyAtIFJlc29sdmVkSXRlbUNvbmZpZyBvZiBjaGlsZCB0byBiZSBhZGRlZC5cclxuICAgICAqIEByZXR1cm5zIE5ldyBDb250ZW50SXRlbSBjcmVhdGVkLlxyXG4gICAgKi9cclxuICAgIG5ld0l0ZW0oaXRlbUNvbmZpZzogUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgU3RhY2tJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZyk6IENvbnRlbnRJdGVtIHtcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IHRoaXMubmV3SXRlbUF0TG9jYXRpb24oaXRlbUNvbmZpZyk7XHJcbiAgICAgICAgaWYgKGNvbnRlbnRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdMTU5DNjU1ODgnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gY29udGVudEl0ZW07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIG5ldyBjaGlsZCBDb250ZW50SXRlbSB1bmRlciB0aGUgcm9vdCBDb250ZW50SXRlbS4gIElmIGEgcm9vdCBkb2VzIG5vdCBleGlzdCwgdGhlbiBjcmVhdGUgcm9vdCBDb250ZW50SXRlbSBpbnN0ZWFkXHJcbiAgICAgKiBAcGFyYW0gaXRlbUNvbmZpZyAtIFJlc29sdmVkSXRlbUNvbmZpZyBvZiBjaGlsZCB0byBiZSBhZGRlZC5cclxuICAgICAqIEBwYXJhbSBsb2NhdGlvblNlbGVjdG9ycyAtIEFycmF5IG9mIGxvY2F0aW9uIHNlbGVjdG9ycyB1c2VkIHRvIGZpbmQgZGV0ZXJtaW5lIGxvY2F0aW9uIGluIGxheW91dCB3aGVyZSBDb250ZW50SXRlbVxyXG4gICAgICogd2lsbCBiZSBhZGRlZC4gRmlyc3QgbG9jYXRpb24gaW4gYXJyYXkgd2hpY2ggaXMgdmFsaWQgd2lsbCBiZSB1c2VkLiBJZiB1bmRlZmluZWQsXHJcbiAgICAgKiB7QGxpbmsgKExheW91dE1hbmFnZXI6bmFtZXNwYWNlKS5kZWZhdWx0TG9jYXRpb25TZWxlY3RvcnN9IHdpbGwgYmUgdXNlZC5cclxuICAgICAqIEByZXR1cm5zIE5ldyBDb250ZW50SXRlbSBjcmVhdGVkIG9yIHVuZGVmaW5lZCBpZiBubyB2YWxpZCBsb2NhdGlvbiBzZWxlY3RvciB3YXMgaW4gYXJyYXkuICovXHJcbiAgICBuZXdJdGVtQXRMb2NhdGlvbihpdGVtQ29uZmlnOiBSb3dPckNvbHVtbkl0ZW1Db25maWcgfCBTdGFja0l0ZW1Db25maWcgfCBDb21wb25lbnRJdGVtQ29uZmlnLFxyXG4gICAgICAgIGxvY2F0aW9uU2VsZWN0b3JzPzogcmVhZG9ubHkgTGF5b3V0TWFuYWdlci5Mb2NhdGlvblNlbGVjdG9yW11cclxuICAgICk6IENvbnRlbnRJdGVtIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFkZCBjb21wb25lbnQgYmVmb3JlIGluaXQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMuYWRkSXRlbUF0TG9jYXRpb24oaXRlbUNvbmZpZywgbG9jYXRpb25TZWxlY3RvcnMpO1xyXG4gICAgICAgICAgICBpZiAobG9jYXRpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRJdGVtID0gbG9jYXRpb24ucGFyZW50SXRlbS5jb250ZW50SXRlbXNbbG9jYXRpb24uaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZWRJdGVtO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIG5ldyBDb250ZW50SXRlbS4gIFdpbGwgdXNlIGRlZmF1bHQgbG9jYXRpb24gc2VsZWN0b3JzIHRvIGVuc3VyZSBhIGxvY2F0aW9uIGlzIGZvdW5kIGFuZFxyXG4gICAgICogY29tcG9uZW50IGlzIHN1Y2Nlc3NmdWxseSBhZGRlZC5cclxuICAgICAqIEBwYXJhbSBpdGVtQ29uZmlnIC0gUmVzb2x2ZWRJdGVtQ29uZmlnIG9mIGNoaWxkIHRvIGJlIGFkZGVkLlxyXG4gICAgICogQHJldHVybnMgTG9jYXRpb24gb2YgbmV3IENvbnRlbnRJdGVtIGNyZWF0ZWQuICovXHJcbiAgICBhZGRJdGVtKGl0ZW1Db25maWc6IFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFN0YWNrSXRlbUNvbmZpZyB8IENvbXBvbmVudEl0ZW1Db25maWcpOiBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uIHtcclxuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMuYWRkSXRlbUF0TG9jYXRpb24oaXRlbUNvbmZpZyk7XHJcbiAgICAgICAgaWYgKGxvY2F0aW9uID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdMTUFJOTk5NDMnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIENvbnRlbnRJdGVtIGF0IHRoZSBmaXJzdCB2YWxpZCBzZWxlY3RvciBsb2NhdGlvbi5cclxuICAgICAqIEBwYXJhbSBpdGVtQ29uZmlnIC0gUmVzb2x2ZWRJdGVtQ29uZmlnIG9mIGNoaWxkIHRvIGJlIGFkZGVkLlxyXG4gICAgICogQHBhcmFtIGxvY2F0aW9uU2VsZWN0b3JzIC0gQXJyYXkgb2YgbG9jYXRpb24gc2VsZWN0b3JzIHVzZWQgdG8gZmluZCBkZXRlcm1pbmUgbG9jYXRpb24gaW4gbGF5b3V0IHdoZXJlIENvbnRlbnRJdGVtXHJcbiAgICAgKiB3aWxsIGJlIGFkZGVkLiBGaXJzdCBsb2NhdGlvbiBpbiBhcnJheSB3aGljaCBpcyB2YWxpZCB3aWxsIGJlIHVzZWQuIElmIHVuZGVmaW5lZCxcclxuICAgICAqIHtAbGluayAoTGF5b3V0TWFuYWdlcjpuYW1lc3BhY2UpLmRlZmF1bHRMb2NhdGlvblNlbGVjdG9yc30gd2lsbCBiZSB1c2VkLlxyXG4gICAgICogQHJldHVybnMgTG9jYXRpb24gb2YgbmV3IENvbnRlbnRJdGVtIGNyZWF0ZWQgb3IgdW5kZWZpbmVkIGlmIG5vIHZhbGlkIGxvY2F0aW9uIHNlbGVjdG9yIHdhcyBpbiBhcnJheS4gKi9cclxuICAgIGFkZEl0ZW1BdExvY2F0aW9uKGl0ZW1Db25maWc6IFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFN0YWNrSXRlbUNvbmZpZyB8IENvbXBvbmVudEl0ZW1Db25maWcsXHJcbiAgICAgICAgbG9jYXRpb25TZWxlY3RvcnM/OiByZWFkb25seSBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uU2VsZWN0b3JbXVxyXG4gICAgKTogTGF5b3V0TWFuYWdlci5Mb2NhdGlvbiB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgY29tcG9uZW50IGJlZm9yZSBpbml0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGxvY2F0aW9uU2VsZWN0b3JzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIC8vIGRlZmF1bHRMb2NhdGlvblNlbGVjdG9ycyBzaG91bGQgYWx3YXlzIGZpbmQgYSBsb2NhdGlvblxyXG4gICAgICAgICAgICAgICAgbG9jYXRpb25TZWxlY3RvcnMgPSBMYXlvdXRNYW5hZ2VyLmRlZmF1bHRMb2NhdGlvblNlbGVjdG9ycztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLmZpbmRGaXJzdExvY2F0aW9uKGxvY2F0aW9uU2VsZWN0b3JzKTtcclxuICAgICAgICAgICAgaWYgKGxvY2F0aW9uID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50SXRlbSA9IGxvY2F0aW9uLnBhcmVudEl0ZW07XHJcbiAgICAgICAgICAgICAgICBsZXQgYWRkSWR4OiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhcmVudEl0ZW0udHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuZ3JvdW5kOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VuZEl0ZW0gPSBwYXJlbnRJdGVtIGFzIEdyb3VuZEl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZElkeCA9IGdyb3VuZEl0ZW0uYWRkSXRlbShpdGVtQ29uZmlnLCBsb2NhdGlvbi5pbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGRJZHggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50SXRlbSA9IHRoaXMuX2dyb3VuZEl0ZW0uY29udGVudEl0ZW1zWzBdOyAvLyB3YXMgYWRkZWQgdG8gcm9vdEl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZElkeCA9IDA7IC8vIHdhcyBhZGRlZCBhcyByb290SXRlbSAod2hpY2ggaXMgdGhlIGZpcnN0IGFuZCBvbmx5IENvbnRlbnRJdGVtIGluIEdyb3VuZEl0ZW0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUucm93OlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29sdW1uOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvd09yQ29sdW1uID0gcGFyZW50SXRlbSBhcyBSb3dPckNvbHVtbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkSWR4ID0gcm93T3JDb2x1bW4uYWRkSXRlbShpdGVtQ29uZmlnLCBsb2NhdGlvbi5pbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnN0YWNrOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSXRlbUNvbmZpZy5pc0NvbXBvbmVudChpdGVtQ29uZmlnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoaTE4blN0cmluZ3NbSTE4blN0cmluZ0lkLkl0ZW1Db25maWdJc05vdFR5cGVDb21wb25lbnRdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gcGFyZW50SXRlbSBhcyBTdGFjaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZElkeCA9IHN0YWNrLmFkZEl0ZW0oaXRlbUNvbmZpZywgbG9jYXRpb24uaW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb21wb25lbnQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdMTUFJQUxDODc0NDQ2MDInKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVucmVhY2hhYmxlQ2FzZUVycm9yKCdMTUFJQUxVOTg4ODE3MzMnLCBwYXJlbnRJdGVtLnR5cGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChJdGVtQ29uZmlnLmlzQ29tcG9uZW50KGl0ZW1Db25maWcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc2VlIGlmIHN0YWNrIHdhcyBpbnNlcnRlZFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBwYXJlbnRJdGVtLmNvbnRlbnRJdGVtc1thZGRJZHhdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChDb250ZW50SXRlbS5pc1N0YWNrKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEl0ZW0gPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRJZHggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsb2NhdGlvbi5wYXJlbnRJdGVtID0gcGFyZW50SXRlbTtcclxuICAgICAgICAgICAgICAgIGxvY2F0aW9uLmluZGV4ID0gYWRkSWR4O1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogTG9hZHMgdGhlIHNwZWNpZmllZCBjb21wb25lbnQgUmVzb2x2ZWRJdGVtQ29uZmlnIGFzIHJvb3QuXHJcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgYSBDb21wb25lbnQgYWxsIGJ5IGl0c2VsZi4gIFRoZSBsYXlvdXQgY2Fubm90IGJlIGNoYW5nZWQgb3RoZXIgdGhhbiBoYXZpbmcgYW5vdGhlciBuZXcgbGF5b3V0IGxvYWRlZC5cclxuICAgICAqIE5vdGUgdGhhdCwgaWYgdGhpcyBsYXlvdXQgaXMgc2F2ZWQgYW5kIHJlbG9hZGVkLCBpdCB3aWxsIHJlbG9hZCB3aXRoIHRoZSBDb21wb25lbnQgYXMgYSBjaGlsZCBvZiBhIFN0YWNrLlxyXG4gICAgKi9cclxuICAgIGxvYWRDb21wb25lbnRBc1Jvb3QoaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZyk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWRkIGl0ZW0gYmVmb3JlIGluaXQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9ncm91bmRJdGVtLmxvYWRDb21wb25lbnRBc1Jvb3QoaXRlbUNvbmZpZyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIChMYXlvdXRNYW5hZ2VyOmNsYXNzKS5zZXRTaXplfSAqL1xyXG4gICAgdXBkYXRlU2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIGxheW91dCBtYW5hZ2VycyBzaXplXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHdpZHRoIC0gV2lkdGggaW4gcGl4ZWxzXHJcbiAgICAgKiBAcGFyYW0gaGVpZ2h0IC0gSGVpZ2h0IGluIHBpeGVsc1xyXG4gICAgICovXHJcbiAgICBzZXRTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fd2lkdGggPSB3aWR0aDtcclxuICAgICAgICB0aGlzLl9oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9pc0luaXRpYWxpc2VkID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNVVMxODg4MScpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZ3JvdW5kSXRlbS5zZXRTaXplKHRoaXMuX3dpZHRoLCB0aGlzLl9oZWlnaHQpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXhpbWlzZWRTdGFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gZ2V0RWxlbWVudFdpZHRoQW5kSGVpZ2h0KHRoaXMuX2NvbnRhaW5lckVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNldEVsZW1lbnRXaWR0aCh0aGlzLl9tYXhpbWlzZWRTdGFjay5lbGVtZW50LCB3aWR0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0RWxlbWVudEhlaWdodCh0aGlzLl9tYXhpbWlzZWRTdGFjay5lbGVtZW50LCBoZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21heGltaXNlZFN0YWNrLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuYWRqdXN0Q29sdW1uc1Jlc3BvbnNpdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBiZWdpblNpemVJbnZhbGlkYXRpb24oKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fc2l6ZUludmFsaWRhdGlvbkJlZ2luQ291bnQrKztcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBlbmRTaXplSW52YWxpZGF0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICgtLXRoaXMuX3NpemVJbnZhbGlkYXRpb25CZWdpbkNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZUZyb21Db250YWluZXIoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgdXBkYXRlU2l6ZUZyb21Db250YWluZXIoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBnZXRFbGVtZW50V2lkdGhBbmRIZWlnaHQodGhpcy5fY29udGFpbmVyRWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlIHRoZSBzaXplIG9mIHRoZSByb290IENvbnRlbnRJdGVtLiAgVGhpcyB3aWxsIHVwZGF0ZSB0aGUgc2l6ZSBvZiBhbGwgY29udGVudEl0ZW1zIGluIHRoZSB0cmVlXHJcbiAgICAgKiBAcGFyYW0gZm9yY2UgLSBJbiBzb21lIGNhc2VzIHRoZSBzaXplIGlzIG5vdCB1cGRhdGVkIGlmIGl0IGhhcyBub3QgY2hhbmdlZC4gSW4gdGhpcyBjYXNlLCBldmVudHNcclxuICAgICAqIChzdWNoIGFzIENvbXBvbmVudENvbnRhaW5lci52aXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQpIGFyZSBub3QgZmlyZWQuIFNldHRpbmcgZm9yY2UgdG8gdHJ1ZSwgZW5zdXJlcyB0aGUgc2l6ZSBpcyB1cGRhdGVkIHJlZ2FyZGxlc3MsIGFuZFxyXG4gICAgICogdGhlIHJlc3BlY3RpdmUgZXZlbnRzIGFyZSBmaXJlZC4gVGhpcyBpcyBzb21ldGltZXMgbmVjZXNzYXJ5IHdoZW4gYSBjb21wb25lbnQncyBzaXplIGhhcyBub3QgY2hhbmdlZCBidXQgaXQgaGFzIGJlY29tZSB2aXNpYmxlLCBhbmQgdGhlXHJcbiAgICAgKiByZWxldmFudCBldmVudHMgbmVlZCB0byBiZSBmaXJlZC5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlUm9vdFNpemUoZm9yY2UgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1VUlMyODg4MScpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0udXBkYXRlU2l6ZShmb3JjZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHVibGljICovXHJcbiAgICBjcmVhdGVBbmRJbml0Q29udGVudEl0ZW0oY29uZmlnOiBSZXNvbHZlZEl0ZW1Db25maWcsIHBhcmVudDogQ29udGVudEl0ZW0pOiBDb250ZW50SXRlbSB7XHJcbiAgICAgICAgY29uc3QgbmV3SXRlbSA9IHRoaXMuY3JlYXRlQ29udGVudEl0ZW0oY29uZmlnLCBwYXJlbnQpO1xyXG4gICAgICAgIG5ld0l0ZW0uaW5pdCgpO1xyXG4gICAgICAgIHJldHVybiBuZXdJdGVtO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjdXJzaXZlbHkgY3JlYXRlcyBuZXcgaXRlbSB0cmVlIHN0cnVjdHVyZXMgYmFzZWQgb24gYSBwcm92aWRlZFxyXG4gICAgICogSXRlbUNvbmZpZ3VyYXRpb24gb2JqZWN0XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNvbmZpZyAtIFJlc29sdmVkSXRlbUNvbmZpZ1xyXG4gICAgICogQHBhcmFtIHBhcmVudCAtIFRoZSBpdGVtIHRoZSBuZXdseSBjcmVhdGVkIGl0ZW0gc2hvdWxkIGJlIGEgY2hpbGQgb2ZcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBjcmVhdGVDb250ZW50SXRlbShjb25maWc6IFJlc29sdmVkSXRlbUNvbmZpZywgcGFyZW50OiBDb250ZW50SXRlbSk6IENvbnRlbnRJdGVtIHtcclxuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy50eXBlICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKCdNaXNzaW5nIHBhcmFtZXRlciBcXCd0eXBlXFwnJywgSlNPTi5zdHJpbmdpZnkoY29uZmlnKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBXZSBhZGQgYW4gYWRkaXRpb25hbCBzdGFjayBhcm91bmQgZXZlcnkgY29tcG9uZW50IHRoYXQncyBub3Qgd2l0aGluIGEgc3RhY2sgYW55d2F5cy5cclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBjb21wb25lbnRcclxuICAgICAgICAgICAgUmVzb2x2ZWRJdGVtQ29uZmlnLmlzQ29tcG9uZW50SXRlbShjb25maWcpICYmXHJcblxyXG4gICAgICAgICAgICAvLyBhbmQgaXQncyBub3QgYWxyZWFkeSB3aXRoaW4gYSBzdGFja1xyXG4gICAgICAgICAgICAhKHBhcmVudCBpbnN0YW5jZW9mIFN0YWNrKSAmJlxyXG5cclxuICAgICAgICAgICAgLy8gYW5kIHdlIGhhdmUgYSBwYXJlbnRcclxuICAgICAgICAgICAgISFwYXJlbnQgJiZcclxuXHJcbiAgICAgICAgICAgIC8vIGFuZCBpdCdzIG5vdCB0aGUgdG9wbW9zdCBpdGVtIGluIGEgbmV3IHdpbmRvd1xyXG4gICAgICAgICAgICAhKHRoaXMuaXNTdWJXaW5kb3cgPT09IHRydWUgJiYgcGFyZW50IGluc3RhbmNlb2YgR3JvdW5kSXRlbSlcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhY2tDb25maWc6IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogSXRlbVR5cGUuc3RhY2ssXHJcbiAgICAgICAgICAgICAgICBjb250ZW50OiBbY29uZmlnXSxcclxuICAgICAgICAgICAgICAgIHNpemU6IGNvbmZpZy5zaXplLFxyXG4gICAgICAgICAgICAgICAgc2l6ZVVuaXQ6IGNvbmZpZy5zaXplVW5pdCxcclxuICAgICAgICAgICAgICAgIG1pblNpemU6IGNvbmZpZy5taW5TaXplLFxyXG4gICAgICAgICAgICAgICAgbWluU2l6ZVVuaXQ6IGNvbmZpZy5taW5TaXplVW5pdCxcclxuICAgICAgICAgICAgICAgIGlkOiBjb25maWcuaWQsXHJcbiAgICAgICAgICAgICAgICBtYXhpbWlzZWQ6IGNvbmZpZy5tYXhpbWlzZWQsXHJcbiAgICAgICAgICAgICAgICBpc0Nsb3NhYmxlOiBjb25maWcuaXNDbG9zYWJsZSxcclxuICAgICAgICAgICAgICAgIGFjdGl2ZUl0ZW1JbmRleDogMCxcclxuICAgICAgICAgICAgICAgIGhlYWRlcjogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uZmlnID0gc3RhY2tDb25maWc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IHRoaXMuY3JlYXRlQ29udGVudEl0ZW1Gcm9tQ29uZmlnKGNvbmZpZywgcGFyZW50KTtcclxuICAgICAgICByZXR1cm4gY29udGVudEl0ZW07XHJcbiAgICB9XHJcblxyXG4gICAgZmluZEZpcnN0Q29tcG9uZW50SXRlbUJ5SWQoaWQ6IHN0cmluZyk6IENvbXBvbmVudEl0ZW0gfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1GRkNJQkk4MjQ0NicpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRGaXJzdENvbnRlbnRJdGVtVHlwZUJ5SWRSZWN1cnNpdmUoSXRlbVR5cGUuY29tcG9uZW50LCBpZCwgdGhpcy5fZ3JvdW5kSXRlbSkgYXMgQ29tcG9uZW50SXRlbTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY3JlYXRlUG9wb3V0RnJvbUNvbnRlbnRJdGVtKGl0ZW06IENvbnRlbnRJdGVtLFxyXG4gICAgICAgIHdpbmRvdzogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcuV2luZG93IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIHBhcmVudElkOiBzdHJpbmcgfCBudWxsLFxyXG4gICAgICAgIGRvY2tQb2ludDogQ29udGVudEl0ZW0uRG9ja1BvaW50IHwgbnVsbCB8IHVuZGVmaW5lZCxcclxuICAgICk6IEJyb3dzZXJQb3BvdXQge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIHRoZSBpdGVtIGlzIHRoZSBvbmx5IGNvbXBvbmVudCB3aXRoaW4gYSBzdGFjayBvciBmb3Igc29tZVxyXG4gICAgICAgICAqIG90aGVyIHJlYXNvbiB0aGUgb25seSBjaGlsZCBvZiBpdHMgcGFyZW50IHRoZSBwYXJlbnQgd2lsbCBiZSBkZXN0cm95ZWRcclxuICAgICAgICAgKiB3aGVuIHRoZSBjaGlsZCBpcyByZW1vdmVkLlxyXG4gICAgICAgICAqXHJcbiAgICAgICAgICogSW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIHdlIG1vdmUgdXAgdGhlIHRyZWUgdW50aWwgd2UgZmluZCBzb21ldGhpbmdcclxuICAgICAgICAgKiB0aGF0IHdpbGwgcmVtYWluIGFmdGVyIHRoZSBpdGVtIGlzIGJlaW5nIHBvcHBlZCBvdXRcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBkb2NrID0gZG9ja1BvaW50ID8/IGl0ZW0uZmluZERvY2tQb2ludCgpO1xyXG5cclxuICAgICAgICBpZiAoZG9jayA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignTE1DUEZDSTAwODM0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHBhcmVudElkICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBkb2NrLnBhcmVudC5hZGRQb3BJblBhcmVudElkKHBhcmVudElkKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHdpbmRvdyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbm5lclNjcmVlbiA9IGdldFdpbmRvd0lubmVyU2NyZWVuUG9zaXRpb24oZ2xvYmFsVGhpcyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjbGllbnRSZWN0ID0gKGl0ZW0gaW5zdGFuY2VvZiBDb21wb25lbnRJdGVtKSA/IGl0ZW0uZ2V0T3V0ZXJCb3VuZGluZ0NsaWVudFJlY3QoKSA6IGl0ZW0uZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgICAgICAgICB3aW5kb3cgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogaW5uZXJTY3JlZW4ubGVmdCArIGNsaWVudFJlY3QubGVmdCxcclxuICAgICAgICAgICAgICAgICAgICB0b3A6IGlubmVyU2NyZWVuLnRvcCArIGNsaWVudFJlY3QudG9wLFxyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBjbGllbnRSZWN0LndpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogY2xpZW50UmVjdC5oZWlnaHQsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpdGVtQ29uZmlnID0gaXRlbS50b0NvbmZpZygpO1xyXG4gICAgICAgICAgICBpZiAoaXRlbS5wYXJlbnQ/LmNvbnRlbnRJdGVtcy5pbmNsdWRlcyhpdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFSZXNvbHZlZFJvb3RJdGVtQ29uZmlnLmlzUm9vdEl0ZW1Db25maWcoaXRlbUNvbmZpZykpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuUG9wb3V0Q2Fubm90QmVDcmVhdGVkV2l0aEdyb3VuZEl0ZW1Db25maWddfWApO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUG9wb3V0RnJvbUl0ZW1Db25maWcoaXRlbUNvbmZpZywgd2luZG93LCBwYXJlbnRJZCwgZG9jay5pbmRleCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgYmVnaW5WaXJ0dWFsU2l6ZWRDb250YWluZXJBZGRpbmcoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCsrdGhpcy5fdmlydHVhbFNpemVkQ29udGFpbmVyQWRkaW5nQmVnaW5Db3VudCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLl92aXJ0dWFsU2l6ZWRDb250YWluZXJzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGFkZFZpcnR1YWxTaXplZENvbnRhaW5lcihjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3ZpcnR1YWxTaXplZENvbnRhaW5lcnMucHVzaChjb250YWluZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGVuZFZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZygpOiB2b2lkIHtcclxuICAgICAgICBpZiAoLS10aGlzLl92aXJ0dWFsU2l6ZWRDb250YWluZXJBZGRpbmdCZWdpbkNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5fdmlydHVhbFNpemVkQ29udGFpbmVycy5sZW5ndGg7XHJcbiAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUJlZm9yZVZpcnR1YWxSZWN0aW5nRXZlbnQoY291bnQpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5fdmlydHVhbFNpemVkQ29udGFpbmVyc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXIubm90aWZ5VmlydHVhbFJlY3RpbmdSZXF1aXJlZCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJlQWZ0ZXJWaXJ0dWFsUmVjdGluZ0V2ZW50KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92aXJ0dWFsU2l6ZWRDb250YWluZXJzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZmlyZUJlZm9yZVZpcnR1YWxSZWN0aW5nRXZlbnQoY291bnQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmJlZm9yZVZpcnR1YWxSZWN0aW5nRXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmJlZm9yZVZpcnR1YWxSZWN0aW5nRXZlbnQoY291bnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBmaXJlQWZ0ZXJWaXJ0dWFsUmVjdGluZ0V2ZW50KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmFmdGVyVmlydHVhbFJlY3RpbmdFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJWaXJ0dWFsUmVjdGluZ0V2ZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlUG9wb3V0RnJvbUl0ZW1Db25maWcocm9vdEl0ZW1Db25maWc6IFJlc29sdmVkUm9vdEl0ZW1Db25maWcsXHJcbiAgICAgICAgd2luZG93OiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3csXHJcbiAgICAgICAgcGFyZW50SWQ6IHN0cmluZyB8IG51bGwsXHJcbiAgICAgICAgaW5kZXhJblBhcmVudDogbnVtYmVyIHwgbnVsbFxyXG4gICAgKSB7XHJcbiAgICAgICAgY29uc3QgbGF5b3V0Q29uZmlnID0gdGhpcy50b0NvbmZpZygpO1xyXG5cclxuICAgICAgICBjb25zdCBwb3BvdXRMYXlvdXRDb25maWc6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnID0ge1xyXG4gICAgICAgICAgICByb290OiByb290SXRlbUNvbmZpZyxcclxuICAgICAgICAgICAgb3BlblBvcG91dHM6IFtdLFxyXG4gICAgICAgICAgICBzZXR0aW5nczogbGF5b3V0Q29uZmlnLnNldHRpbmdzLFxyXG4gICAgICAgICAgICBkaW1lbnNpb25zOiBsYXlvdXRDb25maWcuZGltZW5zaW9ucyxcclxuICAgICAgICAgICAgaGVhZGVyOiBsYXlvdXRDb25maWcuaGVhZGVyLFxyXG4gICAgICAgICAgICB3aW5kb3csXHJcbiAgICAgICAgICAgIHBhcmVudElkLFxyXG4gICAgICAgICAgICBpbmRleEluUGFyZW50LFxyXG4gICAgICAgICAgICByZXNvbHZlZDogdHJ1ZSxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVBvcG91dEZyb21Qb3BvdXRMYXlvdXRDb25maWcocG9wb3V0TGF5b3V0Q29uZmlnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjcmVhdGVQb3BvdXRGcm9tUG9wb3V0TGF5b3V0Q29uZmlnKGNvbmZpZzogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcpOiBCcm93c2VyUG9wb3V0IHtcclxuICAgICAgICAvLyBJZiB0aGlzIGlzIGFscmVhZHkgYSBwb3BvdXQsIGxldCB0aGUgcGFyZW50IGxheW91dCBtYW5hZ2VyIGhhbmRsZSB0aGUgbmV3IG9uZS5cclxuICAgICAgICBpZiAodGhpcy5fcGFyZW50ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQuY3JlYXRlUG9wb3V0RnJvbVBvcG91dExheW91dENvbmZpZyhjb25maWcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY29uZmlnV2luZG93ID0gY29uZmlnLndpbmRvdztcclxuICAgICAgICBjb25zdCBpbml0aWFsV2luZG93OiBSZWN0ID0ge1xyXG4gICAgICAgICAgICBsZWZ0OiBjb25maWdXaW5kb3cubGVmdCA/PyAoZ2xvYmFsVGhpcy5zY3JlZW5YIHx8IGdsb2JhbFRoaXMuc2NyZWVuTGVmdCArIDIwKSxcclxuICAgICAgICAgICAgdG9wOiBjb25maWdXaW5kb3cudG9wID8/IChnbG9iYWxUaGlzLnNjcmVlblkgfHwgZ2xvYmFsVGhpcy5zY3JlZW5Ub3AgKyAyMCksXHJcbiAgICAgICAgICAgIHdpZHRoOiBjb25maWdXaW5kb3cud2lkdGggPz8gNTAwLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IGNvbmZpZ1dpbmRvdy5oZWlnaHQgPz8gMzA5LFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGJyb3dzZXJQb3BvdXQgPSBuZXcgQnJvd3NlclBvcG91dChjb25maWcsIGluaXRpYWxXaW5kb3csIHRoaXMpO1xyXG5cclxuICAgICAgICBicm93c2VyUG9wb3V0Lm9uKCdpbml0aWFsaXNlZCcsICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbG0gPSBicm93c2VyUG9wb3V0LmdldEdsSW5zdGFuY2UoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIENsb3NlIHRoZSBwb3BvdXQgd2hlbiB0aGUgbGFzdCBjb21wb25lbnQgaXRlbSBpcyBkZXN0cm95ZWQuXHJcbiAgICAgICAgICAgIGNvbnN0IGRlc3Ryb3lJZkVtcHR5ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFsbS5pc0RyYWdnaW5nICYmIGxtLmdyb3VuZEl0ZW0/LmdldEFsbENvbXBvbmVudEl0ZW1zKCk/Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyb3dzZXJQb3BvdXQuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGxtLm9uKCdpdGVtRHJvcHBlZCcsIGRlc3Ryb3lJZkVtcHR5KTtcclxuICAgICAgICAgICAgbG0ub24oJ2l0ZW1EZXN0cm95ZWQnLCBkZXN0cm95SWZFbXB0eSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3dpbmRvd09wZW5lZCcsIGJyb3dzZXJQb3BvdXQpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBicm93c2VyUG9wb3V0Lm9uKCdjbG9zZWQnLCAoKSA9PiB0aGlzLnJlY29uY2lsZVBvcG91dFdpbmRvd3MoKSk7XHJcblxyXG4gICAgICAgIHRoaXMuX29wZW5Qb3BvdXRzLnB1c2goYnJvd3NlclBvcG91dCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmxheW91dENvbmZpZy5zZXR0aW5ncy5jbG9zZVBvcG91dHNPblVubG9hZCAmJiAhdGhpcy5fd2luZG93QmVmb3JlVW5sb2FkTGlzdGVuaW5nKSB7XHJcbiAgICAgICAgICAgIGdsb2JhbFRoaXMuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgdGhpcy5fd2luZG93QmVmb3JlVW5sb2FkTGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgdGhpcy5fd2luZG93QmVmb3JlVW5sb2FkTGlzdGVuaW5nID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBicm93c2VyUG9wb3V0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xvc2VzIGFsbCBPcGVuIFBvcG91dHNcclxuICAgICAqIEFwcGxpY2F0aW9ucyBjYW4gY2FsbCB0aGlzIG1ldGhvZCB3aGVuIGEgcGFnZSBpcyB1bmxvYWRlZCB0byByZW1vdmUgaXRzIG9wZW4gcG9wb3V0c1xyXG4gICAgICovXHJcblxyXG4gICAgY2xvc2VBbGxPcGVuUG9wb3V0cyhwcmV2ZW50UG9wSW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fb3BlblBvcG91dHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5fb3BlblBvcG91dHNbaV0uY2xvc2UocHJldmVudFBvcEluKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX29wZW5Qb3BvdXRzLmxlbmd0aCA9IDA7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRMaXN0ZW5pbmcpIHtcclxuICAgICAgICAgICAgZ2xvYmFsVGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCB0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRMaXN0ZW5lcik7XHJcbiAgICAgICAgICAgIHRoaXMuX3dpbmRvd0JlZm9yZVVubG9hZExpc3RlbmluZyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEF0dGFjaGVzIERyYWdMaXN0ZW5lciB0byBhbnkgZ2l2ZW4gRE9NIGVsZW1lbnRcclxuICAgICAqIGFuZCB0dXJucyBpdCBpbnRvIGEgd2F5IG9mIGNyZWF0aW5nIG5ldyBDb21wb25lbnRJdGVtc1xyXG4gICAgICogYnkgJ2RyYWdnaW5nJyB0aGUgRE9NIGVsZW1lbnQgaW50byB0aGUgbGF5b3V0XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgSFRNTCBlbGVtZW50IHdoaWNoIHdpbGwgYmUgbGlzdGVuZWQgdG8gZm9yIGNvbW1lbmNlbWVudCBvZiBkcmFnLlxyXG4gICAgICogQHBhcmFtIGNvbXBvbmVudFR5cGVPckl0ZW1Db25maWdDYWxsYmFjayAtIFR5cGUgb2YgY29tcG9uZW50IHRvIGJlIGNyZWF0ZWQsIG9yIGEgY2FsbGJhY2sgd2hpY2ggd2lsbCBwcm92aWRlIHRoZSBJdGVtQ29uZmlnXHJcbiAgICAgKiB0byBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgY29tcG9uZW50LlxyXG4gICAgICogQHBhcmFtIGNvbXBvbmVudFN0YXRlIC0gT3B0aW9uYWwgaW5pdGlhbCBzdGF0ZSBvZiBjb21wb25lbnQuICBUaGlzIHdpbGwgYmUgaWdub3JlZCBpZiBjb21wb25lbnRUeXBlT3JGdG4gaXMgYSBmdW5jdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBhbiBvcGFxdWUgb2JqZWN0IHRoYXQgaWRlbnRpZmllcyB0aGUgRE9NIGVsZW1lbnRcclxuXHQgKiAgICAgICAgICBhbmQgdGhlIGF0dGFjaGVkIGl0ZW1Db25maWcuIFRoaXMgY2FuIGJlIHVzZWQgaW5cclxuXHQgKiAgICAgICAgICByZW1vdmVEcmFnU291cmNlKCkgbGF0ZXIgdG8gZ2V0IHJpZCBvZiB0aGUgZHJhZyBsaXN0ZW5lcnMuXHJcbiAgICAgKi9cclxuICAgIG5ld0RyYWdTb3VyY2UoZWxlbWVudDogSFRNTEVsZW1lbnQsIGl0ZW1Db25maWdDYWxsYmFjazogKCkgPT4gKERyYWdTb3VyY2UuQ29tcG9uZW50SXRlbUNvbmZpZyB8IENvbXBvbmVudEl0ZW1Db25maWcpKTogRHJhZ1NvdXJjZTtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCB3aWxsIGJlIHJlcGxhY2VkIGluIHZlcnNpb24gMyB3aXRoIG5ld0RyYWdTb3VyY2UoZWxlbWVudDogSFRNTEVsZW1lbnQsIGl0ZW1Db25maWc6IENvbXBvbmVudEl0ZW1Db25maWcpICovXHJcbiAgICBuZXdEcmFnU291cmNlKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjb21wb25lbnRUeXBlOiBKc29uVmFsdWUsIGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlLCB0aXRsZT86IEpzb25WYWx1ZSwgaWQ/OiBzdHJpbmcpOiBEcmFnU291cmNlO1xyXG4gICAgbmV3RHJhZ1NvdXJjZShlbGVtZW50OiBIVE1MRWxlbWVudCxcclxuICAgICAgICBjb21wb25lbnRUeXBlT3JJdGVtQ29uZmlnQ2FsbGJhY2s6IEpzb25WYWx1ZSB8ICgoKSA9PiAoRHJhZ1NvdXJjZS5Db21wb25lbnRJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZykpLFxyXG4gICAgICAgIGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlLFxyXG4gICAgICAgIHRpdGxlPzogc3RyaW5nLFxyXG4gICAgICAgIGlkPzogc3RyaW5nLFxyXG4gICAgKTogRHJhZ1NvdXJjZSB7XHJcbiAgICAgICAgY29uc3QgZHJhZ1NvdXJjZSA9IG5ldyBEcmFnU291cmNlKHRoaXMsIGVsZW1lbnQsIFtdLCBjb21wb25lbnRUeXBlT3JJdGVtQ29uZmlnQ2FsbGJhY2ssIGNvbXBvbmVudFN0YXRlLCB0aXRsZSwgaWQpO1xyXG4gICAgICAgIHRoaXMuX2RyYWdTb3VyY2VzLnB1c2goZHJhZ1NvdXJjZSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkcmFnU291cmNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG5cdCAqIFJlbW92ZXMgYSBEcmFnTGlzdGVuZXIgYWRkZWQgYnkgY3JlYXRlRHJhZ1NvdXJjZSgpIHNvIHRoZSBjb3JyZXNwb25kaW5nXHJcblx0ICogRE9NIGVsZW1lbnQgaXMgbm90IGEgZHJhZyBzb3VyY2UgYW55IG1vcmUuXHJcblx0ICovXHJcblx0cmVtb3ZlRHJhZ1NvdXJjZShkcmFnU291cmNlOiBEcmFnU291cmNlKTogdm9pZCB7XHJcblx0XHRyZW1vdmVGcm9tQXJyYXkoZHJhZ1NvdXJjZSwgdGhpcy5fZHJhZ1NvdXJjZXMgKTtcclxuXHRcdGRyYWdTb3VyY2UuZGVzdHJveSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgc3RhcnRFeHRlcm5hbENvbXBvbmVudERyYWcocGFyZW50OiBEcmFnQWN0aW9uKSB7XHJcbiAgICAgICAgRHJhZ0FjdGlvbi5zcGF3bih0aGlzLCBwYXJlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHN0YXJ0Q29tcG9uZW50RHJhZyh4OiBudW1iZXIsIHk6IG51bWJlciwgZHJhZ0xpc3RlbmVyOiBEcmFnTGlzdGVuZXIsIGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBpc0xhc3QgPSBjb21wb25lbnRJdGVtLmZpbmRBbmNlc3RvcldpdGhTaWJsaW5ncygpID09PSBudWxsO1xyXG5cclxuICAgICAgICBjb25zdCBhbGxvd1BvcG91dCA9XHJcbiAgICAgICAgICAgIGNvbXBvbmVudEl0ZW0uaXNDbG9zYWJsZSAmJlxyXG4gICAgICAgICAgICB0aGlzLmxheW91dENvbmZpZy5zZXR0aW5ncy5kcmFnVG9OZXdXaW5kb3cgJiZcclxuICAgICAgICAgICAgKHRoaXMucGFyZW50ID09PSBudWxsIHx8ICFpc0xhc3QpOyAgICAgICAgICAgICAgICAgIC8vIFBvcG91dCBpcyBkZXN0cm95ZWQgd2hlbiBsYXN0IGNvbXBvbmVudCBpcyByZW1vdmVkLCBkcmFnIHRvIG5ldyBwb3BvdXQgbWFrZXMgbm8gc2Vuc2VcclxuXHJcbiAgICAgICAgY29uc3QgY2FuTW92ZUJldHdlZW5XaW5kb3dzID1cclxuICAgICAgICAgICAgY29tcG9uZW50SXRlbS5pc0Nsb3NhYmxlICYmXHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0Q29uZmlnLnNldHRpbmdzLmRyYWdCZXR3ZWVuV2luZG93cyAmJlxyXG4gICAgICAgICAgICAodGhpcy5fcGFyZW50ID8/IHRoaXMpLl9vcGVuUG9wb3V0cy5sZW5ndGggPiAwOyAgICAgLy8gQXJlIHRoZXJlIGV2ZW4gbXVsdGlwbGUgd2luZG93cz9cclxuXHJcbiAgICAgICAgLy8gQ2FuY2VsIHRoZSBkcmFnIGlmIHRoaXMgaXMgdGhlIGxhc3QgY29tcG9uZW50IGFuZCB0aGVyZSBhcmUgbm8gdmFsaWQgZXh0ZXJuYWwgdGFyZ2V0cy5cclxuICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIG9ubHkgdGhlIGN1cnJlbnQgbGF5b3V0IGNvbmZpZ3VyYXRpb24gaXMgcG9zc2libGUsIHNvIHRoZXJlIGlzIG5vIHBvaW50IGluIGRyYWdnaW5nLlxyXG4gICAgICAgIGlmIChpc0xhc3QgJiYgIWFsbG93UG9wb3V0ICYmICFjYW5Nb3ZlQmV0d2VlbldpbmRvd3MpIHtcclxuICAgICAgICAgICAgZHJhZ0xpc3RlbmVyLmNhbmNlbERyYWcoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYWN0aW9uID0gRHJhZ0FjdGlvbi5zdGFydCh0aGlzLCBkcmFnTGlzdGVuZXIsIGNvbXBvbmVudEl0ZW0sIHgsIHksIGFsbG93UG9wb3V0KTtcclxuXHJcbiAgICAgICAgaWYgKGNhbk1vdmVCZXR3ZWVuV2luZG93cykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBsbSBvZiB0aGlzLmluc3RhbmNlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGxtICE9PSB0aGlzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG0uc3RhcnRFeHRlcm5hbENvbXBvbmVudERyYWcoYWN0aW9uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBoaWRlRHJvcFRhcmdldEluZGljYXRvcigpIHtcclxuICAgICAgICB0aGlzLnRhYkRyb3BQbGFjZWhvbGRlci5yZW1vdmUoKTtcclxuICAgICAgICB0aGlzLmRyb3BUYXJnZXRJbmRpY2F0b3I/LmhpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2dyYW1tYXRpY2FsbHkgZm9jdXNlcyBhbiBpdGVtLiBUaGlzIGZvY3VzZXMgdGhlIHNwZWNpZmllZCBjb21wb25lbnQgaXRlbVxyXG4gICAgICogYW5kIHRoZSBpdGVtIGVtaXRzIGEgZm9jdXMgZXZlbnRcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaXRlbSAtIFRoZSBjb21wb25lbnQgaXRlbSB0byBiZSBmb2N1c2VkXHJcbiAgICAgKiBAcGFyYW0gc3VwcHJlc3NFdmVudCAtIFdoZXRoZXIgdG8gZW1pdCBmb2N1cyBldmVudFxyXG4gICAgICovXHJcbiAgICBmb2N1c0NvbXBvbmVudChpdGVtOiBDb21wb25lbnRJdGVtLCBzdXBwcmVzc0V2ZW50ID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICBpdGVtLmZvY3VzKHN1cHByZXNzRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvZ3JhbW1hdGljYWxseSBibHVycyAoZGVmb2N1c2VzKSB0aGUgY3VycmVudGx5IGZvY3VzZWQgY29tcG9uZW50LlxyXG4gICAgICogSWYgYSBjb21wb25lbnQgaXRlbSBpcyBmb2N1c2VkLCB0aGVuIGl0IGlzIGJsdXJyZWQgYW5kIGFuZCB0aGUgaXRlbSBlbWl0cyBhIGJsdXIgZXZlbnRcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaXRlbSAtIFRoZSBjb21wb25lbnQgaXRlbSB0byBiZSBibHVycmVkXHJcbiAgICAgKiBAcGFyYW0gc3VwcHJlc3NFdmVudCAtIFdoZXRoZXIgdG8gZW1pdCBibHVyIGV2ZW50XHJcbiAgICAgKi9cclxuICAgIGNsZWFyQ29tcG9uZW50Rm9jdXMoc3VwcHJlc3NFdmVudCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRGb2N1c2VkQ29tcG9uZW50SXRlbSh1bmRlZmluZWQsIHN1cHByZXNzRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvZ3JhbW1hdGljYWxseSBmb2N1c2VzIGEgY29tcG9uZW50IGl0ZW0gb3IgcmVtb3ZlcyBmb2N1cyAoYmx1cnMpIGZyb20gYW4gZXhpc3RpbmcgZm9jdXNlZCBjb21wb25lbnQgaXRlbS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaXRlbSAtIElmIGRlZmluZWQsIHNwZWNpZmllcyB0aGUgY29tcG9uZW50IGl0ZW0gdG8gYmUgZ2l2ZW4gZm9jdXMuICBJZiB1bmRlZmluZWQsIGNsZWFyIGNvbXBvbmVudCBmb2N1cy5cclxuICAgICAqIEBwYXJhbSBzdXBwcmVzc0V2ZW50cyAtIFdoZXRoZXIgdG8gZW1pdCBmb2N1cyBhbmQgYmx1ciBldmVudHNcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBzZXRGb2N1c2VkQ29tcG9uZW50SXRlbShpdGVtOiBDb21wb25lbnRJdGVtIHwgdW5kZWZpbmVkLCBzdXBwcmVzc0V2ZW50cyA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGl0ZW0gIT09IHRoaXMuX2ZvY3VzZWRDb21wb25lbnRJdGVtKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgbmV3Rm9jdXNlZFBhcmVudEl0ZW06IENvbXBvbmVudFBhcmVudGFibGVJdGVtIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdGb2N1c2VkUGFyZW50SXRlbSA9PT0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbmV3Rm9jdXNlZFBhcmVudEl0ZW0gPSBpdGVtLnBhcmVudEl0ZW07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9mb2N1c2VkQ29tcG9uZW50SXRlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRGb2N1c2VkSXRlbSA9IHRoaXMuX2ZvY3VzZWRDb21wb25lbnRJdGVtO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNlZENvbXBvbmVudEl0ZW0gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBvbGRGb2N1c2VkSXRlbS5zZXRCbHVycmVkKHN1cHByZXNzRXZlbnRzKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9sZEZvY3VzZWRQYXJlbnRJdGVtID0gb2xkRm9jdXNlZEl0ZW0ucGFyZW50SXRlbTtcclxuICAgICAgICAgICAgICAgIGlmIChuZXdGb2N1c2VkUGFyZW50SXRlbSA9PT0gb2xkRm9jdXNlZFBhcmVudEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXdGb2N1c2VkUGFyZW50SXRlbSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2xkRm9jdXNlZFBhcmVudEl0ZW0uc2V0Rm9jdXNlZFZhbHVlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGl0ZW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNlZENvbXBvbmVudEl0ZW0gPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgaXRlbS5zZXRGb2N1c2VkKHN1cHByZXNzRXZlbnRzKTtcclxuICAgICAgICAgICAgICAgIGlmIChuZXdGb2N1c2VkUGFyZW50SXRlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3Rm9jdXNlZFBhcmVudEl0ZW0uc2V0Rm9jdXNlZFZhbHVlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlQ29udGVudEl0ZW1Gcm9tQ29uZmlnKGNvbmZpZzogUmVzb2x2ZWRJdGVtQ29uZmlnLCBwYXJlbnQ6IENvbnRlbnRJdGVtKTogQ29udGVudEl0ZW0ge1xyXG4gICAgICAgIHN3aXRjaCAoY29uZmlnLnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5ncm91bmQ6IHRocm93IG5ldyBBc3NlcnRFcnJvcignTE1DQ0lGQzY4ODcxJyk7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUucm93OiByZXR1cm4gbmV3IFJvd09yQ29sdW1uKGZhbHNlLCB0aGlzLCBjb25maWcgYXMgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcsIHBhcmVudCk7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29sdW1uOiByZXR1cm4gbmV3IFJvd09yQ29sdW1uKHRydWUsIHRoaXMsIGNvbmZpZyBhcyBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZywgcGFyZW50KTtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5zdGFjazogcmV0dXJuIG5ldyBTdGFjayh0aGlzLCBjb25maWcgYXMgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcsIHBhcmVudCk7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29tcG9uZW50OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRJdGVtKHRoaXMsIGNvbmZpZyBhcyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcsIHBhcmVudCBhcyBTdGFjayk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ0NDQzkxMzU2NCcsIGNvbmZpZy50eXBlLCAnSW52YWxpZCBDb25maWcgSXRlbSB0eXBlIHNwZWNpZmllZCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gc3RhY2sgY29tcG9uZW50LlxyXG4gICAgICogU3RhY2sgd2lsbCBsb29rIGFmdGVyIGRvY2tpbmcgcHJvY2Vzc2luZyBhc3NvY2lhdGVkIHdpdGggbWF4aW1pc2UvbWluaW1pc2VcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICoqL1xyXG4gICAgc2V0TWF4aW1pc2VkU3RhY2soc3RhY2s6IFN0YWNrIHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHN0YWNrID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX21heGltaXNlZFN0YWNrICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc01pbmltaXNlTWF4aW1pc2VkU3RhY2soKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChzdGFjayAhPT0gdGhpcy5fbWF4aW1pc2VkU3RhY2spIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXhpbWlzZWRTdGFjayAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzTWluaW1pc2VNYXhpbWlzZWRTdGFjaygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc01heGltaXNlU3RhY2soc3RhY2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrTWluaW1pc2VNYXhpbWlzZWRTdGFjaygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fbWF4aW1pc2VkU3RhY2sgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXhpbWlzZWRTdGFjay5taW5pbWlzZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBzaG93QWxsQWN0aXZlQ29udGVudEl0ZW1zKCkgd2FzIGNhbGxlZCBmcm9tIENvbnRlbnRJdGVtLnNob3coKS4gIE5vdCBzdXJlIHdoYXQgaXRzIHB1cnBvc2Ugd2FzIHNvIGhhdmUgY29tbWVudGVkIG91dFxyXG4gICAgLy8gRXZlcnl0aGluZyBzZWVtcyB0byB3b3JrIG9rIHdpdGhvdXQgdGhpcy4gIEhhdmUgbGVmdCBjb21tZW50ZWQgY29kZSBqdXN0IGluIGNhc2UgdGhlcmUgd2FzIGEgcmVhc29uIGZvciBpdCBiZWNvbWVzXHJcbiAgICAvLyBhcHBhcmVudFxyXG5cclxuICAgIC8vIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIC8vIHNob3dBbGxBY3RpdmVDb250ZW50SXRlbXMoKTogdm9pZCB7XHJcbiAgICAvLyAgICAgY29uc3QgYWxsU3RhY2tzID0gdGhpcy5nZXRBbGxTdGFja3MoKTtcclxuXHJcbiAgICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxTdGFja3MubGVuZ3RoOyBpKyspIHtcclxuICAgIC8vICAgICAgICAgY29uc3Qgc3RhY2sgPSBhbGxTdGFja3NbaV07XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGFjdGl2ZUNvbnRlbnRJdGVtID0gc3RhY2suZ2V0QWN0aXZlQ29tcG9uZW50SXRlbSgpO1xyXG5cclxuICAgIC8vICAgICAgICAgaWYgKGFjdGl2ZUNvbnRlbnRJdGVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgIC8vICAgICAgICAgICAgIGlmICghKGFjdGl2ZUNvbnRlbnRJdGVtIGluc3RhbmNlb2YgQ29tcG9uZW50SXRlbSkpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNU0FBQ0lTMjIyOTgnKTtcclxuICAgIC8vICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgYWN0aXZlQ29udGVudEl0ZW0uY29udGFpbmVyLnNob3coKTtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBoaWRlQWxsQWN0aXZlQ29udGVudEl0ZW1zKCkgd2FzIGNhbGxlZCBmcm9tIENvbnRlbnRJdGVtLmhpZGUoKS4gIE5vdCBzdXJlIHdoYXQgaXRzIHB1cnBvc2Ugd2FzIHNvIGhhdmUgY29tbWVudGVkIG91dFxyXG4gICAgLy8gRXZlcnl0aGluZyBzZWVtcyB0byB3b3JrIG9rIHdpdGhvdXQgdGhpcy4gIEhhdmUgbGVmdCBjb21tZW50ZWQgY29kZSBqdXN0IGluIGNhc2UgdGhlcmUgd2FzIGEgcmVhc29uIGZvciBpdCBiZWNvbWVzXHJcbiAgICAvLyBhcHBhcmVudFxyXG5cclxuICAgIC8vIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIC8vIGhpZGVBbGxBY3RpdmVDb250ZW50SXRlbXMoKTogdm9pZCB7XHJcbiAgICAvLyAgICAgY29uc3QgYWxsU3RhY2tzID0gdGhpcy5nZXRBbGxTdGFja3MoKTtcclxuXHJcbiAgICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxTdGFja3MubGVuZ3RoOyBpKyspIHtcclxuICAgIC8vICAgICAgICAgY29uc3Qgc3RhY2sgPSBhbGxTdGFja3NbaV07XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGFjdGl2ZUNvbnRlbnRJdGVtID0gc3RhY2suZ2V0QWN0aXZlQ29tcG9uZW50SXRlbSgpO1xyXG5cclxuICAgIC8vICAgICAgICAgaWYgKGFjdGl2ZUNvbnRlbnRJdGVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgIC8vICAgICAgICAgICAgIGlmICghKGFjdGl2ZUNvbnRlbnRJdGVtIGluc3RhbmNlb2YgQ29tcG9uZW50SXRlbSkpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNU0FBQ0lIMjIyOTgnKTtcclxuICAgIC8vICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgYWN0aXZlQ29udGVudEl0ZW0uY29udGFpbmVyLmhpZGUoKTtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGNsZWFudXBCZWZvcmVNYXhpbWlzZWRTdGFja0Rlc3Ryb3llZChldmVudDogRXZlbnRFbWl0dGVyLkJ1YmJsaW5nRXZlbnQpIHtcclxuXHRcdGlmICh0aGlzLl9tYXhpbWlzZWRTdGFjayAhPT0gbnVsbCAmJiB0aGlzLl9tYXhpbWlzZWRTdGFjayA9PT0gZXZlbnQudGFyZ2V0KSB7XHJcblx0XHRcdHRoaXMuX21heGltaXNlZFN0YWNrLm9mZignYmVmb3JlSXRlbURlc3Ryb3llZCcsIHRoaXMuX21heGltaXNlZFN0YWNrQmVmb3JlRGVzdHJveWVkTGlzdGVuZXIpO1xyXG5cdFx0XHR0aGlzLl9tYXhpbWlzZWRTdGFjayA9IHVuZGVmaW5lZDtcclxuXHRcdH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IGFyb3VuZCBzYW5kYm94ZWQgaWZyYW1lIHJlc3RyaWN0aW9ucy5cclxuICAgICAqIElmICdhbGxvdy10b3AtbmF2aWdhdGlvbicgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgaWZyYW1lJ3MgJ3NhbmRib3gnIGF0dHJpYnV0ZVxyXG4gICAgICogKGFzIGlzIHRoZSBjYXNlIHdpdGggY29kZXBlbnMpIHRoZSBwYXJlbnQgd2luZG93IGlzIGZvcmJpZGRlbiBmcm9tIGNhbGxpbmcgY2VydGFpblxyXG4gICAgICogbWV0aG9kcyBvbiB0aGUgY2hpbGQsIHN1Y2ggYXMgd2luZG93LmNsb3NlKCkgb3Igc2V0dGluZyBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgcHJldmVudGVkIEdvbGRlbkxheW91dCBwb3BvdXRzIGZyb20gcG9wcGluZyBpbiBpbiBjb2RlcGVucy4gVGhlIGZpeCBpcyB0byBjYWxsXHJcbiAgICAgKiBfJGNsb3NlV2luZG93IG9uIHRoZSBjaGlsZCB3aW5kb3cncyBnbCBpbnN0YW5jZSB3aGljaCAoYWZ0ZXIgYSB0aW1lb3V0IHRvIGRpc2Nvbm5lY3RcclxuICAgICAqIHRoZSBpbnZva2luZyBtZXRob2QgZnJvbSB0aGUgY2xvc2UgY2FsbCkgY2xvc2VzIGl0c2VsZi5cclxuICAgICAqXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgY2xvc2VXaW5kb3coKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsVGhpcy5zZXRUaW1lb3V0KCgpID0+IGdsb2JhbFRoaXMuY2xvc2UoKSwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZ2V0QXJlYSh4OiBudW1iZXIsIHk6IG51bWJlcik6IENvbnRlbnRJdGVtLkFyZWEgfCBudWxsIHtcclxuICAgICAgICBsZXQgbWF0Y2hpbmdBcmVhOiBDb250ZW50SXRlbS5BcmVhIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgbGV0IHNtYWxsZXN0U3VyZmFjZSA9IEluZmluaXR5O1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2l0ZW1BcmVhcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBhcmVhID0gdGhpcy5faXRlbUFyZWFzW2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgeCA+PSBhcmVhLngxICYmXHJcbiAgICAgICAgICAgICAgICB4IDwgYXJlYS54MiAmJiAvLyB4MiBpcyBub3QgaW5jbHVkZWQgaW4gYXJlYVxyXG4gICAgICAgICAgICAgICAgeSA+PSBhcmVhLnkxICYmXHJcbiAgICAgICAgICAgICAgICB5IDwgYXJlYS55MiAmJiAvLyB5MiBpcyBub3QgaW5jbHVkZWQgaW4gYXJlYVxyXG4gICAgICAgICAgICAgICAgc21hbGxlc3RTdXJmYWNlID4gYXJlYS5zdXJmYWNlXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgc21hbGxlc3RTdXJmYWNlID0gYXJlYS5zdXJmYWNlO1xyXG4gICAgICAgICAgICAgICAgbWF0Y2hpbmdBcmVhID0gYXJlYTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG1hdGNoaW5nQXJlYTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjYWxjdWxhdGVJdGVtQXJlYXMoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgYWxsQ29udGVudEl0ZW1zID0gdGhpcy5nZXRBbGxDb250ZW50SXRlbXMoKTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0aGUgbGFzdCBpdGVtIGlzIGRyYWdnZWQgb3V0LCBoaWdobGlnaHQgdGhlIGVudGlyZSBjb250YWluZXIgc2l6ZSB0b1xyXG4gICAgICAgICAqIGFsbG93IHRvIHJlLWRyb3AgaXQuIHRoaXMuZ3JvdW5kLmNvbnRlbnRpSXRlbXMubGVuZ3RoID09PSAwIGF0IHRoaXMgcG9pbnRcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIERvbid0IGluY2x1ZGUgZ3JvdW5kIGludG8gdGhlIHBvc3NpYmxlIGRyb3AgYXJlYXMgdGhvdWdoIG90aGVyd2lzZSBzaW5jZSBpdFxyXG4gICAgICAgICAqIHdpbGwgdXNlZCBmb3IgZXZlcnkgZ2FwIGluIHRoZSBsYXlvdXQsIGUuZy4gc3BsaXR0ZXJzXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgZ3JvdW5kSXRlbSA9IHRoaXMuX2dyb3VuZEl0ZW07XHJcbiAgICAgICAgaWYgKGdyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUNJQVI0NDM2NScpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChhbGxDb250ZW50SXRlbXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBObyByb290IENvbnRlbnRJdGVtIChqdXN0IEdyb3VuZCBDb250ZW50SXRlbSlcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VuZEFyZWEgPSBncm91bmRJdGVtLmdldEVsZW1lbnRBcmVhKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdW5kQXJlYSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdMTUNJQVJBNDQzNjUnKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pdGVtQXJlYXMgPSBbZ3JvdW5kQXJlYV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdW5kSXRlbS5jb250ZW50SXRlbXNbMF0uaXNTdGFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHJvb3QgaXMgU3RhY2ssIHRoZW4gc3BsaXQgc3RhY2sgYW5kIHNpZGVzIG9mIExheW91dCBhcmUgc2FtZSwgc28gc2tpcCBzaWRlc1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2l0ZW1BcmVhcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBzaWRlcyBvZiBsYXlvdXRcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pdGVtQXJlYXMgPSBncm91bmRJdGVtLmNyZWF0ZVNpZGVBcmVhcygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsQ29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBhbGxDb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKENvbnRlbnRJdGVtLmlzU3RhY2soc3RhY2spKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZWEgPSBzdGFjay5nZXRBcmVhKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJlYSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pdGVtQXJlYXMucHVzaChhcmVhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrQ29udGVudEFyZWFEaW1lbnNpb25zID0gc3RhY2suY29udGVudEFyZWFEaW1lbnNpb25zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrQ29udGVudEFyZWFEaW1lbnNpb25zID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUNJQVNDNDU1OTknKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlnaGxpZ2h0QXJlYSA9IHN0YWNrQ29udGVudEFyZWFEaW1lbnNpb25zLmhlYWRlci5oaWdobGlnaHRBcmVhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VyZmFjZSA9IChoaWdobGlnaHRBcmVhLngyIC0gaGlnaGxpZ2h0QXJlYS54MSkgKiAoaGlnaGxpZ2h0QXJlYS55MiAtIGhpZ2hsaWdodEFyZWEueTEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXI6IENvbnRlbnRJdGVtLkFyZWEgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxOiBoaWdobGlnaHRBcmVhLngxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MjogaGlnaGxpZ2h0QXJlYS54MixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTE6IGhpZ2hsaWdodEFyZWEueTEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkyOiBoaWdobGlnaHRBcmVhLnkyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50SXRlbTogc3RhY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pdGVtQXJlYXMucHVzaChoZWFkZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGFzIHBhcnQgb2YgbG9hZGluZyBhIG5ldyBsYXlvdXQgKGluY2x1ZGluZyBpbml0aWFsIGluaXQoKSkuXHJcbiAgICAgKiBDaGVja3MgdG8gc2VlIGxheW91dCBoYXMgYSBtYXhpbWlzZWQgaXRlbS4gSWYgc28sIGl0IG1heGltaXNlcyB0aGF0IGl0ZW0uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjaGVja0xvYWRlZExheW91dE1heGltaXNlSXRlbSgpIHtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNQ0xMTUk0MzQzMicpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZ01heGltaXNlZEl0ZW1zID0gdGhpcy5fZ3JvdW5kSXRlbS5nZXRDb25maWdNYXhpbWlzZWRJdGVtcygpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNvbmZpZ01heGltaXNlZEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGxldCBpdGVtID0gY29uZmlnTWF4aW1pc2VkSXRlbXNbMF07XHJcbiAgICAgICAgICAgICAgICBpZiAoQ29udGVudEl0ZW0uaXNDb21wb25lbnRJdGVtKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBpdGVtLnBhcmVudDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2sgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0xNWExMTUk2OTk5OScpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBzdGFjaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIUNvbnRlbnRJdGVtLmlzU3RhY2soaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNQ0xMTUkxOTk5MycpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLm1heGltaXNlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBwcm9jZXNzTWF4aW1pc2VTdGFjayhzdGFjazogU3RhY2spOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9tYXhpbWlzZWRTdGFjayA9IHN0YWNrO1xyXG4gICAgICAgIHN0YWNrLm9uKCdiZWZvcmVJdGVtRGVzdHJveWVkJywgdGhpcy5fbWF4aW1pc2VkU3RhY2tCZWZvcmVEZXN0cm95ZWRMaXN0ZW5lcik7XHJcbiAgICAgICAgc3RhY2suZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuTWF4aW1pc2VkKTtcclxuICAgICAgICBzdGFjay5lbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCB0aGlzLl9tYXhpbWlzZVBsYWNlaG9sZGVyKTtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNTVhJMTk5OTMnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9ncm91bmRJdGVtLmVsZW1lbnQucHJlcGVuZChzdGFjay5lbGVtZW50KTtcclxuICAgICAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBnZXRFbGVtZW50V2lkdGhBbmRIZWlnaHQodGhpcy5fY29udGFpbmVyRWxlbWVudCk7XHJcbiAgICAgICAgICAgIHNldEVsZW1lbnRXaWR0aChzdGFjay5lbGVtZW50LCB3aWR0aCk7XHJcbiAgICAgICAgICAgIHNldEVsZW1lbnRIZWlnaHQoc3RhY2suZWxlbWVudCwgaGVpZ2h0KTtcclxuICAgICAgICAgICAgc3RhY2sudXBkYXRlU2l6ZSh0cnVlKTtcclxuICAgICAgICAgICAgc3RhY2suZm9jdXNBY3RpdmVDb250ZW50SXRlbSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9tYXhpbWlzZWRTdGFjay5lbWl0KCdtYXhpbWlzZWQnKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdzdGF0ZUNoYW5nZWQnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBwcm9jZXNzTWluaW1pc2VNYXhpbWlzZWRTdGFjaygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fbWF4aW1pc2VkU3RhY2sgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNTU1TNzQ0MjInKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFjayA9IHRoaXMuX21heGltaXNlZFN0YWNrO1xyXG4gICAgICAgICAgICBpZiAoc3RhY2sucGFyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignTE1NSTEzNjY4Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzdGFjay5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5NYXhpbWlzZWQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4aW1pc2VQbGFjZWhvbGRlci5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgc3RhY2suZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhpbWlzZVBsYWNlaG9sZGVyLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSb290U2l6ZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21heGltaXNlZFN0YWNrID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgc3RhY2sub2ZmKCdiZWZvcmVJdGVtRGVzdHJveWVkJywgdGhpcy5fbWF4aW1pc2VkU3RhY2tCZWZvcmVEZXN0cm95ZWRMaXN0ZW5lcik7XHJcbiAgICAgICAgICAgICAgICBzdGFjay5lbWl0KCdtaW5pbWlzZWQnKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnc3RhdGVDaGFuZ2VkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdGVyYXRlcyB0aHJvdWdoIHRoZSBhcnJheSBvZiBvcGVuIHBvcG91dCB3aW5kb3dzIGFuZCByZW1vdmVzIHRoZSBvbmVzXHJcbiAgICAgKiB0aGF0IGFyZSBlZmZlY3RpdmVseSBjbG9zZWQuIFRoaXMgaXMgbmVjZXNzYXJ5IGR1ZSB0byB0aGUgbGFjayBvZiByZWxpYWJseVxyXG4gICAgICogbGlzdGVuaW5nIGZvciB3aW5kb3cuY2xvc2UgLyB1bmxvYWQgZXZlbnRzIGluIGEgY3Jvc3MgYnJvd3NlciBjb21wYXRpYmxlIGZhc2hpb24uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZWNvbmNpbGVQb3BvdXRXaW5kb3dzKCkge1xyXG4gICAgICAgIGNvbnN0IG9wZW5Qb3BvdXRzOiBCcm93c2VyUG9wb3V0W10gPSBbXTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9vcGVuUG9wb3V0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fb3BlblBvcG91dHNbaV0uZ2V0V2luZG93KCkuY2xvc2VkID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgb3BlblBvcG91dHMucHVzaCh0aGlzLl9vcGVuUG9wb3V0c1tpXSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3dpbmRvd0Nsb3NlZCcsIHRoaXMuX29wZW5Qb3BvdXRzW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX29wZW5Qb3BvdXRzLmxlbmd0aCAhPT0gb3BlblBvcG91dHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX29wZW5Qb3BvdXRzID0gb3BlblBvcG91dHM7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnc3RhdGVDaGFuZ2VkJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBmbGF0dGVuZWQgYXJyYXkgb2YgYWxsIGNvbnRlbnQgaXRlbXMsXHJcbiAgICAgKiByZWdhcmRsZXMgb2YgbGV2ZWwgb3IgdHlwZVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0QWxsQ29udGVudEl0ZW1zKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1HQUNJMTMxMzAnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ3JvdW5kSXRlbS5nZXRBbGxDb250ZW50SXRlbXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIFN1YndpbmRvd3MgKGlmIHRoZXJlIGFyZSBhbnkpLiBUaHJvd3MgYW4gZXJyb3JcclxuICAgICAqIGlmIHBvcG91dHMgYXJlIGJsb2NrZWQuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdWJXaW5kb3dzKCkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sYXlvdXRDb25maWcub3BlblBvcG91dHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcG9wb3V0Q29uZmlnID0gdGhpcy5sYXlvdXRDb25maWcub3BlblBvcG91dHNbaV07XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlUG9wb3V0RnJvbVBvcG91dExheW91dENvbmZpZyhwb3BvdXRDb25maWcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlYm91bmNlcyByZXNpemUgZXZlbnRzXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVDb250YWluZXJSZXNpemUoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMucmVzaXplV2l0aENvbnRhaW5lckF1dG9tYXRpY2FsbHkpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmVzaXplV2l0aERlYm91bmNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVib3VuY2VzIHJlc2l6ZSBldmVudHNcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHByb2Nlc3NSZXNpemVXaXRoRGVib3VuY2UoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMucmVzaXplRGVib3VuY2VFeHRlbmRlZFdoZW5Qb3NzaWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrQ2xlYXJSZXNpemVUaW1lb3V0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fcmVzaXplVGltZW91dElkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVzaXplVGltZW91dElkID0gc2V0VGltZW91dChcclxuICAgICAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXNpemVUaW1lb3V0SWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpblNpemVJbnZhbGlkYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZFNpemVJbnZhbGlkYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZURlYm91bmNlSW50ZXJ2YWwsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2hlY2tDbGVhclJlc2l6ZVRpbWVvdXQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3Jlc2l6ZVRpbWVvdXRJZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9yZXNpemVUaW1lb3V0SWQpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXNpemVUaW1lb3V0SWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGV0ZXJtaW5lcyB3aGF0IGVsZW1lbnQgdGhlIGxheW91dCB3aWxsIGJlIGNyZWF0ZWQgaW5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNldENvbnRhaW5lcigpIHtcclxuICAgICAgICBjb25zdCBib2R5RWxlbWVudCA9IGRvY3VtZW50LmJvZHk7XHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IHRoaXMuX2NvbnRhaW5lckVsZW1lbnQgPz8gYm9keUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChjb250YWluZXJFbGVtZW50ID09PSBib2R5RWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVdpdGhDb250YWluZXJBdXRvbWF0aWNhbGx5ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcclxuICAgICAgICAgICAgZG9jdW1lbnRFbGVtZW50LnN0eWxlLmhlaWdodCA9ICcxMDAlJztcclxuICAgICAgICAgICAgZG9jdW1lbnRFbGVtZW50LnN0eWxlLm1hcmdpbiA9ICcwJztcclxuICAgICAgICAgICAgZG9jdW1lbnRFbGVtZW50LnN0eWxlLnBhZGRpbmcgPSAnMCc7XHJcbiAgICAgICAgICAgIGRvY3VtZW50RWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xyXG4gICAgICAgICAgICBib2R5RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XHJcbiAgICAgICAgICAgIGJvZHlFbGVtZW50LnN0eWxlLm1hcmdpbiA9ICcwJztcclxuICAgICAgICAgICAgYm9keUVsZW1lbnQuc3R5bGUucGFkZGluZyA9ICcwJztcclxuICAgICAgICAgICAgYm9keUVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXJFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIHdoZW4gdGhlIHdpbmRvdyBpcyBjbG9zZWQgb3IgdGhlIHVzZXIgbmF2aWdhdGVzIGF3YXlcclxuICAgICAqIGZyb20gdGhlIHBhZ2VcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICogQGRlcHJlY2F0ZWQgdG8gYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uIDNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvbkJlZm9yZVVubG9hZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkanVzdHMgdGhlIG51bWJlciBvZiBjb2x1bW5zIHRvIGJlIGxvd2VyIHRvIGZpdCB0aGUgc2NyZWVuIGFuZCBzdGlsbCBtYWludGFpbiBtaW5JdGVtV2lkdGguXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhZGp1c3RDb2x1bW5zUmVzcG9uc2l2ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNQUNSMjA4ODMnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9maXJzdExvYWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gbWluIHdpZHRoIHNldCwgb3Igbm90IGNvbnRlbnQgaXRlbXMsIGRvIG5vdGhpbmcuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnVzZVJlc3BvbnNpdmVMYXlvdXQoKSAmJlxyXG4gICAgICAgICAgICAgICAgIXRoaXMuX3VwZGF0aW5nQ29sdW1uc1Jlc3BvbnNpdmUgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0uY29udGVudEl0ZW1zLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0uY29udGVudEl0ZW1zWzBdLmlzUm93KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX3dpZHRoID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1BQ1I3NzQxMicpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSBjb2x1bW4sIGRvIG5vdGhpbmcuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sdW1uQ291bnQgPSB0aGlzLl9ncm91bmRJdGVtLmNvbnRlbnRJdGVtc1swXS5jb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW5Db3VudCA8PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGV5IGFsbCBzdGlsbCBmaXQsIGRvIG5vdGhpbmcuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pbkl0ZW1XaWR0aCA9IHRoaXMubGF5b3V0Q29uZmlnLmRpbWVuc2lvbnMuZGVmYXVsdE1pbkl0ZW1XaWR0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG90YWxNaW5XaWR0aCA9IGNvbHVtbkNvdW50ICogbWluSXRlbVdpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG90YWxNaW5XaWR0aCA8PSB0aGlzLl93aWR0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudCB1cGRhdGVzIHdoaWxlIGl0IGlzIGFscmVhZHkgaGFwcGVuaW5nLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdDb2x1bW5zUmVzcG9uc2l2ZSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlndXJlIG91dCBob3cgbWFueSBjb2x1bW5zIHRvIHN0YWNrLCBhbmQgcHV0IHRoZW0gYWxsIGluIHRoZSBmaXJzdCBzdGFjayBjb250YWluZXIuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5hbENvbHVtbkNvdW50ID0gTWF0aC5tYXgoTWF0aC5mbG9vcih0aGlzLl93aWR0aCAvIG1pbkl0ZW1XaWR0aCksIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2tDb2x1bW5Db3VudCA9IGNvbHVtbkNvdW50IC0gZmluYWxDb2x1bW5Db3VudDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb290Q29udGVudEl0ZW0gPSB0aGlzLl9ncm91bmRJdGVtLmNvbnRlbnRJdGVtc1swXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbFN0YWNrcyA9IHRoaXMuZ2V0QWxsU3RhY2tzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsU3RhY2tzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignTE1BQ1JTNzc0MTMnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFN0YWNrQ29udGFpbmVyID0gYWxsU3RhY2tzWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhY2tDb2x1bW5Db3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YWNrIGZyb20gcmlnaHQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHJvb3RDb250ZW50SXRlbS5jb250ZW50SXRlbXNbcm9vdENvbnRlbnRJdGVtLmNvbnRlbnRJdGVtcy5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDaGlsZENvbnRlbnRJdGVtc1RvQ29udGFpbmVyKGZpcnN0U3RhY2tDb250YWluZXIsIGNvbHVtbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ0NvbHVtbnNSZXNwb25zaXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHJlc3BvbnNpdmUgbGF5b3V0IHNob3VsZCBiZSB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIFRydWUgaWYgcmVzcG9uc2l2ZSBsYXlvdXQgc2hvdWxkIGJlIHVzZWQ7IG90aGVyd2lzZSBmYWxzZS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHVzZVJlc3BvbnNpdmVMYXlvdXQoKSB7XHJcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLmxheW91dENvbmZpZy5zZXR0aW5ncztcclxuICAgICAgICBjb25zdCBhbHdheXNSZXNwb25zaXZlTW9kZSA9IHNldHRpbmdzLnJlc3BvbnNpdmVNb2RlID09PSBSZXNwb25zaXZlTW9kZS5hbHdheXM7XHJcbiAgICAgICAgY29uc3Qgb25Mb2FkUmVzcG9uc2l2ZU1vZGVBbmRGaXJzdCA9IHNldHRpbmdzLnJlc3BvbnNpdmVNb2RlID09PSBSZXNwb25zaXZlTW9kZS5vbmxvYWQgJiYgdGhpcy5fZmlyc3RMb2FkO1xyXG4gICAgICAgIHJldHVybiBhbHdheXNSZXNwb25zaXZlTW9kZSB8fCBvbkxvYWRSZXNwb25zaXZlTW9kZUFuZEZpcnN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhbGwgY2hpbGRyZW4gb2YgYSBub2RlIHRvIGFub3RoZXIgY29udGFpbmVyIHJlY3Vyc2l2ZWx5LlxyXG4gICAgICogQHBhcmFtIGNvbnRhaW5lciAtIENvbnRhaW5lciB0byBhZGQgY2hpbGQgY29udGVudCBpdGVtcyB0by5cclxuICAgICAqIEBwYXJhbSBub2RlIC0gTm9kZSB0byBzZWFyY2ggZm9yIGNvbnRlbnQgaXRlbXMuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhZGRDaGlsZENvbnRlbnRJdGVtc1RvQ29udGFpbmVyKGNvbnRhaW5lcjogQ29udGVudEl0ZW0sIG5vZGU6IENvbnRlbnRJdGVtKSB7XHJcbiAgICAgICAgY29uc3QgY29udGVudEl0ZW1zID0gbm9kZS5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBTdGFjaykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlQ2hpbGQoaXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIuYWRkQ2hpbGQoaXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGRDb250ZW50SXRlbXNUb0NvbnRhaW5lcihjb250YWluZXIsIGl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZHMgYWxsIHRoZSBzdGFja3MuXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgZm91bmQgc3RhY2sgY29udGFpbmVycy5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldEFsbFN0YWNrcygpIHtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNRkFTQzUyNzc4Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhY2tzOiBTdGFja1tdID0gW107XHJcbiAgICAgICAgICAgIHRoaXMuZmluZEFsbFN0YWNrc1JlY3Vyc2l2ZShzdGFja3MsIHRoaXMuX2dyb3VuZEl0ZW0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHN0YWNrcztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBmaW5kRmlyc3RDb250ZW50SXRlbVR5cGUodHlwZTogSXRlbVR5cGUpOiBDb250ZW50SXRlbSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUZGQ0lUODI0NDYnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kRmlyc3RDb250ZW50SXRlbVR5cGVSZWN1cnNpdmUodHlwZSwgdGhpcy5fZ3JvdW5kSXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlUmVjdXJzaXZlKHR5cGU6IEl0ZW1UeXBlLCBub2RlOiBDb250ZW50SXRlbSk6IENvbnRlbnRJdGVtIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbXMgPSBub2RlLmNvbnRlbnRJdGVtcztcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbUNvdW50ID0gY29udGVudEl0ZW1zLmxlbmd0aDtcclxuICAgICAgICBpZiAoY29udGVudEl0ZW1Db3VudCA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudEl0ZW1Db3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IGNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChjb250ZW50SXRlbS50eXBlID09PSB0eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRJdGVtO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSBjb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZENvbnRlbnRJdGVtID0gdGhpcy5maW5kRmlyc3RDb250ZW50SXRlbVR5cGVSZWN1cnNpdmUodHlwZSwgY29udGVudEl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kQ29udGVudEl0ZW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZENvbnRlbnRJdGVtO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGZpbmRGaXJzdENvbnRlbnRJdGVtVHlwZUJ5SWRSZWN1cnNpdmUodHlwZTogSXRlbVR5cGUsIGlkOiBzdHJpbmcsIG5vZGU6IENvbnRlbnRJdGVtKTogQ29udGVudEl0ZW0gfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtcyA9IG5vZGUuY29udGVudEl0ZW1zO1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtQ291bnQgPSBjb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIGlmIChjb250ZW50SXRlbUNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50SXRlbUNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRJdGVtLnR5cGUgPT09IHR5cGUgJiYgY29udGVudEl0ZW0uaWQgPT09IGlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRJdGVtO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSBjb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZENvbnRlbnRJdGVtID0gdGhpcy5maW5kRmlyc3RDb250ZW50SXRlbVR5cGVCeUlkUmVjdXJzaXZlKHR5cGUsIGlkLCBjb250ZW50SXRlbSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZm91bmRDb250ZW50SXRlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kQ29udGVudEl0ZW07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZHMgYWxsIHRoZSBzdGFjayBjb250YWluZXJzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBzdGFja3MgLSBTZXQgb2YgY29udGFpbmVycyB0byBwb3B1bGF0ZS5cclxuICAgICAqIEBwYXJhbSBub2RlIC0gQ3VycmVudCBub2RlIHRvIHByb2Nlc3MuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBmaW5kQWxsU3RhY2tzUmVjdXJzaXZlKHN0YWNrczogU3RhY2tbXSwgbm9kZTogQ29udGVudEl0ZW0pIHtcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbXMgPSBub2RlLmNvbnRlbnRJdGVtcztcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFN0YWNrKSB7XHJcbiAgICAgICAgICAgICAgICBzdGFja3MucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICghaXRlbS5pc0NvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZEFsbFN0YWNrc1JlY3Vyc2l2ZShzdGFja3MsIGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZmluZEZpcnN0TG9jYXRpb24oc2VsZWN0b3JzOiByZWFkb25seSBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uU2VsZWN0b3JbXSk6IExheW91dE1hbmFnZXIuTG9jYXRpb24gfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGNvbnN0IGNvdW50ID0gc2VsZWN0b3JzLmxlbmd0aDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzZWxlY3RvcnNbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5maW5kTG9jYXRpb24oc2VsZWN0b3IpO1xyXG4gICAgICAgICAgICBpZiAobG9jYXRpb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBmaW5kTG9jYXRpb24oc2VsZWN0b3I6IExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3Rvcik6IExheW91dE1hbmFnZXIuTG9jYXRpb24gfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdG9ySW5kZXggPSBzZWxlY3Rvci5pbmRleDtcclxuICAgICAgICBzd2l0Y2ggKHNlbGVjdG9yLnR5cGVJZCkge1xyXG4gICAgICAgICAgICBjYXNlIExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRm9jdXNlZEl0ZW06IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9mb2N1c2VkQ29tcG9uZW50SXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJdGVtID0gdGhpcy5fZm9jdXNlZENvbXBvbmVudEl0ZW0ucGFyZW50SXRlbTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRDb250ZW50SXRlbXMgPSBwYXJlbnRJdGVtLmNvbnRlbnRJdGVtcztcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRDb250ZW50SXRlbUNvdW50ID0gcGFyZW50Q29udGVudEl0ZW1zLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JJbmRleCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHBhcmVudEl0ZW0sIGluZGV4OiBwYXJlbnRDb250ZW50SXRlbUNvdW50IH07XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9jdXNlZEluZGV4ID0gcGFyZW50Q29udGVudEl0ZW1zLmluZGV4T2YodGhpcy5fZm9jdXNlZENvbXBvbmVudEl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGZvY3VzZWRJbmRleCArIHNlbGVjdG9ySW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBwYXJlbnRDb250ZW50SXRlbUNvdW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcGFyZW50SXRlbSwgaW5kZXggfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRm9jdXNlZFN0YWNrOiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZm9jdXNlZENvbXBvbmVudEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SXRlbSA9IHRoaXMuX2ZvY3VzZWRDb21wb25lbnRJdGVtLnBhcmVudEl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJ5Q3JlYXRlTG9jYXRpb25Gcm9tUGFyZW50SXRlbShwYXJlbnRJdGVtLCBzZWxlY3RvckluZGV4KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRmlyc3RTdGFjazoge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SXRlbSA9IHRoaXMuZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlKEl0ZW1UeXBlLnN0YWNrKTtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cnlDcmVhdGVMb2NhdGlvbkZyb21QYXJlbnRJdGVtKHBhcmVudEl0ZW0sIHNlbGVjdG9ySW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgTGF5b3V0TWFuYWdlci5Mb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5GaXJzdFJvd09yQ29sdW1uOiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50SXRlbSA9IHRoaXMuZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlKEl0ZW1UeXBlLnJvdyk7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50SXRlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJ5Q3JlYXRlTG9jYXRpb25Gcm9tUGFyZW50SXRlbShwYXJlbnRJdGVtLCBzZWxlY3RvckluZGV4KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50SXRlbSA9IHRoaXMuZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlKEl0ZW1UeXBlLmNvbHVtbik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudEl0ZW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cnlDcmVhdGVMb2NhdGlvbkZyb21QYXJlbnRJdGVtKHBhcmVudEl0ZW0sIHNlbGVjdG9ySW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgTGF5b3V0TWFuYWdlci5Mb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5GaXJzdFJvdzoge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SXRlbSA9IHRoaXMuZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlKEl0ZW1UeXBlLnJvdyk7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50SXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJ5Q3JlYXRlTG9jYXRpb25Gcm9tUGFyZW50SXRlbShwYXJlbnRJdGVtLCBzZWxlY3RvckluZGV4KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRmlyc3RDb2x1bW46IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEl0ZW0gPSB0aGlzLmZpbmRGaXJzdENvbnRlbnRJdGVtVHlwZShJdGVtVHlwZS5jb2x1bW4pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyeUNyZWF0ZUxvY2F0aW9uRnJvbVBhcmVudEl0ZW0ocGFyZW50SXRlbSwgc2VsZWN0b3JJbmRleCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLkVtcHR5OiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1GTFJJRjE4MjQ0Jyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvb3RJdGVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JJbmRleCA9PT0gdW5kZWZpbmVkIHx8IHNlbGVjdG9ySW5kZXggPT09IDApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBwYXJlbnRJdGVtOiB0aGlzLl9ncm91bmRJdGVtLCBpbmRleDogMCB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLlJvb3Q6IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUZMRjE4MjQ0Jyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VuZENvbnRlbnRJdGVtcyA9IHRoaXMuX2dyb3VuZEl0ZW0uY29udGVudEl0ZW1zO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChncm91bmRDb250ZW50SXRlbXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RvckluZGV4ID09PSB1bmRlZmluZWQgfHwgc2VsZWN0b3JJbmRleCA9PT0gMClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHBhcmVudEl0ZW06IHRoaXMuX2dyb3VuZEl0ZW0sIGluZGV4OiAwIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEl0ZW0gPSBncm91bmRDb250ZW50SXRlbXNbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyeUNyZWF0ZUxvY2F0aW9uRnJvbVBhcmVudEl0ZW0ocGFyZW50SXRlbSwgc2VsZWN0b3JJbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgdHJ5Q3JlYXRlTG9jYXRpb25Gcm9tUGFyZW50SXRlbShwYXJlbnRJdGVtOiBDb250ZW50SXRlbSxcclxuICAgICAgICBzZWxlY3RvckluZGV4OiBudW1iZXIgfCB1bmRlZmluZWRcclxuICAgICk6IExheW91dE1hbmFnZXIuTG9jYXRpb24gfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudENvbnRlbnRJdGVtcyA9IHBhcmVudEl0ZW0uY29udGVudEl0ZW1zO1xyXG4gICAgICAgIGNvbnN0IHBhcmVudENvbnRlbnRJdGVtQ291bnQgPSBwYXJlbnRDb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIGlmIChzZWxlY3RvckluZGV4ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgcGFyZW50SXRlbSwgaW5kZXg6IHBhcmVudENvbnRlbnRJdGVtQ291bnQgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0b3JJbmRleCA8IDAgfHwgc2VsZWN0b3JJbmRleCA+IHBhcmVudENvbnRlbnRJdGVtQ291bnQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBwYXJlbnRJdGVtLCBpbmRleDogc2VsZWN0b3JJbmRleCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIExheW91dE1hbmFnZXIge1xyXG4gICAgZXhwb3J0IHR5cGUgQmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudCA9ICh0aGlzOiB2b2lkLCBjb3VudDogbnVtYmVyKSA9PiB2b2lkO1xyXG4gICAgZXhwb3J0IHR5cGUgQWZ0ZXJWaXJ0dWFsUmVjdGluZ0V2ZW50ID0gKHRoaXM6IHZvaWQpID0+IHZvaWQ7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGludGVyZmFjZSBDb25zdHJ1Y3RvclBhcmFtZXRlcnMge1xyXG4gICAgICAgIGNvbnN0cnVjdG9yT3JTdWJXaW5kb3dMYXlvdXRDb25maWc6IExheW91dENvbmZpZyB8IHVuZGVmaW5lZDtcclxuICAgICAgICBpc1N1YldpbmRvdzogYm9vbGVhbjtcclxuICAgICAgICBjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlTWF4aW1pc2VQbGFjZUVsZW1lbnQoZG9jdW1lbnQ6IERvY3VtZW50KTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5NYXhpbWlzZVBsYWNlKTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlVGFiRHJvcFBsYWNlaG9sZGVyRWxlbWVudChkb2N1bWVudDogRG9jdW1lbnQpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkRyb3BUYWJQbGFjZWhvbGRlcik7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTcGVjaWZpZXMgYSBsb2NhdGlvbiBvZiBhIENvbnRlbnRJdGVtIHdpdGhvdXQgcmVmZXJlbmNpbmcgdGhlIGNvbnRlbnQgaXRlbS5cclxuICAgICAqIFVzZWQgdG8gc3BlY2lmeSB3aGVyZSBhIG5ldyBpdGVtIGlzIHRvIGJlIGFkZGVkXHJcbiAgICAgKiBAcHVibGljXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgTG9jYXRpb24ge1xyXG4gICAgICAgIHBhcmVudEl0ZW06IENvbnRlbnRJdGVtO1xyXG4gICAgICAgIGluZGV4OiBudW1iZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHNlbGVjdG9yIHVzZWQgdG8gc3BlY2lmeSBhIHVuaXF1ZSBsb2NhdGlvbiBpbiB0aGUgbGF5b3V0XHJcbiAgICAgKiBAcHVibGljXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgTG9jYXRpb25TZWxlY3RvciB7XHJcbiAgICAgICAgLyoqIFNwZWNpZmllcyBzZWxlY3RvciBhbGdvcml0aG0gKi9cclxuICAgICAgICB0eXBlSWQ6IExvY2F0aW9uU2VsZWN0b3IuVHlwZUlkO1xyXG4gICAgICAgIC8qKiBVc2VkIGJ5IGFsZ29yaXRobSB0byBkZXRlcm1pbmUgaW5kZXggaW4gZm91bmQgQ29udGVudEl0ZW0gKi9cclxuICAgICAgICBpbmRleD86IG51bWJlcjtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHB1YmxpYyAqL1xyXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBMb2NhdGlvblNlbGVjdG9yIHtcclxuICAgICAgICBleHBvcnQgY29uc3QgZW51bSBUeXBlSWQge1xyXG4gICAgICAgICAgICAvKiogU3RhY2sgd2l0aCBmb2N1c2VkIEl0ZW0uIEluZGV4IHNwZWNpZmllcyBvZmZzZXQgZnJvbSBpbmRleCBvZiBmb2N1c2VkIGl0ZW0gKGVnIDEgaXMgdGhlIHBvc2l0aW9uIGFmdGVyIGZvY3VzZWQgaXRlbSkgKi9cclxuICAgICAgICAgICAgRm9jdXNlZEl0ZW0sXHJcbiAgICAgICAgICAgIC8qKiBTdGFjayB3aXRoIGZvY3VzZWQgSXRlbS4gSW5kZXggc3BlY2ZpZXMgQ29udGVudEl0ZW1zIGluZGV4ICovXHJcbiAgICAgICAgICAgIEZvY3VzZWRTdGFjayxcclxuICAgICAgICAgICAgLyoqIEZpcnN0IHN0YWNrIGZvdW5kIGluIGxheW91dCAqL1xyXG4gICAgICAgICAgICBGaXJzdFN0YWNrLFxyXG4gICAgICAgICAgICAvKiogRmlyc3QgUm93IG9yIENvbHVtbiBmb3VuZCBpbiBsYXlvdXQgKHJvd3MgYXJlIHNlYXJjaGVkIGZpcnN0KSAqL1xyXG4gICAgICAgICAgICBGaXJzdFJvd09yQ29sdW1uLFxyXG4gICAgICAgICAgICAvKiogRmlyc3QgUm93IGluIGxheW91dCAqL1xyXG4gICAgICAgICAgICBGaXJzdFJvdyxcclxuICAgICAgICAgICAgLyoqIEZpcnN0IENvbHVtbiBpbiBsYXlvdXQgKi9cclxuICAgICAgICAgICAgRmlyc3RDb2x1bW4sXHJcbiAgICAgICAgICAgIC8qKiBGaW5kcyBhIGxvY2F0aW9uIGlmIGxheW91dCBpcyBlbXB0eS4gVGhlIGZvdW5kIGxvY2F0aW9uIHdpbGwgYmUgdGhlIHJvb3QgQ29udGVudEl0ZW0uICovXHJcbiAgICAgICAgICAgIEVtcHR5LFxyXG4gICAgICAgICAgICAvKiogRmluZHMgcm9vdCBpZiBsYXlvdXQgaXMgZW1wdHksIG90aGVyd2lzZSBhIGNoaWxkIHVuZGVyIHJvb3QgKi9cclxuICAgICAgICAgICAgUm9vdCxcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZhdWx0IExvY2F0aW9uU2VsZWN0b3JzIGFycmF5IHVzZWQgaWYgbm9uZSBpcyBzcGVjaWZpZWQuICBXaWxsIGFsd2F5cyBmaW5kIGEgbG9jYXRpb24uXHJcbiAgICAgKiBAcHVibGljXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBjb25zdCBkZWZhdWx0TG9jYXRpb25TZWxlY3RvcnM6IHJlYWRvbmx5IExvY2F0aW9uU2VsZWN0b3JbXSA9IFtcclxuICAgICAgICB7IHR5cGVJZDogTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRm9jdXNlZFN0YWNrLCBpbmRleDogdW5kZWZpbmVkIH0sXHJcbiAgICAgICAgeyB0eXBlSWQ6IExvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLkZpcnN0U3RhY2ssIGluZGV4OiB1bmRlZmluZWQgfSxcclxuICAgICAgICB7IHR5cGVJZDogTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRmlyc3RSb3dPckNvbHVtbiwgaW5kZXg6IHVuZGVmaW5lZCB9LFxyXG4gICAgICAgIHsgdHlwZUlkOiBMb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5Sb290LCBpbmRleDogdW5kZWZpbmVkIH0sXHJcbiAgICBdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9jYXRpb25TZWxlY3RvcnMgdG8gdHJ5IHRvIGdldCBsb2NhdGlvbiBuZXh0IHRvIGV4aXN0aW5nIGZvY3VzZWQgaXRlbVxyXG4gICAgICogQHB1YmxpY1xyXG4gICAgICovXHJcbiAgICBleHBvcnQgY29uc3QgYWZ0ZXJGb2N1c2VkSXRlbUlmUG9zc2libGVMb2NhdGlvblNlbGVjdG9yczogcmVhZG9ubHkgTG9jYXRpb25TZWxlY3RvcltdID0gW1xyXG4gICAgICAgIHsgdHlwZUlkOiBMb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5Gb2N1c2VkSXRlbSwgaW5kZXg6IDEgfSxcclxuICAgICAgICB7IHR5cGVJZDogTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRmlyc3RTdGFjaywgaW5kZXg6IHVuZGVmaW5lZCB9LFxyXG4gICAgICAgIHsgdHlwZUlkOiBMb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5GaXJzdFJvd09yQ29sdW1uLCBpbmRleDogdW5kZWZpbmVkIH0sXHJcbiAgICAgICAgeyB0eXBlSWQ6IExvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLlJvb3QsIGluZGV4OiB1bmRlZmluZWQgfSxcclxuICAgIF07XHJcbn1cclxuIiwiLyoqXHJcbiAqIE1pbmlmaWVzIGFuZCB1bm1pbmlmaWVzIGNvbmZpZ3MgYnkgcmVwbGFjaW5nIGZyZXF1ZW50IGtleXNcclxuICogYW5kIHZhbHVlcyB3aXRoIG9uZSBsZXR0ZXIgc3Vic3RpdHV0ZXMuIENvbmZpZyBvcHRpb25zIG11c3RcclxuICogcmV0YWluIGFycmF5IHBvc2l0aW9uL2luZGV4LCBhZGQgbmV3IG9wdGlvbnMgYXQgdGhlIGVuZC5cclxuICogQGludGVybmFsXHJcbiovXHJcblxyXG5leHBvcnQgbmFtZXNwYWNlIENvbmZpZ01pbmlmaWVyIHtcclxuXHJcbiAgICBleHBvcnQgdHlwZSBZWSA9ICdpZCcgfCAndGl0bGUnO1xyXG4gICAgZXhwb3J0IGNvbnN0IGVudW0gWFgge1xyXG4gICAgICAgIGlkID0gJ2lkJ1xyXG4gICAgfVxyXG4gICAgY29uc3Qga2V5czogcmVhZG9ubHkgc3RyaW5nW10gPSBbXHJcbiAgICAgICAgJ3NldHRpbmdzJyxcclxuICAgICAgICAnaGFzSGVhZGVycycsXHJcbiAgICAgICAgJ2RyYWdCZXR3ZWVuV2luZG93cycsXHJcbiAgICAgICAgJ2RyYWdUb05ld1dpbmRvdycsXHJcbiAgICAgICAgJ3NlbGVjdGlvbkVuYWJsZWQnLFxyXG4gICAgICAgICdkaW1lbnNpb25zJyxcclxuICAgICAgICAnYm9yZGVyV2lkdGgnLFxyXG4gICAgICAgICdtaW5JdGVtSGVpZ2h0JyxcclxuICAgICAgICAnbWluSXRlbVdpZHRoJyxcclxuICAgICAgICAnaGVhZGVySGVpZ2h0JyxcclxuICAgICAgICAnZHJhZ1Byb3h5V2lkdGgnLFxyXG4gICAgICAgICdkcmFnUHJveHlIZWlnaHQnLFxyXG4gICAgICAgICdsYWJlbHMnLFxyXG4gICAgICAgICdjbG9zZScsXHJcbiAgICAgICAgJ21heGltaXNlJyxcclxuICAgICAgICAnbWluaW1pc2UnLFxyXG4gICAgICAgICdwb3BvdXQnLFxyXG4gICAgICAgICdjb250ZW50JyxcclxuICAgICAgICAnY29tcG9uZW50VHlwZScsXHJcbiAgICAgICAgJ2NvbXBvbmVudFN0YXRlJyxcclxuICAgICAgICAnaWQnLFxyXG4gICAgICAgICd3aWR0aCcsXHJcbiAgICAgICAgJ3R5cGUnLFxyXG4gICAgICAgICdoZWlnaHQnLFxyXG4gICAgICAgICdpc0Nsb3NhYmxlJyxcclxuICAgICAgICAndGl0bGUnLFxyXG4gICAgICAgICdwb3BvdXRXaG9sZVN0YWNrJyxcclxuICAgICAgICAnb3BlblBvcG91dHMnLFxyXG4gICAgICAgICdwYXJlbnRJZCcsXHJcbiAgICAgICAgJ2FjdGl2ZUl0ZW1JbmRleCcsXHJcbiAgICAgICAgJ3Jlb3JkZXJFbmFibGVkJyxcclxuICAgICAgICAnYm9yZGVyR3JhYldpZHRoJyxcclxuXHJcblxyXG5cclxuICAgICAgICAvL01heGltdW0gMzYgZW50cmllcywgZG8gbm90IGNyb3NzIHRoaXMgbGluZSFcclxuICAgIF07XHJcblxyXG4gICAgY29uc3QgdmFsdWVzOiByZWFkb25seSAoYm9vbGVhbiB8IHN0cmluZylbXSA9IFtcclxuICAgICAgICB0cnVlLFxyXG4gICAgICAgIGZhbHNlLFxyXG4gICAgICAgICdyb3cnLFxyXG4gICAgICAgICdjb2x1bW4nLFxyXG4gICAgICAgICdzdGFjaycsXHJcbiAgICAgICAgJ2NvbXBvbmVudCcsXHJcbiAgICAgICAgJ2Nsb3NlJyxcclxuICAgICAgICAnbWF4aW1pc2UnLFxyXG4gICAgICAgICdtaW5pbWlzZScsXHJcbiAgICAgICAgJ29wZW4gaW4gbmV3IHdpbmRvdydcclxuICAgIF07XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSW5pdGlhbGlzZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoa2V5cy5sZW5ndGggPiAzNikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RvbyBtYW55IGtleXMgaW4gY29uZmlnIG1pbmlmaWVyIG1hcCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlT2JqZWN0KGZyb206IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBtaW5pZnk6IGJvb2xlYW4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XHJcbiAgICAgICAgY29uc3QgdG86IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZnJvbSkge1xyXG4gICAgICAgICAgICBpZiAoZnJvbS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IC8vIEluIGNhc2Ugc29tZXRoaW5nIGhhcyBleHRlbmRlZCBPYmplY3QgcHJvdG90eXBlc1xyXG4gICAgICAgICAgICAgICAgbGV0IHRyYW5zbGF0ZWRLZXk6IHN0cmluZztcclxuICAgICAgICAgICAgICAgIGlmIChtaW5pZnkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVkS2V5ID0gbWluaWZ5S2V5KGtleSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZWRLZXkgPSB1bm1pbmlmeUtleShrZXkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGZyb21WYWx1ZSA9IGZyb21ba2V5XTtcclxuICAgICAgICAgICAgICAgIHRvW3RyYW5zbGF0ZWRLZXldID0gdHJhbnNsYXRlVmFsdWUoZnJvbVZhbHVlLCBtaW5pZnkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdG87XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlQXJyYXkoZnJvbTogdW5rbm93bltdLCBtaW5pZnk6IGJvb2xlYW4pIHtcclxuICAgICAgICBjb25zdCBsZW5ndGggPSBmcm9tLmxlbmd0aDtcclxuICAgICAgICBjb25zdCB0byA9IG5ldyBBcnJheTx1bmtub3duPihsZW5ndGgpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgLy8gSW4gb3JpZ2luYWwgY29kZSwgYXJyYXkgaW5kaWNlcyB3ZXJlIG51bWJlcnMgYW5kIG5vdCB0cmFuc2xhdGVkXHJcbiAgICAgICAgICAgIGNvbnN0IGZyb21WYWx1ZSA9IGZyb21baV07XHJcbiAgICAgICAgICAgIHRvW2ldID0gdHJhbnNsYXRlVmFsdWUoZnJvbVZhbHVlLCBtaW5pZnkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdG87XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlVmFsdWUoZnJvbTogdW5rbm93biwgbWluaWZ5OiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICBpZiAoZnJvbSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmcm9tKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVBcnJheShmcm9tLCBtaW5pZnkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlT2JqZWN0KGZyb20gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG1pbmlmeSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAobWluaWZ5KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbWluaWZ5VmFsdWUoZnJvbSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5taW5pZnlWYWx1ZShmcm9tKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBtaW5pZnlLZXkodmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIGEgdmFsdWUgYWN0dWFsbHkgaXMgYSBzaW5nbGUgY2hhcmFjdGVyLCBwcmVmaXggaXRcclxuICAgICAgICAgKiB3aXRoIF9fXyB0byBhdm9pZCBtaXN0YWtpbmcgaXQgZm9yIGEgbWluaWZpY2F0aW9uIGNvZGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdfX18nICsgdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBpbmRleE9mS2V5KHZhbHVlKTtcclxuICAgIFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIHZhbHVlIG5vdCBmb3VuZCBpbiB0aGUgZGljdGlvbmFyeSwgcmV0dXJuIGl0IHVubW9kaWZpZWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIFxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogdmFsdWUgZm91bmQgaW4gZGljdGlvbmFyeSwgcmV0dXJuIGl0cyBiYXNlMzYgY291bnRlcnBhcnRcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGluZGV4LnRvU3RyaW5nKDM2KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdW5taW5pZnlLZXkoa2V5OiBzdHJpbmcpIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiB2YWx1ZSBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIuIEFzc3VtZSB0aGF0IGl0J3MgYSB0cmFuc2xhdGlvblxyXG4gICAgICAgICAqIGFuZCByZXR1cm4gdGhlIG9yaWdpbmFsIHZhbHVlIGZyb20gdGhlIGRpY3Rpb25hcnlcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICByZXR1cm4ga2V5c1twYXJzZUludChrZXksIDM2KV07XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogdmFsdWUgb3JpZ2luYWxseSB3YXMgYSBzaW5nbGUgY2hhcmFjdGVyIGFuZCB3YXMgcHJlZml4ZWQgd2l0aCBfX19cclxuICAgICAgICAgKiB0byBhdm9pZCBtaXN0YWtpbmcgaXQgZm9yIGEgdHJhbnNsYXRpb24uIFJlbW92ZSB0aGUgcHJlZml4XHJcbiAgICAgICAgICogYW5kIHJldHVybiB0aGUgb3JpZ2luYWwgY2hhcmFjdGVyXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKGtleS5zdWJzdHIoMCwgMykgPT09ICdfX18nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBrZXlbM107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIHZhbHVlIHdhcyBub3QgbWluaWZpZWRcclxuICAgICAgICAgKi9cclxuICAgICAgICByZXR1cm4ga2V5O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG1pbmlmeVZhbHVlKHZhbHVlOiB1bmtub3duKSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgYSB2YWx1ZSBhY3R1YWxseSBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIsIHByZWZpeCBpdFxyXG4gICAgICAgICAqIHdpdGggX19fIHRvIGF2b2lkIG1pc3Rha2luZyBpdCBmb3IgYSBtaW5pZmljYXRpb24gY29kZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ19fXycgKyB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICBjb25zdCBpbmRleCA9IGluZGV4T2ZWYWx1ZSh2YWx1ZSk7XHJcbiAgICBcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiB2YWx1ZSBub3QgZm91bmQgaW4gdGhlIGRpY3Rpb25hcnksIHJldHVybiBpdCB1bm1vZGlmaWVkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICBcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIHZhbHVlIGZvdW5kIGluIGRpY3Rpb25hcnksIHJldHVybiBpdHMgYmFzZTM2IGNvdW50ZXJwYXJ0XHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpbmRleC50b1N0cmluZygzNik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHVubWluaWZ5VmFsdWUodmFsdWU6IHVua25vd24pIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiB2YWx1ZSBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIuIEFzc3VtZSB0aGF0IGl0J3MgYSB0cmFuc2xhdGlvblxyXG4gICAgICAgICAqIGFuZCByZXR1cm4gdGhlIG9yaWdpbmFsIHZhbHVlIGZyb20gdGhlIGRpY3Rpb25hcnlcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlc1twYXJzZUludCh2YWx1ZSwgMzYpXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIHZhbHVlIG9yaWdpbmFsbHkgd2FzIGEgc2luZ2xlIGNoYXJhY3RlciBhbmQgd2FzIHByZWZpeGVkIHdpdGggX19fXHJcbiAgICAgICAgICogdG8gYXZvaWQgbWlzdGFraW5nIGl0IGZvciBhIHRyYW5zbGF0aW9uLiBSZW1vdmUgdGhlIHByZWZpeFxyXG4gICAgICAgICAqIGFuZCByZXR1cm4gdGhlIG9yaWdpbmFsIGNoYXJhY3RlclxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnN1YnN0cigwLCAzKSA9PT0gJ19fXycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlWzNdO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiB2YWx1ZSB3YXMgbm90IG1pbmlmaWVkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGluZGV4T2ZLZXkoa2V5OiBzdHJpbmcpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGtleXNbaV0gPT09IGtleSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGluZGV4T2ZWYWx1ZSh2YWx1ZTogdW5rbm93bikge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZXNbaV0gPT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi9kb20tY29uc3RhbnRzJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi9ldmVudC1lbWl0dGVyJztcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIERyYWdMaXN0ZW5lciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBwcml2YXRlIF90aW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcclxuICAgIHByaXZhdGUgX2FsbG93YWJsZVRhcmdldHM6IEhUTUxFbGVtZW50W107XHJcbiAgICBwcml2YXRlIF9vRG9jdW1lbnQ6IERvY3VtZW50O1xyXG4gICAgcHJpdmF0ZSBfZUJvZHk6IEhUTUxFbGVtZW50O1xyXG4gICAgcHJpdmF0ZSBfbkRlbGF5OiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9uRGlzdGFuY2U6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX29yaWdpbmFsRXZlbnQ6IEV2ZW50RW1pdHRlci5EcmFnRXZlbnQ7XHJcbiAgICBwcml2YXRlIF9kcmFnZ2luZzogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgX3BvaW50ZXJUcmFja2luZyA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgX3BvaW50ZXJEb3duRXZlbnRMaXN0ZW5lciA9IChldjogUG9pbnRlckV2ZW50KSA9PiB0aGlzLm9uUG9pbnRlckRvd24oZXYpO1xyXG4gICAgcHJpdmF0ZSBfcG9pbnRlck1vdmVFdmVudExpc3RlbmVyID0gKGV2OiBQb2ludGVyRXZlbnQpID0+IHRoaXMub25Qb2ludGVyTW92ZShldik7XHJcbiAgICBwcml2YXRlIF9wb2ludGVyVXBFdmVudExpc3RlbmVyID0gKGV2OiBQb2ludGVyRXZlbnQpID0+IHRoaXMub25Qb2ludGVyVXAoZXYpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2VFbGVtZW50OiBIVE1MRWxlbWVudCwgZXh0cmFBbGxvd2FibGVDaGlsZFRhcmdldHM6IEhUTUxFbGVtZW50W10pIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLl90aW1lb3V0ID0gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICB0aGlzLl9hbGxvd2FibGVUYXJnZXRzID0gW19lRWxlbWVudCwgLi4uZXh0cmFBbGxvd2FibGVDaGlsZFRhcmdldHNdO1xyXG4gICAgICAgIHRoaXMuX29Eb2N1bWVudCA9IGRvY3VtZW50O1xyXG4gICAgICAgIHRoaXMuX2VCb2R5ID0gZG9jdW1lbnQuYm9keTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRlbGF5IGFmdGVyIHdoaWNoIHRvIHN0YXJ0IHRoZSBkcmFnIGluIG1pbGxpc2Vjb25kc1xyXG4gICAgICAgICAqIERvIE5PVCBtYWtlIHRvbyBzaG9ydCAocHJldmlvdXMgdmFsdWUgb2YgMjAwIHdhcyBub3QgbG9uZyBlbm91Z2ggZm9yIG15IHRvdWNocGFkKVxyXG4gICAgICAgICAqIFNob3VsZCBnZW5lcmFsbHkgcmVseSBvbiB0aGUgbW91c2UgbW92ZSB0byBzdGFydCBkcmFnLiAgTm90IHRoaXMgZGVsYXkuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fbkRlbGF5ID0gMTgwMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRpc3RhbmNlIHRoZSBtb3VzZSBuZWVkcyB0byBiZSBtb3ZlZCB0byBxdWFsaWZ5IGFzIGEgZHJhZ1xyXG4gICAgICAgICAqIFByZXZpb3VzIGNvbW1lbnQ6IHdvcmtzIGJldHRlciB3aXRoIGRlbGF5IG9ubHlcclxuICAgICAgICAgKiA/Pz9cclxuICAgICAgICAgKiBQcm9iYWJseSBzb21laG93IG5lZWRzIHR1bmluZyBmb3IgZGlmZmVyZW50IGRldmljZXNcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9uRGlzdGFuY2UgPSAxMDtcclxuXHJcbiAgICAgICAgdGhpcy5fb3JpZ2luYWxFdmVudCA9IHsgcGFnZVg6IDAsIHBhZ2VZOiAwLCBzY3JlZW5YOiAwLCBzY3JlZW5ZOiAwfTtcclxuXHJcbiAgICAgICAgdGhpcy5fZHJhZ2dpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5fZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLl9wb2ludGVyRG93bkV2ZW50TGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2hlY2tSZW1vdmVQb2ludGVyVHJhY2tpbmdFdmVudExpc3RlbmVycygpO1xyXG5cclxuICAgICAgICB0aGlzLl9lRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMuX3BvaW50ZXJEb3duRXZlbnRMaXN0ZW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgY2FuY2VsRHJhZygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnByb2Nlc3NEcmFnU3RvcCh1bmRlZmluZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Qb2ludGVyRG93bihvRXZlbnQ6IFBvaW50ZXJFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9hbGxvd2FibGVUYXJnZXRzLmluY2x1ZGVzKG9FdmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpICYmIG9FdmVudC5pc1ByaW1hcnkpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUG9pbnRlckRvd24ob0V2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwcm9jZXNzUG9pbnRlckRvd24oZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xyXG4gICAgICAgIHRoaXMuX29yaWdpbmFsRXZlbnQgPSBldmVudDtcclxuXHJcbiAgICAgICAgdGhpcy5fb0RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgdGhpcy5fcG9pbnRlck1vdmVFdmVudExpc3RlbmVyKTtcclxuICAgICAgICB0aGlzLl9vRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdGhpcy5fcG9pbnRlclVwRXZlbnRMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgIHRoaXMuX2VCb2R5LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Qb2ludGVyVHJhY2tpbmcpO1xyXG4gICAgICAgIHRoaXMuX3BvaW50ZXJUcmFja2luZyA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnREcmFnKClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICwgdGhpcy5fbkRlbGF5KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uUG9pbnRlck1vdmUob0V2ZW50OiBQb2ludGVyRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5fcG9pbnRlclRyYWNraW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0RyYWdNb3ZlKG9FdmVudCk7XHJcbiAgICAgICAgICAgIG9FdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHByb2Nlc3NEcmFnTW92ZShldmVudDogUG9pbnRlckV2ZW50KSB7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0WCA9IGV2ZW50LnBhZ2VYIC0gdGhpcy5fb3JpZ2luYWxFdmVudC5wYWdlWDtcclxuICAgICAgICBjb25zdCBvZmZzZXRZID0gZXZlbnQucGFnZVkgLSB0aGlzLl9vcmlnaW5hbEV2ZW50LnBhZ2VZO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fZHJhZ2dpbmcgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIE1hdGguYWJzKG9mZnNldFgpID4gdGhpcy5fbkRpc3RhbmNlIHx8XHJcbiAgICAgICAgICAgICAgICBNYXRoLmFicyhvZmZzZXRZKSA+IHRoaXMuX25EaXN0YW5jZVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnREcmFnKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9kcmFnZ2luZykge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2RyYWcnLCBvZmZzZXRYLCBvZmZzZXRZLCBldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Qb2ludGVyVXAob0V2ZW50OiBQb2ludGVyRXZlbnQpIHtcclxuICAgICAgICB0aGlzLnByb2Nlc3NEcmFnU3RvcChvRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcHJvY2Vzc0RyYWdTdG9wKGRyYWdFdmVudD86IFBvaW50ZXJFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLl90aW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xyXG4gICAgICAgICAgICB0aGlzLl90aW1lb3V0ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jaGVja1JlbW92ZVBvaW50ZXJUcmFja2luZ0V2ZW50TGlzdGVuZXJzKCk7XHJcbiAgICBcclxuICAgICAgICBpZiAodGhpcy5fZHJhZ2dpbmcgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5fZUJvZHkuY2xhc3NMaXN0LnJlbW92ZShEb21Db25zdGFudHMuQ2xhc3NOYW1lLkRyYWdnaW5nKTtcclxuICAgICAgICAgICAgdGhpcy5fZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShEb21Db25zdGFudHMuQ2xhc3NOYW1lLkRyYWdnaW5nKTtcclxuICAgICAgICAgICAgdGhpcy5fZHJhZ2dpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdkcmFnU3RvcCcsIGRyYWdFdmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2hlY2tSZW1vdmVQb2ludGVyVHJhY2tpbmdFdmVudExpc3RlbmVycygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fcG9pbnRlclRyYWNraW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX29Eb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIHRoaXMuX3BvaW50ZXJNb3ZlRXZlbnRMaXN0ZW5lcik7XHJcbiAgICAgICAgICAgIHRoaXMuX29Eb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB0aGlzLl9wb2ludGVyVXBFdmVudExpc3RlbmVyKTtcclxuICAgICAgICAgICAgdGhpcy5fZUJvZHkuY2xhc3NMaXN0LnJlbW92ZShEb21Db25zdGFudHMuQ2xhc3NOYW1lLlBvaW50ZXJUcmFja2luZyk7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvaW50ZXJUcmFja2luZyA9IGZhbHNlO1xyXG4gICAgICAgIH0gICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGFydERyYWcoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3RpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3RpbWVvdXQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2RyYWdnaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9lQm9keS5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuRHJhZ2dpbmcpO1xyXG4gICAgICAgIHRoaXMuX2VFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5EcmFnZ2luZyk7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdkcmFnU3RhcnQnLCB0aGlzLl9vcmlnaW5hbEV2ZW50LnBhZ2VYLCB0aGlzLl9vcmlnaW5hbEV2ZW50LnBhZ2VZKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2RyYWcnLCAwLCAwLCB0aGlzLl9vcmlnaW5hbEV2ZW50KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEJyb3dzZXJQb3BvdXQgfSBmcm9tICcuLi9jb250cm9scy9icm93c2VyLXBvcG91dCc7XHJcbmltcG9ydCB7IFRhYiB9IGZyb20gJy4uL2NvbnRyb2xzL3RhYic7XHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9jb21wb25lbnQtaXRlbSc7XHJcblxyXG4vKipcclxuICogQSBnZW5lcmljIGFuZCB2ZXJ5IGZhc3QgRXZlbnRFbWl0dGVyIGltcGxlbWVudGF0aW9uLiBPbiB0b3Agb2YgZW1pdHRpbmcgdGhlIGFjdHVhbCBldmVudCBpdCBlbWl0cyBhblxyXG4gKiB7QGxpbmsgKEV2ZW50RW1pdHRlcjpuYW1lc3BhY2UpLkFMTF9FVkVOVH0gZXZlbnQgZm9yIGV2ZXJ5IGV2ZW50IHRyaWdnZXJlZC4gVGhpcyBhbGxvd3MgdG8gaG9vayBpbnRvIGl0IGFuZCBwcm94eSBldmVudHMgZm9yd2FyZHNcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEV2ZW50RW1pdHRlciB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9hbGxFdmVudFN1YnNjcmlwdGlvbnM6IEV2ZW50RW1pdHRlci5Vbmtub3duQ2FsbGJhY2tbXSA9IFtdO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBFdmVudEVtaXR0ZXIuVW5rbm93bkNhbGxiYWNrW10+KCk7XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgdHJ5QnViYmxlRXZlbnQobmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duW10pOiB2b2lkIHtcclxuICAgICAgICAvLyBvdmVycmlkZGVuIGJ5IENvbnRlbnRJdGVtXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbWl0IGFuIGV2ZW50IGFuZCBub3RpZnkgbGlzdGVuZXJzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudFxyXG4gICAgICogQHBhcmFtIGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBsaXN0ZW5lclxyXG4gICAgICovXHJcbiAgICBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBFdmVudEVtaXR0ZXIuRXZlbnRQYXJhbXNNYXA+KGV2ZW50TmFtZTogSywgLi4uYXJnczogRXZlbnRFbWl0dGVyLkV2ZW50UGFyYW1zTWFwW0tdKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHN1YmNyaXB0aW9ucyA9IHRoaXMuX3N1YnNjcmlwdGlvbnNNYXAuZ2V0KGV2ZW50TmFtZSk7XHJcblxyXG4gICAgICAgIGlmIChzdWJjcmlwdGlvbnMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBzdWJjcmlwdGlvbnMgPSBzdWJjcmlwdGlvbnMuc2xpY2UoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJjcmlwdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHN1YmNyaXB0aW9uc1tpXTtcclxuICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbiguLi5hcmdzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5lbWl0QWxsRXZlbnQoZXZlbnROYW1lLCBhcmdzKTtcclxuICAgICAgICB0aGlzLnRyeUJ1YmJsZUV2ZW50KGV2ZW50TmFtZSwgYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZW1pdFVua25vd24oZXZlbnROYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IEV2ZW50RW1pdHRlci5Vbmtub3duUGFyYW1zKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHN1YnMgPSB0aGlzLl9zdWJzY3JpcHRpb25zTWFwLmdldChldmVudE5hbWUpO1xyXG5cclxuICAgICAgICBpZiAoc3VicyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHN1YnMgPSBzdWJzLnNsaWNlKCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3Vicy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgc3Vic1tpXSguLi5hcmdzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5lbWl0QWxsRXZlbnQoZXZlbnROYW1lLCBhcmdzKTtcclxuICAgICAgICB0aGlzLnRyeUJ1YmJsZUV2ZW50KGV2ZW50TmFtZSwgYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyogQGludGVybmFsICoqL1xyXG4gICAgZW1pdEJhc2VCdWJibGluZ0V2ZW50PEsgZXh0ZW5kcyBrZXlvZiBFdmVudEVtaXR0ZXIuRXZlbnRQYXJhbXNNYXA+KGV2ZW50TmFtZTogSyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlci5CdWJibGluZ0V2ZW50KGV2ZW50TmFtZSwgdGhpcyk7XHJcbiAgICAgICAgdGhpcy5lbWl0VW5rbm93bihldmVudE5hbWUsIGV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBlbWl0VW5rbm93bkJ1YmJsaW5nRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudEVtaXR0ZXIuQnViYmxpbmdFdmVudChldmVudE5hbWUsIHRoaXMpO1xyXG4gICAgICAgIHRoaXMuZW1pdFVua25vd24oZXZlbnROYW1lLCBldmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZm9yIGFuIGV2ZW50LlxyXG4gICAgICogQHBhcmFtIGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudFxyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBjYWxsYmFjayBtZXRob2QgKG9wdGlvbmFsKVxyXG4gICAgICovXHJcbiAgICByZW1vdmVFdmVudExpc3RlbmVyPEsgZXh0ZW5kcyBrZXlvZiBFdmVudEVtaXR0ZXIuRXZlbnRQYXJhbXNNYXA+KGV2ZW50TmFtZTogSywgY2FsbGJhY2s6IEV2ZW50RW1pdHRlci5DYWxsYmFjazxLPik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHVua25vd25DYWxsYmFjayA9IGNhbGxiYWNrIGFzIEV2ZW50RW1pdHRlci5Vbmtub3duQ2FsbGJhY2s7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVVbmtub3duRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHVua25vd25DYWxsYmFjayk7XHJcbiAgICB9XHJcblxyXG4gICAgb2ZmPEsgZXh0ZW5kcyBrZXlvZiBFdmVudEVtaXR0ZXIuRXZlbnRQYXJhbXNNYXA+KGV2ZW50TmFtZTogSywgY2FsbGJhY2s6IEV2ZW50RW1pdHRlci5DYWxsYmFjazxLPik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFsaWFzIGZvciBvZmZcclxuICAgICAqL1xyXG4gICAgdW5iaW5kID0gdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWxpYXMgZm9yIGVtaXRcclxuICAgICAqL1xyXG4gICAgdHJpZ2dlciA9IHRoaXMuZW1pdDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIExpc3RlbiBmb3IgZXZlbnRzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byBsaXN0ZW4gdG9cclxuICAgICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IG9jY3Vyc1xyXG4gICAgICovXHJcbiAgICBhZGRFdmVudExpc3RlbmVyPEsgZXh0ZW5kcyBrZXlvZiBFdmVudEVtaXR0ZXIuRXZlbnRQYXJhbXNNYXA+KGV2ZW50TmFtZTogSywgY2FsbGJhY2s6IEV2ZW50RW1pdHRlci5DYWxsYmFjazxLPik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHVua25vd25DYWxsYmFjayA9IGNhbGxiYWNrIGFzIEV2ZW50RW1pdHRlci5Vbmtub3duQ2FsbGJhY2s7XHJcbiAgICAgICAgdGhpcy5hZGRVbmtub3duRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHVua25vd25DYWxsYmFjayk7XHJcbiAgICB9XHJcblxyXG4gICAgb248SyBleHRlbmRzIGtleW9mIEV2ZW50RW1pdHRlci5FdmVudFBhcmFtc01hcD4oZXZlbnROYW1lOiBLLCBjYWxsYmFjazogRXZlbnRFbWl0dGVyLkNhbGxiYWNrPEs+KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgY2FsbGJhY2spO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgYWRkVW5rbm93bkV2ZW50TGlzdGVuZXIoZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBFdmVudEVtaXR0ZXIuVW5rbm93bkNhbGxiYWNrKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gRXZlbnRFbWl0dGVyLkFMTF9FVkVOVCkge1xyXG4gICAgICAgICAgICB0aGlzLl9hbGxFdmVudFN1YnNjcmlwdGlvbnMucHVzaChjYWxsYmFjayk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHN1YnNjcmlwdGlvbnMgPSB0aGlzLl9zdWJzY3JpcHRpb25zTWFwLmdldChldmVudE5hbWUpO1xyXG4gICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25zLnB1c2goY2FsbGJhY2spO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9ucyA9IFtjYWxsYmFja107XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25zTWFwLnNldChldmVudE5hbWUsIHN1YnNjcmlwdGlvbnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVtb3ZlVW5rbm93bkV2ZW50TGlzdGVuZXIoZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBFdmVudEVtaXR0ZXIuVW5rbm93bkNhbGxiYWNrKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gRXZlbnRFbWl0dGVyLkFMTF9FVkVOVCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVN1YnNjcmlwdGlvbihldmVudE5hbWUsIHRoaXMuX2FsbEV2ZW50U3Vic2NyaXB0aW9ucywgY2FsbGJhY2spO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbnMgPSB0aGlzLl9zdWJzY3JpcHRpb25zTWFwLmdldChldmVudE5hbWUpO1xyXG4gICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHN1YnNjcmlidGlvbnMgdG8gdW5zdWJzY3JpYmUgZm9yIGV2ZW50ICcgKyBldmVudE5hbWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVTdWJzY3JpcHRpb24oZXZlbnROYW1lLCBzdWJzY3JpcHRpb25zLCBjYWxsYmFjayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZW1vdmVTdWJzY3JpcHRpb24oZXZlbnROYW1lOiBzdHJpbmcsIHN1YnNjcmlwdGlvbnM6IEV2ZW50RW1pdHRlci5Vbmtub3duQ2FsbGJhY2tbXSwgY2FsbGJhY2s6IEV2ZW50RW1pdHRlci5Vbmtub3duQ2FsbGJhY2spIHtcclxuICAgICAgICBjb25zdCBpZHggPSBzdWJzY3JpcHRpb25zLmluZGV4T2YoY2FsbGJhY2spO1xyXG4gICAgICAgIGlmIChpZHggPCAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm90aGluZyB0byB1bmJpbmQgZm9yICcgKyBldmVudE5hbWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbnMuc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZW1pdEFsbEV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duW10pIHtcclxuICAgICAgICBjb25zdCBhbGxFdmVudFN1YnNjcmlwdGlvbnNDb3VudCA9IHRoaXMuX2FsbEV2ZW50U3Vic2NyaXB0aW9ucy5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGFsbEV2ZW50U3Vic2NyaXB0aW9uc0NvdW50ID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCB1bmtub3duQXJncyA9IGFyZ3Muc2xpY2UoKSBhcyBFdmVudEVtaXR0ZXIuVW5rbm93blBhcmFtcztcclxuICAgICAgICAgICAgdW5rbm93bkFyZ3MudW5zaGlmdChldmVudE5hbWUpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgYWxsRXZlbnRTdWJjcmlwdGlvbnMgPSB0aGlzLl9hbGxFdmVudFN1YnNjcmlwdGlvbnMuc2xpY2UoKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsRXZlbnRTdWJzY3JpcHRpb25zQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgYWxsRXZlbnRTdWJjcmlwdGlvbnNbaV0oLi4udW5rbm93bkFyZ3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIEV2ZW50RW1pdHRlciB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0aGF0J3MgdHJpZ2dlcmVkIGZvciBldmVyeSBldmVudFxyXG4gICAgICovXHJcbiAgICBleHBvcnQgY29uc3QgQUxMX0VWRU5UID0gJ19fYWxsJztcclxuXHJcbiAgICBleHBvcnQgY29uc3QgaGVhZGVyQ2xpY2tFdmVudE5hbWUgPSAnc3RhY2tIZWFkZXJDbGljayc7XHJcbiAgICBleHBvcnQgY29uc3QgaGVhZGVyVG91Y2hTdGFydEV2ZW50TmFtZSA9ICdzdGFja0hlYWRlclRvdWNoU3RhcnQnO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIFVua25vd25DYWxsYmFjayA9ICh0aGlzOiB2b2lkLCAuLi5hcmdzOiBVbmtub3duUGFyYW1zKSA9PiB2b2lkO1xyXG4gICAgZXhwb3J0IHR5cGUgQ2FsbGJhY2s8SyBleHRlbmRzIGtleW9mIEV2ZW50RW1pdHRlci5FdmVudFBhcmFtc01hcD4gPSAodGhpczogdm9pZCwgLi4uYXJnczogRXZlbnRQYXJhbXNNYXBbS10pID0+IHZvaWQ7XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBFdmVudFBhcmFtc01hcCB7XHJcbiAgICAgICAgXCJfX2FsbFwiOiBVbmtub3duUGFyYW1zO1xyXG4gICAgICAgIFwiYWN0aXZlQ29udGVudEl0ZW1DaGFuZ2VkXCI6IENvbXBvbmVudEl0ZW1QYXJhbTtcclxuICAgICAgICBcImNsb3NlXCI6IE5vUGFyYW1zO1xyXG4gICAgICAgIFwiY2xvc2VkXCI6IE5vUGFyYW1zO1xyXG4gICAgICAgIFwiZGVzdHJveVwiOiBOb1BhcmFtcztcclxuICAgICAgICBcImRyYWdcIjogRHJhZ1BhcmFtcztcclxuICAgICAgICBcImRyYWdTdGFydFwiOiBEcmFnU3RhcnRQYXJhbXM7XHJcbiAgICAgICAgXCJkcmFnU3RvcFwiOiBEcmFnU3RvcFBhcmFtcztcclxuICAgICAgICBcImhpZGVcIjogTm9QYXJhbXM7XHJcbiAgICAgICAgXCJpbml0aWFsaXNlZFwiOiBOb1BhcmFtcztcclxuICAgICAgICBcIml0ZW1Ecm9wcGVkXCI6IENvbXBvbmVudEl0ZW1QYXJhbTtcclxuICAgICAgICBcIm1heGltaXNlZFwiOiBOb1BhcmFtcztcclxuICAgICAgICBcIm1pbmltaXNlZFwiOiBOb1BhcmFtcztcclxuICAgICAgICBcIm9wZW5cIjogTm9QYXJhbXM7XHJcbiAgICAgICAgXCJwb3BJblwiOiBOb1BhcmFtcztcclxuICAgICAgICBcInJlc2l6ZVwiOiBOb1BhcmFtcztcclxuICAgICAgICBcInNob3dcIjogTm9QYXJhbXM7XHJcbiAgICAgICAgLyoqIEBkZXByZWNhdGVkIC0gdXNlIHNob3cgaW5zdGVhZCAqL1xyXG4gICAgICAgIFwic2hvd25cIjogTm9QYXJhbXM7XHJcbiAgICAgICAgXCJzdGF0ZUNoYW5nZWRcIjogTm9QYXJhbXM7XHJcbiAgICAgICAgXCJ0YWJcIjogVGFiUGFyYW07XHJcbiAgICAgICAgXCJ0YWJDcmVhdGVkXCI6IFRhYlBhcmFtO1xyXG4gICAgICAgIFwidGl0bGVDaGFuZ2VkXCI6IFN0cmluZ1BhcmFtO1xyXG4gICAgICAgIFwid2luZG93Q2xvc2VkXCI6IFBvcG91dFBhcmFtO1xyXG4gICAgICAgIFwid2luZG93T3BlbmVkXCI6IFBvcG91dFBhcmFtO1xyXG4gICAgICAgIFwiYmVmb3JlQ29tcG9uZW50UmVsZWFzZVwiOiBCZWZvcmVDb21wb25lbnRSZWxlYXNlUGFyYW1zO1xyXG4gICAgICAgIFwiYmVmb3JlSXRlbURlc3Ryb3llZFwiOiBCdWJibGluZ0V2ZW50UGFyYW07XHJcbiAgICAgICAgXCJpdGVtQ3JlYXRlZFwiOiBCdWJibGluZ0V2ZW50UGFyYW07XHJcbiAgICAgICAgXCJpdGVtRGVzdHJveWVkXCI6IEJ1YmJsaW5nRXZlbnRQYXJhbTtcclxuICAgICAgICBcImZvY3VzXCI6IEJ1YmJsaW5nRXZlbnRQYXJhbTtcclxuICAgICAgICBcImJsdXJcIjogQnViYmxpbmdFdmVudFBhcmFtO1xyXG4gICAgICAgIFwic3RhY2tIZWFkZXJDbGlja1wiOiBDbGlja0J1YmJsaW5nRXZlbnRQYXJhbTtcclxuICAgICAgICBcInN0YWNrSGVhZGVyVG91Y2hTdGFydFwiOiBUb3VjaFN0YXJ0QnViYmxpbmdFdmVudFBhcmFtO1xyXG4gICAgICAgIFwidXNlckJyb2FkY2FzdFwiOiBVbmtub3duUGFyYW1zO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCB0eXBlIFVua25vd25QYXJhbXMgPSB1bmtub3duW107XHJcbiAgICBleHBvcnQgdHlwZSBOb1BhcmFtcyA9IFtdO1xyXG4gICAgZXhwb3J0IHR5cGUgVW5rbm93blBhcmFtID0gW3Vua25vd25dO1xyXG4gICAgZXhwb3J0IHR5cGUgUG9wb3V0UGFyYW0gPSBbQnJvd3NlclBvcG91dF07XHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnRJdGVtUGFyYW0gPSBbQ29tcG9uZW50SXRlbV07XHJcbiAgICBleHBvcnQgdHlwZSBUYWJQYXJhbSA9IFtUYWJdO1xyXG4gICAgZXhwb3J0IHR5cGUgQnViYmxpbmdFdmVudFBhcmFtID0gW0V2ZW50RW1pdHRlci5CdWJibGluZ0V2ZW50XVxyXG4gICAgZXhwb3J0IHR5cGUgU3RyaW5nUGFyYW0gPSBbc3RyaW5nXTtcclxuICAgIGV4cG9ydCB0eXBlIERyYWdTdGFydFBhcmFtcyA9IFtvcmlnaW5hbFg6IG51bWJlciwgb3JpZ2luYWxZOiBudW1iZXJdO1xyXG4gICAgZXhwb3J0IHR5cGUgRHJhZ1N0b3BQYXJhbXMgPSBbZXZlbnQ6IFBvaW50ZXJFdmVudCB8IHVuZGVmaW5lZF07XHJcbiAgICBleHBvcnQgdHlwZSBEcmFnUGFyYW1zID0gW29mZnNldFg6IG51bWJlciwgb2Zmc2V0WTogbnVtYmVyLCBldmVudDogRXZlbnRFbWl0dGVyLkRyYWdFdmVudF07XHJcbiAgICBleHBvcnQgdHlwZSBCZWZvcmVDb21wb25lbnRSZWxlYXNlUGFyYW1zID0gW2NvbXBvbmVudDogdW5rbm93bl07XHJcbiAgICBleHBvcnQgdHlwZSBDbGlja0J1YmJsaW5nRXZlbnRQYXJhbSA9IFtDbGlja0J1YmJsaW5nRXZlbnRdO1xyXG4gICAgZXhwb3J0IHR5cGUgVG91Y2hTdGFydEJ1YmJsaW5nRXZlbnRQYXJhbSA9IFtUb3VjaFN0YXJ0QnViYmxpbmdFdmVudF07XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBEcmFnRXZlbnQge1xyXG4gICAgICAgIHJlYWRvbmx5IHBhZ2VYOiBudW1iZXI7XHJcbiAgICAgICAgcmVhZG9ubHkgcGFnZVk6IG51bWJlcjtcclxuICAgICAgICByZWFkb25seSBzY3JlZW5YOiBudW1iZXI7XHJcbiAgICAgICAgcmVhZG9ubHkgc2NyZWVuWTogbnVtYmVyO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBjbGFzcyBCdWJibGluZ0V2ZW50IHtcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgZ2V0IG5hbWUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX25hbWU7IH1cclxuICAgICAgICBnZXQgdGFyZ2V0KCk6IEV2ZW50RW1pdHRlciB7IHJldHVybiB0aGlzLl90YXJnZXQ7IH1cclxuICAgICAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoRXZlbnRFbWl0dGVyOm5hbWVzcGFjZSkuKEJ1YmJsaW5nRXZlbnQ6Y2xhc3MpLnRhcmdldH0gaW5zdGVhZCAqL1xyXG4gICAgICAgIGdldCBvcmlnaW4oKTogRXZlbnRFbWl0dGVyIHsgcmV0dXJuIHRoaXMuX3RhcmdldDsgfVxyXG4gICAgICAgIGdldCBpc1Byb3BhZ2F0aW9uU3RvcHBlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2lzUHJvcGFnYXRpb25TdG9wcGVkOyB9XHJcblxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9uYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfdGFyZ2V0OiBFdmVudEVtaXR0ZXIpIHtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN0b3BQcm9wYWdhdGlvbigpOiB2b2lkIHtcclxuICAgICAgICAgICAgdGhpcy5faXNQcm9wYWdhdGlvblN0b3BwZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgY2xhc3MgQ2xpY2tCdWJibGluZ0V2ZW50IGV4dGVuZHMgQnViYmxpbmdFdmVudCB7XHJcbiAgICAgICAgZ2V0IG1vdXNlRXZlbnQoKTogTW91c2VFdmVudCB7IHJldHVybiB0aGlzLl9tb3VzZUV2ZW50OyB9XHJcblxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHRhcmdldDogRXZlbnRFbWl0dGVyLFxyXG4gICAgICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX21vdXNlRXZlbnQ6IE1vdXNlRXZlbnRcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgc3VwZXIobmFtZSwgdGFyZ2V0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGNsYXNzIFRvdWNoU3RhcnRCdWJibGluZ0V2ZW50IGV4dGVuZHMgQnViYmxpbmdFdmVudCB7XHJcbiAgICAgICAgZ2V0IHRvdWNoRXZlbnQoKTogVG91Y2hFdmVudCB7IHJldHVybiB0aGlzLl90b3VjaEV2ZW50OyB9XHJcblxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHRhcmdldDogRXZlbnRFbWl0dGVyLFxyXG4gICAgICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX3RvdWNoRXZlbnQ6IFRvdWNoRXZlbnRcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgc3VwZXIobmFtZSwgdGFyZ2V0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgVW5leHBlY3RlZE51bGxFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4vZXZlbnQtZW1pdHRlcic7XHJcblxyXG4vLyBBZGQgb3VyIENoaWxkRXZlbnQgdG8gV2luZG93RXZlbnRNYXAgZm9yIHR5cGUgc2FmZXR5XHJcbi8qKiBAcHVibGljICovXHJcbmRlY2xhcmUgZ2xvYmFsIHtcclxuICAgIGludGVyZmFjZSBXaW5kb3dFdmVudE1hcCB7XHJcbiAgICAgICAgW0V2ZW50SHViLkNoaWxkRXZlbnROYW1lXTogQ3VzdG9tRXZlbnQ8RXZlbnRIdWIuQ2hpbGRFdmVudERldGFpbD47XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBbiBFdmVudEVtaXR0ZXIgc2luZ2xldG9uIHRoYXQgcHJvcGFnYXRlcyBldmVudHNcclxuICogYWNyb3NzIG11bHRpcGxlIHdpbmRvd3MuIFRoaXMgaXMgYSBsaXR0bGUgYml0IHRyaWNraWVyIHNpbmNlXHJcbiAqIHdpbmRvd3MgYXJlIGFsbG93ZWQgdG8gb3BlbiBjaGlsZFdpbmRvd3MgaW4gdGhlaXIgb3duIHJpZ2h0LlxyXG4gKlxyXG4gKiBUaGlzIG1lYW5zIHRoYXQgd2UgZGVhbCB3aXRoIGEgdHJlZSBvZiB3aW5kb3dzLiBUaGVyZWZvcmUsIHdlIGRvIHRoZSBldmVudCBwcm9wYWdhdGlvbiBpbiB0d28gcGhhc2VzOlxyXG4gKlxyXG4gKiAtIFByb3BhZ2F0ZSBldmVudHMgZnJvbSB0aGlzIGxheW91dCB0byB0aGUgcGFyZW50IGxheW91dFxyXG4gKiAgIC0gUmVwZWF0IHVudGlsIHRoZSBldmVudCBhcnJpdmVkIGF0IHRoZSByb290IGxheW91dFxyXG4gKiAtIFByb3BhZ2F0ZSBldmVudHMgdG8gdGhpcyBsYXlvdXQgYW5kIHRvIGFsbCBjaGlsZHJlblxyXG4gKiAgIC0gUmVwZWF0IHVudGlsIGFsbCBsYXlvdXRzIGdvdCB0aGUgZXZlbnRcclxuICpcclxuICogKipXQVJOSU5HKio6IE9ubHkgdXNlckJyb2FkY2FzdCBldmVudHMgYXJlIHByb3BhZ2F0ZWQgYmV0d2VlbiB3aW5kb3dzLlxyXG4gKiBUaGlzIG1lYW5zIHRoZSB5b3UgaGF2ZSB0byB0YWtlIGNhcmUgb2YgcHJvcGFnYXRpbmcgc3RhdGUgY2hhbmdlcyBiZXR3ZWVuIHdpbmRvd3MgeW91cnNlbGYuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBjbGFzcyBFdmVudEh1YiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfY2hpbGRFdmVudExpc3RlbmVyID0gKGNoaWxkRXZlbnQ6IEN1c3RvbUV2ZW50PEV2ZW50SHViLkNoaWxkRXZlbnREZXRhaWw+KSA9PiB0aGlzLm9uRXZlbnRGcm9tQ2hpbGQoY2hpbGRFdmVudCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEV2ZW50SHViIGluc3RhbmNlXHJcbiAgICAgKiBAcGFyYW0gX2xheW91dE1hbmFnZXIgLSB0aGUgbGF5b3V0IG1hbmFnZXIgdG8gc3luY2hyb25pemUgYmV0d2VlbiB0aGUgd2luZG93c1xyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9sYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIGdsb2JhbFRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFdmVudEh1Yi5DaGlsZEV2ZW50TmFtZSwgdGhpcy5fY2hpbGRFdmVudExpc3RlbmVyLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbWl0IGFuIGV2ZW50IGFuZCBub3RpZnkgbGlzdGVuZXJzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudFxyXG4gICAgICogQHBhcmFtIGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBsaXN0ZW5lclxyXG4gICAgICogQHB1YmxpY1xyXG4gICAgICovXHJcbiAgICBvdmVycmlkZSBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBFdmVudEVtaXR0ZXIuRXZlbnRQYXJhbXNNYXA+KGV2ZW50TmFtZTogSywgLi4uYXJnczogRXZlbnRFbWl0dGVyLkV2ZW50UGFyYW1zTWFwW0tdKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gJ3VzZXJCcm9hZGNhc3QnKSB7XHJcbiAgICAgICAgICAgIC8vIEV4cGxpY2l0bHkgcmVkaXJlY3QgdGhlIHVzZXIgYnJvYWRjYXN0IHRvIG91ciBvdmVycmlkZGVuIG1ldGhvZC5cclxuICAgICAgICAgICAgdGhpcy5lbWl0VXNlckJyb2FkY2FzdCguLi5hcmdzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzdXBlci5lbWl0KGV2ZW50TmFtZSwgLi4uYXJncyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnJvYWRjYXN0cyBhIG1lc3NhZ2UgdG8gYWxsIG90aGVyIGN1cnJlbnRseSBvcGVuZWQgd2luZG93cy5cclxuICAgICAqIEBwdWJsaWNcclxuICAgICAqL1xyXG4gICAgZW1pdFVzZXJCcm9hZGNhc3QoLi4uYXJnczogRXZlbnRFbWl0dGVyLlVua25vd25QYXJhbXMpOiB2b2lkIHtcclxuICAgICAgICAvLyBTdGVwIDE6IEJ1YmJsZSB1cCB0aGUgZXZlbnRcclxuICAgICAgICB0aGlzLmhhbmRsZVVzZXJCcm9hZGNhc3RFdmVudCgndXNlckJyb2FkY2FzdCcsIGFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVzdHJveXMgdGhlIEV2ZW50SHViXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWxUaGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoRXZlbnRIdWIuQ2hpbGRFdmVudE5hbWUsIHRoaXMuX2NoaWxkRXZlbnRMaXN0ZW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBwcm9jZXNzb3IgdG8gcHJvY2VzcyBsb2NhbCBldmVudHMuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVVc2VyQnJvYWRjYXN0RXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGFyZ3M6IHVua25vd25bXSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9sYXlvdXRNYW5hZ2VyLmlzU3ViV2luZG93KSB7XHJcbiAgICAgICAgICAgIC8vIFdlIGFyZSBhIHN1YiB3aW5kb3cgYW5kIHJlY2VpdmVkIGFuIGV2ZW50IGZyb20gb25lIG9mIG91ciBjaGlsZHJlbi5cclxuICAgICAgICAgICAgLy8gU28gcHJvcGFnYXRlIGl0IHRvIHRoZSBSb290LlxyXG4gICAgICAgICAgICB0aGlzLnByb3BhZ2F0ZVRvUGFyZW50KGV2ZW50TmFtZSwgYXJncyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gV2UgYXJlIHRoZSByb290IHdpbmRvdywgcHJvcGFnYXRlIGl0IHRvIHRoZSBzdWJ0cmVlIGJlbG93IHVzLlxyXG4gICAgICAgICAgICB0aGlzLnByb3BhZ2F0ZVRvVGhpc0FuZFN1YnRyZWUoZXZlbnROYW1lLCBhcmdzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayBmb3IgY2hpbGQgZXZlbnRzIHJhaXNlZCBvbiB0aGUgd2luZG93XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvbkV2ZW50RnJvbUNoaWxkKGV2ZW50OiBDdXN0b21FdmVudDxFdmVudEh1Yi5DaGlsZEV2ZW50RGV0YWlsPikge1xyXG4gICAgICAgIGNvbnN0IGRldGFpbCA9IGV2ZW50LmRldGFpbDtcclxuICAgICAgICB0aGlzLmhhbmRsZVVzZXJCcm9hZGNhc3RFdmVudChkZXRhaWwuZXZlbnROYW1lLCBkZXRhaWwuYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9wYWdhdGVzIHRoZSBldmVudCB0byB0aGUgcGFyZW50IGJ5IGVtaXR0aW5nXHJcbiAgICAgKiBpdCBvbiB0aGUgcGFyZW50J3MgRE9NIHdpbmRvd1xyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcHJvcGFnYXRlVG9QYXJlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGFyZ3M6IHVua25vd25bXSkge1xyXG4gICAgICAgIGNvbnN0IGRldGFpbDogRXZlbnRIdWIuQ2hpbGRFdmVudERldGFpbCA9IHtcclxuICAgICAgICAgICAgbGF5b3V0TWFuYWdlcjogdGhpcy5fbGF5b3V0TWFuYWdlcixcclxuICAgICAgICAgICAgZXZlbnROYW1lLFxyXG4gICAgICAgICAgICBhcmdzOiBhcmdzLFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZXZlbnRJbml0OiBFdmVudEh1Yi5DaGlsZEV2ZW50SW5pdCA9IHtcclxuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcclxuICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgZGV0YWlsLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PEV2ZW50SHViLkNoaWxkRXZlbnREZXRhaWw+KEV2ZW50SHViLkNoaWxkRXZlbnROYW1lLCBldmVudEluaXQpO1xyXG4gICAgICAgIGNvbnN0IG9wZW5lciA9IGdsb2JhbFRoaXMub3BlbmVyO1xyXG4gICAgICAgIGlmIChvcGVuZXIgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0VIUFRQMTU3NzgnKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgb3BlbmVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvcGFnYXRlIGV2ZW50cyB0byB0aGUgd2hvbGUgc3VidHJlZSB1bmRlciB0aGlzIGV2ZW50IGh1Yi5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHByb3BhZ2F0ZVRvVGhpc0FuZFN1YnRyZWUoZXZlbnROYW1lOiBzdHJpbmcsIGFyZ3M6IHVua25vd25bXSkge1xyXG4gICAgICAgIHRoaXMuZW1pdFVua25vd24oZXZlbnROYW1lLCAuLi5hcmdzKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xheW91dE1hbmFnZXIub3BlblBvcG91dHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgY2hpbGRHbCA9IHRoaXMuX2xheW91dE1hbmFnZXIub3BlblBvcG91dHNbaV0uZ2V0R2xJbnN0YW5jZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNoaWxkR2wpIHtcclxuICAgICAgICAgICAgICAgIGNoaWxkR2wuZXZlbnRIdWIucHJvcGFnYXRlVG9UaGlzQW5kU3VidHJlZShldmVudE5hbWUsIGFyZ3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIEV2ZW50SHViIHtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgY29uc3QgQ2hpbGRFdmVudE5hbWUgPSAnZ2xfY2hpbGRfZXZlbnQnO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIENoaWxkRXZlbnREZXRhaWwgPSB7XHJcbiAgICAgICAgbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlcjtcclxuICAgICAgICBldmVudE5hbWU6IHN0cmluZztcclxuICAgICAgICBhcmdzOiB1bmtub3duW107XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIENoaWxkRXZlbnRJbml0ID0gQ3VzdG9tRXZlbnRJbml0PENoaWxkRXZlbnREZXRhaWw+O1xyXG59XHJcbiIsImltcG9ydCB7IEFzc2VydEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBjb25zdCBlbnVtIEkxOG5TdHJpbmdJZCB7XHJcbiAgICBQb3BvdXRDYW5ub3RCZUNyZWF0ZWRXaXRoR3JvdW5kSXRlbUNvbmZpZyxcclxuICAgIFBsZWFzZVJlZ2lzdGVyQUNvbnN0cnVjdG9yRnVuY3Rpb24sXHJcbiAgICBDb21wb25lbnRUeXBlTm90UmVnaXN0ZXJlZEFuZEJpbmRDb21wb25lbnRFdmVudEhhbmRsZXJOb3RBc3NpZ25lZCxcclxuICAgIENvbXBvbmVudElzQWxyZWFkeVJlZ2lzdGVyZWQsXHJcbiAgICBDb21wb25lbnRJc05vdFZpcnR1YWJsZSxcclxuICAgIFZpcnR1YWxDb21wb25lbnREb2VzTm90SGF2ZVJvb3RIdG1sRWxlbWVudCxcclxuICAgIEl0ZW1Db25maWdJc05vdFR5cGVDb21wb25lbnQsXHJcbiAgICBJbnZhbGlkTnVtYmVyUGFydEluU2l6ZVN0cmluZyxcclxuICAgIFVua25vd25Vbml0SW5TaXplU3RyaW5nLFxyXG4gICAgVW5zdXBwb3J0ZWRVbml0SW5TaXplU3RyaW5nLFxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIEkxOG5TdHJpbmdzIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGxldCBpbml0aWFsaXNlZCA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGludGVyZmFjZSBJbmZvIHtcclxuICAgICAgICByZWFkb25seSBpZDogSTE4blN0cmluZ0lkO1xyXG4gICAgICAgIHJlYWRvbmx5IGRlZmF1bHQ6IHN0cmluZztcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICB0eXBlIEluZm9zT2JqZWN0ID0geyBbaWQgaW4ga2V5b2YgdHlwZW9mIEkxOG5TdHJpbmdJZF06IEluZm8gfTtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdCBpbmZvc09iamVjdDogSW5mb3NPYmplY3QgPSB7XHJcbiAgICAgICAgUG9wb3V0Q2Fubm90QmVDcmVhdGVkV2l0aEdyb3VuZEl0ZW1Db25maWc6IHtcclxuICAgICAgICAgICAgaWQ6IEkxOG5TdHJpbmdJZC5Qb3BvdXRDYW5ub3RCZUNyZWF0ZWRXaXRoR3JvdW5kSXRlbUNvbmZpZyxcclxuICAgICAgICAgICAgZGVmYXVsdDogJ1BvcG91dCBjYW5ub3QgYmUgY3JlYXRlZCB3aXRoIGdyb3VuZCBJdGVtQ29uZmlnJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgUGxlYXNlUmVnaXN0ZXJBQ29uc3RydWN0b3JGdW5jdGlvbjoge1xyXG4gICAgICAgICAgICBpZDogSTE4blN0cmluZ0lkLlBsZWFzZVJlZ2lzdGVyQUNvbnN0cnVjdG9yRnVuY3Rpb24sXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICdQbGVhc2UgcmVnaXN0ZXIgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbidcclxuICAgICAgICB9LFxyXG4gICAgICAgIENvbXBvbmVudFR5cGVOb3RSZWdpc3RlcmVkQW5kQmluZENvbXBvbmVudEV2ZW50SGFuZGxlck5vdEFzc2lnbmVkOiB7XHJcbiAgICAgICAgICAgIGlkOiBJMThuU3RyaW5nSWQuQ29tcG9uZW50VHlwZU5vdFJlZ2lzdGVyZWRBbmRCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyTm90QXNzaWduZWQsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICdDb21wb25lbnQgdHlwZSBub3QgcmVnaXN0ZXJlZCBhbmQgQmluZENvbXBvbmVudEV2ZW50IGhhbmRsZXIgbm90IGFzc2lnbmVkJyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIENvbXBvbmVudElzQWxyZWFkeVJlZ2lzdGVyZWQ6IHtcclxuICAgICAgICAgICAgaWQ6IEkxOG5TdHJpbmdJZC5Db21wb25lbnRJc0FscmVhZHlSZWdpc3RlcmVkLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnQ29tcG9uZW50IGlzIGFscmVhZHkgcmVnaXN0ZXJlZCcsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBDb21wb25lbnRJc05vdFZpcnR1YWJsZToge1xyXG4gICAgICAgICAgICBpZDogSTE4blN0cmluZ0lkLkNvbXBvbmVudElzTm90VmlydHVhYmxlLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnQ29tcG9uZW50IGlzIG5vdCB2aXJ0dWFibGUuIFJlcXVpcmVzIHJvb3RIdG1sRWxlbWVudCBmaWVsZC9nZXR0ZXInLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgVmlydHVhbENvbXBvbmVudERvZXNOb3RIYXZlUm9vdEh0bWxFbGVtZW50OiB7XHJcbiAgICAgICAgICAgIGlkOiBJMThuU3RyaW5nSWQuVmlydHVhbENvbXBvbmVudERvZXNOb3RIYXZlUm9vdEh0bWxFbGVtZW50LFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnVmlydHVhbCBjb21wb25lbnQgZG9lcyBub3QgaGF2ZSBnZXR0ZXIgXCJyb290SHRtbEVsZW1lbnRcIicsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBJdGVtQ29uZmlnSXNOb3RUeXBlQ29tcG9uZW50OiB7XHJcbiAgICAgICAgICAgIGlkOiBJMThuU3RyaW5nSWQuSXRlbUNvbmZpZ0lzTm90VHlwZUNvbXBvbmVudCxcclxuICAgICAgICAgICAgZGVmYXVsdDogJ0l0ZW1Db25maWcgaXMgbm90IG9mIHR5cGUgY29tcG9uZW50JyxcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBJbnZhbGlkTnVtYmVyUGFydEluU2l6ZVN0cmluZzoge1xyXG4gICAgICAgICAgICBpZDogSTE4blN0cmluZ0lkLkludmFsaWROdW1iZXJQYXJ0SW5TaXplU3RyaW5nLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnSW52YWxpZCBudW1iZXIgcGFydCBpbiBzaXplIHN0cmluZycsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBVbmtub3duVW5pdEluU2l6ZVN0cmluZzoge1xyXG4gICAgICAgICAgICBpZDogSTE4blN0cmluZ0lkLlVua25vd25Vbml0SW5TaXplU3RyaW5nLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnVW5rbm93biB1bml0IGluIHNpemUgc3RyaW5nJyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIFVuc3VwcG9ydGVkVW5pdEluU2l6ZVN0cmluZzoge1xyXG4gICAgICAgICAgICBpZDogSTE4blN0cmluZ0lkLlVuc3VwcG9ydGVkVW5pdEluU2l6ZVN0cmluZyxcclxuICAgICAgICAgICAgZGVmYXVsdDogJ1Vuc3VwcG9ydGVkIHVuaXQgaW4gc2l6ZSBzdHJpbmcnLFxyXG4gICAgICAgIH0sXHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGNvbnN0IGlkQ291bnQgPSBPYmplY3Qua2V5cyhpbmZvc09iamVjdCkubGVuZ3RoO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3QgaW5mb3MgPSBPYmplY3QudmFsdWVzKGluZm9zT2JqZWN0KTtcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY2hlY2tJbml0aWFsaXNlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghaW5pdGlhbGlzZWQpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZENvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZm8gPSBpbmZvc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmZvLmlkICE9PSBpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdJTlNJMDAxMTAnLCBgJHtpfTogJHtpbmZvLmlkfWApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpMThuU3RyaW5nc1tpXSA9IGluZm8uZGVmYXVsdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpbml0aWFsaXNlZCA9IHRydWU7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBjb25zdCBpMThuU3RyaW5ncyA9IG5ldyBBcnJheTxzdHJpbmc+KEkxOG5TdHJpbmdzLmlkQ291bnQpO1xyXG4iLCIvKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFN0eWxlQ29uc3RhbnRzIHtcclxuICAgIGV4cG9ydCBjb25zdCBkZWZhdWx0Q29tcG9uZW50QmFzZVpJbmRleCA9ICdhdXRvJztcclxuICAgIGV4cG9ydCBjb25zdCBkZWZhdWx0Q29tcG9uZW50RHJhZ1pJbmRleCA9ICczMic7XHJcbiAgICBleHBvcnQgY29uc3QgZGVmYXVsdENvbXBvbmVudFN0YWNrTWF4aW1pc2VkWkluZGV4ID0gJzQxJztcclxufVxyXG4iLCJpbXBvcnQgeyBVbnJlYWNoYWJsZUNhc2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IFN0eWxlQ29uc3RhbnRzIH0gZnJvbSAnLi9zdHlsZS1jb25zdGFudHMnO1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgdHlwZSBXaWR0aE9ySGVpZ2h0UHJvcGVydHlOYW1lID0gJ3dpZHRoJyB8ICdoZWlnaHQnO1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFdpZHRoT3JIZWlnaHRQcm9wZXJ0eU5hbWUge1xyXG4gICAgZXhwb3J0IGNvbnN0IHdpZHRoID0gJ3dpZHRoJztcclxuICAgIGV4cG9ydCBjb25zdCBoZWlnaHQgPSAnaGVpZ2h0JztcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFdpZHRoQW5kSGVpZ2h0IHtcclxuICAgIHdpZHRoOiBudW1iZXI7XHJcbiAgICBoZWlnaHQ6IG51bWJlcjtcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIExlZnRBbmRUb3Age1xyXG4gICAgbGVmdDogbnVtYmVyO1xyXG4gICAgdG9wOiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCB0eXBlIFNpZGUgPSAndG9wJyB8ICdsZWZ0JyB8ICdyaWdodCcgfCAnYm90dG9tJztcclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBTaWRlIHtcclxuICAgIGV4cG9ydCBjb25zdCB0b3AgPSAndG9wJztcclxuICAgIGV4cG9ydCBjb25zdCBsZWZ0ID0gJ2xlZnQnO1xyXG4gICAgZXhwb3J0IGNvbnN0IHJpZ2h0ID0gJ3JpZ2h0JztcclxuICAgIGV4cG9ydCBjb25zdCBib3R0b20gPSAnYm90dG9tJztcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IHR5cGUgTG9naWNhbFpJbmRleCA9ICdiYXNlJyB8ICdkcmFnJyB8ICdzdGFja01heGltaXNlZCc7XHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgTG9naWNhbFpJbmRleCB7XHJcbiAgICBleHBvcnQgY29uc3QgYmFzZSA9ICdiYXNlJztcclxuICAgIGV4cG9ydCBjb25zdCBkcmFnID0gJ2RyYWcnO1xyXG4gICAgZXhwb3J0IGNvbnN0IHN0YWNrTWF4aW1pc2VkID0gJ3N0YWNrTWF4aW1pc2VkJztcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGNvbnN0IExvZ2ljYWxaSW5kZXhUb0RlZmF1bHRNYXAgPSB7XHJcbiAgICBiYXNlOiBTdHlsZUNvbnN0YW50cy5kZWZhdWx0Q29tcG9uZW50QmFzZVpJbmRleCxcclxuICAgIGRyYWc6IFN0eWxlQ29uc3RhbnRzLmRlZmF1bHRDb21wb25lbnREcmFnWkluZGV4LFxyXG4gICAgc3RhY2tNYXhpbWlzZWQ6IFN0eWxlQ29uc3RhbnRzLmRlZmF1bHRDb21wb25lbnRTdGFja01heGltaXNlZFpJbmRleCxcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlY3Qge1xyXG4gICAgbGVmdDogbnVtYmVyLFxyXG4gICAgdG9wOiBudW1iZXIsXHJcbiAgICB3aWR0aDogbnVtYmVyLFxyXG4gICAgaGVpZ2h0OiBudW1iZXIsXHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGludGVyZmFjZSBBcmVhTGlua2VkUmVjdCB7XHJcbiAgICB4MTogbnVtYmVyLCAvLyBsZWZ0XHJcbiAgICB4MjogbnVtYmVyLCAvLyBuZXh0TGVmdFxyXG4gICAgeTE6IG51bWJlciwgLy8gdG9wXHJcbiAgICB5MjogbnVtYmVyLCAvLyBuZXh0VG9wXHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXHJcbmV4cG9ydCB0eXBlIEpzb25WYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIHwgSnNvbiB8IG9iamVjdCB8IEpzb25WYWx1ZUFycmF5O1xyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEpzb24ge1xyXG4gICAgW25hbWU6IHN0cmluZ106IEpzb25WYWx1ZTtcclxufVxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgdHlwZSBKc29uVmFsdWVBcnJheSA9IEFycmF5PEpzb25WYWx1ZT5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBKc29uVmFsdWUge1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzSnNvbih2YWx1ZTogSnNvblZhbHVlKTogdmFsdWUgaXMgSnNvbiB7XHJcbiAgICAgICAgcmV0dXJuIGlzSnNvbk9iamVjdCh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0pzb25PYmplY3QodmFsdWU6IEpzb25WYWx1ZSk6IHZhbHVlIGlzIEpzb24gfCBvYmplY3Qge1xyXG4gICAgICAgIHJldHVybiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JztcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IHR5cGUgSXRlbVR5cGUgPSAnZ3JvdW5kJyB8ICdyb3cnIHwgJ2NvbHVtbicgfCAnc3RhY2snIHwgJ2NvbXBvbmVudCc7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIEl0ZW1UeXBlIHtcclxuICAgIGV4cG9ydCBjb25zdCBncm91bmQgPSAnZ3JvdW5kJztcclxuICAgIGV4cG9ydCBjb25zdCByb3cgPSAncm93JztcclxuICAgIGV4cG9ydCBjb25zdCBjb2x1bW4gPSAnY29sdW1uJztcclxuICAgIGV4cG9ydCBjb25zdCBzdGFjayA9ICdzdGFjayc7XHJcbiAgICBleHBvcnQgY29uc3QgY29tcG9uZW50ID0gJ2NvbXBvbmVudCc7XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCB0eXBlIFJlc3BvbnNpdmVNb2RlID0gJ25vbmUnIHwgJ2Fsd2F5cycgfCAnb25sb2FkJztcclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSZXNwb25zaXZlTW9kZSB7XHJcbiAgICBleHBvcnQgY29uc3Qgbm9uZSA9ICdub25lJztcclxuICAgIGV4cG9ydCBjb25zdCBhbHdheXMgPSAnYWx3YXlzJztcclxuICAgIGV4cG9ydCBjb25zdCBvbmxvYWQgPSAnb25sb2FkJztcclxufVxyXG5cclxuLyoqXHJcbiAqIExlbmd0aCB1bml0cyB3aGljaCBjYW4gc3BlY2lmeSB0aGUgc2l6ZSBvZiBhIENvbXBvbmVudCBJdGVtXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCB0eXBlIFNpemVVbml0ID0gJ3B4JyB8ICclJyB8ICdmcicgfCAnZW0nO1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGVudW0gU2l6ZVVuaXRFbnVtIHtcclxuICAgIFBpeGVsID0gJ3B4JyxcclxuICAgIFBlcmNlbnQgPSAnJScsXHJcbiAgICBGcmFjdGlvbmFsID0gJ2ZyJyxcclxuICAgIEVtID0gJ2VtJyxcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBTaXplVW5pdEVudW0ge1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHRyeVBhcnNlKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgU2l6ZVVuaXRFbnVtLlBpeGVsOiByZXR1cm4gU2l6ZVVuaXRFbnVtLlBpeGVsO1xyXG4gICAgICAgICAgICBjYXNlIFNpemVVbml0RW51bS5QZXJjZW50OiByZXR1cm4gU2l6ZVVuaXRFbnVtLlBlcmNlbnQ7XHJcbiAgICAgICAgICAgIGNhc2UgU2l6ZVVuaXRFbnVtLkZyYWN0aW9uYWw6IHJldHVybiBTaXplVW5pdEVudW0uRnJhY3Rpb25hbDtcclxuICAgICAgICAgICAgY2FzZSBTaXplVW5pdEVudW0uRW06IHJldHVybiBTaXplVW5pdEVudW0uRW07XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmb3JtYXQodmFsdWU6IFNpemVVbml0RW51bSkge1xyXG4gICAgICAgIHN3aXRjaCAodmFsdWUpIHtcclxuICAgICAgICAgICAgY2FzZSBTaXplVW5pdEVudW0uUGl4ZWw6IHJldHVybiBTaXplVW5pdEVudW0uUGl4ZWw7XHJcbiAgICAgICAgICAgIGNhc2UgU2l6ZVVuaXRFbnVtLlBlcmNlbnQ6IHJldHVybiBTaXplVW5pdEVudW0uUGVyY2VudDtcclxuICAgICAgICAgICAgY2FzZSBTaXplVW5pdEVudW0uRnJhY3Rpb25hbDogcmV0dXJuIFNpemVVbml0RW51bS5GcmFjdGlvbmFsO1xyXG4gICAgICAgICAgICBjYXNlIFNpemVVbml0RW51bS5FbTogcmV0dXJuIFNpemVVbml0RW51bS5FbTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlYWNoYWJsZUNhc2VFcnJvcignU1VFRjQ0OTk4JywgdmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBMZWZ0QW5kVG9wLCBXaWR0aEFuZEhlaWdodCB9IGZyb20gJy4vdHlwZXMnO1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbnVtYmVyVG9QaXhlbHModmFsdWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoMTApICsgJ3B4JztcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcGl4ZWxzVG9OdW1iZXIodmFsdWU6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBjb25zdCBudW1iZXJTdHIgPSB2YWx1ZS5yZXBsYWNlKFwicHhcIiwgXCJcIik7XHJcbiAgICByZXR1cm4gcGFyc2VGbG9hdChudW1iZXJTdHIpO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3BsaXRTdHJpbmdBdEZpcnN0Tm9uTnVtZXJpY0NoYXJSZXN1bHQge1xyXG4gICAgbnVtZXJpY1BhcnQ6IHN0cmluZztcclxuICAgIGZpcnN0Tm9uTnVtZXJpY0NoYXJQYXJ0OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0U3RyaW5nQXRGaXJzdE5vbk51bWVyaWNDaGFyKHZhbHVlOiBzdHJpbmcpOiBTcGxpdFN0cmluZ0F0Rmlyc3ROb25OdW1lcmljQ2hhclJlc3VsdCB7XHJcbiAgICB2YWx1ZSA9IHZhbHVlLnRyaW1TdGFydCgpO1xyXG5cclxuICAgIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcclxuICAgIGlmIChsZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXR1cm4geyBudW1lcmljUGFydDogJycsIGZpcnN0Tm9uTnVtZXJpY0NoYXJQYXJ0OiAnJyB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBmaXJzdE5vbkRpZ2l0UGFydEluZGV4ID0gbGVuZ3RoO1xyXG4gICAgICAgIGxldCBnb3REZWNpbWFsUG9pbnQgPSBmYWxzZTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSB2YWx1ZVtpXTtcclxuICAgICAgICAgICAgaWYgKCFpc0RpZ2l0KGNoYXIpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hhciAhPT0gJy4nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3ROb25EaWdpdFBhcnRJbmRleCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChnb3REZWNpbWFsUG9pbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3ROb25EaWdpdFBhcnRJbmRleCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvdERlY2ltYWxQb2ludCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGRpZ2l0c1BhcnQgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgZmlyc3ROb25EaWdpdFBhcnRJbmRleCk7XHJcbiAgICAgICAgY29uc3QgZmlyc3ROb25EaWdpdFBhcnQgPSB2YWx1ZS5zdWJzdHJpbmcoZmlyc3ROb25EaWdpdFBhcnRJbmRleCkudHJpbSgpO1xyXG5cclxuICAgICAgICByZXR1cm4geyBudW1lcmljUGFydDogZGlnaXRzUGFydCwgZmlyc3ROb25OdW1lcmljQ2hhclBhcnQ6IGZpcnN0Tm9uRGlnaXRQYXJ0IH07XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzRGlnaXQoY2hhcjogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gY2hhciA+PSAnMCcgJiYgY2hhciA8PSAnOSc7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEVsZW1lbnRXaWR0aChlbGVtZW50OiBIVE1MRWxlbWVudCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gZWxlbWVudC5vZmZzZXRXaWR0aDtcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2V0RWxlbWVudFdpZHRoKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCB3aWR0aDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCB3aWR0aEFzUGl4ZWxzID0gbnVtYmVyVG9QaXhlbHMoTWF0aC5tYXgoMCwgd2lkdGgpKTtcclxuICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSB3aWR0aEFzUGl4ZWxzO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50SGVpZ2h0KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogbnVtYmVyIHtcclxuICAgIHJldHVybiBlbGVtZW50Lm9mZnNldEhlaWdodDtcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2V0RWxlbWVudEhlaWdodChlbGVtZW50OiBIVE1MRWxlbWVudCwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IGhlaWdodEFzUGl4ZWxzID0gbnVtYmVyVG9QaXhlbHMoTWF0aC5tYXgoMCwgaGVpZ2h0KSk7XHJcbiAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IGhlaWdodEFzUGl4ZWxzO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50V2lkdGhBbmRIZWlnaHQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBXaWR0aEFuZEhlaWdodCB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHdpZHRoOiBlbGVtZW50Lm9mZnNldFdpZHRoLFxyXG4gICAgICAgIGhlaWdodDogZWxlbWVudC5vZmZzZXRIZWlnaHQsXHJcbiAgICB9O1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRXaW5kb3dUb3BMZWZ0Qm9yZGVyKHdpbmRvdzogV2luZG93IHwgdHlwZW9mIGdsb2JhbFRoaXMpOiBXaWR0aEFuZEhlaWdodCB7XHJcbiAgICBsZXQgaW5uZXJTY3JlZW5YOiBudW1iZXIgfCB1bmRlZmluZWQgPSAoPGFueT53aW5kb3cpLm1veklubmVyU2NyZWVuWDtcclxuICAgIGxldCBpbm5lclNjcmVlblk6IG51bWJlciB8IHVuZGVmaW5lZCA9ICg8YW55PndpbmRvdykubW96SW5uZXJTY3JlZW5ZO1xyXG4gICAgbGV0IGJvcmRlclg6IG51bWJlciwgYm9yZGVyWTogbnVtYmVyO1xyXG5cclxuICAgIGlmIChpbm5lclNjcmVlblggPT09IHVuZGVmaW5lZCB8fCBpbm5lclNjcmVlblkgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGJvcmRlclggPSAod2luZG93Lm91dGVyV2lkdGggLSB3aW5kb3cuaW5uZXJXaWR0aCkgLyAyOyAgICAgICAgLy8gQXNzdW1lIGxlZnQgLyByaWdodCBib3JkZXIgaXMgdGhlIHNhbWVcclxuICAgICAgICBib3JkZXJZID0gd2luZG93Lm91dGVySGVpZ2h0IC0gd2luZG93LmlubmVySGVpZ2h0IC0gYm9yZGVyWDsgIC8vIEFzc3VtZSBib3R0b20gYm9yZGVyIGlzIHRoZSBzYW1lIGFzIGxlZnQgLyByaWdodFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBib3JkZXJYID0gaW5uZXJTY3JlZW5YIC0gd2luZG93LnNjcmVlblg7XHJcbiAgICAgICAgYm9yZGVyWSA9IGlubmVyU2NyZWVuWSAtIHdpbmRvdy5zY3JlZW5ZO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IHdpZHRoOiBNYXRoLm1heCgwLCBib3JkZXJYKSwgaGVpZ2h0OiBNYXRoLm1heCgwLCBib3JkZXJZKSB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFdpbmRvd0lubmVyU2NyZWVuUG9zaXRpb24od2luZG93OiBXaW5kb3cgfCB0eXBlb2YgZ2xvYmFsVGhpcyk6IExlZnRBbmRUb3Age1xyXG4gICAgbGV0IGlubmVyU2NyZWVuWDogbnVtYmVyIHwgdW5kZWZpbmVkID0gKDxhbnk+d2luZG93KS5tb3pJbm5lclNjcmVlblg7XHJcbiAgICBsZXQgaW5uZXJTY3JlZW5ZOiBudW1iZXIgfCB1bmRlZmluZWQgPSAoPGFueT53aW5kb3cpLm1veklubmVyU2NyZWVuWTtcclxuXHJcbiAgICBpZiAoaW5uZXJTY3JlZW5YID09PSB1bmRlZmluZWQgfHwgaW5uZXJTY3JlZW5ZID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zdCBib3JkZXIgPSBnZXRXaW5kb3dUb3BMZWZ0Qm9yZGVyKHdpbmRvdyk7XHJcbiAgICAgICAgaW5uZXJTY3JlZW5YID0gd2luZG93LnNjcmVlblggKyBib3JkZXIud2lkdGg7XHJcbiAgICAgICAgaW5uZXJTY3JlZW5ZID0gd2luZG93LnNjcmVlblkgKyBib3JkZXIuaGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IGxlZnQ6IGlubmVyU2NyZWVuWCwgdG9wOiBpbm5lclNjcmVlblkgfTtcclxufVxyXG5cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNldEVsZW1lbnREaXNwbGF5VmlzaWJpbGl0eShlbGVtZW50OiBIVE1MRWxlbWVudCwgdmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHZpc2libGUpIHtcclxuICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVFbGVtZW50UG9zaXRpb25BYnNvbHV0ZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgYWJzb2x1dGVQb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICBpZiAoZWxlbWVudC5zdHlsZS5wb3NpdGlvbiAhPT0gYWJzb2x1dGVQb3NpdGlvbikge1xyXG4gICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBhYnNvbHV0ZVBvc2l0aW9uO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogUmVwbGFjZW1lbnQgZm9yIEpRdWVyeSAkLmV4dGVuZCh0YXJnZXQsIG9iailcclxuICogQGludGVybmFsXHJcbiovXHJcbmV4cG9ydCBmdW5jdGlvbiBleHRlbmQodGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xyXG4gICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgICAgICB0YXJnZXRba2V5XSA9IG9ialtrZXldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0YXJnZXQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXBsYWNlbWVudCBmb3IgSlF1ZXJ5ICQuZXh0ZW5kKHRydWUsIHRhcmdldCwgb2JqKVxyXG4gKiBAaW50ZXJuYWxcclxuKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBFeHRlbmQodGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcclxuICAgIGlmIChvYmogIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xyXG4gICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1RhcmdldCA9IHRhcmdldFtrZXldO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBkZWVwRXh0ZW5kVmFsdWUoZXhpc3RpbmdUYXJnZXQsIHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGFyZ2V0O1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWVwRXh0ZW5kVmFsdWUoZXhpc3RpbmdUYXJnZXQ6IHVua25vd24sIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0QXJyYXkgPSBuZXcgQXJyYXk8dW5rbm93bj4obGVuZ3RoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHZhbHVlW2ldO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0QXJyYXlbaV0gPSBkZWVwRXh0ZW5kVmFsdWUoe30sIGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXRBcnJheTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVPYmogPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1RhcmdldCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZXBFeHRlbmQoe30sIHZhbHVlT2JqKTsgLy8gb3ZlcndyaXRlXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXhpc3RpbmdUYXJnZXQgIT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZXBFeHRlbmQoe30sIHZhbHVlT2JqKTsgLy8gb3ZlcndyaXRlXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXhpc3RpbmdUYXJnZXQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVlcEV4dGVuZCh7fSwgdmFsdWVPYmopOyAvLyBvdmVyd3JpdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1RhcmdldCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWVwRXh0ZW5kKHt9LCB2YWx1ZU9iaik7IC8vIG92ZXJ3cml0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1RhcmdldE9iaiA9IGV4aXN0aW5nVGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWVwRXh0ZW5kKGV4aXN0aW5nVGFyZ2V0T2JqLCB2YWx1ZU9iaik7IC8vIG1lcmdlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUZyb21BcnJheTxUPihpdGVtOiBULCBhcnJheTogVFtdKTogdm9pZCB7XHJcbiAgICBjb25zdCBpbmRleCA9IGFycmF5LmluZGV4T2YoaXRlbSk7XHJcblxyXG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCByZW1vdmUgaXRlbSBmcm9tIGFycmF5LiBJdGVtIGlzIG5vdCBpbiB0aGUgYXJyYXknKTtcclxuICAgIH1cclxuXHJcbiAgICBhcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRVbmlxdWVJZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIChNYXRoLnJhbmRvbSgpICogMTAwMDAwMDAwMDAwMDAwMClcclxuICAgICAgICAudG9TdHJpbmcoMzYpXHJcbiAgICAgICAgLnJlcGxhY2UoJy4nLCAnJyk7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEVycm9yTWVzc2FnZShlOiB1bmtub3duKTogc3RyaW5nIHtcclxuICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcclxuICAgICAgICByZXR1cm4gZS5tZXNzYWdlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodHlwZW9mIGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnVW5rbm93biBFcnJvcic7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IExheW91dENvbmZpZyB9IGZyb20gJy4vY29uZmlnL2NvbmZpZyc7XHJcbmltcG9ydCB7IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZywgUmVzb2x2ZWRMYXlvdXRDb25maWcsIFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnIH0gZnJvbSAnLi9jb25maWcvcmVzb2x2ZWQtY29uZmlnJztcclxuaW1wb3J0IHsgQ29tcG9uZW50Q29udGFpbmVyIH0gZnJvbSAnLi9jb250YWluZXIvY29tcG9uZW50LWNvbnRhaW5lcic7XHJcbmltcG9ydCB7IEJpbmRFcnJvciB9IGZyb20gJy4vZXJyb3JzL2V4dGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yIH0gZnJvbSAnLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IERvbUNvbnN0YW50cyB9IGZyb20gJy4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IEkxOG5TdHJpbmdJZCwgaTE4blN0cmluZ3MgfSBmcm9tICcuL3V0aWxzL2kxOG4tc3RyaW5ncyc7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY2xhc3MgVmlydHVhbExheW91dCBleHRlbmRzIExheW91dE1hbmFnZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS5iaW5kQ29tcG9uZW50RXZlbnR9IGFuZFxyXG4gICAgICoge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS51bmJpbmRDb21wb25lbnRFdmVudH0gd2l0aCB2aXJ0dWFsIGNvbXBvbmVudHNcclxuICAgICAqL1xyXG4gICAgZ2V0Q29tcG9uZW50RXZlbnQ6IFZpcnR1YWxMYXlvdXQuR2V0Q29tcG9uZW50RXZlbnRIYW5kbGVyIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS5iaW5kQ29tcG9uZW50RXZlbnR9IGFuZFxyXG4gICAgICoge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS51bmJpbmRDb21wb25lbnRFdmVudH0gd2l0aCB2aXJ0dWFsIGNvbXBvbmVudHNcclxuICAgICAqL1xyXG4gICAgcmVsZWFzZUNvbXBvbmVudEV2ZW50OiBWaXJ0dWFsTGF5b3V0LlJlbGVhc2VDb21wb25lbnRFdmVudEhhbmRsZXIgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgYmluZENvbXBvbmVudEV2ZW50OiBWaXJ0dWFsTGF5b3V0LkJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgfCB1bmRlZmluZWQ7XHJcbiAgICB1bmJpbmRDb21wb25lbnRFdmVudDogVmlydHVhbExheW91dC5VbmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCB1c2Ugd2hpbGUgY29uc3RydWN0b3IgaXMgbm90IGRldGVybWluYXRlICovXHJcbiAgICBwcml2YXRlIF9iaW5kQ29tcG9uZW50RXZlbnRIYW5sZGVyUGFzc2VkSW5Db25zdHJ1Y3RvciA9IGZhbHNlOyAvLyByZW1vdmUgd2hlbiBjb25zdHJ1Y3RvciBpcyBkZXRlcm1pbmF0ZVxyXG4gICAgLyoqIEBpbnRlcm5hbCAgQGRlcHJlY2F0ZWQgdXNlIHdoaWxlIGNvbnN0cnVjdG9yIGlzIG5vdCBkZXRlcm1pbmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBfY3JlYXRpb25UaW1lb3V0UGFzc2VkID0gZmFsc2U7IC8vIHJlbW92ZSB3aGVuIGNvbnN0cnVjdG9yIGlzIGRldGVybWluYXRlXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0gY29udGFpbmVyIC0gQSBEb20gSFRNTCBlbGVtZW50LiBEZWZhdWx0cyB0byBib2R5XHJcbiAgICAgKiBAcGFyYW0gYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgdG8gYmluZCBjb21wb25lbnRzXHJcbiAgICAgKiBAcGFyYW0gYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgdG8gdW5iaW5kIGNvbXBvbmVudHNcclxuICAgICAqIElmIGJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgaXMgZGVmaW5lZCwgdGhlbiBjb25zdHJ1Y3RvciB3aWxsIGJlIGRldGVybWluYXRlLiBJdCB3aWxsIGFsd2F5cyBjYWxsIHRoZSBpbml0KClcclxuICAgICAqIGZ1bmN0aW9uIGFuZCB0aGUgaW5pdCgpIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIGNvbXBsZXRlLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgd2lsbCBiZSBjYWxsZWRcclxuICAgICAqIGlmIGNvbnN0cnVjdG9yIGlzIGZvciBhIHBvcG91dCB3aW5kb3cuIE1ha2Ugc3VyZSBiaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIGlzIHJlYWR5IGZvciBldmVudHMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50LFxyXG4gICAgICAgIGJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI/OiBWaXJ0dWFsTGF5b3V0LkJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsXHJcbiAgICAgICAgdW5iaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyPzogVmlydHVhbExheW91dC5VbmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsXHJcbiAgICApO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIHNwZWNpZnkgbGF5b3V0Q29uZmlnIGluIHtAbGluayAoTGF5b3V0TWFuYWdlcjpjbGFzcykubG9hZExheW91dH0gKi9cclxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogTGF5b3V0Q29uZmlnLCBjb250YWluZXI/OiBIVE1MRWxlbWVudCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3Rvcihjb25maWdPck9wdGlvbmFsQ29udGFpbmVyOiBMYXlvdXRDb25maWcgfCBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCxcclxuICAgICAgICBjb250YWluZXJPckJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI6IEhUTUxFbGVtZW50IHwgVmlydHVhbExheW91dC5CaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIHVuYmluZENvbXBvbmVudEV2ZW50SGFuZGxlcjogVmlydHVhbExheW91dC5VbmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgc2tpcEluaXQ6IHRydWUsXHJcbiAgICApO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IoY29uZmlnT3JPcHRpb25hbENvbnRhaW5lcjogTGF5b3V0Q29uZmlnIHwgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgY29udGFpbmVyT3JCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyPzogSFRNTEVsZW1lbnQgfCBWaXJ0dWFsTGF5b3V0LkJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsXHJcbiAgICAgICAgdW5iaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyPzogVmlydHVhbExheW91dC5VbmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsXHJcbiAgICAgICAgc2tpcEluaXQ/OiB0cnVlLFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoVmlydHVhbExheW91dC5jcmVhdGVMYXlvdXRNYW5hZ2VyQ29uc3RydWN0b3JQYXJhbWV0ZXJzKGNvbmZpZ09yT3B0aW9uYWxDb250YWluZXIsIGNvbnRhaW5lck9yQmluZENvbXBvbmVudEV2ZW50SGFuZGxlcikpO1xyXG5cclxuICAgICAgICBpZiAoY29udGFpbmVyT3JCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250YWluZXJPckJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmluZENvbXBvbmVudEV2ZW50ID0gY29udGFpbmVyT3JCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYmluZENvbXBvbmVudEV2ZW50SGFubGRlclBhc3NlZEluQ29uc3RydWN0b3IgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh1bmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudW5iaW5kQ29tcG9uZW50RXZlbnQgPSB1bmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fYmluZENvbXBvbmVudEV2ZW50SGFubGRlclBhc3NlZEluQ29uc3RydWN0b3IpIHtcclxuICAgICAgICAgICAgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNTdWJXaW5kb3cpIHtcclxuICAgICAgICAgICAgICAgIC8vIGRvY3VtZW50LmJvZHkuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xyXG4gICAgICAgICAgICAgICAgLy8gU2V0IHVwIGxheW91dENvbmZpZyBzaW5jZSBjb25zdHJ1Y3RvciBpcyBub3QgZGV0ZXJtaW5hdGUgYW5kIG1heSBleGl0IGVhcmx5LiBPdGhlciBmdW5jdGlvbnMgbWF5IG5lZWRcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMubGF5b3V0Q29uZmlnLiB0aGlzLmxheW91dENvbmZpZyBpcyBhZ2FpbiBjYWxjdWxhdGVkIGluIHRoZSBzYW1lIHdheSB3aGVuIGluaXQoKSBjb21wbGV0ZXMuXHJcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhpcyB3aGVuIGNvbnN0cnVjdG9yIGlzIGRldGVybWluYXRlLlxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnN0cnVjdG9yT3JTdWJXaW5kb3dMYXlvdXRDb25maWcgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ1ZMQzk4ODIzJyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkTGF5b3V0Q29uZmlnID0gTGF5b3V0Q29uZmlnLnJlc29sdmUodGhpcy5fY29uc3RydWN0b3JPclN1YldpbmRvd0xheW91dENvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHJvb3QgZnJvbSBsYXlvdXRDb25maWdcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dENvbmZpZyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmVzb2x2ZWRMYXlvdXRDb25maWcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3Q6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChza2lwSW5pdCAhPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZGVwcmVjYXRlZENvbnN0cnVjdG9yKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYmluZENvbXBvbmVudEV2ZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMudW5iaW5kQ29tcG9uZW50RXZlbnQgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIHRoZSBhY3R1YWwgbGF5b3V0LiBNdXN0IGJlIGNhbGxlZCBhZnRlciBhbGwgaW5pdGlhbCBjb21wb25lbnRzXHJcbiAgICAgKiBhcmUgcmVnaXN0ZXJlZC4gUmVjdXJzZXMgdGhyb3VnaCB0aGUgY29uZmlndXJhdGlvbiBhbmQgc2V0cyB1cFxyXG4gICAgICogdGhlIGl0ZW0gdHJlZS5cclxuICAgICAqXHJcbiAgICAgKiBJZiBjYWxsZWQgYmVmb3JlIHRoZSBkb2N1bWVudCBpcyByZWFkeSBpdCBhZGRzIGl0c2VsZiBhcyBhIGxpc3RlbmVyXHJcbiAgICAgKiB0byB0aGUgZG9jdW1lbnQucmVhZHkgZXZlbnRcclxuICAgICAqIEBkZXByZWNhdGVkIExheW91dENvbmZpZyBzaG91bGQgbm90IGJlIGxvYWRlZCBpbiB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpfSBjb25zdHJ1Y3RvciwgYnV0IHJhdGhlciBpbiBhXHJcbiAgICAgKiB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpLmxvYWRMYXlvdXR9IGNhbGwuICBJZiBMYXlvdXRDb25maWcgaXMgbm90IHNwZWNpZmllZCBpbiB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpfSBjb25zdHJ1Y3RvcixcclxuICAgICAqIHRoZW4gaW5pdCgpIHdpbGwgYmUgYXV0b21hdGljYWxseSBjYWxsZWQgaW50ZXJuYWxseSBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZXh0ZXJuYWxseS5cclxuICAgICAqL1xyXG4gICAgb3ZlcnJpZGUgaW5pdCgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdGhlIGRvY3VtZW50IGlzbid0IHJlYWR5IHlldCwgd2FpdCBmb3IgaXQuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKCF0aGlzLl9iaW5kQ29tcG9uZW50RXZlbnRIYW5sZGVyUGFzc2VkSW5Db25zdHJ1Y3RvciAmJiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnIHx8IGRvY3VtZW50LmJvZHkgPT09IG51bGwpKSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB0aGlzLmluaXQoKSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0aGlzIGlzIGEgc3Vid2luZG93LCB3YWl0IGEgZmV3IG1pbGxpc2Vjb25kcyBmb3IgdGhlIG9yaWdpbmFsXHJcbiAgICAgICAgICogcGFnZSdzIGpzIGNhbGxzIHRvIGJlIGV4ZWN1dGVkLCB0aGVuIHJlcGxhY2UgdGhlIGJvZGllcyBjb250ZW50XHJcbiAgICAgICAgICogd2l0aCBHb2xkZW5MYXlvdXRcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoIXRoaXMuX2JpbmRDb21wb25lbnRFdmVudEhhbmxkZXJQYXNzZWRJbkNvbnN0cnVjdG9yICYmIHRoaXMuaXNTdWJXaW5kb3cgPT09IHRydWUgJiYgIXRoaXMuX2NyZWF0aW9uVGltZW91dFBhc3NlZCkge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaW5pdCgpLCA3KTtcclxuICAgICAgICAgICAgdGhpcy5fY3JlYXRpb25UaW1lb3V0UGFzc2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNTdWJXaW5kb3cgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9iaW5kQ29tcG9uZW50RXZlbnRIYW5sZGVyUGFzc2VkSW5Db25zdHJ1Y3Rvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckh0bWxBbmRBZGp1c3RTdHlsZXNGb3JTdWJXaW5kb3coKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gRXhwb3NlIHRoaXMgaW5zdGFuY2Ugb24gdGhlIHdpbmRvdyBvYmplY3QgdG8gYWxsb3cgdGhlIG9wZW5pbmcgd2luZG93IHRvIGludGVyYWN0IHdpdGggaXRcclxuICAgICAgICAgICAgd2luZG93Ll9fZ2xJbnN0YW5jZSA9IHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdXBlci5pbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgZXhpc3RpbmcgSFRNTCBhbmQgYWRqdXN0cyBzdHlsZSB0byBtYWtlIHdpbmRvdyBzdWl0YWJsZSB0byBiZSBhIHBvcG91dCBzdWIgd2luZG93XHJcbiAgICAgKiBDdXJlbnRseSBpcyBhdXRvbWF0aWNhbGx5IGNhbGxlZCB3aGVuIHdpbmRvdyBpcyBhIHN1YldpbmRvdyBhbmQgYmluZENvbXBvbmVudEV2ZW50IGlzIG5vdCBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yXHJcbiAgICAgKiBJZiBiaW5kQ29tcG9uZW50RXZlbnQgaXMgbm90IHBhc3NlZCBpbiB0aGUgY29uc3RydWN0b3IsIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGVpdGhlciBjYWxsIHRoaXMgZnVuY3Rpb24gZXhwbGljaXRseSBvclxyXG4gICAgICogKHByZWZlcmFibHkpIG1ha2UgdGhlIHdpbmRvdyBzdWl0YWJsZSBhcyBhIHN1YndpbmRvdy5cclxuICAgICAqIEluIHRoZSBmdXR1cmUsIGl0IGlzIHBsYW5uZWQgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIE5PVCBhdXRvbWF0aWNhbGx5IGNhbGxlZCBpbiBhbnkgY2lyY3Vtc3RhbmNlcy4gIEFwcGxpY2F0aW9ucyB3aWxsXHJcbiAgICAgKiBuZWVkIHRvIGRldGVybWluZSB3aGV0aGVyIGEgd2luZG93IGlzIGEgR29sZGVuIExheW91dCBwb3BvdXQgd2luZG93IGFuZCBlaXRoZXIgY2FsbCB0aGlzIGZ1bmN0aW9uIGV4cGxpY2l0bHkgb3JcclxuICAgICAqIGhpZGUgSFRNTCBub3QgcmVsZXZhbnQgdG8gdGhlIHBvcG91dC5cclxuICAgICAqIFNlZSBhcGl0ZXN0IGZvciBhbiBleGFtcGxlIG9mIGhvdyBIVE1MIGlzIGhpZGRlbiB3aGVuIHBvcG91dCB3aW5kb3dzIGFyZSBkaXNwbGF5ZWRcclxuICAgICAqL1xyXG4gICAgY2xlYXJIdG1sQW5kQWRqdXN0U3R5bGVzRm9yU3ViV2luZG93KCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGhlYWRFbGVtZW50ID0gZG9jdW1lbnQuaGVhZDtcclxuXHJcbiAgICAgICAgY29uc3QgYXBwZW5kTm9kZUxpc3RzID0gbmV3IEFycmF5PE5vZGVMaXN0T2Y8RWxlbWVudD4+KDQpO1xyXG4gICAgICAgIGFwcGVuZE5vZGVMaXN0c1swXSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2JvZHkgbGluaycpO1xyXG4gICAgICAgIGFwcGVuZE5vZGVMaXN0c1sxXSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2JvZHkgc3R5bGUnKTtcclxuICAgICAgICBhcHBlbmROb2RlTGlzdHNbMl0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0ZW1wbGF0ZScpO1xyXG4gICAgICAgIGFwcGVuZE5vZGVMaXN0c1szXSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5nbF9rZWVwJyk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGxpc3RJZHggPSAwOyBsaXN0SWR4IDwgYXBwZW5kTm9kZUxpc3RzLmxlbmd0aDsgbGlzdElkeCsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFwcGVuZE5vZGVMaXN0ID0gYXBwZW5kTm9kZUxpc3RzW2xpc3RJZHhdO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBub2RlSWR4ID0gMDsgbm9kZUlkeCA8IGFwcGVuZE5vZGVMaXN0Lmxlbmd0aDsgbm9kZUlkeCsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gYXBwZW5kTm9kZUxpc3Rbbm9kZUlkeF07XHJcbiAgICAgICAgICAgICAgICBoZWFkRWxlbWVudC5hcHBlbmRDaGlsZChub2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYm9keUVsZW1lbnQgPSBkb2N1bWVudC5ib2R5O1xyXG4gICAgICAgIGJvZHlFbGVtZW50LmlubmVySFRNTCA9ICcnO1xyXG4gICAgICAgIGJvZHlFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XHJcbiAgICAgICAgdGhpcy5jaGVja0FkZERlZmF1bHRQb3BpbkJ1dHRvbigpO1xyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICogVGhpcyBzZWVtcyBhIGJpdCBwb2ludGxlc3MsIGJ1dCBhY3R1YWxseSBjYXVzZXMgYSByZWZsb3cvcmUtZXZhbHVhdGlvbiBnZXR0aW5nIGFyb3VuZFxyXG4gICAgICAgICogc2xpY2tncmlkJ3MgXCJDYW5ub3QgZmluZCBzdHlsZXNoZWV0LlwiIGJ1ZyBpbiBjaHJvbWVcclxuICAgICAgICAqL1xyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgICAgICBjb25zdCB4ID0gZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFdpbGwgYWRkIGJ1dHRvbiBpZiBub3QgcG9waW5PbkNsb3NlIHNwZWNpZmllZCBpbiBzZXR0aW5nc1xyXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBhZGRlZCBvdGhlcndpc2UgZmFsc2VcclxuICAgICAqL1xyXG4gICAgY2hlY2tBZGREZWZhdWx0UG9waW5CdXR0b24oKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0Q29uZmlnLnNldHRpbmdzLnBvcEluT25DbG9zZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgcG9wSW5CdXR0b25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIHBvcEluQnV0dG9uRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuUG9waW4pO1xyXG4gICAgICAgICAgICBwb3BJbkJ1dHRvbkVsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsIHRoaXMubGF5b3V0Q29uZmlnLmhlYWRlci5wb3Bpbik7XHJcbiAgICAgICAgICAgIGNvbnN0IGljb25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIGljb25FbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5JY29uKTtcclxuICAgICAgICAgICAgY29uc3QgYmdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIGJnRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuQmcpO1xyXG4gICAgICAgICAgICBwb3BJbkJ1dHRvbkVsZW1lbnQuYXBwZW5kQ2hpbGQoaWNvbkVsZW1lbnQpO1xyXG4gICAgICAgICAgICBwb3BJbkJ1dHRvbkVsZW1lbnQuYXBwZW5kQ2hpbGQoYmdFbGVtZW50KTtcclxuICAgICAgICAgICAgcG9wSW5CdXR0b25FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5lbWl0KCdwb3BJbicpKTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChwb3BJbkJ1dHRvbkVsZW1lbnQpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgYmluZENvbXBvbmVudChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgaXRlbUNvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKTogQ29tcG9uZW50Q29udGFpbmVyLkJpbmRhYmxlQ29tcG9uZW50IHtcclxuICAgICAgICBpZiAodGhpcy5iaW5kQ29tcG9uZW50RXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCBiaW5kYWJsZUNvbXBvbmVudCA9IHRoaXMuYmluZENvbXBvbmVudEV2ZW50KGNvbnRhaW5lciwgaXRlbUNvbmZpZyk7XHJcbiAgICAgICAgICAgIHJldHVybiBiaW5kYWJsZUNvbXBvbmVudDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5nZXRDb21wb25lbnRFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHZpcnR1YWw6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcy5nZXRDb21wb25lbnRFdmVudChjb250YWluZXIsIGl0ZW1Db25maWcpLFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gY29tcG9uZW50IHJlZ2lzdGVyZWQgZm9yIHRoaXMgdHlwZSwgYW5kIHdlIGRvbid0IGhhdmUgYSBnZXRDb21wb25lbnRFdmVudCBkZWZpbmVkLlxyXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aGUgdXNlciBwb3BzIG91dCBhIGRpYWxvZyBhbmQgdGhlIGNvbXBvbmVudCB0eXBlcyBhcmUgbm90IHJlZ2lzdGVyZWQgdXBmcm9udC5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuQ29tcG9uZW50VHlwZU5vdFJlZ2lzdGVyZWRBbmRCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyTm90QXNzaWduZWRdO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGAke3RleHR9OiAke0pTT04uc3RyaW5naWZ5KGl0ZW1Db25maWcpfWBcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBCaW5kRXJyb3IobWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgdW5iaW5kQ29tcG9uZW50KGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCB2aXJ0dWFsOiBib29sZWFuLCBjb21wb25lbnQ6IENvbXBvbmVudENvbnRhaW5lci5Db21wb25lbnQgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy51bmJpbmRDb21wb25lbnRFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudW5iaW5kQ29tcG9uZW50RXZlbnQoY29udGFpbmVyKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoIXZpcnR1YWwgJiYgdGhpcy5yZWxlYXNlQ29tcG9uZW50RXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignVkNVQ1JDVTMzMzk5OCcpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbGVhc2VDb21wb25lbnRFdmVudChjb250YWluZXIsIGNvbXBvbmVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgVmlydHVhbExheW91dCB7XHJcbiAgICAvKipcclxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB2aXJ0dWFsIGNvbXBvbmVudHMgd2l0aCB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLmJpbmRDb21wb25lbnRFdmVudH0gYW5kXHJcbiAgICAgKiB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLnVuYmluZENvbXBvbmVudEV2ZW50fSBldmVudHMuXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCB0eXBlIEdldENvbXBvbmVudEV2ZW50SGFuZGxlciA9XHJcbiAgICAgICAgKHRoaXM6IHZvaWQsIGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCBpdGVtQ29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpID0+IENvbXBvbmVudENvbnRhaW5lci5Db21wb25lbnQ7XHJcbiAgICAvKipcclxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB2aXJ0dWFsIGNvbXBvbmVudHMgd2l0aCB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLmJpbmRDb21wb25lbnRFdmVudH0gYW5kXHJcbiAgICAgKiB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLnVuYmluZENvbXBvbmVudEV2ZW50fSBldmVudHMuXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCB0eXBlIFJlbGVhc2VDb21wb25lbnRFdmVudEhhbmRsZXIgPVxyXG4gICAgICAgICh0aGlzOiB2b2lkLCBjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgY29tcG9uZW50OiBDb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50KSA9PiB2b2lkO1xyXG5cclxuICAgIGV4cG9ydCB0eXBlIEJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgPVxyXG4gICAgICAgICh0aGlzOiB2b2lkLCBjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgaXRlbUNvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKSA9PiBDb21wb25lbnRDb250YWluZXIuQmluZGFibGVDb21wb25lbnQ7XHJcbiAgICBleHBvcnQgdHlwZSBVbmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgPVxyXG4gICAgICAgICh0aGlzOiB2b2lkLCBjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lcikgPT4gdm9pZDtcclxuXHJcbiAgICBleHBvcnQgdHlwZSBCZWZvcmVWaXJ0dWFsUmVjdGluZ0V2ZW50ID0gKHRoaXM6IHZvaWQpID0+IHZvaWQ7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbFxyXG4gICAgICogVmVyaWFibGUgdG8gaG9sZCB0aGUgc3RhdGUgd2hldGhlciB3ZSBhbHJlYWR5IGNoZWNrZWQgaWYgd2UgYXJlIHJ1bm5pbmcgaW4gYSBzdWIgd2luZG93LlxyXG4gICAgICogRml4ZXMgcG9wb3V0IGFuZCBjcmVhdGlvbiBvZiBuZXN0ZWQgZ29sZGVuLWxheW91dHMuXHJcbiAgICAgKi9cclxuICAgIGxldCBzdWJXaW5kb3dDaGVja2VkID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxheW91dE1hbmFnZXJDb25zdHJ1Y3RvclBhcmFtZXRlcnMoY29uZmlnT3JPcHRpb25hbENvbnRhaW5lcjogTGF5b3V0Q29uZmlnIHwgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgY29udGFpbmVyT3JCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyPzogSFRNTEVsZW1lbnQgfCAgVmlydHVhbExheW91dC5CaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyKTpcclxuICAgICAgICBMYXlvdXRNYW5hZ2VyLkNvbnN0cnVjdG9yUGFyYW1ldGVyc1xyXG4gICAge1xyXG4gICAgICAgIGNvbnN0IHdpbmRvd0NvbmZpZ0tleSA9IHN1YldpbmRvd0NoZWNrZWQgPyBudWxsIDogbmV3IFVSTChkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KCdnbC13aW5kb3cnKTtcclxuICAgICAgICBzdWJXaW5kb3dDaGVja2VkID0gdHJ1ZTtcclxuICAgICAgICBjb25zdCBpc1N1YldpbmRvdyA9IHdpbmRvd0NvbmZpZ0tleSAhPT0gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IGNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGxldCBjb25maWc6IExheW91dENvbmZpZyB8IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAod2luZG93Q29uZmlnS2V5ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdpbmRvd0NvbmZpZ1N0ciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHdpbmRvd0NvbmZpZ0tleSk7XHJcbiAgICAgICAgICAgIGlmICh3aW5kb3dDb25maWdTdHIgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTnVsbCBnbC13aW5kb3cgQ29uZmlnJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0od2luZG93Q29uZmlnS2V5KTtcclxuICAgICAgICAgICAgY29uc3QgbWluaWZpZWRXaW5kb3dDb25maWcgPSBKU09OLnBhcnNlKHdpbmRvd0NvbmZpZ1N0cikgYXMgUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWc7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkQ29uZmlnID0gUmVzb2x2ZWRMYXlvdXRDb25maWcudW5taW5pZnlDb25maWcobWluaWZpZWRXaW5kb3dDb25maWcpO1xyXG4gICAgICAgICAgICBjb25maWcgPSBMYXlvdXRDb25maWcuZnJvbVJlc29sdmVkKHJlc29sdmVkQ29uZmlnKVxyXG5cclxuICAgICAgICAgICAgaWYgKGNvbmZpZ09yT3B0aW9uYWxDb250YWluZXIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyRWxlbWVudCA9IGNvbmZpZ09yT3B0aW9uYWxDb250YWluZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoY29uZmlnT3JPcHRpb25hbENvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25maWcgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnT3JPcHRpb25hbENvbnRhaW5lciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckVsZW1lbnQgPSBjb25maWdPck9wdGlvbmFsQ29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZ09yT3B0aW9uYWxDb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjb250YWluZXJFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJPckJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXJPckJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yT3JTdWJXaW5kb3dMYXlvdXRDb25maWc6IGNvbmZpZyxcclxuICAgICAgICAgICAgaXNTdWJXaW5kb3csXHJcbiAgICAgICAgICAgIGNvbnRhaW5lckVsZW1lbnQsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsImV4cG9ydCAqIGZyb20gJy4vdHMvY29uZmlnL2NvbmZpZyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vdHMvY29uZmlnL3Jlc29sdmVkLWNvbmZpZyc7XHJcbmV4cG9ydCB7IENvbXBvbmVudENvbnRhaW5lciB9IGZyb20gJy4vdHMvY29udGFpbmVyL2NvbXBvbmVudC1jb250YWluZXInO1xyXG5leHBvcnQgeyBCcm93c2VyUG9wb3V0IH0gZnJvbSAnLi90cy9jb250cm9scy9icm93c2VyLXBvcG91dCc7XHJcbmV4cG9ydCB7IERyYWdTb3VyY2UgfSBmcm9tICcuL3RzL2NvbnRyb2xzL2RyYWctc291cmNlJztcclxuZXhwb3J0IHsgSGVhZGVyIH0gZnJvbSAnLi90cy9jb250cm9scy9oZWFkZXInO1xyXG5leHBvcnQgeyBUYWIgfSBmcm9tICcuL3RzL2NvbnRyb2xzL3RhYic7XHJcbmV4cG9ydCAqIGZyb20gJy4vdHMvZXJyb3JzL2V4dGVybmFsLWVycm9yJztcclxuZXhwb3J0IHsgR29sZGVuTGF5b3V0IH0gZnJvbSAnLi90cy9nb2xkZW4tbGF5b3V0JztcclxuZXhwb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4vdHMvaXRlbXMvY29tcG9uZW50LWl0ZW0nO1xyXG5leHBvcnQgeyBDb250ZW50SXRlbSB9IGZyb20gJy4vdHMvaXRlbXMvY29udGVudC1pdGVtJztcclxuZXhwb3J0IHsgUm93T3JDb2x1bW4gfSBmcm9tICcuL3RzL2l0ZW1zL3Jvdy1vci1jb2x1bW4nO1xyXG5leHBvcnQgeyBTdGFjayB9IGZyb20gJy4vdHMvaXRlbXMvc3RhY2snO1xyXG5leHBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi90cy9sYXlvdXQtbWFuYWdlcic7XHJcbmV4cG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4vdHMvdXRpbHMvZXZlbnQtZW1pdHRlcic7XHJcbmV4cG9ydCB7IEV2ZW50SHViIH0gZnJvbSAnLi90cy91dGlscy9ldmVudC1odWInO1xyXG5leHBvcnQgKiBmcm9tICcuL3RzL3V0aWxzL2kxOG4tc3RyaW5ncyc7XHJcbmV4cG9ydCB7IFN0eWxlQ29uc3RhbnRzIH0gZnJvbSAnLi90cy91dGlscy9zdHlsZS1jb25zdGFudHMnO1xyXG5leHBvcnQgKiBmcm9tICcuL3RzL3V0aWxzL3R5cGVzJztcclxuZXhwb3J0IHsgVmlydHVhbExheW91dCB9IGZyb20gJy4vdHMvdmlydHVhbC1sYXlvdXQnO1xyXG5cclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/src/Aardvark.UI.Primitives/resources/golden-layout/bundle/umd/golden-layout.min.js b/src/Aardvark.UI.Primitives/resources/golden-layout/bundle/umd/golden-layout.min.js index e285dd43..acdd8982 100644 --- a/src/Aardvark.UI.Primitives/resources/golden-layout/bundle/umd/golden-layout.min.js +++ b/src/Aardvark.UI.Primitives/resources/golden-layout/bundle/umd/golden-layout.min.js @@ -1 +1 @@ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.goldenLayout=e():t.goldenLayout=e()}(globalThis,(()=>(()=>{"use strict";var t,e={d:(t,i)=>{for(var n in i)e.o(i,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},i={};e.r(i),e.d(i,{ApiError:()=>r,BindError:()=>a,BrowserPopout:()=>lt,ComponentContainer:()=>nt,ComponentItem:()=>ht,ComponentItemConfig:()=>W,ConfigurationError:()=>o,ContentItem:()=>rt,DragSource:()=>yt,EventEmitter:()=>it,EventHub:()=>bt,ExternalError:()=>n,GoldenLayout:()=>xt,Header:()=>gt,HeaderedItemConfig:()=>R,I18nStrings:()=>t,ItemConfig:()=>D,ItemType:()=>y,JsonValue:()=>C,LayoutConfig:()=>B,LayoutManager:()=>St,LogicalZIndex:()=>f,LogicalZIndexToDefaultMap:()=>v,PopoutBlockedError:()=>s,PopoutLayoutConfig:()=>O,ResolvedComponentItemConfig:()=>z,ResolvedGroundItemConfig:()=>P,ResolvedHeaderedItemConfig:()=>E,ResolvedItemConfig:()=>S,ResolvedLayoutConfig:()=>T,ResolvedPopoutLayoutConfig:()=>A,ResolvedRootItemConfig:()=>L,ResolvedRowOrColumnItemConfig:()=>M,ResolvedStackItemConfig:()=>x,ResponsiveMode:()=>w,RootItemConfig:()=>H,RowOrColumn:()=>at,RowOrColumnItemConfig:()=>U,Side:()=>_,SizeUnitEnum:()=>I,Stack:()=>_t,StackItemConfig:()=>k,StyleConstants:()=>p,Tab:()=>mt,VirtualLayout:()=>Et,WidthOrHeightPropertyName:()=>g,formatSize:()=>tt,formatUndefinableSize:()=>et,i18nStrings:()=>m,parseSize:()=>Q});class n extends Error{constructor(t,e){super(e),this.type=t}}class o extends n{constructor(t,e){super("Configuration",t),this.node=e}}class s extends n{constructor(t){super("PopoutBlocked",t)}}class r extends n{constructor(t){super("API",t)}}class a extends n{constructor(t){super("Bind",t)}}class l extends Error{constructor(t,e,i){super(`${t}: ${e}${void 0===i?"":": "+i}`)}}class h extends l{constructor(t,e){super("Assert",t,e)}}class d extends l{constructor(t,e,i){super("UnreachableCase",t,`${e}${void 0===i?"":": "+i}`)}}class c extends l{constructor(t,e){super("UnexpectedNull",t,e)}}class u extends l{constructor(t,e){super("UnexpectedUndefined",t,e)}}!function(t){let e=!1;const i={PopoutCannotBeCreatedWithGroundItemConfig:{id:0,default:"Popout cannot be created with ground ItemConfig"},PleaseRegisterAConstructorFunction:{id:1,default:"Please register a constructor function"},ComponentTypeNotRegisteredAndBindComponentEventHandlerNotAssigned:{id:2,default:"Component type not registered and BindComponentEvent handler not assigned"},ComponentIsAlreadyRegistered:{id:3,default:"Component is already registered"},ComponentIsNotVirtuable:{id:4,default:"Component is not virtuable. Requires rootHtmlElement field/getter"},VirtualComponentDoesNotHaveRootHtmlElement:{id:5,default:'Virtual component does not have getter "rootHtmlElement"'},ItemConfigIsNotTypeComponent:{id:6,default:"ItemConfig is not of type component"},InvalidNumberPartInSizeString:{id:7,default:"Invalid number part in size string"},UnknownUnitInSizeString:{id:8,default:"Unknown unit in size string"},UnsupportedUnitInSizeString:{id:9,default:"Unsupported unit in size string"}};t.idCount=Object.keys(i).length;const n=Object.values(i);t.checkInitialise=function(){if(!e)for(let e=0;e="0"&&t<="9"}function G(t,e){const i=F(e);t.style.width=i}function Z(t,e){const i=F(e);t.style.height=i}function q(t){return{width:t.offsetWidth,height:t.offsetHeight}}function j(t){let e,i,n=t.mozInnerScreenX,o=t.mozInnerScreenY;return void 0===n||void 0===o?(e=(t.outerWidth-t.innerWidth)/2,i=t.outerHeight-t.innerHeight-e):(e=n-t.screenX,i=o-t.screenY),{width:Math.max(0,e),height:Math.max(0,i)}}function $(t){let e=t.mozInnerScreenX,i=t.mozInnerScreenY;if(void 0===e||void 0===i){const n=j(t);e=t.screenX+n.width,i=t.screenY+n.height}return{left:e,top:i}}function X(t,e){t.style.display=e?"":"none"}function Y(t,e){if(void 0!==e)for(const i in e)if(e.hasOwnProperty(i)){const n=e[i],o=t[i];t[i]=J(o,n)}return t}function J(t,e){if("object"!=typeof e)return e;if(Array.isArray(e)){const t=e.length,i=new Array(t);for(let n=0;n36)throw new Error("Too many keys in config minifier map")},t.translateObject=n}(b||(b={})),function(t){t.defaults={type:y.ground,content:[],size:1,sizeUnit:I.Fractional,minSize:void 0,minSizeUnit:I.Pixel,id:"",isClosable:!0},t.createCopy=function(t,e){switch(t.type){case y.ground:case y.row:case y.column:return M.createCopy(t,e);case y.stack:return x.createCopy(t,e);case y.component:return z.createCopy(t);default:throw new d("CICC91354",t.type,"Invalid Config Item type specified")}},t.createDefault=function(t){switch(t){case y.ground:throw new h("CICCDR91562");case y.row:case y.column:return M.createDefault(t);case y.stack:return x.createDefault();case y.component:return z.createDefault();default:throw new d("CICCDD91563",t,"Invalid Config Item type specified")}},t.isComponentItem=function(t){return t.type===y.component},t.isStackItem=function(t){return t.type===y.stack},t.isGroundItem=function(t){return t.type===y.ground}}(S||(S={})),function(t){let e;t.defaultMaximised=!1,function(t){t.createCopy=function(t,e){return void 0===t?void 0:{show:null!=e?e:t.show,popout:t.popout,close:t.close,maximise:t.maximise,minimise:t.minimise,tabDropdown:t.tabDropdown}}}(e=t.Header||(t.Header={}))}(E||(E={})),function(t){function e(t){const e=t.length,i=new Array(e);for(let n=0;n"__glMaximised"===t));t>0&&(o=!0,n=n.splice(t,1)),e=n.length>0?n[0]:S.defaults.id}else e=n;return i=void 0!==t.maximised?t.maximised:o,{id:e,maximised:i}}}(R||(R={})),function(t){function e(t){if(void 0===t)return[];{const e=t.length,i=new Array(e);for(let n=0;n0?e.content[0]:void 0,{resolved:!0,root:H.resolve(i),openPopouts:t.resolveOpenPopouts(e.openPopouts),dimensions:t.Dimensions.resolve(e.dimensions),settings:t.Settings.resolve(e.settings),header:t.Header.resolve(e.header,e.settings,e.labels)}}},t.fromResolved=function(e){return{root:H.fromResolvedOrUndefined(e.root),openPopouts:O.fromResolvedArray(e.openPopouts),settings:T.Settings.createCopy(e.settings),dimensions:t.Dimensions.fromResolved(e.dimensions),header:T.Header.createCopy(e.header)}},t.isResolved=function(t){const e=t;return void 0!==e.resolved&&!0===e.resolved},t.resolveOpenPopouts=function(t){if(void 0===t)return[];{const e=t.length,i=new Array(e);for(let n=0;n0?e.content[0]:void 0,{root:H.resolve(o),openPopouts:B.resolveOpenPopouts(e.openPopouts),dimensions:B.Dimensions.resolve(e.dimensions),settings:B.Settings.resolve(e.settings),header:B.Header.resolve(e.header,e.settings,e.labels),parentId:null!==(i=e.parentId)&&void 0!==i?i:null,indexInParent:null!==(n=e.indexInParent)&&void 0!==n?n:null,window:t.Window.resolve(e.window,e.dimensions),resolved:!0}},t.fromResolved=function(e){return{root:H.fromResolvedOrUndefined(e.root),openPopouts:i(e.openPopouts),dimensions:B.Dimensions.fromResolved(e.dimensions),settings:T.Settings.createCopy(e.settings),header:T.Header.createCopy(e.header),parentId:e.parentId,indexInParent:e.indexInParent,window:t.Window.fromResolved(e.window)}},t.fromResolvedArray=i}(O||(O={}));class it{constructor(){this._allEventSubscriptions=[],this._subscriptionsMap=new Map,this.unbind=this.removeEventListener,this.trigger=this.emit}tryBubbleEvent(t,e){}emit(t,...e){let i=this._subscriptionsMap.get(t);if(void 0!==i){i=i.slice();for(let t=0;t0){const n=e.slice();n.unshift(t);const o=this._allEventSubscriptions.slice();for(let t=0;tthis.onPointerDown(t),this._pointerMoveEventListener=t=>this.onPointerMove(t),this._pointerUpEventListener=t=>this.onPointerUp(t),this._timeout=void 0,this._allowableTargets=[t,...e],this._oDocument=document,this._eBody=document.body,this._nDelay=1800,this._nDistance=10,this._originalEvent={pageX:0,pageY:0,screenX:0,screenY:0},this._dragging=!1,this._eElement.addEventListener("pointerdown",this._pointerDownEventListener,{passive:!0})}destroy(){this.checkRemovePointerTrackingEventListeners(),this._eElement.removeEventListener("pointerdown",this._pointerDownEventListener)}cancelDrag(){this.processDragStop(void 0)}onPointerDown(t){this._allowableTargets.includes(t.target)&&t.isPrimary&&this.processPointerDown(t)}processPointerDown(t){this._originalEvent=t,this._oDocument.addEventListener("pointermove",this._pointerMoveEventListener),this._oDocument.addEventListener("pointerup",this._pointerUpEventListener,{passive:!0}),this._eBody.classList.add("lm_pointer_tracking"),this._pointerTracking=!0,this._timeout=setTimeout((()=>{try{this.startDrag()}catch(t){throw console.error(t),t}}),this._nDelay)}onPointerMove(t){this._pointerTracking&&(this.processDragMove(t),t.preventDefault())}processDragMove(t){const e=t.pageX-this._originalEvent.pageX,i=t.pageY-this._originalEvent.pageY;!1===this._dragging&&(Math.abs(e)>this._nDistance||Math.abs(i)>this._nDistance)&&this.startDrag(),this._dragging&&this.emit("drag",e,i,t)}onPointerUp(t){this.processDragStop(t)}processDragStop(t){void 0!==this._timeout&&(clearTimeout(this._timeout),this._timeout=void 0),this.checkRemovePointerTrackingEventListeners(),!0===this._dragging&&(this._eBody.classList.remove("lm_dragging"),this._eElement.classList.remove("lm_dragging"),this._dragging=!1,this.emit("dragStop",t))}checkRemovePointerTrackingEventListeners(){this._pointerTracking&&(this._oDocument.removeEventListener("pointermove",this._pointerMoveEventListener),this._oDocument.removeEventListener("pointerup",this._pointerUpEventListener),this._eBody.classList.remove("lm_pointer_tracking"),this._pointerTracking=!1)}startDrag(){void 0!==this._timeout&&(clearTimeout(this._timeout),this._timeout=void 0),this._dragging=!0,this._eBody.classList.add("lm_dragging"),this._eElement.classList.add("lm_dragging"),this.emit("dragStart",this._originalEvent.pageX,this._originalEvent.pageY),this.emit("drag",0,0,this._originalEvent)}}class st{constructor(t,e,i){this._isVertical=t,this._size=e,this._grabSize=i0)this.updateSize(!1);else if(!this.isGround){if(null===this._parent)throw new c("CIUC00874");this._parent.removeChild(this)}}addChild(t,e,i){return null!=e||(e=this._contentItems.length),this._contentItems.splice(e,0,t),t.setParent(this),!0===this._isInitialised&&!1===t._isInitialised&&t.init(),e}replaceChild(t,e,i=!1){const n=this._contentItems.indexOf(t),o=t._element.parentNode;if(-1===n)throw new h("CIRCI23232","Can't replace child. oldChild is not child of this");if(null===o)throw new c("CIRCP23232");if(o.replaceChild(e._element,t._element),!0===i&&(t._parent=null,t.destroy()),this._contentItems[n]=e,e.setParent(this),e.size=t.size,e.sizeUnit=t.sizeUnit,e.minSize=t.minSize,e.minSizeUnit=t.minSizeUnit,null===e._parent)throw new c("CIRCNC45699");!0===e._parent._isInitialised&&!1===e._isInitialised&&e.init(),this.updateSize(!1)}remove(){if(null===this._parent)throw new c("CIR11110");this._parent.removeChild(this)}popout(){const t=K(),e=this.layoutManager.createPopoutFromContentItem(this,void 0,t,void 0);return this.emitBaseBubblingEvent("stateChanged"),e}calculateConfigContent(){const t=this._contentItems,e=t.length,i=new Array(e);for(let n=0;n1)return t;t=t.parent}return null}findDockPoint(){const t=this.findAncestorWithSiblings();if(null!==t&&null!==t.parent){const e=t.parent._contentItems.indexOf(t);return{parent:t.parent,index:e}}return this.layoutManager.groundItem?{parent:this.layoutManager.groundItem,index:null}:null}init(){this._isInitialised=!0,this.emitBaseBubblingEvent("itemCreated"),this.emitUnknownBubblingEvent(this.type+"Created")}setParent(t){this._parent=t}addPopInParentId(t){this.popInParentIds.includes(t)||this.popInParentIds.push(t)}initContentItems(){for(let t=0;tthis.propagateEventToLayoutManager(t,e))))}propagateEventToLayoutManager(t,e){this._pendingEventPropagations[t]=!1,this.layoutManager.emitUnknown(t,e)}}class at extends rt{constructor(t,e,i,n){switch(super(e,i,n,at.createElement(document,t)),this._rowOrColumnParent=n,this._splitter=[],this.isRow=!t,this.isColumn=t,this._childElementContainer=this.element,this._splitterSize=e.layoutConfig.dimensions.borderWidth,this._splitterGrabSize=e.layoutConfig.dimensions.borderGrabWidth,this._isColumn=t,this._dimension=t?"height":"width",this._splitterPosition=null,this._splitterMinPosition=null,this._splitterMaxPosition=null,i.type){case y.row:case y.column:this._configType=i.type;break;default:throw new h("ROCCCT00925")}}newComponent(t,e,i,n){const o={type:"component",componentType:t,componentState:e,title:i};return this.newItem(o,n)}addComponent(t,e,i,n){const o={type:"component",componentType:t,componentState:e,title:i};return this.addItem(o,n)}newItem(t,e){e=this.addItem(t,e);const i=this.contentItems[e];return rt.isStack(i)&&D.isComponent(t)?i.contentItems[0]:i}addItem(t,e){this.layoutManager.checkMinimiseMaximisedStack();const i=D.resolve(t,!1),n=this.layoutManager.createAndInitContentItem(i,this);return this.addChild(n,e,!1)}addChild(t,e,i){if(void 0===e&&(e=this.contentItems.length),this.contentItems.length>0){const i=this.createSplitter(Math.max(0,e-1)).element;e>0?(this.contentItems[e-1].element.insertAdjacentElement("afterend",i),i.insertAdjacentElement("afterend",t.element)):(this.contentItems[0].element.insertAdjacentElement("beforebegin",i),i.insertAdjacentElement("beforebegin",t.element))}else this._childElementContainer.appendChild(t.element);super.addChild(t,e);const n=1/this.contentItems.length*100;if(!0===i)return this.emitBaseBubblingEvent("stateChanged"),e;for(let e=0;e0&&(this.calculateRelativeSizes(),this.setAbsoluteSizes()),this.emitBaseBubblingEvent("stateChanged"),this.emit("resize")}setAbsoluteSizes(){const t=this.calculateAbsoluteSizes();for(let e=0;e0&&t.itemSizes[e]++,this._isColumn?(G(this.contentItems[e].element,t.crossAxisSize),Z(this.contentItems[e].element,t.itemSizes[e])):(G(this.contentItems[e].element,t.itemSizes[e]),Z(this.contentItems[e].element,t.crossAxisSize))}calculateAbsoluteSizes(){const t=(this.contentItems.length-1)*this._splitterSize,{width:e,height:i}=q(this.element);let n,o;this._isColumn?(n=i-t,o=e):(n=e-t,o=i);let s=0;const r=[];for(let t=0;t0){const n=100-t;for(let t=0;t100&&e.length>0){for(let t=0;te)return;{const r=i/e;let a=i;for(let e=0;ethis.onSplitterDrag(e,t,i))),e.on("dragStop",(()=>this.onSplitterDragStop(e))),e.on("dragStart",(()=>this.onSplitterDragStart(e))),this._splitter.splice(t,0,e),e}getSplitItems(t){const e=this._splitter.indexOf(t);return{before:this.contentItems[e],after:this.contentItems[e+1]}}calculateContentItemMinSize(t){const e=t.minSize;if(void 0!==e){if(t.minSizeUnit===I.Pixel)return e;throw new h("ROCGMD98831",JSON.stringify(t))}{const t=this.layoutManager.layoutConfig.dimensions;return this._isColumn?t.defaultMinItemHeight:t.defaultMinItemWidth}}calculateContentItemsTotalMinSize(t){let e=0;for(const i of t)e+=this.calculateContentItemMinSize(i);return e}onSplitterDragStart(t){const e=this.getSplitItems(t),i=V(e.before.element.style[this._dimension]),n=V(e.after.element.style[this._dimension]),o=this.calculateContentItemsTotalMinSize(e.before.contentItems),s=this.calculateContentItemsTotalMinSize(e.after.contentItems);this._splitterPosition=0,this._splitterMinPosition=-1*(i-o),this._splitterMaxPosition=n-s}onSplitterDrag(t,e,i){let n=this._isColumn?i:e;if(null===this._splitterMinPosition||null===this._splitterMaxPosition)throw new c("ROCOSD59226");n=Math.max(n,this._splitterMinPosition),n=Math.min(n,this._splitterMaxPosition),this._splitterPosition=n;const o=F(n);this._isColumn?t.element.style.top=o:t.element.style.left=o}onSplitterDragStop(t){if(null===this._splitterPosition)throw new c("ROCOSDS66932");{const e=this.getSplitItems(t),i=V(e.before.element.style[this._dimension]),n=V(e.after.element.style[this._dimension]),o=(this._splitterPosition+i)/(i+n),s=e.before.size+e.after.size;e.before.size=o*s,e.after.size=(1-o)*s,t.element.style.top=F(0),t.element.style.left=F(0),globalThis.requestAnimationFrame((()=>this.updateSize(!1)))}}}!function(t){t.getElementDimensionSize=function(t,e){return"width"===e?function(t){return t.offsetWidth}(t):function(t){return t.offsetHeight}(t)},t.setElementDimensionSize=function(t,e,i){return"width"===e?G(t,i):Z(t,i)},t.createElement=function(t,e){const i=t.createElement("div");return i.classList.add("lm_item"),e?i.classList.add("lm_column"):i.classList.add("lm_row"),i}}(at||(at={}));class lt extends it{constructor(t,e,i){super(),this._config=t,this._initialWindowSize=e,this._layoutManager=i,this._isInitialised=!1,this._popoutWindow=null,this._preventPopInOnClose=!1,this.createWindow()}toConfig(){var t,e;if(!1===this._isInitialised)throw new Error("Can't create config, layout not yet initialised");const i=this.getGlInstance().saveLayout();let n,o;null===this._popoutWindow?(n=null,o=null):(n=null!==(t=this._popoutWindow.screenX)&&void 0!==t?t:this._popoutWindow.screenLeft,o=null!==(e=this._popoutWindow.screenY)&&void 0!==e?e:this._popoutWindow.screenTop);const s={width:this.getGlInstance().width,height:this.getGlInstance().height,left:n,top:o};return{root:i.root,openPopouts:i.openPopouts,settings:i.settings,dimensions:i.dimensions,header:i.header,window:s,parentId:this._config.parentId,indexInParent:this._config.indexInParent,resolved:!0}}getGlInstance(){if(null===this._popoutWindow)throw new c("BPGGI24693");return this._popoutWindow.__glInstance}getWindow(){if(null===this._popoutWindow)throw new c("BPGW087215");return this._popoutWindow}close(t=!1){if(t&&(this._preventPopInOnClose=!0),this.getGlInstance())this.getGlInstance().closeWindow();else try{this.getWindow().close()}catch(t){}}popIn(){let t,e=this._config.indexInParent;if(!this._config.parentId)return;let i=Y({},this.getGlInstance().saveLayout()).root;if(void 0===i)return;const n=this._layoutManager.groundItem;if(void 0===n)throw new u("BPPIG34972");if(t=n.getItemsByPopInParentId(this._config.parentId)[0],t||(t=n.contentItems.length>0?n.contentItems[0]:n,e=t.contentItems.length),t.isStack){for(;i.type!==y.component&&1===i.content.length;)i=i.content[0];if(i.type!==y.component){if(null===t.parent)throw new c("BPPIG34973");const i=new at(!1,this._layoutManager,M.createDefault("row"),t.parent);t.parent.replaceChild(t,i,!1),i.addChild(t),t=i,e=1}}const o=this._layoutManager.createAndInitContentItem(i,t);t.addChild(o,e),this._layoutManager.layoutConfig.settings.popInOnClose?this._onClose():this.close()}createWindow(){const t=this.createUrl(),e=Math.floor(1e6*Math.random()).toString(36),i=this.serializeWindowFeatures({left:this._initialWindowSize.left,top:this._initialWindowSize.top,width:this._initialWindowSize.width,height:this._initialWindowSize.height,innerWidth:this._initialWindowSize.width,innerHeight:this._initialWindowSize.height,menubar:"no",toolbar:"no",location:"no",personalbar:"no",resizable:"yes",scrollbars:"no",status:"no"});if(this._popoutWindow=globalThis.open(t,e,i),this._popoutWindow)this._popoutWindow.addEventListener("load",(()=>{this.positionAndResizeWindow(),this._popoutWindow&&this._popoutWindow.addEventListener("beforeunload",(()=>{this._layoutManager.layoutConfig.settings.popInOnClose&&!this._preventPopInOnClose?this.popIn():this._onClose()}),{passive:!0})}),{passive:!0}),this._checkReadyInterval=setInterval((()=>this.checkReady()),10);else if(!0===this._layoutManager.layoutConfig.settings.blockedPopoutsThrowError)throw new s("Popout blocked")}checkReady(){if(null===this._popoutWindow)throw new c("BPCR01844");this._popoutWindow.__glInstance&&this._popoutWindow.__glInstance.isInitialised&&(this._popoutWindow.__glInstance.parent=this._layoutManager,this.onInitialised(),void 0!==this._checkReadyInterval&&(clearInterval(this._checkReadyInterval),this._checkReadyInterval=void 0))}positionAndResizeWindow(){if(null===this._popoutWindow)throw new c("BPPARW1");if(this._popoutWindow.innerWidth>0&&this._popoutWindow.innerHeight>0&&this._popoutWindow.outerWidth>0&&this._popoutWindow.outerHeight>0&&this._popoutWindow.innerWidth<=this._popoutWindow.outerWidth&&this._popoutWindow.innerHeight<=this._popoutWindow.outerHeight){const t=j(this._popoutWindow);this._popoutWindow.moveTo(this._initialWindowSize.left-t.width,this._initialWindowSize.top-t.height),this._popoutWindow.resizeTo(this._initialWindowSize.width+(this._popoutWindow.outerWidth-this._popoutWindow.innerWidth),this._initialWindowSize.height+(this._popoutWindow.outerHeight-this._popoutWindow.innerHeight))}this._popoutWindow.focus()}serializeWindowFeatures(t){const e=[];for(const i in t)e.push(i+"="+t[i].toString());return e.join(",")}createUrl(){const t="gl-window-config-"+K(),e=T.minifyConfig(this._config);try{localStorage.setItem(t,JSON.stringify(e))}catch(t){throw new Error("Error while writing to localStorage "+function(t){return t instanceof Error?t.message:"string"==typeof t?t:"Unknown Error"}(t))}const i=new URL("/gl-popout",location.origin);i.searchParams.set("gl-window",t);const n=this._layoutManager.container.dataset.theme;return void 0!==n&&i.searchParams.set("gl-theme",n),i.toString()}onInitialised(){this._isInitialised=!0,this.getGlInstance().on("popIn",(()=>this.popIn())),this.emit("initialised")}_onClose(){setTimeout((()=>this.emit("closed")),50)}}class ht extends rt{constructor(t,e,i){super(t,e,i,document.createElement("div")),this._parentItem=i,this._focused=!1,this.isComponent=!0,this._reorderEnabled=e.reorderEnabled,this.applyUpdatableConfig(e),this._initialWantMaximise=e.maximised;const n=document.createElement("div");n.classList.add("lm_content"),this.element.appendChild(n),this._container=new nt(e,this,t,n,(t=>this.handleUpdateItemConfigEvent(t)),(()=>this.show()),(()=>this.hide()),(t=>this.focus(t)),(t=>this.blur(t)))}get componentName(){return this._container.componentType}get componentType(){return this._container.componentType}get reorderEnabled(){return this._reorderEnabled}get initialWantMaximise(){return this._initialWantMaximise}get component(){return this._container.component}get container(){return this._container}get parentItem(){return this._parentItem}get headerConfig(){return this._headerConfig}get title(){return this._title}get tab(){return this._tab}get focused(){return this._focused}destroy(){this._container.destroy(),super.destroy()}applyUpdatableConfig(t){this.setTitle(t.title),this._headerConfig=t.header}toConfig(){const t=this._container.stateRequestEvent,e=void 0===t?this._container.state:t();return{type:y.component,content:[],size:this.size,sizeUnit:this.sizeUnit,minSize:this.minSize,minSizeUnit:this.minSizeUnit,id:this.id,maximised:!1,isClosable:this.isClosable,reorderEnabled:this._reorderEnabled,title:this._title,header:E.Header.createCopy(this._headerConfig),componentType:z.copyComponentType(this.componentType),componentState:e}}close(){if(null===this.parent)throw new c("CIC68883");this.parent.removeChild(this,!1)}enterDragMode(t,e){G(this.element,t),Z(this.element,e),this._container.enterDragMode(t,e)}exitDragMode(){this._container.exitDragMode()}enterStackMaximised(){this._container.enterStackMaximised()}exitStackMaximised(){this._container.exitStackMaximised()}drag(){this._container.drag()}getOuterBoundingClientRect(){var t;const e=this.element.getBoundingClientRect(),i=null===(t=this.headerConfig)||void 0===t?void 0:t.show,n=T.Dimensions.defaults.headerHeight,o="left"===i||"right"===i?n:0,s="top"===i||"bottom"===i||void 0===i?n:0;return DOMRect.fromRect({x:e.left-o,y:e.top-s,width:e.width+o,height:e.height+s})}updateSize(t){this.updateNodeSize(t)}init(){this.updateNodeSize(!1),super.init(),this._container.emit("open"),this.initContentItems()}setTitle(t){this._title=t,this.emit("titleChanged",t),this.emit("stateChanged")}setTab(t){this._tab=t,this.emit("tab",t),this._container.setTab(t)}hide(){super.hide(),this._container.setVisibility(!1)}show(){super.show(),this._container.setVisibility(!0)}focus(t=!1){this.parentItem.setActiveComponentItem(this,!0,t)}setFocused(t){this._focused=!0,this.tab.setFocused(),t||this.emitBaseBubblingEvent("focus")}blur(t=!1){this._focused&&this.layoutManager.setFocusedComponentItem(void 0,t)}setBlurred(t){this._focused=!1,this.tab.setBlurred(),t||this.emitBaseBubblingEvent("blur")}setParent(t){this._parentItem=t,super.setParent(t)}handleUpdateItemConfigEvent(t){this.applyUpdatableConfig(t)}updateNodeSize(t){if("none"!==this.element.style.display){const{width:e,height:i}=q(this.element);this._container.setSizeToNodeSize(e,i,t)}}}class dt extends rt{constructor(){super(...arguments),this._focused=!1}get focused(){return this._focused}setFocusedValue(t){this._focused=t}}class ct extends dt{constructor(t,e,i){super(t,P.create(e),null,ct.createElement(document)),this.isGround=!0,this._childElementContainer=this.element,this._containerElement=i;let n=null;for(;;){const t=n?n.previousSibling:this._containerElement.lastChild;if(!(t instanceof Element&&t.classList.contains("lm_content")))break;n=t}this._containerElement.insertBefore(this.element,n)}init(){if(!0!==this.isInitialised){this.updateNodeSize();for(let t=0;t0?this.contentItems[0]:this,n.isComponent)throw new Error("Cannot add item as child to ComponentItem");{const t=this.layoutManager.createAndInitContentItem(i,n);return e=n.addChild(t,e),n===this?-1:e}}loadComponentAsRoot(t){this.clearRoot();const e=D.resolve(t,!1);if(e.maximised)throw new Error("Root Component cannot be maximised");{const t=new ht(this.layoutManager,e,this);t.init(),this.addChild(t,0)}}addChild(t,e){if(this.contentItems.length>0)throw new Error("Ground node can only have a single child");return this._childElementContainer.appendChild(t.element),e=super.addChild(t,e),this.updateSize(!1),this.emitBaseBubblingEvent("stateChanged"),e}calculateConfigContent(){const t=this.contentItems,e=t.length,i=new Array(e);for(let n=0;n0&&(G(this.contentItems[0].element,t),Z(this.contentItems[0].element,e)),this.updateContentItemsSize(!1))}updateSize(t){this.layoutManager.beginVirtualSizedContainerAdding();try{this.updateNodeSize(),this.updateContentItemsSize(t)}finally{this.layoutManager.endVirtualSizedContainerAdding()}}createSideAreas(){const t=ct.Area.oppositeSides,e=new Array(Object.keys(t).length);let i=0;for(const n in t){const o=n,s=this.getElementArea();if(null===s)throw new c("RCSA77553");s.side=o,"2"===t[o][1]?s[o]=s[t[o]]-50:s[o]=s[t[o]]+50,s.surface=(s.x2-s.x1)*(s.y2-s.y1),e[i++]=s}return e}highlightDropZone(t,e,i){this.layoutManager.tabDropPlaceholder.remove(),super.highlightDropZone(t,e,i)}onDrop(t,e){if(t.isComponent){const e=x.createDefault(),i=t;e.header=E.Header.createCopy(i.headerConfig);const n=this.layoutManager.createAndInitContentItem(e,this);n.addChild(t),t=n}if(0===this.contentItems.length)this.addChild(t);else{if(t.type===y.row||t.type===y.column){const e=x.createDefault(),i=this.layoutManager.createContentItem(e,this);i.addChild(t),t=i}const i="x"==e.side[0]?y.row:y.column,n="2"==e.side[1],o=this.contentItems[0];if(o instanceof at&&o.type===i){const e=o.contentItems[n?0:o.contentItems.length-1];o.addChild(t,n?0:void 0,!0),e.size*=.5,t.size=e.size,t.sizeUnit=I.Percent,o.updateSize(!1)}else{const e=S.createDefault(i),s=this.layoutManager.createContentItem(e,this);this.replaceChild(o,s),s.addChild(t,n?0:void 0,!0),s.addChild(o,n?void 0:0,!0),o.size=50,t.size=50,t.sizeUnit=I.Percent,s.updateSize(!1)}}}dock(){throw new h("GID87731")}validateDocking(){throw new h("GIVD87732")}getAllContentItems(){const t=[this];return this.deepGetAllContentItems(this.contentItems,t),t}getAllComponentItems(){const t=[];return this.deepFilterContentItems(this.contentItems,t,(t=>t.isComponent)),t}getConfigMaximisedItems(){const t=[];return this.deepFilterContentItems(this.contentItems,t,(t=>!(!rt.isStack(t)||!t.initialWantMaximise)||!(!rt.isComponentItem(t)||!t.initialWantMaximise))),t}getItemsByPopInParentId(t){const e=[];return this.deepFilterContentItems(this.contentItems,e,(e=>e.popInParentIds.includes(t))),e}toConfig(){throw new Error("Cannot generate GroundItem config")}setActiveComponentItem(t,e,i){}updateNodeSize(){const{width:t,height:e}=q(this._containerElement);G(this.element,t),Z(this.element,e),this.contentItems.length>0&&(G(this.contentItems[0].element,t),Z(this.contentItems[0].element,e))}deepGetAllContentItems(t,e){for(let i=0;ithis.onClick(t),this._touchStartEventListener=t=>this.onTouchStart(t),this._element=document.createElement("div"),this._element.classList.add(i),this._element.title=e,this._header.on("destroy",(()=>this.destroy())),this._element.addEventListener("click",this._clickEventListener,{passive:!0}),this._element.addEventListener("touchstart",this._touchStartEventListener,{passive:!0}),this._header.controlsContainerElement.appendChild(this._element)}get element(){return this._element}destroy(){var t;this._element.removeEventListener("click",this._clickEventListener),this._element.removeEventListener("touchstart",this._touchStartEventListener),null===(t=this._element.parentNode)||void 0===t||t.removeChild(this._element)}onClick(t){this._pushEvent(t)}onTouchStart(t){this._pushEvent(t)}}class mt{constructor(t,e,i,n,o){var s;this._layoutManager=t,this._componentItem=e,this._closeEvent=i,this._focusEvent=n,this._dragStartEvent=o,this._isActive=!1,this._tabClickListener=t=>this.onTabClickDown(t),this._tabTouchStartListener=t=>this.onTabTouchStart(t),this._closeClickListener=()=>this.onCloseClick(),this._closeTouchStartListener=()=>this.onCloseTouchStart(),this._dragStartListener=(t,e)=>this.onDragStart(t,e),this._contentItemDestroyListener=()=>this.onContentItemDestroy(),this._tabTitleChangedListener=t=>this.setTitle(t),this._element=document.createElement("div"),this._element.classList.add("lm_tab"),this._titleElement=document.createElement("span"),this._titleElement.classList.add("lm_title"),this._closeElement=document.createElement("div"),this._closeElement.classList.add("lm_close_tab"),this._element.appendChild(this._titleElement),this._element.appendChild(this._closeElement),e.isClosable?(this._closeElement.style.display="",this.element.classList.add("lm_closable")):this._closeElement.style.display="none",this.setTitle(e.title),this._componentItem.on("titleChanged",this._tabTitleChangedListener),(null!==(s=e.reorderEnabled)&&void 0!==s?s:this._layoutManager.layoutConfig.settings.reorderEnabled)&&this.enableReorder(),this._element.addEventListener("click",this._tabClickListener,{passive:!0}),this._element.addEventListener("touchstart",this._tabTouchStartListener,{passive:!0}),this._componentItem.isClosable?(this._closeElement.addEventListener("click",this._closeClickListener,{passive:!0}),this._closeElement.addEventListener("touchstart",this._closeTouchStartListener,{passive:!0})):(this._closeElement.remove(),this._closeElement=void 0),this._componentItem.setTab(this),this._layoutManager.emit("tabCreated",this)}get isActive(){return this._isActive}get componentItem(){return this._componentItem}get contentItem(){return this._componentItem}get element(){return this._element}get titleElement(){return this._titleElement}get closeElement(){return this._closeElement}get reorderEnabled(){return void 0!==this._dragListener}set reorderEnabled(t){t!==this.reorderEnabled&&(t?this.enableReorder():this.disableReorder())}setTitle(t){this._titleElement.innerText=t,this._element.title=t}setActive(t){t!==this._isActive&&(this._isActive=t,t?this._element.classList.add("lm_active"):this._element.classList.remove("lm_active"))}destroy(){var t,e;this._closeEvent=void 0,this._focusEvent=void 0,this._dragStartEvent=void 0,this._element.removeEventListener("click",this._tabClickListener),this._element.removeEventListener("touchstart",this._tabTouchStartListener),null===(t=this._closeElement)||void 0===t||t.removeEventListener("click",this._closeClickListener),null===(e=this._closeElement)||void 0===e||e.removeEventListener("touchstart",this._closeTouchStartListener),this._componentItem.off("titleChanged",this._tabTitleChangedListener),this.reorderEnabled&&this.disableReorder(),this._element.remove()}setBlurred(){this._element.classList.remove("lm_focused"),this._titleElement.classList.remove("lm_focused")}setFocused(){this._element.classList.add("lm_focused"),this._titleElement.classList.add("lm_focused")}onDragStart(t,e){if(void 0===this._dragListener)throw new u("TODSDLU10093");if(void 0===this._dragStartEvent)throw new u("TODS23309");this._dragStartEvent(t,e,this._dragListener,this.componentItem)}onContentItemDestroy(){void 0!==this._dragListener&&(this._dragListener.destroy(),this._dragListener=void 0)}onTabClickDown(t){const e=t.target;e!==this._element&&e!==this._titleElement||(0===t.button?this.notifyFocus():1===t.button&&this._componentItem.isClosable&&this.notifyClose())}onTabTouchStart(t){t.target===this._element&&this.notifyFocus()}onCloseClick(){this.notifyClose()}onCloseTouchStart(){this.notifyClose()}notifyClose(){if(void 0===this._closeEvent)throw new u("TNC15007");this._closeEvent(this._componentItem)}notifyFocus(){if(void 0===this._focusEvent)throw new u("TNA15007");this._focusEvent(this._componentItem)}enableReorder(){this._dragListener=new ot(this._element,[this._titleElement]),this._dragListener.on("dragStart",this._dragStartListener),this._componentItem.on("destroy",this._contentItemDestroyListener)}disableReorder(){if(void 0===this._dragListener)throw new u("TDR87745");this._componentItem.off("destroy",this._contentItemDestroyListener),this._dragListener.off("dragStart",this._dragStartListener),this._dragListener=void 0}}class pt{constructor(t,e,i,n,o){this._layoutManager=t,this._componentRemoveEvent=e,this._componentFocusEvent=i,this._componentDragStartEvent=n,this._dropdownActiveChangedEvent=o,this._tabs=[],this._lastVisibleTabIndex=-1,this._dropdownActive=!1,this._element=document.createElement("section"),this._element.classList.add("lm_tabs"),this._dropdownElement=document.createElement("section"),this._dropdownElement.classList.add("lm_tabdropdown_list"),this._dropdownElement.style.display="none"}get tabs(){return this._tabs}get tabCount(){return this._tabs.length}get lastVisibleTabIndex(){return this._lastVisibleTabIndex}get element(){return this._element}get dropdownElement(){return this._dropdownElement}get dropdownActive(){return this._dropdownActive}destroy(){for(let t=0;tthis.handleTabCloseEvent(t)),(t=>this.handleTabFocusEvent(t)),((t,e,i,n)=>this.handleTabDragStartEvent(t,e,i,n)));void 0===e&&(e=this._tabs.length),this._tabs.splice(e,0,i),ethis._lastVisibleTabIndex){const t=this._tabs[e];for(let t=e;t>0;t--)this._tabs[t]=this._tabs[t-1];this._tabs[0]=t}}updateTabSizes(t,e){let i=!1;this.tryUpdateTabSizes(i,t,e)||(i=!0,this.tryUpdateTabSizes(i,t,e)),this._element.style.maxWidth=F(t),i!==this._dropdownActive&&(this._dropdownActive=i,this._dropdownActiveChangedEvent())}tryUpdateTabSizes(t,e,i){if(this._tabs.length>0){if(void 0===i)throw new Error("non-empty tabs must have active component item");let n=0,o=!1;const s=this._layoutManager.layoutConfig.settings.tabOverlapAllowance,r=this._tabs.indexOf(i.tab),a=this._tabs[r];this._lastVisibleTabIndex=-1;for(let i=0;ie){if(o)i===r&&(l.style.zIndex="auto",l.style.marginLeft="",l.parentElement!==this._element&&this._element.appendChild(l));else{let t;if(t=r>0&&r<=i?(d-e)/(i-1):(d-e)/i,tthis.onClick(t),this._touchStartListener=t=>this.onTouchStart(t),this._layoutStateListener=()=>this.onLayoutChanged(),this._tabsContainer=new pt(this._layoutManager,(t=>this.handleTabInitiatedComponentRemoveEvent(t)),(t=>this.handleTabInitiatedComponentFocusEvent(t)),((t,e,i,n)=>this.handleTabInitiatedDragStartEvent(t,e,i,n)),(()=>this.processTabDropdownActiveChanged())),this._show=i.show,this._popoutLabel=i.popoutLabel,this._maximiseLabel=i.maximiseLabel,this._minimiseLabel=i.minimiseLabel,this._closeLabel=i.closeLabel,this._tabDropdownEnabled=i.tabDropdownEnabled,this._tabDropdownLabel=i.tabDropdownLabel,this.setSide(i.side),this._element=document.createElement("section"),this._element.classList.add("lm_header"),this._controlsContainerElement=document.createElement("section"),this._controlsContainerElement.classList.add("lm_controls"),this._element.appendChild(this._tabsContainer.element),this._element.appendChild(this._controlsContainerElement),this._element.appendChild(this._tabsContainer.dropdownElement),this._element.addEventListener("click",this._clickListener,{passive:!0}),this._element.addEventListener("touchstart",this._touchStartListener,{passive:!0}),this._documentMouseUpListener=()=>this._tabsContainer.hideAdditionalTabsDropdown(),globalThis.document.addEventListener("mouseup",this._documentMouseUpListener,{passive:!0}),this._tabControlOffset=this._layoutManager.layoutConfig.settings.tabControlOffset,this._tabDropdownEnabled&&(this._tabDropdownButton=new ut(this,this._tabDropdownLabel,"lm_tabdropdown",(()=>this._tabsContainer.showAdditionalTabsDropdown()))),this._popoutButton=new ut(this,this._popoutLabel,"lm_popout",(()=>this.handleButtonPopoutEvent())),this._maximiseButton=new ut(this,this._maximiseLabel,"lm_maximise",(t=>this.handleButtonMaximiseToggleEvent(t))),this._closeButton=new ut(this,this._closeLabel,"lm_close",(()=>o())),this.processTabDropdownActiveChanged(),this.layoutManager.addEventListener("stateChanged",this._layoutStateListener)}get show(){return this._show}get side(){return this._side}get leftRightSided(){return this._leftRightSided}get layoutManager(){return this._layoutManager}get parent(){return this._parent}get tabs(){return this._tabsContainer.tabs}get lastVisibleTabIndex(){return this._tabsContainer.lastVisibleTabIndex}get element(){return this._element}get tabsContainerElement(){return this._tabsContainer.element}get controlsContainerElement(){return this._controlsContainerElement}destroy(){this.emit("destroy"),this._popoutEvent=void 0,this._maximiseToggleEvent=void 0,this._clickEvent=void 0,this._touchStartEvent=void 0,this._componentRemoveEvent=void 0,this._componentFocusEvent=void 0,this._componentDragStartEvent=void 0,this._tabsContainer.destroy(),globalThis.document.removeEventListener("mouseup",this._documentMouseUpListener),this.layoutManager.removeEventListener("stateChanged",this._layoutStateListener),this._element.remove()}createTab(t,e){this._tabsContainer.createTab(t,e)}removeTab(t){this._tabsContainer.removeTab(t)}processActiveComponentChanged(t){this._tabsContainer.processActiveComponentChanged(t),this.updateTabSizes()}setSide(t){this._side=t,this._leftRightSided=[_.right,_.left].includes(this._side)}updateButtons(){var t,e,i;const n=this._getActiveComponentItemEvent(),o=null===this._parent.findAncestorWithSiblings(),s=null===this.layoutManager.parent,r=this.tabs.every((t=>t.componentItem.isClosable)),a=!1!==(null===(t=null==n?void 0:n.headerConfig)||void 0===t?void 0:t.close);X(this._closeButton.element,r&&a);let l=!1!==(null===(e=null==n?void 0:n.headerConfig)||void 0===e?void 0:e.popout);if(this._layoutManager.layoutConfig.settings.popoutWholeStack)l&&(l=(!o||s)&&r);else{const t=!1!==(null==n?void 0:n.isClosable);l&&(l=(!o||this.tabs.length>1||s)&&t)}X(this._popoutButton.element,l);const h=(!1!==(null===(i=null==n?void 0:n.headerConfig)||void 0===i?void 0:i.maximise)||this._parent.isMaximised)&&!o;X(this._maximiseButton.element,h)}applyFocusedValue(t){t?this._element.classList.add("lm_focused"):this._element.classList.remove("lm_focused")}processMaximised(){if(void 0===this._maximiseButton)throw new u("HPMAX16997");this._maximiseButton.element.setAttribute("title",this._minimiseLabel)}processMinimised(){if(void 0===this._maximiseButton)throw new u("HPMIN16997");this._maximiseButton.element.setAttribute("title",this._maximiseLabel)}updateTabSizes(){if(this._tabsContainer.tabCount>0){const t=this._show?this._layoutManager.layoutConfig.dimensions.headerHeight:0;let e;this._leftRightSided?(this._element.style.height="",this._element.style.width=F(t)):(this._element.style.width="",this._element.style.height=F(t)),e=this._leftRightSided?this._element.offsetHeight-this._controlsContainerElement.offsetHeight-this._tabControlOffset:this._element.offsetWidth-this._controlsContainerElement.offsetWidth-this._tabControlOffset,this._tabsContainer.updateTabSizes(e,this._getActiveComponentItemEvent())}}handleTabInitiatedComponentRemoveEvent(t){if(void 0===this._componentRemoveEvent)throw new u("HHTCE22294");this._componentRemoveEvent(t)}handleTabInitiatedComponentFocusEvent(t){if(void 0===this._componentFocusEvent)throw new u("HHTAE22294");this._componentFocusEvent(t)}handleTabInitiatedDragStartEvent(t,e,i,n){if(void 0===this._componentDragStartEvent)throw new u("HHTDSE22294");this._componentDragStartEvent(t,e,i,n)}processTabDropdownActiveChanged(){void 0!==this._tabDropdownButton&&X(this._tabDropdownButton.element,this._tabsContainer.dropdownActive)}handleButtonPopoutEvent(){if(this._layoutManager.layoutConfig.settings.popoutWholeStack){if(void 0===this._popoutEvent)throw new u("HHBPOE17834");this._popoutEvent()}else{const t=this._getActiveComponentItemEvent();t&&t.popout()}}handleButtonMaximiseToggleEvent(t){if(void 0===this._maximiseToggleEvent)throw new u("HHBMTE16834");this._maximiseToggleEvent()}onClick(t){t.target===this._element&&this.notifyClick(t)}onTouchStart(t){t.target===this._element&&this.notifyTouchStart(t)}onLayoutChanged(){this.updateButtons()}notifyClick(t){if(void 0===this._clickEvent)throw new u("HNHC46834");this._clickEvent(t)}notifyTouchStart(t){if(void 0===this._touchStartEvent)throw new u("HNHTS46834");this._touchStartEvent(t)}}class _t extends dt{constructor(t,e,i){var n,o,s,r,a,l,h,d,c,u,m,p,g,f,v,C,y,w,I;super(t,e,i,_t.createElement(document)),this._headerSideChanged=!1,this._resizeListener=()=>this.handleResize(),this._maximisedListener=()=>this.handleMaximised(),this._minimisedListener=()=>this.handleMinimised(),this._headerConfig=e.header;const b=t.layoutConfig.header,S=e.content;let E;E=1!==S.length?void 0:S[0].header,this._initialWantMaximise=e.maximised,this._initialActiveItemIndex=null!==(n=e.activeItemIndex)&&void 0!==n?n:0;const x=null!==(r=null!==(s=null===(o=this._headerConfig)||void 0===o?void 0:o.show)&&void 0!==s?s:null==E?void 0:E.show)&&void 0!==r?r:b.show,z=null!==(h=null!==(l=null===(a=this._headerConfig)||void 0===a?void 0:a.popout)&&void 0!==l?l:null==E?void 0:E.popout)&&void 0!==h?h:b.popout,M=null!==(u=null!==(c=null===(d=this._headerConfig)||void 0===d?void 0:d.maximise)&&void 0!==c?c:null==E?void 0:E.maximise)&&void 0!==u?u:b.maximise,L=null!==(g=null!==(p=null===(m=this._headerConfig)||void 0===m?void 0:m.close)&&void 0!==p?p:null==E?void 0:E.close)&&void 0!==g?g:b.close,P=null!==(C=null!==(v=null===(f=this._headerConfig)||void 0===f?void 0:f.minimise)&&void 0!==v?v:null==E?void 0:E.minimise)&&void 0!==C?C:b.minimise,T=null!==(I=null!==(w=null===(y=this._headerConfig)||void 0===y?void 0:y.tabDropdown)&&void 0!==w?w:null==E?void 0:E.tabDropdown)&&void 0!==I?I:b.tabDropdown;this._maximisedEnabled=!1!==M;const A={show:!1!==x,side:!1===x?_.top:x,popoutEnabled:!1!==z,popoutLabel:!1===z?"":z,maximiseEnabled:this._maximisedEnabled,maximiseLabel:!1===M?"":M,closeEnabled:!1!==L,closeLabel:!1===L?"":L,minimiseEnabled:!0,minimiseLabel:P,tabDropdownEnabled:!1!==T,tabDropdownLabel:!1===T?"":T};this._header=new gt(t,this,A,(()=>this.getActiveComponentItem()),(()=>this.remove()),(()=>this.handlePopoutEvent()),(()=>this.toggleMaximise()),(t=>this.handleHeaderClickEvent(t)),(t=>this.handleHeaderTouchStartEvent(t)),(t=>this.handleHeaderComponentRemoveEvent(t)),(t=>this.handleHeaderComponentFocusEvent(t)),((t,e,i,n)=>this.handleHeaderComponentStartDragEvent(t,e,i,n))),this.isStack=!0,this._childElementContainer=document.createElement("section"),this._childElementContainer.classList.add("lm_items"),this.on("resize",this._resizeListener),this._maximisedEnabled&&(this.on("maximised",this._maximisedListener),this.on("minimised",this._minimisedListener)),this.element.appendChild(this._header.element),this.element.appendChild(this._childElementContainer),this.setupHeaderPosition()}get childElementContainer(){return this._childElementContainer}get header(){return this._header}get headerShow(){return this._header.show}get headerSide(){return this._header.side}get headerLeftRightSided(){return this._header.leftRightSided}get contentAreaDimensions(){return this._contentAreaDimensions}get initialWantMaximise(){return this._initialWantMaximise}get isMaximised(){return this===this.layoutManager.maximisedStack}get stackParent(){if(!this.parent)throw new Error("Stack should always have a parent");return this.parent}updateSize(t){this.layoutManager.beginVirtualSizedContainerAdding();try{this.updateNodeSize(),this.updateContentItemsSize(t)}finally{this.layoutManager.endVirtualSizedContainerAdding()}}init(){if(!0===this.isInitialised)return;this.updateNodeSize();for(let t=0;t0){if(this._initialActiveItemIndex<0||this._initialActiveItemIndex>=e)throw new Error(`ActiveItemIndex out of range: ${this._initialActiveItemIndex} id: ${this.id}`);for(let i=0;ithis.contentItems.length)throw e-=1,new h("SAC99728");if(t instanceof ht)return e=super.addChild(t,e),this._childElementContainer.appendChild(t.element),this._header.createTab(t,e),this.setActiveComponentItem(t,i),this._header.updateTabSizes(),this.updateSize(!1),t.container.setBaseLogicalZIndex(),this.emitStateChangedEvent(),e;throw new h("SACC88532")}removeChild(t,e){const i=t,n=this.contentItems.indexOf(i),o=1===this.contentItems.length;if(this._activeComponentItem===i&&(i.focused&&i.blur(),!o)){const t=0===n?1:n-1;this.setActiveComponentItem(this.contentItems[t],!1)}this._header.removeTab(i),super.removeChild(i,e),this.emitStateChangedEvent()}toggleMaximise(){this.isMaximised?this.minimise():this.maximise()}maximise(){if(!this.isMaximised){this.layoutManager.setMaximisedStack(this);const t=this.contentItems,e=t.length;for(let i=0;i0&&void 0===t)throw new Error("expected non-empty stack to have an active component item");return{type:"stack",content:this.calculateConfigContent(),size:this.size,sizeUnit:this.sizeUnit,minSize:this.minSize,minSizeUnit:this.minSizeUnit,id:this.id,isClosable:this.isClosable,maximised:this.isMaximised,header:this.createHeaderConfig(),activeItemIndex:t}}onDrop(t,e){if("header"===this._dropSegment){if(this.resetHeaderDropZone(),void 0===this._dropIndex)throw new u("SODDI68990");return void this.addChild(t,this._dropIndex)}if("body"===this._dropSegment)return void this.addChild(t,0,!0);const i="top"===this._dropSegment||"bottom"===this._dropSegment,n="left"===this._dropSegment||"right"===this._dropSegment,o="top"===this._dropSegment||"left"===this._dropSegment,s=i&&this.stackParent.isColumn||n&&this.stackParent.isRow;if(t.isComponent){const e=x.createDefault();e.header=t.headerConfig;const i=this.layoutManager.createAndInitContentItem(e,this);i.addChild(t),t=i}if(t.type===y.row||t.type===y.column){const e=x.createDefault();e.header=this.createHeaderConfig();const i=this.layoutManager.createContentItem(e,this);i.addChild(t),t=i}if(s){const e=this.stackParent.contentItems.indexOf(this);this.stackParent.addChild(t,o?e:e+1,!0),this.size*=.5,t.size=this.size,t.sizeUnit=this.sizeUnit,this.stackParent.updateSize(!1)}else{const e=i?y.column:y.row,n=S.createDefault(e),s=this.layoutManager.createContentItem(n,this);this.stackParent.replaceChild(this,s),s.addChild(t,o?0:void 0,!0),s.addChild(this,o?void 0:0,!0),this.size=50,t.size=50,t.sizeUnit=I.Percent,s.updateSize(!1)}}highlightDropZone(t,e){for(const i in this._contentAreaDimensions){const n=i,o=this._contentAreaDimensions[n].hoverArea;if(o.x1t&&o.y1e)return void("header"===n?(this._dropSegment="header",this.highlightHeaderDropZone(this._header.leftRightSided?e:t)):(this.resetHeaderDropZone(),this.highlightBodyDropZone(n)))}}getArea(){if("none"===this.element.style.display)return null;const t=super.getElementArea(this._header.element),e=super.getElementArea(this._childElementContainer);if(null===t||null===e)throw new c("SGAHC13086");const i=e.x2-e.x1,n=e.y2-e.y1;return this._contentAreaDimensions={header:{hoverArea:{x1:t.x1,y1:t.y1,x2:t.x2,y2:t.y2},highlightArea:{x1:t.x1,y1:t.y1,x2:t.x2,y2:t.y2}}},0===this.contentItems.length?(this._contentAreaDimensions.body={hoverArea:{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2},highlightArea:{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2}},super.getElementArea(this.element)):(this._contentAreaDimensions.left={hoverArea:{x1:e.x1,y1:e.y1,x2:e.x1+.25*i,y2:e.y2},highlightArea:{x1:e.x1,y1:e.y1,x2:e.x1+.5*i,y2:e.y2}},this._contentAreaDimensions.top={hoverArea:{x1:e.x1+.25*i,y1:e.y1,x2:e.x1+.75*i,y2:e.y1+.5*n},highlightArea:{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y1+.5*n}},this._contentAreaDimensions.right={hoverArea:{x1:e.x1+.75*i,y1:e.y1,x2:e.x2,y2:e.y2},highlightArea:{x1:e.x1+.5*i,y1:e.y1,x2:e.x2,y2:e.y2}},this._contentAreaDimensions.bottom={hoverArea:{x1:e.x1+.25*i,y1:e.y1+.5*n,x2:e.x1+.75*i,y2:e.y2},highlightArea:{x1:e.x1,y1:e.y1+.5*n,x2:e.x2,y2:e.y2}},super.getElementArea(this.element))}positionHeader(t){this._header.side!==t&&(this._header.setSide(t),this._headerSideChanged=!0,this.setupHeaderPosition())}updateNodeSize(){if("none"!==this.element.style.display){const t=q(this.element);this._header.show&&(t[this._header.leftRightSided?g.width:g.height]-=this.layoutManager.layoutConfig.dimensions.headerHeight),this._childElementContainer.style.width=F(t.width),this._childElementContainer.style.height=F(t.height);for(let e=0;e=o&&t=0&&this._proxyContainerElement.insertAdjacentElement("afterend",n)),this._element.style.left=F(t),this._element.style.top=F(e),s.setAttribute("title",this._componentItem.title),r.insertAdjacentText("afterbegin",this._componentItem.title),this._proxyContainerElement.appendChild(this._componentItem.element)}drag(t,e){const i=this.setDropPosition(t,e);return this._componentItem.drag(),i}setDropPosition(t,e){this._element.style.left=F(t),this._element.style.top=F(e);const i=this.layoutManager.getArea(t,e);return(null!==i||t=this._groundArea.x2||e=this._groundArea.y2)&&(this._lastArea=i),this._lastArea}drop(){this._componentItem.exitDragMode();let t=null,e=null;const i=this._action.currentTarget;if((null==i?void 0:i.owner)===this._action&&(t=i.area),null!==t)e=this._componentItem,t.contentItem.onDrop(e,t),this.layoutManager.focusWindow();else if(null===i&&null===this._action.parent){const t=$(globalThis),e={left:t.left+this.element.offsetLeft,top:t.top+this.element.offsetTop,width:this._originalSize.width,height:this._originalSize.height};this.layoutManager.createPopoutFromContentItem(this._componentItem,e,K(),this._dockPoint),this._componentItem.destroy()}else this._componentItem.destroy();this.layoutManager.emit("itemDropped",this._componentItem),this._componentItemFocused&&(null==e||e.focus()),this._element.remove()}setDimensions(){const t=this.layoutManager.layoutConfig.dimensions;if(void 0===t)throw new Error("DragProxy.setDimensions: dimensions undefined");let e=t.dragProxyWidth,i=t.dragProxyHeight;if(void 0===e||void 0===i)throw new Error("DragProxy.setDimensions: width and/or height undefined");this._outerWidth=e,this._outerHeight=i;const n=!1===this.layoutManager.layoutConfig.header.show?0:t.headerHeight;this._element.style.width=F(e),this._element.style.height=F(i),e-=this._sided?n:0,i-=this._sided?0:n,this._proxyContainerElement.style.width=F(e),this._proxyContainerElement.style.height=F(i),this._componentItem.enterDragMode(e,i),this._componentItem.show()}}class vt{constructor(t,e,i,n){if(this._owner=t,this._area=e,this._pageX=i,this._pageY=n,t.layoutManager!==e.contentItem.layoutManager)throw Error("LayoutManager of Area and DragProxy must match")}get owner(){return this._owner}get area(){return this._area}drop(t){this._area.contentItem.onDrop(t,this._area)}highlightDropZone(){this.area.contentItem.highlightDropZone(this._pageX,this._pageY,this._area)}}class Ct extends it{constructor(t,e=!1,i=null){super(),this._layoutManager=t,this._allowPopout=e,this._parent=i,this._dragProxy=null,this._currentTarget=null,this._dragListener=null,this._actions=[],this._dragEventHandler=(t,e,i)=>this.onDrag(i),this._dragStopEventHandler=()=>this.onDragStop(),this._boundingRect=this.computeBoundingRect(),this.parentOrSelf._actions.push(this)}get layoutManager(){return this._layoutManager}get parent(){return this._parent}get proxy(){return this._dragProxy}get parentOrSelf(){var t;return null!==(t=this._parent)&&void 0!==t?t:this}get currentTarget(){return this.parentOrSelf._currentTarget}set currentTarget(t){this.parentOrSelf._currentTarget=t}computeBoundingRect(){if(void 0===this._layoutManager.groundItem)throw new u("DACBR11120");{const t=this._layoutManager.groundItem.element.getBoundingClientRect();return DOMRect.fromRect({x:document.body.scrollLeft+t.left,y:document.body.scrollTop+t.top,width:t.width,height:t.height})}}screenToPage(t,e){const i=$(globalThis);return{x:document.body.scrollLeft+t-i.left,y:document.body.scrollTop+e-i.top}}isProxyVisible(t,e,i){return e>=this._boundingRect.left-t.outerWidth&&e=this._boundingRect.top-t.outerHeight&&ithis.onDragStart(t,e))),this._dragListener.on("dragStop",(()=>this.onDragStop()))}onDragStart(t,e){var i,n;const o="component";let s;if("function"==typeof this._componentTypeOrFtn){const t=this._componentTypeOrFtn();s=yt.isDragSourceComponentItemConfig(t)?{type:o,componentState:t.state,componentType:t.type,title:null!==(i=t.title)&&void 0!==i?i:this._title}:t}else s={type:o,componentState:this._componentState,componentType:this._componentTypeOrFtn,title:this._title,id:this._id};const r=W.resolve(s,!1),a=new ht(this._layoutManager,r,this._dummyGroundContentItem);if(this._dummyGroundContentItem.contentItems.push(a),null===this._dragListener)throw new c("DSODSD66746");{const i=Ct.start(this._layoutManager,this._dragListener,a,t,e,!1),o=this._layoutManager.transitionIndicator;if(null===o)throw new c("DSODST66746");{const t=null===(n=i.proxy)||void 0===n?void 0:n.element;if(void 0===t)throw new u("DSODST66747");o.transitionElements(this._element,t)}}}onDragStop(){this.createDragListener()}removeDragListener(){null!==this._dragListener&&(this._dragListener.destroy(),this._dragListener=null)}}!function(t){t.isDragSourceComponentItemConfig=function(t){return!("componentType"in t)}}(yt||(yt={}));class wt{constructor(){this._element=document.createElement("div"),this._element.classList.add("lm_dropTargetIndicator");const t=document.createElement("div");t.classList.add("lm_inner"),this._element.appendChild(t),document.body.appendChild(this._element)}destroy(){this._element.remove()}highlightArea(t,e){this._element.style.left=F(t.x1+e),this._element.style.top=F(t.y1+e),this._element.style.width=F(t.x2-t.x1-e-1),this._element.style.height=F(t.y2-t.y1-e-1),this._element.style.visibility="visible"}hide(){this._element.style.visibility="hidden"}}class It{constructor(){this._element=document.createElement("div"),this._element.classList.add("lm_transition_indicator"),document.body.appendChild(this._element),this._toElement=null,this._fromDimensions=null,this._totalAnimationDuration=200,this._animationStartTime=null}destroy(){this._element.remove()}transitionElements(t,e){}nextAnimationFrame(){}measure(t){const e=t.getBoundingClientRect();return{left:e.left,top:e.top,width:t.offsetWidth,height:t.offsetHeight}}}class bt extends it{constructor(t){super(),this._layoutManager=t,this._childEventListener=t=>this.onEventFromChild(t),globalThis.addEventListener(bt.ChildEventName,this._childEventListener,{passive:!0})}emit(t,...e){"userBroadcast"===t?this.emitUserBroadcast(...e):super.emit(t,...e)}emitUserBroadcast(...t){this.handleUserBroadcastEvent("userBroadcast",t)}destroy(){globalThis.removeEventListener(bt.ChildEventName,this._childEventListener)}handleUserBroadcastEvent(t,e){this._layoutManager.isSubWindow?this.propagateToParent(t,e):this.propagateToThisAndSubtree(t,e)}onEventFromChild(t){const e=t.detail;this.handleUserBroadcastEvent(e.eventName,e.args)}propagateToParent(t,e){const i={bubbles:!0,cancelable:!0,detail:{layoutManager:this._layoutManager,eventName:t,args:e}},n=new CustomEvent(bt.ChildEventName,i),o=globalThis.opener;if(null===o)throw new c("EHPTP15778");o.dispatchEvent(n)}propagateToThisAndSubtree(t,e){this.emitUnknown(t,...e);for(let i=0;ithis.handleContainerResize())),this._windowBeforeUnloadListener=()=>this.onBeforeUnload(),this._windowBeforeUnloadListening=!1,this._maximisedStackBeforeDestroyedListener=t=>this.cleanupBeforeMaximisedStackDestroyed(t),this.moveWindowTop=()=>{},this.focusWindow=()=>globalThis.focus(),this.isSubWindow=e.isSubWindow,this._constructorOrSubWindowLayoutConfig=e.constructorOrSubWindowLayoutConfig,t.checkInitialise(),b.checkInitialise(),void 0!==e.containerElement&&(this._containerElement=e.containerElement)}get container(){return this._containerElement}get isInitialised(){return this._isInitialised}get isDragging(){return document.body.classList.contains("lm_dragging")}get groundItem(){return this._groundItem}get root(){return this._groundItem}get openPopouts(){return this._openPopouts}get dropTargetIndicator(){return this._dropTargetIndicator}get transitionIndicator(){return this._transitionIndicator}get width(){return this._width}get height(){return this._height}get eventHub(){return this._eventHub}get rootItem(){if(void 0===this._groundItem)throw new Error("Cannot access rootItem before init");return 0===this._groundItem.contentItems.length?void 0:this._groundItem.contentItems[0]}get focusedComponentItem(){return this._focusedComponentItem}get tabDropPlaceholder(){return this._tabDropPlaceholder}get maximisedStack(){return this._maximisedStack}get deprecatedConstructor(){return!this.isSubWindow&&void 0!==this._constructorOrSubWindowLayoutConfig}get parent(){return this._parent}set parent(t){this._parent=t}get instances(){var t;const e=[],i=null!==(t=this.parent)&&void 0!==t?t:this;e.push(i);for(let t of i.openPopouts){const i=t.getGlInstance();e.push(i)}return e}destroy(){if(this._isInitialised){this._windowBeforeUnloadListening&&(globalThis.removeEventListener("beforeunload",this._windowBeforeUnloadListener),this._windowBeforeUnloadListening=!1),!0===this.layoutConfig.settings.closePopoutsOnUnload&&this.closeAllOpenPopouts(),this._resizeObserver.disconnect(),this.checkClearResizeTimeout(),void 0!==this._groundItem&&this._groundItem.destroy(),this._tabDropPlaceholder.remove(),null!==this._dropTargetIndicator&&this._dropTargetIndicator.destroy(),null!==this._transitionIndicator&&this._transitionIndicator.destroy(),this._eventHub.destroy();for(const t of this._dragSources)t.destroy();this._dragSources=[],this._isInitialised=!1}}minifyConfig(t){return T.minifyConfig(t)}unminifyConfig(t){return T.unminifyConfig(t)}init(){var t;this.setContainer(),this._dropTargetIndicator=new wt,this._transitionIndicator=new It,this.updateSizeFromContainer(),this.layoutConfig=T.createDefault(),this._groundItem=new ct(this,this.layoutConfig.root,this._containerElement),this._groundItem.init(),this.checkLoadedLayoutMaximiseItem(),this._resizeObserver.observe(this._containerElement),this._isInitialised=!0,this.adjustColumnsResponsive(),this.emit("initialised");let e=this._constructorOrSubWindowLayoutConfig;this.isSubWindow&&void 0!==e&&((null===(t=e.root)||void 0===t?void 0:t.type)==y.component&&(e.root={type:y.stack,content:[e.root]}),this.loadLayout(e))}loadLayout(t){if(!this.isInitialised)throw new Error("GoldenLayout: Need to call init() if LayoutConfig with defined root passed to constructor");if(void 0===this._groundItem)throw new u("LMLL11119");this.layoutConfig=B.resolve(t),this.createSubWindows(),this._groundItem.loadRoot(this.layoutConfig.root),this.checkLoadedLayoutMaximiseItem(),this.adjustColumnsResponsive()}saveLayout(){if(!1===this._isInitialised)throw new Error("Can't create config, layout not yet initialised");if(void 0===this._groundItem)throw new u("LMTC18244");{const t=this._groundItem.calculateConfigContent();let e;e=1!==t.length?void 0:t[0],this.reconcilePopoutWindows();const i=[];for(let t=0;t=0?n=this._groundItem.contentItems[0]:e=0;break;case y.row:case y.column:e=n.addItem(t,i.index);break;case y.stack:if(D.isComponent(t)){e=n.addItem(t,i.index);break}throw Error(m[6]);case y.component:throw new h("LMAIALC87444602");default:throw new d("LMAIALU98881733",n.type)}if(D.isComponent(t)){const t=n.contentItems[e];rt.isStack(t)&&(n=t,e=0)}return i.parentItem=n,i.index=e,i}}}loadComponentAsRoot(t){if(void 0===this._groundItem)throw new Error("Cannot add item before init");this._groundItem.loadComponentAsRoot(t)}updateSize(t,e){this.setSize(t,e)}setSize(t,e){if(this._width=t,this._height=e,!0===this._isInitialised){if(void 0===this._groundItem)throw new u("LMUS18881");if(this._groundItem.setSize(this._width,this._height),this._maximisedStack){const{width:t,height:e}=q(this._containerElement);G(this._maximisedStack.element,t),Z(this._maximisedStack.element,e),this._maximisedStack.updateSize(!1)}this.adjustColumnsResponsive()}}beginSizeInvalidation(){this._sizeInvalidationBeginCount++}endSizeInvalidation(){0==--this._sizeInvalidationBeginCount&&this.updateSizeFromContainer()}updateSizeFromContainer(){const{width:t,height:e}=q(this._containerElement);this.setSize(t,e)}updateRootSize(t=!1){if(void 0===this._groundItem)throw new u("LMURS28881");this._groundItem.updateSize(t)}createAndInitContentItem(t,e){const i=this.createContentItem(t,e);return i.init(),i}createContentItem(t,e){if("string"!=typeof t.type)throw new o("Missing parameter 'type'",JSON.stringify(t));return!S.isComponentItem(t)||e instanceof _t||!e||!0===this.isSubWindow&&e instanceof ct||(t={type:y.stack,content:[t],size:t.size,sizeUnit:t.sizeUnit,minSize:t.minSize,minSizeUnit:t.minSizeUnit,id:t.id,maximised:t.maximised,isClosable:t.isClosable,activeItemIndex:0,header:void 0}),this.createContentItemFromConfig(t,e)}findFirstComponentItemById(t){if(void 0===this._groundItem)throw new u("LMFFCIBI82446");return this.findFirstContentItemTypeByIdRecursive(y.component,t,this._groundItem)}createPopoutFromContentItem(t,e,i,n){var o;const s=null!=n?n:t.findDockPoint();if(null===s)throw new c("LMCPFCI00834");{if(null!==i&&s.parent.addPopInParentId(i),void 0===e){const i=$(globalThis),n=t instanceof ht?t.getOuterBoundingClientRect():t.element.getBoundingClientRect();e={left:i.left+n.left,top:i.top+n.top,width:n.width,height:n.height}}const n=t.toConfig();if((null===(o=t.parent)||void 0===o?void 0:o.contentItems.includes(t))&&t.remove(),L.isRootItemConfig(n))return this.createPopoutFromItemConfig(n,e,i,s.index);throw new Error(`${m[0]}`)}}beginVirtualSizedContainerAdding(){0==++this._virtualSizedContainerAddingBeginCount&&(this._virtualSizedContainers.length=0)}addVirtualSizedContainer(t){this._virtualSizedContainers.push(t)}endVirtualSizedContainerAdding(){if(0==--this._virtualSizedContainerAddingBeginCount){const t=this._virtualSizedContainers.length;if(t>0){this.fireBeforeVirtualRectingEvent(t);for(let e=0;e{const t=a.getGlInstance(),e=function(){var e,i;t.isDragging||0!==(null===(i=null===(e=t.groundItem)||void 0===e?void 0:e.getAllComponentItems())||void 0===i?void 0:i.length)||a.close()};t.on("itemDropped",e),t.on("itemDestroyed",e),this.emit("windowOpened",a)})),a.on("closed",(()=>this.reconcilePopoutWindows())),this._openPopouts.push(a),this.layoutConfig.settings.closePopoutsOnUnload&&!this._windowBeforeUnloadListening&&(globalThis.addEventListener("beforeunload",this._windowBeforeUnloadListener,{passive:!0}),this._windowBeforeUnloadListening=!0),a}closeAllOpenPopouts(t=!1){for(let e=0;e0;if(s&&!r&&!a)return void i.cancelDrag();const l=Ct.start(this,i,n,t,e,r);if(a)for(let t of this.instances)t!==this&&t.startExternalComponentDrag(l)}hideDropTargetIndicator(){var t;this.tabDropPlaceholder.remove(),null===(t=this.dropTargetIndicator)||void 0===t||t.hide()}focusComponent(t,e=!1){t.focus(e)}clearComponentFocus(t=!1){this.setFocusedComponentItem(void 0,t)}setFocusedComponentItem(t,e=!1){if(t!==this._focusedComponentItem){let i;if(void 0===t||(i=t.parentItem),void 0!==this._focusedComponentItem){const t=this._focusedComponentItem;this._focusedComponentItem=void 0,t.setBlurred(e);const n=t.parentItem;i===n?i=void 0:n.setFocusedValue(!1)}void 0!==t&&(this._focusedComponentItem=t,t.setFocused(e),void 0!==i&&i.setFocusedValue(!0))}}createContentItemFromConfig(t,e){switch(t.type){case y.ground:throw new h("LMCCIFC68871");case y.row:return new at(!1,this,t,e);case y.column:return new at(!0,this,t,e);case y.stack:return new _t(this,t,e);case y.component:return new ht(this,t,e);default:throw new d("CCC913564",t.type,"Invalid Config Item type specified")}}setMaximisedStack(t){void 0===t?void 0!==this._maximisedStack&&this.processMinimiseMaximisedStack():t!==this._maximisedStack&&(void 0!==this._maximisedStack&&this.processMinimiseMaximisedStack(),this.processMaximiseStack(t))}checkMinimiseMaximisedStack(){void 0!==this._maximisedStack&&this._maximisedStack.minimise()}cleanupBeforeMaximisedStackDestroyed(t){null!==this._maximisedStack&&this._maximisedStack===t.target&&(this._maximisedStack.off("beforeItemDestroyed",this._maximisedStackBeforeDestroyedListener),this._maximisedStack=void 0)}closeWindow(){globalThis.setTimeout((()=>globalThis.close()),1)}getArea(t,e){let i=null,n=1/0;for(let o=0;o=s.x1&&t=s.y1&&es.surface&&(n=s.surface,i=s)}return i}calculateItemAreas(){const t=this.getAllContentItems(),e=this._groundItem;if(void 0===e)throw new u("LMCIAR44365");if(1!==t.length){e.contentItems[0].isStack?this._itemAreas=[]:this._itemAreas=e.createSideAreas();for(let e=0;e0){let e=t[0];if(rt.isComponentItem(e)){const t=e.parent;if(null===t)throw new c("LMXLLMI69999");e=t}if(!rt.isStack(e))throw new h("LMCLLMI19993");e.maximise()}}}processMaximiseStack(t){if(this._maximisedStack=t,t.on("beforeItemDestroyed",this._maximisedStackBeforeDestroyedListener),t.element.classList.add("lm_maximised"),t.element.insertAdjacentElement("afterend",this._maximisePlaceholder),void 0===this._groundItem)throw new u("LMMXI19993");{this._groundItem.element.prepend(t.element);const{width:e,height:i}=q(this._containerElement);G(t.element,e),Z(t.element,i),t.updateSize(!0),t.focusActiveContentItem(),this._maximisedStack.emit("maximised"),this.emit("stateChanged")}}processMinimiseMaximisedStack(){if(void 0===this._maximisedStack)throw new h("LMMMS74422");{const t=this._maximisedStack;if(null===t.parent)throw new c("LMMI13668");t.element.classList.remove("lm_maximised"),this._maximisePlaceholder.insertAdjacentElement("afterend",t.element),this._maximisePlaceholder.remove(),this.updateRootSize(!0),this._maximisedStack=void 0,t.off("beforeItemDestroyed",this._maximisedStackBeforeDestroyedListener),t.emit("minimised"),this.emit("stateChanged")}}reconcilePopoutWindows(){const t=[];for(let e=0;e{this._resizeTimeoutId=void 0,this.beginSizeInvalidation(),this.endSizeInvalidation()}),this.resizeDebounceInterval))}checkClearResizeTimeout(){void 0!==this._resizeTimeoutId&&(clearTimeout(this._resizeTimeoutId),this._resizeTimeoutId=void 0)}setContainer(){var t;const e=document.body,i=null!==(t=this._containerElement)&&void 0!==t?t:e;if(i===e){this.resizeWithContainerAutomatically=!0;const t=document.documentElement;t.style.height="100%",t.style.margin="0",t.style.padding="0",t.style.overflow="hidden",e.style.height="100%",e.style.margin="0",e.style.padding="0",e.style.overflow="hidden"}this._containerElement=i}onBeforeUnload(){this.destroy()}adjustColumnsResponsive(){if(void 0===this._groundItem)throw new u("LMACR20883");if(this._firstLoad=!1,this.useResponsiveLayout()&&!this._updatingColumnsResponsive&&this._groundItem.contentItems.length>0&&this._groundItem.contentItems[0].isRow){if(void 0===this._groundItem||null===this._width)throw new u("LMACR77412");{const t=this._groundItem.contentItems[0].contentItems.length;if(t<=1)return;{const e=this.layoutConfig.dimensions.defaultMinItemWidth;if(t*e<=this._width)return;{this._updatingColumnsResponsive=!0;const i=t-Math.max(Math.floor(this._width/e),1),n=this._groundItem.contentItems[0],o=this.getAllStacks();if(0===o.length)throw new h("LMACRS77413");{const t=o[0];for(let e=0;en?void 0:{parentItem:t,index:o}}}case 1:if(void 0===this._focusedComponentItem)return;{const t=this._focusedComponentItem.parentItem;return this.tryCreateLocationFromParentItem(t,e)}case 2:{const t=this.findFirstContentItemType(y.stack);return void 0===t?void 0:this.tryCreateLocationFromParentItem(t,e)}case 3:{let t=this.findFirstContentItemType(y.row);return void 0!==t?this.tryCreateLocationFromParentItem(t,e):(t=this.findFirstContentItemType(y.column),void 0!==t?this.tryCreateLocationFromParentItem(t,e):void 0)}case 4:{const t=this.findFirstContentItemType(y.row);return void 0===t?void 0:this.tryCreateLocationFromParentItem(t,e)}case 5:{const t=this.findFirstContentItemType(y.column);return void 0===t?void 0:this.tryCreateLocationFromParentItem(t,e)}case 6:if(void 0===this._groundItem)throw new u("LMFLRIF18244");return void 0!==this.rootItem?void 0:void 0===e||0===e?{parentItem:this._groundItem,index:0}:void 0;case 7:if(void 0===this._groundItem)throw new u("LMFLF18244");{const t=this._groundItem.contentItems;if(0===t.length)return void 0===e||0===e?{parentItem:this._groundItem,index:0}:void 0;{const i=t[0];return this.tryCreateLocationFromParentItem(i,e)}}}}tryCreateLocationFromParentItem(t,e){const i=t.contentItems.length;return void 0===e?{parentItem:t,index:i}:e<0||e>i?void 0:{parentItem:t,index:e}}}!function(t){t.createMaximisePlaceElement=function(t){const e=t.createElement("div");return e.classList.add("lm_maximise_place"),e},t.createTabDropPlaceholderElement=function(t){const e=t.createElement("div");return e.classList.add("lm_drop_tab_placeholder"),e},t.defaultLocationSelectors=[{typeId:1,index:void 0},{typeId:2,index:void 0},{typeId:3,index:void 0},{typeId:7,index:void 0}],t.afterFocusedItemIfPossibleLocationSelectors=[{typeId:0,index:1},{typeId:2,index:void 0},{typeId:3,index:void 0},{typeId:7,index:void 0}]}(St||(St={}));class Et extends St{constructor(t,e,i,n){if(super(Et.createLayoutManagerConstructorParameters(t,e)),this._bindComponentEventHanlderPassedInConstructor=!1,this._creationTimeoutPassed=!1,void 0!==e&&"function"==typeof e&&(this.bindComponentEvent=e,this._bindComponentEventHanlderPassedInConstructor=!0,void 0!==i&&(this.unbindComponentEvent=i)),!this._bindComponentEventHanlderPassedInConstructor&&this.isSubWindow){if(void 0===this._constructorOrSubWindowLayoutConfig)throw new u("VLC98823");{const t=B.resolve(this._constructorOrSubWindowLayoutConfig);this.layoutConfig=Object.assign(Object.assign({},t),{root:void 0})}}!0!==n&&(this.deprecatedConstructor||this.init())}destroy(){this.bindComponentEvent=void 0,this.unbindComponentEvent=void 0,super.destroy()}init(){if(this._bindComponentEventHanlderPassedInConstructor||"loading"!==document.readyState&&null!==document.body){if(!this._bindComponentEventHanlderPassedInConstructor&&!0===this.isSubWindow&&!this._creationTimeoutPassed)return setTimeout((()=>this.init()),7),void(this._creationTimeoutPassed=!0);!0===this.isSubWindow&&(this._bindComponentEventHanlderPassedInConstructor||this.clearHtmlAndAdjustStylesForSubWindow(),window.__glInstance=this),super.init()}else document.addEventListener("DOMContentLoaded",(()=>this.init()),{passive:!0})}clearHtmlAndAdjustStylesForSubWindow(){const t=document.head,e=new Array(4);e[0]=document.querySelectorAll("body link"),e[1]=document.querySelectorAll("body style"),e[2]=document.querySelectorAll("template"),e[3]=document.querySelectorAll(".gl_keep");for(let i=0;ithis.emit("popIn"))),document.body.appendChild(t),!0}}bindComponent(t,e){if(void 0!==this.bindComponentEvent)return this.bindComponentEvent(t,e);if(void 0!==this.getComponentEvent)return{virtual:!1,component:this.getComponentEvent(t,e)};{const t=`${m[2]}: ${JSON.stringify(e)}`;throw new a(t)}}unbindComponent(t,e,i){if(void 0!==this.unbindComponentEvent)this.unbindComponentEvent(t);else if(!e&&void 0!==this.releaseComponentEvent){if(void 0===i)throw new u("VCUCRCU333998");this.releaseComponentEvent(t,i)}}}!function(t){let e=!1;t.createLayoutManagerConstructorParameters=function(t,i){const n=e?null:new URL(document.location.href).searchParams.get("gl-window");e=!0;const o=null!==n;let s,r;if(null!==n){const e=localStorage.getItem(n);if(null===e)throw new Error("Null gl-window Config");localStorage.removeItem(n);const i=JSON.parse(e),o=T.unminifyConfig(i);r=B.fromResolved(o),t instanceof HTMLElement&&(s=t)}else void 0===t?r=void 0:t instanceof HTMLElement?(r=void 0,s=t):r=t,void 0===s&&i instanceof HTMLElement&&(s=i);return{constructorOrSubWindowLayoutConfig:r,isSubWindow:o,containerElement:s}}}(Et||(Et={}));class xt extends Et{constructor(t,e,i){super(t,e,i,!0),this._componentTypesMap=new Map,this._registeredComponentMap=new Map,this._virtuableComponentMap=new Map,this._containerVirtualRectingRequiredEventListener=(t,e,i)=>this.handleContainerVirtualRectingRequiredEvent(t,e,i),this._containerVirtualVisibilityChangeRequiredEventListener=(t,e)=>this.handleContainerVirtualVisibilityChangeRequiredEvent(t,e),this._containerVirtualZIndexChangeRequiredEventListener=(t,e,i)=>this.handleContainerVirtualZIndexChangeRequiredEvent(t,e,i),this.deprecatedConstructor||this.init()}registerComponent(t,e,i=!1){if("function"!=typeof e)throw new r("registerComponent() componentConstructorOrFactoryFtn parameter is not a function");if(e.hasOwnProperty("prototype")){const n=e;this.registerComponentConstructor(t,n,i)}else{const n=e;this.registerComponentFactoryFunction(t,n,i)}}registerComponentConstructor(t,e,i=!1){if("function"!=typeof e)throw new Error(m[1]);if(void 0!==this._componentTypesMap.get(t))throw new a(`${m[3]}: ${t}`);this._componentTypesMap.set(t,{constructor:e,factoryFunction:void 0,virtual:i})}registerComponentFactoryFunction(t,e,i=!1){if("function"!=typeof e)throw new a("Please register a constructor function");if(void 0!==this._componentTypesMap.get(t))throw new a(`${m[3]}: ${t}`);this._componentTypesMap.set(t,{constructor:void 0,factoryFunction:e,virtual:i})}registerComponentFunction(t){this.registerGetComponentConstructorCallback(t)}registerGetComponentConstructorCallback(t){if("function"!=typeof t)throw new Error("Please register a callback function");void 0!==this._getComponentConstructorFtn&&console.warn("Multiple component functions are being registered. Only the final registered function will be used."),this._getComponentConstructorFtn=t}getRegisteredComponentTypeNames(){const t=this._componentTypesMap.keys();return Array.from(t)}getComponentInstantiator(t){let e;const i=z.resolveComponentTypeName(t);return void 0!==i&&(e=this._componentTypesMap.get(i)),void 0===e&&void 0!==this._getComponentConstructorFtn&&(e={constructor:this._getComponentConstructorFtn(t),factoryFunction:void 0,virtual:!1}),e}bindComponent(t,e){let i;const n=z.resolveComponentTypeName(e);let o;if(void 0!==n&&(i=this._componentTypesMap.get(n)),void 0===i&&void 0!==this._getComponentConstructorFtn&&(i={constructor:this._getComponentConstructorFtn(e),factoryFunction:void 0,virtual:!1}),void 0!==i){const s=i.virtual;let r,l;r=void 0===e.componentState?void 0:J({},e.componentState);const d=i.constructor;if(void 0!==d)l=new d(t,r,s);else{const e=i.factoryFunction;if(void 0===e)throw new h("LMBCFFU10008");l=e(t,r,s)}if(s){if(void 0===l)throw new u("GLBCVCU988774");{const e=l,i=e.rootHtmlElement;if(void 0===i)throw new a(`${m[5]}: ${n}`);!function(t){const e="absolute";t.style.position!==e&&(t.style.position=e)}(i),this.container.appendChild(i),this._virtuableComponentMap.set(t,e),t.virtualRectingRequiredEvent=this._containerVirtualRectingRequiredEventListener,t.virtualVisibilityChangeRequiredEvent=this._containerVirtualVisibilityChangeRequiredEventListener,t.virtualZIndexChangeRequiredEvent=this._containerVirtualZIndexChangeRequiredEventListener}}this._registeredComponentMap.set(t,l),o={virtual:i.virtual,component:l}}else o=super.bindComponent(t,e);return o}unbindComponent(t,e,i){if(void 0===this._registeredComponentMap.get(t))super.unbindComponent(t,e,i);else{const e=this._virtuableComponentMap.get(t);if(void 0!==e){const i=e.rootHtmlElement;if(void 0===i)throw new h("GLUC77743",t.title);this.container.removeChild(i),this._virtuableComponentMap.delete(t)}}}fireBeforeVirtualRectingEvent(t){this._goldenLayoutBoundingClientRect=this.container.getBoundingClientRect(),super.fireBeforeVirtualRectingEvent(t)}handleContainerVirtualRectingRequiredEvent(t,e,i){const n=this._virtuableComponentMap.get(t);if(void 0===n)throw new u("GLHCSCE55933");{const o=n.rootHtmlElement;if(void 0===o)throw new a(m[4]+" "+t.title);{const n=t.element.getBoundingClientRect(),s=n.left-this._goldenLayoutBoundingClientRect.left;o.style.left=F(s);const r=n.top-this._goldenLayoutBoundingClientRect.top;o.style.top=F(r),G(o,e),Z(o,i)}}}handleContainerVirtualVisibilityChangeRequiredEvent(t,e){const i=this._virtuableComponentMap.get(t);if(void 0===i)throw new u("GLHCVVCRE55934");{const n=i.rootHtmlElement;if(void 0===n)throw new a(m[4]+" "+t.title);X(n,e)}}handleContainerVirtualZIndexChangeRequiredEvent(t,e,i){const n=this._virtuableComponentMap.get(t);if(void 0===n)throw new u("GLHCVZICRE55935");{const e=n.rootHtmlElement;if(void 0===e)throw new a(m[4]+" "+t.title);e.style.zIndex=i}}}return i})())); \ No newline at end of file +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.goldenLayout=e():t.goldenLayout=e()}(globalThis,(()=>(()=>{"use strict";var t,e={d:(t,i)=>{for(var n in i)e.o(i,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},i={};e.r(i),e.d(i,{ApiError:()=>r,BindError:()=>a,BrowserPopout:()=>lt,ComponentContainer:()=>nt,ComponentItem:()=>ht,ComponentItemConfig:()=>W,ConfigurationError:()=>o,ContentItem:()=>rt,DragSource:()=>yt,EventEmitter:()=>it,EventHub:()=>bt,ExternalError:()=>n,GoldenLayout:()=>xt,Header:()=>gt,HeaderedItemConfig:()=>R,I18nStrings:()=>t,ItemConfig:()=>D,ItemType:()=>y,JsonValue:()=>C,LayoutConfig:()=>B,LayoutManager:()=>St,LogicalZIndex:()=>f,LogicalZIndexToDefaultMap:()=>v,PopoutBlockedError:()=>s,PopoutLayoutConfig:()=>O,ResolvedComponentItemConfig:()=>z,ResolvedGroundItemConfig:()=>P,ResolvedHeaderedItemConfig:()=>E,ResolvedItemConfig:()=>S,ResolvedLayoutConfig:()=>T,ResolvedPopoutLayoutConfig:()=>A,ResolvedRootItemConfig:()=>L,ResolvedRowOrColumnItemConfig:()=>M,ResolvedStackItemConfig:()=>x,ResponsiveMode:()=>w,RootItemConfig:()=>H,RowOrColumn:()=>at,RowOrColumnItemConfig:()=>U,Side:()=>_,SizeUnitEnum:()=>I,Stack:()=>_t,StackItemConfig:()=>k,StyleConstants:()=>p,Tab:()=>mt,VirtualLayout:()=>Et,WidthOrHeightPropertyName:()=>g,formatSize:()=>tt,formatUndefinableSize:()=>et,i18nStrings:()=>m,parseSize:()=>Q});class n extends Error{constructor(t,e){super(e),this.type=t}}class o extends n{constructor(t,e){super("Configuration",t),this.node=e}}class s extends n{constructor(t){super("PopoutBlocked",t)}}class r extends n{constructor(t){super("API",t)}}class a extends n{constructor(t){super("Bind",t)}}class l extends Error{constructor(t,e,i){super(`${t}: ${e}${void 0===i?"":": "+i}`)}}class h extends l{constructor(t,e){super("Assert",t,e)}}class d extends l{constructor(t,e,i){super("UnreachableCase",t,`${e}${void 0===i?"":": "+i}`)}}class c extends l{constructor(t,e){super("UnexpectedNull",t,e)}}class u extends l{constructor(t,e){super("UnexpectedUndefined",t,e)}}!function(t){let e=!1;const i={PopoutCannotBeCreatedWithGroundItemConfig:{id:0,default:"Popout cannot be created with ground ItemConfig"},PleaseRegisterAConstructorFunction:{id:1,default:"Please register a constructor function"},ComponentTypeNotRegisteredAndBindComponentEventHandlerNotAssigned:{id:2,default:"Component type not registered and BindComponentEvent handler not assigned"},ComponentIsAlreadyRegistered:{id:3,default:"Component is already registered"},ComponentIsNotVirtuable:{id:4,default:"Component is not virtuable. Requires rootHtmlElement field/getter"},VirtualComponentDoesNotHaveRootHtmlElement:{id:5,default:'Virtual component does not have getter "rootHtmlElement"'},ItemConfigIsNotTypeComponent:{id:6,default:"ItemConfig is not of type component"},InvalidNumberPartInSizeString:{id:7,default:"Invalid number part in size string"},UnknownUnitInSizeString:{id:8,default:"Unknown unit in size string"},UnsupportedUnitInSizeString:{id:9,default:"Unsupported unit in size string"}};t.idCount=Object.keys(i).length;const n=Object.values(i);t.checkInitialise=function(){if(!e)for(let e=0;e="0"&&t<="9"}function G(t,e){const i=F(Math.max(0,e));t.style.width=i}function Z(t,e){const i=F(Math.max(0,e));t.style.height=i}function q(t){return{width:t.offsetWidth,height:t.offsetHeight}}function j(t){let e,i,n=t.mozInnerScreenX,o=t.mozInnerScreenY;return void 0===n||void 0===o?(e=(t.outerWidth-t.innerWidth)/2,i=t.outerHeight-t.innerHeight-e):(e=n-t.screenX,i=o-t.screenY),{width:Math.max(0,e),height:Math.max(0,i)}}function $(t){let e=t.mozInnerScreenX,i=t.mozInnerScreenY;if(void 0===e||void 0===i){const n=j(t);e=t.screenX+n.width,i=t.screenY+n.height}return{left:e,top:i}}function X(t,e){t.style.display=e?"":"none"}function Y(t,e){if(void 0!==e)for(const i in e)if(e.hasOwnProperty(i)){const n=e[i],o=t[i];t[i]=J(o,n)}return t}function J(t,e){if("object"!=typeof e)return e;if(Array.isArray(e)){const t=e.length,i=new Array(t);for(let n=0;n36)throw new Error("Too many keys in config minifier map")},t.translateObject=n}(b||(b={})),function(t){t.defaults={type:y.ground,content:[],size:1,sizeUnit:I.Fractional,minSize:void 0,minSizeUnit:I.Pixel,id:"",isClosable:!0},t.createCopy=function(t,e){switch(t.type){case y.ground:case y.row:case y.column:return M.createCopy(t,e);case y.stack:return x.createCopy(t,e);case y.component:return z.createCopy(t);default:throw new d("CICC91354",t.type,"Invalid Config Item type specified")}},t.createDefault=function(t){switch(t){case y.ground:throw new h("CICCDR91562");case y.row:case y.column:return M.createDefault(t);case y.stack:return x.createDefault();case y.component:return z.createDefault();default:throw new d("CICCDD91563",t,"Invalid Config Item type specified")}},t.isComponentItem=function(t){return t.type===y.component},t.isStackItem=function(t){return t.type===y.stack},t.isGroundItem=function(t){return t.type===y.ground}}(S||(S={})),function(t){let e;t.defaultMaximised=!1,function(t){t.createCopy=function(t,e){return void 0===t?void 0:{show:null!=e?e:t.show,popout:t.popout,close:t.close,maximise:t.maximise,minimise:t.minimise,tabDropdown:t.tabDropdown}}}(e=t.Header||(t.Header={}))}(E||(E={})),function(t){function e(t){const e=t.length,i=new Array(e);for(let n=0;n"__glMaximised"===t));t>0&&(o=!0,n=n.splice(t,1)),e=n.length>0?n[0]:S.defaults.id}else e=n;return i=void 0!==t.maximised?t.maximised:o,{id:e,maximised:i}}}(R||(R={})),function(t){function e(t){if(void 0===t)return[];{const e=t.length,i=new Array(e);for(let n=0;n0?e.content[0]:void 0,{resolved:!0,root:H.resolve(i),openPopouts:t.resolveOpenPopouts(e.openPopouts),dimensions:t.Dimensions.resolve(e.dimensions),settings:t.Settings.resolve(e.settings),header:t.Header.resolve(e.header,e.settings,e.labels)}}},t.fromResolved=function(e){return{root:H.fromResolvedOrUndefined(e.root),openPopouts:O.fromResolvedArray(e.openPopouts),settings:T.Settings.createCopy(e.settings),dimensions:t.Dimensions.fromResolved(e.dimensions),header:T.Header.createCopy(e.header)}},t.isResolved=function(t){const e=t;return void 0!==e.resolved&&!0===e.resolved},t.resolveOpenPopouts=function(t){if(void 0===t)return[];{const e=t.length,i=new Array(e);for(let n=0;n0?e.content[0]:void 0,{root:H.resolve(o),openPopouts:B.resolveOpenPopouts(e.openPopouts),dimensions:B.Dimensions.resolve(e.dimensions),settings:B.Settings.resolve(e.settings),header:B.Header.resolve(e.header,e.settings,e.labels),parentId:null!==(i=e.parentId)&&void 0!==i?i:null,indexInParent:null!==(n=e.indexInParent)&&void 0!==n?n:null,window:t.Window.resolve(e.window,e.dimensions),resolved:!0}},t.fromResolved=function(e){return{root:H.fromResolvedOrUndefined(e.root),openPopouts:i(e.openPopouts),dimensions:B.Dimensions.fromResolved(e.dimensions),settings:T.Settings.createCopy(e.settings),header:T.Header.createCopy(e.header),parentId:e.parentId,indexInParent:e.indexInParent,window:t.Window.fromResolved(e.window)}},t.fromResolvedArray=i}(O||(O={}));class it{constructor(){this._allEventSubscriptions=[],this._subscriptionsMap=new Map,this.unbind=this.removeEventListener,this.trigger=this.emit}tryBubbleEvent(t,e){}emit(t,...e){let i=this._subscriptionsMap.get(t);if(void 0!==i){i=i.slice();for(let t=0;t0){const n=e.slice();n.unshift(t);const o=this._allEventSubscriptions.slice();for(let t=0;tthis.onPointerDown(t),this._pointerMoveEventListener=t=>this.onPointerMove(t),this._pointerUpEventListener=t=>this.onPointerUp(t),this._timeout=void 0,this._allowableTargets=[t,...e],this._oDocument=document,this._eBody=document.body,this._nDelay=1800,this._nDistance=10,this._originalEvent={pageX:0,pageY:0,screenX:0,screenY:0},this._dragging=!1,this._eElement.addEventListener("pointerdown",this._pointerDownEventListener,{passive:!0})}destroy(){this.checkRemovePointerTrackingEventListeners(),this._eElement.removeEventListener("pointerdown",this._pointerDownEventListener)}cancelDrag(){this.processDragStop(void 0)}onPointerDown(t){this._allowableTargets.includes(t.target)&&t.isPrimary&&this.processPointerDown(t)}processPointerDown(t){this._originalEvent=t,this._oDocument.addEventListener("pointermove",this._pointerMoveEventListener),this._oDocument.addEventListener("pointerup",this._pointerUpEventListener,{passive:!0}),this._eBody.classList.add("lm_pointer_tracking"),this._pointerTracking=!0,this._timeout=setTimeout((()=>{try{this.startDrag()}catch(t){throw console.error(t),t}}),this._nDelay)}onPointerMove(t){this._pointerTracking&&(this.processDragMove(t),t.preventDefault())}processDragMove(t){const e=t.pageX-this._originalEvent.pageX,i=t.pageY-this._originalEvent.pageY;!1===this._dragging&&(Math.abs(e)>this._nDistance||Math.abs(i)>this._nDistance)&&this.startDrag(),this._dragging&&this.emit("drag",e,i,t)}onPointerUp(t){this.processDragStop(t)}processDragStop(t){void 0!==this._timeout&&(clearTimeout(this._timeout),this._timeout=void 0),this.checkRemovePointerTrackingEventListeners(),!0===this._dragging&&(this._eBody.classList.remove("lm_dragging"),this._eElement.classList.remove("lm_dragging"),this._dragging=!1,this.emit("dragStop",t))}checkRemovePointerTrackingEventListeners(){this._pointerTracking&&(this._oDocument.removeEventListener("pointermove",this._pointerMoveEventListener),this._oDocument.removeEventListener("pointerup",this._pointerUpEventListener),this._eBody.classList.remove("lm_pointer_tracking"),this._pointerTracking=!1)}startDrag(){void 0!==this._timeout&&(clearTimeout(this._timeout),this._timeout=void 0),this._dragging=!0,this._eBody.classList.add("lm_dragging"),this._eElement.classList.add("lm_dragging"),this.emit("dragStart",this._originalEvent.pageX,this._originalEvent.pageY),this.emit("drag",0,0,this._originalEvent)}}class st{constructor(t,e,i){this._isVertical=t,this._size=e,this._grabSize=i0)this.updateSize(!1);else if(!this.isGround){if(null===this._parent)throw new c("CIUC00874");this._parent.removeChild(this)}}addChild(t,e,i){return null!=e||(e=this._contentItems.length),this._contentItems.splice(e,0,t),t.setParent(this),!0===this._isInitialised&&!1===t._isInitialised&&t.init(),e}replaceChild(t,e,i=!1){const n=this._contentItems.indexOf(t),o=t._element.parentNode;if(-1===n)throw new h("CIRCI23232","Can't replace child. oldChild is not child of this");if(null===o)throw new c("CIRCP23232");if(o.replaceChild(e._element,t._element),!0===i&&(t._parent=null,t.destroy()),this._contentItems[n]=e,e.setParent(this),e.size=t.size,e.sizeUnit=t.sizeUnit,e.minSize=t.minSize,e.minSizeUnit=t.minSizeUnit,null===e._parent)throw new c("CIRCNC45699");!0===e._parent._isInitialised&&!1===e._isInitialised&&e.init(),this.updateSize(!1)}remove(){if(null===this._parent)throw new c("CIR11110");this._parent.removeChild(this)}popout(){const t=K(),e=this.layoutManager.createPopoutFromContentItem(this,void 0,t,void 0);return this.emitBaseBubblingEvent("stateChanged"),e}calculateConfigContent(){const t=this._contentItems,e=t.length,i=new Array(e);for(let n=0;n1)return t;t=t.parent}return null}findDockPoint(){const t=this.findAncestorWithSiblings();if(null!==t&&null!==t.parent){const e=t.parent._contentItems.indexOf(t);return{parent:t.parent,index:e}}return this.layoutManager.groundItem?{parent:this.layoutManager.groundItem,index:null}:null}init(){this._isInitialised=!0,this.emitBaseBubblingEvent("itemCreated"),this.emitUnknownBubblingEvent(this.type+"Created")}setParent(t){this._parent=t}addPopInParentId(t){this.popInParentIds.includes(t)||this.popInParentIds.push(t)}initContentItems(){for(let t=0;tthis.propagateEventToLayoutManager(t,e))))}propagateEventToLayoutManager(t,e){this._pendingEventPropagations[t]=!1,this.layoutManager.emitUnknown(t,e)}}class at extends rt{constructor(t,e,i,n){switch(super(e,i,n,at.createElement(document,t)),this._rowOrColumnParent=n,this._splitter=[],this.isRow=!t,this.isColumn=t,this._childElementContainer=this.element,this._splitterSize=e.layoutConfig.dimensions.borderWidth,this._splitterGrabSize=e.layoutConfig.dimensions.borderGrabWidth,this._isColumn=t,this._dimension=t?"height":"width",this._splitterPosition=null,this._splitterMinPosition=null,this._splitterMaxPosition=null,i.type){case y.row:case y.column:this._configType=i.type;break;default:throw new h("ROCCCT00925")}}newComponent(t,e,i,n){const o={type:"component",componentType:t,componentState:e,title:i};return this.newItem(o,n)}addComponent(t,e,i,n){const o={type:"component",componentType:t,componentState:e,title:i};return this.addItem(o,n)}newItem(t,e){e=this.addItem(t,e);const i=this.contentItems[e];return rt.isStack(i)&&D.isComponent(t)?i.contentItems[0]:i}addItem(t,e){this.layoutManager.checkMinimiseMaximisedStack();const i=D.resolve(t,!1),n=this.layoutManager.createAndInitContentItem(i,this);return this.addChild(n,e,!1)}addChild(t,e,i){if(void 0===e&&(e=this.contentItems.length),this.contentItems.length>0){const i=this.createSplitter(Math.max(0,e-1)).element;e>0?(this.contentItems[e-1].element.insertAdjacentElement("afterend",i),i.insertAdjacentElement("afterend",t.element)):(this.contentItems[0].element.insertAdjacentElement("beforebegin",i),i.insertAdjacentElement("beforebegin",t.element))}else this._childElementContainer.appendChild(t.element);super.addChild(t,e);const n=1/this.contentItems.length*100;if(!0===i)return this.emitBaseBubblingEvent("stateChanged"),e;for(let e=0;e0&&(this.calculateRelativeSizes(),this.setAbsoluteSizes()),this.emitBaseBubblingEvent("stateChanged"),this.emit("resize")}setAbsoluteSizes(){const t=this.calculateAbsoluteSizes();for(let e=0;e0&&t.itemSizes[e]++,this._isColumn?(G(this.contentItems[e].element,t.crossAxisSize),Z(this.contentItems[e].element,t.itemSizes[e])):(G(this.contentItems[e].element,t.itemSizes[e]),Z(this.contentItems[e].element,t.crossAxisSize))}calculateAbsoluteSizes(){const t=(this.contentItems.length-1)*this._splitterSize,{width:e,height:i}=q(this.element);let n,o;this._isColumn?(n=i-t,o=e):(n=e-t,o=i);let s=0;const r=[];for(let t=0;t0){const n=100-t;for(let t=0;t100&&e.length>0){for(let t=0;te)return;{const r=i/e;let a=i;for(let e=0;ethis.onSplitterDrag(e,t,i))),e.on("dragStop",(()=>this.onSplitterDragStop(e))),e.on("dragStart",(()=>this.onSplitterDragStart(e))),this._splitter.splice(t,0,e),e}getSplitItems(t){const e=this._splitter.indexOf(t);return{before:this.contentItems[e],after:this.contentItems[e+1]}}calculateContentItemMinSize(t){const e=t.minSize;if(void 0!==e){if(t.minSizeUnit===I.Pixel)return e;throw new h("ROCGMD98831",JSON.stringify(t))}{const t=this.layoutManager.layoutConfig.dimensions;return this._isColumn?t.defaultMinItemHeight:t.defaultMinItemWidth}}calculateContentItemsTotalMinSize(t){let e=0;for(const i of t.contentItems){const n=this.calculateContentItemsTotalMinSize(i);t instanceof at&&t.isColumn===this._isColumn?e+=n:e=Math.max(e,n)}const i=this.calculateContentItemMinSize(t);return Math.max(i,e)}onSplitterDragStart(t){const e=this.getSplitItems(t),i=V(e.before.element.style[this._dimension]),n=V(e.after.element.style[this._dimension]),o=this.calculateContentItemsTotalMinSize(e.before),s=this.calculateContentItemsTotalMinSize(e.after);this._splitterPosition=0,this._splitterMinPosition=Math.min(0,-1*(i-o)),this._splitterMaxPosition=Math.max(0,n-s)}onSplitterDrag(t,e,i){let n=this._isColumn?i:e;if(null===this._splitterMinPosition||null===this._splitterMaxPosition)throw new c("ROCOSD59226");n=Math.max(n,this._splitterMinPosition),n=Math.min(n,this._splitterMaxPosition),this._splitterPosition=n;const o=F(n);this._isColumn?t.element.style.top=o:t.element.style.left=o}onSplitterDragStop(t){if(null===this._splitterPosition)throw new c("ROCOSDS66932");{const e=this.getSplitItems(t),i=V(e.before.element.style[this._dimension]),n=V(e.after.element.style[this._dimension]),o=(this._splitterPosition+i)/(i+n),s=e.before.size+e.after.size;e.before.size=o*s,e.after.size=(1-o)*s,t.element.style.top=F(0),t.element.style.left=F(0),globalThis.requestAnimationFrame((()=>this.updateSize(!1)))}}}!function(t){t.getElementDimensionSize=function(t,e){return"width"===e?function(t){return t.offsetWidth}(t):function(t){return t.offsetHeight}(t)},t.setElementDimensionSize=function(t,e,i){return"width"===e?G(t,i):Z(t,i)},t.createElement=function(t,e){const i=t.createElement("div");return i.classList.add("lm_item"),e?i.classList.add("lm_column"):i.classList.add("lm_row"),i}}(at||(at={}));class lt extends it{constructor(t,e,i){super(),this._config=t,this._initialWindowSize=e,this._layoutManager=i,this._isInitialised=!1,this._popoutWindow=null,this._preventPopInOnClose=!1,this.createWindow()}toConfig(){var t,e;if(!1===this._isInitialised)throw new Error("Can't create config, layout not yet initialised");const i=this.getGlInstance().saveLayout();let n,o;null===this._popoutWindow?(n=null,o=null):(n=null!==(t=this._popoutWindow.screenX)&&void 0!==t?t:this._popoutWindow.screenLeft,o=null!==(e=this._popoutWindow.screenY)&&void 0!==e?e:this._popoutWindow.screenTop);const s={width:this.getGlInstance().width,height:this.getGlInstance().height,left:n,top:o};return{root:i.root,openPopouts:i.openPopouts,settings:i.settings,dimensions:i.dimensions,header:i.header,window:s,parentId:this._config.parentId,indexInParent:this._config.indexInParent,resolved:!0}}getGlInstance(){if(null===this._popoutWindow)throw new c("BPGGI24693");return this._popoutWindow.__glInstance}getWindow(){if(null===this._popoutWindow)throw new c("BPGW087215");return this._popoutWindow}close(t=!1){if(t&&(this._preventPopInOnClose=!0),this.getGlInstance())this.getGlInstance().closeWindow();else try{this.getWindow().close()}catch(t){}}popIn(){let t,e=this._config.indexInParent;if(!this._config.parentId)return;let i=Y({},this.getGlInstance().saveLayout()).root;if(void 0===i)return;const n=this._layoutManager.groundItem;if(void 0===n)throw new u("BPPIG34972");if(t=n.getItemsByPopInParentId(this._config.parentId)[0],t||(t=n.contentItems.length>0?n.contentItems[0]:n,e=t.contentItems.length),t.isStack){for(;i.type!==y.component&&1===i.content.length;)i=i.content[0];if(i.type!==y.component){if(null===t.parent)throw new c("BPPIG34973");const i=new at(!1,this._layoutManager,M.createDefault("row"),t.parent);t.parent.replaceChild(t,i,!1),i.addChild(t),t=i,e=1}}const o=this._layoutManager.createAndInitContentItem(i,t);e=null!==e?Math.max(0,Math.min(t.contentItems.length,e)):null,t.addChild(o,e),this._layoutManager.layoutConfig.settings.popInOnClose?this._onClose():this.close()}createWindow(){const t=this.createUrl(),e=Math.floor(1e6*Math.random()).toString(36),i=this.serializeWindowFeatures({left:this._initialWindowSize.left,top:this._initialWindowSize.top,width:this._initialWindowSize.width,height:this._initialWindowSize.height,innerWidth:this._initialWindowSize.width,innerHeight:this._initialWindowSize.height,menubar:"no",toolbar:"no",location:"no",personalbar:"no",resizable:"yes",scrollbars:"no",status:"no"});if(this._popoutWindow=globalThis.open(t,e,i),this._popoutWindow)this._popoutWindow.addEventListener("load",(()=>{this.positionAndResizeWindow(),this._popoutWindow&&this._popoutWindow.addEventListener("beforeunload",(()=>{this._layoutManager.layoutConfig.settings.popInOnClose&&!this._preventPopInOnClose?this.popIn():this._onClose()}),{passive:!0})}),{passive:!0}),this._checkReadyInterval=setInterval((()=>this.checkReady()),10);else if(!0===this._layoutManager.layoutConfig.settings.blockedPopoutsThrowError)throw new s("Popout blocked")}checkReady(){if(null===this._popoutWindow)throw new c("BPCR01844");this._popoutWindow.__glInstance&&this._popoutWindow.__glInstance.isInitialised&&(this._popoutWindow.__glInstance.parent=this._layoutManager,this.onInitialised(),void 0!==this._checkReadyInterval&&(clearInterval(this._checkReadyInterval),this._checkReadyInterval=void 0))}positionAndResizeWindow(){if(null===this._popoutWindow)throw new c("BPPARW1");if(this._popoutWindow.innerWidth>0&&this._popoutWindow.innerHeight>0&&this._popoutWindow.outerWidth>0&&this._popoutWindow.outerHeight>0&&this._popoutWindow.innerWidth<=this._popoutWindow.outerWidth&&this._popoutWindow.innerHeight<=this._popoutWindow.outerHeight){const t=j(this._popoutWindow);this._popoutWindow.moveTo(this._initialWindowSize.left-t.width,this._initialWindowSize.top-t.height),this._popoutWindow.resizeTo(this._initialWindowSize.width+(this._popoutWindow.outerWidth-this._popoutWindow.innerWidth),this._initialWindowSize.height+(this._popoutWindow.outerHeight-this._popoutWindow.innerHeight))}this._popoutWindow.focus()}serializeWindowFeatures(t){const e=[];for(const i in t)e.push(i+"="+t[i].toString());return e.join(",")}createUrl(){const t="gl-window-config-"+K(),e=T.minifyConfig(this._config);try{localStorage.setItem(t,JSON.stringify(e))}catch(t){throw new Error("Error while writing to localStorage "+function(t){return t instanceof Error?t.message:"string"==typeof t?t:"Unknown Error"}(t))}const i=new URL("/gl-popout",location.origin);i.searchParams.set("gl-window",t);const n=this._layoutManager.container.dataset.theme;return void 0!==n&&i.searchParams.set("gl-theme",n),i.toString()}onInitialised(){this._isInitialised=!0,this.getGlInstance().on("popIn",(()=>this.popIn())),this.emit("initialised")}_onClose(){setTimeout((()=>this.emit("closed")),50)}}class ht extends rt{constructor(t,e,i){super(t,e,i,document.createElement("div")),this._parentItem=i,this._focused=!1,this.isComponent=!0,this._reorderEnabled=e.reorderEnabled,this.applyUpdatableConfig(e),this._initialWantMaximise=e.maximised;const n=document.createElement("div");n.classList.add("lm_content"),this.element.appendChild(n),this._container=new nt(e,this,t,n,(t=>this.handleUpdateItemConfigEvent(t)),(()=>this.show()),(()=>this.hide()),(t=>this.focus(t)),(t=>this.blur(t)))}get componentName(){return this._container.componentType}get componentType(){return this._container.componentType}get reorderEnabled(){return this._reorderEnabled}get initialWantMaximise(){return this._initialWantMaximise}get component(){return this._container.component}get container(){return this._container}get parentItem(){return this._parentItem}get headerConfig(){return this._headerConfig}get title(){return this._title}get tab(){return this._tab}get focused(){return this._focused}destroy(){this._container.destroy(),super.destroy()}applyUpdatableConfig(t){this.setTitle(t.title),this._headerConfig=t.header}toConfig(){const t=this._container.stateRequestEvent,e=void 0===t?this._container.state:t();return{type:y.component,content:[],size:this.size,sizeUnit:this.sizeUnit,minSize:this.minSize,minSizeUnit:this.minSizeUnit,id:this.id,maximised:!1,isClosable:this.isClosable,reorderEnabled:this._reorderEnabled,title:this._title,header:E.Header.createCopy(this._headerConfig),componentType:z.copyComponentType(this.componentType),componentState:e}}close(){if(null===this.parent)throw new c("CIC68883");this.parent.removeChild(this,!1)}enterDragMode(t,e){G(this.element,t),Z(this.element,e),this._container.enterDragMode(t,e)}exitDragMode(){this._container.exitDragMode()}enterStackMaximised(){this._container.enterStackMaximised()}exitStackMaximised(){this._container.exitStackMaximised()}drag(){this._container.drag()}getOuterBoundingClientRect(){var t;const e=this.element.getBoundingClientRect(),i=null===(t=this.headerConfig)||void 0===t?void 0:t.show,n=T.Dimensions.defaults.headerHeight,o="left"===i||"right"===i?n:0,s="top"===i||"bottom"===i||void 0===i?n:0;return DOMRect.fromRect({x:e.left-o,y:e.top-s,width:e.width+o,height:e.height+s})}updateSize(t){this.updateNodeSize(t)}init(){this.updateNodeSize(!1),super.init(),this._container.emit("open"),this.initContentItems()}setTitle(t){this._title=t,this.emit("titleChanged",t),this.emit("stateChanged")}setTab(t){this._tab=t,this.emit("tab",t),this._container.setTab(t)}hide(){super.hide(),this._container.setVisibility(!1)}show(){super.show(),this._container.setVisibility(!0)}focus(t=!1){this.parentItem.setActiveComponentItem(this,!0,t)}setFocused(t){this._focused=!0,this.tab.setFocused(),t||this.emitBaseBubblingEvent("focus")}blur(t=!1){this._focused&&this.layoutManager.setFocusedComponentItem(void 0,t)}setBlurred(t){this._focused=!1,this.tab.setBlurred(),t||this.emitBaseBubblingEvent("blur")}setParent(t){this._parentItem=t,super.setParent(t)}handleUpdateItemConfigEvent(t){this.applyUpdatableConfig(t)}updateNodeSize(t){if("none"!==this.element.style.display){const{width:e,height:i}=q(this.element);this._container.setSizeToNodeSize(e,i,t)}}}class dt extends rt{constructor(){super(...arguments),this._focused=!1}get focused(){return this._focused}setFocusedValue(t){this._focused=t}}class ct extends dt{constructor(t,e,i){super(t,P.create(e),null,ct.createElement(document)),this.isGround=!0,this._childElementContainer=this.element,this._containerElement=i;let n=null;for(;;){const t=n?n.previousSibling:this._containerElement.lastChild;if(!(t instanceof Element&&t.classList.contains("lm_content")))break;n=t}this._containerElement.insertBefore(this.element,n)}init(){if(!0!==this.isInitialised){this.updateNodeSize();for(let t=0;t0?this.contentItems[0]:this,n.isComponent)throw new Error("Cannot add item as child to ComponentItem");{const t=this.layoutManager.createAndInitContentItem(i,n);return e=n.addChild(t,e),n===this?-1:e}}loadComponentAsRoot(t){this.clearRoot();const e=D.resolve(t,!1);if(e.maximised)throw new Error("Root Component cannot be maximised");{const t=new ht(this.layoutManager,e,this);t.init(),this.addChild(t,0)}}addChild(t,e){if(this.contentItems.length>0)throw new Error("Ground node can only have a single child");return this._childElementContainer.appendChild(t.element),e=super.addChild(t,e),this.updateSize(!1),this.emitBaseBubblingEvent("stateChanged"),e}calculateConfigContent(){const t=this.contentItems,e=t.length,i=new Array(e);for(let n=0;n0&&(G(this.contentItems[0].element,t),Z(this.contentItems[0].element,e)),this.updateContentItemsSize(!1))}updateSize(t){this.layoutManager.beginVirtualSizedContainerAdding();try{this.updateNodeSize(),this.updateContentItemsSize(t)}finally{this.layoutManager.endVirtualSizedContainerAdding()}}createSideAreas(){const t=ct.Area.oppositeSides,e=new Array(Object.keys(t).length);let i=0;for(const n in t){const o=n,s=this.getElementArea();if(null===s)throw new c("RCSA77553");s.side=o,"2"===t[o][1]?s[o]=s[t[o]]-50:s[o]=s[t[o]]+50,s.surface=(s.x2-s.x1)*(s.y2-s.y1),e[i++]=s}return e}highlightDropZone(t,e,i){this.layoutManager.tabDropPlaceholder.remove(),super.highlightDropZone(t,e,i)}onDrop(t,e){if(t.isComponent){const e=x.createDefault(),i=t;e.header=E.Header.createCopy(i.headerConfig);const n=this.layoutManager.createAndInitContentItem(e,this);n.addChild(t),t=n}if(0===this.contentItems.length)this.addChild(t);else{if(t.type===y.row||t.type===y.column){const e=x.createDefault(),i=this.layoutManager.createContentItem(e,this);i.addChild(t),t=i}const i="x"==e.side[0]?y.row:y.column,n="2"==e.side[1],o=this.contentItems[0];if(o instanceof at&&o.type===i){const e=o.contentItems[n?0:o.contentItems.length-1];o.addChild(t,n?0:void 0,!0),e.size*=.5,t.size=e.size,t.sizeUnit=I.Percent,o.updateSize(!1)}else{const e=S.createDefault(i),s=this.layoutManager.createContentItem(e,this);this.replaceChild(o,s),s.addChild(t,n?0:void 0,!0),s.addChild(o,n?void 0:0,!0),o.size=50,t.size=50,t.sizeUnit=I.Percent,s.updateSize(!1)}}}dock(){throw new h("GID87731")}validateDocking(){throw new h("GIVD87732")}getAllContentItems(){const t=[this];return this.deepGetAllContentItems(this.contentItems,t),t}getAllComponentItems(){const t=[];return this.deepFilterContentItems(this.contentItems,t,(t=>t.isComponent)),t}getConfigMaximisedItems(){const t=[];return this.deepFilterContentItems(this.contentItems,t,(t=>!(!rt.isStack(t)||!t.initialWantMaximise)||!(!rt.isComponentItem(t)||!t.initialWantMaximise))),t}getItemsByPopInParentId(t){const e=[];return this.deepFilterContentItems(this.contentItems,e,(e=>e.popInParentIds.includes(t))),e}toConfig(){throw new Error("Cannot generate GroundItem config")}setActiveComponentItem(t,e,i){}updateNodeSize(){const{width:t,height:e}=q(this._containerElement);G(this.element,t),Z(this.element,e),this.contentItems.length>0&&(G(this.contentItems[0].element,t),Z(this.contentItems[0].element,e))}deepGetAllContentItems(t,e){for(let i=0;ithis.onClick(t),this._touchStartEventListener=t=>this.onTouchStart(t),this._element=document.createElement("div"),this._element.classList.add(i),this._element.title=e,this._header.on("destroy",(()=>this.destroy())),this._element.addEventListener("click",this._clickEventListener,{passive:!0}),this._element.addEventListener("touchstart",this._touchStartEventListener,{passive:!0}),this._header.controlsContainerElement.appendChild(this._element)}get element(){return this._element}destroy(){var t;this._element.removeEventListener("click",this._clickEventListener),this._element.removeEventListener("touchstart",this._touchStartEventListener),null===(t=this._element.parentNode)||void 0===t||t.removeChild(this._element)}onClick(t){this._pushEvent(t)}onTouchStart(t){this._pushEvent(t)}}class mt{constructor(t,e,i,n,o){var s;this._layoutManager=t,this._componentItem=e,this._closeEvent=i,this._focusEvent=n,this._dragStartEvent=o,this._isActive=!1,this._tabClickListener=t=>this.onTabClickDown(t),this._tabTouchStartListener=t=>this.onTabTouchStart(t),this._closeClickListener=()=>this.onCloseClick(),this._closeTouchStartListener=()=>this.onCloseTouchStart(),this._dragStartListener=(t,e)=>this.onDragStart(t,e),this._contentItemDestroyListener=()=>this.onContentItemDestroy(),this._tabTitleChangedListener=t=>this.setTitle(t),this._element=document.createElement("div"),this._element.classList.add("lm_tab"),this._titleElement=document.createElement("span"),this._titleElement.classList.add("lm_title"),this._closeElement=document.createElement("div"),this._closeElement.classList.add("lm_close_tab"),this._element.appendChild(this._titleElement),this._element.appendChild(this._closeElement),e.isClosable?(this._closeElement.style.display="",this.element.classList.add("lm_closable")):this._closeElement.style.display="none",this.setTitle(e.title),this._componentItem.on("titleChanged",this._tabTitleChangedListener),(null!==(s=e.reorderEnabled)&&void 0!==s?s:this._layoutManager.layoutConfig.settings.reorderEnabled)&&this.enableReorder(),this._element.addEventListener("click",this._tabClickListener,{passive:!0}),this._element.addEventListener("touchstart",this._tabTouchStartListener,{passive:!0}),this._componentItem.isClosable?(this._closeElement.addEventListener("click",this._closeClickListener,{passive:!0}),this._closeElement.addEventListener("touchstart",this._closeTouchStartListener,{passive:!0})):(this._closeElement.remove(),this._closeElement=void 0),this._componentItem.setTab(this),this._layoutManager.emit("tabCreated",this)}get isActive(){return this._isActive}get componentItem(){return this._componentItem}get contentItem(){return this._componentItem}get element(){return this._element}get titleElement(){return this._titleElement}get closeElement(){return this._closeElement}get reorderEnabled(){return void 0!==this._dragListener}set reorderEnabled(t){t!==this.reorderEnabled&&(t?this.enableReorder():this.disableReorder())}setTitle(t){this._titleElement.innerText=t,this._element.title=t}setActive(t){t!==this._isActive&&(this._isActive=t,t?this._element.classList.add("lm_active"):this._element.classList.remove("lm_active"))}destroy(){var t,e;this._closeEvent=void 0,this._focusEvent=void 0,this._dragStartEvent=void 0,this._element.removeEventListener("click",this._tabClickListener),this._element.removeEventListener("touchstart",this._tabTouchStartListener),null===(t=this._closeElement)||void 0===t||t.removeEventListener("click",this._closeClickListener),null===(e=this._closeElement)||void 0===e||e.removeEventListener("touchstart",this._closeTouchStartListener),this._componentItem.off("titleChanged",this._tabTitleChangedListener),this.reorderEnabled&&this.disableReorder(),this._element.remove()}setBlurred(){this._element.classList.remove("lm_focused"),this._titleElement.classList.remove("lm_focused")}setFocused(){this._element.classList.add("lm_focused"),this._titleElement.classList.add("lm_focused")}onDragStart(t,e){if(void 0===this._dragListener)throw new u("TODSDLU10093");if(void 0===this._dragStartEvent)throw new u("TODS23309");this._dragStartEvent(t,e,this._dragListener,this.componentItem)}onContentItemDestroy(){void 0!==this._dragListener&&(this._dragListener.destroy(),this._dragListener=void 0)}onTabClickDown(t){const e=t.target;e!==this._element&&e!==this._titleElement||(0===t.button?this.notifyFocus():1===t.button&&this._componentItem.isClosable&&this.notifyClose())}onTabTouchStart(t){t.target===this._element&&this.notifyFocus()}onCloseClick(){this.notifyClose()}onCloseTouchStart(){this.notifyClose()}notifyClose(){if(void 0===this._closeEvent)throw new u("TNC15007");this._closeEvent(this._componentItem)}notifyFocus(){if(void 0===this._focusEvent)throw new u("TNA15007");this._focusEvent(this._componentItem)}enableReorder(){this._dragListener=new ot(this._element,[this._titleElement]),this._dragListener.on("dragStart",this._dragStartListener),this._componentItem.on("destroy",this._contentItemDestroyListener)}disableReorder(){if(void 0===this._dragListener)throw new u("TDR87745");this._componentItem.off("destroy",this._contentItemDestroyListener),this._dragListener.off("dragStart",this._dragStartListener),this._dragListener=void 0}}class pt{constructor(t,e,i,n,o){this._layoutManager=t,this._componentRemoveEvent=e,this._componentFocusEvent=i,this._componentDragStartEvent=n,this._dropdownActiveChangedEvent=o,this._tabs=[],this._lastVisibleTabIndex=-1,this._dropdownActive=!1,this._element=document.createElement("section"),this._element.classList.add("lm_tabs"),this._dropdownElement=document.createElement("section"),this._dropdownElement.classList.add("lm_tabdropdown_list"),this._dropdownElement.style.display="none"}get tabs(){return this._tabs}get tabCount(){return this._tabs.length}get lastVisibleTabIndex(){return this._lastVisibleTabIndex}get element(){return this._element}get dropdownElement(){return this._dropdownElement}get dropdownActive(){return this._dropdownActive}destroy(){for(let t=0;tthis.handleTabCloseEvent(t)),(t=>this.handleTabFocusEvent(t)),((t,e,i,n)=>this.handleTabDragStartEvent(t,e,i,n)));void 0===e&&(e=this._tabs.length),this._tabs.splice(e,0,i),ethis._lastVisibleTabIndex){const t=this._tabs[e];for(let t=e;t>0;t--)this._tabs[t]=this._tabs[t-1];this._tabs[0]=t}}updateTabSizes(t,e){let i=!1;this.tryUpdateTabSizes(i,t,e)||(i=!0,this.tryUpdateTabSizes(i,t,e)),this._element.style.maxWidth=F(Math.max(0,t)),i!==this._dropdownActive&&(this._dropdownActive=i,this._dropdownActiveChangedEvent())}tryUpdateTabSizes(t,e,i){if(this._tabs.length>0){if(void 0===i)throw new Error("non-empty tabs must have active component item");let n=0,o=!1;const s=this._layoutManager.layoutConfig.settings.tabOverlapAllowance,r=this._tabs.indexOf(i.tab),a=this._tabs[r];this._lastVisibleTabIndex=-1;for(let i=0;ie){if(o)i===r&&(l.style.zIndex="auto",l.style.marginLeft="",l.parentElement!==this._element&&this._element.appendChild(l));else{let t;if(t=r>0&&r<=i?(d-e)/(i-1):(d-e)/i,tthis.onClick(t),this._touchStartListener=t=>this.onTouchStart(t),this._layoutStateListener=()=>this.onLayoutChanged(),this._tabsContainer=new pt(this._layoutManager,(t=>this.handleTabInitiatedComponentRemoveEvent(t)),(t=>this.handleTabInitiatedComponentFocusEvent(t)),((t,e,i,n)=>this.handleTabInitiatedDragStartEvent(t,e,i,n)),(()=>this.processTabDropdownActiveChanged())),this._show=i.show,this._popoutLabel=i.popoutLabel,this._maximiseLabel=i.maximiseLabel,this._minimiseLabel=i.minimiseLabel,this._closeLabel=i.closeLabel,this._tabDropdownEnabled=i.tabDropdownEnabled,this._tabDropdownLabel=i.tabDropdownLabel,this.setSide(i.side),this._element=document.createElement("section"),this._element.classList.add("lm_header"),this._controlsContainerElement=document.createElement("section"),this._controlsContainerElement.classList.add("lm_controls"),this._element.appendChild(this._tabsContainer.element),this._element.appendChild(this._controlsContainerElement),this._element.appendChild(this._tabsContainer.dropdownElement),this._element.addEventListener("click",this._clickListener,{passive:!0}),this._element.addEventListener("touchstart",this._touchStartListener,{passive:!0}),this._documentMouseUpListener=()=>this._tabsContainer.hideAdditionalTabsDropdown(),globalThis.document.addEventListener("mouseup",this._documentMouseUpListener,{passive:!0}),this._tabControlOffset=this._layoutManager.layoutConfig.settings.tabControlOffset,this._tabDropdownEnabled&&(this._tabDropdownButton=new ut(this,this._tabDropdownLabel,"lm_tabdropdown",(()=>this._tabsContainer.showAdditionalTabsDropdown()))),this._popoutButton=new ut(this,this._popoutLabel,"lm_popout",(()=>this.handleButtonPopoutEvent())),this._maximiseButton=new ut(this,this._maximiseLabel,"lm_maximise",(t=>this.handleButtonMaximiseToggleEvent(t))),this._closeButton=new ut(this,this._closeLabel,"lm_close",(()=>o())),this.processTabDropdownActiveChanged(),this.layoutManager.addEventListener("stateChanged",this._layoutStateListener)}get show(){return this._show}get side(){return this._side}get leftRightSided(){return this._leftRightSided}get layoutManager(){return this._layoutManager}get parent(){return this._parent}get tabs(){return this._tabsContainer.tabs}get lastVisibleTabIndex(){return this._tabsContainer.lastVisibleTabIndex}get element(){return this._element}get tabsContainerElement(){return this._tabsContainer.element}get controlsContainerElement(){return this._controlsContainerElement}destroy(){this.emit("destroy"),this._popoutEvent=void 0,this._maximiseToggleEvent=void 0,this._clickEvent=void 0,this._touchStartEvent=void 0,this._componentRemoveEvent=void 0,this._componentFocusEvent=void 0,this._componentDragStartEvent=void 0,this._tabsContainer.destroy(),globalThis.document.removeEventListener("mouseup",this._documentMouseUpListener),this.layoutManager.removeEventListener("stateChanged",this._layoutStateListener),this._element.remove()}createTab(t,e){this._tabsContainer.createTab(t,e)}removeTab(t){this._tabsContainer.removeTab(t)}processActiveComponentChanged(t){this._tabsContainer.processActiveComponentChanged(t),this.updateTabSizes()}setSide(t){this._side=t,this._leftRightSided=[_.right,_.left].includes(this._side)}updateButtons(){var t,e,i;const n=this._getActiveComponentItemEvent(),o=null===this._parent.findAncestorWithSiblings(),s=null===this.layoutManager.parent,r=this.tabs.every((t=>t.componentItem.isClosable)),a=!1!==(null===(t=null==n?void 0:n.headerConfig)||void 0===t?void 0:t.close);X(this._closeButton.element,r&&a);let l=!1!==(null===(e=null==n?void 0:n.headerConfig)||void 0===e?void 0:e.popout);if(this._layoutManager.layoutConfig.settings.popoutWholeStack)l&&(l=(!o||s)&&r);else{const t=!1!==(null==n?void 0:n.isClosable);l&&(l=(!o||this.tabs.length>1||s)&&t)}X(this._popoutButton.element,l);const h=(!1!==(null===(i=null==n?void 0:n.headerConfig)||void 0===i?void 0:i.maximise)||this._parent.isMaximised)&&!o;X(this._maximiseButton.element,h)}applyFocusedValue(t){t?this._element.classList.add("lm_focused"):this._element.classList.remove("lm_focused")}processMaximised(){if(void 0===this._maximiseButton)throw new u("HPMAX16997");this._maximiseButton.element.setAttribute("title",this._minimiseLabel)}processMinimised(){if(void 0===this._maximiseButton)throw new u("HPMIN16997");this._maximiseButton.element.setAttribute("title",this._maximiseLabel)}updateTabSizes(){if(this._tabsContainer.tabCount>0){const t=this._show?this._layoutManager.layoutConfig.dimensions.headerHeight:0;let e;this._leftRightSided?(this._element.style.height="",this._element.style.width=F(t)):(this._element.style.width="",this._element.style.height=F(t)),e=this._leftRightSided?this._element.offsetHeight-this._controlsContainerElement.offsetHeight-this._tabControlOffset:this._element.offsetWidth-this._controlsContainerElement.offsetWidth-this._tabControlOffset,this._tabsContainer.updateTabSizes(e,this._getActiveComponentItemEvent())}}handleTabInitiatedComponentRemoveEvent(t){if(void 0===this._componentRemoveEvent)throw new u("HHTCE22294");this._componentRemoveEvent(t)}handleTabInitiatedComponentFocusEvent(t){if(void 0===this._componentFocusEvent)throw new u("HHTAE22294");this._componentFocusEvent(t)}handleTabInitiatedDragStartEvent(t,e,i,n){if(void 0===this._componentDragStartEvent)throw new u("HHTDSE22294");this._componentDragStartEvent(t,e,i,n)}processTabDropdownActiveChanged(){void 0!==this._tabDropdownButton&&X(this._tabDropdownButton.element,this._tabsContainer.dropdownActive)}handleButtonPopoutEvent(){if(this._layoutManager.layoutConfig.settings.popoutWholeStack){if(void 0===this._popoutEvent)throw new u("HHBPOE17834");this._popoutEvent()}else{const t=this._getActiveComponentItemEvent();t&&t.popout()}}handleButtonMaximiseToggleEvent(t){if(void 0===this._maximiseToggleEvent)throw new u("HHBMTE16834");this._maximiseToggleEvent()}onClick(t){t.target===this._element&&this.notifyClick(t)}onTouchStart(t){t.target===this._element&&this.notifyTouchStart(t)}onLayoutChanged(){this.updateButtons()}notifyClick(t){if(void 0===this._clickEvent)throw new u("HNHC46834");this._clickEvent(t)}notifyTouchStart(t){if(void 0===this._touchStartEvent)throw new u("HNHTS46834");this._touchStartEvent(t)}}class _t extends dt{constructor(t,e,i){var n,o,s,r,a,l,h,d,c,u,m,p,g,f,v,C,y,w,I;super(t,e,i,_t.createElement(document)),this._headerSideChanged=!1,this._resizeListener=()=>this.handleResize(),this._maximisedListener=()=>this.handleMaximised(),this._minimisedListener=()=>this.handleMinimised(),this._headerConfig=e.header;const b=t.layoutConfig.header,S=e.content;let E;E=1!==S.length?void 0:S[0].header,this._initialWantMaximise=e.maximised,this._initialActiveItemIndex=null!==(n=e.activeItemIndex)&&void 0!==n?n:0;const x=null!==(r=null!==(s=null===(o=this._headerConfig)||void 0===o?void 0:o.show)&&void 0!==s?s:null==E?void 0:E.show)&&void 0!==r?r:b.show,z=null!==(h=null!==(l=null===(a=this._headerConfig)||void 0===a?void 0:a.popout)&&void 0!==l?l:null==E?void 0:E.popout)&&void 0!==h?h:b.popout,M=null!==(u=null!==(c=null===(d=this._headerConfig)||void 0===d?void 0:d.maximise)&&void 0!==c?c:null==E?void 0:E.maximise)&&void 0!==u?u:b.maximise,L=null!==(g=null!==(p=null===(m=this._headerConfig)||void 0===m?void 0:m.close)&&void 0!==p?p:null==E?void 0:E.close)&&void 0!==g?g:b.close,P=null!==(C=null!==(v=null===(f=this._headerConfig)||void 0===f?void 0:f.minimise)&&void 0!==v?v:null==E?void 0:E.minimise)&&void 0!==C?C:b.minimise,T=null!==(I=null!==(w=null===(y=this._headerConfig)||void 0===y?void 0:y.tabDropdown)&&void 0!==w?w:null==E?void 0:E.tabDropdown)&&void 0!==I?I:b.tabDropdown;this._maximisedEnabled=!1!==M;const A={show:!1!==x,side:!1===x?_.top:x,popoutEnabled:!1!==z,popoutLabel:!1===z?"":z,maximiseEnabled:this._maximisedEnabled,maximiseLabel:!1===M?"":M,closeEnabled:!1!==L,closeLabel:!1===L?"":L,minimiseEnabled:!0,minimiseLabel:P,tabDropdownEnabled:!1!==T,tabDropdownLabel:!1===T?"":T};this._header=new gt(t,this,A,(()=>this.getActiveComponentItem()),(()=>this.remove()),(()=>this.handlePopoutEvent()),(()=>this.toggleMaximise()),(t=>this.handleHeaderClickEvent(t)),(t=>this.handleHeaderTouchStartEvent(t)),(t=>this.handleHeaderComponentRemoveEvent(t)),(t=>this.handleHeaderComponentFocusEvent(t)),((t,e,i,n)=>this.handleHeaderComponentStartDragEvent(t,e,i,n))),this.isStack=!0,this._childElementContainer=document.createElement("section"),this._childElementContainer.classList.add("lm_items"),this.on("resize",this._resizeListener),this._maximisedEnabled&&(this.on("maximised",this._maximisedListener),this.on("minimised",this._minimisedListener)),this.element.appendChild(this._header.element),this.element.appendChild(this._childElementContainer),this.setupHeaderPosition()}get childElementContainer(){return this._childElementContainer}get header(){return this._header}get headerShow(){return this._header.show}get headerSide(){return this._header.side}get headerLeftRightSided(){return this._header.leftRightSided}get contentAreaDimensions(){return this._contentAreaDimensions}get initialWantMaximise(){return this._initialWantMaximise}get isMaximised(){return this===this.layoutManager.maximisedStack}get stackParent(){if(!this.parent)throw new Error("Stack should always have a parent");return this.parent}updateSize(t){this.layoutManager.beginVirtualSizedContainerAdding();try{this.updateNodeSize(),this.updateContentItemsSize(t)}finally{this.layoutManager.endVirtualSizedContainerAdding()}}init(){if(!0===this.isInitialised)return;this.updateNodeSize();for(let t=0;t0){if(this._initialActiveItemIndex<0||this._initialActiveItemIndex>=e)throw new Error(`ActiveItemIndex out of range: ${this._initialActiveItemIndex} id: ${this.id}`);for(let i=0;ithis.contentItems.length)throw e-=1,new h("SAC99728");if(t instanceof ht)return e=super.addChild(t,e),this._childElementContainer.appendChild(t.element),this._header.createTab(t,e),this.setActiveComponentItem(t,i),this._header.updateTabSizes(),this.updateSize(!1),t.container.setBaseLogicalZIndex(),this.emitStateChangedEvent(),e;throw new h("SACC88532")}removeChild(t,e){const i=t,n=this.contentItems.indexOf(i),o=1===this.contentItems.length;if(this._activeComponentItem===i&&(i.focused&&i.blur(),!o)){const t=0===n?1:n-1;this.setActiveComponentItem(this.contentItems[t],!1)}this._header.removeTab(i),super.removeChild(i,e),this.emitStateChangedEvent()}toggleMaximise(){this.isMaximised?this.minimise():this.maximise()}maximise(){if(!this.isMaximised){this.layoutManager.setMaximisedStack(this);const t=this.contentItems,e=t.length;for(let i=0;i0&&void 0===t)throw new Error("expected non-empty stack to have an active component item");return{type:"stack",content:this.calculateConfigContent(),size:this.size,sizeUnit:this.sizeUnit,minSize:this.minSize,minSizeUnit:this.minSizeUnit,id:this.id,isClosable:this.isClosable,maximised:this.isMaximised,header:this.createHeaderConfig(),activeItemIndex:t}}onDrop(t,e){if("header"===this._dropSegment){if(this.resetHeaderDropZone(),void 0===this._dropIndex)throw new u("SODDI68990");return void this.addChild(t,this._dropIndex)}if("body"===this._dropSegment)return void this.addChild(t,0,!0);const i="top"===this._dropSegment||"bottom"===this._dropSegment,n="left"===this._dropSegment||"right"===this._dropSegment,o="top"===this._dropSegment||"left"===this._dropSegment,s=i&&this.stackParent.isColumn||n&&this.stackParent.isRow;if(t.isComponent){const e=x.createDefault();e.header=t.headerConfig;const i=this.layoutManager.createAndInitContentItem(e,this);i.addChild(t),t=i}if(t.type===y.row||t.type===y.column){const e=x.createDefault();e.header=this.createHeaderConfig();const i=this.layoutManager.createContentItem(e,this);i.addChild(t),t=i}if(s){const e=this.stackParent.contentItems.indexOf(this);this.stackParent.addChild(t,o?e:e+1,!0),this.size*=.5,t.size=this.size,t.sizeUnit=this.sizeUnit,this.stackParent.updateSize(!1)}else{const e=i?y.column:y.row,n=S.createDefault(e),s=this.layoutManager.createContentItem(n,this);this.stackParent.replaceChild(this,s),s.addChild(t,o?0:void 0,!0),s.addChild(this,o?void 0:0,!0),this.size=50,t.size=50,t.sizeUnit=I.Percent,s.updateSize(!1)}}highlightDropZone(t,e){for(const i in this._contentAreaDimensions){const n=i,o=this._contentAreaDimensions[n].hoverArea;if(o.x1t&&o.y1e)return void("header"===n?(this._dropSegment="header",this.highlightHeaderDropZone(this._header.leftRightSided?e:t)):(this.resetHeaderDropZone(),this.highlightBodyDropZone(n)))}}getArea(){if("none"===this.element.style.display)return null;const t=super.getElementArea(this._header.element),e=super.getElementArea(this._childElementContainer);if(null===t||null===e)throw new c("SGAHC13086");const i=e.x2-e.x1,n=e.y2-e.y1;return this._contentAreaDimensions={header:{hoverArea:{x1:t.x1,y1:t.y1,x2:t.x2,y2:t.y2},highlightArea:{x1:t.x1,y1:t.y1,x2:t.x2,y2:t.y2}}},0===this.contentItems.length?(this._contentAreaDimensions.body={hoverArea:{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2},highlightArea:{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2}},super.getElementArea(this.element)):(this._contentAreaDimensions.left={hoverArea:{x1:e.x1,y1:e.y1,x2:e.x1+.25*i,y2:e.y2},highlightArea:{x1:e.x1,y1:e.y1,x2:e.x1+.5*i,y2:e.y2}},this._contentAreaDimensions.top={hoverArea:{x1:e.x1+.25*i,y1:e.y1,x2:e.x1+.75*i,y2:e.y1+.5*n},highlightArea:{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y1+.5*n}},this._contentAreaDimensions.right={hoverArea:{x1:e.x1+.75*i,y1:e.y1,x2:e.x2,y2:e.y2},highlightArea:{x1:e.x1+.5*i,y1:e.y1,x2:e.x2,y2:e.y2}},this._contentAreaDimensions.bottom={hoverArea:{x1:e.x1+.25*i,y1:e.y1+.5*n,x2:e.x1+.75*i,y2:e.y2},highlightArea:{x1:e.x1,y1:e.y1+.5*n,x2:e.x2,y2:e.y2}},super.getElementArea(this.element))}positionHeader(t){this._header.side!==t&&(this._header.setSide(t),this._headerSideChanged=!0,this.setupHeaderPosition())}updateNodeSize(){if("none"!==this.element.style.display){const t=q(this.element);this._header.show&&(t[this._header.leftRightSided?g.width:g.height]-=this.layoutManager.layoutConfig.dimensions.headerHeight),G(this._childElementContainer,t.width),Z(this._childElementContainer,t.height);for(let e=0;e=o&&t=0&&this._proxyContainerElement.insertAdjacentElement("afterend",n)),this._element.style.left=F(t),this._element.style.top=F(e),s.setAttribute("title",this._componentItem.title),r.insertAdjacentText("afterbegin",this._componentItem.title),this._proxyContainerElement.appendChild(this._componentItem.element)}drag(t,e){const i=this.setDropPosition(t,e);return this._componentItem.drag(),i}setDropPosition(t,e){this._element.style.left=F(t),this._element.style.top=F(e);const i=this.layoutManager.getArea(t,e);return(null!==i||t=this._groundArea.x2||e=this._groundArea.y2)&&(this._lastArea=i),this._lastArea}drop(){this._componentItem.exitDragMode();let t=null,e=null;const i=this._action.currentTarget;if((null==i?void 0:i.owner)===this._action&&(t=i.area),null!==t)e=this._componentItem,t.contentItem.onDrop(e,t),this.layoutManager.focusWindow();else if(null===i&&null===this._action.parent){const t=$(globalThis),e={left:t.left+this.element.offsetLeft,top:t.top+this.element.offsetTop,width:this._originalSize.width,height:this._originalSize.height};this.layoutManager.createPopoutFromContentItem(this._componentItem,e,K(),this._dockPoint),this._componentItem.destroy()}else this._componentItem.destroy();this.layoutManager.emit("itemDropped",this._componentItem),this._componentItemFocused&&(null==e||e.focus()),this._element.remove()}setDimensions(){const t=this.layoutManager.layoutConfig.dimensions;if(void 0===t)throw new Error("DragProxy.setDimensions: dimensions undefined");let e=t.dragProxyWidth,i=t.dragProxyHeight;if(void 0===e||void 0===i)throw new Error("DragProxy.setDimensions: width and/or height undefined");this._outerWidth=e,this._outerHeight=i;const n=!1===this.layoutManager.layoutConfig.header.show?0:t.headerHeight;this._element.style.width=F(e),this._element.style.height=F(i),e-=this._sided?n:0,i-=this._sided?0:n,this._proxyContainerElement.style.width=F(e),this._proxyContainerElement.style.height=F(i),this._componentItem.enterDragMode(e,i),this._componentItem.show()}}class vt{constructor(t,e,i,n){if(this._owner=t,this._area=e,this._pageX=i,this._pageY=n,t.layoutManager!==e.contentItem.layoutManager)throw Error("LayoutManager of Area and DragProxy must match")}get owner(){return this._owner}get area(){return this._area}drop(t){this._area.contentItem.onDrop(t,this._area)}highlightDropZone(){this.area.contentItem.highlightDropZone(this._pageX,this._pageY,this._area)}}class Ct extends it{constructor(t,e=!1,i=null){super(),this._layoutManager=t,this._allowPopout=e,this._parent=i,this._dragProxy=null,this._currentTarget=null,this._dragListener=null,this._actions=[],this._dragEventHandler=(t,e,i)=>this.onDrag(i),this._dragStopEventHandler=()=>this.onDragStop(),this._boundingRect=this.computeBoundingRect(),this.parentOrSelf._actions.push(this)}get layoutManager(){return this._layoutManager}get parent(){return this._parent}get proxy(){return this._dragProxy}get parentOrSelf(){var t;return null!==(t=this._parent)&&void 0!==t?t:this}get currentTarget(){return this.parentOrSelf._currentTarget}set currentTarget(t){this.parentOrSelf._currentTarget=t}computeBoundingRect(){if(void 0===this._layoutManager.groundItem)throw new u("DACBR11120");{const t=this._layoutManager.groundItem.element.getBoundingClientRect();return DOMRect.fromRect({x:document.body.scrollLeft+t.left,y:document.body.scrollTop+t.top,width:t.width,height:t.height})}}screenToPage(t,e){const i=$(globalThis);return{x:document.body.scrollLeft+t-i.left,y:document.body.scrollTop+e-i.top}}isProxyVisible(t,e,i){return e>=this._boundingRect.left-t.outerWidth&&e=this._boundingRect.top-t.outerHeight&&ithis.onDragStart(t,e))),this._dragListener.on("dragStop",(()=>this.onDragStop()))}onDragStart(t,e){var i,n;const o="component";let s;if("function"==typeof this._componentTypeOrFtn){const t=this._componentTypeOrFtn();s=yt.isDragSourceComponentItemConfig(t)?{type:o,componentState:t.state,componentType:t.type,title:null!==(i=t.title)&&void 0!==i?i:this._title}:t}else s={type:o,componentState:this._componentState,componentType:this._componentTypeOrFtn,title:this._title,id:this._id};const r=W.resolve(s,!1),a=new ht(this._layoutManager,r,this._dummyGroundContentItem);if(this._dummyGroundContentItem.contentItems.push(a),null===this._dragListener)throw new c("DSODSD66746");{const i=Ct.start(this._layoutManager,this._dragListener,a,t,e,!1),o=this._layoutManager.transitionIndicator;if(null===o)throw new c("DSODST66746");{const t=null===(n=i.proxy)||void 0===n?void 0:n.element;if(void 0===t)throw new u("DSODST66747");o.transitionElements(this._element,t)}}}onDragStop(){this.createDragListener()}removeDragListener(){null!==this._dragListener&&(this._dragListener.destroy(),this._dragListener=null)}}!function(t){t.isDragSourceComponentItemConfig=function(t){return!("componentType"in t)}}(yt||(yt={}));class wt{constructor(){this._element=document.createElement("div"),this._element.classList.add("lm_dropTargetIndicator");const t=document.createElement("div");t.classList.add("lm_inner"),this._element.appendChild(t),document.body.appendChild(this._element)}destroy(){this._element.remove()}highlightArea(t,e){this._element.style.left=F(t.x1+e),this._element.style.top=F(t.y1+e),this._element.style.width=F(t.x2-t.x1-e-1),this._element.style.height=F(t.y2-t.y1-e-1),this._element.style.visibility="visible"}hide(){this._element.style.visibility="hidden"}}class It{constructor(){this._element=document.createElement("div"),this._element.classList.add("lm_transition_indicator"),document.body.appendChild(this._element),this._toElement=null,this._fromDimensions=null,this._totalAnimationDuration=200,this._animationStartTime=null}destroy(){this._element.remove()}transitionElements(t,e){}nextAnimationFrame(){}measure(t){const e=t.getBoundingClientRect();return{left:e.left,top:e.top,width:t.offsetWidth,height:t.offsetHeight}}}class bt extends it{constructor(t){super(),this._layoutManager=t,this._childEventListener=t=>this.onEventFromChild(t),globalThis.addEventListener(bt.ChildEventName,this._childEventListener,{passive:!0})}emit(t,...e){"userBroadcast"===t?this.emitUserBroadcast(...e):super.emit(t,...e)}emitUserBroadcast(...t){this.handleUserBroadcastEvent("userBroadcast",t)}destroy(){globalThis.removeEventListener(bt.ChildEventName,this._childEventListener)}handleUserBroadcastEvent(t,e){this._layoutManager.isSubWindow?this.propagateToParent(t,e):this.propagateToThisAndSubtree(t,e)}onEventFromChild(t){const e=t.detail;this.handleUserBroadcastEvent(e.eventName,e.args)}propagateToParent(t,e){const i={bubbles:!0,cancelable:!0,detail:{layoutManager:this._layoutManager,eventName:t,args:e}},n=new CustomEvent(bt.ChildEventName,i),o=globalThis.opener;if(null===o)throw new c("EHPTP15778");o.dispatchEvent(n)}propagateToThisAndSubtree(t,e){this.emitUnknown(t,...e);for(let i=0;ithis.handleContainerResize())),this._windowBeforeUnloadListener=()=>this.onBeforeUnload(),this._windowBeforeUnloadListening=!1,this._maximisedStackBeforeDestroyedListener=t=>this.cleanupBeforeMaximisedStackDestroyed(t),this.moveWindowTop=()=>{},this.focusWindow=()=>globalThis.focus(),this.isSubWindow=e.isSubWindow,this._constructorOrSubWindowLayoutConfig=e.constructorOrSubWindowLayoutConfig,t.checkInitialise(),b.checkInitialise(),void 0!==e.containerElement&&(this._containerElement=e.containerElement)}get container(){return this._containerElement}get isInitialised(){return this._isInitialised}get isDragging(){return document.body.classList.contains("lm_dragging")}get groundItem(){return this._groundItem}get root(){return this._groundItem}get openPopouts(){return this._openPopouts}get dropTargetIndicator(){return this._dropTargetIndicator}get transitionIndicator(){return this._transitionIndicator}get width(){return this._width}get height(){return this._height}get eventHub(){return this._eventHub}get rootItem(){if(void 0===this._groundItem)throw new Error("Cannot access rootItem before init");return 0===this._groundItem.contentItems.length?void 0:this._groundItem.contentItems[0]}get focusedComponentItem(){return this._focusedComponentItem}get tabDropPlaceholder(){return this._tabDropPlaceholder}get maximisedStack(){return this._maximisedStack}get deprecatedConstructor(){return!this.isSubWindow&&void 0!==this._constructorOrSubWindowLayoutConfig}get parent(){return this._parent}set parent(t){this._parent=t}get instances(){var t;const e=[],i=null!==(t=this.parent)&&void 0!==t?t:this;e.push(i);for(let t of i.openPopouts){const i=t.getGlInstance();e.push(i)}return e}destroy(){if(this._isInitialised){this._windowBeforeUnloadListening&&(globalThis.removeEventListener("beforeunload",this._windowBeforeUnloadListener),this._windowBeforeUnloadListening=!1),!0===this.layoutConfig.settings.closePopoutsOnUnload&&this.closeAllOpenPopouts(),this._resizeObserver.disconnect(),this.checkClearResizeTimeout(),void 0!==this._groundItem&&this._groundItem.destroy(),this._tabDropPlaceholder.remove(),null!==this._dropTargetIndicator&&this._dropTargetIndicator.destroy(),null!==this._transitionIndicator&&this._transitionIndicator.destroy(),this._eventHub.destroy();for(const t of this._dragSources)t.destroy();this._dragSources=[],this._isInitialised=!1}}minifyConfig(t){return T.minifyConfig(t)}unminifyConfig(t){return T.unminifyConfig(t)}init(){var t;this.setContainer(),this._dropTargetIndicator=new wt,this._transitionIndicator=new It,this.updateSizeFromContainer(),this.layoutConfig=T.createDefault(),this._groundItem=new ct(this,this.layoutConfig.root,this._containerElement),this._groundItem.init(),this.checkLoadedLayoutMaximiseItem(),this._resizeObserver.observe(this._containerElement),this._isInitialised=!0,this.adjustColumnsResponsive(),this.emit("initialised");let e=this._constructorOrSubWindowLayoutConfig;this.isSubWindow&&void 0!==e&&((null===(t=e.root)||void 0===t?void 0:t.type)==y.component&&(e.root={type:y.stack,content:[e.root]}),this.loadLayout(e))}loadLayout(t){if(!this.isInitialised)throw new Error("GoldenLayout: Need to call init() if LayoutConfig with defined root passed to constructor");if(void 0===this._groundItem)throw new u("LMLL11119");this.layoutConfig=B.resolve(t),this.createSubWindows(),this._groundItem.loadRoot(this.layoutConfig.root),this.checkLoadedLayoutMaximiseItem(),this.adjustColumnsResponsive()}saveLayout(){if(!1===this._isInitialised)throw new Error("Can't create config, layout not yet initialised");if(void 0===this._groundItem)throw new u("LMTC18244");{const t=this._groundItem.calculateConfigContent();let e;e=1!==t.length?void 0:t[0],this.reconcilePopoutWindows();const i=[];for(let t=0;t=0?n=this._groundItem.contentItems[0]:e=0;break;case y.row:case y.column:e=n.addItem(t,i.index);break;case y.stack:if(D.isComponent(t)){e=n.addItem(t,i.index);break}throw Error(m[6]);case y.component:throw new h("LMAIALC87444602");default:throw new d("LMAIALU98881733",n.type)}if(D.isComponent(t)){const t=n.contentItems[e];rt.isStack(t)&&(n=t,e=0)}return i.parentItem=n,i.index=e,i}}}loadComponentAsRoot(t){if(void 0===this._groundItem)throw new Error("Cannot add item before init");this._groundItem.loadComponentAsRoot(t)}updateSize(t,e){this.setSize(t,e)}setSize(t,e){if(this._width=t,this._height=e,!0===this._isInitialised){if(void 0===this._groundItem)throw new u("LMUS18881");if(this._groundItem.setSize(this._width,this._height),this._maximisedStack){const{width:t,height:e}=q(this._containerElement);G(this._maximisedStack.element,t),Z(this._maximisedStack.element,e),this._maximisedStack.updateSize(!1)}this.adjustColumnsResponsive()}}beginSizeInvalidation(){this._sizeInvalidationBeginCount++}endSizeInvalidation(){0==--this._sizeInvalidationBeginCount&&this.updateSizeFromContainer()}updateSizeFromContainer(){const{width:t,height:e}=q(this._containerElement);this.setSize(t,e)}updateRootSize(t=!1){if(void 0===this._groundItem)throw new u("LMURS28881");this._groundItem.updateSize(t)}createAndInitContentItem(t,e){const i=this.createContentItem(t,e);return i.init(),i}createContentItem(t,e){if("string"!=typeof t.type)throw new o("Missing parameter 'type'",JSON.stringify(t));return!S.isComponentItem(t)||e instanceof _t||!e||!0===this.isSubWindow&&e instanceof ct||(t={type:y.stack,content:[t],size:t.size,sizeUnit:t.sizeUnit,minSize:t.minSize,minSizeUnit:t.minSizeUnit,id:t.id,maximised:t.maximised,isClosable:t.isClosable,activeItemIndex:0,header:void 0}),this.createContentItemFromConfig(t,e)}findFirstComponentItemById(t){if(void 0===this._groundItem)throw new u("LMFFCIBI82446");return this.findFirstContentItemTypeByIdRecursive(y.component,t,this._groundItem)}createPopoutFromContentItem(t,e,i,n){var o;const s=null!=n?n:t.findDockPoint();if(null===s)throw new c("LMCPFCI00834");{if(null!==i&&s.parent.addPopInParentId(i),void 0===e){const i=$(globalThis),n=t instanceof ht?t.getOuterBoundingClientRect():t.element.getBoundingClientRect();e={left:i.left+n.left,top:i.top+n.top,width:n.width,height:n.height}}const n=t.toConfig();if((null===(o=t.parent)||void 0===o?void 0:o.contentItems.includes(t))&&t.remove(),L.isRootItemConfig(n))return this.createPopoutFromItemConfig(n,e,i,s.index);throw new Error(`${m[0]}`)}}beginVirtualSizedContainerAdding(){0==++this._virtualSizedContainerAddingBeginCount&&(this._virtualSizedContainers.length=0)}addVirtualSizedContainer(t){this._virtualSizedContainers.push(t)}endVirtualSizedContainerAdding(){if(0==--this._virtualSizedContainerAddingBeginCount){const t=this._virtualSizedContainers.length;if(t>0){this.fireBeforeVirtualRectingEvent(t);for(let e=0;e{const t=a.getGlInstance(),e=function(){var e,i;t.isDragging||0!==(null===(i=null===(e=t.groundItem)||void 0===e?void 0:e.getAllComponentItems())||void 0===i?void 0:i.length)||a.close()};t.on("itemDropped",e),t.on("itemDestroyed",e),this.emit("windowOpened",a)})),a.on("closed",(()=>this.reconcilePopoutWindows())),this._openPopouts.push(a),this.layoutConfig.settings.closePopoutsOnUnload&&!this._windowBeforeUnloadListening&&(globalThis.addEventListener("beforeunload",this._windowBeforeUnloadListener,{passive:!0}),this._windowBeforeUnloadListening=!0),a}closeAllOpenPopouts(t=!1){for(let e=0;e0;if(s&&!r&&!a)return void i.cancelDrag();const l=Ct.start(this,i,n,t,e,r);if(a)for(let t of this.instances)t!==this&&t.startExternalComponentDrag(l)}hideDropTargetIndicator(){var t;this.tabDropPlaceholder.remove(),null===(t=this.dropTargetIndicator)||void 0===t||t.hide()}focusComponent(t,e=!1){t.focus(e)}clearComponentFocus(t=!1){this.setFocusedComponentItem(void 0,t)}setFocusedComponentItem(t,e=!1){if(t!==this._focusedComponentItem){let i;if(void 0===t||(i=t.parentItem),void 0!==this._focusedComponentItem){const t=this._focusedComponentItem;this._focusedComponentItem=void 0,t.setBlurred(e);const n=t.parentItem;i===n?i=void 0:n.setFocusedValue(!1)}void 0!==t&&(this._focusedComponentItem=t,t.setFocused(e),void 0!==i&&i.setFocusedValue(!0))}}createContentItemFromConfig(t,e){switch(t.type){case y.ground:throw new h("LMCCIFC68871");case y.row:return new at(!1,this,t,e);case y.column:return new at(!0,this,t,e);case y.stack:return new _t(this,t,e);case y.component:return new ht(this,t,e);default:throw new d("CCC913564",t.type,"Invalid Config Item type specified")}}setMaximisedStack(t){void 0===t?void 0!==this._maximisedStack&&this.processMinimiseMaximisedStack():t!==this._maximisedStack&&(void 0!==this._maximisedStack&&this.processMinimiseMaximisedStack(),this.processMaximiseStack(t))}checkMinimiseMaximisedStack(){void 0!==this._maximisedStack&&this._maximisedStack.minimise()}cleanupBeforeMaximisedStackDestroyed(t){null!==this._maximisedStack&&this._maximisedStack===t.target&&(this._maximisedStack.off("beforeItemDestroyed",this._maximisedStackBeforeDestroyedListener),this._maximisedStack=void 0)}closeWindow(){globalThis.setTimeout((()=>globalThis.close()),1)}getArea(t,e){let i=null,n=1/0;for(let o=0;o=s.x1&&t=s.y1&&es.surface&&(n=s.surface,i=s)}return i}calculateItemAreas(){const t=this.getAllContentItems(),e=this._groundItem;if(void 0===e)throw new u("LMCIAR44365");if(1!==t.length){e.contentItems[0].isStack?this._itemAreas=[]:this._itemAreas=e.createSideAreas();for(let e=0;e0){let e=t[0];if(rt.isComponentItem(e)){const t=e.parent;if(null===t)throw new c("LMXLLMI69999");e=t}if(!rt.isStack(e))throw new h("LMCLLMI19993");e.maximise()}}}processMaximiseStack(t){if(this._maximisedStack=t,t.on("beforeItemDestroyed",this._maximisedStackBeforeDestroyedListener),t.element.classList.add("lm_maximised"),t.element.insertAdjacentElement("afterend",this._maximisePlaceholder),void 0===this._groundItem)throw new u("LMMXI19993");{this._groundItem.element.prepend(t.element);const{width:e,height:i}=q(this._containerElement);G(t.element,e),Z(t.element,i),t.updateSize(!0),t.focusActiveContentItem(),this._maximisedStack.emit("maximised"),this.emit("stateChanged")}}processMinimiseMaximisedStack(){if(void 0===this._maximisedStack)throw new h("LMMMS74422");{const t=this._maximisedStack;if(null===t.parent)throw new c("LMMI13668");t.element.classList.remove("lm_maximised"),this._maximisePlaceholder.insertAdjacentElement("afterend",t.element),this._maximisePlaceholder.remove(),this.updateRootSize(!0),this._maximisedStack=void 0,t.off("beforeItemDestroyed",this._maximisedStackBeforeDestroyedListener),t.emit("minimised"),this.emit("stateChanged")}}reconcilePopoutWindows(){const t=[];for(let e=0;e{this._resizeTimeoutId=void 0,this.beginSizeInvalidation(),this.endSizeInvalidation()}),this.resizeDebounceInterval))}checkClearResizeTimeout(){void 0!==this._resizeTimeoutId&&(clearTimeout(this._resizeTimeoutId),this._resizeTimeoutId=void 0)}setContainer(){var t;const e=document.body,i=null!==(t=this._containerElement)&&void 0!==t?t:e;if(i===e){this.resizeWithContainerAutomatically=!0;const t=document.documentElement;t.style.height="100%",t.style.margin="0",t.style.padding="0",t.style.overflow="hidden",e.style.height="100%",e.style.margin="0",e.style.padding="0",e.style.overflow="hidden"}this._containerElement=i}onBeforeUnload(){this.destroy()}adjustColumnsResponsive(){if(void 0===this._groundItem)throw new u("LMACR20883");if(this._firstLoad=!1,this.useResponsiveLayout()&&!this._updatingColumnsResponsive&&this._groundItem.contentItems.length>0&&this._groundItem.contentItems[0].isRow){if(void 0===this._groundItem||null===this._width)throw new u("LMACR77412");{const t=this._groundItem.contentItems[0].contentItems.length;if(t<=1)return;{const e=this.layoutConfig.dimensions.defaultMinItemWidth;if(t*e<=this._width)return;{this._updatingColumnsResponsive=!0;const i=t-Math.max(Math.floor(this._width/e),1),n=this._groundItem.contentItems[0],o=this.getAllStacks();if(0===o.length)throw new h("LMACRS77413");{const t=o[0];for(let e=0;en?void 0:{parentItem:t,index:o}}}case 1:if(void 0===this._focusedComponentItem)return;{const t=this._focusedComponentItem.parentItem;return this.tryCreateLocationFromParentItem(t,e)}case 2:{const t=this.findFirstContentItemType(y.stack);return void 0===t?void 0:this.tryCreateLocationFromParentItem(t,e)}case 3:{let t=this.findFirstContentItemType(y.row);return void 0!==t?this.tryCreateLocationFromParentItem(t,e):(t=this.findFirstContentItemType(y.column),void 0!==t?this.tryCreateLocationFromParentItem(t,e):void 0)}case 4:{const t=this.findFirstContentItemType(y.row);return void 0===t?void 0:this.tryCreateLocationFromParentItem(t,e)}case 5:{const t=this.findFirstContentItemType(y.column);return void 0===t?void 0:this.tryCreateLocationFromParentItem(t,e)}case 6:if(void 0===this._groundItem)throw new u("LMFLRIF18244");return void 0!==this.rootItem?void 0:void 0===e||0===e?{parentItem:this._groundItem,index:0}:void 0;case 7:if(void 0===this._groundItem)throw new u("LMFLF18244");{const t=this._groundItem.contentItems;if(0===t.length)return void 0===e||0===e?{parentItem:this._groundItem,index:0}:void 0;{const i=t[0];return this.tryCreateLocationFromParentItem(i,e)}}}}tryCreateLocationFromParentItem(t,e){const i=t.contentItems.length;return void 0===e?{parentItem:t,index:i}:e<0||e>i?void 0:{parentItem:t,index:e}}}!function(t){t.createMaximisePlaceElement=function(t){const e=t.createElement("div");return e.classList.add("lm_maximise_place"),e},t.createTabDropPlaceholderElement=function(t){const e=t.createElement("div");return e.classList.add("lm_drop_tab_placeholder"),e},t.defaultLocationSelectors=[{typeId:1,index:void 0},{typeId:2,index:void 0},{typeId:3,index:void 0},{typeId:7,index:void 0}],t.afterFocusedItemIfPossibleLocationSelectors=[{typeId:0,index:1},{typeId:2,index:void 0},{typeId:3,index:void 0},{typeId:7,index:void 0}]}(St||(St={}));class Et extends St{constructor(t,e,i,n){if(super(Et.createLayoutManagerConstructorParameters(t,e)),this._bindComponentEventHanlderPassedInConstructor=!1,this._creationTimeoutPassed=!1,void 0!==e&&"function"==typeof e&&(this.bindComponentEvent=e,this._bindComponentEventHanlderPassedInConstructor=!0,void 0!==i&&(this.unbindComponentEvent=i)),!this._bindComponentEventHanlderPassedInConstructor&&this.isSubWindow){if(void 0===this._constructorOrSubWindowLayoutConfig)throw new u("VLC98823");{const t=B.resolve(this._constructorOrSubWindowLayoutConfig);this.layoutConfig=Object.assign(Object.assign({},t),{root:void 0})}}!0!==n&&(this.deprecatedConstructor||this.init())}destroy(){this.bindComponentEvent=void 0,this.unbindComponentEvent=void 0,super.destroy()}init(){if(this._bindComponentEventHanlderPassedInConstructor||"loading"!==document.readyState&&null!==document.body){if(!this._bindComponentEventHanlderPassedInConstructor&&!0===this.isSubWindow&&!this._creationTimeoutPassed)return setTimeout((()=>this.init()),7),void(this._creationTimeoutPassed=!0);!0===this.isSubWindow&&(this._bindComponentEventHanlderPassedInConstructor||this.clearHtmlAndAdjustStylesForSubWindow(),window.__glInstance=this),super.init()}else document.addEventListener("DOMContentLoaded",(()=>this.init()),{passive:!0})}clearHtmlAndAdjustStylesForSubWindow(){const t=document.head,e=new Array(4);e[0]=document.querySelectorAll("body link"),e[1]=document.querySelectorAll("body style"),e[2]=document.querySelectorAll("template"),e[3]=document.querySelectorAll(".gl_keep");for(let i=0;ithis.emit("popIn"))),document.body.appendChild(t),!0}}bindComponent(t,e){if(void 0!==this.bindComponentEvent)return this.bindComponentEvent(t,e);if(void 0!==this.getComponentEvent)return{virtual:!1,component:this.getComponentEvent(t,e)};{const t=`${m[2]}: ${JSON.stringify(e)}`;throw new a(t)}}unbindComponent(t,e,i){if(void 0!==this.unbindComponentEvent)this.unbindComponentEvent(t);else if(!e&&void 0!==this.releaseComponentEvent){if(void 0===i)throw new u("VCUCRCU333998");this.releaseComponentEvent(t,i)}}}!function(t){let e=!1;t.createLayoutManagerConstructorParameters=function(t,i){const n=e?null:new URL(document.location.href).searchParams.get("gl-window");e=!0;const o=null!==n;let s,r;if(null!==n){const e=localStorage.getItem(n);if(null===e)throw new Error("Null gl-window Config");localStorage.removeItem(n);const i=JSON.parse(e),o=T.unminifyConfig(i);r=B.fromResolved(o),t instanceof HTMLElement&&(s=t)}else void 0===t?r=void 0:t instanceof HTMLElement?(r=void 0,s=t):r=t,void 0===s&&i instanceof HTMLElement&&(s=i);return{constructorOrSubWindowLayoutConfig:r,isSubWindow:o,containerElement:s}}}(Et||(Et={}));class xt extends Et{constructor(t,e,i){super(t,e,i,!0),this._componentTypesMap=new Map,this._registeredComponentMap=new Map,this._virtuableComponentMap=new Map,this._containerVirtualRectingRequiredEventListener=(t,e,i)=>this.handleContainerVirtualRectingRequiredEvent(t,e,i),this._containerVirtualVisibilityChangeRequiredEventListener=(t,e)=>this.handleContainerVirtualVisibilityChangeRequiredEvent(t,e),this._containerVirtualZIndexChangeRequiredEventListener=(t,e,i)=>this.handleContainerVirtualZIndexChangeRequiredEvent(t,e,i),this.deprecatedConstructor||this.init()}registerComponent(t,e,i=!1){if("function"!=typeof e)throw new r("registerComponent() componentConstructorOrFactoryFtn parameter is not a function");if(e.hasOwnProperty("prototype")){const n=e;this.registerComponentConstructor(t,n,i)}else{const n=e;this.registerComponentFactoryFunction(t,n,i)}}registerComponentConstructor(t,e,i=!1){if("function"!=typeof e)throw new Error(m[1]);if(void 0!==this._componentTypesMap.get(t))throw new a(`${m[3]}: ${t}`);this._componentTypesMap.set(t,{constructor:e,factoryFunction:void 0,virtual:i})}registerComponentFactoryFunction(t,e,i=!1){if("function"!=typeof e)throw new a("Please register a constructor function");if(void 0!==this._componentTypesMap.get(t))throw new a(`${m[3]}: ${t}`);this._componentTypesMap.set(t,{constructor:void 0,factoryFunction:e,virtual:i})}registerComponentFunction(t){this.registerGetComponentConstructorCallback(t)}registerGetComponentConstructorCallback(t){if("function"!=typeof t)throw new Error("Please register a callback function");void 0!==this._getComponentConstructorFtn&&console.warn("Multiple component functions are being registered. Only the final registered function will be used."),this._getComponentConstructorFtn=t}getRegisteredComponentTypeNames(){const t=this._componentTypesMap.keys();return Array.from(t)}getComponentInstantiator(t){let e;const i=z.resolveComponentTypeName(t);return void 0!==i&&(e=this._componentTypesMap.get(i)),void 0===e&&void 0!==this._getComponentConstructorFtn&&(e={constructor:this._getComponentConstructorFtn(t),factoryFunction:void 0,virtual:!1}),e}bindComponent(t,e){let i;const n=z.resolveComponentTypeName(e);let o;if(void 0!==n&&(i=this._componentTypesMap.get(n)),void 0===i&&void 0!==this._getComponentConstructorFtn&&(i={constructor:this._getComponentConstructorFtn(e),factoryFunction:void 0,virtual:!1}),void 0!==i){const s=i.virtual;let r,l;r=void 0===e.componentState?void 0:J({},e.componentState);const d=i.constructor;if(void 0!==d)l=new d(t,r,s);else{const e=i.factoryFunction;if(void 0===e)throw new h("LMBCFFU10008");l=e(t,r,s)}if(s){if(void 0===l)throw new u("GLBCVCU988774");{const e=l,i=e.rootHtmlElement;if(void 0===i)throw new a(`${m[5]}: ${n}`);!function(t){const e="absolute";t.style.position!==e&&(t.style.position=e)}(i),this.container.appendChild(i),this._virtuableComponentMap.set(t,e),t.virtualRectingRequiredEvent=this._containerVirtualRectingRequiredEventListener,t.virtualVisibilityChangeRequiredEvent=this._containerVirtualVisibilityChangeRequiredEventListener,t.virtualZIndexChangeRequiredEvent=this._containerVirtualZIndexChangeRequiredEventListener}}this._registeredComponentMap.set(t,l),o={virtual:i.virtual,component:l}}else o=super.bindComponent(t,e);return o}unbindComponent(t,e,i){if(void 0===this._registeredComponentMap.get(t))super.unbindComponent(t,e,i);else{const e=this._virtuableComponentMap.get(t);if(void 0!==e){const i=e.rootHtmlElement;if(void 0===i)throw new h("GLUC77743",t.title);this.container.removeChild(i),this._virtuableComponentMap.delete(t)}}}fireBeforeVirtualRectingEvent(t){this._goldenLayoutBoundingClientRect=this.container.getBoundingClientRect(),super.fireBeforeVirtualRectingEvent(t)}handleContainerVirtualRectingRequiredEvent(t,e,i){const n=this._virtuableComponentMap.get(t);if(void 0===n)throw new u("GLHCSCE55933");{const o=n.rootHtmlElement;if(void 0===o)throw new a(m[4]+" "+t.title);{const n=t.element.getBoundingClientRect(),s=n.left-this._goldenLayoutBoundingClientRect.left;o.style.left=F(s);const r=n.top-this._goldenLayoutBoundingClientRect.top;o.style.top=F(r),G(o,e),Z(o,i)}}}handleContainerVirtualVisibilityChangeRequiredEvent(t,e){const i=this._virtuableComponentMap.get(t);if(void 0===i)throw new u("GLHCVVCRE55934");{const n=i.rootHtmlElement;if(void 0===n)throw new a(m[4]+" "+t.title);X(n,e)}}handleContainerVirtualZIndexChangeRequiredEvent(t,e,i){const n=this._virtuableComponentMap.get(t);if(void 0===n)throw new u("GLHCVZICRE55935");{const e=n.rootHtmlElement;if(void 0===e)throw new a(m[4]+" "+t.title);e.style.zIndex=i}}}return i})())); \ No newline at end of file diff --git a/src/Scratch/25 - GoldenLayout/App.fs b/src/Scratch/25 - GoldenLayout/App.fs index aaeef38f..894a5c2e 100644 --- a/src/Scratch/25 - GoldenLayout/App.fs +++ b/src/Scratch/25 - GoldenLayout/App.fs @@ -24,6 +24,7 @@ let defaultLayout = element { id "render" title "3D View" + minSize 100 } element {