diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml new file mode 100644 index 0000000..460f782 --- /dev/null +++ b/.github/workflows/static.yml @@ -0,0 +1,43 @@ +# Simple workflow for deploying static content to GitHub Pages +name: Deploy static content to Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: ["main"] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + # Single deploy job since we're just deploying + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Pages + uses: actions/configure-pages@v5 + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + # Upload entire repository + path: '.' + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v5 diff --git a/game/FileSaver.min.js b/game/FileSaver.min.js new file mode 100644 index 0000000..9a1e397 --- /dev/null +++ b/game/FileSaver.min.js @@ -0,0 +1,2 @@ +/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */ +var saveAs=saveAs||function(e){"use strict";if(typeof e==="undefined"||typeof navigator!=="undefined"&&/MSIE [1-9]\./.test(navigator.userAgent)){return}var t=e.document,n=function(){return e.URL||e.webkitURL||e},r=t.createElementNS("http://www.w3.org/1999/xhtml","a"),o="download"in r,a=function(e){var t=new MouseEvent("click");e.dispatchEvent(t)},i=/constructor/i.test(e.HTMLElement)||e.safari,f=/CriOS\/[\d]+/.test(navigator.userAgent),u=function(t){(e.setImmediate||e.setTimeout)(function(){throw t},0)},s="application/octet-stream",d=1e3*40,c=function(e){var t=function(){if(typeof e==="string"){n().revokeObjectURL(e)}else{e.remove()}};setTimeout(t,d)},l=function(e,t,n){t=[].concat(t);var r=t.length;while(r--){var o=e["on"+t[r]];if(typeof o==="function"){try{o.call(e,n||e)}catch(a){u(a)}}}},p=function(e){if(/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)){return new Blob([String.fromCharCode(65279),e],{type:e.type})}return e},v=function(t,u,d){if(!d){t=p(t)}var v=this,w=t.type,m=w===s,y,h=function(){l(v,"writestart progress write writeend".split(" "))},S=function(){if((f||m&&i)&&e.FileReader){var r=new FileReader;r.onloadend=function(){var t=f?r.result:r.result.replace(/^data:[^;]*;/,"data:attachment/file;");var n=e.open(t,"_blank");if(!n)e.location.href=t;t=undefined;v.readyState=v.DONE;h()};r.readAsDataURL(t);v.readyState=v.INIT;return}if(!y){y=n().createObjectURL(t)}if(m){e.location.href=y}else{var o=e.open(y,"_blank");if(!o){e.location.href=y}}v.readyState=v.DONE;h();c(y)};v.readyState=v.INIT;if(o){y=n().createObjectURL(t);setTimeout(function(){r.href=y;r.download=u;a(r);h();c(y);v.readyState=v.DONE});return}S()},w=v.prototype,m=function(e,t,n){return new v(e,t||e.name||"download",n)};if(typeof navigator!=="undefined"&&navigator.msSaveOrOpenBlob){return function(e,t,n){t=t||e.name||"download";if(!n){e=p(e)}return navigator.msSaveOrOpenBlob(e,t)}}w.abort=function(){};w.readyState=w.INIT=0;w.WRITING=1;w.DONE=2;w.error=w.onwritestart=w.onprogress=w.onwrite=w.onabort=w.onerror=w.onwriteend=null;return m}(typeof self!=="undefined"&&self||typeof window!=="undefined"&&window||this.content);if(typeof module!=="undefined"&&module.exports){module.exports.saveAs=saveAs}else if(typeof define!=="undefined"&&define!==null&&define.amd!==null){define("FileSaver.js",function(){return saveAs})} diff --git a/game/game.js b/game/game.js index b09ab86..2ed8a4d 100644 --- a/game/game.js +++ b/game/game.js @@ -3,7 +3,7 @@ var game; var bgOnly = false, showcaseOnly = false; -var version = "v1.15.2"; +var version = "v1.17.1"; (() => { var e = { 8465: (e, t, a) => { @@ -16203,6 +16203,8 @@ var version = "v1.15.2"; multiplier: e == undefined ? 1 : e?.multiplier || 1, rotation: e == null ? 0 : e.rotation || 0, offset: e == null ? 0 : e.offset || 0, + skipMissiles: + e?.skipMissiles || false }; }, newEnemy: (e) => { @@ -17252,7 +17254,7 @@ var version = "v1.15.2"; objectPolyInPoint2: (e, t, a) => de.pointInSomething(t, a, e), }, Se = A(), - Ie = makeCustomSprite({ + Clickable = makeCustomSprite({ init: () => ({ isPressed: false }), loop({ state: e, @@ -17263,6 +17265,8 @@ var version = "v1.15.2"; onPressOutside: n, width: s, height: o, + x: propX, + y: propY, }, getContext: r, updateState: l, @@ -17278,9 +17282,9 @@ var version = "v1.15.2"; justPressed: m, } = t().pointer, f = () => - be.pointInBox({ x: 0, y: 0, width: s, height: o })({ - x: u, - y: h, + be.pointInBox({ x: propX || 0, y: propY || 0, width: s, height: o })({ + x: u + (propX || 0), + y: h + (propY || 0), }), y = p && f(); return ( @@ -17450,7 +17454,7 @@ var version = "v1.15.2"; d = c / 2, u = 10 * l; return [ - Ie({ + Clickable({ id: "Clickable", width: t, height: a, @@ -18204,6 +18208,25 @@ var version = "v1.15.2"; }, isBonusTheme: true, }, + stylemix: { + id: "stylemix", + name: "Style Mix", + colour: "#006eff", + player: Wt.skins.default, + background: "stylemix", + objects: { + block: "world4", + spike: "world2", + platform: "infinite", + dirChange: "world1", + flag: "world1", + saw: "skater", + bottom: "classic", + switch: "world3", + speedChange: "world2", + }, + isBonusTheme: true, + }, synthwave: ta, world1: Jt, red: Kt, @@ -20149,6 +20172,7 @@ var version = "v1.15.2"; !(i == undefined ? false : i.init) && !i?.isVoid && !i?.isBoss && + !i.isFade && !(null == r ? void 0 : r.destroyed) && !r?.off), (a.width = i.width * t), @@ -30602,6 +30626,8 @@ var version = "v1.15.2"; `images/themes/world4/${t}/front-mountain1.png`, `images/themes/world4/${t}/front-mountain2.png`, ]; + case "stylemix": + return ["images/themes/stylemix/BG.png"]; case "skater": return [ "images/themes/skater/background/cloud1.png", @@ -30852,6 +30878,7 @@ var version = "v1.15.2"; "images/themes/world2/arrow.png", "images/themes/infinite/arrow.png", "images/themes/world1/doubleJump.png", + "images/themes/classic/doubleJump.png", "images/themes/infinite/doubleJump.png", "images/themes/world2/double-jump.png", `images/themes/${e.objects.spike == "classic" ? "classic" : e.objects.spike == "infinite" ? "infinite" : e.objects.spike == "world3" ? "world3" : "world1"}/saw-big.png`, @@ -30936,9 +30963,10 @@ var version = "v1.15.2"; ] : []), ...("world3" === e.objects.bottom || - "classic" === e.objects.bottom + "classic" === e.objects.bottom || "stylemix" === e.objects.bottom ? [ "images/themes/world3/bottom/laser-line.png", + "images/themes/world4/bottom/block.png", "images/themes/world3/bottom/block.png", "images/themes/world1/bottom/block.png", `images/themes/classic/bottom/block.png`, @@ -33960,7 +33988,7 @@ var version = "v1.15.2"; }, device: d, }) => [ - Ie({ + Clickable({ id: "Clickable", width: i, height: n, @@ -35111,7 +35139,7 @@ var version = "v1.15.2"; () => [ y( { - fileName: `images/themes/${e.theme.includes("infinite") ? e.theme : "world1"}/doubleJump.png`, + fileName: `images/themes/${e.theme.includes("infinite") ? e.theme : e.orbTheme == "classic" ? "classic" : e.orbTheme == "stylemix" ? "classic" : "world1"}/doubleJump.png`, width: e.switchButton.width, height: e.switchButton.height, }, @@ -35718,6 +35746,146 @@ var version = "v1.15.2"; document.removeEventListener("wheel", e.onScroll, false); }, }), + DropdownButton = makeCustomSprite({ + init: ({ props }) => { + return { + menuOpened: false, + choice: props.choice + }; + }, + render: ({ + props: { + text: e, + width: t, + height: a, + darkText: i = false, + darkBg: s = false, + disabled: disabled = false, + fontSize: fontSize = 15, + shadowDir: l, + onPress: c, + noPress: d, + strokeColor: u, + textColor: h, + textStroke: p, + textStrokeThickness: g, + options, + }, + state, + device: m, + }) => { + let textLength = cy.measureTexts( + [localize(e)], + { family: "Montserrat", size: fontSize, weight: 900 })[0], + menuHeight = Math.abs((-nr * i - 20) * (options.length + 1)) + nr, + menuOffset = menuHeight / 2 + a / 2; + return [ + ...(state.menuOpened ? [Clickable({ + id: "ClickOutside", + onPressOutside: () => { + state.menuOpened = false + }, + width: ar, + height: menuHeight, + y: -menuOffset, + sprites: () => [], + onPress: () => null, + }), + r({ + path: [ + [-ar / 2, menuHeight / 2], + [ar / 2, menuHeight / 2], + [ar / 2, -menuHeight / 2 + 30], + [ar / 2 - 30, -menuHeight / 2], + [-ar / 2, -menuHeight / 2], + ], + y: -menuOffset, + fillColor: ve, + }), + o({ width: ar - 20, height: menuHeight - 20, x: -10, y: 10 - menuOffset, color: je }), + ScrollContainer({ + id: "ScrollContainer", + containerHeight: menuHeight - 20, + containerWidth: ar - 20, + contentHeight: menuHeight - 20, + x: -10, + y: menuHeight / 2 - menuOffset, + sprites: (a) => + options.map((t, i) => + Clickable({ + id: `OptionClickable-${i}`, + y: -nr * i - 20, + width: ar, + height: nr, + onPress: () => { + m.audio("audio/global/button.wav").play(0); + state.menuOpened = false; + state.choice = i; + c(i); + }, + disabled: false, + sprites: (c) => [ + n({ + id: `TextOption-${i}`, + text: localize(t), + weight: 500, + y: 1 - c * 3, + }), + ], + }), + ), + })] : []), + Clickable({ + id: "Clickable", + width: t, + height: a, + onPress: () => { + m.audio("audio/global/button.wav").play(0); + state.menuOpened = !state.menuOpened; + // c(); + }, + disabled: disabled || d, + sprites: (c) => [ + + So({ + id: "RaiseRects", + width: t, + height: a, + raiseHeight: 5, + rad: 5, + isPressed: c, + topColour: disabled ? Xe : c ? ke : Re, + bottomColour: s ? Be : ve, + stroke: { + thickness: 2, + colour: disabled ? ze : u || (s ? Ye : Me), + }, + shadowDir: l, + sprites: (t) => [ + n({ + font: { size: fontSize }, + text: localize(e), // screw it + color: disabled ? ze : c ? Ae : h || (i ? Ue : Be), + strokeColor: p, + strokeThickness: g, + y: t - 1 + 5, + }), + r({ + path: [ + [-fontSize / 2, fontSize / 2], + [fontSize / 2, fontSize / 2], + [0, -fontSize / 5], + ], + fillColor: disabled ? ze : c ? Ae : h || (i ? Ue : Be), + y: t - 3 - 10 + }) + ], + }), + ], + }), + ] + }, + }), Fo = makeCustomSprite({ render: ({ props: { @@ -35738,7 +35906,7 @@ var version = "v1.15.2"; }, device: m, }) => [ - Ie({ + Clickable({ id: "Clickable", width: t, height: a, @@ -37231,7 +37399,7 @@ var version = "v1.15.2"; }; }, render: ({ props: e, state: { objects: t } }) => [ - Ie({ + Clickable({ id: "ClickOutside", onPressOutside: e.closeMenu, width: ar, @@ -37292,7 +37460,7 @@ var version = "v1.15.2"; r = [`${r[0]} ${r[1]}`, r[2]]; } return [ - Ie({ + Clickable({ id: "Clickable", width: i, height: s, @@ -37349,7 +37517,7 @@ var version = "v1.15.2"; }), themeMenu = makeCustomSprite({ render: ({ props: e }) => [ - Ie({ + Clickable({ id: "ClickOutside", onPressOutside: e.closeMenu, width: ar, @@ -40519,7 +40687,7 @@ var version = "v1.15.2"; }, Cr = makeCustomSprite({ render: ({ props: { onPress: e, colour: t = "black" } }) => [ - Ie({ + Clickable({ id: "ClickableArrow", width: 20, height: 30, @@ -40598,7 +40766,7 @@ var version = "v1.15.2"; }, device: g, }) => [ - Ie({ + Clickable({ id: "Clickable", width: d, height: u, @@ -40655,7 +40823,7 @@ var version = "v1.15.2"; } const d = 40 + 9 * localize(c).length; return [ - Ie({ + Clickable({ id: "LevelObjectMenuClickable", onPress: () => null, width: 200, @@ -42273,6 +42441,7 @@ var version = "v1.15.2"; isEditor: true, justHit: false, theme: switchTheme, + orbTheme: g.properties.theme.id === "classic" ? "classic" : g.properties.theme.id === "stylemix" ? "classic" : switchTheme, spineContext: getContext(Ws), paused: pauseAnimations, scale: propsScale, @@ -42578,6 +42747,7 @@ var version = "v1.15.2"; isEditor: true, justHit: false, theme: n.switch, + orbTheme: t.properties.theme.id === "classic" ? "classic" : t.properties.theme.id === "stylemix" ? "classic" : n.switch, paused: paused, spineContext: spineContext, scale: scale, @@ -42899,7 +43069,7 @@ var version = "v1.15.2"; }, sprites: (t) => [ conditional( - () => e.theme === "infinite", + () => e.theme === "infinite" || e.theme === "stylemix", () => [ p( { @@ -43848,7 +44018,7 @@ var version = "v1.15.2"; ((U.playerRot += ((90 * U.playerDir * df) / C) * U.gravity * - (U.dashing ? 2 : 1)), + (U.dashing ? 3 : 1)), U.playerRot < 0 ? (U.playerRot += 360) : U.playerRot > 360 && (U.playerRot -= 360)); @@ -47397,7 +47567,7 @@ var version = "v1.15.2"; { levelName: "Aurora", levelFileName: "aurora", - + author: "d016", song: hl.songs.aura, unlockedByIndex: null, x: 0, @@ -48990,7 +49160,8 @@ var version = "v1.15.2"; (e[(e.World4Red = 8)] = "World4Red"), (e[(e.World4Boss = 9)] = "World4Boss"), (e[(e.World3Red = 10)] = "World3Red"), - (e[(e.Skater = 11)] = "Skater")); + (e[(e.Skater = 11)] = "Skater"), + (e[(e.StyleMix = 12)] = "StyleMix")); })(rd || (rd = {})), (function (e) { ((e[(e.Rot0 = 0)] = "Rot0"), @@ -49169,6 +49340,7 @@ var version = "v1.15.2"; e[(e.Classic = 16)] = "Classic"; e[(e.Infinite = 17)] = "Infinite"; e[(e.Virtual = 18)] = "Virtual"; + e[(e.StyleMix = 19)] = "StyleMix"; })(Od || (Od = {})), (function (e) { ((e[(e.Gun = 0)] = "Gun"), @@ -49295,6 +49467,7 @@ var version = "v1.15.2"; e[(e.Classic = 16)] = "Classic"; e[(e.Infinite = 17)] = "Infinite"; e[(e.Virtual = 18)] = "Virtual"; + e[(e.StyleMix = 19)] = "StyleMix"; })(xd || (xd = {}))); const Bd = Gc([ mc, @@ -50168,6 +50341,7 @@ var version = "v1.15.2"; [xd.Fighter]: "fighter", [xd.Classic]: "classic", [xd.Infinite]: "infinite", + [xd.StyleMix]: "stylemix", [xd.Virtual]: "virtual", }, Vd = { @@ -51537,17 +51711,33 @@ var version = "v1.15.2"; return false; }, supportsFiles: function () { - return false; + return true; }, openFile: function () { - return Xu(this, void 0, void 0, function* () { - var f = new FileReader(); - return; + var input = document.createElement("input"); + var file = null; + input.type = "file"; + input.accepts = ".json"; + input.click(); + let filePromise = new Promise((resolve) => { + input.addEventListener("change", function () { + file = this.files[0]; + var reader = new FileReader(); + + reader.onload = function (evt) { + resolve(evt.target.result); + }; + + reader.readAsText(file); + }); }); + return filePromise; }, - saveFile: function (e, t) { + saveFile: function (name, data, mime) { return Xu(this, void 0, void 0, function* () { - return false; + let blob = new Blob([data], { type: mime }); + saveAs(blob, name) + return true; }); }, googleSignIn: function () { @@ -58427,6 +58617,49 @@ var version = "v1.15.2"; }, ), ]; + case "stylemix": + return [ + Go.Single( + { + targetOpacity: 1, + targetColor: e.bgColor || "#006eff", + sprite: (s, k) => [ + p( + { + color: k.ref, + width: t.size.fullWidth, + height: t.size.fullHeight, + opacity: 1, + }, + (j) => ( + (j.width = t.size.fullWidth), + (j.height = t.size.fullHeight), + (j.color = k.ref), + (j.opacity = 1) + ), + ), + ], + }, + (t) => { + t.targetOpacity = 1; + t.targetColor = e.bgColor || "#006eff"; + }, + ), + dg.Single( + { + fileName: + "images/themes/stylemix/BG.png", + playerX: 0 * e.cameraX, + playerY: 0, + height: 718, + y: 50, + }, + (t) => { + ((t.playerX = 0.05 * e.cameraX), + (t.playerY = 0)); + }, + ), + ]; case "infinite": let infiniteTileSprites = []; return [ @@ -60082,7 +60315,7 @@ var version = "v1.15.2"; a.y = et.initialPosition.y - M / 2 - e.cameraY - 1; }, ) - : e.theme == "infinite" + : e.theme == "infinite" || e.theme == "stylemix" ? p( { width: 660 * 2, @@ -60761,6 +60994,7 @@ var version = "v1.15.2"; (t.paused = e.paused), (t.df = e.df), (t.theme = e.layout.properties.theme.objects.switch), + (t.orbTheme = e.layout.properties.theme.id === "classic" ? "classic" : t.orbTheme = e.layout.properties.theme.id === "stylemix" ? "classic" : e.layout.properties.theme.objects.switch), t.theme === "infinite" && (t.theme = getInfiniteThemePath(e.bgColor)), (t.justHit = null !== e.justHitObject && @@ -61789,7 +62023,7 @@ var version = "v1.15.2"; }, ), ] - : t.theme == "infinite" + : t.theme == "infinite" || t.theme == "stylemix" ? [ u( { @@ -62050,7 +62284,7 @@ var version = "v1.15.2"; }) { const { onModalClose: o, onPurchaseComplete: r } = t; return [ - Ie({ + Clickable({ id: "ClickOutside", onPressOutside: o, width: 400, @@ -62399,7 +62633,7 @@ var version = "v1.15.2"; }, device: p, }) => [ - Ie({ + Clickable({ id: "Clickable", width: a, height: i, @@ -64110,7 +64344,7 @@ var version = "v1.15.2"; '{"329":1,"336":0,"457":1,"464":0,"490":1,"496":0,"524":1,"531":0,"682":1,"689":0,"764":1,"770":0,"801":1,"807":0,"830":1,"836":0,"1004":1,"1020":0,"1033":1,"1040":0,"1062":1,"1070":0,"1094":1,"1099":0,"1122":1,"1129":0,"1172":1,"1179":0,"1206":1,"1213":0,"1271":1,"1278":0,"1379":1,"1387":0,"1410":1,"1417":0,"1453":1,"1458":0,"1526":1,"1532":0,"1549":1,"1554":0,"1618":1,"1688":0,"1734":1,"1743":0,"1762":1,"1770":0,"1800":1,"1805":0,"1887":1,"1894":0,"1918":1,"1924":0,"1958":1,"1964":0,"2002":1,"2009":0,"2073":1,"2081":0,"2196":1,"2207":0,"2288":1,"2295":0,"2420":1,"2428":0,"2582":1,"2590":0,"2645":1,"2652":0,"2674":1,"2679":0,"2706":1,"2711":0,"2728":1,"2733":0,"2812":1,"2820":0,"2841":1,"2848":0,"2904":1,"2911":0,"3019":1,"3094":0,"3121":1,"3128":0,"3183":1,"3184":0,"3224":1,"3230":0,"3306":1,"3349":0,"3398":1,"3404":0,"3464":1,"3558":0,"3699":1,"3705":0,"3826":1,"3832":0,"3871":1,"3875":0,"3904":1,"3909":0,"3934":1,"3939":0,"4000":1,"4006":0,"4042":1,"4048":0,"4073":1,"4078":0,"4164":1,"4171":0,"4216":1,"4221":0,"4264":1,"4270":0,"4347":1,"4353":0,"4369":1,"4376":0,"4394":1,"4401":0,"4430":1,"4436":0,"4717":1,"4723":0,"4867":1,"4873":0,"4966":1,"4970":0,"5006":1,"5014":0,"5044":1,"5049":0,"5104":1,"5113":0,"5125":1,"5130":0,"5184":1,"5189":0,"5235":1,"5241":0,"5264":1,"5270":0,"5292":1,"5293":0,"5328":1,"5333":0,"5378":1,"5384":0,"5415":1,"5425":0,"5455":1,"5461":0,"5605":1,"5614":0,"5645":1,"5663":0,"5672":1,"5682":0,"5688":1,"5698":0,"5735":1,"5742":0,"5822":1,"5850":0,"5875":1,"5885":0,"5971":1,"5975":0,"5998":1,"6006":0,"6030":1,"6041":0,"6051":1,"6059":0,"6070":1,"6079":0,"6091":1,"6099":0,"6143":1,"6150":0,"6211":1,"6219":0,"6238":1,"6245":0,"6298":1,"6305":0,"6328":1,"6334":0,"6365":1,"6371":0,"6396":1,"6401":0,"6424":1,"6428":0,"6577":1,"6583":0,"6636":1,"6644":0,"6684":1,"6691":0,"6746":1,"6752":0,"6825":1,"6831":0,"6885":1,"6890":0,"6911":1,"6918":0,"6955":1,"6961":0,"7000":1,"7007":0,"7120":1,"7125":0,"7148":1,"7154":0,"7178":1,"7184":0,"7202":1,"7209":0,"7226":1,"7236":0,"7255":1,"7261":0,"7332":1,"7337":0,"7456":1,"7460":0,"7483":1,"7488":0,"7543":1,"7551":0,"7577":1,"7583":0,"7637":1,"7643":0,"7680":1,"7687":0,"7713":1,"7845":0,"7904":1,"8011":0,"8031":1,"8038":0,"8080":1,"8089":0,"8120":1,"8125":0,"8150":1,"8156":0,"8211":1,"8218":0,"8249":1,"8254":0,"8325":1,"8329":0,"8382":1,"8389":0,"8416":1,"8424":0,"8448":1,"8457":0,"8484":1,"8545":0,"8580":1,"8620":0,"8664":1,"8789":0,"8812":1,"8820":0,"8846":1,"8890":0,"8918":1,"8929":0,"8956":1,"8964":0,"9010":1,"9017":0,"9047":1,"9053":0,"9094":1,"9099":0,"9135":1,"9140":0,"9178":1,"9184":0,"9203":1,"9211":0}' ), Jm = JSON.parse( - '{"67":1,"73":0,"92":1,"98":0,"130":1,"137":0,"154":1,"161":0,"178":1,"270":0,"308":1,"313":0,"352":1,"378":0,"402":1,"410":0,"439":1,"444":0,"479":1,"484":0,"517":1,"523":0,"562":1,"588":0,"605":1,"642":0,"664":1,"674":0,"711":1,"718":0,"742":1,"748":0,"758":1,"765":0,"783":1,"790":0,"810":1,"816":0,"838":1,"844":0,"933":1,"937":0,"941":1,"990":0,"1030":1,"1039":0,"1051":1,"1058":0,"1074":1,"1082":0,"1091":1,"1099":0,"1127":1,"1134":0,"1155":1,"1189":0,"1234":1,"1246":0,"1259":1,"1298":0,"1351":1,"1382":0,"1404":1,"1430":0,"1457":1,"1466":0,"1508":1,"1543":0,"1565":1,"1572":0,"1616":1,"1623":0,"1646":1,"1652":0,"1675":1,"1683":0,"1694":1,"1702":0,"1713":1,"1726":0,"1747":1,"1753":0,"1802":1,"1809":0,"1836":1,"1869":0,"1890":1,"1900":0,"1916":1,"1923":0,"1949":1,"1957":0,"1982":1,"2010":0,"2057":1,"2064":0,"2085":1,"2091":0,"2113":1,"2119":0,"2165":1,"2171":0,"2242":1,"2250":0,"2268":1,"2275":0,"2302":1,"2309":0,"2334":1,"2342":0,"2362":1,"2368":0,"2409":1,"2416":0,"2440":1,"2447":0,"2459":1,"2471":0,"2491":1,"2497":0,"2520":1,"2531":0,"2544":1,"2552":0,"2573":1,"2582":0,"2603":1,"2610":0,"2626":1,"2633":0,"2657":1,"2663":0,"2705":1,"2712":0,"2742":1,"2749":0,"2762":1,"2769":0,"2795":1,"2804":0,"2842":1,"2911":0,"2939":1,"2946":0,"2958":1,"2964":0,"2989":1,"2996":0,"3051":1,"3059":0,"3137":1,"3143":0,"3187":1,"3194":0,"3224":1,"3255":0,"3284":1,"3293":0,"3312":1,"3319":0,"3356":1,"3362":0,"3392":1,"3401":0,"3458":1,"3466":0,"3477":1,"3486":0,"3508":1,"3516":0,"3572":1,"3581":0,"3641":1,"3648":0,"3678":1,"3714":0,"3750":1,"3759":0,"3785":1,"3791":0,"3858":1,"3965":0,"4069":1,"4105":0,"4150":1,"4177":0,"4209":1,"4279":0,"4318":1,"4338":0,"4345":1,"4358":0,"4373":1,"4381":0,"4405":1,"4413":0,"4448":1,"4456":0,"4492":1,"4499":0,"4529":1,"4535":0,"4559":1,"4567":0,"4596":1,"4607":0,"4632":1,"4640":0,"4657":1,"4665":0,"4685":1,"4692":0,"4724":1,"4789":0,"4817":1,"4829":0,"4851":1,"4859":0,"4878":1,"4884":0,"4945":1,"4954":0,"4971":1,"4977":0,"5001":1,"5008":0,"5041":1,"5051":0,"5081":1,"5118":0,"5158":1,"5165":0,"5183":1,"5190":0,"5208":1,"5218":0,"5234":1,"5241":0,"5266":1,"5334":0,"5362":1,"5372":0,"5402":1,"5413":0,"5442":1,"5453":0,"5474":1,"5514":0,"5533":1,"5544":0,"5602":1,"5638":0,"5659":1,"5675":0,"5709":1,"5723":0,"5787":1,"5822":0,"5858":1,"5937":0,"6023":1,"6051":0,"6075":1,"6107":0,"6118":1,"6153":0,"6180":1,"6210":0,"6245":1,"6256":0,"6274":1,"6281":0,"6305":1,"6310":0,"6332":1,"6338":0,"6352":1,"6358":0,"6373":1,"6380":0,"6402":1,"6411":0,"6426":1,"6433":0,"6459":1,"6466":0,"6504":1,"6510":0,"6554":1,"6643":0,"6690":1,"6698":0,"6721":1,"6731":0,"6745":1,"6754":0,"6777":1,"6787":0,"6804":1,"6814":0,"6827":1,"6834":0,"6859":1,"6866":0,"6890":1,"6897":0,"6934":1,"6942":0,"6968":1,"6976":0,"6992":1,"7000":0,"7020":1,"7027":0,"7051":1,"7060":0,"7124":1,"7132":0,"7158":1,"7166":0,"7186":1,"7193":0,"7213":1,"7224":0,"7238":1,"7247":0,"7264":1,"7272":0,"7318":1,"7326":0,"7346":1,"7355":0,"7372":1,"7380":0,"7403":1,"7409":0,"7452":1,"7457":0,"7501":1,"7508":0,"7562":1,"7569":0,"7585":1,"7593":0,"7633":1,"7639":0,"7666":1,"7672":0,"7700":1,"7710":0,"7736":1,"7744":0,"7772":1,"7780":0,"7809":1,"7816":0,"7888":1,"7896":0,"7922":1,"7930":0,"7996":1,"8004":0,"8030":1,"8068":0,"8123":1,"8158":0,"8170":1,"8179":0,"8217":1,"8225":0,"8267":1,"8274":0,"8314":1,"8321":0,"8356":1,"8362":0,"8372":1,"8379":0,"8432":1,"8461":0,"8490":1,"8499":0,"8515":1,"8526":0,"8548":1,"8584":0,"8601":1,"8664":0,"8693":1,"8724":0,"8818":1,"8825":0}' + '{"70":1,"77":0,"90":1,"99":0,"130":1,"149":0,"151":1,"166":0,"176":1,"188":0,"206":1,"215":0,"231":1,"238":0,"259":1,"267":0,"309":1,"316":0,"352":1,"379":0,"401":1,"411":0,"440":1,"446":0,"484":1,"491":0,"517":1,"522":0,"563":1,"587":0,"607":1,"638":0,"664":1,"669":0,"708":1,"717":0,"736":1,"743":0,"761":1,"767":0,"788":1,"794":0,"814":1,"820":0,"839":1,"846":0,"934":1,"987":0,"1031":1,"1084":0,"1094":1,"1100":0,"1125":1,"1187":0,"1238":1,"1291":0,"1354":1,"1382":0,"1403":1,"1423":0,"1457":1,"1466":0,"1507":1,"1543":0,"1563":1,"1569":0,"1618":1,"1632":0,"1649":1,"1657":0,"1676":1,"1682":0,"1694":1,"1702":0,"1713":1,"1724":0,"1753":1,"1758":0,"1803":1,"1810":0,"1837":1,"1858":0,"1887":1,"1899":0,"1913":1,"1922":0,"1945":1,"1952":0,"1983":1,"1988":0,"2004":1,"2011":0,"2058":1,"2065":0,"2082":1,"2090":0,"2112":1,"2118":0,"2166":1,"2172":0,"2244":1,"2252":0,"2271":1,"2279":0,"2303":1,"2309":0,"2330":1,"2336":0,"2360":1,"2366":0,"2407":1,"2413":0,"2438":1,"2445":0,"2461":1,"2469":0,"2492":1,"2498":0,"2521":1,"2527":0,"2547":1,"2553":0,"2574":1,"2581":0,"2603":1,"2609":0,"2627":1,"2634":0,"2656":1,"2663":0,"2705":1,"2712":0,"2742":1,"2748":0,"2761":1,"2769":0,"2794":1,"2801":0,"2845":1,"2851":0,"2868":1,"2907":0,"2939":1,"2946":0,"2955":1,"2962":0,"2989":1,"2996":0,"3052":1,"3061":0,"3139":1,"3145":0,"3188":1,"3194":0,"3224":1,"3227":0,"3244":1,"3250":0,"3283":1,"3293":0,"3314":1,"3321":0,"3354":1,"3361":0,"3393":1,"3399":0,"3460":1,"3466":0,"3480":1,"3486":0,"3514":1,"3521":0,"3572":1,"3580":0,"3638":1,"3646":0,"3679":1,"3687":0,"3702":1,"3712":0,"3750":1,"3759":0,"3786":1,"3795":0,"3855":1,"3861":0,"3882":1,"3887":0,"3907":1,"3913":0,"3929":1,"3936":0,"3949":1,"3955":0,"4071":1,"4075":0,"4095":1,"4099":0,"4153":1,"4160":0,"4171":1,"4178":0,"4209":1,"4217":0,"4234":1,"4243":0,"4263":1,"4271":0,"4320":1,"4326":0,"4346":1,"4353":0,"4373":1,"4379":0,"4410":1,"4416":0,"4448":1,"4456":0,"4493":1,"4500":0,"4530":1,"4535":0,"4557":1,"4563":0,"4599":1,"4608":0,"4635":1,"4641":0,"4659":1,"4666":0,"4685":1,"4694":0,"4724":1,"4733":0,"4748":1,"4755":0,"4772":1,"4781":0,"4819":1,"4830":0,"4853":1,"4862":0,"4880":1,"4888":0,"4946":1,"4955":0,"4968":1,"4979":0,"4998":1,"5009":0,"5042":1,"5050":0,"5079":1,"5112":0,"5159":1,"5165":0,"5187":1,"5246":0,"5270":1,"5331":0,"5361":1,"5370":0,"5402":1,"5412":0,"5442":1,"5452":0,"5481":1,"5490":0,"5503":1,"5511":0,"5534":1,"5543":0,"5598":1,"5602":0,"5623":1,"5627":0,"5659":1,"5670":0,"5713":1,"5721":0,"5787":1,"5795":0,"5808":1,"5820":0,"5858":1,"5867":0,"5878":1,"5886":0,"5897":1,"5912":0,"5921":1,"5935":0,"6016":1,"6024":0,"6044":1,"6051":0,"6062":1,"6069":0,"6121":1,"6128":0,"6144":1,"6154":0,"6186":1,"6194":0,"6252":1,"6257":0,"6282":1,"6288":0,"6311":1,"6316":0,"6338":1,"6347":0,"6363":1,"6373":0,"6389":1,"6398":0,"6443":1,"6451":0,"6474":1,"6482":0,"6500":1,"6506":0,"6525":1,"6532":0,"6552":1,"6560":0,"6575":1,"6586":0,"6599":1,"6609":0,"6619":1,"6629":0,"6690":1,"6700":0,"6710":1,"6717":0,"6742":1,"6752":0,"6757":1,"6774":0,"6797":1,"6804":0,"6825":1,"6832":0,"6851":1,"6858":0,"6878":1,"6887":0,"6930":1,"6935":0,"6961":1,"6969":0,"6990":1,"6997":0,"7016":1,"7022":0,"7043":1,"7051":0,"7068":1,"7075":0,"7126":1,"7131":0,"7161":1,"7167":0,"7187":1,"7193":0,"7213":1,"7220":0,"7235":1,"7241":0,"7272":1,"7280":0,"7316":1,"7325":0,"7341":1,"7348":0,"7369":1,"7376":0,"7405":1,"7413":0,"7561":1,"7569":0,"7587":1,"7591":0,"7638":1,"7643":0,"7669":1,"7674":0,"7703":1,"7710":0,"7736":1,"7742":0,"7776":1,"7783":0,"7811":1,"7819":0,"7888":1,"7894":0,"7923":1,"7931":0,"7997":1,"8003":0,"8029":1,"8035":0,"8057":1,"8062":0,"8084":1,"8092":0,"8127":1,"8133":0,"8151":1,"8159":0,"8169":1,"8177":0,"8205":1,"8227":0,"8268":1,"8275":0,"8313":1,"8320":0,"8351":1,"8377":0,"8434":1,"8463":0,"8490":1,"8502":0,"8518":1,"8526":0,"8546":1,"8582":0,"8601":1,"8660":0,"8692":1,"8722":0,"8817":1,"8826":0}' ), Km = JSON.parse( '{"107":1,"114":0,"179":1,"187":0,"260":1,"267":0,"347":1,"354":0,"405":1,"412":0,"471":1,"671":0,"750":1,"757":0,"779":1,"787":0,"804":1,"813":0,"874":1,"882":0,"929":1,"936":0,"984":1,"990":0,"1040":1,"1047":0,"1206":1,"1213":0,"1259":1,"1267":0,"1316":1,"1323":0,"1356":1,"1696":0,"1716":1,"1726":0,"1763":1,"1771":0,"1833":1,"1841":0,"1887":1,"1898":0,"1970":1,"2074":0,"2148":1,"2155":0,"2206":1,"2214":0,"2290":1,"2298":0,"2344":1,"2352":0,"2501":1,"2507":0,"2621":1,"2629":0,"2727":1,"2736":0,"2789":1,"2797":0,"2863":1,"2871":0,"2919":1,"2943":0,"3071":1,"3079":0,"3161":1,"3168":0,"3250":1,"3332":0,"3389":1,"3398":0,"3426":1,"3436":0,"3455":1,"3463":0,"3522":1,"3528":0,"3616":1,"3623":0,"3741":1,"3748":0,"3840":1,"3848":0,"3890":1,"3899":0,"3983":1,"4040":0,"4116":1,"4124":0,"4174":1,"4181":0,"4211":1,"4292":0,"4332":1,"4341":0,"4373":1,"4381":0,"4421":1,"4480":0,"4526":1,"4533":0,"4580":1,"4588":0,"4600":1,"4616":0,"4649":1,"4684":0,"4718":1,"4728":0,"4750":1,"4758":0,"4788":1,"4839":0,"4935":1,"4944":0,"4984":1,"4993":0,"5021":1,"5032":0,"5068":1,"5076":0,"5101":1,"5110":0,"5144":1,"5153":0,"5200":1,"5209":0,"5258":1,"5295":0,"5324":1,"5332":0,"5355":1,"5363":0,"5421":1,"5430":0,"5521":1,"5528":0,"5557":1,"5643":0,"5683":1,"5715":0,"5829":1,"5837":0,"5887":1,"5894":0,"5933":1,"5941":0,"6014":1,"6022":0,"6183":1,"6192":0,"6278":1,"6285":0,"6331":1,"6340":0,"6374":1,"6381":0,"6437":1,"6444":0,"6488":1,"6496":0,"6542":1,"6548":0,"6589":1,"6599":0,"6639":1,"6648":0,"6704":1,"6714":0,"6767":1,"6774":0,"6803":1,"6811":0,"6865":1,"6875":0,"6938":1,"6944":0,"7016":1,"7024":0,"7046":1,"7055":0,"7085":1,"7092":0,"7149":1,"7158":0,"7206":1,"7214":0,"7334":1,"7341":0,"7464":1,"7471":0}', @@ -64122,7 +64356,7 @@ var version = "v1.15.2"; '{"58":1,"64":0,"165":1,"173":0,"193":1,"204":0,"219":1,"237":0,"273":1,"284":0,"304":1,"334":0,"460":1,"483":0,"564":1,"579":0,"595":1,"612":0,"628":1,"640":0,"699":1,"714":0,"862":1,"868":0,"875":1,"899":0,"924":1,"933":0,"953":1,"961":0,"1026":1,"1073":0,"1119":1,"1165":0,"1275":1,"1286":0,"1304":1,"1319":0,"1329":1,"1341":0,"1380":1,"1389":0,"1411":1,"1419":0,"1514":1,"1529":0,"1542":1,"1552":0,"1567":1,"1576":0,"1591":1,"1602":0,"1663":1,"1676":0,"1698":1,"1712":0,"1729":1,"1742":0,"1756":1,"1764":0,"1805":1,"1813":0,"1860":1,"1883":0,"1903":1,"1914":0,"1928":1,"1942":0,"1956":1,"1963":0,"1989":1,"1998":0,"2049":1,"2098":0,"2142":1,"2155":0,"2225":1,"2237":0,"2250":1,"2258":0,"2271":1,"2279":0,"2294":1,"2306":0,"2322":1,"2329":0,"2361":1,"2368":0,"2410":1,"2448":0,"2479":1,"2505":0,"2589":1,"2596":0,"2618":1,"2632":0,"2646":1,"2653":0,"2670":1,"2686":0,"2719":1,"2726":0,"2770":1,"2782":0,"2802":1,"2817":0,"2834":1,"2848":0,"2862":1,"2876":0,"2973":1,"2980":0,"3002":1,"3031":0,"3114":1,"3125":0,"3144":1,"3156":0,"3169":1,"3183":0,"3228":1,"3265":0,"3299":1,"3309":0,"3349":1,"3392":0,"3427":1,"3458":0,"3484":1,"3512":0,"3527":1,"3538":0,"3568":1,"3578":0,"3597":1,"3638":0,"3733":1,"3742":0,"3763":1,"3784":0,"3810":1,"3830":0,"3854":1,"3880":0,"3903":1,"3922":0,"3946":1,"3973":0,"3997":1,"4015":0,"4039":1,"4052":0,"4093":1,"4113":0,"4137":1,"4147":0,"4164":1,"4203":0,"4228":1,"4237":0,"4272":1,"4379":0,"4386":1,"4399":0,"4468":1,"4475":0,"4496":1,"4513":0,"4530":1,"4546":0,"4570":1,"4595":0,"4616":1,"4630":0,"4638":1,"4643":0,"4660":1,"4672":0,"4688":1,"4706":0,"4729":1,"4754":0,"4770":1,"4782":0,"4799":1,"4828":0,"4847":1,"4863":0,"4872":1,"4877":0,"4906":1,"4923":0,"4947":1,"4978":0,"4992":1,"5010":0,"5036":1,"5069":0,"5082":1,"5100":0,"5118":1,"5129":0,"5146":1,"5160":0,"5211":1,"5221":0,"5232":1,"5246":0,"5260":1,"5271":0,"5287":1,"5300":0,"5309":1,"5318":0,"5375":1,"5410":0,"5447":1,"5459":0,"5473":1,"5482":0,"5493":1,"5503":0,"5522":1,"5533":0,"5542":1,"5547":0,"5587":1,"5601":0,"5609":1,"5626":0,"5652":1,"5664":0,"5676":1,"5687":0,"5700":1,"5714":0,"5728":1,"5739":0,"5793":1,"5805":0,"5840":1,"5849":0,"5953":1,"5977":0,"5989":1,"5998":0,"6046":1,"6073":0,"6088":1,"6098":0,"6126":1,"6155":0,"6233":1,"6240":0,"6267":1,"6309":0,"6376":1,"6382":0,"6412":1,"6456":0,"6538":1,"6553":0,"6562":1,"6572":0,"6585":1,"6590":0,"6616":1,"6636":0,"6727":1,"6749":0,"6809":1,"6833":0,"6887":1,"6893":0,"6910":1,"6921":0,"6949":1,"6998":0,"7089":1,"7101":0,"7119":1,"7139":0,"7179":1,"7199":0,"7257":1,"7276":0,"7291":1,"7310":0,"7352":1,"7368":0,"7383":1,"7415":0}', ), ef = JSON.parse( - '{"57":1,"63":0,"142":1,"151":0,"168":1,"177":0,"202":1,"209":0,"275":1,"282":0,"310":1,"317":0,"373":1,"381":0,"399":1,"408":0,"437":1,"444":0,"461":1,"470":0,"535":1,"543":0,"619":1,"629":0,"648":1,"657":0,"729":1,"736":0,"759":1,"766":0,"788":1,"796":0,"818":1,"826":0,"843":1,"852":0,"875":1,"918":0,"1069":1,"1077":0,"1100":1,"1107":0,"1216":1,"1227":0,"1338":1,"1348":0,"1386":1,"1396":0,"1420":1,"1426":0,"1490":1,"1495":0,"1518":1,"1523":0,"1558":1,"1564":0,"1636":1,"1642":0,"1686":1,"1702":0,"1714":1,"1722":0,"1806":1,"1812":0,"1862":1,"1870":0,"1915":1,"1925":0,"1945":1,"1953":0,"1993":1,"2000":0,"2028":1,"2088":0,"2126":1,"2147":0,"2185":1,"2198":0,"2209":1,"2218":0,"2236":1,"2244":0,"2393":1,"2400":0,"2422":1,"2430":0,"2451":1,"2457":0,"2501":1,"2507":0,"2528":1,"2534":0,"2560":1,"2566":0,"2578":1,"2582":0,"2611":1,"2617":0,"2671":1,"2683":0,"2695":1,"2701":0,"2711":1,"2718":0,"2746":1,"2752":0,"2759":1,"2766":0,"2794":1,"2800":0,"2819":1,"2824":0,"2850":1,"2856":0,"2881":1,"2888":0,"2926":1,"2938":0,"2952":1,"2962":0,"2968":1,"2975":0,"2982":1,"2989":0,"3052":1,"3064":0,"3095":1,"3152":0,"3161":1,"3167":0,"3175":1,"3181":0,"3264":1,"3331":0,"3362":1,"3370":0,"3395":1,"3402":0,"3421":1,"3428":0,"3450":1,"3457":0,"3480":1,"3485":0,"3547":1,"3553":0,"3575":1,"3581":0,"3601":1,"3633":0,"3660":1,"3667":0,"3688":1,"3694":0,"3717":1,"3724":0,"3754":1,"3760":0,"3797":1,"3802":0,"3816":1,"3822":0,"3849":1,"3855":0,"3881":1,"3886":0,"3937":1,"3944":0,"3977":1,"3984":0,"4008":1,"4015":0,"4053":1,"4061":0,"4080":1,"4088":0,"4108":1,"4116":0,"4134":1,"4144":0,"4190":1,"4197":0,"4244":1,"4254":0,"4266":1,"4276":0,"4300":1,"4307":0,"4332":1,"4336":0,"4394":1,"4401":0,"4470":1,"4479":0,"4524":1,"4535":0,"4580":1,"4592":0,"4616":1,"4622":0,"4640":1,"4648":0,"4725":1,"4731":0,"4834":1,"4842":0,"4863":1,"4870":0,"4892":1,"4898":0,"4910":1,"4934":0,"5041":1,"5049":0,"5093":1,"5125":0,"5203":1,"5210":0,"5275":1,"5280":0,"5324":1,"5329":0,"5348":1,"5354":0,"5374":1,"5379":0,"5400":1,"5409":0,"5429":1,"5436":0,"5457":1,"5466":0,"5543":1,"5548":0,"5567":1,"5574":0,"5595":1,"5602":0,"5623":1,"5630":0,"5652":1,"5659":0,"5685":1,"5689":0,"5711":1,"5721":0,"5761":1,"5769":0,"5785":1,"5791":0,"5912":1,"5918":0,"5940":1,"5944":0,"5995":1,"6018":0,"6019":1,"6069":0,"6100":1,"6146":0,"6234":1,"6269":0,"6322":1,"6378":0,"6434":1,"6442":0,"6456":1,"6463":0,"6478":1,"6499":0,"6526":1,"6535":0,"6580":1,"6590":0,"6606":1,"6613":0,"6626":1,"6685":0,"6707":1,"6718":0,"6744":1,"6754":0,"6770":1,"6776":0,"6815":1,"6822":0,"7002":1,"7012":0,"7066":1,"7075":0,"7137":1,"7145":0,"7200":1,"7208":0,"7225":1,"7232":0,"7285":1,"7289":0,"7313":1,"7319":0,"7340":1,"7345":0,"7421":1,"7429":0,"7476":1,"7486":0,"7598":1,"7605":0,"7627":1,"7632":0,"7670":1,"7675":0,"7760":1,"7766":0,"7789":1,"7795":0,"7817":1,"7823":0,"7850":1,"7856":0,"7908":1,"7913":0,"7933":1,"7938":0,"7951":1,"7957":0,"8045":1,"8050":0,"8072":1,"8078":0,"8158":1,"8164":0,"8190":1,"8195":0,"8218":1,"8223":0,"8239":1,"8246":0,"8265":1,"8272":0,"8291":1,"8297":0,"8406":1,"8412":0,"8437":1,"8444":0,"8493":1,"8498":0,"8555":1,"8561":0,"8661":1,"8678":0,"8683":1,"8727":0,"8752":1,"8765":0,"8830":1,"8836":0,"8861":1,"8867":0,"8886":1,"8892":0,"9080":1,"9085":0,"9252":1,"9287":0,"9354":1,"9361":0,"9495":1,"9502":0,"9525":1,"9531":0,"9615":1,"9628":0,"9644":1,"9654":0}' + '{"56":1,"60":0,"142":1,"156":0,"159":1,"180":0,"199":1,"207":0,"272":1,"279":0,"310":1,"316":0,"373":1,"383":0,"386":1,"409":0,"437":1,"473":0,"535":1,"540":0,"619":1,"658":0,"731":1,"765":0,"787":1,"849":0,"874":1,"912":0,"1071":1,"1107":0,"1200":1,"1228":0,"1328":1,"1349":0,"1382":1,"1399":0,"1426":1,"1439":0,"1493":1,"1528":0,"1561":1,"1571":0,"1629":1,"1643":0,"1688":1,"1694":0,"1715":1,"1722":0,"1807":1,"1816":0,"1862":1,"1875":0,"1915":1,"1957":0,"1994":1,"2001":0,"2024":1,"2032":0,"2055":1,"2060":0,"2072":1,"2084":0,"2141":1,"2153":0,"2189":1,"2249":0,"2392":1,"2459":0,"2506":1,"2550":0,"2558":1,"2567":0,"2573":1,"2589":0,"2611":1,"2616":0,"2675":1,"2697":0,"2706":1,"2717":0,"2743":1,"2752":0,"2761":1,"2769":0,"2779":1,"2800":0,"2820":1,"2836":0,"2841":1,"2871":0,"2882":1,"2892":0,"2927":1,"3073":0,"3095":1,"3135":0,"3147":1,"3191":0,"3266":1,"3333":0,"3361":1,"3428":0,"3449":1,"3457":0,"3485":1,"3490":0,"3544":1,"3579":0,"3601":1,"3608":0,"3634":1,"3641":0,"3659":1,"3668":0,"3685":1,"3695":0,"3715":1,"3719":0,"3795":1,"3799":0,"3819":1,"3825":0,"3850":1,"3857":0,"3881":1,"3885":0,"3909":1,"3914":0,"3945":1,"3953":0,"3977":1,"3985":0,"4011":1,"4022":0,"4055":1,"4064":0,"4067":1,"4090":0,"4116":1,"4157":0,"4190":1,"4200":0,"4248":1,"4279":0,"4306":1,"4314":0,"4331":1,"4337":0,"4392":1,"4400":0,"4472":1,"4482":0,"4524":1,"4538":0,"4582":1,"4596":0,"4617":1,"4659":0,"4724":1,"4748":0,"4834":1,"4894":0,"4922":1,"4927":0,"5037":1,"5043":0,"5089":1,"5097":0,"5124":1,"5129":0,"5204":1,"5209":0,"5229":1,"5237":0,"5273":1,"5282":0,"5346":1,"5361":0,"5541":1,"5548":0,"5622":1,"5642":0,"5685":1,"5690":0,"5761":1,"5770":0,"5783":1,"5791":0,"5866":1,"5874":0,"5906":1,"5940":0,"5991":1,"6028":0,"6049":1,"6057":0,"6081":1,"6130":0,"6225":1,"6272":0,"6322":1,"6350":0,"6352":1,"6381":0,"6429":1,"6438":0,"6439":1,"6464":0,"6486":1,"6494":0,"6529":1,"6536":0,"6580":1,"6644":0,"6662":1,"6685":0,"6712":1,"6724":0,"6748":1,"6757":0,"6792":1,"6832":0,"6841":1,"6854":0,"7000":1,"7012":0,"7066":1,"7080":0,"7139":1,"7151":0,"7208":1,"7358":0,"7417":1,"7435":0,"7480":1,"7491":0,"7601":1,"7608":0,"7626":1,"7632":0,"7669":1,"7675":0,"7763":1,"7770":0,"7790":1,"7832":0,"7846":1,"7854":0,"7904":1,"7916":0,"7928":1,"7935":0,"7950":1,"7958":0,"8044":1,"8051":0,"8073":1,"8077":0,"8160":1,"8170":0,"8192":1,"8200":0,"8218":1,"8223":0,"8239":1,"8247":0,"8269":1,"8274":0,"8292":1,"8301":0,"8405":1,"8411":0,"8437":1,"8442":0,"8495":1,"8504":0,"8555":1,"8561":0,"8657":1,"8725":0,"8747":1,"8765":0,"8829":1,"8837":0,"8859":1,"8865":0,"8885":1,"8893":0,"9082":1,"9089":0,"9255":1,"9287":0,"9356":1,"9363":0,"9499":1,"9507":0,"9520":1,"9536":0,"9619":1,"9658":0}' ), tf = JSON.parse( '{"46":1,"49":0,"83":1,"88":0,"113":1,"116":0,"138":1,"143":0,"211":1,"217":0,"272":1,"279":0,"309":1,"366":0,"427":1,"433":0,"465":1,"472":0,"505":1,"512":0,"579":1,"586":0,"654":1,"660":0,"691":1,"695":0,"720":1,"725":0,"765":1,"773":0,"789":1,"795":0,"928":1,"933":0,"973":1,"978":0,"1002":1,"1008":0,"1030":1,"1036":0,"1097":1,"1104":0,"1147":1,"1156":0,"1205":1,"1213":0,"1258":1,"1264":0,"1347":1,"1354":0,"1375":1,"1382":0,"1414":1,"1474":0,"1565":1,"1572":0,"1635":1,"1640":0,"1664":1,"1668":0,"1691":1,"1696":0,"1812":1,"1821":0,"1872":1,"1883":0,"1918":1,"1930":0,"1985":1,"1995":0,"2076":1,"2081":0,"2136":1,"2170":0,"2225":1,"2235":0,"2265":1,"2275":0,"2301":1,"2311":0,"2390":1,"2396":0,"2421":1,"2427":0,"2454":1,"2461":0,"2693":1,"2702":0,"2742":1,"2749":0,"2880":1,"2885":0,"2913":1,"2917":0,"2960":1,"2964":0,"3006":1,"3012":0,"3097":1,"3103":0,"3132":1,"3138":0,"3198":1,"3204":0,"3230":1,"3240":0,"3296":1,"3302":0,"3351":1,"3356":0,"3421":1,"3430":0,"3470":1,"3481":0,"3566":1,"3574":0,"3652":1,"3659":0,"3713":1,"3718":0,"3791":1,"3797":0,"3833":1,"3841":0,"3987":1,"3993":0,"4015":1,"4021":0,"4046":1,"4053":0,"4071":1,"4081":0,"4115":1,"4122":0,"4142":1,"4148":0,"4222":1,"4230":0,"4253":1,"4262":0,"4290":1,"4295":0,"4367":1,"4372":0,"4548":1,"4555":0,"4741":1,"4750":0,"4766":1,"4778":0,"4853":1,"4861":0,"5044":1,"5051":0,"5095":1,"5102":0,"5194":1,"5203":0,"5229":1,"5238":0,"5271":1,"5280":0,"5412":1,"5416":0,"5476":1,"5483":0,"5572":1,"5579":0,"5630":1,"5637":0,"5670":1,"5678":0,"5759":1,"5767":0,"5791":1,"5800":0,"5883":1,"5890":0,"5988":1,"5997":0,"6030":1,"6039":0,"6104":1,"6112":0,"6126":1,"6132":0,"6249":1,"6256":0,"6294":1,"6301":0,"6322":1,"6328":0,"6345":1,"6353":0,"6370":1,"6383":0,"6484":1,"6493":0,"6516":1,"6524":0,"6539":1,"6549":0,"6568":1,"6606":0,"6702":1,"6743":0,"6771":1,"6779":0,"6799":1,"6805":0,"6823":1,"6832":0,"6936":1,"7008":0,"7031":1,"7039":0,"7139":1,"7154":0,"7156":1,"7160":0,"7206":1,"7277":0,"7358":1,"7367":0,"7386":1,"7396":0,"7547":1,"7560":0,"7753":1,"7763":0,"7780":1,"7788":0,"7803":1,"7813":0,"7868":1,"7875":0,"7915":1,"7923":0,"8047":1,"8056":0,"8089":1,"8096":0,"8135":1,"8142":0,"8220":1,"8226":0,"8267":1,"8273":0,"8303":1,"8308":0,"8415":1,"8420":0,"8514":1,"8519":0,"8549":1,"8554":0,"8640":1,"8646":0,"8715":1,"8720":0,"8800":1,"8807":0,"8905":1,"8911":0,"8943":1,"8950":0,"9053":1,"9059":0,"9120":1,"9128":0,"9348":1,"9354":0,"9374":1,"9384":0,"9450":1,"9459":0,"9506":1,"9515":0,"9596":1,"9608":0,"9617":1,"9630":0,"9647":1,"9657":0,"9671":1,"9681":0,"9695":1,"9709":0,"9721":1,"9730":0,"9807":1,"9814":0,"9862":1,"9868":0,"9919":1,"9927":0,"9973":1,"9983":0,"10032":1,"10039":0}' @@ -65940,23 +66174,23 @@ var version = "v1.15.2"; }, x: -140, }), - Fo({ + DropdownButton({ id: "ExportButton", - text: zu.supportsFiles() - ? localize("DOWNLOAD") - : localize("EXPORT"), + options: ["CLIPBOARD", "FILE"], + choice: 0, + text: "EXPORT", width: 110, height: 50, strokeColor: Ye, - onPress: () => { + onPress: (choice) => { (u((e) => Object.assign(Object.assign({}, e), { downloaded: false, }), ), - i().then((e) => { + i(choice).then((e) => { e && - zu.supportsFiles() && + choice === 1 && u((e) => Object.assign(Object.assign({}, e), { downloaded: true, @@ -65971,7 +66205,7 @@ var version = "v1.15.2"; text: localize("DOWNLOADED!"), color: ve, font: { size: 15 }, - y: -80, + y: -150, }) : null, Fo({ @@ -66363,7 +66597,7 @@ var version = "v1.15.2"; i.now, )); }), - onPressExport: () => + onPressExport: (choice) => Lf(this, void 0, void 0, function* () { const a = Object.assign( Object.assign({}, e.savedLevel.level), @@ -66373,7 +66607,7 @@ var version = "v1.15.2"; }, ), n = wf(a, i.now); - if (!zu.supportsFiles()) + if (choice !== 1) return ( i.clipboard.copy(n, (e) => { if (e) @@ -66390,7 +66624,7 @@ var version = "v1.15.2"; true ); try { - return yield zu.saveFile(`${a.name}.json`, n); + return yield zu.saveFile(`${a.name}.json`, n, "application/json"); } catch (e) { return ( i.alert.ok(`Error saving file: ${e.message}`), @@ -66878,7 +67112,7 @@ var version = "v1.15.2"; }), jf = makeCustomSprite({ render: ({ props: { closeModal: e, width: t, height: a } }) => [ - Ie({ + Clickable({ id: "ClickOutside", onPressOutside: e, width: t, @@ -67103,7 +67337,7 @@ var version = "v1.15.2"; const g = s.checkpoints.didFinish ? "100%" : `${Math.floor((s.checkpoints.furthestFrame / a) * 100)}%`, - offset = author == undefined ? 0 : -15, + offset = 0, m = s.noCheckpoints.didFinish ? "100%" : `${Math.floor((s.noCheckpoints.furthestFrame / a) * 100)}%`, @@ -67111,7 +67345,7 @@ var version = "v1.15.2"; y = e.bpm < 120 ? 1 : e.bpm < 140 ? 2 : e.bpm < 170 ? 3 : 4, E = hl.getSnippetName(e.fileName); return [ - Ie({ + Clickable({ id: "ClickInside", width: Wf, height: qf, @@ -67137,7 +67371,7 @@ var version = "v1.15.2"; baseline: "bottom", weight: 800, }, - text: name.toUpperCase(), + text: (name).toUpperCase(), color: Be, x: -155, y: 100, @@ -67149,7 +67383,7 @@ var version = "v1.15.2"; baseline: "bottom", style: "italic", }, - text: localize("artist"), + text: author ? localize("level by") : localize("artist"), color: Be, x: -155, y: 80, @@ -67161,37 +67395,11 @@ var version = "v1.15.2"; weight: 600, baseline: "bottom", }, - text: e.author, + text: author ? author : e.author, color: Be, - x: -120, + x: -120 + (author ? 5 : 0), y: 80, }), - author && - n({ - font: { - align: "left", - weight: 500, - baseline: "bottom", - style: "italic", - }, - text: localize("level by"), - color: Be, - x: -155, - y: 60, - }), - author && - n({ - font: { - size: author.length > 20 ? 12 : 15, - align: "left", - weight: 600, - baseline: "bottom", - }, - text: author, - color: Be, - x: -110, - y: 60, - }), e.label ? n({ font: { @@ -67551,7 +67759,7 @@ var version = "v1.15.2"; (a = 48), (i = 121.5)), [ - Ie({ + Clickable({ id: "Clickable", width: 60, height: 160, @@ -68092,7 +68300,7 @@ var version = "v1.15.2"; return ( r.length > 15 && (r = `${r.slice(0, 15)}...`), [ - Ie({ + Clickable({ id: "Clickable", width: 240, height: 65, @@ -68238,7 +68446,7 @@ var version = "v1.15.2"; }, device: l, }) => [ - Ie({ + Clickable({ id: "Clickable", width: t, height: a, @@ -68550,7 +68758,7 @@ var version = "v1.15.2"; props: { world: e, disabled: t, onPress: a }, device: i, }) => [ - Ie({ + Clickable({ id: "Clickable", width: 250, height: 250, @@ -68629,7 +68837,7 @@ var version = "v1.15.2"; truncate: function (e, t = 10) { return e.length > t ? `${e.slice(0, t)}...` : e; }, - measureTexts: function (e, t) { + measureTexts: function (texts, font) { if (null === ly) { const e = document.createElement("canvas"); ly = e.getContext("2d"); @@ -68640,13 +68848,13 @@ var version = "v1.15.2"; weight: n = "normal", style: s = "normal", family: o, - } = t, + } = font, r = `${s} ${n} ${i ? `${i}px` : ""} ${o ? `${o}` : ""}`; return ( (a.font = r), - (a.textBaseline = t.baseline || "middle"), - (a.textAlign = t.align || "center"), - e.map((e) => a.measureText(e).width) + (a.textBaseline = font.baseline || "middle"), + (a.textAlign = font.align || "center"), + texts.map((e) => a.measureText(e).width) ); }, splitTextIntoLines: function (e, t, a) { @@ -68830,6 +69038,149 @@ var version = "v1.15.2"; l((i = i.apply(e, t || [])).next()); }); }; + const UserlevelsView = makeCustomSprite({ + init: ({ updateState }) => { + let loadData = (page) => { + updateState((t) => + Object.assign(Object.assign({}, t), { + page: page, + loading: true, + data: null, + selectedLevel: null, + }), + ); + fetch(`https://www.userlevels.com/api/impossible/levels?page=${page}`).then( + (x) => x.json() + ).then((x) => updateState((t) => + Object.assign(Object.assign({}, t), { + loading: false, + data: x, + lastPage: x.last_page, + }), + )); + }; + loadData(1); + return { loading: true, page: 1, data: null, selectedLevel: null, lastPage: null, loadPageData: loadData}; + }, + loop: ({ state, getInputs, props }) => { + let inputs = getInputs().keysJustPressed; + inputs.Escape && props.goBack(); + if (state.loading) { + return Object.assign({}, state); + } + inputs.ArrowLeft && (state.data.prev_page_url && state.loadPageData(state.page - 1)); + inputs.ArrowRight && (state.data.next_page_url && state.loadPageData(state.page + 1)); + return Object.assign({}, state); + }, + render: ({ state, device, props }) => { + const { fullWidth: fullWidth, fullHeight: fullHeight } = device.size; + let levels = state?.data?.data; + + return [ + state.loading ? n({ + text: `${localize("LOADING")}...`, + color: ve, + font: { size: 15 }, + }) : ScrollContainer({ + id: "ChooseSongList", + containerWidth: fullWidth, + containerHeight: fullHeight - 140, + contentHeight: 40 * (levels.length + 1), + y: fullHeight / 2 - 70, + sprites: (t) => + levels.flatMap((a, s) => [ + Ar({ + id: `LevelButton-${s}`, + width: fullWidth - 240, + height: 30, + text: + `${a.title} - ${a.creator.name}`, + selected: state.selectedLevel === a, + colorLeft: xe, + colorMid: xe, + colorRight: xe, + selectedColorLeft: Re, + selectedColorMid: Re, + selectedColorRight: Re, + colorOpacities: [1, 0.75, 0], + noPress: t, + onPress: () => { + state.selectedLevel = a; + }, + x: -100, + y: -20 - 40 * s, + }), + ]), + }), + Fo({ + id: "BackButton", + text: localize("BACK"), + width: 80, + height: 40, + onPress: props.goBack, + x: -fullWidth / 2 + 60, + y: -fullHeight / 2 + 40, + }), + Uf({ + id: "Title", + text: "USERLEVELS.COM", + width: 200, + height: 35, + x: -fullWidth / 2 + 120, + y: fullHeight / 2 - 40, + }), + Fo({ + id: "LastPage", + text: "<", + width: 40, + height: 40, + disabled: state.loading, + onPress: () => { + state.data.prev_page_url && state.loadPageData(state.page - 1) + }, + x: -40, + y: -fullHeight / 2 + 40, + }), + n({ + text: `${state.page}/${state.lastPage || "..."}`, + color: ve, + font: { size: 15, weight: 500 }, + y: -fullHeight / 2 + 40, + }), + Fo({ + id: "NextPage", + text: ">", + width: 40, + height: 40, + disabled: state.loading, + onPress: () => { + state.data.next_page_url && state.loadPageData(state.page + 1) + }, + x: 40, + y: -fullHeight / 2 + 40, + }), + Fo({ + id: "ImportButton", + text: localize("IMPORT"), + width: 100, + height: 40, + disabled: state.loading, + onPress: () => { + const n = Cf(state.selectedLevel.string), + s = (e) => { + (device.audio("audio/menu/error.wav").play(0), + (state.error = e)); + }; + if (n instanceof Error) return void s("Invalid level data"); + props.importLevel(n); + props.goBack(); + }, + x: fullWidth / 2 - 70, + y: -fullHeight / 2 + 40, + }), + ]; + } + }); const hy = makeCustomSprite({ init: ({ device: e, updateState: t }) => ( Promise.all([ @@ -68912,7 +69263,7 @@ var version = "v1.15.2"; fadeOutMusic: e.fadeOutMusic, }), ]; - const p = (e) => + const importLevel = (e) => uy(this, void 0, void 0, function* () { const t = yield Jp.saveLevel( a.storage, @@ -68956,7 +69307,7 @@ var version = "v1.15.2"; Object.assign(Object.assign({}, e), { view: "import" }), ); }, - importLevel: p, + importLevel: importLevel, }), ]; if ("import" === t.view) @@ -68978,11 +69329,22 @@ var version = "v1.15.2"; }), ); }, - importLevel: p, + importLevel: importLevel, }), ]; if ("userlevels" === t.view) - return [] + return [ + UserlevelsView({ + id: "UserlevelsView", + goBack: () => { + i((e) => + Object.assign(Object.assign({}, e), { view: "main" }), + ); + }, + importLevel: importLevel, + }) + ]; + const g = () => { i((e) => Object.assign(Object.assign({}, e), { @@ -69048,6 +69410,19 @@ var version = "v1.15.2"; x: -r / 2 + 120, y: o / 2 - 40, }), + Fo({ + id: "UserlevelsButton", + text: "USERLEVELS.COM", + width: 160, + height: 40, + onPress: () => { + i((e) => + Object.assign(Object.assign({}, e), { view: "userlevels" }), + ); + }, + x: ((-r / 2 + 60) + (r / 2 - 200)) / 2, + y: -o / 2 + 40, + }), Fo({ id: "NewButton", text: localize("NEW"), @@ -69524,9 +69899,8 @@ var version = "v1.15.2"; text: "OPEN FILE", width: 140, height: 45, - onPress: () => - uy(this, void 0, void 0, function* () { - i((e) => + onPress: async () => { + i((e) => Object.assign(Object.assign({}, e), { loading: true }), ); const t = (e) => { @@ -69540,13 +69914,15 @@ var version = "v1.15.2"; }; let n; try { - if (((n = yield zu.openFile()), null === n)) + n = await zu.openFile(); + if (null == n) return void i((e) => Object.assign(Object.assign({}, e), { loading: false, }), ); } catch (e) { + console.error(e); return void t("Failed to open file"); } const s = Cf(n); @@ -69564,7 +69940,7 @@ var version = "v1.15.2"; loading: false, }), )); - }), + }, x: -100, }), Fo({ @@ -71190,7 +71566,7 @@ var version = "v1.15.2"; }, device: s, }) => [ - Ie({ + Clickable({ id: "Clickable", width: 60, height: 60, @@ -71479,7 +71855,7 @@ var version = "v1.15.2"; }) { const { closeModal: i } = e; return [ - Ie({ + Clickable({ id: "ClickOutside", onPressOutside: i, width: 500, @@ -72111,7 +72487,7 @@ var version = "v1.15.2"; u = t.width + 2 * t.widthMargin, h = "loggedIn" === i.type ? i.profile : null, p = [ - Ie({ + Clickable({ id: "SignInButton", sprites: (e) => [ l({ @@ -72135,7 +72511,7 @@ var version = "v1.15.2"; ], g = "requestingAuth" === i.type; return [ - Ie({ + Clickable({ id: "ClickOutside", onPressOutside: () => { (g && zu.cancelGoogleSignIn(), s()); @@ -72308,7 +72684,7 @@ var version = "v1.15.2"; }; return [ o({ color: "black", opacity: 0.7, width: u, height: h }), - Ie({ + Clickable({ id: "BlockBehind", width: u, height: h, @@ -72989,7 +73365,7 @@ var version = "v1.15.2"; const ox = 8 * -t * 0.75 + t, oy = 8 * -a * 0.75 + a; return [ - Ie({ + Clickable({ id: "Clickable", width: 100, height: 100, @@ -73903,6 +74279,7 @@ var version = "v1.15.2"; shadowOffsetY: 0, beatSize: b, }), + Fo({ id: "MoreButton", text: localize("MORE"), @@ -73927,6 +74304,7 @@ var version = "v1.15.2"; x: 100, y: h, }), + ...(localStorage.getItem("news") == newsID ? [] @@ -77457,7 +77835,7 @@ var version = "v1.15.2"; return t.loading ? [] : [ - Ie({ + Clickable({ id: "BlockBehind", width: y, height: E, diff --git a/game/images/themes/classic/doubleJump.png b/game/images/themes/classic/doubleJump.png new file mode 100644 index 0000000..b195ef4 Binary files /dev/null and b/game/images/themes/classic/doubleJump.png differ diff --git a/game/images/themes/stylemix/BG.png b/game/images/themes/stylemix/BG.png new file mode 100644 index 0000000..c36ec5b Binary files /dev/null and b/game/images/themes/stylemix/BG.png differ diff --git a/game/images/themes/stylemix/a.txt b/game/images/themes/stylemix/a.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/game/images/themes/stylemix/a.txt @@ -0,0 +1 @@ + diff --git a/game/images/themes/world1/doubleJumpLarge.png b/game/images/themes/world1/doubleJumpLarge.png new file mode 100644 index 0000000..dc917ad Binary files /dev/null and b/game/images/themes/world1/doubleJumpLarge.png differ diff --git a/game/images/themes/world1/doubleJumpSmall.png b/game/images/themes/world1/doubleJumpSmall.png new file mode 100644 index 0000000..3d0382b Binary files /dev/null and b/game/images/themes/world1/doubleJumpSmall.png differ diff --git a/game/images/themes/world6/BG.png b/game/images/themes/world6/BG.png new file mode 100644 index 0000000..c36ec5b Binary files /dev/null and b/game/images/themes/world6/BG.png differ diff --git a/game/images/themes/world6/bottom/block.png b/game/images/themes/world6/bottom/block.png new file mode 100644 index 0000000..9e916ca Binary files /dev/null and b/game/images/themes/world6/bottom/block.png differ diff --git a/game/images/themes/world6/bottom/laser-line.png b/game/images/themes/world6/bottom/laser-line.png new file mode 100644 index 0000000..64b4979 Binary files /dev/null and b/game/images/themes/world6/bottom/laser-line.png differ diff --git a/game/index.html b/game/index.html index f2813c6..85b073b 100644 --- a/game/index.html +++ b/game/index.html @@ -123,6 +123,7 @@ +