@pyric/cli 0.1.0-alpha.18 → 0.1.0-alpha.19
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 +9 -4
- package/README.md.orig +5 -1
- 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 +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +3 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp-proxy.d.ts.map +1 -1
- package/dist/cli/mcp-proxy.js.map +1 -1
- 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/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/serve/rules.d.ts +3 -3
- package/dist/serve/rules.d.ts.map +1 -1
- package/dist/serve/rules.js +13 -5
- package/dist/serve/rules.js.map +1 -1
- package/dist/serve/site-ui/_astro/{RulesCodeEditor.CzwHdCi9.js → RulesCodeEditor.Bl-XMkhD.js} +1 -1
- package/dist/serve/site-ui/_astro/_example_.B9DG9HLJ.css +1 -0
- package/dist/serve/site-ui/_astro/{_slug_.C6QfVOxJ.css → _slug_.CupVK4TM.css} +1 -1
- package/dist/serve/site-ui/_astro/_studio_.CfxiQWkk.css +1 -0
- package/dist/serve/site-ui/_astro/app.Ce3MTLQm.js +1 -0
- package/dist/serve/site-ui/_astro/app.taqzyjD0.js +11 -0
- package/dist/serve/site-ui/_astro/chess-showcase.Dh5D8kqe.js +354 -0
- package/dist/serve/site-ui/_astro/{example-runtime.B0byNQOl.js → example-runtime.CuyAjjiG.js} +2 -26
- package/dist/serve/site-ui/_astro/sandbox-controls.BP4M5f1M.js +1169 -0
- package/dist/serve/site-ui/_astro/seed.CSUkloMi.js +20 -0
- package/dist/serve/site-ui/_astro/writes.C57paAj2.js +99 -0
- package/dist/serve/site-ui/auth/index.html +2 -2
- package/dist/serve/site-ui/docs/_rhythm/index.html +1 -1
- package/dist/serve/site-ui/docs/agent/set-up-your-agent/index.html +29 -4
- package/dist/serve/site-ui/docs/agent/set-up-your-agent.md +8 -5
- package/dist/serve/site-ui/docs/agent/watch-and-review/index.html +1 -1
- package/dist/serve/site-ui/docs/agent/work-with-an-agent/index.html +1 -1
- package/dist/serve/site-ui/docs/ai-compat/index.html +1 -1
- package/dist/serve/site-ui/docs/api-reference/index.html +1 -1
- package/dist/serve/site-ui/docs/app-compat/index.html +1 -1
- package/dist/serve/site-ui/docs/auth-compat/index.html +1 -1
- package/dist/serve/site-ui/docs/build/ai-logic/index.html +1 -1
- package/dist/serve/site-ui/docs/build/authentication/index.html +1 -1
- package/dist/serve/site-ui/docs/build/cloud-firestore/index.html +30 -52
- package/dist/serve/site-ui/docs/build/cloud-firestore.md +40 -36
- package/dist/serve/site-ui/docs/build/cloud-messaging/index.html +1 -1
- package/dist/serve/site-ui/docs/build/cloud-storage/index.html +1 -1
- package/dist/serve/site-ui/docs/build/realtime-database/index.html +1 -1
- package/dist/serve/site-ui/docs/conformance-scores/index.html +1 -1
- package/dist/serve/site-ui/docs/create-pyric-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/database-compat/index.html +1 -1
- package/dist/serve/site-ui/docs/examples/chess/index.html +645 -249
- package/dist/serve/site-ui/docs/examples/chess.md +45 -16
- package/dist/serve/site-ui/docs/examples/index.html +2 -2
- package/dist/serve/site-ui/docs/firestore-compat/index.html +1 -1
- package/dist/serve/site-ui/docs/functions-rtdb-compat/index.html +1 -1
- package/dist/serve/site-ui/docs/get-started/how-the-swap-works/index.html +1 -1
- package/dist/serve/site-ui/docs/get-started/nextjs/index.html +1 -1
- package/dist/serve/site-ui/docs/get-started/start-building/index.html +29 -3
- package/dist/serve/site-ui/docs/get-started/start-building.md +9 -4
- package/dist/serve/site-ui/docs/get-started/vite/index.html +1 -1
- package/dist/serve/site-ui/docs/index.json +23 -18
- package/dist/serve/site-ui/docs/messaging-compat/index.html +1 -1
- package/dist/serve/site-ui/docs/observe/resolve-runtime-status/index.html +1 -1
- package/dist/serve/site-ui/docs/observe/see-whats-happening/index.html +1 -1
- package/dist/serve/site-ui/docs/observe/shape-your-data/index.html +1 -1
- package/dist/serve/site-ui/docs/overview/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-app-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-auth-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-database-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-messaging-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ai-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ai-scripting-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-app-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-auth-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-assurance-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-bridge-client-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-bridge-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-credentials-node-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-discover-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-next-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-register-app-bridge-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-register-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-remote-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-verify-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-database-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-firestore-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-messaging-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-rules-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-sandbox-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-storage-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-auth-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-events-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-events-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-firestore-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-primitives-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-rtdb-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-rules-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-traffic-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/rules-compat/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/audit-your-rules/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/firestore-rules-limits/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/read-a-denial/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/rtdb-rules-in-typescript/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/rules-standard-library/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/secure-it-with-rules/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/simulate-and-lint/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/write-a-rules-test-suite/index.html +1 -1
- package/dist/serve/site-ui/docs/ship/ship-to-production/index.html +1 -1
- package/dist/serve/site-ui/docs/ship/test-in-node/index.html +1 -1
- package/dist/serve/site-ui/docs/storage-compat/index.html +1 -1
- package/dist/serve/site-ui/docs/trust/how-we-know-it-matches-firebase/index.html +1 -1
- package/dist/serve/site-ui/docs/trust/rules-standard-library/index.html +1 -1
- package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research/index.html +1 -1
- package/dist/serve/site-ui/docs/trust/versioning-and-compatibility/index.html +1 -1
- package/dist/serve/site-ui/docs/tutorial/index.html +1 -1
- package/dist/serve/site-ui/examples/chess/index.html +2 -2
- package/dist/serve/site-ui/firestore/index.html +2 -2
- package/dist/serve/site-ui/index.html +2 -2
- package/dist/serve/site-ui/rtdb/index.html +2 -2
- package/dist/serve/site-ui/settings/index.html +2 -2
- package/dist/serve/site-ui/storage/index.html +2 -2
- package/dist/serve/site-ui/traffic/index.html +2 -2
- 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/package.json +4 -4
- package/src/bridge/server/mcp-contract.ts +3 -0
- package/src/cli/index.ts +3 -0
- package/src/cli/mcp-proxy.ts +6 -7
- package/src/cli/rules.ts +31 -4
- package/src/cli/service-command-records/storage-rules-resolve.ts +4 -0
- package/src/cli/service-commands.generated.ts +2 -0
- package/src/serve/rules.ts +15 -5
- package/src/serve/vite-rules-source.ts +29 -7
- package/dist/serve/site-ui/_astro/_example_.jevZ7OdV.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.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/examples/firestore-first-write/index.html +0 -2
|
@@ -1,39 +1,83 @@
|
|
|
1
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/_slug_.CXh9yTP1.css">
|
|
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
|
-
<p>Choose a piece and its destination. <code>e2 → e4</code> is allowed
|
|
4
|
-
<p>Choose a scenario to run a complete sequence through the Rules. Fool’s Mate and Scholar’s Mate end in checkmate
|
|
2
|
+
<link rel="stylesheet" href="/__pyric/ui/_astro/_slug_.CupVK4TM.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 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>
|
|
3
|
+
<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>
|
|
4
|
+
<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
5
|
<h2 id="a-move-is-a-firestore-write">A move is a Firestore write</h2>
|
|
6
6
|
<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
7
|
<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="
|
|
8
|
+
<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>
|
|
9
|
+
<h2 id="why-the-rules-look-like-this">Why the Rules look like this</h2>
|
|
10
|
+
<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>
|
|
11
|
+
<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>
|
|
12
|
+
<h2 id="look-up-the-available-helpers">Look up the available helpers</h2>
|
|
10
13
|
<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
14
|
<span class="line"></span>
|
|
12
15
|
<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
16
|
<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
17
|
<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
18
|
<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
|
-
<
|
|
19
|
+
<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>
|
|
20
|
+
<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>
|
|
21
|
+
<h2 id="route-each-move-to-one-branch">Route each move to one branch</h2>
|
|
22
|
+
<p>Before writing the proposed game document, the board labels each available move from the piece and its destination:</p>
|
|
23
|
+
<div class="table-scroll">
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
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
|
+
<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>
|
|
53
|
+
<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>
|
|
54
|
+
<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
55
|
<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"> &&
|
|
56
|
+
<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>
|
|
57
|
+
<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>
|
|
58
|
+
<span class="line"><span style="color:#ABB2BF"> && baseMoveChecks() && validPieceMove()</span></span>
|
|
59
|
+
<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>
|
|
60
|
+
<span class="line"><span style="color:#ABB2BF"> && pieceMovedCorrectly() && myKingSafe();</span></span>
|
|
22
61
|
<span class="line"></span>
|
|
23
62
|
<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
|
-
<
|
|
63
|
+
<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>
|
|
64
|
+
<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>
|
|
65
|
+
<span class="line"><span style="color:#ABB2BF"> && baseMoveChecks() && validPieceMove()</span></span>
|
|
66
|
+
<span class="line"><span style="color:#ABB2BF"> && captureValid() && pieceMovedCorrectly() && myKingSafe();</span></span></code></pre>
|
|
67
|
+
<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>
|
|
68
|
+
<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>
|
|
69
|
+
<h2 id="derive-checkmate-from-the-board">Derive checkmate from the board</h2>
|
|
27
70
|
<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>
|
|
71
|
+
<p>The write contains the move and the next board state. After it commits, the browser derives checkmate from that board.</p>
|
|
72
|
+
<h2 id="test-specific-moves">Test specific moves</h2>
|
|
73
|
+
<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>
|
|
74
|
+
<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>
|
|
75
|
+
<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
76
|
|
|
33
|
-
import { isAuthenticated } from
|
|
34
|
-
import { validSimpleMove } from
|
|
35
|
-
import { isPlaying, moveIncremented, participantsUnchanged } from
|
|
36
|
-
import { isMyTurn, turnFlipped } from
|
|
77
|
+
import { isAuthenticated } from 'auth';
|
|
78
|
+
import { validSimpleMove } from 'geometry';
|
|
79
|
+
import { isPlaying, moveIncremented, participantsUnchanged } from 'state';
|
|
80
|
+
import { isMyTurn, turnFlipped } from 'turns';
|
|
37
81
|
|
|
38
82
|
service cloud.firestore {
|
|
39
83
|
match /databases/{database}/documents {
|
|
@@ -44,15 +88,15 @@ service cloud.firestore {
|
|
|
44
88
|
|
|
45
89
|
function isOwnPiece() {
|
|
46
90
|
let piece = resource.data[request.resource.data.moveFrom];
|
|
47
|
-
return (resource.data.currentTurn ==
|
|
48
|
-
|
|
49
|
-
|| (resource.data.currentTurn ==
|
|
50
|
-
|
|
91
|
+
return (resource.data.currentTurn == 'host'
|
|
92
|
+
&& (piece == 'K' || piece == 'Q' || piece == 'R' || piece == 'B' || piece == 'N' || piece == 'P'))
|
|
93
|
+
|| (resource.data.currentTurn == 'guest'
|
|
94
|
+
&& (piece == 'k' || piece == 'q' || piece == 'r' || piece == 'b' || piece == 'n' || piece == 'p'));
|
|
51
95
|
}
|
|
52
96
|
function baseMoveChecks() {
|
|
53
|
-
return isAuthenticated()
|
|
54
|
-
|
|
55
|
-
|
|
97
|
+
return isAuthenticated() && isPlaying()
|
|
98
|
+
&& isMyTurn() && turnFlipped() && isOwnPiece()
|
|
99
|
+
&& moveIncremented() && participantsUnchanged();
|
|
56
100
|
}
|
|
57
101
|
|
|
58
102
|
function validPieceMove() {
|
|
@@ -61,324 +105,676 @@ service cloud.firestore {
|
|
|
61
105
|
let piece = resource.data[mf];
|
|
62
106
|
let p = cfg().paths[mf][mt];
|
|
63
107
|
return validSimpleMove(cfg())
|
|
64
|
-
|
|
65
|
-
|| ((p.len
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
108
|
+
&& (cfg().pieceCategory[piece] == 'jump'
|
|
109
|
+
|| ((p.len < 1 || resource.data[p.c0] == '')
|
|
110
|
+
&& (p.len < 2 || resource.data[p.c1] == '')
|
|
111
|
+
&& (p.len < 3 || resource.data[p.c2] == '')
|
|
112
|
+
&& (p.len < 4 || resource.data[p.c3] == '')
|
|
113
|
+
&& (p.len < 5 || resource.data[p.c4] == '')
|
|
114
|
+
&& (p.len < 6 || resource.data[p.c5] == '')));
|
|
71
115
|
}
|
|
72
116
|
function validPawnForward() {
|
|
73
117
|
let mf = request.resource.data.moveFrom;
|
|
74
118
|
let mt = request.resource.data.moveTo;
|
|
75
119
|
let piece = resource.data[mf];
|
|
76
|
-
return (piece ==
|
|
120
|
+
return (piece == 'P' || piece == 'p') && mt in cfg().pawnForward[piece][mf] && resource.data[mt] == '';
|
|
77
121
|
}
|
|
78
122
|
function validPawnDouble() {
|
|
79
123
|
let mf = request.resource.data.moveFrom;
|
|
80
124
|
let mt = request.resource.data.moveTo;
|
|
81
125
|
let piece = resource.data[mf];
|
|
82
|
-
return (piece ==
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
126
|
+
return (piece == 'P' || piece == 'p')
|
|
127
|
+
&& mf in cfg().pawnDouble[piece]
|
|
128
|
+
&& cfg().pawnDouble[piece][mf].to == mt
|
|
129
|
+
&& resource.data[mt] == ''
|
|
130
|
+
&& resource.data[cfg().pawnDouble[piece][mf].between] == '';
|
|
87
131
|
}
|
|
88
132
|
function validPawnCapture() {
|
|
89
133
|
let mf = request.resource.data.moveFrom;
|
|
90
134
|
let mt = request.resource.data.moveTo;
|
|
91
135
|
let piece = resource.data[mf];
|
|
92
136
|
let target = resource.data[mt];
|
|
93
|
-
return (piece ==
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|| (piece ==
|
|
137
|
+
return (piece == 'P' || piece == 'p')
|
|
138
|
+
&& mt in cfg().pawnAttacks[piece][mf]
|
|
139
|
+
&& target != ''
|
|
140
|
+
&& ((piece == 'P' && (target == 'k' || target == 'q' || target == 'r' || target == 'b' || target == 'n' || target == 'p'))
|
|
141
|
+
|| (piece == 'p' && (target == 'K' || target == 'Q' || target == 'R' || target == 'B' || target == 'N' || target == 'P')));
|
|
98
142
|
}
|
|
99
143
|
function validPromotion() {
|
|
100
144
|
let mt = request.resource.data.moveTo;
|
|
101
145
|
let piece = resource.data[request.resource.data.moveFrom];
|
|
102
146
|
let pt = request.resource.data.promotedTo;
|
|
103
|
-
return request.resource.data.moveType ==
|
|
104
|
-
|
|
105
|
-
|| (piece ==
|
|
147
|
+
return request.resource.data.moveType == 'promotion'
|
|
148
|
+
&& ((piece == 'P' && mt >= 'a8' && mt <= 'h8' && (pt == 'Q' || pt == 'R' || pt == 'B' || pt == 'N'))
|
|
149
|
+
|| (piece == 'p' && mt >= 'a1' && mt <= 'h1' && (pt == 'q' || pt == 'r' || pt == 'b' || pt == 'n')));
|
|
106
150
|
}
|
|
107
151
|
function pieceMovedCorrectly() {
|
|
108
152
|
let mf = request.resource.data.moveFrom;
|
|
109
153
|
let mt = request.resource.data.moveTo;
|
|
110
154
|
let piece = resource.data[mf];
|
|
111
|
-
return request.resource.data[mf] ==
|
|
112
|
-
|
|
155
|
+
return request.resource.data[mf] == ''
|
|
156
|
+
&& (request.resource.data.moveType != 'promotion'
|
|
113
157
|
? request.resource.data[mt] == piece
|
|
114
158
|
: request.resource.data[mt] == request.resource.data.promotedTo)
|
|
115
|
-
|
|
116
|
-
|
|
159
|
+
&& resource.data[request.resource.data.movedPiece] == mf
|
|
160
|
+
&& request.resource.data[request.resource.data.movedPiece] == mt;
|
|
117
161
|
}
|
|
118
162
|
function captureValid() {
|
|
119
163
|
let cp = request.resource.data.capturedPiece;
|
|
120
|
-
return cp !=
|
|
121
|
-
|
|
122
|
-
|
|
164
|
+
return cp != ''
|
|
165
|
+
&& resource.data[cp] == request.resource.data.moveTo
|
|
166
|
+
&& request.resource.data[cp] == '';
|
|
123
167
|
}
|
|
124
168
|
function validEnPassant() {
|
|
125
169
|
let mf = request.resource.data.moveFrom;
|
|
126
170
|
let mt = request.resource.data.moveTo;
|
|
127
171
|
let piece = resource.data[mf];
|
|
128
|
-
return (piece ==
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
172
|
+
return (piece == 'P' || piece == 'p')
|
|
173
|
+
&& mt in cfg().pawnAttacks[piece][mf]
|
|
174
|
+
&& resource.data[mt] == ''
|
|
175
|
+
&& resource.data.lastDoublePawn == mt;
|
|
132
176
|
}
|
|
133
177
|
function validCastleKingside() {
|
|
134
178
|
let turn = resource.data.currentTurn;
|
|
135
179
|
let c = cfg().castling;
|
|
136
|
-
let castle = turn ==
|
|
137
|
-
let kingMoved = turn ==
|
|
138
|
-
let rookMoved = turn ==
|
|
139
|
-
return !kingMoved
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
180
|
+
let castle = turn == 'host' ? c.wk : c.bk;
|
|
181
|
+
let kingMoved = turn == 'host' ? resource.data.hp_K_moved : resource.data.gp_k_moved;
|
|
182
|
+
let rookMoved = turn == 'host' ? resource.data.hp_R2_moved : resource.data.gp_r2_moved;
|
|
183
|
+
return !kingMoved && !rookMoved
|
|
184
|
+
&& request.resource.data.moveFrom == castle.kingFrom
|
|
185
|
+
&& request.resource.data.moveTo == castle.kingTo
|
|
186
|
+
&& resource.data[castle.between[0]] == ''
|
|
187
|
+
&& resource.data[castle.between[1]] == '';
|
|
144
188
|
}
|
|
145
189
|
function validCastleQueenside() {
|
|
146
190
|
let turn = resource.data.currentTurn;
|
|
147
191
|
let c = cfg().castling;
|
|
148
|
-
let castle = turn ==
|
|
149
|
-
let kingMoved = turn ==
|
|
150
|
-
let rookMoved = turn ==
|
|
151
|
-
return !kingMoved
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
192
|
+
let castle = turn == 'host' ? c.wq : c.bq;
|
|
193
|
+
let kingMoved = turn == 'host' ? resource.data.hp_K_moved : resource.data.gp_k_moved;
|
|
194
|
+
let rookMoved = turn == 'host' ? resource.data.hp_R1_moved : resource.data.gp_r1_moved;
|
|
195
|
+
return !kingMoved && !rookMoved
|
|
196
|
+
&& request.resource.data.moveFrom == castle.kingFrom
|
|
197
|
+
&& request.resource.data.moveTo == castle.kingTo
|
|
198
|
+
&& resource.data[castle.between[0]] == ''
|
|
199
|
+
&& resource.data[castle.between[1]] == ''
|
|
200
|
+
&& resource.data[castle.between[2]] == '';
|
|
157
201
|
}
|
|
158
202
|
|
|
159
203
|
function hPC(cfg) {
|
|
160
204
|
let b = request.resource.data;
|
|
161
205
|
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 != &#
|
|
206
|
+
return (b.gp_p1 != '' && b[b.gp_p1] != '' && ks in cfg.pawnAttacks[b[b.gp_p1]][b.gp_p1])
|
|
207
|
+
|| (b.gp_p2 != '' && b[b.gp_p2] != '' && ks in cfg.pawnAttacks[b[b.gp_p2]][b.gp_p2])
|
|
208
|
+
|| (b.gp_p3 != '' && b[b.gp_p3] != '' && ks in cfg.pawnAttacks[b[b.gp_p3]][b.gp_p3])
|
|
209
|
+
|| (b.gp_p4 != '' && b[b.gp_p4] != '' && ks in cfg.pawnAttacks[b[b.gp_p4]][b.gp_p4])
|
|
210
|
+
|| (b.gp_p5 != '' && b[b.gp_p5] != '' && ks in cfg.pawnAttacks[b[b.gp_p5]][b.gp_p5])
|
|
211
|
+
|| (b.gp_p6 != '' && b[b.gp_p6] != '' && ks in cfg.pawnAttacks[b[b.gp_p6]][b.gp_p6])
|
|
212
|
+
|| (b.gp_p7 != '' && b[b.gp_p7] != '' && ks in cfg.pawnAttacks[b[b.gp_p7]][b.gp_p7])
|
|
213
|
+
|| (b.gp_p8 != '' && b[b.gp_p8] != '' && ks in cfg.pawnAttacks[b[b.gp_p8]][b.gp_p8]);
|
|
170
214
|
}
|
|
171
215
|
function hMC(cfg) {
|
|
172
216
|
let b = request.resource.data;
|
|
173
217
|
let ks = b.hp_K;
|
|
174
|
-
return (b.gp_n1 != &#
|
|
175
|
-
|| (b.gp_n2 != &#
|
|
176
|
-
|| (b.gp_k != &#
|
|
218
|
+
return (b.gp_n1 != '' && b[b.gp_n1] != '' && ks in cfg.moves[b[b.gp_n1]][b.gp_n1])
|
|
219
|
+
|| (b.gp_n2 != '' && b[b.gp_n2] != '' && ks in cfg.moves[b[b.gp_n2]][b.gp_n2])
|
|
220
|
+
|| (b.gp_k != '' && b[b.gp_k] != '' && ks in cfg.moves[b[b.gp_k]][b.gp_k]);
|
|
177
221
|
}
|
|
178
222
|
function hSC(cfg) {
|
|
179
223
|
let b = request.resource.data;
|
|
180
224
|
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
|
-
|
|
225
|
+
return (b.gp_q != '' && b[b.gp_q] != '' && ks in cfg.moves[b[b.gp_q]][b.gp_q]
|
|
226
|
+
&& (cfg.paths[b.gp_q][ks].len < 1 || b[cfg.paths[b.gp_q][ks].c0] == '')
|
|
227
|
+
&& (cfg.paths[b.gp_q][ks].len < 2 || b[cfg.paths[b.gp_q][ks].c1] == '')
|
|
228
|
+
&& (cfg.paths[b.gp_q][ks].len < 3 || b[cfg.paths[b.gp_q][ks].c2] == '')
|
|
229
|
+
&& (cfg.paths[b.gp_q][ks].len < 4 || b[cfg.paths[b.gp_q][ks].c3] == '')
|
|
230
|
+
&& (cfg.paths[b.gp_q][ks].len < 5 || b[cfg.paths[b.gp_q][ks].c4] == ''))
|
|
231
|
+
|| (b.gp_r1 != '' && b[b.gp_r1] != '' && ks in cfg.moves[b[b.gp_r1]][b.gp_r1]
|
|
232
|
+
&& (cfg.paths[b.gp_r1][ks].len < 1 || b[cfg.paths[b.gp_r1][ks].c0] == '')
|
|
233
|
+
&& (cfg.paths[b.gp_r1][ks].len < 2 || b[cfg.paths[b.gp_r1][ks].c1] == '')
|
|
234
|
+
&& (cfg.paths[b.gp_r1][ks].len < 3 || b[cfg.paths[b.gp_r1][ks].c2] == '')
|
|
235
|
+
&& (cfg.paths[b.gp_r1][ks].len < 4 || b[cfg.paths[b.gp_r1][ks].c3] == '')
|
|
236
|
+
&& (cfg.paths[b.gp_r1][ks].len < 5 || b[cfg.paths[b.gp_r1][ks].c4] == ''))
|
|
237
|
+
|| (b.gp_r2 != '' && b[b.gp_r2] != '' && ks in cfg.moves[b[b.gp_r2]][b.gp_r2]
|
|
238
|
+
&& (cfg.paths[b.gp_r2][ks].len < 1 || b[cfg.paths[b.gp_r2][ks].c0] == '')
|
|
239
|
+
&& (cfg.paths[b.gp_r2][ks].len < 2 || b[cfg.paths[b.gp_r2][ks].c1] == '')
|
|
240
|
+
&& (cfg.paths[b.gp_r2][ks].len < 3 || b[cfg.paths[b.gp_r2][ks].c2] == '')
|
|
241
|
+
&& (cfg.paths[b.gp_r2][ks].len < 4 || b[cfg.paths[b.gp_r2][ks].c3] == '')
|
|
242
|
+
&& (cfg.paths[b.gp_r2][ks].len < 5 || b[cfg.paths[b.gp_r2][ks].c4] == ''))
|
|
243
|
+
|| (b.gp_b1 != '' && b[b.gp_b1] != '' && ks in cfg.moves[b[b.gp_b1]][b.gp_b1]
|
|
244
|
+
&& (cfg.paths[b.gp_b1][ks].len < 1 || b[cfg.paths[b.gp_b1][ks].c0] == '')
|
|
245
|
+
&& (cfg.paths[b.gp_b1][ks].len < 2 || b[cfg.paths[b.gp_b1][ks].c1] == '')
|
|
246
|
+
&& (cfg.paths[b.gp_b1][ks].len < 3 || b[cfg.paths[b.gp_b1][ks].c2] == '')
|
|
247
|
+
&& (cfg.paths[b.gp_b1][ks].len < 4 || b[cfg.paths[b.gp_b1][ks].c3] == '')
|
|
248
|
+
&& (cfg.paths[b.gp_b1][ks].len < 5 || b[cfg.paths[b.gp_b1][ks].c4] == ''))
|
|
249
|
+
|| (b.gp_b2 != '' && b[b.gp_b2] != '' && ks in cfg.moves[b[b.gp_b2]][b.gp_b2]
|
|
250
|
+
&& (cfg.paths[b.gp_b2][ks].len < 1 || b[cfg.paths[b.gp_b2][ks].c0] == '')
|
|
251
|
+
&& (cfg.paths[b.gp_b2][ks].len < 2 || b[cfg.paths[b.gp_b2][ks].c1] == '')
|
|
252
|
+
&& (cfg.paths[b.gp_b2][ks].len < 3 || b[cfg.paths[b.gp_b2][ks].c2] == '')
|
|
253
|
+
&& (cfg.paths[b.gp_b2][ks].len < 4 || b[cfg.paths[b.gp_b2][ks].c3] == '')
|
|
254
|
+
&& (cfg.paths[b.gp_b2][ks].len < 5 || b[cfg.paths[b.gp_b2][ks].c4] == ''));
|
|
211
255
|
}
|
|
212
256
|
function gPC(cfg) {
|
|
213
257
|
let b = request.resource.data;
|
|
214
258
|
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 != &#
|
|
259
|
+
return (b.hp_P1 != '' && b[b.hp_P1] != '' && ks in cfg.pawnAttacks[b[b.hp_P1]][b.hp_P1])
|
|
260
|
+
|| (b.hp_P2 != '' && b[b.hp_P2] != '' && ks in cfg.pawnAttacks[b[b.hp_P2]][b.hp_P2])
|
|
261
|
+
|| (b.hp_P3 != '' && b[b.hp_P3] != '' && ks in cfg.pawnAttacks[b[b.hp_P3]][b.hp_P3])
|
|
262
|
+
|| (b.hp_P4 != '' && b[b.hp_P4] != '' && ks in cfg.pawnAttacks[b[b.hp_P4]][b.hp_P4])
|
|
263
|
+
|| (b.hp_P5 != '' && b[b.hp_P5] != '' && ks in cfg.pawnAttacks[b[b.hp_P5]][b.hp_P5])
|
|
264
|
+
|| (b.hp_P6 != '' && b[b.hp_P6] != '' && ks in cfg.pawnAttacks[b[b.hp_P6]][b.hp_P6])
|
|
265
|
+
|| (b.hp_P7 != '' && b[b.hp_P7] != '' && ks in cfg.pawnAttacks[b[b.hp_P7]][b.hp_P7])
|
|
266
|
+
|| (b.hp_P8 != '' && b[b.hp_P8] != '' && ks in cfg.pawnAttacks[b[b.hp_P8]][b.hp_P8]);
|
|
223
267
|
}
|
|
224
268
|
function gMC(cfg) {
|
|
225
269
|
let b = request.resource.data;
|
|
226
270
|
let ks = b.gp_k;
|
|
227
|
-
return (b.hp_N1 != &#
|
|
228
|
-
|| (b.hp_N2 != &#
|
|
229
|
-
|| (b.hp_K != &#
|
|
271
|
+
return (b.hp_N1 != '' && b[b.hp_N1] != '' && ks in cfg.moves[b[b.hp_N1]][b.hp_N1])
|
|
272
|
+
|| (b.hp_N2 != '' && b[b.hp_N2] != '' && ks in cfg.moves[b[b.hp_N2]][b.hp_N2])
|
|
273
|
+
|| (b.hp_K != '' && b[b.hp_K] != '' && ks in cfg.moves[b[b.hp_K]][b.hp_K]);
|
|
230
274
|
}
|
|
231
275
|
function gSC(cfg) {
|
|
232
276
|
let b = request.resource.data;
|
|
233
277
|
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
|
-
|
|
278
|
+
return (b.hp_Q != '' && b[b.hp_Q] != '' && ks in cfg.moves[b[b.hp_Q]][b.hp_Q]
|
|
279
|
+
&& (cfg.paths[b.hp_Q][ks].len < 1 || b[cfg.paths[b.hp_Q][ks].c0] == '')
|
|
280
|
+
&& (cfg.paths[b.hp_Q][ks].len < 2 || b[cfg.paths[b.hp_Q][ks].c1] == '')
|
|
281
|
+
&& (cfg.paths[b.hp_Q][ks].len < 3 || b[cfg.paths[b.hp_Q][ks].c2] == '')
|
|
282
|
+
&& (cfg.paths[b.hp_Q][ks].len < 4 || b[cfg.paths[b.hp_Q][ks].c3] == '')
|
|
283
|
+
&& (cfg.paths[b.hp_Q][ks].len < 5 || b[cfg.paths[b.hp_Q][ks].c4] == ''))
|
|
284
|
+
|| (b.hp_R1 != '' && b[b.hp_R1] != '' && ks in cfg.moves[b[b.hp_R1]][b.hp_R1]
|
|
285
|
+
&& (cfg.paths[b.hp_R1][ks].len < 1 || b[cfg.paths[b.hp_R1][ks].c0] == '')
|
|
286
|
+
&& (cfg.paths[b.hp_R1][ks].len < 2 || b[cfg.paths[b.hp_R1][ks].c1] == '')
|
|
287
|
+
&& (cfg.paths[b.hp_R1][ks].len < 3 || b[cfg.paths[b.hp_R1][ks].c2] == '')
|
|
288
|
+
&& (cfg.paths[b.hp_R1][ks].len < 4 || b[cfg.paths[b.hp_R1][ks].c3] == '')
|
|
289
|
+
&& (cfg.paths[b.hp_R1][ks].len < 5 || b[cfg.paths[b.hp_R1][ks].c4] == ''))
|
|
290
|
+
|| (b.hp_R2 != '' && b[b.hp_R2] != '' && ks in cfg.moves[b[b.hp_R2]][b.hp_R2]
|
|
291
|
+
&& (cfg.paths[b.hp_R2][ks].len < 1 || b[cfg.paths[b.hp_R2][ks].c0] == '')
|
|
292
|
+
&& (cfg.paths[b.hp_R2][ks].len < 2 || b[cfg.paths[b.hp_R2][ks].c1] == '')
|
|
293
|
+
&& (cfg.paths[b.hp_R2][ks].len < 3 || b[cfg.paths[b.hp_R2][ks].c2] == '')
|
|
294
|
+
&& (cfg.paths[b.hp_R2][ks].len < 4 || b[cfg.paths[b.hp_R2][ks].c3] == '')
|
|
295
|
+
&& (cfg.paths[b.hp_R2][ks].len < 5 || b[cfg.paths[b.hp_R2][ks].c4] == ''))
|
|
296
|
+
|| (b.hp_B1 != '' && b[b.hp_B1] != '' && ks in cfg.moves[b[b.hp_B1]][b.hp_B1]
|
|
297
|
+
&& (cfg.paths[b.hp_B1][ks].len < 1 || b[cfg.paths[b.hp_B1][ks].c0] == '')
|
|
298
|
+
&& (cfg.paths[b.hp_B1][ks].len < 2 || b[cfg.paths[b.hp_B1][ks].c1] == '')
|
|
299
|
+
&& (cfg.paths[b.hp_B1][ks].len < 3 || b[cfg.paths[b.hp_B1][ks].c2] == '')
|
|
300
|
+
&& (cfg.paths[b.hp_B1][ks].len < 4 || b[cfg.paths[b.hp_B1][ks].c3] == '')
|
|
301
|
+
&& (cfg.paths[b.hp_B1][ks].len < 5 || b[cfg.paths[b.hp_B1][ks].c4] == ''))
|
|
302
|
+
|| (b.hp_B2 != '' && b[b.hp_B2] != '' && ks in cfg.moves[b[b.hp_B2]][b.hp_B2]
|
|
303
|
+
&& (cfg.paths[b.hp_B2][ks].len < 1 || b[cfg.paths[b.hp_B2][ks].c0] == '')
|
|
304
|
+
&& (cfg.paths[b.hp_B2][ks].len < 2 || b[cfg.paths[b.hp_B2][ks].c1] == '')
|
|
305
|
+
&& (cfg.paths[b.hp_B2][ks].len < 3 || b[cfg.paths[b.hp_B2][ks].c2] == '')
|
|
306
|
+
&& (cfg.paths[b.hp_B2][ks].len < 4 || b[cfg.paths[b.hp_B2][ks].c3] == '')
|
|
307
|
+
&& (cfg.paths[b.hp_B2][ks].len < 5 || b[cfg.paths[b.hp_B2][ks].c4] == ''));
|
|
264
308
|
}
|
|
265
309
|
|
|
266
310
|
function myKingSafe() {
|
|
267
311
|
let c = cfg();
|
|
268
|
-
return (resource.data.currentTurn ==
|
|
269
|
-
|| (resource.data.currentTurn ==
|
|
312
|
+
return (resource.data.currentTurn == 'host' && !hPC(c) && !hMC(c) && !hSC(c))
|
|
313
|
+
|| (resource.data.currentTurn == 'guest' && !gPC(c) && !gMC(c) && !gSC(c));
|
|
270
314
|
}
|
|
271
315
|
function opponentInCheck() {
|
|
272
316
|
let c = cfg();
|
|
273
|
-
return (resource.data.currentTurn ==
|
|
274
|
-
|| (resource.data.currentTurn ==
|
|
317
|
+
return (resource.data.currentTurn == 'host' && (gPC(c) || gMC(c) || gSC(c)))
|
|
318
|
+
|| (resource.data.currentTurn == 'guest' && (hPC(c) || hMC(c) || hSC(c)));
|
|
275
319
|
}
|
|
276
320
|
|
|
277
321
|
// ═══ Lobby ═══
|
|
278
322
|
allow read: if request.auth != null;
|
|
279
323
|
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
|
-
|
|
324
|
+
&& request.resource.data.host == request.auth.uid
|
|
325
|
+
&& request.resource.data.status == 'waiting'
|
|
326
|
+
&& d.a1 == 'R'
|
|
327
|
+
&& d.a2 == 'P'
|
|
328
|
+
&& d.a7 == 'p'
|
|
329
|
+
&& d.a8 == 'r'
|
|
330
|
+
&& d.b1 == 'N'
|
|
331
|
+
&& d.b2 == 'P'
|
|
332
|
+
&& d.b7 == 'p'
|
|
333
|
+
&& d.b8 == 'n'
|
|
334
|
+
&& d.c1 == 'B'
|
|
335
|
+
&& d.c2 == 'P'
|
|
336
|
+
&& d.c7 == 'p'
|
|
337
|
+
&& d.c8 == 'b'
|
|
338
|
+
&& d.d1 == 'Q'
|
|
339
|
+
&& d.d2 == 'P'
|
|
340
|
+
&& d.d7 == 'p'
|
|
341
|
+
&& d.d8 == 'q'
|
|
342
|
+
&& d.e1 == 'K'
|
|
343
|
+
&& d.e2 == 'P'
|
|
344
|
+
&& d.e7 == 'p'
|
|
345
|
+
&& d.e8 == 'k'
|
|
346
|
+
&& d.f1 == 'B'
|
|
347
|
+
&& d.f2 == 'P'
|
|
348
|
+
&& d.f7 == 'p'
|
|
349
|
+
&& d.f8 == 'b'
|
|
350
|
+
&& d.g1 == 'N'
|
|
351
|
+
&& d.g2 == 'P'
|
|
352
|
+
&& d.g7 == 'p'
|
|
353
|
+
&& d.g8 == 'n'
|
|
354
|
+
&& d.h1 == 'R'
|
|
355
|
+
&& d.h2 == 'P'
|
|
356
|
+
&& d.h7 == 'p'
|
|
357
|
+
&& d.h8 == 'r';
|
|
314
358
|
allow update: if request.auth != null
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
359
|
+
&& resource.data.status == 'waiting'
|
|
360
|
+
&& resource.data.guest == ''
|
|
361
|
+
&& request.resource.data.guest == request.auth.uid
|
|
362
|
+
&& request.auth.uid != resource.data.host
|
|
363
|
+
&& request.resource.data.status == 'playing'
|
|
364
|
+
&& request.resource.data.diff(resource.data).affectedKeys().hasOnly(['guest', 'status']);
|
|
321
365
|
allow delete: if request.auth != null
|
|
322
|
-
|
|
323
|
-
|
|
366
|
+
&& resource.data.status == 'waiting'
|
|
367
|
+
&& request.auth.uid == resource.data.host;
|
|
324
368
|
|
|
325
369
|
// ═══ UNIQUE moveType gates — each rule category has its own ═══
|
|
326
370
|
// Pawn forward
|
|
327
|
-
allow update: if request.resource.data.moveType ==
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
371
|
+
allow update: if request.resource.data.moveType == 'pawn_forward'
|
|
372
|
+
&& request.resource.data.capturedPiece == '' && request.resource.data.status == 'playing'
|
|
373
|
+
&& baseMoveChecks() && validPawnForward() && request.resource.data.promotedTo == ''
|
|
374
|
+
&& pieceMovedCorrectly() && myKingSafe();
|
|
331
375
|
// Pawn capture
|
|
332
|
-
allow update: if request.resource.data.moveType ==
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
376
|
+
allow update: if request.resource.data.moveType == 'pawn_capture'
|
|
377
|
+
&& request.resource.data.capturedPiece != '' && request.resource.data.status == 'playing'
|
|
378
|
+
&& baseMoveChecks() && validPawnCapture() && request.resource.data.promotedTo == ''
|
|
379
|
+
&& captureValid() && pieceMovedCorrectly() && myKingSafe();
|
|
336
380
|
// Pawn double
|
|
337
|
-
allow update: if request.resource.data.moveType ==
|
|
338
|
-
|
|
339
|
-
|
|
381
|
+
allow update: if request.resource.data.moveType == 'double_pawn'
|
|
382
|
+
&& request.resource.data.capturedPiece == '' && request.resource.data.status == 'playing'
|
|
383
|
+
&& baseMoveChecks() && validPawnDouble() && pieceMovedCorrectly() && myKingSafe();
|
|
340
384
|
// Promotion (forward)
|
|
341
|
-
allow update: if request.resource.data.moveType ==
|
|
342
|
-
|
|
343
|
-
|
|
385
|
+
allow update: if request.resource.data.moveType == 'promotion'
|
|
386
|
+
&& request.resource.data.capturedPiece == '' && request.resource.data.status == 'playing'
|
|
387
|
+
&& baseMoveChecks() && validPawnForward() && validPromotion() && pieceMovedCorrectly() && myKingSafe();
|
|
344
388
|
// Promotion (capture)
|
|
345
|
-
allow update: if request.resource.data.moveType ==
|
|
346
|
-
|
|
347
|
-
|
|
389
|
+
allow update: if request.resource.data.moveType == 'promotion_capture'
|
|
390
|
+
&& request.resource.data.capturedPiece != '' && request.resource.data.status == 'playing'
|
|
391
|
+
&& baseMoveChecks() && validPawnCapture() && validPromotion() && captureValid() && pieceMovedCorrectly() && myKingSafe();
|
|
348
392
|
// En passant
|
|
349
|
-
allow update: if request.resource.data.moveType ==
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
393
|
+
allow update: if request.resource.data.moveType == 'en_passant'
|
|
394
|
+
&& request.resource.data.status == 'playing'
|
|
395
|
+
&& baseMoveChecks() && validEnPassant()
|
|
396
|
+
&& request.resource.data.capturedPiece != '' && request.resource.data[request.resource.data.capturedPiece] == ''
|
|
397
|
+
&& pieceMovedCorrectly() && myKingSafe();
|
|
354
398
|
// Standard piece move (non-pawn)
|
|
355
|
-
allow update: if request.resource.data.moveType ==
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
399
|
+
allow update: if request.resource.data.moveType == 'normal'
|
|
400
|
+
&& request.resource.data.capturedPiece == '' && request.resource.data.status == 'playing'
|
|
401
|
+
&& baseMoveChecks() && validPieceMove() && resource.data[request.resource.data.moveTo] == ''
|
|
402
|
+
&& pieceMovedCorrectly() && myKingSafe();
|
|
359
403
|
// Standard piece capture
|
|
360
|
-
allow update: if request.resource.data.moveType ==
|
|
361
|
-
|
|
362
|
-
|
|
404
|
+
allow update: if request.resource.data.moveType == 'capture'
|
|
405
|
+
&& request.resource.data.capturedPiece != '' && request.resource.data.status == 'playing'
|
|
406
|
+
&& baseMoveChecks() && validPieceMove() && captureValid() && pieceMovedCorrectly() && myKingSafe();
|
|
363
407
|
// Castling kingside
|
|
364
|
-
allow update: if request.resource.data.moveType ==
|
|
365
|
-
|
|
366
|
-
|
|
408
|
+
allow update: if request.resource.data.moveType == 'castle_k'
|
|
409
|
+
&& request.resource.data.status == 'playing'
|
|
410
|
+
&& baseMoveChecks() && validCastleKingside() && myKingSafe();
|
|
367
411
|
// Castling queenside
|
|
368
|
-
allow update: if request.resource.data.moveType ==
|
|
369
|
-
|
|
370
|
-
|
|
412
|
+
allow update: if request.resource.data.moveType == 'castle_q'
|
|
413
|
+
&& request.resource.data.status == 'playing'
|
|
414
|
+
&& baseMoveChecks() && validCastleQueenside() && myKingSafe();
|
|
371
415
|
// Draw
|
|
372
|
-
allow update: if request.resource.data.moveType ==
|
|
373
|
-
|
|
374
|
-
|
|
416
|
+
allow update: if request.resource.data.moveType == 'draw'
|
|
417
|
+
&& request.resource.data.status == 'draw'
|
|
418
|
+
&& resource.data.status == 'playing' && isMyTurn();
|
|
375
419
|
// Resign
|
|
376
|
-
allow update: if request.resource.data.moveType ==
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
420
|
+
allow update: if request.resource.data.moveType == 'resign'
|
|
421
|
+
&& request.resource.data.status == 'resigned'
|
|
422
|
+
&& resource.data.status == 'playing'
|
|
423
|
+
&& request.auth != null
|
|
424
|
+
&& (request.auth.uid == resource.data.host || request.auth.uid == resource.data.guest);
|
|
381
425
|
}
|
|
382
426
|
}
|
|
383
427
|
}
|
|
384
|
-
|
|
428
|
+
"> <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>
|
|
429
|
+
<span class="line"></span>
|
|
430
|
+
<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>
|
|
431
|
+
<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>
|
|
432
|
+
<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>
|
|
433
|
+
<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>
|
|
434
|
+
<span class="line"></span>
|
|
435
|
+
<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>
|
|
436
|
+
<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>
|
|
437
|
+
<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>
|
|
438
|
+
<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>
|
|
439
|
+
<span class="line"></span>
|
|
440
|
+
<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>
|
|
441
|
+
<span class="line"></span>
|
|
442
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> isOwnPiece</span><span style="color:#ABB2BF">() {</span></span>
|
|
443
|
+
<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>
|
|
444
|
+
<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>
|
|
445
|
+
<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>
|
|
446
|
+
<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>
|
|
447
|
+
<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>
|
|
448
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
449
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() {</span></span>
|
|
450
|
+
<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>
|
|
451
|
+
<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>
|
|
452
|
+
<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>
|
|
453
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
454
|
+
<span class="line"></span>
|
|
455
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validPieceMove</span><span style="color:#ABB2BF">() {</span></span>
|
|
456
|
+
<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>
|
|
457
|
+
<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>
|
|
458
|
+
<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>
|
|
459
|
+
<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>
|
|
460
|
+
<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>
|
|
461
|
+
<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>
|
|
462
|
+
<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>
|
|
463
|
+
<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>
|
|
464
|
+
<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>
|
|
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"> 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>
|
|
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"> 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>
|
|
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"> 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>
|
|
468
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
469
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validPawnForward</span><span style="color:#ABB2BF">() {</span></span>
|
|
470
|
+
<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>
|
|
471
|
+
<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>
|
|
472
|
+
<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>
|
|
473
|
+
<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>
|
|
474
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
475
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validPawnDouble</span><span style="color:#ABB2BF">() {</span></span>
|
|
476
|
+
<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>
|
|
477
|
+
<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>
|
|
478
|
+
<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>
|
|
479
|
+
<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>
|
|
480
|
+
<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>
|
|
481
|
+
<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>
|
|
482
|
+
<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>
|
|
483
|
+
<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>
|
|
484
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
485
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validPawnCapture</span><span style="color:#ABB2BF">() {</span></span>
|
|
486
|
+
<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>
|
|
487
|
+
<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>
|
|
488
|
+
<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>
|
|
489
|
+
<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>
|
|
490
|
+
<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>
|
|
491
|
+
<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>
|
|
492
|
+
<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>
|
|
493
|
+
<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>
|
|
494
|
+
<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>
|
|
495
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
496
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validPromotion</span><span style="color:#ABB2BF">() {</span></span>
|
|
497
|
+
<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>
|
|
498
|
+
<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>
|
|
499
|
+
<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>
|
|
500
|
+
<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>
|
|
501
|
+
<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>
|
|
502
|
+
<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>
|
|
503
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
504
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() {</span></span>
|
|
505
|
+
<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>
|
|
506
|
+
<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>
|
|
507
|
+
<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>
|
|
508
|
+
<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>
|
|
509
|
+
<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>
|
|
510
|
+
<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>
|
|
511
|
+
<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>
|
|
512
|
+
<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>
|
|
513
|
+
<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>
|
|
514
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
515
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> captureValid</span><span style="color:#ABB2BF">() {</span></span>
|
|
516
|
+
<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>
|
|
517
|
+
<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>
|
|
518
|
+
<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>
|
|
519
|
+
<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>
|
|
520
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
521
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validEnPassant</span><span style="color:#ABB2BF">() {</span></span>
|
|
522
|
+
<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>
|
|
523
|
+
<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>
|
|
524
|
+
<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>
|
|
525
|
+
<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>
|
|
526
|
+
<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>
|
|
527
|
+
<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>
|
|
528
|
+
<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>
|
|
529
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
530
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validCastleKingside</span><span style="color:#ABB2BF">() {</span></span>
|
|
531
|
+
<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>
|
|
532
|
+
<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>
|
|
533
|
+
<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>
|
|
534
|
+
<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>
|
|
535
|
+
<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>
|
|
536
|
+
<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>
|
|
537
|
+
<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>
|
|
538
|
+
<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>
|
|
539
|
+
<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>
|
|
540
|
+
<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>
|
|
541
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
542
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validCastleQueenside</span><span style="color:#ABB2BF">() {</span></span>
|
|
543
|
+
<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>
|
|
544
|
+
<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>
|
|
545
|
+
<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>
|
|
546
|
+
<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>
|
|
547
|
+
<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>
|
|
548
|
+
<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>
|
|
549
|
+
<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>
|
|
550
|
+
<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>
|
|
551
|
+
<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>
|
|
552
|
+
<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>
|
|
553
|
+
<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>
|
|
554
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
555
|
+
<span class="line"></span>
|
|
556
|
+
<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>
|
|
557
|
+
<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>
|
|
558
|
+
<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>
|
|
559
|
+
<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>
|
|
560
|
+
<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>
|
|
561
|
+
<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>
|
|
562
|
+
<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>
|
|
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_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>
|
|
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_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>
|
|
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_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>
|
|
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_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>
|
|
567
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
568
|
+
<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>
|
|
569
|
+
<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>
|
|
570
|
+
<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>
|
|
571
|
+
<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>
|
|
572
|
+
<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>
|
|
573
|
+
<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>
|
|
574
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
575
|
+
<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>
|
|
576
|
+
<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>
|
|
577
|
+
<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>
|
|
578
|
+
<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>
|
|
579
|
+
<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>
|
|
580
|
+
<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>
|
|
581
|
+
<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>
|
|
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"> 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>
|
|
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"> 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>
|
|
584
|
+
<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>
|
|
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_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>
|
|
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_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>
|
|
587
|
+
<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>
|
|
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"> 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>
|
|
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"> 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>
|
|
590
|
+
<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>
|
|
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_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>
|
|
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_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>
|
|
593
|
+
<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>
|
|
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"> 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>
|
|
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"> 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>
|
|
596
|
+
<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>
|
|
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_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>
|
|
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_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>
|
|
599
|
+
<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>
|
|
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"> 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>
|
|
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"> 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>
|
|
602
|
+
<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>
|
|
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_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>
|
|
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_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>
|
|
605
|
+
<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>
|
|
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"> 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>
|
|
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"> 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>
|
|
608
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
609
|
+
<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>
|
|
610
|
+
<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>
|
|
611
|
+
<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>
|
|
612
|
+
<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>
|
|
613
|
+
<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>
|
|
614
|
+
<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>
|
|
615
|
+
<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>
|
|
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_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>
|
|
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_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>
|
|
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_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>
|
|
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_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>
|
|
620
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
621
|
+
<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>
|
|
622
|
+
<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>
|
|
623
|
+
<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>
|
|
624
|
+
<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>
|
|
625
|
+
<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>
|
|
626
|
+
<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>
|
|
627
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
628
|
+
<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>
|
|
629
|
+
<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>
|
|
630
|
+
<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>
|
|
631
|
+
<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>
|
|
632
|
+
<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>
|
|
633
|
+
<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>
|
|
634
|
+
<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>
|
|
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"> 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>
|
|
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"> 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>
|
|
637
|
+
<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>
|
|
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_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>
|
|
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_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>
|
|
640
|
+
<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>
|
|
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"> 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>
|
|
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"> 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>
|
|
643
|
+
<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>
|
|
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_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>
|
|
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_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>
|
|
646
|
+
<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>
|
|
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"> 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>
|
|
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"> 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>
|
|
649
|
+
<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>
|
|
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_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>
|
|
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_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>
|
|
652
|
+
<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>
|
|
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"> 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>
|
|
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"> 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>
|
|
655
|
+
<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>
|
|
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_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>
|
|
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_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>
|
|
658
|
+
<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>
|
|
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"> 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>
|
|
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"> 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>
|
|
661
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
662
|
+
<span class="line"></span>
|
|
663
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">() {</span></span>
|
|
664
|
+
<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>
|
|
665
|
+
<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>
|
|
666
|
+
<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>
|
|
667
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
668
|
+
<span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> opponentInCheck</span><span style="color:#ABB2BF">() {</span></span>
|
|
669
|
+
<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>
|
|
670
|
+
<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>
|
|
671
|
+
<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>
|
|
672
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
673
|
+
<span class="line"></span>
|
|
674
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // ═══ Lobby ═══</span></span>
|
|
675
|
+
<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>
|
|
676
|
+
<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>
|
|
677
|
+
<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>
|
|
678
|
+
<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>
|
|
679
|
+
<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>
|
|
680
|
+
<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>
|
|
681
|
+
<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>
|
|
682
|
+
<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>
|
|
683
|
+
<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>
|
|
684
|
+
<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>
|
|
685
|
+
<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>
|
|
686
|
+
<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>
|
|
687
|
+
<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>
|
|
688
|
+
<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>
|
|
689
|
+
<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>
|
|
690
|
+
<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>
|
|
691
|
+
<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>
|
|
692
|
+
<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>
|
|
693
|
+
<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>
|
|
694
|
+
<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>
|
|
695
|
+
<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>
|
|
696
|
+
<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>
|
|
697
|
+
<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>
|
|
698
|
+
<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>
|
|
699
|
+
<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>
|
|
700
|
+
<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>
|
|
701
|
+
<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>
|
|
702
|
+
<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>
|
|
703
|
+
<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>
|
|
704
|
+
<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>
|
|
705
|
+
<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>
|
|
706
|
+
<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>
|
|
707
|
+
<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>
|
|
708
|
+
<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>
|
|
709
|
+
<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>
|
|
710
|
+
<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>
|
|
711
|
+
<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>
|
|
712
|
+
<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>
|
|
713
|
+
<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>
|
|
714
|
+
<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>
|
|
715
|
+
<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>
|
|
716
|
+
<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>
|
|
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:#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>
|
|
718
|
+
<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>
|
|
719
|
+
<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>
|
|
720
|
+
<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>
|
|
721
|
+
<span class="line"></span>
|
|
722
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // ═══ UNIQUE moveType gates — each rule category has its own ═══</span></span>
|
|
723
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // Pawn forward</span></span>
|
|
724
|
+
<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>
|
|
725
|
+
<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>
|
|
726
|
+
<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>
|
|
727
|
+
<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>
|
|
728
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // Pawn capture</span></span>
|
|
729
|
+
<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>
|
|
730
|
+
<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>
|
|
731
|
+
<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>
|
|
732
|
+
<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>
|
|
733
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // Pawn double</span></span>
|
|
734
|
+
<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>
|
|
735
|
+
<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>
|
|
736
|
+
<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>
|
|
737
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // Promotion (forward)</span></span>
|
|
738
|
+
<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>
|
|
739
|
+
<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>
|
|
740
|
+
<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>
|
|
741
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // Promotion (capture)</span></span>
|
|
742
|
+
<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>
|
|
743
|
+
<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>
|
|
744
|
+
<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>
|
|
745
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // En passant</span></span>
|
|
746
|
+
<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>
|
|
747
|
+
<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>
|
|
748
|
+
<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>
|
|
749
|
+
<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>
|
|
750
|
+
<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>
|
|
751
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // Standard piece move (non-pawn)</span></span>
|
|
752
|
+
<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>
|
|
753
|
+
<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>
|
|
754
|
+
<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>
|
|
755
|
+
<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>
|
|
756
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // Standard piece capture</span></span>
|
|
757
|
+
<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>
|
|
758
|
+
<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>
|
|
759
|
+
<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>
|
|
760
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // Castling kingside</span></span>
|
|
761
|
+
<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>
|
|
762
|
+
<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>
|
|
763
|
+
<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>
|
|
764
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // Castling queenside</span></span>
|
|
765
|
+
<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>
|
|
766
|
+
<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>
|
|
767
|
+
<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>
|
|
768
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // Draw</span></span>
|
|
769
|
+
<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>
|
|
770
|
+
<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>
|
|
771
|
+
<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>
|
|
772
|
+
<span class="line"><span style="color:#7F848E;font-style:italic"> // Resign</span></span>
|
|
773
|
+
<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>
|
|
774
|
+
<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>
|
|
775
|
+
<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>
|
|
776
|
+
<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>
|
|
777
|
+
<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>
|
|
778
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
779
|
+
<span class="line"><span style="color:#ABB2BF"> }</span></span>
|
|
780
|
+
<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>
|