genassist-chat-react 1.0.40 → 1.0.41

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.
@@ -67,28 +67,29 @@ import { VoiceInput } from './VoiceInput';
67
67
  import { LiveCallControl } from './LiveCallControl';
68
68
  import { useLiveVoice as useLiveVoiceSession } from '../hooks/useLiveVoice';
69
69
  import { AudioService } from '../services/audioService';
70
- import { Paperclip, MoreVertical, RefreshCw, Globe, X, ArrowUp, Maximize2, Minimize2, AlertCircle } from 'lucide-react';
71
- import { ChatBubble } from './ChatBubble';
70
+ import { Paperclip, MoreHorizontal, RefreshCw, Globe, X, ArrowUp, Maximize2, Minimize2, AlertCircle, Fullscreen } from 'lucide-react';
71
+ import { BubbleDock } from './BubbleDock';
72
72
  import DynamicFormMessage from './DynamicFormMessage';
73
73
  import { LanguageSelector } from './LanguageSelector';
74
74
  import chatLogo from '../assets/chat-logo.png';
75
75
  import { resolveLanguage, mergeTranslations, getTranslationString, getTranslationsForLanguage, } from '../utils/i18n';
76
76
  import { GoogleReCaptcha, GoogleReCaptchaProvider } from 'react-google-recaptcha-v3';
77
- import { resolveTheme, hexToRgba, getContainerStyle, getHeaderStyle, logoContainerStyle, logoStyle, headerTitleContainerStyle, getHeaderTitleStyle, getHeaderSubtitleStyle, menuButtonStyle, getMenuPopupStyle, getMenuItemStyle, chatContainerStyle, inputContainerStyle, inputWrapperStyle, getTextAreaStyle, getLiveVoiceHintStyle, attachButtonStyle, getSendButtonStyle, sendButtonDisabledStyle, rightActionContainerStyle, getPossibleQueriesContainerStyle, getQueryButtonStyle, getConfirmOverlayStyle, getConfirmDialogStyle, confirmButtonsStyle, getConfirmButtonStyle, getContentCardStyle, getDisclaimerStyle, getPositionStyles, getFloatingContainerStyle, CSS_KEYFRAMES, } from '../styles/genAgentChatStyles';
77
+ import { resolveTheme, hexToRgba, getContainerStyle, getHeaderStyle, headerLeftContainerStyle, headerRightContainerStyle, headerPillStyle, logoStyle, brandLogoStyle, getHeaderPillTitleStyle, headerPillTextColumnStyle, getHeaderDescriptionTextStyle, menuButtonStyle, getMenuPopupStyle, getMenuItemStyle, chatContainerStyle, inputContainerStyle, inputWrapperStyle, getTextAreaStyle, getLiveVoiceHintStyle, attachButtonStyle, getSendButtonStyle, sendButtonDisabledStyle, rightActionContainerStyle, getPossibleQueriesContainerStyle, getQueryButtonStyle, getConfirmOverlayStyle, getConfirmDialogStyle, confirmButtonsStyle, getConfirmButtonStyle, getContentCardStyle, getDisclaimerStyle, getFloatingContainerStyle, CSS_KEYFRAMES, } from '../styles/genAgentChatStyles';
78
78
  var SHOW_CHAT_LANGUAGE_SELECTOR = true;
79
79
  /** Current time in epoch seconds (the timestamp format ChatMessage expects). */
80
80
  var nowSec = function () { return Math.floor(Date.now() / 1000); };
81
81
  export var GenAgentChat = function (_a) {
82
- var baseUrl = _a.baseUrl, websocketUrl = _a.websocketUrl, apiKey = _a.apiKey, tenant = _a.tenant, metadata = _a.metadata, _b = _a.useWs, useWs = _b === void 0 ? true : _b, _c = _a.usePoll, usePoll = _c === void 0 ? false : _c, onError = _a.onError, onTakeover = _a.onTakeover, onFinalize = _a.onFinalize, theme = _a.theme, _d = _a.headerTitle, headerTitle = _d === void 0 ? 'Genassist' : _d, description = _a.description, placeholder = _a.placeholder, agentName = _a.agentName, logoUrl = _a.logoUrl, _e = _a.mode, mode = _e === void 0 ? 'embedded' : _e, onExitFullscreen = _a.onExitFullscreen, _f = _a.floatingConfig, floatingConfig = _f === void 0 ? {} : _f, language = _a.language, customTranslations = _a.translations, reCaptchaKey = _a.reCaptchaKey, _g = _a.widget, widget = _g === void 0 ? false : _g, _h = _a.useAudio, useAudio = _h === void 0 ? false : _h, _j = _a.useFile, useFile = _j === void 0 ? false : _j, _k = _a.noColorAnimation, noColorAnimation = _k === void 0 ? false : _k, _l = _a.showWelcomeBeforeStart, showWelcomeBeforeStart = _l === void 0 ? true : _l, _m = _a.allowedExtensions, allowedExtensions = _m === void 0 ? [] : _m, serverUnavailableMessage = _a.serverUnavailableMessage, serverUnavailableContactUrl = _a.serverUnavailableContactUrl, serverUnavailableContactLabel = _a.serverUnavailableContactLabel, _o = _a.formDisplay, formDisplay = _o === void 0 ? 'footer' : _o, onConfigLoaded = _a.onConfigLoaded;
82
+ var _b, _c;
83
+ var baseUrl = _a.baseUrl, websocketUrl = _a.websocketUrl, apiKey = _a.apiKey, tenant = _a.tenant, metadata = _a.metadata, _d = _a.useWs, useWs = _d === void 0 ? true : _d, _e = _a.usePoll, usePoll = _e === void 0 ? false : _e, onError = _a.onError, onTakeover = _a.onTakeover, onFinalize = _a.onFinalize, theme = _a.theme, _f = _a.headerTitle, headerTitle = _f === void 0 ? 'Genassist' : _f, description = _a.description, placeholder = _a.placeholder, agentName = _a.agentName, logoUrl = _a.logoUrl, brandLogoUrl = _a.brandLogoUrl, _g = _a.mode, mode = _g === void 0 ? 'embedded' : _g, onExitFullscreen = _a.onExitFullscreen, _h = _a.floatingConfig, floatingConfig = _h === void 0 ? {} : _h, language = _a.language, customTranslations = _a.translations, reCaptchaKey = _a.reCaptchaKey, _j = _a.widget, widget = _j === void 0 ? false : _j, _k = _a.quickInput, quickInput = _k === void 0 ? false : _k, _l = _a.useAudio, useAudio = _l === void 0 ? false : _l, _m = _a.useFile, useFile = _m === void 0 ? false : _m, _o = _a.noColorAnimation, noColorAnimation = _o === void 0 ? false : _o, _p = _a.showWelcomeBeforeStart, showWelcomeBeforeStart = _p === void 0 ? true : _p, _q = _a.allowedExtensions, allowedExtensions = _q === void 0 ? [] : _q, serverUnavailableMessage = _a.serverUnavailableMessage, serverUnavailableContactUrl = _a.serverUnavailableContactUrl, serverUnavailableContactLabel = _a.serverUnavailableContactLabel, _r = _a.formDisplay, formDisplay = _r === void 0 ? 'footer' : _r, onConfigLoaded = _a.onConfigLoaded;
83
84
  // Language selection state (with localStorage persistence)
84
- var _p = useState(function () {
85
+ var _s = useState(function () {
85
86
  if (language)
86
87
  return language;
87
88
  var stored = typeof window !== 'undefined' ? localStorage.getItem('genassist_language') : null;
88
89
  if (stored)
89
90
  return stored;
90
91
  return resolveLanguage();
91
- }), selectedLanguage = _p[0], setSelectedLanguage = _p[1];
92
+ }), selectedLanguage = _s[0], setSelectedLanguage = _s[1];
92
93
  // Save language to localStorage when it changes
93
94
  useEffect(function () {
94
95
  if (typeof window !== 'undefined' && !language) {
@@ -96,7 +97,7 @@ export var GenAgentChat = function (_a) {
96
97
  }
97
98
  }, [selectedLanguage, language]);
98
99
  // State for tracking selected FAQ query
99
- var _q = useState(null), selectedFaqQuery = _q[0], setSelectedFaqQuery = _q[1];
100
+ var _t = useState(null), selectedFaqQuery = _t[0], setSelectedFaqQuery = _t[1];
100
101
  // Resolve language: prop > selected > browser > 'en'
101
102
  var resolvedLanguage = useMemo(function () {
102
103
  if (language)
@@ -116,20 +117,33 @@ export var GenAgentChat = function (_a) {
116
117
  return getTranslationString(key, translations, fallback);
117
118
  };
118
119
  var inputPlaceholder = useMemo(function () { return placeholder || t('input.placeholder', 'Ask a question'); }, [placeholder, translations]);
119
- var _r = useState(''), inputValue = _r[0], setInputValue = _r[1];
120
- var _s = useState(false), showResetConfirm = _s[0], setShowResetConfirm = _s[1];
121
- var _t = useState(false), showMenu = _t[0], setShowMenu = _t[1];
122
- var _u = useState(false), showLanguageDropdown = _u[0], setShowLanguageDropdown = _u[1];
123
- var _v = useState(false), isPlayingAudio = _v[0], setIsPlayingAudio = _v[1];
124
- var _w = useState(false), isFloatingOpen = _w[0], setIsFloatingOpen = _w[1];
125
- var _x = useState(new Set()), submittedForms = _x[0], setSubmittedForms = _x[1];
126
- var _y = useState(null), submittingFormIndex = _y[0], setSubmittingFormIndex = _y[1];
120
+ var _u = useState(''), inputValue = _u[0], setInputValue = _u[1];
121
+ var _v = useState(false), showResetConfirm = _v[0], setShowResetConfirm = _v[1];
122
+ var _w = useState(false), showMenu = _w[0], setShowMenu = _w[1];
123
+ var _x = useState(false), showLanguageDropdown = _x[0], setShowLanguageDropdown = _x[1];
124
+ var _y = useState(false), isPlayingAudio = _y[0], setIsPlayingAudio = _y[1];
125
+ var _z = useState(false), isFloatingOpen = _z[0], setIsFloatingOpen = _z[1];
126
+ // Keeps the floating panel in the DOM through its close animation before unmounting.
127
+ var _0 = useState(false), isPanelMounted = _0[0], setIsPanelMounted = _0[1];
128
+ // Quick-message input beside the launcher bubble (dismissal persists across loads).
129
+ var _1 = useState(function () {
130
+ if (typeof window === 'undefined')
131
+ return false;
132
+ try {
133
+ return localStorage.getItem('genassist_quick_input_dismissed') === '1';
134
+ }
135
+ catch (_a) {
136
+ return false;
137
+ }
138
+ }), quickInputDismissed = _1[0], setQuickInputDismissed = _1[1];
139
+ var _2 = useState(new Set()), submittedForms = _2[0], setSubmittedForms = _2[1];
140
+ var _3 = useState(null), submittingFormIndex = _3[0], setSubmittingFormIndex = _3[1];
127
141
  var menuRef = useRef(null);
128
142
  var textAreaRef = useRef(null);
129
143
  var headerRef = useRef(null);
130
- var _z = useState(56), headerHeight = _z[0], setHeaderHeight = _z[1];
131
- var _0 = useState(false), showBacklight = _0[0], setShowBacklight = _0[1];
132
- var _1 = useChat({
144
+ var _4 = useState(56), headerHeight = _4[0], setHeaderHeight = _4[1];
145
+ var _5 = useState(false), showBacklight = _5[0], setShowBacklight = _5[1];
146
+ var _6 = useChat({
133
147
  baseUrl: baseUrl,
134
148
  websocketUrl: websocketUrl,
135
149
  apiKey: apiKey,
@@ -145,14 +159,14 @@ export var GenAgentChat = function (_a) {
145
159
  serverUnavailableContactUrl: serverUnavailableContactUrl,
146
160
  serverUnavailableContactLabel: serverUnavailableContactLabel,
147
161
  onConfigLoaded: onConfigLoaded,
148
- }), messages = _1.messages, isLoading = _1.isLoading, sendMessage = _1.sendMessage, sendAudioMessage = _1.sendAudioMessage, uploadFile = _1.uploadFile, resetConversation = _1.resetConversation, startConversation = _1.startConversation, triggerStartForm = _1.triggerStartForm, shouldTriggerStartForm = _1.shouldTriggerStartForm, conversationId = _1.conversationId, guestToken = _1.guestToken, possibleQueries = _1.possibleQueries, isFinalized = _1.isFinalized, isAgentTyping = _1.isAgentTyping, addFeedback = _1.addFeedback, agentAvailableLanguages = _1.availableLanguages, agentId = _1.agentId, agentLiveVoiceEnabled = _1.agentLiveVoiceEnabled, agentLiveVoiceReady = _1.agentLiveVoiceReady, welcomeTitle = _1.welcomeTitle, welcomeImageUrl = _1.welcomeImageUrl, welcomeMessage = _1.welcomeMessage, inputDisclaimerHtml = _1.inputDisclaimerHtml, thinkingPhrases = _1.thinkingPhrases, thinkingDelayMs = _1.thinkingDelayMs, formNodeLocales = _1.formNodeLocales;
149
- var _2 = useThinkingAnimation({
162
+ }), messages = _6.messages, isLoading = _6.isLoading, sendMessage = _6.sendMessage, sendAudioMessage = _6.sendAudioMessage, uploadFile = _6.uploadFile, resetConversation = _6.resetConversation, startConversation = _6.startConversation, triggerStartForm = _6.triggerStartForm, shouldTriggerStartForm = _6.shouldTriggerStartForm, conversationId = _6.conversationId, guestToken = _6.guestToken, possibleQueries = _6.possibleQueries, isFinalized = _6.isFinalized, isAgentTyping = _6.isAgentTyping, addFeedback = _6.addFeedback, agentAvailableLanguages = _6.availableLanguages, agentId = _6.agentId, agentLiveVoiceEnabled = _6.agentLiveVoiceEnabled, agentLiveVoiceReady = _6.agentLiveVoiceReady, welcomeTitle = _6.welcomeTitle, welcomeImageUrl = _6.welcomeImageUrl, welcomeMessage = _6.welcomeMessage, inputDisclaimerHtml = _6.inputDisclaimerHtml, thinkingPhrases = _6.thinkingPhrases, thinkingDelayMs = _6.thinkingDelayMs, formNodeLocales = _6.formNodeLocales;
163
+ var _7 = useThinkingAnimation({
150
164
  isAgentTyping: isAgentTyping,
151
165
  thinkingPhrases: thinkingPhrases,
152
166
  thinkingDelayMs: thinkingDelayMs,
153
167
  translations: translations,
154
- }), currentThinkingParts = _2.currentThinkingParts, currentThinkingPartIndex = _2.currentThinkingPartIndex;
155
- var _3 = useScrollManagement({
168
+ }), currentThinkingParts = _7.currentThinkingParts, currentThinkingPartIndex = _7.currentThinkingPartIndex;
169
+ var _8 = useScrollManagement({
156
170
  messages: messages,
157
171
  isAgentTyping: isAgentTyping,
158
172
  currentThinkingPartIndex: currentThinkingPartIndex,
@@ -160,8 +174,8 @@ export var GenAgentChat = function (_a) {
160
174
  conversationId: conversationId,
161
175
  isFloatingOpen: isFloatingOpen,
162
176
  mode: mode,
163
- }), messagesEndRef = _3.messagesEndRef, chatContainerRef = _3.chatContainerRef;
164
- var _4 = useViewportManager({
177
+ }), messagesEndRef = _8.messagesEndRef, chatContainerRef = _8.chatContainerRef;
178
+ var _9 = useViewportManager({
165
179
  mode: mode,
166
180
  widget: widget,
167
181
  isFloatingOpen: isFloatingOpen,
@@ -172,8 +186,8 @@ export var GenAgentChat = function (_a) {
172
186
  setShowResetConfirm: setShowResetConfirm,
173
187
  setShowLanguageDropdown: setShowLanguageDropdown,
174
188
  setShowMenu: setShowMenu,
175
- }), windowWidth = _4.windowWidth, windowHeight = _4.windowHeight, isFullscreen = _4.isFullscreen, handleFullscreenToggle = _4.handleFullscreenToggle;
176
- var _5 = useFileAttachments({ uploadFile: uploadFile, t: t }), attachments = _5.attachments, setAttachments = _5.setAttachments, uploadingFiles = _5.uploadingFiles, fileErrorToast = _5.fileErrorToast, fileInputRef = _5.fileInputRef, handleFileChange = _5.handleFileChange, handleRemoveAttachment = _5.handleRemoveAttachment, clearAttachments = _5.clearAttachments;
189
+ }), windowWidth = _9.windowWidth, windowHeight = _9.windowHeight, isFullscreen = _9.isFullscreen, handleFullscreenToggle = _9.handleFullscreenToggle, isExpanded = _9.isExpanded, handleExpandToggle = _9.handleExpandToggle;
190
+ var _10 = useFileAttachments({ uploadFile: uploadFile, t: t }), attachments = _10.attachments, setAttachments = _10.setAttachments, uploadingFiles = _10.uploadingFiles, fileErrorToast = _10.fileErrorToast, fileInputRef = _10.fileInputRef, handleFileChange = _10.handleFileChange, handleRemoveAttachment = _10.handleRemoveAttachment, clearAttachments = _10.clearAttachments;
177
191
  useEffect(function () {
178
192
  if (language)
179
193
  return;
@@ -233,6 +247,12 @@ export var GenAgentChat = function (_a) {
233
247
  setIsFloatingOpen(true);
234
248
  }
235
249
  }, [mode, isFloatingOpen]);
250
+ // Mount the floating panel as soon as it opens; unmount happens on close-animation end.
251
+ useEffect(function () {
252
+ if (mode === 'floating' && isFloatingOpen) {
253
+ setIsPanelMounted(true);
254
+ }
255
+ }, [mode, isFloatingOpen]);
236
256
  useLayoutEffect(function () {
237
257
  var updateHeaderHeight = function () {
238
258
  var _a;
@@ -472,7 +492,7 @@ export var GenAgentChat = function (_a) {
472
492
  // Neutral, user-facing notice shown when a live call can't start / fails. The
473
493
  // message is already neutral (the backend never sends internal config detail), so
474
494
  // it's safe for public widgets — it just avoids a confusing silent close.
475
- var _6 = useState(null), liveVoiceNotice = _6[0], setLiveVoiceNotice = _6[1];
495
+ var _11 = useState(null), liveVoiceNotice = _11[0], setLiveVoiceNotice = _11[1];
476
496
  var handleVoiceError = function (error) {
477
497
  setLiveVoiceNotice(error.message || 'Voice is currently unavailable');
478
498
  if (onError) {
@@ -491,8 +511,8 @@ export var GenAgentChat = function (_a) {
491
511
  // `liveCaption` is the in-progress turn (streams as you speak); `liveTurns` are
492
512
  // completed turns kept locally so they stay on screen across turns. `createTime`
493
513
  // is captured once per turn so the bubble timestamp doesn't jitter on re-render.
494
- var _7 = useState({ user: '', agent: '', createTime: 0 }), liveCaption = _7[0], setLiveCaption = _7[1];
495
- var _8 = useState([]), liveTurns = _8[0], setLiveTurns = _8[1];
514
+ var _12 = useState({ user: '', agent: '', createTime: 0 }), liveCaption = _12[0], setLiveCaption = _12[1];
515
+ var _13 = useState([]), liveTurns = _13[0], setLiveTurns = _13[1];
496
516
  var liveVoice = useLiveVoiceSession({
497
517
  baseUrl: baseUrl,
498
518
  apiKey: apiKey,
@@ -605,7 +625,7 @@ export var GenAgentChat = function (_a) {
605
625
  h['x-tenant-id'] = tenant;
606
626
  return h;
607
627
  }, [apiKey, tenant, guestToken]);
608
- var _9 = useState(null), autoPlayAudioMessageId = _9[0], setAutoPlayAudioMessageId = _9[1];
628
+ var _14 = useState(null), autoPlayAudioMessageId = _14[0], setAutoPlayAudioMessageId = _14[1];
609
629
  var prevMessageCountRef = useRef(0);
610
630
  var initialLoadDoneRef = useRef(false);
611
631
  React.useEffect(function () {
@@ -670,6 +690,42 @@ export var GenAgentChat = function (_a) {
670
690
  }
671
691
  });
672
692
  }); };
693
+ var handleDismissQuickInput = function () {
694
+ setQuickInputDismissed(true);
695
+ try {
696
+ localStorage.setItem('genassist_quick_input_dismissed', '1');
697
+ }
698
+ catch ( /* ignore */_a) { /* ignore */ }
699
+ };
700
+ // Quick input next to the bubble: open the panel, start a conversation if needed, then send.
701
+ var handleQuickInputSend = function (text) { return __awaiter(void 0, void 0, void 0, function () {
702
+ var trimmed, error_9;
703
+ return __generator(this, function (_a) {
704
+ switch (_a.label) {
705
+ case 0:
706
+ trimmed = text.trim();
707
+ if (!trimmed)
708
+ return [2 /*return*/];
709
+ setIsFloatingOpen(true);
710
+ _a.label = 1;
711
+ case 1:
712
+ _a.trys.push([1, 5, , 6]);
713
+ if (!!conversationId) return [3 /*break*/, 3];
714
+ return [4 /*yield*/, startConversation(reCaptchaTokenRef.current)];
715
+ case 2:
716
+ _a.sent();
717
+ _a.label = 3;
718
+ case 3: return [4 /*yield*/, sendMessage(trimmed, [], undefined, reCaptchaTokenRef.current)];
719
+ case 4:
720
+ _a.sent();
721
+ return [3 /*break*/, 6];
722
+ case 5:
723
+ error_9 = _a.sent();
724
+ return [3 /*break*/, 6];
725
+ case 6: return [2 /*return*/];
726
+ }
727
+ });
728
+ }); };
673
729
  var handleMenuClick = function () {
674
730
  setShowMenu(function (prev) { return !prev; });
675
731
  };
@@ -721,10 +777,17 @@ export var GenAgentChat = function (_a) {
721
777
  // Computed styles
722
778
  var containerStyle = getContainerStyle({ isFullscreen: isFullscreen, isFloatingDocked: isFloatingDocked, windowWidth: windowWidth, t: themeParams });
723
779
  var headerStyle = getHeaderStyle(themeParams);
724
- var headerTitleStyle = getHeaderTitleStyle(fontFamily);
725
- var headerSubtitleStyle = getHeaderSubtitleStyle(fontFamily);
780
+ var headerPillTitleStyle = getHeaderPillTitleStyle(fontFamily);
781
+ var headerDescriptionTextStyle = getHeaderDescriptionTextStyle(fontFamily);
782
+ var headerDescription = ((_b = description !== null && description !== void 0 ? description : t('header.subtitle')) !== null && _b !== void 0 ? _b : '').trim();
783
+ var brandLogo = (_c = brandLogoUrl === null || brandLogoUrl === void 0 ? void 0 : brandLogoUrl.trim()) !== null && _c !== void 0 ? _c : '';
784
+ var hasBrandLogo = brandLogo.length > 0;
785
+ // Description reveal only applies to the small-logo layout; the full brand logo replaces the text.
786
+ var hasHeaderDescription = !hasBrandLogo && headerDescription.length > 0;
726
787
  var menuPopupStyle = getMenuPopupStyle(backgroundColor);
727
788
  var menuItemStyle = getMenuItemStyle(themeParams);
789
+ // Hover fill for menu items / outline buttons — theme-aware, matches the web app's bg-accent.
790
+ var menuHoverBg = (theme === null || theme === void 0 ? void 0 : theme.secondaryColor) || '#f4f4f5';
728
791
  var contentCardStyle = getContentCardStyle(backgroundColor);
729
792
  var sendButtonStyle = getSendButtonStyle(primaryColor);
730
793
  var possibleQueriesContainerStyle = getPossibleQueriesContainerStyle(fontFamily);
@@ -804,6 +867,7 @@ export var GenAgentChat = function (_a) {
804
867
  position: position,
805
868
  offsetX: offsetX,
806
869
  offsetY: offsetY,
870
+ isExpanded: isExpanded,
807
871
  });
808
872
  var renderLanguageSelector = function () {
809
873
  if (!SHOW_CHAT_LANGUAGE_SELECTOR) {
@@ -820,227 +884,239 @@ export var GenAgentChat = function (_a) {
820
884
  }
821
885
  return function (children) { return (_jsxs(GoogleReCaptchaProvider, { reCaptchaKey: reCaptchaKey || '', children: [_jsx(GoogleReCaptcha, { action: "genassist_chat", onVerify: handleReCaptchaVerify, refreshReCaptcha: false }), _jsx(_Fragment, { children: children })] })); };
822
886
  }, [reCaptchaKey, handleReCaptchaVerify]);
823
- var renderChatComponent = function () { return (_jsxs("div", { style: containerStyle, "data-genassist-root": "true", children: [_jsx("style", { children: CSS_KEYFRAMES }), _jsxs("div", { style: headerStyle, ref: headerRef, children: [_jsxs("div", { style: logoContainerStyle, children: [_jsx("img", { src: (logoUrl === null || logoUrl === void 0 ? void 0 : logoUrl.trim()) || chatLogo, alt: "Logo", style: logoStyle }), _jsxs("div", { style: headerTitleContainerStyle, children: [_jsx("div", { style: headerTitleStyle, children: headerTitle }), _jsx("div", { style: headerSubtitleStyle, children: description !== null && description !== void 0 ? description : t('header.subtitle') })] })] }), _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '8px' }, children: [_jsx("button", { style: menuButtonStyle, onClick: handleMenuClick, title: t('menu.title'), children: _jsx(MoreVertical, { size: 24, color: "#111111" }) }), mode === 'floating' && (_jsx("button", { style: menuButtonStyle, onClick: function () { return setIsFloatingOpen(false); }, title: "Close chat", children: _jsx(X, { size: 24, color: "#111111" }) }))] })] }), !noColorAnimation && showBacklight && (_jsx("div", { style: {
824
- position: 'absolute',
825
- left: 0,
826
- right: 0,
827
- top: Math.max(0, headerHeight - 14),
828
- height: 42,
829
- pointerEvents: 'none',
830
- zIndex: 1,
831
- opacity: isAgentTyping ? 1 : 0,
832
- transition: 'opacity 420ms ease-in-out',
833
- }, children: _jsx("div", { style: {
887
+ var renderChatComponent = function () {
888
+ var _a;
889
+ return (_jsxs("div", { style: __assign(__assign({}, containerStyle), (_a = {}, _a['--ga-hover'] = menuHoverBg, _a)), "data-genassist-root": "true", children: [_jsx("style", { children: CSS_KEYFRAMES }), _jsxs("div", { className: "ga-header", style: headerStyle, ref: headerRef, children: [_jsxs("div", { className: "ga-header-left", style: headerLeftContainerStyle, children: [mode === 'floating' && !isFullscreen && windowWidth > 768 && (_jsx("button", { className: "ga-header-btn ga-header-expand-btn", style: __assign(__assign({}, menuButtonStyle), { width: undefined, flexShrink: 0 }), onClick: handleExpandToggle, title: isExpanded ? t('menu.collapse', 'Collapse') : t('menu.expand', 'Expand'), "aria-label": isExpanded ? t('menu.collapse', 'Collapse') : t('menu.expand', 'Expand'), children: isExpanded ? (_jsx(Minimize2, { size: 20, color: "#111111" })) : (_jsx(Maximize2, { size: 20, color: "#111111" })) })), _jsx("div", { style: headerPillStyle, tabIndex: hasHeaderDescription ? 0 : undefined, children: hasBrandLogo ? (_jsx("img", { src: brandLogo, alt: headerTitle, style: brandLogoStyle })) : (_jsxs(_Fragment, { children: [_jsx("img", { src: (logoUrl === null || logoUrl === void 0 ? void 0 : logoUrl.trim()) || chatLogo, alt: "Logo", style: logoStyle }), _jsxs("div", { style: headerPillTextColumnStyle, children: [_jsx("span", { style: headerPillTitleStyle, title: headerTitle, children: headerTitle }), hasHeaderDescription && (_jsx("div", { className: "ga-header-desc", children: _jsx("div", { className: "ga-header-desc-inner", children: _jsx("span", { className: "ga-header-desc-text", style: __assign(__assign({}, headerDescriptionTextStyle), { display: 'block' }), children: headerDescription }) }) }))] })] })) })] }), _jsxs("div", { style: headerRightContainerStyle, children: [_jsx("button", { className: "ga-header-btn", style: menuButtonStyle, onClick: handleMenuClick, title: t('menu.title'), children: _jsx(MoreHorizontal, { size: 22, color: "#111111" }) }), mode === 'floating' && (_jsx("button", { className: "ga-header-btn", style: menuButtonStyle, onClick: function () { return setIsFloatingOpen(false); }, title: "Close chat", children: _jsx(X, { size: 22, color: "#111111" }) }))] })] }), !noColorAnimation && showBacklight && (_jsx("div", { style: {
834
890
  position: 'absolute',
835
891
  left: 0,
836
- top: 6,
837
- height: 32,
838
- width: '78%',
839
- filter: 'blur(22px)',
840
- background: "linear-gradient(90deg, ".concat(hexToRgba(primaryColor, 0.0), " 0%, ").concat(hexToRgba(primaryColor, 0.35), " 15%, ").concat(hexToRgba(primaryColor, 0.55), " 50%, ").concat(hexToRgba(primaryColor, 0.35), " 85%, ").concat(hexToRgba(primaryColor, 0.0), " 100%)"),
841
- willChange: 'transform, opacity',
842
- animation: 'ga-backlight-sweep2 1.2s cubic-bezier(0.4,0.0,0.2,1) infinite alternate, ga-backlight-pulse 2.4s ease-in-out infinite',
843
- borderRadius: 18,
844
- } }) })), showMenu && (_jsxs("div", { ref: menuRef, style: menuPopupStyle, children: [_jsxs("div", { style: menuItemStyle, onClick: handleResetClick, children: [_jsx(RefreshCw, { size: 16 }), t('menu.resetConversation')] }), mode !== 'fullscreen' && (_jsxs("div", { style: menuItemStyle, onClick: handleFullscreenToggle, children: [isFullscreen ? _jsx(Minimize2, { size: 16 }) : _jsx(Maximize2, { size: 16 }), t('menu.fullscreen')] })), hasLanguageOptions && (_jsxs("div", { style: __assign(__assign({}, menuItemStyle), { position: 'relative', borderBottom: 'none' }), onClick: function (e) {
845
- e.stopPropagation();
846
- setShowLanguageDropdown(!showLanguageDropdown);
847
- }, children: [_jsx(Globe, { size: 16 }), _jsx("span", { style: { flex: 1 }, children: t('menu.language') }), showLanguageDropdown && (_jsx("div", { style: {
848
- position: 'absolute',
849
- right: 0,
850
- top: '100%',
851
- marginTop: '4px',
852
- backgroundColor: backgroundColor,
853
- borderRadius: '8px',
854
- boxShadow: '0 2px 10px rgba(0, 0, 0, 0.1)',
855
- minWidth: '180px',
856
- maxWidth: '200px',
857
- overflow: 'hidden',
858
- zIndex: 1001,
859
- }, onClick: function (e) { return e.stopPropagation(); }, children: availableLanguages.map(function (lang, index) { return (_jsx("div", { style: {
860
- display: 'flex',
861
- alignItems: 'center',
862
- gap: '8px',
863
- padding: '10px 15px',
864
- color: textColor,
865
- backgroundColor: resolvedLanguage === lang.code
866
- ? ((theme === null || theme === void 0 ? void 0 : theme.secondaryColor) || '#f5f5f5')
867
- : 'transparent',
868
- borderBottom: index < availableLanguages.length - 1 ? '1px solid #f0f0f0' : 'none',
869
- cursor: 'pointer',
870
- fontSize: fontSize,
871
- fontFamily: fontFamily,
872
- transition: 'background-color 0.2s ease',
873
- }, onMouseEnter: function (e) {
874
- if (resolvedLanguage !== lang.code) {
875
- e.currentTarget.style.backgroundColor = (theme === null || theme === void 0 ? void 0 : theme.secondaryColor) || '#f5f5f5';
876
- }
877
- }, onMouseLeave: function (e) {
878
- if (resolvedLanguage !== lang.code) {
879
- e.currentTarget.style.backgroundColor = 'transparent';
880
- }
881
- }, onClick: function (e) {
882
- e.stopPropagation();
883
- handleLanguageChange(lang.code);
884
- setShowLanguageDropdown(false);
885
- setShowMenu(false);
886
- }, children: lang.name }, lang.code)); }) }))] }))] })), _jsxs("div", { style: contentCardStyle, children: [_jsxs("div", { style: chatContainerStyle, ref: chatContainerRef, children: [renderLanguageSelector(), (function () {
887
- var shouldShowSyntheticWelcome = showWelcomeBeforeStart &&
888
- !hasUserMessages &&
889
- (messages.length === 0 || messages[0].speaker !== 'agent') &&
890
- (Boolean(welcomeTitle) || Boolean(welcomeImageUrl) || Boolean(welcomeMessage))
891
- && conversationId;
892
- if (!shouldShowSyntheticWelcome)
893
- return null;
894
- var now = Math.floor(Date.now() / 1000);
895
- var syntheticWelcome = {
896
- create_time: now,
897
- start_time: 0,
898
- end_time: 0.01,
899
- speaker: 'agent',
900
- text: welcomeMessage || '',
901
- };
902
- return (_jsx(ChatMessageComponent, { message: syntheticWelcome, theme: theme, isFirstMessage: true, isNextSameSpeaker: false, isPrevSameSpeaker: false, enableTypewriter: false, welcomeImageUrl: welcomeImageUrl || undefined, welcomeTitle: welcomeTitle || undefined, possibleQueries: possibleQueries, onQuickQuery: handleQueryClick, onQuickAction: handleQuickAction, translations: translations, language: resolvedLanguage, agentName: agentName, isAgentTyping: isAgentTyping }, "__synthetic_welcome__"));
903
- })(), (function () {
904
- var firstAgentIndex = messages.findIndex(function (m) { return m.speaker === 'agent'; });
905
- // Live-voice turns are rendered locally (below) the moment they finish.
906
- // Each is also persisted and broadcast back into `messages`; suppress that
907
- // copy so a turn isn't shown twice (and never blinks as the two swap).
908
- var liveTurnKeys = new Set();
909
- for (var _i = 0, liveTurns_1 = liveTurns; _i < liveTurns_1.length; _i++) {
910
- var turn = liveTurns_1[_i];
911
- if (turn.user.trim())
912
- liveTurnKeys.add("customer:".concat(turn.user.trim()));
913
- if (turn.agent.trim())
914
- liveTurnKeys.add("agent:".concat(turn.agent.trim()));
915
- }
916
- var applyMessageFilter = function (message) {
917
- if (message.type === 'file')
918
- return false;
919
- if (liveTurnKeys.has("".concat(message.speaker, ":").concat((message.text || '').trim())))
920
- return false;
921
- return true;
922
- };
923
- return messages.filter(applyMessageFilter).map(function (message, index) {
924
- if (message.type === 'form_request' && message.speaker === 'agent') {
925
- try {
926
- var formSchema = localizeForm(JSON.parse(message.text));
927
- // Use the real message position (filtering can shift the map index) so the
928
- // answered check matches the overlay/footer path and survives reload.
929
- var originalIndex_1 = messages.indexOf(message);
930
- var isPending = !isFormAnswered(originalIndex_1);
931
- return (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', maxWidth: '85%', marginBottom: '8px' }, children: [_jsx("div", { style: { fontSize: '14px', color: '#000000', fontWeight: 600, marginBottom: 4 }, children: agentName || 'Agent' }), formDisplay === 'inline' && isPending ? (_jsx(DynamicFormMessage, { schema: formSchema, onSubmit: function (data) { return handleFormSubmit(data, originalIndex_1); }, onCancel: function () { return handleFormCancel(originalIndex_1); }, isSubmitting: submittingFormIndex === originalIndex_1, isSubmitted: false, primaryColor: primaryColor, fontFamily: fontFamily, variant: "card" })) : (_jsx("div", { style: {
932
- backgroundColor: '#f3f4f6',
933
- borderRadius: '12px',
934
- padding: '10px 14px',
935
- fontSize: '14px',
936
- color: '#374151',
937
- fontFamily: fontFamily,
938
- }, children: formSchema.message || 'Please fill the form below.' }))] }, index));
939
- }
940
- catch (_a) {
941
- // Fall through to normal rendering if JSON parse fails
942
- }
892
+ right: 0,
893
+ top: Math.max(0, headerHeight - 14),
894
+ height: 42,
895
+ pointerEvents: 'none',
896
+ zIndex: 1,
897
+ opacity: isAgentTyping ? 1 : 0,
898
+ transition: 'opacity 420ms ease-in-out',
899
+ }, children: _jsx("div", { style: {
900
+ position: 'absolute',
901
+ left: 0,
902
+ top: 6,
903
+ height: 32,
904
+ width: '78%',
905
+ filter: 'blur(22px)',
906
+ background: "linear-gradient(90deg, ".concat(hexToRgba(primaryColor, 0.0), " 0%, ").concat(hexToRgba(primaryColor, 0.35), " 15%, ").concat(hexToRgba(primaryColor, 0.55), " 50%, ").concat(hexToRgba(primaryColor, 0.35), " 85%, ").concat(hexToRgba(primaryColor, 0.0), " 100%)"),
907
+ willChange: 'transform, opacity',
908
+ animation: 'ga-backlight-sweep2 1.2s cubic-bezier(0.4,0.0,0.2,1) infinite alternate, ga-backlight-pulse 2.4s ease-in-out infinite',
909
+ borderRadius: 18,
910
+ } }) })), showMenu && (_jsxs("div", { ref: menuRef, style: menuPopupStyle, children: [_jsxs("div", { className: "ga-menu-item", style: menuItemStyle, onClick: handleResetClick, children: [_jsx(RefreshCw, { size: 16 }), t('menu.resetConversation')] }), mode !== 'fullscreen' && (_jsxs("div", { className: "ga-menu-item", style: menuItemStyle, onClick: handleFullscreenToggle, children: [_jsx(Fullscreen, { size: 16 }), t('menu.fullscreen')] })), hasLanguageOptions && (_jsxs("div", { className: "ga-menu-item", style: __assign(__assign({}, menuItemStyle), { position: 'relative' }), onClick: function (e) {
911
+ e.stopPropagation();
912
+ setShowLanguageDropdown(!showLanguageDropdown);
913
+ }, children: [_jsx(Globe, { size: 16 }), _jsx("span", { style: { flex: 1 }, children: t('menu.language') }), showLanguageDropdown && (_jsx("div", { style: {
914
+ position: 'absolute',
915
+ right: 0,
916
+ top: '100%',
917
+ marginTop: '4px',
918
+ backgroundColor: backgroundColor,
919
+ borderRadius: '10px',
920
+ border: '1px solid #e4e4e7',
921
+ boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1)',
922
+ padding: '4px',
923
+ minWidth: '180px',
924
+ maxWidth: '200px',
925
+ overflow: 'hidden',
926
+ zIndex: 1001,
927
+ }, onClick: function (e) { return e.stopPropagation(); }, children: availableLanguages.map(function (lang) { return (_jsx("div", { style: {
928
+ display: 'flex',
929
+ alignItems: 'center',
930
+ gap: '8px',
931
+ padding: '6px 8px',
932
+ borderRadius: '8px',
933
+ color: textColor,
934
+ backgroundColor: resolvedLanguage === lang.code
935
+ ? menuHoverBg
936
+ : 'transparent',
937
+ cursor: 'pointer',
938
+ fontSize: fontSize,
939
+ fontFamily: fontFamily,
940
+ transition: 'background-color 0.15s ease',
941
+ }, onMouseEnter: function (e) {
942
+ if (resolvedLanguage !== lang.code) {
943
+ e.currentTarget.style.backgroundColor = menuHoverBg;
944
+ }
945
+ }, onMouseLeave: function (e) {
946
+ if (resolvedLanguage !== lang.code) {
947
+ e.currentTarget.style.backgroundColor = 'transparent';
948
+ }
949
+ }, onClick: function (e) {
950
+ e.stopPropagation();
951
+ handleLanguageChange(lang.code);
952
+ setShowLanguageDropdown(false);
953
+ setShowMenu(false);
954
+ }, children: lang.name }, lang.code)); }) }))] }))] })), _jsxs("div", { style: contentCardStyle, children: [_jsxs("div", { style: chatContainerStyle, ref: chatContainerRef, children: [renderLanguageSelector(), (function () {
955
+ var shouldShowSyntheticWelcome = showWelcomeBeforeStart &&
956
+ !hasUserMessages &&
957
+ (messages.length === 0 || messages[0].speaker !== 'agent') &&
958
+ (Boolean(welcomeTitle) || Boolean(welcomeImageUrl) || Boolean(welcomeMessage))
959
+ && conversationId;
960
+ if (!shouldShowSyntheticWelcome)
961
+ return null;
962
+ var now = Math.floor(Date.now() / 1000);
963
+ var syntheticWelcome = {
964
+ create_time: now,
965
+ start_time: 0,
966
+ end_time: 0.01,
967
+ speaker: 'agent',
968
+ text: welcomeMessage || '',
969
+ };
970
+ return (_jsx(ChatMessageComponent, { message: syntheticWelcome, theme: theme, isFirstMessage: true, isNextSameSpeaker: false, isPrevSameSpeaker: false, enableTypewriter: false, welcomeImageUrl: welcomeImageUrl || undefined, welcomeTitle: welcomeTitle || undefined, possibleQueries: possibleQueries, onQuickQuery: handleQueryClick, onQuickAction: handleQuickAction, translations: translations, language: resolvedLanguage, agentName: agentName, isAgentTyping: isAgentTyping }, "__synthetic_welcome__"));
971
+ })(), (function () {
972
+ var firstAgentIndex = messages.findIndex(function (m) { return m.speaker === 'agent'; });
973
+ // Live-voice turns are rendered locally (below) the moment they finish.
974
+ // Each is also persisted and broadcast back into `messages`; suppress that
975
+ // copy so a turn isn't shown twice (and never blinks as the two swap).
976
+ var liveTurnKeys = new Set();
977
+ for (var _i = 0, liveTurns_1 = liveTurns; _i < liveTurns_1.length; _i++) {
978
+ var turn = liveTurns_1[_i];
979
+ if (turn.user.trim())
980
+ liveTurnKeys.add("customer:".concat(turn.user.trim()));
981
+ if (turn.agent.trim())
982
+ liveTurnKeys.add("agent:".concat(turn.agent.trim()));
943
983
  }
944
- var isNextSameSpeaker = index < messages.length - 1 && messages[index + 1].speaker === message.speaker;
945
- var isPrevSameSpeaker = index > 0 && messages[index - 1].speaker === message.speaker;
946
- // When the agent greets on start, that greeting is a normal reply — not the
947
- // "welcome" message so don't give it the first-message welcome treatment
948
- // (which would split its text into a big title + body).
949
- var isFirstAgentMessage = index === firstAgentIndex && message.speaker === 'agent' && !hasUserMessages && !shouldTriggerStartForm;
950
- var displayMessage = isFirstAgentMessage && welcomeMessage
951
- ? __assign(__assign({}, message), { text: welcomeMessage }) : message;
952
- return (_jsx(ChatMessageComponent, { message: displayMessage, theme: theme, onPlayAudio: message.speaker === 'agent' ? playResponseAudio : undefined, isPlayingAudio: isPlayingAudio, isFirstMessage: isFirstAgentMessage, isNextSameSpeaker: isNextSameSpeaker, isPrevSameSpeaker: isPrevSameSpeaker, onFeedback: function (messageId, value) { return addFeedback(messageId, value); }, enableTypewriter: index === messages.length - 1 && message.speaker === 'agent', welcomeImageUrl: isFirstAgentMessage ? (welcomeImageUrl || undefined) : undefined, welcomeTitle: isFirstAgentMessage ? (welcomeTitle || undefined) : undefined, possibleQueries: isFirstAgentMessage ? possibleQueries : undefined, onQuickQuery: handleQueryClick, onQuickAction: handleQuickAction, onScheduleConfirm: handleScheduleConfirm, isLastMessage: index === messages.length - 1 && message.speaker === 'agent', translations: translations, language: resolvedLanguage, agentName: agentName, isAgentTyping: isAgentTyping, audioUrlBuilder: message.type === 'audio' && useAudio ? audioUrlBuilder : undefined, audioHeaders: message.type === 'audio' && useAudio ? audioHeaders : undefined, autoPlayAudioMessageId: autoPlayAudioMessageId }, index));
953
- });
954
- })(), isAgentTyping && currentThinkingParts.length > 0 && (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', maxWidth: '80%' }, children: [_jsx("div", { style: { fontSize: '14px', color: '#000000', fontWeight: 600, marginBottom: 4 }, children: agentName || t('labels.agent') }), _jsx("div", { style: {
955
- backgroundColor: 'transparent',
956
- padding: 0,
957
- borderRadius: 0,
958
- maxWidth: '100%',
959
- }, children: _jsx("div", { style: {
960
- animation: 'ga-think-change 220ms ease',
961
- willChange: 'transform, opacity',
962
- color: '#6b7280',
963
- fontSize: '13px',
964
- }, children: currentThinkingParts[currentThinkingPartIndex] || currentThinkingParts[currentThinkingParts.length - 1] }, "".concat(currentThinkingPartIndex, "-").concat(currentThinkingParts.join('|'))) })] })), liveTurns.map(function (turn, i) { return (_jsxs(React.Fragment, { children: [turn.user.trim() !== '' && renderLiveBubble('customer', turn.user, turn.createTime), turn.agent.trim() !== '' && renderLiveBubble('agent', turn.agent, turn.createTime)] }, "live-turn-".concat(i))); }), liveVoice.isActive && liveCaption.user.trim() !== '' &&
965
- renderLiveBubble('customer', liveCaption.user, liveCaption.createTime, '__live_caption_user__'), liveVoice.isActive && liveCaption.agent.trim() !== '' &&
966
- renderLiveBubble('agent', liveCaption.agent, liveCaption.createTime, '__live_caption_agent__'), _jsx("div", { ref: messagesEndRef })] }), showWelcomeBeforeStart && (function () {
967
- var showingSyntheticWelcome = !hasUserMessages &&
968
- (messages.length === 0 || messages[0].speaker !== 'agent') &&
969
- (Boolean(welcomeTitle) || Boolean(welcomeImageUrl) || Boolean(welcomeMessage));
970
- return (possibleQueries.length > 0 &&
971
- !hasUserMessages &&
972
- (messages.length === 0 || messages[0].speaker !== 'agent') &&
973
- !showingSyntheticWelcome);
974
- })() && (_jsx("div", { style: possibleQueriesContainerStyle, children: possibleQueries.map(function (query, index) { return (_jsx("button", { style: queryButtonStyle, onClick: function () { return handleQueryClick(query); }, disabled: isLoading || isAgentTyping, children: query }, index)); }) })), fileErrorToast && (_jsxs("div", { style: {
975
- margin: '0 16px 8px',
976
- padding: '10px 14px',
977
- backgroundColor: '#FFF3E0',
978
- color: '#E65100',
979
- borderRadius: '12px',
980
- fontSize: fontSize,
981
- fontFamily: fontFamily,
982
- display: 'flex',
983
- alignItems: 'center',
984
- gap: '8px',
985
- flexShrink: 0,
986
- }, role: "alert", children: [_jsx(AlertCircle, { size: 18, style: { flexShrink: 0 } }), _jsx("span", { children: fileErrorToast })] })), liveVoiceNotice && (_jsxs("div", { style: {
987
- margin: '0 16px 8px',
988
- padding: '10px 14px',
989
- backgroundColor: '#FFF3E0',
990
- color: '#E65100',
991
- borderRadius: '12px',
992
- fontSize: fontSize,
993
- fontFamily: fontFamily,
994
- display: 'flex',
995
- alignItems: 'center',
996
- gap: '8px',
997
- flexShrink: 0,
998
- }, role: "alert", children: [_jsx(AlertCircle, { size: 18, style: { flexShrink: 0 } }), _jsx("span", { children: liveVoiceNotice })] })), useFile && attachments.length > 0 && (_jsx("div", { style: { padding: '0 16px', marginBottom: '8px', display: 'flex', gap: '8px', flexWrap: 'wrap' }, children: attachments.map(function (att, index) { return (_jsx(AttachmentPreview, { file: att.file, onRemove: function () { return handleRemoveAttachment(att.file.name); }, uploading: uploadingFiles.has(att.file.name) }, index)); }) })), !conversationId || isFinalized ? (_jsx("div", { style: inputContainerStyle, children: _jsx("button", { type: "button", style: __assign(__assign({}, sendButtonStyle), { width: '100%', height: '48px', borderRadius: '16px', cursor: 'pointer', fontFamily: fontFamily, fontSize: fontSize }), onClick: handleStartConversation, disabled: isLoading, children: t('buttons.startConversation') }) })) : liveVoiceEnabled ? (
999
- // Live voice mode is voice-only: no text box, attach, or send button —
1000
- // the only way to talk to the agent is to start a live call.
1001
- _jsx("div", { style: inputContainerStyle, children: _jsxs("div", { style: { display: 'flex', flexDirection: 'column', width: '100%', minWidth: 0 }, children: [_jsxs("div", { style: inputWrapperStyle, children: [_jsx("span", { style: getLiveVoiceHintStyle(textAreaFontSize, fontFamily), children: liveVoiceReady
1002
- ? t('liveVoice.tapToStart', 'Tap to start a voice conversation')
1003
- : t('liveVoice.unavailable', 'Voice is currently unavailable') }), _jsx(LiveCallControl, { status: liveVoice.status, isActive: liveVoice.isActive, onStart: startLiveCall, onStop: endLiveCall, theme: theme, disabled: !agentId || !liveVoiceReady })] }), agentDisclaimerContent && (_jsx("div", { className: "ga-input-disclaimer", style: disclaimerStyle, children: agentDisclaimerContent }))] }) })) : (_jsx("form", { onSubmit: handleSubmit, style: inputContainerStyle, children: _jsxs("div", { style: { display: 'flex', flexDirection: 'column', width: '100%', minWidth: 0 }, children: [_jsxs("div", { style: inputWrapperStyle, children: [useFile && (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", style: attachButtonStyle, title: "Attach", onClick: function () { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, children: _jsx(Paperclip, { size: 22, color: "#757575" }) }), _jsx("input", { type: "file", multiple: true, ref: fileInputRef, style: { display: 'none' }, onChange: handleFileChange, accept: allowedExtensions.join(',') || '*/*' })] })), _jsx("textarea", { ref: textAreaRef, style: textAreaStyle, className: "ga-textarea-nosb", value: inputValue, onChange: function (e) { return setInputValue(e.target.value); }, onKeyDown: function (e) {
1004
- if (e.key === 'Enter' && !e.shiftKey) {
1005
- e.preventDefault();
1006
- if ((inputValue.trim() !== '' || attachments.length > 0) && !isAgentTyping && !hasPendingForm) {
1007
- submitMessage();
1008
- }
1009
- }
1010
- }, placeholder: inputPlaceholder, disabled: !conversationId || isFinalized || hasPendingForm, rows: 1 }), _jsx("div", { style: rightActionContainerStyle, children: !(useAudio && inputValue.trim() === '' && attachments.length === 0) && (_jsx("button", { type: "submit", style: __assign(__assign({}, sendButtonStyle), (isSendDisabled ? sendButtonDisabledStyle : {})), disabled: isSendDisabled, children: _jsx(ArrowUp, { size: 18, strokeWidth: 3, color: "#ffffff" }) })) }), useAudio && inputValue.trim() === '' && attachments.length === 0 && (_jsx(VoiceInput, { onAudioReady: function (blob, format) { return __awaiter(void 0, void 0, void 0, function () {
1011
- var _a;
1012
- return __generator(this, function (_b) {
1013
- switch (_b.label) {
1014
- case 0:
1015
- _b.trys.push([0, 2, 3, 4]);
1016
- setIsPlayingAudio(true);
1017
- return [4 /*yield*/, sendAudioMessage(blob, format)];
1018
- case 1:
1019
- _b.sent();
1020
- return [3 /*break*/, 4];
1021
- case 2:
1022
- _a = _b.sent();
1023
- return [3 /*break*/, 4];
1024
- case 3:
1025
- setIsPlayingAudio(false);
1026
- return [7 /*endfinally*/];
1027
- case 4: return [2 /*return*/];
984
+ var applyMessageFilter = function (message) {
985
+ if (message.type === 'file')
986
+ return false;
987
+ if (liveTurnKeys.has("".concat(message.speaker, ":").concat((message.text || '').trim())))
988
+ return false;
989
+ return true;
990
+ };
991
+ return messages.filter(applyMessageFilter).map(function (message, index) {
992
+ if (message.type === 'form_request' && message.speaker === 'agent') {
993
+ try {
994
+ var formSchema = localizeForm(JSON.parse(message.text));
995
+ // Use the real message position (filtering can shift the map index) so the
996
+ // answered check matches the overlay/footer path and survives reload.
997
+ var originalIndex_1 = messages.indexOf(message);
998
+ var isPending = !isFormAnswered(originalIndex_1);
999
+ return (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', maxWidth: '85%', marginBottom: '8px' }, children: [_jsx("div", { style: { fontSize: '14px', color: '#000000', fontWeight: 600, marginBottom: 4 }, children: agentName || 'Agent' }), formDisplay === 'inline' && isPending ? (_jsx(DynamicFormMessage, { schema: formSchema, onSubmit: function (data) { return handleFormSubmit(data, originalIndex_1); }, onCancel: function () { return handleFormCancel(originalIndex_1); }, isSubmitting: submittingFormIndex === originalIndex_1, isSubmitted: false, primaryColor: primaryColor, fontFamily: fontFamily, variant: "card" })) : (_jsx("div", { style: {
1000
+ backgroundColor: '#f3f4f6',
1001
+ borderRadius: '12px',
1002
+ padding: '10px 14px',
1003
+ fontSize: '14px',
1004
+ color: '#374151',
1005
+ fontFamily: fontFamily,
1006
+ }, children: formSchema.message || 'Please fill the form below.' }))] }, index));
1007
+ }
1008
+ catch (_a) {
1009
+ // Fall through to normal rendering if JSON parse fails
1010
+ }
1011
+ }
1012
+ var isNextSameSpeaker = index < messages.length - 1 && messages[index + 1].speaker === message.speaker;
1013
+ var isPrevSameSpeaker = index > 0 && messages[index - 1].speaker === message.speaker;
1014
+ // When the agent greets on start, that greeting is a normal reply not the
1015
+ // "welcome" message — so don't give it the first-message welcome treatment
1016
+ // (which would split its text into a big title + body).
1017
+ var isFirstAgentMessage = index === firstAgentIndex && message.speaker === 'agent' && !hasUserMessages && !shouldTriggerStartForm;
1018
+ var displayMessage = isFirstAgentMessage && welcomeMessage
1019
+ ? __assign(__assign({}, message), { text: welcomeMessage }) : message;
1020
+ return (_jsx(ChatMessageComponent, { message: displayMessage, theme: theme, onPlayAudio: message.speaker === 'agent' ? playResponseAudio : undefined, isPlayingAudio: isPlayingAudio, isFirstMessage: isFirstAgentMessage, isNextSameSpeaker: isNextSameSpeaker, isPrevSameSpeaker: isPrevSameSpeaker, onFeedback: function (messageId, value) { return addFeedback(messageId, value); }, enableTypewriter: index === messages.length - 1 && message.speaker === 'agent', welcomeImageUrl: isFirstAgentMessage ? (welcomeImageUrl || undefined) : undefined, welcomeTitle: isFirstAgentMessage ? (welcomeTitle || undefined) : undefined, possibleQueries: isFirstAgentMessage ? possibleQueries : undefined, onQuickQuery: handleQueryClick, onQuickAction: handleQuickAction, onScheduleConfirm: handleScheduleConfirm, isLastMessage: index === messages.length - 1 && message.speaker === 'agent', translations: translations, language: resolvedLanguage, agentName: agentName, isAgentTyping: isAgentTyping, audioUrlBuilder: message.type === 'audio' && useAudio ? audioUrlBuilder : undefined, audioHeaders: message.type === 'audio' && useAudio ? audioHeaders : undefined, autoPlayAudioMessageId: autoPlayAudioMessageId }, index));
1021
+ });
1022
+ })(), isAgentTyping && currentThinkingParts.length > 0 && (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', maxWidth: '80%' }, children: [_jsx("div", { style: { fontSize: '14px', color: '#000000', fontWeight: 600, marginBottom: 4 }, children: agentName || t('labels.agent') }), _jsx("div", { style: {
1023
+ backgroundColor: 'transparent',
1024
+ padding: 0,
1025
+ borderRadius: 0,
1026
+ maxWidth: '100%',
1027
+ }, children: _jsx("div", { style: {
1028
+ animation: 'ga-think-change 220ms ease',
1029
+ willChange: 'transform, opacity',
1030
+ color: '#6b7280',
1031
+ fontSize: '13px',
1032
+ }, children: currentThinkingParts[currentThinkingPartIndex] || currentThinkingParts[currentThinkingParts.length - 1] }, "".concat(currentThinkingPartIndex, "-").concat(currentThinkingParts.join('|'))) })] })), liveTurns.map(function (turn, i) { return (_jsxs(React.Fragment, { children: [turn.user.trim() !== '' && renderLiveBubble('customer', turn.user, turn.createTime), turn.agent.trim() !== '' && renderLiveBubble('agent', turn.agent, turn.createTime)] }, "live-turn-".concat(i))); }), liveVoice.isActive && liveCaption.user.trim() !== '' &&
1033
+ renderLiveBubble('customer', liveCaption.user, liveCaption.createTime, '__live_caption_user__'), liveVoice.isActive && liveCaption.agent.trim() !== '' &&
1034
+ renderLiveBubble('agent', liveCaption.agent, liveCaption.createTime, '__live_caption_agent__'), _jsx("div", { ref: messagesEndRef })] }), showWelcomeBeforeStart && (function () {
1035
+ var showingSyntheticWelcome = !hasUserMessages &&
1036
+ (messages.length === 0 || messages[0].speaker !== 'agent') &&
1037
+ (Boolean(welcomeTitle) || Boolean(welcomeImageUrl) || Boolean(welcomeMessage));
1038
+ return (possibleQueries.length > 0 &&
1039
+ !hasUserMessages &&
1040
+ (messages.length === 0 || messages[0].speaker !== 'agent') &&
1041
+ !showingSyntheticWelcome);
1042
+ })() && (_jsx("div", { style: possibleQueriesContainerStyle, children: possibleQueries.map(function (query, index) { return (_jsx("button", { style: queryButtonStyle, onClick: function () { return handleQueryClick(query); }, disabled: isLoading || isAgentTyping, children: query }, index)); }) })), fileErrorToast && (_jsxs("div", { style: {
1043
+ margin: '0 16px 8px',
1044
+ padding: '10px 14px',
1045
+ backgroundColor: '#FFF3E0',
1046
+ color: '#E65100',
1047
+ borderRadius: '12px',
1048
+ fontSize: fontSize,
1049
+ fontFamily: fontFamily,
1050
+ display: 'flex',
1051
+ alignItems: 'center',
1052
+ gap: '8px',
1053
+ flexShrink: 0,
1054
+ }, role: "alert", children: [_jsx(AlertCircle, { size: 18, style: { flexShrink: 0 } }), _jsx("span", { children: fileErrorToast })] })), liveVoiceNotice && (_jsxs("div", { style: {
1055
+ margin: '0 16px 8px',
1056
+ padding: '10px 14px',
1057
+ backgroundColor: '#FFF3E0',
1058
+ color: '#E65100',
1059
+ borderRadius: '12px',
1060
+ fontSize: fontSize,
1061
+ fontFamily: fontFamily,
1062
+ display: 'flex',
1063
+ alignItems: 'center',
1064
+ gap: '8px',
1065
+ flexShrink: 0,
1066
+ }, role: "alert", children: [_jsx(AlertCircle, { size: 18, style: { flexShrink: 0 } }), _jsx("span", { children: liveVoiceNotice })] })), useFile && attachments.length > 0 && (_jsx("div", { style: { padding: '0 16px', marginBottom: '8px', display: 'flex', gap: '8px', flexWrap: 'wrap' }, children: attachments.map(function (att, index) { return (_jsx(AttachmentPreview, { file: att.file, onRemove: function () { return handleRemoveAttachment(att.file.name); }, uploading: uploadingFiles.has(att.file.name) }, index)); }) })), !conversationId || isFinalized ? (_jsx("div", { style: inputContainerStyle, children: _jsx("button", { type: "button", style: __assign(__assign({}, sendButtonStyle), { width: '100%', height: '48px', borderRadius: '16px', cursor: 'pointer', fontFamily: fontFamily, fontSize: fontSize }), onClick: handleStartConversation, disabled: isLoading, children: t('buttons.startConversation') }) })) : liveVoiceEnabled ? (
1067
+ // Live voice mode is voice-only: no text box, attach, or send button —
1068
+ // the only way to talk to the agent is to start a live call.
1069
+ _jsx("div", { style: inputContainerStyle, children: _jsxs("div", { style: { display: 'flex', flexDirection: 'column', width: '100%', minWidth: 0 }, children: [_jsxs("div", { style: inputWrapperStyle, children: [_jsx("span", { style: getLiveVoiceHintStyle(textAreaFontSize, fontFamily), children: liveVoiceReady
1070
+ ? t('liveVoice.tapToStart', 'Tap to start a voice conversation')
1071
+ : t('liveVoice.unavailable', 'Voice is currently unavailable') }), _jsx(LiveCallControl, { status: liveVoice.status, isActive: liveVoice.isActive, onStart: startLiveCall, onStop: endLiveCall, theme: theme, disabled: !agentId || !liveVoiceReady })] }), agentDisclaimerContent && (_jsx("div", { className: "ga-input-disclaimer", style: disclaimerStyle, children: agentDisclaimerContent }))] }) })) : (_jsx("form", { onSubmit: handleSubmit, style: inputContainerStyle, children: _jsxs("div", { style: { display: 'flex', flexDirection: 'column', width: '100%', minWidth: 0 }, children: [_jsxs("div", { style: inputWrapperStyle, children: [useFile && (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", style: attachButtonStyle, title: "Attach", onClick: function () { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, children: _jsx(Paperclip, { size: 22, color: "#757575" }) }), _jsx("input", { type: "file", multiple: true, ref: fileInputRef, style: { display: 'none' }, onChange: handleFileChange, accept: allowedExtensions.join(',') || '*/*' })] })), _jsx("textarea", { ref: textAreaRef, style: textAreaStyle, className: "ga-textarea-nosb", value: inputValue, onChange: function (e) { return setInputValue(e.target.value); }, onKeyDown: function (e) {
1072
+ if (e.key === 'Enter' && !e.shiftKey) {
1073
+ e.preventDefault();
1074
+ if ((inputValue.trim() !== '' || attachments.length > 0) && !isAgentTyping && !hasPendingForm) {
1075
+ submitMessage();
1076
+ }
1028
1077
  }
1029
- });
1030
- }); }, onError: handleVoiceError, theme: theme }))] }), agentDisclaimerContent && (_jsx("div", { className: "ga-input-disclaimer", style: disclaimerStyle, children: agentDisclaimerContent }))] }) })), pendingForm && formDisplay !== 'inline' && (_jsx("div", { style: {
1031
- position: 'absolute',
1032
- inset: 0,
1033
- zIndex: 30,
1034
- display: 'flex',
1035
- flexDirection: 'column',
1036
- backgroundColor: backgroundColor || '#ffffff',
1037
- }, children: _jsx(DynamicFormMessage, { schema: pendingForm.schema, onSubmit: function (data) { return handleFormSubmit(data, pendingForm.index); }, onCancel: function () { return handleFormCancel(pendingForm.index); }, isSubmitting: submittingFormIndex === pendingForm.index, isSubmitted: false, primaryColor: primaryColor, fontFamily: fontFamily, variant: "fullscreen", title: agentName || undefined }) }))] }), _jsx("div", { style: confirmOverlayStyle, children: _jsxs("div", { style: confirmDialogStyle, children: [_jsx("h3", { style: { fontFamily: fontFamily, marginTop: 0 }, children: t('dialog.resetConversation.title') }), _jsx("p", { style: { fontFamily: fontFamily, fontSize: fontSize }, children: t('dialog.resetConversation.message') }), _jsxs("div", { style: confirmButtonsStyle, children: [_jsx("button", { style: __assign(__assign({}, getConfirmButtonStyle(false, themeParams)), { color: textColor }), onClick: handleCancelReset, children: t('buttons.cancel') }), _jsx("button", { style: getConfirmButtonStyle(true, themeParams), onClick: handleConfirmReset, children: t('buttons.reset') })] })] }) })] })); };
1078
+ }, placeholder: inputPlaceholder, disabled: !conversationId || isFinalized || hasPendingForm, rows: 1 }), _jsx("div", { style: rightActionContainerStyle, children: !(useAudio && inputValue.trim() === '' && attachments.length === 0) && (_jsx("button", { type: "submit", style: __assign(__assign({}, sendButtonStyle), (isSendDisabled ? sendButtonDisabledStyle : {})), disabled: isSendDisabled, children: _jsx(ArrowUp, { size: 18, strokeWidth: 3, color: "#ffffff" }) })) }), useAudio && inputValue.trim() === '' && attachments.length === 0 && (_jsx(VoiceInput, { onAudioReady: function (blob, format) { return __awaiter(void 0, void 0, void 0, function () {
1079
+ var _a;
1080
+ return __generator(this, function (_b) {
1081
+ switch (_b.label) {
1082
+ case 0:
1083
+ _b.trys.push([0, 2, 3, 4]);
1084
+ setIsPlayingAudio(true);
1085
+ return [4 /*yield*/, sendAudioMessage(blob, format)];
1086
+ case 1:
1087
+ _b.sent();
1088
+ return [3 /*break*/, 4];
1089
+ case 2:
1090
+ _a = _b.sent();
1091
+ return [3 /*break*/, 4];
1092
+ case 3:
1093
+ setIsPlayingAudio(false);
1094
+ return [7 /*endfinally*/];
1095
+ case 4: return [2 /*return*/];
1096
+ }
1097
+ });
1098
+ }); }, onError: handleVoiceError, theme: theme }))] }), agentDisclaimerContent && (_jsx("div", { className: "ga-input-disclaimer", style: disclaimerStyle, children: agentDisclaimerContent }))] }) })), pendingForm && formDisplay !== 'inline' && (_jsx("div", { style: {
1099
+ position: 'absolute',
1100
+ inset: 0,
1101
+ zIndex: 30,
1102
+ display: 'flex',
1103
+ flexDirection: 'column',
1104
+ backgroundColor: backgroundColor || '#ffffff',
1105
+ }, children: _jsx(DynamicFormMessage, { schema: pendingForm.schema, onSubmit: function (data) { return handleFormSubmit(data, pendingForm.index); }, onCancel: function () { return handleFormCancel(pendingForm.index); }, isSubmitting: submittingFormIndex === pendingForm.index, isSubmitted: false, primaryColor: primaryColor, fontFamily: fontFamily, variant: "fullscreen", title: agentName || undefined }) }))] }), _jsx("div", { style: confirmOverlayStyle, children: _jsxs("div", { style: confirmDialogStyle, children: [_jsx("h3", { style: { fontFamily: fontFamily, margin: 0, fontSize: '18px', fontWeight: 600 }, children: t('dialog.resetConversation.title') }), _jsx("p", { style: { fontFamily: fontFamily, fontSize: '14px', color: '#71717a', margin: '8px 0 0' }, children: t('dialog.resetConversation.message') }), _jsxs("div", { style: confirmButtonsStyle, children: [_jsx("button", { className: "ga-confirm-btn--cancel", style: __assign(__assign({}, getConfirmButtonStyle(false, themeParams)), { color: textColor }), onClick: handleCancelReset, children: t('buttons.cancel') }), _jsx("button", { className: "ga-confirm-btn--danger", style: getConfirmButtonStyle(true, themeParams), onClick: handleConfirmReset, children: t('buttons.reset') })] })] }) })] }));
1106
+ };
1038
1107
  if (mode === 'floating') {
1039
- return (_jsxs(_Fragment, { children: [!isFloatingOpen && (_jsx(ChatBubble, { showChat: isFloatingOpen, onClick: function () { return setIsFloatingOpen(function (prev) { return !prev; }); }, primaryColor: primaryColor, style: getPositionStyles({ position: position, offsetX: offsetX, offsetY: offsetY }), chatBubbleIcon: theme === null || theme === void 0 ? void 0 : theme.chatBubbleIcon })), isFloatingOpen && (_jsx("div", { style: floatingContainerStyle, "data-genassist-container": "floating", children: renderWithReCaptcha(renderChatComponent()) }))] }));
1108
+ var isPanelClosing_1 = isPanelMounted && !isFloatingOpen;
1109
+ return (_jsxs(_Fragment, { children: [_jsx("style", { children: CSS_KEYFRAMES }), !isPanelMounted && (_jsx(BubbleDock, { primaryColor: primaryColor, position: position, offsetX: offsetX, offsetY: offsetY, windowWidth: windowWidth, placeholder: inputPlaceholder, fontFamily: fontFamily, fontSize: fontSize, chatBubbleIcon: theme === null || theme === void 0 ? void 0 : theme.chatBubbleIcon, showQuickInput: quickInput && !quickInputDismissed && Boolean(conversationId) && !isFinalized, onOpen: function () { return setIsFloatingOpen(true); }, onSend: handleQuickInputSend, onDismissQuickInput: handleDismissQuickInput })), isPanelMounted && (_jsx("div", { style: floatingContainerStyle, className: isPanelClosing_1 ? 'ga-widget-out' : 'ga-widget-in', onAnimationEnd: function (e) {
1110
+ // Ignore bubbled child animations; only react to the panel's own close.
1111
+ if (e.target !== e.currentTarget)
1112
+ return;
1113
+ if (isPanelClosing_1)
1114
+ setIsPanelMounted(false);
1115
+ }, "data-genassist-container": "floating", children: renderWithReCaptcha(renderChatComponent()) }))] }));
1040
1116
  }
1041
1117
  if (mode === 'fullscreen') {
1042
1118
  return (_jsx("div", { style: floatingContainerStyle, "data-genassist-container": "fullscreen", children: renderWithReCaptcha(renderChatComponent()) }));
1043
1119
  }
1044
1120
  return renderWithReCaptcha(renderChatComponent());
1045
1121
  };
1046
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2VuQWdlbnRDaGF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvR2VuQWdlbnRDaGF0LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDckUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFakUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksSUFBSSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7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LEtBQUssRUFBRSxzQkFBc0IsOEJBQTJCLFVBQVUsWUFDcEUsbUJBQW1CLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxHQUN2QyxDQUNQLElBQ0EsQ0FDSixDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksSUFBSSxLQUFLLFlBQVksRUFBRSxDQUFDO1FBQzFCLE9BQU8sQ0FDTCxjQUFLLEtBQUssRUFBRSxzQkFBc0IsOEJBQTJCLFlBQVksWUFDdEUsbUJBQW1CLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxHQUN2QyxDQUNQLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxtQkFBbUIsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7QUFDcEQsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlTGF5b3V0RWZmZWN0LCB1c2VNZW1vLCB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENoYXRNZXNzYWdlQ29tcG9uZW50IH0gZnJvbSAnLi9DaGF0TWVzc2FnZSc7XG5pbXBvcnQgeyBBdHRhY2htZW50UHJldmlldyB9IGZyb20gJy4vY29tbW9uL0F0dGFjaG1lbnRQcmV2aWV3JztcbmltcG9ydCB7IHVzZUNoYXQgfSBmcm9tICcuLi9ob29rcy91c2VDaGF0JztcbmltcG9ydCB7IHVzZVNjcm9sbE1hbmFnZW1lbnQgfSBmcm9tICcuLi9ob29rcy91c2VTY3JvbGxNYW5hZ2VtZW50JztcbmltcG9ydCB7IHVzZVRoaW5raW5nQW5pbWF0aW9uIH0gZnJvbSAnLi4vaG9va3MvdXNlVGhpbmtpbmdBbmltYXRpb24nO1xuaW1wb3J0IHsgdXNlVmlld3BvcnRNYW5hZ2VyIH0gZnJvbSAnLi4vaG9va3MvdXNlVmlld3BvcnRNYW5hZ2VyJztcbmltcG9ydCB7IHVzZUZpbGVBdHRhY2htZW50cyB9IGZyb20gJy4uL2hvb2tzL3VzZUZpbGVBdHRhY2htZW50cyc7XG5pbXBvcnQgeyBDaGF0TWVzc2FnZSwgR2VuQWdlbnRDaGF0UHJvcHMsIFNjaGVkdWxlSXRlbSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IFZvaWNlSW5wdXQgfSBmcm9tICcuL1ZvaWNlSW5wdXQnO1xuaW1wb3J0IHsgTGl2ZUNhbGxDb250cm9sIH0gZnJvbSAnLi9MaXZlQ2FsbENvbnRyb2wnO1xuaW1wb3J0IHsgdXNlTGl2ZVZvaWNlIGFzIHVzZUxpdmVWb2ljZVNlc3Npb24gfSBmcm9tICcuLi9ob29rcy91c2VMaXZlVm9pY2UnO1xuaW1wb3J0IHsgQXVkaW9TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYXVkaW9TZXJ2aWNlJztcbmltcG9ydCB7IFBhcGVyY2xpcCwgTW9yZVZlcnRpY2FsLCBSZWZyZXNoQ3csIEdsb2JlLCBYLCBBcnJvd1VwLCBNYXhpbWl6ZTIsIE1pbmltaXplMiwgQWxlcnRDaXJjbGUgfSBmcm9tICdsdWNpZGUtcmVhY3QnO1xuaW1wb3J0IHsgQ2hhdEJ1YmJsZSB9IGZyb20gJy4vQ2hhdEJ1YmJsZSc7XG5pbXBvcnQgRHluYW1pY0Zvcm1NZXNzYWdlIGZyb20gJy4vRHluYW1pY0Zvcm1NZXNzYWdlJztcbmltcG9ydCB7IExhbmd1YWdlU2VsZWN0b3IgfSBmcm9tICcuL0xhbmd1YWdlU2VsZWN0b3InO1xuaW1wb3J0IGNoYXRMb2dvIGZyb20gJy4uL2Fzc2V0cy9jaGF0LWxvZ28ucG5nJztcblxuaW1wb3J0IHtcbiAgcmVzb2x2ZUxhbmd1YWdlLFxuICBtZXJnZVRyYW5zbGF0aW9ucyxcbiAgZ2V0VHJhbnNsYXRpb25TdHJpbmcsXG4gIGdldFRyYW5zbGF0aW9uc0Zvckxhbmd1YWdlLFxufSBmcm9tICcuLi91dGlscy9pMThuJztcbmltcG9ydCB7IEdvb2dsZVJlQ2FwdGNoYSwgR29vZ2xlUmVDYXB0Y2hhUHJvdmlkZXIgfSBmcm9tICdyZWFjdC1nb29nbGUtcmVjYXB0Y2hhLXYzJztcblxuaW1wb3J0IHtcbiAgcmVzb2x2ZVRoZW1lLFxuICBoZXhUb1JnYmEsXG4gIGdldENvbnRhaW5lclN0eWxlLFxuICBnZXRIZWFkZXJTdHlsZSxcbiAgbG9nb0NvbnRhaW5lclN0eWxlLFxuICBsb2dvU3R5bGUsXG4gIGhlYWRlclRpdGxlQ29udGFpbmVyU3R5bGUsXG4gIGdldEhlYWRlclRpdGxlU3R5bGUsXG4gIGdldEhlYWRlclN1YnRpdGxlU3R5bGUsXG4gIG1lbnVCdXR0b25TdHlsZSxcbiAgZ2V0TWVudVBvcHVwU3R5bGUsXG4gIGdldE1lbnVJdGVtU3R5bGUsXG4gIGNoYXRDb250YWluZXJTdHlsZSxcbiAgaW5wdXRDb250YWluZXJTdHlsZSxcbiAgaW5wdXRXcmFwcGVyU3R5bGUsXG4gIGdldFRleHRBcmVhU3R5bGUsXG4gIGdldExpdmVWb2ljZUhpbnRTdHlsZSxcbiAgYXR0YWNoQnV0dG9uU3R5bGUsXG4gIGdldFNlbmRCdXR0b25TdHlsZSxcbiAgc2VuZEJ1dHRvbkRpc2FibGVkU3R5bGUsXG4gIHJpZ2h0QWN0aW9uQ29udGFpbmVyU3R5bGUsXG4gIGdldFBvc3NpYmxlUXVlcmllc0NvbnRhaW5lclN0eWxlLFxuICBnZXRRdWVyeUJ1dHRvblN0eWxlLFxuICBnZXRDb25maXJtT3ZlcmxheVN0eWxlLFxuICBnZXRDb25maXJtRGlhbG9nU3R5bGUsXG4gIGNvbmZpcm1CdXR0b25zU3R5bGUsXG4gIGdldENvbmZpcm1CdXR0b25TdHlsZSxcbiAgZ2V0Q29udGVudENhcmRTdHlsZSxcbiAgZ2V0RGlzY2xhaW1lclN0eWxlLFxuICBnZXRQb3NpdGlvblN0eWxlcyxcbiAgZ2V0RmxvYXRpbmdDb250YWluZXJTdHlsZSxcbiAgQ1NTX0tFWUZSQU1FUyxcbn0gZnJvbSAnLi4vc3R5bGVzL2dlbkFnZW50Q2hhdFN0eWxlcyc7XG5cbmNvbnN0IFNIT1dfQ0hBVF9MQU5HVUFHRV9TRUxFQ1RPUiA9IHRydWU7XG5cbi8qKiBPbmUgY29tcGxldGVkIChvciBpbi1wcm9ncmVzcykgbGl2ZS12b2ljZSBleGNoYW5nZTogd2hhdCB0aGUgdXNlciBzYWlkICsgdGhlIHJlcGx5LiAqL1xudHlwZSBMaXZlVHVybiA9IHsgdXNlcjogc3RyaW5nOyBhZ2VudDogc3RyaW5nOyBjcmVhdGVUaW1lOiBudW1iZXIgfTtcblxuLyoqIEN1cnJlbnQgdGltZSBpbiBlcG9jaCBzZWNvbmRzICh0aGUgdGltZXN0YW1wIGZvcm1hdCBDaGF0TWVzc2FnZSBleHBlY3RzKS4gKi9cbmNvbnN0IG5vd1NlYyA9ICgpID0+IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuXG5leHBvcnQgY29uc3QgR2VuQWdlbnRDaGF0OiBSZWFjdC5GQzxHZW5BZ2VudENoYXRQcm9wcz4gPSAoe1xuICBiYXNlVXJsLFxuICB3ZWJzb2NrZXRVcmwsXG4gIGFwaUtleSxcbiAgdGVuYW50LFxuICBtZXRhZGF0YSxcbiAgdXNlV3MgPSB0cnVlLFxuICB1c2VQb2xsID0gZmFsc2UsXG4gIG9uRXJyb3IsXG4gIG9uVGFrZW92ZXIsXG4gIG9uRmluYWxpemUsXG4gIHRoZW1lLFxuICBoZWFkZXJUaXRsZSA9ICdHZW5hc3Npc3QnLFxuICBkZXNjcmlwdGlvbixcbiAgcGxhY2Vob2xkZXIsXG4gIGFnZW50TmFtZSxcbiAgbG9nb1VybCxcbiAgbW9kZSA9ICdlbWJlZGRlZCcsXG4gIG9uRXhpdEZ1bGxzY3JlZW4sXG4gIGZsb2F0aW5nQ29uZmlnID0ge30sXG4gIGxhbmd1YWdlLFxuICB0cmFuc2xhdGlvbnM6IGN1c3RvbVRyYW5zbGF0aW9ucyxcbiAgcmVDYXB0Y2hhS2V5LFxuICB3aWRnZXQgPSBmYWxzZSxcbiAgdXNlQXVkaW8gPSBmYWxzZSxcbiAgdXNlRmlsZSA9IGZhbHNlLFxuICBub0NvbG9yQW5pbWF0aW9uID0gZmFsc2UsXG4gIHNob3dXZWxjb21lQmVmb3JlU3RhcnQgPSB0cnVlLFxuICBhbGxvd2VkRXh0ZW5zaW9ucyA9IFtdLFxuICBzZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2UsXG4gIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCxcbiAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0TGFiZWwsXG4gIGZvcm1EaXNwbGF5ID0gJ2Zvb3RlcicsXG4gIG9uQ29uZmlnTG9hZGVkLFxufSk6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIC8vIExhbmd1YWdlIHNlbGVjdGlvbiBzdGF0ZSAod2l0aCBsb2NhbFN0b3JhZ2UgcGVyc2lzdGVuY2UpXG4gIGNvbnN0IFtzZWxlY3RlZExhbmd1YWdlLCBzZXRTZWxlY3RlZExhbmd1YWdlXSA9IHVzZVN0YXRlPHN0cmluZz4oKCkgPT4ge1xuICAgIGlmIChsYW5ndWFnZSkgcmV0dXJuIGxhbmd1YWdlO1xuICAgIGNvbnN0IHN0b3JlZCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2dlbmFzc2lzdF9sYW5ndWFnZScpIDogbnVsbDtcbiAgICBpZiAoc3RvcmVkKSByZXR1cm4gc3RvcmVkO1xuICAgIHJldHVybiByZXNvbHZlTGFuZ3VhZ2UoKTtcbiAgfSk7XG5cbiAgLy8gU2F2ZSBsYW5ndWFnZSB0byBsb2NhbFN0b3JhZ2Ugd2hlbiBpdCBjaGFuZ2VzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmICFsYW5ndWFnZSkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2dlbmFzc2lzdF9sYW5ndWFnZScsIHNlbGVjdGVkTGFuZ3VhZ2UpO1xuICAgIH1cbiAgfSwgW3NlbGVjdGVkTGFuZ3VhZ2UsIGxhbmd1YWdlXSk7XG5cbiAgLy8gU3RhdGUgZm9yIHRyYWNraW5nIHNlbGVjdGVkIEZBUSBxdWVyeVxuICBjb25zdCBbc2VsZWN0ZWRGYXFRdWVyeSwgc2V0U2VsZWN0ZWRGYXFRdWVyeV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvLyBSZXNvbHZlIGxhbmd1YWdlOiBwcm9wID4gc2VsZWN0ZWQgPiBicm93c2VyID4gJ2VuJ1xuICBjb25zdCByZXNvbHZlZExhbmd1YWdlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKGxhbmd1YWdlKSByZXR1cm4gbGFuZ3VhZ2U7XG4gICAgcmV0dXJuIHNlbGVjdGVkTGFuZ3VhZ2UgfHwgcmVzb2x2ZUxhbmd1YWdlKCkgfHwgJ2VuJztcbiAgfSwgW2xhbmd1YWdlLCBzZWxlY3RlZExhbmd1YWdlXSk7XG5cbiAgLy8gTWVyZ2UgbGFuZ3VhZ2UgYW5kIEZBUSBxdWVyeSBpbnRvIG1ldGFkYXRhXG4gIGNvbnN0IG1ldGFkYXRhV2l0aExhbmd1YWdlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLihtZXRhZGF0YSB8fCB7fSksXG4gICAgICBsYW5ndWFnZTogcmVzb2x2ZWRMYW5ndWFnZSxcbiAgICAgIC4uLihzZWxlY3RlZEZhcVF1ZXJ5ID8geyBmYXFfcXVlcnk6IHNlbGVjdGVkRmFxUXVlcnkgfSA6IHt9KSxcbiAgICB9O1xuICB9LCBbbWV0YWRhdGEsIHJlc29sdmVkTGFuZ3VhZ2UsIHNlbGVjdGVkRmFxUXVlcnldKTtcblxuICAvLyBHZXQgdHJhbnNsYXRpb25zIGJhc2VkIG9uIHJlc29sdmVkIGxhbmd1YWdlLCB0aGVuIG1lcmdlIHdpdGggY3VzdG9tIHRyYW5zbGF0aW9uc1xuICBjb25zdCB0cmFuc2xhdGlvbnMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBiYXNlVHJhbnNsYXRpb25zID0gZ2V0VHJhbnNsYXRpb25zRm9yTGFuZ3VhZ2UocmVzb2x2ZWRMYW5ndWFnZSk7XG4gICAgcmV0dXJuIG1lcmdlVHJhbnNsYXRpb25zKGN1c3RvbVRyYW5zbGF0aW9ucywgYmFzZVRyYW5zbGF0aW9ucyk7XG4gIH0sIFtyZXNvbHZlZExhbmd1YWdlLCBjdXN0b21UcmFuc2xhdGlvbnNdKTtcblxuICBjb25zdCB0ID0gKGtleTogc3RyaW5nLCBmYWxsYmFjaz86IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgcmV0dXJuIGdldFRyYW5zbGF0aW9uU3RyaW5nKGtleSwgdHJhbnNsYXRpb25zLCBmYWxsYmFjayk7XG4gIH07XG5cbiAgY29uc3QgaW5wdXRQbGFjZWhvbGRlciA9IHVzZU1lbW8oKCkgPT4gcGxhY2Vob2xkZXIgfHwgdCgnaW5wdXQucGxhY2Vob2xkZXInLCAnQXNrIGEgcXVlc3Rpb24nKSwgW3BsYWNlaG9sZGVyLCB0cmFuc2xhdGlvbnNdKTtcbiAgY29uc3QgW2lucHV0VmFsdWUsIHNldElucHV0VmFsdWVdID0gdXNlU3RhdGUoJycpO1xuICBjb25zdCBbc2hvd1Jlc2V0Q29uZmlybSwgc2V0U2hvd1Jlc2V0Q29uZmlybV0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtzaG93TWVudSwgc2V0U2hvd01lbnVdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbc2hvd0xhbmd1YWdlRHJvcGRvd24sIHNldFNob3dMYW5ndWFnZURyb3Bkb3duXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2lzUGxheWluZ0F1ZGlvLCBzZXRJc1BsYXlpbmdBdWRpb10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtpc0Zsb2F0aW5nT3Blbiwgc2V0SXNGbG9hdGluZ09wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbc3VibWl0dGVkRm9ybXMsIHNldFN1Ym1pdHRlZEZvcm1zXSA9IHVzZVN0YXRlPFNldDxudW1iZXI+PihuZXcgU2V0KCkpO1xuICBjb25zdCBbc3VibWl0dGluZ0Zvcm1JbmRleCwgc2V0U3VibWl0dGluZ0Zvcm1JbmRleF0gPSB1c2VTdGF0ZTxudW1iZXIgfCBudWxsPihudWxsKTtcbiAgY29uc3QgbWVudVJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XG4gIGNvbnN0IHRleHRBcmVhUmVmID0gdXNlUmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCBoZWFkZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCBbaGVhZGVySGVpZ2h0LCBzZXRIZWFkZXJIZWlnaHRdID0gdXNlU3RhdGUoNTYpO1xuICBjb25zdCBbc2hvd0JhY2tsaWdodCwgc2V0U2hvd0JhY2tsaWdodF0gPSB1c2VTdGF0ZShmYWxzZSk7XG5cbiAgY29uc3Qge1xuICAgIG1lc3NhZ2VzLFxuICAgIGlzTG9hZGluZyxcbiAgICBzZW5kTWVzc2FnZSxcbiAgICBzZW5kQXVkaW9NZXNzYWdlLFxuICAgIHVwbG9hZEZpbGUsXG4gICAgcmVzZXRDb252ZXJzYXRpb24sXG4gICAgc3RhcnRDb252ZXJzYXRpb24sXG4gICAgdHJpZ2dlclN0YXJ0Rm9ybSxcbiAgICBzaG91bGRUcmlnZ2VyU3RhcnRGb3JtLFxuICAgIGNvbnZlcnNhdGlvbklkLFxuICAgIGd1ZXN0VG9rZW4sXG4gICAgcG9zc2libGVRdWVyaWVzLFxuICAgIGlzRmluYWxpemVkLFxuICAgIGlzQWdlbnRUeXBpbmcsXG4gICAgYWRkRmVlZGJhY2ssXG4gICAgYXZhaWxhYmxlTGFuZ3VhZ2VzOiBhZ2VudEF2YWlsYWJsZUxhbmd1YWdlcyxcbiAgICBhZ2VudElkLFxuICAgIGFnZW50TGl2ZVZvaWNlRW5hYmxlZCxcbiAgICBhZ2VudExpdmVWb2ljZVJlYWR5LFxuICAgIHdlbGNvbWVUaXRsZSxcbiAgICB3ZWxjb21lSW1hZ2VVcmwsXG4gICAgd2VsY29tZU1lc3NhZ2UsXG4gICAgaW5wdXREaXNjbGFpbWVySHRtbCxcbiAgICB0aGlua2luZ1BocmFzZXMsXG4gICAgdGhpbmtpbmdEZWxheU1zLFxuICAgIGZvcm1Ob2RlTG9jYWxlcyxcbiAgfSA9IHVzZUNoYXQoe1xuICAgIGJhc2VVcmwsXG4gICAgd2Vic29ja2V0VXJsLFxuICAgIGFwaUtleSxcbiAgICB0ZW5hbnQsXG4gICAgbWV0YWRhdGE6IG1ldGFkYXRhV2l0aExhbmd1YWdlLFxuICAgIHVzZVdzLFxuICAgIHVzZVBvbGwsXG4gICAgbGFuZ3VhZ2U6IHJlc29sdmVkTGFuZ3VhZ2UsXG4gICAgb25FcnJvcixcbiAgICBvblRha2VvdmVyLFxuICAgIG9uRmluYWxpemUsXG4gICAgc2VydmVyVW5hdmFpbGFibGVNZXNzYWdlLFxuICAgIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCxcbiAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbCxcbiAgICBvbkNvbmZpZ0xvYWRlZCxcbiAgfSk7XG5cbiAgY29uc3QgeyBjdXJyZW50VGhpbmtpbmdQYXJ0cywgY3VycmVudFRoaW5raW5nUGFydEluZGV4IH0gPSB1c2VUaGlua2luZ0FuaW1hdGlvbih7XG4gICAgaXNBZ2VudFR5cGluZyxcbiAgICB0aGlua2luZ1BocmFzZXMsXG4gICAgdGhpbmtpbmdEZWxheU1zLFxuICAgIHRyYW5zbGF0aW9ucyxcbiAgfSk7XG5cbiAgY29uc3QgeyBtZXNzYWdlc0VuZFJlZiwgY2hhdENvbnRhaW5lclJlZiB9ID0gdXNlU2Nyb2xsTWFuYWdlbWVudCh7XG4gICAgbWVzc2FnZXMsXG4gICAgaXNBZ2VudFR5cGluZyxcbiAgICBjdXJyZW50VGhpbmtpbmdQYXJ0SW5kZXgsXG4gICAgY3VycmVudFRoaW5raW5nUGFydHNMZW5ndGg6IGN1cnJlbnRUaGlua2luZ1BhcnRzLmxlbmd0aCxcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICBpc0Zsb2F0aW5nT3BlbixcbiAgICBtb2RlLFxuICB9KTtcblxuICBjb25zdCB7XG4gICAgd2luZG93V2lkdGgsXG4gICAgd2luZG93SGVpZ2h0LFxuICAgIGlzRnVsbHNjcmVlbixcbiAgICBoYW5kbGVGdWxsc2NyZWVuVG9nZ2xlLFxuICB9ID0gdXNlVmlld3BvcnRNYW5hZ2VyKHtcbiAgICBtb2RlLFxuICAgIHdpZGdldCxcbiAgICBpc0Zsb2F0aW5nT3BlbixcbiAgICBzaG93UmVzZXRDb25maXJtLFxuICAgIHNob3dMYW5ndWFnZURyb3Bkb3duLFxuICAgIHNob3dNZW51LFxuICAgIG9uRXhpdEZ1bGxzY3JlZW4sXG4gICAgc2V0U2hvd1Jlc2V0Q29uZmlybSxcbiAgICBzZXRTaG93TGFuZ3VhZ2VEcm9wZG93bixcbiAgICBzZXRTaG93TWVudSxcbiAgfSk7XG5cbiAgY29uc3Qge1xuICAgIGF0dGFjaG1lbnRzLFxuICAgIHNldEF0dGFjaG1lbnRzLFxuICAgIHVwbG9hZGluZ0ZpbGVzLFxuICAgIGZpbGVFcnJvclRvYXN0LFxuICAgIGZpbGVJbnB1dFJlZixcbiAgICBoYW5kbGVGaWxlQ2hhbmdlLFxuICAgIGhhbmRsZVJlbW92ZUF0dGFjaG1lbnQsXG4gICAgY2xlYXJBdHRhY2htZW50cyxcbiAgfSA9IHVzZUZpbGVBdHRhY2htZW50cyh7IHVwbG9hZEZpbGUsIHQgfSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAobGFuZ3VhZ2UpIHJldHVybjtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYWdlbnRBdmFpbGFibGVMYW5ndWFnZXMpIHx8IGFnZW50QXZhaWxhYmxlTGFuZ3VhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBub3JtYWxpemVkID0gYWdlbnRBdmFpbGFibGVMYW5ndWFnZXMubWFwKChsYW5nKSA9PiBsYW5nLnRvTG93ZXJDYXNlKCkpO1xuICAgIGlmICghbm9ybWFsaXplZC5pbmNsdWRlcyhzZWxlY3RlZExhbmd1YWdlLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICBzZXRTZWxlY3RlZExhbmd1YWdlKG5vcm1hbGl6ZWRbMF0pO1xuICAgIH1cbiAgfSwgW2FnZW50QXZhaWxhYmxlTGFuZ3VhZ2VzLCBsYW5ndWFnZSwgc2VsZWN0ZWRMYW5ndWFnZV0pO1xuXG4gIGNvbnN0IGF1ZGlvU2VydmljZSA9IHVzZVJlZjxBdWRpb1NlcnZpY2UgfCBudWxsPihudWxsKTtcbiAgY29uc3QgcmVDYXB0Y2hhVG9rZW5SZWYgPSB1c2VSZWY8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIGNvbnN0IGhhc1VzZXJNZXNzYWdlcyA9IG1lc3NhZ2VzLnNvbWUobWVzc2FnZSA9PiBtZXNzYWdlLnNwZWFrZXIgPT09ICdjdXN0b21lcicpO1xuXG4gIC8vIFdoZW4gYSBIdW1hbiBJbiBUaGUgTG9vcCBub2RlIHdpdGggXCJzaG93X29uX3N0YXJ0XCIgaXMgd2lyZWQgZGlyZWN0bHkgYWZ0ZXIgU3RhcnQsIHJ1blxuICAvLyB0aGUgd29ya2Zsb3cgb25jZSBhcyB0aGUgY29udmVyc2F0aW9uIG9wZW5zIHNvIGl0cyBmb3JtIGFwcGVhcnMgaW1tZWRpYXRlbHksIGJlZm9yZVxuICAvLyBhbnkgdmlzaXRvciBtZXNzYWdlLiBGaXJlcyBvbmx5IG9uIGEgZnJlc2ggY29udmVyc2F0aW9uOiBubyB2aXNpdG9yIG1lc3NhZ2VzIHlldCBhbmRcbiAgLy8gbm8gZm9ybSBhbHJlYWR5IHByZXNlbnQgKGEgd2VsY29tZSBtZXNzYWdlIG1heSBleGlzdDsgYSBwZXJzaXN0ZWQgZm9ybSBtdXN0IG5vdFxuICAvLyByZS10cmlnZ2VyIG9uIHJlbG9hZCkuXG4gIGNvbnN0IGhhc0Zvcm1SZXF1ZXN0ID0gbWVzc2FnZXMuc29tZSgobSkgPT4gbS50eXBlID09PSAnZm9ybV9yZXF1ZXN0Jyk7XG4gIGNvbnN0IHN0YXJ0Rm9ybVRyaWdnZXJlZFJlZiA9IHVzZVJlZihmYWxzZSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKFxuICAgICAgc2hvdWxkVHJpZ2dlclN0YXJ0Rm9ybSAmJlxuICAgICAgY29udmVyc2F0aW9uSWQgJiZcbiAgICAgICFpc0ZpbmFsaXplZCAmJlxuICAgICAgIWhhc1VzZXJNZXNzYWdlcyAmJlxuICAgICAgIWhhc0Zvcm1SZXF1ZXN0ICYmXG4gICAgICAhc3RhcnRGb3JtVHJpZ2dlcmVkUmVmLmN1cnJlbnRcbiAgICApIHtcbiAgICAgIHN0YXJ0Rm9ybVRyaWdnZXJlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIHRyaWdnZXJTdGFydEZvcm0ocmVDYXB0Y2hhVG9rZW5SZWYuY3VycmVudCk7XG4gICAgfVxuICB9LCBbc2hvdWxkVHJpZ2dlclN0YXJ0Rm9ybSwgY29udmVyc2F0aW9uSWQsIGlzRmluYWxpemVkLCBoYXNVc2VyTWVzc2FnZXMsIGhhc0Zvcm1SZXF1ZXN0LCB0cmlnZ2VyU3RhcnRGb3JtXSk7XG5cbiAgLy8gQWxsb3cgYSBmcmVzaCB0cmlnZ2VyIGFmdGVyIGEgcmVzZXQgKG5ldyBjb252ZXJzYXRpb24gaWQgLyBjbGVhcmVkIG1lc3NhZ2VzKS5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNvbnZlcnNhdGlvbklkKSB7XG4gICAgICBzdGFydEZvcm1UcmlnZ2VyZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH1cbiAgfSwgW2NvbnZlcnNhdGlvbklkXSk7XG5cbiAgLy8gRm9ybS1zdWJtaXNzaW9uIHN0YXRlIGlzIGtleWVkIGJ5IG1lc3NhZ2UgaW5kZXgsIHdoaWNoIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aXRoaW4gYVxuICAvLyBzaW5nbGUgY29udmVyc2F0aW9uLiBDbGVhciBpdCB3aGVuZXZlciB0aGUgY29udmVyc2F0aW9uIGNoYW5nZXMgc28gYSBmb3JtIHN1Ym1pdHRlZCBpblxuICAvLyBhIHByZXZpb3VzIGNvbnZlcnNhdGlvbiBkb2Vzbid0IG1hcmsgYSBuZXcgY29udmVyc2F0aW9uJ3MgZm9ybSAoYXQgdGhlIHNhbWUgaW5kZXgpIGFzXG4gIC8vIGFscmVhZHkgYW5zd2VyZWQg4oCUIHdoaWNoIHdvdWxkIHdyb25nbHkgaGlkZSBpdCBvbiBTdGFydCAoUmVzZXQgY2xlYXJlZCBpdCwgcGxhaW4gU3RhcnRcbiAgLy8gZGlkIG5vdCkuIFRoZSByZWxvYWQgY2FzZSBzdGF5cyBjb3JyZWN0OiBpdCByZWxpZXMgb24gaXNGb3JtQW5zd2VyZWQncyB0cmFuc2NyaXB0IGNoZWNrLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNldFN1Ym1pdHRlZEZvcm1zKG5ldyBTZXQoKSk7XG4gICAgc2V0U3VibWl0dGluZ0Zvcm1JbmRleChudWxsKTtcbiAgfSwgW2NvbnZlcnNhdGlvbklkXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBhdWRpb1NlcnZpY2UuY3VycmVudCA9IG5ldyBBdWRpb1NlcnZpY2UoeyBiYXNlVXJsLCB3ZWJzb2NrZXRVcmwsIGFwaUtleSB9KTtcbiAgfSwgW2Jhc2VVcmwsIHdlYnNvY2tldFVybCwgYXBpS2V5XSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBhdWRpb1NlcnZpY2UuY3VycmVudD8uc2V0R3Vlc3RUb2tlbihndWVzdFRva2VuID8/IG51bGwpO1xuICB9LCBbZ3Vlc3RUb2tlbl0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKG1vZGUgPT09ICdmdWxsc2NyZWVuJyAmJiAhaXNGbG9hdGluZ09wZW4pIHtcbiAgICAgIHNldElzRmxvYXRpbmdPcGVuKHRydWUpO1xuICAgIH1cbiAgfSwgW21vZGUsIGlzRmxvYXRpbmdPcGVuXSk7XG5cbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB1cGRhdGVIZWFkZXJIZWlnaHQgPSAoKSA9PiB7XG4gICAgICBzZXRIZWFkZXJIZWlnaHQoaGVhZGVyUmVmLmN1cnJlbnQ/Lm9mZnNldEhlaWdodCB8fCA1Nik7XG4gICAgfTtcbiAgICB1cGRhdGVIZWFkZXJIZWlnaHQoKTtcbiAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB1cGRhdGVIZWFkZXJIZWlnaHQoKSk7XG4gICAgaWYgKGhlYWRlclJlZi5jdXJyZW50KSB7XG4gICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGhlYWRlclJlZi5jdXJyZW50KTtcbiAgICB9XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHVwZGF0ZUhlYWRlckhlaWdodCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB1cGRhdGVIZWFkZXJIZWlnaHQpO1xuICAgIH07XG4gIH0sIFtdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpc0FnZW50VHlwaW5nKSB7XG4gICAgICBzZXRTaG93QmFja2xpZ2h0KHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gc2V0U2hvd0JhY2tsaWdodChmYWxzZSksIDQyMCk7XG4gICAgcmV0dXJuICgpID0+IGNsZWFyVGltZW91dCh0aW1lcik7XG4gIH0sIFtpc0FnZW50VHlwaW5nXSk7XG5cbiAgY29uc3Qgc3VibWl0TWVzc2FnZSA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoaW5wdXRWYWx1ZS50cmltKCkgPT09ICcnICYmIGF0dGFjaG1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGlmIChpc0FnZW50VHlwaW5nKSByZXR1cm47XG4gICAgY29uc3QgdGV4dFRvU2VuZCA9IGlucHV0VmFsdWU7XG4gICAgY29uc3QgZmlsZXNUb1VwbG9hZCA9IGF0dGFjaG1lbnRzLm1hcChhID0+IGEuZmlsZSk7XG5cbiAgICBzZXRJbnB1dFZhbHVlKCcnKTtcbiAgICBzZXRBdHRhY2htZW50cyhbXSk7XG4gICAgaWYgKGZpbGVJbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICBmaWxlSW5wdXRSZWYuY3VycmVudC52YWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBleHRyYU1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cbiAgICAgIGlmIChzZWxlY3RlZEZhcVF1ZXJ5KSB7XG4gICAgICAgIGV4dHJhTWV0YWRhdGEuZmFxX3F1ZXJ5ID0gc2VsZWN0ZWRGYXFRdWVyeTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbGVzVG9VcGxvYWQubGVuZ3RoID4gMCkge1xuICAgICAgICBleHRyYU1ldGFkYXRhLmF0dGFjaG1lbnRzID0gYXR0YWNobWVudHMubWFwKGEgPT4gYS5hdHRhY2htZW50KTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgc2VuZE1lc3NhZ2UodGV4dFRvU2VuZCwgZmlsZXNUb1VwbG9hZCwgZXh0cmFNZXRhZGF0YSwgcmVDYXB0Y2hhVG9rZW5SZWYuY3VycmVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRleHRBcmVhUmVmLmN1cnJlbnQ/LmZvY3VzKCksIDApO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVTdWJtaXQgPSBhc3luYyAoZTogUmVhY3QuRm9ybUV2ZW50KSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGF3YWl0IHN1Ym1pdE1lc3NhZ2UoKTtcbiAgfTtcblxuICB0eXBlIEZvcm1TY2hlbWFGaWVsZCA9IHtcbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIGxhYmVsPzogc3RyaW5nO1xuICAgIG9wdGlvbnM/OiBBcnJheTx7IHZhbHVlPzogc3RyaW5nOyBsYWJlbD86IHN0cmluZyB9PjtcbiAgfTtcblxuICAvLyBPdmVybGF5IGEgZm9ybSBzY2hlbWEgd2l0aCB0aGUgc2VsZWN0ZWQgbGFuZ3VhZ2UncyBzdHJpbmdzIGZyb20gdGhlIGxvY2FsZSBidW5kbGVcbiAgLy8gKGtleWVkIGJ5IG5vZGUgaWQpLCBzbyBhIGRpc3BsYXllZCBmb3JtIHJlLWxvY2FsaXplcyBvbiBsYW5ndWFnZSBzd2l0Y2guIEZhbGxzIGJhY2tcbiAgLy8gdG8gdGhlIHNjaGVtYSdzIG93biBzdHJpbmdzIHdoZW4gYSB0cmFuc2xhdGlvbiBpcyBtaXNzaW5nLlxuICBjb25zdCBsb2NhbGl6ZUZvcm0gPSB1c2VDYWxsYmFjayhcbiAgICAoc2NoZW1hOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgaWYgKCFzY2hlbWEgfHwgdHlwZW9mIHNjaGVtYSAhPT0gJ29iamVjdCcpIHJldHVybiBzY2hlbWE7XG4gICAgICBjb25zdCBjb2RlID0gcmVzb2x2ZWRMYW5ndWFnZS50b0xvd2VyQ2FzZSgpLnNwbGl0KCctJylbMF07XG4gICAgICBjb25zdCBzbGljZSA9IGZvcm1Ob2RlTG9jYWxlcz8uW2NvZGVdPy5bc2NoZW1hLm5vZGVfaWRdO1xuICAgICAgaWYgKCFzbGljZSkgcmV0dXJuIHNjaGVtYTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnNjaGVtYSxcbiAgICAgICAgbWVzc2FnZTogc2xpY2UubWVzc2FnZSA/PyBzY2hlbWEubWVzc2FnZSxcbiAgICAgICAgZmllbGRzOiBBcnJheS5pc0FycmF5KHNjaGVtYS5maWVsZHMpXG4gICAgICAgICAgPyBzY2hlbWEuZmllbGRzLm1hcCgoZjogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHQgPSBmPy5uYW1lID8gc2xpY2UuZmllbGRzPy5bZi5uYW1lXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgaWYgKCF0KSByZXR1cm4gZjtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5mLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0LmxhYmVsID8/IGYubGFiZWwsXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IHQucGxhY2Vob2xkZXIgPz8gZi5wbGFjZWhvbGRlcixcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogdC5kZXNjcmlwdGlvbiA/PyBmLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IEFycmF5LmlzQXJyYXkoZi5vcHRpb25zKVxuICAgICAgICAgICAgICAgICAgPyBmLm9wdGlvbnMubWFwKChvOiBhbnkpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgLi4ubyxcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdC5vcHRpb25zPy5bU3RyaW5nKG8/LnZhbHVlKV0gPz8gbz8ubGFiZWwsXG4gICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgOiBmLm9wdGlvbnMsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogc2NoZW1hLmZpZWxkcyxcbiAgICAgIH07XG4gICAgfSxcbiAgICBbcmVzb2x2ZWRMYW5ndWFnZSwgZm9ybU5vZGVMb2NhbGVzXSxcbiAgKTtcblxuICBjb25zdCBnZXRGb3JtU2NoZW1hID0gKFxuICAgIG1lc3NhZ2VJbmRleDogbnVtYmVyLFxuICApOiB7IG5vZGVfaWQ/OiBzdHJpbmc7IG1lc3NhZ2U/OiBzdHJpbmc7IGZpZWxkcz86IEZvcm1TY2hlbWFGaWVsZFtdIH0gfCBudWxsID0+IHtcbiAgICBjb25zdCBtc2cgPSBtZXNzYWdlc1ttZXNzYWdlSW5kZXhdO1xuICAgIGlmIChtc2c/LnR5cGUgPT09ICdmb3JtX3JlcXVlc3QnICYmIG1zZy50ZXh0KSB7XG4gICAgICB0cnkgeyByZXR1cm4gbG9jYWxpemVGb3JtKEpTT04ucGFyc2UobXNnLnRleHQpKTsgfSBjYXRjaCB7IC8qIHNraXAgKi8gfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICBjb25zdCBnZXRGb3JtTm9kZUlkID0gKG1lc3NhZ2VJbmRleDogbnVtYmVyKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+XG4gICAgZ2V0Rm9ybVNjaGVtYShtZXNzYWdlSW5kZXgpPy5ub2RlX2lkO1xuXG4gIC8vIEJ1aWxkIHRoZSBodW1hbi1yZWFkYWJsZSBjdXN0b21lciBtZXNzYWdlIGZyb20gdGhlIHN1Ym1pdHRlZCBmb3JtLiBXZSBzaG93IGVhY2ggZmllbGQnc1xuICAvLyBsYWJlbCwgYW5kIGZvciBvcHRpb24tYmFzZWQgZmllbGRzIChlLmcuIHNlbGVjdCkgdGhlIGNob3NlbiBvcHRpb24ncyBsYWJlbCBpbnN0ZWFkIG9mXG4gIC8vIGl0cyByYXcgdmFsdWUg4oCUIGJvdGggYWxyZWFkeSBpbiB0aGUgY29udmVyc2F0aW9uIGxhbmd1YWdlLCBzaW5jZSB0aGUgZm9ybSBzY2hlbWEgaXNcbiAgLy8gdHJhbnNsYXRlZC4gVGhlIHBheWxvYWQgKGBodW1hbl9pbl90aGVfbG9vcF9mcm9tX2Zvcm1gKSBrZWVwcyB0aGUgcmF3IGtleXMvdmFsdWVzLlxuICBjb25zdCBidWlsZEZvcm1TdW1tYXJ5ID0gKFxuICAgIGZvcm1EYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBtZXNzYWdlSW5kZXg6IG51bWJlcixcbiAgKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBmaWVsZEJ5TmFtZTogUmVjb3JkPHN0cmluZywgRm9ybVNjaGVtYUZpZWxkPiA9IHt9O1xuICAgIGZvciAoY29uc3QgZiBvZiBnZXRGb3JtU2NoZW1hKG1lc3NhZ2VJbmRleCk/LmZpZWxkcyA/PyBbXSkge1xuICAgICAgaWYgKGYgJiYgdHlwZW9mIGYubmFtZSA9PT0gJ3N0cmluZycpIGZpZWxkQnlOYW1lW2YubmFtZV0gPSBmO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZm9ybURhdGEpXG4gICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBmaWVsZEJ5TmFtZVtrZXldO1xuICAgICAgICBjb25zdCBsYWJlbCA9IGZpZWxkPy5sYWJlbCB8fCBrZXk7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IGZpZWxkPy5vcHRpb25zPy5maW5kKFxuICAgICAgICAgIChvKSA9PiBvICYmIFN0cmluZyhvLnZhbHVlKSA9PT0gU3RyaW5nKHZhbHVlKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZGlzcGxheSA9IG9wdGlvbj8ubGFiZWwgfHwgdmFsdWU7XG4gICAgICAgIHJldHVybiBgJHtsYWJlbH06ICR7ZGlzcGxheX1gO1xuICAgICAgfSlcbiAgICAgIC5qb2luKCdcXG4nKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVGb3JtU3VibWl0ID0gYXN5bmMgKGZvcm1EYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgbWVzc2FnZUluZGV4OiBudW1iZXIpID0+IHtcbiAgICBpZiAoc3VibWl0dGluZ0Zvcm1JbmRleCAhPT0gbnVsbCB8fCBpc0FnZW50VHlwaW5nKSByZXR1cm47XG4gICAgc2V0U3VibWl0dGluZ0Zvcm1JbmRleChtZXNzYWdlSW5kZXgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdW1tYXJ5VGV4dCA9IGJ1aWxkRm9ybVN1bW1hcnkoZm9ybURhdGEsIG1lc3NhZ2VJbmRleCk7XG4gICAgICBjb25zdCBub2RlSWQgPSBnZXRGb3JtTm9kZUlkKG1lc3NhZ2VJbmRleCk7XG4gICAgICBhd2FpdCBzZW5kTWVzc2FnZShzdW1tYXJ5VGV4dCwgW10sIHtcbiAgICAgICAgaHVtYW5faW5fdGhlX2xvb3BfZnJvbV9mb3JtOiBmb3JtRGF0YSxcbiAgICAgICAgLi4uKG5vZGVJZCAmJiB7IGh1bWFuX2luX3RoZV9sb29wX25vZGVfaWQ6IG5vZGVJZCB9KSxcbiAgICAgIH0sIHJlQ2FwdGNoYVRva2VuUmVmLmN1cnJlbnQpO1xuICAgICAgc2V0U3VibWl0dGVkRm9ybXMoKHByZXYpID0+IG5ldyBTZXQocHJldikuYWRkKG1lc3NhZ2VJbmRleCkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0U3VibWl0dGluZ0Zvcm1JbmRleChudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlRm9ybUNhbmNlbCA9IGFzeW5jIChtZXNzYWdlSW5kZXg6IG51bWJlcikgPT4ge1xuICAgIGlmIChzdWJtaXR0aW5nRm9ybUluZGV4ICE9PSBudWxsIHx8IGlzQWdlbnRUeXBpbmcpIHJldHVybjtcbiAgICBzZXRTdWJtaXR0aW5nRm9ybUluZGV4KG1lc3NhZ2VJbmRleCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG5vZGVJZCA9IGdldEZvcm1Ob2RlSWQobWVzc2FnZUluZGV4KTtcbiAgICAgIGF3YWl0IHNlbmRNZXNzYWdlKCdTa2lwcGVkJywgW10sIHtcbiAgICAgICAgaHVtYW5faW5fdGhlX2xvb3BfZnJvbV9mb3JtOiB7fSxcbiAgICAgICAgaHVtYW5faW5fdGhlX2xvb3BfY2FuY2VsbGVkOiB0cnVlLFxuICAgICAgICAuLi4obm9kZUlkICYmIHsgaHVtYW5faW5fdGhlX2xvb3Bfbm9kZV9pZDogbm9kZUlkIH0pLFxuICAgICAgfSwgcmVDYXB0Y2hhVG9rZW5SZWYuY3VycmVudCk7XG4gICAgICBzZXRTdWJtaXR0ZWRGb3JtcygocHJldikgPT4gbmV3IFNldChwcmV2KS5hZGQobWVzc2FnZUluZGV4KSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRTdWJtaXR0aW5nRm9ybUluZGV4KG51bGwpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVRdWlja0FjdGlvbiA9IGFzeW5jICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIXRleHQudHJpbSgpKSByZXR1cm47XG4gICAgaWYgKGlzQWdlbnRUeXBpbmcpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXh0cmFNZXRhZGF0YSA9IHNlbGVjdGVkRmFxUXVlcnkgPyB7IGZhcV9xdWVyeTogc2VsZWN0ZWRGYXFRdWVyeSB9IDogdW5kZWZpbmVkO1xuICAgICAgYXdhaXQgc2VuZE1lc3NhZ2UodGV4dCwgW10sIGV4dHJhTWV0YWRhdGEsIHJlQ2FwdGNoYVRva2VuUmVmLmN1cnJlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBpZ25vcmUgcXVpY2sgYWN0aW9uIGVycm9ycyB0byBhdm9pZCBpbnRlcnJ1cHRpbmcgdGhlIGZsb3dcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlU2NoZWR1bGVDb25maXJtID0gYXN5bmMgKHNjaGVkdWxlOiBTY2hlZHVsZUl0ZW0pID0+IHtcbiAgICBjb25zdCBzdW1tYXJ5ID0gYFNjaGVkdWxlIGNvbmZpcm1lZCB3aXRoICR7c2NoZWR1bGUucmVzdGF1cmFudHMubGVuZ3RofSByZXN0YXVyYW50c2A7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNlbmRNZXNzYWdlKHN1bW1hcnksIFtdLCB7IGNvbmZpcm1TY2hlZHVsZTogSlNPTi5zdHJpbmdpZnkoc2NoZWR1bGUpIH0sIHJlQ2FwdGNoYVRva2VuUmVmLmN1cnJlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gIH07XG5cbiAgLy8gTmV1dHJhbCwgdXNlci1mYWNpbmcgbm90aWNlIHNob3duIHdoZW4gYSBsaXZlIGNhbGwgY2FuJ3Qgc3RhcnQgLyBmYWlscy4gVGhlXG4gIC8vIG1lc3NhZ2UgaXMgYWxyZWFkeSBuZXV0cmFsICh0aGUgYmFja2VuZCBuZXZlciBzZW5kcyBpbnRlcm5hbCBjb25maWcgZGV0YWlsKSwgc29cbiAgLy8gaXQncyBzYWZlIGZvciBwdWJsaWMgd2lkZ2V0cyDigJQgaXQganVzdCBhdm9pZHMgYSBjb25mdXNpbmcgc2lsZW50IGNsb3NlLlxuICBjb25zdCBbbGl2ZVZvaWNlTm90aWNlLCBzZXRMaXZlVm9pY2VOb3RpY2VdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgY29uc3QgaGFuZGxlVm9pY2VFcnJvciA9IChlcnJvcjogRXJyb3IpID0+IHtcbiAgICBzZXRMaXZlVm9pY2VOb3RpY2UoZXJyb3IubWVzc2FnZSB8fCAnVm9pY2UgaXMgY3VycmVudGx5IHVuYXZhaWxhYmxlJyk7XG4gICAgaWYgKG9uRXJyb3IpIHtcbiAgICAgIG9uRXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfTtcblxuICAvLyBWb2ljZS1vbmx5IG1vZGUgaXMgZHJpdmVuIHB1cmVseSBieSB0aGUgYWdlbnQ6IGl0J3Mgb24gd2hlbiB0aGUgYWdlbnQnc1xuICAvLyB3b3JrZmxvdyBjb250YWlucyBhIFZvaWNlIEFnZW50IG5vZGUgKGF1dG8tZGV0ZWN0ZWQgYnkgdGhlIGJhY2tlbmQgYW5kXG4gIC8vIHN1cmZhY2VkIHRocm91Z2ggYGFnZW50TGl2ZVZvaWNlRW5hYmxlZGApLiBObyBpbnRlZ3JhdG9yIHByb3AgaXMgaW52b2x2ZWQuXG4gIGNvbnN0IGxpdmVWb2ljZUVuYWJsZWQgPSBhZ2VudExpdmVWb2ljZUVuYWJsZWQ7XG4gIC8vIFdoZXRoZXIgbGl2ZSB2b2ljZSBjYW4gYWN0dWFsbHkgcnVuIChhIEdlbWluaSBwcm92aWRlciB3aXRoIGEga2V5IGlzIGNvbmZpZ3VyZWQpLlxuICAvLyBXaGVuIGZhbHNlIHdlIGtlZXAgdm9pY2Utb25seSBtb2RlIGJ1dCBkaXNhYmxlIHRoZSBjYWxsIGNvbnRyb2wgd2l0aCBhIG5ldXRyYWxcbiAgLy8gbWVzc2FnZSDigJQgdGhlIHNwZWNpZmljIHJlYXNvbiBzdGF5cyBzZXJ2ZXItc2lkZSwgbmV2ZXIgc2hvd24gdG8gcHVibGljIHVzZXJzLlxuICBjb25zdCBsaXZlVm9pY2VSZWFkeSA9IGFnZW50TGl2ZVZvaWNlUmVhZHk7XG5cbiAgLy8gTGl2ZSAoY29udGludW91cykgdm9pY2UgY29udmVyc2F0aW9uIGFnYWluc3QgdGhlIGFnZW50J3MgVm9pY2UgQWdlbnQgbm9kZS5cbiAgLy8gYGxpdmVDYXB0aW9uYCBpcyB0aGUgaW4tcHJvZ3Jlc3MgdHVybiAoc3RyZWFtcyBhcyB5b3Ugc3BlYWspOyBgbGl2ZVR1cm5zYCBhcmVcbiAgLy8gY29tcGxldGVkIHR1cm5zIGtlcHQgbG9jYWxseSBzbyB0aGV5IHN0YXkgb24gc2NyZWVuIGFjcm9zcyB0dXJucy4gYGNyZWF0ZVRpbWVgXG4gIC8vIGlzIGNhcHR1cmVkIG9uY2UgcGVyIHR1cm4gc28gdGhlIGJ1YmJsZSB0aW1lc3RhbXAgZG9lc24ndCBqaXR0ZXIgb24gcmUtcmVuZGVyLlxuICBjb25zdCBbbGl2ZUNhcHRpb24sIHNldExpdmVDYXB0aW9uXSA9IHVzZVN0YXRlPExpdmVUdXJuPih7IHVzZXI6ICcnLCBhZ2VudDogJycsIGNyZWF0ZVRpbWU6IDAgfSk7XG4gIGNvbnN0IFtsaXZlVHVybnMsIHNldExpdmVUdXJuc10gPSB1c2VTdGF0ZTxMaXZlVHVybltdPihbXSk7XG4gIGNvbnN0IGxpdmVWb2ljZSA9IHVzZUxpdmVWb2ljZVNlc3Npb24oe1xuICAgIGJhc2VVcmwsXG4gICAgYXBpS2V5LFxuICAgIGd1ZXN0VG9rZW4sXG4gICAgdGVuYW50LFxuICAgIGFnZW50SWQsXG4gICAgY29udmVyc2F0aW9uSWQsXG4gICAgbGFuZ3VhZ2U6IHJlc29sdmVkTGFuZ3VhZ2UsXG4gICAgb25FcnJvcjogaGFuZGxlVm9pY2VFcnJvcixcbiAgICBvbklucHV0VHJhbnNjcmlwdDogKHRleHQpID0+XG4gICAgICBzZXRMaXZlQ2FwdGlvbigoYykgPT4gKHsgLi4uYywgdXNlcjogYy51c2VyICsgdGV4dCwgY3JlYXRlVGltZTogYy5jcmVhdGVUaW1lIHx8IG5vd1NlYygpIH0pKSxcbiAgICBvbk91dHB1dFRyYW5zY3JpcHQ6ICh0ZXh0KSA9PlxuICAgICAgc2V0TGl2ZUNhcHRpb24oKGMpID0+ICh7IC4uLmMsIGFnZW50OiBjLmFnZW50ICsgdGV4dCwgY3JlYXRlVGltZTogYy5jcmVhdGVUaW1lIHx8IG5vd1NlYygpIH0pKSxcbiAgICBvblR1cm5Db21wbGV0ZTogKHR1cm4pID0+IHtcbiAgICAgIC8vIENvbW1pdCB0aGUgZmluaXNoZWQgdHVybiBzbyBpdCBzdGF5cyB2aXNpYmxlOyBjbGVhciB0aGUgaW4tcHJvZ3Jlc3MgY2FwdGlvbi5cbiAgICAgIHNldExpdmVUdXJucygocHJldikgPT4gWy4uLnByZXYsIHsgdXNlcjogdHVybi50cmFuc2NyaXB0LCBhZ2VudDogdHVybi5yZXNwb25zZSwgY3JlYXRlVGltZTogbm93U2VjKCkgfV0pO1xuICAgICAgc2V0TGl2ZUNhcHRpb24oeyB1c2VyOiAnJywgYWdlbnQ6ICcnLCBjcmVhdGVUaW1lOiAwIH0pO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8vIEZ1bGwgY29udmVyc2F0aW9uIHJlc2V0OiBuZXcgdGhyZWFkICsgY2xlYXJlZCBpbnB1dC9hdHRhY2htZW50cy9mb3JtcyBhbmQgYW55XG4gIC8vIGxpdmUtdm9pY2UgdHJhbnNjcmlwdC4gU2hhcmVkIGJ5IHRoZSByZXNldC1jb25maXJtIGRpYWxvZyBhbmQgdGhlIGVuZC1jYWxsIGJ1dHRvbi5cbiAgY29uc3QgcGVyZm9ybVJlc2V0ID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIHNldElucHV0VmFsdWUoJycpO1xuICAgIGNsZWFyQXR0YWNobWVudHMoKTtcbiAgICBhd2FpdCByZXNldENvbnZlcnNhdGlvbihyZUNhcHRjaGFUb2tlblJlZi5jdXJyZW50KTtcbiAgICBzZXRTZWxlY3RlZEZhcVF1ZXJ5KG51bGwpO1xuICAgIHNldFN1Ym1pdHRlZEZvcm1zKG5ldyBTZXQoKSk7XG4gICAgc2V0U3VibWl0dGluZ0Zvcm1JbmRleChudWxsKTtcbiAgICBzZXRMaXZlVHVybnMoW10pO1xuICB9LCBbY2xlYXJBdHRhY2htZW50cywgcmVzZXRDb252ZXJzYXRpb25dKTtcblxuICAvLyBTdGFydGluZyBhIGZyZXNoIGNhbGwgY2xlYXJzIHRoZSBwcmV2aW91cyBjYWxsJ3MgdHJhbnNjcmlwdCBidWJibGVzICsgY2FwdGlvbi5cbiAgY29uc3Qgc3RhcnRMaXZlQ2FsbCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRMaXZlVm9pY2VOb3RpY2UobnVsbCk7XG4gICAgc2V0TGl2ZUNhcHRpb24oeyB1c2VyOiAnJywgYWdlbnQ6ICcnLCBjcmVhdGVUaW1lOiAwIH0pO1xuICAgIHNldExpdmVUdXJucyhbXSk7XG4gICAgbGl2ZVZvaWNlLnN0YXJ0KCk7XG4gIH0sIFtsaXZlVm9pY2VdKTtcbiAgLy8gRW5kaW5nIGEgY2FsbCBzdG9wcyB0aGUgYXVkaW8gc3RyZWFtIGFuZCByZXNldHMgdGhlIGNvbnZlcnNhdGlvbiDigJQgc2FtZSBhcyB0aGVcbiAgLy8gXCJyZXNldCBjb252ZXJzYXRpb25cIiBhY3Rpb24g4oCUIHNvIHRoZSBuZXh0IGNhbGwgc3RhcnRzIGZyb20gYSBjbGVhbiB0aHJlYWQuXG4gIGNvbnN0IGVuZExpdmVDYWxsID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGxpdmVWb2ljZS5zdG9wKCk7XG4gICAgc2V0TGl2ZUNhcHRpb24oeyB1c2VyOiAnJywgYWdlbnQ6ICcnLCBjcmVhdGVUaW1lOiAwIH0pO1xuICAgIHZvaWQgcGVyZm9ybVJlc2V0KCk7XG4gIH0sIFtsaXZlVm9pY2UsIHBlcmZvcm1SZXNldF0pO1xuXG4gIC8vIEtlZXAgdGhlIGxpdmUgdHJhbnNjcmlwdCBpbiB2aWV3IGFzIGl0IGdyb3dzICh0aGUgc2Nyb2xsIG1hbmFnZXIgb25seSByZWFjdHNcbiAgLy8gdG8gY29tbWl0dGVkIGNoYXQgbWVzc2FnZXMsIG5vdCB0aGVzZSBsb2NhbCBsaXZlIGJ1YmJsZXMpLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghbGl2ZVZvaWNlLmlzQWN0aXZlKSByZXR1cm47XG4gICAgY29uc3QgZWwgPSBjaGF0Q29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgaWYgKGVsKSBlbC5zY3JvbGxUb3AgPSBlbC5zY3JvbGxIZWlnaHQ7XG4gIH0sIFtsaXZlQ2FwdGlvbiwgbGl2ZVR1cm5zLCBsaXZlVm9pY2UuaXNBY3RpdmUsIGNoYXRDb250YWluZXJSZWZdKTtcblxuICAvLyBSZW5kZXIgYSBzaW5nbGUgbGl2ZS12b2ljZSBidWJibGUgKGNvbW1pdHRlZCB0dXJuIG9yIHN0cmVhbWluZyBjYXB0aW9uKSBhcyBhblxuICAvLyBvcmRpbmFyeSBjaGF0IG1lc3NhZ2UsIHNvIGl0IGxvb2tzIGlkZW50aWNhbCB0byB0ZXh0LW1vZGUgYnViYmxlcy5cbiAgY29uc3QgcmVuZGVyTGl2ZUJ1YmJsZSA9IChcbiAgICBzcGVha2VyOiAnY3VzdG9tZXInIHwgJ2FnZW50JyxcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgY3JlYXRlVGltZTogbnVtYmVyLFxuICAgIGtleT86IHN0cmluZyxcbiAgKSA9PiAoXG4gICAgPENoYXRNZXNzYWdlQ29tcG9uZW50XG4gICAgICBrZXk9e2tleX1cbiAgICAgIG1lc3NhZ2U9e3sgY3JlYXRlX3RpbWU6IGNyZWF0ZVRpbWUsIHN0YXJ0X3RpbWU6IDAsIGVuZF90aW1lOiAwLjAxLCBzcGVha2VyLCB0ZXh0IH19XG4gICAgICB0aGVtZT17dGhlbWV9XG4gICAgICBlbmFibGVUeXBld3JpdGVyPXtmYWxzZX1cbiAgICAgIHRyYW5zbGF0aW9ucz17dHJhbnNsYXRpb25zfVxuICAgICAgbGFuZ3VhZ2U9e3Jlc29sdmVkTGFuZ3VhZ2V9XG4gICAgICBhZ2VudE5hbWU9e2FnZW50TmFtZX1cbiAgICAvPlxuICApO1xuXG4gIGNvbnN0IHBsYXlSZXNwb25zZUF1ZGlvID0gYXN5bmMgKHRleHQ6IHN0cmluZykgPT4ge1xuICAgIGlmICghYXVkaW9TZXJ2aWNlLmN1cnJlbnQgfHwgaXNQbGF5aW5nQXVkaW8pIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBzZXRJc1BsYXlpbmdBdWRpbyh0cnVlKTtcbiAgICAgIGNvbnN0IGF1ZGlvQmxvYiA9IGF3YWl0IGF1ZGlvU2VydmljZS5jdXJyZW50LnRleHRUb1NwZWVjaCh0ZXh0KTtcbiAgICAgIGF3YWl0IGF1ZGlvU2VydmljZS5jdXJyZW50LnBsYXlBdWRpbyhhdWRpb0Jsb2IpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAob25FcnJvcikge1xuICAgICAgICBvbkVycm9yKGVycm9yIGFzIEVycm9yKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0SXNQbGF5aW5nQXVkaW8oZmFsc2UpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBhdWRpb1VybEJ1aWxkZXIgPSB1c2VDYWxsYmFjaygobWVzc2FnZUlkOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gYCR7YmFzZVVybH0vYXBpL2NvbnZlcnNhdGlvbnMvJHtjb252ZXJzYXRpb25JZH0vbWVzc2FnZXMvJHttZXNzYWdlSWR9L2F1ZGlvYDtcbiAgfSwgW2Jhc2VVcmwsIGNvbnZlcnNhdGlvbklkXSk7XG5cbiAgY29uc3QgYXVkaW9IZWFkZXJzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgaDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGlmIChndWVzdFRva2VuKSB7XG4gICAgICBoWydBdXRob3JpemF0aW9uJ10gPSBgQmVhcmVyICR7Z3Vlc3RUb2tlbn1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBoWyd4LWFwaS1rZXknXSA9IGFwaUtleTtcbiAgICB9XG4gICAgaWYgKHRlbmFudCkgaFsneC10ZW5hbnQtaWQnXSA9IHRlbmFudDtcbiAgICByZXR1cm4gaDtcbiAgfSwgW2FwaUtleSwgdGVuYW50LCBndWVzdFRva2VuXSk7XG5cbiAgY29uc3QgW2F1dG9QbGF5QXVkaW9NZXNzYWdlSWQsIHNldEF1dG9QbGF5QXVkaW9NZXNzYWdlSWRdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IHByZXZNZXNzYWdlQ291bnRSZWYgPSB1c2VSZWY8bnVtYmVyPigwKTtcbiAgY29uc3QgaW5pdGlhbExvYWREb25lUmVmID0gdXNlUmVmKGZhbHNlKTtcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXVzZUF1ZGlvIHx8ICFtZXNzYWdlcy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBwcmV2Q291bnQgPSBwcmV2TWVzc2FnZUNvdW50UmVmLmN1cnJlbnQ7XG4gICAgcHJldk1lc3NhZ2VDb3VudFJlZi5jdXJyZW50ID0gbWVzc2FnZXMubGVuZ3RoO1xuICAgIGlmICghaW5pdGlhbExvYWREb25lUmVmLmN1cnJlbnQpIHtcbiAgICAgIGluaXRpYWxMb2FkRG9uZVJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2VzLmxlbmd0aCA8PSBwcmV2Q291bnQpIHJldHVybjtcbiAgICBjb25zdCBsYXN0ID0gbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV07XG4gICAgaWYgKGxhc3Quc3BlYWtlciA9PT0gJ2FnZW50JyAmJiBsYXN0LnR5cGUgPT09ICdhdWRpbycgJiYgbGFzdC5tZXNzYWdlX2lkKSB7XG4gICAgICBzZXRBdXRvUGxheUF1ZGlvTWVzc2FnZUlkKGxhc3QubWVzc2FnZV9pZCk7XG4gICAgfVxuICB9LCBbbWVzc2FnZXMsIHVzZUF1ZGlvXSk7XG5cbiAgY29uc3QgaGFuZGxlUXVlcnlDbGljayA9IGFzeW5jIChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKGlzQWdlbnRUeXBpbmcgfHwgaXNMb2FkaW5nKSByZXR1cm47XG5cbiAgICBzZXRTZWxlY3RlZEZhcVF1ZXJ5KHF1ZXJ5KTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZW5kTWVzc2FnZShxdWVyeSwgW10sIHsgZmFxX3F1ZXJ5OiBxdWVyeSB9LCByZUNhcHRjaGFUb2tlblJlZi5jdXJyZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVN0YXJ0Q29udmVyc2F0aW9uID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc0xvYWRpbmcpIHJldHVybjtcblxuICAgIHNldElucHV0VmFsdWUoJycpO1xuICAgIGNsZWFyQXR0YWNobWVudHMoKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzdGFydENvbnZlcnNhdGlvbihyZUNhcHRjaGFUb2tlblJlZi5jdXJyZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3RhcnRpbmcgY29udmVyc2F0aW9uJywgZXJyb3IpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVNZW51Q2xpY2sgPSAoKSA9PiB7XG4gICAgc2V0U2hvd01lbnUocHJldiA9PiAhcHJldik7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlUmVzZXRDbGljayA9ICgpID0+IHtcbiAgICBzZXRTaG93TWVudShmYWxzZSk7XG4gICAgc2V0U2hvd1Jlc2V0Q29uZmlybSh0cnVlKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVDb25maXJtUmVzZXQgPSAoKSA9PiB7XG4gICAgc2V0U2hvd1Jlc2V0Q29uZmlybShmYWxzZSk7XG4gICAgLy8gZW5kTGl2ZUNhbGwgc3RvcHMgYW55IGFjdGl2ZSBjYWxsIGFuZCBydW5zIHRoZSBmdWxsIHJlc2V0OyBoYXJtbGVzcyBpZiBub1xuICAgIC8vIGNhbGwgaXMgYWN0aXZlLCBzbyBib3RoIGVudHJ5IHBvaW50cyBzaGFyZSBvbmUgY29kZSBwYXRoLlxuICAgIGVuZExpdmVDYWxsKCk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlQ2FuY2VsUmVzZXQgPSAoKSA9PiB7XG4gICAgc2V0U2hvd1Jlc2V0Q29uZmlybShmYWxzZSk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlTGFuZ3VhZ2VDaGFuZ2UgPSAobGFuZzogc3RyaW5nKSA9PiB7XG4gICAgc2V0U2VsZWN0ZWRMYW5ndWFnZShsYW5nKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVSZUNhcHRjaGFWZXJpZnkgPSB1c2VDYWxsYmFjaygodG9rZW46IHN0cmluZykgPT4ge1xuICAgIHJlQ2FwdGNoYVRva2VuUmVmLmN1cnJlbnQgPSB0b2tlbjtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGFsbExhbmd1YWdlcyA9IFtcbiAgICB7IGNvZGU6ICdlbicsIG5hbWU6ICdFbmdsaXNoJyB9LFxuICAgIHsgY29kZTogJ2VzJywgbmFtZTogJ0VzcGHDsW9sJyB9LFxuICAgIHsgY29kZTogJ2ZyJywgbmFtZTogJ0ZyYW7Dp2FpcycgfSxcbiAgICB7IGNvZGU6ICdkZScsIG5hbWU6ICdEZXV0c2NoJyB9LFxuICAgIHsgY29kZTogJ2l0JywgbmFtZTogJ0l0YWxpYW5vJyB9LFxuICAgIHsgY29kZTogJ3B0JywgbmFtZTogJ1BvcnR1Z3XDqnMnIH0sXG4gICAgeyBjb2RlOiAnemgnLCBuYW1lOiAn5Lit5paHJyB9LFxuICBdO1xuICBjb25zdCBhdmFpbGFibGVMYW5ndWFnZXMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhZ2VudEF2YWlsYWJsZUxhbmd1YWdlcykpIHtcbiAgICAgIGNvbnN0IGFsbG93ZWQgPSBuZXcgU2V0KFxuICAgICAgICBhZ2VudEF2YWlsYWJsZUxhbmd1YWdlcy5tYXAoKGxhbmcpID0+IGxhbmcudG9Mb3dlckNhc2UoKSksXG4gICAgICApO1xuICAgICAgcmV0dXJuIGFsbExhbmd1YWdlcy5maWx0ZXIoKGxhbmcpID0+IGFsbG93ZWQuaGFzKGxhbmcuY29kZSkpO1xuICAgIH1cbiAgICByZXR1cm4gYWxsTGFuZ3VhZ2VzO1xuICB9LCBbYWdlbnRBdmFpbGFibGVMYW5ndWFnZXNdKTtcbiAgY29uc3QgaGFzTGFuZ3VhZ2VPcHRpb25zID0gYXZhaWxhYmxlTGFuZ3VhZ2VzLmxlbmd0aCA+IDA7XG5cbiAgLy8gUmVzb2x2ZSB0aGVtZSB2YWx1ZXNcbiAgY29uc3QgdGhlbWVQYXJhbXMgPSByZXNvbHZlVGhlbWUodGhlbWUpO1xuICBjb25zdCB7IHByaW1hcnlDb2xvciwgYmFja2dyb3VuZENvbG9yLCB0ZXh0Q29sb3IsIGZvbnRGYW1pbHksIGZvbnRTaXplIH0gPSB0aGVtZVBhcmFtcztcbiAgY29uc3QgZm9udFNpemVOdW1iZXIgPSB0eXBlb2YgZm9udFNpemUgPT09ICdzdHJpbmcnID8gcGFyc2VJbnQoZm9udFNpemUsIDEwKSA6ICh0eXBlb2YgZm9udFNpemUgPT09ICdudW1iZXInID8gZm9udFNpemUgOiAxNCk7XG5cbiAgY29uc3QgcG9zaXRpb24gPSBmbG9hdGluZ0NvbmZpZy5wb3NpdGlvbiB8fCAnYm90dG9tLXJpZ2h0JztcbiAgY29uc3Qgb2Zmc2V0ID0gZmxvYXRpbmdDb25maWcub2Zmc2V0IHx8IHsgeDogMjAsIHk6IDIwIH07XG4gIGNvbnN0IG9mZnNldFggPSBvZmZzZXQueCB8fCAyMDtcbiAgY29uc3Qgb2Zmc2V0WSA9IG9mZnNldC55IHx8IDIwO1xuXG4gIGNvbnN0IGlzRmxvYXRpbmdEb2NrZWQgPSBtb2RlID09PSAnZmxvYXRpbmcnICYmICFpc0Z1bGxzY3JlZW47XG5cbiAgLy8gQ29tcHV0ZWQgc3R5bGVzXG4gIGNvbnN0IGNvbnRhaW5lclN0eWxlID0gZ2V0Q29udGFpbmVyU3R5bGUoeyBpc0Z1bGxzY3JlZW4sIGlzRmxvYXRpbmdEb2NrZWQsIHdpbmRvd1dpZHRoLCB0OiB0aGVtZVBhcmFtcyB9KTtcbiAgY29uc3QgaGVhZGVyU3R5bGUgPSBnZXRIZWFkZXJTdHlsZSh0aGVtZVBhcmFtcyk7XG4gIGNvbnN0IGhlYWRlclRpdGxlU3R5bGUgPSBnZXRIZWFkZXJUaXRsZVN0eWxlKGZvbnRGYW1pbHkpO1xuICBjb25zdCBoZWFkZXJTdWJ0aXRsZVN0eWxlID0gZ2V0SGVhZGVyU3VidGl0bGVTdHlsZShmb250RmFtaWx5KTtcbiAgY29uc3QgbWVudVBvcHVwU3R5bGUgPSBnZXRNZW51UG9wdXBTdHlsZShiYWNrZ3JvdW5kQ29sb3IpO1xuICBjb25zdCBtZW51SXRlbVN0eWxlID0gZ2V0TWVudUl0ZW1TdHlsZSh0aGVtZVBhcmFtcyk7XG4gIGNvbnN0IGNvbnRlbnRDYXJkU3R5bGUgPSBnZXRDb250ZW50Q2FyZFN0eWxlKGJhY2tncm91bmRDb2xvcik7XG4gIGNvbnN0IHNlbmRCdXR0b25TdHlsZSA9IGdldFNlbmRCdXR0b25TdHlsZShwcmltYXJ5Q29sb3IpO1xuICBjb25zdCBwb3NzaWJsZVF1ZXJpZXNDb250YWluZXJTdHlsZSA9IGdldFBvc3NpYmxlUXVlcmllc0NvbnRhaW5lclN0eWxlKGZvbnRGYW1pbHkpO1xuICBjb25zdCBxdWVyeUJ1dHRvblN0eWxlID0gZ2V0UXVlcnlCdXR0b25TdHlsZSh0aGVtZVBhcmFtcyk7XG4gIGNvbnN0IGNvbmZpcm1PdmVybGF5U3R5bGUgPSBnZXRDb25maXJtT3ZlcmxheVN0eWxlKHNob3dSZXNldENvbmZpcm0pO1xuICBjb25zdCBjb25maXJtRGlhbG9nU3R5bGUgPSBnZXRDb25maXJtRGlhbG9nU3R5bGUodGhlbWVQYXJhbXMpO1xuICBjb25zdCBkaXNjbGFpbWVyU3R5bGUgPSBnZXREaXNjbGFpbWVyU3R5bGUoZm9udEZhbWlseSk7XG5cbiAgY29uc3QgdGV4dEFyZWFGb250U2l6ZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICh3aW5kb3dXaWR0aCA8PSA3NjgpIHtcbiAgICAgIHJldHVybiBNYXRoLm1heCgxNiwgZm9udFNpemVOdW1iZXIpICsgJ3B4JztcbiAgICB9XG4gICAgcmV0dXJuIGZvbnRTaXplO1xuICB9LCBbd2luZG93V2lkdGgsIGZvbnRTaXplLCBmb250U2l6ZU51bWJlcl0pO1xuXG4gIGNvbnN0IHRleHRBcmVhTGluZUhlaWdodCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IHNpemUgPSB3aW5kb3dXaWR0aCA8PSA3NjggPyBNYXRoLm1heCgxNiwgZm9udFNpemVOdW1iZXIpIDogZm9udFNpemVOdW1iZXI7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoc2l6ZSAqIDEuNSk7XG4gIH0sIFt3aW5kb3dXaWR0aCwgZm9udFNpemVOdW1iZXJdKTtcblxuICBjb25zdCB0ZXh0QXJlYU1heEhlaWdodENhbGN1bGF0ZWQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4gdGV4dEFyZWFMaW5lSGVpZ2h0ICogMztcbiAgfSwgW3RleHRBcmVhTGluZUhlaWdodF0pO1xuXG4gIGNvbnN0IHRleHRBcmVhU3R5bGUgPSBnZXRUZXh0QXJlYVN0eWxlKHtcbiAgICB0ZXh0QXJlYUZvbnRTaXplLFxuICAgIGZvbnRGYW1pbHksXG4gICAgdGV4dEFyZWFMaW5lSGVpZ2h0LFxuICAgIHRleHRBcmVhTWF4SGVpZ2h0Q2FsY3VsYXRlZCxcbiAgICB0ZXh0Q29sb3IsXG4gIH0pO1xuXG4gIC8vIEEgZm9ybV9yZXF1ZXN0IGlzIFwiYW5zd2VyZWRcIiBvbmNlIHRoZSB2aXNpdG9yIGhhcyByZXNwb25kZWQgdG8gaXQuIEJlc2lkZXMgdGhlXG4gIC8vIG9wdGltaXN0aWMgaW4tc2Vzc2lvbiBmbGFnIChgc3VibWl0dGVkRm9ybXNgKSwgd2UgYWxzbyB0cmVhdCBpdCBhcyBhbnN3ZXJlZCB3aGVuIGFcbiAgLy8gbGF0ZXIgY3VzdG9tZXIgbWVzc2FnZSBleGlzdHMg4oCUIHRoYXQgc3Vydml2ZXMgYSBwYWdlIHJlbG9hZCAod2hlcmUgYHN1Ym1pdHRlZEZvcm1zYFxuICAvLyBpcyBnb25lKSwgc28gYSBjb21wbGV0ZWQgZm9ybSBuZXZlciByZWFwcGVhcnMgYWZ0ZXIgcmVmcmVzaC5cbiAgY29uc3QgaXNGb3JtQW5zd2VyZWQgPSAoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICAgIGlmIChzdWJtaXR0ZWRGb3Jtcy5oYXMoaW5kZXgpKSByZXR1cm4gdHJ1ZTtcbiAgICBmb3IgKGxldCBqID0gaW5kZXggKyAxOyBqIDwgbWVzc2FnZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChtZXNzYWdlc1tqXS5zcGVha2VyID09PSAnY3VzdG9tZXInKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIGNvbnN0IGhhc1BlbmRpbmdGb3JtID0gbWVzc2FnZXMuc29tZShcbiAgICAobXNnLCBpZHgpID0+XG4gICAgICBtc2cudHlwZSA9PT0gJ2Zvcm1fcmVxdWVzdCcgJiYgbXNnLnNwZWFrZXIgPT09ICdhZ2VudCcgJiYgIWlzRm9ybUFuc3dlcmVkKGlkeCksXG4gICk7XG5cbiAgY29uc3QgcGVuZGluZ0Zvcm0gPSB1c2VNZW1vKCgpID0+IHtcbiAgICBmb3IgKGxldCBpID0gbWVzc2FnZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG1zZyA9IG1lc3NhZ2VzW2ldO1xuICAgICAgaWYgKG1zZy50eXBlID09PSAnZm9ybV9yZXF1ZXN0JyAmJiBtc2cuc3BlYWtlciA9PT0gJ2FnZW50JyAmJiAhaXNGb3JtQW5zd2VyZWQoaSkpIHtcbiAgICAgICAgdHJ5IHsgcmV0dXJuIHsgc2NoZW1hOiBsb2NhbGl6ZUZvcm0oSlNPTi5wYXJzZShtc2cudGV4dCkpLCBpbmRleDogaSB9OyB9XG4gICAgICAgIGNhdGNoIHsgLyogc2tpcCAqLyB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW21lc3NhZ2VzLCBzdWJtaXR0ZWRGb3JtcywgbG9jYWxpemVGb3JtXSk7XG5cbiAgY29uc3QgaXNTZW5kRGlzYWJsZWQgPSAoaW5wdXRWYWx1ZS50cmltKCkgPT09ICcnICYmIGF0dGFjaG1lbnRzLmxlbmd0aCA9PT0gMCkgfHwgaXNBZ2VudFR5cGluZyB8fCBoYXNQZW5kaW5nRm9ybTtcblxuICBjb25zdCBhdXRvUmVzaXplVGV4dEFyZWEgPSAoKSA9PiB7XG4gICAgY29uc3QgZWwgPSB0ZXh0QXJlYVJlZi5jdXJyZW50O1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBlbC5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XG4gICAgY29uc3QgbmV3SGVpZ2h0ID0gTWF0aC5taW4oZWwuc2Nyb2xsSGVpZ2h0LCB0ZXh0QXJlYU1heEhlaWdodENhbGN1bGF0ZWQpO1xuICAgIGVsLnN0eWxlLmhlaWdodCA9IGAke25ld0hlaWdodH1weGA7XG4gICAgZWwuc3R5bGUub3ZlcmZsb3dZID0gZWwuc2Nyb2xsSGVpZ2h0ID4gdGV4dEFyZWFNYXhIZWlnaHRDYWxjdWxhdGVkID8gJ2F1dG8nIDogJ2hpZGRlbic7XG4gIH07XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBhdXRvUmVzaXplVGV4dEFyZWEoKTtcbiAgfSwgW2lucHV0VmFsdWUsIHRleHRBcmVhTWF4SGVpZ2h0Q2FsY3VsYXRlZF0pO1xuXG4gIGNvbnN0IHNob3dBZ2VudERpc2NsYWltZXIgPSBCb29sZWFuKGlucHV0RGlzY2xhaW1lckh0bWwpO1xuICBjb25zdCBhZ2VudERpc2NsYWltZXJDb250ZW50ID0gc2hvd0FnZW50RGlzY2xhaW1lciAmJiAoXG4gICAgPHNwYW4gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3sgX19odG1sOiBpbnB1dERpc2NsYWltZXJIdG1sISB9fSAvPlxuICApO1xuXG4gIGNvbnN0IGZsb2F0aW5nQ29udGFpbmVyU3R5bGUgPSBnZXRGbG9hdGluZ0NvbnRhaW5lclN0eWxlKHtcbiAgICBtb2RlLFxuICAgIGlzRnVsbHNjcmVlbixcbiAgICB3aW5kb3dXaWR0aCxcbiAgICB3aW5kb3dIZWlnaHQsXG4gICAgcG9zaXRpb24sXG4gICAgb2Zmc2V0WCxcbiAgICBvZmZzZXRZLFxuICB9KTtcblxuICBjb25zdCByZW5kZXJMYW5ndWFnZVNlbGVjdG9yID0gKCkgPT4ge1xuICAgIGlmICghU0hPV19DSEFUX0xBTkdVQUdFX1NFTEVDVE9SKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIWhhc0xhbmd1YWdlT3B0aW9ucyB8fCAoY29udmVyc2F0aW9uSWQgJiYgIWlzRmluYWxpemVkKSB8fCBtZXNzYWdlcy5sZW5ndGggPiAwIHx8IGhhc1VzZXJNZXNzYWdlcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8TGFuZ3VhZ2VTZWxlY3RvclxuICAgICAgICBhdmFpbGFibGVMYW5ndWFnZXM9e2F2YWlsYWJsZUxhbmd1YWdlc31cbiAgICAgICAgc2VsZWN0ZWRMYW5ndWFnZT17cmVzb2x2ZWRMYW5ndWFnZX1cbiAgICAgICAgb25MYW5ndWFnZUNoYW5nZT17aGFuZGxlTGFuZ3VhZ2VDaGFuZ2V9XG4gICAgICAgIHRyYW5zbGF0aW9ucz17dHJhbnNsYXRpb25zfVxuICAgICAgICB0aGVtZT17dGhlbWV9XG4gICAgICAvPlxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgcmVuZGVyV2l0aFJlQ2FwdGNoYSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghcmVDYXB0Y2hhS2V5KSB7XG4gICAgICByZXR1cm4gKGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUpID0+IDw+e2NoaWxkcmVufTwvPjtcbiAgICB9XG5cbiAgICByZXR1cm4gKGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUpID0+IChcbiAgICAgIDxHb29nbGVSZUNhcHRjaGFQcm92aWRlciByZUNhcHRjaGFLZXk9e3JlQ2FwdGNoYUtleSB8fCAnJ30+XG4gICAgICAgIDxHb29nbGVSZUNhcHRjaGFcbiAgICAgICAgICBhY3Rpb249XCJnZW5hc3Npc3RfY2hhdFwiXG4gICAgICAgICAgb25WZXJpZnk9e2hhbmRsZVJlQ2FwdGNoYVZlcmlmeX1cbiAgICAgICAgICByZWZyZXNoUmVDYXB0Y2hhPXtmYWxzZX1cbiAgICAgICAgLz5cbiAgICAgICAgPD57Y2hpbGRyZW59PC8+XG4gICAgICA8L0dvb2dsZVJlQ2FwdGNoYVByb3ZpZGVyPlxuICAgICk7XG4gIH0sIFtyZUNhcHRjaGFLZXksIGhhbmRsZVJlQ2FwdGNoYVZlcmlmeV0pO1xuXG4gIGNvbnN0IHJlbmRlckNoYXRDb21wb25lbnQgPSAoKSA9PiAoXG4gICAgPGRpdiBzdHlsZT17Y29udGFpbmVyU3R5bGV9IGRhdGEtZ2VuYXNzaXN0LXJvb3Q9XCJ0cnVlXCI+XG4gICAgICA8c3R5bGU+e0NTU19LRVlGUkFNRVN9PC9zdHlsZT5cbiAgICAgIDxkaXYgc3R5bGU9e2hlYWRlclN0eWxlfSByZWY9e2hlYWRlclJlZn0+XG4gICAgICAgIDxkaXYgc3R5bGU9e2xvZ29Db250YWluZXJTdHlsZX0+XG4gICAgICAgICAgPGltZyBzcmM9e2xvZ29Vcmw/LnRyaW0oKSB8fCBjaGF0TG9nb30gYWx0PVwiTG9nb1wiIHN0eWxlPXtsb2dvU3R5bGV9IC8+XG4gICAgICAgICAgPGRpdiBzdHlsZT17aGVhZGVyVGl0bGVDb250YWluZXJTdHlsZX0+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPXtoZWFkZXJUaXRsZVN0eWxlfT57aGVhZGVyVGl0bGV9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPXtoZWFkZXJTdWJ0aXRsZVN0eWxlfT5cbiAgICAgICAgICAgICAge2Rlc2NyaXB0aW9uID8/IHQoJ2hlYWRlci5zdWJ0aXRsZScpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPXt7IGRpc3BsYXk6ICdmbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGdhcDogJzhweCcgfX0+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgc3R5bGU9e21lbnVCdXR0b25TdHlsZX1cbiAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZU1lbnVDbGlja31cbiAgICAgICAgICAgIHRpdGxlPXt0KCdtZW51LnRpdGxlJyl9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPE1vcmVWZXJ0aWNhbCBzaXplPXsyNH0gY29sb3I9XCIjMTExMTExXCIgLz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB7bW9kZSA9PT0gJ2Zsb2F0aW5nJyAmJiAoXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHN0eWxlPXttZW51QnV0dG9uU3R5bGV9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldElzRmxvYXRpbmdPcGVuKGZhbHNlKX1cbiAgICAgICAgICAgICAgdGl0bGU9XCJDbG9zZSBjaGF0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPFggc2l6ZT17MjR9IGNvbG9yPVwiIzExMTExMVwiIC8+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgeyFub0NvbG9yQW5pbWF0aW9uICYmIHNob3dCYWNrbGlnaHQgJiYgKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgIHJpZ2h0OiAwLFxuICAgICAgICAgICAgdG9wOiBNYXRoLm1heCgwLCBoZWFkZXJIZWlnaHQgLSAxNCksXG4gICAgICAgICAgICBoZWlnaHQ6IDQyLFxuICAgICAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgICAgICAgekluZGV4OiAxLFxuICAgICAgICAgICAgb3BhY2l0eTogaXNBZ2VudFR5cGluZyA/IDEgOiAwLFxuICAgICAgICAgICAgdHJhbnNpdGlvbjogJ29wYWNpdHkgNDIwbXMgZWFzZS1pbi1vdXQnLFxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgICAgdG9wOiA2LFxuICAgICAgICAgICAgICBoZWlnaHQ6IDMyLFxuICAgICAgICAgICAgICB3aWR0aDogJzc4JScsXG4gICAgICAgICAgICAgIGZpbHRlcjogJ2JsdXIoMjJweCknLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kOlxuICAgICAgICAgICAgICAgIGBsaW5lYXItZ3JhZGllbnQoOTBkZWcsICR7aGV4VG9SZ2JhKHByaW1hcnlDb2xvciwgMC4wKX0gMCUsICR7aGV4VG9SZ2JhKHByaW1hcnlDb2xvciwgMC4zNSl9IDE1JSwgJHtoZXhUb1JnYmEocHJpbWFyeUNvbG9yLCAwLjU1KX0gNTAlLCAke2hleFRvUmdiYShwcmltYXJ5Q29sb3IsIDAuMzUpfSA4NSUsICR7aGV4VG9SZ2JhKHByaW1hcnlDb2xvciwgMC4wKX0gMTAwJSlgLFxuICAgICAgICAgICAgICB3aWxsQ2hhbmdlOiAndHJhbnNmb3JtLCBvcGFjaXR5JyxcbiAgICAgICAgICAgICAgYW5pbWF0aW9uOiAnZ2EtYmFja2xpZ2h0LXN3ZWVwMiAxLjJzIGN1YmljLWJlemllcigwLjQsMC4wLDAuMiwxKSBpbmZpbml0ZSBhbHRlcm5hdGUsIGdhLWJhY2tsaWdodC1wdWxzZSAyLjRzIGVhc2UtaW4tb3V0IGluZmluaXRlJyxcbiAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAxOCxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuXG4gICAgICB7c2hvd01lbnUgJiYgKFxuICAgICAgICA8ZGl2IHJlZj17bWVudVJlZn0gc3R5bGU9e21lbnVQb3B1cFN0eWxlfT5cbiAgICAgICAgICA8ZGl2IHN0eWxlPXttZW51SXRlbVN0eWxlfSBvbkNsaWNrPXtoYW5kbGVSZXNldENsaWNrfT5cbiAgICAgICAgICAgIDxSZWZyZXNoQ3cgc2l6ZT17MTZ9IC8+XG4gICAgICAgICAgICB7dCgnbWVudS5yZXNldENvbnZlcnNhdGlvbicpfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIHttb2RlICE9PSAnZnVsbHNjcmVlbicgJiYgKFxuICAgICAgICAgICAgPGRpdiBzdHlsZT17bWVudUl0ZW1TdHlsZX0gb25DbGljaz17aGFuZGxlRnVsbHNjcmVlblRvZ2dsZX0+XG4gICAgICAgICAgICAgIHtpc0Z1bGxzY3JlZW4gPyA8TWluaW1pemUyIHNpemU9ezE2fSAvPiA6IDxNYXhpbWl6ZTIgc2l6ZT17MTZ9IC8+fVxuICAgICAgICAgICAgICB7dCgnbWVudS5mdWxsc2NyZWVuJyl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICAgIHtoYXNMYW5ndWFnZU9wdGlvbnMgJiYgKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBzdHlsZT17eyAuLi5tZW51SXRlbVN0eWxlLCBwb3NpdGlvbjogJ3JlbGF0aXZlJywgYm9yZGVyQm90dG9tOiAnbm9uZScgfX1cbiAgICAgICAgICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIHNldFNob3dMYW5ndWFnZURyb3Bkb3duKCFzaG93TGFuZ3VhZ2VEcm9wZG93bik7XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxHbG9iZSBzaXplPXsxNn0gLz5cbiAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9e3sgZmxleDogMSB9fT57dCgnbWVudS5sYW5ndWFnZScpfTwvc3Bhbj5cbiAgICAgICAgICAgICAge3Nob3dMYW5ndWFnZURyb3Bkb3duICYmIChcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIHRvcDogJzEwMCUnLFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6ICc0cHgnLFxuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnOHB4JyxcbiAgICAgICAgICAgICAgICAgICAgYm94U2hhZG93OiAnMCAycHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMSknLFxuICAgICAgICAgICAgICAgICAgICBtaW5XaWR0aDogJzE4MHB4JyxcbiAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6ICcyMDBweCcsXG4gICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICAgICAgICAgICAgICAgekluZGV4OiAxMDAxLFxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHthdmFpbGFibGVMYW5ndWFnZXMubWFwKChsYW5nLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAga2V5PXtsYW5nLmNvZGV9XG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2FwOiAnOHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6ICcxMHB4IDE1cHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IHRleHRDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogcmVzb2x2ZWRMYW5ndWFnZSA9PT0gbGFuZy5jb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gKHRoZW1lPy5zZWNvbmRhcnlDb2xvciB8fCAnI2Y1ZjVmNScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlckJvdHRvbTogaW5kZXggPCBhdmFpbGFibGVMYW5ndWFnZXMubGVuZ3RoIC0gMSA/ICcxcHggc29saWQgI2YwZjBmMCcgOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9udEZhbWlseSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246ICdiYWNrZ3JvdW5kLWNvbG9yIDAuMnMgZWFzZScsXG4gICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICBvbk1vdXNlRW50ZXI9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRMYW5ndWFnZSAhPT0gbGFuZy5jb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUuY3VycmVudFRhcmdldC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGVtZT8uc2Vjb25kYXJ5Q29sb3IgfHwgJyNmNWY1ZjUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgb25Nb3VzZUxlYXZlPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkTGFuZ3VhZ2UgIT09IGxhbmcuY29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBlLmN1cnJlbnRUYXJnZXQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3RyYW5zcGFyZW50JztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTGFuZ3VhZ2VDaGFuZ2UobGFuZy5jb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFNob3dMYW5ndWFnZURyb3Bkb3duKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFNob3dNZW51KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge2xhbmcubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cblxuICAgICAgPGRpdiBzdHlsZT17Y29udGVudENhcmRTdHlsZX0+XG4gICAgICAgIDxkaXYgc3R5bGU9e2NoYXRDb250YWluZXJTdHlsZX0gcmVmPXtjaGF0Q29udGFpbmVyUmVmfT5cbiAgICAgICAgICB7cmVuZGVyTGFuZ3VhZ2VTZWxlY3RvcigpfVxuXG4gICAgICAgICAgeygoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRTaG93U3ludGhldGljV2VsY29tZSA9XG4gICAgICAgICAgICAgIHNob3dXZWxjb21lQmVmb3JlU3RhcnQgJiZcbiAgICAgICAgICAgICAgIWhhc1VzZXJNZXNzYWdlcyAmJlxuICAgICAgICAgICAgICAobWVzc2FnZXMubGVuZ3RoID09PSAwIHx8IG1lc3NhZ2VzWzBdLnNwZWFrZXIgIT09ICdhZ2VudCcpICYmXG4gICAgICAgICAgICAgIChCb29sZWFuKHdlbGNvbWVUaXRsZSkgfHwgQm9vbGVhbih3ZWxjb21lSW1hZ2VVcmwpIHx8IEJvb2xlYW4od2VsY29tZU1lc3NhZ2UpKVxuICAgICAgICAgICAgICAmJiBjb252ZXJzYXRpb25JZDtcblxuICAgICAgICAgICAgaWYgKCFzaG91bGRTaG93U3ludGhldGljV2VsY29tZSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgICAgICAgY29uc3Qgc3ludGhldGljV2VsY29tZTogQ2hhdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgIGNyZWF0ZV90aW1lOiBub3csXG4gICAgICAgICAgICAgIHN0YXJ0X3RpbWU6IDAsXG4gICAgICAgICAgICAgIGVuZF90aW1lOiAwLjAxLFxuICAgICAgICAgICAgICBzcGVha2VyOiAnYWdlbnQnLFxuICAgICAgICAgICAgICB0ZXh0OiB3ZWxjb21lTWVzc2FnZSB8fCAnJyxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIDxDaGF0TWVzc2FnZUNvbXBvbmVudFxuICAgICAgICAgICAgICAgIGtleT1cIl9fc3ludGhldGljX3dlbGNvbWVfX1wiXG4gICAgICAgICAgICAgICAgbWVzc2FnZT17c3ludGhldGljV2VsY29tZX1cbiAgICAgICAgICAgICAgICB0aGVtZT17dGhlbWV9XG4gICAgICAgICAgICAgICAgaXNGaXJzdE1lc3NhZ2U9e3RydWV9XG4gICAgICAgICAgICAgICAgaXNOZXh0U2FtZVNwZWFrZXI9e2ZhbHNlfVxuICAgICAgICAgICAgICAgIGlzUHJldlNhbWVTcGVha2VyPXtmYWxzZX1cbiAgICAgICAgICAgICAgICBlbmFibGVUeXBld3JpdGVyPXtmYWxzZX1cbiAgICAgICAgICAgICAgICB3ZWxjb21lSW1hZ2VVcmw9e3dlbGNvbWVJbWFnZVVybCB8fCB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgd2VsY29tZVRpdGxlPXt3ZWxjb21lVGl0bGUgfHwgdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAgIHBvc3NpYmxlUXVlcmllcz17cG9zc2libGVRdWVyaWVzfVxuICAgICAgICAgICAgICAgIG9uUXVpY2tRdWVyeT17aGFuZGxlUXVlcnlDbGlja31cbiAgICAgICAgICAgICAgICBvblF1aWNrQWN0aW9uPXtoYW5kbGVRdWlja0FjdGlvbn1cbiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbnM9e3RyYW5zbGF0aW9uc31cbiAgICAgICAgICAgICAgICBsYW5ndWFnZT17cmVzb2x2ZWRMYW5ndWFnZX1cbiAgICAgICAgICAgICAgICBhZ2VudE5hbWU9e2FnZW50TmFtZX1cbiAgICAgICAgICAgICAgICBpc0FnZW50VHlwaW5nPXtpc0FnZW50VHlwaW5nfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KSgpfVxuICAgICAgICAgIHsoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RBZ2VudEluZGV4ID0gbWVzc2FnZXMuZmluZEluZGV4KG0gPT4gbS5zcGVha2VyID09PSAnYWdlbnQnKTtcblxuICAgICAgICAgICAgLy8gTGl2ZS12b2ljZSB0dXJucyBhcmUgcmVuZGVyZWQgbG9jYWxseSAoYmVsb3cpIHRoZSBtb21lbnQgdGhleSBmaW5pc2guXG4gICAgICAgICAgICAvLyBFYWNoIGlzIGFsc28gcGVyc2lzdGVkIGFuZCBicm9hZGNhc3QgYmFjayBpbnRvIGBtZXNzYWdlc2A7IHN1cHByZXNzIHRoYXRcbiAgICAgICAgICAgIC8vIGNvcHkgc28gYSB0dXJuIGlzbid0IHNob3duIHR3aWNlIChhbmQgbmV2ZXIgYmxpbmtzIGFzIHRoZSB0d28gc3dhcCkuXG4gICAgICAgICAgICBjb25zdCBsaXZlVHVybktleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdHVybiBvZiBsaXZlVHVybnMpIHtcbiAgICAgICAgICAgICAgaWYgKHR1cm4udXNlci50cmltKCkpIGxpdmVUdXJuS2V5cy5hZGQoYGN1c3RvbWVyOiR7dHVybi51c2VyLnRyaW0oKX1gKTtcbiAgICAgICAgICAgICAgaWYgKHR1cm4uYWdlbnQudHJpbSgpKSBsaXZlVHVybktleXMuYWRkKGBhZ2VudDoke3R1cm4uYWdlbnQudHJpbSgpfWApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBhcHBseU1lc3NhZ2VGaWx0ZXIgPSAobWVzc2FnZTogQ2hhdE1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gJ2ZpbGUnKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIGlmIChsaXZlVHVybktleXMuaGFzKGAke21lc3NhZ2Uuc3BlYWtlcn06JHsobWVzc2FnZS50ZXh0IHx8ICcnKS50cmltKCl9YCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlcy5maWx0ZXIoYXBwbHlNZXNzYWdlRmlsdGVyKS5tYXAoKG1lc3NhZ2UsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChtZXNzYWdlLnR5cGUgPT09ICdmb3JtX3JlcXVlc3QnICYmIG1lc3NhZ2Uuc3BlYWtlciA9PT0gJ2FnZW50Jykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBmb3JtU2NoZW1hID0gbG9jYWxpemVGb3JtKEpTT04ucGFyc2UobWVzc2FnZS50ZXh0KSk7XG4gICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHJlYWwgbWVzc2FnZSBwb3NpdGlvbiAoZmlsdGVyaW5nIGNhbiBzaGlmdCB0aGUgbWFwIGluZGV4KSBzbyB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGFuc3dlcmVkIGNoZWNrIG1hdGNoZXMgdGhlIG92ZXJsYXkvZm9vdGVyIHBhdGggYW5kIHN1cnZpdmVzIHJlbG9hZC5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsSW5kZXggPSBtZXNzYWdlcy5pbmRleE9mKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgaXNQZW5kaW5nID0gIWlzRm9ybUFuc3dlcmVkKG9yaWdpbmFsSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBrZXk9e2luZGV4fSBzdHlsZT17eyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBtYXhXaWR0aDogJzg1JScsIG1hcmdpbkJvdHRvbTogJzhweCcgfX0+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17eyBmb250U2l6ZTogJzE0cHgnLCBjb2xvcjogJyMwMDAwMDAnLCBmb250V2VpZ2h0OiA2MDAsIG1hcmdpbkJvdHRvbTogNCB9fT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHthZ2VudE5hbWUgfHwgJ0FnZW50J31cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICB7Zm9ybURpc3BsYXkgPT09ICdpbmxpbmUnICYmIGlzUGVuZGluZyA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxEeW5hbWljRm9ybU1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hPXtmb3JtU2NoZW1hfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBvblN1Ym1pdD17KGRhdGEpID0+IGhhbmRsZUZvcm1TdWJtaXQoZGF0YSwgb3JpZ2luYWxJbmRleCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsPXsoKSA9PiBoYW5kbGVGb3JtQ2FuY2VsKG9yaWdpbmFsSW5kZXgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc1N1Ym1pdHRpbmc9e3N1Ym1pdHRpbmdGb3JtSW5kZXggPT09IG9yaWdpbmFsSW5kZXh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzU3VibWl0dGVkPXtmYWxzZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUNvbG9yPXtwcmltYXJ5Q29sb3J9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk9e2ZvbnRGYW1pbHl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJjYXJkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnI2YzZjRmNicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzEycHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAnMTBweCAxNHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6ICcxNHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjMzc0MTUxJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udEZhbWlseSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH19PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7Zm9ybVNjaGVtYS5tZXNzYWdlIHx8ICdQbGVhc2UgZmlsbCB0aGUgZm9ybSBiZWxvdy4nfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIG5vcm1hbCByZW5kZXJpbmcgaWYgSlNPTiBwYXJzZSBmYWlsc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IGlzTmV4dFNhbWVTcGVha2VyID0gaW5kZXggPCBtZXNzYWdlcy5sZW5ndGggLSAxICYmIG1lc3NhZ2VzW2luZGV4ICsgMV0uc3BlYWtlciA9PT0gbWVzc2FnZS5zcGVha2VyO1xuICAgICAgICAgICAgICBjb25zdCBpc1ByZXZTYW1lU3BlYWtlciA9IGluZGV4ID4gMCAmJiBtZXNzYWdlc1tpbmRleCAtIDFdLnNwZWFrZXIgPT09IG1lc3NhZ2Uuc3BlYWtlcjtcbiAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgYWdlbnQgZ3JlZXRzIG9uIHN0YXJ0LCB0aGF0IGdyZWV0aW5nIGlzIGEgbm9ybWFsIHJlcGx5IOKAlCBub3QgdGhlXG4gICAgICAgICAgICAgIC8vIFwid2VsY29tZVwiIG1lc3NhZ2Ug4oCUIHNvIGRvbid0IGdpdmUgaXQgdGhlIGZpcnN0LW1lc3NhZ2Ugd2VsY29tZSB0cmVhdG1lbnRcbiAgICAgICAgICAgICAgLy8gKHdoaWNoIHdvdWxkIHNwbGl0IGl0cyB0ZXh0IGludG8gYSBiaWcgdGl0bGUgKyBib2R5KS5cbiAgICAgICAgICAgICAgY29uc3QgaXNGaXJzdEFnZW50TWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgaW5kZXggPT09IGZpcnN0QWdlbnRJbmRleCAmJiBtZXNzYWdlLnNwZWFrZXIgPT09ICdhZ2VudCcgJiYgIWhhc1VzZXJNZXNzYWdlcyAmJiAhc2hvdWxkVHJpZ2dlclN0YXJ0Rm9ybTtcbiAgICAgICAgICAgICAgY29uc3QgZGlzcGxheU1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgIGlzRmlyc3RBZ2VudE1lc3NhZ2UgJiYgd2VsY29tZU1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgID8geyAuLi5tZXNzYWdlLCB0ZXh0OiB3ZWxjb21lTWVzc2FnZSB9XG4gICAgICAgICAgICAgICAgICA6IG1lc3NhZ2U7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8Q2hhdE1lc3NhZ2VDb21wb25lbnRcbiAgICAgICAgICAgICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgICAgICAgICAgICBtZXNzYWdlPXtkaXNwbGF5TWVzc2FnZX1cbiAgICAgICAgICAgICAgICAgIHRoZW1lPXt0aGVtZX1cbiAgICAgICAgICAgICAgICAgIG9uUGxheUF1ZGlvPXttZXNzYWdlLnNwZWFrZXIgPT09ICdhZ2VudCcgPyBwbGF5UmVzcG9uc2VBdWRpbyA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICAgIGlzUGxheWluZ0F1ZGlvPXtpc1BsYXlpbmdBdWRpb31cbiAgICAgICAgICAgICAgICAgIGlzRmlyc3RNZXNzYWdlPXtpc0ZpcnN0QWdlbnRNZXNzYWdlfVxuICAgICAgICAgICAgICAgICAgaXNOZXh0U2FtZVNwZWFrZXI9e2lzTmV4dFNhbWVTcGVha2VyfVxuICAgICAgICAgICAgICAgICAgaXNQcmV2U2FtZVNwZWFrZXI9e2lzUHJldlNhbWVTcGVha2VyfVxuICAgICAgICAgICAgICAgICAgb25GZWVkYmFjaz17KG1lc3NhZ2VJZCwgdmFsdWUpID0+IGFkZEZlZWRiYWNrKG1lc3NhZ2VJZCwgdmFsdWUpfVxuICAgICAgICAgICAgICAgICAgZW5hYmxlVHlwZXdyaXRlcj17aW5kZXggPT09IG1lc3NhZ2VzLmxlbmd0aCAtIDEgJiYgbWVzc2FnZS5zcGVha2VyID09PSAnYWdlbnQnfVxuICAgICAgICAgICAgICAgICAgd2VsY29tZUltYWdlVXJsPXtpc0ZpcnN0QWdlbnRNZXNzYWdlID8gKHdlbGNvbWVJbWFnZVVybCB8fCB1bmRlZmluZWQpIDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAgICAgd2VsY29tZVRpdGxlPXtpc0ZpcnN0QWdlbnRNZXNzYWdlID8gKHdlbGNvbWVUaXRsZSB8fCB1bmRlZmluZWQpIDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAgICAgcG9zc2libGVRdWVyaWVzPXtpc0ZpcnN0QWdlbnRNZXNzYWdlID8gcG9zc2libGVRdWVyaWVzIDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAgICAgb25RdWlja1F1ZXJ5PXtoYW5kbGVRdWVyeUNsaWNrfVxuICAgICAgICAgICAgICAgICAgb25RdWlja0FjdGlvbj17aGFuZGxlUXVpY2tBY3Rpb259XG4gICAgICAgICAgICAgICAgICBvblNjaGVkdWxlQ29uZmlybT17aGFuZGxlU2NoZWR1bGVDb25maXJtfVxuICAgICAgICAgICAgICAgICAgaXNMYXN0TWVzc2FnZT17aW5kZXggPT09IG1lc3NhZ2VzLmxlbmd0aCAtIDEgJiYgbWVzc2FnZS5zcGVha2VyID09PSAnYWdlbnQnfVxuICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb25zPXt0cmFuc2xhdGlvbnN9XG4gICAgICAgICAgICAgICAgICBsYW5ndWFnZT17cmVzb2x2ZWRMYW5ndWFnZX1cbiAgICAgICAgICAgICAgICAgIGFnZW50TmFtZT17YWdlbnROYW1lfVxuICAgICAgICAgICAgICAgICAgaXNBZ2VudFR5cGluZz17aXNBZ2VudFR5cGluZ31cbiAgICAgICAgICAgICAgICAgIGF1ZGlvVXJsQnVpbGRlcj17bWVzc2FnZS50eXBlID09PSAnYXVkaW8nICYmIHVzZUF1ZGlvID8gYXVkaW9VcmxCdWlsZGVyIDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAgICAgYXVkaW9IZWFkZXJzPXttZXNzYWdlLnR5cGUgPT09ICdhdWRpbycgJiYgdXNlQXVkaW8gPyBhdWRpb0hlYWRlcnMgOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICBhdXRvUGxheUF1ZGlvTWVzc2FnZUlkPXthdXRvUGxheUF1ZGlvTWVzc2FnZUlkfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KSgpfVxuICAgICAgICAgIHtpc0FnZW50VHlwaW5nICYmIGN1cnJlbnRUaGlua2luZ1BhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgPGRpdiBzdHlsZT17eyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBtYXhXaWR0aDogJzgwJScgfX0+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgZm9udFNpemU6ICcxNHB4JywgY29sb3I6ICcjMDAwMDAwJywgZm9udFdlaWdodDogNjAwLCBtYXJnaW5Cb3R0b206IDQgfX0+e2FnZW50TmFtZSB8fCB0KCdsYWJlbHMuYWdlbnQnKX08L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogMCxcbiAgICAgICAgICAgICAgICBtYXhXaWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgICB9fT5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBrZXk9e2Ake2N1cnJlbnRUaGlua2luZ1BhcnRJbmRleH0tJHtjdXJyZW50VGhpbmtpbmdQYXJ0cy5qb2luKCd8Jyl9YH1cbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbjogJ2dhLXRoaW5rLWNoYW5nZSAyMjBtcyBlYXNlJyxcbiAgICAgICAgICAgICAgICAgICAgd2lsbENoYW5nZTogJ3RyYW5zZm9ybSwgb3BhY2l0eScsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzZiNzI4MCcsXG4gICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiAnMTNweCcsXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtjdXJyZW50VGhpbmtpbmdQYXJ0c1tjdXJyZW50VGhpbmtpbmdQYXJ0SW5kZXhdIHx8IGN1cnJlbnRUaGlua2luZ1BhcnRzW2N1cnJlbnRUaGlua2luZ1BhcnRzLmxlbmd0aCAtIDFdfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgICAgey8qIENvbXBsZXRlZCBsaXZlLXZvaWNlIHR1cm5zLCByZW5kZXJlZCBhcyBvcmRpbmFyeSBjaGF0IGJ1YmJsZXMgYW5kIGtlcHRcbiAgICAgICAgICAgICAgaW4gbG9jYWwgc3RhdGUgc28gdGhleSBzdGF5IHZpc2libGUgYWNyb3NzIHR1cm5zLiBUaGUgcGVyc2lzdGVkIGNvcHkgb2ZcbiAgICAgICAgICAgICAgZWFjaCB0dXJuIGlzIGZpbHRlcmVkIG91dCBvZiBgbWVzc2FnZXNgIGFib3ZlLCBzbyB0aGVzZSBhcmUgdGhlIHNpbmdsZVxuICAgICAgICAgICAgICBzb3VyY2Ugb2YgdHJ1dGggb24gc2NyZWVuIOKAlCB0aGV5IG5ldmVyIGdldCBoaWRkZW4sIHNvIG5vdGhpbmcgYmxpbmtzLiAqL31cbiAgICAgICAgICB7bGl2ZVR1cm5zLm1hcCgodHVybiwgaSkgPT4gKFxuICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50IGtleT17YGxpdmUtdHVybi0ke2l9YH0+XG4gICAgICAgICAgICAgIHt0dXJuLnVzZXIudHJpbSgpICE9PSAnJyAmJiByZW5kZXJMaXZlQnViYmxlKCdjdXN0b21lcicsIHR1cm4udXNlciwgdHVybi5jcmVhdGVUaW1lKX1cbiAgICAgICAgICAgICAge3R1cm4uYWdlbnQudHJpbSgpICE9PSAnJyAmJiByZW5kZXJMaXZlQnViYmxlKCdhZ2VudCcsIHR1cm4uYWdlbnQsIHR1cm4uY3JlYXRlVGltZSl9XG4gICAgICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxuICAgICAgICAgICkpfVxuICAgICAgICAgIHsvKiBJbi1wcm9ncmVzcyB0dXJuOiBzdHJlYW1zIHRoZSBwYXJ0aWFsIHRyYW5zY3JpcHQgbGl2ZSAoQ2hhdE1lc3NhZ2Ugbm93XG4gICAgICAgICAgICAgIHRyYWNrcyBpdHMgdGV4dCBwcm9wLCBzbyB0aGVzZSB1cGRhdGUgaW4gcGxhY2UgYXMgY2h1bmtzIGFycml2ZSkuICovfVxuICAgICAgICAgIHtsaXZlVm9pY2UuaXNBY3RpdmUgJiYgbGl2ZUNhcHRpb24udXNlci50cmltKCkgIT09ICcnICYmXG4gICAgICAgICAgICByZW5kZXJMaXZlQnViYmxlKCdjdXN0b21lcicsIGxpdmVDYXB0aW9uLnVzZXIsIGxpdmVDYXB0aW9uLmNyZWF0ZVRpbWUsICdfX2xpdmVfY2FwdGlvbl91c2VyX18nKX1cbiAgICAgICAgICB7bGl2ZVZvaWNlLmlzQWN0aXZlICYmIGxpdmVDYXB0aW9uLmFnZW50LnRyaW0oKSAhPT0gJycgJiZcbiAgICAgICAgICAgIHJlbmRlckxpdmVCdWJibGUoJ2FnZW50JywgbGl2ZUNhcHRpb24uYWdlbnQsIGxpdmVDYXB0aW9uLmNyZWF0ZVRpbWUsICdfX2xpdmVfY2FwdGlvbl9hZ2VudF9fJyl9XG4gICAgICAgICAgPGRpdiByZWY9e21lc3NhZ2VzRW5kUmVmfSAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAge3Nob3dXZWxjb21lQmVmb3JlU3RhcnQgJiYgKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBzaG93aW5nU3ludGhldGljV2VsY29tZSA9XG4gICAgICAgICAgICAhaGFzVXNlck1lc3NhZ2VzICYmXG4gICAgICAgICAgICAobWVzc2FnZXMubGVuZ3RoID09PSAwIHx8IG1lc3NhZ2VzWzBdLnNwZWFrZXIgIT09ICdhZ2VudCcpICYmXG4gICAgICAgICAgICAoQm9vbGVhbih3ZWxjb21lVGl0bGUpIHx8IEJvb2xlYW4od2VsY29tZUltYWdlVXJsKSB8fCBCb29sZWFuKHdlbGNvbWVNZXNzYWdlKSk7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHBvc3NpYmxlUXVlcmllcy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAhaGFzVXNlck1lc3NhZ2VzICYmXG4gICAgICAgICAgICAobWVzc2FnZXMubGVuZ3RoID09PSAwIHx8IG1lc3NhZ2VzWzBdLnNwZWFrZXIgIT09ICdhZ2VudCcpICYmXG4gICAgICAgICAgICAhc2hvd2luZ1N5bnRoZXRpY1dlbGNvbWVcbiAgICAgICAgICApO1xuICAgICAgICB9KSgpICYmIChcbiAgICAgICAgICA8ZGl2IHN0eWxlPXtwb3NzaWJsZVF1ZXJpZXNDb250YWluZXJTdHlsZX0+XG4gICAgICAgICAgICB7cG9zc2libGVRdWVyaWVzLm1hcCgocXVlcnksIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgIHN0eWxlPXtxdWVyeUJ1dHRvblN0eWxlfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZVF1ZXJ5Q2xpY2socXVlcnkpfVxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXtpc0xvYWRpbmcgfHwgaXNBZ2VudFR5cGluZ31cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtxdWVyeX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cblxuICAgICAgICB7ZmlsZUVycm9yVG9hc3QgJiYgKFxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIG1hcmdpbjogJzAgMTZweCA4cHgnLFxuICAgICAgICAgICAgICBwYWRkaW5nOiAnMTBweCAxNHB4JyxcbiAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnI0ZGRjNFMCcsXG4gICAgICAgICAgICAgIGNvbG9yOiAnI0U2NTEwMCcsXG4gICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzEycHgnLFxuICAgICAgICAgICAgICBmb250U2l6ZSxcbiAgICAgICAgICAgICAgZm9udEZhbWlseSxcbiAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgZ2FwOiAnOHB4JyxcbiAgICAgICAgICAgICAgZmxleFNocmluazogMCxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICByb2xlPVwiYWxlcnRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxBbGVydENpcmNsZSBzaXplPXsxOH0gc3R5bGU9e3sgZmxleFNocmluazogMCB9fSAvPlxuICAgICAgICAgICAgPHNwYW4+e2ZpbGVFcnJvclRvYXN0fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cblxuICAgICAgICB7bGl2ZVZvaWNlTm90aWNlICYmIChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBtYXJnaW46ICcwIDE2cHggOHB4JyxcbiAgICAgICAgICAgICAgcGFkZGluZzogJzEwcHggMTRweCcsXG4gICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJyNGRkYzRTAnLFxuICAgICAgICAgICAgICBjb2xvcjogJyNFNjUxMDAnLFxuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICcxMnB4JyxcbiAgICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICAgIGZvbnRGYW1pbHksXG4gICAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICAgIGdhcDogJzhweCcsXG4gICAgICAgICAgICAgIGZsZXhTaHJpbms6IDAsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgcm9sZT1cImFsZXJ0XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8QWxlcnRDaXJjbGUgc2l6ZT17MTh9IHN0eWxlPXt7IGZsZXhTaHJpbms6IDAgfX0gLz5cbiAgICAgICAgICAgIDxzcGFuPntsaXZlVm9pY2VOb3RpY2V9PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuXG4gICAgICAgIHt1c2VGaWxlICYmIGF0dGFjaG1lbnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgIDxkaXYgc3R5bGU9e3sgcGFkZGluZzogJzAgMTZweCcsIG1hcmdpbkJvdHRvbTogJzhweCcsIGRpc3BsYXk6ICdmbGV4JywgZ2FwOiAnOHB4JywgZmxleFdyYXA6ICd3cmFwJyB9fT5cbiAgICAgICAgICAgIHthdHRhY2htZW50cy5tYXAoKGF0dCwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgPEF0dGFjaG1lbnRQcmV2aWV3XG4gICAgICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgICAgICBmaWxlPXthdHQuZmlsZX1cbiAgICAgICAgICAgICAgICBvblJlbW92ZT17KCkgPT4gaGFuZGxlUmVtb3ZlQXR0YWNobWVudChhdHQuZmlsZS5uYW1lKX1cbiAgICAgICAgICAgICAgICB1cGxvYWRpbmc9e3VwbG9hZGluZ0ZpbGVzLmhhcyhhdHQuZmlsZS5uYW1lKX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkpfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuXG4gICAgICAgIHshY29udmVyc2F0aW9uSWQgfHwgaXNGaW5hbGl6ZWQgPyAoXG4gICAgICAgICAgPGRpdiBzdHlsZT17aW5wdXRDb250YWluZXJTdHlsZX0+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBzdHlsZT17ey4uLnNlbmRCdXR0b25TdHlsZSwgd2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnNDhweCcsIGJvcmRlclJhZGl1czogJzE2cHgnLCBjdXJzb3I6ICdwb2ludGVyJywgZm9udEZhbWlseSwgZm9udFNpemV9fVxuICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVTdGFydENvbnZlcnNhdGlvbn1cbiAgICAgICAgICAgICAgZGlzYWJsZWQ9e2lzTG9hZGluZ31cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3QoJ2J1dHRvbnMuc3RhcnRDb252ZXJzYXRpb24nKX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApIDogbGl2ZVZvaWNlRW5hYmxlZCA/IChcbiAgICAgICAgICAvLyBMaXZlIHZvaWNlIG1vZGUgaXMgdm9pY2Utb25seTogbm8gdGV4dCBib3gsIGF0dGFjaCwgb3Igc2VuZCBidXR0b24g4oCUXG4gICAgICAgICAgLy8gdGhlIG9ubHkgd2F5IHRvIHRhbGsgdG8gdGhlIGFnZW50IGlzIHRvIHN0YXJ0IGEgbGl2ZSBjYWxsLlxuICAgICAgICAgIDxkaXYgc3R5bGU9e2lucHV0Q29udGFpbmVyU3R5bGV9PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT17eyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCB3aWR0aDogJzEwMCUnLCBtaW5XaWR0aDogMCB9fT5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT17aW5wdXRXcmFwcGVyU3R5bGV9PlxuICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPXtnZXRMaXZlVm9pY2VIaW50U3R5bGUodGV4dEFyZWFGb250U2l6ZSwgZm9udEZhbWlseSl9PlxuICAgICAgICAgICAgICAgICAge2xpdmVWb2ljZVJlYWR5XG4gICAgICAgICAgICAgICAgICAgID8gdCgnbGl2ZVZvaWNlLnRhcFRvU3RhcnQnLCAnVGFwIHRvIHN0YXJ0IGEgdm9pY2UgY29udmVyc2F0aW9uJylcbiAgICAgICAgICAgICAgICAgICAgOiB0KCdsaXZlVm9pY2UudW5hdmFpbGFibGUnLCAnVm9pY2UgaXMgY3VycmVudGx5IHVuYXZhaWxhYmxlJyl9XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxMaXZlQ2FsbENvbnRyb2xcbiAgICAgICAgICAgICAgICAgIHN0YXR1cz17bGl2ZVZvaWNlLnN0YXR1c31cbiAgICAgICAgICAgICAgICAgIGlzQWN0aXZlPXtsaXZlVm9pY2UuaXNBY3RpdmV9XG4gICAgICAgICAgICAgICAgICBvblN0YXJ0PXtzdGFydExpdmVDYWxsfVxuICAgICAgICAgICAgICAgICAgb25TdG9wPXtlbmRMaXZlQ2FsbH1cbiAgICAgICAgICAgICAgICAgIHRoZW1lPXt0aGVtZX1cbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXshYWdlbnRJZCB8fCAhbGl2ZVZvaWNlUmVhZHl9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIHthZ2VudERpc2NsYWltZXJDb250ZW50ICYmIChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdhLWlucHV0LWRpc2NsYWltZXJcIiBzdHlsZT17ZGlzY2xhaW1lclN0eWxlfT5cbiAgICAgICAgICAgICAgICAgIHthZ2VudERpc2NsYWltZXJDb250ZW50fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPGZvcm0gb25TdWJtaXQ9e2hhbmRsZVN1Ym1pdH0gc3R5bGU9e2lucHV0Q29udGFpbmVyU3R5bGV9PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT17eyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCB3aWR0aDogJzEwMCUnLCBtaW5XaWR0aDogMCB9fT5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9e2lucHV0V3JhcHBlclN0eWxlfT5cbiAgICAgICAgICAgICAge3VzZUZpbGUgJiYgKFxuICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBzdHlsZT17YXR0YWNoQnV0dG9uU3R5bGV9XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiQXR0YWNoXCJcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gZmlsZUlucHV0UmVmLmN1cnJlbnQ/LmNsaWNrKCl9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxQYXBlcmNsaXAgc2l6ZT17MjJ9IGNvbG9yPVwiIzc1NzU3NVwiIC8+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgICAgICAgICAgIG11bHRpcGxlXG4gICAgICAgICAgICAgICAgICAgIHJlZj17ZmlsZUlucHV0UmVmfVxuICAgICAgICAgICAgICAgICAgICBzdHlsZT17eyBkaXNwbGF5OiAnbm9uZScgfX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUZpbGVDaGFuZ2V9XG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdD17YWxsb3dlZEV4dGVuc2lvbnMuam9pbignLCcpIHx8ICcqLyonfVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgICAgcmVmPXt0ZXh0QXJlYVJlZn1cbiAgICAgICAgICAgICAgICBzdHlsZT17dGV4dEFyZWFTdHlsZX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJnYS10ZXh0YXJlYS1ub3NiXCJcbiAgICAgICAgICAgICAgICB2YWx1ZT17aW5wdXRWYWx1ZX1cbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldElucHV0VmFsdWUoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgIG9uS2V5RG93bj17KGUpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyAmJiAhZS5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoaW5wdXRWYWx1ZS50cmltKCkgIT09ICcnIHx8IGF0dGFjaG1lbnRzLmxlbmd0aCA+IDApICYmICFpc0FnZW50VHlwaW5nICYmICFoYXNQZW5kaW5nRm9ybSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pdE1lc3NhZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2lucHV0UGxhY2Vob2xkZXJ9XG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFjb252ZXJzYXRpb25JZCB8fCBpc0ZpbmFsaXplZCB8fCBoYXNQZW5kaW5nRm9ybX1cbiAgICAgICAgICAgICAgICByb3dzPXsxfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtyaWdodEFjdGlvbkNvbnRhaW5lclN0eWxlfT5cbiAgICAgICAgICAgICAgICB7ISh1c2VBdWRpbyAmJiBpbnB1dFZhbHVlLnRyaW0oKSA9PT0gJycgJiYgYXR0YWNobWVudHMubGVuZ3RoID09PSAwKSAmJiAoXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgICAgICAgICAgICBzdHlsZT17eyAuLi5zZW5kQnV0dG9uU3R5bGUsIC4uLihpc1NlbmREaXNhYmxlZCA/IHNlbmRCdXR0b25EaXNhYmxlZFN0eWxlIDoge30pIH19XG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtpc1NlbmREaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPEFycm93VXAgc2l6ZT17MTh9IHN0cm9rZVdpZHRoPXszfSBjb2xvcj1cIiNmZmZmZmZcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIHt1c2VBdWRpbyAmJiBpbnB1dFZhbHVlLnRyaW0oKSA9PT0gJycgJiYgYXR0YWNobWVudHMubGVuZ3RoID09PSAwICYmIChcbiAgICAgICAgICAgICAgICA8Vm9pY2VJbnB1dFxuICAgICAgICAgICAgICAgICAgb25BdWRpb1JlYWR5PXthc3luYyAoYmxvYjogQmxvYiwgZm9ybWF0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICBzZXRJc1BsYXlpbmdBdWRpbyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBzZW5kQXVkaW9NZXNzYWdlKGJsb2IsIGZvcm1hdCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGVycm9yIGhhbmRsZWQgaW5zaWRlIHNlbmRBdWRpb01lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICBzZXRJc1BsYXlpbmdBdWRpbyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICBvbkVycm9yPXtoYW5kbGVWb2ljZUVycm9yfVxuICAgICAgICAgICAgICAgICAgdGhlbWU9e3RoZW1lfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAge2FnZW50RGlzY2xhaW1lckNvbnRlbnQgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdhLWlucHV0LWRpc2NsYWltZXJcIiBzdHlsZT17ZGlzY2xhaW1lclN0eWxlfT5cbiAgICAgICAgICAgICAgICB7YWdlbnREaXNjbGFpbWVyQ29udGVudH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9mb3JtPlxuICAgICAgICApfVxuXG4gICAgICAgIHsvKiBGdWxsLXNjcmVlbiBmb3JtOiB3aGVuIGEgSHVtYW4gSW4gVGhlIExvb3AgZm9ybSBpcyBwZW5kaW5nLCBpdCB0YWtlcyBvdmVyIHRoZVxuICAgICAgICAgICAgd2hvbGUgY2hhdCBwYW5lbCAodGhlIG5vZGUncyBtZXNzYWdlIHNob3duIGFzIGEgaGVhZGluZyBvbiB0b3ApIGluc3RlYWQgb2YgYVxuICAgICAgICAgICAgY3JhbXBlZCBmb290ZXIuIElubGluZSBtb2RlIGtlZXBzIHJlbmRlcmluZyB0aGUgZm9ybSB3aXRoaW4gdGhlIG1lc3NhZ2UgbGlzdC4gKi99XG4gICAgICAgIHtwZW5kaW5nRm9ybSAmJiBmb3JtRGlzcGxheSAhPT0gJ2lubGluZScgJiYgKFxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgICBpbnNldDogMCxcbiAgICAgICAgICAgICAgekluZGV4OiAzMCxcbiAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBiYWNrZ3JvdW5kQ29sb3IgfHwgJyNmZmZmZmYnLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8RHluYW1pY0Zvcm1NZXNzYWdlXG4gICAgICAgICAgICAgIHNjaGVtYT17cGVuZGluZ0Zvcm0uc2NoZW1hfVxuICAgICAgICAgICAgICBvblN1Ym1pdD17KGRhdGEpID0+IGhhbmRsZUZvcm1TdWJtaXQoZGF0YSwgcGVuZGluZ0Zvcm0uaW5kZXgpfVxuICAgICAgICAgICAgICBvbkNhbmNlbD17KCkgPT4gaGFuZGxlRm9ybUNhbmNlbChwZW5kaW5nRm9ybS5pbmRleCl9XG4gICAgICAgICAgICAgIGlzU3VibWl0dGluZz17c3VibWl0dGluZ0Zvcm1JbmRleCA9PT0gcGVuZGluZ0Zvcm0uaW5kZXh9XG4gICAgICAgICAgICAgIGlzU3VibWl0dGVkPXtmYWxzZX1cbiAgICAgICAgICAgICAgcHJpbWFyeUNvbG9yPXtwcmltYXJ5Q29sb3J9XG4gICAgICAgICAgICAgIGZvbnRGYW1pbHk9e2ZvbnRGYW1pbHl9XG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJmdWxsc2NyZWVuXCJcbiAgICAgICAgICAgICAgdGl0bGU9e2FnZW50TmFtZSB8fCB1bmRlZmluZWR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgc3R5bGU9e2NvbmZpcm1PdmVybGF5U3R5bGV9PlxuICAgICAgICA8ZGl2IHN0eWxlPXtjb25maXJtRGlhbG9nU3R5bGV9PlxuICAgICAgICAgIDxoMyBzdHlsZT17e2ZvbnRGYW1pbHksIG1hcmdpblRvcDogMH19Pnt0KCdkaWFsb2cucmVzZXRDb252ZXJzYXRpb24udGl0bGUnKX08L2gzPlxuICAgICAgICAgIDxwIHN0eWxlPXt7Zm9udEZhbWlseSwgZm9udFNpemV9fT57dCgnZGlhbG9nLnJlc2V0Q29udmVyc2F0aW9uLm1lc3NhZ2UnKX08L3A+XG4gICAgICAgICAgPGRpdiBzdHlsZT17Y29uZmlybUJ1dHRvbnNTdHlsZX0+XG4gICAgICAgICAgICA8YnV0dG9uIHN0eWxlPXt7Li4uZ2V0Q29uZmlybUJ1dHRvblN0eWxlKGZhbHNlLCB0aGVtZVBhcmFtcyksIGNvbG9yOiB0ZXh0Q29sb3J9fSBvbkNsaWNrPXtoYW5kbGVDYW5jZWxSZXNldH0+e3QoJ2J1dHRvbnMuY2FuY2VsJyl9PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHN0eWxlPXtnZXRDb25maXJtQnV0dG9uU3R5bGUodHJ1ZSwgdGhlbWVQYXJhbXMpfSBvbkNsaWNrPXtoYW5kbGVDb25maXJtUmVzZXR9Pnt0KCdidXR0b25zLnJlc2V0Jyl9PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG5cbiAgaWYgKG1vZGUgPT09ICdmbG9hdGluZycpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPD5cbiAgICAgICAgeyFpc0Zsb2F0aW5nT3BlbiAmJiAoXG4gICAgICAgICAgPENoYXRCdWJibGVcbiAgICAgICAgICAgIHNob3dDaGF0PXtpc0Zsb2F0aW5nT3Blbn1cbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldElzRmxvYXRpbmdPcGVuKHByZXYgPT4gIXByZXYpfVxuICAgICAgICAgICAgcHJpbWFyeUNvbG9yPXtwcmltYXJ5Q29sb3J9XG4gICAgICAgICAgICBzdHlsZT17Z2V0UG9zaXRpb25TdHlsZXMoeyBwb3NpdGlvbiwgb2Zmc2V0WCwgb2Zmc2V0WSB9KX1cbiAgICAgICAgICAgIGNoYXRCdWJibGVJY29uPXt0aGVtZT8uY2hhdEJ1YmJsZUljb259XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cblxuICAgICAgICB7aXNGbG9hdGluZ09wZW4gJiYgKFxuICAgICAgICAgIDxkaXYgc3R5bGU9e2Zsb2F0aW5nQ29udGFpbmVyU3R5bGV9IGRhdGEtZ2VuYXNzaXN0LWNvbnRhaW5lcj1cImZsb2F0aW5nXCI+XG4gICAgICAgICAgICB7cmVuZGVyV2l0aFJlQ2FwdGNoYShyZW5kZXJDaGF0Q29tcG9uZW50KCkpfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgPC8+XG4gICAgKTtcbiAgfVxuXG4gIGlmIChtb2RlID09PSAnZnVsbHNjcmVlbicpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBzdHlsZT17ZmxvYXRpbmdDb250YWluZXJTdHlsZX0gZGF0YS1nZW5hc3Npc3QtY29udGFpbmVyPVwiZnVsbHNjcmVlblwiPlxuICAgICAgICB7cmVuZGVyV2l0aFJlQ2FwdGNoYShyZW5kZXJDaGF0Q29tcG9uZW50KCkpfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiByZW5kZXJXaXRoUmVDYXB0Y2hhKHJlbmRlckNoYXRDb21wb25lbnQoKSk7XG59O1xuIl19
1122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2VuQWdlbnRDaGF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvR2VuQWdlbnRDaGF0LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDckUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFakUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksSUFBSSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0s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QixFQUNyQyxNQUFNLEVBQUUsb0JBQW9CLEVBQzVCLG1CQUFtQixFQUFFLHVCQUF1QixHQUM1QyxDQUNILEVBRUEsY0FBYyxJQUFJLENBQ2pCLGNBQ0UsS0FBSyxFQUFFLHNCQUFzQixFQUM3QixTQUFTLEVBQUUsZ0JBQWMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQzVELGNBQWMsRUFBRSxVQUFDLENBQUM7d0JBQ2hCLHdFQUF3RTt3QkFDeEUsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxhQUFhOzRCQUFFLE9BQU87d0JBQ3pDLElBQUksZ0JBQWM7NEJBQUUsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQy9DLENBQUMsOEJBQ3dCLFVBQVUsWUFFbEMsbUJBQW1CLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxHQUN2QyxDQUNQLElBQ0EsQ0FDSixDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksSUFBSSxLQUFLLFlBQVksRUFBRSxDQUFDO1FBQzFCLE9BQU8sQ0FDTCxjQUFLLEtBQUssRUFBRSxzQkFBc0IsOEJBQTJCLFlBQVksWUFDdEUsbUJBQW1CLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxHQUN2QyxDQUNQLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxtQkFBbUIsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7QUFDcEQsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlTGF5b3V0RWZmZWN0LCB1c2VNZW1vLCB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENoYXRNZXNzYWdlQ29tcG9uZW50IH0gZnJvbSAnLi9DaGF0TWVzc2FnZSc7XG5pbXBvcnQgeyBBdHRhY2htZW50UHJldmlldyB9IGZyb20gJy4vY29tbW9uL0F0dGFjaG1lbnRQcmV2aWV3JztcbmltcG9ydCB7IHVzZUNoYXQgfSBmcm9tICcuLi9ob29rcy91c2VDaGF0JztcbmltcG9ydCB7IHVzZVNjcm9sbE1hbmFnZW1lbnQgfSBmcm9tICcuLi9ob29rcy91c2VTY3JvbGxNYW5hZ2VtZW50JztcbmltcG9ydCB7IHVzZVRoaW5raW5nQW5pbWF0aW9uIH0gZnJvbSAnLi4vaG9va3MvdXNlVGhpbmtpbmdBbmltYXRpb24nO1xuaW1wb3J0IHsgdXNlVmlld3BvcnRNYW5hZ2VyIH0gZnJvbSAnLi4vaG9va3MvdXNlVmlld3BvcnRNYW5hZ2VyJztcbmltcG9ydCB7IHVzZUZpbGVBdHRhY2htZW50cyB9IGZyb20gJy4uL2hvb2tzL3VzZUZpbGVBdHRhY2htZW50cyc7XG5pbXBvcnQgeyBDaGF0TWVzc2FnZSwgR2VuQWdlbnRDaGF0UHJvcHMsIFNjaGVkdWxlSXRlbSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IFZvaWNlSW5wdXQgfSBmcm9tICcuL1ZvaWNlSW5wdXQnO1xuaW1wb3J0IHsgTGl2ZUNhbGxDb250cm9sIH0gZnJvbSAnLi9MaXZlQ2FsbENvbnRyb2wnO1xuaW1wb3J0IHsgdXNlTGl2ZVZvaWNlIGFzIHVzZUxpdmVWb2ljZVNlc3Npb24gfSBmcm9tICcuLi9ob29rcy91c2VMaXZlVm9pY2UnO1xuaW1wb3J0IHsgQXVkaW9TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYXVkaW9TZXJ2aWNlJztcbmltcG9ydCB7IFBhcGVyY2xpcCwgTW9yZUhvcml6b250YWwsIFJlZnJlc2hDdywgR2xvYmUsIFgsIEFycm93VXAsIE1heGltaXplMiwgTWluaW1pemUyLCBBbGVydENpcmNsZSwgRnVsbHNjcmVlbiB9IGZyb20gJ2x1Y2lkZS1yZWFjdCc7XG5pbXBvcnQgeyBCdWJibGVEb2NrIH0gZnJvbSAnLi9CdWJibGVEb2NrJztcbmltcG9ydCBEeW5hbWljRm9ybU1lc3NhZ2UgZnJvbSAnLi9EeW5hbWljRm9ybU1lc3NhZ2UnO1xuaW1wb3J0IHsgTGFuZ3VhZ2VTZWxlY3RvciB9IGZyb20gJy4vTGFuZ3VhZ2VTZWxlY3Rvcic7XG5pbXBvcnQgY2hhdExvZ28gZnJvbSAnLi4vYXNzZXRzL2NoYXQtbG9nby5wbmcnO1xuXG5pbXBvcnQge1xuICByZXNvbHZlTGFuZ3VhZ2UsXG4gIG1lcmdlVHJhbnNsYXRpb25zLFxuICBnZXRUcmFuc2xhdGlvblN0cmluZyxcbiAgZ2V0VHJhbnNsYXRpb25zRm9yTGFuZ3VhZ2UsXG59IGZyb20gJy4uL3V0aWxzL2kxOG4nO1xuaW1wb3J0IHsgR29vZ2xlUmVDYXB0Y2hhLCBHb29nbGVSZUNhcHRjaGFQcm92aWRlciB9IGZyb20gJ3JlYWN0LWdvb2dsZS1yZWNhcHRjaGEtdjMnO1xuXG5pbXBvcnQge1xuICByZXNvbHZlVGhlbWUsXG4gIGhleFRvUmdiYSxcbiAgZ2V0Q29udGFpbmVyU3R5bGUsXG4gIGdldEhlYWRlclN0eWxlLFxuICBoZWFkZXJMZWZ0Q29udGFpbmVyU3R5bGUsXG4gIGhlYWRlclJpZ2h0Q29udGFpbmVyU3R5bGUsXG4gIGhlYWRlclBpbGxTdHlsZSxcbiAgbG9nb1N0eWxlLFxuICBicmFuZExvZ29TdHlsZSxcbiAgZ2V0SGVhZGVyUGlsbFRpdGxlU3R5bGUsXG4gIGhlYWRlclBpbGxUZXh0Q29sdW1uU3R5bGUsXG4gIGdldEhlYWRlckRlc2NyaXB0aW9uVGV4dFN0eWxlLFxuICBtZW51QnV0dG9uU3R5bGUsXG4gIGdldE1lbnVQb3B1cFN0eWxlLFxuICBnZXRNZW51SXRlbVN0eWxlLFxuICBjaGF0Q29udGFpbmVyU3R5bGUsXG4gIGlucHV0Q29udGFpbmVyU3R5bGUsXG4gIGlucHV0V3JhcHBlclN0eWxlLFxuICBnZXRUZXh0QXJlYVN0eWxlLFxuICBnZXRMaXZlVm9pY2VIaW50U3R5bGUsXG4gIGF0dGFjaEJ1dHRvblN0eWxlLFxuICBnZXRTZW5kQnV0dG9uU3R5bGUsXG4gIHNlbmRCdXR0b25EaXNhYmxlZFN0eWxlLFxuICByaWdodEFjdGlvbkNvbnRhaW5lclN0eWxlLFxuICBnZXRQb3NzaWJsZVF1ZXJpZXNDb250YWluZXJTdHlsZSxcbiAgZ2V0UXVlcnlCdXR0b25TdHlsZSxcbiAgZ2V0Q29uZmlybU92ZXJsYXlTdHlsZSxcbiAgZ2V0Q29uZmlybURpYWxvZ1N0eWxlLFxuICBjb25maXJtQnV0dG9uc1N0eWxlLFxuICBnZXRDb25maXJtQnV0dG9uU3R5bGUsXG4gIGdldENvbnRlbnRDYXJkU3R5bGUsXG4gIGdldERpc2NsYWltZXJTdHlsZSxcbiAgZ2V0RmxvYXRpbmdDb250YWluZXJTdHlsZSxcbiAgQ1NTX0tFWUZSQU1FUyxcbn0gZnJvbSAnLi4vc3R5bGVzL2dlbkFnZW50Q2hhdFN0eWxlcyc7XG5cbmNvbnN0IFNIT1dfQ0hBVF9MQU5HVUFHRV9TRUxFQ1RPUiA9IHRydWU7XG5cbi8qKiBPbmUgY29tcGxldGVkIChvciBpbi1wcm9ncmVzcykgbGl2ZS12b2ljZSBleGNoYW5nZTogd2hhdCB0aGUgdXNlciBzYWlkICsgdGhlIHJlcGx5LiAqL1xudHlwZSBMaXZlVHVybiA9IHsgdXNlcjogc3RyaW5nOyBhZ2VudDogc3RyaW5nOyBjcmVhdGVUaW1lOiBudW1iZXIgfTtcblxuLyoqIEN1cnJlbnQgdGltZSBpbiBlcG9jaCBzZWNvbmRzICh0aGUgdGltZXN0YW1wIGZvcm1hdCBDaGF0TWVzc2FnZSBleHBlY3RzKS4gKi9cbmNvbnN0IG5vd1NlYyA9ICgpID0+IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuXG5leHBvcnQgY29uc3QgR2VuQWdlbnRDaGF0OiBSZWFjdC5GQzxHZW5BZ2VudENoYXRQcm9wcz4gPSAoe1xuICBiYXNlVXJsLFxuICB3ZWJzb2NrZXRVcmwsXG4gIGFwaUtleSxcbiAgdGVuYW50LFxuICBtZXRhZGF0YSxcbiAgdXNlV3MgPSB0cnVlLFxuICB1c2VQb2xsID0gZmFsc2UsXG4gIG9uRXJyb3IsXG4gIG9uVGFrZW92ZXIsXG4gIG9uRmluYWxpemUsXG4gIHRoZW1lLFxuICBoZWFkZXJUaXRsZSA9ICdHZW5hc3Npc3QnLFxuICBkZXNjcmlwdGlvbixcbiAgcGxhY2Vob2xkZXIsXG4gIGFnZW50TmFtZSxcbiAgbG9nb1VybCxcbiAgYnJhbmRMb2dvVXJsLFxuICBtb2RlID0gJ2VtYmVkZGVkJyxcbiAgb25FeGl0RnVsbHNjcmVlbixcbiAgZmxvYXRpbmdDb25maWcgPSB7fSxcbiAgbGFuZ3VhZ2UsXG4gIHRyYW5zbGF0aW9uczogY3VzdG9tVHJhbnNsYXRpb25zLFxuICByZUNhcHRjaGFLZXksXG4gIHdpZGdldCA9IGZhbHNlLFxuICBxdWlja0lucHV0ID0gZmFsc2UsXG4gIHVzZUF1ZGlvID0gZmFsc2UsXG4gIHVzZUZpbGUgPSBmYWxzZSxcbiAgbm9Db2xvckFuaW1hdGlvbiA9IGZhbHNlLFxuICBzaG93V2VsY29tZUJlZm9yZVN0YXJ0ID0gdHJ1ZSxcbiAgYWxsb3dlZEV4dGVuc2lvbnMgPSBbXSxcbiAgc2VydmVyVW5hdmFpbGFibGVNZXNzYWdlLFxuICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RVcmwsXG4gIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdExhYmVsLFxuICBmb3JtRGlzcGxheSA9ICdmb290ZXInLFxuICBvbkNvbmZpZ0xvYWRlZCxcbn0pOiBSZWFjdC5SZWFjdEVsZW1lbnQgPT4ge1xuICAvLyBMYW5ndWFnZSBzZWxlY3Rpb24gc3RhdGUgKHdpdGggbG9jYWxTdG9yYWdlIHBlcnNpc3RlbmNlKVxuICBjb25zdCBbc2VsZWN0ZWRMYW5ndWFnZSwgc2V0U2VsZWN0ZWRMYW5ndWFnZV0gPSB1c2VTdGF0ZTxzdHJpbmc+KCgpID0+IHtcbiAgICBpZiAobGFuZ3VhZ2UpIHJldHVybiBsYW5ndWFnZTtcbiAgICBjb25zdCBzdG9yZWQgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdnZW5hc3Npc3RfbGFuZ3VhZ2UnKSA6IG51bGw7XG4gICAgaWYgKHN0b3JlZCkgcmV0dXJuIHN0b3JlZDtcbiAgICByZXR1cm4gcmVzb2x2ZUxhbmd1YWdlKCk7XG4gIH0pO1xuXG4gIC8vIFNhdmUgbGFuZ3VhZ2UgdG8gbG9jYWxTdG9yYWdlIHdoZW4gaXQgY2hhbmdlc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiAhbGFuZ3VhZ2UpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdnZW5hc3Npc3RfbGFuZ3VhZ2UnLCBzZWxlY3RlZExhbmd1YWdlKTtcbiAgICB9XG4gIH0sIFtzZWxlY3RlZExhbmd1YWdlLCBsYW5ndWFnZV0pO1xuXG4gIC8vIFN0YXRlIGZvciB0cmFja2luZyBzZWxlY3RlZCBGQVEgcXVlcnlcbiAgY29uc3QgW3NlbGVjdGVkRmFxUXVlcnksIHNldFNlbGVjdGVkRmFxUXVlcnldID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gUmVzb2x2ZSBsYW5ndWFnZTogcHJvcCA+IHNlbGVjdGVkID4gYnJvd3NlciA+ICdlbidcbiAgY29uc3QgcmVzb2x2ZWRMYW5ndWFnZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChsYW5ndWFnZSkgcmV0dXJuIGxhbmd1YWdlO1xuICAgIHJldHVybiBzZWxlY3RlZExhbmd1YWdlIHx8IHJlc29sdmVMYW5ndWFnZSgpIHx8ICdlbic7XG4gIH0sIFtsYW5ndWFnZSwgc2VsZWN0ZWRMYW5ndWFnZV0pO1xuXG4gIC8vIE1lcmdlIGxhbmd1YWdlIGFuZCBGQVEgcXVlcnkgaW50byBtZXRhZGF0YVxuICBjb25zdCBtZXRhZGF0YVdpdGhMYW5ndWFnZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi4obWV0YWRhdGEgfHwge30pLFxuICAgICAgbGFuZ3VhZ2U6IHJlc29sdmVkTGFuZ3VhZ2UsXG4gICAgICAuLi4oc2VsZWN0ZWRGYXFRdWVyeSA/IHsgZmFxX3F1ZXJ5OiBzZWxlY3RlZEZhcVF1ZXJ5IH0gOiB7fSksXG4gICAgfTtcbiAgfSwgW21ldGFkYXRhLCByZXNvbHZlZExhbmd1YWdlLCBzZWxlY3RlZEZhcVF1ZXJ5XSk7XG5cbiAgLy8gR2V0IHRyYW5zbGF0aW9ucyBiYXNlZCBvbiByZXNvbHZlZCBsYW5ndWFnZSwgdGhlbiBtZXJnZSB3aXRoIGN1c3RvbSB0cmFuc2xhdGlvbnNcbiAgY29uc3QgdHJhbnNsYXRpb25zID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgYmFzZVRyYW5zbGF0aW9ucyA9IGdldFRyYW5zbGF0aW9uc0Zvckxhbmd1YWdlKHJlc29sdmVkTGFuZ3VhZ2UpO1xuICAgIHJldHVybiBtZXJnZVRyYW5zbGF0aW9ucyhjdXN0b21UcmFuc2xhdGlvbnMsIGJhc2VUcmFuc2xhdGlvbnMpO1xuICB9LCBbcmVzb2x2ZWRMYW5ndWFnZSwgY3VzdG9tVHJhbnNsYXRpb25zXSk7XG5cbiAgY29uc3QgdCA9IChrZXk6IHN0cmluZywgZmFsbGJhY2s/OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBnZXRUcmFuc2xhdGlvblN0cmluZyhrZXksIHRyYW5zbGF0aW9ucywgZmFsbGJhY2spO1xuICB9O1xuXG4gIGNvbnN0IGlucHV0UGxhY2Vob2xkZXIgPSB1c2VNZW1vKCgpID0+IHBsYWNlaG9sZGVyIHx8IHQoJ2lucHV0LnBsYWNlaG9sZGVyJywgJ0FzayBhIHF1ZXN0aW9uJyksIFtwbGFjZWhvbGRlciwgdHJhbnNsYXRpb25zXSk7XG4gIGNvbnN0IFtpbnB1dFZhbHVlLCBzZXRJbnB1dFZhbHVlXSA9IHVzZVN0YXRlKCcnKTtcbiAgY29uc3QgW3Nob3dSZXNldENvbmZpcm0sIHNldFNob3dSZXNldENvbmZpcm1dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbc2hvd01lbnUsIHNldFNob3dNZW51XSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW3Nob3dMYW5ndWFnZURyb3Bkb3duLCBzZXRTaG93TGFuZ3VhZ2VEcm9wZG93bl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtpc1BsYXlpbmdBdWRpbywgc2V0SXNQbGF5aW5nQXVkaW9dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbaXNGbG9hdGluZ09wZW4sIHNldElzRmxvYXRpbmdPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgLy8gS2VlcHMgdGhlIGZsb2F0aW5nIHBhbmVsIGluIHRoZSBET00gdGhyb3VnaCBpdHMgY2xvc2UgYW5pbWF0aW9uIGJlZm9yZSB1bm1vdW50aW5nLlxuICBjb25zdCBbaXNQYW5lbE1vdW50ZWQsIHNldElzUGFuZWxNb3VudGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgLy8gUXVpY2stbWVzc2FnZSBpbnB1dCBiZXNpZGUgdGhlIGxhdW5jaGVyIGJ1YmJsZSAoZGlzbWlzc2FsIHBlcnNpc3RzIGFjcm9zcyBsb2FkcykuXG4gIGNvbnN0IFtxdWlja0lucHV0RGlzbWlzc2VkLCBzZXRRdWlja0lucHV0RGlzbWlzc2VkXSA9IHVzZVN0YXRlPGJvb2xlYW4+KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBmYWxzZTtcbiAgICB0cnkgeyByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2dlbmFzc2lzdF9xdWlja19pbnB1dF9kaXNtaXNzZWQnKSA9PT0gJzEnOyB9IGNhdGNoIHsgcmV0dXJuIGZhbHNlOyB9XG4gIH0pO1xuICBjb25zdCBbc3VibWl0dGVkRm9ybXMsIHNldFN1Ym1pdHRlZEZvcm1zXSA9IHVzZVN0YXRlPFNldDxudW1iZXI+PihuZXcgU2V0KCkpO1xuICBjb25zdCBbc3VibWl0dGluZ0Zvcm1JbmRleCwgc2V0U3VibWl0dGluZ0Zvcm1JbmRleF0gPSB1c2VTdGF0ZTxudW1iZXIgfCBudWxsPihudWxsKTtcbiAgY29uc3QgbWVudVJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XG4gIGNvbnN0IHRleHRBcmVhUmVmID0gdXNlUmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCBoZWFkZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCBbaGVhZGVySGVpZ2h0LCBzZXRIZWFkZXJIZWlnaHRdID0gdXNlU3RhdGUoNTYpO1xuICBjb25zdCBbc2hvd0JhY2tsaWdodCwgc2V0U2hvd0JhY2tsaWdodF0gPSB1c2VTdGF0ZShmYWxzZSk7XG5cbiAgY29uc3Qge1xuICAgIG1lc3NhZ2VzLFxuICAgIGlzTG9hZGluZyxcbiAgICBzZW5kTWVzc2FnZSxcbiAgICBzZW5kQXVkaW9NZXNzYWdlLFxuICAgIHVwbG9hZEZpbGUsXG4gICAgcmVzZXRDb252ZXJzYXRpb24sXG4gICAgc3RhcnRDb252ZXJzYXRpb24sXG4gICAgdHJpZ2dlclN0YXJ0Rm9ybSxcbiAgICBzaG91bGRUcmlnZ2VyU3RhcnRGb3JtLFxuICAgIGNvbnZlcnNhdGlvbklkLFxuICAgIGd1ZXN0VG9rZW4sXG4gICAgcG9zc2libGVRdWVyaWVzLFxuICAgIGlzRmluYWxpemVkLFxuICAgIGlzQWdlbnRUeXBpbmcsXG4gICAgYWRkRmVlZGJhY2ssXG4gICAgYXZhaWxhYmxlTGFuZ3VhZ2VzOiBhZ2VudEF2YWlsYWJsZUxhbmd1YWdlcyxcbiAgICBhZ2VudElkLFxuICAgIGFnZW50TGl2ZVZvaWNlRW5hYmxlZCxcbiAgICBhZ2VudExpdmVWb2ljZVJlYWR5LFxuICAgIHdlbGNvbWVUaXRsZSxcbiAgICB3ZWxjb21lSW1hZ2VVcmwsXG4gICAgd2VsY29tZU1lc3NhZ2UsXG4gICAgaW5wdXREaXNjbGFpbWVySHRtbCxcbiAgICB0aGlua2luZ1BocmFzZXMsXG4gICAgdGhpbmtpbmdEZWxheU1zLFxuICAgIGZvcm1Ob2RlTG9jYWxlcyxcbiAgfSA9IHVzZUNoYXQoe1xuICAgIGJhc2VVcmwsXG4gICAgd2Vic29ja2V0VXJsLFxuICAgIGFwaUtleSxcbiAgICB0ZW5hbnQsXG4gICAgbWV0YWRhdGE6IG1ldGFkYXRhV2l0aExhbmd1YWdlLFxuICAgIHVzZVdzLFxuICAgIHVzZVBvbGwsXG4gICAgbGFuZ3VhZ2U6IHJlc29sdmVkTGFuZ3VhZ2UsXG4gICAgb25FcnJvcixcbiAgICBvblRha2VvdmVyLFxuICAgIG9uRmluYWxpemUsXG4gICAgc2VydmVyVW5hdmFpbGFibGVNZXNzYWdlLFxuICAgIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdFVybCxcbiAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbCxcbiAgICBvbkNvbmZpZ0xvYWRlZCxcbiAgfSk7XG5cbiAgY29uc3QgeyBjdXJyZW50VGhpbmtpbmdQYXJ0cywgY3VycmVudFRoaW5raW5nUGFydEluZGV4IH0gPSB1c2VUaGlua2luZ0FuaW1hdGlvbih7XG4gICAgaXNBZ2VudFR5cGluZyxcbiAgICB0aGlua2luZ1BocmFzZXMsXG4gICAgdGhpbmtpbmdEZWxheU1zLFxuICAgIHRyYW5zbGF0aW9ucyxcbiAgfSk7XG5cbiAgY29uc3QgeyBtZXNzYWdlc0VuZFJlZiwgY2hhdENvbnRhaW5lclJlZiB9ID0gdXNlU2Nyb2xsTWFuYWdlbWVudCh7XG4gICAgbWVzc2FnZXMsXG4gICAgaXNBZ2VudFR5cGluZyxcbiAgICBjdXJyZW50VGhpbmtpbmdQYXJ0SW5kZXgsXG4gICAgY3VycmVudFRoaW5raW5nUGFydHNMZW5ndGg6IGN1cnJlbnRUaGlua2luZ1BhcnRzLmxlbmd0aCxcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICBpc0Zsb2F0aW5nT3BlbixcbiAgICBtb2RlLFxuICB9KTtcblxuICBjb25zdCB7XG4gICAgd2luZG93V2lkdGgsXG4gICAgd2luZG93SGVpZ2h0LFxuICAgIGlzRnVsbHNjcmVlbixcbiAgICBoYW5kbGVGdWxsc2NyZWVuVG9nZ2xlLFxuICAgIGlzRXhwYW5kZWQsXG4gICAgaGFuZGxlRXhwYW5kVG9nZ2xlLFxuICB9ID0gdXNlVmlld3BvcnRNYW5hZ2VyKHtcbiAgICBtb2RlLFxuICAgIHdpZGdldCxcbiAgICBpc0Zsb2F0aW5nT3BlbixcbiAgICBzaG93UmVzZXRDb25maXJtLFxuICAgIHNob3dMYW5ndWFnZURyb3Bkb3duLFxuICAgIHNob3dNZW51LFxuICAgIG9uRXhpdEZ1bGxzY3JlZW4sXG4gICAgc2V0U2hvd1Jlc2V0Q29uZmlybSxcbiAgICBzZXRTaG93TGFuZ3VhZ2VEcm9wZG93bixcbiAgICBzZXRTaG93TWVudSxcbiAgfSk7XG5cbiAgY29uc3Qge1xuICAgIGF0dGFjaG1lbnRzLFxuICAgIHNldEF0dGFjaG1lbnRzLFxuICAgIHVwbG9hZGluZ0ZpbGVzLFxuICAgIGZpbGVFcnJvclRvYXN0LFxuICAgIGZpbGVJbnB1dFJlZixcbiAgICBoYW5kbGVGaWxlQ2hhbmdlLFxuICAgIGhhbmRsZVJlbW92ZUF0dGFjaG1lbnQsXG4gICAgY2xlYXJBdHRhY2htZW50cyxcbiAgfSA9IHVzZUZpbGVBdHRhY2htZW50cyh7IHVwbG9hZEZpbGUsIHQgfSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAobGFuZ3VhZ2UpIHJldHVybjtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYWdlbnRBdmFpbGFibGVMYW5ndWFnZXMpIHx8IGFnZW50QXZhaWxhYmxlTGFuZ3VhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBub3JtYWxpemVkID0gYWdlbnRBdmFpbGFibGVMYW5ndWFnZXMubWFwKChsYW5nKSA9PiBsYW5nLnRvTG93ZXJDYXNlKCkpO1xuICAgIGlmICghbm9ybWFsaXplZC5pbmNsdWRlcyhzZWxlY3RlZExhbmd1YWdlLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICBzZXRTZWxlY3RlZExhbmd1YWdlKG5vcm1hbGl6ZWRbMF0pO1xuICAgIH1cbiAgfSwgW2FnZW50QXZhaWxhYmxlTGFuZ3VhZ2VzLCBsYW5ndWFnZSwgc2VsZWN0ZWRMYW5ndWFnZV0pO1xuXG4gIGNvbnN0IGF1ZGlvU2VydmljZSA9IHVzZVJlZjxBdWRpb1NlcnZpY2UgfCBudWxsPihudWxsKTtcbiAgY29uc3QgcmVDYXB0Y2hhVG9rZW5SZWYgPSB1c2VSZWY8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIGNvbnN0IGhhc1VzZXJNZXNzYWdlcyA9IG1lc3NhZ2VzLnNvbWUobWVzc2FnZSA9PiBtZXNzYWdlLnNwZWFrZXIgPT09ICdjdXN0b21lcicpO1xuXG4gIC8vIFdoZW4gYSBIdW1hbiBJbiBUaGUgTG9vcCBub2RlIHdpdGggXCJzaG93X29uX3N0YXJ0XCIgaXMgd2lyZWQgZGlyZWN0bHkgYWZ0ZXIgU3RhcnQsIHJ1blxuICAvLyB0aGUgd29ya2Zsb3cgb25jZSBhcyB0aGUgY29udmVyc2F0aW9uIG9wZW5zIHNvIGl0cyBmb3JtIGFwcGVhcnMgaW1tZWRpYXRlbHksIGJlZm9yZVxuICAvLyBhbnkgdmlzaXRvciBtZXNzYWdlLiBGaXJlcyBvbmx5IG9uIGEgZnJlc2ggY29udmVyc2F0aW9uOiBubyB2aXNpdG9yIG1lc3NhZ2VzIHlldCBhbmRcbiAgLy8gbm8gZm9ybSBhbHJlYWR5IHByZXNlbnQgKGEgd2VsY29tZSBtZXNzYWdlIG1heSBleGlzdDsgYSBwZXJzaXN0ZWQgZm9ybSBtdXN0IG5vdFxuICAvLyByZS10cmlnZ2VyIG9uIHJlbG9hZCkuXG4gIGNvbnN0IGhhc0Zvcm1SZXF1ZXN0ID0gbWVzc2FnZXMuc29tZSgobSkgPT4gbS50eXBlID09PSAnZm9ybV9yZXF1ZXN0Jyk7XG4gIGNvbnN0IHN0YXJ0Rm9ybVRyaWdnZXJlZFJlZiA9IHVzZVJlZihmYWxzZSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKFxuICAgICAgc2hvdWxkVHJpZ2dlclN0YXJ0Rm9ybSAmJlxuICAgICAgY29udmVyc2F0aW9uSWQgJiZcbiAgICAgICFpc0ZpbmFsaXplZCAmJlxuICAgICAgIWhhc1VzZXJNZXNzYWdlcyAmJlxuICAgICAgIWhhc0Zvcm1SZXF1ZXN0ICYmXG4gICAgICAhc3RhcnRGb3JtVHJpZ2dlcmVkUmVmLmN1cnJlbnRcbiAgICApIHtcbiAgICAgIHN0YXJ0Rm9ybVRyaWdnZXJlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIHRyaWdnZXJTdGFydEZvcm0ocmVDYXB0Y2hhVG9rZW5SZWYuY3VycmVudCk7XG4gICAgfVxuICB9LCBbc2hvdWxkVHJpZ2dlclN0YXJ0Rm9ybSwgY29udmVyc2F0aW9uSWQsIGlzRmluYWxpemVkLCBoYXNVc2VyTWVzc2FnZXMsIGhhc0Zvcm1SZXF1ZXN0LCB0cmlnZ2VyU3RhcnRGb3JtXSk7XG5cbiAgLy8gQWxsb3cgYSBmcmVzaCB0cmlnZ2VyIGFmdGVyIGEgcmVzZXQgKG5ldyBjb252ZXJzYXRpb24gaWQgLyBjbGVhcmVkIG1lc3NhZ2VzKS5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNvbnZlcnNhdGlvbklkKSB7XG4gICAgICBzdGFydEZvcm1UcmlnZ2VyZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH1cbiAgfSwgW2NvbnZlcnNhdGlvbklkXSk7XG5cbiAgLy8gRm9ybS1zdWJtaXNzaW9uIHN0YXRlIGlzIGtleWVkIGJ5IG1lc3NhZ2UgaW5kZXgsIHdoaWNoIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aXRoaW4gYVxuICAvLyBzaW5nbGUgY29udmVyc2F0aW9uLiBDbGVhciBpdCB3aGVuZXZlciB0aGUgY29udmVyc2F0aW9uIGNoYW5nZXMgc28gYSBmb3JtIHN1Ym1pdHRlZCBpblxuICAvLyBhIHByZXZpb3VzIGNvbnZlcnNhdGlvbiBkb2Vzbid0IG1hcmsgYSBuZXcgY29udmVyc2F0aW9uJ3MgZm9ybSAoYXQgdGhlIHNhbWUgaW5kZXgpIGFzXG4gIC8vIGFscmVhZHkgYW5zd2VyZWQg4oCUIHdoaWNoIHdvdWxkIHdyb25nbHkgaGlkZSBpdCBvbiBTdGFydCAoUmVzZXQgY2xlYXJlZCBpdCwgcGxhaW4gU3RhcnRcbiAgLy8gZGlkIG5vdCkuIFRoZSByZWxvYWQgY2FzZSBzdGF5cyBjb3JyZWN0OiBpdCByZWxpZXMgb24gaXNGb3JtQW5zd2VyZWQncyB0cmFuc2NyaXB0IGNoZWNrLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNldFN1Ym1pdHRlZEZvcm1zKG5ldyBTZXQoKSk7XG4gICAgc2V0U3VibWl0dGluZ0Zvcm1JbmRleChudWxsKTtcbiAgfSwgW2NvbnZlcnNhdGlvbklkXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBhdWRpb1NlcnZpY2UuY3VycmVudCA9IG5ldyBBdWRpb1NlcnZpY2UoeyBiYXNlVXJsLCB3ZWJzb2NrZXRVcmwsIGFwaUtleSB9KTtcbiAgfSwgW2Jhc2VVcmwsIHdlYnNvY2tldFVybCwgYXBpS2V5XSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBhdWRpb1NlcnZpY2UuY3VycmVudD8uc2V0R3Vlc3RUb2tlbihndWVzdFRva2VuID8/IG51bGwpO1xuICB9LCBbZ3Vlc3RUb2tlbl0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKG1vZGUgPT09ICdmdWxsc2NyZWVuJyAmJiAhaXNGbG9hdGluZ09wZW4pIHtcbiAgICAgIHNldElzRmxvYXRpbmdPcGVuKHRydWUpO1xuICAgIH1cbiAgfSwgW21vZGUsIGlzRmxvYXRpbmdPcGVuXSk7XG5cbiAgLy8gTW91bnQgdGhlIGZsb2F0aW5nIHBhbmVsIGFzIHNvb24gYXMgaXQgb3BlbnM7IHVubW91bnQgaGFwcGVucyBvbiBjbG9zZS1hbmltYXRpb24gZW5kLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChtb2RlID09PSAnZmxvYXRpbmcnICYmIGlzRmxvYXRpbmdPcGVuKSB7XG4gICAgICBzZXRJc1BhbmVsTW91bnRlZCh0cnVlKTtcbiAgICB9XG4gIH0sIFttb2RlLCBpc0Zsb2F0aW5nT3Blbl0pO1xuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgdXBkYXRlSGVhZGVySGVpZ2h0ID0gKCkgPT4ge1xuICAgICAgc2V0SGVhZGVySGVpZ2h0KGhlYWRlclJlZi5jdXJyZW50Py5vZmZzZXRIZWlnaHQgfHwgNTYpO1xuICAgIH07XG4gICAgdXBkYXRlSGVhZGVySGVpZ2h0KCk7XG4gICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdXBkYXRlSGVhZGVySGVpZ2h0KCkpO1xuICAgIGlmIChoZWFkZXJSZWYuY3VycmVudCkge1xuICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShoZWFkZXJSZWYuY3VycmVudCk7XG4gICAgfVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB1cGRhdGVIZWFkZXJIZWlnaHQpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdXBkYXRlSGVhZGVySGVpZ2h0KTtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaXNBZ2VudFR5cGluZykge1xuICAgICAgc2V0U2hvd0JhY2tsaWdodCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHNldFNob3dCYWNrbGlnaHQoZmFsc2UpLCA0MjApO1xuICAgIHJldHVybiAoKSA9PiBjbGVhclRpbWVvdXQodGltZXIpO1xuICB9LCBbaXNBZ2VudFR5cGluZ10pO1xuXG4gIGNvbnN0IHN1Ym1pdE1lc3NhZ2UgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlucHV0VmFsdWUudHJpbSgpID09PSAnJyAmJiBhdHRhY2htZW50cy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBpZiAoaXNBZ2VudFR5cGluZykgcmV0dXJuO1xuICAgIGNvbnN0IHRleHRUb1NlbmQgPSBpbnB1dFZhbHVlO1xuICAgIGNvbnN0IGZpbGVzVG9VcGxvYWQgPSBhdHRhY2htZW50cy5tYXAoYSA9PiBhLmZpbGUpO1xuXG4gICAgc2V0SW5wdXRWYWx1ZSgnJyk7XG4gICAgc2V0QXR0YWNobWVudHMoW10pO1xuICAgIGlmIChmaWxlSW5wdXRSZWYuY3VycmVudCkge1xuICAgICAgZmlsZUlucHV0UmVmLmN1cnJlbnQudmFsdWUgPSAnJztcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZXh0cmFNZXRhZGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gICAgICBpZiAoc2VsZWN0ZWRGYXFRdWVyeSkge1xuICAgICAgICBleHRyYU1ldGFkYXRhLmZhcV9xdWVyeSA9IHNlbGVjdGVkRmFxUXVlcnk7XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWxlc1RvVXBsb2FkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXh0cmFNZXRhZGF0YS5hdHRhY2htZW50cyA9IGF0dGFjaG1lbnRzLm1hcChhID0+IGEuYXR0YWNobWVudCk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHNlbmRNZXNzYWdlKHRleHRUb1NlbmQsIGZpbGVzVG9VcGxvYWQsIGV4dHJhTWV0YWRhdGEsIHJlQ2FwdGNoYVRva2VuUmVmLmN1cnJlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB0ZXh0QXJlYVJlZi5jdXJyZW50Py5mb2N1cygpLCAwKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlU3VibWl0ID0gYXN5bmMgKGU6IFJlYWN0LkZvcm1FdmVudCkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBhd2FpdCBzdWJtaXRNZXNzYWdlKCk7XG4gIH07XG5cbiAgdHlwZSBGb3JtU2NoZW1hRmllbGQgPSB7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBsYWJlbD86IHN0cmluZztcbiAgICBvcHRpb25zPzogQXJyYXk8eyB2YWx1ZT86IHN0cmluZzsgbGFiZWw/OiBzdHJpbmcgfT47XG4gIH07XG5cbiAgLy8gT3ZlcmxheSBhIGZvcm0gc2NoZW1hIHdpdGggdGhlIHNlbGVjdGVkIGxhbmd1YWdlJ3Mgc3RyaW5ncyBmcm9tIHRoZSBsb2NhbGUgYnVuZGxlXG4gIC8vIChrZXllZCBieSBub2RlIGlkKSwgc28gYSBkaXNwbGF5ZWQgZm9ybSByZS1sb2NhbGl6ZXMgb24gbGFuZ3VhZ2Ugc3dpdGNoLiBGYWxscyBiYWNrXG4gIC8vIHRvIHRoZSBzY2hlbWEncyBvd24gc3RyaW5ncyB3aGVuIGEgdHJhbnNsYXRpb24gaXMgbWlzc2luZy5cbiAgY29uc3QgbG9jYWxpemVGb3JtID0gdXNlQ2FsbGJhY2soXG4gICAgKHNjaGVtYTogYW55KTogYW55ID0+IHtcbiAgICAgIGlmICghc2NoZW1hIHx8IHR5cGVvZiBzY2hlbWEgIT09ICdvYmplY3QnKSByZXR1cm4gc2NoZW1hO1xuICAgICAgY29uc3QgY29kZSA9IHJlc29sdmVkTGFuZ3VhZ2UudG9Mb3dlckNhc2UoKS5zcGxpdCgnLScpWzBdO1xuICAgICAgY29uc3Qgc2xpY2UgPSBmb3JtTm9kZUxvY2FsZXM/Lltjb2RlXT8uW3NjaGVtYS5ub2RlX2lkXTtcbiAgICAgIGlmICghc2xpY2UpIHJldHVybiBzY2hlbWE7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zY2hlbWEsXG4gICAgICAgIG1lc3NhZ2U6IHNsaWNlLm1lc3NhZ2UgPz8gc2NoZW1hLm1lc3NhZ2UsXG4gICAgICAgIGZpZWxkczogQXJyYXkuaXNBcnJheShzY2hlbWEuZmllbGRzKVxuICAgICAgICAgID8gc2NoZW1hLmZpZWxkcy5tYXAoKGY6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB0ID0gZj8ubmFtZSA/IHNsaWNlLmZpZWxkcz8uW2YubmFtZV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIGlmICghdCkgcmV0dXJuIGY7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uZixcbiAgICAgICAgICAgICAgICBsYWJlbDogdC5sYWJlbCA/PyBmLmxhYmVsLFxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiB0LnBsYWNlaG9sZGVyID8/IGYucGxhY2Vob2xkZXIsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHQuZGVzY3JpcHRpb24gPz8gZi5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBBcnJheS5pc0FycmF5KGYub3B0aW9ucylcbiAgICAgICAgICAgICAgICAgID8gZi5vcHRpb25zLm1hcCgobzogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgIC4uLm8sXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHQub3B0aW9ucz8uW1N0cmluZyhvPy52YWx1ZSldID8/IG8/LmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgIDogZi5vcHRpb25zLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IHNjaGVtYS5maWVsZHMsXG4gICAgICB9O1xuICAgIH0sXG4gICAgW3Jlc29sdmVkTGFuZ3VhZ2UsIGZvcm1Ob2RlTG9jYWxlc10sXG4gICk7XG5cbiAgY29uc3QgZ2V0Rm9ybVNjaGVtYSA9IChcbiAgICBtZXNzYWdlSW5kZXg6IG51bWJlcixcbiAgKTogeyBub2RlX2lkPzogc3RyaW5nOyBtZXNzYWdlPzogc3RyaW5nOyBmaWVsZHM/OiBGb3JtU2NoZW1hRmllbGRbXSB9IHwgbnVsbCA9PiB7XG4gICAgY29uc3QgbXNnID0gbWVzc2FnZXNbbWVzc2FnZUluZGV4XTtcbiAgICBpZiAobXNnPy50eXBlID09PSAnZm9ybV9yZXF1ZXN0JyAmJiBtc2cudGV4dCkge1xuICAgICAgdHJ5IHsgcmV0dXJuIGxvY2FsaXplRm9ybShKU09OLnBhcnNlKG1zZy50ZXh0KSk7IH0gY2F0Y2ggeyAvKiBza2lwICovIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgY29uc3QgZ2V0Rm9ybU5vZGVJZCA9IChtZXNzYWdlSW5kZXg6IG51bWJlcik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PlxuICAgIGdldEZvcm1TY2hlbWEobWVzc2FnZUluZGV4KT8ubm9kZV9pZDtcblxuICAvLyBCdWlsZCB0aGUgaHVtYW4tcmVhZGFibGUgY3VzdG9tZXIgbWVzc2FnZSBmcm9tIHRoZSBzdWJtaXR0ZWQgZm9ybS4gV2Ugc2hvdyBlYWNoIGZpZWxkJ3NcbiAgLy8gbGFiZWwsIGFuZCBmb3Igb3B0aW9uLWJhc2VkIGZpZWxkcyAoZS5nLiBzZWxlY3QpIHRoZSBjaG9zZW4gb3B0aW9uJ3MgbGFiZWwgaW5zdGVhZCBvZlxuICAvLyBpdHMgcmF3IHZhbHVlIOKAlCBib3RoIGFscmVhZHkgaW4gdGhlIGNvbnZlcnNhdGlvbiBsYW5ndWFnZSwgc2luY2UgdGhlIGZvcm0gc2NoZW1hIGlzXG4gIC8vIHRyYW5zbGF0ZWQuIFRoZSBwYXlsb2FkIChgaHVtYW5faW5fdGhlX2xvb3BfZnJvbV9mb3JtYCkga2VlcHMgdGhlIHJhdyBrZXlzL3ZhbHVlcy5cbiAgY29uc3QgYnVpbGRGb3JtU3VtbWFyeSA9IChcbiAgICBmb3JtRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgbWVzc2FnZUluZGV4OiBudW1iZXIsXG4gICk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgZmllbGRCeU5hbWU6IFJlY29yZDxzdHJpbmcsIEZvcm1TY2hlbWFGaWVsZD4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGYgb2YgZ2V0Rm9ybVNjaGVtYShtZXNzYWdlSW5kZXgpPy5maWVsZHMgPz8gW10pIHtcbiAgICAgIGlmIChmICYmIHR5cGVvZiBmLm5hbWUgPT09ICdzdHJpbmcnKSBmaWVsZEJ5TmFtZVtmLm5hbWVdID0gZjtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGZvcm1EYXRhKVxuICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZmllbGRCeU5hbWVba2V5XTtcbiAgICAgICAgY29uc3QgbGFiZWwgPSBmaWVsZD8ubGFiZWwgfHwga2V5O1xuICAgICAgICBjb25zdCBvcHRpb24gPSBmaWVsZD8ub3B0aW9ucz8uZmluZChcbiAgICAgICAgICAobykgPT4gbyAmJiBTdHJpbmcoby52YWx1ZSkgPT09IFN0cmluZyh2YWx1ZSksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGRpc3BsYXkgPSBvcHRpb24/LmxhYmVsIHx8IHZhbHVlO1xuICAgICAgICByZXR1cm4gYCR7bGFiZWx9OiAke2Rpc3BsYXl9YDtcbiAgICAgIH0pXG4gICAgICAuam9pbignXFxuJyk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlRm9ybVN1Ym1pdCA9IGFzeW5jIChmb3JtRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG1lc3NhZ2VJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgaWYgKHN1Ym1pdHRpbmdGb3JtSW5kZXggIT09IG51bGwgfHwgaXNBZ2VudFR5cGluZykgcmV0dXJuO1xuICAgIHNldFN1Ym1pdHRpbmdGb3JtSW5kZXgobWVzc2FnZUluZGV4KTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3VtbWFyeVRleHQgPSBidWlsZEZvcm1TdW1tYXJ5KGZvcm1EYXRhLCBtZXNzYWdlSW5kZXgpO1xuICAgICAgY29uc3Qgbm9kZUlkID0gZ2V0Rm9ybU5vZGVJZChtZXNzYWdlSW5kZXgpO1xuICAgICAgYXdhaXQgc2VuZE1lc3NhZ2Uoc3VtbWFyeVRleHQsIFtdLCB7XG4gICAgICAgIGh1bWFuX2luX3RoZV9sb29wX2Zyb21fZm9ybTogZm9ybURhdGEsXG4gICAgICAgIC4uLihub2RlSWQgJiYgeyBodW1hbl9pbl90aGVfbG9vcF9ub2RlX2lkOiBub2RlSWQgfSksXG4gICAgICB9LCByZUNhcHRjaGFUb2tlblJlZi5jdXJyZW50KTtcbiAgICAgIHNldFN1Ym1pdHRlZEZvcm1zKChwcmV2KSA9PiBuZXcgU2V0KHByZXYpLmFkZChtZXNzYWdlSW5kZXgpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWdub3JlXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldFN1Ym1pdHRpbmdGb3JtSW5kZXgobnVsbCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUZvcm1DYW5jZWwgPSBhc3luYyAobWVzc2FnZUluZGV4OiBudW1iZXIpID0+IHtcbiAgICBpZiAoc3VibWl0dGluZ0Zvcm1JbmRleCAhPT0gbnVsbCB8fCBpc0FnZW50VHlwaW5nKSByZXR1cm47XG4gICAgc2V0U3VibWl0dGluZ0Zvcm1JbmRleChtZXNzYWdlSW5kZXgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBub2RlSWQgPSBnZXRGb3JtTm9kZUlkKG1lc3NhZ2VJbmRleCk7XG4gICAgICBhd2FpdCBzZW5kTWVzc2FnZSgnU2tpcHBlZCcsIFtdLCB7XG4gICAgICAgIGh1bWFuX2luX3RoZV9sb29wX2Zyb21fZm9ybToge30sXG4gICAgICAgIGh1bWFuX2luX3RoZV9sb29wX2NhbmNlbGxlZDogdHJ1ZSxcbiAgICAgICAgLi4uKG5vZGVJZCAmJiB7IGh1bWFuX2luX3RoZV9sb29wX25vZGVfaWQ6IG5vZGVJZCB9KSxcbiAgICAgIH0sIHJlQ2FwdGNoYVRva2VuUmVmLmN1cnJlbnQpO1xuICAgICAgc2V0U3VibWl0dGVkRm9ybXMoKHByZXYpID0+IG5ldyBTZXQocHJldikuYWRkKG1lc3NhZ2VJbmRleCkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0U3VibWl0dGluZ0Zvcm1JbmRleChudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlUXVpY2tBY3Rpb24gPSBhc3luYyAodGV4dDogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCF0ZXh0LnRyaW0oKSkgcmV0dXJuO1xuICAgIGlmIChpc0FnZW50VHlwaW5nKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4dHJhTWV0YWRhdGEgPSBzZWxlY3RlZEZhcVF1ZXJ5ID8geyBmYXFfcXVlcnk6IHNlbGVjdGVkRmFxUXVlcnkgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGF3YWl0IHNlbmRNZXNzYWdlKHRleHQsIFtdLCBleHRyYU1ldGFkYXRhLCByZUNhcHRjaGFUb2tlblJlZi5jdXJyZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWdub3JlIHF1aWNrIGFjdGlvbiBlcnJvcnMgdG8gYXZvaWQgaW50ZXJydXB0aW5nIHRoZSBmbG93XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVNjaGVkdWxlQ29uZmlybSA9IGFzeW5jIChzY2hlZHVsZTogU2NoZWR1bGVJdGVtKSA9PiB7XG4gICAgY29uc3Qgc3VtbWFyeSA9IGBTY2hlZHVsZSBjb25maXJtZWQgd2l0aCAke3NjaGVkdWxlLnJlc3RhdXJhbnRzLmxlbmd0aH0gcmVzdGF1cmFudHNgO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZW5kTWVzc2FnZShzdW1tYXJ5LCBbXSwgeyBjb25maXJtU2NoZWR1bGU6IEpTT04uc3RyaW5naWZ5KHNjaGVkdWxlKSB9LCByZUNhcHRjaGFUb2tlblJlZi5jdXJyZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9O1xuXG4gIC8vIE5ldXRyYWwsIHVzZXItZmFjaW5nIG5vdGljZSBzaG93biB3aGVuIGEgbGl2ZSBjYWxsIGNhbid0IHN0YXJ0IC8gZmFpbHMuIFRoZVxuICAvLyBtZXNzYWdlIGlzIGFscmVhZHkgbmV1dHJhbCAodGhlIGJhY2tlbmQgbmV2ZXIgc2VuZHMgaW50ZXJuYWwgY29uZmlnIGRldGFpbCksIHNvXG4gIC8vIGl0J3Mgc2FmZSBmb3IgcHVibGljIHdpZGdldHMg4oCUIGl0IGp1c3QgYXZvaWRzIGEgY29uZnVzaW5nIHNpbGVudCBjbG9zZS5cbiAgY29uc3QgW2xpdmVWb2ljZU5vdGljZSwgc2V0TGl2ZVZvaWNlTm90aWNlXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIGNvbnN0IGhhbmRsZVZvaWNlRXJyb3IgPSAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgc2V0TGl2ZVZvaWNlTm90aWNlKGVycm9yLm1lc3NhZ2UgfHwgJ1ZvaWNlIGlzIGN1cnJlbnRseSB1bmF2YWlsYWJsZScpO1xuICAgIGlmIChvbkVycm9yKSB7XG4gICAgICBvbkVycm9yKGVycm9yKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gVm9pY2Utb25seSBtb2RlIGlzIGRyaXZlbiBwdXJlbHkgYnkgdGhlIGFnZW50OiBpdCdzIG9uIHdoZW4gdGhlIGFnZW50J3NcbiAgLy8gd29ya2Zsb3cgY29udGFpbnMgYSBWb2ljZSBBZ2VudCBub2RlIChhdXRvLWRldGVjdGVkIGJ5IHRoZSBiYWNrZW5kIGFuZFxuICAvLyBzdXJmYWNlZCB0aHJvdWdoIGBhZ2VudExpdmVWb2ljZUVuYWJsZWRgKS4gTm8gaW50ZWdyYXRvciBwcm9wIGlzIGludm9sdmVkLlxuICBjb25zdCBsaXZlVm9pY2VFbmFibGVkID0gYWdlbnRMaXZlVm9pY2VFbmFibGVkO1xuICAvLyBXaGV0aGVyIGxpdmUgdm9pY2UgY2FuIGFjdHVhbGx5IHJ1biAoYSBHZW1pbmkgcHJvdmlkZXIgd2l0aCBhIGtleSBpcyBjb25maWd1cmVkKS5cbiAgLy8gV2hlbiBmYWxzZSB3ZSBrZWVwIHZvaWNlLW9ubHkgbW9kZSBidXQgZGlzYWJsZSB0aGUgY2FsbCBjb250cm9sIHdpdGggYSBuZXV0cmFsXG4gIC8vIG1lc3NhZ2Ug4oCUIHRoZSBzcGVjaWZpYyByZWFzb24gc3RheXMgc2VydmVyLXNpZGUsIG5ldmVyIHNob3duIHRvIHB1YmxpYyB1c2Vycy5cbiAgY29uc3QgbGl2ZVZvaWNlUmVhZHkgPSBhZ2VudExpdmVWb2ljZVJlYWR5O1xuXG4gIC8vIExpdmUgKGNvbnRpbnVvdXMpIHZvaWNlIGNvbnZlcnNhdGlvbiBhZ2FpbnN0IHRoZSBhZ2VudCdzIFZvaWNlIEFnZW50IG5vZGUuXG4gIC8vIGBsaXZlQ2FwdGlvbmAgaXMgdGhlIGluLXByb2dyZXNzIHR1cm4gKHN0cmVhbXMgYXMgeW91IHNwZWFrKTsgYGxpdmVUdXJuc2AgYXJlXG4gIC8vIGNvbXBsZXRlZCB0dXJucyBrZXB0IGxvY2FsbHkgc28gdGhleSBzdGF5IG9uIHNjcmVlbiBhY3Jvc3MgdHVybnMuIGBjcmVhdGVUaW1lYFxuICAvLyBpcyBjYXB0dXJlZCBvbmNlIHBlciB0dXJuIHNvIHRoZSBidWJibGUgdGltZXN0YW1wIGRvZXNuJ3Qgaml0dGVyIG9uIHJlLXJlbmRlci5cbiAgY29uc3QgW2xpdmVDYXB0aW9uLCBzZXRMaXZlQ2FwdGlvbl0gPSB1c2VTdGF0ZTxMaXZlVHVybj4oeyB1c2VyOiAnJywgYWdlbnQ6ICcnLCBjcmVhdGVUaW1lOiAwIH0pO1xuICBjb25zdCBbbGl2ZVR1cm5zLCBzZXRMaXZlVHVybnNdID0gdXNlU3RhdGU8TGl2ZVR1cm5bXT4oW10pO1xuICBjb25zdCBsaXZlVm9pY2UgPSB1c2VMaXZlVm9pY2VTZXNzaW9uKHtcbiAgICBiYXNlVXJsLFxuICAgIGFwaUtleSxcbiAgICBndWVzdFRva2VuLFxuICAgIHRlbmFudCxcbiAgICBhZ2VudElkLFxuICAgIGNvbnZlcnNhdGlvbklkLFxuICAgIGxhbmd1YWdlOiByZXNvbHZlZExhbmd1YWdlLFxuICAgIG9uRXJyb3I6IGhhbmRsZVZvaWNlRXJyb3IsXG4gICAgb25JbnB1dFRyYW5zY3JpcHQ6ICh0ZXh0KSA9PlxuICAgICAgc2V0TGl2ZUNhcHRpb24oKGMpID0+ICh7IC4uLmMsIHVzZXI6IGMudXNlciArIHRleHQsIGNyZWF0ZVRpbWU6IGMuY3JlYXRlVGltZSB8fCBub3dTZWMoKSB9KSksXG4gICAgb25PdXRwdXRUcmFuc2NyaXB0OiAodGV4dCkgPT5cbiAgICAgIHNldExpdmVDYXB0aW9uKChjKSA9PiAoeyAuLi5jLCBhZ2VudDogYy5hZ2VudCArIHRleHQsIGNyZWF0ZVRpbWU6IGMuY3JlYXRlVGltZSB8fCBub3dTZWMoKSB9KSksXG4gICAgb25UdXJuQ29tcGxldGU6ICh0dXJuKSA9PiB7XG4gICAgICAvLyBDb21taXQgdGhlIGZpbmlzaGVkIHR1cm4gc28gaXQgc3RheXMgdmlzaWJsZTsgY2xlYXIgdGhlIGluLXByb2dyZXNzIGNhcHRpb24uXG4gICAgICBzZXRMaXZlVHVybnMoKHByZXYpID0+IFsuLi5wcmV2LCB7IHVzZXI6IHR1cm4udHJhbnNjcmlwdCwgYWdlbnQ6IHR1cm4ucmVzcG9uc2UsIGNyZWF0ZVRpbWU6IG5vd1NlYygpIH1dKTtcbiAgICAgIHNldExpdmVDYXB0aW9uKHsgdXNlcjogJycsIGFnZW50OiAnJywgY3JlYXRlVGltZTogMCB9KTtcbiAgICB9LFxuICB9KTtcblxuICAvLyBGdWxsIGNvbnZlcnNhdGlvbiByZXNldDogbmV3IHRocmVhZCArIGNsZWFyZWQgaW5wdXQvYXR0YWNobWVudHMvZm9ybXMgYW5kIGFueVxuICAvLyBsaXZlLXZvaWNlIHRyYW5zY3JpcHQuIFNoYXJlZCBieSB0aGUgcmVzZXQtY29uZmlybSBkaWFsb2cgYW5kIHRoZSBlbmQtY2FsbCBidXR0b24uXG4gIGNvbnN0IHBlcmZvcm1SZXNldCA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBzZXRJbnB1dFZhbHVlKCcnKTtcbiAgICBjbGVhckF0dGFjaG1lbnRzKCk7XG4gICAgYXdhaXQgcmVzZXRDb252ZXJzYXRpb24ocmVDYXB0Y2hhVG9rZW5SZWYuY3VycmVudCk7XG4gICAgc2V0U2VsZWN0ZWRGYXFRdWVyeShudWxsKTtcbiAgICBzZXRTdWJtaXR0ZWRGb3JtcyhuZXcgU2V0KCkpO1xuICAgIHNldFN1Ym1pdHRpbmdGb3JtSW5kZXgobnVsbCk7XG4gICAgc2V0TGl2ZVR1cm5zKFtdKTtcbiAgfSwgW2NsZWFyQXR0YWNobWVudHMsIHJlc2V0Q29udmVyc2F0aW9uXSk7XG5cbiAgLy8gU3RhcnRpbmcgYSBmcmVzaCBjYWxsIGNsZWFycyB0aGUgcHJldmlvdXMgY2FsbCdzIHRyYW5zY3JpcHQgYnViYmxlcyArIGNhcHRpb24uXG4gIGNvbnN0IHN0YXJ0TGl2ZUNhbGwgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0TGl2ZVZvaWNlTm90aWNlKG51bGwpO1xuICAgIHNldExpdmVDYXB0aW9uKHsgdXNlcjogJycsIGFnZW50OiAnJywgY3JlYXRlVGltZTogMCB9KTtcbiAgICBzZXRMaXZlVHVybnMoW10pO1xuICAgIGxpdmVWb2ljZS5zdGFydCgpO1xuICB9LCBbbGl2ZVZvaWNlXSk7XG4gIC8vIEVuZGluZyBhIGNhbGwgc3RvcHMgdGhlIGF1ZGlvIHN0cmVhbSBhbmQgcmVzZXRzIHRoZSBjb252ZXJzYXRpb24g4oCUIHNhbWUgYXMgdGhlXG4gIC8vIFwicmVzZXQgY29udmVyc2F0aW9uXCIgYWN0aW9uIOKAlCBzbyB0aGUgbmV4dCBjYWxsIHN0YXJ0cyBmcm9tIGEgY2xlYW4gdGhyZWFkLlxuICBjb25zdCBlbmRMaXZlQ2FsbCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBsaXZlVm9pY2Uuc3RvcCgpO1xuICAgIHNldExpdmVDYXB0aW9uKHsgdXNlcjogJycsIGFnZW50OiAnJywgY3JlYXRlVGltZTogMCB9KTtcbiAgICB2b2lkIHBlcmZvcm1SZXNldCgpO1xuICB9LCBbbGl2ZVZvaWNlLCBwZXJmb3JtUmVzZXRdKTtcblxuICAvLyBLZWVwIHRoZSBsaXZlIHRyYW5zY3JpcHQgaW4gdmlldyBhcyBpdCBncm93cyAodGhlIHNjcm9sbCBtYW5hZ2VyIG9ubHkgcmVhY3RzXG4gIC8vIHRvIGNvbW1pdHRlZCBjaGF0IG1lc3NhZ2VzLCBub3QgdGhlc2UgbG9jYWwgbGl2ZSBidWJibGVzKS5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWxpdmVWb2ljZS5pc0FjdGl2ZSkgcmV0dXJuO1xuICAgIGNvbnN0IGVsID0gY2hhdENvbnRhaW5lclJlZi5jdXJyZW50O1xuICAgIGlmIChlbCkgZWwuc2Nyb2xsVG9wID0gZWwuc2Nyb2xsSGVpZ2h0O1xuICB9LCBbbGl2ZUNhcHRpb24sIGxpdmVUdXJucywgbGl2ZVZvaWNlLmlzQWN0aXZlLCBjaGF0Q29udGFpbmVyUmVmXSk7XG5cbiAgLy8gUmVuZGVyIGEgc2luZ2xlIGxpdmUtdm9pY2UgYnViYmxlIChjb21taXR0ZWQgdHVybiBvciBzdHJlYW1pbmcgY2FwdGlvbikgYXMgYW5cbiAgLy8gb3JkaW5hcnkgY2hhdCBtZXNzYWdlLCBzbyBpdCBsb29rcyBpZGVudGljYWwgdG8gdGV4dC1tb2RlIGJ1YmJsZXMuXG4gIGNvbnN0IHJlbmRlckxpdmVCdWJibGUgPSAoXG4gICAgc3BlYWtlcjogJ2N1c3RvbWVyJyB8ICdhZ2VudCcsXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGNyZWF0ZVRpbWU6IG51bWJlcixcbiAgICBrZXk/OiBzdHJpbmcsXG4gICkgPT4gKFxuICAgIDxDaGF0TWVzc2FnZUNvbXBvbmVudFxuICAgICAga2V5PXtrZXl9XG4gICAgICBtZXNzYWdlPXt7IGNyZWF0ZV90aW1lOiBjcmVhdGVUaW1lLCBzdGFydF90aW1lOiAwLCBlbmRfdGltZTogMC4wMSwgc3BlYWtlciwgdGV4dCB9fVxuICAgICAgdGhlbWU9e3RoZW1lfVxuICAgICAgZW5hYmxlVHlwZXdyaXRlcj17ZmFsc2V9XG4gICAgICB0cmFuc2xhdGlvbnM9e3RyYW5zbGF0aW9uc31cbiAgICAgIGxhbmd1YWdlPXtyZXNvbHZlZExhbmd1YWdlfVxuICAgICAgYWdlbnROYW1lPXthZ2VudE5hbWV9XG4gICAgLz5cbiAgKTtcblxuICBjb25zdCBwbGF5UmVzcG9uc2VBdWRpbyA9IGFzeW5jICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIWF1ZGlvU2VydmljZS5jdXJyZW50IHx8IGlzUGxheWluZ0F1ZGlvKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgc2V0SXNQbGF5aW5nQXVkaW8odHJ1ZSk7XG4gICAgICBjb25zdCBhdWRpb0Jsb2IgPSBhd2FpdCBhdWRpb1NlcnZpY2UuY3VycmVudC50ZXh0VG9TcGVlY2godGV4dCk7XG4gICAgICBhd2FpdCBhdWRpb1NlcnZpY2UuY3VycmVudC5wbGF5QXVkaW8oYXVkaW9CbG9iKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKG9uRXJyb3IpIHtcbiAgICAgICAgb25FcnJvcihlcnJvciBhcyBFcnJvcik7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldElzUGxheWluZ0F1ZGlvKGZhbHNlKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgYXVkaW9VcmxCdWlsZGVyID0gdXNlQ2FsbGJhY2soKG1lc3NhZ2VJZDogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIGAke2Jhc2VVcmx9L2FwaS9jb252ZXJzYXRpb25zLyR7Y29udmVyc2F0aW9uSWR9L21lc3NhZ2VzLyR7bWVzc2FnZUlkfS9hdWRpb2A7XG4gIH0sIFtiYXNlVXJsLCBjb252ZXJzYXRpb25JZF0pO1xuXG4gIGNvbnN0IGF1ZGlvSGVhZGVycyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGg6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBpZiAoZ3Vlc3RUb2tlbikge1xuICAgICAgaFsnQXV0aG9yaXphdGlvbiddID0gYEJlYXJlciAke2d1ZXN0VG9rZW59YDtcbiAgICB9IGVsc2Uge1xuICAgICAgaFsneC1hcGkta2V5J10gPSBhcGlLZXk7XG4gICAgfVxuICAgIGlmICh0ZW5hbnQpIGhbJ3gtdGVuYW50LWlkJ10gPSB0ZW5hbnQ7XG4gICAgcmV0dXJuIGg7XG4gIH0sIFthcGlLZXksIHRlbmFudCwgZ3Vlc3RUb2tlbl0pO1xuXG4gIGNvbnN0IFthdXRvUGxheUF1ZGlvTWVzc2FnZUlkLCBzZXRBdXRvUGxheUF1ZGlvTWVzc2FnZUlkXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBwcmV2TWVzc2FnZUNvdW50UmVmID0gdXNlUmVmPG51bWJlcj4oMCk7XG4gIGNvbnN0IGluaXRpYWxMb2FkRG9uZVJlZiA9IHVzZVJlZihmYWxzZSk7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCF1c2VBdWRpbyB8fCAhbWVzc2FnZXMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgcHJldkNvdW50ID0gcHJldk1lc3NhZ2VDb3VudFJlZi5jdXJyZW50O1xuICAgIHByZXZNZXNzYWdlQ291bnRSZWYuY3VycmVudCA9IG1lc3NhZ2VzLmxlbmd0aDtcbiAgICBpZiAoIWluaXRpYWxMb2FkRG9uZVJlZi5jdXJyZW50KSB7XG4gICAgICBpbml0aWFsTG9hZERvbmVSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChtZXNzYWdlcy5sZW5ndGggPD0gcHJldkNvdW50KSByZXR1cm47XG4gICAgY29uc3QgbGFzdCA9IG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChsYXN0LnNwZWFrZXIgPT09ICdhZ2VudCcgJiYgbGFzdC50eXBlID09PSAnYXVkaW8nICYmIGxhc3QubWVzc2FnZV9pZCkge1xuICAgICAgc2V0QXV0b1BsYXlBdWRpb01lc3NhZ2VJZChsYXN0Lm1lc3NhZ2VfaWQpO1xuICAgIH1cbiAgfSwgW21lc3NhZ2VzLCB1c2VBdWRpb10pO1xuXG4gIGNvbnN0IGhhbmRsZVF1ZXJ5Q2xpY2sgPSBhc3luYyAocXVlcnk6IHN0cmluZykgPT4ge1xuICAgIGlmIChpc0FnZW50VHlwaW5nIHx8IGlzTG9hZGluZykgcmV0dXJuO1xuXG4gICAgc2V0U2VsZWN0ZWRGYXFRdWVyeShxdWVyeSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2VuZE1lc3NhZ2UocXVlcnksIFtdLCB7IGZhcV9xdWVyeTogcXVlcnkgfSwgcmVDYXB0Y2hhVG9rZW5SZWYuY3VycmVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVTdGFydENvbnZlcnNhdGlvbiA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNMb2FkaW5nKSByZXR1cm47XG5cbiAgICBzZXRJbnB1dFZhbHVlKCcnKTtcbiAgICBjbGVhckF0dGFjaG1lbnRzKCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc3RhcnRDb252ZXJzYXRpb24ocmVDYXB0Y2hhVG9rZW5SZWYuY3VycmVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHN0YXJ0aW5nIGNvbnZlcnNhdGlvbicsIGVycm9yKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlRGlzbWlzc1F1aWNrSW5wdXQgPSAoKSA9PiB7XG4gICAgc2V0UXVpY2tJbnB1dERpc21pc3NlZCh0cnVlKTtcbiAgICB0cnkgeyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZ2VuYXNzaXN0X3F1aWNrX2lucHV0X2Rpc21pc3NlZCcsICcxJyk7IH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfVxuICB9O1xuXG4gIC8vIFF1aWNrIGlucHV0IG5leHQgdG8gdGhlIGJ1YmJsZTogb3BlbiB0aGUgcGFuZWwsIHN0YXJ0IGEgY29udmVyc2F0aW9uIGlmIG5lZWRlZCwgdGhlbiBzZW5kLlxuICBjb25zdCBoYW5kbGVRdWlja0lucHV0U2VuZCA9IGFzeW5jICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB0cmltbWVkID0gdGV4dC50cmltKCk7XG4gICAgaWYgKCF0cmltbWVkKSByZXR1cm47XG4gICAgc2V0SXNGbG9hdGluZ09wZW4odHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghY29udmVyc2F0aW9uSWQpIHtcbiAgICAgICAgYXdhaXQgc3RhcnRDb252ZXJzYXRpb24ocmVDYXB0Y2hhVG9rZW5SZWYuY3VycmVudCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBzZW5kTWVzc2FnZSh0cmltbWVkLCBbXSwgdW5kZWZpbmVkLCByZUNhcHRjaGFUb2tlblJlZi5jdXJyZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZU1lbnVDbGljayA9ICgpID0+IHtcbiAgICBzZXRTaG93TWVudShwcmV2ID0+ICFwcmV2KTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVSZXNldENsaWNrID0gKCkgPT4ge1xuICAgIHNldFNob3dNZW51KGZhbHNlKTtcbiAgICBzZXRTaG93UmVzZXRDb25maXJtKHRydWUpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUNvbmZpcm1SZXNldCA9ICgpID0+IHtcbiAgICBzZXRTaG93UmVzZXRDb25maXJtKGZhbHNlKTtcbiAgICAvLyBlbmRMaXZlQ2FsbCBzdG9wcyBhbnkgYWN0aXZlIGNhbGwgYW5kIHJ1bnMgdGhlIGZ1bGwgcmVzZXQ7IGhhcm1sZXNzIGlmIG5vXG4gICAgLy8gY2FsbCBpcyBhY3RpdmUsIHNvIGJvdGggZW50cnkgcG9pbnRzIHNoYXJlIG9uZSBjb2RlIHBhdGguXG4gICAgZW5kTGl2ZUNhbGwoKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVDYW5jZWxSZXNldCA9ICgpID0+IHtcbiAgICBzZXRTaG93UmVzZXRDb25maXJtKGZhbHNlKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVMYW5ndWFnZUNoYW5nZSA9IChsYW5nOiBzdHJpbmcpID0+IHtcbiAgICBzZXRTZWxlY3RlZExhbmd1YWdlKGxhbmcpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVJlQ2FwdGNoYVZlcmlmeSA9IHVzZUNhbGxiYWNrKCh0b2tlbjogc3RyaW5nKSA9PiB7XG4gICAgcmVDYXB0Y2hhVG9rZW5SZWYuY3VycmVudCA9IHRva2VuO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgYWxsTGFuZ3VhZ2VzID0gW1xuICAgIHsgY29kZTogJ2VuJywgbmFtZTogJ0VuZ2xpc2gnIH0sXG4gICAgeyBjb2RlOiAnZXMnLCBuYW1lOiAnRXNwYcOxb2wnIH0sXG4gICAgeyBjb2RlOiAnZnInLCBuYW1lOiAnRnJhbsOnYWlzJyB9LFxuICAgIHsgY29kZTogJ2RlJywgbmFtZTogJ0RldXRzY2gnIH0sXG4gICAgeyBjb2RlOiAnaXQnLCBuYW1lOiAnSXRhbGlhbm8nIH0sXG4gICAgeyBjb2RlOiAncHQnLCBuYW1lOiAnUG9ydHVndcOqcycgfSxcbiAgICB7IGNvZGU6ICd6aCcsIG5hbWU6ICfkuK3mlocnIH0sXG4gIF07XG4gIGNvbnN0IGF2YWlsYWJsZUxhbmd1YWdlcyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFnZW50QXZhaWxhYmxlTGFuZ3VhZ2VzKSkge1xuICAgICAgY29uc3QgYWxsb3dlZCA9IG5ldyBTZXQoXG4gICAgICAgIGFnZW50QXZhaWxhYmxlTGFuZ3VhZ2VzLm1hcCgobGFuZykgPT4gbGFuZy50b0xvd2VyQ2FzZSgpKSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gYWxsTGFuZ3VhZ2VzLmZpbHRlcigobGFuZykgPT4gYWxsb3dlZC5oYXMobGFuZy5jb2RlKSk7XG4gICAgfVxuICAgIHJldHVybiBhbGxMYW5ndWFnZXM7XG4gIH0sIFthZ2VudEF2YWlsYWJsZUxhbmd1YWdlc10pO1xuICBjb25zdCBoYXNMYW5ndWFnZU9wdGlvbnMgPSBhdmFpbGFibGVMYW5ndWFnZXMubGVuZ3RoID4gMDtcblxuICAvLyBSZXNvbHZlIHRoZW1lIHZhbHVlc1xuICBjb25zdCB0aGVtZVBhcmFtcyA9IHJlc29sdmVUaGVtZSh0aGVtZSk7XG4gIGNvbnN0IHsgcHJpbWFyeUNvbG9yLCBiYWNrZ3JvdW5kQ29sb3IsIHRleHRDb2xvciwgZm9udEZhbWlseSwgZm9udFNpemUgfSA9IHRoZW1lUGFyYW1zO1xuICBjb25zdCBmb250U2l6ZU51bWJlciA9IHR5cGVvZiBmb250U2l6ZSA9PT0gJ3N0cmluZycgPyBwYXJzZUludChmb250U2l6ZSwgMTApIDogKHR5cGVvZiBmb250U2l6ZSA9PT0gJ251bWJlcicgPyBmb250U2l6ZSA6IDE0KTtcblxuICBjb25zdCBwb3NpdGlvbiA9IGZsb2F0aW5nQ29uZmlnLnBvc2l0aW9uIHx8ICdib3R0b20tcmlnaHQnO1xuICBjb25zdCBvZmZzZXQgPSBmbG9hdGluZ0NvbmZpZy5vZmZzZXQgfHwgeyB4OiAyMCwgeTogMjAgfTtcbiAgY29uc3Qgb2Zmc2V0WCA9IG9mZnNldC54IHx8IDIwO1xuICBjb25zdCBvZmZzZXRZID0gb2Zmc2V0LnkgfHwgMjA7XG5cbiAgY29uc3QgaXNGbG9hdGluZ0RvY2tlZCA9IG1vZGUgPT09ICdmbG9hdGluZycgJiYgIWlzRnVsbHNjcmVlbjtcblxuICAvLyBDb21wdXRlZCBzdHlsZXNcbiAgY29uc3QgY29udGFpbmVyU3R5bGUgPSBnZXRDb250YWluZXJTdHlsZSh7IGlzRnVsbHNjcmVlbiwgaXNGbG9hdGluZ0RvY2tlZCwgd2luZG93V2lkdGgsIHQ6IHRoZW1lUGFyYW1zIH0pO1xuICBjb25zdCBoZWFkZXJTdHlsZSA9IGdldEhlYWRlclN0eWxlKHRoZW1lUGFyYW1zKTtcbiAgY29uc3QgaGVhZGVyUGlsbFRpdGxlU3R5bGUgPSBnZXRIZWFkZXJQaWxsVGl0bGVTdHlsZShmb250RmFtaWx5KTtcbiAgY29uc3QgaGVhZGVyRGVzY3JpcHRpb25UZXh0U3R5bGUgPSBnZXRIZWFkZXJEZXNjcmlwdGlvblRleHRTdHlsZShmb250RmFtaWx5KTtcbiAgY29uc3QgaGVhZGVyRGVzY3JpcHRpb24gPSAoZGVzY3JpcHRpb24gPz8gdCgnaGVhZGVyLnN1YnRpdGxlJykgPz8gJycpLnRyaW0oKTtcbiAgY29uc3QgYnJhbmRMb2dvID0gYnJhbmRMb2dvVXJsPy50cmltKCkgPz8gJyc7XG4gIGNvbnN0IGhhc0JyYW5kTG9nbyA9IGJyYW5kTG9nby5sZW5ndGggPiAwO1xuICAvLyBEZXNjcmlwdGlvbiByZXZlYWwgb25seSBhcHBsaWVzIHRvIHRoZSBzbWFsbC1sb2dvIGxheW91dDsgdGhlIGZ1bGwgYnJhbmQgbG9nbyByZXBsYWNlcyB0aGUgdGV4dC5cbiAgY29uc3QgaGFzSGVhZGVyRGVzY3JpcHRpb24gPSAhaGFzQnJhbmRMb2dvICYmIGhlYWRlckRlc2NyaXB0aW9uLmxlbmd0aCA+IDA7XG4gIGNvbnN0IG1lbnVQb3B1cFN0eWxlID0gZ2V0TWVudVBvcHVwU3R5bGUoYmFja2dyb3VuZENvbG9yKTtcbiAgY29uc3QgbWVudUl0ZW1TdHlsZSA9IGdldE1lbnVJdGVtU3R5bGUodGhlbWVQYXJhbXMpO1xuICAvLyBIb3ZlciBmaWxsIGZvciBtZW51IGl0ZW1zIC8gb3V0bGluZSBidXR0b25zIOKAlCB0aGVtZS1hd2FyZSwgbWF0Y2hlcyB0aGUgd2ViIGFwcCdzIGJnLWFjY2VudC5cbiAgY29uc3QgbWVudUhvdmVyQmcgPSB0aGVtZT8uc2Vjb25kYXJ5Q29sb3IgfHwgJyNmNGY0ZjUnO1xuICBjb25zdCBjb250ZW50Q2FyZFN0eWxlID0gZ2V0Q29udGVudENhcmRTdHlsZShiYWNrZ3JvdW5kQ29sb3IpO1xuICBjb25zdCBzZW5kQnV0dG9uU3R5bGUgPSBnZXRTZW5kQnV0dG9uU3R5bGUocHJpbWFyeUNvbG9yKTtcbiAgY29uc3QgcG9zc2libGVRdWVyaWVzQ29udGFpbmVyU3R5bGUgPSBnZXRQb3NzaWJsZVF1ZXJpZXNDb250YWluZXJTdHlsZShmb250RmFtaWx5KTtcbiAgY29uc3QgcXVlcnlCdXR0b25TdHlsZSA9IGdldFF1ZXJ5QnV0dG9uU3R5bGUodGhlbWVQYXJhbXMpO1xuICBjb25zdCBjb25maXJtT3ZlcmxheVN0eWxlID0gZ2V0Q29uZmlybU92ZXJsYXlTdHlsZShzaG93UmVzZXRDb25maXJtKTtcbiAgY29uc3QgY29uZmlybURpYWxvZ1N0eWxlID0gZ2V0Q29uZmlybURpYWxvZ1N0eWxlKHRoZW1lUGFyYW1zKTtcbiAgY29uc3QgZGlzY2xhaW1lclN0eWxlID0gZ2V0RGlzY2xhaW1lclN0eWxlKGZvbnRGYW1pbHkpO1xuXG4gIGNvbnN0IHRleHRBcmVhRm9udFNpemUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAod2luZG93V2lkdGggPD0gNzY4KSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoMTYsIGZvbnRTaXplTnVtYmVyKSArICdweCc7XG4gICAgfVxuICAgIHJldHVybiBmb250U2l6ZTtcbiAgfSwgW3dpbmRvd1dpZHRoLCBmb250U2l6ZSwgZm9udFNpemVOdW1iZXJdKTtcblxuICBjb25zdCB0ZXh0QXJlYUxpbmVIZWlnaHQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBzaXplID0gd2luZG93V2lkdGggPD0gNzY4ID8gTWF0aC5tYXgoMTYsIGZvbnRTaXplTnVtYmVyKSA6IGZvbnRTaXplTnVtYmVyO1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHNpemUgKiAxLjUpO1xuICB9LCBbd2luZG93V2lkdGgsIGZvbnRTaXplTnVtYmVyXSk7XG5cbiAgY29uc3QgdGV4dEFyZWFNYXhIZWlnaHRDYWxjdWxhdGVkID0gdXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIHRleHRBcmVhTGluZUhlaWdodCAqIDM7XG4gIH0sIFt0ZXh0QXJlYUxpbmVIZWlnaHRdKTtcblxuICBjb25zdCB0ZXh0QXJlYVN0eWxlID0gZ2V0VGV4dEFyZWFTdHlsZSh7XG4gICAgdGV4dEFyZWFGb250U2l6ZSxcbiAgICBmb250RmFtaWx5LFxuICAgIHRleHRBcmVhTGluZUhlaWdodCxcbiAgICB0ZXh0QXJlYU1heEhlaWdodENhbGN1bGF0ZWQsXG4gICAgdGV4dENvbG9yLFxuICB9KTtcblxuICAvLyBBIGZvcm1fcmVxdWVzdCBpcyBcImFuc3dlcmVkXCIgb25jZSB0aGUgdmlzaXRvciBoYXMgcmVzcG9uZGVkIHRvIGl0LiBCZXNpZGVzIHRoZVxuICAvLyBvcHRpbWlzdGljIGluLXNlc3Npb24gZmxhZyAoYHN1Ym1pdHRlZEZvcm1zYCksIHdlIGFsc28gdHJlYXQgaXQgYXMgYW5zd2VyZWQgd2hlbiBhXG4gIC8vIGxhdGVyIGN1c3RvbWVyIG1lc3NhZ2UgZXhpc3RzIOKAlCB0aGF0IHN1cnZpdmVzIGEgcGFnZSByZWxvYWQgKHdoZXJlIGBzdWJtaXR0ZWRGb3Jtc2BcbiAgLy8gaXMgZ29uZSksIHNvIGEgY29tcGxldGVkIGZvcm0gbmV2ZXIgcmVhcHBlYXJzIGFmdGVyIHJlZnJlc2guXG4gIGNvbnN0IGlzRm9ybUFuc3dlcmVkID0gKGluZGV4OiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICBpZiAoc3VibWl0dGVkRm9ybXMuaGFzKGluZGV4KSkgcmV0dXJuIHRydWU7XG4gICAgZm9yIChsZXQgaiA9IGluZGV4ICsgMTsgaiA8IG1lc3NhZ2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAobWVzc2FnZXNbal0uc3BlYWtlciA9PT0gJ2N1c3RvbWVyJykgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBjb25zdCBoYXNQZW5kaW5nRm9ybSA9IG1lc3NhZ2VzLnNvbWUoXG4gICAgKG1zZywgaWR4KSA9PlxuICAgICAgbXNnLnR5cGUgPT09ICdmb3JtX3JlcXVlc3QnICYmIG1zZy5zcGVha2VyID09PSAnYWdlbnQnICYmICFpc0Zvcm1BbnN3ZXJlZChpZHgpLFxuICApO1xuXG4gIGNvbnN0IHBlbmRpbmdGb3JtID0gdXNlTWVtbygoKSA9PiB7XG4gICAgZm9yIChsZXQgaSA9IG1lc3NhZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBtc2cgPSBtZXNzYWdlc1tpXTtcbiAgICAgIGlmIChtc2cudHlwZSA9PT0gJ2Zvcm1fcmVxdWVzdCcgJiYgbXNnLnNwZWFrZXIgPT09ICdhZ2VudCcgJiYgIWlzRm9ybUFuc3dlcmVkKGkpKSB7XG4gICAgICAgIHRyeSB7IHJldHVybiB7IHNjaGVtYTogbG9jYWxpemVGb3JtKEpTT04ucGFyc2UobXNnLnRleHQpKSwgaW5kZXg6IGkgfTsgfVxuICAgICAgICBjYXRjaCB7IC8qIHNraXAgKi8gfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFttZXNzYWdlcywgc3VibWl0dGVkRm9ybXMsIGxvY2FsaXplRm9ybV0pO1xuXG4gIGNvbnN0IGlzU2VuZERpc2FibGVkID0gKGlucHV0VmFsdWUudHJpbSgpID09PSAnJyAmJiBhdHRhY2htZW50cy5sZW5ndGggPT09IDApIHx8IGlzQWdlbnRUeXBpbmcgfHwgaGFzUGVuZGluZ0Zvcm07XG5cbiAgY29uc3QgYXV0b1Jlc2l6ZVRleHRBcmVhID0gKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gdGV4dEFyZWFSZWYuY3VycmVudDtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgZWwuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuICAgIGNvbnN0IG5ld0hlaWdodCA9IE1hdGgubWluKGVsLnNjcm9sbEhlaWdodCwgdGV4dEFyZWFNYXhIZWlnaHRDYWxjdWxhdGVkKTtcbiAgICBlbC5zdHlsZS5oZWlnaHQgPSBgJHtuZXdIZWlnaHR9cHhgO1xuICAgIGVsLnN0eWxlLm92ZXJmbG93WSA9IGVsLnNjcm9sbEhlaWdodCA+IHRleHRBcmVhTWF4SGVpZ2h0Q2FsY3VsYXRlZCA/ICdhdXRvJyA6ICdoaWRkZW4nO1xuICB9O1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgYXV0b1Jlc2l6ZVRleHRBcmVhKCk7XG4gIH0sIFtpbnB1dFZhbHVlLCB0ZXh0QXJlYU1heEhlaWdodENhbGN1bGF0ZWRdKTtcblxuICBjb25zdCBzaG93QWdlbnREaXNjbGFpbWVyID0gQm9vbGVhbihpbnB1dERpc2NsYWltZXJIdG1sKTtcbiAgY29uc3QgYWdlbnREaXNjbGFpbWVyQ29udGVudCA9IHNob3dBZ2VudERpc2NsYWltZXIgJiYgKFxuICAgIDxzcGFuIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7IF9faHRtbDogaW5wdXREaXNjbGFpbWVySHRtbCEgfX0gLz5cbiAgKTtcblxuICBjb25zdCBmbG9hdGluZ0NvbnRhaW5lclN0eWxlID0gZ2V0RmxvYXRpbmdDb250YWluZXJTdHlsZSh7XG4gICAgbW9kZSxcbiAgICBpc0Z1bGxzY3JlZW4sXG4gICAgd2luZG93V2lkdGgsXG4gICAgd2luZG93SGVpZ2h0LFxuICAgIHBvc2l0aW9uLFxuICAgIG9mZnNldFgsXG4gICAgb2Zmc2V0WSxcbiAgICBpc0V4cGFuZGVkLFxuICB9KTtcblxuICBjb25zdCByZW5kZXJMYW5ndWFnZVNlbGVjdG9yID0gKCkgPT4ge1xuICAgIGlmICghU0hPV19DSEFUX0xBTkdVQUdFX1NFTEVDVE9SKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIWhhc0xhbmd1YWdlT3B0aW9ucyB8fCAoY29udmVyc2F0aW9uSWQgJiYgIWlzRmluYWxpemVkKSB8fCBtZXNzYWdlcy5sZW5ndGggPiAwIHx8IGhhc1VzZXJNZXNzYWdlcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8TGFuZ3VhZ2VTZWxlY3RvclxuICAgICAgICBhdmFpbGFibGVMYW5ndWFnZXM9e2F2YWlsYWJsZUxhbmd1YWdlc31cbiAgICAgICAgc2VsZWN0ZWRMYW5ndWFnZT17cmVzb2x2ZWRMYW5ndWFnZX1cbiAgICAgICAgb25MYW5ndWFnZUNoYW5nZT17aGFuZGxlTGFuZ3VhZ2VDaGFuZ2V9XG4gICAgICAgIHRyYW5zbGF0aW9ucz17dHJhbnNsYXRpb25zfVxuICAgICAgICB0aGVtZT17dGhlbWV9XG4gICAgICAvPlxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgcmVuZGVyV2l0aFJlQ2FwdGNoYSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghcmVDYXB0Y2hhS2V5KSB7XG4gICAgICByZXR1cm4gKGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUpID0+IDw+e2NoaWxkcmVufTwvPjtcbiAgICB9XG5cbiAgICByZXR1cm4gKGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUpID0+IChcbiAgICAgIDxHb29nbGVSZUNhcHRjaGFQcm92aWRlciByZUNhcHRjaGFLZXk9e3JlQ2FwdGNoYUtleSB8fCAnJ30+XG4gICAgICAgIDxHb29nbGVSZUNhcHRjaGFcbiAgICAgICAgICBhY3Rpb249XCJnZW5hc3Npc3RfY2hhdFwiXG4gICAgICAgICAgb25WZXJpZnk9e2hhbmRsZVJlQ2FwdGNoYVZlcmlmeX1cbiAgICAgICAgICByZWZyZXNoUmVDYXB0Y2hhPXtmYWxzZX1cbiAgICAgICAgLz5cbiAgICAgICAgPD57Y2hpbGRyZW59PC8+XG4gICAgICA8L0dvb2dsZVJlQ2FwdGNoYVByb3ZpZGVyPlxuICAgICk7XG4gIH0sIFtyZUNhcHRjaGFLZXksIGhhbmRsZVJlQ2FwdGNoYVZlcmlmeV0pO1xuXG4gIGNvbnN0IHJlbmRlckNoYXRDb21wb25lbnQgPSAoKSA9PiAoXG4gICAgPGRpdiBzdHlsZT17eyAuLi5jb250YWluZXJTdHlsZSwgWyctLWdhLWhvdmVyJyBhcyBzdHJpbmddOiBtZW51SG92ZXJCZyB9fSBkYXRhLWdlbmFzc2lzdC1yb290PVwidHJ1ZVwiPlxuICAgICAgPHN0eWxlPntDU1NfS0VZRlJBTUVTfTwvc3R5bGU+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImdhLWhlYWRlclwiIHN0eWxlPXtoZWFkZXJTdHlsZX0gcmVmPXtoZWFkZXJSZWZ9PlxuICAgICAgICB7LyogTGVmdDogaGlkZGVuIGV4cGFuZCBidXR0b24gKHJldmVhbGVkIG9uIGhvdmVyKSArIGxvZ28vbmFtZSBncm91cC5cbiAgICAgICAgICAgIEhvdmVyaW5nIHRoaXMgc2VjdGlvbiBleHBhbmRzIHRoZSBidXR0b24gZnJvbSAwIHdpZHRoLCBzbGlkaW5nIHRoZSBncm91cCByaWdodC4gKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ2EtaGVhZGVyLWxlZnRcIiBzdHlsZT17aGVhZGVyTGVmdENvbnRhaW5lclN0eWxlfT5cbiAgICAgICAgICB7bW9kZSA9PT0gJ2Zsb2F0aW5nJyAmJiAhaXNGdWxsc2NyZWVuICYmIHdpbmRvd1dpZHRoID4gNzY4ICYmIChcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZ2EtaGVhZGVyLWJ0biBnYS1oZWFkZXItZXhwYW5kLWJ0blwiXG4gICAgICAgICAgICAgIHN0eWxlPXt7IC4uLm1lbnVCdXR0b25TdHlsZSwgd2lkdGg6IHVuZGVmaW5lZCwgZmxleFNocmluazogMCB9fVxuICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVFeHBhbmRUb2dnbGV9XG4gICAgICAgICAgICAgIHRpdGxlPXtpc0V4cGFuZGVkID8gdCgnbWVudS5jb2xsYXBzZScsICdDb2xsYXBzZScpIDogdCgnbWVudS5leHBhbmQnLCAnRXhwYW5kJyl9XG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9e2lzRXhwYW5kZWQgPyB0KCdtZW51LmNvbGxhcHNlJywgJ0NvbGxhcHNlJykgOiB0KCdtZW51LmV4cGFuZCcsICdFeHBhbmQnKX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2lzRXhwYW5kZWQgPyAoXG4gICAgICAgICAgICAgICAgPE1pbmltaXplMiBzaXplPXsyMH0gY29sb3I9XCIjMTExMTExXCIgLz5cbiAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICA8TWF4aW1pemUyIHNpemU9ezIwfSBjb2xvcj1cIiMxMTExMTFcIiAvPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIHN0eWxlPXtoZWFkZXJQaWxsU3R5bGV9XG4gICAgICAgICAgICB0YWJJbmRleD17aGFzSGVhZGVyRGVzY3JpcHRpb24gPyAwIDogdW5kZWZpbmVkfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtoYXNCcmFuZExvZ28gPyAoXG4gICAgICAgICAgICAgIDxpbWcgc3JjPXticmFuZExvZ299IGFsdD17aGVhZGVyVGl0bGV9IHN0eWxlPXticmFuZExvZ29TdHlsZX0gLz5cbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9e2xvZ29Vcmw/LnRyaW0oKSB8fCBjaGF0TG9nb30gYWx0PVwiTG9nb1wiIHN0eWxlPXtsb2dvU3R5bGV9IC8+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17aGVhZGVyUGlsbFRleHRDb2x1bW5TdHlsZX0+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT17aGVhZGVyUGlsbFRpdGxlU3R5bGV9IHRpdGxlPXtoZWFkZXJUaXRsZX0+e2hlYWRlclRpdGxlfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIHtoYXNIZWFkZXJEZXNjcmlwdGlvbiAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ2EtaGVhZGVyLWRlc2NcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdhLWhlYWRlci1kZXNjLWlubmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJnYS1oZWFkZXItZGVzYy10ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgLi4uaGVhZGVyRGVzY3JpcHRpb25UZXh0U3R5bGUsIGRpc3BsYXk6ICdibG9jaycgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2hlYWRlckRlc2NyaXB0aW9ufVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIFJpZ2h0OiBtZW51ICsgY2xvc2UgKi99XG4gICAgICAgIDxkaXYgc3R5bGU9e2hlYWRlclJpZ2h0Q29udGFpbmVyU3R5bGV9PlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImdhLWhlYWRlci1idG5cIlxuICAgICAgICAgICAgc3R5bGU9e21lbnVCdXR0b25TdHlsZX1cbiAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZU1lbnVDbGlja31cbiAgICAgICAgICAgIHRpdGxlPXt0KCdtZW51LnRpdGxlJyl9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPE1vcmVIb3Jpem9udGFsIHNpemU9ezIyfSBjb2xvcj1cIiMxMTExMTFcIiAvPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIHttb2RlID09PSAnZmxvYXRpbmcnICYmIChcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZ2EtaGVhZGVyLWJ0blwiXG4gICAgICAgICAgICAgIHN0eWxlPXttZW51QnV0dG9uU3R5bGV9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldElzRmxvYXRpbmdPcGVuKGZhbHNlKX1cbiAgICAgICAgICAgICAgdGl0bGU9XCJDbG9zZSBjaGF0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPFggc2l6ZT17MjJ9IGNvbG9yPVwiIzExMTExMVwiIC8+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgeyFub0NvbG9yQW5pbWF0aW9uICYmIHNob3dCYWNrbGlnaHQgJiYgKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgIHJpZ2h0OiAwLFxuICAgICAgICAgICAgdG9wOiBNYXRoLm1heCgwLCBoZWFkZXJIZWlnaHQgLSAxNCksXG4gICAgICAgICAgICBoZWlnaHQ6IDQyLFxuICAgICAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgICAgICAgekluZGV4OiAxLFxuICAgICAgICAgICAgb3BhY2l0eTogaXNBZ2VudFR5cGluZyA/IDEgOiAwLFxuICAgICAgICAgICAgdHJhbnNpdGlvbjogJ29wYWNpdHkgNDIwbXMgZWFzZS1pbi1vdXQnLFxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgICAgdG9wOiA2LFxuICAgICAgICAgICAgICBoZWlnaHQ6IDMyLFxuICAgICAgICAgICAgICB3aWR0aDogJzc4JScsXG4gICAgICAgICAgICAgIGZpbHRlcjogJ2JsdXIoMjJweCknLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kOlxuICAgICAgICAgICAgICAgIGBsaW5lYXItZ3JhZGllbnQoOTBkZWcsICR7aGV4VG9SZ2JhKHByaW1hcnlDb2xvciwgMC4wKX0gMCUsICR7aGV4VG9SZ2JhKHByaW1hcnlDb2xvciwgMC4zNSl9IDE1JSwgJHtoZXhUb1JnYmEocHJpbWFyeUNvbG9yLCAwLjU1KX0gNTAlLCAke2hleFRvUmdiYShwcmltYXJ5Q29sb3IsIDAuMzUpfSA4NSUsICR7aGV4VG9SZ2JhKHByaW1hcnlDb2xvciwgMC4wKX0gMTAwJSlgLFxuICAgICAgICAgICAgICB3aWxsQ2hhbmdlOiAndHJhbnNmb3JtLCBvcGFjaXR5JyxcbiAgICAgICAgICAgICAgYW5pbWF0aW9uOiAnZ2EtYmFja2xpZ2h0LXN3ZWVwMiAxLjJzIGN1YmljLWJlemllcigwLjQsMC4wLDAuMiwxKSBpbmZpbml0ZSBhbHRlcm5hdGUsIGdhLWJhY2tsaWdodC1wdWxzZSAyLjRzIGVhc2UtaW4tb3V0IGluZmluaXRlJyxcbiAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAxOCxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuXG4gICAgICB7c2hvd01lbnUgJiYgKFxuICAgICAgICA8ZGl2IHJlZj17bWVudVJlZn0gc3R5bGU9e21lbnVQb3B1cFN0eWxlfT5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdhLW1lbnUtaXRlbVwiIHN0eWxlPXttZW51SXRlbVN0eWxlfSBvbkNsaWNrPXtoYW5kbGVSZXNldENsaWNrfT5cbiAgICAgICAgICAgIDxSZWZyZXNoQ3cgc2l6ZT17MTZ9IC8+XG4gICAgICAgICAgICB7dCgnbWVudS5yZXNldENvbnZlcnNhdGlvbicpfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIHttb2RlICE9PSAnZnVsbHNjcmVlbicgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJnYS1tZW51LWl0ZW1cIiBzdHlsZT17bWVudUl0ZW1TdHlsZX0gb25DbGljaz17aGFuZGxlRnVsbHNjcmVlblRvZ2dsZX0+XG4gICAgICAgICAgICAgIDxGdWxsc2NyZWVuIHNpemU9ezE2fSAvPlxuICAgICAgICAgICAgICB7dCgnbWVudS5mdWxsc2NyZWVuJyl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICAgIHtoYXNMYW5ndWFnZU9wdGlvbnMgJiYgKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJnYS1tZW51LWl0ZW1cIlxuICAgICAgICAgICAgICBzdHlsZT17eyAuLi5tZW51SXRlbVN0eWxlLCBwb3NpdGlvbjogJ3JlbGF0aXZlJyB9fVxuICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgc2V0U2hvd0xhbmd1YWdlRHJvcGRvd24oIXNob3dMYW5ndWFnZURyb3Bkb3duKTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPEdsb2JlIHNpemU9ezE2fSAvPlxuICAgICAgICAgICAgICA8c3BhbiBzdHlsZT17eyBmbGV4OiAxIH19Pnt0KCdtZW51Lmxhbmd1YWdlJyl9PC9zcGFuPlxuICAgICAgICAgICAgICB7c2hvd0xhbmd1YWdlRHJvcGRvd24gJiYgKFxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgICAgICAgICAgICAgdG9wOiAnMTAwJScsXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpblRvcDogJzRweCcsXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICcxMHB4JyxcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkICNlNGU0ZTcnLFxuICAgICAgICAgICAgICAgICAgICBib3hTaGFkb3c6ICcwIDRweCA2cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMSksIDAgMnB4IDRweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4xKScsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6ICc0cHgnLFxuICAgICAgICAgICAgICAgICAgICBtaW5XaWR0aDogJzE4MHB4JyxcbiAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6ICcyMDBweCcsXG4gICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICAgICAgICAgICAgICAgekluZGV4OiAxMDAxLFxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHthdmFpbGFibGVMYW5ndWFnZXMubWFwKChsYW5nKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBrZXk9e2xhbmcuY29kZX1cbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBnYXA6ICc4cHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogJzZweCA4cHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnOHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiB0ZXh0Q29sb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHJlc29sdmVkTGFuZ3VhZ2UgPT09IGxhbmcuY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1lbnVIb3ZlckJnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb250RmFtaWx5LFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogJ2JhY2tncm91bmQtY29sb3IgMC4xNXMgZWFzZScsXG4gICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICBvbk1vdXNlRW50ZXI9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRMYW5ndWFnZSAhPT0gbGFuZy5jb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUuY3VycmVudFRhcmdldC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBtZW51SG92ZXJCZztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgIG9uTW91c2VMZWF2ZT17KGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZExhbmd1YWdlICE9PSBsYW5nLmNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZS5jdXJyZW50VGFyZ2V0LnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd0cmFuc3BhcmVudCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUxhbmd1YWdlQ2hhbmdlKGxhbmcuY29kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRTaG93TGFuZ3VhZ2VEcm9wZG93bihmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRTaG93TWVudShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHtsYW5nLm5hbWV9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG5cbiAgICAgIDxkaXYgc3R5bGU9e2NvbnRlbnRDYXJkU3R5bGV9PlxuICAgICAgICA8ZGl2IHN0eWxlPXtjaGF0Q29udGFpbmVyU3R5bGV9IHJlZj17Y2hhdENvbnRhaW5lclJlZn0+XG4gICAgICAgICAge3JlbmRlckxhbmd1YWdlU2VsZWN0b3IoKX1cblxuICAgICAgICAgIHsoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2hvdWxkU2hvd1N5bnRoZXRpY1dlbGNvbWUgPVxuICAgICAgICAgICAgICBzaG93V2VsY29tZUJlZm9yZVN0YXJ0ICYmXG4gICAgICAgICAgICAgICFoYXNVc2VyTWVzc2FnZXMgJiZcbiAgICAgICAgICAgICAgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCB8fCBtZXNzYWdlc1swXS5zcGVha2VyICE9PSAnYWdlbnQnKSAmJlxuICAgICAgICAgICAgICAoQm9vbGVhbih3ZWxjb21lVGl0bGUpIHx8IEJvb2xlYW4od2VsY29tZUltYWdlVXJsKSB8fCBCb29sZWFuKHdlbGNvbWVNZXNzYWdlKSlcbiAgICAgICAgICAgICAgJiYgY29udmVyc2F0aW9uSWQ7XG5cbiAgICAgICAgICAgIGlmICghc2hvdWxkU2hvd1N5bnRoZXRpY1dlbGNvbWUpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICAgICAgICAgIGNvbnN0IHN5bnRoZXRpY1dlbGNvbWU6IENoYXRNZXNzYWdlID0ge1xuICAgICAgICAgICAgICBjcmVhdGVfdGltZTogbm93LFxuICAgICAgICAgICAgICBzdGFydF90aW1lOiAwLFxuICAgICAgICAgICAgICBlbmRfdGltZTogMC4wMSxcbiAgICAgICAgICAgICAgc3BlYWtlcjogJ2FnZW50JyxcbiAgICAgICAgICAgICAgdGV4dDogd2VsY29tZU1lc3NhZ2UgfHwgJycsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICA8Q2hhdE1lc3NhZ2VDb21wb25lbnRcbiAgICAgICAgICAgICAgICBrZXk9XCJfX3N5bnRoZXRpY193ZWxjb21lX19cIlxuICAgICAgICAgICAgICAgIG1lc3NhZ2U9e3N5bnRoZXRpY1dlbGNvbWV9XG4gICAgICAgICAgICAgICAgdGhlbWU9e3RoZW1lfVxuICAgICAgICAgICAgICAgIGlzRmlyc3RNZXNzYWdlPXt0cnVlfVxuICAgICAgICAgICAgICAgIGlzTmV4dFNhbWVTcGVha2VyPXtmYWxzZX1cbiAgICAgICAgICAgICAgICBpc1ByZXZTYW1lU3BlYWtlcj17ZmFsc2V9XG4gICAgICAgICAgICAgICAgZW5hYmxlVHlwZXdyaXRlcj17ZmFsc2V9XG4gICAgICAgICAgICAgICAgd2VsY29tZUltYWdlVXJsPXt3ZWxjb21lSW1hZ2VVcmwgfHwgdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAgIHdlbGNvbWVUaXRsZT17d2VsY29tZVRpdGxlIHx8IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICBwb3NzaWJsZVF1ZXJpZXM9e3Bvc3NpYmxlUXVlcmllc31cbiAgICAgICAgICAgICAgICBvblF1aWNrUXVlcnk9e2hhbmRsZVF1ZXJ5Q2xpY2t9XG4gICAgICAgICAgICAgICAgb25RdWlja0FjdGlvbj17aGFuZGxlUXVpY2tBY3Rpb259XG4gICAgICAgICAgICAgICAgdHJhbnNsYXRpb25zPXt0cmFuc2xhdGlvbnN9XG4gICAgICAgICAgICAgICAgbGFuZ3VhZ2U9e3Jlc29sdmVkTGFuZ3VhZ2V9XG4gICAgICAgICAgICAgICAgYWdlbnROYW1lPXthZ2VudE5hbWV9XG4gICAgICAgICAgICAgICAgaXNBZ2VudFR5cGluZz17aXNBZ2VudFR5cGluZ31cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSkoKX1cbiAgICAgICAgICB7KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0QWdlbnRJbmRleCA9IG1lc3NhZ2VzLmZpbmRJbmRleChtID0+IG0uc3BlYWtlciA9PT0gJ2FnZW50Jyk7XG5cbiAgICAgICAgICAgIC8vIExpdmUtdm9pY2UgdHVybnMgYXJlIHJlbmRlcmVkIGxvY2FsbHkgKGJlbG93KSB0aGUgbW9tZW50IHRoZXkgZmluaXNoLlxuICAgICAgICAgICAgLy8gRWFjaCBpcyBhbHNvIHBlcnNpc3RlZCBhbmQgYnJvYWRjYXN0IGJhY2sgaW50byBgbWVzc2FnZXNgOyBzdXBwcmVzcyB0aGF0XG4gICAgICAgICAgICAvLyBjb3B5IHNvIGEgdHVybiBpc24ndCBzaG93biB0d2ljZSAoYW5kIG5ldmVyIGJsaW5rcyBhcyB0aGUgdHdvIHN3YXApLlxuICAgICAgICAgICAgY29uc3QgbGl2ZVR1cm5LZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHR1cm4gb2YgbGl2ZVR1cm5zKSB7XG4gICAgICAgICAgICAgIGlmICh0dXJuLnVzZXIudHJpbSgpKSBsaXZlVHVybktleXMuYWRkKGBjdXN0b21lcjoke3R1cm4udXNlci50cmltKCl9YCk7XG4gICAgICAgICAgICAgIGlmICh0dXJuLmFnZW50LnRyaW0oKSkgbGl2ZVR1cm5LZXlzLmFkZChgYWdlbnQ6JHt0dXJuLmFnZW50LnRyaW0oKX1gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYXBwbHlNZXNzYWdlRmlsdGVyID0gKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChtZXNzYWdlLnR5cGUgPT09ICdmaWxlJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICBpZiAobGl2ZVR1cm5LZXlzLmhhcyhgJHttZXNzYWdlLnNwZWFrZXJ9OiR7KG1lc3NhZ2UudGV4dCB8fCAnJykudHJpbSgpfWApKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZXMuZmlsdGVyKGFwcGx5TWVzc2FnZUZpbHRlcikubWFwKChtZXNzYWdlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICBpZiAobWVzc2FnZS50eXBlID09PSAnZm9ybV9yZXF1ZXN0JyAmJiBtZXNzYWdlLnNwZWFrZXIgPT09ICdhZ2VudCcpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybVNjaGVtYSA9IGxvY2FsaXplRm9ybShKU09OLnBhcnNlKG1lc3NhZ2UudGV4dCkpO1xuICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSByZWFsIG1lc3NhZ2UgcG9zaXRpb24gKGZpbHRlcmluZyBjYW4gc2hpZnQgdGhlIG1hcCBpbmRleCkgc28gdGhlXG4gICAgICAgICAgICAgICAgICAvLyBhbnN3ZXJlZCBjaGVjayBtYXRjaGVzIHRoZSBvdmVybGF5L2Zvb3RlciBwYXRoIGFuZCBzdXJ2aXZlcyByZWxvYWQuXG4gICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbEluZGV4ID0gbWVzc2FnZXMuaW5kZXhPZihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzUGVuZGluZyA9ICFpc0Zvcm1BbnN3ZXJlZChvcmlnaW5hbEluZGV4KTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXYga2V5PXtpbmRleH0gc3R5bGU9e3sgZGlzcGxheTogJ2ZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgbWF4V2lkdGg6ICc4NSUnLCBtYXJnaW5Cb3R0b206ICc4cHgnIH19PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgZm9udFNpemU6ICcxNHB4JywgY29sb3I6ICcjMDAwMDAwJywgZm9udFdlaWdodDogNjAwLCBtYXJnaW5Cb3R0b206IDQgfX0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7YWdlbnROYW1lIHx8ICdBZ2VudCd9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAge2Zvcm1EaXNwbGF5ID09PSAnaW5saW5lJyAmJiBpc1BlbmRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8RHluYW1pY0Zvcm1NZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYT17Zm9ybVNjaGVtYX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25TdWJtaXQ9eyhkYXRhKSA9PiBoYW5kbGVGb3JtU3VibWl0KGRhdGEsIG9yaWdpbmFsSW5kZXgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbD17KCkgPT4gaGFuZGxlRm9ybUNhbmNlbChvcmlnaW5hbEluZGV4KX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTdWJtaXR0aW5nPXtzdWJtaXR0aW5nRm9ybUluZGV4ID09PSBvcmlnaW5hbEluZGV4fVxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc1N1Ym1pdHRlZD17ZmFsc2V9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlDb2xvcj17cHJpbWFyeUNvbG9yfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBmb250RmFtaWx5PXtmb250RmFtaWx5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiY2FyZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJyNmM2Y0ZjYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICcxMnB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogJzEwcHggMTRweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiAnMTRweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzM3NDE1MScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHksXG4gICAgICAgICAgICAgICAgICAgICAgICB9fT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2Zvcm1TY2hlbWEubWVzc2FnZSB8fCAnUGxlYXNlIGZpbGwgdGhlIGZvcm0gYmVsb3cuJ31cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBub3JtYWwgcmVuZGVyaW5nIGlmIEpTT04gcGFyc2UgZmFpbHNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCBpc05leHRTYW1lU3BlYWtlciA9IGluZGV4IDwgbWVzc2FnZXMubGVuZ3RoIC0gMSAmJiBtZXNzYWdlc1tpbmRleCArIDFdLnNwZWFrZXIgPT09IG1lc3NhZ2Uuc3BlYWtlcjtcbiAgICAgICAgICAgICAgY29uc3QgaXNQcmV2U2FtZVNwZWFrZXIgPSBpbmRleCA+IDAgJiYgbWVzc2FnZXNbaW5kZXggLSAxXS5zcGVha2VyID09PSBtZXNzYWdlLnNwZWFrZXI7XG4gICAgICAgICAgICAgIC8vIFdoZW4gdGhlIGFnZW50IGdyZWV0cyBvbiBzdGFydCwgdGhhdCBncmVldGluZyBpcyBhIG5vcm1hbCByZXBseSDigJQgbm90IHRoZVxuICAgICAgICAgICAgICAvLyBcIndlbGNvbWVcIiBtZXNzYWdlIOKAlCBzbyBkb24ndCBnaXZlIGl0IHRoZSBmaXJzdC1tZXNzYWdlIHdlbGNvbWUgdHJlYXRtZW50XG4gICAgICAgICAgICAgIC8vICh3aGljaCB3b3VsZCBzcGxpdCBpdHMgdGV4dCBpbnRvIGEgYmlnIHRpdGxlICsgYm9keSkuXG4gICAgICAgICAgICAgIGNvbnN0IGlzRmlyc3RBZ2VudE1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgIGluZGV4ID09PSBmaXJzdEFnZW50SW5kZXggJiYgbWVzc2FnZS5zcGVha2VyID09PSAnYWdlbnQnICYmICFoYXNVc2VyTWVzc2FnZXMgJiYgIXNob3VsZFRyaWdnZXJTdGFydEZvcm07XG4gICAgICAgICAgICAgIGNvbnN0IGRpc3BsYXlNZXNzYWdlID1cbiAgICAgICAgICAgICAgICBpc0ZpcnN0QWdlbnRNZXNzYWdlICYmIHdlbGNvbWVNZXNzYWdlXG4gICAgICAgICAgICAgICAgICA/IHsgLi4ubWVzc2FnZSwgdGV4dDogd2VsY29tZU1lc3NhZ2UgfVxuICAgICAgICAgICAgICAgICAgOiBtZXNzYWdlO1xuXG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPENoYXRNZXNzYWdlQ29tcG9uZW50XG4gICAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgbWVzc2FnZT17ZGlzcGxheU1lc3NhZ2V9XG4gICAgICAgICAgICAgICAgICB0aGVtZT17dGhlbWV9XG4gICAgICAgICAgICAgICAgICBvblBsYXlBdWRpbz17bWVzc2FnZS5zcGVha2VyID09PSAnYWdlbnQnID8gcGxheVJlc3BvbnNlQXVkaW8gOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICBpc1BsYXlpbmdBdWRpbz17aXNQbGF5aW5nQXVkaW99XG4gICAgICAgICAgICAgICAgICBpc0ZpcnN0TWVzc2FnZT17aXNGaXJzdEFnZW50TWVzc2FnZX1cbiAgICAgICAgICAgICAgICAgIGlzTmV4dFNhbWVTcGVha2VyPXtpc05leHRTYW1lU3BlYWtlcn1cbiAgICAgICAgICAgICAgICAgIGlzUHJldlNhbWVTcGVha2VyPXtpc1ByZXZTYW1lU3BlYWtlcn1cbiAgICAgICAgICAgICAgICAgIG9uRmVlZGJhY2s9eyhtZXNzYWdlSWQsIHZhbHVlKSA9PiBhZGRGZWVkYmFjayhtZXNzYWdlSWQsIHZhbHVlKX1cbiAgICAgICAgICAgICAgICAgIGVuYWJsZVR5cGV3cml0ZXI9e2luZGV4ID09PSBtZXNzYWdlcy5sZW5ndGggLSAxICYmIG1lc3NhZ2Uuc3BlYWtlciA9PT0gJ2FnZW50J31cbiAgICAgICAgICAgICAgICAgIHdlbGNvbWVJbWFnZVVybD17aXNGaXJzdEFnZW50TWVzc2FnZSA/ICh3ZWxjb21lSW1hZ2VVcmwgfHwgdW5kZWZpbmVkKSA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICAgIHdlbGNvbWVUaXRsZT17aXNGaXJzdEFnZW50TWVzc2FnZSA/ICh3ZWxjb21lVGl0bGUgfHwgdW5kZWZpbmVkKSA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICAgIHBvc3NpYmxlUXVlcmllcz17aXNGaXJzdEFnZW50TWVzc2FnZSA/IHBvc3NpYmxlUXVlcmllcyA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICAgIG9uUXVpY2tRdWVyeT17aGFuZGxlUXVlcnlDbGlja31cbiAgICAgICAgICAgICAgICAgIG9uUXVpY2tBY3Rpb249e2hhbmRsZVF1aWNrQWN0aW9ufVxuICAgICAgICAgICAgICAgICAgb25TY2hlZHVsZUNvbmZpcm09e2hhbmRsZVNjaGVkdWxlQ29uZmlybX1cbiAgICAgICAgICAgICAgICAgIGlzTGFzdE1lc3NhZ2U9e2luZGV4ID09PSBtZXNzYWdlcy5sZW5ndGggLSAxICYmIG1lc3NhZ2Uuc3BlYWtlciA9PT0gJ2FnZW50J31cbiAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9ucz17dHJhbnNsYXRpb25zfVxuICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U9e3Jlc29sdmVkTGFuZ3VhZ2V9XG4gICAgICAgICAgICAgICAgICBhZ2VudE5hbWU9e2FnZW50TmFtZX1cbiAgICAgICAgICAgICAgICAgIGlzQWdlbnRUeXBpbmc9e2lzQWdlbnRUeXBpbmd9XG4gICAgICAgICAgICAgICAgICBhdWRpb1VybEJ1aWxkZXI9e21lc3NhZ2UudHlwZSA9PT0gJ2F1ZGlvJyAmJiB1c2VBdWRpbyA/IGF1ZGlvVXJsQnVpbGRlciA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICAgIGF1ZGlvSGVhZGVycz17bWVzc2FnZS50eXBlID09PSAnYXVkaW8nICYmIHVzZUF1ZGlvID8gYXVkaW9IZWFkZXJzIDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAgICAgYXV0b1BsYXlBdWRpb01lc3NhZ2VJZD17YXV0b1BsYXlBdWRpb01lc3NhZ2VJZH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkoKX1cbiAgICAgICAgICB7aXNBZ2VudFR5cGluZyAmJiBjdXJyZW50VGhpbmtpbmdQYXJ0cy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgZGlzcGxheTogJ2ZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgbWF4V2lkdGg6ICc4MCUnIH19PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7IGZvbnRTaXplOiAnMTRweCcsIGNvbG9yOiAnIzAwMDAwMCcsIGZvbnRXZWlnaHQ6IDYwMCwgbWFyZ2luQm90dG9tOiA0IH19PnthZ2VudE5hbWUgfHwgdCgnbGFiZWxzLmFnZW50Jyl9PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgcGFkZGluZzogMCxcbiAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IDAsXG4gICAgICAgICAgICAgICAgbWF4V2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgICAgfX0+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAga2V5PXtgJHtjdXJyZW50VGhpbmtpbmdQYXJ0SW5kZXh9LSR7Y3VycmVudFRoaW5raW5nUGFydHMuam9pbignfCcpfWB9XG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBhbmltYXRpb246ICdnYS10aGluay1jaGFuZ2UgMjIwbXMgZWFzZScsXG4gICAgICAgICAgICAgICAgICAgIHdpbGxDaGFuZ2U6ICd0cmFuc2Zvcm0sIG9wYWNpdHknLFxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyM2YjcyODAnLFxuICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogJzEzcHgnLFxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7Y3VycmVudFRoaW5raW5nUGFydHNbY3VycmVudFRoaW5raW5nUGFydEluZGV4XSB8fCBjdXJyZW50VGhpbmtpbmdQYXJ0c1tjdXJyZW50VGhpbmtpbmdQYXJ0cy5sZW5ndGggLSAxXX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICAgIHsvKiBDb21wbGV0ZWQgbGl2ZS12b2ljZSB0dXJucywgcmVuZGVyZWQgYXMgb3JkaW5hcnkgY2hhdCBidWJibGVzIGFuZCBrZXB0XG4gICAgICAgICAgICAgIGluIGxvY2FsIHN0YXRlIHNvIHRoZXkgc3RheSB2aXNpYmxlIGFjcm9zcyB0dXJucy4gVGhlIHBlcnNpc3RlZCBjb3B5IG9mXG4gICAgICAgICAgICAgIGVhY2ggdHVybiBpcyBmaWx0ZXJlZCBvdXQgb2YgYG1lc3NhZ2VzYCBhYm92ZSwgc28gdGhlc2UgYXJlIHRoZSBzaW5nbGVcbiAgICAgICAgICAgICAgc291cmNlIG9mIHRydXRoIG9uIHNjcmVlbiDigJQgdGhleSBuZXZlciBnZXQgaGlkZGVuLCBzbyBub3RoaW5nIGJsaW5rcy4gKi99XG4gICAgICAgICAge2xpdmVUdXJucy5tYXAoKHR1cm4sIGkpID0+IChcbiAgICAgICAgICAgIDxSZWFjdC5GcmFnbWVudCBrZXk9e2BsaXZlLXR1cm4tJHtpfWB9PlxuICAgICAgICAgICAgICB7dHVybi51c2VyLnRyaW0oKSAhPT0gJycgJiYgcmVuZGVyTGl2ZUJ1YmJsZSgnY3VzdG9tZXInLCB0dXJuLnVzZXIsIHR1cm4uY3JlYXRlVGltZSl9XG4gICAgICAgICAgICAgIHt0dXJuLmFnZW50LnRyaW0oKSAhPT0gJycgJiYgcmVuZGVyTGl2ZUJ1YmJsZSgnYWdlbnQnLCB0dXJuLmFnZW50LCB0dXJuLmNyZWF0ZVRpbWUpfVxuICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICApKX1cbiAgICAgICAgICB7LyogSW4tcHJvZ3Jlc3MgdHVybjogc3RyZWFtcyB0aGUgcGFydGlhbCB0cmFuc2NyaXB0IGxpdmUgKENoYXRNZXNzYWdlIG5vd1xuICAgICAgICAgICAgICB0cmFja3MgaXRzIHRleHQgcHJvcCwgc28gdGhlc2UgdXBkYXRlIGluIHBsYWNlIGFzIGNodW5rcyBhcnJpdmUpLiAqL31cbiAgICAgICAgICB7bGl2ZVZvaWNlLmlzQWN0aXZlICYmIGxpdmVDYXB0aW9uLnVzZXIudHJpbSgpICE9PSAnJyAmJlxuICAgICAgICAgICAgcmVuZGVyTGl2ZUJ1YmJsZSgnY3VzdG9tZXInLCBsaXZlQ2FwdGlvbi51c2VyLCBsaXZlQ2FwdGlvbi5jcmVhdGVUaW1lLCAnX19saXZlX2NhcHRpb25fdXNlcl9fJyl9XG4gICAgICAgICAge2xpdmVWb2ljZS5pc0FjdGl2ZSAmJiBsaXZlQ2FwdGlvbi5hZ2VudC50cmltKCkgIT09ICcnICYmXG4gICAgICAgICAgICByZW5kZXJMaXZlQnViYmxlKCdhZ2VudCcsIGxpdmVDYXB0aW9uLmFnZW50LCBsaXZlQ2FwdGlvbi5jcmVhdGVUaW1lLCAnX19saXZlX2NhcHRpb25fYWdlbnRfXycpfVxuICAgICAgICAgIDxkaXYgcmVmPXttZXNzYWdlc0VuZFJlZn0gLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIHtzaG93V2VsY29tZUJlZm9yZVN0YXJ0ICYmICgoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2hvd2luZ1N5bnRoZXRpY1dlbGNvbWUgPVxuICAgICAgICAgICAgIWhhc1VzZXJNZXNzYWdlcyAmJlxuICAgICAgICAgICAgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCB8fCBtZXNzYWdlc1swXS5zcGVha2VyICE9PSAnYWdlbnQnKSAmJlxuICAgICAgICAgICAgKEJvb2xlYW4od2VsY29tZVRpdGxlKSB8fCBCb29sZWFuKHdlbGNvbWVJbWFnZVVybCkgfHwgQm9vbGVhbih3ZWxjb21lTWVzc2FnZSkpO1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBwb3NzaWJsZVF1ZXJpZXMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgIWhhc1VzZXJNZXNzYWdlcyAmJlxuICAgICAgICAgICAgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCB8fCBtZXNzYWdlc1swXS5zcGVha2VyICE9PSAnYWdlbnQnKSAmJlxuICAgICAgICAgICAgIXNob3dpbmdTeW50aGV0aWNXZWxjb21lXG4gICAgICAgICAgKTtcbiAgICAgICAgfSkoKSAmJiAoXG4gICAgICAgICAgPGRpdiBzdHlsZT17cG9zc2libGVRdWVyaWVzQ29udGFpbmVyU3R5bGV9PlxuICAgICAgICAgICAge3Bvc3NpYmxlUXVlcmllcy5tYXAoKHF1ZXJ5LCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgICAgICBzdHlsZT17cXVlcnlCdXR0b25TdHlsZX1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVRdWVyeUNsaWNrKHF1ZXJ5KX1cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17aXNMb2FkaW5nIHx8IGlzQWdlbnRUeXBpbmd9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7cXVlcnl9XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG5cbiAgICAgICAge2ZpbGVFcnJvclRvYXN0ICYmIChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBtYXJnaW46ICcwIDE2cHggOHB4JyxcbiAgICAgICAgICAgICAgcGFkZGluZzogJzEwcHggMTRweCcsXG4gICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJyNGRkYzRTAnLFxuICAgICAgICAgICAgICBjb2xvcjogJyNFNjUxMDAnLFxuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICcxMnB4JyxcbiAgICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICAgIGZvbnRGYW1pbHksXG4gICAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICAgIGdhcDogJzhweCcsXG4gICAgICAgICAgICAgIGZsZXhTaHJpbms6IDAsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgcm9sZT1cImFsZXJ0XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8QWxlcnRDaXJjbGUgc2l6ZT17MTh9IHN0eWxlPXt7IGZsZXhTaHJpbms6IDAgfX0gLz5cbiAgICAgICAgICAgIDxzcGFuPntmaWxlRXJyb3JUb2FzdH08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG5cbiAgICAgICAge2xpdmVWb2ljZU5vdGljZSAmJiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgbWFyZ2luOiAnMCAxNnB4IDhweCcsXG4gICAgICAgICAgICAgIHBhZGRpbmc6ICcxMHB4IDE0cHgnLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjRkZGM0UwJyxcbiAgICAgICAgICAgICAgY29sb3I6ICcjRTY1MTAwJyxcbiAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnMTJweCcsXG4gICAgICAgICAgICAgIGZvbnRTaXplLFxuICAgICAgICAgICAgICBmb250RmFtaWx5LFxuICAgICAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgICAgICBnYXA6ICc4cHgnLFxuICAgICAgICAgICAgICBmbGV4U2hyaW5rOiAwLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHJvbGU9XCJhbGVydFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPEFsZXJ0Q2lyY2xlIHNpemU9ezE4fSBzdHlsZT17eyBmbGV4U2hyaW5rOiAwIH19IC8+XG4gICAgICAgICAgICA8c3Bhbj57bGl2ZVZvaWNlTm90aWNlfTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cblxuICAgICAgICB7dXNlRmlsZSAmJiBhdHRhY2htZW50cy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICA8ZGl2IHN0eWxlPXt7IHBhZGRpbmc6ICcwIDE2cHgnLCBtYXJnaW5Cb3R0b206ICc4cHgnLCBkaXNwbGF5OiAnZmxleCcsIGdhcDogJzhweCcsIGZsZXhXcmFwOiAnd3JhcCcgfX0+XG4gICAgICAgICAgICB7YXR0YWNobWVudHMubWFwKChhdHQsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgIDxBdHRhY2htZW50UHJldmlld1xuICAgICAgICAgICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgICAgICAgICAgZmlsZT17YXR0LmZpbGV9XG4gICAgICAgICAgICAgICAgb25SZW1vdmU9eygpID0+IGhhbmRsZVJlbW92ZUF0dGFjaG1lbnQoYXR0LmZpbGUubmFtZSl9XG4gICAgICAgICAgICAgICAgdXBsb2FkaW5nPXt1cGxvYWRpbmdGaWxlcy5oYXMoYXR0LmZpbGUubmFtZSl9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cblxuICAgICAgICB7IWNvbnZlcnNhdGlvbklkIHx8IGlzRmluYWxpemVkID8gKFxuICAgICAgICAgIDxkaXYgc3R5bGU9e2lucHV0Q29udGFpbmVyU3R5bGV9PlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgc3R5bGU9e3suLi5zZW5kQnV0dG9uU3R5bGUsIHdpZHRoOiAnMTAwJScsIGhlaWdodDogJzQ4cHgnLCBib3JkZXJSYWRpdXM6ICcxNnB4JywgY3Vyc29yOiAncG9pbnRlcicsIGZvbnRGYW1pbHksIGZvbnRTaXplfX1cbiAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlU3RhcnRDb252ZXJzYXRpb259XG4gICAgICAgICAgICAgIGRpc2FibGVkPXtpc0xvYWRpbmd9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt0KCdidXR0b25zLnN0YXJ0Q29udmVyc2F0aW9uJyl9XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSA6IGxpdmVWb2ljZUVuYWJsZWQgPyAoXG4gICAgICAgICAgLy8gTGl2ZSB2b2ljZSBtb2RlIGlzIHZvaWNlLW9ubHk6IG5vIHRleHQgYm94LCBhdHRhY2gsIG9yIHNlbmQgYnV0dG9uIOKAlFxuICAgICAgICAgIC8vIHRoZSBvbmx5IHdheSB0byB0YWxrIHRvIHRoZSBhZ2VudCBpcyB0byBzdGFydCBhIGxpdmUgY2FsbC5cbiAgICAgICAgICA8ZGl2IHN0eWxlPXtpbnB1dENvbnRhaW5lclN0eWxlfT5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgZGlzcGxheTogJ2ZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgd2lkdGg6ICcxMDAlJywgbWluV2lkdGg6IDAgfX0+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9e2lucHV0V3JhcHBlclN0eWxlfT5cbiAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT17Z2V0TGl2ZVZvaWNlSGludFN0eWxlKHRleHRBcmVhRm9udFNpemUsIGZvbnRGYW1pbHkpfT5cbiAgICAgICAgICAgICAgICAgIHtsaXZlVm9pY2VSZWFkeVxuICAgICAgICAgICAgICAgICAgICA/IHQoJ2xpdmVWb2ljZS50YXBUb1N0YXJ0JywgJ1RhcCB0byBzdGFydCBhIHZvaWNlIGNvbnZlcnNhdGlvbicpXG4gICAgICAgICAgICAgICAgICAgIDogdCgnbGl2ZVZvaWNlLnVuYXZhaWxhYmxlJywgJ1ZvaWNlIGlzIGN1cnJlbnRseSB1bmF2YWlsYWJsZScpfVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8TGl2ZUNhbGxDb250cm9sXG4gICAgICAgICAgICAgICAgICBzdGF0dXM9e2xpdmVWb2ljZS5zdGF0dXN9XG4gICAgICAgICAgICAgICAgICBpc0FjdGl2ZT17bGl2ZVZvaWNlLmlzQWN0aXZlfVxuICAgICAgICAgICAgICAgICAgb25TdGFydD17c3RhcnRMaXZlQ2FsbH1cbiAgICAgICAgICAgICAgICAgIG9uU3RvcD17ZW5kTGl2ZUNhbGx9XG4gICAgICAgICAgICAgICAgICB0aGVtZT17dGhlbWV9XG4gICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IWFnZW50SWQgfHwgIWxpdmVWb2ljZVJlYWR5fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB7YWdlbnREaXNjbGFpbWVyQ29udGVudCAmJiAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJnYS1pbnB1dC1kaXNjbGFpbWVyXCIgc3R5bGU9e2Rpc2NsYWltZXJTdHlsZX0+XG4gICAgICAgICAgICAgICAgICB7YWdlbnREaXNjbGFpbWVyQ29udGVudH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxmb3JtIG9uU3VibWl0PXtoYW5kbGVTdWJtaXR9IHN0eWxlPXtpbnB1dENvbnRhaW5lclN0eWxlfT5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgZGlzcGxheTogJ2ZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgd2lkdGg6ICcxMDAlJywgbWluV2lkdGg6IDAgfX0+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPXtpbnB1dFdyYXBwZXJTdHlsZX0+XG4gICAgICAgICAgICAgIHt1c2VGaWxlICYmIChcbiAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e2F0dGFjaEJ1dHRvblN0eWxlfVxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIkF0dGFjaFwiXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGZpbGVJbnB1dFJlZi5jdXJyZW50Py5jbGljaygpfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8UGFwZXJjbGlwIHNpemU9ezIyfSBjb2xvcj1cIiM3NTc1NzVcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICByZWY9e2ZpbGVJbnB1dFJlZn1cbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgZGlzcGxheTogJ25vbmUnIH19XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVGaWxlQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICBhY2NlcHQ9e2FsbG93ZWRFeHRlbnNpb25zLmpvaW4oJywnKSB8fCAnKi8qJ31cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgIHJlZj17dGV4dEFyZWFSZWZ9XG4gICAgICAgICAgICAgICAgc3R5bGU9e3RleHRBcmVhU3R5bGV9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZ2EtdGV4dGFyZWEtbm9zYlwiXG4gICAgICAgICAgICAgICAgdmFsdWU9e2lucHV0VmFsdWV9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRJbnB1dFZhbHVlKGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICBvbktleURvd249eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicgJiYgIWUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGlucHV0VmFsdWUudHJpbSgpICE9PSAnJyB8fCBhdHRhY2htZW50cy5sZW5ndGggPiAwKSAmJiAhaXNBZ2VudFR5cGluZyAmJiAhaGFzUGVuZGluZ0Zvcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRNZXNzYWdlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtpbnB1dFBsYWNlaG9sZGVyfVxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXshY29udmVyc2F0aW9uSWQgfHwgaXNGaW5hbGl6ZWQgfHwgaGFzUGVuZGluZ0Zvcm19XG4gICAgICAgICAgICAgICAgcm93cz17MX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT17cmlnaHRBY3Rpb25Db250YWluZXJTdHlsZX0+XG4gICAgICAgICAgICAgICAgeyEodXNlQXVkaW8gJiYgaW5wdXRWYWx1ZS50cmltKCkgPT09ICcnICYmIGF0dGFjaG1lbnRzLmxlbmd0aCA9PT0gMCkgJiYgKFxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgLi4uc2VuZEJ1dHRvblN0eWxlLCAuLi4oaXNTZW5kRGlzYWJsZWQgPyBzZW5kQnV0dG9uRGlzYWJsZWRTdHlsZSA6IHt9KSB9fVxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17aXNTZW5kRGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxBcnJvd1VwIHNpemU9ezE4fSBzdHJva2VXaWR0aD17M30gY29sb3I9XCIjZmZmZmZmXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB7dXNlQXVkaW8gJiYgaW5wdXRWYWx1ZS50cmltKCkgPT09ICcnICYmIGF0dGFjaG1lbnRzLmxlbmd0aCA9PT0gMCAmJiAoXG4gICAgICAgICAgICAgICAgPFZvaWNlSW5wdXRcbiAgICAgICAgICAgICAgICAgIG9uQXVkaW9SZWFkeT17YXN5bmMgKGJsb2I6IEJsb2IsIGZvcm1hdDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgc2V0SXNQbGF5aW5nQXVkaW8odHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2VuZEF1ZGlvTWVzc2FnZShibG9iLCBmb3JtYXQpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciBoYW5kbGVkIGluc2lkZSBzZW5kQXVkaW9NZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgc2V0SXNQbGF5aW5nQXVkaW8oZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgb25FcnJvcj17aGFuZGxlVm9pY2VFcnJvcn1cbiAgICAgICAgICAgICAgICAgIHRoZW1lPXt0aGVtZX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIHthZ2VudERpc2NsYWltZXJDb250ZW50ICYmIChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJnYS1pbnB1dC1kaXNjbGFpbWVyXCIgc3R5bGU9e2Rpc2NsYWltZXJTdHlsZX0+XG4gICAgICAgICAgICAgICAge2FnZW50RGlzY2xhaW1lckNvbnRlbnR9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgKX1cblxuICAgICAgICB7LyogRnVsbC1zY3JlZW4gZm9ybTogd2hlbiBhIEh1bWFuIEluIFRoZSBMb29wIGZvcm0gaXMgcGVuZGluZywgaXQgdGFrZXMgb3ZlciB0aGVcbiAgICAgICAgICAgIHdob2xlIGNoYXQgcGFuZWwgKHRoZSBub2RlJ3MgbWVzc2FnZSBzaG93biBhcyBhIGhlYWRpbmcgb24gdG9wKSBpbnN0ZWFkIG9mIGFcbiAgICAgICAgICAgIGNyYW1wZWQgZm9vdGVyLiBJbmxpbmUgbW9kZSBrZWVwcyByZW5kZXJpbmcgdGhlIGZvcm0gd2l0aGluIHRoZSBtZXNzYWdlIGxpc3QuICovfVxuICAgICAgICB7cGVuZGluZ0Zvcm0gJiYgZm9ybURpc3BsYXkgIT09ICdpbmxpbmUnICYmIChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgaW5zZXQ6IDAsXG4gICAgICAgICAgICAgIHpJbmRleDogMzAsXG4gICAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG4gICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogYmFja2dyb3VuZENvbG9yIHx8ICcjZmZmZmZmJyxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPER5bmFtaWNGb3JtTWVzc2FnZVxuICAgICAgICAgICAgICBzY2hlbWE9e3BlbmRpbmdGb3JtLnNjaGVtYX1cbiAgICAgICAgICAgICAgb25TdWJtaXQ9eyhkYXRhKSA9PiBoYW5kbGVGb3JtU3VibWl0KGRhdGEsIHBlbmRpbmdGb3JtLmluZGV4KX1cbiAgICAgICAgICAgICAgb25DYW5jZWw9eygpID0+IGhhbmRsZUZvcm1DYW5jZWwocGVuZGluZ0Zvcm0uaW5kZXgpfVxuICAgICAgICAgICAgICBpc1N1Ym1pdHRpbmc9e3N1Ym1pdHRpbmdGb3JtSW5kZXggPT09IHBlbmRpbmdGb3JtLmluZGV4fVxuICAgICAgICAgICAgICBpc1N1Ym1pdHRlZD17ZmFsc2V9XG4gICAgICAgICAgICAgIHByaW1hcnlDb2xvcj17cHJpbWFyeUNvbG9yfVxuICAgICAgICAgICAgICBmb250RmFtaWx5PXtmb250RmFtaWx5fVxuICAgICAgICAgICAgICB2YXJpYW50PVwiZnVsbHNjcmVlblwiXG4gICAgICAgICAgICAgIHRpdGxlPXthZ2VudE5hbWUgfHwgdW5kZWZpbmVkfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IHN0eWxlPXtjb25maXJtT3ZlcmxheVN0eWxlfT5cbiAgICAgICAgPGRpdiBzdHlsZT17Y29uZmlybURpYWxvZ1N0eWxlfT5cbiAgICAgICAgICA8aDMgc3R5bGU9e3sgZm9udEZhbWlseSwgbWFyZ2luOiAwLCBmb250U2l6ZTogJzE4cHgnLCBmb250V2VpZ2h0OiA2MDAgfX0+e3QoJ2RpYWxvZy5yZXNldENvbnZlcnNhdGlvbi50aXRsZScpfTwvaDM+XG4gICAgICAgICAgPHAgc3R5bGU9e3sgZm9udEZhbWlseSwgZm9udFNpemU6ICcxNHB4JywgY29sb3I6ICcjNzE3MTdhJywgbWFyZ2luOiAnOHB4IDAgMCcgfX0+e3QoJ2RpYWxvZy5yZXNldENvbnZlcnNhdGlvbi5tZXNzYWdlJyl9PC9wPlxuICAgICAgICAgIDxkaXYgc3R5bGU9e2NvbmZpcm1CdXR0b25zU3R5bGV9PlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJnYS1jb25maXJtLWJ0bi0tY2FuY2VsXCIgc3R5bGU9e3sgLi4uZ2V0Q29uZmlybUJ1dHRvblN0eWxlKGZhbHNlLCB0aGVtZVBhcmFtcyksIGNvbG9yOiB0ZXh0Q29sb3IgfX0gb25DbGljaz17aGFuZGxlQ2FuY2VsUmVzZXR9Pnt0KCdidXR0b25zLmNhbmNlbCcpfTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJnYS1jb25maXJtLWJ0bi0tZGFuZ2VyXCIgc3R5bGU9e2dldENvbmZpcm1CdXR0b25TdHlsZSh0cnVlLCB0aGVtZVBhcmFtcyl9IG9uQ2xpY2s9e2hhbmRsZUNvbmZpcm1SZXNldH0+e3QoJ2J1dHRvbnMucmVzZXQnKX08L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcblxuICBpZiAobW9kZSA9PT0gJ2Zsb2F0aW5nJykge1xuICAgIGNvbnN0IGlzUGFuZWxDbG9zaW5nID0gaXNQYW5lbE1vdW50ZWQgJiYgIWlzRmxvYXRpbmdPcGVuO1xuICAgIHJldHVybiAoXG4gICAgICA8PlxuICAgICAgICB7LyogS2V5ZnJhbWVzL2FuaW1hdGlvbiBjbGFzc2VzIG11c3QgZXhpc3QgZXZlbiB3aGlsZSB0aGUgcGFuZWwgaXMgdW5tb3VudGVkLiAqL31cbiAgICAgICAgPHN0eWxlPntDU1NfS0VZRlJBTUVTfTwvc3R5bGU+XG4gICAgICAgIHshaXNQYW5lbE1vdW50ZWQgJiYgKFxuICAgICAgICAgIDxCdWJibGVEb2NrXG4gICAgICAgICAgICBwcmltYXJ5Q29sb3I9e3ByaW1hcnlDb2xvcn1cbiAgICAgICAgICAgIHBvc2l0aW9uPXtwb3NpdGlvbn1cbiAgICAgICAgICAgIG9mZnNldFg9e29mZnNldFh9XG4gICAgICAgICAgICBvZmZzZXRZPXtvZmZzZXRZfVxuICAgICAgICAgICAgd2luZG93V2lkdGg9e3dpbmRvd1dpZHRofVxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2lucHV0UGxhY2Vob2xkZXJ9XG4gICAgICAgICAgICBmb250RmFtaWx5PXtmb250RmFtaWx5fVxuICAgICAgICAgICAgZm9udFNpemU9e2ZvbnRTaXplfVxuICAgICAgICAgICAgY2hhdEJ1YmJsZUljb249e3RoZW1lPy5jaGF0QnViYmxlSWNvbn1cbiAgICAgICAgICAgIHNob3dRdWlja0lucHV0PXtxdWlja0lucHV0ICYmICFxdWlja0lucHV0RGlzbWlzc2VkICYmIEJvb2xlYW4oY29udmVyc2F0aW9uSWQpICYmICFpc0ZpbmFsaXplZH1cbiAgICAgICAgICAgIG9uT3Blbj17KCkgPT4gc2V0SXNGbG9hdGluZ09wZW4odHJ1ZSl9XG4gICAgICAgICAgICBvblNlbmQ9e2hhbmRsZVF1aWNrSW5wdXRTZW5kfVxuICAgICAgICAgICAgb25EaXNtaXNzUXVpY2tJbnB1dD17aGFuZGxlRGlzbWlzc1F1aWNrSW5wdXR9XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cblxuICAgICAgICB7aXNQYW5lbE1vdW50ZWQgJiYgKFxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIHN0eWxlPXtmbG9hdGluZ0NvbnRhaW5lclN0eWxlfVxuICAgICAgICAgICAgY2xhc3NOYW1lPXtpc1BhbmVsQ2xvc2luZyA/ICdnYS13aWRnZXQtb3V0JyA6ICdnYS13aWRnZXQtaW4nfVxuICAgICAgICAgICAgb25BbmltYXRpb25FbmQ9eyhlKSA9PiB7XG4gICAgICAgICAgICAgIC8vIElnbm9yZSBidWJibGVkIGNoaWxkIGFuaW1hdGlvbnM7IG9ubHkgcmVhY3QgdG8gdGhlIHBhbmVsJ3Mgb3duIGNsb3NlLlxuICAgICAgICAgICAgICBpZiAoZS50YXJnZXQgIT09IGUuY3VycmVudFRhcmdldCkgcmV0dXJuO1xuICAgICAgICAgICAgICBpZiAoaXNQYW5lbENsb3NpbmcpIHNldElzUGFuZWxNb3VudGVkKGZhbHNlKTtcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBkYXRhLWdlbmFzc2lzdC1jb250YWluZXI9XCJmbG9hdGluZ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3JlbmRlcldpdGhSZUNhcHRjaGEocmVuZGVyQ2hhdENvbXBvbmVudCgpKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgIDwvPlxuICAgICk7XG4gIH1cblxuICBpZiAobW9kZSA9PT0gJ2Z1bGxzY3JlZW4nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgc3R5bGU9e2Zsb2F0aW5nQ29udGFpbmVyU3R5bGV9IGRhdGEtZ2VuYXNzaXN0LWNvbnRhaW5lcj1cImZ1bGxzY3JlZW5cIj5cbiAgICAgICAge3JlbmRlcldpdGhSZUNhcHRjaGEocmVuZGVyQ2hhdENvbXBvbmVudCgpKX1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gcmVuZGVyV2l0aFJlQ2FwdGNoYShyZW5kZXJDaGF0Q29tcG9uZW50KCkpO1xufTtcbiJdfQ==