1import { createHotContext as __vite__createHotContext } from "/@vite/client";import.meta.hot = __vite__createHotContext("/src/components/WaitlistPopup.tsx");import __vite__cjsImport0_react_jsxDevRuntime from "/@fs/home/runner/workspace/node_modules/.vite/deps/react_jsx-dev-runtime.js?v=9ce4103e"; const Fragment = __vite__cjsImport0_react_jsxDevRuntime["Fragment"]; const jsxDEV = __vite__cjsImport0_react_jsxDevRuntime["jsxDEV"]; 2import RefreshRuntime from "/@react-refresh"; 3const inWebWorker = typeof WorkerGlobalScope !== "undefined" && self instanceof WorkerGlobalScope; 4let prevRefreshReg; 5let prevRefreshSig; 6if (import.meta.hot && !inWebWorker) { 7 if (!window.__vite_plugin_react_preamble_installed__) { 8 throw new Error("@vitejs/plugin-react can't detect preamble. Something is wrong. See https://github.com/vitejs/vite-plugin-react/pull/11#discussion_r430879201"); 9 } 10 prevRefreshReg = window.$RefreshReg$; 11 prevRefreshSig = window.$RefreshSig$; 12 window.$RefreshReg$ = (type, id) => { 13 RefreshRuntime.register(type, "/home/runner/workspace/client/src/components/WaitlistPopup.tsx " + id); 14 }; 15 window.$RefreshSig$ = RefreshRuntime.createSignatureFunctionForTransform; 16} 17var _s = $RefreshSig$(); 18import __vite__cjsImport3_react from "/@fs/home/runner/workspace/node_modules/.vite/deps/react.js?v=9ce4103e"; const useState = __vite__cjsImport3_react["useState"]; const useEffect = __vite__cjsImport3_react["useEffect"]; 19import { X } from "/@fs/home/runner/workspace/node_modules/.vite/deps/lucide-react.js?v=9ce4103e"; 20import { useLocation } from "/@fs/home/runner/workspace/node_modules/.vite/deps/wouter.js?v=9ce4103e"; 21import { useLanguage } from "/src/lib/LanguageContext.tsx"; 22import { useToast } from "/src/hooks/use-toast.ts"; 23import { apiRequest } from "/src/lib/queryClient.ts"; 24import { trackWaitlistSignup } from "/src/lib/analytics.ts"; 25import { useModalLock } from "/src/hooks/useModalLock.ts"; 26import popupImage from "/@fs/home/runner/workspace/attached_assets/kyn-popup-coming-soon.png?import"; 27export function WaitlistPopup() { 28 _s(); 29 const [isVisible, setIsVisible] = useState(false); 30 useModalLock(isVisible); 31 const [isClosing, setIsClosing] = useState(false); 32 const [isSubmitting, setIsSubmitting] = useState(false); 33 const [formData, setFormData] = useState({ firstName: "", email: "" }); 34 const { language } = useLanguage(); 35 const { toast } = useToast(); 36 const [location] = useLocation(); 37 useEffect(() => { 38 if (location === "/playbook" || location === "/skincare-guide") return; 39 const hasSignedUp = sessionStorage.getItem("kyn-waitlist-signed-up"); 40 if (hasSignedUp) return; 41 const hasClosedPopup = sessionStorage.getItem("kyn-waitlist-popup-closed"); 42 if (hasClosedPopup) return; 43 const handleScroll = () => { 44 if (sessionStorage.getItem("kyn-waitlist-popup-closed")) return; 45 const cookieConsent = localStorage.getItem("kyn_cookie_consent"); 46 if (!cookieConsent) return; 47 const subscribeSection = document.getElementById("subscribe-section"); 48 if (subscribeSection) { 49 const rect = subscribeSection.getBoundingClientRect(); 50 const isNearSubscribeSection = rect.top < window.innerHeight && rect.bottom > 0; 51 if (isNearSubscribeSection) { 52 if (isVisible) { 53 setIsClosing(true); 54 setTimeout(() => { 55 setIsVisible(false); 56 setIsClosing(false); 57 }, 300); 58 } 59 return; 60 } 61 } 62 const scrollPercent = window.scrollY / (document.documentElement.scrollHeight - window.innerHeight) * 100; 63 if (scrollPercent >= 50 && !isVisible) { 64 setIsVisible(true); 65 } 66 }; 67 window.addEventListener("scroll", handleScroll); 68 return () => window.removeEventListener("scroll", handleScroll); 69 }, [isVisible]); 70 const handleClose = () => { 71 sessionStorage.setItem("kyn-waitlist-popup-closed", "true"); 72 setIsClosing(true); 73 setTimeout(() => { 74 setIsVisible(false); 75 setIsClosing(false); 76 }, 300); 77 }; 78 useEffect(() => { 79 if (!isVisible) return; 80 const handleEsc = (e) => { 81 if (e.key === "Escape") { 82 handleClose(); 83 } 84 }; 85 window.addEventListener("keydown", handleEsc); 86 return () => window.removeEventListener("keydown", handleEsc); 87 }, [isVisible]); 88 const handleInputChange = (e) => { 89 setFormData((prev) => ({ 90 ...prev, 91 [e.target.name]: e.target.value 92 })); 93 }; 94 const handleSubmit = async (e) => { 95 e.preventDefault(); 96 const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; 97 if (!formData.email || !emailRegex.test(formData.email)) { 98 toast({ 99 title: language === "fr" ? "Erreur" : "Error", 100 description: language === "fr" ? "Veuillez entrer une adresse email valide." : "Please enter a valid email address.", 101 variant: "destructive" 102 }); 103 return; 104 } 105 setIsSubmitting(true); 106 try { 107 await apiRequest("/api/waitlist", { 108 method: "POST", 109 data: { 110 firstName: formData.firstName, 111 email: formData.email, 112 source: "popup", 113 language 114 } 115 }); 116 trackWaitlistSignup("popup"); 117 sessionStorage.setItem("kyn-waitlist-signed-up", "true"); 118 localStorage.setItem("kyn-playbook-access", "true"); 119 localStorage.setItem("kyn-user-name", formData.firstName); 120 toast({ 121 title: language === "fr" ? "Vous êtes sur la liste ! ;)" : "You're on the list! ;)", 122 description: language === "fr" ? "Le KYN Skincare Playbook est dans votre boîte mail. Bienvenue chez KYN !" : "The KYN Skincare Playbook is in your inbox. Welcome to KYN!" 123 }); 124 setFormData({ firstName: "", email: "" }); 125 setIsClosing(true); 126 setTimeout(() => { 127 setIsVisible(false); 128 setIsClosing(false); 129 }, 300); 130 } catch (error) { 131 if (error.message?.includes("already")) { 132 toast({ 133 title: language === "fr" ? "Déjà avec nous" : "Already with us", 134 description: language === "fr" ? "Cet email fait déjà partie de notre c
134ommunauté." : "This email is already part of our community.", 135 variant: "elegant" 136 }); 137 } else { 138 toast({ 139 title: language === "fr" ? "Erreur" : "Error", 140 description: language === "fr" ? "Une erreur est survenue." : "Something went wrong.", 141 variant: "elegant" 142 }); 143 } 144 } finally { 145 setIsSubmitting(false); 146 } 147 }; 148 if (!isVisible) return null; 149 const t = { 150 heading: language === "fr" ? "REJOIGNEZ LA LISTE" : "JOIN THE WAITLIST", 151 description: language === "fr" ? "Soyez parmi les premiers à découvrir nos formulations et recevez notre <strong>Guide Skincare</strong> exclusif." : "Be among the first to discover our formulations and receive our exclusive <strong>Skincare Playbook</strong>.", 152 joinCount: language === "fr" ? "200+ DÃJà SUR LA LISTE" : "200+ ALREADY ON THE LIST", 153 firstName: language === "fr" ? "Prénom" : "First name", 154 email: language === "fr" ? "Email" : "Email", 155 button: language === "fr" ? "REJOINDRE LA LISTE" : "JOIN THE WAITLIST" 156 }; 157 return /* @__PURE__ */ jsxDEV(Fragment, { children: [ 158 /* @__PURE__ */ jsxDEV("style", { children: ` 159 @keyframes popupFadeIn { 160 from { opacity: 0; } 161 to { opacity: 1; } 162 } 163 @keyframes popupSlideUp { 164 from { opacity: 0; transform: translateY(20px) scale(0.95); } 165 to { opacity: 1; transform: translateY(0) scale(1); } 166 } 167 @keyframes popupFadeOut { 168 from { opacity: 1; } 169 to { opacity: 0; } 170 } 171 @keyframes popupSlideDown { 172 from { opacity: 1; transform: translateY(0) scale(1); } 173 to { opacity: 0; transform: translateY(20px) scale(0.95); } 174 } 175 .popup-backdrop { animation: popupFadeIn 0.3s ease-out forwards; } 176 .popup-backdrop.closing { animation: popupFadeOut 0.3s ease-in forwards; } 177 .popup-card { animation: popupSlideUp 0.4s cubic-bezier(0.16, 1, 0.3, 1) forwards; } 178 .popup-card.closing { animation: popupSlideDown 0.3s ease-in forwards; } 179 ` }, void 0, false, { 180 fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx", 181 lineNumber: 181, 182 columnNumber: 7 183 }, this), 184 /* @__PURE__ */ jsxDEV( 185 "div", 186 { 187 className: `fixed inset-0 z-[200] flex items-center justify-center p-4 popup-backdrop ${isClosing ? "closing" : ""}`, 188 style: { 189 backgroundColor: "rgba(0, 0, 0, 0.6)", 190 backdropFilter: "blur(4px)", 191 WebkitBackdropFilter: "blur(4px)" 192 }, 193 onClick: handleClose, 194 "data-testid": "popup-backdrop", 195 "data-modal-container": true, 196 children: /* @__PURE__ */ jsxDEV( 197 "div", 198 { 199 className: `relative z-[201] popup-card ${isClosing ? "closing" : ""}`, 200 style: { 201 width: "min(92vw, 680px)", 202 maxHeight: "min(90vh, 100%)" 203 }, 204 onClick: (e) => e.stopPropagation(), 205 "data-testid": "popup-waitlist-card", 206 children: /* @__PURE__ */ jsxDEV( 207 "div", 208 { 209 className: "bg-white overflow-hidden flex flex-col md:flex-row max-h-[inherit] relative", 210 style: { boxShadow: "0 25px 50px -12px rgba(0, 0, 0, 0.25)" }, 211 children: [
212 /* @__PURE__ */ jsxDEV( 213 "button", 214 { 215 type: "button", 216 onClick: (e) => { 217 e.preventDefault(); 218 e.stopPropagation(); 219 handleClose(); 220 }, 221 onTouchEnd: (e) => { 222 e.preventDefault(); 223 e.stopPropagation(); 224 handleClose(); 225 }, 226 className: "absolute top-3 right-3 md:top-4 md:right-4 w-10 h-10 flex items-center justify-center rounded-full transition-all duration-200 hover:bg-gray-100 focus:outline-none", 227 style: { 228 zIndex: 99999, 229 backgroundColor: "rgba(255,255,255,0.9)", 230 pointerEvents: "auto", 231 touchAction: "manipulation" 232 }, 233 "aria-label": "Close popup", 234 "data-testid": "button-close-popup", 235 children: /* @__PURE__ */ jsxDEV(X, { size: 18, strokeWidth: 2, color: "#333333" }, void 0, false, { 236 fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx", 237 lineNumber: 253, 238 columnNumber: 15 239 }, this) 240 }, 241 void 0, 242 false, 243 { 244 fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx", 245 lineNumber: 231, 246 columnNumber: 13 247 }, 248 this 249 ),
250 /* @__PURE__ */ jsxDEV( 251 "div", 252 { 253 className: "hidden md:block md:w-2/5 relative overflow-hidden", 254 style: { minHeight: "420px" }, 255 children: /* @__PURE__ */ jsxDEV( 256 "img", 257 { 258 src: popupImage, 259 alt: "KYN Skincare - African botanical beauty coming soon", 260 loading: "lazy", 261 decoding: "async", 262 className: "absolute inset-0 w-full h-full object-cover", 263 style: { objectPosition: "center center" } 264 }, 265 void 0, 266 false, 267 { 268 fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx", 269 lineNumber: 261, 270 columnNumber: 13 271 }, 272 this 273 ) 274 }, 275 void 0, 276 false, 277 { 278 fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx", 279 lineNumber: 257, 280 columnNumber: 11 281 }, 282 this 283 ),
284 /* @__PURE__ */ jsxDEV("div", { className: "flex-1 p-6 md:p-10 relative overflow-y-auto", "data-modal-scrollable": true, children: /* @__PURE__ */ jsxDEV("div", { className: "pt-6 md:pt-2 text-center", children: [ 285 /* @__PURE__ */ jsxDEV( 286 "h3", 287 { 288 className: "text-[16px] md:text-[18px] uppercase tracking-[1.5px] mb-3", 289 style: { 290 color: "#1A1A1A", 291 fontFamily: "Helvetica, Arial, sans-serif", 292 fontWeight: 500, 293 lineHeight: 1.3 294 }, 295 children: t.heading 296 }, 297 void 0, 298 false, 299 { 300 fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx", 301 lineNumber: 277, 302 columnNumber: 15 303 }, 304 this 305 ),
306 /* @__PURE__ */ jsxDEV( 307 "p", 308 { 309 className: "text-[10px] uppercase tracking-[2px] mb-4", 310 style: { 311 color: "#888888", 312 fontFamily: "Helvetica, Arial, sans-serif", 313 fontWeight: 400 314 }, 315 children: t.joinCount 316 }, 317 void 0, 318 false, 319 { 320 fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx", 321 lineNumber: 290, 322 columnNumber: 15 323 }, 324 this 325 ), 326 /* @__PURE__ */ jsxDEV( 327 "p", 328 { 329 className: "text-[13px] mb-6", 330 style: { 331 color: "#666666", 332 fontFamily: "Helvetica, Arial, sans-serif", 333 fontWeight: 300, 334 lineHeight: 1.7 335 }, 336 dangerouslySetInnerHTML: { __html: t.description } 337 }, 338 void 0, 339 false, 340 { 341 fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx", 342 lineNumber: 302, 343 columnNumber: 15 344 }, 345 this 346 ),
347 /* @__PURE__ */ jsxDEV("form", { onSubmit: handleSubmit, className: "space-y-3", children: [ 348 /* @__PURE__ */ jsxDEV( 349 "input", 350 { 351 type: "text", 352 name: "firstName", 353 value: formData.firstName, 354 onChange: handleInputChange, 355 placeholder: t.firstName, 356 className: "w-full px-4 py-3 border transition-colors focus:outline-none focus:border-[#1A1A1A]", 357 style: { 358 fontFamily: "Helvetica, Arial, sans-serif", 359 fontSize: "13px", 360 fontWeight: 300, 361 borderColor: "#E0E0E0", 362 backgroundColor: "#FAFAFA", 363 borderRadius: 0 364 }, 365 "data-testid": "popup-input-first-name" 366 }, 367 void 0, 368 false, 369 { 370 fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx", 371 lineNumber: 315, 372 columnNumber: 17 373 }, 374 this 375 ),
376 /* @__PURE__ */ jsxDEV( 377 "input", 378 { 379 type: "email", 380 name: "email", 381 value: formData.email, 382 onChange: handleInputChange, 383 placeholder: `${t.email}*`, 384 required: true, 385 className: "w-full px-4 py-3 border transition-colors focus:outline-none focus:border-[#1A1A1A]", 386 style: { 387 fontFamily: "Helvetica, Arial, sans-serif", 388 fontSize: "13px", 389 fontWeight: 300, 390 borderColor: "#E0E0E0", 391 backgroundColor: "#FAFAFA", 392 borderRadius: 0 393 }, 394 "data-testid": "popup-input-email" 395 }, 396 void 0, 397 false, 398 { 399 fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx", 400 lineNumber: 332, 401 columnNumber: 17 402 }, 403 this 404 ),
405 /* @__PURE__ */ jsxDEV( 406 "button", 407 { 408 type: "submit", 409 disabled: isSubmitting, 410 className: "w-full py-3.5 uppercase transition-all duration-300 hover:bg-transparent hover:text-[#1A1A1A] disabled:opacity-50", 411 style: { 412 backgroundColor: "#1A1A1A", 413 color: "#FFFFFF", 414 fontFamily: "Helvetica, Arial, sans-serif", 415 fontWeight: 400, 416 letterSpacing: "2px", 417 border: "1px solid #1A1A1A", 418 fontSize: "11px", 419 borderRadius: 0 420 }, 421 "data-testid": "button-popup-submit", 422 children: isSubmitting ? "..." : t.button 423 }, 424 void 0, 425 false, 426 { 427 fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx", 428 lineNumber: 350, 429 columnNumber: 17 430 }, 431 this 432 ) 433 ] }, void 0, true, { 434 fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx", 435 lineNumber: 314, 436 columnNumber: 15 437 }, this) 438 ] }, void 0, true, { 439 fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx", 440 lineNumber: 275, 441 columnNumber: 13 442 }, this) }, void 0, false, { 443 fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx", 444 lineNumber: 272, 445 columnNumber: 11 446 }, this) 447 ] 448 }, 449 void 0, 450 true, 451 { 452 fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx", 453 lineNumber: 226, 454 columnNumber: 11 455 }, 456 this 457 ) 458 }, 459 void 0, 460 false, 461 { 462 fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx", 463 lineNumber: 217, 464 columnNumber: 9 465 }, 466 this 467 ) 468 }, 469 void 0, 470 false, 471 { 472 fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx", 473 lineNumber: 205, 474 columnNumber: 7 475 }, 476 this 477 ) 478 ] }, void 0, true, { 479 fileName: "/home/runner/workspace/client/src/components/WaitlistPopup.tsx", 480 lineNumber: 180, 481 columnNumber: 5 482 }, this); 483} 484_s(WaitlistPopup, "w5LZo/WIFeZ1yh3WQsoI0ye7/EY=", false, function() { 485 return [useModalLock, useLanguage, useToast, useLocation]; 486}); 487_c = WaitlistPopup; 488var _c; 489$RefreshReg$(_c, "WaitlistPopup"); 490if (import.meta.hot && !inWebWorker) { 491 window.$RefreshReg$ = prevRefreshReg; 492 window.$RefreshSig$ = prevRefreshSig; 493} 494if (import.meta.hot && !inWebWorker) { 495 RefreshRuntime.__hmr_import(import.meta.url).then((currentExports) => { 496 RefreshRuntime.registerExportsForReactRefresh("/home/runner/workspace/client/src/components/WaitlistPopup.tsx", currentExports); 497 import.meta.hot.accept((nextExports) => { 498 if (!nextExports) return; 499 const invalidateMessage = RefreshRuntime.validateRefreshBoundaryAndEnqueueUpdate("/home/runner/workspace/client/src/components/WaitlistPopup.tsx", currentExports, nextExports); 500 if (invalidateMessage) import.meta.hot.invalidate(invalidateMessage); 501 }); 502 }); 503} 504 505//# sourceMappingURL=data:application/json;base64,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WN0IiwiWCIsInVzZUxvY2F0aW9uIiwidXNlTGFuZ3VhZ2UiLCJ1c2VUb2FzdCIsImFwaVJlcXVlc3QiLCJ0cmFja1dhaXRsaXN0U2lnbnVwIiwidXNlTW9kYWxMb2NrIiwicG9wdXBJbWFnZSIsIldhaXRsaXN0UG9wdXAiLCJfcyIsImlzVmlzaWJsZSIsInNldElzVmlzaWJsZSIsInVzZVN0YXRlIiwiaXNDbG9zaW5nIiwic2V0SXNDbG9zaW5nIiwiaXNTdWJtaXR0aW5nIiwic2V0SXNTdWJtaXR0aW5nIiwiZm9ybURhdGEiLCJzZXRGb3JtRGF0YSIsImZpcnN0TmFtZSIsImVtYWlsIiwibGFuZ3VhZ2UiLCJ0b2FzdCIsImxvY2F0aW9uIiwiaGFzU2lnbmVkVXAiLCJzZXNzaW9uU3RvcmFnZSIsImdldEl0ZW0iLCJoYXNDbG9zZWRQb3B1cCIsImhhbmRsZVNjcm9sbCIsImNvb2tpZUNvbnNlbnQiLCJsb2NhbFN0b3JhZ2UiLCJzdWJzY3JpYmVTZWN0aW9uIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsInJlY3QiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJpc05lYXJTdWJzY3JpYmVTZWN0aW9uIiwidG9wIiwid2luZG93IiwiaW5uZXJIZWlnaHQiLCJib3R0b20iLCJzZXRUaW1lb3V0Iiwic2Nyb2xsUGVyY2VudCIsInNjcm9sbFkiLCJkb2N1bWVudEVsZW1lbnQiLCJzY3JvbGxIZWlnaHQiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImhhbmRsZUNsb3NlIiwic2V0SXRlbSIsImhhbmRsZUVzYyIsImUiLCJrZXkiLCJoYW5kbGVJbnB1dENoYW5nZSIsInByZXYiLCJ0YXJnZXQiLCJuYW1lIiwidmFsdWUiLCJoYW5kbGVTdWJtaXQiLCJwcmV2ZW50RGVmYXVsdCIsImVtYWlsUmVnZXgiLCJ0ZXN0IiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsInZhcmlhbnQiLCJtZXRob2QiLCJkYXRhIiwic291cmNlIiwiZXJyb3IiLCJtZXNzYWdlIiwiaW5jbHVkZXMiLCJ0IiwiaGVhZGluZyIsImpvaW5Db3VudCIsImJ1dHRvbiIsImJhY2tncm91bmRDb2xvciIsImJhY2tkcm9wRmlsdGVyIiwiV2Via2l0QmFja2Ryb3BGaWx0ZXIiLCJ3aWR0aCIsIm1heEhlaWdodCIsInN0b3BQcm9wYWdhdGlvbiIsImJveFNoYWRvdyIsInpJbmRleCIsInBvaW50ZXJFdmVudHMiLCJ0b3VjaEFjdGlvbiIsIm1pbkhlaWdodCIsIm9iamVjdFBvc2l0aW9uIiwiY29sb3IiLCJmb250RmFtaWx5IiwiZm9udFdlaWdodCIsImxpbmVIZWlnaHQiLCJfX2h0bWwiLCJmb250U2l6ZSIsImJvcmRlckNvbG9yIiwiYm9yZGVyUmFkaXVzIiwibGV0dGVyU3BhY2luZyIsImJvcmRlciIsIl9jIiwiJFJlZnJlc2hSZWckIl0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbIldhaXRsaXN0UG9wdXAudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBYIH0gZnJvbSAnbHVjaWRlLXJlYWN0JztcbmltcG9ydCB7IHVzZUxvY2F0aW9uIH0gZnJvbSAnd291dGVyJztcbmltcG9ydCB7IHVzZUxhbmd1YWdlIH0gZnJvbSAnQC9saWIvTGFuZ3VhZ2VDb250ZXh0JztcbmltcG9ydCB7IHVzZVRvYXN0IH0gZnJvbSAnQC9ob29rcy91c2UtdG9hc3QnO1xuaW1wb3J0IHsgYXBpUmVxdWVzdCB9IGZyb20gJ0AvbGliL3F1ZXJ5Q2xpZW50JztcbmltcG9ydCB7IHRyYWNrV2FpdGxpc3RTaWdudXAgfSBmcm9tICdAL2xpYi9hbmFseXRpY3MnO1xuaW1wb3J0IHsgdXNlTW9kYWxMb2NrIH0gZnJvbSAnQC9ob29rcy91c2VNb2RhbExvY2snO1xuaW1wb3J0IHBvcHVwSW1hZ2UgZnJvbSAnQGFzc2V0cy9reW4tcG9wdXAtY29taW5nLXNvb24ucG5nJztcblxuZXhwb3J0IGZ1bmN0aW9uIFdhaXRsaXN0UG9wdXAoKSB7XG4gIGNvbnN0IFtpc1Zpc2libGUsIHNldElzVmlzaWJsZV0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIHVzZU1vZGFsTG9jayhpc1Zpc2libGUpO1xuICBjb25zdCBbaXNDbG9zaW5nLCBzZXRJc0Nsb3NpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbaXNTdWJtaXR0aW5nLCBzZXRJc1N1Ym1pdHRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbZm9ybURhdGEsIHNldEZvcm1EYXRhXSA9IHVzZVN0YXRlKHsgZmlyc3ROYW1lOiAnJywgZW1haWw6ICcnIH0pO1xuICBjb25zdCB7IGxhbmd1YWdlIH0gPSB1c2VMYW5ndWFnZSgpO1xuICBjb25zdCB7IHRvYXN0IH0gPSB1c2VUb2FzdCgpO1xuICBjb25zdCBbbG9jYXRpb25dID0gdXNlTG9jYXRpb24oKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIERvbid0IHNob3cgcG9wdXAgb24gcGxheWJvb2svc2tpbmNhcmUtZ3VpZGUgcGFnZXNcbiAgICBpZiAobG9jYXRpb24gPT09ICcvcGxheWJvb2snIHx8IGxvY2F0aW9uID09PSAnL3NraW5jYXJlLWd1aWRlJykgcmV0dXJuO1xuICAgIFxuICAgIC8vIENoZWNrIGlmIHVzZXIgaGFzIGFscmVhZHkgc2lnbmVkIHVwIChwZXJtYW5lbnQgYmxvY2spXG4gICAgY29uc3QgaGFzU2lnbmVkVXAgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdreW4td2FpdGxpc3Qtc2lnbmVkLXVwJyk7XG4gICAgaWYgKGhhc1NpZ25lZFVwKSByZXR1cm47XG5cbiAgICAvLyBDaGVjayBpZiB1c2VyIG1hbnVhbGx5IGNsb3NlZCB0aGUgcG9wdXBcbiAgICBjb25zdCBoYXNDbG9zZWRQb3B1cCA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2t5bi13YWl0bGlzdC1wb3B1cC1jbG9zZWQnKTtcbiAgICBpZiAoaGFzQ2xvc2VkUG9wdXApIHJldHVybjtcblxuICAgIGNvbnN0IGhhbmRsZVNjcm9sbCA9ICgpID0+IHtcbiAgICAgIC8vIFJlLWNoZWNrIGNsb3NlZCBzdGF0dXMgb24gZXZlcnkgc2Nyb2xsXG4gICAgICBpZiAoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgna3luLXdhaXRsaXN0LXBvcHVwLWNsb3NlZCcpKSByZXR1cm47XG4gICAgICBcbiAgICAgIC8vIERvbid0IHNob3cgcG9wdXAgaWYgY29va2llIGNvbnNlbnQgaGFzbid0IGJlZW4gaGFuZGxlZCB5ZXRcbiAgICAgIGNvbnN0IGNvb2tpZUNvbnNlbnQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgna3luX2Nvb2tpZV9jb25zZW50Jyk7XG4gICAgICBpZiAoIWNvb2tpZUNvbnNlbnQpIHJldHVybjtcblxuICAgICAgLy8gQ2hlY2sgaWYgdXNlciBpcyBuZWFyIHRoZSBzdWJzY3JpYmUgc2VjdGlvbiAtIGRvbid0IHNob3cgcG9wdXAgdGhlcmVcbiAgICAgIGNvbnN0IHN1YnNjcmliZVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3Vic2NyaWJlLXNlY3Rpb24nKTtcbiAgICAgIGlmIChzdWJzY3JpYmVTZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSBzdWJzY3JpYmVTZWN0aW9uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBpc05lYXJTdWJzY3JpYmVTZWN0aW9uID0gcmVjdC50b3AgPCB3aW5kb3cuaW5uZXJIZWlnaHQgJiYgcmVjdC5ib3R0b20gPiAwO1xuICAgICAgICBpZiAoaXNOZWFyU3Vic2NyaWJlU2VjdGlvbikge1xuICAgICAgICAgIC8vIElmIHBvcHVwIGlzIHZpc2libGUgYW5kIHVzZXIgc2Nyb2xsZWQgdG8gc3Vic2NyaWJlIHNlY3Rpb24sIGhpZGUgaXRcbiAgICAgICAgICBpZiAoaXNWaXNpYmxlKSB7XG4gICAgICAgICAgICBzZXRJc0Nsb3NpbmcodHJ1ZSk7XG4gICAgICAgICAgICBzZXRUaW
5051lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgc2V0SXNWaXNpYmxlKGZhbHNlKTtcbiAgICAgICAgICAgICAgc2V0SXNDbG9zaW5nKGZhbHNlKTtcbiAgICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzY3JvbGxQZXJjZW50ID0gKHdpbmRvdy5zY3JvbGxZIC8gKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQgLSB3aW5kb3cuaW5uZXJIZWlnaHQpKSAqIDEwMDtcbiAgICAgIFxuICAgICAgLy8gU2hvdyBwb3B1cCBhdCA1MCUgc2Nyb2xsIGlmIG5vdCBhbHJlYWR5IHZpc2libGVcbiAgICAgIGlmIChzY3JvbGxQZXJjZW50ID49IDUwICYmICFpc1Zpc2libGUpIHtcbiAgICAgICAgc2V0SXNWaXNpYmxlKHRydWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaGFuZGxlU2Nyb2xsKTtcbiAgICByZXR1cm4gKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGhhbmRsZVNjcm9sbCk7XG4gIH0sIFtpc1Zpc2libGVdKTtcblxuICBjb25zdCBoYW5kbGVDbG9zZSA9ICgpID0+IHtcbiAgICAvLyBNYXJrIGFzIGNsb3NlZCBzbyBwb3B1cCB3b24ndCBzaG93IGFnYWluIHRoaXMgc2Vzc2lvblxuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ2t5bi13YWl0bGlzdC1wb3B1cC1jbG9zZWQnLCAndHJ1ZScpO1xuICAgIHNldElzQ2xvc2luZyh0cnVlKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHNldElzVmlzaWJsZShmYWxzZSk7XG4gICAgICBzZXRJc0Nsb3NpbmcoZmFsc2UpO1xuICAgIH0sIDMwMCk7XG4gIH07XG5cbiAgLy8gRVNDIGtleSB0byBjbG9zZVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghaXNWaXNpYmxlKSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgaGFuZGxlRXNjID0gKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgaGFuZGxlQ2xvc2UoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIFxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgaGFuZGxlRXNjKTtcbiAgICByZXR1cm4gKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVFc2MpO1xuICB9LCBbaXNWaXNpYmxlXSk7XG5cbiAgY29uc3QgaGFuZGxlSW5wdXRDaGFuZ2UgPSAoZTogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICBzZXRGb3JtRGF0YShwcmV2ID0+ICh7XG4gICAgICAuLi5wcmV2LFxuICAgICAgW2UudGFyZ2V0Lm5hbWVdOiBlLnRhcmdldC52YWx1ZVxuICAgIH0pKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVTdWJtaXQgPSBhc3luYyAoZTogUmVhY3QuRm9ybUV2ZW50KSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIFxuICAgIGNvbnN0IGVtYWlsUmVnZXggPSAvXlteXFxzQF0rQFteXFxzQF0rXFwuW15cXHNAXSskLztcbiAgICBpZiAoIWZvcm1EYXRhLmVtYWlsIHx8ICFlbWFpbFJlZ2V4LnRlc3QoZm9ybURhdGEuZW1haWwpKSB7XG4gICAgICB0b2FzdCh7XG4gICAgICAgIHRpdGxlOiBsYW5ndWFnZSA9PT0gJ2ZyJyA/ICdFcnJldXInIDogJ0Vycm9yJyxcbiAgICAgICAgZGVzY3JpcHRpb246IGxhbmd1YWdlID09PSAnZnInID8gJ1ZldWlsbGV6IGVudHJlciB1bmUgYWRyZXNzZSBlbWFpbCB2YWxpZGUuJyA6ICdQbGVhc2UgZW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLicsXG4gICAgICAgIHZhcmlhbnQ6ICdkZXN0cnVjdGl2ZScsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZXRJc1N1Ym1pdHRpbmcodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFwaVJlcXVlc3QoJy9hcGkvd2FpdGxpc3QnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBkYXRhOiB7IFxuICAgICAgICAgIGZpcnN0TmFtZTogZm9ybURhdGEuZmlyc3ROYW1lLFxuICAgICAgICAgIGVtYWlsOiBmb3JtRGF0YS5lbWFpbCwgXG4gICAgICAgICAgc291cmNlOiAncG9wdXAnLFxuICAgICAgICAgIGxhbmd1YWdlXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgdHJhY2tXYWl0bGlzdFNpZ251cCgncG9wdXAnKTtcbiAgICAgIC8vIE1hcmsgYXMgc2lnbmVkIHVwIHRvIHByZXZlbnQgcG9wdXAgZnJvbSBzaG93aW5nIGFnYWluXG4gICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdreW4td2FpdGxpc3Qtc2lnbmVkLXVwJywgJ3RydWUnKTtcbiAgICAgIC8vIEdyYW50IHBsYXlib29rIGFjY2VzcyAocGVyc2lzdHMgYWNyb3NzIHNlc3Npb25zKVxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2t5bi1wbGF5Ym9vay1hY2Nlc3MnLCAndHJ1ZScpO1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2t5bi11c2VyLW5hbWUnLCBmb3JtRGF0YS5maXJzdE5hbWUpO1xuICAgICAgdG9hc3Qoe1xuICAgICAgICB0aXRsZTogbGFuZ3VhZ2UgPT09ICdmcicgPyBcIlZvdXMgw6p0ZXMgc3VyIGxhIGxpc3RlICEgOylcIiA6IFwiWW91J3JlIG9uIHRoZSBsaXN0ISA7KVwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogbGFuZ3VhZ2UgPT09ICdmcicgXG4gICAgICAgICAgPyBcIkxlIEtZTiBTa2luY2FyZSBQbGF5Ym9vayBlc3QgZGFucyB2b3RyZSBib8OudGUgbWFpbC4gQmllbnZlbnVlIGNoZXogS1lOICFcIiBcbiAgICAgICAgICA6IFwiVGhlIEtZTiBTa2luY2FyZSBQbGF5Ym9vayBpcyBpbiB5b3VyIGluYm94LiBXZWxjb21lIHRvIEtZTiFcIixcbiAgICAgIH0pO1xuXG4gICAgICBzZXRGb3JtRGF0YSh7IGZpcnN0TmFtZTogJycsIGVtYWlsOiAnJyB9KTtcbiAgICAgIC8vIENsb3NlIHdpdGhvdXQgbWFya2luZyBhcyBtYW51YWxseSBjbG9zZWRcbiAgICAgIHNldElzQ2xvc2luZyh0cnVlKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBzZXRJc1Zpc2libGUoZmFsc2UpO1xuICAgICAgICBzZXRJc0Nsb3NpbmcoZmFsc2UpO1xuICAgICAgfSwgMzAwKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAoZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJ2FscmVhZHknKSkge1xuICAgICAgICB0b2FzdCh7XG4gICAgICAgICAgdGl0bGU6IGxhbmd1YWdlID09PSAnZnInID8gJ0TDqWrDoCBhdmVjIG5vdXMnIDogJ0FscmVhZHkgd2l0aCB1cycsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGxhbmd1YWdlID09PSAnZnInID8gJ0NldCBlbWFpbCBmYWl0IGTDqWrDoCBwYXJ0aWUgZGUgbm90cmUgY29tbXVuYXV0w6kuJyA6ICdUaGlzIGVtYWlsIGlzIGFscmVhZHkgcGFydCBvZiBvdXIgY29tbXVuaXR5LicsXG4gICAgICAgICAgdmFyaWFudDogJ2VsZWdhbnQnIGFzIGFueSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b2FzdCh7XG4gICAgICAgICAgdGl0bGU6IGxhbmd1YWdlID09PSAnZnInID8gJ0VycmV1cicgOiAnRXJyb3InLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBsYW5ndWFnZSA9PT0gJ2ZyJyA/ICdVbmUgZXJyZXVyIGVzdCBzdXJ2ZW51ZS4nIDogJ1NvbWV0aGluZyB3ZW50IHdyb25nLicsXG4gICAgICAgICAgdmFyaWFudDogJ2VsZWdhbnQnIGFzIGFueSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldElzU3VibWl0dGluZyhmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIGlmICghaXNWaXNpYmxlKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCB0ID0ge1xuICAgIGhlYWRpbmc6IGxhbmd1YWdlID09PSAnZnInID8gJ1JFSk9JR05FWiBMQSBMSVNURScgOiAnSk9JTiBUSEUgV0FJVExJU1QnLFxuICAgIGRlc2NyaXB0aW9uOiBsYW5ndWFnZSA9PT0gJ2ZyJyBcbiAgICAgID8gJ1NveWV6IHBhcm1pIGxlcyBwcmVtaWVycyDDoCBkw6ljb3V2cmlyIG5vcyBmb3JtdWxhdGlvbnMgZXQgcmVjZXZleiBub3RyZSA8c3Ryb25nPkd1aWRlIFNraW5jYXJlPC9zdHJvbmc+IGV4Y2x1c2lmLidcbiAgICAgIDogJ0JlIGFtb25nIHRoZSBmaXJzdCB0byBkaXNjb3ZlciBvdXIgZm9ybXVsYXRpb25zIGFuZCByZWNlaXZlIG91ciBleGNsdXNpdmUgPHN0cm9uZz5Ta2luY2FyZSBQbGF5Ym9vazwvc3Ryb25nPi4nLFxuICAgIGpvaW5Db3VudDogbGFuZ3VhZ2UgPT09ICdmcicgPyAnMjAwKyBEw4lKw4AgU1VSIExBIExJU1RFJyA6ICcyMDArIEFMUkVBRFkgT04gVEhFIExJU1QnLFxuICAgIGZpcnN0TmFtZTogbGFuZ3VhZ2UgPT09ICdmcicgPyAnUHLDqW5vbScgOiAnRmlyc3QgbmFtZScsXG4gICAgZW1haWw6IGxhbmd1YWdlID09PSAnZnInID8gJ0VtYWlsJyA6ICdFbWFpbCcsXG4gICAgYnV0dG9uOiBsYW5ndWFnZSA9PT0gJ2ZyJyA/ICdSRUpPSU5EUkUgTEEgTElTVEUnIDogJ0pPSU4gVEhFIFdBSVRMSVNUJyxcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8c3R5bGU+e2BcbiAgICAgICAgQGtleWZyYW1lcyBwb3B1cEZhZGVJbiB7XG4gICAgICAgICAgZnJvbSB7IG9wYWNpdHk6IDA7IH1cbiAgICAgICAgICB0byB7IG9wYWNpdHk6IDE7IH1cbiAgICAgICAgfVxuICAgICAgICBAa2V5ZnJhbWVzIHBvcHVwU2xpZGVVcCB7XG4gICAgICAgICAgZnJvbSB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgyMHB4KSBzY2FsZSgwLjk1KTsgfVxuICAgICAgICAgI
505HRvIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApIHNjYWxlKDEpOyB9XG4gICAgICAgIH1cbiAgICAgICAgQGtleWZyYW1lcyBwb3B1cEZhZGVPdXQge1xuICAgICAgICAgIGZyb20geyBvcGFjaXR5OiAxOyB9XG4gICAgICAgICAgdG8geyBvcGFjaXR5OiAwOyB9XG4gICAgICAgIH1cbiAgICAgICAgQGtleWZyYW1lcyBwb3B1cFNsaWRlRG93biB7XG4gICAgICAgICAgZnJvbSB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKSBzY2FsZSgxKTsgfVxuICAgICAgICAgIHRvIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDIwcHgpIHNjYWxlKDAuOTUpOyB9XG4gICAgICAgIH1cbiAgICAgICAgLnBvcHVwLWJhY2tkcm9wIHsgYW5pbWF0aW9uOiBwb3B1cEZhZGVJbiAwLjNzIGVhc2Utb3V0IGZvcndhcmRzOyB9XG4gICAgICAgIC5wb3B1cC1iYWNrZHJvcC5jbG9zaW5nIHsgYW5pbWF0aW9uOiBwb3B1cEZhZGVPdXQgMC4zcyBlYXNlLWluIGZvcndhcmRzOyB9XG4gICAgICAgIC5wb3B1cC1jYXJkIHsgYW5pbWF0aW9uOiBwb3B1cFNsaWRlVXAgMC40cyBjdWJpYy1iZXppZXIoMC4xNiwgMSwgMC4zLCAxKSBmb3J3YXJkczsgfVxuICAgICAgICAucG9wdXAtY2FyZC5jbG9zaW5nIHsgYW5pbWF0aW9uOiBwb3B1cFNsaWRlRG93biAwLjNzIGVhc2UtaW4gZm9yd2FyZHM7IH1cbiAgICAgIGB9PC9zdHlsZT5cblxuICAgICAgey8qIE1vZGFsIENvbnRhaW5lciAtIGhhbmRsZXMga2V5Ym9hcmQgcmVzaXplICovfVxuICAgICAgPGRpdiBcbiAgICAgICAgY2xhc3NOYW1lPXtgZml4ZWQgaW5zZXQtMCB6LVsyMDBdIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHAtNCBwb3B1cC1iYWNrZHJvcCAke2lzQ2xvc2luZyA/ICdjbG9zaW5nJyA6ICcnfWB9XG4gICAgICAgIHN0eWxlPXt7IFxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMCwgMCwgMCwgMC42KScsXG4gICAgICAgICAgYmFja2Ryb3BGaWx0ZXI6ICdibHVyKDRweCknLFxuICAgICAgICAgIFdlYmtpdEJhY2tkcm9wRmlsdGVyOiAnYmx1cig0cHgpJyxcbiAgICAgICAgfX1cbiAgICAgICAgb25DbGljaz17aGFuZGxlQ2xvc2V9XG4gICAgICAgIGRhdGEtdGVzdGlkPVwicG9wdXAtYmFja2Ryb3BcIlxuICAgICAgICBkYXRhLW1vZGFsLWNvbnRhaW5lclxuICAgICAgPlxuICAgICAgICB7LyogUG9wdXAgQ2FyZCAqL31cbiAgICAgICAgPGRpdiBcbiAgICAgICAgICBjbGFzc05hbWU9e2ByZWxhdGl2ZSB6LVsyMDFdIHBvcHVwLWNhcmQgJHtpc0Nsb3NpbmcgPyAnY2xvc2luZycgOiAnJ31gfVxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICB3aWR0aDogJ21pbig5MnZ3LCA2ODBweCknLFxuICAgICAgICAgICAgbWF4SGVpZ2h0OiAnbWluKDkwdmgsIDEwMCUpJyxcbiAgICAgICAgICB9fVxuICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpfVxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwicG9wdXAtd2FpdGxpc3QtY2FyZFwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IFxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmctd2h
505pdGUgb3ZlcmZsb3ctaGlkZGVuIGZsZXggZmxleC1jb2wgbWQ6ZmxleC1yb3cgbWF4LWgtW2luaGVyaXRdIHJlbGF0aXZlXCJcbiAgICAgICAgICAgIHN0eWxlPXt7IGJveFNoYWRvdzogJzAgMjVweCA1MHB4IC0xMnB4IHJnYmEoMCwgMCwgMCwgMC4yNSknIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgey8qIENsb3NlIEJ1dHRvbiAqL31cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgaGFuZGxlQ2xvc2UoKTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgb25Ub3VjaEVuZD17KGUpID0+IHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVDbG9zZSgpO1xuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSB0b3AtMyByaWdodC0zIG1kOnRvcC00IG1kOnJpZ2h0LTQgdy0xMCBoLTEwIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtZnVsbCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDAgaG92ZXI6YmctZ3JheS0xMDAgZm9jdXM6b3V0bGluZS1ub25lXCJcbiAgICAgICAgICAgICAgc3R5bGU9e3sgXG4gICAgICAgICAgICAgICAgekluZGV4OiA5OTk5OSxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDI1NSwyNTUsMjU1LDAuOSknLFxuICAgICAgICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICdhdXRvJyxcbiAgICAgICAgICAgICAgICB0b3VjaEFjdGlvbjogJ21hbmlwdWxhdGlvbicsXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDbG9zZSBwb3B1cFwiXG4gICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiYnV0dG9uLWNsb3NlLXBvcHVwXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPFggc2l6ZT17MTh9IHN0cm9rZVdpZHRoP
505XsyfSBjb2xvcj1cIiMzMzMzMzNcIiAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICB7LyogSW1hZ2UgU2lkZSAqL31cbiAgICAgICAgICA8ZGl2IFxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiaGlkZGVuIG1kOmJsb2NrIG1kOnctMi81IHJlbGF0aXZlIG92ZXJmbG93LWhpZGRlblwiXG4gICAgICAgICAgICBzdHlsZT17eyBtaW5IZWlnaHQ6ICc0MjBweCcgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgIHNyYz17cG9wdXBJbWFnZX1cbiAgICAgICAgICAgICAgYWx0PVwiS1lOIFNraW5jYXJlIC0gQWZyaWNhbiBib3RhbmljYWwgYmVhdXR5IGNvbWluZyBzb29uXCJcbiAgICAgICAgICAgICAgbG9hZGluZz1cImxhenlcIlxuICAgICAgICAgICAgICBkZWNvZGluZz1cImFzeW5jXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQtMCB3LWZ1bGwgaC1mdWxsIG9iamVjdC1jb3ZlclwiXG4gICAgICAgICAgICAgIHN0eWxlPXt7IG9iamVjdFBvc2l0aW9uOiAnY2VudGVyIGNlbnRlcicgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICB7LyogQ29udGVudCBTaWRlICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIHAtNiBtZDpwLTEwIHJlbGF0aXZlIG92ZXJmbG93LXktYXV0b1wiIGRhdGEtbW9kYWwtc2Nyb2xsYWJsZT5cblxuICAgICAgICAgICAgey8qIENvbnRlbnQgKi99XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInB0LTYgbWQ6cHQtMiB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICB7LyogSGVhZGluZyAqL31cbiAgICAgICAgICAgICAgPGgzIFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtWzE2cHhdIG1kOnRleHQtWzE4cHhdIHVwcGVyY2FzZSB0cmFja2luZy1bMS41cHhdIG1iLTNcIlxuICAgICAgICAgICAgICAgIHN0eWxlPXt7IFxuICAgICAgICAgICAgICAgICAgY29sb3I6ICcjMUExQTFBJywgXG4gICAgICAgICAgICAgICAgICBmb250RmFtaWx5OiBcIkhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWZcIixcbiAgICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IDUwMCxcbiAgICAgICAgICAgICAgICAgIGxpbmVIZWlnaHQ6IDEuMyxcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3QuaGVhZGluZ31cbiAgICAgICAgICAgICAgPC9oMz5cblxuICAgICAgICAgICAgICB7LyogSm9pbiBjb3VudCBiYWRnZSAtIGFmdGVyIGhlYWRpbmcgKi99XG4gICAgICAgICAgICAgIDxwIFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtWzEwcHhdIHVwcGVyY2FzZSB0cmFja2luZy1bMnB4XSBtYi00XCJcbiAgICAgICAgICAgICAgICBzdHlsZT17eyBcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzg4ODg4OCcsIFxuICAgICAgICAgICAgICAgICAgZm9udEZhbWlseTogXCJIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmXCIsXG4gICAgICAgICAgICAgICAgICBmb250V2VpZ2h0OiA0MDAsXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt0LmpvaW5Db3VudH1cbiAgICAgICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgICAgIHsvKiBEZXNjcmlwdGlvbiAqL31cbiAgICAgICAgICAgICAgPHAgXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1bMTNweF0gbWItNlwiXG4gICAgICAgICAgICAgICAgc3R5bGU9e3sgXG4gICAgICAgICAgICAgICAgICBjb2xvcjogJyM2NjY2NjYnLCBcbiAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6IFwiSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZlwiLFxuICAgICAgICAgICAgICAgICAgZm9udFdlaWdodDogMzAwLFxuICAgICAgICAgICAgICAgICAgbGluZUhlaWdodDogMS43LFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3sgX19odG1sOiB0LmRlc2NyaXB0aW9uIH19XG4gICAgICAgICAgICAgIC8+XG5cbiAgICAgICAgICAgICAgey8qIEZvcm0gKi99XG4gICAgICAgICAgICAgIDxmb3JtIG9uU3VibWl0PXtoYW5kbGVTdWJtaXR9IGNsYXNzTmFtZT1cInNwYWNlLXktM1wiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgbmFtZT1cImZpcnN0TmFtZVwiXG4gICAgICAgICAgICAgICAgICB2YWx1ZT17Zm9ybURhdGEuZmlyc3ROYW1lfVxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUlucHV0Q2hhbmdlfVxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3QuZmlyc3ROYW1lfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsIHB4LTQgcHktMyBib3JkZXIgdHJhbnNpdGlvbi1jb2xvcnMgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOmJvcmRlci1bIzFBMUExQV1cIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgZm9udEZhbWlseTogXCJIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmXCIsXG4gICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiAnMTNweCcsXG4gICAgICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IDMwMCxcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICcjRTBFMEUwJyxcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnI0ZBRkFGQScsXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogMCxcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cInBvcHVwLWlucHV0LWZpcnN0LW5hbWVcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwiZW1haWxcIlxuICAgICAgICAgICAgICAgICAgbmFtZT1cImVtYWlsXCJcbiAgICAgICAgICAgICAgICAgIHZhbHVlPXtmb3JtRGF0YS5lbWFpbH1cbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVJbnB1dENoYW5nZX1cbiAgICAgICAgICAgICAgICAgI
505HBsYWNlaG9sZGVyPXtgJHt0LmVtYWlsfSpgfVxuICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBweC00IHB5LTMgYm9yZGVyIHRyYW5zaXRpb24tY29sb3JzIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpib3JkZXItWyMxQTFBMUFdXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6IFwiSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZlwiLFxuICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogJzEzcHgnLFxuICAgICAgICAgICAgICAgICAgICBmb250V2VpZ2h0OiAzMDAsXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yOiAnI0UwRTBFMCcsXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJyNGQUZBRkEnLFxuICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IDAsXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJwb3B1cC1pbnB1dC1lbWFpbFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtpc1N1Ym1pdHRpbmd9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgcHktMy41IHVwcGVyY2FzZSB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0zMDAgaG92ZXI6YmctdHJhbnNwYXJlbnQgaG92ZXI6dGV4dC1bIzFBMUExQV0gZGlzYWJsZWQ6b3BhY2l0eS01MFwiXG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjMUExQTFBJyxcbiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjRkZGRkZGJyxcbiAgICAgICAgICAgICAgICAgICAgZm9udEZhbWlseTogXCJIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmXCIsXG4gICAgICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IDQwMCxcbiAgICAgICAgICAgICAgICAgICAgbGV0dGVyU3BhY2luZzogJzJweCcsXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCAjMUExQTFBJyxcbiAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6ICcxMXB4JyxcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAwLFxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiYnV0dG9uLXBvcHVwLXN1Ym1pdFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge2lzU3VibWl0dGluZyA/ICcuLi4nIDogdC5idXR0b259XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvPlxuICApO1xufVxuIl0sImZpbGUiOiIvaG9tZS9ydW5uZXIvd29ya3NwYWNlL2NsaWVudC9zcmMvY29tcG9uZW50cy9XYWl0bGlzdFBvcHVwLnRzeCJ9
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.