UNPKG

@jsenv/terminal-recorder

Version:

Record terminal output as .svg, .gif, .webm, .mp4

389 lines (370 loc) 106 kB
/* on veut pouvoir: - mettre le terminal dans un "fake terminal" genre avec le style de celui svg - enregister une vidéo du terminal ça faut que je regarde les apis canvas https://github.com/welefen/canvas2video/blob/master/src/index.ts https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/captureStream https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder https://webglfundamentals.org/webgl/lessons/webgl-tips.html https://github.com/xtermjs/xterm.js/blob/master/typings/xterm.d.ts */ import "/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-fit/lib/addon-fit.js?v=0.10.0"; import "/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.js?as_js_module&v=0.13.0"; // see https://github.com/microsoft/playwright/issues/30585 which is a problem for mac os 14 import "/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-webgl/lib/addon-webgl.js?v=0.18.0"; // https://github.com/xtermjs/xterm.js/tree/master/addons/addon-webgl import "/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/xterm/lib/xterm.js?v=5.5.0"; import { createGifEncoder } from "/gif_encoder.js"; const { Terminal } = window; const { FitAddon } = window.FitAddon; const { WebglAddon } = window.WebglAddon; const { SerializeAddon } = window.SerializeAddon; export const initTerminal = ({ cols = 80, rows = 25, paddingLeft = 15, paddingRight = 15, fontFamily = "SauceCodePro Nerd Font, Source Code Pro, Courier", fontSize = 12, convertEol = true, textInViewport, gif, video, logs, }) => { if (textInViewport === true) textInViewport = {}; if (gif === true) gif = {}; if (video === true) video = {}; if (!textInViewport && !video && !gif) { throw new Error("ansi, video or gif must be enabled"); } const log = (...args) => { if (logs) { console.log(...args); } }; log("init", { cols, rows, fontFamily, fontSize, convertEol, gif, video }); const cssUrl = new URL("/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/xterm/css/xterm.css?v=5.5.0", import.meta.url); const link = document.createElement("link"); link.rel = "stylesheet"; link.href = cssUrl; document.head.appendChild(link); const term = new Terminal({ convertEol, disableStdin: true, // cursorBlink: false, cursorInactiveStyle: "none", cols, rows, fontFamily, fontSize, // lineHeight: 18, theme: { background: "#282c34", foreground: "#abb2bf", selectionBackground: "#001122", selectionForeground: "#777777", brightRed: "#B22222", brightBlue: "#87CEEB", }, }); const serializeAddon = new SerializeAddon(); term.loadAddon(serializeAddon); const fitAddon = new FitAddon(); term.loadAddon(fitAddon); const webglAddon = new WebglAddon( // we pass true to enable preserveDrawingBuffer // it's not actually useful thanks to term.write callback + // call on _innerRefresh() before context.drawImage // but let's keep it nevertheless true, ); term.loadAddon(webglAddon); const terminalElement = document.querySelector("#terminal"); term.open(terminalElement); fitAddon.fit(); const canvas = document.querySelector("#canvas"); if (!canvas) { throw new Error('Cannot find <canvas id="canvas"> in the document'); } const xTermCanvasSelector = "#terminal canvas.xterm-link-layer + canvas"; const xtermCanvas = document.querySelector(xTermCanvasSelector); if (!xtermCanvas) { throw new Error(`Cannot find xterm canvas (${xTermCanvasSelector})`); } return { term, startRecording: async () => { const context = canvas.getContext("2d", { willReadFrequently: true }); context.imageSmoothingEnabled = true; const headerHeight = 40; canvas.width = paddingLeft + xtermCanvas.width + paddingRight; canvas.height = headerHeight + xtermCanvas.height; draw_header: { drawRectangle(context, { x: 0, y: 0, width: canvas.width, height: canvas.height, fill: "#282c34", stroke: "rgba(255,255,255,0.35)", strokeWidth: 10, radius: 8, }); drawCircle(context, { x: 20, y: headerHeight / 2, radius: 6, fill: "#ff5f57", }); drawCircle(context, { x: 40, y: headerHeight / 2, radius: 6, fill: "#febc2e", }); drawCircle(context, { x: 60, y: headerHeight / 2, radius: 6, fill: "#28c840", }); // https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Drawing_text const text = "Terminal"; context.font = `${fontSize}px ${fontFamily}`; context.textBaseline = "middle"; context.textAlign = "center"; // const textSize = context.measureText(text); context.fillStyle = "#abb2bf"; context.fillText(text, canvas.width / 2, headerHeight / 2); } const records = {}; let writePromise = Promise.resolve(); const frameCallbackSet = new Set(); const stopCallbackSet = new Set(); if (textInViewport) { log("start recording text in viewport"); // https://github.com/xtermjs/xterm.js/issues/3681 // https://github.com/xtermjs/xterm.js/issues/3681 // get the first line // term.buffer.active.getLine(term.buffer.active.viewportY).translateToString() // get the last line // term.buffer.active.getLine(term.buffer.active.length -1).translateToString() // https://github.com/xtermjs/xterm.js/blob/a7952ff36c60ee6dce9141744b1355a5d582ee39/addons/addon-serialize/src/SerializeAddon.ts stopCallbackSet.add(() => { const startY = term.buffer.active.viewportY; const endY = term.buffer.active.length - 1; const range = { start: startY, end: endY, }; log(`lines in viewport: ${startY}:${endY}`); const output = serializeAddon.serialize({ range, }); log(`text in viewport: ${output}`); records.textInViewport = output; }); } if (video) { log("start recording video"); const { mimeType = "video/webm;codecs=h264", msAddedAtTheEnd } = video; if (!MediaRecorder.isTypeSupported(mimeType)) { throw new Error(`MediaRecorder does not support "${mimeType}"`); } const stream = canvas.captureStream(); const mediaRecorder = new MediaRecorder(stream, { videoBitsPerSecond: 2_500_000, mimeType, }); const chunks = []; mediaRecorder.ondataavailable = (e) => { if (e.data && e.data.size) { chunks.push(e.data); } }; log("starting media recorder"); const startPromise = new Promise((resolve, reject) => { mediaRecorder.onstart = () => { resolve(); }; mediaRecorder.onerror = (e) => { log("media recorder error"); reject(e); }; mediaRecorder.start(); }); let timeout; let hasTimedout = false; const MS_ALLOCATED_TO_MEDIA_RECORDER = 2_000; await Promise.race([ startPromise, new Promise((resolve) => { timeout = setTimeout(() => { hasTimedout = true; resolve(); }, MS_ALLOCATED_TO_MEDIA_RECORDER); }), ]); if (hasTimedout) { throw new Error( `media recorder did not start in less than ${MS_ALLOCATED_TO_MEDIA_RECORDER}ms`, ); } clearTimeout(timeout); log("media recorder started"); stopCallbackSet.add(async () => { if (msAddedAtTheEnd) { await new Promise((resolve) => { setTimeout(resolve, msAddedAtTheEnd); }); replicateXterm(); } else { replicateXterm(); } await new Promise((resolve) => { setTimeout(resolve, 150); }); await new Promise((resolve, reject) => { mediaRecorder.onstop = () => { resolve(); }; mediaRecorder.onerror = (e) => { reject(e); }; mediaRecorder.stop(); }); const blob = new Blob(chunks, { type: mediaRecorder.mimeType }); const videoBinaryString = await new Promise((resolve, reject) => { const reader = new FileReader(); reader.onloadend = () => resolve(reader.result); reader.onerror = reject; reader.readAsBinaryString(blob); }); records.video = videoBinaryString; }); } if (gif) { log("start recording gif"); const { repeat = -1, quality, msAddedAtTheEnd } = gif; const gifEncoder = createGifEncoder({ width: canvas.width, height: canvas.height, repeat: repeat === true ? 0 : repeat === false ? -1 : repeat, quality, }); frameCallbackSet.add(({ delay }) => { log(`add frame to gif with delay of ${delay}ms`); gifEncoder.addFrame(context, { delay }); }); stopCallbackSet.add(async () => { const now = Date.now(); drawFrame({ delay: now - previousTime, }); if (msAddedAtTheEnd) { drawFrame({ delay: now - msAddedAtTheEnd, }); } gifEncoder.finish(); log("gif recording stopped"); const gifBinaryString = gifEncoder.readAsBinaryString(); records.gif = gifBinaryString; }); log("gif recorder started"); } const startTime = Date.now(); let previousTime = startTime; let isFirstDraw = true; const drawFrame = (options) => { for (const frameCallback of frameCallbackSet) { frameCallback(options); } }; const replicateXterm = () => { context.drawImage( xtermCanvas, 0, 0, xtermCanvas.width, xtermCanvas.height, paddingLeft, headerHeight, xtermCanvas.width, xtermCanvas.height, ); }; replicateXterm(); return { writeIntoTerminal: async (data, options = {}) => { if (isFirstDraw) { isFirstDraw = false; drawFrame({ delay: 0 }); } let { delay } = options; if (delay === undefined) { const now = Date.now(); delay = now - previousTime; } writePromise = new Promise((resolve) => { log(`write data:`, data); term.write(data, () => { term._core._renderService._renderDebouncer._innerRefresh(); replicateXterm(); drawFrame({ delay }); resolve(); }); }); await writePromise; }, stopRecording: async () => { await writePromise; const promises = []; for (const stopCallback of stopCallbackSet) { promises.push(stopCallback()); } await Promise.all(promises); return records; }, }; }, }; }; const drawRectangle = ( context, { x, y, width, height, radius, fill, stroke, strokeWidth }, ) => { context.beginPath(); if (radius) { context.roundRect(x, y, width, height, [radius]); } else { context.rect(x, y, width, height); } if (fill) { context.fillStyle = fill; context.fill(); } if (stroke) { context.strokeWidth = strokeWidth; context.strokeStyle = stroke; context.stroke(); } }; const drawCircle = (context, { x, y, radius, fill, stroke, borderWidth }) => { context.beginPath(); context.arc(x, y, radius, 0, 2 * Math.PI, false); if (fill) { context.fillStyle = fill; context.fill(); } if (borderWidth) { context.lineWidth = 5; } if (stroke) { context.strokeStyle = stroke; context.stroke(); } }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL3BhY2thZ2VzL3Rvb2xpbmcvdGVybWluYWwtcmVjb3JkZXIvc3JjL2NsaWVudC90ZXJtaW5hbF9yZWNvcmRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxub24gdmV1dCBwb3V2b2lyOlxuLSBtZXR0cmUgbGUgdGVybWluYWwgZGFucyB1biBcImZha2UgdGVybWluYWxcIiBnZW5yZVxuYXZlYyBsZSBzdHlsZSBkZSBjZWx1aSBzdmdcbi0gZW5yZWdpc3RlciB1bmUgdmlkw6lvIGR1IHRlcm1pbmFsXG7Dp2EgZmF1dCBxdWUgamUgcmVnYXJkZSBsZXMgYXBpcyBjYW52YXNcblxuaHR0cHM6Ly9naXRodWIuY29tL3dlbGVmZW4vY2FudmFzMnZpZGVvL2Jsb2IvbWFzdGVyL3NyYy9pbmRleC50c1xuaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0hUTUxDYW52YXNFbGVtZW50L2NhcHR1cmVTdHJlYW1cbmh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9NZWRpYVJlY29yZGVyXG5odHRwczovL3dlYmdsZnVuZGFtZW50YWxzLm9yZy93ZWJnbC9sZXNzb25zL3dlYmdsLXRpcHMuaHRtbFxuaHR0cHM6Ly9naXRodWIuY29tL3h0ZXJtanMveHRlcm0uanMvYmxvYi9tYXN0ZXIvdHlwaW5ncy94dGVybS5kLnRzXG4qL1xuXG5pbXBvcnQgXCJAeHRlcm0vYWRkb24tZml0XCI7XG5pbXBvcnQgXCJAeHRlcm0vYWRkb24tc2VyaWFsaXplP2FzX2pzX21vZHVsZVwiO1xuLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvcGxheXdyaWdodC9pc3N1ZXMvMzA1ODUgd2hpY2ggaXMgYSBwcm9ibGVtIGZvciBtYWMgb3MgMTRcbmltcG9ydCBcIkB4dGVybS9hZGRvbi13ZWJnbFwiOyAvLyBodHRwczovL2dpdGh1Yi5jb20veHRlcm1qcy94dGVybS5qcy90cmVlL21hc3Rlci9hZGRvbnMvYWRkb24td2ViZ2xcbmltcG9ydCBcIkB4dGVybS94dGVybVwiO1xuaW1wb3J0IHsgY3JlYXRlR2lmRW5jb2RlciB9IGZyb20gXCIuL2dpZl9lbmNvZGVyLmpzXCI7XG5cbmNvbnN0IHsgVGVybWluYWwgfSA9IHdpbmRvdztcbmNvbnN0IHsgRml0QWRkb24gfSA9IHdpbmRvdy5GaXRBZGRvbjtcbmNvbnN0IHsgV2ViZ2xBZGRvbiB9ID0gd2luZG93LldlYmdsQWRkb247XG5jb25zdCB7IFNlcmlhbGl6ZUFkZG9uIH0gPSB3aW5kb3cuU2VyaWFsaXplQWRkb247XG5cbmV4cG9ydCBjb25zdCBpbml0VGVybWluYWwgPSAoe1xuICBjb2xzID0gODAsXG4gIHJvd3MgPSAyNSxcbiAgcGFkZGluZ0xlZnQgPSAxNSxcbiAgcGFkZGluZ1JpZ2h0ID0gMTUsXG4gIGZvbnRGYW1pbHkgPSBcIlNhdWNlQ29kZVBybyBOZXJkIEZvbnQsIFNvdXJjZSBDb2RlIFBybywgQ291cmllclwiLFxuICBmb250U2l6ZSA9IDEyLFxuICBjb252ZXJ0RW9sID0gdHJ1ZSxcbiAgdGV4dEluVmlld3BvcnQsXG4gIGdpZixcbiAgdmlkZW8sXG4gIGxvZ3MsXG59KSA9PiB7XG4gIGlmICh0ZXh0SW5WaWV3cG9ydCA9PT0gdHJ1ZSkgdGV4dEluVmlld3BvcnQgPSB7fTtcbiAgaWYgKGdpZiA9PT0gdHJ1ZSkgZ2lmID0ge307XG4gIGlmICh2aWRlbyA9PT0gdHJ1ZSkgdmlkZW8gPSB7fTtcbiAgaWYgKCF0ZXh0SW5WaWV3cG9ydCAmJiAhdmlkZW8gJiYgIWdpZikge1xuICAgIHRocm93IG5ldyBFcnJvcihcImFuc2ksIHZpZGVvIG9yIGdpZiBtdXN0IGJlIGVuYWJsZWRcIik7XG4gIH1cblxuICBjb25zdCBsb2cgPSAoLi4uYXJncykgPT4ge1xuICAgIGlmIChsb2dzKSB7XG4gICAgICBjb25zb2xlLmxvZyguLi5hcmdzKTtcbiAgICB9XG4gIH07XG5cbiAgbG9nKFwiaW5pdFwiLCB7IGNvbHMsIHJvd3MsIGZvbnRGYW1pbHksIGZvbnRTaXplLCBjb252ZXJ0RW9sLCBnaWYsIHZpZGVvIH0pO1xuXG4gIGNvbnN0IGNzc1VybCA9IG5ldyBVUkwoXCJAeHRlcm0veHRlcm0vY3NzL3h0ZXJtLmNzc1wiLCBpbXBvcnQubWV0YS51cmwpO1xuICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIik7XG4gIGxpbmsucmVsID0gXCJzdHlsZXNoZWV0XCI7XG4gIGxpbmsuaHJlZiA9IGNzc1VybDtcbiAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcblxuICBjb25zdCB0ZXJtID0gbmV3IFRlcm1pbmFsKHtcbiAgICBjb252ZXJ0RW9sLFxuICAgIGRpc2FibGVTdGRpbjogdHJ1ZSxcbiAgICAvLyBjdXJzb3JCbGluazogZmFsc2UsXG4gICAgY3Vyc29ySW5hY3RpdmVTdHlsZTogXCJub25lXCIsXG4gICAgY29scyxcbiAgICByb3dzLFxuICAgIGZvbnRGYW1pbHksXG4gICAgZm9udFNpemUsXG4gICAgLy8gbGluZUhlaWdodDogMTgsXG4gICAgdGhlbWU6IHtcbiAgICAgIGJhY2tncm91bmQ6IFwiIzI4MmMzNFwiLFxuICAgICAgZm9yZWdyb3VuZDogXCIjYWJiMmJmXCIsXG4gICAgICBzZWxlY3Rpb25CYWNrZ3JvdW5kOiBcIiMwMDExMjJcIixcbiAgICAgIHNlbGVjdGlvbkZvcmVncm91bmQ6IFwiIzc3Nzc3N1wiLFxuICAgICAgYnJpZ2h0UmVkOiBcIiNCMjIyMjJcIixcbiAgICAgIGJyaWdodEJsdWU6IFwiIzg3Q0VFQlwiLFxuICAgIH0sXG4gIH0pO1xuICBjb25zdCBzZXJpYWxpemVBZGRvbiA9IG5ldyBTZXJpYWxpemVBZGRvbigpO1xuICB0ZXJtLmxvYWRBZGRvbihzZXJpYWxpemVBZGRvbik7XG4gIGNvbnN0IGZpdEFkZG9uID0gbmV3IEZpdEFkZG9uKCk7XG4gIHRlcm0ubG9hZEFkZG9uKGZpdEFkZG9uKTtcbiAgY29uc3Qgd2ViZ2xBZGRvbiA9IG5ldyBXZWJnbEFkZG9uKFxuICAgIC8vIHdlIHBhc3MgdHJ1ZSB0byBlbmFibGUgcHJlc2VydmVEcmF3aW5nQnVmZmVyXG4gICAgLy8gaXQncyBub3QgYWN0dWFsbHkgdXNlZnVsIHRoYW5rcyB0byB0ZXJtLndyaXRlIGNhbGxiYWNrICtcbiAgICAvLyBjYWxsIG9uIF9pbm5lclJlZnJlc2goKSBiZWZvcmUgY29udGV4dC5kcmF3SW1hZ2VcbiAgICAvLyBidXQgbGV0J3Mga2VlcCBpdCBuZXZlcnRoZWxlc3NcbiAgICB0cnVlLFxuICApO1xuICB0ZXJtLmxvYWRBZGRvbih3ZWJnbEFkZG9uKTtcbiAgY29uc3QgdGVybWluYWxFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiN0ZXJtaW5hbFwiKTtcbiAgdGVybS5vcGVuKHRlcm1pbmFsRWxlbWVudCk7XG4gIGZpdEFkZG9uLmZpdCgpO1xuXG4gIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjY2FudmFzXCIpO1xuICBpZiAoIWNhbnZhcykge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZpbmQgPGNhbnZhcyBpZD1cImNhbnZhc1wiPiBpbiB0aGUgZG9jdW1lbnQnKTtcbiAgfVxuICBjb25zdCB4VGVybUNhbnZhc1NlbGVjdG9yID0gXCIjdGVybWluYWwgY2FudmFzLnh0ZXJtLWxpbmstbGF5ZXIgKyBjYW52YXNcIjtcbiAgY29uc3QgeHRlcm1DYW52YXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHhUZXJtQ2FudmFzU2VsZWN0b3IpO1xuICBpZiAoIXh0ZXJtQ2FudmFzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCB4dGVybSBjYW52YXMgKCR7eFRlcm1DYW52YXNTZWxlY3Rvcn0pYCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRlcm0sXG4gICAgc3RhcnRSZWNvcmRpbmc6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgICAgY29udGV4dC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSB0cnVlO1xuICAgICAgY29uc3QgaGVhZGVySGVpZ2h0ID0gNDA7XG4gICAgICBjYW52YXMud2lkdGggPSBwYWRkaW5nTGVmdCArIHh0ZXJtQ2FudmFzLndpZHRoICsgcGFkZGluZ1JpZ2h0O1xuICAgICAgY2FudmFzLmhlaWdodCA9IGhlYWRlckhlaWdodCArIHh0ZXJtQ2FudmFzLmhlaWdodDtcbiAgICAgIGRyYXdfaGVhZGVyOiB7XG4gICAgICAgIGRyYXdSZWN0YW5nbGUoY29udGV4dCwge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMCxcbiAgICAgICAgICB3aWR0aDogY2FudmFzLndpZHRoLFxuICAgICAgICAgIGhlaWdodDogY2FudmFzLmhlaWdodCxcbiAgICAgICAgICBmaWxsOiBcIiMyODJjMzRcIixcbiAgICAgICAgICBzdHJva2U6IFwicmdiYSgyNTUsMjU1LDI1NSwwLjM1KVwiLFxuICAgICAgICAgIHN0cm9rZVdpZHRoOiAxMCxcbiAgICAgICAgICByYWRpdXM6IDgsXG4gICAgICAgIH0pO1xuICAgICAgICBkcmF3Q2lyY2xlKGNvbnRleHQsIHtcbiAgICAgICAgICB4OiAyMCxcbiAgICAgICAgICB5OiBoZWFkZXJIZWlnaHQgLyAyLFxuICAgICAgICAgIHJhZGl1czogNixcbiAgICAgICAgICBmaWxsOiBcIiNmZjVmNTdcIixcbiAgICAgICAgfSk7XG4gICAgICAgIGRyYXdDaXJjbGUoY29udGV4dCwge1xuICAgICAgICAgIHg6IDQwLFxuICAgICAgICAgIHk6IGhlYWRlckhlaWdodCAvIDIsXG4gICAgICAgICAgcmFkaXVzOiA2LFxuICAgICAgICAgIGZpbGw6IFwiI2ZlYmMyZVwiLFxuICAgICAgICB9KTtcbiAgICAgICAgZHJhd0NpcmNsZShjb250ZXh0LCB7XG4gICAgICAgICAgeDogNjAsXG4gICAgICAgICAgeTogaGVhZGVySGVpZ2h0IC8gMixcbiAgICAgICAgICByYWRpdXM6IDYsXG4gICAgICAgICAgZmlsbDogXCIjMjhjODQwXCIsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DYW52YXNfQVBJL1R1dG9yaWFsL0RyYXdpbmdfdGV4dFxuICAgICAgICBjb25zdCB0ZXh0ID0gXCJUZXJtaW5hbFwiO1xuICAgICAgICBjb250ZXh0LmZvbnQgPSBgJHtmb250U2l6ZX1weCAke2ZvbnRGYW1pbHl9YDtcbiAgICAgICAgY29udGV4dC50ZXh0QmFzZWxpbmUgPSBcIm1pZGRsZVwiO1xuICAgICAgICBjb250ZXh0LnRleHRBbGlnbiA9IFwiY2VudGVyXCI7XG4gICAgICAgIC8vIGNvbnN0IHRleHRTaXplID0gY29udGV4dC5tZWFzdXJlVGV4dCh0ZXh0KTtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBcIiNhYmIyYmZcIjtcbiAgICAgICAgY29udGV4dC5maWxsVGV4dCh0ZXh0LCBjYW52YXMud2lkdGggLyAyLCBoZWFkZXJIZWlnaHQgLyAyKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVjb3JkcyA9IHt9O1xuICAgICAgbGV0IHdyaXRlUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgY29uc3QgZnJhbWVDYWxsYmFja1NldCA9IG5ldyBTZXQoKTtcbiAgICAgIGNvbnN0IHN0b3BDYWxsYmFja1NldCA9IG5ldyBTZXQoKTtcbiAgICAgIGlmICh0ZXh0SW5WaWV3cG9ydCkge1xuICAgICAgICBsb2coXCJzdGFydCByZWNvcmRpbmcgdGV4dCBpbiB2aWV3cG9ydFwiKTtcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3h0ZXJtanMveHRlcm0uanMvaXNzdWVzLzM2ODFcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3h0ZXJtanMveHRlcm0uanMvaXNzdWVzLzM2ODFcbiAgICAgICAgLy8gZ2V0IHRoZSBmaXJzdCBsaW5lXG4gICAgICAgIC8vIHRlcm0uYnVmZmVyLmFjdGl2ZS5nZXRMaW5lKHRlcm0uYnVmZmVyLmFjdGl2ZS52aWV3cG9ydFkpLnRyYW5zbGF0ZVRvU3RyaW5nKClcbiAgICAgICAgLy8gZ2V0IHRoZSBsYXN0IGxpbmVcbiAgICAgICAgLy8gdGVybS5idWZmZXIuYWN0aXZlLmdldExpbmUodGVybS5idWZmZXIuYWN0aXZlLmxlbmd0aCAtMSkudHJhbnNsYXRlVG9TdHJpbmcoKVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20veHRlcm1qcy94dGVybS5qcy9ibG9iL2E3OTUyZmYzNmM2MGVlNmRjZTkxNDE3NDRiMTM1NWE1ZDU4MmVlMzkvYWRkb25zL2FkZG9uLXNlcmlhbGl6ZS9zcmMvU2VyaWFsaXplQWRkb24udHNcbiAgICAgICAgc3RvcENhbGxiYWNrU2V0LmFkZCgoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3RhcnRZID0gdGVybS5idWZmZXIuYWN0aXZlLnZpZXdwb3J0WTtcbiAgICAgICAgICBjb25zdCBlbmRZID0gdGVybS5idWZmZXIuYWN0aXZlLmxlbmd0aCAtIDE7XG4gICAgICAgICAgY29uc3QgcmFuZ2UgPSB7XG4gICAgICAgICAgICBzdGFydDogc3RhcnRZLFxuICAgICAgICAgICAgZW5kOiBlbmRZLFxuICAgICAgICAgIH07XG4gICAgICAgICAgbG9nKGBsaW5lcyBpbiB2aWV3cG9ydDogJHtzdGFydFl9OiR7ZW5kWX1gKTtcbiAgICAgICAgICBjb25zdCBvdXRwdXQgPSBzZXJpYWxpemVBZGRvbi5zZXJpYWxpemUoe1xuICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbG9nKGB0ZXh0IGluIHZpZXdwb3J0OiAke291dHB1dH1gKTtcbiAgICAgICAgICByZWNvcmRzLnRleHRJblZpZXdwb3J0ID0gb3V0cHV0O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh2aWRlbykge1xuICAgICAgICBsb2coXCJzdGFydCByZWNvcmRpbmcgdmlkZW9cIik7XG4gICAgICAgIGNvbnN0IHsgbWltZVR5cGUgPSBcInZpZGVvL3dlYm07Y29kZWNzPWgyNjRcIiwgbXNBZGRlZEF0VGhlRW5kIH0gPSB2aWRlbztcbiAgICAgICAgaWYgKCFNZWRpYVJlY29yZGVyLmlzVHlwZVN1cHBvcnRlZChtaW1lVHlwZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lZGlhUmVjb3JkZXIgZG9lcyBub3Qgc3VwcG9ydCBcIiR7bWltZVR5cGV9XCJgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHJlYW0gPSBjYW52YXMuY2FwdHVyZVN0cmVhbSgpO1xuICAgICAgICBjb25zdCBtZWRpYVJlY29yZGVyID0gbmV3IE1lZGlhUmVjb3JkZXIoc3RyZWFtLCB7XG4gICAgICAgICAgdmlkZW9CaXRzUGVyU2Vjb25kOiAyXzUwMF8wMDAsXG4gICAgICAgICAgbWltZVR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBjaHVua3MgPSBbXTtcbiAgICAgICAgbWVkaWFSZWNvcmRlci5vbmRhdGFhdmFpbGFibGUgPSAoZSkgPT4ge1xuICAgICAgICAgIGlmIChlLmRhdGEgJiYgZS5kYXRhLnNpemUpIHtcbiAgICAgICAgICAgIGNodW5rcy5wdXNoKGUuZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBsb2coXCJzdGFydGluZyBtZWRpYSByZWNvcmRlclwiKTtcbiAgICAgICAgY29uc3Qgc3RhcnRQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIG1lZGlhUmVjb3JkZXIub25zdGFydCA9ICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIG1lZGlhUmVjb3JkZXIub25lcnJvciA9IChlKSA9PiB7XG4gICAgICAgICAgICBsb2coXCJtZWRpYSByZWNvcmRlciBlcnJvclwiKTtcbiAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIG1lZGlhUmVjb3JkZXIuc3RhcnQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCB0aW1lb3V0O1xuICAgICAgICBsZXQgaGFzVGltZWRvdXQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgTVNfQUxMT0NBVEVEX1RPX01FRElBX1JFQ09SREVSID0gMl8wMDA7XG4gICAgICAgIGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgICAgc3RhcnRQcm9taXNlLFxuICAgICAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIGhhc1RpbWVkb3V0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSwgTVNfQUxMT0NBVEVEX1RPX01FRElBX1JFQ09SREVSKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChoYXNUaW1lZG91dCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBtZWRpYSByZWNvcmRlciBkaWQgbm90IHN0YXJ0IGluIGxlc3MgdGhhbiAke01TX0FMTE9DQVRFRF9UT19NRURJQV9SRUNPUkRFUn1tc2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgIGxvZyhcIm1lZGlhIHJlY29yZGVyIHN0YXJ0ZWRcIik7XG5cbiAgICAgICAgc3RvcENhbGxiYWNrU2V0LmFkZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKG1zQWRkZWRBdFRoZUVuZCkge1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBtc0FkZGVkQXRUaGVFbmQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXBsaWNhdGVYdGVybSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXBsaWNhdGVYdGVybSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCAxNTApO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIG1lZGlhUmVjb3JkZXIub25zdG9wID0gKCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbWVkaWFSZWNvcmRlci5vbmVycm9yID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG1lZGlhUmVjb3JkZXIuc3RvcCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihjaHVua3MsIHsgdHlwZTogbWVkaWFSZWNvcmRlci5taW1lVHlwZSB9KTtcbiAgICAgICAgICBjb25zdCB2aWRlb0JpbmFyeVN0cmluZyA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgICByZWFkZXIub25sb2FkZW5kID0gKCkgPT4gcmVzb2x2ZShyZWFkZXIucmVzdWx0KTtcbiAgICAgICAgICAgIHJlYWRlci5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyhibG9iKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZWNvcmRzLnZpZGVvID0gdmlkZW9CaW5hcnlTdHJpbmc7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGdpZikge1xuICAgICAgICBsb2coXCJzdGFydCByZWNvcmRpbmcgZ2lmXCIpO1xuICAgICAgICBjb25zdCB7IHJlcGVhdCA9IC0xLCBxdWFsaXR5LCBtc0FkZGVkQXRUaGVFbmQgfSA9IGdpZjtcbiAgICAgICAgY29uc3QgZ2lmRW5jb2RlciA9IGNyZWF0ZUdpZkVuY29kZXIoe1xuICAgICAgICAgIHdpZHRoOiBjYW52YXMud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBjYW52YXMuaGVpZ2h0LFxuICAgICAgICAgIHJlcGVhdDogcmVwZWF0ID09PSB0cnVlID8gMCA6IHJlcGVhdCA9PT0gZmFsc2UgPyAtMSA6IHJlcGVhdCxcbiAgICAgICAgICBxdWFsaXR5LFxuICAgICAgICB9KTtcbiAgICAgICAgZnJhbWVDYWxsYmFja1NldC5hZGQoKHsgZGVsYXkgfSkgPT4ge1xuICAgICAgICAgIGxvZyhgYWRkIGZyYW1lIHRvIGdpZiB3aXRoIGRlbGF5IG9mICR7ZGVsYXl9bXNgKTtcbiAgICAgICAgICBnaWZFbmNvZGVyLmFkZEZyYW1lKGNvbnRleHQsIHsgZGVsYXkgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzdG9wQ2FsbGJhY2tTZXQuYWRkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGRyYXdGcmFtZSh7XG4gICAgICAgICAgICBkZWxheTogbm93IC0gcHJldmlvdXNUaW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChtc0FkZGVkQXRUaGVFbmQpIHtcbiAgICAgICAgICAgIGRyYXdGcmFtZSh7XG4gICAgICAgICAgICAgIGRlbGF5OiBub3cgLSBtc0FkZGVkQXRUaGVFbmQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZ2lmRW5jb2Rlci5maW5pc2goKTtcbiAgICAgICAgICBsb2coXCJnaWYgcmVjb3JkaW5nIHN0b3BwZWRcIik7XG4gICAgICAgICAgY29uc3QgZ2lmQmluYXJ5U3RyaW5nID0gZ2lmRW5jb2Rlci5yZWFkQXNCaW5hcnlTdHJpbmcoKTtcbiAgICAgICAgICByZWNvcmRzLmdpZiA9IGdpZkJpbmFyeVN0cmluZztcbiAgICAgICAgfSk7XG4gICAgICAgIGxvZyhcImdpZiByZWNvcmRlciBzdGFydGVkXCIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgbGV0IHByZXZpb3VzVGltZSA9IHN0YXJ0VGltZTtcbiAgICAgIGxldCBpc0ZpcnN0RHJhdyA9IHRydWU7XG4gICAgICBjb25zdCBkcmF3RnJhbWUgPSAob3B0aW9ucykgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGZyYW1lQ2FsbGJhY2sgb2YgZnJhbWVDYWxsYmFja1NldCkge1xuICAgICAgICAgIGZyYW1lQ2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlcGxpY2F0ZVh0ZXJtID0gKCkgPT4ge1xuICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShcbiAgICAgICAgICB4dGVybUNhbnZhcyxcbiAgICAgICAgICAwLFxuICAgICAgICAgIDAsXG4gICAgICAgICAgeHRlcm1DYW52YXMud2lkdGgsXG4gICAgICAgICAgeHRlcm1DYW52YXMuaGVpZ2h0LFxuICAgICAgICAgIHBhZGRpbmdMZWZ0LFxuICAgICAgICAgIGhlYWRlckhlaWdodCxcbiAgICAgICAgICB4dGVybUNhbnZhcy53aWR0aCxcbiAgICAgICAgICB4dGVybUNhbnZhcy5oZWlnaHQsXG4gICAgICAgICk7XG4gICAgICB9O1xuXG4gICAgICByZXBsaWNhdGVYdGVybSgpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB3cml0ZUludG9UZXJtaW5hbDogYXN5bmMgKGRhdGEsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICAgIGlmIChpc0ZpcnN0RHJhdykge1xuICAgICAgICAgICAgaXNGaXJzdERyYXcgPSBmYWxzZTtcbiAgICAgICAgICAgIGRyYXdGcmFtZSh7IGRlbGF5OiAwIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgeyBkZWxheSB9ID0gb3B0aW9ucztcbiAgICAgICAgICBpZiAoZGVsYXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGRlbGF5ID0gbm93IC0gcHJldmlvdXNUaW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgICB3cml0ZVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgbG9nKGB3cml0ZSBkYXRhOmAsIGRhdGEpO1xuICAgICAgICAgICAgdGVybS53cml0ZShkYXRhLCAoKSA9PiB7XG4gICAgICAgICAgICAgIHRlcm0uX2NvcmUuX3JlbmRlclNlcnZpY2UuX3JlbmRlckRlYm91bmNlci5faW5uZXJSZWZyZXNoKCk7XG4gICAgICAgICAgICAgIHJlcGxpY2F0ZVh0ZXJtKCk7XG4gICAgICAgICAgICAgIGRyYXdGcmFtZSh7IGRlbGF5IH0pO1xuICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBhd2FpdCB3cml0ZVByb21pc2U7XG4gICAgICAgIH0sXG4gICAgICAgIHN0b3BSZWNvcmRpbmc6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB3cml0ZVByb21pc2U7XG4gICAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHN0b3BDYWxsYmFjayBvZiBzdG9wQ2FsbGJhY2tTZXQpIHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2goc3RvcENhbGxiYWNrKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICAgICAgcmV0dXJuIHJlY29yZHM7XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0sXG4gIH07XG59O1xuXG5jb25zdCBkcmF3UmVjdGFuZ2xlID0gKFxuICBjb250ZXh0LFxuICB7IHgsIHksIHdpZHRoLCBoZWlnaHQsIHJhZGl1cywgZmlsbCwgc3Ryb2tlLCBzdHJva2VXaWR0aCB9LFxuKSA9PiB7XG4gIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIGlmIChyYWRpdXMpIHtcbiAgICBjb250ZXh0LnJvdW5kUmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBbcmFkaXVzXSk7XG4gIH0gZWxzZSB7XG4gICAgY29udGV4dC5yZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuICB9XG4gIGlmIChmaWxsKSB7XG4gICAgY29udGV4dC5maWxsU3R5bGUgPSBmaWxsO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuICB9XG4gIGlmIChzdHJva2UpIHtcbiAgICBjb250ZXh0LnN0cm9rZVdpZHRoID0gc3Ryb2tlV2lkdGg7XG4gICAgY29udGV4dC5zdHJva2VTdHlsZSA9IHN0cm9rZTtcbiAgICBjb250ZXh0LnN0cm9rZSgpO1xuICB9XG59O1xuY29uc3QgZHJhd0NpcmNsZSA9IChjb250ZXh0LCB7IHgsIHksIHJhZGl1cywgZmlsbCwgc3Ryb2tlLCBib3JkZXJXaWR0aCB9KSA9PiB7XG4gIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIGNvbnRleHQuYXJjKHgsIHksIHJhZGl1cywgMCwgMiAqIE1hdGguUEksIGZhbHNlKTtcbiAgaWYgKGZpbGwpIHtcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGZpbGw7XG4gICAgY29udGV4dC5maWxsKCk7XG4gIH1cbiAgaWYgKGJvcmRlcldpZHRoKSB7XG4gICAgY29udGV4dC5saW5lV2lkdGggPSA1O1xuICB9XG4gIGlmIChzdHJva2UpIHtcbiAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gc3Ryb2tlO1xuICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gIH1cbn07XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQztBQUNELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRXJDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9ELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0UsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRSxDQUFDOztBQUVELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUdBQWtCO0FBQ3pCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsNEhBQXFDO0FBQzVDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx1R0FBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDBGQUFjO0FBQ3JCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFrQjs7QUFFbkQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFaEQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNYLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNYLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNOLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RCxDQUFDLENBQUM7O0FBRUYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFCLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDSixDQUFDLENBQUMsQ0FBQzs7QUFFSCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFM0UsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywyRkFBNEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRWpDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25DLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1IsQ0FBQyxDQUFDLENBQUM7QUFDSCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUVoQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkUsQ0FBQyxDQUFDO0FBQ0YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEUsQ0FBQyxDQUFDOztBQUVGLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUF