1<!-- ReSharper disable Html.PathError --> 2<!DOCTYPE html> 3<html lang="en"> 4 5<head> 6 <meta charset="utf-8"/> 7 <meta name="viewport" content="width=device-width, initial-scale=1.0"/> 8 <title>Evidence Based Wyoming</title> 9 <base href="/"/> 10 11 <!-- MudBlazor CSS --> 12 <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet"> 13 <link href="_content/MudBlazor/MudBlazor.min.css" rel="stylesheet"/> 14 <!-- Leaflet.js for district maps --> 15 <link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css" 16 integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" 17 crossorigin=""/> 18 <!-- PSC Markdown Editor CSS --> 19 <link href="_content/PSC.Blazor.Components.MarkdownEditor/css/easymde.min.css" rel="stylesheet"/> 20 <link href="_content/PSC.Blazor.Components.MarkdownEditor/css/markdowneditor.css" rel="stylesheet"/> 21 <!-- MudBlazor.Markdown CSS --> 22 <link href="_content/MudBlazor.Markdown/MudBlazor.Markdown.min.css" rel="stylesheet"/> 23 <link rel="stylesheet" href="css/app.css"/> 24 <link rel="icon" href="favicon.ico"/> 25 <link href="WyomingUltra.Web.styles.css" rel="stylesheet"/> 26 27 <!-- Google reCAPTCHA v2 -->
vendor: 125 bytes, lines 27-30
27 28 <script src="https://www.google.com/recaptcha/api.js?onload=onRecaptchaLoad&render=explicit" async defer></script> 29 30
30<!-- Application Insights JS SDK (client-side telemetry) --> 31
31<script type="text/javascript"> 32 (function(w, d, cfg) { 33 var t = cfg.name || "appInsights"; 34 if (cfg.name || w.appInsightsSDK) { 35 w.appInsightsSDK = t; 36 } 37 38 var ai = w[t] || 39 (function(cfg) { 40 var s = d.createElement("script"); 41 s.src = cfg.src || "https://js.monitor.azure.com/scripts/b/ai.2.min.js"; 42 s.async = true; 43 if (cfg.crossOrigin) s.crossOrigin = cfg.crossOrigin; 44 d.getElementsByTagName("head")[0].appendChild(s); 45 46 var queue = []; 47 var methods = [ 48 "Event", "PageView", "Exception", "Trace", "DependencyData", "Metric", "PageViewPerformance", "CustomEvent", "AuthenticatedUserContext", "TelemetryInitializers" 49 ]; 50 51 var aiObj = { 52 config: cfg.cfg || {}, 53 queue: queue, 54 version: 2, 55 sv: "8" 56 }; 57 58 function createStub(method) { 59 var name = "track" + method; 60 aiObj[name] = function() { 61 var args = arguments; 62 queue.push(function() { aiObj[name].apply(aiObj, args); }); 63 }; 64 } 65 66 for (var i = 0; i < methods.length; i++) { 67 createStub(methods[i]); 68 } 69 70 aiObj.setAuthenticatedUserContext = function() { 71 var args = arguments; 72 queue.push(function() { aiObj.setAuthenticatedUserContext.apply(aiObj, args); }); 73 }; 74 75 aiObj.clearAuthenticatedUserContext = function() { 76 var args = arguments; 77 queue.push(function() { aiObj.clearAuthenticatedUserContext.apply(aiObj, args); }); 78 }; 79 80 aiObj.flush = function() { 81 var args = arguments; 82 queue.push(function() { aiObj.flush.apply(aiObj, args); }); 83 }; 84 85 return aiObj; 86 })(cfg); 87 88 w[t] = ai; 89 if (ai.queue && ai.queue.length === 0 && typeof ai.trackPageView === "function") { 90 ai.trackPageView({}); 91 } 92 })(window, 93 document, 94 { 95 src: "https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js", 96 crossOrigin: "anonymous", 97 cfg: { 98 connectionString: "InstrumentationKey=9581a67f-7ae4-435e-bd62-4c310492f4ef;IngestionEndpoint=https://eastus-8.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/;ApplicationId=58c0397f-8237-45d2-895d-3869f88d3d30", 99 disableExceptionTracking: false, 100 enableUnhandledPromiseRejectionTracking: true, 101 enableAutoRouteTracking: true 102 } 103 }); 104 </script>
104 105</head> 106 107<body> 108<div id="app"> 109 <div style="display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100vh; background: linear-gradient(135deg, #3a2a1f 0, #492F24 100%);"> 110 <svg class="loading-progress" style="width: 80px; height: 80px;"> 111 <circle r="40%" cx="50%" cy="50%" style="stroke: #ffffff; stroke: rgba(255, 255, 255, 0.2); fill: none; stroke-width: 8px;"/> 112 <circle r="40%" cx="50%" cy="50%" style="stroke: #ffc425; fill: none; stroke-width: 8px; stroke-dasharray: 251.2; stroke-dashoffset: 0; animation: loading-spin 1.5s linear infinite;"/> 113 </svg> 114 <div style="color: white; font-family: 'Inter', sans-serif; font-size: 1.2rem; margin-top: 1rem;">Loading Evidence Based Wyoming...</div> 115 </div> 116 <style> 117 @keyframes loading-spin { 118 0% { stroke-dashoffset: 251.2; } 119 120 50% { stroke-dashoffset: 62.8; } 121 122 100% { stroke-dashoffset: 251.2; } 123 } 124 </style> 125</div> 126 127<div id="blazor-error-ui"> 128 <div class="error-content"> 129 <span class="error-icon">â ï¸</span> 130 <span class="error-message" onclick="window.showErrorDetails()"> 131 <span id="error-summary">An error occurred</span> 132 <span class="click-hint">(click for details)</span> 133 </span> 134 <a href="" class="reload">Reload</a> 135 <a class="dismiss" onclick="document.getElementById('blazor-error-ui').style.display = 'none'">â</a> 136 </div> 137</div> 138 139<!-- Error Details Modal --> 140<div id="error-modal" class="error-modal"> 141 <div class="error-modal-content"> 142 <div class="error-modal-header"> 143 <span>â ï¸ Error Details</span> 144 <button class="error-modal-close" onclick="window.hideErrorDetails()">×</button> 145 </div> 146 <div class="error-modal-body"> 147 <div class="error-section"> 148 <strong>Message:</strong> 149 <pre id="error-detail-message"></pre> 150 </div> 151 <div class="error-section"> 152 <strong>Stack Trace:</strong> 153 <pre id="error-detail-stack"></pre> 154 </div> 155 <div class="error-section"> 156 <strong>Time:</strong> 157 <span id="error-detail-time"></span> 158 </div> 159 </div> 160 <div class="error-modal-footer"> 161 <button onclick="window.copyErrorToClipboard()">ð Copy to Clipboard</button> 162 <button onclick="window.hideErrorDetails()">Close</button> 163 </div> 164 </div> 165</div> 166 167<style> 168 #blazor-error-ui { 169 display: none; 170 position: fixed; 171 bottom: 0; 172 left: 0; 173 right: 0; 174 z-index: 9999; 175 background: linear-gradient(135deg, #dc2626 0, #b91c1c 100%); 176 color: white; 177 box-shadow: 0 -4px 20px #000000; 178 box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.3); 179 font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; 180 } 181 182 #blazor-error-ui .error-content { 183 display: flex; 184 align-items: center; 185 justify-content: center; 186 gap: 1rem; 187 padding: 1rem 2rem; 188 max-width: 1200px; 189 margin: 0 auto; 190 } 191 192 #blazor-error-ui .error-icon { font-size: 1.5rem; } 193 194 #blazor-error-ui .error-message { 195 flex: 1; 196 font-size: 0.95rem; 197 cursor: pointer; 198 padding: 0.5rem; 199 border-radius: 4px; 200 transition: background 0.2s; 201 } 202 203 #blazor-error-ui .error-message:hover { 204 background: #ffffff; 205 background: rgba(255, 255, 255, 0.1); 206 } 207 208 #blazor-error-ui .click-hint { 209 font-size: 0.8rem; 210 opacity: 0.8; 211 margin-left: 0.5rem; 212 } 213 214 #blazor-error-ui a, #blazor-error-ui .dismiss { 215 padding: 0.5rem 1rem; 216 border-radius: 4px; 217 text-decoration: none; 218 font-weight: 500; 219 transition: background 0.2s; 220 cursor: pointer; 221 } 222 223 #blazor-error-ui .reload { 224 background: #ffc425; 225 color: #1a1a1a; 226 } 227 228 #blazor-error-ui .reload:hover { background: #ffd54f; } 229 230 #blazor-error-ui .dismiss { 231 background: #ffffff; 232 background: rgba(255, 255, 255, 0.2); 233 color: white; 234 } 235 236 #blazor-error-ui .dismiss:hover { 237 background: #ffffff; 238 background: rgba(255, 255, 255, 0.3); 239 } 240 241 /* Error Modal Styles */ 242 243 .error-modal { 244 display: none; 245 position: fixed; 246 top: 0; 247 left: 0; 248 right: 0; 249 bottom: 0; 250 background: #000000; 251 background: rgba(0, 0, 0, 0.7); 252 z-index: 10000; 253 font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; 254 } 255 256 .error-modal-content { 257 position: absolute; 258 top: 50%; 259 left: 50%; 260 transform: translate(-50%, -50%); 261 background: #1a1a1a; 262 color: #e5e5e5; 263 border-radius: 8px; 264 width: 90%; 265 max-width: 800px; 266 max-height: 80vh; 267 display: flex; 268 flex-direction: column; 269 box-shadow: 0 20px 60px #000000; 270 box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5); 271 } 272 273 .error-modal-header { 274 display: flex; 275 justify-content: space-between; 276 align-items: center; 277 padding: 1rem 1.5rem; 278 background: #dc2626; 279 color: white; 280 border-radius: 8px 8px 0 0; 281 font-weight: 600; 282 font-size: 1.1rem; 283 } 284 285 .error-modal-close { 286 background: none; 287 border: none; 288 color: white; 289 font-size: 1.5rem; 290 cursor: pointer; 291 padding: 0 0.5rem; 292 } 293
294 .error-modal-close:hover { opacity: 0.8; } 295 296 .error-modal-body { 297 padding: 1.5rem; 298 overflow-y: auto; 299 flex: 1; 300 } 301 302 .error-section { margin-bottom: 1rem; } 303 304 .error-section strong { 305 display: block; 306 color: #ffc425; 307 margin-bottom: 0.5rem; 308 } 309 310 .error-section pre { 311 background: #2d2d2d; 312 padding: 1rem; 313 border-radius: 4px; 314 overflow-x: auto; 315 font-size: 0.85rem; 316 line-height: 1.5; 317 white-space: pre-wrap; 318 word-break: break-word; 319 margin: 0; 320 max-height: 200px; 321 overflow-y: auto; 322 } 323 324 .error-modal-footer { 325 padding: 1rem 1.5rem; 326 border-top: 1px solid #333; 327 display: flex; 328 gap: 1rem; 329 justify-content: flex-end; 330 } 331 332 .error-modal-footer button { 333 padding: 0.5rem 1rem; 334 border: none; 335 border-radius: 4px; 336 cursor: pointer; 337 font-weight: 500; 338 transition: background 0.2s; 339 } 340 341 .error-modal-footer button:first-child { 342 background: #ffc425; 343 color: #1a1a1a; 344 } 345 346 .error-modal-footer button:last-child { 347 background: #444; 348 color: white; 349 } 350 351 .error-modal-footer button:hover { opacity: 0.9; } 352</style> 353
354<script> 355 // Store error details 356 window.lastError = { message: '', stack: '', time: '' }; 357 358// Intercept console.error to capture Blazor .NET exceptions. 359// Blazor WASM logs unhandled .NET exceptions via console.error but does NOT 360// trigger window.onerror or onunhandledrejection, so we must intercept here. 361 (function() { 362 var originalConsoleError = console.error; 363 console.error = function() { 364 var parts = []; 365 for (var i = 0; i < arguments.length; i++) { 366 var arg = arguments[i]; 367 if (arg instanceof Error) { 368 parts.push(arg.message); 369 if (arg.stack) { 370 window.lastError.stack = arg.stack; 371 } 372 } else if (typeof arg === 'object' && arg !== null) { 373 try { 374 parts.push(JSON.stringify(arg)); 375 } catch (e) { 376 parts.push(String(arg)); 377 } 378 } else { 379 parts.push(String(arg)); 380 } 381 } 382 383 var message = parts.join(' '); 384 385 // Capture if it looks like an actual error (not routine logging) 386 if (message && 387 (message.includes('Error') || 388 message.includes('error') || 389 message.includes('Exception') || 390 message.includes('exception') || 391 message.includes('Unhandled') || 392 message.includes('fail'))) { 393 window.lastError = { 394 message: message, 395 stack: window.lastError.stack || 'See browser console (F12) for full details', 396 time: new Date().toLocaleString() 397 }; 398 var summary = document.getElementById('error-summary'); 399 if (summary) { 400 summary.textContent = message.length > 80 ? message.substring(0, 80) + '...' : message; 401 } 402 } 403 404 originalConsoleError.apply(console, arguments); 405 }; 406 })(); 407 408// Capture unhandled JS errors 409 window.onerror = function(message, source, lineno, colno, error) { 410 window.lastError = { 411 message: message + (source ? '\n\nSource: ' + source + ':' + lineno + ':' + colno : ''), 412 stack: error && error.stack ? error.stack : 'No stack trace available', 413 time: new Date().toLocaleString() 414 }; 415 document.getElementById('error-summary').textContent = 416 message.length > 80 ? message.substring(0, 80) + '...' : message; 417 }; 418 419// Capture unhandled promise rejections 420 window.onunhandledrejection = function(event) { 421 var reason = event.reason; 422 window.lastError = { 423 message: reason && reason.message ? reason.message :
423String(reason), 424 stack: reason && reason.stack ? reason.stack : 'No stack trace available', 425 time: new Date().toLocaleString() 426 }; 427 var msg = window.lastError.message; 428 document.getElementById('error-summary').textContent = 429 msg.length > 80 ? msg.substring(0, 80) + '...' : msg; 430 }; 431 432// Watch for Blazor showing the error bar (display attribute changes). 433// Catches cases where Blazor sets the error UI visible but nothing else captured the details. 434 (function() { 435 var errorUi = document.getElementById('blazor-error-ui'); 436 if (errorUi) { 437 var observer = new MutationObserver(function(mutations) { 438 mutations.forEach(function(m) { 439 if (m.attributeName === 'style' && errorUi.style.display !== 'none' && errorUi.style.display !== '') { 440 if (!window.lastError.message) { 441 window.lastError = { 442 message: 'Blazor runtime error (check browser F12 console for details)', 443 stack: 'The .NET exception was not captured by JS handlers. Open F12 > Console for the full error.', 444 time: new Date().toLocaleString() 445 }; 446 } 447 } 448 }); 449 }); 450 observer.observe(errorUi, { attributes: true, attributeFilter: ['style'] }); 451 } 452 })(); 453 454 window.showErrorDetails = function() { 455 document.getElementById('error-detail-message').textContent = window.lastError.message || 'Unknown error'; 456 document.getElementById('error-detail-stack').textContent = window.lastError.stack || 'No stack trace'; 457 document.getElementById('error-detail-time').textContent = window.lastError.time || 'Unknown'; 458 document.getElementById('error-modal').style.display = 'block'; 459 }; 460 461 window.hideErrorDetails = function() { 462 document.getElementById('error-modal').style.display = 'none'; 463 }; 464 465 window.copyErrorToClipboard = function() { 466 var text = 'Error: ' + 467 window.lastError.message + 468 '\n\nStack Trace:\n' + 469 window.lastError.stack + 470 '\n\nTime: ' + 471 window.lastError.time; 472 navigator.clipboard.writeText(text).then(function() { 473 alert('Error details copied to clipboard!'); 474 }); 475 }; 476 477// Close modal on escape key 478 document.addEventListener('keydown', 479 function(e) { 480 if (e.key === 'Escape') window.hideErrorDetails(); 481 }); 482 483// Close modal on backdrop click 484 document.getElementById('error-modal').addEventListener('click', 485 function(e) { 486 if (e.target === this) window.hideErrorDetails(); 487 }); 488 489// Legislator lookup for chart tooltips 490 window.legislatorLookup = {}; 491 492 window.setLegislatorLookup = function(data) { 493 window.legislatorLookup = data || {}; 494 }; 495 496// ReSharper disable once UnusedParameter 497 window.getLegislatorName = function(x, y, seriesIndex) { 498 var key = Math.round(x * 10) + '_' + Math.round(y * 10); 499 var entry = window.legislatorLookup[key]; 500 return entry ? entry.name : null; 501 }; 502</script>
502 503 504<!-- LocalStorage helpers for Blazor interop -->
505<script> 506 window.localStorageGet = function(key) { return localStorage.getItem(key); }; 507 window.localStorageSet = function(key, value) { localStorage.setItem(key, value); }; 508</script>
508 509 510<!-- D3.js for force-directed network graph -->
511<script src="https://d3js.org/d3.v7.min.js"></script>
511 512<!-- Leaflet.js for district maps -->
513<script src="https://unpkg.com/[email protected]/dist/leaflet.js" 514 integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=" 515 crossorigin=""></script>
515 516<!-- Leaflet map interop -->
517<script src="js/leafletMap.js"></script>
517 518<!-- File helpers for Scorecard export/import -->
519<script src="js/fileHelpers.js"></script>
519 520<!-- Network graph visualization -->
521<script src="js/networkGraph.js"></script>
521 522<!-- Position spectrum bar chart -->
523<script src="js/positionSpectrum.js"></script>
523 524<!-- PSC Markdown Editor JS -->
525<script src="_content/PSC.Blazor.Components.MarkdownEditor/js/easymde.min.js"></script>
vendor: 1 bytes, line 525
525
526<script src="_content/PSC.Blazor.Components.MarkdownEditor/js/markdownEditor.js"></script>
526 527<!-- MudBlazor.Markdown JS -->
528<script src="_content/MudBlazor.Markdown/MudBlazor.Markdown.min.js"></script>
528 529<!-- MudBlazor JS -->
530<script src="_content/MudBlazor/MudBlazor.min.js"></script>
530 531<!-- MSAL authentication for Azure Entra ID -->
532<script src="_content/Microsoft.Authentication.WebAssembly.Msal/AuthenticationService.js"></script>
vendor: 1 bytes, line 532
532
533<script src="_framework/blazor.webassembly.js"></script>
533 534 535<!-- reCAPTCHA Blazor interop -->
536<script> 537 window.recaptchaReady = false; 538 window.onRecaptchaLoad = function() { window.recaptchaReady = true; }; 539 540 window.renderRecaptcha = function(elementId, siteKey) { 541 if (!window.recaptchaReady) return -1; 542 return grecaptcha.render(elementId, { 'sitekey': siteKey }); 543 }; 544 545 window.getRecaptchaResponse = function(widgetId) { 546 if (widgetId < 0) return ''; 547 return grecaptcha.getResponse(widgetId); 548 }; 549 550 window.resetRecaptcha = function(widgetId) { 551 if (widgetId >= 0) grecaptcha.reset(widgetId); 552 }; 553</script>
553 554</body> 555 556</html> 557<!-- ReSharper restore Html.PathError -->
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.