@pyric/cli 0.1.0-alpha.18 → 0.1.0-alpha.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. package/README.md +14 -9
  2. package/dist/bridge/server/mcp-contract.d.ts +2 -2
  3. package/dist/bridge/server/mcp-contract.d.ts.map +1 -1
  4. package/dist/bridge/server/mcp-contract.js +3 -0
  5. package/dist/bridge/server/mcp-contract.js.map +1 -1
  6. package/dist/cli/index.d.ts +3 -2
  7. package/dist/cli/index.d.ts.map +1 -1
  8. package/dist/cli/index.js +51 -42
  9. package/dist/cli/index.js.map +1 -1
  10. package/dist/cli/mcp-proxy.d.ts.map +1 -1
  11. package/dist/cli/mcp-proxy.js +3 -3
  12. package/dist/cli/mcp-proxy.js.map +1 -1
  13. package/dist/cli/parse-args.d.ts +1 -1
  14. package/dist/cli/parse-args.d.ts.map +1 -1
  15. package/dist/cli/parse-args.js +51 -15
  16. package/dist/cli/parse-args.js.map +1 -1
  17. package/dist/cli/pyric-config.d.ts +24 -0
  18. package/dist/cli/pyric-config.d.ts.map +1 -0
  19. package/dist/cli/pyric-config.js +28 -0
  20. package/dist/cli/pyric-config.js.map +1 -0
  21. package/dist/cli/rules.d.ts +1 -0
  22. package/dist/cli/rules.d.ts.map +1 -1
  23. package/dist/cli/rules.js +18 -4
  24. package/dist/cli/rules.js.map +1 -1
  25. package/dist/cli/{dev-runner.d.ts → sandbox-runner.d.ts} +33 -36
  26. package/dist/cli/sandbox-runner.d.ts.map +1 -0
  27. package/dist/cli/{dev-runner.js → sandbox-runner.js} +90 -55
  28. package/dist/cli/sandbox-runner.js.map +1 -0
  29. package/dist/cli/serve.d.ts +6 -4
  30. package/dist/cli/serve.d.ts.map +1 -1
  31. package/dist/cli/serve.js +99 -40
  32. package/dist/cli/serve.js.map +1 -1
  33. package/dist/cli/service-command-records/storage-rules-resolve.d.ts +4 -0
  34. package/dist/cli/service-command-records/storage-rules-resolve.d.ts.map +1 -0
  35. package/dist/cli/service-command-records/storage-rules-resolve.js +3 -0
  36. package/dist/cli/service-command-records/storage-rules-resolve.js.map +1 -0
  37. package/dist/cli/service-commands.generated.d.ts +3 -0
  38. package/dist/cli/service-commands.generated.d.ts.map +1 -1
  39. package/dist/cli/service-commands.generated.js +2 -0
  40. package/dist/cli/service-commands.generated.js.map +1 -1
  41. package/dist/cli/snapshot.js +5 -5
  42. package/dist/cli/snapshot.js.map +1 -1
  43. package/dist/cli/verify.js +1 -1
  44. package/dist/cli/verify.js.map +1 -1
  45. package/dist/functions-rtdb/development-runtime.js +1 -1
  46. package/dist/functions-rtdb/development-runtime.js.map +1 -1
  47. package/dist/functions-rtdb/project.js +8 -8
  48. package/dist/functions-rtdb/project.js.map +1 -1
  49. package/dist/next/guard.js +1 -1
  50. package/dist/next/guard.js.map +1 -1
  51. package/dist/remote/index.d.ts +1 -1
  52. package/dist/remote/index.js +9 -9
  53. package/dist/remote/index.js.map +1 -1
  54. package/dist/serve/bundler.js +10 -10
  55. package/dist/serve/bundler.js.map +1 -1
  56. package/dist/serve/entries/ai.d.ts.map +1 -1
  57. package/dist/serve/entries/ai.js +27 -1
  58. package/dist/serve/entries/ai.js.map +1 -1
  59. package/dist/serve/entries/auth-helper-dom.js +1 -1
  60. package/dist/serve/entries/auth-helper-dom.js.map +1 -1
  61. package/dist/serve/entries/auth-helper-runtime.js +1 -1
  62. package/dist/serve/entries/auth-helper-runtime.js.map +1 -1
  63. package/dist/serve/entries/firestore.js +3 -3
  64. package/dist/serve/entries/firestore.js.map +1 -1
  65. package/dist/serve/entries/keepalive.js +1 -1
  66. package/dist/serve/entries/keepalive.js.map +1 -1
  67. package/dist/serve/entries/runtime.js +21 -14
  68. package/dist/serve/entries/runtime.js.map +1 -1
  69. package/dist/serve/entries/storage.js +1 -1
  70. package/dist/serve/entries/storage.js.map +1 -1
  71. package/dist/serve/entries/worker-runtime.js +1 -1
  72. package/dist/serve/entries/worker-runtime.js.map +1 -1
  73. package/dist/serve/init-payload.d.ts +4 -0
  74. package/dist/serve/init-payload.d.ts.map +1 -1
  75. package/dist/serve/namespace.d.ts +6 -0
  76. package/dist/serve/namespace.d.ts.map +1 -1
  77. package/dist/serve/namespace.js +36 -5
  78. package/dist/serve/namespace.js.map +1 -1
  79. package/dist/serve/rules.d.ts +3 -3
  80. package/dist/serve/rules.d.ts.map +1 -1
  81. package/dist/serve/rules.js +56 -25
  82. package/dist/serve/rules.js.map +1 -1
  83. package/dist/serve/runtime/chip.d.ts.map +1 -1
  84. package/dist/serve/runtime/chip.js +32 -1
  85. package/dist/serve/runtime/chip.js.map +1 -1
  86. package/dist/serve/runtime/manifest.d.ts +1 -1
  87. package/dist/serve/runtime/manifest.d.ts.map +1 -1
  88. package/dist/serve/runtime/manifest.js +1 -1
  89. package/dist/serve/runtime/manifest.js.map +1 -1
  90. package/dist/serve/runtime/status.d.ts.map +1 -1
  91. package/dist/serve/runtime/status.js +23 -0
  92. package/dist/serve/runtime/status.js.map +1 -1
  93. package/dist/serve/sandbox-session.d.ts +1 -0
  94. package/dist/serve/sandbox-session.d.ts.map +1 -1
  95. package/dist/serve/sandbox-session.js +10 -4
  96. package/dist/serve/sandbox-session.js.map +1 -1
  97. package/dist/serve/server.d.ts +7 -0
  98. package/dist/serve/server.d.ts.map +1 -1
  99. package/dist/serve/server.js +15 -1
  100. package/dist/serve/server.js.map +1 -1
  101. package/dist/serve/site-ui/404.html +1 -1
  102. package/dist/serve/site-ui/_astro/{RulesCodeEditor.CzwHdCi9.js → RulesCodeEditor.XtDmHOlN.js} +1 -1
  103. package/dist/serve/site-ui/_astro/_example_.B9DG9HLJ.css +1 -0
  104. package/dist/serve/site-ui/_astro/_slug_.Da5VLhW1.css +1 -0
  105. package/dist/serve/site-ui/_astro/_studio_.BnfYCKoI.css +1 -0
  106. package/dist/serve/site-ui/_astro/app.B52xr-DK.js +1 -0
  107. package/dist/serve/site-ui/_astro/app.DWBraPUw.js +12 -0
  108. package/dist/serve/site-ui/_astro/app.pMSnN6Qw.css +1 -0
  109. package/dist/serve/site-ui/_astro/chess-showcase.B72XYeoh.js +354 -0
  110. package/dist/serve/site-ui/_astro/{example-runtime.B0byNQOl.js → example-runtime.C25_lx6Z.js} +2 -26
  111. package/dist/serve/site-ui/_astro/index.Tb-31efc.css +1 -0
  112. package/dist/serve/site-ui/_astro/index.UkCBr-_0.css +1 -0
  113. package/dist/serve/site-ui/_astro/sandbox-controls.DEpnKg-O.js +1169 -0
  114. package/dist/serve/site-ui/_astro/seed.Co0yUJY5.js +20 -0
  115. package/dist/serve/site-ui/_astro/writes.rpjrFzmu.js +102 -0
  116. package/dist/serve/site-ui/auth/index.html +5 -3
  117. package/dist/serve/site-ui/david-east.jpg +0 -0
  118. package/dist/serve/site-ui/docs/_rhythm/index.html +6 -3
  119. package/dist/serve/site-ui/docs/_rhythm.md +1 -1
  120. package/dist/serve/site-ui/docs/agent/set-up-your-agent/index.html +45 -17
  121. package/dist/serve/site-ui/docs/agent/set-up-your-agent.md +20 -17
  122. package/dist/serve/site-ui/docs/agent/watch-and-review/index.html +6 -5
  123. package/dist/serve/site-ui/docs/agent/watch-and-review.md +1 -5
  124. package/dist/serve/site-ui/docs/agent/work-with-an-agent/index.html +8 -5
  125. package/dist/serve/site-ui/docs/agent/work-with-an-agent.md +4 -4
  126. package/dist/serve/site-ui/docs/ai-compat/index.html +5 -2
  127. package/dist/serve/site-ui/docs/api-reference/index.html +6 -2
  128. package/dist/serve/site-ui/docs/api-reference.md +1 -0
  129. package/dist/serve/site-ui/docs/app-compat/index.html +5 -2
  130. package/dist/serve/site-ui/docs/auth-compat/index.html +5 -2
  131. package/dist/serve/site-ui/docs/build/ai-logic/index.html +5 -2
  132. package/dist/serve/site-ui/docs/build/authentication/index.html +7 -4
  133. package/dist/serve/site-ui/docs/build/authentication.md +2 -2
  134. package/dist/serve/site-ui/docs/build/cloud-firestore/index.html +34 -53
  135. package/dist/serve/site-ui/docs/build/cloud-firestore.md +40 -36
  136. package/dist/serve/site-ui/docs/build/cloud-messaging/index.html +5 -2
  137. package/dist/serve/site-ui/docs/build/cloud-storage/index.html +6 -3
  138. package/dist/serve/site-ui/docs/build/cloud-storage.md +1 -1
  139. package/dist/serve/site-ui/docs/build/realtime-database/index.html +9 -6
  140. package/dist/serve/site-ui/docs/build/realtime-database.md +4 -4
  141. package/dist/serve/site-ui/docs/conformance-scores/index.html +5 -2
  142. package/dist/serve/site-ui/docs/create-pyric-reference-api/index.html +6 -3
  143. package/dist/serve/site-ui/docs/create-pyric-reference-api.md +1 -1
  144. package/dist/serve/site-ui/docs/database-compat/index.html +5 -2
  145. package/dist/serve/site-ui/docs/examples/chess/index.html +649 -250
  146. package/dist/serve/site-ui/docs/examples/chess.md +45 -16
  147. package/dist/serve/site-ui/docs/examples/index.html +6 -3
  148. package/dist/serve/site-ui/docs/firestore-compat/index.html +5 -2
  149. package/dist/serve/site-ui/docs/functions-rtdb-compat/index.html +5 -2
  150. package/dist/serve/site-ui/docs/get-started/how-the-swap-works/index.html +9 -6
  151. package/dist/serve/site-ui/docs/get-started/how-the-swap-works.md +5 -5
  152. package/dist/serve/site-ui/docs/get-started/nextjs/index.html +9 -6
  153. package/dist/serve/site-ui/docs/get-started/nextjs.md +4 -4
  154. package/dist/serve/site-ui/docs/get-started/start-building/index.html +41 -10
  155. package/dist/serve/site-ui/docs/get-started/start-building.md +21 -10
  156. package/dist/serve/site-ui/docs/get-started/vite/index.html +6 -3
  157. package/dist/serve/site-ui/docs/get-started/vite.md +1 -1
  158. package/dist/serve/site-ui/docs/index.json +203 -168
  159. package/dist/serve/site-ui/docs/messaging-compat/index.html +5 -2
  160. package/dist/serve/site-ui/docs/observe/resolve-runtime-status/index.html +5 -2
  161. package/dist/serve/site-ui/docs/observe/see-whats-happening/index.html +6 -4
  162. package/dist/serve/site-ui/docs/observe/see-whats-happening.md +2 -4
  163. package/dist/serve/site-ui/docs/observe/shape-your-data/index.html +9 -6
  164. package/dist/serve/site-ui/docs/observe/shape-your-data.md +4 -4
  165. package/dist/serve/site-ui/docs/overview/index.html +16 -10
  166. package/dist/serve/site-ui/docs/overview.md +19 -11
  167. package/dist/serve/site-ui/docs/pyric-admin-app-reference-api/index.html +5 -2
  168. package/dist/serve/site-ui/docs/pyric-admin-auth-reference-api/index.html +5 -2
  169. package/dist/serve/site-ui/docs/pyric-admin-database-reference-api/index.html +5 -2
  170. package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api/index.html +8 -5
  171. package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api.md +3 -3
  172. package/dist/serve/site-ui/docs/pyric-admin-messaging-reference-api/index.html +5 -2
  173. package/dist/serve/site-ui/docs/pyric-admin-reference-api/index.html +501 -0
  174. package/dist/serve/site-ui/docs/pyric-admin-reference-api.md +587 -0
  175. package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api/index.html +5 -2
  176. package/dist/serve/site-ui/docs/pyric-ai-reference-api/index.html +5 -2
  177. package/dist/serve/site-ui/docs/pyric-ai-scripting-reference-api/index.html +5 -2
  178. package/dist/serve/site-ui/docs/pyric-app-reference-api/index.html +5 -2
  179. package/dist/serve/site-ui/docs/pyric-auth-reference-api/index.html +5 -2
  180. package/dist/serve/site-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +5 -2
  181. package/dist/serve/site-ui/docs/pyric-cli-assurance-reference-api/index.html +5 -2
  182. package/dist/serve/site-ui/docs/pyric-cli-bridge-client-reference-api/index.html +5 -2
  183. package/dist/serve/site-ui/docs/pyric-cli-bridge-reference-api/index.html +5 -2
  184. package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +5 -2
  185. package/dist/serve/site-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +5 -2
  186. package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api/index.html +5 -2
  187. package/dist/serve/site-ui/docs/pyric-cli-credentials-node-reference-api/index.html +5 -2
  188. package/dist/serve/site-ui/docs/pyric-cli-discover-reference-api/index.html +5 -2
  189. package/dist/serve/site-ui/docs/pyric-cli-next-reference-api/index.html +5 -2
  190. package/dist/serve/site-ui/docs/pyric-cli-register-app-bridge-reference-api/index.html +5 -2
  191. package/dist/serve/site-ui/docs/pyric-cli-register-reference-api/index.html +5 -2
  192. package/dist/serve/site-ui/docs/pyric-cli-remote-reference-api/index.html +6 -3
  193. package/dist/serve/site-ui/docs/pyric-cli-remote-reference-api.md +1 -1
  194. package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api/index.html +5 -2
  195. package/dist/serve/site-ui/docs/pyric-cli-verify-reference-api/index.html +5 -2
  196. package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api/index.html +5 -2
  197. package/dist/serve/site-ui/docs/pyric-database-reference-api/index.html +166 -95
  198. package/dist/serve/site-ui/docs/pyric-database-reference-api.md +107 -1
  199. package/dist/serve/site-ui/docs/pyric-firestore-reference-api/index.html +5 -2
  200. package/dist/serve/site-ui/docs/pyric-messaging-reference-api/index.html +10 -4
  201. package/dist/serve/site-ui/docs/pyric-messaging-reference-api.md +5 -2
  202. package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api/index.html +10 -4
  203. package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api.md +5 -2
  204. package/dist/serve/site-ui/docs/pyric-rules-reference-api/index.html +5 -2
  205. package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api/index.html +5 -2
  206. package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api/index.html +6 -3
  207. package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api.md +2 -2
  208. package/dist/serve/site-ui/docs/pyric-sandbox-reference-api/index.html +5 -2
  209. package/dist/serve/site-ui/docs/pyric-storage-reference-api/index.html +5 -2
  210. package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api/index.html +5 -2
  211. package/dist/serve/site-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +5 -2
  212. package/dist/serve/site-ui/docs/pyric-ui-auth-reference-api/index.html +5 -2
  213. package/dist/serve/site-ui/docs/pyric-ui-events-hooks-reference-api/index.html +5 -2
  214. package/dist/serve/site-ui/docs/pyric-ui-events-reference-api/index.html +5 -2
  215. package/dist/serve/site-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +5 -2
  216. package/dist/serve/site-ui/docs/pyric-ui-firestore-reference-api/index.html +5 -2
  217. package/dist/serve/site-ui/docs/pyric-ui-primitives-reference-api/index.html +5 -2
  218. package/dist/serve/site-ui/docs/pyric-ui-rtdb-reference-api/index.html +5 -2
  219. package/dist/serve/site-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +5 -2
  220. package/dist/serve/site-ui/docs/pyric-ui-rules-reference-api/index.html +5 -2
  221. package/dist/serve/site-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +5 -2
  222. package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api/index.html +5 -2
  223. package/dist/serve/site-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +5 -2
  224. package/dist/serve/site-ui/docs/pyric-ui-traffic-reference-api/index.html +5 -2
  225. package/dist/serve/site-ui/docs/reference/cli/index.html +153 -0
  226. package/dist/serve/site-ui/docs/reference/cli.md +114 -0
  227. package/dist/serve/site-ui/docs/rules-compat/index.html +5 -2
  228. package/dist/serve/site-ui/docs/secure/audit-your-rules/index.html +5 -2
  229. package/dist/serve/site-ui/docs/secure/firestore-rules-limits/index.html +5 -2
  230. package/dist/serve/site-ui/docs/secure/read-a-denial/index.html +6 -3
  231. package/dist/serve/site-ui/docs/secure/read-a-denial.md +1 -1
  232. package/dist/serve/site-ui/docs/secure/rtdb-rules-in-typescript/index.html +5 -2
  233. package/dist/serve/site-ui/docs/secure/rules-standard-library/index.html +5 -2
  234. package/dist/serve/site-ui/docs/secure/secure-it-with-rules/index.html +5 -2
  235. package/dist/serve/site-ui/docs/secure/simulate-and-lint/index.html +5 -2
  236. package/dist/serve/site-ui/docs/secure/write-a-rules-test-suite/index.html +5 -2
  237. package/dist/serve/site-ui/docs/ship/ship-to-production/index.html +7 -4
  238. package/dist/serve/site-ui/docs/ship/ship-to-production.md +2 -2
  239. package/dist/serve/site-ui/docs/ship/test-in-node/index.html +9 -6
  240. package/dist/serve/site-ui/docs/ship/test-in-node.md +4 -4
  241. package/dist/serve/site-ui/docs/storage-compat/index.html +5 -2
  242. package/dist/serve/site-ui/docs/trust/how-we-know-it-matches-firebase/index.html +5 -2
  243. package/dist/serve/site-ui/docs/trust/rules-standard-library/index.html +5 -2
  244. package/dist/serve/site-ui/docs/trust/versioning-and-compatibility/index.html +5 -2
  245. package/dist/serve/site-ui/docs/tutorial/index.html +10 -7
  246. package/dist/serve/site-ui/docs/tutorial.md +4 -4
  247. package/dist/serve/site-ui/examples/chess/index.html +4 -2
  248. package/dist/serve/site-ui/firestore/index.html +5 -3
  249. package/dist/serve/site-ui/hero-charcoal.jpg +0 -0
  250. package/dist/serve/site-ui/index.html +9 -7
  251. package/dist/serve/site-ui/llms.txt +4 -3
  252. package/dist/serve/site-ui/pyric-campfire-full.png +0 -0
  253. package/dist/serve/site-ui/pyric-campfire.png +0 -0
  254. package/dist/serve/site-ui/rtdb/index.html +5 -3
  255. package/dist/serve/site-ui/settings/index.html +5 -3
  256. package/dist/serve/site-ui/storage/index.html +5 -3
  257. package/dist/serve/site-ui/studio/index.html +13 -0
  258. package/dist/serve/site-ui/studio-routes.json +1 -1
  259. package/dist/serve/site-ui/traffic/index.html +5 -3
  260. package/dist/serve/studio/routes.d.ts +9 -0
  261. package/dist/serve/studio/routes.d.ts.map +1 -1
  262. package/dist/serve/studio/routes.js +47 -7
  263. package/dist/serve/studio/routes.js.map +1 -1
  264. package/dist/serve/vite-ai-config.d.ts.map +1 -1
  265. package/dist/serve/vite-ai-config.js +38 -8
  266. package/dist/serve/vite-ai-config.js.map +1 -1
  267. package/dist/serve/vite-module-swap.d.ts.map +1 -1
  268. package/dist/serve/vite-module-swap.js +0 -28
  269. package/dist/serve/vite-module-swap.js.map +1 -1
  270. package/dist/serve/vite-rules-source.d.ts.map +1 -1
  271. package/dist/serve/vite-rules-source.js +28 -7
  272. package/dist/serve/vite-rules-source.js.map +1 -1
  273. package/dist/serve/vite-sandbox-generation.d.ts +1 -1
  274. package/dist/serve/vite-sandbox-generation.d.ts.map +1 -1
  275. package/dist/serve/vite-sandbox-generation.js +1 -1
  276. package/dist/serve/vite-sandbox-generation.js.map +1 -1
  277. package/dist/serve/worker/client/disconnect.js +1 -1
  278. package/dist/serve/worker/client/disconnect.js.map +1 -1
  279. package/dist/serve/worker/client/presence.d.ts.map +1 -1
  280. package/dist/serve/worker/client/presence.js +18 -5
  281. package/dist/serve/worker/client/presence.js.map +1 -1
  282. package/dist/serve/worker/host-ai.d.ts.map +1 -1
  283. package/dist/serve/worker/host-ai.js +15 -0
  284. package/dist/serve/worker/host-ai.js.map +1 -1
  285. package/dist/serve/worker/protocol.d.ts +4 -0
  286. package/dist/serve/worker/protocol.d.ts.map +1 -1
  287. package/dist/serve/worker/protocol.js.map +1 -1
  288. package/dist/serve/worker/serve-init.d.ts.map +1 -1
  289. package/dist/serve/worker/serve-init.js +7 -1
  290. package/dist/serve/worker/serve-init.js.map +1 -1
  291. package/package.json +5 -5
  292. package/src/bridge/server/mcp-contract.ts +3 -0
  293. package/src/cli/cli.test.ts +2 -2
  294. package/src/cli/index.ts +51 -42
  295. package/src/cli/mcp-proxy.ts +10 -11
  296. package/src/cli/parse-args.ts +61 -15
  297. package/src/cli/pyric-config.ts +45 -0
  298. package/src/cli/rules.ts +31 -4
  299. package/src/cli/{dev-runner.ts → sandbox-runner.ts} +117 -72
  300. package/src/cli/serve.ts +115 -47
  301. package/src/cli/service-command-records/storage-rules-resolve.ts +4 -0
  302. package/src/cli/service-commands.generated.ts +2 -0
  303. package/src/cli/snapshot.ts +5 -5
  304. package/src/cli/verify.ts +1 -1
  305. package/src/functions-rtdb/development-runtime.ts +1 -1
  306. package/src/functions-rtdb/project.ts +8 -8
  307. package/src/next/guard.ts +1 -1
  308. package/src/remote/index.ts +9 -9
  309. package/src/serve/bundler.ts +10 -10
  310. package/src/serve/entries/ai.ts +27 -1
  311. package/src/serve/entries/auth-helper-dom.ts +1 -1
  312. package/src/serve/entries/auth-helper-runtime.ts +1 -1
  313. package/src/serve/entries/firestore.ts +3 -3
  314. package/src/serve/entries/keepalive.ts +1 -1
  315. package/src/serve/entries/runtime.ts +19 -14
  316. package/src/serve/entries/storage.ts +1 -1
  317. package/src/serve/entries/worker-runtime.ts +1 -1
  318. package/src/serve/init-payload.ts +4 -0
  319. package/src/serve/namespace.ts +44 -5
  320. package/src/serve/rules.ts +61 -26
  321. package/src/serve/runtime/chip.ts +38 -1
  322. package/src/serve/runtime/manifest.ts +1 -1
  323. package/src/serve/runtime/status.ts +24 -0
  324. package/src/serve/sandbox-session.ts +10 -4
  325. package/src/serve/server.ts +18 -1
  326. package/src/serve/studio/routes.ts +63 -7
  327. package/src/serve/vite-ai-config.ts +37 -7
  328. package/src/serve/vite-module-swap.ts +0 -28
  329. package/src/serve/vite-rules-source.ts +29 -7
  330. package/src/serve/vite-sandbox-generation.ts +1 -1
  331. package/src/serve/worker/client/disconnect.ts +1 -1
  332. package/src/serve/worker/client/presence.ts +25 -5
  333. package/src/serve/worker/host-ai.ts +15 -0
  334. package/src/serve/worker/protocol.ts +2 -1
  335. package/src/serve/worker/serve-init.ts +5 -1
  336. package/README.md.orig +0 -141
  337. package/dist/cli/dev-runner.d.ts.map +0 -1
  338. package/dist/cli/dev-runner.js.map +0 -1
  339. package/dist/serve/site-ui/_astro/_example_.jevZ7OdV.css +0 -1
  340. package/dist/serve/site-ui/_astro/_slug_.C6QfVOxJ.css +0 -1
  341. package/dist/serve/site-ui/_astro/_slug_.CXh9yTP1.css +0 -1
  342. package/dist/serve/site-ui/_astro/_studio_.B6b_G1ev.css +0 -1
  343. package/dist/serve/site-ui/_astro/app.B7pBzz5N.js +0 -11
  344. package/dist/serve/site-ui/_astro/app.BsFsMjn0.css +0 -1
  345. package/dist/serve/site-ui/_astro/app.boex5SnQ.js +0 -1
  346. package/dist/serve/site-ui/_astro/chess-showcase.DDqE-QGe.js +0 -1
  347. package/dist/serve/site-ui/_astro/chess-source-explorer.C5k9c5yK.js +0 -1
  348. package/dist/serve/site-ui/_astro/chess-v2.CFHmd3UL.js +0 -354
  349. package/dist/serve/site-ui/_astro/index.uwPvjH_1.js +0 -1
  350. package/dist/serve/site-ui/_astro/jsx-runtime.D_zvdyIk.js +0 -9
  351. package/dist/serve/site-ui/_astro/reads.Dh3z0fJy.js +0 -1
  352. package/dist/serve/site-ui/_astro/sandbox-controls.C2IqtoSw.js +0 -1252
  353. package/dist/serve/site-ui/_astro/seed.CCmj00su.js +0 -20
  354. package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research/index.html +0 -582
  355. package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research.md +0 -448
  356. package/dist/serve/site-ui/examples/firestore-first-write/index.html +0 -2
