@bikdotai/bik-component-library 0.0.777-beta.0 → 0.0.777-beta.10

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.
Files changed (53) hide show
  1. package/dist/cjs/assets/icons/magic-line.svg.js +1 -0
  2. package/dist/cjs/assets/icons/rewind.svg.js +1 -0
  3. package/dist/cjs/assets/icons/thumbs_down.svg.js +1 -0
  4. package/dist/cjs/assets/icons/thumbs_up.svg.js +1 -0
  5. package/dist/cjs/components/WhatsAppTextEditor/AIRephrase.styled.d.ts +10 -0
  6. package/dist/cjs/components/WhatsAppTextEditor/AIRephrase.styled.js +1 -0
  7. package/dist/cjs/components/WhatsAppTextEditor/AIRephraseButton.d.ts +17 -0
  8. package/dist/cjs/components/WhatsAppTextEditor/AIRephraseButton.js +1 -0
  9. package/dist/cjs/components/WhatsAppTextEditor/BorderAnimation.d.ts +11 -0
  10. package/dist/cjs/components/WhatsAppTextEditor/BorderAnimation.js +1 -0
  11. package/dist/cjs/components/WhatsAppTextEditor/CustomEditor.styled.d.ts +13 -0
  12. package/dist/cjs/components/WhatsAppTextEditor/CustomEditor.styled.js +1 -1
  13. package/dist/cjs/components/WhatsAppTextEditor/WhatsAppTextEditor.d.ts +118 -3
  14. package/dist/cjs/components/WhatsAppTextEditor/WhatsAppTextEditor.js +5 -1
  15. package/dist/cjs/components/WhatsAppTextEditor/WhatsAppTextEditorHeader.d.ts +42 -1
  16. package/dist/cjs/components/WhatsAppTextEditor/WhatsAppTextEditorHeader.js +1 -1
  17. package/dist/cjs/components/WhatsAppTextEditor/ai/actionRegistry.d.ts +14 -0
  18. package/dist/cjs/components/WhatsAppTextEditor/ai/actionRegistry.js +1 -0
  19. package/dist/cjs/components/WhatsAppTextEditor/ai/aiTag.d.ts +42 -0
  20. package/dist/cjs/components/WhatsAppTextEditor/ai/aiTag.js +1 -0
  21. package/dist/cjs/components/WhatsAppTextEditor/ai/api.d.ts +22 -0
  22. package/dist/cjs/components/WhatsAppTextEditor/ai/api.js +1 -0
  23. package/dist/cjs/components/radioButton/RadioButton.d.ts +1 -1
  24. package/dist/cjs/components/radioButton/RadioButton.js +1 -1
  25. package/dist/cjs/helpers/BaseWhatsappContentLang.helper.js +1 -1
  26. package/dist/cjs/index.js +1 -1
  27. package/dist/esm/assets/icons/magic-line.svg.js +1 -0
  28. package/dist/esm/assets/icons/rewind.svg.js +1 -0
  29. package/dist/esm/assets/icons/thumbs_down.svg.js +1 -0
  30. package/dist/esm/assets/icons/thumbs_up.svg.js +1 -0
  31. package/dist/esm/components/WhatsAppTextEditor/AIRephrase.styled.d.ts +10 -0
  32. package/dist/esm/components/WhatsAppTextEditor/AIRephrase.styled.js +1 -0
  33. package/dist/esm/components/WhatsAppTextEditor/AIRephraseButton.d.ts +17 -0
  34. package/dist/esm/components/WhatsAppTextEditor/AIRephraseButton.js +1 -0
  35. package/dist/esm/components/WhatsAppTextEditor/BorderAnimation.d.ts +11 -0
  36. package/dist/esm/components/WhatsAppTextEditor/BorderAnimation.js +1 -0
  37. package/dist/esm/components/WhatsAppTextEditor/CustomEditor.styled.d.ts +13 -0
  38. package/dist/esm/components/WhatsAppTextEditor/CustomEditor.styled.js +1 -1
  39. package/dist/esm/components/WhatsAppTextEditor/WhatsAppTextEditor.d.ts +118 -3
  40. package/dist/esm/components/WhatsAppTextEditor/WhatsAppTextEditor.js +5 -1
  41. package/dist/esm/components/WhatsAppTextEditor/WhatsAppTextEditorHeader.d.ts +42 -1
  42. package/dist/esm/components/WhatsAppTextEditor/WhatsAppTextEditorHeader.js +1 -1
  43. package/dist/esm/components/WhatsAppTextEditor/ai/actionRegistry.d.ts +14 -0
  44. package/dist/esm/components/WhatsAppTextEditor/ai/actionRegistry.js +1 -0
  45. package/dist/esm/components/WhatsAppTextEditor/ai/aiTag.d.ts +42 -0
  46. package/dist/esm/components/WhatsAppTextEditor/ai/aiTag.js +1 -0
  47. package/dist/esm/components/WhatsAppTextEditor/ai/api.d.ts +22 -0
  48. package/dist/esm/components/WhatsAppTextEditor/ai/api.js +1 -0
  49. package/dist/esm/components/radioButton/RadioButton.d.ts +1 -1
  50. package/dist/esm/components/radioButton/RadioButton.js +1 -1
  51. package/dist/esm/helpers/BaseWhatsappContentLang.helper.js +1 -1
  52. package/dist/esm/index.js +1 -1
  53. package/package.json +1 -1
@@ -1 +1,5 @@
1
- import{__rest as t}from"../../_virtual/_tslib.js";import{jsxs as n,jsx as e,Fragment as r}from"react/jsx-runtime";import l from"../../assets/icons/info.svg.js";import{BaseWhatsappContentLangHelper as o}from"../../helpers/BaseWhatsappContentLang.helper.js";import i,{useRef as c,useImperativeHandle as u,useEffect as s}from"react";import{COLORS as a}from"../../constants/Theme.js";import{BodyCaption as d}from"../TypographyStyle.js";import{OuterContainer as v,Container as m,TextSpace as h}from"./CustomEditor.styled.js";import{EditorActionTypes as f,WhatsAppTextEditorHeader as g}from"./WhatsAppTextEditorHeader.js";const p="Character limit reached",x=new o,j={[f.BOLD]:"*",[f.ITALIC]:"_",[f.STRIKETHROUGH]:"~"},C=i.forwardRef(((o,i)=>{var f,C,{onChange:T,onClickVariable:E,text:y,RightComponent:b,error:O,limit:w,onError:H,rows:L,actions:S}=o,R=t(o,["onChange","onClickVariable","text","RightComponent","error","limit","onError","rows","actions"]);const W=c(null);function A(t){const n=null==W?void 0:W.current;null!=n&&(n.selectionStart?(n.focus(),n.selectionEnd=t):n.focus())}function I(t){var n,e;let r=null!==(e=null===(n=W.current)||void 0===n?void 0:n.value)&&void 0!==e?e:"";if(W.current&&t){const n=W.current.selectionStart,e=W.current.selectionEnd,l=t;if(n===e)return M(l);{r=x.wrappWildcard(n,e,l,r);const t=x.getHTML(r);return W.current.value=r,{text:r,html:t}}}return{text:r,html:r}}function M(t){var n,e;let r=null!==(e=null===(n=W.current)||void 0===n?void 0:n.value)&&void 0!==e?e:"";if(W.current&&t){const n=W.current.selectionStart;if(n===W.current.selectionEnd)return k(t,n)}return{text:r,html:r}}function k(t,n){var e,r;let l=null!==(r=null===(e=W.current)||void 0===e?void 0:e.value)&&void 0!==r?r:"";l=l.slice(0,n)+t+l.slice(n);const o=x.getHTML(l);return W.current.value=l,{text:l,html:o}}return u(i,(()=>({addTextOrWrap:I,addText:M,get(){var t,n;return null!==(n=null===(t=W.current)||void 0===t?void 0:t.value)&&void 0!==n?n:""},setCaretPosition:A}))),s((()=>{if(null==W?void 0:W.current){W.current.value=y||"";const t=x.getHTML(y||"");null==T||T(y||"",t)}}),[y]),s((()=>{var t,n;(null===(t=null==W?void 0:W.current)||void 0===t?void 0:t.value)&&w&&((null===(n=null==W?void 0:W.current)||void 0===n?void 0:n.value.length)>w?null==H||H(p):null==H||H(null!=O?O:""))}),[null===(f=null==W?void 0:W.current)||void 0===f?void 0:f.value.length]),n(v,{children:[n(m,Object.assign({isError:!!O},{children:[e(g,{actions:S,ref:W,onActionSelect:function(t){if((null==j?void 0:j[t])&&W.current){const n=W.current.selectionStart;if(n===W.current.selectionEnd){k(null==j?void 0:j[t],n);const{text:e,html:r}=k(null==j?void 0:j[t],n);A(n+1),null==T||T(e,r)}else{const{text:n,html:e}=I(null==j?void 0:j[t]);null==T||T(n,e)}}},RightComponent:b,onEmojiClick:function(t){const{text:n,html:e}=M(t);null==T||T(n,e)}}),e(h,Object.assign({ref:W,onChange:function(t){const n=t.target.value,e=x.getHTML(n);null==T||T(n,e)}},R,{rows:L}))]})),O&&O!==p?n("div",Object.assign({style:{display:"flex",gap:6,alignItems:"center"}},{children:[e(l,{width:16,height:16,color:a.content.negative}),e(d,Object.assign({color:a.content.negative},{children:O}))]})):e(r,{children:w&&(null==W?void 0:W.current)?n(d,Object.assign({style:{color:O===p||(null===(C=null==W?void 0:W.current)||void 0===C?void 0:C.value.length)>w?a.content.negative:a.content.secondary}},{children:[W.current.value.length,"/",w]})):e(r,{})})]})}));C.displayName="WhatsAppTextEditor";export{C as WhatsAppTextEditor};
1
+ import I from"@emotion/styled/base";import{__rest as g,__awaiter as C}from"../../_virtual/_tslib.js";import{jsxs as A,jsx as c,Fragment as l}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 u,{useRef as N,useState as m,useEffect as x,useMemo as y,useCallback as F,useImperativeHandle as Y}from"react";import{COLORS as a}from"../../constants/Theme.js";import{Tooltip as h}from"../tooltips/Tooltip.js";import{TitleSmall as i,BodyCaption as p}from"../TypographyStyle.js";import{DEFAULT_INSTRUCTION_SUGGESTIONS as n,resolveActionPrompts as U,DEFAULT_AI_ACTION_MIN_CHARS as k}from"./ai/actionRegistry.js";import{computeAiTagOnAccept as S}from"./ai/aiTag.js";export{AI_TAG_CHANGE_RATIO_THRESHOLD,computeAiTagOnAccept,levenshteinDistance}from"./ai/aiTag.js";import{buildActionPrompt as s,requestAISuggestion as v}from"./ai/api.js";import{OuterContainer as z,Container as Q,TextSpace as w,EditorFooterRow as o,EditorFooterTitle as t,EditorFooterRight as j}from"./CustomEditor.styled.js";import{EditorActionTypes as T,AIEditorActionTypes as D,AIActionVariant as e,WhatsAppTextEditorHeader as L}from"./WhatsAppTextEditorHeader.js";function K(){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 O="Character limit reached",P=b`
2
+ 0% { opacity: 0.55; }
3
+ 50% { opacity: 1; }
4
+ 100% { opacity: 0.55; }
5
+ `,E=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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBa0MyQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMsIEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG5pbXBvcnQgeyBidWlsZEFjdGlvblByb21wdCwgcmVxdWVzdEFJU3VnZ2VzdGlvbiB9IGZyb20gJy4vYWkvYXBpJztcclxuaW1wb3J0IHsgQ29udGFpbmVyLCBFZGl0b3JGb290ZXJSaWdodCwgRWRpdG9yRm9vdGVyUm93LCBFZGl0b3JGb290ZXJUaXRsZSwgT3V0ZXJDb250YWluZXIsIFRleHRTcGFjZSwgfSBmcm9tICcuL0N1c3RvbUVkaXRvci5zdHlsZWQnO1xyXG5pbXBvcnQgeyBBSUFjdGlvblZhcmlhbnQsIEFJRWRpdG9yQWN0aW9uVHlwZXMsIEVkaXRvckFjdGlvblR5cGVzLCBXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIH0gZnJvbSAnLi9XaGF0c0FwcFRleHRFZGl0b3JIZWFkZXInO1xyXG5jb25zdCBMSU1JVF9SRUFDSEVEID0gJ0NoYXJhY3RlciBsaW1pdCByZWFjaGVkJztcclxuY29uc3QgUkVQSFJBU0VfSURMRV9NUyA9IDMwMDA7XHJcbmNvbnN0IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTID0gNTtcclxuY29uc3QgTUFYX1NVR0dFU1RJT05TID0gMztcclxuY29uc3QgTEFSR0VfSU5QVVRfVEhSRVNIT0xEID0gMTIwMDtcclxuY29uc3QgVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgPSAnUmVwaHJhc2UgdGhpcyBXaGF0c0FwcCB1dGlsaXR5IHRlbXBsYXRlIHRvIGltcHJvdmUgY2xhcml0eSBhbmQgcmVhZGFiaWxpdHkgd2hpbGUgcHJlc2VydmluZyB2YXJpYWJsZXMsIGludGVudCwgYW5kIGNvbXBsaWFuY2UuJztcclxuY29uc3Qgc2tlbGV0b25QdWxzZSA9IGtleWZyYW1lcyBgXG5cdDAlIHsgb3BhY2l0eTogMC41NTsgfVxuXHQ1MCUgeyBvcGFjaXR5OiAxOyB9XG5cdDEwMCUgeyBvcGFjaXR5OiAwLjU1OyB9XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxNHB4IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogMTBweDtcblx0bWluLWhlaWdodDogMTUwcHg7XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkxpbmUgPSBzdHlsZWQuZGl2IGBcblx0aGVpZ2h0OiAxNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdHdpZHRoOiAkeyhwcm9wcykgPT4gcHJvcHMud2lkdGh9O1xuXHRiYWNrZ3JvdW5kOiAjZWNlY2VmO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25TZXNzaW9uQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG5cdHBhZGRpbmc6IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHRtYXgtaGVpZ2h0OiAyNjBweDtcblx0b3ZlcmZsb3cteTogc2Nyb2xsO1xuXHRzY3JvbGxiYXItd2lkdGg6IHRoaW47XG5cdHNjcm9sbGJhci1jb2xvcjogI2M4YzhjZiB0cmFuc3BhcmVudDtcblx0Ojotd2Via2l0LXNjcm9sbGJhciB7XG5cdFx0d2lkdGg6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcblx0XHRiYWNrZ3JvdW5kOiAjYzhjOGNmO1xuXHRcdGJvcmRlci1yYWRpdXM6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcblx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0fVxuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHR0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0ID0gc3R5bGVkLmRpdiBgXG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHR3aWR0aDogMTAwJTtcblx0bWluLWhlaWdodDogNDBweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db250cm9sc1JvdyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDZweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db3VudGVyID0gc3R5bGVkLnNwYW4gYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0Zm9udC1zaXplOiAxNHB4O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkljb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0Ym9yZGVyOiAwO1xuXHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0cGFkZGluZzogNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0Y3Vyc29yOiBwb2ludGVyO1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0dHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjEycyBlYXNlO1xuXHQ6bm90KDpkaXNhYmxlZCk6aG92ZXIge1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICR7Q09MT1JTLnN1cmZhY2UuaG92ZXJlZH07XG5cdH1cblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAwLjM1O1xuXHRcdGN1cnNvcjogbm90LWFsbG93ZWQ7XG5cdH1cbmA7XHJcbi8qKiBSZWdlbmVyYXRlIHN0YXlzIGZ1bGwgb3BhY2l0eSB3aGlsZSBkaXNhYmxlZCBzbyB0aGUgbG9hZGluZyBzaGltbWVyIHN0YXlzIHZpc2libGUgKHNhbWUgcHVsc2UgYXMgZWRpdG9yIHNrZWxldG9uKS4gKi9cclxuY29uc3QgU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24gPSBzdHlsZWQoU3VnZ2VzdGlvbkljb25CdXR0b24pIGBcblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAxO1xuXHRcdGN1cnNvcjogd2FpdDtcblx0fVxuYDtcclxuY29uc3QgUmVnZW5lcmF0ZUljb25TaGltbWVyID0gc3R5bGVkLmRpdiBgXG5cdHdpZHRoOiAxNHB4O1xuXHRoZWlnaHQ6IDE0cHg7XG5cdGJvcmRlci1yYWRpdXM6IDRweDtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0ZmxleC1zaHJpbms6IDA7XG5cdGFuaW1hdGlvbjogJHtza2VsZXRvblB1bHNlfSAxLjFzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuYDtcclxuLyoqIFNhbWUgYm90dG9tIHRvb2xiYXIgc2xvdCBhcyBgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyYCDigJQgcmVwbGFjZXMgdGhlIGZ1bGwgaWNvbi9BSSBwYW5lbCB3aGlsZSBvcGVuLiAqL1xyXG5jb25zdCBJbnN0cnVjdGlvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0cGFkZGluZzogOHB4IDEycHg7XG5cdGdhcDogMTBweDtcblx0Ym9yZGVyLXJhZGl1czogMCAwIDRweCA0cHg7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW5wdXRSb3cgPSBzdHlsZWQuZGl2IGBcblx0Ym9yZGVyOiAxcHggc29saWQgI2Y1YTRjMDtcblx0Ym9yZGVyLXJhZGl1czogMTBweDtcblx0cGFkZGluZzogOHB4IDEwcHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0ID0gc3R5bGVkLmlucHV0IGBcblx0ZmxleDogMTtcblx0bWluLXdpZHRoOiAwO1xuXHRib3JkZXI6IDA7XG5cdG91dGxpbmU6IG5vbmU7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25BY3Rpb25zID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQ2FuY2VsID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0Zm9udC13ZWlnaHQ6IDUwMDtcblx0cGFkZGluZzogMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbXByb3ZlID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICM1ZDNhNzI7XG5cdGNvbG9yOiAjNWQzYTcyO1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym9yZGVyLXJhZGl1czogOHB4O1xuXHRwYWRkaW5nOiA4cHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4xO1xuXHRmb250LXdlaWdodDogNjAwO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0ID0gc3R5bGVkLmRpdiBgXG5cdG1hcmdpbi10b3A6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDEycHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuXHRib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiA9IHN0eWxlZC5idXR0b24gYFxuXHR3aWR0aDogMTAwJTtcblx0Ym9yZGVyOiAwO1xuXHRib3JkZXItdG9wOiAxcHggc29saWQgJHtDT0xPUlMuc3Ryb2tlLnByaW1hcnl9O1xuXHRiYWNrZ3JvdW5kOiAkeyhwcm9wcykgPT4gKHByb3BzLnNlbGVjdGVkID8gJyNlNWYzZTgnIDogJ3RyYW5zcGFyZW50Jyl9O1xuXHRjb2xvcjogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjMWU2YjM0JyA6IENPTE9SUy5jb250ZW50LnByaW1hcnkpfTtcblx0dGV4dC1hbGlnbjogbGVmdDtcblx0cGFkZGluZzogMTJweCAxNHB4O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGxpbmUtaGVpZ2h0OiAxLjI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0OmZpcnN0LW9mLXR5cGUge1xuXHRcdGJvcmRlci10b3A6IDA7XG5cdH1cbmA7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgdGVtcGxhdGVUeXBlID0gJ21hcmtldGluZycsIHRlbXBsYXRlSWQsIHJlcXVlc3RFeGVjdXRvciwgYmFzZVVybCwgZW5kcG9pbnRQYXRoLCB1c2VDYXNlLCBzdG9yZUlkLCBhcGlBZGFwdGVyLCBjb252ZXJzYXRpb25JZCA9ICd3aGF0c2FwcC10ZW1wbGF0ZS1lZGl0b3InLCBzeXN0ZW1JZCA9ICd3aGF0c2FwcC13cml0ZXInLCBpbnRlbnQgPSAnZGVmYXVsdCcsIGVuYWJsZWRBSUFjdGlvbnMgPSBbXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlNIT1JURU4sXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FWFBBTkQsXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FTU9KSUZZLFxyXG4gICAgXSwgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMgPSBmYWxzZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCBhaUFjdGlvbk1pbkNoYXJzLCBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gREVGQVVMVF9JTlNUUlVDVElPTl9TVUdHRVNUSU9OUywgb25BSUV2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFJRXZlbnRcIiwgXCJvbkFJVGFnQ29tcHV0ZWRcIiwgXCJwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcIiwgXCJlZGl0b3JIZWFkZXJcIiwgXCJvbkFJVG9uZVNlbGVjdFwiLCBcIm9uQUlBY3Rpb25SZXF1ZXN0XCIsIFwib25CdWlsZEFJUHJvbXB0XCJdKTtcclxuICAgIGNvbnN0IHRleHRTcGFjZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IFtjdXJyZW50VGV4dCwgc2V0Q3VycmVudFRleHRdID0gdXNlU3RhdGUoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbaXNSZXBocmFzZUhpZ2hsaWdodGVkLCBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW3JlcGhyYXNlSGlnaGxpZ2h0Q291bnQsIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnRdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbaXNHZW5lcmF0aW5nLCBzZXRJc0dlbmVyYXRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2lzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2luc3RydWN0aW9uVGV4dCwgc2V0SW5zdHJ1Y3Rpb25UZXh0XSA9IHVzZVN0YXRlKCcnKTtcclxuICAgIGNvbnN0IFt0b25lQnlBY3Rpb24sIHNldFRvbmVCeUFjdGlvbl0gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkJhc2VUZXh0LCBzZXRTdWdnZXN0aW9uQmFzZVRleHRdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkNhbmRpZGF0ZXMsIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzXSA9IHVzZVN0YXRlKFtdKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uSW5kZXgsIHNldFN1Z2dlc3Rpb25JbmRleF0gPSB1c2VTdGF0ZSgwKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGVdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uU2Nyb2xsUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgcmVwaHJhc2VJZGxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgaGlnaGxpZ2h0UmVzZXRSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gISFwcmVmaWxsV2FzQWlHZW5lcmF0ZWQ7XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgY29uc3QgYWN0aXZlQWN0aW9uUHJvbXB0cyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlQWN0aW9uUHJvbXB0cyh0ZW1wbGF0ZVR5cGUsIHByb21wdE92ZXJyaWRlcywgcmVwaHJhc2VUb25lcyk7XHJcbiAgICB9LCBbcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCB0ZW1wbGF0ZVR5cGVdKTtcclxuICAgIGNvbnN0IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmICghcXVlcnkpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5maWx0ZXIoKHN1Z2dlc3Rpb24pID0+IHN1Z2dlc3Rpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkpO1xyXG4gICAgfSwgW2luc3RydWN0aW9uU3VnZ2VzdGlvbnMsIGluc3RydWN0aW9uVGV4dF0pO1xyXG4gICAgY29uc3QgbWluQ2hhcnNCeUFjdGlvbiA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSUyksIChhaUFjdGlvbk1pbkNoYXJzIHx8IHt9KSk7XHJcbiAgICB9LCBbYWlBY3Rpb25NaW5DaGFyc10pO1xyXG4gICAgY29uc3QgcmVwaHJhc2VNaW5DaGFycyA9IG1pbkNoYXJzQnlBY3Rpb25bQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV0gfHxcclxuICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV07XHJcbiAgICBjb25zdCBlbWl0QUlFdmVudCA9IHVzZUNhbGxiYWNrKChuYW1lLCBwYXlsb2FkKSA9PiB7XHJcbiAgICAgICAgb25BSUV2ZW50ID09PSBudWxsIHx8IG9uQUlFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSUV2ZW50KG5hbWUsIHBheWxvYWQpO1xyXG4gICAgfSwgW29uQUlFdmVudF0pO1xyXG4gICAgY29uc3Qgc2V0RWRpdG9yVGV4dCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIHNldEN1cnJlbnRUZXh0KChwcmV2KSA9PiAocHJldiA9PT0gbmV4dFRleHQgPyBwcmV2IDogbmV4dFRleHQpKTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGVtaXRDaGFuZ2VXaXRoR3VhcmQgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlZmVycmVkSHRtbFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5leHRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIG5leHRUZXh0KTtcclxuICAgICAgICAgICAgZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChuZXh0VGV4dCkpO1xyXG4gICAgICAgICAgICB9LCAxNik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICB9LCBbb25DaGFuZ2VdKTtcclxuICAgIGNvbnN0IGNsZWFyU3VnZ2VzdGlvblNlc3Npb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0KG51bGwpO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtdKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUobnVsbCk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgPj0gTUFYX1JFUEhSQVNFX0hJR0hMSUdIVFMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuZXh0Q291bnQgPSByZXBocmFzZUhpZ2hsaWdodENvdW50ICsgMTtcclxuICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KG5leHRDb3VudCk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIGVkaXRvckluc3RhbmNlS2V5KSB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oZ2V0SGlnaGxpZ2h0U3RvcmFnZUtleShlZGl0b3JJbnN0YW5jZUtleSksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCByZXBocmFzZUhpZ2hsaWdodENvdW50XSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpKSB8fFxyXG4gICAgICAgICAgICAnMCcpO1xyXG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGNhY2hlZCkpIHtcclxuICAgICAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChjYWNoZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBlbGlnaWJsZSA9ICEhY3VycmVudFRleHQudHJpbSgpICYmIGN1cnJlbnRUZXh0Lmxlbmd0aCA+PSByZXBocmFzZU1pbkNoYXJzO1xyXG4gICAgICAgIGlmIChwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBlbGlnaWJsZTtcclxuICAgICAgICAgICAgaWYgKGVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjcm9zc2VkVGhyZXNob2xkID0gIXByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgJiYgZWxpZ2libGU7XHJcbiAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IHRydWU7XHJcbiAgICAgICAgaWYgKGNyb3NzZWRUaHJlc2hvbGQpIHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzW3N1Z2dlc3Rpb25JbmRleF0gfHwgJyc7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2IsIF9jLCBfZDtcclxuICAgICAgICBpZiAoIW9uQUlBY3Rpb25SZXF1ZXN0ICYmXHJcbiAgICAgICAgICAgICFhcGlBZGFwdGVyICYmXHJcbiAgICAgICAgICAgICghcmVxdWVzdEV4ZWN1dG9yIHx8ICFiYXNlVXJsKSkge1xyXG4gICAgICAgICAgICBvbkVycm9yID09PSBudWxsIHx8IG9uRXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRXJyb3IoJ0FJIGNvbmZpZ3VyYXRpb24gbWlzc2luZycpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY3VycmVudFRleHQudHJpbSgpKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbWluQ2hhcnNGb3JBY3Rpb24gPSBtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICA1MDtcclxuICAgICAgICBpZiAoY3VycmVudFRleHQubGVuZ3RoIDwgbWluQ2hhcnNGb3JBY3Rpb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKHJlZ2VuZXJhdGVFeGlzdGluZyAmJiAhY2FuUmVnZW5lcmF0ZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGJhc2VDb25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlID09PSAndXRpbGl0eScgJiZcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCA9PT0gQUlBY3Rpb25WYXJpYW50LlJFUEhSQVNFXHJcbiAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiYXNlQ29uZmlnKSwgeyBsYWJlbDogJ1JlcGhyYXNlJywgYmFzZVByb21wdDogVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgfSkgOiBiYXNlQ29uZmlnO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVG9uZUlkID0gdG9uZU92ZXJyaWRlSWQgfHxcclxuICAgICAgICAgICAgdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIGNvbmZpZy5kZWZhdWx0VG9uZUlkIHx8XHJcbiAgICAgICAgICAgICgoX2MgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYlswXSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmlkKTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2QgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGluSW5pdGlhbEFpUGhhc2UgPSBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudDtcclxuICAgICAgICBjb25zdCB0YWdQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25BY2NlcHQoe1xyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWNjZXB0ZWRUZXh0OiBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZTogaW5Jbml0aWFsQWlQaGFzZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoaW5Jbml0aWFsQWlQaGFzZSkge1xyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkFJVGFnQ29tcHV0ZWQgPT09IG51bGwgfHwgb25BSVRhZ0NvbXB1dGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVGFnQ29tcHV0ZWQodGFnUGF5bG9hZCk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCBzdWdnZXN0aW9uSW5kZXgsIHRlbXBsYXRlSWRdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgY29uc3QgYWN0aW9uQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgY29uc3QgdG9uZUlkID0gdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25Db25maWcuZGVmYXVsdFRvbmVJZCB8fFxyXG4gICAgICAgICAgICAgICAgKChfYiA9IChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWzBdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWQpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBhY3Rpb25Db25maWcubGFiZWwsXHJcbiAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBpc0dlbmVyYXRpbmcgJiYgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRlZDogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhY3VycmVudFRleHQudHJpbSgpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQubGVuZ3RoIDxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgNTApIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmF0aW5nIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSksXHJcbiAgICAgICAgICAgICAgICBzaG93VG9uZURyb3Bkb3duOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgISEoKF9jID0gYWN0aW9uQ29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubGVuZ3RoKSxcclxuICAgICAgICAgICAgICAgIHRvbmVzOiBhY3Rpb25Db25maWcudG9uZXMsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZDogdG9uZUlkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVuYWJsZWRBSUFjdGlvbnMsXHJcbiAgICAgICAgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMsXHJcbiAgICAgICAgYWN0aXZlQWN0aW9uUHJvbXB0cyxcclxuICAgICAgICB0b25lQnlBY3Rpb24sXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbixcclxuICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgIF0pO1xyXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBhZGRUZXh0T3JXcmFwLFxyXG4gICAgICAgICAgICBhZGRUZXh0LFxyXG4gICAgICAgICAgICBnZXQoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24sXHJcbiAgICAgICAgfTtcclxuICAgIH0sIFthZGRUZXh0T3JXcmFwLCBhZGRUZXh0LCBjdXJyZW50VGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChpbnB1dFZhbHVlIHx8ICcnKTtcclxuICAgIH0sIFtpbnB1dFZhbHVlLCBzZXRFZGl0b3JUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghbGltaXQgfHwgIW9uRXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBuZXh0RXJyb3IgPSBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdCA/IExJTUlUX1JFQUNIRUQgOiBlcnJvciAhPT0gbnVsbCAmJiBlcnJvciAhPT0gdm9pZCAwID8gZXJyb3IgOiAnJztcclxuICAgICAgICBpZiAobGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID09PSBuZXh0RXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPSBuZXh0RXJyb3I7XHJcbiAgICAgICAgb25FcnJvcihuZXh0RXJyb3IpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBlcnJvciwgbGltaXQsIG9uRXJyb3JdKTtcclxuICAgIHJldHVybiAoX2pzeHMoT3V0ZXJDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4gaGFuZGxlRmVlZGJhY2soJ2xpa2UnKSB9LCB7IGNoaWxkcmVuOiBfanN4KFRodW1ic1VwSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNsaWtlXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzbGlrZSBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKCdkaXNsaWtlJykgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSksIF9qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */",toString:K}),f=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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBeUNzQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMsIEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG5pbXBvcnQgeyBidWlsZEFjdGlvblByb21wdCwgcmVxdWVzdEFJU3VnZ2VzdGlvbiB9IGZyb20gJy4vYWkvYXBpJztcclxuaW1wb3J0IHsgQ29udGFpbmVyLCBFZGl0b3JGb290ZXJSaWdodCwgRWRpdG9yRm9vdGVyUm93LCBFZGl0b3JGb290ZXJUaXRsZSwgT3V0ZXJDb250YWluZXIsIFRleHRTcGFjZSwgfSBmcm9tICcuL0N1c3RvbUVkaXRvci5zdHlsZWQnO1xyXG5pbXBvcnQgeyBBSUFjdGlvblZhcmlhbnQsIEFJRWRpdG9yQWN0aW9uVHlwZXMsIEVkaXRvckFjdGlvblR5cGVzLCBXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIH0gZnJvbSAnLi9XaGF0c0FwcFRleHRFZGl0b3JIZWFkZXInO1xyXG5jb25zdCBMSU1JVF9SRUFDSEVEID0gJ0NoYXJhY3RlciBsaW1pdCByZWFjaGVkJztcclxuY29uc3QgUkVQSFJBU0VfSURMRV9NUyA9IDMwMDA7XHJcbmNvbnN0IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTID0gNTtcclxuY29uc3QgTUFYX1NVR0dFU1RJT05TID0gMztcclxuY29uc3QgTEFSR0VfSU5QVVRfVEhSRVNIT0xEID0gMTIwMDtcclxuY29uc3QgVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgPSAnUmVwaHJhc2UgdGhpcyBXaGF0c0FwcCB1dGlsaXR5IHRlbXBsYXRlIHRvIGltcHJvdmUgY2xhcml0eSBhbmQgcmVhZGFiaWxpdHkgd2hpbGUgcHJlc2VydmluZyB2YXJpYWJsZXMsIGludGVudCwgYW5kIGNvbXBsaWFuY2UuJztcclxuY29uc3Qgc2tlbGV0b25QdWxzZSA9IGtleWZyYW1lcyBgXG5cdDAlIHsgb3BhY2l0eTogMC41NTsgfVxuXHQ1MCUgeyBvcGFjaXR5OiAxOyB9XG5cdDEwMCUgeyBvcGFjaXR5OiAwLjU1OyB9XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxNHB4IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogMTBweDtcblx0bWluLWhlaWdodDogMTUwcHg7XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkxpbmUgPSBzdHlsZWQuZGl2IGBcblx0aGVpZ2h0OiAxNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdHdpZHRoOiAkeyhwcm9wcykgPT4gcHJvcHMud2lkdGh9O1xuXHRiYWNrZ3JvdW5kOiAjZWNlY2VmO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25TZXNzaW9uQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG5cdHBhZGRpbmc6IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHRtYXgtaGVpZ2h0OiAyNjBweDtcblx0b3ZlcmZsb3cteTogc2Nyb2xsO1xuXHRzY3JvbGxiYXItd2lkdGg6IHRoaW47XG5cdHNjcm9sbGJhci1jb2xvcjogI2M4YzhjZiB0cmFuc3BhcmVudDtcblx0Ojotd2Via2l0LXNjcm9sbGJhciB7XG5cdFx0d2lkdGg6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcblx0XHRiYWNrZ3JvdW5kOiAjYzhjOGNmO1xuXHRcdGJvcmRlci1yYWRpdXM6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcblx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0fVxuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHR0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0ID0gc3R5bGVkLmRpdiBgXG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHR3aWR0aDogMTAwJTtcblx0bWluLWhlaWdodDogNDBweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db250cm9sc1JvdyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDZweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db3VudGVyID0gc3R5bGVkLnNwYW4gYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0Zm9udC1zaXplOiAxNHB4O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkljb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0Ym9yZGVyOiAwO1xuXHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0cGFkZGluZzogNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0Y3Vyc29yOiBwb2ludGVyO1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0dHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjEycyBlYXNlO1xuXHQ6bm90KDpkaXNhYmxlZCk6aG92ZXIge1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICR7Q09MT1JTLnN1cmZhY2UuaG92ZXJlZH07XG5cdH1cblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAwLjM1O1xuXHRcdGN1cnNvcjogbm90LWFsbG93ZWQ7XG5cdH1cbmA7XHJcbi8qKiBSZWdlbmVyYXRlIHN0YXlzIGZ1bGwgb3BhY2l0eSB3aGlsZSBkaXNhYmxlZCBzbyB0aGUgbG9hZGluZyBzaGltbWVyIHN0YXlzIHZpc2libGUgKHNhbWUgcHVsc2UgYXMgZWRpdG9yIHNrZWxldG9uKS4gKi9cclxuY29uc3QgU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24gPSBzdHlsZWQoU3VnZ2VzdGlvbkljb25CdXR0b24pIGBcblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAxO1xuXHRcdGN1cnNvcjogd2FpdDtcblx0fVxuYDtcclxuY29uc3QgUmVnZW5lcmF0ZUljb25TaGltbWVyID0gc3R5bGVkLmRpdiBgXG5cdHdpZHRoOiAxNHB4O1xuXHRoZWlnaHQ6IDE0cHg7XG5cdGJvcmRlci1yYWRpdXM6IDRweDtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0ZmxleC1zaHJpbms6IDA7XG5cdGFuaW1hdGlvbjogJHtza2VsZXRvblB1bHNlfSAxLjFzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuYDtcclxuLyoqIFNhbWUgYm90dG9tIHRvb2xiYXIgc2xvdCBhcyBgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyYCDigJQgcmVwbGFjZXMgdGhlIGZ1bGwgaWNvbi9BSSBwYW5lbCB3aGlsZSBvcGVuLiAqL1xyXG5jb25zdCBJbnN0cnVjdGlvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0cGFkZGluZzogOHB4IDEycHg7XG5cdGdhcDogMTBweDtcblx0Ym9yZGVyLXJhZGl1czogMCAwIDRweCA0cHg7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW5wdXRSb3cgPSBzdHlsZWQuZGl2IGBcblx0Ym9yZGVyOiAxcHggc29saWQgI2Y1YTRjMDtcblx0Ym9yZGVyLXJhZGl1czogMTBweDtcblx0cGFkZGluZzogOHB4IDEwcHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0ID0gc3R5bGVkLmlucHV0IGBcblx0ZmxleDogMTtcblx0bWluLXdpZHRoOiAwO1xuXHRib3JkZXI6IDA7XG5cdG91dGxpbmU6IG5vbmU7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25BY3Rpb25zID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQ2FuY2VsID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0Zm9udC13ZWlnaHQ6IDUwMDtcblx0cGFkZGluZzogMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbXByb3ZlID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICM1ZDNhNzI7XG5cdGNvbG9yOiAjNWQzYTcyO1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym9yZGVyLXJhZGl1czogOHB4O1xuXHRwYWRkaW5nOiA4cHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4xO1xuXHRmb250LXdlaWdodDogNjAwO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0ID0gc3R5bGVkLmRpdiBgXG5cdG1hcmdpbi10b3A6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDEycHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuXHRib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiA9IHN0eWxlZC5idXR0b24gYFxuXHR3aWR0aDogMTAwJTtcblx0Ym9yZGVyOiAwO1xuXHRib3JkZXItdG9wOiAxcHggc29saWQgJHtDT0xPUlMuc3Ryb2tlLnByaW1hcnl9O1xuXHRiYWNrZ3JvdW5kOiAkeyhwcm9wcykgPT4gKHByb3BzLnNlbGVjdGVkID8gJyNlNWYzZTgnIDogJ3RyYW5zcGFyZW50Jyl9O1xuXHRjb2xvcjogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjMWU2YjM0JyA6IENPTE9SUy5jb250ZW50LnByaW1hcnkpfTtcblx0dGV4dC1hbGlnbjogbGVmdDtcblx0cGFkZGluZzogMTJweCAxNHB4O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGxpbmUtaGVpZ2h0OiAxLjI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0OmZpcnN0LW9mLXR5cGUge1xuXHRcdGJvcmRlci10b3A6IDA7XG5cdH1cbmA7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgdGVtcGxhdGVUeXBlID0gJ21hcmtldGluZycsIHRlbXBsYXRlSWQsIHJlcXVlc3RFeGVjdXRvciwgYmFzZVVybCwgZW5kcG9pbnRQYXRoLCB1c2VDYXNlLCBzdG9yZUlkLCBhcGlBZGFwdGVyLCBjb252ZXJzYXRpb25JZCA9ICd3aGF0c2FwcC10ZW1wbGF0ZS1lZGl0b3InLCBzeXN0ZW1JZCA9ICd3aGF0c2FwcC13cml0ZXInLCBpbnRlbnQgPSAnZGVmYXVsdCcsIGVuYWJsZWRBSUFjdGlvbnMgPSBbXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlNIT1JURU4sXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FWFBBTkQsXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FTU9KSUZZLFxyXG4gICAgXSwgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMgPSBmYWxzZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCBhaUFjdGlvbk1pbkNoYXJzLCBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gREVGQVVMVF9JTlNUUlVDVElPTl9TVUdHRVNUSU9OUywgb25BSUV2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFJRXZlbnRcIiwgXCJvbkFJVGFnQ29tcHV0ZWRcIiwgXCJwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcIiwgXCJlZGl0b3JIZWFkZXJcIiwgXCJvbkFJVG9uZVNlbGVjdFwiLCBcIm9uQUlBY3Rpb25SZXF1ZXN0XCIsIFwib25CdWlsZEFJUHJvbXB0XCJdKTtcclxuICAgIGNvbnN0IHRleHRTcGFjZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IFtjdXJyZW50VGV4dCwgc2V0Q3VycmVudFRleHRdID0gdXNlU3RhdGUoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbaXNSZXBocmFzZUhpZ2hsaWdodGVkLCBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW3JlcGhyYXNlSGlnaGxpZ2h0Q291bnQsIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnRdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbaXNHZW5lcmF0aW5nLCBzZXRJc0dlbmVyYXRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2lzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2luc3RydWN0aW9uVGV4dCwgc2V0SW5zdHJ1Y3Rpb25UZXh0XSA9IHVzZVN0YXRlKCcnKTtcclxuICAgIGNvbnN0IFt0b25lQnlBY3Rpb24sIHNldFRvbmVCeUFjdGlvbl0gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkJhc2VUZXh0LCBzZXRTdWdnZXN0aW9uQmFzZVRleHRdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkNhbmRpZGF0ZXMsIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzXSA9IHVzZVN0YXRlKFtdKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uSW5kZXgsIHNldFN1Z2dlc3Rpb25JbmRleF0gPSB1c2VTdGF0ZSgwKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGVdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uU2Nyb2xsUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgcmVwaHJhc2VJZGxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgaGlnaGxpZ2h0UmVzZXRSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gISFwcmVmaWxsV2FzQWlHZW5lcmF0ZWQ7XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgY29uc3QgYWN0aXZlQWN0aW9uUHJvbXB0cyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlQWN0aW9uUHJvbXB0cyh0ZW1wbGF0ZVR5cGUsIHByb21wdE92ZXJyaWRlcywgcmVwaHJhc2VUb25lcyk7XHJcbiAgICB9LCBbcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCB0ZW1wbGF0ZVR5cGVdKTtcclxuICAgIGNvbnN0IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmICghcXVlcnkpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5maWx0ZXIoKHN1Z2dlc3Rpb24pID0+IHN1Z2dlc3Rpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkpO1xyXG4gICAgfSwgW2luc3RydWN0aW9uU3VnZ2VzdGlvbnMsIGluc3RydWN0aW9uVGV4dF0pO1xyXG4gICAgY29uc3QgbWluQ2hhcnNCeUFjdGlvbiA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSUyksIChhaUFjdGlvbk1pbkNoYXJzIHx8IHt9KSk7XHJcbiAgICB9LCBbYWlBY3Rpb25NaW5DaGFyc10pO1xyXG4gICAgY29uc3QgcmVwaHJhc2VNaW5DaGFycyA9IG1pbkNoYXJzQnlBY3Rpb25bQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV0gfHxcclxuICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV07XHJcbiAgICBjb25zdCBlbWl0QUlFdmVudCA9IHVzZUNhbGxiYWNrKChuYW1lLCBwYXlsb2FkKSA9PiB7XHJcbiAgICAgICAgb25BSUV2ZW50ID09PSBudWxsIHx8IG9uQUlFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSUV2ZW50KG5hbWUsIHBheWxvYWQpO1xyXG4gICAgfSwgW29uQUlFdmVudF0pO1xyXG4gICAgY29uc3Qgc2V0RWRpdG9yVGV4dCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIHNldEN1cnJlbnRUZXh0KChwcmV2KSA9PiAocHJldiA9PT0gbmV4dFRleHQgPyBwcmV2IDogbmV4dFRleHQpKTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGVtaXRDaGFuZ2VXaXRoR3VhcmQgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlZmVycmVkSHRtbFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5leHRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIG5leHRUZXh0KTtcclxuICAgICAgICAgICAgZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChuZXh0VGV4dCkpO1xyXG4gICAgICAgICAgICB9LCAxNik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICB9LCBbb25DaGFuZ2VdKTtcclxuICAgIGNvbnN0IGNsZWFyU3VnZ2VzdGlvblNlc3Npb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0KG51bGwpO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtdKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUobnVsbCk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgPj0gTUFYX1JFUEhSQVNFX0hJR0hMSUdIVFMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuZXh0Q291bnQgPSByZXBocmFzZUhpZ2hsaWdodENvdW50ICsgMTtcclxuICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KG5leHRDb3VudCk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIGVkaXRvckluc3RhbmNlS2V5KSB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oZ2V0SGlnaGxpZ2h0U3RvcmFnZUtleShlZGl0b3JJbnN0YW5jZUtleSksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCByZXBocmFzZUhpZ2hsaWdodENvdW50XSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpKSB8fFxyXG4gICAgICAgICAgICAnMCcpO1xyXG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGNhY2hlZCkpIHtcclxuICAgICAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChjYWNoZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBlbGlnaWJsZSA9ICEhY3VycmVudFRleHQudHJpbSgpICYmIGN1cnJlbnRUZXh0Lmxlbmd0aCA+PSByZXBocmFzZU1pbkNoYXJzO1xyXG4gICAgICAgIGlmIChwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBlbGlnaWJsZTtcclxuICAgICAgICAgICAgaWYgKGVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjcm9zc2VkVGhyZXNob2xkID0gIXByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgJiYgZWxpZ2libGU7XHJcbiAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IHRydWU7XHJcbiAgICAgICAgaWYgKGNyb3NzZWRUaHJlc2hvbGQpIHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzW3N1Z2dlc3Rpb25JbmRleF0gfHwgJyc7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2IsIF9jLCBfZDtcclxuICAgICAgICBpZiAoIW9uQUlBY3Rpb25SZXF1ZXN0ICYmXHJcbiAgICAgICAgICAgICFhcGlBZGFwdGVyICYmXHJcbiAgICAgICAgICAgICghcmVxdWVzdEV4ZWN1dG9yIHx8ICFiYXNlVXJsKSkge1xyXG4gICAgICAgICAgICBvbkVycm9yID09PSBudWxsIHx8IG9uRXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRXJyb3IoJ0FJIGNvbmZpZ3VyYXRpb24gbWlzc2luZycpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY3VycmVudFRleHQudHJpbSgpKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbWluQ2hhcnNGb3JBY3Rpb24gPSBtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICA1MDtcclxuICAgICAgICBpZiAoY3VycmVudFRleHQubGVuZ3RoIDwgbWluQ2hhcnNGb3JBY3Rpb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKHJlZ2VuZXJhdGVFeGlzdGluZyAmJiAhY2FuUmVnZW5lcmF0ZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGJhc2VDb25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlID09PSAndXRpbGl0eScgJiZcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCA9PT0gQUlBY3Rpb25WYXJpYW50LlJFUEhSQVNFXHJcbiAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiYXNlQ29uZmlnKSwgeyBsYWJlbDogJ1JlcGhyYXNlJywgYmFzZVByb21wdDogVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgfSkgOiBiYXNlQ29uZmlnO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVG9uZUlkID0gdG9uZU92ZXJyaWRlSWQgfHxcclxuICAgICAgICAgICAgdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIGNvbmZpZy5kZWZhdWx0VG9uZUlkIHx8XHJcbiAgICAgICAgICAgICgoX2MgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYlswXSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmlkKTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2QgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGluSW5pdGlhbEFpUGhhc2UgPSBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudDtcclxuICAgICAgICBjb25zdCB0YWdQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25BY2NlcHQoe1xyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWNjZXB0ZWRUZXh0OiBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZTogaW5Jbml0aWFsQWlQaGFzZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoaW5Jbml0aWFsQWlQaGFzZSkge1xyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkFJVGFnQ29tcHV0ZWQgPT09IG51bGwgfHwgb25BSVRhZ0NvbXB1dGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVGFnQ29tcHV0ZWQodGFnUGF5bG9hZCk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCBzdWdnZXN0aW9uSW5kZXgsIHRlbXBsYXRlSWRdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgY29uc3QgYWN0aW9uQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgY29uc3QgdG9uZUlkID0gdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25Db25maWcuZGVmYXVsdFRvbmVJZCB8fFxyXG4gICAgICAgICAgICAgICAgKChfYiA9IChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWzBdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWQpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBhY3Rpb25Db25maWcubGFiZWwsXHJcbiAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBpc0dlbmVyYXRpbmcgJiYgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRlZDogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhY3VycmVudFRleHQudHJpbSgpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQubGVuZ3RoIDxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgNTApIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmF0aW5nIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSksXHJcbiAgICAgICAgICAgICAgICBzaG93VG9uZURyb3Bkb3duOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgISEoKF9jID0gYWN0aW9uQ29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubGVuZ3RoKSxcclxuICAgICAgICAgICAgICAgIHRvbmVzOiBhY3Rpb25Db25maWcudG9uZXMsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZDogdG9uZUlkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVuYWJsZWRBSUFjdGlvbnMsXHJcbiAgICAgICAgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMsXHJcbiAgICAgICAgYWN0aXZlQWN0aW9uUHJvbXB0cyxcclxuICAgICAgICB0b25lQnlBY3Rpb24sXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbixcclxuICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgIF0pO1xyXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBhZGRUZXh0T3JXcmFwLFxyXG4gICAgICAgICAgICBhZGRUZXh0LFxyXG4gICAgICAgICAgICBnZXQoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24sXHJcbiAgICAgICAgfTtcclxuICAgIH0sIFthZGRUZXh0T3JXcmFwLCBhZGRUZXh0LCBjdXJyZW50VGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChpbnB1dFZhbHVlIHx8ICcnKTtcclxuICAgIH0sIFtpbnB1dFZhbHVlLCBzZXRFZGl0b3JUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghbGltaXQgfHwgIW9uRXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBuZXh0RXJyb3IgPSBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdCA/IExJTUlUX1JFQUNIRUQgOiBlcnJvciAhPT0gbnVsbCAmJiBlcnJvciAhPT0gdm9pZCAwID8gZXJyb3IgOiAnJztcclxuICAgICAgICBpZiAobGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID09PSBuZXh0RXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPSBuZXh0RXJyb3I7XHJcbiAgICAgICAgb25FcnJvcihuZXh0RXJyb3IpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBlcnJvciwgbGltaXQsIG9uRXJyb3JdKTtcclxuICAgIHJldHVybiAoX2pzeHMoT3V0ZXJDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4gaGFuZGxlRmVlZGJhY2soJ2xpa2UnKSB9LCB7IGNoaWxkcmVuOiBfanN4KFRodW1ic1VwSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNsaWtlXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzbGlrZSBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKCdkaXNsaWtlJykgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSksIF9qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),M=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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZ0Q4QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMsIEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG5pbXBvcnQgeyBidWlsZEFjdGlvblByb21wdCwgcmVxdWVzdEFJU3VnZ2VzdGlvbiB9IGZyb20gJy4vYWkvYXBpJztcclxuaW1wb3J0IHsgQ29udGFpbmVyLCBFZGl0b3JGb290ZXJSaWdodCwgRWRpdG9yRm9vdGVyUm93LCBFZGl0b3JGb290ZXJUaXRsZSwgT3V0ZXJDb250YWluZXIsIFRleHRTcGFjZSwgfSBmcm9tICcuL0N1c3RvbUVkaXRvci5zdHlsZWQnO1xyXG5pbXBvcnQgeyBBSUFjdGlvblZhcmlhbnQsIEFJRWRpdG9yQWN0aW9uVHlwZXMsIEVkaXRvckFjdGlvblR5cGVzLCBXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIH0gZnJvbSAnLi9XaGF0c0FwcFRleHRFZGl0b3JIZWFkZXInO1xyXG5jb25zdCBMSU1JVF9SRUFDSEVEID0gJ0NoYXJhY3RlciBsaW1pdCByZWFjaGVkJztcclxuY29uc3QgUkVQSFJBU0VfSURMRV9NUyA9IDMwMDA7XHJcbmNvbnN0IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTID0gNTtcclxuY29uc3QgTUFYX1NVR0dFU1RJT05TID0gMztcclxuY29uc3QgTEFSR0VfSU5QVVRfVEhSRVNIT0xEID0gMTIwMDtcclxuY29uc3QgVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgPSAnUmVwaHJhc2UgdGhpcyBXaGF0c0FwcCB1dGlsaXR5IHRlbXBsYXRlIHRvIGltcHJvdmUgY2xhcml0eSBhbmQgcmVhZGFiaWxpdHkgd2hpbGUgcHJlc2VydmluZyB2YXJpYWJsZXMsIGludGVudCwgYW5kIGNvbXBsaWFuY2UuJztcclxuY29uc3Qgc2tlbGV0b25QdWxzZSA9IGtleWZyYW1lcyBgXG5cdDAlIHsgb3BhY2l0eTogMC41NTsgfVxuXHQ1MCUgeyBvcGFjaXR5OiAxOyB9XG5cdDEwMCUgeyBvcGFjaXR5OiAwLjU1OyB9XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxNHB4IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogMTBweDtcblx0bWluLWhlaWdodDogMTUwcHg7XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkxpbmUgPSBzdHlsZWQuZGl2IGBcblx0aGVpZ2h0OiAxNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdHdpZHRoOiAkeyhwcm9wcykgPT4gcHJvcHMud2lkdGh9O1xuXHRiYWNrZ3JvdW5kOiAjZWNlY2VmO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25TZXNzaW9uQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG5cdHBhZGRpbmc6IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHRtYXgtaGVpZ2h0OiAyNjBweDtcblx0b3ZlcmZsb3cteTogc2Nyb2xsO1xuXHRzY3JvbGxiYXItd2lkdGg6IHRoaW47XG5cdHNjcm9sbGJhci1jb2xvcjogI2M4YzhjZiB0cmFuc3BhcmVudDtcblx0Ojotd2Via2l0LXNjcm9sbGJhciB7XG5cdFx0d2lkdGg6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcblx0XHRiYWNrZ3JvdW5kOiAjYzhjOGNmO1xuXHRcdGJvcmRlci1yYWRpdXM6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcblx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0fVxuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHR0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0ID0gc3R5bGVkLmRpdiBgXG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHR3aWR0aDogMTAwJTtcblx0bWluLWhlaWdodDogNDBweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db250cm9sc1JvdyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDZweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db3VudGVyID0gc3R5bGVkLnNwYW4gYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0Zm9udC1zaXplOiAxNHB4O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkljb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0Ym9yZGVyOiAwO1xuXHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0cGFkZGluZzogNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0Y3Vyc29yOiBwb2ludGVyO1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0dHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjEycyBlYXNlO1xuXHQ6bm90KDpkaXNhYmxlZCk6aG92ZXIge1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICR7Q09MT1JTLnN1cmZhY2UuaG92ZXJlZH07XG5cdH1cblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAwLjM1O1xuXHRcdGN1cnNvcjogbm90LWFsbG93ZWQ7XG5cdH1cbmA7XHJcbi8qKiBSZWdlbmVyYXRlIHN0YXlzIGZ1bGwgb3BhY2l0eSB3aGlsZSBkaXNhYmxlZCBzbyB0aGUgbG9hZGluZyBzaGltbWVyIHN0YXlzIHZpc2libGUgKHNhbWUgcHVsc2UgYXMgZWRpdG9yIHNrZWxldG9uKS4gKi9cclxuY29uc3QgU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24gPSBzdHlsZWQoU3VnZ2VzdGlvbkljb25CdXR0b24pIGBcblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAxO1xuXHRcdGN1cnNvcjogd2FpdDtcblx0fVxuYDtcclxuY29uc3QgUmVnZW5lcmF0ZUljb25TaGltbWVyID0gc3R5bGVkLmRpdiBgXG5cdHdpZHRoOiAxNHB4O1xuXHRoZWlnaHQ6IDE0cHg7XG5cdGJvcmRlci1yYWRpdXM6IDRweDtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0ZmxleC1zaHJpbms6IDA7XG5cdGFuaW1hdGlvbjogJHtza2VsZXRvblB1bHNlfSAxLjFzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuYDtcclxuLyoqIFNhbWUgYm90dG9tIHRvb2xiYXIgc2xvdCBhcyBgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyYCDigJQgcmVwbGFjZXMgdGhlIGZ1bGwgaWNvbi9BSSBwYW5lbCB3aGlsZSBvcGVuLiAqL1xyXG5jb25zdCBJbnN0cnVjdGlvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0cGFkZGluZzogOHB4IDEycHg7XG5cdGdhcDogMTBweDtcblx0Ym9yZGVyLXJhZGl1czogMCAwIDRweCA0cHg7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW5wdXRSb3cgPSBzdHlsZWQuZGl2IGBcblx0Ym9yZGVyOiAxcHggc29saWQgI2Y1YTRjMDtcblx0Ym9yZGVyLXJhZGl1czogMTBweDtcblx0cGFkZGluZzogOHB4IDEwcHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0ID0gc3R5bGVkLmlucHV0IGBcblx0ZmxleDogMTtcblx0bWluLXdpZHRoOiAwO1xuXHRib3JkZXI6IDA7XG5cdG91dGxpbmU6IG5vbmU7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25BY3Rpb25zID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQ2FuY2VsID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0Zm9udC13ZWlnaHQ6IDUwMDtcblx0cGFkZGluZzogMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbXByb3ZlID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICM1ZDNhNzI7XG5cdGNvbG9yOiAjNWQzYTcyO1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym9yZGVyLXJhZGl1czogOHB4O1xuXHRwYWRkaW5nOiA4cHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4xO1xuXHRmb250LXdlaWdodDogNjAwO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0ID0gc3R5bGVkLmRpdiBgXG5cdG1hcmdpbi10b3A6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDEycHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuXHRib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiA9IHN0eWxlZC5idXR0b24gYFxuXHR3aWR0aDogMTAwJTtcblx0Ym9yZGVyOiAwO1xuXHRib3JkZXItdG9wOiAxcHggc29saWQgJHtDT0xPUlMuc3Ryb2tlLnByaW1hcnl9O1xuXHRiYWNrZ3JvdW5kOiAkeyhwcm9wcykgPT4gKHByb3BzLnNlbGVjdGVkID8gJyNlNWYzZTgnIDogJ3RyYW5zcGFyZW50Jyl9O1xuXHRjb2xvcjogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjMWU2YjM0JyA6IENPTE9SUy5jb250ZW50LnByaW1hcnkpfTtcblx0dGV4dC1hbGlnbjogbGVmdDtcblx0cGFkZGluZzogMTJweCAxNHB4O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGxpbmUtaGVpZ2h0OiAxLjI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0OmZpcnN0LW9mLXR5cGUge1xuXHRcdGJvcmRlci10b3A6IDA7XG5cdH1cbmA7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgdGVtcGxhdGVUeXBlID0gJ21hcmtldGluZycsIHRlbXBsYXRlSWQsIHJlcXVlc3RFeGVjdXRvciwgYmFzZVVybCwgZW5kcG9pbnRQYXRoLCB1c2VDYXNlLCBzdG9yZUlkLCBhcGlBZGFwdGVyLCBjb252ZXJzYXRpb25JZCA9ICd3aGF0c2FwcC10ZW1wbGF0ZS1lZGl0b3InLCBzeXN0ZW1JZCA9ICd3aGF0c2FwcC13cml0ZXInLCBpbnRlbnQgPSAnZGVmYXVsdCcsIGVuYWJsZWRBSUFjdGlvbnMgPSBbXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlNIT1JURU4sXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FWFBBTkQsXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FTU9KSUZZLFxyXG4gICAgXSwgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMgPSBmYWxzZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCBhaUFjdGlvbk1pbkNoYXJzLCBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gREVGQVVMVF9JTlNUUlVDVElPTl9TVUdHRVNUSU9OUywgb25BSUV2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFJRXZlbnRcIiwgXCJvbkFJVGFnQ29tcHV0ZWRcIiwgXCJwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcIiwgXCJlZGl0b3JIZWFkZXJcIiwgXCJvbkFJVG9uZVNlbGVjdFwiLCBcIm9uQUlBY3Rpb25SZXF1ZXN0XCIsIFwib25CdWlsZEFJUHJvbXB0XCJdKTtcclxuICAgIGNvbnN0IHRleHRTcGFjZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IFtjdXJyZW50VGV4dCwgc2V0Q3VycmVudFRleHRdID0gdXNlU3RhdGUoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbaXNSZXBocmFzZUhpZ2hsaWdodGVkLCBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW3JlcGhyYXNlSGlnaGxpZ2h0Q291bnQsIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnRdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbaXNHZW5lcmF0aW5nLCBzZXRJc0dlbmVyYXRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2lzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2luc3RydWN0aW9uVGV4dCwgc2V0SW5zdHJ1Y3Rpb25UZXh0XSA9IHVzZVN0YXRlKCcnKTtcclxuICAgIGNvbnN0IFt0b25lQnlBY3Rpb24sIHNldFRvbmVCeUFjdGlvbl0gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkJhc2VUZXh0LCBzZXRTdWdnZXN0aW9uQmFzZVRleHRdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkNhbmRpZGF0ZXMsIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzXSA9IHVzZVN0YXRlKFtdKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uSW5kZXgsIHNldFN1Z2dlc3Rpb25JbmRleF0gPSB1c2VTdGF0ZSgwKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGVdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uU2Nyb2xsUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgcmVwaHJhc2VJZGxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgaGlnaGxpZ2h0UmVzZXRSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gISFwcmVmaWxsV2FzQWlHZW5lcmF0ZWQ7XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgY29uc3QgYWN0aXZlQWN0aW9uUHJvbXB0cyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlQWN0aW9uUHJvbXB0cyh0ZW1wbGF0ZVR5cGUsIHByb21wdE92ZXJyaWRlcywgcmVwaHJhc2VUb25lcyk7XHJcbiAgICB9LCBbcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCB0ZW1wbGF0ZVR5cGVdKTtcclxuICAgIGNvbnN0IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmICghcXVlcnkpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5maWx0ZXIoKHN1Z2dlc3Rpb24pID0+IHN1Z2dlc3Rpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkpO1xyXG4gICAgfSwgW2luc3RydWN0aW9uU3VnZ2VzdGlvbnMsIGluc3RydWN0aW9uVGV4dF0pO1xyXG4gICAgY29uc3QgbWluQ2hhcnNCeUFjdGlvbiA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSUyksIChhaUFjdGlvbk1pbkNoYXJzIHx8IHt9KSk7XHJcbiAgICB9LCBbYWlBY3Rpb25NaW5DaGFyc10pO1xyXG4gICAgY29uc3QgcmVwaHJhc2VNaW5DaGFycyA9IG1pbkNoYXJzQnlBY3Rpb25bQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV0gfHxcclxuICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV07XHJcbiAgICBjb25zdCBlbWl0QUlFdmVudCA9IHVzZUNhbGxiYWNrKChuYW1lLCBwYXlsb2FkKSA9PiB7XHJcbiAgICAgICAgb25BSUV2ZW50ID09PSBudWxsIHx8IG9uQUlFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSUV2ZW50KG5hbWUsIHBheWxvYWQpO1xyXG4gICAgfSwgW29uQUlFdmVudF0pO1xyXG4gICAgY29uc3Qgc2V0RWRpdG9yVGV4dCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIHNldEN1cnJlbnRUZXh0KChwcmV2KSA9PiAocHJldiA9PT0gbmV4dFRleHQgPyBwcmV2IDogbmV4dFRleHQpKTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGVtaXRDaGFuZ2VXaXRoR3VhcmQgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlZmVycmVkSHRtbFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5leHRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIG5leHRUZXh0KTtcclxuICAgICAgICAgICAgZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChuZXh0VGV4dCkpO1xyXG4gICAgICAgICAgICB9LCAxNik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICB9LCBbb25DaGFuZ2VdKTtcclxuICAgIGNvbnN0IGNsZWFyU3VnZ2VzdGlvblNlc3Npb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0KG51bGwpO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtdKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUobnVsbCk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgPj0gTUFYX1JFUEhSQVNFX0hJR0hMSUdIVFMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuZXh0Q291bnQgPSByZXBocmFzZUhpZ2hsaWdodENvdW50ICsgMTtcclxuICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KG5leHRDb3VudCk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIGVkaXRvckluc3RhbmNlS2V5KSB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oZ2V0SGlnaGxpZ2h0U3RvcmFnZUtleShlZGl0b3JJbnN0YW5jZUtleSksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCByZXBocmFzZUhpZ2hsaWdodENvdW50XSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpKSB8fFxyXG4gICAgICAgICAgICAnMCcpO1xyXG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGNhY2hlZCkpIHtcclxuICAgICAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChjYWNoZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBlbGlnaWJsZSA9ICEhY3VycmVudFRleHQudHJpbSgpICYmIGN1cnJlbnRUZXh0Lmxlbmd0aCA+PSByZXBocmFzZU1pbkNoYXJzO1xyXG4gICAgICAgIGlmIChwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBlbGlnaWJsZTtcclxuICAgICAgICAgICAgaWYgKGVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjcm9zc2VkVGhyZXNob2xkID0gIXByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgJiYgZWxpZ2libGU7XHJcbiAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IHRydWU7XHJcbiAgICAgICAgaWYgKGNyb3NzZWRUaHJlc2hvbGQpIHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzW3N1Z2dlc3Rpb25JbmRleF0gfHwgJyc7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2IsIF9jLCBfZDtcclxuICAgICAgICBpZiAoIW9uQUlBY3Rpb25SZXF1ZXN0ICYmXHJcbiAgICAgICAgICAgICFhcGlBZGFwdGVyICYmXHJcbiAgICAgICAgICAgICghcmVxdWVzdEV4ZWN1dG9yIHx8ICFiYXNlVXJsKSkge1xyXG4gICAgICAgICAgICBvbkVycm9yID09PSBudWxsIHx8IG9uRXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRXJyb3IoJ0FJIGNvbmZpZ3VyYXRpb24gbWlzc2luZycpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY3VycmVudFRleHQudHJpbSgpKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbWluQ2hhcnNGb3JBY3Rpb24gPSBtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICA1MDtcclxuICAgICAgICBpZiAoY3VycmVudFRleHQubGVuZ3RoIDwgbWluQ2hhcnNGb3JBY3Rpb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKHJlZ2VuZXJhdGVFeGlzdGluZyAmJiAhY2FuUmVnZW5lcmF0ZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGJhc2VDb25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlID09PSAndXRpbGl0eScgJiZcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCA9PT0gQUlBY3Rpb25WYXJpYW50LlJFUEhSQVNFXHJcbiAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiYXNlQ29uZmlnKSwgeyBsYWJlbDogJ1JlcGhyYXNlJywgYmFzZVByb21wdDogVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgfSkgOiBiYXNlQ29uZmlnO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVG9uZUlkID0gdG9uZU92ZXJyaWRlSWQgfHxcclxuICAgICAgICAgICAgdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIGNvbmZpZy5kZWZhdWx0VG9uZUlkIHx8XHJcbiAgICAgICAgICAgICgoX2MgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYlswXSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmlkKTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2QgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGluSW5pdGlhbEFpUGhhc2UgPSBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudDtcclxuICAgICAgICBjb25zdCB0YWdQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25BY2NlcHQoe1xyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWNjZXB0ZWRUZXh0OiBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZTogaW5Jbml0aWFsQWlQaGFzZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoaW5Jbml0aWFsQWlQaGFzZSkge1xyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkFJVGFnQ29tcHV0ZWQgPT09IG51bGwgfHwgb25BSVRhZ0NvbXB1dGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVGFnQ29tcHV0ZWQodGFnUGF5bG9hZCk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCBzdWdnZXN0aW9uSW5kZXgsIHRlbXBsYXRlSWRdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgY29uc3QgYWN0aW9uQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgY29uc3QgdG9uZUlkID0gdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25Db25maWcuZGVmYXVsdFRvbmVJZCB8fFxyXG4gICAgICAgICAgICAgICAgKChfYiA9IChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWzBdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWQpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBhY3Rpb25Db25maWcubGFiZWwsXHJcbiAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBpc0dlbmVyYXRpbmcgJiYgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRlZDogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhY3VycmVudFRleHQudHJpbSgpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQubGVuZ3RoIDxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgNTApIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmF0aW5nIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSksXHJcbiAgICAgICAgICAgICAgICBzaG93VG9uZURyb3Bkb3duOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgISEoKF9jID0gYWN0aW9uQ29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubGVuZ3RoKSxcclxuICAgICAgICAgICAgICAgIHRvbmVzOiBhY3Rpb25Db25maWcudG9uZXMsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZDogdG9uZUlkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVuYWJsZWRBSUFjdGlvbnMsXHJcbiAgICAgICAgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMsXHJcbiAgICAgICAgYWN0aXZlQWN0aW9uUHJvbXB0cyxcclxuICAgICAgICB0b25lQnlBY3Rpb24sXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbixcclxuICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgIF0pO1xyXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBhZGRUZXh0T3JXcmFwLFxyXG4gICAgICAgICAgICBhZGRUZXh0LFxyXG4gICAgICAgICAgICBnZXQoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24sXHJcbiAgICAgICAgfTtcclxuICAgIH0sIFthZGRUZXh0T3JXcmFwLCBhZGRUZXh0LCBjdXJyZW50VGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChpbnB1dFZhbHVlIHx8ICcnKTtcclxuICAgIH0sIFtpbnB1dFZhbHVlLCBzZXRFZGl0b3JUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghbGltaXQgfHwgIW9uRXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBuZXh0RXJyb3IgPSBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdCA/IExJTUlUX1JFQUNIRUQgOiBlcnJvciAhPT0gbnVsbCAmJiBlcnJvciAhPT0gdm9pZCAwID8gZXJyb3IgOiAnJztcclxuICAgICAgICBpZiAobGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID09PSBuZXh0RXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPSBuZXh0RXJyb3I7XHJcbiAgICAgICAgb25FcnJvcihuZXh0RXJyb3IpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBlcnJvciwgbGltaXQsIG9uRXJyb3JdKTtcclxuICAgIHJldHVybiAoX2pzeHMoT3V0ZXJDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4gaGFuZGxlRmVlZGJhY2soJ2xpa2UnKSB9LCB7IGNoaWxkcmVuOiBfanN4KFRodW1ic1VwSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNsaWtlXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzbGlrZSBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKCdkaXNsaWtlJykgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSksIF9qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */",toString:K}),r=I("div","production"===process.env.NODE_ENV?{target:"ea7i3sh15"}:{target:"ea7i3sh15",label:"SuggestionBaselineText"})("text-decoration:line-through;color:",a.content.secondary,";"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBb0UwQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMsIEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG5pbXBvcnQgeyBidWlsZEFjdGlvblByb21wdCwgcmVxdWVzdEFJU3VnZ2VzdGlvbiB9IGZyb20gJy4vYWkvYXBpJztcclxuaW1wb3J0IHsgQ29udGFpbmVyLCBFZGl0b3JGb290ZXJSaWdodCwgRWRpdG9yRm9vdGVyUm93LCBFZGl0b3JGb290ZXJUaXRsZSwgT3V0ZXJDb250YWluZXIsIFRleHRTcGFjZSwgfSBmcm9tICcuL0N1c3RvbUVkaXRvci5zdHlsZWQnO1xyXG5pbXBvcnQgeyBBSUFjdGlvblZhcmlhbnQsIEFJRWRpdG9yQWN0aW9uVHlwZXMsIEVkaXRvckFjdGlvblR5cGVzLCBXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIH0gZnJvbSAnLi9XaGF0c0FwcFRleHRFZGl0b3JIZWFkZXInO1xyXG5jb25zdCBMSU1JVF9SRUFDSEVEID0gJ0NoYXJhY3RlciBsaW1pdCByZWFjaGVkJztcclxuY29uc3QgUkVQSFJBU0VfSURMRV9NUyA9IDMwMDA7XHJcbmNvbnN0IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTID0gNTtcclxuY29uc3QgTUFYX1NVR0dFU1RJT05TID0gMztcclxuY29uc3QgTEFSR0VfSU5QVVRfVEhSRVNIT0xEID0gMTIwMDtcclxuY29uc3QgVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgPSAnUmVwaHJhc2UgdGhpcyBXaGF0c0FwcCB1dGlsaXR5IHRlbXBsYXRlIHRvIGltcHJvdmUgY2xhcml0eSBhbmQgcmVhZGFiaWxpdHkgd2hpbGUgcHJlc2VydmluZyB2YXJpYWJsZXMsIGludGVudCwgYW5kIGNvbXBsaWFuY2UuJztcclxuY29uc3Qgc2tlbGV0b25QdWxzZSA9IGtleWZyYW1lcyBgXG5cdDAlIHsgb3BhY2l0eTogMC41NTsgfVxuXHQ1MCUgeyBvcGFjaXR5OiAxOyB9XG5cdDEwMCUgeyBvcGFjaXR5OiAwLjU1OyB9XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxNHB4IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogMTBweDtcblx0bWluLWhlaWdodDogMTUwcHg7XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkxpbmUgPSBzdHlsZWQuZGl2IGBcblx0aGVpZ2h0OiAxNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdHdpZHRoOiAkeyhwcm9wcykgPT4gcHJvcHMud2lkdGh9O1xuXHRiYWNrZ3JvdW5kOiAjZWNlY2VmO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25TZXNzaW9uQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG5cdHBhZGRpbmc6IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHRtYXgtaGVpZ2h0OiAyNjBweDtcblx0b3ZlcmZsb3cteTogc2Nyb2xsO1xuXHRzY3JvbGxiYXItd2lkdGg6IHRoaW47XG5cdHNjcm9sbGJhci1jb2xvcjogI2M4YzhjZiB0cmFuc3BhcmVudDtcblx0Ojotd2Via2l0LXNjcm9sbGJhciB7XG5cdFx0d2lkdGg6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcblx0XHRiYWNrZ3JvdW5kOiAjYzhjOGNmO1xuXHRcdGJvcmRlci1yYWRpdXM6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcblx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0fVxuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHR0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0ID0gc3R5bGVkLmRpdiBgXG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHR3aWR0aDogMTAwJTtcblx0bWluLWhlaWdodDogNDBweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db250cm9sc1JvdyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDZweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db3VudGVyID0gc3R5bGVkLnNwYW4gYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0Zm9udC1zaXplOiAxNHB4O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkljb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0Ym9yZGVyOiAwO1xuXHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0cGFkZGluZzogNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0Y3Vyc29yOiBwb2ludGVyO1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0dHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjEycyBlYXNlO1xuXHQ6bm90KDpkaXNhYmxlZCk6aG92ZXIge1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICR7Q09MT1JTLnN1cmZhY2UuaG92ZXJlZH07XG5cdH1cblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAwLjM1O1xuXHRcdGN1cnNvcjogbm90LWFsbG93ZWQ7XG5cdH1cbmA7XHJcbi8qKiBSZWdlbmVyYXRlIHN0YXlzIGZ1bGwgb3BhY2l0eSB3aGlsZSBkaXNhYmxlZCBzbyB0aGUgbG9hZGluZyBzaGltbWVyIHN0YXlzIHZpc2libGUgKHNhbWUgcHVsc2UgYXMgZWRpdG9yIHNrZWxldG9uKS4gKi9cclxuY29uc3QgU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24gPSBzdHlsZWQoU3VnZ2VzdGlvbkljb25CdXR0b24pIGBcblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAxO1xuXHRcdGN1cnNvcjogd2FpdDtcblx0fVxuYDtcclxuY29uc3QgUmVnZW5lcmF0ZUljb25TaGltbWVyID0gc3R5bGVkLmRpdiBgXG5cdHdpZHRoOiAxNHB4O1xuXHRoZWlnaHQ6IDE0cHg7XG5cdGJvcmRlci1yYWRpdXM6IDRweDtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0ZmxleC1zaHJpbms6IDA7XG5cdGFuaW1hdGlvbjogJHtza2VsZXRvblB1bHNlfSAxLjFzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuYDtcclxuLyoqIFNhbWUgYm90dG9tIHRvb2xiYXIgc2xvdCBhcyBgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyYCDigJQgcmVwbGFjZXMgdGhlIGZ1bGwgaWNvbi9BSSBwYW5lbCB3aGlsZSBvcGVuLiAqL1xyXG5jb25zdCBJbnN0cnVjdGlvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0cGFkZGluZzogOHB4IDEycHg7XG5cdGdhcDogMTBweDtcblx0Ym9yZGVyLXJhZGl1czogMCAwIDRweCA0cHg7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW5wdXRSb3cgPSBzdHlsZWQuZGl2IGBcblx0Ym9yZGVyOiAxcHggc29saWQgI2Y1YTRjMDtcblx0Ym9yZGVyLXJhZGl1czogMTBweDtcblx0cGFkZGluZzogOHB4IDEwcHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0ID0gc3R5bGVkLmlucHV0IGBcblx0ZmxleDogMTtcblx0bWluLXdpZHRoOiAwO1xuXHRib3JkZXI6IDA7XG5cdG91dGxpbmU6IG5vbmU7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25BY3Rpb25zID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQ2FuY2VsID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0Zm9udC13ZWlnaHQ6IDUwMDtcblx0cGFkZGluZzogMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbXByb3ZlID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICM1ZDNhNzI7XG5cdGNvbG9yOiAjNWQzYTcyO1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym9yZGVyLXJhZGl1czogOHB4O1xuXHRwYWRkaW5nOiA4cHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4xO1xuXHRmb250LXdlaWdodDogNjAwO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0ID0gc3R5bGVkLmRpdiBgXG5cdG1hcmdpbi10b3A6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDEycHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuXHRib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiA9IHN0eWxlZC5idXR0b24gYFxuXHR3aWR0aDogMTAwJTtcblx0Ym9yZGVyOiAwO1xuXHRib3JkZXItdG9wOiAxcHggc29saWQgJHtDT0xPUlMuc3Ryb2tlLnByaW1hcnl9O1xuXHRiYWNrZ3JvdW5kOiAkeyhwcm9wcykgPT4gKHByb3BzLnNlbGVjdGVkID8gJyNlNWYzZTgnIDogJ3RyYW5zcGFyZW50Jyl9O1xuXHRjb2xvcjogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjMWU2YjM0JyA6IENPTE9SUy5jb250ZW50LnByaW1hcnkpfTtcblx0dGV4dC1hbGlnbjogbGVmdDtcblx0cGFkZGluZzogMTJweCAxNHB4O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGxpbmUtaGVpZ2h0OiAxLjI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0OmZpcnN0LW9mLXR5cGUge1xuXHRcdGJvcmRlci10b3A6IDA7XG5cdH1cbmA7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgdGVtcGxhdGVUeXBlID0gJ21hcmtldGluZycsIHRlbXBsYXRlSWQsIHJlcXVlc3RFeGVjdXRvciwgYmFzZVVybCwgZW5kcG9pbnRQYXRoLCB1c2VDYXNlLCBzdG9yZUlkLCBhcGlBZGFwdGVyLCBjb252ZXJzYXRpb25JZCA9ICd3aGF0c2FwcC10ZW1wbGF0ZS1lZGl0b3InLCBzeXN0ZW1JZCA9ICd3aGF0c2FwcC13cml0ZXInLCBpbnRlbnQgPSAnZGVmYXVsdCcsIGVuYWJsZWRBSUFjdGlvbnMgPSBbXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlNIT1JURU4sXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FWFBBTkQsXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FTU9KSUZZLFxyXG4gICAgXSwgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMgPSBmYWxzZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCBhaUFjdGlvbk1pbkNoYXJzLCBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gREVGQVVMVF9JTlNUUlVDVElPTl9TVUdHRVNUSU9OUywgb25BSUV2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFJRXZlbnRcIiwgXCJvbkFJVGFnQ29tcHV0ZWRcIiwgXCJwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcIiwgXCJlZGl0b3JIZWFkZXJcIiwgXCJvbkFJVG9uZVNlbGVjdFwiLCBcIm9uQUlBY3Rpb25SZXF1ZXN0XCIsIFwib25CdWlsZEFJUHJvbXB0XCJdKTtcclxuICAgIGNvbnN0IHRleHRTcGFjZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IFtjdXJyZW50VGV4dCwgc2V0Q3VycmVudFRleHRdID0gdXNlU3RhdGUoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbaXNSZXBocmFzZUhpZ2hsaWdodGVkLCBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW3JlcGhyYXNlSGlnaGxpZ2h0Q291bnQsIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnRdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbaXNHZW5lcmF0aW5nLCBzZXRJc0dlbmVyYXRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2lzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2luc3RydWN0aW9uVGV4dCwgc2V0SW5zdHJ1Y3Rpb25UZXh0XSA9IHVzZVN0YXRlKCcnKTtcclxuICAgIGNvbnN0IFt0b25lQnlBY3Rpb24sIHNldFRvbmVCeUFjdGlvbl0gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkJhc2VUZXh0LCBzZXRTdWdnZXN0aW9uQmFzZVRleHRdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkNhbmRpZGF0ZXMsIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzXSA9IHVzZVN0YXRlKFtdKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uSW5kZXgsIHNldFN1Z2dlc3Rpb25JbmRleF0gPSB1c2VTdGF0ZSgwKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGVdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uU2Nyb2xsUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgcmVwaHJhc2VJZGxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgaGlnaGxpZ2h0UmVzZXRSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gISFwcmVmaWxsV2FzQWlHZW5lcmF0ZWQ7XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgY29uc3QgYWN0aXZlQWN0aW9uUHJvbXB0cyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlQWN0aW9uUHJvbXB0cyh0ZW1wbGF0ZVR5cGUsIHByb21wdE92ZXJyaWRlcywgcmVwaHJhc2VUb25lcyk7XHJcbiAgICB9LCBbcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCB0ZW1wbGF0ZVR5cGVdKTtcclxuICAgIGNvbnN0IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmICghcXVlcnkpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5maWx0ZXIoKHN1Z2dlc3Rpb24pID0+IHN1Z2dlc3Rpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkpO1xyXG4gICAgfSwgW2luc3RydWN0aW9uU3VnZ2VzdGlvbnMsIGluc3RydWN0aW9uVGV4dF0pO1xyXG4gICAgY29uc3QgbWluQ2hhcnNCeUFjdGlvbiA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSUyksIChhaUFjdGlvbk1pbkNoYXJzIHx8IHt9KSk7XHJcbiAgICB9LCBbYWlBY3Rpb25NaW5DaGFyc10pO1xyXG4gICAgY29uc3QgcmVwaHJhc2VNaW5DaGFycyA9IG1pbkNoYXJzQnlBY3Rpb25bQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV0gfHxcclxuICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV07XHJcbiAgICBjb25zdCBlbWl0QUlFdmVudCA9IHVzZUNhbGxiYWNrKChuYW1lLCBwYXlsb2FkKSA9PiB7XHJcbiAgICAgICAgb25BSUV2ZW50ID09PSBudWxsIHx8IG9uQUlFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSUV2ZW50KG5hbWUsIHBheWxvYWQpO1xyXG4gICAgfSwgW29uQUlFdmVudF0pO1xyXG4gICAgY29uc3Qgc2V0RWRpdG9yVGV4dCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIHNldEN1cnJlbnRUZXh0KChwcmV2KSA9PiAocHJldiA9PT0gbmV4dFRleHQgPyBwcmV2IDogbmV4dFRleHQpKTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGVtaXRDaGFuZ2VXaXRoR3VhcmQgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlZmVycmVkSHRtbFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5leHRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIG5leHRUZXh0KTtcclxuICAgICAgICAgICAgZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChuZXh0VGV4dCkpO1xyXG4gICAgICAgICAgICB9LCAxNik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICB9LCBbb25DaGFuZ2VdKTtcclxuICAgIGNvbnN0IGNsZWFyU3VnZ2VzdGlvblNlc3Npb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0KG51bGwpO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtdKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUobnVsbCk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgPj0gTUFYX1JFUEhSQVNFX0hJR0hMSUdIVFMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuZXh0Q291bnQgPSByZXBocmFzZUhpZ2hsaWdodENvdW50ICsgMTtcclxuICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KG5leHRDb3VudCk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIGVkaXRvckluc3RhbmNlS2V5KSB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oZ2V0SGlnaGxpZ2h0U3RvcmFnZUtleShlZGl0b3JJbnN0YW5jZUtleSksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCByZXBocmFzZUhpZ2hsaWdodENvdW50XSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpKSB8fFxyXG4gICAgICAgICAgICAnMCcpO1xyXG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGNhY2hlZCkpIHtcclxuICAgICAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChjYWNoZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBlbGlnaWJsZSA9ICEhY3VycmVudFRleHQudHJpbSgpICYmIGN1cnJlbnRUZXh0Lmxlbmd0aCA+PSByZXBocmFzZU1pbkNoYXJzO1xyXG4gICAgICAgIGlmIChwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBlbGlnaWJsZTtcclxuICAgICAgICAgICAgaWYgKGVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjcm9zc2VkVGhyZXNob2xkID0gIXByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgJiYgZWxpZ2libGU7XHJcbiAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IHRydWU7XHJcbiAgICAgICAgaWYgKGNyb3NzZWRUaHJlc2hvbGQpIHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzW3N1Z2dlc3Rpb25JbmRleF0gfHwgJyc7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2IsIF9jLCBfZDtcclxuICAgICAgICBpZiAoIW9uQUlBY3Rpb25SZXF1ZXN0ICYmXHJcbiAgICAgICAgICAgICFhcGlBZGFwdGVyICYmXHJcbiAgICAgICAgICAgICghcmVxdWVzdEV4ZWN1dG9yIHx8ICFiYXNlVXJsKSkge1xyXG4gICAgICAgICAgICBvbkVycm9yID09PSBudWxsIHx8IG9uRXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRXJyb3IoJ0FJIGNvbmZpZ3VyYXRpb24gbWlzc2luZycpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY3VycmVudFRleHQudHJpbSgpKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbWluQ2hhcnNGb3JBY3Rpb24gPSBtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICA1MDtcclxuICAgICAgICBpZiAoY3VycmVudFRleHQubGVuZ3RoIDwgbWluQ2hhcnNGb3JBY3Rpb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKHJlZ2VuZXJhdGVFeGlzdGluZyAmJiAhY2FuUmVnZW5lcmF0ZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGJhc2VDb25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlID09PSAndXRpbGl0eScgJiZcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCA9PT0gQUlBY3Rpb25WYXJpYW50LlJFUEhSQVNFXHJcbiAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiYXNlQ29uZmlnKSwgeyBsYWJlbDogJ1JlcGhyYXNlJywgYmFzZVByb21wdDogVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgfSkgOiBiYXNlQ29uZmlnO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVG9uZUlkID0gdG9uZU92ZXJyaWRlSWQgfHxcclxuICAgICAgICAgICAgdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIGNvbmZpZy5kZWZhdWx0VG9uZUlkIHx8XHJcbiAgICAgICAgICAgICgoX2MgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYlswXSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmlkKTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2QgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGluSW5pdGlhbEFpUGhhc2UgPSBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudDtcclxuICAgICAgICBjb25zdCB0YWdQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25BY2NlcHQoe1xyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWNjZXB0ZWRUZXh0OiBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZTogaW5Jbml0aWFsQWlQaGFzZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoaW5Jbml0aWFsQWlQaGFzZSkge1xyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkFJVGFnQ29tcHV0ZWQgPT09IG51bGwgfHwgb25BSVRhZ0NvbXB1dGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVGFnQ29tcHV0ZWQodGFnUGF5bG9hZCk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCBzdWdnZXN0aW9uSW5kZXgsIHRlbXBsYXRlSWRdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgY29uc3QgYWN0aW9uQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgY29uc3QgdG9uZUlkID0gdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25Db25maWcuZGVmYXVsdFRvbmVJZCB8fFxyXG4gICAgICAgICAgICAgICAgKChfYiA9IChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWzBdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWQpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBhY3Rpb25Db25maWcubGFiZWwsXHJcbiAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBpc0dlbmVyYXRpbmcgJiYgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRlZDogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhY3VycmVudFRleHQudHJpbSgpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQubGVuZ3RoIDxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgNTApIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmF0aW5nIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSksXHJcbiAgICAgICAgICAgICAgICBzaG93VG9uZURyb3Bkb3duOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgISEoKF9jID0gYWN0aW9uQ29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubGVuZ3RoKSxcclxuICAgICAgICAgICAgICAgIHRvbmVzOiBhY3Rpb25Db25maWcudG9uZXMsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZDogdG9uZUlkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVuYWJsZWRBSUFjdGlvbnMsXHJcbiAgICAgICAgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMsXHJcbiAgICAgICAgYWN0aXZlQWN0aW9uUHJvbXB0cyxcclxuICAgICAgICB0b25lQnlBY3Rpb24sXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbixcclxuICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgIF0pO1xyXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBhZGRUZXh0T3JXcmFwLFxyXG4gICAgICAgICAgICBhZGRUZXh0LFxyXG4gICAgICAgICAgICBnZXQoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24sXHJcbiAgICAgICAgfTtcclxuICAgIH0sIFthZGRUZXh0T3JXcmFwLCBhZGRUZXh0LCBjdXJyZW50VGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChpbnB1dFZhbHVlIHx8ICcnKTtcclxuICAgIH0sIFtpbnB1dFZhbHVlLCBzZXRFZGl0b3JUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghbGltaXQgfHwgIW9uRXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBuZXh0RXJyb3IgPSBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdCA/IExJTUlUX1JFQUNIRUQgOiBlcnJvciAhPT0gbnVsbCAmJiBlcnJvciAhPT0gdm9pZCAwID8gZXJyb3IgOiAnJztcclxuICAgICAgICBpZiAobGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID09PSBuZXh0RXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPSBuZXh0RXJyb3I7XHJcbiAgICAgICAgb25FcnJvcihuZXh0RXJyb3IpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBlcnJvciwgbGltaXQsIG9uRXJyb3JdKTtcclxuICAgIHJldHVybiAoX2pzeHMoT3V0ZXJDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4gaGFuZGxlRmVlZGJhY2soJ2xpa2UnKSB9LCB7IGNoaWxkcmVuOiBfanN4KFRodW1ic1VwSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNsaWtlXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzbGlrZSBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKCdkaXNsaWtlJykgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSksIF9qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),q=I("div","production"===process.env.NODE_ENV?{target:"ea7i3sh14"}:{target:"ea7i3sh14",label:"SuggestionCandidateText"})("color:",a.content.primary,";"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBd0UyQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMsIEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG5pbXBvcnQgeyBidWlsZEFjdGlvblByb21wdCwgcmVxdWVzdEFJU3VnZ2VzdGlvbiB9IGZyb20gJy4vYWkvYXBpJztcclxuaW1wb3J0IHsgQ29udGFpbmVyLCBFZGl0b3JGb290ZXJSaWdodCwgRWRpdG9yRm9vdGVyUm93LCBFZGl0b3JGb290ZXJUaXRsZSwgT3V0ZXJDb250YWluZXIsIFRleHRTcGFjZSwgfSBmcm9tICcuL0N1c3RvbUVkaXRvci5zdHlsZWQnO1xyXG5pbXBvcnQgeyBBSUFjdGlvblZhcmlhbnQsIEFJRWRpdG9yQWN0aW9uVHlwZXMsIEVkaXRvckFjdGlvblR5cGVzLCBXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIH0gZnJvbSAnLi9XaGF0c0FwcFRleHRFZGl0b3JIZWFkZXInO1xyXG5jb25zdCBMSU1JVF9SRUFDSEVEID0gJ0NoYXJhY3RlciBsaW1pdCByZWFjaGVkJztcclxuY29uc3QgUkVQSFJBU0VfSURMRV9NUyA9IDMwMDA7XHJcbmNvbnN0IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTID0gNTtcclxuY29uc3QgTUFYX1NVR0dFU1RJT05TID0gMztcclxuY29uc3QgTEFSR0VfSU5QVVRfVEhSRVNIT0xEID0gMTIwMDtcclxuY29uc3QgVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgPSAnUmVwaHJhc2UgdGhpcyBXaGF0c0FwcCB1dGlsaXR5IHRlbXBsYXRlIHRvIGltcHJvdmUgY2xhcml0eSBhbmQgcmVhZGFiaWxpdHkgd2hpbGUgcHJlc2VydmluZyB2YXJpYWJsZXMsIGludGVudCwgYW5kIGNvbXBsaWFuY2UuJztcclxuY29uc3Qgc2tlbGV0b25QdWxzZSA9IGtleWZyYW1lcyBgXG5cdDAlIHsgb3BhY2l0eTogMC41NTsgfVxuXHQ1MCUgeyBvcGFjaXR5OiAxOyB9XG5cdDEwMCUgeyBvcGFjaXR5OiAwLjU1OyB9XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxNHB4IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogMTBweDtcblx0bWluLWhlaWdodDogMTUwcHg7XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkxpbmUgPSBzdHlsZWQuZGl2IGBcblx0aGVpZ2h0OiAxNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdHdpZHRoOiAkeyhwcm9wcykgPT4gcHJvcHMud2lkdGh9O1xuXHRiYWNrZ3JvdW5kOiAjZWNlY2VmO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25TZXNzaW9uQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG5cdHBhZGRpbmc6IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHRtYXgtaGVpZ2h0OiAyNjBweDtcblx0b3ZlcmZsb3cteTogc2Nyb2xsO1xuXHRzY3JvbGxiYXItd2lkdGg6IHRoaW47XG5cdHNjcm9sbGJhci1jb2xvcjogI2M4YzhjZiB0cmFuc3BhcmVudDtcblx0Ojotd2Via2l0LXNjcm9sbGJhciB7XG5cdFx0d2lkdGg6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcblx0XHRiYWNrZ3JvdW5kOiAjYzhjOGNmO1xuXHRcdGJvcmRlci1yYWRpdXM6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcblx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0fVxuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHR0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0ID0gc3R5bGVkLmRpdiBgXG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHR3aWR0aDogMTAwJTtcblx0bWluLWhlaWdodDogNDBweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db250cm9sc1JvdyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDZweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db3VudGVyID0gc3R5bGVkLnNwYW4gYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0Zm9udC1zaXplOiAxNHB4O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkljb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0Ym9yZGVyOiAwO1xuXHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0cGFkZGluZzogNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0Y3Vyc29yOiBwb2ludGVyO1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0dHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjEycyBlYXNlO1xuXHQ6bm90KDpkaXNhYmxlZCk6aG92ZXIge1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICR7Q09MT1JTLnN1cmZhY2UuaG92ZXJlZH07XG5cdH1cblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAwLjM1O1xuXHRcdGN1cnNvcjogbm90LWFsbG93ZWQ7XG5cdH1cbmA7XHJcbi8qKiBSZWdlbmVyYXRlIHN0YXlzIGZ1bGwgb3BhY2l0eSB3aGlsZSBkaXNhYmxlZCBzbyB0aGUgbG9hZGluZyBzaGltbWVyIHN0YXlzIHZpc2libGUgKHNhbWUgcHVsc2UgYXMgZWRpdG9yIHNrZWxldG9uKS4gKi9cclxuY29uc3QgU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24gPSBzdHlsZWQoU3VnZ2VzdGlvbkljb25CdXR0b24pIGBcblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAxO1xuXHRcdGN1cnNvcjogd2FpdDtcblx0fVxuYDtcclxuY29uc3QgUmVnZW5lcmF0ZUljb25TaGltbWVyID0gc3R5bGVkLmRpdiBgXG5cdHdpZHRoOiAxNHB4O1xuXHRoZWlnaHQ6IDE0cHg7XG5cdGJvcmRlci1yYWRpdXM6IDRweDtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0ZmxleC1zaHJpbms6IDA7XG5cdGFuaW1hdGlvbjogJHtza2VsZXRvblB1bHNlfSAxLjFzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuYDtcclxuLyoqIFNhbWUgYm90dG9tIHRvb2xiYXIgc2xvdCBhcyBgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyYCDigJQgcmVwbGFjZXMgdGhlIGZ1bGwgaWNvbi9BSSBwYW5lbCB3aGlsZSBvcGVuLiAqL1xyXG5jb25zdCBJbnN0cnVjdGlvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0cGFkZGluZzogOHB4IDEycHg7XG5cdGdhcDogMTBweDtcblx0Ym9yZGVyLXJhZGl1czogMCAwIDRweCA0cHg7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW5wdXRSb3cgPSBzdHlsZWQuZGl2IGBcblx0Ym9yZGVyOiAxcHggc29saWQgI2Y1YTRjMDtcblx0Ym9yZGVyLXJhZGl1czogMTBweDtcblx0cGFkZGluZzogOHB4IDEwcHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0ID0gc3R5bGVkLmlucHV0IGBcblx0ZmxleDogMTtcblx0bWluLXdpZHRoOiAwO1xuXHRib3JkZXI6IDA7XG5cdG91dGxpbmU6IG5vbmU7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25BY3Rpb25zID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQ2FuY2VsID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0Zm9udC13ZWlnaHQ6IDUwMDtcblx0cGFkZGluZzogMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbXByb3ZlID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICM1ZDNhNzI7XG5cdGNvbG9yOiAjNWQzYTcyO1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym9yZGVyLXJhZGl1czogOHB4O1xuXHRwYWRkaW5nOiA4cHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4xO1xuXHRmb250LXdlaWdodDogNjAwO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0ID0gc3R5bGVkLmRpdiBgXG5cdG1hcmdpbi10b3A6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDEycHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuXHRib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiA9IHN0eWxlZC5idXR0b24gYFxuXHR3aWR0aDogMTAwJTtcblx0Ym9yZGVyOiAwO1xuXHRib3JkZXItdG9wOiAxcHggc29saWQgJHtDT0xPUlMuc3Ryb2tlLnByaW1hcnl9O1xuXHRiYWNrZ3JvdW5kOiAkeyhwcm9wcykgPT4gKHByb3BzLnNlbGVjdGVkID8gJyNlNWYzZTgnIDogJ3RyYW5zcGFyZW50Jyl9O1xuXHRjb2xvcjogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjMWU2YjM0JyA6IENPTE9SUy5jb250ZW50LnByaW1hcnkpfTtcblx0dGV4dC1hbGlnbjogbGVmdDtcblx0cGFkZGluZzogMTJweCAxNHB4O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGxpbmUtaGVpZ2h0OiAxLjI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0OmZpcnN0LW9mLXR5cGUge1xuXHRcdGJvcmRlci10b3A6IDA7XG5cdH1cbmA7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgdGVtcGxhdGVUeXBlID0gJ21hcmtldGluZycsIHRlbXBsYXRlSWQsIHJlcXVlc3RFeGVjdXRvciwgYmFzZVVybCwgZW5kcG9pbnRQYXRoLCB1c2VDYXNlLCBzdG9yZUlkLCBhcGlBZGFwdGVyLCBjb252ZXJzYXRpb25JZCA9ICd3aGF0c2FwcC10ZW1wbGF0ZS1lZGl0b3InLCBzeXN0ZW1JZCA9ICd3aGF0c2FwcC13cml0ZXInLCBpbnRlbnQgPSAnZGVmYXVsdCcsIGVuYWJsZWRBSUFjdGlvbnMgPSBbXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlNIT1JURU4sXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FWFBBTkQsXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FTU9KSUZZLFxyXG4gICAgXSwgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMgPSBmYWxzZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCBhaUFjdGlvbk1pbkNoYXJzLCBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gREVGQVVMVF9JTlNUUlVDVElPTl9TVUdHRVNUSU9OUywgb25BSUV2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFJRXZlbnRcIiwgXCJvbkFJVGFnQ29tcHV0ZWRcIiwgXCJwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcIiwgXCJlZGl0b3JIZWFkZXJcIiwgXCJvbkFJVG9uZVNlbGVjdFwiLCBcIm9uQUlBY3Rpb25SZXF1ZXN0XCIsIFwib25CdWlsZEFJUHJvbXB0XCJdKTtcclxuICAgIGNvbnN0IHRleHRTcGFjZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IFtjdXJyZW50VGV4dCwgc2V0Q3VycmVudFRleHRdID0gdXNlU3RhdGUoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbaXNSZXBocmFzZUhpZ2hsaWdodGVkLCBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW3JlcGhyYXNlSGlnaGxpZ2h0Q291bnQsIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnRdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbaXNHZW5lcmF0aW5nLCBzZXRJc0dlbmVyYXRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2lzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2luc3RydWN0aW9uVGV4dCwgc2V0SW5zdHJ1Y3Rpb25UZXh0XSA9IHVzZVN0YXRlKCcnKTtcclxuICAgIGNvbnN0IFt0b25lQnlBY3Rpb24sIHNldFRvbmVCeUFjdGlvbl0gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkJhc2VUZXh0LCBzZXRTdWdnZXN0aW9uQmFzZVRleHRdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkNhbmRpZGF0ZXMsIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzXSA9IHVzZVN0YXRlKFtdKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uSW5kZXgsIHNldFN1Z2dlc3Rpb25JbmRleF0gPSB1c2VTdGF0ZSgwKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGVdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uU2Nyb2xsUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgcmVwaHJhc2VJZGxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgaGlnaGxpZ2h0UmVzZXRSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gISFwcmVmaWxsV2FzQWlHZW5lcmF0ZWQ7XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgY29uc3QgYWN0aXZlQWN0aW9uUHJvbXB0cyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlQWN0aW9uUHJvbXB0cyh0ZW1wbGF0ZVR5cGUsIHByb21wdE92ZXJyaWRlcywgcmVwaHJhc2VUb25lcyk7XHJcbiAgICB9LCBbcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCB0ZW1wbGF0ZVR5cGVdKTtcclxuICAgIGNvbnN0IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmICghcXVlcnkpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5maWx0ZXIoKHN1Z2dlc3Rpb24pID0+IHN1Z2dlc3Rpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkpO1xyXG4gICAgfSwgW2luc3RydWN0aW9uU3VnZ2VzdGlvbnMsIGluc3RydWN0aW9uVGV4dF0pO1xyXG4gICAgY29uc3QgbWluQ2hhcnNCeUFjdGlvbiA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSUyksIChhaUFjdGlvbk1pbkNoYXJzIHx8IHt9KSk7XHJcbiAgICB9LCBbYWlBY3Rpb25NaW5DaGFyc10pO1xyXG4gICAgY29uc3QgcmVwaHJhc2VNaW5DaGFycyA9IG1pbkNoYXJzQnlBY3Rpb25bQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV0gfHxcclxuICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV07XHJcbiAgICBjb25zdCBlbWl0QUlFdmVudCA9IHVzZUNhbGxiYWNrKChuYW1lLCBwYXlsb2FkKSA9PiB7XHJcbiAgICAgICAgb25BSUV2ZW50ID09PSBudWxsIHx8IG9uQUlFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSUV2ZW50KG5hbWUsIHBheWxvYWQpO1xyXG4gICAgfSwgW29uQUlFdmVudF0pO1xyXG4gICAgY29uc3Qgc2V0RWRpdG9yVGV4dCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIHNldEN1cnJlbnRUZXh0KChwcmV2KSA9PiAocHJldiA9PT0gbmV4dFRleHQgPyBwcmV2IDogbmV4dFRleHQpKTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGVtaXRDaGFuZ2VXaXRoR3VhcmQgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlZmVycmVkSHRtbFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5leHRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIG5leHRUZXh0KTtcclxuICAgICAgICAgICAgZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChuZXh0VGV4dCkpO1xyXG4gICAgICAgICAgICB9LCAxNik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICB9LCBbb25DaGFuZ2VdKTtcclxuICAgIGNvbnN0IGNsZWFyU3VnZ2VzdGlvblNlc3Npb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0KG51bGwpO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtdKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUobnVsbCk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgPj0gTUFYX1JFUEhSQVNFX0hJR0hMSUdIVFMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuZXh0Q291bnQgPSByZXBocmFzZUhpZ2hsaWdodENvdW50ICsgMTtcclxuICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KG5leHRDb3VudCk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIGVkaXRvckluc3RhbmNlS2V5KSB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oZ2V0SGlnaGxpZ2h0U3RvcmFnZUtleShlZGl0b3JJbnN0YW5jZUtleSksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCByZXBocmFzZUhpZ2hsaWdodENvdW50XSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpKSB8fFxyXG4gICAgICAgICAgICAnMCcpO1xyXG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGNhY2hlZCkpIHtcclxuICAgICAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChjYWNoZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBlbGlnaWJsZSA9ICEhY3VycmVudFRleHQudHJpbSgpICYmIGN1cnJlbnRUZXh0Lmxlbmd0aCA+PSByZXBocmFzZU1pbkNoYXJzO1xyXG4gICAgICAgIGlmIChwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBlbGlnaWJsZTtcclxuICAgICAgICAgICAgaWYgKGVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjcm9zc2VkVGhyZXNob2xkID0gIXByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgJiYgZWxpZ2libGU7XHJcbiAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IHRydWU7XHJcbiAgICAgICAgaWYgKGNyb3NzZWRUaHJlc2hvbGQpIHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzW3N1Z2dlc3Rpb25JbmRleF0gfHwgJyc7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2IsIF9jLCBfZDtcclxuICAgICAgICBpZiAoIW9uQUlBY3Rpb25SZXF1ZXN0ICYmXHJcbiAgICAgICAgICAgICFhcGlBZGFwdGVyICYmXHJcbiAgICAgICAgICAgICghcmVxdWVzdEV4ZWN1dG9yIHx8ICFiYXNlVXJsKSkge1xyXG4gICAgICAgICAgICBvbkVycm9yID09PSBudWxsIHx8IG9uRXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRXJyb3IoJ0FJIGNvbmZpZ3VyYXRpb24gbWlzc2luZycpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY3VycmVudFRleHQudHJpbSgpKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbWluQ2hhcnNGb3JBY3Rpb24gPSBtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICA1MDtcclxuICAgICAgICBpZiAoY3VycmVudFRleHQubGVuZ3RoIDwgbWluQ2hhcnNGb3JBY3Rpb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKHJlZ2VuZXJhdGVFeGlzdGluZyAmJiAhY2FuUmVnZW5lcmF0ZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGJhc2VDb25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlID09PSAndXRpbGl0eScgJiZcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCA9PT0gQUlBY3Rpb25WYXJpYW50LlJFUEhSQVNFXHJcbiAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiYXNlQ29uZmlnKSwgeyBsYWJlbDogJ1JlcGhyYXNlJywgYmFzZVByb21wdDogVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgfSkgOiBiYXNlQ29uZmlnO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVG9uZUlkID0gdG9uZU92ZXJyaWRlSWQgfHxcclxuICAgICAgICAgICAgdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIGNvbmZpZy5kZWZhdWx0VG9uZUlkIHx8XHJcbiAgICAgICAgICAgICgoX2MgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYlswXSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmlkKTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2QgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGluSW5pdGlhbEFpUGhhc2UgPSBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudDtcclxuICAgICAgICBjb25zdCB0YWdQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25BY2NlcHQoe1xyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWNjZXB0ZWRUZXh0OiBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZTogaW5Jbml0aWFsQWlQaGFzZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoaW5Jbml0aWFsQWlQaGFzZSkge1xyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkFJVGFnQ29tcHV0ZWQgPT09IG51bGwgfHwgb25BSVRhZ0NvbXB1dGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVGFnQ29tcHV0ZWQodGFnUGF5bG9hZCk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCBzdWdnZXN0aW9uSW5kZXgsIHRlbXBsYXRlSWRdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgY29uc3QgYWN0aW9uQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgY29uc3QgdG9uZUlkID0gdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25Db25maWcuZGVmYXVsdFRvbmVJZCB8fFxyXG4gICAgICAgICAgICAgICAgKChfYiA9IChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWzBdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWQpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBhY3Rpb25Db25maWcubGFiZWwsXHJcbiAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBpc0dlbmVyYXRpbmcgJiYgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRlZDogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhY3VycmVudFRleHQudHJpbSgpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQubGVuZ3RoIDxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgNTApIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmF0aW5nIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSksXHJcbiAgICAgICAgICAgICAgICBzaG93VG9uZURyb3Bkb3duOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgISEoKF9jID0gYWN0aW9uQ29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubGVuZ3RoKSxcclxuICAgICAgICAgICAgICAgIHRvbmVzOiBhY3Rpb25Db25maWcudG9uZXMsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZDogdG9uZUlkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVuYWJsZWRBSUFjdGlvbnMsXHJcbiAgICAgICAgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMsXHJcbiAgICAgICAgYWN0aXZlQWN0aW9uUHJvbXB0cyxcclxuICAgICAgICB0b25lQnlBY3Rpb24sXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbixcclxuICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgIF0pO1xyXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBhZGRUZXh0T3JXcmFwLFxyXG4gICAgICAgICAgICBhZGRUZXh0LFxyXG4gICAgICAgICAgICBnZXQoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24sXHJcbiAgICAgICAgfTtcclxuICAgIH0sIFthZGRUZXh0T3JXcmFwLCBhZGRUZXh0LCBjdXJyZW50VGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChpbnB1dFZhbHVlIHx8ICcnKTtcclxuICAgIH0sIFtpbnB1dFZhbHVlLCBzZXRFZGl0b3JUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghbGltaXQgfHwgIW9uRXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBuZXh0RXJyb3IgPSBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdCA/IExJTUlUX1JFQUNIRUQgOiBlcnJvciAhPT0gbnVsbCAmJiBlcnJvciAhPT0gdm9pZCAwID8gZXJyb3IgOiAnJztcclxuICAgICAgICBpZiAobGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID09PSBuZXh0RXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPSBuZXh0RXJyb3I7XHJcbiAgICAgICAgb25FcnJvcihuZXh0RXJyb3IpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBlcnJvciwgbGltaXQsIG9uRXJyb3JdKTtcclxuICAgIHJldHVybiAoX2pzeHMoT3V0ZXJDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4gaGFuZGxlRmVlZGJhY2soJ2xpa2UnKSB9LCB7IGNoaWxkcmVuOiBfanN4KFRodW1ic1VwSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNsaWtlXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzbGlrZSBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKCdkaXNsaWtlJykgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSksIF9qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),_=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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMkUrQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMsIEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG5pbXBvcnQgeyBidWlsZEFjdGlvblByb21wdCwgcmVxdWVzdEFJU3VnZ2VzdGlvbiB9IGZyb20gJy4vYWkvYXBpJztcclxuaW1wb3J0IHsgQ29udGFpbmVyLCBFZGl0b3JGb290ZXJSaWdodCwgRWRpdG9yRm9vdGVyUm93LCBFZGl0b3JGb290ZXJUaXRsZSwgT3V0ZXJDb250YWluZXIsIFRleHRTcGFjZSwgfSBmcm9tICcuL0N1c3RvbUVkaXRvci5zdHlsZWQnO1xyXG5pbXBvcnQgeyBBSUFjdGlvblZhcmlhbnQsIEFJRWRpdG9yQWN0aW9uVHlwZXMsIEVkaXRvckFjdGlvblR5cGVzLCBXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIH0gZnJvbSAnLi9XaGF0c0FwcFRleHRFZGl0b3JIZWFkZXInO1xyXG5jb25zdCBMSU1JVF9SRUFDSEVEID0gJ0NoYXJhY3RlciBsaW1pdCByZWFjaGVkJztcclxuY29uc3QgUkVQSFJBU0VfSURMRV9NUyA9IDMwMDA7XHJcbmNvbnN0IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTID0gNTtcclxuY29uc3QgTUFYX1NVR0dFU1RJT05TID0gMztcclxuY29uc3QgTEFSR0VfSU5QVVRfVEhSRVNIT0xEID0gMTIwMDtcclxuY29uc3QgVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgPSAnUmVwaHJhc2UgdGhpcyBXaGF0c0FwcCB1dGlsaXR5IHRlbXBsYXRlIHRvIGltcHJvdmUgY2xhcml0eSBhbmQgcmVhZGFiaWxpdHkgd2hpbGUgcHJlc2VydmluZyB2YXJpYWJsZXMsIGludGVudCwgYW5kIGNvbXBsaWFuY2UuJztcclxuY29uc3Qgc2tlbGV0b25QdWxzZSA9IGtleWZyYW1lcyBgXG5cdDAlIHsgb3BhY2l0eTogMC41NTsgfVxuXHQ1MCUgeyBvcGFjaXR5OiAxOyB9XG5cdDEwMCUgeyBvcGFjaXR5OiAwLjU1OyB9XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxNHB4IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogMTBweDtcblx0bWluLWhlaWdodDogMTUwcHg7XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkxpbmUgPSBzdHlsZWQuZGl2IGBcblx0aGVpZ2h0OiAxNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdHdpZHRoOiAkeyhwcm9wcykgPT4gcHJvcHMud2lkdGh9O1xuXHRiYWNrZ3JvdW5kOiAjZWNlY2VmO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25TZXNzaW9uQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG5cdHBhZGRpbmc6IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHRtYXgtaGVpZ2h0OiAyNjBweDtcblx0b3ZlcmZsb3cteTogc2Nyb2xsO1xuXHRzY3JvbGxiYXItd2lkdGg6IHRoaW47XG5cdHNjcm9sbGJhci1jb2xvcjogI2M4YzhjZiB0cmFuc3BhcmVudDtcblx0Ojotd2Via2l0LXNjcm9sbGJhciB7XG5cdFx0d2lkdGg6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcblx0XHRiYWNrZ3JvdW5kOiAjYzhjOGNmO1xuXHRcdGJvcmRlci1yYWRpdXM6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcblx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0fVxuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHR0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0ID0gc3R5bGVkLmRpdiBgXG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHR3aWR0aDogMTAwJTtcblx0bWluLWhlaWdodDogNDBweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db250cm9sc1JvdyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDZweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db3VudGVyID0gc3R5bGVkLnNwYW4gYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0Zm9udC1zaXplOiAxNHB4O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkljb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0Ym9yZGVyOiAwO1xuXHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0cGFkZGluZzogNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0Y3Vyc29yOiBwb2ludGVyO1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0dHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjEycyBlYXNlO1xuXHQ6bm90KDpkaXNhYmxlZCk6aG92ZXIge1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICR7Q09MT1JTLnN1cmZhY2UuaG92ZXJlZH07XG5cdH1cblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAwLjM1O1xuXHRcdGN1cnNvcjogbm90LWFsbG93ZWQ7XG5cdH1cbmA7XHJcbi8qKiBSZWdlbmVyYXRlIHN0YXlzIGZ1bGwgb3BhY2l0eSB3aGlsZSBkaXNhYmxlZCBzbyB0aGUgbG9hZGluZyBzaGltbWVyIHN0YXlzIHZpc2libGUgKHNhbWUgcHVsc2UgYXMgZWRpdG9yIHNrZWxldG9uKS4gKi9cclxuY29uc3QgU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24gPSBzdHlsZWQoU3VnZ2VzdGlvbkljb25CdXR0b24pIGBcblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAxO1xuXHRcdGN1cnNvcjogd2FpdDtcblx0fVxuYDtcclxuY29uc3QgUmVnZW5lcmF0ZUljb25TaGltbWVyID0gc3R5bGVkLmRpdiBgXG5cdHdpZHRoOiAxNHB4O1xuXHRoZWlnaHQ6IDE0cHg7XG5cdGJvcmRlci1yYWRpdXM6IDRweDtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0ZmxleC1zaHJpbms6IDA7XG5cdGFuaW1hdGlvbjogJHtza2VsZXRvblB1bHNlfSAxLjFzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuYDtcclxuLyoqIFNhbWUgYm90dG9tIHRvb2xiYXIgc2xvdCBhcyBgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyYCDigJQgcmVwbGFjZXMgdGhlIGZ1bGwgaWNvbi9BSSBwYW5lbCB3aGlsZSBvcGVuLiAqL1xyXG5jb25zdCBJbnN0cnVjdGlvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0cGFkZGluZzogOHB4IDEycHg7XG5cdGdhcDogMTBweDtcblx0Ym9yZGVyLXJhZGl1czogMCAwIDRweCA0cHg7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW5wdXRSb3cgPSBzdHlsZWQuZGl2IGBcblx0Ym9yZGVyOiAxcHggc29saWQgI2Y1YTRjMDtcblx0Ym9yZGVyLXJhZGl1czogMTBweDtcblx0cGFkZGluZzogOHB4IDEwcHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0ID0gc3R5bGVkLmlucHV0IGBcblx0ZmxleDogMTtcblx0bWluLXdpZHRoOiAwO1xuXHRib3JkZXI6IDA7XG5cdG91dGxpbmU6IG5vbmU7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25BY3Rpb25zID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQ2FuY2VsID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0Zm9udC13ZWlnaHQ6IDUwMDtcblx0cGFkZGluZzogMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbXByb3ZlID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICM1ZDNhNzI7XG5cdGNvbG9yOiAjNWQzYTcyO1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym9yZGVyLXJhZGl1czogOHB4O1xuXHRwYWRkaW5nOiA4cHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4xO1xuXHRmb250LXdlaWdodDogNjAwO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0ID0gc3R5bGVkLmRpdiBgXG5cdG1hcmdpbi10b3A6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDEycHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuXHRib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiA9IHN0eWxlZC5idXR0b24gYFxuXHR3aWR0aDogMTAwJTtcblx0Ym9yZGVyOiAwO1xuXHRib3JkZXItdG9wOiAxcHggc29saWQgJHtDT0xPUlMuc3Ryb2tlLnByaW1hcnl9O1xuXHRiYWNrZ3JvdW5kOiAkeyhwcm9wcykgPT4gKHByb3BzLnNlbGVjdGVkID8gJyNlNWYzZTgnIDogJ3RyYW5zcGFyZW50Jyl9O1xuXHRjb2xvcjogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjMWU2YjM0JyA6IENPTE9SUy5jb250ZW50LnByaW1hcnkpfTtcblx0dGV4dC1hbGlnbjogbGVmdDtcblx0cGFkZGluZzogMTJweCAxNHB4O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGxpbmUtaGVpZ2h0OiAxLjI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0OmZpcnN0LW9mLXR5cGUge1xuXHRcdGJvcmRlci10b3A6IDA7XG5cdH1cbmA7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgdGVtcGxhdGVUeXBlID0gJ21hcmtldGluZycsIHRlbXBsYXRlSWQsIHJlcXVlc3RFeGVjdXRvciwgYmFzZVVybCwgZW5kcG9pbnRQYXRoLCB1c2VDYXNlLCBzdG9yZUlkLCBhcGlBZGFwdGVyLCBjb252ZXJzYXRpb25JZCA9ICd3aGF0c2FwcC10ZW1wbGF0ZS1lZGl0b3InLCBzeXN0ZW1JZCA9ICd3aGF0c2FwcC13cml0ZXInLCBpbnRlbnQgPSAnZGVmYXVsdCcsIGVuYWJsZWRBSUFjdGlvbnMgPSBbXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlNIT1JURU4sXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FWFBBTkQsXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FTU9KSUZZLFxyXG4gICAgXSwgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMgPSBmYWxzZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCBhaUFjdGlvbk1pbkNoYXJzLCBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gREVGQVVMVF9JTlNUUlVDVElPTl9TVUdHRVNUSU9OUywgb25BSUV2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFJRXZlbnRcIiwgXCJvbkFJVGFnQ29tcHV0ZWRcIiwgXCJwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcIiwgXCJlZGl0b3JIZWFkZXJcIiwgXCJvbkFJVG9uZVNlbGVjdFwiLCBcIm9uQUlBY3Rpb25SZXF1ZXN0XCIsIFwib25CdWlsZEFJUHJvbXB0XCJdKTtcclxuICAgIGNvbnN0IHRleHRTcGFjZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IFtjdXJyZW50VGV4dCwgc2V0Q3VycmVudFRleHRdID0gdXNlU3RhdGUoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbaXNSZXBocmFzZUhpZ2hsaWdodGVkLCBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW3JlcGhyYXNlSGlnaGxpZ2h0Q291bnQsIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnRdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbaXNHZW5lcmF0aW5nLCBzZXRJc0dlbmVyYXRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2lzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2luc3RydWN0aW9uVGV4dCwgc2V0SW5zdHJ1Y3Rpb25UZXh0XSA9IHVzZVN0YXRlKCcnKTtcclxuICAgIGNvbnN0IFt0b25lQnlBY3Rpb24sIHNldFRvbmVCeUFjdGlvbl0gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkJhc2VUZXh0LCBzZXRTdWdnZXN0aW9uQmFzZVRleHRdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkNhbmRpZGF0ZXMsIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzXSA9IHVzZVN0YXRlKFtdKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uSW5kZXgsIHNldFN1Z2dlc3Rpb25JbmRleF0gPSB1c2VTdGF0ZSgwKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGVdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uU2Nyb2xsUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgcmVwaHJhc2VJZGxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgaGlnaGxpZ2h0UmVzZXRSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gISFwcmVmaWxsV2FzQWlHZW5lcmF0ZWQ7XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgY29uc3QgYWN0aXZlQWN0aW9uUHJvbXB0cyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlQWN0aW9uUHJvbXB0cyh0ZW1wbGF0ZVR5cGUsIHByb21wdE92ZXJyaWRlcywgcmVwaHJhc2VUb25lcyk7XHJcbiAgICB9LCBbcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCB0ZW1wbGF0ZVR5cGVdKTtcclxuICAgIGNvbnN0IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmICghcXVlcnkpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5maWx0ZXIoKHN1Z2dlc3Rpb24pID0+IHN1Z2dlc3Rpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkpO1xyXG4gICAgfSwgW2luc3RydWN0aW9uU3VnZ2VzdGlvbnMsIGluc3RydWN0aW9uVGV4dF0pO1xyXG4gICAgY29uc3QgbWluQ2hhcnNCeUFjdGlvbiA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSUyksIChhaUFjdGlvbk1pbkNoYXJzIHx8IHt9KSk7XHJcbiAgICB9LCBbYWlBY3Rpb25NaW5DaGFyc10pO1xyXG4gICAgY29uc3QgcmVwaHJhc2VNaW5DaGFycyA9IG1pbkNoYXJzQnlBY3Rpb25bQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV0gfHxcclxuICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV07XHJcbiAgICBjb25zdCBlbWl0QUlFdmVudCA9IHVzZUNhbGxiYWNrKChuYW1lLCBwYXlsb2FkKSA9PiB7XHJcbiAgICAgICAgb25BSUV2ZW50ID09PSBudWxsIHx8IG9uQUlFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSUV2ZW50KG5hbWUsIHBheWxvYWQpO1xyXG4gICAgfSwgW29uQUlFdmVudF0pO1xyXG4gICAgY29uc3Qgc2V0RWRpdG9yVGV4dCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIHNldEN1cnJlbnRUZXh0KChwcmV2KSA9PiAocHJldiA9PT0gbmV4dFRleHQgPyBwcmV2IDogbmV4dFRleHQpKTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGVtaXRDaGFuZ2VXaXRoR3VhcmQgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlZmVycmVkSHRtbFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5leHRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIG5leHRUZXh0KTtcclxuICAgICAgICAgICAgZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChuZXh0VGV4dCkpO1xyXG4gICAgICAgICAgICB9LCAxNik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICB9LCBbb25DaGFuZ2VdKTtcclxuICAgIGNvbnN0IGNsZWFyU3VnZ2VzdGlvblNlc3Npb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0KG51bGwpO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtdKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUobnVsbCk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgPj0gTUFYX1JFUEhSQVNFX0hJR0hMSUdIVFMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuZXh0Q291bnQgPSByZXBocmFzZUhpZ2hsaWdodENvdW50ICsgMTtcclxuICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KG5leHRDb3VudCk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIGVkaXRvckluc3RhbmNlS2V5KSB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oZ2V0SGlnaGxpZ2h0U3RvcmFnZUtleShlZGl0b3JJbnN0YW5jZUtleSksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCByZXBocmFzZUhpZ2hsaWdodENvdW50XSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpKSB8fFxyXG4gICAgICAgICAgICAnMCcpO1xyXG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGNhY2hlZCkpIHtcclxuICAgICAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChjYWNoZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBlbGlnaWJsZSA9ICEhY3VycmVudFRleHQudHJpbSgpICYmIGN1cnJlbnRUZXh0Lmxlbmd0aCA+PSByZXBocmFzZU1pbkNoYXJzO1xyXG4gICAgICAgIGlmIChwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBlbGlnaWJsZTtcclxuICAgICAgICAgICAgaWYgKGVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjcm9zc2VkVGhyZXNob2xkID0gIXByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgJiYgZWxpZ2libGU7XHJcbiAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IHRydWU7XHJcbiAgICAgICAgaWYgKGNyb3NzZWRUaHJlc2hvbGQpIHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzW3N1Z2dlc3Rpb25JbmRleF0gfHwgJyc7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2IsIF9jLCBfZDtcclxuICAgICAgICBpZiAoIW9uQUlBY3Rpb25SZXF1ZXN0ICYmXHJcbiAgICAgICAgICAgICFhcGlBZGFwdGVyICYmXHJcbiAgICAgICAgICAgICghcmVxdWVzdEV4ZWN1dG9yIHx8ICFiYXNlVXJsKSkge1xyXG4gICAgICAgICAgICBvbkVycm9yID09PSBudWxsIHx8IG9uRXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRXJyb3IoJ0FJIGNvbmZpZ3VyYXRpb24gbWlzc2luZycpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY3VycmVudFRleHQudHJpbSgpKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbWluQ2hhcnNGb3JBY3Rpb24gPSBtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICA1MDtcclxuICAgICAgICBpZiAoY3VycmVudFRleHQubGVuZ3RoIDwgbWluQ2hhcnNGb3JBY3Rpb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKHJlZ2VuZXJhdGVFeGlzdGluZyAmJiAhY2FuUmVnZW5lcmF0ZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGJhc2VDb25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlID09PSAndXRpbGl0eScgJiZcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCA9PT0gQUlBY3Rpb25WYXJpYW50LlJFUEhSQVNFXHJcbiAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiYXNlQ29uZmlnKSwgeyBsYWJlbDogJ1JlcGhyYXNlJywgYmFzZVByb21wdDogVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgfSkgOiBiYXNlQ29uZmlnO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVG9uZUlkID0gdG9uZU92ZXJyaWRlSWQgfHxcclxuICAgICAgICAgICAgdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIGNvbmZpZy5kZWZhdWx0VG9uZUlkIHx8XHJcbiAgICAgICAgICAgICgoX2MgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYlswXSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmlkKTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2QgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGluSW5pdGlhbEFpUGhhc2UgPSBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudDtcclxuICAgICAgICBjb25zdCB0YWdQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25BY2NlcHQoe1xyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWNjZXB0ZWRUZXh0OiBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZTogaW5Jbml0aWFsQWlQaGFzZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoaW5Jbml0aWFsQWlQaGFzZSkge1xyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkFJVGFnQ29tcHV0ZWQgPT09IG51bGwgfHwgb25BSVRhZ0NvbXB1dGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVGFnQ29tcHV0ZWQodGFnUGF5bG9hZCk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCBzdWdnZXN0aW9uSW5kZXgsIHRlbXBsYXRlSWRdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgY29uc3QgYWN0aW9uQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgY29uc3QgdG9uZUlkID0gdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25Db25maWcuZGVmYXVsdFRvbmVJZCB8fFxyXG4gICAgICAgICAgICAgICAgKChfYiA9IChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWzBdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWQpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBhY3Rpb25Db25maWcubGFiZWwsXHJcbiAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBpc0dlbmVyYXRpbmcgJiYgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRlZDogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhY3VycmVudFRleHQudHJpbSgpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQubGVuZ3RoIDxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgNTApIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmF0aW5nIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSksXHJcbiAgICAgICAgICAgICAgICBzaG93VG9uZURyb3Bkb3duOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgISEoKF9jID0gYWN0aW9uQ29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubGVuZ3RoKSxcclxuICAgICAgICAgICAgICAgIHRvbmVzOiBhY3Rpb25Db25maWcudG9uZXMsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZDogdG9uZUlkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVuYWJsZWRBSUFjdGlvbnMsXHJcbiAgICAgICAgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMsXHJcbiAgICAgICAgYWN0aXZlQWN0aW9uUHJvbXB0cyxcclxuICAgICAgICB0b25lQnlBY3Rpb24sXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbixcclxuICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgIF0pO1xyXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBhZGRUZXh0T3JXcmFwLFxyXG4gICAgICAgICAgICBhZGRUZXh0LFxyXG4gICAgICAgICAgICBnZXQoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24sXHJcbiAgICAgICAgfTtcclxuICAgIH0sIFthZGRUZXh0T3JXcmFwLCBhZGRUZXh0LCBjdXJyZW50VGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChpbnB1dFZhbHVlIHx8ICcnKTtcclxuICAgIH0sIFtpbnB1dFZhbHVlLCBzZXRFZGl0b3JUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghbGltaXQgfHwgIW9uRXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBuZXh0RXJyb3IgPSBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdCA/IExJTUlUX1JFQUNIRUQgOiBlcnJvciAhPT0gbnVsbCAmJiBlcnJvciAhPT0gdm9pZCAwID8gZXJyb3IgOiAnJztcclxuICAgICAgICBpZiAobGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID09PSBuZXh0RXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPSBuZXh0RXJyb3I7XHJcbiAgICAgICAgb25FcnJvcihuZXh0RXJyb3IpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBlcnJvciwgbGltaXQsIG9uRXJyb3JdKTtcclxuICAgIHJldHVybiAoX2pzeHMoT3V0ZXJDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4gaGFuZGxlRmVlZGJhY2soJ2xpa2UnKSB9LCB7IGNoaWxkcmVuOiBfanN4KFRodW1ic1VwSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNsaWtlXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzbGlrZSBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKCdkaXNsaWtlJykgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSksIF9qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */",toString:K}),$=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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBa0Z5QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMsIEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG5pbXBvcnQgeyBidWlsZEFjdGlvblByb21wdCwgcmVxdWVzdEFJU3VnZ2VzdGlvbiB9IGZyb20gJy4vYWkvYXBpJztcclxuaW1wb3J0IHsgQ29udGFpbmVyLCBFZGl0b3JGb290ZXJSaWdodCwgRWRpdG9yRm9vdGVyUm93LCBFZGl0b3JGb290ZXJUaXRsZSwgT3V0ZXJDb250YWluZXIsIFRleHRTcGFjZSwgfSBmcm9tICcuL0N1c3RvbUVkaXRvci5zdHlsZWQnO1xyXG5pbXBvcnQgeyBBSUFjdGlvblZhcmlhbnQsIEFJRWRpdG9yQWN0aW9uVHlwZXMsIEVkaXRvckFjdGlvblR5cGVzLCBXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIH0gZnJvbSAnLi9XaGF0c0FwcFRleHRFZGl0b3JIZWFkZXInO1xyXG5jb25zdCBMSU1JVF9SRUFDSEVEID0gJ0NoYXJhY3RlciBsaW1pdCByZWFjaGVkJztcclxuY29uc3QgUkVQSFJBU0VfSURMRV9NUyA9IDMwMDA7XHJcbmNvbnN0IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTID0gNTtcclxuY29uc3QgTUFYX1NVR0dFU1RJT05TID0gMztcclxuY29uc3QgTEFSR0VfSU5QVVRfVEhSRVNIT0xEID0gMTIwMDtcclxuY29uc3QgVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgPSAnUmVwaHJhc2UgdGhpcyBXaGF0c0FwcCB1dGlsaXR5IHRlbXBsYXRlIHRvIGltcHJvdmUgY2xhcml0eSBhbmQgcmVhZGFiaWxpdHkgd2hpbGUgcHJlc2VydmluZyB2YXJpYWJsZXMsIGludGVudCwgYW5kIGNvbXBsaWFuY2UuJztcclxuY29uc3Qgc2tlbGV0b25QdWxzZSA9IGtleWZyYW1lcyBgXG5cdDAlIHsgb3BhY2l0eTogMC41NTsgfVxuXHQ1MCUgeyBvcGFjaXR5OiAxOyB9XG5cdDEwMCUgeyBvcGFjaXR5OiAwLjU1OyB9XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxNHB4IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogMTBweDtcblx0bWluLWhlaWdodDogMTUwcHg7XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkxpbmUgPSBzdHlsZWQuZGl2IGBcblx0aGVpZ2h0OiAxNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdHdpZHRoOiAkeyhwcm9wcykgPT4gcHJvcHMud2lkdGh9O1xuXHRiYWNrZ3JvdW5kOiAjZWNlY2VmO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25TZXNzaW9uQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG5cdHBhZGRpbmc6IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHRtYXgtaGVpZ2h0OiAyNjBweDtcblx0b3ZlcmZsb3cteTogc2Nyb2xsO1xuXHRzY3JvbGxiYXItd2lkdGg6IHRoaW47XG5cdHNjcm9sbGJhci1jb2xvcjogI2M4YzhjZiB0cmFuc3BhcmVudDtcblx0Ojotd2Via2l0LXNjcm9sbGJhciB7XG5cdFx0d2lkdGg6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcblx0XHRiYWNrZ3JvdW5kOiAjYzhjOGNmO1xuXHRcdGJvcmRlci1yYWRpdXM6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcblx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0fVxuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHR0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0ID0gc3R5bGVkLmRpdiBgXG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHR3aWR0aDogMTAwJTtcblx0bWluLWhlaWdodDogNDBweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db250cm9sc1JvdyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDZweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db3VudGVyID0gc3R5bGVkLnNwYW4gYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0Zm9udC1zaXplOiAxNHB4O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkljb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0Ym9yZGVyOiAwO1xuXHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0cGFkZGluZzogNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0Y3Vyc29yOiBwb2ludGVyO1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0dHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjEycyBlYXNlO1xuXHQ6bm90KDpkaXNhYmxlZCk6aG92ZXIge1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICR7Q09MT1JTLnN1cmZhY2UuaG92ZXJlZH07XG5cdH1cblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAwLjM1O1xuXHRcdGN1cnNvcjogbm90LWFsbG93ZWQ7XG5cdH1cbmA7XHJcbi8qKiBSZWdlbmVyYXRlIHN0YXlzIGZ1bGwgb3BhY2l0eSB3aGlsZSBkaXNhYmxlZCBzbyB0aGUgbG9hZGluZyBzaGltbWVyIHN0YXlzIHZpc2libGUgKHNhbWUgcHVsc2UgYXMgZWRpdG9yIHNrZWxldG9uKS4gKi9cclxuY29uc3QgU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24gPSBzdHlsZWQoU3VnZ2VzdGlvbkljb25CdXR0b24pIGBcblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAxO1xuXHRcdGN1cnNvcjogd2FpdDtcblx0fVxuYDtcclxuY29uc3QgUmVnZW5lcmF0ZUljb25TaGltbWVyID0gc3R5bGVkLmRpdiBgXG5cdHdpZHRoOiAxNHB4O1xuXHRoZWlnaHQ6IDE0cHg7XG5cdGJvcmRlci1yYWRpdXM6IDRweDtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0ZmxleC1zaHJpbms6IDA7XG5cdGFuaW1hdGlvbjogJHtza2VsZXRvblB1bHNlfSAxLjFzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuYDtcclxuLyoqIFNhbWUgYm90dG9tIHRvb2xiYXIgc2xvdCBhcyBgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyYCDigJQgcmVwbGFjZXMgdGhlIGZ1bGwgaWNvbi9BSSBwYW5lbCB3aGlsZSBvcGVuLiAqL1xyXG5jb25zdCBJbnN0cnVjdGlvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0cGFkZGluZzogOHB4IDEycHg7XG5cdGdhcDogMTBweDtcblx0Ym9yZGVyLXJhZGl1czogMCAwIDRweCA0cHg7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW5wdXRSb3cgPSBzdHlsZWQuZGl2IGBcblx0Ym9yZGVyOiAxcHggc29saWQgI2Y1YTRjMDtcblx0Ym9yZGVyLXJhZGl1czogMTBweDtcblx0cGFkZGluZzogOHB4IDEwcHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0ID0gc3R5bGVkLmlucHV0IGBcblx0ZmxleDogMTtcblx0bWluLXdpZHRoOiAwO1xuXHRib3JkZXI6IDA7XG5cdG91dGxpbmU6IG5vbmU7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25BY3Rpb25zID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQ2FuY2VsID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0Zm9udC13ZWlnaHQ6IDUwMDtcblx0cGFkZGluZzogMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbXByb3ZlID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICM1ZDNhNzI7XG5cdGNvbG9yOiAjNWQzYTcyO1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym9yZGVyLXJhZGl1czogOHB4O1xuXHRwYWRkaW5nOiA4cHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4xO1xuXHRmb250LXdlaWdodDogNjAwO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0ID0gc3R5bGVkLmRpdiBgXG5cdG1hcmdpbi10b3A6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDEycHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuXHRib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiA9IHN0eWxlZC5idXR0b24gYFxuXHR3aWR0aDogMTAwJTtcblx0Ym9yZGVyOiAwO1xuXHRib3JkZXItdG9wOiAxcHggc29saWQgJHtDT0xPUlMuc3Ryb2tlLnByaW1hcnl9O1xuXHRiYWNrZ3JvdW5kOiAkeyhwcm9wcykgPT4gKHByb3BzLnNlbGVjdGVkID8gJyNlNWYzZTgnIDogJ3RyYW5zcGFyZW50Jyl9O1xuXHRjb2xvcjogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjMWU2YjM0JyA6IENPTE9SUy5jb250ZW50LnByaW1hcnkpfTtcblx0dGV4dC1hbGlnbjogbGVmdDtcblx0cGFkZGluZzogMTJweCAxNHB4O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGxpbmUtaGVpZ2h0OiAxLjI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0OmZpcnN0LW9mLXR5cGUge1xuXHRcdGJvcmRlci10b3A6IDA7XG5cdH1cbmA7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgdGVtcGxhdGVUeXBlID0gJ21hcmtldGluZycsIHRlbXBsYXRlSWQsIHJlcXVlc3RFeGVjdXRvciwgYmFzZVVybCwgZW5kcG9pbnRQYXRoLCB1c2VDYXNlLCBzdG9yZUlkLCBhcGlBZGFwdGVyLCBjb252ZXJzYXRpb25JZCA9ICd3aGF0c2FwcC10ZW1wbGF0ZS1lZGl0b3InLCBzeXN0ZW1JZCA9ICd3aGF0c2FwcC13cml0ZXInLCBpbnRlbnQgPSAnZGVmYXVsdCcsIGVuYWJsZWRBSUFjdGlvbnMgPSBbXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlNIT1JURU4sXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FWFBBTkQsXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FTU9KSUZZLFxyXG4gICAgXSwgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMgPSBmYWxzZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCBhaUFjdGlvbk1pbkNoYXJzLCBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gREVGQVVMVF9JTlNUUlVDVElPTl9TVUdHRVNUSU9OUywgb25BSUV2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFJRXZlbnRcIiwgXCJvbkFJVGFnQ29tcHV0ZWRcIiwgXCJwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcIiwgXCJlZGl0b3JIZWFkZXJcIiwgXCJvbkFJVG9uZVNlbGVjdFwiLCBcIm9uQUlBY3Rpb25SZXF1ZXN0XCIsIFwib25CdWlsZEFJUHJvbXB0XCJdKTtcclxuICAgIGNvbnN0IHRleHRTcGFjZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IFtjdXJyZW50VGV4dCwgc2V0Q3VycmVudFRleHRdID0gdXNlU3RhdGUoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbaXNSZXBocmFzZUhpZ2hsaWdodGVkLCBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW3JlcGhyYXNlSGlnaGxpZ2h0Q291bnQsIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnRdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbaXNHZW5lcmF0aW5nLCBzZXRJc0dlbmVyYXRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2lzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2luc3RydWN0aW9uVGV4dCwgc2V0SW5zdHJ1Y3Rpb25UZXh0XSA9IHVzZVN0YXRlKCcnKTtcclxuICAgIGNvbnN0IFt0b25lQnlBY3Rpb24sIHNldFRvbmVCeUFjdGlvbl0gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkJhc2VUZXh0LCBzZXRTdWdnZXN0aW9uQmFzZVRleHRdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkNhbmRpZGF0ZXMsIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzXSA9IHVzZVN0YXRlKFtdKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uSW5kZXgsIHNldFN1Z2dlc3Rpb25JbmRleF0gPSB1c2VTdGF0ZSgwKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGVdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uU2Nyb2xsUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgcmVwaHJhc2VJZGxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgaGlnaGxpZ2h0UmVzZXRSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gISFwcmVmaWxsV2FzQWlHZW5lcmF0ZWQ7XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgY29uc3QgYWN0aXZlQWN0aW9uUHJvbXB0cyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlQWN0aW9uUHJvbXB0cyh0ZW1wbGF0ZVR5cGUsIHByb21wdE92ZXJyaWRlcywgcmVwaHJhc2VUb25lcyk7XHJcbiAgICB9LCBbcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCB0ZW1wbGF0ZVR5cGVdKTtcclxuICAgIGNvbnN0IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmICghcXVlcnkpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5maWx0ZXIoKHN1Z2dlc3Rpb24pID0+IHN1Z2dlc3Rpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkpO1xyXG4gICAgfSwgW2luc3RydWN0aW9uU3VnZ2VzdGlvbnMsIGluc3RydWN0aW9uVGV4dF0pO1xyXG4gICAgY29uc3QgbWluQ2hhcnNCeUFjdGlvbiA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSUyksIChhaUFjdGlvbk1pbkNoYXJzIHx8IHt9KSk7XHJcbiAgICB9LCBbYWlBY3Rpb25NaW5DaGFyc10pO1xyXG4gICAgY29uc3QgcmVwaHJhc2VNaW5DaGFycyA9IG1pbkNoYXJzQnlBY3Rpb25bQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV0gfHxcclxuICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV07XHJcbiAgICBjb25zdCBlbWl0QUlFdmVudCA9IHVzZUNhbGxiYWNrKChuYW1lLCBwYXlsb2FkKSA9PiB7XHJcbiAgICAgICAgb25BSUV2ZW50ID09PSBudWxsIHx8IG9uQUlFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSUV2ZW50KG5hbWUsIHBheWxvYWQpO1xyXG4gICAgfSwgW29uQUlFdmVudF0pO1xyXG4gICAgY29uc3Qgc2V0RWRpdG9yVGV4dCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIHNldEN1cnJlbnRUZXh0KChwcmV2KSA9PiAocHJldiA9PT0gbmV4dFRleHQgPyBwcmV2IDogbmV4dFRleHQpKTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGVtaXRDaGFuZ2VXaXRoR3VhcmQgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlZmVycmVkSHRtbFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5leHRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIG5leHRUZXh0KTtcclxuICAgICAgICAgICAgZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChuZXh0VGV4dCkpO1xyXG4gICAgICAgICAgICB9LCAxNik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICB9LCBbb25DaGFuZ2VdKTtcclxuICAgIGNvbnN0IGNsZWFyU3VnZ2VzdGlvblNlc3Npb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0KG51bGwpO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtdKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUobnVsbCk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgPj0gTUFYX1JFUEhSQVNFX0hJR0hMSUdIVFMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuZXh0Q291bnQgPSByZXBocmFzZUhpZ2hsaWdodENvdW50ICsgMTtcclxuICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KG5leHRDb3VudCk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIGVkaXRvckluc3RhbmNlS2V5KSB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oZ2V0SGlnaGxpZ2h0U3RvcmFnZUtleShlZGl0b3JJbnN0YW5jZUtleSksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCByZXBocmFzZUhpZ2hsaWdodENvdW50XSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpKSB8fFxyXG4gICAgICAgICAgICAnMCcpO1xyXG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGNhY2hlZCkpIHtcclxuICAgICAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChjYWNoZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBlbGlnaWJsZSA9ICEhY3VycmVudFRleHQudHJpbSgpICYmIGN1cnJlbnRUZXh0Lmxlbmd0aCA+PSByZXBocmFzZU1pbkNoYXJzO1xyXG4gICAgICAgIGlmIChwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBlbGlnaWJsZTtcclxuICAgICAgICAgICAgaWYgKGVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjcm9zc2VkVGhyZXNob2xkID0gIXByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgJiYgZWxpZ2libGU7XHJcbiAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IHRydWU7XHJcbiAgICAgICAgaWYgKGNyb3NzZWRUaHJlc2hvbGQpIHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzW3N1Z2dlc3Rpb25JbmRleF0gfHwgJyc7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2IsIF9jLCBfZDtcclxuICAgICAgICBpZiAoIW9uQUlBY3Rpb25SZXF1ZXN0ICYmXHJcbiAgICAgICAgICAgICFhcGlBZGFwdGVyICYmXHJcbiAgICAgICAgICAgICghcmVxdWVzdEV4ZWN1dG9yIHx8ICFiYXNlVXJsKSkge1xyXG4gICAgICAgICAgICBvbkVycm9yID09PSBudWxsIHx8IG9uRXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRXJyb3IoJ0FJIGNvbmZpZ3VyYXRpb24gbWlzc2luZycpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY3VycmVudFRleHQudHJpbSgpKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbWluQ2hhcnNGb3JBY3Rpb24gPSBtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICA1MDtcclxuICAgICAgICBpZiAoY3VycmVudFRleHQubGVuZ3RoIDwgbWluQ2hhcnNGb3JBY3Rpb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKHJlZ2VuZXJhdGVFeGlzdGluZyAmJiAhY2FuUmVnZW5lcmF0ZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGJhc2VDb25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlID09PSAndXRpbGl0eScgJiZcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCA9PT0gQUlBY3Rpb25WYXJpYW50LlJFUEhSQVNFXHJcbiAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiYXNlQ29uZmlnKSwgeyBsYWJlbDogJ1JlcGhyYXNlJywgYmFzZVByb21wdDogVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgfSkgOiBiYXNlQ29uZmlnO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVG9uZUlkID0gdG9uZU92ZXJyaWRlSWQgfHxcclxuICAgICAgICAgICAgdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIGNvbmZpZy5kZWZhdWx0VG9uZUlkIHx8XHJcbiAgICAgICAgICAgICgoX2MgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYlswXSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmlkKTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2QgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGluSW5pdGlhbEFpUGhhc2UgPSBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudDtcclxuICAgICAgICBjb25zdCB0YWdQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25BY2NlcHQoe1xyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWNjZXB0ZWRUZXh0OiBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZTogaW5Jbml0aWFsQWlQaGFzZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoaW5Jbml0aWFsQWlQaGFzZSkge1xyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkFJVGFnQ29tcHV0ZWQgPT09IG51bGwgfHwgb25BSVRhZ0NvbXB1dGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVGFnQ29tcHV0ZWQodGFnUGF5bG9hZCk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCBzdWdnZXN0aW9uSW5kZXgsIHRlbXBsYXRlSWRdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgY29uc3QgYWN0aW9uQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgY29uc3QgdG9uZUlkID0gdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25Db25maWcuZGVmYXVsdFRvbmVJZCB8fFxyXG4gICAgICAgICAgICAgICAgKChfYiA9IChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWzBdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWQpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBhY3Rpb25Db25maWcubGFiZWwsXHJcbiAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBpc0dlbmVyYXRpbmcgJiYgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRlZDogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhY3VycmVudFRleHQudHJpbSgpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQubGVuZ3RoIDxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgNTApIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmF0aW5nIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSksXHJcbiAgICAgICAgICAgICAgICBzaG93VG9uZURyb3Bkb3duOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgISEoKF9jID0gYWN0aW9uQ29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubGVuZ3RoKSxcclxuICAgICAgICAgICAgICAgIHRvbmVzOiBhY3Rpb25Db25maWcudG9uZXMsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZDogdG9uZUlkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVuYWJsZWRBSUFjdGlvbnMsXHJcbiAgICAgICAgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMsXHJcbiAgICAgICAgYWN0aXZlQWN0aW9uUHJvbXB0cyxcclxuICAgICAgICB0b25lQnlBY3Rpb24sXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbixcclxuICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgIF0pO1xyXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBhZGRUZXh0T3JXcmFwLFxyXG4gICAgICAgICAgICBhZGRUZXh0LFxyXG4gICAgICAgICAgICBnZXQoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24sXHJcbiAgICAgICAgfTtcclxuICAgIH0sIFthZGRUZXh0T3JXcmFwLCBhZGRUZXh0LCBjdXJyZW50VGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChpbnB1dFZhbHVlIHx8ICcnKTtcclxuICAgIH0sIFtpbnB1dFZhbHVlLCBzZXRFZGl0b3JUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghbGltaXQgfHwgIW9uRXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBuZXh0RXJyb3IgPSBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdCA/IExJTUlUX1JFQUNIRUQgOiBlcnJvciAhPT0gbnVsbCAmJiBlcnJvciAhPT0gdm9pZCAwID8gZXJyb3IgOiAnJztcclxuICAgICAgICBpZiAobGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID09PSBuZXh0RXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPSBuZXh0RXJyb3I7XHJcbiAgICAgICAgb25FcnJvcihuZXh0RXJyb3IpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBlcnJvciwgbGltaXQsIG9uRXJyb3JdKTtcclxuICAgIHJldHVybiAoX2pzeHMoT3V0ZXJDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4gaGFuZGxlRmVlZGJhY2soJ2xpa2UnKSB9LCB7IGNoaWxkcmVuOiBfanN4KFRodW1ic1VwSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNsaWtlXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzbGlrZSBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKCdkaXNsaWtlJykgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSksIF9qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */",toString:K}),II=I("span","production"===process.env.NODE_ENV?{target:"ea7i3sh11"}:{target:"ea7i3sh11",label:"SuggestionCounter"})("color:",a.content.primary,";font-size:14px;"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBdUZzQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMsIEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG5pbXBvcnQgeyBidWlsZEFjdGlvblByb21wdCwgcmVxdWVzdEFJU3VnZ2VzdGlvbiB9IGZyb20gJy4vYWkvYXBpJztcclxuaW1wb3J0IHsgQ29udGFpbmVyLCBFZGl0b3JGb290ZXJSaWdodCwgRWRpdG9yRm9vdGVyUm93LCBFZGl0b3JGb290ZXJUaXRsZSwgT3V0ZXJDb250YWluZXIsIFRleHRTcGFjZSwgfSBmcm9tICcuL0N1c3RvbUVkaXRvci5zdHlsZWQnO1xyXG5pbXBvcnQgeyBBSUFjdGlvblZhcmlhbnQsIEFJRWRpdG9yQWN0aW9uVHlwZXMsIEVkaXRvckFjdGlvblR5cGVzLCBXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIH0gZnJvbSAnLi9XaGF0c0FwcFRleHRFZGl0b3JIZWFkZXInO1xyXG5jb25zdCBMSU1JVF9SRUFDSEVEID0gJ0NoYXJhY3RlciBsaW1pdCByZWFjaGVkJztcclxuY29uc3QgUkVQSFJBU0VfSURMRV9NUyA9IDMwMDA7XHJcbmNvbnN0IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTID0gNTtcclxuY29uc3QgTUFYX1NVR0dFU1RJT05TID0gMztcclxuY29uc3QgTEFSR0VfSU5QVVRfVEhSRVNIT0xEID0gMTIwMDtcclxuY29uc3QgVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgPSAnUmVwaHJhc2UgdGhpcyBXaGF0c0FwcCB1dGlsaXR5IHRlbXBsYXRlIHRvIGltcHJvdmUgY2xhcml0eSBhbmQgcmVhZGFiaWxpdHkgd2hpbGUgcHJlc2VydmluZyB2YXJpYWJsZXMsIGludGVudCwgYW5kIGNvbXBsaWFuY2UuJztcclxuY29uc3Qgc2tlbGV0b25QdWxzZSA9IGtleWZyYW1lcyBgXG5cdDAlIHsgb3BhY2l0eTogMC41NTsgfVxuXHQ1MCUgeyBvcGFjaXR5OiAxOyB9XG5cdDEwMCUgeyBvcGFjaXR5OiAwLjU1OyB9XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxNHB4IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogMTBweDtcblx0bWluLWhlaWdodDogMTUwcHg7XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkxpbmUgPSBzdHlsZWQuZGl2IGBcblx0aGVpZ2h0OiAxNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdHdpZHRoOiAkeyhwcm9wcykgPT4gcHJvcHMud2lkdGh9O1xuXHRiYWNrZ3JvdW5kOiAjZWNlY2VmO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25TZXNzaW9uQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG5cdHBhZGRpbmc6IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHRtYXgtaGVpZ2h0OiAyNjBweDtcblx0b3ZlcmZsb3cteTogc2Nyb2xsO1xuXHRzY3JvbGxiYXItd2lkdGg6IHRoaW47XG5cdHNjcm9sbGJhci1jb2xvcjogI2M4YzhjZiB0cmFuc3BhcmVudDtcblx0Ojotd2Via2l0LXNjcm9sbGJhciB7XG5cdFx0d2lkdGg6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcblx0XHRiYWNrZ3JvdW5kOiAjYzhjOGNmO1xuXHRcdGJvcmRlci1yYWRpdXM6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcblx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0fVxuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHR0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0ID0gc3R5bGVkLmRpdiBgXG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHR3aWR0aDogMTAwJTtcblx0bWluLWhlaWdodDogNDBweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db250cm9sc1JvdyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDZweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db3VudGVyID0gc3R5bGVkLnNwYW4gYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0Zm9udC1zaXplOiAxNHB4O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkljb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0Ym9yZGVyOiAwO1xuXHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0cGFkZGluZzogNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0Y3Vyc29yOiBwb2ludGVyO1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0dHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjEycyBlYXNlO1xuXHQ6bm90KDpkaXNhYmxlZCk6aG92ZXIge1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICR7Q09MT1JTLnN1cmZhY2UuaG92ZXJlZH07XG5cdH1cblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAwLjM1O1xuXHRcdGN1cnNvcjogbm90LWFsbG93ZWQ7XG5cdH1cbmA7XHJcbi8qKiBSZWdlbmVyYXRlIHN0YXlzIGZ1bGwgb3BhY2l0eSB3aGlsZSBkaXNhYmxlZCBzbyB0aGUgbG9hZGluZyBzaGltbWVyIHN0YXlzIHZpc2libGUgKHNhbWUgcHVsc2UgYXMgZWRpdG9yIHNrZWxldG9uKS4gKi9cclxuY29uc3QgU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24gPSBzdHlsZWQoU3VnZ2VzdGlvbkljb25CdXR0b24pIGBcblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAxO1xuXHRcdGN1cnNvcjogd2FpdDtcblx0fVxuYDtcclxuY29uc3QgUmVnZW5lcmF0ZUljb25TaGltbWVyID0gc3R5bGVkLmRpdiBgXG5cdHdpZHRoOiAxNHB4O1xuXHRoZWlnaHQ6IDE0cHg7XG5cdGJvcmRlci1yYWRpdXM6IDRweDtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0ZmxleC1zaHJpbms6IDA7XG5cdGFuaW1hdGlvbjogJHtza2VsZXRvblB1bHNlfSAxLjFzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuYDtcclxuLyoqIFNhbWUgYm90dG9tIHRvb2xiYXIgc2xvdCBhcyBgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyYCDigJQgcmVwbGFjZXMgdGhlIGZ1bGwgaWNvbi9BSSBwYW5lbCB3aGlsZSBvcGVuLiAqL1xyXG5jb25zdCBJbnN0cnVjdGlvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0cGFkZGluZzogOHB4IDEycHg7XG5cdGdhcDogMTBweDtcblx0Ym9yZGVyLXJhZGl1czogMCAwIDRweCA0cHg7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW5wdXRSb3cgPSBzdHlsZWQuZGl2IGBcblx0Ym9yZGVyOiAxcHggc29saWQgI2Y1YTRjMDtcblx0Ym9yZGVyLXJhZGl1czogMTBweDtcblx0cGFkZGluZzogOHB4IDEwcHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0ID0gc3R5bGVkLmlucHV0IGBcblx0ZmxleDogMTtcblx0bWluLXdpZHRoOiAwO1xuXHRib3JkZXI6IDA7XG5cdG91dGxpbmU6IG5vbmU7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25BY3Rpb25zID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQ2FuY2VsID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0Zm9udC13ZWlnaHQ6IDUwMDtcblx0cGFkZGluZzogMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbXByb3ZlID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICM1ZDNhNzI7XG5cdGNvbG9yOiAjNWQzYTcyO1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym9yZGVyLXJhZGl1czogOHB4O1xuXHRwYWRkaW5nOiA4cHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4xO1xuXHRmb250LXdlaWdodDogNjAwO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0ID0gc3R5bGVkLmRpdiBgXG5cdG1hcmdpbi10b3A6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDEycHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuXHRib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiA9IHN0eWxlZC5idXR0b24gYFxuXHR3aWR0aDogMTAwJTtcblx0Ym9yZGVyOiAwO1xuXHRib3JkZXItdG9wOiAxcHggc29saWQgJHtDT0xPUlMuc3Ryb2tlLnByaW1hcnl9O1xuXHRiYWNrZ3JvdW5kOiAkeyhwcm9wcykgPT4gKHByb3BzLnNlbGVjdGVkID8gJyNlNWYzZTgnIDogJ3RyYW5zcGFyZW50Jyl9O1xuXHRjb2xvcjogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjMWU2YjM0JyA6IENPTE9SUy5jb250ZW50LnByaW1hcnkpfTtcblx0dGV4dC1hbGlnbjogbGVmdDtcblx0cGFkZGluZzogMTJweCAxNHB4O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGxpbmUtaGVpZ2h0OiAxLjI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0OmZpcnN0LW9mLXR5cGUge1xuXHRcdGJvcmRlci10b3A6IDA7XG5cdH1cbmA7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgdGVtcGxhdGVUeXBlID0gJ21hcmtldGluZycsIHRlbXBsYXRlSWQsIHJlcXVlc3RFeGVjdXRvciwgYmFzZVVybCwgZW5kcG9pbnRQYXRoLCB1c2VDYXNlLCBzdG9yZUlkLCBhcGlBZGFwdGVyLCBjb252ZXJzYXRpb25JZCA9ICd3aGF0c2FwcC10ZW1wbGF0ZS1lZGl0b3InLCBzeXN0ZW1JZCA9ICd3aGF0c2FwcC13cml0ZXInLCBpbnRlbnQgPSAnZGVmYXVsdCcsIGVuYWJsZWRBSUFjdGlvbnMgPSBbXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlNIT1JURU4sXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FWFBBTkQsXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FTU9KSUZZLFxyXG4gICAgXSwgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMgPSBmYWxzZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCBhaUFjdGlvbk1pbkNoYXJzLCBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gREVGQVVMVF9JTlNUUlVDVElPTl9TVUdHRVNUSU9OUywgb25BSUV2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFJRXZlbnRcIiwgXCJvbkFJVGFnQ29tcHV0ZWRcIiwgXCJwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcIiwgXCJlZGl0b3JIZWFkZXJcIiwgXCJvbkFJVG9uZVNlbGVjdFwiLCBcIm9uQUlBY3Rpb25SZXF1ZXN0XCIsIFwib25CdWlsZEFJUHJvbXB0XCJdKTtcclxuICAgIGNvbnN0IHRleHRTcGFjZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IFtjdXJyZW50VGV4dCwgc2V0Q3VycmVudFRleHRdID0gdXNlU3RhdGUoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbaXNSZXBocmFzZUhpZ2hsaWdodGVkLCBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW3JlcGhyYXNlSGlnaGxpZ2h0Q291bnQsIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnRdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbaXNHZW5lcmF0aW5nLCBzZXRJc0dlbmVyYXRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2lzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2luc3RydWN0aW9uVGV4dCwgc2V0SW5zdHJ1Y3Rpb25UZXh0XSA9IHVzZVN0YXRlKCcnKTtcclxuICAgIGNvbnN0IFt0b25lQnlBY3Rpb24sIHNldFRvbmVCeUFjdGlvbl0gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkJhc2VUZXh0LCBzZXRTdWdnZXN0aW9uQmFzZVRleHRdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkNhbmRpZGF0ZXMsIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzXSA9IHVzZVN0YXRlKFtdKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uSW5kZXgsIHNldFN1Z2dlc3Rpb25JbmRleF0gPSB1c2VTdGF0ZSgwKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGVdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uU2Nyb2xsUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgcmVwaHJhc2VJZGxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgaGlnaGxpZ2h0UmVzZXRSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gISFwcmVmaWxsV2FzQWlHZW5lcmF0ZWQ7XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgY29uc3QgYWN0aXZlQWN0aW9uUHJvbXB0cyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlQWN0aW9uUHJvbXB0cyh0ZW1wbGF0ZVR5cGUsIHByb21wdE92ZXJyaWRlcywgcmVwaHJhc2VUb25lcyk7XHJcbiAgICB9LCBbcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCB0ZW1wbGF0ZVR5cGVdKTtcclxuICAgIGNvbnN0IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmICghcXVlcnkpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5maWx0ZXIoKHN1Z2dlc3Rpb24pID0+IHN1Z2dlc3Rpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkpO1xyXG4gICAgfSwgW2luc3RydWN0aW9uU3VnZ2VzdGlvbnMsIGluc3RydWN0aW9uVGV4dF0pO1xyXG4gICAgY29uc3QgbWluQ2hhcnNCeUFjdGlvbiA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSUyksIChhaUFjdGlvbk1pbkNoYXJzIHx8IHt9KSk7XHJcbiAgICB9LCBbYWlBY3Rpb25NaW5DaGFyc10pO1xyXG4gICAgY29uc3QgcmVwaHJhc2VNaW5DaGFycyA9IG1pbkNoYXJzQnlBY3Rpb25bQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV0gfHxcclxuICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV07XHJcbiAgICBjb25zdCBlbWl0QUlFdmVudCA9IHVzZUNhbGxiYWNrKChuYW1lLCBwYXlsb2FkKSA9PiB7XHJcbiAgICAgICAgb25BSUV2ZW50ID09PSBudWxsIHx8IG9uQUlFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSUV2ZW50KG5hbWUsIHBheWxvYWQpO1xyXG4gICAgfSwgW29uQUlFdmVudF0pO1xyXG4gICAgY29uc3Qgc2V0RWRpdG9yVGV4dCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIHNldEN1cnJlbnRUZXh0KChwcmV2KSA9PiAocHJldiA9PT0gbmV4dFRleHQgPyBwcmV2IDogbmV4dFRleHQpKTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGVtaXRDaGFuZ2VXaXRoR3VhcmQgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlZmVycmVkSHRtbFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5leHRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIG5leHRUZXh0KTtcclxuICAgICAgICAgICAgZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChuZXh0VGV4dCkpO1xyXG4gICAgICAgICAgICB9LCAxNik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICB9LCBbb25DaGFuZ2VdKTtcclxuICAgIGNvbnN0IGNsZWFyU3VnZ2VzdGlvblNlc3Npb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0KG51bGwpO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtdKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUobnVsbCk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgPj0gTUFYX1JFUEhSQVNFX0hJR0hMSUdIVFMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuZXh0Q291bnQgPSByZXBocmFzZUhpZ2hsaWdodENvdW50ICsgMTtcclxuICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KG5leHRDb3VudCk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIGVkaXRvckluc3RhbmNlS2V5KSB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oZ2V0SGlnaGxpZ2h0U3RvcmFnZUtleShlZGl0b3JJbnN0YW5jZUtleSksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCByZXBocmFzZUhpZ2hsaWdodENvdW50XSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpKSB8fFxyXG4gICAgICAgICAgICAnMCcpO1xyXG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGNhY2hlZCkpIHtcclxuICAgICAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChjYWNoZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBlbGlnaWJsZSA9ICEhY3VycmVudFRleHQudHJpbSgpICYmIGN1cnJlbnRUZXh0Lmxlbmd0aCA+PSByZXBocmFzZU1pbkNoYXJzO1xyXG4gICAgICAgIGlmIChwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBlbGlnaWJsZTtcclxuICAgICAgICAgICAgaWYgKGVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjcm9zc2VkVGhyZXNob2xkID0gIXByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgJiYgZWxpZ2libGU7XHJcbiAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IHRydWU7XHJcbiAgICAgICAgaWYgKGNyb3NzZWRUaHJlc2hvbGQpIHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzW3N1Z2dlc3Rpb25JbmRleF0gfHwgJyc7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2IsIF9jLCBfZDtcclxuICAgICAgICBpZiAoIW9uQUlBY3Rpb25SZXF1ZXN0ICYmXHJcbiAgICAgICAgICAgICFhcGlBZGFwdGVyICYmXHJcbiAgICAgICAgICAgICghcmVxdWVzdEV4ZWN1dG9yIHx8ICFiYXNlVXJsKSkge1xyXG4gICAgICAgICAgICBvbkVycm9yID09PSBudWxsIHx8IG9uRXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRXJyb3IoJ0FJIGNvbmZpZ3VyYXRpb24gbWlzc2luZycpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY3VycmVudFRleHQudHJpbSgpKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbWluQ2hhcnNGb3JBY3Rpb24gPSBtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICA1MDtcclxuICAgICAgICBpZiAoY3VycmVudFRleHQubGVuZ3RoIDwgbWluQ2hhcnNGb3JBY3Rpb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKHJlZ2VuZXJhdGVFeGlzdGluZyAmJiAhY2FuUmVnZW5lcmF0ZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGJhc2VDb25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlID09PSAndXRpbGl0eScgJiZcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCA9PT0gQUlBY3Rpb25WYXJpYW50LlJFUEhSQVNFXHJcbiAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiYXNlQ29uZmlnKSwgeyBsYWJlbDogJ1JlcGhyYXNlJywgYmFzZVByb21wdDogVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgfSkgOiBiYXNlQ29uZmlnO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVG9uZUlkID0gdG9uZU92ZXJyaWRlSWQgfHxcclxuICAgICAgICAgICAgdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIGNvbmZpZy5kZWZhdWx0VG9uZUlkIHx8XHJcbiAgICAgICAgICAgICgoX2MgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYlswXSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmlkKTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2QgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGluSW5pdGlhbEFpUGhhc2UgPSBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudDtcclxuICAgICAgICBjb25zdCB0YWdQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25BY2NlcHQoe1xyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWNjZXB0ZWRUZXh0OiBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZTogaW5Jbml0aWFsQWlQaGFzZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoaW5Jbml0aWFsQWlQaGFzZSkge1xyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkFJVGFnQ29tcHV0ZWQgPT09IG51bGwgfHwgb25BSVRhZ0NvbXB1dGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVGFnQ29tcHV0ZWQodGFnUGF5bG9hZCk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCBzdWdnZXN0aW9uSW5kZXgsIHRlbXBsYXRlSWRdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgY29uc3QgYWN0aW9uQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgY29uc3QgdG9uZUlkID0gdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25Db25maWcuZGVmYXVsdFRvbmVJZCB8fFxyXG4gICAgICAgICAgICAgICAgKChfYiA9IChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWzBdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWQpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBhY3Rpb25Db25maWcubGFiZWwsXHJcbiAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBpc0dlbmVyYXRpbmcgJiYgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRlZDogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhY3VycmVudFRleHQudHJpbSgpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQubGVuZ3RoIDxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgNTApIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmF0aW5nIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSksXHJcbiAgICAgICAgICAgICAgICBzaG93VG9uZURyb3Bkb3duOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgISEoKF9jID0gYWN0aW9uQ29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubGVuZ3RoKSxcclxuICAgICAgICAgICAgICAgIHRvbmVzOiBhY3Rpb25Db25maWcudG9uZXMsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZDogdG9uZUlkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVuYWJsZWRBSUFjdGlvbnMsXHJcbiAgICAgICAgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMsXHJcbiAgICAgICAgYWN0aXZlQWN0aW9uUHJvbXB0cyxcclxuICAgICAgICB0b25lQnlBY3Rpb24sXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbixcclxuICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgIF0pO1xyXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBhZGRUZXh0T3JXcmFwLFxyXG4gICAgICAgICAgICBhZGRUZXh0LFxyXG4gICAgICAgICAgICBnZXQoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24sXHJcbiAgICAgICAgfTtcclxuICAgIH0sIFthZGRUZXh0T3JXcmFwLCBhZGRUZXh0LCBjdXJyZW50VGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChpbnB1dFZhbHVlIHx8ICcnKTtcclxuICAgIH0sIFtpbnB1dFZhbHVlLCBzZXRFZGl0b3JUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghbGltaXQgfHwgIW9uRXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBuZXh0RXJyb3IgPSBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdCA/IExJTUlUX1JFQUNIRUQgOiBlcnJvciAhPT0gbnVsbCAmJiBlcnJvciAhPT0gdm9pZCAwID8gZXJyb3IgOiAnJztcclxuICAgICAgICBpZiAobGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID09PSBuZXh0RXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPSBuZXh0RXJyb3I7XHJcbiAgICAgICAgb25FcnJvcihuZXh0RXJyb3IpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBlcnJvciwgbGltaXQsIG9uRXJyb3JdKTtcclxuICAgIHJldHVybiAoX2pzeHMoT3V0ZXJDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4gaGFuZGxlRmVlZGJhY2soJ2xpa2UnKSB9LCB7IGNoaWxkcmVuOiBfanN4KFRodW1ic1VwSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNsaWtlXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzbGlrZSBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKCdkaXNsaWtlJykgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSksIF9qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),gI=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:",a.content.primary,";transition:background-color 0.12s ease;:not(:disabled):hover{background-color:",a.surface.hovered,";}:disabled{opacity:0.35;cursor:not-allowed;}"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMkYyQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMsIEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG5pbXBvcnQgeyBidWlsZEFjdGlvblByb21wdCwgcmVxdWVzdEFJU3VnZ2VzdGlvbiB9IGZyb20gJy4vYWkvYXBpJztcclxuaW1wb3J0IHsgQ29udGFpbmVyLCBFZGl0b3JGb290ZXJSaWdodCwgRWRpdG9yRm9vdGVyUm93LCBFZGl0b3JGb290ZXJUaXRsZSwgT3V0ZXJDb250YWluZXIsIFRleHRTcGFjZSwgfSBmcm9tICcuL0N1c3RvbUVkaXRvci5zdHlsZWQnO1xyXG5pbXBvcnQgeyBBSUFjdGlvblZhcmlhbnQsIEFJRWRpdG9yQWN0aW9uVHlwZXMsIEVkaXRvckFjdGlvblR5cGVzLCBXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIH0gZnJvbSAnLi9XaGF0c0FwcFRleHRFZGl0b3JIZWFkZXInO1xyXG5jb25zdCBMSU1JVF9SRUFDSEVEID0gJ0NoYXJhY3RlciBsaW1pdCByZWFjaGVkJztcclxuY29uc3QgUkVQSFJBU0VfSURMRV9NUyA9IDMwMDA7XHJcbmNvbnN0IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTID0gNTtcclxuY29uc3QgTUFYX1NVR0dFU1RJT05TID0gMztcclxuY29uc3QgTEFSR0VfSU5QVVRfVEhSRVNIT0xEID0gMTIwMDtcclxuY29uc3QgVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgPSAnUmVwaHJhc2UgdGhpcyBXaGF0c0FwcCB1dGlsaXR5IHRlbXBsYXRlIHRvIGltcHJvdmUgY2xhcml0eSBhbmQgcmVhZGFiaWxpdHkgd2hpbGUgcHJlc2VydmluZyB2YXJpYWJsZXMsIGludGVudCwgYW5kIGNvbXBsaWFuY2UuJztcclxuY29uc3Qgc2tlbGV0b25QdWxzZSA9IGtleWZyYW1lcyBgXG5cdDAlIHsgb3BhY2l0eTogMC41NTsgfVxuXHQ1MCUgeyBvcGFjaXR5OiAxOyB9XG5cdDEwMCUgeyBvcGFjaXR5OiAwLjU1OyB9XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxNHB4IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogMTBweDtcblx0bWluLWhlaWdodDogMTUwcHg7XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkxpbmUgPSBzdHlsZWQuZGl2IGBcblx0aGVpZ2h0OiAxNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdHdpZHRoOiAkeyhwcm9wcykgPT4gcHJvcHMud2lkdGh9O1xuXHRiYWNrZ3JvdW5kOiAjZWNlY2VmO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25TZXNzaW9uQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG5cdHBhZGRpbmc6IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHRtYXgtaGVpZ2h0OiAyNjBweDtcblx0b3ZlcmZsb3cteTogc2Nyb2xsO1xuXHRzY3JvbGxiYXItd2lkdGg6IHRoaW47XG5cdHNjcm9sbGJhci1jb2xvcjogI2M4YzhjZiB0cmFuc3BhcmVudDtcblx0Ojotd2Via2l0LXNjcm9sbGJhciB7XG5cdFx0d2lkdGg6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcblx0XHRiYWNrZ3JvdW5kOiAjYzhjOGNmO1xuXHRcdGJvcmRlci1yYWRpdXM6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcblx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0fVxuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHR0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0ID0gc3R5bGVkLmRpdiBgXG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHR3aWR0aDogMTAwJTtcblx0bWluLWhlaWdodDogNDBweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db250cm9sc1JvdyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDZweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db3VudGVyID0gc3R5bGVkLnNwYW4gYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0Zm9udC1zaXplOiAxNHB4O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkljb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0Ym9yZGVyOiAwO1xuXHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0cGFkZGluZzogNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0Y3Vyc29yOiBwb2ludGVyO1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0dHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjEycyBlYXNlO1xuXHQ6bm90KDpkaXNhYmxlZCk6aG92ZXIge1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICR7Q09MT1JTLnN1cmZhY2UuaG92ZXJlZH07XG5cdH1cblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAwLjM1O1xuXHRcdGN1cnNvcjogbm90LWFsbG93ZWQ7XG5cdH1cbmA7XHJcbi8qKiBSZWdlbmVyYXRlIHN0YXlzIGZ1bGwgb3BhY2l0eSB3aGlsZSBkaXNhYmxlZCBzbyB0aGUgbG9hZGluZyBzaGltbWVyIHN0YXlzIHZpc2libGUgKHNhbWUgcHVsc2UgYXMgZWRpdG9yIHNrZWxldG9uKS4gKi9cclxuY29uc3QgU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24gPSBzdHlsZWQoU3VnZ2VzdGlvbkljb25CdXR0b24pIGBcblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAxO1xuXHRcdGN1cnNvcjogd2FpdDtcblx0fVxuYDtcclxuY29uc3QgUmVnZW5lcmF0ZUljb25TaGltbWVyID0gc3R5bGVkLmRpdiBgXG5cdHdpZHRoOiAxNHB4O1xuXHRoZWlnaHQ6IDE0cHg7XG5cdGJvcmRlci1yYWRpdXM6IDRweDtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0ZmxleC1zaHJpbms6IDA7XG5cdGFuaW1hdGlvbjogJHtza2VsZXRvblB1bHNlfSAxLjFzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuYDtcclxuLyoqIFNhbWUgYm90dG9tIHRvb2xiYXIgc2xvdCBhcyBgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyYCDigJQgcmVwbGFjZXMgdGhlIGZ1bGwgaWNvbi9BSSBwYW5lbCB3aGlsZSBvcGVuLiAqL1xyXG5jb25zdCBJbnN0cnVjdGlvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0cGFkZGluZzogOHB4IDEycHg7XG5cdGdhcDogMTBweDtcblx0Ym9yZGVyLXJhZGl1czogMCAwIDRweCA0cHg7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW5wdXRSb3cgPSBzdHlsZWQuZGl2IGBcblx0Ym9yZGVyOiAxcHggc29saWQgI2Y1YTRjMDtcblx0Ym9yZGVyLXJhZGl1czogMTBweDtcblx0cGFkZGluZzogOHB4IDEwcHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0ID0gc3R5bGVkLmlucHV0IGBcblx0ZmxleDogMTtcblx0bWluLXdpZHRoOiAwO1xuXHRib3JkZXI6IDA7XG5cdG91dGxpbmU6IG5vbmU7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25BY3Rpb25zID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQ2FuY2VsID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0Zm9udC13ZWlnaHQ6IDUwMDtcblx0cGFkZGluZzogMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbXByb3ZlID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICM1ZDNhNzI7XG5cdGNvbG9yOiAjNWQzYTcyO1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym9yZGVyLXJhZGl1czogOHB4O1xuXHRwYWRkaW5nOiA4cHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4xO1xuXHRmb250LXdlaWdodDogNjAwO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0ID0gc3R5bGVkLmRpdiBgXG5cdG1hcmdpbi10b3A6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDEycHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuXHRib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiA9IHN0eWxlZC5idXR0b24gYFxuXHR3aWR0aDogMTAwJTtcblx0Ym9yZGVyOiAwO1xuXHRib3JkZXItdG9wOiAxcHggc29saWQgJHtDT0xPUlMuc3Ryb2tlLnByaW1hcnl9O1xuXHRiYWNrZ3JvdW5kOiAkeyhwcm9wcykgPT4gKHByb3BzLnNlbGVjdGVkID8gJyNlNWYzZTgnIDogJ3RyYW5zcGFyZW50Jyl9O1xuXHRjb2xvcjogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjMWU2YjM0JyA6IENPTE9SUy5jb250ZW50LnByaW1hcnkpfTtcblx0dGV4dC1hbGlnbjogbGVmdDtcblx0cGFkZGluZzogMTJweCAxNHB4O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGxpbmUtaGVpZ2h0OiAxLjI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0OmZpcnN0LW9mLXR5cGUge1xuXHRcdGJvcmRlci10b3A6IDA7XG5cdH1cbmA7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgdGVtcGxhdGVUeXBlID0gJ21hcmtldGluZycsIHRlbXBsYXRlSWQsIHJlcXVlc3RFeGVjdXRvciwgYmFzZVVybCwgZW5kcG9pbnRQYXRoLCB1c2VDYXNlLCBzdG9yZUlkLCBhcGlBZGFwdGVyLCBjb252ZXJzYXRpb25JZCA9ICd3aGF0c2FwcC10ZW1wbGF0ZS1lZGl0b3InLCBzeXN0ZW1JZCA9ICd3aGF0c2FwcC13cml0ZXInLCBpbnRlbnQgPSAnZGVmYXVsdCcsIGVuYWJsZWRBSUFjdGlvbnMgPSBbXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlNIT1JURU4sXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FWFBBTkQsXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FTU9KSUZZLFxyXG4gICAgXSwgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMgPSBmYWxzZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCBhaUFjdGlvbk1pbkNoYXJzLCBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gREVGQVVMVF9JTlNUUlVDVElPTl9TVUdHRVNUSU9OUywgb25BSUV2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFJRXZlbnRcIiwgXCJvbkFJVGFnQ29tcHV0ZWRcIiwgXCJwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcIiwgXCJlZGl0b3JIZWFkZXJcIiwgXCJvbkFJVG9uZVNlbGVjdFwiLCBcIm9uQUlBY3Rpb25SZXF1ZXN0XCIsIFwib25CdWlsZEFJUHJvbXB0XCJdKTtcclxuICAgIGNvbnN0IHRleHRTcGFjZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IFtjdXJyZW50VGV4dCwgc2V0Q3VycmVudFRleHRdID0gdXNlU3RhdGUoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbaXNSZXBocmFzZUhpZ2hsaWdodGVkLCBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW3JlcGhyYXNlSGlnaGxpZ2h0Q291bnQsIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnRdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbaXNHZW5lcmF0aW5nLCBzZXRJc0dlbmVyYXRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2lzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2luc3RydWN0aW9uVGV4dCwgc2V0SW5zdHJ1Y3Rpb25UZXh0XSA9IHVzZVN0YXRlKCcnKTtcclxuICAgIGNvbnN0IFt0b25lQnlBY3Rpb24sIHNldFRvbmVCeUFjdGlvbl0gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkJhc2VUZXh0LCBzZXRTdWdnZXN0aW9uQmFzZVRleHRdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkNhbmRpZGF0ZXMsIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzXSA9IHVzZVN0YXRlKFtdKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uSW5kZXgsIHNldFN1Z2dlc3Rpb25JbmRleF0gPSB1c2VTdGF0ZSgwKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGVdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uU2Nyb2xsUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgcmVwaHJhc2VJZGxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgaGlnaGxpZ2h0UmVzZXRSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gISFwcmVmaWxsV2FzQWlHZW5lcmF0ZWQ7XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgY29uc3QgYWN0aXZlQWN0aW9uUHJvbXB0cyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlQWN0aW9uUHJvbXB0cyh0ZW1wbGF0ZVR5cGUsIHByb21wdE92ZXJyaWRlcywgcmVwaHJhc2VUb25lcyk7XHJcbiAgICB9LCBbcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCB0ZW1wbGF0ZVR5cGVdKTtcclxuICAgIGNvbnN0IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmICghcXVlcnkpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5maWx0ZXIoKHN1Z2dlc3Rpb24pID0+IHN1Z2dlc3Rpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkpO1xyXG4gICAgfSwgW2luc3RydWN0aW9uU3VnZ2VzdGlvbnMsIGluc3RydWN0aW9uVGV4dF0pO1xyXG4gICAgY29uc3QgbWluQ2hhcnNCeUFjdGlvbiA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSUyksIChhaUFjdGlvbk1pbkNoYXJzIHx8IHt9KSk7XHJcbiAgICB9LCBbYWlBY3Rpb25NaW5DaGFyc10pO1xyXG4gICAgY29uc3QgcmVwaHJhc2VNaW5DaGFycyA9IG1pbkNoYXJzQnlBY3Rpb25bQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV0gfHxcclxuICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV07XHJcbiAgICBjb25zdCBlbWl0QUlFdmVudCA9IHVzZUNhbGxiYWNrKChuYW1lLCBwYXlsb2FkKSA9PiB7XHJcbiAgICAgICAgb25BSUV2ZW50ID09PSBudWxsIHx8IG9uQUlFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSUV2ZW50KG5hbWUsIHBheWxvYWQpO1xyXG4gICAgfSwgW29uQUlFdmVudF0pO1xyXG4gICAgY29uc3Qgc2V0RWRpdG9yVGV4dCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIHNldEN1cnJlbnRUZXh0KChwcmV2KSA9PiAocHJldiA9PT0gbmV4dFRleHQgPyBwcmV2IDogbmV4dFRleHQpKTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGVtaXRDaGFuZ2VXaXRoR3VhcmQgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlZmVycmVkSHRtbFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5leHRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIG5leHRUZXh0KTtcclxuICAgICAgICAgICAgZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChuZXh0VGV4dCkpO1xyXG4gICAgICAgICAgICB9LCAxNik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICB9LCBbb25DaGFuZ2VdKTtcclxuICAgIGNvbnN0IGNsZWFyU3VnZ2VzdGlvblNlc3Npb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0KG51bGwpO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtdKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUobnVsbCk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgPj0gTUFYX1JFUEhSQVNFX0hJR0hMSUdIVFMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuZXh0Q291bnQgPSByZXBocmFzZUhpZ2hsaWdodENvdW50ICsgMTtcclxuICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KG5leHRDb3VudCk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIGVkaXRvckluc3RhbmNlS2V5KSB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oZ2V0SGlnaGxpZ2h0U3RvcmFnZUtleShlZGl0b3JJbnN0YW5jZUtleSksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCByZXBocmFzZUhpZ2hsaWdodENvdW50XSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpKSB8fFxyXG4gICAgICAgICAgICAnMCcpO1xyXG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGNhY2hlZCkpIHtcclxuICAgICAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChjYWNoZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBlbGlnaWJsZSA9ICEhY3VycmVudFRleHQudHJpbSgpICYmIGN1cnJlbnRUZXh0Lmxlbmd0aCA+PSByZXBocmFzZU1pbkNoYXJzO1xyXG4gICAgICAgIGlmIChwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBlbGlnaWJsZTtcclxuICAgICAgICAgICAgaWYgKGVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjcm9zc2VkVGhyZXNob2xkID0gIXByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgJiYgZWxpZ2libGU7XHJcbiAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IHRydWU7XHJcbiAgICAgICAgaWYgKGNyb3NzZWRUaHJlc2hvbGQpIHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzW3N1Z2dlc3Rpb25JbmRleF0gfHwgJyc7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2IsIF9jLCBfZDtcclxuICAgICAgICBpZiAoIW9uQUlBY3Rpb25SZXF1ZXN0ICYmXHJcbiAgICAgICAgICAgICFhcGlBZGFwdGVyICYmXHJcbiAgICAgICAgICAgICghcmVxdWVzdEV4ZWN1dG9yIHx8ICFiYXNlVXJsKSkge1xyXG4gICAgICAgICAgICBvbkVycm9yID09PSBudWxsIHx8IG9uRXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRXJyb3IoJ0FJIGNvbmZpZ3VyYXRpb24gbWlzc2luZycpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY3VycmVudFRleHQudHJpbSgpKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbWluQ2hhcnNGb3JBY3Rpb24gPSBtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICA1MDtcclxuICAgICAgICBpZiAoY3VycmVudFRleHQubGVuZ3RoIDwgbWluQ2hhcnNGb3JBY3Rpb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKHJlZ2VuZXJhdGVFeGlzdGluZyAmJiAhY2FuUmVnZW5lcmF0ZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGJhc2VDb25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlID09PSAndXRpbGl0eScgJiZcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCA9PT0gQUlBY3Rpb25WYXJpYW50LlJFUEhSQVNFXHJcbiAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiYXNlQ29uZmlnKSwgeyBsYWJlbDogJ1JlcGhyYXNlJywgYmFzZVByb21wdDogVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgfSkgOiBiYXNlQ29uZmlnO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVG9uZUlkID0gdG9uZU92ZXJyaWRlSWQgfHxcclxuICAgICAgICAgICAgdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIGNvbmZpZy5kZWZhdWx0VG9uZUlkIHx8XHJcbiAgICAgICAgICAgICgoX2MgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYlswXSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmlkKTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2QgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGluSW5pdGlhbEFpUGhhc2UgPSBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudDtcclxuICAgICAgICBjb25zdCB0YWdQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25BY2NlcHQoe1xyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWNjZXB0ZWRUZXh0OiBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZTogaW5Jbml0aWFsQWlQaGFzZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoaW5Jbml0aWFsQWlQaGFzZSkge1xyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkFJVGFnQ29tcHV0ZWQgPT09IG51bGwgfHwgb25BSVRhZ0NvbXB1dGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVGFnQ29tcHV0ZWQodGFnUGF5bG9hZCk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCBzdWdnZXN0aW9uSW5kZXgsIHRlbXBsYXRlSWRdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgY29uc3QgYWN0aW9uQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgY29uc3QgdG9uZUlkID0gdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25Db25maWcuZGVmYXVsdFRvbmVJZCB8fFxyXG4gICAgICAgICAgICAgICAgKChfYiA9IChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWzBdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWQpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBhY3Rpb25Db25maWcubGFiZWwsXHJcbiAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBpc0dlbmVyYXRpbmcgJiYgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRlZDogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhY3VycmVudFRleHQudHJpbSgpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQubGVuZ3RoIDxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgNTApIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmF0aW5nIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSksXHJcbiAgICAgICAgICAgICAgICBzaG93VG9uZURyb3Bkb3duOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgISEoKF9jID0gYWN0aW9uQ29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubGVuZ3RoKSxcclxuICAgICAgICAgICAgICAgIHRvbmVzOiBhY3Rpb25Db25maWcudG9uZXMsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZDogdG9uZUlkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVuYWJsZWRBSUFjdGlvbnMsXHJcbiAgICAgICAgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMsXHJcbiAgICAgICAgYWN0aXZlQWN0aW9uUHJvbXB0cyxcclxuICAgICAgICB0b25lQnlBY3Rpb24sXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbixcclxuICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgIF0pO1xyXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBhZGRUZXh0T3JXcmFwLFxyXG4gICAgICAgICAgICBhZGRUZXh0LFxyXG4gICAgICAgICAgICBnZXQoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24sXHJcbiAgICAgICAgfTtcclxuICAgIH0sIFthZGRUZXh0T3JXcmFwLCBhZGRUZXh0LCBjdXJyZW50VGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChpbnB1dFZhbHVlIHx8ICcnKTtcclxuICAgIH0sIFtpbnB1dFZhbHVlLCBzZXRFZGl0b3JUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghbGltaXQgfHwgIW9uRXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBuZXh0RXJyb3IgPSBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdCA/IExJTUlUX1JFQUNIRUQgOiBlcnJvciAhPT0gbnVsbCAmJiBlcnJvciAhPT0gdm9pZCAwID8gZXJyb3IgOiAnJztcclxuICAgICAgICBpZiAobGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID09PSBuZXh0RXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPSBuZXh0RXJyb3I7XHJcbiAgICAgICAgb25FcnJvcihuZXh0RXJyb3IpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBlcnJvciwgbGltaXQsIG9uRXJyb3JdKTtcclxuICAgIHJldHVybiAoX2pzeHMoT3V0ZXJDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4gaGFuZGxlRmVlZGJhY2soJ2xpa2UnKSB9LCB7IGNoaWxkcmVuOiBfanN4KFRodW1ic1VwSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNsaWtlXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzbGlrZSBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKCdkaXNsaWtlJykgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSksIF9qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),CI=I(gI,"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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBK0dnRSIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMsIEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG5pbXBvcnQgeyBidWlsZEFjdGlvblByb21wdCwgcmVxdWVzdEFJU3VnZ2VzdGlvbiB9IGZyb20gJy4vYWkvYXBpJztcclxuaW1wb3J0IHsgQ29udGFpbmVyLCBFZGl0b3JGb290ZXJSaWdodCwgRWRpdG9yRm9vdGVyUm93LCBFZGl0b3JGb290ZXJUaXRsZSwgT3V0ZXJDb250YWluZXIsIFRleHRTcGFjZSwgfSBmcm9tICcuL0N1c3RvbUVkaXRvci5zdHlsZWQnO1xyXG5pbXBvcnQgeyBBSUFjdGlvblZhcmlhbnQsIEFJRWRpdG9yQWN0aW9uVHlwZXMsIEVkaXRvckFjdGlvblR5cGVzLCBXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIH0gZnJvbSAnLi9XaGF0c0FwcFRleHRFZGl0b3JIZWFkZXInO1xyXG5jb25zdCBMSU1JVF9SRUFDSEVEID0gJ0NoYXJhY3RlciBsaW1pdCByZWFjaGVkJztcclxuY29uc3QgUkVQSFJBU0VfSURMRV9NUyA9IDMwMDA7XHJcbmNvbnN0IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTID0gNTtcclxuY29uc3QgTUFYX1NVR0dFU1RJT05TID0gMztcclxuY29uc3QgTEFSR0VfSU5QVVRfVEhSRVNIT0xEID0gMTIwMDtcclxuY29uc3QgVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgPSAnUmVwaHJhc2UgdGhpcyBXaGF0c0FwcCB1dGlsaXR5IHRlbXBsYXRlIHRvIGltcHJvdmUgY2xhcml0eSBhbmQgcmVhZGFiaWxpdHkgd2hpbGUgcHJlc2VydmluZyB2YXJpYWJsZXMsIGludGVudCwgYW5kIGNvbXBsaWFuY2UuJztcclxuY29uc3Qgc2tlbGV0b25QdWxzZSA9IGtleWZyYW1lcyBgXG5cdDAlIHsgb3BhY2l0eTogMC41NTsgfVxuXHQ1MCUgeyBvcGFjaXR5OiAxOyB9XG5cdDEwMCUgeyBvcGFjaXR5OiAwLjU1OyB9XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxNHB4IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogMTBweDtcblx0bWluLWhlaWdodDogMTUwcHg7XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkxpbmUgPSBzdHlsZWQuZGl2IGBcblx0aGVpZ2h0OiAxNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdHdpZHRoOiAkeyhwcm9wcykgPT4gcHJvcHMud2lkdGh9O1xuXHRiYWNrZ3JvdW5kOiAjZWNlY2VmO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25TZXNzaW9uQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG5cdHBhZGRpbmc6IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHRtYXgtaGVpZ2h0OiAyNjBweDtcblx0b3ZlcmZsb3cteTogc2Nyb2xsO1xuXHRzY3JvbGxiYXItd2lkdGg6IHRoaW47XG5cdHNjcm9sbGJhci1jb2xvcjogI2M4YzhjZiB0cmFuc3BhcmVudDtcblx0Ojotd2Via2l0LXNjcm9sbGJhciB7XG5cdFx0d2lkdGg6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcblx0XHRiYWNrZ3JvdW5kOiAjYzhjOGNmO1xuXHRcdGJvcmRlci1yYWRpdXM6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcblx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0fVxuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHR0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0ID0gc3R5bGVkLmRpdiBgXG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHR3aWR0aDogMTAwJTtcblx0bWluLWhlaWdodDogNDBweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db250cm9sc1JvdyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDZweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db3VudGVyID0gc3R5bGVkLnNwYW4gYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0Zm9udC1zaXplOiAxNHB4O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkljb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0Ym9yZGVyOiAwO1xuXHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0cGFkZGluZzogNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0Y3Vyc29yOiBwb2ludGVyO1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0dHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjEycyBlYXNlO1xuXHQ6bm90KDpkaXNhYmxlZCk6aG92ZXIge1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICR7Q09MT1JTLnN1cmZhY2UuaG92ZXJlZH07XG5cdH1cblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAwLjM1O1xuXHRcdGN1cnNvcjogbm90LWFsbG93ZWQ7XG5cdH1cbmA7XHJcbi8qKiBSZWdlbmVyYXRlIHN0YXlzIGZ1bGwgb3BhY2l0eSB3aGlsZSBkaXNhYmxlZCBzbyB0aGUgbG9hZGluZyBzaGltbWVyIHN0YXlzIHZpc2libGUgKHNhbWUgcHVsc2UgYXMgZWRpdG9yIHNrZWxldG9uKS4gKi9cclxuY29uc3QgU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24gPSBzdHlsZWQoU3VnZ2VzdGlvbkljb25CdXR0b24pIGBcblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAxO1xuXHRcdGN1cnNvcjogd2FpdDtcblx0fVxuYDtcclxuY29uc3QgUmVnZW5lcmF0ZUljb25TaGltbWVyID0gc3R5bGVkLmRpdiBgXG5cdHdpZHRoOiAxNHB4O1xuXHRoZWlnaHQ6IDE0cHg7XG5cdGJvcmRlci1yYWRpdXM6IDRweDtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0ZmxleC1zaHJpbms6IDA7XG5cdGFuaW1hdGlvbjogJHtza2VsZXRvblB1bHNlfSAxLjFzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuYDtcclxuLyoqIFNhbWUgYm90dG9tIHRvb2xiYXIgc2xvdCBhcyBgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyYCDigJQgcmVwbGFjZXMgdGhlIGZ1bGwgaWNvbi9BSSBwYW5lbCB3aGlsZSBvcGVuLiAqL1xyXG5jb25zdCBJbnN0cnVjdGlvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0cGFkZGluZzogOHB4IDEycHg7XG5cdGdhcDogMTBweDtcblx0Ym9yZGVyLXJhZGl1czogMCAwIDRweCA0cHg7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW5wdXRSb3cgPSBzdHlsZWQuZGl2IGBcblx0Ym9yZGVyOiAxcHggc29saWQgI2Y1YTRjMDtcblx0Ym9yZGVyLXJhZGl1czogMTBweDtcblx0cGFkZGluZzogOHB4IDEwcHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0ID0gc3R5bGVkLmlucHV0IGBcblx0ZmxleDogMTtcblx0bWluLXdpZHRoOiAwO1xuXHRib3JkZXI6IDA7XG5cdG91dGxpbmU6IG5vbmU7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25BY3Rpb25zID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQ2FuY2VsID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0Zm9udC13ZWlnaHQ6IDUwMDtcblx0cGFkZGluZzogMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbXByb3ZlID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICM1ZDNhNzI7XG5cdGNvbG9yOiAjNWQzYTcyO1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym9yZGVyLXJhZGl1czogOHB4O1xuXHRwYWRkaW5nOiA4cHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4xO1xuXHRmb250LXdlaWdodDogNjAwO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0ID0gc3R5bGVkLmRpdiBgXG5cdG1hcmdpbi10b3A6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDEycHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuXHRib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiA9IHN0eWxlZC5idXR0b24gYFxuXHR3aWR0aDogMTAwJTtcblx0Ym9yZGVyOiAwO1xuXHRib3JkZXItdG9wOiAxcHggc29saWQgJHtDT0xPUlMuc3Ryb2tlLnByaW1hcnl9O1xuXHRiYWNrZ3JvdW5kOiAkeyhwcm9wcykgPT4gKHByb3BzLnNlbGVjdGVkID8gJyNlNWYzZTgnIDogJ3RyYW5zcGFyZW50Jyl9O1xuXHRjb2xvcjogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjMWU2YjM0JyA6IENPTE9SUy5jb250ZW50LnByaW1hcnkpfTtcblx0dGV4dC1hbGlnbjogbGVmdDtcblx0cGFkZGluZzogMTJweCAxNHB4O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGxpbmUtaGVpZ2h0OiAxLjI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0OmZpcnN0LW9mLXR5cGUge1xuXHRcdGJvcmRlci10b3A6IDA7XG5cdH1cbmA7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgdGVtcGxhdGVUeXBlID0gJ21hcmtldGluZycsIHRlbXBsYXRlSWQsIHJlcXVlc3RFeGVjdXRvciwgYmFzZVVybCwgZW5kcG9pbnRQYXRoLCB1c2VDYXNlLCBzdG9yZUlkLCBhcGlBZGFwdGVyLCBjb252ZXJzYXRpb25JZCA9ICd3aGF0c2FwcC10ZW1wbGF0ZS1lZGl0b3InLCBzeXN0ZW1JZCA9ICd3aGF0c2FwcC13cml0ZXInLCBpbnRlbnQgPSAnZGVmYXVsdCcsIGVuYWJsZWRBSUFjdGlvbnMgPSBbXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlNIT1JURU4sXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FWFBBTkQsXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FTU9KSUZZLFxyXG4gICAgXSwgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMgPSBmYWxzZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCBhaUFjdGlvbk1pbkNoYXJzLCBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gREVGQVVMVF9JTlNUUlVDVElPTl9TVUdHRVNUSU9OUywgb25BSUV2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFJRXZlbnRcIiwgXCJvbkFJVGFnQ29tcHV0ZWRcIiwgXCJwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcIiwgXCJlZGl0b3JIZWFkZXJcIiwgXCJvbkFJVG9uZVNlbGVjdFwiLCBcIm9uQUlBY3Rpb25SZXF1ZXN0XCIsIFwib25CdWlsZEFJUHJvbXB0XCJdKTtcclxuICAgIGNvbnN0IHRleHRTcGFjZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IFtjdXJyZW50VGV4dCwgc2V0Q3VycmVudFRleHRdID0gdXNlU3RhdGUoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbaXNSZXBocmFzZUhpZ2hsaWdodGVkLCBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW3JlcGhyYXNlSGlnaGxpZ2h0Q291bnQsIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnRdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbaXNHZW5lcmF0aW5nLCBzZXRJc0dlbmVyYXRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2lzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2luc3RydWN0aW9uVGV4dCwgc2V0SW5zdHJ1Y3Rpb25UZXh0XSA9IHVzZVN0YXRlKCcnKTtcclxuICAgIGNvbnN0IFt0b25lQnlBY3Rpb24sIHNldFRvbmVCeUFjdGlvbl0gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkJhc2VUZXh0LCBzZXRTdWdnZXN0aW9uQmFzZVRleHRdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkNhbmRpZGF0ZXMsIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzXSA9IHVzZVN0YXRlKFtdKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uSW5kZXgsIHNldFN1Z2dlc3Rpb25JbmRleF0gPSB1c2VTdGF0ZSgwKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGVdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uU2Nyb2xsUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgcmVwaHJhc2VJZGxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgaGlnaGxpZ2h0UmVzZXRSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gISFwcmVmaWxsV2FzQWlHZW5lcmF0ZWQ7XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgY29uc3QgYWN0aXZlQWN0aW9uUHJvbXB0cyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlQWN0aW9uUHJvbXB0cyh0ZW1wbGF0ZVR5cGUsIHByb21wdE92ZXJyaWRlcywgcmVwaHJhc2VUb25lcyk7XHJcbiAgICB9LCBbcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCB0ZW1wbGF0ZVR5cGVdKTtcclxuICAgIGNvbnN0IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmICghcXVlcnkpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5maWx0ZXIoKHN1Z2dlc3Rpb24pID0+IHN1Z2dlc3Rpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkpO1xyXG4gICAgfSwgW2luc3RydWN0aW9uU3VnZ2VzdGlvbnMsIGluc3RydWN0aW9uVGV4dF0pO1xyXG4gICAgY29uc3QgbWluQ2hhcnNCeUFjdGlvbiA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSUyksIChhaUFjdGlvbk1pbkNoYXJzIHx8IHt9KSk7XHJcbiAgICB9LCBbYWlBY3Rpb25NaW5DaGFyc10pO1xyXG4gICAgY29uc3QgcmVwaHJhc2VNaW5DaGFycyA9IG1pbkNoYXJzQnlBY3Rpb25bQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV0gfHxcclxuICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV07XHJcbiAgICBjb25zdCBlbWl0QUlFdmVudCA9IHVzZUNhbGxiYWNrKChuYW1lLCBwYXlsb2FkKSA9PiB7XHJcbiAgICAgICAgb25BSUV2ZW50ID09PSBudWxsIHx8IG9uQUlFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSUV2ZW50KG5hbWUsIHBheWxvYWQpO1xyXG4gICAgfSwgW29uQUlFdmVudF0pO1xyXG4gICAgY29uc3Qgc2V0RWRpdG9yVGV4dCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIHNldEN1cnJlbnRUZXh0KChwcmV2KSA9PiAocHJldiA9PT0gbmV4dFRleHQgPyBwcmV2IDogbmV4dFRleHQpKTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGVtaXRDaGFuZ2VXaXRoR3VhcmQgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlZmVycmVkSHRtbFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5leHRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIG5leHRUZXh0KTtcclxuICAgICAgICAgICAgZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChuZXh0VGV4dCkpO1xyXG4gICAgICAgICAgICB9LCAxNik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICB9LCBbb25DaGFuZ2VdKTtcclxuICAgIGNvbnN0IGNsZWFyU3VnZ2VzdGlvblNlc3Npb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0KG51bGwpO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtdKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUobnVsbCk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgPj0gTUFYX1JFUEhSQVNFX0hJR0hMSUdIVFMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuZXh0Q291bnQgPSByZXBocmFzZUhpZ2hsaWdodENvdW50ICsgMTtcclxuICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KG5leHRDb3VudCk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIGVkaXRvckluc3RhbmNlS2V5KSB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oZ2V0SGlnaGxpZ2h0U3RvcmFnZUtleShlZGl0b3JJbnN0YW5jZUtleSksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCByZXBocmFzZUhpZ2hsaWdodENvdW50XSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpKSB8fFxyXG4gICAgICAgICAgICAnMCcpO1xyXG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGNhY2hlZCkpIHtcclxuICAgICAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChjYWNoZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBlbGlnaWJsZSA9ICEhY3VycmVudFRleHQudHJpbSgpICYmIGN1cnJlbnRUZXh0Lmxlbmd0aCA+PSByZXBocmFzZU1pbkNoYXJzO1xyXG4gICAgICAgIGlmIChwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBlbGlnaWJsZTtcclxuICAgICAgICAgICAgaWYgKGVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjcm9zc2VkVGhyZXNob2xkID0gIXByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgJiYgZWxpZ2libGU7XHJcbiAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IHRydWU7XHJcbiAgICAgICAgaWYgKGNyb3NzZWRUaHJlc2hvbGQpIHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzW3N1Z2dlc3Rpb25JbmRleF0gfHwgJyc7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2IsIF9jLCBfZDtcclxuICAgICAgICBpZiAoIW9uQUlBY3Rpb25SZXF1ZXN0ICYmXHJcbiAgICAgICAgICAgICFhcGlBZGFwdGVyICYmXHJcbiAgICAgICAgICAgICghcmVxdWVzdEV4ZWN1dG9yIHx8ICFiYXNlVXJsKSkge1xyXG4gICAgICAgICAgICBvbkVycm9yID09PSBudWxsIHx8IG9uRXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRXJyb3IoJ0FJIGNvbmZpZ3VyYXRpb24gbWlzc2luZycpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY3VycmVudFRleHQudHJpbSgpKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbWluQ2hhcnNGb3JBY3Rpb24gPSBtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICA1MDtcclxuICAgICAgICBpZiAoY3VycmVudFRleHQubGVuZ3RoIDwgbWluQ2hhcnNGb3JBY3Rpb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKHJlZ2VuZXJhdGVFeGlzdGluZyAmJiAhY2FuUmVnZW5lcmF0ZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGJhc2VDb25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlID09PSAndXRpbGl0eScgJiZcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCA9PT0gQUlBY3Rpb25WYXJpYW50LlJFUEhSQVNFXHJcbiAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiYXNlQ29uZmlnKSwgeyBsYWJlbDogJ1JlcGhyYXNlJywgYmFzZVByb21wdDogVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgfSkgOiBiYXNlQ29uZmlnO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVG9uZUlkID0gdG9uZU92ZXJyaWRlSWQgfHxcclxuICAgICAgICAgICAgdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIGNvbmZpZy5kZWZhdWx0VG9uZUlkIHx8XHJcbiAgICAgICAgICAgICgoX2MgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYlswXSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmlkKTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2QgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGluSW5pdGlhbEFpUGhhc2UgPSBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudDtcclxuICAgICAgICBjb25zdCB0YWdQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25BY2NlcHQoe1xyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWNjZXB0ZWRUZXh0OiBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZTogaW5Jbml0aWFsQWlQaGFzZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoaW5Jbml0aWFsQWlQaGFzZSkge1xyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkFJVGFnQ29tcHV0ZWQgPT09IG51bGwgfHwgb25BSVRhZ0NvbXB1dGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVGFnQ29tcHV0ZWQodGFnUGF5bG9hZCk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCBzdWdnZXN0aW9uSW5kZXgsIHRlbXBsYXRlSWRdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgY29uc3QgYWN0aW9uQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgY29uc3QgdG9uZUlkID0gdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25Db25maWcuZGVmYXVsdFRvbmVJZCB8fFxyXG4gICAgICAgICAgICAgICAgKChfYiA9IChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWzBdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWQpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBhY3Rpb25Db25maWcubGFiZWwsXHJcbiAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBpc0dlbmVyYXRpbmcgJiYgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRlZDogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhY3VycmVudFRleHQudHJpbSgpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQubGVuZ3RoIDxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgNTApIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmF0aW5nIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSksXHJcbiAgICAgICAgICAgICAgICBzaG93VG9uZURyb3Bkb3duOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgISEoKF9jID0gYWN0aW9uQ29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubGVuZ3RoKSxcclxuICAgICAgICAgICAgICAgIHRvbmVzOiBhY3Rpb25Db25maWcudG9uZXMsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZDogdG9uZUlkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVuYWJsZWRBSUFjdGlvbnMsXHJcbiAgICAgICAgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMsXHJcbiAgICAgICAgYWN0aXZlQWN0aW9uUHJvbXB0cyxcclxuICAgICAgICB0b25lQnlBY3Rpb24sXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbixcclxuICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgIF0pO1xyXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBhZGRUZXh0T3JXcmFwLFxyXG4gICAgICAgICAgICBhZGRUZXh0LFxyXG4gICAgICAgICAgICBnZXQoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24sXHJcbiAgICAgICAgfTtcclxuICAgIH0sIFthZGRUZXh0T3JXcmFwLCBhZGRUZXh0LCBjdXJyZW50VGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChpbnB1dFZhbHVlIHx8ICcnKTtcclxuICAgIH0sIFtpbnB1dFZhbHVlLCBzZXRFZGl0b3JUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghbGltaXQgfHwgIW9uRXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBuZXh0RXJyb3IgPSBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdCA/IExJTUlUX1JFQUNIRUQgOiBlcnJvciAhPT0gbnVsbCAmJiBlcnJvciAhPT0gdm9pZCAwID8gZXJyb3IgOiAnJztcclxuICAgICAgICBpZiAobGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID09PSBuZXh0RXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPSBuZXh0RXJyb3I7XHJcbiAgICAgICAgb25FcnJvcihuZXh0RXJyb3IpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBlcnJvciwgbGltaXQsIG9uRXJyb3JdKTtcclxuICAgIHJldHVybiAoX2pzeHMoT3V0ZXJDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4gaGFuZGxlRmVlZGJhY2soJ2xpa2UnKSB9LCB7IGNoaWxkcmVuOiBfanN4KFRodW1ic1VwSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNsaWtlXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzbGlrZSBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKCdkaXNsaWtlJykgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSksIF9qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */",toString:K}),AI=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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBcUh5QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMsIEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG5pbXBvcnQgeyBidWlsZEFjdGlvblByb21wdCwgcmVxdWVzdEFJU3VnZ2VzdGlvbiB9IGZyb20gJy4vYWkvYXBpJztcclxuaW1wb3J0IHsgQ29udGFpbmVyLCBFZGl0b3JGb290ZXJSaWdodCwgRWRpdG9yRm9vdGVyUm93LCBFZGl0b3JGb290ZXJUaXRsZSwgT3V0ZXJDb250YWluZXIsIFRleHRTcGFjZSwgfSBmcm9tICcuL0N1c3RvbUVkaXRvci5zdHlsZWQnO1xyXG5pbXBvcnQgeyBBSUFjdGlvblZhcmlhbnQsIEFJRWRpdG9yQWN0aW9uVHlwZXMsIEVkaXRvckFjdGlvblR5cGVzLCBXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIH0gZnJvbSAnLi9XaGF0c0FwcFRleHRFZGl0b3JIZWFkZXInO1xyXG5jb25zdCBMSU1JVF9SRUFDSEVEID0gJ0NoYXJhY3RlciBsaW1pdCByZWFjaGVkJztcclxuY29uc3QgUkVQSFJBU0VfSURMRV9NUyA9IDMwMDA7XHJcbmNvbnN0IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTID0gNTtcclxuY29uc3QgTUFYX1NVR0dFU1RJT05TID0gMztcclxuY29uc3QgTEFSR0VfSU5QVVRfVEhSRVNIT0xEID0gMTIwMDtcclxuY29uc3QgVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgPSAnUmVwaHJhc2UgdGhpcyBXaGF0c0FwcCB1dGlsaXR5IHRlbXBsYXRlIHRvIGltcHJvdmUgY2xhcml0eSBhbmQgcmVhZGFiaWxpdHkgd2hpbGUgcHJlc2VydmluZyB2YXJpYWJsZXMsIGludGVudCwgYW5kIGNvbXBsaWFuY2UuJztcclxuY29uc3Qgc2tlbGV0b25QdWxzZSA9IGtleWZyYW1lcyBgXG5cdDAlIHsgb3BhY2l0eTogMC41NTsgfVxuXHQ1MCUgeyBvcGFjaXR5OiAxOyB9XG5cdDEwMCUgeyBvcGFjaXR5OiAwLjU1OyB9XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxNHB4IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogMTBweDtcblx0bWluLWhlaWdodDogMTUwcHg7XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkxpbmUgPSBzdHlsZWQuZGl2IGBcblx0aGVpZ2h0OiAxNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdHdpZHRoOiAkeyhwcm9wcykgPT4gcHJvcHMud2lkdGh9O1xuXHRiYWNrZ3JvdW5kOiAjZWNlY2VmO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25TZXNzaW9uQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG5cdHBhZGRpbmc6IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHRtYXgtaGVpZ2h0OiAyNjBweDtcblx0b3ZlcmZsb3cteTogc2Nyb2xsO1xuXHRzY3JvbGxiYXItd2lkdGg6IHRoaW47XG5cdHNjcm9sbGJhci1jb2xvcjogI2M4YzhjZiB0cmFuc3BhcmVudDtcblx0Ojotd2Via2l0LXNjcm9sbGJhciB7XG5cdFx0d2lkdGg6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcblx0XHRiYWNrZ3JvdW5kOiAjYzhjOGNmO1xuXHRcdGJvcmRlci1yYWRpdXM6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcblx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0fVxuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHR0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0ID0gc3R5bGVkLmRpdiBgXG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHR3aWR0aDogMTAwJTtcblx0bWluLWhlaWdodDogNDBweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db250cm9sc1JvdyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDZweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db3VudGVyID0gc3R5bGVkLnNwYW4gYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0Zm9udC1zaXplOiAxNHB4O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkljb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0Ym9yZGVyOiAwO1xuXHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0cGFkZGluZzogNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0Y3Vyc29yOiBwb2ludGVyO1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0dHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjEycyBlYXNlO1xuXHQ6bm90KDpkaXNhYmxlZCk6aG92ZXIge1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICR7Q09MT1JTLnN1cmZhY2UuaG92ZXJlZH07XG5cdH1cblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAwLjM1O1xuXHRcdGN1cnNvcjogbm90LWFsbG93ZWQ7XG5cdH1cbmA7XHJcbi8qKiBSZWdlbmVyYXRlIHN0YXlzIGZ1bGwgb3BhY2l0eSB3aGlsZSBkaXNhYmxlZCBzbyB0aGUgbG9hZGluZyBzaGltbWVyIHN0YXlzIHZpc2libGUgKHNhbWUgcHVsc2UgYXMgZWRpdG9yIHNrZWxldG9uKS4gKi9cclxuY29uc3QgU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24gPSBzdHlsZWQoU3VnZ2VzdGlvbkljb25CdXR0b24pIGBcblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAxO1xuXHRcdGN1cnNvcjogd2FpdDtcblx0fVxuYDtcclxuY29uc3QgUmVnZW5lcmF0ZUljb25TaGltbWVyID0gc3R5bGVkLmRpdiBgXG5cdHdpZHRoOiAxNHB4O1xuXHRoZWlnaHQ6IDE0cHg7XG5cdGJvcmRlci1yYWRpdXM6IDRweDtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0ZmxleC1zaHJpbms6IDA7XG5cdGFuaW1hdGlvbjogJHtza2VsZXRvblB1bHNlfSAxLjFzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuYDtcclxuLyoqIFNhbWUgYm90dG9tIHRvb2xiYXIgc2xvdCBhcyBgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyYCDigJQgcmVwbGFjZXMgdGhlIGZ1bGwgaWNvbi9BSSBwYW5lbCB3aGlsZSBvcGVuLiAqL1xyXG5jb25zdCBJbnN0cnVjdGlvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0cGFkZGluZzogOHB4IDEycHg7XG5cdGdhcDogMTBweDtcblx0Ym9yZGVyLXJhZGl1czogMCAwIDRweCA0cHg7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW5wdXRSb3cgPSBzdHlsZWQuZGl2IGBcblx0Ym9yZGVyOiAxcHggc29saWQgI2Y1YTRjMDtcblx0Ym9yZGVyLXJhZGl1czogMTBweDtcblx0cGFkZGluZzogOHB4IDEwcHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0ID0gc3R5bGVkLmlucHV0IGBcblx0ZmxleDogMTtcblx0bWluLXdpZHRoOiAwO1xuXHRib3JkZXI6IDA7XG5cdG91dGxpbmU6IG5vbmU7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25BY3Rpb25zID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQ2FuY2VsID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0Zm9udC13ZWlnaHQ6IDUwMDtcblx0cGFkZGluZzogMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbXByb3ZlID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICM1ZDNhNzI7XG5cdGNvbG9yOiAjNWQzYTcyO1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym9yZGVyLXJhZGl1czogOHB4O1xuXHRwYWRkaW5nOiA4cHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4xO1xuXHRmb250LXdlaWdodDogNjAwO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0ID0gc3R5bGVkLmRpdiBgXG5cdG1hcmdpbi10b3A6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDEycHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuXHRib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiA9IHN0eWxlZC5idXR0b24gYFxuXHR3aWR0aDogMTAwJTtcblx0Ym9yZGVyOiAwO1xuXHRib3JkZXItdG9wOiAxcHggc29saWQgJHtDT0xPUlMuc3Ryb2tlLnByaW1hcnl9O1xuXHRiYWNrZ3JvdW5kOiAkeyhwcm9wcykgPT4gKHByb3BzLnNlbGVjdGVkID8gJyNlNWYzZTgnIDogJ3RyYW5zcGFyZW50Jyl9O1xuXHRjb2xvcjogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjMWU2YjM0JyA6IENPTE9SUy5jb250ZW50LnByaW1hcnkpfTtcblx0dGV4dC1hbGlnbjogbGVmdDtcblx0cGFkZGluZzogMTJweCAxNHB4O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGxpbmUtaGVpZ2h0OiAxLjI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0OmZpcnN0LW9mLXR5cGUge1xuXHRcdGJvcmRlci10b3A6IDA7XG5cdH1cbmA7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgdGVtcGxhdGVUeXBlID0gJ21hcmtldGluZycsIHRlbXBsYXRlSWQsIHJlcXVlc3RFeGVjdXRvciwgYmFzZVVybCwgZW5kcG9pbnRQYXRoLCB1c2VDYXNlLCBzdG9yZUlkLCBhcGlBZGFwdGVyLCBjb252ZXJzYXRpb25JZCA9ICd3aGF0c2FwcC10ZW1wbGF0ZS1lZGl0b3InLCBzeXN0ZW1JZCA9ICd3aGF0c2FwcC13cml0ZXInLCBpbnRlbnQgPSAnZGVmYXVsdCcsIGVuYWJsZWRBSUFjdGlvbnMgPSBbXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlNIT1JURU4sXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FWFBBTkQsXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FTU9KSUZZLFxyXG4gICAgXSwgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMgPSBmYWxzZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCBhaUFjdGlvbk1pbkNoYXJzLCBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gREVGQVVMVF9JTlNUUlVDVElPTl9TVUdHRVNUSU9OUywgb25BSUV2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFJRXZlbnRcIiwgXCJvbkFJVGFnQ29tcHV0ZWRcIiwgXCJwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcIiwgXCJlZGl0b3JIZWFkZXJcIiwgXCJvbkFJVG9uZVNlbGVjdFwiLCBcIm9uQUlBY3Rpb25SZXF1ZXN0XCIsIFwib25CdWlsZEFJUHJvbXB0XCJdKTtcclxuICAgIGNvbnN0IHRleHRTcGFjZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IFtjdXJyZW50VGV4dCwgc2V0Q3VycmVudFRleHRdID0gdXNlU3RhdGUoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbaXNSZXBocmFzZUhpZ2hsaWdodGVkLCBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW3JlcGhyYXNlSGlnaGxpZ2h0Q291bnQsIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnRdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbaXNHZW5lcmF0aW5nLCBzZXRJc0dlbmVyYXRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2lzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2luc3RydWN0aW9uVGV4dCwgc2V0SW5zdHJ1Y3Rpb25UZXh0XSA9IHVzZVN0YXRlKCcnKTtcclxuICAgIGNvbnN0IFt0b25lQnlBY3Rpb24sIHNldFRvbmVCeUFjdGlvbl0gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkJhc2VUZXh0LCBzZXRTdWdnZXN0aW9uQmFzZVRleHRdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkNhbmRpZGF0ZXMsIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzXSA9IHVzZVN0YXRlKFtdKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uSW5kZXgsIHNldFN1Z2dlc3Rpb25JbmRleF0gPSB1c2VTdGF0ZSgwKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGVdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uU2Nyb2xsUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgcmVwaHJhc2VJZGxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgaGlnaGxpZ2h0UmVzZXRSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gISFwcmVmaWxsV2FzQWlHZW5lcmF0ZWQ7XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgY29uc3QgYWN0aXZlQWN0aW9uUHJvbXB0cyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlQWN0aW9uUHJvbXB0cyh0ZW1wbGF0ZVR5cGUsIHByb21wdE92ZXJyaWRlcywgcmVwaHJhc2VUb25lcyk7XHJcbiAgICB9LCBbcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCB0ZW1wbGF0ZVR5cGVdKTtcclxuICAgIGNvbnN0IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmICghcXVlcnkpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5maWx0ZXIoKHN1Z2dlc3Rpb24pID0+IHN1Z2dlc3Rpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkpO1xyXG4gICAgfSwgW2luc3RydWN0aW9uU3VnZ2VzdGlvbnMsIGluc3RydWN0aW9uVGV4dF0pO1xyXG4gICAgY29uc3QgbWluQ2hhcnNCeUFjdGlvbiA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSUyksIChhaUFjdGlvbk1pbkNoYXJzIHx8IHt9KSk7XHJcbiAgICB9LCBbYWlBY3Rpb25NaW5DaGFyc10pO1xyXG4gICAgY29uc3QgcmVwaHJhc2VNaW5DaGFycyA9IG1pbkNoYXJzQnlBY3Rpb25bQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV0gfHxcclxuICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV07XHJcbiAgICBjb25zdCBlbWl0QUlFdmVudCA9IHVzZUNhbGxiYWNrKChuYW1lLCBwYXlsb2FkKSA9PiB7XHJcbiAgICAgICAgb25BSUV2ZW50ID09PSBudWxsIHx8IG9uQUlFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSUV2ZW50KG5hbWUsIHBheWxvYWQpO1xyXG4gICAgfSwgW29uQUlFdmVudF0pO1xyXG4gICAgY29uc3Qgc2V0RWRpdG9yVGV4dCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIHNldEN1cnJlbnRUZXh0KChwcmV2KSA9PiAocHJldiA9PT0gbmV4dFRleHQgPyBwcmV2IDogbmV4dFRleHQpKTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGVtaXRDaGFuZ2VXaXRoR3VhcmQgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlZmVycmVkSHRtbFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5leHRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIG5leHRUZXh0KTtcclxuICAgICAgICAgICAgZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChuZXh0VGV4dCkpO1xyXG4gICAgICAgICAgICB9LCAxNik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICB9LCBbb25DaGFuZ2VdKTtcclxuICAgIGNvbnN0IGNsZWFyU3VnZ2VzdGlvblNlc3Npb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0KG51bGwpO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtdKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUobnVsbCk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgPj0gTUFYX1JFUEhSQVNFX0hJR0hMSUdIVFMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuZXh0Q291bnQgPSByZXBocmFzZUhpZ2hsaWdodENvdW50ICsgMTtcclxuICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KG5leHRDb3VudCk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIGVkaXRvckluc3RhbmNlS2V5KSB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oZ2V0SGlnaGxpZ2h0U3RvcmFnZUtleShlZGl0b3JJbnN0YW5jZUtleSksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCByZXBocmFzZUhpZ2hsaWdodENvdW50XSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpKSB8fFxyXG4gICAgICAgICAgICAnMCcpO1xyXG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGNhY2hlZCkpIHtcclxuICAgICAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChjYWNoZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBlbGlnaWJsZSA9ICEhY3VycmVudFRleHQudHJpbSgpICYmIGN1cnJlbnRUZXh0Lmxlbmd0aCA+PSByZXBocmFzZU1pbkNoYXJzO1xyXG4gICAgICAgIGlmIChwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBlbGlnaWJsZTtcclxuICAgICAgICAgICAgaWYgKGVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjcm9zc2VkVGhyZXNob2xkID0gIXByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgJiYgZWxpZ2libGU7XHJcbiAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IHRydWU7XHJcbiAgICAgICAgaWYgKGNyb3NzZWRUaHJlc2hvbGQpIHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzW3N1Z2dlc3Rpb25JbmRleF0gfHwgJyc7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2IsIF9jLCBfZDtcclxuICAgICAgICBpZiAoIW9uQUlBY3Rpb25SZXF1ZXN0ICYmXHJcbiAgICAgICAgICAgICFhcGlBZGFwdGVyICYmXHJcbiAgICAgICAgICAgICghcmVxdWVzdEV4ZWN1dG9yIHx8ICFiYXNlVXJsKSkge1xyXG4gICAgICAgICAgICBvbkVycm9yID09PSBudWxsIHx8IG9uRXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRXJyb3IoJ0FJIGNvbmZpZ3VyYXRpb24gbWlzc2luZycpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY3VycmVudFRleHQudHJpbSgpKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbWluQ2hhcnNGb3JBY3Rpb24gPSBtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICA1MDtcclxuICAgICAgICBpZiAoY3VycmVudFRleHQubGVuZ3RoIDwgbWluQ2hhcnNGb3JBY3Rpb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKHJlZ2VuZXJhdGVFeGlzdGluZyAmJiAhY2FuUmVnZW5lcmF0ZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGJhc2VDb25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlID09PSAndXRpbGl0eScgJiZcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCA9PT0gQUlBY3Rpb25WYXJpYW50LlJFUEhSQVNFXHJcbiAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiYXNlQ29uZmlnKSwgeyBsYWJlbDogJ1JlcGhyYXNlJywgYmFzZVByb21wdDogVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgfSkgOiBiYXNlQ29uZmlnO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVG9uZUlkID0gdG9uZU92ZXJyaWRlSWQgfHxcclxuICAgICAgICAgICAgdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIGNvbmZpZy5kZWZhdWx0VG9uZUlkIHx8XHJcbiAgICAgICAgICAgICgoX2MgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYlswXSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmlkKTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2QgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGluSW5pdGlhbEFpUGhhc2UgPSBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudDtcclxuICAgICAgICBjb25zdCB0YWdQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25BY2NlcHQoe1xyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWNjZXB0ZWRUZXh0OiBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZTogaW5Jbml0aWFsQWlQaGFzZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoaW5Jbml0aWFsQWlQaGFzZSkge1xyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkFJVGFnQ29tcHV0ZWQgPT09IG51bGwgfHwgb25BSVRhZ0NvbXB1dGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVGFnQ29tcHV0ZWQodGFnUGF5bG9hZCk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCBzdWdnZXN0aW9uSW5kZXgsIHRlbXBsYXRlSWRdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgY29uc3QgYWN0aW9uQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgY29uc3QgdG9uZUlkID0gdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25Db25maWcuZGVmYXVsdFRvbmVJZCB8fFxyXG4gICAgICAgICAgICAgICAgKChfYiA9IChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWzBdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWQpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBhY3Rpb25Db25maWcubGFiZWwsXHJcbiAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBpc0dlbmVyYXRpbmcgJiYgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRlZDogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhY3VycmVudFRleHQudHJpbSgpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQubGVuZ3RoIDxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgNTApIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmF0aW5nIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSksXHJcbiAgICAgICAgICAgICAgICBzaG93VG9uZURyb3Bkb3duOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgISEoKF9jID0gYWN0aW9uQ29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubGVuZ3RoKSxcclxuICAgICAgICAgICAgICAgIHRvbmVzOiBhY3Rpb25Db25maWcudG9uZXMsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZDogdG9uZUlkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVuYWJsZWRBSUFjdGlvbnMsXHJcbiAgICAgICAgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMsXHJcbiAgICAgICAgYWN0aXZlQWN0aW9uUHJvbXB0cyxcclxuICAgICAgICB0b25lQnlBY3Rpb24sXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbixcclxuICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgIF0pO1xyXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBhZGRUZXh0T3JXcmFwLFxyXG4gICAgICAgICAgICBhZGRUZXh0LFxyXG4gICAgICAgICAgICBnZXQoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24sXHJcbiAgICAgICAgfTtcclxuICAgIH0sIFthZGRUZXh0T3JXcmFwLCBhZGRUZXh0LCBjdXJyZW50VGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChpbnB1dFZhbHVlIHx8ICcnKTtcclxuICAgIH0sIFtpbnB1dFZhbHVlLCBzZXRFZGl0b3JUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghbGltaXQgfHwgIW9uRXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBuZXh0RXJyb3IgPSBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdCA/IExJTUlUX1JFQUNIRUQgOiBlcnJvciAhPT0gbnVsbCAmJiBlcnJvciAhPT0gdm9pZCAwID8gZXJyb3IgOiAnJztcclxuICAgICAgICBpZiAobGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID09PSBuZXh0RXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPSBuZXh0RXJyb3I7XHJcbiAgICAgICAgb25FcnJvcihuZXh0RXJyb3IpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBlcnJvciwgbGltaXQsIG9uRXJyb3JdKTtcclxuICAgIHJldHVybiAoX2pzeHMoT3V0ZXJDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4gaGFuZGxlRmVlZGJhY2soJ2xpa2UnKSB9LCB7IGNoaWxkcmVuOiBfanN4KFRodW1ic1VwSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNsaWtlXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzbGlrZSBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKCdkaXNsaWtlJykgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSksIF9qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),cI=I("div","production"===process.env.NODE_ENV?{target:"ea7i3sh7"}:{target:"ea7i3sh7",label:"InstructionContainer"})("background:",a.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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBOEh3QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMsIEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG5pbXBvcnQgeyBidWlsZEFjdGlvblByb21wdCwgcmVxdWVzdEFJU3VnZ2VzdGlvbiB9IGZyb20gJy4vYWkvYXBpJztcclxuaW1wb3J0IHsgQ29udGFpbmVyLCBFZGl0b3JGb290ZXJSaWdodCwgRWRpdG9yRm9vdGVyUm93LCBFZGl0b3JGb290ZXJUaXRsZSwgT3V0ZXJDb250YWluZXIsIFRleHRTcGFjZSwgfSBmcm9tICcuL0N1c3RvbUVkaXRvci5zdHlsZWQnO1xyXG5pbXBvcnQgeyBBSUFjdGlvblZhcmlhbnQsIEFJRWRpdG9yQWN0aW9uVHlwZXMsIEVkaXRvckFjdGlvblR5cGVzLCBXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIH0gZnJvbSAnLi9XaGF0c0FwcFRleHRFZGl0b3JIZWFkZXInO1xyXG5jb25zdCBMSU1JVF9SRUFDSEVEID0gJ0NoYXJhY3RlciBsaW1pdCByZWFjaGVkJztcclxuY29uc3QgUkVQSFJBU0VfSURMRV9NUyA9IDMwMDA7XHJcbmNvbnN0IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTID0gNTtcclxuY29uc3QgTUFYX1NVR0dFU1RJT05TID0gMztcclxuY29uc3QgTEFSR0VfSU5QVVRfVEhSRVNIT0xEID0gMTIwMDtcclxuY29uc3QgVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgPSAnUmVwaHJhc2UgdGhpcyBXaGF0c0FwcCB1dGlsaXR5IHRlbXBsYXRlIHRvIGltcHJvdmUgY2xhcml0eSBhbmQgcmVhZGFiaWxpdHkgd2hpbGUgcHJlc2VydmluZyB2YXJpYWJsZXMsIGludGVudCwgYW5kIGNvbXBsaWFuY2UuJztcclxuY29uc3Qgc2tlbGV0b25QdWxzZSA9IGtleWZyYW1lcyBgXG5cdDAlIHsgb3BhY2l0eTogMC41NTsgfVxuXHQ1MCUgeyBvcGFjaXR5OiAxOyB9XG5cdDEwMCUgeyBvcGFjaXR5OiAwLjU1OyB9XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxNHB4IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogMTBweDtcblx0bWluLWhlaWdodDogMTUwcHg7XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkxpbmUgPSBzdHlsZWQuZGl2IGBcblx0aGVpZ2h0OiAxNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdHdpZHRoOiAkeyhwcm9wcykgPT4gcHJvcHMud2lkdGh9O1xuXHRiYWNrZ3JvdW5kOiAjZWNlY2VmO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25TZXNzaW9uQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG5cdHBhZGRpbmc6IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHRtYXgtaGVpZ2h0OiAyNjBweDtcblx0b3ZlcmZsb3cteTogc2Nyb2xsO1xuXHRzY3JvbGxiYXItd2lkdGg6IHRoaW47XG5cdHNjcm9sbGJhci1jb2xvcjogI2M4YzhjZiB0cmFuc3BhcmVudDtcblx0Ojotd2Via2l0LXNjcm9sbGJhciB7XG5cdFx0d2lkdGg6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcblx0XHRiYWNrZ3JvdW5kOiAjYzhjOGNmO1xuXHRcdGJvcmRlci1yYWRpdXM6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcblx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0fVxuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHR0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0ID0gc3R5bGVkLmRpdiBgXG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHR3aWR0aDogMTAwJTtcblx0bWluLWhlaWdodDogNDBweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db250cm9sc1JvdyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDZweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db3VudGVyID0gc3R5bGVkLnNwYW4gYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0Zm9udC1zaXplOiAxNHB4O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkljb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0Ym9yZGVyOiAwO1xuXHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0cGFkZGluZzogNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0Y3Vyc29yOiBwb2ludGVyO1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0dHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjEycyBlYXNlO1xuXHQ6bm90KDpkaXNhYmxlZCk6aG92ZXIge1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICR7Q09MT1JTLnN1cmZhY2UuaG92ZXJlZH07XG5cdH1cblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAwLjM1O1xuXHRcdGN1cnNvcjogbm90LWFsbG93ZWQ7XG5cdH1cbmA7XHJcbi8qKiBSZWdlbmVyYXRlIHN0YXlzIGZ1bGwgb3BhY2l0eSB3aGlsZSBkaXNhYmxlZCBzbyB0aGUgbG9hZGluZyBzaGltbWVyIHN0YXlzIHZpc2libGUgKHNhbWUgcHVsc2UgYXMgZWRpdG9yIHNrZWxldG9uKS4gKi9cclxuY29uc3QgU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24gPSBzdHlsZWQoU3VnZ2VzdGlvbkljb25CdXR0b24pIGBcblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAxO1xuXHRcdGN1cnNvcjogd2FpdDtcblx0fVxuYDtcclxuY29uc3QgUmVnZW5lcmF0ZUljb25TaGltbWVyID0gc3R5bGVkLmRpdiBgXG5cdHdpZHRoOiAxNHB4O1xuXHRoZWlnaHQ6IDE0cHg7XG5cdGJvcmRlci1yYWRpdXM6IDRweDtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0ZmxleC1zaHJpbms6IDA7XG5cdGFuaW1hdGlvbjogJHtza2VsZXRvblB1bHNlfSAxLjFzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuYDtcclxuLyoqIFNhbWUgYm90dG9tIHRvb2xiYXIgc2xvdCBhcyBgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyYCDigJQgcmVwbGFjZXMgdGhlIGZ1bGwgaWNvbi9BSSBwYW5lbCB3aGlsZSBvcGVuLiAqL1xyXG5jb25zdCBJbnN0cnVjdGlvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0cGFkZGluZzogOHB4IDEycHg7XG5cdGdhcDogMTBweDtcblx0Ym9yZGVyLXJhZGl1czogMCAwIDRweCA0cHg7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW5wdXRSb3cgPSBzdHlsZWQuZGl2IGBcblx0Ym9yZGVyOiAxcHggc29saWQgI2Y1YTRjMDtcblx0Ym9yZGVyLXJhZGl1czogMTBweDtcblx0cGFkZGluZzogOHB4IDEwcHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0ID0gc3R5bGVkLmlucHV0IGBcblx0ZmxleDogMTtcblx0bWluLXdpZHRoOiAwO1xuXHRib3JkZXI6IDA7XG5cdG91dGxpbmU6IG5vbmU7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25BY3Rpb25zID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQ2FuY2VsID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0Zm9udC13ZWlnaHQ6IDUwMDtcblx0cGFkZGluZzogMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbXByb3ZlID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICM1ZDNhNzI7XG5cdGNvbG9yOiAjNWQzYTcyO1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym9yZGVyLXJhZGl1czogOHB4O1xuXHRwYWRkaW5nOiA4cHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4xO1xuXHRmb250LXdlaWdodDogNjAwO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0ID0gc3R5bGVkLmRpdiBgXG5cdG1hcmdpbi10b3A6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDEycHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuXHRib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiA9IHN0eWxlZC5idXR0b24gYFxuXHR3aWR0aDogMTAwJTtcblx0Ym9yZGVyOiAwO1xuXHRib3JkZXItdG9wOiAxcHggc29saWQgJHtDT0xPUlMuc3Ryb2tlLnByaW1hcnl9O1xuXHRiYWNrZ3JvdW5kOiAkeyhwcm9wcykgPT4gKHByb3BzLnNlbGVjdGVkID8gJyNlNWYzZTgnIDogJ3RyYW5zcGFyZW50Jyl9O1xuXHRjb2xvcjogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjMWU2YjM0JyA6IENPTE9SUy5jb250ZW50LnByaW1hcnkpfTtcblx0dGV4dC1hbGlnbjogbGVmdDtcblx0cGFkZGluZzogMTJweCAxNHB4O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGxpbmUtaGVpZ2h0OiAxLjI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0OmZpcnN0LW9mLXR5cGUge1xuXHRcdGJvcmRlci10b3A6IDA7XG5cdH1cbmA7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgdGVtcGxhdGVUeXBlID0gJ21hcmtldGluZycsIHRlbXBsYXRlSWQsIHJlcXVlc3RFeGVjdXRvciwgYmFzZVVybCwgZW5kcG9pbnRQYXRoLCB1c2VDYXNlLCBzdG9yZUlkLCBhcGlBZGFwdGVyLCBjb252ZXJzYXRpb25JZCA9ICd3aGF0c2FwcC10ZW1wbGF0ZS1lZGl0b3InLCBzeXN0ZW1JZCA9ICd3aGF0c2FwcC13cml0ZXInLCBpbnRlbnQgPSAnZGVmYXVsdCcsIGVuYWJsZWRBSUFjdGlvbnMgPSBbXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlNIT1JURU4sXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FWFBBTkQsXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FTU9KSUZZLFxyXG4gICAgXSwgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMgPSBmYWxzZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCBhaUFjdGlvbk1pbkNoYXJzLCBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gREVGQVVMVF9JTlNUUlVDVElPTl9TVUdHRVNUSU9OUywgb25BSUV2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFJRXZlbnRcIiwgXCJvbkFJVGFnQ29tcHV0ZWRcIiwgXCJwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcIiwgXCJlZGl0b3JIZWFkZXJcIiwgXCJvbkFJVG9uZVNlbGVjdFwiLCBcIm9uQUlBY3Rpb25SZXF1ZXN0XCIsIFwib25CdWlsZEFJUHJvbXB0XCJdKTtcclxuICAgIGNvbnN0IHRleHRTcGFjZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IFtjdXJyZW50VGV4dCwgc2V0Q3VycmVudFRleHRdID0gdXNlU3RhdGUoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbaXNSZXBocmFzZUhpZ2hsaWdodGVkLCBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW3JlcGhyYXNlSGlnaGxpZ2h0Q291bnQsIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnRdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbaXNHZW5lcmF0aW5nLCBzZXRJc0dlbmVyYXRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2lzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2luc3RydWN0aW9uVGV4dCwgc2V0SW5zdHJ1Y3Rpb25UZXh0XSA9IHVzZVN0YXRlKCcnKTtcclxuICAgIGNvbnN0IFt0b25lQnlBY3Rpb24sIHNldFRvbmVCeUFjdGlvbl0gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkJhc2VUZXh0LCBzZXRTdWdnZXN0aW9uQmFzZVRleHRdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkNhbmRpZGF0ZXMsIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzXSA9IHVzZVN0YXRlKFtdKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uSW5kZXgsIHNldFN1Z2dlc3Rpb25JbmRleF0gPSB1c2VTdGF0ZSgwKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGVdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uU2Nyb2xsUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgcmVwaHJhc2VJZGxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgaGlnaGxpZ2h0UmVzZXRSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gISFwcmVmaWxsV2FzQWlHZW5lcmF0ZWQ7XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgY29uc3QgYWN0aXZlQWN0aW9uUHJvbXB0cyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlQWN0aW9uUHJvbXB0cyh0ZW1wbGF0ZVR5cGUsIHByb21wdE92ZXJyaWRlcywgcmVwaHJhc2VUb25lcyk7XHJcbiAgICB9LCBbcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCB0ZW1wbGF0ZVR5cGVdKTtcclxuICAgIGNvbnN0IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmICghcXVlcnkpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5maWx0ZXIoKHN1Z2dlc3Rpb24pID0+IHN1Z2dlc3Rpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkpO1xyXG4gICAgfSwgW2luc3RydWN0aW9uU3VnZ2VzdGlvbnMsIGluc3RydWN0aW9uVGV4dF0pO1xyXG4gICAgY29uc3QgbWluQ2hhcnNCeUFjdGlvbiA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSUyksIChhaUFjdGlvbk1pbkNoYXJzIHx8IHt9KSk7XHJcbiAgICB9LCBbYWlBY3Rpb25NaW5DaGFyc10pO1xyXG4gICAgY29uc3QgcmVwaHJhc2VNaW5DaGFycyA9IG1pbkNoYXJzQnlBY3Rpb25bQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV0gfHxcclxuICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV07XHJcbiAgICBjb25zdCBlbWl0QUlFdmVudCA9IHVzZUNhbGxiYWNrKChuYW1lLCBwYXlsb2FkKSA9PiB7XHJcbiAgICAgICAgb25BSUV2ZW50ID09PSBudWxsIHx8IG9uQUlFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSUV2ZW50KG5hbWUsIHBheWxvYWQpO1xyXG4gICAgfSwgW29uQUlFdmVudF0pO1xyXG4gICAgY29uc3Qgc2V0RWRpdG9yVGV4dCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIHNldEN1cnJlbnRUZXh0KChwcmV2KSA9PiAocHJldiA9PT0gbmV4dFRleHQgPyBwcmV2IDogbmV4dFRleHQpKTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGVtaXRDaGFuZ2VXaXRoR3VhcmQgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlZmVycmVkSHRtbFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5leHRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIG5leHRUZXh0KTtcclxuICAgICAgICAgICAgZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChuZXh0VGV4dCkpO1xyXG4gICAgICAgICAgICB9LCAxNik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICB9LCBbb25DaGFuZ2VdKTtcclxuICAgIGNvbnN0IGNsZWFyU3VnZ2VzdGlvblNlc3Npb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0KG51bGwpO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtdKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUobnVsbCk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgPj0gTUFYX1JFUEhSQVNFX0hJR0hMSUdIVFMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuZXh0Q291bnQgPSByZXBocmFzZUhpZ2hsaWdodENvdW50ICsgMTtcclxuICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KG5leHRDb3VudCk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIGVkaXRvckluc3RhbmNlS2V5KSB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oZ2V0SGlnaGxpZ2h0U3RvcmFnZUtleShlZGl0b3JJbnN0YW5jZUtleSksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCByZXBocmFzZUhpZ2hsaWdodENvdW50XSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpKSB8fFxyXG4gICAgICAgICAgICAnMCcpO1xyXG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGNhY2hlZCkpIHtcclxuICAgICAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChjYWNoZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBlbGlnaWJsZSA9ICEhY3VycmVudFRleHQudHJpbSgpICYmIGN1cnJlbnRUZXh0Lmxlbmd0aCA+PSByZXBocmFzZU1pbkNoYXJzO1xyXG4gICAgICAgIGlmIChwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBlbGlnaWJsZTtcclxuICAgICAgICAgICAgaWYgKGVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjcm9zc2VkVGhyZXNob2xkID0gIXByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgJiYgZWxpZ2libGU7XHJcbiAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IHRydWU7XHJcbiAgICAgICAgaWYgKGNyb3NzZWRUaHJlc2hvbGQpIHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzW3N1Z2dlc3Rpb25JbmRleF0gfHwgJyc7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2IsIF9jLCBfZDtcclxuICAgICAgICBpZiAoIW9uQUlBY3Rpb25SZXF1ZXN0ICYmXHJcbiAgICAgICAgICAgICFhcGlBZGFwdGVyICYmXHJcbiAgICAgICAgICAgICghcmVxdWVzdEV4ZWN1dG9yIHx8ICFiYXNlVXJsKSkge1xyXG4gICAgICAgICAgICBvbkVycm9yID09PSBudWxsIHx8IG9uRXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRXJyb3IoJ0FJIGNvbmZpZ3VyYXRpb24gbWlzc2luZycpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY3VycmVudFRleHQudHJpbSgpKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbWluQ2hhcnNGb3JBY3Rpb24gPSBtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICA1MDtcclxuICAgICAgICBpZiAoY3VycmVudFRleHQubGVuZ3RoIDwgbWluQ2hhcnNGb3JBY3Rpb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKHJlZ2VuZXJhdGVFeGlzdGluZyAmJiAhY2FuUmVnZW5lcmF0ZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGJhc2VDb25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlID09PSAndXRpbGl0eScgJiZcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCA9PT0gQUlBY3Rpb25WYXJpYW50LlJFUEhSQVNFXHJcbiAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiYXNlQ29uZmlnKSwgeyBsYWJlbDogJ1JlcGhyYXNlJywgYmFzZVByb21wdDogVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgfSkgOiBiYXNlQ29uZmlnO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVG9uZUlkID0gdG9uZU92ZXJyaWRlSWQgfHxcclxuICAgICAgICAgICAgdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIGNvbmZpZy5kZWZhdWx0VG9uZUlkIHx8XHJcbiAgICAgICAgICAgICgoX2MgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYlswXSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmlkKTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2QgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGluSW5pdGlhbEFpUGhhc2UgPSBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudDtcclxuICAgICAgICBjb25zdCB0YWdQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25BY2NlcHQoe1xyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWNjZXB0ZWRUZXh0OiBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZTogaW5Jbml0aWFsQWlQaGFzZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoaW5Jbml0aWFsQWlQaGFzZSkge1xyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkFJVGFnQ29tcHV0ZWQgPT09IG51bGwgfHwgb25BSVRhZ0NvbXB1dGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVGFnQ29tcHV0ZWQodGFnUGF5bG9hZCk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCBzdWdnZXN0aW9uSW5kZXgsIHRlbXBsYXRlSWRdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgY29uc3QgYWN0aW9uQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgY29uc3QgdG9uZUlkID0gdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25Db25maWcuZGVmYXVsdFRvbmVJZCB8fFxyXG4gICAgICAgICAgICAgICAgKChfYiA9IChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWzBdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWQpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBhY3Rpb25Db25maWcubGFiZWwsXHJcbiAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBpc0dlbmVyYXRpbmcgJiYgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRlZDogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhY3VycmVudFRleHQudHJpbSgpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQubGVuZ3RoIDxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgNTApIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmF0aW5nIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSksXHJcbiAgICAgICAgICAgICAgICBzaG93VG9uZURyb3Bkb3duOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgISEoKF9jID0gYWN0aW9uQ29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubGVuZ3RoKSxcclxuICAgICAgICAgICAgICAgIHRvbmVzOiBhY3Rpb25Db25maWcudG9uZXMsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZDogdG9uZUlkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVuYWJsZWRBSUFjdGlvbnMsXHJcbiAgICAgICAgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMsXHJcbiAgICAgICAgYWN0aXZlQWN0aW9uUHJvbXB0cyxcclxuICAgICAgICB0b25lQnlBY3Rpb24sXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbixcclxuICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgIF0pO1xyXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBhZGRUZXh0T3JXcmFwLFxyXG4gICAgICAgICAgICBhZGRUZXh0LFxyXG4gICAgICAgICAgICBnZXQoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24sXHJcbiAgICAgICAgfTtcclxuICAgIH0sIFthZGRUZXh0T3JXcmFwLCBhZGRUZXh0LCBjdXJyZW50VGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChpbnB1dFZhbHVlIHx8ICcnKTtcclxuICAgIH0sIFtpbnB1dFZhbHVlLCBzZXRFZGl0b3JUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghbGltaXQgfHwgIW9uRXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBuZXh0RXJyb3IgPSBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdCA/IExJTUlUX1JFQUNIRUQgOiBlcnJvciAhPT0gbnVsbCAmJiBlcnJvciAhPT0gdm9pZCAwID8gZXJyb3IgOiAnJztcclxuICAgICAgICBpZiAobGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID09PSBuZXh0RXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPSBuZXh0RXJyb3I7XHJcbiAgICAgICAgb25FcnJvcihuZXh0RXJyb3IpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBlcnJvciwgbGltaXQsIG9uRXJyb3JdKTtcclxuICAgIHJldHVybiAoX2pzeHMoT3V0ZXJDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4gaGFuZGxlRmVlZGJhY2soJ2xpa2UnKSB9LCB7IGNoaWxkcmVuOiBfanN4KFRodW1ic1VwSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNsaWtlXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzbGlrZSBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKCdkaXNsaWtlJykgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSksIF9qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),lI=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:",a.surface.standard,";"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBdUl1QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMsIEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG5pbXBvcnQgeyBidWlsZEFjdGlvblByb21wdCwgcmVxdWVzdEFJU3VnZ2VzdGlvbiB9IGZyb20gJy4vYWkvYXBpJztcclxuaW1wb3J0IHsgQ29udGFpbmVyLCBFZGl0b3JGb290ZXJSaWdodCwgRWRpdG9yRm9vdGVyUm93LCBFZGl0b3JGb290ZXJUaXRsZSwgT3V0ZXJDb250YWluZXIsIFRleHRTcGFjZSwgfSBmcm9tICcuL0N1c3RvbUVkaXRvci5zdHlsZWQnO1xyXG5pbXBvcnQgeyBBSUFjdGlvblZhcmlhbnQsIEFJRWRpdG9yQWN0aW9uVHlwZXMsIEVkaXRvckFjdGlvblR5cGVzLCBXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIH0gZnJvbSAnLi9XaGF0c0FwcFRleHRFZGl0b3JIZWFkZXInO1xyXG5jb25zdCBMSU1JVF9SRUFDSEVEID0gJ0NoYXJhY3RlciBsaW1pdCByZWFjaGVkJztcclxuY29uc3QgUkVQSFJBU0VfSURMRV9NUyA9IDMwMDA7XHJcbmNvbnN0IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTID0gNTtcclxuY29uc3QgTUFYX1NVR0dFU1RJT05TID0gMztcclxuY29uc3QgTEFSR0VfSU5QVVRfVEhSRVNIT0xEID0gMTIwMDtcclxuY29uc3QgVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgPSAnUmVwaHJhc2UgdGhpcyBXaGF0c0FwcCB1dGlsaXR5IHRlbXBsYXRlIHRvIGltcHJvdmUgY2xhcml0eSBhbmQgcmVhZGFiaWxpdHkgd2hpbGUgcHJlc2VydmluZyB2YXJpYWJsZXMsIGludGVudCwgYW5kIGNvbXBsaWFuY2UuJztcclxuY29uc3Qgc2tlbGV0b25QdWxzZSA9IGtleWZyYW1lcyBgXG5cdDAlIHsgb3BhY2l0eTogMC41NTsgfVxuXHQ1MCUgeyBvcGFjaXR5OiAxOyB9XG5cdDEwMCUgeyBvcGFjaXR5OiAwLjU1OyB9XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxNHB4IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogMTBweDtcblx0bWluLWhlaWdodDogMTUwcHg7XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkxpbmUgPSBzdHlsZWQuZGl2IGBcblx0aGVpZ2h0OiAxNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdHdpZHRoOiAkeyhwcm9wcykgPT4gcHJvcHMud2lkdGh9O1xuXHRiYWNrZ3JvdW5kOiAjZWNlY2VmO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25TZXNzaW9uQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG5cdHBhZGRpbmc6IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHRtYXgtaGVpZ2h0OiAyNjBweDtcblx0b3ZlcmZsb3cteTogc2Nyb2xsO1xuXHRzY3JvbGxiYXItd2lkdGg6IHRoaW47XG5cdHNjcm9sbGJhci1jb2xvcjogI2M4YzhjZiB0cmFuc3BhcmVudDtcblx0Ojotd2Via2l0LXNjcm9sbGJhciB7XG5cdFx0d2lkdGg6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcblx0XHRiYWNrZ3JvdW5kOiAjYzhjOGNmO1xuXHRcdGJvcmRlci1yYWRpdXM6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcblx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0fVxuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHR0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0ID0gc3R5bGVkLmRpdiBgXG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHR3aWR0aDogMTAwJTtcblx0bWluLWhlaWdodDogNDBweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db250cm9sc1JvdyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDZweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db3VudGVyID0gc3R5bGVkLnNwYW4gYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0Zm9udC1zaXplOiAxNHB4O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkljb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0Ym9yZGVyOiAwO1xuXHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0cGFkZGluZzogNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0Y3Vyc29yOiBwb2ludGVyO1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0dHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjEycyBlYXNlO1xuXHQ6bm90KDpkaXNhYmxlZCk6aG92ZXIge1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICR7Q09MT1JTLnN1cmZhY2UuaG92ZXJlZH07XG5cdH1cblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAwLjM1O1xuXHRcdGN1cnNvcjogbm90LWFsbG93ZWQ7XG5cdH1cbmA7XHJcbi8qKiBSZWdlbmVyYXRlIHN0YXlzIGZ1bGwgb3BhY2l0eSB3aGlsZSBkaXNhYmxlZCBzbyB0aGUgbG9hZGluZyBzaGltbWVyIHN0YXlzIHZpc2libGUgKHNhbWUgcHVsc2UgYXMgZWRpdG9yIHNrZWxldG9uKS4gKi9cclxuY29uc3QgU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24gPSBzdHlsZWQoU3VnZ2VzdGlvbkljb25CdXR0b24pIGBcblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAxO1xuXHRcdGN1cnNvcjogd2FpdDtcblx0fVxuYDtcclxuY29uc3QgUmVnZW5lcmF0ZUljb25TaGltbWVyID0gc3R5bGVkLmRpdiBgXG5cdHdpZHRoOiAxNHB4O1xuXHRoZWlnaHQ6IDE0cHg7XG5cdGJvcmRlci1yYWRpdXM6IDRweDtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0ZmxleC1zaHJpbms6IDA7XG5cdGFuaW1hdGlvbjogJHtza2VsZXRvblB1bHNlfSAxLjFzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuYDtcclxuLyoqIFNhbWUgYm90dG9tIHRvb2xiYXIgc2xvdCBhcyBgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyYCDigJQgcmVwbGFjZXMgdGhlIGZ1bGwgaWNvbi9BSSBwYW5lbCB3aGlsZSBvcGVuLiAqL1xyXG5jb25zdCBJbnN0cnVjdGlvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0cGFkZGluZzogOHB4IDEycHg7XG5cdGdhcDogMTBweDtcblx0Ym9yZGVyLXJhZGl1czogMCAwIDRweCA0cHg7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW5wdXRSb3cgPSBzdHlsZWQuZGl2IGBcblx0Ym9yZGVyOiAxcHggc29saWQgI2Y1YTRjMDtcblx0Ym9yZGVyLXJhZGl1czogMTBweDtcblx0cGFkZGluZzogOHB4IDEwcHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0ID0gc3R5bGVkLmlucHV0IGBcblx0ZmxleDogMTtcblx0bWluLXdpZHRoOiAwO1xuXHRib3JkZXI6IDA7XG5cdG91dGxpbmU6IG5vbmU7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25BY3Rpb25zID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQ2FuY2VsID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0Zm9udC13ZWlnaHQ6IDUwMDtcblx0cGFkZGluZzogMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbXByb3ZlID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICM1ZDNhNzI7XG5cdGNvbG9yOiAjNWQzYTcyO1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym9yZGVyLXJhZGl1czogOHB4O1xuXHRwYWRkaW5nOiA4cHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4xO1xuXHRmb250LXdlaWdodDogNjAwO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0ID0gc3R5bGVkLmRpdiBgXG5cdG1hcmdpbi10b3A6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDEycHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuXHRib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiA9IHN0eWxlZC5idXR0b24gYFxuXHR3aWR0aDogMTAwJTtcblx0Ym9yZGVyOiAwO1xuXHRib3JkZXItdG9wOiAxcHggc29saWQgJHtDT0xPUlMuc3Ryb2tlLnByaW1hcnl9O1xuXHRiYWNrZ3JvdW5kOiAkeyhwcm9wcykgPT4gKHByb3BzLnNlbGVjdGVkID8gJyNlNWYzZTgnIDogJ3RyYW5zcGFyZW50Jyl9O1xuXHRjb2xvcjogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjMWU2YjM0JyA6IENPTE9SUy5jb250ZW50LnByaW1hcnkpfTtcblx0dGV4dC1hbGlnbjogbGVmdDtcblx0cGFkZGluZzogMTJweCAxNHB4O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGxpbmUtaGVpZ2h0OiAxLjI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0OmZpcnN0LW9mLXR5cGUge1xuXHRcdGJvcmRlci10b3A6IDA7XG5cdH1cbmA7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgdGVtcGxhdGVUeXBlID0gJ21hcmtldGluZycsIHRlbXBsYXRlSWQsIHJlcXVlc3RFeGVjdXRvciwgYmFzZVVybCwgZW5kcG9pbnRQYXRoLCB1c2VDYXNlLCBzdG9yZUlkLCBhcGlBZGFwdGVyLCBjb252ZXJzYXRpb25JZCA9ICd3aGF0c2FwcC10ZW1wbGF0ZS1lZGl0b3InLCBzeXN0ZW1JZCA9ICd3aGF0c2FwcC13cml0ZXInLCBpbnRlbnQgPSAnZGVmYXVsdCcsIGVuYWJsZWRBSUFjdGlvbnMgPSBbXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlNIT1JURU4sXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FWFBBTkQsXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FTU9KSUZZLFxyXG4gICAgXSwgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMgPSBmYWxzZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCBhaUFjdGlvbk1pbkNoYXJzLCBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gREVGQVVMVF9JTlNUUlVDVElPTl9TVUdHRVNUSU9OUywgb25BSUV2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFJRXZlbnRcIiwgXCJvbkFJVGFnQ29tcHV0ZWRcIiwgXCJwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcIiwgXCJlZGl0b3JIZWFkZXJcIiwgXCJvbkFJVG9uZVNlbGVjdFwiLCBcIm9uQUlBY3Rpb25SZXF1ZXN0XCIsIFwib25CdWlsZEFJUHJvbXB0XCJdKTtcclxuICAgIGNvbnN0IHRleHRTcGFjZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IFtjdXJyZW50VGV4dCwgc2V0Q3VycmVudFRleHRdID0gdXNlU3RhdGUoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbaXNSZXBocmFzZUhpZ2hsaWdodGVkLCBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW3JlcGhyYXNlSGlnaGxpZ2h0Q291bnQsIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnRdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbaXNHZW5lcmF0aW5nLCBzZXRJc0dlbmVyYXRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2lzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2luc3RydWN0aW9uVGV4dCwgc2V0SW5zdHJ1Y3Rpb25UZXh0XSA9IHVzZVN0YXRlKCcnKTtcclxuICAgIGNvbnN0IFt0b25lQnlBY3Rpb24sIHNldFRvbmVCeUFjdGlvbl0gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkJhc2VUZXh0LCBzZXRTdWdnZXN0aW9uQmFzZVRleHRdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkNhbmRpZGF0ZXMsIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzXSA9IHVzZVN0YXRlKFtdKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uSW5kZXgsIHNldFN1Z2dlc3Rpb25JbmRleF0gPSB1c2VTdGF0ZSgwKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGVdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uU2Nyb2xsUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgcmVwaHJhc2VJZGxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgaGlnaGxpZ2h0UmVzZXRSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gISFwcmVmaWxsV2FzQWlHZW5lcmF0ZWQ7XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgY29uc3QgYWN0aXZlQWN0aW9uUHJvbXB0cyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlQWN0aW9uUHJvbXB0cyh0ZW1wbGF0ZVR5cGUsIHByb21wdE92ZXJyaWRlcywgcmVwaHJhc2VUb25lcyk7XHJcbiAgICB9LCBbcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCB0ZW1wbGF0ZVR5cGVdKTtcclxuICAgIGNvbnN0IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmICghcXVlcnkpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5maWx0ZXIoKHN1Z2dlc3Rpb24pID0+IHN1Z2dlc3Rpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkpO1xyXG4gICAgfSwgW2luc3RydWN0aW9uU3VnZ2VzdGlvbnMsIGluc3RydWN0aW9uVGV4dF0pO1xyXG4gICAgY29uc3QgbWluQ2hhcnNCeUFjdGlvbiA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSUyksIChhaUFjdGlvbk1pbkNoYXJzIHx8IHt9KSk7XHJcbiAgICB9LCBbYWlBY3Rpb25NaW5DaGFyc10pO1xyXG4gICAgY29uc3QgcmVwaHJhc2VNaW5DaGFycyA9IG1pbkNoYXJzQnlBY3Rpb25bQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV0gfHxcclxuICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV07XHJcbiAgICBjb25zdCBlbWl0QUlFdmVudCA9IHVzZUNhbGxiYWNrKChuYW1lLCBwYXlsb2FkKSA9PiB7XHJcbiAgICAgICAgb25BSUV2ZW50ID09PSBudWxsIHx8IG9uQUlFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSUV2ZW50KG5hbWUsIHBheWxvYWQpO1xyXG4gICAgfSwgW29uQUlFdmVudF0pO1xyXG4gICAgY29uc3Qgc2V0RWRpdG9yVGV4dCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIHNldEN1cnJlbnRUZXh0KChwcmV2KSA9PiAocHJldiA9PT0gbmV4dFRleHQgPyBwcmV2IDogbmV4dFRleHQpKTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGVtaXRDaGFuZ2VXaXRoR3VhcmQgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlZmVycmVkSHRtbFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5leHRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIG5leHRUZXh0KTtcclxuICAgICAgICAgICAgZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChuZXh0VGV4dCkpO1xyXG4gICAgICAgICAgICB9LCAxNik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICB9LCBbb25DaGFuZ2VdKTtcclxuICAgIGNvbnN0IGNsZWFyU3VnZ2VzdGlvblNlc3Npb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0KG51bGwpO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtdKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUobnVsbCk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgPj0gTUFYX1JFUEhSQVNFX0hJR0hMSUdIVFMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuZXh0Q291bnQgPSByZXBocmFzZUhpZ2hsaWdodENvdW50ICsgMTtcclxuICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KG5leHRDb3VudCk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIGVkaXRvckluc3RhbmNlS2V5KSB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oZ2V0SGlnaGxpZ2h0U3RvcmFnZUtleShlZGl0b3JJbnN0YW5jZUtleSksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCByZXBocmFzZUhpZ2hsaWdodENvdW50XSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpKSB8fFxyXG4gICAgICAgICAgICAnMCcpO1xyXG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGNhY2hlZCkpIHtcclxuICAgICAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChjYWNoZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBlbGlnaWJsZSA9ICEhY3VycmVudFRleHQudHJpbSgpICYmIGN1cnJlbnRUZXh0Lmxlbmd0aCA+PSByZXBocmFzZU1pbkNoYXJzO1xyXG4gICAgICAgIGlmIChwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBlbGlnaWJsZTtcclxuICAgICAgICAgICAgaWYgKGVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjcm9zc2VkVGhyZXNob2xkID0gIXByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgJiYgZWxpZ2libGU7XHJcbiAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IHRydWU7XHJcbiAgICAgICAgaWYgKGNyb3NzZWRUaHJlc2hvbGQpIHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzW3N1Z2dlc3Rpb25JbmRleF0gfHwgJyc7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2IsIF9jLCBfZDtcclxuICAgICAgICBpZiAoIW9uQUlBY3Rpb25SZXF1ZXN0ICYmXHJcbiAgICAgICAgICAgICFhcGlBZGFwdGVyICYmXHJcbiAgICAgICAgICAgICghcmVxdWVzdEV4ZWN1dG9yIHx8ICFiYXNlVXJsKSkge1xyXG4gICAgICAgICAgICBvbkVycm9yID09PSBudWxsIHx8IG9uRXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRXJyb3IoJ0FJIGNvbmZpZ3VyYXRpb24gbWlzc2luZycpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY3VycmVudFRleHQudHJpbSgpKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbWluQ2hhcnNGb3JBY3Rpb24gPSBtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICA1MDtcclxuICAgICAgICBpZiAoY3VycmVudFRleHQubGVuZ3RoIDwgbWluQ2hhcnNGb3JBY3Rpb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKHJlZ2VuZXJhdGVFeGlzdGluZyAmJiAhY2FuUmVnZW5lcmF0ZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGJhc2VDb25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlID09PSAndXRpbGl0eScgJiZcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCA9PT0gQUlBY3Rpb25WYXJpYW50LlJFUEhSQVNFXHJcbiAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiYXNlQ29uZmlnKSwgeyBsYWJlbDogJ1JlcGhyYXNlJywgYmFzZVByb21wdDogVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgfSkgOiBiYXNlQ29uZmlnO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVG9uZUlkID0gdG9uZU92ZXJyaWRlSWQgfHxcclxuICAgICAgICAgICAgdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIGNvbmZpZy5kZWZhdWx0VG9uZUlkIHx8XHJcbiAgICAgICAgICAgICgoX2MgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYlswXSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmlkKTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2QgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGluSW5pdGlhbEFpUGhhc2UgPSBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudDtcclxuICAgICAgICBjb25zdCB0YWdQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25BY2NlcHQoe1xyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWNjZXB0ZWRUZXh0OiBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZTogaW5Jbml0aWFsQWlQaGFzZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoaW5Jbml0aWFsQWlQaGFzZSkge1xyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkFJVGFnQ29tcHV0ZWQgPT09IG51bGwgfHwgb25BSVRhZ0NvbXB1dGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVGFnQ29tcHV0ZWQodGFnUGF5bG9hZCk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCBzdWdnZXN0aW9uSW5kZXgsIHRlbXBsYXRlSWRdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgY29uc3QgYWN0aW9uQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgY29uc3QgdG9uZUlkID0gdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25Db25maWcuZGVmYXVsdFRvbmVJZCB8fFxyXG4gICAgICAgICAgICAgICAgKChfYiA9IChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWzBdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWQpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBhY3Rpb25Db25maWcubGFiZWwsXHJcbiAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBpc0dlbmVyYXRpbmcgJiYgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRlZDogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhY3VycmVudFRleHQudHJpbSgpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQubGVuZ3RoIDxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgNTApIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmF0aW5nIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSksXHJcbiAgICAgICAgICAgICAgICBzaG93VG9uZURyb3Bkb3duOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgISEoKF9jID0gYWN0aW9uQ29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubGVuZ3RoKSxcclxuICAgICAgICAgICAgICAgIHRvbmVzOiBhY3Rpb25Db25maWcudG9uZXMsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZDogdG9uZUlkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVuYWJsZWRBSUFjdGlvbnMsXHJcbiAgICAgICAgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMsXHJcbiAgICAgICAgYWN0aXZlQWN0aW9uUHJvbXB0cyxcclxuICAgICAgICB0b25lQnlBY3Rpb24sXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbixcclxuICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgIF0pO1xyXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBhZGRUZXh0T3JXcmFwLFxyXG4gICAgICAgICAgICBhZGRUZXh0LFxyXG4gICAgICAgICAgICBnZXQoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24sXHJcbiAgICAgICAgfTtcclxuICAgIH0sIFthZGRUZXh0T3JXcmFwLCBhZGRUZXh0LCBjdXJyZW50VGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChpbnB1dFZhbHVlIHx8ICcnKTtcclxuICAgIH0sIFtpbnB1dFZhbHVlLCBzZXRFZGl0b3JUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghbGltaXQgfHwgIW9uRXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBuZXh0RXJyb3IgPSBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdCA/IExJTUlUX1JFQUNIRUQgOiBlcnJvciAhPT0gbnVsbCAmJiBlcnJvciAhPT0gdm9pZCAwID8gZXJyb3IgOiAnJztcclxuICAgICAgICBpZiAobGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID09PSBuZXh0RXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPSBuZXh0RXJyb3I7XHJcbiAgICAgICAgb25FcnJvcihuZXh0RXJyb3IpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBlcnJvciwgbGltaXQsIG9uRXJyb3JdKTtcclxuICAgIHJldHVybiAoX2pzeHMoT3V0ZXJDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4gaGFuZGxlRmVlZGJhY2soJ2xpa2UnKSB9LCB7IGNoaWxkcmVuOiBfanN4KFRodW1ic1VwSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNsaWtlXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzbGlrZSBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKCdkaXNsaWtlJykgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSksIF9qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),bI=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:",a.content.primary,";"+("production"===process.env.NODE_ENV?"":"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZ0pzQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMsIEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG5pbXBvcnQgeyBidWlsZEFjdGlvblByb21wdCwgcmVxdWVzdEFJU3VnZ2VzdGlvbiB9IGZyb20gJy4vYWkvYXBpJztcclxuaW1wb3J0IHsgQ29udGFpbmVyLCBFZGl0b3JGb290ZXJSaWdodCwgRWRpdG9yRm9vdGVyUm93LCBFZGl0b3JGb290ZXJUaXRsZSwgT3V0ZXJDb250YWluZXIsIFRleHRTcGFjZSwgfSBmcm9tICcuL0N1c3RvbUVkaXRvci5zdHlsZWQnO1xyXG5pbXBvcnQgeyBBSUFjdGlvblZhcmlhbnQsIEFJRWRpdG9yQWN0aW9uVHlwZXMsIEVkaXRvckFjdGlvblR5cGVzLCBXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIH0gZnJvbSAnLi9XaGF0c0FwcFRleHRFZGl0b3JIZWFkZXInO1xyXG5jb25zdCBMSU1JVF9SRUFDSEVEID0gJ0NoYXJhY3RlciBsaW1pdCByZWFjaGVkJztcclxuY29uc3QgUkVQSFJBU0VfSURMRV9NUyA9IDMwMDA7XHJcbmNvbnN0IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTID0gNTtcclxuY29uc3QgTUFYX1NVR0dFU1RJT05TID0gMztcclxuY29uc3QgTEFSR0VfSU5QVVRfVEhSRVNIT0xEID0gMTIwMDtcclxuY29uc3QgVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgPSAnUmVwaHJhc2UgdGhpcyBXaGF0c0FwcCB1dGlsaXR5IHRlbXBsYXRlIHRvIGltcHJvdmUgY2xhcml0eSBhbmQgcmVhZGFiaWxpdHkgd2hpbGUgcHJlc2VydmluZyB2YXJpYWJsZXMsIGludGVudCwgYW5kIGNvbXBsaWFuY2UuJztcclxuY29uc3Qgc2tlbGV0b25QdWxzZSA9IGtleWZyYW1lcyBgXG5cdDAlIHsgb3BhY2l0eTogMC41NTsgfVxuXHQ1MCUgeyBvcGFjaXR5OiAxOyB9XG5cdDEwMCUgeyBvcGFjaXR5OiAwLjU1OyB9XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxNHB4IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogMTBweDtcblx0bWluLWhlaWdodDogMTUwcHg7XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkxpbmUgPSBzdHlsZWQuZGl2IGBcblx0aGVpZ2h0OiAxNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdHdpZHRoOiAkeyhwcm9wcykgPT4gcHJvcHMud2lkdGh9O1xuXHRiYWNrZ3JvdW5kOiAjZWNlY2VmO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25TZXNzaW9uQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG5cdHBhZGRpbmc6IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHRtYXgtaGVpZ2h0OiAyNjBweDtcblx0b3ZlcmZsb3cteTogc2Nyb2xsO1xuXHRzY3JvbGxiYXItd2lkdGg6IHRoaW47XG5cdHNjcm9sbGJhci1jb2xvcjogI2M4YzhjZiB0cmFuc3BhcmVudDtcblx0Ojotd2Via2l0LXNjcm9sbGJhciB7XG5cdFx0d2lkdGg6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcblx0XHRiYWNrZ3JvdW5kOiAjYzhjOGNmO1xuXHRcdGJvcmRlci1yYWRpdXM6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcblx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0fVxuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHR0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0ID0gc3R5bGVkLmRpdiBgXG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHR3aWR0aDogMTAwJTtcblx0bWluLWhlaWdodDogNDBweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db250cm9sc1JvdyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDZweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db3VudGVyID0gc3R5bGVkLnNwYW4gYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0Zm9udC1zaXplOiAxNHB4O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkljb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0Ym9yZGVyOiAwO1xuXHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0cGFkZGluZzogNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0Y3Vyc29yOiBwb2ludGVyO1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0dHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjEycyBlYXNlO1xuXHQ6bm90KDpkaXNhYmxlZCk6aG92ZXIge1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICR7Q09MT1JTLnN1cmZhY2UuaG92ZXJlZH07XG5cdH1cblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAwLjM1O1xuXHRcdGN1cnNvcjogbm90LWFsbG93ZWQ7XG5cdH1cbmA7XHJcbi8qKiBSZWdlbmVyYXRlIHN0YXlzIGZ1bGwgb3BhY2l0eSB3aGlsZSBkaXNhYmxlZCBzbyB0aGUgbG9hZGluZyBzaGltbWVyIHN0YXlzIHZpc2libGUgKHNhbWUgcHVsc2UgYXMgZWRpdG9yIHNrZWxldG9uKS4gKi9cclxuY29uc3QgU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24gPSBzdHlsZWQoU3VnZ2VzdGlvbkljb25CdXR0b24pIGBcblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAxO1xuXHRcdGN1cnNvcjogd2FpdDtcblx0fVxuYDtcclxuY29uc3QgUmVnZW5lcmF0ZUljb25TaGltbWVyID0gc3R5bGVkLmRpdiBgXG5cdHdpZHRoOiAxNHB4O1xuXHRoZWlnaHQ6IDE0cHg7XG5cdGJvcmRlci1yYWRpdXM6IDRweDtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0ZmxleC1zaHJpbms6IDA7XG5cdGFuaW1hdGlvbjogJHtza2VsZXRvblB1bHNlfSAxLjFzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuYDtcclxuLyoqIFNhbWUgYm90dG9tIHRvb2xiYXIgc2xvdCBhcyBgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyYCDigJQgcmVwbGFjZXMgdGhlIGZ1bGwgaWNvbi9BSSBwYW5lbCB3aGlsZSBvcGVuLiAqL1xyXG5jb25zdCBJbnN0cnVjdGlvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0cGFkZGluZzogOHB4IDEycHg7XG5cdGdhcDogMTBweDtcblx0Ym9yZGVyLXJhZGl1czogMCAwIDRweCA0cHg7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW5wdXRSb3cgPSBzdHlsZWQuZGl2IGBcblx0Ym9yZGVyOiAxcHggc29saWQgI2Y1YTRjMDtcblx0Ym9yZGVyLXJhZGl1czogMTBweDtcblx0cGFkZGluZzogOHB4IDEwcHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0ID0gc3R5bGVkLmlucHV0IGBcblx0ZmxleDogMTtcblx0bWluLXdpZHRoOiAwO1xuXHRib3JkZXI6IDA7XG5cdG91dGxpbmU6IG5vbmU7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25BY3Rpb25zID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQ2FuY2VsID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0Zm9udC13ZWlnaHQ6IDUwMDtcblx0cGFkZGluZzogMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbXByb3ZlID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICM1ZDNhNzI7XG5cdGNvbG9yOiAjNWQzYTcyO1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym9yZGVyLXJhZGl1czogOHB4O1xuXHRwYWRkaW5nOiA4cHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4xO1xuXHRmb250LXdlaWdodDogNjAwO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0ID0gc3R5bGVkLmRpdiBgXG5cdG1hcmdpbi10b3A6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDEycHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuXHRib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiA9IHN0eWxlZC5idXR0b24gYFxuXHR3aWR0aDogMTAwJTtcblx0Ym9yZGVyOiAwO1xuXHRib3JkZXItdG9wOiAxcHggc29saWQgJHtDT0xPUlMuc3Ryb2tlLnByaW1hcnl9O1xuXHRiYWNrZ3JvdW5kOiAkeyhwcm9wcykgPT4gKHByb3BzLnNlbGVjdGVkID8gJyNlNWYzZTgnIDogJ3RyYW5zcGFyZW50Jyl9O1xuXHRjb2xvcjogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjMWU2YjM0JyA6IENPTE9SUy5jb250ZW50LnByaW1hcnkpfTtcblx0dGV4dC1hbGlnbjogbGVmdDtcblx0cGFkZGluZzogMTJweCAxNHB4O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGxpbmUtaGVpZ2h0OiAxLjI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0OmZpcnN0LW9mLXR5cGUge1xuXHRcdGJvcmRlci10b3A6IDA7XG5cdH1cbmA7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgdGVtcGxhdGVUeXBlID0gJ21hcmtldGluZycsIHRlbXBsYXRlSWQsIHJlcXVlc3RFeGVjdXRvciwgYmFzZVVybCwgZW5kcG9pbnRQYXRoLCB1c2VDYXNlLCBzdG9yZUlkLCBhcGlBZGFwdGVyLCBjb252ZXJzYXRpb25JZCA9ICd3aGF0c2FwcC10ZW1wbGF0ZS1lZGl0b3InLCBzeXN0ZW1JZCA9ICd3aGF0c2FwcC13cml0ZXInLCBpbnRlbnQgPSAnZGVmYXVsdCcsIGVuYWJsZWRBSUFjdGlvbnMgPSBbXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlNIT1JURU4sXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FWFBBTkQsXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FTU9KSUZZLFxyXG4gICAgXSwgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMgPSBmYWxzZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCBhaUFjdGlvbk1pbkNoYXJzLCBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gREVGQVVMVF9JTlNUUlVDVElPTl9TVUdHRVNUSU9OUywgb25BSUV2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFJRXZlbnRcIiwgXCJvbkFJVGFnQ29tcHV0ZWRcIiwgXCJwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcIiwgXCJlZGl0b3JIZWFkZXJcIiwgXCJvbkFJVG9uZVNlbGVjdFwiLCBcIm9uQUlBY3Rpb25SZXF1ZXN0XCIsIFwib25CdWlsZEFJUHJvbXB0XCJdKTtcclxuICAgIGNvbnN0IHRleHRTcGFjZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IFtjdXJyZW50VGV4dCwgc2V0Q3VycmVudFRleHRdID0gdXNlU3RhdGUoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbaXNSZXBocmFzZUhpZ2hsaWdodGVkLCBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW3JlcGhyYXNlSGlnaGxpZ2h0Q291bnQsIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnRdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbaXNHZW5lcmF0aW5nLCBzZXRJc0dlbmVyYXRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2lzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2luc3RydWN0aW9uVGV4dCwgc2V0SW5zdHJ1Y3Rpb25UZXh0XSA9IHVzZVN0YXRlKCcnKTtcclxuICAgIGNvbnN0IFt0b25lQnlBY3Rpb24sIHNldFRvbmVCeUFjdGlvbl0gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkJhc2VUZXh0LCBzZXRTdWdnZXN0aW9uQmFzZVRleHRdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkNhbmRpZGF0ZXMsIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzXSA9IHVzZVN0YXRlKFtdKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uSW5kZXgsIHNldFN1Z2dlc3Rpb25JbmRleF0gPSB1c2VTdGF0ZSgwKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGVdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uU2Nyb2xsUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgcmVwaHJhc2VJZGxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgaGlnaGxpZ2h0UmVzZXRSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gISFwcmVmaWxsV2FzQWlHZW5lcmF0ZWQ7XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgY29uc3QgYWN0aXZlQWN0aW9uUHJvbXB0cyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlQWN0aW9uUHJvbXB0cyh0ZW1wbGF0ZVR5cGUsIHByb21wdE92ZXJyaWRlcywgcmVwaHJhc2VUb25lcyk7XHJcbiAgICB9LCBbcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCB0ZW1wbGF0ZVR5cGVdKTtcclxuICAgIGNvbnN0IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmICghcXVlcnkpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5maWx0ZXIoKHN1Z2dlc3Rpb24pID0+IHN1Z2dlc3Rpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkpO1xyXG4gICAgfSwgW2luc3RydWN0aW9uU3VnZ2VzdGlvbnMsIGluc3RydWN0aW9uVGV4dF0pO1xyXG4gICAgY29uc3QgbWluQ2hhcnNCeUFjdGlvbiA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSUyksIChhaUFjdGlvbk1pbkNoYXJzIHx8IHt9KSk7XHJcbiAgICB9LCBbYWlBY3Rpb25NaW5DaGFyc10pO1xyXG4gICAgY29uc3QgcmVwaHJhc2VNaW5DaGFycyA9IG1pbkNoYXJzQnlBY3Rpb25bQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV0gfHxcclxuICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV07XHJcbiAgICBjb25zdCBlbWl0QUlFdmVudCA9IHVzZUNhbGxiYWNrKChuYW1lLCBwYXlsb2FkKSA9PiB7XHJcbiAgICAgICAgb25BSUV2ZW50ID09PSBudWxsIHx8IG9uQUlFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSUV2ZW50KG5hbWUsIHBheWxvYWQpO1xyXG4gICAgfSwgW29uQUlFdmVudF0pO1xyXG4gICAgY29uc3Qgc2V0RWRpdG9yVGV4dCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIHNldEN1cnJlbnRUZXh0KChwcmV2KSA9PiAocHJldiA9PT0gbmV4dFRleHQgPyBwcmV2IDogbmV4dFRleHQpKTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGVtaXRDaGFuZ2VXaXRoR3VhcmQgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlZmVycmVkSHRtbFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5leHRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIG5leHRUZXh0KTtcclxuICAgICAgICAgICAgZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChuZXh0VGV4dCkpO1xyXG4gICAgICAgICAgICB9LCAxNik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICB9LCBbb25DaGFuZ2VdKTtcclxuICAgIGNvbnN0IGNsZWFyU3VnZ2VzdGlvblNlc3Npb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0KG51bGwpO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtdKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUobnVsbCk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgPj0gTUFYX1JFUEhSQVNFX0hJR0hMSUdIVFMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuZXh0Q291bnQgPSByZXBocmFzZUhpZ2hsaWdodENvdW50ICsgMTtcclxuICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KG5leHRDb3VudCk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIGVkaXRvckluc3RhbmNlS2V5KSB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oZ2V0SGlnaGxpZ2h0U3RvcmFnZUtleShlZGl0b3JJbnN0YW5jZUtleSksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCByZXBocmFzZUhpZ2hsaWdodENvdW50XSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpKSB8fFxyXG4gICAgICAgICAgICAnMCcpO1xyXG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGNhY2hlZCkpIHtcclxuICAgICAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChjYWNoZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBlbGlnaWJsZSA9ICEhY3VycmVudFRleHQudHJpbSgpICYmIGN1cnJlbnRUZXh0Lmxlbmd0aCA+PSByZXBocmFzZU1pbkNoYXJzO1xyXG4gICAgICAgIGlmIChwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBlbGlnaWJsZTtcclxuICAgICAgICAgICAgaWYgKGVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjcm9zc2VkVGhyZXNob2xkID0gIXByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgJiYgZWxpZ2libGU7XHJcbiAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IHRydWU7XHJcbiAgICAgICAgaWYgKGNyb3NzZWRUaHJlc2hvbGQpIHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzW3N1Z2dlc3Rpb25JbmRleF0gfHwgJyc7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2IsIF9jLCBfZDtcclxuICAgICAgICBpZiAoIW9uQUlBY3Rpb25SZXF1ZXN0ICYmXHJcbiAgICAgICAgICAgICFhcGlBZGFwdGVyICYmXHJcbiAgICAgICAgICAgICghcmVxdWVzdEV4ZWN1dG9yIHx8ICFiYXNlVXJsKSkge1xyXG4gICAgICAgICAgICBvbkVycm9yID09PSBudWxsIHx8IG9uRXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRXJyb3IoJ0FJIGNvbmZpZ3VyYXRpb24gbWlzc2luZycpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY3VycmVudFRleHQudHJpbSgpKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbWluQ2hhcnNGb3JBY3Rpb24gPSBtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICA1MDtcclxuICAgICAgICBpZiAoY3VycmVudFRleHQubGVuZ3RoIDwgbWluQ2hhcnNGb3JBY3Rpb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKHJlZ2VuZXJhdGVFeGlzdGluZyAmJiAhY2FuUmVnZW5lcmF0ZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGJhc2VDb25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlID09PSAndXRpbGl0eScgJiZcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCA9PT0gQUlBY3Rpb25WYXJpYW50LlJFUEhSQVNFXHJcbiAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiYXNlQ29uZmlnKSwgeyBsYWJlbDogJ1JlcGhyYXNlJywgYmFzZVByb21wdDogVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgfSkgOiBiYXNlQ29uZmlnO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVG9uZUlkID0gdG9uZU92ZXJyaWRlSWQgfHxcclxuICAgICAgICAgICAgdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIGNvbmZpZy5kZWZhdWx0VG9uZUlkIHx8XHJcbiAgICAgICAgICAgICgoX2MgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYlswXSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmlkKTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2QgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGluSW5pdGlhbEFpUGhhc2UgPSBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudDtcclxuICAgICAgICBjb25zdCB0YWdQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25BY2NlcHQoe1xyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWNjZXB0ZWRUZXh0OiBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZTogaW5Jbml0aWFsQWlQaGFzZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoaW5Jbml0aWFsQWlQaGFzZSkge1xyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkFJVGFnQ29tcHV0ZWQgPT09IG51bGwgfHwgb25BSVRhZ0NvbXB1dGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVGFnQ29tcHV0ZWQodGFnUGF5bG9hZCk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCBzdWdnZXN0aW9uSW5kZXgsIHRlbXBsYXRlSWRdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgY29uc3QgYWN0aW9uQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgY29uc3QgdG9uZUlkID0gdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25Db25maWcuZGVmYXVsdFRvbmVJZCB8fFxyXG4gICAgICAgICAgICAgICAgKChfYiA9IChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWzBdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWQpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBhY3Rpb25Db25maWcubGFiZWwsXHJcbiAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBpc0dlbmVyYXRpbmcgJiYgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRlZDogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhY3VycmVudFRleHQudHJpbSgpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQubGVuZ3RoIDxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgNTApIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmF0aW5nIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSksXHJcbiAgICAgICAgICAgICAgICBzaG93VG9uZURyb3Bkb3duOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgISEoKF9jID0gYWN0aW9uQ29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubGVuZ3RoKSxcclxuICAgICAgICAgICAgICAgIHRvbmVzOiBhY3Rpb25Db25maWcudG9uZXMsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZDogdG9uZUlkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVuYWJsZWRBSUFjdGlvbnMsXHJcbiAgICAgICAgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMsXHJcbiAgICAgICAgYWN0aXZlQWN0aW9uUHJvbXB0cyxcclxuICAgICAgICB0b25lQnlBY3Rpb24sXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbixcclxuICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgIF0pO1xyXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBhZGRUZXh0T3JXcmFwLFxyXG4gICAgICAgICAgICBhZGRUZXh0LFxyXG4gICAgICAgICAgICBnZXQoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24sXHJcbiAgICAgICAgfTtcclxuICAgIH0sIFthZGRUZXh0T3JXcmFwLCBhZGRUZXh0LCBjdXJyZW50VGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChpbnB1dFZhbHVlIHx8ICcnKTtcclxuICAgIH0sIFtpbnB1dFZhbHVlLCBzZXRFZGl0b3JUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghbGltaXQgfHwgIW9uRXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBuZXh0RXJyb3IgPSBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdCA/IExJTUlUX1JFQUNIRUQgOiBlcnJvciAhPT0gbnVsbCAmJiBlcnJvciAhPT0gdm9pZCAwID8gZXJyb3IgOiAnJztcclxuICAgICAgICBpZiAobGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID09PSBuZXh0RXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPSBuZXh0RXJyb3I7XHJcbiAgICAgICAgb25FcnJvcihuZXh0RXJyb3IpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBlcnJvciwgbGltaXQsIG9uRXJyb3JdKTtcclxuICAgIHJldHVybiAoX2pzeHMoT3V0ZXJDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4gaGFuZGxlRmVlZGJhY2soJ2xpa2UnKSB9LCB7IGNoaWxkcmVuOiBfanN4KFRodW1ic1VwSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNsaWtlXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzbGlrZSBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKCdkaXNsaWtlJykgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSksIF9qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),ZI=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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBeUpzQyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMsIEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG5pbXBvcnQgeyBidWlsZEFjdGlvblByb21wdCwgcmVxdWVzdEFJU3VnZ2VzdGlvbiB9IGZyb20gJy4vYWkvYXBpJztcclxuaW1wb3J0IHsgQ29udGFpbmVyLCBFZGl0b3JGb290ZXJSaWdodCwgRWRpdG9yRm9vdGVyUm93LCBFZGl0b3JGb290ZXJUaXRsZSwgT3V0ZXJDb250YWluZXIsIFRleHRTcGFjZSwgfSBmcm9tICcuL0N1c3RvbUVkaXRvci5zdHlsZWQnO1xyXG5pbXBvcnQgeyBBSUFjdGlvblZhcmlhbnQsIEFJRWRpdG9yQWN0aW9uVHlwZXMsIEVkaXRvckFjdGlvblR5cGVzLCBXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIH0gZnJvbSAnLi9XaGF0c0FwcFRleHRFZGl0b3JIZWFkZXInO1xyXG5jb25zdCBMSU1JVF9SRUFDSEVEID0gJ0NoYXJhY3RlciBsaW1pdCByZWFjaGVkJztcclxuY29uc3QgUkVQSFJBU0VfSURMRV9NUyA9IDMwMDA7XHJcbmNvbnN0IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTID0gNTtcclxuY29uc3QgTUFYX1NVR0dFU1RJT05TID0gMztcclxuY29uc3QgTEFSR0VfSU5QVVRfVEhSRVNIT0xEID0gMTIwMDtcclxuY29uc3QgVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgPSAnUmVwaHJhc2UgdGhpcyBXaGF0c0FwcCB1dGlsaXR5IHRlbXBsYXRlIHRvIGltcHJvdmUgY2xhcml0eSBhbmQgcmVhZGFiaWxpdHkgd2hpbGUgcHJlc2VydmluZyB2YXJpYWJsZXMsIGludGVudCwgYW5kIGNvbXBsaWFuY2UuJztcclxuY29uc3Qgc2tlbGV0b25QdWxzZSA9IGtleWZyYW1lcyBgXG5cdDAlIHsgb3BhY2l0eTogMC41NTsgfVxuXHQ1MCUgeyBvcGFjaXR5OiAxOyB9XG5cdDEwMCUgeyBvcGFjaXR5OiAwLjU1OyB9XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxNHB4IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogMTBweDtcblx0bWluLWhlaWdodDogMTUwcHg7XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkxpbmUgPSBzdHlsZWQuZGl2IGBcblx0aGVpZ2h0OiAxNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdHdpZHRoOiAkeyhwcm9wcykgPT4gcHJvcHMud2lkdGh9O1xuXHRiYWNrZ3JvdW5kOiAjZWNlY2VmO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25TZXNzaW9uQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG5cdHBhZGRpbmc6IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHRtYXgtaGVpZ2h0OiAyNjBweDtcblx0b3ZlcmZsb3cteTogc2Nyb2xsO1xuXHRzY3JvbGxiYXItd2lkdGg6IHRoaW47XG5cdHNjcm9sbGJhci1jb2xvcjogI2M4YzhjZiB0cmFuc3BhcmVudDtcblx0Ojotd2Via2l0LXNjcm9sbGJhciB7XG5cdFx0d2lkdGg6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcblx0XHRiYWNrZ3JvdW5kOiAjYzhjOGNmO1xuXHRcdGJvcmRlci1yYWRpdXM6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcblx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0fVxuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHR0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0ID0gc3R5bGVkLmRpdiBgXG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHR3aWR0aDogMTAwJTtcblx0bWluLWhlaWdodDogNDBweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db250cm9sc1JvdyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDZweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db3VudGVyID0gc3R5bGVkLnNwYW4gYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0Zm9udC1zaXplOiAxNHB4O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkljb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0Ym9yZGVyOiAwO1xuXHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0cGFkZGluZzogNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0Y3Vyc29yOiBwb2ludGVyO1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0dHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjEycyBlYXNlO1xuXHQ6bm90KDpkaXNhYmxlZCk6aG92ZXIge1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICR7Q09MT1JTLnN1cmZhY2UuaG92ZXJlZH07XG5cdH1cblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAwLjM1O1xuXHRcdGN1cnNvcjogbm90LWFsbG93ZWQ7XG5cdH1cbmA7XHJcbi8qKiBSZWdlbmVyYXRlIHN0YXlzIGZ1bGwgb3BhY2l0eSB3aGlsZSBkaXNhYmxlZCBzbyB0aGUgbG9hZGluZyBzaGltbWVyIHN0YXlzIHZpc2libGUgKHNhbWUgcHVsc2UgYXMgZWRpdG9yIHNrZWxldG9uKS4gKi9cclxuY29uc3QgU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24gPSBzdHlsZWQoU3VnZ2VzdGlvbkljb25CdXR0b24pIGBcblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAxO1xuXHRcdGN1cnNvcjogd2FpdDtcblx0fVxuYDtcclxuY29uc3QgUmVnZW5lcmF0ZUljb25TaGltbWVyID0gc3R5bGVkLmRpdiBgXG5cdHdpZHRoOiAxNHB4O1xuXHRoZWlnaHQ6IDE0cHg7XG5cdGJvcmRlci1yYWRpdXM6IDRweDtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0ZmxleC1zaHJpbms6IDA7XG5cdGFuaW1hdGlvbjogJHtza2VsZXRvblB1bHNlfSAxLjFzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuYDtcclxuLyoqIFNhbWUgYm90dG9tIHRvb2xiYXIgc2xvdCBhcyBgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyYCDigJQgcmVwbGFjZXMgdGhlIGZ1bGwgaWNvbi9BSSBwYW5lbCB3aGlsZSBvcGVuLiAqL1xyXG5jb25zdCBJbnN0cnVjdGlvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0cGFkZGluZzogOHB4IDEycHg7XG5cdGdhcDogMTBweDtcblx0Ym9yZGVyLXJhZGl1czogMCAwIDRweCA0cHg7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW5wdXRSb3cgPSBzdHlsZWQuZGl2IGBcblx0Ym9yZGVyOiAxcHggc29saWQgI2Y1YTRjMDtcblx0Ym9yZGVyLXJhZGl1czogMTBweDtcblx0cGFkZGluZzogOHB4IDEwcHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0ID0gc3R5bGVkLmlucHV0IGBcblx0ZmxleDogMTtcblx0bWluLXdpZHRoOiAwO1xuXHRib3JkZXI6IDA7XG5cdG91dGxpbmU6IG5vbmU7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25BY3Rpb25zID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQ2FuY2VsID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0Zm9udC13ZWlnaHQ6IDUwMDtcblx0cGFkZGluZzogMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbXByb3ZlID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICM1ZDNhNzI7XG5cdGNvbG9yOiAjNWQzYTcyO1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym9yZGVyLXJhZGl1czogOHB4O1xuXHRwYWRkaW5nOiA4cHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4xO1xuXHRmb250LXdlaWdodDogNjAwO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0ID0gc3R5bGVkLmRpdiBgXG5cdG1hcmdpbi10b3A6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDEycHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuXHRib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiA9IHN0eWxlZC5idXR0b24gYFxuXHR3aWR0aDogMTAwJTtcblx0Ym9yZGVyOiAwO1xuXHRib3JkZXItdG9wOiAxcHggc29saWQgJHtDT0xPUlMuc3Ryb2tlLnByaW1hcnl9O1xuXHRiYWNrZ3JvdW5kOiAkeyhwcm9wcykgPT4gKHByb3BzLnNlbGVjdGVkID8gJyNlNWYzZTgnIDogJ3RyYW5zcGFyZW50Jyl9O1xuXHRjb2xvcjogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjMWU2YjM0JyA6IENPTE9SUy5jb250ZW50LnByaW1hcnkpfTtcblx0dGV4dC1hbGlnbjogbGVmdDtcblx0cGFkZGluZzogMTJweCAxNHB4O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGxpbmUtaGVpZ2h0OiAxLjI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0OmZpcnN0LW9mLXR5cGUge1xuXHRcdGJvcmRlci10b3A6IDA7XG5cdH1cbmA7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgdGVtcGxhdGVUeXBlID0gJ21hcmtldGluZycsIHRlbXBsYXRlSWQsIHJlcXVlc3RFeGVjdXRvciwgYmFzZVVybCwgZW5kcG9pbnRQYXRoLCB1c2VDYXNlLCBzdG9yZUlkLCBhcGlBZGFwdGVyLCBjb252ZXJzYXRpb25JZCA9ICd3aGF0c2FwcC10ZW1wbGF0ZS1lZGl0b3InLCBzeXN0ZW1JZCA9ICd3aGF0c2FwcC13cml0ZXInLCBpbnRlbnQgPSAnZGVmYXVsdCcsIGVuYWJsZWRBSUFjdGlvbnMgPSBbXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlNIT1JURU4sXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FWFBBTkQsXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FTU9KSUZZLFxyXG4gICAgXSwgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMgPSBmYWxzZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCBhaUFjdGlvbk1pbkNoYXJzLCBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gREVGQVVMVF9JTlNUUlVDVElPTl9TVUdHRVNUSU9OUywgb25BSUV2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFJRXZlbnRcIiwgXCJvbkFJVGFnQ29tcHV0ZWRcIiwgXCJwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcIiwgXCJlZGl0b3JIZWFkZXJcIiwgXCJvbkFJVG9uZVNlbGVjdFwiLCBcIm9uQUlBY3Rpb25SZXF1ZXN0XCIsIFwib25CdWlsZEFJUHJvbXB0XCJdKTtcclxuICAgIGNvbnN0IHRleHRTcGFjZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IFtjdXJyZW50VGV4dCwgc2V0Q3VycmVudFRleHRdID0gdXNlU3RhdGUoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbaXNSZXBocmFzZUhpZ2hsaWdodGVkLCBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW3JlcGhyYXNlSGlnaGxpZ2h0Q291bnQsIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnRdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbaXNHZW5lcmF0aW5nLCBzZXRJc0dlbmVyYXRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2lzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2luc3RydWN0aW9uVGV4dCwgc2V0SW5zdHJ1Y3Rpb25UZXh0XSA9IHVzZVN0YXRlKCcnKTtcclxuICAgIGNvbnN0IFt0b25lQnlBY3Rpb24sIHNldFRvbmVCeUFjdGlvbl0gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkJhc2VUZXh0LCBzZXRTdWdnZXN0aW9uQmFzZVRleHRdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkNhbmRpZGF0ZXMsIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzXSA9IHVzZVN0YXRlKFtdKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uSW5kZXgsIHNldFN1Z2dlc3Rpb25JbmRleF0gPSB1c2VTdGF0ZSgwKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGVdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uU2Nyb2xsUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgcmVwaHJhc2VJZGxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgaGlnaGxpZ2h0UmVzZXRSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gISFwcmVmaWxsV2FzQWlHZW5lcmF0ZWQ7XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgY29uc3QgYWN0aXZlQWN0aW9uUHJvbXB0cyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlQWN0aW9uUHJvbXB0cyh0ZW1wbGF0ZVR5cGUsIHByb21wdE92ZXJyaWRlcywgcmVwaHJhc2VUb25lcyk7XHJcbiAgICB9LCBbcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCB0ZW1wbGF0ZVR5cGVdKTtcclxuICAgIGNvbnN0IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmICghcXVlcnkpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5maWx0ZXIoKHN1Z2dlc3Rpb24pID0+IHN1Z2dlc3Rpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkpO1xyXG4gICAgfSwgW2luc3RydWN0aW9uU3VnZ2VzdGlvbnMsIGluc3RydWN0aW9uVGV4dF0pO1xyXG4gICAgY29uc3QgbWluQ2hhcnNCeUFjdGlvbiA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSUyksIChhaUFjdGlvbk1pbkNoYXJzIHx8IHt9KSk7XHJcbiAgICB9LCBbYWlBY3Rpb25NaW5DaGFyc10pO1xyXG4gICAgY29uc3QgcmVwaHJhc2VNaW5DaGFycyA9IG1pbkNoYXJzQnlBY3Rpb25bQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV0gfHxcclxuICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV07XHJcbiAgICBjb25zdCBlbWl0QUlFdmVudCA9IHVzZUNhbGxiYWNrKChuYW1lLCBwYXlsb2FkKSA9PiB7XHJcbiAgICAgICAgb25BSUV2ZW50ID09PSBudWxsIHx8IG9uQUlFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSUV2ZW50KG5hbWUsIHBheWxvYWQpO1xyXG4gICAgfSwgW29uQUlFdmVudF0pO1xyXG4gICAgY29uc3Qgc2V0RWRpdG9yVGV4dCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIHNldEN1cnJlbnRUZXh0KChwcmV2KSA9PiAocHJldiA9PT0gbmV4dFRleHQgPyBwcmV2IDogbmV4dFRleHQpKTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGVtaXRDaGFuZ2VXaXRoR3VhcmQgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlZmVycmVkSHRtbFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5leHRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIG5leHRUZXh0KTtcclxuICAgICAgICAgICAgZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChuZXh0VGV4dCkpO1xyXG4gICAgICAgICAgICB9LCAxNik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICB9LCBbb25DaGFuZ2VdKTtcclxuICAgIGNvbnN0IGNsZWFyU3VnZ2VzdGlvblNlc3Npb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0KG51bGwpO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtdKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUobnVsbCk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgPj0gTUFYX1JFUEhSQVNFX0hJR0hMSUdIVFMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuZXh0Q291bnQgPSByZXBocmFzZUhpZ2hsaWdodENvdW50ICsgMTtcclxuICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KG5leHRDb3VudCk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIGVkaXRvckluc3RhbmNlS2V5KSB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oZ2V0SGlnaGxpZ2h0U3RvcmFnZUtleShlZGl0b3JJbnN0YW5jZUtleSksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCByZXBocmFzZUhpZ2hsaWdodENvdW50XSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpKSB8fFxyXG4gICAgICAgICAgICAnMCcpO1xyXG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGNhY2hlZCkpIHtcclxuICAgICAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChjYWNoZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBlbGlnaWJsZSA9ICEhY3VycmVudFRleHQudHJpbSgpICYmIGN1cnJlbnRUZXh0Lmxlbmd0aCA+PSByZXBocmFzZU1pbkNoYXJzO1xyXG4gICAgICAgIGlmIChwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBlbGlnaWJsZTtcclxuICAgICAgICAgICAgaWYgKGVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjcm9zc2VkVGhyZXNob2xkID0gIXByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgJiYgZWxpZ2libGU7XHJcbiAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IHRydWU7XHJcbiAgICAgICAgaWYgKGNyb3NzZWRUaHJlc2hvbGQpIHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzW3N1Z2dlc3Rpb25JbmRleF0gfHwgJyc7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2IsIF9jLCBfZDtcclxuICAgICAgICBpZiAoIW9uQUlBY3Rpb25SZXF1ZXN0ICYmXHJcbiAgICAgICAgICAgICFhcGlBZGFwdGVyICYmXHJcbiAgICAgICAgICAgICghcmVxdWVzdEV4ZWN1dG9yIHx8ICFiYXNlVXJsKSkge1xyXG4gICAgICAgICAgICBvbkVycm9yID09PSBudWxsIHx8IG9uRXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRXJyb3IoJ0FJIGNvbmZpZ3VyYXRpb24gbWlzc2luZycpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY3VycmVudFRleHQudHJpbSgpKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbWluQ2hhcnNGb3JBY3Rpb24gPSBtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICA1MDtcclxuICAgICAgICBpZiAoY3VycmVudFRleHQubGVuZ3RoIDwgbWluQ2hhcnNGb3JBY3Rpb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKHJlZ2VuZXJhdGVFeGlzdGluZyAmJiAhY2FuUmVnZW5lcmF0ZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGJhc2VDb25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlID09PSAndXRpbGl0eScgJiZcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCA9PT0gQUlBY3Rpb25WYXJpYW50LlJFUEhSQVNFXHJcbiAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiYXNlQ29uZmlnKSwgeyBsYWJlbDogJ1JlcGhyYXNlJywgYmFzZVByb21wdDogVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgfSkgOiBiYXNlQ29uZmlnO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVG9uZUlkID0gdG9uZU92ZXJyaWRlSWQgfHxcclxuICAgICAgICAgICAgdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIGNvbmZpZy5kZWZhdWx0VG9uZUlkIHx8XHJcbiAgICAgICAgICAgICgoX2MgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYlswXSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmlkKTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2QgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGluSW5pdGlhbEFpUGhhc2UgPSBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudDtcclxuICAgICAgICBjb25zdCB0YWdQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25BY2NlcHQoe1xyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWNjZXB0ZWRUZXh0OiBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZTogaW5Jbml0aWFsQWlQaGFzZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoaW5Jbml0aWFsQWlQaGFzZSkge1xyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkFJVGFnQ29tcHV0ZWQgPT09IG51bGwgfHwgb25BSVRhZ0NvbXB1dGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVGFnQ29tcHV0ZWQodGFnUGF5bG9hZCk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCBzdWdnZXN0aW9uSW5kZXgsIHRlbXBsYXRlSWRdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgY29uc3QgYWN0aW9uQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgY29uc3QgdG9uZUlkID0gdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25Db25maWcuZGVmYXVsdFRvbmVJZCB8fFxyXG4gICAgICAgICAgICAgICAgKChfYiA9IChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWzBdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWQpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBhY3Rpb25Db25maWcubGFiZWwsXHJcbiAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBpc0dlbmVyYXRpbmcgJiYgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRlZDogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhY3VycmVudFRleHQudHJpbSgpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQubGVuZ3RoIDxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgNTApIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmF0aW5nIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSksXHJcbiAgICAgICAgICAgICAgICBzaG93VG9uZURyb3Bkb3duOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgISEoKF9jID0gYWN0aW9uQ29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubGVuZ3RoKSxcclxuICAgICAgICAgICAgICAgIHRvbmVzOiBhY3Rpb25Db25maWcudG9uZXMsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZDogdG9uZUlkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVuYWJsZWRBSUFjdGlvbnMsXHJcbiAgICAgICAgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMsXHJcbiAgICAgICAgYWN0aXZlQWN0aW9uUHJvbXB0cyxcclxuICAgICAgICB0b25lQnlBY3Rpb24sXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbixcclxuICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgIF0pO1xyXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBhZGRUZXh0T3JXcmFwLFxyXG4gICAgICAgICAgICBhZGRUZXh0LFxyXG4gICAgICAgICAgICBnZXQoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24sXHJcbiAgICAgICAgfTtcclxuICAgIH0sIFthZGRUZXh0T3JXcmFwLCBhZGRUZXh0LCBjdXJyZW50VGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChpbnB1dFZhbHVlIHx8ICcnKTtcclxuICAgIH0sIFtpbnB1dFZhbHVlLCBzZXRFZGl0b3JUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghbGltaXQgfHwgIW9uRXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBuZXh0RXJyb3IgPSBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdCA/IExJTUlUX1JFQUNIRUQgOiBlcnJvciAhPT0gbnVsbCAmJiBlcnJvciAhPT0gdm9pZCAwID8gZXJyb3IgOiAnJztcclxuICAgICAgICBpZiAobGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID09PSBuZXh0RXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPSBuZXh0RXJyb3I7XHJcbiAgICAgICAgb25FcnJvcihuZXh0RXJyb3IpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBlcnJvciwgbGltaXQsIG9uRXJyb3JdKTtcclxuICAgIHJldHVybiAoX2pzeHMoT3V0ZXJDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4gaGFuZGxlRmVlZGJhY2soJ2xpa2UnKSB9LCB7IGNoaWxkcmVuOiBfanN4KFRodW1ic1VwSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNsaWtlXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzbGlrZSBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKCdkaXNsaWtlJykgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSksIF9qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */",toString:K}),GI=I("button","production"===process.env.NODE_ENV?{target:"ea7i3sh3"}:{target:"ea7i3sh3",label:"InstructionCancel"})("border:0;background:transparent;color:",a.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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBOEp3QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMsIEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG5pbXBvcnQgeyBidWlsZEFjdGlvblByb21wdCwgcmVxdWVzdEFJU3VnZ2VzdGlvbiB9IGZyb20gJy4vYWkvYXBpJztcclxuaW1wb3J0IHsgQ29udGFpbmVyLCBFZGl0b3JGb290ZXJSaWdodCwgRWRpdG9yRm9vdGVyUm93LCBFZGl0b3JGb290ZXJUaXRsZSwgT3V0ZXJDb250YWluZXIsIFRleHRTcGFjZSwgfSBmcm9tICcuL0N1c3RvbUVkaXRvci5zdHlsZWQnO1xyXG5pbXBvcnQgeyBBSUFjdGlvblZhcmlhbnQsIEFJRWRpdG9yQWN0aW9uVHlwZXMsIEVkaXRvckFjdGlvblR5cGVzLCBXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIH0gZnJvbSAnLi9XaGF0c0FwcFRleHRFZGl0b3JIZWFkZXInO1xyXG5jb25zdCBMSU1JVF9SRUFDSEVEID0gJ0NoYXJhY3RlciBsaW1pdCByZWFjaGVkJztcclxuY29uc3QgUkVQSFJBU0VfSURMRV9NUyA9IDMwMDA7XHJcbmNvbnN0IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTID0gNTtcclxuY29uc3QgTUFYX1NVR0dFU1RJT05TID0gMztcclxuY29uc3QgTEFSR0VfSU5QVVRfVEhSRVNIT0xEID0gMTIwMDtcclxuY29uc3QgVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgPSAnUmVwaHJhc2UgdGhpcyBXaGF0c0FwcCB1dGlsaXR5IHRlbXBsYXRlIHRvIGltcHJvdmUgY2xhcml0eSBhbmQgcmVhZGFiaWxpdHkgd2hpbGUgcHJlc2VydmluZyB2YXJpYWJsZXMsIGludGVudCwgYW5kIGNvbXBsaWFuY2UuJztcclxuY29uc3Qgc2tlbGV0b25QdWxzZSA9IGtleWZyYW1lcyBgXG5cdDAlIHsgb3BhY2l0eTogMC41NTsgfVxuXHQ1MCUgeyBvcGFjaXR5OiAxOyB9XG5cdDEwMCUgeyBvcGFjaXR5OiAwLjU1OyB9XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxNHB4IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogMTBweDtcblx0bWluLWhlaWdodDogMTUwcHg7XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkxpbmUgPSBzdHlsZWQuZGl2IGBcblx0aGVpZ2h0OiAxNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdHdpZHRoOiAkeyhwcm9wcykgPT4gcHJvcHMud2lkdGh9O1xuXHRiYWNrZ3JvdW5kOiAjZWNlY2VmO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25TZXNzaW9uQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG5cdHBhZGRpbmc6IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHRtYXgtaGVpZ2h0OiAyNjBweDtcblx0b3ZlcmZsb3cteTogc2Nyb2xsO1xuXHRzY3JvbGxiYXItd2lkdGg6IHRoaW47XG5cdHNjcm9sbGJhci1jb2xvcjogI2M4YzhjZiB0cmFuc3BhcmVudDtcblx0Ojotd2Via2l0LXNjcm9sbGJhciB7XG5cdFx0d2lkdGg6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcblx0XHRiYWNrZ3JvdW5kOiAjYzhjOGNmO1xuXHRcdGJvcmRlci1yYWRpdXM6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcblx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0fVxuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHR0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0ID0gc3R5bGVkLmRpdiBgXG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHR3aWR0aDogMTAwJTtcblx0bWluLWhlaWdodDogNDBweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db250cm9sc1JvdyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDZweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db3VudGVyID0gc3R5bGVkLnNwYW4gYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0Zm9udC1zaXplOiAxNHB4O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkljb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0Ym9yZGVyOiAwO1xuXHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0cGFkZGluZzogNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0Y3Vyc29yOiBwb2ludGVyO1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0dHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjEycyBlYXNlO1xuXHQ6bm90KDpkaXNhYmxlZCk6aG92ZXIge1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICR7Q09MT1JTLnN1cmZhY2UuaG92ZXJlZH07XG5cdH1cblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAwLjM1O1xuXHRcdGN1cnNvcjogbm90LWFsbG93ZWQ7XG5cdH1cbmA7XHJcbi8qKiBSZWdlbmVyYXRlIHN0YXlzIGZ1bGwgb3BhY2l0eSB3aGlsZSBkaXNhYmxlZCBzbyB0aGUgbG9hZGluZyBzaGltbWVyIHN0YXlzIHZpc2libGUgKHNhbWUgcHVsc2UgYXMgZWRpdG9yIHNrZWxldG9uKS4gKi9cclxuY29uc3QgU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24gPSBzdHlsZWQoU3VnZ2VzdGlvbkljb25CdXR0b24pIGBcblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAxO1xuXHRcdGN1cnNvcjogd2FpdDtcblx0fVxuYDtcclxuY29uc3QgUmVnZW5lcmF0ZUljb25TaGltbWVyID0gc3R5bGVkLmRpdiBgXG5cdHdpZHRoOiAxNHB4O1xuXHRoZWlnaHQ6IDE0cHg7XG5cdGJvcmRlci1yYWRpdXM6IDRweDtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0ZmxleC1zaHJpbms6IDA7XG5cdGFuaW1hdGlvbjogJHtza2VsZXRvblB1bHNlfSAxLjFzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuYDtcclxuLyoqIFNhbWUgYm90dG9tIHRvb2xiYXIgc2xvdCBhcyBgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyYCDigJQgcmVwbGFjZXMgdGhlIGZ1bGwgaWNvbi9BSSBwYW5lbCB3aGlsZSBvcGVuLiAqL1xyXG5jb25zdCBJbnN0cnVjdGlvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0cGFkZGluZzogOHB4IDEycHg7XG5cdGdhcDogMTBweDtcblx0Ym9yZGVyLXJhZGl1czogMCAwIDRweCA0cHg7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW5wdXRSb3cgPSBzdHlsZWQuZGl2IGBcblx0Ym9yZGVyOiAxcHggc29saWQgI2Y1YTRjMDtcblx0Ym9yZGVyLXJhZGl1czogMTBweDtcblx0cGFkZGluZzogOHB4IDEwcHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0ID0gc3R5bGVkLmlucHV0IGBcblx0ZmxleDogMTtcblx0bWluLXdpZHRoOiAwO1xuXHRib3JkZXI6IDA7XG5cdG91dGxpbmU6IG5vbmU7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25BY3Rpb25zID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQ2FuY2VsID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0Zm9udC13ZWlnaHQ6IDUwMDtcblx0cGFkZGluZzogMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbXByb3ZlID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICM1ZDNhNzI7XG5cdGNvbG9yOiAjNWQzYTcyO1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym9yZGVyLXJhZGl1czogOHB4O1xuXHRwYWRkaW5nOiA4cHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4xO1xuXHRmb250LXdlaWdodDogNjAwO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0ID0gc3R5bGVkLmRpdiBgXG5cdG1hcmdpbi10b3A6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDEycHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuXHRib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiA9IHN0eWxlZC5idXR0b24gYFxuXHR3aWR0aDogMTAwJTtcblx0Ym9yZGVyOiAwO1xuXHRib3JkZXItdG9wOiAxcHggc29saWQgJHtDT0xPUlMuc3Ryb2tlLnByaW1hcnl9O1xuXHRiYWNrZ3JvdW5kOiAkeyhwcm9wcykgPT4gKHByb3BzLnNlbGVjdGVkID8gJyNlNWYzZTgnIDogJ3RyYW5zcGFyZW50Jyl9O1xuXHRjb2xvcjogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjMWU2YjM0JyA6IENPTE9SUy5jb250ZW50LnByaW1hcnkpfTtcblx0dGV4dC1hbGlnbjogbGVmdDtcblx0cGFkZGluZzogMTJweCAxNHB4O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGxpbmUtaGVpZ2h0OiAxLjI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0OmZpcnN0LW9mLXR5cGUge1xuXHRcdGJvcmRlci10b3A6IDA7XG5cdH1cbmA7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgdGVtcGxhdGVUeXBlID0gJ21hcmtldGluZycsIHRlbXBsYXRlSWQsIHJlcXVlc3RFeGVjdXRvciwgYmFzZVVybCwgZW5kcG9pbnRQYXRoLCB1c2VDYXNlLCBzdG9yZUlkLCBhcGlBZGFwdGVyLCBjb252ZXJzYXRpb25JZCA9ICd3aGF0c2FwcC10ZW1wbGF0ZS1lZGl0b3InLCBzeXN0ZW1JZCA9ICd3aGF0c2FwcC13cml0ZXInLCBpbnRlbnQgPSAnZGVmYXVsdCcsIGVuYWJsZWRBSUFjdGlvbnMgPSBbXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlNIT1JURU4sXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FWFBBTkQsXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FTU9KSUZZLFxyXG4gICAgXSwgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMgPSBmYWxzZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCBhaUFjdGlvbk1pbkNoYXJzLCBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gREVGQVVMVF9JTlNUUlVDVElPTl9TVUdHRVNUSU9OUywgb25BSUV2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFJRXZlbnRcIiwgXCJvbkFJVGFnQ29tcHV0ZWRcIiwgXCJwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcIiwgXCJlZGl0b3JIZWFkZXJcIiwgXCJvbkFJVG9uZVNlbGVjdFwiLCBcIm9uQUlBY3Rpb25SZXF1ZXN0XCIsIFwib25CdWlsZEFJUHJvbXB0XCJdKTtcclxuICAgIGNvbnN0IHRleHRTcGFjZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IFtjdXJyZW50VGV4dCwgc2V0Q3VycmVudFRleHRdID0gdXNlU3RhdGUoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbaXNSZXBocmFzZUhpZ2hsaWdodGVkLCBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW3JlcGhyYXNlSGlnaGxpZ2h0Q291bnQsIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnRdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbaXNHZW5lcmF0aW5nLCBzZXRJc0dlbmVyYXRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2lzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2luc3RydWN0aW9uVGV4dCwgc2V0SW5zdHJ1Y3Rpb25UZXh0XSA9IHVzZVN0YXRlKCcnKTtcclxuICAgIGNvbnN0IFt0b25lQnlBY3Rpb24sIHNldFRvbmVCeUFjdGlvbl0gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkJhc2VUZXh0LCBzZXRTdWdnZXN0aW9uQmFzZVRleHRdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkNhbmRpZGF0ZXMsIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzXSA9IHVzZVN0YXRlKFtdKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uSW5kZXgsIHNldFN1Z2dlc3Rpb25JbmRleF0gPSB1c2VTdGF0ZSgwKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGVdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uU2Nyb2xsUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgcmVwaHJhc2VJZGxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgaGlnaGxpZ2h0UmVzZXRSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gISFwcmVmaWxsV2FzQWlHZW5lcmF0ZWQ7XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgY29uc3QgYWN0aXZlQWN0aW9uUHJvbXB0cyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlQWN0aW9uUHJvbXB0cyh0ZW1wbGF0ZVR5cGUsIHByb21wdE92ZXJyaWRlcywgcmVwaHJhc2VUb25lcyk7XHJcbiAgICB9LCBbcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCB0ZW1wbGF0ZVR5cGVdKTtcclxuICAgIGNvbnN0IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmICghcXVlcnkpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5maWx0ZXIoKHN1Z2dlc3Rpb24pID0+IHN1Z2dlc3Rpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkpO1xyXG4gICAgfSwgW2luc3RydWN0aW9uU3VnZ2VzdGlvbnMsIGluc3RydWN0aW9uVGV4dF0pO1xyXG4gICAgY29uc3QgbWluQ2hhcnNCeUFjdGlvbiA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSUyksIChhaUFjdGlvbk1pbkNoYXJzIHx8IHt9KSk7XHJcbiAgICB9LCBbYWlBY3Rpb25NaW5DaGFyc10pO1xyXG4gICAgY29uc3QgcmVwaHJhc2VNaW5DaGFycyA9IG1pbkNoYXJzQnlBY3Rpb25bQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV0gfHxcclxuICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV07XHJcbiAgICBjb25zdCBlbWl0QUlFdmVudCA9IHVzZUNhbGxiYWNrKChuYW1lLCBwYXlsb2FkKSA9PiB7XHJcbiAgICAgICAgb25BSUV2ZW50ID09PSBudWxsIHx8IG9uQUlFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSUV2ZW50KG5hbWUsIHBheWxvYWQpO1xyXG4gICAgfSwgW29uQUlFdmVudF0pO1xyXG4gICAgY29uc3Qgc2V0RWRpdG9yVGV4dCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIHNldEN1cnJlbnRUZXh0KChwcmV2KSA9PiAocHJldiA9PT0gbmV4dFRleHQgPyBwcmV2IDogbmV4dFRleHQpKTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGVtaXRDaGFuZ2VXaXRoR3VhcmQgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlZmVycmVkSHRtbFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5leHRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIG5leHRUZXh0KTtcclxuICAgICAgICAgICAgZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChuZXh0VGV4dCkpO1xyXG4gICAgICAgICAgICB9LCAxNik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICB9LCBbb25DaGFuZ2VdKTtcclxuICAgIGNvbnN0IGNsZWFyU3VnZ2VzdGlvblNlc3Npb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0KG51bGwpO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtdKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUobnVsbCk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgPj0gTUFYX1JFUEhSQVNFX0hJR0hMSUdIVFMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuZXh0Q291bnQgPSByZXBocmFzZUhpZ2hsaWdodENvdW50ICsgMTtcclxuICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KG5leHRDb3VudCk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIGVkaXRvckluc3RhbmNlS2V5KSB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oZ2V0SGlnaGxpZ2h0U3RvcmFnZUtleShlZGl0b3JJbnN0YW5jZUtleSksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCByZXBocmFzZUhpZ2hsaWdodENvdW50XSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpKSB8fFxyXG4gICAgICAgICAgICAnMCcpO1xyXG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGNhY2hlZCkpIHtcclxuICAgICAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChjYWNoZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBlbGlnaWJsZSA9ICEhY3VycmVudFRleHQudHJpbSgpICYmIGN1cnJlbnRUZXh0Lmxlbmd0aCA+PSByZXBocmFzZU1pbkNoYXJzO1xyXG4gICAgICAgIGlmIChwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBlbGlnaWJsZTtcclxuICAgICAgICAgICAgaWYgKGVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjcm9zc2VkVGhyZXNob2xkID0gIXByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgJiYgZWxpZ2libGU7XHJcbiAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IHRydWU7XHJcbiAgICAgICAgaWYgKGNyb3NzZWRUaHJlc2hvbGQpIHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzW3N1Z2dlc3Rpb25JbmRleF0gfHwgJyc7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2IsIF9jLCBfZDtcclxuICAgICAgICBpZiAoIW9uQUlBY3Rpb25SZXF1ZXN0ICYmXHJcbiAgICAgICAgICAgICFhcGlBZGFwdGVyICYmXHJcbiAgICAgICAgICAgICghcmVxdWVzdEV4ZWN1dG9yIHx8ICFiYXNlVXJsKSkge1xyXG4gICAgICAgICAgICBvbkVycm9yID09PSBudWxsIHx8IG9uRXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRXJyb3IoJ0FJIGNvbmZpZ3VyYXRpb24gbWlzc2luZycpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY3VycmVudFRleHQudHJpbSgpKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbWluQ2hhcnNGb3JBY3Rpb24gPSBtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICA1MDtcclxuICAgICAgICBpZiAoY3VycmVudFRleHQubGVuZ3RoIDwgbWluQ2hhcnNGb3JBY3Rpb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKHJlZ2VuZXJhdGVFeGlzdGluZyAmJiAhY2FuUmVnZW5lcmF0ZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGJhc2VDb25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlID09PSAndXRpbGl0eScgJiZcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCA9PT0gQUlBY3Rpb25WYXJpYW50LlJFUEhSQVNFXHJcbiAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiYXNlQ29uZmlnKSwgeyBsYWJlbDogJ1JlcGhyYXNlJywgYmFzZVByb21wdDogVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgfSkgOiBiYXNlQ29uZmlnO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVG9uZUlkID0gdG9uZU92ZXJyaWRlSWQgfHxcclxuICAgICAgICAgICAgdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIGNvbmZpZy5kZWZhdWx0VG9uZUlkIHx8XHJcbiAgICAgICAgICAgICgoX2MgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYlswXSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmlkKTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2QgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGluSW5pdGlhbEFpUGhhc2UgPSBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudDtcclxuICAgICAgICBjb25zdCB0YWdQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25BY2NlcHQoe1xyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWNjZXB0ZWRUZXh0OiBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZTogaW5Jbml0aWFsQWlQaGFzZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoaW5Jbml0aWFsQWlQaGFzZSkge1xyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkFJVGFnQ29tcHV0ZWQgPT09IG51bGwgfHwgb25BSVRhZ0NvbXB1dGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVGFnQ29tcHV0ZWQodGFnUGF5bG9hZCk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCBzdWdnZXN0aW9uSW5kZXgsIHRlbXBsYXRlSWRdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgY29uc3QgYWN0aW9uQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgY29uc3QgdG9uZUlkID0gdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25Db25maWcuZGVmYXVsdFRvbmVJZCB8fFxyXG4gICAgICAgICAgICAgICAgKChfYiA9IChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWzBdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWQpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBhY3Rpb25Db25maWcubGFiZWwsXHJcbiAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBpc0dlbmVyYXRpbmcgJiYgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRlZDogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhY3VycmVudFRleHQudHJpbSgpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQubGVuZ3RoIDxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgNTApIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmF0aW5nIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSksXHJcbiAgICAgICAgICAgICAgICBzaG93VG9uZURyb3Bkb3duOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgISEoKF9jID0gYWN0aW9uQ29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubGVuZ3RoKSxcclxuICAgICAgICAgICAgICAgIHRvbmVzOiBhY3Rpb25Db25maWcudG9uZXMsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZDogdG9uZUlkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVuYWJsZWRBSUFjdGlvbnMsXHJcbiAgICAgICAgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMsXHJcbiAgICAgICAgYWN0aXZlQWN0aW9uUHJvbXB0cyxcclxuICAgICAgICB0b25lQnlBY3Rpb24sXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbixcclxuICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgIF0pO1xyXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBhZGRUZXh0T3JXcmFwLFxyXG4gICAgICAgICAgICBhZGRUZXh0LFxyXG4gICAgICAgICAgICBnZXQoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24sXHJcbiAgICAgICAgfTtcclxuICAgIH0sIFthZGRUZXh0T3JXcmFwLCBhZGRUZXh0LCBjdXJyZW50VGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChpbnB1dFZhbHVlIHx8ICcnKTtcclxuICAgIH0sIFtpbnB1dFZhbHVlLCBzZXRFZGl0b3JUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghbGltaXQgfHwgIW9uRXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBuZXh0RXJyb3IgPSBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdCA/IExJTUlUX1JFQUNIRUQgOiBlcnJvciAhPT0gbnVsbCAmJiBlcnJvciAhPT0gdm9pZCAwID8gZXJyb3IgOiAnJztcclxuICAgICAgICBpZiAobGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID09PSBuZXh0RXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPSBuZXh0RXJyb3I7XHJcbiAgICAgICAgb25FcnJvcihuZXh0RXJyb3IpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBlcnJvciwgbGltaXQsIG9uRXJyb3JdKTtcclxuICAgIHJldHVybiAoX2pzeHMoT3V0ZXJDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4gaGFuZGxlRmVlZGJhY2soJ2xpa2UnKSB9LCB7IGNoaWxkcmVuOiBfanN4KFRodW1ic1VwSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNsaWtlXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzbGlrZSBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKCdkaXNsaWtlJykgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSksIF9qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),XI=I("button","production"===process.env.NODE_ENV?{target:"ea7i3sh2"}:{target:"ea7i3sh2",label:"InstructionImprove"})("border:1px solid #5d3a72;color:#5d3a72;background:",a.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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBdUt5QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMsIEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG5pbXBvcnQgeyBidWlsZEFjdGlvblByb21wdCwgcmVxdWVzdEFJU3VnZ2VzdGlvbiB9IGZyb20gJy4vYWkvYXBpJztcclxuaW1wb3J0IHsgQ29udGFpbmVyLCBFZGl0b3JGb290ZXJSaWdodCwgRWRpdG9yRm9vdGVyUm93LCBFZGl0b3JGb290ZXJUaXRsZSwgT3V0ZXJDb250YWluZXIsIFRleHRTcGFjZSwgfSBmcm9tICcuL0N1c3RvbUVkaXRvci5zdHlsZWQnO1xyXG5pbXBvcnQgeyBBSUFjdGlvblZhcmlhbnQsIEFJRWRpdG9yQWN0aW9uVHlwZXMsIEVkaXRvckFjdGlvblR5cGVzLCBXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIH0gZnJvbSAnLi9XaGF0c0FwcFRleHRFZGl0b3JIZWFkZXInO1xyXG5jb25zdCBMSU1JVF9SRUFDSEVEID0gJ0NoYXJhY3RlciBsaW1pdCByZWFjaGVkJztcclxuY29uc3QgUkVQSFJBU0VfSURMRV9NUyA9IDMwMDA7XHJcbmNvbnN0IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTID0gNTtcclxuY29uc3QgTUFYX1NVR0dFU1RJT05TID0gMztcclxuY29uc3QgTEFSR0VfSU5QVVRfVEhSRVNIT0xEID0gMTIwMDtcclxuY29uc3QgVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgPSAnUmVwaHJhc2UgdGhpcyBXaGF0c0FwcCB1dGlsaXR5IHRlbXBsYXRlIHRvIGltcHJvdmUgY2xhcml0eSBhbmQgcmVhZGFiaWxpdHkgd2hpbGUgcHJlc2VydmluZyB2YXJpYWJsZXMsIGludGVudCwgYW5kIGNvbXBsaWFuY2UuJztcclxuY29uc3Qgc2tlbGV0b25QdWxzZSA9IGtleWZyYW1lcyBgXG5cdDAlIHsgb3BhY2l0eTogMC41NTsgfVxuXHQ1MCUgeyBvcGFjaXR5OiAxOyB9XG5cdDEwMCUgeyBvcGFjaXR5OiAwLjU1OyB9XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxNHB4IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogMTBweDtcblx0bWluLWhlaWdodDogMTUwcHg7XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkxpbmUgPSBzdHlsZWQuZGl2IGBcblx0aGVpZ2h0OiAxNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdHdpZHRoOiAkeyhwcm9wcykgPT4gcHJvcHMud2lkdGh9O1xuXHRiYWNrZ3JvdW5kOiAjZWNlY2VmO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25TZXNzaW9uQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG5cdHBhZGRpbmc6IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHRtYXgtaGVpZ2h0OiAyNjBweDtcblx0b3ZlcmZsb3cteTogc2Nyb2xsO1xuXHRzY3JvbGxiYXItd2lkdGg6IHRoaW47XG5cdHNjcm9sbGJhci1jb2xvcjogI2M4YzhjZiB0cmFuc3BhcmVudDtcblx0Ojotd2Via2l0LXNjcm9sbGJhciB7XG5cdFx0d2lkdGg6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcblx0XHRiYWNrZ3JvdW5kOiAjYzhjOGNmO1xuXHRcdGJvcmRlci1yYWRpdXM6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcblx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0fVxuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHR0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0ID0gc3R5bGVkLmRpdiBgXG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHR3aWR0aDogMTAwJTtcblx0bWluLWhlaWdodDogNDBweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db250cm9sc1JvdyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDZweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db3VudGVyID0gc3R5bGVkLnNwYW4gYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0Zm9udC1zaXplOiAxNHB4O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkljb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0Ym9yZGVyOiAwO1xuXHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0cGFkZGluZzogNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0Y3Vyc29yOiBwb2ludGVyO1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0dHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjEycyBlYXNlO1xuXHQ6bm90KDpkaXNhYmxlZCk6aG92ZXIge1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICR7Q09MT1JTLnN1cmZhY2UuaG92ZXJlZH07XG5cdH1cblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAwLjM1O1xuXHRcdGN1cnNvcjogbm90LWFsbG93ZWQ7XG5cdH1cbmA7XHJcbi8qKiBSZWdlbmVyYXRlIHN0YXlzIGZ1bGwgb3BhY2l0eSB3aGlsZSBkaXNhYmxlZCBzbyB0aGUgbG9hZGluZyBzaGltbWVyIHN0YXlzIHZpc2libGUgKHNhbWUgcHVsc2UgYXMgZWRpdG9yIHNrZWxldG9uKS4gKi9cclxuY29uc3QgU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24gPSBzdHlsZWQoU3VnZ2VzdGlvbkljb25CdXR0b24pIGBcblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAxO1xuXHRcdGN1cnNvcjogd2FpdDtcblx0fVxuYDtcclxuY29uc3QgUmVnZW5lcmF0ZUljb25TaGltbWVyID0gc3R5bGVkLmRpdiBgXG5cdHdpZHRoOiAxNHB4O1xuXHRoZWlnaHQ6IDE0cHg7XG5cdGJvcmRlci1yYWRpdXM6IDRweDtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0ZmxleC1zaHJpbms6IDA7XG5cdGFuaW1hdGlvbjogJHtza2VsZXRvblB1bHNlfSAxLjFzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuYDtcclxuLyoqIFNhbWUgYm90dG9tIHRvb2xiYXIgc2xvdCBhcyBgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyYCDigJQgcmVwbGFjZXMgdGhlIGZ1bGwgaWNvbi9BSSBwYW5lbCB3aGlsZSBvcGVuLiAqL1xyXG5jb25zdCBJbnN0cnVjdGlvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0cGFkZGluZzogOHB4IDEycHg7XG5cdGdhcDogMTBweDtcblx0Ym9yZGVyLXJhZGl1czogMCAwIDRweCA0cHg7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW5wdXRSb3cgPSBzdHlsZWQuZGl2IGBcblx0Ym9yZGVyOiAxcHggc29saWQgI2Y1YTRjMDtcblx0Ym9yZGVyLXJhZGl1czogMTBweDtcblx0cGFkZGluZzogOHB4IDEwcHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0ID0gc3R5bGVkLmlucHV0IGBcblx0ZmxleDogMTtcblx0bWluLXdpZHRoOiAwO1xuXHRib3JkZXI6IDA7XG5cdG91dGxpbmU6IG5vbmU7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25BY3Rpb25zID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQ2FuY2VsID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0Zm9udC13ZWlnaHQ6IDUwMDtcblx0cGFkZGluZzogMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbXByb3ZlID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICM1ZDNhNzI7XG5cdGNvbG9yOiAjNWQzYTcyO1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym9yZGVyLXJhZGl1czogOHB4O1xuXHRwYWRkaW5nOiA4cHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4xO1xuXHRmb250LXdlaWdodDogNjAwO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0ID0gc3R5bGVkLmRpdiBgXG5cdG1hcmdpbi10b3A6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDEycHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuXHRib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiA9IHN0eWxlZC5idXR0b24gYFxuXHR3aWR0aDogMTAwJTtcblx0Ym9yZGVyOiAwO1xuXHRib3JkZXItdG9wOiAxcHggc29saWQgJHtDT0xPUlMuc3Ryb2tlLnByaW1hcnl9O1xuXHRiYWNrZ3JvdW5kOiAkeyhwcm9wcykgPT4gKHByb3BzLnNlbGVjdGVkID8gJyNlNWYzZTgnIDogJ3RyYW5zcGFyZW50Jyl9O1xuXHRjb2xvcjogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjMWU2YjM0JyA6IENPTE9SUy5jb250ZW50LnByaW1hcnkpfTtcblx0dGV4dC1hbGlnbjogbGVmdDtcblx0cGFkZGluZzogMTJweCAxNHB4O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGxpbmUtaGVpZ2h0OiAxLjI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0OmZpcnN0LW9mLXR5cGUge1xuXHRcdGJvcmRlci10b3A6IDA7XG5cdH1cbmA7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgdGVtcGxhdGVUeXBlID0gJ21hcmtldGluZycsIHRlbXBsYXRlSWQsIHJlcXVlc3RFeGVjdXRvciwgYmFzZVVybCwgZW5kcG9pbnRQYXRoLCB1c2VDYXNlLCBzdG9yZUlkLCBhcGlBZGFwdGVyLCBjb252ZXJzYXRpb25JZCA9ICd3aGF0c2FwcC10ZW1wbGF0ZS1lZGl0b3InLCBzeXN0ZW1JZCA9ICd3aGF0c2FwcC13cml0ZXInLCBpbnRlbnQgPSAnZGVmYXVsdCcsIGVuYWJsZWRBSUFjdGlvbnMgPSBbXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlNIT1JURU4sXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FWFBBTkQsXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FTU9KSUZZLFxyXG4gICAgXSwgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMgPSBmYWxzZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCBhaUFjdGlvbk1pbkNoYXJzLCBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gREVGQVVMVF9JTlNUUlVDVElPTl9TVUdHRVNUSU9OUywgb25BSUV2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFJRXZlbnRcIiwgXCJvbkFJVGFnQ29tcHV0ZWRcIiwgXCJwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcIiwgXCJlZGl0b3JIZWFkZXJcIiwgXCJvbkFJVG9uZVNlbGVjdFwiLCBcIm9uQUlBY3Rpb25SZXF1ZXN0XCIsIFwib25CdWlsZEFJUHJvbXB0XCJdKTtcclxuICAgIGNvbnN0IHRleHRTcGFjZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IFtjdXJyZW50VGV4dCwgc2V0Q3VycmVudFRleHRdID0gdXNlU3RhdGUoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbaXNSZXBocmFzZUhpZ2hsaWdodGVkLCBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW3JlcGhyYXNlSGlnaGxpZ2h0Q291bnQsIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnRdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbaXNHZW5lcmF0aW5nLCBzZXRJc0dlbmVyYXRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2lzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2luc3RydWN0aW9uVGV4dCwgc2V0SW5zdHJ1Y3Rpb25UZXh0XSA9IHVzZVN0YXRlKCcnKTtcclxuICAgIGNvbnN0IFt0b25lQnlBY3Rpb24sIHNldFRvbmVCeUFjdGlvbl0gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkJhc2VUZXh0LCBzZXRTdWdnZXN0aW9uQmFzZVRleHRdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkNhbmRpZGF0ZXMsIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzXSA9IHVzZVN0YXRlKFtdKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uSW5kZXgsIHNldFN1Z2dlc3Rpb25JbmRleF0gPSB1c2VTdGF0ZSgwKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGVdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uU2Nyb2xsUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgcmVwaHJhc2VJZGxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgaGlnaGxpZ2h0UmVzZXRSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gISFwcmVmaWxsV2FzQWlHZW5lcmF0ZWQ7XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgY29uc3QgYWN0aXZlQWN0aW9uUHJvbXB0cyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlQWN0aW9uUHJvbXB0cyh0ZW1wbGF0ZVR5cGUsIHByb21wdE92ZXJyaWRlcywgcmVwaHJhc2VUb25lcyk7XHJcbiAgICB9LCBbcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCB0ZW1wbGF0ZVR5cGVdKTtcclxuICAgIGNvbnN0IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmICghcXVlcnkpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5maWx0ZXIoKHN1Z2dlc3Rpb24pID0+IHN1Z2dlc3Rpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkpO1xyXG4gICAgfSwgW2luc3RydWN0aW9uU3VnZ2VzdGlvbnMsIGluc3RydWN0aW9uVGV4dF0pO1xyXG4gICAgY29uc3QgbWluQ2hhcnNCeUFjdGlvbiA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSUyksIChhaUFjdGlvbk1pbkNoYXJzIHx8IHt9KSk7XHJcbiAgICB9LCBbYWlBY3Rpb25NaW5DaGFyc10pO1xyXG4gICAgY29uc3QgcmVwaHJhc2VNaW5DaGFycyA9IG1pbkNoYXJzQnlBY3Rpb25bQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV0gfHxcclxuICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV07XHJcbiAgICBjb25zdCBlbWl0QUlFdmVudCA9IHVzZUNhbGxiYWNrKChuYW1lLCBwYXlsb2FkKSA9PiB7XHJcbiAgICAgICAgb25BSUV2ZW50ID09PSBudWxsIHx8IG9uQUlFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSUV2ZW50KG5hbWUsIHBheWxvYWQpO1xyXG4gICAgfSwgW29uQUlFdmVudF0pO1xyXG4gICAgY29uc3Qgc2V0RWRpdG9yVGV4dCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIHNldEN1cnJlbnRUZXh0KChwcmV2KSA9PiAocHJldiA9PT0gbmV4dFRleHQgPyBwcmV2IDogbmV4dFRleHQpKTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGVtaXRDaGFuZ2VXaXRoR3VhcmQgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlZmVycmVkSHRtbFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5leHRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIG5leHRUZXh0KTtcclxuICAgICAgICAgICAgZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChuZXh0VGV4dCkpO1xyXG4gICAgICAgICAgICB9LCAxNik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICB9LCBbb25DaGFuZ2VdKTtcclxuICAgIGNvbnN0IGNsZWFyU3VnZ2VzdGlvblNlc3Npb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0KG51bGwpO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtdKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUobnVsbCk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgPj0gTUFYX1JFUEhSQVNFX0hJR0hMSUdIVFMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuZXh0Q291bnQgPSByZXBocmFzZUhpZ2hsaWdodENvdW50ICsgMTtcclxuICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KG5leHRDb3VudCk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIGVkaXRvckluc3RhbmNlS2V5KSB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oZ2V0SGlnaGxpZ2h0U3RvcmFnZUtleShlZGl0b3JJbnN0YW5jZUtleSksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCByZXBocmFzZUhpZ2hsaWdodENvdW50XSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpKSB8fFxyXG4gICAgICAgICAgICAnMCcpO1xyXG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGNhY2hlZCkpIHtcclxuICAgICAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChjYWNoZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBlbGlnaWJsZSA9ICEhY3VycmVudFRleHQudHJpbSgpICYmIGN1cnJlbnRUZXh0Lmxlbmd0aCA+PSByZXBocmFzZU1pbkNoYXJzO1xyXG4gICAgICAgIGlmIChwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBlbGlnaWJsZTtcclxuICAgICAgICAgICAgaWYgKGVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjcm9zc2VkVGhyZXNob2xkID0gIXByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgJiYgZWxpZ2libGU7XHJcbiAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IHRydWU7XHJcbiAgICAgICAgaWYgKGNyb3NzZWRUaHJlc2hvbGQpIHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzW3N1Z2dlc3Rpb25JbmRleF0gfHwgJyc7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2IsIF9jLCBfZDtcclxuICAgICAgICBpZiAoIW9uQUlBY3Rpb25SZXF1ZXN0ICYmXHJcbiAgICAgICAgICAgICFhcGlBZGFwdGVyICYmXHJcbiAgICAgICAgICAgICghcmVxdWVzdEV4ZWN1dG9yIHx8ICFiYXNlVXJsKSkge1xyXG4gICAgICAgICAgICBvbkVycm9yID09PSBudWxsIHx8IG9uRXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRXJyb3IoJ0FJIGNvbmZpZ3VyYXRpb24gbWlzc2luZycpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY3VycmVudFRleHQudHJpbSgpKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbWluQ2hhcnNGb3JBY3Rpb24gPSBtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICA1MDtcclxuICAgICAgICBpZiAoY3VycmVudFRleHQubGVuZ3RoIDwgbWluQ2hhcnNGb3JBY3Rpb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKHJlZ2VuZXJhdGVFeGlzdGluZyAmJiAhY2FuUmVnZW5lcmF0ZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGJhc2VDb25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlID09PSAndXRpbGl0eScgJiZcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCA9PT0gQUlBY3Rpb25WYXJpYW50LlJFUEhSQVNFXHJcbiAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiYXNlQ29uZmlnKSwgeyBsYWJlbDogJ1JlcGhyYXNlJywgYmFzZVByb21wdDogVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgfSkgOiBiYXNlQ29uZmlnO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVG9uZUlkID0gdG9uZU92ZXJyaWRlSWQgfHxcclxuICAgICAgICAgICAgdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIGNvbmZpZy5kZWZhdWx0VG9uZUlkIHx8XHJcbiAgICAgICAgICAgICgoX2MgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYlswXSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmlkKTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2QgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGluSW5pdGlhbEFpUGhhc2UgPSBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudDtcclxuICAgICAgICBjb25zdCB0YWdQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25BY2NlcHQoe1xyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWNjZXB0ZWRUZXh0OiBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZTogaW5Jbml0aWFsQWlQaGFzZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoaW5Jbml0aWFsQWlQaGFzZSkge1xyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkFJVGFnQ29tcHV0ZWQgPT09IG51bGwgfHwgb25BSVRhZ0NvbXB1dGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVGFnQ29tcHV0ZWQodGFnUGF5bG9hZCk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCBzdWdnZXN0aW9uSW5kZXgsIHRlbXBsYXRlSWRdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgY29uc3QgYWN0aW9uQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgY29uc3QgdG9uZUlkID0gdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25Db25maWcuZGVmYXVsdFRvbmVJZCB8fFxyXG4gICAgICAgICAgICAgICAgKChfYiA9IChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWzBdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWQpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBhY3Rpb25Db25maWcubGFiZWwsXHJcbiAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBpc0dlbmVyYXRpbmcgJiYgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRlZDogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhY3VycmVudFRleHQudHJpbSgpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQubGVuZ3RoIDxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgNTApIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmF0aW5nIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSksXHJcbiAgICAgICAgICAgICAgICBzaG93VG9uZURyb3Bkb3duOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgISEoKF9jID0gYWN0aW9uQ29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubGVuZ3RoKSxcclxuICAgICAgICAgICAgICAgIHRvbmVzOiBhY3Rpb25Db25maWcudG9uZXMsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZDogdG9uZUlkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVuYWJsZWRBSUFjdGlvbnMsXHJcbiAgICAgICAgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMsXHJcbiAgICAgICAgYWN0aXZlQWN0aW9uUHJvbXB0cyxcclxuICAgICAgICB0b25lQnlBY3Rpb24sXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbixcclxuICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgIF0pO1xyXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBhZGRUZXh0T3JXcmFwLFxyXG4gICAgICAgICAgICBhZGRUZXh0LFxyXG4gICAgICAgICAgICBnZXQoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24sXHJcbiAgICAgICAgfTtcclxuICAgIH0sIFthZGRUZXh0T3JXcmFwLCBhZGRUZXh0LCBjdXJyZW50VGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChpbnB1dFZhbHVlIHx8ICcnKTtcclxuICAgIH0sIFtpbnB1dFZhbHVlLCBzZXRFZGl0b3JUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghbGltaXQgfHwgIW9uRXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBuZXh0RXJyb3IgPSBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdCA/IExJTUlUX1JFQUNIRUQgOiBlcnJvciAhPT0gbnVsbCAmJiBlcnJvciAhPT0gdm9pZCAwID8gZXJyb3IgOiAnJztcclxuICAgICAgICBpZiAobGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID09PSBuZXh0RXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPSBuZXh0RXJyb3I7XHJcbiAgICAgICAgb25FcnJvcihuZXh0RXJyb3IpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBlcnJvciwgbGltaXQsIG9uRXJyb3JdKTtcclxuICAgIHJldHVybiAoX2pzeHMoT3V0ZXJDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4gaGFuZGxlRmVlZGJhY2soJ2xpa2UnKSB9LCB7IGNoaWxkcmVuOiBfanN4KFRodW1ic1VwSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNsaWtlXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzbGlrZSBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKCdkaXNsaWtlJykgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSksIF9qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),dI=I("div","production"===process.env.NODE_ENV?{target:"ea7i3sh1"}:{target:"ea7i3sh1",label:"InstructionSuggestionList"})("margin-top:10px;border-radius:12px;background:",a.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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBa0w2QyIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMsIEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG5pbXBvcnQgeyBidWlsZEFjdGlvblByb21wdCwgcmVxdWVzdEFJU3VnZ2VzdGlvbiB9IGZyb20gJy4vYWkvYXBpJztcclxuaW1wb3J0IHsgQ29udGFpbmVyLCBFZGl0b3JGb290ZXJSaWdodCwgRWRpdG9yRm9vdGVyUm93LCBFZGl0b3JGb290ZXJUaXRsZSwgT3V0ZXJDb250YWluZXIsIFRleHRTcGFjZSwgfSBmcm9tICcuL0N1c3RvbUVkaXRvci5zdHlsZWQnO1xyXG5pbXBvcnQgeyBBSUFjdGlvblZhcmlhbnQsIEFJRWRpdG9yQWN0aW9uVHlwZXMsIEVkaXRvckFjdGlvblR5cGVzLCBXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIH0gZnJvbSAnLi9XaGF0c0FwcFRleHRFZGl0b3JIZWFkZXInO1xyXG5jb25zdCBMSU1JVF9SRUFDSEVEID0gJ0NoYXJhY3RlciBsaW1pdCByZWFjaGVkJztcclxuY29uc3QgUkVQSFJBU0VfSURMRV9NUyA9IDMwMDA7XHJcbmNvbnN0IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTID0gNTtcclxuY29uc3QgTUFYX1NVR0dFU1RJT05TID0gMztcclxuY29uc3QgTEFSR0VfSU5QVVRfVEhSRVNIT0xEID0gMTIwMDtcclxuY29uc3QgVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgPSAnUmVwaHJhc2UgdGhpcyBXaGF0c0FwcCB1dGlsaXR5IHRlbXBsYXRlIHRvIGltcHJvdmUgY2xhcml0eSBhbmQgcmVhZGFiaWxpdHkgd2hpbGUgcHJlc2VydmluZyB2YXJpYWJsZXMsIGludGVudCwgYW5kIGNvbXBsaWFuY2UuJztcclxuY29uc3Qgc2tlbGV0b25QdWxzZSA9IGtleWZyYW1lcyBgXG5cdDAlIHsgb3BhY2l0eTogMC41NTsgfVxuXHQ1MCUgeyBvcGFjaXR5OiAxOyB9XG5cdDEwMCUgeyBvcGFjaXR5OiAwLjU1OyB9XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxNHB4IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogMTBweDtcblx0bWluLWhlaWdodDogMTUwcHg7XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkxpbmUgPSBzdHlsZWQuZGl2IGBcblx0aGVpZ2h0OiAxNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdHdpZHRoOiAkeyhwcm9wcykgPT4gcHJvcHMud2lkdGh9O1xuXHRiYWNrZ3JvdW5kOiAjZWNlY2VmO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25TZXNzaW9uQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG5cdHBhZGRpbmc6IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHRtYXgtaGVpZ2h0OiAyNjBweDtcblx0b3ZlcmZsb3cteTogc2Nyb2xsO1xuXHRzY3JvbGxiYXItd2lkdGg6IHRoaW47XG5cdHNjcm9sbGJhci1jb2xvcjogI2M4YzhjZiB0cmFuc3BhcmVudDtcblx0Ojotd2Via2l0LXNjcm9sbGJhciB7XG5cdFx0d2lkdGg6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcblx0XHRiYWNrZ3JvdW5kOiAjYzhjOGNmO1xuXHRcdGJvcmRlci1yYWRpdXM6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcblx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0fVxuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHR0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0ID0gc3R5bGVkLmRpdiBgXG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHR3aWR0aDogMTAwJTtcblx0bWluLWhlaWdodDogNDBweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db250cm9sc1JvdyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDZweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db3VudGVyID0gc3R5bGVkLnNwYW4gYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0Zm9udC1zaXplOiAxNHB4O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkljb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0Ym9yZGVyOiAwO1xuXHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0cGFkZGluZzogNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0Y3Vyc29yOiBwb2ludGVyO1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0dHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjEycyBlYXNlO1xuXHQ6bm90KDpkaXNhYmxlZCk6aG92ZXIge1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICR7Q09MT1JTLnN1cmZhY2UuaG92ZXJlZH07XG5cdH1cblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAwLjM1O1xuXHRcdGN1cnNvcjogbm90LWFsbG93ZWQ7XG5cdH1cbmA7XHJcbi8qKiBSZWdlbmVyYXRlIHN0YXlzIGZ1bGwgb3BhY2l0eSB3aGlsZSBkaXNhYmxlZCBzbyB0aGUgbG9hZGluZyBzaGltbWVyIHN0YXlzIHZpc2libGUgKHNhbWUgcHVsc2UgYXMgZWRpdG9yIHNrZWxldG9uKS4gKi9cclxuY29uc3QgU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24gPSBzdHlsZWQoU3VnZ2VzdGlvbkljb25CdXR0b24pIGBcblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAxO1xuXHRcdGN1cnNvcjogd2FpdDtcblx0fVxuYDtcclxuY29uc3QgUmVnZW5lcmF0ZUljb25TaGltbWVyID0gc3R5bGVkLmRpdiBgXG5cdHdpZHRoOiAxNHB4O1xuXHRoZWlnaHQ6IDE0cHg7XG5cdGJvcmRlci1yYWRpdXM6IDRweDtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0ZmxleC1zaHJpbms6IDA7XG5cdGFuaW1hdGlvbjogJHtza2VsZXRvblB1bHNlfSAxLjFzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuYDtcclxuLyoqIFNhbWUgYm90dG9tIHRvb2xiYXIgc2xvdCBhcyBgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyYCDigJQgcmVwbGFjZXMgdGhlIGZ1bGwgaWNvbi9BSSBwYW5lbCB3aGlsZSBvcGVuLiAqL1xyXG5jb25zdCBJbnN0cnVjdGlvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0cGFkZGluZzogOHB4IDEycHg7XG5cdGdhcDogMTBweDtcblx0Ym9yZGVyLXJhZGl1czogMCAwIDRweCA0cHg7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW5wdXRSb3cgPSBzdHlsZWQuZGl2IGBcblx0Ym9yZGVyOiAxcHggc29saWQgI2Y1YTRjMDtcblx0Ym9yZGVyLXJhZGl1czogMTBweDtcblx0cGFkZGluZzogOHB4IDEwcHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0ID0gc3R5bGVkLmlucHV0IGBcblx0ZmxleDogMTtcblx0bWluLXdpZHRoOiAwO1xuXHRib3JkZXI6IDA7XG5cdG91dGxpbmU6IG5vbmU7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25BY3Rpb25zID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQ2FuY2VsID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0Zm9udC13ZWlnaHQ6IDUwMDtcblx0cGFkZGluZzogMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbXByb3ZlID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICM1ZDNhNzI7XG5cdGNvbG9yOiAjNWQzYTcyO1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym9yZGVyLXJhZGl1czogOHB4O1xuXHRwYWRkaW5nOiA4cHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4xO1xuXHRmb250LXdlaWdodDogNjAwO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0ID0gc3R5bGVkLmRpdiBgXG5cdG1hcmdpbi10b3A6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDEycHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuXHRib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiA9IHN0eWxlZC5idXR0b24gYFxuXHR3aWR0aDogMTAwJTtcblx0Ym9yZGVyOiAwO1xuXHRib3JkZXItdG9wOiAxcHggc29saWQgJHtDT0xPUlMuc3Ryb2tlLnByaW1hcnl9O1xuXHRiYWNrZ3JvdW5kOiAkeyhwcm9wcykgPT4gKHByb3BzLnNlbGVjdGVkID8gJyNlNWYzZTgnIDogJ3RyYW5zcGFyZW50Jyl9O1xuXHRjb2xvcjogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjMWU2YjM0JyA6IENPTE9SUy5jb250ZW50LnByaW1hcnkpfTtcblx0dGV4dC1hbGlnbjogbGVmdDtcblx0cGFkZGluZzogMTJweCAxNHB4O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGxpbmUtaGVpZ2h0OiAxLjI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0OmZpcnN0LW9mLXR5cGUge1xuXHRcdGJvcmRlci10b3A6IDA7XG5cdH1cbmA7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgdGVtcGxhdGVUeXBlID0gJ21hcmtldGluZycsIHRlbXBsYXRlSWQsIHJlcXVlc3RFeGVjdXRvciwgYmFzZVVybCwgZW5kcG9pbnRQYXRoLCB1c2VDYXNlLCBzdG9yZUlkLCBhcGlBZGFwdGVyLCBjb252ZXJzYXRpb25JZCA9ICd3aGF0c2FwcC10ZW1wbGF0ZS1lZGl0b3InLCBzeXN0ZW1JZCA9ICd3aGF0c2FwcC13cml0ZXInLCBpbnRlbnQgPSAnZGVmYXVsdCcsIGVuYWJsZWRBSUFjdGlvbnMgPSBbXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlNIT1JURU4sXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FWFBBTkQsXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FTU9KSUZZLFxyXG4gICAgXSwgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMgPSBmYWxzZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCBhaUFjdGlvbk1pbkNoYXJzLCBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gREVGQVVMVF9JTlNUUlVDVElPTl9TVUdHRVNUSU9OUywgb25BSUV2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFJRXZlbnRcIiwgXCJvbkFJVGFnQ29tcHV0ZWRcIiwgXCJwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcIiwgXCJlZGl0b3JIZWFkZXJcIiwgXCJvbkFJVG9uZVNlbGVjdFwiLCBcIm9uQUlBY3Rpb25SZXF1ZXN0XCIsIFwib25CdWlsZEFJUHJvbXB0XCJdKTtcclxuICAgIGNvbnN0IHRleHRTcGFjZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IFtjdXJyZW50VGV4dCwgc2V0Q3VycmVudFRleHRdID0gdXNlU3RhdGUoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbaXNSZXBocmFzZUhpZ2hsaWdodGVkLCBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW3JlcGhyYXNlSGlnaGxpZ2h0Q291bnQsIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnRdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbaXNHZW5lcmF0aW5nLCBzZXRJc0dlbmVyYXRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2lzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2luc3RydWN0aW9uVGV4dCwgc2V0SW5zdHJ1Y3Rpb25UZXh0XSA9IHVzZVN0YXRlKCcnKTtcclxuICAgIGNvbnN0IFt0b25lQnlBY3Rpb24sIHNldFRvbmVCeUFjdGlvbl0gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkJhc2VUZXh0LCBzZXRTdWdnZXN0aW9uQmFzZVRleHRdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkNhbmRpZGF0ZXMsIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzXSA9IHVzZVN0YXRlKFtdKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uSW5kZXgsIHNldFN1Z2dlc3Rpb25JbmRleF0gPSB1c2VTdGF0ZSgwKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGVdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uU2Nyb2xsUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgcmVwaHJhc2VJZGxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgaGlnaGxpZ2h0UmVzZXRSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gISFwcmVmaWxsV2FzQWlHZW5lcmF0ZWQ7XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgY29uc3QgYWN0aXZlQWN0aW9uUHJvbXB0cyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlQWN0aW9uUHJvbXB0cyh0ZW1wbGF0ZVR5cGUsIHByb21wdE92ZXJyaWRlcywgcmVwaHJhc2VUb25lcyk7XHJcbiAgICB9LCBbcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCB0ZW1wbGF0ZVR5cGVdKTtcclxuICAgIGNvbnN0IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmICghcXVlcnkpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5maWx0ZXIoKHN1Z2dlc3Rpb24pID0+IHN1Z2dlc3Rpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkpO1xyXG4gICAgfSwgW2luc3RydWN0aW9uU3VnZ2VzdGlvbnMsIGluc3RydWN0aW9uVGV4dF0pO1xyXG4gICAgY29uc3QgbWluQ2hhcnNCeUFjdGlvbiA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSUyksIChhaUFjdGlvbk1pbkNoYXJzIHx8IHt9KSk7XHJcbiAgICB9LCBbYWlBY3Rpb25NaW5DaGFyc10pO1xyXG4gICAgY29uc3QgcmVwaHJhc2VNaW5DaGFycyA9IG1pbkNoYXJzQnlBY3Rpb25bQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV0gfHxcclxuICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV07XHJcbiAgICBjb25zdCBlbWl0QUlFdmVudCA9IHVzZUNhbGxiYWNrKChuYW1lLCBwYXlsb2FkKSA9PiB7XHJcbiAgICAgICAgb25BSUV2ZW50ID09PSBudWxsIHx8IG9uQUlFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSUV2ZW50KG5hbWUsIHBheWxvYWQpO1xyXG4gICAgfSwgW29uQUlFdmVudF0pO1xyXG4gICAgY29uc3Qgc2V0RWRpdG9yVGV4dCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIHNldEN1cnJlbnRUZXh0KChwcmV2KSA9PiAocHJldiA9PT0gbmV4dFRleHQgPyBwcmV2IDogbmV4dFRleHQpKTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGVtaXRDaGFuZ2VXaXRoR3VhcmQgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlZmVycmVkSHRtbFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5leHRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIG5leHRUZXh0KTtcclxuICAgICAgICAgICAgZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChuZXh0VGV4dCkpO1xyXG4gICAgICAgICAgICB9LCAxNik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICB9LCBbb25DaGFuZ2VdKTtcclxuICAgIGNvbnN0IGNsZWFyU3VnZ2VzdGlvblNlc3Npb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0KG51bGwpO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtdKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUobnVsbCk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgPj0gTUFYX1JFUEhSQVNFX0hJR0hMSUdIVFMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuZXh0Q291bnQgPSByZXBocmFzZUhpZ2hsaWdodENvdW50ICsgMTtcclxuICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KG5leHRDb3VudCk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIGVkaXRvckluc3RhbmNlS2V5KSB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oZ2V0SGlnaGxpZ2h0U3RvcmFnZUtleShlZGl0b3JJbnN0YW5jZUtleSksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCByZXBocmFzZUhpZ2hsaWdodENvdW50XSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpKSB8fFxyXG4gICAgICAgICAgICAnMCcpO1xyXG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGNhY2hlZCkpIHtcclxuICAgICAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChjYWNoZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBlbGlnaWJsZSA9ICEhY3VycmVudFRleHQudHJpbSgpICYmIGN1cnJlbnRUZXh0Lmxlbmd0aCA+PSByZXBocmFzZU1pbkNoYXJzO1xyXG4gICAgICAgIGlmIChwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBlbGlnaWJsZTtcclxuICAgICAgICAgICAgaWYgKGVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjcm9zc2VkVGhyZXNob2xkID0gIXByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgJiYgZWxpZ2libGU7XHJcbiAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IHRydWU7XHJcbiAgICAgICAgaWYgKGNyb3NzZWRUaHJlc2hvbGQpIHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzW3N1Z2dlc3Rpb25JbmRleF0gfHwgJyc7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2IsIF9jLCBfZDtcclxuICAgICAgICBpZiAoIW9uQUlBY3Rpb25SZXF1ZXN0ICYmXHJcbiAgICAgICAgICAgICFhcGlBZGFwdGVyICYmXHJcbiAgICAgICAgICAgICghcmVxdWVzdEV4ZWN1dG9yIHx8ICFiYXNlVXJsKSkge1xyXG4gICAgICAgICAgICBvbkVycm9yID09PSBudWxsIHx8IG9uRXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRXJyb3IoJ0FJIGNvbmZpZ3VyYXRpb24gbWlzc2luZycpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY3VycmVudFRleHQudHJpbSgpKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbWluQ2hhcnNGb3JBY3Rpb24gPSBtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICA1MDtcclxuICAgICAgICBpZiAoY3VycmVudFRleHQubGVuZ3RoIDwgbWluQ2hhcnNGb3JBY3Rpb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKHJlZ2VuZXJhdGVFeGlzdGluZyAmJiAhY2FuUmVnZW5lcmF0ZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGJhc2VDb25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlID09PSAndXRpbGl0eScgJiZcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCA9PT0gQUlBY3Rpb25WYXJpYW50LlJFUEhSQVNFXHJcbiAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiYXNlQ29uZmlnKSwgeyBsYWJlbDogJ1JlcGhyYXNlJywgYmFzZVByb21wdDogVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgfSkgOiBiYXNlQ29uZmlnO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVG9uZUlkID0gdG9uZU92ZXJyaWRlSWQgfHxcclxuICAgICAgICAgICAgdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIGNvbmZpZy5kZWZhdWx0VG9uZUlkIHx8XHJcbiAgICAgICAgICAgICgoX2MgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYlswXSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmlkKTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2QgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGluSW5pdGlhbEFpUGhhc2UgPSBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudDtcclxuICAgICAgICBjb25zdCB0YWdQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25BY2NlcHQoe1xyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWNjZXB0ZWRUZXh0OiBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZTogaW5Jbml0aWFsQWlQaGFzZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoaW5Jbml0aWFsQWlQaGFzZSkge1xyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkFJVGFnQ29tcHV0ZWQgPT09IG51bGwgfHwgb25BSVRhZ0NvbXB1dGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVGFnQ29tcHV0ZWQodGFnUGF5bG9hZCk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCBzdWdnZXN0aW9uSW5kZXgsIHRlbXBsYXRlSWRdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgY29uc3QgYWN0aW9uQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgY29uc3QgdG9uZUlkID0gdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25Db25maWcuZGVmYXVsdFRvbmVJZCB8fFxyXG4gICAgICAgICAgICAgICAgKChfYiA9IChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWzBdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWQpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBhY3Rpb25Db25maWcubGFiZWwsXHJcbiAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBpc0dlbmVyYXRpbmcgJiYgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRlZDogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhY3VycmVudFRleHQudHJpbSgpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQubGVuZ3RoIDxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgNTApIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmF0aW5nIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSksXHJcbiAgICAgICAgICAgICAgICBzaG93VG9uZURyb3Bkb3duOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgISEoKF9jID0gYWN0aW9uQ29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubGVuZ3RoKSxcclxuICAgICAgICAgICAgICAgIHRvbmVzOiBhY3Rpb25Db25maWcudG9uZXMsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZDogdG9uZUlkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVuYWJsZWRBSUFjdGlvbnMsXHJcbiAgICAgICAgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMsXHJcbiAgICAgICAgYWN0aXZlQWN0aW9uUHJvbXB0cyxcclxuICAgICAgICB0b25lQnlBY3Rpb24sXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbixcclxuICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgIF0pO1xyXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBhZGRUZXh0T3JXcmFwLFxyXG4gICAgICAgICAgICBhZGRUZXh0LFxyXG4gICAgICAgICAgICBnZXQoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24sXHJcbiAgICAgICAgfTtcclxuICAgIH0sIFthZGRUZXh0T3JXcmFwLCBhZGRUZXh0LCBjdXJyZW50VGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChpbnB1dFZhbHVlIHx8ICcnKTtcclxuICAgIH0sIFtpbnB1dFZhbHVlLCBzZXRFZGl0b3JUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghbGltaXQgfHwgIW9uRXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBuZXh0RXJyb3IgPSBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdCA/IExJTUlUX1JFQUNIRUQgOiBlcnJvciAhPT0gbnVsbCAmJiBlcnJvciAhPT0gdm9pZCAwID8gZXJyb3IgOiAnJztcclxuICAgICAgICBpZiAobGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID09PSBuZXh0RXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPSBuZXh0RXJyb3I7XHJcbiAgICAgICAgb25FcnJvcihuZXh0RXJyb3IpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBlcnJvciwgbGltaXQsIG9uRXJyb3JdKTtcclxuICAgIHJldHVybiAoX2pzeHMoT3V0ZXJDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4gaGFuZGxlRmVlZGJhY2soJ2xpa2UnKSB9LCB7IGNoaWxkcmVuOiBfanN4KFRodW1ic1VwSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNsaWtlXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzbGlrZSBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKCdkaXNsaWtlJykgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSksIF9qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),VI=I("button","production"===process.env.NODE_ENV?{target:"ea7i3sh0"}:{target:"ea7i3sh0",label:"InstructionSuggestionButton"})("width:100%;border:0;border-top:1px solid ",a.stroke.primary,";background:",(I=>I.selected?"#e5f3e8":"transparent"),";color:",(I=>I.selected?"#1e6b34":a.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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIldoYXRzQXBwVGV4dEVkaXRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBeUxrRCIsImZpbGUiOiJXaGF0c0FwcFRleHRFZGl0b3IudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hd2FpdGVyLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcclxuaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMsIEZyYWdtZW50IGFzIF9GcmFnbWVudCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xyXG5pbXBvcnQgeyBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XHJcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcclxuaW1wb3J0IENoZWNrSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9jaGVjay5zdmcnO1xyXG5pbXBvcnQgQ2hldnJvbkxlZnRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25MZWZ0LnN2Zyc7XHJcbmltcG9ydCBDaGV2cm9uUmlnaHRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2NoZXZyb25SaWdodC5zdmcnO1xyXG5pbXBvcnQgQ3Jvc3NJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL2Nyb3NzLnN2Zyc7XHJcbmltcG9ydCBFZGl0SWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9lZGl0LnN2Zyc7XHJcbmltcG9ydCBJbmZvSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy9pbmZvLnN2Zyc7XHJcbmltcG9ydCBSZXdpbmRJY29uIGZyb20gJ0BzcmMvYXNzZXRzL2ljb25zL3Jld2luZC5zdmcnO1xyXG5pbXBvcnQgVGh1bWJzRG93bkljb24gZnJvbSAnQHNyYy9hc3NldHMvaWNvbnMvdGh1bWJzX2Rvd24uc3ZnJztcclxuaW1wb3J0IFRodW1ic1VwSWNvbiBmcm9tICdAc3JjL2Fzc2V0cy9pY29ucy90aHVtYnNfdXAuc3ZnJztcclxuaW1wb3J0IHsgQmFzZVdoYXRzYXBwQ29udGVudExhbmdIZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9CYXNlV2hhdHNhcHBDb250ZW50TGFuZy5oZWxwZXJcIjtcclxuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL1RoZW1lXCI7XHJcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICcuLi90b29sdGlwcy9Ub29sdGlwJztcclxuaW1wb3J0IHsgQm9keUNhcHRpb24sIFRpdGxlU21hbGwgfSBmcm9tICcuLi9UeXBvZ3JhcGh5U3R5bGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlMsIERFRkFVTFRfSU5TVFJVQ1RJT05fU1VHR0VTVElPTlMsIHJlc29sdmVBY3Rpb25Qcm9tcHRzLCB9IGZyb20gJy4vYWkvYWN0aW9uUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBjb21wdXRlQWlUYWdPbkFjY2VwdCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG5pbXBvcnQgeyBidWlsZEFjdGlvblByb21wdCwgcmVxdWVzdEFJU3VnZ2VzdGlvbiB9IGZyb20gJy4vYWkvYXBpJztcclxuaW1wb3J0IHsgQ29udGFpbmVyLCBFZGl0b3JGb290ZXJSaWdodCwgRWRpdG9yRm9vdGVyUm93LCBFZGl0b3JGb290ZXJUaXRsZSwgT3V0ZXJDb250YWluZXIsIFRleHRTcGFjZSwgfSBmcm9tICcuL0N1c3RvbUVkaXRvci5zdHlsZWQnO1xyXG5pbXBvcnQgeyBBSUFjdGlvblZhcmlhbnQsIEFJRWRpdG9yQWN0aW9uVHlwZXMsIEVkaXRvckFjdGlvblR5cGVzLCBXaGF0c0FwcFRleHRFZGl0b3JIZWFkZXIsIH0gZnJvbSAnLi9XaGF0c0FwcFRleHRFZGl0b3JIZWFkZXInO1xyXG5jb25zdCBMSU1JVF9SRUFDSEVEID0gJ0NoYXJhY3RlciBsaW1pdCByZWFjaGVkJztcclxuY29uc3QgUkVQSFJBU0VfSURMRV9NUyA9IDMwMDA7XHJcbmNvbnN0IE1BWF9SRVBIUkFTRV9ISUdITElHSFRTID0gNTtcclxuY29uc3QgTUFYX1NVR0dFU1RJT05TID0gMztcclxuY29uc3QgTEFSR0VfSU5QVVRfVEhSRVNIT0xEID0gMTIwMDtcclxuY29uc3QgVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgPSAnUmVwaHJhc2UgdGhpcyBXaGF0c0FwcCB1dGlsaXR5IHRlbXBsYXRlIHRvIGltcHJvdmUgY2xhcml0eSBhbmQgcmVhZGFiaWxpdHkgd2hpbGUgcHJlc2VydmluZyB2YXJpYWJsZXMsIGludGVudCwgYW5kIGNvbXBsaWFuY2UuJztcclxuY29uc3Qgc2tlbGV0b25QdWxzZSA9IGtleWZyYW1lcyBgXG5cdDAlIHsgb3BhY2l0eTogMC41NTsgfVxuXHQ1MCUgeyBvcGFjaXR5OiAxOyB9XG5cdDEwMCUgeyBvcGFjaXR5OiAwLjU1OyB9XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRwYWRkaW5nOiAxNHB4IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogMTBweDtcblx0bWluLWhlaWdodDogMTUwcHg7XG5gO1xyXG5jb25zdCBFZGl0b3JTa2VsZXRvbkxpbmUgPSBzdHlsZWQuZGl2IGBcblx0aGVpZ2h0OiAxNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdHdpZHRoOiAkeyhwcm9wcykgPT4gcHJvcHMud2lkdGh9O1xuXHRiYWNrZ3JvdW5kOiAjZWNlY2VmO1xuXHRhbmltYXRpb246ICR7c2tlbGV0b25QdWxzZX0gMS4xcyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25TZXNzaW9uQ29udGFpbmVyID0gc3R5bGVkLmRpdiBgXG5cdHBhZGRpbmc6IDEycHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHRtYXgtaGVpZ2h0OiAyNjBweDtcblx0b3ZlcmZsb3cteTogc2Nyb2xsO1xuXHRzY3JvbGxiYXItd2lkdGg6IHRoaW47XG5cdHNjcm9sbGJhci1jb2xvcjogI2M4YzhjZiB0cmFuc3BhcmVudDtcblx0Ojotd2Via2l0LXNjcm9sbGJhciB7XG5cdFx0d2lkdGg6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcblx0XHRiYWNrZ3JvdW5kOiAjYzhjOGNmO1xuXHRcdGJvcmRlci1yYWRpdXM6IDhweDtcblx0fVxuXHQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHtcblx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0fVxuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCA9IHN0eWxlZC5kaXYgYFxuXHR0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcblx0Y29sb3I6ICR7Q09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5fTtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25DYW5kaWRhdGVUZXh0ID0gc3R5bGVkLmRpdiBgXG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkNhbmRpZGF0ZVNrZWxldG9uID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdGdhcDogOHB4O1xuXHR3aWR0aDogMTAwJTtcblx0bWluLWhlaWdodDogNDBweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db250cm9sc1JvdyA9IHN0eWxlZC5kaXYgYFxuXHRkaXNwbGF5OiBmbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRnYXA6IDZweDtcbmA7XHJcbmNvbnN0IFN1Z2dlc3Rpb25Db3VudGVyID0gc3R5bGVkLnNwYW4gYFxuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0Zm9udC1zaXplOiAxNHB4O1xuYDtcclxuY29uc3QgU3VnZ2VzdGlvbkljb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uIGBcblx0Ym9yZGVyOiAwO1xuXHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0cGFkZGluZzogNnB4O1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblx0Y3Vyc29yOiBwb2ludGVyO1xuXHRjb2xvcjogJHtDT0xPUlMuY29udGVudC5wcmltYXJ5fTtcblx0dHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjEycyBlYXNlO1xuXHQ6bm90KDpkaXNhYmxlZCk6aG92ZXIge1xuXHRcdGJhY2tncm91bmQtY29sb3I6ICR7Q09MT1JTLnN1cmZhY2UuaG92ZXJlZH07XG5cdH1cblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAwLjM1O1xuXHRcdGN1cnNvcjogbm90LWFsbG93ZWQ7XG5cdH1cbmA7XHJcbi8qKiBSZWdlbmVyYXRlIHN0YXlzIGZ1bGwgb3BhY2l0eSB3aGlsZSBkaXNhYmxlZCBzbyB0aGUgbG9hZGluZyBzaGltbWVyIHN0YXlzIHZpc2libGUgKHNhbWUgcHVsc2UgYXMgZWRpdG9yIHNrZWxldG9uKS4gKi9cclxuY29uc3QgU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24gPSBzdHlsZWQoU3VnZ2VzdGlvbkljb25CdXR0b24pIGBcblx0OmRpc2FibGVkIHtcblx0XHRvcGFjaXR5OiAxO1xuXHRcdGN1cnNvcjogd2FpdDtcblx0fVxuYDtcclxuY29uc3QgUmVnZW5lcmF0ZUljb25TaGltbWVyID0gc3R5bGVkLmRpdiBgXG5cdHdpZHRoOiAxNHB4O1xuXHRoZWlnaHQ6IDE0cHg7XG5cdGJvcmRlci1yYWRpdXM6IDRweDtcblx0YmFja2dyb3VuZDogI2VjZWNlZjtcblx0ZmxleC1zaHJpbms6IDA7XG5cdGFuaW1hdGlvbjogJHtza2VsZXRvblB1bHNlfSAxLjFzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuYDtcclxuLyoqIFNhbWUgYm90dG9tIHRvb2xiYXIgc2xvdCBhcyBgV2hhdHNBcHBUZXh0RWRpdG9ySGVhZGVyYCDigJQgcmVwbGFjZXMgdGhlIGZ1bGwgaWNvbi9BSSBwYW5lbCB3aGlsZSBvcGVuLiAqL1xyXG5jb25zdCBJbnN0cnVjdGlvbkNvbnRhaW5lciA9IHN0eWxlZC5kaXYgYFxuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0ZGlzcGxheTogZmxleDtcblx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0cGFkZGluZzogOHB4IDEycHg7XG5cdGdhcDogMTBweDtcblx0Ym9yZGVyLXJhZGl1czogMCAwIDRweCA0cHg7XG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uSW5wdXRSb3cgPSBzdHlsZWQuZGl2IGBcblx0Ym9yZGVyOiAxcHggc29saWQgI2Y1YTRjMDtcblx0Ym9yZGVyLXJhZGl1czogMTBweDtcblx0cGFkZGluZzogOHB4IDEwcHg7XG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcblx0YmFja2dyb3VuZDogJHtDT0xPUlMuc3VyZmFjZS5zdGFuZGFyZH07XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvbklucHV0ID0gc3R5bGVkLmlucHV0IGBcblx0ZmxleDogMTtcblx0bWluLXdpZHRoOiAwO1xuXHRib3JkZXI6IDA7XG5cdG91dGxpbmU6IG5vbmU7XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnByaW1hcnl9O1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25BY3Rpb25zID0gc3R5bGVkLmRpdiBgXG5cdGRpc3BsYXk6IGZsZXg7XG5cdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdGdhcDogMTBweDtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uQ2FuY2VsID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMDtcblx0YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cdGNvbG9yOiAke0NPTE9SUy5jb250ZW50LnNlY29uZGFyeX07XG5cdGZvbnQtc2l6ZTogMTRweDtcblx0Zm9udC13ZWlnaHQ6IDUwMDtcblx0cGFkZGluZzogMDtcblx0Y3Vyc29yOiBwb2ludGVyO1xuYDtcclxuY29uc3QgSW5zdHJ1Y3Rpb25JbXByb3ZlID0gc3R5bGVkLmJ1dHRvbiBgXG5cdGJvcmRlcjogMXB4IHNvbGlkICM1ZDNhNzI7XG5cdGNvbG9yOiAjNWQzYTcyO1xuXHRiYWNrZ3JvdW5kOiAke0NPTE9SUy5zdXJmYWNlLnN0YW5kYXJkfTtcblx0Ym9yZGVyLXJhZGl1czogOHB4O1xuXHRwYWRkaW5nOiA4cHggMTRweDtcblx0Zm9udC1zaXplOiAxNHB4O1xuXHRsaW5lLWhlaWdodDogMS4xO1xuXHRmb250LXdlaWdodDogNjAwO1xuXHRjdXJzb3I6IHBvaW50ZXI7XG5gO1xyXG5jb25zdCBJbnN0cnVjdGlvblN1Z2dlc3Rpb25MaXN0ID0gc3R5bGVkLmRpdiBgXG5cdG1hcmdpbi10b3A6IDEwcHg7XG5cdGJvcmRlci1yYWRpdXM6IDEycHg7XG5cdGJhY2tncm91bmQ6ICR7Q09MT1JTLnN1cmZhY2Uuc3RhbmRhcmR9O1xuXHRib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xKTtcblx0b3ZlcmZsb3c6IGhpZGRlbjtcbmA7XHJcbmNvbnN0IEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiA9IHN0eWxlZC5idXR0b24gYFxuXHR3aWR0aDogMTAwJTtcblx0Ym9yZGVyOiAwO1xuXHRib3JkZXItdG9wOiAxcHggc29saWQgJHtDT0xPUlMuc3Ryb2tlLnByaW1hcnl9O1xuXHRiYWNrZ3JvdW5kOiAkeyhwcm9wcykgPT4gKHByb3BzLnNlbGVjdGVkID8gJyNlNWYzZTgnIDogJ3RyYW5zcGFyZW50Jyl9O1xuXHRjb2xvcjogJHsocHJvcHMpID0+IChwcm9wcy5zZWxlY3RlZCA/ICcjMWU2YjM0JyA6IENPTE9SUy5jb250ZW50LnByaW1hcnkpfTtcblx0dGV4dC1hbGlnbjogbGVmdDtcblx0cGFkZGluZzogMTJweCAxNHB4O1xuXHRmb250LXNpemU6IDE0cHg7XG5cdGxpbmUtaGVpZ2h0OiAxLjI7XG5cdGN1cnNvcjogcG9pbnRlcjtcblx0OmZpcnN0LW9mLXR5cGUge1xuXHRcdGJvcmRlci10b3A6IDA7XG5cdH1cbmA7XHJcbmNvbnN0IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nID0gbmV3IEJhc2VXaGF0c2FwcENvbnRlbnRMYW5nSGVscGVyKCk7XHJcbmNvbnN0IFdpbGRDYXJkTWFwID0ge1xyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLkJPTERdOiAnKicsXHJcbiAgICBbRWRpdG9yQWN0aW9uVHlwZXMuSVRBTElDXTogJ18nLFxyXG4gICAgW0VkaXRvckFjdGlvblR5cGVzLlNUUklLRVRIUk9VR0hdOiAnficsXHJcbn07XHJcbmZ1bmN0aW9uIGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpIHtcclxuICAgIHJldHVybiBgd2hhdHNhcHAtZWRpdG9yLXJlcGhyYXNlLWhpZ2hsaWdodC0ke2VkaXRvckluc3RhbmNlS2V5IHx8ICdkZWZhdWx0J31gO1xyXG59XHJcbmV4cG9ydCBjb25zdCBXaGF0c0FwcFRleHRFZGl0b3IgPSBSZWFjdC5mb3J3YXJkUmVmKChfYSwgcmVmKSA9PiB7XHJcbiAgICB2YXIgeyBvbkNoYW5nZSwgb25DbGlja1ZhcmlhYmxlLCB0ZXh0OiBpbnB1dFZhbHVlLCBSaWdodENvbXBvbmVudCwgZXJyb3IsIGxpbWl0LCBvbkVycm9yLCByb3dzLCBhY3Rpb25zLCBlZGl0b3JJbnN0YW5jZUtleSwgdGVtcGxhdGVUeXBlID0gJ21hcmtldGluZycsIHRlbXBsYXRlSWQsIHJlcXVlc3RFeGVjdXRvciwgYmFzZVVybCwgZW5kcG9pbnRQYXRoLCB1c2VDYXNlLCBzdG9yZUlkLCBhcGlBZGFwdGVyLCBjb252ZXJzYXRpb25JZCA9ICd3aGF0c2FwcC10ZW1wbGF0ZS1lZGl0b3InLCBzeXN0ZW1JZCA9ICd3aGF0c2FwcC13cml0ZXInLCBpbnRlbnQgPSAnZGVmYXVsdCcsIGVuYWJsZWRBSUFjdGlvbnMgPSBbXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSxcclxuICAgICAgICBBSUVkaXRvckFjdGlvblR5cGVzLlNIT1JURU4sXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FWFBBTkQsXHJcbiAgICAgICAgQUlFZGl0b3JBY3Rpb25UeXBlcy5FTU9KSUZZLFxyXG4gICAgXSwgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMgPSBmYWxzZSwgcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCBhaUFjdGlvbk1pbkNoYXJzLCBpbnN0cnVjdGlvblN1Z2dlc3Rpb25zID0gREVGQVVMVF9JTlNUUlVDVElPTl9TVUdHRVNUSU9OUywgb25BSUV2ZW50LCBvbkFJVGFnQ29tcHV0ZWQsIHByZWZpbGxXYXNBaUdlbmVyYXRlZCA9IGZhbHNlLCBlZGl0b3JIZWFkZXIsIG9uQUlUb25lU2VsZWN0LCBvbkFJQWN0aW9uUmVxdWVzdCwgb25CdWlsZEFJUHJvbXB0IH0gPSBfYSwgdGV4dEFyZWFQcm9wcyA9IF9fcmVzdChfYSwgW1wib25DaGFuZ2VcIiwgXCJvbkNsaWNrVmFyaWFibGVcIiwgXCJ0ZXh0XCIsIFwiUmlnaHRDb21wb25lbnRcIiwgXCJlcnJvclwiLCBcImxpbWl0XCIsIFwib25FcnJvclwiLCBcInJvd3NcIiwgXCJhY3Rpb25zXCIsIFwiZWRpdG9ySW5zdGFuY2VLZXlcIiwgXCJ0ZW1wbGF0ZVR5cGVcIiwgXCJ0ZW1wbGF0ZUlkXCIsIFwicmVxdWVzdEV4ZWN1dG9yXCIsIFwiYmFzZVVybFwiLCBcImVuZHBvaW50UGF0aFwiLCBcInVzZUNhc2VcIiwgXCJzdG9yZUlkXCIsIFwiYXBpQWRhcHRlclwiLCBcImNvbnZlcnNhdGlvbklkXCIsIFwic3lzdGVtSWRcIiwgXCJpbnRlbnRcIiwgXCJlbmFibGVkQUlBY3Rpb25zXCIsIFwiZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnNcIiwgXCJwcm9tcHRPdmVycmlkZXNcIiwgXCJyZXBocmFzZVRvbmVzXCIsIFwiYWlBY3Rpb25NaW5DaGFyc1wiLCBcImluc3RydWN0aW9uU3VnZ2VzdGlvbnNcIiwgXCJvbkFJRXZlbnRcIiwgXCJvbkFJVGFnQ29tcHV0ZWRcIiwgXCJwcmVmaWxsV2FzQWlHZW5lcmF0ZWRcIiwgXCJlZGl0b3JIZWFkZXJcIiwgXCJvbkFJVG9uZVNlbGVjdFwiLCBcIm9uQUlBY3Rpb25SZXF1ZXN0XCIsIFwib25CdWlsZEFJUHJvbXB0XCJdKTtcclxuICAgIGNvbnN0IHRleHRTcGFjZVJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIGNvbnN0IFtjdXJyZW50VGV4dCwgc2V0Q3VycmVudFRleHRdID0gdXNlU3RhdGUoaW5wdXRWYWx1ZSB8fCAnJyk7XHJcbiAgICBjb25zdCBbaXNSZXBocmFzZUhpZ2hsaWdodGVkLCBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW3JlcGhyYXNlSGlnaGxpZ2h0Q291bnQsIHNldFJlcGhyYXNlSGlnaGxpZ2h0Q291bnRdID0gdXNlU3RhdGUoMCk7XHJcbiAgICBjb25zdCBbaXNHZW5lcmF0aW5nLCBzZXRJc0dlbmVyYXRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2lzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGUsIHNldElzSW5zdHJ1Y3Rpb25JbnB1dFZpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gICAgY29uc3QgW2luc3RydWN0aW9uVGV4dCwgc2V0SW5zdHJ1Y3Rpb25UZXh0XSA9IHVzZVN0YXRlKCcnKTtcclxuICAgIGNvbnN0IFt0b25lQnlBY3Rpb24sIHNldFRvbmVCeUFjdGlvbl0gPSB1c2VTdGF0ZSh7fSk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkJhc2VUZXh0LCBzZXRTdWdnZXN0aW9uQmFzZVRleHRdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBbc3VnZ2VzdGlvbkNhbmRpZGF0ZXMsIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzXSA9IHVzZVN0YXRlKFtdKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uSW5kZXgsIHNldFN1Z2dlc3Rpb25JbmRleF0gPSB1c2VTdGF0ZSgwKTtcclxuICAgIGNvbnN0IFtzdWdnZXN0aW9uQWN0aW9uVHlwZSwgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGVdID0gdXNlU3RhdGUobnVsbCk7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uU2Nyb2xsUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgcmVwaHJhc2VJZGxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgaGlnaGxpZ2h0UmVzZXRSZWYgPSB1c2VSZWYobnVsbCk7XHJcbiAgICAvKipcclxuICAgICAqIFByaW9yIGVsaWdpYmlsaXR5IGZvciByZXBocmFzZSBudWRnZSAobnVsbCA9IG5vdCBpbml0aWFsaXplZCkuXHJcbiAgICAgKiBNYXRjaGVzIHRoZSBjaGlwOiBub24tZW1wdHkgdHJpbSBhbmQgbGVuZ3RoIOKJpSBtaW4g4oCUIHNhbWUgYXMgYGFpSGVhZGVyQWN0aW9uc2AgZGlzYWJsZWQgcnVsZXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHByZXZSZXBocmFzZUVsaWdpYmxlUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgZGVmZXJyZWRIdG1sUmVmID0gdXNlUmVmKG51bGwpO1xyXG4gICAgY29uc3QgbGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZiA9IHVzZVJlZihudWxsKTtcclxuICAgIC8qKiBGaXJzdCBhY2NlcHQgYWZ0ZXIgZnVsbC1BSSBwcmVmaWxsIChgcHJlZmlsbFdhc0FpR2VuZXJhdGVkYCk7IGNsZWFyZWQgYWZ0ZXIgb25lIGFjY2VwdC4gKi9cclxuICAgIGNvbnN0IGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZiA9IHVzZVJlZighIXByZWZpbGxXYXNBaUdlbmVyYXRlZCk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZVJlZi5jdXJyZW50ID0gISFwcmVmaWxsV2FzQWlHZW5lcmF0ZWQ7XHJcbiAgICB9LCBbcHJlZmlsbFdhc0FpR2VuZXJhdGVkLCBlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgY29uc3QgYWN0aXZlQWN0aW9uUHJvbXB0cyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlQWN0aW9uUHJvbXB0cyh0ZW1wbGF0ZVR5cGUsIHByb21wdE92ZXJyaWRlcywgcmVwaHJhc2VUb25lcyk7XHJcbiAgICB9LCBbcHJvbXB0T3ZlcnJpZGVzLCByZXBocmFzZVRvbmVzLCB0ZW1wbGF0ZVR5cGVdKTtcclxuICAgIGNvbnN0IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gaW5zdHJ1Y3Rpb25UZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmICghcXVlcnkpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5maWx0ZXIoKHN1Z2dlc3Rpb24pID0+IHN1Z2dlc3Rpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkpO1xyXG4gICAgfSwgW2luc3RydWN0aW9uU3VnZ2VzdGlvbnMsIGluc3RydWN0aW9uVGV4dF0pO1xyXG4gICAgY29uc3QgbWluQ2hhcnNCeUFjdGlvbiA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSUyksIChhaUFjdGlvbk1pbkNoYXJzIHx8IHt9KSk7XHJcbiAgICB9LCBbYWlBY3Rpb25NaW5DaGFyc10pO1xyXG4gICAgY29uc3QgcmVwaHJhc2VNaW5DaGFycyA9IG1pbkNoYXJzQnlBY3Rpb25bQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV0gfHxcclxuICAgICAgICBERUZBVUxUX0FJX0FDVElPTl9NSU5fQ0hBUlNbQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRV07XHJcbiAgICBjb25zdCBlbWl0QUlFdmVudCA9IHVzZUNhbGxiYWNrKChuYW1lLCBwYXlsb2FkKSA9PiB7XHJcbiAgICAgICAgb25BSUV2ZW50ID09PSBudWxsIHx8IG9uQUlFdmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25BSUV2ZW50KG5hbWUsIHBheWxvYWQpO1xyXG4gICAgfSwgW29uQUlFdmVudF0pO1xyXG4gICAgY29uc3Qgc2V0RWRpdG9yVGV4dCA9IHVzZUNhbGxiYWNrKChuZXh0VGV4dCkgPT4ge1xyXG4gICAgICAgIHNldEN1cnJlbnRUZXh0KChwcmV2KSA9PiAocHJldiA9PT0gbmV4dFRleHQgPyBwcmV2IDogbmV4dFRleHQpKTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGVtaXRDaGFuZ2VXaXRoR3VhcmQgPSB1c2VDYWxsYmFjaygobmV4dFRleHQpID0+IHtcclxuICAgICAgICBpZiAoZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlZmVycmVkSHRtbFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5leHRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICBvbkNoYW5nZSA9PT0gbnVsbCB8fCBvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25DaGFuZ2UobmV4dFRleHQsIG5leHRUZXh0KTtcclxuICAgICAgICAgICAgZGVmZXJyZWRIdG1sUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlID09PSBudWxsIHx8IG9uQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkNoYW5nZShuZXh0VGV4dCwgYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChuZXh0VGV4dCkpO1xyXG4gICAgICAgICAgICB9LCAxNik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKG5leHRUZXh0LCBiYXNlV2hhdHNhcHBDb250ZW50TGFuZy5nZXRIVE1MKG5leHRUZXh0KSk7XHJcbiAgICB9LCBbb25DaGFuZ2VdKTtcclxuICAgIGNvbnN0IGNsZWFyU3VnZ2VzdGlvblNlc3Npb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkJhc2VUZXh0KG51bGwpO1xyXG4gICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtdKTtcclxuICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgoMCk7XHJcbiAgICAgICAgc2V0U3VnZ2VzdGlvbkFjdGlvblR5cGUobnVsbCk7XHJcbiAgICB9LCBbXSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSGlnaGxpZ2h0Q291bnQgPj0gTUFYX1JFUEhSQVNFX0hJR0hMSUdIVFMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBuZXh0Q291bnQgPSByZXBocmFzZUhpZ2hsaWdodENvdW50ICsgMTtcclxuICAgICAgICBzZXRSZXBocmFzZUhpZ2hsaWdodENvdW50KG5leHRDb3VudCk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIGVkaXRvckluc3RhbmNlS2V5KSB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oZ2V0SGlnaGxpZ2h0U3RvcmFnZUtleShlZGl0b3JJbnN0YW5jZUtleSksIFN0cmluZyhuZXh0Q291bnQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0SXNSZXBocmFzZUhpZ2hsaWdodGVkKHRydWUpO1xyXG4gICAgICAgIGlmIChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChoaWdobGlnaHRSZXNldFJlZi5jdXJyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgIH0sIDEyMDApO1xyXG4gICAgfSwgW2VkaXRvckluc3RhbmNlS2V5LCByZXBocmFzZUhpZ2hsaWdodENvdW50XSk7XHJcbiAgICBjb25zdCB0cmlnZ2VyUmVwaHJhc2VIaWdobGlnaHRSZWYgPSB1c2VSZWYodHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0KTtcclxuICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50ID0gdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0O1xyXG4gICAgZnVuY3Rpb24gaGFuZGxlT25DaGFuZ2UoZSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBzZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbSA9IHRleHRTcGFjZVJlZiA9PT0gbnVsbCB8fCB0ZXh0U3BhY2VSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmIChlbGVtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0uc2VsZWN0aW9uU3RhcnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVsZW0uc2VsZWN0aW9uRW5kID0gY2FyZXRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIG9uQWN0aW9uU2VsZWN0KGFjdGlvblR5cGUpIHtcclxuICAgICAgICBjb25zdCB3aWxkQ2FyZCA9IFdpbGRDYXJkTWFwW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGlmICh3aWxkQ2FyZCAmJiB0ZXh0U3BhY2VSZWYuY3VycmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IGluc2VydFRleHRBdEluZGV4KHdpbGRDYXJkLCBzdGFydCk7XHJcbiAgICAgICAgICAgICAgICBzZXRDYXJldFBvc2l0aW9uKHN0YXJ0ICsgMSk7XHJcbiAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKHRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhZGRUZXh0T3JXcmFwKHdpbGRDYXJkKTtcclxuICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBvbkVtb2ppQWRkaXRpb24oZW1vamkpIHtcclxuICAgICAgICBjb25zdCB7IHRleHQgfSA9IGFkZFRleHQoZW1vamkpO1xyXG4gICAgICAgIGVtaXRDaGFuZ2VXaXRoR3VhcmQodGV4dCk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBhZGRUZXh0T3JXcmFwKHRleHRUb0FkZCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICBpZiAodGV4dFNwYWNlUmVmLmN1cnJlbnQgJiYgdGV4dFRvQWRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQuc2VsZWN0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvbkVuZDtcclxuICAgICAgICAgICAgY29uc3Qgd2lsZENhcmQgPSB0ZXh0VG9BZGQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICAvKiogbm90aGluZyBpcyBzZWxlY3RlZCAqL1xyXG4gICAgICAgICAgICAgICAgLyoqIHNvIGFwcGVuZCB0aGUgd2lsZGNhcmQgYXQgdGhlIGVuZCAqL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZFRleHQod2lsZENhcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLndyYXBwV2lsZGNhcmQoc3RhcnQsIGVuZCwgd2lsZENhcmQsIHRleHQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGV4dCwgaHRtbCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHRleHQ6IHRleHQsIGh0bWw6IHRleHQgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGFkZFRleHQodGV4dFRvQWRkKSB7XHJcbiAgICAgICAgdmFyIF9hLCBfYjtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKF9iID0gKF9hID0gdGV4dFNwYWNlUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyc7XHJcbiAgICAgICAgaWYgKHRleHRTcGFjZVJlZi5jdXJyZW50ICYmIHRleHRUb0FkZCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRleHRTcGFjZVJlZi5jdXJyZW50LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0ZXh0U3BhY2VSZWYuY3VycmVudC5zZWxlY3Rpb25FbmQ7XHJcbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBzdGFydCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogdGV4dCwgaHRtbDogdGV4dCB9O1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaW5zZXJ0VGV4dEF0SW5kZXgodGV4dFRvQWRkLCBpbmRleCkge1xyXG4gICAgICAgIHZhciBfYSwgX2I7XHJcbiAgICAgICAgbGV0IHRleHQgPSAoX2IgPSAoX2EgPSB0ZXh0U3BhY2VSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcclxuICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCkgKyB0ZXh0VG9BZGQgKyB0ZXh0LnNsaWNlKGluZGV4KTtcclxuICAgICAgICBjb25zdCBodG1sID0gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTCh0ZXh0KTtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KHRleHQpO1xyXG4gICAgICAgIHJldHVybiB7IHRleHQsIGh0bWwgfTtcclxuICAgIH1cclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFlZGl0b3JJbnN0YW5jZUtleSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGdldEhpZ2hsaWdodFN0b3JhZ2VLZXkoZWRpdG9ySW5zdGFuY2VLZXkpKSB8fFxyXG4gICAgICAgICAgICAnMCcpO1xyXG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGNhY2hlZCkpIHtcclxuICAgICAgICAgICAgc2V0UmVwaHJhc2VIaWdobGlnaHRDb3VudChjYWNoZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH0sIFtlZGl0b3JJbnN0YW5jZUtleV0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBlbGlnaWJsZSA9ICEhY3VycmVudFRleHQudHJpbSgpICYmIGN1cnJlbnRUZXh0Lmxlbmd0aCA+PSByZXBocmFzZU1pbkNoYXJzO1xyXG4gICAgICAgIGlmIChwcmV2UmVwaHJhc2VFbGlnaWJsZVJlZi5jdXJyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgPSBlbGlnaWJsZTtcclxuICAgICAgICAgICAgaWYgKGVsaWdpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgICAgICAgICB9LCBSRVBIUkFTRV9JRExFX01TKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZWxpZ2libGUpIHtcclxuICAgICAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZXRJc1JlcGhyYXNlSGlnaGxpZ2h0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAocmVwaHJhc2VJZGxlUmVmLmN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICByZXBocmFzZUlkbGVSZWYuY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjcm9zc2VkVGhyZXNob2xkID0gIXByZXZSZXBocmFzZUVsaWdpYmxlUmVmLmN1cnJlbnQgJiYgZWxpZ2libGU7XHJcbiAgICAgICAgcHJldlJlcGhyYXNlRWxpZ2libGVSZWYuY3VycmVudCA9IHRydWU7XHJcbiAgICAgICAgaWYgKGNyb3NzZWRUaHJlc2hvbGQpIHtcclxuICAgICAgICAgICAgdHJpZ2dlclJlcGhyYXNlSGlnaGxpZ2h0UmVmLmN1cnJlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXBocmFzZUlkbGVSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRyaWdnZXJSZXBocmFzZUhpZ2hsaWdodFJlZi5jdXJyZW50KCk7XHJcbiAgICAgICAgfSwgUkVQSFJBU0VfSURMRV9NUyk7XHJcbiAgICB9LCBbY3VycmVudFRleHQsIHJlcGhyYXNlTWluQ2hhcnNdKTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHJlcGhyYXNlSWRsZVJlZi5jdXJyZW50KTtcclxuICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlc2V0UmVmLmN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaGlnaGxpZ2h0UmVzZXRSZWYuY3VycmVudCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZEh0bWxSZWYuY3VycmVudClcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWZlcnJlZEh0bWxSZWYuY3VycmVudCk7XHJcbiAgICAgICAgfTtcclxuICAgIH0sIFtdKTtcclxuICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZSA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzW3N1Z2dlc3Rpb25JbmRleF0gfHwgJyc7XHJcbiAgICBjb25zdCBzdWdnZXN0aW9uQmFzZUh0bWwgPSB1c2VNZW1vKCgpID0+IGJhc2VXaGF0c2FwcENvbnRlbnRMYW5nLmdldEhUTUwoc3VnZ2VzdGlvbkJhc2VUZXh0IHx8ICcnKSwgW3N1Z2dlc3Rpb25CYXNlVGV4dF0pO1xyXG4gICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlSHRtbCA9IHVzZU1lbW8oKCkgPT4gYmFzZVdoYXRzYXBwQ29udGVudExhbmcuZ2V0SFRNTChhY3RpdmVDYW5kaWRhdGUpLCBbYWN0aXZlQ2FuZGlkYXRlXSk7XHJcbiAgICBjb25zdCBjYW5SZWdlbmVyYXRlID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDwgTUFYX1NVR0dFU1RJT05TO1xyXG4gICAgY29uc3Qgc2hvdWxkU2hvd1N1Z2dlc3Rpb25TZXNzaW9uID0gISFzdWdnZXN0aW9uQmFzZVRleHQgJiYgc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoID4gMDtcclxuICAgIGNvbnN0IGlzUHJldlN1Z2dlc3Rpb25EaXNhYmxlZCA9IHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aCA8PSAxIHx8IHN1Z2dlc3Rpb25JbmRleCA8PSAwO1xyXG4gICAgY29uc3QgaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkID0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIDw9IDEgfHxcclxuICAgICAgICBzdWdnZXN0aW9uSW5kZXggPj0gc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMTtcclxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBub2RlID0gc3VnZ2VzdGlvblNjcm9sbFJlZi5jdXJyZW50O1xyXG4gICAgICAgIGlmICghbm9kZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIG5vZGUuc2Nyb2xsVG9wID0gbm9kZS5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9LCBbYWN0aXZlQ2FuZGlkYXRlLCBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24sIGlzR2VuZXJhdGluZ10pO1xyXG4gICAgY29uc3QgZXhlY3V0ZUFJQWN0aW9uID0gdXNlQ2FsbGJhY2soKGFjdGlvblR5cGUsIHJlZ2VuZXJhdGVFeGlzdGluZyA9IGZhbHNlLCBpbnN0cnVjdGlvbk92ZXJyaWRlLCB0b25lT3ZlcnJpZGVJZCwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICB2YXIgX2IsIF9jLCBfZDtcclxuICAgICAgICBpZiAoIW9uQUlBY3Rpb25SZXF1ZXN0ICYmXHJcbiAgICAgICAgICAgICFhcGlBZGFwdGVyICYmXHJcbiAgICAgICAgICAgICghcmVxdWVzdEV4ZWN1dG9yIHx8ICFiYXNlVXJsKSkge1xyXG4gICAgICAgICAgICBvbkVycm9yID09PSBudWxsIHx8IG9uRXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRXJyb3IoJ0FJIGNvbmZpZ3VyYXRpb24gbWlzc2luZycpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY3VycmVudFRleHQudHJpbSgpKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgY29uc3QgbWluQ2hhcnNGb3JBY3Rpb24gPSBtaW5DaGFyc0J5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICA1MDtcclxuICAgICAgICBpZiAoY3VycmVudFRleHQubGVuZ3RoIDwgbWluQ2hhcnNGb3JBY3Rpb24pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgaWYgKHJlZ2VuZXJhdGVFeGlzdGluZyAmJiAhY2FuUmVnZW5lcmF0ZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGJhc2VDb25maWcgPSBhY3RpdmVBY3Rpb25Qcm9tcHRzW2FjdGlvblR5cGVdO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UgJiZcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlID09PSAndXRpbGl0eScgJiZcclxuICAgICAgICAgICAgYWN0aW9uVmFyaWFudCA9PT0gQUlBY3Rpb25WYXJpYW50LlJFUEhSQVNFXHJcbiAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiYXNlQ29uZmlnKSwgeyBsYWJlbDogJ1JlcGhyYXNlJywgYmFzZVByb21wdDogVVRJTElUWV9SRVBIUkFTRV9QUk9NUFQgfSkgOiBiYXNlQ29uZmlnO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVG9uZUlkID0gdG9uZU92ZXJyaWRlSWQgfHxcclxuICAgICAgICAgICAgdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgIGNvbmZpZy5kZWZhdWx0VG9uZUlkIHx8XHJcbiAgICAgICAgICAgICgoX2MgPSAoX2IgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYlswXSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmlkKTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZFRvbmUgPSAoX2QgPSBjb25maWcudG9uZXMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5maW5kKCh0b25lKSA9PiB0b25lLmlkID09PSBzZWxlY3RlZFRvbmVJZCk7XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQgPSBpbnN0cnVjdGlvbk92ZXJyaWRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBpbnN0cnVjdGlvbk92ZXJyaWRlXHJcbiAgICAgICAgICAgIDogaW5zdHJ1Y3Rpb25UZXh0O1xyXG4gICAgICAgIGNvbnN0IHByb21wdCA9IChvbkJ1aWxkQUlQcm9tcHQgPT09IG51bGwgfHwgb25CdWlsZEFJUHJvbXB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkJ1aWxkQUlQcm9tcHQoe1xyXG4gICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICBhY3Rpb25WYXJpYW50LFxyXG4gICAgICAgICAgICBjdXJyZW50VGV4dCxcclxuICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICBjb25maWcsXHJcbiAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgIHRvbmVMYWJlbDogc2VsZWN0ZWRUb25lID09PSBudWxsIHx8IHNlbGVjdGVkVG9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VsZWN0ZWRUb25lLmxhYmVsLFxyXG4gICAgICAgICAgICBpbnN0cnVjdGlvblRleHQ6IGluc3RydWN0aW9uRm9yUHJvbXB0IHx8IHVuZGVmaW5lZCxcclxuICAgICAgICB9KSkgfHxcclxuICAgICAgICAgICAgYnVpbGRBY3Rpb25Qcm9tcHQoe1xyXG4gICAgICAgICAgICAgICAgY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZCxcclxuICAgICAgICAgICAgICAgIGluc3RydWN0aW9uVGV4dDogaW5zdHJ1Y3Rpb25Gb3JQcm9tcHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHNldElzR2VuZXJhdGluZyh0cnVlKTtcclxuICAgICAgICBlbWl0QUlFdmVudCgnYWlfYWN0aW9uX3RyaWdnZXJlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9uQUlBY3Rpb25SZXF1ZXN0XHJcbiAgICAgICAgICAgICAgICA/IHlpZWxkIG9uQUlBY3Rpb25SZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvblZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvbmVJZDogc2VsZWN0ZWRUb25lSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9uZUxhYmVsOiBzZWxlY3RlZFRvbmUgPT09IG51bGwgfHwgc2VsZWN0ZWRUb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxlY3RlZFRvbmUubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0OiBpbnN0cnVjdGlvbkZvclByb21wdCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIDogeWllbGQgcmVxdWVzdEFJU3VnZ2VzdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBpQWRhcHRlcixcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RXhlY3V0b3IsXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0LFxyXG4gICAgICAgICAgICAgICAgICAgIGludGVudCxcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICAgICAgICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZydcclxuICAgICAgICAgICAgICAgID8gcmVzdWx0LnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgOiAoKHJlc3VsdCA9PT0gbnVsbCB8fCByZXN1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlc3VsdC5ib2R5KSB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSlcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKCFyZWdlbmVyYXRlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25CYXNlVGV4dChjdXJyZW50VGV4dCk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uQWN0aW9uVHlwZShhY3Rpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25DYW5kaWRhdGVzKFtjYW5kaWRhdGVdKTtcclxuICAgICAgICAgICAgICAgIHNldFN1Z2dlc3Rpb25JbmRleCgwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRTdWdnZXN0aW9uQ2FuZGlkYXRlcygocHJldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IFsuLi5wcmV2LCBjYW5kaWRhdGVdLnNsaWNlKDAsIE1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgICAgICAgICAgICAgICBzZXRTdWdnZXN0aW9uSW5kZXgobmV4dC5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQUkgc3VnZ2VzdGlvbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgc2V0SXNHZW5lcmF0aW5nKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KSwgW1xyXG4gICAgICAgIHJlcXVlc3RFeGVjdXRvcixcclxuICAgICAgICBiYXNlVXJsLFxyXG4gICAgICAgIGN1cnJlbnRUZXh0LFxyXG4gICAgICAgIGlzR2VuZXJhdGluZyxcclxuICAgICAgICBjYW5SZWdlbmVyYXRlLFxyXG4gICAgICAgIGFjdGl2ZUFjdGlvblByb21wdHMsXHJcbiAgICAgICAgdG9uZUJ5QWN0aW9uLFxyXG4gICAgICAgIGluc3RydWN0aW9uVGV4dCxcclxuICAgICAgICBlbWl0QUlFdmVudCxcclxuICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIGVuZHBvaW50UGF0aCxcclxuICAgICAgICBhcGlBZGFwdGVyLFxyXG4gICAgICAgIGludGVudCxcclxuICAgICAgICBjb252ZXJzYXRpb25JZCxcclxuICAgICAgICBzeXN0ZW1JZCxcclxuICAgICAgICB1c2VDYXNlLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgdGVtcGxhdGVUeXBlLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgICAgICBvbkFJQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICBvbkJ1aWxkQUlQcm9tcHQsXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZUFjY2VwdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFhY3RpdmVDYW5kaWRhdGUgfHwgIXN1Z2dlc3Rpb25CYXNlVGV4dCB8fCAhc3VnZ2VzdGlvbkFjdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBzZXRFZGl0b3JUZXh0KGFjdGl2ZUNhbmRpZGF0ZSk7XHJcbiAgICAgICAgZW1pdENoYW5nZVdpdGhHdWFyZChhY3RpdmVDYW5kaWRhdGUpO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2FjY2VwdGVkJywge1xyXG4gICAgICAgICAgICBhY3Rpb25fdHlwZTogc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgIHRlbXBsYXRlX2lkOiB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGluSW5pdGlhbEFpUGhhc2UgPSBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudDtcclxuICAgICAgICBjb25zdCB0YWdQYXlsb2FkID0gY29tcHV0ZUFpVGFnT25BY2NlcHQoe1xyXG4gICAgICAgICAgICBiYXNlbGluZVRleHQ6IHN1Z2dlc3Rpb25CYXNlVGV4dCxcclxuICAgICAgICAgICAgYWNjZXB0ZWRUZXh0OiBhY3RpdmVDYW5kaWRhdGUsXHJcbiAgICAgICAgICAgIGluaXRpYWxBaVByZWZpbGxQaGFzZTogaW5Jbml0aWFsQWlQaGFzZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoaW5Jbml0aWFsQWlQaGFzZSkge1xyXG4gICAgICAgICAgICBpbml0aWFsQWlQcmVmaWxsUGhhc2VSZWYuY3VycmVudCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvbkFJVGFnQ29tcHV0ZWQgPT09IG51bGwgfHwgb25BSVRhZ0NvbXB1dGVkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkFJVGFnQ29tcHV0ZWQodGFnUGF5bG9hZCk7XHJcbiAgICAgICAgY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbigpO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGFjdGl2ZUNhbmRpZGF0ZSxcclxuICAgICAgICBzdWdnZXN0aW9uQmFzZVRleHQsXHJcbiAgICAgICAgc3VnZ2VzdGlvbkFjdGlvblR5cGUsXHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dCxcclxuICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkLFxyXG4gICAgICAgIGVtaXRBSUV2ZW50LFxyXG4gICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgb25BSVRhZ0NvbXB1dGVkLFxyXG4gICAgICAgIGNsZWFyU3VnZ2VzdGlvblNlc3Npb24sXHJcbiAgICBdKTtcclxuICAgIGNvbnN0IGhhbmRsZVJlamVjdFN1Z2dlc3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzdWdnZXN0aW9uQWN0aW9uVHlwZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVtaXRBSUV2ZW50KCdhaV9zdWdnZXN0aW9uX2Rpc2NhcmRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICB9LCBbY2xlYXJTdWdnZXN0aW9uU2Vzc2lvbiwgZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0ZW1wbGF0ZUlkXSk7XHJcbiAgICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKChyYXRpbmcpID0+IHtcclxuICAgICAgICBpZiAoIXN1Z2dlc3Rpb25BY3Rpb25UeXBlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgZW1pdEFJRXZlbnQoJ2FpX2ZlZWRiYWNrX3N1Ym1pdHRlZCcsIHtcclxuICAgICAgICAgICAgYWN0aW9uX3R5cGU6IHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZV9pZDogdGVtcGxhdGVJZCxcclxuICAgICAgICAgICAgcmF0aW5nLFxyXG4gICAgICAgICAgICBjYW5kaWRhdGVfaW5kZXg6IHN1Z2dlc3Rpb25JbmRleCArIDEsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9LCBbZW1pdEFJRXZlbnQsIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCBzdWdnZXN0aW9uSW5kZXgsIHRlbXBsYXRlSWRdKTtcclxuICAgIGNvbnN0IGFpSGVhZGVyQWN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xyXG4gICAgICAgIGlmIChkaXNhYmxlQnVpbHRJbkFJQWN0aW9ucylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiBlbmFibGVkQUlBY3Rpb25zLm1hcCgoYWN0aW9uVHlwZSkgPT4ge1xyXG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcclxuICAgICAgICAgICAgY29uc3QgYWN0aW9uQ29uZmlnID0gYWN0aXZlQWN0aW9uUHJvbXB0c1thY3Rpb25UeXBlXTtcclxuICAgICAgICAgICAgY29uc3QgdG9uZUlkID0gdG9uZUJ5QWN0aW9uW2FjdGlvblR5cGVdIHx8XHJcbiAgICAgICAgICAgICAgICBhY3Rpb25Db25maWcuZGVmYXVsdFRvbmVJZCB8fFxyXG4gICAgICAgICAgICAgICAgKChfYiA9IChfYSA9IGFjdGlvbkNvbmZpZy50b25lcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWzBdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWQpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogYWN0aW9uVHlwZSxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBhY3Rpb25Db25maWcubGFiZWwsXHJcbiAgICAgICAgICAgICAgICBpc1ByaW1hcnk6IGFjdGlvblR5cGUgPT09IEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsXHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBpc0dlbmVyYXRpbmcgJiYgc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUsXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRlZDogYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGlzUmVwaHJhc2VIaWdobGlnaHRlZCxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhY3VycmVudFRleHQudHJpbSgpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRleHQubGVuZ3RoIDxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1pbkNoYXJzQnlBY3Rpb25bYWN0aW9uVHlwZV0gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQUlfQUNUSU9OX01JTl9DSEFSU1thY3Rpb25UeXBlXSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgNTApIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmF0aW5nIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uQWN0aW9uVHlwZSA9PT0gYWN0aW9uVHlwZSksXHJcbiAgICAgICAgICAgICAgICBzaG93VG9uZURyb3Bkb3duOiBhY3Rpb25UeXBlID09PSBBSUVkaXRvckFjdGlvblR5cGVzLlJFUEhSQVNFICYmXHJcbiAgICAgICAgICAgICAgICAgICAgISEoKF9jID0gYWN0aW9uQ29uZmlnLnRvbmVzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubGVuZ3RoKSxcclxuICAgICAgICAgICAgICAgIHRvbmVzOiBhY3Rpb25Db25maWcudG9uZXMsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRvbmVJZDogdG9uZUlkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSwgW1xyXG4gICAgICAgIGVuYWJsZWRBSUFjdGlvbnMsXHJcbiAgICAgICAgZGlzYWJsZUJ1aWx0SW5BSUFjdGlvbnMsXHJcbiAgICAgICAgYWN0aXZlQWN0aW9uUHJvbXB0cyxcclxuICAgICAgICB0b25lQnlBY3Rpb24sXHJcbiAgICAgICAgaXNHZW5lcmF0aW5nLFxyXG4gICAgICAgIHN1Z2dlc3Rpb25BY3Rpb25UeXBlLFxyXG4gICAgICAgIHNob3VsZFNob3dTdWdnZXN0aW9uU2Vzc2lvbixcclxuICAgICAgICBpc1JlcGhyYXNlSGlnaGxpZ2h0ZWQsXHJcbiAgICAgICAgY3VycmVudFRleHQsXHJcbiAgICAgICAgbWluQ2hhcnNCeUFjdGlvbixcclxuICAgIF0pO1xyXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBhZGRUZXh0T3JXcmFwLFxyXG4gICAgICAgICAgICBhZGRUZXh0LFxyXG4gICAgICAgICAgICBnZXQoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFRleHQ7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNldENhcmV0UG9zaXRpb24sXHJcbiAgICAgICAgfTtcclxuICAgIH0sIFthZGRUZXh0T3JXcmFwLCBhZGRUZXh0LCBjdXJyZW50VGV4dF0pO1xyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgc2V0RWRpdG9yVGV4dChpbnB1dFZhbHVlIHx8ICcnKTtcclxuICAgIH0sIFtpbnB1dFZhbHVlLCBzZXRFZGl0b3JUZXh0XSk7XHJcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgICAgIGlmICghbGltaXQgfHwgIW9uRXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBuZXh0RXJyb3IgPSBjdXJyZW50VGV4dC5sZW5ndGggPiBsaW1pdCA/IExJTUlUX1JFQUNIRUQgOiBlcnJvciAhPT0gbnVsbCAmJiBlcnJvciAhPT0gdm9pZCAwID8gZXJyb3IgOiAnJztcclxuICAgICAgICBpZiAobGFzdEVtaXR0ZWRFZGl0b3JFcnJvclJlZi5jdXJyZW50ID09PSBuZXh0RXJyb3IpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBsYXN0RW1pdHRlZEVkaXRvckVycm9yUmVmLmN1cnJlbnQgPSBuZXh0RXJyb3I7XHJcbiAgICAgICAgb25FcnJvcihuZXh0RXJyb3IpO1xyXG4gICAgfSwgW2N1cnJlbnRUZXh0LCBlcnJvciwgbGltaXQsIG9uRXJyb3JdKTtcclxuICAgIHJldHVybiAoX2pzeHMoT3V0ZXJDb250YWluZXIsIHsgY2hpbGRyZW46IFtfanN4cyhDb250YWluZXIsIE9iamVjdC5hc3NpZ24oeyBpc0Vycm9yOiAhIWVycm9yIH0sIHsgY2hpbGRyZW46IFtzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gPyAoX2pzeHMoU3VnZ2VzdGlvblNlc3Npb25Db250YWluZXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHN1Z2dlc3Rpb25TY3JvbGxSZWYgfSwgeyBjaGlsZHJlbjogW19qc3goU3VnZ2VzdGlvbkJhc2VsaW5lVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IHN1Z2dlc3Rpb25CYXNlSHRtbCB9IH0pLCBpc0dlbmVyYXRpbmcgPyAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1idXN5XCI6IFwidHJ1ZVwiIH0sIHsgY2hpbGRyZW46IF9qc3hzKFN1Z2dlc3Rpb25DYW5kaWRhdGVTa2VsZXRvbiwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI4NCVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiNjglXCIgfSldIH0pIH0pKSkgOiAoX2pzeChTdWdnZXN0aW9uQ2FuZGlkYXRlVGV4dCwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2h0bWw6IGFjdGl2ZUNhbmRpZGF0ZUh0bWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9KSksIF9qc3hzKFN1Z2dlc3Rpb25Db250cm9sc1JvdywgeyBjaGlsZHJlbjogW19qc3hzKFN1Z2dlc3Rpb25Db3VudGVyLCB7IGNoaWxkcmVuOiBbc3VnZ2VzdGlvbkluZGV4ICsgMSwgXCIvXCIsIHN1Z2dlc3Rpb25DYW5kaWRhdGVzLmxlbmd0aF0gfSksIF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJQcmV2aW91cyBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBpc1ByZXZTdWdnZXN0aW9uRGlzYWJsZWQsIG9uQ2xpY2s6ICgpID0+IHNldFN1Z2dlc3Rpb25JbmRleCgoaWR4KSA9PiBNYXRoLm1heCgwLCBpZHggLSAxKSkgfSwgeyBjaGlsZHJlbjogX2pzeChDaGV2cm9uTGVmdEljb24sIHsgd2lkdGg6IDE0LCBoZWlnaHQ6IDE0IH0pIH0pKSwgX2pzeChTdWdnZXN0aW9uSWNvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IFwiYXJpYS1sYWJlbFwiOiBcIk5leHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNOZXh0U3VnZ2VzdGlvbkRpc2FibGVkLCBvbkNsaWNrOiAoKSA9PiBzZXRTdWdnZXN0aW9uSW5kZXgoKGlkeCkgPT4gTWF0aC5taW4oc3VnZ2VzdGlvbkNhbmRpZGF0ZXMubGVuZ3RoIC0gMSwgaWR4ICsgMSkpIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hldnJvblJpZ2h0SWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkxpa2VcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJMaWtlIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4gaGFuZGxlRmVlZGJhY2soJ2xpa2UnKSB9LCB7IGNoaWxkcmVuOiBfanN4KFRodW1ic1VwSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJEaXNsaWtlXCIsIHBsYWNlbWVudDogXCJ0b3BcIiB9LCB7IGNoaWxkcmVuOiBfanN4KFN1Z2dlc3Rpb25JY29uQnV0dG9uLCBPYmplY3QuYXNzaWduKHsgXCJhcmlhLWxhYmVsXCI6IFwiRGlzbGlrZSBzdWdnZXN0aW9uXCIsIHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IGhhbmRsZUZlZWRiYWNrKCdkaXNsaWtlJykgfSwgeyBjaGlsZHJlbjogX2pzeChUaHVtYnNEb3duSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgY2FuUmVnZW5lcmF0ZSA/IChfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBpc0dlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5n4oCmJyA6ICdSZWdlbmVyYXRlJywgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvblJlZ2VuZXJhdGVCdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJSZWdlbmVyYXRlIHN1Z2dlc3Rpb25cIiwgXCJhcmlhLWJ1c3lcIjogaXNHZW5lcmF0aW5nLCB0eXBlOiBcImJ1dHRvblwiLCBkaXNhYmxlZDogaXNHZW5lcmF0aW5nLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uQWN0aW9uVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKHN1Z2dlc3Rpb25BY3Rpb25UeXBlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogaXNHZW5lcmF0aW5nID8gKF9qc3goUmVnZW5lcmF0ZUljb25TaGltbWVyLCB7IFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSkgOiAoX2pzeChSZXdpbmRJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSkgfSkpIH0pKSkgOiBudWxsLCBfanN4KFRvb2x0aXAsIE9iamVjdC5hc3NpZ24oeyBib2R5OiBcIkRpc2NhcmRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJEaXNjYXJkIHN1Z2dlc3Rpb25cIiwgdHlwZTogXCJidXR0b25cIiwgb25DbGljazogaGFuZGxlUmVqZWN0U3VnZ2VzdGlvbiB9LCB7IGNoaWxkcmVuOiBfanN4KENyb3NzSWNvbiwgeyB3aWR0aDogMTQsIGhlaWdodDogMTQgfSkgfSkpIH0pKSwgX2pzeChUb29sdGlwLCBPYmplY3QuYXNzaWduKHsgYm9keTogXCJBY2NlcHRcIiwgcGxhY2VtZW50OiBcInRvcFwiIH0sIHsgY2hpbGRyZW46IF9qc3goU3VnZ2VzdGlvbkljb25CdXR0b24sIE9iamVjdC5hc3NpZ24oeyBcImFyaWEtbGFiZWxcIjogXCJBY2NlcHQgc3VnZ2VzdGlvblwiLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBoYW5kbGVBY2NlcHRTdWdnZXN0aW9uIH0sIHsgY2hpbGRyZW46IF9qc3goQ2hlY2tJY29uLCB7IHdpZHRoOiAxNCwgaGVpZ2h0OiAxNCB9KSB9KSkgfSkpXSB9KV0gfSkpKSA6IGlzR2VuZXJhdGluZyA/IChfanN4cyhFZGl0b3JTa2VsZXRvbkNvbnRhaW5lciwgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjk2JVwiIH0pLCBfanN4KEVkaXRvclNrZWxldG9uTGluZSwgeyB3aWR0aDogXCI5MiVcIiB9KSwgX2pzeChFZGl0b3JTa2VsZXRvbkxpbmUsIHsgd2lkdGg6IFwiODglXCIgfSksIF9qc3goRWRpdG9yU2tlbGV0b25MaW5lLCB7IHdpZHRoOiBcIjU0JVwiIH0pXSB9KSkgOiAoX2pzeChUZXh0U3BhY2UsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRleHRTcGFjZVJlZiB9LCB0ZXh0QXJlYVByb3BzLCB7IHZhbHVlOiBjdXJyZW50VGV4dCwgb25DaGFuZ2U6IGhhbmRsZU9uQ2hhbmdlLCBvblBhc3RlOiAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXN0ZWRUZXh0Lmxlbmd0aCA+IExBUkdFX0lOUFVUX1RIUkVTSE9MRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRleHRTcGFjZVJlZi5jdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gKF9hID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnNlbGVjdGlvblN0YXJ0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfYiA9IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZWxlY3Rpb25FbmQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWZlciBsaXZlIERPTSB2YWx1ZSDigJQgYGN1cnJlbnRUZXh0YCBjYW4gbGFnIHRoZSB0ZXh0YXJlYSBmb3IgYmlnIHBhc3Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKF9jID0gZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLnZhbHVlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdXJyZW50VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VGV4dCA9IGJhc2Uuc2xpY2UoMCwgc3RhcnQpICsgcGFzdGVkVGV4dCArIGJhc2Uuc2xpY2UoZW5kKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFZGl0b3JUZXh0KG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0Q2hhbmdlV2l0aEd1YXJkKG5leHRUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJldCA9IHN0YXJ0ICsgcGFzdGVkVGV4dC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGEgPSB0ZXh0U3BhY2VSZWYuY3VycmVudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhLnNldFNlbGVjdGlvblJhbmdlKGNhcmV0LCBjYXJldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaW52YWxpZCByYW5nZSBpbiBlZGdlIGJyb3dzZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm93czogcm93cyB9KSkpLCBpc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlID8gKF9qc3hzKEluc3RydWN0aW9uQ29udGFpbmVyLCB7IGNoaWxkcmVuOiBbX2pzeHMoSW5zdHJ1Y3Rpb25JbnB1dFJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdEljb24sIHsgd2lkdGg6IDE4LCBoZWlnaHQ6IDE4LCBjb2xvcjogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5IH0pLCBfanN4KEluc3RydWN0aW9uSW5wdXQsIHsgdmFsdWU6IGluc3RydWN0aW9uVGV4dCwgcGxhY2Vob2xkZXI6IFwiQWRkIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byByZWZpbmUgeW91ciBtZXNzYWdlXCIsIG9uQ2hhbmdlOiAoZSkgPT4gc2V0SW5zdHJ1Y3Rpb25UZXh0KGUudGFyZ2V0LnZhbHVlKSB9KSwgX2pzeHMoSW5zdHJ1Y3Rpb25BY3Rpb25zLCB7IGNoaWxkcmVuOiBbX2pzeChJbnN0cnVjdGlvbkNhbmNlbCwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluc3RydWN0aW9uVGV4dCgnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCB7IGNoaWxkcmVuOiBcIkNhbmNlbFwiIH0pKSwgX2pzeChJbnN0cnVjdGlvbkltcHJvdmUsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvblRvQXBwbHkgPSBpbnN0cnVjdGlvblRleHQudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0cnVjdGlvblRleHQoJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKEFJRWRpdG9yQWN0aW9uVHlwZXMuUkVQSFJBU0UsIGZhbHNlLCBpbnN0cnVjdGlvblRvQXBwbHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH0sIHsgY2hpbGRyZW46IFwiSW1wcm92ZVwiIH0pKV0gfSldIH0pLCBpbnN0cnVjdGlvblRleHQudHJpbSgpLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluc3RydWN0aW9uU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkxpc3QsIHsgY2hpbGRyZW46IGZpbHRlcmVkSW5zdHJ1Y3Rpb25TdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IChfanN4KEluc3RydWN0aW9uU3VnZ2VzdGlvbkJ1dHRvbiwgT2JqZWN0LmFzc2lnbih7IHR5cGU6IFwiYnV0dG9uXCIsIHNlbGVjdGVkOiBpbnN0cnVjdGlvblRleHQgPT09IHN1Z2dlc3Rpb24sIG9uQ2xpY2s6ICgpID0+IHNldEluc3RydWN0aW9uVGV4dChzdWdnZXN0aW9uKSB9LCB7IGNoaWxkcmVuOiBzdWdnZXN0aW9uIH0pLCBzdWdnZXN0aW9uKSkpIH0pKSA6IG51bGxdIH0pKSA6IChfanN4KFdoYXRzQXBwVGV4dEVkaXRvckhlYWRlciwgeyBhY3Rpb25zOiBhY3Rpb25zLCByZWY6IHRleHRTcGFjZVJlZiwgb25BY3Rpb25TZWxlY3Q6IG9uQWN0aW9uU2VsZWN0LCBSaWdodENvbXBvbmVudDogUmlnaHRDb21wb25lbnQsIHJpZ2h0QWN0aW9uc0Rpc2FibGVkOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBvbkVtb2ppQ2xpY2s6IG9uRW1vamlBZGRpdGlvbiwgYWlBY3Rpb25zOiBhaUhlYWRlckFjdGlvbnMsIGRpc2FibGVBbGxBY3Rpb25zOiBzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24gfHwgaXNHZW5lcmF0aW5nLCBpbnN0cnVjdGlvbkFjdGl2ZTogaXNJbnN0cnVjdGlvbklucHV0VmlzaWJsZSwgb25BSUluc3RydWN0aW9uc0NsaWNrOiAoKSA9PiBzZXRJc0luc3RydWN0aW9uSW5wdXRWaXNpYmxlKHRydWUpLCBvbkFJVG9uZUNoYW5nZTogKGFjdGlvblR5cGUsIHRvbmVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9uZUJ5QWN0aW9uKChwcmV2KSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcmV2KSwgeyBbYWN0aW9uVHlwZV06IHRvbmVJZCB9KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25BSVRvbmVTZWxlY3QgPT09IG51bGwgfHwgb25BSVRvbmVTZWxlY3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQUlUb25lU2VsZWN0KGFjdGlvblR5cGUsIHRvbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uVHlwZSA9PT0gQUlFZGl0b3JBY3Rpb25UeXBlcy5SRVBIUkFTRSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBSUFjdGlvbihhY3Rpb25UeXBlLCBmYWxzZSwgdW5kZWZpbmVkLCB0b25lSWQsIEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25BSUFjdGlvbkNsaWNrOiAoYWN0aW9uVHlwZSwgYWN0aW9uVmFyaWFudCA9IEFJQWN0aW9uVmFyaWFudC5ERUZBVUxUKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNHZW5lcmF0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTaG93U3VnZ2VzdGlvblNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkFjdGlvblR5cGUgPT09IGFjdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBhY3Rpb24gc2hvdWxkIG5vdCByZXRyaWdnZXIgZnJvbSBjaGlwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlIGlzIG9ubHkgdmlhIGV4cGxpY2l0IHJlZ2VuZXJhdGUgY29udHJvbC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgYWN0aW9uIHN0YXJ0cyBhIGZyZXNoIHN1Z2dlc3Rpb24gc2Vzc2lvbi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN1Z2dlc3Rpb25TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFJQWN0aW9uKGFjdGlvblR5cGUsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWN0aW9uVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSkpXSB9KSksIF9qc3hzKEVkaXRvckZvb3RlclJvdywgeyBjaGlsZHJlbjogW19qc3goRWRpdG9yRm9vdGVyVGl0bGUsIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciA/IChfanN4KFRpdGxlU21hbGwsIE9iamVjdC5hc3NpZ24oeyBcImRhdGEtdGVzdFwiOiBcImJvZHktdGV4dC1mb3ItZWRpdC10ZW1wbGF0ZVwiIH0sIHsgY2hpbGRyZW46IGVkaXRvckhlYWRlciB9KSkpIDogbnVsbCB9KSwgX2pzeHMoRWRpdG9yRm9vdGVyUmlnaHQsIHsgY2hpbGRyZW46IFtlcnJvciAmJiBlcnJvciAhPT0gTElNSVRfUkVBQ0hFRCA/IChfanN4cyhfRnJhZ21lbnQsIHsgY2hpbGRyZW46IFtfanN4KEluZm9JY29uLCB7IHdpZHRoOiAxNiwgaGVpZ2h0OiAxNiwgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0pLCBfanN4KEJvZHlDYXB0aW9uLCBPYmplY3QuYXNzaWduKHsgY29sb3I6IENPTE9SUy5jb250ZW50Lm5lZ2F0aXZlIH0sIHsgY2hpbGRyZW46IGVycm9yIH0pKV0gfSkpIDogbnVsbCwgbGltaXQgPyAoX2pzeHMoQm9keUNhcHRpb24sIE9iamVjdC5hc3NpZ24oeyBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZXJyb3IgPT09IExJTUlUX1JFQUNIRUQgfHwgY3VycmVudFRleHQubGVuZ3RoID4gbGltaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ09MT1JTLmNvbnRlbnQubmVnYXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09MT1JTLmNvbnRlbnQuc2Vjb25kYXJ5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgeyBjaGlsZHJlbjogW2N1cnJlbnRUZXh0Lmxlbmd0aCwgXCIvXCIsIGxpbWl0XSB9KSkpIDogbnVsbF0gfSldIH0pXSB9KSk7XHJcbn0pO1xyXG5XaGF0c0FwcFRleHRFZGl0b3IuZGlzcGxheU5hbWUgPSAnV2hhdHNBcHBUZXh0RWRpdG9yJztcclxuZXhwb3J0IHsgQUlfVEFHX0NIQU5HRV9SQVRJT19USFJFU0hPTEQsIGNvbXB1dGVBaVRhZ09uQWNjZXB0LCBsZXZlbnNodGVpbkRpc3RhbmNlLCB9IGZyb20gJy4vYWkvYWlUYWcnO1xyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1XaGF0c0FwcFRleHRFZGl0b3IuanMubWFwIl19 */")),WI=new J,RI={[T.BOLD]:"*",[T.ITALIC]:"_",[T.STRIKETHROUGH]:"~"};function HI(I){return`whatsapp-editor-rephrase-highlight-${I||"default"}`}const BI=u.forwardRef(((I,b)=>{var{onChange:J,onClickVariable:u,text:T,RightComponent:K,error:P,limit:BI,onError:JI,rows:uI,actions:NI,editorInstanceKey:mI,templateType:xI="marketing",templateId:yI,requestExecutor:FI,baseUrl:YI,endpointPath:aI,useCase:hI,storeId:iI,apiAdapter:pI,conversationId:nI="whatsapp-template-editor",systemId:UI="whatsapp-writer",intent:kI="default",enabledAIActions:SI=[D.REPHRASE,D.SHORTEN,D.EXPAND,D.EMOJIFY],disableBuiltInAIActions:sI=!1,promptOverrides:vI,rephraseTones:zI,aiActionMinChars:QI,instructionSuggestions:wI=n,onAIEvent:oI,onAITagComputed:tI,prefillWasAiGenerated:jI=!1,editorHeader:TI,onAIToneSelect:DI,onAIActionRequest:eI,onBuildAIPrompt:LI}=I,KI=g(I,["onChange","onClickVariable","text","RightComponent","error","limit","onError","rows","actions","editorInstanceKey","templateType","templateId","requestExecutor","baseUrl","endpointPath","useCase","storeId","apiAdapter","conversationId","systemId","intent","enabledAIActions","disableBuiltInAIActions","promptOverrides","rephraseTones","aiActionMinChars","instructionSuggestions","onAIEvent","onAITagComputed","prefillWasAiGenerated","editorHeader","onAIToneSelect","onAIActionRequest","onBuildAIPrompt"]);const OI=N(null),[PI,EI]=m(T||""),[fI,MI]=m(!1),[rI,qI]=m(0),[_I,$I]=m(!1),[Ig,gg]=m(!1),[Cg,Ag]=m(""),[cg,lg]=m({}),[bg,Zg]=m(null),[Gg,Xg]=m([]),[dg,Vg]=m(0),[Wg,Rg]=m(null),Hg=N(null),Bg=N(null),Jg=N(null),ug=N(null),Ng=N(null),mg=N(null),xg=N(!!jI);x((()=>{xg.current=!!jI}),[jI,mI]);const yg=y((()=>U(xI,vI,zI)),[vI,zI,xI]),Fg=y((()=>{const I=Cg.trim().toLowerCase();return I?wI.filter((g=>g.toLowerCase().includes(I))):[]}),[wI,Cg]),Yg=y((()=>Object.assign(Object.assign({},k),QI||{})),[QI]),ag=Yg[D.REPHRASE]||k[D.REPHRASE],hg=F(((I,g)=>{null==oI||oI(I,g)}),[oI]),ig=F((I=>{EI((g=>g===I?g:I))}),[]),pg=F((I=>{if(Ng.current&&clearTimeout(Ng.current),I.length>1200)return null==J||J(I,I),void(Ng.current=setTimeout((()=>{null==J||J(I,WI.getHTML(I))}),16));null==J||J(I,WI.getHTML(I))}),[J]),ng=F((()=>{Zg(null),Xg([]),Vg(0),Rg(null)}),[]),Ug=F((()=>{if(rI>=5)return;const I=rI+1;qI(I),"undefined"!=typeof window&&mI&&sessionStorage.setItem(HI(mI),String(I)),MI(!0),Jg.current&&clearTimeout(Jg.current),Jg.current=setTimeout((()=>{MI(!1)}),1200)}),[mI,rI]),kg=N(Ug);function Sg(I){const g=null==OI?void 0:OI.current;null!=g&&(g.selectionStart?(g.focus(),g.selectionEnd=I):g.focus())}function sg(I){var g,C;let A=null!==(C=null===(g=OI.current)||void 0===g?void 0:g.value)&&void 0!==C?C:"";if(OI.current&&I){const g=OI.current.selectionStart,C=OI.current.selectionEnd,c=I;if(g===C)return vg(c);{A=WI.wrappWildcard(g,C,c,A);const I=WI.getHTML(A);return ig(A),{text:A,html:I}}}return{text:A,html:A}}function vg(I){var g,C;const A=null!==(C=null===(g=OI.current)||void 0===g?void 0:g.value)&&void 0!==C?C:"";if(OI.current&&I){const g=OI.current.selectionStart;if(g===OI.current.selectionEnd)return zg(I,g)}return{text:A,html:A}}function zg(I,g){var C,A;let c=null!==(A=null===(C=OI.current)||void 0===C?void 0:C.value)&&void 0!==A?A:"";c=c.slice(0,g)+I+c.slice(g);const l=WI.getHTML(c);return ig(c),{text:c,html:l}}kg.current=Ug,x((()=>{if("undefined"==typeof window||!mI)return;const I=Number(sessionStorage.getItem(HI(mI))||"0");Number.isNaN(I)||qI(I)}),[mI]),x((()=>{const I=!!PI.trim()&&PI.length>=ag;if(null===ug.current)return ug.current=I,void(I&&(Bg.current=setTimeout((()=>{kg.current()}),3e3)));if(!I)return ug.current=!1,MI(!1),void(Bg.current&&(clearTimeout(Bg.current),Bg.current=null));const g=!ug.current&&I;ug.current=!0,g&&kg.current(),Bg.current&&clearTimeout(Bg.current),Bg.current=setTimeout((()=>{kg.current()}),3e3)}),[PI,ag]),x((()=>()=>{Bg.current&&clearTimeout(Bg.current),Jg.current&&clearTimeout(Jg.current),Ng.current&&clearTimeout(Ng.current)}),[]);const Qg=Gg[dg]||"",wg=y((()=>WI.getHTML(bg||"")),[bg]),og=y((()=>WI.getHTML(Qg)),[Qg]),tg=Gg.length<3,jg=!!bg&&Gg.length>0,Tg=Gg.length<=1||dg<=0,Dg=Gg.length<=1||dg>=Gg.length-1;x((()=>{if(!jg)return;const I=Hg.current;I&&(I.scrollTop=I.scrollHeight)}),[Qg,jg,_I]);const eg=F((function(I){let g=arguments.length>1&&void 0!==arguments[1]&&arguments[1],A=arguments.length>2?arguments[2]:void 0,c=arguments.length>3?arguments[3]:void 0,l=arguments.length>4&&void 0!==arguments[4]?arguments[4]:e.DEFAULT;return C(void 0,void 0,void 0,(function*(){var C,b,Z;if(!(eI||pI||FI&&YI))return void(null==JI||JI("AI configuration missing"));if(!PI.trim())return;const G=Yg[I]||k[I]||50;if(PI.length<G)return;if(_I)return;if(g&&!tg)return;const X=yg[I],d=I===D.REPHRASE&&"utility"===xI&&l===e.REPHRASE?Object.assign(Object.assign({},X),{label:"Rephrase",basePrompt:"Rephrase this WhatsApp utility template to improve clarity and readability while preserving variables, intent, and compliance."}):X,V=c||cg[I]||d.defaultToneId||(null===(b=null===(C=d.tones)||void 0===C?void 0:C[0])||void 0===b?void 0:b.id),W=null===(Z=d.tones)||void 0===Z?void 0:Z.find((I=>I.id===V)),R=void 0!==A?A:Cg,H=(null==LI?void 0:LI({actionType:I,actionVariant:l,currentText:PI,templateType:xI,config:d,toneId:V,toneLabel:null==W?void 0:W.label,instructionText:R||void 0}))||s({config:d,currentText:PI,selectedToneId:V,instructionText:R});$I(!0),hg("ai_action_triggered",{action_type:I,template_id:yI});try{const C=eI?yield eI({actionType:I,actionVariant:l,currentText:PI,templateType:xI,toneId:V,toneLabel:null==W?void 0:W.label,instructionText:R||void 0,prompt:H}):yield v({apiAdapter:pI,requestExecutor:FI,baseUrl:YI,endpointPath:aI,prompt:H,intent:kI,conversationId:nI,systemId:UI,useCase:hI,storeId:iI}),A="string"==typeof C?C.trim():((null==C?void 0:C.body)||"").trim();if(!A)return;if(!g)return Zg(PI),Rg(I),Xg([A]),void Vg(0);Xg((I=>{const g=[...I,A].slice(0,3);return Vg(g.length-1),g}))}catch(I){null==JI||JI("Failed to generate AI suggestion")}finally{$I(!1)}}))}),[FI,YI,PI,_I,tg,yg,cg,Cg,hg,yI,aI,pI,kI,nI,UI,hI,iI,xI,JI,Yg,eI,LI]),Lg=F((()=>{if(!Qg||!bg||!Wg)return;ig(Qg),pg(Qg),hg("ai_suggestion_accepted",{action_type:Wg,template_id:yI});const I=xg.current,g=S({baselineText:bg,acceptedText:Qg,initialAiPrefillPhase:I});I&&(xg.current=!1),null==tI||tI(g),ng()}),[Qg,bg,Wg,ig,pg,hg,yI,tI,ng]),Kg=F((()=>{Wg&&(hg("ai_suggestion_discarded",{action_type:Wg,template_id:yI}),ng())}),[ng,hg,Wg,yI]),Og=F((I=>{Wg&&hg("ai_feedback_submitted",{action_type:Wg,template_id:yI,rating:I,candidate_index:dg+1})}),[hg,Wg,dg,yI]),Pg=y((()=>sI?[]:SI.map((I=>{var g,C,A;const c=yg[I],l=cg[I]||c.defaultToneId||(null===(C=null===(g=c.tones)||void 0===g?void 0:g[0])||void 0===C?void 0:C.id);return{type:I,label:c.label,isPrimary:I===D.REPHRASE,loading:_I&&Wg===I,highlighted:I===D.REPHRASE&&fI,disabled:!PI.trim()||PI.length<(Yg[I]||k[I]||50)||_I||jg&&Wg===I,showToneDropdown:I===D.REPHRASE&&!!(null===(A=c.tones)||void 0===A?void 0:A.length),tones:c.tones,selectedToneId:l}}))),[SI,sI,yg,cg,_I,Wg,jg,fI,PI,Yg]);return Y(b,(()=>({addTextOrWrap:sg,addText:vg,get:()=>PI,setCaretPosition:Sg})),[sg,vg,PI]),x((()=>{void 0!==T&&ig(T||"")}),[T,ig]),x((()=>{if(!BI||!JI)return;const I=PI.length>BI?O:null!=P?P:"";mg.current!==I&&(mg.current=I,JI(I))}),[PI,P,BI,JI]),A(z,{children:[A(Q,Object.assign({isError:!!P},{children:[jg?A(M,Object.assign({ref:Hg},{children:[c(r,{dangerouslySetInnerHTML:{__html:wg}}),c(q,_I?Object.assign({"aria-busy":"true"},{children:A(_,{children:[c(f,{width:"96%"}),c(f,{width:"84%"}),c(f,{width:"68%"})]})}):{dangerouslySetInnerHTML:{__html:og}}),A($,{children:[A(II,{children:[dg+1,"/",Gg.length]}),c(gI,Object.assign({"aria-label":"Previous suggestion",type:"button",disabled:Tg,onClick:()=>Vg((I=>Math.max(0,I-1)))},{children:c(G,{width:14,height:14})})),c(gI,Object.assign({"aria-label":"Next suggestion",type:"button",disabled:Dg,onClick:()=>Vg((I=>Math.min(Gg.length-1,I+1)))},{children:c(X,{width:14,height:14})})),c(h,Object.assign({body:"Like",placement:"top"},{children:c(gI,Object.assign({"aria-label":"Like suggestion",type:"button",onClick:()=>Og("like")},{children:c(B,{width:14,height:14})}))})),c(h,Object.assign({body:"Dislike",placement:"top"},{children:c(gI,Object.assign({"aria-label":"Dislike suggestion",type:"button",onClick:()=>Og("dislike")},{children:c(H,{width:14,height:14})}))})),tg?c(h,Object.assign({body:_I?"Regenerating…":"Regenerate",placement:"top"},{children:c(CI,Object.assign({"aria-label":"Regenerate suggestion","aria-busy":_I,type:"button",disabled:_I,onClick:()=>{Wg&&eg(Wg,!0)}},{children:_I?c(AI,{"aria-hidden":!0}):c(R,{width:14,height:14})}))})):null,c(h,Object.assign({body:"Discard",placement:"top"},{children:c(gI,Object.assign({"aria-label":"Discard suggestion",type:"button",onClick:Kg},{children:c(d,{width:14,height:14})}))})),c(h,Object.assign({body:"Accept",placement:"top"},{children:c(gI,Object.assign({"aria-label":"Accept suggestion",type:"button",onClick:Lg},{children:c(Z,{width:14,height:14})}))}))]})]})):_I?A(E,{children:[c(f,{width:"96%"}),c(f,{width:"92%"}),c(f,{width:"88%"}),c(f,{width:"54%"})]}):c(w,Object.assign({ref:OI},KI,{value:PI,onChange:function(I){const g=I.target.value;ig(g),pg(g)},onPaste:I=>{var g,C,A;const c=I.clipboardData.getData("text");if(c.length>1200){I.preventDefault();const l=OI.current,b=null!==(g=null==l?void 0:l.selectionStart)&&void 0!==g?g:0,Z=null!==(C=null==l?void 0:l.selectionEnd)&&void 0!==C?C:b,G=null!==(A=null==l?void 0:l.value)&&void 0!==A?A:PI,X=G.slice(0,b)+c+G.slice(Z);ig(X),pg(X);const d=b+c.length;requestAnimationFrame((()=>{const I=OI.current;if(I)try{I.setSelectionRange(d,d)}catch(I){}}))}},rows:uI})),Ig?A(cI,{children:[A(lI,{children:[c(V,{width:18,height:18,color:a.content.secondary}),c(bI,{value:Cg,placeholder:"Add specific instructions to refine your message",onChange:I=>Ag(I.target.value)}),A(ZI,{children:[c(GI,Object.assign({type:"button",onClick:()=>{Ag(""),gg(!1)}},{children:"Cancel"})),c(XI,Object.assign({type:"button",onClick:()=>{const I=Cg.trim();gg(!1),Ag(""),eg(D.REPHRASE,!1,I)}},{children:"Improve"}))]})]}),Cg.trim().length>0&&Fg.length>0?c(dI,{children:Fg.map((I=>c(VI,Object.assign({type:"button",selected:Cg===I,onClick:()=>Ag(I)},{children:I}),I)))}):null]}):c(L,{actions:NI,ref:OI,onActionSelect:function(I){const g=RI[I];if(g&&OI.current){const I=OI.current.selectionStart;if(I===OI.current.selectionEnd){const{text:C}=zg(g,I);Sg(I+1),pg(C)}else{const{text:I}=sg(g);pg(I)}}},RightComponent:K,rightActionsDisabled:jg||_I,onEmojiClick:function(I){const{text:g}=vg(I);pg(g)},aiActions:Pg,disableAllActions:jg||_I,instructionActive:Ig,onAIInstructionsClick:()=>gg(!0),onAIToneChange:(I,g)=>{lg((C=>Object.assign(Object.assign({},C),{[I]:g}))),null==DI||DI(I,g),I===D.REPHRASE&&eg(I,!1,void 0,g,e.DEFAULT)},onAIActionClick:function(I){let g=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e.DEFAULT;if(!_I){if(jg){if(Wg===I)return;return ng(),void eg(I,!1,void 0,void 0,g)}eg(I,!1,void 0,void 0,g)}}})]})),A(o,{children:[c(t,{children:TI?c(i,Object.assign({"data-test":"body-text-for-edit-template"},{children:TI})):null}),A(j,{children:[P&&P!==O?A(l,{children:[c(W,{width:16,height:16,color:a.content.negative}),c(p,Object.assign({color:a.content.negative},{children:P}))]}):null,BI?A(p,Object.assign({style:{color:P===O||PI.length>BI?a.content.negative:a.content.secondary}},{children:[PI.length,"/",BI]})):null]})]})]})}));BI.displayName="WhatsAppTextEditor";export{BI as WhatsAppTextEditor};