summary refs log tree commit diff stats
path: root/src/dist
diff options
context:
space:
mode:
Diffstat (limited to 'src/dist')
-rw-r--r--src/dist/2550f2a2ba04229047d1.svg1
-rw-r--r--src/dist/699d230654d2f7111166.svg1
-rw-r--r--src/dist/7c595cc952560306ed09.svg1
-rw-r--r--src/dist/7dbefbfd70a575bc4e88.svg1
-rw-r--r--src/dist/919.main.js1
-rw-r--r--src/dist/9b252ac3c64df27e39dc.svg1
-rw-r--r--src/dist/9d17ab5e13c8e97f7b64.module.wasmbin0 -> 17337 bytes
-rw-r--r--src/dist/b1238fb7eda76106bcfa.svg1
-rw-r--r--src/dist/b429fdfeed5479b1300f.svg1
-rw-r--r--src/dist/b8dd0ce607bca97aa45c.svg1
-rw-r--r--src/dist/index.html45
-rw-r--r--src/dist/main.js1
12 files changed, 55 insertions, 0 deletions
diff --git a/src/dist/2550f2a2ba04229047d1.svg b/src/dist/2550f2a2ba04229047d1.svg
new file mode 100644
index 0000000..4e78038
--- /dev/null
+++ b/src/dist/2550f2a2ba04229047d1.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-pause"><rect x="6" y="4" width="4" height="16"></rect><rect x="14" y="4" width="4" height="16"></rect></svg>
\ No newline at end of file
diff --git a/src/dist/699d230654d2f7111166.svg b/src/dist/699d230654d2f7111166.svg
new file mode 100644
index 0000000..0e7f060
--- /dev/null
+++ b/src/dist/699d230654d2f7111166.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-camera"><path d="M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z"></path><circle cx="12" cy="13" r="4"></circle></svg>
\ No newline at end of file
diff --git a/src/dist/7c595cc952560306ed09.svg b/src/dist/7c595cc952560306ed09.svg
new file mode 100644
index 0000000..fd76e30
--- /dev/null
+++ b/src/dist/7c595cc952560306ed09.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-play"><polygon points="5 3 19 12 5 21 5 3"></polygon></svg>
\ No newline at end of file
diff --git a/src/dist/7dbefbfd70a575bc4e88.svg b/src/dist/7dbefbfd70a575bc4e88.svg
new file mode 100644
index 0000000..daa3e25
--- /dev/null
+++ b/src/dist/7dbefbfd70a575bc4e88.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-camera-off"><line x1="1" y1="1" x2="23" y2="23"></line><path d="M21 21H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h3m3-3h6l2 3h4a2 2 0 0 1 2 2v9.34m-7.72-2.06a4 4 0 1 1-5.56-5.56"></path></svg>
\ No newline at end of file
diff --git a/src/dist/919.main.js b/src/dist/919.main.js
new file mode 100644
index 0000000..948cc6f
--- /dev/null
+++ b/src/dist/919.main.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkwasm_app=self.webpackChunkwasm_app||[]).push([[919],{9:(e,t,n)=>{n.a(e,(async(e,i)=>{try{n.d(t,{Ws:()=>r.Ws});var o=n(407),r=n(987),a=e([o]);o=(a.then?(await a)():a)[0],(0,r.lI)(o),i()}catch(e){i(e)}}))},987:(e,t,n)=>{let i;function o(e){i=e}n.d(t,{RR:()=>p,Ws:()=>d,lI:()=>o}),e=n.hmd(e);let r=new("undefined"==typeof TextDecoder?(0,e.require)("util").TextDecoder:TextDecoder)("utf-8",{ignoreBOM:!0,fatal:!0});r.decode();let a=null;function c(){return null!==a&&0!==a.byteLength||(a=new Uint8Array(i.memory.buffer)),a}let s=0,u=new("undefined"==typeof TextEncoder?(0,e.require)("util").TextEncoder:TextEncoder)("utf-8");const l="function"==typeof u.encodeInto?function(e,t){return u.encodeInto(e,t)}:function(e,t){const n=u.encode(e);return t.set(n),{read:e.length,written:n.length}};function d(e){const t=function(e,t,n){if(void 0===n){const n=u.encode(e),i=t(n.length,1)>>>0;return c().subarray(i,i+n.length).set(n),s=n.length,i}let i=e.length,o=t(i,1)>>>0;const r=c();let a=0;for(;a<i;a++){const t=e.charCodeAt(a);if(t>127)break;r[o+a]=t}if(a!==i){0!==a&&(e=e.slice(a)),o=n(o,i,i=a+3*e.length,1)>>>0;const t=c().subarray(o+a,o+i);a+=l(e,t).written,o=n(o,i,a,1)>>>0}return s=a,o}(e,i.__wbindgen_malloc,i.__wbindgen_realloc),n=s;i.process_image(t,n)}function p(e,t){var n,i;alert((n=e,i=t,n>>>=0,r.decode(c().subarray(n,n+i))))}},208:(e,t,n)=>{n.d(t,{A:()=>L});var i=n(601),o=n.n(i),r=n(314),a=n.n(r),c=n(417),s=n.n(c),u=new URL(n(649),n.b),l=new URL(n(717),n.b),d=new URL(n(666),n.b),p=new URL(n(970),n.b),h=new URL(n(846),n.b),f=new URL(n(778),n.b),v=new URL(n(147),n.b),g=new URL(n(13),n.b),b=a()(o()),m=s()(u),y=s()(l),w=s()(d),x=s()(p),A=s()(h),k=s()(f),R=s()(v),T=s()(g);b.push([e.id,`.btn {\n  width: 40px;\n  height: 40px;\n}\n\n.btn-shot {\n  background-size: cover;\n}\n.btn-shot.active {\n  background-image: url(${m});\n}\n.btn-shot.non-active {\n  background-image: url(${y});\n}\n\n.btn-pause {\n  background-image: url(${w});\n  background-size: cover;\n}\n.btn-play {\n  background-image: url(${x});\n  background-size: cover;\n}\n.btn-confirm {\n  background-image: url(${A});\n  background-size: cover;\n}\n.btn-log-del {\n  background-image: url(${k});\n  background-size: cover;\n}\n.btn-log-hide.active {\n  background-image: url(${R});\n  background-size: cover;\n}\n.btn-log-hide.non-active {\n  background-image: url(${T});\n  background-size: cover;\n}\n\n.content .output .overlay {\n  /* 50% of view-port width/height */\n  width: 50vw;\n  height: 25vh;\n\n  position: absolute;\n  left: 25vw;\n  top: 0;\n\n  border: dotted green 1px;\n}\n.content .controls {\n  display: flex;\n  flex-direction: row;\n\n  position: absolute;\n  left: 25vw;\n  /* This is but a start value, it will be changed at run time */\n  top: 25vh;\n}\ndiv.output > img {\n  z-index: 2;\n}\ndiv.output > video {\n  z-index: 1;\n}\ndiv.output > canvas {\n  z-index: -1; /* The canvas is only here for drawing the picture to show in img */\n}\n\n#console {\n  position: absolute;\n    /* This is but a start value, it will be changed at run time */\n  top: 27vh;\n}\n`,""]);const L=b},314:e=>{e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n="",i=void 0!==t[5];return t[4]&&(n+="@supports (".concat(t[4],") {")),t[2]&&(n+="@media ".concat(t[2]," {")),i&&(n+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),n+=e(t),i&&(n+="}"),t[2]&&(n+="}"),t[4]&&(n+="}"),n})).join("")},t.i=function(e,n,i,o,r){"string"==typeof e&&(e=[[null,e,void 0]]);var a={};if(i)for(var c=0;c<this.length;c++){var s=this[c][0];null!=s&&(a[s]=!0)}for(var u=0;u<e.length;u++){var l=[].concat(e[u]);i&&a[l[0]]||(void 0!==r&&(void 0===l[5]||(l[1]="@layer".concat(l[5].length>0?" ".concat(l[5]):""," {").concat(l[1],"}")),l[5]=r),n&&(l[2]?(l[1]="@media ".concat(l[2]," {").concat(l[1],"}"),l[2]=n):l[2]=n),o&&(l[4]?(l[1]="@supports (".concat(l[4],") {").concat(l[1],"}"),l[4]=o):l[4]="".concat(o)),t.push(l))}},t}},417:e=>{e.exports=function(e,t){return t||(t={}),e?(e=String(e.__esModule?e.default:e),/^['"].*['"]$/.test(e)&&(e=e.slice(1,-1)),t.hash&&(e+=t.hash),/["'() \t\n]|(%20)/.test(e)||t.needQuotes?'"'.concat(e.replace(/"/g,'\\"').replace(/\n/g,"\\n"),'"'):e):e}},601:e=>{e.exports=function(e){return e[1]}},72:e=>{var t=[];function n(e){for(var n=-1,i=0;i<t.length;i++)if(t[i].identifier===e){n=i;break}return n}function i(e,i){for(var r={},a=[],c=0;c<e.length;c++){var s=e[c],u=i.base?s[0]+i.base:s[0],l=r[u]||0,d="".concat(u," ").concat(l);r[u]=l+1;var p=n(d),h={css:s[1],media:s[2],sourceMap:s[3],supports:s[4],layer:s[5]};if(-1!==p)t[p].references++,t[p].updater(h);else{var f=o(h,i);i.byIndex=c,t.splice(c,0,{identifier:d,updater:f,references:1})}a.push(d)}return a}function o(e,t){var n=t.domAPI(t);return n.update(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap&&t.supports===e.supports&&t.layer===e.layer)return;n.update(e=t)}else n.remove()}}e.exports=function(e,o){var r=i(e=e||[],o=o||{});return function(e){e=e||[];for(var a=0;a<r.length;a++){var c=n(r[a]);t[c].references--}for(var s=i(e,o),u=0;u<r.length;u++){var l=n(r[u]);0===t[l].references&&(t[l].updater(),t.splice(l,1))}r=s}}},659:e=>{var t={};e.exports=function(e,n){var i=function(e){if(void 0===t[e]){var n=document.querySelector(e);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}t[e]=n}return t[e]}(e);if(!i)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");i.appendChild(n)}},540:e=>{e.exports=function(e){var t=document.createElement("style");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}},56:(e,t,n)=>{e.exports=function(e){var t=n.nc;t&&e.setAttribute("nonce",t)}},825:e=>{e.exports=function(e){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var t=e.insertStyleElement(e);return{update:function(n){!function(e,t,n){var i="";n.supports&&(i+="@supports (".concat(n.supports,") {")),n.media&&(i+="@media ".concat(n.media," {"));var o=void 0!==n.layer;o&&(i+="@layer".concat(n.layer.length>0?" ".concat(n.layer):""," {")),i+=n.css,o&&(i+="}"),n.media&&(i+="}"),n.supports&&(i+="}");var r=n.sourceMap;r&&"undefined"!=typeof btoa&&(i+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r))))," */")),t.styleTagTransform(i,e,t.options)}(t,e,n)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},113:e=>{e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}},539:(e,t,n)=>{n.d(t,{O:()=>a,Y:()=>r});var i=n(173),o=n(272);function r(){const e=i.Ji.getContext("2d");e.fillStyle="#AAA",e.fillRect(0,0,i.Ji.width,i.Ji.height);const t=i.Ji.toDataURL("image/png");i.c.setAttribute("src",t),i.c.style["z-index"]=1}function a(){const e=(0,i.FA)();(0,o.Rm)(`w: ${i.MB}; h: ${e}`);const t=i.Ji.getContext("2d");i.Ji.width=i.MB,i.Ji.height=e,t.drawImage(i.Ki,0,0,i.MB,e);const n=i.Ji.toDataURL("image/png");i.c.setAttribute("src",n);const r=i.c.attributes;if((0,o.Rm)("Resulting attributes:"),0===r.length)(0,o.p6)("No attributes.");else for(let e=0;e<r.length;e++){const t=r[e];(0,o.p6)(`<${t.name}="${t.value}">`)}i.c.style["z-index"]=4}},173:(e,t,n)=>{n.d(t,{EI:()=>R,AX:()=>L,Ji:()=>M,ne:()=>b,FA:()=>N,KL:()=>A,jB:()=>k,Qf:()=>I,v7:()=>w,ZH:()=>y,Tj:()=>x,c:()=>T,Bw:()=>_,vh:()=>j,Ki:()=>$,MB:()=>B});var i=n(72),o=n.n(i),r=n(825),a=n.n(r),c=n(659),s=n.n(c),u=n(56),l=n.n(u),d=n(540),p=n.n(d),h=n(113),f=n.n(h),v=n(208),g={};g.styleTagTransform=f(),g.setAttributes=l(),g.insert=s().bind(null,"head"),g.domAPI=a(),g.insertStyleElement=p(),o()(v.A,g),v.A&&v.A.locals&&v.A.locals;const b=document.querySelector(".controls"),m=[...b.querySelectorAll("button")],[y,w,x,A,k,R]=m,T=document.querySelector("#photo"),L=document.querySelector("#stream-input-select"),$=document.querySelector("#video"),M=document.querySelector("#canvas"),I=document.getElementById("console"),E=Math.max(document.documentElement.clientWidth||0,window.innerWidth||0),j=Math.max(document.documentElement.clientHeight||0,window.innerHeight||0),B=.5*E;let S=0;function N(){return S}function _(e){S=e}},827:(e,t,n)=>{n.a(e,(async(e,i)=>{try{n.d(t,{v:()=>p});var o=n(173),r=n(272),a=n(539),c=n(729),s=n(9),u=e([c,s]);[c,s]=u.then?(await u)():u;let l=!1,d=!1;function p(){o.Ki.addEventListener("canplay",(e=>{d||((0,c.u)(),d=!0)}),!1),o.Tj.addEventListener("click",(e=>{if((0,r.Rm)("Clicked on screenshot.."),l)(0,r.p6)("Already taken a picture, clearing it.."),(0,a.Y)(),l=!1,o.Tj.classList.remove("non-active"),o.Tj.classList.add("active"),o.Tj.setAttribute("title","Take photo");else{(0,r.p6)("Taking a new picture...");try{(0,a.O)()}catch(e){(0,r.vV)(e)}l=!0,o.Tj.classList.add("non-active"),o.Tj.classList.remove("active"),o.Tj.setAttribute("title","Remove photo")}e.preventDefault()}),!1),o.v7.onclick=()=>{(0,r.Rm)("Clicked pause.."),o.Ki.pause()},o.KL.onclick=()=>{(0,r.Rm)("Clearing log..."),o.Qf.innerHTML="Log entries:"},o.jB.onclick=()=>{o.jB.classList.contains("active")?((0,r.Rm)("Log is shown, hiding it..."),o.jB.classList.add("non-active"),o.jB.classList.remove("active"),o.jB.setAttribute("title","Show the log"),o.Qf.style="display: None"):((0,r.Rm)("Unhiding the log..."),o.jB.classList.remove("non-active"),o.jB.classList.add("active"),o.jB.setAttribute("title","Hide the log"),o.Qf.style="display: Normal")},o.EI.onclick=()=>{(0,r.Rm)("Started to process image...");const e=o.c.getAttribute("src");if(!e)throw(0,r.vV)("No image is taken!"),"NoImageTaken";const t=s.Ws(e);(0,r.p6)("Got an output image; displaying it.."),o.c.setAttribute("src",t)},o.AX.onchange=()=>{(0,r.Rm)("Changed camereOptions.."),(0,c.u)(),d=!0},o.ZH.onclick=()=>{(0,r.Rm)("Clicked on play.."),d?((0,r.p6)("Stream already started, just starting video"),o.Ki.play()):((0,c.u)(),d=!0)}}i()}catch(h){i(h)}}))},98:(e,t,n)=>{n.a(e,(async(e,i)=>{try{n.r(t),n.d(t,{checkForApi:()=>u});var o=n(272),r=n(173),a=n(827),c=e([a]);a=(c.then?(await c)():c)[0];let s=!1;function u(){return!!s||("mediaDevices"in navigator&&"enumerateDevices"in navigator.mediaDevices?((0,o.Rm)("API check succeeded, all required functions are available!"),s=!0,!0):((0,o.Rm)("The needed api is not there. You probably need to re-access this website from a secure connection (https)"),!1))}async function l(){if(!u())throw"NotEnoughApi";const e=e=>{(0,o.wI)(`'${""===e.label?"No Label":e.label}' (${""===e.deviceId?"No Id":e.deviceId})`)},t=await navigator.mediaDevices.enumerateDevices();(0,o.p6)("Enumerated devices: ");for(let n=0;n<t.length;n++)e(t[n]);const n=t.filter((e=>"videoinput"===e.kind));if(0===n.length)throw(0,o.wI)("No video devices"),"NotEnoughDevices";(0,o.p6)("Enumerated _video_ devices: ");for(let t=0;t<n.length;t++)e(n[t]);(0,o.p6)("Resulting options: ");let i=0;const a=n.map((e=>{const t=`<option value="${e.deviceId}">${""===e.label?`${i} (No label)`:e.label}</option>`;return(0,o.wI)(t),i+=1,t}));r.AX.innerHTML=a.join(""),(0,o.p6)("Generated selection.")}l().catch((function(e){(0,o.vV)(`Encountered error: ${e}`)})),(0,a.v)(),i()}catch(d){i(d)}}))},272:(e,t,n)=>{n.d(t,{Rm:()=>a,p6:()=>c,vV:()=>r,wI:()=>s});var i=n(173);function o(e,t){const n=t+`-> ${e} [INFO]`,o=u(n);i.Qf.innerHTML=i.Qf.innerHTML+"<br>"+o,console.log(n)}function r(e){!function(e,t){const n=`  -> ${e} [ERROR]`,o=u(n);i.Qf.innerHTML=i.Qf.innerHTML+"<br>"+o,console.error(n)}(e)}function a(e){o(e,"  ")}function c(e){o(e,"    ")}function s(e){o(e,"      ")}function u(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}},729:(e,t,n)=>{n.a(e,(async(e,i)=>{try{n.d(t,{u:()=>u});var o=n(173),r=n(272),a=n(98),c=e([a]);a=(c.then?(await c)():c)[0];const s={video:{facingMode:"user"},audio:!1};function u(){if((0,r.Rm)("Initializing the video stream"),!(0,a.checkForApi)())throw"NotEnoughApi";const e={...s,deviceId:{exact:o.AX.value}};navigator.mediaDevices.getUserMedia(e).then((e=>{(0,r.Rm)("Starting stream"),(0,r.p6)("Stream tracks are: "),e.getTracks().forEach((e=>{(0,r.wI)(`hint: '${e.contentHint}'; label: '${e.label}'; kind: '${e.kind}'.`)})),o.Ki.srcObject=e,o.Ki.play()})).catch((e=>{throw(0,r.vV)(`An error occurred: ${e}`),`Error: ${e}`}));let t=(0,o.FA)();t=o.Ki.videoHeight/(o.Ki.videoWidth/o.MB),(0,r.p6)(`With width: ${o.MB} and height: ${t}`),isNaN(t)&&(t=o.MB/(4/3),(0,r.p6)(`Height updated to: ${t}`)),o.ne.style.setProperty("top",`${t}px`),o.Qf.style.setProperty("top",`${t+.02*o.vh}px`),(0,o.Bw)(t),o.Ki.setAttribute("width",o.MB),o.Ki.setAttribute("height",t),o.Ji.setAttribute("width",o.MB),o.Ji.setAttribute("height",t),o.c.setAttribute("width",o.MB),o.c.setAttribute("height",t)}i()}catch(l){i(l)}}))},717:(e,t,n)=>{e.exports=n.p+"7dbefbfd70a575bc4e88.svg"},649:(e,t,n)=>{e.exports=n.p+"699d230654d2f7111166.svg"},846:(e,t,n)=>{e.exports=n.p+"b429fdfeed5479b1300f.svg"},778:(e,t,n)=>{e.exports=n.p+"b8dd0ce607bca97aa45c.svg"},147:(e,t,n)=>{e.exports=n.p+"9b252ac3c64df27e39dc.svg"},13:(e,t,n)=>{e.exports=n.p+"b1238fb7eda76106bcfa.svg"},666:(e,t,n)=>{e.exports=n.p+"2550f2a2ba04229047d1.svg"},970:(e,t,n)=>{e.exports=n.p+"7c595cc952560306ed09.svg"},407:(e,t,n)=>{var i=n(987);e.exports=n.v(t,e.id,"9d17ab5e13c8e97f7b64",{"./img_process_bg.js":{__wbg_alert_74f783bf17bc839f:i.RR}})}}]);
\ No newline at end of file
diff --git a/src/dist/9b252ac3c64df27e39dc.svg b/src/dist/9b252ac3c64df27e39dc.svg
new file mode 100644
index 0000000..77c54cb
--- /dev/null
+++ b/src/dist/9b252ac3c64df27e39dc.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-eye-off"><path d="M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"></path><line x1="1" y1="1" x2="23" y2="23"></line></svg>
\ No newline at end of file
diff --git a/src/dist/9d17ab5e13c8e97f7b64.module.wasm b/src/dist/9d17ab5e13c8e97f7b64.module.wasm
new file mode 100644
index 0000000..2fbcdb7
--- /dev/null
+++ b/src/dist/9d17ab5e13c8e97f7b64.module.wasm
Binary files differdiff --git a/src/dist/b1238fb7eda76106bcfa.svg b/src/dist/b1238fb7eda76106bcfa.svg
new file mode 100644
index 0000000..9cde243
--- /dev/null
+++ b/src/dist/b1238fb7eda76106bcfa.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-eye"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path><circle cx="12" cy="12" r="3"></circle></svg>
\ No newline at end of file
diff --git a/src/dist/b429fdfeed5479b1300f.svg b/src/dist/b429fdfeed5479b1300f.svg
new file mode 100644
index 0000000..226c44d
--- /dev/null
+++ b/src/dist/b429fdfeed5479b1300f.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-thumbs-up"><path d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"></path></svg>
\ No newline at end of file
diff --git a/src/dist/b8dd0ce607bca97aa45c.svg b/src/dist/b8dd0ce607bca97aa45c.svg
new file mode 100644
index 0000000..7677c38
--- /dev/null
+++ b/src/dist/b8dd0ce607bca97aa45c.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-x-square"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect><line x1="9" y1="9" x2="15" y2="15"></line><line x1="15" y1="9" x2="9" y2="15"></line></svg>
\ No newline at end of file
diff --git a/src/dist/index.html b/src/dist/index.html
new file mode 100644
index 0000000..f6a0294
--- /dev/null
+++ b/src/dist/index.html
@@ -0,0 +1,45 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width" />
+    <title>Cheap web cam</title>
+  </head>
+  <body>
+    <noscript>
+      This page contains web assembly and Javascript content, please enable
+      Javascript in your browser.
+    </noscript>
+
+    <div class="content">
+      <div class="controls">
+        <button class="btn btn-play" title="Start video stream"></button>
+        <button class="btn btn-pause" title="Pause video stream"></button>
+        <button class="btn btn-shot active" title="Take photo"></button>
+        <button class="btn btn-log-del" title="Clear the log"></button>
+        <button class="btn btn-log-hide non-active" title="Show the log"></button>
+        <button
+          class="btn btn-confirm"
+          title="Confirm the image, and process it"></button>
+
+        <select name="" id="stream-input-select">
+          <option value="">Select camera</option>
+        </select>
+      </div>
+
+      <div class="output">
+        <img
+          id="photo"
+          class="overlay"
+          alt="The screen capture will appear in this box." />
+        <canvas id="canvas" class="overlay"> </canvas>
+        <video id="video" class="overlay">Video stream not available.</video>
+      </div>
+    </div>
+
+    <pre id="console" class="active" style="display: None;">Log entries:</pre>
+
+    <script src="main.js"></script>
+  </body>
+</html>
+<!-- vim: ts=2 -->
diff --git a/src/dist/main.js b/src/dist/main.js
new file mode 100644
index 0000000..79d8229
--- /dev/null
+++ b/src/dist/main.js
@@ -0,0 +1 @@
+(()=>{var e,r,t,n,o,a,i={},s={};function c(e){var r=s[e];if(void 0!==r)return r.exports;var t=s[e]={id:e,loaded:!1,exports:{}};return i[e](t,t.exports,c),t.loaded=!0,t.exports}c.m=i,e="function"==typeof Symbol?Symbol("webpack queues"):"__webpack_queues__",r="function"==typeof Symbol?Symbol("webpack exports"):"__webpack_exports__",t="function"==typeof Symbol?Symbol("webpack error"):"__webpack_error__",n=e=>{e&&e.d<1&&(e.d=1,e.forEach((e=>e.r--)),e.forEach((e=>e.r--?e.r++:e())))},c.a=(o,a,i)=>{var s;i&&((s=[]).d=-1);var c,l,p,u=new Set,d=o.exports,b=new Promise(((e,r)=>{p=r,l=e}));b[r]=d,b[e]=e=>(s&&e(s),u.forEach(e),b.catch((e=>{}))),o.exports=b,a((o=>{var a;c=(o=>o.map((o=>{if(null!==o&&"object"==typeof o){if(o[e])return o;if(o.then){var a=[];a.d=0,o.then((e=>{i[r]=e,n(a)}),(e=>{i[t]=e,n(a)}));var i={};return i[e]=e=>e(a),i}}var s={};return s[e]=e=>{},s[r]=o,s})))(o);var i=()=>c.map((e=>{if(e[t])throw e[t];return e[r]})),l=new Promise((r=>{(a=()=>r(i)).r=0;var t=e=>e!==s&&!u.has(e)&&(u.add(e),e&&!e.d&&(a.r++,e.push(a)));c.map((r=>r[e](t)))}));return a.r?l:i()}),(e=>(e?p(b[t]=e):l(d),n(s)))),s&&s.d<0&&(s.d=0)},c.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return c.d(r,{a:r}),r},c.d=(e,r)=>{for(var t in r)c.o(r,t)&&!c.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},c.f={},c.e=e=>Promise.all(Object.keys(c.f).reduce(((r,t)=>(c.f[t](e,r),r)),[])),c.u=e=>e+".main.js",c.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),c.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),c.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),o={},a="wasm-app:",c.l=(e,r,t,n)=>{if(o[e])o[e].push(r);else{var i,s;if(void 0!==t)for(var l=document.getElementsByTagName("script"),p=0;p<l.length;p++){var u=l[p];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==a+t){i=u;break}}i||(s=!0,(i=document.createElement("script")).charset="utf-8",i.timeout=120,c.nc&&i.setAttribute("nonce",c.nc),i.setAttribute("data-webpack",a+t),i.src=e),o[e]=[r];var d=(r,t)=>{i.onerror=i.onload=null,clearTimeout(b);var n=o[e];if(delete o[e],i.parentNode&&i.parentNode.removeChild(i),n&&n.forEach((e=>e(t))),r)return r(t)},b=setTimeout(d.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=d.bind(null,i.onerror),i.onload=d.bind(null,i.onload),s&&document.head.appendChild(i)}},c.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},c.v=(e,r,t,n)=>{var o=fetch(c.p+""+t+".module.wasm"),a=()=>o.then((e=>e.arrayBuffer())).then((e=>WebAssembly.instantiate(e,n))).then((r=>Object.assign(e,r.instance.exports)));return o.then((r=>"function"==typeof WebAssembly.instantiateStreaming?WebAssembly.instantiateStreaming(r,n).then((r=>Object.assign(e,r.instance.exports)),(e=>{if("application/wasm"!==r.headers.get("Content-Type"))return console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",e),a();throw e})):a()))},(()=>{var e;c.g.importScripts&&(e=c.g.location+"");var r=c.g.document;if(!e&&r&&(r.currentScript&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var n=t.length-1;n>-1&&(!e||!/^http(s?):/.test(e));)e=t[n--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),c.p=e})(),(()=>{c.b=document.baseURI||self.location.href;var e={792:0};c.f.j=(r,t)=>{var n=c.o(e,r)?e[r]:void 0;if(0!==n)if(n)t.push(n[2]);else{var o=new Promise(((t,o)=>n=e[r]=[t,o]));t.push(n[2]=o);var a=c.p+c.u(r),i=new Error;c.l(a,(t=>{if(c.o(e,r)&&(0!==(n=e[r])&&(e[r]=void 0),n)){var o=t&&("load"===t.type?"missing":t.type),a=t&&t.target&&t.target.src;i.message="Loading chunk "+r+" failed.\n("+o+": "+a+")",i.name="ChunkLoadError",i.type=o,i.request=a,n[1](i)}}),"chunk-"+r,r)}};var r=(r,t)=>{var n,o,[a,i,s]=t,l=0;if(a.some((r=>0!==e[r]))){for(n in i)c.o(i,n)&&(c.m[n]=i[n]);s&&s(c)}for(r&&r(t);l<a.length;l++)o=a[l],c.o(e,o)&&e[o]&&e[o][0](),e[o]=0},t=self.webpackChunkwasm_app=self.webpackChunkwasm_app||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})(),c.nc=void 0,c.e(919).then(c.bind(c,98)).catch((e=>console.error("Error importing `index.js`:",e)))})();
\ No newline at end of file