@bikdotai/bik-component-library 0.0.777-beta.2 → 0.0.777-beta.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/assets/icons/magic-line.svg.js +1 -0
- package/dist/cjs/assets/icons/rewind.svg.js +1 -0
- package/dist/cjs/assets/icons/thumbs_down.svg.js +1 -0
- package/dist/cjs/assets/icons/thumbs_up.svg.js +1 -0
- package/dist/cjs/components/TablePagination/TablePagination.d.ts +0 -1
- package/dist/cjs/components/TablePagination/TablePagination.js +1 -1
- package/dist/cjs/components/WhatsAppTextEditor/AIRephrase.styled.d.ts +10 -0
- package/dist/cjs/components/WhatsAppTextEditor/AIRephrase.styled.js +1 -0
- package/dist/cjs/components/WhatsAppTextEditor/AIRephraseButton.d.ts +17 -0
- package/dist/cjs/components/WhatsAppTextEditor/AIRephraseButton.js +1 -0
- package/dist/cjs/components/WhatsAppTextEditor/BorderAnimation.d.ts +11 -0
- package/dist/cjs/components/WhatsAppTextEditor/BorderAnimation.js +1 -0
- package/dist/cjs/components/WhatsAppTextEditor/CustomEditor.styled.d.ts +13 -0
- package/dist/cjs/components/WhatsAppTextEditor/CustomEditor.styled.js +1 -1
- package/dist/cjs/components/WhatsAppTextEditor/WhatsAppTextEditor.d.ts +126 -3
- package/dist/cjs/components/WhatsAppTextEditor/WhatsAppTextEditor.js +5 -1
- package/dist/cjs/components/WhatsAppTextEditor/WhatsAppTextEditorHeader.d.ts +42 -1
- package/dist/cjs/components/WhatsAppTextEditor/WhatsAppTextEditorHeader.js +1 -1
- package/dist/cjs/components/WhatsAppTextEditor/ai/actionRegistry.d.ts +14 -0
- package/dist/cjs/components/WhatsAppTextEditor/ai/actionRegistry.js +1 -0
- package/dist/cjs/components/WhatsAppTextEditor/ai/aiTag.d.ts +58 -0
- package/dist/cjs/components/WhatsAppTextEditor/ai/aiTag.js +1 -0
- package/dist/cjs/components/WhatsAppTextEditor/ai/api.d.ts +22 -0
- package/dist/cjs/components/WhatsAppTextEditor/ai/api.js +1 -0
- package/dist/cjs/components/alerts/Alert.styled.js +1 -0
- package/dist/cjs/components/feature-announcements/MajorUpdatePopup.js +1 -1
- package/dist/cjs/components/feature-announcements/MinorUpdatePopup.js +1 -1
- package/dist/cjs/components/multi-level-dropdown/GroupedMenuList.d.ts +4 -0
- package/dist/cjs/components/multi-level-dropdown/GroupedMenuList.js +1 -1
- package/dist/cjs/components/multi-level-dropdown/MenuItem.d.ts +3 -0
- package/dist/cjs/components/multi-level-dropdown/MenuItem.js +1 -1
- package/dist/cjs/components/multi-level-dropdown/MenuList.d.ts +4 -0
- package/dist/cjs/components/multi-level-dropdown/MenuList.js +1 -1
- package/dist/cjs/components/multi-level-dropdown/MultiLevelDropdown.js +1 -1
- package/dist/cjs/components/multi-level-dropdown/type.d.ts +3 -0
- package/dist/cjs/components/radioButton/RadioButton.d.ts +1 -0
- package/dist/cjs/components/radioButton/RadioButton.js +1 -1
- package/dist/cjs/components/tag/Tag.d.ts +1 -1
- package/dist/cjs/components/tag/Tag.js +1 -1
- package/dist/cjs/components/tag/Tag.stories.d.ts +5 -5
- package/dist/cjs/components/tag/Tag.styled.d.ts +3 -0
- package/dist/cjs/components/tag/Tag.styled.js +1 -1
- package/dist/cjs/components/tag/model.d.ts +15 -0
- package/dist/cjs/components/template-preview/TemplatePreview.js +1 -1
- package/dist/cjs/helpers/BaseWhatsappContentLang.helper.js +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/esm/assets/icons/magic-line.svg.js +1 -0
- package/dist/esm/assets/icons/rewind.svg.js +1 -0
- package/dist/esm/assets/icons/thumbs_down.svg.js +1 -0
- package/dist/esm/assets/icons/thumbs_up.svg.js +1 -0
- package/dist/esm/components/TablePagination/TablePagination.d.ts +0 -1
- package/dist/esm/components/TablePagination/TablePagination.js +1 -1
- package/dist/esm/components/WhatsAppTextEditor/AIRephrase.styled.d.ts +10 -0
- package/dist/esm/components/WhatsAppTextEditor/AIRephrase.styled.js +1 -0
- package/dist/esm/components/WhatsAppTextEditor/AIRephraseButton.d.ts +17 -0
- package/dist/esm/components/WhatsAppTextEditor/AIRephraseButton.js +1 -0
- package/dist/esm/components/WhatsAppTextEditor/BorderAnimation.d.ts +11 -0
- package/dist/esm/components/WhatsAppTextEditor/BorderAnimation.js +1 -0
- package/dist/esm/components/WhatsAppTextEditor/CustomEditor.styled.d.ts +13 -0
- package/dist/esm/components/WhatsAppTextEditor/CustomEditor.styled.js +1 -1
- package/dist/esm/components/WhatsAppTextEditor/WhatsAppTextEditor.d.ts +126 -3
- package/dist/esm/components/WhatsAppTextEditor/WhatsAppTextEditor.js +5 -1
- package/dist/esm/components/WhatsAppTextEditor/WhatsAppTextEditorHeader.d.ts +42 -1
- package/dist/esm/components/WhatsAppTextEditor/WhatsAppTextEditorHeader.js +1 -1
- package/dist/esm/components/WhatsAppTextEditor/ai/actionRegistry.d.ts +14 -0
- package/dist/esm/components/WhatsAppTextEditor/ai/actionRegistry.js +1 -0
- package/dist/esm/components/WhatsAppTextEditor/ai/aiTag.d.ts +58 -0
- package/dist/esm/components/WhatsAppTextEditor/ai/aiTag.js +1 -0
- package/dist/esm/components/WhatsAppTextEditor/ai/api.d.ts +22 -0
- package/dist/esm/components/WhatsAppTextEditor/ai/api.js +1 -0
- package/dist/esm/components/alerts/Alert.styled.js +9 -8
- package/dist/esm/components/feature-announcements/MajorUpdatePopup.js +1 -1
- package/dist/esm/components/feature-announcements/MinorUpdatePopup.js +1 -1
- package/dist/esm/components/multi-level-dropdown/GroupedMenuList.d.ts +4 -0
- package/dist/esm/components/multi-level-dropdown/GroupedMenuList.js +1 -1
- package/dist/esm/components/multi-level-dropdown/MenuItem.d.ts +3 -0
- package/dist/esm/components/multi-level-dropdown/MenuItem.js +1 -1
- package/dist/esm/components/multi-level-dropdown/MenuList.d.ts +4 -0
- package/dist/esm/components/multi-level-dropdown/MenuList.js +1 -1
- package/dist/esm/components/multi-level-dropdown/MultiLevelDropdown.js +1 -1
- package/dist/esm/components/multi-level-dropdown/type.d.ts +3 -0
- package/dist/esm/components/radioButton/RadioButton.d.ts +1 -0
- package/dist/esm/components/radioButton/RadioButton.js +1 -1
- package/dist/esm/components/tag/Tag.d.ts +1 -1
- package/dist/esm/components/tag/Tag.js +1 -1
- package/dist/esm/components/tag/Tag.stories.d.ts +5 -5
- package/dist/esm/components/tag/Tag.styled.d.ts +3 -0
- package/dist/esm/components/tag/Tag.styled.js +1 -1
- package/dist/esm/components/tag/model.d.ts +15 -0
- package/dist/esm/components/template-preview/TemplatePreview.js +1 -1
- package/dist/esm/helpers/BaseWhatsappContentLang.helper.js +1 -1
- package/dist/esm/index.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1,5 @@
|
|
|
1
|
-
import{__rest as
|
|
1
|
+
import I from"@emotion/styled/base";import{__rest as g,__awaiter as C}from"../../_virtual/_tslib.js";import{jsxs as A,jsx as l,Fragment as c}from"react/jsx-runtime";import{keyframes as b}from"@emotion/react";import Z from"../../assets/icons/check.svg.js";import G from"../../assets/icons/chevronLeft.svg.js";import X from"../../assets/icons/chevronRight.svg.js";import d from"../../assets/icons/cross.svg.js";import V from"../../assets/icons/edit.svg.js";import W from"../../assets/icons/info.svg.js";import R from"../../assets/icons/rewind.svg.js";import H from"../../assets/icons/thumbs_down.svg.js";import B from"../../assets/icons/thumbs_up.svg.js";import{BaseWhatsappContentLangHelper as J}from"../../helpers/BaseWhatsappContentLang.helper.js";import m,{useRef as N,useState as u,useMemo as Y,useEffect as x,useCallback as F,useImperativeHandle as y}from"react";import{COLORS as h}from"../../constants/Theme.js";import{Tooltip as a}from"../tooltips/Tooltip.js";import{TitleSmall as i,BodyCaption as p}from"../TypographyStyle.js";import{DEFAULT_INSTRUCTION_SUGGESTIONS as n,resolveActionPrompts as S,DEFAULT_AI_ACTION_MIN_CHARS as k}from"./ai/actionRegistry.js";import{computeAiTagOnPostEdit as U,computeAiTagOnAccept as v}from"./ai/aiTag.js";export{AI_TAG_CHANGE_RATIO_THRESHOLD,computeAiTagOnAccept,levenshteinDistance}from"./ai/aiTag.js";import{buildActionPrompt as z,requestAISuggestion as s}from"./ai/api.js";import{OuterContainer as Q,EditorFooterRow as w,EditorFooterTitle as o,EditorFooterRight as t,Container as j,TextSpace as T}from"./CustomEditor.styled.js";import{EditorActionTypes as D,AIEditorActionTypes as L,AIActionVariant as e,WhatsAppTextEditorHeader as K}from"./WhatsAppTextEditorHeader.js";function O(){return"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."}const E="Character limit reached",P=b`
|
|
2
|
+
0% { opacity: 0.55; }
|
|
3
|
+
50% { opacity: 1; }
|
|
4
|
+
100% { opacity: 0.55; }
|
|
5
|
+
`,f=I("div","production"===process.env.NODE_ENV?{target:"ea7i3sh18"}:{target:"ea7i3sh18",label:"EditorSkeletonContainer"})("production"===process.env.NODE_ENV?{name:"zdv776",styles:"padding:14px 12px;display:flex;flex-direction:column;gap:10px;min-height:150px"}:{name:"zdv776",styles:"padding:14px 12px;display:flex;flex-direction:column;gap:10px;min-height:150px",map:"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbUMyQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */",toString:O}),M=I("div","production"===process.env.NODE_ENV?{target:"ea7i3sh17"}:{target:"ea7i3sh17",label:"EditorSkeletonLine"})("height:16px;border-radius:6px;width:",(I=>I.width),";background:#ececef;animation:",P," 1.1s ease-in-out infinite;"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMENzQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),r=I("div","production"===process.env.NODE_ENV?{target:"ea7i3sh16"}:{target:"ea7i3sh16",label:"SuggestionSessionContainer"})("production"===process.env.NODE_ENV?{name:"lwqbyv",styles:"padding:12px;display:flex;flex-direction:column;gap:8px;max-height:260px;overflow-y:scroll;scrollbar-width:thin;scrollbar-color:#c8c8cf transparent;::-webkit-scrollbar{width:8px;}::-webkit-scrollbar-thumb{background:#c8c8cf;border-radius:8px;}::-webkit-scrollbar-track{background:transparent;}"}:{name:"lwqbyv",styles:"padding:12px;display:flex;flex-direction:column;gap:8px;max-height:260px;overflow-y:scroll;scrollbar-width:thin;scrollbar-color:#c8c8cf transparent;::-webkit-scrollbar{width:8px;}::-webkit-scrollbar-thumb{background:#c8c8cf;border-radius:8px;}::-webkit-scrollbar-track{background:transparent;}",map:"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUQ4QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */",toString:O}),q=I("div","production"===process.env.NODE_ENV?{target:"ea7i3sh15"}:{target:"ea7i3sh15",label:"SuggestionBaselineText"})("text-decoration:line-through;color:",h.content.secondary,";"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBcUUwQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),_=I("div","production"===process.env.NODE_ENV?{target:"ea7i3sh14"}:{target:"ea7i3sh14",label:"SuggestionCandidateText"})("color:",h.content.primary,";"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBeUUyQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),$=I("div","production"===process.env.NODE_ENV?{target:"ea7i3sh13"}:{target:"ea7i3sh13",label:"SuggestionCandidateSkeleton"})("production"===process.env.NODE_ENV?{name:"j0onnx",styles:"display:flex;flex-direction:column;gap:8px;width:100%;min-height:40px"}:{name:"j0onnx",styles:"display:flex;flex-direction:column;gap:8px;width:100%;min-height:40px",map:"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBNEUrQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */",toString:O}),II=I("div","production"===process.env.NODE_ENV?{target:"ea7i3sh12"}:{target:"ea7i3sh12",label:"SuggestionControlsRow"})("production"===process.env.NODE_ENV?{name:"1pi78hi",styles:"display:flex;align-items:center;gap:6px"}:{name:"1pi78hi",styles:"display:flex;align-items:center;gap:6px",map:"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbUZ5QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */",toString:O}),gI=I("span","production"===process.env.NODE_ENV?{target:"ea7i3sh11"}:{target:"ea7i3sh11",label:"SuggestionCounter"})("color:",h.content.primary,";font-size:14px;"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBd0ZzQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),CI=I("button","production"===process.env.NODE_ENV?{target:"ea7i3sh10"}:{target:"ea7i3sh10",label:"SuggestionIconButton"})("border:0;background:transparent;padding:6px;border-radius:6px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;color:",h.content.primary,";transition:background-color 0.12s ease;:not(:disabled):hover{background-color:",h.surface.hovered,";}:disabled{opacity:0.35;cursor:not-allowed;}"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBNEYyQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),AI=I(CI,"production"===process.env.NODE_ENV?{target:"ea7i3sh9"}:{target:"ea7i3sh9",label:"SuggestionRegenerateButton"})("production"===process.env.NODE_ENV?{name:"p2u7ri",styles:":disabled{opacity:1;cursor:wait;}"}:{name:"p2u7ri",styles:":disabled{opacity:1;cursor:wait;}",map:"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZ0hnRSIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */",toString:O}),lI=I("div","production"===process.env.NODE_ENV?{target:"ea7i3sh8"}:{target:"ea7i3sh8",label:"RegenerateIconShimmer"})("width:14px;height:14px;border-radius:4px;background:#ececef;flex-shrink:0;animation:",P," 1.1s ease-in-out infinite;"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBc0h5QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),cI=I("div","production"===process.env.NODE_ENV?{target:"ea7i3sh7"}:{target:"ea7i3sh7",label:"InstructionContainer"})("background:",h.surface.standard,";display:flex;flex-direction:column;padding:8px 12px;gap:10px;border-radius:0 0 4px 4px;position:relative;"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBK0h3QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),bI=I("div","production"===process.env.NODE_ENV?{target:"ea7i3sh6"}:{target:"ea7i3sh6",label:"InstructionInputRow"})("border:1px solid #f5a4c0;border-radius:10px;padding:8px 10px;display:flex;align-items:center;gap:10px;background:",h.surface.standard,";"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBd0l1QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),ZI=I("input","production"===process.env.NODE_ENV?{target:"ea7i3sh5"}:{target:"ea7i3sh5",label:"InstructionInput"})("flex:1;min-width:0;border:0;outline:none;font-size:14px;background:transparent;color:",h.content.primary,";"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUpzQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),GI=I("div","production"===process.env.NODE_ENV?{target:"ea7i3sh4"}:{target:"ea7i3sh4",label:"InstructionActions"})("production"===process.env.NODE_ENV?{name:"1og3vwv",styles:"display:flex;align-items:center;gap:10px"}:{name:"1og3vwv",styles:"display:flex;align-items:center;gap:10px",map:"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMEpzQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */",toString:O}),XI=I("button","production"===process.env.NODE_ENV?{target:"ea7i3sh3"}:{target:"ea7i3sh3",label:"InstructionCancel"})("border:0;background:transparent;color:",h.content.secondary,";font-size:14px;font-weight:500;padding:0;cursor:pointer;"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBK0p3QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),dI=I("button","production"===process.env.NODE_ENV?{target:"ea7i3sh2"}:{target:"ea7i3sh2",label:"InstructionImprove"})("border:1px solid #5d3a72;color:#5d3a72;background:",h.surface.standard,";border-radius:8px;padding:8px 14px;font-size:14px;line-height:1.1;font-weight:600;cursor:pointer;"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBd0t5QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),VI=I("div","production"===process.env.NODE_ENV?{target:"ea7i3sh1"}:{target:"ea7i3sh1",label:"InstructionSuggestionList"})("margin-top:10px;border-radius:12px;background:",h.surface.standard,";box-shadow:0 6px 18px rgba(0, 0, 0, 0.1);overflow:hidden;"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbUw2QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),WI=I("button","production"===process.env.NODE_ENV?{target:"ea7i3sh0"}:{target:"ea7i3sh0",label:"InstructionSuggestionButton"})("width:100%;border:0;border-top:1px solid ",h.stroke.primary,";background:",(I=>I.selected?"#e5f3e8":"transparent"),";color:",(I=>I.selected?"#1e6b34":h.content.primary),";text-align:left;padding:12px 14px;font-size:14px;line-height:1.2;cursor:pointer;:first-of-type{border-top:0;}"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMExrRCIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIEZyYWdtZW50IGFzIF9GcmFnbWVudCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCwgY29tcHV0ZUFpVGFnT25Qb3N0RWRpdCwgfSBmcm9tICcuL2FpL2FpVGFnJztcclxuaW1wb3J0IHsgYnVpbGRBY3Rpb25Qcm9tcHQsIHJlcXVlc3RBSVN1Z2dlc3Rpb24gfSBmcm9tICcuL2FpL2FwaSc7XHJcbmltcG9ydCB7IENvbnRhaW5lciwgRWRpdG9yRm9vdGVyUmlnaHQsIEVkaXRvckZvb3RlclJvdywgRWRpdG9yRm9vdGVyVGl0bGUsIE91dGVyQ29udGFpbmVyLCBUZXh0U3BhY2UsIH0gZnJvbSAnLi9DdXN0b21FZGl0b3Iuc3R5bGVkJztcclxuaW1wb3J0IHsgQUlBY3Rpb25WYXJpYW50LCBBSUVkaXRvckFjdGlvblR5cGVzLCBFZGl0b3JBY3Rpb25UeXBlcywgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyLCB9IGZyb20gJy4vV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyJztcclxuY29uc3QgTElNSVRfUkVBQ0hFRCA9ICdDaGFyYWN0ZXIgbGltaXQgcmVhY2hlZCc7XHJcbmNvbnN0IFJFUEhSQVNFX0lETEVfTVMgPSAzMDAwO1xyXG5jb25zdCBNQVhfUkVQSFJBU0VfSElHSExJR0hUUyA9IDU7XHJcbmNvbnN0IE1BWF9TVUdHRVNUSU9OUyA9IDM7XHJcbmNvbnN0IExBUkdFX0lOUFVUX1RIUkVTSE9MRCA9IDEyMDA7XHJcbmNvbnN0IEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyA9IDEwMDA7XHJcbmNvbnN0IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUID0gJ1JlcGhyYXNlIHRoaXMgV2hhdHNBcHAgdXRpbGl0eSB0ZW1wbGF0ZSB0byBpbXByb3ZlIGNsYXJpdHkgYW5kIHJlYWRhYmlsaXR5IHdoaWxlIHByZXNlcnZpbmcgdmFyaWFibGVzLCBpbnRlbnQsIGFuZCBjb21wbGlhbmNlLic7XHJcbmNvbnN0IHNrZWxldG9uUHVsc2UgPSBrZXlmcmFtZXMgYFxuXHQwJSB7IG9wYWNpdHk6IDAuNTU7IH1cblx0NTAlIHsgb3BhY2l0eTogMTsgfVxuXHQxMDAlIHsgb3BhY2l0eTogMC41NTsgfVxuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0cGFkZGluZzogMTRweCAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDEwcHg7XG5cdG1pbi1oZWlnaHQ6IDE1MHB4O1xuYDtcclxuY29uc3QgRWRpdG9yU2tlbGV0b25MaW5lID0gc3R5bGVkLmRpdiBgXG5cdGhlaWdodDogMTZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHR3aWR0aDogJHsocHJvcHMpID0+IHByb3BzLndpZHRofTtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0YW5pbWF0aW9uOiAke3NrZWxldG9uUHVsc2V9IDEuMXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxMnB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0bWF4LWhlaWdodDogMjYwcHg7XG5cdG92ZXJmbG93LXk6IHNjcm9sbDtcblx0c2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuXHRzY3JvbGxiYXItY29sb3I6ICNjOGM4Y2YgdHJhbnNwYXJlbnQ7XG5cdDo6LXdlYmtpdC1zY3JvbGxiYXIge1xuXHRcdHdpZHRoOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG5cdFx0YmFja2dyb3VuZDogI2M4YzhjZjtcblx0XHRib3JkZXItcmFkaXVzOiA4cHg7XG5cdH1cblx0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG5cdFx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdH1cbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25CYXNlbGluZVRleHQgPSBzdHlsZWQuZGl2IGBcblx0dGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXHRnYXA6IDhweDtcblx0d2lkdGg6IDEwMCU7XG5cdG1pbi1oZWlnaHQ6IDQwcHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ29udHJvbHNSb3cgPSBzdHlsZWQuZGl2IGBcblx0ZGlzcGxheTogZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0Z2FwOiA2cHg7XG5gO1xyXG5jb25zdCBTdWdnZXN0aW9uQ291bnRlciA9IHN0eWxlZC5zcGFuIGBcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25JY29uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdHBhZGRpbmc6IDZweDtcblx0Ym9yZGVyLXJhZGl1czogNnB4O1xuXHRkaXNwbGF5OiBpbmxpbmUtZmxleDtcblx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQucHJpbWFyeX07XG5cdHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZTtcblx0Om5vdCg6ZGlzYWJsZWQpOmhvdmVyIHtcblx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAke0NPTE9SUy5zdXJmYWNlLmhvdmVyZWR9O1xuXHR9XG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMC4zNTtcblx0XHRjdXJzb3I6IG5vdC1hbGxvd2VkO1xuXHR9XG5gO1xyXG4vKiogUmVnZW5lcmF0ZSBzdGF5cyBmdWxsIG9wYWNpdHkgd2hpbGUgZGlzYWJsZWQgc28gdGhlIGxvYWRpbmcgc2hpbW1lciBzdGF5cyB2aXNpYmxlIChzYW1lIHB1bHNlIGFzIGVkaXRvciBza2VsZXRvbikuICovXHJcbmNvbnN0IFN1Z2dlc3Rpb25SZWdlbmVyYXRlQnV0dG9uID0gc3R5bGVkKFN1Z2dlc3Rpb25JY29uQnV0dG9uKSBgXG5cdDpkaXNhYmxlZCB7XG5cdFx0b3BhY2l0eTogMTtcblx0XHRjdXJzb3I6IHdhaXQ7XG5cdH1cbmA7XHJcbmNvbnN0IFJlZ2VuZXJhdGVJY29uU2hpbW1lciA9IHN0eWxlZC5kaXYgYFxuXHR3aWR0aDogMTRweDtcblx0aGVpZ2h0OiAxNHB4O1xuXHRib3JkZXItcmFkaXVzOiA0cHg7XG5cdGJhY2tncm91bmQ6ICNlY2VjZWY7XG5cdGZsZXgtc2hyaW5rOiAwO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbi8qKiBTYW1lIGJvdHRvbSB0b29sYmFyIHNsb3QgYXMgYFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlcmAg4oCUIHJlcGxhY2VzIHRoZSBmdWxsIGljb24vQUkgcGFuZWwgd2hpbGUgb3Blbi4gKi9cclxuY29uc3QgSW5zdHJ1Y3Rpb25Db250YWluZXIgPSBzdHlsZWQuZGl2IGBcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdHBhZGRpbmc6IDhweCAxMnB4O1xuXHRnYXA6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4O1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0Um93ID0gc3R5bGVkLmRpdiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICNmNWE0YzA7XG5cdGJvcmRlci1yYWRpdXM6IDEwcHg7XG5cdHBhZGRpbmc6IDhweCAxMHB4O1xuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbnB1dCA9IHN0eWxlZC5pbnB1dCBgXG5cdGZsZXg6IDE7XG5cdG1pbi13aWR0aDogMDtcblx0Ym9yZGVyOiAwO1xuXHRvdXRsaW5lOiBub25lO1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQWN0aW9ucyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDEwcHg7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbkNhbmNlbCA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDA7XG5cdGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5zZWNvbmRhcnl9O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGZvbnQtd2VpZ2h0OiA1MDA7XG5cdHBhZGRpbmc6IDA7XG5cdGN1cnNvcjogcG9pbnRlcjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW1wcm92ZSA9IHN0eWxlZC5idXR0b24gYFxuXHRib3JkZXI6IDFweCBzb2xpZCAjNWQzYTcyO1xuXHRjb2xvcjogIzVkM2E3Mjtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5cdGJvcmRlci1yYWRpdXM6IDhweDtcblx0cGFkZGluZzogOHB4IDE0cHg7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0bGluZS1oZWlnaHQ6IDEuMTtcblx0Zm9udC13ZWlnaHQ6IDYwMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25TdWdnZXN0aW9uTGlzdCA9IHN0eWxlZC5kaXYgYFxuXHRtYXJnaW4tdG9wOiAxMHB4O1xuXHRib3JkZXItcmFkaXVzOiAxMnB4O1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG5cdG92ZXJmbG93OiBoaWRkZW47XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0d2lkdGg6IDEwMCU7XG5cdGJvcmRlcjogMDtcblx0Ym9yZGVyLXRvcDogMXB4IHNvbGlkICR7Q09MT1JTLnN0cm9rZS5wcmltYXJ5fTtcblx0YmFja2dyb3VuZDogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjZTVmM2U4JyA6ICd0cmFuc3BhcmVudCcpfTtcblx0Y29sb3I6ICR7KHByb3BzKSA9PiAocHJvcHMuc2VsZWN0ZWQgPyAnIzFlNmIzNCcgOiBDT0xPUlMuY29udGVudC5wcmltYXJ5KX07XG5cdHRleHQtYWxpZ246IGxlZnQ7XG5cdHBhZGRpbmc6IDEycHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4yO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5cdDpmaXJzdC1vZi10eXBlIHtcblx0XHRib3JkZXItdG9wOiAwO1xuXHR9XG5gO1xyXG52YXIgQUlGZWVkYmFja1JhdGluZztcclxuKGZ1bmN0aW9uIChBSUZlZWRiYWNrUmF0aW5nKSB7XHJcbiAgICBBSUZlZWRiYWNrUmF0aW5nW1wiTElLRVwiXSA9IFwibGlrZVwiO1xyXG4gICAgQUlGZWVkYmFja1JhdGluZ1tcIkRJU0xJS0VcIl0gPSBcImRpc2xpa2VcIjtcclxufSkoQUlGZWVkYmFja1JhdGluZyB8fCAoQUlGZWVkYmFja1JhdGluZyA9IHt9KSk7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgZWRpdG9yU2Vzc2lvbklkLCB0ZW1wbGF0ZVR5cGUgPSAnbWFya2V0aW5nJywgdGVtcGxhdGVJZCwgcmVxdWVzdEV4ZWN1dG9yLCBiYXNlVXJsLCBlbmRwb2ludFBhdGgsIHVzZUNhc2UsIHN0b3JlSWQsIGFwaUFkYXB0ZXIsIGNvbnZlcnNhdGlvbklkID0gJ3doYXRzYXBwLXRlbXBsYXRlLWVkaXRvcicsIHN5c3RlbUlkID0gJ3doYXRzYXBwLXdyaXRlcicsIGludGVudCA9ICdkZWZhdWx0JywgZW5hYmxlZEFJQWN0aW9ucyA9IFtcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgIEFJRWRpdG9yQWN0aW9uVHlwZXMuU0hPUlRFTixcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVYUEFORCxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLkVNT0pJRlksXHJcbiAgICBdLCBkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucyA9IGZhbHNlLCBwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIGFpQWN0aW9uTWluQ2hhcnMsIGluc3RydWN0aW9uU3VnZ2VzdGlvbnMgPSBERUZBVUxUX0lOU1RSVUNUSU9OX1NVR0dFU1RJT05TLCBvbkFuYWx5dGljc0V2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0LCBvbkJsdXI6IHRleHRBcmVhT25CbHVyIH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJlZGl0b3JTZXNzaW9uSWRcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFuYWx5dGljc0V2ZW50XCIsIFwib25BSVRhZ0NvbXB1dGVkXCIsIFwicHJlZmlsbFdhc0FpR2VuZXJhdGVkXCIsIFwiZWRpdG9ySGVhZGVyXCIsIFwib25BSVRvbmVTZWxlY3RcIiwgXCJvbkFJQWN0aW9uUmVxdWVzdFwiLCBcIm9uQnVpbGRBSVByb21wdFwiLCBcIm9uQmx1clwiXSk7XHJcbiAgICBjb25zdCB0ZXh0U3BhY2VSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICBjb25zdCBbY3VycmVudFRleHQsIHNldEN1cnJlbnRUZXh0XSA9IHVzZVN0YXRlKGlucHV0VmFsdWUgfHwgJycpO1xyXG4gICAgY29uc3QgW2lzUmVwaHJhc2VIaWdobGlnaHRlZCwgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtyZXBocmFzZUhpZ2hsaWdodENvdW50LCBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50XSA9IHVzZVN0YXRlKDApO1xyXG4gICAgY29uc3QgW2lzR2VuZXJhdGluZywgc2V0SXNHZW5lcmF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlLCBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICAgIGNvbnN0IFtpbnN0cnVjdGlvblRleHQsIHNldEluc3RydWN0aW9uVGV4dF0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgICBjb25zdCBbdG9uZUJ5QWN0aW9uLCBzZXRUb25lQnlBY3Rpb25dID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25CYXNlVGV4dCwgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0XSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3QgW3N1Z2dlc3Rpb25DYW5kaWRhdGVzLCBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlc10gPSB1c2VTdGF0ZShbXSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkluZGV4LCBzZXRTdWdnZXN0aW9uSW5kZXhdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkFjdGlvblR5cGUsIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlXSA9IHVzZVN0YXRlKG51bGwpO1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvblNjcm9sbFJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHJlcGhyYXNlSWRsZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IGhpZ2hsaWdodFJlc2V0UmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgYWlUYWdSZWNvbXB1dGVSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICBjb25zdCBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IHByZWZpbGxCYXNlbGluZVRleHRSZWYgPSB1c2VSZWYoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlLCBzZXRGZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVdID0gdXNlU3RhdGUoe30pO1xyXG4gICAgY29uc3QgbW91bnRTZXNzaW9uSWRSZWYgPSB1c2VSZWYoYG1vdW50LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKVxyXG4gICAgICAgIC50b1N0cmluZygzNilcclxuICAgICAgICAuc2xpY2UoMiwgOCl9YCk7XHJcbiAgICBjb25zdCBoaWdobGlnaHRTdG9yYWdlS2V5ID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoYCR7ZWRpdG9ySW5zdGFuY2VLZXkgfHwgJ2RlZmF1bHQnfS0ke2VkaXRvclNlc3Npb25JZCB8fCBtb3VudFNlc3Npb25JZFJlZi5jdXJyZW50fWApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBlZGl0b3JTZXNzaW9uSWRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSAhIXByZWZpbGxXYXNBaUdlbmVyYXRlZDtcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIHByZWZpbGxCYXNlbGluZVRleHRSZWYuY3VycmVudCA9IHByZWZpbGxXYXNBaUdlbmVyYXRlZFxyXG4gICAgICAgICAgICA/IGlucHV0VmFsdWUgfHwgJydcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH0sIFtwcmVmaWxsV2FzQWlHZW5lcmF0ZWQsIGVkaXRvckluc3RhbmNlS2V5XSk7XHJcbiAgICBjb25zdCBhY3RpdmVBY3Rpb25Qcm9tcHRzID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmVBY3Rpb25Qcm9tcHRzKHRlbXBsYXRlVHlwZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzKTtcclxuICAgIH0sIFtwcm9tcHRPdmVycmlkZXMsIHJlcGhyYXNlVG9uZXMsIHRlbXBsYXRlVHlwZV0pO1xyXG4gICAgY29uc3QgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcXVlcnkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFxdWVyeSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmZpbHRlcigoc3VnZ2VzdGlvbikgPT4gc3VnZ2VzdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XHJcbiAgICB9LCBbaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucywgaW5zdHJ1Y3Rpb25UZXh0XSk7XHJcbiAgICBjb25zdCBtaW5DaGFyc0J5QWN0aW9uID0gdXNlTWVtbygoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9BSV9BQ1RJT05fTUlOX0NIQVJTKSwgKGFpQWN0aW9uTWluQ2hhcnMgfHwge30pKTtcclxuICAgIH0sIFthaUFjdGlvbk1pbkNoYXJzXSk7XHJcbiAgICBjb25zdCByZXBocmFzZU1pbkNoYXJzID0gbWluQ2hhcnNCeUFjdGlvbltBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXSB8fFxyXG4gICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1tBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFXTtcclxuICAgIGNvbnN0IGFub255bWl6ZUluc3RydWN0aW9uVGV4dCA9IHVzZUNhbGxiYWNrKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xyXG4gICAgICAgIGlmICghbm9ybWFsaXplZClcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbm9ybWFsaXplZC5zcGxpdCgnICcpLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gYFthbm9ueW1pemVkOmxlbmd0aF8ke25vcm1hbGl6ZWQubGVuZ3RofTp3b3Jkc18ke3dvcmRzfV1gO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdEFJRXZlbnQgPSB1c2VDYWxsYmFjaygobmFtZSwgcGF5bG9hZCkgPT4ge1xyXG4gICAgICAgIG9uQW5hbHl0aWNzRXZlbnQgPT09IG51bGwgfHwgb25BbmFseXRpY3NFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BbmFseXRpY3NFdmVudChuYW1lLCBwYXlsb2FkKTtcclxuICAgIH0sIFtvbkFuYWx5dGljc0V2ZW50XSk7XHJcbiAgICBjb25zdCBzZXRFZGl0b3JUZXh0ID0gdXNlQ2FsbGJhY2soKG5leHRUZXh0KSA9PiB7XHJcbiAgICAgICAgc2V0Q3VycmVudFRleHQoKHByZXYpID0+IChwcmV2ID09PSBuZXh0VGV4dCA/IHByZXYgOiBuZXh0VGV4dCkpO1xyXG4gICAgfSwgW10pO1xyXG4gICAgY29uc3QgZW1pdENoYW5nZVdpdGhHdWFyZCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV4dFRleHQubGVuZ3RoID4gTEFSR0VfSU5QVVRfVEhSRVNIT0xEKSB7XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgbmV4dFRleHQpO1xyXG4gICAgICAgICAgICBkZWZlcnJlZEh0bWxSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICAgICAgICAgIH0sIDE2KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwobmV4dFRleHQpKTtcclxuICAgIH0sIFtvbkNoYW5nZV0pO1xyXG4gICAgY29uc3QgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBjb25zdCBsYXRlc3QgPSBhY2NlcHRlZFN1Z2dlc3Rpb25TdGF0ZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdEJhc2VsaW5lID0gKGxhdGVzdCA9PT0gbnVsbCB8fCBsYXRlc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdC5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoIWxhdGVzdEJhc2VsaW5lKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKG5leHRUZXh0ID09PSBsYXRlc3RCYXNlbGluZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlY29tcHV0ZVBheWxvYWQgPSBjb21wdXRlQWlUYWdPblBvc3RFZGl0KHtcclxuICAgICAgICAgICAgYWNjZXB0ZWRBaVRleHQ6IGxhdGVzdEJhc2VsaW5lLFxyXG4gICAgICAgICAgICBjdXJyZW50RWRpdGVkVGV4dDogbmV4dFRleHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVjb21wdXRlUGF5bG9hZCksIHsgc291cmNlOiAncG9zdF9lZGl0X2RlYm91bmNlJyB9KSk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIG9uQUlUYWdDb21wdXRlZCwgcHJlZmlsbFdhc0FpR2VuZXJhdGVkXSk7XHJcbiAgICBjb25zdCBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChudWxsKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcyhbXSk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkluZGV4KDApO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25BY3Rpb25UeXBlKG51bGwpO1xyXG4gICAgICAgIHNldEZlZWRiYWNrVm90ZXNCeUNhbmRpZGF0ZSh7fSk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUhpZ2hsaWdodENvdW50ID49IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmV4dENvdW50ID0gcmVwaHJhc2VIaWdobGlnaHRDb3VudCArIDE7XHJcbiAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChuZXh0Q291bnQpO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiBlZGl0b3JJbnN0YW5jZUtleSkge1xyXG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGhpZ2hsaWdodFN0b3JhZ2VLZXksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVkaXRvckluc3RhbmNlS2V5LFxyXG4gICAgICAgIGhpZ2hsaWdodFN0b3JhZ2VLZXksXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZiA9IHVzZVJlZih0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQpO1xyXG4gICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQ7XHJcbiAgICBmdW5jdGlvbiBoYW5kbGVPbkNoYW5nZShlKSB7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkU3VnZ2VzdGlvbiA9IGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGFjY2VwdGVkU3VnZ2VzdGlvbiAmJlxyXG4gICAgICAgICAgICAhYWNjZXB0ZWRTdWdnZXN0aW9uLmVkaXRlZEV2ZW50RW1pdHRlZCAmJlxyXG4gICAgICAgICAgICB0ZXh0ICE9PSBhY2NlcHRlZFN1Z2dlc3Rpb24uYWNjZXB0ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFjY2VwdGVkU3VnZ2VzdGlvbiksIHsgZWRpdGVkRXZlbnRFbWl0dGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfc3VnZ2VzdGlvbl9lZGl0ZWQnLCB7XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZTogYWNjZXB0ZWRTdWdnZXN0aW9uLmFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWlUZXh0Rm9yUmVjb21wdXRlID0gKGFjY2VwdGVkU3VnZ2VzdGlvbiA9PT0gbnVsbCB8fCBhY2NlcHRlZFN1Z2dlc3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdGVkU3VnZ2VzdGlvbi5hY2NlcHRlZFRleHQpIHx8XHJcbiAgICAgICAgICAgIChwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcclxuICAgICAgICAgICAgICAgID8gcHJlZmlsbEJhc2VsaW5lVGV4dFJlZi5jdXJyZW50IHx8IGN1cnJlbnRUZXh0XHJcbiAgICAgICAgICAgICAgICA6ICcnKTtcclxuICAgICAgICBpZiAoYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUgJiYgdGV4dCAhPT0gYmFzZWxpbmVBaVRleHRGb3JSZWNvbXB1dGUpIHtcclxuICAgICAgICAgICAgYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZW1pdFBvc3RFZGl0QWlUYWdSZWNvbXB1dGUodGV4dCk7XHJcbiAgICAgICAgICAgIH0sIEFJX1RBR19SRUNPTVBVVEVfSURMRV9NUyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHNldENhcmV0UG9zaXRpb24oY2FyZXRQb3MpIHtcclxuICAgICAgICBjb25zdCBlbGVtID0gdGV4dFNwYWNlUmVmID09PSBudWxsIHx8IHRleHRTcGFjZVJlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoZWxlbS5zZWxlY3Rpb25TdGFydCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWxlbS5zZWxlY3Rpb25FbmQgPSBjYXJldFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBlbGVtLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gb25BY3Rpb25TZWxlY3QoYWN0aW9uVHlwZSkge1xyXG4gICAgICAgIGNvbnN0IHdpbGRDYXJkID0gV2lsZENhcmRNYXBbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKHdpbGRDYXJkICYmIHRleHRTcGFjZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gaW5zZXJ0VGV4dEF0SW5kZXgod2lsZENhcmQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24oc3RhcnQgKyAxKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHRPcldyYXAod2lsZENhcmQpO1xyXG4gICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uRW1vamlBZGRpdGlvbihlbW9qaSkge1xyXG4gICAgICAgIGNvbnN0IHsgdGV4dCB9ID0gYWRkVGV4dChlbW9qaSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHRPcldyYXAodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIGlmICh0ZXh0U3BhY2VSZWYuY3VycmVudCAmJiB0ZXh0VG9BZGQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25TdGFydDtcclxuICAgICAgICAgICAgY29uc3QgZW5kID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uRW5kO1xyXG4gICAgICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IHRleHRUb0FkZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIC8qKiBub3RoaW5nIGlzIHNlbGVjdGVkICovXHJcbiAgICAgICAgICAgICAgICAvKiogc28gYXBwZW5kIHRoZSB3aWxkY2FyZCBhdCB0aGUgZW5kICovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkVGV4dCh3aWxkQ2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0ID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcud3JhcHBXaWxkY2FyZChzdGFydCwgZW5kLCB3aWxkQ2FyZCwgdGV4dCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0ZXh0LCBodG1sIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gYWRkVGV4dCh0ZXh0VG9BZGQpIHtcclxuICAgICAgICB2YXIgX2EsIF9iO1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIHN0YXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyB0ZXh0OiB0ZXh0LCBodG1sOiB0ZXh0IH07XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBpbnNlcnRUZXh0QXRJbmRleCh0ZXh0VG9BZGQsIGluZGV4KSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBsZXQgdGV4dCA9IChfYiA9IChfYSA9IHRleHRTcGFjZVJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmFsdWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGluZGV4KSArIHRleHRUb0FkZCArIHRleHQuc2xpY2UoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKHRleHQpO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQodGV4dCk7XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgfVxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWVkaXRvckluc3RhbmNlS2V5KVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2FjaGVkID0gTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oaGlnaGxpZ2h0U3RvcmFnZUtleSkgfHwgJzAnKTtcclxuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjYWNoZWQpKSB7XHJcbiAgICAgICAgICAgIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnQoY2FjaGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShoaWdobGlnaHRTdG9yYWdlS2V5KTtcclxuICAgICAgICB9O1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCBoaWdobGlnaHRTdG9yYWdlS2V5XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0dlbmVyYXRpbmcpIHtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZWxpZ2libGUgPSAhIWN1cnJlbnRUZXh0LnRyaW0oKSAmJiBjdXJyZW50VGV4dC5sZW5ndGggPj0gcmVwaHJhc2VNaW5DaGFycztcclxuICAgICAgICBpZiAocHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID0gZWxpZ2libGU7XHJcbiAgICAgICAgICAgIGlmIChlbGlnaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICAgICAgcmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3Jvc3NlZFRocmVzaG9sZCA9ICFwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ICYmIGVsaWdpYmxlO1xyXG4gICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChjcm9zc2VkVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXBocmFzZUlkbGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYuY3VycmVudCgpO1xyXG4gICAgICAgIH0sIFJFUEhSQVNFX0lETEVfTVMpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBpc0dlbmVyYXRpbmcsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFpVGFnUmVjb21wdXRlUmVmLmN1cnJlbnQpO1xyXG4gICAgICAgIH07XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGUgPSBzdWdnZXN0aW9uQ2FuZGlkYXRlc1tzdWdnZXN0aW9uSW5kZXhdIHx8ICcnO1xyXG4gICAgY29uc3QgYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXkgPSB1c2VNZW1vKCgpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVDYW5kaWRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiBgJHtzdWdnZXN0aW9uQWN0aW9uVHlwZX0tJHtzdWdnZXN0aW9uSW5kZXh9LSR7YWN0aXZlQ2FuZGlkYXRlfWA7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc3VnZ2VzdGlvbkluZGV4XSk7XHJcbiAgICBjb25zdCBoYXNGZWVkYmFja0ZvckFjdGl2ZUNhbmRpZGF0ZSA9ICEhKGFjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5ICYmXHJcbiAgICAgICAgZmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlW2FjdGl2ZUZlZWRiYWNrQ2FuZGlkYXRlS2V5XSk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2I7XHJcbiAgICAgICAgaWYgKCFvbkFJQWN0aW9uUmVxdWVzdCAmJlxyXG4gICAgICAgICAgICAhYXBpQWRhcHRlciAmJlxyXG4gICAgICAgICAgICAoIXJlcXVlc3RFeGVjdXRvciB8fCAhYmFzZVVybCkpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdBSSBjb25maWd1cmF0aW9uIG1pc3NpbmcnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWN1cnJlbnRUZXh0LnRyaW0oKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IG1pbkNoYXJzRm9yQWN0aW9uID0gbWluQ2hhcnNCeUFjdGlvblthY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgNTA7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0Lmxlbmd0aCA8IG1pbkNoYXJzRm9yQWN0aW9uKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChyZWdlbmVyYXRlRXhpc3RpbmcgJiYgIWNhblJlZ2VuZXJhdGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBiYXNlQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgIHRlbXBsYXRlVHlwZSA9PT0gJ3V0aWxpdHknICYmXHJcbiAgICAgICAgICAgIGFjdGlvblZhcmlhbnQgPT09IEFJQWN0aW9uVmFyaWFudC5SRVBIUkFTRVxyXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNvbmZpZyksIHsgbGFiZWw6ICdSZXBocmFzZScsIGJhc2VQcm9tcHQ6IFVUSUxJVFlfUkVQSFJBU0VfUFJPTVBUIH0pIDogYmFzZUNvbmZpZztcclxuICAgICAgICAvLyBUb25lIGlzIHNlbnQgb25seSBhZnRlciBleHBsaWNpdCB1c2VyIHNlbGVjdGlvbiAob3IgZXhwbGljaXQgb3ZlcnJpZGUpLFxyXG4gICAgICAgIC8vIG5vdCBmcm9tIGRlZmF1bHQgdG9uZSBtZXRhZGF0YS5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmVJZCA9IHRvbmVPdmVycmlkZUlkIHx8IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jYXRlZ29yeTogdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFjY2VwdGVkU3VnZ2VzdGlvblN0YXRlUmVmLmN1cnJlbnQgPSB7XHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWN0aW9uVHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIGVkaXRlZEV2ZW50RW1pdHRlZDogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBpbkluaXRpYWxBaVBoYXNlID0gaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgY29uc3QgdGFnUGF5bG9hZCA9IGNvbXB1dGVBaVRhZ09uQWNjZXB0KHtcclxuICAgICAgICAgICAgYmFzZWxpbmVUZXh0OiBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkVGV4dDogYWN0aXZlQ2FuZGlkYXRlLFxyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2U6IGluSW5pdGlhbEFpUGhhc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluSW5pdGlhbEFpUGhhc2UpIHtcclxuICAgICAgICAgICAgaW5pdGlhbEFpUHJlZmlsbFBoYXNlUmVmLmN1cnJlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkID09PSBudWxsIHx8IG9uQUlUYWdDb21wdXRlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSVRhZ0NvbXB1dGVkKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGFnUGF5bG9hZCksIHsgc291cmNlOiAnYWNjZXB0JyB9KSk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlIHx8ICFhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGlmIChmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGVbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RmVlZGJhY2tWb3Rlc0J5Q2FuZGlkYXRlKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aXZlRmVlZGJhY2tDYW5kaWRhdGVLZXldOiByYXRpbmcgfSkpKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfZmVlZGJhY2tfc3VibWl0dGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICByYXRpbmcsXHJcbiAgICAgICAgICAgIGNhbmRpZGF0ZV9pbmRleDogc3VnZ2VzdGlvbkluZGV4ICsgMSxcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBhY3RpdmVGZWVkYmFja0NhbmRpZGF0ZUtleSxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICBmZWVkYmFja1ZvdGVzQnlDYW5kaWRhdGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkluZGV4LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2E7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbkNvbmZpZyA9IGFjdGl2ZUFjdGlvblByb21wdHNbYWN0aW9uVHlwZV07XHJcbiAgICAgICAgICAgIGNvbnN0IHRvbmVJZCA9IHRvbmVCeUFjdGlvblthY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogYWN0aW9uQ29uZmlnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5OiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLFxyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogaXNHZW5lcmF0aW5nICYmIHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWN1cnJlbnRUZXh0LnRyaW0oKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0Lmxlbmd0aCA8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGluZyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpLFxyXG4gICAgICAgICAgICAgICAgc2hvd1RvbmVEcm9wZG93bjogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICEhKChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCksXHJcbiAgICAgICAgICAgICAgICB0b25lczogYWN0aW9uQ29uZmlnLnRvbmVzLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRUb25lSWQ6IHRvbmVJZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0sIFtcclxuICAgICAgICBlbmFibGVkQUlBY3Rpb25zLFxyXG4gICAgICAgIGRpc2FibGVCdWlsdEluQUlBY3Rpb25zLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSxcclxuICAgICAgICBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICAgICAgaXNSZXBocmFzZUhpZ2hsaWdodGVkLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIG1pbkNoYXJzQnlBY3Rpb24sXHJcbiAgICBdKTtcclxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYWRkVGV4dE9yV3JhcCxcclxuICAgICAgICAgICAgYWRkVGV4dCxcclxuICAgICAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUZXh0O1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9LCBbYWRkVGV4dE9yV3JhcCwgYWRkVGV4dCwgY3VycmVudFRleHRdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHNldEVkaXRvclRleHQoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICB9LCBbaW5wdXRWYWx1ZSwgc2V0RWRpdG9yVGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoIWxpbWl0IHx8ICFvbkVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbmV4dEVycm9yID0gY3VycmVudFRleHQubGVuZ3RoID4gbGltaXQgPyBMSU1JVF9SRUFDSEVEIDogZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogJyc7XHJcbiAgICAgICAgaWYgKGxhc3RFbWl0dGVkRWRpdG9yRXJyb3JSZWYuY3VycmVudCA9PT0gbmV4dEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID0gbmV4dEVycm9yO1xyXG4gICAgICAgIG9uRXJyb3IobmV4dEVycm9yKTtcclxuICAgIH0sIFtjdXJyZW50VGV4dCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yXSk7XHJcbiAgICByZXR1cm4gKF9qc3hzKE91dGVyQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoRWRpdG9yRm9vdGVyUm93LCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JGb290ZXJUaXRsZSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyID8gKF9qc3goVGl0bGVTbWFsbCwgT2JqZWN0LmFzc2lnbih7IFwiZGF0YS10ZXN0XCI6IFwiYm9keS10ZXh0LWZvci1lZGl0LXRlbXBsYXRlXCIgfSwgeyBjaGlsZHJlbjogZWRpdG9ySGVhZGVyIH0pKSkgOiBudWxsIH0pLCBfanN4cyhFZGl0b3JGb290ZXJSaWdodCwgeyBjaGlsZHJlbjogW2Vycm9yICYmIGVycm9yICE9PSBMSU1JVF9SRUFDSEVEID8gKF9qc3hzKF9GcmFnbWVudCwgeyBjaGlsZHJlbjogW19qc3goSW5mb0ljb24sIHsgd2lkdGg6IDE2LCBoZWlnaHQ6IDE2LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSksIF9qc3goQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBjb2xvcjogQ09MT1JTLmNvbnRlbnQubmVnYXRpdmUgfSwgeyBjaGlsZHJlbjogZXJyb3IgfSkpXSB9KSkgOiBudWxsLCBsaW1pdCA/IChfanN4cyhCb2R5Q2FwdGlvbiwgT2JqZWN0LmFzc2lnbih7IHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBlcnJvciA9PT0gTElNSVRfUkVBQ0hFRCB8fCBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDT0xPUlMuY29udGVudC5uZWdhdGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0xPUlMuY29udGVudC5zZWNvbmRhcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBbY3VycmVudFRleHQubGVuZ3RoLCBcIi9cIiwgbGltaXRdIH0pKSkgOiBudWxsXSB9KV0gfSksIF9qc3hzKENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IGlzRXJyb3I6ICEhZXJyb3IgfSwgeyBjaGlsZHJlbjogW3Nob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiA/IChfanN4cyhTdWdnZXN0aW9uU2Vzc2lvbkNvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7IHJlZjogc3VnZ2VzdGlvblNjcm9sbFJlZiB9LCB7IGNoaWxkcmVuOiBbX2pzeChTdWdnZXN0aW9uQmFzZWxpbmVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogc3VnZ2VzdGlvbkJhc2VIdG1sIH0gfSksIGlzR2VuZXJhdGluZyA/IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWJ1c3lcIjogXCJ0cnVlXCIgfSwgeyBjaGlsZHJlbjogX2pzeHMoU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uLCB7IGNoaWxkcmVuOiBbX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiOTYlXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjg0JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI2OCVcIiB9KV0gfSkgfSkpKSA6IChfanN4KFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0LCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faHRtbDogYWN0aXZlQ2FuZGlkYXRlSHRtbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0pKSwgX2pzeHMoU3VnZ2VzdGlvbkNvbnRyb2xzUm93LCB7IGNoaWxkcmVuOiBbX2pzeHMoU3VnZ2VzdGlvbkNvdW50ZXIsIHsgY2hpbGRyZW46IFtzdWdnZXN0aW9uSW5kZXggKyAxLCBcIi9cIiwgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoXSB9KSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIlByZXZpb3VzIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCwgb25DbGljazogKCkgPT4gc2V0U3VnZ2VzdGlvbkluZGV4KChpZHgpID0+IE1hdGgubWF4KDAsIGlkeCAtIDEpKSB9LCB7IGNoaWxkcmVuOiBfanN4KENoZXZyb25MZWZ0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiTmV4dCBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc05leHRTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1pbihzdWdnZXN0aW9uQ2FuZGlkYXRlcy5sZW5ndGggLSAxLCBpZHggKyAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uUmlnaHRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiTGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkxpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNVcEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSB9KSksIF9qc3goVG9vbHRpcCwgT2JqZWN0LmFzc2lnbih7IGJvZHk6IFwiRGlzbGlrZVwiLCBwbGFjZW1lbnQ6IFwidG9wXCIgfSwgeyBjaGlsZHJlbjogX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIkRpc2xpa2Ugc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaGFzRmVlZGJhY2tGb3JBY3RpdmVDYW5kaWRhdGUsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKEFJRmVlZGJhY2tSYXRpbmcuRElTTElLRSkgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvbkJsdXI6IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWlUYWdSZWNvbXB1dGVSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaVRhZ1JlY29tcHV0ZVJlZi5jdXJyZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRQb3N0RWRpdEFpVGFnUmVjb21wdXRlKGUudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBcmVhT25CbHVyID09PSBudWxsIHx8IHRleHRBcmVhT25CbHVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0ZXh0QXJlYU9uQmx1cihlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25QYXN0ZTogKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzdGVkVGV4dC5sZW5ndGggPiBMQVJHRV9JTlBVVF9USFJFU0hPTEQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IChfYSA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25TdGFydCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAoX2IgPSBlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc2VsZWN0aW9uRW5kKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmVmZXIgbGl2ZSBET00gdmFsdWUg4oCUIGBjdXJyZW50VGV4dGAgY2FuIGxhZyB0aGUgdGV4dGFyZWEgZm9yIGJpZyBwYXN0ZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IChfYyA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC52YWx1ZSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRleHQgPSBiYXNlLnNsaWNlKDAsIHN0YXJ0KSArIHBhc3RlZFRleHQgKyBiYXNlLnNsaWNlKGVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdG9yVGV4dChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChuZXh0VGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZXQgPSBzdGFydCArIHBhc3RlZFRleHQubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YS5zZXRTZWxlY3Rpb25SYW5nZShjYXJldCwgY2FyZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgcmFuZ2UgaW4gZWRnZSBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJvd3M6IHJvd3MgfSkpKSwgaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSA/IChfanN4cyhJbnN0cnVjdGlvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3hzKEluc3RydWN0aW9uSW5wdXRSb3csIHsgY2hpbGRyZW46IFtfanN4KEVkaXRJY29uLCB7IHdpZHRoOiAxOCwgaGVpZ2h0OiAxOCwgY29sb3I6IENPTE9SUy5jb250ZW50LnNlY29uZGFyeSB9KSwgX2pzeChJbnN0cnVjdGlvbklucHV0LCB7IHZhbHVlOiBpbnN0cnVjdGlvblRleHQsIHBsYWNlaG9sZGVyOiBcIkFkZCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdG8gcmVmaW5lIHlvdXIgbWVzc2FnZVwiLCBvbkNoYW5nZTogKGUpID0+IHNldEluc3RydWN0aW9uVGV4dChlLnRhcmdldC52YWx1ZSkgfSksIF9qc3hzKEluc3RydWN0aW9uQWN0aW9ucywgeyBjaGlsZHJlbjogW19qc3goSW5zdHJ1Y3Rpb25DYW5jZWwsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogXCJDYW5jZWxcIiB9KSksIF9qc3goSW5zdHJ1Y3Rpb25JbXByb3ZlLCBPYmplY3QuYXNzaWduKHsgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Ub0FwcGx5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvblRvQXBwbHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0QUlFdmVudCgnYWlfaW5zdHJ1Y3Rpb25fdXNlZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R5cGU6IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl90ZXh0OiBhbm9ueW1pemVJbnN0cnVjdGlvblRleHQoaW5zdHJ1Y3Rpb25Ub0FwcGx5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5zdHJ1Y3Rpb25UZXh0KCcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFLCBmYWxzZSwgaW5zdHJ1Y3Rpb25Ub0FwcGx5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkltcHJvdmVcIiB9KSldIH0pXSB9KSwgaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbnN0cnVjdGlvblN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0LCB7IGNoaWxkcmVuOiBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubWFwKChzdWdnZXN0aW9uKSA9PiAoX2pzeChJbnN0cnVjdGlvblN1Z2dlc3Rpb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBzZWxlY3RlZDogaW5zdHJ1Y3Rpb25UZXh0ID09PSBzdWdnZXN0aW9uLCBvbkNsaWNrOiAoKSA9PiBzZXRJbnN0cnVjdGlvblRleHQoc3VnZ2VzdGlvbikgfSwgeyBjaGlsZHJlbjogc3VnZ2VzdGlvbiB9KSwgc3VnZ2VzdGlvbikpKSB9KSkgOiBudWxsXSB9KSkgOiAoX2pzeChXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIHsgYWN0aW9uczogYWN0aW9ucywgcmVmOiB0ZXh0U3BhY2VSZWYsIG9uQWN0aW9uU2VsZWN0OiBvbkFjdGlvblNlbGVjdCwgUmlnaHRDb21wb25lbnQ6IFJpZ2h0Q29tcG9uZW50LCByaWdodEFjdGlvbnNEaXNhYmxlZDogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgb25FbW9qaUNsaWNrOiBvbkVtb2ppQWRkaXRpb24sIGFpQWN0aW9uczogYWlIZWFkZXJBY3Rpb25zLCBkaXNhYmxlQWxsQWN0aW9uczogc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uIHx8IGlzR2VuZXJhdGluZywgaW5zdHJ1Y3Rpb25BY3RpdmU6IGlzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIG9uQUlJbnN0cnVjdGlvbnNDbGljazogKCkgPT4gc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSh0cnVlKSwgb25BSVRvbmVDaGFuZ2U6IChhY3Rpb25UeXBlLCB0b25lSWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRvbmVCeUFjdGlvbigocHJldikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgW2FjdGlvblR5cGVdOiB0b25lSWQgfSkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQUlUb25lU2VsZWN0ID09PSBudWxsIHx8IG9uQUlUb25lU2VsZWN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVG9uZVNlbGVjdChhY3Rpb25UeXBlLCB0b25lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQUlBY3Rpb24oYWN0aW9uVHlwZSwgZmFsc2UsIHVuZGVmaW5lZCwgdG9uZUlkLCBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9uQUlBY3Rpb25DbGljazogKGFjdGlvblR5cGUsIGFjdGlvblZhcmlhbnQgPSBBSUFjdGlvblZhcmlhbnQuREVGQVVMVCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGluZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25BY3Rpb25UeXBlID09PSBhY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgYWN0aW9uIHNob3VsZCBub3QgcmV0cmlnZ2VyIGZyb20gY2hpcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnZW5lcmF0ZSBpcyBvbmx5IHZpYSBleHBsaWNpdCByZWdlbmVyYXRlIGNvbnRyb2wuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGFjdGlvbiBzdGFydHMgYSBmcmVzaCBzdWdnZXN0aW9uIHNlc3Npb24uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFjdGlvblZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0pKV0gfSkpXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */"));var RI;!function(I){I.LIKE="like",I.DISLIKE="dislike"}(RI||(RI={}));const HI=new J,BI={[D.BOLD]:"*",[D.ITALIC]:"_",[D.STRIKETHROUGH]:"~"};const JI=m.forwardRef(((I,b)=>{var{onChange:J,onClickVariable:m,text:D,RightComponent:O,error:P,limit:JI,onError:mI,rows:NI,actions:uI,editorInstanceKey:YI,editorSessionId:xI,templateType:FI="marketing",templateId:yI,requestExecutor:hI,baseUrl:aI,endpointPath:iI,useCase:pI,storeId:nI,apiAdapter:SI,conversationId:kI="whatsapp-template-editor",systemId:UI="whatsapp-writer",intent:vI="default",enabledAIActions:zI=[L.REPHRASE,L.SHORTEN,L.EXPAND,L.EMOJIFY],disableBuiltInAIActions:sI=!1,promptOverrides:QI,rephraseTones:wI,aiActionMinChars:oI,instructionSuggestions:tI=n,onAnalyticsEvent:jI,onAITagComputed:TI,prefillWasAiGenerated:DI=!1,editorHeader:LI,onAIToneSelect:eI,onAIActionRequest:KI,onBuildAIPrompt:OI,onBlur:EI}=I,PI=g(I,["onChange","onClickVariable","text","RightComponent","error","limit","onError","rows","actions","editorInstanceKey","editorSessionId","templateType","templateId","requestExecutor","baseUrl","endpointPath","useCase","storeId","apiAdapter","conversationId","systemId","intent","enabledAIActions","disableBuiltInAIActions","promptOverrides","rephraseTones","aiActionMinChars","instructionSuggestions","onAnalyticsEvent","onAITagComputed","prefillWasAiGenerated","editorHeader","onAIToneSelect","onAIActionRequest","onBuildAIPrompt","onBlur"]);const fI=N(null),[MI,rI]=u(D||""),[qI,_I]=u(!1),[$I,Ig]=u(0),[gg,Cg]=u(!1),[Ag,lg]=u(!1),[cg,bg]=u(""),[Zg,Gg]=u({}),[Xg,dg]=u(null),[Vg,Wg]=u([]),[Rg,Hg]=u(0),[Bg,Jg]=u(null),mg=N(null),Ng=N(null),ug=N(null),Yg=N(null),xg=N(null),Fg=N(null),yg=N(null),hg=N(!!DI),ag=N(null),ig=N(D||""),[pg,ng]=u({}),Sg=N(`mount-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`),kg=Y((()=>function(I){return`whatsapp-editor-rephrase-highlight-${I||"default"}`}(`${YI||"default"}-${xI||Sg.current}`)),[YI,xI]);x((()=>{hg.current=!!DI}),[DI,YI]),x((()=>{ig.current=DI&&D||""}),[DI,YI]);const Ug=Y((()=>S(FI,QI,wI)),[QI,wI,FI]),vg=Y((()=>{const I=cg.trim().toLowerCase();return I?tI.filter((g=>g.toLowerCase().includes(I))):[]}),[tI,cg]),zg=Y((()=>Object.assign(Object.assign({},k),oI||{})),[oI]),sg=zg[L.REPHRASE]||k[L.REPHRASE],Qg=F((I=>{const g=I.trim().replace(/\s+/g," ");if(!g)return"";const C=g.split(" ").length;return`[anonymized:length_${g.length}:words_${C}]`}),[]),wg=F(((I,g)=>{null==jI||jI(I,g)}),[jI]),og=F((I=>{rI((g=>g===I?g:I))}),[]),tg=F((I=>{if(Fg.current&&clearTimeout(Fg.current),I.length>1200)return null==J||J(I,I),void(Fg.current=setTimeout((()=>{null==J||J(I,HI.getHTML(I))}),16));null==J||J(I,HI.getHTML(I))}),[J]),jg=F((I=>{const g=ag.current,C=(null==g?void 0:g.acceptedText)||(DI?ig.current||MI:"");if(!C)return;if(I===C)return;const A=U({acceptedAiText:C,currentEditedText:I});null==TI||TI(Object.assign(Object.assign({},A),{source:"post_edit_debounce"}))}),[MI,TI,DI]),Tg=F((()=>{dg(null),Wg([]),Hg(0),Jg(null),ng({})}),[]),Dg=F((()=>{if(gg)return;if($I>=5)return;const I=$I+1;Ig(I),"undefined"!=typeof window&&YI&&sessionStorage.setItem(kg,String(I)),_I(!0),ug.current&&clearTimeout(ug.current),ug.current=setTimeout((()=>{_I(!1)}),1200)}),[YI,kg,gg,$I]),Lg=N(Dg);function eg(I){const g=null==fI?void 0:fI.current;null!=g&&(g.selectionStart?(g.focus(),g.selectionEnd=I):g.focus())}function Kg(I){var g,C;let A=null!==(C=null===(g=fI.current)||void 0===g?void 0:g.value)&&void 0!==C?C:"";if(fI.current&&I){const g=fI.current.selectionStart,C=fI.current.selectionEnd,l=I;if(g===C)return Og(l);{A=HI.wrappWildcard(g,C,l,A);const I=HI.getHTML(A);return og(A),{text:A,html:I}}}return{text:A,html:A}}function Og(I){var g,C;const A=null!==(C=null===(g=fI.current)||void 0===g?void 0:g.value)&&void 0!==C?C:"";if(fI.current&&I){const g=fI.current.selectionStart;if(g===fI.current.selectionEnd)return Eg(I,g)}return{text:A,html:A}}function Eg(I,g){var C,A;let l=null!==(A=null===(C=fI.current)||void 0===C?void 0:C.value)&&void 0!==A?A:"";l=l.slice(0,g)+I+l.slice(g);const c=HI.getHTML(l);return og(l),{text:l,html:c}}Lg.current=Dg,x((()=>{if("undefined"==typeof window||!YI)return;const I=Number(sessionStorage.getItem(kg)||"0");return Number.isNaN(I)||Ig(I),()=>{sessionStorage.removeItem(kg)}}),[YI,kg]),x((()=>{if(gg)return _I(!1),void(Ng.current&&(clearTimeout(Ng.current),Ng.current=null));const I=!!MI.trim()&&MI.length>=sg;if(null===xg.current)return xg.current=I,void(I&&(Ng.current=setTimeout((()=>{Lg.current()}),3e3)));if(!I)return xg.current=!1,_I(!1),void(Ng.current&&(clearTimeout(Ng.current),Ng.current=null));const g=!xg.current&&I;xg.current=!0,g&&Lg.current(),Ng.current&&clearTimeout(Ng.current),Ng.current=setTimeout((()=>{Lg.current()}),3e3)}),[MI,gg,sg]),x((()=>()=>{Ng.current&&clearTimeout(Ng.current),ug.current&&clearTimeout(ug.current),Fg.current&&clearTimeout(Fg.current),Yg.current&&clearTimeout(Yg.current)}),[]);const Pg=Vg[Rg]||"",fg=Y((()=>Bg&&Pg?`${Bg}-${Rg}-${Pg}`:null),[Pg,Bg,Rg]),Mg=!(!fg||!pg[fg]),rg=Y((()=>HI.getHTML(Xg||"")),[Xg]),qg=Y((()=>HI.getHTML(Pg)),[Pg]),_g=Vg.length<3,$g=!!Xg&&Vg.length>0,IC=Vg.length<=1||Rg<=0,gC=Vg.length<=1||Rg>=Vg.length-1;x((()=>{if(!$g)return;const I=mg.current;I&&(I.scrollTop=I.scrollHeight)}),[Pg,$g,gg]);const CC=F((function(I){let g=arguments.length>1&&void 0!==arguments[1]&&arguments[1],A=arguments.length>2?arguments[2]:void 0,l=arguments.length>3?arguments[3]:void 0,c=arguments.length>4&&void 0!==arguments[4]?arguments[4]:e.DEFAULT;return C(void 0,void 0,void 0,(function*(){var C;if(!(KI||SI||hI&&aI))return void(null==mI||mI("AI configuration missing"));if(!MI.trim())return;const b=zg[I]||k[I]||50;if(MI.length<b)return;if(gg)return;if(g&&!_g)return;const Z=Ug[I],G=I===L.REPHRASE&&"utility"===FI&&c===e.REPHRASE?Object.assign(Object.assign({},Z),{label:"Rephrase",basePrompt:"Rephrase this WhatsApp utility template to improve clarity and readability while preserving variables, intent, and compliance."}):Z,X=l||Zg[I],d=null===(C=G.tones)||void 0===C?void 0:C.find((I=>I.id===X)),V=void 0!==A?A:cg,W=(null==OI?void 0:OI({actionType:I,actionVariant:c,currentText:MI,templateType:FI,config:G,toneId:X,toneLabel:null==d?void 0:d.label,instructionText:V||void 0}))||z({config:G,currentText:MI,selectedToneId:X,instructionText:V});Cg(!0),wg("ai_action_triggered",{action_type:I,template_id:yI,template_category:FI});try{const C=KI?yield KI({actionType:I,actionVariant:c,currentText:MI,templateType:FI,toneId:X,toneLabel:null==d?void 0:d.label,instructionText:V||void 0,prompt:W}):yield s({apiAdapter:SI,requestExecutor:hI,baseUrl:aI,endpointPath:iI,prompt:W,intent:vI,conversationId:kI,systemId:UI,useCase:pI,storeId:nI}),A="string"==typeof C?C.trim():((null==C?void 0:C.body)||"").trim();if(!A)return;if(!g)return dg(MI),Jg(I),Wg([A]),void Hg(0);Wg((I=>{const g=[...I,A].slice(0,3);return Hg(g.length-1),g}))}catch(I){null==mI||mI("Failed to generate AI suggestion")}finally{Cg(!1)}}))}),[hI,aI,MI,gg,_g,Ug,Zg,cg,wg,yI,iI,SI,vI,kI,UI,pI,nI,FI,mI,zg,KI,OI]),AC=F((()=>{if(!Pg||!Xg||!Bg)return;og(Pg),tg(Pg),wg("ai_suggestion_accepted",{action_type:Bg,template_id:yI}),ag.current={acceptedText:Pg,baselineText:Xg,actionType:Bg,editedEventEmitted:!1};const I=hg.current,g=v({baselineText:Xg,acceptedText:Pg,initialAiPrefillPhase:I});I&&(hg.current=!1),null==TI||TI(Object.assign(Object.assign({},g),{source:"accept"})),Tg()}),[Pg,Xg,Bg,og,tg,wg,yI,TI,Tg]),lC=F((()=>{Bg&&(wg("ai_suggestion_discarded",{action_type:Bg,template_id:yI}),Tg())}),[Tg,wg,Bg,yI]),cC=F((I=>{Bg&&fg&&(pg[fg]||(ng((g=>Object.assign(Object.assign({},g),{[fg]:I}))),wg("ai_feedback_submitted",{action_type:Bg,template_id:yI,rating:I,candidate_index:Rg+1})))}),[fg,wg,pg,Bg,Rg,yI]),bC=Y((()=>sI?[]:zI.map((I=>{var g;const C=Ug[I],A=Zg[I];return{type:I,label:C.label,isPrimary:I===L.REPHRASE,loading:gg&&Bg===I,highlighted:I===L.REPHRASE&&qI,disabled:!MI.trim()||MI.length<(zg[I]||k[I]||50)||gg||$g&&Bg===I,showToneDropdown:I===L.REPHRASE&&!!(null===(g=C.tones)||void 0===g?void 0:g.length),tones:C.tones,selectedToneId:A}}))),[zI,sI,Ug,Zg,gg,Bg,$g,qI,MI,zg]);return y(b,(()=>({addTextOrWrap:Kg,addText:Og,get:()=>MI,setCaretPosition:eg})),[Kg,Og,MI]),x((()=>{void 0!==D&&og(D||"")}),[D,og]),x((()=>{if(!JI||!mI)return;const I=MI.length>JI?E:null!=P?P:"";yg.current!==I&&(yg.current=I,mI(I))}),[MI,P,JI,mI]),A(Q,{children:[A(w,{children:[l(o,{children:LI?l(i,Object.assign({"data-test":"body-text-for-edit-template"},{children:LI})):null}),A(t,{children:[P&&P!==E?A(c,{children:[l(W,{width:16,height:16,color:h.content.negative}),l(p,Object.assign({color:h.content.negative},{children:P}))]}):null,JI?A(p,Object.assign({style:{color:P===E||MI.length>JI?h.content.negative:h.content.secondary}},{children:[MI.length,"/",JI]})):null]})]}),A(j,Object.assign({isError:!!P},{children:[$g?A(r,Object.assign({ref:mg},{children:[l(q,{dangerouslySetInnerHTML:{__html:rg}}),l(_,gg?Object.assign({"aria-busy":"true"},{children:A($,{children:[l(M,{width:"96%"}),l(M,{width:"84%"}),l(M,{width:"68%"})]})}):{dangerouslySetInnerHTML:{__html:qg}}),A(II,{children:[A(gI,{children:[Rg+1,"/",Vg.length]}),l(CI,Object.assign({"aria-label":"Previous suggestion",type:"button",disabled:IC,onClick:()=>Hg((I=>Math.max(0,I-1)))},{children:l(G,{width:14,height:14})})),l(CI,Object.assign({"aria-label":"Next suggestion",type:"button",disabled:gC,onClick:()=>Hg((I=>Math.min(Vg.length-1,I+1)))},{children:l(X,{width:14,height:14})})),l(a,Object.assign({body:"Like",placement:"top"},{children:l(CI,Object.assign({"aria-label":"Like suggestion",type:"button",disabled:Mg,onClick:()=>cC(RI.LIKE)},{children:l(B,{width:14,height:14})}))})),l(a,Object.assign({body:"Dislike",placement:"top"},{children:l(CI,Object.assign({"aria-label":"Dislike suggestion",type:"button",disabled:Mg,onClick:()=>cC(RI.DISLIKE)},{children:l(H,{width:14,height:14})}))})),_g?l(a,Object.assign({body:gg?"Regenerating…":"Regenerate",placement:"top"},{children:l(AI,Object.assign({"aria-label":"Regenerate suggestion","aria-busy":gg,type:"button",disabled:gg,onClick:()=>{Bg&&CC(Bg,!0)}},{children:gg?l(lI,{"aria-hidden":!0}):l(R,{width:14,height:14})}))})):null,l(a,Object.assign({body:"Discard",placement:"top"},{children:l(CI,Object.assign({"aria-label":"Discard suggestion",type:"button",onClick:lC},{children:l(d,{width:14,height:14})}))})),l(a,Object.assign({body:"Accept",placement:"top"},{children:l(CI,Object.assign({"aria-label":"Accept suggestion",type:"button",onClick:AC},{children:l(Z,{width:14,height:14})}))}))]})]})):gg?A(f,{children:[l(M,{width:"96%"}),l(M,{width:"92%"}),l(M,{width:"88%"}),l(M,{width:"54%"})]}):l(T,Object.assign({ref:fI},PI,{value:MI,onChange:function(I){const g=I.target.value,C=ag.current;C&&!C.editedEventEmitted&&g!==C.acceptedText&&(ag.current=Object.assign(Object.assign({},C),{editedEventEmitted:!0}),wg("ai_suggestion_edited",{action_type:C.actionType,template_id:yI})),Yg.current&&(clearTimeout(Yg.current),Yg.current=null);const A=(null==C?void 0:C.acceptedText)||(DI?ig.current||MI:"");A&&g!==A&&(Yg.current=setTimeout((()=>{jg(g)}),1e3)),og(g),tg(g)},onBlur:I=>{Yg.current&&(clearTimeout(Yg.current),Yg.current=null),jg(I.target.value),null==EI||EI(I)},onPaste:I=>{var g,C,A;const l=I.clipboardData.getData("text");if(l.length>1200){I.preventDefault();const c=fI.current,b=null!==(g=null==c?void 0:c.selectionStart)&&void 0!==g?g:0,Z=null!==(C=null==c?void 0:c.selectionEnd)&&void 0!==C?C:b,G=null!==(A=null==c?void 0:c.value)&&void 0!==A?A:MI,X=G.slice(0,b)+l+G.slice(Z);og(X),tg(X);const d=b+l.length;requestAnimationFrame((()=>{const I=fI.current;if(I)try{I.setSelectionRange(d,d)}catch(I){}}))}},rows:NI})),Ag?A(cI,{children:[A(bI,{children:[l(V,{width:18,height:18,color:h.content.secondary}),l(ZI,{value:cg,placeholder:"Add specific instructions to refine your message",onChange:I=>bg(I.target.value)}),A(GI,{children:[l(XI,Object.assign({type:"button",onClick:()=>{bg(""),lg(!1)}},{children:"Cancel"})),l(dI,Object.assign({type:"button",onClick:()=>{const I=cg.trim();I&&wg("ai_instruction_used",{action_type:L.REPHRASE,template_id:yI,instruction_text:Qg(I)}),lg(!1),bg(""),CC(L.REPHRASE,!1,I)}},{children:"Improve"}))]})]}),cg.trim().length>0&&vg.length>0?l(VI,{children:vg.map((I=>l(WI,Object.assign({type:"button",selected:cg===I,onClick:()=>bg(I)},{children:I}),I)))}):null]}):l(K,{actions:uI,ref:fI,onActionSelect:function(I){const g=BI[I];if(g&&fI.current){const I=fI.current.selectionStart;if(I===fI.current.selectionEnd){const{text:C}=Eg(g,I);eg(I+1),tg(C)}else{const{text:I}=Kg(g);tg(I)}}},RightComponent:O,rightActionsDisabled:$g||gg,onEmojiClick:function(I){const{text:g}=Og(I);tg(g)},aiActions:bC,disableAllActions:$g||gg,instructionActive:Ag,onAIInstructionsClick:()=>lg(!0),onAIToneChange:(I,g)=>{Gg((C=>Object.assign(Object.assign({},C),{[I]:g}))),null==eI||eI(I,g),I===L.REPHRASE&&CC(I,!1,void 0,g,e.DEFAULT)},onAIActionClick:function(I){let g=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e.DEFAULT;if(!gg){if($g){if(Bg===I)return;return Tg(),void CC(I,!1,void 0,void 0,g)}CC(I,!1,void 0,void 0,g)}}})]}))]})}));JI.displayName="WhatsAppTextEditor";export{JI as WhatsAppTextEditor};
|