@@ -1,39 +1,86 @@
1
- <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Play chess against Security Rules · Pyric Studio</title><meta name="description" content="Play chess against Firestore Security Rules in an isolated Pyric sandbox."><link rel="icon" type="image/svg+xml" href="/__pyric/ui/pyric-logo.svg"><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet"><link rel="stylesheet" href="/__pyric/ui/_astro/_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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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; <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>
1
+ <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"><title>Play chess against Security Rules · Pyric Studio</title><meta name="description" content="Play chess against Firestore Security Rules in an isolated Pyric sandbox."><link rel="icon" type="image/svg+xml" href="/__pyric/ui/pyric-logo.svg"><link rel="preconnect" href="https://use.typekit.net" crossorigin><link rel="stylesheet" href="https://use.typekit.net/jwb3ycu.css"><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet"><link rel="stylesheet" href="/__pyric/ui/_astro/index.UkCBr-_0.css">
2
+ <link rel="stylesheet" href="/__pyric/ui/_astro/_slug_.Da5VLhW1.css">
3
+ <style>:root{--rhythm-para: .875rem;--rhythm-group: 1.5rem;--rhythm-subsection: 2.25rem;--rhythm-section: 3.25rem;--rhythm-list: calc(var(--rhythm-para) * .75)}.prose>*,.prose blockquote>*,.prose li>*,.prose .compat-stat>*{margin-block:0}.prose>*+*{margin-block-start:var(--rhythm-group)}.prose>*+h2{margin-block-start:var(--rhythm-section)}.prose>*+h3,.prose>*+h4{margin-block-start:var(--rhythm-subsection)}.prose>h1+*,.prose>h2+*,.prose>h3+*,.prose>h4+*{margin-block-start:var(--rhythm-para)}.prose>p+p{margin-block-start:var(--rhythm-para)}.prose>p+ul,.prose>p+ol,.prose>p+blockquote{margin-block-start:var(--rhythm-para)}.prose li+li{margin-block-start:var(--rhythm-list)}.prose li>ul,.prose li>ol{margin-block-start:var(--rhythm-list)}.prose li>*+*,.prose blockquote>*+*{margin-block-start:var(--rhythm-para)}
4
+ html{scrollbar-gutter:stable}
5
+ </style></head> <body> <header class="studio__chrome"> <div class="studio__bar"> <div class="studio__chrome-inner"> <nav class="studio__nav" aria-label="Site"> <a class="studio__brand" href="/__pyric/ui/" aria-label="Pyric">pyric</a> <a class="studio__nav-tab" href="/__pyric/ui/"> Home </a><a class="studio__nav-tab" href="/__pyric/ui/docs" aria-current="page"> Docs </a><a class="studio__nav-tab" href="/__pyric/ui/studio"> Studio </a> </nav> </div> </div> </header> <div class="docs-shell docs-shell--example" data-astro-cid-mw7aashj> <details class="docs-nav-drawer" data-astro-cid-mw7aashj> <summary data-astro-cid-mw7aashj>Navigate</summary> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <script type="module">let i=null;function d(t){return i||(i=fetch(t).then(e=>e.json())),i}function l(t,e){return t.title.toLowerCase().includes(e)||t.excerpt.toLowerCase().includes(e)?!0:t.headings.some(r=>r.text.toLowerCase().includes(e))}function u(t,e,r){if(e.innerHTML="",t.length===0){e.hidden=!1;{const n=document.createElement("li");n.className="docs-search-empty",n.textContent="No matches",e.appendChild(n)}return}e.hidden=!1;for(const n of t.slice(0,8)){const s=document.createElement("li"),c=document.createElement("a");c.href=n.path;const o=document.createElement("span");o.className="docs-search-result-title",o.textContent=n.title;const a=document.createElement("span");a.className="docs-search-result-meta",a.textContent=[n.group,n.section].filter(Boolean).join(" / "),c.append(o,a),s.appendChild(c),e.appendChild(s)}}document.querySelectorAll(".docs-search").forEach(t=>{const e=t.dataset.indexUrl,r=t.querySelector(".docs-search-input"),n=t.querySelector(".docs-search-results");r.addEventListener("input",async()=>{const s=r.value.trim().toLowerCase();if(!s){n.hidden=!0,n.innerHTML="";return}const{pages:c}=await d(e);r.value.trim().toLowerCase()===s&&u(c.filter(o=>l(o,s)),n)}),r.addEventListener("focus",()=>{d(e),n.childElementCount>0&&(n.hidden=!1)}),r.addEventListener("keydown",s=>{s.key==="Escape"&&(r.value="",n.hidden=!0,n.innerHTML="",r.blur())}),r.addEventListener("blur",()=>{window.setTimeout(()=>{n.hidden=!0},150)})});document.addEventListener("keydown",t=>{if(!(t.metaKey||t.ctrlKey)||t.key.toLowerCase()!=="k")return;const e=[...document.querySelectorAll(".docs-search-input")].find(r=>r.offsetParent!==null);e&&(t.preventDefault(),e.focus(),e.select())});</script> <details class="docs-nav-group"> <summary>Overview</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/overview/"> Overview </a> </li><li> <a href="/__pyric/ui/docs/tutorial/"> Tutorial </a> </li><li> <a href="/__pyric/ui/docs/examples/"> Examples </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/vite/"> Vite </a> </li><li> <a href="/__pyric/ui/docs/get-started/nextjs/"> Next.js </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" open> <summary>Secure &amp; 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 &amp; 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 &amp; 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 &amp; test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Trust</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/trust/versioning-and-compatibility/"> Versioning and the fb tag </a> </li><li> <a href="/__pyric/ui/docs/trust/rules-standard-library/"> Rules standard library reference </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/conformance-scores/"> Conformance scores </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group"> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-reference-api/"> pyric-admin </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-messaging-reference-api/"> pyric-admin/messaging </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-docs-reference-api/"> @pyric/cli/conformance/docs </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-next-reference-api/"> @pyric/cli/next </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-app-bridge-reference-api/"> @pyric/cli/register/app-bridge </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/reference/cli/"> CLI </a> </li> </ul> </div> </div> </details> </nav> </details> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <details class="docs-nav-group" id="nav-group-overview"> <summary>Overview</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/overview/"> Overview </a> </li><li> <a href="/__pyric/ui/docs/tutorial/"> Tutorial </a> </li><li> <a href="/__pyric/ui/docs/examples/"> Examples </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-get-started"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/vite/"> Vite </a> </li><li> <a href="/__pyric/ui/docs/get-started/nextjs/"> Next.js </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-build"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-secure-debug" open> <summary>Secure &amp; 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 &amp; 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 &amp; 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 &amp; test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-work-with-an-agent"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-trust"> <summary>Trust</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/trust/versioning-and-compatibility/"> Versioning and the fb tag </a> </li><li> <a href="/__pyric/ui/docs/trust/rules-standard-library/"> Rules standard library reference </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-conformance"> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/conformance-scores/"> Conformance scores </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group" id="nav-group-reference"> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-reference-api/"> pyric-admin </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-messaging-reference-api/"> pyric-admin/messaging </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-docs-reference-api/"> @pyric/cli/conformance/docs </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-next-reference-api/"> @pyric/cli/next </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-app-bridge-reference-api/"> @pyric/cli/register/app-bridge </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/reference/cli/"> CLI </a> </li> </ul> </div> </div> </details> </nav> <main class="doc-main doc-main--example" data-astro-cid-mw7aashj> <nav class="docs-breadcrumbs" aria-label="Breadcrumb"> <ol> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/">Secure &amp; debug</a> </li><li> <span class="docs-breadcrumbs-sep" aria-hidden="true">/</span> <a href="#nav-section-secure-debug-examples">Examples</a> </li><li> <span class="docs-breadcrumbs-sep" aria-hidden="true">/</span> <span aria-current="page">Chess showcase</span> </li> </ol> </nav> <div class="example-doc-page" data-astro-cid-ghke3xma> <header class="example-header" data-astro-cid-3f5pqdpq> <p class="example-meta" data-astro-cid-sluz6xkv="true">Firestore Security Rules · Isolated browser sandbox</p> <h1 data-astro-cid-3f5pqdpq>Play chess against Security Rules</h1> <div data-astro-cid-3f5pqdpq>Move a piece; Pyric commits the new board or denies the write.</div> </header> <div class="example-stage is-showcase" data-astro-cid-xgvwrve7> <iframe title="Play chess against Security Rules" src="/__pyric/ui/examples/chess/" sandbox="allow-scripts allow-same-origin" scrolling="no" data-example-frame data-example-id="chess" data-min-height="560" data-astro-cid-xgvwrve7></iframe> </div> <script type="module">const i=t=>{if(t.dataset.sizingInstalled==="true")return;t.dataset.sizingInstalled="true";let n;const o=()=>{const e=t.contentDocument;if(!e)return;const s=Math.max(Number(t.dataset.minHeight??0),e.documentElement.scrollHeight,e.body?.scrollHeight??0);t.style.height=`${s}px`};t.addEventListener("load",()=>{n?.disconnect();const e=t.contentDocument;e&&(n=new ResizeObserver(o),n.observe(e.documentElement),e.body&&n.observe(e.body),o())})};document.querySelectorAll("[data-example-frame]").forEach(i);</script> <article class="prose example-explanation" data-astro-cid-ghke3xma> <h2 id="try-the-board">Try the board</h2>
6
+ <p>Choose a piece and its destination. <code>e2 → e4</code> is allowed. <code>e2 → e5</code> is denied and leaves the board unchanged. Switch the identity to see turn ownership enforced.</p>
7
+ <p>Choose a scenario to run a complete sequence through the Rules. Fool’s Mate and Scholar’s Mate end in checkmate. The opening remains in progress. The illegal pawn leap is denied without changing the board.</p>
5
8
  <h2 id="a-move-is-a-firestore-write">A move is a Firestore write</h2>
