diff --git a/glue/crumble/draw/config.js b/glue/crumble/draw/config.js index 25c6c739b..ad1efed02 100644 --- a/glue/crumble/draw/config.js +++ b/glue/crumble/draw/config.js @@ -3,4 +3,10 @@ const rad = 10; const OFFSET_X = -pitch + Math.floor(pitch / 4) + 0.5; const OFFSET_Y = -pitch + Math.floor(pitch / 4) + 0.5; -export {pitch, rad, OFFSET_X, OFFSET_Y}; +const MIN_ZOOM = 0.25; +const MAX_ZOOM = 4; + +const MAX_QUBIT_COORDINATE = 100; +const LABEL_GAP = 20; + +export {pitch, rad, OFFSET_X, OFFSET_Y, MIN_ZOOM, MAX_ZOOM, MAX_QUBIT_COORDINATE, LABEL_GAP}; diff --git a/glue/crumble/draw/main_draw.js b/glue/crumble/draw/main_draw.js index ddfbe15a2..54885a28c 100644 --- a/glue/crumble/draw/main_draw.js +++ b/glue/crumble/draw/main_draw.js @@ -1,4 +1,4 @@ -import {pitch, rad, OFFSET_X, OFFSET_Y} from "./config.js" +import {pitch, rad, OFFSET_X, OFFSET_Y, MAX_QUBIT_COORDINATE, LABEL_GAP} from "./config.js" import {marker_placement} from "../gates/gateset_markers.js"; import {drawTimeline} from "./timeline_viewer.js"; import {PropagatedPauliFrames} from "../circuit/propagated_pauli_frames.js"; @@ -193,6 +193,18 @@ function defensiveDraw(ctx, body) { } } +function switchToScreenCoordinates(ctx) { + const devicePixelRatio = window.devicePixelRatio || 1; + ctx.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0); +} + +function switchToTransformationCoordinates(ctx, snap) { + const devicePixelRatio = window.devicePixelRatio || 1; + const zoom = snap.viewportZoom; + ctx.setTransform(zoom * devicePixelRatio, 0, 0, zoom * devicePixelRatio, + snap.viewportX * devicePixelRatio, snap.viewportY * devicePixelRatio); +} + /** * @param {!CanvasRenderingContext2D} ctx * @param {!StateSnapshot} snap @@ -258,8 +270,49 @@ function draw(ctx, snap) { } defensiveDraw(ctx, () => { - ctx.fillStyle = 'white'; + switchToScreenCoordinates(ctx); ctx.clearRect(0, 0, ctx.canvas.clientWidth, ctx.canvas.clientHeight); + + // Draw grid tick-mark labels. + defensiveDraw(ctx, () => { + ctx.fillStyle = 'black'; + + let tickMarkInterval = 0.5; + if (snap.viewportZoom < 0.85) tickMarkInterval = 1; + if (snap.viewportZoom < 0.3) tickMarkInterval = 2; + + ctx.save(); + ctx.beginPath(); + ctx.rect(LABEL_GAP, 0, ctx.canvas.clientWidth - LABEL_GAP, ctx.canvas.clientHeight); + ctx.clip(); + for (let qx = 0; qx < MAX_QUBIT_COORDINATE; qx += tickMarkInterval) { + let [x, _] = c2dCoordTransform(qx, 0); + const screenX = x * snap.viewportZoom + snap.viewportX; + let s = `${qx}`; + ctx.fillText(s, screenX - ctx.measureText(s).width / 2, 15); + } + ctx.restore(); + + ctx.save(); + ctx.beginPath(); + ctx.rect(0, LABEL_GAP, ctx.canvas.clientWidth, ctx.canvas.clientHeight - LABEL_GAP); + ctx.clip(); + for (let qy = 0; qy < MAX_QUBIT_COORDINATE; qy += tickMarkInterval) { + let [_, y] = c2dCoordTransform(0, qy); + const screenY = y * snap.viewportZoom + snap.viewportY; + let s = `${qy}`; + ctx.fillText(s, 18 - ctx.measureText(s).width, screenY); + } + ctx.restore(); + }); + + // Apply clipping on all content so it doesn't overlap on tick labels. + ctx.save(); + ctx.beginPath(); + ctx.rect(LABEL_GAP, LABEL_GAP, ctx.canvas.clientWidth, ctx.canvas.clientHeight - LABEL_GAP); + ctx.clip(); + switchToTransformationCoordinates(ctx, snap); + let [focusX, focusY] = xyToPos(snap.curMouseX, snap.curMouseY); // Draw the background polygons. @@ -282,26 +335,9 @@ function draw(ctx, snap) { // Draw the grid of qubits. defensiveDraw(ctx, () => { - for (let qx = 0; qx < 100; qx += 0.5) { - let [x, _] = c2dCoordTransform(qx, 0); - let s = `${qx}`; - ctx.fillStyle = 'black'; - ctx.fillText(s, x - ctx.measureText(s).width / 2, 15); - } - for (let qy = 0; qy < 100; qy += 0.5) { - let [_, y] = c2dCoordTransform(0, qy); - let s = `${qy}`; - ctx.fillStyle = 'black'; - ctx.fillText(s, 18 - ctx.measureText(s).width, y); - } - ctx.strokeStyle = 'black'; - for (let qx = 0; qx < 100; qx += 0.5) { - let [x, _] = c2dCoordTransform(qx, 0); - let s = `${qx}`; - ctx.fillStyle = 'black'; - ctx.fillText(s, x - ctx.measureText(s).width / 2, 15); - for (let qy = qx % 1; qy < 100; qy += 1) { + for (let qx = 0; qx < MAX_QUBIT_COORDINATE; qx += 0.5) { + for (let qy = qx % 1; qy < MAX_QUBIT_COORDINATE; qy += 1) { let [x, y] = c2dCoordTransform(qx, qy); ctx.fillStyle = 'white'; let isUnused = !usedQubitCoordSet.has(`${qx},${qy}`); @@ -394,7 +430,8 @@ function draw(ctx, snap) { }); }); - drawTimeline(ctx, snap, propagatedMarkerLayers, qubitDrawCoords, circuit.layers.length); + switchToScreenCoordinates(ctx); + const timelineDrawSummary = drawTimeline(ctx, snap, propagatedMarkerLayers, qubitDrawCoords, circuit.layers.length); // Draw scrubber. ctx.save(); @@ -496,6 +533,7 @@ function draw(ctx, snap) { ctx.restore(); } ctx.restore(); // restore devicePixelRatio scale + return timelineDrawSummary; } export {xyToPos, draw, setDefensiveDrawEnabled, OFFSET_X, OFFSET_Y} diff --git a/glue/crumble/draw/state_snapshot.js b/glue/crumble/draw/state_snapshot.js index 3c31cb3d1..bfd9f0a4d 100644 --- a/glue/crumble/draw/state_snapshot.js +++ b/glue/crumble/draw/state_snapshot.js @@ -17,8 +17,15 @@ class StateSnapshot { * @param {!number} mouseDownX * @param {!number} mouseDownY * @param {!Array} boxHighlightPreview + * @param {!number} viewportX + * @param {!number} viewportY + * @param {!number} viewportZoom + * @param {!number} timelineOffsetX + * @param {!number} timelineOffsetY + * @param {!number} curMouseScreenX + * @param {!number} curMouseScreenY */ - constructor(circuit, curLayer, focusedSet, timelineSet, curMouseX, curMouseY, mouseDownX, mouseDownY, boxHighlightPreview) { + constructor(circuit, curLayer, focusedSet, timelineSet, curMouseX, curMouseY, mouseDownX, mouseDownY, boxHighlightPreview, viewportX, viewportY, viewportZoom, timelineOffsetX, timelineOffsetY, curMouseScreenX, curMouseScreenY) { this.circuit = circuit.copy(); this.curLayer = curLayer; this.focusedSet = new Map(focusedSet.entries()); @@ -28,6 +35,13 @@ class StateSnapshot { this.mouseDownX = mouseDownX; this.mouseDownY = mouseDownY; this.boxHighlightPreview = [...boxHighlightPreview]; + this.viewportX = viewportX; + this.viewportY = viewportY; + this.viewportZoom = viewportZoom; + this.timelineOffsetX = timelineOffsetX; + this.timelineOffsetY = timelineOffsetY; + this.curMouseScreenX = curMouseScreenX; + this.curMouseScreenY = curMouseScreenY; while (this.circuit.layers.length <= this.curLayer) { this.circuit.layers.push(new Layer()); diff --git a/glue/crumble/draw/timeline_viewer.js b/glue/crumble/draw/timeline_viewer.js index 93640d91c..8ec4108e9 100644 --- a/glue/crumble/draw/timeline_viewer.js +++ b/glue/crumble/draw/timeline_viewer.js @@ -1,8 +1,23 @@ -import {OFFSET_Y, rad} from "./config.js"; +import {rad} from "./config.js"; import {stroke_connector_to} from "../gates/gate_draw_util.js" import {marker_placement} from '../gates/gateset_markers.js'; -let TIMELINE_PITCH = 32; +const TIMELINE_PITCH = 32; +const QUBIT_HIGHLIGHT_SIZE = 40; + +// Timeline panel changes size dynamically. These values are collected during draw and are used for restricting panning outside the relevant bounds. +class DrawSummary { + /** + * @param {!number} minOffsetX - Minimum allowed offsetX for timeline panel + * @param {!number} maxOffsetX - Maximum allowed offsetX for timeline panel + * @param {!number} maxOffsetY - Maximum Y offset for timeline panel + */ + constructor(minOffsetX, maxOffsetX, maxOffsetY) { + this.minOffsetX = minOffsetX; + this.maxOffsetX = maxOffsetX; + this.maxOffsetY = maxOffsetY; + } +} /** * @param {!CanvasRenderingContext2D} ctx @@ -110,6 +125,7 @@ function drawTimeline(ctx, snap, propagatedMarkerLayers, timesliceQubitCoordsFun return x1 - x2; }); + // Calculate base coordinates. let base_y2xy = new Map(); let prev_y = undefined; let cur_x = 0; @@ -132,11 +148,30 @@ function drawTimeline(ctx, snap, propagatedMarkerLayers, timesliceQubitCoordsFun base_y2xy.set(`${x},${y}`, [Math.round(cur_x) + 0.5, Math.round(cur_y) + 0.5]); } - let x_pitch = TIMELINE_PITCH + Math.ceil(rad*max_run*0.25); - let num_cols_half = Math.floor(ctx.canvas.clientWidth / 4 / x_pitch); + + const x_pitch = TIMELINE_PITCH + Math.ceil(rad*max_run*0.25); + const num_cols_half = Math.floor(ctx.canvas.clientWidth / 4 / x_pitch); let min_t_free = snap.curLayer - num_cols_half + 1; let min_t_clamp = Math.max(0, Math.min(min_t_free, numLayers - num_cols_half*2 + 1)); - let max_t = Math.min(min_t_clamp + num_cols_half*2 + 2, numLayers); + + + const maxOffsetY = Math.max(0, cur_y - ctx.canvas.clientHeight + TIMELINE_PITCH); + const offsetY = Math.max(-maxOffsetY, Math.min(0, snap.timelineOffsetY ?? 0)); + + const lastLayerOffset = (numLayers - 1 - snap.curLayer - (min_t_clamp - min_t_free)) * x_pitch; + const minOffsetX = -Math.max(0, lastLayerOffset - 0.5 * w + 2*x_pitch); + const maxOffsetX = Math.max(0, (min_t_clamp - 1) * x_pitch); + const offsetX = Math.max(minOffsetX, Math.min(maxOffsetX, snap.timelineOffsetX ?? 0)); + + // Apply x/y offset to base coordinates + if (offsetY !== 0 || offsetX !== 0) { + for (let [key, [x, y]] of base_y2xy) { + base_y2xy.set(key, [x + offsetX, y + offsetY]); + } + } + + const label_col_x = w * 1.5 + (min_t_free - 1 - snap.curLayer) * x_pitch; + let t2t = t => { let dt = t - snap.curLayer; dt -= min_t_clamp - min_t_free; @@ -159,17 +194,23 @@ function drawTimeline(ctx, snap, propagatedMarkerLayers, timesliceQubitCoordsFun try { ctx.clearRect(w, 0, w, ctx.canvas.clientHeight); + // Apply clipping to prevent content from overlapping on labels and outside timeline panel. + ctx.save(); + ctx.beginPath(); + ctx.rect(label_col_x, 0, ctx.canvas.clientWidth - label_col_x, ctx.canvas.clientHeight); + ctx.clip(); + // Draw colored indicators showing Pauli propagation. let hitCounts = new Map(); for (let [mi, p] of propagatedMarkerLayers.entries()) { - drawTimelineMarkers(ctx, snap, qubitTimeCoords, p, mi, min_t_clamp, max_t, x_pitch, hitCounts); + drawTimelineMarkers(ctx, snap, qubitTimeCoords, p, mi, 0, numLayers, x_pitch, hitCounts); } // Draw highlight of current layer. ctx.globalAlpha *= 0.5; ctx.fillStyle = 'black'; { - let x1 = t2t(snap.curLayer) + w * 1.5 - x_pitch / 2; + let x1 = t2t(snap.curLayer) + w * 1.5 - x_pitch / 2 + offsetX; ctx.fillRect(x1, 0, x_pitch, ctx.canvas.clientHeight); } ctx.globalAlpha *= 2; @@ -179,26 +220,16 @@ function drawTimeline(ctx, snap, propagatedMarkerLayers, timesliceQubitCoordsFun // Draw wire lines. for (let q of qubits) { - let [x0, y0] = qubitTimeCoords(q, min_t_clamp - 1); - let [x1, y1] = qubitTimeCoords(q, max_t + 1); + let [x0, y0] = qubitTimeCoords(q, -1); + let [x1, y1] = qubitTimeCoords(q, numLayers); ctx.beginPath(); ctx.moveTo(x0, y0); ctx.lineTo(x1, y1); ctx.stroke(); } - // Draw wire labels. - ctx.textAlign = 'right'; - ctx.textBaseline = 'middle'; - for (let q of qubits) { - let [x, y] = qubitTimeCoords(q, min_t_clamp - 1); - let qx = snap.circuit.qubitCoordData[q * 2]; - let qy = snap.circuit.qubitCoordData[q * 2 + 1]; - ctx.fillText(`${qx},${qy}:`, x, y); - } - // Draw layers of gates. - for (let time = min_t_clamp; time <= max_t; time++) { + for (let time = 0; time < numLayers; time++) { let qubitsCoordsFuncForLayer = q => qubitTimeCoords(q, time); let layer = snap.circuit.layers[time]; if (layer === undefined) { @@ -209,24 +240,49 @@ function drawTimeline(ctx, snap, propagatedMarkerLayers, timesliceQubitCoordsFun } } + ctx.restore(); // Stop clipping since labels and links to timeslice should be outside clipping area. + + // Draw wire labels. + ctx.strokeStyle = 'black'; + ctx.fillStyle = 'black'; + ctx.textAlign = 'right'; + ctx.textBaseline = 'middle'; + for (let q of qubits) { + let [x, y] = qubitTimeCoords(q, min_t_clamp - 1); + x -= offsetX; // Labels are frozen on horizontal axis. + let qx = snap.circuit.qubitCoordData[q * 2]; + let qy = snap.circuit.qubitCoordData[q * 2 + 1]; + ctx.fillText(`${qx},${qy}:`, x, y); + } + // Draw links to timeslice viewer. ctx.globalAlpha = 0.5; + const mouseScreenX = snap.curMouseScreenX; + const mouseScreenY = snap.curMouseScreenY; + const zoom = snap.viewportZoom; + for (let q of qubits) { let [x0, y0] = qubitTimeCoords(q, min_t_clamp - 1); - let [x1, y1] = timesliceQubitCoordsFunc(q); - if (snap.curMouseX > ctx.canvas.clientWidth / 2 && snap.curMouseY >= y0 + OFFSET_Y - TIMELINE_PITCH * 0.55 && snap.curMouseY <= y0 + TIMELINE_PITCH * 0.55 + OFFSET_Y) { + x0 -= offsetX; // Lines start at frozen position to match labels. + const [wx1, wy1] = timesliceQubitCoordsFunc(q); + // Convert from world to screen coordinates for qubit highlight. + const x1 = wx1 * zoom + snap.viewportX; + const y1 = wy1 * zoom + snap.viewportY; + if (mouseScreenX > ctx.canvas.clientWidth / 2 && mouseScreenY >= y0 - TIMELINE_PITCH * 0.55 && mouseScreenY <= y0 + TIMELINE_PITCH * 0.55) { ctx.beginPath(); ctx.moveTo(x0, y0); ctx.lineTo(x1, y1); ctx.stroke(); ctx.fillStyle = 'black'; - ctx.fillRect(x1 - 20, y1 - 20, 40, 40); + ctx.fillRect(x1 - (QUBIT_HIGHLIGHT_SIZE/2) * zoom, y1 - (QUBIT_HIGHLIGHT_SIZE/2) * zoom, QUBIT_HIGHLIGHT_SIZE * zoom, QUBIT_HIGHLIGHT_SIZE * zoom); ctx.fillRect(ctx.canvas.clientWidth / 2, y0 - TIMELINE_PITCH / 3, ctx.canvas.clientWidth / 2, TIMELINE_PITCH * 2 / 3); } } } finally { ctx.restore(); } + + return new DrawSummary(minOffsetX, maxOffsetX, maxOffsetY); } -export {drawTimeline} \ No newline at end of file +export {drawTimeline, DrawSummary} diff --git a/glue/crumble/editor/editor_state.js b/glue/crumble/editor/editor_state.js index 609f5a6c7..fa0076a85 100644 --- a/glue/crumble/editor/editor_state.js +++ b/glue/crumble/editor/editor_state.js @@ -31,6 +31,28 @@ function rotated45Transform(steps) { return (x, y) => [vx[0]*x + vy[0]*y, vx[1]*x + vy[1]*y]; } +const Panels = Object.freeze({ + TIMESLICE: 'timeslice', // qubit grid (left panel) + TIMELINE: 'timeline', // circuit timeline (right panel) +}); + +class PanDragAnchor { + /** + * @param {!number} screenX - X coordinate of drag start + * @param {!number} screenY - Y coordinate of drag start + * @param {!number} offsetX - X offset from drag start + * @param {!number} offsetY - Y offset from drag start + * @param {!string} activeDragPanel - marks which panel is currently used in drag: PanSide.TIMESLICE or PanSide.TIMELINE + */ + constructor(screenX, screenY, offsetX, offsetY, activeDragPanel) { + this.screenX = screenX; + this.screenY = screenY; + this.offsetX = offsetX; + this.offsetY = offsetY; + this.activeDragPanel = activeDragPanel; + } +} + class EditorState { /** * @param {!HTMLCanvasElement} canvas @@ -47,6 +69,15 @@ class EditorState { this.mouseDownX = /** @type {undefined|!number} */ undefined; this.mouseDownY = /** @type {undefined|!number} */ undefined; this.obs_val_draw_state = /** @type {!ObservableValue} */ new ObservableValue(this.toSnapshot(undefined)); + this.curMouseScreenX = /** @type {undefined|!number} */ undefined; + this.curMouseScreenY = /** @type {undefined|!number} */ undefined; + this.viewportX = 0; + this.viewportY = 0; + this.viewportZoom = 1; + this.timelineOffsetX = 0; + this.timelineOffsetY = 0; + this.isPanDragging = false; + this.panDragAnchor = /** @type {undefined|!PanDragAnchor} */ undefined; } flipTwoQubitGateOrderAtFocus(preview) { @@ -201,17 +232,7 @@ class EditorState { if (previewCircuit === undefined) { previewCircuit = this.copyOfCurCircuit(); } - return new StateSnapshot( - previewCircuit, - this.curLayer, - this.focusedSet, - this.timelineSet, - this.curMouseX, - this.curMouseY, - this.mouseDownX, - this.mouseDownY, - this.currentPositionsBoxesByMouseDrag(this.chorder.curModifiers.has("alt")), - ); + return new StateSnapshot(previewCircuit, this.curLayer, this.focusedSet, this.timelineSet, this.curMouseX, this.curMouseY, this.mouseDownX, this.mouseDownY, this.currentPositionsBoxesByMouseDrag(this.chorder.curModifiers.has("alt")), this.viewportX, this.viewportY, this.viewportZoom, this.timelineOffsetX, this.timelineOffsetY, this.curMouseScreenX, this.curMouseScreenY); } force_redraw() { @@ -375,6 +396,7 @@ class EditorState { */ changeCurLayerTo(newLayer) { this.curLayer = Math.max(newLayer, 0); + this.timelineOffsetX = 0; this.force_redraw(); } @@ -841,4 +863,4 @@ class EditorState { } } -export {EditorState, StateSnapshot} +export {EditorState, StateSnapshot, PanDragAnchor, Panels} diff --git a/glue/crumble/main.js b/glue/crumble/main.js index 6a14d4523..83f552737 100644 --- a/glue/crumble/main.js +++ b/glue/crumble/main.js @@ -1,14 +1,13 @@ import {Circuit} from "./circuit/circuit.js" import {minXY} from "./circuit/layer.js" -import {pitch} from "./draw/config.js" +import {MAX_QUBIT_COORDINATE, MAX_ZOOM, MIN_ZOOM, pitch} from "./draw/config.js" import {GATE_MAP} from "./gates/gateset.js" -import {EditorState} from "./editor/editor_state.js"; +import {EditorState, PanDragAnchor, Panels} from "./editor/editor_state.js"; import {initUrlCircuitSync} from "./editor/sync_url_to_state.js"; import {draw} from "./draw/main_draw.js"; import {drawToolbox} from "./keyboard/toolbox.js"; import {Operation} from "./circuit/operation.js"; import {make_mpp_gate} from './gates/gateset_mpp.js'; -import {PropagatedPauliFrames} from './circuit/propagated_pauli_frames.js'; const OFFSET_X = -pitch + Math.floor(pitch / 4) + 0.5; const OFFSET_Y = -pitch + Math.floor(pitch / 4) + 0.5; @@ -40,6 +39,14 @@ txtStimCircuit.addEventListener('keydown', ev => ev.stopPropagation()); let editorState = /** @type {!EditorState} */ new EditorState(document.getElementById('cvn')); +function toWorldMouseX(screenX) { + return (screenX - editorState.viewportX) / editorState.viewportZoom + OFFSET_X; +} + +function toWorldMouseY(screenY) { + return (screenY - editorState.viewportY) / editorState.viewportZoom + OFFSET_Y; +} + btnExport.addEventListener('click', _ev => { exportCurrentState(); }); @@ -160,8 +167,28 @@ function exportCurrentState() { } editorState.canvas.addEventListener('mousemove', ev => { - editorState.curMouseX = ev.offsetX + OFFSET_X; - editorState.curMouseY = ev.offsetY + OFFSET_Y; + editorState.curMouseScreenX = ev.offsetX; + editorState.curMouseScreenY = ev.offsetY; + + // Handle middle click + drag panning. + if (editorState.isPanDragging) { + const anchor = editorState.panDragAnchor; + const newOffsetX = anchor.offsetX + (ev.offsetX - anchor.screenX); + const newOffsetY = anchor.offsetY + (ev.offsetY - anchor.screenY); + if (anchor.activeDragPanel === Panels.TIMESLICE) { + editorState.viewportX = newOffsetX; + editorState.viewportY = newOffsetY; + } else { + editorState.timelineOffsetX = newOffsetX; + editorState.timelineOffsetY = newOffsetY; + } + restrictTimeSliceAndTimelineViews(); + editorState.force_redraw(); + return; + } + + editorState.curMouseX = toWorldMouseX(ev.offsetX); + editorState.curMouseY = toWorldMouseY(ev.offsetY); // Scrubber. let w = editorState.canvas.scrollWidth / 2; @@ -175,13 +202,31 @@ editorState.canvas.addEventListener('mousemove', ev => { let isInScrubber = false; editorState.canvas.addEventListener('mousedown', ev => { - editorState.curMouseX = ev.offsetX + OFFSET_X; - editorState.curMouseY = ev.offsetY + OFFSET_Y; - editorState.mouseDownX = ev.offsetX + OFFSET_X; - editorState.mouseDownY = ev.offsetY + OFFSET_Y; + const w = editorState.canvas.scrollWidth / 2; + + // Middle-click initiates pan drag. + if (ev.button === 1) { + ev.preventDefault(); + editorState.isPanDragging = true; + const targetPanel = ev.offsetX > w ? Panels.TIMELINE : Panels.TIMESLICE; + editorState.panDragAnchor = new PanDragAnchor( + ev.offsetX, + ev.offsetY, + targetPanel === Panels.TIMESLICE ? editorState.viewportX : editorState.timelineOffsetX, + targetPanel === Panels.TIMESLICE ? editorState.viewportY : editorState.timelineOffsetY, + targetPanel, + ); + return; + } + + editorState.curMouseScreenX = ev.offsetX; + editorState.curMouseScreenY = ev.offsetY; + editorState.curMouseX = toWorldMouseX(ev.offsetX); + editorState.curMouseY = toWorldMouseY(ev.offsetY); + editorState.mouseDownX = toWorldMouseX(ev.offsetX); + editorState.mouseDownY = toWorldMouseY(ev.offsetY); // Scrubber. - let w = editorState.canvas.scrollWidth / 2; isInScrubber = ev.offsetY < 20 && ev.offsetX > w && ev.buttons === 1; if (isInScrubber) { editorState.changeCurLayerTo(Math.floor((ev.offsetX - w) / 8)); @@ -192,17 +237,87 @@ editorState.canvas.addEventListener('mousedown', ev => { }); editorState.canvas.addEventListener('mouseup', ev => { + if (ev.button === 1) { + editorState.isPanDragging = false; + editorState.panDragAnchor = undefined; + return; + } + let highlightedArea = editorState.currentPositionsBoxesByMouseDrag(ev.altKey); editorState.mouseDownX = undefined; editorState.mouseDownY = undefined; - editorState.curMouseX = ev.offsetX + OFFSET_X; - editorState.curMouseY = ev.offsetY + OFFSET_Y; + editorState.curMouseScreenX = ev.offsetX; + editorState.curMouseScreenY = ev.offsetY; + editorState.curMouseX = toWorldMouseX(ev.offsetX); + editorState.curMouseY = toWorldMouseY(ev.offsetY); editorState.changeFocus(highlightedArea, ev.shiftKey, ev.ctrlKey); if (ev.buttons === 1) { isInScrubber = false; } }); +// Make sure qubit grid and timeline don't deviate from the area of interest. +function restrictTimeSliceAndTimelineViews() { + const width = editorState.canvas.scrollWidth / 2; + const height = editorState.canvas.scrollHeight; + const zoom = editorState.viewportZoom; + const gridMin = -1 * pitch - OFFSET_X; + const gridMax = MAX_QUBIT_COORDINATE * pitch - OFFSET_X; + + editorState.viewportX = Math.max( + width - gridMax * zoom, + Math.min(-gridMin * zoom, editorState.viewportX) + ); + editorState.viewportY = Math.max( + height - gridMax * zoom, + Math.min(-gridMin * zoom, editorState.viewportY) + ); + + editorState.timelineOffsetY = Math.min(0, editorState.timelineOffsetY); +} + +function handleTimelineVerticalScroll(ev) { + editorState.timelineOffsetX -= ev.deltaX; + editorState.timelineOffsetY -= ev.deltaY; + restrictTimeSliceAndTimelineViews(); + editorState.force_redraw(); + return; +} + +function handleQubitGridZoomPan(ev) { + if (ev.ctrlKey || ev.metaKey) { + // Handle zoom. + const zoomMultiplier = ev.deltaY < 0 ? 1.05 : (1 / 1.05); + const newZoom = Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, editorState.viewportZoom * zoomMultiplier)); + const ratio = newZoom / editorState.viewportZoom; + editorState.viewportZoom = newZoom; + + // Center zoom around mouse. + editorState.viewportX = ev.offsetX - (ev.offsetX - editorState.viewportX) * ratio; + editorState.viewportY = ev.offsetY - (ev.offsetY - editorState.viewportY) * ratio; + } else { + // Handle pan. + editorState.viewportX -= ev.deltaX; + editorState.viewportY -= ev.deltaY; + } + + editorState.curMouseX = toWorldMouseX(ev.offsetX); + editorState.curMouseY = toWorldMouseY(ev.offsetY); + restrictTimeSliceAndTimelineViews(); + editorState.force_redraw(); +} + +editorState.canvas.addEventListener('wheel', ev => { + ev.preventDefault(); + const width = editorState.canvas.scrollWidth / 2; + + if (ev.offsetX > width) { + handleTimelineVerticalScroll(ev); + } else { + handleQubitGridZoomPan(ev); + } +}, { passive: false }); + /** * @return {!Map} */ @@ -520,7 +635,12 @@ editorState.rev.changes().subscribe(() => { drawToolbox(editorState.chorder.toEvent(false)); }); initUrlCircuitSync(editorState.rev); -editorState.obs_val_draw_state.observable().subscribe(ds => requestAnimationFrame(() => draw(editorState.canvas.getContext('2d'), ds))); +editorState.obs_val_draw_state.observable().subscribe(ds => requestAnimationFrame(() => { + const drawSummary = draw(editorState.canvas.getContext('2d'), ds); + // Prevent timeline over-panning. + editorState.timelineOffsetX = Math.max(drawSummary.minOffsetX, Math.min(editorState.timelineOffsetX, drawSummary.maxOffsetX)); + editorState.timelineOffsetY = Math.max(editorState.timelineOffsetY, -drawSummary.maxOffsetY); +})); window.addEventListener('focus', () => { editorState.chorder.handleFocusChanged(); }); diff --git a/src/stim/diagram/crumble_data.cc b/src/stim/diagram/crumble_data.cc index 0d11b3075..c5428ca79 100644 --- a/src/stim/diagram/crumble_data.cc +++ b/src/stim/diagram/crumble_data.cc @@ -710,51 +710,51 @@ std::string stim_draw_internal::make_crumble_html() { )CRUMBLE_PART"); result.append(R"CRUMBLE_PART(class l{constructor(t,r,e,i,o,a,n,s,h=void 0){this.name=t,this.t=r,this.i=i,this.o=e,this.h=o,this.l=a,this.v=n,this.u=s,this.X=h}M(t){return new l(this.name,this.t,this.o,this.i,this.h,this.l,this.v,this.u,t)}}function p(r){var e=[];for(let t=0;tr.get(t)))for(let t=0;t{var i,o,a,[r,n]=r(t.R[0]);void 0!==r&&void 0!=)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(=n&&({dx:t,dy:i,_:o,A:a}=pt(t.Y[0]),e.fillStyle=s,o===a?e.fillRect(r-t-2,n-i-2,o+4,a+4):(t=r+(t<0?1:-1)*Rt,i=n+(i<0?1:-1)*Rt,o=t+(o>Rt?1:0)*Rt*2,a=i+(a>Rt?1:0)*Rt*2,e.beginPath(),e.moveTo(r,n),e.lineTo(t,i),e.lineTo(o,a),e.lineTo(r,n),e.fill()))}}function*A(){yield new l("ISWAP",2,!0,!1,new Map([["IX","YZ"],["IZ","ZI"],["XI","ZY"],["ZI","IZ"]]),(t,r)=>t.k(r),(t,r)=>t.k(r),(t,r,e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),h(e,i,o),h(e,r,t)}),yield new l("ISWAP_DAG",2,!0,!1,new Map([["IX","YZ"],["IZ","ZI"],["XI","ZY"],["ZI","IZ"]]),(t,r)=>t.k(r),(t,r)=>t.k(r),(t,r,e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),h(e,i,o),h(e,r,t)}),yield new l("SWAP",2,!0,!1,new Map([["IX","XI"],["IZ","ZI"],["XI","IX"],["ZI","IZ"]]),(t,r)=>t.g(r),(t,r)=>t.g(r),(t,r,e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),b(e,i,o),b(e,r,t)}),yield new l("CXSWAP",2,!0,!1,new Map([["IX","XI"],["IZ","ZZ"],["XI","XX"],["ZI","IZ"]]),(t,r)=>t.S(r),(t,r)=>t.C(r),(t,r,e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),I(e,i,o))CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(,i=e,o=t,void 0!==(e=r)&&void 0!==o&&(i.fillStyle="white",i.strokeStyle="black",i.beginPath(),i.arc(e,o,Rt,0,2*Math.PI),i.fill(),i.stroke(),t=.4*Rt,i.strokeStyle="black",i.lineWidth=3,i.beginPath(),i.moveTo(e-t,o-t),i.lineTo(e+t,o+t),i.stroke(),i.moveTo(e-t,o+t),i.lineTo(e+t,o-t),i.stroke(),i.lineWidth=1)}),yield new l("CZSWAP",2,!0,!1,new Map([["IX","XZ"],["IZ","ZI"],["XI","ZX"],["ZI","IZ"]]),(t,r)=>t.P(r),(t,r)=>t.P(r),(t,r,e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),I(e,i,o),I(e,r,t)})}function*E(){yield new l("CX",2,!0,!1,new Map([["IX","IX"],["IZ","ZZ"],["XI","XX"],["ZI","ZI"]]),(t,r)=>t.O(r),(t,r)=>t.O(r),(t,r,e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),s(e,i,o),a(e,r,t)}),yield new l("CY",2,!0,!1,new Map([["IX","ZX"],["IZ","ZZ"],["XI","XY"],["ZI","ZI"]]),(t,r)=>t.T(r),(t,r)=>t.T(r),(t,r,e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),s(e,i,o),n(e,r,t)}),yield new l("XCX",2,!0,!1,new Map([["IX","IX"],["IZ","XZ"],["XI","XI"],["ZI","ZX"]]),(t,r)=>t.N(r),(t,r)=>t.N(r),(t,r,e)=>{var[i)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),a(e,i,o),a(e,r,t)}),yield new l("XCY",2,!0,!1,new Map([["IX","XX"],["IZ","XZ"],["XI","XI"],["ZI","ZY"]]),(t,r)=>t.D(r),(t,r)=>t.D(r),(t,r,e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),a(e,i,o),n(e,r,t)}),yield new l("YCY",2,!0,!1,new Map([["IX","YX"],["IZ","YZ"],["XI","XY"],["ZI","ZY"]]),(t,r)=>t.L(r),(t,r)=>t.L(r),(t,r,e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),n(e,i,o),n(e,r,t)}),yield new l("CZ",2,!0,!1,new Map([["IX","ZX"],["IZ","IZ"],["XI","XZ"],["ZI","ZI"]]),(t,r)=>t.F(r),(t,r)=>t.F(r),(t,r,e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),s(e,i,o),s(e,r,t)}),yield new l("MR",1,!0,!1,new Map([["X","ERR:I"],["Y","ERR:I"],["Z","I"]]),(t,r)=>t.U("Z",r),(t,r)=>t.U("Z",r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="gray",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("MR",r,t)}),yield new l("MRY",1,!0,!1,new Map([["X","ERR:I"],["Y",")CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(I"],["Z","ERR:I"]]),(t,r)=>t.U("Y",r),(t,r)=>t.U("Y",r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="gray",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("MRY",r,t)}),yield new l("MRX",1,!0,!1,new Map([["X","I"],["Y","ERR:I"],["Z","ERR:I"]]),(t,r)=>t.U("X",r),(t,r)=>t.U("X",r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="gray",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("MRX",r,t)}),yield new l("H",1,!0,!1,new Map([["X","Z"],["Z","X"]]),(t,r)=>t.G(r),(t,r)=>t.G(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="yellow",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("H",r,t)}),yield new l("H_NXZ",1,!0,!1,new Map([["X","Z"],["Z","X"]]),(t,r)=>t.G(r),(t,r)=>t.G(r),(t,r,e)=>{va)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(r[r,t]=r(t.R[0]);e.fillStyle="yellow",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("H",r,t-Rt/3),e.fillText("NXZ",r,t+Rt/3)}),yield new l("H_XY",1,!0,!1,new Map([["X","Y"],["Z","Z"]]),(t,r)=>t.H(r),(t,r)=>t.H(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="yellow",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("H",r,t-Rt/3),e.fillText("XY",r,t+Rt/3)}),yield new l("H_NXY",1,!0,!1,new Map([["X","Y"],["Z","Z"]]),(t,r)=>t.H(r),(t,r)=>t.H(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="yellow",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("H",r,t-Rt/3),e.fillText("NXY",r,t+Rt/3)}),yield new l("H_YZ",1,!0,!1,new Map([["X","X"],["Z","Y"]]),(t,r)=>t.K(r),(t,r)=>t.K(r),(t,r,e))CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(=>{var[r,t]=r(t.R[0]);e.fillStyle="yellow",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("H",r,t-Rt/3),e.fillText("YZ",r,t+Rt/3)}),yield new l("H_NYZ",1,!0,!1,new Map([["X","X"],["Z","Y"]]),(t,r)=>t.K(r),(t,r)=>t.K(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="yellow",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("H",r,t-Rt/3),e.fillText("NYZ",r,t+Rt/3)}),yield new l("POLYGON",void 0,!1,!0,void 0,()=>{},()=>{},(t,r,e)=>{var i,o=[];for(i of t.R){var[a,n]=r(i);o.push([a-=.5,n-=.5])}C(e,o),e.globalAlpha*=t.Y[3],e.fillStyle=`rgb(${255*t.Y[0]},${255*t.Y[1]},${255*t.Y[2]})`,e.fill()}),yield new l("DETECTOR",void 0,!1,!0,void 0,()=>{},()=>{},(t,r,e)=>{}),yield new l("OBSERVABLE_INCLUDE",void 0,!1,!0,void 0,()=>{},()=>{},(t,r,e)=>{}),yield new l("MARKX",1,!0,!0,void 0,()=>{},()=>{},r("r)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(ed")),yield new l("MARKY",1,!0,!0,void 0,()=>{},()=>{},r("green")),yield new l("MARKZ",1,!0,!0,void 0,()=>{},()=>{},r("blue")),yield new l("MARK",1,!1,!0,void 0,()=>{},()=>{},(t,r,e)=>{var[r,t]=r(t.R[0]);void 0!==r&&void 0!==t&&(e.fillStyle="magenta",e.fillRect(r-Rt,t-Rt,Rt,Rt))}),yield new l("MXX",2,!0,!1,new Map([["II","II"],["IX","IX"],["IY","ERR:IY"],["IZ","ERR:IZ"],["XI","XI"],["XX","XX"],["XY","ERR:XY"],["XZ","ERR:XZ"],["YI","ERR:YI"],["YX","ERR:YX"],["YY","YY"],["YZ","YZ"],["ZI","ERR:ZI"],["ZX","ERR:ZX"],["ZY","ZY"],["ZZ","ZZ"]]),(t,r)=>t.$("XX",r),(t,r)=>t.$("XX",r),(t,r,e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),e.fillStyle="gray",e.fillRect(i-Rt,o-Rt,2*Rt,2*Rt),e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(i-Rt,o-Rt,2*Rt,2*Rt),e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("MXX",i,o),e.fillText("MXX",r,t)}),yield new l("MYY",2,!0,!1,new Map([["II","II"],["IX","ERR:IX"],["IY","IY"],["IZ","ERR:IZ"],["XI","ERR)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(:XI"],["XX","XX"],["XY","ERR:XY"],["XZ","XZ"],["YI","YI"],["YX","ERR:YX"],["YY","YY"],["YZ","ERR:YZ"],["ZI","ERR:ZI"],["ZX","ZX"],["ZY","ERR:ZY"],["ZZ","ZZ"]]),(t,r)=>t.$("YY",r),(t,r)=>t.$("YY",r),(t,r,e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),e.fillStyle="gray",e.fillRect(i-Rt,o-Rt,2*Rt,2*Rt),e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(i-Rt,o-Rt,2*Rt,2*Rt),e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("MYY",i,o),e.fillText("MYY",r,t)}),yield new l("MZZ",2,!0,!1,new Map([["II","II"],["IX","ERR:IX"],["IY","ERR:IY"],["IZ","IZ"],["XI","ERR:XI"],["XX","XX"],["XY","XY"],["XZ","ERR:XZ"],["YI","ERR:YI"],["YX","YX"],["YY","YY"],["YZ","ERR:YZ"],["ZI","ZI"],["ZX","ERR:ZX"],["ZY","ERR:ZY"],["ZZ","ZZ"]]),(t,r)=>t.$("ZZ",r),(t,r)=>t.$("ZZ",r),(t,r,e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),e.fillStyle="gray",e.fillRect(i-Rt,o-Rt,2*Rt,2*Rt),e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(i-Rt,o-Rt)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(,2*Rt,2*Rt),e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("MZZ",i,o),e.fillText("MZZ",r,t)}),yield new l("ERR",1,!0,!1,new Map([["X","X"],["Z","Z"]]),()=>{},()=>{},(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="red",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("ERR",r,t)}),yield new l("I",1,!0,!1,new Map([["X","X"],["Z","Z"]]),()=>{},()=>{},(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="white",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("I",r,t)}),yield new l("X",1,!0,!1,new Map([["X","X"],["Z","Z"]]),()=>{},()=>{},(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="white",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillTe)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(xt("X",r,t)}),yield new l("Y",1,!0,!1,new Map([["X","X"],["Z","Z"]]),()=>{},()=>{},(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="white",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("Y",r,t)}),yield new l("Z",1,!0,!1,new Map([["X","X"],["Z","Z"]]),()=>{},()=>{},(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="white",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("Z",r,t)}),yield new l("S",1,!0,!1,new Map([["X","Y"],["Z","Z"]]),(t,r)=>t.H(r),(t,r)=>t.H(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="yellow",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("S",r,t)}),yield new l("S_DAG",1,!0,!1,new Map([["X","Y"],["Z","Z"]]),(t,r)=>t.H(r),(t,r)=>t.H(r),(t,r,e)=>{var[r,t]=r(t.R[0]);)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(e.fillStyle="yellow",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("S†",r,t)}),yield new l("SQRT_X",1,!0,!1,new Map([["X","X"],["Z","Y"]]),(t,r)=>t.K(r),(t,r)=>t.K(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="yellow",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("√X",r,t)}),yield new l("SQRT_X_DAG",1,!0,!1,new Map([["X","X"],["Z","Y"]]),(t,r)=>t.K(r),(t,r)=>t.K(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="yellow",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("√X†",r,t)}),yield new l("SQRT_Y",1,!0,!1,new Map([["X","Z"],["Z","X"]]),(t,r)=>t.G(r),(t,r)=>t.G(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="yellow",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("√Y",r,t)}),yield new l("SQRT_Y_DAG",1,!0,!1,new Map([["X","Z"],["Z","X"]]),(t,r)=>t.G(r),(t,r)=>t.G(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="yellow",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("√Y†",r,t)}),yield new l("R",1,!0,!1,new Map([["X","ERR:I"],["Y","ERR:I"],["Z","ERR:I"]]),(t,r)=>t.B(r),(t,r)=>t.U("Z",r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="gray",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("R",r,t)}),yield new l("RX",1,!0,!1,new Map([["X","ERR:I"],["Y","ERR:I"],["Z","ERR:I"]]),(t,r)=>t.B(r),(t,r)=>t.U("X",r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="gray",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillS)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(tyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("RX",r,t)}),yield new l("RY",1,!0,!1,new Map([["X","ERR:I"],["Y","ERR:I"],["Z","ERR:I"]]),(t,r)=>t.B(r),(t,r)=>t.U("Y",r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="gray",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("RY",r,t)}),yield new l("M",1,!0,!1,new Map([["X","ERR:X"],["Y","ERR:Y"],["Z","Z"]]),(t,r)=>t.$("Z",r),(t,r)=>t.$("Z",r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="gray",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("M",r,t),e.textAlign="left"}),yield new l("MX",1,!0,!1,new Map([["X","X"],["Y","ERR:Y"],["Z","ERR:Z"]]),(t,r)=>t.$("X",r),(t,r)=>t.$("X",r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="gray",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle=)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART("black",e.textAlign="center",e.textBaseline="middle",e.fillText("MX",r,t),e.textAlign="left"}),yield new l("MY",1,!0,!1,new Map([["X","ERR:X"],["Y","Y"],["Z","ERR:Z"]]),(t,r)=>t.$("Y",r),(t,r)=>t.$("Y",r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="gray",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("MY",r,t),e.textAlign="left"}),yield new l("II",2,!0,!1,new Map([["IX","IX"],["IZ","IZ"],["XI","XI"],["ZI","ZI"]]),(t,r)=>{},(t,r)=>{},(t,r,e)=>{var i,o,[a,n]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,a,n,r,t);for([i,o]of[[a,n],[r,t]])e.fillStyle="white",e.fillRect(i-Rt,o-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(i-Rt,o-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("II",i,o)}),yield new l("SQRT_XX",2,!0,!1,new Map([["IX","IX"],["IZ","XY"],["XI","XI"],["ZI","YX"]]),(t,r)=>t.q(r),(t,r)=>t.q(r),(t,r,e)=>{var i,o,[a,n]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,a,n,r,t);for([i,o)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(]of[[a,n],[r,t]])e.fillStyle="yellow",e.fillRect(i-Rt,o-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(i-Rt,o-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("√XX",i,o)}),yield new l("SQRT_XX_DAG",2,!0,!1,new Map([["IX","IX"],["IZ","XY"],["XI","XI"],["ZI","YX"]]),(t,r)=>t.q(r),(t,r)=>t.q(r),(t,r,e)=>{var i,o,[a,n]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,a,n,r,t);for([i,o]of[[a,n],[r,t]])e.fillStyle="yellow",e.fillRect(i-Rt,o-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(i-Rt,o-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("√XX†",i,o)}),yield new l("SQRT_YY",2,!0,!1,new Map([["IX","YZ"],["IZ","YX"],["XI","ZY"],["ZI","XY"]]),(t,r)=>t.W(r),(t,r)=>t.W(r),(t,r,e)=>{var i,o,[a,n]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,a,n,r,t);for([i,o]of[[a,n],[r,t]])e.fillStyle="yellow",e.fillRect(i-Rt,o-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(i-Rt,o-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("√YY",i,o)})CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(),yield new l("SQRT_YY_DAG",2,!0,!1,new Map([["IX","YZ"],["IZ","YX"],["XI","ZY"],["ZI","XY"]]),(t,r)=>t.W(r),(t,r)=>t.W(r),(t,r,e)=>{var i,o,[a,n]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,a,n,r,t);for([i,o]of[[a,n],[r,t]])e.fillStyle="yellow",e.fillRect(i-Rt,o-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(i-Rt,o-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("√YY†",i,o)}),yield new l("SQRT_ZZ",2,!0,!1,new Map([["IX","ZY"],["IZ","IZ"],["XI","YZ"],["ZI","ZI"]]),(t,r)=>t.V(r),(t,r)=>t.V(r),(t,r,e)=>{var i,o,[a,n]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,a,n,r,t);for([i,o]of[[a,n],[r,t]])e.fillStyle="yellow",e.fillRect(i-Rt,o-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(i-Rt,o-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("√ZZ",i,o)}),yield new l("SQRT_ZZ_DAG",2,!0,!1,new Map([["IX","ZY"],["IZ","IZ"],["XI","YZ"],["ZI","ZI"]]),(t,r)=>t.V(r),(t,r)=>t.V(r),(t,r,e)=>{var i,o,[a,n]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,a,n,r,t);for([i,o]of[[a,n],[r,t]])e.)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(fillStyle="yellow",e.fillRect(i-Rt,o-Rt,2*Rt,2*Rt),e.strokeStyle="black",e.strokeRect(i-Rt,o-Rt,2*Rt,2*Rt),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("√ZZ†",i,o)}),yield*A(),yield new l("C_XYZ",1,!0,!1,new Map([["X","Y"],["Z","X"]]),(t,r)=>t.j(r),(t,r)=>t.J(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="teal",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.textAlign="center",e.textBaseline="middle",e.fillText("C",r,t-Rt/3),e.fillText("XYZ",r,t+Rt/3)}),yield new l("C_NXYZ",1,!0,!1,new Map([["X","Y"],["Z","X"]]),(t,r)=>t.j(r),(t,r)=>t.J(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="teal",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.textAlign="center",e.textBaseline="middle",e.fillText("C",r,t-Rt/3),e.fillText("NXYZ",r,t+Rt/3)}),yield new l("C_XNYZ",1,!0,!1,new Map([["X","Y"],["Z","X"]]),(t,r)=>t.j(r),(t,r)=>t.J(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="t)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(eal",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.textAlign="center",e.textBaseline="middle",e.fillText("C",r,t-Rt/3),e.fillText("XNYZ",r,t+Rt/3)}),yield new l("C_XYNZ",1,!0,!1,new Map([["X","Y"],["Z","X"]]),(t,r)=>t.j(r),(t,r)=>t.J(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="teal",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.textAlign="center",e.textBaseline="middle",e.fillText("C",r,t-Rt/3),e.fillText("XYNZ",r,t+Rt/3)}),yield new l("C_ZYX",1,!0,!1,new Map([["X","Z"],["Z","Y"]]),(t,r)=>t.J(r),(t,r)=>t.j(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="teal",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.textAlign="center",e.textBaseline="middle",e.fillText("C",r,t-Rt/3),e.fillText("ZYX",r,t+Rt/3)}),yield new l("C_ZYNX",1,!0,!1,new Map([["X","Z"],["Z","Y"]]),(t,r)=>t.J(r),(t,r)=>t.j(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillSt)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(yle="teal",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.textAlign="center",e.textBaseline="middle",e.fillText("C",r,t-Rt/3),e.fillText("ZYNX",r,t+Rt/3)}),yield new l("C_ZNYX",1,!0,!1,new Map([["X","Z"],["Z","Y"]]),(t,r)=>t.J(r),(t,r)=>t.j(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="teal",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.textAlign="center",e.textBaseline="middle",e.fillText("C",r,t-Rt/3),e.fillText("ZNYX",r,t+Rt/3)}),yield new l("C_NZYX",1,!0,!1,new Map([["X","Z"],["Z","Y"]]),(t,r)=>t.J(r),(t,r)=>t.j(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="teal",e.fillRect(r-Rt,t-Rt,2*Rt,2*Rt),e.fillStyle="black",e.strokeStyle="black",e.strokeRect(r-Rt,t-Rt,2*Rt,2*Rt),e.textAlign="center",e.textBaseline="middle",e.fillText("C",r,t-Rt/3),e.fillText("NZYX",r,t+Rt/3)})}const B=function(){var t,r=new Map;for(t of E())r.set(t.name,t);return r.set("MZ",r.get("M")),r.set("RZ",r.get("R")),)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(r.set("MRZ",r.get("MR")),r}(),H=((t=new Map).set("CNOT",{name:"CX"}),t.set("MZ",{name:"M"}),t.set("MRZ",{name:"MR"}),t.set("RZ",{name:"R"}),t.set("H_XZ",{name:"H"}),t.set("SQRT_Z",{name:"S"}),t.set("SQRT_Z_DAG",{name:"S_DAG"}),t.set("ZCX",{name:"CX"}),t.set("ZCY",{name:"CY"}),t.set("ZCZ",{name:"CZ"}),t.set("SWAPCZ",{name:"CZSWAP"}),t.set("XCZ",{name:"CX",tt:!0}),t.set("YCX",{name:"XCY",tt:!0}),t.set("YCZ",{name:"CY",tt:!0}),t.set("SWAPCX",{name:"CXSWAP",tt:!0}),t.set("CORRELATED_ERROR",{rt:!0}),t.set("DEPOLARIZE1",{rt:!0}),t.set("DEPOLARIZE2",{rt:!0}),t.set("E",{rt:!0}),t.set("ELSE_CORRELATED_ERROR",{rt:!0}),t.set("PAULI_CHANNEL_1",{rt:!0}),t.set("PAULI_CHANNEL_2",{rt:!0}),t.set("X_ERROR",{rt:!0}),t.set("I_ERROR",{rt:!0}),t.set("II_ERROR",{rt:!0}),t.set("Y_ERROR",{rt:!0}),t.set("Z_ERROR",{rt:!0}),t.set("HERALDED_ERASE",{rt:!0}),t.set("HERALDED_PAULI_CHANNEL_1",{rt:!0}),t.set("MPAD",{rt:!0}),t.set("SHIFT_COORDS",{rt:!0}),t);function k(t,r){var e,i=new Map;for(e of t){var o=r(e),a=i.get(o);void 0===a?i.set(o,[e)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(]):a.push(e)}return i}class U{constructor(){this.et=new Map,this.it=[]}toString(){let t="Layer {\n";t+=" id_ops {\n";for(var[r,e]of this.et.entries())t+=` ${r}: ${e} + result.append(R"CRUMBLE_PART(Z.u(this,t,r),""!==this.tag&&0{var i,o,a,[r,n]=r(t.R[0]);void 0!==r)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(&&void 0!==n&&({dx:t,dy:i,_:o,A:a}=Ot(t.Y[0]),e.fillStyle=s,o===a?e.fillRect(r-t-2,n-i-2,o+4,a+4):(t=r+(t<0?1:-1)*Ct,i=n+(i<0?1:-1)*Ct,o=t+(o>Ct?1:0)*Ct*2,a=i+(a>Ct?1:0)*Ct*2,e.beginPath(),e.moveTo(r,n),e.lineTo(t,i),e.lineTo(o,a),e.lineTo(r,n),e.fill()))}}function*E(){yield new l("ISWAP",2,!0,!1,new Map([["IX","YZ"],["IZ","ZI"],["XI","ZY"],["ZI","IZ"]]),(t,r)=>t.k(r),(t,r)=>t.k(r),(t,r,e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),h(e,i,o),h(e,r,t)}),yield new l("ISWAP_DAG",2,!0,!1,new Map([["IX","YZ"],["IZ","ZI"],["XI","ZY"],["ZI","IZ"]]),(t,r)=>t.k(r),(t,r)=>t.k(r),(t,r,e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),h(e,i,o),h(e,r,t)}),yield new l("SWAP",2,!0,!1,new Map([["IX","XI"],["IZ","ZI"],["XI","IX"],["ZI","IZ"]]),(t,r)=>t.g(r),(t,r)=>t.g(r),(t,r,e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),b(e,i,o),b(e,r,t)}),yield new l("CXSWAP",2,!0,!1,new Map([["IX","XI"],["IZ","ZZ"],["XI","XX"],["ZI","IZ"]]),(t,r)=>t.S(r),(t,r)=>t.C(r),(t,r,e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(),I(e,i,o),i=e,o=t,void 0!==(e=r)&&void 0!==o&&(i.fillStyle="white",i.strokeStyle="black",i.beginPath(),i.arc(e,o,Ct,0,2*Math.PI),i.fill(),i.stroke(),t=.4*Ct,i.strokeStyle="black",i.lineWidth=3,i.beginPath(),i.moveTo(e-t,o-t),i.lineTo(e+t,o+t),i.stroke(),i.moveTo(e-t,o+t),i.lineTo(e+t,o-t),i.stroke(),i.lineWidth=1)}),yield new l("CZSWAP",2,!0,!1,new Map([["IX","XZ"],["IZ","ZI"],["XI","ZX"],["ZI","IZ"]]),(t,r)=>t.P(r),(t,r)=>t.P(r),(t,r,e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),I(e,i,o),I(e,r,t)})}function*A(){yield new l("CX",2,!0,!1,new Map([["IX","IX"],["IZ","ZZ"],["XI","XX"],["ZI","ZI"]]),(t,r)=>t.O(r),(t,r)=>t.O(r),(t,r,e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),s(e,i,o),a(e,r,t)}),yield new l("CY",2,!0,!1,new Map([["IX","ZX"],["IZ","ZZ"],["XI","XY"],["ZI","ZI"]]),(t,r)=>t.T(r),(t,r)=>t.T(r),(t,r,e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),s(e,i,o),n(e,r,t)}),yield new l("XCX",2,!0,!1,new Map([["IX","IX"],["IZ","XZ"],["XI","XI"],["ZI","ZX"]]),(t,r)=>t.N(r),(t,r)=>t.N(r),(t,r,)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),a(e,i,o),a(e,r,t)}),yield new l("XCY",2,!0,!1,new Map([["IX","XX"],["IZ","XZ"],["XI","XI"],["ZI","ZY"]]),(t,r)=>t.D(r),(t,r)=>t.D(r),(t,r,e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),a(e,i,o),n(e,r,t)}),yield new l("YCY",2,!0,!1,new Map([["IX","YX"],["IZ","YZ"],["XI","XY"],["ZI","ZY"]]),(t,r)=>t.L(r),(t,r)=>t.L(r),(t,r,e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),n(e,i,o),n(e,r,t)}),yield new l("CZ",2,!0,!1,new Map([["IX","ZX"],["IZ","IZ"],["XI","XZ"],["ZI","ZI"]]),(t,r)=>t.F(r),(t,r)=>t.F(r),(t,r,e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),s(e,i,o),s(e,r,t)}),yield new l("MR",1,!0,!1,new Map([["X","ERR:I"],["Y","ERR:I"],["Z","I"]]),(t,r)=>t.U("Z",r),(t,r)=>t.U("Z",r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="gray",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("MR",r,t)}),yield new l("MRY",1,!0,!1,new Map([["X","ERR:)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(I"],["Y","I"],["Z","ERR:I"]]),(t,r)=>t.U("Y",r),(t,r)=>t.U("Y",r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="gray",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("MRY",r,t)}),yield new l("MRX",1,!0,!1,new Map([["X","I"],["Y","ERR:I"],["Z","ERR:I"]]),(t,r)=>t.U("X",r),(t,r)=>t.U("X",r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="gray",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("MRX",r,t)}),yield new l("H",1,!0,!1,new Map([["X","Z"],["Z","X"]]),(t,r)=>t.G(r),(t,r)=>t.G(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="yellow",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("H",r,t)}),yield new l("H_NXZ",1,!0,!1,new Map([["X","Z"],["Z","X"]]),(t,r)=>t.G(r),(t,r)=>t.G(r),(t)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="yellow",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("H",r,t-Ct/3),e.fillText("NXZ",r,t+Ct/3)}),yield new l("H_XY",1,!0,!1,new Map([["X","Y"],["Z","Z"]]),(t,r)=>t.H(r),(t,r)=>t.H(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="yellow",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("H",r,t-Ct/3),e.fillText("XY",r,t+Ct/3)}),yield new l("H_NXY",1,!0,!1,new Map([["X","Y"],["Z","Z"]]),(t,r)=>t.H(r),(t,r)=>t.H(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="yellow",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("H",r,t-Ct/3),e.fillText("NXY",r,t+Ct/3)}),yield new l("H_YZ",1,!0,!1,new Map([["X","X"],["Z","Y"]]),(t,r)=>t.K(r),(t,r)=>t.K()CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="yellow",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("H",r,t-Ct/3),e.fillText("YZ",r,t+Ct/3)}),yield new l("H_NYZ",1,!0,!1,new Map([["X","X"],["Z","Y"]]),(t,r)=>t.K(r),(t,r)=>t.K(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="yellow",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("H",r,t-Ct/3),e.fillText("NYZ",r,t+Ct/3)}),yield new l("POLYGON",void 0,!1,!0,void 0,()=>{},()=>{},(t,r,e)=>{var i,o=[];for(i of t.R){var[a,n]=r(i);o.push([a-=.5,n-=.5])}C(e,o),e.globalAlpha*=t.Y[3],e.fillStyle=`rgb(${255*t.Y[0]},${255*t.Y[1]},${255*t.Y[2]})`,e.fill()}),yield new l("DETECTOR",void 0,!1,!0,void 0,()=>{},()=>{},(t,r,e)=>{}),yield new l("OBSERVABLE_INCLUDE",void 0,!1,!0,void 0,()=>{},()=>{},(t,r,e)=>{}),yield new l("MARKX",1,!0,!0,void 0,()=>{},()CRUMBLE_PART"); + result.append(R"CRUMBLE_PART()=>{},r("red")),yield new l("MARKY",1,!0,!0,void 0,()=>{},()=>{},r("green")),yield new l("MARKZ",1,!0,!0,void 0,()=>{},()=>{},r("blue")),yield new l("MARK",1,!1,!0,void 0,()=>{},()=>{},(t,r,e)=>{var[r,t]=r(t.R[0]);void 0!==r&&void 0!==t&&(e.fillStyle="magenta",e.fillRect(r-Ct,t-Ct,Ct,Ct))}),yield new l("MXX",2,!0,!1,new Map([["II","II"],["IX","IX"],["IY","ERR:IY"],["IZ","ERR:IZ"],["XI","XI"],["XX","XX"],["XY","ERR:XY"],["XZ","ERR:XZ"],["YI","ERR:YI"],["YX","ERR:YX"],["YY","YY"],["YZ","YZ"],["ZI","ERR:ZI"],["ZX","ERR:ZX"],["ZY","ZY"],["ZZ","ZZ"]]),(t,r)=>t.$("XX",r),(t,r)=>t.$("XX",r),(t,r,e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),e.fillStyle="gray",e.fillRect(i-Ct,o-Ct,2*Ct,2*Ct),e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(i-Ct,o-Ct,2*Ct,2*Ct),e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("MXX",i,o),e.fillText("MXX",r,t)}),yield new l("MYY",2,!0,!1,new Map([["II","II"],["IX","ERR:IX"],["IY","IY"],["IZ","ERR:IZ"],)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(["XI","ERR:XI"],["XX","XX"],["XY","ERR:XY"],["XZ","XZ"],["YI","YI"],["YX","ERR:YX"],["YY","YY"],["YZ","ERR:YZ"],["ZI","ERR:ZI"],["ZX","ZX"],["ZY","ERR:ZY"],["ZZ","ZZ"]]),(t,r)=>t.$("YY",r),(t,r)=>t.$("YY",r),(t,r,e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),e.fillStyle="gray",e.fillRect(i-Ct,o-Ct,2*Ct,2*Ct),e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(i-Ct,o-Ct,2*Ct,2*Ct),e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("MYY",i,o),e.fillText("MYY",r,t)}),yield new l("MZZ",2,!0,!1,new Map([["II","II"],["IX","ERR:IX"],["IY","ERR:IY"],["IZ","IZ"],["XI","ERR:XI"],["XX","XX"],["XY","XY"],["XZ","ERR:XZ"],["YI","ERR:YI"],["YX","YX"],["YY","YY"],["YZ","ERR:YZ"],["ZI","ZI"],["ZX","ERR:ZX"],["ZY","ERR:ZY"],["ZZ","ZZ"]]),(t,r)=>t.$("ZZ",r),(t,r)=>t.$("ZZ",r),(t,r,e)=>{var[i,o]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,i,o,r,t),e.fillStyle="gray",e.fillRect(i-Ct,o-Ct,2*Ct,2*Ct),e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART((i-Ct,o-Ct,2*Ct,2*Ct),e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("MZZ",i,o),e.fillText("MZZ",r,t)}),yield new l("ERR",1,!0,!1,new Map([["X","X"],["Z","Z"]]),()=>{},()=>{},(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="red",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("ERR",r,t)}),yield new l("I",1,!0,!1,new Map([["X","X"],["Z","Z"]]),()=>{},()=>{},(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="white",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("I",r,t)}),yield new l("X",1,!0,!1,new Map([["X","X"],["Z","Z"]]),()=>{},()=>{},(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="white",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(",e.fillText("X",r,t)}),yield new l("Y",1,!0,!1,new Map([["X","X"],["Z","Z"]]),()=>{},()=>{},(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="white",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("Y",r,t)}),yield new l("Z",1,!0,!1,new Map([["X","X"],["Z","Z"]]),()=>{},()=>{},(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="white",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("Z",r,t)}),yield new l("S",1,!0,!1,new Map([["X","Y"],["Z","Z"]]),(t,r)=>t.H(r),(t,r)=>t.H(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="yellow",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("S",r,t)}),yield new l("S_DAG",1,!0,!1,new Map([["X","Y"],["Z","Z"]]),(t,r)=>t.H(r),(t,r)=>t.H(r),(t,r,e)=>{var[r,t]=)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(r(t.R[0]);e.fillStyle="yellow",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("S†",r,t)}),yield new l("SQRT_X",1,!0,!1,new Map([["X","X"],["Z","Y"]]),(t,r)=>t.K(r),(t,r)=>t.K(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="yellow",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("√X",r,t)}),yield new l("SQRT_X_DAG",1,!0,!1,new Map([["X","X"],["Z","Y"]]),(t,r)=>t.K(r),(t,r)=>t.K(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="yellow",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("√X†",r,t)}),yield new l("SQRT_Y",1,!0,!1,new Map([["X","Z"],["Z","X"]]),(t,r)=>t.G(r),(t,r)=>t.G(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="yellow",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle=)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART("black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("√Y",r,t)}),yield new l("SQRT_Y_DAG",1,!0,!1,new Map([["X","Z"],["Z","X"]]),(t,r)=>t.G(r),(t,r)=>t.G(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="yellow",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("√Y†",r,t)}),yield new l("R",1,!0,!1,new Map([["X","ERR:I"],["Y","ERR:I"],["Z","ERR:I"]]),(t,r)=>t.B(r),(t,r)=>t.U("Z",r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="gray",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("R",r,t)}),yield new l("RX",1,!0,!1,new Map([["X","ERR:I"],["Y","ERR:I"],["Z","ERR:I"]]),(t,r)=>t.B(r),(t,r)=>t.U("X",r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="gray",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*C)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(t),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("RX",r,t)}),yield new l("RY",1,!0,!1,new Map([["X","ERR:I"],["Y","ERR:I"],["Z","ERR:I"]]),(t,r)=>t.B(r),(t,r)=>t.U("Y",r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="gray",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("RY",r,t)}),yield new l("M",1,!0,!1,new Map([["X","ERR:X"],["Y","ERR:Y"],["Z","Z"]]),(t,r)=>t.$("Z",r),(t,r)=>t.$("Z",r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="gray",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("M",r,t),e.textAlign="left"}),yield new l("MX",1,!0,!1,new Map([["X","X"],["Y","ERR:Y"],["Z","ERR:Z"]]),(t,r)=>t.$("X",r),(t,r)=>t.$("X",r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="gray",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("MX",r,t),e.textAlign="left"}),yield new l("MY",1,!0,!1,new Map([["X","ERR:X"],["Y","Y"],["Z","ERR:Z"]]),(t,r)=>t.$("Y",r),(t,r)=>t.$("Y",r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="gray",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("MY",r,t),e.textAlign="left"}),yield new l("II",2,!0,!1,new Map([["IX","IX"],["IZ","IZ"],["XI","XI"],["ZI","ZI"]]),(t,r)=>{},(t,r)=>{},(t,r,e)=>{var i,o,[a,n]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,a,n,r,t);for([i,o]of[[a,n],[r,t]])e.fillStyle="white",e.fillRect(i-Ct,o-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(i-Ct,o-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("II",i,o)}),yield new l("SQRT_XX",2,!0,!1,new Map([["IX","IX"],["IZ","XY"],["XI","XI"],["ZI","YX"]]),(t,r)=>t.q(r),(t,r)=>t.q(r),(t,r,e)=>{var i,o,[a,n]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,a,n,r,t)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART();for([i,o]of[[a,n],[r,t]])e.fillStyle="yellow",e.fillRect(i-Ct,o-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(i-Ct,o-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("√XX",i,o)}),yield new l("SQRT_XX_DAG",2,!0,!1,new Map([["IX","IX"],["IZ","XY"],["XI","XI"],["ZI","YX"]]),(t,r)=>t.q(r),(t,r)=>t.q(r),(t,r,e)=>{var i,o,[a,n]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,a,n,r,t);for([i,o]of[[a,n],[r,t]])e.fillStyle="yellow",e.fillRect(i-Ct,o-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(i-Ct,o-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("√XX†",i,o)}),yield new l("SQRT_YY",2,!0,!1,new Map([["IX","YZ"],["IZ","YX"],["XI","ZY"],["ZI","XY"]]),(t,r)=>t.W(r),(t,r)=>t.W(r),(t,r,e)=>{var i,o,[a,n]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,a,n,r,t);for([i,o]of[[a,n],[r,t]])e.fillStyle="yellow",e.fillRect(i-Ct,o-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(i-Ct,o-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText(")CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(√YY",i,o)}),yield new l("SQRT_YY_DAG",2,!0,!1,new Map([["IX","YZ"],["IZ","YX"],["XI","ZY"],["ZI","XY"]]),(t,r)=>t.W(r),(t,r)=>t.W(r),(t,r,e)=>{var i,o,[a,n]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,a,n,r,t);for([i,o]of[[a,n],[r,t]])e.fillStyle="yellow",e.fillRect(i-Ct,o-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(i-Ct,o-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("√YY†",i,o)}),yield new l("SQRT_ZZ",2,!0,!1,new Map([["IX","ZY"],["IZ","IZ"],["XI","YZ"],["ZI","ZI"]]),(t,r)=>t.V(r),(t,r)=>t.V(r),(t,r,e)=>{var i,o,[a,n]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,a,n,r,t);for([i,o]of[[a,n],[r,t]])e.fillStyle="yellow",e.fillRect(i-Ct,o-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(i-Ct,o-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("√ZZ",i,o)}),yield new l("SQRT_ZZ_DAG",2,!0,!1,new Map([["IX","ZY"],["IZ","IZ"],["XI","YZ"],["ZI","ZI"]]),(t,r)=>t.V(r),(t,r)=>t.V(r),(t,r,e)=>{var i,o,[a,n]=r(t.R[0]),[r,t]=r(t.R[1]);c(e,a,n,r,t);for([i,o]of[[a,n])CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(,[r,t]])e.fillStyle="yellow",e.fillRect(i-Ct,o-Ct,2*Ct,2*Ct),e.strokeStyle="black",e.strokeRect(i-Ct,o-Ct,2*Ct,2*Ct),e.fillStyle="black",e.textAlign="center",e.textBaseline="middle",e.fillText("√ZZ†",i,o)}),yield*E(),yield new l("C_XYZ",1,!0,!1,new Map([["X","Y"],["Z","X"]]),(t,r)=>t.j(r),(t,r)=>t.J(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="teal",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.textAlign="center",e.textBaseline="middle",e.fillText("C",r,t-Ct/3),e.fillText("XYZ",r,t+Ct/3)}),yield new l("C_NXYZ",1,!0,!1,new Map([["X","Y"],["Z","X"]]),(t,r)=>t.j(r),(t,r)=>t.J(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="teal",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.textAlign="center",e.textBaseline="middle",e.fillText("C",r,t-Ct/3),e.fillText("NXYZ",r,t+Ct/3)}),yield new l("C_XNYZ",1,!0,!1,new Map([["X","Y"],["Z","X"]]),(t,r)=>t.j(r),(t,r)=>t.J(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fi)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(llStyle="teal",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.textAlign="center",e.textBaseline="middle",e.fillText("C",r,t-Ct/3),e.fillText("XNYZ",r,t+Ct/3)}),yield new l("C_XYNZ",1,!0,!1,new Map([["X","Y"],["Z","X"]]),(t,r)=>t.j(r),(t,r)=>t.J(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="teal",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.textAlign="center",e.textBaseline="middle",e.fillText("C",r,t-Ct/3),e.fillText("XYNZ",r,t+Ct/3)}),yield new l("C_ZYX",1,!0,!1,new Map([["X","Z"],["Z","Y"]]),(t,r)=>t.J(r),(t,r)=>t.j(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="teal",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.textAlign="center",e.textBaseline="middle",e.fillText("C",r,t-Ct/3),e.fillText("ZYX",r,t+Ct/3)}),yield new l("C_ZYNX",1,!0,!1,new Map([["X","Z"],["Z","Y"]]),(t,r)=>t.J(r),(t,r)=>t.j(r),(t,r,e)=>{var[r,t]=r(t.R[0])CRUMBLE_PART"); + result.append(R"CRUMBLE_PART();e.fillStyle="teal",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.textAlign="center",e.textBaseline="middle",e.fillText("C",r,t-Ct/3),e.fillText("ZYNX",r,t+Ct/3)}),yield new l("C_ZNYX",1,!0,!1,new Map([["X","Z"],["Z","Y"]]),(t,r)=>t.J(r),(t,r)=>t.j(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="teal",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.textAlign="center",e.textBaseline="middle",e.fillText("C",r,t-Ct/3),e.fillText("ZNYX",r,t+Ct/3)}),yield new l("C_NZYX",1,!0,!1,new Map([["X","Z"],["Z","Y"]]),(t,r)=>t.J(r),(t,r)=>t.j(r),(t,r,e)=>{var[r,t]=r(t.R[0]);e.fillStyle="teal",e.fillRect(r-Ct,t-Ct,2*Ct,2*Ct),e.fillStyle="black",e.strokeStyle="black",e.strokeRect(r-Ct,t-Ct,2*Ct,2*Ct),e.textAlign="center",e.textBaseline="middle",e.fillText("C",r,t-Ct/3),e.fillText("NZYX",r,t+Ct/3)})}const B=function(){var t,r=new Map;for(t of A())r.set(t.name,t);return r.set("MZ",r.get("M")),r.set("RZ",r.)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(get("R")),r.set("MRZ",r.get("MR")),r}(),K=((t=new Map).set("CNOT",{name:"CX"}),t.set("MZ",{name:"M"}),t.set("MRZ",{name:"MR"}),t.set("RZ",{name:"R"}),t.set("H_XZ",{name:"H"}),t.set("SQRT_Z",{name:"S"}),t.set("SQRT_Z_DAG",{name:"S_DAG"}),t.set("ZCX",{name:"CX"}),t.set("ZCY",{name:"CY"}),t.set("ZCZ",{name:"CZ"}),t.set("SWAPCZ",{name:"CZSWAP"}),t.set("XCZ",{name:"CX",tt:!0}),t.set("YCX",{name:"XCY",tt:!0}),t.set("YCZ",{name:"CY",tt:!0}),t.set("SWAPCX",{name:"CXSWAP",tt:!0}),t.set("CORRELATED_ERROR",{rt:!0}),t.set("DEPOLARIZE1",{rt:!0}),t.set("DEPOLARIZE2",{rt:!0}),t.set("E",{rt:!0}),t.set("ELSE_CORRELATED_ERROR",{rt:!0}),t.set("PAULI_CHANNEL_1",{rt:!0}),t.set("PAULI_CHANNEL_2",{rt:!0}),t.set("X_ERROR",{rt:!0}),t.set("I_ERROR",{rt:!0}),t.set("II_ERROR",{rt:!0}),t.set("Y_ERROR",{rt:!0}),t.set("Z_ERROR",{rt:!0}),t.set("HERALDED_ERASE",{rt:!0}),t.set("HERALDED_PAULI_CHANNEL_1",{rt:!0}),t.set("MPAD",{rt:!0}),t.set("SHIFT_COORDS",{rt:!0}),t);function k(t,r){var e,i=new Map;for(e of t){var o=r(e),a=i.get(o);void 0===a?)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(i.set(o,[e]):a.push(e)}return i}class U{constructor(){this.et=new Map,this.it=[]}toString(){let t="Layer {\n";t+=" id_ops {\n";for(var[r,e]of this.et.entries())t+=` ${r}: ${e} )CRUMBLE_PART"); result.append(R"CRUMBLE_PART(`;t+=" }\n markers {\n";for(var i of this.it)t+=` ${i} )CRUMBLE_PART"); result.append(R"CRUMBLE_PART(`;return t=t+" }\n"+"}"}ot(){let r=k(this.nt(),t=>{let r=t.Z.name;return(r=(r=r.startsWith("MPP:")&&!B.has(r)?"MPP":r).startsWith("SPP:")&&!B.has(r)?"SPP":r).startsWith("SPP_DAG:")&&!B.has(r)&&(r="SPP_DAG"),""!==t.tag&&(r+="["+t.tag.replace("\\","\\B").replace("\r","\\r").replace("\n","\\n").replace("]","\\C")+"]"),0{var e=t.startsWith("MARK")||t.startsWith("POLY"),i=r.startsWith("MARK")||r.startsWith("POLY");return e!==i?e[t,r.get(t)]))}st(){var t=new U;return t.et=new Map(this.et),t.it=[...this.it],t}m(){let t=0;for(var[r,e]of this.et.entries())e.R[0]===r&&(t+=e.m());return t}ht(){var t,r=["M","MX","MY","MR","MRX","MRY","MXX","MYY","MZZ","RX","RY","R"];for(t of this.et.values())if(t.Z.name.startsWith("MPP:")||-1!==r.indexOf(t.Z.name))return!0;return!1}lt(){var t,r=["M","MX","MY","MR","MRX","MRY","MXX","MYY","MZZ","RX","RY","R"];for(t of this.et.values())if(1===t.R.length&&-1)CRUMBLE_PART"); result.append(R"CRUMBLE_PART(===r.indexOf(t.Z.name)&&0===t.m())return!0;return!1}ft(){var t,r=["MR","MRX","MRY","RX","RY","R"];for(t of this.et.values())if(-1!==r.indexOf(t.Z.name))return!0;return!1}vt(){var t,r=["M","MX","MY","MR","MRX","MRY","MXX","MYY","MZZ"];for(t of this.et.values())if(t.Z.name.startsWith("MPP:")||-1!==r.indexOf(t.Z.name))return!0;return!1}empty(){return 0===this.et.size&&0===this.it.length}ct(t){var r,e,i=new U;for(r of this.et.values())t(r)&&i.put(r);for(e of this.it)t(e)&&i.it.push(e);return i}dt(r){return this.ct(t=>!t.R.every(t=>!r(t)))}wt(e,t){var r,i,o=new Map,a=new Set;for(r of e.keys()){var n=e.get(r),s=this.et.get(r);if(void 0!==s){let r="";for(var h of s.R){a.has(h),a.add(h);let t=e.get(h);void 0===t&&(t="I"),r+=t}var l=s.p(r),f=l.startsWith("ERR:");for(let t=0;t-1===t.R.indexOf(r)),this.et.has(r)){var t,e=this.et.get(r);for(t of e.R)this.et.delete(t);return e}}Mt(r,e=void 0){this.it=this.it.filter(t=>void 0!==e&&t.Y[0]!==e||"MARKX"!==t.Z.name&&"MARKY"!==t.Z.name&&"MARKZ"!==t.Z.name||t.R[0]!==r)}put(t,r=!0){if(t.Z.i)"MARKX"!==t.Z.name&&"MARKY"!==t.Z.name&&"MARKZ"!==t.Z.name||this.Mt(t.R[0],t.Y[0]),this.it.push(t);else{for(var e of t.R)if(this.et.has(e)){if(!r)throw new Error("Collision");this.Xt(e)}for(var i of t.R)this.et.set(i,t)}}*nt(){for(var t of this.et.keys()){var r=this.et.get(t);r.R[0]===t&&(yield r)}yield*this.it}}function T(t){let r=void 0,e=void 0;for(var[i,o]of t)(void 0=)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(==r||it.Zt(f,r),(t,r)=>t.Zt(f,r),(r,e,i)=>{let o=void 0,a=void 0;for(let t=0;td){a.push("[...]");break}e=G(e,o-1),i=G(i,o-1);a.push(e+": "+i)}return`Map{${a.join(", ")}}`}if(t instanceof Set){var n,s=r,h=[];for(n of t){if(h.length>d){h.push("[...]");break}h.push(G(n,s-1))}return`Set{${h.join(", ")}}`}if(void 0!==t[Symbol.iterator]){var l,f=r,v=[])CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(;for(l of t){if(v.length>d){v.push("[...]");break}v.push(G(l,f-1))}return`${t=Array.isArray(t)?"":t.constructor.name}[${v.join(", ")}]`}}function K(t,r){try{var e=String(t);if(e!==g)return e}catch{}var i=t,o=r,a=[];for(s in i)if(i.hasOwnProperty(s)){if(a.length>d){a.push("[...]");break}var n=i[s],s=G(s,o-1),n=G(n,o-1);a.push(s+": "+n)}return void 0===i.constructor?"[an unknown non-primitive value with no constructor]":(e=(e=i.constructor.name)==={}.constructor.name?"":`(Type: ${e})`)+`{${a.join(", ")}}`}function G(t,r=P){return(null===(e=t)?"null":void 0===e?"undefined":"string"==typeof e?`"${e}"`:"number"==typeof e?""+e:void 0)||z(t,r)||K(t,r);var e}function Q(t){let r=[];var e,i=()=>{""!==o&&(r.push(o),o="")};let o="";for(e of t)" "===e?i():"*"===e?(i(),r.push("*")):o+=e;return i(),r}function $(e){var t=[];let i=0;for(;ie.length)throw Error(`Dangling combiner in ${e}.`);var o=[];for(let t=i;tt.Yt(f,r),(t,r)=>t.Yt(f,r),(r,e,i)=>{let o=void 0,a=void 0;for(let t=0;tt instanceof U))throw new Error("!layers.every(e => e instanceof Layer)");this.Rt=t,this.yt=r}static It(t){t=t.replaceAll(";","\n").replaceAll("#!pragma ERR","ERR").replaceAll("#!pragma MARK","MARK").replaceAll("#!pragma POLYGON","POLYGON").replaceAll("_"," ").replaceAll("Q(","QUBIT_COORDS(").replaceAll("DT","DETECTOR").replaceAll("OI","OBSERVABLE_INCLUDE").replaceAll(" COORDS","_COORDS").replaceAll(" ERROR","_ERROR").replaceAll("C XYZ","C_)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(}else if("MARKY"===i.Z.name&&i.Y[0]===t){c=i.R[0];let t=o.get(c);void 0===t||"I"===t?t="Y":"X"===t?t="Z":"Y"===t?t="I":"Z"===t&&(t="X"),o.set(c,t)}else if("MARKZ"===i.Z.name&&i.Y[0]===t){var d=i.R[0];let t=o.get(d);void 0===t||"I"===t?t="Z":"X"===t?t="Y":"Y"===t?t="X":"Z"===t&&(t="I"),o.set(d,t)}return o}ut(){return 0===this.et.size&&0===this.it.length}Xt(r){if(this.it=this.it.filter(t=>-1===t.R.indexOf(r)),this.et.has(r)){var t,e=this.et.get(r);for(t of e.R)this.et.delete(t);return e}}Mt(r,e=void 0){this.it=this.it.filter(t=>void 0!==e&&t.Y[0]!==e||"MARKX"!==t.Z.name&&"MARKY"!==t.Z.name&&"MARKZ"!==t.Z.name||t.R[0]!==r)}put(t,r=!0){if(t.Z.i)"MARKX"!==t.Z.name&&"MARKY"!==t.Z.name&&"MARKZ"!==t.Z.name||this.Mt(t.R[0],t.Y[0]),this.it.push(t);else{for(var e of t.R)if(this.et.has(e)){if(!r)throw new Error("Collision");this.Xt(e)}for(var i of t.R)this.et.set(i,t)}}*nt(){for(var t of this.et.keys()){var r=this.et.get(t);r.R[0]===t&&(yield r)}yield*this.it}}function D(t){let r=void 0,e=void 0;for(var[i,o]of t)(void 0=)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(==r||it.Zt(f,r),(t,r)=>t.Zt(f,r),(r,e,i)=>{let o=void 0,a=void 0;for(let t=0;tg){a.push("[...]");break}e=G(e,o-1),i=G(i,o-1);a.push(e+": "+i)}return`Map{${a.join(", ")}}`}if(t instanceof Set){var n,s=r,h=[];for(n of t){if(h.length>g){h.push("[...]");break}h.push(G(n,s-1))}return`Set{${h.join(", ")}}`}if(void 0!==t[Symbol.iterator]){var l,f=r,v=[])CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(;for(l of t){if(v.length>g){v.push("[...]");break}v.push(G(l,f-1))}return`${t=Array.isArray(t)?"":t.constructor.name}[${v.join(", ")}]`}}function q(t,r){try{var e=String(t);if(e!==S)return e}catch{}var i=t,o=r,a=[];for(s in i)if(i.hasOwnProperty(s)){if(a.length>g){a.push("[...]");break}var n=i[s],s=G(s,o-1),n=G(n,o-1);a.push(s+": "+n)}return void 0===i.constructor?"[an unknown non-primitive value with no constructor]":(e=(e=i.constructor.name)==={}.constructor.name?"":`(Type: ${e})`)+`{${a.join(", ")}}`}function G(t,r=Q){return(null===(e=t)?"null":void 0===e?"undefined":"string"==typeof e?`"${e}"`:"number"==typeof e?""+e:void 0)||$(t,r)||q(t,r);var e}function W(t){let r=[];var e,i=()=>{""!==o&&(r.push(o),o="")};let o="";for(e of t)" "===e?i():"*"===e?(i(),r.push("*")):o+=e;return i(),r}function V(e){var t=[];let i=0;for(;ie.length)throw Error(`Dangling combiner in ${e}.`);var o=[];for(let t=i;tt.Yt(f,r),(t,r)=>t.Yt(f,r),(r,e,i)=>{let o=void 0,a=void 0;for(let t=0;tt instanceof U))throw new Error("!layers.every(e => e instanceof Layer)");this.Rt=t,this.yt=r}static It(t){t=t.replaceAll(";","\n").replaceAll("#!pragma ERR","ERR").replaceAll("#!pragma MARK","MARK").replaceAll("#!pragma POLYGON","POLYGON").replaceAll("_"," ").replaceAll("Q(","QUBIT_COORDS(").replaceAll("DT","DETECTOR").replaceAll("OI","OBSERVABLE_INCLUDE").replaceAll(" COORDS","_COORDS").replaceAll(" ERROR","_ERROR").replaceAll("C XYZ","C_)CRUMBLE_PART"); result.append(R"CRUMBLE_PART(XYZ").replaceAll("C NXYZ","C_NXYZ").replaceAll("C XNYZ","C_XNYZ").replaceAll("C XYNZ","C_XYNZ").replaceAll("H XY","H_XY").replaceAll("H XZ","H_XZ").replaceAll("H YZ","H_YZ").replaceAll("H NXY","H_NXY").replaceAll("H NXZ","H_NXZ").replaceAll("H NYZ","H_NYZ").replaceAll(" INCLUDE","_INCLUDE").replaceAll("SQRT ","SQRT_").replaceAll(" DAG ","_DAG ").replaceAll("C ZYX","C_ZYX").replaceAll("C NZYX","C_NZYX").replaceAll("C ZNYX","C_ZNYX").replaceAll("C ZYNX","C_ZYNX").split("\n");let T=[new U],N=0,D=new Map,x=new Set,s=(e,i,o,r)=>{T[T.length-1].empty()||T.push(new U);for(let t=0;t{let o=0;for(let r=t;r{let a=[],n=[],e="",s="",t=o.indexOf(" "),r=o.indexOf("("),i=o.indexOf("["),h)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(=o.indexOf("]");if(i!==-1&&t!==-1&&ti){e=o.substring(i+1,h).replaceAll("\\C","]").replaceAll("\\r","\r").replaceAll("\\n","\n").replaceAll("\\B","\\");o=o.substring(0,i)+" "+o.substring(h+1)}if(o.indexOf(")")!==-1){let[t,r]=o.split(")");let[e,i]=t.split("(");s=e.trim();a=i.split(",").map(t=>t.trim()).map(parseFloat);n=Q(r)}else{let t=o.split(" ").map(t=>t.trim()).filter(t=>t!=="");if(t.length===0)return;let[r,...e]=t;s=r.trim();a=[];n=e.flatMap(Q)}let l=false;if(""!==s){0=L.length)return console.warn("Ignoring instruction due to out of range record target: "+o);var Y=L[Z];T[Y.bt].it.push(new F(B.get(s),e,new Float32Array([X]),new Uint32Array([Y._t[0]])))}return N+=u}if("SPP"===s||"SPP_DAG"===s){var R="SPP_DAG"===s,y=$(n),m;let r=T[T.length-1];for(m of y)try{r.put(W(e,new Float32Array(a),R,m),!1)}catch(t){T.push(new U),(r=T[T.length-1]).put(W(e,new Float32Array(a),R,m),!1)}return}if(s.startsWith("QUBIT_COORDS")){var p=a.length<1?0:a[0],I=a.length<2?0:a[1],b;for(b of n){var _=parseInt(b);D.has(_)?console.warn(`Ignoring "${o}" because there's already coordinate data for qubit ${_}.`):x.has(p+","+I)?console.warn(`Ignoring "${o}" because there's already a qubit placed at ${p},${I}.`):(D.set(_,[p,I]),x)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(.add(p+","+I))}return}}let t=!1;for(v of n)if(v.startsWith("rec["))"CX"!==s&&"CY"!==s&&"CZ"!==s&&"ZCX"!==s&&"ZCY"!==s||(t=!0);else if("number"!=typeof parseInt(v))throw new Error(o);if(t){var A=[];for(let t=0;t{let r=!0;for(;!D.has(t);){var e=r?t:o,i=e+",0";x.has(i)||(x.add(i),D.set(t,[e,0])),o+=!r,r=!1}};for(r of T)for(var i of r.nt())for(var a of i.R)e(a);var n=Math.max(...D.keys(),0)+1,h=new Float64Array(2*n);for(let t=0;t[t-r,t+r])}gt(){var t,r,e=new Map;for(let t=0;t1/256;)s/=2;let h;if(s<=1/256)h=1;else{h=1/s;let t=0;for(var[l,f]of e.values()){var v=(l-a+f-n)%(2*s),l=(l-a-f+n)%(2*s);t=t|(0==v?1:2)|(0==l?4:8)}5===t?h/=2:10===t&&(a-=s,h/=2)}let c=-a,d=-n;return(t,r)=>[)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(=o.indexOf("]");if(i!==-1&&t!==-1&&ti){e=o.substring(i+1,h).replaceAll("\\C","]").replaceAll("\\r","\r").replaceAll("\\n","\n").replaceAll("\\B","\\");o=o.substring(0,i)+" "+o.substring(h+1)}if(o.indexOf(")")!==-1){let[t,r]=o.split(")");let[e,i]=t.split("(");s=e.trim();a=i.split(",").map(t=>t.trim()).map(parseFloat);n=W(r)}else{let t=o.split(" ").map(t=>t.trim()).filter(t=>t!=="");if(t.length===0)return;let[r,...e]=t;s=r.trim();a=[];n=e.flatMap(W)}let l=false;if(""!==s){0=L.length)return console.warn("Ignoring instruction due to out of range record target: "+o);var Y=L[Z];T[Y.bt].it.push(new F(B.get(s),e,new Float32Array([X]),new Uint32Array([Y._t[0]])))}return N+=u}if("SPP"===s||"SPP_DAG"===s){var R="SPP_DAG"===s,y=V(n),m;let r=T[T.length-1];for(m of y)try{r.put(J(e,new Float32Array(a),R,m),!1)}catch(t){T.push(new U),(r=T[T.length-1]).put(J(e,new Float32Array(a),R,m),!1)}return}if(s.startsWith("QUBIT_COORDS")){var p=a.length<1?0:a[0],I=a.length<2?0:a[1],b;for(b of n){var _=parseInt(b);D.has(_)?console.warn(`Ignoring "${o}" because there's already coordinate data for qubit ${_}.`):x.has(p+","+I)?console.warn(`Ignoring "${o}" because there's already a qubit placed at ${p},${I}.`):(D.set(_,[p,I]),x)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(.add(p+","+I))}return}}let t=!1;for(v of n)if(v.startsWith("rec["))"CX"!==s&&"CY"!==s&&"CZ"!==s&&"ZCX"!==s&&"ZCY"!==s||(t=!0);else if("number"!=typeof parseInt(v))throw new Error(o);if(t){var E=[];for(let t=0;t{let r=!0;for(;!D.has(t);){var e=r?t:o,i=e+",0";x.has(i)||(x.add(i),D.set(t,[e,0])),o+=!r,r=!1}};for(r of T)for(var i of r.nt())for(var a of i.R)e(a);var n=Math.max(...D.keys(),0)+1,h=new Float64Array(2*n);for(let t=0;t[t-r,t+r])}gt(){var t,r,e=new Map;for(let t=0;t1/256;)s/=2;let h;if(s<=1/256)h=1;else{h=1/s;let t=0;for(var[l,f]of e.values()){var v=(l-a+f-n)%(2*s),l=(l-a-f+n)%(2*s);t=t|(0==v?1:2)|(0==l?4:8)}5===t?h/=2:10===t&&(a-=s,h/=2)}let c=-a,d=-n;return(t,r)=>[)CRUMBLE_PART"); result.append(R"CRUMBLE_PART((t+c)*h,(r+d)*h]}St(){return this.kt(this.gt())}Ct(e,i){return this.kt((t,r)=>[t+e,r+i])}st(){return this.Ct(0,0)}kt(r){var e=new Float64Array(this.Rt.length);for(let t=0;tt.st());return new u(e,t)}Pt(r){var e=new Map;for(let t=0;tr-t),u=w.Tt.join(":"),Z.has(u)||(Z.add(u),Y.push(w)));for([X,M]of f.entries())(M=[...new Set(M)]).sort((t,r)=>r-t),f.set(X,M);return Y.sort((t,r)=>t.Tt[0]-r.Tt[0]),{Nt:Y,Dt:f}}xt(){var t,r=new Set;for(t of this.yt)for(var N of t.nt())for(var D of N.R)r.add(D);var{Nt:a,Dt:e}=this.Pt(!0);a.reverse();let n=0;var i,s=this.m(),o=[];for(i of r){var x=this.Rt[2*i],L=this.Rt[2*i+1];o.push({Lt:i,x:x,y:L})}o.sort((t,r)=>t.x!==r.x?t.x-r.x:t.y!==r.y?t.y-r.y:t.Lt-r.Lt);var h=new Map,l=[];for(let t=0;t=g.length&&(t=0,i+=1),e=`DETECTOR(${g[t]}, ${S[t]}, ${i})`,X.has(e);t++);X.add(e);var O,T=[e];for(O of A.Tt)T.push(`rec[${O+E}]`);l.push(T.join(" ")),o=Math.max(o,i+1)}f=o;for([w,u]of[...e.entries()]){var K=s-n;if(!(0<=u[0]+K)){e.delete(w);var Q,$=[`OBSERVABLE_INCLUDE(${w})`];for(Q of u)$.push(`rec[${Q+K}]`);l.push($.join(" "))}}l.push("TICK")}for(;0t.st()))}Ut(){var r=new Map;for(let t=0;t!(e instanceof t))){var s=t,h=r;if(s.length!==h.length)return!1;for(let t=0;t=g.length&&(t=0,i+=1),e=`DETECTOR(${g[t]}, ${S[t]}, ${i})`,X.has(e);t++);X.add(e);var O,T=[e];for(O of E.Tt)T.push(`rec[${O+A}]`);l.push(T.join(" ")),o=Math.max(o,i+1)}f=o;for([w,u]of[...e.entries()]){var K=s-n;if(!(0<=u[0]+K)){e.delete(w);var Q,$=[`OBSERVABLE_INCLUDE(${w})`];for(Q of u)$.push(`rec[${Q+K}]`);l.push($.join(" "))}}l.push("TICK")}for(;0t.st()))}Ut(){var r=new Map;for(let t=0;t!(e instanceof t))){var s=t,h=r;if(s.length!==h.length)return!1;for(let t=0;t{performance.now(){this.er="idle",this.ir=-1/0,this.sr()},e)}}class i{constructor(t){this.hr=t}subscribe(t){return this.hr(t)}static of(...e){return new i(t=>{for(var r of e)t(r);return()=>{}})}lr(){let r=[];return this.subscribe(t=>r.push(t))(),r}map(e){return new i(r=>this.subscribe(t=>r(e(t))))}filter(e){return new i(r=>this.subscribe(t=>{e(t)&&r(t)}))}vr(s,h){return new i(r=>{)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(let e=!1,i=!1,o,a,t=this.subscribe(t=>{o=t,e=!0,i&&r(h(o,a))}),n=s.subscribe(t=>{a=t,i=!0,e&&r(h(o,a))});return()=>{t(),n()}})}static cr(){return new i(t=>{let r,e=!1;return(r=()=>{e||(t(void 0),window.requestAnimationFrame(r))})(),()=>{e=!0}})}dr(){return new i(e=>{let i=()=>{},o=!1,t=this.subscribe(t=>{var r;o||(r=i,i=t.subscribe(e),r())});return()=>{o=!0,i(),t()}})}wr(r){return this.map(t=>(r(t),t))}ur(){return new i(r=>{let e=[];return e.push(this.subscribe(t=>e.push(t.subscribe(r)))),()=>{for(var t of e)t()}})}Xr(a){return new i(t=>{let r=void 0,e=!1,i=new at(()=>{e||t(r)},a),o=this.subscribe(t=>{r=t,i.sr()});return()=>{e=!0,o()}})}static Mr(r,e){return new i(t=>(r.addEventListener(e,t),()=>r.removeEventListener(e,t)))}Zr(t){return new i(r=>{let e=t;return this.subscribe(t=>{0t===r);return new i(r=>{let e=!1,i=void 0;return this.subscribe(t=>{e&&o(i,t)||(i=t,e=!0,r(t))})})}}class nt{constructor(){this.Rr=[],this.yr=new i(t=>{this.Rr.push(t);let r=!1;return()=)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(>{r||(r=!0,this.Rr.splice(this.Rr.indexOf(t),1))}})}mr(){return this.yr}send(t){for(var r of this.Rr)r(t)}}class st{constructor(t=void 0){this.pr=t,this.Ir=new nt,this.yr=new i(t=>(t(this.pr),this.Ir.mr().subscribe(t)))}mr(){return this.yr}set(t){this.pr=t,this.Ir.send(t)}get(){return this.pr}}class ht{constructor(t,r,e){if(r<0||r>=t.length)throw new Error("Bad index: "+{history:t,index:r,br:e});if(!Array.isArray(t))throw new Error("Bad history: "+{history:t,index:r,br:e});this.history=t,this.index=r,this.br=e,this._r=new nt,this.Ar=new st(this.history[this.index])}Er(){return this._r.mr()}kr(){return this.Ar.mr()}gr(){return this.Ar.get()}static Sr(t){return new ht([t],0,!1)}Cr(){return 0===this.index&&!this.br}Pr(){return this.index===this.history.length-1}clear(t){this.history=[t],this.index=0,this.br=!1,this.Ar.set(t),this._r.send(t)}Or(t){this.br=t!==this.history[this.index],this._r.send(void 0)}Tr(){this.br=!1;var t=this.history[this.index];return this.Ar.set(t),this._r.send(t),t}commit(t){t===this.hist)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(ory[this.index]?this.Tr():(this.br=!1,this.index+=1,this.history.splice(this.index,this.history.length-this.index),this.history.push(t),this.Ar.set(t),this._r.send(t))}Nr(){if(!this.br){if(0===this.index)return;--this.index}this.br=!1;var t=this.history[this.index];return this.Ar.set(t),this._r.send(t),t}Dr(){var t;if(this.index+1!==this.history.length)return this.index+=1,this.br=!1,t=this.history[this.index],this.Ar.set(t),this._r.send(t),t}toString(){return"Revision("+G({index:this.index,count:this.history.length,Lr:this.br,head:this.history[this.index]})+")"}Gt(t){return t instanceof ht&&this.index===t.index&&this.br===t.br&&w(this.history,t.history)}}let It=32;function lt(t,e,N,o,D){var x,r=Math.floor(t.canvas.clientWidth/2),i=e.Fr();i.sort((t,r)=>{var[t,e]=o(t),[r,i]=o(r);return e!==i?e-i:t-r});let a=new Map,L=void 0,n=0,s=0,h=0,l=0;for(x of i){var[F,f]=o(x);s+=It,L!==f?(L=f,n=1.5*r,h=Math.max(h,l),l=0,s+=.25*It):(n+=.25*Rt,l++),a.set(F+","+f,[Math.round(n)+.5,Math.round(s)+.5])}let v=It+Math.ceil(Rt*h*)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(.25);var c=Math.floor(t.canvas.clientWidth/4/v);let U=e.Ur-c+1,d=Math.max(0,Math.min(U,D-2*c+1));var w=Math.min(d+2*c+2,D);let G=t=>{t-=e.Ur;return(t-=d-U)*v},u=(t,r)=>{var[t,e]=o(t);return[t,e,r]=[[t,e,r]][0],t=t+","+e,a.has(t)?([e,t]=a.get(t),[e+G(r),t]):[void 0,void 0]};t.save();try{t.clearRect(r,0,r,t.canvas.clientHeight);var H,z,K=new Map;for([H,z]of N.entries()){A=_=b=et=rt=tt=J=I=P=C=j=V=W=S=p=m=q=g=k=B=E=y=R=$=Q=Y=Z=M=X=void 0;var X=t,M=u,Z=z,Y=H,Q=d,$=w,R=v,y=K;for(let o=Q-1;o<=$;o++){y.has(o)||y.set(o,new Map);var m,p,I,b,_,A,E=y.get(o),B=Z.Gr(o+.5),k=Z.Gr(o);for([m,p]of B.Hr.entries()){let{dx:t,dy:r,_:e,A:i}=pt(Y,m,E);0<=Y&&Y<4?(t=0,e=R,i=5,0===Y?r=10:1===Y?r=5:2===Y?r=0:3===Y&&(r=-5)):t-=R/2;var[g,q]=M(m,o);if(void 0!==g&&void 0!==q){if("X"===p)X.fillStyle="red";else if("Y"===p)X.fillStyle="green";else{if("Z"!==p)throw new Error("Not a pauli: "+p);X.fillStyle="blue"}X.fillRect(g-t,q-r,e,i)}}for(I of k.zr){var{dx:S,dy:W,_:V,A:j}=pt(Y,I,E),[C,P]=(S-=R/2,M(I,o-.5));void 0!==C&&void 0!==P&&(X.strokeSt)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(yle="magenta",X.lineWidth=8,X.strokeRect(C-S,P-W,V,j),X.lineWidth=1,X.fillStyle="black",X.fillRect(C-S,P-W,V,j))}for({Kr:b,Qr:_,color:A}of k.$r){var[J,tt]=M(b,o),[rt,et]=M(_,o);"X"===A?X.strokeStyle="red":"Y"===A?X.strokeStyle="green":"Z"===A?X.strokeStyle="blue":X.strokeStyle="purple",X.lineWidth=8,mt(X,J,tt,rt,et),X.lineWidth=1}}}t.globalAlpha*=.5,t.fillStyle="black";var it,O,ot,at=G(e.Ur)+1.5*r-v/2;t.fillRect(at,0,v,t.canvas.clientHeight),t.globalAlpha*=2,t.strokeStyle="black",t.fillStyle="black";for(it of i){var[nt,st]=u(it,d-1),[ht,lt]=u(it,w+1);t.beginPath(),t.moveTo(nt,st),t.lineTo(ht,lt),t.stroke()}t.textAlign="right",t.textBaseline="middle";for(O of i){var[ft,vt]=u(O,d-1),ct=e.Br.Rt[2*O],dt=e.Br.Rt[2*O+1];t.fillText(ct+`,${dt}:`,ft,vt)}for(let r=d;r<=w;r++){var wt=t=>u(t,r),ut=e.Br.yt[r];if(void 0!==ut)for(var Xt of ut.nt())Xt.I(wt,t)}t.globalAlpha=.5;for(ot of i){var[Mt,T]=u(ot,d-1),[Zt,Yt]=o(ot);e.qr>t.canvas.clientWidth/2&&e.Wr>=T+yt-.55*It&&e.Wr<=T+.55*It+yt&&(t.beginPath(),t.moveTo(Mt,T),t.lineT)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(o(Zt,Yt),t.stroke(),t.fillStyle="black",t.fillRect(Zt-20,Yt-20,40,40),t.fillRect(t.canvas.clientWidth/2,T-It/3,t.canvas.clientWidth/2,2*It/3))}}finally{t.restore()}}class Z{constructor(t,r){if(32 32");this.t=r,this.Vr=t,this.jr=new Uint32Array(r),this.Jr=new Uint32Array(r),this.flags=new Uint32Array(r)}st(){var r=new Z(this.Vr,this.t);for(let t=0;t>=1,r>>=1,e>>=1,i>>=1}return s}static re(e){var t=e.length;if(0===t)throw new Error("strings.length === 0");var r,i=e[0].length;for(r of e)if(r.length!==i)throw new Error("Inconsistent string length.");var o=new Z(t,i);for)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART((let r=0;r>e&1,o=this.jr[t]>>e&1,a=this.Jr[t]>>e&1;r+="_XZY!%$&"[o+2*a+4*i]}t.push(r)}return t}static ie(e,i){var o=new Z(e.length,i.length);for(let r=0;rt-r),["PropagatedPauliFrames {"]);for(t of r)e.push(` ${t}: `+this.he.get(t));return e.push("}"),e.join("\n")}Gr(t){let r=this.he.get(t);return r=void 0===r?new Y(new Map,new Set,[]):r}static le(r,e){var i=new N(new Map);let o=new Map;for(let t=0;tt[1]-r[1]);for(let r=t.yt.length-1;-1<=r;r--){var s,h=0<=r?t.yt[r]:new U,l=[...h.et.keys()];l.reverse();for(s of l){var f=h.et.get(s);if(f.R[0]===s){o.ae(f.Z,[...f.R]);for(let t=f.m();0"X"===t[0])?c.fillStyle="red":Y.every(t=>"Y"===t[0])?c.fillStyle="green":Y.every(t=>"Z"===t[0])?c.fillStyle="blue":c.fillStyle="black",c.strokeStyle=c.fillStyle;var R,y,Z=Y.map(t=>t[1]);let n=0,s=0;for([R,y]of Z)n+=R,s+=y;n/=Z.length,s/=Z.length,Z.sort((t,r)=>{var[t,e]=t,[r,i]=r;let o=Math.atan2(e-s,t-n),a=Math.atan2(i-s,r-n);return t===n&&e===s&&(o=-100),r===n&&i===s&&(a=-100),o-a}),C(c,Z),c.globalAlpha*=.25,c.fill(),c.globalAlpha*=4,c.lineWidth=2,c.stroke(),c.lineWidth=1}for([l,[f,v]]of Y){var{dx:m,dy:p,_:I,A:b}=pt(X,f+":"+v,M);if("X"===l)c.fillStyle="red";else if("Y"===l)c.fillStyle="green";else{if("Z"!==l)throw new Error("Not a pauli: "+l);c.fillStyle="blue"}c.fillRect(f-m,v-p,I,b)}for(_ of Z=u.Gr(d.Ur).zr){var[_,A]=w(_),{dx:E,dy:k,_:g,A:S}=pt(X,_+":"+A,M);c.lineWidth=X<0?2:8,c.strokeStyle="magen)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(ta",c.strokeRect(_-E,A-k,g,S),c.lineWidth=1,c.fillStyle="black",c.fillRect(_-E,A-k,g,S)}}}let vt=!0;function x(t,r){t.save();try{vt&&r()}finally{t.restore()}}function ct(Z,Y){var t,r=window.devicePixelRatio||1;Z.save(),Z.scale(r,r);let R=Y.Br,e=0;for(t of R.yt)for(var i of t.it){var o=i.Z;"MARKX"!==o.name&&"MARKY"!==o.name&&"MARKZ"!==o.name||(e=Math.max(e,i.Y[0]+1))}let y=(t,r)=>[t*O-L,r*O-yt],m=t=>{var r=R.Rt[2*t],t=R.Rt[2*t+1];return y(r,t)},p=new Map;for(let t=0;t{Z.fillStyle="white",Z.clearRect(0,0,Z.canvas.clientWidth,Z.canvas.clientHeight);var[t,r]=D(Y.qr,Y.Wr);let e=Y.Ur;for(let)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART( t=0;t<=Y.Ur;t++)for(var i of R.yt[t].it)if("POLYGON"===i.Z.name){e=t;break}var o,a,n,s,h=[...R.yt[e].it];h.sort((t,r)=>r.R.length-t.R.length);for(o of h)"POLYGON"===o.Z.name&&o.I(m,Z);x(Z,()=>{for(let t=0;t<100;t+=.5){var[r,,]=y(t,0),e=""+t;Z.fillStyle="black",Z.fillText(e,r-Z.measureText(e).width/2,15)}for(let t=0;t<100;t+=.5){var[,i]=y(0,t),o=""+t;Z.fillStyle="black",Z.fillText(o,18-Z.measureText(o).width,i)}Z.strokeStyle="black";for(let r=0;r<100;r+=.5){var[t,,]=y(r,0),a=""+r;Z.fillStyle="black",Z.fillText(a,t-Z.measureText(a).width/2,15);for(let t=r%1;t<100;t+=1){var[n,s]=y(r,t),h=(Z.fillStyle="white",!I.has(r+","+t)),l=!b.has(r+","+t);h&&(Z.globalAlpha*=.25),l&&(Z.globalAlpha*=.25),Z.fillRect(n-Rt,s-Rt,2*Rt,2*Rt),Z.strokeRect(n-Rt,s-Rt,2*Rt,2*Rt),h&&(Z.globalAlpha*=4),l&&(Z.globalAlpha*=4)}}});for([a,n]of p.entries()){u=w=d=M=X=c=v=f=l=void 0;var l=Z,f=Y,v=m,c=n;if(a,void 0!==(c=c.Gr(f.Ur).$r))for(var{Kr:d,Qr:w,color:u}of c){var[d,X]=v(d),[w,M]=v(w);"X"===u?l.strokeStyle="red":"Y"===u?l.strokeStyle="gre)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(en":"Z"===u?l.strokeStyle="blue":l.strokeStyle="purple",l.lineWidth=8,mt(l,d,X,w,M),l.lineWidth=1}}for(s of R.yt[Y.Ur].nt())"POLYGON"!==s.Z.name&&s.I(m,Z);x(Z,()=>{Z.globalAlpha*=.25;for(var[t,r]of Y.de.values()){var[t,r]=y(t,r);Z.fillStyle="yellow",Z.fillRect(t-1.25*Rt,r-1.25*Rt,2.5*Rt,2.5*Rt)}}),x(Z,()=>{Z.globalAlpha*=.5;var r,e,[i,o]=T(Y.we.values());for([r,e]of Y.we.values()){var[a,n]=y(r,e);Z.fillStyle="blue";let t=1.25;r===i&&e===o&&(t=1.5),Z.fillRect(a-Rt*t,n-Rt*t,2*t*Rt,2*t*Rt)}}),ft(Z,Y,m,p),void 0!==t&&(Z.save(),Z.globalAlpha*=.5,[h,t]=y(t,r),Z.fillStyle="red",Z.fillRect(h-Rt,t-Rt,2*Rt,2*Rt),Z.restore()),x(Z,()=>{var t,r,e,i,o,a;Z.globalAlpha*=.25,Z.fillStyle="blue",void 0!==Y.ue&&void 0!==Y.qr&&(t=Math.min(Y.qr,Y.ue),r=Math.max(Y.qr,Y.ue),e=Math.min(Y.Wr,Y.Xe),i=Math.max(Y.Wr,Y.Xe),--t,r+=1,--e,i+=1,t-=L,r-=L,e-=yt,i-=yt,Z.fillRect(t,e,r-t,i-e));for([o,a]of Y.Me){var[n,s]=y(o,a);Z.fillRect(n-Rt,s-Rt,2*Rt,2*Rt)}})}),lt(Z,Y,p,m,R.yt.length),Z.save();try{Z.strokeStyle="black",Z.translate(Math.floor(Z)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(.canvas.clientWidth/2),0);for(let n=0;n0===t.Gr(r).zr.size);0r.has(t))}}function wt(r){let e=[1,0],i=[0,1];var o=(t,r)=>[t-r,t+r];r=(r%8+8)%8;for(let t=0;t[e[0]*t+i[0]*r,e[1]*t+i[1]*r]}function ut(){try{r)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(eturn window.self===window.top}catch(t){}}class Xt{constructor(){this.Ye=!1,this.Re=void 0}ye(){this.Re={me:!0}}pe(t){this.Re=t}Ie(){this.Re=void 0}be(t,r){if(!r.startsWith("#"))throw new Error('"Expected a hash URL: '+{_e:t,Ae:r});if(ut()&&this.Re!==t)if(this.Ye)document.location.hash=r;else try{void 0===this.Re?history.replaceState(t,"",r):(history.pushState(t,"",r),this.Re=void 0)}catch(t){console.warn("Calling 'history.replaceState/pushState' failed. Falling back to setting location.hash.",t),this.Ye=!0,document.location.hash=r}}}function Mt(t){return"#circuit="+(t=-1===(t=t.replaceAll("QUBIT_COORDS","Q").replaceAll("DETECTOR","DT").replaceAll("OBSERVABLE_INCLUDE","OI").replaceAll(", ",",").replaceAll(") ",")").replaceAll(" ","_").replaceAll("\n",";")).indexOf("%")&&-1===t.indexOf("&")?t:encodeURIComponent(t))}let o=document.getElementById("toolbox"),M=10.5,R=["H","S","R","M","MR","C","W","SC","MC","P","1-9"],Zt=[1,2,2,2,2,0,2,2,2,-1,-1,-1];let Yt=function(){var r=new Map([["0,0",B.get("H_YZ")],["0,1",B.g)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(et("H")],["0,2",B.get("H_XY")],["1,0",B.get("SQRT_X")],["1,1",B.get("SQRT_Y")],["1,2",B.get("S")],["2,0",B.get("RX")],["2,1",B.get("RY")],["2,2",B.get("R")],["3,0",B.get("MX")],["3,1",B.get("MY")],["3,2",B.get("M")],["4,0",B.get("MRX")],["4,1",B.get("MRY")],["4,2",B.get("MRZ")],["5,0",B.get("CX")],["5,1",B.get("CY")],["5,2",B.get("CZ")],["6,0",B.get("CXSWAP")],["6,1",B.get("SWAP")],["6,2",B.get("CZSWAP")],["7,0",B.get("SQRT_XX")],["7,1",B.get("SQRT_YY")],["7,2",B.get("SQRT_ZZ")],["8,0",B.get("MXX")],["8,1",B.get("MYY")],["8,2",B.get("MZZ")]]);let e=9;for(let t=0;t<4;t++)r.set(e+",0",B.get("MARKX").M(t)),r.set(e+",1",B.get("MARKY").M(t)),r.set(e+",2",B.get("MARKZ").M(t)),r.set(e+",-1",B.get("MARK").M(t)),e+=1;return r}();function bt(t){var r,e=function(t){var r,e;if(!t.ctrlKey)return r=+t.zt.has("x"),e=+t.zt.has("y"),t=+t.zt.has("z"),r&&!e&&!t||!r&&e&&t?{Ee:0,strength:Math.max(r,Math.min(e,t))}:!r&&e&&!t||r&&!e&&t?{Ee:1,strength:Math.max(e,Math.min(r,t))}:!r&&!e&&t||r&&e&&!t?{Ee:2,strength:Math.max(t,Math.min()CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(r,e))}:void 0}(t),t=function(i){if(!i.ctrlKey){let e=void 0;for(let r=0;r=e.strength)&&(e={ke:r,strength:t/R[r].length})}return e}}(t);let i=e,o=(void 0!==t&&void 0===e&&(r=Zt[t.ke],i=void 0===r?void 0:{strength:0,Ee:r}),void 0);return void 0!==i&&void 0!==t&&(r=t.ke+","+i.Ee,Yt.has(r))&&(o=Yt.get(r)),{ge:e,Se:i,Ce:t,Pe:o}}const e=-O+Math.floor(O/4)+.5,_t=-O+Math.floor(O/4)+.5;var t=document.getElementById("btnInsertLayer"),At=document.getElementById("btnDeleteLayer"),Et=document.getElementById("btnUndo"),kt=document.getElementById("btnRedo"),gt=document.getElementById("btnClearMarkers");const St=document.getElementById("btnShowHideImportExport");var Ct=document.getElementById("btnNextLayer"),Pt=document.getElementById("btnPrevLayer"),Ot=document.getElementById("btnRotate45"),Tt=document.getElementById("btnRotate45Counter"),Nt=document.getElementById("btnExport"),Dt=document.getElementById("btnI)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(mport"),xt=document.getElementById("clear");const v=document.getElementById("txtStimCircuit");var Lt=document.getElementById("btnTimelineFocus"),Ft=document.getElementById("btnClearTimelineFocus"),Ut=document.getElementById("btnClearSelectedMarkers"),Gt=document.getElementById("btnShowExamples");const y=document.getElementById("examples-dialog");var Ht=document.getElementById("examples-close-button");v.addEventListener("keyup",t=>t.stopPropagation()),v.addEventListener("keydown",t=>t.stopPropagation());let m=new class{constructor(t){this.rev=ht.Sr(""),this.canvas=t,this.Wr=void 0,this.qr=void 0,this.Oe=new ot,this.Ur=0,this.we=new Map,this.de=new Map,this.ue=void 0,this.Xe=void 0,this.Te=new st(this.Ne(void 0))}De(t){var r,e,i,o=this.xe(),a=o.yt[this.Ur],n=new Set,s=new Map;for(r of[["CX","reverse"],["CY","reverse"],["XCY","reverse"],["CXSWAP","reverse"],["XCZ","reverse"],["XCY","reverse"],["YCX","reverse"],["SWAPCX","reverse"],["RX","MX"],["R","M"],["RY","MY"]])s.set(r[0],r[1]),s.set(r[1],r[0]);for(e of this)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(.we.keys()){var h=a.et.get(o.Ut().get(e));void 0!==h&&s.has(h.Z.name)&&n.add(h.R[0])}for(i of n){var l=a.et.get(i),f=s.get(l.Z.name);"reverse"===f?a.et.get(i).R.reverse():l.Z=B.get(f)}this.Le(o,t)}Fe(t){var r=this.xe();let e=this.Ur;for(;e"MARKX"!==t.Z.name&&"MARKY"!==t.Z.name&&"MARKZ"!==t.Z.name);this.commit(r)}$e(i){var t=this.qr,r=this.Wr,o=this.ue,a=this.Xe,n=[];if(void 0!==t&&void 0!==o){var[s,h]=D(o,a),l=Math.min(t,o),f=Math.max(t,o),v=Math.min(r,a),c=Math.max(r,a),t=O/4-Rt;l+=t,f-=t,v+=t,c-=t,l=Math.floor(2*l/O+.5)/2,f=Math.floor(2*f/O+.5)/2,v=Math.floor(2*v/O+.5)/2,c=Math.floor(2*c/O+.5)/2;let e=1;l!=f&&v!=c||(e=2);for(let r=l;r<=f;r+=.5)for(let t=v;t<=c;t+=.5)r%1!=t%1||i&&(s%e!=r%e||h%e!=t%e)||n.push([r,t])}return n}We(o,t,r){let e=this.xe();e=e.kt(o),!t&&r&&(this.de=(r=t=>{var r,e,i=new Map;for([r,e]of t.values())[r,e]=o(r,e),i.set(r+","+e,[r,e]);return i})(this.de),this.we=r(this.we)),this.Le(e,t)}Ve(t){var[r,e]=D(this.qr,this.Wr),[i,o]=T(this.we.values());let a=new Map;if(void 0!==r&&void 0!==i){va)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(r n,s,h,l=r-i,f=e-o,v=new Map;for([n,s]of this.we.values()){var c=n+","+s,d=n+l,w=s+f,u=d+","+w;a.set(c,[d,w]),v.set(u,[n,s])}for(h of v.keys())if(!a.has(h)){let[t,r]=v.get(h);for(;;){var X=v.get(t+","+r);if(void 0===X)break;[t,r]=X}a.set(h,[t,r])}}else{if(2!==this.we.size)return;var[[r,i],[e,o]]=[...this.we.values()],M=e+","+o;a.set(r+","+i,[e,o]),a.set(M,[r,i])}this.We((t,r)=>{var e=a.get(t+","+r);return void 0!==e?e:[t,r]},t,!0)}je(t,r){let e=wt(t),i=this.xe().kt(e).gt();this.We((t,r)=>([t,r]=e(t,r),i(t,r)),r,!0)}Je(t){this.Ur=Math.max(t,0),this.Ge()}ti(t,r,e){r||e||this.we.clear();for(var[i,o]of t){var a=i+","+o;e&&this.we.has(a)?this.we.delete(a):this.we.set(a,[i,o])}this.Ge()}ri(t){var r,e=new Map,i=this.xe().yt[this.Ur];for(r of[...t]){var o=i.et.get(r);if(void 0!==o)if("RX"===o.Z.name||"MX"===o.Z.name||"MRX"===o.Z.name)e.set(r,"X");else if("RY"===o.Z.name||"MY"===o.Z.name||"MRY"===o.Z.name)e.set(r,"Y");else if("R"===o.Z.name||"M"===o.Z.name||"MR"===o.Z.name)e.set(r,"Z");else if("MXX"===o.Z.name||"MYY")CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(===o.Z.name||"MZZ"===o.Z.name){var a,n=o.Z.name[1];for(a of o.R)e.set(a,n)}else if(o.Z.name.startsWith("MPP:")&&void 0===o.Z.h&&o.R.length===o.Z.name.length-4){var s=o.Z.name.substring(4);for(let t=0;t{var[t,e]=t,[r,i]=r;return Math.atan2(e-a,t-o)-Math.atan2(i-a,r-o)});var s=this.xe().Ft(this.we.values()),h=s.Ut(),l=new Uint32Array(this.we.size);for(let t=0;t!t.Z.name.startsWith("MARK")||t.Y[0]!==r)}this.Le(i,t)}vi(t,i){var r,e=this.xe(),o=N.le(e,i),a=this.Ur,n=0===a?new Y(new Map,new Set,[]):o.Gr(a-.5),s=o.Gr(a+.5),h=e.yt[a],l=new Set;for(r of new Set([...n.Hr.keys(),...s.Hr.keys()]))if(!l.has(r)){var f=n.Hr.get(r),v=s.Hr.get(r),c=h.et.get(r);if(void 0!==c){var d=c.Z.name;let e=void 0;if("R"===d||"M"===d||"MR"===d)e="Z";else)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART( if("RX"===d||"MX"===d||"MRX"===d)e="X";else{if("RY"!==d&&"MY"!==d&&"MRY"!==d){if("MXX"===d||"MYY"===d||"MZZ"===d){e=d[1];let t=0;for(var w of c.R){if(l.has(w)){t=-1;break}t+=n.Hr.get(w)===e}if(2===t)for(var u of c.R)l.add(u),h.it.push(new F(B.get("MARK"+e),"",new Float32Array([i]),new Uint32Array([u])));continue}if(d.startsWith("MPP:")){let r=0;for(let t=0;tc.R.length/2)for(let t=0;t{var t,r,{Nt:e,Dt:i}=n.Pt(!1);for(let t=0;tt.Z.name!==e.Z.name||t.Y[0]!==e.Y[0])}this.Le(a,t)}}}(document.getElementById("cvn"));function zt(){var t=window.devicePixelRatio||1;m.canvas.width=m.canvas.scrollWidth*t,m.canvas.height=m.canvas.scrollHeight*t}function Kt(){var t=m.xe().xt().replaceAll("\nPOL)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(YGON","\n#!pragma POLYGON").replaceAll("\nERR","\n#!pragma ERR").replaceAll("\nMARK","\n#!pragma MARK"),r=v;r.value=t+"\n",r.focus(),r.select()}Nt.addEventListener("click",t=>{Kt()}),Dt.addEventListener("click",t=>{var r=v.value,r=u.It(r);m.commit(r)}),St.addEventListener("click",t=>{var r=document.getElementById("divImportExport");"none"===r.style.display?(r.style.display="block",St.textContent="Hide Import/Export",Kt()):(r.style.display="none",St.textContent="Show Import/Export",v.value=""),setTimeout(()=>{window.scrollTo(0,0),zt(),m.Ge()},0)}),xt.addEventListener("click",t=>{m.Be()}),Et.addEventListener("click",t=>{m.Nr()}),Lt.addEventListener("click",t=>{m.de=new Map(m.we.entries()),m.Ge()}),Ut.addEventListener("click",t=>{m.ii(!1),m.Ge()}),Gt.addEventListener("click",t=>{y.open?y.close():y.showModal()}),Ht.addEventListener("click",t=>{y.close()}),y.addEventListener("click",t=>{t.target===y&&y.close()}),Ft.addEventListener("click",t=>{m.de=new Map,m.Ge()}),kt.addEventListener("click",t=>{m.Dr()}),gt.addEv)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(entListener("click",t=>{m.qe()}),Ot.addEventListener("click",t=>{m.je(1,!1)}),Tt.addEventListener("click",t=>{m.je(-1,!1)}),t.addEventListener("click",t=>{m.Ke(!1)}),At.addEventListener("click",t=>{m.ze(!1)}),Ct.addEventListener("click",t=>{m.Je(m.Ur+1)}),Pt.addEventListener("click",t=>{m.Je(m.Ur-1)}),window.addEventListener("resize",t=>{zt(),m.Ge()}),m.canvas.addEventListener("mousemove",t=>{m.qr=t.offsetX+e,m.Wr=t.offsetY+_t;var r=m.canvas.scrollWidth/2;Qt&&1===t.buttons?m.Je(Math.floor((t.offsetX-r)/8)):m.Ge()});let Qt=!1;m.canvas.addEventListener("mousedown",t=>{m.qr=t.offsetX+e,m.Wr=t.offsetY+_t,m.ue=t.offsetX+e,m.Xe=t.offsetY+_t;var r=m.canvas.scrollWidth/2;(Qt=t.offsetY<20&&t.offsetX>r&&1===t.buttons)?m.Je(Math.floor((t.offsetX-r)/8)):m.Ge()}),m.canvas.addEventListener("mouseup",t=>{var r=m.$e(t.altKey);m.ue=void 0,m.Xe=void 0,m.qr=t.offsetX+e,m.Wr=t.offsetY+_t,m.ti(r,t.shiftKey,t.ctrlKey),1===t.buttons&&(Qt=!1)});let $t=void 0;async function Bt(){let e=m.xe();e.yt=[e.yt[m.Ur]],0{var r=e.Rt[2*t],t=e.Rt[2*t+1];return m.we.has(r+","+t)}),[r,t]=T(m.we.values()),e=e.Ct(-r,-t));var t,r=e.xt();$t=r;try{await navigator.clipboard.writeText(r)}catch(t){console.warn("Failed to write to clipboard. Using fallback emulated clipboard.",t)}}async function qt(e){let i;try{i=await navigator.clipboard.readText()}catch(t){console.warn("Failed to read from clipboard. Using fallback emulated clipboard.",t),i=$t}if(void 0!==i){let r=u.It(i);if(1!==r.yt.length)throw new Error(i);let t=m.xe();0m.je(-1,t)),o.set("t",t=>m.je(1,t)),o.set("escape",()=>{y.open?y.close():m.U)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(e()}),o.set("delete",t=>m.He(t)),o.set("backspace",t=>m.He(t)),o.set("ctrl+delete",t=>m.ze(t)),o.set("ctrl+insert",t=>m.Ke(t)),o.set("ctrl+backspace",t=>m.ze(t)),o.set("ctrl+z",t=>{t||m.Nr()}),o.set("ctrl+y",t=>{t||m.Dr()}),o.set("ctrl+shift+z",t=>{t||m.Dr()}),o.set("ctrl+c",async t=>{await Bt()}),o.set("ctrl+v",qt),o.set("ctrl+x",async t=>{var r;await Bt(),0===m.we.size?((r=m.xe()).yt[m.Ur].et.clear(),r.yt[m.Ur].it.length=0,m.Le(r,t)):m.He(t)}),o.set("l",t=>{t||(m.de=new Map(m.we.entries()),m.Ge())}),o.set(" ",t=>m.ii(t));for(let[t,r]of[["1",0],["2",1],["3",2],["4",3],["5",4],["6",5],["7",6],["8",7],["9",8],["0",9],["-",10],["=",11],["\\",12],["`",13]])o.set(""+t,t=>m.ei(t,r)),o.set(t+"+x",t=>m.si(t,B.get("MARKX").M(r))),o.set(t+"+y",t=>m.si(t,B.get("MARKY").M(r))),o.set(t+"+z",t=>m.si(t,B.get("MARKZ").M(r))),o.set(t+"+d",t=>m.fi(t,r)),o.set(t+"+o",t=>m.hi(t,r)),o.set(t+"+j",t=>m.ci(t,r)),o.set(t+"+k",t=>m.vi(t,r));let r=.25;function a(t,r,e=void 0){for(var i of t){if(o.has(i))throw new Error("Chord collisio)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(n: "+i);o.set(i,t=>m.si(t,B.get(r)))}void 0!==e&&a(t.map(t=>"shift+"+t),e)}return o.set("p",t=>m.si(t,B.get("POLYGON"),[1,0,0,r])),o.set("alt+p",t=>m.si(t,B.get("POLYGON"),[0,1,0,r])),o.set("shift+p",t=>m.si(t,B.get("POLYGON"),[0,0,1,r])),o.set("p+x",t=>m.si(t,B.get("POLYGON"),[1,0,0,r])),o.set("p+y",t=>m.si(t,B.get("POLYGON"),[0,1,0,r])),o.set("p+z",t=>m.si(t,B.get("POLYGON"),[0,0,1,r])),o.set("p+x+y",t=>m.si(t,B.get("POLYGON"),[1,1,0,r])),o.set("p+x+z",t=>m.si(t,B.get("POLYGON"),[1,0,1,r])),o.set("p+y+z",t=>m.si(t,B.get("POLYGON"),[0,1,1,r])),o.set("p+x+y+z",t=>m.si(t,B.get("POLYGON"),[1,1,1,r])),o.set("m+p+x",t=>m.si(t,f("X".repeat(m.we.size)),[])),o.set("m+p+y",t=>m.si(t,f("Y".repeat(m.we.size)),[])),o.set("m+p+z",t=>m.si(t,f("Z".repeat(m.we.size)),[])),o.set("f",t=>m.De(t)),o.set("g",t=>m.Fe(t)),o.set("shift+>",t=>m.We((t,r)=>[t+1,r],t,!1)),o.set("shift+<",t=>m.We((t,r)=>[t-1,r],t,!1)),o.set("shift+v",t=>m.We((t,r)=>[t,r+1],t,!1)),o.set("shift+^",t=>m.We((t,r)=>[t,r-1],t,!1)),o.set(">",t=>m.We((t,r)=>[t+)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(1,r],t,!1)),o.set("<",t=>m.We((t,r)=>[t-1,r],t,!1)),o.set("v",t=>m.We((t,r)=>[t,r+1],t,!1)),o.set("^",t=>m.We((t,r)=>[t,r-1],t,!1)),o.set(".",t=>m.We((t,r)=>[t+.5,r+.5],t,!1)),o.set("b",t=>m.Ve(t)),a(["h","h+y","h+x+z"],"H","H"),a(["h+z","h+x+y"],"H_XY","H_XY"),a(["h+x","h+y+z"],"H_YZ","H_YZ"),a(["s+x","s+y+z"],"SQRT_X","SQRT_X_DAG"),a(["s+y","s+x+z"],"SQRT_Y","SQRT_Y_DAG"),a(["s","s+z","s+x+y"],"S","S_DAG"),a(["r+x","r+y+z"],"RX"),a(["r+y","r+x+z"],"RY"),a(["r","r+z","r+x+y"],"R"),a(["m+x","m+y+z"],"MX"),a(["m+y","m+x+z"],"MY"),a(["m","m+z","m+x+y"],"M"),a(["m+r+x","m+r+y+z"],"MRX"),a(["m+r+y","m+r+x+z"],"MRY"),a(["m+r","m+r+z","m+r+x+y"],"MR"),a(["c"],"CX","CX"),a(["c+x"],"CX","CX"),a(["c+y"],"CY","CY"),a(["c+z"],"CZ","CZ"),a(["j+x"],"X","X"),a(["j+y"],"Y","Y"),a(["j+z"],"Z","Z"),a(["c+x+y"],"XCY","XCY"),a(["alt+c+x"],"XCX","XCX"),a(["alt+c+y"],"YCY","YCY"),a(["w"],"SWAP","SWAP"),a(["w+x"],"CXSWAP",void 0),a(["c+w+x"],"CXSWAP",void 0),a(["i+w"],"ISWAP","ISWAP_DAG"),a(["w+z"],"CZSWAP",void 0),a(["c+w+z"],"CZ)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(SWAP",void 0),a(["c+w"],"CZSWAP",void 0),a(["c+t"],"C_XYZ","C_ZYX"),a(["c+s+x"],"SQRT_XX","SQRT_XX_DAG"),a(["c+s+y"],"SQRT_YY","SQRT_YY_DAG"),a(["c+s+z"],"SQRT_ZZ","SQRT_ZZ_DAG"),a(["c+s"],"SQRT_ZZ","SQRT_ZZ_DAG"),a(["c+m+x"],"MXX","MXX"),a(["c+m+y"],"MYY","MYY"),a(["c+m+z"],"MZZ","MZZ"),a(["c+m"],"MZZ","MZZ"),o}();function Vt(r){if(m.Oe.jt(r),"keydown"===r.type){if("q"===r.key.toLowerCase())return e=r.shiftKey?5:1,void m.Je(m.Ur-e);if("e"===r.key.toLowerCase())return e=r.shiftKey?5:1,void m.Je(m.Ur+e);if("Home"===r.key)return m.Je(0),void r.preventDefault();if("End"===r.key)return m.Je(m.xe().yt.length-1),void r.preventDefault()}var t=m.Oe.Bt;if(0!==t.length){for(var e=t[t.length-1];0{m.Te.set(m.Ne(void 0));var t=m.Oe.qt(!1),r=window.devicePixelRatio||1,a=(o.width=o.scrollWidth*r,o.height=o.scrollHeight*r,o.getContext("2d"));a.save(),a.scale(r,r),a.clearRect(0,0,o.scrollWidth,o.scrollHeight),a.textAlign="right",a.textBaseline="middle",a.fillText("X",7.5,24.5),a.fillText("Y",7.5,56.5),a.fillText("Z",7.5,88.5),a.textAlign="center",a.textBaseline="bottom";for(let t=0;t{try{var t,r=(()=>{var t=document.location.hash.substring(1),r=new Map;if(""!==t)for(var e of t.split("&")){var i,o=e.indexOf("=");-1!==o&&(i=e.substring(0,o),e=decodeURIComponent(e.substring(o+1)),r.set(i,e))}return r})(),e=(r.has("circuit")||("[[[DEFAULT-CIRCUIT-CONTENT-LITERAL]]]"===(t=document.getElementById("txtDefaultCircuit")).value.r)CRUMBLE_PART"); - result.append(R"CRUMBLE_PART(eplaceAll("_","-")?r.set("circuit",""):r.set("circuit",t.value)),u.It(r.get("circuit"))),i=e.xt();jt.clear(i),e.yt.every(t=>t.ut())&&1===r.size&&i===r.get("circuit")?Jt.Ie():Jt.be(i,Mt(i))}catch(t){throw new Error(t)}},window.addEventListener("popstate",Nt),Nt(),jt.kr().Yr().Zr(1).subscribe(t=>{Jt.be(t,Mt(t))})}m.Te.mr().subscribe(t=>requestAnimationFrame(()=>ct(m.canvas.getContext("2d"),t))),window.addEventListener("focus",()=>{m.Oe.Vt()}),window.addEventListener("blur",()=>{m.Oe.Vt()});for(let r of document.getElementById("examples-div").querySelectorAll("a"))r.onclick=t=>{if(!(t.shiftKey||t.ctrlKey||t.altKey||0!==t.button))return t=r.href.split("#circuit=")[1],m.rev.commit(t),y.close(),!1}; + result.append(R"CRUMBLE_PART(let e=!1,i=!1,o,a,t=this.subscribe(t=>{o=t,e=!0,i&&r(h(o,a))}),n=s.subscribe(t=>{a=t,i=!0,e&&r(h(o,a))});return()=>{t(),n()}})}static cr(){return new i(t=>{let r,e=!1;return(r=()=>{e||(t(void 0),window.requestAnimationFrame(r))})(),()=>{e=!0}})}dr(){return new i(e=>{let i=()=>{},o=!1,t=this.subscribe(t=>{var r;o||(r=i,i=t.subscribe(e),r())});return()=>{o=!0,i(),t()}})}wr(r){return this.map(t=>(r(t),t))}ur(){return new i(r=>{let e=[];return e.push(this.subscribe(t=>e.push(t.subscribe(r)))),()=>{for(var t of e)t()}})}Xr(a){return new i(t=>{let r=void 0,e=!1,i=new lt(()=>{e||t(r)},a),o=this.subscribe(t=>{r=t,i.sr()});return()=>{e=!0,o()}})}static Mr(r,e){return new i(t=>(r.addEventListener(e,t),()=>r.removeEventListener(e,t)))}Zr(t){return new i(r=>{let e=t;return this.subscribe(t=>{0t===r);return new i(r=>{let e=!1,i=void 0;return this.subscribe(t=>{e&&o(i,t)||(i=t,e=!0,r(t))})})}}class ft{constructor(){this.Rr=[],this.yr=new i(t=>{this.Rr.push(t);let r=!1;return()=)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(>{r||(r=!0,this.Rr.splice(this.Rr.indexOf(t),1))}})}mr(){return this.yr}send(t){for(var r of this.Rr)r(t)}}class vt{constructor(t=void 0){this.pr=t,this.Ir=new ft,this.yr=new i(t=>(t(this.pr),this.Ir.mr().subscribe(t)))}mr(){return this.yr}set(t){this.pr=t,this.Ir.send(t)}get(){return this.pr}}class ct{constructor(t,r,e){if(r<0||r>=t.length)throw new Error("Bad index: "+{history:t,index:r,br:e});if(!Array.isArray(t))throw new Error("Bad history: "+{history:t,index:r,br:e});this.history=t,this.index=r,this.br=e,this._r=new ft,this.Er=new vt(this.history[this.index])}Ar(){return this._r.mr()}kr(){return this.Er.mr()}gr(){return this.Er.get()}static Sr(t){return new ct([t],0,!1)}Cr(){return 0===this.index&&!this.br}Pr(){return this.index===this.history.length-1}clear(t){this.history=[t],this.index=0,this.br=!1,this.Er.set(t),this._r.send(t)}Or(t){this.br=t!==this.history[this.index],this._r.send(void 0)}Tr(){this.br=!1;var t=this.history[this.index];return this.Er.set(t),this._r.send(t),t}commit(t){t===this.hist)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(ory[this.index]?this.Tr():(this.br=!1,this.index+=1,this.history.splice(this.index,this.history.length-this.index),this.history.push(t),this.Er.set(t),this._r.send(t))}Nr(){if(!this.br){if(0===this.index)return;--this.index}this.br=!1;var t=this.history[this.index];return this.Er.set(t),this._r.send(t),t}Dr(){var t;if(this.index+1!==this.history.length)return this.index+=1,this.br=!1,t=this.history[this.index],this.Er.set(t),this._r.send(t),t}toString(){return"Revision("+G({index:this.index,count:this.history.length,Lr:this.br,head:this.history[this.index]})+")"}Gt(t){return t instanceof ct&&this.index===t.index&&this.br===t.br&&d(this.history,t.history)}}const Tt=32,Nt=40;class Dt{constructor(t,r,e){this.Fr=t,this.Ur=r,this.Gr=e}}function dt(t,e,N,o,i){var D,r=Math.floor(t.canvas.clientWidth/2),a=e.Hr();a.sort((t,r)=>{var[t,e]=o(t),[r,i]=o(r);return e!==i?e-i:t-r});let n=new Map,x=void 0,s=0,h=0,l=0,f=0;for(D of a){var[L,v]=o(D);h+=Tt,x!==v?(x=v,s=1.5*r,l=Math.max(l,f),f=0,h+=.25*Tt):(s+=.25*Ct,f++),n.set(L+)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(","+v,[Math.round(s)+.5,Math.round(h)+.5])}const c=Tt+Math.ceil(Ct*l*.25);var d=Math.floor(t.canvas.clientWidth/4/c);let w=e.zr-d+1,u=Math.max(0,Math.min(w,i-2*d+1));var d=Math.max(0,h-t.canvas.clientHeight+Tt),F=Math.max(-d,Math.min(0,e.Kr??0)),X=(i-1-e.zr-(u-w))*c,X=-Math.max(0,X-.5*r+2*c),U=Math.max(0,(u-1)*c),M=Math.max(X,Math.min(U,e.Qr??0));if(0!==F||0!==M)for(var[G,[H,z]]of n)n.set(G,[H+M,z+F]);var K=1.5*r+(w-1-e.zr)*c;let Q=t=>{t-=e.zr;return(t-=u-w)*c},Z=(t,r)=>{var[t,e]=o(t);return[t,e,r]=[[t,e,r]][0],t=t+","+e,n.has(t)?([e,t]=n.get(t),[e+Q(r),t]):[void 0,void 0]};t.save();try{t.clearRect(r,0,r,t.canvas.clientHeight),t.save(),t.beginPath(),t.rect(K,0,t.canvas.clientWidth-K,t.canvas.clientHeight),t.clip();var $,B,q=new Map;for([$,B]of N.entries()){k=j=A=ft=lt=ht=st=E=C=S=nt=at=ot=g=_=b=it=et=rt=tt=J=I=p=V=W=m=y=R=Y=void 0;var Y=t,R=Z,y=B,m=$,W=0,V=i,p=c,I=q;for(let o=W-1;o<=V;o++){I.has(o)||I.set(o,new Map);var b,_,E,A,j,k,J=I.get(o),tt=y.$r(o+.5),rt=y.$r(o);for([b,_]of tt.Br.entries()){let{dx:t,dy:r)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(,_:e,A:i}=Ot(m,b,J);0<=m&&m<4?(t=0,e=p,i=5,0===m?r=10:1===m?r=5:2===m?r=0:3===m&&(r=-5)):t-=p/2;var[et,it]=R(b,o);if(void 0!==et&&void 0!==it){if("X"===_)Y.fillStyle="red";else if("Y"===_)Y.fillStyle="green";else{if("Z"!==_)throw new Error("Not a pauli: "+_);Y.fillStyle="blue"}Y.fillRect(et-t,it-r,e,i)}}for(E of rt.qr){var{dx:g,dy:ot,_:at,A:nt}=Ot(m,E,J),[S,C]=(g-=p/2,R(E,o-.5));void 0!==S&&void 0!==C&&(Y.strokeStyle="magenta",Y.lineWidth=8,Y.strokeRect(S-g,C-ot,at,nt),Y.lineWidth=1,Y.fillStyle="black",Y.fillRect(S-g,C-ot,at,nt))}for({Wr:A,Vr:j,color:k}of rt.jr){var[st,ht]=R(A,o),[lt,ft]=R(j,o);"X"===k?Y.strokeStyle="red":"Y"===k?Y.strokeStyle="green":"Z"===k?Y.strokeStyle="blue":Y.strokeStyle="purple",Y.lineWidth=8,Pt(Y,st,ht,lt,ft),Y.lineWidth=1}}}t.globalAlpha*=.5,t.fillStyle="black";var vt,P,ct=Q(e.zr)+1.5*r-c/2+M;t.fillRect(ct,0,c,t.canvas.clientHeight),t.globalAlpha*=2,t.strokeStyle="black",t.fillStyle="black";for(vt of a){var[dt,wt]=Z(vt,-1),[ut,Xt]=Z(vt,i);t.beginPath(),t.moveTo(dt,wt),t.lineTo(ut,Xt))CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(,t.stroke()}for(let r=0;rZ(t,r),Zt=e.Jr.yt[r];if(void 0!==Zt)for(var Yt of Zt.nt())Yt.I(Mt,t)}t.restore(),t.strokeStyle="black",t.fillStyle="black",t.textAlign="right",t.textBaseline="middle";for(P of a){var[Rt,yt]=Z(P,u-1),mt=(Rt-=M,e.Jr.Rt[2*P]),pt=e.Jr.Rt[2*P+1];t.fillText(mt+`,${pt}:`,Rt,yt)}t.globalAlpha=.5;var It,bt=e.te,_t=e.re,O=e.ee;for(It of a){var[Et,T]=Z(It,u-1),[At,kt]=(Et-=M,o(It)),gt=At*O+e.ie,St=kt*O+e.oe;bt>t.canvas.clientWidth/2&&_t>=T-.55*Tt&&_t<=T+.55*Tt&&(t.beginPath(),t.moveTo(Et,T),t.lineTo(gt,St),t.stroke(),t.fillStyle="black",t.fillRect(gt-Nt/2*O,St-Nt/2*O,Nt*O,Nt*O),t.fillRect(t.canvas.clientWidth/2,T-Tt/3,t.canvas.clientWidth/2,2*Tt/3))}}finally{t.restore()}return new Dt(X,U,d)}class Z{constructor(t,r){if(32 32");this.t=r,this.ae=t,this.ne=new Uint32Array(r),this.se=new Uint32Array(r),this.flags=new Uint32Array(r)}st(){var r=new Z(this.ae,this.t);for(let t=0;t>=1,r>>=1,e>>=1,i>>=1}return s}static le(e){var t=e.length;if(0===t)throw new Error("strings.length === 0");var r,i=e[0].length;for(r of e)if(r.length!==i)throw new Error("Inconsistent string length.");var o=new Z(t,i);for(let r=0;r>e&1,o=this.ne[t]>>e&1,a=this.se[t]>>e&1;r+="_XZY!%$&"[o+2*a+4*i]}t.push(r)}return t}static ve(e,i){var o=new Z(e.length,i.length);for(let r=0;rt-r),["PropagatedPauliFrames {"]);for(t of r)e.push(` ${t}: `+this.Xe.get(t));return e.push("}"),e.join("\n")}$r(t){let r=this.Xe.get(t);return r=void 0===r?new Y(new Map,new Set,[]):r}static Me(r,e){var i=new x(new Map);let o=new Map;for(let t=0;tt[1]-r[1]);for(let r=t.yt.length-1;-1<=r;r--){var s,h=0<=r?t.yt[r]:new U,l=[...h.et.keys()];l.reverse();for(s of l){var f=h.et.get(s);if(f.R[0]===s){o.de(f.Z,[...f.R]);for(let t=f.m();0"X"===t[0])?c.fillStyle="red":Y.every(t=>"Y"===t[0])?c.fillStyle="green":Y.every(t=>"Z"===t[0])?c.fillStyle="blue":c.fillStyle="black",c.strokeStyle=c.fillStyle;var R,y,Z=Y.map(t=>t[1]);let n=0,s=0;for([R,y]of Z)n+=R,s+=y;n/=Z.length,s/=Z.leng)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(th,Z.sort((t,r)=>{var[t,e]=t,[r,i]=r;let o=Math.atan2(e-s,t-n),a=Math.atan2(i-s,r-n);return t===n&&e===s&&(o=-100),r===n&&i===s&&(a=-100),o-a}),C(c,Z),c.globalAlpha*=.25,c.fill(),c.globalAlpha*=4,c.lineWidth=2,c.stroke(),c.lineWidth=1}for([l,[f,v]]of Y){var{dx:m,dy:p,_:I,A:b}=Ot(X,f+":"+v,M);if("X"===l)c.fillStyle="red";else if("Y"===l)c.fillStyle="green";else{if("Z"!==l)throw new Error("Not a pauli: "+l);c.fillStyle="blue"}c.fillRect(f-m,v-p,I,b)}for(_ of Z=u.$r(d.zr).qr){var[_,E]=w(_),{dx:A,dy:k,_:g,A:S}=Ot(X,_+":"+E,M);c.lineWidth=X<0?2:8,c.strokeStyle="magenta",c.strokeRect(_-A,E-k,g,S),c.lineWidth=1,c.fillStyle="black",c.fillRect(_-A,E-k,g,S)}}}let Xt=!0;function L(t,r){t.save();try{Xt&&r()}finally{t.restore()}}function Mt(t){var r=window.devicePixelRatio||1;t.setTransform(r,0,0,r,0,0)}function Zt(Z,Y){var t,r=window.devicePixelRatio||1;Z.save(),Z.scale(r,r);let R=Y.Jr,e=0;for(t of R.yt)for(var i of t.it){var o=i.Z;"MARKX"!==o.name&&"MARKY"!==o.name&&"MARKZ"!==o.name||(e=Math.max(e,i.Y[0]+1))}let y=(t,r))CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(=>[t*O-H,r*O-z],m=t=>{var r=R.Rt[2*t],t=R.Rt[2*t+1];return y(r,t)},p=new Map;for(let t=0;t{Mt(Z),Z.clearRect(0,0,Z.canvas.clientWidth,Z.canvas.clientHeight),L(Z,()=>{Z.fillStyle="black";let r=.5;Y.ee<.85&&(r=1),Y.ee<.3&&(r=2),Z.save(),Z.beginPath(),Z.rect(N,0,Z.canvas.clientWidth-N,Z.canvas.clientHeight),Z.clip();for(let t=0;tr.R.length-t.R.length);for(o of h)"POLYGON"===o.Z.name&&o.I(m,Z);L(Z,()=>{Z.strokeStyle="black";for(let r=0;r{Z.globalAlpha*=.25;for(var[t,r]of Y.pe.values()){var[t,r]=y(t,r);Z.fillStyle="yellow",Z.fillRect(t-1.25*Ct,r-1.25*Ct,2.5*Ct,2.5*Ct)}}),L(Z,()=>{Z.globalAlpha*=.5;var r,e,[i,o]=D(Y.Ie.values());for([r,e]of Y.Ie.values()){var[a,n]=y(r,e);Z.fillStyle="blue";let t=1.25;r===i&&e===o&&(t=1.5),Z.fillRect(a-Ct*t,n-Ct*t,2*t*Ct,2*t*Ct)}}),ut(Z,Y,m,p),void 0!==t&&(Z.save(),Z.globalAlpha*=.5,[h,t]=y(t,r),Z.fillStyle="red",Z.fillRect(h-Ct,t-Ct,2*Ct,2*Ct),Z.restore()),L(Z,()=>{var t,r,e,i,o,a;Z.globalAlpha*=.25,Z.fillStyle="blue",void 0!==Y.be&&void 0!==Y.ye&&(t=Math.min(Y.ye,Y.be),r=Math.max(Y.ye,Y.be),e=Math.min(Y.me,Y._e),i=Math.max(Y.me,Y._e),--t,r+=1,--e,i+=1,t-=H,r-=H,e-=z,i-=z,Z.fillRect(t,e,r-t,i-e));for([o,a]of Y.Ee){var[n,s]=y(o,a);Z.fillRect(n-Ct,s-Ct,2*Ct,2*Ct)}})}),Mt(Z);r=dt(Z,Y,p,m,R.yt.length);Z.save();try{Z.strokeStyle="black",Z.translate(Math.floor(Z.canvas.clientWidth/2),0);for(let n=0;n0===t.$r(r).qr.size);0r.has(t))}}function Rt(r){let e=[1,0],i=[0,1];var o=(t,r)=>[t-r,t+r];r=(r%8+8)%8;for(let t=0;t[e[0]*t+i[0]*r,)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(e[1]*t+i[1]*r]}const o=Object.freeze({ke:"timeslice",ge:"timeline"});class yt{constructor(t,r,e,i,o){this.screenX=t,this.screenY=r,this.offsetX=e,this.offsetY=i,this.Se=o}}function mt(){try{return window.self===window.top}catch(t){}}class pt{constructor(){this.Ce=!1,this.Pe=void 0}Oe(){this.Pe={Te:!0}}Ne(t){this.Pe=t}De(){this.Pe=void 0}xe(t,r){if(!r.startsWith("#"))throw new Error('"Expected a hash URL: '+{Le:t,Fe:r});if(mt()&&this.Pe!==t)if(this.Ce)document.location.hash=r;else try{void 0===this.Pe?history.replaceState(t,"",r):(history.pushState(t,"",r),this.Pe=void 0)}catch(t){console.warn("Calling 'history.replaceState/pushState' failed. Falling back to setting location.hash.",t),this.Ce=!0,document.location.hash=r}}}function It(t){return"#circuit="+(t=-1===(t=t.replaceAll("QUBIT_COORDS","Q").replaceAll("DETECTOR","DT").replaceAll("OBSERVABLE_INCLUDE","OI").replaceAll(", ",",").replaceAll(") ",")").replaceAll(" ","_").replaceAll("\n",";")).indexOf("%")&&-1===t.indexOf("&")?t:encodeURIComponent(t))}let w=d)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(ocument.getElementById("toolbox"),X=10.5,M=["H","S","R","M","MR","C","W","SC","MC","P","1-9"],bt=[1,2,2,2,2,0,2,2,2,-1,-1,-1];let _t=function(){var r=new Map([["0,0",B.get("H_YZ")],["0,1",B.get("H")],["0,2",B.get("H_XY")],["1,0",B.get("SQRT_X")],["1,1",B.get("SQRT_Y")],["1,2",B.get("S")],["2,0",B.get("RX")],["2,1",B.get("RY")],["2,2",B.get("R")],["3,0",B.get("MX")],["3,1",B.get("MY")],["3,2",B.get("M")],["4,0",B.get("MRX")],["4,1",B.get("MRY")],["4,2",B.get("MRZ")],["5,0",B.get("CX")],["5,1",B.get("CY")],["5,2",B.get("CZ")],["6,0",B.get("CXSWAP")],["6,1",B.get("SWAP")],["6,2",B.get("CZSWAP")],["7,0",B.get("SQRT_XX")],["7,1",B.get("SQRT_YY")],["7,2",B.get("SQRT_ZZ")],["8,0",B.get("MXX")],["8,1",B.get("MYY")],["8,2",B.get("MZZ")]]);let e=9;for(let t=0;t<4;t++)r.set(e+",0",B.get("MARKX").M(t)),r.set(e+",1",B.get("MARKY").M(t)),r.set(e+",2",B.get("MARKZ").M(t)),r.set(e+",-1",B.get("MARK").M(t)),e+=1;return r}();function Et(t){var r,e=function(t){var r,e;if(!t.ctrlKey)return r=+t.zt.has("x"),e=+t.zt.has("y"),t=+t.)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(zt.has("z"),r&&!e&&!t||!r&&e&&t?{Ue:0,strength:Math.max(r,Math.min(e,t))}:!r&&e&&!t||r&&!e&&t?{Ue:1,strength:Math.max(e,Math.min(r,t))}:!r&&!e&&t||r&&e&&!t?{Ue:2,strength:Math.max(t,Math.min(r,e))}:void 0}(t),t=function(i){if(!i.ctrlKey){let e=void 0;for(let r=0;r=e.strength)&&(e={Ge:r,strength:t/M[r].length})}return e}}(t);let i=e,o=(void 0!==t&&void 0===e&&(r=bt[t.Ge],i=void 0===r?void 0:{strength:0,Ue:r}),void 0);return void 0!==i&&void 0!==t&&(r=t.Ge+","+i.Ue,_t.has(r))&&(o=_t.get(r)),{He:e,ze:i,Ke:t,Qe:o}}const At=-O+Math.floor(O/4)+.5,kt=-O+Math.floor(O/4)+.5;var t=document.getElementById("btnInsertLayer"),gt=document.getElementById("btnDeleteLayer"),St=document.getElementById("btnUndo"),xt=document.getElementById("btnRedo"),Lt=document.getElementById("btnClearMarkers");const Ft=document.getElementById("btnShowHideImportExport");var Ut=document.getElementById("btnNextLayer"),Gt=document.ge)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(tElementById("btnPrevLayer"),Ht=document.getElementById("btnRotate45"),zt=document.getElementById("btnRotate45Counter"),Kt=document.getElementById("btnExport"),Qt=document.getElementById("btnImport"),$t=document.getElementById("clear");const e=document.getElementById("txtStimCircuit");var Bt=document.getElementById("btnTimelineFocus"),qt=document.getElementById("btnClearTimelineFocus"),Wt=document.getElementById("btnClearSelectedMarkers"),Vt=document.getElementById("btnShowExamples");const v=document.getElementById("examples-dialog");var jt=document.getElementById("examples-close-button");e.addEventListener("keyup",t=>t.stopPropagation()),e.addEventListener("keydown",t=>t.stopPropagation());let R=new class{constructor(t){this.rev=ct.Sr(""),this.canvas=t,this.me=void 0,this.ye=void 0,this.$e=new ht,this.zr=0,this.Ie=new Map,this.pe=new Map,this.be=void 0,this._e=void 0,this.Be=new vt(this.qe(void 0)),this.te=void 0,this.re=void 0,this.ie=0,this.oe=0,this.ee=1,this.Qr=0,this.Kr=0,this.We=!1,this.Ve=void 0}je(t))CRUMBLE_PART"); + result.append(R"CRUMBLE_PART({var r,e,i,o=this.Je(),a=o.yt[this.zr],n=new Set,s=new Map;for(r of[["CX","reverse"],["CY","reverse"],["XCY","reverse"],["CXSWAP","reverse"],["XCZ","reverse"],["XCY","reverse"],["YCX","reverse"],["SWAPCX","reverse"],["RX","MX"],["R","M"],["RY","MY"]])s.set(r[0],r[1]),s.set(r[1],r[0]);for(e of this.Ie.keys()){var h=a.et.get(o.Ut().get(e));void 0!==h&&s.has(h.Z.name)&&n.add(h.R[0])}for(i of n){var l=a.et.get(i),f=s.get(l.Z.name);"reverse"===f?a.et.get(i).R.reverse():l.Z=B.get(f)}this.ti(o,t)}ri(t){var r=this.Je();let e=this.zr;for(;e"MARKX"!==t.Z.name&&"MARKY"!==t.Z.name&&"MARKZ"!==t.Z.name);this.commit(r)}hi(i){var t=this.ye,r=this.me,o=this.be,a=this._e,n=[];if(void 0!==t&&void 0!==o){var[s,h]=wt(o,a),l=Math.min(t,o),f=Math.max(t,o),v=Math.min(r,a),c=Math.max(r,a),t=O/4-Ct;l+=t,f-=t,v+=t,c-=t,l=Math.floor(2*l/O+.5)/2,f=Math.floor(2*f/O+.5)/2,v=Math.floor(2*v/O+.5)/2,c=Math.floor(2*c/O+.5)/2;let e=1;l!=f&&v!=c||(e=2);for(let r=l;r<=f;r+=.5)for(let t=v;t<=c)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(;t+=.5)r%1!=t%1||i&&(s%e!=r%e||h%e!=t%e)||n.push([r,t])}return n}vi(o,t,r){let e=this.Je();e=e.kt(o),!t&&r&&(this.pe=(r=t=>{var r,e,i=new Map;for([r,e]of t.values())[r,e]=o(r,e),i.set(r+","+e,[r,e]);return i})(this.pe),this.Ie=r(this.Ie)),this.ti(e,t)}ci(t){var[r,e]=wt(this.ye,this.me),[i,o]=D(this.Ie.values());let a=new Map;if(void 0!==r&&void 0!==i){var n,s,h,l=r-i,f=e-o,v=new Map;for([n,s]of this.Ie.values()){var c=n+","+s,d=n+l,w=s+f,u=d+","+w;a.set(c,[d,w]),v.set(u,[n,s])}for(h of v.keys())if(!a.has(h)){let[t,r]=v.get(h);for(;;){var X=v.get(t+","+r);if(void 0===X)break;[t,r]=X}a.set(h,[t,r])}}else{if(2!==this.Ie.size)return;var[[r,i],[e,o]]=[...this.Ie.values()],M=e+","+o;a.set(r+","+i,[e,o]),a.set(M,[r,i])}this.vi((t,r)=>{var e=a.get(t+","+r);return void 0!==e?e:[t,r]},t,!0)}di(t,r){let e=Rt(t),i=this.Je().kt(e).gt();this.vi((t,r)=>([t,r]=e(t,r),i(t,r)),r,!0)}wi(t){this.zr=Math.max(t,0),this.Qr=0,this.ii()}ui(t,r,e){r||e||this.Ie.clear();for(var[i,o]of t){var a=i+","+o;e&&this.Ie.has(a)?this.Ie.delete(a)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART():this.Ie.set(a,[i,o])}this.ii()}Xi(t){var r,e=new Map,i=this.Je().yt[this.zr];for(r of[...t]){var o=i.et.get(r);if(void 0!==o)if("RX"===o.Z.name||"MX"===o.Z.name||"MRX"===o.Z.name)e.set(r,"X");else if("RY"===o.Z.name||"MY"===o.Z.name||"MRY"===o.Z.name)e.set(r,"Y");else if("R"===o.Z.name||"M"===o.Z.name||"MR"===o.Z.name)e.set(r,"Z");else if("MXX"===o.Z.name||"MYY"===o.Z.name||"MZZ"===o.Z.name){var a,n=o.Z.name[1];for(a of o.R)e.set(a,n)}else if(o.Z.name.startsWith("MPP:")&&void 0===o.Z.h&&o.R.length===o.Z.name.length-4){var s=o.Z.name.substring(4);for(let t=0;t{var[t,e)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(]=t,[r,i]=r;return Math.atan2(e-a,t-o)-Math.atan2(i-a,r-o)});var s=this.Je().Ft(this.Ie.values()),h=s.Ut(),l=new Uint32Array(this.Ie.size);for(let t=0;t!t.Z.na)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(me.startsWith("MARK")||t.Y[0]!==r)}this.ti(i,t)}_i(t,i){var r,e=this.Je(),o=x.Me(e,i),a=this.zr,n=0===a?new Y(new Map,new Set,[]):o.$r(a-.5),s=o.$r(a+.5),h=e.yt[a],l=new Set;for(r of new Set([...n.Br.keys(),...s.Br.keys()]))if(!l.has(r)){var f=n.Br.get(r),v=s.Br.get(r),c=h.et.get(r);if(void 0!==c){var d=c.Z.name;let e=void 0;if("R"===d||"M"===d||"MR"===d)e="Z";else if("RX"===d||"MX"===d||"MRX"===d)e="X";else{if("RY"!==d&&"MY"!==d&&"MRY"!==d){if("MXX"===d||"MYY"===d||"MZZ"===d){e=d[1];let t=0;for(var w of c.R){if(l.has(w)){t=-1;break}t+=n.Br.get(w)===e}if(2===t)for(var u of c.R)l.add(u),h.it.push(new F(B.get("MARK"+e),"",new Float32Array([i]),new Uint32Array([u])));continue}if(d.startsWith("MPP:")){let r=0;for(let t=0;tc.R.length/2)for(let t=0;t{var t,r,{Nt:e,Dt:i}=n.Pt(!1);for(let t=0;tt.Z.name!==e.Z.name||t.Y[0]!==e.Y[0])}this.ti(a,t)}}}(document.getElementById("cvn"));function y(t){return(t-R.ie)/R.ee+At}function m(t){return(t-R.oe)/R.ee+kt}function Jt(){var t=window.devicePixelRatio||1;R.canvas.width=R.canvas.scrollWidth*t,R.canvas.height=R.canvas.scrollHeight*t}function tr(){var t=R.Je().xt().replaceAll("\nPOLYGON","\n#!pragma POLYGON").replaceAll("\nERR","\n#!pragma ERR").replaceAll("\nMARK","\n#!pragma MARK"),r=e;r.value=t+"\n",r.focus(),r.select()}Kt.addEventListener("click",t=>{tr()}),Qt.addEventListener("click",t=>{var r=e.value,r=u.It(r);R.commit(r)}),Ft.addEventListener("click",t=>{var r=document.getElementById("divImportExport");"none"===r.style.display?(r.style.display="block",Ft.textContent="Hide Import/Export",tr()):(r.style.display="none",Ft.textContent="Show Import/Export",e.value=""),setTimeout(()=>{window.scrollTo(0,0),Jt(),R.ii()},0)}),$t.addEventListener("click",t=)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(>{R.li()}),St.addEventListener("click",t=>{R.Nr()}),Bt.addEventListener("click",t=>{R.pe=new Map(R.Ie.entries()),R.ii()}),Wt.addEventListener("click",t=>{R.Zi(!1),R.ii()}),Vt.addEventListener("click",t=>{v.open?v.close():v.showModal()}),jt.addEventListener("click",t=>{v.close()}),v.addEventListener("click",t=>{t.target===v&&v.close()}),qt.addEventListener("click",t=>{R.pe=new Map,R.ii()}),xt.addEventListener("click",t=>{R.Dr()}),Lt.addEventListener("click",t=>{R.fi()}),Ht.addEventListener("click",t=>{R.di(1,!1)}),zt.addEventListener("click",t=>{R.di(-1,!1)}),t.addEventListener("click",t=>{R.ni(!1)}),gt.addEventListener("click",t=>{R.ai(!1)}),Ut.addEventListener("click",t=>{R.wi(R.zr+1)}),Gt.addEventListener("click",t=>{R.wi(R.zr-1)}),window.addEventListener("resize",t=>{Jt(),R.ii()}),R.canvas.addEventListener("mousemove",t=>{var r,e,i;R.te=t.offsetX,R.re=t.offsetY,R.We?(r=(i=R.Ve).offsetX+(t.offsetX-i.screenX),e=i.offsetY+(t.offsetY-i.screenY),i.Se===o.ke?(R.ie=r,R.oe=e):(R.Qr=r,R.Kr=e),er(),R.ii()):(R.ye=y(t)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(.offsetX),R.me=m(t.offsetY),i=R.canvas.scrollWidth/2,rr&&1===t.buttons?R.wi(Math.floor((t.offsetX-i)/8)):R.ii())});let rr=!1;function er(){var t=R.canvas.scrollWidth/2,r=R.canvas.scrollHeight,e=R.ee,i=-1*O-At,o=T*O-At;R.ie=Math.max(t-o*e,Math.min(-i*e,R.ie)),R.oe=Math.max(r-o*e,Math.min(-i*e,R.oe)),R.Kr=Math.min(0,R.Kr)}R.canvas.addEventListener("mousedown",t=>{var r,e=R.canvas.scrollWidth/2;1===t.button?(t.preventDefault(),R.We=!0,r=t.offsetX>e?o.ge:o.ke,R.Ve=new yt(t.offsetX,t.offsetY,r===o.ke?R.ie:R.Qr,r===o.ke?R.oe:R.Kr,r)):(R.te=t.offsetX,R.re=t.offsetY,R.ye=y(t.offsetX),R.me=m(t.offsetY),R.be=y(t.offsetX),R._e=m(t.offsetY),(rr=t.offsetY<20&&t.offsetX>e&&1===t.buttons)?R.wi(Math.floor((t.offsetX-e)/8)):R.ii())}),R.canvas.addEventListener("mouseup",t=>{var r;1===t.button?(R.We=!1,R.Ve=void 0):(r=R.hi(t.altKey),R.be=void 0,R._e=void 0,R.te=t.offsetX,R.re=t.offsetY,R.ye=y(t.offsetX),R.me=m(t.offsetY),R.ui(r,t.shiftKey,t.ctrlKey),1===t.buttons&&(rr=!1))}),R.canvas.addEventListener("wheel",t=>{t.preventDefaul)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(t();var r,e=R.canvas.scrollWidth/2;t.offsetX>e?(e=t,R.Qr-=e.deltaX,R.Kr-=e.deltaY):((e=t).ctrlKey||e.metaKey?(t=e.deltaY<0?1.05:1/1.05,r=(t=Math.max(.25,Math.min(4,R.ee*t)))/R.ee,R.ee=t,R.ie=e.offsetX-(e.offsetX-R.ie)*r,R.oe=e.offsetY-(e.offsetY-R.oe)*r):(R.ie-=e.deltaX,R.oe-=e.deltaY),R.ye=y(e.offsetX),R.me=m(e.offsetY)),er(),R.ii()},{passive:!1});let ir=void 0;async function or(){let e=R.Je();e.yt=[e.yt[R.zr]],0{var r=e.Rt[2*t],t=e.Rt[2*t+1];return R.Ie.has(r+","+t)}),[r,t]=D(R.Ie.values()),e=e.Ct(-r,-t));var t,r=e.xt();ir=r;try{await navigator.clipboard.writeText(r)}catch(t){console.warn("Failed to write to clipboard. Using fallback emulated clipboard.",t)}}async function ar(e){let i;try{i=await navigator.clipboard.readText()}catch(t){console.warn("Failed to read from clipboard. Using fallback emulated clipboard.",t),i=ir}if(void 0!==i){let r=u.It(i);if(1!==r.yt.length)throw new Error(i);let t=R.Je();0R.di(-1,t)),o.set("t",t=>R.di(1,t)),o.set("escape",()=>{v.open?v.close():R.ei()}),o.set("delete",t=>R.oi(t)),o.set("backspace",t=>R.oi(t)),o.set("ctrl+delete",t=>R.ai(t)),o.set("ctrl+insert",t=>R.ni(t)),o.set("ctrl+backspace",t=>R.ai(t)),o.set("ctrl+z",t=>{t||R.Nr()}),o.set("ctrl+y",t=>{t||R.Dr()}),o.set("ctrl+shift+z",t=>{t||R.Dr()}),o.set("ctrl+c",async t=>{await or()}),o.set("ctrl+v",ar),o.set("ctrl+x",async t=>{var r;await or(),0===R.Ie.size?((r=R.Je()).yt[R.zr].et.clear(),r.yt[R.zr].it.length=0,R.ti(r,t)):R.oi(t)}),o.set("l",t=>{t||(R.pe=new Map(R.Ie.entries()),R.ii())}),o.set(" ",t=>R.Zi(t));for(let[t,r]of[["1",0],["2",1],["3",2],["4",3],["5",4],)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(["6",5],["7",6],["8",7],["9",8],["0",9],["-",10],["=",11],["\\",12],["`",13]])o.set(""+t,t=>R.Mi(t,r)),o.set(t+"+x",t=>R.mi(t,B.get("MARKX").M(r))),o.set(t+"+y",t=>R.mi(t,B.get("MARKY").M(r))),o.set(t+"+z",t=>R.mi(t,B.get("MARKZ").M(r))),o.set(t+"+d",t=>R.bi(t,r)),o.set(t+"+o",t=>R.pi(t,r)),o.set(t+"+j",t=>R.Ei(t,r)),o.set(t+"+k",t=>R._i(t,r));let r=.25;function a(t,r,e=void 0){for(var i of t){if(o.has(i))throw new Error("Chord collision: "+i);o.set(i,t=>R.mi(t,B.get(r)))}void 0!==e&&a(t.map(t=>"shift+"+t),e)}return o.set("p",t=>R.mi(t,B.get("POLYGON"),[1,0,0,r])),o.set("alt+p",t=>R.mi(t,B.get("POLYGON"),[0,1,0,r])),o.set("shift+p",t=>R.mi(t,B.get("POLYGON"),[0,0,1,r])),o.set("p+x",t=>R.mi(t,B.get("POLYGON"),[1,0,0,r])),o.set("p+y",t=>R.mi(t,B.get("POLYGON"),[0,1,0,r])),o.set("p+z",t=>R.mi(t,B.get("POLYGON"),[0,0,1,r])),o.set("p+x+y",t=>R.mi(t,B.get("POLYGON"),[1,1,0,r])),o.set("p+x+z",t=>R.mi(t,B.get("POLYGON"),[1,0,1,r])),o.set("p+y+z",t=>R.mi(t,B.get("POLYGON"),[0,1,1,r])),o.set("p+x+y+z",t=>R.mi(t,B.get(")CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(POLYGON"),[1,1,1,r])),o.set("m+p+x",t=>R.mi(t,f("X".repeat(R.Ie.size)),[])),o.set("m+p+y",t=>R.mi(t,f("Y".repeat(R.Ie.size)),[])),o.set("m+p+z",t=>R.mi(t,f("Z".repeat(R.Ie.size)),[])),o.set("f",t=>R.je(t)),o.set("g",t=>R.ri(t)),o.set("shift+>",t=>R.vi((t,r)=>[t+1,r],t,!1)),o.set("shift+<",t=>R.vi((t,r)=>[t-1,r],t,!1)),o.set("shift+v",t=>R.vi((t,r)=>[t,r+1],t,!1)),o.set("shift+^",t=>R.vi((t,r)=>[t,r-1],t,!1)),o.set(">",t=>R.vi((t,r)=>[t+1,r],t,!1)),o.set("<",t=>R.vi((t,r)=>[t-1,r],t,!1)),o.set("v",t=>R.vi((t,r)=>[t,r+1],t,!1)),o.set("^",t=>R.vi((t,r)=>[t,r-1],t,!1)),o.set(".",t=>R.vi((t,r)=>[t+.5,r+.5],t,!1)),o.set("b",t=>R.ci(t)),a(["h","h+y","h+x+z"],"H","H"),a(["h+z","h+x+y"],"H_XY","H_XY"),a(["h+x","h+y+z"],"H_YZ","H_YZ"),a(["s+x","s+y+z"],"SQRT_X","SQRT_X_DAG"),a(["s+y","s+x+z"],"SQRT_Y","SQRT_Y_DAG"),a(["s","s+z","s+x+y"],"S","S_DAG"),a(["r+x","r+y+z"],"RX"),a(["r+y","r+x+z"],"RY"),a(["r","r+z","r+x+y"],"R"),a(["m+x","m+y+z"],"MX"),a(["m+y","m+x+z"],"MY"),a(["m","m+z","m+x+y"],"M"),a(["m+r+x","m+r+y+z"],)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART("MRX"),a(["m+r+y","m+r+x+z"],"MRY"),a(["m+r","m+r+z","m+r+x+y"],"MR"),a(["c"],"CX","CX"),a(["c+x"],"CX","CX"),a(["c+y"],"CY","CY"),a(["c+z"],"CZ","CZ"),a(["j+x"],"X","X"),a(["j+y"],"Y","Y"),a(["j+z"],"Z","Z"),a(["c+x+y"],"XCY","XCY"),a(["alt+c+x"],"XCX","XCX"),a(["alt+c+y"],"YCY","YCY"),a(["w"],"SWAP","SWAP"),a(["w+x"],"CXSWAP",void 0),a(["c+w+x"],"CXSWAP",void 0),a(["i+w"],"ISWAP","ISWAP_DAG"),a(["w+z"],"CZSWAP",void 0),a(["c+w+z"],"CZSWAP",void 0),a(["c+w"],"CZSWAP",void 0),a(["c+t"],"C_XYZ","C_ZYX"),a(["c+s+x"],"SQRT_XX","SQRT_XX_DAG"),a(["c+s+y"],"SQRT_YY","SQRT_YY_DAG"),a(["c+s+z"],"SQRT_ZZ","SQRT_ZZ_DAG"),a(["c+s"],"SQRT_ZZ","SQRT_ZZ_DAG"),a(["c+m+x"],"MXX","MXX"),a(["c+m+y"],"MYY","MYY"),a(["c+m+z"],"MZZ","MZZ"),a(["c+m"],"MZZ","MZZ"),o}();function sr(r){if(R.$e.jt(r),"keydown"===r.type){if("q"===r.key.toLowerCase())return e=r.shiftKey?5:1,void R.wi(R.zr-e);if("e"===r.key.toLowerCase())return e=r.shiftKey?5:1,void R.wi(R.zr+e);if("Home"===r.key)return R.wi(0),void r.preventDefault();if("End"===r.key)re)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(turn R.wi(R.Je().yt.length-1),void r.preventDefault()}var t=R.$e.Bt;if(0!==t.length){for(var e=t[t.length-1];0{R.Be.set(R.qe(void 0));var t=R.$e.qt(!1),r=window.devicePixelRatio||1,a=(w.width=w.scrollWidth*r,w.height=w.scrollHeight*r,w.getContext("2d"));a.save(),a.scale(r,r),a.clearRect(0,0,w.scrollWidth,w.scrollHeight),a.textAlign="right",a.textBaseline="middle",a.fillText("X",7.5,24.5),a.fillText("Y",7.5,56.5),a.fillText("Z",7.5,88.5),a.textAlign="center",a.textBaseline="bottom";for(let t=0;t{try{var t,r=(()=>{var t=document.location.hash.substring(1),r=new Map;if(""!==t)for(var e of t.split("&")){var i,o=e.indexOf("=");-1!==o&&(i=e.substring(0,o),e=decodeURIComponent(e.substring(o+1)),r.set(i,e))}return r})(),e=(r.has("circuit")||("[[[DEFAULT-CIRCUIT-CONTENT-LITERAL]]]"===(t=document.getElementById("txtDefaultCircuit")).value.replaceAll("_","-")?r.set("circuit",""):r.set("circuit",t.value)),u.It(r.get("circuit"))),i=e.xt();hr.clear(i),e.yt.every(t=>t.ut())&&1===r.size&&i===r.get("circuit")?lr.De():lr.xe(i,It(i))}catch(t){throw new Error(t)}},window.addEventListener("popstate",Kt),Kt(),hr.kr().Yr().Zr(1).subscribe(t=>{lr.xe(t,It(t))})}R.Be.mr().subscribe(r=>requestAnimationFrame(()=>{var t=Zt(R.canvas.getContext("2d"),r);R.Qr=Math.max(t.Fr,Math.min(R.Qr,t.Ur)),R.Kr=Math.max(R.Kr,-t.Gr)})),window.addEventListener("focus",()=>{R.$e.Vt()}),window.addEventListener("blur",()=>{R.$e.Vt()});for(let r of docu)CRUMBLE_PART"); + result.append(R"CRUMBLE_PART(ment.getElementById("examples-div").querySelectorAll("a"))r.onclick=t=>{if(!(t.shiftKey||t.ctrlKey||t.altKey||0!==t.button))return t=r.href.split("#circuit=")[1],R.rev.commit(t),v.close(),!1}; )CRUMBLE_PART"); result.append(R"CRUMBLE_PART( )CRUMBLE_PART");