Upload 12 files
Browse files- .last_build_id +1 -0
- app.tar.gz +3 -0
- favicon.png +0 -0
- flutter.js +4 -0
- flutter_bootstrap.js +31 -0
- flutter_service_worker.js +214 -0
- index.html +105 -19
- main.dart.js +0 -0
- manifest.json +35 -0
- python-worker.js +47 -0
- python.js +28 -0
- version.json +1 -0
.last_build_id
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
ff5bfaed539c9f780e5cca58f351f125
|
app.tar.gz
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:5d9d8a941f1fd610eb6a6f5e93b4f10c73532d99d4727fd5c2cc3ce4d17c62b9
|
3 |
+
size 138501273
|
favicon.png
ADDED
![]() |
flutter.js
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
(()=>{var L=()=>navigator.vendor==="Google Inc."||navigator.agent==="Edg/",E=()=>typeof ImageDecoder>"u"?!1:L(),P=()=>typeof Intl.v8BreakIterator<"u"&&typeof Intl.Segmenter<"u",W=()=>{let a=[0,97,115,109,1,0,0,0,1,5,1,95,1,120,0];return WebAssembly.validate(new Uint8Array(a))},w={hasImageCodecs:E(),hasChromiumBreakIterators:P(),supportsWasmGC:W(),crossOriginIsolated:window.crossOriginIsolated};function d(...a){return new URL(_(...a),document.baseURI).toString()}function _(...a){return a.filter(t=>!!t).map((t,i)=>i===0?S(t):j(S(t))).filter(t=>t.length).join("/")}function j(a){let t=0;for(;t<a.length&&a.charAt(t)==="/";)t++;return a.substring(t)}function S(a){let t=a.length;for(;t>0&&a.charAt(t-1)==="/";)t--;return a.substring(0,t)}function T(a,t){return a.canvasKitBaseUrl?a.canvasKitBaseUrl:t.engineRevision&&!t.useLocalCanvasKit?_("https://www.gstatic.com/flutter-canvaskit",t.engineRevision):"canvaskit"}var v=class{constructor(){this._scriptLoaded=!1}setTrustedTypesPolicy(t){this._ttPolicy=t}async loadEntrypoint(t){let{entrypointUrl:i=d("main.dart.js"),onEntrypointLoaded:r,nonce:e}=t||{};return this._loadJSEntrypoint(i,r,e)}async load(t,i,r,e,n){n??=o=>{o.initializeEngine(r).then(l=>l.runApp())};let{entryPointBaseUrl:s}=r;if(t.compileTarget==="dart2wasm")return this._loadWasmEntrypoint(t,i,s,n);{let o=t.mainJsPath??"main.dart.js",l=d(s,o);return this._loadJSEntrypoint(l,n,e)}}didCreateEngineInitializer(t){typeof this._didCreateEngineInitializerResolve=="function"&&(this._didCreateEngineInitializerResolve(t),this._didCreateEngineInitializerResolve=null,delete _flutter.loader.didCreateEngineInitializer),typeof this._onEntrypointLoaded=="function"&&this._onEntrypointLoaded(t)}_loadJSEntrypoint(t,i,r){let e=typeof i=="function";if(!this._scriptLoaded){this._scriptLoaded=!0;let n=this._createScriptTag(t,r);if(e)console.debug("Injecting <script> tag. Using callback."),this._onEntrypointLoaded=i,document.head.append(n);else return new Promise((s,o)=>{console.debug("Injecting <script> tag. Using Promises. Use the callback approach instead!"),this._didCreateEngineInitializerResolve=s,n.addEventListener("error",o),document.head.append(n)})}}async _loadWasmEntrypoint(t,i,r,e){if(!this._scriptLoaded){this._scriptLoaded=!0,this._onEntrypointLoaded=e;let{mainWasmPath:n,jsSupportRuntimePath:s}=t,o=d(r,n),l=d(r,s);this._ttPolicy!=null&&(l=this._ttPolicy.createScriptURL(l));let c=(await import(l)).compileStreaming(fetch(o)),f;t.renderer==="skwasm"?f=(async()=>{let m=await i.skwasm;return window._flutter_skwasmInstance=m,{skwasm:m.wasmExports,skwasmWrapper:m,ffi:{memory:m.wasmMemory}}})():f=Promise.resolve({}),await(await(await c).instantiate(await f)).invokeMain()}}_createScriptTag(t,i){let r=document.createElement("script");r.type="application/javascript",i&&(r.nonce=i);let e=t;return this._ttPolicy!=null&&(e=this._ttPolicy.createScriptURL(t)),r.src=e,r}};async function b(a,t,i){if(t<0)return a;let r,e=new Promise((n,s)=>{r=setTimeout(()=>{s(new Error(`${i} took more than ${t}ms to resolve. Moving on.`,{cause:b}))},t)});return Promise.race([a,e]).finally(()=>{clearTimeout(r)})}var y=class{setTrustedTypesPolicy(t){this._ttPolicy=t}loadServiceWorker(t){if(!t)return console.debug("Null serviceWorker configuration. Skipping."),Promise.resolve();if(!("serviceWorker"in navigator)){let o="Service Worker API unavailable.";return window.isSecureContext||(o+=`
|
2 |
+
The current context is NOT secure.`,o+=`
|
3 |
+
Read more: https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts`),Promise.reject(new Error(o))}let{serviceWorkerVersion:i,serviceWorkerUrl:r=d(`flutter_service_worker.js?v=${i}`),timeoutMillis:e=4e3}=t,n=r;this._ttPolicy!=null&&(n=this._ttPolicy.createScriptURL(n));let s=navigator.serviceWorker.register(n).then(o=>this._getNewServiceWorker(o,i)).then(this._waitForServiceWorkerActivation);return b(s,e,"prepareServiceWorker")}async _getNewServiceWorker(t,i){if(!t.active&&(t.installing||t.waiting))return console.debug("Installing/Activating first service worker."),t.installing||t.waiting;if(t.active.scriptURL.endsWith(i))return console.debug("Loading from existing service worker."),t.active;{let r=await t.update();return console.debug("Updating service worker."),r.installing||r.waiting||r.active}}async _waitForServiceWorkerActivation(t){if(!t||t.state==="activated")if(t){console.debug("Service worker already active.");return}else throw new Error("Cannot activate a null service worker!");return new Promise((i,r)=>{t.addEventListener("statechange",()=>{t.state==="activated"&&(console.debug("Activated new service worker."),i())})})}};var g=class{constructor(t,i="flutter-js"){let r=t||[/\.js$/,/\.mjs$/];window.trustedTypes&&(this.policy=trustedTypes.createPolicy(i,{createScriptURL:function(e){if(e.startsWith("blob:"))return e;let n=new URL(e,window.location),s=n.pathname.split("/").pop();if(r.some(l=>l.test(s)))return n.toString();console.error("URL rejected by TrustedTypes policy",i,":",e,"(download prevented)")}}))}};var k=a=>{let t=WebAssembly.compileStreaming(fetch(a));return(i,r)=>((async()=>{let e=await t,n=await WebAssembly.instantiate(e,i);r(n,e)})(),{})};var I=(a,t,i,r)=>(window.flutterCanvasKitLoaded=(async()=>{if(window.flutterCanvasKit)return window.flutterCanvasKit;let e=i.hasChromiumBreakIterators&&i.hasImageCodecs;if(!e&&t.canvasKitVariant=="chromium")throw"Chromium CanvasKit variant specifically requested, but unsupported in this browser";let n=e&&t.canvasKitVariant!=="full",s=r;n&&(s=d(s,"chromium"));let o=d(s,"canvaskit.js");a.flutterTT.policy&&(o=a.flutterTT.policy.createScriptURL(o));let l=k(d(s,"canvaskit.wasm")),p=await import(o);return window.flutterCanvasKit=await p.default({instantiateWasm:l}),window.flutterCanvasKit})(),window.flutterCanvasKitLoaded);var U=async(a,t,i,r)=>{let e=d(r,"skwasm.js"),n=e;a.flutterTT.policy&&(n=a.flutterTT.policy.createScriptURL(n));let s=k(d(r,"skwasm.wasm"));return await(await import(n)).default({instantiateWasm:s,locateFile:(l,p)=>{let c=p+l;return c.endsWith(".worker.js")?URL.createObjectURL(new Blob([`importScripts('${c}');`],{type:"application/javascript"})):c},mainScriptUrlOrBlob:e})};var C=class{async loadEntrypoint(t){let{serviceWorker:i,...r}=t||{},e=new g,n=new y;n.setTrustedTypesPolicy(e.policy),await n.loadServiceWorker(i).catch(o=>{console.warn("Exception while loading service worker:",o)});let s=new v;return s.setTrustedTypesPolicy(e.policy),this.didCreateEngineInitializer=s.didCreateEngineInitializer.bind(s),s.loadEntrypoint(r)}async load({serviceWorkerSettings:t,onEntrypointLoaded:i,nonce:r,config:e}={}){e??={};let n=_flutter.buildConfig;if(!n)throw"FlutterLoader.load requires _flutter.buildConfig to be set";let s=u=>{switch(u){case"skwasm":return w.crossOriginIsolated&&w.hasChromiumBreakIterators&&w.hasImageCodecs&&w.supportsWasmGC;default:return!0}},o=(u,m)=>{switch(u.renderer){case"auto":return m=="canvaskit"||m=="html";default:return u.renderer==m}},l=u=>u.compileTarget==="dart2wasm"&&!w.supportsWasmGC||e.renderer&&!o(u,e.renderer)?!1:s(u.renderer),p=n.builds.find(l);if(!p)throw"FlutterLoader could not find a build compatible with configuration and environment.";let c={};c.flutterTT=new g,t&&(c.serviceWorkerLoader=new y,c.serviceWorkerLoader.setTrustedTypesPolicy(c.flutterTT.policy),await c.serviceWorkerLoader.loadServiceWorker(t).catch(u=>{console.warn("Exception while loading service worker:",u)}));let f=T(e,n);p.renderer==="canvaskit"?c.canvasKit=I(c,e,w,f):p.renderer==="skwasm"&&(c.skwasm=U(c,e,w,f));let h=new v;return h.setTrustedTypesPolicy(c.flutterTT.policy),this.didCreateEngineInitializer=h.didCreateEngineInitializer.bind(h),h.load(p,c,e,r,i)}};window._flutter||(window._flutter={});window._flutter.loader||(window._flutter.loader=new C);})();
|
4 |
+
//# sourceMappingURL=flutter.js.map
|
flutter_bootstrap.js
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
(()=>{var L=()=>navigator.vendor==="Google Inc."||navigator.agent==="Edg/",E=()=>typeof ImageDecoder>"u"?!1:L(),P=()=>typeof Intl.v8BreakIterator<"u"&&typeof Intl.Segmenter<"u",W=()=>{let a=[0,97,115,109,1,0,0,0,1,5,1,95,1,120,0];return WebAssembly.validate(new Uint8Array(a))},w={hasImageCodecs:E(),hasChromiumBreakIterators:P(),supportsWasmGC:W(),crossOriginIsolated:window.crossOriginIsolated};function d(...a){return new URL(_(...a),document.baseURI).toString()}function _(...a){return a.filter(t=>!!t).map((t,i)=>i===0?S(t):j(S(t))).filter(t=>t.length).join("/")}function j(a){let t=0;for(;t<a.length&&a.charAt(t)==="/";)t++;return a.substring(t)}function S(a){let t=a.length;for(;t>0&&a.charAt(t-1)==="/";)t--;return a.substring(0,t)}function T(a,t){return a.canvasKitBaseUrl?a.canvasKitBaseUrl:t.engineRevision&&!t.useLocalCanvasKit?_("https://www.gstatic.com/flutter-canvaskit",t.engineRevision):"canvaskit"}var v=class{constructor(){this._scriptLoaded=!1}setTrustedTypesPolicy(t){this._ttPolicy=t}async loadEntrypoint(t){let{entrypointUrl:i=d("main.dart.js"),onEntrypointLoaded:r,nonce:e}=t||{};return this._loadJSEntrypoint(i,r,e)}async load(t,i,r,e,n){n??=o=>{o.initializeEngine(r).then(l=>l.runApp())};let{entryPointBaseUrl:s}=r;if(t.compileTarget==="dart2wasm")return this._loadWasmEntrypoint(t,i,s,n);{let o=t.mainJsPath??"main.dart.js",l=d(s,o);return this._loadJSEntrypoint(l,n,e)}}didCreateEngineInitializer(t){typeof this._didCreateEngineInitializerResolve=="function"&&(this._didCreateEngineInitializerResolve(t),this._didCreateEngineInitializerResolve=null,delete _flutter.loader.didCreateEngineInitializer),typeof this._onEntrypointLoaded=="function"&&this._onEntrypointLoaded(t)}_loadJSEntrypoint(t,i,r){let e=typeof i=="function";if(!this._scriptLoaded){this._scriptLoaded=!0;let n=this._createScriptTag(t,r);if(e)console.debug("Injecting <script> tag. Using callback."),this._onEntrypointLoaded=i,document.head.append(n);else return new Promise((s,o)=>{console.debug("Injecting <script> tag. Using Promises. Use the callback approach instead!"),this._didCreateEngineInitializerResolve=s,n.addEventListener("error",o),document.head.append(n)})}}async _loadWasmEntrypoint(t,i,r,e){if(!this._scriptLoaded){this._scriptLoaded=!0,this._onEntrypointLoaded=e;let{mainWasmPath:n,jsSupportRuntimePath:s}=t,o=d(r,n),l=d(r,s);this._ttPolicy!=null&&(l=this._ttPolicy.createScriptURL(l));let c=(await import(l)).compileStreaming(fetch(o)),f;t.renderer==="skwasm"?f=(async()=>{let m=await i.skwasm;return window._flutter_skwasmInstance=m,{skwasm:m.wasmExports,skwasmWrapper:m,ffi:{memory:m.wasmMemory}}})():f=Promise.resolve({}),await(await(await c).instantiate(await f)).invokeMain()}}_createScriptTag(t,i){let r=document.createElement("script");r.type="application/javascript",i&&(r.nonce=i);let e=t;return this._ttPolicy!=null&&(e=this._ttPolicy.createScriptURL(t)),r.src=e,r}};async function b(a,t,i){if(t<0)return a;let r,e=new Promise((n,s)=>{r=setTimeout(()=>{s(new Error(`${i} took more than ${t}ms to resolve. Moving on.`,{cause:b}))},t)});return Promise.race([a,e]).finally(()=>{clearTimeout(r)})}var y=class{setTrustedTypesPolicy(t){this._ttPolicy=t}loadServiceWorker(t){if(!t)return console.debug("Null serviceWorker configuration. Skipping."),Promise.resolve();if(!("serviceWorker"in navigator)){let o="Service Worker API unavailable.";return window.isSecureContext||(o+=`
|
2 |
+
The current context is NOT secure.`,o+=`
|
3 |
+
Read more: https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts`),Promise.reject(new Error(o))}let{serviceWorkerVersion:i,serviceWorkerUrl:r=d(`flutter_service_worker.js?v=${i}`),timeoutMillis:e=4e3}=t,n=r;this._ttPolicy!=null&&(n=this._ttPolicy.createScriptURL(n));let s=navigator.serviceWorker.register(n).then(o=>this._getNewServiceWorker(o,i)).then(this._waitForServiceWorkerActivation);return b(s,e,"prepareServiceWorker")}async _getNewServiceWorker(t,i){if(!t.active&&(t.installing||t.waiting))return console.debug("Installing/Activating first service worker."),t.installing||t.waiting;if(t.active.scriptURL.endsWith(i))return console.debug("Loading from existing service worker."),t.active;{let r=await t.update();return console.debug("Updating service worker."),r.installing||r.waiting||r.active}}async _waitForServiceWorkerActivation(t){if(!t||t.state==="activated")if(t){console.debug("Service worker already active.");return}else throw new Error("Cannot activate a null service worker!");return new Promise((i,r)=>{t.addEventListener("statechange",()=>{t.state==="activated"&&(console.debug("Activated new service worker."),i())})})}};var g=class{constructor(t,i="flutter-js"){let r=t||[/\.js$/,/\.mjs$/];window.trustedTypes&&(this.policy=trustedTypes.createPolicy(i,{createScriptURL:function(e){if(e.startsWith("blob:"))return e;let n=new URL(e,window.location),s=n.pathname.split("/").pop();if(r.some(l=>l.test(s)))return n.toString();console.error("URL rejected by TrustedTypes policy",i,":",e,"(download prevented)")}}))}};var k=a=>{let t=WebAssembly.compileStreaming(fetch(a));return(i,r)=>((async()=>{let e=await t,n=await WebAssembly.instantiate(e,i);r(n,e)})(),{})};var I=(a,t,i,r)=>(window.flutterCanvasKitLoaded=(async()=>{if(window.flutterCanvasKit)return window.flutterCanvasKit;let e=i.hasChromiumBreakIterators&&i.hasImageCodecs;if(!e&&t.canvasKitVariant=="chromium")throw"Chromium CanvasKit variant specifically requested, but unsupported in this browser";let n=e&&t.canvasKitVariant!=="full",s=r;n&&(s=d(s,"chromium"));let o=d(s,"canvaskit.js");a.flutterTT.policy&&(o=a.flutterTT.policy.createScriptURL(o));let l=k(d(s,"canvaskit.wasm")),p=await import(o);return window.flutterCanvasKit=await p.default({instantiateWasm:l}),window.flutterCanvasKit})(),window.flutterCanvasKitLoaded);var U=async(a,t,i,r)=>{let e=d(r,"skwasm.js"),n=e;a.flutterTT.policy&&(n=a.flutterTT.policy.createScriptURL(n));let s=k(d(r,"skwasm.wasm"));return await(await import(n)).default({instantiateWasm:s,locateFile:(l,p)=>{let c=p+l;return c.endsWith(".worker.js")?URL.createObjectURL(new Blob([`importScripts('${c}');`],{type:"application/javascript"})):c},mainScriptUrlOrBlob:e})};var C=class{async loadEntrypoint(t){let{serviceWorker:i,...r}=t||{},e=new g,n=new y;n.setTrustedTypesPolicy(e.policy),await n.loadServiceWorker(i).catch(o=>{console.warn("Exception while loading service worker:",o)});let s=new v;return s.setTrustedTypesPolicy(e.policy),this.didCreateEngineInitializer=s.didCreateEngineInitializer.bind(s),s.loadEntrypoint(r)}async load({serviceWorkerSettings:t,onEntrypointLoaded:i,nonce:r,config:e}={}){e??={};let n=_flutter.buildConfig;if(!n)throw"FlutterLoader.load requires _flutter.buildConfig to be set";let s=u=>{switch(u){case"skwasm":return w.crossOriginIsolated&&w.hasChromiumBreakIterators&&w.hasImageCodecs&&w.supportsWasmGC;default:return!0}},o=(u,m)=>{switch(u.renderer){case"auto":return m=="canvaskit"||m=="html";default:return u.renderer==m}},l=u=>u.compileTarget==="dart2wasm"&&!w.supportsWasmGC||e.renderer&&!o(u,e.renderer)?!1:s(u.renderer),p=n.builds.find(l);if(!p)throw"FlutterLoader could not find a build compatible with configuration and environment.";let c={};c.flutterTT=new g,t&&(c.serviceWorkerLoader=new y,c.serviceWorkerLoader.setTrustedTypesPolicy(c.flutterTT.policy),await c.serviceWorkerLoader.loadServiceWorker(t).catch(u=>{console.warn("Exception while loading service worker:",u)}));let f=T(e,n);p.renderer==="canvaskit"?c.canvasKit=I(c,e,w,f):p.renderer==="skwasm"&&(c.skwasm=U(c,e,w,f));let h=new v;return h.setTrustedTypesPolicy(c.flutterTT.policy),this.didCreateEngineInitializer=h.didCreateEngineInitializer.bind(h),h.load(p,c,e,r,i)}};window._flutter||(window._flutter={});window._flutter.loader||(window._flutter.loader=new C);})();
|
4 |
+
//# sourceMappingURL=flutter.js.map
|
5 |
+
|
6 |
+
if (!window._flutter) {
|
7 |
+
window._flutter = {};
|
8 |
+
}
|
9 |
+
_flutter.buildConfig = {"engineRevision":"e672b006cb34c921db85b8e2f482ed3144a4574b","builds":[{"compileTarget":"dart2js","renderer":"canvaskit","mainJsPath":"main.dart.js"}]};
|
10 |
+
|
11 |
+
|
12 |
+
var loading = document.querySelector('#loading');
|
13 |
+
_flutter.loader.load({
|
14 |
+
config: {
|
15 |
+
renderer: webRenderer
|
16 |
+
},
|
17 |
+
serviceWorkerSettings: {
|
18 |
+
serviceWorkerVersion: "1378252651",
|
19 |
+
},
|
20 |
+
onEntrypointLoaded: async function (engineInitializer) {
|
21 |
+
loading.classList.add('main_done');
|
22 |
+
const appRunner = await engineInitializer.initializeEngine({useColorEmoji: useColorEmoji});
|
23 |
+
|
24 |
+
loading.classList.add('init_done');
|
25 |
+
await appRunner.runApp();
|
26 |
+
|
27 |
+
window.setTimeout(function () {
|
28 |
+
loading.remove();
|
29 |
+
}, 200);
|
30 |
+
}
|
31 |
+
});
|
flutter_service_worker.js
ADDED
@@ -0,0 +1,214 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
'use strict';
|
2 |
+
const MANIFEST = 'flutter-app-manifest';
|
3 |
+
const TEMP = 'flutter-temp-cache';
|
4 |
+
const CACHE_NAME = 'flutter-app-cache';
|
5 |
+
|
6 |
+
const RESOURCES = {"main.dart.js": "b640cbc9306860611dda7f3e7b583fd8",
|
7 |
+
"manifest.json": "58765f937ba0d0c40a3a714c5c1adb87",
|
8 |
+
"python-worker.js": "62a4865b3d41771b39660076485879be",
|
9 |
+
"canvaskit/skwasm.wasm": "828c26a0b1cc8eb1adacbdd0c5e8bcfa",
|
10 |
+
"canvaskit/chromium/canvaskit.js.symbols": "e115ddcfad5f5b98a90e389433606502",
|
11 |
+
"canvaskit/chromium/canvaskit.js": "b7ba6d908089f706772b2007c37e6da4",
|
12 |
+
"canvaskit/chromium/canvaskit.wasm": "ea5ab288728f7200f398f60089048b48",
|
13 |
+
"canvaskit/skwasm.js": "ac0f73826b925320a1e9b0d3fd7da61c",
|
14 |
+
"canvaskit/canvaskit.js.symbols": "efc2cd87d1ff6c586b7d4c7083063a40",
|
15 |
+
"canvaskit/skwasm.worker.js": "89990e8c92bcb123999aa81f7e203b1c",
|
16 |
+
"canvaskit/skwasm.js.symbols": "96263e00e3c9bd9cd878ead867c04f3c",
|
17 |
+
"canvaskit/canvaskit.js": "26eef3024dbc64886b7f48e1b6fb05cf",
|
18 |
+
"canvaskit/canvaskit.wasm": "e7602c687313cfac5f495c5eac2fb324",
|
19 |
+
"flutter_bootstrap.js": "b8cb831a2cf88145a9600a96999f8190",
|
20 |
+
"favicon.png": "302ac04c14db027d016d1fe74c6a80a0",
|
21 |
+
"flutter.js": "4b2350e14c6650ba82871f60906437ea",
|
22 |
+
"index.html": "9b60787b64ca572171a5b4effdbca418",
|
23 |
+
"/": "9b60787b64ca572171a5b4effdbca418",
|
24 |
+
"assets/AssetManifest.bin": "f82f600d0e9342f1147569932bdc3212",
|
25 |
+
"assets/packages/wakelock_plus/assets/no_sleep.js": "7748a45cd593f33280669b29c2c8919a",
|
26 |
+
"assets/packages/flutter_map/lib/assets/flutter_map_logo.png": "208d63cc917af9713fc9572bd5c09362",
|
27 |
+
"assets/packages/cupertino_icons/assets/CupertinoIcons.ttf": "6323a28c4d27ae6070923bcb643dc985",
|
28 |
+
"assets/packages/record_web/assets/js/record.worklet.js": "356bcfeddb8a625e3e2ba43ddf1cc13e",
|
29 |
+
"assets/packages/record_web/assets/js/record.fixwebmduration.js": "1f0108ea80c8951ba702ced40cf8cdce",
|
30 |
+
"assets/packages/media_kit/assets/web/hls1.4.10.js": "1e36f4683b03af6692ad2542810f28bc",
|
31 |
+
"assets/FontManifest.json": "dc3d03800ccca4601324923c0b1d6d57",
|
32 |
+
"assets/NOTICES": "cab1fa5a725d2caafacbae667837a6d1",
|
33 |
+
"assets/AssetManifest.json": "a38a816646dff320fc78b32cc727925e",
|
34 |
+
"assets/fonts/MaterialIcons-Regular.otf": "f34ace52ea74c95e26949fab4870ac22",
|
35 |
+
"assets/shaders/ink_sparkle.frag": "ecc85a2e95f5e9f53123dcaf8cb9b6ce",
|
36 |
+
"assets/AssetManifest.bin.json": "15a667376456bdf082d25c5b97a6577e",
|
37 |
+
"icons/icon-512.png": "06b219f171b5a1af6dd8299ea1e116f2",
|
38 |
+
"icons/apple-touch-icon-192.png": "8cf0d5162941f467a77f023c414a1812",
|
39 |
+
"icons/icon-192.png": "81c4311263d0cad60c1f0496b4fa7c8f",
|
40 |
+
"icons/icon-maskable-192.png": "c1c2210feeb444cf800a5ce0d06eff16",
|
41 |
+
"icons/loading-animation.png": "41a96047dbd2463a50c46ad3bf6ff158",
|
42 |
+
"icons/icon-maskable-512.png": "aa798e6d780ff109da17c3a98d5f2619",
|
43 |
+
"python.js": "9eee2c1773af78bc45ee89ca2ac5724f",
|
44 |
+
"version.json": "3fea9d9c7b4ca6955aa03e762e0d2e13"};
|
45 |
+
// The application shell files that are downloaded before a service worker can
|
46 |
+
// start.
|
47 |
+
const CORE = ["main.dart.js",
|
48 |
+
"index.html",
|
49 |
+
"flutter_bootstrap.js",
|
50 |
+
"assets/AssetManifest.bin.json",
|
51 |
+
"assets/FontManifest.json"];
|
52 |
+
|
53 |
+
// During install, the TEMP cache is populated with the application shell files.
|
54 |
+
self.addEventListener("install", (event) => {
|
55 |
+
self.skipWaiting();
|
56 |
+
return event.waitUntil(
|
57 |
+
caches.open(TEMP).then((cache) => {
|
58 |
+
return cache.addAll(
|
59 |
+
CORE.map((value) => new Request(value, {'cache': 'reload'})));
|
60 |
+
})
|
61 |
+
);
|
62 |
+
});
|
63 |
+
// During activate, the cache is populated with the temp files downloaded in
|
64 |
+
// install. If this service worker is upgrading from one with a saved
|
65 |
+
// MANIFEST, then use this to retain unchanged resource files.
|
66 |
+
self.addEventListener("activate", function(event) {
|
67 |
+
return event.waitUntil(async function() {
|
68 |
+
try {
|
69 |
+
var contentCache = await caches.open(CACHE_NAME);
|
70 |
+
var tempCache = await caches.open(TEMP);
|
71 |
+
var manifestCache = await caches.open(MANIFEST);
|
72 |
+
var manifest = await manifestCache.match('manifest');
|
73 |
+
// When there is no prior manifest, clear the entire cache.
|
74 |
+
if (!manifest) {
|
75 |
+
await caches.delete(CACHE_NAME);
|
76 |
+
contentCache = await caches.open(CACHE_NAME);
|
77 |
+
for (var request of await tempCache.keys()) {
|
78 |
+
var response = await tempCache.match(request);
|
79 |
+
await contentCache.put(request, response);
|
80 |
+
}
|
81 |
+
await caches.delete(TEMP);
|
82 |
+
// Save the manifest to make future upgrades efficient.
|
83 |
+
await manifestCache.put('manifest', new Response(JSON.stringify(RESOURCES)));
|
84 |
+
// Claim client to enable caching on first launch
|
85 |
+
self.clients.claim();
|
86 |
+
return;
|
87 |
+
}
|
88 |
+
var oldManifest = await manifest.json();
|
89 |
+
var origin = self.location.origin;
|
90 |
+
for (var request of await contentCache.keys()) {
|
91 |
+
var key = request.url.substring(origin.length + 1);
|
92 |
+
if (key == "") {
|
93 |
+
key = "/";
|
94 |
+
}
|
95 |
+
// If a resource from the old manifest is not in the new cache, or if
|
96 |
+
// the MD5 sum has changed, delete it. Otherwise the resource is left
|
97 |
+
// in the cache and can be reused by the new service worker.
|
98 |
+
if (!RESOURCES[key] || RESOURCES[key] != oldManifest[key]) {
|
99 |
+
await contentCache.delete(request);
|
100 |
+
}
|
101 |
+
}
|
102 |
+
// Populate the cache with the app shell TEMP files, potentially overwriting
|
103 |
+
// cache files preserved above.
|
104 |
+
for (var request of await tempCache.keys()) {
|
105 |
+
var response = await tempCache.match(request);
|
106 |
+
await contentCache.put(request, response);
|
107 |
+
}
|
108 |
+
await caches.delete(TEMP);
|
109 |
+
// Save the manifest to make future upgrades efficient.
|
110 |
+
await manifestCache.put('manifest', new Response(JSON.stringify(RESOURCES)));
|
111 |
+
// Claim client to enable caching on first launch
|
112 |
+
self.clients.claim();
|
113 |
+
return;
|
114 |
+
} catch (err) {
|
115 |
+
// On an unhandled exception the state of the cache cannot be guaranteed.
|
116 |
+
console.error('Failed to upgrade service worker: ' + err);
|
117 |
+
await caches.delete(CACHE_NAME);
|
118 |
+
await caches.delete(TEMP);
|
119 |
+
await caches.delete(MANIFEST);
|
120 |
+
}
|
121 |
+
}());
|
122 |
+
});
|
123 |
+
// The fetch handler redirects requests for RESOURCE files to the service
|
124 |
+
// worker cache.
|
125 |
+
self.addEventListener("fetch", (event) => {
|
126 |
+
if (event.request.method !== 'GET') {
|
127 |
+
return;
|
128 |
+
}
|
129 |
+
var origin = self.location.origin;
|
130 |
+
var key = event.request.url.substring(origin.length + 1);
|
131 |
+
// Redirect URLs to the index.html
|
132 |
+
if (key.indexOf('?v=') != -1) {
|
133 |
+
key = key.split('?v=')[0];
|
134 |
+
}
|
135 |
+
if (event.request.url == origin || event.request.url.startsWith(origin + '/#') || key == '') {
|
136 |
+
key = '/';
|
137 |
+
}
|
138 |
+
// If the URL is not the RESOURCE list then return to signal that the
|
139 |
+
// browser should take over.
|
140 |
+
if (!RESOURCES[key]) {
|
141 |
+
return;
|
142 |
+
}
|
143 |
+
// If the URL is the index.html, perform an online-first request.
|
144 |
+
if (key == '/') {
|
145 |
+
return onlineFirst(event);
|
146 |
+
}
|
147 |
+
event.respondWith(caches.open(CACHE_NAME)
|
148 |
+
.then((cache) => {
|
149 |
+
return cache.match(event.request).then((response) => {
|
150 |
+
// Either respond with the cached resource, or perform a fetch and
|
151 |
+
// lazily populate the cache only if the resource was successfully fetched.
|
152 |
+
return response || fetch(event.request).then((response) => {
|
153 |
+
if (response && Boolean(response.ok)) {
|
154 |
+
cache.put(event.request, response.clone());
|
155 |
+
}
|
156 |
+
return response;
|
157 |
+
});
|
158 |
+
})
|
159 |
+
})
|
160 |
+
);
|
161 |
+
});
|
162 |
+
self.addEventListener('message', (event) => {
|
163 |
+
// SkipWaiting can be used to immediately activate a waiting service worker.
|
164 |
+
// This will also require a page refresh triggered by the main worker.
|
165 |
+
if (event.data === 'skipWaiting') {
|
166 |
+
self.skipWaiting();
|
167 |
+
return;
|
168 |
+
}
|
169 |
+
if (event.data === 'downloadOffline') {
|
170 |
+
downloadOffline();
|
171 |
+
return;
|
172 |
+
}
|
173 |
+
});
|
174 |
+
// Download offline will check the RESOURCES for all files not in the cache
|
175 |
+
// and populate them.
|
176 |
+
async function downloadOffline() {
|
177 |
+
var resources = [];
|
178 |
+
var contentCache = await caches.open(CACHE_NAME);
|
179 |
+
var currentContent = {};
|
180 |
+
for (var request of await contentCache.keys()) {
|
181 |
+
var key = request.url.substring(origin.length + 1);
|
182 |
+
if (key == "") {
|
183 |
+
key = "/";
|
184 |
+
}
|
185 |
+
currentContent[key] = true;
|
186 |
+
}
|
187 |
+
for (var resourceKey of Object.keys(RESOURCES)) {
|
188 |
+
if (!currentContent[resourceKey]) {
|
189 |
+
resources.push(resourceKey);
|
190 |
+
}
|
191 |
+
}
|
192 |
+
return contentCache.addAll(resources);
|
193 |
+
}
|
194 |
+
// Attempt to download the resource online before falling back to
|
195 |
+
// the offline cache.
|
196 |
+
function onlineFirst(event) {
|
197 |
+
return event.respondWith(
|
198 |
+
fetch(event.request).then((response) => {
|
199 |
+
return caches.open(CACHE_NAME).then((cache) => {
|
200 |
+
cache.put(event.request, response.clone());
|
201 |
+
return response;
|
202 |
+
});
|
203 |
+
}).catch((error) => {
|
204 |
+
return caches.open(CACHE_NAME).then((cache) => {
|
205 |
+
return cache.match(event.request).then((response) => {
|
206 |
+
if (response != null) {
|
207 |
+
return response;
|
208 |
+
}
|
209 |
+
throw error;
|
210 |
+
});
|
211 |
+
});
|
212 |
+
})
|
213 |
+
);
|
214 |
+
}
|
index.html
CHANGED
@@ -1,19 +1,105 @@
|
|
1 |
-
<!
|
2 |
-
<html>
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!DOCTYPE html>
|
2 |
+
<html>
|
3 |
+
|
4 |
+
<head>
|
5 |
+
<base href="/">
|
6 |
+
|
7 |
+
<meta charset="UTF-8">
|
8 |
+
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
|
9 |
+
<meta name="description" content="Flet application.">
|
10 |
+
|
11 |
+
<!-- iOS meta tags & icons -->
|
12 |
+
<meta name="mobile-web-app-capable" content="yes">
|
13 |
+
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
14 |
+
<meta name="apple-mobile-web-app-title" content="My_Portfolio">
|
15 |
+
<link rel="apple-touch-icon" href="icons/apple-touch-icon-192.png">
|
16 |
+
|
17 |
+
<!-- Favicon -->
|
18 |
+
<link rel="icon" type="image/png" href="favicon.png" />
|
19 |
+
|
20 |
+
<!-- Flet specific -->
|
21 |
+
<meta name="flet-route-url-strategy" content="path">
|
22 |
+
<meta name="flet-web-pyodide" content="true">
|
23 |
+
<meta name="flet-websocket-endpoint-path" content="/ws">
|
24 |
+
|
25 |
+
<title>My_Portfolio</title>
|
26 |
+
<link rel="manifest" href="manifest.json">
|
27 |
+
|
28 |
+
<script>
|
29 |
+
var webRenderer = "auto";
|
30 |
+
var useColorEmoji = false;
|
31 |
+
</script>
|
32 |
+
|
33 |
+
<script>webRenderer="canvaskit";</script>
|
34 |
+
<script>useColorEmoji=false;</script>
|
35 |
+
|
36 |
+
|
37 |
+
<script>
|
38 |
+
var micropipIncludePre = false;
|
39 |
+
var pythonModuleName = "main";
|
40 |
+
</script>
|
41 |
+
<script src="python.js"></script>
|
42 |
+
|
43 |
+
</head>
|
44 |
+
|
45 |
+
<body>
|
46 |
+
<div id="loading">
|
47 |
+
<style>
|
48 |
+
body {
|
49 |
+
inset: 0;
|
50 |
+
overflow: hidden;
|
51 |
+
margin: 0;
|
52 |
+
padding: 0;
|
53 |
+
position: fixed;
|
54 |
+
}
|
55 |
+
|
56 |
+
#loading {
|
57 |
+
align-items: center;
|
58 |
+
display: flex;
|
59 |
+
height: 100%;
|
60 |
+
justify-content: center;
|
61 |
+
width: 100%;
|
62 |
+
}
|
63 |
+
|
64 |
+
#loading img {
|
65 |
+
animation: 1s ease-in-out 0s infinite alternate breathe;
|
66 |
+
opacity: .66;
|
67 |
+
transition: opacity .4s;
|
68 |
+
}
|
69 |
+
|
70 |
+
#loading.main_done img {
|
71 |
+
opacity: 1;
|
72 |
+
}
|
73 |
+
|
74 |
+
#loading.init_done img {
|
75 |
+
animation: .33s ease-in-out 0s 1 forwards zooooom;
|
76 |
+
opacity: .05;
|
77 |
+
}
|
78 |
+
|
79 |
+
@keyframes breathe {
|
80 |
+
from {
|
81 |
+
transform: scale(0.4);
|
82 |
+
opacity: 1.0;
|
83 |
+
}
|
84 |
+
|
85 |
+
to {
|
86 |
+
transform: scale(0.35);
|
87 |
+
opacity: .7;
|
88 |
+
}
|
89 |
+
}
|
90 |
+
|
91 |
+
@keyframes zooooom {
|
92 |
+
from {
|
93 |
+
transform: scale(0.4)
|
94 |
+
}
|
95 |
+
|
96 |
+
to {
|
97 |
+
transform: scale(10)
|
98 |
+
}
|
99 |
+
}
|
100 |
+
</style>
|
101 |
+
<img src="icons/loading-animation.png" alt="Loading..." />
|
102 |
+
</div>
|
103 |
+
<script src="flutter_bootstrap.js" async></script>
|
104 |
+
</body>
|
105 |
+
</html>
|
main.dart.js
ADDED
The diff for this file is too large to render.
See raw diff
|
|
manifest.json
ADDED
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"name": "My_Portfolio",
|
3 |
+
"short_name": "My_Portfolio",
|
4 |
+
"start_url": ".",
|
5 |
+
"display": "standalone",
|
6 |
+
"background_color": "#FFFFFF",
|
7 |
+
"theme_color": "#0175C2",
|
8 |
+
"description": "Flet - the fastest way to build Flutter apps in Python",
|
9 |
+
"orientation": "natural",
|
10 |
+
"prefer_related_applications": false,
|
11 |
+
"icons": [
|
12 |
+
{
|
13 |
+
"src": "icons/icon-192.png",
|
14 |
+
"sizes": "192x192",
|
15 |
+
"type": "image/png"
|
16 |
+
},
|
17 |
+
{
|
18 |
+
"src": "icons/icon-512.png",
|
19 |
+
"sizes": "512x512",
|
20 |
+
"type": "image/png"
|
21 |
+
},
|
22 |
+
{
|
23 |
+
"src": "icons/icon-maskable-192.png",
|
24 |
+
"sizes": "192x192",
|
25 |
+
"type": "image/png",
|
26 |
+
"purpose": "maskable"
|
27 |
+
},
|
28 |
+
{
|
29 |
+
"src": "icons/icon-maskable-512.png",
|
30 |
+
"sizes": "512x512",
|
31 |
+
"type": "image/png",
|
32 |
+
"purpose": "maskable"
|
33 |
+
}
|
34 |
+
]
|
35 |
+
}
|
python-worker.js
ADDED
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
importScripts("https://cdn.jsdelivr.net/pyodide/v0.24.1/full/pyodide.js");
|
2 |
+
|
3 |
+
self.micropipIncludePre = false;
|
4 |
+
self.pythonModuleName = null;
|
5 |
+
self.initialized = false;
|
6 |
+
self.flet_js = {}; // namespace for Python global functions
|
7 |
+
|
8 |
+
self.initPyodide = async function () {
|
9 |
+
self.pyodide = await loadPyodide();
|
10 |
+
self.pyodide.registerJsModule("flet_js", flet_js);
|
11 |
+
flet_js.documentUrl = documentUrl;
|
12 |
+
await self.pyodide.loadPackage("micropip");
|
13 |
+
let pre = self.micropipIncludePre ? "True" : "False";
|
14 |
+
await self.pyodide.runPythonAsync(`
|
15 |
+
import micropip
|
16 |
+
import os
|
17 |
+
from pyodide.http import pyfetch
|
18 |
+
response = await pyfetch("app.tar.gz")
|
19 |
+
await response.unpack_archive()
|
20 |
+
if os.path.exists("requirements.txt"):
|
21 |
+
with open("requirements.txt", "r") as f:
|
22 |
+
deps = [line.rstrip() for line in f]
|
23 |
+
print("Loading requirements.txt:", deps)
|
24 |
+
await micropip.install(deps, pre=${pre})
|
25 |
+
`);
|
26 |
+
pyodide.pyimport(self.pythonModuleName);
|
27 |
+
await self.flet_js.start_connection(self.receiveCallback);
|
28 |
+
self.postMessage("initialized");
|
29 |
+
};
|
30 |
+
|
31 |
+
self.receiveCallback = (message) => {
|
32 |
+
self.postMessage(message);
|
33 |
+
}
|
34 |
+
|
35 |
+
self.onmessage = async (event) => {
|
36 |
+
// run only once
|
37 |
+
if (!self.initialized) {
|
38 |
+
self.initialized = true;
|
39 |
+
self.documentUrl = event.data.documentUrl;
|
40 |
+
self.micropipIncludePre = event.data.micropipIncludePre;
|
41 |
+
self.pythonModuleName = event.data.pythonModuleName;
|
42 |
+
await self.initPyodide();
|
43 |
+
} else {
|
44 |
+
// message
|
45 |
+
flet_js.send(event.data);
|
46 |
+
}
|
47 |
+
};
|
python.js
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
const pythonWorker = new Worker("python-worker.js");
|
2 |
+
|
3 |
+
let _onPythonInitialized = null;
|
4 |
+
let pythonInitialized = new Promise((onSuccess) => _onPythonInitialized = onSuccess);
|
5 |
+
let _onReceivedCallback = null;
|
6 |
+
|
7 |
+
pythonWorker.onmessage = (event) => {
|
8 |
+
if (event.data == "initialized") {
|
9 |
+
_onPythonInitialized();
|
10 |
+
} else {
|
11 |
+
_onReceivedCallback(event.data);
|
12 |
+
}
|
13 |
+
};
|
14 |
+
|
15 |
+
documentUrl = document.URL;
|
16 |
+
|
17 |
+
// initialize worker
|
18 |
+
pythonWorker.postMessage({ documentUrl, micropipIncludePre, pythonModuleName });
|
19 |
+
|
20 |
+
async function jsConnect(receiveCallback) {
|
21 |
+
_onReceivedCallback = receiveCallback;
|
22 |
+
await pythonInitialized;
|
23 |
+
console.log("Python engine initialized!");
|
24 |
+
}
|
25 |
+
|
26 |
+
async function jsSend(data) {
|
27 |
+
pythonWorker.postMessage(data);
|
28 |
+
}
|
version.json
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
{"app_name":"flet_client","version":"1.0.0","build_number":"1","package_name":"flet_client"}
|