6
9
  <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="text"><code><span class="line"><span>move → proposed Firestore document → Security Rules → commit or deny → next board</span></span></code></pre>
7
10
  <p>Each game is one Firestore document. A move proposes its next state: one square is emptied, another receives the piece, the turn changes, and the move count increases.</p>
8
- <p>Pyric evaluates that write against Firestore Security Rules in the browser. An allowed write changes the document and the board. A denied write changes neither.</p>
9
- <h2 id="keep-the-rules-focused-on-chess">Keep the Rules focused on chess</h2>
11
+ <p>Pyric evaluates that write against Firestore Security Rules in the browser. An allowed write changes the document and the board. When the Rules deny a write, the document and board stay unchanged.</p>
12
+ <h2 id="why-the-rules-look-like-this">Why the Rules look like this</h2>
13
+ <p>Firestore Security Rules cannot loop over the pieces on a chessboard. A request also has limits on expressions, function calls, and document reads. These constraints determine how the chess Rules are structured.</p>
14
+ <p>Movement geometry lives in a read-only Firestore document, where the Rules can look up valid destinations and the squares between them. Check detection names each opposing piece explicitly. Each move type starts in a separate branch so unrelated checks can stop early.</p>
15
+ <h2 id="look-up-the-available-helpers">Look up the available helpers</h2>
10
16
  <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="rules"><code><span class="line"><span style="color:#C678DD">rules_version</span><span style="color:#ABB2BF"> = </span><span style="color:#98C379">'2+modules'</span><span style="color:#ABB2BF">;</span></span>
11
17
  <span class="line"></span>
12
18
  <span class="line"><span style="color:#C678DD">import</span><span style="color:#ABB2BF"> { isAuthenticated } </span><span style="color:#C678DD">from</span><span style="color:#98C379"> 'auth'</span><span style="color:#ABB2BF">;</span></span>
13
19
  <span class="line"><span style="color:#C678DD">import</span><span style="color:#ABB2BF"> { validSimpleMove } </span><span style="color:#C678DD">from</span><span style="color:#98C379"> 'geometry'</span><span style="color:#ABB2BF">;</span></span>
14
20
  <span class="line"><span style="color:#C678DD">import</span><span style="color:#ABB2BF"> { isPlaying, moveIncremented, participantsUnchanged } </span><span style="color:#C678DD">from</span><span style="color:#98C379"> 'state'</span><span style="color:#ABB2BF">;</span></span>
15
21
  <span class="line"><span style="color:#C678DD">import</span><span style="color:#ABB2BF"> { isMyTurn, turnFlipped } </span><span style="color:#C678DD">from</span><span style="color:#98C379"> 'turns'</span><span style="color:#ABB2BF">;</span></span></code></pre>
16
- <p><code>2+modules</code> is Pyric’s modular Rules format. Pyric resolves its imports into ordinary version 2 Rules before evaluation or deployment.</p>
17
- <p>The Standard Library modules handle checks that are useful beyond chess: authentication, participants, turns, move counts, and movement across a grid. The remaining Rules can concentrate on chess-specific behavior such as blocked paths, captures, castling, and king safety.</p>
18
- <p>The board’s geometry lives in a read-only Firestore document. <code>validSimpleMove(cfg())</code> uses that data to check whether a piece can travel from one square to another. This turns movement into lookups that the Rules language can evaluate.</p>
19
- <h2 id="stop-unrelated-rules-early">Stop unrelated Rules early</h2>
22
+ <p>Before using a helper, an agent can ask <code>firestore_rules_stdlib_list</code> and <code>firestore_rules_stdlib_get</code> for its exact name, arguments, and examples. The imports above come from that library. <code>firestore_resolve_modules</code> then turns them into ordinary version 2 Rules.</p>
23
+ <p>The shared helpers cover authentication, participants, turns, move counts, and movement across a grid. The functions left in this file deal with chess: blocked paths, captures, castling, and king safety.</p>
24
+ <h2 id="route-each-move-to-one-branch">Route each move to one branch</h2>
25
+ <p>Before writing the proposed game document, the board labels each available move from the piece and its destination:</p>
26
+ <div class="table-scroll">
27
+
28
+
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+ <table><thead><tr><th>Piece and destination</th><th><code>moveType</code></th></tr></thead><tbody><tr><td>Non-pawn moving to an empty square</td><td><code>normal</code></td></tr><tr><td>Non-pawn moving to an occupied square</td><td><code>capture</code></td></tr><tr><td>Pawn moving one square to an empty square</td><td><code>pawn_forward</code></td></tr><tr><td>Pawn moving two squares to an empty square</td><td><code>double_pawn</code></td></tr><tr><td>Pawn moving to an occupied square</td><td><code>pawn_capture</code></td></tr></tbody></table></div>
56
+ <p>The board stores the label in the proposed <code>/chess-v2/{gameId}</code> document. The matching Rules branch then checks whether the move is legal. In the Rules, <code>resource.data</code> is the current game and <code>request.resource.data</code> is that proposed next game.</p>
57
+ <p>The <code>allow update</code> clauses inside this match block are alternatives. Firestore allows the update when any one of them returns <code>true</code>. Because a proposed document has one <code>moveType</code>, only its matching branch can get past the first comparison.</p>
20
58
  <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="rules"><code><span class="line"><span style="color:#C678DD">allow</span><span style="color:#61AFEF"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.data.moveType == </span><span style="color:#98C379">'normal'</span></span>
21
- <span class="line"><span style="color:#ABB2BF"> &#x26;&#x26; baseMoveChecks() &#x26;&#x26; validPieceMove() &#x26;&#x26; myKingSafe();</span></span>
59
+ <span class="line"><span style="color:#ABB2BF"> &#x26;&#x26; </span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.data.capturedPiece == </span><span style="color:#98C379">''</span></span>
60
+ <span class="line"><span style="color:#ABB2BF"> &#x26;&#x26; </span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.data.status == </span><span style="color:#98C379">'playing'</span></span>
61
+ <span class="line"><span style="color:#ABB2BF"> &#x26;&#x26; baseMoveChecks() &#x26;&#x26; validPieceMove()</span></span>
62
+ <span class="line"><span style="color:#ABB2BF"> &#x26;&#x26; </span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.data[</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.data.moveTo] == </span><span style="color:#98C379">''</span></span>
63
+ <span class="line"><span style="color:#ABB2BF"> &#x26;&#x26; pieceMovedCorrectly() &#x26;&#x26; myKingSafe();</span></span>
22
64
  <span class="line"></span>
23
65
  <span class="line"><span style="color:#C678DD">allow</span><span style="color:#61AFEF"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.data.moveType == </span><span style="color:#98C379">'capture'</span></span>
24
- <span class="line"><span style="color:#ABB2BF"> &#x26;&#x26; baseMoveChecks() &#x26;&#x26; validPieceMove() &#x26;&#x26; captureValid() &#x26;&#x26; myKingSafe();</span></span></code></pre>
25
- <p>Firestore limits how much work a Rules evaluation may perform. Each move type starts with a different value, so only the matching branch continues into the expensive chess checks. Pyric’s linter checks these limits locally instead of waiting for a deployment to expose them.</p>
26
- <h2 id="checkmate-is-a-result-not-a-trusted-claim">Checkmate is a result, not a trusted claim</h2>
66
+ <span class="line"><span style="color:#ABB2BF"> &#x26;&#x26; </span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.data.capturedPiece != </span><span style="color:#98C379">''</span></span>
67
+ <span class="line"><span style="color:#ABB2BF"> &#x26;&#x26; </span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.data.status == </span><span style="color:#98C379">'playing'</span></span>
68
+ <span class="line"><span style="color:#ABB2BF"> &#x26;&#x26; baseMoveChecks() &#x26;&#x26; validPieceMove()</span></span>
69
+ <span class="line"><span style="color:#ABB2BF"> &#x26;&#x26; captureValid() &#x26;&#x26; pieceMovedCorrectly() &#x26;&#x26; myKingSafe();</span></span></code></pre>
70
+ <p>The <code>normal</code> branch requires an empty destination and no captured piece. The <code>capture</code> branch requires a captured piece, and <code>captureValid()</code> checks that the proposed document removes it. Both branches check the player and turn, the piece’s movement, the changed board fields, and king safety. Pawn moves have separate branches.</p>
71
+ <p>The first comparison in each branch is deliberately cheap. A capture skips the normal-move checks, and a normal move skips the capture checks. <code>firestore_lint_rules</code> warns the agent when branches share a gate and may waste the evaluation budget, as well as when a branch calls too many functions or reads too many documents.</p>
72
+ <h2 id="derive-checkmate-from-the-board">Derive checkmate from the board</h2>
27
73
  <p>Security Rules decide whether a move may be stored. After an allowed move commits, the browser checks the resulting board. It reports checkmate only when the king is attacked and no legal move, capture, block, king escape, or en passant response removes the attack.</p>
28
- <p>There is no client-authored <code>checkmate</code> move for the Rules to trust. The result is derived from the board that the Rules already accepted.</p>
29
- <h2 id="test-the-same-boundaries-before-production">Test the same boundaries before production</h2>
30
- <p>The local suite covers allowed and denied geometry, blocked paths, captures, pins, check, turn ownership, resignation, and checkmate. It runs against the same resolved Rules as the board.</p>
31
- <p>Pyric is a development mirror, not Firebase production. Before shipping a game or any Rules-heavy application, run its important cases against a Firebase project too.</p> </article> <section class="example-rules" data-astro-cid-ghke3xma> <h2 data-astro-cid-ghke3xma>Security Rules</h2> <p data-astro-cid-ghke3xma>The board uses the modular Rules below. Pyric resolves the Standard Library imports into ordinary version 2 Rules before the sandbox evaluates each move.</p> <style>astro-island,astro-slot,astro-static-slot{display:contents}</style><script>(()=>{var a=(s,i,o)=>{let r=async()=>{await(await s())()},t=typeof i.value=="object"?i.value:void 0,c={rootMargin:t==null?void 0:t.rootMargin},n=new IntersectionObserver(e=>{for(let l of e)if(l.isIntersecting){n.disconnect(),r();break}},c);for(let e of o.children)n.observe(e)};(self.Astro||(self.Astro={})).visible=a;window.dispatchEvent(new Event("astro:visible"));})();</script><script>(()=>{var A=Object.defineProperty;var g=(i,o,a)=>o in i?A(i,o,{enumerable:!0,configurable:!0,writable:!0,value:a}):i[o]=a;var d=(i,o,a)=>g(i,typeof o!="symbol"?o+"":o,a);{let i={0:t=>m(t),1:t=>a(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(a(t)),5:t=>new Set(a(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t),11:t=>1/0*t},o=t=>{let[l,e]=t;return l in i?i[l](e):void 0},a=t=>t.map(o),m=t=>typeof t!="object"||t===null?t:Object.fromEntries(Object.entries(t).map(([l,e])=>[l,o(e)]));class y extends HTMLElement{constructor(){super(...arguments);d(this,"Component");d(this,"hydrator");d(this,"hydrate",async()=>{var b;if(!this.hydrator||!this.isConnected)return;let e=(b=this.parentElement)==null?void 0:b.closest("astro-island[ssr]");if(e){e.addEventListener("astro:hydrate",this.hydrate,{once:!0});return}let c=this.querySelectorAll("astro-slot"),n={},h=this.querySelectorAll("template[data-astro-template]");for(let r of h){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute("data-astro-template")||"default"]=r.innerHTML,r.remove())}for(let r of c){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute("name")||"default"]=r.innerHTML)}let p;try{p=this.hasAttribute("props")?m(JSON.parse(this.getAttribute("props"))):{}}catch(r){let s=this.getAttribute("component-url")||"<unknown>",v=this.getAttribute("component-export");throw v&&(s+=` (export ${v})`),console.error(`[hydrate] Error parsing props for component ${s}`,this.getAttribute("props"),r),r}let u;await this.hydrator(this)(this.Component,p,n,{client:this.getAttribute("client")}),this.removeAttribute("ssr"),this.dispatchEvent(new CustomEvent("astro:hydrate"))});d(this,"unmount",()=>{this.isConnected||this.dispatchEvent(new CustomEvent("astro:unmount"))})}disconnectedCallback(){document.removeEventListener("astro:after-swap",this.unmount),document.addEventListener("astro:after-swap",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute("await-children")||document.readyState==="interactive"||document.readyState==="complete")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener("DOMContentLoaded",e),c.disconnect(),this.childrenConnectedCallback()},c=new MutationObserver(()=>{var n;((n=this.lastChild)==null?void 0:n.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue==="astro:end"&&(this.lastChild.remove(),e())});c.observe(this,{childList:!0}),document.addEventListener("DOMContentLoaded",e)}}async childrenConnectedCallback(){let e=this.getAttribute("before-hydration-url");e&&await import(e),this.start()}async start(){let e=JSON.parse(this.getAttribute("opts")),c=this.getAttribute("client");if(Astro[c]===void 0){window.addEventListener(`astro:${c}`,()=>this.start(),{once:!0});return}try{await Astro[c](async()=>{let n=this.getAttribute("renderer-url"),[h,{default:p}]=await Promise.all([import(this.getAttribute("component-url")),n?import(n):()=>()=>{}]),u=this.getAttribute("component-export")||"default";if(!u.includes("."))this.Component=h[u];else{this.Component=h;for(let f of u.split("."))this.Component=this.Component[f]}return this.hydrator=p,this.hydrate},e,this)}catch(n){console.error(`[astro-island] Error hydrating ${this.getAttribute("component-url")}`,n)}}attributeChangedCallback(){this.hydrate()}}d(y,"observedAttributes",["props"]),customElements.get("astro-island")||customElements.define("astro-island",y)}})();</script><astro-island uid="1uCCsR" prefix="r1" component-url="/__pyric/ui/_astro/chess-source-explorer.C5k9c5yK.js" component-export="ChessSourceExplorer" renderer-url="/__pyric/ui/_astro/client.D2ORs4B-.js" props="{&quot;data-astro-cid-ghke3xma&quot;:[0,true]}" ssr client="visible" opts="{&quot;name&quot;:&quot;ChessSourceExplorer&quot;,&quot;value&quot;:true}" await-children><section class="source-explorer" aria-label="Chess Security Rules"><div class="source-toolbar"><strong>Security Rules</strong><button type="button" class="copy-source">Copy source</button></div><pre><code>rules_version = &#x27;2+modules&#x27;;
74
+ <p>The write contains the move and the next board state. After it commits, the browser derives checkmate from that board.</p>
75
+ <h2 id="test-specific-moves">Test specific moves</h2>
76
+ <p>After changing the Rules, the agent uses <code>firestore_simulate_rules</code> to try specific moves with a player and a board state. Stateful sandbox sessions run longer sequences. If a move is denied unexpectedly, <code>sandbox_inspect</code> shows the request, identity, active Rules, and denial.</p>
77
+ <p>The local suite covers allowed and denied geometry, blocked paths, captures, pins, check, turn ownership, resignation, and checkmate. It also checks that a rejected move leaves the Firestore document unchanged.</p>
78
+ <p>These checks happen in Pyric’s local development mirror. Important cases also run against a Firebase project before shipping.</p> </article> <section class="example-rules" data-astro-cid-ghke3xma> <h2 data-astro-cid-ghke3xma>Full Security Rules</h2> <p data-astro-cid-ghke3xma>These are the Rules running the board above. Look for the imports at the top, the separate <code data-astro-cid-ghke3xma>moveType</code> gates, and the explicit king-safety checks.</p> <section class="source-explorer" aria-label="Chess Security Rules" data-source="rules_version = '2+modules';
32
79
 
33
- import { isAuthenticated } from &#x27;auth&#x27;;
34
- import { validSimpleMove } from &#x27;geometry&#x27;;
35
- import { isPlaying, moveIncremented, participantsUnchanged } from &#x27;state&#x27;;
36
- import { isMyTurn, turnFlipped } from &#x27;turns&#x27;;
80
+ import { isAuthenticated } from 'auth';
81
+ import { validSimpleMove } from 'geometry';
82
+ import { isPlaying, moveIncremented, participantsUnchanged } from 'state';
83
+ import { isMyTurn, turnFlipped } from 'turns';
37
84
 
