diff --git a/bootstrap/bin/hocc/aplr.ml b/bootstrap/bin/hocc/aplr.ml index 51e2c1540..08a80c816 100644 --- a/bootstrap/bin/hocc/aplr.ml +++ b/bootstrap/bin/hocc/aplr.ml @@ -76,9 +76,9 @@ let remergeable_actions states remergeables frontiers spines = -> begin (* All states in the mergeable set must either have an empty action set or identical * nonempty action set. Note that these are post-conflict-resolution action sets; were - * they pre-conflict-resolution action sets, the equivalent remergeability test would - * require identical dominant actions (or identical [possibly unresolvable] action - * sets). *) + * they pre-conflict-resolution action sets (i.e. conflict resolution to be performed + * after remerging), the equivalent remergeability test would require identical + * dominant actions (or identical [possibly unresolvable] action sets). *) match reduces_only action_set with | false -> remergeables, frontiers, NotRemergeable spines | true -> begin diff --git a/bootstrap/bin/hocc/aplr.mli b/bootstrap/bin/hocc/aplr.mli index 61289fc70..3e408f618 100644 --- a/bootstrap/bin/hocc/aplr.mli +++ b/bootstrap/bin/hocc/aplr.mli @@ -22,15 +22,18 @@ val remerge_states: Io.t -> Symbols.t -> Isocores.t -> State.t array to be remergeable, every state pair's pairwise out-transitions must meet at least one of the following criteria: - - The successor state indexes are equal, i.e. no successor state splitting is present. - - The successor states are transitively remergeable. Note that cycles of arbitrary length may - occur. - - State [X₀] takes no action for a symbol [s], and state [X₁] performs only reduction(s) for - symbol [s]. Furthermore, for more than two states to be remergeable, all additional states - must contain either no actions on symbol [s], or actions identical to those of state [X₁]. - (This formulation assumes operation on post-conflict-resolution states; the corresponding - pre-conflict-resolution algorithm requires identical conflict resolution results.) - - State [X₀] contains no goto for a symbol [s], and state [X₁] does contain a goto for symbol - [s]. Furthermore, for more than two states to be remergeable, all additional states must - contain either no goto for symbol [s], or a goto successor that is remergeable with that of - state [X₁]. *) + - Shifts: + + The successor state indexes are equal. + + The successor states are transitively remergeable. + - Reductions: + + The states perform identical reductions. + + State `X₀` takes no action for a symbol `s`, and state `X₁` performs only reduction(s) for + symbol `s`. Furthermore, for more than two states to be remergeable, all additional states + must contain either no actions on symbol `s`, or actions identical to those of state `X₁`. + - Gotos: + + The successor state indexes are equal. + + The successor states are transitively remergeable. + + State `X₀` contains no goto for a symbol `s`, and state `X₁` does contain a goto for symbol + `s`. Furthermore, for more than two states to be remergeable, all additional states must + contain either no goto for symbol `s`, or a goto successor that is remergeable with that of + state `X₁`. *) diff --git a/doc/reports/aplr1/PagerG2_aplr.excalidraw b/doc/reports/aplr1/PagerG2_aplr.excalidraw new file mode 100644 index 000000000..b56f1969a --- /dev/null +++ b/doc/reports/aplr1/PagerG2_aplr.excalidraw @@ -0,0 +1,4830 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "id": "dS3dKJZLcex52CnAivKL-", + "type": "text", + "x": 715, + "y": 454.5, + "width": 8, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a1", + "roundness": null, + "seed": 1200151392, + "version": 3, + "versionNonce": 47285088, + "isDeleted": true, + "boundElements": null, + "updated": 1780078561935, + "link": null, + "locked": false, + "text": "", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "9_MtGFHmrcWnp9eGVRH4-", + "type": "rectangle", + "x": 493.2405090332031, + "y": 300.2658996582031, + "width": 196.86077880859375, + "height": 89.92404174804688, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "S356jZTXjWs6Mz9MHKDG5" + ], + "frameId": null, + "index": "a2", + "roundness": { + "type": 3 + }, + "seed": 921884320, + "version": 345, + "versionNonce": 489279328, + "isDeleted": false, + "boundElements": null, + "updated": 1780079415188, + "link": null, + "locked": false + }, + { + "id": "4qoky9zb3-ND9VyKVAEaA", + "type": "rectangle", + "x": 534.5568542480469, + "y": 314.0382080078125, + "width": 62.379760742187514, + "height": 61.734161376953146, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "S356jZTXjWs6Mz9MHKDG5" + ], + "frameId": null, + "index": "a3", + "roundness": { + "type": 3 + }, + "seed": 1753880416, + "version": 390, + "versionNonce": 1003207328, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "q1aZGDzZJNfWwu5rQV002" + }, + { + "id": "GG6wQHDxaZz94xArRmB70", + "type": "arrow" + }, + { + "id": "ANCOcFXswqMuoCGFJoBM6", + "type": "arrow" + }, + { + "id": "e85SgGI6hQshJ-wOcmEec", + "type": "arrow" + }, + { + "id": "keDUBGSsCQa5pUFZYwwpt", + "type": "arrow" + }, + { + "id": "V4L09q40oc7mc7XNI_EoB", + "type": "arrow" + } + ], + "updated": 1780079951636, + "link": null, + "locked": false + }, + { + "id": "q1aZGDzZJNfWwu5rQV002", + "type": "text", + "x": 559.7687072753906, + "y": 327.40528869628906, + "width": 11.9560546875, + "height": 35, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "S356jZTXjWs6Mz9MHKDG5" + ], + "frameId": null, + "index": "a4", + "roundness": null, + "seed": 2005058400, + "version": 255, + "versionNonce": 1880088224, + "isDeleted": false, + "boundElements": null, + "updated": 1780079806897, + "link": null, + "locked": false, + "text": "1", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "4qoky9zb3-ND9VyKVAEaA", + "originalText": "1", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "YNZSMiONVjel8QdYl1yhG", + "type": "rectangle", + "x": 610.7090759277344, + "y": 314.8482971191406, + "width": 63.189758300781264, + "height": 61.114013671875014, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "S356jZTXjWs6Mz9MHKDG5" + ], + "frameId": null, + "index": "a5", + "roundness": { + "type": 3 + }, + "seed": 1126737760, + "version": 405, + "versionNonce": 1687058272, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "7HeMvZArs1lNwp_fWUtUg" + }, + { + "id": "1QQSN0e8OOsRKfH0eY16E", + "type": "arrow" + }, + { + "id": "WahhtKdJZnbhvsejA8H_V", + "type": "arrow" + }, + { + "id": "4M0aw-MuSEJB2BnJP21ZG", + "type": "arrow" + }, + { + "id": "J_f4VZ0LLdTYRvQW6VjOF", + "type": "arrow" + }, + { + "id": "S5UeI8NSelZbAPJDapaq0", + "type": "arrow" + }, + { + "id": "poxXw_rSXuwsfCMRFKC5D", + "type": "arrow" + }, + { + "id": "7-sTWh80fk_rLwxWKaPl5", + "type": "arrow" + } + ], + "updated": 1780080213842, + "link": null, + "locked": false + }, + { + "id": "7HeMvZArs1lNwp_fWUtUg", + "type": "text", + "x": 627.519889831543, + "y": 327.9053039550781, + "width": 29.568130493164062, + "height": 35, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "S356jZTXjWs6Mz9MHKDG5" + ], + "frameId": null, + "index": "a6", + "roundness": null, + "seed": 172117856, + "version": 276, + "versionNonce": 2100214624, + "isDeleted": false, + "boundElements": null, + "updated": 1780079851374, + "link": null, + "locked": false, + "text": "19", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "YNZSMiONVjel8QdYl1yhG", + "originalText": "19", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Y1it0AXPUoFU5svzlVurW", + "type": "text", + "x": 506.4429626464844, + "y": 324.9684143066406, + "width": 23.443756103515625, + "height": 42.01260375976565, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "S356jZTXjWs6Mz9MHKDG5" + ], + "frameId": null, + "index": "a7", + "roundness": null, + "seed": 2064055968, + "version": 195, + "versionNonce": 2017211232, + "isDeleted": false, + "boundElements": null, + "updated": 1780079415188, + "link": null, + "locked": false, + "text": "1", + "fontSize": 33.61008300781252, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "1", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "GMDv579zkukbmcV8SakS3", + "type": "rectangle", + "x": 391.62042236328125, + "y": 553.3039855957031, + "width": 63.189758300781264, + "height": 61.114013671875014, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a7V", + "roundness": { + "type": 3 + }, + "seed": 1263605600, + "version": 428, + "versionNonce": 793853600, + "isDeleted": true, + "boundElements": [ + { + "type": "text", + "id": "x0CDtcTJm2gwmbZOsVKo-" + } + ], + "updated": 1780078795223, + "link": null, + "locked": false + }, + { + "id": "x0CDtcTJm2gwmbZOsVKo-", + "type": "text", + "x": 408.43123626708984, + "y": 566.3609924316406, + "width": 29.568130493164062, + "height": 35, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a7d", + "roundness": null, + "seed": 603401056, + "version": 307, + "versionNonce": 408910688, + "isDeleted": true, + "boundElements": null, + "updated": 1780078795223, + "link": null, + "locked": false, + "text": "19", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "GMDv579zkukbmcV8SakS3", + "originalText": "19", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "gTlFNE7KodilRaEU3PFyF", + "type": "rectangle", + "x": 795.7468873085937, + "y": 300.2659006074219, + "width": 121.51898193359375, + "height": 89.92404174804688, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "UkwdP-itH0c91kcmPijxf" + ], + "frameId": null, + "index": "a7w", + "roundness": { + "type": 3 + }, + "seed": 1738239840, + "version": 557, + "versionNonce": 1467908768, + "isDeleted": false, + "boundElements": null, + "updated": 1780079488426, + "link": null, + "locked": false + }, + { + "id": "TJxTsmrsSoeRfyHKcXE_s", + "type": "rectangle", + "x": 837.0632325234375, + "y": 314.03820895703126, + "width": 62.379760742187514, + "height": 61.734161376953146, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "UkwdP-itH0c91kcmPijxf" + ], + "frameId": null, + "index": "a7x", + "roundness": { + "type": 3 + }, + "seed": 1966506848, + "version": 570, + "versionNonce": 1250313888, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "168cmgyybBC5DJRSTNkAt" + }, + { + "id": "wCs751CmQo11r9GLpT8rq", + "type": "arrow" + }, + { + "id": "b3nWdLnfl6fLaw2Ms5KrB", + "type": "arrow" + } + ], + "updated": 1780080117323, + "link": null, + "locked": false + }, + { + "id": "168cmgyybBC5DJRSTNkAt", + "type": "text", + "x": 849.1570359291992, + "y": 327.4052896455078, + "width": 38.19215393066406, + "height": 35, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "UkwdP-itH0c91kcmPijxf" + ], + "frameId": null, + "index": "a7y", + "roundness": null, + "seed": 1179588448, + "version": 440, + "versionNonce": 1819695776, + "isDeleted": false, + "boundElements": null, + "updated": 1780079488426, + "link": null, + "locked": false, + "text": "20", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "TJxTsmrsSoeRfyHKcXE_s", + "originalText": "20", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "bPYW971xgCa0MHHVTFgP3", + "type": "text", + "x": 808.949340921875, + "y": 324.9684152558594, + "width": 23.443756103515625, + "height": 42.01260375976565, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "UkwdP-itH0c91kcmPijxf" + ], + "frameId": null, + "index": "a7z", + "roundness": null, + "seed": 255142752, + "version": 380, + "versionNonce": 1309804192, + "isDeleted": false, + "boundElements": null, + "updated": 1780079488426, + "link": null, + "locked": false, + "text": "2", + "fontSize": 33.61008300781252, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "wnDuPN3y-b_1ns6VJmtuh", + "type": "rectangle", + "x": 1055.1138916015625, + "y": 835.2279052734375, + "width": 196.86077880859375, + "height": 89.92404174804688, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Zh_xHVonrUs50dXcIoH10" + ], + "frameId": null, + "index": "a8", + "roundness": { + "type": 3 + }, + "seed": 732284768, + "version": 416, + "versionNonce": 1610674848, + "isDeleted": true, + "boundElements": null, + "updated": 1780078998127, + "link": null, + "locked": false + }, + { + "id": "_lMyRB-AF7ykIg44Cq5a2", + "type": "rectangle", + "x": 1096.4302368164062, + "y": 849.0002136230469, + "width": 62.379760742187514, + "height": 61.734161376953146, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Zh_xHVonrUs50dXcIoH10" + ], + "frameId": null, + "index": "a9", + "roundness": { + "type": 3 + }, + "seed": 1983241056, + "version": 454, + "versionNonce": 1387595616, + "isDeleted": true, + "boundElements": [ + { + "type": "text", + "id": "JFChWAHFJSXKQy8S5_oII" + } + ], + "updated": 1780078998127, + "link": null, + "locked": false + }, + { + "id": "JFChWAHFJSXKQy8S5_oII", + "type": "text", + "x": 1121.64208984375, + "y": 862.3672943115234, + "width": 11.9560546875, + "height": 35, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Zh_xHVonrUs50dXcIoH10" + ], + "frameId": null, + "index": "aA", + "roundness": null, + "seed": 497250144, + "version": 325, + "versionNonce": 612998816, + "isDeleted": true, + "boundElements": null, + "updated": 1780078998127, + "link": null, + "locked": false, + "text": "1", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "_lMyRB-AF7ykIg44Cq5a2", + "originalText": "1", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "E7Y254MK3ZpnWX-xn4E5-", + "type": "rectangle", + "x": 1172.5824584960938, + "y": 849.810302734375, + "width": 63.189758300781264, + "height": 61.114013671875014, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Zh_xHVonrUs50dXcIoH10" + ], + "frameId": null, + "index": "aB", + "roundness": { + "type": 3 + }, + "seed": 708739936, + "version": 467, + "versionNonce": 2036144992, + "isDeleted": true, + "boundElements": [ + { + "type": "text", + "id": "_9AVmhbaENLzkx2EWTaK1" + } + ], + "updated": 1780078998127, + "link": null, + "locked": false + }, + { + "id": "_9AVmhbaENLzkx2EWTaK1", + "type": "text", + "x": 1189.3932723999023, + "y": 862.8673095703125, + "width": 29.568130493164062, + "height": 35, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Zh_xHVonrUs50dXcIoH10" + ], + "frameId": null, + "index": "aC", + "roundness": null, + "seed": 441915232, + "version": 346, + "versionNonce": 723307168, + "isDeleted": true, + "boundElements": null, + "updated": 1780078998127, + "link": null, + "locked": false, + "text": "19", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "E7Y254MK3ZpnWX-xn4E5-", + "originalText": "19", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "2lDWXeGWQCH_CU6VRowP5", + "type": "text", + "x": 1068.3163452148438, + "y": 859.930419921875, + "width": 23.443756103515625, + "height": 42.01260375976565, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Zh_xHVonrUs50dXcIoH10" + ], + "frameId": null, + "index": "aD", + "roundness": null, + "seed": 574434144, + "version": 266, + "versionNonce": 971157344, + "isDeleted": true, + "boundElements": null, + "updated": 1780078998127, + "link": null, + "locked": false, + "text": "1", + "fontSize": 33.61008300781252, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "1", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "VByMz-kwzoHavlClW_Ecf", + "type": "rectangle", + "x": 521.5189208984375, + "y": 1066.3926391601562, + "width": 196.86077880859375, + "height": 89.92404174804688, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "dDTDDLDA-ZpSfNfxI-oDc" + ], + "frameId": null, + "index": "aE", + "roundness": { + "type": 3 + }, + "seed": 492826272, + "version": 475, + "versionNonce": 102435680, + "isDeleted": true, + "boundElements": null, + "updated": 1780078999362, + "link": null, + "locked": false + }, + { + "id": "Dq6nf0-KOaFbFDK_q6LkX", + "type": "rectangle", + "x": 562.8352661132812, + "y": 1080.1649475097656, + "width": 62.379760742187514, + "height": 61.734161376953146, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "dDTDDLDA-ZpSfNfxI-oDc" + ], + "frameId": null, + "index": "aF", + "roundness": { + "type": 3 + }, + "seed": 1420368544, + "version": 513, + "versionNonce": 1165351584, + "isDeleted": true, + "boundElements": [ + { + "type": "text", + "id": "gP12NY19Fa8cB3p59kgP9" + } + ], + "updated": 1780078999362, + "link": null, + "locked": false + }, + { + "id": "gP12NY19Fa8cB3p59kgP9", + "type": "text", + "x": 588.047119140625, + "y": 1093.5320281982422, + "width": 11.9560546875, + "height": 35, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "dDTDDLDA-ZpSfNfxI-oDc" + ], + "frameId": null, + "index": "aG", + "roundness": null, + "seed": 569165472, + "version": 384, + "versionNonce": 1499635552, + "isDeleted": true, + "boundElements": null, + "updated": 1780078999362, + "link": null, + "locked": false, + "text": "1", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "Dq6nf0-KOaFbFDK_q6LkX", + "originalText": "1", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "y3OHZx2B9dqH--V-HYiv0", + "type": "rectangle", + "x": 638.9874877929688, + "y": 1080.9750366210938, + "width": 63.189758300781264, + "height": 61.114013671875014, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "dDTDDLDA-ZpSfNfxI-oDc" + ], + "frameId": null, + "index": "aH", + "roundness": { + "type": 3 + }, + "seed": 1641738912, + "version": 526, + "versionNonce": 1528923808, + "isDeleted": true, + "boundElements": [ + { + "type": "text", + "id": "j-vMGLUlUAiHey4z66ghH" + } + ], + "updated": 1780078999362, + "link": null, + "locked": false + }, + { + "id": "j-vMGLUlUAiHey4z66ghH", + "type": "text", + "x": 655.7983016967773, + "y": 1094.0320434570312, + "width": 29.568130493164062, + "height": 35, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "dDTDDLDA-ZpSfNfxI-oDc" + ], + "frameId": null, + "index": "aI", + "roundness": null, + "seed": 1529061024, + "version": 405, + "versionNonce": 110605152, + "isDeleted": true, + "boundElements": null, + "updated": 1780078999362, + "link": null, + "locked": false, + "text": "19", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "y3OHZx2B9dqH--V-HYiv0", + "originalText": "19", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "HppQ20x3Ar1cw7nNDqv5_", + "type": "text", + "x": 534.7213745117188, + "y": 1091.0951538085938, + "width": 23.443756103515625, + "height": 42.01260375976565, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "dDTDDLDA-ZpSfNfxI-oDc" + ], + "frameId": null, + "index": "aJ", + "roundness": null, + "seed": 2121714336, + "version": 325, + "versionNonce": 376943264, + "isDeleted": true, + "boundElements": null, + "updated": 1780078999362, + "link": null, + "locked": false, + "text": "1", + "fontSize": 33.61008300781252, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "1", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "CcQeSrqxfvACKy_S3MUka", + "type": "rectangle", + "x": 293.59490966796875, + "y": 548.1366564053384, + "width": 121.51898193359375, + "height": 89.92404174804688, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "bxcKMmt2k_6FoqKJHZ0nU" + ], + "frameId": null, + "index": "aJ4", + "roundness": { + "type": 3 + }, + "seed": 619699040, + "version": 519, + "versionNonce": 1379757920, + "isDeleted": false, + "boundElements": null, + "updated": 1780079940476, + "link": null, + "locked": false + }, + { + "id": "khTdRYpJFoJefxyJBtwc6", + "type": "rectangle", + "x": 334.9112548828125, + "y": 561.9089647549478, + "width": 62.379760742187514, + "height": 61.734161376953146, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "bxcKMmt2k_6FoqKJHZ0nU" + ], + "frameId": null, + "index": "aJ8", + "roundness": { + "type": 3 + }, + "seed": 1696427872, + "version": 533, + "versionNonce": 49464992, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "MMGZmQV7yueVyK70jDCh-" + }, + { + "id": "GG6wQHDxaZz94xArRmB70", + "type": "arrow" + }, + { + "id": "1QQSN0e8OOsRKfH0eY16E", + "type": "arrow" + } + ], + "updated": 1780079990037, + "link": null, + "locked": false + }, + { + "id": "MMGZmQV7yueVyK70jDCh-", + "type": "text", + "x": 357.4490966796875, + "y": 575.2760454434243, + "width": 17.3040771484375, + "height": 35, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "bxcKMmt2k_6FoqKJHZ0nU" + ], + "frameId": null, + "index": "aJC", + "roundness": null, + "seed": 1920500576, + "version": 400, + "versionNonce": 999850848, + "isDeleted": false, + "boundElements": null, + "updated": 1780079940476, + "link": null, + "locked": false, + "text": "5", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "khTdRYpJFoJefxyJBtwc6", + "originalText": "5", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "SfisR-rFzOED_ZNicw6jT", + "type": "text", + "x": 306.79736328125, + "y": 572.8391710537759, + "width": 23.443756103515625, + "height": 42.01260375976565, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "bxcKMmt2k_6FoqKJHZ0nU" + ], + "frameId": null, + "index": "aJG", + "roundness": null, + "seed": 649772896, + "version": 341, + "versionNonce": 1252778656, + "isDeleted": false, + "boundElements": null, + "updated": 1780079940476, + "link": null, + "locked": false, + "text": "5", + "fontSize": 33.61008300781252, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "5", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "_zexOqRpdlniPSdyk6S6F", + "type": "rectangle", + "x": 1297.8988647460938, + "y": 548.1366564053384, + "width": 196.86077880859375, + "height": 89.92404174804688, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "GWELL1Vtc0ol1sjGKutAe" + ], + "frameId": null, + "index": "aJK", + "roundness": { + "type": 3 + }, + "seed": 1376369504, + "version": 422, + "versionNonce": 1302309536, + "isDeleted": false, + "boundElements": null, + "updated": 1780079471199, + "link": null, + "locked": false + }, + { + "id": "J5aP9-ljKdeJV09ZXYt0h", + "type": "rectangle", + "x": 1339.2152099609375, + "y": 561.9089647549478, + "width": 62.379760742187514, + "height": 61.734161376953146, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "GWELL1Vtc0ol1sjGKutAe" + ], + "frameId": null, + "index": "aJO", + "roundness": { + "type": 3 + }, + "seed": 335236960, + "version": 463, + "versionNonce": 1844732768, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "ny0tTHPKhraVOnbEpkZlr" + }, + { + "id": "V4L09q40oc7mc7XNI_EoB", + "type": "arrow" + } + ], + "updated": 1780080030327, + "link": null, + "locked": false + }, + { + "id": "ny0tTHPKhraVOnbEpkZlr", + "type": "text", + "x": 1361.5990524291992, + "y": 575.2760454434243, + "width": 17.612075805664062, + "height": 35, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "GWELL1Vtc0ol1sjGKutAe" + ], + "frameId": null, + "index": "aJS", + "roundness": null, + "seed": 1251631968, + "version": 333, + "versionNonce": 374096544, + "isDeleted": false, + "boundElements": null, + "updated": 1780079829331, + "link": null, + "locked": false, + "text": "9", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "J5aP9-ljKdeJV09ZXYt0h", + "originalText": "9", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "PLXKFvZP-vxRC0RrLGddl", + "type": "rectangle", + "x": 1415.367431640625, + "y": 562.7190538662759, + "width": 63.189758300781264, + "height": 61.114013671875014, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "GWELL1Vtc0ol1sjGKutAe" + ], + "frameId": null, + "index": "aJV", + "roundness": { + "type": 3 + }, + "seed": 70711136, + "version": 476, + "versionNonce": 1530698400, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "iQ92FfhEnrNAKnFekbL3a" + }, + { + "id": "S5UeI8NSelZbAPJDapaq0", + "type": "arrow" + } + ], + "updated": 1780080056353, + "link": null, + "locked": false + }, + { + "id": "iQ92FfhEnrNAKnFekbL3a", + "type": "text", + "x": 1429.7982330322266, + "y": 575.7760607022134, + "width": 34.328155517578125, + "height": 35, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "GWELL1Vtc0ol1sjGKutAe" + ], + "frameId": null, + "index": "aJZ", + "roundness": null, + "seed": 86051680, + "version": 355, + "versionNonce": 1134338912, + "isDeleted": false, + "boundElements": null, + "updated": 1780079897784, + "link": null, + "locked": false, + "text": "35", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "PLXKFvZP-vxRC0RrLGddl", + "originalText": "35", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "i_ECiY-JsZjH3Hq2Npf7c", + "type": "text", + "x": 1311.101318359375, + "y": 572.8391710537759, + "width": 23.443756103515625, + "height": 42.01260375976565, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "GWELL1Vtc0ol1sjGKutAe" + ], + "frameId": null, + "index": "aJd", + "roundness": null, + "seed": 128491360, + "version": 273, + "versionNonce": 1863939936, + "isDeleted": false, + "boundElements": null, + "updated": 1780079471199, + "link": null, + "locked": false, + "text": "9", + "fontSize": 33.61008300781252, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "9", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "hQunk3MiWoYlfbcp58Uf_", + "type": "rectangle", + "x": 488.16455078125, + "y": 548.1366564053384, + "width": 196.86077880859375, + "height": 89.92404174804688, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "XBc498YpROwHnUiNrYsp3" + ], + "frameId": null, + "index": "aJh", + "roundness": { + "type": 3 + }, + "seed": 1716730528, + "version": 432, + "versionNonce": 1122250400, + "isDeleted": false, + "boundElements": null, + "updated": 1780079471199, + "link": null, + "locked": false + }, + { + "id": "vtbCoyORBNuhxGeIS2rAT", + "type": "rectangle", + "x": 529.4808959960938, + "y": 561.9089647549478, + "width": 62.379760742187514, + "height": 61.734161376953146, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "XBc498YpROwHnUiNrYsp3" + ], + "frameId": null, + "index": "aJl", + "roundness": { + "type": 3 + }, + "seed": 961734304, + "version": 476, + "versionNonce": 1397970592, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "N2H0DZNNluPzOj0hVf9Lk" + }, + { + "id": "ANCOcFXswqMuoCGFJoBM6", + "type": "arrow" + }, + { + "id": "wCs751CmQo11r9GLpT8rq", + "type": "arrow" + }, + { + "id": "7-sTWh80fk_rLwxWKaPl5", + "type": "arrow" + }, + { + "id": "hQcz95XgalI1IoOoxDjaS", + "type": "arrow" + } + ], + "updated": 1780080284158, + "link": null, + "locked": false + }, + { + "id": "N2H0DZNNluPzOj0hVf9Lk", + "type": "text", + "x": 551.7107391357422, + "y": 575.2760454434243, + "width": 17.920074462890625, + "height": 35, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "XBc498YpROwHnUiNrYsp3" + ], + "frameId": null, + "index": "aJp", + "roundness": null, + "seed": 1736250016, + "version": 343, + "versionNonce": 693166752, + "isDeleted": false, + "boundElements": null, + "updated": 1780079812882, + "link": null, + "locked": false, + "text": "6", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "vtbCoyORBNuhxGeIS2rAT", + "originalText": "6", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "2P49ogT0ZQV_qQfPj4Eil", + "type": "rectangle", + "x": 605.6331176757812, + "y": 562.7190538662759, + "width": 63.189758300781264, + "height": 61.114013671875014, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "XBc498YpROwHnUiNrYsp3" + ], + "frameId": null, + "index": "aJt", + "roundness": { + "type": 3 + }, + "seed": 662814368, + "version": 489, + "versionNonce": 59600736, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "9SYvqqDpdwU9ZT6kil3nK" + }, + { + "id": "WahhtKdJZnbhvsejA8H_V", + "type": "arrow" + }, + { + "id": "b3nWdLnfl6fLaw2Ms5KrB", + "type": "arrow" + }, + { + "id": "poxXw_rSXuwsfCMRFKC5D", + "type": "arrow" + }, + { + "id": "BoCx9dzg0nl2POuNA98-h", + "type": "arrow" + } + ], + "updated": 1780080310123, + "link": null, + "locked": false + }, + { + "id": "9SYvqqDpdwU9ZT6kil3nK", + "type": "text", + "x": 618.9159164428711, + "y": 575.7760607022134, + "width": 36.62416076660156, + "height": 35, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "XBc498YpROwHnUiNrYsp3" + ], + "frameId": null, + "index": "aK", + "roundness": null, + "seed": 1511058080, + "version": 365, + "versionNonce": 83780256, + "isDeleted": false, + "boundElements": null, + "updated": 1780079888349, + "link": null, + "locked": false, + "text": "32", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "2P49ogT0ZQV_qQfPj4Eil", + "originalText": "32", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "S6dG-foWLvXQ93vjxUZLQ", + "type": "text", + "x": 501.36700439453125, + "y": 572.8391710537759, + "width": 23.443756103515625, + "height": 42.01260375976565, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "XBc498YpROwHnUiNrYsp3" + ], + "frameId": null, + "index": "aK8", + "roundness": null, + "seed": 1239062176, + "version": 283, + "versionNonce": 1141912416, + "isDeleted": false, + "boundElements": null, + "updated": 1780079471199, + "link": null, + "locked": false, + "text": "6", + "fontSize": 33.61008300781252, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "6", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "GNC5YhNwVktpjhou5QRjW", + "type": "rectangle", + "x": 758.0759887695312, + "y": 548.1366564053384, + "width": 196.86077880859375, + "height": 89.92404174804688, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "sbvXPaMw1CJhLS0dct741" + ], + "frameId": null, + "index": "aKG", + "roundness": { + "type": 3 + }, + "seed": 1890791264, + "version": 420, + "versionNonce": 1791439520, + "isDeleted": false, + "boundElements": null, + "updated": 1780079471199, + "link": null, + "locked": false + }, + { + "id": "0kIbDVApSaakgqZgbhl_8", + "type": "rectangle", + "x": 799.392333984375, + "y": 561.9089647549478, + "width": 62.379760742187514, + "height": 61.734161376953146, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "sbvXPaMw1CJhLS0dct741" + ], + "frameId": null, + "index": "aKO", + "roundness": { + "type": 3 + }, + "seed": 89539424, + "version": 462, + "versionNonce": 1833584288, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "MBevIyzy9UkubUmVWHdR3" + }, + { + "id": "e85SgGI6hQshJ-wOcmEec", + "type": "arrow" + }, + { + "id": "fimDimHre7gzALvlCW3GF", + "type": "arrow" + } + ], + "updated": 1780080297545, + "link": null, + "locked": false + }, + { + "id": "MBevIyzy9UkubUmVWHdR3", + "type": "text", + "x": 822.7701797485352, + "y": 575.2760454434243, + "width": 15.624069213867188, + "height": 35, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "sbvXPaMw1CJhLS0dct741" + ], + "frameId": null, + "index": "aKV", + "roundness": null, + "seed": 1014421344, + "version": 331, + "versionNonce": 276850336, + "isDeleted": false, + "boundElements": null, + "updated": 1780079817503, + "link": null, + "locked": false, + "text": "7", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "0kIbDVApSaakgqZgbhl_8", + "originalText": "7", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "zpO_DOVRzuXGA-uUE592T", + "type": "rectangle", + "x": 875.5445556640625, + "y": 562.7190538662759, + "width": 63.189758300781264, + "height": 61.114013671875014, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "sbvXPaMw1CJhLS0dct741" + ], + "frameId": null, + "index": "aKd", + "roundness": { + "type": 3 + }, + "seed": 1784998752, + "version": 475, + "versionNonce": 1555022688, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "1hlUp3Eey5MmCCQXHJ-vM" + }, + { + "id": "4M0aw-MuSEJB2BnJP21ZG", + "type": "arrow" + }, + { + "id": "_aUc2ytyiMBfQSbD-J8Rr", + "type": "arrow" + } + ], + "updated": 1780080319842, + "link": null, + "locked": false + }, + { + "id": "1hlUp3Eey5MmCCQXHJ-vM", + "type": "text", + "x": 890.1153564453125, + "y": 575.7760607022134, + "width": 34.04815673828125, + "height": 35, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "sbvXPaMw1CJhLS0dct741" + ], + "frameId": null, + "index": "aKl", + "roundness": null, + "seed": 1500544864, + "version": 353, + "versionNonce": 1183858528, + "isDeleted": false, + "boundElements": null, + "updated": 1780079891222, + "link": null, + "locked": false, + "text": "33", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "zpO_DOVRzuXGA-uUE592T", + "originalText": "33", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "eD0KzU4dMIcB3ooPDYXix", + "type": "text", + "x": 771.2784423828125, + "y": 572.8391710537759, + "width": 23.443756103515625, + "height": 42.01260375976565, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "sbvXPaMw1CJhLS0dct741" + ], + "frameId": null, + "index": "aL", + "roundness": null, + "seed": 166302560, + "version": 271, + "versionNonce": 1362128736, + "isDeleted": false, + "boundElements": null, + "updated": 1780079471199, + "link": null, + "locked": false, + "text": "7", + "fontSize": 33.61008300781252, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "7", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "hGqXyzfwU0h-9CEa0OQQn", + "type": "rectangle", + "x": 1027.9874267578125, + "y": 548.1366564053384, + "width": 196.86077880859375, + "height": 89.92404174804688, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "9VxgM8p1jCWl7GS52Rufa" + ], + "frameId": null, + "index": "aLG", + "roundness": { + "type": 3 + }, + "seed": 274269856, + "version": 419, + "versionNonce": 1809364640, + "isDeleted": false, + "boundElements": null, + "updated": 1780079471199, + "link": null, + "locked": false + }, + { + "id": "lUnMtYYu6_Z5KbS8aBw6h", + "type": "rectangle", + "x": 1069.3037719726562, + "y": 561.9089647549478, + "width": 62.379760742187514, + "height": 61.734161376953146, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "9VxgM8p1jCWl7GS52Rufa" + ], + "frameId": null, + "index": "aLV", + "roundness": { + "type": 3 + }, + "seed": 952054432, + "version": 461, + "versionNonce": 1269225120, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "D4dmMu3GrW4wYpOrgzAqM" + }, + { + "id": "keDUBGSsCQa5pUFZYwwpt", + "type": "arrow" + }, + { + "id": "sp0ZJ2rvPpH2i9fv5V9th", + "type": "arrow" + } + ], + "updated": 1780080300337, + "link": null, + "locked": false + }, + { + "id": "D4dmMu3GrW4wYpOrgzAqM", + "type": "text", + "x": 1091.589614868164, + "y": 575.2760454434243, + "width": 17.808074951171875, + "height": 35, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "9VxgM8p1jCWl7GS52Rufa" + ], + "frameId": null, + "index": "aLl", + "roundness": null, + "seed": 1266671264, + "version": 330, + "versionNonce": 1820860064, + "isDeleted": false, + "boundElements": null, + "updated": 1780080622183, + "link": null, + "locked": false, + "text": "8", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "lUnMtYYu6_Z5KbS8aBw6h", + "originalText": "8", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "OoFLXXxm0y4ueYkZugPH_", + "type": "rectangle", + "x": 1145.4559936523438, + "y": 562.7190538662759, + "width": 63.189758300781264, + "height": 61.114013671875014, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "9VxgM8p1jCWl7GS52Rufa" + ], + "frameId": null, + "index": "aM", + "roundness": { + "type": 3 + }, + "seed": 424348320, + "version": 474, + "versionNonce": 944210784, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "4QdZdttSSSTQWhoMu8ddE" + }, + { + "id": "J_f4VZ0LLdTYRvQW6VjOF", + "type": "arrow" + }, + { + "id": "ZhPI25txmH1eL47bvmX3g", + "type": "arrow" + } + ], + "updated": 1780080324119, + "link": null, + "locked": false + }, + { + "id": "4QdZdttSSSTQWhoMu8ddE", + "type": "text", + "x": 1160.3488006591797, + "y": 575.7760607022134, + "width": 33.404144287109375, + "height": 35, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "9VxgM8p1jCWl7GS52Rufa" + ], + "frameId": null, + "index": "aMV", + "roundness": null, + "seed": 1557182112, + "version": 352, + "versionNonce": 277659296, + "isDeleted": false, + "boundElements": null, + "updated": 1780079894439, + "link": null, + "locked": false, + "text": "34", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "OoFLXXxm0y4ueYkZugPH_", + "originalText": "34", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "52bxkgonJoiCsCtHftHqF", + "type": "text", + "x": 1041.1898803710938, + "y": 572.8391710537759, + "width": 23.443756103515625, + "height": 42.01260375976565, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "9VxgM8p1jCWl7GS52Rufa" + ], + "frameId": null, + "index": "aN", + "roundness": null, + "seed": 2059461280, + "version": 270, + "versionNonce": 82455392, + "isDeleted": false, + "boundElements": null, + "updated": 1780079471199, + "link": null, + "locked": false, + "text": "8", + "fontSize": 33.61008300781252, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "8", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "unJ4FZAm_IRui9P7b-vm8", + "type": "rectangle", + "x": 778.9113159179688, + "y": 836.8988037109375, + "width": 196.86077880859375, + "height": 89.92404174804688, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "SpcAbE6cWtOOZrnOWH3Ot" + ], + "frameId": null, + "index": "ai", + "roundness": { + "type": 3 + }, + "seed": 980558688, + "version": 434, + "versionNonce": 1315600032, + "isDeleted": true, + "boundElements": null, + "updated": 1780078998127, + "link": null, + "locked": false + }, + { + "id": "F7msntjSw89T7FS_ZK11N", + "type": "rectangle", + "x": 820.2276611328125, + "y": 850.6711120605469, + "width": 62.379760742187514, + "height": 61.734161376953146, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "SpcAbE6cWtOOZrnOWH3Ot" + ], + "frameId": null, + "index": "aj", + "roundness": { + "type": 3 + }, + "seed": 588691296, + "version": 472, + "versionNonce": 2090189664, + "isDeleted": true, + "boundElements": [ + { + "type": "text", + "id": "lN50QY1kkf7jjZlyK6-1L" + } + ], + "updated": 1780078998127, + "link": null, + "locked": false + }, + { + "id": "lN50QY1kkf7jjZlyK6-1L", + "type": "text", + "x": 845.4395141601562, + "y": 864.0381927490234, + "width": 11.9560546875, + "height": 35, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "SpcAbE6cWtOOZrnOWH3Ot" + ], + "frameId": null, + "index": "ak", + "roundness": null, + "seed": 839437152, + "version": 343, + "versionNonce": 321036960, + "isDeleted": true, + "boundElements": null, + "updated": 1780078998127, + "link": null, + "locked": false, + "text": "1", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "F7msntjSw89T7FS_ZK11N", + "originalText": "1", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "u-kxBXLEy0iUOQuMskDAj", + "type": "rectangle", + "x": 896.3798828125, + "y": 851.481201171875, + "width": 63.189758300781264, + "height": 61.114013671875014, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "SpcAbE6cWtOOZrnOWH3Ot" + ], + "frameId": null, + "index": "al", + "roundness": { + "type": 3 + }, + "seed": 1100504928, + "version": 485, + "versionNonce": 533092192, + "isDeleted": true, + "boundElements": [ + { + "type": "text", + "id": "zGw5dnxbojhNSp2TAep0I" + } + ], + "updated": 1780078998127, + "link": null, + "locked": false + }, + { + "id": "zGw5dnxbojhNSp2TAep0I", + "type": "text", + "x": 913.1906967163086, + "y": 864.5382080078125, + "width": 29.568130493164062, + "height": 35, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "SpcAbE6cWtOOZrnOWH3Ot" + ], + "frameId": null, + "index": "am", + "roundness": null, + "seed": 1645572960, + "version": 364, + "versionNonce": 1744129696, + "isDeleted": true, + "boundElements": null, + "updated": 1780078998127, + "link": null, + "locked": false, + "text": "19", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "u-kxBXLEy0iUOQuMskDAj", + "originalText": "19", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "50VT8aHoJ43GizLjo5QG-", + "type": "text", + "x": 792.11376953125, + "y": 861.601318359375, + "width": 23.443756103515625, + "height": 42.01260375976565, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "SpcAbE6cWtOOZrnOWH3Ot" + ], + "frameId": null, + "index": "an", + "roundness": null, + "seed": 433063776, + "version": 284, + "versionNonce": 935619424, + "isDeleted": true, + "boundElements": null, + "updated": 1780078998127, + "link": null, + "locked": false, + "text": "1", + "fontSize": 33.61008300781252, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "1", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "aYLy7o1z0LzLaGvP2HPeL", + "type": "rectangle", + "x": 489.9999694824219, + "y": 805.7064156423426, + "width": 203.34185791015625, + "height": 92.88453408800635, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "7sniAKmu9t48jPH8pb38c" + ], + "frameId": null, + "index": "anG", + "roundness": { + "type": 3 + }, + "seed": 1973506720, + "version": 597, + "versionNonce": 1899283296, + "isDeleted": false, + "boundElements": null, + "updated": 1780079424456, + "link": null, + "locked": false + }, + { + "id": "_c1qOcOxxsa8kM1ce1Jq-", + "type": "rectangle", + "x": 542.3981560569737, + "y": 819.9321379241995, + "width": 64.43343626939726, + "height": 63.76658238825919, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "7sniAKmu9t48jPH8pb38c" + ], + "frameId": null, + "index": "anV", + "roundness": { + "type": 3 + }, + "seed": 1730018976, + "version": 651, + "versionNonce": 375826080, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "ZdNyB-AaMUVAFKswLqgFk" + }, + { + "id": "hQcz95XgalI1IoOoxDjaS", + "type": "arrow" + }, + { + "id": "A9N8RCpKCIXPlMwGYH3OT", + "type": "arrow" + } + ], + "updated": 1780080292879, + "link": null, + "locked": false + }, + { + "id": "ZdNyB-AaMUVAFKswLqgFk", + "type": "text", + "x": 558.3261550144263, + "y": 833.7392915811124, + "width": 32.57743835449219, + "height": 36.15227507443339, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "7sniAKmu9t48jPH8pb38c" + ], + "frameId": null, + "index": "anl", + "roundness": null, + "seed": 1545939616, + "version": 535, + "versionNonce": 940072800, + "isDeleted": false, + "boundElements": null, + "updated": 1780079837139, + "link": null, + "locked": false, + "text": "21", + "fontSize": 28.92182005954671, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "_c1qOcOxxsa8kM1ce1Jq-", + "originalText": "21", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "PA2rwxhotYzPQJ5209oqD", + "type": "rectangle", + "x": 617.0067520047954, + "y": 819.1487186840444, + "width": 65.27010068505156, + "height": 63.1260180905231, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "7sniAKmu9t48jPH8pb38c" + ], + "frameId": null, + "index": "ao", + "roundness": { + "type": 3 + }, + "seed": 2137446048, + "version": 661, + "versionNonce": 821022560, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "7wD8PJmjGHQIQEGWfdbR4" + }, + { + "id": "BoCx9dzg0nl2POuNA98-h", + "type": "arrow" + }, + { + "id": "kSS66EUpUAnxldZWlCWbQ", + "type": "arrow" + } + ], + "updated": 1780080314774, + "link": null, + "locked": false + }, + { + "id": "7wD8PJmjGHQIQEGWfdbR4", + "type": "text", + "x": 631.1128335362861, + "y": 832.6355901920892, + "width": 37.05793762207031, + "height": 36.15227507443339, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "7sniAKmu9t48jPH8pb38c" + ], + "frameId": null, + "index": "aoV", + "roundness": null, + "seed": 630391456, + "version": 553, + "versionNonce": 1268882080, + "isDeleted": false, + "boundElements": null, + "updated": 1780079905059, + "link": null, + "locked": false, + "text": "50", + "fontSize": 28.92182005954671, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "PA2rwxhotYzPQJ5209oqD", + "originalText": "50", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "UTexpsH0tzPmBxBO8PqMP", + "type": "text", + "x": 503.6370761877016, + "y": 831.2221900595007, + "width": 36.36749134482692, + "height": 43.39574879189206, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "7sniAKmu9t48jPH8pb38c" + ], + "frameId": null, + "index": "ap", + "roundness": null, + "seed": 223981216, + "version": 460, + "versionNonce": 237206176, + "isDeleted": false, + "boundElements": null, + "updated": 1780079424456, + "link": null, + "locked": false, + "text": "17", + "fontSize": 34.716599033513646, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "17", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "kPVzwqSj7kSDDAEzmNF1w", + "type": "rectangle", + "x": 489.9999694824219, + "y": 1059.2609147807789, + "width": 203.34185791015625, + "height": 92.88453408800635, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2SfB7fSU30le3Zj5QlmWS" + ], + "frameId": null, + "index": "apG", + "roundness": { + "type": 3 + }, + "seed": 1040866144, + "version": 475, + "versionNonce": 1324990304, + "isDeleted": false, + "boundElements": null, + "updated": 1780079415188, + "link": null, + "locked": false + }, + { + "id": "vPICexBxfriqk69ciaHgi", + "type": "rectangle", + "x": 542.3981560569737, + "y": 1073.486637062636, + "width": 64.43343626939726, + "height": 63.76658238825919, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2SfB7fSU30le3Zj5QlmWS" + ], + "frameId": null, + "index": "apV", + "roundness": { + "type": 3 + }, + "seed": 1994911584, + "version": 528, + "versionNonce": 777054880, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "5PGuuFH_99_L6prp86OS0" + }, + { + "id": "A9N8RCpKCIXPlMwGYH3OT", + "type": "arrow" + } + ], + "updated": 1780080294484, + "link": null, + "locked": false + }, + { + "id": "5PGuuFH_99_L6prp86OS0", + "type": "text", + "x": 556.5628569797583, + "y": 1087.293790719549, + "width": 36.104034423828125, + "height": 36.15227507443339, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2SfB7fSU30le3Zj5QlmWS" + ], + "frameId": null, + "index": "apl", + "roundness": null, + "seed": 1727202144, + "version": 416, + "versionNonce": 1277886304, + "isDeleted": false, + "boundElements": null, + "updated": 1780079847714, + "link": null, + "locked": false, + "text": "40", + "fontSize": 28.92182005954671, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "vPICexBxfriqk69ciaHgi", + "originalText": "40", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "-qQpKBIq_HbUn-ETjiWf8", + "type": "rectangle", + "x": 617.0067520047954, + "y": 1072.7032178224808, + "width": 65.27010068505156, + "height": 63.1260180905231, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2SfB7fSU30le3Zj5QlmWS" + ], + "frameId": null, + "index": "aq", + "roundness": { + "type": 3 + }, + "seed": 1283168096, + "version": 538, + "versionNonce": 1595459232, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "xeDj3Jm6WFLsVikkwwjc9" + }, + { + "id": "kSS66EUpUAnxldZWlCWbQ", + "type": "arrow" + } + ], + "updated": 1780080317458, + "link": null, + "locked": false + }, + { + "id": "xeDj3Jm6WFLsVikkwwjc9", + "type": "text", + "x": 630.274553812165, + "y": 1086.1900893305258, + "width": 38.7344970703125, + "height": 36.15227507443339, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2SfB7fSU30le3Zj5QlmWS" + ], + "frameId": null, + "index": "aqV", + "roundness": null, + "seed": 466725728, + "version": 434, + "versionNonce": 1340833440, + "isDeleted": false, + "boundElements": null, + "updated": 1780079917128, + "link": null, + "locked": false, + "text": "62", + "fontSize": 28.92182005954671, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "-qQpKBIq_HbUn-ETjiWf8", + "originalText": "62", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "eYWeEFvbkb0w1o7Uzxfuw", + "type": "text", + "x": 493.91557960567036, + "y": 1086.3969284557495, + "width": 50.13970814170192, + "height": 43.39574879189206, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "2SfB7fSU30le3Zj5QlmWS" + ], + "frameId": null, + "index": "ar", + "roundness": null, + "seed": 1061502816, + "version": 371, + "versionNonce": 1511400288, + "isDeleted": false, + "boundElements": null, + "updated": 1780079415188, + "link": null, + "locked": false, + "text": "23", + "fontSize": 34.716599033513646, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "23", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "mQyfo8eMitL75ZETm3XyA", + "type": "rectangle", + "x": 1024.7468869746092, + "y": 801.6558174978113, + "width": 203.34185791015625, + "height": 92.88453408800635, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "b6imE_dKtc4OLqW5_wtyo" + ], + "frameId": null, + "index": "arG", + "roundness": { + "type": 3 + }, + "seed": 18651808, + "version": 538, + "versionNonce": 595897184, + "isDeleted": false, + "boundElements": null, + "updated": 1780079473473, + "link": null, + "locked": false + }, + { + "id": "RmeUelkOgDV8pU4H9ByaY", + "type": "rectangle", + "x": 1077.145073549161, + "y": 815.8815397796683, + "width": 64.43343626939726, + "height": 63.76658238825919, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "b6imE_dKtc4OLqW5_wtyo" + ], + "frameId": null, + "index": "arV", + "roundness": { + "type": 3 + }, + "seed": 1945126560, + "version": 591, + "versionNonce": 857157280, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "AFVgwd4mDobtMg2jbaxrJ" + }, + { + "id": "sp0ZJ2rvPpH2i9fv5V9th", + "type": "arrow" + } + ], + "updated": 1780080301475, + "link": null, + "locked": false + }, + { + "id": "AFVgwd4mDobtMg2jbaxrJ", + "type": "text", + "x": 1090.4570446745822, + "y": 829.6886934365812, + "width": 37.80949401855469, + "height": 36.15227507443339, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "b6imE_dKtc4OLqW5_wtyo" + ], + "frameId": null, + "index": "arl", + "roundness": null, + "seed": 661549728, + "version": 478, + "versionNonce": 637584224, + "isDeleted": false, + "boundElements": null, + "updated": 1780079844556, + "link": null, + "locked": false, + "text": "23", + "fontSize": 28.92182005954671, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "RmeUelkOgDV8pU4H9ByaY", + "originalText": "23", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "cMpctaDxbbLzOWnZeoTVm", + "type": "rectangle", + "x": 1151.7536694969829, + "y": 815.0981205395132, + "width": 65.27010068505156, + "height": 63.1260180905231, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "b6imE_dKtc4OLqW5_wtyo" + ], + "frameId": null, + "index": "as", + "roundness": { + "type": 3 + }, + "seed": 575086240, + "version": 601, + "versionNonce": 971607904, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "6eSjTQ11KveLWWavDo-Np" + }, + { + "id": "ZhPI25txmH1eL47bvmX3g", + "type": "arrow" + } + ], + "updated": 1780080325394, + "link": null, + "locked": false + }, + { + "id": "6eSjTQ11KveLWWavDo-Np", + "type": "text", + "x": 1165.3394415802313, + "y": 828.584992047558, + "width": 38.09855651855469, + "height": 36.15227507443339, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "b6imE_dKtc4OLqW5_wtyo" + ], + "frameId": null, + "index": "asV", + "roundness": null, + "seed": 355093152, + "version": 497, + "versionNonce": 1382349472, + "isDeleted": false, + "boundElements": null, + "updated": 1780079914240, + "link": null, + "locked": false, + "text": "52", + "fontSize": 28.92182005954671, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "cMpctaDxbbLzOWnZeoTVm", + "originalText": "52", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "RzP5Wp8j1f3J4ZEo7Pl11", + "type": "text", + "x": 1033.5232759064513, + "y": 829.6019508016882, + "width": 39.60796986045192, + "height": 43.39574879189206, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "b6imE_dKtc4OLqW5_wtyo" + ], + "frameId": null, + "index": "at", + "roundness": null, + "seed": 449312416, + "version": 419, + "versionNonce": 1582141280, + "isDeleted": false, + "boundElements": null, + "updated": 1780079473473, + "link": null, + "locked": false, + "text": "19", + "fontSize": 34.716599033513646, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "19", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "OQbjelZBQAfrftevTlX2z", + "type": "rectangle", + "x": 754.8354487285156, + "y": 801.6558174978113, + "width": 203.34185791015625, + "height": 92.88453408800635, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "nJ02L8gYBTx6obfIengfx" + ], + "frameId": null, + "index": "at8", + "roundness": { + "type": 3 + }, + "seed": 666881888, + "version": 523, + "versionNonce": 1750660960, + "isDeleted": false, + "boundElements": null, + "updated": 1780079479774, + "link": null, + "locked": false + }, + { + "id": "duWvKfn5pX37Ls7MjkDg6", + "type": "rectangle", + "x": 807.2336353030674, + "y": 815.8815397796683, + "width": 64.43343626939726, + "height": 63.76658238825919, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "nJ02L8gYBTx6obfIengfx" + ], + "frameId": null, + "index": "atG", + "roundness": { + "type": 3 + }, + "seed": 1909384032, + "version": 576, + "versionNonce": 952597152, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "mib4AXL9CCLZ00fma490U" + }, + { + "id": "fimDimHre7gzALvlCW3GF", + "type": "arrow" + } + ], + "updated": 1780080298775, + "link": null, + "locked": false + }, + { + "id": "mib4AXL9CCLZ00fma490U", + "type": "text", + "x": 819.2159174026099, + "y": 829.6886934365812, + "width": 40.4688720703125, + "height": 36.15227507443339, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "nJ02L8gYBTx6obfIengfx" + ], + "frameId": null, + "index": "atO", + "roundness": null, + "seed": 1356560224, + "version": 464, + "versionNonce": 892247712, + "isDeleted": false, + "boundElements": null, + "updated": 1780079841128, + "link": null, + "locked": false, + "text": "22", + "fontSize": 28.92182005954671, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "duWvKfn5pX37Ls7MjkDg6", + "originalText": "22", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "4FKubvtBu9zWfVbe9B2_j", + "type": "rectangle", + "x": 881.8422312508893, + "y": 815.0981205395132, + "width": 65.27010068505156, + "height": 63.1260180905231, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "nJ02L8gYBTx6obfIengfx" + ], + "frameId": null, + "index": "atV", + "roundness": { + "type": 3 + }, + "seed": 1228245856, + "version": 586, + "versionNonce": 1367809888, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "WejLJMrMqEeWj9mjp4p0g" + }, + { + "id": "_aUc2ytyiMBfQSbD-J8Rr", + "type": "arrow" + } + ], + "updated": 1780080321148, + "link": null, + "locked": false + }, + { + "id": "WejLJMrMqEeWj9mjp4p0g", + "type": "text", + "x": 899.3737201920479, + "y": 828.584992047558, + "width": 30.207122802734375, + "height": 36.15227507443339, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "nJ02L8gYBTx6obfIengfx" + ], + "frameId": null, + "index": "atd", + "roundness": null, + "seed": 1429020512, + "version": 482, + "versionNonce": 205210464, + "isDeleted": false, + "boundElements": null, + "updated": 1780079910026, + "link": null, + "locked": false, + "text": "51", + "fontSize": 28.92182005954671, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "4FKubvtBu9zWfVbe9B2_j", + "originalText": "51", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "uoAgCVCjmwru4iS-cWtCX", + "type": "text", + "x": 764.4218962541079, + "y": 827.9817115438757, + "width": 47.147622298626494, + "height": 43.39574879189206, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "nJ02L8gYBTx6obfIengfx" + ], + "frameId": null, + "index": "atl", + "roundness": null, + "seed": 621949792, + "version": 407, + "versionNonce": 418536288, + "isDeleted": false, + "boundElements": null, + "updated": 1780079479774, + "link": null, + "locked": false, + "text": "18", + "fontSize": 34.716599033513646, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "18", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "J6FdSXkSlbPwaOkOGOO-2", + "type": "rectangle", + "x": 517.79736328125, + "y": 847.8179216167164, + "width": 203.34185791015625, + "height": 92.88453408800635, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "umW4sQm1fpr3-KFSSGjAr" + ], + "frameId": null, + "index": "au", + "roundness": { + "type": 3 + }, + "seed": 655269536, + "version": 421, + "versionNonce": 1642466144, + "isDeleted": true, + "boundElements": null, + "updated": 1780078986574, + "link": null, + "locked": false + }, + { + "id": "FkqAhmRBFXuqjRJedIhPz", + "type": "rectangle", + "x": 570.1955498558018, + "y": 862.0436438985734, + "width": 64.43343626939726, + "height": 63.76658238825919, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "umW4sQm1fpr3-KFSSGjAr" + ], + "frameId": null, + "index": "av", + "roundness": { + "type": 3 + }, + "seed": 352438944, + "version": 471, + "versionNonce": 534436512, + "isDeleted": true, + "boundElements": [], + "updated": 1780078986574, + "link": null, + "locked": false + }, + { + "id": "jBoQUvreWEbldvjhf5ll_", + "type": "text", + "x": 586.1235488132544, + "y": 875.8507975554862, + "width": 32.57743835449219, + "height": 36.15227507443339, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "umW4sQm1fpr3-KFSSGjAr" + ], + "frameId": null, + "index": "aw", + "roundness": null, + "seed": 867137184, + "version": 358, + "versionNonce": 63807328, + "isDeleted": true, + "boundElements": null, + "updated": 1780078986574, + "link": null, + "locked": false, + "text": "21", + "fontSize": 28.92182005954671, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "FkqAhmRBFXuqjRJedIhPz", + "originalText": "21", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Y3YoRSBNKIvh3u2QrB3fE", + "type": "rectangle", + "x": 644.8041458036236, + "y": 861.2602246584182, + "width": 65.27010068505156, + "height": 63.1260180905231, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "umW4sQm1fpr3-KFSSGjAr" + ], + "frameId": null, + "index": "ax", + "roundness": { + "type": 3 + }, + "seed": 130523808, + "version": 481, + "versionNonce": 551978656, + "isDeleted": true, + "boundElements": [], + "updated": 1780078986574, + "link": null, + "locked": false + }, + { + "id": "KNdnhBk1nieOe3PUguKQO", + "type": "text", + "x": 658.9102273351142, + "y": 874.747096166463, + "width": 37.05793762207031, + "height": 36.15227507443339, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "umW4sQm1fpr3-KFSSGjAr" + ], + "frameId": null, + "index": "ay", + "roundness": null, + "seed": 2147110560, + "version": 376, + "versionNonce": 732083040, + "isDeleted": true, + "boundElements": null, + "updated": 1780078986574, + "link": null, + "locked": false, + "text": "50", + "fontSize": 28.92182005954671, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "Y3YoRSBNKIvh3u2QrB3fE", + "originalText": "50", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "koOEBnGAj-QQXfVQHzz8Q", + "type": "text", + "x": 531.4344699865297, + "y": 873.3336960338745, + "width": 36.36749134482692, + "height": 43.39574879189206, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "umW4sQm1fpr3-KFSSGjAr" + ], + "frameId": null, + "index": "az", + "roundness": null, + "seed": 888634016, + "version": 284, + "versionNonce": 1536996000, + "isDeleted": true, + "boundElements": null, + "updated": 1780078986574, + "link": null, + "locked": false, + "text": "17", + "fontSize": 34.716599033513646, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "17", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "id": "GG6wQHDxaZz94xArRmB70", + "type": "arrow", + "x": 559.3175180635087, + "y": 381.7723693847656, + "width": 186.77469030182203, + "height": 174.13659537018225, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b00", + "roundness": { + "type": 2 + }, + "seed": 8510304, + "version": 69, + "versionNonce": 407098016, + "isDeleted": false, + "boundElements": null, + "updated": 1780079760742, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -186.77469030182203, + 174.13659537018225 + ] + ], + "startBinding": { + "elementId": "4qoky9zb3-ND9VyKVAEaA", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999997 + ] + }, + "endBinding": { + "elementId": "khTdRYpJFoJefxyJBtwc6", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "1QQSN0e8OOsRKfH0eY16E", + "type": "arrow", + "x": 633.9102997493743, + "y": 381.9623107910156, + "width": 244.74597068220982, + "height": 174.81910544106938, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b01", + "roundness": { + "type": 2 + }, + "seed": 1456484000, + "version": 452, + "versionNonce": 813654880, + "isDeleted": false, + "boundElements": null, + "updated": 1780079855671, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -244.74597068220982, + 174.81910544106938 + ] + ], + "startBinding": { + "elementId": "YNZSMiONVjel8QdYl1yhG", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "khTdRYpJFoJefxyJBtwc6", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.18371895862633186 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "ANCOcFXswqMuoCGFJoBM6", + "type": "arrow", + "x": 565.5893521666196, + "y": 381.7723693847656, + "width": 4.748717394762707, + "height": 174.13659537018225, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b02", + "roundness": { + "type": 2 + }, + "seed": 1140971168, + "version": 170, + "versionNonce": 103635616, + "isDeleted": false, + "boundElements": null, + "updated": 1780079787794, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -4.748717394762707, + 174.13659537018225 + ] + ], + "startBinding": { + "elementId": "4qoky9zb3-ND9VyKVAEaA", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999997 + ] + }, + "endBinding": { + "elementId": "vtbCoyORBNuhxGeIS2rAT", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "e85SgGI6hQshJ-wOcmEec", + "type": "arrow", + "x": 574.2897832919926, + "y": 381.7723693847656, + "width": 247.7618583427726, + "height": 174.13659537018225, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b03", + "roundness": { + "type": 2 + }, + "seed": 1153792864, + "version": 121, + "versionNonce": 1523858272, + "isDeleted": false, + "boundElements": null, + "updated": 1780079765159, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 247.7618583427726, + 174.13659537018225 + ] + ], + "startBinding": { + "elementId": "4qoky9zb3-ND9VyKVAEaA", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999997 + ] + }, + "endBinding": { + "elementId": "0kIbDVApSaakgqZgbhl_8", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "keDUBGSsCQa5pUFZYwwpt", + "type": "arrow", + "x": 582.9135653717044, + "y": 381.7444942572638, + "width": 500.4246665928699, + "height": 174.19188847549742, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b04", + "roundness": { + "type": 2 + }, + "seed": 931706528, + "version": 65, + "versionNonce": 387536544, + "isDeleted": false, + "boundElements": null, + "updated": 1780079768842, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 500.4246665928699, + 174.19188847549742 + ] + ], + "startBinding": { + "elementId": "4qoky9zb3-ND9VyKVAEaA", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999997 + ] + }, + "endBinding": { + "elementId": "lUnMtYYu6_Z5KbS8aBw6h", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "V4L09q40oc7mc7XNI_EoB", + "type": "arrow", + "x": 588.2256474048089, + "y": 381.04612400853074, + "width": 755.1542845413104, + "height": 177.2167866928525, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b05", + "roundness": { + "type": 2 + }, + "seed": 1283362464, + "version": 94, + "versionNonce": 1172346528, + "isDeleted": false, + "boundElements": null, + "updated": 1780080054629, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 755.1542845413104, + 177.2167866928525 + ] + ], + "startBinding": { + "elementId": "4qoky9zb3-ND9VyKVAEaA", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999997 + ] + }, + "endBinding": { + "elementId": "J5aP9-ljKdeJV09ZXYt0h", + "mode": "orbit", + "fixedPoint": [ + 0.12416638384396003, + -0.04545401517372245 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "WahhtKdJZnbhvsejA8H_V", + "type": "arrow", + "x": 642.1471969462146, + "y": 381.9623107910156, + "width": 4.749804036472369, + "height": 174.75674307526037, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b06", + "roundness": { + "type": 2 + }, + "seed": 126392160, + "version": 115, + "versionNonce": 971615904, + "isDeleted": false, + "boundElements": null, + "updated": 1780079858979, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -4.749804036472369, + 174.75674307526037 + ] + ], + "startBinding": { + "elementId": "YNZSMiONVjel8QdYl1yhG", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "2P49ogT0ZQV_qQfPj4Eil", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "4M0aw-MuSEJB2BnJP21ZG", + "type": "arrow", + "x": 650.8187372679319, + "y": 381.9623107910156, + "width": 247.8185533083746, + "height": 174.75674307526037, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b07", + "roundness": { + "type": 2 + }, + "seed": 1659283296, + "version": 63, + "versionNonce": 464363360, + "isDeleted": false, + "boundElements": null, + "updated": 1780079862316, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 247.8185533083746, + 174.75674307526037 + ] + ], + "startBinding": { + "elementId": "YNZSMiONVjel8QdYl1yhG", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "zpO_DOVRzuXGA-uUE592T", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "J_f4VZ0LLdTYRvQW6VjOF", + "type": "arrow", + "x": 640.0507202148438, + "y": 374.7975158691406, + "width": 519.8834929577783, + "height": 181.9304649915066, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b08", + "roundness": { + "type": 2 + }, + "seed": 473671520, + "version": 87, + "versionNonce": 1841083040, + "isDeleted": false, + "boundElements": null, + "updated": 1780079865512, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 519.8834929577783, + 181.9304649915066 + ] + ], + "startBinding": { + "elementId": "YNZSMiONVjel8QdYl1yhG", + "mode": "inside", + "fixedPoint": [ + 0.4643417711370895, + 0.9809406247128707 + ] + }, + "endBinding": { + "elementId": "OoFLXXxm0y4ueYkZugPH_", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "S5UeI8NSelZbAPJDapaq0", + "type": "arrow", + "x": 641.6708984375, + "y": 375.60760498046875, + "width": 782.440360749348, + "height": 181.8006771771553, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b09", + "roundness": { + "type": 2 + }, + "seed": 1270908768, + "version": 70, + "versionNonce": 1993654944, + "isDeleted": false, + "boundElements": null, + "updated": 1780080054631, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 782.440360749348, + 181.8006771771553 + ] + ], + "startBinding": { + "elementId": "YNZSMiONVjel8QdYl1yhG", + "mode": "inside", + "fixedPoint": [ + 0.4899816575082994, + 0.9941959987695894 + ] + }, + "endBinding": { + "elementId": "PLXKFvZP-vxRC0RrLGddl", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "v6hzYOOsH7chLik0MtlAM", + "type": "text", + "x": 316, + "y": 611.5, + "width": 11.200042724609375, + "height": 35, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "bxcKMmt2k_6FoqKJHZ0nU" + ], + "frameId": null, + "index": "b0A", + "roundness": null, + "seed": 1413079904, + "version": 3, + "versionNonce": 1472748192, + "isDeleted": true, + "boundElements": null, + "updated": 1780079935502, + "link": null, + "locked": false, + "text": "", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "wCs751CmQo11r9GLpT8rq", + "type": "arrow", + "x": 570.0870138403629, + "y": 555.9089647549478, + "width": 274.6612539792327, + "height": 175.13045945726964, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0B", + "roundness": { + "type": 2 + }, + "seed": 1111724896, + "version": 76, + "versionNonce": 821527392, + "isDeleted": false, + "boundElements": null, + "updated": 1780080129024, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 274.6612539792327, + -175.13045945726964 + ] + ], + "startBinding": { + "elementId": "vtbCoyORBNuhxGeIS2rAT", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "endBinding": { + "elementId": "TJxTsmrsSoeRfyHKcXE_s", + "mode": "orbit", + "fixedPoint": [ + 0.7057668564650352, + 0.7057668564650331 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "b3nWdLnfl6fLaw2Ms5KrB", + "type": "arrow", + "x": 644.6489978076988, + "y": 556.7190538662759, + "width": 216.19567105720967, + "height": 174.9466835322915, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0C", + "roundness": { + "type": 2 + }, + "seed": 1095443104, + "version": 59, + "versionNonce": 1920113312, + "isDeleted": false, + "boundElements": null, + "updated": 1780080117323, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 216.19567105720967, + -174.9466835322915 + ] + ], + "startBinding": { + "elementId": "2P49ogT0ZQV_qQfPj4Eil", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "endBinding": { + "elementId": "TJxTsmrsSoeRfyHKcXE_s", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999997 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "poxXw_rSXuwsfCMRFKC5D", + "type": "arrow", + "x": 654.554406628659, + "y": 556.7333399342028, + "width": 2.6439573556739333, + "height": 174.7710291431872, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0D", + "roundness": { + "type": 2 + }, + "seed": 246819680, + "version": 274, + "versionNonce": 1044642464, + "isDeleted": false, + "boundElements": null, + "updated": 1780080276984, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.6987671994660332, + -89.5814539478747 + ], + [ + 2.6439573556739333, + -174.7710291431872 + ] + ], + "startBinding": { + "elementId": "2P49ogT0ZQV_qQfPj4Eil", + "mode": "orbit", + "fixedPoint": [ + 0.7681487045856734, + 0.23185129541432598 + ] + }, + "endBinding": { + "elementId": "YNZSMiONVjel8QdYl1yhG", + "mode": "orbit", + "fixedPoint": [ + 0.7395574539615762, + 0.7395574539615772 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "7-sTWh80fk_rLwxWKaPl5", + "type": "arrow", + "x": 584.4263426022765, + "y": 556.9760903733923, + "width": 36.98425049165087, + "height": 175.33430548924508, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0E", + "roundness": { + "type": 2 + }, + "seed": 65912672, + "version": 327, + "versionNonce": 385252000, + "isDeleted": false, + "boundElements": null, + "updated": 1780080256668, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 19.978808764911037, + -102.7862100022985 + ], + [ + 36.98425049165087, + -175.33430548924508 + ] + ], + "startBinding": { + "elementId": "vtbCoyORBNuhxGeIS2rAT", + "mode": "orbit", + "fixedPoint": [ + 0.7258298683120397, + 0.7258298683120381 + ] + }, + "endBinding": { + "elementId": "YNZSMiONVjel8QdYl1yhG", + "mode": "orbit", + "fixedPoint": [ + 0.24624827314633468, + 0.7537517268536683 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "hQcz95XgalI1IoOoxDjaS", + "type": "arrow", + "x": 561.1032522584068, + "y": 629.6431261319009, + "width": 13.091827361747505, + "height": 184.28901179229877, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0F", + "roundness": { + "type": 2 + }, + "seed": 171823776, + "version": 58, + "versionNonce": 195436192, + "isDeleted": false, + "boundElements": null, + "updated": 1780080285919, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 13.091827361747505, + 184.28901179229877 + ] + ], + "startBinding": { + "elementId": "vtbCoyORBNuhxGeIS2rAT", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999997 + ] + }, + "endBinding": { + "elementId": "_c1qOcOxxsa8kM1ce1Jq-", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "A9N8RCpKCIXPlMwGYH3OT", + "type": "arrow", + "x": 574.6213175352992, + "y": 889.6987203124587, + "width": 0, + "height": 177.78791675017726, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0G", + "roundness": { + "type": 2 + }, + "seed": 1234117280, + "version": 54, + "versionNonce": 63028896, + "isDeleted": false, + "boundElements": null, + "updated": 1780080294484, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 177.78791675017726 + ] + ], + "startBinding": { + "elementId": "_c1qOcOxxsa8kM1ce1Jq-", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999997 + ] + }, + "endBinding": { + "elementId": "vPICexBxfriqk69ciaHgi", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "fimDimHre7gzALvlCW3GF", + "type": "arrow", + "x": 830.8652443924501, + "y": 629.6431261319009, + "width": 8.314760328035504, + "height": 180.2384136477673, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0H", + "roundness": { + "type": 2 + }, + "seed": 802079392, + "version": 42, + "versionNonce": 1036668576, + "isDeleted": false, + "boundElements": null, + "updated": 1780080298775, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 8.314760328035504, + 180.2384136477673 + ] + ], + "startBinding": { + "elementId": "0kIbDVApSaakgqZgbhl_8", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999997 + ] + }, + "endBinding": { + "elementId": "duWvKfn5pX37Ls7MjkDg6", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "sp0ZJ2rvPpH2i9fv5V9th", + "type": "arrow", + "x": 1100.776682388778, + "y": 629.6431261319009, + "width": 8.314760569754753, + "height": 180.2384136477673, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0I", + "roundness": { + "type": 2 + }, + "seed": 1507938976, + "version": 37, + "versionNonce": 352354976, + "isDeleted": false, + "boundElements": null, + "updated": 1780080301475, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 8.314760569754753, + 180.2384136477673 + ] + ], + "startBinding": { + "elementId": "lUnMtYYu6_Z5KbS8aBw6h", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999997 + ] + }, + "endBinding": { + "elementId": "RmeUelkOgDV8pU4H9ByaY", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "BoCx9dzg0nl2POuNA98-h", + "type": "arrow", + "x": 637.6156681457354, + "y": 629.8330675381509, + "width": 11.651308867920648, + "height": 183.31565114589364, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0J", + "roundness": { + "type": 2 + }, + "seed": 692925280, + "version": 54, + "versionNonce": 1944115040, + "isDeleted": false, + "boundElements": null, + "updated": 1780080312328, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 11.651308867920648, + 183.31565114589364 + ] + ], + "startBinding": { + "elementId": "2P49ogT0ZQV_qQfPj4Eil", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "PA2rwxhotYzPQJ5209oqD", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "kSS66EUpUAnxldZWlCWbQ", + "type": "arrow", + "x": 649.6483293573897, + "y": 888.2747367745675, + "width": 0, + "height": 178.42848104791335, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0K", + "roundness": { + "type": 2 + }, + "seed": 1100190560, + "version": 87, + "versionNonce": 1196759712, + "isDeleted": false, + "boundElements": null, + "updated": 1780080317458, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 178.42848104791335 + ] + ], + "startBinding": { + "elementId": "PA2rwxhotYzPQJ5209oqD", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999997 + ] + }, + "endBinding": { + "elementId": "-qQpKBIq_HbUn-ETjiWf8", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "_aUc2ytyiMBfQSbD-J8Rr", + "type": "arrow", + "x": 907.3759491562859, + "y": 629.8330675381509, + "width": 6.877664081194894, + "height": 179.26505300136228, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0L", + "roundness": { + "type": 2 + }, + "seed": 1552877408, + "version": 46, + "versionNonce": 1221561184, + "isDeleted": false, + "boundElements": null, + "updated": 1780080321148, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 6.877664081194894, + 179.26505300136228 + ] + ], + "startBinding": { + "elementId": "zpO_DOVRzuXGA-uUE592T", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "4FKubvtBu9zWfVbe9B2_j", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "ZhPI25txmH1eL47bvmX3g", + "type": "arrow", + "x": 1177.287387152655, + "y": 629.8330675381509, + "width": 6.877664322831606, + "height": 179.26505300136216, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0M", + "roundness": { + "type": 2 + }, + "seed": 219072352, + "version": 42, + "versionNonce": 683670368, + "isDeleted": false, + "boundElements": null, + "updated": 1780080325394, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 6.877664322831606, + 179.26505300136216 + ] + ], + "startBinding": { + "elementId": "OoFLXXxm0y4ueYkZugPH_", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "cMpctaDxbbLzOWnZeoTVm", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#ffffff", + "lockedMultiSelections": {} + }, + "files": {} +} \ No newline at end of file diff --git a/doc/reports/aplr1/PagerG2_aplr.png b/doc/reports/aplr1/PagerG2_aplr.png new file mode 100644 index 000000000..700222154 Binary files /dev/null and b/doc/reports/aplr1/PagerG2_aplr.png differ diff --git a/doc/reports/aplr1/PagerG2_aplr.txt b/doc/reports/aplr1/PagerG2_aplr.txt new file mode 100644 index 000000000..25d5cff6d --- /dev/null +++ b/doc/reports/aplr1/PagerG2_aplr.txt @@ -0,0 +1,306 @@ +PagerG2 grammar + +Tokens + token EPSILON "ε" + First: {"ε"} + Follow: {} + token PSEUDO_END "⊥" + First: {"⊥"} + Follow: {"ε"} + token At + First: {At} + Follow: {At, Dt, Et, Tt, Ut, EOI} + token Bt + First: {Bt} + Follow: {Tt, Ut} + token Ct + First: {Ct} + Follow: {At, Dt, Et, EOI} + token Dt + First: {Dt} + Follow: {At, Dt, Et, EOI} + token Et + First: {Et} + Follow: {At, Dt, Et, EOI} + token Tt + First: {Tt} + Follow: {Ut} + token Ut + First: {Ut} + Follow: {At, Bt, Ct, Dt, Et} + token EOI + First: {EOI} + Follow: {"⊥"} +Non-terminals + start Sn + First: {At, Bt} + Follow: {"⊥"} + Productions + Sn ::= Xn EOI + start Sn' + First: {At, Bt} + Follow: {"ε"} + Productions + Sn' ::= Sn "⊥" + nonterm Xn + First: {At, Bt} + Follow: {At, Dt, Et, EOI} + Productions + Xn ::= At Yn Dt + Xn ::= At Zn Ct + Xn ::= At Tn + Xn ::= Bt Yn Et + Xn ::= Bt Zn Dt + Xn ::= Bt Tn + nonterm Yn + First: {Tt, Ut} + Follow: {Dt, Et} + Productions + Yn ::= Tt Wn + Yn ::= Ut Xn + nonterm Zn + First: {Tt} + Follow: {Ct, Dt} + Productions + Zn ::= Tt Ut + nonterm Tn + First: {Ut} + Follow: {At, Dt, Et, EOI} + Productions + Tn ::= Ut Xn At + nonterm Wn + First: {Ut} + Follow: {Dt, Et} + Productions + Wn ::= Ut Vn + nonterm Vn + First: {"ε"} + Follow: {Dt, Et} + Productions + Vn ::= epsilon +APLR(1) States + State 0 [0.0] + Kernel + [Sn' ::= · Sn "⊥", {"ε"}] + Added + [Sn ::= · Xn EOI, {"⊥"}] + [Xn ::= · At Yn Dt, {EOI}] + [Xn ::= · At Zn Ct, {EOI}] + [Xn ::= · At Tn, {EOI}] + [Xn ::= · Bt Yn Et, {EOI}] + [Xn ::= · Bt Zn Dt, {EOI}] + [Xn ::= · Bt Tn, {EOI}] + Actions + At : ShiftPrefix 1 + Bt : ShiftPrefix 2 + Gotos + Sn : 3 + Xn : 4 + State 1 [1.0] + Kernel + [Xn ::= At · Yn Dt, {At, Dt, Et, EOI}] + [Xn ::= At · Zn Ct, {At, Dt, Et, EOI}] + [Xn ::= At · Tn, {At, Dt, Et, EOI}] + Added + [Yn ::= · Tt Wn, {Dt}] + [Yn ::= · Ut Xn, {Dt}] + [Zn ::= · Tt Ut, {Ct}] + [Tn ::= · Ut Xn At, {At, Dt, Et, EOI}] + Actions + Tt : ShiftPrefix 5 + Ut : ShiftPrefix 6 + Gotos + Yn : 7 + Zn : 8 + Tn : 9 + State 2 [2.0] + Kernel + [Xn ::= Bt · Yn Et, {At, Dt, Et, EOI}] + [Xn ::= Bt · Zn Dt, {At, Dt, Et, EOI}] + [Xn ::= Bt · Tn, {At, Dt, Et, EOI}] + Added + [Yn ::= · Tt Wn, {Et}] + [Yn ::= · Ut Xn, {Et}] + [Zn ::= · Tt Ut, {Dt}] + [Tn ::= · Ut Xn At, {At, Dt, Et, EOI}] + Actions + Tt : ShiftPrefix 10 + Ut : ShiftPrefix 6 + Gotos + Yn : 11 + Zn : 12 + Tn : 13 + State 3 [3.0] + Kernel + [Sn' ::= Sn · "⊥", {"ε"}] + Actions + "⊥" : ShiftPrefix 14 + State 4 [4.0] + Kernel + [Sn ::= Xn · EOI, {"⊥"}] + Actions + EOI : ShiftAccept 15 + State 5 [5.0] + Kernel + [Yn ::= Tt · Wn, {Dt}] + [Zn ::= Tt · Ut, {Ct}] + Added + [Wn ::= · Ut Vn, {Dt}] + Actions + Ut : ShiftPrefix 16 + Gotos + Wn : 17 + State 6 [6.0] + Kernel + [Yn ::= Ut · Xn, {Dt, Et}] + [Tn ::= Ut · Xn At, {At, Dt, Et, EOI}] + Added + [Xn ::= · At Yn Dt, {At, Dt, Et}] + [Xn ::= · At Zn Ct, {At, Dt, Et}] + [Xn ::= · At Tn, {At, Dt, Et}] + [Xn ::= · Bt Yn Et, {At, Dt, Et}] + [Xn ::= · Bt Zn Dt, {At, Dt, Et}] + [Xn ::= · Bt Tn, {At, Dt, Et}] + Actions + At : ShiftPrefix 1 + Bt : ShiftPrefix 2 + Gotos + Xn : 18 + State 7 [7.0] + Kernel + [Xn ::= At Yn · Dt, {At, Dt, Et, EOI}] + Actions + Dt : ShiftPrefix 19 + State 8 [8.0] + Kernel + [Xn ::= At Zn · Ct, {At, Dt, Et, EOI}] + Actions + Ct : ShiftPrefix 20 + State 9 [9.0] + Kernel + [Xn ::= At Tn ·, {At, Dt, Et, EOI}] + Actions + At : Reduce Xn ::= At Tn + Dt : Reduce Xn ::= At Tn + Et : Reduce Xn ::= At Tn + EOI : Reduce Xn ::= At Tn + State 10 [5.1] + Kernel + [Yn ::= Tt · Wn, {Et}] + [Zn ::= Tt · Ut, {Dt}] + Added + [Wn ::= · Ut Vn, {Et}] + Actions + Ut : ShiftPrefix 21 + Gotos + Wn : 17 + State 11 [10.0] + Kernel + [Xn ::= Bt Yn · Et, {At, Dt, Et, EOI}] + Actions + Et : ShiftPrefix 22 + State 12 [11.0] + Kernel + [Xn ::= Bt Zn · Dt, {At, Dt, Et, EOI}] + Actions + Dt : ShiftPrefix 23 + State 13 [12.0] + Kernel + [Xn ::= Bt Tn ·, {At, Dt, Et, EOI}] + Actions + At : Reduce Xn ::= Bt Tn + Dt : Reduce Xn ::= Bt Tn + Et : Reduce Xn ::= Bt Tn + EOI : Reduce Xn ::= Bt Tn + State 14 [13.0] + Kernel + [Sn' ::= Sn "⊥" ·, {"ε"}] + Actions + "ε" : Reduce Sn' ::= Sn "⊥" + State 15 [14.0] + Kernel + [Sn ::= Xn EOI ·, {"⊥"}] + Actions + "⊥" : Reduce Sn ::= Xn EOI + State 16 [15.0] + Kernel + [Zn ::= Tt Ut ·, {Ct}] + [Wn ::= Ut · Vn, {Dt}] + Added + [Vn ::= ·, {Dt}] + Actions + Ct : Reduce Zn ::= Tt Ut + Dt : Reduce Vn ::= epsilon + Gotos + Vn : 24 + State 17 [16.0] + Kernel + [Yn ::= Tt Wn ·, {Dt, Et}] + Actions + Dt : Reduce Yn ::= Tt Wn + Et : Reduce Yn ::= Tt Wn + State 18 [17.0] + Kernel + [Yn ::= Ut Xn ·, {Dt, Et}] + [Tn ::= Ut Xn · At, {At, Dt, Et, EOI}] + Actions + At : ShiftPrefix 25 + Dt : Reduce Yn ::= Ut Xn + Et : Reduce Yn ::= Ut Xn + State 19 [18.0] + Kernel + [Xn ::= At Yn Dt ·, {At, Dt, Et, EOI}] + Actions + At : Reduce Xn ::= At Yn Dt + Dt : Reduce Xn ::= At Yn Dt + Et : Reduce Xn ::= At Yn Dt + EOI : Reduce Xn ::= At Yn Dt + State 20 [19.0] + Kernel + [Xn ::= At Zn Ct ·, {At, Dt, Et, EOI}] + Actions + At : Reduce Xn ::= At Zn Ct + Dt : Reduce Xn ::= At Zn Ct + Et : Reduce Xn ::= At Zn Ct + EOI : Reduce Xn ::= At Zn Ct + State 21 [15.1] + Kernel + [Zn ::= Tt Ut ·, {Dt}] + [Wn ::= Ut · Vn, {Et}] + Added + [Vn ::= ·, {Et}] + Actions + Dt : Reduce Zn ::= Tt Ut + Et : Reduce Vn ::= epsilon + Gotos + Vn : 24 + State 22 [20.0] + Kernel + [Xn ::= Bt Yn Et ·, {At, Dt, Et, EOI}] + Actions + At : Reduce Xn ::= Bt Yn Et + Dt : Reduce Xn ::= Bt Yn Et + Et : Reduce Xn ::= Bt Yn Et + EOI : Reduce Xn ::= Bt Yn Et + State 23 [21.0] + Kernel + [Xn ::= Bt Zn Dt ·, {At, Dt, Et, EOI}] + Actions + At : Reduce Xn ::= Bt Zn Dt + Dt : Reduce Xn ::= Bt Zn Dt + Et : Reduce Xn ::= Bt Zn Dt + EOI : Reduce Xn ::= Bt Zn Dt + State 24 [22.0] + Kernel + [Wn ::= Ut Vn ·, {Dt, Et}] + Actions + Dt : Reduce Wn ::= Ut Vn + Et : Reduce Wn ::= Ut Vn + State 25 [23.0] + Kernel + [Tn ::= Ut Xn At ·, {At, Dt, Et, EOI}] + Actions + At : Reduce Tn ::= Ut Xn At + Dt : Reduce Tn ::= Ut Xn At + Et : Reduce Tn ::= Ut Xn At + EOI : Reduce Tn ::= Ut Xn At diff --git a/doc/reports/aplr1/PagerG2_lalr.txt b/doc/reports/aplr1/PagerG2_lalr.txt new file mode 100644 index 000000000..39a8dd53d --- /dev/null +++ b/doc/reports/aplr1/PagerG2_lalr.txt @@ -0,0 +1,288 @@ +PagerG2 grammar + +Tokens + token EPSILON "ε" + First: {"ε"} + Follow: {} + token PSEUDO_END "⊥" + First: {"⊥"} + Follow: {"ε"} + token At + First: {At} + Follow: {At, Dt, Et, Tt, Ut, EOI} + token Bt + First: {Bt} + Follow: {Tt, Ut} + token Ct + First: {Ct} + Follow: {At, Dt, Et, EOI} + token Dt + First: {Dt} + Follow: {At, Dt, Et, EOI} + token Et + First: {Et} + Follow: {At, Dt, Et, EOI} + token Tt + First: {Tt} + Follow: {Ut} + token Ut + First: {Ut} + Follow: {At, Bt, Ct, Dt, Et} + token EOI + First: {EOI} + Follow: {"⊥"} +Non-terminals + start Sn + First: {At, Bt} + Follow: {"⊥"} + Productions + Sn ::= Xn EOI + start Sn' + First: {At, Bt} + Follow: {"ε"} + Productions + Sn' ::= Sn "⊥" + nonterm Xn + First: {At, Bt} + Follow: {At, Dt, Et, EOI} + Productions + Xn ::= At Yn Dt + Xn ::= At Zn Ct + Xn ::= At Tn + Xn ::= Bt Yn Et + Xn ::= Bt Zn Dt + Xn ::= Bt Tn + nonterm Yn + First: {Tt, Ut} + Follow: {Dt, Et} + Productions + Yn ::= Tt Wn + Yn ::= Ut Xn + nonterm Zn + First: {Tt} + Follow: {Ct, Dt} + Productions + Zn ::= Tt Ut + nonterm Tn + First: {Ut} + Follow: {At, Dt, Et, EOI} + Productions + Tn ::= Ut Xn At + nonterm Wn + First: {Ut} + Follow: {Dt, Et} + Productions + Wn ::= Ut Vn + nonterm Vn + First: {"ε"} + Follow: {Dt, Et} + Productions + Vn ::= epsilon +LALR(1) States + State 0 + Kernel + [Sn' ::= · Sn "⊥", {"ε"}] + Added + [Sn ::= · Xn EOI, {"⊥"}] + [Xn ::= · At Yn Dt, {EOI}] + [Xn ::= · At Zn Ct, {EOI}] + [Xn ::= · At Tn, {EOI}] + [Xn ::= · Bt Yn Et, {EOI}] + [Xn ::= · Bt Zn Dt, {EOI}] + [Xn ::= · Bt Tn, {EOI}] + Actions + At : ShiftPrefix 1 + Bt : ShiftPrefix 2 + Gotos + Sn : 3 + Xn : 4 + State 1 + Kernel + [Xn ::= At · Yn Dt, {At, Dt, Et, EOI}] + [Xn ::= At · Zn Ct, {At, Dt, Et, EOI}] + [Xn ::= At · Tn, {At, Dt, Et, EOI}] + Added + [Yn ::= · Tt Wn, {Dt}] + [Yn ::= · Ut Xn, {Dt}] + [Zn ::= · Tt Ut, {Ct}] + [Tn ::= · Ut Xn At, {At, Dt, Et, EOI}] + Actions + Tt : ShiftPrefix 5 + Ut : ShiftPrefix 6 + Gotos + Yn : 7 + Zn : 8 + Tn : 9 + State 2 + Kernel + [Xn ::= Bt · Yn Et, {At, Dt, Et, EOI}] + [Xn ::= Bt · Zn Dt, {At, Dt, Et, EOI}] + [Xn ::= Bt · Tn, {At, Dt, Et, EOI}] + Added + [Yn ::= · Tt Wn, {Et}] + [Yn ::= · Ut Xn, {Et}] + [Zn ::= · Tt Ut, {Dt}] + [Tn ::= · Ut Xn At, {At, Dt, Et, EOI}] + Actions + Tt : ShiftPrefix 5 + Ut : ShiftPrefix 6 + Gotos + Yn : 10 + Zn : 11 + Tn : 12 + State 3 + Kernel + [Sn' ::= Sn · "⊥", {"ε"}] + Actions + "⊥" : ShiftPrefix 13 + State 4 + Kernel + [Sn ::= Xn · EOI, {"⊥"}] + Actions + EOI : ShiftAccept 14 + State 5 + Kernel + [Yn ::= Tt · Wn, {Dt, Et}] + [Zn ::= Tt · Ut, {Ct, Dt}] + Added + [Wn ::= · Ut Vn, {Dt, Et}] + Actions + Ut : ShiftPrefix 15 + Gotos + Wn : 16 + State 6 + Kernel + [Yn ::= Ut · Xn, {Dt, Et}] + [Tn ::= Ut · Xn At, {At, Dt, Et, EOI}] + Added + [Xn ::= · At Yn Dt, {At, Dt, Et}] + [Xn ::= · At Zn Ct, {At, Dt, Et}] + [Xn ::= · At Tn, {At, Dt, Et}] + [Xn ::= · Bt Yn Et, {At, Dt, Et}] + [Xn ::= · Bt Zn Dt, {At, Dt, Et}] + [Xn ::= · Bt Tn, {At, Dt, Et}] + Actions + At : ShiftPrefix 1 + Bt : ShiftPrefix 2 + Gotos + Xn : 17 + State 7 + Kernel + [Xn ::= At Yn · Dt, {At, Dt, Et, EOI}] + Actions + Dt : ShiftPrefix 18 + State 8 + Kernel + [Xn ::= At Zn · Ct, {At, Dt, Et, EOI}] + Actions + Ct : ShiftPrefix 19 + State 9 + Kernel + [Xn ::= At Tn ·, {At, Dt, Et, EOI}] + Actions + At : Reduce Xn ::= At Tn + Dt : Reduce Xn ::= At Tn + Et : Reduce Xn ::= At Tn + EOI : Reduce Xn ::= At Tn + State 10 + Kernel + [Xn ::= Bt Yn · Et, {At, Dt, Et, EOI}] + Actions + Et : ShiftPrefix 20 + State 11 + Kernel + [Xn ::= Bt Zn · Dt, {At, Dt, Et, EOI}] + Actions + Dt : ShiftPrefix 21 + State 12 + Kernel + [Xn ::= Bt Tn ·, {At, Dt, Et, EOI}] + Actions + At : Reduce Xn ::= Bt Tn + Dt : Reduce Xn ::= Bt Tn + Et : Reduce Xn ::= Bt Tn + EOI : Reduce Xn ::= Bt Tn + State 13 + Kernel + [Sn' ::= Sn "⊥" ·, {"ε"}] + Actions + "ε" : Reduce Sn' ::= Sn "⊥" + State 14 + Kernel + [Sn ::= Xn EOI ·, {"⊥"}] + Actions + "⊥" : Reduce Sn ::= Xn EOI + State 15 + Kernel + [Zn ::= Tt Ut ·, {Ct, Dt}] + [Wn ::= Ut · Vn, {Dt, Et}] + Added + [Vn ::= ·, {Dt, Et}] + Actions + Ct : Reduce Zn ::= Tt Ut + Dt : +CONFLICT Reduce Zn ::= Tt Ut +CONFLICT Reduce Vn ::= epsilon + Et : Reduce Vn ::= epsilon + Gotos + Vn : 22 + State 16 + Kernel + [Yn ::= Tt Wn ·, {Dt, Et}] + Actions + Dt : Reduce Yn ::= Tt Wn + Et : Reduce Yn ::= Tt Wn + State 17 + Kernel + [Yn ::= Ut Xn ·, {Dt, Et}] + [Tn ::= Ut Xn · At, {At, Dt, Et, EOI}] + Actions + At : ShiftPrefix 23 + Dt : Reduce Yn ::= Ut Xn + Et : Reduce Yn ::= Ut Xn + State 18 + Kernel + [Xn ::= At Yn Dt ·, {At, Dt, Et, EOI}] + Actions + At : Reduce Xn ::= At Yn Dt + Dt : Reduce Xn ::= At Yn Dt + Et : Reduce Xn ::= At Yn Dt + EOI : Reduce Xn ::= At Yn Dt + State 19 + Kernel + [Xn ::= At Zn Ct ·, {At, Dt, Et, EOI}] + Actions + At : Reduce Xn ::= At Zn Ct + Dt : Reduce Xn ::= At Zn Ct + Et : Reduce Xn ::= At Zn Ct + EOI : Reduce Xn ::= At Zn Ct + State 20 + Kernel + [Xn ::= Bt Yn Et ·, {At, Dt, Et, EOI}] + Actions + At : Reduce Xn ::= Bt Yn Et + Dt : Reduce Xn ::= Bt Yn Et + Et : Reduce Xn ::= Bt Yn Et + EOI : Reduce Xn ::= Bt Yn Et + State 21 + Kernel + [Xn ::= Bt Zn Dt ·, {At, Dt, Et, EOI}] + Actions + At : Reduce Xn ::= Bt Zn Dt + Dt : Reduce Xn ::= Bt Zn Dt + Et : Reduce Xn ::= Bt Zn Dt + EOI : Reduce Xn ::= Bt Zn Dt + State 22 + Kernel + [Wn ::= Ut Vn ·, {Dt, Et}] + Actions + Dt : Reduce Wn ::= Ut Vn + Et : Reduce Wn ::= Ut Vn + State 23 + Kernel + [Tn ::= Ut Xn At ·, {At, Dt, Et, EOI}] + Actions + At : Reduce Tn ::= Ut Xn At + Dt : Reduce Tn ::= Ut Xn At + Et : Reduce Tn ::= Ut Xn At + EOI : Reduce Tn ::= Ut Xn At diff --git a/doc/reports/aplr1/PagerG2_lr.excalidraw b/doc/reports/aplr1/PagerG2_lr.excalidraw new file mode 100644 index 000000000..50239a3ad --- /dev/null +++ b/doc/reports/aplr1/PagerG2_lr.excalidraw @@ -0,0 +1,4716 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "id": "flRofi7WAa5SUt_bIWJCd", + "type": "rectangle", + "x": 1362.3636713085937, + "y": 143.55290260742188, + "width": 81.37086769140626, + "height": 71.77563639257814, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "r0d9Gv7ScpYcRX9lHck7x" + ], + "frameId": null, + "index": "b0UG", + "roundness": { + "type": 3 + }, + "seed": 726298464, + "version": 1151, + "versionNonce": 635336899, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "cwNMmggwaC3V8WeB6CMVA" + }, + { + "id": "zYt_QdVAhabUymmqBPo_O", + "type": "arrow" + }, + { + "id": "FKkqPnRMOXE8tGMgDkiDd", + "type": "arrow" + }, + { + "id": "ferAR-u6a_8a1Ywa36T4B", + "type": "arrow" + }, + { + "id": "FgDuSyW7GQOsySLwyNTul", + "type": "arrow" + } + ], + "updated": 1780083212720, + "link": null, + "locked": false + }, + { + "id": "cwNMmggwaC3V8WeB6CMVA", + "type": "text", + "x": 1391.0971016752926, + "y": 156.94072080371095, + "width": 23.904006958007812, + "height": 45, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "r0d9Gv7ScpYcRX9lHck7x" + ], + "frameId": null, + "index": "b0UV", + "roundness": null, + "seed": 1795523424, + "version": 609, + "versionNonce": 498624611, + "isDeleted": false, + "boundElements": [], + "updated": 1780083212720, + "link": null, + "locked": false, + "text": "0", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "flRofi7WAa5SUt_bIWJCd", + "originalText": "0", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "mA0Phiuz0ymWgRqErTBpP", + "type": "rectangle", + "x": 2395.451683308593, + "y": 381.18356510742206, + "width": 81.37086769140626, + "height": 71.77563639257814, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "3Os95TQ5zR5Dahkmb4mcR" + ], + "frameId": null, + "index": "b0Um", + "roundness": { + "type": 3 + }, + "seed": 358698656, + "version": 1136, + "versionNonce": 604790115, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "QUg3ojyNlgz8c4RqVMW4H" + }, + { + "id": "FgDuSyW7GQOsySLwyNTul", + "type": "arrow" + }, + { + "id": "m_4sSA9yxWCIC3-9OR9Tb", + "type": "arrow" + } + ], + "updated": 1780083351020, + "link": null, + "locked": false + }, + { + "id": "QUg3ojyNlgz8c4RqVMW4H", + "type": "text", + "x": 2425.6071107456046, + "y": 394.57138330371106, + "width": 21.060012817382812, + "height": 45, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "3Os95TQ5zR5Dahkmb4mcR" + ], + "frameId": null, + "index": "b0Un", + "roundness": null, + "seed": 92175008, + "version": 597, + "versionNonce": 2093813187, + "isDeleted": false, + "boundElements": [], + "updated": 1780083351020, + "link": null, + "locked": false, + "text": "4", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "mA0Phiuz0ymWgRqErTBpP", + "originalText": "4", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "calMAhOrK3Of3AsVRPXG3", + "type": "rectangle", + "x": 2198.4314709752593, + "y": 381.18356510742206, + "width": 81.37086769140626, + "height": 71.77563639257814, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "6XVORNfT_CLHpHzL64HK9" + ], + "frameId": null, + "index": "b0UoG", + "roundness": { + "type": 3 + }, + "seed": 560925536, + "version": 1114, + "versionNonce": 1899443107, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "X6o2Yz1GPS-__r3ZCGZnN" + }, + { + "id": "ferAR-u6a_8a1Ywa36T4B", + "type": "arrow" + }, + { + "id": "l50Td3BNX9safWcZ9iw1Q", + "type": "arrow" + } + ], + "updated": 1780083458437, + "link": null, + "locked": false + }, + { + "id": "X6o2Yz1GPS-__r3ZCGZnN", + "type": "text", + "x": 2228.1728969474275, + "y": 394.5713833037112, + "width": 21.888015747070312, + "height": 45, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "6XVORNfT_CLHpHzL64HK9" + ], + "frameId": null, + "index": "b0UoV", + "roundness": null, + "seed": 1781964640, + "version": 568, + "versionNonce": 938919747, + "isDeleted": false, + "boundElements": [], + "updated": 1780083458437, + "link": null, + "locked": false, + "text": "3", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "calMAhOrK3Of3AsVRPXG3", + "originalText": "3", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "x6CGuwmbtSpRs9pMT6w74", + "type": "rectangle", + "x": 2198.4314705085926, + "y": 616.7160716074218, + "width": 81.37086769140626, + "height": 71.77563639257814, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "NB2LKo76gJKTyWGVp3cx-" + ], + "frameId": null, + "index": "b0Uop", + "roundness": { + "type": 3 + }, + "seed": 1273313952, + "version": 1376, + "versionNonce": 1931657069, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "C2QKHY_8zoNGENTzITG5M" + }, + { + "id": "l50Td3BNX9safWcZ9iw1Q", + "type": "arrow" + } + ], + "updated": 1780083256665, + "link": null, + "locked": false + }, + { + "id": "C2QKHY_8zoNGENTzITG5M", + "type": "text", + "x": 2220.4868918420884, + "y": 630.1038898037109, + "width": 37.26002502441406, + "height": 45, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "NB2LKo76gJKTyWGVp3cx-" + ], + "frameId": null, + "index": "b0Uot", + "roundness": null, + "seed": 480568992, + "version": 829, + "versionNonce": 1320773901, + "isDeleted": false, + "boundElements": [], + "updated": 1780083256665, + "link": null, + "locked": false, + "text": "13", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "x6CGuwmbtSpRs9pMT6w74", + "originalText": "13", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "X1r1GnkzZkQJS2CXtOKDY", + "type": "rectangle", + "x": 1213.3304065085931, + "y": 616.7160716074219, + "width": 81.37086769140626, + "height": 71.77563639257814, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Zxb5grIN-SyGhJceAiTDz" + ], + "frameId": null, + "index": "b0Uov", + "roundness": { + "type": 3 + }, + "seed": 1565496675, + "version": 1463, + "versionNonce": 1747303117, + "isDeleted": true, + "boundElements": [ + { + "type": "text", + "id": "U3sSeSC44n3V33DXd3R4l" + } + ], + "updated": 1780083397416, + "link": null, + "locked": false + }, + { + "id": "U3sSeSC44n3V33DXd3R4l", + "type": "text", + "x": 1235.385827842089, + "y": 630.103889803711, + "width": 37.26002502441406, + "height": 45, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Zxb5grIN-SyGhJceAiTDz" + ], + "frameId": null, + "index": "b0Uow", + "roundness": null, + "seed": 1310519555, + "version": 916, + "versionNonce": 1648485507, + "isDeleted": true, + "boundElements": [], + "updated": 1780083397416, + "link": null, + "locked": false, + "text": "13", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "X1r1GnkzZkQJS2CXtOKDY", + "originalText": "13", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "PBzXEyN1Sh_EcXklMmyCl", + "type": "rectangle", + "x": 2395.4516833085922, + "y": 616.7160716074218, + "width": 81.37086769140626, + "height": 71.77563639257814, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "BRhVhxIXiCBZb0cA0JrWJ" + ], + "frameId": null, + "index": "b0Uoy", + "roundness": { + "type": 3 + }, + "seed": 157015904, + "version": 1380, + "versionNonce": 2100951693, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "WXX3IkDNwXlYaqXcTzN0A" + }, + { + "id": "m_4sSA9yxWCIC3-9OR9Tb", + "type": "arrow" + } + ], + "updated": 1780083256665, + "link": null, + "locked": false + }, + { + "id": "WXX3IkDNwXlYaqXcTzN0A", + "type": "text", + "x": 2417.921106106932, + "y": 630.1038898037109, + "width": 36.43202209472656, + "height": 45, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "BRhVhxIXiCBZb0cA0JrWJ" + ], + "frameId": null, + "index": "b0Uoz", + "roundness": null, + "seed": 1701376864, + "version": 844, + "versionNonce": 417433645, + "isDeleted": false, + "boundElements": [], + "updated": 1780083256665, + "link": null, + "locked": false, + "text": "14", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "PBzXEyN1Sh_EcXklMmyCl", + "originalText": "14", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "0h8kgBJKeuIMC4mU331h2", + "type": "rectangle", + "x": 1410.3506193085932, + "y": 616.7160716074218, + "width": 81.37086769140626, + "height": 71.77563639257814, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "gB5D6uTrBzOKH_PFVnsvr" + ], + "frameId": null, + "index": "b0Up", + "roundness": { + "type": 3 + }, + "seed": 994449056, + "version": 1786, + "versionNonce": 1386594093, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "6Cv6auYQp1KAK5Svc1epu" + }, + { + "id": "CpHNu17GBHoxkk8V2aRpA", + "type": "arrow" + }, + { + "id": "FM-GjMHBt1N7dzVMI5_M6", + "type": "arrow" + }, + { + "id": "jyhpEVwJkIpGh2bTmGWgw", + "type": "arrow" + }, + { + "id": "GhkvZVqTtG7ffV-L-qAse", + "type": "arrow" + }, + { + "id": "YzfkpLewQBur0LZOpCdAY", + "type": "arrow" + } + ], + "updated": 1780083256658, + "link": null, + "locked": false + }, + { + "id": "6Cv6auYQp1KAK5Svc1epu", + "type": "text", + "x": 1439.5160488818353, + "y": 630.1038898037109, + "width": 23.040008544921875, + "height": 45, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "gB5D6uTrBzOKH_PFVnsvr" + ], + "frameId": null, + "index": "b0Ut", + "roundness": null, + "seed": 596263584, + "version": 1246, + "versionNonce": 1955684557, + "isDeleted": false, + "boundElements": [], + "updated": 1780083256658, + "link": null, + "locked": false, + "text": "6", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "0h8kgBJKeuIMC4mU331h2", + "originalText": "6", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "YQw6srs1CJcmsZkA7zxTZ", + "type": "text", + "x": 1456.7801229999998, + "y": 661.6780920000001, + "width": 28.65997314453125, + "height": 25, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "gB5D6uTrBzOKH_PFVnsvr" + ], + "frameId": null, + "index": "b0Ux", + "roundness": null, + "seed": 1248390816, + "version": 1283, + "versionNonce": 1207548269, + "isDeleted": false, + "boundElements": [], + "updated": 1780083256661, + "link": null, + "locked": false, + "text": "(6)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(6)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "AtW7BwiPbzdAGE82L09z0", + "type": "rectangle", + "x": 425.2495553085934, + "y": 848.589839357422, + "width": 81.37086769140626, + "height": 71.77563639257814, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Xi9FJ93HRUn2BMlaPoTJ8" + ], + "frameId": null, + "index": "b0Uy", + "roundness": { + "type": 3 + }, + "seed": 897332064, + "version": 849, + "versionNonce": 1841381667, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "oqoaIXS156bU3TPoalk0T" + }, + { + "id": "PjpiHjXYhAoCM9nWupdga", + "type": "arrow" + } + ], + "updated": 1780083435059, + "link": null, + "locked": false + }, + { + "id": "oqoaIXS156bU3TPoalk0T", + "type": "text", + "x": 446.80097883935514, + "y": 861.9776575537111, + "width": 38.26802062988281, + "height": 45, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Xi9FJ93HRUn2BMlaPoTJ8" + ], + "frameId": null, + "index": "b0Uz", + "roundness": null, + "seed": 1381943136, + "version": 313, + "versionNonce": 1178823043, + "isDeleted": false, + "boundElements": [], + "updated": 1780083435059, + "link": null, + "locked": false, + "text": "18", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "AtW7BwiPbzdAGE82L09z0", + "originalText": "18", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "N7wWTnR0l7yamhBLbtF1Z", + "type": "text", + "x": 471.67905899999977, + "y": 893.5518597500001, + "width": 29.019973754882812, + "height": 25, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Xi9FJ93HRUn2BMlaPoTJ8" + ], + "frameId": null, + "index": "b0UzV", + "roundness": null, + "seed": 1573837664, + "version": 372, + "versionNonce": 1296536675, + "isDeleted": false, + "boundElements": [], + "updated": 1780083435060, + "link": null, + "locked": false, + "text": "(3)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(3)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "jSljWe947MJZNu3Ir1SnE", + "type": "rectangle", + "x": 819.2899809085933, + "y": 616.7160716074218, + "width": 81.37086769140626, + "height": 71.77563639257814, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "dDPVNgwXE60vGRrQSd2fT" + ], + "frameId": null, + "index": "b0Uzd", + "roundness": { + "type": 3 + }, + "seed": 1472631456, + "version": 1052, + "versionNonce": 893439053, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "KjaOGic939ONTbAGYmDsD" + }, + { + "id": "KSrRWYR77Z6kwwc5DYArW", + "type": "arrow" + } + ], + "updated": 1780083256655, + "link": null, + "locked": false + }, + { + "id": "KjaOGic939ONTbAGYmDsD", + "type": "text", + "x": 848.6534085287104, + "y": 630.1038898037109, + "width": 22.644012451171875, + "height": 45, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "dDPVNgwXE60vGRrQSd2fT" + ], + "frameId": null, + "index": "b0Uzl", + "roundness": null, + "seed": 1385905824, + "version": 511, + "versionNonce": 1070567917, + "isDeleted": false, + "boundElements": [], + "updated": 1780083256655, + "link": null, + "locked": false, + "text": "9", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "jSljWe947MJZNu3Ir1SnE", + "originalText": "9", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "EJl-358uNSBrLpP8jtubh", + "type": "text", + "x": 865.7194845999996, + "y": 661.6780919999999, + "width": 29.019973754882812, + "height": 25, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "dDPVNgwXE60vGRrQSd2fT" + ], + "frameId": null, + "index": "b0Uzt", + "roundness": null, + "seed": 1710910112, + "version": 574, + "versionNonce": 482991373, + "isDeleted": false, + "boundElements": [], + "updated": 1780083256655, + "link": null, + "locked": false, + "text": "(3)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(3)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "7xPCWQXZQI5Cy9a21jJwj", + "type": "rectangle", + "x": 1607.3708321085933, + "y": 616.7160716074219, + "width": 81.37086769140626, + "height": 71.77563639257814, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "d4-zj18xqiVd059BZN87p" + ], + "frameId": null, + "index": "b0UztV", + "roundness": { + "type": 3 + }, + "seed": 1350019936, + "version": 1068, + "versionNonce": 1271005741, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "WL1EPvxhehM2mLXUCKB7t" + }, + { + "id": "917mL2X0UaY7Wvz9ogVGV", + "type": "arrow" + }, + { + "id": "JI6CoeD9plu4Y3rCUYzbN", + "type": "arrow" + } + ], + "updated": 1780083256661, + "link": null, + "locked": false + }, + { + "id": "WL1EPvxhehM2mLXUCKB7t", + "type": "text", + "x": 1628.4182578366206, + "y": 630.103889803711, + "width": 39.27601623535156, + "height": 45, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "d4-zj18xqiVd059BZN87p" + ], + "frameId": null, + "index": "b0Uzu", + "roundness": null, + "seed": 1865105248, + "version": 530, + "versionNonce": 347734989, + "isDeleted": false, + "boundElements": [], + "updated": 1780083256661, + "link": null, + "locked": false, + "text": "10", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "7xPCWQXZQI5Cy9a21jJwj", + "originalText": "10", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "xPTQOIP9EHH4vaMNtmG6k", + "type": "text", + "x": 1653.8003357999996, + "y": 661.678092, + "width": 29.019973754882812, + "height": 25, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "d4-zj18xqiVd059BZN87p" + ], + "frameId": null, + "index": "b0UzuV", + "roundness": null, + "seed": 441209696, + "version": 589, + "versionNonce": 129447245, + "isDeleted": false, + "boundElements": [], + "updated": 1780083256663, + "link": null, + "locked": false, + "text": "(3)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(3)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "TMtdtw8t1xhf7qzKsrbRu", + "type": "rectangle", + "x": 1804.3910449085931, + "y": 616.7160716074219, + "width": 81.37086769140626, + "height": 71.77563639257814, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "DGV9B-leaIdxfsx1Ad8MI" + ], + "frameId": null, + "index": "b0UzuzG", + "roundness": { + "type": 3 + }, + "seed": 314115744, + "version": 1138, + "versionNonce": 830080525, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "LpTCUjIv2ULaskKwAQVsH" + }, + { + "id": "yGanaoV_Y4lG1t7m9XS2c", + "type": "arrow" + }, + { + "id": "sb7w9zD5EuJEu5eaOmvX9", + "type": "arrow" + } + ], + "updated": 1780083256663, + "link": null, + "locked": false + }, + { + "id": "LpTCUjIv2ULaskKwAQVsH", + "type": "text", + "x": 1829.7044694769522, + "y": 630.103889803711, + "width": 30.7440185546875, + "height": 45, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "DGV9B-leaIdxfsx1Ad8MI" + ], + "frameId": null, + "index": "b0UzuzV", + "roundness": null, + "seed": 1864315552, + "version": 605, + "versionNonce": 454886317, + "isDeleted": false, + "boundElements": [], + "updated": 1780083256663, + "link": null, + "locked": false, + "text": "11", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "TMtdtw8t1xhf7qzKsrbRu", + "originalText": "11", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "fp2A3WbVUmAdKLy6IuBoP", + "type": "text", + "x": 1850.8205485999995, + "y": 661.678092, + "width": 29.019973754882812, + "height": 25, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "DGV9B-leaIdxfsx1Ad8MI" + ], + "frameId": null, + "index": "b0Uzuzl", + "roundness": null, + "seed": 903863968, + "version": 664, + "versionNonce": 36390189, + "isDeleted": false, + "boundElements": [], + "updated": 1780083256664, + "link": null, + "locked": false, + "text": "(3)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(3)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "aiXUe7MG9UO6dZn1eBhBQ", + "type": "rectangle", + "x": 2001.411257708593, + "y": 616.7160716074219, + "width": 81.37086769140626, + "height": 71.77563639257814, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "KwDHX2PoBh1nJCMU3oHxL" + ], + "frameId": null, + "index": "b0Uzuzp", + "roundness": { + "type": 3 + }, + "seed": 507958112, + "version": 1144, + "versionNonce": 475241965, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "dVwSxGOi51vfwKhKkWShj" + }, + { + "id": "cQLUB-uzt4D3xvZs1RhYi", + "type": "arrow" + } + ], + "updated": 1780083256664, + "link": null, + "locked": false + }, + { + "id": "dVwSxGOi51vfwKhKkWShj", + "type": "text", + "x": 2021.8106808121088, + "y": 630.103889803711, + "width": 40.572021484375, + "height": 45, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "KwDHX2PoBh1nJCMU3oHxL" + ], + "frameId": null, + "index": "b0Uzuzt", + "roundness": null, + "seed": 148203360, + "version": 607, + "versionNonce": 1883510669, + "isDeleted": false, + "boundElements": [], + "updated": 1780083256664, + "link": null, + "locked": false, + "text": "12", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "aiXUe7MG9UO6dZn1eBhBQ", + "originalText": "12", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "rYwEfX7Hf2uCcls9tUlRh", + "type": "text", + "x": 2047.8407613999993, + "y": 661.678092, + "width": 29.019973754882812, + "height": 25, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "KwDHX2PoBh1nJCMU3oHxL" + ], + "frameId": null, + "index": "b0Uzuzx", + "roundness": null, + "seed": 1282505568, + "version": 666, + "versionNonce": 1833748141, + "isDeleted": false, + "boundElements": [], + "updated": 1780083256665, + "link": null, + "locked": false, + "text": "(3)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(3)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "tpYp3pe_R2qQZXkgIZf2j", + "type": "rectangle", + "x": 425.24955530859336, + "y": 616.7160716074218, + "width": 81.37086769140626, + "height": 71.77563639257814, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "hnz6tLtZ1zOC20XOfYjZq" + ], + "frameId": null, + "index": "b0Uzv", + "roundness": { + "type": 3 + }, + "seed": 137627488, + "version": 913, + "versionNonce": 1079741347, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "zPgKruHVjShz4UMTxpgDn" + }, + { + "id": "NPONUihoECiUmoktqHgQu", + "type": "arrow" + }, + { + "id": "PjpiHjXYhAoCM9nWupdga", + "type": "arrow" + } + ], + "updated": 1780083253909, + "link": null, + "locked": false + }, + { + "id": "zPgKruHVjShz4UMTxpgDn", + "type": "text", + "x": 455.8909828066402, + "y": 630.1038898037109, + "width": 20.0880126953125, + "height": 45, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "hnz6tLtZ1zOC20XOfYjZq" + ], + "frameId": null, + "index": "b0Uzx", + "roundness": null, + "seed": 654056288, + "version": 374, + "versionNonce": 2096432131, + "isDeleted": false, + "boundElements": [], + "updated": 1780083253909, + "link": null, + "locked": false, + "text": "7", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "tpYp3pe_R2qQZXkgIZf2j", + "originalText": "7", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ihX_pfBYrlP38Rqp69k9a", + "type": "text", + "x": 471.6790589999997, + "y": 661.6780920000001, + "width": 29.019973754882812, + "height": 25, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "hnz6tLtZ1zOC20XOfYjZq" + ], + "frameId": null, + "index": "b0Uzz", + "roundness": null, + "seed": 1537322848, + "version": 433, + "versionNonce": 848128643, + "isDeleted": false, + "boundElements": [], + "updated": 1780083253910, + "link": null, + "locked": false, + "text": "(3)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(3)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "myWkcqVnnjkrocKxk3hPq", + "type": "rectangle", + "x": 1213.7680183085934, + "y": 848.5898393574221, + "width": 81.37086769140626, + "height": 71.77563639257814, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "YWdFy2gYDKS0tbzcyy7O8" + ], + "frameId": null, + "index": "b0UzzG", + "roundness": { + "type": 3 + }, + "seed": 1694105248, + "version": 1560, + "versionNonce": 1128404899, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "3scm7wOVOQWeqLPXI0GsF" + }, + { + "id": "uzEBvG-NCDbTqpJ41mPCM", + "type": "arrow" + } + ], + "updated": 1780083435060, + "link": null, + "locked": false + }, + { + "id": "3scm7wOVOQWeqLPXI0GsF", + "type": "text", + "x": 1235.2474432431636, + "y": 861.9776575537112, + "width": 38.412017822265625, + "height": 45, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "YWdFy2gYDKS0tbzcyy7O8" + ], + "frameId": null, + "index": "b0UzzV", + "roundness": null, + "seed": 1048652448, + "version": 1023, + "versionNonce": 482152451, + "isDeleted": false, + "boundElements": [], + "updated": 1780083435060, + "link": null, + "locked": false, + "text": "16", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "myWkcqVnnjkrocKxk3hPq", + "originalText": "16", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Gc7Y3PYQQrWUn6mUybz7k", + "type": "text", + "x": 1260.197522, + "y": 893.5518597500004, + "width": 30.859970092773438, + "height": 25, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "YWdFy2gYDKS0tbzcyy7O8" + ], + "frameId": null, + "index": "b0Uzzl", + "roundness": null, + "seed": 910349984, + "version": 1102, + "versionNonce": 73714403, + "isDeleted": false, + "boundElements": [], + "updated": 1780083435061, + "link": null, + "locked": false, + "text": "(2)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(2)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "IvPoN15oHjzjmW05_BXAX", + "type": "rectangle", + "x": 621.9473463085932, + "y": 848.5898393574221, + "width": 81.37086769140626, + "height": 71.77563639257814, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "0nl08biZ6ZI4cKYgpq4-F" + ], + "frameId": null, + "index": "b0Uzzm", + "roundness": { + "type": 3 + }, + "seed": 789858144, + "version": 1047, + "versionNonce": 677621283, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "8cvTQ2m5PRpVXs-ZqSGUz" + }, + { + "id": "AJZE0ay9-ZRdrsPTkE7Fs", + "type": "arrow" + } + ], + "updated": 1780083435061, + "link": null, + "locked": false + }, + { + "id": "8cvTQ2m5PRpVXs-ZqSGUz", + "type": "text", + "x": 643.6247692900386, + "y": 861.9776575537112, + "width": 38.016021728515625, + "height": 45, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "0nl08biZ6ZI4cKYgpq4-F" + ], + "frameId": null, + "index": "b0Uzzn", + "roundness": null, + "seed": 131357536, + "version": 513, + "versionNonce": 401569411, + "isDeleted": false, + "boundElements": [], + "updated": 1780083435061, + "link": null, + "locked": false, + "text": "19", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "IvPoN15oHjzjmW05_BXAX", + "originalText": "19", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "7_h-Z5269D2lVtYM-IuyP", + "type": "text", + "x": 668.3768499999995, + "y": 893.5518597500002, + "width": 29.019973754882812, + "height": 25, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "0nl08biZ6ZI4cKYgpq4-F" + ], + "frameId": null, + "index": "b0Uzzo", + "roundness": null, + "seed": 2003955552, + "version": 570, + "versionNonce": 1777516899, + "isDeleted": false, + "boundElements": [], + "updated": 1780083435062, + "link": null, + "locked": false, + "text": "(3)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(3)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "fEhF6ldjM9d6f8__MBtJO", + "type": "rectangle", + "x": 1608.721453308594, + "y": 848.5898393574221, + "width": 81.37086769140626, + "height": 71.77563639257814, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "GNf-PYaKZXfBW5V91qFSs" + ], + "frameId": null, + "index": "b0UzzoG", + "roundness": { + "type": 3 + }, + "seed": 2071838368, + "version": 999, + "versionNonce": 1724253347, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "ZT5O8_eaXsZ8Zp_GQ72tU" + }, + { + "id": "JI6CoeD9plu4Y3rCUYzbN", + "type": "arrow" + } + ], + "updated": 1780083435062, + "link": null, + "locked": false + }, + { + "id": "ZT5O8_eaXsZ8Zp_GQ72tU", + "type": "text", + "x": 1624.8548775717775, + "y": 861.9776575537112, + "width": 49.10401916503906, + "height": 45, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "GNf-PYaKZXfBW5V91qFSs" + ], + "frameId": null, + "index": "b0UzzoV", + "roundness": null, + "seed": 1317857952, + "version": 462, + "versionNonce": 897228035, + "isDeleted": false, + "boundElements": [], + "updated": 1780083435062, + "link": null, + "locked": false, + "text": "20", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "fEhF6ldjM9d6f8__MBtJO", + "originalText": "20", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "evKDVbdj8iL2IPM3z6f81", + "type": "text", + "x": 1655.1509570000005, + "y": 893.5518597500002, + "width": 29.019973754882812, + "height": 25, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "GNf-PYaKZXfBW5V91qFSs" + ], + "frameId": null, + "index": "b0Uzzol", + "roundness": null, + "seed": 1322686112, + "version": 516, + "versionNonce": 1603368931, + "isDeleted": false, + "boundElements": [], + "updated": 1780083435062, + "link": null, + "locked": false, + "text": "(3)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(3)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "nXCzdcSi-KwLgubsOrfDg", + "type": "rectangle", + "x": 1805.138975308593, + "y": 848.5898393574221, + "width": 81.37086769140626, + "height": 71.77563639257814, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "tURztL2Z0cp-s5D1Va253" + ], + "frameId": null, + "index": "b0Uzzop", + "roundness": { + "type": 3 + }, + "seed": 1442945888, + "version": 1105, + "versionNonce": 2013862691, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "16pwel0YeOOymBw_UH_ek" + }, + { + "id": "sb7w9zD5EuJEu5eaOmvX9", + "type": "arrow" + } + ], + "updated": 1780083435062, + "link": null, + "locked": false + }, + { + "id": "16pwel0YeOOymBw_UH_ek", + "type": "text", + "x": 1825.5383984121083, + "y": 861.9776575537112, + "width": 40.572021484375, + "height": 45, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "tURztL2Z0cp-s5D1Va253" + ], + "frameId": null, + "index": "b0Uzzot", + "roundness": null, + "seed": 234303328, + "version": 578, + "versionNonce": 587105155, + "isDeleted": false, + "boundElements": [], + "updated": 1780083435062, + "link": null, + "locked": false, + "text": "21", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "nXCzdcSi-KwLgubsOrfDg", + "originalText": "21", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "wOUE1KscUXfhW0BOIozGL", + "type": "text", + "x": 1851.5684789999993, + "y": 893.5518597500004, + "width": 29.019973754882812, + "height": 25, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "tURztL2Z0cp-s5D1Va253" + ], + "frameId": null, + "index": "b0Uzzox", + "roundness": null, + "seed": 1511670624, + "version": 626, + "versionNonce": 1994452579, + "isDeleted": false, + "boundElements": [], + "updated": 1780083435063, + "link": null, + "locked": false, + "text": "(3)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(3)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "qX8McJGGi1qJPy_dw_OXV", + "type": "rectangle", + "x": 1410.3506193085934, + "y": 848.5898393574221, + "width": 81.37086769140626, + "height": 71.77563639257814, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Qj7vHjwBaGF0UpWGDyOHM" + ], + "frameId": null, + "index": "b0Uzzoy", + "roundness": { + "type": 3 + }, + "seed": 1913891488, + "version": 1407, + "versionNonce": 97317283, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "uFQiB1IGZqwSZog6XcNlx" + }, + { + "id": "jyhpEVwJkIpGh2bTmGWgw", + "type": "arrow" + }, + { + "id": "31g3ilWp6ObHmiwIDoWTG", + "type": "arrow" + } + ], + "updated": 1780083435063, + "link": null, + "locked": false + }, + { + "id": "uFQiB1IGZqwSZog6XcNlx", + "type": "text", + "x": 1433.3060421679684, + "y": 861.9776575537112, + "width": 35.46002197265625, + "height": 45, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Qj7vHjwBaGF0UpWGDyOHM" + ], + "frameId": null, + "index": "b0Uzzoz", + "roundness": null, + "seed": 1401247392, + "version": 867, + "versionNonce": 1041967619, + "isDeleted": false, + "boundElements": [], + "updated": 1780083435063, + "link": null, + "locked": false, + "text": "17", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "qX8McJGGi1qJPy_dw_OXV", + "originalText": "17", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "K-6yX1ID6mQlITyA5dxT6", + "type": "text", + "x": 1456.7801229999998, + "y": 893.5518597500004, + "width": 28.65997314453125, + "height": 25, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "Qj7vHjwBaGF0UpWGDyOHM" + ], + "frameId": null, + "index": "b0UzzozV", + "roundness": null, + "seed": 1910604448, + "version": 930, + "versionNonce": 342921347, + "isDeleted": false, + "boundElements": [], + "updated": 1780083435064, + "link": null, + "locked": false, + "text": "(6)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(6)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "o7LSHTbtd1Y0t3MEqPNSG", + "type": "rectangle", + "x": 622.2697681085933, + "y": 616.7160716074218, + "width": 81.37086769140626, + "height": 71.77563639257814, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "gFn3eq9jEWFm66iAb8_v5" + ], + "frameId": null, + "index": "b0Uzzp", + "roundness": { + "type": 3 + }, + "seed": 1302944608, + "version": 978, + "versionNonce": 366850157, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "UBqle1h_CuAALA5N_uxCk" + }, + { + "id": "A2SlOPA3yU7pgZaO0hlJT", + "type": "arrow" + }, + { + "id": "AJZE0ay9-ZRdrsPTkE7Fs", + "type": "arrow" + } + ], + "updated": 1780083256653, + "link": null, + "locked": false + }, + { + "id": "UBqle1h_CuAALA5N_uxCk", + "type": "text", + "x": 651.5071962780269, + "y": 630.1038898037109, + "width": 22.896011352539062, + "height": 45, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "gFn3eq9jEWFm66iAb8_v5" + ], + "frameId": null, + "index": "b0Uzzt", + "roundness": null, + "seed": 984018784, + "version": 436, + "versionNonce": 574519821, + "isDeleted": false, + "boundElements": [], + "updated": 1780083256653, + "link": null, + "locked": false, + "text": "8", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "o7LSHTbtd1Y0t3MEqPNSG", + "originalText": "8", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "EdPjQQ4QnBOjX0IiRJQsb", + "type": "text", + "x": 668.6992717999997, + "y": 661.6780920000001, + "width": 29.019973754882812, + "height": 25, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "gFn3eq9jEWFm66iAb8_v5" + ], + "frameId": null, + "index": "b0Uzzx", + "roundness": null, + "seed": 1523712864, + "version": 497, + "versionNonce": 825133965, + "isDeleted": false, + "boundElements": [], + "updated": 1780083256655, + "link": null, + "locked": false, + "text": "(3)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(3)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "g-6FylYdekZ3cKJEWvBGt", + "type": "rectangle", + "x": 1017.1854163085933, + "y": 1086.5971276074224, + "width": 81.37086769140626, + "height": 71.77563639257814, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "P8u9velPImeOKRUISlT8w" + ], + "frameId": null, + "index": "b0Uzzy", + "roundness": { + "type": 3 + }, + "seed": 1367861920, + "version": 1635, + "versionNonce": 1098005101, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "056bpSTfQmML09WZrY5Wv" + }, + { + "id": "p_FG1Pkmuq0BsRkacwAeA", + "type": "arrow" + } + ], + "updated": 1780083421162, + "link": null, + "locked": false + }, + { + "id": "056bpSTfQmML09WZrY5Wv", + "type": "text", + "x": 1032.6708379472652, + "y": 1099.9849458037115, + "width": 50.4000244140625, + "height": 45, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "P8u9velPImeOKRUISlT8w" + ], + "frameId": null, + "index": "b0Uzzz", + "roundness": null, + "seed": 980522656, + "version": 1094, + "versionNonce": 762995917, + "isDeleted": false, + "boundElements": [], + "updated": 1780083421162, + "link": null, + "locked": false, + "text": "22", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "g-6FylYdekZ3cKJEWvBGt", + "originalText": "22", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "GESw5W8zkDXUAxdHsHmu1", + "type": "text", + "x": 1063.6149199999995, + "y": 1131.5591480000007, + "width": 30.859970092773438, + "height": 25, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "P8u9velPImeOKRUISlT8w" + ], + "frameId": null, + "index": "b0UzzzV", + "roundness": null, + "seed": 826655392, + "version": 1138, + "versionNonce": 215438733, + "isDeleted": false, + "boundElements": [], + "updated": 1780083421163, + "link": null, + "locked": false, + "text": "(2)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(2)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "KRPf5yhdditu3F_F1a4Gu", + "type": "rectangle", + "x": 1410.7506993085929, + "y": 1086.5971276074224, + "width": 81.37086769140626, + "height": 71.77563639257814, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "p09iou-IfORGH6UELY7UF" + ], + "frameId": null, + "index": "b0UzzzX", + "roundness": { + "type": 3 + }, + "seed": 1810569056, + "version": 1858, + "versionNonce": 382525901, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "ycZQ49pUAatXBzTpdsPzf" + }, + { + "id": "31g3ilWp6ObHmiwIDoWTG", + "type": "arrow" + } + ], + "updated": 1780083317808, + "link": null, + "locked": false + }, + { + "id": "ycZQ49pUAatXBzTpdsPzf", + "type": "text", + "x": 1427.8921191772451, + "y": 1099.9849458037115, + "width": 47.08802795410156, + "height": 45, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "p09iou-IfORGH6UELY7UF" + ], + "frameId": null, + "index": "b0UzzzZ", + "roundness": null, + "seed": 558967648, + "version": 1332, + "versionNonce": 63512621, + "isDeleted": false, + "boundElements": [], + "updated": 1780083317808, + "link": null, + "locked": false, + "text": "23", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "KRPf5yhdditu3F_F1a4Gu", + "originalText": "23", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "su9T5Co5l1dnDtNYxlt8p", + "type": "text", + "x": 1457.1802029999992, + "y": 1131.5591480000003, + "width": 29.019973754882812, + "height": 25, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "p09iou-IfORGH6UELY7UF" + ], + "frameId": null, + "index": "b0Uzzzb", + "roundness": null, + "seed": 1758773088, + "version": 1381, + "versionNonce": 1316403437, + "isDeleted": false, + "boundElements": [], + "updated": 1780083317809, + "link": null, + "locked": false, + "text": "(3)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(3)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "9ospZ-hCXsYW0V1QEhvyb", + "type": "rectangle", + "x": 1017.1854163085933, + "y": 848.589839357422, + "width": 81.37086769140626, + "height": 71.77563639257814, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "koOaIgmlOPA6QsCWjFxcA" + ], + "frameId": null, + "index": "b0Uzzzd", + "roundness": { + "type": 3 + }, + "seed": 1194078048, + "version": 1663, + "versionNonce": 1194494915, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "T3A3ozgshpeCprbQLvgP2" + }, + { + "id": "3SLLbgY41skwK0AuCmZrQ", + "type": "arrow" + }, + { + "id": "p_FG1Pkmuq0BsRkacwAeA", + "type": "arrow" + } + ], + "updated": 1780083435064, + "link": null, + "locked": false + }, + { + "id": "T3A3ozgshpeCprbQLvgP2", + "type": "text", + "x": 1039.0608449663082, + "y": 861.9776575537111, + "width": 37.62001037597656, + "height": 45, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "koOaIgmlOPA6QsCWjFxcA" + ], + "frameId": null, + "index": "b0Uzzzl", + "roundness": null, + "seed": 615465824, + "version": 1118, + "versionNonce": 1773242403, + "isDeleted": false, + "boundElements": [], + "updated": 1780083435064, + "link": null, + "locked": false, + "text": "15", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "9ospZ-hCXsYW0V1QEhvyb", + "originalText": "15", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "GEq0F_LlSr2tv6ZyhL8rd", + "type": "text", + "x": 1063.6149199999995, + "y": 893.5518597500003, + "width": 30.859970092773438, + "height": 25, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "koOaIgmlOPA6QsCWjFxcA" + ], + "frameId": null, + "index": "b0Uzzzt", + "roundness": null, + "seed": 145741664, + "version": 1202, + "versionNonce": 760667811, + "isDeleted": false, + "boundElements": [], + "updated": 1780083435065, + "link": null, + "locked": false, + "text": "(2)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(2)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "CdTskbUc1q_N5lSZUfgoK", + "type": "rectangle", + "x": 1016.3101937085933, + "y": 616.7160716074219, + "width": 81.37086769140626, + "height": 71.77563639257814, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "EzSsMAeFXenDG6UsaWHAN" + ], + "frameId": null, + "index": "b0Uzzzv", + "roundness": { + "type": 3 + }, + "seed": 689985184, + "version": 1556, + "versionNonce": 1951776205, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "XoB4HvcrnDO5DWYtZOfKJ" + }, + { + "id": "YIVh5VEYSSMboVgelAT84", + "type": "arrow" + }, + { + "id": "bB6wsx83ezFbVCnasmngs", + "type": "arrow" + }, + { + "id": "3SLLbgY41skwK0AuCmZrQ", + "type": "arrow" + }, + { + "id": "uzEBvG-NCDbTqpJ41mPCM", + "type": "arrow" + } + ], + "updated": 1780083256655, + "link": null, + "locked": false + }, + { + "id": "XoB4HvcrnDO5DWYtZOfKJ", + "type": "text", + "x": 1045.8716270049802, + "y": 630.103889803711, + "width": 22.248001098632812, + "height": 45, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "EzSsMAeFXenDG6UsaWHAN" + ], + "frameId": null, + "index": "b0Uzzzx", + "roundness": null, + "seed": 1545372320, + "version": 1028, + "versionNonce": 251966317, + "isDeleted": false, + "boundElements": [], + "updated": 1780083256655, + "link": null, + "locked": false, + "text": "5", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "CdTskbUc1q_N5lSZUfgoK", + "originalText": "5", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "wpTS2j9hFLx2mYbo3eH9B", + "type": "text", + "x": 1062.7396973999996, + "y": 661.6780920000002, + "width": 30.859970092773438, + "height": 25, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "EzSsMAeFXenDG6UsaWHAN" + ], + "frameId": null, + "index": "b0Uzzzz", + "roundness": null, + "seed": 917712544, + "version": 1102, + "versionNonce": 1613004205, + "isDeleted": false, + "boundElements": [], + "updated": 1780083256658, + "link": null, + "locked": false, + "text": "(2)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(2)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ClpEH5K9K2Mcnn1GLz2pN", + "type": "rectangle", + "x": 1690.092320641926, + "y": 381.18356510742206, + "width": 81.37086769140626, + "height": 71.77563639257814, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "3a1yLZpJ-IAw29fuHPjFL" + ], + "frameId": null, + "index": "b0UzzzzG", + "roundness": { + "type": 3 + }, + "seed": 1812759392, + "version": 1194, + "versionNonce": 144607843, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "WFJui7HuNjGCrvjLrvxJR" + }, + { + "id": "FKkqPnRMOXE8tGMgDkiDd", + "type": "arrow" + }, + { + "id": "917mL2X0UaY7Wvz9ogVGV", + "type": "arrow" + }, + { + "id": "yGanaoV_Y4lG1t7m9XS2c", + "type": "arrow" + }, + { + "id": "cQLUB-uzt4D3xvZs1RhYi", + "type": "arrow" + }, + { + "id": "bB6wsx83ezFbVCnasmngs", + "type": "arrow" + }, + { + "id": "FM-GjMHBt1N7dzVMI5_M6", + "type": "arrow" + }, + { + "id": "YzfkpLewQBur0LZOpCdAY", + "type": "arrow" + } + ], + "updated": 1780083351023, + "link": null, + "locked": false + }, + { + "id": "WFJui7HuNjGCrvjLrvxJR", + "type": "text", + "x": 1718.1777483841138, + "y": 394.57138330371106, + "width": 25.20001220703125, + "height": 45, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "3a1yLZpJ-IAw29fuHPjFL" + ], + "frameId": null, + "index": "b0UzzzzV", + "roundness": null, + "seed": 1919227744, + "version": 639, + "versionNonce": 1801509571, + "isDeleted": false, + "boundElements": [], + "updated": 1780083351023, + "link": null, + "locked": false, + "text": "2", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "ClpEH5K9K2Mcnn1GLz2pN", + "originalText": "2", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "BQJt9k6hbq-FofUwwdi2X", + "type": "text", + "x": 1736.5218243333325, + "y": 426.14558550000027, + "width": 29.019973754882812, + "height": 25, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "3a1yLZpJ-IAw29fuHPjFL" + ], + "frameId": null, + "index": "b0Uzzzzl", + "roundness": null, + "seed": 1217080160, + "version": 709, + "versionNonce": 1181988707, + "isDeleted": false, + "boundElements": [], + "updated": 1780083351027, + "link": null, + "locked": false, + "text": "(3)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(3)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "6egt_eId-rQzX7LdRfQR0", + "type": "rectangle", + "x": 718.9782543085931, + "y": 381.18356510742206, + "width": 81.37086769140626, + "height": 71.77563639257814, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "YpL0cS4kxn1p0LyGl08c0" + ], + "frameId": null, + "index": "b0Uzzzzp", + "roundness": { + "type": 3 + }, + "seed": 561201824, + "version": 1092, + "versionNonce": 67205795, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "Drk_M-iaTg2u3QK8T3gEh" + }, + { + "id": "zYt_QdVAhabUymmqBPo_O", + "type": "arrow" + }, + { + "id": "NPONUihoECiUmoktqHgQu", + "type": "arrow" + }, + { + "id": "A2SlOPA3yU7pgZaO0hlJT", + "type": "arrow" + }, + { + "id": "KSrRWYR77Z6kwwc5DYArW", + "type": "arrow" + }, + { + "id": "YIVh5VEYSSMboVgelAT84", + "type": "arrow" + }, + { + "id": "CpHNu17GBHoxkk8V2aRpA", + "type": "arrow" + }, + { + "id": "GhkvZVqTtG7ffV-L-qAse", + "type": "arrow" + } + ], + "updated": 1780083351027, + "link": null, + "locked": false + }, + { + "id": "Drk_M-iaTg2u3QK8T3gEh", + "type": "text", + "x": 751.9776835156243, + "y": 394.5713833037112, + "width": 15.37200927734375, + "height": 45, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "YpL0cS4kxn1p0LyGl08c0" + ], + "frameId": null, + "index": "b0Uzzzzt", + "roundness": null, + "seed": 590474912, + "version": 545, + "versionNonce": 40686339, + "isDeleted": false, + "boundElements": [], + "updated": 1780083351027, + "link": null, + "locked": false, + "text": "1", + "fontSize": 36, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "6egt_eId-rQzX7LdRfQR0", + "originalText": "1", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "d6agJXH0ydHEr_kY6SIPx", + "type": "text", + "x": 765.4077579999995, + "y": 426.14558550000027, + "width": 29.019973754882812, + "height": 25, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ffec99", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [ + "YpL0cS4kxn1p0LyGl08c0" + ], + "frameId": null, + "index": "b0Uzzzzx", + "roundness": null, + "seed": 1346050720, + "version": 604, + "versionNonce": 934438819, + "isDeleted": false, + "boundElements": [], + "updated": 1780083351032, + "link": null, + "locked": false, + "text": "(3)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(3)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "zYt_QdVAhabUymmqBPo_O", + "type": "arrow", + "x": 1379.7932232500168, + "y": 221.3246053611583, + "width": 596.8572946110806, + "height": 153.86305809638154, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0e", + "roundness": { + "type": 2 + }, + "seed": 1889540960, + "version": 227, + "versionNonce": 669003331, + "isDeleted": false, + "boundElements": [], + "updated": 1780083351028, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -596.8572946110806, + 153.86305809638154 + ] + ], + "startBinding": { + "elementId": "flRofi7WAa5SUt_bIWJCd", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "6egt_eId-rQzX7LdRfQR0", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "FKkqPnRMOXE8tGMgDkiDd", + "type": "arrow", + "x": 1414.9132103244597, + "y": 221.32853900000003, + "width": 304.01671316654506, + "height": 153.85502610742202, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0f", + "roundness": { + "type": 2 + }, + "seed": 345142112, + "version": 324, + "versionNonce": 2110080515, + "isDeleted": false, + "boundElements": [], + "updated": 1780083351023, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 304.01671316654506, + 153.85502610742202 + ] + ], + "startBinding": { + "elementId": "flRofi7WAa5SUt_bIWJCd", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "ClpEH5K9K2Mcnn1GLz2pN", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "ferAR-u6a_8a1Ywa36T4B", + "type": "arrow", + "x": 1431.2688176059783, + "y": 220.92424836687215, + "width": 779.6376269464854, + "height": 154.66215362702664, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0g", + "roundness": { + "type": 2 + }, + "seed": 690324320, + "version": 350, + "versionNonce": 348317411, + "isDeleted": false, + "boundElements": [], + "updated": 1780083458437, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 779.6376269464854, + 154.66215362702664 + ] + ], + "startBinding": { + "elementId": "flRofi7WAa5SUt_bIWJCd", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "calMAhOrK3Of3AsVRPXG3", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "FgDuSyW7GQOsySLwyNTul", + "type": "arrow", + "x": 1434.141087936496, + "y": 220.31875894064504, + "width": 970.910168573171, + "height": 155.87294301900616, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0h", + "roundness": { + "type": 2 + }, + "seed": 1606182752, + "version": 385, + "versionNonce": 838908163, + "isDeleted": false, + "boundElements": [], + "updated": 1780083351021, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 970.910168573171, + 155.87294301900616 + ] + ], + "startBinding": { + "elementId": "flRofi7WAa5SUt_bIWJCd", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "mA0Phiuz0ymWgRqErTBpP", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "l50Td3BNX9safWcZ9iw1Q", + "type": "arrow", + "x": 2239.125041890633, + "y": 458.95920150000023, + "width": 4.3246973291388713e-7, + "height": 151.75687010742166, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0i", + "roundness": { + "type": 2 + }, + "seed": 749834080, + "version": 269, + "versionNonce": 774509187, + "isDeleted": false, + "boundElements": [], + "updated": 1780083458438, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -4.3246973291388713e-7, + 151.75687010742166 + ] + ], + "startBinding": { + "elementId": "calMAhOrK3Of3AsVRPXG3", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "x6CGuwmbtSpRs9pMT6w74", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "m_4sSA9yxWCIC3-9OR9Tb", + "type": "arrow", + "x": 2436.1452542410652, + "y": 458.95920150000023, + "width": 9.094947017729282e-13, + "height": 151.75687010742166, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0j", + "roundness": { + "type": 2 + }, + "seed": 865102688, + "version": 303, + "versionNonce": 606642339, + "isDeleted": false, + "boundElements": [], + "updated": 1780083351021, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -9.094947017729282e-13, + 151.75687010742166 + ] + ], + "startBinding": { + "elementId": "mA0Phiuz0ymWgRqErTBpP", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "PBzXEyN1Sh_EcXklMmyCl", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "NPONUihoECiUmoktqHgQu", + "type": "arrow", + "x": 748.9096984805582, + "y": 458.9592015000002, + "width": 272.2044454789853, + "height": 151.7568701074216, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0k", + "roundness": { + "type": 2 + }, + "seed": 1482284704, + "version": 188, + "versionNonce": 820473315, + "isDeleted": false, + "boundElements": [], + "updated": 1780083351029, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -272.2044454789853, + 151.7568701074216 + ] + ], + "startBinding": { + "elementId": "6egt_eId-rQzX7LdRfQR0", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "tpYp3pe_R2qQZXkgIZf2j", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "A2SlOPA3yU7pgZaO0hlJT", + "type": "arrow", + "x": 756.1284568509675, + "y": 458.9592015000002, + "width": 89.62174941980413, + "height": 151.7568701074216, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0l", + "roundness": { + "type": 2 + }, + "seed": 120668832, + "version": 193, + "versionNonce": 36026755, + "isDeleted": false, + "boundElements": [], + "updated": 1780083351029, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -89.62174941980413, + 151.7568701074216 + ] + ], + "startBinding": { + "elementId": "6egt_eId-rQzX7LdRfQR0", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "o7LSHTbtd1Y0t3MEqPNSG", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "KSrRWYR77Z6kwwc5DYArW", + "type": "arrow", + "x": 763.3472152213768, + "y": 458.9592015000002, + "width": 92.96094663937731, + "height": 151.7568701074216, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0m", + "roundness": { + "type": 2 + }, + "seed": 1461220000, + "version": 232, + "versionNonce": 416911651, + "isDeleted": false, + "boundElements": [], + "updated": 1780083351030, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 92.96094663937731, + 151.7568701074216 + ] + ], + "startBinding": { + "elementId": "6egt_eId-rQzX7LdRfQR0", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "jSljWe947MJZNu3Ir1SnE", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "PjpiHjXYhAoCM9nWupdga", + "type": "arrow", + "x": 465.9431262410656, + "y": 694.491708, + "width": 5.684341886080802e-14, + "height": 148.09813135742195, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0n", + "roundness": { + "type": 2 + }, + "seed": 1741471392, + "version": 34, + "versionNonce": 48440515, + "isDeleted": false, + "boundElements": [], + "updated": 1780083435060, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 5.684341886080802e-14, + 148.09813135742195 + ] + ], + "startBinding": { + "elementId": "tpYp3pe_R2qQZXkgIZf2j", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "AtW7BwiPbzdAGE82L09z0", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "AJZE0ay9-ZRdrsPTkE7Fs", + "type": "arrow", + "x": 662.9512556345725, + "y": 694.4917079999999, + "width": 0.29825498701370634, + "height": 148.0981313574223, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0o", + "roundness": { + "type": 2 + }, + "seed": 1586064032, + "version": 192, + "versionNonce": 2024796611, + "isDeleted": false, + "boundElements": [], + "updated": 1780083435062, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.29825498701370634, + 148.0981313574223 + ] + ], + "startBinding": { + "elementId": "o7LSHTbtd1Y0t3MEqPNSG", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "IvPoN15oHjzjmW05_BXAX", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "917mL2X0UaY7Wvz9ogVGV", + "type": "arrow", + "x": 1727.083040853727, + "y": 458.9592015000002, + "width": 93.65550597401352, + "height": 151.7568701074216, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0p", + "roundness": { + "type": 2 + }, + "seed": 1122730656, + "version": 328, + "versionNonce": 30641571, + "isDeleted": false, + "boundElements": [], + "updated": 1780083351024, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -93.65550597401352, + 151.7568701074216 + ] + ], + "startBinding": { + "elementId": "ClpEH5K9K2Mcnn1GLz2pN", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "7xPCWQXZQI5Cy9a21jJwj", + "mode": "orbit", + "fixedPoint": [ + 0.17788218893093322, + 0.17788218893093494 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "yGanaoV_Y4lG1t7m9XS2c", + "type": "arrow", + "x": 1734.9737607315833, + "y": 458.9592015000002, + "width": 105.92298595229704, + "height": 151.75687010742172, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0q", + "roundness": { + "type": 2 + }, + "seed": 146980512, + "version": 265, + "versionNonce": 1744298307, + "isDeleted": false, + "boundElements": [], + "updated": 1780083351025, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 105.92298595229704, + 151.75687010742172 + ] + ], + "startBinding": { + "elementId": "ClpEH5K9K2Mcnn1GLz2pN", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "TMtdtw8t1xhf7qzKsrbRu", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "cQLUB-uzt4D3xvZs1RhYi", + "type": "arrow", + "x": 1742.1925191019927, + "y": 458.9592015000002, + "width": 288.5056820114785, + "height": 151.75687010742172, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0r", + "roundness": { + "type": 2 + }, + "seed": 1195780768, + "version": 336, + "versionNonce": 428916963, + "isDeleted": false, + "boundElements": [], + "updated": 1780083351025, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 288.5056820114785, + 151.75687010742172 + ] + ], + "startBinding": { + "elementId": "ClpEH5K9K2Mcnn1GLz2pN", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "aiXUe7MG9UO6dZn1eBhBQ", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "JI6CoeD9plu4Y3rCUYzbN", + "type": "arrow", + "x": 1648.1150202914437, + "y": 694.4917079999999, + "width": 1.249386699244269, + "height": 148.09813135742218, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0s", + "roundness": { + "type": 2 + }, + "seed": 972763808, + "version": 234, + "versionNonce": 360937539, + "isDeleted": false, + "boundElements": [], + "updated": 1780083435062, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.249386699244269, + 148.09813135742218 + ] + ], + "startBinding": { + "elementId": "7xPCWQXZQI5Cy9a21jJwj", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "fEhF6ldjM9d6f8__MBtJO", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "sb7w9zD5EuJEu5eaOmvX9", + "type": "arrow", + "x": 1845.1126460395565, + "y": 694.491708, + "width": 0.6918700030175842, + "height": 148.09813135742195, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0u", + "roundness": { + "type": 2 + }, + "seed": 382591840, + "version": 324, + "versionNonce": 1797242563, + "isDeleted": false, + "boundElements": [], + "updated": 1780083435063, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.6918700030175842, + 148.09813135742195 + ] + ], + "startBinding": { + "elementId": "TMtdtw8t1xhf7qzKsrbRu", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "nXCzdcSi-KwLgubsOrfDg", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "yki5czBT0Bwl85Wbv-sE2", + "type": "arrow", + "x": 1642.4275424952232, + "y": 217.47732999999997, + "width": 0, + "height": 0, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0v", + "roundness": { + "type": 2 + }, + "seed": 549213517, + "version": 44, + "versionNonce": 1577708397, + "isDeleted": true, + "boundElements": null, + "updated": 1780082499391, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ] + ], + "startBinding": { + "elementId": "flRofi7WAa5SUt_bIWJCd", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "YIVh5VEYSSMboVgelAT84", + "type": "arrow", + "x": 770.5659735917865, + "y": 458.9592015000002, + "width": 275.54364269855785, + "height": 151.75687010742172, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0w", + "roundness": { + "type": 2 + }, + "seed": 1674107267, + "version": 300, + "versionNonce": 1181840579, + "isDeleted": false, + "boundElements": null, + "updated": 1780083351031, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 275.54364269855785, + 151.75687010742172 + ] + ], + "startBinding": { + "elementId": "6egt_eId-rQzX7LdRfQR0", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "CdTskbUc1q_N5lSZUfgoK", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "z_rflMtkRiX6FSr4oIToX", + "type": "arrow", + "x": 715.3106529599143, + "y": 456.41682216099366, + "width": 0, + "height": 0, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0x", + "roundness": { + "type": 2 + }, + "seed": 2059950851, + "version": 52, + "versionNonce": 2120680419, + "isDeleted": true, + "boundElements": null, + "updated": 1780082511517, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ] + ], + "startBinding": { + "elementId": "6egt_eId-rQzX7LdRfQR0", + "mode": "inside", + "fixedPoint": [ + 0.33433342206075806, + 1.1888422219882298 + ] + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "CpHNu17GBHoxkk8V2aRpA", + "type": "arrow", + "x": 782.9853737805228, + "y": 458.9545741390759, + "width": 632.2034468119565, + "height": 162.62970883308384, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0y", + "roundness": { + "type": 2 + }, + "seed": 261250605, + "version": 516, + "versionNonce": 1101664685, + "isDeleted": false, + "boundElements": null, + "updated": 1780083381140, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 632.2034468119565, + 162.62970883308384 + ] + ], + "startBinding": { + "elementId": "6egt_eId-rQzX7LdRfQR0", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "0h8kgBJKeuIMC4mU331h2", + "mode": "inside", + "fixedPoint": [ + 0.05945864190897692, + 0.06782540161833134 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "bB6wsx83ezFbVCnasmngs", + "type": "arrow", + "x": 1706.2564202645397, + "y": 458.91994873033565, + "width": 624.7260274684252, + "height": 151.83598187641206, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0z", + "roundness": { + "type": 2 + }, + "seed": 444317603, + "version": 323, + "versionNonce": 1345105027, + "isDeleted": false, + "boundElements": null, + "updated": 1780083351026, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -624.7260274684252, + 151.83598187641206 + ] + ], + "startBinding": { + "elementId": "ClpEH5K9K2Mcnn1GLz2pN", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "CdTskbUc1q_N5lSZUfgoK", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "FM-GjMHBt1N7dzVMI5_M6", + "type": "arrow", + "x": 1721.6940470274078, + "y": 458.9592015000002, + "width": 234.52621900143572, + "height": 154.77193568625148, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b10", + "roundness": { + "type": 2 + }, + "seed": 305769731, + "version": 524, + "versionNonce": 1599980963, + "isDeleted": false, + "boundElements": null, + "updated": 1780083386907, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -234.52621900143572, + 154.77193568625148 + ] + ], + "startBinding": { + "elementId": "ClpEH5K9K2Mcnn1GLz2pN", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "0h8kgBJKeuIMC4mU331h2", + "mode": "orbit", + "fixedPoint": [ + 0.38022469879821924, + 0.3802246987982181 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "3SLLbgY41skwK0AuCmZrQ", + "type": "arrow", + "x": 1057.0365653711895, + "y": 694.491708, + "width": 0.8096211397521529, + "height": 148.09813135742183, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b11", + "roundness": { + "type": 2 + }, + "seed": 109007629, + "version": 298, + "versionNonce": 1091705699, + "isDeleted": false, + "boundElements": null, + "updated": 1780083435065, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.8096211397521529, + 148.09813135742183 + ] + ], + "startBinding": { + "elementId": "CdTskbUc1q_N5lSZUfgoK", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "9ospZ-hCXsYW0V1QEhvyb", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "uzEBvG-NCDbTqpJ41mPCM", + "type": "arrow", + "x": 1064.4038944086954, + "y": 694.491708, + "width": 182.6575650647403, + "height": 148.09813135742195, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b12", + "roundness": { + "type": 2 + }, + "seed": 1681621677, + "version": 320, + "versionNonce": 1325738819, + "isDeleted": false, + "boundElements": null, + "updated": 1780083435061, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 182.6575650647403, + 148.09813135742195 + ] + ], + "startBinding": { + "elementId": "CdTskbUc1q_N5lSZUfgoK", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "myWkcqVnnjkrocKxk3hPq", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "p_FG1Pkmuq0BsRkacwAeA", + "type": "arrow", + "x": 1057.8789872410653, + "y": 926.3654757500001, + "width": 0, + "height": 154.23165185742232, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b13", + "roundness": { + "type": 2 + }, + "seed": 462120525, + "version": 338, + "versionNonce": 1671345923, + "isDeleted": false, + "boundElements": null, + "updated": 1780083435065, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 154.23165185742232 + ] + ], + "startBinding": { + "elementId": "9ospZ-hCXsYW0V1QEhvyb", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "g-6FylYdekZ3cKJEWvBGt", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "jyhpEVwJkIpGh2bTmGWgw", + "type": "arrow", + "x": 1451.0441902410657, + "y": 694.491708, + "width": 2.2737367544323206e-13, + "height": 148.09813135742206, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b14", + "roundness": { + "type": 2 + }, + "seed": 1221518253, + "version": 391, + "versionNonce": 1864680771, + "isDeleted": false, + "boundElements": null, + "updated": 1780083435064, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 2.2737367544323206e-13, + 148.09813135742206 + ] + ], + "startBinding": { + "elementId": "0h8kgBJKeuIMC4mU331h2", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "qX8McJGGi1qJPy_dw_OXV", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "31g3ilWp6ObHmiwIDoWTG", + "type": "arrow", + "x": 1451.0586308122397, + "y": 926.3654757500002, + "width": 0.37119885765150684, + "height": 154.23165185742243, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "#ced4da", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b15", + "roundness": { + "type": 2 + }, + "seed": 1955517709, + "version": 425, + "versionNonce": 1904288995, + "isDeleted": false, + "boundElements": null, + "updated": 1780083435064, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.37119885765150684, + 154.23165185742243 + ] + ], + "startBinding": { + "elementId": "qX8McJGGi1qJPy_dw_OXV", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0.9999999999999998 + ] + }, + "endBinding": { + "elementId": "KRPf5yhdditu3F_F1a4Gu", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "q3ou-wEAq7_BUSxukVY7p", + "type": "rectangle", + "x": 883.8247617144715, + "y": 559.0819341095613, + "width": 159.32505289713546, + "height": 394.6260969399176, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b16", + "roundness": { + "type": 3 + }, + "seed": 742868141, + "version": 334, + "versionNonce": 1022399501, + "isDeleted": true, + "boundElements": null, + "updated": 1780083092094, + "link": null, + "locked": false + }, + { + "id": "78T79opA8ItPfh6KLrryB", + "type": "rectangle", + "x": 978.6938397144714, + "y": 566.8283281095612, + "width": 159.32505289713546, + "height": 394.6260969399176, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b16V", + "roundness": { + "type": 3 + }, + "seed": 218560067, + "version": 467, + "versionNonce": 775678051, + "isDeleted": false, + "boundElements": null, + "updated": 1780083477541, + "link": null, + "locked": false + }, + { + "id": "RVmry4fs0XLK4othiztNC", + "type": "rectangle", + "x": 988.6938397144714, + "y": 576.8283281095612, + "width": 159.32505289713546, + "height": 394.6260969399176, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b16l", + "roundness": { + "type": 3 + }, + "seed": 1999070189, + "version": 469, + "versionNonce": 67560451, + "isDeleted": false, + "boundElements": null, + "updated": 1780083477541, + "link": null, + "locked": false + }, + { + "id": "CFJSsU20lkq08GCp2e7yK", + "type": "rectangle", + "x": 592.0897437144715, + "y": 1219.8344351095611, + "width": 159.32505289713546, + "height": 394.6260969399176, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b17", + "roundness": { + "type": 3 + }, + "seed": 416013443, + "version": 263, + "versionNonce": 1528271245, + "isDeleted": true, + "boundElements": null, + "updated": 1780083022705, + "link": null, + "locked": false + }, + { + "id": "GhkvZVqTtG7ffV-L-qAse", + "type": "arrow", + "x": 1431.8301653632482, + "y": 610.7160716074219, + "width": 625.4810433632487, + "height": 191.83669891801634, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b18", + "roundness": { + "type": 2 + }, + "seed": 1975991533, + "version": 757, + "versionNonce": 2023939779, + "isDeleted": false, + "boundElements": null, + "updated": 1780083370152, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -338.46037950945356, + -105.69166481101149 + ], + [ + -625.4810433632487, + -191.83669891801634 + ] + ], + "startBinding": { + "elementId": "0h8kgBJKeuIMC4mU331h2", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "endBinding": { + "elementId": "6egt_eId-rQzX7LdRfQR0", + "mode": "orbit", + "fixedPoint": [ + 1, + 0.5001 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + }, + { + "id": "YzfkpLewQBur0LZOpCdAY", + "type": "arrow", + "x": 1457.9122267551945, + "y": 610.7160716074218, + "width": 226.18009388673136, + "height": 188.82631732170938, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b19", + "roundness": { + "type": 2 + }, + "seed": 1023062093, + "version": 674, + "versionNonce": 875289795, + "isDeleted": false, + "boundElements": null, + "updated": 1780083358417, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 103.98111866891281, + -90.83916643861573 + ], + [ + 226.18009388673136, + -188.82631732170938 + ] + ], + "startBinding": { + "elementId": "0h8kgBJKeuIMC4mU331h2", + "mode": "orbit", + "fixedPoint": [ + 0.5001, + 0 + ] + }, + "endBinding": { + "elementId": "ClpEH5K9K2Mcnn1GLz2pN", + "mode": "orbit", + "fixedPoint": [ + 0, + 0.5001 + ] + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false, + "moveMidPointsWithElement": false + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#ffffff", + "lockedMultiSelections": {} + }, + "files": {} +} \ No newline at end of file diff --git a/doc/reports/aplr1/PagerG2_lr.png b/doc/reports/aplr1/PagerG2_lr.png new file mode 100644 index 000000000..e0fe5f179 Binary files /dev/null and b/doc/reports/aplr1/PagerG2_lr.png differ diff --git a/doc/reports/aplr1/PagerG2_lr.txt b/doc/reports/aplr1/PagerG2_lr.txt new file mode 100644 index 000000000..14356f66f --- /dev/null +++ b/doc/reports/aplr1/PagerG2_lr.txt @@ -0,0 +1,599 @@ +PagerG2 grammar + +Tokens + token EPSILON "ε" + First: {"ε"} + Follow: {} + token PSEUDO_END "⊥" + First: {"⊥"} + Follow: {"ε"} + token At + First: {At} + Follow: {At, Dt, Et, Tt, Ut, EOI} + token Bt + First: {Bt} + Follow: {Tt, Ut} + token Ct + First: {Ct} + Follow: {At, Dt, Et, EOI} + token Dt + First: {Dt} + Follow: {At, Dt, Et, EOI} + token Et + First: {Et} + Follow: {At, Dt, Et, EOI} + token Tt + First: {Tt} + Follow: {Ut} + token Ut + First: {Ut} + Follow: {At, Bt, Ct, Dt, Et} + token EOI + First: {EOI} + Follow: {"⊥"} +Non-terminals + start Sn + First: {At, Bt} + Follow: {"⊥"} + Productions + Sn ::= Xn EOI + start Sn' + First: {At, Bt} + Follow: {"ε"} + Productions + Sn' ::= Sn "⊥" + nonterm Xn + First: {At, Bt} + Follow: {At, Dt, Et, EOI} + Productions + Xn ::= At Yn Dt + Xn ::= At Zn Ct + Xn ::= At Tn + Xn ::= Bt Yn Et + Xn ::= Bt Zn Dt + Xn ::= Bt Tn + nonterm Yn + First: {Tt, Ut} + Follow: {Dt, Et} + Productions + Yn ::= Tt Wn + Yn ::= Ut Xn + nonterm Zn + First: {Tt} + Follow: {Ct, Dt} + Productions + Zn ::= Tt Ut + nonterm Tn + First: {Ut} + Follow: {At, Dt, Et, EOI} + Productions + Tn ::= Ut Xn At + nonterm Wn + First: {Ut} + Follow: {Dt, Et} + Productions + Wn ::= Ut Vn + nonterm Vn + First: {"ε"} + Follow: {Dt, Et} + Productions + Vn ::= epsilon +LR(1) States + State 0 [0.0] + Kernel + [Sn' ::= · Sn "⊥", {"ε"}] + Added + [Sn ::= · Xn EOI, {"⊥"}] + [Xn ::= · At Yn Dt, {EOI}] + [Xn ::= · At Zn Ct, {EOI}] + [Xn ::= · At Tn, {EOI}] + [Xn ::= · Bt Yn Et, {EOI}] + [Xn ::= · Bt Zn Dt, {EOI}] + [Xn ::= · Bt Tn, {EOI}] + Actions + At : ShiftPrefix 1 + Bt : ShiftPrefix 2 + Gotos + Sn : 3 + Xn : 4 + State 1 [1.0] + Kernel + [Xn ::= At · Yn Dt, {EOI}] + [Xn ::= At · Zn Ct, {EOI}] + [Xn ::= At · Tn, {EOI}] + Added + [Yn ::= · Tt Wn, {Dt}] + [Yn ::= · Ut Xn, {Dt}] + [Zn ::= · Tt Ut, {Ct}] + [Tn ::= · Ut Xn At, {EOI}] + Actions + Tt : ShiftPrefix 5 + Ut : ShiftPrefix 6 + Gotos + Yn : 7 + Zn : 8 + Tn : 9 + State 2 [2.0] + Kernel + [Xn ::= Bt · Yn Et, {EOI}] + [Xn ::= Bt · Zn Dt, {EOI}] + [Xn ::= Bt · Tn, {EOI}] + Added + [Yn ::= · Tt Wn, {Et}] + [Yn ::= · Ut Xn, {Et}] + [Zn ::= · Tt Ut, {Dt}] + [Tn ::= · Ut Xn At, {EOI}] + Actions + Tt : ShiftPrefix 10 + Ut : ShiftPrefix 11 + Gotos + Yn : 12 + Zn : 13 + Tn : 14 + State 3 [3.0] + Kernel + [Sn' ::= Sn · "⊥", {"ε"}] + Actions + "⊥" : ShiftPrefix 15 + State 4 [4.0] + Kernel + [Sn ::= Xn · EOI, {"⊥"}] + Actions + EOI : ShiftAccept 16 + State 5 [5.0] + Kernel + [Yn ::= Tt · Wn, {Dt}] + [Zn ::= Tt · Ut, {Ct}] + Added + [Wn ::= · Ut Vn, {Dt}] + Actions + Ut : ShiftPrefix 17 + Gotos + Wn : 18 + State 6 [6.0] + Kernel + [Yn ::= Ut · Xn, {Dt}] + [Tn ::= Ut · Xn At, {EOI}] + Added + [Xn ::= · At Yn Dt, {At, Dt}] + [Xn ::= · At Zn Ct, {At, Dt}] + [Xn ::= · At Tn, {At, Dt}] + [Xn ::= · Bt Yn Et, {At, Dt}] + [Xn ::= · Bt Zn Dt, {At, Dt}] + [Xn ::= · Bt Tn, {At, Dt}] + Actions + At : ShiftPrefix 19 + Bt : ShiftPrefix 20 + Gotos + Xn : 21 + State 7 [7.0] + Kernel + [Xn ::= At Yn · Dt, {EOI}] + Actions + Dt : ShiftPrefix 22 + State 8 [8.0] + Kernel + [Xn ::= At Zn · Ct, {EOI}] + Actions + Ct : ShiftPrefix 23 + State 9 [9.0] + Kernel + [Xn ::= At Tn ·, {EOI}] + Actions + EOI : Reduce Xn ::= At Tn + State 10 [5.1] + Kernel + [Yn ::= Tt · Wn, {Et}] + [Zn ::= Tt · Ut, {Dt}] + Added + [Wn ::= · Ut Vn, {Et}] + Actions + Ut : ShiftPrefix 24 + Gotos + Wn : 25 + State 11 [6.1] + Kernel + [Yn ::= Ut · Xn, {Et}] + [Tn ::= Ut · Xn At, {EOI}] + Added + [Xn ::= · At Yn Dt, {At, Et}] + [Xn ::= · At Zn Ct, {At, Et}] + [Xn ::= · At Tn, {At, Et}] + [Xn ::= · Bt Yn Et, {At, Et}] + [Xn ::= · Bt Zn Dt, {At, Et}] + [Xn ::= · Bt Tn, {At, Et}] + Actions + At : ShiftPrefix 26 + Bt : ShiftPrefix 27 + Gotos + Xn : 28 + State 12 [10.0] + Kernel + [Xn ::= Bt Yn · Et, {EOI}] + Actions + Et : ShiftPrefix 29 + State 13 [11.0] + Kernel + [Xn ::= Bt Zn · Dt, {EOI}] + Actions + Dt : ShiftPrefix 30 + State 14 [12.0] + Kernel + [Xn ::= Bt Tn ·, {EOI}] + Actions + EOI : Reduce Xn ::= Bt Tn + State 15 [13.0] + Kernel + [Sn' ::= Sn "⊥" ·, {"ε"}] + Actions + "ε" : Reduce Sn' ::= Sn "⊥" + State 16 [14.0] + Kernel + [Sn ::= Xn EOI ·, {"⊥"}] + Actions + "⊥" : Reduce Sn ::= Xn EOI + State 17 [15.0] + Kernel + [Zn ::= Tt Ut ·, {Ct}] + [Wn ::= Ut · Vn, {Dt}] + Added + [Vn ::= ·, {Dt}] + Actions + Ct : Reduce Zn ::= Tt Ut + Dt : Reduce Vn ::= epsilon + Gotos + Vn : 31 + State 18 [16.0] + Kernel + [Yn ::= Tt Wn ·, {Dt}] + Actions + Dt : Reduce Yn ::= Tt Wn + State 19 [1.1] + Kernel + [Xn ::= At · Yn Dt, {At, Dt}] + [Xn ::= At · Zn Ct, {At, Dt}] + [Xn ::= At · Tn, {At, Dt}] + Added + [Yn ::= · Tt Wn, {Dt}] + [Yn ::= · Ut Xn, {Dt}] + [Zn ::= · Tt Ut, {Ct}] + [Tn ::= · Ut Xn At, {At, Dt}] + Actions + Tt : ShiftPrefix 5 + Ut : ShiftPrefix 32 + Gotos + Yn : 33 + Zn : 34 + Tn : 35 + State 20 [2.1] + Kernel + [Xn ::= Bt · Yn Et, {At, Dt}] + [Xn ::= Bt · Zn Dt, {At, Dt}] + [Xn ::= Bt · Tn, {At, Dt}] + Added + [Yn ::= · Tt Wn, {Et}] + [Yn ::= · Ut Xn, {Et}] + [Zn ::= · Tt Ut, {Dt}] + [Tn ::= · Ut Xn At, {At, Dt}] + Actions + Tt : ShiftPrefix 10 + Ut : ShiftPrefix 36 + Gotos + Yn : 37 + Zn : 38 + Tn : 39 + State 21 [17.0] + Kernel + [Yn ::= Ut Xn ·, {Dt}] + [Tn ::= Ut Xn · At, {EOI}] + Actions + At : ShiftPrefix 40 + Dt : Reduce Yn ::= Ut Xn + State 22 [18.0] + Kernel + [Xn ::= At Yn Dt ·, {EOI}] + Actions + EOI : Reduce Xn ::= At Yn Dt + State 23 [19.0] + Kernel + [Xn ::= At Zn Ct ·, {EOI}] + Actions + EOI : Reduce Xn ::= At Zn Ct + State 24 [15.1] + Kernel + [Zn ::= Tt Ut ·, {Dt}] + [Wn ::= Ut · Vn, {Et}] + Added + [Vn ::= ·, {Et}] + Actions + Dt : Reduce Zn ::= Tt Ut + Et : Reduce Vn ::= epsilon + Gotos + Vn : 41 + State 25 [16.1] + Kernel + [Yn ::= Tt Wn ·, {Et}] + Actions + Et : Reduce Yn ::= Tt Wn + State 26 [1.2] + Kernel + [Xn ::= At · Yn Dt, {At, Et}] + [Xn ::= At · Zn Ct, {At, Et}] + [Xn ::= At · Tn, {At, Et}] + Added + [Yn ::= · Tt Wn, {Dt}] + [Yn ::= · Ut Xn, {Dt}] + [Zn ::= · Tt Ut, {Ct}] + [Tn ::= · Ut Xn At, {At, Et}] + Actions + Tt : ShiftPrefix 5 + Ut : ShiftPrefix 42 + Gotos + Yn : 43 + Zn : 44 + Tn : 45 + State 27 [2.2] + Kernel + [Xn ::= Bt · Yn Et, {At, Et}] + [Xn ::= Bt · Zn Dt, {At, Et}] + [Xn ::= Bt · Tn, {At, Et}] + Added + [Yn ::= · Tt Wn, {Et}] + [Yn ::= · Ut Xn, {Et}] + [Zn ::= · Tt Ut, {Dt}] + [Tn ::= · Ut Xn At, {At, Et}] + Actions + Tt : ShiftPrefix 10 + Ut : ShiftPrefix 46 + Gotos + Yn : 47 + Zn : 48 + Tn : 49 + State 28 [17.1] + Kernel + [Yn ::= Ut Xn ·, {Et}] + [Tn ::= Ut Xn · At, {EOI}] + Actions + At : ShiftPrefix 40 + Et : Reduce Yn ::= Ut Xn + State 29 [20.0] + Kernel + [Xn ::= Bt Yn Et ·, {EOI}] + Actions + EOI : Reduce Xn ::= Bt Yn Et + State 30 [21.0] + Kernel + [Xn ::= Bt Zn Dt ·, {EOI}] + Actions + EOI : Reduce Xn ::= Bt Zn Dt + State 31 [22.0] + Kernel + [Wn ::= Ut Vn ·, {Dt}] + Actions + Dt : Reduce Wn ::= Ut Vn + State 32 [6.2] + Kernel + [Yn ::= Ut · Xn, {Dt}] + [Tn ::= Ut · Xn At, {At, Dt}] + Added + [Xn ::= · At Yn Dt, {At, Dt}] + [Xn ::= · At Zn Ct, {At, Dt}] + [Xn ::= · At Tn, {At, Dt}] + [Xn ::= · Bt Yn Et, {At, Dt}] + [Xn ::= · Bt Zn Dt, {At, Dt}] + [Xn ::= · Bt Tn, {At, Dt}] + Actions + At : ShiftPrefix 19 + Bt : ShiftPrefix 20 + Gotos + Xn : 50 + State 33 [7.1] + Kernel + [Xn ::= At Yn · Dt, {At, Dt}] + Actions + Dt : ShiftPrefix 51 + State 34 [8.1] + Kernel + [Xn ::= At Zn · Ct, {At, Dt}] + Actions + Ct : ShiftPrefix 52 + State 35 [9.1] + Kernel + [Xn ::= At Tn ·, {At, Dt}] + Actions + At : Reduce Xn ::= At Tn + Dt : Reduce Xn ::= At Tn + State 36 [6.3] + Kernel + [Yn ::= Ut · Xn, {Et}] + [Tn ::= Ut · Xn At, {At, Dt}] + Added + [Xn ::= · At Yn Dt, {At, Et}] + [Xn ::= · At Zn Ct, {At, Et}] + [Xn ::= · At Tn, {At, Et}] + [Xn ::= · Bt Yn Et, {At, Et}] + [Xn ::= · Bt Zn Dt, {At, Et}] + [Xn ::= · Bt Tn, {At, Et}] + Actions + At : ShiftPrefix 26 + Bt : ShiftPrefix 27 + Gotos + Xn : 53 + State 37 [10.1] + Kernel + [Xn ::= Bt Yn · Et, {At, Dt}] + Actions + Et : ShiftPrefix 54 + State 38 [11.1] + Kernel + [Xn ::= Bt Zn · Dt, {At, Dt}] + Actions + Dt : ShiftPrefix 55 + State 39 [12.1] + Kernel + [Xn ::= Bt Tn ·, {At, Dt}] + Actions + At : Reduce Xn ::= Bt Tn + Dt : Reduce Xn ::= Bt Tn + State 40 [23.0] + Kernel + [Tn ::= Ut Xn At ·, {EOI}] + Actions + EOI : Reduce Tn ::= Ut Xn At + State 41 [22.1] + Kernel + [Wn ::= Ut Vn ·, {Et}] + Actions + Et : Reduce Wn ::= Ut Vn + State 42 [6.4] + Kernel + [Yn ::= Ut · Xn, {Dt}] + [Tn ::= Ut · Xn At, {At, Et}] + Added + [Xn ::= · At Yn Dt, {At, Dt}] + [Xn ::= · At Zn Ct, {At, Dt}] + [Xn ::= · At Tn, {At, Dt}] + [Xn ::= · Bt Yn Et, {At, Dt}] + [Xn ::= · Bt Zn Dt, {At, Dt}] + [Xn ::= · Bt Tn, {At, Dt}] + Actions + At : ShiftPrefix 19 + Bt : ShiftPrefix 20 + Gotos + Xn : 56 + State 43 [7.2] + Kernel + [Xn ::= At Yn · Dt, {At, Et}] + Actions + Dt : ShiftPrefix 57 + State 44 [8.2] + Kernel + [Xn ::= At Zn · Ct, {At, Et}] + Actions + Ct : ShiftPrefix 58 + State 45 [9.2] + Kernel + [Xn ::= At Tn ·, {At, Et}] + Actions + At : Reduce Xn ::= At Tn + Et : Reduce Xn ::= At Tn + State 46 [6.5] + Kernel + [Yn ::= Ut · Xn, {Et}] + [Tn ::= Ut · Xn At, {At, Et}] + Added + [Xn ::= · At Yn Dt, {At, Et}] + [Xn ::= · At Zn Ct, {At, Et}] + [Xn ::= · At Tn, {At, Et}] + [Xn ::= · Bt Yn Et, {At, Et}] + [Xn ::= · Bt Zn Dt, {At, Et}] + [Xn ::= · Bt Tn, {At, Et}] + Actions + At : ShiftPrefix 26 + Bt : ShiftPrefix 27 + Gotos + Xn : 59 + State 47 [10.2] + Kernel + [Xn ::= Bt Yn · Et, {At, Et}] + Actions + Et : ShiftPrefix 60 + State 48 [11.2] + Kernel + [Xn ::= Bt Zn · Dt, {At, Et}] + Actions + Dt : ShiftPrefix 61 + State 49 [12.2] + Kernel + [Xn ::= Bt Tn ·, {At, Et}] + Actions + At : Reduce Xn ::= Bt Tn + Et : Reduce Xn ::= Bt Tn + State 50 [17.2] + Kernel + [Yn ::= Ut Xn ·, {Dt}] + [Tn ::= Ut Xn · At, {At, Dt}] + Actions + At : ShiftPrefix 62 + Dt : Reduce Yn ::= Ut Xn + State 51 [18.1] + Kernel + [Xn ::= At Yn Dt ·, {At, Dt}] + Actions + At : Reduce Xn ::= At Yn Dt + Dt : Reduce Xn ::= At Yn Dt + State 52 [19.1] + Kernel + [Xn ::= At Zn Ct ·, {At, Dt}] + Actions + At : Reduce Xn ::= At Zn Ct + Dt : Reduce Xn ::= At Zn Ct + State 53 [17.3] + Kernel + [Yn ::= Ut Xn ·, {Et}] + [Tn ::= Ut Xn · At, {At, Dt}] + Actions + At : ShiftPrefix 62 + Et : Reduce Yn ::= Ut Xn + State 54 [20.1] + Kernel + [Xn ::= Bt Yn Et ·, {At, Dt}] + Actions + At : Reduce Xn ::= Bt Yn Et + Dt : Reduce Xn ::= Bt Yn Et + State 55 [21.1] + Kernel + [Xn ::= Bt Zn Dt ·, {At, Dt}] + Actions + At : Reduce Xn ::= Bt Zn Dt + Dt : Reduce Xn ::= Bt Zn Dt + State 56 [17.4] + Kernel + [Yn ::= Ut Xn ·, {Dt}] + [Tn ::= Ut Xn · At, {At, Et}] + Actions + At : ShiftPrefix 63 + Dt : Reduce Yn ::= Ut Xn + State 57 [18.2] + Kernel + [Xn ::= At Yn Dt ·, {At, Et}] + Actions + At : Reduce Xn ::= At Yn Dt + Et : Reduce Xn ::= At Yn Dt + State 58 [19.2] + Kernel + [Xn ::= At Zn Ct ·, {At, Et}] + Actions + At : Reduce Xn ::= At Zn Ct + Et : Reduce Xn ::= At Zn Ct + State 59 [17.5] + Kernel + [Yn ::= Ut Xn ·, {Et}] + [Tn ::= Ut Xn · At, {At, Et}] + Actions + At : ShiftPrefix 63 + Et : Reduce Yn ::= Ut Xn + State 60 [20.2] + Kernel + [Xn ::= Bt Yn Et ·, {At, Et}] + Actions + At : Reduce Xn ::= Bt Yn Et + Et : Reduce Xn ::= Bt Yn Et + State 61 [21.2] + Kernel + [Xn ::= Bt Zn Dt ·, {At, Et}] + Actions + At : Reduce Xn ::= Bt Zn Dt + Et : Reduce Xn ::= Bt Zn Dt + State 62 [23.1] + Kernel + [Tn ::= Ut Xn At ·, {At, Dt}] + Actions + At : Reduce Tn ::= Ut Xn At + Dt : Reduce Tn ::= Ut Xn At + State 63 [23.2] + Kernel + [Tn ::= Ut Xn At ·, {At, Et}] + Actions + At : Reduce Tn ::= Ut Xn At + Et : Reduce Tn ::= Ut Xn At diff --git a/doc/reports/aplr1/aplr1.md b/doc/reports/aplr1/aplr1.md new file mode 100644 index 000000000..91473e507 --- /dev/null +++ b/doc/reports/aplr1/aplr1.md @@ -0,0 +1,837 @@ +# The APLR(1) Algorithm for Generating Compact LR(1) Parsers is Simpler and More Capable than IELR(1) + +The [Hocc](https://github.com/BranchTaken/Hemlock/blob/main/doc/tools/hocc.md) parser generator, +which is part of the [Hemlock](https://github.com/BranchTaken/Hemlock) programming language project, +implements a novel LR(1)-family parser generation algorithm called Adequacy Preservation LR(1). +APLR(1) generates compact parsers that are devoid of LR(1)-relative inadequacies, even for +nondeterministic/ambiguous grammars. Thus APLR(1) parser automata are suitable for use with +[Generalized LR (GLR)](https://en.wikipedia.org/wiki/GLR_parser) parsing techniques, but the +practical implication for deterministic parsing is that mysterious conflicts never arise during +grammar development. Furthermore APLR(1) is useful in combination with any LR(1)-family parser +generation algorithm that may introduce unnecessary state splits. As a case in point, Hocc's +IELR⁺(1) algorithm is a generalized extension of the original +[Bison](https://en.wikipedia.org/wiki/GNU_Bison) IELR(1) algorithm that also supports +nondeterministic/ambiguous grammars, but this algorithm sometimes induces precautionary state splits +that are ultimately unnecessary, and APLR(1) augments IELR⁺(1) such that APLR(1) and IELR⁺(1) may be +used interchangeably. + +## Introduction + +Knuth discovered the LR(k) algorithm [^knuth1965] for parsing [deterministic context-free +grammars](https://en.wikipedia.org/wiki/Deterministic_context-free_grammar) over six decades ago and +showed that in practice LR(1) is a reasonable practical restriction, but at the time even LR(1) was +too computationally intensive to be usable. The LALR(1) algorithm [^deremer1969] is not as capable +as canonical LR(1), but despite superior alternatives since discovered, LALR(1) remains the *de +facto* LR(1)-family algorithm of choice. The relative obscurity of PGM LR(1) [^pager1977] appears to +be due to a combination of confusion surrounding related lane tracing research +[^pager1973][^spector1981][^spector1988], along with having been overshadowed by the rapid +dissemination of the LALR(1) algorithm via the [Yacc](https://en.wikipedia.org/wiki/Yacc) parser +generator. The limited adoption of IELR(1) is due at least in part to its conceptual complexity, +incidentally also a lane tracing approach. In contrast, APLR(1) is a straightforward application of +subgraph isomorphism search, and understanding requires only basic graph theory and a limited +knowledge of LR(1) automaton structure. + +What constitutes a practical LR(1)-family parser? Algorithmic complexity has execution and data +components; in order for a parser to be practical it must be both sufficiently fast and sufficiently +small. Furthermore, parser *generation* is distinct from parsing, and excessive generation-time +overhead can make an algorithm impractical even if parse-time performance is amazing. + +At the time of LR(1) discovery, both parser generation and parsing were impractical, most critically +because canonical LR(1) automata can be extremely large even for modest grammars. All deterministic +LR(1)-family parsers use the same [pushdown automaton +(PDA)](https://en.wikipedia.org/wiki/Pushdown_automaton) algorithm, so research on efficient PDAs +generally applies; the parser generation algorithms distinguish themselves by generating smaller +automata, in some cases restricting what grammars can be expressed. Following is a modern +perspective on the tradeoffs inherent to the algorithms discussed in this report. + +| Algorithm | Year | LR(1)-relative power | Automaton size | Generation overhead | +|:----------|------|----------------------|----------------|---------------------| +| LR(1) | 1965 | = | Maximal | Moderate | +| LALR(1) | 1969 | ⊂ | Inadequate | Low | +| PGM LR(1) | 1977 | =¹ | Compact² | Low | +| IELR(1) | 2010 | = | Compact | Low-moderate | +| IELR⁺(1) | 2024 | ⊃³ | Compact | Moderate-high | +| APLR(1) | 2026 | ⊃³ | Compact | Moderate-high | + +1 — Precedence/associativity not supported. +2 — Assuming weak compatibility test; strong compatibility guarantees minimality. +3 — Nondeterminism/ambiguity supported, technically also true of LR(1) automata. + +Canonical LR(1) automata are maximal in that any further splitting of states would result in +reduntant identical states; LALR(1) automata are inadequate in that all possible state merging is +blindly performed; the compact automata are commonly minimal, but greedy algorithms make no +guarantee regarding minimality. Maximal automata remain unwieldy on modern computers due to +generated code size and low execution locality, though not intractably so. Inadequate automata are +to be avoided. The compact automata make no parse-time compromises, and generation-time compromises +are modest, quickly trending toward negligible as hardware continues to improve. + +The LALR(1) algorithm [^deremer1969] is so prevalent that many practitioners unquestioningly accept +its shortcomings. Although LALR(1) utilizes symbol lookahead during parsing, an LALR(1) automaton is +generated by merging states with equal LR(0) item sets, i.e. by disregarding lookahead. Three types +of mysterious conflicts can result. The well-known **_mysterious new conflicts_** caused by LALR(1) +state merging are always **_reduce-reduce conflicts_**, but it is also possible for state merging to +create **_mysterious invasive conflicts_** that are caused by merging **_shift-reduce conflicts_** +into states which would otherwise have performed a reduce action. Furthermore, it is possible to +create **_mysterious mutated conflicts_** by merging multiple reduce-reduce conflicts that have +distinct resolutions. Such **LR(1)-relative inadequacy** often causes an LALR(1) parser to recognize +a different language than does the corresponding LR(1) parser, and reasoning about these differences +is fraught with peril. + +**Precedence** and **associativity** in grammar specifications are so ubiquitous that it is easy to +forget that these are actually mechanisms for disambiguating non-LR(1) grammars. The LR grammar +family is fundamentally deterministic, and multiple parsing actions for a given configuration +indicate grammar ambiguities. Precedence specifications rank actions such that ambiguities can be +resolved so long as one action has higher precedence than all other alternatives. Associativity +provides a secondary mechanism for preferring left associativity (reduce rather than shift), right +associativity (shift rather than reduce), etc. These mechanisms are of great practical value, but +they are optional; grammars can always be reformulated, at some inconvenience and negative impact +on the implied parse tree, to remove precedence/associativity without affecting the language +recognized by the parser. + +The PGM LR(1) algorithm [^pager1977][^pottier] incrementally merges states during automaton +generation so long as it can assure that no subsequent mysterious conflicts will arise. However, the +algorithm only works reliably for LR(1) grammars; although no mysterious new conflicts arise from +precedence/associativity disambiguation, mysterious invasive/mutated conflicts may arise. + +The IELR(1) algorithm [^denny2010a] analyzes an unresolved LALR(1) automaton (all possible conflicts +present) and traces lanes backward from conflicts far enough to determine which states may need to +be split in order to avoid mysterious conflicts. It then generates an IELR(1) automaton that has all +LR(1)-relative inadequacies eliminated. The lane tracing is quite fast because the algorithm assumes +that there are no ambiguities in the corresponding LR(1) automaton, meaning that at most one action +can be contributed via each lane in the LR(1) automaton. + +Generalized LR (GLR) [^tomita1986] supports nondeterminism. Whereas non-LR(1) grammars contain +"ambiguous" non-singleton action sets, GLR treats ambiguity as nondeterminism and applies +non-singleton action sets in parallel and accepts an input if any parallel automaton execution +reaches an accept state. Although GLR provides (too much?) additional freedom during grammar +development, care is still required when pairing GLR with an automaton. For example, it is unsafe to +use an LALR(1) automaton with conflict resolution enabled because mysterious conflicts may be +resolved such that GLR never considers actions critical to full grammar recognition. Unfortunately, +this mode of operation confounds analysis of incidental versus fundamental grammar nondeterminism. +IELR(1) is similarly unsafe in combination with GLR because it applies conflict resolution to +mysterious conflicts that arise due to its inability to handle incompletely resolved non-LR(1) +grammars. + +The IELR⁺(1) algorithm [^evans2024] differs from IELR(1) in that no assumptions are made regarding +ambiguities in the corresponding LR(1) automaton. Multiple (conflicting) actions may flow through +each lane in the LR(1) automaton. Lane tracing is more complicated because closure (global fixpoint) +must be reached rather than terminating tracing anywhere contributed action sets are empty or +singletons. Furthermore, cyclical dependencies induced by closure sometimes necessitate +precautionary state splits during IELR⁺(1) automaton generation that ultimately end up having been +unnecessary, but these split states can be remerged using the same algorithm as for APLR(1). As an +example of the difference between IELR(1) and IELR⁺(1), consider the +[Gawk](https://www.gnu.org/software/gawk/) 3.10 grammar that was an IELR(1) case study +[^denny2010a]. + +| Algorithm | Resolve | States | S/R conflicts | R/R conflicts | +|:----------|---------|-------:|--------------:|--------------:| +| LALR(1) | yes | 320 | 65 | 0 | +| IELR(1) | | 329 | 65 | 0 | +| IELR⁺(1) | | 367 | 66 | 0 | +| | | | | | +| LALR(1) | no | 320 | 410 | 0 | +| IELR(1) | | 320 | 410 | 0 | +| IELR⁺(1) | | 367 | 410 | 0 | + +IELR(1) generates the same states as LALR(1) in the presence of conflicts that are unresolved in the +corresponding LR(1) automaton, whereas IELR⁺(1) splits additional states to eliminate (incompletely +disambiguated) LR(1)-relative inadequacy. The additional shift/reduce conflict (66 versus 65) +suggests that IELR⁺(1) avoids a mysterious conflict that IELR(1) inadvertently resolves. This +algorithmic distinction is worth calling attention to because IELR⁺(1) and APLR(1) are duals of each +other, making them both more capable than IELR(1). + +The APLR(1) algorithm analyzes an LR(1) automaton, exhaustively searches for split state subgraphs +which can be remerged without changing the recognized language, then performs all remerges. APLR(1) +applies the remerging algorithm to a canonical LR(1) automaton, but Hocc also uses the remerging +algorithm by default for automata generated by IELR⁺(1) and PGM LR(1). Earlier versions of Hocc +implemented a simpler iterative state pair remerging algorithm [^evans2024], discovered +independently by [^lenka2006]. The iterative algorithm has the disadvantage of being incapable of +remerging non-singleton cyclic subgraphs. + +There is one subtle consequence of state merging that affects all of the above algorithms, namely +that it is possible for a sequence of reduce actions to lead to a state that contains no action for +the lookahead symbol, i.e. a syntax error. This can confound error reporting because the parsing +configuration of interest was that which existed prior to the first such reduce action. Fortunately +there is a straightforward solution, commonly referred to as lookahead correction (LAC) +[^denny2010b]. This mitigation captures the parser state prior to reducing and restores the state if +an error is encountered. Hocc supports only pure semantic actions (i.e. no side effects are +allowed), so LAC is simple, inexpensive, and universal. + +The remainder of this report describes the LR(1) and APLR(1) algorithms as implemented by Hocc in +sufficient detail to enable independent reimplementation, followed by experimental comparison of +parser generation algorithms. + +## Canonical LR(1) + +### Terminology + +The following common example "arithmetic" grammar in Hocc format suffices for defining various +relevant terms as they are used in the Hocc source code. + +```hocc +hocc + left mul + left add < mul + token STAR "*" prec mul + token SLASH "/" prec mul + token PLUS "+" prec add + token MINUS "-" prec add + token INT + token EOI + nonterm MulOp ::= + | "*" + | "/" + nonterm AddOp ::= + | "+" + | "-" + nonterm Expr ::= + | Expr MulOp Expr prec mul + | Expr AddOp Expr prec add + | INT + start Answer ::= Expr EOI +``` + +A grammar comprises production rules, abbreviated as **_prod(s)_**. `Answer ::= Expr EOI` and `Expr +::= INT` are examples of prods. A prod has a left-hand side (LHS), which is always a non-terminal +symbol, abbreviated as **_nonterm_**. `Answer` and `Expr` are examples of nonterms. A prod also has +a right-hand side (RHS), which is a sequence of nonterms and **_tokens_**. `STAR`, its alias `"*"`, +and `EOI` are examples of tokens. Each token and nonterm has an associated **_first set_** of tokens +which may come first and a **_follow set_** of tokens which may come immediately after. Each token's +first set trivially contains the token itself, and the token first sets serve as the initial state +for computing first/follow set closure of all symbols. See the Hocc source code or a compilers +textbook [^aho2007][^cooper2023] for detailed first/follow set closure algorithms. + +An **_LR(0) item_** is a prod with associated position, where the current parsing position is +indicated by a dot. For example, `Answer ::= · Expr EOI`, `Answer ::= Expr · EOI`, and `Answer ::= +Expr EOI ·` are distinct LR(0) items based on the same prod. + +An **_LR(1) item_** is an LR(0) item with an associated **_follow set_**, i.e. a set of tokens which +may immediately follow the prod. For example, `MulOp ::= · "*", {INT}` indicates that a +multiplication operator may be followed only by an integer. For a less obvious example, `Expr ::= · +INT, {"*", "/", "+", "-", EOI}` indicates that an integer may be followed by a math operator or +end-of-input (`EOI`). Note that the dot position is irrelevant to the follow set; the same symbols +may follow the prod regardless of current dot position. In contrast, the dot position *is* relevant +to the **_first set_**, i.e. the set of tokens which may immediately follow the dot. + +An **_LR(0) item set_**, also known as a **_core_**, is simply a set of LR(0) items. Two cores are +**_isocores_** if they are isomorphic, i.e. they comprise identical LR(0) item sets. + +An **_LR(1) item set_**, also known as a **_kernel_**, is simply a set of LR(1) items, also known as +**_kernel items_**. Two kernels are **_isokernels_** if they are isomorphic, i.e. they comprise +identical LR(1) item sets. A kernel can be mapped to a core by extracting the LR(0) items from all +all LR(1) items. LR(1)-family parser generation algorithms differ only in how aggressively they +split/merge sets of states with isocores but distinct kernels; canonical LR(1) and LALR(1) are at +the extremes of this continuum. + +An **_LR(1) item set closure_** comprises a kernel and an **_added set_** of LR(1) items, which +corresponds to the set of productions reachable from the kernel without advancing the input. A +**_state_** comprises an LR(1) item set closure, an action set for each expected token, and a goto +for each distinct LHS nonterm in the added set. A **_goto_** set can be computed for each symbol to +the right of a dot. These goto sets define kernels of successor states. + +For implementation reasons having primarily to do with IELR⁺(1), Hocc uses an additional layer of +data structures: + +- state ⊃ **_state nub_** ⊃ LR(1) item set closure +- goto ⊃ **_goto nub_** ⊃ LR(1) item set + +However, this layering also enables optimizations to the data structures which track isocore sets. + +Parser generators have long supported grammar disambiguation via precedence and associativity. For +example `mul` has higher precedence than `add`, both of which are left-associative. Hocc differs +from most parser generators in that precedences comprise an explicit optionally-disjoint directed +acyclic graph, rather than a mostly implicit single linear precedence order. + +### Work queue processing + +Hocc uses an iterative work queue process to incrementally close on the set of state nubs +corresponding to states in the automaton. Work queue ordering is not fundamental to automaton +generation, but it does impact state nub creation order, and therefore state indexing. No effort is +made to puzzle together isocores via optimal merging order, but care is taken to insert at the front +versus back of the work queue in such a way as to process states in an approximately breadth-first +order rather than depth-first. Consistent queue ordering logic for all automaton generation +algorithms assures that isocore set indexes (i.e. LALR(1) state indexes) are universal, and +APLR(1)/IELR⁺(1) automata are typically identical. + +Once the work queue is seeded with start state nubs, state nubs are consumed from the head of the +work queue and processed until none remain, i.e. a fixpoint has been reached. The work queue +contains each _distinct_ state nub exactly once, over the entire duration of work queue processing. +The end goal is to traverse the entirety of the resulting automaton once. What makes a state nub +distinct is critical to understanding the work queue behavior. If a kernel compatibility test +determines that two non-isokernels are compatible, the merged result is distinct from at least one +of the input isokernels, even though the state nub index stays the same. A state nub index may +ephemerally correspond to a series of distinct state nubs, and although some of those ephemeral +state nubs may never reach the front of the work queue, the last one certainly will. Given this +understanding, the work queue insertion regimen is straightforward: + +- A state nub that is not the result of a merge is pushed onto the back of the work queue unless + already present in the work queue. +- A state nub that is the result of merging two non-isokernels is pushed onto the front of the work + queue unless already present in the work queue. + +### State nub generation/merging + +State nub generation begins with the grammar's start symbol(s). A pseudo-start symbol and kernel +item is wrapped around each start symbol, always with a kernel of the form `Start' ::= · Start "⊥", +{"ε"}`, e.g. `Answer' ::= · Answer "⊥", {"ε"}` in the example grammar. Multiple computations lead to +a fully defined state nub, namely closing on the added set and then computing the goto set for each +symbol to the right of a dot. These goto sets are in some cases merged into existing compatible +states, and in other cases define distinct state nubs not yet encountered during automaton +construction. + +For the example grammar, the pseudo-start symbol results in the following state; the corresponding +state nub is inserted into both the work queue and the state nub set: + +``` + State 0 + Kernel + [Answer' ::= · Answer "⊥", {"ε"}] + Added + [Expr ::= · Expr MulOp Expr, {"*", "/", "+", "-", EOI}] prec mul + [Expr ::= · Expr AddOp Expr, {"*", "/", "+", "-", EOI}] prec add + [Expr ::= · INT, {"*", "/", "+", "-", EOI}] + [Answer ::= · Expr EOI, {"⊥"}] + Actions + INT : ShiftPrefix 1 + Gotos + Expr : 2 + Answer : 3 +``` + +Note that every symbol immediately to the right of a dot is represented in the **_actions_** or +**_gotos_**, for tokens and nonterms respectively. Consider `Expr`, which is to the right of +multiple dots. Each item in the goto set for `Expr` is created by advancing the dot past `Expr` +anywhere it appears before a dot in this state. The following kernel results: + +``` + [Expr ::= Expr · MulOp Expr, {"*", "/", "+", "-", EOI}] prec mul + [Expr ::= Expr · AddOp Expr, {"*", "/", "+", "-", EOI}] prec add + [Answer ::= Expr · EOI, {"⊥"}] +``` + +A work queue state nub is processed by 1) popping it from the front of the work queue, and 2) +computing goto sets, such that work queue and state nub set insertion may result. + +Canonical LR(1) isocore merge compatibility is maximally strict, in that kernels must be isokernels +in order to be merged. Merging two isokernels results in an isokernel; thus merging is a no-op in +practice. Such strict compatibility commonly results in nearly identical states which could in +practice be merged without changing the grammar recognized by the automaton. APLR(1) removes +(nearly) all such redundancy. + +### State generation + +Each state is created by augmenting the corresponding state nub with an **_actions_** map from +tokens to action sets (shift to successor state and/or one or more reductions) and a **_gotos_** map +from nonterms to successor states. + +- Each LR(1) item with a token immediately following the dot generates a shift action. +- Each LR(1) item with the dot past all RHS symbols generates a reduce action for each token in the + follow set. +- Each LR(1) item with a nonterm immediately following the dot generates a goto map entry. + +## APLR(1) + +The APLR(1) algorithm is fundamentally about remerging states while preserving parser behavior. +Whereas IELR(1) starts with an LALR(1) automaton and eliminates inadequacies via state splitting, +APLR(1) starts with an optionally resolved canonical LR(1) automaton and preserves LR(1)-relative +adequacy during state remerging. Remerging is implemented in two phases: + +1. Exhaustively consider all isocoric state pairs in the LR(1) automaton and search for remergeable + subgraphs, i.e. maximal non-overlapping isomorphic subgraphs. +2. Remerge and reindex all discovered compatible state sets to generate a derivative APLR(1) + automaton. + +In order for two subgraphs to be remergeable, every state pair's pairwise out-transitions must meet +at least one of the following criteria: + +- Shifts: + + The successor state indexes are equal. + + The successor states are transitively remergeable. +- Reductions: + + The states perform identical reductions. + + State `X₀` takes no action for a symbol `s`, and state `X₁` performs only reduction(s) for + symbol `s`. Furthermore, for more than two states to be remergeable, all additional states must + contain either no actions on symbol `s`, or actions identical to those of state `X₁`. +- Gotos: + + The successor state indexes are equal. + + The successor states are transitively remergeable. + + State `X₀` contains no goto for a symbol `s`, and state `X₁` does contain a goto for symbol `s`. + Furthermore, for more than two states to be remergeable, all additional states must contain + either no goto for symbol `s`, or a goto successor that is remergeable with that of state `X₁`. + +Although all isocoric state pairs must be considered for remergeability (n choose 2 combinations for +each n-element isocoric state set), transitive remergeability testing results compose and typically +have substantial overlap. If a state pair is noted as **_mergeable_**, any subsequent subgraph +remergeability test which reaches the mergeable pair need not repeat the work that was done to +discover that the pair is mergeable. Similarly if a state pair is noted as **_distinct_**, any +subsequent subgraph remergeability test which reaches the distinct pair fails. Furthermore, every +state pair from the starting point of the search along the **_spine_** to the distinct pair can be +transitively noted as distinct. + +The remergeability testing algorithm is greedy; the order in which isocoric state pairs are tested +can impact later tests, and a slightly different automaton can result. Thus APLR(1) greedily +generates compact automata rather than generating globally minimal automata, the latter of which is +NP-hard [^yang2021]. + +The Hocc implementation performs n choose 2 pairwise remergeability tests as described, but an +alternate implementation could perform an n-way test and iteratively refine partitions of the +subgraph sets upon discovering distinctions [^valmari2012]. However, this approach would require +more sophisticated bookkeeping, without offering any algorithmic complexity advantage, and it would +still be necessary to make arbitrary partitioning choices for non-hierarchical subgraph mergeability +relations among the n subgraphs. + +Reindexing is only strictly necessary if the parser implementation requires contiguous indexes. +However, Hocc reindexes both states and isocore set indexes primarily because it simplifies manual +automaton introspection, especially comparisons between automata generated using differing +algorithms. Hocc preserves the lowest state index for each set of remergeable states when remerging, +and during reindexing it maintains relative state order while renumbering from 0 upward. + +As mentioned, APLR(1) and IELR⁺(1) are duals of each other, and with minor changes an APLR⁻(1) +implementation could exist as a dual of IELR(1). The only necessary change relative to APLR(1) would +be to treat all ambiguous actions present in the LR(1) automaton as remergeable. However, while +there are some compelling tradeoffs for IELR(1) over IELR⁺(1) (faster parser generation, no need to +remerge unnecessary precautionary splits), APLR⁻(1) has nothing to recommend it over APLR(1). + +### Example + +Consider this transcription of Pager's G2 grammar [^pager1977]: + +```hocc +hocc + token At + token Bt + token Ct + token Dt + token Et + token Tt + token Ut + token EOI + + start Sn ::= Xn EOI + + nonterm Xn ::= + | At Yn Dt + | At Zn Ct + | At Tn + | Bt Yn Et + | Bt Zn Dt + | Bt Tn + + nonterm Yn ::= + | Tt Wn + | Ut Xn + + nonterm Zn ::= Tt Ut + + nonterm Tn ::= Ut Xn At + + nonterm Wn ::= Ut Vn + + nonterm Vn ::= epsilon +``` + +As indicated by the following state counts, 38/40 state splits are remergeable. + +| Algorithm | States | +|-----------|-----------------------:| +| LALR(1) | [24](PagerG2_lalr.txt) | +| APLR(1) | [26](PagerG2_aplr.txt) | +| LR(1) | [64](PagerG2_lr.txt) | + +Following is a graphical depiction of the G2 automaton with isocoric state sets collapsed and set +sizes in parentheses. APLR(1) remerges all isocoric state sets aside from 5 and 15. + +![LR(1) automaton graph of G2 grammar](PagerG2_lr.png) + +The full LR(1) automaton comprises 64 states, most of which are omitted in the following graphical +depiction. However the red and blue subgraphs represent the full extents of two remergeable +subgraphs. Note that both extend to states 2 and 5 (successor states are equal), and as long as +every state pair is otherwise remergeable, the subgraphs are transitively remergeable. + +![Remergeable G2 automaton subgraph pair per APLR(1) remergeability test](PagerG2_aplr.png) + +Following are representative state pairs extracted from the [LR(1) automaton report](PagerG2_lr.txt) +that illustrate why subgraphs are (non-)remergeable. Whereas the automaton report refers to e.g. +states 1 and 19 which are elements 0 and 1 of isocore set 1 (`1 [1.0]`, `19 [1.1]`), the following +exposition uses a more succinct nomenclature, 1{1, 19}, that closely corresponds to the above +graphical depiction. + +#### Transitively remergeable + +``` + State 1 [1.0] | State 19 [1.1] + Kernel | Kernel + [Xn ::= At · Yn Dt, {EOI}] | [Xn ::= At · Yn Dt, {At, Dt}] + [Xn ::= At · Zn Ct, {EOI}] | [Xn ::= At · Zn Ct, {At, Dt}] + [Xn ::= At · Tn, {EOI}] | [Xn ::= At · Tn, {At, Dt}] + Added | Added + [Yn ::= · Tt Wn, {Dt}] | [Yn ::= · Tt Wn, {Dt}] + [Yn ::= · Ut Xn, {Dt}] | [Yn ::= · Ut Xn, {Dt}] + [Zn ::= · Tt Ut, {Ct}] | [Zn ::= · Tt Ut, {Ct}] + [Tn ::= · Ut Xn At, {EOI}] | [Tn ::= · Ut Xn At, {At, Dt}] + Actions | Actions + Tt : ShiftPrefix 5 | Tt : ShiftPrefix 5 + Ut : ShiftPrefix 6 | Ut : ShiftPrefix 32 + Gotos | Gotos + Yn : 7 | Yn : 33 + Zn : 8 | Zn : 34 + Tn : 9 | Tn : 35 +``` + +The differences between isocoric state set 1 members 1 and 19 correspond to those shown in the +graph, namely differing successor states in isocoric state sets 6, 7, 8, and 9. States 1 and 19 +(1{1, 19}) are remergeable if these differing successor states (6{6, 32}, 7{7, 33}, 8{8, 34}, 9{9, +35}) are transitively remergeable. + +``` + State 21 [17.0] | State 50 [17.2] + Kernel | Kernel + [Yn ::= Ut Xn ·, {Dt}] | [Yn ::= Ut Xn ·, {Dt}] + [Tn ::= Ut Xn · At, {EOI}] | [Tn ::= Ut Xn · At, {At, Dt}] + Actions | Actions + At : ShiftPrefix 40 | At : ShiftPrefix 62 + Dt : Reduce Yn ::= Ut Xn | Dt : Reduce Yn ::= Ut Xn +``` + +Isocoric state set 17 members 21 and 50 transition to differing successor states in isocoric state +set 23 on `At`, and perform the same reduction on `Dt`. States 21 and 50 are remergeable if the +differing successor states (23{40, 62}) are transitively remergeable. + +``` + State 40 [23.0] | State 62 [23.1] + Kernel | Kernel + [Tn ::= Ut Xn At ·, {EOI}] | [Tn ::= Ut Xn At ·, {At, Dt}] + Actions | Actions + EOI : Reduce Tn ::= Ut Xn At | At : Reduce Tn ::= Ut Xn At + | Dt : Reduce Tn ::= Ut Xn At +``` + +Isocoric state set 23 members 40 and 62 contain only disjoint actions, which makes them remergeable +(23{40, 62}). + +#### Transitively non-remergeable + +``` + State 5 [5.0] | State 10 [5.1] + Kernel | Kernel + [Yn ::= Tt · Wn, {Dt}] | [Yn ::= Tt · Wn, {Et}] + [Zn ::= Tt · Ut, {Ct}] | [Zn ::= Tt · Ut, {Dt}] + Added | Added + [Wn ::= · Ut Vn, {Dt}] | [Wn ::= · Ut Vn, {Et}] + Actions | Actions + Ut : ShiftPrefix 17 | Ut : ShiftPrefix 24 + Gotos | Gotos + Wn : 18 | Wn : 25 +``` + +Isocoric state set 5 members 5 and 10 transition to differing successor states in isocoric state set +15 on `Ut`, and to differing successor states in isocoric state set 16 on `Wn`. States 5 and 10 are +remergeable if the differing successor states (15{17, 24}, 16{18, 25}) are transitively remergeable. + +``` + State 17 [15.0] | State 24 [15.1] + Kernel | Kernel + [Zn ::= Tt Ut ·, {Ct}] | [Zn ::= Tt Ut ·, {Dt}] + [Wn ::= Ut · Vn, {Dt}] | [Wn ::= Ut · Vn, {Et}] + Added | Added + [Vn ::= ·, {Dt}] | [Vn ::= ·, {Et}] + Actions | Actions + Ct : Reduce Zn ::= Tt Ut | + Dt : Reduce Vn ::= epsilon | Dt : Reduce Zn ::= Tt Ut + | Et : Reduce Vn ::= epsilon + Gotos | Gotos + Vn : 31 | Vn : 41 +``` + +Isocoric state set 15 members 17 and 24 contain remergeable disjoint actions on `Ct` and `Et`, but +they contain conflicting actions on `Dt`. Therefore 15{17, 24} are non-remergeable, and 5{5, 10} are +transitively non-remergeable. + +## Experiments + +The following experiments use Hocc-compatible transcriptions of four grammars: + +- Gawk: [GNU Awk](https://www.gnu.org/software/gawk/) 3.1.0, analyzed in the IELR(1) paper + [^denny2010a] +- Gpic: [GNU groff](https://www.gnu.org/software/groff/) 1.18.1 gpic, analyzed in the IELR(1) paper + [^denny2010a] and in the IELR(1) report [^evans2024] +- Lyken: An abandoned research language, developed using an [implementation of the PGM + LR(1)](https://github.com/MagicStack/parsing) algorithm +- OCaml: [OCaml](https://ocaml.org/) 4.14 + +All experiments run Hocc main-0-g207645c72297ae6e3406f427382f6de14766c80d. Time and memory usage +statistics are collected with garbage collection (GC) disabled, e.g. + +```sh + time -v hocc -gc no -resolve yes -src Gawk -algorithm lalr +``` + +GC overhead would dominate run time and memory usage for the smallest and largest automata, but it +also makes the state counts easier to interpret, so the state counts are generated with precise +post-remerging GC enabled, e.g. + +```sh + hocc -gc post -resolve yes -src Gawk -algorithm lalr -verbose +``` + +The reported time/memory statistics are the best of three runs on an Apple MacBook M5 Pro, running +[Ubuntu](https://en.wikipedia.org/wiki/Ubuntu) Linux 24.04.03 as a virtual machine hosted by +[Parallels](https://en.wikipedia.org/wiki/Parallels_Desktop_for_Mac). + +| Grammar | Algorithm | Resolve | Time (h:m:s) | Max RSS (kB) | States | +|---------|:----------|---------|-------------:|-------------:|-------:| +| Gawk | LALR(1) | yes | 0.08 | 36864 | 320 | +| | PGM LR(1) | | 0.08 | 36736 | 320 | +| | IELR⁺(1) | | 2.37 | 254464 | 367 | +| | APLR(1) | | 1.04 | 79616 | 367 | +| | LR(1) | | 0.23 | 52096 | 2359 | +| | | | | | | +| | LALR(1) | no | 0.08 | 36864 | 320 | +| | PGM LR(1) | | 0.08 | 36864 | 320 | +| | IELR⁺(1) | | 5.25 | 642176 | 367 | +| | APLR(1) | | 1.01 | 80640 | 367 | +| | LR(1) | | 0.23 | 52224 | 2467 | +| | | | | | | +| Gpic | LALR(1) | yes | 0.32 | 45056 | 423 | +| | PGM LR(1) | | 0.35 | 46488 | 423 | +| | IELR⁺(1) | | 1.91 | 116992 | 428 | +| | APLR(1) | | 1.50 | 132096 | 428 | +| | LR(1) | | 1.11 | 98304 | 4834 | +| | | | | | | +| | LALR(1) | no | 0.31 | 45184 | 426 | +| | PGM LR(1) | | 0.35 | 46848 | 426 | +| | IELR⁺(1) | | 2.61 | 139392 | 448 | +| | APLR(1) | | 1.47 | 133376 | 448 | +| | LR(1) | | 1.08 | 97792 | 4871 | +| | | | | | | +| Lyken | LALR(1) | yes | 0.84 | 89600 | 1340 | +| | PGM LR(1) | | 1.82 | 96640 | 1340 | +| | IELR⁺(1) | | 5:59.97 | 6200832 | 1352 | +| | APLR(1) | | 11.97 | 868480 | 1352 | +| | LR(1) | | 10.47 | 755584 | 18755 | +| | | | | | | +| | LALR(1) | no | 0.84 | 90240 | 1375 | +| | PGM LR(1) | | 1.83 | 97280 | 1375 | +| | IELR⁺(1) | | 12:39.39 | 30538880 | 1857 | +| | APLR(1) | | 1:15.34 | 1480576 | 1742 | +| | LR(1) | | 10.51 | 761472 | 19590 | +| | | | | | | +| OCaml | LALR(1) | yes | 2.94 | 82048 | 1878 | +| | PGM LR(1) | | 3.48 | 82304 | 1878 | +| | IELR⁺(1) | | 35.43 | 1158784 | 1878 | +| | APLR(1) | | 2:16.48 | 3483648 | 1878 | +| | LR(1) | | 1:45.42 | 2349312 | 106607 | +| | | | | | | +| | LALR(1) | no | 2.95 | 82304 | 1878 | +| | PGM LR(1) | | 3.50 | 83200 | 1878 | +| | IELR⁺(1) | | 3:21.70 | 5528192 | 4585 | +| | APLR(1) | | 9:26:25___ | 4801664 | 4586 | +| | LR(1) | | 1:45.44 | 2345344 | 106607 | + +The performance numbers are best interpreted relative to each other, rather than in absolute terms. +Hocc is written in OCaml, using purely functional code and data structures. So far, so good, but +Hocc uses the Basis runtime library that is intended to correspond closely to the standard library +designed for the [Hemlock](https://github.com/BranchTaken/Hemlock) programming language. OCaml +provides 63-bit integers as its default high-performance integer type, but Hemlock's design calls +for 64-bit integers. As a consequence, the Basis library ubiquitously uses OCaml's boxed 64-bit +integers, which puts an epic load on OCaml's automatic memory management subsystem, not to mention +more than doubling memory usage for each integer and imposing pointer indirections. Hocc is likely +some multiple factor slower than optimal, but it is a mature parser generator implementation. +IELR⁺(1) and LR(1) are more than twice as fast as when reported in 2024 [^evans2024]; all the +automaton algorithms have been extensively worked and reworked. + +What conclusions can be drawn from the experiments? First and foremost, APLR(1) is a viable option +for all the grammars, so long as conflict resolution is enabled. There is no practical reason to +disable conflict resolution for APLR(1) nor IELR⁺(1); these benchmarks are included only to provide +additional insight into how the algorithms operate and what their weaknesses are. APLR(1) +performance is susceptible to highly interconnected subgraphs; the more branching in a subgraph, the +more repeated graph searching must occur. Similarly for IELR⁺(1), the more interconnected a conflict +contribution graph is, the more traversal must occur to reach contribution closure. The main +difference is that APLR(1) is impervious to conflicts that are resolved in the corresponding LR(1) +automaton, whereas IELR⁺(1) must trace all reduce-dominant conflicts, regardless of whether those +conflicts are resolved in the corresponding LR(1) automaton. + +The OCaml grammar transcription started as an educational tool to understand why the nascent Hemlock +grammar was causing generation performance problems for IELR⁺(1), and perhaps to learn how my +particular grammar development style might be modified. Interestingly, there is a stark difference +in grammar development styles, but whereas my style is adversarial for IELR⁺(1), the OCaml grammar +style is adversarial for APLR(1), due to >50X more LR(1) states than LALR(1) states! + +APLR(1) and IELR⁺(1) generate different automata for Lyken and OCaml with conflict resolution +disabled. This is due to greedy remerging and merging, respectively, i.e. these are similar compact +automata rather than identical globally minimal automata. APLR(1) remerging is driven by +exhaustively searching for remergeable subgraphs starting at every combination of isocoric state +pairs; the pairing enumeration is easy to modify, and therefore it is easy to test alternative +orders. Unpublished experiments found no differing automaton outcomes for any grammar in Hocc's test +suite (conflict resolution enabled), but ordering impacted remerging speed by a range of ~2.5X. The +current implementation prefers to search starting with pairs belonging to low-cardinality isocoric +state sets. IELR⁺(1) merging order is more difficult to characterize and manipulate, but its current +implementation is certainly nothing alike. + +## Discussion + +The case for deploying automata generated by APLR(1) is open-and-shut; no room for significant +improvement remains. What about generation performance though? The experiments presented in this +report include some extreme cases, in particular the OCaml grammar with conflict resolution +disabled. However, the egregiously long generation times do not correspond to practical use cases. +Thus far during actual use, the only grammar that posed a problem was a stripped-down subset of +OCaml with no precedence/associativity yet specified. In that case the workaround was to revert to +canonical LR(1) until enough ambiguity was removed to make APLR(1) sufficiently fast. IELR⁺(1) +offers an alternative mitigation, but it is hard to recommend implementing IELR⁺(1) just for such a +purpose. + +Is a single-phase algorithm that monotonically converges on a compact automaton feasible? PGM LR(1) +is such an algorithm, but the approach is not generalizable to grammars that are +nondeterministic/ambiguous in the absence of conflict resolution, even when all conflicts are +resolved. IELR(1) fundamentally requires two phases, because it traces backward through an automaton +that is constructed in a forward direction. APLR(1) requires that all states it considers for +remergeability be fully constructed (i.e. complete automaton closure). It would be possible to drive +automaton closure from within the subgraph remergeability search (though this would remain a +non-monotonic automaton construction algorithm), and for most grammars this would avoid the need to +ever manifest the full canonical LR(1) automaton. However, cyclically complex automata such as that +for the unresolved OCaml grammar would see little practical benefit. Nonetheless, this could be +advantageous in the common case, but this remains open research because Hocc would require +significant refactoring to close on states rather than state nubs. + +The impetus for APLR(1) stemmed from IELR⁺(1), first as a mitigation for unnecessary state splits, +later out of desperation for a simpler algorithm. The pair-at-a-time remerging algorithm +[^evans2024][^lenka2006] was trivially derived from analysis of Hocc's precautionary splits for the +Gpic grammar, versus the Bison-generated automaton which lacked the splits. Having implemented that +limited remerging algorithm, the possibility of a more general algorithm immediately came to mind, +and others have independently reached this same epiphany. François Pottier added a `TODO` note (in +French) to the [Menhir source repository](https://gitlab.inria.fr/fpottier/menhir/) in 2015; quoted +below is a later version of the note as it was translated to English and demoted to a `TODO-NOT!`, +with a cautionary performance addendum: + +> Try generating a canonical automaton, resolving conflicts, and THEN minimizing the automaton. +> Would the result be close to IELR(1)? (Unfortunately, producing a canonical automaton remains a +> bit costly: 8 seconds for OCaml's grammar.) + +So the concept of of APLR(1) was independently formulated long before Hocc came along. It is an +unfortunate coincidence that the OCaml grammar may be the most extreme practical adversarial test +case for APLR(1) in existence. + +As obvious as APLR(1) is in concept, the algorithmic details only seem obvious in retrospect. +Remergeability was clearly a [boolean satisfiability +problem](https://en.wikipedia.org/wiki/Boolean_satisfiability_problem), but it took years to make +the key observation that efficient implementation is possible via transitive subgraph equivalence +testing. Incidentally, this insight came while working on precise automaton tracing garbage +collection, which is related only in that it also requires a thorough understanding of automaton +graph structure. LR(1)-family automata are fundamentally [deterministic finite automata +(DFAs)](https://en.wikipedia.org/wiki/Deterministic_finite_automaton), but PDA-related nuances +complicate practical algorithms. + +Before APLR(1) came along there were still unanswered questions about Hocc's IELR⁺(1) algorithm. +Despite the dramatic speed disparity it was not clear that Hocc implemented a more general algorithm +than does Bison! The [Bison +manual](https://www.gnu.org/software/bison/manual/bison.html#LR-Table-Construction) has this to say +about IELR(1): + +> IELR (Inadequacy Elimination LR) is a minimal LR algorithm. That is, given any grammar (LR or +> non-LR), parsers using IELR or canonical LR parser tables always accept exactly the same set of +> sentences. + +What does "non-LR" mean? Here it silently excludes grammars for which conflict resolution is unable +to resolve all ambiguity, and a careful rereading of the IELR paper [^denny2010a] confirms that no +stronger claim is made for the original IELR(1) algorithm. Alas, between prose descriptions like the +above and difficulty in understanding various details of the paper, subtle differences in generated +parsers were too confusing to make sense of until APLR(1) results agreed with IELR⁺(1) for the Gawk +grammar. + +It is difficult to build high confidence in IELR⁺(1) results because bugs can manifest as missing +state splits, and there is no practical way to spot these omissions without APLR(1). Aside from +APLR(1) being conceptually much simpler than IELR⁺(1), APLR(1) bugs tend to be messy and loud, +whereas IELR⁺(1) bugs tend to be clean and silent. APLR(1) stabilized within days; IELR⁺(1) took +four years and the advent of APLR(1) to stabilize. In terms of implementation complexity, line +counts are a limited proxy measure, but the Hocc implementation of IELR⁺(1) requires ~1600 lines of +code (LOC), whereas APLR(1) requires ~700 LOC. + +What should an aspiring LR(1)-family parser generator author with limited time implement in 2026? +Opinions may differ, but the correct answer is APLR(1). + +## Citations + +[^aho2007]: + Alfred V. Aho, Monica S. Lam, Ravi Sethi, and Jeffrey D. Ullman, + “Compilers: Principles, Techniques, & Tools, 2nd Ed.”, + Pearson Education Inc., Boston, MA, 2007. + +[^cooper2023]: + Keith D. Cooper and Linda Torczon, + “Engineering a Compiler, 3rd Ed.”, + Morgan Kaufmann, Cambridge, MA, 2023. + +[^denny2010a]: + Joel E. Denny and Brian A. Malloy, + “The IELR(1) algorithm for generating minimal LR(1) parser tables for non-LR(1) grammars with conflict resolution”, + Science of Computer Programming, 75(11):943-979, 2010. + +[^denny2010b]: + Joel E. Denny, + “PSLR(1): Pseudo-Scannerless Minimal LR(1) for the Deterministic Parsing of Composite Languages”, + PhD Dissertation, + Clemson University, Clemson, SC, May 2010. + +[^deremer1969]: + Frank DeRemer, + “Practical Translators for LR(k) languages”, + Ph.D Dissertation, + Department of Electrical Engineering, + Massachusetts Institute of Technology, Cambridge, 1969. + +[^evans2024]: + Jason Evans, + “IELR(1) as Implemented by Hocc”, + BranchTaken LLC, + [https://branchtaken.com/reports/ielr1/ielr1.html](https://branchtaken.com/reports/ielr1/ielr1.html), + July 2024. + +[^knuth1965]: + Donald Knuth, + “On the Translation of Languages from Left to Right”, + Information and Control 8(6):607–639, July 1965. + +[^lenka2006]: + Dillip Kumar Lenka and Pawan Kumar, + “States Merging in LR Parser”, + ACM SIGPLAN Notices 41(4):24-29, 2006. + +[^pager1973]: + David Pager, + “The Lane Tracing Algorithm for Constructing LR(k) Parsers”, + Proceedings of the 5th Annual ACM Symposium on Theory of Computing, pgs 172-181, 1973. + +[^pager1977]: + David Pager, + “A Practical General Method for Constructing LR(k) Parsers”, + Acta Informatica 7:249-268, 1977. + +[^pottier]: + François Pottier and Yann Régis-Gianas, + “Menhir LR(1) Parser Generator,” + [http://gallium.inria.fr/~fpottier/menhir/](http://gallium.inria.fr/~fpottier/menhir/). + +[^spector1981]: + David Spector, + “Full LR(1) Parser Generation”, + ACM SIGPLAN Notices, pgs 58-66, 1981. + +[^spector1988]: + David Spector, + “Efficient Full LR(1) Parser Generation”, + ACM SIGPLAN Notices 23(12):143-150, 1988. + +[^tomita1986]: + Masaru Tomita, + “Efficient Parsing for Natural Language”, + Kluwer International Series in Engineering and Computer Science; SECS 8, 1986. + +[^valmari2012]: + Antti Valmari, + “Fast brief practical DFA minimization”, + Information Processing Letters 112:213-217, 2012. + +[^yang2021]: + Wuu Yang, + “Minimizing LR(1) State Machines is NP-Hard”, + arXiv preprint arXiv:2110.00776, 2021. diff --git a/doc/reports/ielr1/ielr1.md b/doc/reports/ielr1/ielr1.md index 75c136696..4108ec65f 100644 --- a/doc/reports/ielr1/ielr1.md +++ b/doc/reports/ielr1/ielr1.md @@ -680,7 +680,7 @@ grammars with it. Jason Evans, “IELR(1) as Implemented by Hocc”, BranchTaken LLC, - [https://branchtaken.com/reports/ielr1.html](https://branchtaken.com/reports/ielr1.html), + [https://branchtaken.com/reports/ielr1/ielr1.html](https://branchtaken.com/reports/ielr1/ielr1.html), July 2024. [^knuth1965]: