done
This commit is contained in:
		| @ -0,0 +1,6 @@ | ||||
| Silk icon set 1.3 by Mark James <mjames@gmail.com> | ||||
|  | ||||
| http://www.famfamfam.com/lab/icons/silk/ | ||||
|  | ||||
| License: [CC-BY-2.5](https://creativecommons.org/licenses/by/2.5/) | ||||
| or [CC-BY-3.0](https://creativecommons.org/licenses/by/3.0/) | ||||
							
								
								
									
										
											BIN
										
									
								
								lib/python3.11/site-packages/werkzeug/debug/shared/console.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								lib/python3.11/site-packages/werkzeug/debug/shared/console.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 507 B | 
							
								
								
									
										344
									
								
								lib/python3.11/site-packages/werkzeug/debug/shared/debugger.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										344
									
								
								lib/python3.11/site-packages/werkzeug/debug/shared/debugger.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,344 @@ | ||||
| docReady(() => { | ||||
|   if (!EVALEX_TRUSTED) { | ||||
|     initPinBox(); | ||||
|   } | ||||
|   // if we are in console mode, show the console. | ||||
|   if (CONSOLE_MODE && EVALEX) { | ||||
|     createInteractiveConsole(); | ||||
|   } | ||||
|  | ||||
|   const frames = document.querySelectorAll("div.traceback div.frame"); | ||||
|   if (EVALEX) { | ||||
|     addConsoleIconToFrames(frames); | ||||
|   } | ||||
|   addEventListenersToElements(document.querySelectorAll("div.detail"), "click", () => | ||||
|     document.querySelector("div.traceback").scrollIntoView(false) | ||||
|   ); | ||||
|   addToggleFrameTraceback(frames); | ||||
|   addToggleTraceTypesOnClick(document.querySelectorAll("h2.traceback")); | ||||
|   addInfoPrompt(document.querySelectorAll("span.nojavascript")); | ||||
|   wrapPlainTraceback(); | ||||
| }); | ||||
|  | ||||
| function addToggleFrameTraceback(frames) { | ||||
|   frames.forEach((frame) => { | ||||
|     frame.addEventListener("click", () => { | ||||
|       frame.getElementsByTagName("pre")[0].parentElement.classList.toggle("expanded"); | ||||
|     }); | ||||
|   }) | ||||
| } | ||||
|  | ||||
|  | ||||
| function wrapPlainTraceback() { | ||||
|   const plainTraceback = document.querySelector("div.plain textarea"); | ||||
|   const wrapper = document.createElement("pre"); | ||||
|   const textNode = document.createTextNode(plainTraceback.textContent); | ||||
|   wrapper.appendChild(textNode); | ||||
|   plainTraceback.replaceWith(wrapper); | ||||
| } | ||||
|  | ||||
| function makeDebugURL(args) { | ||||
|   const params = new URLSearchParams(args) | ||||
|   params.set("s", SECRET) | ||||
|   return `?__debugger__=yes&${params}` | ||||
| } | ||||
|  | ||||
| function initPinBox() { | ||||
|   document.querySelector(".pin-prompt form").addEventListener( | ||||
|     "submit", | ||||
|     function (event) { | ||||
|       event.preventDefault(); | ||||
|       const btn = this.btn; | ||||
|       btn.disabled = true; | ||||
|  | ||||
|       fetch( | ||||
|         makeDebugURL({cmd: "pinauth", pin: this.pin.value}) | ||||
|       ) | ||||
|         .then((res) => res.json()) | ||||
|         .then(({auth, exhausted}) => { | ||||
|           if (auth) { | ||||
|             EVALEX_TRUSTED = true; | ||||
|             fadeOut(document.getElementsByClassName("pin-prompt")[0]); | ||||
|           } else { | ||||
|             alert( | ||||
|               `Error: ${ | ||||
|                 exhausted | ||||
|                   ? "too many attempts.  Restart server to retry." | ||||
|                   : "incorrect pin" | ||||
|               }` | ||||
|             ); | ||||
|           } | ||||
|         }) | ||||
|         .catch((err) => { | ||||
|           alert("Error: Could not verify PIN.  Network error?"); | ||||
|           console.error(err); | ||||
|         }) | ||||
|         .finally(() => (btn.disabled = false)); | ||||
|     }, | ||||
|     false | ||||
|   ); | ||||
| } | ||||
|  | ||||
| function promptForPin() { | ||||
|   if (!EVALEX_TRUSTED) { | ||||
|     fetch(makeDebugURL({cmd: "printpin"})); | ||||
|     const pinPrompt = document.getElementsByClassName("pin-prompt")[0]; | ||||
|     fadeIn(pinPrompt); | ||||
|     document.querySelector('.pin-prompt input[name="pin"]').focus(); | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Helper function for shell initialization | ||||
|  */ | ||||
| function openShell(consoleNode, target, frameID) { | ||||
|   promptForPin(); | ||||
|   if (consoleNode) { | ||||
|     slideToggle(consoleNode); | ||||
|     return consoleNode; | ||||
|   } | ||||
|   let historyPos = 0; | ||||
|   const history = [""]; | ||||
|   const consoleElement = createConsole(); | ||||
|   const output = createConsoleOutput(); | ||||
|   const form = createConsoleInputForm(); | ||||
|   const command = createConsoleInput(); | ||||
|  | ||||
|   target.parentNode.appendChild(consoleElement); | ||||
|   consoleElement.append(output); | ||||
|   consoleElement.append(form); | ||||
|   form.append(command); | ||||
|   command.focus(); | ||||
|   slideToggle(consoleElement); | ||||
|  | ||||
|   form.addEventListener("submit", (e) => { | ||||
|     handleConsoleSubmit(e, command, frameID).then((consoleOutput) => { | ||||
|       output.append(consoleOutput); | ||||
|       command.focus(); | ||||
|       consoleElement.scrollTo(0, consoleElement.scrollHeight); | ||||
|       const old = history.pop(); | ||||
|       history.push(command.value); | ||||
|       if (typeof old !== "undefined") { | ||||
|         history.push(old); | ||||
|       } | ||||
|       historyPos = history.length - 1; | ||||
|       command.value = ""; | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   command.addEventListener("keydown", (e) => { | ||||
|     if (e.key === "l" && e.ctrlKey) { | ||||
|       output.innerText = "--- screen cleared ---"; | ||||
|     } else if (e.key === "ArrowUp" || e.key === "ArrowDown") { | ||||
|       // Handle up arrow and down arrow. | ||||
|       if (e.key === "ArrowUp" && historyPos > 0) { | ||||
|         e.preventDefault(); | ||||
|         historyPos--; | ||||
|       } else if (e.key === "ArrowDown" && historyPos < history.length - 1) { | ||||
|         historyPos++; | ||||
|       } | ||||
|       command.value = history[historyPos]; | ||||
|     } | ||||
|     return false; | ||||
|   }); | ||||
|  | ||||
|   return consoleElement; | ||||
| } | ||||
|  | ||||
| function addEventListenersToElements(elements, event, listener) { | ||||
|   elements.forEach((el) => el.addEventListener(event, listener)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Add extra info | ||||
|  */ | ||||
| function addInfoPrompt(elements) { | ||||
|   for (let i = 0; i < elements.length; i++) { | ||||
|     elements[i].innerHTML = | ||||
|       "<p>To switch between the interactive traceback and the plaintext " + | ||||
|       'one, you can click on the "Traceback" headline. From the text ' + | ||||
|       "traceback you can also create a paste of it. " + | ||||
|       (!EVALEX | ||||
|         ? "" | ||||
|         : "For code execution mouse-over the frame you want to debug and " + | ||||
|           "click on the console icon on the right side." + | ||||
|           "<p>You can execute arbitrary Python code in the stack frames and " + | ||||
|           "there are some extra helpers available for introspection:" + | ||||
|           "<ul><li><code>dump()</code> shows all variables in the frame" + | ||||
|           "<li><code>dump(obj)</code> dumps all that's known about the object</ul>"); | ||||
|     elements[i].classList.remove("nojavascript"); | ||||
|   } | ||||
| } | ||||
|  | ||||
| function addConsoleIconToFrames(frames) { | ||||
|   for (let i = 0; i < frames.length; i++) { | ||||
|     let consoleNode = null; | ||||
|     const target = frames[i]; | ||||
|     const frameID = frames[i].id.substring(6); | ||||
|  | ||||
|     for (let j = 0; j < target.getElementsByTagName("pre").length; j++) { | ||||
|       const img = createIconForConsole(); | ||||
|       img.addEventListener("click", (e) => { | ||||
|         e.stopPropagation(); | ||||
|         consoleNode = openShell(consoleNode, target, frameID); | ||||
|         return false; | ||||
|       }); | ||||
|       target.getElementsByTagName("pre")[j].append(img); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| function slideToggle(target) { | ||||
|   target.classList.toggle("active"); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * toggle traceback types on click. | ||||
|  */ | ||||
| function addToggleTraceTypesOnClick(elements) { | ||||
|   for (let i = 0; i < elements.length; i++) { | ||||
|     elements[i].addEventListener("click", () => { | ||||
|       document.querySelector("div.traceback").classList.toggle("hidden"); | ||||
|       document.querySelector("div.plain").classList.toggle("hidden"); | ||||
|     }); | ||||
|     elements[i].style.cursor = "pointer"; | ||||
|     document.querySelector("div.plain").classList.toggle("hidden"); | ||||
|   } | ||||
| } | ||||
|  | ||||
| function createConsole() { | ||||
|   const consoleNode = document.createElement("pre"); | ||||
|   consoleNode.classList.add("console"); | ||||
|   consoleNode.classList.add("active"); | ||||
|   return consoleNode; | ||||
| } | ||||
|  | ||||
| function createConsoleOutput() { | ||||
|   const output = document.createElement("div"); | ||||
|   output.classList.add("output"); | ||||
|   output.innerHTML = "[console ready]"; | ||||
|   return output; | ||||
| } | ||||
|  | ||||
| function createConsoleInputForm() { | ||||
|   const form = document.createElement("form"); | ||||
|   form.innerHTML = ">>> "; | ||||
|   return form; | ||||
| } | ||||
|  | ||||
| function createConsoleInput() { | ||||
|   const command = document.createElement("input"); | ||||
|   command.type = "text"; | ||||
|   command.setAttribute("autocomplete", "off"); | ||||
|   command.setAttribute("spellcheck", false); | ||||
|   command.setAttribute("autocapitalize", "off"); | ||||
|   command.setAttribute("autocorrect", "off"); | ||||
|   return command; | ||||
| } | ||||
|  | ||||
| function createIconForConsole() { | ||||
|   const img = document.createElement("img"); | ||||
|   img.setAttribute("src", makeDebugURL({cmd: "resource", f: "console.png"})); | ||||
|   img.setAttribute("title", "Open an interactive python shell in this frame"); | ||||
|   return img; | ||||
| } | ||||
|  | ||||
| function createExpansionButtonForConsole() { | ||||
|   const expansionButton = document.createElement("a"); | ||||
|   expansionButton.setAttribute("href", "#"); | ||||
|   expansionButton.setAttribute("class", "toggle"); | ||||
|   expansionButton.innerHTML = "  "; | ||||
|   return expansionButton; | ||||
| } | ||||
|  | ||||
| function createInteractiveConsole() { | ||||
|   const target = document.querySelector("div.console div.inner"); | ||||
|   while (target.firstChild) { | ||||
|     target.removeChild(target.firstChild); | ||||
|   } | ||||
|   openShell(null, target, 0); | ||||
| } | ||||
|  | ||||
| function handleConsoleSubmit(e, command, frameID) { | ||||
|   // Prevent page from refreshing. | ||||
|   e.preventDefault(); | ||||
|  | ||||
|   return new Promise((resolve) => { | ||||
|     fetch(makeDebugURL({cmd: command.value, frm: frameID})) | ||||
|       .then((res) => { | ||||
|         return res.text(); | ||||
|       }) | ||||
|       .then((data) => { | ||||
|         const tmp = document.createElement("div"); | ||||
|         tmp.innerHTML = data; | ||||
|         resolve(tmp); | ||||
|  | ||||
|         // Handle expandable span for long list outputs. | ||||
|         // Example to test: list(range(13)) | ||||
|         let wrapperAdded = false; | ||||
|         const wrapperSpan = document.createElement("span"); | ||||
|         const expansionButton = createExpansionButtonForConsole(); | ||||
|  | ||||
|         tmp.querySelectorAll("span.extended").forEach((spanToWrap) => { | ||||
|           const parentDiv = spanToWrap.parentNode; | ||||
|           if (!wrapperAdded) { | ||||
|             parentDiv.insertBefore(wrapperSpan, spanToWrap); | ||||
|             wrapperAdded = true; | ||||
|           } | ||||
|           parentDiv.removeChild(spanToWrap); | ||||
|           wrapperSpan.append(spanToWrap); | ||||
|           spanToWrap.hidden = true; | ||||
|  | ||||
|           expansionButton.addEventListener("click", (event) => { | ||||
|             event.preventDefault(); | ||||
|             spanToWrap.hidden = !spanToWrap.hidden; | ||||
|             expansionButton.classList.toggle("open"); | ||||
|             return false; | ||||
|           }); | ||||
|         }); | ||||
|  | ||||
|         // Add expansion button at end of wrapper. | ||||
|         if (wrapperAdded) { | ||||
|           wrapperSpan.append(expansionButton); | ||||
|         } | ||||
|       }) | ||||
|       .catch((err) => { | ||||
|         console.error(err); | ||||
|       }); | ||||
|     return false; | ||||
|   }); | ||||
| } | ||||
|  | ||||
| function fadeOut(element) { | ||||
|   element.style.opacity = 1; | ||||
|  | ||||
|   (function fade() { | ||||
|     element.style.opacity -= 0.1; | ||||
|     if (element.style.opacity < 0) { | ||||
|       element.style.display = "none"; | ||||
|     } else { | ||||
|       requestAnimationFrame(fade); | ||||
|     } | ||||
|   })(); | ||||
| } | ||||
|  | ||||
| function fadeIn(element, display) { | ||||
|   element.style.opacity = 0; | ||||
|   element.style.display = display || "block"; | ||||
|  | ||||
|   (function fade() { | ||||
|     let val = parseFloat(element.style.opacity) + 0.1; | ||||
|     if (val <= 1) { | ||||
|       element.style.opacity = val; | ||||
|       requestAnimationFrame(fade); | ||||
|     } | ||||
|   })(); | ||||
| } | ||||
|  | ||||
| function docReady(fn) { | ||||
|   if (document.readyState === "complete" || document.readyState === "interactive") { | ||||
|     setTimeout(fn, 1); | ||||
|   } else { | ||||
|     document.addEventListener("DOMContentLoaded", fn); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								lib/python3.11/site-packages/werkzeug/debug/shared/less.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								lib/python3.11/site-packages/werkzeug/debug/shared/less.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 191 B | 
							
								
								
									
										
											BIN
										
									
								
								lib/python3.11/site-packages/werkzeug/debug/shared/more.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								lib/python3.11/site-packages/werkzeug/debug/shared/more.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 200 B | 
							
								
								
									
										150
									
								
								lib/python3.11/site-packages/werkzeug/debug/shared/style.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										150
									
								
								lib/python3.11/site-packages/werkzeug/debug/shared/style.css
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,150 @@ | ||||
| body, input  { font-family: sans-serif; color: #000; text-align: center; | ||||
|                margin: 1em; padding: 0; font-size: 15px; } | ||||
| h1, h2, h3   { font-weight: normal; } | ||||
|  | ||||
| input        { background-color: #fff; margin: 0; text-align: left; | ||||
|                outline: none !important; } | ||||
| input[type="submit"] { padding: 3px 6px; } | ||||
| a            { color: #11557C; } | ||||
| a:hover      { color: #177199; } | ||||
| pre, code, | ||||
| textarea     { font-family: monospace; font-size: 14px; } | ||||
|  | ||||
| div.debugger { text-align: left; padding: 12px; margin: auto; | ||||
|                background-color: white; } | ||||
| h1           { font-size: 36px; margin: 0 0 0.3em 0; } | ||||
| div.detail { cursor: pointer; } | ||||
| div.detail p { margin: 0 0 8px 13px; font-size: 14px; white-space: pre-wrap; | ||||
|                font-family: monospace; } | ||||
| div.explanation { margin: 20px 13px; font-size: 15px; color: #555; } | ||||
| div.footer   { font-size: 13px; text-align: right; margin: 30px 0; | ||||
|                color: #86989B; } | ||||
|  | ||||
| h2           { font-size: 16px; margin: 1.3em 0 0.0 0; padding: 9px; | ||||
|                background-color: #11557C; color: white; } | ||||
| h2 em, h3 em { font-style: normal; color: #A5D6D9; font-weight: normal; } | ||||
|  | ||||
| div.traceback, div.plain { border: 1px solid #ddd; margin: 0 0 1em 0; padding: 10px; } | ||||
| div.plain p      { margin: 0; } | ||||
| div.plain textarea, | ||||
| div.plain pre { margin: 10px 0 0 0; padding: 4px; | ||||
|                 background-color: #E8EFF0; border: 1px solid #D3E7E9; } | ||||
| div.plain textarea { width: 99%; height: 300px; } | ||||
| div.traceback h3 { font-size: 1em; margin: 0 0 0.8em 0; } | ||||
| div.traceback ul { list-style: none; margin: 0; padding: 0 0 0 1em; } | ||||
| div.traceback h4 { font-size: 13px; font-weight: normal; margin: 0.7em 0 0.1em 0; } | ||||
| div.traceback pre { margin: 0; padding: 5px 0 3px 15px; | ||||
|                     background-color: #E8EFF0; border: 1px solid #D3E7E9; } | ||||
| div.traceback .library .current { background: white; color: #555; } | ||||
| div.traceback .expanded .current { background: #E8EFF0; color: black; } | ||||
| div.traceback pre:hover { background-color: #DDECEE; color: black; cursor: pointer; } | ||||
| div.traceback div.source.expanded pre + pre { border-top: none; } | ||||
|  | ||||
| div.traceback span.ws { display: none; } | ||||
| div.traceback pre.before, div.traceback pre.after { display: none; background: white; } | ||||
| div.traceback div.source.expanded pre.before, | ||||
| div.traceback div.source.expanded pre.after { | ||||
|     display: block; | ||||
| } | ||||
|  | ||||
| div.traceback div.source.expanded span.ws { | ||||
|     display: inline; | ||||
| } | ||||
|  | ||||
| div.traceback blockquote { margin: 1em 0 0 0; padding: 0; white-space: pre-line; } | ||||
| div.traceback img { float: right; padding: 2px; margin: -3px 2px 0 0; display: none; } | ||||
| div.traceback img:hover { background-color: #ddd; cursor: pointer; | ||||
|                           border-color: #BFDDE0; } | ||||
| div.traceback pre:hover img { display: block; } | ||||
| div.traceback cite.filename { font-style: normal; color: #3B666B; } | ||||
|  | ||||
| pre.console { border: 1px solid #ccc; background: white!important; | ||||
|               color: black; padding: 5px!important; | ||||
|               margin: 3px 0 0 0!important; cursor: default!important; | ||||
|               max-height: 400px; overflow: auto; } | ||||
| pre.console form { color: #555; } | ||||
| pre.console input { background-color: transparent; color: #555; | ||||
|                     width: 90%; font-family: monospace; font-size: 14px; | ||||
|                      border: none!important; } | ||||
|  | ||||
| span.string { color: #30799B; } | ||||
| span.number { color: #9C1A1C; } | ||||
| span.help   { color: #3A7734; } | ||||
| span.object { color: #485F6E; } | ||||
| span.extended { opacity: 0.5; } | ||||
| span.extended:hover { opacity: 1; } | ||||
| a.toggle { text-decoration: none; background-repeat: no-repeat; | ||||
|            background-position: center center; | ||||
|            background-image: url(?__debugger__=yes&cmd=resource&f=more.png); } | ||||
| a.toggle:hover { background-color: #444; } | ||||
| a.open { background-image: url(?__debugger__=yes&cmd=resource&f=less.png); } | ||||
|  | ||||
| pre.console div.traceback, | ||||
| pre.console div.box { margin: 5px 10px; white-space: normal; | ||||
|                       border: 1px solid #11557C; padding: 10px; | ||||
|                       font-family: sans-serif;  } | ||||
| pre.console div.box h3, | ||||
| pre.console div.traceback h3 { margin: -10px -10px 10px -10px; padding: 5px; | ||||
|                                background: #11557C; color: white; } | ||||
|  | ||||
| pre.console div.traceback pre:hover { cursor: default; background: #E8EFF0; } | ||||
| pre.console div.traceback pre.syntaxerror { background: inherit; border: none; | ||||
|                                             margin: 20px -10px -10px -10px; | ||||
|                                             padding: 10px; border-top: 1px solid #BFDDE0; | ||||
|                                             background: #E8EFF0; } | ||||
| pre.console div.noframe-traceback pre.syntaxerror { margin-top: -10px; border: none; } | ||||
|  | ||||
| pre.console div.box pre.repr { padding: 0; margin: 0; background-color: white; border: none; } | ||||
| pre.console div.box table { margin-top: 6px; } | ||||
| pre.console div.box pre { border: none; } | ||||
| pre.console div.box pre.help { background-color: white; } | ||||
| pre.console div.box pre.help:hover { cursor: default; } | ||||
| pre.console table tr { vertical-align: top; } | ||||
| div.console { border: 1px solid #ccc; padding: 4px; background-color: #fafafa; } | ||||
|  | ||||
| div.traceback pre, div.console pre { | ||||
|     white-space: pre-wrap;       /* css-3 should we be so lucky... */ | ||||
|     white-space: -moz-pre-wrap;  /* Mozilla, since 1999 */ | ||||
|     white-space: -pre-wrap;      /* Opera 4-6 ?? */ | ||||
|     white-space: -o-pre-wrap;    /* Opera 7 ?? */ | ||||
|     word-wrap: break-word;       /* Internet Explorer 5.5+ */ | ||||
|     _white-space: pre;           /* IE only hack to re-specify in | ||||
|                                  addition to word-wrap  */ | ||||
| } | ||||
|  | ||||
|  | ||||
| div.pin-prompt { | ||||
|     position: absolute; | ||||
|     display: none; | ||||
|     top: 0; | ||||
|     bottom: 0; | ||||
|     left: 0; | ||||
|     right: 0; | ||||
|     background: rgba(255, 255, 255, 0.8); | ||||
| } | ||||
|  | ||||
| div.pin-prompt .inner { | ||||
|     background: #eee; | ||||
|     padding: 10px 50px; | ||||
|     width: 350px; | ||||
|     margin: 10% auto 0 auto; | ||||
|     border: 1px solid #ccc; | ||||
|     border-radius: 2px; | ||||
| } | ||||
|  | ||||
| div.exc-divider { | ||||
|     margin: 0.7em 0 0 -1em; | ||||
|     padding: 0.5em; | ||||
|     background: #11557C; | ||||
|     color: #ddd; | ||||
|     border: 1px solid #ddd; | ||||
| } | ||||
|  | ||||
| .console.active { | ||||
|     max-height: 0!important; | ||||
|     display: none; | ||||
| } | ||||
|  | ||||
| .hidden { | ||||
|     display: none; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user