@pyric/cli 0.1.0-alpha.18 → 0.1.0-alpha.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -9
- package/dist/bridge/server/mcp-contract.d.ts +2 -2
- package/dist/bridge/server/mcp-contract.d.ts.map +1 -1
- package/dist/bridge/server/mcp-contract.js +3 -0
- package/dist/bridge/server/mcp-contract.js.map +1 -1
- package/dist/cli/index.d.ts +3 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +51 -42
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp-proxy.d.ts.map +1 -1
- package/dist/cli/mcp-proxy.js +3 -3
- package/dist/cli/mcp-proxy.js.map +1 -1
- package/dist/cli/parse-args.d.ts +1 -1
- package/dist/cli/parse-args.d.ts.map +1 -1
- package/dist/cli/parse-args.js +51 -15
- package/dist/cli/parse-args.js.map +1 -1
- package/dist/cli/pyric-config.d.ts +24 -0
- package/dist/cli/pyric-config.d.ts.map +1 -0
- package/dist/cli/pyric-config.js +28 -0
- package/dist/cli/pyric-config.js.map +1 -0
- package/dist/cli/rules.d.ts +1 -0
- package/dist/cli/rules.d.ts.map +1 -1
- package/dist/cli/rules.js +18 -4
- package/dist/cli/rules.js.map +1 -1
- package/dist/cli/{dev-runner.d.ts → sandbox-runner.d.ts} +33 -36
- package/dist/cli/sandbox-runner.d.ts.map +1 -0
- package/dist/cli/{dev-runner.js → sandbox-runner.js} +90 -55
- package/dist/cli/sandbox-runner.js.map +1 -0
- package/dist/cli/serve.d.ts +6 -4
- package/dist/cli/serve.d.ts.map +1 -1
- package/dist/cli/serve.js +99 -40
- package/dist/cli/serve.js.map +1 -1
- package/dist/cli/service-command-records/storage-rules-resolve.d.ts +4 -0
- package/dist/cli/service-command-records/storage-rules-resolve.d.ts.map +1 -0
- package/dist/cli/service-command-records/storage-rules-resolve.js +3 -0
- package/dist/cli/service-command-records/storage-rules-resolve.js.map +1 -0
- package/dist/cli/service-commands.generated.d.ts +3 -0
- package/dist/cli/service-commands.generated.d.ts.map +1 -1
- package/dist/cli/service-commands.generated.js +2 -0
- package/dist/cli/service-commands.generated.js.map +1 -1
- package/dist/cli/snapshot.js +5 -5
- package/dist/cli/snapshot.js.map +1 -1
- package/dist/cli/verify.js +1 -1
- package/dist/cli/verify.js.map +1 -1
- package/dist/functions-rtdb/development-runtime.js +1 -1
- package/dist/functions-rtdb/development-runtime.js.map +1 -1
- package/dist/functions-rtdb/project.js +8 -8
- package/dist/functions-rtdb/project.js.map +1 -1
- package/dist/next/guard.js +1 -1
- package/dist/next/guard.js.map +1 -1
- package/dist/remote/index.d.ts +1 -1
- package/dist/remote/index.js +9 -9
- package/dist/remote/index.js.map +1 -1
- package/dist/serve/bundler.js +10 -10
- package/dist/serve/bundler.js.map +1 -1
- package/dist/serve/entries/ai.d.ts.map +1 -1
- package/dist/serve/entries/ai.js +27 -1
- package/dist/serve/entries/ai.js.map +1 -1
- package/dist/serve/entries/auth-helper-dom.js +1 -1
- package/dist/serve/entries/auth-helper-dom.js.map +1 -1
- package/dist/serve/entries/auth-helper-runtime.js +1 -1
- package/dist/serve/entries/auth-helper-runtime.js.map +1 -1
- package/dist/serve/entries/firestore.js +3 -3
- package/dist/serve/entries/firestore.js.map +1 -1
- package/dist/serve/entries/keepalive.js +1 -1
- package/dist/serve/entries/keepalive.js.map +1 -1
- package/dist/serve/entries/runtime.js +21 -14
- package/dist/serve/entries/runtime.js.map +1 -1
- package/dist/serve/entries/storage.js +1 -1
- package/dist/serve/entries/storage.js.map +1 -1
- package/dist/serve/entries/worker-runtime.js +1 -1
- package/dist/serve/entries/worker-runtime.js.map +1 -1
- package/dist/serve/init-payload.d.ts +4 -0
- package/dist/serve/init-payload.d.ts.map +1 -1
- package/dist/serve/namespace.d.ts +6 -0
- package/dist/serve/namespace.d.ts.map +1 -1
- package/dist/serve/namespace.js +36 -5
- package/dist/serve/namespace.js.map +1 -1
- package/dist/serve/rules.d.ts +3 -3
- package/dist/serve/rules.d.ts.map +1 -1
- package/dist/serve/rules.js +56 -25
- package/dist/serve/rules.js.map +1 -1
- package/dist/serve/runtime/chip.d.ts.map +1 -1
- package/dist/serve/runtime/chip.js +32 -1
- package/dist/serve/runtime/chip.js.map +1 -1
- package/dist/serve/runtime/manifest.d.ts +1 -1
- package/dist/serve/runtime/manifest.d.ts.map +1 -1
- package/dist/serve/runtime/manifest.js +1 -1
- package/dist/serve/runtime/manifest.js.map +1 -1
- package/dist/serve/runtime/status.d.ts.map +1 -1
- package/dist/serve/runtime/status.js +23 -0
- package/dist/serve/runtime/status.js.map +1 -1
- package/dist/serve/sandbox-session.d.ts +1 -0
- package/dist/serve/sandbox-session.d.ts.map +1 -1
- package/dist/serve/sandbox-session.js +10 -4
- package/dist/serve/sandbox-session.js.map +1 -1
- package/dist/serve/server.d.ts +7 -0
- package/dist/serve/server.d.ts.map +1 -1
- package/dist/serve/server.js +15 -1
- package/dist/serve/server.js.map +1 -1
- package/dist/serve/site-ui/404.html +1 -1
- package/dist/serve/site-ui/_astro/{RulesCodeEditor.CzwHdCi9.js → RulesCodeEditor.XtDmHOlN.js} +1 -1
- package/dist/serve/site-ui/_astro/_example_.B9DG9HLJ.css +1 -0
- package/dist/serve/site-ui/_astro/_slug_.Da5VLhW1.css +1 -0
- package/dist/serve/site-ui/_astro/_studio_.BnfYCKoI.css +1 -0
- package/dist/serve/site-ui/_astro/app.B52xr-DK.js +1 -0
- package/dist/serve/site-ui/_astro/app.DWBraPUw.js +12 -0
- package/dist/serve/site-ui/_astro/app.pMSnN6Qw.css +1 -0
- package/dist/serve/site-ui/_astro/chess-showcase.B72XYeoh.js +354 -0
- package/dist/serve/site-ui/_astro/{example-runtime.B0byNQOl.js → example-runtime.C25_lx6Z.js} +2 -26
- package/dist/serve/site-ui/_astro/index.Tb-31efc.css +1 -0
- package/dist/serve/site-ui/_astro/index.UkCBr-_0.css +1 -0
- package/dist/serve/site-ui/_astro/sandbox-controls.DEpnKg-O.js +1169 -0
- package/dist/serve/site-ui/_astro/seed.Co0yUJY5.js +20 -0
- package/dist/serve/site-ui/_astro/writes.rpjrFzmu.js +102 -0
- package/dist/serve/site-ui/auth/index.html +5 -3
- package/dist/serve/site-ui/david-east.jpg +0 -0
- package/dist/serve/site-ui/docs/_rhythm/index.html +6 -3
- package/dist/serve/site-ui/docs/_rhythm.md +1 -1
- package/dist/serve/site-ui/docs/agent/set-up-your-agent/index.html +45 -17
- package/dist/serve/site-ui/docs/agent/set-up-your-agent.md +20 -17
- package/dist/serve/site-ui/docs/agent/watch-and-review/index.html +6 -5
- package/dist/serve/site-ui/docs/agent/watch-and-review.md +1 -5
- package/dist/serve/site-ui/docs/agent/work-with-an-agent/index.html +8 -5
- package/dist/serve/site-ui/docs/agent/work-with-an-agent.md +4 -4
- package/dist/serve/site-ui/docs/ai-compat/index.html +5 -2
- package/dist/serve/site-ui/docs/api-reference/index.html +6 -2
- package/dist/serve/site-ui/docs/api-reference.md +1 -0
- package/dist/serve/site-ui/docs/app-compat/index.html +5 -2
- package/dist/serve/site-ui/docs/auth-compat/index.html +5 -2
- package/dist/serve/site-ui/docs/build/ai-logic/index.html +5 -2
- package/dist/serve/site-ui/docs/build/authentication/index.html +7 -4
- package/dist/serve/site-ui/docs/build/authentication.md +2 -2
- package/dist/serve/site-ui/docs/build/cloud-firestore/index.html +34 -53
- package/dist/serve/site-ui/docs/build/cloud-firestore.md +40 -36
- package/dist/serve/site-ui/docs/build/cloud-messaging/index.html +5 -2
- package/dist/serve/site-ui/docs/build/cloud-storage/index.html +6 -3
- package/dist/serve/site-ui/docs/build/cloud-storage.md +1 -1
- package/dist/serve/site-ui/docs/build/realtime-database/index.html +9 -6
- package/dist/serve/site-ui/docs/build/realtime-database.md +4 -4
- package/dist/serve/site-ui/docs/conformance-scores/index.html +5 -2
- package/dist/serve/site-ui/docs/create-pyric-reference-api/index.html +6 -3
- package/dist/serve/site-ui/docs/create-pyric-reference-api.md +1 -1
- package/dist/serve/site-ui/docs/database-compat/index.html +5 -2
- package/dist/serve/site-ui/docs/examples/chess/index.html +649 -250
- package/dist/serve/site-ui/docs/examples/chess.md +45 -16
- package/dist/serve/site-ui/docs/examples/index.html +6 -3
- package/dist/serve/site-ui/docs/firestore-compat/index.html +5 -2
- package/dist/serve/site-ui/docs/functions-rtdb-compat/index.html +5 -2
- package/dist/serve/site-ui/docs/get-started/how-the-swap-works/index.html +9 -6
- package/dist/serve/site-ui/docs/get-started/how-the-swap-works.md +5 -5
- package/dist/serve/site-ui/docs/get-started/nextjs/index.html +9 -6
- package/dist/serve/site-ui/docs/get-started/nextjs.md +4 -4
- package/dist/serve/site-ui/docs/get-started/start-building/index.html +41 -10
- package/dist/serve/site-ui/docs/get-started/start-building.md +21 -10
- package/dist/serve/site-ui/docs/get-started/vite/index.html +6 -3
- package/dist/serve/site-ui/docs/get-started/vite.md +1 -1
- package/dist/serve/site-ui/docs/index.json +203 -168
- package/dist/serve/site-ui/docs/messaging-compat/index.html +5 -2
- package/dist/serve/site-ui/docs/observe/resolve-runtime-status/index.html +5 -2
- package/dist/serve/site-ui/docs/observe/see-whats-happening/index.html +6 -4
- package/dist/serve/site-ui/docs/observe/see-whats-happening.md +2 -4
- package/dist/serve/site-ui/docs/observe/shape-your-data/index.html +9 -6
- package/dist/serve/site-ui/docs/observe/shape-your-data.md +4 -4
- package/dist/serve/site-ui/docs/overview/index.html +16 -10
- package/dist/serve/site-ui/docs/overview.md +19 -11
- package/dist/serve/site-ui/docs/pyric-admin-app-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-admin-auth-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-admin-database-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api/index.html +8 -5
- package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api.md +3 -3
- package/dist/serve/site-ui/docs/pyric-admin-messaging-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-admin-reference-api/index.html +501 -0
- package/dist/serve/site-ui/docs/pyric-admin-reference-api.md +587 -0
- package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ai-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ai-scripting-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-app-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-auth-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-assurance-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-bridge-client-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-bridge-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-credentials-node-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-discover-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-next-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-register-app-bridge-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-register-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-remote-reference-api/index.html +6 -3
- package/dist/serve/site-ui/docs/pyric-cli-remote-reference-api.md +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-verify-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-database-reference-api/index.html +166 -95
- package/dist/serve/site-ui/docs/pyric-database-reference-api.md +107 -1
- package/dist/serve/site-ui/docs/pyric-firestore-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-messaging-reference-api/index.html +10 -4
- package/dist/serve/site-ui/docs/pyric-messaging-reference-api.md +5 -2
- package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api/index.html +10 -4
- package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api.md +5 -2
- package/dist/serve/site-ui/docs/pyric-rules-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api/index.html +6 -3
- package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api.md +2 -2
- package/dist/serve/site-ui/docs/pyric-sandbox-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-storage-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-auth-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-events-hooks-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-events-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-firestore-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-primitives-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-rtdb-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-rules-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/pyric-ui-traffic-reference-api/index.html +5 -2
- package/dist/serve/site-ui/docs/reference/cli/index.html +153 -0
- package/dist/serve/site-ui/docs/reference/cli.md +114 -0
- package/dist/serve/site-ui/docs/rules-compat/index.html +5 -2
- package/dist/serve/site-ui/docs/secure/audit-your-rules/index.html +5 -2
- package/dist/serve/site-ui/docs/secure/firestore-rules-limits/index.html +5 -2
- package/dist/serve/site-ui/docs/secure/read-a-denial/index.html +6 -3
- package/dist/serve/site-ui/docs/secure/read-a-denial.md +1 -1
- package/dist/serve/site-ui/docs/secure/rtdb-rules-in-typescript/index.html +5 -2
- package/dist/serve/site-ui/docs/secure/rules-standard-library/index.html +5 -2
- package/dist/serve/site-ui/docs/secure/secure-it-with-rules/index.html +5 -2
- package/dist/serve/site-ui/docs/secure/simulate-and-lint/index.html +5 -2
- package/dist/serve/site-ui/docs/secure/write-a-rules-test-suite/index.html +5 -2
- package/dist/serve/site-ui/docs/ship/ship-to-production/index.html +7 -4
- package/dist/serve/site-ui/docs/ship/ship-to-production.md +2 -2
- package/dist/serve/site-ui/docs/ship/test-in-node/index.html +9 -6
- package/dist/serve/site-ui/docs/ship/test-in-node.md +4 -4
- package/dist/serve/site-ui/docs/storage-compat/index.html +5 -2
- package/dist/serve/site-ui/docs/trust/how-we-know-it-matches-firebase/index.html +5 -2
- package/dist/serve/site-ui/docs/trust/rules-standard-library/index.html +5 -2
- package/dist/serve/site-ui/docs/trust/versioning-and-compatibility/index.html +5 -2
- package/dist/serve/site-ui/docs/tutorial/index.html +10 -7
- package/dist/serve/site-ui/docs/tutorial.md +4 -4
- package/dist/serve/site-ui/examples/chess/index.html +4 -2
- package/dist/serve/site-ui/firestore/index.html +5 -3
- package/dist/serve/site-ui/hero-charcoal.jpg +0 -0
- package/dist/serve/site-ui/index.html +9 -7
- package/dist/serve/site-ui/llms.txt +4 -3
- package/dist/serve/site-ui/pyric-campfire-full.png +0 -0
- package/dist/serve/site-ui/pyric-campfire.png +0 -0
- package/dist/serve/site-ui/rtdb/index.html +5 -3
- package/dist/serve/site-ui/settings/index.html +5 -3
- package/dist/serve/site-ui/storage/index.html +5 -3
- package/dist/serve/site-ui/studio/index.html +13 -0
- package/dist/serve/site-ui/studio-routes.json +1 -1
- package/dist/serve/site-ui/traffic/index.html +5 -3
- package/dist/serve/studio/routes.d.ts +9 -0
- package/dist/serve/studio/routes.d.ts.map +1 -1
- package/dist/serve/studio/routes.js +47 -7
- package/dist/serve/studio/routes.js.map +1 -1
- package/dist/serve/vite-ai-config.d.ts.map +1 -1
- package/dist/serve/vite-ai-config.js +38 -8
- package/dist/serve/vite-ai-config.js.map +1 -1
- package/dist/serve/vite-module-swap.d.ts.map +1 -1
- package/dist/serve/vite-module-swap.js +0 -28
- package/dist/serve/vite-module-swap.js.map +1 -1
- package/dist/serve/vite-rules-source.d.ts.map +1 -1
- package/dist/serve/vite-rules-source.js +28 -7
- package/dist/serve/vite-rules-source.js.map +1 -1
- package/dist/serve/vite-sandbox-generation.d.ts +1 -1
- package/dist/serve/vite-sandbox-generation.d.ts.map +1 -1
- package/dist/serve/vite-sandbox-generation.js +1 -1
- package/dist/serve/vite-sandbox-generation.js.map +1 -1
- package/dist/serve/worker/client/disconnect.js +1 -1
- package/dist/serve/worker/client/disconnect.js.map +1 -1
- package/dist/serve/worker/client/presence.d.ts.map +1 -1
- package/dist/serve/worker/client/presence.js +18 -5
- package/dist/serve/worker/client/presence.js.map +1 -1
- package/dist/serve/worker/host-ai.d.ts.map +1 -1
- package/dist/serve/worker/host-ai.js +15 -0
- package/dist/serve/worker/host-ai.js.map +1 -1
- package/dist/serve/worker/protocol.d.ts +4 -0
- package/dist/serve/worker/protocol.d.ts.map +1 -1
- package/dist/serve/worker/protocol.js.map +1 -1
- package/dist/serve/worker/serve-init.d.ts.map +1 -1
- package/dist/serve/worker/serve-init.js +7 -1
- package/dist/serve/worker/serve-init.js.map +1 -1
- package/package.json +5 -5
- package/src/bridge/server/mcp-contract.ts +3 -0
- package/src/cli/cli.test.ts +2 -2
- package/src/cli/index.ts +51 -42
- package/src/cli/mcp-proxy.ts +10 -11
- package/src/cli/parse-args.ts +61 -15
- package/src/cli/pyric-config.ts +45 -0
- package/src/cli/rules.ts +31 -4
- package/src/cli/{dev-runner.ts → sandbox-runner.ts} +117 -72
- package/src/cli/serve.ts +115 -47
- package/src/cli/service-command-records/storage-rules-resolve.ts +4 -0
- package/src/cli/service-commands.generated.ts +2 -0
- package/src/cli/snapshot.ts +5 -5
- package/src/cli/verify.ts +1 -1
- package/src/functions-rtdb/development-runtime.ts +1 -1
- package/src/functions-rtdb/project.ts +8 -8
- package/src/next/guard.ts +1 -1
- package/src/remote/index.ts +9 -9
- package/src/serve/bundler.ts +10 -10
- package/src/serve/entries/ai.ts +27 -1
- package/src/serve/entries/auth-helper-dom.ts +1 -1
- package/src/serve/entries/auth-helper-runtime.ts +1 -1
- package/src/serve/entries/firestore.ts +3 -3
- package/src/serve/entries/keepalive.ts +1 -1
- package/src/serve/entries/runtime.ts +19 -14
- package/src/serve/entries/storage.ts +1 -1
- package/src/serve/entries/worker-runtime.ts +1 -1
- package/src/serve/init-payload.ts +4 -0
- package/src/serve/namespace.ts +44 -5
- package/src/serve/rules.ts +61 -26
- package/src/serve/runtime/chip.ts +38 -1
- package/src/serve/runtime/manifest.ts +1 -1
- package/src/serve/runtime/status.ts +24 -0
- package/src/serve/sandbox-session.ts +10 -4
- package/src/serve/server.ts +18 -1
- package/src/serve/studio/routes.ts +63 -7
- package/src/serve/vite-ai-config.ts +37 -7
- package/src/serve/vite-module-swap.ts +0 -28
- package/src/serve/vite-rules-source.ts +29 -7
- package/src/serve/vite-sandbox-generation.ts +1 -1
- package/src/serve/worker/client/disconnect.ts +1 -1
- package/src/serve/worker/client/presence.ts +25 -5
- package/src/serve/worker/host-ai.ts +15 -0
- package/src/serve/worker/protocol.ts +2 -1
- package/src/serve/worker/serve-init.ts +5 -1
- package/README.md.orig +0 -141
- package/dist/cli/dev-runner.d.ts.map +0 -1
- package/dist/cli/dev-runner.js.map +0 -1
- package/dist/serve/site-ui/_astro/_example_.jevZ7OdV.css +0 -1
- package/dist/serve/site-ui/_astro/_slug_.C6QfVOxJ.css +0 -1
- package/dist/serve/site-ui/_astro/_slug_.CXh9yTP1.css +0 -1
- package/dist/serve/site-ui/_astro/_studio_.B6b_G1ev.css +0 -1
- package/dist/serve/site-ui/_astro/app.B7pBzz5N.js +0 -11
- package/dist/serve/site-ui/_astro/app.BsFsMjn0.css +0 -1
- package/dist/serve/site-ui/_astro/app.boex5SnQ.js +0 -1
- package/dist/serve/site-ui/_astro/chess-showcase.DDqE-QGe.js +0 -1
- package/dist/serve/site-ui/_astro/chess-source-explorer.C5k9c5yK.js +0 -1
- package/dist/serve/site-ui/_astro/chess-v2.CFHmd3UL.js +0 -354
- package/dist/serve/site-ui/_astro/index.uwPvjH_1.js +0 -1
- package/dist/serve/site-ui/_astro/jsx-runtime.D_zvdyIk.js +0 -9
- package/dist/serve/site-ui/_astro/reads.Dh3z0fJy.js +0 -1
- package/dist/serve/site-ui/_astro/sandbox-controls.C2IqtoSw.js +0 -1252
- package/dist/serve/site-ui/_astro/seed.CCmj00su.js +0 -20
- package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research/index.html +0 -582
- package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research.md +0 -448
- package/dist/serve/site-ui/examples/firestore-first-write/index.html +0 -2
|
@@ -1,39 +1,86 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Play chess against Security Rules · Pyric Studio</title><meta name="description" content="Play chess against Firestore Security Rules in an isolated Pyric sandbox."><link rel="icon" type="image/svg+xml" href="/__pyric/ui/pyric-logo.svg"><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet"><link rel="stylesheet" href="/__pyric/ui/_astro/
|
|
2
|
-
<link rel="stylesheet" href="/__pyric/ui/_astro/_slug_.C6QfVOxJ.css"></head> <body> <header class="studio__bar" data-astro-cid-mw7aashj> <div class="studio__bar-inner" data-astro-cid-mw7aashj> <a class="studio__brand" href="/__pyric/ui/" aria-label="Pyric Studio" data-astro-cid-mw7aashj>Pyric</a> <nav class="studio__nav" aria-label="Studio tabs" data-astro-cid-mw7aashj> <a class="studio__nav-tab" href="/__pyric/ui/" data-astro-cid-mw7aashj> Home </a><a class="studio__nav-tab" href="/__pyric/ui/firestore" data-astro-cid-mw7aashj> Firestore </a><a class="studio__nav-tab" href="/__pyric/ui/auth" data-astro-cid-mw7aashj> Auth </a><a class="studio__nav-tab" href="/__pyric/ui/rtdb" data-astro-cid-mw7aashj> RTDB </a><a class="studio__nav-tab" href="/__pyric/ui/storage" data-astro-cid-mw7aashj> Storage </a><a class="studio__nav-tab" href="/__pyric/ui/traffic" data-astro-cid-mw7aashj> Traffic </a><a class="studio__nav-tab" href="/__pyric/ui/settings" data-astro-cid-mw7aashj> Settings </a><a class="studio__nav-tab" href="/__pyric/ui/docs" aria-current="page" data-astro-cid-mw7aashj> Docs </a> </nav> </div> </header> <div class="docs-shell docs-shell--example" data-astro-cid-mw7aashj> <details class="docs-nav-drawer" data-astro-cid-mw7aashj> <summary data-astro-cid-mw7aashj>Navigate</summary> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <script type="module">let i=null;function d(t){return i||(i=fetch(t).then(e=>e.json())),i}function l(t,e){return t.title.toLowerCase().includes(e)||t.excerpt.toLowerCase().includes(e)?!0:t.headings.some(r=>r.text.toLowerCase().includes(e))}function u(t,e,r){if(e.innerHTML="",t.length===0){e.hidden=!1;{const n=document.createElement("li");n.className="docs-search-empty",n.textContent="No matches",e.appendChild(n)}return}e.hidden=!1;for(const n of t.slice(0,8)){const s=document.createElement("li"),c=document.createElement("a");c.href=n.path;const o=document.createElement("span");o.className="docs-search-result-title",o.textContent=n.title;const a=document.createElement("span");a.className="docs-search-result-meta",a.textContent=[n.group,n.section].filter(Boolean).join(" / "),c.append(o,a),s.appendChild(c),e.appendChild(s)}}document.querySelectorAll(".docs-search").forEach(t=>{const e=t.dataset.indexUrl,r=t.querySelector(".docs-search-input"),n=t.querySelector(".docs-search-results");r.addEventListener("input",async()=>{const s=r.value.trim().toLowerCase();if(!s){n.hidden=!0,n.innerHTML="";return}const{pages:c}=await d(e);r.value.trim().toLowerCase()===s&&u(c.filter(o=>l(o,s)),n)}),r.addEventListener("focus",()=>{d(e),n.childElementCount>0&&(n.hidden=!1)}),r.addEventListener("keydown",s=>{s.key==="Escape"&&(r.value="",n.hidden=!0,n.innerHTML="",r.blur())}),r.addEventListener("blur",()=>{window.setTimeout(()=>{n.hidden=!0},150)})});document.addEventListener("keydown",t=>{if(!(t.metaKey||t.ctrlKey)||t.key.toLowerCase()!=="k")return;const e=[...document.querySelectorAll(".docs-search-input")].find(r=>r.offsetParent!==null);e&&(t.preventDefault(),e.focus(),e.select())});</script> <details class="docs-nav-group"> <summary>Overview</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/overview/"> Overview </a> </li><li> <a href="/__pyric/ui/docs/tutorial/"> Tutorial </a> </li><li> <a href="/__pyric/ui/docs/examples/"> Examples </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/vite/"> Vite </a> </li><li> <a href="/__pyric/ui/docs/get-started/nextjs/"> Next.js </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" open> <summary>Secure & debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading"> Examples </h2> <ul> <li> <a href="/__pyric/ui/docs/examples/chess/" aria-current="page"> Chess showcase </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Observe & shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic & rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/resolve-runtime-status/"> Runtime status </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Ship & test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Trust</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/trust/versioning-and-compatibility/"> Versioning and the fb tag </a> </li><li> <a href="/__pyric/ui/docs/trust/storage-rules-stdlib-research/"> Storage Rules modules: evidence and design </a> </li><li> <a href="/__pyric/ui/docs/trust/rules-standard-library/"> Rules standard library reference </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/conformance-scores/"> Conformance scores </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group"> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-messaging-reference-api/"> pyric-admin/messaging </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-docs-reference-api/"> @pyric/cli/conformance/docs </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-next-reference-api/"> @pyric/cli/next </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-app-bridge-reference-api/"> @pyric/cli/register/app-bridge </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div> </div> </details> </nav> </details> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <details class="docs-nav-group" id="nav-group-overview"> <summary>Overview</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/overview/"> Overview </a> </li><li> <a href="/__pyric/ui/docs/tutorial/"> Tutorial </a> </li><li> <a href="/__pyric/ui/docs/examples/"> Examples </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-get-started"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/vite/"> Vite </a> </li><li> <a href="/__pyric/ui/docs/get-started/nextjs/"> Next.js </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-build"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-secure-debug" open> <summary>Secure & debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading" id="nav-section-secure-debug-examples"> Examples </h2> <ul> <li> <a href="/__pyric/ui/docs/examples/chess/" aria-current="page"> Chess showcase </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-observe-shape"> <summary>Observe & shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic & rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/resolve-runtime-status/"> Runtime status </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-ship-test"> <summary>Ship & test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-work-with-an-agent"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-trust"> <summary>Trust</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/trust/versioning-and-compatibility/"> Versioning and the fb tag </a> </li><li> <a href="/__pyric/ui/docs/trust/storage-rules-stdlib-research/"> Storage Rules modules: evidence and design </a> </li><li> <a href="/__pyric/ui/docs/trust/rules-standard-library/"> Rules standard library reference </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-conformance"> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/conformance-scores/"> Conformance scores </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group" id="nav-group-reference"> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-messaging-reference-api/"> pyric-admin/messaging </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-docs-reference-api/"> @pyric/cli/conformance/docs </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-next-reference-api/"> @pyric/cli/next </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-app-bridge-reference-api/"> @pyric/cli/register/app-bridge </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div> </div> </details> </nav> <main class="doc-main doc-main--example" data-astro-cid-mw7aashj> <nav class="docs-breadcrumbs" aria-label="Breadcrumb"> <ol> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/">Secure & debug</a> </li><li> <span class="docs-breadcrumbs-sep" aria-hidden="true">/</span> <a href="#nav-section-secure-debug-examples">Examples</a> </li><li> <span class="docs-breadcrumbs-sep" aria-hidden="true">/</span> <span aria-current="page">Chess showcase</span> </li> </ol> </nav> <div class="example-doc-page" data-astro-cid-ghke3xma> <header class="example-header" data-astro-cid-3f5pqdpq> <p data-astro-cid-3f5pqdpq>Firestore Security Rules · Isolated browser sandbox</p> <h1 data-astro-cid-3f5pqdpq>Play chess against Security Rules</h1> <div data-astro-cid-3f5pqdpq>Move a piece; Pyric commits the new board or denies the write.</div> </header> <div class="example-stage is-showcase" data-astro-cid-xgvwrve7> <iframe title="Play chess against Security Rules" src="/__pyric/ui/examples/chess/" sandbox="allow-scripts allow-same-origin" scrolling="no" data-example-frame data-example-id="chess" data-min-height="560" data-astro-cid-xgvwrve7></iframe> </div> <script type="module">const i=t=>{if(t.dataset.sizingInstalled==="true")return;t.dataset.sizingInstalled="true";let n;const o=()=>{const e=t.contentDocument;if(!e)return;const s=Math.max(Number(t.dataset.minHeight??0),e.documentElement.scrollHeight,e.body?.scrollHeight??0);t.style.height=`${s}px`};t.addEventListener("load",()=>{n?.disconnect();const e=t.contentDocument;e&&(n=new ResizeObserver(o),n.observe(e.documentElement),e.body&&n.observe(e.body),o())})};document.querySelectorAll("[data-example-frame]").forEach(i);</script> <article class="prose example-explanation" data-astro-cid-ghke3xma> <h2 id="try-the-board">Try the board</h2>
|
|
3
|
-
<
|
|
4
|
-
|
|
1
|
+
<!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"><title>Play chess against Security Rules · Pyric Studio</title><meta name="description" content="Play chess against Firestore Security Rules in an isolated Pyric sandbox."><link rel="icon" type="image/svg+xml" href="/__pyric/ui/pyric-logo.svg"><link rel="preconnect" href="https://use.typekit.net" crossorigin><link rel="stylesheet" href="https://use.typekit.net/jwb3ycu.css"><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet"><link rel="stylesheet" href="/__pyric/ui/_astro/index.UkCBr-_0.css">
|
|
2
|
+
<link rel="stylesheet" href="/__pyric/ui/_astro/_slug_.Da5VLhW1.css">
|
|
3
|
+
<style>:root{--rhythm-para: .875rem;--rhythm-group: 1.5rem;--rhythm-subsection: 2.25rem;--rhythm-section: 3.25rem;--rhythm-list: calc(var(--rhythm-para) * .75)}.prose>*,.prose blockquote>*,.prose li>*,.prose .compat-stat>*{margin-block:0}.prose>*+*{margin-block-start:var(--rhythm-group)}.prose>*+h2{margin-block-start:var(--rhythm-section)}.prose>*+h3,.prose>*+h4{margin-block-start:var(--rhythm-subsection)}.prose>h1+*,.prose>h2+*,.prose>h3+*,.prose>h4+*{margin-block-start:var(--rhythm-para)}.prose>p+p{margin-block-start:var(--rhythm-para)}.prose>p+ul,.prose>p+ol,.prose>p+blockquote{margin-block-start:var(--rhythm-para)}.prose li+li{margin-block-start:var(--rhythm-list)}.prose li>ul,.prose li>ol{margin-block-start:var(--rhythm-list)}.prose li>*+*,.prose blockquote>*+*{margin-block-start:var(--rhythm-para)}
|
|
4
|
+
html{scrollbar-gutter:stable}
|
|
5
|
+
</style></head> <body> <header class="studio__chrome"> <div class="studio__bar"> <div class="studio__chrome-inner"> <nav class="studio__nav" aria-label="Site"> <a class="studio__brand" href="/__pyric/ui/" aria-label="Pyric">pyric</a> <a class="studio__nav-tab" href="/__pyric/ui/"> Home </a><a class="studio__nav-tab" href="/__pyric/ui/docs" aria-current="page"> Docs </a><a class="studio__nav-tab" href="/__pyric/ui/studio"> Studio </a> </nav> </div> </div> </header> <div class="docs-shell docs-shell--example" data-astro-cid-mw7aashj> <details class="docs-nav-drawer" data-astro-cid-mw7aashj> <summary data-astro-cid-mw7aashj>Navigate</summary> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <script type="module">let i=null;function d(t){return i||(i=fetch(t).then(e=>e.json())),i}function l(t,e){return t.title.toLowerCase().includes(e)||t.excerpt.toLowerCase().includes(e)?!0:t.headings.some(r=>r.text.toLowerCase().includes(e))}function u(t,e,r){if(e.innerHTML="",t.length===0){e.hidden=!1;{const n=document.createElement("li");n.className="docs-search-empty",n.textContent="No matches",e.appendChild(n)}return}e.hidden=!1;for(const n of t.slice(0,8)){const s=document.createElement("li"),c=document.createElement("a");c.href=n.path;const o=document.createElement("span");o.className="docs-search-result-title",o.textContent=n.title;const a=document.createElement("span");a.className="docs-search-result-meta",a.textContent=[n.group,n.section].filter(Boolean).join(" / "),c.append(o,a),s.appendChild(c),e.appendChild(s)}}document.querySelectorAll(".docs-search").forEach(t=>{const e=t.dataset.indexUrl,r=t.querySelector(".docs-search-input"),n=t.querySelector(".docs-search-results");r.addEventListener("input",async()=>{const s=r.value.trim().toLowerCase();if(!s){n.hidden=!0,n.innerHTML="";return}const{pages:c}=await d(e);r.value.trim().toLowerCase()===s&&u(c.filter(o=>l(o,s)),n)}),r.addEventListener("focus",()=>{d(e),n.childElementCount>0&&(n.hidden=!1)}),r.addEventListener("keydown",s=>{s.key==="Escape"&&(r.value="",n.hidden=!0,n.innerHTML="",r.blur())}),r.addEventListener("blur",()=>{window.setTimeout(()=>{n.hidden=!0},150)})});document.addEventListener("keydown",t=>{if(!(t.metaKey||t.ctrlKey)||t.key.toLowerCase()!=="k")return;const e=[...document.querySelectorAll(".docs-search-input")].find(r=>r.offsetParent!==null);e&&(t.preventDefault(),e.focus(),e.select())});</script> <details class="docs-nav-group"> <summary>Overview</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/overview/"> Overview </a> </li><li> <a href="/__pyric/ui/docs/tutorial/"> Tutorial </a> </li><li> <a href="/__pyric/ui/docs/examples/"> Examples </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/vite/"> Vite </a> </li><li> <a href="/__pyric/ui/docs/get-started/nextjs/"> Next.js </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" open> <summary>Secure & debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading"> Examples </h2> <ul> <li> <a href="/__pyric/ui/docs/examples/chess/" aria-current="page"> Chess showcase </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Observe & shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic & rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/resolve-runtime-status/"> Runtime status </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Ship & test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Trust</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/trust/versioning-and-compatibility/"> Versioning and the fb tag </a> </li><li> <a href="/__pyric/ui/docs/trust/rules-standard-library/"> Rules standard library reference </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/conformance-scores/"> Conformance scores </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group"> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-reference-api/"> pyric-admin </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-messaging-reference-api/"> pyric-admin/messaging </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-docs-reference-api/"> @pyric/cli/conformance/docs </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-next-reference-api/"> @pyric/cli/next </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-app-bridge-reference-api/"> @pyric/cli/register/app-bridge </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/reference/cli/"> CLI </a> </li> </ul> </div> </div> </details> </nav> </details> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <details class="docs-nav-group" id="nav-group-overview"> <summary>Overview</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/overview/"> Overview </a> </li><li> <a href="/__pyric/ui/docs/tutorial/"> Tutorial </a> </li><li> <a href="/__pyric/ui/docs/examples/"> Examples </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-get-started"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/vite/"> Vite </a> </li><li> <a href="/__pyric/ui/docs/get-started/nextjs/"> Next.js </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-build"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-secure-debug" open> <summary>Secure & debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading" id="nav-section-secure-debug-examples"> Examples </h2> <ul> <li> <a href="/__pyric/ui/docs/examples/chess/" aria-current="page"> Chess showcase </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-observe-shape"> <summary>Observe & shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic & rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/resolve-runtime-status/"> Runtime status </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-ship-test"> <summary>Ship & test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-work-with-an-agent"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-trust"> <summary>Trust</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/trust/versioning-and-compatibility/"> Versioning and the fb tag </a> </li><li> <a href="/__pyric/ui/docs/trust/rules-standard-library/"> Rules standard library reference </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-conformance"> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/conformance-scores/"> Conformance scores </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group" id="nav-group-reference"> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-reference-api/"> pyric-admin </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-messaging-reference-api/"> pyric-admin/messaging </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-docs-reference-api/"> @pyric/cli/conformance/docs </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-next-reference-api/"> @pyric/cli/next </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-app-bridge-reference-api/"> @pyric/cli/register/app-bridge </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/reference/cli/"> CLI </a> </li> </ul> </div> </div> </details> </nav> <main class="doc-main doc-main--example" data-astro-cid-mw7aashj> <nav class="docs-breadcrumbs" aria-label="Breadcrumb"> <ol> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/">Secure & debug</a> </li><li> <span class="docs-breadcrumbs-sep" aria-hidden="true">/</span> <a href="#nav-section-secure-debug-examples">Examples</a> </li><li> <span class="docs-breadcrumbs-sep" aria-hidden="true">/</span> <span aria-current="page">Chess showcase</span> </li> </ol> </nav> <div class="example-doc-page" data-astro-cid-ghke3xma> <header class="example-header" data-astro-cid-3f5pqdpq> <p class="example-meta" data-astro-cid-sluz6xkv="true">Firestore Security Rules · Isolated browser sandbox</p> <h1 data-astro-cid-3f5pqdpq>Play chess against Security Rules</h1> <div data-astro-cid-3f5pqdpq>Move a piece; Pyric commits the new board or denies the write.</div> </header> <div class="example-stage is-showcase" data-astro-cid-xgvwrve7> <iframe title="Play chess against Security Rules" src="/__pyric/ui/examples/chess/" sandbox="allow-scripts allow-same-origin" scrolling="no" data-example-frame data-example-id="chess" data-min-height="560" data-astro-cid-xgvwrve7></iframe> </div> <script type="module">const i=t=>{if(t.dataset.sizingInstalled==="true")return;t.dataset.sizingInstalled="true";let n;const o=()=>{const e=t.contentDocument;if(!e)return;const s=Math.max(Number(t.dataset.minHeight??0),e.documentElement.scrollHeight,e.body?.scrollHeight??0);t.style.height=`${s}px`};t.addEventListener("load",()=>{n?.disconnect();const e=t.contentDocument;e&&(n=new ResizeObserver(o),n.observe(e.documentElement),e.body&&n.observe(e.body),o())})};document.querySelectorAll("[data-example-frame]").forEach(i);</script> <article class="prose example-explanation" data-astro-cid-ghke3xma> <h2 id="try-the-board">Try the board</h2>
|
|
6
|
+
<p>Choose a piece and its destination. <code>e2 → e4</code> is allowed. <code>e2 → e5</code> is denied and leaves the board unchanged. Switch the identity to see turn ownership enforced.</p>
|
|
7
|
+
<p>Choose a scenario to run a complete sequence through the Rules. Fool’s Mate and Scholar’s Mate end in checkmate. The opening remains in progress. The illegal pawn leap is denied without changing the board.</p>
|
|
5
8
|
<h2 id="a-move-is-a-firestore-write">A move is a Firestore write</h2>
|
|
6
9
|
<pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="text"><code><span class="line"><span>move → proposed Firestore document → Security Rules → commit or deny → next board</span></span></code></pre>
|
|
7
10
|
<p>Each game is one Firestore document. A move proposes its next state: one square is emptied, another receives the piece, the turn changes, and the move count increases.</p>
|
|
8
|
-
<p>Pyric evaluates that write against Firestore Security Rules in the browser. An allowed write changes the document and the board.
|
|
9
|
-
<h2 id="
|
|
11
|
+
<p>Pyric evaluates that write against Firestore Security Rules in the browser. An allowed write changes the document and the board. When the Rules deny a write, the document and board stay unchanged.</p>
|
|
12
|
+
<h2 id="why-the-rules-look-like-this">Why the Rules look like this</h2>
|
|
13
|
+
<p>Firestore Security Rules cannot loop over the pieces on a chessboard. A request also has limits on expressions, function calls, and document reads. These constraints determine how the chess Rules are structured.</p>
|
|
14
|
+
<p>Movement geometry lives in a read-only Firestore document, where the Rules can look up valid destinations and the squares between them. Check detection names each opposing piece explicitly. Each move type starts in a separate branch so unrelated checks can stop early.</p>
|
|
15
|
+
<h2 id="look-up-the-available-helpers">Look up the available helpers</h2>
|
|
10
16
|
<pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="rules"><code><span class="line"><span style="color:#C678DD">rules_version</span><span style="color:#ABB2BF"> = </span><span style="color:#98C379">'2+modules'</span><span style="color:#ABB2BF">;</span></span>
|
|
11
17
|
<span class="line"></span>
|
|
12
18
|
<span class="line"><span style="color:#C678DD">import</span><span style="color:#ABB2BF"> { isAuthenticated } </span><span style="color:#C678DD">from</span><span style="color:#98C379"> 'auth'</span><span style="color:#ABB2BF">;</span></span>
|
|
13
19
|
<span class="line"><span style="color:#C678DD">import</span><span style="color:#ABB2BF"> { validSimpleMove } </span><span style="color:#C678DD">from</span><span style="color:#98C379"> 'geometry'</span><span style="color:#ABB2BF">;</span></span>
|
|
14
20
|
<span class="line"><span style="color:#C678DD">import</span><span style="color:#ABB2BF"> { isPlaying, moveIncremented, participantsUnchanged } </span><span style="color:#C678DD">from</span><span style="color:#98C379"> 'state'</span><span style="color:#ABB2BF">;</span></span>
|
|
15
21
|
<span class="line"><span style="color:#C678DD">import</span><span style="color:#ABB2BF"> { isMyTurn, turnFlipped } </span><span style="color:#C678DD">from</span><span style="color:#98C379"> 'turns'</span><span style="color:#ABB2BF">;</span></span></code></pre>
|
|
16
|
-
<p
|
|
17
|
-
<p>The
|
|
18
|
-
<
|
|
19
|
-
<
|
|
22
|
+
<p>Before using a helper, an agent can ask <code>firestore_rules_stdlib_list</code> and <code>firestore_rules_stdlib_get</code> for its exact name, arguments, and examples. The imports above come from that library. <code>firestore_resolve_modules</code> then turns them into ordinary version 2 Rules.</p>
|
|
23
|
+
<p>The shared helpers cover authentication, participants, turns, move counts, and movement across a grid. The functions left in this file deal with chess: blocked paths, captures, castling, and king safety.</p>
|
|
24
|
+
<h2 id="route-each-move-to-one-branch">Route each move to one branch</h2>
|
|
25
|
+
<p>Before writing the proposed game document, the board labels each available move from the piece and its destination:</p>
|
|
26
|
+
<div class="table-scroll">
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
<table><thead><tr><th>Piece and destination</th><th><code>moveType</code></th></tr></thead><tbody><tr><td>Non-pawn moving to an empty square</td><td><code>normal</code></td></tr><tr><td>Non-pawn moving to an occupied square</td><td><code>capture</code></td></tr><tr><td>Pawn moving one square to an empty square</td><td><code>pawn_forward</code></td></tr><tr><td>Pawn moving two squares to an empty square</td><td><code>double_pawn</code></td></tr><tr><td>Pawn moving to an occupied square</td><td><code>pawn_capture</code></td></tr></tbody></table></div>
|
|
56
|
+
<p>The board stores the label in the proposed <code>/chess-v2/{gameId}</code> document. The matching Rules branch then checks whether the move is legal. In the Rules, <code>resource.data</code> is the current game and <code>request.resource.data</code> is that proposed next game.</p>
|
|
57
|
+
<p>The <code>allow update</code> clauses inside this match block are alternatives. Firestore allows the update when any one of them returns <code>true</code>. Because a proposed document has one <code>moveType</code>, only its matching branch can get past the first comparison.</p>
|
|
20
58
|
<pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="rules"><code><span class="line"><span style="color:#C678DD">allow</span><span style="color:#61AFEF"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.data.moveType == </span><span style="color:#98C379">'normal'</span></span>
|
|
21
|
-
<span class="line"><span style="color:#ABB2BF"> &&
|
|
59
|
+
<span class="line"><span style="color:#ABB2BF"> && </span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.data.capturedPiece == </span><span style="color:#98C379">''</span></span>
|
|
60
|
+
<span class="line"><span style="color:#ABB2BF"> && </span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.data.status == </span><span style="color:#98C379">'playing'</span></span>
|
|
61
|
+
<span class="line"><span style="color:#ABB2BF"> && baseMoveChecks() && validPieceMove()</span></span>
|
|
62
|
+
<span class="line"><span style="color:#ABB2BF"> && </span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.data[</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.data.moveTo] == </span><span style="color:#98C379">''</span></span>
|
|
63
|
+
<span class="line"><span style="color:#ABB2BF"> && pieceMovedCorrectly() && myKingSafe();</span></span>
|
|
22
64
|
<span class="line"></span>
|
|
23
65
|
<span class="line"><span style="color:#C678DD">allow</span><span style="color:#61AFEF"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.data.moveType == </span><span style="color:#98C379">'capture'</span></span>
|
|
24
|
-
<span class="line"><span style="color:#ABB2BF"> &&
|
|
25
|
-
<
|
|
26
|
-
<
|
|
66
|
+
<span class="line"><span style="color:#ABB2BF"> && </span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.data.capturedPiece != </span><span style="color:#98C379">''</span></span>
|
|
67
|
+
<span class="line"><span style="color:#ABB2BF"> && </span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.data.status == </span><span style="color:#98C379">'playing'</span></span>
|
|
68
|
+
<span class="line"><span style="color:#ABB2BF"> && baseMoveChecks() && validPieceMove()</span></span>
|
|
69
|
+
<span class="line"><span style="color:#ABB2BF"> && captureValid() && pieceMovedCorrectly() && myKingSafe();</span></span></code></pre>
|
|
70
|
+
<p>The <code>normal</code> branch requires an empty destination and no captured piece. The <code>capture</code> branch requires a captured piece, and <code>captureValid()</code> checks that the proposed document removes it. Both branches check the player and turn, the piece’s movement, the changed board fields, and king safety. Pawn moves have separate branches.</p>
|
|
71
|
+
<p>The first comparison in each branch is deliberately cheap. A capture skips the normal-move checks, and a normal move skips the capture checks. <code>firestore_lint_rules</code> warns the agent when branches share a gate and may waste the evaluation budget, as well as when a branch calls too many functions or reads too many documents.</p>
|
|
72
|
+
<h2 id="derive-checkmate-from-the-board">Derive checkmate from the board</h2>
|
|
27
73
|
<p>Security Rules decide whether a move may be stored. After an allowed move commits, the browser checks the resulting board. It reports checkmate only when the king is attacked and no legal move, capture, block, king escape, or en passant response removes the attack.</p>
|
|
28
|
-
<p>
|
|
29
|
-
<h2 id="test-
|
|
30
|
-
<p>
|
|
31
|
-
<p>
|
|
74
|
+
<p>The write contains the move and the next board state. After it commits, the browser derives checkmate from that board.</p>
|
|
75
|
+
<h2 id="test-specific-moves">Test specific moves</h2>
|
|
76
|
+
<p>After changing the Rules, the agent uses <code>firestore_simulate_rules</code> to try specific moves with a player and a board state. Stateful sandbox sessions run longer sequences. If a move is denied unexpectedly, <code>sandbox_inspect</code> shows the request, identity, active Rules, and denial.</p>
|
|
77
|
+
<p>The local suite covers allowed and denied geometry, blocked paths, captures, pins, check, turn ownership, resignation, and checkmate. It also checks that a rejected move leaves the Firestore document unchanged.</p>
|
|
78
|
+
<p>These checks happen in Pyric’s local development mirror. Important cases also run against a Firebase project before shipping.</p> </article> <section class="example-rules" data-astro-cid-ghke3xma> <h2 data-astro-cid-ghke3xma>Full Security Rules</h2> <p data-astro-cid-ghke3xma>These are the Rules running the board above. Look for the imports at the top, the separate <code data-astro-cid-ghke3xma>moveType</code> gates, and the explicit king-safety checks.</p> <section class="source-explorer" aria-label="Chess Security Rules" data-source="rules_version = '2+modules';
|
|
32
79
|
|
|
33
|
-
import { isAuthenticated } from
|
|
34
|
-
import { validSimpleMove } from
|
|
35
|
-
import { isPlaying, moveIncremented, participantsUnchanged } from
|
|
36
|
-
import { isMyTurn, turnFlipped } from
|
|
80
|
+
import { isAuthenticated } from 'auth';
|
|
81
|
+
import { validSimpleMove } from 'geometry';
|
|
82
|
+
import { isPlaying, moveIncremented, participantsUnchanged } from 'state';
|
|
83
|
+
import { isMyTurn, turnFlipped } from 'turns';
|
|
37
84
|
|
|
38
85
|
service cloud.firestore {
|
|
39
86
|
match /databases/{database}/documents {
|
|
@@ -44,15 +91,15 @@ service cloud.firestore {
|
|
|
44
91
|
|
|
45
92
|
function isOwnPiece() {
|
|
46
93
|
let piece = resource.data[request.resource.data.moveFrom];
|
|
47
|
-
return (resource.data.currentTurn ==
|
|
48
|
-
|
|
49
|
-
|| (resource.data.currentTurn ==
|
|
50
|
-
|
|
94
|
+
return (resource.data.currentTurn == 'host'
|
|
95
|
+
&& (piece == 'K' || piece == 'Q' || piece == 'R' || piece == 'B' || piece == 'N' || piece == 'P'))
|
|
96
|
+
|| (resource.data.currentTurn == 'guest'
|
|
97
|
+
&& (piece == 'k' || piece == 'q' || piece == 'r' || piece == 'b' || piece == 'n' || piece == 'p'));
|
|
51
98
|
}
|
|
52
99
|
function baseMoveChecks() {
|
|
53
|
-
return isAuthenticated()
|
|
54
|
-
|
|
55
|
-
|
|
100
|
+
return isAuthenticated() && isPlaying()
|
|
101
|
+
&& isMyTurn() && turnFlipped() && isOwnPiece()
|
|
102
|
+
&& moveIncremented() && participantsUnchanged();
|
|
56
103
|
}
|
|
57
104
|
|
|
58
105
|
function validPieceMove() {
|
|
@@ -61,324 +108,676 @@ service cloud.firestore {
|
|
|
61
108
|
let piece = resource.data[mf];
|
|
62
109
|
let p = cfg().paths[mf][mt];
|
|
63
110
|
return validSimpleMove(cfg())
|
|
64
|
-
|
|
65
|
-
|| ((p.len
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
111
|
+
&& (cfg().pieceCategory[piece] == 'jump'
|
|
112
|
+
|| ((p.len < 1 || resource.data[p.c0] == '')
|
|
113
|
+
&& (p.len < 2 || resource.data[p.c1] == '')
|
|
114
|
+
&& (p.len < 3 || resource.data[p.c2] == '')
|
|
115
|
+
&& (p.len < 4 || resource.data[p.c3] == '')
|
|
116
|
+
&& (p.len < 5 || resource.data[p.c4] == '')
|
|
117
|
+
&& (p.len < 6 || resource.data[p.c5] == '')));
|
|
71
118
|
}
|
|
72
119
|
function validPawnForward() {
|
|
73
120
|
let mf = request.resource.data.moveFrom;
|
|
74
121
|
let mt = request.resource.data.moveTo;
|
|
75
122
|
let piece = resource.data[mf];
|
|
76
|
-
return (piece ==
|
|
123
|
+
return (piece == 'P' || piece == 'p') && mt in cfg().pawnForward[piece][mf] && resource.data[mt] == '';
|
|
77
124
|
}
|
|
78
125
|
function validPawnDouble() {
|
|
79
126
|
let mf = request.resource.data.moveFrom;
|
|
80
127
|
let mt = request.resource.data.moveTo;
|
|
81
128
|
let piece = resource.data[mf];
|
|
82
|
-
return (piece ==
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
129
|
+
return (piece == 'P' || piece == 'p')
|
|
130
|
+
&& mf in cfg().pawnDouble[piece]
|
|
131
|
+
&& cfg().pawnDouble[piece][mf].to == mt
|
|
132
|
+
&& resource.data[mt] == ''
|
|
133
|
+
&& resource.data[cfg().pawnDouble[piece][mf].between] == '';
|
|
87
134
|
}
|
|
88
135
|
function validPawnCapture() {
|
|
89
136
|
let mf = request.resource.data.moveFrom;
|
|
90
137
|
let mt = request.resource.data.moveTo;
|
|
91
138
|
let piece = resource.data[mf];
|
|
92
139
|
let target = resource.data[mt];
|
|
93
|
-
return (piece ==
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|| (piece ==
|
|
140
|
+
return (piece == 'P' || piece == 'p')
|
|
141
|
+
&& mt in cfg().pawnAttacks[piece][mf]
|
|
142
|
+
&& target != ''
|
|
143
|
+
&& ((piece == 'P' && (target == 'k' || target == 'q' || target == 'r' || target == 'b' || target == 'n' || target == 'p'))
|
|
144
|
+
|| (piece == 'p' && (target == 'K' || target == 'Q' || target == 'R' || target == 'B' || target == 'N' || target == 'P')));
|
|
98
145
|
}
|
|
99
146
|
function validPromotion() {
|
|
100
147
|
let mt = request.resource.data.moveTo;
|
|
101
148
|
let piece = resource.data[request.resource.data.moveFrom];
|
|
102
149
|
let pt = request.resource.data.promotedTo;
|
|
103
|
-
return request.resource.data.moveType ==
|
|
104
|
-
|
|
105
|
-
|| (piece ==
|
|
150
|
+
return request.resource.data.moveType == 'promotion'
|
|
151
|
+
&& ((piece == 'P' && mt >= 'a8' && mt <= 'h8' && (pt == 'Q' || pt == 'R' || pt == 'B' || pt == 'N'))
|
|
152
|
+
|| (piece == 'p' && mt >= 'a1' && mt <= 'h1' && (pt == 'q' || pt == 'r' || pt == 'b' || pt == 'n')));
|
|
106
153
|
}
|
|
107
154
|
function pieceMovedCorrectly() {
|
|
108
155
|
let mf = request.resource.data.moveFrom;
|
|
109
156
|
let mt = request.resource.data.moveTo;
|
|
110
157
|
let piece = resource.data[mf];
|
|
111
|
-
return request.resource.data[mf] ==
|
|
112
|
-
|
|
158
|
+
return request.resource.data[mf] == ''
|
|
159
|
+
&& (request.resource.data.moveType != 'promotion'
|
|
113
160
|
? request.resource.data[mt] == piece
|
|
114
161
|
: request.resource.data[mt] == request.resource.data.promotedTo)
|
|
115
|
-
|
|
116
|
-
|
|
162
|
+
&& resource.data[request.resource.data.movedPiece] == mf
|
|
163
|
+
&& request.resource.data[request.resource.data.movedPiece] == mt;
|
|
117
164
|
}
|
|
118
165
|
function captureValid() {
|
|
119
166
|
let cp = request.resource.data.capturedPiece;
|
|
120
|
-
return cp !=
|
|
121
|
-
|
|
122
|
-
|
|
167
|
+
return cp != ''
|
|
168
|
+
&& resource.data[cp] == request.resource.data.moveTo
|
|
169
|
+
&& request.resource.data[cp] == '';
|
|
123
170
|
}
|
|
124
171
|
function validEnPassant() {
|
|
125
172
|
let mf = request.resource.data.moveFrom;
|
|
126
173
|
let mt = request.resource.data.moveTo;
|
|
127
174
|
let piece = resource.data[mf];
|
|
128
|
-
return (piece ==
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
175
|
+
return (piece == 'P' || piece == 'p')
|
|
176
|
+
&& mt in cfg().pawnAttacks[piece][mf]
|
|
177
|
+
&& resource.data[mt] == ''
|
|
178
|
+
&& resource.data.lastDoublePawn == mt;
|
|
132
179
|
}
|
|
133
180
|
function validCastleKingside() {
|
|
134
181
|
let turn = resource.data.currentTurn;
|
|
135
182
|
let c = cfg().castling;
|
|
136
|
-
let castle = turn ==
|
|
137
|
-
let kingMoved = turn ==
|
|
138
|
-
let rookMoved = turn ==
|
|
139
|
-
return !kingMoved
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
183
|
+
let castle = turn == 'host' ? c.wk : c.bk;
|
|
184
|
+
let kingMoved = turn == 'host' ? resource.data.hp_K_moved : resource.data.gp_k_moved;
|
|
185
|
+
let rookMoved = turn == 'host' ? resource.data.hp_R2_moved : resource.data.gp_r2_moved;
|
|
186
|
+
return !kingMoved && !rookMoved
|
|
187
|
+
&& request.resource.data.moveFrom == castle.kingFrom
|
|
188
|
+
&& request.resource.data.moveTo == castle.kingTo
|
|
189
|
+
&& resource.data[castle.between[0]] == ''
|
|
190
|
+
&& resource.data[castle.between[1]] == '';
|
|
144
191
|
}
|
|
145
192
|
function validCastleQueenside() {
|
|
146
193
|
let turn = resource.data.currentTurn;
|
|
147
194
|
let c = cfg().castling;
|
|
148
|
-
let castle = turn ==
|
|
149
|
-
let kingMoved = turn ==
|
|
150
|
-
let rookMoved = turn ==
|
|
151
|
-
return !kingMoved
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
195
|
+
let castle = turn == 'host' ? c.wq : c.bq;
|
|
196
|
+
let kingMoved = turn == 'host' ? resource.data.hp_K_moved : resource.data.gp_k_moved;
|
|
197
|
+
let rookMoved = turn == 'host' ? resource.data.hp_R1_moved : resource.data.gp_r1_moved;
|
|
198
|
+
return !kingMoved && !rookMoved
|
|
199
|
+
&& request.resource.data.moveFrom == castle.kingFrom
|
|
200
|
+
&& request.resource.data.moveTo == castle.kingTo
|
|
201
|
+
&& resource.data[castle.between[0]] == ''
|
|
202
|
+
&& resource.data[castle.between[1]] == ''
|
|
203
|
+
&& resource.data[castle.between[2]] == '';
|
|
157
204
|
}
|
|
158
205
|
|
|
159
206
|
function hPC(cfg) {
|
|
160
207
|
let b = request.resource.data;
|
|
161
208
|
let ks = b.hp_K;
|
|
162
|
-
return (b.gp_p1 != &#
|
|
163
|
-
|| (b.gp_p2 != &#
|
|
164
|
-
|| (b.gp_p3 != &#
|
|
165
|
-
|| (b.gp_p4 != &#
|
|
166
|
-
|| (b.gp_p5 != &#
|
|
167
|
-
|| (b.gp_p6 != &#
|
|
168
|
-
|| (b.gp_p7 != &#
|
|
169
|
-
|| (b.gp_p8 != &#
|
|
209
|
+
return (b.gp_p1 != '' && b[b.gp_p1] != '' && ks in cfg.pawnAttacks[b[b.gp_p1]][b.gp_p1])
|
|
210
|
+
|| (b.gp_p2 != '' && b[b.gp_p2] != '' && ks in cfg.pawnAttacks[b[b.gp_p2]][b.gp_p2])
|
|
211
|
+
|| (b.gp_p3 != '' && b[b.gp_p3] != '' && ks in cfg.pawnAttacks[b[b.gp_p3]][b.gp_p3])
|
|
212
|
+
|| (b.gp_p4 != '' && b[b.gp_p4] != '' && ks in cfg.pawnAttacks[b[b.gp_p4]][b.gp_p4])
|
|
213
|
+
|| (b.gp_p5 != '' && b[b.gp_p5] != '' && ks in cfg.pawnAttacks[b[b.gp_p5]][b.gp_p5])
|
|
214
|
+
|| (b.gp_p6 != '' && b[b.gp_p6] != '' && ks in cfg.pawnAttacks[b[b.gp_p6]][b.gp_p6])
|
|
215
|
+
|| (b.gp_p7 != '' && b[b.gp_p7] != '' && ks in cfg.pawnAttacks[b[b.gp_p7]][b.gp_p7])
|
|
216
|
+
|| (b.gp_p8 != '' && b[b.gp_p8] != '' && ks in cfg.pawnAttacks[b[b.gp_p8]][b.gp_p8]);
|
|
170
217
|
}
|
|
171
218
|
function hMC(cfg) {
|
|
172
219
|
let b = request.resource.data;
|
|
173
220
|
let ks = b.hp_K;
|
|
174
|
-
return (b.gp_n1 != &#
|
|
175
|
-
|| (b.gp_n2 != &#
|
|
176
|
-
|| (b.gp_k != &#
|
|
221
|
+
return (b.gp_n1 != '' && b[b.gp_n1] != '' && ks in cfg.moves[b[b.gp_n1]][b.gp_n1])
|
|
222
|
+
|| (b.gp_n2 != '' && b[b.gp_n2] != '' && ks in cfg.moves[b[b.gp_n2]][b.gp_n2])
|
|
223
|
+
|| (b.gp_k != '' && b[b.gp_k] != '' && ks in cfg.moves[b[b.gp_k]][b.gp_k]);
|
|
177
224
|
}
|
|
178
225
|
function hSC(cfg) {
|
|
179
226
|
let b = request.resource.data;
|
|
180
227
|
let ks = b.hp_K;
|
|
181
|
-
return (b.gp_q != &#
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|| (b.gp_r1 != &#
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|| (b.gp_r2 != &#
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|| (b.gp_b1 != &#
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|| (b.gp_b2 != &#
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
228
|
+
return (b.gp_q != '' && b[b.gp_q] != '' && ks in cfg.moves[b[b.gp_q]][b.gp_q]
|
|
229
|
+
&& (cfg.paths[b.gp_q][ks].len < 1 || b[cfg.paths[b.gp_q][ks].c0] == '')
|
|
230
|
+
&& (cfg.paths[b.gp_q][ks].len < 2 || b[cfg.paths[b.gp_q][ks].c1] == '')
|
|
231
|
+
&& (cfg.paths[b.gp_q][ks].len < 3 || b[cfg.paths[b.gp_q][ks].c2] == '')
|
|
232
|
+
&& (cfg.paths[b.gp_q][ks].len < 4 || b[cfg.paths[b.gp_q][ks].c3] == '')
|
|
233
|
+
&& (cfg.paths[b.gp_q][ks].len < 5 || b[cfg.paths[b.gp_q][ks].c4] == ''))
|
|
234
|
+
|| (b.gp_r1 != '' && b[b.gp_r1] != '' && ks in cfg.moves[b[b.gp_r1]][b.gp_r1]
|
|
235
|
+
&& (cfg.paths[b.gp_r1][ks].len < 1 || b[cfg.paths[b.gp_r1][ks].c0] == '')
|
|
236
|
+
&& (cfg.paths[b.gp_r1][ks].len < 2 || b[cfg.paths[b.gp_r1][ks].c1] == '')
|
|
237
|
+
&& (cfg.paths[b.gp_r1][ks].len < 3 || b[cfg.paths[b.gp_r1][ks].c2] == '')
|
|
238
|
+
&& (cfg.paths[b.gp_r1][ks].len < 4 || b[cfg.paths[b.gp_r1][ks].c3] == '')
|
|
239
|
+
&& (cfg.paths[b.gp_r1][ks].len < 5 || b[cfg.paths[b.gp_r1][ks].c4] == ''))
|
|
240
|
+
|| (b.gp_r2 != '' && b[b.gp_r2] != '' && ks in cfg.moves[b[b.gp_r2]][b.gp_r2]
|
|
241
|
+
&& (cfg.paths[b.gp_r2][ks].len < 1 || b[cfg.paths[b.gp_r2][ks].c0] == '')
|
|
242
|
+
&& (cfg.paths[b.gp_r2][ks].len < 2 || b[cfg.paths[b.gp_r2][ks].c1] == '')
|
|
243
|
+
&& (cfg.paths[b.gp_r2][ks].len < 3 || b[cfg.paths[b.gp_r2][ks].c2] == '')
|
|
244
|
+
&& (cfg.paths[b.gp_r2][ks].len < 4 || b[cfg.paths[b.gp_r2][ks].c3] == '')
|
|
245
|
+
&& (cfg.paths[b.gp_r2][ks].len < 5 || b[cfg.paths[b.gp_r2][ks].c4] == ''))
|
|
246
|
+
|| (b.gp_b1 != '' && b[b.gp_b1] != '' && ks in cfg.moves[b[b.gp_b1]][b.gp_b1]
|
|
247
|
+
&& (cfg.paths[b.gp_b1][ks].len < 1 || b[cfg.paths[b.gp_b1][ks].c0] == '')
|
|
248
|
+
&& (cfg.paths[b.gp_b1][ks].len < 2 || b[cfg.paths[b.gp_b1][ks].c1] == '')
|
|
249
|
+
&& (cfg.paths[b.gp_b1][ks].len < 3 || b[cfg.paths[b.gp_b1][ks].c2] == '')
|
|
250
|
+
&& (cfg.paths[b.gp_b1][ks].len < 4 || b[cfg.paths[b.gp_b1][ks].c3] == '')
|
|
251
|
+
&& (cfg.paths[b.gp_b1][ks].len < 5 || b[cfg.paths[b.gp_b1][ks].c4] == ''))
|
|
252
|
+
|| (b.gp_b2 != '' && b[b.gp_b2] != '' && ks in cfg.moves[b[b.gp_b2]][b.gp_b2]
|
|
253
|
+
&& (cfg.paths[b.gp_b2][ks].len < 1 || b[cfg.paths[b.gp_b2][ks].c0] == '')
|
|
254
|
+
&& (cfg.paths[b.gp_b2][ks].len < 2 || b[cfg.paths[b.gp_b2][ks].c1] == '')
|
|
255
|
+
&& (cfg.paths[b.gp_b2][ks].len < 3 || b[cfg.paths[b.gp_b2][ks].c2] == '')
|
|
256
|
+
&& (cfg.paths[b.gp_b2][ks].len < 4 || b[cfg.paths[b.gp_b2][ks].c3] == '')
|
|
257
|
+
&& (cfg.paths[b.gp_b2][ks].len < 5 || b[cfg.paths[b.gp_b2][ks].c4] == ''));
|
|
211
258
|
}
|
|
212
259
|
function gPC(cfg) {
|
|
213
260
|
let b = request.resource.data;
|
|
214
261
|
let ks = b.gp_k;
|
|
215
|
-
return (b.hp_P1 != &#
|
|
216
|
-
|| (b.hp_P2 != &#
|
|
217
|
-
|| (b.hp_P3 != &#
|
|
218
|
-
|| (b.hp_P4 != &#
|
|
219
|
-
|| (b.hp_P5 != &#
|
|
220
|
-
|| (b.hp_P6 != &#
|
|
221
|
-
|| (b.hp_P7 != &#
|
|
222
|
-
|| (b.hp_P8 != &#
|
|
262
|
+
return (b.hp_P1 != '' && b[b.hp_P1] != '' && ks in cfg.pawnAttacks[b[b.hp_P1]][b.hp_P1])
|
|
263
|
+
|| (b.hp_P2 != '' && b[b.hp_P2] != '' && ks in cfg.pawnAttacks[b[b.hp_P2]][b.hp_P2])
|
|
264
|
+
|| (b.hp_P3 != '' && b[b.hp_P3] != '' && ks in cfg.pawnAttacks[b[b.hp_P3]][b.hp_P3])
|
|
265
|
+
|| (b.hp_P4 != '' && b[b.hp_P4] != '' && ks in cfg.pawnAttacks[b[b.hp_P4]][b.hp_P4])
|
|
266
|
+
|| (b.hp_P5 != '' && b[b.hp_P5] != '' && ks in cfg.pawnAttacks[b[b.hp_P5]][b.hp_P5])
|
|
267
|
+
|| (b.hp_P6 != '' && b[b.hp_P6] != '' && ks in cfg.pawnAttacks[b[b.hp_P6]][b.hp_P6])
|
|
268
|
+
|| (b.hp_P7 != '' && b[b.hp_P7] != '' && ks in cfg.pawnAttacks[b[b.hp_P7]][b.hp_P7])
|
|
269
|
+
|| (b.hp_P8 != '' && b[b.hp_P8] != '' && ks in cfg.pawnAttacks[b[b.hp_P8]][b.hp_P8]);
|
|
223
270
|
}
|
|
224
271
|
function gMC(cfg) {
|
|
225
272
|
let b = request.resource.data;
|
|
226
273
|
let ks = b.gp_k;
|
|
227
|
-
return (b.hp_N1 != &#
|
|
228
|
-
|| (b.hp_N2 != &#
|
|
229
|
-
|| (b.hp_K != &#
|
|
274
|
+
return (b.hp_N1 != '' && b[b.hp_N1] != '' && ks in cfg.moves[b[b.hp_N1]][b.hp_N1])
|
|
275
|
+
|| (b.hp_N2 != '' && b[b.hp_N2] != '' && ks in cfg.moves[b[b.hp_N2]][b.hp_N2])
|
|
276
|
+
|| (b.hp_K != '' && b[b.hp_K] != '' && ks in cfg.moves[b[b.hp_K]][b.hp_K]);
|
|
230
277
|
}
|
|
231
278
|
function gSC(cfg) {
|
|
232
279
|
let b = request.resource.data;
|
|
233
280
|
let ks = b.gp_k;
|
|
234
|
-
return (b.hp_Q != &#
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|| (b.hp_R1 != &#
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|| (b.hp_R2 != &#
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|| (b.hp_B1 != &#
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|| (b.hp_B2 != &#
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
281
|
+
return (b.hp_Q != '' && b[b.hp_Q] != '' && ks in cfg.moves[b[b.hp_Q]][b.hp_Q]
|
|
282
|
+
&& (cfg.paths[b.hp_Q][ks].len < 1 || b[cfg.paths[b.hp_Q][ks].c0] == '')
|
|
283
|
+
&& (cfg.paths[b.hp_Q][ks].len < 2 || b[cfg.paths[b.hp_Q][ks].c1] == '')
|
|
284
|
+
&& (cfg.paths[b.hp_Q][ks].len < 3 || b[cfg.paths[b.hp_Q][ks].c2] == '')
|
|
285
|
+
&& (cfg.paths[b.hp_Q][ks].len < 4 || b[cfg.paths[b.hp_Q][ks].c3] == '')
|
|
286
|
+
&& (cfg.paths[b.hp_Q][ks].len < 5 || b[cfg.paths[b.hp_Q][ks].c4] == ''))
|
|
287
|
+
|| (b.hp_R1 != '' && b[b.hp_R1] != '' && ks in cfg.moves[b[b.hp_R1]][b.hp_R1]
|
|
288
|
+
&& (cfg.paths[b.hp_R1][ks].len < 1 || b[cfg.paths[b.hp_R1][ks].c0] == '')
|
|
289
|
+
&& (cfg.paths[b.hp_R1][ks].len < 2 || b[cfg.paths[b.hp_R1][ks].c1] == '')
|
|
290
|
+
&& (cfg.paths[b.hp_R1][ks].len < 3 || b[cfg.paths[b.hp_R1][ks].c2] == '')
|
|
291
|
+
&& (cfg.paths[b.hp_R1][ks].len < 4 || b[cfg.paths[b.hp_R1][ks].c3] == '')
|
|
292
|
+
&& (cfg.paths[b.hp_R1][ks].len < 5 || b[cfg.paths[b.hp_R1][ks].c4] == ''))
|
|
293
|
+
|| (b.hp_R2 != '' && b[b.hp_R2] != '' && ks in cfg.moves[b[b.hp_R2]][b.hp_R2]
|
|
294
|
+
&& (cfg.paths[b.hp_R2][ks].len < 1 || b[cfg.paths[b.hp_R2][ks].c0] == '')
|
|
295
|
+
&& (cfg.paths[b.hp_R2][ks].len < 2 || b[cfg.paths[b.hp_R2][ks].c1] == '')
|
|
296
|
+
&& (cfg.paths[b.hp_R2][ks].len < 3 || b[cfg.paths[b.hp_R2][ks].c2] == '')
|
|
297
|
+
&& (cfg.paths[b.hp_R2][ks].len < 4 || b[cfg.paths[b.hp_R2][ks].c3] == '')
|
|
298
|
+
&& (cfg.paths[b.hp_R2][ks].len < 5 || b[cfg.paths[b.hp_R2][ks].c4] == ''))
|
|
299
|
+
|| (b.hp_B1 != '' && b[b.hp_B1] != '' && ks in cfg.moves[b[b.hp_B1]][b.hp_B1]
|
|
300
|
+
&& (cfg.paths[b.hp_B1][ks].len < 1 || b[cfg.paths[b.hp_B1][ks].c0] == '')
|
|
301
|
+
&& (cfg.paths[b.hp_B1][ks].len < 2 || b[cfg.paths[b.hp_B1][ks].c1] == '')
|
|
302
|
+
&& (cfg.paths[b.hp_B1][ks].len < 3 || b[cfg.paths[b.hp_B1][ks].c2] == '')
|
|
303
|
+
&& (cfg.paths[b.hp_B1][ks].len < 4 || b[cfg.paths[b.hp_B1][ks].c3] == '')
|
|
304
|
+
&& (cfg.paths[b.hp_B1][ks].len < 5 || b[cfg.paths[b.hp_B1][ks].c4] == ''))
|
|
305
|
+
|| (b.hp_B2 != '' && b[b.hp_B2] != '' && ks in cfg.moves[b[b.hp_B2]][b.hp_B2]
|
|
306
|
+
&& (cfg.paths[b.hp_B2][ks].len < 1 || b[cfg.paths[b.hp_B2][ks].c0] == '')
|
|
307
|
+
&& (cfg.paths[b.hp_B2][ks].len < 2 || b[cfg.paths[b.hp_B2][ks].c1] == '')
|
|
308
|
+
&& (cfg.paths[b.hp_B2][ks].len < 3 || b[cfg.paths[b.hp_B2][ks].c2] == '')
|
|
309
|
+
&& (cfg.paths[b.hp_B2][ks].len < 4 || b[cfg.paths[b.hp_B2][ks].c3] == '')
|
|
310
|
+
&& (cfg.paths[b.hp_B2][ks].len < 5 || b[cfg.paths[b.hp_B2][ks].c4] == ''));
|
|
264
311
|
}
|
|
265
312
|
|
|
266
313
|
function myKingSafe() {
|
|
267
314
|
let c = cfg();
|
|
268
|
-
return (resource.data.currentTurn ==
|
|
269
|
-
|| (resource.data.currentTurn ==
|
|
315
|
+
return (resource.data.currentTurn == 'host' && !hPC(c) && !hMC(c) && !hSC(c))
|
|
316
|
+
|| (resource.data.currentTurn == 'guest' && !gPC(c) && !gMC(c) && !gSC(c));
|
|
270
317
|
}
|
|
271
318
|
function opponentInCheck() {
|
|
272
319
|
let c = cfg();
|
|
273
|
-
return (resource.data.currentTurn ==
|
|
274
|
-
|| (resource.data.currentTurn ==
|
|
320
|
+
return (resource.data.currentTurn == 'host' && (gPC(c) || gMC(c) || gSC(c)))
|
|
321
|
+
|| (resource.data.currentTurn == 'guest' && (hPC(c) || hMC(c) || hSC(c)));
|
|
275
322
|
}
|
|
276
323
|
|
|
277
324
|
// ═══ Lobby ═══
|
|
278
325
|
allow read: if request.auth != null;
|
|
279
326
|
allow create: if request.auth != null
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
327
|
+
&& request.resource.data.host == request.auth.uid
|
|
328
|
+
&& request.resource.data.status == 'waiting'
|
|
329
|
+
&& d.a1 == 'R'
|
|
330
|
+
&& d.a2 == 'P'
|
|
331
|
+
&& d.a7 == 'p'
|
|
332
|
+
&& d.a8 == 'r'
|
|
333
|
+
&& d.b1 == 'N'
|
|
334
|
+
&& d.b2 == 'P'
|
|
335
|
+
&& d.b7 == 'p'
|
|
336
|
+
&& d.b8 == 'n'
|
|
337
|
+
&& d.c1 == 'B'
|
|
338
|
+
&& d.c2 == 'P'
|
|
339
|
+
&& d.c7 == 'p'
|
|
340
|
+
&& d.c8 == 'b'
|
|
341
|
+
&& d.d1 == 'Q'
|
|
342
|
+
&& d.d2 == 'P'
|
|
343
|
+
&& d.d7 == 'p'
|
|
344
|
+
&& d.d8 == 'q'
|
|
345
|
+
&& d.e1 == 'K'
|
|
346
|
+
&& d.e2 == 'P'
|
|
347
|
+
&& d.e7 == 'p'
|
|
348
|
+
&& d.e8 == 'k'
|
|
349
|
+
&& d.f1 == 'B'
|
|
350
|
+
&& d.f2 == 'P'
|
|
351
|
+
&& d.f7 == 'p'
|
|
352
|
+
&& d.f8 == 'b'
|
|
353
|
+
&& d.g1 == 'N'
|
|
354
|
+
&& d.g2 == 'P'
|
|
355
|
+
&& d.g7 == 'p'
|
|
356
|
+
&& d.g8 == 'n'
|
|
357
|
+
&& d.h1 == 'R'
|
|
358
|
+
&& d.h2 == 'P'
|
|
359
|
+
&& d.h7 == 'p'
|
|
360
|
+
&& d.h8 == 'r';
|
|
314
361
|
allow update: if request.auth != null
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
362
|
+
&& resource.data.status == 'waiting'
|
|
363
|
+
&& resource.data.guest == ''
|
|
364
|
+
&& request.resource.data.guest == request.auth.uid
|
|
365
|
+
&& request.auth.uid != resource.data.host
|
|
366
|
+
&& request.resource.data.status == 'playing'
|
|
367
|
+
&& request.resource.data.diff(resource.data).affectedKeys().hasOnly(['guest', 'status']);
|
|
321
368
|
allow delete: if request.auth != null
|
|
322
|
-
|
|
323
|
-
|
|
369
|
+
&& resource.data.status == 'waiting'
|
|
370
|
+
&& request.auth.uid == resource.data.host;
|
|
324
371
|
|
|
325
372
|
// ═══ UNIQUE moveType gates — each rule category has its own ═══
|
|
326
373
|
// Pawn forward
|
|
327
|
-
allow update: if request.resource.data.moveType ==
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
374
|
+
allow update: if request.resource.data.moveType == 'pawn_forward'
|
|
375
|
+
&& request.resource.data.capturedPiece == '' && request.resource.data.status == 'playing'
|
|
376
|
+
&& baseMoveChecks() && validPawnForward() && request.resource.data.promotedTo == ''
|
|
377
|
+
&& pieceMovedCorrectly() && myKingSafe();
|
|
331
378
|
// Pawn capture
|
|
332
|
-
allow update: if request.resource.data.moveType ==
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
379
|
+
allow update: if request.resource.data.moveType == 'pawn_capture'
|
|
380
|
+
&& request.resource.data.capturedPiece != '' && request.resource.data.status == 'playing'
|
|
381
|
+
&& baseMoveChecks() && validPawnCapture() && request.resource.data.promotedTo == ''
|
|
382
|
+
&& captureValid() && pieceMovedCorrectly() && myKingSafe();
|
|
336
383
|
// Pawn double
|
|
337
|
-
allow update: if request.resource.data.moveType ==
|
|
338
|
-
|
|
339
|
-
|
|
384
|
+
allow update: if request.resource.data.moveType == 'double_pawn'
|
|
385
|
+
&& request.resource.data.capturedPiece == '' && request.resource.data.status == 'playing'
|
|
386
|
+
&& baseMoveChecks() && validPawnDouble() && pieceMovedCorrectly() && myKingSafe();
|
|
340
387
|
// Promotion (forward)
|
|
341
|
-
allow update: if request.resource.data.moveType ==
|
|
342
|
-
|
|
343
|
-
|
|
388
|
+
allow update: if request.resource.data.moveType == 'promotion'
|
|
389
|
+
&& request.resource.data.capturedPiece == '' && request.resource.data.status == 'playing'
|
|
390
|
+
&& baseMoveChecks() && validPawnForward() && validPromotion() && pieceMovedCorrectly() && myKingSafe();
|
|
344
391
|
// Promotion (capture)
|
|
345
|
-
allow update: if request.resource.data.moveType ==
|
|
346
|
-
|
|
347
|
-
|
|
392
|
+
allow update: if request.resource.data.moveType == 'promotion_capture'
|
|
393
|
+
&& request.resource.data.capturedPiece != '' && request.resource.data.status == 'playing'
|
|
394
|
+
&& baseMoveChecks() && validPawnCapture() && validPromotion() && captureValid() && pieceMovedCorrectly() && myKingSafe();
|
|
348
395
|
// En passant
|
|
349
|
-
allow update: if request.resource.data.moveType ==
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
396
|
+
allow update: if request.resource.data.moveType == 'en_passant'
|
|
397
|
+
&& request.resource.data.status == 'playing'
|
|
398
|
+
&& baseMoveChecks() && validEnPassant()
|
|
399
|
+
&& request.resource.data.capturedPiece != '' && request.resource.data[request.resource.data.capturedPiece] == ''
|
|
400
|
+
&& pieceMovedCorrectly() && myKingSafe();
|
|
354
401
|
// Standard piece move (non-pawn)
|
|
355
|
-
allow update: if request.resource.data.moveType ==
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
402
|
+
allow update: if request.resource.data.moveType == 'normal'
|
|
403
|
+
&& request.resource.data.capturedPiece == '' && request.resource.data.status == 'playing'
|
|
404
|
+
&& baseMoveChecks() && validPieceMove() && resource.data[request.resource.data.moveTo] == ''
|
|
405
|
+
&& pieceMovedCorrectly() && myKingSafe();
|
|
359
406
|
// Standard piece capture
|
|
360
|
-
allow update: if request.resource.data.moveType ==
|
|
361
|
-
|
|
362
|
-
|
|
407
|
+
allow update: if request.resource.data.moveType == 'capture'
|
|
408
|
+
&& request.resource.data.capturedPiece != '' && request.resource.data.status == 'playing'
|
|
409
|
+
&& baseMoveChecks() && validPieceMove() && captureValid() && pieceMovedCorrectly() && myKingSafe();
|
|
363
410
|
// Castling kingside
|
|
364
|
-
allow update: if request.resource.data.moveType ==
|
|
365
|
-
|
|
366
|
-
|
|
411
|
+
allow update: if request.resource.data.moveType == 'castle_k'
|
|
412
|
+
&& request.resource.data.status == 'playing'
|
|
413
|
+
&& baseMoveChecks() && validCastleKingside() && myKingSafe();
|
|
367
414
|
// Castling queenside
|
|
368
|
-
allow update: if request.resource.data.moveType ==
|
|
369
|
-
|
|
370
|
-
|
|
415
|
+
allow update: if request.resource.data.moveType == 'castle_q'
|
|
416
|
+
&& request.resource.data.status == 'playing'
|
|
417
|
+
&& baseMoveChecks() && validCastleQueenside() && myKingSafe();
|
|
371
418
|
// Draw
|
|
372
|
-
allow update: if request.resource.data.moveType ==
|
|
373
|
-
|
|
374
|
-
|
|
419
|
+
allow update: if request.resource.data.moveType == 'draw'
|
|
420
|
+
&& request.resource.data.status == 'draw'
|
|
421
|
+
&& resource.data.status == 'playing' && isMyTurn();
|
|
375
422
|
// Resign
|
|
376
|
-
allow update: if request.resource.data.moveType ==
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
423
|
+
allow update: if request.resource.data.moveType == 'resign'
|
|
424
|
+
&& request.resource.data.status == 'resigned'
|
|
425
|
+
&& resource.data.status == 'playing'
|
|
426
|
+
&& request.auth != null
|
|
427
|
+
&& (request.auth.uid == resource.data.host || request.auth.uid == resource.data.guest);
|
|
381
428
|
}
|
|
382
429
|
}
|
|
383
430
|
}
|
|
384
|
-
|
|
431
|
+
"> <div class="source-toolbar"> <strong>Security Rules</strong> <button type="button" class="copy-source">Copy source</button> </div> <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#E06C75">rules_version</span><span style="color:#56B6C2"> =</span><span style="color:#98C379"> '2+modules'</span><span style="color:#ABB2BF">;</span></span>
|
|
432
|
+
<span class="line"></span>
|
|
433
|
+
<span class="line"><span style="color:#C678DD">import</span><span style="color:#ABB2BF"> { </span><span style="color:#E06C75">isAuthenticated</span><span style="color:#ABB2BF"> } </span><span style="color:#C678DD">from</span><span style="color:#98C379"> 'auth'</span><span style="color:#ABB2BF">;</span></span>
|
|
434
|
+
<span class="line"><span style="color:#C678DD">import</span><span style="color:#ABB2BF"> { </span><span style="color:#E06C75">validSimpleMove</span><span style="color:#ABB2BF"> } </span><span style="color:#C678DD">from</span><span style="color:#98C379"> 'geometry'</span><span style="color:#ABB2BF">;</span></span>
|
|
435
|
+
<span class="line"><span style="color:#C678DD">import</span><span style="color:#ABB2BF"> { </span><span style="color:#E06C75">isPlaying</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75">moveIncremented</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75">participantsUnchanged</span><span style="color:#ABB2BF"> } </span><span style="color:#C678DD">from</span><span style="color:#98C379"> 'state'</span><span style="color:#ABB2BF">;</span></span>
|
|
436
|
+
<span class="line"><span style="color:#C678DD">import</span><span style="color:#ABB2BF"> { </span><span style="color:#E06C75">isMyTurn</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75">turnFlipped</span><span style="color:#ABB2BF"> } </span><span style="color:#C678DD">from</span><span style="color:#98C379"> 'turns'</span><span style="color:#ABB2BF">;</span></span>
|
|
437
|
+
<span class="line"></span>
|
|
438
|
+
<span class="line"><span style="color:#E06C75">service</span><span style="color:#E5C07B"> cloud</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">firestore</span><span style="color:#ABB2BF"> {</span></span>
|
|
439
|
+
<span class="line"><span style="color:#E06C75"> match</span><span style="color:#56B6C2"> /</span><span style="color:#E06C75">databases</span><span style="color:#56B6C2">/</span><span style="color:#ABB2BF">{</span><span style="color:#E06C75">database</span><span style="color:#ABB2BF">}</span><span style="color:#56B6C2">/</span><span style="color:#E06C75">documents</span><span style="color:#ABB2BF"> {</span></span>
|
|
440
|
+
<span class="line"><span style="color:#E06C75"> match</span><span style="color:#56B6C2"> /</span><span style="color:#E06C75">gameConfig</span><span style="color:#56B6C2">/</span><span style="color:#ABB2BF">{</span><span style="color:#E06C75">id</span><span style="color:#ABB2BF">} { </span><span style="color:#E06C75">allow</span><span style="color:#E06C75"> read</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#D19A66"> true</span><span style="color:#ABB2BF">; </span><span style="color:#E06C75">allow</span><span style="color:#E06C75"> write</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#D19A66"> false</span><span style="color:#ABB2BF">; }</span></span>
|
|
441
|
+
<span class="line"><span style="color:#E06C75"> match</span><span style="color:#56B6C2"> /</span><span style="color:#E06C75">chess</span><span style="color:#56B6C2">-</span><span style="color:#E06C75">v2</span><span style="color:#56B6C2">/</span><span style="color:#ABB2BF">{</span><span style="color:#E06C75">gameId</span><span style="color:#ABB2BF">} {</span></span>
|
|
442
|
+
<span class="line"></span>
|
|
443
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">() { </span><span style="color:#C678DD">return</span><span style="color:#61AFEF"> get</span><span style="color:#ABB2BF">(</span><span style="color:#56B6C2">/</span><span style="color:#E06C75">databases</span><span style="color:#56B6C2">/</span><span style="color:#61AFEF">$</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">database</span><span style="color:#ABB2BF">)</span><span style="color:#56B6C2">/</span><span style="color:#E06C75">documents</span><span style="color:#56B6C2">/</span><span style="color:#E06C75">gameConfig</span><span style="color:#56B6C2">/</span><span style="color:#E06C75">chessv2</span><span style="color:#ABB2BF">).</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">; }</span></span>
|
|
444
|
+
<span class="line"></span>
|
|
445
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> isOwnPiece</span><span style="color:#ABB2BF">() {</span></span>
|
|
446
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#ABB2BF">];</span></span>
|
|
447
|
+
<span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">currentTurn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span></span>
|
|
448
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'K'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'Q'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'R'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'B'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'N'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span><span style="color:#ABB2BF">))</span></span>
|
|
449
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">currentTurn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'guest'</span></span>
|
|
450
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'k'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'q'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'r'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'b'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'n'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span><span style="color:#ABB2BF">));</span></span>
|
|
451
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
452
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() {</span></span>
|
|
453
|
+
<span class="line"><span style="color:#C678DD"> return</span><span style="color:#61AFEF"> isAuthenticated</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> isPlaying</span><span style="color:#ABB2BF">()</span></span>
|
|
454
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#61AFEF"> isMyTurn</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> turnFlipped</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> isOwnPiece</span><span style="color:#ABB2BF">()</span></span>
|
|
455
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#61AFEF"> moveIncremented</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> participantsUnchanged</span><span style="color:#ABB2BF">();</span></span>
|
|
456
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
457
|
+
<span class="line"></span>
|
|
458
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validPieceMove</span><span style="color:#ABB2BF">() {</span></span>
|
|
459
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mf</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#ABB2BF">;</span></span>
|
|
460
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#ABB2BF">;</span></span>
|
|
461
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">];</span></span>
|
|
462
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> p</span><span style="color:#56B6C2"> =</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">mt</span><span style="color:#ABB2BF">];</span></span>
|
|
463
|
+
<span class="line"><span style="color:#C678DD"> return</span><span style="color:#61AFEF"> validSimpleMove</span><span style="color:#ABB2BF">(</span><span style="color:#61AFEF">cfg</span><span style="color:#ABB2BF">())</span></span>
|
|
464
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#61AFEF">cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">pieceCategory</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">piece</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> 'jump'</span></span>
|
|
465
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> ((</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
466
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
467
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
468
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
469
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
470
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 6</span><span style="color:#56B6C2"> ||</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c5</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)));</span></span>
|
|
471
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
472
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validPawnForward</span><span style="color:#ABB2BF">() {</span></span>
|
|
473
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mf</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#ABB2BF">;</span></span>
|
|
474
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#ABB2BF">;</span></span>
|
|
475
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">];</span></span>
|
|
476
|
+
<span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span><span style="color:#ABB2BF">) </span><span style="color:#56B6C2">&&</span><span style="color:#E06C75"> mt</span><span style="color:#C678DD"> in</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">pawnForward</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">piece</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">&&</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mt</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">;</span></span>
|
|
477
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
478
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validPawnDouble</span><span style="color:#ABB2BF">() {</span></span>
|
|
479
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mf</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#ABB2BF">;</span></span>
|
|
480
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#ABB2BF">;</span></span>
|
|
481
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">];</span></span>
|
|
482
|
+
<span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span><span style="color:#ABB2BF">)</span></span>
|
|
483
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> mf</span><span style="color:#C678DD"> in</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">pawnDouble</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">piece</span><span style="color:#ABB2BF">]</span></span>
|
|
484
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">pawnDouble</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">piece</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">to</span><span style="color:#56B6C2"> ==</span><span style="color:#E06C75"> mt</span></span>
|
|
485
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mt</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span></span>
|
|
486
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#61AFEF">cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">pawnDouble</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">piece</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">between</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">;</span></span>
|
|
487
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
488
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validPawnCapture</span><span style="color:#ABB2BF">() {</span></span>
|
|
489
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mf</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#ABB2BF">;</span></span>
|
|
490
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#ABB2BF">;</span></span>
|
|
491
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">];</span></span>
|
|
492
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mt</span><span style="color:#ABB2BF">];</span></span>
|
|
493
|
+
<span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span><span style="color:#ABB2BF">)</span></span>
|
|
494
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> mt</span><span style="color:#C678DD"> in</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">piece</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">]</span></span>
|
|
495
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span></span>
|
|
496
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> ((</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'k'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'q'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'r'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'b'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'n'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span><span style="color:#ABB2BF">))</span></span>
|
|
497
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'K'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'Q'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'R'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'B'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'N'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span><span style="color:#ABB2BF">)));</span></span>
|
|
498
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
499
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validPromotion</span><span style="color:#ABB2BF">() {</span></span>
|
|
500
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#ABB2BF">;</span></span>
|
|
501
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#ABB2BF">];</span></span>
|
|
502
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> pt</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">promotedTo</span><span style="color:#ABB2BF">;</span></span>
|
|
503
|
+
<span class="line"><span style="color:#C678DD"> return</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'promotion'</span></span>
|
|
504
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> ((</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> >=</span><span style="color:#98C379"> 'a8'</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> <=</span><span style="color:#98C379"> 'h8'</span><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">pt</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'Q'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> pt</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'R'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> pt</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'B'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> pt</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'N'</span><span style="color:#ABB2BF">))</span></span>
|
|
505
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> >=</span><span style="color:#98C379"> 'a1'</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> <=</span><span style="color:#98C379"> 'h1'</span><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">pt</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'q'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> pt</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'r'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> pt</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'b'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> pt</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'n'</span><span style="color:#ABB2BF">)));</span></span>
|
|
506
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
507
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() {</span></span>
|
|
508
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mf</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#ABB2BF">;</span></span>
|
|
509
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#ABB2BF">;</span></span>
|
|
510
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">];</span></span>
|
|
511
|
+
<span class="line"><span style="color:#C678DD"> return</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span></span>
|
|
512
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> 'promotion'</span></span>
|
|
513
|
+
<span class="line"><span style="color:#C678DD"> ?</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mt</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#E06C75"> piece</span></span>
|
|
514
|
+
<span class="line"><span style="color:#C678DD"> :</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mt</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">promotedTo</span><span style="color:#ABB2BF">)</span></span>
|
|
515
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">movedPiece</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#E06C75"> mf</span></span>
|
|
516
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">movedPiece</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#E06C75"> mt</span><span style="color:#ABB2BF">;</span></span>
|
|
517
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
518
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> captureValid</span><span style="color:#ABB2BF">() {</span></span>
|
|
519
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> cp</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">capturedPiece</span><span style="color:#ABB2BF">;</span></span>
|
|
520
|
+
<span class="line"><span style="color:#C678DD"> return</span><span style="color:#E06C75"> cp</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span></span>
|
|
521
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">cp</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span></span>
|
|
522
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">cp</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">;</span></span>
|
|
523
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
524
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validEnPassant</span><span style="color:#ABB2BF">() {</span></span>
|
|
525
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mf</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#ABB2BF">;</span></span>
|
|
526
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#ABB2BF">;</span></span>
|
|
527
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">];</span></span>
|
|
528
|
+
<span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span><span style="color:#ABB2BF">)</span></span>
|
|
529
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> mt</span><span style="color:#C678DD"> in</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">piece</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">]</span></span>
|
|
530
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mt</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span></span>
|
|
531
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">lastDoublePawn</span><span style="color:#56B6C2"> ==</span><span style="color:#E06C75"> mt</span><span style="color:#ABB2BF">;</span></span>
|
|
532
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
533
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validCastleKingside</span><span style="color:#ABB2BF">() {</span></span>
|
|
534
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> turn</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">currentTurn</span><span style="color:#ABB2BF">;</span></span>
|
|
535
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> c</span><span style="color:#56B6C2"> =</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">castling</span><span style="color:#ABB2BF">;</span></span>
|
|
536
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> castle</span><span style="color:#56B6C2"> =</span><span style="color:#E06C75"> turn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span><span style="color:#C678DD"> ?</span><span style="color:#E5C07B"> c</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">wk</span><span style="color:#C678DD"> :</span><span style="color:#E5C07B"> c</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">bk</span><span style="color:#ABB2BF">;</span></span>
|
|
537
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> kingMoved</span><span style="color:#56B6C2"> =</span><span style="color:#E06C75"> turn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span><span style="color:#C678DD"> ?</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_K_moved</span><span style="color:#C678DD"> :</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_k_moved</span><span style="color:#ABB2BF">;</span></span>
|
|
538
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> rookMoved</span><span style="color:#56B6C2"> =</span><span style="color:#E06C75"> turn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span><span style="color:#C678DD"> ?</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2_moved</span><span style="color:#C678DD"> :</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2_moved</span><span style="color:#ABB2BF">;</span></span>
|
|
539
|
+
<span class="line"><span style="color:#C678DD"> return</span><span style="color:#56B6C2"> !</span><span style="color:#E06C75">kingMoved</span><span style="color:#56B6C2"> &&</span><span style="color:#56B6C2"> !</span><span style="color:#E06C75">rookMoved</span></span>
|
|
540
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">kingFrom</span></span>
|
|
541
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">kingTo</span></span>
|
|
542
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">between</span><span style="color:#ABB2BF">[</span><span style="color:#D19A66">0</span><span style="color:#ABB2BF">]] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span></span>
|
|
543
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">between</span><span style="color:#ABB2BF">[</span><span style="color:#D19A66">1</span><span style="color:#ABB2BF">]] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">;</span></span>
|
|
544
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
545
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validCastleQueenside</span><span style="color:#ABB2BF">() {</span></span>
|
|
546
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> turn</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">currentTurn</span><span style="color:#ABB2BF">;</span></span>
|
|
547
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> c</span><span style="color:#56B6C2"> =</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">castling</span><span style="color:#ABB2BF">;</span></span>
|
|
548
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> castle</span><span style="color:#56B6C2"> =</span><span style="color:#E06C75"> turn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span><span style="color:#C678DD"> ?</span><span style="color:#E5C07B"> c</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">wq</span><span style="color:#C678DD"> :</span><span style="color:#E5C07B"> c</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">bq</span><span style="color:#ABB2BF">;</span></span>
|
|
549
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> kingMoved</span><span style="color:#56B6C2"> =</span><span style="color:#E06C75"> turn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span><span style="color:#C678DD"> ?</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_K_moved</span><span style="color:#C678DD"> :</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_k_moved</span><span style="color:#ABB2BF">;</span></span>
|
|
550
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> rookMoved</span><span style="color:#56B6C2"> =</span><span style="color:#E06C75"> turn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span><span style="color:#C678DD"> ?</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1_moved</span><span style="color:#C678DD"> :</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1_moved</span><span style="color:#ABB2BF">;</span></span>
|
|
551
|
+
<span class="line"><span style="color:#C678DD"> return</span><span style="color:#56B6C2"> !</span><span style="color:#E06C75">kingMoved</span><span style="color:#56B6C2"> &&</span><span style="color:#56B6C2"> !</span><span style="color:#E06C75">rookMoved</span></span>
|
|
552
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">kingFrom</span></span>
|
|
553
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">kingTo</span></span>
|
|
554
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">between</span><span style="color:#ABB2BF">[</span><span style="color:#D19A66">0</span><span style="color:#ABB2BF">]] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span></span>
|
|
555
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">between</span><span style="color:#ABB2BF">[</span><span style="color:#D19A66">1</span><span style="color:#ABB2BF">]] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span></span>
|
|
556
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">between</span><span style="color:#ABB2BF">[</span><span style="color:#D19A66">2</span><span style="color:#ABB2BF">]] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">;</span></span>
|
|
557
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
558
|
+
<span class="line"></span>
|
|
559
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> hPC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">cfg</span><span style="color:#ABB2BF">) {</span></span>
|
|
560
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> b</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">;</span></span>
|
|
561
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> ks</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_K</span><span style="color:#ABB2BF">;</span></span>
|
|
562
|
+
<span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p1</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p1</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p1</span><span style="color:#ABB2BF">])</span></span>
|
|
563
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p2</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p2</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p2</span><span style="color:#ABB2BF">])</span></span>
|
|
564
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p3</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p3</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p3</span><span style="color:#ABB2BF">])</span></span>
|
|
565
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p4</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p4</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p4</span><span style="color:#ABB2BF">])</span></span>
|
|
566
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p5</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p5</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p5</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p5</span><span style="color:#ABB2BF">])</span></span>
|
|
567
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p6</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p6</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p6</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p6</span><span style="color:#ABB2BF">])</span></span>
|
|
568
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p7</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p7</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p7</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p7</span><span style="color:#ABB2BF">])</span></span>
|
|
569
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p8</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p8</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p8</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p8</span><span style="color:#ABB2BF">]);</span></span>
|
|
570
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
571
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> hMC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">cfg</span><span style="color:#ABB2BF">) {</span></span>
|
|
572
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> b</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">;</span></span>
|
|
573
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> ks</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_K</span><span style="color:#ABB2BF">;</span></span>
|
|
574
|
+
<span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_n1</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_n1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_n1</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_n1</span><span style="color:#ABB2BF">])</span></span>
|
|
575
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_n2</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_n2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_n2</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_n2</span><span style="color:#ABB2BF">])</span></span>
|
|
576
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_k</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_k</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_k</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_k</span><span style="color:#ABB2BF">]);</span></span>
|
|
577
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
578
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> hSC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">cfg</span><span style="color:#ABB2BF">) {</span></span>
|
|
579
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> b</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">;</span></span>
|
|
580
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> ks</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_K</span><span style="color:#ABB2BF">;</span></span>
|
|
581
|
+
<span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">]</span></span>
|
|
582
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
583
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
584
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
585
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
586
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">))</span></span>
|
|
587
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">]</span></span>
|
|
588
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
589
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
590
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
591
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
592
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">))</span></span>
|
|
593
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">]</span></span>
|
|
594
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
595
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
596
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
597
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
598
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">))</span></span>
|
|
599
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">]</span></span>
|
|
600
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
601
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
602
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
603
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
604
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">))</span></span>
|
|
605
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">]</span></span>
|
|
606
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
607
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
608
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
609
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
610
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">));</span></span>
|
|
611
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
612
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> gPC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">cfg</span><span style="color:#ABB2BF">) {</span></span>
|
|
613
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> b</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">;</span></span>
|
|
614
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> ks</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_k</span><span style="color:#ABB2BF">;</span></span>
|
|
615
|
+
<span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P1</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P1</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P1</span><span style="color:#ABB2BF">])</span></span>
|
|
616
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P2</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P2</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P2</span><span style="color:#ABB2BF">])</span></span>
|
|
617
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P3</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P3</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P3</span><span style="color:#ABB2BF">])</span></span>
|
|
618
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P4</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P4</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P4</span><span style="color:#ABB2BF">])</span></span>
|
|
619
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P5</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P5</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P5</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P5</span><span style="color:#ABB2BF">])</span></span>
|
|
620
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P6</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P6</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P6</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P6</span><span style="color:#ABB2BF">])</span></span>
|
|
621
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P7</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P7</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P7</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P7</span><span style="color:#ABB2BF">])</span></span>
|
|
622
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P8</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P8</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P8</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P8</span><span style="color:#ABB2BF">]);</span></span>
|
|
623
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
624
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> gMC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">cfg</span><span style="color:#ABB2BF">) {</span></span>
|
|
625
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> b</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">;</span></span>
|
|
626
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> ks</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_k</span><span style="color:#ABB2BF">;</span></span>
|
|
627
|
+
<span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_N1</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_N1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_N1</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_N1</span><span style="color:#ABB2BF">])</span></span>
|
|
628
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_N2</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_N2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_N2</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_N2</span><span style="color:#ABB2BF">])</span></span>
|
|
629
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_K</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_K</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_K</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_K</span><span style="color:#ABB2BF">]);</span></span>
|
|
630
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
631
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> gSC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">cfg</span><span style="color:#ABB2BF">) {</span></span>
|
|
632
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> b</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">;</span></span>
|
|
633
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> ks</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_k</span><span style="color:#ABB2BF">;</span></span>
|
|
634
|
+
<span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">]</span></span>
|
|
635
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
636
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
637
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
638
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
639
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">))</span></span>
|
|
640
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">]</span></span>
|
|
641
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
642
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
643
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
644
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
645
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">))</span></span>
|
|
646
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">]</span></span>
|
|
647
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
648
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
649
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
650
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
651
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">))</span></span>
|
|
652
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">]</span></span>
|
|
653
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
654
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
655
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
656
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
657
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">))</span></span>
|
|
658
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">!=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">]</span></span>
|
|
659
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
660
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
661
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
662
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
|
|
663
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> <</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">));</span></span>
|
|
664
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
665
|
+
<span class="line"></span>
|
|
666
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">() {</span></span>
|
|
667
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> c</span><span style="color:#56B6C2"> =</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">();</span></span>
|
|
668
|
+
<span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">currentTurn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span><span style="color:#56B6C2"> &&</span><span style="color:#56B6C2"> !</span><span style="color:#61AFEF">hPC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">) </span><span style="color:#56B6C2">&&</span><span style="color:#56B6C2"> !</span><span style="color:#61AFEF">hMC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">) </span><span style="color:#56B6C2">&&</span><span style="color:#56B6C2"> !</span><span style="color:#61AFEF">hSC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">))</span></span>
|
|
669
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">currentTurn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'guest'</span><span style="color:#56B6C2"> &&</span><span style="color:#56B6C2"> !</span><span style="color:#61AFEF">gPC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">) </span><span style="color:#56B6C2">&&</span><span style="color:#56B6C2"> !</span><span style="color:#61AFEF">gMC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">) </span><span style="color:#56B6C2">&&</span><span style="color:#56B6C2"> !</span><span style="color:#61AFEF">gSC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">));</span></span>
|
|
670
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
671
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> opponentInCheck</span><span style="color:#ABB2BF">() {</span></span>
|
|
672
|
+
<span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> c</span><span style="color:#56B6C2"> =</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">();</span></span>
|
|
673
|
+
<span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">currentTurn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#61AFEF">gPC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">) </span><span style="color:#56B6C2">||</span><span style="color:#61AFEF"> gMC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">) </span><span style="color:#56B6C2">||</span><span style="color:#61AFEF"> gSC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">)))</span></span>
|
|
674
|
+
<span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">currentTurn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'guest'</span><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#61AFEF">hPC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">) </span><span style="color:#56B6C2">||</span><span style="color:#61AFEF"> hMC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">) </span><span style="color:#56B6C2">||</span><span style="color:#61AFEF"> hSC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">)));</span></span>
|
|
675
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
676
|
+
<span class="line"></span>
|
|
677
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // ═══ Lobby ═══</span></span>
|
|
678
|
+
<span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> read</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">auth</span><span style="color:#56B6C2"> !=</span><span style="color:#D19A66"> null</span><span style="color:#ABB2BF">;</span></span>
|
|
679
|
+
<span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> create</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">auth</span><span style="color:#56B6C2"> !=</span><span style="color:#D19A66"> null</span></span>
|
|
680
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">host</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">auth</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">uid</span></span>
|
|
681
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'waiting'</span></span>
|
|
682
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">a1</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'R'</span></span>
|
|
683
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">a2</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span></span>
|
|
684
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">a7</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span></span>
|
|
685
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">a8</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'r'</span></span>
|
|
686
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">b1</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'N'</span></span>
|
|
687
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">b2</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span></span>
|
|
688
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">b7</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span></span>
|
|
689
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">b8</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'n'</span></span>
|
|
690
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c1</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'B'</span></span>
|
|
691
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c2</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span></span>
|
|
692
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c7</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span></span>
|
|
693
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c8</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'b'</span></span>
|
|
694
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">d1</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'Q'</span></span>
|
|
695
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">d2</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span></span>
|
|
696
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">d7</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span></span>
|
|
697
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">d8</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'q'</span></span>
|
|
698
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">e1</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'K'</span></span>
|
|
699
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">e2</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span></span>
|
|
700
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">e7</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span></span>
|
|
701
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">e8</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'k'</span></span>
|
|
702
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">f1</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'B'</span></span>
|
|
703
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">f2</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span></span>
|
|
704
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">f7</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span></span>
|
|
705
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">f8</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'b'</span></span>
|
|
706
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">g1</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'N'</span></span>
|
|
707
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">g2</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span></span>
|
|
708
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">g7</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span></span>
|
|
709
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">g8</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'n'</span></span>
|
|
710
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">h1</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'R'</span></span>
|
|
711
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">h2</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span></span>
|
|
712
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">h7</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span></span>
|
|
713
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">h8</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'r'</span><span style="color:#ABB2BF">;</span></span>
|
|
714
|
+
<span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">auth</span><span style="color:#56B6C2"> !=</span><span style="color:#D19A66"> null</span></span>
|
|
715
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'waiting'</span></span>
|
|
716
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">guest</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> ''</span></span>
|
|
717
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">guest</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">auth</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">uid</span></span>
|
|
718
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">auth</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">uid</span><span style="color:#56B6C2"> !=</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">host</span></span>
|
|
719
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
|
|
720
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#61AFEF">diff</span><span style="color:#ABB2BF">(</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">).</span><span style="color:#61AFEF">affectedKeys</span><span style="color:#ABB2BF">().</span><span style="color:#61AFEF">hasOnly</span><span style="color:#ABB2BF">([</span><span style="color:#98C379">'guest'</span><span style="color:#ABB2BF">, </span><span style="color:#98C379">'status'</span><span style="color:#ABB2BF">]);</span></span>
|
|
721
|
+
<span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> delete</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">auth</span><span style="color:#56B6C2"> !=</span><span style="color:#D19A66"> null</span></span>
|
|
722
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'waiting'</span></span>
|
|
723
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">auth</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">uid</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">host</span><span style="color:#ABB2BF">;</span></span>
|
|
724
|
+
<span class="line"></span>
|
|
725
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // ═══ UNIQUE moveType gates — each rule category has its own ═══</span></span>
|
|
726
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // Pawn forward</span></span>
|
|
727
|
+
<span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'pawn_forward'</span></span>
|
|
728
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">capturedPiece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
|
|
729
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> validPawnForward</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">promotedTo</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> ''</span></span>
|
|
730
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
|
|
731
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // Pawn capture</span></span>
|
|
732
|
+
<span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'pawn_capture'</span></span>
|
|
733
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">capturedPiece</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
|
|
734
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> validPawnCapture</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">promotedTo</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> ''</span></span>
|
|
735
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#61AFEF"> captureValid</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
|
|
736
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // Pawn double</span></span>
|
|
737
|
+
<span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'double_pawn'</span></span>
|
|
738
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">capturedPiece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
|
|
739
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> validPawnDouble</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
|
|
740
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // Promotion (forward)</span></span>
|
|
741
|
+
<span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'promotion'</span></span>
|
|
742
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">capturedPiece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
|
|
743
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> validPawnForward</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> validPromotion</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
|
|
744
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // Promotion (capture)</span></span>
|
|
745
|
+
<span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'promotion_capture'</span></span>
|
|
746
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">capturedPiece</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
|
|
747
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> validPawnCapture</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> validPromotion</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> captureValid</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
|
|
748
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // En passant</span></span>
|
|
749
|
+
<span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'en_passant'</span></span>
|
|
750
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
|
|
751
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> validEnPassant</span><span style="color:#ABB2BF">()</span></span>
|
|
752
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">capturedPiece</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">capturedPiece</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span></span>
|
|
753
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
|
|
754
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // Standard piece move (non-pawn)</span></span>
|
|
755
|
+
<span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'normal'</span></span>
|
|
756
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">capturedPiece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
|
|
757
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> validPieceMove</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span></span>
|
|
758
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
|
|
759
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // Standard piece capture</span></span>
|
|
760
|
+
<span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'capture'</span></span>
|
|
761
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">capturedPiece</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
|
|
762
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> validPieceMove</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> captureValid</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
|
|
763
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // Castling kingside</span></span>
|
|
764
|
+
<span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'castle_k'</span></span>
|
|
765
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
|
|
766
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> validCastleKingside</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
|
|
767
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // Castling queenside</span></span>
|
|
768
|
+
<span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'castle_q'</span></span>
|
|
769
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
|
|
770
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> validCastleQueenside</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&&</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
|
|
771
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // Draw</span></span>
|
|
772
|
+
<span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'draw'</span></span>
|
|
773
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'draw'</span></span>
|
|
774
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span><span style="color:#56B6C2"> &&</span><span style="color:#61AFEF"> isMyTurn</span><span style="color:#ABB2BF">();</span></span>
|
|
775
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // Resign</span></span>
|
|
776
|
+
<span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'resign'</span></span>
|
|
777
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'resigned'</span></span>
|
|
778
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
|
|
779
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">auth</span><span style="color:#56B6C2"> !=</span><span style="color:#D19A66"> null</span></span>
|
|
780
|
+
<span class="line"><span style="color:#56B6C2"> &&</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">auth</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">uid</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">host</span><span style="color:#56B6C2"> ||</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">auth</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">uid</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">guest</span><span style="color:#ABB2BF">);</span></span>
|
|
781
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
782
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
783
|
+
<span class="line"><span style="color:#ABB2BF">}</span></span></code></pre> </section> <script type="module">document.querySelectorAll(".source-explorer").forEach(e=>{const t=e.querySelector(".copy-source");!t||t.dataset.copyInstalled==="true"||(t.dataset.copyInstalled="true",t.addEventListener("click",async()=>{await navigator.clipboard.writeText(e.dataset.source??""),t.textContent="Copied",window.setTimeout(()=>{t.textContent="Copy source"},1500)}))});</script> </section> </div> </main> <aside class="doc-toc" aria-label="On this page" data-astro-cid-mw7aashj> <h2 class="doc-toc-heading" data-astro-cid-mw7aashj>On this page</h2> <ul data-astro-cid-mw7aashj> <li data-depth="2" data-astro-cid-mw7aashj> <a href="#try-the-board" data-astro-cid-mw7aashj>Try the board</a> </li><li data-depth="2" data-astro-cid-mw7aashj> <a href="#a-move-is-a-firestore-write" data-astro-cid-mw7aashj>A move is a Firestore write</a> </li><li data-depth="2" data-astro-cid-mw7aashj> <a href="#why-the-rules-look-like-this" data-astro-cid-mw7aashj>Why the Rules look like this</a> </li><li data-depth="2" data-astro-cid-mw7aashj> <a href="#look-up-the-available-helpers" data-astro-cid-mw7aashj>Look up the available helpers</a> </li><li data-depth="2" data-astro-cid-mw7aashj> <a href="#route-each-move-to-one-branch" data-astro-cid-mw7aashj>Route each move to one branch</a> </li><li data-depth="2" data-astro-cid-mw7aashj> <a href="#derive-checkmate-from-the-board" data-astro-cid-mw7aashj>Derive checkmate from the board</a> </li><li data-depth="2" data-astro-cid-mw7aashj> <a href="#test-specific-moves" data-astro-cid-mw7aashj>Test specific moves</a> </li> </ul> </aside> </div> <script type="module">const a=document.querySelector("[data-api-symbol-filter]"),d=[...document.querySelectorAll("[data-api-symbol-group]")],n=document.querySelector("[data-api-symbol-empty]");a?.addEventListener("input",()=>{const t=a.value.trim().toLowerCase();let o=0;for(const i of d){let e=0;i.querySelectorAll("[data-api-symbol]").forEach(l=>{const r=!t||(l.dataset.apiSymbol??"").includes(t);l.hidden=!r,r&&e++}),i.hidden=e===0,o+=e}n&&(n.hidden=o>0)});</script> <script type="module">const s=new Map;document.querySelectorAll('.doc-toc a[href^="#"]').forEach(t=>s.set(decodeURIComponent(t.hash.slice(1)),t));if(s.size>0){const t=new Set,n=()=>{let o=null;for(const e of s.keys())if(t.has(e)){o=e;break}s.forEach((e,c)=>e.classList.toggle("active",c===o))},r=new IntersectionObserver(o=>{for(const e of o)e.isIntersecting?t.add(e.target.id):t.delete(e.target.id);n()},{rootMargin:"-72px 0px -60% 0px"});s.forEach((o,e)=>{const c=document.getElementById(e);c&&r.observe(c)})}</script> <script type="module">document.querySelector('.studio__nav [aria-current="page"]')?.scrollIntoView({block:"nearest",inline:"center"});</script> </body></html>
|