38
85
  service cloud.firestore {
39
86
  match /databases/{database}/documents {
@@ -44,15 +91,15 @@ service cloud.firestore {
44
91
 
45
92
  function isOwnPiece() {
46
93
  let piece = resource.data[request.resource.data.moveFrom];
47
- return (resource.data.currentTurn == &#x27;host&#x27;
48
- &amp;&amp; (piece == &#x27;K&#x27; || piece == &#x27;Q&#x27; || piece == &#x27;R&#x27; || piece == &#x27;B&#x27; || piece == &#x27;N&#x27; || piece == &#x27;P&#x27;))
49
- || (resource.data.currentTurn == &#x27;guest&#x27;
50
- &amp;&amp; (piece == &#x27;k&#x27; || piece == &#x27;q&#x27; || piece == &#x27;r&#x27; || piece == &#x27;b&#x27; || piece == &#x27;n&#x27; || piece == &#x27;p&#x27;));
94
+ return (resource.data.currentTurn == 'host'
95
+ &#38;&#38; (piece == 'K' || piece == 'Q' || piece == 'R' || piece == 'B' || piece == 'N' || piece == 'P'))
96
+ || (resource.data.currentTurn == 'guest'
97
+ &#38;&#38; (piece == 'k' || piece == 'q' || piece == 'r' || piece == 'b' || piece == 'n' || piece == 'p'));
51
98
  }
52
99
  function baseMoveChecks() {
53
- return isAuthenticated() &amp;&amp; isPlaying()
54
- &amp;&amp; isMyTurn() &amp;&amp; turnFlipped() &amp;&amp; isOwnPiece()
55
- &amp;&amp; moveIncremented() &amp;&amp; participantsUnchanged();
100
+ return isAuthenticated() &#38;&#38; isPlaying()
101
+ &#38;&#38; isMyTurn() &#38;&#38; turnFlipped() &#38;&#38; isOwnPiece()
102
+ &#38;&#38; moveIncremented() &#38;&#38; participantsUnchanged();
56
103
  }
57
104
 
58
105
  function validPieceMove() {
@@ -61,324 +108,676 @@ service cloud.firestore {
61
108
  let piece = resource.data[mf];
62
109
  let p = cfg().paths[mf][mt];
63
110
  return validSimpleMove(cfg())
64
- &amp;&amp; (cfg().pieceCategory[piece] == &#x27;jump&#x27;
65
- || ((p.len &lt; 1 || resource.data[p.c0] == &#x27;&#x27;)
66
- &amp;&amp; (p.len &lt; 2 || resource.data[p.c1] == &#x27;&#x27;)
67
- &amp;&amp; (p.len &lt; 3 || resource.data[p.c2] == &#x27;&#x27;)
68
- &amp;&amp; (p.len &lt; 4 || resource.data[p.c3] == &#x27;&#x27;)
69
- &amp;&amp; (p.len &lt; 5 || resource.data[p.c4] == &#x27;&#x27;)
70
- &amp;&amp; (p.len &lt; 6 || resource.data[p.c5] == &#x27;&#x27;)));
111
+ &#38;&#38; (cfg().pieceCategory[piece] == 'jump'
112
+ || ((p.len < 1 || resource.data[p.c0] == '')
113
+ &#38;&#38; (p.len < 2 || resource.data[p.c1] == '')
114
+ &#38;&#38; (p.len < 3 || resource.data[p.c2] == '')
115
+ &#38;&#38; (p.len < 4 || resource.data[p.c3] == '')
116
+ &#38;&#38; (p.len < 5 || resource.data[p.c4] == '')
117
+ &#38;&#38; (p.len < 6 || resource.data[p.c5] == '')));
71
118
  }
72
119
  function validPawnForward() {
73
120
  let mf = request.resource.data.moveFrom;
74
121
  let mt = request.resource.data.moveTo;
75
122
  let piece = resource.data[mf];
76
- return (piece == &#x27;P&#x27; || piece == &#x27;p&#x27;) &amp;&amp; mt in cfg().pawnForward[piece][mf] &amp;&amp; resource.data[mt] == &#x27;&#x27;;
123
+ return (piece == 'P' || piece == 'p') &#38;&#38; mt in cfg().pawnForward[piece][mf] &#38;&#38; resource.data[mt] == '';
77
124
  }
78
125
  function validPawnDouble() {
79
126
  let mf = request.resource.data.moveFrom;
80
127
  let mt = request.resource.data.moveTo;
81
128
  let piece = resource.data[mf];
82
- return (piece == &#x27;P&#x27; || piece == &#x27;p&#x27;)
83
- &amp;&amp; mf in cfg().pawnDouble[piece]
84
- &amp;&amp; cfg().pawnDouble[piece][mf].to == mt
85
- &amp;&amp; resource.data[mt] == &#x27;&#x27;
86
- &amp;&amp; resource.data[cfg().pawnDouble[piece][mf].between] == &#x27;&#x27;;
129
+ return (piece == 'P' || piece == 'p')
130
+ &#38;&#38; mf in cfg().pawnDouble[piece]
131
+ &#38;&#38; cfg().pawnDouble[piece][mf].to == mt
132
+ &#38;&#38; resource.data[mt] == ''
133
+ &#38;&#38; resource.data[cfg().pawnDouble[piece][mf].between] == '';
87
134
  }
88
135
  function validPawnCapture() {
89
136
  let mf = request.resource.data.moveFrom;
90
137
  let mt = request.resource.data.moveTo;
91
138
  let piece = resource.data[mf];
92
139
  let target = resource.data[mt];
93
- return (piece == &#x27;P&#x27; || piece == &#x27;p&#x27;)
94
- &amp;&amp; mt in cfg().pawnAttacks[piece][mf]
95
- &amp;&amp; target != &#x27;&#x27;
96
- &amp;&amp; ((piece == &#x27;P&#x27; &amp;&amp; (target == &#x27;k&#x27; || target == &#x27;q&#x27; || target == &#x27;r&#x27; || target == &#x27;b&#x27; || target == &#x27;n&#x27; || target == &#x27;p&#x27;))
97
- || (piece == &#x27;p&#x27; &amp;&amp; (target == &#x27;K&#x27; || target == &#x27;Q&#x27; || target == &#x27;R&#x27; || target == &#x27;B&#x27; || target == &#x27;N&#x27; || target == &#x27;P&#x27;)));
140
+ return (piece == 'P' || piece == 'p')
141
+ &#38;&#38; mt in cfg().pawnAttacks[piece][mf]
142
+ &#38;&#38; target != ''
143
+ &#38;&#38; ((piece == 'P' &#38;&#38; (target == 'k' || target == 'q' || target == 'r' || target == 'b' || target == 'n' || target == 'p'))
144
+ || (piece == 'p' &#38;&#38; (target == 'K' || target == 'Q' || target == 'R' || target == 'B' || target == 'N' || target == 'P')));
98
145
  }
99
146
  function validPromotion() {
100
147
  let mt = request.resource.data.moveTo;
101
148
  let piece = resource.data[request.resource.data.moveFrom];
102
149
  let pt = request.resource.data.promotedTo;
103
- return request.resource.data.moveType == &#x27;promotion&#x27;
104
- &amp;&amp; ((piece == &#x27;P&#x27; &amp;&amp; mt &gt;= &#x27;a8&#x27; &amp;&amp; mt &lt;= &#x27;h8&#x27; &amp;&amp; (pt == &#x27;Q&#x27; || pt == &#x27;R&#x27; || pt == &#x27;B&#x27; || pt == &#x27;N&#x27;))
105
- || (piece == &#x27;p&#x27; &amp;&amp; mt &gt;= &#x27;a1&#x27; &amp;&amp; mt &lt;= &#x27;h1&#x27; &amp;&amp; (pt == &#x27;q&#x27; || pt == &#x27;r&#x27; || pt == &#x27;b&#x27; || pt == &#x27;n&#x27;)));
150
+ return request.resource.data.moveType == 'promotion'
151
+ &#38;&#38; ((piece == 'P' &#38;&#38; mt >= 'a8' &#38;&#38; mt <= 'h8' &#38;&#38; (pt == 'Q' || pt == 'R' || pt == 'B' || pt == 'N'))
152
+ || (piece == 'p' &#38;&#38; mt >= 'a1' &#38;&#38; mt <= 'h1' &#38;&#38; (pt == 'q' || pt == 'r' || pt == 'b' || pt == 'n')));
106
153
  }
107
154
  function pieceMovedCorrectly() {
108
155
  let mf = request.resource.data.moveFrom;
109
156
  let mt = request.resource.data.moveTo;
110
157
  let piece = resource.data[mf];
111
- return request.resource.data[mf] == &#x27;&#x27;
112
- &amp;&amp; (request.resource.data.moveType != &#x27;promotion&#x27;
158
+ return request.resource.data[mf] == ''
159
+ &#38;&#38; (request.resource.data.moveType != 'promotion'
113
160
  ? request.resource.data[mt] == piece
114
161
  : request.resource.data[mt] == request.resource.data.promotedTo)
115
- &amp;&amp; resource.data[request.resource.data.movedPiece] == mf
116
- &amp;&amp; request.resource.data[request.resource.data.movedPiece] == mt;
162
+ &#38;&#38; resource.data[request.resource.data.movedPiece] == mf
163
+ &#38;&#38; request.resource.data[request.resource.data.movedPiece] == mt;
117
164
  }
118
165
  function captureValid() {
119
166
  let cp = request.resource.data.capturedPiece;
120
- return cp != &#x27;&#x27;
121
- &amp;&amp; resource.data[cp] == request.resource.data.moveTo
122
- &amp;&amp; request.resource.data[cp] == &#x27;&#x27;;
167
+ return cp != ''
168
+ &#38;&#38; resource.data[cp] == request.resource.data.moveTo
169
+ &#38;&#38; request.resource.data[cp] == '';
123
170
  }
124
171
  function validEnPassant() {
125
172
  let mf = request.resource.data.moveFrom;
126
173
  let mt = request.resource.data.moveTo;
127
174
  let piece = resource.data[mf];
128
- return (piece == &#x27;P&#x27; || piece == &#x27;p&#x27;)
129
- &amp;&amp; mt in cfg().pawnAttacks[piece][mf]
130
- &amp;&amp; resource.data[mt] == &#x27;&#x27;
131
- &amp;&amp; resource.data.lastDoublePawn == mt;
175
+ return (piece == 'P' || piece == 'p')
176
+ &#38;&#38; mt in cfg().pawnAttacks[piece][mf]
177
+ &#38;&#38; resource.data[mt] == ''
178
+ &#38;&#38; resource.data.lastDoublePawn == mt;
132
179
  }
133
180
  function validCastleKingside() {
134
181
  let turn = resource.data.currentTurn;
135
182
  let c = cfg().castling;
136
- let castle = turn == &#x27;host&#x27; ? c.wk : c.bk;
137
- let kingMoved = turn == &#x27;host&#x27; ? resource.data.hp_K_moved : resource.data.gp_k_moved;
138
- let rookMoved = turn == &#x27;host&#x27; ? resource.data.hp_R2_moved : resource.data.gp_r2_moved;
139
- return !kingMoved &amp;&amp; !rookMoved
140
- &amp;&amp; request.resource.data.moveFrom == castle.kingFrom
141
- &amp;&amp; request.resource.data.moveTo == castle.kingTo
142
- &amp;&amp; resource.data[castle.between[0]] == &#x27;&#x27;
143
- &amp;&amp; resource.data[castle.between[1]] == &#x27;&#x27;;
183
+ let castle = turn == 'host' ? c.wk : c.bk;
184
+ let kingMoved = turn == 'host' ? resource.data.hp_K_moved : resource.data.gp_k_moved;
185
+ let rookMoved = turn == 'host' ? resource.data.hp_R2_moved : resource.data.gp_r2_moved;
186
+ return !kingMoved &#38;&#38; !rookMoved
187
+ &#38;&#38; request.resource.data.moveFrom == castle.kingFrom
188
+ &#38;&#38; request.resource.data.moveTo == castle.kingTo
189
+ &#38;&#38; resource.data[castle.between[0]] == ''
190
+ &#38;&#38; resource.data[castle.between[1]] == '';
144
191
  }
145
192
  function validCastleQueenside() {
146
193
  let turn = resource.data.currentTurn;
147
194
  let c = cfg().castling;
148
- let castle = turn == &#x27;host&#x27; ? c.wq : c.bq;
149
- let kingMoved = turn == &#x27;host&#x27; ? resource.data.hp_K_moved : resource.data.gp_k_moved;
150
- let rookMoved = turn == &#x27;host&#x27; ? resource.data.hp_R1_moved : resource.data.gp_r1_moved;
151
- return !kingMoved &amp;&amp; !rookMoved
152
- &amp;&amp; request.resource.data.moveFrom == castle.kingFrom
153
- &amp;&amp; request.resource.data.moveTo == castle.kingTo
154
- &amp;&amp; resource.data[castle.between[0]] == &#x27;&#x27;
155
- &amp;&amp; resource.data[castle.between[1]] == &#x27;&#x27;
156
- &amp;&amp; resource.data[castle.between[2]] == &#x27;&#x27;;
195
+ let castle = turn == 'host' ? c.wq : c.bq;
196
+ let kingMoved = turn == 'host' ? resource.data.hp_K_moved : resource.data.gp_k_moved;
197
+ let rookMoved = turn == 'host' ? resource.data.hp_R1_moved : resource.data.gp_r1_moved;
198
+ return !kingMoved &#38;&#38; !rookMoved
199
+ &#38;&#38; request.resource.data.moveFrom == castle.kingFrom
200
+ &#38;&#38; request.resource.data.moveTo == castle.kingTo
201
+ &#38;&#38; resource.data[castle.between[0]] == ''
202
+ &#38;&#38; resource.data[castle.between[1]] == ''
203
+ &#38;&#38; resource.data[castle.between[2]] == '';
157
204
  }
158
205
 
159
206
  function hPC(cfg) {
160
207
  let b = request.resource.data;
161
208
  let ks = b.hp_K;
162
- return (b.gp_p1 != &#x27;&#x27; &amp;&amp; b[b.gp_p1] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.gp_p1]][b.gp_p1])
163
- || (b.gp_p2 != &#x27;&#x27; &amp;&amp; b[b.gp_p2] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.gp_p2]][b.gp_p2])
164
- || (b.gp_p3 != &#x27;&#x27; &amp;&amp; b[b.gp_p3] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.gp_p3]][b.gp_p3])
165
- || (b.gp_p4 != &#x27;&#x27; &amp;&amp; b[b.gp_p4] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.gp_p4]][b.gp_p4])
166
- || (b.gp_p5 != &#x27;&#x27; &amp;&amp; b[b.gp_p5] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.gp_p5]][b.gp_p5])
167
- || (b.gp_p6 != &#x27;&#x27; &amp;&amp; b[b.gp_p6] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.gp_p6]][b.gp_p6])
168
- || (b.gp_p7 != &#x27;&#x27; &amp;&amp; b[b.gp_p7] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.gp_p7]][b.gp_p7])
169
- || (b.gp_p8 != &#x27;&#x27; &amp;&amp; b[b.gp_p8] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.gp_p8]][b.gp_p8]);
209
+ return (b.gp_p1 != '' &#38;&#38; b[b.gp_p1] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.gp_p1]][b.gp_p1])
210
+ || (b.gp_p2 != '' &#38;&#38; b[b.gp_p2] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.gp_p2]][b.gp_p2])
211
+ || (b.gp_p3 != '' &#38;&#38; b[b.gp_p3] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.gp_p3]][b.gp_p3])
212
+ || (b.gp_p4 != '' &#38;&#38; b[b.gp_p4] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.gp_p4]][b.gp_p4])
213
+ || (b.gp_p5 != '' &#38;&#38; b[b.gp_p5] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.gp_p5]][b.gp_p5])
214
+ || (b.gp_p6 != '' &#38;&#38; b[b.gp_p6] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.gp_p6]][b.gp_p6])
215
+ || (b.gp_p7 != '' &#38;&#38; b[b.gp_p7] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.gp_p7]][b.gp_p7])
216
+ || (b.gp_p8 != '' &#38;&#38; b[b.gp_p8] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.gp_p8]][b.gp_p8]);
170
217
  }
171
218
  function hMC(cfg) {
172
219
  let b = request.resource.data;
173
220
  let ks = b.hp_K;
174
- return (b.gp_n1 != &#x27;&#x27; &amp;&amp; b[b.gp_n1] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.gp_n1]][b.gp_n1])
175
- || (b.gp_n2 != &#x27;&#x27; &amp;&amp; b[b.gp_n2] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.gp_n2]][b.gp_n2])
176
- || (b.gp_k != &#x27;&#x27; &amp;&amp; b[b.gp_k] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.gp_k]][b.gp_k]);
221
+ return (b.gp_n1 != '' &#38;&#38; b[b.gp_n1] != '' &#38;&#38; ks in cfg.moves[b[b.gp_n1]][b.gp_n1])
222
+ || (b.gp_n2 != '' &#38;&#38; b[b.gp_n2] != '' &#38;&#38; ks in cfg.moves[b[b.gp_n2]][b.gp_n2])
223
+ || (b.gp_k != '' &#38;&#38; b[b.gp_k] != '' &#38;&#38; ks in cfg.moves[b[b.gp_k]][b.gp_k]);
177
224
  }
178
225
  function hSC(cfg) {
179
226
  let b = request.resource.data;
180
227
  let ks = b.hp_K;
181
- return (b.gp_q != &#x27;&#x27; &amp;&amp; b[b.gp_q] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.gp_q]][b.gp_q]
182
- &amp;&amp; (cfg.paths[b.gp_q][ks].len &lt; 1 || b[cfg.paths[b.gp_q][ks].c0] == &#x27;&#x27;)
183
- &amp;&amp; (cfg.paths[b.gp_q][ks].len &lt; 2 || b[cfg.paths[b.gp_q][ks].c1] == &#x27;&#x27;)
184
- &amp;&amp; (cfg.paths[b.gp_q][ks].len &lt; 3 || b[cfg.paths[b.gp_q][ks].c2] == &#x27;&#x27;)
185
- &amp;&amp; (cfg.paths[b.gp_q][ks].len &lt; 4 || b[cfg.paths[b.gp_q][ks].c3] == &#x27;&#x27;)
186
- &amp;&amp; (cfg.paths[b.gp_q][ks].len &lt; 5 || b[cfg.paths[b.gp_q][ks].c4] == &#x27;&#x27;))
187
- || (b.gp_r1 != &#x27;&#x27; &amp;&amp; b[b.gp_r1] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.gp_r1]][b.gp_r1]
188
- &amp;&amp; (cfg.paths[b.gp_r1][ks].len &lt; 1 || b[cfg.paths[b.gp_r1][ks].c0] == &#x27;&#x27;)
189
- &amp;&amp; (cfg.paths[b.gp_r1][ks].len &lt; 2 || b[cfg.paths[b.gp_r1][ks].c1] == &#x27;&#x27;)
190
- &amp;&amp; (cfg.paths[b.gp_r1][ks].len &lt; 3 || b[cfg.paths[b.gp_r1][ks].c2] == &#x27;&#x27;)
191
- &amp;&amp; (cfg.paths[b.gp_r1][ks].len &lt; 4 || b[cfg.paths[b.gp_r1][ks].c3] == &#x27;&#x27;)
192
- &amp;&amp; (cfg.paths[b.gp_r1][ks].len &lt; 5 || b[cfg.paths[b.gp_r1][ks].c4] == &#x27;&#x27;))
193
- || (b.gp_r2 != &#x27;&#x27; &amp;&amp; b[b.gp_r2] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.gp_r2]][b.gp_r2]
194
- &amp;&amp; (cfg.paths[b.gp_r2][ks].len &lt; 1 || b[cfg.paths[b.gp_r2][ks].c0] == &#x27;&#x27;)
195
- &amp;&amp; (cfg.paths[b.gp_r2][ks].len &lt; 2 || b[cfg.paths[b.gp_r2][ks].c1] == &#x27;&#x27;)
196
- &amp;&amp; (cfg.paths[b.gp_r2][ks].len &lt; 3 || b[cfg.paths[b.gp_r2][ks].c2] == &#x27;&#x27;)
197
- &amp;&amp; (cfg.paths[b.gp_r2][ks].len &lt; 4 || b[cfg.paths[b.gp_r2][ks].c3] == &#x27;&#x27;)
198
- &amp;&amp; (cfg.paths[b.gp_r2][ks].len &lt; 5 || b[cfg.paths[b.gp_r2][ks].c4] == &#x27;&#x27;))
199
- || (b.gp_b1 != &#x27;&#x27; &amp;&amp; b[b.gp_b1] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.gp_b1]][b.gp_b1]
200
- &amp;&amp; (cfg.paths[b.gp_b1][ks].len &lt; 1 || b[cfg.paths[b.gp_b1][ks].c0] == &#x27;&#x27;)
201
- &amp;&amp; (cfg.paths[b.gp_b1][ks].len &lt; 2 || b[cfg.paths[b.gp_b1][ks].c1] == &#x27;&#x27;)
202
- &amp;&amp; (cfg.paths[b.gp_b1][ks].len &lt; 3 || b[cfg.paths[b.gp_b1][ks].c2] == &#x27;&#x27;)
203
- &amp;&amp; (cfg.paths[b.gp_b1][ks].len &lt; 4 || b[cfg.paths[b.gp_b1][ks].c3] == &#x27;&#x27;)
204
- &amp;&amp; (cfg.paths[b.gp_b1][ks].len &lt; 5 || b[cfg.paths[b.gp_b1][ks].c4] == &#x27;&#x27;))
205
- || (b.gp_b2 != &#x27;&#x27; &amp;&amp; b[b.gp_b2] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.gp_b2]][b.gp_b2]
206
- &amp;&amp; (cfg.paths[b.gp_b2][ks].len &lt; 1 || b[cfg.paths[b.gp_b2][ks].c0] == &#x27;&#x27;)
207
- &amp;&amp; (cfg.paths[b.gp_b2][ks].len &lt; 2 || b[cfg.paths[b.gp_b2][ks].c1] == &#x27;&#x27;)
208
- &amp;&amp; (cfg.paths[b.gp_b2][ks].len &lt; 3 || b[cfg.paths[b.gp_b2][ks].c2] == &#x27;&#x27;)
209
- &amp;&amp; (cfg.paths[b.gp_b2][ks].len &lt; 4 || b[cfg.paths[b.gp_b2][ks].c3] == &#x27;&#x27;)
210
- &amp;&amp; (cfg.paths[b.gp_b2][ks].len &lt; 5 || b[cfg.paths[b.gp_b2][ks].c4] == &#x27;&#x27;));
228
+ return (b.gp_q != '' &#38;&#38; b[b.gp_q] != '' &#38;&#38; ks in cfg.moves[b[b.gp_q]][b.gp_q]
229
+ &#38;&#38; (cfg.paths[b.gp_q][ks].len < 1 || b[cfg.paths[b.gp_q][ks].c0] == '')
230
+ &#38;&#38; (cfg.paths[b.gp_q][ks].len < 2 || b[cfg.paths[b.gp_q][ks].c1] == '')
231
+ &#38;&#38; (cfg.paths[b.gp_q][ks].len < 3 || b[cfg.paths[b.gp_q][ks].c2] == '')
232
+ &#38;&#38; (cfg.paths[b.gp_q][ks].len < 4 || b[cfg.paths[b.gp_q][ks].c3] == '')
233
+ &#38;&#38; (cfg.paths[b.gp_q][ks].len < 5 || b[cfg.paths[b.gp_q][ks].c4] == ''))
234
+ || (b.gp_r1 != '' &#38;&#38; b[b.gp_r1] != '' &#38;&#38; ks in cfg.moves[b[b.gp_r1]][b.gp_r1]
235
+ &#38;&#38; (cfg.paths[b.gp_r1][ks].len < 1 || b[cfg.paths[b.gp_r1][ks].c0] == '')
236
+ &#38;&#38; (cfg.paths[b.gp_r1][ks].len < 2 || b[cfg.paths[b.gp_r1][ks].c1] == '')
237
+ &#38;&#38; (cfg.paths[b.gp_r1][ks].len < 3 || b[cfg.paths[b.gp_r1][ks].c2] == '')
238
+ &#38;&#38; (cfg.paths[b.gp_r1][ks].len < 4 || b[cfg.paths[b.gp_r1][ks].c3] == '')
239
+ &#38;&#38; (cfg.paths[b.gp_r1][ks].len < 5 || b[cfg.paths[b.gp_r1][ks].c4] == ''))
240
+ || (b.gp_r2 != '' &#38;&#38; b[b.gp_r2] != '' &#38;&#38; ks in cfg.moves[b[b.gp_r2]][b.gp_r2]
241
+ &#38;&#38; (cfg.paths[b.gp_r2][ks].len < 1 || b[cfg.paths[b.gp_r2][ks].c0] == '')
242
+ &#38;&#38; (cfg.paths[b.gp_r2][ks].len < 2 || b[cfg.paths[b.gp_r2][ks].c1] == '')
243
+ &#38;&#38; (cfg.paths[b.gp_r2][ks].len < 3 || b[cfg.paths[b.gp_r2][ks].c2] == '')
244
+ &#38;&#38; (cfg.paths[b.gp_r2][ks].len < 4 || b[cfg.paths[b.gp_r2][ks].c3] == '')
245
+ &#38;&#38; (cfg.paths[b.gp_r2][ks].len < 5 || b[cfg.paths[b.gp_r2][ks].c4] == ''))
246
+ || (b.gp_b1 != '' &#38;&#38; b[b.gp_b1] != '' &#38;&#38; ks in cfg.moves[b[b.gp_b1]][b.gp_b1]
247
+ &#38;&#38; (cfg.paths[b.gp_b1][ks].len < 1 || b[cfg.paths[b.gp_b1][ks].c0] == '')
248
+ &#38;&#38; (cfg.paths[b.gp_b1][ks].len < 2 || b[cfg.paths[b.gp_b1][ks].c1] == '')
249
+ &#38;&#38; (cfg.paths[b.gp_b1][ks].len < 3 || b[cfg.paths[b.gp_b1][ks].c2] == '')
250
+ &#38;&#38; (cfg.paths[b.gp_b1][ks].len < 4 || b[cfg.paths[b.gp_b1][ks].c3] == '')
251
+ &#38;&#38; (cfg.paths[b.gp_b1][ks].len < 5 || b[cfg.paths[b.gp_b1][ks].c4] == ''))
252
+ || (b.gp_b2 != '' &#38;&#38; b[b.gp_b2] != '' &#38;&#38; ks in cfg.moves[b[b.gp_b2]][b.gp_b2]
253
+ &#38;&#38; (cfg.paths[b.gp_b2][ks].len < 1 || b[cfg.paths[b.gp_b2][ks].c0] == '')
254
+ &#38;&#38; (cfg.paths[b.gp_b2][ks].len < 2 || b[cfg.paths[b.gp_b2][ks].c1] == '')
255
+ &#38;&#38; (cfg.paths[b.gp_b2][ks].len < 3 || b[cfg.paths[b.gp_b2][ks].c2] == '')
256
+ &#38;&#38; (cfg.paths[b.gp_b2][ks].len < 4 || b[cfg.paths[b.gp_b2][ks].c3] == '')
257
+ &#38;&#38; (cfg.paths[b.gp_b2][ks].len < 5 || b[cfg.paths[b.gp_b2][ks].c4] == ''));
211
258
  }
212
259
  function gPC(cfg) {
213
260
  let b = request.resource.data;
214
261
  let ks = b.gp_k;
215
- return (b.hp_P1 != &#x27;&#x27; &amp;&amp; b[b.hp_P1] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.hp_P1]][b.hp_P1])
216
- || (b.hp_P2 != &#x27;&#x27; &amp;&amp; b[b.hp_P2] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.hp_P2]][b.hp_P2])
217
- || (b.hp_P3 != &#x27;&#x27; &amp;&amp; b[b.hp_P3] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.hp_P3]][b.hp_P3])
218
- || (b.hp_P4 != &#x27;&#x27; &amp;&amp; b[b.hp_P4] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.hp_P4]][b.hp_P4])
219
- || (b.hp_P5 != &#x27;&#x27; &amp;&amp; b[b.hp_P5] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.hp_P5]][b.hp_P5])
220
- || (b.hp_P6 != &#x27;&#x27; &amp;&amp; b[b.hp_P6] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.hp_P6]][b.hp_P6])
221
- || (b.hp_P7 != &#x27;&#x27; &amp;&amp; b[b.hp_P7] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.hp_P7]][b.hp_P7])
222
- || (b.hp_P8 != &#x27;&#x27; &amp;&amp; b[b.hp_P8] != &#x27;&#x27; &amp;&amp; ks in cfg.pawnAttacks[b[b.hp_P8]][b.hp_P8]);
262
+ return (b.hp_P1 != '' &#38;&#38; b[b.hp_P1] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.hp_P1]][b.hp_P1])
263
+ || (b.hp_P2 != '' &#38;&#38; b[b.hp_P2] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.hp_P2]][b.hp_P2])
264
+ || (b.hp_P3 != '' &#38;&#38; b[b.hp_P3] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.hp_P3]][b.hp_P3])
265
+ || (b.hp_P4 != '' &#38;&#38; b[b.hp_P4] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.hp_P4]][b.hp_P4])
266
+ || (b.hp_P5 != '' &#38;&#38; b[b.hp_P5] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.hp_P5]][b.hp_P5])
267
+ || (b.hp_P6 != '' &#38;&#38; b[b.hp_P6] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.hp_P6]][b.hp_P6])
268
+ || (b.hp_P7 != '' &#38;&#38; b[b.hp_P7] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.hp_P7]][b.hp_P7])
269
+ || (b.hp_P8 != '' &#38;&#38; b[b.hp_P8] != '' &#38;&#38; ks in cfg.pawnAttacks[b[b.hp_P8]][b.hp_P8]);
223
270
  }
224
271
  function gMC(cfg) {
225
272
  let b = request.resource.data;
226
273
  let ks = b.gp_k;
227
- return (b.hp_N1 != &#x27;&#x27; &amp;&amp; b[b.hp_N1] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.hp_N1]][b.hp_N1])
228
- || (b.hp_N2 != &#x27;&#x27; &amp;&amp; b[b.hp_N2] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.hp_N2]][b.hp_N2])
229
- || (b.hp_K != &#x27;&#x27; &amp;&amp; b[b.hp_K] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.hp_K]][b.hp_K]);
274
+ return (b.hp_N1 != '' &#38;&#38; b[b.hp_N1] != '' &#38;&#38; ks in cfg.moves[b[b.hp_N1]][b.hp_N1])
275
+ || (b.hp_N2 != '' &#38;&#38; b[b.hp_N2] != '' &#38;&#38; ks in cfg.moves[b[b.hp_N2]][b.hp_N2])
276
+ || (b.hp_K != '' &#38;&#38; b[b.hp_K] != '' &#38;&#38; ks in cfg.moves[b[b.hp_K]][b.hp_K]);
230
277
  }
231
278
  function gSC(cfg) {
232
279
  let b = request.resource.data;
233
280
  let ks = b.gp_k;
234
- return (b.hp_Q != &#x27;&#x27; &amp;&amp; b[b.hp_Q] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.hp_Q]][b.hp_Q]
235
- &amp;&amp; (cfg.paths[b.hp_Q][ks].len &lt; 1 || b[cfg.paths[b.hp_Q][ks].c0] == &#x27;&#x27;)
236
- &amp;&amp; (cfg.paths[b.hp_Q][ks].len &lt; 2 || b[cfg.paths[b.hp_Q][ks].c1] == &#x27;&#x27;)
237
- &amp;&amp; (cfg.paths[b.hp_Q][ks].len &lt; 3 || b[cfg.paths[b.hp_Q][ks].c2] == &#x27;&#x27;)
238
- &amp;&amp; (cfg.paths[b.hp_Q][ks].len &lt; 4 || b[cfg.paths[b.hp_Q][ks].c3] == &#x27;&#x27;)
239
- &amp;&amp; (cfg.paths[b.hp_Q][ks].len &lt; 5 || b[cfg.paths[b.hp_Q][ks].c4] == &#x27;&#x27;))
240
- || (b.hp_R1 != &#x27;&#x27; &amp;&amp; b[b.hp_R1] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.hp_R1]][b.hp_R1]
241
- &amp;&amp; (cfg.paths[b.hp_R1][ks].len &lt; 1 || b[cfg.paths[b.hp_R1][ks].c0] == &#x27;&#x27;)
242
- &amp;&amp; (cfg.paths[b.hp_R1][ks].len &lt; 2 || b[cfg.paths[b.hp_R1][ks].c1] == &#x27;&#x27;)
243
- &amp;&amp; (cfg.paths[b.hp_R1][ks].len &lt; 3 || b[cfg.paths[b.hp_R1][ks].c2] == &#x27;&#x27;)
244
- &amp;&amp; (cfg.paths[b.hp_R1][ks].len &lt; 4 || b[cfg.paths[b.hp_R1][ks].c3] == &#x27;&#x27;)
245
- &amp;&amp; (cfg.paths[b.hp_R1][ks].len &lt; 5 || b[cfg.paths[b.hp_R1][ks].c4] == &#x27;&#x27;))
246
- || (b.hp_R2 != &#x27;&#x27; &amp;&amp; b[b.hp_R2] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.hp_R2]][b.hp_R2]
247
- &amp;&amp; (cfg.paths[b.hp_R2][ks].len &lt; 1 || b[cfg.paths[b.hp_R2][ks].c0] == &#x27;&#x27;)
248
- &amp;&amp; (cfg.paths[b.hp_R2][ks].len &lt; 2 || b[cfg.paths[b.hp_R2][ks].c1] == &#x27;&#x27;)
249
- &amp;&amp; (cfg.paths[b.hp_R2][ks].len &lt; 3 || b[cfg.paths[b.hp_R2][ks].c2] == &#x27;&#x27;)
250
- &amp;&amp; (cfg.paths[b.hp_R2][ks].len &lt; 4 || b[cfg.paths[b.hp_R2][ks].c3] == &#x27;&#x27;)
251
- &amp;&amp; (cfg.paths[b.hp_R2][ks].len &lt; 5 || b[cfg.paths[b.hp_R2][ks].c4] == &#x27;&#x27;))
252
- || (b.hp_B1 != &#x27;&#x27; &amp;&amp; b[b.hp_B1] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.hp_B1]][b.hp_B1]
253
- &amp;&amp; (cfg.paths[b.hp_B1][ks].len &lt; 1 || b[cfg.paths[b.hp_B1][ks].c0] == &#x27;&#x27;)
254
- &amp;&amp; (cfg.paths[b.hp_B1][ks].len &lt; 2 || b[cfg.paths[b.hp_B1][ks].c1] == &#x27;&#x27;)
255
- &amp;&amp; (cfg.paths[b.hp_B1][ks].len &lt; 3 || b[cfg.paths[b.hp_B1][ks].c2] == &#x27;&#x27;)
256
- &amp;&amp; (cfg.paths[b.hp_B1][ks].len &lt; 4 || b[cfg.paths[b.hp_B1][ks].c3] == &#x27;&#x27;)
257
- &amp;&amp; (cfg.paths[b.hp_B1][ks].len &lt; 5 || b[cfg.paths[b.hp_B1][ks].c4] == &#x27;&#x27;))
258
- || (b.hp_B2 != &#x27;&#x27; &amp;&amp; b[b.hp_B2] != &#x27;&#x27; &amp;&amp; ks in cfg.moves[b[b.hp_B2]][b.hp_B2]
259
- &amp;&amp; (cfg.paths[b.hp_B2][ks].len &lt; 1 || b[cfg.paths[b.hp_B2][ks].c0] == &#x27;&#x27;)
260
- &amp;&amp; (cfg.paths[b.hp_B2][ks].len &lt; 2 || b[cfg.paths[b.hp_B2][ks].c1] == &#x27;&#x27;)
261
- &amp;&amp; (cfg.paths[b.hp_B2][ks].len &lt; 3 || b[cfg.paths[b.hp_B2][ks].c2] == &#x27;&#x27;)
262
- &amp;&amp; (cfg.paths[b.hp_B2][ks].len &lt; 4 || b[cfg.paths[b.hp_B2][ks].c3] == &#x27;&#x27;)
263
- &amp;&amp; (cfg.paths[b.hp_B2][ks].len &lt; 5 || b[cfg.paths[b.hp_B2][ks].c4] == &#x27;&#x27;));
281
+ return (b.hp_Q != '' &#38;&#38; b[b.hp_Q] != '' &#38;&#38; ks in cfg.moves[b[b.hp_Q]][b.hp_Q]
282
+ &#38;&#38; (cfg.paths[b.hp_Q][ks].len < 1 || b[cfg.paths[b.hp_Q][ks].c0] == '')
283
+ &#38;&#38; (cfg.paths[b.hp_Q][ks].len < 2 || b[cfg.paths[b.hp_Q][ks].c1] == '')
284
+ &#38;&#38; (cfg.paths[b.hp_Q][ks].len < 3 || b[cfg.paths[b.hp_Q][ks].c2] == '')
285
+ &#38;&#38; (cfg.paths[b.hp_Q][ks].len < 4 || b[cfg.paths[b.hp_Q][ks].c3] == '')
286
+ &#38;&#38; (cfg.paths[b.hp_Q][ks].len < 5 || b[cfg.paths[b.hp_Q][ks].c4] == ''))
287
+ || (b.hp_R1 != '' &#38;&#38; b[b.hp_R1] != '' &#38;&#38; ks in cfg.moves[b[b.hp_R1]][b.hp_R1]
288
+ &#38;&#38; (cfg.paths[b.hp_R1][ks].len < 1 || b[cfg.paths[b.hp_R1][ks].c0] == '')
289
+ &#38;&#38; (cfg.paths[b.hp_R1][ks].len < 2 || b[cfg.paths[b.hp_R1][ks].c1] == '')
290
+ &#38;&#38; (cfg.paths[b.hp_R1][ks].len < 3 || b[cfg.paths[b.hp_R1][ks].c2] == '')
291
+ &#38;&#38; (cfg.paths[b.hp_R1][ks].len < 4 || b[cfg.paths[b.hp_R1][ks].c3] == '')
292
+ &#38;&#38; (cfg.paths[b.hp_R1][ks].len < 5 || b[cfg.paths[b.hp_R1][ks].c4] == ''))
293
+ || (b.hp_R2 != '' &#38;&#38; b[b.hp_R2] != '' &#38;&#38; ks in cfg.moves[b[b.hp_R2]][b.hp_R2]
294
+ &#38;&#38; (cfg.paths[b.hp_R2][ks].len < 1 || b[cfg.paths[b.hp_R2][ks].c0] == '')
295
+ &#38;&#38; (cfg.paths[b.hp_R2][ks].len < 2 || b[cfg.paths[b.hp_R2][ks].c1] == '')
296
+ &#38;&#38; (cfg.paths[b.hp_R2][ks].len < 3 || b[cfg.paths[b.hp_R2][ks].c2] == '')
297
+ &#38;&#38; (cfg.paths[b.hp_R2][ks].len < 4 || b[cfg.paths[b.hp_R2][ks].c3] == '')
298
+ &#38;&#38; (cfg.paths[b.hp_R2][ks].len < 5 || b[cfg.paths[b.hp_R2][ks].c4] == ''))
299
+ || (b.hp_B1 != '' &#38;&#38; b[b.hp_B1] != '' &#38;&#38; ks in cfg.moves[b[b.hp_B1]][b.hp_B1]
300
+ &#38;&#38; (cfg.paths[b.hp_B1][ks].len < 1 || b[cfg.paths[b.hp_B1][ks].c0] == '')
301
+ &#38;&#38; (cfg.paths[b.hp_B1][ks].len < 2 || b[cfg.paths[b.hp_B1][ks].c1] == '')
302
+ &#38;&#38; (cfg.paths[b.hp_B1][ks].len < 3 || b[cfg.paths[b.hp_B1][ks].c2] == '')
303
+ &#38;&#38; (cfg.paths[b.hp_B1][ks].len < 4 || b[cfg.paths[b.hp_B1][ks].c3] == '')
304
+ &#38;&#38; (cfg.paths[b.hp_B1][ks].len < 5 || b[cfg.paths[b.hp_B1][ks].c4] == ''))
305
+ || (b.hp_B2 != '' &#38;&#38; b[b.hp_B2] != '' &#38;&#38; ks in cfg.moves[b[b.hp_B2]][b.hp_B2]
306
+ &#38;&#38; (cfg.paths[b.hp_B2][ks].len < 1 || b[cfg.paths[b.hp_B2][ks].c0] == '')
307
+ &#38;&#38; (cfg.paths[b.hp_B2][ks].len < 2 || b[cfg.paths[b.hp_B2][ks].c1] == '')
308
+ &#38;&#38; (cfg.paths[b.hp_B2][ks].len < 3 || b[cfg.paths[b.hp_B2][ks].c2] == '')
309
+ &#38;&#38; (cfg.paths[b.hp_B2][ks].len < 4 || b[cfg.paths[b.hp_B2][ks].c3] == '')
310
+ &#38;&#38; (cfg.paths[b.hp_B2][ks].len < 5 || b[cfg.paths[b.hp_B2][ks].c4] == ''));
264
311
  }
265
312
 
266
313
  function myKingSafe() {
267
314
  let c = cfg();
268
- return (resource.data.currentTurn == &#x27;host&#x27; &amp;&amp; !hPC(c) &amp;&amp; !hMC(c) &amp;&amp; !hSC(c))
269
- || (resource.data.currentTurn == &#x27;guest&#x27; &amp;&amp; !gPC(c) &amp;&amp; !gMC(c) &amp;&amp; !gSC(c));
315
+ return (resource.data.currentTurn == 'host' &#38;&#38; !hPC(c) &#38;&#38; !hMC(c) &#38;&#38; !hSC(c))
316
+ || (resource.data.currentTurn == 'guest' &#38;&#38; !gPC(c) &#38;&#38; !gMC(c) &#38;&#38; !gSC(c));
270
317
  }
271
318
  function opponentInCheck() {
272
319
  let c = cfg();
273
- return (resource.data.currentTurn == &#x27;host&#x27; &amp;&amp; (gPC(c) || gMC(c) || gSC(c)))
274
- || (resource.data.currentTurn == &#x27;guest&#x27; &amp;&amp; (hPC(c) || hMC(c) || hSC(c)));
320
+ return (resource.data.currentTurn == 'host' &#38;&#38; (gPC(c) || gMC(c) || gSC(c)))
321
+ || (resource.data.currentTurn == 'guest' &#38;&#38; (hPC(c) || hMC(c) || hSC(c)));
275
322
  }
276
323
 
277
324
  // ═══ Lobby ═══
278
325
  allow read: if request.auth != null;
279
326
  allow create: if request.auth != null
280
- &amp;&amp; request.resource.data.host == request.auth.uid
281
- &amp;&amp; request.resource.data.status == &#x27;waiting&#x27;
282
- &amp;&amp; d.a1 == &#x27;R&#x27;
283
- &amp;&amp; d.a2 == &#x27;P&#x27;
284
- &amp;&amp; d.a7 == &#x27;p&#x27;
285
- &amp;&amp; d.a8 == &#x27;r&#x27;
286
- &amp;&amp; d.b1 == &#x27;N&#x27;
287
- &amp;&amp; d.b2 == &#x27;P&#x27;
288
- &amp;&amp; d.b7 == &#x27;p&#x27;
289
- &amp;&amp; d.b8 == &#x27;n&#x27;
290
- &amp;&amp; d.c1 == &#x27;B&#x27;
291
- &amp;&amp; d.c2 == &#x27;P&#x27;
292
- &amp;&amp; d.c7 == &#x27;p&#x27;
293
- &amp;&amp; d.c8 == &#x27;b&#x27;
294
- &amp;&amp; d.d1 == &#x27;Q&#x27;
295
- &amp;&amp; d.d2 == &#x27;P&#x27;
296
- &amp;&amp; d.d7 == &#x27;p&#x27;
297
- &amp;&amp; d.d8 == &#x27;q&#x27;
298
- &amp;&amp; d.e1 == &#x27;K&#x27;
299
- &amp;&amp; d.e2 == &#x27;P&#x27;
300
- &amp;&amp; d.e7 == &#x27;p&#x27;
301
- &amp;&amp; d.e8 == &#x27;k&#x27;
302
- &amp;&amp; d.f1 == &#x27;B&#x27;
303
- &amp;&amp; d.f2 == &#x27;P&#x27;
304
- &amp;&amp; d.f7 == &#x27;p&#x27;
305
- &amp;&amp; d.f8 == &#x27;b&#x27;
306
- &amp;&amp; d.g1 == &#x27;N&#x27;
307
- &amp;&amp; d.g2 == &#x27;P&#x27;
308
- &amp;&amp; d.g7 == &#x27;p&#x27;
309
- &amp;&amp; d.g8 == &#x27;n&#x27;
310
- &amp;&amp; d.h1 == &#x27;R&#x27;
311
- &amp;&amp; d.h2 == &#x27;P&#x27;
312
- &amp;&amp; d.h7 == &#x27;p&#x27;
313
- &amp;&amp; d.h8 == &#x27;r&#x27;;
327
+ &#38;&#38; request.resource.data.host == request.auth.uid
328
+ &#38;&#38; request.resource.data.status == 'waiting'
329
+ &#38;&#38; d.a1 == 'R'
330
+ &#38;&#38; d.a2 == 'P'
331
+ &#38;&#38; d.a7 == 'p'
332
+ &#38;&#38; d.a8 == 'r'
333
+ &#38;&#38; d.b1 == 'N'
334
+ &#38;&#38; d.b2 == 'P'
335
+ &#38;&#38; d.b7 == 'p'
336
+ &#38;&#38; d.b8 == 'n'
337
+ &#38;&#38; d.c1 == 'B'
338
+ &#38;&#38; d.c2 == 'P'
339
+ &#38;&#38; d.c7 == 'p'
340
+ &#38;&#38; d.c8 == 'b'
341
+ &#38;&#38; d.d1 == 'Q'
342
+ &#38;&#38; d.d2 == 'P'
343
+ &#38;&#38; d.d7 == 'p'
344
+ &#38;&#38; d.d8 == 'q'
345
+ &#38;&#38; d.e1 == 'K'
346
+ &#38;&#38; d.e2 == 'P'
347
+ &#38;&#38; d.e7 == 'p'
348
+ &#38;&#38; d.e8 == 'k'
349
+ &#38;&#38; d.f1 == 'B'
350
+ &#38;&#38; d.f2 == 'P'
351
+ &#38;&#38; d.f7 == 'p'
352
+ &#38;&#38; d.f8 == 'b'
353
+ &#38;&#38; d.g1 == 'N'
354
+ &#38;&#38; d.g2 == 'P'
355
+ &#38;&#38; d.g7 == 'p'
356
+ &#38;&#38; d.g8 == 'n'
357
+ &#38;&#38; d.h1 == 'R'
358
+ &#38;&#38; d.h2 == 'P'
359
+ &#38;&#38; d.h7 == 'p'
360
+ &#38;&#38; d.h8 == 'r';
314
361
  allow update: if request.auth != null
315
- &amp;&amp; resource.data.status == &#x27;waiting&#x27;
316
- &amp;&amp; resource.data.guest == &#x27;&#x27;
317
- &amp;&amp; request.resource.data.guest == request.auth.uid
318
- &amp;&amp; request.auth.uid != resource.data.host
319
- &amp;&amp; request.resource.data.status == &#x27;playing&#x27;
320
- &amp;&amp; request.resource.data.diff(resource.data).affectedKeys().hasOnly([&#x27;guest&#x27;, &#x27;status&#x27;]);
362
+ &#38;&#38; resource.data.status == 'waiting'
363
+ &#38;&#38; resource.data.guest == ''
364
+ &#38;&#38; request.resource.data.guest == request.auth.uid
365
+ &#38;&#38; request.auth.uid != resource.data.host
366
+ &#38;&#38; request.resource.data.status == 'playing'
367
+ &#38;&#38; request.resource.data.diff(resource.data).affectedKeys().hasOnly(['guest', 'status']);
321
368
  allow delete: if request.auth != null
322
- &amp;&amp; resource.data.status == &#x27;waiting&#x27;
323
- &amp;&amp; request.auth.uid == resource.data.host;
369
+ &#38;&#38; resource.data.status == 'waiting'
370
+ &#38;&#38; request.auth.uid == resource.data.host;
324
371
 
325
372
  // ═══ UNIQUE moveType gates — each rule category has its own ═══
326
373
  // Pawn forward
327
- allow update: if request.resource.data.moveType == &#x27;pawn_forward&#x27;
328
- &amp;&amp; request.resource.data.capturedPiece == &#x27;&#x27; &amp;&amp; request.resource.data.status == &#x27;playing&#x27;
329
- &amp;&amp; baseMoveChecks() &amp;&amp; validPawnForward() &amp;&amp; request.resource.data.promotedTo == &#x27;&#x27;
330
- &amp;&amp; pieceMovedCorrectly() &amp;&amp; myKingSafe();
374
+ allow update: if request.resource.data.moveType == 'pawn_forward'
375
+ &#38;&#38; request.resource.data.capturedPiece == '' &#38;&#38; request.resource.data.status == 'playing'
376
+ &#38;&#38; baseMoveChecks() &#38;&#38; validPawnForward() &#38;&#38; request.resource.data.promotedTo == ''
377
+ &#38;&#38; pieceMovedCorrectly() &#38;&#38; myKingSafe();
331
378
  // Pawn capture
332
- allow update: if request.resource.data.moveType == &#x27;pawn_capture&#x27;
333
- &amp;&amp; request.resource.data.capturedPiece != &#x27;&#x27; &amp;&amp; request.resource.data.status == &#x27;playing&#x27;
334
- &amp;&amp; baseMoveChecks() &amp;&amp; validPawnCapture() &amp;&amp; request.resource.data.promotedTo == &#x27;&#x27;
335
- &amp;&amp; captureValid() &amp;&amp; pieceMovedCorrectly() &amp;&amp; myKingSafe();
379
+ allow update: if request.resource.data.moveType == 'pawn_capture'
380
+ &#38;&#38; request.resource.data.capturedPiece != '' &#38;&#38; request.resource.data.status == 'playing'
381
+ &#38;&#38; baseMoveChecks() &#38;&#38; validPawnCapture() &#38;&#38; request.resource.data.promotedTo == ''
382
+ &#38;&#38; captureValid() &#38;&#38; pieceMovedCorrectly() &#38;&#38; myKingSafe();
336
383
  // Pawn double
337
- allow update: if request.resource.data.moveType == &#x27;double_pawn&#x27;
338
- &amp;&amp; request.resource.data.capturedPiece == &#x27;&#x27; &amp;&amp; request.resource.data.status == &#x27;playing&#x27;
339
- &amp;&amp; baseMoveChecks() &amp;&amp; validPawnDouble() &amp;&amp; pieceMovedCorrectly() &amp;&amp; myKingSafe();
384
+ allow update: if request.resource.data.moveType == 'double_pawn'
385
+ &#38;&#38; request.resource.data.capturedPiece == '' &#38;&#38; request.resource.data.status == 'playing'
386
+ &#38;&#38; baseMoveChecks() &#38;&#38; validPawnDouble() &#38;&#38; pieceMovedCorrectly() &#38;&#38; myKingSafe();
340
387
  // Promotion (forward)
341
- allow update: if request.resource.data.moveType == &#x27;promotion&#x27;
342
- &amp;&amp; request.resource.data.capturedPiece == &#x27;&#x27; &amp;&amp; request.resource.data.status == &#x27;playing&#x27;
343
- &amp;&amp; baseMoveChecks() &amp;&amp; validPawnForward() &amp;&amp; validPromotion() &amp;&amp; pieceMovedCorrectly() &amp;&amp; myKingSafe();
388
+ allow update: if request.resource.data.moveType == 'promotion'
389
+ &#38;&#38; request.resource.data.capturedPiece == '' &#38;&#38; request.resource.data.status == 'playing'
390
+ &#38;&#38; baseMoveChecks() &#38;&#38; validPawnForward() &#38;&#38; validPromotion() &#38;&#38; pieceMovedCorrectly() &#38;&#38; myKingSafe();
344
391
  // Promotion (capture)
345
- allow update: if request.resource.data.moveType == &#x27;promotion_capture&#x27;
346
- &amp;&amp; request.resource.data.capturedPiece != &#x27;&#x27; &amp;&amp; request.resource.data.status == &#x27;playing&#x27;
347
- &amp;&amp; baseMoveChecks() &amp;&amp; validPawnCapture() &amp;&amp; validPromotion() &amp;&amp; captureValid() &amp;&amp; pieceMovedCorrectly() &amp;&amp; myKingSafe();
392
+ allow update: if request.resource.data.moveType == 'promotion_capture'
393
+ &#38;&#38; request.resource.data.capturedPiece != '' &#38;&#38; request.resource.data.status == 'playing'
394
+ &#38;&#38; baseMoveChecks() &#38;&#38; validPawnCapture() &#38;&#38; validPromotion() &#38;&#38; captureValid() &#38;&#38; pieceMovedCorrectly() &#38;&#38; myKingSafe();
348
395
  // En passant
349
- allow update: if request.resource.data.moveType == &#x27;en_passant&#x27;
350
- &amp;&amp; request.resource.data.status == &#x27;playing&#x27;
351
- &amp;&amp; baseMoveChecks() &amp;&amp; validEnPassant()
352
- &amp;&amp; request.resource.data.capturedPiece != &#x27;&#x27; &amp;&amp; request.resource.data[request.resource.data.capturedPiece] == &#x27;&#x27;
353
- &amp;&amp; pieceMovedCorrectly() &amp;&amp; myKingSafe();
396
+ allow update: if request.resource.data.moveType == 'en_passant'
397
+ &#38;&#38; request.resource.data.status == 'playing'
398
+ &#38;&#38; baseMoveChecks() &#38;&#38; validEnPassant()
399
+ &#38;&#38; request.resource.data.capturedPiece != '' &#38;&#38; request.resource.data[request.resource.data.capturedPiece] == ''
400
+ &#38;&#38; pieceMovedCorrectly() &#38;&#38; myKingSafe();
354
401
  // Standard piece move (non-pawn)
355
- allow update: if request.resource.data.moveType == &#x27;normal&#x27;
356
- &amp;&amp; request.resource.data.capturedPiece == &#x27;&#x27; &amp;&amp; request.resource.data.status == &#x27;playing&#x27;
357
- &amp;&amp; baseMoveChecks() &amp;&amp; validPieceMove() &amp;&amp; resource.data[request.resource.data.moveTo] == &#x27;&#x27;
358
- &amp;&amp; pieceMovedCorrectly() &amp;&amp; myKingSafe();
402
+ allow update: if request.resource.data.moveType == 'normal'
403
+ &#38;&#38; request.resource.data.capturedPiece == '' &#38;&#38; request.resource.data.status == 'playing'
404
+ &#38;&#38; baseMoveChecks() &#38;&#38; validPieceMove() &#38;&#38; resource.data[request.resource.data.moveTo] == ''
405
+ &#38;&#38; pieceMovedCorrectly() &#38;&#38; myKingSafe();
359
406
  // Standard piece capture
360
- allow update: if request.resource.data.moveType == &#x27;capture&#x27;
361
- &amp;&amp; request.resource.data.capturedPiece != &#x27;&#x27; &amp;&amp; request.resource.data.status == &#x27;playing&#x27;
362
- &amp;&amp; baseMoveChecks() &amp;&amp; validPieceMove() &amp;&amp; captureValid() &amp;&amp; pieceMovedCorrectly() &amp;&amp; myKingSafe();
407
+ allow update: if request.resource.data.moveType == 'capture'
408
+ &#38;&#38; request.resource.data.capturedPiece != '' &#38;&#38; request.resource.data.status == 'playing'
409
+ &#38;&#38; baseMoveChecks() &#38;&#38; validPieceMove() &#38;&#38; captureValid() &#38;&#38; pieceMovedCorrectly() &#38;&#38; myKingSafe();
363
410
  // Castling kingside
364
- allow update: if request.resource.data.moveType == &#x27;castle_k&#x27;
365
- &amp;&amp; request.resource.data.status == &#x27;playing&#x27;
366
- &amp;&amp; baseMoveChecks() &amp;&amp; validCastleKingside() &amp;&amp; myKingSafe();
411
+ allow update: if request.resource.data.moveType == 'castle_k'
412
+ &#38;&#38; request.resource.data.status == 'playing'
413
+ &#38;&#38; baseMoveChecks() &#38;&#38; validCastleKingside() &#38;&#38; myKingSafe();
367
414
  // Castling queenside
368
- allow update: if request.resource.data.moveType == &#x27;castle_q&#x27;
369
- &amp;&amp; request.resource.data.status == &#x27;playing&#x27;
370
- &amp;&amp; baseMoveChecks() &amp;&amp; validCastleQueenside() &amp;&amp; myKingSafe();
415
+ allow update: if request.resource.data.moveType == 'castle_q'
416
+ &#38;&#38; request.resource.data.status == 'playing'
417
+ &#38;&#38; baseMoveChecks() &#38;&#38; validCastleQueenside() &#38;&#38; myKingSafe();
371
418
  // Draw
372
- allow update: if request.resource.data.moveType == &#x27;draw&#x27;
373
- &amp;&amp; request.resource.data.status == &#x27;draw&#x27;
374
- &amp;&amp; resource.data.status == &#x27;playing&#x27; &amp;&amp; isMyTurn();
419
+ allow update: if request.resource.data.moveType == 'draw'
420
+ &#38;&#38; request.resource.data.status == 'draw'
421
+ &#38;&#38; resource.data.status == 'playing' &#38;&#38; isMyTurn();
375
422
  // Resign
376
- allow update: if request.resource.data.moveType == &#x27;resign&#x27;
377
- &amp;&amp; request.resource.data.status == &#x27;resigned&#x27;
378
- &amp;&amp; resource.data.status == &#x27;playing&#x27;
379
- &amp;&amp; request.auth != null
380
- &amp;&amp; (request.auth.uid == resource.data.host || request.auth.uid == resource.data.guest);
423
+ allow update: if request.resource.data.moveType == 'resign'
424
+ &#38;&#38; request.resource.data.status == 'resigned'
425
+ &#38;&#38; resource.data.status == 'playing'
426
+ &#38;&#38; request.auth != null
427
+ &#38;&#38; (request.auth.uid == resource.data.host || request.auth.uid == resource.data.guest);
381
428
  }
382
429
  }
383
430
  }
384
- </code></pre></section><!--astro:end--></astro-island> </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="#keep-the-rules-focused-on-chess" data-astro-cid-mw7aashj>Keep the Rules focused on chess</a> </li><li data-depth="2" data-astro-cid-mw7aashj> <a href="#stop-unrelated-rules-early" data-astro-cid-mw7aashj>Stop unrelated Rules early</a> </li><li data-depth="2" data-astro-cid-mw7aashj> <a href="#checkmate-is-a-result-not-a-trusted-claim" data-astro-cid-mw7aashj>Checkmate is a result, not a trusted claim</a> </li><li data-depth="2" data-astro-cid-mw7aashj> <a href="#test-the-same-boundaries-before-production" data-astro-cid-mw7aashj>Test the same boundaries before production</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>
431
+ "> <div class="source-toolbar"> <strong>Security Rules</strong> <button type="button" class="copy-source">Copy source</button> </div> <pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#E06C75">rules_version</span><span style="color:#56B6C2"> =</span><span style="color:#98C379"> '2+modules'</span><span style="color:#ABB2BF">;</span></span>
432
+ <span class="line"></span>
433
+ <span class="line"><span style="color:#C678DD">import</span><span style="color:#ABB2BF"> { </span><span style="color:#E06C75">isAuthenticated</span><span style="color:#ABB2BF"> } </span><span style="color:#C678DD">from</span><span style="color:#98C379"> 'auth'</span><span style="color:#ABB2BF">;</span></span>
434
+ <span class="line"><span style="color:#C678DD">import</span><span style="color:#ABB2BF"> { </span><span style="color:#E06C75">validSimpleMove</span><span style="color:#ABB2BF"> } </span><span style="color:#C678DD">from</span><span style="color:#98C379"> 'geometry'</span><span style="color:#ABB2BF">;</span></span>
435
+ <span class="line"><span style="color:#C678DD">import</span><span style="color:#ABB2BF"> { </span><span style="color:#E06C75">isPlaying</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75">moveIncremented</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75">participantsUnchanged</span><span style="color:#ABB2BF"> } </span><span style="color:#C678DD">from</span><span style="color:#98C379"> 'state'</span><span style="color:#ABB2BF">;</span></span>
436
+ <span class="line"><span style="color:#C678DD">import</span><span style="color:#ABB2BF"> { </span><span style="color:#E06C75">isMyTurn</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75">turnFlipped</span><span style="color:#ABB2BF"> } </span><span style="color:#C678DD">from</span><span style="color:#98C379"> 'turns'</span><span style="color:#ABB2BF">;</span></span>
437
+ <span class="line"></span>
438
+ <span class="line"><span style="color:#E06C75">service</span><span style="color:#E5C07B"> cloud</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">firestore</span><span style="color:#ABB2BF"> {</span></span>
439
+ <span class="line"><span style="color:#E06C75"> match</span><span style="color:#56B6C2"> /</span><span style="color:#E06C75">databases</span><span style="color:#56B6C2">/</span><span style="color:#ABB2BF">{</span><span style="color:#E06C75">database</span><span style="color:#ABB2BF">}</span><span style="color:#56B6C2">/</span><span style="color:#E06C75">documents</span><span style="color:#ABB2BF"> {</span></span>
440
+ <span class="line"><span style="color:#E06C75"> match</span><span style="color:#56B6C2"> /</span><span style="color:#E06C75">gameConfig</span><span style="color:#56B6C2">/</span><span style="color:#ABB2BF">{</span><span style="color:#E06C75">id</span><span style="color:#ABB2BF">} { </span><span style="color:#E06C75">allow</span><span style="color:#E06C75"> read</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#D19A66"> true</span><span style="color:#ABB2BF">; </span><span style="color:#E06C75">allow</span><span style="color:#E06C75"> write</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#D19A66"> false</span><span style="color:#ABB2BF">; }</span></span>
441
+ <span class="line"><span style="color:#E06C75"> match</span><span style="color:#56B6C2"> /</span><span style="color:#E06C75">chess</span><span style="color:#56B6C2">-</span><span style="color:#E06C75">v2</span><span style="color:#56B6C2">/</span><span style="color:#ABB2BF">{</span><span style="color:#E06C75">gameId</span><span style="color:#ABB2BF">} {</span></span>
442
+ <span class="line"></span>
443
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">() { </span><span style="color:#C678DD">return</span><span style="color:#61AFEF"> get</span><span style="color:#ABB2BF">(</span><span style="color:#56B6C2">/</span><span style="color:#E06C75">databases</span><span style="color:#56B6C2">/</span><span style="color:#61AFEF">$</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">database</span><span style="color:#ABB2BF">)</span><span style="color:#56B6C2">/</span><span style="color:#E06C75">documents</span><span style="color:#56B6C2">/</span><span style="color:#E06C75">gameConfig</span><span style="color:#56B6C2">/</span><span style="color:#E06C75">chessv2</span><span style="color:#ABB2BF">).</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">; }</span></span>
444
+ <span class="line"></span>
445
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> isOwnPiece</span><span style="color:#ABB2BF">() {</span></span>
446
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#ABB2BF">];</span></span>
447
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">currentTurn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span></span>
448
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'K'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'Q'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'R'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'B'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'N'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span><span style="color:#ABB2BF">))</span></span>
449
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">currentTurn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'guest'</span></span>
450
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'k'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'q'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'r'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'b'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'n'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span><span style="color:#ABB2BF">));</span></span>
451
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
452
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() {</span></span>
453
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#61AFEF"> isAuthenticated</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> isPlaying</span><span style="color:#ABB2BF">()</span></span>
454
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> isMyTurn</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> turnFlipped</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> isOwnPiece</span><span style="color:#ABB2BF">()</span></span>
455
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> moveIncremented</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> participantsUnchanged</span><span style="color:#ABB2BF">();</span></span>
456
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
457
+ <span class="line"></span>
458
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validPieceMove</span><span style="color:#ABB2BF">() {</span></span>
459
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mf</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#ABB2BF">;</span></span>
460
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#ABB2BF">;</span></span>
461
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">];</span></span>
462
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> p</span><span style="color:#56B6C2"> =</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">mt</span><span style="color:#ABB2BF">];</span></span>
463
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#61AFEF"> validSimpleMove</span><span style="color:#ABB2BF">(</span><span style="color:#61AFEF">cfg</span><span style="color:#ABB2BF">())</span></span>
464
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#61AFEF">cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">pieceCategory</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">piece</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> 'jump'</span></span>
465
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> ((</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">len</span><span style="color:#56B6C2"> &#x3C;</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
466
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
467
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
468
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
469
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
470
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 6</span><span style="color:#56B6C2"> ||</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">p</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c5</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)));</span></span>
471
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
472
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validPawnForward</span><span style="color:#ABB2BF">() {</span></span>
473
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mf</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#ABB2BF">;</span></span>
474
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#ABB2BF">;</span></span>
475
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">];</span></span>
476
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span><span style="color:#ABB2BF">) </span><span style="color:#56B6C2">&#x26;&#x26;</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">&#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mt</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">;</span></span>
477
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
478
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validPawnDouble</span><span style="color:#ABB2BF">() {</span></span>
479
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mf</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#ABB2BF">;</span></span>
480
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#ABB2BF">;</span></span>
481
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">];</span></span>
482
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span><span style="color:#ABB2BF">)</span></span>
483
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> mf</span><span style="color:#C678DD"> in</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">pawnDouble</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">piece</span><span style="color:#ABB2BF">]</span></span>
484
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">pawnDouble</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">piece</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">to</span><span style="color:#56B6C2"> ==</span><span style="color:#E06C75"> mt</span></span>
485
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mt</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span></span>
486
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#61AFEF">cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">pawnDouble</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">piece</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">between</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">;</span></span>
487
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
488
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validPawnCapture</span><span style="color:#ABB2BF">() {</span></span>
489
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mf</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#ABB2BF">;</span></span>
490
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#ABB2BF">;</span></span>
491
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">];</span></span>
492
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mt</span><span style="color:#ABB2BF">];</span></span>
493
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span><span style="color:#ABB2BF">)</span></span>
494
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> mt</span><span style="color:#C678DD"> in</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">piece</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">]</span></span>
495
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span></span>
496
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'k'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'q'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'r'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'b'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'n'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span><span style="color:#ABB2BF">))</span></span>
497
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'K'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'Q'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'R'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'B'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'N'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> target</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span><span style="color:#ABB2BF">)));</span></span>
498
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
499
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validPromotion</span><span style="color:#ABB2BF">() {</span></span>
500
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#ABB2BF">;</span></span>
501
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#ABB2BF">];</span></span>
502
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> pt</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">promotedTo</span><span style="color:#ABB2BF">;</span></span>
503
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'promotion'</span></span>
504
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> >=</span><span style="color:#98C379"> 'a8'</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> &#x3C;=</span><span style="color:#98C379"> 'h8'</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">pt</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'Q'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> pt</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'R'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> pt</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'B'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> pt</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'N'</span><span style="color:#ABB2BF">))</span></span>
505
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> >=</span><span style="color:#98C379"> 'a1'</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> &#x3C;=</span><span style="color:#98C379"> 'h1'</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">pt</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'q'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> pt</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'r'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> pt</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'b'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> pt</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'n'</span><span style="color:#ABB2BF">)));</span></span>
506
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
507
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() {</span></span>
508
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mf</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#ABB2BF">;</span></span>
509
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#ABB2BF">;</span></span>
510
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">];</span></span>
511
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span></span>
512
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> 'promotion'</span></span>
513
+ <span class="line"><span style="color:#C678DD"> ?</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mt</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#E06C75"> piece</span></span>
514
+ <span class="line"><span style="color:#C678DD"> :</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mt</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">promotedTo</span><span style="color:#ABB2BF">)</span></span>
515
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">movedPiece</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#E06C75"> mf</span></span>
516
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">movedPiece</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#E06C75"> mt</span><span style="color:#ABB2BF">;</span></span>
517
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
518
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> captureValid</span><span style="color:#ABB2BF">() {</span></span>
519
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> cp</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">capturedPiece</span><span style="color:#ABB2BF">;</span></span>
520
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#E06C75"> cp</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span></span>
521
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">cp</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span></span>
522
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">cp</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">;</span></span>
523
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
524
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validEnPassant</span><span style="color:#ABB2BF">() {</span></span>
525
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mf</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#ABB2BF">;</span></span>
526
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> mt</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#ABB2BF">;</span></span>
527
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">];</span></span>
528
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E06C75">piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> piece</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span><span style="color:#ABB2BF">)</span></span>
529
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E06C75"> mt</span><span style="color:#C678DD"> in</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">piece</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">mf</span><span style="color:#ABB2BF">]</span></span>
530
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">mt</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span></span>
531
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">lastDoublePawn</span><span style="color:#56B6C2"> ==</span><span style="color:#E06C75"> mt</span><span style="color:#ABB2BF">;</span></span>
532
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
533
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validCastleKingside</span><span style="color:#ABB2BF">() {</span></span>
534
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> turn</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">currentTurn</span><span style="color:#ABB2BF">;</span></span>
535
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> c</span><span style="color:#56B6C2"> =</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">castling</span><span style="color:#ABB2BF">;</span></span>
536
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> castle</span><span style="color:#56B6C2"> =</span><span style="color:#E06C75"> turn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span><span style="color:#C678DD"> ?</span><span style="color:#E5C07B"> c</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">wk</span><span style="color:#C678DD"> :</span><span style="color:#E5C07B"> c</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">bk</span><span style="color:#ABB2BF">;</span></span>
537
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> kingMoved</span><span style="color:#56B6C2"> =</span><span style="color:#E06C75"> turn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span><span style="color:#C678DD"> ?</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_K_moved</span><span style="color:#C678DD"> :</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_k_moved</span><span style="color:#ABB2BF">;</span></span>
538
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> rookMoved</span><span style="color:#56B6C2"> =</span><span style="color:#E06C75"> turn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span><span style="color:#C678DD"> ?</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2_moved</span><span style="color:#C678DD"> :</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2_moved</span><span style="color:#ABB2BF">;</span></span>
539
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#56B6C2"> !</span><span style="color:#E06C75">kingMoved</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#56B6C2"> !</span><span style="color:#E06C75">rookMoved</span></span>
540
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">kingFrom</span></span>
541
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">kingTo</span></span>
542
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">between</span><span style="color:#ABB2BF">[</span><span style="color:#D19A66">0</span><span style="color:#ABB2BF">]] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span></span>
543
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">between</span><span style="color:#ABB2BF">[</span><span style="color:#D19A66">1</span><span style="color:#ABB2BF">]] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">;</span></span>
544
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
545
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> validCastleQueenside</span><span style="color:#ABB2BF">() {</span></span>
546
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> turn</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">currentTurn</span><span style="color:#ABB2BF">;</span></span>
547
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> c</span><span style="color:#56B6C2"> =</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">().</span><span style="color:#E06C75">castling</span><span style="color:#ABB2BF">;</span></span>
548
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> castle</span><span style="color:#56B6C2"> =</span><span style="color:#E06C75"> turn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span><span style="color:#C678DD"> ?</span><span style="color:#E5C07B"> c</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">wq</span><span style="color:#C678DD"> :</span><span style="color:#E5C07B"> c</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">bq</span><span style="color:#ABB2BF">;</span></span>
549
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> kingMoved</span><span style="color:#56B6C2"> =</span><span style="color:#E06C75"> turn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span><span style="color:#C678DD"> ?</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_K_moved</span><span style="color:#C678DD"> :</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_k_moved</span><span style="color:#ABB2BF">;</span></span>
550
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> rookMoved</span><span style="color:#56B6C2"> =</span><span style="color:#E06C75"> turn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span><span style="color:#C678DD"> ?</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1_moved</span><span style="color:#C678DD"> :</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1_moved</span><span style="color:#ABB2BF">;</span></span>
551
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#56B6C2"> !</span><span style="color:#E06C75">kingMoved</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#56B6C2"> !</span><span style="color:#E06C75">rookMoved</span></span>
552
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveFrom</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">kingFrom</span></span>
553
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">kingTo</span></span>
554
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">between</span><span style="color:#ABB2BF">[</span><span style="color:#D19A66">0</span><span style="color:#ABB2BF">]] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span></span>
555
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">between</span><span style="color:#ABB2BF">[</span><span style="color:#D19A66">1</span><span style="color:#ABB2BF">]] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span></span>
556
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">castle</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">between</span><span style="color:#ABB2BF">[</span><span style="color:#D19A66">2</span><span style="color:#ABB2BF">]] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">;</span></span>
557
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
558
+ <span class="line"></span>
559
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> hPC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">cfg</span><span style="color:#ABB2BF">) {</span></span>
560
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> b</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">;</span></span>
561
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> ks</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_K</span><span style="color:#ABB2BF">;</span></span>
562
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p1</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p1</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p1</span><span style="color:#ABB2BF">])</span></span>
563
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p2</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p2</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p2</span><span style="color:#ABB2BF">])</span></span>
564
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p3</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p3</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p3</span><span style="color:#ABB2BF">])</span></span>
565
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p4</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p4</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p4</span><span style="color:#ABB2BF">])</span></span>
566
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p5</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p5</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p5</span><span style="color:#ABB2BF">])</span></span>
567
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p6</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p6</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p6</span><span style="color:#ABB2BF">])</span></span>
568
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p7</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p7</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p7</span><span style="color:#ABB2BF">])</span></span>
569
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p8</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p8</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_p8</span><span style="color:#ABB2BF">]);</span></span>
570
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
571
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> hMC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">cfg</span><span style="color:#ABB2BF">) {</span></span>
572
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> b</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">;</span></span>
573
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> ks</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_K</span><span style="color:#ABB2BF">;</span></span>
574
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_n1</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_n1</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_n1</span><span style="color:#ABB2BF">])</span></span>
575
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_n2</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_n2</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_n2</span><span style="color:#ABB2BF">])</span></span>
576
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_k</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_k</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_k</span><span style="color:#ABB2BF">]);</span></span>
577
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
578
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> hSC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">cfg</span><span style="color:#ABB2BF">) {</span></span>
579
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> b</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">;</span></span>
580
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> ks</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_K</span><span style="color:#ABB2BF">;</span></span>
581
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">]</span></span>
582
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
583
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
584
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
585
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
586
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">))</span></span>
587
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">]</span></span>
588
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
589
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
590
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
591
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
592
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">))</span></span>
593
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">]</span></span>
594
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
595
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
596
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
597
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
598
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_r2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">))</span></span>
599
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">]</span></span>
600
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
601
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
602
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
603
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
604
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">))</span></span>
605
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">]</span></span>
606
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
607
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
608
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
609
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
610
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_b2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">));</span></span>
611
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
612
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> gPC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">cfg</span><span style="color:#ABB2BF">) {</span></span>
613
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> b</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">;</span></span>
614
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> ks</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_k</span><span style="color:#ABB2BF">;</span></span>
615
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P1</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P1</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P1</span><span style="color:#ABB2BF">])</span></span>
616
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P2</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P2</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P2</span><span style="color:#ABB2BF">])</span></span>
617
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P3</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P3</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P3</span><span style="color:#ABB2BF">])</span></span>
618
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P4</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P4</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P4</span><span style="color:#ABB2BF">])</span></span>
619
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P5</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P5</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P5</span><span style="color:#ABB2BF">])</span></span>
620
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P6</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P6</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P6</span><span style="color:#ABB2BF">])</span></span>
621
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P7</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P7</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P7</span><span style="color:#ABB2BF">])</span></span>
622
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P8</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">pawnAttacks</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P8</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_P8</span><span style="color:#ABB2BF">]);</span></span>
623
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
624
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> gMC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">cfg</span><span style="color:#ABB2BF">) {</span></span>
625
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> b</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">;</span></span>
626
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> ks</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_k</span><span style="color:#ABB2BF">;</span></span>
627
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_N1</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_N1</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_N1</span><span style="color:#ABB2BF">])</span></span>
628
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_N2</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_N2</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_N2</span><span style="color:#ABB2BF">])</span></span>
629
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_K</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_K</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_K</span><span style="color:#ABB2BF">]);</span></span>
630
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
631
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> gSC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">cfg</span><span style="color:#ABB2BF">) {</span></span>
632
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> b</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">;</span></span>
633
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> ks</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">gp_k</span><span style="color:#ABB2BF">;</span></span>
634
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">]</span></span>
635
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
636
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
637
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
638
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
639
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_Q</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">))</span></span>
640
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">]</span></span>
641
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
642
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
643
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
644
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
645
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">))</span></span>
646
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">]</span></span>
647
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
648
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
649
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
650
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
651
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_R2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">))</span></span>
652
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">]</span></span>
653
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
654
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
655
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
656
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
657
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B1</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">))</span></span>
658
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#56B6C2"> !=</span><span style="color:#98C379"> ''</span><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E06C75"> ks</span><span style="color:#C678DD"> in</span><span style="color:#E5C07B"> cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moves</span><span style="color:#ABB2BF">[</span><span style="color:#E06C75">b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">]][</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">]</span></span>
659
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 1</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c0</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
660
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 2</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c1</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
661
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 3</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c2</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
662
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 4</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c3</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">)</span></span>
663
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x3C;</span><span style="color:#D19A66"> 5</span><span style="color:#56B6C2"> ||</span><span style="color:#E06C75"> b</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">cfg</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">paths</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">b</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">hp_B2</span><span style="color:#ABB2BF">][</span><span style="color:#E06C75">ks</span><span style="color:#ABB2BF">].</span><span style="color:#E06C75">c4</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span><span style="color:#ABB2BF">));</span></span>
664
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
665
+ <span class="line"></span>
666
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">() {</span></span>
667
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> c</span><span style="color:#56B6C2"> =</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">();</span></span>
668
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">currentTurn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span><span style="color:#56B6C2"> &#x26;&#x26;</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">&#x26;&#x26;</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">&#x26;&#x26;</span><span style="color:#56B6C2"> !</span><span style="color:#61AFEF">hSC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">))</span></span>
669
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">currentTurn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'guest'</span><span style="color:#56B6C2"> &#x26;&#x26;</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">&#x26;&#x26;</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">&#x26;&#x26;</span><span style="color:#56B6C2"> !</span><span style="color:#61AFEF">gSC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">));</span></span>
670
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
671
+ <span class="line"><span style="color:#C678DD"> function</span><span style="color:#61AFEF"> opponentInCheck</span><span style="color:#ABB2BF">() {</span></span>
672
+ <span class="line"><span style="color:#C678DD"> let</span><span style="color:#E06C75"> c</span><span style="color:#56B6C2"> =</span><span style="color:#61AFEF"> cfg</span><span style="color:#ABB2BF">();</span></span>
673
+ <span class="line"><span style="color:#C678DD"> return</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">currentTurn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'host'</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#61AFEF">gPC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">) </span><span style="color:#56B6C2">||</span><span style="color:#61AFEF"> gMC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">) </span><span style="color:#56B6C2">||</span><span style="color:#61AFEF"> gSC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">)))</span></span>
674
+ <span class="line"><span style="color:#56B6C2"> ||</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">currentTurn</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'guest'</span><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#61AFEF">hPC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">) </span><span style="color:#56B6C2">||</span><span style="color:#61AFEF"> hMC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">) </span><span style="color:#56B6C2">||</span><span style="color:#61AFEF"> hSC</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75">c</span><span style="color:#ABB2BF">)));</span></span>
675
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
676
+ <span class="line"></span>
677
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // ═══ Lobby ═══</span></span>
678
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> read</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">auth</span><span style="color:#56B6C2"> !=</span><span style="color:#D19A66"> null</span><span style="color:#ABB2BF">;</span></span>
679
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> create</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">auth</span><span style="color:#56B6C2"> !=</span><span style="color:#D19A66"> null</span></span>
680
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">host</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">auth</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">uid</span></span>
681
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'waiting'</span></span>
682
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">a1</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'R'</span></span>
683
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">a2</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span></span>
684
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">a7</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span></span>
685
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">a8</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'r'</span></span>
686
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">b1</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'N'</span></span>
687
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">b2</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span></span>
688
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">b7</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span></span>
689
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">b8</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'n'</span></span>
690
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c1</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'B'</span></span>
691
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c2</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span></span>
692
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c7</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span></span>
693
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">c8</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'b'</span></span>
694
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">d1</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'Q'</span></span>
695
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">d2</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span></span>
696
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">d7</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span></span>
697
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">d8</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'q'</span></span>
698
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">e1</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'K'</span></span>
699
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">e2</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span></span>
700
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">e7</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span></span>
701
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">e8</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'k'</span></span>
702
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">f1</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'B'</span></span>
703
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">f2</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span></span>
704
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">f7</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span></span>
705
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">f8</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'b'</span></span>
706
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">g1</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'N'</span></span>
707
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">g2</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span></span>
708
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">g7</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span></span>
709
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">g8</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'n'</span></span>
710
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">h1</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'R'</span></span>
711
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">h2</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'P'</span></span>
712
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">h7</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'p'</span></span>
713
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> d</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">h8</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'r'</span><span style="color:#ABB2BF">;</span></span>
714
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">auth</span><span style="color:#56B6C2"> !=</span><span style="color:#D19A66"> null</span></span>
715
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'waiting'</span></span>
716
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">guest</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> ''</span></span>
717
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">guest</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">auth</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">uid</span></span>
718
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">auth</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">uid</span><span style="color:#56B6C2"> !=</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">host</span></span>
719
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
720
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#61AFEF">diff</span><span style="color:#ABB2BF">(</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">).</span><span style="color:#61AFEF">affectedKeys</span><span style="color:#ABB2BF">().</span><span style="color:#61AFEF">hasOnly</span><span style="color:#ABB2BF">([</span><span style="color:#98C379">'guest'</span><span style="color:#ABB2BF">, </span><span style="color:#98C379">'status'</span><span style="color:#ABB2BF">]);</span></span>
721
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> delete</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">auth</span><span style="color:#56B6C2"> !=</span><span style="color:#D19A66"> null</span></span>
722
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'waiting'</span></span>
723
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">auth</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">uid</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">host</span><span style="color:#ABB2BF">;</span></span>
724
+ <span class="line"></span>
725
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // ═══ UNIQUE moveType gates — each rule category has its own ═══</span></span>
726
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // Pawn forward</span></span>
727
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'pawn_forward'</span></span>
728
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
729
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> validPawnForward</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">promotedTo</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> ''</span></span>
730
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
731
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // Pawn capture</span></span>
732
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'pawn_capture'</span></span>
733
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
734
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> validPawnCapture</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">promotedTo</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> ''</span></span>
735
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> captureValid</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
736
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // Pawn double</span></span>
737
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'double_pawn'</span></span>
738
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
739
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> validPawnDouble</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
740
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // Promotion (forward)</span></span>
741
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'promotion'</span></span>
742
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
743
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> validPawnForward</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> validPromotion</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
744
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // Promotion (capture)</span></span>
745
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'promotion_capture'</span></span>
746
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
747
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> validPawnCapture</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> validPromotion</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> captureValid</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
748
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // En passant</span></span>
749
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'en_passant'</span></span>
750
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
751
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> validEnPassant</span><span style="color:#ABB2BF">()</span></span>
752
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">capturedPiece</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span></span>
753
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
754
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // Standard piece move (non-pawn)</span></span>
755
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'normal'</span></span>
756
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
757
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> validPieceMove</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">data</span><span style="color:#ABB2BF">[</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveTo</span><span style="color:#ABB2BF">] </span><span style="color:#56B6C2">==</span><span style="color:#98C379"> ''</span></span>
758
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
759
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // Standard piece capture</span></span>
760
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'capture'</span></span>
761
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
762
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> validPieceMove</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> captureValid</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> pieceMovedCorrectly</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
763
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // Castling kingside</span></span>
764
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'castle_k'</span></span>
765
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
766
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> validCastleKingside</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
767
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // Castling queenside</span></span>
768
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'castle_q'</span></span>
769
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
770
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#61AFEF"> baseMoveChecks</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> validCastleQueenside</span><span style="color:#ABB2BF">() </span><span style="color:#56B6C2">&#x26;&#x26;</span><span style="color:#61AFEF"> myKingSafe</span><span style="color:#ABB2BF">();</span></span>
771
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // Draw</span></span>
772
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'draw'</span></span>
773
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'draw'</span></span>
774
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</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"> &#x26;&#x26;</span><span style="color:#61AFEF"> isMyTurn</span><span style="color:#ABB2BF">();</span></span>
775
+ <span class="line"><span style="color:#7F848E;font-style:italic"> // Resign</span></span>
776
+ <span class="line"><span style="color:#E06C75"> allow</span><span style="color:#E06C75"> update</span><span style="color:#ABB2BF">: </span><span style="color:#C678DD">if</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">moveType</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'resign'</span></span>
777
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'resigned'</span></span>
778
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">status</span><span style="color:#56B6C2"> ==</span><span style="color:#98C379"> 'playing'</span></span>
779
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">auth</span><span style="color:#56B6C2"> !=</span><span style="color:#D19A66"> null</span></span>
780
+ <span class="line"><span style="color:#56B6C2"> &#x26;&#x26;</span><span style="color:#ABB2BF"> (</span><span style="color:#E5C07B">request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">auth</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">uid</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">host</span><span style="color:#56B6C2"> ||</span><span style="color:#E5C07B"> request</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">auth</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">uid</span><span style="color:#56B6C2"> ==</span><span style="color:#E5C07B"> resource</span><span style="color:#ABB2BF">.</span><span style="color:#E5C07B">data</span><span style="color:#ABB2BF">.</span><span style="color:#E06C75">guest</span><span style="color:#ABB2BF">);</span></span>
781
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
782
+ <span class="line"><span style="color:#ABB2BF"> }</span></span>
783
+ <span class="line"><span style="color:#ABB2BF">}</span></span></code></pre> </section> <script type="module">document.querySelectorAll(".source-explorer").forEach(e=>{const t=e.querySelector(".copy-source");!t||t.dataset.copyInstalled==="true"||(t.dataset.copyInstalled="true",t.addEventListener("click",async()=>{await navigator.clipboard.writeText(e.dataset.source??""),t.textContent="Copied",window.setTimeout(()=>{t.textContent="Copy source"},1500)}))});</script> </section> </div> </main> <aside class="doc-toc" aria-label="On this page" data-astro-cid-mw7aashj> <h2 class="doc-toc-heading" data-astro-cid-mw7aashj>On this page</h2> <ul data-astro-cid-mw7aashj> <li data-depth="2" data-astro-cid-mw7aashj> <a href="#try-the-board" data-astro-cid-mw7aashj>Try the board</a> </li><li data-depth="2" data-astro-cid-mw7aashj> <a href="#a-move-is-a-firestore-write" data-astro-cid-mw7aashj>A move is a Firestore write</a> </li><li data-depth="2" data-astro-cid-mw7aashj> <a href="#why-the-rules-look-like-this" data-astro-cid-mw7aashj>Why the Rules look like this</a> </li><li data-depth="2" data-astro-cid-mw7aashj> <a href="#look-up-the-available-helpers" data-astro-cid-mw7aashj>Look up the available helpers</a> </li><li data-depth="2" data-astro-cid-mw7aashj> <a href="#route-each-move-to-one-branch" data-astro-cid-mw7aashj>Route each move to one branch</a> </li><li data-depth="2" data-astro-cid-mw7aashj> <a href="#derive-checkmate-from-the-board" data-astro-cid-mw7aashj>Derive checkmate from the board</a> </li><li data-depth="2" data-astro-cid-mw7aashj> <a href="#test-specific-moves" data-astro-cid-mw7aashj>Test specific moves</a> </li> </ul> </aside> </div> <script type="module">const a=document.querySelector("[data-api-symbol-filter]"),d=[...document.querySelectorAll("[data-api-symbol-group]")],n=document.querySelector("[data-api-symbol-empty]");a?.addEventListener("input",()=>{const t=a.value.trim().toLowerCase();let o=0;for(const i of d){let e=0;i.querySelectorAll("[data-api-symbol]").forEach(l=>{const r=!t||(l.dataset.apiSymbol??"").includes(t);l.hidden=!r,r&&e++}),i.hidden=e===0,o+=e}n&&(n.hidden=o>0)});</script> <script type="module">const s=new Map;document.querySelectorAll('.doc-toc a[href^="#"]').forEach(t=>s.set(decodeURIComponent(t.hash.slice(1)),t));if(s.size>0){const t=new Set,n=()=>{let o=null;for(const e of s.keys())if(t.has(e)){o=e;break}s.forEach((e,c)=>e.classList.toggle("active",c===o))},r=new IntersectionObserver(o=>{for(const e of o)e.isIntersecting?t.add(e.target.id):t.delete(e.target.id);n()},{rootMargin:"-72px 0px -60% 0px"});s.forEach((o,e)=>{const c=document.getElementById(e);c&&r.observe(c)})}</script> <script type="module">document.querySelector('.studio__nav [aria-current="page"]')?.scrollIntoView({block:"nearest",inline:"center"});</script> </body></html>